From 63b26bdf990ebf0105a0a4bc6977555820c70c5e Mon Sep 17 00:00:00 2001 From: Johnson Li Date: Fri, 8 Sep 2017 17:25:02 +0800 Subject: [PATCH] Add VES agent for vG-MUX Signed-off-by: Johnson Li diff --git a/src/configure.ac b/src/configure.ac index fb2ead6d..ea641525 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -154,6 +154,7 @@ PLUGIN_ENABLED(lb) PLUGIN_ENABLED(memif) PLUGIN_ENABLED(sixrd) PLUGIN_ENABLED(snat) +PLUGIN_ENABLED(ves) ############################################################################### # Dependency checks diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 623892e7..84513755 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -69,6 +69,10 @@ if ENABLE_SNAT_PLUGIN include snat.am endif +if ENABLE_VES_PLUGIN +include ves.am +endif + include ../suffix-rules.mk # Remove *.la files diff --git a/src/plugins/ves.am b/src/plugins/ves.am new file mode 100644 index 00000000..faaa1126 --- /dev/null +++ b/src/plugins/ves.am @@ -0,0 +1,35 @@ +# Copyright (c) 2017 Intel and/or its affiliates. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +vppplugins_LTLIBRARIES += ves_plugin.la + +LIBS_DIR=$(CURDIR)/ves/libs +ves_plugin_la_LDFLAGS = $(AM_LDFLAGS) -L$(LIBS_DIR) +ves_plugin_la_LDFLAGS += -Wl,--whole-archive -level -Wl,--no-whole-archive +ves_plugin_la_LDFLAGS += -Wl,-lpthread,-lcurl + +ves_plugin_la_SOURCES = ves/ves_node.c \ + ves/ves_api.c + +BUILT_SOURCES += \ + ves/ves.api.h \ + ves/ves.api.json + +API_FILES += ves/ves.api + +nobase_apiinclude_HEADERS += \ + ves/ves_all_api_h.h \ + ves/ves_msg_enum.h \ + ves/ves.api.h + +# vi:syntax=automake diff --git a/src/plugins/ves/include/double_list.h b/src/plugins/ves/include/double_list.h new file mode 100644 index 00000000..3bfae4c6 --- /dev/null +++ b/src/plugins/ves/include/double_list.h @@ -0,0 +1,56 @@ +#ifndef DOUBLE_LIST_INCLUDED +#define DOUBLE_LIST_INCLUDED + +/**************************************************************************//** + * @file + * A simple double-linked list. + * + * @note No thread protection so you will need to use appropriate + * synchronization if use spans multiple threads. + * + * License + * ------- + * + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************/ + +typedef struct dlist_item +{ + struct dlist_item * previous; + struct dlist_item * next; + void * item; +} DLIST_ITEM; + +/**************************************************************************//** + * Double-linked list structure + *****************************************************************************/ +typedef struct dlist +{ + DLIST_ITEM * head; + DLIST_ITEM * tail; +} DLIST; + + +void dlist_initialize(DLIST * list); +void * dlist_pop_last(DLIST * list); +void dlist_push_first(DLIST * list, void * item); +void dlist_push_last(DLIST * list, void * item); +DLIST_ITEM * dlist_get_first(DLIST * list); +DLIST_ITEM * dlist_get_last(DLIST * list); +DLIST_ITEM * dlist_get_next(DLIST_ITEM * item); +int dlist_is_empty(DLIST * list); +int dlist_count(DLIST * list); + +#endif diff --git a/src/plugins/ves/include/evel.h b/src/plugins/ves/include/evel.h new file mode 100644 index 00000000..817785ef --- /dev/null +++ b/src/plugins/ves/include/evel.h @@ -0,0 +1,3662 @@ +#ifndef EVEL_INCLUDED +#define EVEL_INCLUDED +/**************************************************************************//** + * @file + * Header for EVEL library + * + * This file implements the EVEL library which is intended to provide a + * simple wrapper around the complexity of AT&T's Vendor Event Listener API so + * that VNFs can use it without worrying about details of the API transport. + * + * Zero return value is success (::EVEL_SUCCESS), non-zero is failure and will + * be one of ::EVEL_ERR_CODES. + * + * License + * ------- + * + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +#include "double_list.h" + +/*****************************************************************************/ +/* Supported API version. */ +/*****************************************************************************/ +#define EVEL_API_MAJOR_VERSION 3 +#define EVEL_API_MINOR_VERSION 0 + +/**************************************************************************//** + * Error codes + * + * Error codes for EVEL low level interface + *****************************************************************************/ +typedef enum { + EVEL_SUCCESS, /** The operation was successful. */ + EVEL_ERR_GEN_FAIL, /** Non-specific failure. */ + EVEL_CURL_LIBRARY_FAIL, /** A cURL library operation failed. */ + EVEL_PTHREAD_LIBRARY_FAIL, /** A Posix threads operation failed. */ + EVEL_OUT_OF_MEMORY, /** A memory allocation failure occurred. */ + EVEL_EVENT_BUFFER_FULL, /** Too many events in the ring-buffer. */ + EVEL_EVENT_HANDLER_INACTIVE, /** Attempt to raise event when inactive. */ + EVEL_NO_METADATA, /** Failed to retrieve OpenStack metadata. */ + EVEL_BAD_METADATA, /** OpenStack metadata invalid format. */ + EVEL_BAD_JSON_FORMAT, /** JSON failed to parse correctly. */ + EVEL_JSON_KEY_NOT_FOUND, /** Failed to find the specified JSON key. */ + EVEL_MAX_ERROR_CODES /** Maximum number of valid error codes. */ +} EVEL_ERR_CODES; + +/**************************************************************************//** + * Logging levels + * + * Variable levels of verbosity in the logging functions. + *****************************************************************************/ +typedef enum { + EVEL_LOG_MIN = 0, + EVEL_LOG_SPAMMY = 30, + EVEL_LOG_DEBUG = 40, + EVEL_LOG_INFO = 50, + EVEL_LOG_ERROR = 60, + EVEL_LOG_MAX = 101 +} EVEL_LOG_LEVELS; + +/*****************************************************************************/ +/* Maximum string lengths. */ +/*****************************************************************************/ +#define EVEL_MAX_STRING_LEN 4096 +#define EVEL_MAX_JSON_BODY 16000 +#define EVEL_MAX_ERROR_STRING_LEN 255 +#define EVEL_MAX_URL_LEN 511 + +/**************************************************************************//** + * This value represents there being no restriction on the reporting interval. + *****************************************************************************/ +static const int EVEL_MEASUREMENT_INTERVAL_UKNOWN = 0; + +/**************************************************************************//** + * How many events can be backed-up before we start dropping events on the + * floor. + * + * @note This value should be tuned in accordance with expected burstiness of + * the event load and the expected response time of the ECOMP event + * listener so that the probability of the buffer filling is suitably + * low. + *****************************************************************************/ +static const int EVEL_EVENT_BUFFER_DEPTH = 100; + +/*****************************************************************************/ +/* How many different IP Types-of-Service are supported. */ +/*****************************************************************************/ +#define EVEL_TOS_SUPPORTED 256 + +/**************************************************************************//** + * Event domains for the various events we support. + * JSON equivalent field: domain + *****************************************************************************/ +typedef enum { + EVEL_DOMAIN_INTERNAL, /** Internal event, not for external routing. */ + EVEL_DOMAIN_HEARTBEAT, /** A Heartbeat event (event header only). */ + EVEL_DOMAIN_FAULT, /** A Fault event. */ + EVEL_DOMAIN_MEASUREMENT, /** A Measurement for VF Scaling event. */ + EVEL_DOMAIN_MOBILE_FLOW, /** A Mobile Flow event. */ + EVEL_DOMAIN_REPORT, /** A Measurement for VF Reporting event. */ + EVEL_DOMAIN_SERVICE, /** A Service event. */ + EVEL_DOMAIN_SIGNALING, /** A Signaling event. */ + EVEL_DOMAIN_STATE_CHANGE, /** A State Change event. */ + EVEL_DOMAIN_SYSLOG, /** A Syslog event. */ + EVEL_DOMAIN_OTHER, /** Another event. */ + EVEL_MAX_DOMAINS /** Maximum number of recognized Event types. */ +} EVEL_EVENT_DOMAINS; + +/**************************************************************************//** + * Event priorities. + * JSON equivalent field: priority + *****************************************************************************/ +typedef enum { + EVEL_PRIORITY_HIGH, + EVEL_PRIORITY_MEDIUM, + EVEL_PRIORITY_NORMAL, + EVEL_PRIORITY_LOW, + EVEL_MAX_PRIORITIES +} EVEL_EVENT_PRIORITIES; + +/**************************************************************************//** + * Fault / Threshold severities. + * JSON equivalent field: eventSeverity + *****************************************************************************/ +typedef enum { + EVEL_SEVERITY_CRITICAL, + EVEL_SEVERITY_MAJOR, + EVEL_SEVERITY_MINOR, + EVEL_SEVERITY_WARNING, + EVEL_SEVERITY_NORMAL, + EVEL_MAX_SEVERITIES +} EVEL_SEVERITIES; + +/**************************************************************************//** + * Fault source types. + * JSON equivalent field: eventSourceType + *****************************************************************************/ +typedef enum { + EVEL_SOURCE_OTHER, + EVEL_SOURCE_ROUTER, + EVEL_SOURCE_SWITCH, + EVEL_SOURCE_HOST, + EVEL_SOURCE_CARD, + EVEL_SOURCE_PORT, + EVEL_SOURCE_SLOT_THRESHOLD, + EVEL_SOURCE_PORT_THRESHOLD, + EVEL_SOURCE_VIRTUAL_MACHINE, + EVEL_SOURCE_VIRTUAL_NETWORK_FUNCTION, + /***************************************************************************/ + /* START OF VENDOR-SPECIFIC VALUES */ + /* */ + /* Vendor-specific values should be added here, and handled appropriately */ + /* in evel_event.c. */ + /***************************************************************************/ + + /***************************************************************************/ + /* END OF VENDOR-SPECIFIC VALUES */ + /***************************************************************************/ + EVEL_MAX_SOURCE_TYPES +} EVEL_SOURCE_TYPES; + +/**************************************************************************//** + * Fault VNF Status. + * JSON equivalent field: vfStatus + *****************************************************************************/ +typedef enum { + EVEL_VF_STATUS_ACTIVE, + EVEL_VF_STATUS_IDLE, + EVEL_VF_STATUS_PREP_TERMINATE, + EVEL_VF_STATUS_READY_TERMINATE, + EVEL_VF_STATUS_REQ_TERMINATE, + EVEL_MAX_VF_STATUSES +} EVEL_VF_STATUSES; + +/**************************************************************************//** + * Counter criticalities. + * JSON equivalent field: criticality + *****************************************************************************/ +typedef enum { + EVEL_COUNTER_CRITICALITY_CRIT, + EVEL_COUNTER_CRITICALITY_MAJ, + EVEL_MAX_COUNTER_CRITICALITIES +} EVEL_COUNTER_CRITICALITIES; + +/**************************************************************************//** + * Alert actions. + * JSON equivalent field: alertAction + *****************************************************************************/ +typedef enum { + EVEL_ALERT_ACTION_CLEAR, + EVEL_ALERT_ACTION_CONT, + EVEL_ALERT_ACTION_SET, + EVEL_MAX_ALERT_ACTIONS +} EVEL_ALERT_ACTIONS; + +/**************************************************************************//** + * Alert types. + * JSON equivalent field: alertType + *****************************************************************************/ +typedef enum { + EVEL_ALERT_TYPE_CARD, + EVEL_ALERT_TYPE_ELEMENT, + EVEL_ALERT_TYPE_INTERFACE, + EVEL_ALERT_TYPE_SERVICE, + EVEL_MAX_ALERT_TYPES +} EVEL_ALERT_TYPES; + +/**************************************************************************//** + * Alert types. + * JSON equivalent fields: newState, oldState + *****************************************************************************/ +typedef enum { + EVEL_ENTITY_STATE_IN_SERVICE, + EVEL_ENTITY_STATE_MAINTENANCE, + EVEL_ENTITY_STATE_OUT_OF_SERVICE, + EVEL_MAX_ENTITY_STATES +} EVEL_ENTITY_STATE; + +/**************************************************************************//** + * Syslog facilities. + * JSON equivalent field: syslogFacility + *****************************************************************************/ +typedef enum { + EVEL_SYSLOG_FACILITY_KERNEL, + EVEL_SYSLOG_FACILITY_USER, + EVEL_SYSLOG_FACILITY_MAIL, + EVEL_SYSLOG_FACILITY_SYSTEM_DAEMON, + EVEL_SYSLOG_FACILITY_SECURITY_AUTH, + EVEL_SYSLOG_FACILITY_INTERNAL, + EVEL_SYSLOG_FACILITY_LINE_PRINTER, + EVEL_SYSLOG_FACILITY_NETWORK_NEWS, + EVEL_SYSLOG_FACILITY_UUCP, + EVEL_SYSLOG_FACILITY_CLOCK_DAEMON, + EVEL_SYSLOG_FACILITY_SECURITY_AUTH2, + EVEL_SYSLOG_FACILITY_FTP_DAEMON, + EVEL_SYSLOG_FACILITY_NTP, + EVEL_SYSLOG_FACILITY_LOG_AUDIT, + EVEL_SYSLOG_FACILITY_LOG_ALERT, + EVEL_SYSLOG_FACILITY_CLOCK_DAEMON2, + EVEL_SYSLOG_FACILITY_LOCAL0, + EVEL_SYSLOG_FACILITY_LOCAL1, + EVEL_SYSLOG_FACILITY_LOCAL2, + EVEL_SYSLOG_FACILITY_LOCAL3, + EVEL_SYSLOG_FACILITY_LOCAL4, + EVEL_SYSLOG_FACILITY_LOCAL5, + EVEL_SYSLOG_FACILITY_LOCAL6, + EVEL_SYSLOG_FACILITY_LOCAL7, + EVEL_MAX_SYSLOG_FACILITIES +} EVEL_SYSLOG_FACILITIES; + +/**************************************************************************//** + * TCP flags. + * JSON equivalent fields: tcpFlagCountList, tcpFlagList + *****************************************************************************/ +typedef enum { + EVEL_TCP_NS, + EVEL_TCP_CWR, + EVEL_TCP_ECE, + EVEL_TCP_URG, + EVEL_TCP_ACK, + EVEL_TCP_PSH, + EVEL_TCP_RST, + EVEL_TCP_SYN, + EVEL_TCP_FIN, + EVEL_MAX_TCP_FLAGS +} EVEL_TCP_FLAGS; + +/**************************************************************************//** + * Mobile QCI Classes of Service. + * JSON equivalent fields: mobileQciCosCountList, mobileQciCosList + *****************************************************************************/ +typedef enum { + + /***************************************************************************/ + /* UMTS Classes of Service. */ + /***************************************************************************/ + EVEL_QCI_COS_UMTS_CONVERSATIONAL, + EVEL_QCI_COS_UMTS_STREAMING, + EVEL_QCI_COS_UMTS_INTERACTIVE, + EVEL_QCI_COS_UMTS_BACKGROUND, + + /***************************************************************************/ + /* LTE Classes of Service. */ + /***************************************************************************/ + EVEL_QCI_COS_LTE_1, + EVEL_QCI_COS_LTE_2, + EVEL_QCI_COS_LTE_3, + EVEL_QCI_COS_LTE_4, + EVEL_QCI_COS_LTE_65, + EVEL_QCI_COS_LTE_66, + EVEL_QCI_COS_LTE_5, + EVEL_QCI_COS_LTE_6, + EVEL_QCI_COS_LTE_7, + EVEL_QCI_COS_LTE_8, + EVEL_QCI_COS_LTE_9, + EVEL_QCI_COS_LTE_69, + EVEL_QCI_COS_LTE_70, + EVEL_MAX_QCI_COS_TYPES +} EVEL_QCI_COS_TYPES; + +/**************************************************************************//** + * Service Event endpoint description + * JSON equivalent field: endpointDesc + *****************************************************************************/ +typedef enum { + EVEL_SERVICE_ENDPOINT_CALLEE, + EVEL_SERVICE_ENDPOINT_CALLER, + EVEL_MAX_SERVICE_ENDPOINT_DESC +} EVEL_SERVICE_ENDPOINT_DESC; + +/**************************************************************************//** + * Boolean type for EVEL library. + *****************************************************************************/ +typedef enum { + EVEL_FALSE, + EVEL_TRUE +} EVEL_BOOLEAN; + +/**************************************************************************//** + * Optional parameter holder for double. + *****************************************************************************/ +typedef struct evel_option_double +{ + double value; + EVEL_BOOLEAN is_set; +} EVEL_OPTION_DOUBLE; + +/**************************************************************************//** + * Optional parameter holder for string. + *****************************************************************************/ +typedef struct evel_option_string +{ + char * value; + EVEL_BOOLEAN is_set; +} EVEL_OPTION_STRING; + +/**************************************************************************//** + * Optional parameter holder for int. + *****************************************************************************/ +typedef struct evel_option_int +{ + int value; + EVEL_BOOLEAN is_set; +} EVEL_OPTION_INT; + +/**************************************************************************//** + * Optional parameter holder for unsigned long long. + *****************************************************************************/ +typedef struct evel_option_ull +{ + unsigned long long value; + EVEL_BOOLEAN is_set; +} EVEL_OPTION_ULL; + +/**************************************************************************//** + * Optional parameter holder for time_t. + *****************************************************************************/ +typedef struct evel_option_time +{ + time_t value; + EVEL_BOOLEAN is_set; +} EVEL_OPTION_TIME; + +/*****************************************************************************/ +/* Supported Common Event Header version. */ +/*****************************************************************************/ +#define EVEL_HEADER_MAJOR_VERSION 1 +#define EVEL_HEADER_MINOR_VERSION 2 + +/**************************************************************************//** + * Event header. + * JSON equivalent field: commonEventHeader + *****************************************************************************/ +typedef struct event_header { + /***************************************************************************/ + /* Version */ + /***************************************************************************/ + int major_version; + int minor_version; + + /***************************************************************************/ + /* Mandatory fields */ + /***************************************************************************/ + EVEL_EVENT_DOMAINS event_domain; + char * event_id; + char * source_name; + char * functional_role; + char * reporting_entity_name; + EVEL_EVENT_PRIORITIES priority; + unsigned long long start_epoch_microsec; + unsigned long long last_epoch_microsec; + int sequence; + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + EVEL_OPTION_STRING event_type; + EVEL_OPTION_STRING source_id; + EVEL_OPTION_STRING reporting_entity_id; + +} EVENT_HEADER; + +/*****************************************************************************/ +/* Supported Fault version. */ +/*****************************************************************************/ +#define EVEL_FAULT_MAJOR_VERSION 1 +#define EVEL_FAULT_MINOR_VERSION 1 + +/**************************************************************************//** + * Fault. + * JSON equivalent field: faultFields + *****************************************************************************/ +typedef struct event_fault { + /***************************************************************************/ + /* Header and version */ + /***************************************************************************/ + EVENT_HEADER header; + int major_version; + int minor_version; + + /***************************************************************************/ + /* Mandatory fields */ + /***************************************************************************/ + EVEL_SEVERITIES event_severity; + EVEL_SOURCE_TYPES event_source_type; + char * alarm_condition; + char * specific_problem; + EVEL_VF_STATUSES vf_status; + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + EVEL_OPTION_STRING alarm_interface_a; + DLIST additional_info; + +} EVENT_FAULT; + +/**************************************************************************//** + * Fault Additional Info. + * JSON equivalent field: alarmAdditionalInformation + *****************************************************************************/ +typedef struct fault_additional_info { + char * name; + char * value; +} FAULT_ADDL_INFO; + +/*****************************************************************************/ +/* Supported Measurement version. */ +/*****************************************************************************/ +#define EVEL_MEASUREMENT_MAJOR_VERSION 1 +#define EVEL_MEASUREMENT_MINOR_VERSION 1 + +/**************************************************************************//** + * Errors. + * JSON equivalent field: errors + *****************************************************************************/ +typedef struct measurement_errors { + int receive_discards; + int receive_errors; + int transmit_discards; + int transmit_errors; +} MEASUREMENT_ERRORS; + +/**************************************************************************//** + * Measurement. + * JSON equivalent field: measurementsForVfScalingFields + *****************************************************************************/ +typedef struct event_measurement { + /***************************************************************************/ + /* Header and version */ + /***************************************************************************/ + EVENT_HEADER header; + int major_version; + int minor_version; + + /***************************************************************************/ + /* Mandatory fields */ + /***************************************************************************/ + double measurement_interval; + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + DLIST additional_measurements; + EVEL_OPTION_DOUBLE aggregate_cpu_usage; + DLIST codec_usage; + EVEL_OPTION_INT concurrent_sessions; + EVEL_OPTION_INT configured_entities; + DLIST cpu_usage; + MEASUREMENT_ERRORS * errors; + DLIST feature_usage; + DLIST filesystem_usage; + DLIST latency_distribution; + EVEL_OPTION_DOUBLE mean_request_latency; + EVEL_OPTION_DOUBLE memory_configured; + EVEL_OPTION_DOUBLE memory_used; + EVEL_OPTION_INT media_ports_in_use; + EVEL_OPTION_INT request_rate; + EVEL_OPTION_DOUBLE vnfc_scaling_metric; + DLIST vnic_usage; + +} EVENT_MEASUREMENT; + +/**************************************************************************//** + * CPU Usage. + * JSON equivalent field: cpuUsage + *****************************************************************************/ +typedef struct measurement_cpu_use { + char * id; + double usage; +} MEASUREMENT_CPU_USE; + +/**************************************************************************//** + * Filesystem Usage. + * JSON equivalent field: filesystemUsage + *****************************************************************************/ +typedef struct measurement_fsys_use { + char * filesystem_name; + double block_configured; + int block_iops; + double block_used; + double ephemeral_configured; + int ephemeral_iops; + double ephemeral_used; +} MEASUREMENT_FSYS_USE; + +/**************************************************************************//** + * Latency Bucket. + * JSON equivalent field: latencyBucketMeasure + *****************************************************************************/ +typedef struct measurement_latency_bucket { + int count; + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + EVEL_OPTION_DOUBLE high_end; + EVEL_OPTION_DOUBLE low_end; + +} MEASUREMENT_LATENCY_BUCKET; + +/**************************************************************************//** + * Virtual NIC usage. + * JSON equivalent field: vNicUsage + *****************************************************************************/ +typedef struct measurement_vnic_use { + int bytes_in; + int bytes_out; + int packets_in; + int packets_out; + char * vnic_id; + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + EVEL_OPTION_INT broadcast_packets_in; + EVEL_OPTION_INT broadcast_packets_out; + EVEL_OPTION_INT multicast_packets_in; + EVEL_OPTION_INT multicast_packets_out; + EVEL_OPTION_INT unicast_packets_in; + EVEL_OPTION_INT unicast_packets_out; + +} MEASUREMENT_VNIC_USE; + +/**************************************************************************//** + * Codec Usage. + * JSON equivalent field: codecsInUse + *****************************************************************************/ +typedef struct measurement_codec_use { + char * codec_id; + int number_in_use; +} MEASUREMENT_CODEC_USE; + +/**************************************************************************//** + * Feature Usage. + * JSON equivalent field: featuresInUse + *****************************************************************************/ +typedef struct measurement_feature_use { + char * feature_id; + int feature_utilization; +} MEASUREMENT_FEATURE_USE; + +/**************************************************************************//** + * Measurement Group. + * JSON equivalent field: additionalMeasurements + *****************************************************************************/ +typedef struct measurement_group { + char * name; + DLIST measurements; +} MEASUREMENT_GROUP; + +/**************************************************************************//** + * Custom Defined Measurement. + * JSON equivalent field: measurements + *****************************************************************************/ +typedef struct custom_measurement { + char * name; + char * value; +} CUSTOM_MEASUREMENT; + +/*****************************************************************************/ +/* Supported Report version. */ +/*****************************************************************************/ +#define EVEL_REPORT_MAJOR_VERSION 1 +#define EVEL_REPORT_MINOR_VERSION 1 + +/**************************************************************************//** + * Report. + * JSON equivalent field: measurementsForVfReportingFields + * + * @note This is an experimental event type and is not currently a formal part + * of AT&T's specification. + *****************************************************************************/ +typedef struct event_report { + /***************************************************************************/ + /* Header and version */ + /***************************************************************************/ + EVENT_HEADER header; + int major_version; + int minor_version; + + /***************************************************************************/ + /* Mandatory fields */ + /***************************************************************************/ + double measurement_interval; + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + DLIST feature_usage; + DLIST measurement_groups; + +} EVENT_REPORT; + +/**************************************************************************//** + * Mobile GTP Per Flow Metrics. + * JSON equivalent field: gtpPerFlowMetrics + *****************************************************************************/ +typedef struct mobile_gtp_per_flow_metrics { + double avg_bit_error_rate; + double avg_packet_delay_variation; + int avg_packet_latency; + int avg_receive_throughput; + int avg_transmit_throughput; + int flow_activation_epoch; + int flow_activation_microsec; + int flow_deactivation_epoch; + int flow_deactivation_microsec; + time_t flow_deactivation_time; + char * flow_status; + int max_packet_delay_variation; + int num_activation_failures; + int num_bit_errors; + int num_bytes_received; + int num_bytes_transmitted; + int num_dropped_packets; + int num_l7_bytes_received; + int num_l7_bytes_transmitted; + int num_lost_packets; + int num_out_of_order_packets; + int num_packet_errors; + int num_packets_received_excl_retrans; + int num_packets_received_incl_retrans; + int num_packets_transmitted_incl_retrans; + int num_retries; + int num_timeouts; + int num_tunneled_l7_bytes_received; + int round_trip_time; + int time_to_first_byte; + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + EVEL_OPTION_INT ip_tos_counts[EVEL_TOS_SUPPORTED]; + EVEL_OPTION_INT tcp_flag_counts[EVEL_MAX_TCP_FLAGS]; + EVEL_OPTION_INT qci_cos_counts[EVEL_MAX_QCI_COS_TYPES]; + EVEL_OPTION_INT dur_connection_failed_status; + EVEL_OPTION_INT dur_tunnel_failed_status; + EVEL_OPTION_STRING flow_activated_by; + EVEL_OPTION_TIME flow_activation_time; + EVEL_OPTION_STRING flow_deactivated_by; + EVEL_OPTION_STRING gtp_connection_status; + EVEL_OPTION_STRING gtp_tunnel_status; + EVEL_OPTION_INT large_packet_rtt; + EVEL_OPTION_DOUBLE large_packet_threshold; + EVEL_OPTION_INT max_receive_bit_rate; + EVEL_OPTION_INT max_transmit_bit_rate; + EVEL_OPTION_INT num_gtp_echo_failures; + EVEL_OPTION_INT num_gtp_tunnel_errors; + EVEL_OPTION_INT num_http_errors; + +} MOBILE_GTP_PER_FLOW_METRICS; + +/*****************************************************************************/ +/* Supported Mobile Flow version. */ +/*****************************************************************************/ +#define EVEL_MOBILE_FLOW_MAJOR_VERSION 1 +#define EVEL_MOBILE_FLOW_MINOR_VERSION 1 + +/**************************************************************************//** + * Mobile Flow. + * JSON equivalent field: mobileFlow + *****************************************************************************/ +typedef struct event_mobile_flow { + /***************************************************************************/ + /* Header and version */ + /***************************************************************************/ + EVENT_HEADER header; + int major_version; + int minor_version; + + /***************************************************************************/ + /* Mandatory fields */ + /***************************************************************************/ + char * flow_direction; + MOBILE_GTP_PER_FLOW_METRICS * gtp_per_flow_metrics; + char * ip_protocol_type; + char * ip_version; + char * other_endpoint_ip_address; + int other_endpoint_port; + char * reporting_endpoint_ip_addr; + int reporting_endpoint_port; + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + EVEL_OPTION_STRING application_type; + EVEL_OPTION_STRING app_protocol_type; + EVEL_OPTION_STRING app_protocol_version; + EVEL_OPTION_STRING cid; + EVEL_OPTION_STRING connection_type; + EVEL_OPTION_STRING ecgi; + EVEL_OPTION_STRING gtp_protocol_type; + EVEL_OPTION_STRING gtp_version; + EVEL_OPTION_STRING http_header; + EVEL_OPTION_STRING imei; + EVEL_OPTION_STRING imsi; + EVEL_OPTION_STRING lac; + EVEL_OPTION_STRING mcc; + EVEL_OPTION_STRING mnc; + EVEL_OPTION_STRING msisdn; + EVEL_OPTION_STRING other_functional_role; + EVEL_OPTION_STRING rac; + EVEL_OPTION_STRING radio_access_technology; + EVEL_OPTION_STRING sac; + EVEL_OPTION_INT sampling_algorithm; + EVEL_OPTION_STRING tac; + EVEL_OPTION_STRING tunnel_id; + EVEL_OPTION_STRING vlan_id; + +} EVENT_MOBILE_FLOW; + +/**************************************************************************//** + * Other. + * JSON equivalent field: otherFields + *****************************************************************************/ +typedef struct event_other { + EVENT_HEADER header; + DLIST other_fields; + +} EVENT_OTHER; + +/**************************************************************************//** + * Other Field. + * JSON equivalent field: otherFields + *****************************************************************************/ +typedef struct other_field { + char * name; + char * value; +} OTHER_FIELD; + +/**************************************************************************//** + * Event Instance Identifier + * JSON equivalent field: eventInstanceIdentifier + *****************************************************************************/ +typedef struct evel_event_instance_id { + + /***************************************************************************/ + /* Mandatory fields */ + /***************************************************************************/ + char * vendor_id; /* JSON: vendorId */ + char * event_id; /* JSON: eventId */ + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + EVEL_OPTION_STRING product_id; /* JSON: productId */ + EVEL_OPTION_STRING subsystem_id; /* JSON: subsystemId */ + EVEL_OPTION_STRING event_friendly_name; /* JSON: eventFriendlyName */ + +} EVEL_EVENT_INSTANCE_ID; + +/*****************************************************************************/ +/* Supported Service Events version. */ +/*****************************************************************************/ +#define EVEL_SERVICE_MAJOR_VERSION 1 +#define EVEL_SERVICE_MINOR_VERSION 1 + +/**************************************************************************//** + * Service Events. + * JSON equivalent field: serviceEventsFields + *****************************************************************************/ +typedef struct event_service { + /***************************************************************************/ + /* Header and version */ + /***************************************************************************/ + EVENT_HEADER header; + int major_version; + int minor_version; + + /***************************************************************************/ + /* Mandatory fields */ + /***************************************************************************/ + EVEL_EVENT_INSTANCE_ID instance_id; /* JSON: eventInstanceIdentifier */ + + /***************************************************************************/ + /* Optional fields. */ + /***************************************************************************/ + EVEL_OPTION_STRING correlator; /* JSON: correlator */ + DLIST additional_fields; /* JSON: additionalFields */ + + /***************************************************************************/ + /* Optional fields within JSON equivalent object: codecSelected */ + /***************************************************************************/ + EVEL_OPTION_STRING codec; /* JSON: codec */ + + /***************************************************************************/ + /* Optional fields within JSON equivalent object: codecSelectedTranscoding */ + /***************************************************************************/ + EVEL_OPTION_STRING callee_side_codec; /* JSON: calleeSideCodec */ + EVEL_OPTION_STRING caller_side_codec; /* JSON: callerSideCodec */ + + /***************************************************************************/ + /* Optional fields within JSON equivalent object: midCallRtcp */ + /***************************************************************************/ + EVEL_OPTION_STRING rtcp_data; /* JSON: rtcpData */ + + /***************************************************************************/ + /* Optional fields within JSON equivalent object: endOfCallVqmSummaries */ + /***************************************************************************/ + EVEL_OPTION_STRING adjacency_name; /* JSON: adjacencyName */ + EVEL_OPTION_STRING endpoint_description; /* JSON: endpointDescription */ + EVEL_OPTION_INT endpoint_jitter; /* JSON: endpointJitter */ + EVEL_OPTION_INT endpoint_rtp_oct_disc; /* JSON: endpointRtpOctetsDiscarded */ + EVEL_OPTION_INT endpoint_rtp_oct_recv; /* JSON: endpointRtpOctetsReceived */ + EVEL_OPTION_INT endpoint_rtp_oct_sent; /* JSON: endpointRtpOctetsSent */ + EVEL_OPTION_INT endpoint_rtp_pkt_disc;/* JSON: endpointRtpPacketsDiscarded */ + EVEL_OPTION_INT endpoint_rtp_pkt_recv; /* JSON: endpointRtpPacketsReceived */ + EVEL_OPTION_INT endpoint_rtp_pkt_sent; /* JSON: endpointRtpPacketsSent */ + EVEL_OPTION_INT local_jitter; /* JSON: localJitter */ + EVEL_OPTION_INT local_rtp_oct_disc; /* JSON: localRtpOctetsDiscarded */ + EVEL_OPTION_INT local_rtp_oct_recv; /* JSON: localRtpOctetsReceived */ + EVEL_OPTION_INT local_rtp_oct_sent; /* JSON: localRtpOctetsSent */ + EVEL_OPTION_INT local_rtp_pkt_disc; /* JSON: localRtpPacketsDiscarded */ + EVEL_OPTION_INT local_rtp_pkt_recv; /* JSON: localRtpPacketsReceived */ + EVEL_OPTION_INT local_rtp_pkt_sent; /* JSON: localRtpPacketsSent */ + EVEL_OPTION_DOUBLE mos_cqe; /* JSON: mosCqe */ + EVEL_OPTION_INT packets_lost; /* JSON: packetsLost */ + EVEL_OPTION_DOUBLE packet_loss_percent; /* JSON: packetLossPercent */ + EVEL_OPTION_INT r_factor; /* JSON: rFactor */ + EVEL_OPTION_INT round_trip_delay; /* JSON: roundTripDelay */ + + /***************************************************************************/ + /* Optional fields within JSON equivalent object: marker */ + /***************************************************************************/ + EVEL_OPTION_STRING phone_number; /* JSON: phoneNumber */ + +} EVENT_SERVICE; + +/*****************************************************************************/ +/* Supported Signaling version. */ +/*****************************************************************************/ +#define EVEL_SIGNALING_MAJOR_VERSION 1 +#define EVEL_SIGNALING_MINOR_VERSION 1 + +/**************************************************************************//** + * Signaling. + * JSON equivalent field: signalingFields + *****************************************************************************/ +typedef struct event_signaling { + /***************************************************************************/ + /* Header and version */ + /***************************************************************************/ + EVENT_HEADER header; + int major_version; + int minor_version; + + /***************************************************************************/ + /* Mandatory fields */ + /***************************************************************************/ + EVEL_EVENT_INSTANCE_ID instance_id; /* JSON: eventInstanceIdentifier */ + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + EVEL_OPTION_STRING correlator; /* JSON: correlator */ + EVEL_OPTION_STRING local_ip_address; /* JSON: localIpAddress */ + EVEL_OPTION_STRING local_port; /* JSON: localPort */ + EVEL_OPTION_STRING remote_ip_address; /* JSON: remoteIpAddress */ + EVEL_OPTION_STRING remote_port; /* JSON: remotePort */ + EVEL_OPTION_STRING compressed_sip; /* JSON: compressedSip */ + EVEL_OPTION_STRING summary_sip; /* JSON: summarySip */ + +} EVENT_SIGNALING; + +/*****************************************************************************/ +/* Supported State Change version. */ +/*****************************************************************************/ +#define EVEL_STATE_CHANGE_MAJOR_VERSION 1 +#define EVEL_STATE_CHANGE_MINOR_VERSION 1 + +/**************************************************************************//** + * State Change. + * JSON equivalent field: stateChangeFields + *****************************************************************************/ +typedef struct event_state_change { + /***************************************************************************/ + /* Header and version */ + /***************************************************************************/ + EVENT_HEADER header; + int major_version; + int minor_version; + + /***************************************************************************/ + /* Mandatory fields */ + /***************************************************************************/ + EVEL_ENTITY_STATE new_state; + EVEL_ENTITY_STATE old_state; + char * state_interface; + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + DLIST additional_fields; + +} EVENT_STATE_CHANGE; + +/**************************************************************************//** + * State Change Additional Field. + * JSON equivalent field: additionalFields + *****************************************************************************/ +typedef struct state_change_additional_field { + char * name; + char * value; +} STATE_CHANGE_ADDL_FIELD; + +/*****************************************************************************/ +/* Supported Syslog version. */ +/*****************************************************************************/ +#define EVEL_SYSLOG_MAJOR_VERSION 1 +#define EVEL_SYSLOG_MINOR_VERSION 1 + +/**************************************************************************//** + * Syslog. + * JSON equivalent field: syslogFields + *****************************************************************************/ +typedef struct event_syslog { + /***************************************************************************/ + /* Header and version */ + /***************************************************************************/ + EVENT_HEADER header; + int major_version; + int minor_version; + + /***************************************************************************/ + /* Mandatory fields */ + /***************************************************************************/ + EVEL_SOURCE_TYPES event_source_type; + char * syslog_msg; + char * syslog_tag; + + /***************************************************************************/ + /* Optional fields */ + /***************************************************************************/ + DLIST additional_fields; + EVEL_OPTION_STRING event_source_host; + EVEL_OPTION_INT syslog_facility; + EVEL_OPTION_STRING syslog_proc; + EVEL_OPTION_INT syslog_proc_id; + EVEL_OPTION_STRING syslog_s_data; + EVEL_OPTION_INT syslog_ver; + +} EVENT_SYSLOG; + +/**************************************************************************//** + * Syslog Additional Field. + * JSON equivalent field: additionalFields + *****************************************************************************/ +typedef struct syslog_additional_field { + char * name; + char * value; +} SYSLOG_ADDL_FIELD; + +/**************************************************************************//** + * Copyright. + * JSON equivalent object: attCopyrightNotice + *****************************************************************************/ +typedef struct copyright { + char * useAndRedistribution; + char * condition1; + char * condition2; + char * condition3; + char * condition4; + char * disclaimerLine1; + char * disclaimerLine2; + char * disclaimerLine3; + char * disclaimerLine4; +} COPYRIGHT; + +/**************************************************************************//** + * Library initialization. + * + * Initialize the EVEL library. + * + * @note This function initializes the cURL library. Applications making use + * of libcurl may need to pull the initialization out of here. Note + * also that this function is not threadsafe as a result - refer to + * libcurl's API documentation for relevant warnings. + * + * @sa Matching Term function. + * + * @param fqdn The API's FQDN or IP address. + * @param port The API's port. + * @param path The optional path (may be NULL). + * @param topic The optional topic part of the URL (may be NULL). + * @param secure Whether to use HTTPS (0=HTTP, 1=HTTPS). + * @param username Username for Basic Authentication of requests. + * @param password Password for Basic Authentication of requests. + * @param source_type The kind of node we represent. + * @param role The role this node undertakes. + * @param verbosity 0 for normal operation, positive values for chattier + * logs. + * + * @returns Status code + * @retval EVEL_SUCCESS On success + * @retval ::EVEL_ERR_CODES On failure. + *****************************************************************************/ +EVEL_ERR_CODES evel_initialize(const char * const fqdn, + int port, + const char * const path, + const char * const topic, + int secure, + const char * const username, + const char * const password, + EVEL_SOURCE_TYPES source_type, + const char * const role, + int verbosity + ); + +/**************************************************************************//** + * Clean up the EVEL library. + * + * @note that at present don't expect Init/Term cycling not to leak memory! + * + * @returns Status code + * @retval EVEL_SUCCESS On success + * @retval "One of ::EVEL_ERR_CODES" On failure. + *****************************************************************************/ +EVEL_ERR_CODES evel_terminate(void); + +EVEL_ERR_CODES evel_post_event(EVENT_HEADER * event); +const char * evel_error_string(void); + + +/**************************************************************************//** + * Free an event. + * + * Free off the event supplied. Will free all the contained allocated memory. + * + * @note It is safe to free a NULL pointer. + *****************************************************************************/ +void evel_free_event(void * event); + +/**************************************************************************//** + * Encode the event as a JSON event object according to AT&T's schema. + * + * @param json Pointer to where to store the JSON encoded data. + * @param max_size Size of storage available in json_body. + * @param event Pointer to the ::EVENT_HEADER to encode. + * @returns Number of bytes actually written. + *****************************************************************************/ +int evel_json_encode_event(char * json, + int max_size, + EVENT_HEADER * event); + +/**************************************************************************//** + * Callback function to provide returned data. + * + * Copy data into the supplied buffer, write_callback::ptr, checking size + * limits. + * + * @returns Number of bytes placed into write_callback::ptr. 0 for EOF. + *****************************************************************************/ +size_t evel_write_callback(void *contents, + size_t size, + size_t nmemb, + void *userp); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* HEARTBEAT - (includes common header, too) */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Create a new heartbeat event. + * + * @note that the heartbeat is just a "naked" commonEventHeader! + * + * @returns pointer to the newly manufactured ::EVENT_HEADER. If the event is + * not used it must be released using ::evel_free_event + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_HEADER * evel_new_heartbeat(void); + +/**************************************************************************//** + * Free an event header. + * + * Free off the event header supplied. Will free all the contained allocated + * memory. + * + * @note It does not free the header itself, since that may be part of a + * larger structure. + *****************************************************************************/ +void evel_free_header(EVENT_HEADER * const event); + +/**************************************************************************//** + * Initialize a newly created event header. + * + * @param header Pointer to the header being initialized. + *****************************************************************************/ +void evel_init_header(EVENT_HEADER * const header); + +/**************************************************************************//** + * Set the Event Type property of the event header. + * + * @param header Pointer to the ::EVENT_HEADER. + * @param type The Event Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_header_type_set(EVENT_HEADER * const header, + const char * const type); + +/**************************************************************************//** + * Set the Start Epoch property of the event header. + * + * @note The Start Epoch defaults to the time of event creation. + * + * @param header Pointer to the ::EVENT_HEADER. + * @param start_epoch_microsec + * The start epoch to set, in microseconds. + *****************************************************************************/ +void evel_start_epoch_set(EVENT_HEADER * const header, + const unsigned long long start_epoch_microsec); + +/**************************************************************************//** + * Set the Last Epoch property of the event header. + * + * @note The Last Epoch defaults to the time of event creation. + * + * @param header Pointer to the ::EVENT_HEADER. + * @param last_epoch_microsec + * The last epoch to set, in microseconds. + *****************************************************************************/ +void evel_last_epoch_set(EVENT_HEADER * const header, + const unsigned long long last_epoch_microsec); + +/**************************************************************************//** + * Set the Reporting Entity Name property of the event header. + * + * @note The Reporting Entity Name defaults to the OpenStack VM Name. + * + * @param header Pointer to the ::EVENT_HEADER. + * @param entity_name The entity name to set. + *****************************************************************************/ +void evel_reporting_entity_name_set(EVENT_HEADER * const header, + const char * const entity_name); + +/**************************************************************************//** + * Set the Reporting Entity Id property of the event header. + * + * @note The Reporting Entity Id defaults to the OpenStack VM UUID. + * + * @param header Pointer to the ::EVENT_HEADER. + * @param entity_id The entity id to set. + *****************************************************************************/ +void evel_reporting_entity_id_set(EVENT_HEADER * const header, + const char * const entity_id); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* FAULT */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Create a new fault event. + * + * + * @returns pointer to the newly manufactured ::EVENT_FAULT. If the event is + * not used it must be released using ::evel_free_fault + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_FAULT * evel_new_fault(const char * const condition, + const char * const specific_problem, + EVEL_EVENT_PRIORITIES priority, + EVEL_SEVERITIES severity); + +/**************************************************************************//** + * Free a Fault. + * + * Free off the Fault supplied. Will free all the contained allocated memory. + * + * @note It does not free the Fault itself, since that may be part of a + * larger structure. + *****************************************************************************/ +void evel_free_fault(EVENT_FAULT * event); + + +/**************************************************************************//** + * Set the Alarm Interface A property of the Fault. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param fault Pointer to the fault. + * @param interface The Alarm Interface A to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_fault_interface_set(EVENT_FAULT * fault, + const char * const interface); + +/**************************************************************************//** + * Add an additional value name/value pair to the Fault. + * + * The name and value are null delimited ASCII strings. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param fault Pointer to the fault. + * @param name ASCIIZ string with the attribute's name. + * @param value ASCIIZ string with the attribute's value. + *****************************************************************************/ +void evel_fault_addl_info_add(EVENT_FAULT * fault, char * name, char * value); + +/**************************************************************************//** + * Set the Event Type property of the Fault. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param fault Pointer to the fault. + * @param type The Event Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_fault_type_set(EVENT_FAULT * fault, const char * const type); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* MEASUREMENT */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Create a new Measurement event. + * + * @note The mandatory fields on the Measurement must be supplied to this + * factory function and are immutable once set. Optional fields have + * explicit setter functions, but again values may only be set once so + * that the Measurement has immutable properties. + * + * @param measurement_interval + * + * @returns pointer to the newly manufactured ::EVENT_MEASUREMENT. If the + * event is not used (i.e. posted) it must be released using + * ::evel_free_event. + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_MEASUREMENT * evel_new_measurement(double measurement_interval); + +/**************************************************************************//** + * Free a Measurement. + * + * Free off the Measurement supplied. Will free all the contained allocated + * memory. + * + * @note It does not free the Measurement itself, since that may be part of a + * larger structure. + *****************************************************************************/ +void evel_free_measurement(EVENT_MEASUREMENT * event); + +/**************************************************************************//** + * Set the Event Type property of the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the Measurement. + * @param type The Event Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_measurement_type_set(EVENT_MEASUREMENT * measurement, + const char * const type); + +/**************************************************************************//** + * Set the Concurrent Sessions property of the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the Measurement. + * @param concurrent_sessions The Concurrent Sessions to be set. + *****************************************************************************/ +void evel_measurement_conc_sess_set(EVENT_MEASUREMENT * measurement, + int concurrent_sessions); + +/**************************************************************************//** + * Set the Configured Entities property of the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the Measurement. + * @param configured_entities The Configured Entities to be set. + *****************************************************************************/ +void evel_measurement_cfg_ents_set(EVENT_MEASUREMENT * measurement, + int configured_entities); + +/**************************************************************************//** + * Add an additional set of Errors to the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the measurement. + * @param receive_discards The number of receive discards. + * @param receive_errors The number of receive errors. + * @param transmit_discards The number of transmit discards. + * @param transmit_errors The number of transmit errors. + *****************************************************************************/ +void evel_measurement_errors_set(EVENT_MEASUREMENT * measurement, + int receive_discards, + int receive_errors, + int transmit_discards, + int transmit_errors); + +/**************************************************************************//** + * Set the Mean Request Latency property of the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the Measurement. + * @param mean_request_latency The Mean Request Latency to be set. + *****************************************************************************/ +void evel_measurement_mean_req_lat_set(EVENT_MEASUREMENT * measurement, + double mean_request_latency); + +/**************************************************************************//** + * Set the Memory Configured property of the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the Measurement. + * @param memory_configured The Memory Configured to be set. + *****************************************************************************/ +void evel_measurement_mem_cfg_set(EVENT_MEASUREMENT * measurement, + double memory_configured); + +/**************************************************************************//** + * Set the Memory Used property of the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the Measurement. + * @param memory_used The Memory Used to be set. + *****************************************************************************/ +void evel_measurement_mem_used_set(EVENT_MEASUREMENT * measurement, + double memory_used); + +/**************************************************************************//** + * Set the Request Rate property of the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the Measurement. + * @param request_rate The Request Rate to be set. + *****************************************************************************/ +void evel_measurement_request_rate_set(EVENT_MEASUREMENT * measurement, + int request_rate); + +/**************************************************************************//** + * Add an additional CPU usage value name/value pair to the Measurement. + * + * The name and value are null delimited ASCII strings. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param measurement Pointer to the measurement. + * @param id ASCIIZ string with the CPU's identifier. + * @param usage CPU utilization. + *****************************************************************************/ +void evel_measurement_cpu_use_add(EVENT_MEASUREMENT * measurement, + char * id, double usage); + +/**************************************************************************//** + * Add an additional File System usage value name/value pair to the + * Measurement. + * + * The filesystem_name is null delimited ASCII string. The library takes a + * copy so the caller does not have to preserve values after the function + * returns. + * + * @param measurement Pointer to the measurement. + * @param filesystem_name ASCIIZ string with the file-system's UUID. + * @param block_configured Block storage configured. + * @param block_used Block storage in use. + * @param block_iops Block storage IOPS. + * @param ephemeral_configured Ephemeral storage configured. + * @param ephemeral_used Ephemeral storage in use. + * @param ephemeral_iops Ephemeral storage IOPS. + *****************************************************************************/ +void evel_measurement_fsys_use_add(EVENT_MEASUREMENT * measurement, + char * filesystem_name, + double block_configured, + double block_used, + int block_iops, + double ephemeral_configured, + double ephemeral_used, + int ephemeral_iops); + +/**************************************************************************//** + * Add a Feature usage value name/value pair to the Measurement. + * + * The name is null delimited ASCII string. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param measurement Pointer to the measurement. + * @param feature ASCIIZ string with the feature's name. + * @param utilization Utilization of the feature. + *****************************************************************************/ +void evel_measurement_feature_use_add(EVENT_MEASUREMENT * measurement, + char * feature, + int utilization); + +/**************************************************************************//** + * Add a Additional Measurement value name/value pair to the Measurement. + * + * The name is null delimited ASCII string. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param measurement Pointer to the Measurement. + * @param group ASCIIZ string with the measurement group's name. + * @param name ASCIIZ string containing the measurement's name. + * @param name ASCIIZ string containing the measurement's value. + *****************************************************************************/ +void evel_measurement_custom_measurement_add(EVENT_MEASUREMENT * measurement, + const char * const group, + const char * const name, + const char * const value); + +/**************************************************************************//** + * Add a Codec usage value name/value pair to the Measurement. + * + * The name is null delimited ASCII string. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param measurement Pointer to the measurement. + * @param codec ASCIIZ string with the codec's name. + * @param utilization Utilization of the feature. + *****************************************************************************/ +void evel_measurement_codec_use_add(EVENT_MEASUREMENT * measurement, + char * codec, + int utilization); + +/**************************************************************************//** +} + * Set the Aggregate CPU Use property of the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the measurement. + * @param cpu_use The CPU use to set. + *****************************************************************************/ +void evel_measurement_agg_cpu_use_set(EVENT_MEASUREMENT * measurement, + double cpu_use); + +/**************************************************************************//** + * Set the Media Ports in Use property of the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the measurement. + * @param media_ports_in_use The media port usage to set. + *****************************************************************************/ +void evel_measurement_media_port_use_set(EVENT_MEASUREMENT * measurement, + int media_ports_in_use); + +/**************************************************************************//** + * Set the VNFC Scaling Metric property of the Measurement. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param measurement Pointer to the measurement. + * @param scaling_metric The scaling metric to set. + *****************************************************************************/ +void evel_measurement_vnfc_scaling_metric_set(EVENT_MEASUREMENT * measurement, + double scaling_metric); + +/**************************************************************************//** + * Create a new Latency Bucket to be added to a Measurement event. + * + * @note The mandatory fields on the ::MEASUREMENT_LATENCY_BUCKET must be + * supplied to this factory function and are immutable once set. + * Optional fields have explicit setter functions, but again values + * may only be set once so that the ::MEASUREMENT_LATENCY_BUCKET has + * immutable properties. + * + * @param count Count of events in this bucket. + * + * @returns pointer to the newly manufactured ::MEASUREMENT_LATENCY_BUCKET. + * @retval NULL Failed to create the Latency Bucket. + *****************************************************************************/ +MEASUREMENT_LATENCY_BUCKET * evel_new_meas_latency_bucket(const int count); + +/**************************************************************************//** + * Set the High End property of the Measurement Latency Bucket. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param bucket Pointer to the Measurement Latency Bucket. + * @param high_end High end of the bucket's range. + *****************************************************************************/ +void evel_meas_latency_bucket_high_end_set( + MEASUREMENT_LATENCY_BUCKET * const bucket, + const double high_end); + +/**************************************************************************//** + * Set the Low End property of the Measurement Latency Bucket. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param bucket Pointer to the Measurement Latency Bucket. + * @param low_end Low end of the bucket's range. + *****************************************************************************/ +void evel_meas_latency_bucket_low_end_set( + MEASUREMENT_LATENCY_BUCKET * const bucket, + const double low_end); + +/**************************************************************************//** + * Add an additional Measurement Latency Bucket to the specified event. + * + * @param measurement Pointer to the Measurement event. + * @param bucket Pointer to the Measurement Latency Bucket to add. + *****************************************************************************/ +void evel_meas_latency_bucket_add(EVENT_MEASUREMENT * const measurement, + MEASUREMENT_LATENCY_BUCKET * const bucket); + +/**************************************************************************//** + * Add an additional Latency Distribution bucket to the Measurement. + * + * This function implements the previous API, purely for convenience. + * + * @param measurement Pointer to the measurement. + * @param low_end Low end of the bucket's range. + * @param high_end High end of the bucket's range. + * @param count Count of events in this bucket. + *****************************************************************************/ +void evel_measurement_latency_add(EVENT_MEASUREMENT * const measurement, + const double low_end, + const double high_end, + const int count); + +/**************************************************************************//** + * Create a new vNIC Use to be added to a Measurement event. + * + * @note The mandatory fields on the ::MEASUREMENT_VNIC_USE must be supplied + * to this factory function and are immutable once set. Optional + * fields have explicit setter functions, but again values may only be + * set once so that the ::MEASUREMENT_VNIC_USE has immutable + * properties. + * + * @param vnic_id ASCIIZ string with the vNIC's ID. + * @param packets_in Total packets received. + * @param packets_out Total packets transmitted. + * @param bytes_in Total bytes received. + * @param bytes_out Total bytes transmitted. + * + * @returns pointer to the newly manufactured ::MEASUREMENT_VNIC_USE. + * If the structure is not used it must be released using + * ::evel_free_measurement_vnic_use. + * @retval NULL Failed to create the vNIC Use. + *****************************************************************************/ +MEASUREMENT_VNIC_USE * evel_new_measurement_vnic_use(char * const vnic_id, + const int packets_in, + const int packets_out, + const int bytes_in, + const int bytes_out); + +/**************************************************************************//** + * Free a vNIC Use. + * + * Free off the ::MEASUREMENT_VNIC_USE supplied. Will free all the contained + * allocated memory. + * + * @note It does not free the vNIC Use itself, since that may be part of a + * larger structure. + *****************************************************************************/ +void evel_free_measurement_vnic_use(MEASUREMENT_VNIC_USE * const vnic_use); + +/**************************************************************************//** + * Set the Broadcast Packets Received property of the vNIC Use. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param vnic_use Pointer to the vNIC Use. + * @param broadcast_packets_in + * Broadcast packets received. + *****************************************************************************/ +void evel_vnic_use_bcast_pkt_in_set(MEASUREMENT_VNIC_USE * const vnic_use, + const int broadcast_packets_in); + +/**************************************************************************//** + * Set the Broadcast Packets Transmitted property of the vNIC Use. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param vnic_use Pointer to the vNIC Use. + * @param broadcast_packets_out + * Broadcast packets transmitted. + *****************************************************************************/ +void evel_vnic_use_bcast_pkt_out_set(MEASUREMENT_VNIC_USE * const vnic_use, + const int broadcast_packets_out); + +/**************************************************************************//** + * Set the Multicast Packets Received property of the vNIC Use. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param vnic_use Pointer to the vNIC Use. + * @param multicast_packets_in + * Multicast packets received. + *****************************************************************************/ +void evel_vnic_use_mcast_pkt_in_set(MEASUREMENT_VNIC_USE * const vnic_use, + const int multicast_packets_in); + +/**************************************************************************//** + * Set the Multicast Packets Transmitted property of the vNIC Use. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param vnic_use Pointer to the vNIC Use. + * @param multicast_packets_out + * Multicast packets transmitted. + *****************************************************************************/ +void evel_vnic_use_mcast_pkt_out_set(MEASUREMENT_VNIC_USE * const vnic_use, + const int multicast_packets_out); + +/**************************************************************************//** + * Set the Unicast Packets Received property of the vNIC Use. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param vnic_use Pointer to the vNIC Use. + * @param unicast_packets_in + * Unicast packets received. + *****************************************************************************/ +void evel_vnic_use_ucast_pkt_in_set(MEASUREMENT_VNIC_USE * const vnic_use, + const int unicast_packets_in); + +/**************************************************************************//** + * Set the Unicast Packets Transmitted property of the vNIC Use. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param vnic_use Pointer to the vNIC Use. + * @param unicast_packets_out + * Unicast packets transmitted. + *****************************************************************************/ +void evel_vnic_use_ucast_pkt_out_set(MEASUREMENT_VNIC_USE * const vnic_use, + const int unicast_packets_out); + +/**************************************************************************//** + * Add an additional vNIC Use to the specified Measurement event. + * + * @param measurement Pointer to the measurement. + * @param vnic_use Pointer to the vNIC Use to add. + *****************************************************************************/ +void evel_meas_vnic_use_add(EVENT_MEASUREMENT * const measurement, + MEASUREMENT_VNIC_USE * const vnic_use); + +/**************************************************************************//** + * Add an additional vNIC usage record Measurement. + * + * This function implements the previous API, purely for convenience. + * + * The ID is null delimited ASCII string. The library takes a copy so the + * caller does not have to preserve values after the function returns. + * + * @param measurement Pointer to the measurement. + * @param vnic_id ASCIIZ string with the vNIC's ID. + * @param packets_in Total packets received. + * @param packets_out Total packets transmitted. + * @param broadcast_packets_in Broadcast packets received. + * @param broadcast_packets_out Broadcast packets transmitted. + * @param bytes_in Total bytes received. + * @param bytes_out Total bytes transmitted. + * @param multicast_packets_in Multicast packets received. + * @param multicast_packets_out Multicast packets transmitted. + * @param unicast_packets_in Unicast packets received. + * @param unicast_packets_out Unicast packets transmitted. + *****************************************************************************/ +void evel_measurement_vnic_use_add(EVENT_MEASUREMENT * const measurement, + char * const vnic_id, + const int packets_in, + const int packets_out, + const int broadcast_packets_in, + const int broadcast_packets_out, + const int bytes_in, + const int bytes_out, + const int multicast_packets_in, + const int multicast_packets_out, + const int unicast_packets_in, + const int unicast_packets_out); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* REPORT */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Create a new Report event. + * + * @note The mandatory fields on the Report must be supplied to this + * factory function and are immutable once set. Optional fields have + * explicit setter functions, but again values may only be set once so + * that the Report has immutable properties. + * + * @param measurement_interval + * + * @returns pointer to the newly manufactured ::EVENT_REPORT. If the event is + * not used (i.e. posted) it must be released using + * ::evel_free_report. + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_REPORT * evel_new_report(double measurement_interval); + +/**************************************************************************//** + * Free a Report. + * + * Free off the Report supplied. Will free all the contained allocated memory. + * + * @note It does not free the Report itself, since that may be part of a + * larger structure. + *****************************************************************************/ +void evel_free_report(EVENT_REPORT * event); + +/**************************************************************************//** + * Set the Event Type property of the Report. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param report Pointer to the Report. + * @param type The Event Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_report_type_set(EVENT_REPORT * report, const char * const type); + +/**************************************************************************//** + * Add a Feature usage value name/value pair to the Report. + * + * The name is null delimited ASCII string. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param report Pointer to the report. + * @param feature ASCIIZ string with the feature's name. + * @param utilization Utilization of the feature. + *****************************************************************************/ +void evel_report_feature_use_add(EVENT_REPORT * report, + char * feature, + int utilization); + +/**************************************************************************//** + * Add a Additional Measurement value name/value pair to the Report. + * + * The name is null delimited ASCII string. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param report Pointer to the report. + * @param group ASCIIZ string with the measurement group's name. + * @param name ASCIIZ string containing the measurement's name. + * @param value ASCIIZ string containing the measurement's value. + *****************************************************************************/ +void evel_report_custom_measurement_add(EVENT_REPORT * report, + const char * const group, + const char * const name, + const char * const value); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* MOBILE_FLOW */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Create a new Mobile Flow event. + * + * @note The mandatory fields on the Mobile Flow must be supplied to this + * factory function and are immutable once set. Optional fields have + * explicit setter functions, but again values may only be set once so + * that the Mobile Flow has immutable properties. + * + * @param flow_direction + * @param gtp_per_flow_metrics + * @param ip_protocol_type + * @param ip_version + * @param other_endpoint_ip_address + * @param other_endpoint_port + * @param reporting_endpoint_ip_addr + * @param reporting_endpoint_port + * + * @returns pointer to the newly manufactured ::EVENT_MOBILE_FLOW. If the + * event is not used (i.e. posted) it must be released using + * ::evel_free_mobile_flow. + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_MOBILE_FLOW * evel_new_mobile_flow( + const char * const flow_direction, + MOBILE_GTP_PER_FLOW_METRICS * gtp_per_flow_metrics, + const char * const ip_protocol_type, + const char * const ip_version, + const char * const other_endpoint_ip_address, + int other_endpoint_port, + const char * const reporting_endpoint_ip_addr, + int reporting_endpoint_port); + +/**************************************************************************//** + * Free a Mobile Flow. + * + * Free off the Mobile Flow supplied. Will free all the contained allocated + * memory. + * + * @note It does not free the Mobile Flow itself, since that may be part of a + * larger structure. + *****************************************************************************/ +void evel_free_mobile_flow(EVENT_MOBILE_FLOW * event); + +/**************************************************************************//** + * Set the Event Type property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param type The Event Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_mobile_flow_type_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const type); + +/**************************************************************************//** + * Set the Application Type property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param type The Application Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_mobile_flow_app_type_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const type); + +/**************************************************************************//** + * Set the Application Protocol Type property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param type The Application Protocol Type to be set. ASCIIZ string. + * The caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_mobile_flow_app_prot_type_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const type); + +/**************************************************************************//** + * Set the Application Protocol Version property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param version The Application Protocol Version to be set. ASCIIZ + * string. The caller does not need to preserve the value + * once the function returns. + *****************************************************************************/ +void evel_mobile_flow_app_prot_ver_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const version); + +/**************************************************************************//** + * Set the CID property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param cid The CID to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_cid_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const cid); + +/**************************************************************************//** + * Set the Connection Type property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param type The Connection Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_mobile_flow_con_type_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const type); + +/**************************************************************************//** + * Set the ECGI property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param ecgi The ECGI to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_ecgi_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const ecgi); + +/**************************************************************************//** + * Set the GTP Protocol Type property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param type The GTP Protocol Type to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_mobile_flow_gtp_prot_type_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const type); + +/**************************************************************************//** + * Set the GTP Protocol Version property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param version The GTP Protocol Version to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_mobile_flow_gtp_prot_ver_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const version); + +/**************************************************************************//** + * Set the HTTP Header property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param header The HTTP header to be set. ASCIIZ string. The caller does + * not need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_http_header_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const header); + +/**************************************************************************//** + * Set the IMEI property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param imei The IMEI to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_imei_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const imei); + +/**************************************************************************//** + * Set the IMSI property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param imsi The IMSI to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_imsi_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const imsi); + +/**************************************************************************//** + * Set the LAC property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param lac The LAC to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_lac_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const lac); + +/**************************************************************************//** + * Set the MCC property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param mcc The MCC to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_mcc_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const mcc); + +/**************************************************************************//** + * Set the MNC property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param mnc The MNC to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_mnc_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const mnc); + +/**************************************************************************//** + * Set the MSISDN property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param msisdn The MSISDN to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_msisdn_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const msisdn); + +/**************************************************************************//** + * Set the Other Functional Role property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param role The Other Functional Role to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_mobile_flow_other_func_role_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const role); + +/**************************************************************************//** + * Set the RAC property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param rac The RAC to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_rac_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const rac); + +/**************************************************************************//** + * Set the Radio Access Technology property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param tech The Radio Access Technology to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_mobile_flow_radio_acc_tech_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const tech); + +/**************************************************************************//** + * Set the SAC property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param sac The SAC to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_sac_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const sac); + +/**************************************************************************//** + * Set the Sampling Algorithm property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param algorithm The Sampling Algorithm to be set. + *****************************************************************************/ +void evel_mobile_flow_samp_alg_set(EVENT_MOBILE_FLOW * mobile_flow, + int algorithm); + +/**************************************************************************//** + * Set the TAC property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param tac The TAC to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_tac_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const tac); + +/**************************************************************************//** + * Set the Tunnel ID property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param tunnel_id The Tunnel ID to be set. ASCIIZ string. The caller does + * not need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_tunnel_id_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const tunnel_id); + +/**************************************************************************//** + * Set the VLAN ID property of the Mobile Flow. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param mobile_flow Pointer to the Mobile Flow. + * @param vlan_id The VLAN ID to be set. ASCIIZ string. The caller does + * not need to preserve the value once the function returns. + *****************************************************************************/ +void evel_mobile_flow_vlan_id_set(EVENT_MOBILE_FLOW * mobile_flow, + const char * const vlan_id); + +/**************************************************************************//** + * Create a new Mobile GTP Per Flow Metrics. + * + * @note The mandatory fields on the Mobile GTP Per Flow Metrics must be + * supplied to this factory function and are immutable once set. + * Optional fields have explicit setter functions, but again values + * may only be set once so that the Mobile GTP Per Flow Metrics has + * immutable properties. + * + * @param avg_bit_error_rate + * @param avg_packet_delay_variation + * @param avg_packet_latency + * @param avg_receive_throughput + * @param avg_transmit_throughput + * @param flow_activation_epoch + * @param flow_activation_microsec + * @param flow_deactivation_epoch + * @param flow_deactivation_microsec + * @param flow_deactivation_time + * @param flow_status + * @param max_packet_delay_variation + * @param num_activation_failures + * @param num_bit_errors + * @param num_bytes_received + * @param num_bytes_transmitted + * @param num_dropped_packets + * @param num_l7_bytes_received + * @param num_l7_bytes_transmitted + * @param num_lost_packets + * @param num_out_of_order_packets + * @param num_packet_errors + * @param num_packets_received_excl_retrans + * @param num_packets_received_incl_retrans + * @param num_packets_transmitted_incl_retrans + * @param num_retries + * @param num_timeouts + * @param num_tunneled_l7_bytes_received + * @param round_trip_time + * @param time_to_first_byte + * + * @returns pointer to the newly manufactured ::MOBILE_GTP_PER_FLOW_METRICS. + * If the structure is not used it must be released using + * ::evel_free_mobile_gtp_flow_metrics. + * @retval NULL Failed to create the event. + *****************************************************************************/ +MOBILE_GTP_PER_FLOW_METRICS * evel_new_mobile_gtp_flow_metrics( + double avg_bit_error_rate, + double avg_packet_delay_variation, + int avg_packet_latency, + int avg_receive_throughput, + int avg_transmit_throughput, + int flow_activation_epoch, + int flow_activation_microsec, + int flow_deactivation_epoch, + int flow_deactivation_microsec, + time_t flow_deactivation_time, + const char * const flow_status, + int max_packet_delay_variation, + int num_activation_failures, + int num_bit_errors, + int num_bytes_received, + int num_bytes_transmitted, + int num_dropped_packets, + int num_l7_bytes_received, + int num_l7_bytes_transmitted, + int num_lost_packets, + int num_out_of_order_packets, + int num_packet_errors, + int num_packets_received_excl_retrans, + int num_packets_received_incl_retrans, + int num_packets_transmitted_incl_retrans, + int num_retries, + int num_timeouts, + int num_tunneled_l7_bytes_received, + int round_trip_time, + int time_to_first_byte); + +/**************************************************************************//** + * Free a Mobile GTP Per Flow Metrics. + * + * Free off the Mobile GTP Per Flow Metrics supplied. Will free all the + * contained allocated memory. + * + * @note It does not free the Mobile GTP Per Flow Metrics itself, since that + * may be part of a larger structure. + *****************************************************************************/ +void evel_free_mobile_gtp_flow_metrics(MOBILE_GTP_PER_FLOW_METRICS * metrics); + +/**************************************************************************//** + * Set the Duration of Connection Failed Status property of the Mobile GTP Per + * Flow Metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param duration The Duration of Connection Failed Status to be set. + *****************************************************************************/ +void evel_mobile_gtp_metrics_dur_con_fail_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + int duration); + +/**************************************************************************//** + * Set the Duration of Tunnel Failed Status property of the Mobile GTP Per Flow + * Metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param duration The Duration of Tunnel Failed Status to be set. + *****************************************************************************/ +void evel_mobile_gtp_metrics_dur_tun_fail_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + int duration); + +/**************************************************************************//** + * Set the Activated By property of the Mobile GTP Per Flow metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param act_by The Activated By to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_mobile_gtp_metrics_act_by_set(MOBILE_GTP_PER_FLOW_METRICS * metrics, + const char * const act_by); + +/**************************************************************************//** + * Set the Activation Time property of the Mobile GTP Per Flow metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param act_time The Activation Time to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_mobile_gtp_metrics_act_time_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + time_t act_time); + +/**************************************************************************//** + * Set the Deactivated By property of the Mobile GTP Per Flow metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param deact_by The Deactivated By to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_mobile_gtp_metrics_deact_by_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + const char * const deact_by); + +/**************************************************************************//** + * Set the GTP Connection Status property of the Mobile GTP Per Flow metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param status The GTP Connection Status to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_mobile_gtp_metrics_con_status_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + const char * const status); + +/**************************************************************************//** + * Set the GTP Tunnel Status property of the Mobile GTP Per Flow metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param status The GTP Tunnel Status to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_mobile_gtp_metrics_tun_status_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + const char * const status); + +/**************************************************************************//** + * Set an IP Type-of-Service count property of the Mobile GTP Per Flow metrics. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param index The index of the IP Type-of-Service. + * @param count The count. + *****************************************************************************/ +void evel_mobile_gtp_metrics_iptos_set(MOBILE_GTP_PER_FLOW_METRICS * metrics, + int index, + int count); + +/**************************************************************************//** + * Set the Large Packet Round-Trip Time property of the Mobile GTP Per Flow + * Metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param rtt The Large Packet Round-Trip Time to be set. + *****************************************************************************/ +void evel_mobile_gtp_metrics_large_pkt_rtt_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + int rtt); + +/**************************************************************************//** + * Set the Large Packet Threshold property of the Mobile GTP Per Flow Metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param threshold The Large Packet Threshold to be set. + *****************************************************************************/ +void evel_mobile_gtp_metrics_large_pkt_thresh_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + double threshold); + +/**************************************************************************//** + * Set the Max Receive Bit Rate property of the Mobile GTP Per Flow Metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param rate The Max Receive Bit Rate to be set. + *****************************************************************************/ +void evel_mobile_gtp_metrics_max_rcv_bit_rate_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + int rate); + +/**************************************************************************//** + * Set the Max Transmit Bit Rate property of the Mobile GTP Per Flow Metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param rate The Max Transmit Bit Rate to be set. + *****************************************************************************/ +void evel_mobile_gtp_metrics_max_trx_bit_rate_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + int rate); + +/**************************************************************************//** + * Set the Number of GTP Echo Failures property of the Mobile GTP Per Flow + * Metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param num The Number of GTP Echo Failures to be set. + *****************************************************************************/ +void evel_mobile_gtp_metrics_num_echo_fail_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + int num); + +/**************************************************************************//** + * Set the Number of GTP Tunnel Errors property of the Mobile GTP Per Flow + * Metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param num The Number of GTP Tunnel Errors to be set. + *****************************************************************************/ +void evel_mobile_gtp_metrics_num_tun_fail_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + int num); + +/**************************************************************************//** + * Set the Number of HTTP Errors property of the Mobile GTP Per Flow Metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param num The Number of HTTP Errors to be set. + *****************************************************************************/ +void evel_mobile_gtp_metrics_num_http_errors_set( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + int num); + +/**************************************************************************//** + * Add a TCP flag count to the metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param tcp_flag The TCP flag count to be updated. + * @param count The associated flag count. + *****************************************************************************/ +void evel_mobile_gtp_metrics_tcp_flag_count_add( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + const EVEL_TCP_FLAGS tcp_flag, + const int count); + +/**************************************************************************//** + * Add a QCI COS count to the metrics. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param metrics Pointer to the Mobile GTP Per Flow Metrics. + * @param qci_cos The QCI COS count to be updated. + * @param count The associated QCI COS count. + *****************************************************************************/ +void evel_mobile_gtp_metrics_qci_cos_count_add( + MOBILE_GTP_PER_FLOW_METRICS * metrics, + const EVEL_QCI_COS_TYPES qci_cos, + const int count); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* SERVICE EVENTS */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Create a new Service event. + * + * @note The mandatory fields on the Service must be supplied to + * this factory function and are immutable once set. Optional fields + * have explicit setter functions, but again values may only be set + * once so that the event has immutable properties. + * @param vendor_id The vendor id to encode in the event instance id. + * @param event_id The vendor event id to encode in the event instance id. + * @returns pointer to the newly manufactured ::EVENT_SERVICE. If the event + * is not used (i.e. posted) it must be released using + * ::evel_free_service. + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_SERVICE * evel_new_service(const char * const vendor_id, + const char * const event_id); + +/**************************************************************************//** + * Free a Service Events event. + * + * Free off the event supplied. Will free all the contained allocated memory. + * + * @note It does not free the event itself, since that may be part of a larger + * structure. + *****************************************************************************/ +void evel_free_service(EVENT_SERVICE * const event); + +/**************************************************************************//** + * Set the Event Type property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param type The Event Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_service_type_set(EVENT_SERVICE * const event, + const char * const type); + +/**************************************************************************//** + * Set the Product Id property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param product_id The vendor product id to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_service_product_id_set(EVENT_SERVICE * const event, + const char * const product_id); + +/**************************************************************************//** + * Set the Subsystem Id property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param subsystem_id The vendor subsystem id to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_service_subsystem_id_set(EVENT_SERVICE * const event, + const char * const subsystem_id); + +/**************************************************************************//** + * Set the Friendly Name property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param friendly_name The vendor friendly name to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_service_friendly_name_set(EVENT_SERVICE * const event, + const char * const friendly_name); + +/**************************************************************************//** + * Set the correlator property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param correlator The correlator to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_service_correlator_set(EVENT_SERVICE * const event, + const char * const correlator); + +/**************************************************************************//** + * Set the Codec property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param codec The codec to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_service_codec_set(EVENT_SERVICE * const event, + const char * const codec); + +/**************************************************************************//** + * Set the Callee Side Codec property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param codec The codec to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_service_callee_codec_set(EVENT_SERVICE * const event, + const char * const codec); + +/**************************************************************************//** + * Set the Caller Side Codec property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param codec The codec to be set. ASCIIZ string. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_service_caller_codec_set(EVENT_SERVICE * const event, + const char * const codec); + +/**************************************************************************//** + * Set the RTCP Data property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtcp_data The RTCP Data to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_service_rtcp_data_set(EVENT_SERVICE * const event, + const char * const rtcp_data); + +/**************************************************************************//** + * Set the Adjacency Name property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param adjacency_name + * The adjacency name to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_service_adjacency_name_set(EVENT_SERVICE * const event, + const char * const adjacency_name); + +/**************************************************************************//** + * Set the Endpoint Descriptor property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param endpoint_desc The endpoint descriptor to be set. + *****************************************************************************/ +void evel_service_endpoint_desc_set( + EVENT_SERVICE * const event, + const EVEL_SERVICE_ENDPOINT_DESC endpoint_desc); + +/**************************************************************************//** + * Set the Endpoint Jitter property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param jitter The jitter to be set. + *****************************************************************************/ +void evel_service_endpoint_jitter_set(EVENT_SERVICE * const event, + const int jitter); + +/**************************************************************************//** + * Set the Endpoint Rtp Octets Discarded property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_oct_disc The discard count. + *****************************************************************************/ +void evel_service_endpoint_rtp_oct_disc_set(EVENT_SERVICE * const event, + const int rtp_oct_disc); + +/**************************************************************************//** + * Set the Endpoint Rtp Octets Received property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_oct_recv The receive count. + *****************************************************************************/ +void evel_service_endpoint_rtp_oct_recv_set(EVENT_SERVICE * const event, + const int rtp_oct_recv); + +/**************************************************************************//** + * Set the Endpoint Rtp Octets Sent property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_oct_sent The send count. + *****************************************************************************/ +void evel_service_endpoint_rtp_oct_sent_set(EVENT_SERVICE * const event, + const int rtp_oct_sent); + +/**************************************************************************//** + * Set the Endpoint Rtp Packets Discarded property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_pkt_disc The discard count. + *****************************************************************************/ +void evel_service_endpoint_rtp_pkt_disc_set(EVENT_SERVICE * const event, + const int rtp_pkt_disc); + +/**************************************************************************//** + * Set the Endpoint Rtp Packets Received property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_pkt_recv The receive count. + *****************************************************************************/ +void evel_service_endpoint_rtp_pkt_recv_set(EVENT_SERVICE * const event, + const int rtp_pkt_recv); + +/**************************************************************************//** + * Set the Endpoint Rtp Packets Sent property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_pkt_sent The send count. + *****************************************************************************/ +void evel_service_endpoint_rtp_pkt_sent_set(EVENT_SERVICE * const event, + const int rtp_pkt_sent); + +/**************************************************************************//** + * Set the Local Jitter property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param jitter The jitter to be set. + *****************************************************************************/ +void evel_service_local_jitter_set(EVENT_SERVICE * const event, + const int jitter); + +/**************************************************************************//** + * Set the Local Rtp Octets Discarded property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_oct_disc The discard count. + *****************************************************************************/ +void evel_service_local_rtp_oct_disc_set(EVENT_SERVICE * const event, + const int rtp_oct_disc); + +/**************************************************************************//** + * Set the Local Rtp Octets Received property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_oct_recv The receive count. + *****************************************************************************/ +void evel_service_local_rtp_oct_recv_set(EVENT_SERVICE * const event, + const int rtp_oct_recv); + +/**************************************************************************//** + * Set the Local Rtp Octets Sent property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_oct_sent The send count. + *****************************************************************************/ +void evel_service_local_rtp_oct_sent_set(EVENT_SERVICE * const event, + const int rtp_oct_sent); + +/**************************************************************************//** + * Set the Local Rtp Packets Discarded property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_pkt_disc The discard count. + *****************************************************************************/ +void evel_service_local_rtp_pkt_disc_set(EVENT_SERVICE * const event, + const int rtp_pkt_disc); + +/**************************************************************************//** + * Set the Local Rtp Packets Received property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_pkt_recv The receive count. + *****************************************************************************/ +void evel_service_local_rtp_pkt_recv_set(EVENT_SERVICE * const event, + const int rtp_pkt_recv); + +/**************************************************************************//** + * Set the Local Rtp Packets Sent property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param rtp_pkt_sent The send count. + *****************************************************************************/ +void evel_service_local_rtp_pkt_sent_set(EVENT_SERVICE * const event, + const int rtp_pkt_sent); + +/**************************************************************************//** + * Set the Mos Cqe property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param mos_cqe The mosCqe to be set. + *****************************************************************************/ +void evel_service_mos_cqe_set(EVENT_SERVICE * const event, + const double mos_cqe); + +/**************************************************************************//** + * Set the Packets Lost property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param packets_lost The number of packets lost to be set. + *****************************************************************************/ +void evel_service_packets_lost_set(EVENT_SERVICE * const event, + const int packets_lost); + +/**************************************************************************//** + * Set the packet Loss Percent property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param packet_loss_percent + * The packet loss in percent. + *****************************************************************************/ +void evel_service_packet_loss_percent_set(EVENT_SERVICE * const event, + const double packet_loss_percent); + +/**************************************************************************//** + * Set the R Factor property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param r_factor The R Factor to be set. + *****************************************************************************/ +void evel_service_r_factor_set(EVENT_SERVICE * const event, + const int r_factor); + +/**************************************************************************//** + * Set the Round Trip Delay property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param round_trip_delay + * The Round trip delay to be set. + *****************************************************************************/ +void evel_service_round_trip_delay_set(EVENT_SERVICE * const event, + const int round_trip_delay); + +/**************************************************************************//** + * Set the Phone Number property of the Service event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Service event. + * @param phone_number The Phone Number to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_service_phone_number_set(EVENT_SERVICE * const event, + const char * const phone_number); + +/**************************************************************************//** + * Add a name/value pair to the Service, under the additionalFields array. + * + * The name and value are null delimited ASCII strings. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param event Pointer to the Service event. + * @param name ASCIIZ string with the field's name. The caller does not + * need to preserve the value once the function returns. + * @param value ASCIIZ string with the field's value. The caller does not + * need to preserve the value once the function returns. + *****************************************************************************/ +void evel_service_addl_field_add(EVENT_SERVICE * const event, + const char * const name, + const char * const value); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* SIGNALING */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Create a new Signaling event. + * + * @note The mandatory fields on the Signaling must be supplied to + * this factory function and are immutable once set. Optional fields + * have explicit setter functions, but again values may only be set + * once so that the event has immutable properties. + * @param vendor_id The vendor id to encode in the event instance id. + * @param event_id The vendor event id to encode in the event instance id. + * @returns pointer to the newly manufactured ::EVENT_SIGNALING. If the event + * is not used (i.e. posted) it must be released using + * ::evel_free_signaling. + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_SIGNALING * evel_new_signaling(const char * const vendor_id, + const char * const event_id); + +/**************************************************************************//** + * Free a Signaling event. + * + * Free off the event supplied. Will free all the contained allocated memory. + * + * @note It does not free the event itself, since that may be part of a larger + * structure. + *****************************************************************************/ +void evel_free_signaling(EVENT_SIGNALING * const event); + +/**************************************************************************//** + * Set the Event Type property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param type The Event Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_signaling_type_set(EVENT_SIGNALING * const event, + const char * const type); + +/**************************************************************************//** + * Set the Product Id property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param product_id The vendor product id to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_signaling_product_id_set(EVENT_SIGNALING * const event, + const char * const product_id); + +/**************************************************************************//** + * Set the Subsystem Id property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param subsystem_id The vendor subsystem id to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_signaling_subsystem_id_set(EVENT_SIGNALING * const event, + const char * const subsystem_id); + +/**************************************************************************//** + * Set the Friendly Name property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param friendly_name The vendor friendly name to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_signaling_friendly_name_set(EVENT_SIGNALING * const event, + const char * const friendly_name); + +/**************************************************************************//** + * Set the Correlator property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param correlator The correlator to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_signaling_correlator_set(EVENT_SIGNALING * const event, + const char * const correlator); + +/**************************************************************************//** + * Set the Local Ip Address property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param local_ip_address + * The Local Ip Address to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_signaling_local_ip_address_set(EVENT_SIGNALING * const event, + const char * const local_ip_address); + +/**************************************************************************//** + * Set the Local Port property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param local_port The Local Port to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_signaling_local_port_set(EVENT_SIGNALING * const event, + const char * const local_port); + +/**************************************************************************//** + * Set the Remote Ip Address property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param remote_ip_address + * The Remote Ip Address to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_signaling_remote_ip_address_set(EVENT_SIGNALING * const event, + const char * const remote_ip_address); + +/**************************************************************************//** + * Set the Remote Port property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param remote_port The Remote Port to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_signaling_remote_port_set(EVENT_SIGNALING * const event, + const char * const remote_port); + +/**************************************************************************//** + * Set the Compressed SIP property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param compressed_sip + * The Compressed SIP to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_signaling_compressed_sip_set(EVENT_SIGNALING * const event, + const char * const compressed_sip); + +/**************************************************************************//** + * Set the Summary SIP property of the Signaling event. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param event Pointer to the Signaling event. + * @param summary_sip The Summary SIP to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_signaling_summary_sip_set(EVENT_SIGNALING * const event, + const char * const summary_sip); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* STATE CHANGE */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Create a new State Change event. + * + * @note The mandatory fields on the Syslog must be supplied to this factory + * function and are immutable once set. Optional fields have explicit + * setter functions, but again values may only be set once so that the + * Syslog has immutable properties. + * + * @param new_state The new state of the reporting entity. + * @param old_state The old state of the reporting entity. + * @param interface The card or port name of the reporting entity. + * + * @returns pointer to the newly manufactured ::EVENT_STATE_CHANGE. If the + * event is not used it must be released using + * ::evel_free_state_change + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_STATE_CHANGE * evel_new_state_change(const EVEL_ENTITY_STATE new_state, + const EVEL_ENTITY_STATE old_state, + const char * const interface); + +/**************************************************************************//** + * Free a State Change. + * + * Free off the State Change supplied. Will free all the contained allocated + * memory. + * + * @note It does not free the State Change itself, since that may be part of a + * larger structure. + *****************************************************************************/ +void evel_free_state_change(EVENT_STATE_CHANGE * const state_change); + +/**************************************************************************//** + * Set the Event Type property of the State Change. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param state_change Pointer to the ::EVENT_STATE_CHANGE. + * @param type The Event Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_state_change_type_set(EVENT_STATE_CHANGE * const state_change, + const char * const type); + +/**************************************************************************//** + * Add an additional field name/value pair to the State Change. + * + * The name and value are null delimited ASCII strings. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param state_change Pointer to the ::EVENT_STATE_CHANGE. + * @param name ASCIIZ string with the attribute's name. The caller + * does not need to preserve the value once the function + * returns. + * @param value ASCIIZ string with the attribute's value. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_state_change_addl_field_add(EVENT_STATE_CHANGE * const state_change, + const char * const name, + const char * const value); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* SYSLOG */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Create a new syslog event. + * + * @note The mandatory fields on the Syslog must be supplied to this factory + * function and are immutable once set. Optional fields have explicit + * setter functions, but again values may only be set once so that the + * Syslog has immutable properties. + * + * @param event_source_type + * @param syslog_msg + * @param syslog_tag + * + * @returns pointer to the newly manufactured ::EVENT_SYSLOG. If the event is + * not used it must be released using ::evel_free_syslog + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_SYSLOG * evel_new_syslog(EVEL_SOURCE_TYPES event_source_type, + const char * const syslog_msg, + const char * const syslog_tag); + +/**************************************************************************//** + * Set the Event Type property of the Syslog. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param syslog Pointer to the syslog. + * @param type The Event Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_syslog_type_set(EVENT_SYSLOG * syslog, + const char * const type); + +/**************************************************************************//** + * Free a Syslog. + * + * Free off the Syslog supplied. Will free all the contained allocated memory. + * + * @note It does not free the Syslog itself, since that may be part of a + * larger structure. + *****************************************************************************/ +void evel_free_syslog(EVENT_SYSLOG * event); + +/**************************************************************************//** + * Add an additional field name/value pair to the Syslog. + * + * The name and value are null delimited ASCII strings. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param syslog Pointer to the syslog. + * @param name ASCIIZ string with the attribute's name. The caller + * does not need to preserve the value once the function + * returns. + * @param value ASCIIZ string with the attribute's value. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_syslog_addl_field_add(EVENT_SYSLOG * syslog, + char * name, + char * value); + +/**************************************************************************//** + * Set the Event Source Host property of the Syslog. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param syslog Pointer to the Syslog. + * @param host The Event Source Host to be set. ASCIIZ string. The + * caller does not need to preserve the value once the + * function returns. + *****************************************************************************/ +void evel_syslog_event_source_host_set(EVENT_SYSLOG * syslog, + const char * const host); + +/**************************************************************************//** + * Set the Syslog Facility property of the Syslog. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param syslog Pointer to the Syslog. + * @param facility The Syslog Facility to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_syslog_facility_set(EVENT_SYSLOG * syslog, + EVEL_SYSLOG_FACILITIES facility); + +/**************************************************************************//** + * Set the Process property of the Syslog. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param syslog Pointer to the Syslog. + * @param proc The Process to be set. ASCIIZ string. The caller does + * not need to preserve the value once the function returns. + *****************************************************************************/ +void evel_syslog_proc_set(EVENT_SYSLOG * syslog, const char * const proc); + +/**************************************************************************//** + * Set the Process ID property of the Syslog. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param syslog Pointer to the Syslog. + * @param proc_id The Process ID to be set. + *****************************************************************************/ +void evel_syslog_proc_id_set(EVENT_SYSLOG * syslog, int proc_id); + +/**************************************************************************//** + * Set the Version property of the Syslog. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param syslog Pointer to the Syslog. + * @param version The Version to be set. + *****************************************************************************/ +void evel_syslog_version_set(EVENT_SYSLOG * syslog, int version); + +/**************************************************************************//** + * Set the Structured Data property of the Syslog. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param syslog Pointer to the Syslog. + * @param s_data The Structured Data to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_syslog_s_data_set(EVENT_SYSLOG * syslog, const char * const s_data); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* OTHER */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Create a new other event. + * + * + * @returns pointer to the newly manufactured ::EVENT_OTHER. If the event is + * not used it must be released using ::evel_free_other. + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_OTHER * evel_new_other(void); + +/**************************************************************************//** + * Free an Other. + * + * Free off the Other supplied. Will free all the contained allocated memory. + * + * @note It does not free the Other itself, since that may be part of a + * larger structure. + *****************************************************************************/ +void evel_free_other(EVENT_OTHER * event); + +/**************************************************************************//** + * Set the Event Type property of the Other. + * + * @note The property is treated as immutable: it is only valid to call + * the setter once. However, we don't assert if the caller tries to + * overwrite, just ignoring the update instead. + * + * @param other Pointer to the Other. + * @param type The Event Type to be set. ASCIIZ string. The caller + * does not need to preserve the value once the function + * returns. + *****************************************************************************/ +void evel_other_type_set(EVENT_OTHER * other, + const char * const type); + +/**************************************************************************//** + * Add a value name/value pair to the Other. + * + * The name and value are null delimited ASCII strings. The library takes + * a copy so the caller does not have to preserve values after the function + * returns. + * + * @param other Pointer to the Other. + * @param name ASCIIZ string with the attribute's name. + * @param value ASCIIZ string with the attribute's value. + *****************************************************************************/ +void evel_other_field_add(EVENT_OTHER * other, + char * name, + char * value); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* THROTTLING */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/**************************************************************************//** + * Return the current measurement interval provided by the Event Listener. + * + * @returns The current measurement interval + * @retval EVEL_MEASUREMENT_INTERVAL_UKNOWN (0) - interval has not been + * specified + *****************************************************************************/ +int evel_get_measurement_interval(); + +/*****************************************************************************/ +/*****************************************************************************/ +/* */ +/* LOGGING */ +/* */ +/*****************************************************************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/* Debug macros. */ +/*****************************************************************************/ +#define EVEL_DEBUG(FMT, ...) log_debug(EVEL_LOG_DEBUG, (FMT), ##__VA_ARGS__) +#define EVEL_INFO(FMT, ...) log_debug(EVEL_LOG_INFO, (FMT), ##__VA_ARGS__) +#define EVEL_SPAMMY(FMT, ...) log_debug(EVEL_LOG_SPAMMY, (FMT), ##__VA_ARGS__) +#define EVEL_ERROR(FMT, ...) log_debug(EVEL_LOG_ERROR, "ERROR: " FMT, \ + ##__VA_ARGS__) +#define EVEL_ENTER() \ + { \ + log_debug(EVEL_LOG_DEBUG, "Enter %s {", __FUNCTION__); \ + debug_indent += 2; \ + } +#define EVEL_EXIT() \ + { \ + debug_indent -= 2; \ + log_debug(EVEL_LOG_DEBUG, "Exit %s }", __FUNCTION__); \ + } + +#define INDENT_SEPARATORS \ + "| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | " + +extern EVEL_LOG_LEVELS debug_level; +extern int debug_indent; +extern FILE * fout; + +#define EVEL_DEBUG_ON() ((debug_level) >= EVEL_LOG_DEBUG) + +/**************************************************************************//** + * Initialize logging + * + * @param[in] level The debugging level - one of ::EVEL_LOG_LEVELS. + * @param[in] ident The identifier for our logs. + *****************************************************************************/ +void log_initialize(EVEL_LOG_LEVELS level, const char * ident); + +/**************************************************************************//** + * Log debug information + * + * Logs debugging information in a platform independent manner. + * + * @param[in] level The debugging level - one of ::EVEL_LOG_LEVELS. + * @param[in] format Log formatting string in printf format. + * @param[in] ... Variable argument list. + *****************************************************************************/ +void log_debug(EVEL_LOG_LEVELS level, char * format, ...); + +/***************************************************************************//* + * Store the formatted string into the static error string and log the error. + * + * @param format Error string in standard printf format. + * @param ... Variable parameters to be substituted into the format string. + *****************************************************************************/ +void log_error_state(char * format, ...); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/plugins/ves/include/evel_internal.h b/src/plugins/ves/include/evel_internal.h new file mode 100644 index 00000000..4608f751 --- /dev/null +++ b/src/plugins/ves/include/evel_internal.h @@ -0,0 +1,852 @@ +#ifndef EVEL_INTERNAL_INCLUDED +#define EVEL_INTERNAL_INCLUDED + +/**************************************************************************//** + * @file + * EVEL internal definitions. + * + * These are internal definitions which need to be shared between modules + * within the library but are not intended for external consumption. + * + * License + * ------- + * + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +#include "evel.h" + +/*****************************************************************************/ +/* Define some type-safe min/max macros. */ +/*****************************************************************************/ +#define max(a,b) \ + ({ __typeof__ (a) _a = (a); \ + __typeof__ (b) _b = (b); \ + _a > _b ? _a : _b; }) + +#define min(a,b) \ + ({ __typeof__ (a) _a = (a); \ + __typeof__ (b) _b = (b); \ + _a < _b ? _a : _b; }) + + +/**************************************************************************//** + * Compile-time assertion. + *****************************************************************************/ +#define EVEL_CT_ASSERT(X) switch (0) {case 0: case (X):;} + +/**************************************************************************//** + * The Functional Role of the equipment represented by this VNF. + *****************************************************************************/ +extern char * functional_role; + +/**************************************************************************//** + * The type of equipment represented by this VNF. + *****************************************************************************/ +extern EVEL_SOURCE_TYPES event_source_type; + +/**************************************************************************//** + * A chunk of memory used in the cURL functions. + *****************************************************************************/ +typedef struct memory_chunk { + char * memory; + size_t size; +} MEMORY_CHUNK; + +/**************************************************************************//** + * Global commands that may be sent to the Event Handler thread. + *****************************************************************************/ +typedef enum { + EVT_CMD_TERMINATE, + EVT_CMD_MAX_COMMANDS +} EVT_HANDLER_COMMAND; + +/**************************************************************************//** + * State of the Event Handler thread. + *****************************************************************************/ +typedef enum { + EVT_HANDLER_UNINITIALIZED, /** The library cannot handle events. */ + EVT_HANDLER_INACTIVE, /** The event handler thread not started. */ + EVT_HANDLER_ACTIVE, /** The event handler thread is started. */ + EVT_HANDLER_REQUEST_TERMINATE, /** Initial stages of shutdown. */ + EVT_HANDLER_TERMINATING, /** The ring-buffer is being depleted. */ + EVT_HANDLER_TERMINATED, /** The library is exited. */ + EVT_HANDLER_MAX_STATES /** Maximum number of valid states. */ +} EVT_HANDLER_STATE; + +/**************************************************************************//** + * Internal event. + * Pseudo-event used for routing internal commands. + *****************************************************************************/ +typedef struct event_internal { + EVENT_HEADER header; + EVT_HANDLER_COMMAND command; +} EVENT_INTERNAL; + +/**************************************************************************//** + * Suppressed NV pairs list entry. + * JSON equivalent field: suppressedNvPairs + *****************************************************************************/ +typedef struct evel_suppressed_nv_pairs { + + /***************************************************************************/ + /* Mandatory fields */ + /* JSON equivalent field: nvPairFieldName */ + /***************************************************************************/ + char * nv_pair_field_name; + + /***************************************************************************/ + /* Optional fields */ + /* JSON equivalent field: suppressedNvPairNames */ + /* Type of each list entry: char * */ + /***************************************************************************/ + DLIST suppressed_nv_pair_names; + + /***************************************************************************/ + /* Hash table containing suppressed_nv_pair_names as keys. */ + /***************************************************************************/ + struct hsearch_data * hash_nv_pair_names; + +} EVEL_SUPPRESSED_NV_PAIRS; + +/**************************************************************************//** + * Event Throttling Specification for a domain which is in a throttled state. + * JSON equivalent object: eventThrottlingState + *****************************************************************************/ +typedef struct evel_throttle_spec { + + /***************************************************************************/ + /* List of field names to be suppressed. */ + /* JSON equivalent field: suppressedFieldNames */ + /* Type of each list entry: char * */ + /***************************************************************************/ + DLIST suppressed_field_names; + + /***************************************************************************/ + /* List of name-value pairs to be suppressed. */ + /* JSON equivalent field: suppressedNvPairsList */ + /* Type of each list entry: EVEL_SUPPRESSED_NV_PAIRS * */ + /***************************************************************************/ + DLIST suppressed_nv_pairs_list; + + /***************************************************************************/ + /* Hash table containing suppressed_nv_pair_names as keys. */ + /***************************************************************************/ + struct hsearch_data * hash_field_names; + + /***************************************************************************/ + /* Hash table containing nv_pair_field_name as keys, and */ + /* suppressed_nv_pairs_list as values. */ + /***************************************************************************/ + struct hsearch_data * hash_nv_pairs_list; + +} EVEL_THROTTLE_SPEC; + +/*****************************************************************************/ +/* RFC2822 format string for strftime. */ +/*****************************************************************************/ +#define EVEL_RFC2822_STRFTIME_FORMAT "%a, %d %b %Y %T %z" + +/*****************************************************************************/ +/* EVEL_JSON_BUFFER depth at which we throttle fields. */ +/*****************************************************************************/ +#define EVEL_THROTTLE_FIELD_DEPTH 3 + +/**************************************************************************//** + * Initialize the event handler. + * + * Primarily responsible for getting cURL ready for use. + * + * @param[in] event_api_url + * The URL where the Vendor Event Listener API is expected + * to be. + * @param[in] throt_api_url + * The URL where the Throttling API is expected to be. + * @param[in] username The username for the Basic Authentication of requests. + * @param[in] password The password for the Basic Authentication of requests. + * @param verbosity 0 for normal operation, positive values for chattier + * logs. + *****************************************************************************/ +EVEL_ERR_CODES event_handler_initialize(const char * const event_api_url, + const char * const throt_api_url, + const char * const username, + const char * const password, + int verbosity); + +/**************************************************************************//** + * Terminate the event handler. + * + * Shuts down the event handler thread in as clean a way as possible. Sets the + * global exit flag and then signals the thread to interrupt it since it's + * most likely waiting on the ring-buffer. + * + * Having achieved an orderly shutdown of the event handler thread, clean up + * the cURL library's resources cleanly. + * + * @return Status code. + * @retval ::EVEL_SUCCESS if everything OK. + * @retval One of ::EVEL_ERR_CODES if there was a problem. + *****************************************************************************/ +EVEL_ERR_CODES event_handler_terminate(); + +/**************************************************************************//** + * Run the event handler. + * + * Spawns the thread responsible for handling events and sending them to the + * API. + * + * @return Status code. + * @retval ::EVEL_SUCCESS if everything OK. + * @retval One of ::EVEL_ERR_CODES if there was a problem. + *****************************************************************************/ +EVEL_ERR_CODES event_handler_run(); + +/**************************************************************************//** + * Create a new internal event. + * + * @note The mandatory fields on the Fault must be supplied to this factory + * function and are immutable once set. Optional fields have explicit + * setter functions, but again values may only be set once so that the + * Fault has immutable properties. + * @param command The condition indicated by the event. + * @returns pointer to the newly manufactured ::EVENT_INTERNAL. If the event + * is not used (i.e. posted) it must be released using + * ::evel_free_event. + * @retval NULL Failed to create the event. + *****************************************************************************/ +EVENT_INTERNAL * evel_new_internal_event(EVT_HANDLER_COMMAND command); + +/**************************************************************************//** + * Free an internal event. + * + * Free off the event supplied. Will free all the contained* allocated memory. + * + * @note It does not free the internal event itself, since that may be part of + * a larger structure. + *****************************************************************************/ +void evel_free_internal_event(EVENT_INTERNAL * event); + +/**************************************************************************//** + * Initialize an event instance id, typically embedded in an event. + * + * @param instance_id Pointer to the event instance id being initialized. + * @param vendor_id The vendor id to encode in the event instance id. + * @param event_id The event id to encode in the event instance id. + *****************************************************************************/ +void evel_init_event_instance_id(EVEL_EVENT_INSTANCE_ID * const instance_id, + const char * const vendor_id, + const char * const event_id); + +/**************************************************************************//** + * Free an event instance id. + * + * @param instance_id Pointer to the event instance id being initialized. + *****************************************************************************/ +void evel_free_event_instance_id(EVEL_EVENT_INSTANCE_ID * const instance_id); + +/*****************************************************************************/ +/* Structure to hold JSON buffer and associated tracking, as it is written. */ +/*****************************************************************************/ +typedef struct evel_json_buffer +{ + char * json; + int offset; + int max_size; + + /***************************************************************************/ + /* The working throttle specification, which can be NULL. */ + /***************************************************************************/ + EVEL_THROTTLE_SPEC * throttle_spec; + + /***************************************************************************/ + /* Current object/list nesting depth. */ + /***************************************************************************/ + int depth; + + /***************************************************************************/ + /* The checkpoint. */ + /***************************************************************************/ + int checkpoint; + +} EVEL_JSON_BUFFER; + +/**************************************************************************//** + * Encode the event as a JSON event object according to AT&T's schema. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param event Pointer to the ::EVENT_HEADER to encode. + *****************************************************************************/ +void evel_json_encode_header(EVEL_JSON_BUFFER * jbuf, + EVENT_HEADER * event); + +/**************************************************************************//** + * Encode the instance id as a JSON object according to AT&T's schema. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param instance_id Pointer to the ::EVEL_EVENT_INSTANCE_ID to encode. + *****************************************************************************/ +void evel_json_encode_instance_id(EVEL_JSON_BUFFER * jbuf, + EVEL_EVENT_INSTANCE_ID * instance_id); + +/**************************************************************************//** + * Encode the fault in JSON according to AT&T's schema for the fault type. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param event Pointer to the ::EVENT_HEADER to encode. + *****************************************************************************/ +void evel_json_encode_fault(EVEL_JSON_BUFFER * jbuf, + EVENT_FAULT * event); + +/**************************************************************************//** + * Encode the measurement as a JSON measurement. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param event Pointer to the ::EVENT_HEADER to encode. + *****************************************************************************/ +void evel_json_encode_measurement(EVEL_JSON_BUFFER * jbuf, + EVENT_MEASUREMENT * event); + +/**************************************************************************//** + * Encode the Mobile Flow in JSON according to AT&T's schema for the event + * type. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param event Pointer to the ::EVENT_HEADER to encode. + *****************************************************************************/ +void evel_json_encode_mobile_flow(EVEL_JSON_BUFFER * jbuf, + EVENT_MOBILE_FLOW * event); + +/**************************************************************************//** + * Encode the report as a JSON report. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param event Pointer to the ::EVENT_HEADER to encode. + *****************************************************************************/ +void evel_json_encode_report(EVEL_JSON_BUFFER * jbuf, + EVENT_REPORT * event); + +/**************************************************************************//** + * Encode the Service Event in JSON according to AT&T's schema for the event + * type. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param event Pointer to the ::EVENT_HEADER to encode. + *****************************************************************************/ +void evel_json_encode_service(EVEL_JSON_BUFFER * const jbuf, + EVENT_SERVICE * const event); + +/**************************************************************************//** + * Encode the Signaling in JSON according to AT&T's schema for the event type. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param event Pointer to the ::EVENT_HEADER to encode. + *****************************************************************************/ +void evel_json_encode_signaling(EVEL_JSON_BUFFER * const jbuf, + EVENT_SIGNALING * const event); + +/**************************************************************************//** + * Encode the state change as a JSON state change. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param state_change Pointer to the ::EVENT_STATE_CHANGE to encode. + *****************************************************************************/ +void evel_json_encode_state_change(EVEL_JSON_BUFFER * jbuf, + EVENT_STATE_CHANGE * state_change); + +/**************************************************************************//** + * Encode the Syslog in JSON according to AT&T's schema for the event type. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param event Pointer to the ::EVENT_HEADER to encode. + *****************************************************************************/ +void evel_json_encode_syslog(EVEL_JSON_BUFFER * jbuf, + EVENT_SYSLOG * event); + +/**************************************************************************//** + * Encode the Other in JSON according to AT&T's schema for the event type. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. + * @param event Pointer to the ::EVENT_HEADER to encode. + *****************************************************************************/ +void evel_json_encode_other(EVEL_JSON_BUFFER * jbuf, + EVENT_OTHER * event); + +/**************************************************************************//** + * Set the next event_sequence to use. + * + * @param sequence The next sequence number to use. + *****************************************************************************/ +void evel_set_next_event_sequence(const int sequence); + +/**************************************************************************//** + * Handle a JSON response from the listener, contained in a ::MEMORY_CHUNK. + * + * Tokenize the response, and decode any tokens found. + * + * @param chunk The memory chunk containing the response. + * @param post The memory chunk in which to place any resulting POST. + *****************************************************************************/ +void evel_handle_event_response(const MEMORY_CHUNK * const chunk, + MEMORY_CHUNK * const post); + +/**************************************************************************//** + * Initialize a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to initialise. + * @param json Pointer to the underlying working buffer to use. + * @param max_size Size of storage available in the JSON buffer. + * @param throttle_spec Pointer to throttle specification. Can be NULL. + *****************************************************************************/ +void evel_json_buffer_init(EVEL_JSON_BUFFER * jbuf, + char * const json, + const int max_size, + EVEL_THROTTLE_SPEC * throttle_spec); + +/**************************************************************************//** + * Encode a string key and string value to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param option Pointer to holder of the corresponding value to encode. + * @return true if the key, value was added, false if it was suppressed. + *****************************************************************************/ +bool evel_enc_kv_opt_string(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const EVEL_OPTION_STRING * const option); + +/**************************************************************************//** + * Encode a string key and string value to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param value Pointer to the corresponding value to encode. + *****************************************************************************/ +void evel_enc_kv_string(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const char * const value); + +/**************************************************************************//** + * Encode a string key and integer value to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param option Pointer to holder of the corresponding value to encode. + * @return true if the key, value was added, false if it was suppressed. + *****************************************************************************/ +bool evel_enc_kv_opt_int(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const EVEL_OPTION_INT * const option); + +/**************************************************************************//** + * Encode a string key and integer value to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param value The corresponding value to encode. + *****************************************************************************/ +void evel_enc_kv_int(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const int value); + +/**************************************************************************//** + * Encode a string key and double value to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param option Pointer to holder of the corresponding value to encode. + * @return true if the key, value was added, false if it was suppressed. + *****************************************************************************/ +bool evel_enc_kv_opt_double(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const EVEL_OPTION_DOUBLE * const option); + +/**************************************************************************//** + * Encode a string key and double value to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param value The corresponding value to encode. + *****************************************************************************/ +void evel_enc_kv_double(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const double value); + +/**************************************************************************//** + * Encode a string key and unsigned long long value to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param option Pointer to holder of the corresponding value to encode. + * @return true if the key, value was added, false if it was suppressed. + *****************************************************************************/ +bool evel_enc_kv_opt_ull(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const EVEL_OPTION_ULL * const option); + +/**************************************************************************//** + * Encode a string key and unsigned long long value to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param value The corresponding value to encode. + *****************************************************************************/ +void evel_enc_kv_ull(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const unsigned long long value); + +/**************************************************************************//** + * Encode a string key and time value to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param option Pointer to holder of the corresponding value to encode. + * @return true if the key, value was added, false if it was suppressed. + *****************************************************************************/ +bool evel_enc_kv_opt_time(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const EVEL_OPTION_TIME * const option); + +/**************************************************************************//** + * Encode a string key and time value to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param time Pointer to the time to encode. + *****************************************************************************/ +void evel_enc_kv_time(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const time_t * time); + +/**************************************************************************//** + * Encode a key and version. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @param major_version The major version to encode. + * @param minor_version The minor version to encode. + *****************************************************************************/ +void evel_enc_version(EVEL_JSON_BUFFER * jbuf, + const char * const key, + const int major_version, + const int minor_version); + +/**************************************************************************//** + * Add the key and opening bracket of an optional named list to a JSON buffer. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @return true if the list was opened, false if it was suppressed. + *****************************************************************************/ +bool evel_json_open_opt_named_list(EVEL_JSON_BUFFER * jbuf, + const char * const key); + +/**************************************************************************//** + * Add the key and opening bracket of a named list to a JSON buffer. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + *****************************************************************************/ +void evel_json_open_named_list(EVEL_JSON_BUFFER * jbuf, + const char * const key); + +/**************************************************************************//** + * Add the closing bracket of a list to a JSON buffer. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + *****************************************************************************/ +void evel_json_close_list(EVEL_JSON_BUFFER * jbuf); + +/**************************************************************************//** + * Encode a list item with format and param list to a ::EVEL_JSON_BUFFER. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param format Format string in standard printf format. + * @param ... Variable parameters for format string. + *****************************************************************************/ +void evel_enc_list_item(EVEL_JSON_BUFFER * jbuf, + const char * const format, + ...); + +/**************************************************************************//** + * Add the opening bracket of an optional named object to a JSON buffer. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + *****************************************************************************/ +bool evel_json_open_opt_named_object(EVEL_JSON_BUFFER * jbuf, + const char * const key); + +/**************************************************************************//** + * Add the opening bracket of an object to a JSON buffer. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + * @param key Pointer to the key to encode. + * @return true if the object was opened, false if it was suppressed. + *****************************************************************************/ +void evel_json_open_named_object(EVEL_JSON_BUFFER * jbuf, + const char * const key); + +/**************************************************************************//** + * Add the opening bracket of an object to a JSON buffer. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + *****************************************************************************/ +void evel_json_open_object(EVEL_JSON_BUFFER * jbuf); + +/**************************************************************************//** + * Add the closing bracket of an object to a JSON buffer. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + *****************************************************************************/ +void evel_json_close_object(EVEL_JSON_BUFFER * jbuf); + +/**************************************************************************//** + * Add a checkpoint - a stake in the ground to which we can rewind. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + *****************************************************************************/ +void evel_json_checkpoint(EVEL_JSON_BUFFER * jbuf); + +/**************************************************************************//** + * Rewind to the latest checkoint. + * + * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. + *****************************************************************************/ +void evel_json_rewind(EVEL_JSON_BUFFER * jbuf); + +/**************************************************************************//** + * Free the underlying resources of an ::EVEL_OPTION_STRING. + * + * @param option Pointer to the ::EVEL_OPTION_STRING. + *****************************************************************************/ +void evel_free_option_string(EVEL_OPTION_STRING * const option); + +/**************************************************************************//** + * Initialize an ::EVEL_OPTION_STRING to a not-set state. + * + * @param option Pointer to the ::EVEL_OPTION_STRING. + *****************************************************************************/ +void evel_init_option_string(EVEL_OPTION_STRING * const option); + +/**************************************************************************//** + * Set the value of an ::EVEL_OPTION_STRING. + * + * @param option Pointer to the ::EVEL_OPTION_STRING. + * @param value The value to set. + * @param description Description to be used in logging. + *****************************************************************************/ +void evel_set_option_string(EVEL_OPTION_STRING * const option, + const char * const value, + const char * const description); + +/**************************************************************************//** + * Force the value of an ::EVEL_OPTION_STRING. + * + * @param option Pointer to the ::EVEL_OPTION_STRING. + * @param value The value to set. + *****************************************************************************/ +void evel_force_option_string(EVEL_OPTION_STRING * const option, + const char * const value); + +/**************************************************************************//** + * Initialize an ::EVEL_OPTION_INT to a not-set state. + * + * @param option Pointer to the ::EVEL_OPTION_INT. + *****************************************************************************/ +void evel_init_option_int(EVEL_OPTION_INT * const option); + +/**************************************************************************//** + * Force the value of an ::EVEL_OPTION_INT. + * + * @param option Pointer to the ::EVEL_OPTION_INT. + * @param value The value to set. + *****************************************************************************/ +void evel_force_option_int(EVEL_OPTION_INT * const option, + const int value); + +/**************************************************************************//** + * Set the value of an ::EVEL_OPTION_INT. + * + * @param option Pointer to the ::EVEL_OPTION_INT. + * @param value The value to set. + * @param description Description to be used in logging. + *****************************************************************************/ +void evel_set_option_int(EVEL_OPTION_INT * const option, + const int value, + const char * const description); + +/**************************************************************************//** + * Initialize an ::EVEL_OPTION_DOUBLE to a not-set state. + * + * @param option Pointer to the ::EVEL_OPTION_DOUBLE. + *****************************************************************************/ +void evel_init_option_double(EVEL_OPTION_DOUBLE * const option); + +/**************************************************************************//** + * Force the value of an ::EVEL_OPTION_DOUBLE. + * + * @param option Pointer to the ::EVEL_OPTION_DOUBLE. + * @param value The value to set. + *****************************************************************************/ +void evel_force_option_double(EVEL_OPTION_DOUBLE * const option, + const double value); + +/**************************************************************************//** + * Set the value of an ::EVEL_OPTION_DOUBLE. + * + * @param option Pointer to the ::EVEL_OPTION_DOUBLE. + * @param value The value to set. + * @param description Description to be used in logging. + *****************************************************************************/ +void evel_set_option_double(EVEL_OPTION_DOUBLE * const option, + const double value, + const char * const description); + +/**************************************************************************//** + * Initialize an ::EVEL_OPTION_ULL to a not-set state. + * + * @param option Pointer to the ::EVEL_OPTION_ULL. + *****************************************************************************/ +void evel_init_option_ull(EVEL_OPTION_ULL * const option); + +/**************************************************************************//** + * Force the value of an ::EVEL_OPTION_ULL. + * + * @param option Pointer to the ::EVEL_OPTION_ULL. + * @param value The value to set. + *****************************************************************************/ +void evel_force_option_ull(EVEL_OPTION_ULL * const option, + const unsigned long long value); + +/**************************************************************************//** + * Set the value of an ::EVEL_OPTION_ULL. + * + * @param option Pointer to the ::EVEL_OPTION_ULL. + * @param value The value to set. + * @param description Description to be used in logging. + *****************************************************************************/ +void evel_set_option_ull(EVEL_OPTION_ULL * const option, + const unsigned long long value, + const char * const description); + +/**************************************************************************//** + * Initialize an ::EVEL_OPTION_TIME to a not-set state. + * + * @param option Pointer to the ::EVEL_OPTION_TIME. + *****************************************************************************/ +void evel_init_option_time(EVEL_OPTION_TIME * const option); + +/**************************************************************************//** + * Force the value of an ::EVEL_OPTION_TIME. + * + * @param option Pointer to the ::EVEL_OPTION_TIME. + * @param value The value to set. + *****************************************************************************/ +void evel_force_option_time(EVEL_OPTION_TIME * const option, + const time_t value); + +/**************************************************************************//** + * Set the value of an ::EVEL_OPTION_TIME. + * + * @param option Pointer to the ::EVEL_OPTION_TIME. + * @param value The value to set. + * @param description Description to be used in logging. + *****************************************************************************/ +void evel_set_option_time(EVEL_OPTION_TIME * const option, + const time_t value, + const char * const description); + +/**************************************************************************//** + * Map an ::EVEL_COUNTER_CRITICALITIES enum value to the equivalent string. + * + * @param criticality The criticality to convert. + * @returns The equivalent string. + *****************************************************************************/ +char * evel_criticality(const EVEL_COUNTER_CRITICALITIES criticality); + +/**************************************************************************//** + * Map an ::EVEL_SEVERITIES enum value to the equivalent string. + * + * @param severity The severity to convert. + * @returns The equivalent string. + *****************************************************************************/ +char * evel_severity(const EVEL_SEVERITIES severity); + +/**************************************************************************//** + * Map an ::EVEL_ALERT_ACTIONS enum value to the equivalent string. + * + * @param alert_action The alert_action to convert. + * @returns The equivalent string. + *****************************************************************************/ +char * evel_alert_action(const EVEL_ALERT_ACTIONS alert_action); + +/**************************************************************************//** + * Map an ::EVEL_ALERT_TYPES enum value to the equivalent string. + * + * @param alert_type The alert_type to convert. + * @returns The equivalent string. + *****************************************************************************/ +char * evel_alert_type(const EVEL_ALERT_TYPES alert_type); + +/**************************************************************************//** + * Map an ::EVEL_EVENT_DOMAINS enum value to the equivalent string. + * + * @param domain The domain to convert. + * @returns The equivalent string. + *****************************************************************************/ +char * evel_event_domain(const EVEL_EVENT_DOMAINS domain); + +/**************************************************************************//** + * Map an ::EVEL_EVENT_PRIORITIES enum value to the equivalent string. + * + * @param priority The priority to convert. + * @returns The equivalent string. + *****************************************************************************/ +char * evel_event_priority(const EVEL_EVENT_PRIORITIES priority); + +/**************************************************************************//** + * Map an ::EVEL_SOURCE_TYPES enum value to the equivalent string. + * + * @param source_type The source type to convert. + * @returns The equivalent string. + *****************************************************************************/ +char * evel_source_type(const EVEL_SOURCE_TYPES source_type); + +/**************************************************************************//** + * Map an ::EVEL_VF_STATUSES enum value to the equivalent string. + * + * @param vf_status The vf_status to convert. + * @returns The equivalent string. + *****************************************************************************/ +char * evel_vf_status(const EVEL_VF_STATUSES vf_status); + +/**************************************************************************//** + * Convert a ::EVEL_ENTITY_STATE to it's string form for JSON encoding. + * + * @param state The entity state to encode. + * + * @returns the corresponding string + *****************************************************************************/ +char * evel_entity_state(const EVEL_ENTITY_STATE state); + +/**************************************************************************//** + * Convert a ::EVEL_SERVICE_ENDPOINT_DESC to string form for JSON encoding. + * + * @param endpoint_desc endpoint description to encode. + * + * @returns the corresponding string + *****************************************************************************/ +char * evel_service_endpoint_desc(const EVEL_ENTITY_STATE endpoint_desc); + +#endif diff --git a/src/plugins/ves/include/evel_throttle.h b/src/plugins/ves/include/evel_throttle.h new file mode 100644 index 00000000..70371410 --- /dev/null +++ b/src/plugins/ves/include/evel_throttle.h @@ -0,0 +1,213 @@ +#ifndef EVEL_THROTTLE_INCLUDED +#define EVEL_THROTTLE_INCLUDED + +/**************************************************************************//** + * @file + * EVEL throttle definitions. + * + * These are internal definitions related to throttling specicications, which + * are required within the library but are not intended for external + * consumption. + * + * License + * ------- + * + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +#include "evel_internal.h" +#include "jsmn.h" + +/*****************************************************************************/ +/* Maximum depth of JSON response that we can handle. */ +/*****************************************************************************/ +#define EVEL_JSON_STACK_DEPTH 10 + +/**************************************************************************//** + * Maximum number of tokens that we allow for in a JSON response. + *****************************************************************************/ +#define EVEL_MAX_RESPONSE_TOKENS 1024 + +/**************************************************************************//** + * The nature of the next token that we are iterating through. Within an + * object, we alternate between collecting keys and values. Within an array, + * we only collect items. + *****************************************************************************/ +typedef enum { + EVEL_JSON_KEY, + EVEL_JSON_VALUE, + EVEL_JSON_ITEM +} EVEL_JSON_STATE; + +/**************************************************************************//** + * States which we move through during JSON processing, tracking our way + * through the supported JSON structure. + *****************************************************************************/ +typedef enum +{ + /***************************************************************************/ + /* Initial state. */ + /***************************************************************************/ + EVEL_JCS_START, + + /***************************************************************************/ + /* {"commandList": [ */ + /***************************************************************************/ + EVEL_JCS_COMMAND_LIST, + + /***************************************************************************/ + /* {"commandList": [{ */ + /***************************************************************************/ + EVEL_JCS_COMMAND_LIST_ENTRY, + + /***************************************************************************/ + /* {"commandList": [{"command": { */ + /***************************************************************************/ + EVEL_JCS_COMMAND, + + /***************************************************************************/ + /* ... "eventDomainThrottleSpecification": { */ + /***************************************************************************/ + EVEL_JCS_SPEC, + + /***************************************************************************/ + /* ... "suppressedFieldNames": [ */ + /***************************************************************************/ + EVEL_JCS_FIELD_NAMES, + + /***************************************************************************/ + /* ... "suppressedNvPairsList": [ */ + /***************************************************************************/ + EVEL_JCS_PAIRS_LIST, + + /***************************************************************************/ + /* ... "suppressedNvPairsList": [{ */ + /***************************************************************************/ + EVEL_JCS_PAIRS_LIST_ENTRY, + + /***************************************************************************/ + /* ... "suppressedNvPairNames": [ */ + /***************************************************************************/ + EVEL_JCS_NV_PAIR_NAMES, + + EVEL_JCS_MAX +} EVEL_JSON_COMMAND_STATE; + +/**************************************************************************//** + * An entry in the JSON stack. + *****************************************************************************/ +typedef struct evel_json_stack_entry { + + /***************************************************************************/ + /* The number of elements required at this level. */ + /***************************************************************************/ + int num_required; + + /***************************************************************************/ + /* The number of elements collected at this level. */ + /***************************************************************************/ + int json_count; + + /***************************************************************************/ + /* The collection state at this level in the JSON stack. */ + /***************************************************************************/ + EVEL_JSON_STATE json_state; + + /***************************************************************************/ + /* The key being collected (if json_state is EVEL_JSON_VALUE), or NULL. */ + /***************************************************************************/ + char * json_key; + +} EVEL_JSON_STACK_ENTRY; + +/**************************************************************************//** + * The JSON stack. + *****************************************************************************/ +typedef struct evel_json_stack { + + /***************************************************************************/ + /* The current position of the stack - starting at zero. */ + /***************************************************************************/ + int level; + + /***************************************************************************/ + /* The stack itself. */ + /***************************************************************************/ + EVEL_JSON_STACK_ENTRY entry[EVEL_JSON_STACK_DEPTH]; + + /***************************************************************************/ + /* The underlying memory chunk. */ + /***************************************************************************/ + const MEMORY_CHUNK * chunk; + +} EVEL_JSON_STACK; + +/**************************************************************************//** + * Initialize event throttling to the default state. + * + * Called from ::evel_initialize. + *****************************************************************************/ +void evel_throttle_initialize(); + +/**************************************************************************//** + * Clean up event throttling. + * + * Called from ::evel_terminate. + *****************************************************************************/ +void evel_throttle_terminate(); + +/**************************************************************************//** + * Handle a JSON response from the listener, as a list of tokens from JSMN. + * + * @param chunk Memory chunk containing the JSON buffer. + * @param json_tokens Array of tokens to handle. + * @param num_tokens The number of tokens to handle. + * @param post The memory chunk in which to place any resulting POST. + * @return true if the command was handled, false otherwise. + *****************************************************************************/ +bool evel_handle_command_list(const MEMORY_CHUNK * const chunk, + const jsmntok_t * const json_tokens, + const int num_tokens, + MEMORY_CHUNK * const post); + +/**************************************************************************//** + * Return the ::EVEL_THROTTLE_SPEC for a given domain. + * + * @param domain The domain for which to return state. + *****************************************************************************/ +EVEL_THROTTLE_SPEC * evel_get_throttle_spec(EVEL_EVENT_DOMAINS domain); + +/**************************************************************************//** + * Determine whether a field_name should be suppressed. + * + * @param throttle_spec Throttle specification for the domain being encoded. + * @param field_name The field name to encoded or suppress. + * @return true if the field_name should be suppressed, false otherwise. + *****************************************************************************/ +bool evel_throttle_suppress_field(EVEL_THROTTLE_SPEC * throttle_spec, + const char * const field_name); + +/**************************************************************************//** + * Determine whether a name-value pair should be allowed (not suppressed). + * + * @param throttle_spec Throttle specification for the domain being encoded. + * @param field_name The field name holding the name-value pairs. + * @param name The name of the name-value pair to encoded or suppress. + * @return true if the name-value pair should be suppressed, false otherwise. + *****************************************************************************/ +bool evel_throttle_suppress_nv_pair(EVEL_THROTTLE_SPEC * throttle_spec, + const char * const field_name, + const char * const name); + +#endif diff --git a/src/plugins/ves/include/jsmn.h b/src/plugins/ves/include/jsmn.h new file mode 100644 index 00000000..01ca99c8 --- /dev/null +++ b/src/plugins/ves/include/jsmn.h @@ -0,0 +1,76 @@ +#ifndef __JSMN_H_ +#define __JSMN_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * JSON type identifier. Basic types are: + * o Object + * o Array + * o String + * o Other primitive: number, boolean (true/false) or null + */ +typedef enum { + JSMN_UNDEFINED = 0, + JSMN_OBJECT = 1, + JSMN_ARRAY = 2, + JSMN_STRING = 3, + JSMN_PRIMITIVE = 4 +} jsmntype_t; + +enum jsmnerr { + /* Not enough tokens were provided */ + JSMN_ERROR_NOMEM = -1, + /* Invalid character inside JSON string */ + JSMN_ERROR_INVAL = -2, + /* The string is not a full JSON packet, more bytes expected */ + JSMN_ERROR_PART = -3 +}; + +/** + * JSON token description. + * @param type type (object, array, string etc.) + * @param start start position in JSON data string + * @param end end position in JSON data string + */ +typedef struct { + jsmntype_t type; + int start; + int end; + int size; +#ifdef JSMN_PARENT_LINKS + int parent; +#endif +} jsmntok_t; + +/** + * JSON parser. Contains an array of token blocks available. Also stores + * the string being parsed now and current position in that string + */ +typedef struct { + unsigned int pos; /* offset in the JSON string */ + unsigned int toknext; /* next token to allocate */ + int toksuper; /* superior token node, e.g parent object or array */ +} jsmn_parser; + +/** + * Create JSON parser over an array of tokens + */ +void jsmn_init(jsmn_parser *parser); + +/** + * Run JSON parser. It parses a JSON data string into and array of tokens, each describing + * a single JSON object. + */ +int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, + jsmntok_t *tokens, unsigned int num_tokens); + +#ifdef __cplusplus +} +#endif + +#endif /* __JSMN_H_ */ diff --git a/src/plugins/ves/include/metadata.h b/src/plugins/ves/include/metadata.h new file mode 100644 index 00000000..bddb8003 --- /dev/null +++ b/src/plugins/ves/include/metadata.h @@ -0,0 +1,57 @@ +#ifndef METADATA_INCLUDED +#define METADATA_INCLUDED +/**************************************************************************//** + * @file + * Wrap the OpenStack metadata service. + * + * License + * ------- + * + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + + +#include "evel.h" + +/**************************************************************************//** + * Download metadata from the OpenStack metadata service. + * + * @param verbosity Controls whether to generate debug to stdout. Zero: + * none. Non-zero: generate debug. + * @returns Status code + * @retval EVEL_SUCCESS On success + * @retval ::EVEL_ERR_CODES On failure. + *****************************************************************************/ +EVEL_ERR_CODES openstack_metadata(int verbosity); + +/**************************************************************************//** + * Initialize default values for vm_name and vm_uuid - for testing purposes. + *****************************************************************************/ +void openstack_metadata_initialize(); + +/**************************************************************************//** + * Get the VM name provided by the metadata service. + * + * @returns VM name + *****************************************************************************/ +const char *openstack_vm_name(); + +/**************************************************************************//** + * Get the VM UUID provided by the metadata service. + * + * @returns VM UUID + *****************************************************************************/ +const char *openstack_vm_uuid(); + +#endif diff --git a/src/plugins/ves/include/ring_buffer.h b/src/plugins/ves/include/ring_buffer.h new file mode 100644 index 00000000..cc08c1ff --- /dev/null +++ b/src/plugins/ves/include/ring_buffer.h @@ -0,0 +1,94 @@ +#ifndef RING_BUFFER_INCLUDED +#define RING_BUFFER_INCLUDED + +/**************************************************************************//** + * @file + * A ring buffer. + * + * License + * ------- + * + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +#include + +/**************************************************************************//** + * Ring buffer structure. + *****************************************************************************/ +typedef struct ring_buffer +{ + int size; + int next_write; + int next_read; + void ** ring; + pthread_cond_t ring_cv; + pthread_mutex_t ring_mutex; +} ring_buffer; + +/**************************************************************************//** + * Ring buffer initialization. + * + * Initialize the buffer supplied to the specified size. + * + * @param buffer Pointer to the ring-buffer to be initialized. + * @param size How many elements to be stored in the ring-buffer. + * + * @returns Nothing +******************************************************************************/ +void ring_buffer_initialize(ring_buffer * buffer, int size); + +/**************************************************************************//** + * Read an element from a ring_buffer. + * + * Reads an element from the ring_buffer, advancing the next-read position. + * Operation is synchronized and therefore MT-safe. Blocks if no data is + * available. + * + * @param buffer Pointer to the ring-buffer to be read. + * + * @returns Pointer to the element read from the buffer. +******************************************************************************/ +void * ring_buffer_read(ring_buffer * buffer); + +/**************************************************************************//** + * Write an element into a ring_buffer. + * + * Writes an element into the ring_buffer, advancing the next-write position. + * Operation is synchronized and therefore MT-safe. Fails if the buffer is + * full without blocking. + * + * @param buffer Pointer to the ring-buffer to be written. + * @param msg Pointer to data to be stored in the ring_buffer. + * + * @returns Number of items written. + * @retval 1 The data was written successfully. + * @retval 0 The ring_buffer was full so no data written. +******************************************************************************/ +int ring_buffer_write(ring_buffer * buffer, void * msg); + +/**************************************************************************//** + * Tests whether there is data in the ring_buffer. + * + * Tests whether there is currently data in the ring_buffer without blocking. + * + * @param buffer Pointer to the ring-buffer to be tested. + * + * @returns Whether there is data in the ring_buffer. + * @retval 0 There isn't any data in the ring_buffer. + * @retval 1 There is data in the ring_buffer. +******************************************************************************/ +int ring_buffer_is_empty(ring_buffer * buffer); + +#endif diff --git a/src/plugins/ves/libs/libevel.a b/src/plugins/ves/libs/libevel.a new file mode 100644 index 0000000000000000000000000000000000000000..a56ea84ecf054cbbb23bdaf3c323ce581549dce6 GIT binary patch literal 414098 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∋FKVLDQ#J_g=>+NK@;7 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%0DW@G*7EbDrtIoo;#mN&L;L>Ze{ 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 z%0D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 U-CuI!6~$h`9=0Zt-ST?>5B{UL7XSbN literal 0 HcmV?d00001 diff --git a/src/plugins/ves/libs/libevel.so b/src/plugins/ves/libs/libevel.so new file mode 100644 index 0000000000000000000000000000000000000000..de2b5ed1162ce632aa8b00c7bf15fe57134a9b9a GIT binary patch literal 416440 zcmeEvd3+Sb7H%gn5D-WZq5(xBiw2cVi6V%GB{J>-MG%D$l0X94%z}u5fdDcLqX7X~ zR01jjZnyv;iUeE|7bGG|5SNIEGk_X!AtG1acj}z(t{xKaeSf~+@AbVy_xb9pb55N) zRb5@v6Ca7c^~TVU5W_qg8P^*m6;Ea)P73OVHIXaBh%@>cP4RDMBU*7?R>|2HjpG_A z&^#NcLkHO)jqcmH+a|zwpg-IVr|rp2Ju)8ski# zN+}OMcM+a>CN3QbKjx><^`SFl`Rw!F778}ZvsrH#>e&%v&cFQ|A%(-mUPEyyWj74- zEX`4EYYQC|&7rrCFh+&@UVnJ$qEjOuTfFb(o`+%@ox84%Of*G>Se&Erp%BlE?p~O* z=#9{lnf-1}nEuj`#zUhE+lCqm^Nd0juug_6szsMZ7nip%LX5D&P@_CLI;L3*qxH>U zA%)P=w9B|w!&2ApnHOf1EDpOXu0^ltnT74kD;srjwT@o%+{GcIAM4vEBr2k?v{hJ4 z$l^h6zpK;;Y0|Pqbj0m*XB(TsqB|MU<63*8BZfsciR*hsTv%vWXtYrn*EGzy(3stL zU}Ili#JGsVqe7NbwSXdHv#j>mCH7fEHt`0F`?uzad7Tsz`+&uU^ zq_{9-<3?jvNV7PjD0Ijr-Ho&!?HBiM+<8Lvt6eU-G9);yfCk`|ufq zPa;0%F&-Bw_@v@95uY@C%p={rkn&Ckvl!d~)!i<9>Yd)Rkcr$oWB> zr^)q0a-M;6AwIM5nS&137a`8fOJnof`5vryzGa9%9eOK@H)*URL*9Osqz zJdMvP!B)!|{h*HLo~uO&nB|~ z=gr#n7F?H#yj9L+a()ZvxAA!gpK^S5;A0*;<>Eb@-^b?zd@Aty5TB3m`52#F_F&{2!lCd>Z59!lwy7VfZw|r#U_? z@u8!YoLMrA2u*IIU7wHZb|PPZa|e7b!Y5iVvwl~|mkJhx^JVyS$ESy2J#p?W*H_B9 zkDO!Wd^OH}<+>lv{pH%UF#z)Q_}qX`96p2a8H`UnK6DI~^G!Ja(|y|1Uk7Y{?D>IB zAIm6y`GxK)_HTRP(z&x1oaj9C&W{tvc0Dk9({m9&R^A!gWkL40Lskws=8x$%ylTkC zr+0O3*L6V0-UmaDA8q;Dz}ipWAGCZ^$yKvn9=GAVAEsALI2AYav3Hy8p7}!7x!27t z4Xhu!;n0GwemZY#$%-dJcKqD`hdzCq%v~_|$6npeJ=AnY)F)5f-?s6&Mq!^-NBa)> zbMD`L+dS)YC#8%!|J;?HUCGZa$or-L1zi`-Sur;D+?1L9p5OAqHDmXsZ5cm#%Hez7 zn=+#7$J5u3KH2ocTc7&$tsfRWoc`OYD?Xg-zjI}aOaC6$vFX@bJ{>*!S7zq^weR+%AD)f=V0f=5Vp9D`-*U3GzHYdC__$vRRwM#$Wv1eQEo3)$PU*ENC z_tl@x9~}S1u{$S6uWLK+wQ0LPpYc_ELPa3rirW%zxaQWeQ--~{_kkW4Zm;YZwdwtv zN~2$2Klh!#Uj1tFEjRpU@ay+ZO1n68;P@@KH9z_EKSd+jx<{ONq5YRv|8b;E#?X7_ zH|}X1z2xdi*H`RV-~Gz$CtI$6V9j^`6y;R@-So%yo%Tgt`APGU?Vh~6`NNa1S@+sM z-M9TRVa#`{`(KrHe`Wm8ysujCyQM>;#4Uq5G#a;P{F<2ycAOk_s?(FB&VT5+Mk{al z`K7ES=Z8(BPjov!=ik|&vw7Y0_RKySKqPO~vw|Y4L;}bh3<-gyia?H7J zoqKBBUyItUiwPZc*$>|ws%-gcS<0k-ckS8#L7#RvY`8Hw;pe%>v*%SM_E~kLcgU{a z&$;)~kU#fN+qLf1FUr4Mbk(%$9^CQNhKJUzJ8|8vYd82V=zAvV%ONfL^o=-w|NWyb z?E6ygk&N4JSpV0U9_O4a`)1^4!&i*GDY8-c-v9jc%j&K@KfR`~*YqZ@^y_wMOu@>~ zwd>D0cI1I+`!AR^c5&^>m%dw4v#0$>SN2R_7e0T>FYoq0`r{RM-h5*4XFZ?Wb=~>{ zyWjh6cg5**JGWkb!$%dZL)Lz``Nf6%-{>_gyYSlsW8b{L>)qY+`d=6|es-@H?|63l z$UVLb)?8f|(<*an!jiuKx!~8ACQbV|fA5@8Eeq#_K77Z((|7b;^!A1hAFgdVJ7mhV z?(4tKYn2-}@{4C$Z9etPBR7pYx$u(Ldo;cIg5CKuk`EXC(;D4_M^dD)!|3MAlH#QKr_2<{`XL1AnT;QsozZ$Wruf0DuV7Imb zeyhgy>)GCbpS2D63A08tK4%>b^vl}~;Hw&l=NAp&r;yS0#i3&Z{rCa+_2t8>4f)eR z9PVi#4oMBz9n=7x)d2oM19tC4fTPa}GS+tu@ZW8qUB5Me?{5I7wOxI2{-S|+UfF=3 zG3dwo;{SaE`WH0N@3(^A37_C&X9N6+=aBy`j7VBA;|QmO#j!Jt@dX|RItf0Z1LL2^ zqJcO}{&6*4S{R2HDcJCEvGE_&BmGhIP=I5l=y3~w+GC8Wi zvYvmESiu%9Hb!8gB>kI<7(XI-f0c(Vj73q5-y?R%NV_W5GVu!W^P_gG=iLYfXuVEH zocNPX4^KG0=acaWI-Trpp+zbVS~t@%37tszt!G%?%qR6cMEJxyCO#r~Yw@#E7VR`2 z(GiCI3*z5L4=y;&IA3}Z<4vz~`uU>7r*jJHr{@AX7Pe&mXnJ74A?_N}E@b>bC)PvH zDRlhOmht_G%s1m4DeY?8nepKgw_hcHZli}R9HyVAg`Y2um~jqi!up?@!+NIh$v7!;@-I_?txU!w;?92@y$bQk?YgT}?5f**Z|6`0SiE!BM3!uawD#?83hE&Xy- z9ti1qjgDsozn~ife=}_S9nSIjCYtf>ebY-I1 z?_bOKYAp|b=ZKz((qARB8IW)o>1bDLqn**^-p)!hrWbWQi+qRx9wWHG#!b!G|2Jr( z0>_h5;SHGwz6y8d&yMEIe``DQ&A9z8{(MXeLL8=_QzQ-7|t~RjCzXgH4}VrQ^u#!W(tm_5;uw;@tZAV9NnjmmNHKLJ6Sg4c2fNOP&NXx zx!Fd%^!r6|Y|xD7TG4-j=x;CjvvH<=uN>v<_YpEqAEr$d9QopZhRla2Xu}4_AwC)5 zGVcu@#l&-k|Ea`huuO!e{~t;|*EM3Iq>(WaBE`Yn;3NO&xI*-gkQcYS zeNc8tzh_FnKf~3GArgnT+B@U$iP+uyG%FUjjAAtpL>b#9PehFoF75he10(%qJYFh# zp1FkenDg5UG7r4;4)e`;{v~>ju44RVY1coJ&lkEGXd-#O8wsq&OO(_9S&|Re9%Vh| zK3XSE|-g$nF@KnB_KaoR)ss>1F<0@qdrZ zZ*MPTz|^x)+Pm|5w%d|V#w&84+C&?bIL!6NFqyAjJxF;(8YllFiF5O1%zsew z^8uMp0;3r>*LwpcuO{NlB06f-zlL#%#O>s}448gylDvwQ@zq!O<3!KMNY-P_+;D+H;5nT z$^M8sqo2%gwM#e-=KW%sVD`%{u^TF1Y@CvD=a>2RrPkaov)?yK zoRgkrJ@X|#MUsbihH%_o6}!2zen^xD+`G6~eYZt%h&aW-_k#Q6KHGJZ)6eV0pQ~Fq z{h@Uw=~*cAo4Kw#EYCGvX`zDSBGLb-_+KgkFrSx?NZgVyWMVUES7)4+pL^J!?@e6% zY$qEAe{->MQ1YjQzNo^nP3%TX{`B~ki8XvO21wj~k_Bv*@DIp1`ly_VW`8Y``9FIB z6K@oMl4ZW_CJT_q1aBd6iX?Lc~V}oSfvPkr&$^6`^n1O1+CrE$2(U$d?`diBQEgr|XIer&N zKEHnj<9U2CE|K`Okq1q4{-pak^>09kv<{==u;3v-vx0X;&!v*jlRsge*)PANU9F8M zqhw@fRUm4N?WjlV_UNGJwSm&VkG$p7bFJj<`M0sbU&Zdr7qFk19k`kPO$zSk|(Pro?i@M+#Fvs zWxg6931#}ZPv*%dyE^@URN`E;lJ!u$=fsHJ+!PM{tS7rzJ;q9JEh+*Pi6jZ?3O`~EyVxj z5aT=eWUP~Z>3lvbF#F{`(Z4&6aT!j=?~Ko)<<7 z-cc6vX8fNO{ZGwef7o+$Z>YSs(6~0M`hKgW}vt#)VAZ#t`Yp z_h+&KvmZ0WpM<5Xf4%tmoy6jw<_S-s^ zO}nF|-<#aQ`ptFePQlyX&A8dWJ7s*m(3tTzSRGz;OPrXQot2oEpOl-Qm}n$UNY6?) z5^uWew#1aw+|-HbdHJcicilEPBRebguB7o9sa#fnNn-NUBvO!+kvcPlJgb(@Yq9u`P!nX-Y z=@~{w_C&pq#FW(W1rxbiep+sJett%(PRYy9O)1DR@^W(1v+^ex5VMk#^2L#~q^y*T z)LflUDpPZFvvVmV`Kd;BPHGmek|!r-rsgN5B;_Xs)y*x)LJ*mfoHm*LRINbdG7$_Y z;bxoGY&^LjHzRRkM)r8LJ~<;bDGQ!X$W4_fSk193D80l;R4NVCc(|W}uyPDkA)1<+ zOCe=eW@=_$s$QO!nuOlfDojW!$j}LysY!VSxv7~>wVB!D(-GYX8QBkLb#qg5vUByy z=&mX0$&N{TG$C&nneiOC4cLDD29q)}#-lrpOk89qYuudF+zHvanZ~5N%q-TUu5yxc^HMdM*-t8yavr3N z%1F)P#LCRk9G#Mxn3a^NXAqErg7g#vsW>rle8GeX&eY36hofT>GYj%lr?Lkol$@QF z!iZj%*oH~rT4>VbAgCbA0V-7wB&Fv&+)%->Dk=_lnuC>|mzbKFlmDQRl7WdqIV8iB zft>7|M2z%&DbFd$OT&DS>jX5y#8ixHt(@eb;;huErn(^O$=L;F(xaObiOBh$n3sBg zL28znfmx{!BqHH+^T((1z~}jeFnbVW(}aXn!Ayj)OhGo_On!Q1YW9Sbqz5@4X<7;* zsR7BF)O-fpl5XUaQ=#JWM2jJloMv;W&51!64=c(P48rvM2URlJRn96-Pq7Qt0ISFN zq&zeak;zU;bu?d16NxF=nMvtc+*C#|X=Y>8Nb^-~8i>l3l*H`ulTwqVwNRQkd5Rf2 z)lz{9GBQLZQ!qE#@|4uvJcQf^paXt8^eD5*8QFR0AkCuQ7UeA~p%k(v&b*w|WQG-6 z8*&<|TGWtcZDQ07o;5!@3WKLfy-=Smb=)y&ItrX~r=#esDb!J_&7?Zc6RPSWmC)SP z>2#OFm`TL^q{>tdHBhFjJF6m%H!W=HGBGJ7g@)aPY`PKybk6~XTh)Xl7`8?Z*Pzvb zjpe};I}`N7<*&qOhHag zZfag$V%C(zoTPNQOR`3lgmxVT=B7S?`!6e@rk{0_)MpLL8I2V*Z|EgSIXVBOGzTl5 z|Am6+*}>FJBvuUbxuF6~S@oKSjl2}xDa^@UcTJ72L|WIX6>a^b+=hI~O-f0}Ac05u zsroHKw~*IR<-DZKoW!JziMCC6Xx@eD&%K6JMgg_gd}J&GMe6^cp4!8cqivubUDTTY zftH?=pPl!wiZYUNC#ELmOwLct&BvWQXoyh9nbEeHwDQGT(IRUB_%A({nKU&qH+f3p zcr49w>50P9QBNC*oS!@OeAm)2#cG)4|FMX38Mb11ON4RQ63V_=ZSSUghVfX7Yg1My;(u19eMyl(JXU_88Yu zovx2jYsKi$VWC=XSeS!p`$iLnw%p;F*?Ciw**ZNnBgKv}waN1N?3KX;VxJWfat2RY zNg2vM9wH{Fiz#_oviG1S9XsGO`Ek(o#V5I}uMzn==uRx)1U%5-DLt_OOJi$UC1uG4 zdHLCy7;4soyrRIZWIUxRSJZTBm&>GR13^Z0RhU!g&WKf#J>0a4$rIF5O9Q26CBIe^ zMzYZU`|%j4&m9g%W+LgY*D!WEC>q**N%tCh3sUi<6*Nz1%9C>noYB;)Psn>P?_Wym z>kPem13kjGBHaf(oh3JHCut(41aY&07^I{pCDNXZQc^ExO4bDQA99tRFL^q)18U|4 z^#Ml0gV?G_o@`Cy@HD6(F)e*!8XhZyq8`kmMZkY0S!t|C&h*17G(D6ps>CT-=_+EJ z!n}~sBI+zQrNr^c^w>=|s&s8BS5I+vftHI_dFH=Yw~OnqUhwbL?P5oD3X9cTd(i9A zvK(}Ti*D`C?KT|=8tRTBsL8-CP0$3Xwj>mfgPx41vvf)*bGIM~8>_f&sm)!cFrs#S zRnp5NFC~R~Ov6@go;YKzx2@423_N+Jlh0=r z;1Nb!`wLrv`l?rO*~U0aNnRpt7~8O#{FAdYGqLZi7F)6srA-UH3vutk9%@pCk(P&z zD?A3|T3d6x&4)&~7F+G1HQ<6^QQ5HPWO6mnz1*=ZuvB+f>i4ylI?4<+N>? zpDi0S6m(_T-Z|DcsOc8X`=EJhU4VyE^ql1wyTDd+DAX$WR`Db}i0if0AcgnZ&MKln zI|L5Lxd*X0%*oEeHY}Q{8k|#*pJ!mQPsRqUxdDoyA zu^E+U`hK;Ul+IOxiPoEIT%8_zQwp$@cjSkZr9lSj6Seq#l2?E`LM~!ae{sE&nbm*>rZcO&p$W|*1Wjof>En}ou>PYc3F z3Z4^$X9_+w2=@qH7=*77d|nW~PVnL&e4F6Qg7D7-FA2hr3SJ(Bhn91@DueLWf>#CM z9R#lq!ea!l3Bvmb9zBBJXSL!ia!e5J9?Jg21>rGc73Sjz7H)DzAj9iE^WcpX8}i{adQxe`$ERhNo$GrG}gD7*cVS zhU3**>!{Z7Qx<9%H5wkH;eHM8so}L6K3&7>H2f+Jk4oS;(9detXn3@S%by@nr7;@5 zR^#{5aGt@qu&;(6*7$K6-j`oNRHbeWPtf=Y8s135M`?JWhL6+mk2O3^!|@8Lb>wI` zUS+k8sT%&Lh2rn;X*k8sJmzV*c@LnnVh!J9l5t+9;rDBJiH6^#;p;S9UI|sD8#NrS zrdmg-hU3*&>nPXoP%ZwI8jgjmbyR71TMe()aPzm1RH;V82U=S2I|U8T((qah$E&Z_ zQK#Wp2-(LlJ8vJeQ6o&lKhf|A4ezJh8eXB{eKkB> z!{ao(pN6|N9IxnFM}mf%zty0^Q5t@&#Wsv_8t&EbG!3uO@Ei>{f8#>MQ#JgU#xK-x zykcw}^EBLi$C(O?HGH1MM*eF!egb73B^v&Oh2n2aYB+wJw&Tz(p$O5-&AYK`yK z@X;EcpyB3kHK=%$hQFlo$7wiz%3~dA8gBj#11ikX@JqD#Ox5rUEG?M-HT)wDpQqt> zX?U@QKd<4-G<=DMmuUDc8oo}$U(@i78a__LOEo-I!^<_im)71&4aZLttfNZ9$6F}= z7OI9PX?Tr>&(LtchA-3bS`EKf!|OEM{97Zc_)a_jU)T6y8a_qCBQ)Intr8VSY4~*- zKU%}_(;VxF(ePU>6!X7^|EA%6HC!IiRcV}tf3NY~8h*XjF9{mnQR9!&@Ix9tPQxG2 z@H7n{qv1Ik9cvi{OvCl*JyZejqlfR`DwW-t<~`7G=80iU#a1S?5ohT*9i>|)9^kT9--kIG~8Wu zEX?h775vi4aL*~vclj^C)04aCy|8zgbS8EYiq3RhjDN#B#^H+OG%5_#oWap`KFQP* zfhr}>A~}@gawShAxe>`5m7Gg*W0FghJc(p_Tgk@*tAY2qO@uuOXRk)d54vD@dkWZlLx*)c!>zN0VHme#CV8Whb4jMDKTx9NNhH&hA1GGxc#>)A4iqYRG|4mt2Xd4=oa7ji z$0_+{l4;5fBq(_h$uxBa;*{KvWSZ&%y_9?<$uwmJqLq9Z$u#u@B9z>TWSVjUhLYQp z+>_+m)2jbTrYRs$qvYl!(-03-DLIs68mfVEC7(J5`6`k(D)|J-G&BPxN5(EmB{1wU9kes9BJtX%fd7P3zBAFh20|`prNpe4u!Ypl82I>ANS;n|gp${gJcDFI$ty^HgyhKgq=;*C@F;$qPxY zQgSHCi%2e4@~HsiCrI9?Cb>k(M@U{maG?6gh1)yepudyhk4FpqZu~Rm16K}+A-|pN&+!`g zQ*?t-a86(>nCv&~CyD(4sXS9PMy)UDx_HdH|4*FUGmqsoN60B5=REKUjsPo0=s?J4J=QFU2 zrbjiKLZsP5qPq}C8=2IONH2i|4=7OV!M#MJ+Y^Y7GO;ZYixmK zv5ipbsqnYK%@OZ$9pexp}(#d?o)UeozuLNGSjk3(hZ-!}O z7K)EH#l<7IU`^AUHPTVT8y}?_lojr5Drhxe7)FO!| zR2V%mlSsUKOT5E38?(#vJG;F;6@8|boe4pPcs_+P|JL7>Q3^`rCwoE+JzCo!t7w(s zVhH!N+q+5SgKrxRKex|ELt@zQc+ZZTFo$|}K+RIH-ysw1=?m22qW7pZwHQ^VpWLfG z;3r+NpV9DB^)XX*KU>33<;$hePNQ5|-$sM|CQrHB^BD|Z=QP}d3_}wr++ST$uBG=3 zRW6$5)FPm)<}y=_73@RDS(BpBKc#3_N>TCQlZ3IvAtK> z^n3tg;g+$M;1zR;+k0DGiui>9A8 z@>@gS$G6pE3;p0AO@UdmVhgkQ|$|Ae~27yBz}X#MafY-a zQTl-1t}$|dK655;ueiYau661&H1_YNzCvB!KPr-Ju@mV#$Dz;V)VEP%50UG#N?qS8 z8e`8f=zA-aL&W~=s&d44oW|}0>#Ds|F{-Whj@1~mNZ(|KzLidW5gNNK4PJ_0FVwK~ zwbB?@l0N!t(RP2NJN1<#tGKYjpF)!u>D#Ec_Z^LK@F?_sOw*p#zt=eRWkLc&zb)9)#G=O#u!BU=&J(TzkRzM{ZS=-K>0`WjcV^Yy}h4m zj1xzo?*K||eQTZi3N`k7X8+dd`eta1HKdQ8YixblPJO*J_7IvcsXyq+#p>T48e=&0 z9lf477@r=RQsYS7b>Q>x{vHW{mCpvCWt4SbZ2pMmfdTyi`Cq4Euj{I69{vB|`choe zJu`9w2%txjLVLa_MvY>gWBy-RLf?rsH2vjH&$frLIjS#({k?I^t8shYt(a4YB1Fxo zm@`|h+!b@ynU|&4-9F;hTdzm_JacLQ;?C*ENyT_;M^xiwb7>)6E^`<8LqOa}3`TD9 z>>T(O$_z^`AGlSM-8*U;yL}0bN+STO>LFEI>AH+a?vuyelglIA-QFW_i^?0}AuAMB zLSdv7Mk?ma!@r8@i%i5)6x|l_siWKWBT>+~H-BkQ^Vj3r6TxY68D>%c92!U-)o3h$ zRND)>a%3=mN$JPC9LY7CvU!$^g0=t-w7=9aygs@@cvO_UN|{1 z-`zIgRRt=G=Q|BuK!(~WL&Z>kE)2Q7k-NS^V|)Z)^+WDzhT5HF=o;IQxX1ReSWzY? zI!&$%z$E>LIx6NYhU&|)x#;!LmDqy)FZLpUwEE+=t;KBTY}LICa-mx-06qOa@-Fq<~#*MEz!+o)Yo1giD!p(CsL%|Ha1lW zqI%sK)(EG;VPx=KL(>! z&2yd#dSFs9SfZ4BHz^%Vm8E<*n&nXwSkX2$jZJL@TU5(y6xD^86GRvVRMC_N9%nO7 zAr65$C*>7qBldxUr!IC!wZ*%H?A_{fU5AMTH_1(?K+A$`gacozcH;gZ!|3u7r$KBc zojKY8cS%FljosojHmPA_J=xgfV$6f_ewML^oW?FRjs3Qt9F1M#H1?lEXqimd`R%pr z$fwbz-Nno`xoKP0VCHrjVyx^uewXRJzu-MWBho`xzK#f zIq(Ci8&k*Yg0eUcnTwj}8}Ka_6#jNFXyTEKUxLQ?Lx9UV0#8VB>XF4$P~#c#wcB%B z)vccR%8GdUGu1{#JasQlr|E>iZ&8y%Y)pkCRgWuAT;q4!_qn@qEsry5W_b)1%O+CF z`(n!~m5b}Kr1h_*szuXlcnc_vSo9S+Sc{qUB(Vy?Dw_Va@nA<}%wQs=Gbx)%Gl_IB ztEysE9f&oFSvN83eqzNktCCqK5tXvZ%<9ank;DoIOBx?&htW?9?`3MefPvtRufgLM z4V2LQ0r=;E<}_rY0cz&l*j#96eKik?N$ zSr&aQ@R&HF3fA##skT3wHlZvIpX0LVMdcwuP9}u0BCBKvyI<*zYus(8rwR|lK?JLP z?%=9cNkU`P8R)5$oA_|7ZMD|@@V$B@#MTYXn$00hRWT1hFbf(wR4bwVOZ_<6jXUee1c(Ej$v3@5%1?=c#O1!34<3W={h+WxGv=><(t)-AqPF@A5*PQm)3>9rx@bHXfVtm%Npw2Bx_ z6x1rKghnPx?1`c-h+tKviNaCUDxrzum_1Q^_JJeRW#7;Us8bV#qrPUECkh0Euu=)` zzyoGQ1)38@DWr01qBw+1*824}7{hR)krSZr2+{M?obFr>hT6&h$XT-u@S^x*Jcm?J znLUS`{F>(wKhGgSX@P#m9CA$NkY}l?J%_waRWXMg!yIy~fBYxm3$FT)8mbpm+H*)a zuGJhe7QVve3o#C~Moond+z+fdBpP!FHu(y$nLUDbA#3R-)u;eZ-*nTc@J~hHu+2>c z31RBQcY$kn6vUm4aw66uSGgDJxEG-51Gi_l|Kt5<&fvMBshScchs6`0>m4j?_{%=G z&o#^zijI+weow(6d*T|eZoIMYI>Y`He8t4ovcjIYLU64wD(JpmMlT#8GD}b!>z-8%C91M`dsPAvI~?+uI6%>u;e=-FFb%1bnRm z#oo9Gyk@A@PUA@rwn4~=S6ELw(lbe%sEEUI7Nw|G5l1U$b?F^(2(j|IK6&3xr*d4Y zbo!Ok=_hA8b%R3LX2QBqb(C9fIxzj7lYAQ8FClPKBaW#XO}yWm(3oJ_8slgDHO_kP zNj=U$@ETvcGko@H^4b^sq?5bMwBhBbK&eD61aqX}rag8Qta^$oC=eWpxG-Nrh;k~- zQ?>l$Uv%kF13x8)&fJ3f|RD-pOhSf-k|XJSi%Va(lj{DsS&Y zkuSEpv%&|c5cmR5Kwx8}lIg3QjOSRTEbFa)!1~;}|MO~`mZ3^PC#QmB(Dd+R>I!r7*5>eVrva)mUj>?$n$M&6rKpt(3lrT|ve6M0=-cSmKdK z!^Ri8-l?R!%|Z`W_;*1*>x&(0&WfGkto`ek(m1j49i{@+8Z*l%$rqQ0Z!X6Kp`swf z!$>rkQO$~T>Rbt(x(5+za`#0xLT|zUd?!0odEokXhdo{H!L^z$>v%zR1U1Z=@J3u? zy7b`W@5Ij6xve3COLHP|Ef9^gOainn(r!nAFZB7Nms-$P@I4pvh+4H; z^GVTkS$$?eN7+Cg{u_5HuYSYHzW~Y*scOuGVHoJOSU%Po`S${<1%zPGBuUpi4NyuJ zv{MzVW>lNaIEuGokfv6nNb3j;KfVc4chA_v9p<=|Vm2d|W{K4rwU7Da!2rqTw3t-?>gdr%Q9Do?-+7Jo?kM+XWHg3q)Z0IHnaYS42XziZ_=H80d%v@-YbLH~v?)702dt&hl7U=stx&8`&7VU~VkV;7 zl{a!OW>oOVMfDm;7An7k|K2In>zk_ZN9?fP9yVgv~R|l6zc_Uvg zCzq6Z53P;ZkT=0J1kd}LHVuk}Da17<2fVHfD8R$0$CYer!dg9nf)IzkVHcL}a=2Dh zo+HbzZ+4rMykN>Wp_GAw41clA9#5-qt;W+Ul$*ZT5!)Pj7ls1CaUwvPhh^t4Xoq9+YTM?fex#&VwJ{NH@2!q6+Lw$*!UPy^j;!D?VF43%wW*SoOm6L9h`Q&p|m9tq-V zsW}>AI$F$*ZgCo(gxd8xTEhHcPJTaj^uDWl{HtW=IEbWoQ_^Z zj{d-o?m=xh+Lj!>k*ZoLQ-@9GvO~;ziCIy^inf{)7h^tkenQ+InOn%*5aRy+vDtKR zF&2k>sAMcOD*Vf6CZ~x4UFb=OK_qU6pY)0oMP(5C?28-*)ky8St&Uc{2*veBC5icq zocxEBBd%kc?e43=wcdShYC{NS7g&26wGownaPs$}s#a7w5i68gOPMtQ4fZ!TTdHQ2 z3jZ`SJADZ`YGBcb+UL(>KT^aG)&J~=FY*O7dShETJ>T(>-qL8=5K${le80l{b=Viw z`yYJ7FH~#kpPQtmvKD;?70Wtu8}^_!TI!{i-l(e5QjnH8DyQ>^8qL%fn3_q{3xw*8 zYcZ!>ZJpdi%!`>hotbwN^Eh?6^`%W`Vs&EHNM;Qt*2kO}HCQeoHFi<(XrYKlJ#Snu zAor3z^9kM;+W~bbhZ?JJVzoyLSYK?Ez)y2$)VO6U07Z?ZXqH_REwzr5A5b>YF2Wd9 z3V)QM1#E{_j%24s;8?o`@>dmoDn;$3$ScqKzSv4BsZn>5cycaEDs7gcA33U2gy~G_ zTPsD9Uo~DgJ>AxLBcyz}l#i~UZiiN1LV^^{m7*Iet)d($Dv+WscF{N~%8;UFT!dt+ z@PDKHa=r3~JwDgqTHObFW1J%-qc%IT@Ep_*9-qF*c;^1O$-(_jx$a63?Q{iyIei!&sOEG=U=x2u^iVb5NT@Oi@n3yxKMa#2Lei`mwF1`#Fp#2 zv(}#U#TE9XeUW2X)9yDNVJiKA+UDvewkb><*tR!*9gmy$iGpur@sew$cf^}+Z$T+~ zwVYb=73ZV69{awE5=_NDO2I_&TO3Hzqh2CyidZ{dB3%li^%ALvYVk{?Bi6A6wT%^t zTSK5Zb(7bDcR)4-PSEYaiIcy9ug=D&BkX~lXX7r?zu|2BWpqnm(b@R(JMo+`J;-Pd z$VbzHz?En}zV~ywcNlJ~clT6yX`5;+b*{Zz)RhA1Ye{3ijK0tXW7ZogJBNYj|C6&x z#e4+^SY1CR*WS1&yjVa>hXteoy-ph9SVL>l@FwS5>_$7^y5U;oTVEQezS!?xcVx*T zv5Afhe${#3yV}|_+FEzv)%BPdT?9*RXF5&DP{PUIijw=Abr) z=29fC|1VgxZ<|LkTIuC_VkI(bHnBcumfV=$Cl+3UCf2pg$|2Uv#G=(HGBruv33fun zvVmtopttC#+Nq&AK+Oqpob4o|(G~t)w%m*4XeGNod&Q3N`?yvyZVQLt%R}f~?H1bu z?$~1*MzE!Tbu)9@Ik}WR z%1$sfim6FNU0_ks?dJPg#QlxA$2Qt($5~v1n*Z8%(+cfWRQOk$vV`w7PADsUt8H0@ zZy~41qL=OP&Be6}UnI>Fcu@t`webDA!+Hwo2V(QF}RYi7R4%-O{3 zNK9)%xR6-qGHVXAmZE3;f0e7a)@r6F5VZ|cM>F+VqJC;o?cVE0T=g!QFSduKb`5ip zaIw!(0-(pvu;;Ku!+}cHNXZiJYLv*3@Wq}cU8pq8Eb^({L8?_CwZctzdEH4V==Ed`uG59+d~S8#j9MrW#qXH zJG1<15i+DR53(UpqGi<6%C@VO*rN;yWqb4!3AKiluTXHcL*@1Yw~1gdC(SZozm_}6V? zBDRl^a!QjI;pC31C@chq$wA>2g|r82O5PFGp5l3`$o2VpbfHQsPci+vmn>Hlmf(sG zNNRn!i{=3Mqvqt|VlJtnG<(BQvW!dW+^%(Wh4N=9{8Y_F4JRZ?A+AAWSe^y1#P>NH(W;MA)m@*hV}q1D@8cQpO`Q7)T8 z4*FvEQ@;BKY=RPhBwO~YRa2DzL)Um_6%*?jVxgB1I0RYVb()P5tyS~E*^aG2!(T%IwepNs8yAsY`fWP& zHfOzKN$-tHFA|RGSv!&A7**YQNad__G^Ir~b=jvnDl?5e;ci54mCa;pPx0IwO4h31 zlCGzvirlki6L%JKbC~-J9Q41$Tr5wQ#u!8Kc~8HKfVB;%jo~sE zM*WAko)wNZM5W(dfcgkibBOwuP?6@fvICn|O0`|x#4t6jgW0r~R2Ijc=WNevzz)Nu2s*=+i6e0aM>56%on>I zwb9gRSSt3 zg?}GUJY@PqDei+P%q|a~?ZUn4gZO=9yWGBYOd%Vd`09Yn5tty=cfa^Wj``B?4`@T# zDYEN}4Sz}XS2Fs-f6EqSw}#hHm8zmIcDR_G4zG%8L+}IRVWxBK*-@(kp4)^R&7nq# znhMGN%cRJ~MXGfkT%!r}Euor3*HdfZJbbM-!siS)V+Z1T4C?UB@%z{X`nFbS7|AY_ zV^WmKfNZ@-sfFm>q(!oWvg`U~wLM85#I>3vUnAdqu?Jpsr2Z|aZ4aGjwH~uqVcWRQ zI~yEz&Q}&)^TZ0>NFQb^){S&ADwbW2&V$8b)W&eR1-;<^gt8lp32nHf6ZHzFrZTk$ zQCADq?)GpV8g)lApaOYk-+|0~uGQ=&i{^OR zt))NGgW5BdGXp-v$=`vhT4Smsv2vJoFSE*sb@C0xlEutl_|B$`{-6(Z#WL$PVtvLe zd2#r2V&%&CWY%-UdXZU`yqJHPSoFt#peumBMH($4)*P^kroYGU^35YsK9k;K(&I!L z$EqS&)p%mj-wA@MXPEUUvHB@hQLJhJk!1b%Ad~22U4JA<+vz({|3j4f)*_1*^MxSL zJY@JE2P^OrSd^a5UjjEKU({lT7V{K5t%EAGJUs9k6S0_YOwOXtzbxVXGy(LbLGLja z<#caRmed;|=1oA&JmC(aOzBmm;t#qtSt?3cg_?T~I7(#tsq>C_&r`fn(WXcEw>UU5 zCxa8^DK2MKSoT-a6-=!#BjKtRWS)ii1({+Yb%LZ=2z^CPdWKs_lpt{y5+g_t3+XG! zg%;u#q`8HR5~R-T4p*8Whb?5PAbTxjo*+9dWSJlvEo7Y_&sa#QAPX#{QjlpDQY}cD zh4=-z+d}FD>B2Vw#Mz+yLwv5ZIBE|BNVJ7S3#XMrT-#ULbJ82QR&&z1^gW6%_9N$< zbm2x$PwNp(UsiYID!tb`vODl9RdJ0LBXqa8osC%Q$R?;*_C9sBFE$jlF{zx zs{F-+#_F-_03uh0pMVf`AL0tCo2Yq0)z*>GuPDRcudrM91+G==@}UMAjyYYu9!l&P zS8v*E=HCsA+Q4naO?yNvP}B0*g4MLi)e(+`M5SMrqMv?V ztHLpss2-wP;h0P;+R*^3f?4^*N*09(hni}{ zQ)ly{p|bvPT*Be#3;S9)YF|>}ND>PajuC9Z3P*SH{zCS?8GD}$qyFbrRYy2NiQ0jw z-#)LxaR*VS5!DLE*R&gT5wl8}^)#{W5`_qdnq)Z~i%=xt_)Vpc>&++aaIC|%3dc|m z$98A)T0>?1;ZWZ-`C_}lz7~$}UsT~3E*2;pH?jpQ99iW3we0<==TsZ-f>HlcRn-xW z!9?xH)ZI*tBkE+LTH)wGtp3be&#bqI6)y@A4t0m&aJ+;f3CAIoKCb7N+TmD^YZZ=l zyt}l~*}PDwtUny3%x@3-S~&J>P~jLX7APFoumvj|t5C6QBzu4KSrv|W81+A@syf1v zPt;LNEoW+PqTWYTD;&2I>mFvUVAfD#T`dX`jxZ|aaI8j=gyRd9KCY!p>~PG-wF<|6 zY%*c6tadioqDISHq}(s;cS; z$MZxjVCrj3?L^euh-!u75n@eYmX}%Eh;^wbL^z`CaJ-5l3C9O2eO!+&w!`rdu2ndi zLn*?s$l1I@>lzBjWz0Xl+7XU7!AA(XiUkTsJGNkjqc?fKh`ry1+PD*53ZwpXRn-xW zCPaOLscV?phN#yQ)e1)qZEh`Q*2B!|Myx1Nh;YQ%;dmZJ5{@mL%2S`P!;yh&6^>hY ztE~v()q4Aj7a9u3O6LDu;^03IK0utE!H0 zJU~=z(h&6trZy&OPoi4k7)C7YS`jOgS;L9dOcWv81p-=eBI z!r`Z_xlfroo2h@Gz5ZyTTH)A9tli8S%d8Jc;i>1z7y348p4$$`Hp(B~sa(#fJQ@y~ z`~0`Fv%bjg9FA0&)3Rd=RMtP0W-@>GGYK zW>hTe!rsq9ZG_`%G{S$8c&~-SOVqAR9m&*6qW-o<4@WAoE@4)0W*wlQ?IIQrmZ^3) zK0%R$BZE`9yEseXxR{;wMb^@`tS`1N%xU4650&+YgTEh-U9-}`AFW()eeAQtu^rcX zIOuzkvVrV<9%>^TyU+-KxOlIH<87i2Vyc^|TZwvTwH}V8#2U=3PRvsAeTP^aj(K)C zc2WNDU>U=ye33Xy;W(F_^+jIH;phf)S~wnp%KF36oB2eIwM^YW)Gtc(a8wX$9JAUm>l+H%tHk1PEVIM$ zDT*WPn)1KvZk)sKahp*>q+#X4bb9v=UK> zJIgvd9D7hC;kbcQ*$`(b9KX+3&iW#YpcKtJ2j;YJjDgDf!|^Qh3lMmX-(9)jdInm} z@4yzZ1?$eTfxKVN-rtDY2uBGT;XnAyS>bqus4JLy0aF(cbqi6gaNI+zmCX9%Nu}^d z3fe+Zh;WqJ;n;^F2}dtZ<>MZ9mcsEPuF-eCNZuEXJ?(7X?NC{NI2v;}CcwTHj*FBF zuE)g!-Dr#0f)$RV*flNN%-&za-YT;r5;rJV0-;{mH ztbNQnMM29Gg$PHr9gbrtl5m{Msr>n)b~q|(@N)e84oz3e7mGy^XE%V*5uZ6=< zF1YR&3lxr2wqS+BN8TT2@7uBWc`)kVwDPQQj3?>|rv8Gb5{#=vqRuC(6^`qO^&7J) znH53dND+kyhu;oIh#ihboXYRbwZl=0YZZ6!{a{{; z#)%cwBv-N+plFO_16DM)qheW0`~^0esMz^b*z~`ksyf!_i;3EbsWnfiXbdCj!=M&T z|DFHNN;Z+gne-Nu+E50K6nzLr9fCoBF~k=ch7ukqm7K;~=h&fm8P_Tlr)mEX-!(eh zb{-T4g#zEV(~EsAI2Ju%U5mxxhqCvz3spF7hEe|lRn-xW zzi@Lbb2IgQre00dB%)g3_?%cbF>4jGx={l47ljCi`ksKp5se}V$5$$OTq}$0a6FD{ z6%N{uMRu%pHm~l{0P|B!chr6LU65Epm20&3syKrkoPI<{rANx9Q|R`KV4OI zgyS-zrZROiQ!gdzaH3k_XiTgL%qnKq)s#b5h(d%zeM!RMxEw_ij*nIPxE9Q^!%>K9 z6^_SgI~9Mf!r8pQ(uTsZiuob1uZ3eP_z1yeVu8YO5nHglpNooR)7kqykE?JLQT5#9`!n-se4<(ZJjS)P_ik?Cc;X!%>s6d;o24cj zRD9otN<`P|Hl(H%uvXcSnl1n>Fd_SW1x^iov#v%yIP)w-jdmbYEJTfPASo6SMmYgw zxP?Rs5@#VXg7mPEzJgq6A#OpMTgWIu>dZv2-&e4ZslwT7A@c;;X(7u5*=Ql_1bN0n zN(EV9A(etmvyf^*(k#R;$lVsA#sH!*#6ncw1G&;dRIUSwHW6Gur>j@rrBD{6HAOGA|lj!9dYG@M8y6sZ@J>ag8fmc*pROuCIoy%ec0lRhWXcqU~tDV|8@C{i4g zULjI4lWt~GA0i!IKrwJL$wQ2wib*#RX#$fD z%uyj|O{51DX&jT<6KNuoHZ!Ryk%lW$8k7FO7Hb*(S7ec+3z=jPskydvUFW?o0;)e!G3#iI$IdG``8gLx-s zt2Qd$6N*R6Oy*rhyiDfp)_9W@kM0A^JBN5#%zJ@(2g&YW#VfIRKVX-&ESq_cFz;jH zU7&b$$6$SL5if^%Bbir9yx-2Y`lhBs0_IlKB*-={MNw|=)PdxndG5k?pPeK>QBGeyx zz~UTl0pgE7^a2`9cfke4)R>(_0^FC$F&_E@Fl4fqCt(O*_4TOV(*uk1B;3jvY9#Pg zf+yiFz8d987{yoPJPG&lRhlPZ9AD*l67cJ5(md6ZkfyGd6e9GV1oa9r{_MCCa=3)D z%af4L0;P~AVJZtHN_dzBN(PVlPJ5kq33a-scsBm!a_SoXU6uJah+}BWWtsY&s;@1* z=cbtS*LI4^TTob1X=cS=lA1aFcY5P##%{CbWn9x0L3h&n>vog6*aixlQ59UVeZ3X& z2aPNIwKSE%C@MzGs3PCpuKVyOOQ~!x${0xzWT%DX2vX%SIfa5;Zz08kyksFIf~>HR zje^Xxka9upwro`j(sqt%t6GpNEl!Of(H25~c$Hew%0g-dIgPoC+f^sX5rw$k%C%P( zui{#*EFQzs2!rQ?nU28|^(gCbz5~g7fnRft9)*q?hv!la*GREJtA|_IhP8nH0Ts*k z^E`0o5jF4qgyn#LC8}B*eD4tHD<*x#q&-BMqV&_F@I2~3-r)NXCA`7+lM1k_`hL5K zpWs?G@p5+f2dBfaP#E-d!0mgO>9@nUHk~x#_B|j5sC|>!fYrVta{W(sy(7C$%N_q) z=vb?LV~KQdx!P)N3^Us}k=saN)qK7mD(i3K7Up}V zJNN^Y3$E9*?IrG7TqBBB8{Z-Cd$aeWQ5#F!L0GK#|16R=sy`63j96DPs}Hl*5UYw< z+(tEFa2wSMjNAC@Od_~?i3jurRu}dFf8UaQ?(gguA5_-g#ygq+{KJkmj!`bSKFzY* zxD(fU8%LA(cd++UP#bL=i~FtrT(gbpSH^vamB6e7X3>hwe{7c3Ml}U;8$Y8354X|F znRKgoKy8d;4}6iUXcO8OJJQ)N>!Gs#HvY=|9S=F$_@HvZbtKbn8FMIzAYNL%yi{SmuRMl!@2C)_}YaX+% zqDXX62Gn>|w<&Jp09v4NKfcSEG#ggUx0e>mPeXapM#> zoVa?ztXLj-kmN}ioGBOuU zX?Oxw)**at+UEkZ&Nuqd%QG7q(#sV-e{9I$>s7$#!+nEu za2z!FTAJ{;nvel%7(56=t5XA{UZ1*vpnnw9UqL_9D@Eg7JEw7`sv-RbEgI56+NJv$ z@wD$^6>lfb67QLL3L}D*<7w0X`E0Vb6dX z_KnA|>a+o=XWv%@HB`{u3aUW+PWA2Myj$%%)w6HB_Lz}IJnb8z;_bu~RrvmJKsJm! ziG5Ehd{;)uzBzz{Y1M#zai#2=Mb$f~>hFRY_RYnR>I?v>XWwXoE>zGH3c8*_ZXx`o z@N*TR_Vq@K#&53n7yDLqFYS8>$8fKmSjfv1c4SsKAiq3#68q$e7G|bl`#u63Oj{ZO ztocbQz$-Z&srr?w`j*jR-^UnEolzk5?5j=CRSJ4bLE{+YKEhw@??qr*xjo7p?k%? z9T-ZTY>;~PEhA`@f;K5=4ugD$@E7~I!c+TJqebo8q21$)VZME9Bp5QlvnBz{HaK#l#Ut22H#{Wq2m?N?OcT?Q4P>DS8AWm9qq-FtL)nS!Mu1 zPbg^LJpxLgiPHpRhT|3lWh*F8L7V8Tp#Z^n8D$79w$=li5 zlx8(7V?V`C!xwEh#(o7N^;w2?<6Ca_eKrus;Z)A19jo! zZ|@Fy>?z>krBjRqdhGBJk>EXqpFle|shzKb8d=tfxzUrP-c#Lsp-wDcQBxH)5<{%h zSOmzsDQkd=`zaIQ1pWMRroYsSuqegwTV`5T=}3bXZh4a3+oola z*OF#hmY5dXYvGnCY37-h(OwI;NZB&ev<&oGxMj+gCrwK?uZ3HvY>Aqdrd|uTRN3;d zX*tzv8Ejf6nwA4PvcMj0xsqnIY1!(va0`|#cbS$IUJLhQ*)q(u%=cQjIm?#erX}jN zaHp0ncbk^Gy%uiUvSqAkN%vZ~hs&1ROiLHH#of?lu$n}@|>iF5<6_mJCK$~V^d{GrD zoH^lGrHSy*(YTCpM#BW7VPZhTekWtq2H#7-+S1)cx2@KwooQKhP&y?gHgaX=dTBH` zdP0{70xo(Um5T}_OyRWxLpMk1ob1uQn{Gat5~(LPFjS>9n}JFm(5!b*vuzOLX*SE% z>=bC0oBG#D9NJJFT1j*6FW;dx=+M7>hZb?k21D20>)R4`Xn@rT4(%FNdxA34OI1yL zwQEfD9NHJd$e~BLVsk@14PuN#YfSVU z`VLZ;vBE81a#2Kco`E%{RW6Wd>u;uYtlw&Ob6GfkHm$Sn@@UOIC|e6mYiyL) zYIYFW`h{s7&S|9OgxhOQ8r<&H`eyd!VQQ8MhYj3}m3lc+nw`pzZx5@<@r5$Ekt81&g z1*M7j%{q9kKjYeiW0`T~av$A}{Bv7q1~p)0aK@!?d$1E5;<5s;citMpo((K!SThWF zlng7X+`ai}V-Uu^tq2pau?1?(wwhu(nu$!Uo?2O-e0gFlqfXDh59XlE8%g0@2!9 z0FLg~*DU4k8N3vPv1Y7;aF+;7ehYsbM{|Yue4*YnMMPn{RFzgEjG^9#i%Pt&FIk<8 zD6Xl`cMWN&%H0}P?pa7U(U26yeu--h0Yh#VZLIBA`-W`7G4jGQN@m7$%uLX+o%unKz+abMje?#jv4rl`D-nb+yy!G>X)Ws)V< z*#Widmr{Ev6Yg47dmne-vGqu`hm+LX;eL#$fr`piR1>1QE6Th8Y8X-1DQcdgst|R$ zs3A94BbFCxEZg9P(~i7o1>Lb%^gypDUKM2CPFV!vz>Bl@A>u_S(Q>0P`l&%x2pgNL zc~Q*naXb5QbhSuAkdQp^IfgG(2CHtm-?^*cSUPu9QZI4|1v49UxET$WzR$ID>mv%Y z75^Ic@&ouwLosqKF!qFMJ`&V$$5Q-p_THxM2=;MY(v<+F z8-CQbm#b}>YVdGagLlBDl(xFBJ5b@jV4FN(T&7614qf3Z?BF;UzZ5FGP!;|d)KK_1 zci}r4g|pHRxd~U^B-}#7j{444c6i=L`bT7QSb=gOeWjCAU+v>RDM^Pg$);QBDJvzQ zbNf;{e-6Uf3e~xi>fDDqPa&zd(0_#}-uZ)||Hv(MJGn1WH;MrE-ty?Z?b(^Kr1Qd5 z{BSOozUy|%<zxO70V<-*uGz`|!$4R;R2amw9G%mNU`wyQU`U}qZMs0Sv_03l5+!S#w9_ns%e zp2r6G`o4){(RZZkum@ZM`qn#9U-v4D)`bW!kOT;R9wtg(V?&Kx04#bq2^X$fd;6103k>yrLP>%-C;BW=S<3;`#$ZUdm+Q zA|Aq26nlS!xiz5~#+UR$x}cDC5OQdmq$(c$i*p_UlcMhaC=WKKL;%8xVIgqq%Rppn# z)eZf#D#26vE~?x`RlXh6PyDu_#js^gN%wPC*iQZkf1E=%8FkA_ z(whuJs(Ym}v=g5KCop+Dtis3OQ(9e3(w7x~@WGJEkBeOE@7})32XGuzIZBmL+$e1w zsG)Kts(i7lvb=e^)J*dY!;mV^Q-*e;*5$~yunLt!Dwj^u7OM6|VVbXRq`Rz318R3J zrFJcG^pJe&*F`+jpG)|$H6MD9R zYGmbQ<6mAUPJar*T$SyQOHS!MMAHOzbjf1Ke$nyT-ZRx=X`HLI)!3gvj^Bopdg3EL0LW8>8s2esm7 z5LHi6=KaQ>5@kNB@P(qTC+dLsr_{$9`lBU~xZeSzA8WXPx#Hz07mfFj??WnmjPh+x zzO#jI>5nxm)3cZlVgHCD67rU*h+byiGu}9O)_+yD`2fQylr~kRRa9xb;_I|9(&Qc4 z2D=q%#2!)Xb}jlVh&?`#G2-62d+`MFgJq97_op0d7dlN5h4G4S4y5 zpH&pQ1!MS~?Ggy)EBuS)ubpV<8;0pKMHlN(50%J#ad0dHL7_fDG=OHjpk~xjGvwNE zM>V4`&@Gx0`l3SR+9X~V1`4N|K+_AwYJF(EEPW@9*=4Q;%)R=7xMTUUpd?> zt7Tp)*4NdWSBo?F@4}z4MJn)q6j|hQOA4HOt#L8fW?v)6m=Z9?6!vsic zSvq)b;OxW_r5O>X*(}yrml!Dw*o7*^8{Bv!gZr-Ep*pw?=HT|IIwIJ?7ZA$12fWfz zp}hzlWT0*+KEGN*QBrg}TnJD4{lZ=04h#=*Ej*`-r|-PVje)*GevtbcejA|2jw@@h zkp&my1@cd5&g41UG*f$b_ubnS$Ku{EB=nIxaJ?r`H5P$U*uAoU7){@o7VTGv!G*I| z7@ikaeH7(qSvxQGyTsQxmM#H>n0DVW?OLnbW{d3Po%rK4C8@WC_yJLE6eZVm?POm0 zc8;gJ&cOB_*utY(>HDGss`AKNS<}tvG5T?OoURW>GHm9hoQ|xcid~J095LIeig>@5 z8g)n5s5y}7`$Fckx-E2`!q`qb9`Yy%y!IwA=`XHXx^-}9*XzF~2KTcy~U6$H| z>d<_3G#?ibv(jNv75>S(q7pCY+85R2-qDwcL>?JLb9JsU2?-IEvJB#QIfydhtjml# zw70vegSw{Ogg4#>V*fgL`1Xdz(A?DHh6`$aES;K|iRzI`klrj7;1~z~3y$x(B>75JwAt9D|LMP-m zKA_PYxB@Lz2)h=9D%QESS4Nk z9<>k0uod^4OIAmkhWVv~A3n5k+?#iW91F4@N;W2ZFJ>cA!+OF9V$I4_L0-*j0YZ0I zv?s4)+R0DgkMq?P(xc2!WD&*rCwgsTMXe@k2~lDkzEX>h!r>G@H3eDkyc9$Tn1YU< zf($_~Bxv*i^q)+oZXO=K+~grSNFF+phj2SQ_yAi|kC}SCcYzyjNqbjjW=VX)^qFX4 z)f}2Hv53!4ct7rMp)Rd*fIf+CcI@k{Q0ObXosW zJv7O^Y{p>^>nWw;{jY&)IRR8~;cuP&s`n#~A;;VNIg04V{#19q0%~;7-|)w2M^bOd z+d|Y~MNL*zV<_lU6#<-Q=Q+7`+zwju-^Pf3`_M;=FOGidb<;|Wr`t^jTy~P-;!I-> zhl|>3j-A+qS!_r8h8-{-JpMfot0>)^@Ew~yKnL#cb@CneDvrf*CJzrF-m$v6)i4s& zaNG|3agOvODf3W@>qpFgR z5RUZ_<3itm z!*Q(slMWPl2|5P)>X+d0@2UEO(iMkqe4PzC_^gVNMF0KMA)KnYAdKCho>{H8w6=wC z=Q1JnQuTkG+1!K@ce0tygEY=BnumIyY-V$7*bAQl=;d;#ZpI_OOjb66eeRx1Ew$B7 zTqS)l(kJYlao|^WR+>wZ8Uz1WV2K5S5&bADzTRH23xs2evj1-(`|J2@h z+%_CbI9!?C#URU|Ni`_-KxH=F`y|C)F2DA`$Ivd??c1y-^VMDMj# zL0&PO4Z_%G>b*bi5bq^}iSrOiy<#|;sLvI(Nl~MSx?WLc%dj6&UnuHTMKxq3BBF+7 z=l-hyYj&m=`vW>;dTBZ7(z4T%BM`oS+XMQ`{Qkd9A9P}WzY1{9Vkz@-KDsKJAHQCI z>eT)}@RZ5$5PCtLSZWD2-ct>ZG6Y2<5(QGTgpIW zI@Al)pijUf>^Nk~m_qbMcsa3HX?6||(LBa9!u5~VDur&_k7G#j)}&iO=za-(8K_Zz z{=y%p8%e$0@3)Dnsjt$t71avrISoVrS75TR=;Ku)tpB@uKm4-P2?Y^lN$%*@vb3F6 z`emu$5-BioMfLm%nasobqraHS)6$s3DQ}XRV<+xs?%R=pVFyIPE>wAHxCsZJ9aEAe zw}pImHAuiXua)n!k8mtLGo#%u5XLT0Z%hI;e3pkl&Z#8zQf&oM?G-gpQAdgTsXGN| zJ$Vt=>i?&Hjx~Z;Pu^l6++nUYxR#Y-yv$c$SH~steje-B^ZlILiDSvRVkvl$hEOn& zbG^aT&pGv-omgJ|Hs;n4wvm`+Jz=;r*D{s6*F}pUB-U3w(i7D1+Y|WXe08yUEdiP{r8r>=|AIGOpmDPXNJw`52mi^5A7@D@Ecvxj9Ze?_mbq# z3|vXXFMBxt^o>p(C4X!@yTA-jN@$)sIiY#K?1bj&^Aeihur#6hEjbCzN9HFqA5)mn zd_pmvgDKyXS4-2PQ!zXqZ<~XR{Dnosj+}N&$g^ux=pHL#l&5E#tMZwmk!}TS1Z`}% zI`@}h;@o!NETcEry#dn#tz@cmS%4A&@&|E>?pbee5b1oWh1pqKMW^2zmq$3HmFPo39sEUD93 zMv%zvp`m!y>4wySRt)Q~vv4ZmG0DA(WeRvVWt9|W^(jaoyt5I`(6>_I zUI9M`gs~?yoWI{JaqkQ!&P0-W1w4+ZY(;&psF6fnD+2y|0lyz5E?mGHB8374ydD_R zq!SAGjqr*o;CD3leR&g(#g|=WSc%Mna)Ao89#J`I0q>(E`-X%_W`G2Ks$hiBXGfcf z5U&um17U2LdgBvNqYzbqT&Fily#ij9sCN}LOHrMOI$H#20so%O$m;((J>VvfSHPK8oU;?JRP4KhLw>sf zSomt=xyqe>Ta9A`$IG?OAdGEPk30fu_-!NpIJJaSHexaGw}7fxoS=lrnNa`!7MJ8F_Fe#i2lD?m0v0#*P2Y`UF+CIG1WZ38Y)(Hg^-XtkXQpEBzcFNbW6|Gw z%5bOYk0^I9cP4@`R#9K=+Z)s{{VDu$zUd^UGib;i-sE|*+!>eA=wDi|m&{s2r@EQ- zs`&wJO3wD}-iKqc`!gB+B2B}#q^m+D-t`|h>N^xZ0h>pG3U!Xat(isuP0vyRUewos zFxFH}?+XrCMUYclK7SOc2tLYFGJuWQzbg(!0&Hb`aI4h$UW3cc$A<2{r~{2?%6=?okMB_I!3s6cbO$Ra5&+H_VZx{*LP3{aZ_MNM2~Ux z9PgG9PTZ;Hn~U|W*kGMzWwQzBMkW?%);x2jsyTD=Z-!f6Huk&8Ivh(kdB#-6ux71{ zW~I7`-jMl_lC%pC=6{I+)}2NOyUJh{;&qkbERc6oVZ1`0qlBIO8pqtF#&%SR%o0m( zPvdiR?ic5`>G1p%p;HZ%L#_FGK|4$$A?#q1Z`~doi*?^itVI|bn`z~)Lmw#C=uf=~`(?m!jZX;xzX7Rz5d(eO(PkDWC|OY31stzz@k3&-bZ;Ir!t`wi6HWl9`(Wrw|%b=zf$<_+l}ka|q3xkZq^M67 z)dW^LV-&SsQ7lQZj}#v}l5&4p3rqQ4S8l`+VX1{NU4lKLHSM zX>~v~XNIvugmR`G*{@S28Y%lNWWS-U*j^IOncaF8k;rp~Gqll@vb6$ZQvuo|3tI@|8uuGtLHF_m$VqIW)3RcEG-a3ed7X@aKi`^MNlq zO>}^Tx3DlnG3dd&_i(4Du4xjcex|C_2~*z!>Xr4;|S*}h1&8(JI3Wad;Nlj~fs z+u8Go7G~1L^RI!F00mAaoy&st;;(>kpA7 z&e~Sug`7YIxSY@`x^4aIbpm~X(Afe_M}JI(+L9*Es%O^2wab`uaN{m@D^Tv2dH_ye z&dI}az?K-;F@>Qm&lxNQ3`}t&scBx(f=mB|DdnL?Zt6FTMvgz-IL_EdQw#Q*Yy7x! zggd`N$@Dn#&i$Z$Gc}?g%yzb%Z=xu_b0=}?jutJRN0M;>oJupIuyer(4oXt+>Xp<#={$bYV^_K z#q4#{v|XEo!A+`HAxSb>7NVF$aQ@@npDeKYZZH6A36k8@tzMY>Dw!MRhyM|kgls38 z5az9=!hBS<&dHiKnXyB{XSsK?(`S{9p1Yd+oIVhpt!Z`r3N#+aGS$3;KE}5LuL)I( zpCH7qKy761;mhaTsOyBvnH zqaI^i%{IN`Qo~XQp~ccata+xfxi%K>{emYXr;W%DpkP2`wuZz@<6>+~L(!6=n=}gz z)x0p(bxMU?L_6*uJx3J9PfQT-JInoz<4Jn#33$Q?fZAC6J?H6`=cKzxQ1#N|z%=3- zrPIEjAUoM&GQgip|FM$m_^H$u$C65erG7@Hq=&424$S;iI$;fbs_vJL4@c(~YLI1p zQ`;Y@HsH9dHSjN719zb7?Z~B~LGrWsT1rq|D@~@_nX?GeStWtwjh`0V<&o$~;nrTONqfR1$o&pnR zsgUwwCRRnK$ol_zLhn=PhYEd|(5VI*T>py)t%Egu>-OMStm~kvHVLab08IRzgo(_A z5`C1Qr@}jiYj|U|>?tFFmOY{ZJj+^9-6vGtDyr^s{Bgc9(G6I33Zar$cH{@Gzl#Zd z9Z>Hjr{8l?_@wfSDQG1@kGR=lPs>58zU1^1w8(z3b67f)9>ro?st{A5RJXZ{*>aVNn$5Fu$^LgxYMxuP~fOBD2$f_4%#&hW#B6WCAG6@_R~SL~Avw!W+GyW&e6iz~QK2v<}E zIAB|6F!Wu)q1uU#*^So^MEmXNff=2*KY;i3D}x&00)3>3^nlxqNIK_673nRx9^u+} zqZ;$$RpOj%Fmc`#(o`qloa+fScYlAN(8+{m0-8Btx4x6T13^*{?Z{IKIzZ5k0xDEc zO@h8up(7RaBSD=6v_nDrxSZXrpfm-2Nl+aDnJ{1!i23&LX<*CtpW84vVCScr;xCot=xi$&u(7&pm zjhEn9vhfP6m*J9$uq{CK2B`dOOk$1Fmv-2R_b9?_1EM0j2E zey+?bbHKpsHbIT9SqoB~HbNSzzx@a`Ytl{%Ek~#YD3_MucfX%W^r_1DR7GD3CpcTr zl)NaxE?#}Ma!!Z4Lzy|4SIYi27xwuAv)UTfc|D-1s%|Gv(FOS6u(8uYaT4#WQG$%i zL*BVTMQp6%duKI{gWh?K%kZXZ#HFBycMjo?Q_C0;=$n%WJx8IZDReiXdm5GH9a-O> ztLR@bUW4&K`tn1dnN{$P%ox-=*Ptonop%Ig)i$crI~7%RJMkN=y5Z685FW^#QJ^@9 zcesxSf~%oMfS{X-SX$Zl&H@|)ZZfZ!V#q z0(xTZ@H%Vk5@oze(YGSl&K$!S-s#9z_0EmVu3+vwBQWcaN`BAUi(~0oC9?Y%IXi6Z z6`=6F6Bzv)sBbz$iGXj;QUT8x0qj@PRDjp7l4t_f$@FYhH6eySPQmFX_~s9;{qaAc zJ1-O8yhi8}K)oR^pCIrg=wk)l%k-LN_+iL{NoL5q9W6TK9nl>BrK0bO?{O@yNLE)g z2;0^Z41HI~kjL8&S!ja8-6$n)3{?V-sUq4~jI5AJM@d(H(BbQj{mLLN!~~i4+o5A#e8;53XarOi*?XdWQ`E!b)~YpVlncZTVSH zfMdymMY_LG8`=f}c`I~&r0jdQ!?r%UB zSc8oYOpU8l2QM|oa~oo*8dlIp40{AjoCQLf8cYpt>c-wy=n{pFCG-J8z0_zy)H{lL zR8em+fvyDV#MJm3yF0OEiXN!w*+e%r==@M3Z6f+zMYm9NCeerMv)7vMqP|AZdkU(c zpiu;E28asegjkLz`h7(g^cMTCAbNp8FAt$FBl-hHzozIEqQ{B?>vam(oS@|jnyR3- z1YHgg(h8}^saHFk3WTZ$8dr8?u0O|K5z6oatnOngm0^2jSe*>xlwnDXblwGmhMt%_ z=LP94C(m&D15aYrOsUU&&q~LaB*Xn6$?X-`$gY{vMp5ha+mcLrS@Qcy|AN+{{pI|m z--TmI`rom%h24!{K)~+4^@2(7mA>#b;EJ*h5^2^eL|PN1$moZSFlP5y73O7kb$V`> zdhRF|?HKYGgNc({S3(iY?p;tXwp*c_6grF0IfQ!Iy@IHp6!og2o?#yt1C)0ScosoF zD`<*>CJ{6Mpi@5lLoH@X6$b?zBih&Ej z#93WOJfwTFy4!IRp|uqHnL?i-bS9zRHQ-J})mGF(Mg4=McJ5J>xdvRDs5*+8q^O^X z>Z2%gdFoee1H=*)HBeDs5Y<$a>z7m3HQ-g@9#jQT&6&aM5TTrzPWERg`=hC1`%<#c ztu3~f%9%nvE1UJh7}}HN%!Oo|q-^Ia+YGY3TN&hVa6K!?;KXadhp_06HBlCWmBm1^ zXsIj$d(~B#$^U*0coCVkP-eB2St~O8p_Z75)nuG0x;Puio=sjms~)mYF79oE3g#Mc zsbcja@cuR6AuP22b`7{vSlSR!>owpHn6;QaBd5$&?4PidjwP!Fm-moB-O1{6hS4y5 z4fsMm3x)HXk3W7WBApc1fudB^9}q5zX+UTXet~fa_2ARV z^-ks5QMooJ*YeaBl{h@RZKP*0#mIABmVOf)`vX;f9aguoyOr%uEGOZF-K=y=5|nMI z>MzCgg0f6Xd?>Zas`8f~`+ts_*!SbA*^YFArhx$72CjbWlY*NlcPc?Y=nx?2AZl2P zz}AiU92Ma$_D0i!s9JEQTJQz_I7QWs1^y;>8ljIV^iYZzyMoXhKsf^nZ=y6LI!n>H ziv9_e*?Gz^#;j+aI)s}j+gP;GmB|NvW~-AWFl*lt-#djkmMPFAuA1@aN!Zw4pzys@ zgWl0?@O*{0g%SbZG*kguMgXThlT?7`o2?*>EmRXuQ4`+AA7@jw6MXXqp|2>kpqu#S zB|;Yf>MevHC1{a?mMLg2%B(ZV@WVnFIcXNcd(ff_;bO@~YiEh?im!1juHcpqTu~!z zTURjjT@gx@OVk->Lwvv))kFhpq7gx7+^ZryXY{7>t5o?vyNZPiz{FWy^#o^}N$6^Y zex}f82%QP&iHULmCdAe#`gukFgPP}zFpQBX*K)e1J0?e1)q{z0v%su1hkfsSfMfB_ z)#{z!!8KrP5-0-RiB8~qIOZs{Y8d**sWi^I)i9@Dt`p{&6ZYvUC6n6kQtf|87Ps6^ z?Oz9FR_ZBrQFhtNt~=Qc5=FSS*e9bCZfVea9@bP+ z_v3ecmaAp*+j{p;-yMr_EbjOK>v^cN3w#6asA*Vx7so>R@|DsYx+p~RT@~@mWkw49 z(p{vS7~aib5KGY8sXqZ1l*maOCms_P+%A+6kwxG>jyS>CKB8jw{NWq39mir!XH~3j z*q9!m2*fs6BBM%hUf7b_Dq@NeK}+rz5hq&0U8-0!wd7D2v1B6(w3AcWguoua^&c%+ z#~~(Y$;X1R&Inji)3u}+J0PIx8&>Q=Q23TeIl~km%oE$FAw!@-AdJ0L!bgYHS2W}; z9K%;$7p_MG%uVwbr~y0i$2o3tC@{M3gHG;U^OY3(C81jg^`1J)CCc0?|6^zI$TJ)f z-gJ}F&aUKkU7ZK5)k2eKwB+t@W!2J7yjK0t19Ad(-3wm6A5sueUO-Rfu3o=_=$I{m z>sZ$)gEVLoV9-{Sv0gstJLXv&M{8uIZb656$AU%dgM9K=M(6bPjJ-_Xzplv8%GMf& z?Lb3cVagY%ak!HC?uVL5osArt)=K0cWGk@GfDn%eYc>YB6M~)9D!xCEEmf_VjorcThG`%F2 zz60(92+=lI*xZtuZ3-lQqcmc_)BoL!zeoAM5kuUM=>P7>-vj*LNMGFlAiu4e2mGpL z;aIBLyVx^;4^m)Ezz26RN1>ZnqO}~@iR%=8^@SmLH-TGAi~aOifa72(cmss7W$L+R zphkK;fT7PhR9+>e=^MA?2EWO~zN^?{9RzzLvFn3a*j2xrq0LLFfp}rWw$3*yuroAP z73@Uri@?S~VWl4fH@`E8fjWI_tnhmwIpC7(MY#3(e&5C%97k(-v#rWhd$X#Ys%o#o zVByqs)wa{>>t*(}IIUBysoJr|8m?6PcHxRXJXy zjcV_UH@R%5;p=dR5dKR%wFhhWy4-MOlBBw7_fS11hxK?9+{#otUE$AO5K?=R2)By& z`D*XRaUi#osdjf&djyD)B&#?)M|`zAs@kh@TD|?M_L%1kSE@Z-xWc$Eu$uvIe;U@~ zaNJ4M{$Alfv zja+)?8j+jTuRg}gtTFO17Vd?~>W89@`4qj0Q93Jq3x_P78-0h9S?T%y3HGn7^d$d8 zA9U5M^k)8v=LFHlKQUVn9sLuPj#0DF94rznYilQCvN#JSXT!+lG9u-r=9s^{$%;=# z@Ny&n7MQ<<<}bJCdA`{ElKU%z{co z0AWC$lmMmzh*ILWsMF>e6YqXq9lCmIL|bnh1AFVm0veEy9?3 zzBuhnI<2P4%?Ug0J@x8gse9RPZFQP*6f2({hn7fh8jpzKFrBFJ-tLX>M8?DPIZ2 z%Q((Wo$m#9wMkDC*zAA&z+Qu>A+YmH1$LDB3MpQR!GZUtlfRc7Qwm+j+L8A;!vmt~ zVU0E)G~D~Dw!1N157FjoSX1nf#5!wC?`a`1J&S`&vWgS~+9Gk_g7w%~QDFmdXgQv!8H7+Ba*OwL_H`8FZIH+X=>jAF(XxVRUFWxAFT-s;$cY=Am=_3RAGfdKb62K$F^Kt4*bz|X zrY;~gVlQ05UwYIV%GmXOKD=+9T3v*_jo5YS{e#WL`#spBRw8&{mXFk}AqwkL zVZ)8wVi;_?6xPkEGz3P~5BZ+Qdm8*GEk*fRa-%0*7cnhYdo6DG&NeMl51@j+mWniW zOiL3(<0*%S)lJj6nl<@>Oex`H63UI&NV6%)#Gu$T4e^_rnWnv_=~BN*dm-)$Gfgf0 zrjCZ{Thmm-Z%Q#u`KIX)2E~-o%Fq^J^EzhpP^X&OE6_1NK@&RWf>IrGtDimd{4O}w z$Qp6b%e*u7 zbzUZ%WAL|XLKpa%aJp&f>$SL%KRMxzt8VI*Pw6@Z#htc!tj4KWVUG<7_6{m-6eTGVw;i|wj>&vl>kA0=C zdcLW+YC1~0WAf1nyK1r#I|mUe<*JT21-E$wc4Vjlch$sqd{+%LE#=+VLs!xEs&lXgkCmva?mb&vWup!|T~%&z*i{c1v7-dyTJY%aTeOh`0!sr#tuQZs1{JZky?mawtP6_5wG9&nZ@I}QV$^Q6iZ9j3w~ z(4oXt92aLezeg~#H0#h}CR}#pThlZukdTM;cqvKh)8o(y1J+VZL2nJD_7XQ3fUN>a zZt5a0%sWkrnhB11)Kt_P3o?XxQK>LLp;~8qkD6wCkDAhF9gUv%tIvc}U(wS#V~4+b zt%+k33y_Z(rJ61^Y%W;nH+|Ep&l>ySuXocSt6QP2cQpOvEw~a z_^dXr7kTSFd3jhJ1mwl3JZ;Z&E>;=qDKFy5a~C3)7?zNSIjWIYi9HzbbF?uZFK@OZ z4~L~Z$2PfJD9`!6NRFYYOS$h?F~dy0R;d}o4ckrHSWv`|Lty0O!~48)aA8p83O?YR;UYmbT#u1;?hrIq>A*)`N776y z=yHlHl4P<5ZS@P-031sJdyA_RJCfBXr2mIt<`=Le+-ATJ6ypIrlq=m$vJ(@zL!zs| zfaQ}UVXWeB{BpD#$K3zjS8gnyBKsSg1hETQ`s_$lq$h92A14Azow*%OHCy6QYuvf1N6RO*aa^XpedcRFj?-`~aeS290d}N%Sk(hYJ@4XM60boAf|#vj2QbYJ zSg84GwJ?IXZ+fN*l1|Sk-Uq_iom9+@tl=cxPM+Hy0lHfyIx?nIk_U+U5;{_$vlJR7 zw19OGyUv}pFvNTnSR#Y{SD`J&|}A!*273c zKH*gYHV9DxC%gTrf{O?3YwGyZw)l=uz_B>~GI$(5m=X5i{ow6)Ak_E?2&vowaiiiV zVZI+QB#pXcSs#Aocbg?Rh6HaPKNW(x|67Nio&4DeC7s*`|huUoH*ObR}%H2_{V)f$z)+qv;?fm0!DA% z+{t|OiZ}W0hu>qYE6{O{@@-7MJ%w-Sn>UB(SvWJ#`AJ3^Qw?e$I}3PrQ}C=zucd#O zn|&XmwACu@e3h09lbvlpX^u$8FxYfr*C;k#vCD{EqF6rKAt@x)NNxmPBZbeZ^QGSn zD&bhVK^}~PiPOO-;F){C%g>b*0k~?$uZYS4<63)-N#bkZElNO?7gnq9UCnz+I(2rcGyxtK`-oRYrZQXnm z&19BnoP1AD!rh_wKuy=t09%$~JY%$7v_==xS0hCsgQqhzmB2t=Vl>X2zCmM-DY9Gg z$?I0r+D%*GHoQMcs~wxKHqF^Pby;f3vh)WIKzLb{J78=kF=kbJrIT=!k@+U-oL9$R zM95=D)F*%GPWwY}jk9Q%xDOSPskdGTaeoWF22Hm8=&s=TLK;zSEKcFrBfzj=z~kM7 z(t1wymzbs@+9V8q!f|fu4_wx4$2&!GuxyC3|uot$2#D&RFjQ)p1> z*9dhrLg&I~uGXVO0qf$8eo9AhEGa#VKDHwtg=gk3K!~5xoEjl}x1o9f`XDF***jYF zv37sqXKw+HdH2>nyo0wQKIoT`P}C6bX6`HD#A|bU;ztknM`!mY%+BQNe;E8U^0li? zVaaN*p-Ur;o%}fdIQzstYorm&l0HPlLeVy=D6=b|=mzzOe~*qatFxl#!*Kz$`p>Es zFe_g8V~SV)zFVMlnq6lq^nym#m5`KGz8t?-Xj_+3%lQ1`g*g6Iq5+fd!jHY~k0JQ+ zqx<73{MhdPpl7~ue|VnB$C-d<;%SIo?J1VF!Rnb-q_LCl#UE#LAtP^H`MDqMo;a3h zUj`b4urC=l11Y-<-iIO-fxDNCXVMfM4X<_|R{jS+^8>yI#}aS`y8-^W7hx}#aeC3Y zu%|b5!*GF5soB;g?hjhp#r@$~N;?9U)}tu9S|LlCWV;>dp;s5D;g93|AeN3WnlJ}$ z5KWK+k87#DIjnoGP@HJ#3yOX*+zVzY|H=VN|K1R=v=J?>N=qB_Ju=OU+QTTD3esFg z+517;v)vZjKEwUt+5Q|=4dg$C+tupOcA3B1ku<2s{Kp?>-}hqsNa({mXC(hcH`tz! za)&728n$MGP@HJ{YDJe?(9Tu<)eL{mj^l+t^1n*LqwgVa!hK*S)c5+pW3utBl>XcSCJRl+(Nw0C9^Y@%~{sr^}g4Oa4da`brD`K z20YNWt`dq9z0M*A^!Z`*Im&;g;ZLt;34f@|zEx(%^>U4)4=#3p&<9=IAM`=Q{c(a1 z&O}SV2QTdqA5@_a>T*ZNj%++nd{7J8I`^^}??2A-eXs||;)D0uqwUB(zym%QAQUJ1 zV7;Q7htW-x|I>y)eekI8N9I*7EAuKteJ}HlAxvK8F>-;-OJ^H@o6PI${x+F+iTm4R zUPt%0$-MK;Z^^u-?hktX9QOykey;n2UT^OHIKk`Zp(Wt;7Td+^ThMc2*QnR8ZBB0{ z&&40-*tg>K3Aw)4@4>NneKLES9T^K;!0X=%#fe^*zKQpFHVdKOQ2u8a{`7iH;a}Ex z*BYvO9&bVmO<#Y-cw9U*&;3CU&2oRxLod5O=%K~#j}tt^mVk#UQ$@Slw+OfUdB6@Z z0v>u0f1Gc(iHELV=Xj>SXIGWYGsRbiW#3&n{Z%2xD~=Y~A=nDYN?t@5Xb_T%`Z z<6a}zF4q3j+#js{4c#AJ?XMfQ^h}Dft2LvguWByzg)*=-8-JYQ08-?OTOMh1MqH{u)&Qtz11D0B@rQs>vWYz@^b~Nij_lIZJ-R#-^kd{Wi zcC{xVG`2y_8Ux8N>qGo;8mQRk*7yOOj$;X6vMTy?Skc2<>4<*~Oa)x>!VqfwM$|^FW@zo?QAG7p zlv#WCA&=<>yfcO7%zQaxUA4;3qBI;! z7JZ-{o1HO`2X7m{c>9OJovZ~)lE_T<-8xZ7to=EDE!c%)2=R8Zve%lSTWQQRJ6XFy=)O5HPIb@4AE&R7rs__Xn)xB2PpO$- zYvF#A(8h#%z3FM9bO4ULrKlKDf6;R9Wd|dPl9#1pe_c^85%snBr_@f?473D-w+a~D z$*RX(@p{~us7;CFD+z2z+A80>$#;VAExnU9Q_o88I8A!5=^frqmK8jE!cNvABw}o? zdSs0j_&Su9V59|ivc?fB-(I&PGZh<8?5@p>5w;|}$8}50^UFuHC-nZr?+IOTEIpx` zRG>&rm>BTPBJlE;{lRX)c`94e4;>fM;V3+e6dVLqX#+OWde{-yY#1kdP7xsd1l5-rA1Z?At) zlevpgmR+Z{Dr+ZR2Bt8tT-dx>U|Gr?`ozl<3XcnqMk7Q6>)VfgZ*0VI&>Lf^{5R^2 z%_!%n@w33hX=IcS6oo#7ZdK?ag-#~)U_P%P9jYe-)Hwu61;yoC1+}2dHUh-^^m+5O z{aB80NxTp(>WXgaiZ(`5y5elr6#L;wD!Ae>xCJu92E$UWFkAg=6n_YJdj#+|01vJk zKk|LC8plCjyavM9?`mMK-YfDrggUi^6qk|sV7q3C0!I;5yE zit0y?ts;tJjlQ`PhsBsEbwiWMjKP}5jg7K&N1`fgC+?Oa5OKohO$5tQ?$FHmL*YM% zZ8D%15I^~V>0dKrbXf=h}3cZ!kZ5t&s;wG_> zJx)+{1r1kFI$icIK*kx&8-19gCt5T!nyM@68cpenDypfS*g$RjE^OOqFf7v*=P7)9 zlTc#x5c$@7ANsC%6~{qWuqegwKhtmtsL@GAL#A`&3spVfil33v932RKSfSSwx)D(C z5u#NDp`#FVgMx<8U#}W|$O}$6)D>5uMP1QQyYs0=Q@Y~#a?up^0xZF8bJ(`wU|7l( z?)5OmZ)zO!MMqJ@?k|BFzPJrSonJpc!50k)y;PxN722QB z)r5NG^AOTL)>Baf6g7e#n`;=t8HMaZ+DUFelj$T~G>4CUpvux6#W+Ub?8HgzOV|q! zn>P?FeRpu?fypA?f#g54;Xo1yUHYX-A@?*8m8{2%M9$AAszmRG-&<+T5VhuEP{Tbj z+Pv{IaZi3ARk{#*vqG;?=sZH_yHNMK$maE+<)lELhk?%W;6|2~=mOX|8+4r37KnoK zd<#!MVNTzpd6n;9>tO3cru9m{RpuGI+93y*sxE8(?6cd@A7qgUH22AD!XoebgJ7NASmDXr)&xc)>)JOI1ZZ0z2}K0r$~_LyJs{sQz5j)JB_x z!Miwy3A|w9P{tOfA(Tf(JGh6=Trd&n2si>4O!oK}Oyu;#ssgs=v(3bSvN{-98GdVy z<~>`Rnbx{mElDdY4h>cV)7sIel`&XbE11@A-9X#fg+Av$n0m0|7_*FFv9nox#9z3% z(6qjww4(nzlAu=RyMD*J569B+E@l6;BfY~nwiJT5-|>><;CgbZ<&xp}O5tj)ea8>qavV$e@|Y^P zF9{wBSlAd!`r%`J<#h?*2E(fX+>u-=XWec%Gh{a!&dC!nopTD1MQG>DF7+6qHJm38 zin><&fIiJ!eRzK!}h@D3{}iM}W&L;bK(|*z)&M37z*0*Ho?- z&6VYC63yg}G^QU(dB)|M-I#>)RSpRX*SoYxUmG~O}~E@6XT`WA&zAtw^VO8;r?w5 zxx@f{%*tjbp9VFZHYDX^crw;JOcZ8aL_MphN<>vr)bhBDf$+|9xUd;r*cU&bu(%K> z)0)AB`6qW_dz1^~!i|$BY>dm`Ll?laTBH`pnaiL{fd&e(NU84zYO#@mlWFz;UCKsu zStDf=0=4x`KTx0HSUS6Gk0Ry6<*fZ02^6R%Fi;n{ff~O$5GdAwahSovLxaNPe*gx7 zw;F-00oRE@Q}2tCxbT@3=v1d*hMAUE9&a#;i_1(ciAN=@GVxp8O|+9!(dtY_+M!}( zPB<1P`%_6=W!|U}I)tGHaU9KRJ{-cAlTXyL$TiFQeu;1RW*m#*t1v-_=1anZR2LA3 ztK2rlJs8H-Rtu*X&b07;;p|#?Lum^eW0ELk1KDy>>BjPIBTDlxcwn`3`|kHaT-rU) z!{QbobSkV0d*)K8?7ndNTOASyLVf2l;GpQHH+*-j!LhjGcU>2~0C=D~wFHIljsfhM zrFtZC;INWj8zw!FBf@Sr!swx^RhajD?)O|$J*^RJr+Ti!ALkVzMdyMy*0DLdTKZa4 z9xB5FzBx76^x`Kpdu`@~wQ&j4pGCkwseyl1f&kw`q^TZRvp`ps-aU+xUslP>btW)` zl3Tixvj#NFN?jYDgCy07_7y0dxO=M|Qsy=q>R&&o@@0dAb_M2dD>a@-dCQUhey`UVP2Zm#1+o z`NB;p_~Ne9LiutGA<2dy7LD?5(ddbjUUff74jt6BTAeVvC7?{h^$()}bEuXo;N{S_ zTtI!N?)t4EbxQsVOq`pARC8$T$ALt_eaq-xYhgSlwqbEyK@-TK*7UgR4N04k6y~U~ zhg8@K3i|^gchiOIGfkN@;dGSWDYM-qfQLU~vLN0?4@x)~eREG>P4YgdyqhZT4Dz0> z>BKRBnZhyIJx1{RVXDsWl%6c`pGlY3RZnXsftzayQ^z5?yf-8=6Vd|t+))KeLX3}r z#5^ujRLMO`!}b5geojonvE)Q6tk1yjx(1<~aNvC?jZ_a0`fYIDON%5~4%mq;lttAr zi-p3%s%wNY52~opO!pP8wYWAs6XORI__@C1!5A=cu2bo7Rf^1YlAwzIKs26L?|8rM z4@Fh}mQmdWOTQlFgXQ;N7Ys%jABk&=i};Q2Vs@qOf!3={E4o#2+?ek~15*&XXj4fM zMU{|nkY)>(l3L{&7zBv1IM^n{fc?0fs#>Qk^5by$6%z;U^T7?9>xJSl7>xW{?mGOa zV&{ah?I|?NS_qEr9?)#%?m2uX2xC{O!^eOc9q%6a-Py~OQ6I~k#r0u*8fWS&9W1|3 z7c01K*1FV^#F$t6?l}5^VP_Ck3?k?bR74D_2`UvOFV9))QsH>H99!EK`kwj%$C9zf zFe`?q7S|1Vssm)Wo_c8C0QSk~3e4D`+I#4~$D=clRQO>p#h(+#Lq42`#;Le&d^~q5 zu9+N<&zp*^?c)e6ge9(5na#s8S4+NF7Z@#>;^(TCnIc+erEh@NeV1w+7{KYn;d>{8 z)R`-&oB}fm%+ly=O%z~10{Z~?&kAy6s_h%x_AKjy1&!nKgl_L}D3T=(!eG0q zu)GZ0Q)vqB-+&(rd6Z=xna}uTmYh4bL0Z-fJvmi_B0FJ?>p}a^{wJcg zBOrm=JQumFITg3J;s1v!Ac<2|n)#}H3Bz2i|3#GnVO44dRCz)<(5dhW2DC-Gl?(J7oC z`*LIOeQGx`16DtZS!vOz|KQ;LwL^+6ea};@sI5z0Lwkz(#?~KUiiti2CSj(_;uF&q zk-^fz;wP_QJ&MbyrEI!PWhF>>e8MqyF^^y-Zp3hrOmCJsrf-`%bdR+MQ!o}>UeGxW z>xx)i^k7ucyK73F$%azSu6J3st+fGYF=nx`dJ65K(5ZwjSLjOt=sH5{E3|<^A12fW z6z^LGGPC4Vkw1sX28!HYL*!2;a;P#L6ks}v(1r?KtI$kBJ1X?U7ya>J365oaI2|;w zY#QK!RZ(3~B)l*E7&9-sV35I;s;^CWyag*Mbu+ z5Jdt^MCNL2)*PNjt>(Pod*=xpi+8%p@+5LQ_yoLD@{Wwyfjin|Zl`YOqa-cEBR^OW;CU(pcIhx77E0~rt{d(VN~y$RriWNDo5MKN06B@(7gvMEGwFqRs;@+TTKUiW zrmV%Wn6eC0Z3Oy7T$>D-az6BOCjy!K+Q1IJIyQmLa?;k#{R{ zZ#7|Aj>sE;#8R$YMpG{6q{AG=WIr}ap`R$UBBAYkraAG3Z{&Qm1V*1m!0^J&-h3H) zsOpIWEp`swQC6PfDK-n25}C0jOnF?YH0Qcpf&Crs4b@~` zl;D#j=zu{c&KZxH9>D1a96#o47wn8_u#y~|fq)cM%Py*tT~sl-rUSiruf@IGPq?j@4f=|%v{LN68It*0IWVJr^XA|Opc zjj~W3{nME(q^XWq7Oo{QUV+Cj=K-*!DuAOrpj#GN5m`==n-y6^*v-)8uJf56L5$ z(T!&>*Rxlij>6BBt-U&d6N71wEX!j#3FQQ`fsGyR0?gkwp#;h1M52kKM`34ZzY;82ug zwo3*n_PdH9>{wvIeb2MXo!Pb>$288}F1ZARv0F4XJ^(e6XdaTzX(6P6Y->p1tqPp3 zz{dzI=KdZ; z8F>v=l!KrAFVFfJN3zU?--*Hen6kGUeB!SNc%HT1;L*}+h9CQ6982sU$AlEIuU{b) z&sUJL{xn2muhXfyivP|E;m1mfTYH`f#2?4O_;cnPd&9&Z)Qmq8&S{~&Lmc@4Cn47n zxWvR?fsYYb&I7vfZ$sppCjN??Kx6@uU1Rfq#NP`zd?#a<&K&Ul`i05?m%vNlY}^7< zXtpArKE##DYN0eA&qL=!(PHN_*~4kZdQ`taFHRSgtlX#l5X5jSA?StaFeqk}4^f;2 z3O@ug6O_A#?8JeJzb=eFC<$u~GZNSZuT=@&JTL`>v9Hx%?LmzYoPloREEdwhJg^>t z-ze}@1y&?*k_U7{@GGW6v8{^Sd5W++id1saJ!BanC^cUz@V$&Z6xmui{~*1bT9TW( zU;PS?+mTH8IpEWHwfMTH=u>Q%WMpKPR7{vM6S3ev%G8fEC_0qbk#tbABmDw0Y#7wh z5L#K7`9VzlUS4g-ITzl}z&{dr!qivX5J#=SE{WX4?UU3tB-2y^H{3A*Se*=?cw|4))|=yC zvanxo0cx(yNw7Ff@QLQRNG>;Day~GYV2BBgIaWo{N2e=)Wt;TffXNa#e-j^4Wf(Y@ zoxa~Heoh$QUNo^5f~&Xxs}j8QT?N8eOUz~=Z49W9zBeK{oxKZ0aZJz5GG-Qm=PR(U z0@Dc0@qljn-bG|9MK)1n7b2hakpExldslH;>Dx72W4ntCYYqa+^tCeTWtLQu>8pg} zrurrkdb_FdlY6EkQe&8qg;L|dHW3B()x6|AKMi;M)AwC=E_M}F89PV0)1?_#^Wh4 zL5MGbdQJs!z-4#^9l-=CHbOxo6_iTQ&X?u>oWM2yAF}9?I;@55MGpN{b)D%-tE9Dj ze44vrsUP;lOW+5}qc+q|KPK8%FedQU8=lwt4Sitr*Z+i!9tvvTKfxh%pyHnk<1bKY z3n&efL+U(BC2&UusV&z7lWF@SYWqE400%wDg#GCyi4=e+gyPEDL_Vs>o{AhyLD26oCmd2z=7VLQe->}-F6SynTW;hoA9a`(Hg_RfW<_|#*QC;ST4|}FgC~ay7%=BDS2Th)EI4-00$=FXS#lDZS zN3tkIRzKKs0GH0;iv#)uz-!PJ=0gL|g$dIizy-aN$!Jtc#-6!i`^n%3u!kCS_i}|J zJD;8AXXj%$mh7C(X_g(i1-BapvhyH_f_G;zmi`B(K9|Ge+j10XL+B#!E36S2&Ih>$+3ffU3pvJ&D14Jck-FkO&PR9hw#7W9| zD^k{1%9oY$6tb^-0_9aMCEiq&m%3ZCcT0=Z-OS$In!T7;GkbS)Oblf2h&lBBZn??Y z(}d#;hemu`Oquip6NbGY&AzBQheSK^d1a*edzNzH9DoI97`jAS6s3ioIbjO+c#+U$ z>vMZ4eYQO(`nYf7V_B*JR)Mlt53|%*TXjp;VR7iiVB#DHWf@Y~+oaf0>9#?o?^01( z7IFU;OSh{uyGYpz58`kca9}gTMNFOAOA^0q%BH0#f153)iqp*96)n);JRK6Id@Yrr zY;Jdy;xnmF`5BMffqO-gTn7^DVtYMwAA9J&P!H|Sp*-N|yqR>_KGjL1N~(UKD%B;w zRZ8uW*#R=6-xo+#M7mglRfgnuN=fdgEZn}Ri{DURd>!+R*h6aOaXfnnGw*@5&S+4U zAtlro7jn3c=Blk=<;_Z2 zhR#woPg7mfqMKCR3tV-rnh*PVY2jG%@?A_pke7uR$peGXT_D0MYD`|*iEk?EtuQJL zDCGNx4=G;`J4rGI^cF(rDs-SipCj}O zg>Jjkr$v84H9cQ3za0pf`KWR&nd}>|565Ca7u70Z z%BSc75Z8jgWwYW+1SH_A?#kp;w%d_j60JO^FMNZwPUT!{FD8red>qDda0E!Qfizc0 zRgKfH5L0w1P^%Ty+MrGeq2e$_<@sz$4EUq&hl%Hl#)6p$DuCQ3p~0*c!hG7~bAWWvmZMZpbFVmeA)s(tI; z{@iQnPpz0L?#8-Qv{Y%;7MJQEF1S>2gZKM9&pGFwd*>z-#Qs0;KRTRy&$B=0IqN<5 z+@4SZxAX_fiwU9@S!XJ&C9m-!Yoo&I37w29wJ3Xxg+E;3-zZ%7QuyF{{{?Pv-GOTk zt_Pg~Wbpj89*6A&4c(HtPjKqJI3HcbR-C1{QfSpO*RD`^Cv9TDnN^R%p03c{xb;lw zu3QNF%*xV8??~wy@a+oC^3yECXi1Mde}?aE`QbNeI7SQ$UWKo^LdOD!+=y)+p%HWq z&IBKW1??dHW>0z7E7zv4{JD;CaOp%zkt_SRk@(QpRtySK&lGS&x145R?kP3P>B zDlVG04kLvNE+|E_j)@q}eYaZY(Q6#Z%Z~Z`rTaU%k?7F~u`~1pZjt*W6R5dZPi??2RQfe#n-L{@5e+IZ)_nT(rep z{6x6oJt|T~^?{dzx_cZR#6ry5sEN?~Bm`t`GU&TP6~NTnW@3a{Dwse({GReB0vUOHp5R^LY> z2^x5Oyz=;=CBth_9nC zI?H`|IgPQ_QA>-dJWu~;VDjgg{y%{p$)0P`psV{b;dP|&+KPDH1zvvIOEhg4mIUOH z#C^~fLAE7OQOV~=zQY?s-)(z-CoEVy$Bl}2am|(QK3=LQdGrI1f2vrRyHkl8BU(3s zCol72{tTGleYN6ERdA8;Mm)^t0_KtH-JtHiRm_Tl1zhwshH1IKA}k&a!$G-GRK;|| z#5A*r=1!qGL}(6zM{+k&C{b(GLnROI(WFfFNgu$4MWAuJ3oJB)w8+Yrig`5qTJCbG zME{!YI^?goW{12@9dowi-qjw5jD|?v8cEyyjo_W<#oL8d3oTTf$sKc;v-I8nug{W)_N zW3L*(#){S)p)_(l$I|62t;GTA%fF{9NSC(+cQY^UuYn8h+gZ9emM&Y_x@6VL zBTa2y%UvX`+bc6&A3cL>_ECq(y5)V3k4AX(!lD2UQqLC85!`dUxSNY!8O5D^)GXZb z-XT?A)gzn->hA5g=GZ$9EKr(%r{3hg%h;}a2o)VGmn*CNoHR>&S!x$)wLeA&ju`&n zJ&)S6!OAUKs?tY_$`5++YDDDY9pVsD`2k$RAy{{^RNkFbK2TKtIaomD14(5^=)cB* zP6zP3MI68~i{iTdI#lc)D#R0oxQ>XQ?BwW0?eMR*+({I}g<>C}*aMEr{eme%KUL~d z>%XO_n=PIsj(7_T4OX9*6d7*w#;-`L7Zl-^q`2j55L;BEM9y6q*DW{VnqQTcErh3# zLq<`Hlr1@eC68HvB=-rde{>P@bCYyM=B4wU;jxQ>u#{S=Tmt;poI)ksO}NV_lj`tW z|A^yG3p9^nsx*H-?-)gC;h|vji8s);BGM3ist(YA zUjIW_mkQP`f^`64y+~N}!X^rr`>)Q>xfsJj|1>44jhsf*S)pze>aURGt`O=aL|w); zEHqxI$5_-uh?=KG*heVTD~S4JP(O<90q0X8jyoeS%%AsylNks%(}1lj@&dYv?3m|) zD$)Kp@K-;Gy(GD>DDFE$VT?7Q=^m6o(|r^rh@LP+KPRG#L4p!r+5T5}1DeH-CFQKudXV;{q7Q53ec0*iW!J3n)7b2In8?KiV*9G7z zWlZhZuK|4YaHuFYzcHUi%5NM}O(x(A*rDe!h{P;=m!!uv|3(|Bjqpl+otk`-dXAC0 zJ4xMvZCN#tZCM4zDPoKR$AM;<^YdOAU#uC=FpM9Cva26Jbl?fc2zEM_utR%*vES(> zy|O(-v)$9MZ6>y7G27fwb_AX|gr30g5&G`1tw-NCtWfnj;uY$X$Poh!<04`lqM>J3 z=saduG7>y^$lKFM7Y=5EIK5N+i1&&z#6!>9`@CZi|2DPEVV2fIDhvkEa#q~f>tvFV5 zeZp{^4X$fuU}Ct8S$+qWe?#2?%bP8hpP`x6_Ip|8Qp*0{8J zLdDn<3PD}^gP8ZGyF-D0;F^a5t7Yzg3z%6QXW4}`?R?f938-O`dNhs5{8Z?k!RXDR z`w8eEX|9q)V}f>;)DyZIN>StV5Nney9*@wL(N1;@jgxaXq2lTTEzp{-qwUT#pQWZQMq_~IPml9#;s7a|`V=AahRatke@w9+-I|9{|V zgvM#Or9YBmVNFz6$C0?6&}bLyO$+N~g_Ssuv6i`5k6KvwDXcQVy4l5=l5m5u3fCNr z56fc1E?6S43hz>c_5@t#ijik-D?n& zaNf39Vnm!hMT-+hlDrVLGxXJnUAsbW^5uZcPr5>{@a5(mv^N`zFBF?cAuIP8Y8yrY zC*uAJ@Q@%^+X<~lJAM!PYG(m#lrO~?-Jl> zaE0vOO>>=i3$8nNl#$asswi|K1Uwv(z}C-OqJZ;c0K^rFN+6jtAGGK?%0&y%uHH7$fUvBXg{bmbh5Xo2SB{ zr41)tlkTsiCs8H4dztOe;f#SFP#UTX+{1j ziI6kAjnenDhALRSI%q*guFw9C+G6Q9Yo-q80zSX zy;81aDWR>EA=FrYH&r?Kd5jxC@uas|i;G?>jW-Xa9tGZn47{(|NwYMFhYxVWK0ryr zFuq|$ zDjp6pY0VEKfmvn+?@0f513capdKAM?Ivb&=C$t2Y)c>r$Pr8@`h=ukx%UearcwCftegM#fymeGb?YI`0= z0d}%^71?VD(j_f$5 zgSsbF4F_#OZqR&sam`H#@QP9|(wewEkq?ZBC~dldf~Ou*~sl*kjh*q43}?rZUx@8$DU ziZndK)vytay0Vl3uD8)p(ABVq3)$At=G@@rd=5B+#phr_0djYed>2}UTl$mnGN1o4 z<@*hA_rCxjck`#mPx88PKVp>~b2LzLn^VzxLYBC{N$p~G%&vrSGO$s?OM60HxaA>n zwq$4G=+?0pXQ=iG9WNatVGhLH1prgi$Bjdw;Q*pX;S3x=gv39_UHAqv$sV-W+o0h? zB<=e)B)MzXjbI2jtT@AMv7f~?8XO!iM8v!X`Vs0!_d*H9)o&4>G3Vp4eXdxj@5NA< zh8h&LPY~)Qg1Ssl8wmA-b`rFZl{Kw<3=m71S8W`aMjb%C7v(-e$u3;QHsgJMuJVd2 zHOA`l(28t!E#U}i=~8}y8YNK%jXT*b^B-a7%s~{>1q=HRb&qcSEr+l*vlLX)>I*fT!|R%NdFR3qyNyx1xG2ijeml zr96#;zL=uCR|Yvy_)qV6%smrQ@Ya>CT3%-)0Hswcve%GPmWD_)J*fO8N+ z2P;Wr)xO%Q-@#R|>fheFeQ9fNR?+D0naJl<{#Od=R$j9vfD{5AIn_1m54cA8lR-S{ z!TB>=40)n+c_)3igNC*O8>inQqS2B%U$ABUhGQdNbnH*xETFevuzQ`yW?YtkIEUK9 zqN{Og@aGVDq7q5=jTMpE;*ZE3*^-dgzT3eUrS`cri2u(&(9+wCuz!MH!^5Y?u{9;e zZ-MQDLeO8^8p5`YX{EaKz;v!lI2@3g)~}G&eKf)WuGn0#&LFHS2n+jLCZn+A4YQF|D?1&!qXxvt07uHbHxo{lcT|?Mt z^F?_&&}13)cIcfxJQF?b`_1qRUK7GKWK~0m)wZ7laf?Aq8rp5<|0YbEdC`Z|J$F8` z-M8!;hm#-OH$4l(U<|dfTi_9rA#OSt>UO8unvz{*d&@i|xm%&%d{!yWp|cs`Wd!fz z92?(8c;^BSLGgM$)!WW9i~U9zzfAlR%uNcfPW$& z09giP7mfoTn!shZ-=CE#Ih_*y=&pp?enCPZg@N0}l1bD~^Vf~;*u7`r-pEBe@2uHP zu4%b%%}?ZdD_k$`SvVLdJL0lu;ZR&zL2xK;-5@xc@2(+iC@9j1I~q=Ou$5?;g9`ZN zX{Lbfxh|S8G-z1hI5x5}wG~fw)>NUHqTFl+THZ;y&Jzi)Pa>qry3B^rmSN8U;s|Qs zLqIYol;b}D*bauk>5+A+%3-$*KEBgAX>BJxMFRe$FSuF7g*r2Yw=D=4Mea5oNBbw} z6FTV)38;xv^S@aAJCQ|qG(#m7aXeVjvd8AH3l}Y*Cl0u{0N*^`X6{k6%lPu!IBWZ& z1vlVg&ClkqJEmyCm7I6X1wWa;ZfMbh1q8t1hi7Ky&0jY!Gg}F>*pJ@t{9OZbFX-4A zwh^Fn$EEAxoz)~?5M|B|fTCl!r}xR{f)_Fu9s=4m0~TXYvE0ENo{cp}d`L-6Mft!D zyk4OP341_hg?SLMqpJ&*)S5$;tj8sP-7=m`A#P3~vH%%ojidrafaMT;8irnD>8yGT zMX(eUc(YylLR^?Li&lp>W19&`F2mWAa$wsh7tZ@+U`G;0J?3<5%T}yDm~pX;)m8Nv zF;pXf8q7dkLzGi-9@0`WWc7d0$SdiOqk~neAp}wZG z`Ys6tpIb(c;7Ic4jyivOzAB@~1>%;Ue_R0W*@3uC=UdL?2))CoWt@ORr?7`~?dBH@ zR(vT|pH1U25|_B;9Ew%$iWnjhieg%`lY|(R7ztTZj%JByjfnm*UW#&b`QXMKtmXwI zw#huqJkg*(Ii8-`eRT;VoR`@Ftw+%U zD)-d`DJ$~f01p151?S_oYZ5f}MEz;s*ipZ&1p8M&70d9owGElDy2g%T(=0!Ru| z7OcW0IL+(WYAH;1)`a-kiY$m~x=3!#G_)FiO}O4tD-Z5acpQnx^cUA1Bl#NVrLE0u zEA1nnSBcPYdlM*0Rg{7ZdTxz&xHX4p%sF$e!oM3js)UdfEG&F)OE@*WSkljd>EhMf zg4{5EaP_w^vTL3y4?aYEIbm0JuA>I!OOy-RIsRVR)@X26Hxf0KCUIobaA+=ADCgZq zmjd!T#}w1*iwu&t5ZYZn4F-k0SG3?{_dbs=0ud+oj_4a>K+%Hj4F-!v8J-{DMxLT& z_Ur{RprbqpBISKZAc%|KQv%e<>JljGq>=WTOz%aomKGuHB3MP_o+8K`&F-f+3Aj}9 zT%>Ernxe%8PTeC0)YA9S>fK1AE~+b;$s$j?voz3tt_lMKLF}5XsIl9yW_#_CIS;vS z>(ORoRE8c{ES1?k$xn~M+|g3ljF!}f1xyEKya&2$$>FO!^Z3)x;^FcOmF|T1F2-ZJkA!8(AeQ+kW+0mMKuBHL_W?Vwg zBn|)q_tCi+c&(lbEV8ki(3gP~cjSKu1Im?Uu?=8tE&p6^fIYb-X9yx%ku8aqymjG) zxI(b2I|?^_hfnA&VgNsv!r+OYc>LsSCCz+F>TC88zuvx(2F0n4H~J&P^s~u*%7roTF9Fc_ybqjc zIZISd)Z{ExIr~h}8a}IXjx{*TRnFI^YMfOnXE%eBQ#m1%vsUHo%z+eos$A*;t->tD zHR?gO_^5YKg4vRr-}Hpu{-=u^Gd|uCl@3wbu@)rbh2-fsJR~2VMkJxA60#Yt>qLmz zFntIJyDz37!u}ypqm~>Fxw+pksp>THF|&+_Ei!yxus=)H(* z-9K>6*8S>j7WRZ!)iN;AD<{^nAT6NjO;9lN2BH1u>mD<=5;JEjX=G-LNHcB90uXlJ zBDyaDHOxE-3gjM^0>3 zHs=$t&wV7Z2%bH;TcSk8BN}q(H7ptp_xdG#*lwT#eKw^G*nHv>P;hLl3$yFQ`_kfY*gJIz1 zMui>le--={fA`>jk4Ys;zfDP?NSG=TOu%=8u$y`{1pIBFMkJI%XzqWR)D!Sm5bCpn zdY+&jK&Y20RJ7>V5tMc*WQ*@6A4sEqpakUm$Ge8Uj%zk_PcVh(C%uY~2g_hX4;K72 z@TKLLUBu9ZN&*==M}z9Yd&_3F@7KT1%)8C{!4_l-wYOehQE>w4Q@H zRBRc#jW+aIEa}5>pMsxNLMgBeHgu)n@8QKio>d6lH%?qhhTe{AxY8KGpBie5!+TVaAw?n?6YtRFAA1kP@{f&Kc zA)&rgCq99pIk!ZQhU%(BFP6Y6Q)-Z*M~NEQ;+bHI65Y?M_|0G$Z0IF|e*)xNhPJZ` zp|{4mhW-uLwxO-0{bbR857GX9B)LIKd#hVIo={H_)Q?xNq1O`XH?_vlb*`b4$ZJwZ zeZeH%%xj!8YO?ppMg-8_cP zmh3I4PZR23g^JMK-8J-fa)lV$BZ0MOwD_A0or`Pu8{dNjQ6#w>oHJR*H98uso_MqJ6H9(#)j_1}Vex}a`BsM8cG%C!PedK#TAE{2&>sw>6H zKaX;)d<55Q(ShzgYR1RH1i{cCCC3*KFmk zV&$V=wa0;Bpq0}EJ@*%nl{<-*7b^i|47l5SAL%1Mx!du9ST$YW(0 zq3$JCULmMQ6Y8%ODy%%!SUC&!iqi7-K+L#U>IoS0I_m2 zFZv-YKXknkKvpgm0mjO$N%ay@eZ`AxWfDwst4_+Z@=d7JeWak?DX6uC`hY@(m1i3( z?}hzh<$=;n>}FZ{6K&;*V&&)HW>vHd7zSGTYeC=JiymS5p+6oeZX_%3!ZqAzth|*} zuMyQheu1s*1e4r1C+1l>i%?G%)F%bCg-~BosIaoxSot>W7c0j}<8YW#g1VJKq67|6 zq=8emWP7jLmxE!Tl_g^3kq~Ygq~y2&`;3R_Q~RPl{XXW=B|~qjg@sM z9x2O=RGYX`f~=e(N@R<77qv^hYCloYixhR*oapZxPi; zi|Vf-$yG3^r}Zf&)LR90CqeBd)O{2x%JM>E<)tVdvGQ`MHWxrJJ>?@S)1pMS_*NPL zXG=~88%ymsPUywTCk363X|vFO2XrvqR|%kc`BR^j&w;S}VNrcDsL{rLiX=CcNj+BH zM5vDl>LG%4iAsIYR8vGQINk63w!RGVKN?pm3}HMgalVZp{^9vh@gIqBzLkxg_Shu zl~KVvC?2u$38^;s9p+kjJFeNv+h~xF*MYoh@7SA_UkUnBtnye^z7=6BYn1@9vRnih zE7yat`!iAfGEl?HL8SUGnbc$DUkUYdL5&LP)`U7;p~A}RjFr0?E8mc6^Wvedm5<|^ ztsEz6-|1ERU@#19eSRV6uRPajFs1s>f3M5F8wX2VdZgx{A5K@+3O0{`^glpyNxMnN=!Be`DC%tNq2g5)s z4-qRreA;7Wu~>PD5Imlz>R)ji4P_Giy(S&-F zLWPxg7%Op_sGu{n_jig0>eNnpBD5jz33xYe&}W}rRI&Syjlbp zD_;O%cbTZZ@+r154JNsFkI%F67D62_sJ|1`$%OilLWPw}jFtb3QkJqjSQ>}DloHg& z7HKPY5VgMoH>;w}21D1%Fg>OCtY{}*Bc=H_LTO(w!3nHEXz4K5&UkW^itR<>jx#PD5~+++Gj;O(yr&%a?deZ z=n$n0*}I=8lP$iSXXzzddDUM83fEpy_~3LxJy%d)dx9NvA)&rAP8@?$eb$ufwVMKFUk2)%uXYv-%Dw(Z=3l)pxl-&2%-07>pZ zrMzY5J5Z|omxB7q<80@3g!=7q+Rnwx-BR5ThI&f%3q}h~Qp%9Mm7+|xxI*kb%&Y$Y zg2J`eD%DOwKMhJ)*3K6JUmWaOo5QtjZ9AE;L`)beCiEc59j#2Ttc?)r9|U!Ppx#BO z+bdL*>Z$>{4=qPHN~xYN6)CBdAS)Y1iEQyJn3B)9%?pF>RlOXS0Egv=&xSpp??JQFm||-NQMs-iM%J29zEU# z!QESI!P1*R4Z{bJH7O>IEVrWg0zwT5>al|QE|S~{jEaxAV#kYmS#7*@LMvg?jfhZs zQuzyU&vLZaiyUOR$PWtg@~%Y-1hBko@r4>CTQWm2SaJ+E4a5L_wlK(+v?=J7$1;>3 zioPoC4N0eJP127TwH}-Bixz|i(07MEAnN7rj*Je9Q0z-vy;K;l#f!9PBCx7w0_0+> z9&{fd#*cjjOtWJqkntyqTx_o4jY&+HEqUiL5jz(;%iBsPi@`m)J;V${fb%>Q@_ssi zWGghO{|5!yLO^WYB3#1++BdeAOuK`urA>8mX!sax0n)O@plabwj}JtJ?R55JQGvPL zB~1_sJ5dRHALWS`7V4gftPwwD7v~(~@WU0>{$R3gWKGc@AH!QH*WfLbHJUxqL+Toz z)Kw?~jWW`enxiTNGiHd?3!cH@@<5|vUgt`EU18k~Cfi0nbfwZ>aKhah17#eGoWKHnSesV?qq3iqboaB0m>l_fQ3q;I-6+-4W|e1%KxQJ}u< zE^eE`-K#g;*)Hyx3ilI~L?B;U%TW4ODBLG|!(HU!4pz9=_J+II#oa~WPVWu(Iu~~X zHBa!_alPTv98c-{p2FR^H{3g1+`lT^_qpZ=#Mu%T_fduWr`~Xvy12J1+~g6x`1e^C z_hN)S^~xtt<5@g>@&GY#aH+t>vFE8NkS=l%Tc}>T-qZcH?6y2fa3Z zRsnstdZUOBxKLm1?)sC*xEq88P`SeV^H3I!TWpJhL;s@has7l`=Ui#a4;N`NM#z%Z z6=v7xeI;T?MJPv|7#Q4Qa=2SV&J`wSYbs{s%riN=tDNa3XRykdVsegFIVYGL4j1q# zF*%Er^!Yjm(A)VswEMnp5NwBQ4uU_?{2A|6-|z8L2Tb(`0UdVY20|kii$J#mN^si|1N z?%=J67Bm~bJNP3VZzfJ&XAjZiCT>*ol7N~<4ifw=z4%EM8d|ldYuXB2+olaAeLF?pl~1y1v%n;G zK)z`M2=y{S{hgqmMW|ns9W<2Z9h|QtBD=c;>r%mLA*{c$wTPSSA`TqcJ#!8~YOIcJYckE4AcL~;P!6L8Zo+2!&#-8nA7XYN( z(I{bgfKry+vAZanExsKQ1$R8sSYug=v0ioW2 z+6`*BV+w@kwp7|%?)VL%qR}J8t`O95g!=kW+a2==3lAd*DWR=!Qzg;Kjv}A@vK7VzTI4R+>UG89Yv)5 z`=b5bpoTk6gwWhqhluu;JKlv(-P|6c{TI~32=xU*HI-!b3vt zM1omiXeaHr8op86qwKQ9mrcKMD9nT5=pU~r4?l^!| z2wkHj(85%wNHFgB0|>hh6z#J#`^kF9Mdq?)X;l@4*zp zaz`<%5V}N3Aa|TA5{x_E24QzZY&@SPAo#jHgyxjZTRLcK|$!qDp+ za1cYkB3HSe4LiGrevWH4^mtMHCa>aWfMu|uQw9G?%vvl%hq4Nx8%t#2$y>(EYq5BeQqoAH6sCyCW9~CML<<3V8-NQ9>l7!!`mZ95f zL+^Z?WS0EVt9TkLgAIL1@c-eRS(LE~q5FU8*7rMbZ8v|9fw21m(f%G#!_bo;G`H@+ zJVUP`R9Nd_*;ANXRr#Pw|8_6 zeHGVis2Z%DPukxv+W+GrHgpb{m$*>XP80M^1-(+Ba2n1ClbAfJ$Zf|C!8NyI-P8(XOI|~LvD&4pLG2HQZ1G$a$4>La%M_`uBNUvw!~&H9pyrSze!wgf;Ll-fjPI>x%hLZH=zj{KarJqB+?b zACb;9G)^BevAVQoL@eH#95J)4DLrCxq;AC2me@JTsp%2JhmUAX#^NL5Gvh7Mmc-Ol zLuwA+3~zLrX2jaU`;Q4%Pns~nX-}py;j!UE!v`K1=Iha8!bg^r96?J6^p{R{q#EPV z%$)Xkcyu^2IWi$yReEZ)ZsMfcvPiUkN=>BBNhMq2h9RLi^iLQ{rZVxEQ(99QPRCO- zznsZnf-wQ^2L#A27tCL|OqAbSEB-;~>J|O2g74`Ksb^Na&rW)GPF6Xop znHg`(gzMOda6K8JM3#57HD(gYwuY8)Evc_Gn~wnF@;@8ilP(q{A)A#s+vO z+>l|nfKy{j0<7wrQ^`!GCDAsmE(3%-J}$f$PL5OFkZ1wtOfsBkOJouaEs1mEVb(L; z+|U+lL17F|v^BPL#2_WyIH`8R5Z2eFYe_c5!V}x$ZP1}{dbl;7X^1ss8p6ZE4e4}8 zE0Ja5=}b7@HZze*wzWcUaB%6l_yTisG&YCD1@|B+J5S1_{~Zs5Gjof zEiF^wvOu=V1;ZMqA<#!0HvCZbLcjgc(N4|B@UXY0TN?Mre)uzu(#RxQ8~rZ>~|pisG|;*Igd%(!VK1C^~bEpaT&O(_gigjTy5 z5D37V8dv>N+{e1Na>-Cv*o1mb0mRapQpr}MAos{wFlp z(a}nK;rgk)A(f76^J3u>>n2tQ^d|lYL5l*#xxE=gz1MV9Yg8sEPG3rP1-CV{a(A0=kLEMEDqIbuURfzPb90+VXM9I%>zpuvtjDl0 zhB#HaM{Ssi&bnc03rRM3qzU@kU_5HmqUlVEIs-kDQ_j-2jKX=*#$*RNtFdFkhdR^a zZfwtNXz6grZFSQV?d`-bIrSVg_>Q@6NTnL)IQ3K%DF1MaB&`jZ#^yM>EwukU%uxNf zTYeCAOnBg+^uX|B5+v77ohVIu#1gS^TQU=7R<6AERH79lmYJS%u=*hmf~I5&WF(zU zBptX*>Pt_I7@gms8V!# zy@%FO)>>nV0E6EPoUo`u`1`v}nLkjtMW=Q&p;bYXDHkUE($qp=BH^^lATOF~43D9Z z6TD$#J;CbMjN0Qd%&4WnQw(W@=y2{d1P6x5=%A`=F-{CupQ1;Ljvy$C=7w|_9a?MH ztw>Cdu}cOm5Qecl(8g#VBYJAX@W%+JG$7C*8PSBnXj=?-z?s>QN~qeX@XGRF;aMOB zO>28goaQ*f&u<2VXF5`CB!XLDsw^0Riu_ZQ*~ha(!>4ec+!{}((dD{>vD)K-7wCv^ z-D%_wMu2n30dPZ`aw7|2J3-HmkWSz43DsUQ7cL>?)25D=7BoK{ZR81>MhLkK&ICJ- z5qUb!&Ycc5BFdh4YdfY+XdD{tTnx@Kaqd7wGm@oZ$sPu3wVgt6Lj1AgJC^K#v6wEW zGl*|WOmw^P+7_P`h2=c{*KIB7Lg;~(h)KP{CBL02c|)2eQ0hne5qQy%#q2s4vkW<=`Nwy_hlO5@B zvz{x7{7q>`s1253KHLnxF^p2QD-qGW)}ZerJnNvDyMuu!CgoA?7&Tatqjlk_6$Mog zn#x0mqY2MJoO^DDjin~lm(|)ZJ8Bv>aiL~_y5E{?WA!kNgb9vJjcDf5mZ^+6O=g9G z78o2VrAT|SvAHVIm`bMOjSf1xBr5$J$LJnm3u$=a=#o+kFp@_LDqbE~t4O2G5~1uR zA2TQ-OE|b-&Gg8|>QU944z54cA-@b88;heAm*yMAefEj#H_WYEzu{{9?!oUV{NBLt z3;ebNY=8WY#P1~h5;P4%ghef1!y#A$v2$1xJHxT)hK+e$_Pk$erlnm;RHo4zuqIEg+8}4{bx5#NMRH5ECMp4_*kGGn(oOIER zt-Xj{Q(HN)wz9qwOW0^{(Uj7fuf52PWo!lac8k^VSz*?L#*=DL=Z+8rqO~I7_~XoB zV`04eh2vz^8!}^ZldSMp!Y4Fcq>hsO;IPpm zp4W)UvQjChax6j8c-^Ij@o*{D+J<7C!>qSK%@*_xv!ZN})gRdRd>u93rYn)6@cRch zg`(R&;=%HTz7U+oQ#L89VA1yux9h*M%cFlGIJYlCDDr51*T+aRL`u%7u5-#xsdXY{ z5oc2E2~KI*Nlr~&g;QHs@6=7HcFHTOspiwLhs(2}#lbR2yn!A^U<`ri#o`gI9niw& zv=kOTV$NaC;m#4xNax5B=g1=+{No(u9PNy9jvVD2g(Yn76NF7}pIZ3|K(q-@0MJTN z5{)IW%EwbnU8|;L+N1696l2i>LMqXiHdQJC7@q$m8a+)YyfpvHR!*GbaaJ-XLe zdlKeHfr21QVHRmnd>H%$g68S+XLrF~9)>{xieZx9F4|8(f?7w*KSlynv9kNsnp90Z zzH&k&T0UXoDc%V~X?uH10*}>bCeICroq@)K{VEW@GXpVoo6=|vXv-?cJ7~AsRH?F< zc;mE$F(^`YLZx#;eNEUa(37JXOP63s>4_#in4&Qw7QS7cl~s{S!K!+o1|Uyb{8B5ghYt*Wc68(-~xge%X3d{0On)GQ;Y7J@SI#%4F8A(p^H z+r~zUym~;|l6crO$4Og6bs%bJnMQM-=2lsbtZTpm3OBbp-@!v1!?m8obimK(*W9UF zJ?Df`1~Xe4+HA<=38mGPkH!WIp1Rs_pmWwnN0vk-JBvjNRbIHVeePM*-_zYl5()22+KqiBtzI zkcSlanuH#)Spmo~M`1>xMd74ENUU+AglD-35(EljK|;YB35W(M?ozw7RS9E0M#YJw zVJ23FFmd8XXVDZr)TFg*c?3nkcC_u7nZ@EQ4RfNrTF13rAz2voEU>L{j>H<}tEVkd zEKw#qrZu-?v4fYz3C0ghu=1P-e2zLc~j*en_jD+6z;L#^QmLs$;N$0mK;c zV}#=gWLlBv!+xi&qcv(tY{HWTJgrWPMg%mTwe#lSnW=V8%);e-?HGCp%-$k4u@pam zSGridT8@fN?S-8I1#)ajVzMcwS?uuOFPdzMCR1n+^P$QU@{m=OQ~et0sF)eUqVd^{ zEx2Rx3Of*wHb(S;XQ_|zwjY%^l8l7yb@dEW83r8*OPaQLENUF1;#2vVhcAdrbm~Me z8q-xYlay6KcD2WDnwr>MFn2jvUn@t$6~+@M9%;D!vVZIm>p*>@u9FKIdXCo_SQNCn zJoTJU4Z(eQs)6?6ASj`&iRDrnrlESq!pF~X2qqR{T%sV{f5TRXYmiMkUe_8S_Ei!x z*iuw!NV!Tam6K?T#b=9|a;YYM^%Lu&b(3mpCf3$R#-r&pkIv*0+oKLIDRC;n4#VnU z$);g?+Xj};@^hV3Ml~@L8d6x-ui>T(TaGX=9afK$4cC*6^vERLoNSSTM@#3yuGdgB zt*S9}sv2g8)uY((@pu$b3kYY{({o=mV{R@&P3)}hXq}2sKuMB2B8|<-FqILt4~`e6 zT*cdTY#0wtRBooR9pl%AY4(h{zN`jAveFak99$vh8m8enXpC&17F@fiiX`ATe zvdU-~ye^x`a2LiM)2VA-lr)h;Jy$$M@vOp`It;jg)nYf`Ui>_sdWgyNIEP}I@FahN z^b3@sdShSj=9AezWBamYxhP_7Wg9(lrE z-D9O@T3j4oo5^4_Xl~uc34yAL6cNZ35jnb)bQa3wgiJfNJ$A?+Dx=D0cjxrABBD<23Ed@ z3mYXrm_AQmOhjxk8xO~hmyElTl}}#)PV;k1fjoL2-0y-seAEzLrm>as6Iu8FJ^En( zTcY{0clke%o@R;ap^D{JzgTmhC%*uF9zL4oKFhB#JY9gkZ#X8vww-zU6@p{(+$ViO zcv}JbLU3O9F)HNgFY7`EZVFCa;M04<9RGwvZnHZ^hbf%QVF#fWB`y*46ryUl6X>;e<<`{7eD3 zTC3AKe5wskRT8{kp%?Muum2J~ihh&iZwh?_FDvM%>dkr;F9G)d81xzRJ%u#j z^6y3drqIV|F$Ak4KUDsv(o^iEd6}|r4SKVGQ|T#oHbwrX(kI$8$#mbQb5QnX|EALO zOf1?yJrl)BQy+TtCjZBy&+sZ$Zz>d)|HJ4p#l%kInY^q`t7980|Hq)u;O&vAcyRDT zwCtXMqVh_y+6C}Ta*R{QoVr?ugEI`%6yWU!~TonD6tceLYWgE+mGNxQu9 z?jf!kTIfB9IoJTsD1*{Yo!S_#(Ud;J#wNHsqs_m(E3LeALS4iFMK{3s<#9N;-+JI> zzyLjBem(RCsebcqX$oZA(&XoioQ=`9rKKa7aZ5)YXJonYCFSaUTSxELqWw>OzgzA^_r}S_D);HT+vac5d(3Pbug6ihLK^~2 zuOheo+V?cEz9LflL-rl3l|b6lYvfvazP-mDh_|bQ9sX@w6t``ejnJRjtIb;0Uf*)H zt#=}OhvD8Wz3f9;-(d!-yhT^*se>DkuFr!X09f!Q@{E6E*e|#}UQ&8#4VbN?unX#-t6Mz2-VK5T5; zrMEiVd;7&^ymO5I@xrk)(8(jEGed0Bn4{4lHxK);CLcO73_h;&2{0D$3OEcoh6JMu zi-wOjkT=CeCpUxI7i0gR272Ng9yB#PXi9iceR$Bh&hR{KjgZrwGaa;q^nSD+Fb)kH zC=N;)ls?ayr{479_cVF$uAtq_wXmY=`(3S;vY^4|9-;dMS0CxQX?1q3&BZ#;CRB4-xr)%8y0PtSAH;@aQ-X(yZd%Xt9vpQdV1@Q8c&>Ug@d@%7H!YSm``7* z#Y?K#4quJktHLnw%{m3ry&BmhS^XLy)<$Skr_+Sv1P({DcD-V^KCP&f z3m&~`Lz!*CS%aS1)_>@Qe@XQVPeq)MVDPqYqb;wMjqd7|X zI2={d*1P5^XObID^g^b31JQB|wj!b!?dp+s8avXNWGkNOHkhO3bbN6++1R4yWYw$b zc}=+rY6?yLz9PS?s1Ym;!dx&k{TbqDFwPxm(5KolfZHRQ4@m`+_St_gu)qlr)Atju zs|}Pl(zqKhfbE>FIRrjjQa)W`IwJTF<|;W;98EI z{#V-fG>(Zw?XZJ$qg!_?__&F;13hRp#D?pNpbWJ@{i^*{k0>i?3SG}AaL%UM6pH#PBC1>lo4g_yHW`;Uc^X7v> znuIL4Rix5`RdJt|#oLRmZnlF@O;U1{-x4wEEEzIp5LW*i+dDj6x4Op@4|m%=AEi za&>uGxK4TyjQR*dG>_Urg1G`J>hv1$72a zFY<|=n!-`2jdYZb7OJHjuOaHau(W=qE9T@A8D;XR^h*}>I!`N(N5T8=0n(~8Bwt!S zk&%{9WlQUTtwFLTNq)X0KY@|sr?919FytBhqi%E7Mvnk+&VW0{mhr!e&OS!}=*ZNt zAz*M|h5)ES*8Bi>*4zL`Jv71shC6N>ZsBvUVRejrUx`k{;VV=|9N(pT5)04dF|N5| zd{+=n9P!Q$zYIMdGqqF#2U}wJLzM@WWnz=+x{v2-=ulk?$mYtKu57Dsjw?hO8mJ!G z+xc4>N*B)xsqUQn?wQqzM%#XRO|7!c;d(c*Bjc#5f-H4KnM7o{)zpz1soX@bYm~|& zDiho;nm>!sRAjnH-V8!%m^LjHp9VjcslujL%9x2NAu~v;1b<7USi~1$F zKza-AYA#oK`1agLE9ED$?l+b`4_^%t^-9V{!}UBxG03C$!7bJKG9O>6EDcJvPJSBu z{zs?JpIG#%MxOiv^!fPInz_~%g4?#!bsj$YvZyXo>$$FgJ#3E|22-D!)bpNf;Z8APP-F!8L<9^;2J$T zRVGn*iv!bat_n=w2VBR6PJ6>o;`|(9xN-2-0{ZkH9xUIb4~BOXkl%lJA^sjX$CGio ziWKoM`>#K6e=OPko&CJP3LBEZ{0qVT@uUl1)As=<)c?-&0XoY23~ z$hY(RwT!^ZN6RWot51l4zFci6EH%@mFfSpvy9)bw)=NZqSV|bQWXCfpT2w;BwcubU zdn2Wr+T zQ~1i^2CCw_5S-(e<>fJ8{)ON+sc*u>^cw|t9o*-@PT82xzi)cRx9hvD8+aCilUQGU zF2h;HPF3lNtdV+u!aC)hmv7?u&;`z4#G+jb9d?X`V)eJl`#fb6T^db*{aG;5sj{qe z0_ioe)~Twj#=obO)>cdpHomfa2b)*ZeSBL}d8OIc~{_+h2hIBa>s6elu)9}SxO%If+^ZFy-~ z#N^aPYA07(_sU=S{uMd2S(x04Q$6L=a&kU#uj`KafLh)PgZ4q4iCT^k5{{?lZ^K2% zCut|GzXT`EnACL#4}x&!rtJ9E@8wv2a8LQ)?v?c$&U<Ud^WGBsTvHQ7tNux~t{dW0sY#4w9t5g3Wmt%2%TDfgUXl1 z4=5Q`;nA`x{_-6(xtx0|oaab-y#twR@%tXXZC9+{up54fHg%SqL*LlLYAt<8!GSL) zHfcZrUql2|Wo|!+bs0YE7LQAk3dEO_M#J`-Wu%hlkJ}%ssqg@C(;J-gb*0sK*1hJ# zcwA-pxJq%F25P$g!KuoLK7#MwLkOPrtM77H%r*c1!F6PN7_k0A-#gs;c&dk3%MXAv z-{*k?t$Gld=8tq5wdyh{e5ZwW-Gs;Ed0XHi6a>-c~#L^2f&(Pxhmt*B+8va)aVbmpJ8E z^6S`2xrVU*%qygvAXUCUAhgm>@c3Fr0Sp(IZzOEd_Y>~MnmZD<`3J#OIGM!8$F*CB zDJlys9)Zio(%bktrfo4B18+x(*|cPoP2VrL_xQVf`aa+@rQ�u;mwmOC9r&d*t^D z_smZuu5^L2{6cVDX@)OH&MsIy7HgoeU>U3K+v8t-HdVF+3 zCB769m>b0^L@h@Ant`HlGwNz0W$s;hWn{wmXmx27RxAunO=)Fqoll0F=a*1DIZ8mq zgc5E@ezE(0w)Xe?Zo3xjFi>Ob!lyF=@hxFtFNW`5u@NEHC1SICr9M-7We}6 zM$9evTNFHjP`gZ3j~<~K*uQy%+n>8{=%G+HdA^9_Ug#U=v}UAcCf1jC(ZlLUI_LSs4!MD}i`h2fGsS zuL1DKiOn6?JKy(SRYl?RROGX{mOpDFbu|;K>mt$mi6=$yi4|j?H9zF7dI_+sgFa0VaxPvK|;VuFhOQeKzCJB`x=vWAV7@5=J#IPnt~5#wv1Dh_fNHC|;W zMaM^K>MK;a4K{0IMp4GBtdCR;3D2Dy?hWCj$Q0V>ugZlBqZ&JPDdaGO%_NhU=f&Ic zDNnp&&>p6)igq|-b)g2|mJIVJ!4Zx85~?aDK95*kQ$Nv`8P6YmuU9p;PJL%f4%JSZ zcXN4YRE>p0G%O~wdS(q(G3M#d72H1KieBr*3Mn?s>BzM7Zc9={a_YEL*qmWwX$IW- z@%jyOK3TuvTBOh8w?W-g-bDNq0o)N50;o{;+4>EC`*i(=xA6N2zs+&K2Y!R_I}E=Q z@T$Iml;2F^&Al`lVP6`sk{d**n(TUBFcXjqW? zs4`R+Ky^BB@uv2?dAk2Y>%jvJ&v)RYg;F(-yS3A$yFAmFbDm?1)cQaXx4xM`qu1h3 zx2mV_X#-p0p|t8Rlg?9y>dp_dPw7R4lee!1?*6JvOGo*;z=IET30?JcPt4SKD`}vw zdIZ`ensFP#nw8-_SqcFa*A$d!?I=KeWvk1T%G%SE1yowKv})Q{Q%^hErne<$wP|To z=_zWr)p0P14q+m7RB*<_JS3t1U&@bT+;I$^B^*^)y)Q`zIK`N!YTu3gL>rm|%&~*W zn6(6sr)$&e7NUUaICZ8{oXHe|TGBr~k#K_zUn*`#TZC>|7o`65u{~T-^CSAcxuu}# z+aZhP5M29*V_SQ#pKzB}^*0iP#Kl){`U_V^^-A9hoDM%opghhsN7i`d7lONs%-RE9 z`anbie+E;5-zS5w23eE58t&CURPHNxk&_f$K(~H~IiL9y(*aUS7w>@RD9- z*IKarLU8mJc&i6t9_x^=vTJJPzd~?6ugD$gxzrx|b_}#69)(}teG)hufV0-@y4KvbEYo@=g?5^hw8RUDZ=zW1g_f2Ug>*-o95cG-?jZvW9$dU^l@@2me{`P#7_a;Z;+;G$n31D1~+ml)v% zK0xXhoaJlB%1IoUO{J(JGJPSq=oiR<=?lT7W-EGYfTrbp;k2^iD`oeV=Ie*uxK3Y~ao@PsWRkF^> zf6S!$gkcFDaRfbX5{P$z#(DjE{=r)rs`dT~_7|-&Xt|=lacIBbyj~m3fa&{y>+%TU zBI2$oZu&YRJ0#jVErp_x>xTA3v?JAG=0{w=qyAj%8&6Th8?^R@bQ;?X+;@T5q+pf| z3g)Xk>Mk6*W4~}qVrto>+6lwuZEVaPV*IYAi;IBQNLXp4!Hq5;7bl+|El;YcPPhqQ zz5?Bxu)I&<7v&VN5B^Gi=U>Xf`b?Wfr)6(t?8g>5Lo9Hcx8@;SaC zjrW2}I}je&wICm8?t@{U{5Z~Z1rBCXm|oZSKzh%!4zkeYhe0~_lX1JC>S&54`6yZ+ zCw7dQx4Yz2#dQ;^xC{&91yT6AHHg zwJ4~&N$n_kVuEj7@=708g-weC{joOFAWmzH)7RoX<%+6pPelp`ZlU>`pn7t|tqZc*X0p2u8y6uHAH?lQwQ0}O3;wG8@vm#?%~WAt zzSV58RkS)n?DTUE>$z31e0j3L{!jrR0+qa)B(<_wvO!O&LeVk_a!yF{;vM$?rRGqv zOEg1menXk|0^%Gu9IG<1oYj);b}^9(ERMc36)V_uE`a(|_6sVt z9@H$<@h*B@=_{*C%jkhKJp*LwVK~8TSXd*^qKYp~R4c!Pm5H~^@zrCk0~$MC1Z`-W z1GCa}NDGc`osH!zjG$E%s#9{5hPwLl!vMGTVtmX7>+*N2lL>1YcTjozTj5F?ZT2S4 z(M>V!6QhGMMHzSi}7?1tH*tLuo7qFEnLEo;QgM%;JbtdIcS0Ae0JTlDihwbx6 zK~fNTbjA)(4e%S2Z+|LIJq10Q=1PqNK=KEeh*qofXi6np!_pk9W>*)N2^n7Gb-WLq zwO%+6B%RT%u6{gQs}@JBST|XSd=z?Z?Znz+!mgjN!xlpnE@oZJhljll4|%E@HBcUB zH}Oexc)I1GamMo;-J7XMh(1rQ*y_a}E>DbrT+Vg#LCxZKltCaMS28qSTN zo$Iqx*-i=b6Z1u4(E3?F;W|E4L9i5?f3I*U&?rtq#uxrn8L3rbre}B*hfFoJ;JtRd z0*c4t)*m%Vo4n5jTk@xYFJ`B*M?gJj#ZFLuo{Gm))&@r!1X{;7tKdcTQMBp_p(ciY zbHkhVpEGFq!D$kZoaTvAy5}jR+FeZdyj%*Ix9+uJ!<8HP`yn(NE91w;?@ecazW?5@ zhaax*DZPBp4I6aGQM^U0wGqnS)G*WG*Jv^~76UXUV>L3`5--4j(bKAi{jHJ*RdC1h+HobAx;9#~I z%6umz(Km#Z;&KzHbsos@&VyKdiIo=TdcdX7umENn#N4Wq>2TQ$ywD@(1BK~h_3DPM z)8QI9n8~Tdz@(ANx|RnS_4wdYcsz=Kj#JZ|Y>S7h`IsN?TUflO0$ZKzH?t&fvO1i# z(T$Cwc-nS-VWk9LLcg36( z{^4kh(-}{cJ$XiJT?dA^2z7efRK+L+bjv0WWQrya!X;zn zs=^86rC>qK6o|RCP&6tf`8q&DZ@%H^&33tgL!M$9*RPc?pP95K(-e8_5_ueWa!qlk z!!D(w4)4pg#VF_`=1@M<(H^u@=&8sn@AvmhR6OcFMW;O8;XQ^DuR33+3|F*4FAQuH zJm7@@4}Bpx7PF~|M$cq6t$XMT!PB~3cR6_I3&HgwI`2mk6+HBX;BLha*1s?uErKEC zBJ#-RHli;$Hxd}}x@^4k{ejbWh5MrK15OPOzt`jH=#gItZdxX{06g@C;JS6eh&8SJ z=%Md7{2cC?T`P2L$xnm%Zz_EXUwTfWBE)c9T;Ey*%m1-xPZKw(h3*|Hq);6#wzJfj6Q2h<;Q3mrw7B7w$l#p2|`P?hnKO{Qd_&nEe;& z3m0DB@;8+}-}!#$^(}u>==&G^z03bG=r_fG{i{5E>%Xb~3#9kND+Zg<#u=V(UvCs# zjZ&j6v|cF9tcN}T?hl~=d}5c5s~sY zuK`Zr)so8gaH#+kCLOG9mZb!Tju3WIcmRkqwE`H`G9+wqQn(&g3X6GR)mwc!5wEa9gwa-T8#7yqCs59MtU65`;nF-U4gU;=@&@rk?yi1_@qIPvB+Z%9_iv+L67vezXd(gcWwhc(xN*-k96O=K)*ZU4e4m4Bku)0(wBY@dZbPF zgC1$=1E5D*^GDDljXnr^q-{$_j?&?CL{1<)h?<%^(4I`kFLBi;UQphtSno1jN};y*#ZH_Go{phvpHD$pbS z4C!2?uf7F(q}^|W9_fwmfF9|fJO};?^hm?&K#z1a(z!^l`x^8}xBC|KNcZ~=^hjSs`W@1F z--CWX$62}_^hldGfF9|-&iV~=ktPSM-*7$MZ?=BJ!$@C7`UcWnwphR6JETt{-8<|! zGehe)j7Iv&p?m#;z6MQ8OrBC&?EiwAkZT{Y6$3&9)2+Bkq$cq^hj4AeFN!R zLqU(UemLk4fd5B;9_hY^fgb7ZC7?(8e@1~G>A#N!J<|HIphr65IM5?KW*q1T;W=z6 z=#l=l4D?7p9S?e>MdhGJI_w0{BR#qT^hn2^2zsPPRDu3L#M4C3Bi*|W^hkG~1bU=L zP6j>F(o;Z>GCv-aKk#2tm=#l1-&PBRQ6!b{{gY;pf_nZxS zq>T-rN4n=!&<{pjARYaG*?SZ4D2lBOxNCZP7N+T$3|kNq!a4yWf&#KB2#BB&qgN1F zBnl!(SY*?yAW;@kqY{12l}955%fXL#n1bwBh$Uw8oepjSKyebBxSK_B#Q4?`bx$v>cf zGTQSa&!IIH(>{I?`k=!%Kp(Wx zE6@i$z6tuEjkiD_^v+kI5BkGv&?kNy^iM&5dlUMgb>4g2aSFR{q`95cR?St&qvS)&D#xq(Dk5Ypama8AJqQ|^g-)<3VqOypFzI^ z`u85_gVq8a4w?Zv6EqXF473U82GCZZpMjnXdK|PPXya4SjzN2X_68jeIskMgXaQ&$ z=p~>VKraLR4D?FSnsyYl2WU0ua8TnI^g&I~GSE7p8$eG2 z{S34z=yA|o(8i}@JOb?j+8J~>=oz3hLHmN1fu0At0rVo!&pAM`yf z9^U}E*@(wK1FZx-4tjYo9&g+Y^TJy3cn{Ev%y@h_X!qLj_)O3iRyStyiOY2i~Rn6S!(}V0N$0@KwN{OM|}#yetjAANZU!xL3#XKpMOS@C(!6eSvoYzTH4M*zI3`)u0|geP}fB zy;oGlCn4GZ=q;KsD7_-%k4+%u02Q2P16CjqaWjQ3C2F9JS1 z4PF9#0PsgKUOVaQtAy=eIq>(USH%~&@Hq}%0leF_Rq^>Q{3Zvl1itdRs`$;x{&{9O z{+sy0_WZpnzSf05?%;XA?*_ing}>n7`M}#>Ulrfw!ryi9BH#yr?{?wuJ9r83`){a< zXC&kK40HXK1HTJ+G#NiXfmZ;(DGgo;d@AshlJy5A^vxjF8G&P3n<)RO2|N$@JmB{y z3`Rut6Z5>oH&w;Ib*2BclYSoX7jLeLuXFkTl;eLs@Pc_& z@t`YxuakZe@UHXGe_ZkwyqklYAx(>8T{q8##~eHlcnIsZVVC_{j{SV#zXMNM|G=NadT)2v_|w@L ze@cMw#QN`juJji>>6ZgP59`27T;tQ-&iGUTe9L{Q?N@L~6- z#`A%n`#@^E2zb|(sqqrvxmdSORleoG8(=*<6w68Nuaa1#Ufeyo$HN*Ik<$F9)tal^U-A{x9H*UHzlf=^vHA z$Kw6PK3D(#%<11|SkqeLJ;n(9P9(Y>c@i8BGt1YSVBH#yr z?|12c;pmqDf9%!NcscNicrTJlzXJHFucyWhOqWmTV?e1ia+5>|4}FX zJm7BtU+cmX^TT}Lmwt}lH&^&;za02-;1{~m&v(+V z0RAT4*QF|-O5j7ktcpM5O8*HbeY1|HeGj~kEB!N_^z(p6_NPuiANT{nQ>9-7{M4^g zr(Xhm&;h*HbNP4F@vj_shl8nq-z$Ju0#7x6sRVuu?;~G!cF5K_n`M@{fedb}8|KBnr^gHIyuKarw`3LSjUKQ`^((mZ#R{+nd!t;v@ zKh41_fp@CLdtw)Ux`UhbvCb8*ivQuNzavil8TzC)1zjENu7}Y8Ls{nqdFEw5Xe4M{J{)j7o4>|cW8{qi|cx{*c zfMY)o_#V6upX$OVI(RiDlN{IG-P0}sbi*KZN<&vR4PZwc`Av@gMx|D%cg1HZRj>iksz zzZ?4)Qq8|BfzN86THnON$PL*45OvwF?by!)KH=2r_zqY9dEMzh`M?{TmKrYtz8QGH zmA>wzUjqEmj;Y&UIq=cgmyzoCtpfPu)A2tZT>d52Pbz_T=u#bj-i1Hy_-{7Cdz>_Q z9`KP}Q|spgKavJ70)9ug)cPgBTXav2mjizZc&hTN0RC_f{NGep{u1-=O5iij!2is^ zb6{eAy0tbH0Iffn_-cAyb$qjHeA(cPFL}VXV4upHuKL^R)L%aE2^Ut!XSncd9J~nl zs~4rN-xAT$_!&d0;~%;5|DIF7mB4=iev-?-dX9f) z7WP$KTAh0R3;6n>=%23i6Z5lt;P(zolYijf4zG@TlkI!rj(;V<-yV@#zZ`grk=5~L z$@+Sh<9`M4R@mS3t;@f}`duaP!@yIOkC}~qBG?zy&sDx>Ipv!N{H;-`>n|Vpg3+n# zuL$_P*hiG|`5*Y4t5T0&<-jM7O|4%6e8jla`jx=@U!58^n_xfI_|)m=0dH1>|2^aS zeV*q0KIa3!VN!Mc6<7Vd=+sXU@RP2oj^FL7pF0xu54;5Uvo8Ee2QLSnGo?CS&y{|} zNxuSky{XkH-yc*0zkgbF{7YB*dz|#m9J~jco+kgmFPKps@9SzGJ)QQE4}9u%_+Pg! zJnG;@z^}f(I)07I|02i#65uc0P#tgM!dp6cIq=tKR>!;HJx*f$>g1ygplfRtz`wY; zI_`JrdmQ~r;9KWZ$G1b)(f7QX$bVC`uesInEZ6v#nHc|ok6%z7pXkcpI46Jkz+bp6 z_3w8P@I~0aHb*4c*Kc(ED*=A&4zwRv`Y$@^mjhq25WjCO{m&fz3gAQTu8!xp@J0?^ zN%%e0@hL8Rf`gmQ@O*P`b-d7p4|DK5;NLE)j<0n2cc0^5KJcrT;{PkT`o|%se-r^f zy{tOE)TMuqqhA92N$k7Z?5dv)PW_YvFTj4h|adve4htA{8)9o zsjGY%JLQuPJo0#T{2iD59gh7X;I9D3Ysf_Z>&>uy{{?(?8oV6%9cl0i;M3CJmB5Fk z!OfP~f0zc(1Kv6fo)4VzpDKSvz>lK*QsE`QKTm^~1AjdYUIDy34PFWSo;0}G3h&3$ z;Ca9=PlM+J@1F)Q0)9#wyaagtGdE#$b;f5i7wZ%2s^bG)`U4#OJm3x2SI1v<;Ts)1ANYnBF#mL= z|Fx5T5%BphSI66VlI^!njQ_yz#lGj0UFqjK>6Zh4a8q^4{RI`kFWHRzxymo`ex?$5 zgDt7skJ%dgE1~aC)=wIr@_>Jx2FK;ST16VX2>3H;@Dkw5)8OU6Z%Tt#03VwMuLOQU z8r*Dy{ljVSJm6Vr@O-k_ z?*=^8{J8@7ir1>+rLOU%#2H^Ifm_?KKIer2dmowptuwzjPsaN0o7Hg?Qvx58u%8F~ z5b)`)@olm*zU2cyh=lJa{m*zS#loCk>tle9@uQ?K2lTDi+~^eJ+*!b@LhkTF5hzC4;)X8R{$Sdl^U-E-T~*4QjKrsY1qF9 zytb=;0#5zp0Y8XyOnHS$NIja6BNBw(dCM+QS@a+-&OQGMeX!Xq@GRm(1&|V6wOjJ zSJ94&(xW+j=3_4jeN0L4Uq@u1w&L6Omg!;39e?_tkC(6bU<($1Xo-M6*pkMd0)^8) z2Kv}I9``2^e^?ndh{2~2YuWUnS4s4l9Fnw_B-)3{KNYQE>mz??>5@MM(jVz1V!|>S zTcr8JYs?5WP<+8f?)aR1$=iOmSB?agylt;KF8$wmo&@5Gx6ARc;yVwJ_-~3oU8VE? z7jj6|---UtSM6f4qN^2Mr|4EicPV;6(Iblbu8=9#SG1L)ofYk;=wL<1C^|#Y`HC)9 zbhV=E6y2)mE=3P0dPGs*C}m&KR*H63w4b7b6&<7K3`OTFx>(WGimp?1tD?IUJ)r0j zMSY`{eMMU-+F8+liVjwEjG{9Xov-L(MOQ1jPSLH3?o#xCqDK_(WGimp?1tD?IUJ)r0jMSWK*`--+ww6mi96dkPS7)56&I$zPnimq04 zouXS6-KFROMUN=z8?Wpu+Dg&RiuO}qH`3Tujs9c-md5! zir%GYsiOBNx>!-ip%Vgq)chh}(ZPxiS9H3f#fsjd=pscQQ1o#{pH|d1(}VuG@R>IE ze~;$=2U-3C-JIchD8nCr+E5)2Us@cI{8@Je|1?H+JaUu6@UL9b3!zoKxF( z=-j?@`>r?&hU-GOSOfgMP)*tUg#Ns&rTk7D!jkguUn}J{M$*aCWsy?8bb*xXYNV6z ziI==me#aeB?qNNh{A#=ulJXNurCcK%ll-%f^#9lMZ21MNq*U9q`5iLImVf3+DSu)A zKTDmC)=_!xL8(Z8yvL;6GAo_@jGJuv6+StrHu0yEpS8f2-%wl12eB>u&py(hSC-oH zujfg5uX1Ql{&ni<3wpYzvpkXED1sgSi#}!k0qz?J|Jgv{3HbY6os{)^DE) zX@9^7uvWl0i;&OByYuEyIsyNgNGBk0JT_pQ{sE$b%TUxtSF)=G=}Fq?Mqw|!piW$i zWIO@yo#+YPfd~h>B9!UNY7Dht3}3z`6x4$GT@cQpa3FZ}T!fq6iRcK@`3}@K6UE|d zM!^7Gh92?7E}|4}?1t#p6x4zhT@h|W;Q+K~Yq^gG1YcX)B^mM-LdM@|J;G*?`hnRB ztx1>*u>!yEw-pScn-e)ASe)BGASL9-vm$Xe!a_zr2l<_!S% z9+gOcz%P{kgD5f090lEMa|gzlT(cXjoN891rh1s?BmFCFho%mIWz(X8$ov{=!W;_N zV>Ux3b@N5|?==shH5lf{knx%CK+tav!s1E5T#xvm`7pw@%n~0v)E9a37n2hz!}DiT z`hNh`%qB1|%tEB&F$bX@b@K^Cdo|x8)Th7XVn`~jyI&%$0q{XHzeQmQ^J@&<9`hI~ zPd8T}HLv*|d^0rP8rbqLql=1^?gRBuHs(L6E1A=gurOOe%VS=KXx+RW*1hIXpoZC; za}=O5Gy_N=V7`VT3z~B%N1E^NFzBE~J#(<4ZG})uog#g(n_!CQ{SQXA$Ey zCqfrqwE*#N$$_Zy>YJNL_f6_$=BZrHwYlPNr*hVOdr&m~ABIDwwzm*6{<>lpDO}41 zHw<|c<_lZ|lh6=#vnBNjGZWv2c@E@#<~9_Q-@FnA0_JIy4LhZlq5zR*HL|IhbiuqZ zZ^XC9q)VoBGb>6dwa2$%_QAK$9E@+jc{|bzm=EAPXpTcnEpsNmL*{xEscAlfaBcHN zd|T!-kO`X&&{ZSmGB}-KTfRVCO_l`;Ml{9r5!qits-vhANOq7VyT zhGH%D-!5vQ(jp=133n+w9(e6v$c#7AYY>=4f;wIxG6%B$#hismY%avmobwYX*n3oazQ<-edG&jrT2+7@U2VaAT_%(W_m>ibqBM8jrNZ;B;+A3 zwgR*cFb^|R7@^MUU&YL1&5EL|{HsMj%1QTnm>>mKS&nId`)^5yq3mn))O zsJsp4x`^ljDixoH`a^#aJw{E~&s>3s?j-{OmK-9YCSgIgFjnAKjf&fPjv_-IIHiRj z$8fOLe}iYSQ*g6A)c#c)DfaY6SQXq&%&3B!@1d@~K<4gtwy-eLlQLAo%u3BV9|M&C zPER)^opBR<)oS_g^|U|(jr>NfbP=bZMarnFFJ>kXIiHv%Y$y_00v-QSX6i=1q5@gQ zOlE{Gj`S~Qrg4Otfd4*baw2aMQ^rh-$R5h+3TAR6*HA^?@1aqkedIOjb`N-H=;;y} zMs>H6#d<|Hz*GN&%=C@iMpgU}GyNkL8GV?U{77rc>MCXmBJWau{=v+}k=gWHu$q}6 zkxX*u5oU%*+ENX#VWu$B3?=V>l$p_yKGa4YV`gmR9`gEeW{M(jl2|!2lOyL)(*I;; zTBH%x^b^cn7rBbOev+A)krl+OWu`b%NI89qnYocV)CHerWrh3$$SrJmF#0`t^b&KUgV7O`;sy_m=aYlcH=wZZ6kvap%c+!TxsrjEXa+wk^abP>7vDr38Y z(GMui*O=QIj7F$_UT5x5Fgk|%#a8AH2cuV#pWB!_7S!rcZ=u}P?T9*$OP=z_d_eLS z+k6E7{)e1+!}Ace-o6O8_xL~b^guny@#W*>Zt{sLYaU8JRb_n!JT0iUe`OA1O)<*Ve}uWQqJGikqcs0f=B^X)ZG(YDl~1alEj^aIMfhq)XN#zd-gYcrL#S1&|3dAwnEIGD?N!^ zPhGCHbR!JMNNy-^|ZwRO{`b=i# zMy|$EfWHsBvmkOhwVnQ)_V&mE%EJK8!|q698XN{PawrlZ=5Nd#i~4Bbx|o>&esRd3 zOPNCpq3d1!mob+sqLZl=jAV{l2-Q)cu6~=gQORG<9DbV?QG2|CIkcA!WMLF@g(5ng z2L92^jm7U4NnXj^WD&iZN^J~t*NJFD>X=tCS1h6(sr8IyZh?q?LcWY+ZlQ=aA-$`a zTPmVoliqmdR>Bw3D`IYqh)$s~W&(3-MRW~e6LtC}UN54zQ2(05*me=Epn96j*iI3h zL^XX4V|zvPAu7Nr%pDTZY1GcH<#NG7h4l(`oxkgQs7fzDv2+psdHRLuU9w7VO|H`0 zlB@Lg9W}po+#MFmw)hga#ig2cGgbP_`UuzwFTeSN#E3zgFXjih)kCKhVn8o^5Ao2=Txe~FPK>>jqYcoDUK_cP$5^hvO%b~5-G7jg?U8O& z!iN~y9a&Gq_cx5}jdZ7>_*+H}Yt}bZ=au?<$bx)u4D@>fswO61_`VUi+VYKtJSItbC>>a0#kbJoI8s z-~nVntlC@?ScEnx)@-i{Y(*}`WAD@i>Z6K8`L3G485p6&6MJd`bcdQ)yT2xok7g;J z{;no)7>!>%_ph4317u_UZ#99bRERHX6KWKDQ*=hL!Cwb&@)dY&DNH*202|Q20 ztBq>{hsmqgo7V(7qd$plZE6C=l=C+_)BrMHM7#0~q@SWL3grK^KrNwc397x}Z)p0S zfd>$wm#!b*a6@gd7xZTK+3^i6G%`J_=bOnnCBuXymoxU$<&_z zCefwi8zObhbFpL>j&IoMVz7g#D|<=<4fhcpEWrii8!jWWmrzQc(#(^ljM6+q$!EQE z`}jsC3f41>oYhPBj&JnRD6qp7JE_tB(O^d?c4{LS(L9$a_S!~2Qtn17_J&43;%C59 zxQ3J3IlfUnRDkDl>3_xe#?J%Y4lJlg)SK3EG8-0(P(k> z5oIG$nK_fNhye6X#CS@FH2tkEXtp58Q#!Ws7DQi(a8S=tdEjha%~9=Dlx75IP-5r! ztI?@60FD>{<)Ge6ZNF;t2P(xsRz~(!kb!ZF!L1-36)Xa%mfcmbP`dwC$Bk+s642 z@CC+@m|WU6FvdcKm#;x+ty-7kt1cJ1b-C;faa!-z<$AX-Ak}y!+s`Z6`sr^Yr2wsD z>s`r=7NC`Ey&HwGJQ{cuG)OYF4k6pdWx8C@_60shT*!M1zK#1uYh=dMnt(Cip^?;# zwnOgBgYA)&c|K**Jf|5X%}I#ynfa%qXw7@jv;yYhRxn`BYe~y|J%NVIw@*bfX0x`m z%txp7EVErF{H&V&@EtJ?NM@K{Vhdc<+}!~!)f{p%TA_IW>C`h@6rZqLcJq@=wnIA%? zxp`hw+^A)q)Ef6vn-_J)?OEo0XvNHvVLjJuhM3l7=N$ZZNb_9Cv^Cea(X>4CPNaFV zIUO?X%zKd9DdsN-w>Q5-Y8}iLD4$c!ZSeLq^Es4HN3#RsJDJT;CY{a4QHH0R-BAu* z%q5WQYJQ1acQfhkrtanv)KCv|7E0p`^9Oi)rg*sDpsda}&q2&U z^KVG)0`m%ZTVM`_{DtOCh`Go-h;sOw8AMJmHou4bAoBsl3^u30t4qvAjc}8Yc?oiT zsrf4G4mIiSwqfQOus$6Bn+lE^jXd8c+EJlig>lNF|D2c+v-ZI4Xv};NC97L+Ah&g6 z)<+=qV%A2qjruWb9ujI0vyQ>9hB0de(mN?;y$!2v2U;(}!MuUym)wdTLd{y%DCDI{ z%=#Cia$?pDa7|-YH5_ghGap6S)iJxHF6)|;V7Q)T!Bnf5^%9bc#jIJ#V{XhE1g>?= z`W5+T6EmNu=473NxV)Iv0bZXRv*_QCo)R;INH)iO9C>eQc0$QFvo1$F>=?6tMzWn? z9ZILiEDM?I5;Moa_15OuaIB5_KBU{4?<1UNE`x!S&Ha#VXFiJfQ_K;t+}`{NX`O0z zf}f|EA!M|pS%%znG7lp0&Q?3f4;g6D8`}XfGlp93W-dkx>27vIJM3W&LR&h+T7n!8 zj9E*eazV_z0jc-0wxQ-PjG09c?rZ)NE}U((fWg5ra}O+@V;+NMfAeRQ(z&JwvgcWS zk?Y|xYat4FM9eHeb_QC_pgw7!xdTjr83J>m)eXgWMa-H4ol!CKG&G@$&8ENySp!jd zV`A2+D6gwxRv0xpHfG%n)8k@hSLhBkGvV4WQzt{#0fZ;Sta9Yz#(~xtbhk+{(}IhI z)>%m5nwY6W^$K%1m{FD=PEU)OeNawUTGv5%M$CE$>0BGLK7sM;V&=D~t#Rg=D8j4F z1{fm7Tk}z6B?GN-$m6V-`81>_n*TycPBPoW`N`%R@aY;e3-ME|Ga>u%bZaKEuxh&X z6O#PLbnA53nIALXg3)WO3^=-Gx_J-k;P2*bsO6iii%{SX4YUf8+C6B{sD;HbYYU(y zG4nYT;{sD4g@jT4zwc3+p{Q8L_QZYpMbxs zExJQx+d%6|__#i1{S({^G3#TH7h~pl{t$nDrBMH^!`Mk+WA~)>A0X zO)=|bh;NRW^$_{AHHB=&%(vmuv*sEU?Q`bUsOWXpoA78`%z73@vwNWR4Ujit)&khw zfrQX5-i(j>&#XUtp+6PwNJ5x2#91mEw+teJ3Z z|3LFKIQF_VA9*@3(7Fc69UN%oz~Z5S))u7tam;!ZrSnP5T7y>cY0SD2rT1CPx)-kP ziCG7c*5@(v05bfJm4UW$c%U@_+WTVWAUOJ-^(nNzikWR-{{wRt68z8{i*ngzUW^1j zGS|ZTZmU1a;hUJb3%-70-G+Srfr5p5l`*RTD&NPf&ES5BS$_cgF=pk%>fx9<5kUt2I!Ev87_Wfz6jU8wSGns{t>gP zz#Na6-$UnnYXaIpbZJ-J$#=L5b@7X|SP{@?Yc*+Xxd zeZA?YL8U+7PD=mZd((Ui-1OBIyGi4}@NFetovT(*#_-akcumJ5qoAVL$W?VUOv=(Sf;Q(6>X(l}GhW-@jb{u+9xh7!G zko}~Gk0^`&PGs>X*D|jq0dh@XUrj)+2^^{kpfh1j;K!PPToX7_6Od~HRW$**Cg8oU zhF5Y;AXF2OYXZ@lfLs%3SQC(I0y#ASxh4>+3CJ~pb~ORHCeW!SAlC$X)CA<3K%bg` zToX9ACLq@YF02X2HGv^D0l6kHvL+zc1jf_^Qnt)srm{tR*vp$9vKa@tJ8x+X@ z9gbQ;+0|jp_4sLgC^clgv~p%WdK@1vxx+K-55bRxX9PXk=%v5Rtp5OpN6%#kS$65H z`fJd9JtL`8>ZO}z)!&GY=_#Z{_0pZQ>X%|*^;}M!K`&i9tA5?9z+Q1ZP;cp)S-$#9 z@I&DlB`qDB*%9?ob+lTkS z)NGm+bEL-q43N=#BAD10P`er;E=3GhCUUrTFBJrNN(*wha)%1?)Ki+@bo`Zn$EuDJ z?v+zii0I*>3@Fy2W;dfYcNrV=l#Xux8U|C(NToZrd20;Zoz7ond&yjHU|03h4YOsoUuJ1^f!Q+O8&$s7$b4^7`5q$ky;)^+ zxXkw!rx-@iFW0MzEo^==<{qBc6g#^4d(=-~SF9|g?eI6Kw@)slw>YZ6RY)y8>u%v9 zQYAxbTrv$cgR;zDP3ls6=obO&*{RnAxUW=HZzE`bk)gMDncbAd9E(L>6 z{Vg$eEP1*x|NJ*|{sV$yr zQzs&6ZA-m7us3na#W81Rr+Z5$ub*M6p%%($6fwHv%lAEUAMu>`G{XK4aKv*y1vUS< z6dp+70H!u~fCdM5Mbrfp^vyvq*E5{A7*vwvWt5oauSemLmm%o&-$3Gp6d&-@VxH#; ziZ}h2Q+N!;NBqSU9$SQPU4K5wkE3vX{|X9Uy&mCAtyZpQ=um+ruzyfR&3YA)p?68| zMvl#*;OvtTtC^Iot07u@DgrSrXb@IRURv!vcYF@&XK(M4-mV~cq4f4DvRFzY0smBr zznj7le@hDAL*Y#SB9gh6eid^3yU3YEq?_x%kYpB9I1d%Z>xi}5du|VVY^Rq@hrV=r zDaW$Y%X&jYI^6`K?DQ#G@C>rD{A+0V_QA+xJ)8EG`DtFO=Sau*QMf6Ez5Z|~6%A^bgDQUe`8^B>Nm%xC{q{fdA5#Fd8;f<;h z-l!Vkjj9p3QC02U&G-jW6|L-6%l~;5DT}hsXxh;ONME#~Abty?-$9-fmA*D$59JnR7*ZyFJY)=;OWJp4gA1MSHtF zttqJaX>Yfu4TWiZdIdB{d%HbtcOb|^TP<$a`T+WuQXy{FA#T?pZr34h*CB4#Ay>Or zJ=k0Y3!=4MVr!8seMH$}q*wa^1}TWM;N~is=Zp&grDLljh;>D6A1i@?=UrC z5{}Ryh3)KR2=iCQUC5v4P9<^uo%q6Mqa?7}9EnJ)-KEw3Q7Slb28mM_dyPCglM2LB zS{S{blIkhBvFyxgNFbg*xw_mbKHR7Au9LX;u`J+l6vjHVP z*O6c5$bV1r_mh0ERLUjfpCx%NK^CAPsE$d6_AvF|MoRu9sfOC$@1*~*ll~l%UqkYp zlsq~We?(b(3;?nO*QgSVHUKIflLO0W*>)aRWu`@Gn9)aQ++GV*6OPg_qmPx57u!QK z4KunLX3lGfAxE2lX^I+Vj=?25rE=nNu#Ew<%Ky1jDjq(i;`8@_l{;t-@Mi~B^z-Hb z30#j7h1lkR_T(j*5m&PkKyr0`!^msKgX6m>BW{I9OdD$5s$c4Ya_PMVNQ z&PkIiz{nFImkJ6yCrwD5dLkbbvk#nfBUSsr$qGmH3UMDamFg(Aj6*8lV{U^3C(}vC zK5+7`qjSQ66Ec@LaPlbW*auDwjCj(;S$vK|*}2iSqYj+xA)U)Gj?#gX4@u`gJa9t& z&pB{HS#S=V5aS#;A;vjyLX30ZggTgW;Dm-W=fDXue}3SEip@E2LX30ZgqXyElMH0R zIdF0f#(24DZyo3D-#BnW-Pk#BLjBS?a6(yd4xA9<95|s)<{UU7cbo$!Gcl|r4xH>G z-|Pb?uaIy5l>;YO5lcF7@-v!^% zzzJ~$&Vdt>9O4`}Aq&{^XauOZ?E@!tG{ZS?ayg94f}8E3_Wy4jIFSX%$7yc&kOk+! z2{9|311AQOP8>M-u@=%+2TtUep$?o7^S^Q6WDPRs95|r{{D1wx3Dt;m;3Q6rbKoS5 z#s0*B6KY|J11H2K4xI4t;~Y4lQ8#hmgs{Yc6XFsFPKZk!IH5EX2TrIBCk~ttmN;-i zT;jk9aft&b#3c@#5Jv}2h*Iu&a~}?z5KsAI9tTc{ryc6dCk~uUpw{agIPqgvExXCb z$=xK~ffH(C&VduscMhD$(GxCd{;xd5I0sIM`SSxOg#7t|6DmpPzzH$VffHh!11H2d z2Tq8=$fFLN5QmXR9XKHlBab?8LL5dOb>M_Jj6CYV32_)}is2d#oDi2da6(+-zzK1Q z11H2Sbq<^mx5hbeLR{j&331z<11H2K4xA8o$T@Jrwe1`@AuMs=gt)|k6XJ5{zzJ2l zec*(yv~UiboaIz@NS9-xI&ebcTd{NCq#?wd11DvqqYj)MJ(NHH;eiu!$2o99X*&l_C=bqo6GEH=C&V}hPKXIO2Tq7X z3#mk(z=0Fua-9Pw#8C^ub21K`P(Ab)QFY*iIQ%v(stfE2#?W5WffK?CodYMtjdc#3 z5I5O5a6;U5&Vdu+ik$-|#4T_RoDjFrIdDSUQs=-4aVwnzC&aCB4xA9T);VxOl`i5c za1NZ1CFj5iG0uS#Vw?jf!~~oJC&Xns2Tq8~O&mD60WHosa8l~{`p;xv(;YaWXD8>t z2{F!r6Y37mffH(ri32COu;Uy!xfshjvVe9a8%=lMgr=*`ffH#*9XKJzIdH<06#Kvl z<=Z)MLiOhyI3dJ2a6*W4;Diw8zzHFV11Bqxg$BE^qG1H+yk}q$g6#vd*B~71jc{N- zS=WLubVv9O3P*zVDE{s%A(9jP0824}r4-J^A}R?j9}gzn3NkqXLxj=EBJ_qX;8#yi zv>QGU5WRVnSxXv0X3R*pE5KM%CGrCybr{KvoOCXjOlBIxQ}WI_NS03$bc9L0p~^f9 zIwH?r6}lf5=p)Lmf)fqtRJ_O=fCx`%(MelCuSIlFUpol3Kp);zPjURa+F0|FTBFyI z5z+H)1VeXAxlbiQx)j^^Z4x+(f>>VTboV2S%>*i4-rO%Pc|vK!eHx+J7zwhmsOJ3u z;mn)K$IA~W(OZ>cqU=&ER5zq!KH_o;;=IDh#;23rQI|2hcVzao8JZaV3|zwwh>`5Z zY(PQ%uyW%hS}C5(QIWwaVJ~^jhYjd*i6$K>V-e{ZDXaN~mq7l?ypQ}_G-;76fqjyo zAijZw^luUQhk|HGJDJ2{0J`p^=Y!}`<%@eySg z*0VGEsckt6ZzIHK$>n@Ggi!Cvmd9{Z7$W?Qa?TjKX*%Or#vR%W<{cXCvLZJGNNf8}hT%B(9MqBTl<);W!RaDD9Co=z>T zuAnd-KcUkoqMnewtf1LtBf&P{0R`3DjPAt{nTnNtun3BHm6hzuH5|3jcEt$Pqt-tR zwn>ozBGp<8jmu} zjVG6*3T$7D0L>`8lss1(X|P+3G;bY*`77r=DyDBmrw655Jsr1hf{1kMTiY!*Oz~(c z$%f~1)I!^EQtFpdw)~!H56RT)I#u=qrOsvU_sCW|RvHU<$YFaFA~Cd)WMe;b)K143 z{p@fTX`Fmqs!+XUYD}+7?Bi0S?Z^u#(=B_$DHNgFangd`p{O%dEq9^(10AU?X(O?< z%B#(zpJBN%B=b!9I_1RM@*2_RkN=t1DejxT)Qb?mdX2jSP6p&_TncId`5Kp_1M)TQ z97NNL4H`Ux@-;36{pvNYhDr~}*SHka0`fI3M?-5TY01~PpCVYxTZnIcKyQftTW@fc z!qg?Cz%MpJe1%qsuh0td6jRZDCPEOg<6QO&c2$5B9V$ z-72Mz;#2}!ZCbF`M~jaTY4Jk3e!F-Fj)mzNRaZARg*}MT)y+*|y17YTB&favVH&&i z#hi2`OgA^_OPI+FQzz4xGLsXgo164y%;bjY7fN3)s6yL^X>Ow5C+>!8UBWbT(94+V z6{b0=u5NA$)6=^C5ND?#O!?3sW~MMqH#h04n3=5Arkk7e)glDr7T?^YKP|>%k{_lC zqrQ&wrZT5)ZjzZ(H#ddp<|h4RLCt1Cn0~|bje^=iNtkYK(qG{$EDY1lP5LHgmWJu( zCVjJ@N?jSILe{skJ8QypbCbSJ&_$Q)wc2!Zlm3SIlzck}NJM`}JV3r}9R^@0r=}|F zU1m@}H&F`jiEAMikxwR%Bk1QR6YuPw5f0FkiFZClnPlvx-^!CCXgT&E+Y?1cA5liJ(IqHqaWdU- zMVl}ZW) z$nv&5%5ryfDEf%9S!lG;>1dK-8wF`<7vRgVQfOt!Cg>|kW>}|=(wsj9IVD^%ngQXm`Q$;m=wp==9AbtAO=|PG7vI0_` z(sOv3!BBNciE%zLtEB(O$zLAf`4Ji?y+CSBMJD~q;d7r#PL%mEduhZOY${ZPYs`(R zxkzqR4IqYAmF#I_j?(N~zPYSPjD5fvdPkS?zo^J8wN0fr zT+F7S)7zCsPVJ^<2x_NbU{zDB9ew2#>%aVe`tzD_o~VrE2+1ssEL={QR24u$2861j7QCSFe>j(3!Jn^92iDDlSVQI&U;cw6&RE8mUkZ9`$& zQF4H^XyWB<`xAn4ZeR=;0{A~M@iM0VlNA2DCSE?8cp1gygmP&9SCoGGi5K5pYLw7E z6gf>X>WVI?`w;J^2=UFGA-=gY#5Z?__~ysBzPU5RH+P0k!#W&p?yN!w zG@6JX5~;Qn8!1&j^A_S;JVQ5P{Pu+S7S9mh;u&g>M+PIrw|Iv57S9mh;u+#wJVSho zXNYg{4Dl_Vp+_KJJH)qmhWHlG5Z~e%Qnz?EI~&RM5`AG<UIh+T|p&|u{B&`6#h8V_-?$?2i-Ff(#`XslvJO%ILLVjJ=kk(VhN z_j(%QcO^{kwv9y|sxvK2@3xJ_%ml*c6QeFu3@-s}sLK??beW=|E>jHC5fwvSrWmHn z6b*HmVwm388|pH}FkPl-sLK??beW=|E>jHCWr~KnOfgKCDHkqrWr|_COwm}wb_&CE znWCXCQw;Z^2M~3cVwf&dG}L8^VOrTT)Mbicx=hhfmnnwnGDSmOrWmHn6mhvVWnpHR zE>kqrWr|^1TsPEZieb7;(NLEuhUqdz<9V);k_ko%bDEoi8FZPVvBg6hTDJ!?=rTp)RmOG)Gw3o!<2B~? z1~VcMFjF6KboN~Qw-B(iiWyOF-(^!8tO8|FkPl-sLK??beW=|E>jHCWr{{6m*n;^ zU8ZP!&&=*HU8ZRKz|5h#qi~s`@gpGn<~BbW-4p1J_zCZ^3kskvMOIn z`DWjaFu#=Y&2Nl;B40}R?x3)IDdoGnKSbn9Dc@2GtCv!~mWFpjfLKpVn`S6%<$s6rLh zh@TeAqtCJcswZ$dT;!+4C_ODw0^E7=rse>`{M9(GFATkWu2M=oC($*Tne4^O%8N{X zPTDB_l`o3uALRx0;$)wubJR)|rLkoaW6KRSFQv<0jW0%C#qO5RNp};^f}cP_THful z{Bg47Z`sVIWXnHt)Lxfm5@X9*nwQe$ug3S2hiVH`*GQc*I`B*vDTXC%uqf2XWE*6O9i*iN=pZMCSBM$2k46Vp5*mRY(jCMp@#V3VL+Y z3vAgdRvV3LhZ|lWsJnIwv%k^Q;yo{7)$g!le$7z&&QijG}Z_6T$!`3jxm~c zh;A-pB!*6(Y^*;=MW)!TGhu884R3=zhqjz(Y^`H#aKad7HR2MNF%mp>dMNdW2~8NtO-reMRPrQ#33=X-ehBY zIclL}EYUC9Q?>NehrfBEvHqBJ%3|zk8_TBIzv$&MHUwfAagvRV;HaIpF|I=r<2uAf z6-t@EvaX?=4%f$5oM`-Yh)CnZ9pm({Ax5~2f5?^&Cma8SqaxE)9kOu}W8>HlMk(`G z)5=!OseQ^xQMQ^)vW;zae!1PO;{+!s+jxni7TPvAgCxcotfzS?DgMg& zlrq@POHU&|eIPB4z#|fUL|FjOAKA2cBu??t;t`%+vT6B9v{!6FHZ35D4*Xxi@Xjim zmXO4$itV3Gi%8-$#rDmnWhBv2vAwcsAxU&%mhLjirnMx|S@G*1Rim+X-P?R^~y#a$)-gm(M<_wX4A5g=&snDY+6_nJrtXpO-oDS48^w3ro|<3 zreeEf)AEw&$t*4%(z0oVN%T_ub}gG0nZ#L&->GHOI+N(F_}yAIEj5Wgir=ec(`u9G ztN24&HZ3@bvlV|>%ceCa(NFQmv}{^-66YwsSY*@6ljyJb1tOakpTq#gFBI9d{v^&- z{8EukOHkrG#jh0Ev}Om{KOUDEePkcx;&= zTVr#6R@~&RzlRzMK1ma=*1eGWPVYbk?Ijo=Q8t}g6We~*ww=9|8vA=LGJj?Dq^y1KZTGn}x>phy{})80@gLmAe{>lqG2}ei_)(71 zu2uao$=KiM*Ck|FUq~za9b+T$NFa@c4EdZtHv6Vt5H^kEF_^?KnN}%tPDgW8v12Up z=+}%&D%bc|4PzCKvDS{UhG#>#jUl^=9EnH_IZHP7E=OtC**Qzh5T2*Wb3bF(-V<}y zwUM2(a~xx{DQEp%IU_OTOr^{@JCmb||HRlil(W&si~CMAw%RdvrDH5kePxWx*g8&m zQ?fC-P8O~8?C|9uHtzrOMB~jH+c}-%Ha^#7oWzh*Wr=f| z%TdL)@g!plsHE;QZvILdn=2$0We+&U?sJTFJPpESMsLWVUuN@h`xT0nRZ3c@(q!AK zI7++TuF}NASSM-{8w}sq(&k=CV8P6?Gy1Y^yUCPk(=@Tsw#~mXjUk4Ns+2jSO*yLA zHpZn)VqD6tH7}*iUs+!2DZ7mW%J|QY@mnDxd&U))C>9%-wOv%G&a>Smf^F<1U44+sVe4TCNb1$va#zpN}FldX(DHvp(#%GEjx6g zvAvG5cDAu56Q@tW@3_kti6LhyWzN~x998TXOVr`rREOvK{{GF0#?EhI7vp(uWBD#) zB!-+N8@q_3v{`n}665$3%Gns-rQe=t>_x}eRc>QrUB-5B%Dq&|oU?a0s@OKht(C;M z!L-%9lrn#1_3I1cb9`ODlg2wb-LzkhozuCt@$Ai1Ec1K>Io))=Zva&7ouI=2A>+xu z6mpbyqn+_C2(UvW%MP`{KSV{Czq0N)6E;@)CRA$tNjUToL}d5*hvU$Dy&$~WN08&t zBQA$N1B7Z<*12%@aa6J65WR{{>c8)tg)}$&9{gV8&lJoS=_AVKHH8B_4c_9D)8HY} zpI4PX1x~n9P?6DvFnne+jq#Ozq}n zA-Xu2vk}o6HtG$b_J3ocmC0Lv4f$^qv_+^6FYcko3lzD}_XmvibZyFs|F!yZOl8z2 z6#M2k_y6rxSHAt(zwd<}{mTTe+--6hGGYW~;alARr>>Cm(!cW6&nqH8UV7r|$f9fT z?IU@=w>!SQ13t%hfNxO>@GVM#9e9$+4e%{W0lq~kAa79$N`(u=G1B0T2?4n`v=;3R z^sSs~W@LnSF1oko%6#}@F!^m!-N;oA>NqaEfiNds#l0> zk)~1|rBrLtep2sfK^x6OyfMK$PTc3{j2DzsrBlQ@Uab~wOz=(+Q%UDOR7=D=MZDwa zOcRR}I@4`CTOjA1As!(e-pt^=LFmYY%+@S%dqU?%TZc9?cxQ`Gp;LPf^hHy<^4}n7 zd_>vhNW(hF;8h4>?jPO)fJWq?zV{{&e8O~mh{BjZ-7KR}(^ND*(vMI@l19dr2sF@q zMF{g(?JoUbr0ZK$P53-13C!+>gf!bV*(^l|^&Dk`&FlkHy3QN@nkhmbaBlw>)h^)=rh zg!!xXRpiVyhkqv*&`lj@Xm7F1=rt~9rYL9F{1?TM^vn!NYS^D>{fCzqkIKw+3gnCvMxt>4ds9v@cY?;K^ zay`vQ>GD_YC#a~Oy}U}A?CunGf5W!?tjqFq%CfBYb;5@xTc@vs9uf(PA7^sqBfNy z{wAc+#BdS7C@XE}2-^8)muVe@QGdy)XL3}row^aAk<~{DBpPqD-#IXJn(%m}p=UUY zl*wYqNkgaEhGZr?3WDrnorf^$GTH8J9JR@|>!U$D(P*Pvs94Vx&nb(2oMIJND3TV> zbz3~owkV4=-&L%ng?dePz{gP<-C#+dL_>`hlkIWhn0{ihj&y8~6IUW^7wgrWRE|oD zD{T@-^|Dhp0y^yYD1oF*K7KX~%@mK&FDO2VV*LnmGLtiHL$X+B34-im{fvziCfnV| zQN^}hAN|fHhTZ6UWbq#C&6gGv#X2NtTfE0@@m|}aEY?M?VkIrqYqA3)IBJvQfHMNt zmDgs{;DU8*H3h6Iug#Q^&#K6Jv{4w>X7XG>M?3LqMVJYyiP^Gq2ITnNzT zYph48iJ6*bdE`_~P1AUd$_NaDsG4tiFQ%}2_V#DfHs4*a2Ef= zT)mdw0aF=yTq&ee-n1~?U!t2jb%NE+H$B63b^Pr*% zu|6{>x2BNO8|Y_1OdTV-20{B6(F+Lw2gitJK*T;qL}BL`(M&MTF`^u_qyOYFB2r0z zjEKCmj}g6waK@JyAw=$6DB5F$nswm^i(;b_NT3Y`F@o3Gg5p??Fb1+)s5o&>mY3$w zzTA%jrH>JyGOtHN2MN}vfeGh*ZbP_%K*@>0%arJ+B#w_Liv!GLLxYtexq0gn0x*EH z*}53$Fc>Pcb?C97AxG_0QF8AXTP9hyjFT>2g!!w%T*}InX#weJ;-t}XNJ#Tjr1>G4 ze9~yjJa|WY=6EWixc*UUCt?~Y*(I_TVZ63YcI`QiiY$dsfzxzP+pp6L(Q#LX*i09`{g?_Ve*8xqGFj1=5?v%A4p^N@fYouk2#WhZf!l zDo423F65|!gm0}-%!x?zMVof_%*whj`~n+>Ymq&FLr%VsMZ zo1AQ)-n(Hn)3(o+NsKMyybPtwU+P-d0jLH{NYu}yy4F=j?pKiwlg`U%XVOxH_8MN$ zsh`14=gObK4Yj53^gq<-GcOC}^#9@Xgh-@1CWwp6%4%peV3 z9WmwVh()U-zKaAUC9lWyT_PR>!*@^mF6FSid(tE8GqK;$~5izWZV89#(1IbZmO^X>_aWSj{=FIBq8dr2x z#E7eFSY7%5ey6JYcF*wY`n~V-{{5bB?=w$N)u~e_RX$Z+9XZDQf_cO{5}9L;^75P@ zVJ+f`o``ZEejc49k(10`z*aYFMou$XgB3gf&6<&Uu84G!MCO}qK+9LBj;}y4E-#!$ z=f8L2fj2ymj8oiidCxMERQ*xUnM zi(G{h)u)b~;uv!HufmD?ufmDusVs68PSk%DPBeS!n9|8rIMH%*Bf`ONHWYl#PO!mk zP`YbCS57}dq4ZY`46=um>n8fVFR`{lxon~@Td%cfLgCPfAk&Wupr0*T2k1W$##^TP z$_jaFa*KdAySG^2NH+kXb|6dF!5q?c;Gn@rOyQ$o00rFr$vj$?_Y$d}*)bV?of2?& zS3v3BM<|gdix4LODQ?Fugx>gx5T^*JRD%>}q6z0D{B#J*BfXNG$MYrK)%vX5Axa3C zhfu|RyyD(k$`8qyhlVi{zyxX`Goe^wO=Y_e1F6I1ecwgLie!C}g6`Ze*+2ocxRPn_ zv>c=k#~dVv*pxy!2#LK&!tLbCnaoGQXVBj~D?eX}+N?B(#1A1+Nqkm7; ztf@@A@8^zy)ll?hGiQM4c`Bwpl<+*r;T(`({+9&Q?#eGR5=~^p1xA!W9_jOG*+*%P zBeWN6jAz+a3>r$#M+0&`=E}KoFJyjv643B^sd!k(5MY@oR9B(6kMM+e!4qOx&_2t9_PNS@U4+o~xjJB<&qaXEewn@!kaMxF-niEc zfDi}U5LrrfXEv$sm_@(MWIn2YI}+lqGbhPgJkV8BFguRUaqYD(Xs<^+d))$L^HGzS zuD#Ad7@e&aMCvwQe?=9`%61$8p%v)wL@eeIu^jBEFolomCn(kj=FDnkx*?tg^AoOE z9|XnP=!wO}xcQ+83J_~Tg@v)r+@zzb){_XjRKJuZ0%~`q%!*RJ9}6^MvE#e3M#(YQ z6K9bpPQ(gy2vJLS2vtd{5|{jz?g4%)%vSpO-z1>*E`Ko%(Zn=(w}p)4QT+tv>1Vwq zGa$p*)srO;b0^g~_0zKG9-zOLMP0H`4K(zQe&#&{v57%S?MKRyYWiA~I;iwRrv{Z;Q1k~bk^Hs*HsoG&yQ4dA^K(8|X;88zJ zsN<5Yc@@1W%i*G%y{LU&P1UOe9BI+rXD{lUC;XWcMeXNr!rO-zJv{#2Xjwjk{1-}5 zP3@&*$QJeK$fh)07%b{@f<=8^pr|hrW^4TX7YS&C%U`TbG_iIKZuCM}9@VW>=vM2R z-b$8iQGW*%CCja@wN+<-TcD`pShc`WbE&eU7(Y)ywHlvly{F(XeOkXMUQ1+Fa(@xo7nN=HF;l^if>0 z_3Fm@p<^Ys^1GCKsQtJh*0{nR5sjoWP=b+7A{vl0<~R-#jT9OSG-M4y$o zK?CdPLBJ>OMo>F>6VbR8RJ8|T2~5Bf4v%q13%?N5;qUBv*!2IvgYX|mI(oJL{hQ4G z<4DK7UjxuA|7}Nl!T#_q*autUNWXPIlv=B`kTpN`BO`}cY%g$%AHdjnOC0IT5H7Xb ztgIvbNS)_TIJsm`wCH?Co_m>Rl0`>)-jfJB_6&;`g(&CyQ994eHeeks5#*V{JTonN z-1Bb5+1!=(X_kq}jB@hNx0I7#b}$x*Yzx$#WM@d^?9?kbNo1d6@ru#&Qv7g(eW8fc zp4ts&u`iNHr;$4oKlm9_PexZ|} zS$^8dPw8AIe;dN?U16oLow+>^8MxgTj|uT-b`V-XDlBlZLr3FL+DbRCy`hn z0!-5a6v(Tn)0qI*whS|GA&ljWUz~RZv{{4Hj)1TyuCT{?;W>omQThW%wlfL`Dseye ztU)h3JBnPkXQOFHBUf; zGzhL(HYt&f$RZnNEHe<6N9h}6c$>AY5{gbP{>+YkSVAk=Zd0-~72HVF+m&e=)h%gv zFeZ0)vHh5LswnR4V&gRLA`zDHQwJb+H*YFK85hb2-F}a`0%FR<`yd4at6z`(1=N|< zgUuWlX1dxii)e#4$#+Ir9;HLb_WK{SC*(}j3jXk3Qw-XO58`_Uv$u@>K;`6?F|qEC z%DSye{w+%Wwla1bI8mY%C=&&6!b3D@D%;HB#ij?5Yv=p+VNUHJ>cSAh-m$31N9?FI{B= z6*$A3r`Lr0sR{$bd<4uY+3Gn1FFTNJQ<+%eEK{4JOp5YsGhmB_t}Ud6{1Ze_4Hx^W z;T8c6(jZjpsD-1>=`B-uVUxFugjh(?DTzI_A%x$ z%p-Si;c8Zyp8Pt`I?x2(6paz@tOFz2vkt$dKJpzg`>*Ej(F3RW9WncDbA;G!Z>(7C z4H5~Z#uOp)jznUqd$E48-<3$x$UU0VvcH*}R5{OJU;Sj$-ehh>|D|SCpNgsUxe)yw zF*U3DTqx*S)mKu`=cOJeweRGj*7j5%EMx6|%AB(^^$|~7d@m_0Q(;cNevpz|lUfPZ z_P-?ZWNLfn`BBi;r<$q57LjIyny?u%NBc0>}$sm^W_@!h`K{ z>q=xveJ~mc6*|u@2O?6b@}zEHmMWRSI;mWuRZB`~YF~`sc8x@8Q;~%9LN8&NoxI-(hoff6Y-a`$9xTkE$Z zPzXLv_RiLP*fn)1nGV(j!Z3k7L?WS786!g_5=-4pv|S{UOwFP+yNaexDn+#2#pb1{ z6+{~$k=oR^1>}Kot z6m)+oH(Hz5VV)Kxn~~d>v=6W@1X`ZE;MvGLKfmCSugSR!o(fEN)Z*nQ7d&5*kGtR* z?dAE&1y2TOg=!D^Pz2qD$n^;S%tE9MDDFapVQ(Qa6%lVCl7klW3l}2H^3w|uO6M*_ z?m$>CM2hCY`sRSe$nQ=Hjz!zx4_~JSv{)7*1K40NNiC5{>Odx7lA2xzwA&EIl4z}f!kV{;Ge|%!8l)B?!k)Oo9-in5gym5&7M0UHw~()T z;FrD1fv?&q_UF3n*>Adgs*{ENjlyfTpZzTYYIoTSXQBybTz4R^@bFPFmx^Cs&CWEy znHSe7&eyw~*-4u>i~t(W+6(6zAYno1=iF03>jRvLCY<5=CtZ0|oIst|_0g_a*MV$y ztObVRyiRd$E#|0ZKB72}Ddwt)w*(-9m5lttV=C1O>M0zjzL&_ zs7kErNi)#kMAn?7o*X2g1p($n6Xv)MiA`!<|Sjt%cK-efGUpbi1tPntj=o2U?4M3G?~w>ZFDf9 zefT9ADxmeQB;gpR3qDIvAeG;m_4_J${^7}!%5&xUtt(FzrwrzGoQ{^~iq)@QxqzJCX}PiaPyM`BUwIR`yk@3HDgClOmrhT=*F62i>GHa#pLku~&}F@U zjVy=XGMUj8=w9L8sJTngKOmq5S%EmRONU5gsp_?OIUiwpRIYD^fFUa~S_znSyv$Cy z1rV}SBX6n_&r8@+gF$1J92<>DlqRd1*#=rs9bY-WMpo=`izxXBw?S%ug@X@87n*kbJh`#aULOBF^g!G!M+>9@~AwXh1qHu2Pv(7Q2#LA zrqM;JYTl}~YOSiw2l62@Rbo9CvyYd_61-hC2awbRiy2+BS0Ri6P|GA{uNP2DR!mO9 zvg1x=>1a?n!}>v=;K_Dp7kC1lp#_>=B~9y0nasMDAsV*K{46gO&>EMeuS|QkfZ5en z`8cI^c6|NDV|KO2j7tLZ8m+Dx=b|tOT-!G*n~Q!)0X1rnGCk46^tcp?l;u%*IV;qC zRK94z%YMJ*3G(B55E$}lxUqEXD%!wwRP zRRR>Ke<*uGtK_1G*R7EpjJIUO0Rgh$k77(A-D>@Z{YF%nfH<(UYh3)l3;;O7cxfy**P;X~}Kq}DTo zXy3~S%|Tcmm5;H@s%^4KPsoU&t z4_7k3lV)GfTsp^A>h9-BLGN)9B1p*qRL4IZrQJ)X&_BN$Ymf43MvkyFGTy&co1I)e^ z%58pT{}Rvwmzh+2qDjTaK@U=vN98|Q39QgQM|NdC1t-LnF|Cj`W)&CtrX5lhO=(Ir zykO#Iew2XLxXgWKeVNRvLqB$7_M*qE+G9p1f>{$_Ml`%!;Ai$10U5XJitE$t30B^r zp;Z&RYPK7EUP`l}9y2;Aa3z>uGor=qT1{EXa8Cg>dd$3)S>+PefpMXkle#jy&0{vs zV@4;4d2oOk(c*TSpV?gkTHrCumf1AsKPJ>;vSOC)tje&qR-M%`A-A)V_ApEHR-IKJ zprOqC%(fBG8kd<=7@|pq!3!p&ERV{n1Ht_AP`@dP`IlbPXuu3xF~3|hZ&e-06(QAu zw5Sf`O0D?*ssmZ9qfM$EEz!|EtE8qc)zL=Py)4sFLv=69bu^}G=2bfCR7u_G(9zN= zDc!4ew6;p@e~pedsII9~x&XJwpf0Frt~sRhsa(z4dw-~Us?wad2J>fjR8~N9*%!M% z#IU{Sy!mQ7=mF{V?L`abs};u|LtJri#;#`Q4}~~G=Zs$U+7HV}DKmH}w>4U-#u`~2 zuMMf?ag&-(uM4T^bc>qiJrYvWyjC@JeKe$|u5D`S`dBD1b$vW!Kn;E}vPO2^p3w2m z`Qj|7hZ>kf-QnxNG6JgApt}2}DKqFp`^J%2NY=>K+xwyZVuZ`)8+D(-{mS3n>Ys70 zhm{jnSeFB61zs!Sly_q;;;xuBd$_q(KI{~DCONEfl_XaxTP#Ejol-< zl%*64AQEO~{!&Z}s7-^^e2i$)(D70RwU9>%Uu$;1f7GV8AWQgKv-|y{$r{+hzonR@ z(Tx3|fZkG^evsNyyyawNYWmUm+dKd|{%1?^|CTL9z0tYpUns@IGpzK9?J)G3310qa zB`(ZIy)fc$VVJN#dlfj|7GyoTkgdK39YaFb*PssrEH$$YM7nGzk_z@?^j8~qM9kY7 z8~{(}ukgJM}3t+V@~Hjwhr>U{Y_dlE_7=lhN(j_sVO~?Wyw^c|hKyUTWl?iNKK#ti#zvsKI~xpp zI~$)O;_YlK0-;~Hv%xGsy|Y2-+?|ab5q6JQZRSj7zz{5k-M;A=)kUE*C$xapH3#g5 zAWria(7fh0D%Pq#AvkbPNoy%g!#w7;%!C<)oaQ(LVay;_f&_kY{7Rk3GVW3!b^L0~ zuv0b9aEt{XVo}QLU~<}sROGM+dghS`%cJyG3O?~fos%zj@@IBD0*nF?Wg>$-Gt`rU zP3D0jSFpb#jA^ZwLInGpfEqOjpRYq4UIK_CLNJF2fq5X`^^!+vJB7IP7I;zAsvM}BC3vrl$7PvwPXQBz`ava1#SRSPVsnhL`pRPFf zSLOugzXC&XzFn)Yk5}nZQXiqbQ^lH;Y3}ly<}(qY(=Qdb|4@tpsfZ?0)fyr4lt*cV zQmy~{JS7!hf922YxEsDcb!cimgK}s}%IHrtvmBa|LV8I_(ptEIhW#^VXMD#{>fp-@ zK?=^aLaBqVsFeIKq(Nn^3zSG<^-q6{@yi#1WpS%H9OD;h#NH$( znqlu}HNx`H6QAG_BRziz9x>9ua{qi_h|C9W!+KNC2S$xm^MS|CQ1aY@9UJ~$90+-S zZa&~%aDoNUzjMJ!I3|d(@a{<=J{%U0gvK-T$aQ!|<&L?i+%XrGJLaM?9!KSlxv08h zPG>lt@4ZFkbA!?MIr2s2JI_)1&T~}0^Bk4$JV#%HEYXODO^v|J_Ju06YjLLVOqucgl{0hj@Ctd1xDw(?0n{u z?>tB4JI_)1&T~}0^Bk4$JV(`co?|P3X)U8)QRlt(Z_F#-d5+3=o}==e=cs(=IeH<> zKPumOj`k3ZWVDo2Wo&69fS_Vh{|`Kqw<~SsC?%+ zD&KjI&O+X>5#x8Bt#zMe^FBF}c^k(u@8_s1W^_GTmSw~a2grK1FH*JqFP=io&yi|G za|H8mV}KHE!P7Qkr!(@GFd%+XGTyCgeDxmcmgkb_{d6a;- zsT~l&X~9zwmPbw!rZh*8X2+SZJbvZsA4K>TSPA*O@CXJy5%%!>1K}Lx6Lqs61h>&lD79cE-oVDa|8EJN&twi|26M^sCB_0<9_1>{Ah%5Xe6ryS3 z{X)M8r2=a6L|~N@5r``y;FVt+VR_{2f-*AiC(Vw9N`&laeg?1-haW)%20bf0=ojG} zq`RI;rcsJl!r5jcI|1BXvuk9)jkzj@^@4i3`2+lX#>3_gWCw`7{)$_ zUy8E@vi zmxI1BZV&djvg;Gwi7UF}MxB3vq&%E$X#UHE=p7d*_SuSm60+p)&3WeKCc~Z-R|cdw zO<1=0rC1=K*`5^av_f80cUG~Utrj9nFH~H!oz5rZx=vvPxZWS&`h&1&_j5HdxT7a> zxr*9E6SXmCBV~Cc=}fTnt6eR6W|E{c!P2jGjnTkDP97}%Y8Q|3g^Y(vyvf5UupVFS zI`$%^#7hYCH*H&F`nk!&f9^;_aTp1iyd-4ul90*E|Ng68+L>@|2DLOH6Oe>VKoT+m zNyr2wArp{O2Rxcs3wSIs3h;O$26#^5L%R{=>TP6s46(I3ye z#2dg&B_2U-bP{jlnV@hnP=# zBIbtLAfi3m{GRg44LykipoVEAc|(tVp!p6Gx_U`=!T`EeFA1r{jHLFGs zXQeZBGML%#+mv8s>Hw^3>cG$NZMWkYHg2x@;M zDVvStCiH~%CpIsd%=-$}&awY)Zwr|6(|qao(|o1F15NvBh9T(sX%-^< zGk%&8K&g%K7NgKohCM$G-)r&wG@l^y3;i_A^3#4AN|)S7&gEu1!mgiY9dt7LU4bFg z?e_OZdGKd;5L&>pGW)TpIAF4{%>K(|5N|19X_*65tf}yNG(B@5Gr8^%bqQ_DgNmZK zL+(K`oD&+P{4}j|FHs{7mdmV0Sr-in$eI}wyK51aN9ka68Rm>tI#bp=Qid+LK%|(V zrBL3Hqm+coJJJV8nAG`Y+D1U_8l+b1L=(<9980?LD4j|b&uza{iJSF~+zAZD`CP@h zRe49wTL?q)HMyB>$aubrY46B|%;Z|?F@!PL`=#QN85`@aRCrAe#U`EvB8zO81*}3? z9;H80wv`VqQnIDAMR9x&^9Uu|O4lk2(PGTI{8rgbCL6{deI>Q0fEqPOaVDB@#(_-I zl}G8tERW}(xlFOlo+-K+7>e`rF6UM>T=NAEAULB~v<}v}PuR@%bACub?E%h26VCWJ zDe20i^mf+Xk6*dGtIj>(?p2&Wb~!&ooj>;LOeEOc&$&TB>s`*-k}tc7I)=^nxe&)M zt7JQ}luM-xo0?bo?&ySoJOYTWnw>&3>^D{`bPkFr`auQNAa z*_C-N%&C~ydCcYGp>+Y~M8l~x%}Lr}fq+_E=00XqXw%{5_lvt4^;D19aF5x;=wX5E zH|qsLdA6U~r2=YqnTe)E6HVdxBxQM&UB*g0*34O|n4f||#=)iDdSJ># zwH_F8wUU0-FjW}MJHUh&^v78E>R>=@wKTv#o;kAB^~tzrbjGX`jPNKRL}F8kW=0Oj zf+CDHH{L;ta>TRM^^r(97%8?D=7Qdi$-R-$SR^K>%D))oQGZ;Gy!3JwWBNT{#Ld?S{kP$Ct_=uws48>0)dK=-fI2E!c z5}u47$?#Odo%jNVr!PRbD84`OXE0n6znbBro~9|cB<8zHJS_ay)me`3CQ z0uDr7yrL|$PdieL`0v0p)N~1gxJ>e%YDD&B<{00UaY9E%EZ{VNL}*e1K_mVWScWE( zODul)VF*tVt&MyGNRb%vWBMx25zNc$V!|~H8gX?MC&RHgkLtQtaYkbKfLW(wRuHad zFs85KJQ?A*x{8xQBd)IEWSFJag#VVhit``@mGY61^!ug6iJTHAa*88jLrR>;DRCmF zloQ!9CP3zv^Rs!6FGt6b5`S_^mSibelBHxxmJ)w*O8m(w@h7LmpPUkZa!UNkDe)(# zlt0;`KRL4CG0-oNf{7HF$CANsFeSl@UoefCx-S7GQpa-sn(Bo)Qz%u6XE?PFP$H=( z(8EPjQ!u%SrM5?9kGqt5nVU%I$22K*;Ay7j;c2BlLGN#;OX|LF3Gh(uzfU^}7np@yn0vHW)dN_{>M87evO?n2O*Ufv7>-F>iS=hVX;`=S0B8_jqEejW z16x2Rbs}zzz@6F?$$3|_Z@8o{1t`8fXKfmD=ncgD0u2n628J?IQG~73g>97adptv_ z42&F3tzv~v%>KcS&sh1Is!$l9I_>4nAC-wn&mBwdr>L2fg798ivcKq8y%#%fn zcpbxYDPSzV4*2miS!9l3eSsN8{OmiCP;?mR<0iB7`=Bz%pCqA66d`ss@yiL0#f`}b zFCBvLw?>jI8INb#ln55hRyg6U$dX-QZ1e9#v=;3n(!7r_{M>$NJ`&Ju4JuDxs~8Q{ zYF2zkA~-?|FxD0oXQ7_qWvtJIXcHKj*5|_@?;*e!6Ox5!QfY)=Mpzz^81q-YMfplh zN_4g6bF*Rxg-rB8RiaRdsWigdFrrb~R4R4OSFd`M>iE+674K8Ja+7&6Nvobd179?( z5C-<5hvrv^1uAv?VRaxb4O|>n_S>LRKr1zn0xC>6J11jbiY zbbYR#fseb6(J@u;E*F*7`?Xvupv@YjcoR){ml|ObmPhT5lN=k6%o{r=YX#2$9Z1; zsF+GgFA(nbqI>37a28=+XmYT(7ByB3N0(<_Bvxkwkv2d&Xaj!fUKG%54JyC*2E}{1 z+XkeTt#WHw#k1&l%zNFUh2UO`t$*Z5B)w>I6giDkBK*>x2E2>0>Iq8xqRBAN6;`As zBL3&B20bY9%R<4^;FX{Te?VT;V7~?r3TUOP!6`Q>-pgDK#4ev}yEK(wsMAk%(?z9k zvnru}a)gxnNp@0BWk&dS2+O1HIBHsKUG_W0NuR<*Ic<;8UzJm_rFz2F3e}7)jt4mW zpjvIIrCP13uX`XD91wn;ngq02gOn^p6Ilw3Fd50CE{AnyU(42=Nna%rWLXK6Dk;5v zHMiD^2Wa5^wJeJH8sX$Tr%FmX>Bj^#NP`q}q6zbIBTUNjs2s%tJ;h?DHsBV;c_@Ys z{>+ZYav=c6Ghi@`S~$1rDRx??S}#j{<=m>XY0A^AG00&rx@~UNLP~hLwL#K5=T=N3 z{yb|>P_-9rm|HQC@%h&KlK$k}3XYxT0_$UmzdE-frw#ElMIw9ABXcVX7(dGzCG;Pi zE3M!QAfpxdRsLE)vo)xE>8(nc=@{GitN7t)khxKdy?!qA=eQh+tw+8v=QrV}5sJh( zHiuuAAVrSEID}_=m->!2(CI4|BTieXctq7d7;HhFYp}jH4aT=sgmFKc_TmuqE}P!~ z8&5>1RmjM`jeF0cDAx`mXdr&&t`yM9KzR~P$}`^xldnALwqs@5+n#lolIcn6j-T1_ z9Z;&o_Ium3Jw=nE-A7B>qDo?<&602@0CDt4sMrC1W%p+}98Ees=RiC2fniK7>CACqBF8z`g4JGQ_bP}klP%j_1_ra&0KIh`*|-E zP`k&Q)lTYO-MQ>do(eTSsCc_BAG4zzOFE_KQ<`^^;{CMdtt;BInzz0j{5knX0IGk* z6q@k)keYxVAw@!(@Phdzs}az8Pcm;XtxGU}ZFtK=O0svuv}C=)e#sscF*f@pdrCmg3%VLg#U+|lmSQ7JG2~I_(1u5b zH>^=2)_RiGV~MU>=aFHC-Ni=+Vbl&yTB>G$0kyc?!d$;)XBKrmIn10MHr6THb37K; zlZEs{r-uVQ=3H$I-DA!dZy2tRmV)@baGUKHV6}kST>(U0qKUfr_6ZruqwblBkY#yz z&Lc{QHcyt?BFG}c*YYrjFLaR=3)r`HxTY88L_;m`Gw&s!^)B=5_*#DqZTqk|_g;Kd zaq9FshUdsoK6UYMm|^zG@~w-9!(*hZ$5dQP!>!e2J+(p>Z0m#^>nOk3VLqaxGb=7) zLwr;tPZMEZ6v;OGh5d_wob_4^(JebQs_#Sd7 zQW7U3O5#1MM8sr-n4AKNhc zEgDo_^OO?nHYJr&aTi4%6w&Pi<;)drb~RFeEt}$Gk>QAERNkdtAshtXlTvANP^BrJ zN-_tV8sUtO6LBT=bS-sTg}lK(!)32DK1ypmK@=blbZM?m>mYcmfZDxM@aCpH?MaaK zipV$5DM{CAEzOSWkVQyirjMb4`sByl#tQ!y_u7n$`dk3_c9qO4#W%WTyszs zRX@@Qr$tqLY*ka1xsm}I$#QpIl6iL90$T5J_Ld7hccp!nMN3~%QfHU9 z>ybq*POggj7bk?Hc>UC07LfCzTXbS#K6;L1v9F3|{-UUF@@z7!%%%PZO}(w+hlxO5 z9biT@l&+>M1u#NDEgmz^OHdc5C0~g;JTZgcMIN&y$f7R7cqOVkMy1)S0cJ!)v+^iY zgSzXf!DrD9O?0V8^b-=5q4cvL(aiy(L_?W-L|I?zE~TWA*bc8LN&nyx-K*Rs8i^@M z)uL=H;JAdtZ-?;$GTbBiGC~neMyOgNOj7db^>|?@a8C_Pvg6LF z&_d@JCG=C9eg7$xI}hn0b}9K2>;E9uaGb<-ff<@`C+_9oh0gIB^NuzEcjZhbZa28V z@dWP9)&m7x;GbBmdn@2z7x*z5?Wcf^E^t3K>lQZ8xZUIezh&1kj?$xh(7+@ebANG_ zi5Vr|aj z67q>TtIfO}F!{*6HBpYG8cDV%Ym!ij896-kW=%F10xcm2*sKf9xxh&B0GoBG95yhL zmW@ceL_*2Nv4~u0@_=+Kc^3LGYq5}alILT7XDyLPY4R23St^m*WFb~S)-s7SBzaWY zT5j^V^PuG0SSwjqnHNBv!O4xeh;&G#F*$Y@M6MR5P02E*Tqo+ZV7y1bK4f^=2quAu;S0`Ak<+-b6aM_9!0(!WZ0ew z=;#X80c|S6aeKj^fq-8DCqqXIs8fRq!@eT;!49PfTl1IsY zlfd!N(l-_U3nYu5*|827jtFq5Uw{{d+Zw+Be-Y3I4N|;_CcJPghm_=z?>~?{TldWQ z{sYM;xIH-g3HLzqO*QNizCnMZyM)(gs4iin7W!3GHvW1JN2dSf0|?fclOf%%gTY>% zMF{Qp9Kv!IAvB6XbrvDi%rJMgSKz;#MF@>%P@P2xP1p|wAZHOmzOx7+-&ur^?<_*d zcNQTubri^`vk0N-3lLUk5kfNzfgwQ;J@+?Bg zcNT%|S_W)=79q5NQsxZ`UHqLV?WN>y#II)7cDNmJa$?#LJQooq7C)Zw%NTazy%@fn z;nMh(#JS=U;Mc}q*%{$0nYST+0C5&G+}}O)kTWQBA>Tk!LN94YekJr$fr`+}79)o` zKrs}kBJ@DR8b&V5vFVC&g*2lt9FDN_1j@{C-oktv&Dq3yD;D1QEF{F2fp&O^(x@6Z z;h_wNP-@JVPn?1ed!TbTyl_bZBqC;vC%1}t$|7RLI5rzaJO&Z5C4uFAB@p!1dL(uU zBE{;gz%^zPmE18~Lbj|_geVrZg z+|T&{^6c;A!&al5eE?~84g$5&&O}Jt;*1CW0nQnK9O!I>9S(Bh&~%LRDe%WS*8(!m znFFZ~b}G=%wK@kw>qDGJz<0cJ5uS%S!@zxlQ8E~UMk*{WUv)idvo~N*Ed3^O=V#Jy zLF|Hz^IKTfPCo^0i!$lI;9qej{SfL#NhZAzgwmPxw~(tWlfD}C$}{Qb!L?s=`hE!5 zzu9?LYSDEl*}U{5=u(qO{~e&(O!_3m>N4pcA#i=hxf!-Abap{m7CFa)adA2ita@kC z4}e@Ilb#D58#3v!i1o>&{{cPvW}H8;I;HmktbZoGEu&q{MP0)zkED0<780EL!HH_ zA-gz3Q4e=@#-c6_OD}=O&6)I4WEq`tP6PGE^b;ug12WD`An)ni4iWZB_XNXn8Rso< z+{gJAIh&j>VWoW?3%L8G_k`9HGU;|0_^^!A0(F|x^~io~v-30}ElvWF1JXlbzKNOi z9ORjlakfVl8spRm-VXMfmPzx?pXr(OnP5F5;|xLG@lGj3JJhksDE$G# z$7IsCL63RO>8WUL$7Y;7h}f3i9TbksI5x6QbS5A&DIJB-CuE#GV5ceRlYx9vCVd^~ z{3err9n4S8I3J<3W;nxP!lRrtx`?CG=b*?gYEI99j&n24-N2sZ{2i7&))@rhXFE?p zrsJF{z~`ig1NZt9)2Bm)8%|7r0g^YKnBEzD&dE5>f$4A3`4Du)iO%IHgHxOfP|9bd z4}`(5YfiU;+U2OwD22tD^g1Lh$vCTE#`7E#6wY@VAkGEO2_Sl*^8y6C$QcjF#p#Qo z)E&*~iRq!pzwX4eh1m6(^f55zJ` z(s$vx0xbrhn={Tr)UxHycwk@UtU%Td=T(HSc7_9fjq?q{*E-L@pqCVe|%_hr(r;otok=V<71t5XHJ zZ%Zej{U0;wFOc`4O!_y_?BPuME|_yoCjCdCugy5c0N$ORLtYu@c}R4RvjV1FW$7F7OY`T~^O^O^KS$oxVk z{WZ#9ea2Y{7HgeT0b7^;9iA^`(x*eP_nMtYA=qQ-bD+})&FSMnZew%0792lpPOk&i z*D~oxV4c@9=@qCIZ)DQ*V7)gp=_?@GTbcAm(E4k}`2Y&Pkj_V4+1#8y2D#tKIAbB` zi|IFz>u(vSFZlo2nG1q1JJVs8SDY~*@E2z#xWAfif*m$xoL3<0>*))i=l3uy#QP+Z zZb6n$GwHR6eU?dokF?J->HWcVbHA!~NoYu4 zXVPh;f0JQPX{63TZ7a~7ooKKPG)ATW@13zY**H9Lpr>BCq z(U8tXirJ7}0UfOdw;ykgos+~+{nS*Tls-P4a}&oX?Tx5q)B-XCJ-RW-D4j8xGZF;; zjzE}!rfC=x7#IUcl!0xLJ;p#EAgvqW{}`Y5UgRK1A$rw&H{2Bxi~5`wq{9Vf9EOVZ?=?sp*fb%mrmR;_Ao|S4WPxI&#F-kt42-I^wD`9Df`$$hlTW z&b2ynuGNuqt&W^)b>v*DBj;M37a&B`8H-FYN6xi6*CU+c_|CP)7ElOH|D4~EzTA`G z$UO;8Ta*gRJqgYopoUYFyeA=c(doccGm}`6`2(}bX;?>2!#Z*r){)b&j+};d2!#Z*r){)b&j+};d&R(XN1cY%oJX5Hdf znU4aiXl5G{CYtR~#wg-aHa1DJ!`ntrNo=y&0klH#l*BGHuSfxno|4$5a;V5CqNgO* zE|E|XJteU#O%`peh@O(zVj=Am(NhvzB9YP}dP-tTB~n{NPf2Wh|dDTysNS$2bp z=qZU^Wped3xM(A3c1WbLh@O(z)xxx?h@O(zb)rs75%q{&FOjw)dP-t9NMyEALQhHT zCUZUcO{;~4;=><y9>i65~OaANOZwlzDa`T^qesB=#3D4-khcNnf?I23<^;d+K+ z@f&9%+=J*&{CKQ0b9!>+SsI^CoL*cyH(~X632-fv&gnfBsQPfSGC?B$N9LBp$&MUO zcI0rfBZre61EZuqoSaDWrRzK=(J%tVD2J01eVADtPEM%9$z?p8obVk^PWTTeCkF9Q zLtZkm)2aAhHv8D)jl|CAB1sP;XJRnJp}5r-VOav>l=o1K-ie{3fFFtR?u{_ZxV#0$ zWM1KVUr@2-hf@guM8I79nRd(g68NzPbLl_2C*(l~v*U;E34KWF8v8An5kDWPz0u2< zojKhT4rWJuU4Hk3Yf;AL4W-=^u0%63SJZS*cpO@qxAg9wP=YSsylp`Dgkfk0<{dk9 zPdE^D!d$sa_k{h?fXur`bWhk^fP_^eyC+;r9;;irCmc^B-hXiSgt`zC9z48z!j)9; zp())HX3`{UW_C~b0}~!OzI(!EO7+;O-4k{~_hCM9M)!mT)cmRQx+PSUPDfigiDT=f zI`Q&|6hErSA*gee4@@Egr%61IS@|COg5RiU=lsgqsG!!#D!O!jCF+S`ouZ=c^DCF3 zW3x_W)3p~}G{0)jB)pKKVyov@xAsKhT>4{p@qf)aV9j7(WN&^4<%eGlJ*~3@&Ynh{d{znR zkV$^LHd)bmO5rpab!Tq~^4i(Mc}3yuZ`8fj1?Nx?=Y56KV$|)VPwKex%=d7J{uT^!hy1X?dvps9iY-+Vm}d0W$5(o%t50T#CObZt@02oq*F#z-nXXJNdu&KEMD zX+CQeJJk7YP{D-Hg__S~Av_#l?CWX5_4LtOmzaC7HsT0@C`A zVsO5~V?WB~DhJ& zn#JENHqOwZ^}x7~z0`Xan|^4~s{qsx@V?Hn27o&${Rb8qgcfZ84R%`_HNt~Hkhb%o zw4KnRC(oQOE&5HM$L&|OMs@$xd+uz1{QVBes($Wlvk`_CJ$fc8XvY^yFBeUr?5|Ot z1&Z3BA@#nyA>aJrss#Hz#c}-<`;NaW0^6to7B%xUwB!sAOd^$G*kQ}O3{Ndur`ihy zuyV`1`bGT#INj#F7KQ3#;4j?LFZ@dXuXr{069hP>E2b((gqj zR!9-|9(x>;aB4my!miQ>viDc&-Ye>|LgusqYqe0v2~knxXk^4tqoo!_W(%mrRYbr0 z6^R`Hc$m6`_d`hPDszhx6-M|_CiBs7Jgd^{!Y2N;lKvG@g}wAfU??SC4=V9SP>DBP zCF*(f-}-An>Tf^ONf)}jFq~TAjz~4*0x3w4>JTWeU15JtXy(h-$%dtTfU79F#i)J=&PQwbdXb}3pPH$@ zc3S}V;46=DyG@_rss4ctrHNaPaeKN8JcJUDT8jZ5Cj(sIr|fSIk|nvl*#*uf@Q|xT z8bhDBsV<|2M{uDH5nbTDWHgxrFb+Msz_*DxMFC4Sus?U|W9meY!FNbP#w;kJcj^y? z`n)>q;crw8+Aai&_&q%Wlz#5;PWP+BBIds6`Wq~DO@O7Y3BVa2UK3!cYXU5FO+Yv% z1sJ%5G%7p2_Rfz$0Qg8S&JBSW2t!`O9?EbC7dKpk|8e5v#K0{yx(z}1TucaEvJoDc zkIYGN&n3k@mlXG0QrvS%anB`{doG7>pod#FAXl!+TVzgUX7Pz7#V3{&pIB0SVoC9d zCB-L}+y}WLN%4s##V3|jJ~2(Hm&y5k@<-G~BPl+y=;uA}XPb?`uv84FK zlHwCficc&lKCz_u#FF9@ONvh{DL%2J_{5Up6H6+eSe{z>yQLWgXa3;T`X~P_eq0x` zFF~#RpX;8WR{nqPp3sM+u6d(-f?D~%+dV<8{5N$^P%Hn<-4oQx|C{a!YUTf9_XM@_ z4}S}j*gZk5{154#pjQ5E-4asIu$$a*noht(L4Ib(Li867-#xc> zWShegV&{E9Z3Y5fPt51CT-`w0`5t;j{t7VC2&`}i1aJ=|i4+ZCwkBr#KyyKNEkCm( zbr%y4`cfxUsWL{jj-qdKdXHq{1;E8xWL|N}tBj9*UgDkeM1nN%FqI8RK$u8?E2>B* zwU$g~IR8}C^_m(?R*;G4ID_!QD`cGDA(o#TCg$sIA6%!tj1BofDs5EJE~Z1^y!OXc+V zCdVEr`#L z^~ZBw>;XLIVq3><*o>qcULIlhIUhkIhnGj#eVH$mpnulx$8ao%Yg)TM!%4%w9VW5| zk!(C^@6-TA6ZFs8JD&*<==DSLV1`3E^v|k+D~3S}b548c_ee;70h61Ni;>ke)QQZC zpV>iZ?ry*}BfJs|Q_kEXh-gNcfLT&5XPjnq5RfrR$~)oMqYX2r(xw}!7~l?aVWElJ~&wov5jrR6IWiFzxE zCKr87^X+!Szck-e>{8NKcM}z#hj77C3OR=Oy?#_!ivZ@&>=%2*Zc{s(h79CL%-J;}@Jr!ig z!&L*vtDJ3!rY&l)gn)aor_A5yXlVSI9kmFlDze0{!IFRmOM)6K4QjCTOi;pG(ev}> z;GGS{cQR#IuEMRV0IqU1lkX~asI&Mlytq$Tisvf9lsB9{PHR3zcCk$ z#I`ycm0Ogos;9v|mZ7*c3>q;WAGB%(9ODZdR^3?uHs}F-ljJGJEn;;mu)-xAxQL_5IfnZLk4NrUI2qY(D4x5lUY(nO+37NwtWDc9q zb6Az(_$ACBTg<*ho=_LR=RS8VwA|Nx70DWRv{{Yn61ea+ zS6}!VLPFj@u_|`#gH2A{)J?C4NZ3emE7u+`*|906u1U&$3;Q(op(f9u=E*Lw-DY0w zW$p4Q9dgcoN@oi5Y?lDYo?))_@^rZ*mU%)(E~hWJBz76|9F7V80{cR95&D~7=_Ro= zfpC?{Wq+Z=o?mZ>wssc?W=*7cOC53Xjj?n zu~NMOvFmjn?vdL)RG!r1K(iZcGIdgX5y$Q$k=oR1M*2!*kde!S1$KY?Pax#XPNHd8 z_F(%<%v{u^wY%E1wKn!Jdj!Jz(%Rt?IXiU}MnQWI5$C+r&N+xQ3GFAWti{Z~vIwz>5^FW{wgfSj|38(l(g+*U^A; zB=(`1e*%ij{*BlLuFBkpF+;RZvHOEl0q?mB$F=~$y^oh)e*c;Kctb#O@8f0IyN@>q z5$`_UI}rJW_wh2zPv6H&>D=!o9f+`=x)v^-g%PiB6N=6qxcIFK{_yo5K#SNC%)ZSC zVtOaXMa+IG)>6z}9diKDFea9)L#9ax$L+RHV0ZjVxQv=EpamL~miI`e=f)KVY{)hd zY6f;G+NlsI+W`UGFnJJi%A@?DW5DRty>uoHH~is3AYc@U6sIx>DT-uBKTS#4CNjM% z0(AOi+9;qk8f1j1g0Ls9u*Wx=_)#5sls`u!Ew0VcT4~YoO=Ywq#eT73-&!QEF)z^u zl7l% zk_vy5vJ6b~AuyC|54)ye*JZBpn}$eOA8BS%T%QW4(dF;sG@Vv>vnIDIrvuR}6sI>` zPV5)WxBQ$Y0tpqv&uN-~7Py>5N1}<2_-GO7%A}TFAAmcM#z*z%VTtPLrGha`2)$?AD*>)Z?`BeP&0cMX24N0al6gWe6WBPxXiN!T9G;q%#Jc|)60!b zUajr)m>m^lc65Ll(XiO}GrLhhYqr8{2FvhV^U8v*n&o0>Q<|OYG2<|ayT|-xSOqkc zp`Tg3fQ-*|8H!nnCT7Jg*`zFwiUsVsZZzi=c4dA6P!#hUJ?0#h&6@(umkXy_%}L7i zS^+f%m=jHy<9pDgERTw9sQDUmT9IPD*)ww#PAbKGt;bwG8nVu05?6%lfSg1aW$I_1 zFQ5f3^AM-WzV?z!j&GU=7b}h*cpOjhIKJs|tVsd+EpsH0T#n}p`A$E_O9ZsRvq>Jat5}AU1I&m9&HnDw>|p`5X^>yDax$A| zJy712S;lcSo98h*8Ph&ox#ll3qCqo1v;G3wuoY&VtewlO-&S;Gc7?}mna50;#_|9& zqG8kQOP^-T1T;v4d?RMX*JO5&b#7%>W+o=Ms?6^3m`PJu6=0SRw7A{oXI3JhPM4Xq zL!wDj=wXCNSsoQ*jsx=-tYfOWGM@(&#ry@2xip3K0p>(QhwEp4mVj!%QWX8nZax;w zKC%wtsusU&kMps|>?4nvG=+}?%!md}HDzh^n+4Rl6=wgM31(q?NKIE}tynWD&BC_Z z$fYSnY=4Cz8Z`4WJ4`^e|LCsSCf3ecyQa1)v&TGUwH`BR3UvWyM1y9UvS{|SfI7Fr z>}E3C#SYhXWyWuAD9v{9m`PLEHNcE$(9F+lX93lI-CeWyXvT5&$C}w@DLH^TuJxFW z^O$idXC7=b2`=7}bwIvHD7R?JqS<`{n(Z+=5L~5-5?87y-Wb0DVR=-Ho(-bM*>BW$ zRkseyR;BK7o&;PznsWl`5)GUCehGRDXk}J{IGAw`TX8n4=*9Nh9*S93-Ag=X7kkXO zIyEl|sC$i2-r#3;y?|=@c@+LcQ=*BcJ&h14%cG)+J;4h5uAW^rP2iNI(sYH#oQq-e z=76RZK*Om(%}H!sE1=l{=0p?bW!R5ESRNIBCi6$_CB3>b=U03b^G7}ATzi|31(+`t zPMv<{R|{xEfH~2GIX)9Y%JQg~NapX@b9*c1o0O?g%fdJzshGdxG3Qd>eAo8R`-p}P z_gj@+G|v&xAPw?&xX-Xke`inShimZTDvm$1<0!b+D&<2G-`TSf#zu(Z{ZGxiu}ap3 zKiGO z)kh&6q;QPaJfuA|(xFE6LG(Q0=kAvN=pnUgqzOj#KQxj{iLV+dcC$6oVMg__{S>7~ zv`3-ILt3bj4mWDX4h+hqsJx;PaHJ(1y9fS?5bc<4!1}uv73Z+q+8o-XiD=(D%)SZe z%FdfZszYv7cK&+j$_gXtKqov4SmNNqwscbwWe_-tE6Vt0({{2e(872rQR2mhDt z9E>)3+HkA80o*g_`uVp3DD$m;{*6?!o_$tq&rAO==HdHYw!R5ReMes3gp=a?UG|kG z_f=vk@m(*LkJLCRzTagpkw|HZ?|0ctB~qK>`(5@ji8Q2m48UG)J_iDWQhdM5zRJ7| z6>@Nj?|0c95@}5F{VrSIgp=a?UG{ZYllZ*!jCfvpMzUV|A&7Y%_f|;q^B#8+@I3B} zcpi5~vL1I_jAb~Zu?8M&+6(P4z4>y5&iOX&rVV$2IN7zw{X&Uok9)gKakR(%N}IHw zO#PllSS*oOQ{(ArULuhXQxWuz_EL#_o4<-iSSFE}nO{k3FPB)UnSTcnuaX#cymNCg z6T`m4Wbo3y7f5}>%gWQILoawQ_3FL@0jztES=EI;i_rgW|^c{0MT zFZsne=#2Z0M_=c5W%_6Z`eQ=1FS!lDtS?!`TwgNLT<7SC2;&^*_bfH-OFmUV?HZ(f z$p_uFy~4mq!P3t9l1V^%?E)h-1z~xV-%ly0Y|@#szT~%op`3|R81#I}QR z93w1`@{`GVi@}Z#zic`0gI+;#-l92Iu%p2DHToL~1de@Z~kkBXvC&&m!m8)jDTqLQ++ z>}|R95oW_YX0ih@Jiv@-IAg9Ui;;H{P>aXRt4Ni5up*5&qq}xxc8$kuyvIy7Ar1{N zyF(~1@H6|pfI3}fQkRG(W`#GEl;u%5gqr@w+}w?M1)S(g)8BZ^Wgp_?0P}w0i(lhs zK1e{u7Hw8xPBdX&YlKKy9+kbQ`4#4C!@6p|6ex=M6&`chh`2JqoM z^K5&qe4m=$X098qnB{8muyVrOwL%s%x0wlq(Mc-aw`<<2m#jq+dTu{6dR{QmcA14^ zkF%>LJyDuDL}@tB9fajkxtwk2b@PQrB|sY{B>b5j^MIllzwRn6j)6-6NB8V!e7S(u zyNrb!(S#emWKL4@2u$ZU=;?o8I{%&q20mkF=9|6p3KMo-MP9yH5OuI7uzKP z5U+!5o4t*Zg;>s{kjMafIy-M@Vi$=-3B{OSXxe#+1feES;<+9Q_fm3p77B?FY(KKl zMM^dRsS?S#9z4v*sGq=rFJQVV>k7`F;db7UbY7S)0OK;Rbx zAx3PKy~Gy-neh+FniuQ;TfW7^=R0OD>^00-vQ;7QF))wsFNYQCl1zRnvLeGAQZe>*zEGt~b=+dJ>OR@%I6z71m zWmT%nD$KGfOTdx^QI>wW3ZkIhidN}Xv?>XJQ1v#3u06=jI)(C-a#rQlP0Ft2454*} zrC2OyU(_vST?=psqw|=wqV{RphyXDUY zoRjtyVj`OZn{=+#a$T$C`3t;jWpI0oe192xHf4Df1WOoauU+wIyCQ#)7W;{~#?noV zRe?sykjHK_Yg!&cS9pRbD?J-b!|wPr4gu06~R(;tB5Yt zs;(tftpWcNCFL)Ke{Z_zm559Ovb~%K|K%mc>8UqQDxJ)gw9WJMqx_bS;)6E6zw{&yv zS_dD{RCS;8=VI5)C9atRtte1j|3w=@75H!4)n6msPRWH~{p!^(sgpUnexWyHcaUAw zNNRRb6RfenXdMd+aWasta$T#gTjlihD>$3|X`6Ow^R%jO3edG@@>lvUIlB%b!G6X! zh;U|5?I#o{R$iFM35RMV-IhSUKIy+*%>S7ss3oU3E3(}Z%SW$XnNs1-AF_i_*B-Ab z*yFkLga3)9_^T+RpPU~AX9I=q@L%NB@b1HZv9_0PuK$jEAtCMsw<(vq-D6;;A81Ga zerW|8YE7^r{N(%~>+Ps_D~ZqR@SpZ6-nd|A>>us^&t~!2^7(HY*c*~$sEWFitC&01 zaW>U;ru7rmIuWea$>6A;%cwi*=eadG<|b1G1Ns;CRqm?k*VWx< z8$zh=K5TCS@#|hV`b#9xx0DCV!*ylr@~CwC0^gYb6IIn;+5SyGvl}p%ZYb!<5T|zeZr@(u;Y$G)`aP3HQn*}AN~7}m61!CDpX~KL({~>{x;lPbYj-UL zk3{$Ow3YGNx3H_pcI&?0KTrYcvh%Y5ygm!>qHS=s=%NKO_i~|Kvi9!U<7KiP%TMfI zY~5wu)l=k^a1pCtbtjg^2qz82S(n9~3Qsj25 z#cs!1;^z`Dxa?ynPsgvkefk^Nf9d*H`%Ab1Rjns6FnHFNW=g+}>)4^+#w&VBE%BFX zT6zF@b4n$^;~&AUpnR)4Oo7>0ms(sIEKv51zIB#6W!5u7nS{CJTkChU)MXo|Z(omf zqKDfN^z;fG9de++>0RT=9K-&$dx3!k*7Ufo)iQcxHuMd!oxnh)Qx1C4V zy6#33>Py!ykivA`uXoKvwf!5oK?_9OaSvWMZrEpc<71M7qeSq1WOrS=dOm_p1lvxk zA!e(L-T~Umwv(?Zq&T`$P|OHj0?NQTJ7rQ>Py0fSEMz^ww?mOWi^BuP#r2S)7sXJzs zxnov#s{*Ye(7Li+tXCGAyW7F)((p|_**jKe`%OK+ftTrjup|0U3Cdxbf2Rb4Bg;?t zDY_Mpfpf){!5imH^LtFDO#FCq3V#DnJbuo=8M7wMJaO`rfs;<0Gt(G2{n%rs3_SjX zBPSg_aCGzTEdwV{Ip)}bC(W9A{J?R09W-#_%*jU`JMsAckG(g6ud}N5hM%5;<)KWW z11&g(GK#cKM?h0-nw++2Ml(QDkf&*KlE!8-Lrc*s#e#6vt7&n%-YboW!{yRiXD=yG z^m-K(sl%m(;%ik>2B$(%P*J}%{MR$=bCO#uyzl$_zV8%r&iOy7G=pMXgR(tp0oV6VT{Rxu9mpM7~ z{hRvfN5VGsW?R-}Th`BNZ)usmj)mqTXVVG8da<8Cs^36ISC&4}Ix>8sv9z^kaBXLn zr0XA`OGGbshM$6t?tyGycXOv+Brl!f9Un?p?{3=Kl^lC zDm`>vacbq{(d~YF_-`ql>pEfLtrPuy^dUt*XrDSReV2ZlFtN=((DegC*v3=?^yj!$ z{AVKHb)4TMe@Er-1H-AAr~6mxUqU7bPdde%2<66!{uUwJE`Rl=PxEK_Ga~4h_-}er z>bwd3VdVDowGY#W2@_LiPp0>@@L`Ux;y=gp*W)LqPfnFE`SByS{fOS^r@J4gH=#{W zOkFsGzxYq_-_(Vt$G#Lz-{wzQbYz>~bUXdI;hgsLN&c!Wo9-z1I?|?1I@61HF~OA|3GVNwoN+#cVqfwJ!LF=e|vvdcVziL-gqpQzwNqW zztFGPzI|uvf~l#EQ-)LXW_)^Nc)Qx~c$u2;_<&bBTlze+n7S zgo)fizG(ET{kLsP&82(&8v?(A=w_YikNTsd8~O(O{dWre(8T>z!d3p>{?z$1w)@xk zcjH6)1plt#(Vd6L2)6nkt?)Pc8`G~T_O}lXZb;F7EiP-o`e67W?3E!xANKD~6;Jb< zuH*{MnVNd@lvKmC)TL97q|TW#IM2VjVy@pbZ!k4)8u3h}Yi0}Ul@rs8?xLa>r_Y?t zWzy@Iiak@f($T?5A8}ccf7uQGWgY3kw)83ft-~VR=_cG&{w7zvFJ2eQ_Y+SAJY}}O zSh(NG%qLQ<_?^x}t=!PGsA7=*OQon2HIYrFyj^4|xdX{7J8XD;9o_B0+QGKAY#-S^ z$}-z9<_ zJGN1K(o@BeE&l4?r!JW0ulAdWc%Q$+-*;plectY`Zt_Pe(x=TnGC1h(K9ZU{-M@d` zw*7QLh(7FJdBkseZgKjQ*&~Dg>LdP^=lt!9MY&T&x$k_rm75p^MRUnvkxIp|2t7UU zPtemFCXB>-$$=fasqSwX*|OyZ(Fb>mkqsj|HtcwGWcS?_bB}DfImCDJxTSq-WXH(P z4PUxw_gmuEcPFmz-mvGQop0GPICsky`R~ZwErUCYD!zWL>ZM6Mw@=dj?>4%4ICC_y zio`BV9CM2MwL6v!{qaVrM$+l~ zHuzJD{9wfIpeCzWZ#xoe{;~3%~hxSa{I{zln|7+A6d}{SXe4`e$so?A3Rk2j z(=eCID%4=SdG^y77?ngUn|%7^6a**ofm&w2FTJi{yk=oP>HnS$>(nvG$i(O>we6Oh za;izP?e{C_U!^~XTJV0ESkPYz-p`*f;tyB)O{+Pk7b||W&;R}i8~aFQ`W?@vPrLKp zop<{Wh`FCwJaR+K-nC}LoUE`Y^~PzVM@G`u_^Z;B2B?^`{5he0%%qHO%G>{P+eh59 z=7zwz6GgSBuAa3WG@onh?AbVugMI0y_T?|Y)SjRdsYi1SByJaxO_|QZ^7(@%MGnj?dK?s@Z}{N%cM;=u>7Me^yTID@)mlOvi-k+ z?B&(l%ggPQ;?aCAGVFr;Wx_wEr*+Ko#zndp+iTUv&Dku7PG+sq%W(wPfy&NJ-o z`LJ<3zxn%IV<(Nk#tZUvh4|Inu_B5@PRnDe|2wXpRP3K+CYEavVRMDeP6*AMQ$^D_ zKpMZorxyEDa#)k~?oXXBcb_`0y2igce#zrs9iQ`QNrmhe8w#s0&1uzt38W_#zmTH} zY2Nufy*pjt=S159aInn(^x{_k7Wv1>-85Ugw_=;Wx`Je+-vHo{lM-Af z46XC$5XxX`)+q*08oE2e{Z9b?SbFkZ#Nq~rMVpXvRw0!t3R#@ccK0x|Ry-5pliJd+ zemS_@^Y8v#_Qd36>0LgGgVrwwY4j|UMfHrN#{&_&zlv&hfnMH9F`LfQU{=O)= zr+1*Er+b_LIhpP`?ga$DXC=}-`*)7+_yW~0F*n`6V<-1S>c->GZTIg?T|Av8P<|7$ z;HgcHJ%+PYnc*}s-(*pgN|syWK5+k5D}PQ7LpJc8sRh$hGpB6L6?_ET5>8_O{l>0h z40grSQx{ITKZo7E9h7u&>-9e<$8;hpOjPxlxrq(_D`kdWv6+0&z&gvjzVzwUCnrkM zihd|z!j>)R6H@agXnsnj={z&8NdHe$n^$Do&NFVB6o>s<;}Wq)4x|=G6YKptt4?ox zHhtoq|HFKGaWtPUrulR@lm0V3noN1q|F1}69?ioiNj$#2zo$Eqb&sVq>5)@M4`tq? zoF;vGY1Tn3=m%+u2kC}W^t(@nrMz*1-);%ZFi_wRJGSo_Q71GhF`z%%JSIu6_xZ6YkB2`^Pc9@$-g0!3oPRoT@VA7L)}QnBT84$A+Wh=qf9(-)Ci|s*j4H|0u-~?V)^m*(DkwwfxLq z5cj3i>Camvk~^i?Z_3+bep3fi&R|v1WGrq35zC}8_#I1PxYrpcURoGx~N$Nlo$|3K=TX?}mIVtQ)URDKufCiz1zRlF0ALcF_8 z0G3-Mp;7jM@9!c>%T6D^1}7Bf+$@j1{0~+7AFBF3jet`t7RA%l2Pn^-REX+09M}Cq z&d2T~DjA->Dk0J*U+xe|6N7!(-k!bzenQxlZSEiJ%XWp&U|yO-Vkh+Ni{OOjPq;rE z9%v>JP73cG+2K#+5OCikRJ)@XyyoPl6ls(RZBjo_uz!GJmk8yYvos>p4r``)a3HZa?CGR3G2) zSW2%@Ut#e!oTkp7K32MV8>OpzpG{AuboG6?G_>4>N8kBlj>jW(`xzkgZk zqUmw#+)C*g|Mb!HNvYZi)II58eIn)$4M9J|G6b&#VSMu9lq{2bb|93k^ec|WL$D8` z=}5e?)-k1*$+M_e7Zb@*atl?UA40uSLAjR>_#;lq`{)rH{8B-&|Nj9eceJ(iXCI9( ze+l+>RAzM4{3aLEa6Vmz3u^KM{`Rn44}655GgDZ6>g=e~ur*N92$mWq*%YR)?mSqz zB?dTqOzO)3vCrQ^|Ky?PtBd^`O_p%T2<Md88ihztv{ zWE}C{@9)w|h3b7}!F*|uxSH@Z`RroQyeIb>1uchY}u)*poHGkHPqjvY6G3x1$ zA64jsa;_I1l#ii`mmGOesxWGy@xqUHg@K5CY8vqyC?YBHkI)L(`q;(iC=R66g$P>c z0)m!N4qC4Di{C{d%R4A!nH+^I|BE7ll=tCRC}bIE9>@kQ>zcdUvzlal=^^$V*C1Az zGr>PA9ISG?JIAiEB^|V)<9=$8v#Hne%>AfWG)Uhc>p`SCA__uYiIpK77QZ*g!O3WC zOFDS1cy15LUCD6|_3JR1v{hPo{VUbNyppnC8#kFO{`U1~xS11pO8Cf*xjW|4!vhLq z$oHNwo3Ye|(-_r%&Ncrn`QaPKpij-7w&Tk1U&wWf%Qn2gTc5;8|TCP{^IgjP6F zcUi#6zf+&`KKKeX%BKF#p7y`D!}WXs?KW#dEKmzOTsZXRb~y3T`lML@YVR9AVfza8 zrm?!P&3wbvCgFe{RxBK6Wr&xs`;?oHUOe%hEthux< z1Z(G!l~%itHTuPtfZY>cUqH{!xKc;C9PGpanlJK#u=tX&-^+w}4jI({k%wJJk-LsR zH`CS40WB8q85roqh?To`JlsD)Iqd#yb6?9k%}T$tu?<@)NHvl@4-1vm=$un_DE?yK5$R!LUcY5ONXGh~X%mXm<@6&)uSwx~ZnHHHAAF7BGMWK9* z`t)_*lyADbXky5~UqfRPuL{;R4E`NLwQ}NmYzE-I!U?=GCfnxk_IWo^%Kse5(kHYr zAp4j&8%S1l*Hf{%$(j@(CyoIL_@=iIS{whmD|m+pEtefpiu z9Y?`~9Yh ztLd4>y*vHgsfE-0;o&R&;qCTk-R%vE3|~!KC)WE{4{l%yM2zg!+dmcilK%R2ca@cq zL6xRw7mhZOt2=kfj;-5A8K4;xg?g+SOeA_PO*=|HG%b=WQ6dZ*;Z)1AoTu z^jELr%`TjzPe0`OD_x_=&v^a=NA4R<_pVA$zjgQMPW^BD?osN${8*gSH$7A;m_yB^ ztOF$21J9+-oxW2?mPy6Wk4yg;(fjvTP``V^AKvlSdVl|pO48?!%DMjVNaftr#Z%Mk zXP1>-u+tye^F@6Sar7+bj#Th}#N=$fe@YoW(^lypw)_vbX{vUbbcsn(?c&-#z^0U1 zFeP=-6t<#d$5I`#@g4HtreDO|cI@ygHnPel6+dl-hW5pU(khYNq`%ZMQ6jA~Ik9b! z_Fc(0v9=-li2aTf;|-_gOygVD(R=D_-Gnu;((Wy|m0{YoMV^))_?=@#Qb{UQ_`#>D z?e{;zWu=y#abzdG$7Z;x1yhe~NN-5Zp`G)0rsmA>7c;@U&HfVvU&HW81IeNmi40-Y z!XCAFCYK3zk6i+ zqds|X;%F)g%L+R?A&5ckxM%h=$EqDKN-RPIO;V8{H&2uS|SzTYLhF9Bltk zH20El!bm7GktpJX)bo!boR~X-22xan`;RTKphs2TBW-XnL7mu1N3cuct}Tx_Zj1$R!E4+G2Zq-u<+qSW$V<)y_K$X$}{U1)WHdloV|*kM`Mu ziW-KFyg{oGBe&HEO72l4Ah`?oiO0~Of7kx=FVQaC9pmjW4IL4EIDnXn`(X6(r}wWL zq&==9y9fO#SJSkZzOBA`9c>ol4*@Nlp!eOY{d@J&?f~yJpvx7yMc&hsR`Gg4eB;a zTS^dB((_pEs@#!jH{bRhJBB|+!j$fO(!c6$6v{2|XVTZ_c~c*4vVY1R3;C0&R=1CS z@j3r(w4M5+{*(T`ZT>^@@du;n&t7+D`f=~^?M1|3&cPRW>#FQqd(RWOVJ}$;?}(yb zG#}mZ$<)jl+x#cCQH7hR8q!YbQ~fr-J?~5;)bCH}k@79bO4S8_le$NWek${SkC(D@G4h^Fk(gx4m!oiMV;yG^P;RH4 zl5XmNqRpbV#)|w-JGc+ea1n<)CP7^I}0ENv0P z=E0R07@a%SAEB-0L#b7h{d2w;UXl;8WV=#6K0NWkKc*I*{@Cv+2A{wEJi62WUg}I5 zU;c~yUdsE}%RP`Dbt8z+m95aBtB*Xf=<NSnBWE z)jr<rpnG3m2j7s5t=53{N}%&7fRdlAFrdWems><4fCJ$HCz%cIitU6 z@ih-mq&*@-qjR^Wy9Uy&g>n_rr04rXTSHEFZMH6U(wJKFHwc-o@)++b@DBehW|F>UwvbaicM@~u9Kmoz zxBZ;-HC$6(GS|J@=WP^Bv4!h9VdAqBcle`MQIYaZPb6THlz;s;|N4)pwfbaenpxnO zef#$Fn1E){at{?d=~mwD>2SVl;-Ej8ZkU}Oxvn^UT5)<_aeBJ^_ulK03cF!~KQwqq zcnN!E{tmG2Uc6unIbeyJ(lp+uybrzHmaLIOf3|N!N6X*+kYz7^|2X}|2}fv92}j1T zlZTI1C`zQ=i7#zSVw4i5=@gAi<0ph^-O}P*894M1rN-luoQ=0HdE2c|84lhqLg`zl z(h}<&^VP9(xLWS9TpeHLe7km{8pWP%hw9`}`#buSd#p6J|0pZ#|G%oI&itR&Mzrc8 z-iG^VS=;~IN_lrcv3(rn-J|)ti`d8bhDnQU$9h`9o7T6c&Oh_09&yq$_;pox_`jER zfc)wC_!otT6{ahH-+y3ULHVkCcizJ>H6DiKx(Z$@NRhZcXJ7TM+@*8j(Zn7+L}q4X0LfeJMnJG zc5KMXbG*U!b-jZF%CM?rRZv@3UQ<`zP@bvxf?!!=HSw&e4gw`8tEnm}uMX~PN$%((?GT>80>Fu&uUo>b&VN(BAt|8QAb}Ig3_w8pdnLNMLK98 z1q`mmjih|h6iZl@X(%ZxX((aUchND51KIwK*?!c#p2$#Z&0n>VaNVt)n}Y6UYNB2` zzcD*N^UD7Ipf^j++CAXWA&xCUwB(p-)8a)-=ZT_YU=z2#2vA?sSXY_}E-$ZZXe_A= zs!B>%lvih{jj|o0jkTLdoM51@xx2rsV_+cL>c!UH2km`5gT4J@=(RtaUC)L>;`a7X zRx@bL_P6wP$i79dla?2Cw`>Yp>D0!)j|aNV{tM}T z6}YxxMO}upR$0EZuB5IhSXNSA>2>t8g?gPmw9q=}8|V#sS_asdHhA6HjRBorT0k@kC(pKT=~)6?b4g8GJ%hQ|5;#w^+s zMT*7Z;ebIEiH3U{lXzJ9%xP5rH< z{&|yzmc`y-S$TD= zU3%A(2G~eNeKobxhs&!QysqYJ!rsp+>Ek9N|1{9kZ~abgv5wwUUs;1*PQIqRp-Gx2 zL(V3s&(vLBUW(2L`npVQOd_tTi2ZH?Kcx~Qh0vgQg= zEE{moAo+~mbv@nLfONe!+vnkc8@4&>vvSZ4?P%eC+OKyFc6Vnxsku8Z4z&M;O~b7f z>mZS}b~bmjt+r;@4z`n9ZH11>4cDux$cnnNVj%(V?(?XpbW-8{9j&y?kB)e4k)p#A z<2^p?z}B;*1-t0L*uG74uUV(IY1C0_N$D}?C(XweQC*L&V10{CUfZc&dBEv$w<5n? znPY8T9W8x5G@9sz)@)28YKT0RSPgOp6AUCx!HV+bE3`mZ2^nIhjs_4&p{|h(ts!8i zQ@^67vdl!snX)o!nG;r*rZUd}*2i{G6?Hz+O$OQ1i9*uwOL0fvdXx!`XC*$ky z=v9-T{vK!*`)M4}0h*<6?rVk5ViBkj6S`bh(pWjxh+EoNS6RQpgDaGQEPt#){;i$G z;bA03(VnGUU~N4Tj>LT%nHU-T(#B=WDC}6)SXt>cx4xaC3m#~sl>X+fUfGG$+}YmK z*D4kvMpW@P6y&sLp*$Lw;P#>} z!XsHztdBJJl1rc^Og$|Vu^vr4`HTVnbD9X=$dOVye8sUVndQ&@ylh>%XO^ua8WUN3wUcbdb72$Be;yJgIam5h(Rh{L5)HBO$HI->PXzq0Anc!B0ZgI9AkyZEo%cly*G+{*l~tK zUrf_+Ll*t_^C{Lkc57>Pbdwc!Yq&1e;TmUXbR#oq9i%9SoG1?pt$jVcy;K|Ps7}?( z$qk8f3BwH?VK;Plw8W!WGZk)&i;KJg8HuXk4V&letn8Rb@)*8|yMv^f{?qj`zf) zN??*05yHX3T%Lp$)Z0nneG-w8gQ38wAA-v0DC!IQDTPUGS@H#aS?G#24zC|~#pZh{ zP|O6SH2+zSD1<8;=O*kKgtO2eF=`$2388m`!NqD7YY2`1s3jsV z<^&t6p{C%9lDcY+2J-XSNbZ@MonpkbG{aP7u)Rt|Us15;mJwK0Q`eMe9hv~UhXx{WwUH$rP-5G8k|qZr~78J);vX;v%q+=1r4oQ^N1%T^nXW3W4tfTM|I z-XuN>%vD{-p?SH`{9I^3E|hO@_xhUYfDxM1v~Zj^K$Gz99-61;i488vWq4^c3dFlD zMxU~p#--#n@>{srEe<`A)jl-U4B9&SsE6~Mi_0R#XcUWfA82kz_|QRduw*PKVC(E? zLAHXYRq=^&7+h$ctg&vny11acAyb9aO+V*u2E66fjfJIi=N2xUy6=9n zD!VxDS{TP+Fk*GfN-FDVY_{BtMJQCU4XWpGydpQ9)MDI=!i+-i6iy6yh>R5tH$hoM z%0|KH;=^P@kT84G-*Ig=&v;Dn_FKn_n$3%JWm`L%WxVXC`7n)MoD!jl%s`*C_O&!0 zPYinqRAuO7*=gDy^t1((5~W$PMO82aDq{?*>LAf6VqPmTnZ)L(xab^xpQ3M?XJQOd zma1~qODxf;v6Uw8lqB8{FP2hr;wE0t62?tDvq9@8XEg{YVm?JgWCveMbF=UZO&1_s z%tcWw&2!~y9>vGdgbc5e;&A3OQDPY3A9BGIL$r2Cr;@T|PD#0={=qIXc*;Q2bX5FT zM>kPXsCljAxT1`j*hwHRmomA+11_8b`?`ju8A<>Py0oUIGE-8mU(h5xTZ>Kdg^sdh z$dSp{SnNqzCThUTDPP)HQC)LIwU@nyQdXVKYqOnbRm{lZ_ejzW2@Y#TnUM*zcvdlS zl_u?(63QPhx13+UMm02@5^YhwFP4$*=bTw`1}R-m;+wX2w03K)6D5?^R8!PcU&6UK z%YB6Di>gdnd1F;9oCqWBCs#Glhw*WV|9?sEcQq@5p-e zxS*c|59kR%rh(>hvE0A*k68V+dhyYe61nn(BasAURm~> zz2(&Y%WB-9JK2-yo-mt~J13F2K&*;WA<0~J{^6>pH{0FcBgua9F5ItT`HFZTfN83f zAbC9m?$USK`m$MFdhBIe+B+y-e|szujzqFXWMLOro}uR_oMcDBk31=!9jI!wlZ}}` zAes5e5edyw(qkviobe+c%FTopj3}_5egvwcjb@}|!Ss_(T^?&EL%ELXGBg(hG`ds2 ztf?r^$fQ7N8msFYYq=L^%E(S?8fr>wD&=;jZmg#49mm{!wWN_IJaXb0jbmmN{5|^) zlvlclc|u0I|kI!GlAqS z#2t1212wUQ%OQ-JXJ5Nm}xBRqkvW@GBglZQSF1W@_LTDDdA@9%F63_Hdj+! z*%V@`S8mLNoYcVemDF3vpO%-g^7KKA*GFlmb%WjO!}~>1b)~hcUA?Wgyt+D5R@=Cg zp2E;W7<$S_6Ezkh6V#H|FDD-zS_zv1k=2&e*IyCoq<%$7U8IJFWi(S;T3JzFzB&R+ zC`DG=z{w1D4psG`M445!nbL+}Zc$N?=W1yqDWHmCl}56@@E$UxRZWf529Elv$=L|T zZgf%%Jy@(PXMa>$pLr{)sZH#fD@`iMimFMvNZOLxT2j8Zvc9T1D5ZJHtX;|lyvNG;FL49dW zt*TX9uaul0Jpv6|2xv*73ssiXQ>f8EvpzE}PMao7h+CGWuVfEUCwUj6<*)Ue56)E6 z11}y&)jDb_LUz`*6aADbBd!7u;q)fym@!3!9e`^PdkAQSb7x;xo~fi1mqDaANewGQ zF}LcP`bO#-WD+5jN!^fH6Mg5cA;qpwRDE>aLsEGVY2|2WoAN2`V8h7oWvZRiZbJi${?wAp~ zX6sM1bgVm&qtS=G+KBuRzl_2_cD3XY>lR?Shb+Ta6qRW%!jcLo+3I;(>Z`PM0^(vl|Bv+`8nbX|03Soyw^!BZoxQuBp77oGyE} zkX7iN$!5u9L!5QVnYv~4fSa^JPJvT`r4?b$Cm;_VQgbgtanfHXkyhntB8alAG**X{ z)iu_aLx_S#9d5%Rp912bQ^FxU!_k_sOjK7Ie;k*T%siQv*v2Rf;aN}vJ%595NoZA) zK1Q$RQ$h)ept?31V7axV2M5&J;TdYaJ~Bl4NcJc6>_{5&~?>uX9Y z>K6vf>+4Hu%V`i%c5<1#lnfm-W;kIKH?_2{4PPO%iUva+wm ziexVwD~>YNR8{UO;wvT9YgH2Q5PEP@*l?PKT+Zue>^pNPCFf5OM^!lmD%JGlv%Id} zqbY|T1{qRHG!#lo-My@&)i@2|0cPGAHtDkW8;tHuh)X}^w^7c$EGf`e~q7Dy3 zDVZ~gLsl0>m*(j&o)>ch_KTAgpNG?HR(mE8L#LTnV;u!rXi%|AN_WM~l9a-IC)A*p zU%#TUfnB3pJ@t|r@IU*NM1T;W)+3*^>8ws+3xTrv4yy&-(+zbF6-}+{U^- zdp&*xWZ%Wp(?}!1Y|YY@RQ2$h);AGD*3&dBC%zEhTTxC4uaf%9X$%zx)cPFDnO9(A zNzNc>D6K1vpp5!7TaQR#1r7huDr-lUW+co_XA{YIRLyWj!2LHC;{{b^3&U!$+aWqK z?kJ?WqP((<7mh^p9_B<*c2l0vQzky#b!hbHAEc#63D!Cu%aS!yvO4@6y^$c87r?6X z@WC9;IMHw-9?N_a>saEj%&JlfY;rm|b-s`(LJRqx3Cw#fSP&AF(-<$&M~Lva#$xX!iS_g_D;f$}VH|sflu{k;#I>=xY<11jnzAU&vQXSw zp)Nxcp;#13%VL+(2v(ONJ|W}A>T-TA%_9|wLH^C|=I%m@t|j}Um{KRha#3eKOB>58 zIq4PBm)Ddw(6~zrTa5!-aH-5wD3Ya^j??=zgh*r-ODkw+;K`?iOEjx9cfOpKVo~r- zOH_3lC&o_RhO%*C86{K*hDPqjG_9rxFjAz%8ZwPYOfNLeO1+h*$n`;_4sBp6NJ`+0 zntUM7Dv1ov-PC2SD5rTfOAy)Tyl5UpX1J6_f0rOKVA3q9CUl`(D{^Mf;5kG zWO`7l=FOVnF+O36-0xWqTDGvF#uzXdI>&m_20KUVgUAE~VfHURp6Wa?G0vrsYjL)1GMPf%Wx>JDJKrA^DwM{IS zz@CtO4(HuyoDNDZr#{6_%+zj4mZ(tii4CiwS%yrb=-kcLPW3e0ChTpAZ5gdFh$UzF zR(Xs|gKe0EV_ihSO9KVR)O0Amv05exh$4`o39BC&Zlb48J!$x?rp!)dEH@dYN<=JC4?R@1%)K@<*BWtE zd}I=y7*b<16LCCHMtr(S!Ix(1q70G7^)xGL&0Z7AAH`PjEHN8ZZt^BMu!JluP@o(Y z?Tpb%G}O?dmy+rxQm_W|k$aOUGGUZlHBG1|T8kCIzL1}lfvp7XEHc_mA|0AqQ!2^I zW@cnfG`WdsiOmaf9?gwoxiB*LFd?H2?@ZLt1o2EchMSx!M9JECz@@QU%&Snq!8I$d zs9K^`8fyRbqmqebzY9ym@NbSai zwK3mb-#{x|qdB1T8d~Z}k0RI<_>mLejk;MyIO4+Q7ArBzNODtyUUDp?Bqm>K0TC=K zC?yw{XeEnuxj=amB2gfP*Ob?ijaFfW;7?;l#pAE-nj)bqD0>)E^EC<0kTFe+&C4hV zSz!*^s!4Xmy(KySX4RM*<^DuBMnj}ND_dD&nleI2nlGQ}dL=f}SY9*q8zx1dPx*1= zP(W!lUU%3Z@WMRWITb%)h}L>E)25xEdt)=v&_1Hr=|cn?3wiL$+k<3@v7ueG-Rv5Q z!2>8g2xw_VJ3npTC{58%Peq9b?S+f86)|Y_b0Bk}AXwYi)7;v^3r>}OJ^4$e7yitx zd3|=U7nl2cJ7~FWOw52baAmuCX+?NI8<|L=8XlXkk?l^lYS6TrpzR zKW#DyOjFW4SZW$oTmgP!&FgwS8UAS(DTm z#3hvL-rLs>w#mY?4b8Gfs8bTHCjP(%UZB>Z)zh^@vi*bD4#=WvF>uP+*yfyMRYjm^ zZ3nTY2>~_@v}VakneF*i@~fK{TeLo>FJE>5ic!Viz8wlbN`U?$VbY%ZFH4oc_L|SwS2()i=%do zZHUA^$RM%Bh}EKU=b@C%9<*jRhn+0DitUdQ0`UqQku8%|>^XvUwb0&av#+?syk08j z3a`U5iLugBb`T3;o2=rdWnr|3bxi4LZ6?ejVlHMItEp53#VDhAqsN5Qi`?|%-W|JW z!prvCmJPBSnfJ#;!sH?5nv&m$Y8uyKTqVqPfR^#thAiP~?KP%KXoq-@?&ps46(!hu zQr;^N(=m)C!BOa2;@%>rC>m;F%^cS^- zt3A3JYp|T+<(6oNx9sg!H4aicao{0J8p9xD1-7tAm`_|2ENGHrVs)W)iE$Xuek9M3IGHt25kF-nMw8aD*ijA%Wyt79IqV(e+$vhJN+ zBh49+`h=?EO%xdnZST!rp>TtX>~4u@#O+|YE*>9?QUMKiB2aAW;p19>Mk|MDX3Z%^ zUUVt9kxxnx=?%v;^@)i?>XB~}E#(n9R(iZH3EATp;(Vk|Ioz?c#H|}IA$PI-sv3hq z9F9v7GLD1!IftZ)>V>p%XRJFLV=Jq}{e!d=?*^<_8m6kj+?b$M|Do1e@c=;VrU8*{#^ zJ!{`iTa+T+>o>@)VG&%O%%UacmO>Z;S=@{w?mUx-mm9kwvM(Xm`3zO4gLZP0*c8i0 z^`J8741}&`kD9iNCKb_@7TTyq-7vrC$+j0|s6b=T$Bi(mLmpyBb`>JhF4qzp9ApP7 zd^swgP$<<5nhS#V?m@b**=?qlb=j8na#l~GZMbsBY@0FFn}tG3=;D}5h^C6M4Ixxk zH=T1qrV-ha5(d$hZrTED6AbP(dRxc!(`bh}=TRxY$m_o; zQyFbqN14hSa)f;_Cbpie6z)2w)tNCa0iWMcOF5wafu64T?w)^ge| z=;)!trMhTdOj|4|x7aI7%lmn2p4OD_rcho_l3F{6qp&v8F-fr`0ggDx25XfG#dfqG zFpS_e_>X>1Ixu=ILSpmWV)zgh`vq!p7<7D&)Jae4>7byzcOB*9`Y8P;b;waqcuQn? zt{}9O-jb?06*n1Ub>jVsT&Z~LTwYB}#n}>b%ID^3Y126fMVWLe5i5lnEFyIkyRM^s zU8vc3DV4Myv%0j2&RyX(BeYda8X(3fls3`JVj7HS>4*hRV^SmJoM9%l8>I6p#xw=H zc?`?XH6&^%H8i%=Tp{TE1Dt#ipAW|xo~j@x>9DHuibn-V<*EP1s_SSr(PYc$xTgF~ z7VDUi(S)iUbd5W9N}a4jjx16ttCq?=Dc8){emQ*>7dhHa%T^+ljbBFJ&ArdMdn9uF zHtV~gVdSZg8TK)c57Ci$Vb`^hC@xdzj&pPnKR`q@5b2a=(Kw?`RbXzzOw#I=t03-$ zWbyHYN3Oexv=<+KVp1z#D<$X(t--V>mC17*uFyJnu6*G=+(z14VwF`trsu;X4Tgw# zE=qg)LsuJ<7f0Sj*K~8B{@$oF(-+4WzmA=RASSsi11q7lraCpMj>dd$kOU7=NL-tV ztHhMj#~hifM&cK_F>q1Zg_k%C6KJHhR(-su(6Yz$WkSBSwbgj>N@p+mRQM3 zQ^EPMCq0JbeaW;$UQeQ+zch1=-Nu`YY06ki8&BjMsmdT?mmuUhuPu>+0`$;O?i{eS zFr6KiugtWNTy}E4S&lHEWASrj!2&5-giuynLr+L)sXaaamyPqCltIhVF&B|M`khaL zqnubyF;tlbm77kW&tfhw|~eMG@h{S>-^MLnBmcPggTJ%9o*$`Qae{468_! zzs?xJaa25y!qJJEdY?Y_)-`RRzUX|%QoWpO8gd>M+Lme*Jz&u4_4ak}0co31Wj!=h zdcoKX+3v==%9eQSy0TwKRaMEshV;O^w7ilJPm#T4MJj+EdgxrkQ6_n>;Y^df*XEDI zbHO;*aNJ2=o;cGi@3o8b^CVh2H-uJE(4Jd6y}(fct}oo2~CE6(^X#uEmonGIeDv*P+dX+&VV6x(os$27a%bf zjajcTC2MRft<5hNZ9Sr$b=v6j5^`x*kDW*x8;`Z=kXy*X!yqZICgLULmq}WMPn(Fh zZyOE}%qdM89*-OH7RXyr@)uOy0IkSM0NrG$n~8D@#l5`qtc%!jA4IgNx zGYBA{Y?S2H3>;n1yuY6&rFuy-GKuH$9MAQ^b4sh~swU08^kca@pZcSfr@Sp5eA7S> zd-P4S`#w4|Ru?tk{L0u006zYiq_w^l53VThL#OT0bba{bUqzS7CGUz%nYhr(o9H`oCiaXUl^4ZoO&wur z&0B3rc^wK4TZ=K;_R8A_BHbeG6=0a@Yx2Y;hg2YRDO0WAdjd3bDgEDcp%7vxSS1Th)13jbnXZL_m)* zO~!4irIS(*gT1N*vYx27(qQIEBg;X2u~N`awby8)NGUz*vC&W0ILjSu)?+JF)7$aI zR&kGK{y>I^SfA$eS!fkyJ#8XI*G7mE^TF{dlCif^4MiRr05C<7q2q>jv5>z>BYsNC2^*OQesM3- zvCMOc^~L;`&R-)zD8tAZXUsa19HlqW4run;$t%XtMiI3at1NTx_oxfy^ikd6FTCQG z7}g8=Ju?J!j$vGE}x%x?dmZy?Z!}Cf-D)?T#64ss< zYV+DM*>o>4jqc@J*Gfxw794{w}>*V8!%k(jkj#IxQnn1=_<(Cl=A+Pt+=~2(CXH zgxUvsjrA7|a{3cIaClDaoJl_RTM|y)^!Q|LR6Oq}1bxmW;NwJPxlL>#NNXHD`P!QEyoKtSaxtci&#Byo%VRU#x zJ1xJK>g#wP(5ix#b;(#c*+=>Yb?d3rF4}~}$DC02;lYQ0!zL82p{9XO=@Gj-=21rl z(Vxhs$2@(#?DaZj@p)JtOGJH@&hFtIz4RLo;T3DMaAP%EP0l}44=KtOMMSsJ58aUG zuGTHwa!Yk%6~%Kny-aRd+ta!!x+63MNo&Tm8_k2_f!3gfnctL47pyg zbU6+Zjir_Jw+MJ|5cMWI`k0R{&ZP-+?M!BepXQR;uRP^miU0IZ?$zWEl;mDl5%qBE z+^b<4PE6D4>mDDTdtX%Xv1^p5xczuVE~^|eKD#xSEdJAH(N#@?;+G+$4wBW416HX> z_2(wzpCu6* zabGzPjpV^k!X{`2jh_pV+m6{$p~^NfF%8&C6+YBFw+^BDtS^PtNXV)WmBYuz#yjWk z{Ef&VI&F~|gGu7&^KvDWn|XHwujmxhf?2_u6i zv#*qT4u1zkZaMabG}d8L8bJHQ!lSn%@xmW^p?qoVmk9F_s2=!4^|7x;rzYp4ajaIY zB$O}d{ls(FwLBw3@={cdoP*Hw36i&G8%I)9^t+C7H~mEHc(1fK!TYZK0)3Jy?WMfK zdGWN@dt#E7zoot7yfqi*!(ZhsD$j>c^!8Td!;kk0EA!#LS6i14Kf$YQ&WBH;pEbyb zpXhB~pASFD8_J8H>=iAgU)yzFY3~$oNnZR^@A1Foqc8BjaZ=jh!g@Q+TTyj(9(=M_ zn-`zrt;&l}_15IYr+H82#ZUJ>Uz4xg>7G}c51-)`Hs-_6@b;|Aho6~KCkE2qtH;1! zGY0QE!{v_~Q9sE@! zFw=j=!7l`Ur-QEm{$&Sm2Y#1>-wgad2fq{ecOCo(z#nq(-vEEu!B3GN$v(;Zse@kx z{BZ|g3H(z)_tANcVO{xtAY9Q?$z>VKMpUjY0y4!#Wd z*$%!I_=OI>8TecWzm4z-G5>a)R>S)i@G|&4!wSWXq8R{`js177Ih6X{0gU*zDg zCwx46{_#d-9O{$4vVA`4;AYQ1cW|@kCmr1E`F9R(_WTD2H+%kzgPT1ccTG}Gv*!~X z-0XR>gPT2{;oxS^g${1^e7=L5J;}b`G@UJo;a7pr4Gy1P;CrjIA58(D_W(ca;QvB6+yBhXN_Z3XH-7y)@PFH) z-^=JbzrGDV1=Y!Zx(|4vgC7Q;-`u44zfa%1=RsctdK>9ac$N0+S_hv=c)osZ?a~W+ zVk<9emjMSa0{?=ys{GSIzZ7_pgJ1bSlv@jWx7-E??*RXUz)wTD?*#7EsXT^%82Aj} zr-FV5@FIu)zkt^QH~;xF!pGCw8qmA)w>tRh%eY-;ctx;hqyII^-PNe_Tcq_@;Cq3a z9TrT~_B{;T>N^v7!R1Lkycu{A@M+LP74TXIZv)=z;MV{ja`3IdcLARY{+|ZE*THuK zKMdR=#UB7KxI*PO{0ZPiz)e4Y1YYallWAb$ajh5l49Ig1@F53Z415=G(`OCvy$-$( z_+j8?|JMR9Sf%nCehcs-;1*$j26(N5-vhkY!S@0ma`2~s?*eZ6`7`jn4nCC}>3H^h z81!bJ<_Dg0@Uw^y>v`{$T3_p5^MN09@Jir^fpdJ%ud9It%KhN zycf9H;a7kUIrxLXcLBHd`Wf)O4*ml0!@$iyOgcgJ;Jr=dH~ehE$J28m=v_UZaFc%! zc&&qf5O^rLw6ao|gUTYdike6xd}dZOxQ5Ad^~pR<5_ z?@<1RzX^B|aFf3hc&&qHf%iK2M&LsZZvA=}aMQE(>%9(c{ra$jTfZ*oOSYHw>mmoY zeqHO}Lnc3P^S8H|{0=?>d=Kz*q0a|_d;Kbp;Wl0u0k`@d0)4H6{|)$N;OBt|_%7f!F5eA&uY*4f{4j7E zkDdfxFsSkyKH+55Ly?0|0bc9i7Xj}DemeAd8So(ozXJFk;MOlXfO{KM9>d=QdrSW(0F5~~MB>(psf8Zwn$Bn;(f6@2@H#_;3 z@&5@XZds6!w#}}@J|3A25$Pf6Zjqn|2FW0z)e5-0C|E_#OveM)-LB=pg9be)PD5TR$4UN$X2)M_%ai!C++#)fENKb{fq#wb?~16?*&fXR$hmIZ+7s%5k8)NhC%P@ z=XM95Ocm$$-TOY3-`f2g;D;T2F>s#~zx1LoKwdS#XE^ve;6=bq57z>(b?{q&_X4MC z%Ih=0haCJK!a1LLIw$1m^=J9(c|QdGF3{6gdHoXjUI%{>_+j9t|5K=;SwG$fw7!O) z54-@l)$3B=MGjsEycW3Cs}*>!gZ~5YA>bzehk);L@XrI^3*6+q3;00?|1t2x!0D^J zMu8XnQ_`OQ3cLt7xl?%+kioEiY90Iyz9!eeRl(|b@2ZN-V5B?>j~gP4(^cwupagRFNA(313&2CZv^grNaeJ7 z-(ui}4t_cCCBR7xd94G!#=)-#z8N@umDer6haLP*;Cp~ueeVH&(82cs_lA;o@)Ynw z2T##}%lcUY-0Wv6@HGxTi}3OM+h)+a{_O?_w|v5`538KkFD#$1$H7-Zp1r`$PObue z*ue*Z7knhyjyC}>a`0i`Yk=E)>Px_f9sGO1_X4M{^7<+8!wzow^Ma46Jf>&MpBFj! zABfL*dR_y1SI?~uZhAia>7+fFo(pbI;-=>!;MPw~&$SMI8UdhaHj@XqL-@IAmUfIi;|-21%pH~hoEi-4Owd=_}EgWn5$GjNmVhrstZ_|w3>f75c$ zfjln)U*h1?XrT}5XESh{|DF$gkAp7(ei*pvzYci89a^s8>wzx;ejeoc2jH6>{G-74 z0JnV0=Yf0wuKW$Z4|ox9EBD91YaRU8zxp1Iz14!=)mwvu zuSI=#eND@?IKlEodmVfL^iKjO&C1L2KQB1=dqH3Db>&a#1$kLMr^vxS4*FW)7N=Q$ zW{rbeex}#qWBHRI2e|d)6Z{#_d59T_B@S+JT`zD7Z{%fh-H?M@T(=9j z$!~GpUI(|h?l5qR&n>PixJTtQ+~T?-2e-Jc*1;{V>jiH9%Hp~q2mh$))8X@Z)2D;q z2mCN_v-2MVFSu9bH~iOxk7rj)K=0aBnS;M5{Lk=)vCeH3+U3+jw(~Q*7l0d|Hvsom z>x{|bz;fUh0M{&#=d}Yb0`7bIx(@gy4!#}u5(mE*_zK`A&m+KV9r|AjJ~dodzrxek zUx4qyx_Xm;8VwM<&T7f!S})VX8w96#`vKKIxdnN>8F<0>6gPXQ0$$|cZNO`R({L%T zYk>DU_*URUz^R$!^=aU{9DFzMy}+%1{Q&r32Y&*1!S|E>;*W%L9&g*{CP;bj&^Pa- zndlxP0%I5H3R|3wb|THv+7P5*O%_d56r z!nxe;FKW5pMZMkz-20~Defs8g17Gwd1zw8|@NVFD-=+8#(BA@l$!-PE?Y%pI|Lq>d ze-8RR!0W%JK(|)gdkFY_-%$KT(EkE>-?tQ41N<+*+jl8&Jn&P`QN0a84>r!81$>u- zzX|wW;O74;fgc8LUpz(pTAG> zr+`-yE_Mk1X6IJ}uXXT^z3%*zh42q*TEkooaaFi1PnB@EXEJ58z{RHUqD9@N0qh0=Mz> z1HgwI{4>CJ0XIMJb>Mp)d@tcF|BwDt3i7xXqRECXKa-~spq-%~yxhdi4=-|LjS4fv3Q-wu2iaO=Nc1HRY69|C?D zxY_5=3Fms%?Nxa$)i>`?z~BEv1x^7zg9d2nUq4jA&97bvya>3B%f-NJfzN=QR0HpI z@OI!s4*yMrvz&iGf1C+9!e`#wiF z%kwMP|4ESNL`rb6erg^1bAb0c{1*Wq0&eY43mp6+;BR*DmB5!e_&VU_4*q`NwGPhdZZ7u<2mcQ6s~!Al z;8_Q^eN3GWZu^+}9o+UYUF+bskLh{`w|z`EJGkwa@&20xqnB&v$2s^3w1A5HweR3( z3O>Ud#yo|Hl}Ou@Xf$`m5o;g{4j8fqpk$*T}c5Ry?oGj1NVVj zy*2|caOiIVKEuI3D>%)wey;kle)x(pf3VFrPJkg zA}t`4amT^WA)NV~@CRk^Fz8D`-wS#h*BU|pGteIdeK+WbKyUW2necq$$enZ_mwWH? zTCVG#|I5M6KR@W;=AVD!;O3tXIJo)eUpTn==cgRp{PST4H~;*+gPVW;tAm?=e$@-f z`kH?}$-&J(PjPVb&u2Qg`RB77-2C$e4sQN=j)R+jUgY5BpBFp0`R6hRH~(DW;O3v} z9NheKlY^UoUgO~ApLfCD%#T?d@)ZaFkl5!8Z_gF#5B~3%@ zC$>Ly5AaFg^FyM~XXpC~XFGr9&)V*TpnnQ@+lz`91OFrN+kjhs;1pWe%zV!MtI}^( zalJyq^ObA*DLkZvu71vO@HxbX{ll7HE4|ILN`P;6@YTSFf!lnr6ZjqnzY+LB;O3V; z2Hg9NmTUMf;Druu&jpq^xIGtG1Ki^CZ-UQe2R{IO7`XYj-vHm^;I^LRAaIk@){}U@ zP0DZkItzhYyghNY>UoKSzaID+;3ofE;F}$MCGcSfzY6#s2Ok7}5V(yaHv#v4r}7&< z47?C{A?))@z?V4q_kgbfZul}uGp9TK5&f%bg|H0%rta8%yQ(pcY*sX(~ z1$@}S=L0|J;FZ7&pGoq++W0%T?GGJx@Qudb!H10hvq}E98Gi>K0Y2>D4;p_5KLots zi1Ii4c>#ElgP&Fey#YT5`aB!>u!9!^Kj`4qzzd(#a*a>B@pte|#^1rW8Gi@A-T41L z$^UNS@8Ay^e+Pfk_&fNYjQ<~!{HM%S{nP@tc;;N-y$*gE@FC!)|61U?9J~YgLEw~L zlh-?e7e24@7;gJ(YJpqc$@bUuI=Jnx83sNR{B3{DK?k?}H3ctdxhB8uuPJiy4@1sc z;HIC?0`GP3dw~xDw>bZYz;`+L(}a&Vt{nuuJFY$M;5M%H{#ol~`5znCh8*0+wOzn% zeqrOO&(7a1^aY-`1QS!};RAx_o}-=bl%#lW@<=Jy-2M z@Nv%{dr)wSZk%(>eo6RbidVaS&HOxX0auh>CofR^o0n<3oUCu&1;9_|2^YOKfc{e8 zA3}cSmWguNs}o#5$N#p1{;MBU1_y9)6YwXdDc%kKL%_d=K>KOX-v<0&|Ej<);CBK4 z%C(4IFvBRFo3z4;4O52dS=!DR3`7kFoj0$;~H8Q}G=Q-vJ@-XVC5 zF+RR~4Ez@Gx$Eaj_&DhA0{&FLmU|x@>t4bOK@)%bHQ{8Pxvxc9uPJks&+qijdkx|F z=x2j|;;6DZ2#%|OFWjoYCBR#OzlJCB^qL6!xgPipH!I=E`sUpN{NY=a-rD8!z*lnu zfnKGM^KRhZDp1BxfzJWpZ_Fy;5#WCWe#Nw8yPSEk>f!j}B%e14j+-_}qC~QvN>>ej2U2 z7{)x>#@`e*5cl_;&uW3Q^)~Odz$exy{wKJz4DjB&v`}l80Qia96u17{2mJXV#V147 z>w*9Fapiv>>if^YmwifsUx5Bg!2kGB1^x~Ae*y3Lhyp(cegJsq>y(c@|N1rI`Skf$ z(5F&L|7Gx*da3GX@2gZXgV4jd!2ffB;--gk!V5^x_d4f2)`GtBZ_4;<;NJoKwvQ=r zx)$%cNKbfo0YCQ&Wq@jXzXbm1`HGi-{~v)Ln5lfsFHL`w*7w)1Ldy3+RfxlL8 ze2KkX3i@X*){2@utAL;TRV6lj1Mq7O@Z_-bYF0Pgwo7<^7&tor%y zGNreEG#_}upA`Q&Bzn=&FPd=%P zzk-YR0)GQK^as(u4vfL)FzC0Sq3(s86E4&GuJ|Wq{2uT>9e5)YZ+a^R{_TsD0m2Ti z5_lKJ{aeAO1Nh-TDKG`)z6bc%F@T$%ZwJ0@h7wx4e*^dt*zIe<=exj1&P?j_cfhB- zMG0*@J>@N0-^n*AejNDB1b)@`R8DKJ65!MRD~YcL{>&*_uG!lL!BP3x+s8mZ6XV_Y zaqZuLe~q%l{Q4aR=C1(1^!3Sl?FatI;$*ph0RFl*tgS)llU&d6^sAfDbr$ej&r`fu-@L`Ze>Wqk=T_je|CdU6 zP~W_N0{;5KB>fkG&s;e{D3Px69s>S>e^lJoxBM^Q&p)d8S^DPv0r=U|ll))1G=DsQ z5#b!aefxT4un%%B2L1s0^)BGmz#FG4{bH2cEI5c_Z-bzJ@C5};|NjJh#$(FhA>8xX zG5Guk=nrAOU~%{%;NQPW`CODzM#q(Ey$1Xweg^O#FH}Oaw~K+F^=hSGs&8H;@Y7CH zpc?!G;J-Rc0UO`10shlFRE{^N_5DM@9|@EX!VYgI@c(+3;wJw?zzZiS|I<I}sf>6^D0c-y%OTmt-Uz>h;a-mk@a zgTQ~WNEw?xKLLFAR%KxLZozSL?Ck*Pe_E*Y#VGgpz+e3a1^$eCPReL~-}OfY20(u{ z@Lz3L9No!#3-FZ~04=U)0>1E5N)LDM4FW$jr1)w2=G_SVDZ~RXFYh+stNv99Pk=mM z2EOxs3Oo%y-v<8IX2s1OMg<2^?CtnvTHj3=C=TLU5%8&JE1x>FZz=GhHA((0g2x!+ z<3`Y*dAZWtc=s>BTVA913E+Px@aDfLgE#ACZx8TVXP))n!0!iP5BNL{e9=h?*f=E-XS==WH7e&JlsgZ2 z)dNXB6~J%(h2oEcz7O~%T?%~nRr>xO;Q#!jem|&h-krd|jDh!Ku>bpjKQ&+FvHtQ1 z@WE@fz0BSY1NWVH_0$Tj*QZ{ctk*2y0Rr|0W#^R$4&h>NSAc%>!%ArWrw4dD;`Zxs z&%1%Y`%8!yfyJfECz0{v;2=Y9?qr~!To#-shf1K{7=maNw`z`yvS67B;1 z2Z3MmAq5@=z8&~8KT+UqzP|4f97M6VeW1VjRxKClb?-UC3uAQl(XV1XyHltKlM$@$L!(P zz|+tt(iYx?YHi;s&#QpXK+dy)f8*l{JPmva@DrT*LObwJ-mQdI?#+VZ=GfaOjSuF_ zrrSG#r|wW4H{7C7s{M7px@asktH@)2j+`Cj6 z8~&K!5F+;W4B`3uW2#o=Y@e!p4&$D)fPeh`D(61n#lT-&pg6A^<5vUlN1&L4f_mQd zz`yfZ1+2cG0RGNv6z@G=-**sRs2>x5zXN&??c0N^4+DSn)TI7@1N=R|RKgonT<_Gk zYJJc7j^d`b`M?i5&ovr=|MT(6!0c@uaIaqR7s3A~;IH1Q{Lh4(9|e8}Cb)kF{_lhr z;B)-#ZqN_hrYM@ndsOf^rGEY`=%4?Vez$r}s?+)|KtkQ{S->y2O$9eRLpaB8-$i~H z&FftO`b%af_0S1?>HS)+jce}%{)IzIe-8BX3E-bQPJu6@Dqj>FUt(`R1bu3*(*Ftb z!RH8{8Kbk0r!D9D=Kh{nLA~nXwB^djYCJXCQFa^} z`Vql)`myZ(vAM{P>5hH5zn?_pUtb?fO!~3&4P#&J&t}(;eYIt6(AqrEJcfSsXMgdN z()kt4zmh)2-TZ^wZ5`RpRx-@IrXe8znmGSB{5T~2on+`^5b%#I)1)zWcYAiAqr0s~ zj4#)K;#XbMj9+W*8C=_$9gD9>u42hgpjKr{>Kp4aRhjAr`lVv}k$C#C;-Imjy5@>% z`c?N#Wk7%E($YryweY&2EJME&PMwN>xxJw&Sk_ogzaU;y9R#x%70sVZ7ZS(W~%EON=hpN`c3zevXX`p`9<I6@RmrM|wxOni?oXDz@Z!1o z%U*c#y!rHl$vxcxsmy-vI{Z#uKj_pS%N*$I;NBmv(87xs6y>cDU6?COv+r>4ShQ%2 zI~HB+aS4H%sQAd3?iS1~%3l;+nCoc^2W(sJjq?}H&3_|Z$gdH)a7kVn=P#PaE;qOR z<}aE*Pk$$rRMnj$!h(g179`a`2p18r-@=RY^IovwD&209@ma6m{P9E@`iT5K@z4)dgQ&H(-b zjPp1NfrVIp5%D53-q+qrlr)o7`Qp77FTNw*%j|h(S=BsTR<+0=P%T0PavUnE1!3kP zaGqvnQ57Mvsv-*-jaue#EhAjZ9I>jo2+ehK+9ZS~BWy)^9#XEnph;6)z98yba+Dd3 zElRdcK4@B10ZKyUftEQjDjmoO-;mSgtkbyF%>SYz_;WEQ;O{JEhEyf14w~hMxY4tlTNk$X!=e z&W1A^y-{<1yo&sImGk3Of3nJFny zcJP*1%S@zIEF(X@JkOY&CHqNl)QgO6EyIYsSYBkz&hjE!7RL*zWfh@rEpvgyvIuo+ zne$T1$V)AAUTPV6spT?b%$Ca#*GohpN#A!_EyT?tZC>wpVO(7lIeHWkJ&K%C!oLOj zi{K)Sj<|En<|2nV%tAOS+usE53QkA7QQ7{cK$)gKXwGRaLpB#|e^aAg(t5p7FEh5L zxKEt&K<{Uyx40ilZ^`yIfj~JAO=!s)odgZJRdQsW0$qfjp=6Ctfu4uUDv?bkMY6oO za3XoU?fQg7=J*k*oy33%Y>;k+L}qW00*#zH%t;z?3I#ck<-|IZ;m#KsZqB0+Xr2p! z=1~YV&l$t0JW^A54-NDp7ep_jAbP=qk{Xr$ ztcL&#N(z+ytPh$|t3?zTu)i%19;xww82#r2C^q_{w&$m-U2hkcI<=uN#vDgM-V+hlc#*^nT5$*OM`QgT$2 z1dU94j_74X^fDKiln6|CAw%12e&#ZAvQtK~BejauGNPJJ$;KxI%K4s0oLoMTD&J)+ zWf|oIWzO@Lk>@XS?!1iLd6i4TrQT+jRk15hP@rOeLO!5D)u)X0!1eJtBNq5sB-S6irh`bp>%3lk+ZLIqFhBWc9p9HNwVlID@xR>%Z#s= zM9=GdpWJ5(doJ(zpv0ymXsF&x_A?34B}qt`r8{oe0-ICSoo z@$1-&#|ePDW+T9rsS(GXDmSjHs`Dk@D z&M+LBbstX1UNA+qW#F9!>#>2;5bcJ zzv$k?H;pPtUx8g8yR8L2><{*5yXl(U$=y=bqs{0Vr$r9?-QW~LhwN7X_PJ4Jil&HP zgLn#eLeb4_b6`)yNgodJNYW0Q04&r@(4iN-FAL&3qx?;VitjtV4!qIs&K3pB$Yc#A zWeqGTINmhCFH!+vx3aeqlM3utm^HJf2zL`oR+$sRG7`cv6Qh+SN&>tV5e|nRj$Pq= zOufTVtAMw;O_7o|MG^z?5a#}HIvnWOQMdZCInqHI{A*BN!<}^OiH0D`M`D+b^3mXY z9IIfrYxk2Yik6>A6_6c%$spn+ed)?=&?7-}(q++6xdAs4MyCp^cV!f}msO^sgoaQl zX?I6h22FFK%szQ^^`wF+_ZtdJSUZLchh8n0JpeS~Ad1F}*Q#S4iK`9g%p{&=6(*j@ zZ_^nX8iEWB8<}ouI#{%6U=6>VBXUB?`nf1;z+t7(7t8ifg2Bu1m_#YtKPgZRr8xwH z%dJ5&caA3p$IeIKAaNtDeMNytn90ur*4rDZTJtHgx1T<)_4JmUsKWtEcg9T))4@LC z)Y|Q;M;39~v5VUs-SMc|pvYRle8HnRtZN+b z6x3K+YrW-ZT$S6oLBr)t4rDf)%@ujzpd-ww%;oS3+e4v-Zl^;vG&tp^r4pXuP?=p! zR0smohtfdcI;&iIRUvW<=7G7!omd`FUT|hymO489nj?`Qo&|JTRw}9;v8+h9dfOaZ z#BSm#+2w`^!Iw=P>h9&K*=WQaf+DYBP^3~fuuGbf(5YTMSeaNFP|Emo%1!rz1j~h6Y-m?Ydu6AcZy+?r*=!z_1rNX`j*pt;SAGTO|@g)}%0 z7&wli%pD#oqr*dGCdtAWAr*6nF|lPEQZW~%05rrk7pCA`S4L{8XzQZNouR9uGjvrZ z{lbyLXc1gtNXVj`Q?YEUatDxLqkL^Hs@wsjiuW|UQFFVOQT$U>T)R%;8f{(3S(YSd z#GBlaq$)a+RAoE>&fG;nS>s_xC=0`^n>X z0P+5ZpVSW@)$eh)NAG@&ThE@nqXWGE!AB49V8BQ3z4yBhpViOae(=G=T3oCuYH0r&{i-XN}}XKw_ByWP62PY4%I zEu{^I7sq;k!ovyL?t%n7kAw;89)!ljKWGM(2nO-Qu06c*DZ@9n2mhu;-SP{M;c%Jc zgm6kH<;s>x;AZvXXHV+s*)7NhJ-PL)p=V7vf_G1EdDS7=(ygyiki&j1FOtMTG5~tq z%00Lugh+_ers;1GM}Z{$QI@;nN)wBg>osi_*X`jnPD0F+64c$cKAqN13I`Dv6qJQ+ zOcX4eWCc=D69;8rr8}s;L79&dO4G&ArXD#s%DVRLcB{i4c~<>=eWWMeM*5BlP!Fdo z;DnM}y+*YP^go=ALxOQ4yQ(6aI(Ujqm}_Ve5>SF}+^UJ7N#?y?k~m2Rw&B7gxk2mM)1kQ;KOIUYa?|amg^#|& ziWWGBgl&JU!Bt+~^=ZeBf{gASR*pF^3XYa3wag>Uq1hZwgEW&{f=a=+ie+kVU)0yl zdNZNs64%K*;26vvTdQ<5W+HlsH*b8Au!s(zV9zBenbZQ4sULxPLCziy{4`}WgLM<* zV=0qgKRDsyojQ025PBbYBA!GZ$3!b6C`M|%9gI>l3Hc!*2Wf1Yy3f%zuuSybtF`K! z_2;9?nP|Y_04qU;et*4cQuwO)Mz)z(L%I=oatQb<7*jFeb={zR4SxBooutmJXbZbf zhM1U#Y6WO`b#f%aEj1oi)jf7Pmm!=Kogg&C=TNA?uCr_Jcmhm@K__7wF(RWmN%mO8 zwMKwhD82$T+_g<=9Oj)!lzqIhUJo@kOpk9Sj)wHRUEkb}1mxwA5{p@rUPO*v_ZrV; zvtb`l00Li~T6%`jlQWOj%??Apq`4b>Lqys!3L6E(om(S&OVI)z zpC;CFvmmauOh=39@vr)L+U>fHh5<67Y3^O1$qkB8yYKrB>)DIVQiWt|FGgfyx3l-g zEB2?IDNQMzxh7@8O_HJ2dN9GyWS)Zg88>UFjR<)X!BtxdANK8p;3$s+#-VzzMJ6+^Q^fRwqO&rybj$X)YC+DUa}s1Fyv$U~fRmR=1}UEgda>424ViDV0guPMj?+r^EAv6<6UXAHrx zMab#loWaOMqJt%zrUNn*2O@4ObM#x2 z0tq*K_ijwmBwFsKU6FEhi^oFSmlE$W`c?ytD^056DPJBDt)CbTCkN z2kBG;K4o=+sdIsut&9+-1=#9}YLsJIwow{IszGg5&l|L$m^kM82&ysxRf0mKf%FO+iFQqx zYFU4`LCEZ6`F2351$B`=ui-2ugNsw^`ii1oQXzkNQvgCiK{A>VlV=0o#0n_HAvnYrJD389xS4tLLwvoC6uKw7)-0U5oiS!RA zTBItH9Eevb4@ffiW>e8xUyx+Es%!v>TM865B$NsH5b0FWb?i2Ewy*@`{7w|F`>Hva z#{utFYkJTdkrlC<<$ zVsE8}p}Mkr2G(oXkj<$kZP8mcD1$+WTZ(q9Ldr4sBy)PR+!3^;a97X&53nPHn;S(gx=N`vozQ| zP%cf|9##r%1h76F>5VfVqGTf z)!)Rn^2uZl#wN~rn|GE0HZ_4`!inyb4LiH3X5NUB#9wh)$7QbTC?06~ZZ)qH4}qkMviQ$;-%`<%5`MWUqF^0X<0GXYw-t5p*uE$TLWaUF994(nG&LZvn<{Jj8?;g^_Ev>lWDUk2IGw z&(07v&(0`YB4Is~T&wBn$vWKE)a#lC;54kcy6U?-{e?ZcPQQax?j^1NkIT2vmtL7H zZ;74Fe(2sStJm)aW9xf-_4XOQ{P!1M=%1;W{nYi>>-TVBXYO_B+I@D3Z@++l zI{$%w;G@@{{+j%zc?m}Qe^YMH-oll}*8ZRUhBWB)UtNE>OMfHR|2)FaFAV-^{Bx6ZHq zb^SXuQ~w77HhYTq8Pi9v_*1p~q5i*ue_?-mZ8qWMrkOo$@B<&c>U*ceY$wH~`Vwe*O|asK3g?Tdu!e|JJ>yUi;kBFYfv`xZ3{z{)LRB*MIrC-yxj; z?}PsT^mUOGy?$`v_Ydj!4`}{H{8RaQ^yE9-;n5Sh6T*kTe*kC_G421<^?&*m`~L`i zY5m&&Q`i5~uh{>`LI2NO|Ib|iKSjI!+_OLMo&IbK$-d726W9MIuKzz1a`-6Sb^R(w ze}p!R|K}flhv7f}NJjjWe@*{sf4$QCx^4gQ??gY9{@-+ew?s$KetP|np#Qy3Wd3`f zNdNE4MZ3@Ljo;+Uf8j!7DVYBK>K}Y6cWza%UB7$osu%imgM|NFZ@8=WFM|67OCP<` zpPSR~(jx!=r^vl z^a){qGt>W9eki?}pL6kbV!oC5&&$z?zTt*XuXXro1y?vwwUl7G3{N wk+x|+`#WGUH+}x+GXD>^0{LxReg_k&+^PQ|` diff --git a/src/plugins/ves/ves_api.c b/src/plugins/ves/ves_api.c new file mode 100644 index 00000000..7a9b8004 --- /dev/null +++ b/src/plugins/ves/ves_api.c @@ -0,0 +1,139 @@ +/* + *------------------------------------------------------------------ + * ves_api.c - ves api + * + * Copyright (c) 2017 Intel and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------ + */ + +#include +#include + +#include +#include +#include +#include + +#include + +#include /* define message IDs */ + +#define vl_typedefs /* define message structures */ +#include +#undef vl_typedefs + +#define vl_endianfun /* define message structures */ +#include +#undef vl_endianfun + +/* instantiate all the print functions we know about */ +#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) + +#define vl_printfun +#include +#undef vl_printfun + + +#include + +#define foreach_vpe_api_msg \ +_(VES_AGENT_CONFIG,ves_agent_config) \ +_(VES_AGENT_MODE,ves_agent_mode) + +static void vl_api_ves_agent_config_t_handler + (vl_api_ves_agent_config_t *mp) +{ + vl_api_ves_agent_config_reply_t *rmp; + ip46_address_t server; + int rv = -1; + + ip46_address_reset (&server); + clib_memcpy (&server.ip4, mp->server_addr, sizeof (server.ip4)); + + rv = ves_set_server(&server, + (u32) ntohl (mp->server_port), + (u32) ntohl (mp->read_interval), + (int) (mp->is_add == 0)); + + REPLY_MACRO (VL_API_VES_AGENT_CONFIG_REPLY); +} + +static void vl_api_ves_agent_mode_t_handler + (vl_api_ves_agent_mode_t *mp) +{ + vl_api_ves_agent_mode_reply_t *rmp; + ves_agent_mode_t mode = VES_AGENT_MODE_REAL; + int rv = -1; + + if (!strcmp((char *)mp->work_mode, "demo") + || !strcmp((char *)mp->work_mode, "Demo") + || !strcmp((char *)mp->work_mode, "DEMO")) + mode = VES_AGENT_MODE_DEMO; + + rv = ves_agent_set_mode(mode, (u32) ntohl(mp->pkt_loss_rate)); + + REPLY_MACRO (VL_API_VES_AGENT_MODE_REPLY); +} + +/* + * ves_api_hookup + * Add vpe's API message handlers to the table. + * vlib has alread mapped shared memory and + * added the client registration handlers. + * See .../vlib-api/vlibmemory/memclnt_vlib.c:memclnt_process() + */ +#define vl_msg_name_crc_list +#include +#undef vl_msg_name_crc_list + +static void +setup_message_id_table (api_main_t * am) +{ +#define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id); + foreach_vl_msg_name_crc_ves; +#undef _ +} + +static clib_error_t * +ves_api_hookup (vlib_main_t * vm) +{ + api_main_t *am = &api_main; + +#define _(N,n) \ + vl_msg_api_set_handlers(VL_API_##N, #n, \ + vl_api_##n##_t_handler, \ + vl_noop_handler, \ + vl_api_##n##_t_endian, \ + vl_api_##n##_t_print, \ + sizeof(vl_api_##n##_t), 1); + foreach_vpe_api_msg; +#undef _ + + /* + * Set up the (msg_name, crc, message-id) table + */ + setup_message_id_table (am); + + return 0; +} + +VLIB_API_INIT_FUNCTION (ves_api_hookup); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/src/plugins/ves/ves_msg_enum.h b/src/plugins/ves/ves_msg_enum.h new file mode 100644 index 00000000..6e8a5dfa --- /dev/null +++ b/src/plugins/ves/ves_msg_enum.h @@ -0,0 +1,31 @@ +/* + * ves_msg_enum.h - vpp engine plug-in message enumeration + * + * Copyright (c) 2017 Intel and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef _VES_MSG_ENUM_H_ +#define _VES_MSG_ENUM_H_ + +#include + +#define vl_msg_id(n,h) n, +typedef enum +{ +#include + /* We'll want to know how many messages IDs we need... */ + VL_MSG_FIRST_AVAILABLE, +} vl_msg_id_t; +#undef vl_msg_id + +#endif /* _VES_MSG_ENUM_H_ */ diff --git a/src/plugins/ves/ves_node.c b/src/plugins/ves/ves_node.c new file mode 100644 index 00000000..be9a886c --- /dev/null +++ b/src/plugins/ves/ves_node.c @@ -0,0 +1,582 @@ +/* + * Copyright (c) 2017 Intel and/or its affiliates and others. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include "ves_node.h" + +#define BUFSIZE 128 + +typedef struct dummy_vpp_metrics_struct { + int bytes_in; + int bytes_out; + int packets_in; + int packets_out; +} vpp_metrics_struct; + +static vlib_node_registration_t ves_agent_process_node; +vpp_metrics_struct *last_vpp_metrics; +vpp_metrics_struct *curr_vpp_metrics; +time_t start_epoch; +time_t last_epoch; +char hostname[BUFSIZE]; + +static u8 *format_ves_agent_config(u8 *s, va_list *args); + +void read_vpp_metrics(vpp_metrics_struct *vpp_metrics, char *vnic) { + // Define an array of char that contains the parameters of the unix 'cut' command + char* params[] = {"-f3", "-f11", "-f4", "-f12"}; + // Define the unix command to execute in order to read metrics from the vNIC + char* cmd_prefix = "sudo cat /proc/net/dev | grep \""; + char* cmd_mid = "\" | tr -s \' \' | cut -d\' \' "; + char cmd[BUFSIZE]; + // Define other variables + char buf[BUFSIZE]; /* buffer used to store VPP metrics */ + int temp[] = {0, 0, 0, 0}; /* temp array that contains VPP values */ + FILE *fp; /* file descriptor to pipe cmd to shell */ + int i; + + for(i = 0; i < 4; i++) { + // Clear buffers + memset(buf, 0, BUFSIZE); + memset(cmd, 0, BUFSIZE); + // Build shell command to read metrics from the vNIC + strcat(cmd, cmd_prefix); + strcat(cmd, vnic); + strcat(cmd, cmd_mid); + strcat(cmd, params[i]); + + // Open a pipe and read VPP values + if ((fp = popen(cmd, "r")) == NULL) { + printf("Error opening pipe!\n"); + return; + } + + while (fgets(buf, BUFSIZE, fp) != NULL); + temp[i] = atoi(buf); + + if(pclose(fp)) { + printf("Command not found or exited with error status\n"); + return; + } + } + + // Store metrics read from the vNIC in the struct passed from the main function + vpp_metrics->bytes_in = temp[0]; + vpp_metrics->bytes_out = temp[1]; + vpp_metrics->packets_in = temp[2]; + vpp_metrics->packets_out = temp[3]; +} + +int +ves_agent_report_vnic_stats(ves_agent_main_t *vam) +{ + EVEL_ERR_CODES evel_rc = EVEL_SUCCESS; + EVENT_MEASUREMENT* vpp_m = NULL; + EVENT_HEADER* vpp_m_header = NULL; + int bytes_in_this_round; + int bytes_out_this_round; + int packets_in_this_round; + int packets_out_this_round; + struct timeval time_val; + + /* Is not enabled, do nothing */ + if (vam->config.is_enabled == VES_AGENT_DISABLED) { + return 0; + } + + memset(curr_vpp_metrics, 0, sizeof(vpp_metrics_struct)); + read_vpp_metrics(curr_vpp_metrics, DEFAULT_MEASURE_ETH); + + if(curr_vpp_metrics->bytes_in - last_vpp_metrics->bytes_in > 0) { + bytes_in_this_round = curr_vpp_metrics->bytes_in - last_vpp_metrics->bytes_in; + } else { + bytes_in_this_round = 0; + } + + if(curr_vpp_metrics->bytes_out - last_vpp_metrics->bytes_out > 0) { + bytes_out_this_round = curr_vpp_metrics->bytes_out - last_vpp_metrics->bytes_out; + } else { + bytes_out_this_round = 0; + } + + if(curr_vpp_metrics->packets_in - last_vpp_metrics->packets_in > 0) { + packets_in_this_round = curr_vpp_metrics->packets_in - last_vpp_metrics->packets_in; + } else { + packets_in_this_round = 0; + } + + if(curr_vpp_metrics->packets_out - last_vpp_metrics->packets_out > 0) { + packets_out_this_round = curr_vpp_metrics->packets_out - last_vpp_metrics->packets_out; + } else { + packets_out_this_round = 0; + } + + vpp_m = evel_new_measurement(vam->config.read_interval); + if(vpp_m != NULL) { + char str_pkt_loss[12]; + printf("New measurement report created...\n"); + evel_measurement_vnic_use_add(vpp_m, /* Pointer to the measurement */ + DEFAULT_MEASURE_ETH, /* ASCII string with the vNIC's ID */ + packets_in_this_round, /* Packets received */ + packets_out_this_round, /* Packets transmitted */ + 0, /* Broadcast packets received */ + 0, /* Broadcast packets transmitted */ + bytes_in_this_round, /* Total bytes received */ + bytes_out_this_round, /* Total bytes transmitted */ + 0, /* Multicast packets received */ + 0, /* Multicast packets transmitted */ + 0, /* Unicast packets received */ + 0); /* Unicast packets transmitted */ + + if ( vam->config.mode == VES_AGENT_MODE_DEMO) { + sprintf(str_pkt_loss, "%d", vam->config.base_pkt_loss); + } else { + sprintf(str_pkt_loss, "%s", "0.0"); + } + evel_measurement_custom_measurement_add(vpp_m, /* Pointer to the measurement */ + "ONAP-DCAE", /* measurement group's name */ + "Packet-Loss-Rate", /* the measurement's name */ + str_pkt_loss); /* The measurement's value */ + + last_epoch = start_epoch + vam->config.read_interval * 1000000; + vpp_m_header = (EVENT_HEADER *)vpp_m; + vpp_m_header->start_epoch_microsec = start_epoch; + vpp_m_header->last_epoch_microsec = last_epoch; + strcpy(vpp_m_header->reporting_entity_id.value, "No UUID available"); + strcpy(vpp_m_header->reporting_entity_name, hostname); + + evel_rc = evel_post_event(vpp_m_header); + if(evel_rc == EVEL_SUCCESS) { + printf("Measurement report correctly sent to the collector!\n"); + } + else { + printf("Post failed %d (%s)\n", evel_rc, evel_error_string()); + } + } + else { + printf("New measurement report failed (%s)\n", evel_error_string()); + } + + last_vpp_metrics->bytes_in = curr_vpp_metrics->bytes_in; + last_vpp_metrics->bytes_out = curr_vpp_metrics->bytes_out; + last_vpp_metrics->packets_in = curr_vpp_metrics->packets_in; + last_vpp_metrics->packets_out = curr_vpp_metrics->packets_out; + gettimeofday(&time_val, NULL); + start_epoch = time_val.tv_sec * 1000000 + time_val.tv_usec; + + return 0; +} + +always_inline int +ves_agent_start(ves_agent_main_t *vam) +{ + vlib_main_t *vm = vam->vlib_main; + struct timeval time_val; + char fqdn[16]; /* "xxx.xxx.xxx.xxx" */ + //char *fqdn = "127.0.0.1"; /* "xxx.xxx.xxx.xxx" */ + + sprintf(fqdn, "%d.%d.%d.%d", vam->config.server_addr.data[0], + vam->config.server_addr.data[1], + vam->config.server_addr.data[2], + vam->config.server_addr.data[3]); + /* Always success. TODO: Error check in next version */ + last_vpp_metrics = malloc(sizeof(vpp_metrics_struct)); + curr_vpp_metrics = malloc(sizeof(vpp_metrics_struct)); + + if(evel_initialize(fqdn, /* FQDN */ + vam->config.server_port, /* Port */ + NULL, /* optional path */ + NULL, /* optional topic */ + 0, /* HTTPS? */ + "", /* Username */ + "", /* Password */ + EVEL_SOURCE_VIRTUAL_MACHINE, /* Source type */ + "vFirewall", /* Role */ + 1)) /* Verbosity */ + { + fprintf(stderr, "\nFailed to initialize the EVEL library!!!\n"); + return -1; + } + + gethostname(hostname, BUFSIZE); + memset(last_vpp_metrics, 0, sizeof(vpp_metrics_struct)); + read_vpp_metrics(last_vpp_metrics, DEFAULT_MEASURE_ETH); + gettimeofday(&time_val, NULL); + start_epoch = time_val.tv_sec * 1000000 + time_val.tv_usec; + + vlib_process_wait_for_event_or_clock(vm, (f64)(vam->config.read_interval)); + + return 0; +} + +always_inline int +ves_agent_stop(void) +{ + sleep(1); + free(last_vpp_metrics); + free(curr_vpp_metrics); + evel_terminate(); + + return 0; +} + +/* *INDENT-OFF* */ +VLIB_PLUGIN_REGISTER () = { + .version = VPP_BUILD_VER, + .description = "VNF Event Stream Agent", +}; +/* *INDENT-ON* */ + +static uword +ves_agent_process (vlib_main_t * vm, + vlib_node_runtime_t * rt, + vlib_frame_t * f) +{ + ves_agent_main_t *vam = &ves_agent_main; + uword event_type; + uword * event_data = 0; + + if (vam->config.read_interval == 0) { + vam->config.read_interval = DEFAULT_READ_INTERVAL; + } + + while (1) + { + vlib_process_wait_for_event_or_clock(vm, (f64)(vam->config.read_interval)); + + event_type = vlib_process_get_events (vm, &event_data); + + switch (event_type) + { + case EVENT_VES_AGENT_START: + ves_agent_start(vam); + break; + case EVENT_VES_AGENT_STOP: + ves_agent_stop(); + break; + default: + ves_agent_report_vnic_stats(vam); + break; + } + + vec_reset_length (event_data); + } + + /* NOTREACHED */ + return 0; +} + +VLIB_REGISTER_NODE (ves_agent_process_node, static) = { + .function = ves_agent_process, + .type = VLIB_NODE_TYPE_PROCESS, + .name = "ves-agent-process", + .process_log2_n_stack_bytes = 16, +}; + +int +ves_set_server (ip46_address_t *addr, + u32 server_port, + u32 read_interval, + int is_del) +{ + ves_agent_main_t *vam = &ves_agent_main; + vlib_main_t *vm = vam->vlib_main; + int rc = 0; + + if (ip46_address_is_zero(addr)) + return VNET_API_ERROR_INVALID_DST_ADDRESS; + + if (is_del) + { + if (vam->config.is_enabled == VES_AGENT_DISABLED) { + return rc; + } + + if ((vam->config.server_addr.as_u32 != addr->ip4.as_u32) + || (vam->config.server_port != server_port)) + return VNET_API_ERROR_NO_SUCH_ENTRY; + + memset(&(vam->config.server_addr), 0, sizeof(ip4_address_t)); + vam->config.server_port = DEFAULT_SERVER_PORT; + vam->config.read_interval = DEFAULT_READ_INTERVAL; + vam->config.is_enabled = VES_AGENT_DISABLED; + vlib_process_signal_event (vm, ves_agent_process_node.index, + EVENT_VES_AGENT_STOP, 0); + } else { + // Already enabled the same config. + if ((vam->config.server_addr.as_u32 == addr->ip4.as_u32) + && (vam->config.server_port != server_port) + && vam->config.read_interval == read_interval + && vam->config.is_enabled == VES_AGENT_ENABLED) { + return rc; + } + + // Already enabled, but not exact match. + if (vam->config.is_enabled == VES_AGENT_ENABLED) { + return VNET_API_ERROR_VALUE_EXIST; + } + + vam->config.server_addr.as_u32 = addr->ip4.as_u32; + vam->config.server_port = server_port; + if (read_interval) { + vam->config.read_interval = read_interval; + } else { + vam->config.read_interval = DEFAULT_READ_INTERVAL; + } + vam->config.is_enabled = VES_AGENT_ENABLED; + vlib_process_signal_event (vm, ves_agent_process_node.index, + EVENT_VES_AGENT_START, 0); + } + + return (rc); +} + +static u8 * +format_ves_agent_set_error(u8 *s, va_list *args) +{ + s = format(s, "%s\n\n", "Caution, set fails due to enabled config:"); + s = format(s, "%U", format_ves_agent_config, NULL); + return s; +} + +static clib_error_t * +ves_server_set_command_fn(vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) +{ + ip46_address_t server_addr; + u32 server_port = DEFAULT_SERVER_PORT, inter_val = DEFAULT_READ_INTERVAL; + int is_del = 0, set_server = 0; + + memset(&server_addr, 0, sizeof(server_addr)); + + while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "server %U", + unformat_ip4_address, &server_addr.ip4)) + set_server = 1; + else if (unformat (input, "port %u", &server_port)) + ; + else if (unformat (input, "intval %u", &inter_val)) + ; + else if (unformat (input, "delete") || + unformat (input, "del")) + is_del = 1; + else + break; + } + + if (is_del || set_server) + { + int rv; + + rv = ves_set_server (&server_addr, server_port, inter_val, is_del); + switch (rv) + { + case 0: + return 0; + + case VNET_API_ERROR_INVALID_DST_ADDRESS: + return clib_error_return (0, "Invalid address"); + + case VNET_API_ERROR_NO_SUCH_ENTRY: + return clib_error_return(0, "No such Entry found"); + + case VNET_API_ERROR_VALUE_EXIST: + vlib_cli_output (vm, "%U\n", format_ves_agent_set_error, NULL); + return clib_error_return (0, "BUG found!"); + + default: + return clib_error_return (0, "BUG: rv %d", rv); + } + } else { + return clib_error_return (0, "parse error`%U'", + format_unformat_error, input); + } +} + +VLIB_CLI_COMMAND (ves_server_set_command, static) = { + .path = "set ves agent", + .short_help = "set ves agent [del] server port [intval ]", + .function = ves_server_set_command_fn, +}; + +static u8 * +format_ves_agent_config(u8 *s, va_list *args) +{ + ves_agent_main_t *vam = &ves_agent_main; + char fqdn[16]; /* "xxx.xxx.xxx.xxx" */ + + s = format(s, "%=16s %=12s %=8s %s\n", "Server Addr", + "Server Port", "Interval", "Enabled"); + if (vam->config.is_enabled == VES_AGENT_DISABLED) { + return s; + } + + sprintf(fqdn, "%d.%d.%d.%d", vam->config.server_addr.data[0], + vam->config.server_addr.data[1], + vam->config.server_addr.data[2], + vam->config.server_addr.data[3]); + + s = format(s, "%=16s %=12d %=8d %s\n", fqdn, + vam->config.server_port, + vam->config.read_interval, + vam->config.is_enabled ? "True" : "False"); + + return s; +} + +static clib_error_t * +ves_server_show_command_fn(vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) +{ + vlib_cli_output (vm, "%U", format_ves_agent_config, NULL); + + return (NULL); +} + +VLIB_CLI_COMMAND (ves_server_show_command, static) = { + .path = "show ves agent", + .short_help = "Display VES Agent Configuration", + .function = ves_server_show_command_fn, +}; + +int +ves_agent_set_mode(ves_agent_mode_t mode, + u32 pkt_loss_rate) +{ + ves_agent_main_t *vam = &ves_agent_main; + int retval = 0; + + if (VES_AGENT_MODE_DEMO == mode) { + if (pkt_loss_rate > 100) { + vam->config.mode = VES_AGENT_MODE_REAL; + vam->config.base_pkt_loss = 0; + return 1; + } + vam->config.mode = VES_AGENT_MODE_DEMO; + vam->config.base_pkt_loss = pkt_loss_rate; + } else { /* Only demo or real for current stage */ + vam->config.mode = VES_AGENT_MODE_REAL; + vam->config.base_pkt_loss = 0; + } + + return retval; +} + +static clib_error_t * +ves_mode_set_command_fn(vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) +{ + u32 pkt_loss_rate = 0; + ves_agent_mode_t mode = VES_AGENT_MODE_REAL; + int set_mode = 0; + + while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "demo") || unformat (input, "Demo") + || unformat (input, "DEMO")) + { + mode = VES_AGENT_MODE_DEMO; + set_mode = 1; + } + else if (unformat (input, "real") || unformat (input, "Real") + || unformat (input, "REAL")) + set_mode = 1; + else if (unformat (input, "base %u", &pkt_loss_rate)) + ; + else + break; + } + + if (set_mode) + { + int retval = ves_agent_set_mode(mode, pkt_loss_rate); + if (retval == 0) + return 0; + else + return clib_error_return (0, "BUG found!"); + } else { + return clib_error_return (0, "parse error`%U'", + format_unformat_error, input); + } +} + +VLIB_CLI_COMMAND (ves_mode_set_command, static) = { + .path = "set ves mode", + .short_help = "set ves mode [base ]", + .function = ves_mode_set_command_fn, +}; + +static inline u8 * +format_ves_agent_mode(u8 *s, va_list *args) +{ + ves_agent_main_t *vam = &ves_agent_main; + + s = format(s, "%=8s %s\n", "Mode", "Base Packet Loss Rate"); + + s = format(s, "%=8s %d%%\n", + vam->config.mode == VES_AGENT_MODE_DEMO ? "Demo" : "Real", + vam->config.base_pkt_loss); + + return s; +} + +static clib_error_t * +ves_agent_mode_show_command_fn(vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) +{ + vlib_cli_output (vm, "%U", format_ves_agent_mode, NULL); + + return (NULL); +} + +VLIB_CLI_COMMAND (ves_agent_mode_show_command, static) = { + .path = "show ves mode", + .short_help = "Display VES Agent Mode Information", + .function = ves_agent_mode_show_command_fn, +}; + +static clib_error_t * +ves_agent_init(vlib_main_t * vm) +{ + ves_agent_main_t *vam = &ves_agent_main; + + vam->vlib_main = vm; + vam->vnet_main = vnet_get_main(); + + return 0; +} + +VLIB_INIT_FUNCTION (ves_agent_init); + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/src/plugins/ves/ves_node.h b/src/plugins/ves/ves_node.h new file mode 100644 index 00000000..7b773843 --- /dev/null +++ b/src/plugins/ves/ves_node.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2017 Intel and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _VES_NODE_H_ +#define _VES_NODE_H_ + +#include + +#include "include/evel.h" + +#define DEFAULT_SERVER_IP "127.0.0.1" +#define DEFAULT_MEASURE_ETH "eth0" +#define DEFAULT_SERVER_PORT 8080 +#define DEFAULT_READ_INTERVAL 100 + +typedef enum { + VES_AGENT_MODE_REAL = 0, + VES_AGENT_MODE_DEMO, + _NUM_VES_AGENT_MODES +} ves_agent_mode_t; + +/* VES Agent Server configuration */ +typedef struct { + ip4_address_t server_addr; + u32 server_port; + u32 read_interval; + int is_enabled; + u32 base_pkt_loss; /* For demo only */ + ves_agent_mode_t mode; /* Demo or Real */ +} ves_agent_config_t; + +typedef struct { + ves_agent_config_t config; + + /* convenience */ + vlib_main_t * vlib_main; + vnet_main_t * vnet_main; +} ves_agent_main_t; + +ves_agent_main_t ves_agent_main; + +#define EVENT_VES_AGENT_START 1 +#define EVENT_VES_AGENT_STOP 0 + +#define VES_AGENT_DISABLED 0 +#define VES_AGENT_ENABLED 1 + +int ves_set_server(ip46_address_t *addr, u32 server_port, + u32 read_interval, int is_del); + +int ves_agent_set_mode(ves_agent_mode_t mode, + u32 pkt_loss_rate); + +#endif /* _VES_NODE_H_ */ diff --git a/src/vpp-api/java/Makefile.am b/src/vpp-api/java/Makefile.am index f18e0c24..7f4738d8 100644 --- a/src/vpp-api/java/Makefile.am +++ b/src/vpp-api/java/Makefile.am @@ -149,6 +149,26 @@ jvpp-snat/io_fd_vpp_jvpp_snat_JVppSnatImpl.h: $(jvpp_registry_ok) $(jvpp_snat_js endif # +# VES Plugin +# +if ENABLE_VES_PLUGIN +noinst_LTLIBRARIES += libjvpp_ves.la +libjvpp_ves_la_SOURCES = jvpp-ves/jvpp_ves.c +libjvpp_ves_la_CPPFLAGS = -Ijvpp-ves +libjvpp_ves_la_LIBADD = $(JVPP_LIBS) +libjvpp_ves_la_DEPENDENCIES = libjvpp_common.la + +BUILT_SOURCES += jvpp-ves/io_fd_vpp_jvpp_ves_JVppVesImpl.h +JAR_FILES += jvpp-ves-$(PACKAGE_VERSION).jar +CLEANDIRS += jvpp-ves/target + +jvpp_ves_json_files = @top_builddir@/plugins/ves/ves.api.json + +jvpp-ves/io_fd_vpp_jvpp_ves_JVppVesImpl.h: $(jvpp_registry_ok) $(jvpp_ves_json_files) + $(call japigen,ves,JVppVesImpl) +endif + +# # iOAM Trace Plugin # if ENABLE_IOAM_PLUGIN diff --git a/src/vpp-api/java/jvpp-ves/jvpp_ves.c b/src/vpp-api/java/jvpp-ves/jvpp_ves.c new file mode 100644 index 00000000..60e325b5 --- /dev/null +++ b/src/vpp-api/java/jvpp-ves/jvpp_ves.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2017 Intel Corp and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#define vl_typedefs /* define message structures */ +#include +#undef vl_typedefs + +#include +#include +#include + +#if VPPJNI_DEBUG == 1 + #define DEBUG_LOG(...) clib_warning(__VA_ARGS__) +#else + #define DEBUG_LOG(...) +#endif + +#include + +#include "jvpp-ves/io_fd_vpp_jvpp_ves_JVppVesImpl.h" +#include "jvpp_ves.h" +#include "jvpp-ves/jvpp_ves_gen.h" + +/* + * Class: io_fd_vpp_jvpp_ves_JVppVesImpl + * Method: init0 + * Signature: (JI)V + */ +JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ves_JVppVesImpl_init0 + (JNIEnv *env, jclass clazz, jobject callback, jlong queue_address, jint my_client_index) { + ves_main_t * plugin_main = &ves_main; + clib_warning ("Java_io_fd_vpp_jvpp_ves_JVppVesImpl_init0"); + + plugin_main->my_client_index = my_client_index; + plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address; + + plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback); + plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback)); + + // verify API has not changed since jar generation + #define _(N) \ + get_message_id(env, #N); + foreach_supported_api_message; + #undef _ + + #define _(N,n) \ + vl_msg_api_set_handlers(get_message_id(env, #N), #n, \ + vl_api_##n##_t_handler, \ + vl_noop_handler, \ + vl_noop_handler, \ + vl_noop_handler, \ + sizeof(vl_api_##n##_t), 1); + foreach_api_reply_handler; + #undef _ +} + +JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ves_JVppVesImpl_close0 +(JNIEnv *env, jclass clazz) { + ves_main_t * plugin_main = &ves_main; + + // cleanup: + (*env)->DeleteGlobalRef(env, plugin_main->callbackClass); + (*env)->DeleteGlobalRef(env, plugin_main->callbackObject); + + plugin_main->callbackClass = NULL; + plugin_main->callbackObject = NULL; +} + +/* Attach thread to JVM and cache class references when initiating JVPP VES */ +jint JNI_OnLoad(JavaVM *vm, void *reserved) { + JNIEnv* env; + + if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) { + return JNI_EVERSION; + } + + if (cache_class_references(env) != 0) { + clib_warning ("Failed to cache class references\n"); + return JNI_ERR; + } + + return JNI_VERSION_1_8; +} + +/* Clean up cached references when disposing JVPP VES */ +void JNI_OnUnload(JavaVM *vm, void *reserved) { + JNIEnv* env; + if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) { + return; + } + delete_class_references(env); +} diff --git a/src/vpp-api/java/jvpp-ves/jvpp_ves.h b/src/vpp-api/java/jvpp-ves/jvpp_ves.h new file mode 100644 index 00000000..642101ca --- /dev/null +++ b/src/vpp-api/java/jvpp-ves/jvpp_ves.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017 Intel Corp and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __included_jvpp_ves_h__ +#define __included_jvpp_ves_h__ + +#include +#include +#include +#include +#include +#include + +/* Global state for JVPP-VES */ +typedef struct { + /* Pointer to shared memory queue */ + unix_shared_memory_queue_t * vl_input_queue; + + /* VPP api client index */ + u32 my_client_index; + + /* Callback object and class references enabling asynchronous Java calls */ + jobject callbackObject; + jclass callbackClass; + +} ves_main_t; + +ves_main_t ves_main __attribute__((aligned (64))); + + +#endif /* __included_jvpp_ves_h__ */ -- 2.12.2.windows.2