PK!g /ccregister-gutenberg-editor.phpnu[base ) { $urls = WHISTLE_Kirki::enqueue_fonts_url(); add_editor_style( $urls ); add_editor_style( 'css/editor-style.css' ); } } public function whistle_custom_font() { $styles = ''; $fonts = cs_get_option('custom_font_fields'); if( !empty ( $fonts ) && count( $fonts ) > 0 ){ foreach( $fonts as $font ): $styles .= '@font-face {'; $styles .= "font-family: '{$font['custom_font_name']}';"; $styles .= "src: url('{$font['custom_font_woof']}') format('woff'),"; $styles .= "url('{$font['custom_font_woof2']}') format('woff2');"; $styles .= 'font-weight: normal;'; $styles .= 'font-style: normal;'; $styles .= '}'; endforeach; } return $styles; } public function whistle_editor_dynamic_styles( $mceInit ) { $styles = ''; $styles .= $this->whistle_custom_font(); $styles .= $this->whistle_backend_classic_editor_styles(); if ( isset( $mceInit['content_style'] ) ) { $mceInit['content_style'] .= ' ' . $styles . ' '; } else { $mceInit['content_style'] = $styles . ' '; } return $mceInit; } public function whistle_backend_classic_editor_styles() { $styles = ''; $styles .= 'body#tinymce.wp-editor.content pre { font-family:monospace; }'; //Body tag typography from customizer $status_of_body_content_typo = get_theme_mod( 'customize-body-content-typo', whistle_defaults('customize-body-content-typo') ); if( $status_of_body_content_typo == '1' ) { $font = get_theme_mod('body-content-typo', whistle_defaults('body-content-typo')); $font_family = isset($font['font-family']) ? $font['font-family'] : ''; $font_size = isset($font['font-size']) ? $font['font-size'] : ''; $font_weight = isset($font['variant']) ? $font['variant'] : ''; $font_weight = ($font_weight == 'regular') ? '400' : $font_weight; $line_height = isset($font['line-height']) ? $font['line-height'] : ''; $letter_spacing = isset($font['letter-spacing']) ? $font['letter-spacing'] : ''; $font_color = isset($font['color']) ? $font['color'] : ''; $text_transform = isset($font['text-transform']) ? $font['text-transform'] : ''; $styles .= 'body#tinymce.wp-editor.content > * {'; if (!empty($font_family)) { $styles .= "font-family:{$font_family}; "; } if (!empty($font_size)) { $styles .= "font-size:{$font_size}; "; } if (!empty($font_weight)) { $styles .= "font-weight:{$font_weight}; "; } if (!empty($line_height)) { $styles .= "line-height:{$line_height}; "; } if (!empty($letter_spacing)){ $styles .= "letter-spacing:{$letter_spacing}; "; } if (!empty($font_color)) { $styles .= "color:{$font_color};"; } if (!empty($text_transform)){ $styles .= "text-transform:{$text_transform}; "; } $styles .= "}"; } //Body tag bg from customizer $body_bg_color = get_theme_mod('body-bg-color', whistle_defaults('body-bg-color')); $body_content_color = get_theme_mod('body-content-color', whistle_defaults('body-content-color')); $body_a_color = get_theme_mod('body-a-color', whistle_defaults('body-a-color')); $body_a_hover_color = get_theme_mod('body-a-hover-color', whistle_defaults('body-a-hover-color')); if (!empty($body_bg_color) || !empty($body_content_color)) { $styles .= 'body#tinymce.wp-editor.content {'; if (!empty($body_bg_color)) { $styles .= "background-color:{$body_bg_color}; "; } if (!empty($body_content_color)) { $styles .= "color:{$body_content_color}; "; } $styles .= '}'; } if (!empty($body_content_color)) { $styles .= 'body#tinymce.wp-editor.content pre {'; $styles .= "color:{$body_content_color}; "; $styles .= '}'; } if (!empty($body_a_color)) { $styles .= 'body#tinymce.wp-editor.content a {'; $styles .= "color:{$body_a_color}; "; $styles .= '}'; } if (!empty($body_a_hover_color)) { $styles .= 'body#tinymce.wp-editor.content a:focus, body#tinymce.wp-editor.content a:hover {'; $styles .= "color:{$body_a_hover_color}; "; $styles .= '}'; } // h1 to h6 tag typography from customizer for ($i = 1; $i <= 6; $i++) : $status_of_h_typo = get_theme_mod( 'customize-body-h'.$i.'-typo', whistle_defaults('customize-body-h'.$i.'-typo') ); if($status_of_h_typo == 1){ $font = get_theme_mod('h'.$i.'',whistle_defaults('h'.$i.'')); $font_family = isset($font['font-family']) ? $font['font-family'] : ''; $font_size = isset($font['font-size']) ? $font['font-size'] : ''; $font_weight = isset($font['variant']) ? $font['variant'] : ''; $font_weight = ($font_weight == 'regular') ? '400' : $font_weight; $line_height = isset($font['line-height']) ? $font['line-height'] : ''; $letter_spacing = isset($font['letter-spacing']) ? $font['letter-spacing'] : ''; $font_color = isset($font['color']) ? $font['color'] : ''; $text_align = isset($font['text-align']) ? $font['text-align'] : ''; $text_transform = isset($font['text-transform']) ? $font['text-transform'] : ''; $styles .= 'body#tinymce.wp-editor.content h'.$i.' {'; if (!empty($font_family)) { $styles .= "font-family:{$font_family}; "; } if (!empty($font_size)) { $styles .= "font-size:{$font_size}; "; } if (!empty($font_weight)) { $styles .= "font-weight:{$font_weight}; "; } if (!empty($line_height)) { $styles .= "line-height:{$line_height}; "; } else { $styles .= "line-height:normal;"; } if (!empty($letter_spacing)){ $styles .= "letter-spacing:{$letter_spacing}; "; } if (!empty($font_color)) { $styles .= "color:{$font_color}; "; } if (!empty($text_align)) { $styles .= "text-align:{$text_align}; "; } if (!empty($text_transform)){ $styles .= "text-transform:{$text_transform}; "; } $styles .= "}"; } endfor; return $styles; } public function whistle_backend_editor_styles() { $styles = ''; $styles .= $this->whistle_custom_font(); $styles .= '.editor-styles-wrapper pre { font-family:monospace; }'; $status_of_body_content_typo = get_theme_mod( 'customize-body-content-typo', whistle_defaults('customize-body-content-typo') ); if( $status_of_body_content_typo == '1' ) { $font = get_theme_mod('body-content-typo', whistle_defaults('body-content-typo')); $line_height = isset($font['line-height']) ? $font['line-height'] : ''; $styles .= '.wp-block-pullquote blockquote, .wp-block-pullquote blockquote p {'; if (!empty($line_height)) { $styles .= "line-height:{$line_height}; "; } $styles .= "}"; } wp_enqueue_style( 'whistle-gutenberg', get_theme_file_uri('/css/admin-gutenberg.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_add_inline_style( 'whistle-gutenberg', $styles ); } } new Gutenberg_Editor_CSS(); endif;PK!(*]class-tgm-plugin-activation.phpnu[wp_version = $GLOBALS['wp_version']; // Announce that the class is ready, and pass the object (for advanced use). do_action_ref_array( 'tgmpa_init', array( $this ) ); /* * Load our text domain and allow for overloading the fall-back file. * * {@internal IMPORTANT! If this code changes, review the regex in the custom TGMPA * generator on the website.}} */ add_action( 'init', array( $this, 'load_textdomain' ), 5 ); add_filter( 'load_textdomain_mofile', array( $this, 'overload_textdomain_mofile' ), 10, 2 ); // When the rest of WP has loaded, kick-start the rest of the class. add_action( 'init', array( $this, 'init' ) ); } /** * Magic method to (not) set protected properties from outside of this class. * * {@internal hackedihack... There is a serious bug in v2.3.2 - 2.3.6 where the `menu` property * is being assigned rather than tested in a conditional, effectively rendering it useless. * This 'hack' prevents this from happening.}} * * @see https://github.com/TGMPA/TGM-Plugin-Activation/blob/2.3.6/tgm-plugin-activation/class-tgm-plugin-activation.php#L1593 * * @since 2.5.2 * * @param string $name Name of an inaccessible property. * @param mixed $value Value to assign to the property. * @return void Silently fail to set the property when this is tried from outside of this class context. * (Inside this class context, the __set() method if not used as there is direct access.) */ public function __set( $name, $value ) { return; } /** * Magic method to get the value of a protected property outside of this class context. * * @since 2.5.2 * * @param string $name Name of an inaccessible property. * @return mixed The property value. */ public function __get( $name ) { return $this->{$name}; } /** * Initialise the interactions between this class and WordPress. * * Hooks in three new methods for the class: admin_menu, notices and styles. * * @since 2.0.0 * * @see TGM_Plugin_Activation::admin_menu() * @see TGM_Plugin_Activation::notices() * @see TGM_Plugin_Activation::styles() */ public function init() { /** * By default TGMPA only loads on the WP back-end and not in an Ajax call. Using this filter * you can overrule that behaviour. * * @since 2.5.0 * * @param bool $load Whether or not TGMPA should load. * Defaults to the return of `is_admin() && ! defined( 'DOING_AJAX' )`. */ if ( true !== apply_filters( 'tgmpa_load', ( is_admin() && ! defined( 'DOING_AJAX' ) ) ) ) { return; } // Load class strings. $this->strings = array( 'page_title' => esc_html__( 'Install Required Plugins', 'whistle' ), 'menu_title' => esc_html__( 'Install Plugins', 'whistle' ), /* translators: %s: plugin name. */ 'installing' => esc_html__( 'Installing Plugin: %s', 'whistle' ), /* translators: %s: plugin name. */ 'updating' => esc_html__( 'Updating Plugin: %s', 'whistle' ), 'oops' => esc_html__( 'Something went wrong with the plugin API.', 'whistle' ), 'notice_can_install_required' => _n_noop( /* translators: 1: plugin name(s). */ 'This theme requires the following plugin: %1$s.', 'This theme requires the following plugins: %1$s.', 'whistle' ), 'notice_can_install_recommended' => _n_noop( /* translators: 1: plugin name(s). */ 'This theme recommends the following plugin: %1$s.', 'This theme recommends the following plugins: %1$s.', 'whistle' ), 'notice_ask_to_update' => _n_noop( /* translators: 1: plugin name(s). */ 'The following plugin needs to be updated to its latest version to ensure maximum compatibility with this theme: %1$s.', 'The following plugins need to be updated to their latest version to ensure maximum compatibility with this theme: %1$s.', 'whistle' ), 'notice_ask_to_update_maybe' => _n_noop( /* translators: 1: plugin name(s). */ 'There is an update available for: %1$s.', 'There are updates available for the following plugins: %1$s.', 'whistle' ), 'notice_can_activate_required' => _n_noop( /* translators: 1: plugin name(s). */ 'The following required plugin is currently inactive: %1$s.', 'The following required plugins are currently inactive: %1$s.', 'whistle' ), 'notice_can_activate_recommended' => _n_noop( /* translators: 1: plugin name(s). */ 'The following recommended plugin is currently inactive: %1$s.', 'The following recommended plugins are currently inactive: %1$s.', 'whistle' ), 'install_link' => _n_noop( 'Begin installing plugin', 'Begin installing plugins', 'whistle' ), 'update_link' => _n_noop( 'Begin updating plugin', 'Begin updating plugins', 'whistle' ), 'activate_link' => _n_noop( 'Begin activating plugin', 'Begin activating plugins', 'whistle' ), 'return' => esc_html__( 'Return to Required Plugins Installer', 'whistle' ), 'dashboard' => esc_html__( 'Return to the Dashboard', 'whistle' ), 'plugin_activated' => esc_html__( 'Plugin activated successfully.', 'whistle' ), 'activated_successfully' => esc_html__( 'The following plugin was activated successfully:', 'whistle' ), /* translators: 1: plugin name. */ 'plugin_already_active' => esc_html__( 'No action taken. Plugin %1$s was already active.', 'whistle' ), /* translators: 1: plugin name. */ 'plugin_needs_higher_version' => esc_html__( 'Plugin not activated. A higher version of %s is needed for this theme. Please update the plugin.', 'whistle' ), /* translators: 1: dashboard link. */ 'complete' => esc_html__( 'All plugins installed and activated successfully. %1$s', 'whistle' ), 'dismiss' => esc_html__( 'Dismiss this notice', 'whistle' ), 'notice_cannot_install_activate' => esc_html__( 'There are one or more required or recommended plugins to install, update or activate.', 'whistle' ), 'contact_admin' => esc_html__( 'Please contact the administrator of this site for help.', 'whistle' ), ); do_action( 'tgmpa_register' ); /* After this point, the plugins should be registered and the configuration set. */ // Proceed only if we have plugins to handle. if ( empty( $this->plugins ) || ! is_array( $this->plugins ) ) { return; } // Set up the menu and notices if we still have outstanding actions. if ( true !== $this->is_tgmpa_complete() ) { // Sort the plugins. array_multisort( $this->sort_order, SORT_ASC, $this->plugins ); add_action( 'admin_menu', array( $this, 'admin_menu' ) ); add_action( 'admin_head', array( $this, 'dismiss' ) ); // Prevent the normal links from showing underneath a single install/update page. add_filter( 'install_plugin_complete_actions', array( $this, 'actions' ) ); add_filter( 'update_plugin_complete_actions', array( $this, 'actions' ) ); if ( $this->has_notices ) { add_action( 'admin_notices', array( $this, 'notices' ) ); add_action( 'admin_init', array( $this, 'admin_init' ), 1 ); add_action( 'admin_enqueue_scripts', array( $this, 'thickbox' ) ); } } // If needed, filter plugin action links. add_action( 'load-plugins.php', array( $this, 'add_plugin_action_link_filters' ), 1 ); // Make sure things get reset on switch theme. add_action( 'switch_theme', array( $this, 'flush_plugins_cache' ) ); if ( $this->has_notices ) { add_action( 'switch_theme', array( $this, 'update_dismiss' ) ); } // Setup the force activation hook. if ( true === $this->has_forced_activation ) { add_action( 'admin_init', array( $this, 'force_activation' ) ); } // Setup the force deactivation hook. if ( true === $this->has_forced_deactivation ) { add_action( 'switch_theme', array( $this, 'force_deactivation' ) ); } } /** * Load translations. * * @since 2.6.0 * * (@internal Uses `load_theme_textdomain()` rather than `load_plugin_textdomain()` to * get round the different ways of handling the path and deprecated notices being thrown * and such. For plugins, the actual file name will be corrected by a filter.}} * * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA * generator on the website.}} */ public function load_textdomain() { if ( is_textdomain_loaded( 'whistle' ) ) { return; } if ( false !== strpos( __FILE__, WP_PLUGIN_DIR ) || false !== strpos( __FILE__, WPMU_PLUGIN_DIR ) ) { // Plugin, we'll need to adjust the file name. add_action( 'load_textdomain_mofile', array( $this, 'correct_plugin_mofile' ), 10, 2 ); load_theme_textdomain( 'whistle', get_theme_file_path() . '/languages' ); remove_action( 'load_textdomain_mofile', array( $this, 'correct_plugin_mofile' ), 10 ); } else { load_theme_textdomain( 'whistle', get_theme_file_path() . '/languages' ); } } /** * Correct the .mo file name for (must-use) plugins. * * Themese use `/path/{locale}.mo` while plugins use `/path/{text-domain}-{locale}.mo`. * * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA * generator on the website.}} * * @since 2.6.0 * * @param string $mofile Full path to the target mofile. * @param string $domain The domain for which a language file is being loaded. * @return string $mofile */ public function correct_plugin_mofile( $mofile, $domain ) { // Exit early if not our domain (just in case). if ( 'whistle' !== $domain ) { return $mofile; } return preg_replace( '`/([a-z]{2}_[A-Z]{2}.mo)$`', '/tgmpa-$1', $mofile ); } /** * Potentially overload the fall-back translation file for the current language. * * WP, by default since WP 3.7, will load a local translation first and if none * can be found, will try and find a translation in the /wp-content/languages/ directory. * As this library is theme/plugin agnostic, translation files for TGMPA can exist both * in the WP_LANG_DIR /plugins/ subdirectory as well as in the /themes/ subdirectory. * * This method makes sure both directories are checked. * * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA * generator on the website.}} * * @since 2.6.0 * * @param string $mofile Full path to the target mofile. * @param string $domain The domain for which a language file is being loaded. * @return string $mofile */ public function overload_textdomain_mofile( $mofile, $domain ) { // Exit early if not our domain, not a WP_LANG_DIR load or if the file exists and is readable. if ( 'whistle' !== $domain || false === strpos( $mofile, WP_LANG_DIR ) || @is_readable( $mofile ) ) { return $mofile; } // Current fallback file is not valid, let's try the alternative option. if ( false !== strpos( $mofile, '/themes/' ) ) { return str_replace( '/themes/', '/plugins/', $mofile ); } elseif ( false !== strpos( $mofile, '/plugins/' ) ) { return str_replace( '/plugins/', '/themes/', $mofile ); } else { return $mofile; } } /** * Hook in plugin action link filters for the WP native plugins page. * * - Prevent activation of plugins which don't meet the minimum version requirements. * - Prevent deactivation of force-activated plugins. * - Add update notice if update available. * * @since 2.5.0 */ public function add_plugin_action_link_filters() { foreach ( $this->plugins as $slug => $plugin ) { if ( false === $this->can_plugin_activate( $slug ) ) { add_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_activate' ), 20 ); } if ( true === $plugin['force_activation'] ) { add_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_deactivate' ), 20 ); } if ( false !== $this->does_plugin_require_update( $slug ) ) { add_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_update' ), 20 ); } } } /** * Remove the 'Activate' link on the WP native plugins page if the plugin does not meet the * minimum version requirements. * * @since 2.5.0 * * @param array $actions Action links. * @return array */ public function filter_plugin_action_links_activate( $actions ) { unset( $actions['activate'] ); return $actions; } /** * Remove the 'Deactivate' link on the WP native plugins page if the plugin has been set to force activate. * * @since 2.5.0 * * @param array $actions Action links. * @return array */ public function filter_plugin_action_links_deactivate( $actions ) { unset( $actions['deactivate'] ); return $actions; } /** * Add a 'Requires update' link on the WP native plugins page if the plugin does not meet the * minimum version requirements. * * @since 2.5.0 * * @param array $actions Action links. * @return array */ public function filter_plugin_action_links_update( $actions ) { $actions['update'] = sprintf( '%3$s', esc_url( $this->get_tgmpa_status_url( 'update' ) ), esc_attr__( 'This plugin needs to be updated to be compatible with your theme.', 'whistle' ), esc_html__( 'Update Required', 'whistle' ) ); return $actions; } /** * Handles calls to show plugin information via links in the notices. * * We get the links in the admin notices to point to the TGMPA page, rather * than the typical plugin-install.php file, so we can prepare everything * beforehand. * * WP does not make it easy to show the plugin information in the thickbox - * here we have to require a file that includes a function that does the * main work of displaying it, enqueue some styles, set up some globals and * finally call that function before exiting. * * Down right easy once you know how... * * Returns early if not the TGMPA page. * * @since 2.1.0 * * @global string $tab Used as iframe div class names, helps with styling * @global string $body_id Used as the iframe body ID, helps with styling * * @return null Returns early if not the TGMPA page. */ public function admin_init() { if ( ! $this->is_tgmpa_page() ) { return; } if ( isset( $_REQUEST['tab'] ) && 'plugin-information' === $_REQUEST['tab'] ) { // Needed for install_plugin_information(). require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; wp_enqueue_style( 'plugin-install' ); global $tab, $body_id; $body_id = 'plugin-information'; // @codingStandardsIgnoreStart $tab = 'plugin-information'; // @codingStandardsIgnoreEnd install_plugin_information(); exit; } } /** * Enqueue thickbox scripts/styles for plugin info. * * Thickbox is not automatically included on all admin pages, so we must * manually enqueue it for those pages. * * Thickbox is only loaded if the user has not dismissed the admin * notice or if there are any plugins left to install and activate. * * @since 2.1.0 */ public function thickbox() { if ( ! get_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, true ) ) { add_thickbox(); } } /** * Adds submenu page if there are plugin actions to take. * * This method adds the submenu page letting users know that a required * plugin needs to be installed. * * This page disappears once the plugin has been installed and activated. * * @since 1.0.0 * * @see TGM_Plugin_Activation::init() * @see TGM_Plugin_Activation::install_plugins_page() * * @return null Return early if user lacks capability to install a plugin. */ public function admin_menu() { // Make sure privileges are correct to see the page. if ( ! current_user_can( 'install_plugins' ) ) { return; } $args = apply_filters( 'tgmpa_admin_menu_args', array( 'parent_slug' => $this->parent_slug, // Parent Menu slug. 'page_title' => $this->strings['page_title'], // Page title. 'menu_title' => $this->strings['menu_title'], // Menu title. 'capability' => $this->capability, // Capability. 'menu_slug' => $this->menu, // Menu slug. 'function' => array( $this, 'install_plugins_page' ), // Callback. ) ); $this->add_admin_menu( $args ); } /** * Add the menu item. * * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA * generator on the website.}} * * @since 2.5.0 * * @param array $args Menu item configuration. */ protected function add_admin_menu( array $args ) { $this->page_hook = add_theme_page( $args['page_title'], $args['menu_title'], $args['capability'], $args['menu_slug'], $args['function'] ); } /** * Echoes plugin installation form. * * This method is the callback for the admin_menu method function. * This displays the admin page and form area where the user can select to install and activate the plugin. * Aborts early if we're processing a plugin installation action. * * @since 1.0.0 * * @return null Aborts early if we're processing a plugin installation action. */ public function install_plugins_page() { // Store new instance of plugin table in object. $plugin_table = new TGMPA_List_Table; // Return early if processing a plugin installation action. if ( ( ( 'tgmpa-bulk-install' === $plugin_table->current_action() || 'tgmpa-bulk-update' === $plugin_table->current_action() ) && $plugin_table->process_bulk_actions() ) || $this->do_plugin_install() ) { return; } // Force refresh of available plugin information so we'll know about manual updates/deletes. wp_clean_plugins_cache( false ); ?>

prepare_items(); ?> message ) && is_string( $this->message ) ) { echo wp_kses_post( $this->message ); } ?> views(); ?>
display(); ?>
sanitize_key( urldecode( $_GET['plugin'] ) ); if ( ! isset( $this->plugins[ $slug ] ) ) { return false; } // Was an install or upgrade action link clicked? if ( ( isset( $_GET['tgmpa-install'] ) && 'install-plugin' === $_GET['tgmpa-install'] ) || ( isset( $_GET['tgmpa-update'] ) && 'update-plugin' === $_GET['tgmpa-update'] ) ) { $install_type = 'install'; if ( isset( $_GET['tgmpa-update'] ) && 'update-plugin' === $_GET['tgmpa-update'] ) { $install_type = 'update'; } check_admin_referer( 'tgmpa-' . $install_type, 'tgmpa-nonce' ); // Pass necessary information via URL if WP_Filesystem is needed. $url = wp_nonce_url( add_query_arg( array( 'plugin' => urlencode( $slug ), 'tgmpa-' . $install_type => $install_type . '-plugin', ), $this->get_tgmpa_url() ), 'tgmpa-' . $install_type, 'tgmpa-nonce' ); $method = ''; // Leave blank so WP_Filesystem can populate it as necessary. if ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, array() ) ) ) { return true; } if ( ! WP_Filesystem( $creds ) ) { request_filesystem_credentials( esc_url_raw( $url ), $method, true, false, array() ); // Setup WP_Filesystem. return true; } /* If we arrive here, we have the filesystem. */ // Prep variables for Plugin_Installer_Skin class. $extra = array(); $extra['slug'] = $slug; // Needed for potentially renaming of directory name. $source = $this->get_download_url( $slug ); $api = ( 'repo' === $this->plugins[ $slug ]['source_type'] ) ? $this->get_plugins_api( $slug ) : null; $api = ( false !== $api ) ? $api : null; $url = add_query_arg( array( 'action' => $install_type . '-plugin', 'plugin' => urlencode( $slug ), ), 'update.php' ); if ( ! class_exists( 'Plugin_Upgrader', false ) ) { require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; } $title = ( 'update' === $install_type ) ? $this->strings['updating'] : $this->strings['installing']; $skin_args = array( 'type' => ( 'bundled' !== $this->plugins[ $slug ]['source_type'] ) ? 'web' : 'upload', 'title' => sprintf( $title, $this->plugins[ $slug ]['name'] ), 'url' => esc_url_raw( $url ), 'nonce' => $install_type . '-plugin_' . $slug, 'plugin' => '', 'api' => $api, 'extra' => $extra, ); unset( $title ); if ( 'update' === $install_type ) { $skin_args['plugin'] = $this->plugins[ $slug ]['file_path']; $skin = new Plugin_Upgrader_Skin( $skin_args ); } else { $skin = new Plugin_Installer_Skin( $skin_args ); } // Create a new instance of Plugin_Upgrader. $upgrader = new Plugin_Upgrader( $skin ); // Perform the action and install the plugin from the $source urldecode(). add_filter( 'upgrader_source_selection', array( $this, 'maybe_adjust_source_dir' ), 1, 3 ); if ( 'update' === $install_type ) { // Inject our info into the update transient. $to_inject = array( $slug => $this->plugins[ $slug ] ); $to_inject[ $slug ]['source'] = $source; $this->inject_update_info( $to_inject ); $upgrader->upgrade( $this->plugins[ $slug ]['file_path'] ); } else { $upgrader->install( $source ); } remove_filter( 'upgrader_source_selection', array( $this, 'maybe_adjust_source_dir' ), 1 ); // Make sure we have the correct file path now the plugin is installed/updated. $this->populate_file_path( $slug ); // Only activate plugins if the config option is set to true and the plugin isn't // already active (upgrade). if ( $this->is_automatic && ! $this->is_plugin_active( $slug ) ) { $plugin_activate = $upgrader->plugin_info(); // Grab the plugin info from the Plugin_Upgrader method. if ( false === $this->activate_single_plugin( $plugin_activate, $slug, true ) ) { return true; // Finish execution of the function early as we encountered an error. } } $this->show_tgmpa_version(); // Display message based on if all plugins are now active or not. if ( $this->is_tgmpa_complete() ) { echo '

', sprintf( esc_html( $this->strings['complete'] ), '' . esc_html__( 'Return to the Dashboard', 'whistle' ) . '' ), '

'; echo ''; } else { echo '

', esc_html( $this->strings['return'] ), '

'; } return true; } elseif ( isset( $this->plugins[ $slug ]['file_path'], $_GET['tgmpa-activate'] ) && 'activate-plugin' === $_GET['tgmpa-activate'] ) { // Activate action link was clicked. check_admin_referer( 'tgmpa-activate', 'tgmpa-nonce' ); if ( false === $this->activate_single_plugin( $this->plugins[ $slug ]['file_path'], $slug ) ) { return true; // Finish execution of the function early as we encountered an error. } } return false; } /** * Inject information into the 'update_plugins' site transient as WP checks that before running an update. * * @since 2.5.0 * * @param array $plugins The plugin information for the plugins which are to be updated. */ public function inject_update_info( $plugins ) { $repo_updates = get_site_transient( 'update_plugins' ); if ( ! is_object( $repo_updates ) ) { $repo_updates = new stdClass; } foreach ( $plugins as $slug => $plugin ) { $file_path = $plugin['file_path']; if ( empty( $repo_updates->response[ $file_path ] ) ) { $repo_updates->response[ $file_path ] = new stdClass; } // We only really need to set package, but let's do all we can in case WP changes something. $repo_updates->response[ $file_path ]->slug = $slug; $repo_updates->response[ $file_path ]->plugin = $file_path; $repo_updates->response[ $file_path ]->new_version = $plugin['version']; $repo_updates->response[ $file_path ]->package = $plugin['source']; if ( empty( $repo_updates->response[ $file_path ]->url ) && ! empty( $plugin['external_url'] ) ) { $repo_updates->response[ $file_path ]->url = $plugin['external_url']; } } set_site_transient( 'update_plugins', $repo_updates ); } /** * Adjust the plugin directory name if necessary. * * The final destination directory of a plugin is based on the subdirectory name found in the * (un)zipped source. In some cases - most notably GitHub repository plugin downloads -, this * subdirectory name is not the same as the expected slug and the plugin will not be recognized * as installed. This is fixed by adjusting the temporary unzipped source subdirectory name to * the expected plugin slug. * * @since 2.5.0 * * @param string $source Path to upgrade/zip-file-name.tmp/subdirectory/. * @param string $remote_source Path to upgrade/zip-file-name.tmp. * @param \WP_Upgrader $upgrader Instance of the upgrader which installs the plugin. * @return string $source */ public function maybe_adjust_source_dir( $source, $remote_source, $upgrader ) { if ( ! $this->is_tgmpa_page() || ! is_object( $GLOBALS['wp_filesystem'] ) ) { return $source; } // Check for single file plugins. $source_files = array_keys( $GLOBALS['wp_filesystem']->dirlist( $remote_source ) ); if ( 1 === count( $source_files ) && false === $GLOBALS['wp_filesystem']->is_dir( $source ) ) { return $source; } // Multi-file plugin, let's see if the directory is correctly named. $desired_slug = ''; // Figure out what the slug is supposed to be. if ( false === $upgrader->bulk && ! empty( $upgrader->skin->options['extra']['slug'] ) ) { $desired_slug = $upgrader->skin->options['extra']['slug']; } else { // Bulk installer contains less info, so fall back on the info registered here. foreach ( $this->plugins as $slug => $plugin ) { if ( ! empty( $upgrader->skin->plugin_names[ $upgrader->skin->i ] ) && $plugin['name'] === $upgrader->skin->plugin_names[ $upgrader->skin->i ] ) { $desired_slug = $slug; break; } } unset( $slug, $plugin ); } if ( ! empty( $desired_slug ) ) { $subdir_name = untrailingslashit( str_replace( trailingslashit( $remote_source ), '', $source ) ); if ( ! empty( $subdir_name ) && $subdir_name !== $desired_slug ) { $from_path = untrailingslashit( $source ); $to_path = trailingslashit( $remote_source ) . $desired_slug; if ( true === $GLOBALS['wp_filesystem']->move( $from_path, $to_path ) ) { return trailingslashit( $to_path ); } else { return new WP_Error( 'rename_failed', esc_html__( 'The remote plugin package does not contain a folder with the desired slug and renaming did not work.', 'whistle' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'whistle' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) ); } } elseif ( empty( $subdir_name ) ) { return new WP_Error( 'packaged_wrong', esc_html__( 'The remote plugin package consists of more than one file, but the files are not packaged in a folder.', 'whistle' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'whistle' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) ); } } return $source; } /** * Activate a single plugin and send feedback about the result to the screen. * * @since 2.5.0 * * @param string $file_path Path within wp-plugins/ to main plugin file. * @param string $slug Plugin slug. * @param bool $automatic Whether this is an automatic activation after an install. Defaults to false. * This determines the styling of the output messages. * @return bool False if an error was encountered, true otherwise. */ protected function activate_single_plugin( $file_path, $slug, $automatic = false ) { if ( $this->can_plugin_activate( $slug ) ) { $activate = activate_plugin( $file_path ); if ( is_wp_error( $activate ) ) { echo '

', wp_kses_post( $activate->get_error_message() ), '

', '

', esc_html( $this->strings['return'] ), '

'; return false; // End it here if there is an error with activation. } else { if ( ! $automatic ) { // Make sure message doesn't display again if bulk activation is performed // immediately after a single activation. if ( ! isset( $_POST['action'] ) ) { // WPCS: CSRF OK. echo '

', esc_html( $this->strings['activated_successfully'] ), ' ', esc_html( $this->plugins[ $slug ]['name'] ), '.

'; } } else { // Simpler message layout for use on the plugin install page. echo '

', esc_html( $this->strings['plugin_activated'] ), '

'; } } } elseif ( $this->is_plugin_active( $slug ) ) { // No simpler message format provided as this message should never be encountered // on the plugin install page. echo '

', sprintf( esc_html( $this->strings['plugin_already_active'] ), '' . esc_html( $this->plugins[ $slug ]['name'] ) . '' ), '

'; } elseif ( $this->does_plugin_require_update( $slug ) ) { if ( ! $automatic ) { // Make sure message doesn't display again if bulk activation is performed // immediately after a single activation. if ( ! isset( $_POST['action'] ) ) { // WPCS: CSRF OK. echo '

', sprintf( esc_html( $this->strings['plugin_needs_higher_version'] ), '' . esc_html( $this->plugins[ $slug ]['name'] ) . '' ), '

'; } } else { // Simpler message layout for use on the plugin install page. echo '

', sprintf( esc_html( $this->strings['plugin_needs_higher_version'] ), esc_html( $this->plugins[ $slug ]['name'] ) ), '

'; } } return true; } /** * Echoes required plugin notice. * * Outputs a message telling users that a specific plugin is required for * their theme. If appropriate, it includes a link to the form page where * users can install and activate the plugin. * * Returns early if we're on the Install page. * * @since 1.0.0 * * @global object $current_screen * * @return null Returns early if we're on the Install page. */ public function notices() { // Remove nag on the install page / Return early if the nag message has been dismissed or user < author. if ( ( $this->is_tgmpa_page() || $this->is_core_update_page() ) || get_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, true ) || ! current_user_can( apply_filters( 'tgmpa_show_admin_notice_capability', 'publish_posts' ) ) ) { return; } // Store for the plugin slugs by message type. $message = array(); // Initialize counters used to determine plurality of action link texts. $install_link_count = 0; $update_link_count = 0; $activate_link_count = 0; $total_required_action_count = 0; foreach ( $this->plugins as $slug => $plugin ) { if ( $this->is_plugin_active( $slug ) && false === $this->does_plugin_have_update( $slug ) ) { continue; } if ( ! $this->is_plugin_installed( $slug ) ) { if ( current_user_can( 'install_plugins' ) ) { $install_link_count++; if ( true === $plugin['required'] ) { $message['notice_can_install_required'][] = $slug; } else { $message['notice_can_install_recommended'][] = $slug; } } if ( true === $plugin['required'] ) { $total_required_action_count++; } } else { if ( ! $this->is_plugin_active( $slug ) && $this->can_plugin_activate( $slug ) ) { if ( current_user_can( 'activate_plugins' ) ) { $activate_link_count++; if ( true === $plugin['required'] ) { $message['notice_can_activate_required'][] = $slug; } else { $message['notice_can_activate_recommended'][] = $slug; } } if ( true === $plugin['required'] ) { $total_required_action_count++; } } if ( $this->does_plugin_require_update( $slug ) || false !== $this->does_plugin_have_update( $slug ) ) { if ( current_user_can( 'update_plugins' ) ) { $update_link_count++; if ( $this->does_plugin_require_update( $slug ) ) { $message['notice_ask_to_update'][] = $slug; } elseif ( false !== $this->does_plugin_have_update( $slug ) ) { $message['notice_ask_to_update_maybe'][] = $slug; } } if ( true === $plugin['required'] ) { $total_required_action_count++; } } } } unset( $slug, $plugin ); // If we have notices to display, we move forward. if ( ! empty( $message ) || $total_required_action_count > 0 ) { krsort( $message ); // Sort messages. $rendered = ''; // As add_settings_error() wraps the final message in a

and as the final message can't be // filtered, using

's in our html would render invalid html output. $line_template = '%s' . "\n"; if ( ! current_user_can( 'activate_plugins' ) && ! current_user_can( 'install_plugins' ) && ! current_user_can( 'update_plugins' ) ) { $rendered = esc_html( $this->strings['notice_cannot_install_activate'] ) . ' ' . esc_html( $this->strings['contact_admin'] ); $rendered .= $this->create_user_action_links_for_notice( 0, 0, 0, $line_template ); } else { // If dismissable is false and a message is set, output it now. if ( ! $this->dismissable && ! empty( $this->dismiss_msg ) ) { $rendered .= sprintf( $line_template, wp_kses_post( $this->dismiss_msg ) ); } // Render the individual message lines for the notice. foreach ( $message as $type => $plugin_group ) { $linked_plugins = array(); // Get the external info link for a plugin if one is available. foreach ( $plugin_group as $plugin_slug ) { $linked_plugins[] = $this->get_info_link( $plugin_slug ); } unset( $plugin_slug ); $count = count( $plugin_group ); $linked_plugins = array_map( array( 'TGMPA_Utils', 'wrap_in_em' ), $linked_plugins ); $last_plugin = array_pop( $linked_plugins ); // Pop off last name to prep for readability. $imploded = empty( $linked_plugins ) ? $last_plugin : ( implode( ', ', $linked_plugins ) . ' ' . esc_html_x( 'and', 'plugin A *and* plugin B', 'whistle' ) . ' ' . $last_plugin ); $rendered .= sprintf( $line_template, sprintf( translate_nooped_plural( $this->strings[ $type ], $count, 'whistle' ), $imploded, $count ) ); } unset( $type, $plugin_group, $linked_plugins, $count, $last_plugin, $imploded ); $rendered .= $this->create_user_action_links_for_notice( $install_link_count, $update_link_count, $activate_link_count, $line_template ); } // Register the nag messages and prepare them to be processed. add_settings_error( 'tgmpa', 'tgmpa', $rendered, $this->get_admin_notice_class() ); } // Admin options pages already output settings_errors, so this is to avoid duplication. if ( 'options-general' !== $GLOBALS['current_screen']->parent_base ) { $this->display_settings_errors(); } } /** * Generate the user action links for the admin notice. * * @since 2.6.0 * * @param int $install_count Number of plugins to install. * @param int $update_count Number of plugins to update. * @param int $activate_count Number of plugins to activate. * @param int $line_template Template for the HTML tag to output a line. * @return string Action links. */ protected function create_user_action_links_for_notice( $install_count, $update_count, $activate_count, $line_template ) { // Setup action links. $action_links = array( 'install' => '', 'update' => '', 'activate' => '', 'dismiss' => $this->dismissable ? '' . esc_html( $this->strings['dismiss'] ) . '' : '', ); $link_template = '%1$s'; if ( current_user_can( 'install_plugins' ) ) { if ( $install_count > 0 ) { $action_links['install'] = sprintf( $link_template, translate_nooped_plural( $this->strings['install_link'], $install_count, 'whistle' ), esc_url( $this->get_tgmpa_status_url( 'install' ) ) ); } if ( $update_count > 0 ) { $action_links['update'] = sprintf( $link_template, translate_nooped_plural( $this->strings['update_link'], $update_count, 'whistle' ), esc_url( $this->get_tgmpa_status_url( 'update' ) ) ); } } if ( current_user_can( 'activate_plugins' ) && $activate_count > 0 ) { $action_links['activate'] = sprintf( $link_template, translate_nooped_plural( $this->strings['activate_link'], $activate_count, 'whistle' ), esc_url( $this->get_tgmpa_status_url( 'activate' ) ) ); } $action_links = apply_filters( 'tgmpa_notice_action_links', $action_links ); $action_links = array_filter( (array) $action_links ); // Remove any empty array items. if ( ! empty( $action_links ) ) { $action_links = sprintf( $line_template, implode( ' | ', $action_links ) ); return apply_filters( 'tgmpa_notice_rendered_action_links', $action_links ); } else { return ''; } } /** * Get admin notice class. * * Work around all the changes to the various admin notice classes between WP 4.4 and 3.7 * (lowest supported version by TGMPA). * * @since 2.6.0 * * @return string */ protected function get_admin_notice_class() { if ( ! empty( $this->strings['nag_type'] ) ) { return sanitize_html_class( strtolower( $this->strings['nag_type'] ) ); } else { if ( version_compare( $this->wp_version, '4.2', '>=' ) ) { return 'notice-warning'; } elseif ( version_compare( $this->wp_version, '4.1', '>=' ) ) { return 'notice'; } else { return 'updated'; } } } /** * Display settings errors and remove those which have been displayed to avoid duplicate messages showing * * @since 2.5.0 */ protected function display_settings_errors() { global $wp_settings_errors; settings_errors( 'tgmpa' ); foreach ( (array) $wp_settings_errors as $key => $details ) { if ( 'tgmpa' === $details['setting'] ) { unset( $wp_settings_errors[ $key ] ); break; } } } /** * Register dismissal of admin notices. * * Acts on the dismiss link in the admin nag messages. * If clicked, the admin notice disappears and will no longer be visible to this user. * * @since 2.1.0 */ public function dismiss() { if ( isset( $_GET['tgmpa-dismiss'] ) && check_admin_referer( 'tgmpa-dismiss-' . get_current_user_id() ) ) { update_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, 1 ); } } /** * Add individual plugin to our collection of plugins. * * If the required keys are not set or the plugin has already * been registered, the plugin is not added. * * @since 2.0.0 * * @param array|null $plugin Array of plugin arguments or null if invalid argument. * @return null Return early if incorrect argument. */ public function register( $plugin ) { if ( empty( $plugin['slug'] ) || empty( $plugin['name'] ) ) { return; } if ( empty( $plugin['slug'] ) || ! is_string( $plugin['slug'] ) || isset( $this->plugins[ $plugin['slug'] ] ) ) { return; } $defaults = array( 'name' => '', // String 'slug' => '', // String 'source' => 'repo', // String 'required' => false, // Boolean 'version' => '', // String 'force_activation' => false, // Boolean 'force_deactivation' => false, // Boolean 'external_url' => '', // String 'is_callable' => '', // String|Array. ); // Prepare the received data. $plugin = wp_parse_args( $plugin, $defaults ); // Standardize the received slug. $plugin['slug'] = $this->sanitize_key( $plugin['slug'] ); // Forgive users for using string versions of booleans or floats for version number. $plugin['version'] = (string) $plugin['version']; $plugin['source'] = empty( $plugin['source'] ) ? 'repo' : $plugin['source']; $plugin['required'] = TGMPA_Utils::validate_bool( $plugin['required'] ); $plugin['force_activation'] = TGMPA_Utils::validate_bool( $plugin['force_activation'] ); $plugin['force_deactivation'] = TGMPA_Utils::validate_bool( $plugin['force_deactivation'] ); // Enrich the received data. $plugin['file_path'] = $this->_get_plugin_basename_from_slug( $plugin['slug'] ); $plugin['source_type'] = $this->get_plugin_source_type( $plugin['source'] ); // Set the class properties. $this->plugins[ $plugin['slug'] ] = $plugin; $this->sort_order[ $plugin['slug'] ] = $plugin['name']; // Should we add the force activation hook ? if ( true === $plugin['force_activation'] ) { $this->has_forced_activation = true; } // Should we add the force deactivation hook ? if ( true === $plugin['force_deactivation'] ) { $this->has_forced_deactivation = true; } } /** * Determine what type of source the plugin comes from. * * @since 2.5.0 * * @param string $source The source of the plugin as provided, either empty (= WP repo), a file path * (= bundled) or an external URL. * @return string 'repo', 'external', or 'bundled' */ protected function get_plugin_source_type( $source ) { if ( 'repo' === $source || preg_match( self::WP_REPO_REGEX, $source ) ) { return 'repo'; } elseif ( preg_match( self::IS_URL_REGEX, $source ) ) { return 'external'; } else { return 'bundled'; } } /** * Sanitizes a string key. * * Near duplicate of WP Core `sanitize_key()`. The difference is that uppercase characters *are* * allowed, so as not to break upgrade paths from non-standard bundled plugins using uppercase * characters in the plugin directory path/slug. Silly them. * * @see https://developer.wordpress.org/reference/hooks/sanitize_key/ * * @since 2.5.0 * * @param string $key String key. * @return string Sanitized key */ public function sanitize_key( $key ) { $raw_key = $key; $key = preg_replace( '`[^A-Za-z0-9_-]`', '', $key ); /** * Filter a sanitized key string. * * @since 2.5.0 * * @param string $key Sanitized key. * @param string $raw_key The key prior to sanitization. */ return apply_filters( 'tgmpa_sanitize_key', $key, $raw_key ); } /** * Amend default configuration settings. * * @since 2.0.0 * * @param array $config Array of config options to pass as class properties. */ public function config( $config ) { $keys = array( 'id', 'default_path', 'has_notices', 'dismissable', 'dismiss_msg', 'menu', 'parent_slug', 'capability', 'is_automatic', 'message', 'strings', ); foreach ( $keys as $key ) { if ( isset( $config[ $key ] ) ) { if ( is_array( $config[ $key ] ) ) { $this->$key = array_merge( $this->$key, $config[ $key ] ); } else { $this->$key = $config[ $key ]; } } } } /** * Amend action link after plugin installation. * * @since 2.0.0 * * @param array $install_actions Existing array of actions. * @return false|array Amended array of actions. */ public function actions( $install_actions ) { // Remove action links on the TGMPA install page. if ( $this->is_tgmpa_page() ) { return false; } return $install_actions; } /** * Flushes the plugins cache on theme switch to prevent stale entries * from remaining in the plugin table. * * @since 2.4.0 * * @param bool $clear_update_cache Optional. Whether to clear the Plugin updates cache. * Parameter added in v2.5.0. */ public function flush_plugins_cache( $clear_update_cache = true ) { wp_clean_plugins_cache( $clear_update_cache ); } /** * Set file_path key for each installed plugin. * * @since 2.1.0 * * @param string $plugin_slug Optional. If set, only (re-)populates the file path for that specific plugin. * Parameter added in v2.5.0. */ public function populate_file_path( $plugin_slug = '' ) { if ( ! empty( $plugin_slug ) && is_string( $plugin_slug ) && isset( $this->plugins[ $plugin_slug ] ) ) { $this->plugins[ $plugin_slug ]['file_path'] = $this->_get_plugin_basename_from_slug( $plugin_slug ); } else { // Add file_path key for all plugins. foreach ( $this->plugins as $slug => $values ) { $this->plugins[ $slug ]['file_path'] = $this->_get_plugin_basename_from_slug( $slug ); } } } /** * Helper function to extract the file path of the plugin file from the * plugin slug, if the plugin is installed. * * @since 2.0.0 * * @param string $slug Plugin slug (typically folder name) as provided by the developer. * @return string Either file path for plugin if installed, or just the plugin slug. */ protected function _get_plugin_basename_from_slug( $slug ) { $keys = array_keys( $this->get_plugins() ); foreach ( $keys as $key ) { if ( preg_match( '|^' . $slug . '/|', $key ) ) { return $key; } } return $slug; } /** * Retrieve plugin data, given the plugin name. * * Loops through the registered plugins looking for $name. If it finds it, * it returns the $data from that plugin. Otherwise, returns false. * * @since 2.1.0 * * @param string $name Name of the plugin, as it was registered. * @param string $data Optional. Array key of plugin data to return. Default is slug. * @return string|boolean Plugin slug if found, false otherwise. */ public function _get_plugin_data_from_name( $name, $data = 'slug' ) { foreach ( $this->plugins as $values ) { if ( $name === $values['name'] && isset( $values[ $data ] ) ) { return $values[ $data ]; } } return false; } /** * Retrieve the download URL for a package. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return string Plugin download URL or path to local file or empty string if undetermined. */ public function get_download_url( $slug ) { $dl_source = ''; switch ( $this->plugins[ $slug ]['source_type'] ) { case 'repo': return $this->get_wp_repo_download_url( $slug ); case 'external': return $this->plugins[ $slug ]['source']; case 'bundled': return $this->default_path . $this->plugins[ $slug ]['source']; } return $dl_source; // Should never happen. } /** * Retrieve the download URL for a WP repo package. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return string Plugin download URL. */ protected function get_wp_repo_download_url( $slug ) { $source = ''; $api = $this->get_plugins_api( $slug ); if ( false !== $api && isset( $api->download_link ) ) { $source = $api->download_link; } return $source; } /** * Try to grab information from WordPress API. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return object Plugins_api response object on success, WP_Error on failure. */ protected function get_plugins_api( $slug ) { static $api = array(); // Cache received responses. if ( ! isset( $api[ $slug ] ) ) { if ( ! function_exists( 'plugins_api' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; } $response = plugins_api( 'plugin_information', array( 'slug' => $slug, 'fields' => array( 'sections' => false ) ) ); $api[ $slug ] = false; if ( is_wp_error( $response ) ) { wp_die( esc_html( $this->strings['oops'] ) ); } else { $api[ $slug ] = $response; } } return $api[ $slug ]; } /** * Retrieve a link to a plugin information page. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return string Fully formed html link to a plugin information page if available * or the plugin name if not. */ public function get_info_link( $slug ) { if ( ! empty( $this->plugins[ $slug ]['external_url'] ) && preg_match( self::IS_URL_REGEX, $this->plugins[ $slug ]['external_url'] ) ) { $link = sprintf( '%2$s', esc_url( $this->plugins[ $slug ]['external_url'] ), esc_html( $this->plugins[ $slug ]['name'] ) ); } elseif ( 'repo' === $this->plugins[ $slug ]['source_type'] ) { $url = add_query_arg( array( 'tab' => 'plugin-information', 'plugin' => urlencode( $slug ), 'TB_iframe' => 'true', 'width' => '640', 'height' => '500', ), self_admin_url( 'plugin-install.php' ) ); $link = sprintf( '%2$s', esc_url( $url ), esc_html( $this->plugins[ $slug ]['name'] ) ); } else { $link = esc_html( $this->plugins[ $slug ]['name'] ); // No hyperlink. } return $link; } /** * Determine if we're on the TGMPA Install page. * * @since 2.1.0 * * @return boolean True when on the TGMPA page, false otherwise. */ protected function is_tgmpa_page() { return isset( $_GET['page'] ) && $this->menu === $_GET['page']; } /** * Determine if we're on a WP Core installation/upgrade page. * * @since 2.6.0 * * @return boolean True when on a WP Core installation/upgrade page, false otherwise. */ protected function is_core_update_page() { // Current screen is not always available, most notably on the customizer screen. if ( ! function_exists( 'get_current_screen' ) ) { return false; } $screen = get_current_screen(); if ( 'update-core' === $screen->base ) { // Core update screen. return true; } elseif ( 'plugins' === $screen->base && ! empty( $_POST['action'] ) ) { // WPCS: CSRF ok. // Plugins bulk update screen. return true; } elseif ( 'update' === $screen->base && ! empty( $_POST['action'] ) ) { // WPCS: CSRF ok. // Individual updates (ajax call). return true; } return false; } /** * Retrieve the URL to the TGMPA Install page. * * I.e. depending on the config settings passed something along the lines of: * http://example.com/wp-admin/themes.php?page=tgmpa-install-plugins * * @since 2.5.0 * * @return string Properly encoded URL (not escaped). */ public function get_tgmpa_url() { static $url; if ( ! isset( $url ) ) { $parent = $this->parent_slug; if ( false === strpos( $parent, '.php' ) ) { $parent = 'admin.php'; } $url = add_query_arg( array( 'page' => urlencode( $this->menu ), ), self_admin_url( $parent ) ); } return $url; } /** * Retrieve the URL to the TGMPA Install page for a specific plugin status (view). * * I.e. depending on the config settings passed something along the lines of: * http://example.com/wp-admin/themes.php?page=tgmpa-install-plugins&plugin_status=install * * @since 2.5.0 * * @param string $status Plugin status - either 'install', 'update' or 'activate'. * @return string Properly encoded URL (not escaped). */ public function get_tgmpa_status_url( $status ) { return add_query_arg( array( 'plugin_status' => urlencode( $status ), ), $this->get_tgmpa_url() ); } /** * Determine whether there are open actions for plugins registered with TGMPA. * * @since 2.5.0 * * @return bool True if complete, i.e. no outstanding actions. False otherwise. */ public function is_tgmpa_complete() { $complete = true; foreach ( $this->plugins as $slug => $plugin ) { if ( ! $this->is_plugin_active( $slug ) || false !== $this->does_plugin_have_update( $slug ) ) { $complete = false; break; } } return $complete; } /** * Check if a plugin is installed. Does not take must-use plugins into account. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return bool True if installed, false otherwise. */ public function is_plugin_installed( $slug ) { $installed_plugins = $this->get_plugins(); // Retrieve a list of all installed plugins (WP cached). return ( ! empty( $installed_plugins[ $this->plugins[ $slug ]['file_path'] ] ) ); } /** * Check if a plugin is active. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return bool True if active, false otherwise. */ public function is_plugin_active( $slug ) { return ( ( ! empty( $this->plugins[ $slug ]['is_callable'] ) && is_callable( $this->plugins[ $slug ]['is_callable'] ) ) || is_plugin_active( $this->plugins[ $slug ]['file_path'] ) ); } /** * Check if a plugin can be updated, i.e. if we have information on the minimum WP version required * available, check whether the current install meets them. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return bool True if OK to update, false otherwise. */ public function can_plugin_update( $slug ) { // We currently can't get reliable info on non-WP-repo plugins - issue #380. if ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) { return true; } $api = $this->get_plugins_api( $slug ); if ( false !== $api && isset( $api->requires ) ) { return version_compare( $this->wp_version, $api->requires, '>=' ); } // No usable info received from the plugins API, presume we can update. return true; } /** * Check to see if the plugin is 'updatetable', i.e. installed, with an update available * and no WP version requirements blocking it. * * @since 2.6.0 * * @param string $slug Plugin slug. * @return bool True if OK to proceed with update, false otherwise. */ public function is_plugin_updatetable( $slug ) { if ( ! $this->is_plugin_installed( $slug ) ) { return false; } else { return ( false !== $this->does_plugin_have_update( $slug ) && $this->can_plugin_update( $slug ) ); } } /** * Check if a plugin can be activated, i.e. is not currently active and meets the minimum * plugin version requirements set in TGMPA (if any). * * @since 2.5.0 * * @param string $slug Plugin slug. * @return bool True if OK to activate, false otherwise. */ public function can_plugin_activate( $slug ) { return ( ! $this->is_plugin_active( $slug ) && ! $this->does_plugin_require_update( $slug ) ); } /** * Retrieve the version number of an installed plugin. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return string Version number as string or an empty string if the plugin is not installed * or version unknown (plugins which don't comply with the plugin header standard). */ public function get_installed_version( $slug ) { $installed_plugins = $this->get_plugins(); // Retrieve a list of all installed plugins (WP cached). if ( ! empty( $installed_plugins[ $this->plugins[ $slug ]['file_path'] ]['Version'] ) ) { return $installed_plugins[ $this->plugins[ $slug ]['file_path'] ]['Version']; } return ''; } /** * Check whether a plugin complies with the minimum version requirements. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return bool True when a plugin needs to be updated, otherwise false. */ public function does_plugin_require_update( $slug ) { $installed_version = $this->get_installed_version( $slug ); $minimum_version = $this->plugins[ $slug ]['version']; return version_compare( $minimum_version, $installed_version, '>' ); } /** * Check whether there is an update available for a plugin. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return false|string Version number string of the available update or false if no update available. */ public function does_plugin_have_update( $slug ) { // Presume bundled and external plugins will point to a package which meets the minimum required version. if ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) { if ( $this->does_plugin_require_update( $slug ) ) { return $this->plugins[ $slug ]['version']; } return false; } $repo_updates = get_site_transient( 'update_plugins' ); if ( isset( $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->new_version ) ) { return $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->new_version; } return false; } /** * Retrieve potential upgrade notice for a plugin. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return string The upgrade notice or an empty string if no message was available or provided. */ public function get_upgrade_notice( $slug ) { // We currently can't get reliable info on non-WP-repo plugins - issue #380. if ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) { return ''; } $repo_updates = get_site_transient( 'update_plugins' ); if ( ! empty( $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->upgrade_notice ) ) { return $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->upgrade_notice; } return ''; } /** * Wrapper around the core WP get_plugins function, making sure it's actually available. * * @since 2.5.0 * * @param string $plugin_folder Optional. Relative path to single plugin folder. * @return array Array of installed plugins with plugin information. */ public function get_plugins( $plugin_folder = '' ) { if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } return get_plugins( $plugin_folder ); } /** * Delete dismissable nag option when theme is switched. * * This ensures that the user(s) is/are again reminded via nag of required * and/or recommended plugins if they re-activate the theme. * * @since 2.1.1 */ public function update_dismiss() { delete_metadata( 'user', null, 'tgmpa_dismissed_notice_' . $this->id, null, true ); } /** * Forces plugin activation if the parameter 'force_activation' is * set to true. * * This allows theme authors to specify certain plugins that must be * active at all times while using the current theme. * * Please take special care when using this parameter as it has the * potential to be harmful if not used correctly. Setting this parameter * to true will not allow the specified plugin to be deactivated unless * the user switches themes. * * @since 2.2.0 */ public function force_activation() { foreach ( $this->plugins as $slug => $plugin ) { if ( true === $plugin['force_activation'] ) { if ( ! $this->is_plugin_installed( $slug ) ) { // Oops, plugin isn't there so iterate to next condition. continue; } elseif ( $this->can_plugin_activate( $slug ) ) { // There we go, activate the plugin. activate_plugin( $plugin['file_path'] ); } } } } /** * Forces plugin deactivation if the parameter 'force_deactivation' * is set to true and adds the plugin to the 'recently active' plugins list. * * This allows theme authors to specify certain plugins that must be * deactivated upon switching from the current theme to another. * * Please take special care when using this parameter as it has the * potential to be harmful if not used correctly. * * @since 2.2.0 */ public function force_deactivation() { $deactivated = array(); foreach ( $this->plugins as $slug => $plugin ) { /* * Only proceed forward if the parameter is set to true and plugin is active * as a 'normal' (not must-use) plugin. */ if ( true === $plugin['force_deactivation'] && is_plugin_active( $plugin['file_path'] ) ) { deactivate_plugins( $plugin['file_path'] ); $deactivated[ $plugin['file_path'] ] = time(); } } if ( ! empty( $deactivated ) ) { update_option( 'recently_activated', $deactivated + (array) get_option( 'recently_activated' ) ); } } /** * Echo the current TGMPA version number to the page. * * @since 2.5.0 */ public function show_tgmpa_version() { echo '

', esc_html( sprintf( /* translators: %s: version number */ __( 'TGMPA v%s', 'whistle' ), self::TGMPA_VERSION ) ), '

'; } /** * Returns the singleton instance of the class. * * @since 2.4.0 * * @return \TGM_Plugin_Activation The TGM_Plugin_Activation object. */ public static function get_instance() { if ( ! isset( self::$instance ) && ! ( self::$instance instanceof self ) ) { self::$instance = new self(); } return self::$instance; } } if ( ! function_exists( 'load_tgm_plugin_activation' ) ) { /** * Ensure only one instance of the class is ever invoked. * * @since 2.5.0 */ function load_tgm_plugin_activation() { $GLOBALS['tgmpa'] = TGM_Plugin_Activation::get_instance(); } } if ( did_action( 'plugins_loaded' ) ) { load_tgm_plugin_activation(); } else { add_action( 'plugins_loaded', 'load_tgm_plugin_activation' ); } } if ( ! function_exists( 'tgmpa' ) ) { /** * Helper function to register a collection of required plugins. * * @since 2.0.0 * @api * * @param array $plugins An array of plugin arrays. * @param array $config Optional. An array of configuration values. */ function tgmpa( $plugins, $config = array() ) { $instance = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); foreach ( $plugins as $plugin ) { call_user_func( array( $instance, 'register' ), $plugin ); } if ( ! empty( $config ) && is_array( $config ) ) { // Send out notices for deprecated arguments passed. if ( isset( $config['notices'] ) ) { _deprecated_argument( __FUNCTION__, '2.2.0', 'The `notices` config parameter was renamed to `has_notices` in TGMPA 2.2.0. Please adjust your configuration.' ); if ( ! isset( $config['has_notices'] ) ) { $config['has_notices'] = $config['notices']; } } if ( isset( $config['parent_menu_slug'] ) ) { _deprecated_argument( __FUNCTION__, '2.4.0', 'The `parent_menu_slug` config parameter was removed in TGMPA 2.4.0. In TGMPA 2.5.0 an alternative was (re-)introduced. Please adjust your configuration. For more information visit the website: http://tgmpluginactivation.com/configuration/#h-configuration-options.' ); } if ( isset( $config['parent_url_slug'] ) ) { _deprecated_argument( __FUNCTION__, '2.4.0', 'The `parent_url_slug` config parameter was removed in TGMPA 2.4.0. In TGMPA 2.5.0 an alternative was (re-)introduced. Please adjust your configuration. For more information visit the website: http://tgmpluginactivation.com/configuration/#h-configuration-options.' ); } call_user_func( array( $instance, 'config' ), $config ); } } } /** * WP_List_Table isn't always available. If it isn't available, * we load it here. * * @since 2.2.0 */ if ( ! class_exists( 'WP_List_Table' ) ) { require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php'; } if ( ! class_exists( 'TGMPA_List_Table' ) ) { /** * List table class for handling plugins. * * Extends the WP_List_Table class to provide a future-compatible * way of listing out all required/recommended plugins. * * Gives users an interface similar to the Plugin Administration * area with similar (albeit stripped down) capabilities. * * This class also allows for the bulk install of plugins. * * @since 2.2.0 * * @package TGM-Plugin-Activation * @author Thomas Griffin * @author Gary Jones */ class TGMPA_List_Table extends WP_List_Table { /** * TGMPA instance. * * @since 2.5.0 * * @var object */ protected $tgmpa; /** * The currently chosen view. * * @since 2.5.0 * * @var string One of: 'all', 'install', 'update', 'activate' */ public $view_context = 'all'; /** * The plugin counts for the various views. * * @since 2.5.0 * * @var array */ protected $view_totals = array( 'all' => 0, 'install' => 0, 'update' => 0, 'activate' => 0, ); /** * References parent constructor and sets defaults for class. * * @since 2.2.0 */ public function __construct() { $this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); parent::__construct( array( 'singular' => 'plugin', 'plural' => 'plugins', 'ajax' => false, ) ); if ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], array( 'install', 'update', 'activate' ), true ) ) { $this->view_context = sanitize_key( $_REQUEST['plugin_status'] ); } add_filter( 'tgmpa_table_data_items', array( $this, 'sort_table_items' ) ); } /** * Get a list of CSS classes for the tag. * * Overruled to prevent the 'plural' argument from being added. * * @since 2.5.0 * * @return array CSS classnames. */ public function get_table_classes() { return array( 'widefat', 'fixed' ); } /** * Gathers and renames all of our plugin information to be used by WP_List_Table to create our table. * * @since 2.2.0 * * @return array $table_data Information for use in table. */ protected function _gather_plugin_data() { // Load thickbox for plugin links. $this->tgmpa->admin_init(); $this->tgmpa->thickbox(); // Categorize the plugins which have open actions. $plugins = $this->categorize_plugins_to_views(); // Set the counts for the view links. $this->set_view_totals( $plugins ); // Prep variables for use and grab list of all installed plugins. $table_data = array(); $i = 0; // Redirect to the 'all' view if no plugins were found for the selected view context. if ( empty( $plugins[ $this->view_context ] ) ) { $this->view_context = 'all'; } foreach ( $plugins[ $this->view_context ] as $slug => $plugin ) { $table_data[ $i ]['sanitized_plugin'] = $plugin['name']; $table_data[ $i ]['slug'] = $slug; $table_data[ $i ]['plugin'] = '' . $this->tgmpa->get_info_link( $slug ) . ''; $table_data[ $i ]['source'] = $this->get_plugin_source_type_text( $plugin['source_type'] ); $table_data[ $i ]['type'] = $this->get_plugin_advise_type_text( $plugin['required'] ); $table_data[ $i ]['status'] = $this->get_plugin_status_text( $slug ); $table_data[ $i ]['installed_version'] = $this->tgmpa->get_installed_version( $slug ); $table_data[ $i ]['minimum_version'] = $plugin['version']; $table_data[ $i ]['available_version'] = $this->tgmpa->does_plugin_have_update( $slug ); // Prep the upgrade notice info. $upgrade_notice = $this->tgmpa->get_upgrade_notice( $slug ); if ( ! empty( $upgrade_notice ) ) { $table_data[ $i ]['upgrade_notice'] = $upgrade_notice; add_action( "tgmpa_after_plugin_row_{$slug}", array( $this, 'wp_plugin_update_row' ), 10, 2 ); } $table_data[ $i ] = apply_filters( 'tgmpa_table_data_item', $table_data[ $i ], $plugin ); $i++; } return $table_data; } /** * Categorize the plugins which have open actions into views for the TGMPA page. * * @since 2.5.0 */ protected function categorize_plugins_to_views() { $plugins = array( 'all' => array(), // Meaning: all plugins which still have open actions. 'install' => array(), 'update' => array(), 'activate' => array(), ); foreach ( $this->tgmpa->plugins as $slug => $plugin ) { if ( $this->tgmpa->is_plugin_active( $slug ) && false === $this->tgmpa->does_plugin_have_update( $slug ) ) { // No need to display plugins if they are installed, up-to-date and active. continue; } else { $plugins['all'][ $slug ] = $plugin; if ( ! $this->tgmpa->is_plugin_installed( $slug ) ) { $plugins['install'][ $slug ] = $plugin; } else { if ( false !== $this->tgmpa->does_plugin_have_update( $slug ) ) { $plugins['update'][ $slug ] = $plugin; } if ( $this->tgmpa->can_plugin_activate( $slug ) ) { $plugins['activate'][ $slug ] = $plugin; } } } } return $plugins; } /** * Set the counts for the view links. * * @since 2.5.0 * * @param array $plugins Plugins order by view. */ protected function set_view_totals( $plugins ) { foreach ( $plugins as $type => $list ) { $this->view_totals[ $type ] = count( $list ); } } /** * Get the plugin required/recommended text string. * * @since 2.5.0 * * @param string $required Plugin required setting. * @return string */ protected function get_plugin_advise_type_text( $required ) { if ( true === $required ) { return esc_html__( 'Required', 'whistle' ); } return esc_html__( 'Recommended', 'whistle' ); } /** * Get the plugin source type text string. * * @since 2.5.0 * * @param string $type Plugin type. * @return string */ protected function get_plugin_source_type_text( $type ) { $string = ''; switch ( $type ) { case 'repo': $string = esc_html__( 'WordPress Repository', 'whistle' ); break; case 'external': $string = esc_html__( 'External Source', 'whistle' ); break; case 'bundled': $string = esc_html__( 'Pre-Packaged', 'whistle' ); break; } return $string; } /** * Determine the plugin status message. * * @since 2.5.0 * * @param string $slug Plugin slug. * @return string */ protected function get_plugin_status_text( $slug ) { if ( ! $this->tgmpa->is_plugin_installed( $slug ) ) { return esc_html__( 'Not Installed', 'whistle' ); } if ( ! $this->tgmpa->is_plugin_active( $slug ) ) { $install_status = esc_html__( 'Installed But Not Activated', 'whistle' ); } else { $install_status = esc_html__( 'Active', 'whistle' ); } $update_status = ''; if ( $this->tgmpa->does_plugin_require_update( $slug ) && false === $this->tgmpa->does_plugin_have_update( $slug ) ) { $update_status = esc_html__( 'Required Update not Available', 'whistle' ); } elseif ( $this->tgmpa->does_plugin_require_update( $slug ) ) { $update_status = esc_html__( 'Requires Update', 'whistle' ); } elseif ( false !== $this->tgmpa->does_plugin_have_update( $slug ) ) { $update_status = esc_html__( 'Update recommended', 'whistle' ); } if ( '' === $update_status ) { return $install_status; } return sprintf( /* translators: 1: install status, 2: update status */ _x( '%1$s, %2$s', 'Install/Update Status', 'whistle' ), $install_status, $update_status ); } /** * Sort plugins by Required/Recommended type and by alphabetical plugin name within each type. * * @since 2.5.0 * * @param array $items Prepared table items. * @return array Sorted table items. */ public function sort_table_items( $items ) { $type = array(); $name = array(); foreach ( $items as $i => $plugin ) { $type[ $i ] = $plugin['type']; // Required / recommended. $name[ $i ] = $plugin['sanitized_plugin']; } array_multisort( $type, SORT_DESC, $name, SORT_ASC, $items ); return $items; } /** * Get an associative array ( id => link ) of the views available on this table. * * @since 2.5.0 * * @return array */ public function get_views() { $status_links = array(); foreach ( $this->view_totals as $type => $count ) { if ( $count < 1 ) { continue; } switch ( $type ) { case 'all': /* translators: 1: number of plugins. */ $text = _nx( 'All (%s)', 'All (%s)', $count, 'plugins', 'whistle' ); break; case 'install': /* translators: 1: number of plugins. */ $text = _n( 'To Install (%s)', 'To Install (%s)', $count, 'whistle' ); break; case 'update': /* translators: 1: number of plugins. */ $text = _n( 'Update Available (%s)', 'Update Available (%s)', $count, 'whistle' ); break; case 'activate': /* translators: 1: number of plugins. */ $text = _n( 'To Activate (%s)', 'To Activate (%s)', $count, 'whistle' ); break; default: $text = ''; break; } if ( ! empty( $text ) ) { $status_links[ $type ] = sprintf( '%s', esc_url( $this->tgmpa->get_tgmpa_status_url( $type ) ), ( $type === $this->view_context ) ? ' class="current"' : '', sprintf( $text, number_format_i18n( $count ) ) ); } } return $status_links; } /** * Create default columns to display important plugin information * like type, action and status. * * @since 2.2.0 * * @param array $item Array of item data. * @param string $column_name The name of the column. * @return string */ public function column_default( $item, $column_name ) { return $item[ $column_name ]; } /** * Required for bulk installing. * * Adds a checkbox for each plugin. * * @since 2.2.0 * * @param array $item Array of item data. * @return string The input checkbox with all necessary info. */ public function column_cb( $item ) { return sprintf( '', esc_attr( $this->_args['singular'] ), esc_attr( $item['slug'] ), esc_attr( $item['sanitized_plugin'] ) ); } /** * Create default title column along with the action links. * * @since 2.2.0 * * @param array $item Array of item data. * @return string The plugin name and action links. */ public function column_plugin( $item ) { return sprintf( '%1$s %2$s', $item['plugin'], $this->row_actions( $this->get_row_actions( $item ), true ) ); } /** * Create version information column. * * @since 2.5.0 * * @param array $item Array of item data. * @return string HTML-formatted version information. */ public function column_version( $item ) { $output = array(); if ( $this->tgmpa->is_plugin_installed( $item['slug'] ) ) { $installed = ! empty( $item['installed_version'] ) ? $item['installed_version'] : _x( 'unknown', 'as in: "version nr unknown"', 'whistle' ); $color = ''; if ( ! empty( $item['minimum_version'] ) && $this->tgmpa->does_plugin_require_update( $item['slug'] ) ) { $color = ' color: #ff0000; font-weight: bold;'; } $output[] = sprintf( '

%2$s' . esc_html__( 'Installed version:', 'whistle' ) . '

', $color, $installed ); } if ( ! empty( $item['minimum_version'] ) ) { $output[] = sprintf( '

%1$s' . esc_html__( 'Minimum required version:', 'whistle' ) . '

', $item['minimum_version'] ); } if ( ! empty( $item['available_version'] ) ) { $color = ''; if ( ! empty( $item['minimum_version'] ) && version_compare( $item['available_version'], $item['minimum_version'], '>=' ) ) { $color = ' color: #71C671; font-weight: bold;'; } $output[] = sprintf( '

%2$s' . esc_html__( 'Available version:', 'whistle' ) . '

', $color, $item['available_version'] ); } if ( empty( $output ) ) { return ' '; // Let's not break the table layout. } else { return implode( "\n", $output ); } } /** * Sets default message within the plugins table if no plugins * are left for interaction. * * Hides the menu item to prevent the user from clicking and * getting a permissions error. * * @since 2.2.0 */ public function no_items() { echo esc_html__( 'No plugins to install, update or activate.', 'whistle' ) . ' ' . esc_html__( 'Return to the Dashboard', 'whistle' ) . ''; echo ''; } /** * Output all the column information within the table. * * @since 2.2.0 * * @return array $columns The column names. */ public function get_columns() { $columns = array( 'cb' => '', 'plugin' => esc_html__( 'Plugin', 'whistle' ), 'source' => esc_html__( 'Source', 'whistle' ), 'type' => esc_html__( 'Type', 'whistle' ), ); if ( 'all' === $this->view_context || 'update' === $this->view_context ) { $columns['version'] = esc_html__( 'Version', 'whistle' ); $columns['status'] = esc_html__( 'Status', 'whistle' ); } return apply_filters( 'tgmpa_table_columns', $columns ); } /** * Get name of default primary column * * @since 2.5.0 / WP 4.3+ compatibility * @access protected * * @return string */ protected function get_default_primary_column_name() { return 'plugin'; } /** * Get the name of the primary column. * * @since 2.5.0 / WP 4.3+ compatibility * @access protected * * @return string The name of the primary column. */ protected function get_primary_column_name() { if ( method_exists( 'WP_List_Table', 'get_primary_column_name' ) ) { return parent::get_primary_column_name(); } else { return $this->get_default_primary_column_name(); } } /** * Get the actions which are relevant for a specific plugin row. * * @since 2.5.0 * * @param array $item Array of item data. * @return array Array with relevant action links. */ protected function get_row_actions( $item ) { $actions = array(); $action_links = array(); // Display the 'Install' action link if the plugin is not yet available. if ( ! $this->tgmpa->is_plugin_installed( $item['slug'] ) ) { /* translators: %2$s: plugin name in screen reader markup */ $actions['install'] = esc_html__( 'Install %2$s', 'whistle' ); } else { // Display the 'Update' action link if an update is available and WP complies with plugin minimum. if ( false !== $this->tgmpa->does_plugin_have_update( $item['slug'] ) && $this->tgmpa->can_plugin_update( $item['slug'] ) ) { /* translators: %2$s: plugin name in screen reader markup */ $actions['update'] = esc_html__( 'Update %2$s', 'whistle' ); } // Display the 'Activate' action link, but only if the plugin meets the minimum version. if ( $this->tgmpa->can_plugin_activate( $item['slug'] ) ) { /* translators: %2$s: plugin name in screen reader markup */ $actions['activate'] = esc_html__( 'Activate %2$s', 'whistle' ); } } // Create the actual links. foreach ( $actions as $action => $text ) { $nonce_url = wp_nonce_url( add_query_arg( array( 'plugin' => urlencode( $item['slug'] ), 'tgmpa-' . $action => $action . '-plugin', ), $this->tgmpa->get_tgmpa_url() ), 'tgmpa-' . $action, 'tgmpa-nonce' ); $action_links[ $action ] = sprintf( '' . esc_html( $text ) . '', // $text contains the second placeholder. esc_url( $nonce_url ), '' . esc_html( $item['sanitized_plugin'] ) . '' ); } $prefix = ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN ) ? 'network_admin_' : ''; return apply_filters( "tgmpa_{$prefix}plugin_action_links", array_filter( $action_links ), $item['slug'], $item, $this->view_context ); } /** * Generates content for a single row of the table. * * @since 2.5.0 * * @param object $item The current item. */ public function single_row( $item ) { parent::single_row( $item ); /** * Fires after each specific row in the TGMPA Plugins list table. * * The dynamic portion of the hook name, `$item['slug']`, refers to the slug * for the plugin. * * @since 2.5.0 */ do_action( "tgmpa_after_plugin_row_{$item['slug']}", $item['slug'], $item, $this->view_context ); } /** * Show the upgrade notice below a plugin row if there is one. * * @since 2.5.0 * * @see /wp-admin/includes/update.php * * @param string $slug Plugin slug. * @param array $item The information available in this table row. * @return null Return early if upgrade notice is empty. */ public function wp_plugin_update_row( $slug, $item ) { if ( empty( $item['upgrade_notice'] ) ) { return; } echo ' '; } /** * Extra controls to be displayed between bulk actions and pagination. * * @since 2.5.0 * * @param string $which 'top' or 'bottom' table navigation. */ public function extra_tablenav( $which ) { if ( 'bottom' === $which ) { $this->tgmpa->show_tgmpa_version(); } } /** * Defines the bulk actions for handling registered plugins. * * @since 2.2.0 * * @return array $actions The bulk actions for the plugin install table. */ public function get_bulk_actions() { $actions = array(); if ( 'update' !== $this->view_context && 'activate' !== $this->view_context ) { if ( current_user_can( 'install_plugins' ) ) { $actions['tgmpa-bulk-install'] = esc_html__( 'Install', 'whistle' ); } } if ( 'install' !== $this->view_context ) { if ( current_user_can( 'update_plugins' ) ) { $actions['tgmpa-bulk-update'] = esc_html__( 'Update', 'whistle' ); } if ( current_user_can( 'activate_plugins' ) ) { $actions['tgmpa-bulk-activate'] = esc_html__( 'Activate', 'whistle' ); } } return $actions; } /** * Processes bulk installation and activation actions. * * The bulk installation process looks for the $_POST information and passes that * through if a user has to use WP_Filesystem to enter their credentials. * * @since 2.2.0 */ public function process_bulk_actions() { // Bulk installation process. if ( 'tgmpa-bulk-install' === $this->current_action() || 'tgmpa-bulk-update' === $this->current_action() ) { check_admin_referer( 'bulk-' . $this->_args['plural'] ); $install_type = 'install'; if ( 'tgmpa-bulk-update' === $this->current_action() ) { $install_type = 'update'; } $plugins_to_install = array(); // Did user actually select any plugins to install/update ? if ( empty( $_POST['plugin'] ) ) { if ( 'install' === $install_type ) { $message = esc_html__( 'No plugins were selected to be installed. No action taken.', 'whistle' ); } else { $message = esc_html__( 'No plugins were selected to be updated. No action taken.', 'whistle' ); } echo '

', esc_html( $message ), '

'; return false; } if ( is_array( $_POST['plugin'] ) ) { $plugins_to_install = (array) $_POST['plugin']; } elseif ( is_string( $_POST['plugin'] ) ) { // Received via Filesystem page - un-flatten array (WP bug #19643). $plugins_to_install = explode( ',', $_POST['plugin'] ); } // Sanitize the received input. $plugins_to_install = array_map( 'urldecode', $plugins_to_install ); $plugins_to_install = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins_to_install ); // Validate the received input. foreach ( $plugins_to_install as $key => $slug ) { // Check if the plugin was registered with TGMPA and remove if not. if ( ! isset( $this->tgmpa->plugins[ $slug ] ) ) { unset( $plugins_to_install[ $key ] ); continue; } // For install: make sure this is a plugin we *can* install and not one already installed. if ( 'install' === $install_type && true === $this->tgmpa->is_plugin_installed( $slug ) ) { unset( $plugins_to_install[ $key ] ); } // For updates: make sure this is a plugin we *can* update (update available and WP version ok). if ( 'update' === $install_type && false === $this->tgmpa->is_plugin_updatetable( $slug ) ) { unset( $plugins_to_install[ $key ] ); } } // No need to proceed further if we have no plugins to handle. if ( empty( $plugins_to_install ) ) { if ( 'install' === $install_type ) { $message = esc_html__( 'No plugins are available to be installed at this time.', 'whistle' ); } else { $message = esc_html__( 'No plugins are available to be updated at this time.', 'whistle' ); } echo '

', esc_html( $message ), '

'; return false; } // Pass all necessary information if WP_Filesystem is needed. $url = wp_nonce_url( $this->tgmpa->get_tgmpa_url(), 'bulk-' . $this->_args['plural'] ); // Give validated data back to $_POST which is the only place the filesystem looks for extra fields. $_POST['plugin'] = implode( ',', $plugins_to_install ); // Work around for WP bug #19643. $method = ''; // Leave blank so WP_Filesystem can populate it as necessary. $fields = array_keys( $_POST ); // Extra fields to pass to WP_Filesystem. if ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, $fields ) ) ) { return true; // Stop the normal page form from displaying, credential request form will be shown. } // Now we have some credentials, setup WP_Filesystem. if ( ! WP_Filesystem( $creds ) ) { // Our credentials were no good, ask the user for them again. request_filesystem_credentials( esc_url_raw( $url ), $method, true, false, $fields ); return true; } /* If we arrive here, we have the filesystem */ // Store all information in arrays since we are processing a bulk installation. $names = array(); $sources = array(); // Needed for installs. $file_paths = array(); // Needed for upgrades. $to_inject = array(); // Information to inject into the update_plugins transient. // Prepare the data for validated plugins for the install/upgrade. foreach ( $plugins_to_install as $slug ) { $name = $this->tgmpa->plugins[ $slug ]['name']; $source = $this->tgmpa->get_download_url( $slug ); if ( ! empty( $name ) && ! empty( $source ) ) { $names[] = $name; switch ( $install_type ) { case 'install': $sources[] = $source; break; case 'update': $file_paths[] = $this->tgmpa->plugins[ $slug ]['file_path']; $to_inject[ $slug ] = $this->tgmpa->plugins[ $slug ]; $to_inject[ $slug ]['source'] = $source; break; } } } unset( $slug, $name, $source ); // Create a new instance of TGMPA_Bulk_Installer. $installer = new TGMPA_Bulk_Installer( new TGMPA_Bulk_Installer_Skin( array( 'url' => esc_url_raw( $this->tgmpa->get_tgmpa_url() ), 'nonce' => 'bulk-' . $this->_args['plural'], 'names' => $names, 'install_type' => $install_type, ) ) ); // Wrap the install process with the appropriate HTML. echo '
', '

', esc_html( get_admin_page_title() ), '

'; // Process the bulk installation submissions. add_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1, 3 ); if ( 'tgmpa-bulk-update' === $this->current_action() ) { // Inject our info into the update transient. $this->tgmpa->inject_update_info( $to_inject ); $installer->bulk_upgrade( $file_paths ); } else { $installer->bulk_install( $sources ); } remove_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1 ); echo '
'; return true; } // Bulk activation process. if ( 'tgmpa-bulk-activate' === $this->current_action() ) { check_admin_referer( 'bulk-' . $this->_args['plural'] ); // Did user actually select any plugins to activate ? if ( empty( $_POST['plugin'] ) ) { echo '

', esc_html__( 'No plugins were selected to be activated. No action taken.', 'whistle' ), '

'; return false; } // Grab plugin data from $_POST. $plugins = array(); if ( isset( $_POST['plugin'] ) ) { $plugins = array_map( 'urldecode', (array) $_POST['plugin'] ); $plugins = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins ); } $plugins_to_activate = array(); $plugin_names = array(); // Grab the file paths for the selected & inactive plugins from the registration array. foreach ( $plugins as $slug ) { if ( $this->tgmpa->can_plugin_activate( $slug ) ) { $plugins_to_activate[] = $this->tgmpa->plugins[ $slug ]['file_path']; $plugin_names[] = $this->tgmpa->plugins[ $slug ]['name']; } } unset( $slug ); // Return early if there are no plugins to activate. if ( empty( $plugins_to_activate ) ) { echo '

', esc_html__( 'No plugins are available to be activated at this time.', 'whistle' ), '

'; return false; } // Now we are good to go - let's start activating plugins. $activate = activate_plugins( $plugins_to_activate ); if ( is_wp_error( $activate ) ) { echo '

', wp_kses_post( $activate->get_error_message() ), '

'; } else { $count = count( $plugin_names ); // Count so we can use _n function. $plugin_names = array_map( array( 'TGMPA_Utils', 'wrap_in_strong' ), $plugin_names ); $last_plugin = array_pop( $plugin_names ); // Pop off last name to prep for readability. $imploded = empty( $plugin_names ) ? $last_plugin : ( implode( ', ', $plugin_names ) . ' ' . esc_html_x( 'and', 'plugin A *and* plugin B', 'whistle' ) . ' ' . $last_plugin ); printf( // WPCS: xss ok. '

%1$s %2$s.

', esc_html( _n( 'The following plugin was activated successfully:', 'The following plugins were activated successfully:', $count, 'whistle' ) ), $imploded ); // Update recently activated plugins option. $recent = (array) get_option( 'recently_activated' ); foreach ( $plugins_to_activate as $plugin => $time ) { if ( isset( $recent[ $plugin ] ) ) { unset( $recent[ $plugin ] ); } } update_option( 'recently_activated', $recent ); } unset( $_POST ); // Reset the $_POST variable in case user wants to perform one action after another. return true; } return false; } /** * Prepares all of our information to be outputted into a usable table. * * @since 2.2.0 */ public function prepare_items() { $columns = $this->get_columns(); // Get all necessary column information. $hidden = array(); // No columns to hide, but we must set as an array. $sortable = array(); // No reason to make sortable columns. $primary = $this->get_primary_column_name(); // Column which has the row actions. $this->_column_headers = array( $columns, $hidden, $sortable, $primary ); // Get all necessary column headers. // Process our bulk activations here. if ( 'tgmpa-bulk-activate' === $this->current_action() ) { $this->process_bulk_actions(); } // Store all of our plugin data into $items array so WP_List_Table can use it. $this->items = apply_filters( 'tgmpa_table_data_items', $this->_gather_plugin_data() ); } /* *********** DEPRECATED METHODS *********** */ /** * Retrieve plugin data, given the plugin name. * * @since 2.2.0 * @deprecated 2.5.0 use {@see TGM_Plugin_Activation::_get_plugin_data_from_name()} instead. * @see TGM_Plugin_Activation::_get_plugin_data_from_name() * * @param string $name Name of the plugin, as it was registered. * @param string $data Optional. Array key of plugin data to return. Default is slug. * @return string|boolean Plugin slug if found, false otherwise. */ protected function _get_plugin_data_from_name( $name, $data = 'slug' ) { _deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'TGM_Plugin_Activation::_get_plugin_data_from_name()' ); return $this->tgmpa->_get_plugin_data_from_name( $name, $data ); } } } if ( ! class_exists( 'TGM_Bulk_Installer' ) ) { /** * Hack: Prevent TGMPA v2.4.1- bulk installer class from being loaded if 2.4.1- is loaded after 2.5+. * * @since 2.5.2 * * {@internal The TGMPA_Bulk_Installer class was originally called TGM_Bulk_Installer. * For more information, see that class.}} */ class TGM_Bulk_Installer { } } if ( ! class_exists( 'TGM_Bulk_Installer_Skin' ) ) { /** * Hack: Prevent TGMPA v2.4.1- bulk installer skin class from being loaded if 2.4.1- is loaded after 2.5+. * * @since 2.5.2 * * {@internal The TGMPA_Bulk_Installer_Skin class was originally called TGM_Bulk_Installer_Skin. * For more information, see that class.}} */ class TGM_Bulk_Installer_Skin { } } /** * The WP_Upgrader file isn't always available. If it isn't available, * we load it here. * * We check to make sure no action or activation keys are set so that WordPress * does not try to re-include the class when processing upgrades or installs outside * of the class. * * @since 2.2.0 */ add_action( 'admin_init', 'tgmpa_load_bulk_installer' ); if ( ! function_exists( 'tgmpa_load_bulk_installer' ) ) { /** * Load bulk installer */ function tgmpa_load_bulk_installer() { // Silently fail if 2.5+ is loaded *after* an older version. if ( ! isset( $GLOBALS['tgmpa'] ) ) { return; } // Get TGMPA class instance. $tgmpa_instance = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); if ( isset( $_GET['page'] ) && $tgmpa_instance->menu === $_GET['page'] ) { if ( ! class_exists( 'Plugin_Upgrader', false ) ) { require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; } if ( ! class_exists( 'TGMPA_Bulk_Installer' ) ) { /** * Installer class to handle bulk plugin installations. * * Extends WP_Upgrader and customizes to suit the installation of multiple * plugins. * * @since 2.2.0 * * {@internal Since 2.5.0 the class is an extension of Plugin_Upgrader rather than WP_Upgrader.}} * {@internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer to TGMPA_Bulk_Installer. * This was done to prevent backward compatibility issues with v2.3.6.}} * * @package TGM-Plugin-Activation * @author Thomas Griffin * @author Gary Jones */ class TGMPA_Bulk_Installer extends Plugin_Upgrader { /** * Holds result of bulk plugin installation. * * @since 2.2.0 * * @var string */ public $result; /** * Flag to check if bulk installation is occurring or not. * * @since 2.2.0 * * @var boolean */ public $bulk = false; /** * TGMPA instance * * @since 2.5.0 * * @var object */ protected $tgmpa; /** * Whether or not the destination directory needs to be cleared ( = on update). * * @since 2.5.0 * * @var bool */ protected $clear_destination = false; /** * References parent constructor and sets defaults for class. * * @since 2.2.0 * * @param \Bulk_Upgrader_Skin|null $skin Installer skin. */ public function __construct( $skin = null ) { // Get TGMPA class instance. $this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); parent::__construct( $skin ); if ( isset( $this->skin->options['install_type'] ) && 'update' === $this->skin->options['install_type'] ) { $this->clear_destination = true; } if ( $this->tgmpa->is_automatic ) { $this->activate_strings(); } add_action( 'upgrader_process_complete', array( $this->tgmpa, 'populate_file_path' ) ); } /** * Sets the correct activation strings for the installer skin to use. * * @since 2.2.0 */ public function activate_strings() { $this->strings['activation_failed'] = esc_html__( 'Plugin activation failed.', 'whistle' ); $this->strings['activation_success'] = esc_html__( 'Plugin activated successfully.', 'whistle' ); } /** * Performs the actual installation of each plugin. * * @since 2.2.0 * * @see WP_Upgrader::run() * * @param array $options The installation config options. * @return null|array Return early if error, array of installation data on success. */ public function run( $options ) { $result = parent::run( $options ); // Reset the strings in case we changed one during automatic activation. if ( $this->tgmpa->is_automatic ) { if ( 'update' === $this->skin->options['install_type'] ) { $this->upgrade_strings(); } else { $this->install_strings(); } } return $result; } /** * Processes the bulk installation of plugins. * * @since 2.2.0 * * {@internal This is basically a near identical copy of the WP Core * Plugin_Upgrader::bulk_upgrade() method, with minor adjustments to deal with * new installs instead of upgrades. * For ease of future synchronizations, the adjustments are clearly commented, but no other * comments are added. Code style has been made to comply.}} * * @see Plugin_Upgrader::bulk_upgrade() * @see https://core.trac.wordpress.org/browser/tags/4.2.1/src/wp-admin/includes/class-wp-upgrader.php#L838 * (@internal Last synced: Dec 31st 2015 against https://core.trac.wordpress.org/browser/trunk?rev=36134}} * * @param array $plugins The plugin sources needed for installation. * @param array $args Arbitrary passed extra arguments. * @return array|false Install confirmation messages on success, false on failure. */ public function bulk_install( $plugins, $args = array() ) { // [TGMPA + ] Hook auto-activation in. add_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 ); $defaults = array( 'clear_update_cache' => true, ); $parsed_args = wp_parse_args( $args, $defaults ); $this->init(); $this->bulk = true; $this->install_strings(); // [TGMPA + ] adjusted. /* [TGMPA - ] $current = get_site_transient( 'update_plugins' ); */ /* [TGMPA - ] add_filter('upgrader_clear_destination', array($this, 'delete_old_plugin'), 10, 4); */ $this->skin->header(); // Connect to the Filesystem first. $res = $this->fs_connect( array( WP_CONTENT_DIR, WP_PLUGIN_DIR ) ); if ( ! $res ) { $this->skin->footer(); return false; } $this->skin->bulk_header(); /* * Only start maintenance mode if: * - running Multisite and there are one or more plugins specified, OR * - a plugin with an update available is currently active. * @TODO: For multisite, maintenance mode should only kick in for individual sites if at all possible. */ $maintenance = ( is_multisite() && ! empty( $plugins ) ); /* [TGMPA - ] foreach ( $plugins as $plugin ) $maintenance = $maintenance || ( is_plugin_active( $plugin ) && isset( $current->response[ $plugin] ) ); */ if ( $maintenance ) { $this->maintenance_mode( true ); } $results = array(); $this->update_count = count( $plugins ); $this->update_current = 0; foreach ( $plugins as $plugin ) { $this->update_current++; /* [TGMPA - ] $this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true); if ( !isset( $current->response[ $plugin ] ) ) { $this->skin->set_result('up_to_date'); $this->skin->before(); $this->skin->feedback('up_to_date'); $this->skin->after(); $results[$plugin] = true; continue; } // Get the URL to the zip file. $r = $current->response[ $plugin ]; $this->skin->plugin_active = is_plugin_active($plugin); */ $result = $this->run( array( 'package' => $plugin, // [TGMPA + ] adjusted. 'destination' => WP_PLUGIN_DIR, 'clear_destination' => false, // [TGMPA + ] adjusted. 'clear_working' => true, 'is_multi' => true, 'hook_extra' => array( 'plugin' => $plugin, ), ) ); $results[ $plugin ] = $this->result; // Prevent credentials auth screen from displaying multiple times. if ( false === $result ) { break; } } //end foreach $plugins $this->maintenance_mode( false ); /** * Fires when the bulk upgrader process is complete. * * @since WP 3.6.0 / TGMPA 2.5.0 * * @param Plugin_Upgrader $this Plugin_Upgrader instance. In other contexts, $this, might * be a Theme_Upgrader or Core_Upgrade instance. * @param array $data { * Array of bulk item update data. * * @type string $action Type of action. Default 'update'. * @type string $type Type of update process. Accepts 'plugin', 'theme', or 'core'. * @type bool $bulk Whether the update process is a bulk update. Default true. * @type array $packages Array of plugin, theme, or core packages to update. * } */ do_action( 'upgrader_process_complete', $this, array( 'action' => 'install', // [TGMPA + ] adjusted. 'type' => 'plugin', 'bulk' => true, 'plugins' => $plugins, ) ); $this->skin->bulk_footer(); $this->skin->footer(); // Cleanup our hooks, in case something else does a upgrade on this connection. /* [TGMPA - ] remove_filter('upgrader_clear_destination', array($this, 'delete_old_plugin')); */ // [TGMPA + ] Remove our auto-activation hook. remove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 ); // Force refresh of plugin update information. wp_clean_plugins_cache( $parsed_args['clear_update_cache'] ); return $results; } /** * Handle a bulk upgrade request. * * @since 2.5.0 * * @see Plugin_Upgrader::bulk_upgrade() * * @param array $plugins The local WP file_path's of the plugins which should be upgraded. * @param array $args Arbitrary passed extra arguments. * @return string|bool Install confirmation messages on success, false on failure. */ public function bulk_upgrade( $plugins, $args = array() ) { add_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 ); $result = parent::bulk_upgrade( $plugins, $args ); remove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 ); return $result; } /** * Abuse a filter to auto-activate plugins after installation. * * Hooked into the 'upgrader_post_install' filter hook. * * @since 2.5.0 * * @param bool $bool The value we need to give back (true). * @return bool */ public function auto_activate( $bool ) { // Only process the activation of installed plugins if the automatic flag is set to true. if ( $this->tgmpa->is_automatic ) { // Flush plugins cache so the headers of the newly installed plugins will be read correctly. wp_clean_plugins_cache(); // Get the installed plugin file. $plugin_info = $this->plugin_info(); // Don't try to activate on upgrade of active plugin as WP will do this already. if ( ! is_plugin_active( $plugin_info ) ) { $activate = activate_plugin( $plugin_info ); // Adjust the success string based on the activation result. $this->strings['process_success'] = $this->strings['process_success'] . "
\n"; if ( is_wp_error( $activate ) ) { $this->skin->error( $activate ); $this->strings['process_success'] .= $this->strings['activation_failed']; } else { $this->strings['process_success'] .= $this->strings['activation_success']; } } } return $bool; } } } if ( ! class_exists( 'TGMPA_Bulk_Installer_Skin' ) ) { /** * Installer skin to set strings for the bulk plugin installations.. * * Extends Bulk_Upgrader_Skin and customizes to suit the installation of multiple * plugins. * * @since 2.2.0 * * {@internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer_Skin to * TGMPA_Bulk_Installer_Skin. * This was done to prevent backward compatibility issues with v2.3.6.}} * * @see https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/class-wp-upgrader-skins.php * * @package TGM-Plugin-Activation * @author Thomas Griffin * @author Gary Jones */ class TGMPA_Bulk_Installer_Skin extends Bulk_Upgrader_Skin { /** * Holds plugin info for each individual plugin installation. * * @since 2.2.0 * * @var array */ public $plugin_info = array(); /** * Holds names of plugins that are undergoing bulk installations. * * @since 2.2.0 * * @var array */ public $plugin_names = array(); /** * Integer to use for iteration through each plugin installation. * * @since 2.2.0 * * @var integer */ public $i = 0; /** * TGMPA instance * * @since 2.5.0 * * @var object */ protected $tgmpa; /** * Constructor. Parses default args with new ones and extracts them for use. * * @since 2.2.0 * * @param array $args Arguments to pass for use within the class. */ public function __construct( $args = array() ) { // Get TGMPA class instance. $this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) ); // Parse default and new args. $defaults = array( 'url' => '', 'nonce' => '', 'names' => array(), 'install_type' => 'install', ); $args = wp_parse_args( $args, $defaults ); // Set plugin names to $this->plugin_names property. $this->plugin_names = $args['names']; // Extract the new args. parent::__construct( $args ); } /** * Sets install skin strings for each individual plugin. * * Checks to see if the automatic activation flag is set and uses the * the proper strings accordingly. * * @since 2.2.0 */ public function add_strings() { if ( 'update' === $this->options['install_type'] ) { parent::add_strings(); /* translators: 1: plugin name, 2: action number 3: total number of actions. */ $this->upgrader->strings['skin_before_update_header'] = esc_html__( 'Updating Plugin %1$s (%2$d/%3$d)', 'whistle' ); } else { /* translators: 1: plugin name, 2: error message. */ $this->upgrader->strings['skin_update_failed_error'] = esc_html__( 'An error occurred while installing %1$s: %2$s.', 'whistle' ); /* translators: 1: plugin name. */ $this->upgrader->strings['skin_update_failed'] = esc_html__( 'The installation of %1$s failed.', 'whistle' ); if ( $this->tgmpa->is_automatic ) { // Automatic activation strings. $this->upgrader->strings['skin_upgrade_start'] = esc_html__( 'The installation and activation process is starting. This process may take a while on some hosts, so please be patient.', 'whistle' ); /* translators: 1: plugin name. */ $this->upgrader->strings['skin_update_successful'] = esc_html__( '%1$s installed and activated successfully.', 'whistle' ); $this->upgrader->strings['skin_upgrade_end'] = esc_html__( 'All installations and activations have been completed.', 'whistle' ); /* translators: 1: plugin name, 2: action number 3: total number of actions. */ $this->upgrader->strings['skin_before_update_header'] = esc_html__( 'Installing and Activating Plugin %1$s (%2$d/%3$d)', 'whistle' ); } else { // Default installation strings. $this->upgrader->strings['skin_upgrade_start'] = esc_html__( 'The installation process is starting. This process may take a while on some hosts, so please be patient.', 'whistle' ); /* translators: 1: plugin name. */ $this->upgrader->strings['skin_update_successful'] = esc_html__( '%1$s installed successfully.', 'whistle' ); $this->upgrader->strings['skin_upgrade_end'] = esc_html__( 'All installations have been completed.', 'whistle' ); /* translators: 1: plugin name, 2: action number 3: total number of actions. */ $this->upgrader->strings['skin_before_update_header'] = esc_html__( 'Installing Plugin %1$s (%2$d/%3$d)', 'whistle' ); } } } /** * Outputs the header strings and necessary JS before each plugin installation. * * @since 2.2.0 * * @param string $title Unused in this implementation. */ public function before( $title = '' ) { if ( empty( $title ) ) { $title = esc_html( $this->plugin_names[ $this->i ] ); } parent::before( $title ); } /** * Outputs the footer strings and necessary JS after each plugin installation. * * Checks for any errors and outputs them if they exist, else output * success strings. * * @since 2.2.0 * * @param string $title Unused in this implementation. */ public function after( $title = '' ) { if ( empty( $title ) ) { $title = esc_html( $this->plugin_names[ $this->i ] ); } parent::after( $title ); $this->i++; } /** * Outputs links after bulk plugin installation is complete. * * @since 2.2.0 */ public function bulk_footer() { // Serve up the string to say installations (and possibly activations) are complete. parent::bulk_footer(); // Flush plugins cache so we can make sure that the installed plugins list is always up to date. wp_clean_plugins_cache(); $this->tgmpa->show_tgmpa_version(); // Display message based on if all plugins are now active or not. $update_actions = array(); if ( $this->tgmpa->is_tgmpa_complete() ) { // All plugins are active, so we display the complete string and hide the menu to protect users. echo ''; $update_actions['dashboard'] = sprintf( esc_html( $this->tgmpa->strings['complete'] ), '' . esc_html__( 'Return to the Dashboard', 'whistle' ) . '' ); } else { $update_actions['tgmpa_page'] = '' . esc_html( $this->tgmpa->strings['return'] ) . ''; } /** * Filter the list of action links available following bulk plugin installs/updates. * * @since 2.5.0 * * @param array $update_actions Array of plugin action links. * @param array $plugin_info Array of information for the last-handled plugin. */ $update_actions = apply_filters( 'tgmpa_update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info ); if ( ! empty( $update_actions ) ) { $this->feedback( implode( ' | ', (array) $update_actions ) ); } } /* *********** DEPRECATED METHODS *********** */ /** * Flush header output buffer. * * @since 2.2.0 * @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead * @see Bulk_Upgrader_Skin::flush_output() */ public function before_flush_output() { _deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' ); $this->flush_output(); } /** * Flush footer output buffer and iterate $this->i to make sure the * installation strings reference the correct plugin. * * @since 2.2.0 * @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead * @see Bulk_Upgrader_Skin::flush_output() */ public function after_flush_output() { _deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' ); $this->flush_output(); $this->i++; } } } } } } if ( ! class_exists( 'TGMPA_Utils' ) ) { /** * Generic utilities for TGMPA. * * All methods are static, poor-dev name-spacing class wrapper. * * Class was called TGM_Utils in 2.5.0 but renamed TGMPA_Utils in 2.5.1 as this was conflicting with Soliloquy. * * @since 2.5.0 * * @package TGM-Plugin-Activation * @author Juliette Reinders Folmer */ class TGMPA_Utils { /** * Whether the PHP filter extension is enabled. * * @see http://php.net/book.filter * * @since 2.5.0 * * @static * * @var bool $has_filters True is the extension is enabled. */ public static $has_filters; /** * Wrap an arbitrary string in tags. Meant to be used in combination with array_map(). * * @since 2.5.0 * * @static * * @param string $string Text to be wrapped. * @return string */ public static function wrap_in_em( $string ) { return '' . wp_kses_post( $string ) . ''; } /** * Wrap an arbitrary string in tags. Meant to be used in combination with array_map(). * * @since 2.5.0 * * @static * * @param string $string Text to be wrapped. * @return string */ public static function wrap_in_strong( $string ) { return '' . wp_kses_post( $string ) . ''; } /** * Helper function: Validate a value as boolean * * @since 2.5.0 * * @static * * @param mixed $value Arbitrary value. * @return bool */ public static function validate_bool( $value ) { if ( ! isset( self::$has_filters ) ) { self::$has_filters = extension_loaded( 'filter' ); } if ( self::$has_filters ) { return filter_var( $value, FILTER_VALIDATE_BOOLEAN ); } else { return self::emulate_filter_bool( $value ); } } /** * Helper function: Cast a value to bool * * @since 2.5.0 * * @static * * @param mixed $value Value to cast. * @return bool */ protected static function emulate_filter_bool( $value ) { // @codingStandardsIgnoreStart static $true = array( '1', 'true', 'True', 'TRUE', 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', ); static $false = array( '0', 'false', 'False', 'FALSE', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF', ); // @codingStandardsIgnoreEnd if ( is_bool( $value ) ) { return $value; } elseif ( is_int( $value ) && ( 0 === $value || 1 === $value ) ) { return (bool) $value; } elseif ( ( is_float( $value ) && ! is_nan( $value ) ) && ( (float) 0 === $value || (float) 1 === $value ) ) { return (bool) $value; } elseif ( is_string( $value ) ) { $value = trim( $value ); if ( in_array( $value, $true, true ) ) { return true; } elseif ( in_array( $value, $false, true ) ) { return false; } else { return false; } } return false; } } // End of class TGMPA_Utils } // End of class_exists wrapper PK!I:. . register-storelocator.phpnu[ 'custom', 'name' => esc_html__('Custom template', 'whistle' ), 'path' => WHISTLE_THEME_DIR . '/' . 'wpsl-templates/custom.php', ); return $templates; } add_filter( 'wpsl_listing_template', 'whistle_custom_listing_template' ); function whistle_custom_listing_template() { global $wpsl_settings; $listing_template = '
  • ' . "\r\n"; $listing_template .= "\t\t" . '
    ' . "\r\n"; $listing_template .= "\t\t\t" . '

    <%= thumb %>' . "\r\n"; $listing_template .= "\t\t\t\t" . wpsl_store_header_template( 'listing' ) . "\r\n"; $listing_template .= "\t\t\t\t" . '<%= address %>' . "\r\n"; $listing_template .= "\t\t\t\t" . '<% if ( address2 ) { %>' . "\r\n"; $listing_template .= "\t\t\t\t" . '<%= address2 %>' . "\r\n"; $listing_template .= "\t\t\t\t" . '<% } %>' . "\r\n"; $listing_template .= "\t\t\t\t" . '' . wpsl_address_format_placeholders() . '' . "\r\n"; $listing_template .= "\t\t\t\t" . '<%= country %>' . "\r\n"; $listing_template .= "\t\t\t" . '

    ' . "\r\n"; $listing_template .= "\t\t" . '
    ' . "\r\n"; if ( !$wpsl_settings['hide_distance'] ) { $listing_template .= "\t\t" . '

    <%= distance %> ' . esc_html( $wpsl_settings['distance_unit'] ) . '

    ' . "\r\n"; } $appointment_pageurl = whistle_get_page_permalink_by_its_template('tpl-reservation.php'); if($appointment_pageurl != '' && $appointment_pageurl != '#' && class_exists('DTCorePlugin')) { $listing_template .= "\t\t\t" . '' . esc_html__( 'Fix an Appointment', 'whistle' ) . '' . "\r\n"; } $listing_template .= "\t\t" . '<%= createDirectionUrl() %>' . "\r\n"; $listing_template .= "\t" . '
  • ' . "\r\n"; return $listing_template; } add_filter( 'wpsl_thumb_size', 'whistle_wpsl_custom_thumb_size' ); function whistle_wpsl_custom_thumb_size() { $size = array( 90, 90 ); return $size; } ?>PK!1loops/content-archive.phpnu[
    'column dt-sc-one-column blog-fullwidth', '2' => 'column dt-sc-one-half', '3' => 'column dt-sc-one-third' ); $page_layout = cs_get_option( 'post-archives-page-layout' ); $page_layout = !empty( $page_layout ) ? $page_layout : "content-full-width"; $layout = whistle_page_layout( $page_layout ); extract( $layout ); switch($post_layout): case 'one-column': $post_layout_arr[] = 1; break; case 'one-half-column': $post_layout_arr[] = 2; break; case 'one-third-column': $post_layout_arr[] = 3; break; default: $post_layout_arr = explode('-', $post_layout); endswitch; if( have_posts() ): $i = 1; $gs_class = ( count( $post_layout_arr ) > 1 ) ? $post_layout_arr[1] : $post_layout_arr[0]; echo "
    "; echo "
    "; $obj = new whistle_post_functions; $meta = $obj->whistle_post_meta_fields(false); while( have_posts() ): the_post(); $temp_class = ""; $post_ID = get_the_ID(); $post_layout = current($post_layout_arr); $meta[10]= $post_layout; if($i == 1) $temp_class = $post_class[$post_layout]." first"; else $temp_class = $post_class[$post_layout]; if($i == $post_layout) $i = 1; else $i = $i + 1; $post_meta = get_post_meta($post_ID ,'_dt_post_settings',TRUE); $post_meta = is_array($post_meta) ? $post_meta : array(); $format = !empty( $post_meta['post-format-type'] ) ? $post_meta['post-format-type'] : 'standard'; ?>
    >whistle_post_date_left_style( $post_ID, $meta ); break; case 'entry-date-author-left': $obj->whistle_post_date_author_left_style( $post_ID, $meta ); break; case 'entry-date-left outer-frame-border': $obj->whistle_post_date_left_framed_border_style( $post_ID, $meta ); break; case 'blog-modern-style': $obj->whistle_post_modern_style( $post_ID, $meta ); break; case 'bordered': $obj->whistle_post_bordered_style( $post_ID, $meta ); break; case 'classic': $obj->whistle_post_classic_style( $post_ID, $meta ); break; case 'entry-overlay-style': $obj->whistle_post_overlay_style( $post_ID, $meta ); break; case 'overlap': $obj->whistle_post_overlap_style( $post_ID, $meta ); break; case 'entry-center-align': $obj->whistle_post_stripe_style( $post_ID, $meta ); break; case 'entry-fashion-style': $obj->whistle_post_fashion_style( $post_ID, $meta ); break; case 'entry-minimal-bordered': $obj->whistle_post_minimal_bordered_style( $post_ID, $meta ); break; case 'blog-default-style': case 'blog-medium-style': case 'blog-medium-style dt-blog-medium-highlight': case 'blog-medium-style dt-blog-medium-highlight dt-sc-skin-highlight': default: $obj->whistle_post_default_style( $post_ID, $meta, $sidebar_class ); break; endswitch; $x = next($post_layout_arr); if( empty($x) && (count($post_layout_arr) == 3) ){ unset($post_layout_arr); $post_layout_arr[] = 2; } elseif( empty($x) && (count($post_layout_arr) == 4) ){ unset($post_layout_arr); $post_layout_arr[] = 3; } elseif( empty($x) && (count($post_layout_arr) == 5) ){ reset($post_layout_arr); next($post_layout_arr); } elseif( empty($x) && (count($post_layout_arr) == 6) ){ reset($post_layout_arr); } elseif( empty($x) && (count($post_layout_arr) == 1) ){ reset($post_layout_arr); } echo '
    '; echo '
    '; endwhile; echo '
    '; else:?>

    PK! *#loops/partials/post-single-flat.phpnu[ID, '_dt_post_settings', TRUE); $post_meta = is_array($post_meta) ? $post_meta : array(); $format = !empty( $post_meta['post-format-type'] ) ? $post_meta['post-format-type'] : 'standard'; ?>
    ID.'" /]'); endif;?>

    '', 'link_before'=>'', 'link_after'=>'', 'next_or_number'=>'number', 'pagelink' => '%', 'echo' => 1 ) ); ?>
    '); ?>
    PK!#Z(loops/partials/post-info-above-image.phpnu[
    '', 'link_before'=>'', 'link_after'=>'', 'next_or_number'=>'number', 'pagelink' => '%', 'echo' => 1 ) ); ?>
    ID.'" /]'); endif;?>
    PK!d loops/partials/post-standard.phpnu[
    '', 'link_before'=>'', 'link_after'=>'', 'next_or_number'=>'number', 'pagelink' => '%', 'echo' => 1 ) ); ?>
    PK!xy!loops/partials/post-left-date.phpnu[ID, '_dt_post_settings', TRUE); $post_meta = is_array($post_meta) ? $post_meta : array(); $format = !empty( $post_meta['post-format-type'] ) ? $post_meta['post-format-type'] : 'standard'; ?>

    '', 'link_before'=>'', 'link_after'=>'', 'next_or_number'=>'number', 'pagelink' => '%', 'echo' => 1 ) ); ?>
    PK! "66)loops/partials/post-info-within-image.phpnu[
    '', 'link_before'=>'', 'link_after'=>'', 'next_or_number'=>'number', 'pagelink' => '%', 'echo' => 1 ) ); ?>
    ID.'" /]'); endif;?>
    PK!<$j##)loops/partials/post-info-bottom-image.phpnu[
    '', 'link_before'=>'', 'link_after'=>'', 'next_or_number'=>'number', 'pagelink' => '%', 'echo' => 1 ) ); ?>
    ID.'" /]'); endif;?>
    PK!|Dloops/partials/entry-thumb.phpnu[ID,'_dt_post_settings',TRUE); $post_meta = is_array($post_meta) ? $post_meta : array(); if(empty($post_meta)) $post_meta['show-featured-image'] = 'true'; $format = !empty( $post_meta['post-format-type'] ) ? $post_meta['post-format-type'] : 'standard'; if( array_key_exists('show-featured-image', $post_meta) ): // If it's galley post if( $format === "gallery" && $post_meta['post-gallery-items'] != '' ) : ?>
    $post_meta['media-url']) ); endif;?>
    $post_meta['media-url']) ); endif; endif; elseif( has_post_thumbnail() ) : ?> PK!jEE+loops/partials/post-info-vertical-image.phpnu[ID ,'_dt_post_settings',TRUE); $post_meta = is_array($post_meta) ? $post_meta : array(); $format = !empty( $post_meta['post-format-type'] ) ? $post_meta['post-format-type'] : 'standard'; ?>
    '', 'link_before'=>'', 'link_after'=>'', 'next_or_number'=>'number', 'pagelink' => '%', 'echo' => 1 ) ); ?>
    ID.'" /]'); endif;?>
    PK!y  loops/content-single.phpnu[ID,'_dt_post_settings',TRUE); $post_meta = is_array($post_meta) ? $post_meta : array(); if(empty($post_meta)) $post_meta['show-featured-image'] = 'true'; $format = !empty( $post_meta['post-format-type'] ) ? $post_meta['post-format-type'] : 'standard'; $post_style = isset( $post_meta['single-post-style'] )? $post_meta['single-post-style'] : 'standard'; $post_classes = array('blog-entry', 'post-'.$post_style ); ?>
    >

    user_login); ?> / roles)); ?>

    '.esc_html__('Prev Entry','whistle') ); ?>
    '); ?>
    ID ) ): $post_class = "column dt-sc-one-third"; $post_style = cs_get_option( 'post-style' ); $sc = "[dt_sc_blog_related_post post_class='".$post_class."' post_style='".$post_style."' id='".$post->ID."' /]"; if( shortcode_exists( 'dt_sc_blog_related_post' ) ) echo do_shortcode($sc); endif; #Post Comments $post_comment = cs_get_option( 'single-post-comments' ); if( !empty($post_comment) ):?>
    PK!Yloops/content-page.phpnu[
    > '', 'link_before' => '', 'link_after' => '', 'next_or_number' => 'number', 'pagelink' => '%', 'echo' => 1 ) ); edit_post_link( esc_html__( ' Edit ','whistle' ) ); ?>
    PK!SHuuregister-post-functions.phpnu[ 0 ) : // Getting values from page meta... $tpl_default_settings = get_post_meta($page_ID, '_tpl_default_settings', TRUE); $tpl_default_settings = is_array( $tpl_default_settings ) ? $tpl_default_settings : array(); $allow_read_more = !empty( $tpl_default_settings['enable-blog-readmore'] ) ? $tpl_default_settings['enable-blog-readmore'] : NULL; $read_more = !empty( $tpl_default_settings['blog-readmore'] ) ? $tpl_default_settings['blog-readmore'] : NULL; $allow_excerpt = !empty( $tpl_default_settings['blog-post-excerpt'] ) ? $tpl_default_settings['blog-post-excerpt'] : NULL; $excerpt = !empty( $tpl_default_settings['blog-post-excerpt-length'] ) ? $tpl_default_settings['blog-post-excerpt-length'] : NULL; $show_post_format = !empty( $tpl_default_settings['show-postformat-info'] ) ? $tpl_default_settings['show-postformat-info'] : NULL; $show_author_meta = !empty( $tpl_default_settings['show-author-info'] ) ? $tpl_default_settings['show-author-info'] : NULL; $show_date_meta = !empty( $tpl_default_settings['show-date-info'] ) ? $tpl_default_settings['show-date-info'] : NULL; $show_comment_meta = !empty( $tpl_default_settings['show-comment-info'] ) ? $tpl_default_settings['show-comment-info'] : NULL; $show_category_meta = !empty( $tpl_default_settings['show-category-info'] ) ? $tpl_default_settings['show-category-info'] : NULL; $show_tag_meta = !empty( $tpl_default_settings['show-tag-info'] ) ? $tpl_default_settings['show-tag-info'] : NULL; elseif( is_home() || is_search() || is_archive() || $ajax ) : // Getting values from theme options... $allow_read_more = cs_get_option( 'post-archives-enable-readmore' ); $read_more = cs_get_option( 'post-archives-readmore' ); $allow_excerpt = cs_get_option( 'post-archives-enable-excerpt' ); $excerpt = cs_get_option( 'post-archives-excerpt' ); $show_post_format = cs_get_option( 'post-format-meta' ); $show_author_meta = cs_get_option( 'post-author-meta' ); $show_date_meta = cs_get_option( 'post-date-meta' ); $show_comment_meta = cs_get_option( 'post-comment-meta' ); $show_category_meta = cs_get_option( 'post-category-meta' ); $show_tag_meta = cs_get_option( 'post-tag-meta' ); endif; $read_more = !empty( $read_more ) ? $read_more : ''; $excerpt = !empty( $excerpt ) ? $excerpt : 25; $show_post_format = !empty( $show_post_format )? "" : "hidden"; $show_author_meta = !empty( $show_author_meta ) ? "" : "hidden"; $show_date_meta = !empty( $show_date_meta ) ? "" : "hidden"; $show_comment_meta = !empty( $show_comment_meta ) ? "" : "hidden"; $show_category_meta = !empty( $show_category_meta ) ? "" : "hidden"; $show_tag_meta = !empty( $show_tag_meta ) ? "" : "hidden"; array_push( $meta_values, $allow_read_more, $read_more, $allow_excerpt, $excerpt, $show_post_format, $show_author_meta, $show_date_meta, $show_comment_meta, $show_category_meta, $show_tag_meta ); return $meta_values; } static function whistle_post_view_count($pid = '') { $post_meta = get_post_meta ( $pid, '_dt_post_settings', TRUE ); $post_meta = is_array ( $post_meta ) ? $post_meta : array (); $v = array_key_exists("view_count", $post_meta) && !empty( $post_meta['view_count'] ) ? $post_meta['view_count'] : 0; $v = $v + 1; $post_meta['view_count'] = $v; update_post_meta( $pid, '_dt_post_settings', $post_meta ); return $v; } static function whistle_post_like_count($pid = '') { $post_meta = get_post_meta ( $pid, '_dt_post_settings', TRUE ); $post_meta = is_array ( $post_meta ) ? $post_meta : array (); $v = array_key_exists("like_count",$post_meta) && !empty( $post_meta['like_count'] ) ? $post_meta['like_count'] : '0'; return $v; } function whistle_post_rating_like() { $out = ''; $postid = $_REQUEST['post_id']; $nonce = $_REQUEST['nonce']; $action = $_REQUEST['doaction']; $arr_pids = array(); if ( wp_verify_nonce( $nonce, 'rating-nonce' ) && $postid > 0 ) { $post_meta = get_post_meta ( $postid, '_dt_post_settings', TRUE ); $post_meta = is_array ( $post_meta ) ? $post_meta : array (); $var_count = ($action == 'like') ? 'like_count' : 'unlike_count'; if( isset( $_COOKIE['arr_pids'] ) ) { // article voted already... if( in_array( $postid, explode(',', $_COOKIE['arr_pids']) ) ) { $out = esc_html__('Already', 'whistle'); } else { // article first vote... $v = array_key_exists($var_count, $post_meta) ? $post_meta[$var_count] : 0; $v = $v + 1; $post_meta[$var_count] = $v; update_post_meta( $postid, '_dt_post_settings', $post_meta ); $out = $v; $arr_pids = explode(',', $_COOKIE['arr_pids']); array_push( $arr_pids, $postid); setcookie( "arr_pids", implode(',', $arr_pids ), time()+1314000, "/" ); } } else { // site first vote... $v = array_key_exists($var_count, $post_meta) ? $post_meta[$var_count] : 0; $v = $v + 1; $post_meta[$var_count] = $v; update_post_meta( $postid, '_dt_post_settings', $post_meta ); $out = $v; array_push( $arr_pids, $postid); setcookie( "arr_pids", implode(',', $arr_pids ), time()+1314000, "/" ); } } else { $out = esc_html__('Security check', 'whistle'); } echo do_shortcode($out); } function whistle_post_thumb( $post_ID, $column ) { $post_meta = get_post_meta($post_ID, '_dt_post_settings', TRUE); $post_meta = is_array($post_meta) ? $post_meta : array(); $format = !empty( $post_meta['post-format-type'] ) ? $post_meta['post-format-type'] : 'standard'; $img_size = array( '1' => 'whistle-blog-i-column', '2' => 'whistle-blog-ii-column', '3' => 'whistle-blog-iii-column' ); // If it's galley post if( $format === "gallery" && $post_meta['post-gallery-items'] != '' ) : ?>
    $post_meta['media-url']) ); endif;?>
    $post_meta['media-url']) ); endif; endif; elseif( has_post_thumbnail() ) : ?> 'whistle-blog-i-column-bothsidebar', '2' => 'whistle-blog-ii-column-bothsidebar', '3' => 'whistle-blog-iii-column-bothsidebar', '4' => 'whistle-blog-thumb-bothsidebar' ); elseif($actual_sidebar_class == 'left' || $actual_sidebar_class == 'right'): $img_size = array( '1' => 'whistle-blog-i-column-sidebar', '2' => 'whistle-blog-ii-column-sidebar', '3' => 'whistle-blog-iii-column-sidebar', '4' => 'whistle-blog-thumb-sidebar' ); else: $img_size = array( '1' => 'whistle-blog-i-column', '2' => 'whistle-blog-ii-column', '3' => 'whistle-blog-iii-column', '4' => 'whistle-blog-thumb' ); endif; // If it's galley post if( $format === "gallery" && $post_meta['post-gallery-items'] != '' ) : ?>
    $post_meta['media-url']) ); endif;?>
    $post_meta['media-url']) ); endif; endif; elseif( has_post_thumbnail() ) : ?>
    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Read More', 'whistle').' '; endif; endif;?>
    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Read More', 'whistle').' '; endif; endif;?>
    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Continue Reading...', 'whistle').''; endif; endif;?>
    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Read More', 'whistle').''; endif; endif;?>
    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Read More', 'whistle').''; endif; endif;?>
    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Read More', 'whistle').' '; endif; endif;?>
    'full', '2' => 'whistle-blog-ii-column', '3' => 'whistle-blog-iii-column' ); $url = get_the_post_thumbnail_url( $post_ID, $img_size[$meta[10]] ); $entry_bg = 'style="background-image:url('.$url.')"'; }?>
    >
    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Read More', 'whistle').''; endif;?>
    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Read More', 'whistle').''; endif; endif;?>
    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Read More', 'whistle').''; endif; endif;?>
    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Read More', 'whistle').''; endif; endif;?>
    '.esc_html__('Featured', 'whistle').'
    '; ?>

    '.esc_html__('Featured', 'whistle').''; ?>

    '.esc_html__('Read More', 'whistle').''; endif; endif;?> esc_html__('DesignThemes Core Features Plugin', 'whistle'), 'slug' => 'designthemes-core-features', 'source' => WHISTLE_THEME_DIR . '/framework/plugins/designthemes-core-features.zip', 'required' => true, 'version' => '3.5', ), array( 'name' => esc_html__('Contact Form 7', 'whistle'), 'slug' => 'contact-form-7', 'required' => false, ), array( 'name' => esc_html__('WooCommerce - excelling eCommerce', 'whistle'), 'slug' => 'woocommerce', 'required' => false, ), array( 'name' => esc_html__('YITH WooCommerce Wishlist','whistle'), 'slug' => 'yith-woocommerce-wishlist', 'required' => false ), array( 'name' => esc_html__('YITH WooCommerce Zoom Magnifier','whistle'), 'slug' => 'yith-woocommerce-zoom-magnifier', 'required' => false ), array( 'name' => esc_html__('The Events Calendar', 'whistle'), 'slug' => 'the-events-calendar', 'required' => true, ), array( 'name' => esc_html__('Timetable Responsive Schedule For WordPress', 'whistle'), 'slug' => 'timetable', 'source' => WHISTLE_THEME_DIR . '/framework/plugins/timetable.zip', 'required' => false, 'version' => '6.4', ), array( 'name' => esc_html__('Like This', 'whistle'), 'slug' => 'roses-like-this', 'required' => true, ), array( 'name' => esc_html__('s2Member Framework', 'whistle'), 'slug' => 's2member', 'required' => false, ), array( 'name' => esc_html__('BBPress', 'whistle'), 'slug' => 'bbpress', 'required' => false, ), array( 'name' => esc_html__('BuddyPress', 'whistle'), 'slug' => 'buddypress', 'required' => false, ), array( 'name' => esc_html__('Unyson', 'whistle'), 'slug' => 'unyson', 'required' => true, ), array( 'name' => esc_html__('Kirki Toolkit', 'whistle'), 'slug' => 'kirki', 'required' => true, ) ); $args = array( 'user-agent' => 'WordPress/' . get_bloginfo( 'version' ) . '; ' . network_site_url(), 'timeout' => 30, ); $response = wp_remote_get( 'http://wedesignthemes.com/plugins/designthemes/version3.php', $args ); $data = json_decode( wp_remote_retrieve_body( $response ), true ); if ( is_array( $data ) && ! empty( $data ) ) { $updated_plugin_list = array_merge( $data, $plugins ); } else { $updated_plugin_list = $plugins; } /* * Array of configuration settings. Amend each line as needed. * * TGMPA will start providing localized text strings soon. If you already have translations of our standard * strings available, please help us make TGMPA even better by giving us access to these translations or by * sending in a pull-request with .po file(s) with the translations. * * Only uncomment the strings in the config array if you want to customize the strings. */ $config = array( 'id' => 'whistle', // Unique ID for hashing notices for multiple instances of TGMPA. 'default_path' => '', // Default absolute path to bundled plugins. 'menu' => 'tgmpa-install-plugins', // Menu slug. 'parent_slug' => 'themes.php', // Parent menu slug. 'capability' => 'edit_theme_options', // Capability needed to view plugin install page, should be a capability associated with the parent menu used. 'has_notices' => true, // Show admin notices or not. 'dismissable' => true, // If false, a user cannot dismiss the nag message. 'dismiss_msg' => '', // If 'dismissable' is false, this message will be output at top of nag. 'is_automatic' => true, // Automatically activate plugins after installation or not. 'message' => '', // Message to output right before the plugins table. ); tgmpa( $updated_plugin_list, $config ); }?>PK!k}c"jrjrregister-head.phpnu[ 'false', 'restartOnPushState' => 'false' )); } wp_enqueue_script('whistle-jqcustom', get_theme_file_uri('/framework/js/custom.js'), array(), false, true); /* Catalog */ wp_enqueue_script('jquery-smoothscroll', get_theme_file_uri('/framework/js/jquery-smoothscroll.js'),array(),false,true); wp_localize_script('jquery-nicescroll', 'dttheme_urls', array( 'theme_base_url' => esc_js(WHISTLE_THEME_URI), 'framework_base_url' => esc_js(WHISTLE_THEME_URI).'/framework/', 'ajaxurl' => esc_url( admin_url('admin-ajax.php') ), 'url' => esc_url( get_site_url() ), 'isRTL' => esc_js($rtl), 'loadingbar' => esc_js($loadingbar), 'advOptions' => esc_html__('Show Advanced Options', 'whistle'), 'wpnonce' => wp_create_nonce('rating-nonce') )); $picker = cs_get_option( 'enable-stylepicker' ); if( isset($picker) ) { wp_enqueue_script('jquery-cookie', get_theme_file_uri('/framework/js/jquery.cookie.min.js'),array(),false,true); wp_enqueue_script('whistle-jqcpanel', get_theme_file_uri('/framework/js/controlpanel.js'),array(),false,true); } } /* --------------------------------------------------------------------------- * Scripts of Custom JS from Theme Back-End * --------------------------------------------------------------------------- */ function whistle_scripts_custom() { $enable_custom_js = (int) get_theme_mod( 'enable-custom-js', whistle_defaults('enable-custom-js') ); $custom_js = get_theme_mod( 'custom-js', ''); if( !empty( $enable_custom_js ) && !empty( $custom_js ) ){ wp_add_inline_script('whistle-jqcustom', whistle_wp_kses(stripslashes($custom_js)) ,'after'); } } add_action('wp_enqueue_scripts', 'whistle_scripts_custom', 100); /* --------------------------------------------------------------------------- * Loading Theme Styles * --------------------------------------------------------------------------- */ add_action( 'wp_enqueue_scripts', 'whistle_enqueue_styles', 101 ); function whistle_enqueue_styles() { // site icons --------------------------------------------------------------- if ( ! has_site_icon() ): $url = WHISTLE_THEME_URI . "/images/favicon.ico"; echo "\n"; endif; // wp_enqueue_style --------------------------------------------------------------- wp_enqueue_style( 'whistle', get_stylesheet_uri(), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-base', get_theme_file_uri('/css/base.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-grid', get_theme_file_uri('/css/grid.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-widget', get_theme_file_uri('/css/widget.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-layout', get_theme_file_uri('/css/layout.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-blog', get_theme_file_uri('/css/blog.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-contact', get_theme_file_uri('/css/contact.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-custom-class', get_theme_file_uri('/css/custom-class.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-browsers', get_theme_file_uri('/css/browsers.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-googleapis', '//fonts.googleapis.com/css?family=Lato:100,100i,300,300i,400,400i,700,700i,900,900i&subset=latin-ext', array(), null ); wp_enqueue_style( 'prettyphoto', get_theme_file_uri('/css/prettyPhoto.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-google-fonts', whistle_load_fonts_url(), array(), WHISTLE_THEME_VERSION, 'all' ); if (function_exists('bp_add_cover_image_inline_css')) { $inline_css = bp_add_cover_image_inline_css( true ); wp_add_inline_style( 'bp-parent-css', strip_tags( $inline_css['css_rules'] ) ); } // icon fonts --------------------------------------------------------------------- wp_enqueue_style ( 'font-awesome', get_theme_file_uri('/css/font-awesome.min.css'), array (), '4.3.0' ); wp_enqueue_style ( 'pe-icon-7-stroke', get_theme_file_uri('/css/pe-icon-7-stroke.css'), array () ); wp_enqueue_style ( 'stroke-gap-icons-style', get_theme_file_uri('/css/stroke-gap-icons-style.css'), array () ); wp_enqueue_style ( 'icon-moon', get_theme_file_uri('/css/icon-moon.css'), array () ); wp_enqueue_style ( 'material-design-iconic-font', get_theme_file_uri('/css/material-design-iconic-font.min.css'), array () ); // comingsoon css if( cs_get_option( 'enable-comingsoon' ) ) wp_enqueue_style("whistle-comingsoon", get_theme_file_uri("/css/comingsoon.css"), false, WHISTLE_THEME_VERSION, 'all' ); // notfound css if ( is_404() ) wp_enqueue_style("whistle-notfound", get_theme_file_uri("/css/notfound.css"), false, WHISTLE_THEME_VERSION, 'all' ); // loader css $loadingbar = cs_get_option( 'use-site-loader' ); if( !empty( $loadingbar ) ) wp_enqueue_style("whistle-loader", get_theme_file_uri("/css/loaders.css"), false, WHISTLE_THEME_VERSION, 'all' ); // woocommerce css if( function_exists( 'is_woocommerce' ) ): wp_enqueue_style( 'whistle-woo-default', get_theme_file_uri('/css/woocommerce/woocommerce-default.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type1', get_theme_file_uri('/css/woocommerce/type1-fashion.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type4', get_theme_file_uri('/css/woocommerce/type4-hosting.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type8', get_theme_file_uri('/css/woocommerce/type8-insurance.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type10', get_theme_file_uri('/css/woocommerce/type10-medical.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type11', get_theme_file_uri('/css/woocommerce/type11-model.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type12', get_theme_file_uri('/css/woocommerce/type12-attorney.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type13', get_theme_file_uri('/css/woocommerce/type13-architecture.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type14', get_theme_file_uri('/css/woocommerce/type14-fitness.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type16', get_theme_file_uri('/css/woocommerce/type16-photography.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type17', get_theme_file_uri('/css/woocommerce/type17-restaurant.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type20', get_theme_file_uri('/css/woocommerce/type20-yoga.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo-type21', get_theme_file_uri('/css/woocommerce/type21-styleshop.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'whistle-woo', get_theme_file_uri('/css/woocommerce.css'), 'woocommerce-general-css', WHISTLE_THEME_VERSION, 'all' ); endif; // tribe-events ------------------------------------------------------------------- wp_enqueue_style( 'whistle-customevent', get_theme_file_uri('/tribe-events/custom.css'), false, WHISTLE_THEME_VERSION, 'all' ); // cookie-consent ----------------------------------------------------------------- if( cs_get_option('enable-cookie-consent') == "true" ) { wp_enqueue_style( 'whistle-cookieconsent', get_theme_file_uri('/css/cookieconsent.css'), false, WHISTLE_THEME_VERSION, 'all' ); } wp_enqueue_style( 'magnific-popup', get_theme_file_uri('/framework/js/magnific/magnific-popup.css'), false, WHISTLE_THEME_VERSION, 'all' ); // custom css --------------------------------------------------------------------- wp_enqueue_style( 'whistle-custom', get_theme_file_uri('/css/custom.css'), false, WHISTLE_THEME_VERSION, 'all' ); // jquery scripts -------------------------------------------- wp_enqueue_script('modernizr-custom', get_theme_file_uri('/framework/js/modernizr.custom.js'), array('jquery')); // rtl ---------------------------------------------------------------------------- if(is_rtl()) wp_enqueue_style('whistle-rtl', get_theme_file_uri('/css/rtl.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'tooltips', get_theme_file_uri('/css/tooltips.css'), false, WHISTLE_THEME_VERSION, 'all' ); wp_enqueue_style( 'tooltipster', get_theme_file_uri('/css/tooltipster.css'), false, WHISTLE_THEME_VERSION, 'all' ); // gutenberg css --------------------------------------------------------------------- wp_enqueue_style( 'whistle-gutenberg', get_theme_file_uri('/css/gutenberg.css'), false, WHISTLE_THEME_VERSION, 'all' ); // skin css $use_predefined_skin = (int) get_theme_mod( 'use-predefined-skin', whistle_defaults('use-predefined-skin') ); if( !empty( $use_predefined_skin ) ) : $skin = get_theme_mod( 'predefined-skin', whistle_defaults('predefined-skin') ); wp_enqueue_style("whistle-skin", get_theme_file_uri("/css/skins/$skin/style.css")); endif; $use_predefined_skin = (int) get_theme_mod( 'use-predefined-skin', whistle_defaults('use-predefined-skin') ); $primary_color = get_theme_mod('primary-color',whistle_defaults('primary-color')); $secondary_color = get_theme_mod('secondary-color',whistle_defaults('secondary-color')); $tertiary_color = get_theme_mod('tertiary-color',whistle_defaults('tertiary-color')); if( empty( $use_predefined_skin ) ) { $css = ''; if( !empty( $primary_color ) ) { $rgba = whistle_hex2rgb( $primary_color ); $rgba = implode(',', $rgba); # Widget Style $widget_style = cs_get_option( 'wtitle-style' ); if( $widget_style == 'type5' ) { $css .= '.secondary-sidebar .type5 .widgettitle { border-color:rgba('.$rgba.', 0.5) }'; } if( $widget_style == 'type12' ) { $css .= '.secondary-sidebar .type12 .widgettitle { background: rgba('.$rgba.', 0.2) }'; } $css .= '.dt-sc-image-caption.type6 .dt-sc-image-wrapper .icon-wrapper:before{ background-image: linear-gradient(rgba('.$rgba.', 0) 65%,'.$primary_color.' 98%) }'; $css .= '.dt-sc-menu-sorting a { color: rgba('.$rgba.', 0.6) }'; $css .= '.dt-sc-team.type2 .dt-sc-team-thumb .dt-sc-team-thumb-overlay, .dt-sc-hexagon-image span:before, .dt-sc-keynote-speakers .dt-sc-speakers-thumb .dt-sc-speakers-thumb-overlay { background: rgba('.$rgba.', 0.9) }'; $css .= '.gallery .image-overlay, .recent-gallery-widget ul li a:before, .dt-sc-image-caption.type2:hover .dt-sc-image-content, .dt-sc-fitness-program-short-details-wrapper .dt-sc-fitness-program-short-details { background: rgba('.$rgba.', 0.9) }'; # Shortcode $css .= '.dt-sc-icon-box.type10 .icon-wrapper:before, .dt-sc-contact-info.type4 span:after, .dt-sc-pr-tb-col.type2 .dt-sc-tb-header:before { box-shadow:5px 0px 0px 0px '.$primary_color.'}'; $css .= '.dt-sc-icon-box.type10:hover .icon-wrapper:before { box-shadow:7px 0px 0px 0px '.$primary_color.'}'; $css .= '.dt-sc-counter.type6 .dt-sc-couter-icon-holder:before { box-shadow:5px 1px 0px 0px '.$primary_color.'}'; $css .= '.dt-sc-button.with-shadow.white, .dt-sc-pr-tb-col.type2 .dt-sc-buy-now a { box-shadow:3px 3px 0px 0px '.$primary_color.'}'; $css .= '.dt-sc-restaurant-events-list .dt-sc-restaurant-event-details h6:before { border-bottom-color: rgba('.$rgba.',0.6) }'; $css .= '.gallery.type4 .image-overlay, .dt-sc-timeline-section.type4 .dt-sc-timeline-thumb-overlay, .dt-sc-yoga-classes .dt-sc-yoga-classes-image-wrapper:before, .dt-sc-yoga-course .dt-sc-yoga-course-thumb-overlay, .dt-sc-yoga-program .dt-sc-yoga-program-thumb-overlay, .dt-sc-yoga-pose .dt-sc-yoga-pose-thumb:before, .dt-sc-yoga-teacher .dt-sc-yoga-teacher-thumb:before, .dt-sc-doctors .dt-sc-doctors-thumb-overlay, .dt-sc-event-addon > .dt-sc-event-addon-date, .dt-sc-course .dt-sc-course-overlay, .dt-sc-process-steps .dt-sc-process-thumb-overlay { background: rgba('.$rgba.',0.85) }'; $css .= '@media only screen and (max-width: 767px) { .dt-sc-contact-info.type4:after, .dt-sc-icon-box.type10 .icon-content h4:after, .dt-sc-counter.type6.last h4::before, .dt-sc-counter.type6 h4::after { background-color:'.$primary_color.'} }'; $css .= '@media only screen and (max-width: 767px) { .dt-sc-timeline-section.type2, .dt-sc-timeline-section.type2::before { border-color:'.$primary_color.'} }'; //Add support for theme color paletter $css .= ".has-primary-color-background-color { background-color: ".$primary_color."; } "; $css .= ".has-primary-color-color { color: ".$primary_color."; }"; # WooCommerce if( function_exists( 'is_woocommerce' ) ){ $css .= '.woocommerce ul.products li.product .woo-type1 .star-rating:before, .woocommerce ul.products li.product .woo-type1 .star-rating span:before, .woocommerce ul.products li.product .woo-type1 .star-rating:before, .woocommerce ul.products li.product .woo-type1 .star-rating span:before, .woocommerce .woo-type1 .star-rating:before, .woocommerce .woo-type1 .star-rating span:before, .woocommerce .woo-type1 .star-rating:before, .woocommerce .woo-type1 .star-rating span:before { color: rgba('.$rgba.', 0.75) }'; $css .= '.woocommerce ul.products li.product:hover .woo-type8 .product-content, .woocommerce ul.products li.product-category:hover .woo-type8 .product-thumb .image:after, .woocommerce ul.products li.product:hover .woo-type8 .product-content, .woocommerce ul.products li.product-category:hover .woo-type8 .product-thumb .image:after, .woocommerce ul.products li.product:hover .woo-type13 .product-content, .woocommerce ul.products li.product:hover .woo-type13 .product-content, .woocommerce ul.products li.product.instock:hover .woo-type13 .on-sale-product .product-content, .woocommerce ul.products li.product.instock:hover .woo-type13 .on-sale-product .product-content, .woocommerce ul.products li.product.outofstock:hover .woo-type13 .out-of-stock-product .product-content, .woocommerce ul.products li.product.outofstock:hover .woo-type13 .out-of-stock-product .product-content, .woocommerce ul.products li.product-category:hover .woo-type13 .product-thumb .image:after, .woocommerce ul.products li.product-category:hover .woo-type13 .product-thumb .image:after { background-color: rgba('.$rgba.', 0.75) }'; $css .= '.woocommerce ul.products li.product:hover .woo-type8 .product-content:after, .woocommerce ul.products li.product:hover .woo-type8 .product-content:after { border-color : rgba( '.$rgba.', 0.75 ) rgba('.$rgba.', 0.75 ) rgba(255, 255, 255, 0.35) rgba(255, 255, 255, 0.35) }'; $css .= 'ul.products li.product:hover .woo-type11 .product-wrapper { -webkit-box-shadow: 0 0 0 3px '.$primary_color.'; -moz-box-shadow: 0 0 0 3px '.$primary_color.'; -ms-box-shadow: 0 0 0 3px '.$primary_color.'; -o-box-shadow: 0 0 0 3px '.$primary_color.'; box-shadow: 0 0 0 3px '.$primary_color.'; }'; $css .= '.woo-type12 ul.products li.product .product-details { -webkit-box-shadow: 0 -3px 0 0 '.$primary_color.' inset; -moz-box-shadow: 0 -3px 0 0 '.$primary_color.' inset; -ms-box-shadow: 0 -3px 0 0 '.$primary_color.' inset; -o-box-shadow: 0 -3px 0 0 '.$primary_color.' inset; box-shadow: 0 -3px 0 0 '.$primary_color.' inset; }'; $css .= 'ul.products li.product .woo-type14 .product-details, ul.products li.product .woo-type14 .product-details h5:after { -webkit-box-shadow: 0 0 0 2px '.$primary_color.' inset; -moz-box-shadow: 0 0 0 2px '.$primary_color.' inset; -ms-box-shadow: 0 0 0 2px '.$primary_color.' inset; -o-box-shadow: 0 0 0 2px '.$primary_color.' inset; box-shadow: 0 0 0 2px '.$primary_color.' inset; }'; } } if( !empty( $secondary_color ) ) { $rgba = whistle_hex2rgb( $secondary_color ); $rgba = implode(',', $rgba); $css .= '.dt-sc-event-month-thumb .dt-sc-event-read-more, .dt-sc-training-thumb-overlay{ background: rgba('.$rgba.',0.85) }'; # Shortcode $css .= '@media only screen and (max-width: 767px) { .dt-sc-highlight .dt-sc-testimonial.type6 .dt-sc-testimonial-author:after,.dt-sc-highlight .dt-sc-testimonial.type6 .dt-sc-testimonial-author:after,.skin-highlight .dt-sc-testimonial.type6 .dt-sc-testimonial-author:after { background-color:'.$secondary_color.'} }'; //Add support for theme color paletter $css .= ".has-secondary-color-background-color { background-color: ".$secondary_color."; } "; $css .= ".has-secondary-color-color { color: ".$secondary_color."; }"; # WooCommerce if( function_exists( 'is_woocommerce' ) ){ $css .= 'ul.products li.product:hover .woo-type8 .product-details h5:after { border-color: rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) '.$secondary_color.' rgba(0, 0, 0, 0); }'; $css .= 'ul.products li.product .woo-type20 .product-thumb a.add_to_cart_button:hover, ul.products li.product .woo-type20 .product-thumb a.button.product_type_simple:hover, ul.products li.product .woo-type20 .product-thumb a.button.product_type_variable:hover, ul.products li.product .woo-type20 .product-thumb a.added_to_cart.wc-forward:hover, ul.products li.product .woo-type20 .product-thumb a.add_to_wishlist:hover, ul.products li.product .woo-type20 .product-thumb .yith-wcwl-wishlistaddedbrowse a:hover, ul.products li.product .woo-type20 .product-thumb .yith-wcwl-wishlistexistsbrowse a:hover, ul.products li.product:hover .woo-type20 .product-wrapper, .woocommerce ul.products li.product .woo-type20 .product-buttons-wrapper a.yith-wcqv-button:hover, .woocommerce ul.products li.product .woo-type20 .product-buttons-wrapper a.yith-woocompare-button:hover { background-color: rgba('.$rgba.',0.5 )}'; $css .= '.woocommerce ul.products li.product:hover .woo-type20 .product-buttons-wrapper { background-color: rgba('.$rgba.', 0.3); }'; } } if( !empty( $tertiary_color ) ) { $rgba = whistle_hex2rgb( $tertiary_color ); $rgba = implode(',', $rgba); $css .= '.dt-sc-faculty .dt-sc-faculty-thumb-overlay { background: rgba('.$rgba.',0.9) }'; //Add support for theme color paletter $css .= ".has-tertiary-color-background-color { background-color: ".$tertiary_color."; } "; $css .= ".has-tertiary-color-color { color: ".$tertiary_color."; }"; # WooCommerce if( function_exists( 'is_woocommerce' ) ){ $css .= 'ul.products li.product:hover .woo-type1 .product-thumb:after { -webkit-box-shadow: 0 0 0 10px rgba('. $rgba.',0.35) inset; -moz-box-shadow: 0 0 0 10px rgba('. $rgba.',0.35) inset; -ms-box-shadow: 0 0 0 10px rgba('. $rgba.',0.35) inset; -o-box-shadow: 0 0 0 10px rgba('. $rgba.',0.35) inset; box-shadow: 0 0 0 10px rgba('. $rgba.',0.35) inset; }'; $css .= 'ul.products li.product .woo-type20 .product-wrapper { -webkit-box-shadow: 0 0 0 5px rgba('. $rgba.',0.75) inset; -moz-box-shadow: 0 0 0 5px rgba('. $rgba.',0.75) inset; -ms-box-shadow: 0 0 0 5px rgba('. $rgba.',0.75) inset; -o-box-shadow: 0 0 0 5px rgba('. $rgba.',0.75) inset; box-shadow: 0 0 0 5px rgba('. $rgba.',0.75) inset; }'; } } if( !empty($primary_color) && !empty($secondary_color) && !empty($tertiary_color) ) { $css .= '@-webkit-keyframes color-change { 0% { color:'.$primary_color.'; } 50% { color:'.$secondary_color.'; } 100% { color:'.$tertiary_color.'; } }'; $css .= '@-moz-keyframes color-change { 0% { color:'.$primary_color.'; } 50% { color:'.$secondary_color.'; } 100% { color:'.$tertiary_color.'; } }'; $css .= '@-ms-keyframes color-change { 0% { color:'.$primary_color.'; } 50% { color:'.$secondary_color.'; } 100% { color:'.$tertiary_color.'; } }'; $css .= '@-o-keyframes color-change { 0% { color:'.$primary_color.'; } 50% { color:'.$secondary_color.'; } 100% { color:'.$tertiary_color.'; } }'; $css .= '@keyframes color-change { 0% { color:'.$primary_color.'; } 50% { color:'.$secondary_color.'; } 100% { color:'.$tertiary_color.'; } }'; } wp_add_inline_style( 'whistle-custom', $css ); } $fonts = cs_get_option('custom_font_fields'); if(isset($fonts)){ if( count( $fonts ) > 0 ){ wp_add_inline_style('whistle-custom', whistle_styles_custom_font() ); } } $dark_skin = cs_get_option( 'enable-dark-skin' ); if( !empty( $dark_skin ) ) { wp_enqueue_style("whistle-light-dark", get_theme_file_uri("/css/dark-skin.css"), false, WHISTLE_THEME_VERSION, 'all' ); } } add_action( 'wp_enqueue_scripts', 'whistle_enqueue_custom_inline', 999 ); if ( ! function_exists( 'whistle_enqueue_custom_inline' ) ) { function whistle_enqueue_custom_inline() { wp_register_style( 'whistle-custom-inline', '', array(), WHISTLE_THEME_VERSION, 'all' ); } } #Get Event's Venue Address... function whistle_event_venue_details($event_ID) { $venue_ID = get_post_meta($event_ID, '_EventVenueID', true); $ven_array = array(); $out = ""; $venue_details[] = get_the_title($venue_ID); $venue_details[] = get_post_meta($venue_ID, '_VenueAddress', true); $venue_details[] = get_post_meta($venue_ID, '_VenueCity', true); $venue_all = implode(', ', $venue_details); $out = '

    '.$venue_all.'

    '.esc_html__('Google Map','whistle').''; return $out; } function whistle_load_fonts_url() { $font_url = ''; // Default fonts used by theme $font_families = array('Crete Round:400,400i'); $query_args = array( 'family' => urlencode( implode( '|', $font_families ) ), ); $font_url = add_query_arg( $query_args, 'http'. whistle_ssl() .'://fonts.googleapis.com/css' ); return $font_url; } /* --------------------------------------------------------------------------- * Styles of Custom Font * --------------------------------------------------------------------------- */ function whistle_styles_custom_font() { $out = ''; $fonts = cs_get_option('custom_font_fields'); if( isset( $fonts ) && count( $fonts ) > 0 ){ foreach( $fonts as $font ): $out .= '@font-face {'; $out .= 'font-family: "'. $font['custom_font_name'] .'";'; $out .= 'src: url("'. $font['custom_font_woof'] .'") format("woff"),'; $out .= 'url("'. $font['custom_font_woof2'] .'") format("woff2");'; $out .= 'font-weight: normal;'; $out .= 'font-style: normal;'; $out .= '}'; endforeach; } return $out; } /* --------------------------------------------------------------------------- * Site SSL Compatibility * --------------------------------------------------------------------------- */ function whistle_ssl( $echo = false ){ $ssl = ''; if( is_ssl() ) $ssl = 's'; if( $echo ){ echo "{$ssl}"; } return $ssl; } if( !function_exists('whistle_getVimeoThumb') ) { function whistle_getVimeoThumb($id) { $data = wp_remote_fopen("http".whistle_ssl()."://vimeo.com/api/v2/video/$id.json"); $data = json_decode($data); return $data[0]->thumbnail_medium; } } /* --------------------------------------------------------------------------- * Body Class Filter for layout changes * --------------------------------------------------------------------------- */ function whistle_body_classes( $classes ) { // layout $classes[] = 'layout-'. get_theme_mod( 'site-layout', whistle_defaults('site-layout') ); if( is_page() ) { global $post; $page_meta = get_post_meta( $post->ID, '_tpl_default_settings', true ); $page_meta = is_array( $page_meta ) ? $page_meta : array(); if( array_key_exists( 'show_slider', $page_meta ) && $page_meta['show_slider'] ) { $classes[] = "page-with-slider"; } if( array_key_exists( 'enable-sub-title', $page_meta ) && !($page_meta['enable-sub-title']) ) { $classes[] = "no-breadcrumb"; } } elseif( is_singular('post') ) { global $post; $post_meta = get_post_meta( $post->ID, '_dt_post_settings', true ); $post_meta = is_array( $post_meta ) ? $post_meta : array(); if( array_key_exists( 'enable-sub-title', $post_meta ) && !($post_meta['enable-sub-title']) ) { $classes[] = "no-breadcrumb"; } } elseif( is_home() ) { $pageid = get_option('page_for_posts'); $page_meta = get_post_meta( $pageid, '_tpl_default_settings', true ); $page_meta = is_array( $page_meta ) ? $page_meta : array(); if( array_key_exists( 'show_slider', $page_meta ) && $page_meta['show_slider'] ) { $classes[] = "page-with-slider"; } } else { $show_breadcrump = cs_get_option('show-breadcrumb'); if( is_null( $show_breadcrump ) ) { $classes[] = "no-breadcrumb"; } } # Gutenberg Class if ( is_singular() && function_exists('has_blocks') && has_blocks()) { $classes[] = 'has-gutenberg-blocks'; } # Browsers global $is_macIE, $is_winIE, $is_IE, $is_gecko; if( $is_gecko ) $classes[] = 'browser-firefox'; if( $is_macIE || $is_winIE || $is_IE ) $classes[] = 'browser-ie'; return $classes; } add_filter( 'body_class', 'whistle_body_classes' ); ?>PK!- AAregister-hooks.phpnu[ ... in side body tag * --------------------------------------------------------------------------- */ add_action( 'wp_head', 'whistle_wp_head',999 ); if ( ! function_exists( 'whistle_wp_head' ) ) { function whistle_wp_head() { ob_start(); } } add_action( 'wp_footer', 'whistle_wp_footer',1000 ); if ( ! function_exists( 'whistle_wp_footer' ) ) { function whistle_wp_footer() { $content = ob_get_clean(); $regex = "##"; preg_match($regex, $content, $matches); $regex2 = "##"; preg_match($regex2, $content, $matches2); $style = isset($matches[0]) ? $matches[0] : ''; $style2 = isset($matches2[0]) ? $matches2[0] : ''; $content = str_replace($style,'',$content); $content = str_replace($style2,'',$content); $content = str_replace('',$style.$style2.'',$content); echo "{$content}"; } } /* --------------------------------------------------------------------------- * Hook of Top * --------------------------------------------------------------------------- */ function whistle_hook_top() { if( cs_get_option( 'enable-top-hook' ) ) : echo ''; $hook = cs_get_option( 'top-hook' ); $hook = do_shortcode( stripslashes($hook) ); if (!empty($hook)) echo apply_filters( 'whistle_top_hook', $hook ); echo ''; endif; } add_action( 'whistle_hook_top', 'whistle_hook_top', 10 ); /* --------------------------------------------------------------------------- * Page Loader * --------------------------------------------------------------------------- */ add_action( 'whistle_hook_top', 'whistle_page_loader', 20 ); function whistle_page_loader() { $loader = cs_get_option( 'use-site-loader' ); if( !empty($loader) ) { echo '
    '; } } /* --------------------------------------------------------------------------- * Hook of Content before * --------------------------------------------------------------------------- */ function whistle_hook_content_before() { if( cs_get_option( 'enable-content-before-hook' ) ) : echo ''; $hook = cs_get_option( 'content-before-hook' ); $hook = do_shortcode( stripslashes($hook) ); if (!empty($hook)) echo do_shortcode( stripslashes($hook) ); echo ''; endif; } add_action( 'whistle_hook_content_before', 'whistle_hook_content_before' ); /* --------------------------------------------------------------------------- * Hook of Content after * --------------------------------------------------------------------------- */ function whistle_hook_content_after() { if( cs_get_option( 'enable-content-after-hook' ) ) : echo ''; $hook = cs_get_option( 'content-after-hook' ); $hook = do_shortcode( stripslashes($hook) ); if (!empty($hook)) echo do_shortcode( stripslashes($hook) ); echo ''; endif; } add_action( 'whistle_hook_content_after', 'whistle_hook_content_after' ); /* --------------------------------------------------------------------------- * Main Header Hook * --------------------------------------------------------------------------- */ add_action( 'whistle_header', 'whistle_vc_header_template', 10 ); if( ! function_exists( 'whistle_vc_header_template' ) ) { function whistle_vc_header_template( $page_id ) { $id = ''; if( is_singular() && empty( $page_id ) ) { global $post; $settings = get_post_meta( $post->ID,'_dt_custom_settings',TRUE ); $settings = is_array( $settings ) ? $settings : array(); if( array_key_exists( 'show-header', $settings ) && !$settings['show-header'] ) return; $id = isset( $settings['header'] ) ? $settings['header'] : ''; $id = ( $id == '' ) ? cs_get_option( 'header' ) : $id; } elseif( !empty( $page_id ) ) { $settings = get_post_meta( $page_id, '_dt_custom_settings',TRUE ); $settings = is_array( $settings ) ? $settings : array(); if( array_key_exists( 'show-header', $settings ) && !$settings['show-header'] ) return; $id = isset( $settings['header'] ) ? $settings['header'] : ''; $id = ( $id == '' ) ? cs_get_option( 'header' ) : $id; } else { $id = cs_get_option( 'header' ); } $id = apply_filters( 'whistle_header_id', $id ); if( !$id || !function_exists( 'vc_lean_map' ) ) { get_template_part( 'template-parts/content', 'header' ); return; } ob_start(); wp_enqueue_style( 'whistle-custom-inline' ); if ( $custom_css = get_post_meta( $id, '_wpb_post_custom_css', true ) ) { wp_add_inline_style( 'whistle-custom-inline' , $custom_css ); } if ( $shortcode_custom_css = get_post_meta( $id, '_wpb_shortcodes_custom_css', true ) ) { wp_add_inline_style( 'whistle-custom-inline' , $shortcode_custom_css ); } echo '
    '; echo do_shortcode( get_post_field( 'post_content', $id ) ); echo '
    '; $content = ob_get_clean(); echo apply_filters( 'whistle_header_content', $content ); } } /* --------------------------------------------------------------------------- * Main Footer Hook * --------------------------------------------------------------------------- */ add_action( 'whistle_footer', 'whistle_vc_footer_template', 10 ); if( ! function_exists( 'whistle_vc_footer_template' ) ) { function whistle_vc_footer_template() { $id = ''; if( is_singular() ) { global $post; $settings = get_post_meta( $post->ID,'_dt_custom_settings',TRUE ); $settings = is_array( $settings ) ? $settings : array(); if( array_key_exists( 'show-footer', $settings ) && !$settings['show-footer'] ) return; $id = isset( $settings['footer'] ) ? $settings['footer'] : ''; $id = ( $id == '' ) ? cs_get_option( 'footer' ) : $id; } else { $id = cs_get_option( 'footer' ); } $id = apply_filters( 'whistle_footer_id', $id ); if( !$id || !function_exists( 'vc_lean_map' ) ) { echo ''; return; } ob_start(); wp_enqueue_style( 'whistle-custom-inline' ); if ( $custom_css = get_post_meta( $id, '_wpb_post_custom_css', true ) ) { wp_add_inline_style( 'whistle-custom-inline' , $custom_css ); } if ( $shortcode_custom_css = get_post_meta( $id, '_wpb_shortcodes_custom_css', true ) ) { wp_add_inline_style( 'whistle-custom-inline' , $shortcode_custom_css ); } echo do_shortcode( get_post_field( 'post_content', $id ) ); $content = ob_get_clean(); echo apply_filters( 'whistle_footer_content', $content ); } } /* --------------------------------------------------------------------------- * Hook of Bottom * --------------------------------------------------------------------------- */ function whistle_hook_bottom() { if( cs_get_option( 'enable-bottom-hook' ) ) : echo ''; $hook = cs_get_option( 'bottom-hook' ); $hook = do_shortcode( stripslashes($hook) ); if (!empty($hook)) echo do_shortcode( stripslashes($hook) ); echo ''; endif; } add_action( 'whistle_hook_bottom', 'whistle_hook_bottom' ); /* --------------------------------------------------------------------------- * Call Back For No Header Menu * --------------------------------------------------------------------------- */ function whistle_new_wp_page_menu() { $pages = wp_list_pages( array( 'depth' => 0, 'title_li' => '', 'echo' => 0, 'post_type' => 'page', 'link_before' => '', 'link_after' => '', 'post_status' => 'publish', 'walker' => new WHISTLE_Walker_Page ) ); echo ''; } /* --------------------------------------------------------------------------- * Predefined Skins * --------------------------------------------------------------------------- */ if( !function_exists('whistle_skins') ){ function whistle_skins( $skin ) { $skins['blue'] = array( 'primary-color' => '#0da1ff', 'secondary-color' => '#179ed6', 'tertiary-color' => '#0c8ddf'); $skins['ocean'] = array( 'primary-color' => '#30a8ad', 'secondary-color' => '#217578', 'tertiary-color' => '#9be1e4'); $skins['yellow'] = array( 'primary-color' => '#e4bf00', 'secondary-color' => '#b69800', 'tertiary-color' => '#ecd24c'); $skins['red'] = array( 'primary-color' => '#b60000', 'secondary-color' => '#910000', 'tertiary-color' => '#cb4c4c'); $skins['green'] = array( 'primary-color' => '#9bb70d', 'secondary-color' => '#798f0a', 'tertiary-color' => '#c9ee11'); $skins['purple'] = array( 'primary-color' => '#b44095', 'secondary-color' => '#7d2c68', 'tertiary-color' => '#ca79b4'); $skins['light-red'] = array( 'primary-color' => '#f15c24', 'secondary-color' => '#d8440e', 'tertiary-color' => '#f48157'); $skins['orange'] = array( 'primary-color' => '#faa71d', 'secondary-color' => '#c87d04', 'tertiary-color' => '#fbc36a'); return $skins[ $skin ]; } } /* --------------------------------------------------------------------------- * Page Layout * --------------------------------------------------------------------------- */ function whistle_page_layout( $layout = '' ) { $page_layout = $sidebar_class = ''; $show_sidebar = $show_left_sidebar = $show_right_sidebar = false; $container_class = "container"; $image_size_class = ''; switch ( $layout ) { case 'with-left-sidebar': $page_layout = "page-with-sidebar with-left-sidebar"; $show_sidebar = $show_left_sidebar = true; $sidebar_class = "secondary-has-left-sidebar"; $image_size_class = 'default'; break; case 'with-right-sidebar': $page_layout = "page-with-sidebar with-right-sidebar"; $show_sidebar = $show_right_sidebar = true; $sidebar_class = "secondary-has-right-sidebar"; $image_size_class = 'default'; break; case 'with-both-sidebar': $page_layout = "page-with-sidebar with-both-sidebar"; $show_sidebar = $show_left_sidebar = $show_right_sidebar = true; $sidebar_class = "secondary-has-both-sidebar"; $image_size_class = 'default'; break; case 'fullwidth': $container_class = "gallery-fullwidth-container"; $page_layout = "content-full-width"; $image_size_class = 'fullwidth'; break; case 'content-full-width': default: $page_layout = "content-full-width"; $image_size_class = 'default'; break; } return array( 'page_layout' => $page_layout, 'sidebar_class' => $sidebar_class, 'show_sidebar' => $show_sidebar, 'show_left_sidebar' => $show_left_sidebar, 'show_right_sidebar' => $show_right_sidebar, 'container_class' => $container_class, 'image_size_class' => $image_size_class, ); } /* --------------------------------------------------------------------------- * Return Breadcrumb Style * --------------------------------------------------------------------------- */ function whistle_breadcrumb_css( $settings = array() ) { $bg = $co = $repeat = $pos = $attach = $size = $style = ''; $bg = !empty( $settings['image'] ) ? $settings['image'] : ''; $co = !empty( $settings['color'] ) ? $settings['color'] : ''; if(!empty($bg) || !empty($co)) : $repeat = !empty( $settings['repeat'] ) ? $settings['repeat'] :'repeat'; $pos = !empty( $settings['position'] ) ? $settings['position'] :'left top'; $attach = !empty( $settings['attachment'] ) ? $settings['attachment'] :'scroll'; $size = !empty( $settings['size'] ) ? $settings['size'] :'auto'; else: $bgoptions = cs_get_option( 'breadcrumb_background' ); $bg = !empty( $bgoptions['image'] ) ? $bgoptions['image'] : ''; $attach = !empty( $bgoptions['attachment'] ) ? $bgoptions['attachment'] :'scroll'; $pos = !empty( $bgoptions['position'] ) ? $bgoptions['position'] :'left top'; $size = !empty( $bgoptions['size'] ) ? $bgoptions['size'] :'auto'; $repeat = !empty( $bgoptions['repeat'] ) ? $bgoptions['repeat'] :'repeat'; $co = !empty( $bgoptions['color'] ) ? $bgoptions['color'] : ''; endif; $style = !empty($bg) ? "background-image: url($bg); " : ""; $style .= !empty($pos) ? "background-position: $pos; " : ""; $style .= !empty($size) ? "background-size: $size; " : ""; $style .= !empty($repeat) ? "background-repeat: $repeat; " : ""; $style .= !empty($attach) ? "background-attachment: $attach; " : ""; $style .= !empty($co) ? "background-color:$co;" : ""; return $style; } /* --------------------------------------------------------------------------- * Breadcrumb * --------------------------------------------------------------------------- */ function whistle_new_breadcrumbs( $args ) { $breadcrumbs = array(); $output = ''; $homeLink = esc_url( home_url('/') ); $separator = ''; $breadcrumbs[] = ''. esc_html__('Home','whistle') .''; $breadcrumbs = array_merge( $breadcrumbs, $args ); $output .= ''; return $output; } function whistle_breadcrumb_output( $title, $breadcrumbs, $class, $inline_css) { $inline_css = !empty( $inline_css ) ? "style='".esc_attr($inline_css)."'" : ""; echo '
    '; echo '
    '; echo '
    '; echo '
    '. $title .'
    '; echo whistle_new_breadcrumbs( $breadcrumbs ); //echo get_search_form(); echo '
    '; echo '
    '; }PK!yC< < plugins/timetable.zipnu[PK `Q timetable/PK (Ntimetable/admin/PK (Ntimetable/admin/images/PKt(NWeO&timetable/admin/images/ajax-loader.gifstL``?~XXX]vmŊbbbeeeiiiO<1cƱc<<<H\C\ ABRKRS3K2+rS2prUtЗ9oHVKª3DM2mv!ņ)5`@+cg뢾5: Q?$}1iE S5يNlaOG;a$CARO+V88pQ&) "B<(8rh 6LCSiPڷ8} u;f Wvd 07`di0dlWVfyЇʟ'h: ©q#iC--MB$%T%pU-l<>ńoz^trE-% OEyjx !ԑ`7D+epB\Cr-vIG{.d~{Yk8mwM꜠|(%{%+蕟E:'O7VTC[HoxM֘Z{|z{yVzё[P `A;TGV ǐvV]@dkuu # }!ݡ%IyԈƉ@ AcvOhGC;=xRI*_c:JJ@7L&~5բ,N!m8z*!D;q$$+)G/[|4H>Uos]wc^D"/C#xyO#FeO{WgR /N̖I ˊ:afA~1ͣ腤WY=DDb&UҦ|l͈X=8Y8?Z5_PKt(N6timetable/admin/images/colorpicker/colorpicker_hex.pngPNG  IHDRH,Ii\ pHYs   cHRMz-RqEf9!'VIDATx옱k@ƿ$fbA"I'FTP܊\bp ׋R@_Mޏ}^$QR"~  x !nx vCLȍwfeL3kWV+XwɬM:EtZ Cj` [ah2BC pHYs   cHRMz-RqEf9!'VPIDATxAKAl⚰ƃQj֘x1xP ݃! H)Ғ/Fnd=n7٘ Ig0nfC`088˲@aqxhE8#qUUq5&@ HGx=f;FT*u{{ 8==mcVt+U&$av~j}aPxq}}}`n&U6Cp:;Z>r~~\.{D"Q*uW&d(tϣvhb.00(jƲlOOi7e. 5zSd2f=,qa!O; *wqɺgQApuU3 {X( \\^Zg60kkkJp^PE"[S`lDBQ.aeY|Lg0wFRw||mڬS;@ @"cNq^]UUZ0S~S,r~L:)Ir]F}K0^a➉F]#<F5pk\#F`&Z]PFX)]%LI҇RGGGIh L#PTh5VL#uaJEEQ,˱XlvvާfmmmE0W}gg7770z76%%x\#P}Z=X]]* ͇Dk6`ii"T O5z=(MF#FFtq$?-kگO2hIENDB`PKt(N>8timetable/admin/images/colorpicker/colorpicker_hsb_h.png PNG  IHDR>BC pHYs   cHRMz-RqEf9!'VzIDATxJ@iRmkQjFkm"S' .QEv+ŋxMa,^F&ΰe&~3h4 (|4c=8VyÙEQH!T*I.tEn]Q‚-4:7GF􄻓`hXsH[:??v QUg6tMk͇H8l& BDM$@Reyuyr < aaf sL,vffe 9LӪ&f XLsppPV@{{a$Eܐ..p#;;@1H$aQL2+V% w= 2T0\d2:z,H$244>;;kZ###fqlTx8ν`dY! C777X,6077tH<x[F7?%)!B7FFj#>ZM|VfJ΄Y붥S펾X(0}ySj&W0::J?--I~rBtWi6FjjBC pHYs   cHRMz-RqEf9!'VIDATxAH`_jtUm3-kWw  ٫ǂ((x(6l@vւ0ZiSjjvh&%ܾ.''}fZ08A҂N :Zq#Q?! àGGG|S귬JKkqhh$L&L&`+>gyyIӴ^hjjZ[[ օѨe{&#f2`rmmm0^zXwt EǏx|}}P(HÐÑvϊX,, P(L&ftBS__N6 BWwo$̮x@Q'-,,xf4߻a$_(~#1 '8%J677LNfYNچa+vAp S\.Օt IF1$i6 HWӲqvvvJ,qVUx*,[0 .eY oJΧ3q߽뷷uZgFm5i2YJg=M1n1wQYtkD@[DIקX a[ !F1"ZDjk%xٶmfftvuu {D]WLEՈ@ (jAD+ᄁ.ID@#Bzݭɶ˗vb[ɮUJ:/_|P/Pd%YW'rZ%&uuZ3H~$I{zz1U^T Jj"P볳0===11 "l?`>::*(w"H z>okkQqqqq? UeǛ\ZZ*^T5ֆaEۛߗTFՊt5m6e%z@Eo*$ZG^0J+zz'̏F\iIENDB`PKt(N2O1WV8timetable/admin/images/colorpicker/colorpicker_indic.gifstLTfd`iiş, L :@6HIݧeb te4lq;W4mbw7}ܓdePKt(NSZx(s(:timetable/admin/images/colorpicker/colorpicker_overlay.pngs(׉PNG  IHDR<q pHYs   cHRMz-RqEf9!'V'IDATx}ˎH'O;8n]ݕY=%G N:(TU36w/3f03=;~6w/W=x1/Ǣ ?wZݽݿ}/cfkyOl@" NԳz1yvq 羭ێx<wO?_W{z|Iـs^|nn7O?d߾}/~hffmဵV玁 =*}\ yG7FrV@t|Zmǣ=~v󏏏[_?~x<ڗʉ'o lrD֎BY 6xlj[km[k[=E#Rs~шR;|P}۞gn;ׯ__//ׯ_|X00)&g!'^IMa$ FA9A0cN61{`rw{<X|>}vf}o_ׯoY} "m"[Ơ;DT.Vx$.`"4ԙl0B߾6{?" 5~Gh}v(RTg"NH*| ZÓ5Ë#zGPfr׊xF,Qv5@5ۮn߿~}|| ~n=ffZcU5d+-눎tI()@1[!`uk&d{;aېLh]S@*ҷoǶ,P OZHRse882ޏGQ=ffX5ptð$]ua :DKa誝l=϶GvۮNT?>>LJ=x9bM,J"ꋲ1G|ysax$Е4h)@6nT^"1b# sd -@jGd}Vv~ St}}w{<GhQ*TK"Oh 좗vӶMFzP5 sSȀ J.hn7Q@C a&WuPnnXvnfqd>}gލpD tG~}amAܽp (-xK422%ڶ"iT@}FF"a2F&xhY6"0n4kk hE EŔ'2NU'"JG=+2xCJBL-Uu 糹{[_w nGC[v㱡E1>cP'ODmE82h(̃EQK: E38ro?aKUR贳w H=wngvmGGO3ӈU`Xf!о6pLUm9eyG$&N;kX uw;` =k;,3XQ R," cRQ!)O)@31&g 4ɻlLOId۾@+w}gfX{rv|h*_T4LݡkG[? 8#Ho5_wO1,ns9)1xH]C 9a3#[?x,V ;+\|)5ђPɑOR+L8JBC1a\1tuA܈g# ĻC̠Nxچ#68[Gd8SL_)[=>@IE}LD/dZ2H&Eܣln"5"-npFζSZCf.:Pl@ڧаU`]\Y-PbXD.9OuX756a1t0EdR3{cblXƹD,*-& y@vn-LX썢ՠx鼣݀  g86=O7wn%вD g50d%TRJD";AqjYpV^d8*Z@ Zu( THx6 Rmst#JNl7"V5Z8T$腦(DFkc*# RacZܩ-pSfᙍJ:Ej%E49LY!'}, p@@Jc@ ?A7<*]5t48cB,U-`3 ל3*8M<#09H];eƠ! wJ}+*7fg y2!r#DπvٞRNM4| ߇ZꤹyPP9bX@%EdKDc8dQАȧPx- w0cIyPpgǧȆrІ -3 E 8R$psEVMQ3-eoATh Bc c@z< B@吕i׋o K`"1 W(ςx<@KwLJ<=NI_ @?&Qc96 Bz6KljRkԗ1bLchzGzƵH ^WB-:E/^ҡ}2A"'*<( #"ʓ!z\WTh aE[*Id5^@mǮYrǸX eC\1Џh8MQ!fA6e*3ͳ ߝ_i LMɅQ{ƭ#pQYQ4*E1m:6t:~Fd":Dwnv#ìGl{G+XnSǁQLE=W-2@lAzRmh8(N/n'Kt4ee h鼾atEKJ`'ECFlZphEٮ4V%'+, !-= /28z I]j:լw*-8']6>o\;M$)Ts5|PǾ`-FF.`K1q=XL ')ZpM1l#:haV`% r1-R!;{AyHg@oZ ^ +D~,SV n8)D&hqmI-1^͠"WK0\)]ҟRB?* XmP&ӖFGA(=-qS7OR<3kFs G_&}hI*5Mt02h!w%~}hU '25vwWa)wI7:z܏XР¨}fӚCW;j/SӟxF>FEhDTDͭ2)rC F,#? FmcX[)JªalR |Iwx,G݂>K(2+\wDGeEpй텓ԇ9fwqo @<+[&Syo.VJg Ղ:3v"a44D ĥ"= t++?:i嗒Ɗ",]h#.qRVzDf4ų~g _JC͖(oċ?0rU%Ub!qfU˥=˨QD3~=rMѢze[Bs$a`g85m^\[ 6n'&KeQ Bډr׉N-aqQ (²HDԊ LPe6zgl!3T~@g!Lp%mKT&xq 8؆.ZvBNwwvij?")t2Xt(Mh0i k*DLpוJ~ קcPMp1J|ײ¤8Fdɢ該Eb)b@8Lw$̐9O2솓>"Q{Uo6ANEgO9X΢Rd+ g=dLŇ2 |,271uXLbf)+B#mFOt|]| ;􈱏;R;J7j>yf BQD <#`7A,>gbr۳Yb(!+OŻJ (egFwB](#j+N"]4>=a?@㠮n oՋ%D|JsֆZk0Jڦ<͕l |b5w%{d ;Dֈ} hENnJ7~"(W+^UDVɱbrb_ThrDwJ &_I@fsԼ5_xmfS-yc*Ã+'NL\-c4b+ڠ>7Ґ,MQ!,NYx< -XK!\p65g(@N(Z:8w-1Ȯpe0/wuМQtZ0~nUc2FkfF=@kE50sYOLp$ *ۦPd-Dq*=VȘ2S%{= ~f(ΞPD{E̳wMjL8EqvJǙԹɈ~_e+ь4%TCl{EO6{u0?0Bی5 bE?Զ2VV ՜';XɶhMv Hc~ 5&B&:`{PG*#^^j?(17E*Ex>%̢dĊW)Q`8 Ep_)+ %(3xOВj^"Z-҉ qv>2RT4|-0!u+T@%QaxʒMep-0_M-1 YODeF7]8-iwl26H'ꑖ,Yuj3wUF_L&:;~MwM(]-XUOǐ%`j!iB*ꕩdCYa_"y?IYBVylaVXlw)+ #V ;8(ȟWk'&+Y`F3"hFlϫM&̎!g&@fTsX+ 3KN|Mh7 hqxuEOz Ц&a& r0#T ͟i)5kN M^^2=֢MO2Ė v1TazEO(ob`tX+sTdkB7Xb!D'hkfٜ[UlE&fdV EQwOξ)-4Z4ϏZqiZxTvIy>40>ܧ"U"Ii+D'>z[6'W:(4DHhehHmM1ۘ"eO7aIZXzۣ6Y-j9X(K,itqP72UfžuRAj)\ UWļ6e BJ4)V6t2 b*z^t΂wJA=ve-Wg>OfXKNT9a =>4+)LPZ/YetQrh益^ wWT X3Af(6d9k:Z=&ZbeЫcbISYR$d*yѨSEM}ZeǝdzPqH_5jH! g#Q*{YDǷMo(`{/y@:.ɨd1Jt}qߡN,- 71W O<곓I!agn?'ﭘip|ȶC,6&kUJѬ|/53( -G٬$_^.Sn{EMZ\]PBGZJVeBPgd (+QیDDbה?!-e SQ7ZcEBs55Hg'M% 0-GQ)}eĪ@2[i;!@' VDP9he*kV(YdjIXp nd/+m\$y-"@EdRg]} S8Gݤ.W:Ӌaem? eVߣD4XIʀ0/PFyrх/_hSyytXӂwپ!eVJɕJE'.k*27j.(E@g|"+a g6D?W6Ŭ-@፞"A%0ZKWdt2D'".l` +l-JoW,+lEMHQU5' t^ {̬e+ 2Z 4_&F4^+HdG^&\w|6;u=5=JzE`̙>Fr"l #DGU谪T.%ʺ]Mh,J{0KQM}{!:ƒW_PHeLpMQUZ:8g|a-)3+ӶfV[.,MZTAT-/dboj݄qaAy2c M RDl2EҤi}f)jܣ1+~^K,t)R`8~<)5.E9x =YPb|W({РN'+bmauֱP_W{`) W5FY$_)=3oy||9t2"`XDKgT#Ҥd$[a2oa@zQD4i3 Ue36dzeBޮ *!H}e11|L" -(_udK%/Pn8-QqT8I/Ae"M&&/G3:V O#u 2(ri*LY}ϙb+`+gM- 2Xݐ Qk&+Wz+ؽxRձzXV*|aPxSaEY3ZP g K_%FhW|J#}e@ _fxiu&+uCVOG)8J8UM>= 0fc <,i`³fTZxU\8QK't!JDH\.+)l@\"bdWځ^޸H8Qh!BթpSV"Bpu/V(}` 2$c*\LC3:{gPNiJ@]tZ@T z\5=R{!|Iy%bV=գ);Sd9´Up-g *^y>g_/]o]KXKMcUQW{f"(L|lNhsq˶7:X.x kwfM2}hlQ칭R*(z'w0K<2bU>WzPUwMѤ*W[*MNWX*ըSJ:-nԦT}M|WSy %jMDpt|*₶\h, T8)@+/_4+\b7iZ8'=;q;YuP juLVAN^5]? U9ah)x˱ `L-jXO*yV.·j+ݱ+ @yO ,֬oXFh{x +'jWȗjһl9~V7gHᕈIѰ,ZWZr@>Łm+d|>=@zsgj_ W+IW1l3?}HWK~>_ox=){zIENDB`PKt(NoD8timetable/admin/images/colorpicker/colorpicker_rgb_b.png5PNG  IHDR>BC pHYs   cHRMz-RqEf9!'VPIDATxAKAl⚰ƃQj֘x1xP ݃! H)Ғ/Fnd=n7٘ Ig0nfC`088˲@aqxhE8#qUUq5&@ HGx=f;FT*u{{ 8==mcVt+U&$av~j}aPxq}}}`n&U6Cp:;Z>r~~\.{D"Q*uW&d(tϣvhb.00(jƲlOOi7e. 5zSd2f=,qa!O; *wqɺgQApuU3 {X( \\^Zg60kkkJp^PE"[S`lDBQ.aeY|Lg0wFRw||mڬS;@ @"cNq^]UUZ0S~S,r~L:)Ir]F}K0^a➉F]#<F5pk\#F`&Z]PFX)]%LI҇RGGGIh L#PTh5VL#uaJEEQ,˱XlvvާfmmmE0W}gg7770z76%%x\#P}Z=X]]* ͇Dk6`ii"T O5z=(MF#FFtq$?-kگO2hIENDB`PKt(N_Z42-8timetable/admin/images/colorpicker/colorpicker_rgb_g.png-PNG  IHDR>BC pHYs   cHRMz-RqEf9!'VIDATxO@_lQ DJP6цx"ƻwc$Dc .Q^t!\ҐTȩ*-P;4KdNSb``i0[@4](L'& VY$w %"^P՛C#kz}xxxddL&sppd;ТaeH$R*ǧ栖͕L&IŪe4Mkөyp qH$CCx 0qxu˭oo%IRh' .f'B{*㛛<7U~׉+ll2dYN\yJC+,2DQy>[IRųs].ğ@_P,NDkvvv8Epdha i),>>>ʲt:{{{m6[2LRoPoviZSvT @|7`˲$8UJ9Ym_/uJm5ru{<~ϓϏDtG0TD#q''tB-""QTEZDE&[h4'i}IU"E}C]DiN5 >h}^jSvֆ) ?OLԙ_"`4% IǓJ%o5& UO"`u|h4*WD@lllȒ\_.XI ^%WB~ XL!E5IzannN3$7"Jx!0Fҟ /x~(4K,IJIENDB`PKt(NsG/*8timetable/admin/images/colorpicker/colorpicker_rgb_r.png*PNG  IHDR>BC pHYs   cHRMz-RqEf9!'VIDATxAKAeckX!K "* AY, /URQ4mLblt˺&At1a g6 fǑ6-N d2&J'I#QPISD].WUUO6j).B4߯'$a4x677s\ p:sg' /xh*0ժ8-U? b=^zvŢ~q8fekky bjSTul2lW׃XЏ+dvDeX-Lʙ\cJow:^\?ON>ml:β>(drqLg7FS-#p6};4)4`KOOx^绽ՌbY64-RZ[[EQLmmmEQHzUj(BӑJhX,r(VX,V5& W(PhU;s$Ut,FqQϞ3_d2d;| 'ocW? H Llo#AD"*hO5BMAEQyonnc?P%%5ӤNEQi2>ID?$2bZmȬv;D30P!K2M|@M$(T~Դx/T = hLc;;C!}u`0`P#_" ?$קU/(b}bbB߈/P1T(%06&\YYQ&IR((-Xk_" U{ǗtsĐtJG0~Ɛ^ 9A3rIENDB`PKt(N^cGN9timetable/admin/images/colorpicker/colorpicker_select.gifstLffPĠ30Oiΐ~ 'vm77k7T-* ` PKt(N$:e9timetable/admin/images/colorpicker/colorpicker_submit.png'PNG  IHDR,7ߧ pHYs   cHRMz-RqEf9!'V^IDATxoTǿ:duml(HmⅇIH3H !`4V*(SˠhƱc;qiH*Av+9)ˊ`})RVGFE8 t\clhtèPOܶYowGfߝ/),<ō.XCjf:4^>zwD7jWMTj=nI67fn-D:8bp V7on|9cO5iAdB.BTi&AlM*{\_-|t] l\,7 ] L1CN$D Bi*e6fCW""$Ia mDɺnd3D·Tr<8 O -YKtvڼj"UPWWc&4|P$i:Xw3SIRԸ ZJ-Z2hOBf50.iCp%g90:W?rHEڤ,uk0ܰRP-d-AEM,S z^v+Di3E_E2\oxJ5(;DkCWgX3Fgr9s'RA]=+/{/V[f ZŲUii ~v;JH)鰎/JEzpr:cXP+p !Btk)[!MB sDiy4tfOSUS^pHz6oϠf{(XDmĻ"0Q]؛o'#[]X!Xav({oB u|0Uvzfc ^޳'9k 7V;/F"m洮,ج/"D'9GTF\IHl –vV0k][0s9>\=`, )<31=r#¹ǚ%OSkN(ʴ=.ҞԔ~8ic܅0/٢y%. ;fǩ OStۖ3w\6q+Q jKUssVzt0ժ%_p]hh|Z¨}|HT^ee6[QK~7$CJaZL!O"&q񮎡&JPз'DYb23GX,0̲bFA]|%,ȓxѾuPKt(Nyv721timetable/admin/images/colorpicker/custom_hex.png2PNG  IHDRH,Ii\ pHYs   cHRMz-RqEf9!'VIDATxKAǿ L"<Ea!:;<B!P`F +mcmivf7TkwPbшt3ӊ5Z&3|i#x2cا{Pj~UUQE_{Ṋ}O ]j&f2ws<2YwQJ50B #$1RP*x0FpڌSˏU)w?t`vrbZY>BC pHYs   cHRMz-RqEf9!'VIDATx{HA;wz^(,|$>E"IWA D= (RYETH F8-{폵mnoFwcv73ߛgO5bwCR,2#Q:dwbqH' (HapHWn)Mдh-ͪB YQ:qK4ܴl)n 1QU8 $ʷ[u|9;'X `X#[(cԂ̬wm1 *ܖ=:mxwÇJ3Rhz(*iaV鼪\CS-."6^UUNL0S7h^uL k#Y9dWHg}LEy!v_4o_5++)eʲK#Ie$ cpJ_ΜYLO5"u9#?vY/p{&qTTV%'.,,,lӧm2PtHFüJLYc_Ig`@HAJS*􋯲tJGĔm:6F&ŠQP7y@|LDcwȒ ۣBwvZU*վ5.TUoCzpDwO@@$0$!" O q1&˨ Pfٝ2%]o[D#_"@HDñ%jFD@ S*ШIl"I>\<)D$)k"r\P~ce0Wk\>Ε~",Ӛޕ%aΝ>n{ "; ={_)k"&a|z-[| (C"0dc5(R:Aͺl7HRIENDB`PKt(N.3timetable/admin/images/colorpicker/custom_hsb_h.png5PNG  IHDR>BC pHYs   cHRMz-RqEf9!'VPIDATx]HA3{)h"w ACD>$كP/%!D`ABDC>B! EEyznsm{{]gffo~ ٙ13_|m-6ڮ(/=}$I@a`B{؋m㢘߿<ץTMT,)=< ~f.g)ItI5.-4 ;qq]=Fot\ǝdX'26]'t%k9դiL#`#wd7ItF404CcTښ*A#PYQif2u~ek´~౹tqYh5քpV#`s㲺J["MQi*F@3FUOFwW+tw"U[D{S`86{i\#Iׯ݇oYx}K^ߒh舎)ߐUltfK_Uouqz$x1P077Goz)F<k_99tIENDB`PKt(N!~3timetable/admin/images/colorpicker/custom_hsb_s.pngoPNG  IHDR>BC pHYs   cHRMz-RqEf9!'VIDATxmHSQǟ{6ݚX1-{T #( ?A/ dE!aR}H("!2UV[V79vo潊rpv3Ξ=9iv;q a>^DZ| q\bbG\xR @0z4DKoyRnNNq:5]'eـ.<߲e}!)\a¬e٢gך6.2cQdtz}nwyyynn.;ibz.08}JI8: OhRUU5/-o٢WSPuuXЌ46Mvܳ*7=appH c08 Q yaZZYY{J6oojFһ 4-ixUZZZ>AsfR%K8gGG^"3Ljj}(u⌆iM8 >!T:#=MI"8~]ҍF̵Xq3v\RLsgB}.WVF]Q"."]Qe˗*Hd*3JD"a*%\뤈TX\(7QZZZ\\@enL,Mʋ-'m흪$fSD`vR'Q㵚uOP"yGeKhPcXrVS+bJt : D)Dӡq^KDD>'3GwW%̩W؁/4hE?ӳ1 fPR}H|mzoTߎ'.ߌDh<.Zȃ&H^ %ڑGݰrGDs${LjקZˈ*G!]g9' kIENDB`PKt(NDWV3timetable/admin/images/colorpicker/custom_indic.gifstLTfdȹ 7A' #g`RiYyz؁-] [b\MeaX2wM$YPKt(N3timetable/admin/images/colorpicker/custom_rgb_b.pngPNG  IHDR>BC pHYs   cHRMz-RqEf9!'VvIDATxkHAvgz}PYx]J)H"oՇ! DA=>HeaVTPA)0CqZUwCڲ]7C;̇ٹٛ;S =>[&jKMI>a.uh5苁@t߮ې&طIQ*tF*2fm4T"N 6ڒ>؜ohk}>Fjt\-CJ~幺@`i:ip‚_Rt> ! wӨYΚjZˀM:=82,#8=T/9]Ô/Cg#B> >kytq{=V~zoCӔeC+W3V$޹ٙA}r!β)/[8Bj籏-ٹ l[SU],Xs.OFH/nؘQ? E"M=޹4b0DIҾMhW:D ik>zzj2l5C^G%%+4HhwI'$!6ڲl_ZJ7֪P(]HUZdx7=:# uY,F@6lh2e#dmc5,.Q#;swkHz#t,Fp5T\<GE(ypH|;\x Ii#s1s=sхڣ\JuO;5w9yk\#![M/=}߉@Zj+ɫt+ ]#WsD~cj$!Ŋ_gBIENDB`PKt(N02-3timetable/admin/images/colorpicker/custom_rgb_g.png-PNG  IHDR>BC pHYs   cHRMz-RqEf9!'VIDATx]HSaǜu(D$7A7vXYiid Yx!ieARt !I#77;];7B;x^yy6`!'}n^Cv zloc:Q ƣJ?8?0 x$?o1pP}hCӧNܟ݇N1\KgHvNiڋ] ʎiu& n!hLjT:jWJ<dg ~dg|ئY\ZҪXf92|gsCMHP IL׫$(8vvuOb"efuxtf/;WLʖ<~SkGt FU6rtb[%JLrDIqE2טOP=xb_Y"f5[A1aK_5N;DQqBi~|KLKN^R0#Su_O[}tQRZ^ޝTնz!_&7 OC?Mftc#58cs~URT ̜9a`bfN'+9}C@Kҕ @^N&G{" {"@" I{$lC"& R͠x͡yJz^~&Ё\'Pap,IP%ՂuP%3V[uq^@Meѕ 8vVW2N^Mk:"Jyh40,[)-O]aA5>׷qF^'4w%#K'#DΑD`bfWݛfGU:yZuD"=)TIENDB`PKt(N3timetable/admin/images/colorpicker/custom_rgb_r.pngPNG  IHDR>BC pHYs   cHRMz-RqEf9!'VIDATx]HAvgӳ#/1X臌f愹pQ}>OD,ן'(OO:=3&wǬ}RR6 :n t_|>rN#@<qvW@~Ud cϹ͎zR6By#Ǒ1VvY4u,q7F7\1lF F7FmI#VeF` lx~ s8D1XjՄq:cXG8DE2yRQF"MMmX`47jqZp4U#@ЦiK5puI?w}g^:{IENDB`PKt(N4timetable/admin/images/colorpicker/custom_submit.pngPNG  IHDR,7ߧ pHYs   cHRMz-RqEf9!'VkIDATxodƟׯĉF-EaKAKӺl7\ 2&6:iRA-JW5ݔ~i;'..HkGͱ9DXҰ}^X:B=[gXea0 󟷈'fgfH v"IENDB`PKt(Njf-timetable/admin/images/colorpicker/select.pngPNG  IHDR$$gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxJ@w7zIR"\ ^n~9@*PκOf 4 CW迌E}fƘʹRI~ݮ*?hH$]f4.(Wń ' 8ZSp6ˇN c"Na<4* &:ֺ Dd2ć </yķPdIENDB`PKt(N_{%;-timetable/admin/images/colorpicker/slider.png sb``p  ,L@OEbIwud`Xœ%/YQVRXRYx2謧cHŭ7w x.Y=KhXyyO[ՅstZ};nS׶V9mK4Zhp=՟rO{tjDƤ&2|ךϱ]`J\!SMk㳟:j]ny}HDv%C:^nML.P`rLmIE'c*4Y))B2W'dRSGcɂ2|ZrUll.=vȳn a/,Ysp޹zry 3wC;r״`ȡ^f~_bf{/Wnە_8{%sixj0fnɫϯzV]-gks'~>{TxyUxwӉ'_^;*l \1_RsWPKt(N)bztimetable/admin/images/edit.png}SkA]xn,d7n i9hq;itw݉ D[ ԃP A/gӤ!_7+sc8Kg*(7gtt4hh[d c,*6εxF]Ӻ>+Gmr: )X˶ϞC`[ \SqӞx;W3-3g)0LrqAЃЖw ^HBFSl6{H( ABrJdVCjYl&P|≿\.kHR!AǥFt񁂆ӷ=j{c +2 u]t@?:u<8 mdɞؠį2bI( X]Ar ᚸ)Ex۶d5K鬚hD(I))]H8jl;إՆrc#찱o_V']XZs) " !xk)g{2ƕM!fZ}wZZ<=ju_?_軭~̵W߂?]F88s՛PKt(Nptimetable/admin/images/tick.png sb``p  $?OR%%i%E )I A)'Sm=]C*n-u@eoϦz)l<#kꦰ5#us\zR"NP]uX]2bf\|WMAoǡ{.hMW4n?/Q@+<]\9%4PKt(NBH$timetable/admin/images/timetable.png sb``p  $)׈ĢTǔTԠĔ“6 )!%>Vz 5z `c_QZg~~%[pS_ԌL*d%{; +% 9yVJ`slXIIQ E zf fz&: FFFVFV P(%* jgQRR`_^^Wn_ohii 2HB2$B7XfKjqrQfAIf~_ZbBn/bh@L"@P@?7W$(5 ʂTҢd`|)#Y_5VEHIqO.M+tUdX:YZ9Z.nΎ&035t5u21t44t5v4u4sr2qr603255+.IKND5ʹ(5$($??2K3 M3RˋAugjQfYj[Q~8t2nfhhiijajlhjlbh` 7s3%rBL}?Y'5_áScHŭ7 ϟ[~u׷_O~j`(%eUP"jke*z).!UX[&쓵rzns?~uGږY76aԛ=/^q6k)>m￟^k7PUW#cٓTކ|kGZa_^閞1?nOwr3VsLllj]Ui~*܁$7O}qʁ$UE ^/' hq_e~I>aޛv'"Nk;=v3꽦C[* {;o>o/'8k_iчfWWx;'OsUFIG Vg!N] dו7֘f֚H>{5{̾]8I3eKn7G.J6>m?,drlKJ;iuqo &r OW?uN MPK (Ntimetable/admin/js/PKt(N?+7% *#timetable/admin/js/clipboard.min.jsZnFߧ&k{/Z 7$.]`PHbCϨaW5q(Qv-n`ùۜs|C=3s͂L~mɷv4ǿ8+yĺ]${.8yUڐ{ӵ?2 ǟ,[ZPDjl+)enC#7&dYQR'fmM"HLф 񐞡STT@=T3cn#qPђ}G:6cUE^OctFCKźjb\ӡ]ZDRN8-D1 󸐖<|ZDLڊEtck #ͯ'suRm2J>xW39Lxo;3ԏ&bI Vm_W7/_]<{^Voh 0;'E^ak:vLNܘ n'.n~:= 9n 5g$’ЕXO򳳨 JЅۋt ̝]cmDH(؝dY58"HnsQI쐘L$*^Nڶʾ}ɫ 8ѭdÙ`8j+#`„)m%52t_6#lY@ׇhNWJːNh_TMM6+=~=f~5۶ނxVYgӸ^W|"R荱M3NL Z~87ãR=x#+yZ1nҏ>.8 Ș9=O9o*/&a^yDn\O"|TuXB?YNבLpJpUGqmrJ͌ !oD"YhMuKr󧗯[IO\=E$y* I^2Z߁>X$ cQP5:A79]<Œړ1R,=DA` "A8Y9ҀxUfwv( !B 4z3#f]˩hq~V(*)29 wˣmzoζbX'$jdΜNPn' Nd6p) 1JT [.aBNy8fFdDO$MJ'l452n|4 %#>d簡ԔX {RMt&I_X)C,;p8QX,HP?'`3R@'~Ink{]"J1gIR.>o5]h1hxp+:Pl",&IhfEP͇P *ĢR,8SpX \&1EsCRHXm-RupP(4tDöroţP5?Tt5ӥcAp;Hj -Ĵ 35!8sZ 8'&OٙLdF 1/gnwr3pYZ5~r2c) b]* SK!n6v? C+ }2EqqDiP)*kIа=yrUwE+1"a11ۂ?\Re̓ں;|v}xHIrZD7xxV`>07 9[[!ȧ:GE>^Vrnn`A``QX6Sгԑ+a@ȲWcf4дi{ՠ)+.FJ4?洬 ıȋw[`;X*7*GyFd(*ҫ \裥s)w5T~'Fs >>ͫ嬩?6atތN}pSK82oւ|E~y\Bf2&`WfJT[G 庪p0 *D{mp#ȾsAZQDRGR\[yxZK! ?":/!mQO:r遉b}s(5ɹMjlؗ,*g95'7 GQ!\=qv}8r-#䀿T#Ґot0,Z{pvՀړۤk=E$S8Ve!d\CUVq]̈́zIׁnw=i\rO<*o唪6$ٻn(KҏܬK Abx)ˌ`8+$G/iv{4a-SA0ؽ%gQk'FjҜzTC&v*an!ު|~ &gG&}QѻG:C늱Q4eϐ샐zHC| 9s*[YpvWnK= $D%uS:'CROyM x23?ƌ'k` ҋXX$͎|@g$'u~^Wc=4f8`׉H+ pAֹ5HqS/\]nY!j9핶Iя77`t{痹b~v~T!Cئ뛬BƒF,fQjM-WI/zIvs5tOHRbZVQýw2%*u_"_ b F\ MMC:7444)5z W5VVV4u^:[:{3bm29-{E"24avK~IU\rPB]|0DOZpӡ+ڲ7p,.p䄮7 c?ZTE+g:(zo-wWRfS,SB32O!ag''C +Ćq23H] b6Oݯӯ@M7/ny~&PKt(N2"4q3C!timetable/admin/js/colorpicker.jsks3=pV("&Leb%=c7x<<!@{/rN3c}9",'Wycrӹ4O)v && aE$ 4茬MIP;3)Ǐ*aMn?ꭽiB&@^8|{7o M/}u~DK6 dyY6ٛPGş`EΟuŎ֊8])nJ/W9otMGMDELF{$ Mُ-҅1%z$&ek/mx d=h IupMߦtRP(OW"摇(ApQ?#2= 5 S/07Ø%@8>יyg57m9h=ڋ,`椶CekBO /g֣]tNP관fU言6L7ULee[u3_҈N$L0pYf}oi&P ɼ? ?QcL9 ٘ ]w@|^ųp$ {C/4Pm01!C' HM ULrEm-@ZG'#EE}Tcs,BL^ul(@FZ4""Q3v81ΉeitDV_}{6!qm$ՅLɱҠ|< wr`꩕!$n>YkB- K)ionCaEf-zp~הE4iY'UcYڷmC"@8\> V#M:S5E$Q/RK6S/ۉi-'#`qW2nv"Aҝvn?@'R*^5fek-K5@;^BmZoX T&&&V$@fR63ʘmvS[Wd)J3qLWYT\;%F%c2:z7MU7u4 Weju>[bPʥXh4&U΢pYVcq~()M,@6tTɿc7 3mzl@5)m)WV>06"X Л3\%zRn)L+B5]>9M^{y_-(0$kEl2ru \%=9LX2!fJٺZ [LCd IPˑ@D]$4Ly٥>QLL E JpE9O|vDK|X*Qb(#x. JE5NFXjSN Cl*"҈۷jbtZKjɬݶWDAa8YTndq?sx%RmI Q̂ Q-ҷgI.n36ٻ]rAxzr\w_>D[nLwZvkG}6Zm} cZ옕uw_tY_6Mu[ Zi W~4m7 >n@&iCC,6I@wx[&Y "A` p1 d) oF\ urrP 'UIp-%1ܵ> ȎJ_n`ȳԋ7uoNvG'/̽T (6Uk`nY$5֜HM1=zfA̭jVe6RxM l6FiZe%e5iL.,T,~ۘv8˜$ndG<< ]RyHg]D&Y\]䉵epTόUmG`]a䈲L7o:yTE,  oV|#±q*)qȸcy9 U>hE\/s+CjV!Cyhs}Vjpr3{يCOc{ F;t-Tb[c' /'sHkBB_.nFOItϏ᲼-Z`WlgUqEJ; 8.̲@R3FY~勓%#IOߪg:obGZA R-=޶422/SR{Bn煃]u^ ^ܶX|ݤʱ:?;>:X o%砄&Vrʸx-dրF/ZQ{Tζ~ۊ7PK:mQo!%timetable/admin/js/timetable_admin.js]ms7,W?#I)RR6{TV|wpU5Dff(Yq߯3CΥڲ8@FnO0)5Ѥqr7\ly=M\-R%9'uu|Q4qt1|2t~E:͗U4d4_֫Ph..A@6bUQ"rgCOr0J"fu4b)ZUdUlˊI2c3 ,_:LV=s)W &YqɑhQD>%KcgL ͪW h5TF]Yn ėmxNhۢ>F.~jHŋ 4+Mԅ)_T_T65]坩ZI߀JYbTl?Oқrr.r\/WuY8H y&[QV2`$Ǎl@]PK =ԓF 9Ph[KV*+Qn[Ő㓕0ۀ-w-2`&ӏnKѣ{Ryh?Oq x=ƩfYZa?WX۴E0ȯb~ fFo8x/B[Jn&䴢4UAf@$kM!#:TiS}mM =Vi<"y/]nuq`B+ H-R)+y; D}1[XGQH5ŵZ@fx,{e$ܥ/Y!Xߊؐ!`S%gqUG#]mA㸦+"U9"_ ζePrɗb 4?h}hd1Qc~ =aL|]uLȐ4ed0r)P1?d>?^'imG&aD;9jmY ϽLarU$w  ڎ Mt5mj5Uj4%d~Q4tb4G' m?JL81:L֡}B,H}]o^wHNWEq ]# @ǻ4tڻ/H@UYZf9XB3 $)db룣OCtrV DQ3V83\0Ng`dϜC8-Y*<? wJ0~EDt.pO0J?%m/f*% K5~S)TP}bY3L>޼N@Kj;W*PsL#$c⑁\uG̙Ae_|[Ś1,5v˴8RP5C%%]ojIVX^y\"YDЄVuaRt)*Jm>6A,Tpf"a6 fu dXɒ, Prd]- Z;aꑃWRO9dYqҪ6R_)VkpZl`~қIP٬dִeJ59 _\1lv:l R1aW׸u\0ư$l:>g0"9ri6&Uf&Iմ46 &ۖqe0i>MdFf2i8ӬK-m$G8nt&3_#ƵkV3E X?ཐ)`L>7Ҭyl⪦d|Poi |@/OߦqP0c\}i*xV3ѡ7;62hA7[ANs\pp7IjkPfk@W 7,N^+-%COxۼ?r`3nc";љd)mZL0>*鉞).}.}N͹/;#K:F [#]a%\@KJbF\DПMՀ|6xzp'=?V&ItlA"3# 0Gc#9Fj2\uMBP ,U(L]"!;r~tF^՜cS EdW?x0"Hٓ>Kꇲr <ӸZRu1:glqmFl9XӷFg]!^o2*oY2dy*1SZ`NT% e} 1\IrJ'l?u(.=9fTQe\+qXL[PҶ7Q㯫=p0Cde S`F}cQCMOm*C5);ft\4tʧ焭!rk/Щ乼5T>,$&R[dW#IͰq8\{{ElWI|DG }\nӰGm~K:48B! Dz&]^-…mpGLĊ }{|BI~l*ZlV N흞zz0v+U,X]~ZWxW2ժVMu9k>kˢX]UQ0T?l1Eh\mEfLiq(a+F ïaW4Lbסa!0d|mwC[P&U1V3ƞH U;ЛHL %n(H2BZkh7^3?&\2QpGUxNv#sF5n 7?f/@?w&JGt[jv@Xaة4KkF!,bU臌%qZxIR䃚0^Qh%dh.GҊuX`G:1tm2j Վ YDq!j ٢OzГ'}B}{wRsWZ3{O˲(qLp_o1a$V` XC5JC-^.c£ fY!Y*UdŒ`m*|͂&g./V&?[Eݍ"oMm*""Xye%CiK'MOFj@k -}vgN Sǰh!LJ;MrORn~h]i"Z3<&?FM\Qh 2m]myew)-MJI.od!h/'zS{|򤸝u-O8^9\7Z6=i"bF j]SҊ\eBym9&7~o'75C:Tl=UX#:k&+؝q9}FtV $f;w iҁX08 xawoc)%?RY1&%+R,ГDنIlpgۄr}ͫ1܉ Y$6("l,@!r=Y_NW4TP? ״Niլ0z^mFjL--rU=l^ BP֙DQb,i(<|z_ƣ/eWgJlII7?|WA"Q\ 9jY:e="%#I1oKs!^,VӉGFe[al&\ć|{_^>{2edJ#!cQI}TGqݱ*K#^N=d xSWrG\uSEu51&v}~60Oeռ(p6g)9 ԉ{o~gUepǛ D?ߎDS4e{~t13Zjayeŵo ŦNuI 1 'ӅIM:&jw%62&cY_O~κLȃc;w Z2b ieͩe5SÄ́s"9^"?-u Y>cJσHiI 9=+a/ok>nl)2' F.AuGX׆=% _/RΡB $?w5.g?X< C-^E|b13|xdža.wcc| [r^KxBmAchf$g[K'{xWa,V'׃ߐXuG?:adOjwO'l,'׃ߦXu] ЃAG<x|XH>f{0ALЛ/eXPk6/Y@^ Rfj͸gI뾜"]0[O3ʌ 2;-2GÒ D &ZnCFUb"vX!/AZaYǞg98ڭg)zA_D .Z>Ts-ԅl=Sݻ,\@ubm.z[ķYFp9.x ˶?OiWknMROfiop#P-jz8bBv( G8ivҴzh9aG"[E|9|\rV;$#gVLXidSij@(հk"os>f#)o %̏K3T E^:lvgk5GLi_,mcbBkڛy}_X #.`! tmLeM4m< ~2?޾҄U&$t KtC4]?Q詓p^\+p\ /"O`˺,Sog`E![.s!,k RYv16@;tnf_KeW[vP?y5>UA`󛳗&|l^Ǐ˔[ ]ŏ!J& >aW&|@\dS$2Z4=Kn\%VQA,J MNU-x 8+K зݣvw$ؙŀ0NVy2oL 3W4‰TRlB@ӆS+@D6 )T1Օn/j_ s'nD8g) 5|xPoao8i+}QyZXntLBLۤ֎1i˪;{>:ca({ D$L_y4 {쀊O*?))G݅[ӈJPw MU@h L+:qLP7uxm'[t{h- @a #зiMbQT}ꬫ. A4(z5ǸWs ٘")LZca\lҤՅ{j]JY߁p7nH\ nRR؜K:s`x3崨.OBVt Es”nn B ts;H涝LJC'J\-NҌ*E#z\ȠuE'dNnO//_8ĉ>iʒMcjvd/^^ Nz| ϺѨ\O´D) 4 G9~<)0@1XAܡJM@32zqކ8ꭸb|iI m|1ܟ0R2]л/V۱+=|#OÃ~¶enc[4D|JdZGpq20Zb^륛ܳ&[KXUVJ[h6!fhqP> CRPYVgqɬ6 kkJY%)g\6%tO..m?Q$hrHCh3xTu&;CQB3r,DMCB̥lrsRP[UU n nOJ~(F V jLVhۂ'\$XQspA`Uu9?&0D\ \djM\0r_`~ ׁ@2 =X0Q &S# U ]o|/f OI,ԲE;XdDÅ7K23$k-EV*1G N Wl4|k{#p,zSu9!ˑ2l${wd٩u`PKfNT1}c"timetable/admin/js/timetable_vc.js]ksl ,YQkY~lҴVԦ$ΤMp S‡ 3+{pq_] ؒ8RGwU~&{<0:^{DAk%9^FLu's*|vvflwIFRt4\ᓿ$F&Is? ~CbD0OR%8X`-"9iȑ;ȜM:E0^g•?HrYs=K]Z=%8WJ)ZDU\/%QؽZ8N=ˁ/c>ÄBI|q4n%W/ؐD[4Q4ꤦп?rMJ ~lUZ!P*=C[b0ˡQ <j}LQ>,rbr䞃C}PV0> GL>ru贋nC]F07YdƑ|Ac+<^^z-daZLK |c4WJ]Ecvz >◒8tJf\3%$i.hne{ZjU:rg?_h\!J *`tqP ơB.+QIW#u_p'ߑ-3Q7V1aDUX?kj!vY;)>l cWe6 @U=;Q]:Χv`:Lb[+P0>T@ h͌%4f.}s~" $(\i`rKegj 63m|$]UGС7 RqKJysks3M:N4H舊 2DU :KTYq|>TnQ׉YZѶYΌ$Myտ-$BnZWB.4㳢$m0i>7tmB:-0%ek9>^A|#Eb\!qw ΔCi*6iLZC1}Sdĸ, |ޠ5m6cE=v*\)uiֱ5Ϊw>˦Gu5VH{f1@;Y1ОGj7^l }@| KY(iZKz>IYMRzU)GyOmepb3 Z$]iWaGX=F ”0JJu-T#"$Ne.ޥFWظt]hUfIW5!(X,elTi hp`}OW̞ ;I!]01'](i5XlFPUr5+peW7!z#Ir8 Hv';ꘑldx'&X_!; (]\ z~& M4oi/3zܓF [m0rzS#YiS$>p8D/cV$NzW]a7 ݅Y23ysfg54tRz%;?)ʻ/=beUmǚ]߽;Ɍ5fCv Z5zϷM/F6#qXeTi؉&HU,b{fF-@*Gm~=FhMO8uɆmu#C􎷪 Aֻ+ث\=1J˻X}᧜Rز&:c˜ Me@~b9ʫB4cCK:?YJԀ[6c.8$^cɆWsz{SpC00bNm[VV /4Fl(9lų˲ =g˖5grj8Μ MX%R7=uMYJӣ/&F]| i╆-f?= FéK@o^ΥzϠRٴ۾e>'Zy-=lX-|dϊ4hz pXP V,TI_.Ҙ1lf˞ *q]U=UIy QLO!M*ng>YS7d}ŝj*{C69{-}Yajy;GmvѨ c-p<_U7cliw8wٵ-VQ4I֬p =HpWA (F/Le 6*U%k0OŞK^J鉦jЎ濆i)Wgi٭)tc-3 eТ AueP~4@Rؔ= 5ވ6V,8_^cx Gok/oGzTe ¼L 6RR/RI$mJO{۷ 0*mZh} $v~(?0IxETΟ  D4U\B"BcZA-fiDjQLqEsrƤb3etgD ;(LIO=J2 /Y MD?wCK<F Y}bZ5|]R ED,( 'ډg([)ίQA{MH(!Q39jr޼jO|`V`{޴}'@8ys01ƑV"ѢG:ez QAO;ɝ1-oiBSWb Y{@DУ-Ks)m)a{ߌ6T'jG~61(Q-1$_tPT4Mj 9^p\0`pfk; Tlyʔ-)tܬؑtDqݝP)&x)vnrj J"\6b| 8::C#2^a:pCˋA@Cq܁-xxÅW[߈5 m{'^rasiuҟJPKt(Nxjtimetable/admin/style/style.cssX[o6~NَBF]n0/0IrġFq)Rû! pfBٵ (r@|oSsAՠ[I94(ڸ(5)Z|JDJpx eFP A@ljB0_1$~؋Yr 3ʳs!?kD*TTxeΖ?&d.T` maW%TS)#Zl(J%{'%mZw<p<:, Q_Qc_aS1a)&3!ճ;0uf3jui¥ZhOcyԷbc"`v^3&]$nV.:/N`L ȫ|>LekHbh˙gKК.6dBTMg}^e~]U-gYOWpP^v鏱OM Dܨ wxo'w˺$v{M!R_ RTkT 8Ѳk&ݫ^ Qxu0$(CSQ瞡na)¶N&nfˉc@4,&-O~7$f<; _.JHY wHKυcOZ}HрXH Ս#묍0(9y3X<8~N[g=G[Y3 W(HX q$pΕ/ ۭ=&M_&_C5F ÓRu/7PKt(Ne%timetable/admin-page-email-config.phpYmo6 +-E ~X̀J-n)3_$J&KtN{YrERJ (RbR"l)Eg`ATpldz**#xZ"BAق,ḳp 7', KϢP\Y1tpVp>c"ƅ͌oPDˍ=}rAj~S#1ՇpOa .-[CcZzF/c q{5p n(=`MpF3s2'x34U`f´"H}qr@ū~8nSAEF;d1|熬ӒtCbW,c˛Nk8 *AJ$mݛСBL_-'k| H .(NP wp[bs*5>-zO8M{ Mg~i>*o*S[RTq1<Όtc#ݠZ 8]w l;7@8 {n}חqca5<uVQyG@Z}od/:MkjjyqyA~>\7+ ֎ +{Ͽ YD ΖxOQӺd)BB;rKAXK%J&.S,m5uZdvN7UהXJX0Ms i/n*w8AQq dS@#&&BWf</edē듧:0j6V]h7)+L}_mzN4OCPKt(N^C(timetable/admin-page-event-post-type.phpUn0 =_A mqO>dݥ( %m$Hr()N,I@w@|TV5vF~99.JB͍u$e<ӭ}&ŚIgA+m45ozC}Ipg)_e)BVf$veVrQd^/?7 ZU͈%@8@FYݗİg2<}2fXS$攎A0]2V 9 |tG ]Xj@RQieO q JڱI^={ɒj%;Rakn8;JePocc 8GL9cAڣqʜx?X\f̐[Ly9Wi/TVVSLFeez-{pXQ`5{MB(Hvu@Yͥ>PM@*ɦ\.'p _nse+_R?y7ΒZys/.zί}*Tj4p-b$S:Ƨ G P(t  Mp65@+:>-nz@%R*1qF̥RN9h)aG0 ^E VP&VB/heFkn%M}X&<9xoUkvwE*z Td1V6!rp"Ӫ )RTewȇwhsH'5p2!. ץi8rxi-^rrsB@qѦg4nLjq g@GiP$m}a*x&Iq(Hl ^:ׁiJ</__/1{nzP-Op pZ-i)4so)8 HUi42񳣿&McQ+(OۊTk8D[{0H;7/DLa5":5802hP/_QmpD}1^Ssp 1]zHrfS1r0&g&1S%rdGWbh<'^Ak$'KpClX2ayFP[[ pq3uAQBRr@(ԙJS4{@镎ѥjOk`X&;?QK<H=^Lj]tDŽLG&X)ps&9_+Gg k8\Z4gq1d G0)P9Aﭝ$"/{ouPPH> ʝdWɇڤ}s+&24:*7F8 >b:yɩ)I41%%Y^xRk]t Y޵+xEYoXlfe(9WMVk/f6R'U> 8岗5]~HFO{bm%ڗnS(q:q MU3#ٕHeѕJ8x/xV?N[u^4cgڨ+Z$!z4crZOYŏp%W`Yql=+wHCo{d`b|%DK8o.e4ַ.ųmm FAp]N`j^=uBvB2d-V@Ad Gg=Sos8O$s b=b6L1à1^m{`R';~G~,O=c>L;zL ƎQBq㇄3neyݎx1``2^Mob혱Lm;nñ#]FOif]/vɋtkTեDKCmbrii`{Ɛ_:SjlRH1y)K̎p);EKVFɾ_EQ%<[{)Þ6Q("/MdK6/gY(ɪ˾%c*t>tL"]e*`EvEt|0')~CSaHn~ YGXBUӘƞTC 0G$P:]n. WK51nxsg^b]fu[Y82lSD~KWvsHE&x`煗H2I8`Vba~KE#i7%+Ljݐڠi/T_]3B~ӜE֍}?sf +|S Q 2 ^VB9dU8Q"<,|*[%L?tmCN֢QA+ |,%?ܕ|J> [dAM*X1v%o9%$ܴGȏ]|pJ>!=v%[ZA)xؕ|li 7rcW%$ܜGȋ]c+w*腫,RnQڤie+ ?ȼvȖ>d0E-QI";s֑̅ͧF'ٗFtydthHz+" b uzOB!Iڊʋ E3S1/C#m)JɤY7W, ZB'z3ՎOr 35%4>`PKt(N4B*timetable/admin-page-import-dummy-data.phpeJ1S Bk@<ۃx nLfMv }$yP:B|u5Q0#5!^*FGp.(x_+̍xt k]ªe Nsq$#~ba}Vwg)~Z:Vub 6bٺCjf]NkUG" |n#: Gf QA xˈ)J6RTb>bWWb3Vm7ڽnI][$_1AFLcH'mPKt(NߥEtimetable/admin-page.php]ms۶ T͌n$ֱqM\۹; "!5EeH$7St:<9A<8INZGCp7 NB~/\8aG[ǃ Bn]wK=ޑĘѸ*[;/=~=.x08iJ;s_o./˛+oo wҊ(WJS;U"inm=[Xnh1+~_~ɋwI'-̱r||@iBPUF+kҵLc}oʿAZ[^I2,#LL"?.B ^@1;B! 4q>:؏n_pĽi=IIz;!#q& Rp%bp|o}\ˌC'ɞ`7  c4{ Iʵ /yrG~Ddl%i)hĠF.ܲVkL(][(ŒcţW~W,f40 An!wcAI!ngqa.h@¡FS]3ΎHg#0w.7t; aIObPީ䶷G!{iN=w>]2 g;}"g{lp"c LZ w<ãsC<$Jc448:nG]c D:Q=0(qYO]CWk<Ŋ•a4Ic5|Cfipɋ[G&~أxd‹'hWfLL %(ת(09]{~c!iIfX:iro:PNK2d$O Kc̴y*24h+ E4qR|uKq߷{+եZJfnQ&6kB:W:Ife𑎔v]MRX,hLHܘds};<+obIZE^A.K/!R@]y#[W%ud<#1:;K1$K̇1K93.zOn;VWO[|Fɬh@EkbF4jPwT ~-mQF\`ŀ;+$p4JOz+jT=څ6-9MxVu:D<ΟgWҁ {܃Gr˝P<ّ9(ԍ $Fðv+ُÚc+q?`QLXZfjzfd1fA<3Śwu'.YQ?G8f$V<:{p=5Ap80a[( gC!gT48ʀie#w3L6ic9kL %5HAWo} 5쁪u@B% "Dq,,s93BfDI:2hAB4w'/gA܅Nl~Vˀ*"ߛ Lp()Cos˭%`tgg/pu׃l(9b~ۧv_'I H^6<|uCG`yUR;ޓ뒄[^Y1|ʩ5 5o}E+qba>JDd+Ѝ+WOdB"oK1uQSt&΍Oƶ~ m$ vNqB,U Oz3:=Y#%abR1Nh>M48r>$u|h[M5?b$?0dgf;|XsK 1-?\ {L9sֈv.X2 #ԽFJ^檺;UJMJ,jijfUTͳey^0!Ax >)*iU՝/d#^E4z6v)!Y1^6˓,kN@(8X|򆍦^2{ әgY5JI5NͺdçdlkJQfivO}I;?"ABCxZy'>LO]|"LY}(LN42N;u3ϢH*X또Ζp6W]< cI] !gV6L(IM4ϣu G뒈cQ֢Nд)#)kܢ=lsdgݙ}vé_il6 @b EVZ]Q~., \0~̄eHew<V_ ֥dȕ?s,2/9~{MtBTl<KW>㷏ϟ>ݛ'8Oc<暆p/#Ã" ?"{tFe~??>}zJw BߎԱ VgeK1g9K+ !qLMbڷ[Qcc#~tB}Hbi*.{Gb xH/ެxU 2dbs ZJS1靴~LޢQ;TRNCOܬ8f'\]Ci4\VX#- !/ ao_aܞ}p|񪓢?L:uf(A)ğPK (Ntimetable/class/PKt(N(#+L'timetable/class/bookings-list.class.phpXms6, TTƖt}4M/qsp@PS = R6Ӥ".m=KI/F?s ׬*WЬdGu<'5I\TJ&l<QM%YE1l"Zʈ$GNstB"wLhvb벑Aj;GZCb>-_c4}n>E+fE/xdѢH:hUZ sXzY#S'E֐G0q ,^^LKq\TSbG*6@xJidZ ;ZjvK2Ȋ=+`afRiÄnN%q!#6%{J%X $`3pۇx.UBaBv 8&\>''{= egشRUsuyvlŒ.-+ B}։d9d-OWͧ/N%gݿ UFhthA-yBL ~GLgI&&Qӂg%\ 輾<,sQ1;PEڰ/@ۅ[A1ˣ*t(SQh bbTJj3420[qC)EFK2EfBGFonțw_?߿{KC{zQK)4J[HsXwTĩ^hb@ny]VcE9\zGyA&Hf;KY"]r'LoEAB0#e7LQ]]c{9 Ӛk<]Tt&d_dԯđn9'FSu 9@Vՠ]{Q'uS;$8̘E!SrXʌ v ڮtUoNtN`L7MziYS?}mߓ ۙ,g*O2쟦_S]agmws3dSg`zI~PJ`wp<3f Vn;YLէ\B .z+ h-ٵӒ}ď!*JO}kI@7.VZeD iD̟}Vb yBPky ,cJ35;:8{#\ (F!2Z,Ok~b (1baK=wjK>vӞLZdPA!A/!]9B9(?Vnȳ;0*oi_{nsQj(|=q< < ̹s8?PKhsP23#timetable/class/db.class.phpYmo6l 6+iPf㪅(m$gCQl1PYDnP俏&w7p߂ȧ{neEiw"&tN8%ΆW홭g-XXfI܅rT_e]x݃ 9_?g.g)k@wFC>%=G ==%Ϲ*B=;@W-i!Q̾ȃ)GL b 93yF8 ZI{t!ΠeS[KMH˵Nϐ&=GI2m_۰:fR,KӀJqQG/_ gPKt(Nl]($timetable/class/event-hour.class.phpYmOHl~6ږRT…S#N:UUjNТ*]xH!g^vvfbn3K`tt31=/;by&3ˁz'4(s50Q.l<¢\yTjt#x"o-|%it"f]J碘.$ֲy#&7Y;bš{MYf33'pAɓ )2M]qA7d/_2 ~Zꀒgsؠ>S.fwaD?y+s3/YvvW9*RZX=\<;`ErxU l\ C2.d /g+W<+D$ƑJeBTFwoe*EJ7\u:Fg)/'_zs)GY"enգ. M tA,kPf} dC†& L_dltjmPm 6l*gPN5ی1c0LfC t@FL:3Vj%nmF,c魃/c7z)AK&-y$lk':8 Z6|.LjA#tf%lX-] DTB CGĒ@3j9(a!EDa E`MD]` M6ȝ'F']bQs,pP(%_ҝఀXN5{R?Z!uQ[\蔫!-|}Dl3W)aW Yܠ$F".2Ĭ @69+Xv`D1Pk)=BX΃(-~0-PAw\1FBAg t~rC_נ%}u:1r&W7_ϔ>ۤ*dn4=|7`^ȆWL:xc f[f)T-e뺥tZKpB-bʘ@{ %R~ fj)2B >ۯJ"7n< UjN_s-r.G H'hwgnUF#@^r!Kdo0qX Qߥz=^mQ¾r,hvb<( {qm+ DXh%l,pxCjˤ wϳRd[ϑϕʔgg<h5ѪBZ{lJs鋤 Tϛ3dK~9i(AE[5XͰrV[.u |Pg]٬YBqIKj Cnzlf7ճ$6O,kWA7lp*q\h'jt9}9~8_8jxU}?l@xB l%GԈ)7R&Y+/by~Zq 52^OS}bW?NSmcf7e^PKpxSQ N} U3)timetable/class/google-calendar.class.phpr۸Y uCbgLʙ4co+ͤ&aDK3$zwәՋHqnu:K76O3zjNġm|hˋy8Iʢ$K*/dQ@8NڽGkV7Yzk)R0 Ϸm{"w!PoX]1 % %(^fө<ʢ9:bs0pO\ޒ&a3P!j<$`s;\K" zQPF+t$ @|.N=:wvnnn^O#"H;;{3qe 0א }ȡMFӮn299~:0uOGJphAERuBt7KIJopwp5%i4QgC28!d &ܒtMʇuN0O(/B6vfI sg @pQ ]_\l?6rhc<] EODw+Eゅ>]ѿ- CZ ¶ؽ G6>}>J%Y, 3U֠|*l CN>oɀ3L=Z1sG\_) ukf5}%'7Ln : 'p9`ezOc'"o{ T82iC*!!!?n@=/7wAd ?c_?=]R;# o4գpghO*`xqAQ*f_J|UVV@e6].e٫d\'Id,m-==2t; ^}ęG֣j(+aefD^Vm=?YhG)Vra "2|}"WPj7uo?]G7>pZ\x"^~)c{)#N>i f?O=toǩ! {_SrԊi <4ʸ|,Gr|ԋBWW;9R K e3Q?sn<&rn&4pEF_k joBr[]z;mryIy?-w89ۄwm9E/j9HE?va7aYqgSo E)p\^9^AsP%:ΠjJPT#`\ v[^Wŕj\6!F2hɛyjJR܂_D1>. 9+h$'#" )x|v2G??F?4pKBZcCjUyv*\Z~BZ~bOwZx BS"XowqRW2y=1_XY27Mrr`^QsTZx_yYb( pj r-2ӨwnPKt(NQ timetable/class/post.class.phpU]k0}v~٬3f-~j<`[I%dӇI$OG^{tͷdO&` 㓿C]ij>8yh ae^xGl6ohO% l0-yL"!,}fh[Dľ[f;=EG9.7ɖϪT0];A 0z듨ͳHeklATiǔ]t$pv| mEXo3q::dp;],C`swch y4 [,Y]%aԸ& %M"&zOTFZyK~Nl5u,|FiwwxjCR|N)SCZ+SH&Iwҹ!prFy+3wС$~vYOӧqH=ej\ƫ36\؆*s/霡cBmXlֱQfp.G5p wG; `[muG6-Ezax)~Ƞj=u:ʬUϨCYNICf_;~ +YN-\_/ ?_S^Kp^`t?PK|Oe x%timetable/class/sp-bookings.class.phpXo6 /bJA_6кik+$X(vZMَ6vC7؏n@8G|EY-.`.FKGVI2KŨӳ4tBN-qaSplÜ} ѪL g$Nh}oBEdOn$uуxް@ıA>wJ~v$!O痧%=$QXn}wCwG'86v,;9qn\1"Q:^@Z8JPB[#R Ry"s`I{6(?l4JpL+L؀0T̆0{GBxO̍fB饘F]՘WST {6M0op -MCgziYT$[d2eYF) ԌG7$ ;94YsUs!o6`O" O˥,4U^$SO$r)xM^c*sBbK[cd3FF0 @r%Ftl͝͡2vS>S#O-f5SMQ[X*FFE6Jh5pbpz)It茝Xuurm_og])`TY,Yȡ#,aR.Hl (0XR~b7 Y8Y CVŨ2(I $. eD=0y~ ͙e&nÌŬu`$7#l rSC~D]]^VTcv)HҌ,Vml&#,h_RJ5X!}MAQn`EGȺOCk2DH %_ ‘y( ;:0kb TWKurRUWA0׮;;`A*X(6ueR9W=A6`>[3~h*(`Mb$I˸Dj-,/ 8}O??WL5 M.^>kMɽ qw.?XYQӠ(,))n,WחeKs("!]HYFrnWADb>I8$$z% ʷ\$|.ӭ`y&!+Xz Vɦr+F`?.{ad%O>y/PKt(N{I!timetable/class/weekday.class.phpŏ 0SAO`"^=6]m!٢EF |hb2#Uzo)@'&ޤUX0UR #԰$*ڝIۇZ^1׆p~ Ƥ]0^xm0hIsP*[nDGZ -Nk[2)ʙ%dGV6PK (Ntimetable/documentation/PK (Ntimetable/documentation/image/PKt(Nx,timetable/documentation/image/background.pngSNPhyeIqv.m(0LB̌aVJ=ThOmN!n$&^F> > cƅbbl]7ⅅsͱ+Ǎ5g߅*.SKۤOnOz4Cw'9ti 7YsLNg` zx9tw<|_,;xn$16V<秧d1!.(2׫s y+:TY&I0( b+" JZ$P Jɒ&I.<}e5m(5á0,CjCJ QJ#f((4X8 @~w{d<_Ǝs8JR37HaN;1-cO0u:52o[IZ[ qDγ?RU rT !VT2F,qUI56R"d*ja*(nsS`Cj BI: 10eD>yqI`?ZZY-(A U'KÞs Ui;睝o{{_}^_}o?ӹWsK[O{gF.qwƟlֶ PKt(N酧1timetable/documentation/image/code_background.png sb``p @"7W) w'ud^9l>!_|ycH:݅U,,f`aFYs$%wYy%- {8p\ONPQ`cbXg:&PKt(Nf!,timetable/documentation/image/contact_us.png sb``p ӀX Hd~$K\#JJRSR1h h>5֋z6ScHŭ7s%Mscܒ[&kkak: #C2O]ALWJK/6tTs74ԓ{LsoI',J+dz!OzhfzGlT'b5mm%%=+Xė_{u6EWͿY"|FWď^)bE`+me ]t=iᒀ$t2Uy馂ⶄSb~\X^*?3(;z{,5:` QҞ:fo66~ʦj.IS-Upk/ X' 5AK2m,ј+w?7^wF@[ya[N%]V=U+5f\LkW9_tdR S߮꫞x? +R5{+oR`ٵr&zey?=̓M:;Λ!Pٽwf[O)+hob?aǡoi ?H,f^QWvh] xmsI($E@.\۹!o1I ~;&/seԭV3X TV{sJhPKt(N#"Sm(timetable/documentation/image/envato.png sb``p  ${R%%i%E )I A)'Sm2C"J"|}sAj*r @ƾ 19;D!)5=3VJ )JᦾΩUEU~!Uɖ)Jv 6V@rSK*rs*lZ a}%l[%"|RL t  Mu t ͭ @ h[QJU. V)J_\X/(]d.Pnqe^Ibn^2̂<?1)VI y`~Eb>B__Jss᪋KR0T.,HJ-/-JF\2HssQjbI~QH~~,2K3 M3Rˋ}}rw(oAMW=;<R|c'!["nuLQn_ 2:4Q`ׯ?[+yرcJg{>쒲tZ_c{Z=wn&Ӯf*٧o߾{bZZKٛwn\`3^mS}FN^޿05M}K2{*~D\_vΝ;]!Z}k\yvvںjnM8L4uvn{5?~X0٨i7,Lbx䬡_W(ִ * m5uuuպa~ooə+ׯHI9"qz8CU恖{?a~?;>{?Y6DCOFFtUat]agwL#'EሱGz9PvoPddh3!mSFËgSUspC(g' a@Sy}}/8E\7qpsPvTg xk ^V3Pg!y2 /i8/`Ig*7P,lS'*<{"vB5err p& ++(k"4!rJ`Y- y9/k! M% 0 րh‘y%8 #${t@ÕG.E1X W` 7=1(,Q ](o++#4rgo1Й3ʯ9wS:(ϳz9م t)c{l@W#_o@tvrl')tFؒ3( M ;Wya@}837{ 7/^{vtQPҘF i.*CEsJ$f}qO M,V?~-^ޘi|û^|S,^]l$bPEMLV^ H|ᜃ] M:Gi,R3ٯfŌ*o;>e#L gudC}d;"w||j2C[++ کJJe3Юj]'LJ7o>,-)qI`}`hMK5սM:D$w~wvxhȫDgsN}7@[ZjI3 ߪ´ߩB™&5zzA1gIV퐩άTU;6PIԨOR$"WtX ^NH&MmBPAH?CY ogˉ,77Rs"nszy}<l= *.d1חq}1u@AyRII60oڄn,ucn*`(~vo]rah(:uFtv DzQ^mo[3.`:adܲv%ٮEj#fKJ -͙ow!ik-#c=H0B<0Ay>Tzo%Z1fZvކ/TR` neEg'®rHԎRAApv=ؾڢǛ̑\QM ^ίTI"oSn]^pbˇz}\yEV7|N_1?H9fHZhLд w64S +׌ٜuW|u;:w6|V.S MHVh $9-`5!+pd Z3-x5R Y-0417:a0 W Np)H #BYx\k9ЎOC@~;on3njٛBL,XK*D NNl}@F~ nmIoO8+_Bm~|F+5$CV[FRsEg`AlΘ>xKΠTmS62MX+nPɌVT2տ%{$w2ǾV ,b~`A=ɡN睐m^=Vy䄍B}mmEĮ..pz6~җF:@@DLBQ=$ٗ#-k39Su )j6񛂨4 Ķ4Sةk,;L{!4pAh1dsjm))AOMu&Igzʖچ*;!*W*^Qs4K< Wވ `: rloЗq|rмST{UWsu8ԩ:MSPIl -견٦jP؏| "(я&R(3~5%s"XI\P'.6/)n[K $b->!5c 87r}pМb;b7eet+w`a^ae+\67Uw}ךV|\NSSEѸ{'Fx}u}&ׯL&A#W7V7Ѝ`|s-*rS#! nEtmtI칍zKue{ʉpќFV큥wH{zy>E5Q]?K0j Lim1 |"̼Ym [Jd5kfu>ޭhMحK+f49exvhuUFrgYQq⃁I쇉tc2â:#YZڋW^-p۬nRZJFlFlA'YLg׺ O s([)##V/`otYf StBiᎱdb|)$V۩b@jHjF+MkYenk6:Y8U{31t|: "72n!*=0P]-:_cƩrzah2V@|!iYp4g/&q߰>dYo@*2[;on㊗ s%@LTԧ~$;s]ќvXKzl'`1:y-(1QIf֊sO}#N VmK_z+?0]( 1Kqry?N)8d| -t%2Ro#o‹7eX Kx8\A>0?#C2Z-I[@pÇ}Q=>AURJ\l[[{GLS^l!3h2ۋ {Sd9 ؇YjX{dC,'~,+e2gu[͍%x|z@SȬ>jVzʙނXǧ֧R[ V8%evw Y#p ˍb~/O;Wnj8W ڵrFk.ߎxi,fàjLe '!%Kڻw0&LIVd^ M>Ziae.< +w\9F~t :iQ>Eh~K|&e6bX$ .uAc2\zn.T5CƲ=e&hO'P-âAǎE_?HĈZ:s$';OqbȌQ-뮚)**ؑSlDA+9*{[Vq//u|RZ&Ưz/;M7܈2=V},Af٨#NͼP#!}9d_2Ȑb䇎*_ [c>QAOLFP7pKHcco p \'DWa"C[p&p RPCJE$~Q{2,=|eCGgg!=瓿Nk H+Fs;aMKUٓG45*t A[n tX6ݴW.KIGM$r': Bz{ C&FAa WaPKt(N#)timetable/documentation/image/twitter.png sb``p  ${R%%i%E )I A)'Sm2C"J"|}sAj*r @ƾ 19;D!)5=3VJ )JᦾΩUEU~!Uɖ)Jv 6V@rSK*rs*lZ a}%l[%"|RL t  Mu t ͭ @ h[QJU. V)J_\X/(]d.Pnqe^Ibn^2̂<?1)VI y`~Eb>B__Jss᪋KR.,HJ-/-JF\2HssQjbI~QH~~,2K3 M3Rˋ}}w^³gY~Q|Rڼ/NYrI'Dؾ6FyS߫u?~bYXu%l-. R`ie?|w1I5V[.Mm;*3qS|pd)%, bYhW_pAΆ Otr_2}8a;²o÷ ^glq]hm/Zy6Dj5NYכ|rxA'ǎ3l?[rӼo3X󃕻Ѿͬ}Aa%\ߜjz'w✕.tqp1ܽLw*Z-\-÷ ~o+`$~ +rR/CsoS~aق{%mOW?uN MPK!{SQЮ#"timetable/documentation/index.html8bN8ρCȂԘrPjZ+DFNb |ԾJ6GCu= <.IG4tE|BJB! b¢'@UDy g 8 A:OizE~?bY D njv0:n Fw̙1ءFÉJi Lhj !Pَ`TVBP{Ȱ*hFRB2#):z0F.ئAJBY(AQ~2있!36 c  #47WH;@bRg.F]`YJNjOxN=0hn LS{O:b+L>8NE,p,"g- Xj0]vڱ<3oy vL c '+dy x9 \p*;NP { JC0=ӎLNp q7!E8들̨(NcOX-L g茫) y+r$V 3rj yB e` RM @DHx{u:) :zu\%&}2s?L*,ܜ4M@` 3XElr:%t s]7ys湲,pc$zfٗ}D-#|&|ȑ!٠30)VkM 5jG^#wSH逗m\S䭂JYI%jCM!'DӖ/֝YK0uϠRx ֘navbg>E-{P3 sԄљ*c<~.F6vs(UKihI|︛ X L$1IYx$g8dRX$/c2ENJ"my9 ( y|fa)pkiJzP; 8+c6$!a+OW 4]ӴhT*tZ`Q&ޞ=@ x2%gp,a/#NR%WPP^\̗X .B`Ȭm%-nHxҭ'ꍅEWrVѸYdzo(ȗʤ?_n(:V"a? uӳ"0%'8sǢuni@ uF0 yC[&4%!Zn1FCrUVuȵ(5|\VBOB!Ż[g8$4u q8z 䃈F$K#/] h(7OVD=ꪻ `܂Ii$D<&êQS.I']? Ks|Ǎ99m3:M{/ΧTvmCw|\_TZW׿T= i')@!nS+Y'~jN99ۓ_/җr)' ؽY{,%Aˉ/[RҪtSg`٢cizY_[%?sHeKJ5qcndX3xY4-y"bЀ"ɭEB`Jb2%u&0#b֕**՟AF,O i%."M I+R&8; B]9y2 =P?i 6O9Nҧ2Aނm#Nա˅5 O! ; ՟P9Rh{3 ,p0+:F@NU`w0CCKZXT5OZg.}җy uO6)N:UЇ~08K$$JQ]۩B%7m©&SŭRHsuW?:jupr:뿼VvI_RQo!#C Ɵ"=hˆ՛PnjYT iU#I[1 y Z#|B꺺mTM~ڙ@u܇긏pXnZDpJtW~[ /w S.F/SFb.+yA.fQ^ްL`Q?ʍ4;.ad;J;Bͬu:$a!pICA"2 NnZ f`RAVs9L S+,[ WMeXDEjbz Sg`~Cג"ߩ#^(}42tKg [!t+"c6DVlơBD')|mीNu#ءiڗPhrg\ѬEe[ -@c{49TLOwA2eMJ(Ks1V.)6iNT7S;{4 8#'K {2p_)xs"Xyv09!ݹ`Z&&A,)NAENݘ.Wr1(g9X[DAz%S*,lceKe5G8]oշ&[؊UGq,=4= u;8ioGX|L\f-sOBݙ{/}W9L[照Rg1?vU ^mU 8:{DƬ}׽P7+n~*8"P62H=mа蘶q* s k[{H(+%s9Kdt3W[yQ|M{$ 8Q`%hcu)qto#3ƍK b`(;l8T:兹:H4NWZEJ ݬ,: 4arbI> A1ޯx#fhN3ytXtl^e^VݪW 7VG3=%wـ|]\찤ǡj^2ìMrf\j+ȇ7 >g+OiNOC 7ͣƑ:0IִRDW}'2`wo;Czf3( >PQbⶉS0diUIg 0{dgCd\Ʃ${*vuj6v}ý =Η"x%=7gGv}l7ڛ(Q=Dih sVkqЪm|Ũ+Sc!PS{.z{ g5r mQxXE1YAܔ`aJ]9?)<tuQoh֛uFk{;{B&L_60FE-=㬅̝ږC=H4i,]3R#7,`]Jce|j͖k ;zl]}T*\~[Z氱GzoYb{M dM۵6L]aǟD. ^_Pk0VK%x8kƻiq3NOo!ǯg&V"Eu:ɀľDU?oY`1 @(a|5fiW_GdI$NH;ERϔp%;C߰Oҝ%)W宖=30x~i0 (\ w[?Lz\p>Ws4o-c܌XJjlg 1KB=i!AX6 gW?)23 }v>eømDՍpX*WLi*tRdd݅tAr/,'EϒOJ_.jI4K0F`_Zaq$$~gq$M;|pA͘(W#Umz OWqZ> .EJ/(LOAQo0ʖDi1MUqFPojF*YzWe{,ĦJskbMY!`e UjuuP >c؈-HݧNWJ`^Ϸz3_n{b;[$G.|i("ЊX:E27SUvn^,ؒ*I2AK[/p!P(8^zДI, KoCf(]M3y}r{[=]:ߐP^]7@&ATsvWa9R.Ե] _ ʦ9"t=2qw^"$ݤH9 \YMߔ,B Ui3.a;zOڲn@"q#@WQm~-+lj$eу[>Qt{x#lyzscuS7\dxd_˥7ynJ&/3pdQp9vA:-AM*Zi=&D"eaWuZ+vw{,fǸ+R8m(]g+Ee]V^1WjԨ]|2"nq%uZ377&r+S^1P->ӡzS"{F^!&K!{TݒvmB~q]} o <sOmEmƯn3QϊM=$%B("yo:01!8 ̰!%2".NAi]}ǨMD>Z른=4e2V7 ЊG߿gt n(8uZ8_6E+@ z*?׋>;m+~y]@Kp;P5xJ\YmUj+vHu\0䩻ʻɅ.]"e=dx; -.|h"{v񙊜qIAtd 2ߜI-gpN,PD"۟n9ykSZblwwZhsy^ꮡvHWkڣ $v 7r^%2 S;bZgPğn_jUmVPhgw˵0\ν4i,R-*!d'KP~Y `}9 B2sϣ~3{QJޭwP+@1!ԄLh;nbW3j( a*բ#n[ RP!$~'*)8ES6AS$+k TF _Ut9T؎:uGV7FZKO+&);F?!Z}X[sr%C?ه ?VocMdPG>*z>^}ib[}1onI,)Q^ =iŊSb6(j-5.lhbF8*g]Rtݲzg7{i*!zΙc0D<kj0 kyT `J7kѭmi{ 4\ 8C`}h92c?`yy3/PK (Ntimetable/documentation/script/PKu(N$D7/timetable/documentation/script/jquery-ui.min.js;ks8~Ғ#IBQ9gZNt)>@E*$+_7$(j!&h4Fkv~ג叝۳zi ^@vg<΁=ͻ\8wt[A6lYzN,-XY!;u.n:YOqvԼB^+˧rX%,(,9 =}#ZA X J:?w/ͩ6=$^Ê ũs+=>p +ɉ3_ѹ3u?NNgzzKqq{~svu'o|8:د9Շ?sxHN?^T~w~"K%^UI=+Jy8*ZcBO*:jŐW>.Xu|t9YNFQ󂙮CÂ7-'xFh ^`^@g2UfyE(˧9 Wy$W\}V? ["f޾Q^% 36𕂢0"+bALsYdɲdM|{ljݵB*26Z&R-l-H*%={|vG<φm:߱%l|04#,"۫>4f;Jkb2u@V%#mRF,NI^#&`pXЏ))OJ|TWux vF"ӤťwiD F,oEUp cWTkKШo{a{?\,,/-|@rDq<_f>MZ v"o },&)'l20`qX%FVdP YfhiH#s%aV)d&>q:%}.]Ѧag< g9DhH&rftT" Qј&|vc ZVL`ZstbaTW/_ ".kkzByxXl D?\/DgVc w,xVgd,w%R9X&KaQ|+&VQrGT9:N DcjCk `wG%Tьc0z.i"%DF{Dtz`M/KqљbRyrQcѡ?`XLcNk"EY *Lf*ga *уC'x".FWfy#GLzZRm5aúx~ݞYB3T Wﬨ_H5Y.y-p1d @am!2LP^|Lݯ"vE1E m.)wLIu+eG]U~z->`].K( swXP@]| QEOOP].l31YfM|[[K׷DJ+tEeR{S [{=[yR66~kWL]X2_2Aq&u7)J\w`#Zlk5" Ys_¬k}\}G!`U$Ux$ +YT".~I%,"4vgxl?IbQG$^Se;Ĥ\_R6Rڰ3)I蜦ØN7xtW##qg <*4Rw2hSd!>:D/_Yka $3y 3LFSogw %M(W8AMQJD${ S&?JVxzlo|5T d&F, qvh60ĭ|`.׃;];Lo]h-.ROmOI Z0bY9DMf  ?0؀ mC88Ͼ;w1&JD$ )tDL`C"fN7DE/jrYxB4UB wڏ$ |-C4}V9CiƐu?r3~ϝ:͘YQ3(k~7ϖi({La+ђEu+U(xB*by|7`G'D"JB*ZdN,B- 9y' C-09':L^2Uɯ?sC{eҗV+ڨ 3M=D=V֞V{c{{aˌ}q={̩#52Tu,[hk{aB }.Vby zߝZ6a tfs Wɍ[j`AcRb^ o'%3_P^^ۣ)؉ި/u]bb7Zl(nI ]kfA1HNk786?*c{ٹQ/7K}Ve &=Q,uVv?_cE*Lf" "r.E" 6;^j WX5^w0OdBt\p xi\}SOo^*oe >lƛU X))jZRKu>5ĊoUF\O‡= >Mvd]#{=qT~jJWJ&^.آ`nT>MPnNa.E鄫VK2++e^e#+\ n!NG6MF1(`aA*mfȖˆ~,Qȩ‰o#)@cX .)l1 Wn`!̸&@>աYHb\]"H# xX}Fzvqj77F^{X2#݃B]hRfX?Ԕc>= \L{1H+z]|hwOO5lN1a6vG d/aTrkM/YVq {5@ȒCVX Cbp)M,?kjؕ9@6hƾh)Ɍ]Ѥ Y$'1>Hu^գ hpNK{ @G8/`zA&T$ ɲHCiV2D#52 sG1&;jV$$ VLFAL(Еd6@d[қQc221)x wXC 7-U#XkjvhX\^B%qSÇFrktH"_x(,0qۧcH=i8Q W(7.L 6W{>(t)uJy6m F\$p 9OKmv,5TAeJIM,-3q3v< "*qiļr@"F eOonv M͖B/9]å~]=DݾYJɀ[9ыWPxrF~fq R C9o"8`hp)Vª ." #Bސ [K`~̌uhn(Vg]FlM~ê ̪T9VzůɁUm9Sa[>k䫫Foi9d!ƌJ±fMZmtI͎_YnNld86^>~$j$5skz({s{+Q"=$M`@|#n(N,Mxq y{zȚF3l%^m)=ETE^ _UU53\)ZNtL ƹ^iXlG.E˺, 㕾n![bj9K҆{LÅ21*k XQ1 8ޮo3F8n= =wNrjXܧ_ Pճ/8gZ܍,`ߍLkn;~SI^&5ƟjzI8g۷ʋ~f-}^SYσ?ΪYe*[\XMdNgq3īʚ"&+>"ⅸU a:OA J6~vdwZ ؃$VcI03S5)8zːW v%Ë)u/ t "i8Ԁ04VG2Y%U D-{Q!amG44!ED|l0e,~,L88`ըq]W}Ma3eyzBB]NmD0QDaxCc܊sKŻ EK&?dM(}!-ȝGZZi=-I3HK$Fq,/\4(>ݍlmk$wPd3wE Iyޘ]+z#yFOta4p4`DƠ#D'X`P"`C / g!iטW~ZA?hJ=Tm]]T"1޸ٗ$͂D* (䌳y=yߵ8T8؊C2Į#%H{ n Ll6 A)Zt%[MQݦf&h.FJ/1F ba\!=i@32b֏O\#zwУ&wҌMg+pHx #!=0,J'ޗ,Krv`OX^<<0v$=4Sft, (Ӝ*<_.5$4 l{ww!bqvX =coW)$Òr+ Aiba4![:񩔺Ts\eZѱ4"ks%SPQ Td{,ڜϮo~6Ylr78Y8mmG:bdͬ^M&i3lW vӦN'u'e٫?~l+GO [3{K-_ +`@sflP@>נ{ϥ/=Rns;ˮiC~IY˓tfINz iJeK\p;fyʶ}3;܍d EkVnfCnF`ˇH=}ﻹ {`a· /_f?¾~?Ȇ1j}!/LuЙ50G>^3ZF~h5˸x=EiW=c2Rh@>6ycB9k۴P!fYL d6òdWѲ9yJ"!Ųl& j=2x?$f0ґ1vI *n/akQ>PwvEN'[XJkRn o(V|J}E8;Bۙ2T^a14[7P(-C o9fEЎ7ނfyW._=\ 0ߖGc0{%1 )r:͖NR:-ɕFo7$aMr5v&x. 䯟 [ NaW=sk/3Xy*a+ܲ8)n郭pwzvVrPtA -۫y+֞3"8WyϿQ0[}`9 T}dQӨeig"^ ĕ1t)x?č=) q$oQ<%=^]!eU@Zi>hI^yjK#dȲx%㜻]f ^VA6 Uf]xbO}ynC ^(-E/)D;n`s,|.,~/Fs2Ȋ"J"_Yz݃<˼*xqUDI-֬u#{_؛58f<`DoItP)>qp1Ie|/x;.WyQ`y8[."a QR Bb!%t"$ӳHb =j`'@9p ^%1q}$hP*kKxbU ~JwqKʁ5pr=G5wuuq== #F7zHWX8!AcJP? =#^-I\`sTYmh`8` AuO%JF4@ekr,1W\\L&F4Qޜۋ4TFE/HG;y/ʼEBjH{9"Cdi`u/Zzf?|jM'DRz NLom%خXjpP}kЃ IM:/#YGc_|F>0Ҍ>' Ay^̎M^[Sg m-#aGnFv*%C !y*bh4I&~9kUePt͚Q{|oV-R~ܫydžT8r Φz>fxL 1!jy1&C|OЊ/`YF<>M?s) =-JM*bn_qݔ7K:m46zww2"!/VܠFyiLޥ"w]IL=2̑?%GV[4Nݱ)\ r+!;JW\up̩C๷#ǯ)MHڝ%Mc`Uv+6lۗdPo*lGBZjJM|aѰKvfI$juP"^k-Si0S!=0.]QI t5F]5{WJ5™R@ax6Pƺ[~o3F{B2:7|T93b'3f" )!޴2prE5 -CӔ ReĥK:LňBX/][nOUhq> r9Xeձ⤱HS zeSt2#GiIDIZY8`e<COhud@?2f+Z ̿  8x [n)ә׋e?2VJ (.⮯"t!Xy!DM<7N\~q Jg>~rhl1 b gOpexG{K+LtgߣqFSD Ƃ2Îj#ZJ,Ti29oAg]h mozr x$`(kcT2W] 1zz &r=d./8{1xq0e1Bڴg*ǓRDjV>0Q.e$P}`[C-T^pWM X Og9Z[Q RkwL/݁Vu$ށdH|WS sU٭fT`}]Züq-ː;uqoe^4Zoe_wq͍G BP7/,_r.Wʼn]g]r,E Uk~yv3|YMqkh)ZAtExEoQkDRyGKA(ֹؕ 5i0{5c>MBbg6؁E乳~(l`Ubՙ=e4e K|*쭏 QJ]^N뫓֣鼦G9z¯yWIGB4,zZMON#7 R Sw^hD oYzxiyuMQݡp7m+T)YQ;pl eNG 5~ONAszvڡCzF#&o'S婾"KǢۛHyԳx2Ta858`\HBWX&T t_˸q@w%bbgn~}5 ,Rn6-B gCOg/ggf/qOAy JaSAR3|Jn nhXT K ]_JI[9'ЈXB"DNa"/c}Aop J1 yQh PX.l@vߋ&x45 !T)8Opr "H{}($MaQ7Y+/AJ+>N?{-@N~F,xv)a9x4~ lxZ'@:[+"7D.7{-D|!_? ̱;zO\i]eM+Wִ)ׁiuLԖ똬|VDCƴ}umF,݈m5%pI,ϵ/j=#ѐQsC<e@7)Bq+J1P4MWijw~VF?:9B%DE]w1ݜѧbg6G Kie#k]:vDH..Numڪ"b3 Qί[ܒ eZ:66lmΪ*n ̐+uX|Vs fW 6d+ M?%QY(5fAjB+;_w^$'*PC!n * .@*"=TVaO;ź"Jˍ3uq VAX-ĥwh;Zr ^ wMIw H~K%+O#8z=.jHm-׹hWYm4鈀/.K1b/a vi/WR60Fevg:)qCu{?p焣&֖!=LAo<NJSuQU5V%#^p[SvR]d/+ Hbl:x‘?ݥ)P݈/;/1; LIߏ^i1(3?O_)f^/ n(DJTWV qomy.a.`Mkhj6||4"tZ6eo;":(U&}/d:a >܁Bx}(`TԹ)^KR0n sJﺠxޖNuz5:07zR_īOӋڜRm2emɟ k…yJ\þ݌.PD)wk·|{)?+屾wR/H+9WuKlPh@#>y}k#?.5 xO tpS ɞ=Q PQsRȳyZ!/˧-Prx#mc8'91,B|BEͭ#sJq {pك=kf><  B1 _FC3 fQ,|wԽ5/_vލB>'Fpowkj-SSS^z`k͵]7xWlǍ>ݛ Npl'ó3{V.9S IhhY*f&s2[9^W Cta_m|KpS4 ӔXi`Y֚&'!#dj1ؖɝHۃ6zQRYi:>3p0#9(x64M^Gw]5OXV}w O݀&q\g2܋('1t &"8&Qx5 ^8شzX}O֞8L=U{6Pn[,C|ԫ0LDAdkW΀RG&[o-pD=<q|],n[a7tfvE72YvnH/^ =>OixEhY x_/g.bOv@L_ n59.: RU[ɕ$Jov{ ?;j=A&z˴^x qf>\`O ݾs6ͅ&cU`.+P7%sL@g& ,XY>_1"a`H$>x=>\#cFG <$xR{iN`{I O*r z]_fJcV+*Nh1UW[{ 7pA`DXh|o!nTum3/ycFB/L-D>H5q_Q?|j?jYb3 |C౩eO\xХ"t|(쯐<%vOT[w :O[oP_[%@s{4s)g,m"WO3eGڗ|+nsducH:߼K(]Уw+w098EHNy_-t8ě:MisG 3 XWm.%@MosudŠf|U5Ѡ~Qټ4}j xcHeJSM D߿_.d[y ^ȗ%-hV.F)|m1)V䝈=>GY׆C(W<4]Vr 0pT 9K>瀙 UqMvz[oIqd't  9 B&׹6"E'+ZҰҍqɪ"tNDp\x]87|t.aҒUD>tRm[(7Zp3oUNoS"M.B`h_قȮg^  "fZԉd1Z[ZlKu.];:(V-[}^hwkm` T|gx]eNgXLN(s=1Eo>iړ\[?9'Xd*Y|4q}4mp6/ ckw>x~KH&[1?D~!Ѹl9_wzuǁp eiFWx{je5hbz䨯!U@yy, :gPzNeE, gAu-D 2>Jm3J imnA+D4USu\kax&C<&93,埰R<; E'#˧<%\zizL[=rzE7`3ePOURR˔5ҮOӡ\9ow2K*y7*a^yy 9Jf ģpgDNl5u"48Kƙj/s\,F 7\W0hp 06iuYN8ƒ>*%&|T$O#V`v 0@;K.[Ro-"hiKF Ci=fͻů6NĒ[49~TƱ^f][Z,2 ڕfj%L/< ]'BO~y8dꍨ/LlR'"@\R`:>`gAr"H&wb)2ʡ Wm}SxM=fMdVP3ǃGVιw!'>~o[ˊRvnnf&mk3M:w=엤udOtߏM$;{_K$ &f@E0 U?-75Q'1=P|P*iΚMe+ OdwC&k C. I*`_?'@Wc[?.zbh-&EIR`4}vA@3kYh8jw x<0l9PS"OYrtBg3y,v7#e:etoIe[,q fZ7f Uv_nXst0f疃$ۄԶXu#~ۙr獪 ?)Ulцċ-<.`H)HGHrwKJ}wU}줽9St1sJE4oI2%0hgOۻM[c5;4A >Th6< Jwhiޓ9j0iK=Ε2Enh{P;1mcM! l8d/gKJ#WJPĨ$zu'b?GVuAk|  .~$VBqUyWac6 dI 2'8-0Tg.|d*eYXY1id 1ItIdw$*td> Ƨ*v2 X׋U2?&S]=d0(oԽ'Z*ԇ9@v2޾ %fsʹc dcwP7I%3yԷ.dU IV祌rY9ojQx~$9jϫj!Q_97sP}$mscΒR6=& ϿOw\ PxmJYO L<;fzs7pĺe216Bڃ0B"TXM};/`0 ;|ޣvHB4\U4;h[נ cĜ%Q_^E-&6a=v(Tax1l^1zAg4f(sCh"bDDi@YiSeeYXy\:0F ,rqjf1QO{$/]5IW&i4{F2y SϢU#Qtkb4jlJӛ Cq&Ʈm[sbp<<MTW[1H-OPQ"rDf&$Y`8N[x"ެT6QȊi$&A-n/0z5u=mBaQ:ɒY,SregߧXOT;w,3@UU>f7Wv-~9"olLrRf1ktx (N1]$R`I{洉Wה&F'&Ad YIWH/u# `>oJd?+q%'u:NO~DV8{E j_ƝiF 1h`@1 歑8E|Lv'ev|w;d߄ x }GOZ!m`Zit9;h~2S%Y l#^tbCgԶU.+Euy"d+P%>{:wl l:ł-GG7Qjt-m[/|͇rIPBI5}:?f/)DV u߼P^jg:BdL6HgQa6B~0Nے "Xpb{~Rtw u{PNuqWUΦQk)]zqKG}xTk9Ll8P}s^ 'M`yfsBB||Ȫx>r$ߕlR0$vLuotz;G S+f{] -o`D= [L LHh4A3:f H{B97y~~O_-cIhQc WB-sI kp+Ƚ(r(p3@k~|l{d|^-k͠7QM"gC I$s@:oZS*k\93ȅ76D{5YٳvzzEλ :=|mÊ, =;sԿpjra]lwQŞ zlJ\6PӅ(4S{x{it;+pI^ò\˹п_-Vß%Y)uaJry].1r)g' \wJ^B&vxZ*}PsU~MmW=K2%YVq5ܬ$x& GZ9 (>[SwnvF]Sqڍ[׭T^LJOKE$UTMrx(/kk볳wחESlM:\w/D&g\u-wyhh^I/ Rڤ奕U`( N*iC̢pBamTJ K8{:ڨYm - y^&& W[Tv3Nh'S~Fo gy hËpn>G$2װ&Nۯr|B 4 b=d0pPȔ,Dv2x Sq; :Yt:qJT'Xh)!#W5j ȏE~aPV¿.trNAq%74hN .2ĤW=d PsQy[aU@\i_ԗ9!VJi PqL=M=.,}>{&3"Hi8y`"R7*[Y:&y$9e#Ŗh/ ~sXm+@G@@b ,fA'SiZ ؗyL=B oSg6ii4Ky~)|+ 0z0`Q)88+Q㱛2M6 w|}9 {|Ըڎ>D>*V>Xq'2 dRi~%/Y¯!ٹq!R\q'Ij@E߬!0 HPRV5cz5a{sӗ.Fl/%KZ>*ɩ%x.?-v{.dZX|K_?0 y%$tn})rgoF/_^ /)v@UeALb xX݆aG5#/۷TVζ"#NYod!ʩ?yEfJx8:5UY1 CWڔvc84w:J/LtRUնEi Rŷ|hU5Ò>-iA9(W ?1wo[qB>Zo(n54kOgO|S^gUIf_aTLJĆ-;q eAEm1iI =9NsCn}G+kxv ]# I+6Yz퉑 (y+29=)x! Aobʼ)~>ApwBMR%hأYn6F J`o#ةmGT  48)eN{xR9BggC+E81b ΥI@f7r&a3V gM +wVu"z D ^Pm-I'3y?|~4q5CDj.3M 4/rp{au$1΍J{eo.毑whS4kLLI iZr-8" e5%C<&/4mf듒Qژ+/FU1߮Yag5Z$K6iF(l0f[ U9&bPhiڴ;,gBIT)Jvӂ 'B"SG29AMc]]_ Z06;JI 'q'`g91p{BVt)>T P)Sj}'n9J {u 7RLCnw0!B9lˉuec\cZbJuc,T5X{]| Q_/KjhO6rh!7'p= O.o.ﻔ}17}7'sy>F2k|8 ULPl "c&Gm5H17Cs㔿=_z Yf(fԻP*nཉm+K#4_*x8:6²ҤTiel[׎2; eB+[l{p'nv1 ٭vU}2 6UhޭjܮkW*nNk)_mgnOʫxR=O{Ճeճ\5͠|m'RFY'"WO+{^"^3Z١"D H_ ;x!ؔT!bXCAҾp7(E΃ quAe#AݔBn|v|Y<"Lq/u`{7m8)<鬱XA"F\e<{Yvt]U#Fw7E);>˞>gF^ơ9LHxp(0jXAc<;ۥ H1cz_2M,QC0{S> @F) Qi0(4 iȵJ=c*A(W1A'z o-H>\,?q 2PvpxnupӈW"Wyﮗf ]R4EڐMq %LX_R^znaZigؾV8S0c*|HrLc]ъ9K{0\^aĸE 5<)WB+n]2ZesD-(yu7 mA݊n䧄hVTHgӓrH\ Thw^K,˓uQ/ %a6~mU&d $У "3T:c2hB5FV枆LbR[ԳceХО W,NK4(l $i#uS ςR0PwAlwȀ˾hkOV/w0t81DZp9.x~xG>Kȿ~t{uꬆ` n2ߏ܌7w.==8=(s6y;l!^cCE<u!MqAۃɿ;cN(n/>ccVpKuak:鐩Uc(B$lHPwLx`̌M {0,. [pSQXWzMUbEJ$Ц"QIvC^ J=Bi- IyAz% l':=QL9~}c%8g4MF^0J~C#X>amp;9t|_?nb[I2XqjH"\VgN񹭘+|'#޴{+,^i6Rÿ́NK{rxLz؛d> f>'Ge?Msk_A&!N+&$oQQ K\搊t~;O8+2?0$ %(˷9Ș,$XZ{_ 6Y~q9v;e$bKdd4Q$K/:pЧ#w ߤ(jB0)D5^8u ? f˅ULP:F)bY%PLfye;-C"7YG~mu{'%W|QBUԈ%-(?k37sD8=0^Z0S9A<iI d:[ohMl9UsViAzMpmCaz%NtsH'-AC]1{?U.7E1/~U?"<=F7w`Ώ K2/W+j.ٸIOBb-J0p~VnHIy| I>!A ԗQtN ̄Af5 >lK@ 9пYy-Ih* pkFxL@DcꙂ grlV5|2M浇)\O'?O}qیZ\\Wڬ*O#f[/j,|z !_ֿHxcZV ۊʅST M06Sp7 fmЖ9 O^HU} /(跫#!4->tˋOAhnDC!HHvV.BӤ9u*p_@\OyvZ@:Fg 7 (nd//3HF/"tQxy!.gѥE+gdnhT{V%}:Tv|W2b_0K%fԕkXypKf[D j}g!/n9rvFc}]h9&]*U=Fu!!,C[ "thlBlݬV}j~9*Ƃz6& YF3TZh'BQ#+I5$?yw?f?J捓\psG(_=-w$(vr# CK`s v/{Qʵ[j(KhMIW̤V!PmNڅdp-ypO, s[(|##~`x8 Qg}0,5,_T`qMs ^|I$*Xq޴0rd68R<ؓ=t%ρN<EK%7wK(y.*<=[! 08M ~TG* }UE˚pMb5,lg>G|]Xk!OX[SE; ły(6 bQhImzoI$ =Ct.Z(G\^!pe<{"QJIIJFxtH8Я˗-F6)`,.0wTɻ^^0zs6U䅜{P\,WZ8 o*ە] :l(Gcܺ>LfЌGeJ4莙zI"?(swڙlu%QJ$T@W!LN *B9681fGD+G}KX/Q}6Pƽ@}$s`ekk/X1H _A>,)k^.֜@¶]FoLs߱+\ʧiw#G;H %rkJ iۖ܇nBt tT$FTb'~;WhZЁzr_v j$j2ѮdC?Vs,ㆬnQqY0%bIO典e?og4ۜ HTr‚538v BKIn@fqWl[24Z6mJ zS1WגF\.]tw#IHfs,kr{D~55S@0YUM+ 8r=<(2Hi O[`9uEFf5ƪ2ZX\hiL&`7Z1 >ͯ6B'{ wU)䕀 \GHxniZ Zo&6N[ Tͩ2::b(SG""+vt%UK#'GF 5;$1Ӽۛc\ōהBI<ѢUӶ"2'r r{%gRnBГK`}-Lowdޠ-yǦ.L)|0^2<"Ep1cO~Ybd=3Ryc%fҔ]w˝/JPS *j)98Azqb j*Q6eNuwDKX BWM0Az %jwۻ{[=vf`̗oAf#:f\ЁM]LuLF?,8 G4$rx@^ @ufqfN\3@ Sъa5Wf< I=htk)BV̶KǷ*H];B~1XbfZHɕQ5w5}8Lρ/A#{ q`j)ڣѼ Ee ۞aP" Ux1x UК} 1g~43#8B׮A-_Sd O Kz;TX[JIjڐB& jk_ ]GNGo>:77R?y]dOiHĥdK -,J;?׿W2Jq-izúJC UFC ˋvA1oM}_v\H9PPlUFcy6 * P( WJ),}4s?ZFр~ +GB bZ]$vm.JVHlRkV՚Hǂ}b@8E~O=xMktl[WuO9g)|VT-EYn[Qѫ[ эuOj6 TprI K/Gs&o|(չ ;`?}߽wo߼O*Pd=+CƇ 尀$X1"eIZ2$~f%:^2SA8axzG 3m{X@]J/zorw:ǯ#ʓuNn9͑7q ,l/QM1QGPeQDʩfI8n 9k˙f<;{;p 9y[?;e%UG3;bULţO98_]9\i!˓'JެX{}S?Vekdt|hzcjgGkgpvsXr—8J>Mb1qS~ID?S[tX2~W{%+,CwHEQx]AȗQ|0۵jn]@4kFys} QJý| ERg ?x#Yia~~ Fbr)甌`ӮXP f֯7r笆7CߺG}>ɵ>_~US@-pp VYBk8?eϘ-ϝfC=<ˀ1AmSn%C[>of^m$|,*YF?flOyyIQ^xd(d-Zס+/c*͢ӶʩBf! w9b8w`iN^hFmo p*ȹ,Eڳs۬)B .T~Zk}ՏR_xXb4x5tZρ8Q-1хG [Ap3E;ϕd 'q8WcYpe:vʾxffwMOP2܆SpV2A$hIUwA*hF#-ކǾc|IY g16)o7 8<(䒀OC,!wNF.$H29kԷiVH^au1+iaľ q;O~gE1d-4V5s6?Y./K3t1Y_hTqԼo)3@Ppwk>>t%k90S'}rub6@ޝ6 yFM1@^5#Y-[xcDx?ܷZ`\EU:j i .`@\<薡 I~K_8Y@\&]{BϽ 6ՂZGZ^(`0|bS[!&ܓ90%jov X@jM>$8r> {OI}J;lW3=52Cr+J&;fg/>je3}{.jYv{wv%ٗnM$#JzD&:aIl f92 gQ8 Q>B8p6Nl3bǠSǁ~lzs/6,I,k'QnWH,MsL,W<ٮlVIa[#߷{} J5Uݯ\ [Aw-qrZ7<UX2rmz(sTFwǒ嶟P*祓yC>^'HI/ijH&a yqP*2mO簴%VÍ?C]%m]4JU(,d¥'80Šk>3{MRD{o`Piqg*IV6qHƩ3pyU~Շ"1[ Ksd ҷ np$ӋĸY|+ͱ)^U4 jv{fcw6$|JX9( $yख#ĥ#gQʣ=ؐM[ɚye4zoxq2j lV+hY'+NUޓ 2~{ Q%tK^h'Xl&pLƟ$Ÿ1G )9Em?Ψ:ZO$Q1S856Ѱ5/![ GӄU=41:zZkT|mJ,/곒9ʏ |X*TN<{O2YV)>Sf^ dt5=Iq ufWhՍQL8Iam7wN]沼,ITYRЌhhZ]RTqF^]nVTAGbp"#pZЍ;Ik e4'݉ITyj)NZ xj0. Nia TW= 5Ta-G-`]㍭6mBUl*H(@FJG$B{|pϡ>XZcnl`,fO%s1u)$ׅ0S`0Z22 e G%/̹6;g*9>6Gw(V+GOYv}P8(5{!Ԫ\b Ngr#HaM)~j8 lJzAAR X5D7'9N7Zi_Iey1ehqR [TA?zKʼ@ԇ1 %?X=86V fSxeHᷯ>6QYquGbVB3*2&ɝKXsS@ pL.qhf_Co+PA^+󂯲fU^7m(|=ζk`)n6RxGx^dsbuf;O}Sԩ%HRoA͋Ԕl8b)kk/J|*.wiZT#}cX.AjUL|VZX `!*|*?)~0=!6a?CV~:UXފoS4< 9N+K |>]"A łRPTn,B%w*``0P /9$?_-na~1}@Xt}n@>gm>Lΐ0zgC9!ǭ ٮ&rvUY&_A]mgr:\e͇RUsCAv-"& bgfбNK>HTΈ&$r-`MG_mU%?RS6p{ 5Da^\'4X$A߈)1]'|qRQzg he+#x;eawNWI`,`JIQ5#4AFC%5_} \4q sx?/?㯘x Ii.l@2 7ieWuYPݾꁔo6<%zfM-odK)!,nѝG_ 5 aVh:S QW*=03wɗIR|WVsUVQs]|O˼5~-5Ing% t$)j,0!=+02(]6RչX<,mt p=#qMЯ'~0Θw^6nmi5Htrjcgg¥9 2ߒ{y~1y).a&CPcV LqG9]~U+U l>qaPa4 @loNshGS{4oC oT1P ;PN 76WgEZҳ}S[r4@ɑ39OAmy!Mcr~ҫe!'8 Ȥ}'SIG"f|,fdyք.N7yoBT@ҹ3lCcx-W<Eo6|WS Ж9 znāX:UX"TZl95^AN(`F{4m4AY%JqNhƩg1&:)*zָ/ 6Av] '!)IK!)cd$ɑ`?nF49ño7"cdVrZ=+އɾxsYJ02`+lBt +jb 鸓s{Q؋q0o4H:|mVW}E K",q|uqNG8݀ugT"\:Ë7'6jIRw=yhɂ+Kݗ ~ŀ_mDrB{hN75_~j'&K 7G>$o]3Ƀ"0xJ#l>eb f^c wwM] RH[fFgsZ-pNb0Ԃe?-s16mZnv;!1UrƣN@*zγ6}ʃJ}ЛZL-r3eKp6 KTƆnHS^_-gT{VZTo_Vt Dp?PGvr Q%&с70.:2@k$A-SXI#/bv+66bt3~-7sg8 9ggCdS'/vu"/#2gK>^"0V44g H>> #())83n\y"^·*ߩ!TiKNr# ' S<  ؞IaS1DU$vgai5!~yZf6n5 {].BJɼ۝?:ZEH.)W<)0 jXL'pXW4/#I h5t"TߊT;M.1kºz 5MGPge2oWJi[8 z "[1vm&|U@Qf-&nwм+N roxQ\9 y}XXa'PK{!H\6<)k|Rf6w[3X6f)>緑:); |H*H9SٰUR~ʂjirA>PDbŭ_%[,7Ll Dc``9 5& `JXkjȺ1 s3s~[3PZYdn[Np ;ԊJԁ˥1u 2Iԅ ZӝH##=v#buUw`kcIﷵ? H $FI|ƵygIҸR5{ BDd{㼆|ŵ~kKR hhṇX_گ3f*,Ii[ ̇E{V].qAHQneuX۶{ m-2fJ0Ѧ4Ψ%Y$*U۵? t|xo"87p@l$x< ݓwaF^)-sɠ °] sSXU-۪yb'{p \YlQ#tZK;}lpZB ɝW}16\у( CŇ1x[򚫣Ć2 "^RXvr-V?t(9H@>9gcl7@+z/nXne§f1 : 3ޔ&L4X=~Րm_WD>OMC {6=迟>E*;k/?H,6ttn 2K^,.z &g$H =:eX`08xUt(aumtzqlf-^`)wBb=@W"uxLg9k3t;=g3z۷ λEQ Y85R@ƒ90SL*b )[Lu Lu XM:>6!j^멢y$Qi8ȣpy(;䩞|ɴCGT˺Bj\5~@L 6+h-LGcHguDmVj!FF9廴h:ɽ[yb{SP$պh2D[C2]fC[WA@k <,wQ.[L|o)2I"&<"8X tr-W3hc|谪}r.>o$M)(1 s> cjd^;U#g뵲W5rnrXl߽>Uc:m@('_♇b+C |8zxO>?vyA('i8lN`ӽ[Į"$߽x MgG>QǦgw>xxUؤ{NCIyx1F_cVjVbZS4zrR94Xr9 z/lEO@n*L)fͤ 7ӜܜrLmx.QJTSJy\2҃ :c0OY⍥~3B Pw۸ |$|XSCztMBɧydq! I 2( MqOã 2h߯4ҩgC-M 5kR&:MO|uߊ$8=8qIK'.g I $ @tD)Q &Nէ6E?/D2u :Guև(9^npPӵOG .J<RRJbB¥GvEr I71 y s')D,5HXF .<=B 3QZC>(ځ.L rWzEj'j>F^Wt )2UcÃ\s#aĚZS)O[^4L\_n".|"o '=މiU}5|h\Na#8PJ/[Z_jNdQtqb WSҲO?i7 \/j}eRNeEε@z`({@ Qcu;YHqXQ }LJ[K7rI (rFyetާt.Ax*xEh-PstEJ[d7Tvh!eb UE*K$Jg?yb~v\DWl)_PIOo(eڂ6j!S_oB}tҠ-鄁G#:8Njf?ՌF/۫xc m)H@(˞T MblaGĻAkҠmuT i){ͭ$*#f)Q^Qf$ Du#jYToF 򌌤&k]@0I1@F =sLfg<#m7nN^M9o,SX 4`ѻT9ɾMo)̝YIƾQL>)/>*}!C«/jaH;/T` fHnt~\JdxjK7yduGp(zo4D[ ]a}Bȭ[̿.85w̴1ۈƋh@q鏺kG>W᎚䎚!+&i;#K@dP Y@ܛd$ 7w|,S%r_IcxÇd?LCM ^[U@ JV J.H uRrU9߮^ADʪ ?_8`q5Tߩ؃e%eV3p/}_d) 22W8Wߨ+_VhRO--`1 _Ame([7+o{W ,3F*C+ӌTnn@K|Q?[ѷO?ÎŤvg a`~D;0G~-0!rmHqдr߯U)BwOWAaPo,!X՚RbH%f^0S+X:-7=,zm\tMGP'}7r櫘}>71L)Noau89_ 8ⵏ97Osk<;AA!9Vn52aDpoz] !VzMz=.QT7`Y[0,HSV:.D.>A+(?Uժ?oib\ 7RK.`EEX]!h:-b1⣴r {}z#N_(UL_ ڝ *),V(oZi l6ޣd+.V Ǖ X+2~z[N<.<<"3uIX)82 9: n&c3pld$dL# 6[c|#t ,[.}2'sJ8N7of@{uz2}lީ9#~ݒԉf_vz2gɛ8?^ڞd?+!B\P>=>s&*5$ypa48`تo|2IyQa(vg yR?Q_^Y_X`43=7ApoOkWcMl޹Yxf8Q߉r P5vcx*z祃\}[>I|-/lL:r].aJya/ʓ~%r Fu)`)8bÛNⁱnX+Mѣ ;*%<,]j^ /acvuw1])v+}td#W hNO_mrz` }k90^ϰÜC Ct Ci樲{'gKk]t@⃱C'sMoJ"GT%[K 65C5Rj Eʶnn5`+kM$Hצ(Ki WJa''{Bc_d9JcOpK[|:q0@xI,ȢJj*|8 hGޫԄipH/UsHv=$(L0?[w:UxW4A hGP=A)ʩOAADbt8s*#/2>%`v%(-&IrH_S1-o@:mst<\6bBBPGBmzq\U wNuſ/7t.C o,VI:b>V`w?~{.3>Ͳj}fVc^V́OWPE&B@:|J֏o^Z,lBMfDȧ{/ZF 9W.(B%$' `@4ih 2-B}1 yf$_t*Z!A_Ki Y:'9IG$N">9x}ێ!G2?-M{kAE=IE7J{b-q|fz *'tW}] .] L bta@,i)08)Вz i4'I^-n{ҤkqapZJA`4vXv |˸ζ`!y0:6QOX%E0[rǫfw>~Kb :1WO`ц/PHB5P`*a<@*nHwԻy\b~Nl^w m[%}rZ0Q{K"itK)wYʠr0{”w>} s)sۼkԻ"U[$h 7noZ{PZNeݽ] 6m%Md!'rAfyɉ# 9NJ' I,iK^Oy 쉞. +)‚ρ&1'HY2LQ ^.`qc/b.2ZI[3jKvb0XH$EQDEHU>2D]]GuuUu& 438ad3 ֌Q-VȶJZVa^MR0'73BuKnOB4Dπ=!Dѱr5ZIaVI0𯌴Qe9#BI]B/T`a.7,z. խ.]~$'D.U?LTrB]Dn'ی/> ب/et݅JWhwޕ!_E,怺 r(}ȹ|0/9"<> }u -y0 :RmS/PM "<|"I8R˻kC'ag6:'+qbteb[ͤខa2hkA-c&GV?f\Y/32/UA`~.޾ևp͇Jk&LG7+E:%vISC݆\#W&7pUfOȒ6g Հ8Dt+%ޥH% gp0Sx{ja[!Ķ+X2== y:bB.5aK #}u'v zx$H+5~v!΄cR`|c*:Vݯ]&.- ͔vEЪF3_ bCB4a fLa8h*Sv 9܈/Q)}F3Qu-LqߧB~d z#Jv 4o`]QJIK ϲ :nEf3#L'?tqC >2p 8C9ݺ~72< (a[<>A&*4lS(EeW5Q(`1t>nƷ`o)[ZC2D/F69ia> e#iQ*j kQAUۑB/qJ>Yb8 {.XJ"6A7tԋ+S`жawJPWӷH w˂&bY)C*,6$%V5adaM5-l` 4H]L6w04hY(E0~A>4uƼCR^i!?̣,G$-|[oaLdduYsu^Fcq{yVFrرOk1`rdw;xVen90s,͕Kl`[azpN2LY[1DќA`”"2V3(:iOPɓV !F, 2LoB[!'ZN3e=3u @y=b6&.NB,(UՂT,4h˃h ?HE`bajØ؞jQ,ޓWYqaQ*-Qg,PϲXY" ,ML WLW!)$fQ mYN,ܮy)[X0fD:QӞ Y0`!eml ] ]SXSKt$p:¯,͞+} nWb~56{/5ӓ䔬˚Dϑ5S6QfdR~V⑞JA% 8F 1c0H_1~xXp|LC:|#!`Oezl,$J}#6(s9NpKXzU&}ȕ>ˊC5.ⴒ,I,f8k-)Q-,$ ~<\6n9Y%/0);g3'>E eڔM?wEbה#Yr-G|kn L^iN;aO:ڿU cUV@F^i'*BZ)PižVӞc̨DدMAa0 &"0PHF~x{>{78Sw$f*.r>FMqm݀;ѯr9~$x9oW 6->۵O^KS꼕Yf~3/P>AiGO?\N1 J'ٍc}.KË aj/i6YZUWW?)[=6=[Lz1ݟfdgY1j qĤEJ^kʎ_dY* ! J4g& kiJ!5FZz%12쾧w)l eP{3QC&_?xύTIW!UqdŶN4E49➱!=i53|N}<KqŨ7&%Xg(KEuVpO$n o!`KA݈5h6Q;rQø{U{G8KdfuIrZpc֦%g\K~ۜd|_()(`EJPoC>1D̵ݎofF:r15I/ doNeid\xb!:C{!*oDzsK> E>dDd>|lJ&/@{[\87)ӑ931`{ɩ&-KX3p&Ly$D 9, px(␝C`CF8<z8B{w3KDi*[}vɜq?kI8 c)ϒ?9FdaV."fb1ڊ}!r7S"dX!];˫ D͈·/ K& o򺢛 =g d)LBUј. 5lltl# @[=R0baSc@N+ "#E Li_^<'7J^gP3,)X.KXt]|de9S >;rODTpF(j4HԺ̼axnW? g@J^?끙~'is=dΥ''yFws9 Xe}]NQW-ձ30,>r`#E:X.O3pTifᤌe3gE9uM;Y]Ae$ѻ,¼\'KƃlB2J4ܯcj/z&oViB400Ⱥ]`+\,}nsU}# pvrC|xrs={`f/qع5%g; B"-(Dސp#m-(im!@x`@q],9dU0 bJG63XCJ)|+*JQqw=MKXXhˬkh/ r@N^A?q~Hx?ӧXj`G\gf##W7 X;ّ{>Q93܀$5fPYl),ʓFg|s^,.J7W:%1Paj9*a؊!`HX4O[XM}TcKa7Zl ,l;l#YU!Faox.v w< bNZ@tBC:kX.].ZW˱tcr%/p:'0pf6G0и,axb[%UgSpF`_χ@ s ax<>bቄ4qgHQ+|O,pq B)B(ad.!)l=ȍ[œjp8 IрnMh=ܷ:zf#R5G 1 7ΐ=(erR4\Z'aɡ,TwuRS,X">M]ҥ뺦P{UGvF> \}R>e-9cP;RCh1; g$)8uvh{di?]F#N(Y3hDhI=BR_ "c'@,Z>|{8$VuF qp9T8& \ 1H y #dRXC<1\H"͏Fv#wkV aή>t`U>$NjOխv$Wf?Lӡ3:9iB3@knlLC Aw9Hzi垯Q6PZ`xp,ek7X)Bԗef?>Sz5ݐ1-WY_/,XBKߖ,=Pw6N\ČmT&QZ/<7|$ :fx"j Laf pC{7i@3 GLbF HNH=4Hc? aR}Qzv_9ÂZm0'+Y[qNPUyi2>#V⎥`}a.# #K܇pF"]Ks,FX],$Dv@D)NJ1~%0z,Te؜M6K?iSGô `SM{ Fҧ!d;j? YDH S(yנf}*Ds9='uYC72T9d+&20f DȺw:ԥ>-Cs];MI>(&^Xt>}dg/@-WrK1Uso!P.QɺI[:6LܿVݼӎ G%!:vම@o`6uqQB0ݶ8b̔RNaRu:XSz| 2ؑO-Xm$NFᤰS vԚ4 L*c3HP}~tXSgF%ROS@C_8a6ܹ G66J/!E%l|8(ˬJ"C_W#P2 wxro AD ).|s,g5#6I!59ƗLbq>Y@I6Q)nev&wcVcaXT"X#ᣂdti#?e SF*;ܿ+CӎhC.(j͘Kկ$΁*{:+v$2+R^ν/^>w77?//◗_r1b}.Q x7( \AG~uɷs܏MrzPCfɽn/y-op\ҏrӋʋ#LN\:_R~S.;5"aMW#p Lnl]F1K:K՜aU₍ߤ{\.qVZAIJ &ϵ{Pm[ywWfn<=S养-k\] ]lKpvK]tk3E8Uh_7Bɮ,jh4{ZՇ]#VZ'dg{2oO /<|wȮ!n-@tP~"hAG?*ypIsdFTs0O)4 W3=HwOhepӛQieHT6EwJ&)CgzuqEe/Le]yt=D X)גÐAC>H2H!;G+bvȺ֌s$j?e2¹bgȐІSCbs5;`js_fɸ!yeMyy< !_S|] ,vw!RF+9"(&iAu,.8~=;x,BDY.$bfudܰ)C,lZZ;`[+{i>yg|ٰȰXȒi bW ;QQWogݝ? |G/3+lȚ$iS7pzJY k\Xєˑ}`cuj3'gdH6M(x0C zgurvȔIpb&qOynLg];%蓭@m8vj:Y"R&1YO8RpjaP E2dm^\htr|l BE|\`?S pTK/wFŶd.urV: >?k0Qc9@D%͹Bpr-ՎI:򆅴njVqP|[S=7!0k6a21[2"ILLG_7tبFa (hh_S ~qV"l}c4ݺid=k@U騠߸(Fwuvҋ[&Da<C57RlġS/ִJFsycnȓ|A} ~%ԩ@'28r-12{"S{Ѥ5{FN͢;j Lv3%.5 gT5JVMq WgS)~N+78:% DnLu`܋8n#oe@5W v2(C:pim-GGߨ{e9(;Ԍ:_^&ߧT,yma: U :S{(7 Z}\Ԁ:I\p P4DVqRiM]Z=B#o9Jn2ԦV7QrN 5WNqg%,z~R~$M˙nP(t-D):HdK|nFs ȮԑwQYhE5ayUj;Ѿ5rc;*w`&!vڑ44-׺yL )꺙DȎ뀠#l?GNU6UYܓ65nI+d=™/H* `?U:8SsnTw2︳OYܿxOƈ_di8Q^}='&Đ R?arGj2V-}Yl5 i nHm9ȯq(V8>jʭƝ[9V??2satd n҈PGg DqZ~\Mp;a@oGO(<"ts/fQɿ"ga2Jӻ;Բ[Diʵ\OfŠo MH^!8C;Ƭ@z:AW =SoJGca#D9Q\zbWGN T̑Z4`soS8cdpF*Mm1RU?햄f }bɣY `aJV=:02jgcg?$Qrmו;x>6kZI@bT@ /@uV.(MB1k[Cb|59O"0>̈-]- &['ftLuXM8]8\cY,85Sɥș="gjJ 2vbK-'Ǝd3DF;'G. 6A)mqrcZyF't[Z ;!I0 u::ؠq<1 >SxW7D!M%x'@ΣJ=;Jܷf\GI][ ' pm1cPUb@vZꙈV2Q1I Ut6HHK-.|GG7]y3\d]͎;$ #O@HTؘl5d>9'yF{yz_X( T#ZVگDmx)Ž?n8Yzbfp H t}i75ّ:K/\&AfUv?JƲL:\hNd7n^MܤD1TS M,`>'ݞ w$~_ьĎEBmH]=ࣧo=n@uur ]rCKҍb oa𱀜ܹm.bOPfc+RoAZ| ^agg5eכYEԷvL\1վ}ߣkԲ$ jmP$L+( 5,GBE|GhD|!=fdu9t.S1(>?yo f-^  F\!x-6x*/.8|]\S7+b .hq;oεe=t[HoLéƆ`w[ ៭wƺ2!+l )(hdQclz >tK'o:Wxj:LpF%ܡ?jg:mwnx45 ExR"DY:]4~Zm|06py]eT `iW9cf]N'%!%P.ߘ7hУGQHYkr_ENppG<1úA2Uۃi\jmuv&.E'5ٮ]2wĂ(-$w4h`,[.(;#? &yɬfkf{m&"xF䂴MϛOMp+p'É3|ikf pyHg/ṣYK0HY>E&ŪM7X?-xD]U5)[4^"P _I)La ws䁡O 6 N#߯%ޮ 66W/~NABkgD6%{:: #"gQ3+mB0v[|Z\`ak|!{+[u @nLR,Bn2"Cym`vƨOQ8JmaBLRۮ(}7aU|~1^[vRN@v/nGd`0|sXԿr*X<P<ѻ=b4y;+v2Hǘx1{R^_ʗTZg5г˗ӯxdڔx-|g)kzyrRӼG5_~t?vy+z}g;#ox+{6ld3ܶmw [F]_v* q[,-zzXMR:/Skl WRadq€Tʱ桗j^Gk:}]ãœP'` 5/ޠwR5p|$/kEčM=~l;FV+#cXysìwMV Ns5^?FQX}/aشZ?rGRMD0vtN"<{64o;K& .ƛwDqynK0LK ]7_8UޑM=A(Ħniw ]QNOл1Nd0,9'&*r3umȔۭo@8srFuOg71qu}Zi~5h 梃9(J]i ]^Dpg[kw#\g:EGE1v4=~v7-bR"Vb-nEJ5O!{<(Jh[|NO3JViFL\8pƛ= `4i:th n Ѐ^g ;QAex6}FiuZ/ ʆ e{}BOXŝY;@CNAxMq x Ǭ zK`O3uj}k샎ag9dOrI:c)WL$[\R6KH:n4:?@g}bRz !OEŰj[;tq5V^u;n$(ų̀ 묓NW~{f g'5=\ތa b[{Vr~L _>EvuMQc*|*v0+4"+o<ު yNj(t8dpLq dFξ&#sNQgŽpkKډ6K"ߗ2W:?8DrE]D;rB} ~N(;\skH$$RF3ԶGm%]g7c}%:WdߤGw})QR^69mm^E.xB{5)q'6EP,v7k+en9uL[DYihb*DA0-'i"hު5a56s7X8;P@ 鹾׆b_)o$`ZT [Nl`zLIOH~7AǤ3q8cn6 8Xns/w):* ~hIb5Sܶkh^K%z"‰qlmC.ڢ^MzkK) B}=`no*FyNYMybhAvX zI'Ow5X't1W!.;DD61#ֆx>i0'C A>ס{ xLO1f_)m1zeR%Kn N*0>, 3!"̱yk-E*]H;C/B i{ZdsB|Uu4)Zb[X-iNR:AiwgJJSCMzxOi ˋ胯K:bԀ};=~I) o]ŃߕB% }VGXqlŴRC#S0EQ`u"NI)AЃ5PZq1VK!rXᕋy򇦐d$zp-BMВB5fOnh/lA]ewP^jޡKmb } dBMiukORKD5iEwxSS9QӪ\uvUt\O;'Z_ys{P{ap-04NmЄTn mbOU8 &eqC-VSGjFI(`g+@Y,@CCX3Kmi7EpSgo8[ Jqb 㯲McH;qe$uƎf[ZL=o~]|M,\Z\ڒJmjʻmӎ$z P%0(FAA S.aKf(K;HwLgdjvҙh;hh"bWD'R"Z'"3nDŽzTѬ.~F01t&uBA$BxDҊs0-bk3w>#/`\#Ru*^Tth‚JՋeZ3? v: J:֟}j)`2V1Fn}hfVJ"G.Crnq*4}dK vg̟f1vJyG9(F< E@L|{~x?V>|~O<UBh#U;:d(zuLʹ" rpݷTb[z)9ly揲ΩΤrJ=GlSElSElSElW"=K Wt/1@HIKz])L:*]Yo9z;AKc ο@!zz:ϧoxL6&f AakE{gupdDN$԰ Df$8?fW"m6\74:(h%Oܕ>m+WHzY=rkf2rN۸vIIr"ktQn(jݪuG2_l爎^@;nEr/7z06tw0+U>t-^s˵b +|aA@[.}5`ⰅYw(3xB Q3QKa`@\3b>n# Zc0؅8x>-[Å*0 RjZWEY+$ʷv3Uv\aw--n"6hnhm~T,_ymX tQPʼn^Etj*5>ALI**&}!Z\5$'[_/~! (dcnd(EȻs&.:tiUd~e޴4hE47-_pJvMIlTάmL< aAG"uvIw:~Bqa퍻S(;8f!BRxWT5.!"--~>oҁgh$ptļ\j" Py8G9Fv۹QPk+LEeqiD'{9o)K$3a+⦡8'S"M^j(1oeT`tWk&E;OUMz :0#q%--{Kt W<0TE!{Pn+y?J#T/:L*ҾxQ&0qɄ:כ l?)Ġj Wc2ݪAZ04*$٠E+{_ rx^z72)Qž]e͉ -`٨(uZMMTքcKTӪ$n GczK&bjd%sh{E*נȩ]f(U4} RHQtjkE2j1j"KMeӡ4]vľ7"-#SNMik`ƘE'47!FKkUR/L'E;Wv;lYbLj_䔎i+3kVWn 'm`!u- XID(aRgGPHxׯJ9^ Gg /F"hlmhpMW7f̳HRJ[O!lRMm˻7vۿguٔR}Uow?r i8nM[:k] W(U2h`@>vs{J4= `W(8@9kvQ W*6p /G6vTh$Oƈ:#oxdVt0'([hc^.lAdԟNγ$OZ 2(} Vו&aҥ3uM{)Dn f}Ŵ? l/x^n0إ<_m׺֟|=uf]^ҥ  ׏,*KX0u8BbM˶NeBF}p>R\)>CmWw덮W.8Jͤ!,TJd3hF-&?rPkھoiC$y/f=1uwlV'f>@pҥ^ētKg&e{ϞeCsD̑?2'(\ E#WGn5̅44IWӟҺ 6>JNBYeO+Nh}O*T1uo QÊ=V4vrk˴fB3hvHz9M6J#ުlMlw[j{VM*aNԠ3N:#J|=+av^ڬt662~\tuaK+dZqBv%B~C'BCrǠ3:gbb~b=L$6q1~pnt#s-֛me⟢lZ#r= ,7 {-:+NC%-UbǗrj"ϡ) Euی3|85)ϘՌ䜗TX@t_c&)FJձ5{ۖ?Dy砍~u_I#da8`l<&믧*? OG;djRcA bp[)I&, CmY[i>Pp!cOOӔ,euK"h:[{h-  {Go%h6z`K5kQ5hv1hS{33]Ƨa$ԻD ԏ,LI-uf ZJEPdP[?6o=k/O;YEcxX 눪aoC⓷1N,:m~uK"VuxJuk;(a%4mޞ·X<(Ms3r-K#SD)#yb@^/hפL޸XǗO,~!Oza-j8Xv% Տ(m ͎0Xp%s v vAy6S#+x WPԄS55"t<54o.Mɉ"íY8)^}%$^d ˑiԄZ4 f46)D2ɵyvLFVcdzt\: H_qt.Ɍ,]>7 NlYGܽ_PNǴb,Nw+7{ V?sL`*n;k#8U 9.儫rGX81c R䄝Y:t۠-5l4=oZj|A`+ÆVmiQαޅ ^9R:v <)6'2jbr-Lwa!}}H y 3|"֖/3^99ubg(?Fy6]QS:[)wgWJKҳ79=W7~2(;AXEA`8 _[{ Wkaå5!bE_`n1Ux^O1no"KV'm{[AsH_F,9. /n9 \^{BB]u#nla*0[zh_7 +c{ $YQ= !ֆw8>]Ԡ>DdE!{qG}Kv`#.>ZfR|$,Ǐr>lk`~w^qbLQGjna|Ɔa@qҨSUwDq~vc'MR1*$ΟJ.93vF6 +#kIDW&ΰbVrQ&R3 G@}Gd;acP+* si/lƈݛ9z.60cR`1?N͛>Z{ jK5uB&VT`̒8LoBo7.k,XENt%MS,xn4)fܴNH-{JN3rF(_dB@)U6\JM DF/亢jƗic1VWmamQNf|bzH9%gz'X V*4Dci ƯEj?|[MpPf =y~3Z,M>&BEi'D>܆ "rilөBZ'p'Qў}C0v'xj?ݮ0["5`x-^{8I `pKsF {EWa>]y_Û((E=^JMy,Ť@/YVՎj%dFIX+O0! * k;t~b//l\.1/Ԉ}F+O’[H#e W4Џ3DǺFG:speK(CjaXV5Nfw9y2X>q|J0^ikx01_Lzc:U+w 3ݞz"iCȯS^y6vt)|$*Z_~꾞+JFР % *\G ƛO}$jޞX9t9ZbȽ!J/G+g6E!QXbPq_*ycpKCa̯cͦϡhc)g] 0FKO4ęiADA{$˨Nn\`Z1፧_sx!xцqid¡Ku-?:_,쯗+"6AdP-JQ` Cx&NkN0HH^␶croޞm#+LCÖH:T I65J29I&E,/F\TXG*:uޔ" Ǻ(| \Dx+""U2XO% arz)-l)O)-8fh!LX\dTZXUr3_R{1ue7ŰerƢj9גKI鎇00]yS{Jtrl;u>|7NJiGE2 ]e!E~xh u.:Vm6X|2)V-w:.v9NhWzNgKTym IlP6b7U,i\TãIŠ\%.vqJD>rhF!m+{8Hun(AmNb] *wFck%i- Bbn?:.Rns|Gw͓j6|XzJ}z)єus? luNuJ^$d ]+`׫ZDsyfٹUC[:U/N׹u$t<*_G-:G7b> ;CvUveM M} B%5]| K@*vg5 a#@z)ZH2dAڞg"~8OXX3/MI$1R7|c,\vD_"o. "NMaKWS" ZuàPh@N c5XpOҫ~Ao&0ܛ|@5wU~sKil>7:m_ל-'7 ꌺ&NĪ#x  !r T9 K9qF}<42UhsA1+3:=$"1E^_`e'wٮAhϔ o.,=lV$XMN3¶C]@)V=tLG8(9?МK mu&&u\ ܟ Q( !JS@_"11UF27X=-\7;S/cΖ>n^]^gI.kF a>P CCØlT _#L.Guj0@TC $%ا -/ezrc}ou5A?%l9z+CI)}M-9e_LN\qy̓AJYx`ptq?wbkYA[VOM% \Gmb<>yt.o`"XPzFCǰ'&L5+}]Ji#ce\KsN9d*vT :_7L8# eq +)SBoxVb W2B"?)$޽x~k/߾]A( RFLVU\``GTX2N#Raj" >?9Rj9ݘh+g{Oe.k6rIn/4gtUSʐIO`ۜX;=@$TW,3&uc}[#;KETkj0oX̶sQa휯x!]6t.%JǓZâx#6nj_oo0|"q9㫪cV" ΍DS(N B<), tgJX)Wk0@D/ 5K^۷6K_ɲ8bňl]Fn.0g?ph| Ƣ*:'&>kS<;tzg_نi`ttZ Kc-cY%kl:I;y8\ dpC{ _FJrQp.RS> qB AUVpљqMwS4a\~{:|:;ɉo-p1\Z^8wGP=h-y c)Ra CG vƈ. %Ƃ{ƸfD>%4̇Z#2,yϫSUߩ2pVwM I)%)x404h#C+A()^ЗM@Gh# [#XxK1@ Я\ nEWy̔Tv緓RN.)ģR8_Wn tq#t=Poy W2_e_&1U”=׻p̼SLUѭ*^껛o)hiT|&/8Nj똪ÔXdȁ Gϐ?) 86&Գ\_W/MG\6b?37Oa)ߕ]b^FP0Z|ւ6Ly Q0l;a,N RH{_#]nנU AڧqDwu*CM3)::zv VM>/M&gjA73sxOxW|֚;f: kǖ[kY VPIDLxhqjT"M +SřACYH^Wuu;.=؞RBwĻ)reW0W`p֧z϶oMy }\ 5O1tU2?`:۵m2ozG}=!Ro:]3Dsdؐznc3$G_ڔ 4WlIm(vzJ}&PzOkT謟;ʙ#X{ rFA_4!  ۻ'Pߑvg!yTdΔއ^"G$KӁO`rf!>#_jPRr:183Q~x-Qs:Q=ډL/E=/btJV^$S7uqn-g&9l[H6X8%鸠3&^G)ݮk^p.)!mK?ڵrO@.g@iy AnOBaj&][[ q, 'TLY!_ㄔhu,hR- RX1W܁ﯪ5H[WכF8sQֆsv\R0%OĤޚ&'8] ^)^)^]{*&K~T3ʟ~ [$C ׈}_48U  f'c)est{Rr !K=mV46f+et] ؆z 4wEp  ]J#AZ  ֖ c`v.#Ң~ˋBn,"  V3덐oSJ3S,qf:»P i$$Cwsw灑L8d 4cqf`jBi ]{5ZB+x9Z)^F b1p%~#-HE6{gCm☉\q#k/ ZDHG 8o1ZMaEB4!O2-%],-4O@X2I]HbyHWISsԾ_1XMf+v[X 2N(fŸ֡wi_OiEm!m^a,@+H8н-r Ƶ\k('ҍH?+PX-wpaYwQb3Nm\ 9{%nCYY݉VBFbPŠ7y~۴zރ}rE,`=/xr{ٟ2nUkxGv뒈Lەm}+qÛAtU, 6]B:?$XC01 ^ldaKj0WTCȎC( VP0-y'~ayJ67v'-_5>Eu|n` AVg9`Ƈ t+()ʞm$˿"b, U[1({ifGq]H Id^n4@hD3:/x _0P]ſv.nalo#2]p]~n'`ͶA8pրf0zk je ,^t=WᤇSoێ-M6;ejm(|kp5ZHsz(X7MֆG"5 =k2O-Ak{t!Aq4m _'?s =:0M2[? $E?%?Tt7fwU\'鵑RܲO4"-.) >XsN`Op͠E Ï2/l8 F cxVѼ"I]>[&_`*[QֆM"m?y~9@奏LƏ0+\0l7:ڎ2 &؜%~͖q6??\3n8_$R8/S{nʕ~4#'?o{|IU<\uz;ģ( 3yGDX"&͕gވe􇌾Gxwqw}(4cg/0oz;FGZtVGšP`&>Ss|c" JteUHP{ؐ vB71 M͛YRݮ"0A=#ʷ^ #cSݢI !aB~ .{tCGs\ý-\f&Q59Yлc,S3 +*'%?yا˗ ٔ *z(]UDzb) L_L'rCՔ6rܠAgVԺrGYMjhOf^ V$Sm=ˣ-݅XАrA _[$`EMʰ-rYk"Å[J}XؚlW1z8l/=>^}"Ex EJVb~ӆ=lM^;&3^Bm7ų2"W:,VDEJ[Dq_9 _iRՊufA#K>t0Wyiyr}&  :.<3($6"飄>wrj](ڭkCDܰF,lQ,: "|/M9]d j?lqvCwm]h6]p|~>iEA6w`[rQkhgtpp ҁ)>~GUyVL#j.RO. 5?J !+5`="x;>ݰvUigA8JLS2*A'C@[.{MƕU:6y?lR%Ǎ> J [.%~nCB. -߿D H6:;Ffyy&wQ4x—ȝ<*A˅"y'jO` Qm 'od>L{<9մ"7yۮ.oBק:at3ﰧ͵_n)UJ 7=9h_efx33?n1F Qd3q9rȝL("ؑ*>h^3G-87.Y0md T6 xH=´/I j$ _S!C8 ;CLniBMҶmiPm(NT7PUӟ5 A`; 5{.G!{RHlY}iS"}I2?(orɠ2]f;'2Ap_⿕0.`wc P16gp2/%t(DT$is(U bQyn/rprdNnH"U1f>C34 ِ(>հ٨QuEi2('[Eqs*˯#;ޅ~ wa|zFpC-0=%>!HuWn n*[5h:^2AĎ\JG14H]E53Xwݰ(QtYѯF1q}ӴQ+lv^)0uM@ml) Z^6E!5V] zt7ǰݍRdmk 9 Cu8-Z DQtaVFĕrƪa]lEF8 . \{ NO-&J1"t{]&6R.P*":\ǜά Eaihto1vø5DR$501X>y˲\͗!ܹ6Br]zxbV1} hNc%s+W5}KՋtEb8+a5UDQ*AJ,.ns2޻I JM={,P'#꨿ޔc>xvvq eF{m{FPs*V96LZy73&*Ƈ֣]ϒ):24 s5'5N)RNUTWjQ^m&,Z1 BOks}CFQge<{+249̀eDi&ČV4U^L:(:J C3ird!T+pT,ێ=ۍ=>hL/a(yk9 9o,؄~ 3ꍑȨU34u1ϐ*i×aݮ%@"?h9 vieeKB*}RbyBB5",?*zK%ʆM ZB<貄2U~Fwio;TF-}Mj?P{V `X@K_t5|]hkr? 5=ݓ@ѰSI>xTp-3U߄e[w=ѯ{_רRM.m Moj8G&Zr8H{ils.BtV ?U_ Y+b0a7ꢯ;V/;@c'N=~T0+Ps[0 RjpD?%:*<5GHZ2Rc9 (8BM`O05)*W$^^[;j/'U$g x-Ʌb,Q.TѸoEd+WnD1L[G3Je%f~ bbtVLtERS|J|GEvXy%}!$%Y{%m?3cSUi-1U~25PMyvT4P6yV^[zAAy^wp8B6$BH ҏäkN-ZO 4FA蕏>}gXϣسҍ?f1hz%_|x(5j i"(j{T%b@Shw4fG=QgIK?Tū|Q_vzI'}@C{ۓ턃SsԂZ @) |uVܖ:Ƥv$\X9pU$.Gf@0fO5259ƭ& 2T`UVCyv@G߅E ajX+=Dd1G+£dL}ld6NJ3Ti%(殬m#AV+B~h.u;߻̞$e+hG\.cw{:eOKIN7t g y 9l&U.UK<4uG%KS[m4qjv2 Hא$\am;)\eV.tԨm"1=jC!ި`͹DHD%Q4-ܳ>ګBޠ,k^2q [iC=عKg8ʺq+ Q#^/X6Fz =KK.e5T8%31;'FCP,f01C0Hv1sr;Lʭ$8Lq@ VytQagbi~1E/R #VAe>T~9~;i+`iӳq4m#{jЧ }`Vg\B 7-Jo,qAIiT9I"xtW)us0rY0 `(Ta27FK b1Mߴk&]J 6tBH[B2X*]eS8Vh.0 ACWyG\DsPق|oXOYLmiIv.(ϠnR%pwl3,l-RpJn,@Jߐ!p~A|*]ِ˕sމ&v3x-45y"uYm^eGP^ 1 `. Jp Q ]=(o*qGy$$lzg&0Vd{2r3cLjeD >yV&Nm$ĀAY1|_t ^Nw{[f3ŤUU3 njkWQU]TGBTw"@ftARsÃ7@Wix1'\(;@5 o %=6%=l=ޜ-wMpcZ'lqxZP4;`~06p["/ð lͫ'ud *ц*;/FڸDs+Q6Jv\A՗Prbiem~& 38.꛽-3^+:s@YU?@jdIZ* JXir7 I%͘Xl!ɝF|ы52ʾ%oYc9mdaWP+-h5m UU F+57!r״pXDV%H \:pN,݂i:Mq}Eѳہ|,o;*_B?Tv$p_R99ca 1(y]d,TzgXŅ,򔥧ҙգů`\ )=}Y8r,%l[d.J5#ܠUYV‚'?/YҨgN v[ʣVLTXW^4\*͞0mc V54usKW'iP;? SmxnZ޲+a)cUR[=dq\tqi[3,V() l}pǯyQ(Dsj T۹?j'ķfgIf!m* O 8)C~Ad}qNNSJ!Ef/.m@}$^JhtpBX|P^ _jeq3ek :>;,į2P3΁w8 PX)gl]a=;³0Hdu>g3h(rHQ氭Lє 6euSc"pϝ~7L;e34bwEvoRLFPEcQ58A,)2%݌_F/H·\ٯ$K0K NҠl )M2FcBGJhי>Q}όwPK (N(timetable/documentation/style/jquery-ui/PK (N3timetable/documentation/style/jquery-ui/smoothness/PK (N:timetable/documentation/style/jquery-ui/smoothness/images/PKu(NdfXtimetable/documentation/style/jquery-ui/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png sb``p @$UjOǐƷ (0?q֛Ɵ[dz a u .%~xѹɫ4`tsYPKu(NYodYtimetable/documentation/style/jquery-ui/smoothness/images/ui-bg_flat_75_ffffff_40x100.png sb``p @$UJOǐƷ (0l ?OfvoGXNRY,G4) PKu(N;\wxYtimetable/documentation/style/jquery-ui/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png sb``p Ҍ@4 ʏ =]C,zߞ7:`tq9/%L7s^P` K~S>EOvIQSxޒT9~>a;:G-0(OW?uN MPKu(NgiYtimetable/documentation/style/jquery-ui/smoothness/images/ui-bg_glass_65_ffffff_1x400.png sb``p Ҍ@4 ʏ <]C,zߞVcP9|g8ZYG[4$0>+Xi P/:&PKu(NۇmoYtimetable/documentation/style/jquery-ui/smoothness/images/ui-bg_glass_75_dadada_1x400.png sb``p Ҍ@4 ʏ <]C,z+>=9Y4EBM' 6'$%9)W ɜw|4eSBPKu(N-nlnYtimetable/documentation/style/jquery-ui/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png sb``p Ҍ@4 ʏ L=]C,zߞ6bP`>ՕBoEp4m87ѻCCߖ;L3o #t7 ~.PKu(NevwYtimetable/documentation/style/jquery-ui/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png sb``p Ҍ@4 ʏ <]C,zߞ7j0`p8mM U:;Cpfj /tU̿{M%~}>@<]\9%4PKu(N,XIbebtimetable/documentation/style/jquery-ui/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png sb``p Ҍ@$uc//.֫)_kAŎO8 k0}s!>OW?uN MPKu(N7,Utimetable/documentation/style/jquery-ui/smoothness/images/ui-icons_222222_256x240.png7ga c_'K-[eR%Iɐe_3dTBD$kF&D24ۻW|{__9{s 6\0Q07J*LgY?++-3V;1C_Oٴ=REˆ}D_v\N%V;qwxkcDo+0(YAt9#w <f&!/S&y!es1OT=,Oxyo̻"[Hc3F"N[d$O6k/w*ܝcK1<,5捊3pK>GSeulX\1Ԍ_d:/ԴNƛm1QBSȧRݰf.}B\e!L"x`S?Ų8$~fԣ|Tx)n(GlQ9 jp 7>GƾZھ<2+rI=u9q?tE!w4f&{QdxFgJe eGy $i=mC2%|7T [‹`:_ $*D %^GZ/ JǺԑtSUC _>oLےó(݁1BK0#w6jkF G ,p7_+4]9gJ x?AVzw8y!hi TE|+NL긖OoiK~B$  D'Jp '/ƕiksLX;Z~`M 삸X p6:!9d5MOn/U#Qo6FMgrFSEll^RvGa9Т~Ld;)30ʇ%о,xkv/WzΓ1& K|0K=VjNOc,Yl>1]X%kʥOZ 0/V,`Ylhkz514-' (/PlX5mU/+׵.^^Kj!bぜ/\|]o,OG\}Ƽv@QtiH俛mF}>=4"Nfg Է|ʑlXic/<':)/?ۀ~mɟW܁)E%%Z9&+ w +MrglNk[qnCb;,Ψxy.3J~W5n\F?mTFr9'+*3+n,*oF')&7d!|#v/1if7+WB54!YHNr*{lu`l6wgU/%*~8>+K KvA@Zy5FE =`gr(Xp+xeq)uPpo*ADemr%1u5j )v>l7>HN-9# l*I3ai9ښe M(E=BVhBxTٯW ^ >Pfk讖q1/ލ ֗یGL@925$$я-¨Z3Dy6N~n^+۩H&#^Ye?y)%`wۅ%|@p{r#VǣP7wfƮQݥ>XO!fL&U0*/6<(\楙T&ia-ώ-<#toh3p4 D5  K/Jg"S)TCn!Ԇ(0OP\-%X mԍQ-+1窽 n <Bǫݚ+-}yx"߉9QvfwF1gRK hxqE;w_K^ݥ |JLC4včr0T'G"v[Gv^\S`ij)$|&;M:ngH;T ,x/x_d<\p]vc3R='W[ؽ"Qzɖ/6uw= 1q[ޭ~QrXk)𨓖jCffp}:io06`O4[9k a{=AtzV(};<.t a e{YDLxpdrQQ?~-qLĩHt,1%ݛ0. M召IezaB9+Ǝ)*3QـXye@8"v6vyBtaX<`Du:єGAC-A)%th0((}fBP?:䣘x X^IΉtkXN R醾[J:$AN'! M-ɑZⳗl&% &tVvC كbwqOl+&(M2YO,"ߵl/":Or:9IESf$sxa rb|f2gg%ܿHft^ }[fX9ı,[1|RqL&`2zGL,5ɧ1AVaisj|#>3e93D':$uFg clm#)J%5K[d˧RkDo#7qY`!ed`Kp?6}۾F3s?oxou׌=OCQv*+j`φA;.2|>ZEҀC^{a$-g+R6v;ZZ濮([)aXr8I[8vyo_y{}=A k(?v}<]fQvp([U??Rˆg+FlY"0Q@(KCMx1e+qѷHRM*xaS)@<|/5 >ݾd!5&B 6f,S,CfܛLTιNah(tbLu+^*8\'2<`+ok+sl]qSC\b> 9xHBn o&غBEQrNgONsw QvQ(anW?_5(N[gj*&%֥}MWޫȖ"Vuŗw#r67PQM IW%c]j;A]xp.] idhg|kjiuA)v)3,YEìcY}L%;O<>\nㅢm-Y[f$R0\da͚''Iq9-X9; 5#Qwc<=΋Sdy۞ #Z| vw8EhY T F 0-JL긞OkiK~Lħ 4@ p('1,ǕijMZ9 gN 茰,{ 7U*:;0 ]%άSŬ|Ƀ" 1!Ih"i*C~ {j"i;"I $11Rp+4՝(/`b3 _H>᡻JwkM`U(TjUgjC$DB O.FpcR{`l/"u3uJ@<^mF`F򉅠b5PX+ ;rctLӞζ߼9iăijYcgZHPwd| t G{O!PcSM9a3"L$e1 ;2cqȿ*d!խ#Mr&%j㧸o2 &KQ) "=z Ge|7S_ ^+~U 0*+~Kߘwa;Qy/`<,1YK'k΍Fb߾g֣'Stc+BYr~z[=Q!~~F m$bz=j"Sʜ"g5L%mexAoܯ\n辥V[x`MK6O?Q 1қl#nJ**я=}^7.pudҸ/ 5.Eay& {<[nS x[) j)= 6X*XsLTSH͙Ee斷CG3YWMh#kI\Nj\ qv3~ka3#:YݍLT=x_}[7u FV6y:nccB{ 'JyL)+)65S( w]}|P\kbɑ^X/ GN@HZN03Zέ6-\=Kΐczk)_&$<7K5#xQX-e‘S+א/-zq0|c) p8:VL(͈`C{Kk`VZF/{.#͖t*>|#if+*wHLgQe7du%M%2GKG˭"O' |iVO'PB6uqLTQ{2E"`'QA0}5)O"!^[e=y9p{e?psz#RǥFWwepPݥSu?XMW & E ?*x 24(X橞 T$ ώÐEm<Lg`=< Ҋ.w-@}_!>C OGQp$.4ZBR"ph;%%%uS}o!9:1X7a@79&Uuw:td|׈kGw~'| KG؝eøK-՗qFyϞ#{(Re2^Ի4eV*7g:e軿#nMzGHg:ofJ_]|ઌJ=E.:n.]=.3}n@0]%spAR;5\pv\pHL=gqH[Q'KN]@ĽnYג^m~QݽNR_(q6,Z O^䘝iXo?QmɦtCFVu_ '1Zк @9(U-_̞4C#9+#Ճ9 [1ړ!> 5wG6ҭ;(JEm] H^T qUeH*oDMv sY[5tBU*" H{UK Ns%%g CAd3q*R1qĞRJR;(L)ð׎g%(` BYgn2M'{ˢ[KI8hQ4)BCtXv^H">{WـMB$Wf|3uzT~r8ثpJk{EGSsNΓ_ zxGTcPKu(N5+Utimetable/documentation/style/jquery-ui/smoothness/images/ui-icons_454545_256x240.png7gan:Yo*ېh,IM(u%{"&Y35!M1vcǹ{{n-<7ප0J*LgYv8k~gH{cd`am.…02 ujNnPIsȊw%+*V8 "g^3y}߹3bqY:XrIujY>Q_:}{׽qףA[#8['7ae [60<}K ү!w d/jϾX4) Q慂8a|˭x8K +gg 9r`J\ʎQ7?BkFr%Psh,l RJ P6ih6D O-G >KmO㚅_? Ӻ p?慁͘ `HʘgŘYSLcNT eAsl%7Ԃ^~b {i0mcytV \~yYuuyb& ӓ9Sg<]äjiz0Βq:)}ʬ,KdlVe_1qh(ЭNpA1CN8:G4Z~[H&觮qyigʋXU+ h^ߵn'kj{War Zd͋8 Jo,tɏGK|t=0iSLJV&-5]5$[?2-%72|)k-X>q{%Sι+G'iV/_:/ = ʢO7AV$Qk]] D[*|z_M]!t T.HB2ȢY|礍՗H֤:`*ŊB=gylb8ܞ ZR ƘٌS!i297[6]Pcnn8C9R;J(Yүnb{D}_r}]Ơhhڟ kpL԰x3'"tK>KK^[ yU2ˉ;z3@vpYh!@|sQA{:\-1`iT32)0U'P+K-)ACźZLU<m ۠."b|Jmmֽj?BptZۃXfPJ`$4z}f7eBx}PI>:)c;|Mplʃ=`]HxjP~~>@]jl 5{ȝ|P`?Ȩٕ ӞF"hhL~%޲Kݲbً&A , g= uNvu +-]2p-c{ !2r)P p1YSƄ/kOp3']`ֽ6:9r*5":Aipc-Qu3|xbN.fEG<5feMUG(GRRD/< dF愦i>;n4G7wJᳬi2BZDC]R9&(=%ꡞJY6[u% h]Q}u8/,.j-m٣/CrA''oϹ5!,m~%R$8x׫˃׵~W+NV|),%)\B5BM ocnں7<zåݠm\HwiW7;Rgf~3؀"L1/ωd+nYLIj86Xo\65y׫*R߁_Qpż^lvRnqʘ|wh]r!B=ģXh?ē`R1P,S&aK: T奙(Y+B_/ ShF)-lΘGxق%7C3+Sgk$^%MF_aTg߫3:#y1z=M,cTqJ׮pS=Ph:C7y59LxQ@Fc8`^g_ks' Uo㜚|X_)9گz>=˓QIWg?!7ٮ[;iնW00"b;:DL/_ڻ ru{xSeC8H39P:<u~ޮnrsdm_BR T+F^R(ԽoV$.*Bkiè+QU7@39|N'瘝/>rtD:abϫ-NǏʝ7'ۭ) 4UiyuRxf+Q^ƫ)wૻŅڑ4GdMuʝ[C'Ԓ {.ΧC14YGhhpLAI`sh)KƎ8tE-jv/n7}-Q[b~/SifK4Mސ~8boaK>3'΋ᇟynthv#d"͑I$z (n$[&SҕsspԸ.% w_]K|w.,I[=&C}S\XzƦGM>Pj3w\3X7][( I4k[+{B#ڀa zS[lș`]M "v2h Ӎ)ku/B^"q!DG*cRǨXurC%-ZMUd:5ƵF[x0&[Wb.{<"W{V[ 2A+xۿr?Fd O Pwngʌi8_ʉ#xϋb/O|. R)yy_3$pM~rT8{86>ZUv֩EV -Io/^o,;b鞫%蔴ۣ^Ը$D>dx 5u'!뉠  _7M5@ Γlq lāf{O`k)dʩCݎkdZB^M71W)<R3jMPD}5Akyj|"gW.逰]r$9_y{xK4[wmsr;@}HoEG#!y\Ύmsґ d/I(G<0,Aȣ󼜜,34xQ,䬔w,K]}BT;JJ/vF9F+i6ܖ 4,uAzQ4W<jdk|S\Z' ݷވfleP,uٙ{!JhS,ik>=-Jv y{TwBbHEuE2r,L cѦ_Hc`Z0؈v __M[ 8DŽG%mg젝mha-BopCiS;W-ႍ ^WDV]>mdpz[ D>-yX}s16 ,ʼ PKu(N+Utimetable/documentation/style/jquery-ui/smoothness/images/ui-icons_888888_256x240.png7ga c_'K-[eR%Iɐe_3dTBD$kF&D24ۻW|{__9{s 6\0Q07J*LgY?3zЗ,l6mԤ}Q0|_8$װSՎw>i&Q8u[ J+t{VP9{;;O}ȋ%z^Hy\p5ӷ7xV}=h1E9Xȳ;F e#v}g}==$0 ZlK)ݡ w&Rhs { y̼` =ܒT/S~')|$nEM l[A,is4Oib(W 5'}/% 5+f@[L}r8t7v>KWY)8ؔOl>h2U96^|~ ʑj1;[ԭd7x8#ȍOQ/ֿ/J\cRqG]m{wH;t"M&ɞ`mG)<==?y=Y6D.RBQ-Cn, ~xOncЧj*&iCm7+Ȗ"Nuŗ7w" QBQx߂ұnG?u$.H=Mm8_V\D1us@~.5t:8_T; z_m+Vۃ"_`hUѬ^v'?,AFIv,M~ /p9InԸfP—d8S,Jw}̦, ňښ;¹}>K+)J㶎aaHN={MSǭ-KcۭQiGn}%,A= &H= 7iʪ"ce{妿.R,]kRj;]ot(WUZ4RCUcӓ#KO jAɚrL苵 j5F[)y6^M Mz Iy [3Vp۬{?U1i ;6PY*'/P"~'Cq -Lo䁈x GwTxMJ[Yk?:rh8&)|,͕5c+S8J>Q7Ԓ*:< ;0*] %΢S͢|ɓ& 1N3 YHyh!jBD gj2[q $)Rx+9݃(  b3&_Ca;Djw[MPU?(pTj'0!Rbaǚq#ky1iq]0rԈ:YP[e-K$7"AzBPoX dFx1&f)ާo0C5J2hMi RZ>D]M\9琯(5)J^2]q!Q"[Vu?/.b%٭'Mv'j'or9FJ,u˾גw`J_I8V銇,giS%tE?ڵ-sېXf '!3*>a mA$̴Uͽ +Az7_\1 43= LŊ Ij YH,j&߈K A͊!EP Mn}l%h:[MYK_'OzƊyRr{r4D]r^nBO6C2Yt1 Jy4z/^xuw\k0T3ܛJEQY[\=pj]| 𾀚|%)ϲ<@ tHDLXZN5ǺfDj52z'bQU&Z+4astUFy~1YD~:v\ ;|Ew#6cQ'o t+I'Ipc(@)d0* ;{׊v*ɈWֿ{{ُzv^J 8va <Anȳh0 ]E+kljyTwd%֓es! Mm:4dn1Wyif`aX tAwu2-)5[%LMu:E`MîE>KpTt(GoȢD*) LF2227T9h o VB#uFpJ jo[gB-O8Pj@ zKC__*yȼzxwbt)QRC97gDDEz񒦄'>dEw32_dp&?MqobD(s84L8~󑲈f/%VQ㳝W:l IaN!i[o>cA|C?& '7Y|9=.8\j%"](l'#v5pvtM]tłtLw+erZJ0QC4{PsP.vKDF!gJ a2 2ʿ&l٠l3F'ԏ_9(2Wvs"]Z!V`B.do@IвIHCSGr%;I ݮ(eB࿯XG]~! J?_y{hS$KwAs;@}/ENsR/h<04^ȥsYgLYYI?5Y:p6Hnf<FV3q6yz T" ,y^jQ&4G, bbiLUXZ'ܶ߈do BYN댱3vĹCb*oY[9}*k{kJRIuŸ>[H aG%d?XHXƒ9܏M߶re5c3pЩfԹt3G6FG%-س v }4fl^pIoKيͩ+A#.c`փE k-NR<]9k~KaqmVi?PKu(Nw+Utimetable/documentation/style/jquery-ui/smoothness/images/ui-icons_cd0a0a_256x240.png7Pg 3m:Yo*ېh,I*2e_3dTBD$kF&D24[=x^{?_9{ޟs ֨P(473J*+L4gY;\Gڢ.`'YdJ"oExp L.H\;n;}T1]q늷x()YAt9Cw ܱv!/R\'yfes1OT=h,Nxyo̻"[He3B L[2,J>!ibs_U;2BcԹAg߫cTVfa|,|29J #+ggtY ڠ0 E{M&!ռpeb)$z)!t^i\ 77bOa̷vi]ʌKr@&2XnfԣlTx)N(lQ9bm /;>KƾZھ<2+rAC=$u9?4E!w4mnf&[+Q )dxzgJy iCz 2'<mC2|7 \ Z‹_ $G&@(|/ HźԖp8' 87L|YkrI%s9Yt\g"9Bf1l?` ~I#[ 6̽@I$y`»قs>SUu2o>oL2óH1 -w2jkF F y-0{7?o+4]Yg(Rx?AF zwyAHi DE x#FL긖OkiK~BħxoVٌ$r8XMʴ',D$F~Sr_,y}8eA2{v&[['@ח*FHķ[&3tY9p1cyleLmvl]Oi/)d#?hCQ&S{6)mH_3ś+5]WwyJX%r>L=L./ȮRUʈ7;M؅CLtv)rś*xw ӡlUUjb=ZZ= CZ3[;~ T;37/J֐MgE_XP42?_HjγRװ([O P#VКjfy#Hf<؁et)P?}; S7Qu`rG]7X%X`ﭕ}#vL4~Yך$S Knkǝ˯=A;vAT^x[SCFdAm xJۈd($2A[11pA&`oglJh۟:}ׄ1/2@wEi)InJbjU,o>F@A N!T7Th3 CX?p첯JgL |l–zݺ")$'4mBTmM9ǰzY1ٮuZBیx~yrV~ 9 /e>)_)_ ^[g^G_ ܶa 'xՒy{:õQhƷ{(q$݄P_>XQDntFLsjX2l|j-/ޏ ۻIϷo&Ssւ&ۨ%v7)%E<&|ǭ\ W>JIO@Lv&-ȿ^SR# rg 3U `FzAeDNlCFŴ>DkN-H/<ɺb6GX}Ƹv@VpRn@K翛mF}>54$Lfg׷|mXcF/<':)/?ۀz mΟW܁.E%%cU['+3#v +MrelNk[4ͰC; Ψx~.1Jh~W5n29~^ =|.WOf:Ȗ\eޮvRSDM.OBb1D#-v/1aj/+臐W!5Tݖ!YӕHlʛ{Ljl|N/rT$Xa|׳5Vۗ™ۯ+ӥ. 7vzµ@)xFϢ3^Zʭ{^ŅT'4&e™SCאz,ΧC0qPB,#Yi4p(:V 8L8͘D@PC{Kk`F5jf/.7}u["`Oc0izK(*wPLgQe7x17]IKWjjŰ<\}x72Z_n=u2H_ǨxC=C b͠:):X ڹk{8JleXg祔;o@ k:]Mu]TPzƪGvN<Pb5_2XmK0ԦLpcFP5?;BtV'X A@EDT']0Z5(D(>Z؃ OER$M%)\Ig84vSX.[ nԍA-+1x . <|ǫ+d-}9X)?<߉9ӑwfvF.gSK d]8qdE;lw_K^٥HJ@| Tv[J` phq#i;VJڭg;ȪvY>c&WCҠގӥ|x~ LNgrF{\p66JYzơA)NR󓭇.^m`/=d鞳9萸-ZP @>{IIgsƲŃDΙlvڛzK:X?ƃlƒ~B/t؎jsO@oc!`˔]Vt aR//ſݛ*?. M勬Aax9+Fz3QـX{9%;e?"z:viBtaX`De:ޔGAB9Z-A)%htH0 H/(}fDP;:裐J X\IΉtiX9O :ېi[YK:$NZ>"5f/ZOLtlF)bDwOm*&M2YO,"7޵l%/"\;Or8ڷIFƓ$Qsx!. rb|fދ2g1Fg%ܿVFt^j:}[PXS,Gmf-t>XWX0xBLHhH Uo#Nɇn5 J0ccm s(m:=T⳸|Tt֔JŒ%-S)^q}בM?~0320%sGm_#d57:kƜcç!Ssze3gh 6 Ў@KgCAlL;.}>ZERC1^{aD-g+ޒ֧v;ZZ修(9[,a$p2v`y\kǨw>@LR?Yi :PKu(Nxf@timetable/documentation/style/jquery-ui/smoothness/jquery-ui.css=ks۶_m'$cӖܣ{Lnxt5_$j0s/?>宮ş1Bl\Ct9ȳJH_?~T.DU#١;d{!P?I5@/>+oH/.^_ P^RvgQY$] ͪ2+P]'(I*[—j: %&5,kY%qyڿWs߫g*TSn{H_)UƄJȳ ^(E &P-FEUW6 CHr&;h :>/<G[p;6aEW+{*wzFըq)65`IV?MSVor_&:T?q0U kQ0lRa:m!;.Qd9 "nG;Kp9NndE--OyCd@}&[iS/-ȏfU&d225RcnQal >Y=. &LqmY$٣sfpl~n%+XTQHyW &{Ta< D>4;Tofz U͛/ xzϙ n*GeP[rBD(?/6>?/X`Y Nd7J& +jmDQ }YzRC`0=lsXU4 +jMJF_V,ߤV$+h9fÿN췕AWI&;dF6;eC6wY9zDqJӂ;iD1L4]Vg\=!٠i$ZeGі1v:_):RĕbT+0;{lvV/p;%Ksar[N6]Ѽ7Zz}l_ 9 *T6t/hTfI(6ptvenMR.4:&I k@fEyu (6r;C]#e$xl]VHY?Kbd~iHR<z˽r~#ofqM^yKD 9%&C&;> Mٛ/b2{Y qŵ_bWL)N?kWm=.OL*uVjGi5-fP.SN$]{x]&=ùMChP0]b7(zt0-JN6 d(Q|(hrբFfaz 9hQPbp!0-`ߖtr>~[*Պi&:J 9lcXEj 9UX..7`JcXAuڠCdpN%06 qÁGw%V4? hH<{K&eʑ.,NA=`fb+tp:^˔vQ-ʣ+ǿrtQnDAz3/BGurV5m#ݒO0bcCYT)Qǝ<a(oN:N%-6F[Ӊ ݱ!r"]ʍ'7bș!Or"ȁ:ȇܸ(."V;K>IU*d2 bM76?Dʋ _?z(@9 i?z(!a'1 Ш~D0$IN@_",Bmr{  ChTS "n,==*pCP^&fCx.=:f(Qm \td W7 t6^NmUf3h5EAě /c1kh=J=].츸D5B$Y84Cg" E!X $h&fz _v]WH(ЊPԱj܁gQ9;ҡ[ 9F:ujdULj3jr!< ~p…U0$C=<,z]"=FIVz"}P "莫Pff%U^i P8 ,9CAgf8›M(\9kJ-q&x _,Btmx -?%Aw!Oc,,vD6IF^MFdH=5{"+sT(62a;ӵ7>:q {D|N{i,m! .ܐhkX׈=*Kh՘g"4-i62xM6a0lxL;ٳ&XH=k/={Y3+GgO-]A'. e5ڷЫX}Q|7oP Rh9{_:͕tcQj*}=& }Zs6C0|)7cGjį_+]RV30)(B8 ̳-NhS~M%Fq{-GLeӲ~ricERMa"%u,qq?49q B0P_OWT D[#n ! jְ6@9bV3>eguMW{Ldlꑟ*vaLK N]_LdyKQCҟ{ Ϯ54!Iq/6>:mVs`f]q)3#܂@WC(>LFh:'߈/g:M*4^`::,x6N={Ȁ\qVI/WM X{Y WI.FNv7=H;\; SB3TL;GPB"5 ݲs9O'=*F/fMuĘѴ_W-Պ[oh-:rӢz_L㲓M26(6NeO.2-͎hN/jNzoN-3֐sbi 權:9; Rm+Q-`L m˃2V\K_K؍Zi|aݝqv~,&h"it{TM|z/B<)cq݉T˅r4U\V63ZYi :jŐZV>̬t~b2<r-lie9!>H{1iSύWsb6lse]?;i1x3wy+5U_&MQXeQ/@G|'ax)kc[ujm6:҄l㳏cSЦvF\iwZK54Q3qRwq|SQ=D2hSpڂ{&|{P%C—rmxYQu`w6,[?l#Jx'Du<?t)8LyŅ}SCTe5^Kp^iaJMO8;篤"ldybQy wg `wz juӀO6d"Se,k)M$JZITsVQ@א)beYQJD O4޲ ig۾*.-+nY0MSscLXfw^޵0MVCjȞOiD_)5 `"śvK.kX.wcuj:>_ɬ]yX$SuCP,EiV>{뗐'&>G͠L iz uĮ[S⧊~P«3:+[*s(#ә(,1eJs-$"7;Q~t4u#ȓ尪 O4G pO%9\W&6/ gUFnZD5h۸׹QG놑u7xY[T {r|4\" _]$y||?}]~} vH[}zJ;$hloi}!p~0cv2{3aqlWuC-AU^/۾@¨:'::υ*6rPK (Ntimetable/dummy-content-files/PK=Pz*f1timetable/dummy-content-files/dummy-timetable.xml]ms۶ \laI2#$uo&7Ɲn'HHbM i[ )Rb2m646As@Cx{蒰ȥv "M7X(uF qjN/_P|b$qЯ? a8٪됲9ZфȍIu:YȦA 8vi&q!CB > x /(sy*D%aB)/4A>^$"(n cbh2ǹ 3#Q<φ|~]p vIDp[C/pGUd(r}QY¾rufUsy r)IYuj ׄLP㻁1-uϔ Sꁶ_R{%)/Y+I]KDve_#,W~׃KFڱ{ O}~M7У)=$+4B!.4H b-#.b4r>5BN%eQ8o2 <ݨ hZC#= l/35Gh={IiDF\Cpwxe2fFyJ # : $ Ӳ^Ju sgkNvӻd~8'WN}-e(*F( FWD eǡ]kROv^Z2L',|$zYBj~UG<73\V_ .Ʊ{#<+/N-Fyk^:w؍=29w}<_I ral/ Du͏{znp1JWصgQZB*^=!l|H煁KgF稆E(-g++2d|!h!C 4_}3K8X$М'$y[_ýкfӬ9M:ǽiiȔ)<*4mI4<izKU3J&ůSיu.DR>cכO&{77 ='~wQׯq[9t1ސ!ZRr%WQUs+_Te~U6 \]IgۙgC2 :dەrSEq7<ny"~5 K>Ms5VLsm5ǽu BYX)C~- \7Xoߴ~0kȭ7:h!0jȫ=\3X5P7V,n/m5Xr]mZ|yՆhS߅}5얘s7'k!a^ޔk}F##mipZR3(hDv{naMf5z NS vWpK8i8UuS礼;?+a+h{#(3D,tx%OW Id{$/u8r{#Ɯ(eD"wcr7I8.\%CWnD>ex#s'4&<],cQ YmL0t`16I ` ->'j̦^ѺKkkmy,y׊hߪ;쉈nd3sJQn;Q+_f$eɯ3c< ɔ8n,"{􍌢'ȥލn/CQ2SG6נݱa`@e 09; 1[Q 0BA{ iMIS3)3q# Fğ W/Z^FnCW~#!e)!,/Sm'5U?~! R^ b2K9 |yT9.ҌOI%W,?ȥ>D$*^$ sSa6Th5RזLd*TZu"ubTl`IWxBt B89oU4AɸzO*-a[ %SNO}WI.#n"n Nٹd}|R&uqRu.KD`b#,Wʖx駫4eԢ\OKMOt=<`#(V"' WA$Bxx}7Ƀk Eϖ4AA:4/ibM=IH# q9(a$ "YɂedAX㺹Uוg 0-uxAJ9 ^%vĿ({M7b暧,.cA (O Ua}ƯtFX qd($C!PlnR<K?{bPȰE]bָ4$OQ.ˡ)$O!y S<{o37n]lU ðUW?k!HDސ9m?} .m (??>[k%Z^YP+H;P1)$< /If{ZU7NGgv$!B@;ICU R:ԇ*bM}䠬B/xVI~HHc?ü7^GB1?w j,c~#do%$(E(FBOvGe>Y~>q`<3>.ߥKULnܟa[,&5Na T)Oa{l K$ }c#ػ6M["Y bed1a~9SB# J$nKﷄ؜d BuU_L j] Ϩ2-"[geV0K0{9^rABQkۚT8S`mBI mW7 [Igkב5tϓ>O2,{걥Iy-Tq R^cK!z牆-]jYeV><o}B_R#$/!bOGUCU.Ъ":QvDutf9ѯhb_4bj1'pY 6 Ĕ,  KiC&@)Q i-)0.a ibuAgO=,e]#_D$ F!!N~Hƿ7JX/k򔻵80[֮)h~M`{!<RX?F1xXa]D F/|3Z7Z1pmk-d7H631s\_V^'X[,Kni|,i1ek|hC4e4 |~NTe ᡂ T0 vASB6AɍAAbv}X ##l=>Fhm[Z<q&Sk^,'->ʚ|&,PE#=J@PNA/ uEhwScdjm8A]{t8yc#OP)s~r 0^5B[< ^.Θ{: YJ]-oSn^i! «:w6XaDv%dn hFyZMתLyFIBB> {16|ЌSÆ:6T{By4󆈂'UY=egp=pֶcR* lgUBXoE@q =ѳ XBFCF洬9v )p<Ee\#;Xb'-Xa!F*L %s=:ϒj-IHD- 28aF"XC;ʎ'TVZj kA-^{@mdžZ Eb[C+C{gI%qY rq9E|Jff_<ヾKoq!Q֨ҷή-G_U $J+ $jBgs.KXWBg'tրY`qaqMe{,8,̺ c$ԒPPݙa8x -iy&P!nCN@s enZ5@џ?#$n.uVCvBQ_ n=6 c$%@{7  FJof$z~~!fkuRS[ ZWo[_jI*'WxX=s~>-z|5OvZae>m bAX#bͫDb:L,ɩ5$v9S{83/H#+ʔUW?|cZNJ _m=6TbjI6.$J*SG/  [ؓ`XQ룪bFN%EJ|,# JTDPw>4ePj~;q-$-$!y*SRO4ce 1(,d.IRSJ5M0wmࣹ~pQ6P3C@Kped`gv 쎺a"oE9I \dusVJ]ѠU)GJ wQ JGAOy^ud#O'x\vj.˲knpunq%˲ \{u,uGCWf=Px1p$zFT]_ЈV)2| w++l%!DfBj4¤\5 ( WI5ܧ3nUMV4Y w%Ym% 0gQI6ĠUP0UYTe˭ulӹzJ3f<ѣUz;;Z!F8Ka*4 S9Mf*[Ӧ3OfWf*TD3fc\.Ss1FprV%, aQMs*Gu|1)*)B{D(1oqVMtF-WDˣVNQ+iIe-^S*đji84e]N|vSHϧEjڬ[9nت0[$ʑ;yOپ]R4Yidɪ^d?iࡻfg,JG0mF+&].LXΰc7 V_x@X&)KS,MY]w.~*yk*oFok f$kXk[2Ւp5]cWv\ە hu̝Ů -S$&+Vj΄U jA϶pvW*^(0=ձWz4KfѬziFcծ;ULgx_d;|,|aF CUwnx4sCvѐ,;2 -82=(SM8U8м+h^I8ucW)S4NƩğ$T8J?M:DCahv\7;bt^L! iWs ف> {0^Ȃ'0&vAl'vV _2rySdLXvcGB:VGE:oGTCMTj?y8^5)uT9tDEyX`?O;i͗drh^S2G2F.LpIxaݤLT꣖+Zm w֒3ۢ=UIJ-%ǤUI2xVXFa12*,#ce 2$_ty2|mўfjL_5I$)@a% 3?+4#lNpДh0/&n蝹|k?F=]yw8#V\`YhD!#%"y$4@U1T˭[RZ4"n$GW2ٗКpzD"qь泼/<SzZMEn)TX7z:Gn#<;b*ܞׯמyOǐYt`x6#<, `)^\whC:|31,awd{ze[IW;|[_޼ f I@4"(CCB:%܋PG4r(tI@/E 5ôD.pwߌ1HA=4vey!r۟xlO (I~^2x;мo[U*v S}7IDc?&`3ZNA5;"f=D&'A3n'wG@ Thbs8$sb/0|÷$Ɍ]9V$BK9h~a晜wPßx}yC(Fz` gۤcw/' FGе0=0Cc(9#_3F^\oc1f@] F'Cafc3f8$#F6@W wgz;iaHLn7ь@E&lV]z5U-0t,Aݙ䱽yԮ}㴟q/^[=зq펄ܳ* L<)磓Be_ *n_͐LQvB w (6-K٭ZoŵE$}yꦢդ$zxm:`Gp[Y>[mK/at.vظulm/W ݠuI˪ /Yj[ݔмCgŮ歪y1 mI'>i۵&ѻ|: }LKWw7Ll: MGVlMb_jқF=$km[GbZ .-ƒ^'h~fդ4:xQ)9xX'⁶ Rm:ni3NQm J _J[{v^mQ\:@taٚ/,.|Jab+,.?A\-.[u&S]G/AVAb&*¢H%{gU-INQ9?j5%PBXa¢NWRX$a9wlUI]t0j8^^.U6e"|Jէ1{ȟ_Q\^0&ޔ][OCs1wFkjj]F!ȇiV[X-iWcOo.o#~svϛ Խ? f7b\̖4=9:z˿ jA]χz4{Cvkho~WB "d\AѸv ~E.J;>XwxdD"E|8!|̫o^c@FQ."A"LiA Mкh ʝ;#))X{ӉnV-a!s3Ĉ%9&I $ePRv;/vp`Bc7;eD K|%w1 m>W) OtO\:S2<SEAh|MթW?I>|$N:Qߝf} N\rPzB-Bߑc7`D&x@F9. j@ϭzrg h!}dFg ,D:Bҏ5Es ܹ Q I/ 2v9ktCHaen"YVƒrD 'r@c7Sₑm$'bSvPЭS#Ev'RrsTk~HXV:YHYǞ{'貅T杳\$xbځIzib6"s`CdESPʌtk,x=)$!E/z>TZ4G<x-}R<5`Z,}!ڑ>KbQǑ,fD'w'-ݦPQҿBTʷ4;8HW(z {;#t%Bx-M)UWO/Y;<- Z`jy@̕m"c$U4S(+*HxpzW+0mp,ko_'@$QO'=RJhyIQFdcWcO` YF.@=F + q!KP C{յ7Y_k*L"ֶ&fWXeXVy/0aXpX 2WY4\kW6Mk(:Y[2sD!Yyz"s(욮+^a!kfYۀ* e5UBָ 0SCI?[l2~^!X빵f60:YdCb3)w'atd;Z¦'L|·ŝYN_a?b/$UX~ɥEPҲo=,M[kĄ)r姤%W80(֜"7Lh(~!5d6_|YRGM멀xNe\8͑=OǨ۴͐{#L)$ XfRzS7>ˏ%.h~$G[tja~{Kh!Ls#?W3Z7PBlj9zqcs@8'(# xwY0Z‹4EA8*͛ c>P M]$64}hWwCû q\enaG._~U`G4x)$|Ұx$G8&w^^otyj@AD>ѱA A]' rB%ioR(MMn+g=0m,n߆!Q"]f LU+Ep]&4ń LTqQ>BئtՀB#TB,1h)hXUk#@hG8~_'cu_0+Ar苍"]hV;[3k\g:h=JiIjڏi\ Ek|=8@&}^Jac(N}*쁖/~?AiigtC*tFTL;EA,Jw4L?,1ixAď,WU{03sɌcN8ؒL=`=/2̜ ,~¾1hka3hUVnebC ѥ&zjAaqpP"R&LQc}Ȣ>ħ<=*X/zy\gK2B!HsV D%hc^G ϔMlc8SĢĂ| Bur`#D& S=AU)Yf 1m[3 (W{1Yud \~s%Oed+.B?+t5@ғt!B HJk #fYhl`\vX+61#R[(ZЧQTXɓti+1'Y&l)P6[~@%Jg@bPKu(NH(4.timetable/dummy-content-files/widget_data.jsonW]o6+fiZ Ee } hEr$ {(Z]%{彇UDsfS~O_/}<$^ܳ\1ZeKt(:HZ{nwA|x=wϒ׃$^%Z%SH9H^E⾓Ҫ׬d/6`y煗ؑQrz@)[SL*\TjOB8ȱ@\h0vd5 -Z;Ok;9LI/)o`;lVz@BܮUIdd-J7Cm ̓8{]>jAJ[JyBCzYB6(mMtFuI>4*pnp.lIsmu$c{N 9"ڤE2́d< (pĐ24/SaFCLŨgÔ,wCk FKh j'QΊs"ߐz rL:ZW &d^_iZaj.'ÐYzDC=g6 ݅^_% ψ E[ܰvȁP\JU|boȝ^'Ԥ_'FI4#ތMRɗGZTdNxVv$e<5u1a}]҉ N%ZԦFz_1b==+ !@tJr1jaEtimetable/event-template.php}Ok06;̊B('ez=-I+v?7!{7UN" v*BxVntHh\" IjT z.J(P\jHbC #Y[T5XPe_ʢ@Zl)d3]eOa+c9Ku][{uLYb?@čJ2d`) Ǐ,waVl/qYK"?kZ~874`>"aߘv12jB^ &K99{~XS=9:Il^:n 5X3OJ-,5ۄ_O[5T5`:|X] ?mLsUgomS2vaqPK (Ntimetable/fonts/PKu(N*wStimetable/fonts/Lato-Bold.ttfy|ǵ?<dZʒeKy[,Y! &^IҦ)e+YL:a iB I&iMm{fc gѣyf9̙33gJI`@AfM~QB{}'5͘um!In7hDohaK7bW([XYyC}ߴ}A훖n\O$u>-7! B9j~1ÉXS[ ;kM?M"Yy׬lEgMB6;-_jYݼ .}= >e鷱[]w!BLmT]4О o_j7W4e>8H,ۭ3W5"S!D;B,fu!LRH|ʷ/JDE}"".Y$[gw.,a%$ Þcm8d+ג׉RR+lWlaA]DN[DThv+xɃ[w$Kq$InB]HuR(O;ATl"9RǾ( I,CG GMBJ=P = Q!=1(JQMسJn3yKYH*0ZͿQ^A}r#(_quz2.R?/;cȇ}sZyyVGi$S8H9} FF|g,^ϊR;,[~fu/>f>232?, j_Mod&Vy@x98gKLjO!ĞK0o!eӌ VW-H bFf ̿Nl 0>% Y{~] fc`\`D?b_H? n!HeD/%dStHU H≉$Db&b%6$ʰH'vY"M<$2-O -"Ť/)#夂T*R4(RCF&X2'H=H&2LaT2L'3HI,2@搹dO,"L/!K}Ccyy' y"O9FA$9AN49Kΐgȳ97NVfr;y'kȧd3YM)FH*msg$m|FsnB.߰'YK:ɇdzn*yMB#wT'TIUd y|@>"=뤛|KI "dpy=72i]ˢy#%PV.(LӲt,wE6]dIm9?#3'A"5QiA5\z2{^c4kѲe2 ]B⧋-T0Cp<(Odg'5̄5924qRYY" Ӯ^$A#{ ؗ`0!D2ܹ`[=BVUE5+"Ma3AbQ,xR4WI_M8vS!D\3c&=Ln6' Ja1i0QAs$c0=)=dG _0h.?O(&hE!.CO)rXBȏ>Y|[#WlxR:='? Ah}S(v)+=$r*UnUZi4iuߏ7o7Ng43E¦9[Xkɶ=)%is+)SڴٞgcV!Q,r~ cY9-vxr-=w:m]Uz_~DŽ ',6 =ϛʤ7&y҇.5 ^kM_>nLΚb9hʨ)\lxq?lE[ӕ3F͘8yF36qMKښnoiz顦33ߛilhNiv*U={Ȝq;,$-[:Zhrlˋ-lc/"v,E5փܾ͋4e騥 -}j u,{e+V8rʍgo|&Mo_\c_i[mmvL[{]tFmؼa߆GҾgo|cSҦl>G"IjL-Վ]3W]tjUdzY7v" TP@%| *7bhdRAjVTMjJؑRRC{L#UuʿJ&ɋ95V'2] #uyܵr+ 2=B%Y$PY>}ksE.Ii-+()*J5f7YiKviZ7xBax݊Eu5U3j򲳬Kڳ+s\C!'˓yK,RŽ/҉@~X 4l@HJRH ו18U6d)ذՁ8ѡHm4]#Et\_?^+%6NduI\8˩?>ꇚJVV1m˭vdT$%Tg8sm/.޲e[(7U96[N[cK-Eg1YVPe?azJlɒDH& O-B%G`Y d ԕ.&g.VaRI:x롂₇#$amw{4Sɺ5]ktUE(HOIN%ZHM6E^d*n UtF IjՂRit|(#fJ|T_3!ObIrl4O,S1*%h>M:Z說54,kUbGHY,n{5=kntd*\WY?i h$J+VpqZ XU4.=Y|;)r2Ry #ې0)jU>TR#>2L#qlWZͪVJa٫Hg6E"GAD;k3B9al"rQoMYLM 2_Rt 9URTɚіX$VWG9/Uvj .hRjI "ɭ6L:^s{}&tдzo!ḽ{\ 0ﮏSKy2W Uӽ6MIyyZr~}tg%Ӝʅfsbj&Z1uo<n_CXm(U2v# ]ND!̧-~SWWeerTLcQm*nuskFPkJДz? YJ*IqFn_?+Cj|#U(pU>Bzu%Q`$S}H9J1& G_I+i˃EpQ gÿi슐W1Y]JVdRt¯Zp|w [x[=v{bq/.qSJw ѳlD){yzgok-+k6{d"3&}x "q*8{ӬUOfJ&Oz\΄x\n1D6J2`g^VP1-*WyӔB*YP8!)H(#?KRګ棒jùcrH/R!)D!ܑl,1\񨔙L{İh-Z7PTP15аTQ%BR*aEhJUkr*]y㊒iNz3G)Silj)IK޿g;L_(y%5:4Y:]`S&S]ұY7z>\B`i<_w߲jW|Aռ1ΪRWŇlA`1y0Zߪ[6 6 4+^dQ]0Ҁ\xQ+3IQf-ձ`SYiORTp˔U22ƭroY!l|-=UcNVo{vv~ɉ) lhy9傇wuT8T^eU 4iE~h1j/~{)qoQg}:٬GG9SzuRFVe,57 ?'˕aM05jy!zy?B$Bb3@#S1[CUʚA9k:%nzf J5`Щ͒JgO3,4Ϙ&UײEgxݢ:6?}1lBQTZXyg9 aEb'ё:\GtZZTl=AbtƩ\A79$irNp0I;7 {YҦm4b25Er`|̰7F@&"/ g RTU+VdqW:Zp*3ʳ-{ ,xLf+pӊ?x稕?{(-㵇CߜaQutm\)hkXϻl Ny{B;2D )D#vxFϟ7Rn4.r*l*92޺Yf?էNtPťK+Stkm_f9f,!deDɅT!>/׽*~22uTSz . Xaod‚|359džŭ͉T!٨(QJF!*6sZhy$<{xJ(y^\E1{ظnʿ)ſaa}婪dsr]Rk=r6x}LF ]w5m;bc϶MKO%䏞Y]Za}'_:o-./3>\Sf<2!n]v85™;nfn 3Tr͋&G2z+C$X~o>6ROBd'DtZ(oCBQD"\!PwEE͂i5Fwr\;NI~#n)Y8 )PG otiSv`cJDC141i>y`x54JDs(Y)z;%>CI0*~BMjYdTe4H2RZAPp )V>C̩3uJ37jIROLxKRn򉞜Y9B60Ld5o!N%!/R0 XSWt 1%XD7lH%[$*XC ߛj+N%Sm5%5/J3'fz%&'/SJKJj|%KzbdЌ/JR ?Y=$EG**#pYJ^I͹D A <Ö2=V䃪࿅ |g~hŊC_}s{^?ѳiSef%"m}CKz2o kCઝ;nΩu fNefϬsmMMRY6=CqCP!])m-3{SβTa]ZZElLBB(4"RDYKc]!cJFZaJh|`Äӷ{s-tvi|ཝ-^Pٹq"S[~󃫖k;\Ir IYf)|=nCyacv Ȇ!UbXhdey<3X+Dļ\r i 'PכP ^x3xj'^rد-.vxʩc;"q4X#PUy#qGۯ:V g׵¯GX>_$p5Q]~"d"d'&m2]c3_zG}x;gRLq9̓Y/l;ĀxAEڐa!m O/?ԳBD|{k ÷.MO6 QfdAMz,&}jPq<Wb_y.j|ŹĄ$o#/`FPDͼP#*,rZi\ s +_B*XNۚC>rnl?̙~'I'L`q%=UncV|.{edӧk]Qؾ_RIc}uMY\krFWF\4*K,;nMɢ߰qr_$mOK4$2s a\eZaɋ5T%)l,%BPK-{0v$J,$g9rzYk䬩F$Xn Theηa's!nOd@g2l\TpefC'MtzhXjz-H5wn)[oLβ5V;g~Ƿwn|꣯O[ߒe6e ԩ+|uTuPT';2kfUOj-vsֵ'&Ys4Kzwwc٦l1œk~5 [̽3N()ʖID&6ֳy6ѠiX'R(>=ߵ//[4sm| ~MōiVݰc84)$(d&YMF[ iaPΪU`Sx9WIAZIt/ݽH+b 9r( 5z9DfPś=K{-UlƯ|45lKʉvDG$SBNГT2T;&]$Q5KUb)lW$6rJY=Fo(2/3^:nФ!YD(P <(zI\QnC\w3dC >WOHmw los3#5dj nht39HR L{IX"0^s!Q-*Y(X7P,"d`y[B]Li*g&۶6ҕ; -s*N |zqT\0NJvrܚwxwLt˞grj܉bͳȎOt%4}S }""Ao8)7DcѰ*e{%pf9Xw.w/ > 5 ۤ N0/0|E23)']4[ho+9 BcjePx=Zq,.29j w%] 9\Xk㎡1PDSX seyEܲ 0&۞\gLUyy5v;^wްϚjp6ll|d2qt7RSbV L1$bIU!b p ٝ!yxRH $D @HC& c fpE4rG׹ UymyIΊdK7E7>zbt$_>掋+ȼ05E.HmI#VI$!+*WCiӱCcpcVh1H2toFdFN d_`7 խD >G +P)(]^XuQPkjƞuI2Qg7%,5S\$?D> &|!,Oc$\]{̉K1B:wJPMJ=w&LZ3d1~iϤө)Ͱ d&gVXH~k^nIqne^eV=-fNi Tf+_N l XhePSC52ҍ*HlP&qnLcs}hQr3R7|T43eȉ6RƦbdSd: )_Ψ0U<ΕzTeF?Yj,]ᓟ/ƲU}k^4c"+5qU G+Fߴ<g{WN^|zwn|񁙉<&P^7{*u}R@!/aO&"(^elbBBĆ/!feC"ҘjR":zt*6!}4{"iE++AbubN֗]6ZS3ٛm'.Ň;'ܖ\C-VbIgu)fE5*<3XKg3aFb"Rx&{N5$cSGǰA_Æ7SgX:kngs{%DMߜsy֛Fy/<6B`bc#؜U˳"9z>7b:sT~B"~U0=^K.|5vZ GBµ[N5: GTȾ",0od͗8ޑa^zEl#6+n9&+yֹ5:C-dgeGoo_uFge"JvbY{ړ}p'd.Ebt%e}{ }TiPW TN(<^=L/rT% &8;&wLY#CzN| ^ڥDZc-.10hȓ^uc?Dn-A9Dr 1dĻYm >^鵰~TfB HA'eOKNJ44"XVrY>A FwCZ%0 O䁋,EnR=Q\3eOWf:a]vw/zO2^XXC$BblƄ F%&:N)^nf)_!%6!'+% 83wX!4lbM6BbAM%0Q5=ġ&IѶYlwa MfZm'͛LbŁţa=d m~kz<. XH cdF%+VC9j2d~DlBKLBK($eGd`Xk% yv#6ehd5qCΕKP!Y>艢.S%.x–SRfRsB{ΊlKؤcrlK'uo Lt +& \@7tL3[`xC۱:M*fDD屣]"Ȃ+{9I )Il/vy7ʥ<-I#"*vzeR*z+)Oc7jٚ깾Kƪ-Sl2Oŭ2;z:h,b"!v9S_| c7(Gvb}VSBne}._;+V.a6[nꂺI /]ū;J7'kTGnݼ) 3R[M )KfaRV{?nɄ&$R?,JG%  ]hG y2dҕMf|Z RIK$UrSGZjˤ!k5;l”2XuL6l M7_6; S%7 O*!^1\K^*a^*W>*&-C1GbWSU?04[_P)˿+i)*j))Tla#"r? ӑ>Oc2\'屍'8#l3|FHr8 4.4JNNϰLDTb[vQK6Qf%MR[*~N~&4h1<+3pN~BmNa~?37NgafzM~ɂaNKI7S,F%Q =S}wm*0$LF}P:n |)_IF?K=թ&y#~d40e!1!ri teVRWt.lа6jg1AFl!B%Qz:QDDCG>MBt:WK߰;Կ+ՉٶJO%\ :-2MHdBLx~W3~!!Q<[UW|9*2֩)NoEPJd*&2X2* gTV֨*W[ /]73O'TyU4D- Eż hb3I|v5dklvJS|t97XU(iM$i#+a ( (& V׾;m}CҹS1¶:痤9"03,@ s;+` "5|5qU/oʎ=&*`  2;3"ȖSpT&%V996EFb9X[ }RL*.B3\ҥe|w w!|8,{|4S.\`(FYܲǗE3Sl:qw?{oqW_k6ǨIen=~kvˊrοwBߝ3{OmXgK1,s K˓V~lSזONYHNO/st#'#p4da1͓tilfmqyPfO|mJUuNkv-Kʹ8ӪwF1R W)͸g_IKa:"sCR!],J ۃHlȐapxLmpfni#va']۪ qVbwV3Jϯ^Ӽi+JfP4tWwQ6rl.Q>`N6': %9[F^6aygQyeљY3nÜycJ Sc x R|D~z=XK/ȃ0a3E OQD:.% /K VOYZjjuyt]~xV).M`+-+KKYO&suS˽d?!5=UDIfʝb!WPCZ ~U N5q'PG ߖf7egKbߋWWNI4\=bƱS|T"W$?u踰UF]#W9;(ǃ1M N]O]mqhʱJdn骽[ZWybIxTgo}koh͟nxoOC+"#ߚW\W_O2[ B} |{FvtInW 7bWW!_0wWJJS%U8&fξ0 nILQeTMtL-L'mYfYkͯuWgɕY++;a8_UerK.LKm-eZ 7htZKU uhQ4XOuHrȹ$[pYoksa$G/6~SWM>!+qqZ-Q6RǞ>Q-}t3mYjOV69j~ٸlChjxFs~oޓxIUwL^GFqUYZjJ2o\>"<Vh>Bo:Sd~9"!󳪊EwN֯M|碊c)ub~_vv]qbΖI*+ugoSS[ؒP I"_k#F2{q{ГX/Ho:YfDy^sA1W:ş^*Q:QzYRs#,Sn .~x;ӁP i!U|BJ&&1nKF{7!wgâ9s+JݝqOYsL3GKI:rQ3r'Ԏw5}&wkR[V3#!R[ xSaϤ87vؓm&#CD,:c}TT +\ ,_BqKH"S7몀ͫuFMi-3ޛ8͚mP'9,%//*Cru$θP]nnyrM4K u.)1JͲj6m|g9Q4nN+ދ3Ւ-4ܘ`CniXH;%voɑN0?I7muMHmoHK ^͵])]D̽e> Ud\q|?&HQsRDy҄ԕ)SLJ1: 9Ti.P=r~1uѵ5Ku;}C֪gee9 Zs?*`gބJ$ #:ge|Z-983佒xa))LGZ7cƎ*O>'|8ijߡ ȝhWlc!7ׅ o90={|h/H`Vg,8wDnvtLd)3C"Bf&nDqr (p<r(p\phPVHtلh ܞb?*Ϩxpy~˿2w˦BHNHO69+ݖ8T^#d1ǚ7x~K<'p3Fcݹ[skd]J>Tfq>z4->$Usc`)]U6&.Nx7CY1` A\ŧ{]$:l0̗s#0k}NqlSR2g˔cǎ4vt`歓6`mS&: `aٳϿA6k߲&oٸVV1~jjI!0]O0%O )[-Y &G`H^tSY>%R:՟VZLl[[?ɔ a颚SAdVMUT¦8G4 qQw1j&Yj*Ydb3]NJ&DGvSSPr/fiv(eqU.J,/ԸWl7'&ďCRh3~qP0).bjމ'FӇo)zԋ)kA>ZJ٬fn%Gb #wz8m4?9[O]X^T~I#ՖWL*wۤS2ķ&!Q\RQ }!Dt[Lp6 7{xLqWyo6XL]u*yZ>_M$Q-I ߼wW,Uo"hR#܃FT+Ԣ";ɍ{͊}y^yߥ?\YP~;ĻLʷ$7Re p^`? iPOd¸Q2~"=fa3Y%mLf*jt"QMjkuJ BR IDdP Te\WcP2aHV9KP? ~,~,XXfCYҫeZ*M(Wrkj޿ +" ?_6) TBEx|_UC cb,#Eu.'$5Xp{Ă}kMz0n$[V ]׸ ȴqmnA&AS!º!~Q3|(wN|Lx ?|'oTH6(*X7o'Orx_UO"wϸ=UD$ÎWBbstW&~W$*z}b|%t+;tEd"еH' nƥHubЅp7p_?j=0;F~޺\IJCc8{ so1bxܐw"zw# #oH jCEb;*5kz4JC3n:'tD'<8v78z7C'u+~K,Ø[D|4o,um~KOʙ,(X($A-uGg]~!3{*I:yl&/jʆ3;N+/p]-bF|5Ħ Rv+? )t3y2|ldg:md" '//k|Æ)o[K,8ҩtN6>xt@BFzX!I&J#,=OB#*ׯ*qI |փJ<5j<)xھT`(f WlYW7.Q 7n.\[W,)*o\=톻F=YGז-5*k5)>xD|cS]Ab4 Ս'"dCF;$HE$-g],RX3LɜZ0~BݘʲҢlWt|*tDAE2 3YWTYz 8A™vpfƦ<1K%)eIbr :]L }ܗ͞eˊ 5W8XJMS,ס盬%2tY:Bp1۩ YW]e( &V[T qVTj_.(BBN[Gss OP~(::zTkRt[&P$$.[sKg签}Lm =M;<#Jo͢y>T:U0Γ߾/ő(]r枼vҨ[)\7HI1sis/_(V [J[&u8>?sR2 yn 27ĄoÃϱHoC᯳iO$|uh?ѸGf:ڊʆL)ܳa(V^`2H*{p;+|" ˪Ɨt\\ VeGɊ!{h6KfT.1ɓT|f`hk|Ǫ_GXVZ֐/Kez/PM|Uʲǧ`-mo2 Iꢲ]O>:{6R?nw|w]ϼE;Vg+Mϛ7yT9|5SGQ8{uK#o~0!F8$|O$|5B"_泡 n-hjUp?)Jje؆8C[t>PzX>&Hyr/DUҐ[]%{DŽD7&5StePgh&#Ar;W-[=yUmD8gB5M+n{;31ɨ:n0=К<\W ~msK?_KsX.s9!^a!~2O7a㦏UY^Z\fJ>*!Mz2Eu<(|,)lZ[h9CKc4zbY~ᚹR,er'm_1s"}R"\ӗYE$lwtPFLpj,'N-]䳰ȐbgDb~;'etDs+[IYdoSl#ep. ~(^ OG_??R?|Ε~|+P˫1?riM?> G?dJ]sUoW ai qj3ՠH*&iln?n}gҒmF}T^.Ke5+ltn8$K**}Ɯ7rֱ%Ź,j*;j)ZMxe_W)#tnEITͳfI1(`hv\:ddS(ePC⻂|.!ItK#ŞS@#g{KHbP:L>(/=0;>dǷ>Qz%{W|.Yguudtu/Q>V/~rmvRc)`c2 6Vo)|k+KG{Ge:RB%-Z U^ es-_Hk4 q*aȚ1o3D.~݌FfsȹԄ5-ZH8bҿ|blܘ27iPK~:E)6µYh=J)ȦkOBNus6Nץ{=o}&=W8%Qs;OH"9oq!|4jEj)5ȝy5)Ri=_~rrO,Q2/7ӯ%Y#p럢t3I<ֲb^56;iLV_qANIINATX4nZT8"=bJ̝WZPl؝O7jVI$&+VTيH $B@QD^ѣoqO1F"Ry<5mΞ~vyqC7p(I%xfvt>P2djNIa>M| #u !TK#>TkFVxwkxozĞ+0؜NFucAV]e4Ù_p+ŞcYAzgX,VK֢5i5g|2 -Ҏr'}FNq2wrshRbf'5&K9rMO\bg';'q,LDuX jtJzT2B;BrEʈvt}PQ(I5k6`۞/+9H!\x]4!VV\l?yk> 1kK%&):iUE+6_>[wӔC*'3f$3t~1 K~ҴO/FI$[':@>$U'\2MVKxk&Kٺ +L-VԚx1ڑ9-`p9)E$Q'+Up~|+V+,c#8[Tzi!:XV2 s=Ԕ0a%HlA))jʦ˒2|>C3JUP^{eS$vC;o2ް7MUӬJ:i:D\UH̾OyP m  ĘN'kt~gǦիsz+yEa*W ˹xp*5*KƔ̀JAbވYK)gz ʈqU+sG#> (?7zȹXX83^(5,$~+&/-۪GYe3_/fu jc\w44l]=oTn]nWx¾,lj/^N9+=l.jI-Bgee#E#N{N1~SB"=oS~ gc/sfܝ#G3;l6ί5Eg\˰#ѻђ詣P13ʣv!6U:I& }D]_so6HK"֝SY7E+ÄXQKx⨒ F::j-j[9Ϥx.')W3vUrQL ݸ g.@$Պѭ- ~|}lI69v|ϕ]^1V{m+8 blG)iVe[u&o|gMnҽkLIiI=2a3$]s OG]ֶqy.)m">Qړݟpgg2464q:6rj4 qD%zU!s G]0Әl-2^ߕ#0\"ilrMaΖ}WŜ$˷w龓IMحmMHp%$dˏӢ׳inkuaҜ@)1DttT8TysiI8md4Lh) ENGBDccCʾ E#GAڮ!4^^gP(o[Zu XU:gs}@+//_:].-_}+ͥ*5gKޥ/sׂJ]X}}I˶Z,\/,>mY}d/ H- + kj<xp/4Tz OI%,&>jNrUflhTW2H;kEk嶱!ԛ3sE,ܻWL3kV )+ͬR6e䬛*{qi7_I===o$,_PhN2'}F=m];d=G]'Dy-8VCCAG^dy'{$SFNyqJ%Dy+QUE]RSt?Ţ)Sy[. <)2ud+U9 SΞKoHqo-8$z25*轮QN))P00'pX:F柟vfCn4gnf yȌCdDb c1IH\[&s,i5͊~ / ¬ q˷O|O$xL7L~0w|[6q{/`ߕGt6%Qzȍiz*yμ-?NUaľfk.tgJ:yjᢺ-*$-[yĦ=:ڥN7? +g?ʛRbNVNyG*`&>,^9=čҜܚtKNTQɬl,Lhs8R]y8GoBV6l>ڈǰ1CN:cPE񝪅SRSSV}AEłDZjj]4\{EqŒ_\aO/sr{H(/γX߱Mp'+4Y\{Frr~3sTArgL^Oc25|p(pD\#fïuf$Y:i+YdM* ngL\kWDh/1q ) sG5٫ `JQbg3rj=3+S-%Eiʻ7mkʚ {iJ^4&ަ5km% %W^ZlL_xl+Vŵt'd ;%qk2jR!Iqd&+D%vUT($ i_R5T!&`c?kyIqyqL,/46EIqGīI5.1KKTY\k2Xllk$kveC#"O=lN{5{&8ΏzB0z%enԊ)p+$&Rs"'o'cm!&q"{Я[AH.IʭT;H\+#pE}bؗRpb;bL[]GtF*^1|pa8p<ZH u}EJyϔ]wz/_z栋>($3U*|9+l'B:.dg R䋧~~#ccF^=Q|\NiK { vc'Tǽ~1N)_b~@Rl#?1}ߝ7ϡ2vt dO]l}tx.&sɗTKg ZzdP*uYwh9Wq wLő8кXȻ\޳$pT0 / jȉP" a(:ܕG]тt 91l%4ON-2JRYB{e0YWT(R/$3(8Y{ 9Oo-/Yife V)8.^#ʾ<)a}ӯi×oRw 8LV Ǟ1fV*T A-eS^/0x+χi ^10(\ .^$bI 2AjB$FjTvLvΓ=w>p6m>oajA]&*2RU5>=Grder^uFz%?2=:/Y^U3w+_ f1 c>\Y=%7QSsTgn{*?ћ杘WMMy^O^I h7TKRU|a7FLaǷ3Wv,'H#}d;U\L,?’R &)WpxG9)Vth'+bDj:cM񱻞'Hq<(13Si`l>i-Q㹄ҟ3%~.(6פ?㺛D #/x^mɶ:J?MdԴNb{6Aj%Y fX|s49/³y^r@)`ph ?~m w 8<>xa'>xi3g^/ KU÷zM-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M-jSԢ6M7tz'$fـkg==;w p/H{(1O<x Ys/"2y=!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!zHR!F"F;t_a , Ne8*|2?x; O3؂5HՆ"uގ-s';wpGY_D?۷_R|}ǀ~2 >ˠz@#OL xuGVOjX 3.-apL miB݀=}E<Ͽ@ο|w{x~||Ly0ALy0AL5ALy0ALy0ALy0ALy0ALy0ALy0ALy0ALy0ALy0AL! jz@cp4f |A;`&%'0~,u90A/'{8 pr N nf 9lYx<'\=yQqנ6P\vo" xrۂ8[ҁ8݀=}A;w p/ck?< >x)Ӏg|1,s A "} /_|o_COQ;'jW| _w߅?@?cO?5\Lz_9.dz1& N`U)} gfdptp1C,lCn]ȧpr(嗀oy.}~O|<qzx&Y$3xA I5^<V2Xrb|^G0XH jCYkQ:oG`%nۭxN܃;w p/!U(/E>?cO?en \mcO@=Fi@=Fi@=Fi@=Fi@=Fi@=Fi@=Fi@=Fi@=Fi@=Fi@sk41|A;`&3x'r$&Ĝ ،Yx<6.   p(1O@'| 4A> E CB>'_ȸ k    ""&1brUD܀y^rdp`d&uEϳ粶Vt <x)O< x|<x)O< x<" /s6 _;}O[/ ~B?{^g/ ~B?{^g/ ~B?{^g/ ~B?{^g/ ~B?{^g/sw%g X$_cp"Lll ؅݀=}Cn>xa'>xi3g^D/ ϗ2kbC! 各rHB9$PI($C! 各rHB9$PI($C! 各rHB9$PI($C! 各rHB9$PI($C! 各rHB9$PI($C*)n<@/`9`ÿT#pN]|i|U0Zh\ Ÿ]1Cq90X͠q N "lBn3> ϳ|718, ` B1%E: i  wn9 p7<x0Qc<Oi3g>|9EJؾ/_|o_COF|~ MUc4UT5FSMUc4UT5FSMUc4UT5FSMUc4UT5FSM`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k%>XK|`-Z⃵k֒QQLzePg=1`|w 8` bp_18 pJpx 8' !y`;B6 [؉.   1`|< x 8S'O<xE| !/S:۠/u >?@?cO?k0lj0lj0lj0lj0lj0lj0lj0lj0lj0lj0lj0lj0lj0=0ųfdo0hs⤳M쀼-,o4[7d4f|1Z:'"I SLp4iB3> ϳ|oepbpke޾AYmb-Ү\vo"[oCn[g+B:!]p=N]| |xq><x)$O<x3}g<]Z^@/ۗe"+k)u )z~ ǀ~da<I$' bp``3l918?&-kj-_![ xBvp^'P>xi3gn_D/!eW ^|~`-|jP _Z*W UB-|jP _Z*W UB-|jP _Z*W UB-|jP _Z*W UB-|jP _Z*_lu_lu_lu_lu_lu_lu_lu_lu_lu_lu_lu_lu_lu_lu_ۓ j'0}w[܆vMn<w|SYƱDg_QlQO?00"-x^6j<w|SCph 84Cph 84Cph 84ɬG3= `V+;"{x~|ʞQˍFr#j܈ZnD-7QˍFr#j܈ZnD-7QˍFtm^dp``3l'<x)O< x%_c 6&PJ@i(mM 6&PJ@i(mM 6&P:%D3QL8%D3QL8%D3QL8%D3QL8%D3Qb3 m6Cz!͐fHo3 m6Cz!͐fHo3 m6Cz!,0 8,0 8,0 8,0 8,0 8,pk/3h<8AC_|i?`p>?Π&dNd'gv!N7``/``?6'Qc< x 4/"2ks8 EO3h|.D ]-t!ZBЅh B.D ]-t!ZBЅh B.D ]-|n[|n[|n[|n[|n[|n[|n[|n[|n[VZ1jVZ1jVZ1jVZ1jVZ1jVZ1jVZ1jVZ1jVZ1jk `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` 6Ƕ? mmlc6Ƕ? mmlc6Ƕ? mmlc6Ƕ? mmlc6Ƕ? mmlc6Ƕ? mmlc6Ƕ? mmlc6Ƕ? mmlc6Ƕ? mmlc6Ƕ? kkkkk kkkkkkkkkkkkkkk@:P@:P@:P@:P@:P@:P@:P@:P@:P@zK롗C/^Zzi=zK롗C/^Zzi=zK롗C/^Zzi=zK롗C/^Zzi=zK롗C/^Zzi=zvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvM6+LRG&9 o{{ E<dϷ[Q֭(Vu+ʺe݊nEY[Q֭(Vu+ʺe݊nEY[Qh-B[@ m-Zh h-B[@ m-Zh h-B[@ m-Zh h-B[@ m-Zh h-B[@ m-Zh+\ nW[խVpu+\ nW[խVpu+\@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD .o` .o` .o` .o` .o` .o` .o` .o` .o` .o` .o` .o` .o` .o` nonononononononononononononono{o{o{o{o{o{o{o{o{o{o{o{o{o{o{^o{^o{^o{^o{^o{^o{^o{^o{^o{^o{^o{^o{^o{^o{^o>o>o>o>o>o>o>o>o>o>o>o>o>o>o~o~o~o~o~o~o~o~o~o~o~o~o~o~o~{?{?l5`;a kvXրl5`;a kvXրl5`;a kvXրl5`;a kvXրl5`;a kvXր;@PT;@PT;@PT;@PT;@PT;@PT;@PT;@PT;@PT;@PT;ANPT;ANPT;ANPT;ANPT;ANPT;ANPT;ANPT;ANPT;ANPT;ANPT;A.P Tջ@.P Tջ@.P Tջ@.P Tջ@.P Tջ@.P Tջ@.P Tջ@.P Tջ@.P Tջ@.P Tջ@.PTջAnPTջAnPTջAnPTջAnPTջAnPTջAnPTջAnPTջAnPTջAnPTջAnPT{@PT{@PT{@PT{@PT{@PT{@PT{@PT{@PT{@PT{@PT{A^PT{A^PT{A^PT{A^PT{A^PT{A^PT{A^PT{A^PT{A^PT{A^PT{A~oA? ~oA? C!?B!C!?B!a0?F#a0?F##?A G#?A Gh}ЊA+VZq>h}ЊA+VZq>h}ЊA+VZq>h}ЊA+VZq>h}ЊA+VZq>hUWcz ^U1xU=UWcz ^U1xU=UW~%GQ~%GQ~%GQ~%GQ~%GPx%@Px%@Px%@Px%@Px%>GQ(q8J|%>GQ(q8J|%>Gă( J<ă( J<ă( J<ă( J<ă( J<C(J<C(J<C(J<C(J<C(J< _; _; _; _; _; _; _; _; _; _; _;#p8#p8#p8#p8#p8(p8 (p8 (p8 (p8 (p8 (p8cp8cp8cp8cp8cp88p88p88p88p88p88p8VpZ h' N@+8VpZ h' N@+8VpZIP}T'AIP}T'AIP}T'AIP}T'AIP}T'AIP}T)p 8)p 8)p 8)p 8)p 8ip8ip8ip8ip8ip8ip8gp8gp8gp8gp8gp8gYp8gYp8gYp8gYp8gYp8gYp89p89p89p89p89p8yyyyyyyyyyyyyyyyyyx{^o/ x{^o/ x{^o/ x{^o/ x{^*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2\*E2/g|= _@z3/g|= _@z3/g|/b]Eku"5^ĺƋXx/b]e^F+{e^F+{e^F+{e^F+{e^F+{e~pĠP& G8)G8)G!?` ":vlb#r+osv"dyG>/Ew|x1'WP_A j+WP_A jk\<~8q.&dC.F8Na<`q Fe !,#<3$MLBtݲr K.̆-ɬ|F)EҧO*jyL'&.iqw];zuy'XI$Oci,84ƂXp Nci,84ƂXp Nci,84Ƃ9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\9W@+  qr\EV".".".".".".".".".".".".".:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:, }Z+VkZB_k }Z+VkZB_k }Z+VkZB_k }Z+VkZB_k }Z+VkZB_kIHZE*VU$"iIHZE*VU$"iIHZE*VU$"iIHZE*VU$"iIHZE*VU$y^Fy5:kt#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|>#|5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5D&IkD&IkD&IkD&IkD&IkD&IkD&IkD&IkD&IkD&IkD&IkD&IkDi1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l#iIHF6m$m#iIHF6m$m#iIHF6m$m#iIHF6m$m#iIHF6$ iI;HAv$ iI;HAv$ iI;HAv$ iI;HAv$ iI;HAv4&bD예c"vLĎ1;&bD예c"vLĎ1;&bD예c"vLĎ1;&bD예c"vLĎ1;&bD예c"vLĎ1;&bD예c"vLĎ1;&bD예c"vLĎ1;&bD예c"vLĎ1;&bD예c"vLĎ1;&bD예c"vTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTĄ8bE}o}o/Oۋ{_Kmusɉˎ9}q%Iv~%Exloۣcm˒"[v%biԶ.;q~=m? ~O?o/Oy@$tCWd'oev In\aZ!dcT~wݙprW0)OnK$N[R䪡T!j09NOt.YM'of(ydzJDrA|yvldΝtsR'ͺ O;M'oM h2'griV;g&L% Hz<ۙnNq덟}:|ʅetp:=5=9gvLb2=Lsh] 5˧vݖ=KԜOizXCD^3e_p*>5gߖr)bYd(dRzc8;},3\LHN2\;oNf hvjl$OǓȮu*km:-;^`!mŞ#XI;21)>SX*gvwzR|f??Nfs7s~ .d~emc9NMNs)֎mi^K#gs!2\r4Nܞ]c`{̸ͅEKwX639MߖIOvrCk#UyT{CZ1*d Br{vl,˯ƭ1qL;SD>=YvcR<.;/]'.gN%c2dYH͌ԑ/;05\ʥ\rR\;V$lv*?G ڵIz}yz9]|u5P4p.3Y3c܎u7\5f߳+,kfQ+Xҿm?no >6kIvХ,e6 ٔgyϮK.,vDҮ#Mp-~q5ilȷ *:N?5řu$G^7567$=Ga_y{,`3_#ϒpYV͖?9sױ^=VU3d,6}I5e9$;3:KZ ,1g;9a_z׻Ͼ} [;"9n;}F^Ѿf1޿9m?m;:bξ~+~=JC1ax{N!=Qyd"Ƹ]} Ea9#~ƣEβNsY(l台!S\[+ݙSG{ucnۯl O!ɜY#Tʶ}pY6˝3;FcFu8}aX3n~lۺ#b{7ҬyQ͊-aކ$`=ĩJ\gʆz>)_¿ٻs%^Ա[jNmd')vWiJ;~ΰWٙvmJ{㹶γ.{ϰ#m>7څ&{]2\lo%6. ok~]z֮mv{?pnM{C{#-{mTXig}>iW E'>jֱ*kr=av[nؿ')GVGImw"n |wn*=b~>lkؚ{44qi2M8X8~lf)S+bZKg{WaiU{>n۟۷;X4"?eZE>m_߷?a8]+8#ęg'IL:L&*q- -Ȭ_KSIhT4=DzTtqɖT!dps!{xOa73-ue79+.Z\vBJ/m‹NHOwۑKݖTn`HƯ.ޥyp&7<5},[éOm˥:iZxz|v>SȌ>sĎTnj|,5U8XX1~-&.{Z;ʫi' v-C۾tnNieJ{cx%nw7.Kh{x|y˚'s-ݓ>~c?9m+ۧ=yU|3g uY?:{g?yΙ猞ʳW޴+W_꧓cYUs\wy{=`|^>80[WɆ?ܸy3oX7]xㅟoM7~\hEyOn/O_Ʒoy%mֿmϥ].rO|}W]_kv_uաpnx̮ʋ.梊-֢J,6@EUWT[QeEuUUTSQEEUSTKQ%EuUQTCQEUOT;QDuUMT3QDUKT+QDuUIT#QDUGTQeDuUETQEDUCT Q%DuUATQDU?TPCui:WSPC:TPCU8|q Ab?{ q@|b;ׁs q@b7 k Vq@|b3 c q@ v|>v@O:2;P'0ԅ U ^B}Pυ:.on ZB}P:,_ VB}PO:*On RB}P:(?RA߄&3Z몮ʺꪪzOOPKW%]utUUCW];뷨nj檘^jj媔N*j䪐j㪌7[4t<XŪ*NU X\bX,`WܿbX+_W\bϯX~+_WܾbX}+F_WbX|žZ|sxW+^1WlSxz+^1W3xy+N^1Wlxx+^1Wxwź+]1oWlӮxvŲ+]1_WxuŪ+N]1OWlxtŢ[Cw܈^sś+\qoU|k@g7#aiF83Bƌf/#taYF2Be'#4aIF82Bd#a9F1Bfc#a)F81BLԃ@u@Pz9p]Kǀ-^K#;@ P_T+H~TGvT+GnTFfT+F_{#\bϙo+}ޯ£w=|ףw= (nx?Ǯ0΋o^lӼx2}>}UaO}<>o{o>~ϟ.^vqVʄS&2a LdB'6ɄK&T2a LxdB#{#,8ñn,nc1X4f,.c1X,0^,b1X,cV,b1X,(CN,nb1X$#F,.b1X, >|-m>No{*iVjE֓jViF>Ms7/s <x5KKK~KwnV-Z׺&>4ZǩUZéZ B+~|k>aG}|ǯff=Ozr?^YQ>dž&[\c[\c[,_$w_aNS}>֊[m{_;|\&>{>>>9>>%_>xǃ>x7||}ܗwS]=EOp<`|qxq>}菛|\9{[v[v[vҮV&[қ<>ow>%_|~ޯ}<>o{oc=l/l}m|6VXgcwٌQ١z},_3VsU?V=VOqfr3nŌ[jƭþ%%0Vp t -p-------ǵ׵׵׵׵׵׵׵9!drCB8!$pC̷l5`eA7! amiC8BƆ6!t ak4! hCCz3! f3CZ2! d#C:1!\ bp[0zs`C¿js5Vy! ]BXBul! W@& ,! G@( !7@ b !'@(B l!@" ,!@(kk}ߗOv HF3d$# HF/z\$" HEX$" HHE)J0P$|"m,HD$"F$,"! WwK_L8Š/|;_k8Ř/|+ilcjraū-Vmqj#6mqiI[u^Yģ}dq Yb?{,cqX|b;ױs,cqpG:N}E/I$]tA҅N_Ռv*r*_W38B}^}qoGs fh/‘??,s䣯r哋xa#?UpɉIND#* lbCcq_ۧOӶ>Y}޾`_{KeA*B|I~{žixJb3w2il]p}e.G\9xlŶDv>2;RoOM^yVqC=֎s _⟸NZpJQ:Nxo3KJ,7o[ {}no!r-gv>S?PKu(Nlo timetable/fonts/Lato-Regular.ttfw`ǵ?/YviG˯BTm oېgF`=UǍk;w ׳<ܸt}1h =ͫf O^rˏ}`s參YBy{6-͒"h7켥nLBUiKK'ݿCr.!_;X[] ]mobtt8cc9&Ȋミ-Q=>RyXu%Qr,IO Gv5YB )$Oa(%3}Ȅțd |&w(˂ H "{dIS ׂj<=L7. "H$6LZOߊd5T(IZd0)b2Y~[jpsGҪj2i"w?$ENfD'S|2_yJS*򦸉T-dPSBOWU652?e -THx9pj_"FC&}gL wó)Q&S$V4bUM/gTk.i.f.q>$,)|OH<{6n.{e7dϞwb#P#݌z i"n.{"VgyI ^ -.obw"3BcFuzVp>>?fW{?QA Vg >֟j iC]D dK&}MGL?&cu:cWN zGS rLfMJ9!^1׳+>Y[b"? KfUHefH)d4czkWo>~C*m޿_OZ4 NE=KOk2=D 1yomo.BF<dމȯ'*aGw y 'z-^<NTk)?\?K0#zF HI1%XDibH,co@I{vfg$tA2I&9$|R@ 8$ERRFʙE 'դYZRG&z@&IL&SX?1@餙 -$l2%|dYL{I,~r!Qr=Ş"RS)))9))KRV,h!*ht İưaLNONV( +2t#S#Fvl8rȂFcS~|?gox{~_[׷>|o֯޺o]oSh Wa&H^1@箜7@YBRa\sn@s\{^\@9*7/y@۰t@&mH(<NjsW%ܹ4y@ngo htɓK;gNjs l@=@ya% oހJ^&!HAVFј\<)`iy@xn*o b_YS< M޹scc{:R0jbBgrg#9j'59' IXk=c3b.Ϋc5  X,zh8a ǀ4a V℥qy %m)Zc"D3${Q9.3+/1R.2ȴ6aȪah@Nb\ZJc&CCir2Fxjan@>G:9Y㩚}-0e'7'dž3O#iUi=2>* '9ΞsLÑ;`s"svw犱|<,k_|gĚ[r܋͞} ^&};Eo5֠JHr.ׇ$yٵ;:C9L60$OdVTFŏ fOYxaOټ˾Xsϝ' w ʟAqxYxYrl g-Z@y@bA'3Q4Fd7~mhu>CS2U -,Mr l{>/ sR>9|QG>F*i5}٢JWR=nVMf֬}LW_Š2,2aXa5WbtY޵E QQ'lע5bcvJ6?IXU]''ݑt,7əSﰯJivD8O=!XF}ƥf^ٙ{Wma 2MgsQDQUbeegZVD埪KƿR]T͢kܿ=Tg;7 ?tbҹI/Nzco&e'SOY5sʝSvN;𔧦\lZմiwӡ3MoN0O Lk6sڒi6MPf|բj1$dԵLk*[c[[խSZ;̧f^7gl֯g5w=2 , 6-xwg < ,,-Z8q≋[/Zfm.sK~x銥?ZV?YpEۊ+έV<ZԚ)k6yl͛7~f[wgݚu;}qNK?O]f 7hnkmmͷϿmӹM`~ʹ)\lqGp;3SS"*IiX<=PD" TPIR!D$O15̟Za3FJD45VڸvvlT*67Ui IQ:YoP58];o@yNdXLNRIq#(8R2"Konb\knWZLwIyeɓ]YՅQ &SBfTa eS\~qicTz^P^\ficJQNf~EfQ9u)1fL4HGT\#!Vgb'w$[A} R%6cthfW17e`8wJo"/qyQڑ/j! |>%ỎDFO{|`s/3;Oد 5.]OGfUo5JRyizDAʢ$2 ci}%ß?!CS9Sq)p#U %HJP=H"U}$hÑ(M aa_{t-UIzAy iʘeFeo\*u1جOH 'ɒWJʂ 8/ <ɮs/!jhUbU:Yn2\ n.:=/Lj 5,0A+fHEފFNPaԄd_R\Z4F*_khQVHĢ"gբ''$# dmsG͞9uJt\AnvjJltۣdz*~g5t3Uk(^ܙXO&iHa势 (f_,+I|*5FyW\DXz'-e9<_VfHV}Eʇ5ٕx;?5>\2m)rV P-E!r 5g^_?aqƏMK-+ⅻ w}.>G.)>}K53/(,\}޶¶ummu \11vSW=2g9g]"6ba]|q>kS-lI>IjHu-L/LOI6kդh>%"kB9e1'-NVb"ryf.kL%ղJ"%kjRP/&fٯ/5WGV9JЄrx}T"2#$𨂌և|ѧ6+裌T !ԧ0ePJiE={qN 6Y4!J24|0IHzh?n~d%+Q8mEqyknO\WEd ywmCgᄇDFkƨ.XSzxîiZ\k;ZiW?hhk3| 47J:+C4zhdc%$lUpNpOnɢz<ͶD]eV ~jdOo61z_{>{wl~0Nm6Gx~G_Fr:B2PuҲR3^{.Z} Cw gdmӟ|{BFF> :K H!Y yh䙒Pj B>dO 6gL #P+fLZeL h-ʖO"&jZúH#)(0#*eb?{&50=Ҫq&fvK4#ůFDX7>le K9ګYIQz"V'f'zV&:k{ju22Mc}0XccznH:. `pH*Sıˊ٭vd/{>M<7=Y}T=\6H"YVŨ$pJ1S0IIDT#)WY(_7I@'WdFͤ&yU8NdoBx;IYѪrz4v;ڠG;n5CwGPՖ)E~D^0lJKD&1l”dm?KpEaނ [neӷR.ׇMH͜m8&9V֫'haQ{RGf+nn_WS:)5 M#[U>9{ )P[WXi"S9U:*6* lZfJ'2;C^/R*ۥsOpPm .*szI>:"gE޶QA%cVTGU;j\}vyƘV%I#H1~eSӭMI3XpwKZFB^ua@/ZrSSۖ\WZqOsdrdwiK *L̼׵WU1@e $%lAO(+|>ocJ}u/L1sZ3[n8мVD*?;h/bys}'- YEyɫ"<}tʹ@||lUp碇&HJ6GhxM%XE%Q >Qe/*+𭳗Y;a\WCQfd~Vnuߪ,6?aW{).dRWΈo5l  ܦ8cɲ'٬z-~MLacs))v;)(;g?kۿ5azљ|^u &5nhmиaFxkmllγ~u3|#3%/nӳǵU[؛V1y>Jbp6o?"RdXV Zv>JPhx9H}c#!035XOp LS|9%74`Lvdi3◰MO$ O"cKɔԌ/T2)'+^d 'I4wGkG&jXG0T*(Fl.9[*\oo#@j {_+MG 2Ԁ"G}&]u}ug:7t>4;O}|**V휾xv3;[z c)7%%4j a gR8ܺqmrx[t[V^hk ^+Sn}Ck}m-śGS.R^fb-$8'!^mI 'k@vʥ-|j'6rgx sQ馲4&gM5ukoΘ|Sm㺩қ,_twzݚ=HPPOLX;5+gꚚL[ةi[)SbN!^ mL QI^GY4_".ze9V9~ʬsiiFO˾i&jZˣ"8 /$DLǔGʧuq$q?2fYs3L`nyKZݕW a&ҬV/VJCs^vӏwը&CBfe?y ^5)D3 :o~͜3D'GNfwߝ<.%\'L'H yGY"MZ>o};|N8(m>;V]\>8}JWzi:k =Ox=xhOL}\Wx;ʺ,r2L 0)2ʷKrW^%^'ه!a򁃞A ̓j?G[GQQX 40^斎JW XGv9O>2sxqݺY-&Ȃ4GB\)LQbZvvetj"aݱXo$ǃEdb~X.8 ? V ߪ,t@BD{FmrpWd:7. (,@̫X:{j[6zt\~LOڵuM~)."2zͯr}/ޯJЪ[Q~_ZS0!{nޘ;_v|z#-<656ׯtuelLבDÝ](UYaS\/,J/ o -|{1'M0d ]bټ{o]/}mj싍ul1y-e,"B!jB([ى9(R6Ja8KqCe\A<3N@ PS'.I`bZUκ'D?m\&9sS}L=mL''%BP>,PXx|T*?"?wLY!UW`ŧg|kEtt6館'߲YmBʼnǤG}%1-&XْuԸy*]VpdRϞe­QZ?z&x}38 ~OJA75hr.(sۥq\D;o9"n /Ò"?"{9y k!+Pn0.we矼 Dn K||1߃XeUSXMq*dt+9gV.H1>xJ<֘NO=o 蒸XVkamNl !v4rEY-a̖KTPu ñ%~GpiG/{L-L@DDzW|5yBؘZN-%_~YN,_$vMW7FDJe1"|**) ٸ=/ZuJRYnX/!~>x̓r{˞ϟyӦ}͞_~K7mwHbUξѕ(SV>MCFDl|zp~߈8+ ΃SFa`?rd(t6==~r~gv j6]ئ NGY7*O =nШd_yYN 1y{`0 ̔,{\" op!$E+IpWFdV? HQDzuLRm][&|<]j6[A{\4{?Yþ"Mr,X7jQK?z߇HC+Y1<+ . ^cG {q "}No*wx'˺X:JxZS3%1LǬ<+a)@LiJ5s,D[jZ]sWb+F>|<W2Xg3D֯\s+N+I iUqW/*cU\MzNq:U~}ZK)aiC )Kܽei{33\c3ZKgomhoʬ\~ZRY͛^" <<%+Q5jzyVn;-z+gJTֶgdξ{n=Lqwb\DlS@7t\Pf3&D?HaqBer?#Fotgܠ@>pkˡe+!@%VAa h+F1A?Z(#F@.pplUsyyHS&jw[Z_*Zz#U{7^>G}W]{+CC< 15fSQj0b\ IsQ?.ΪBXf%ǻ4xFGc5tѦZauJc'\644cz~&y &cG!EŸF~>B~I19\bgΏKB(G~k1rTW mL'bST4ScPZ:C)eSfJY#f)62ʞ,SRjbſ *F IY'DQ9Ř z6병jU 1h꓏=𳢬A|:icK:1c_l8AbywJlҜ.vZ ¼rRJW)d< <uL:, rĆO/}}[qi%y󕗧~gWY&OA1RoV&1K!>nQlR~?\au\9+R4Cƚ 6Ek^1DAͲC>0|Hr9CF ~ϟEU oQ=A~4D\Mt/}Ѵ\$Z?8PIzR3*Iy'?OZm¹IM:Q9 ]94Gb| cX d6HIQ6Blii,fsb#ڦ!IMG _J0mx"V?-Fy *C<"/P $Yqp Pxh!Ubr,ķ;i*ȗDD)] ɴ)h>w}kCrڄ#7}`EiխGV-HI3l++~GÓm{Ύ1-]y'g/`A6)#ߑdM13=1>:*䟯,fX*Lkmm~ۢV)0ջzmԎ*9_V&!s=L|kÁ(MDx)7ddO][_;uF&Wm)mSV V֣ho Tb4_Kݢ!HQ-P~Gk#kaa X/ ))ʊM5\rR0v95T;T\wͩ0QU+S Fk@i2S>KE ]Q{}??g[ٸ؟R$mYsy`FKp~U<~XWߏ"K*ɣ4J2c-f(׈*(%_^|AZdTJSy}~xj=Q7fc̖XHG9fxP8sCㄥ LQaN{Me7};:m2RK'۳< )5Ilۚ }7lS}cS2e[~$4$ĄXs.&ϋ)S?:voƤcx5d`gLT[s|*ʳ~'`Q ;EKB o#;x]ADc}S{*ؠLCkfo(NQK~ rŬ(G TL2S?b84 >Gp@OђwJ҂2s0e2+NfygN_ܧku9,G^ll*^F~ XH&\^bb:k}1%'bg?$JmM+j@`[}?Nr9*G茁X%U( ^3/mDI"NnX;^aZ7Mt =)X[N:kXysGEӐ.A!9Y"[|f"!dvqJ~J-(HBbX{G(51FLL:_SMO9g2'}g/]~\os",X]Xf2~D[zHօ> >0 $+\^$~pDa>-UϮcb)$;#-e-ge*d $ZXe$ʐN32UǗed%YM[QhTb`&[TE@qRI]㤮5T"LJuXLxzƢ)/\5g5Qfski1yS/_<%Bge$e'3挟xgCi_]U5e8&w\Mt:ɏ2$fEZJ$+A(&||uWJWs(JQ.B!>vJA>`ɏqnJ!).i#ky͓IeI '?c#%*pB_tQDz(|~&wDƨ/ShLRWxÇpӬq;XyUw74GoY ?jn̡ ~L"ۗA#<(U ͊|(% MI|sόxdC7o=vI9!ܿakniEiwsJ畭x` 9|S̙1g]xldg׳ f*Ç76:}z%JX''ϺsSBc2lA1g+b2lW9ۭcc4#?gؼAiJ @JspɹP6U9x_T<1rL XzFо&Gz.{[e^&LH X‡;v{c"{6܂@7*!#>f1PQj1!?p(lqje85NeṊyP~xd~)EīƧ@+"ڸx=bUpAjUY.8kڄVϛȤ9wg\0sCC؋9I;" ;9$rW=1V11&ǻ;w:\&\kW+2Z1"0E;|PI gWҀD˔+"kan[Y&.pzi9aAżbd.2,M g4[sXnyzP23c<)23ӦӰqS3bf]>Q Ҳ"'^?UUg*_V/Y't4&ggNby [VϿd)u;e&cĿ3k||zʕ2S (J^gEL민RFR"Sb4y8sRHț5mά?KX=Fg9be}e;"?7+aOLw}3={O8+>y{RgG:qX>$ye,eJd7ߌѺo9Rs|Xq2oDPAN܁q7s(#K~F!Z¸Gom#4_n d̪LЛª(q׷xiz9C|ƒAX͸jVII)ZuM"whr-e@>AiR=gMy^+ yX#UO|J|1&!)[Wk 'bDy= J:*oX@$bZTvp')&GqrBo-GoyQCtΪ3-YEuy5KQ-.g+Q8ě/WT&,M'LʨSfOe9yz1f\K)jȧ%IZ޿qhFEbQO4ON83V Ώ梁!f:^+ò2)xڦP(˧eΑ=}+\rۗbOؿ`jke.㨞QP:>5u|kAjp4?˚xe׶?1Ş|ϟs/hv8[؈VCbm|/9O@>90Tb򳓹HRYCUj~gUwZo-XVPiIpYp%ʩES-UnbX'W)::j$KK-${>%VS d:ۯ:ۭvz.EfH=fFZ9Cgz<|19**SRS߬Fϫƛ4fS!)x4_ygG9',F hΤ?^~G_;G}qH}nt{R簬RyѬ18#Gy$uG)~co T ]! TBkZi$: o(7}M6s\smkTeil&sfŬxg[V8g/txM\S]ZX'$RIT!c&h~Y(]Pxu:`|1k tU~Pig&ߖ3|I1iY{7(q ?6J3 * Ŷ}՟=s3d6}[\ ,\X_*+-)OMGj I-hZ Qn 5XFca C-7SGgD)[/og@}&9vS/?6o(3Gx[η=Ůw,%ZMƘCkζ$C\PgVsooh}ٍٓKntιmB9EEs6ֲԤ$kJYRR4YJ&zNQ'z*%_r}(|O1κfў,x ٬Xa?Hz~o6v _:LTW=:7u %?ŒE%Òe|1e$(\* !(nYy!Y)qRYV%~*8n|q3#C%c|Es=dЋ29J>èHblAN>-`%X!TnsyR"s I | ;_,$J)A _du#L}S*9w{ckj6[-8Uӯąoz`WW?Džoi;zX-41<3::<)4&~UƳ='Dte~Q-b-"+a` ?0kD*xJHЌBxJ|XA-ǻ]-lßlp`e0(SzFlΉʪJ鈞?#\5%ɤZFƚ- E&c2~zbk`S.w_]\C.' 0ʌ׸t+㱀Td}X9hfI?B\GwBlX%|g=&%$kRP|8]t KQu_#[eD;'ڜ|I3rsgtN:sNk|2y$~UΌ 7 ߴb+VÄ lh&i|f > Dg쩆FZӬď*ucXx.Keٔdrt>&b<[Hd3]#<N(⫠ B ƐL "iq7"M.\]7u h8k!Ȓ&|uk}yQCH5!+huxLբ2H_"+5Zz.&& GD&LV>0梿 j/Gy!֫ߌ]v]{Y0^x52)1Ƙg32үҪ\~,DSPQ3* Rۼz+z[CN#3"a;lZ6oI 5\{ 2IiihR{oZ<飩VF5;->WsVUkVS\,DE4|cz=GA%FEua2$/z%)T$7Q WM`Rl7ЄYǹaŨQ^|686\f{3ц="԰_wfb7el/ŗB zcd~U0?^4>.p'2ŹD2%N$r WPx|* PEz@_UrUo+ Zd^aHQ6:j# IMsW_b0Iuh74uqGV; +sp3Z^}5Ȉr \Rj7BO7ۂC?yt]3'D[Ma TbUdcurklFş%}㩕Ce|"oawqL4Pu}EeB(/=[\-ww} QpI;'Zoqx8J(xa>-v7-墰"%Ff5$)'p'UcU 2Ғcl*4&tJTVU "QO"[$^Q[MZd4Fr<J[rrJzJ /]^7Sf_?>[aq>D`o6'ToⓉXAwܨj|+H v| p7*GmA{?o0Lmpؾ6׺{кCUrQ-ز1BO7к:%} p_\j}ԝAaJ,}t7>'#1~ns$g7qw&b<Ϡ O9.?oyW+H{yNI ?STBf9ʥmV n4mV7竂 %Ž^~/N[=,~q&܏+p_[r9qH}%3WWG+4骖_zNe==.+<yt焧 ]yl ]A-sAmaorjvK3mV^%wPIpKOKb]Q#gyv4ʤe,. bZŹ\83Yr/8wu Ip/I1qV(l7X./NϠQAwĴ0}ETE´wlbIN^qƎkvxucAƌ+ܑKe4\QQ.eO Me =i垉J>]W'cޟn'?8xx\$G"q1&-\*blOKlW|;;ܔ my+O]y %G>n"SfB4wFڨ8R\J9o1bA嫖`b_лCsCK@m"#r)y%Y(poVJ5ȫQxՒ%RDY[LiOw&gRS4LJl<]A &A"4CR̫Y;jh©Ij㭪?y[N-$jv c# ju_]\ŭ堲DB[FUWND. FB_0ޙ6 Ql%i3U@ x7M`(bug.GyąEsWNIoUƿ*OdD˶%Z kznH#ULcxW72 bsZ0tFVCSiwܱ MS[Z k1L4iZ%Uɓ6 8)F6_Բ$F;.n?~✹N-9QIѿ|]D1hᵊ|2E048H9ʌBfkYQ*跼-}_I2Juc_zjzU7(/R-/}cr'nKNwЗN'Tlh:;?NxU8mVbL}Sd7C0 CyV:-ZU*xϰ c $2-N~m Q &Бkbӎme YId\뇛!a`A@̩?#-f?_ٸ wbx&)\e9YɉQФ*ZӤ<*J'J[1:T|s:L*kH ro('] kE~C1e1| 1;f\yGUH_o<{;n0- Eѭn)Y4qOKjQfnލ!5yW8np!䲛o#p r?l+֘"xbb^p` x/Fs3 XPv e4E-}TDOһ< |> <)Gc AJY$D"ȣ]a9fwcIb~xo j]t0W=tX_~ixUVaYԛwc @_wN;Q4IO  rv->n}+Eq]Ti|rcju?A'!kU/|{ F=X{ WX(F8[ ā0 ! Pt\&SHF߅l ~Tᡨ rXN6pie}ޝ>o.8<'N|6'W>vt?{KB+62\3{C==CO{ƑT^&M wj]s%&65Us;ݹ)/ iE>i)5:6erWJ0&ˇD3,mMB $(}1P2D«e5:\3i**`lGK%I<Ւlh0ENuU#) QuhzFH{ YT?ϝgaMtϊۏݑRaꆔ{ĕ4d_|tw|Mwm?_ps_6dB'T_0NK ~@1;w:N/iDP'b>"h=Y.i7^Ӑ3Aw@~u??ȳAo ?dy_-p8۽"$·ʇݹ~N>,NzwDD1ʠW+} LcA9m +GY9yxW/QRHU.NbmcJ>22?N]*1ɻف۱0? 's,OR+t%?ƋH*eCCs:^P% -+(%BJl0L*4%vJqvP^bŽ=7ߝR4:XF[ 35i2H1 ,Z}uD/ ^ z%n@F$Nv<;oz0b/K GyدH> ›vx?*Z"p9s q* uYU)pY [L٫A~^]t< OG_}әAG NeTpg7|'j8qpi Zr7;ή kV/YVssr}5f 7_F(7R%S*>yJ1 e(jVmڬ{R^AG/e0Π#ʷ#qSHdJ+#CA*%`^Aguc"#zc/PkN6Gש n >ir 5g^_?aqƏMK9.^خt=rIf]\.>svo[!26v+&Ƶn51DЖ=ڳ&]-U91a0M_<9mwǃSW̭b9iH /7%\dMNKW:m#,Y֧rD{褤TG=9>6&by\ [TQX>e:}-}wA [|eaa8c0ݩAYVg*Y۶DY/iȗ+-WBXlMS6%C 3p D|Yd6"b- I椰 [֘4cdfxm = &O }&N~6)$eO8Qef:?3Lm>.JqmfS=- ܢw7O;/t1 f/Vh1KM|l&;%!UFAmEgX^ְ'4-gGJ,yr>{ϾrKDz>|dmy#7/|pGlKv<_?2{#kS;؞ZƵ|.9$T߻-99չՙ2RΣk n ״pMOp^(|@J?Ҫ8 ,GLwWlKρHތ{2&O]4j{ﮮㅎՏ tgWl>R%,93%W͒]q)쮟yyly&ľK{:NmuW3v4T-,cFd[Qpzz2Ƽ"p̟3p˓9(l`.䖸#x!'s -qiAEPMYpR[ذg]ά,gJ߻R?3:az gx@1!LaC#o-]>*WQ JQ$@EXz&8̐ۊ0ѯW."1g6D) Yj[涔_.rA=M<EG{$YreYpyRfFxdfɓUYLˬ̪LJ෥}DCޔ#="DSiyp_#@%'ubBYh^T%㏧Z ՗GL- pQH mYԉajjU:ukuYڄWwv:gw OO.s8˪SSk kRk jRSO՞ʩS+S uM5w]%  IѾϤb^Z^a d[e1%R+"hɧ4-g7b4Pm.'(^TPg(XŠ%?%tOͥ/+QL6] AcN^.P&ǔD$T&{6zS3??/~*I"/Q2!爢uNLƥ UPMI.)T*YUr5"WzzoO/+RYlfW;%2^Aݝz~>q~ힿӦŞ~˗~}MGXI[7&wďH*֩d\%'v*sgR~QJy+Qltqaiu n;}wb'xcCے0HBc4#G}Qƽ_EdǍz&Ś *6ų/#*?w|3ƲNCɨSkHKwy;>M,4Y'k%bt9&4s(xNKLybcðY1p1x}3FҼ/3NzGGunh3%BbsjSIjf='H:ImXߜz+E^U&K%c%W!T""U5%J"Y-RQRQ eY$h^TCI J 9j_%>νa;T *Š=3Ņj\юjnAM]t9I\r!:L>Ga~I"JMVq~N:_šNTIQ*Ϋ871;v!>G)mGttQ(\)t2G/L#p*haHo>T͋˟M5y%m!ͼ(9TQW W?@㊧KfvG5WJg3|5OT{zK@=t3:Jt@ f"ޭSޅ,^&YTڦc"u 1㚭aDgcq_NG~WT_>+UIDK.oyC>K{<92t5?/ P"|nS}٣@|. ~a5_͜a8S([fɔiL42(ϣ-֫2wܭaet.&S=): rd%M,vy~kҙQ& .L#6|mRD_30ywnzJM.+6k5FƇm@SKJXRJ+wnŽB'R(297*ݛj"A%*axu<*Ya"%ȢE<~?(s}g7uTI:rgcΡűXRbs>1y)~brjn.4?S\S|A3|[RQ}:ycz}Q<_̰jKF]AllA]F/As\_pJ#VO<卧e&d@iG]]pWG Xƒؤ؜ԜʼnAoNc+_/*Q?(DO#aH?7%X<kFó F7.zX~y>{u14;J6'>%:{:LReۄK {_:42x#F1h³'xt?6j\?"G28 p&ZP\p+`7(n n={|vou(<7<x Y> x9 /+xW:ϑr Cxw w?@]|1R>KYԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuAjPԡuA=0 ,86[gރ< 4O|xWdxLw݄z7Mw݄z7Mw5Mw݄z7Mw݄z7Mw݄z7Mw݄z7Mw݄z7Mw݄z7Mw݄z7Mw݄z7MwLfV>f0ՠlF & ILRk:ػŀ#18p`#?18y` ~mL<쑽 5s2o .6ГW1r~9ˑM|Zi9bs8s1'l .Vfy`G.2Xt7,lN.np`?0yϿ_=|x+GH_2<)<9ā<ـylJx.,cv&#I2٥3 V1Xy6vPY *;a]u+R݀{x<؏zy~8w]@} 1~ s/Xz: w? s3uк h].Zˀe@2uк h].Zˀe@2uк h].Zˀe@2uк h].Zˀe@2uк h].Zˀe@2uY.YELf$`"` MeTT08"s` RZ<ϳ<vn`pI`8x Ysx~/G*/H#/Y<&0>rA)݀{>3Md4*f:'I<Zz>k?bp>0y- ` p/>S|ೀx`{ϯ)]?"{bPh ' F0-- &<00I0 ,,ɠِf3W3X5` R ȹ. lw38x܎7YwX؉ #}6nFx+GH9?  K넥u:aiNXZ', K넥u:aiNXZ', K넥u:aiNXZ', K넥u:aiNXZ', K넥u:aiNXZ',{#Mf1M+bK NdI-3`v^>Q'<xO<xis|EA}8_E뀗?~rC ЄbhB14P M(&C ЄbhB14P M(&C ЄbhB14P M(&C ЄbhB14P M(&C ЄbhB14P M(&CJ *^xJ*aܽ`9rރ݀{_7R }}40D@pz2lrx.Q18q$ISFl-HoL xY^8/Hy;)#g~_dT*1lJ̆*1lJ+1JlcJ+1lJ̆*1lJ̆*1lJ̆*1lJ+18J+18J+18J̆*18J+1lJ̆*1bȠvA 6V1.aЄg3$0WD@U%UTl@WaTSkw188'6Na3* 3[ފx0FcpQ!v"ef)]ȳ)e`v^>݀{aO<x$i3g||Ep2(7|_|y~KHy] ?n|~3_2^]$?`:`6po8p_7:̀[݀{I`>x Y> x9 _W:ϑr 3w5ָ]5jqWF?R~=H5zjqWckXw5ָ] ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^5jjjqWêG]u |5QG]u |5QG]u |5QG]u |5QG]u |5QG]u |5QG]u |5QG]u |5QG]u |5QG]u |5QG]u |5QG]u |5QG]u |5QG]u=uyL܎N v>F(:0bc6<r'&vtn + J}~/sj 5؄lB 6PM&`j 5؄lB 6PM&`jp 08 p&IS|ೀxU/1 ]3kw5fp ]3kw5fp f P*3@e2Tf P*3@e2TfJ ml6@[-hc ml6@[-hc ml6n+趂n+趂n+趂n+趂n+趂n+趂n+趂n+趂n+趂n+b:Š Ma#G<xˀG c#ɧ dz ЌT=I-3g`v^>'i3g<,y/^W:% G_<G ?hq -@[-nZhq -@[-nZhq -@k 6ȹ rn 6ȹ rn 6ȹ rn 6ȹ rn 6ȹ rn 6ȹ rn 6ȹ rn 6ȹ rn 6ȹ r^"|a#E,gF>0Y"|a#E,gF>0Y"|a#E,gF>0Y"|a#E,gF>0Y"|׎vD#}#~vum_}kGt_;׎vD#}kGt_;׎vD#}kGt_;Or;<$ÓOr;<$#}kGt_;׎vD#}kGt_;׎vD#}kGt_;u;v;׎vD#}kGt_;ݷlk϶lk϶lk϶lk϶]k϶{-"m-"m-"m-"m-"m-"m-"m-"m-"m-"m-"m-"m-"m-"m8]Nׁut8]Nׁut8]Nׁut8]Nׁut8]Nׁut8]Nׁut8]Nׁut8]Nׁut8]Nׁut8]Nׁu`GX?Q֏:~ԁu`GX?Q֏:~ԁu`GX?Q֏:~ԁu`GX?Q֏:~ԁu`GX?Q֏:~ԁuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuum`5Ƞ0p`du`v^>(5!<ɞ7FZAk#hm6FZAk#hm6F ˳g3,fXͰȰ2 >Ȱ2 >Ȱ2 >Ȱ2 >Ȱ2 >Ȱ2 >Ȱ2 >Ȱ2 >Ȱ2 >Ȱ2 >Ȱ2 >Ȱ2 >Ȱ2 >Ȱ2;#Έ{3쌸;#Έ{3쌸;#Έ]e,{fٻ0ޅY.̲wa ]e,{fٻ0ޅY.̲wa ]e,{fٻ0ޅY.̲wa ]e,{fٻ0ޅY.̲wa ]e,{fٻ0ޅY.̲wa ]e׻np\׻np\׻np\׻np\׻np\׻np\׻np\׻np\׻np\׻np\{p\{p\{p\{p\{p\{p\{p\{p\{p\{p\{^p\{^p\{^p\{^p\{^p\{^p\{^p\{^p\{^p\{^p\{^p\>p\>p\>p\>p\>p\>p\>p\>p\>p\>p\~p\~p\~p\~p\~p\~p\~p\~p\~p\~p\׏"QD>G("{Ed}"QD>G("{Ed}c?c?c?c?8?8?8?8? A? A?Gl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6yGl^?b׏ؼ~#6y;[wl!غCu`;[wl!غCu`;[wl!غCu`;[wl!غCu`;[wl!غCu`;[w%[r%[r%[r%[r%[r%[r%[r%[r%G@#rTP9*G@#rTP9*G@(rTQP9 *GA(rTQP9 *GA(< *Oʓ$< *Oʓ$< *Oʓ$< *Oʓ$< *@cr T1P9*@cr T1P9*@8rTqP9*A8rTqP9*A8@ D@ D@ lO "|N "|N "|N "|N "|N "|N "|N)=@S{ tO)=@S{ tO)=@4Ӡ{tOi= A4Ӡ{tOi= A4Ӡ{tπ=g@ 3{tπ=g@ 3{tπ=g@,ݳ{tςY= gA,ݳ{tςY= gA,ݳ{t>} h3g@{>} h3g@{w9pwܝw9pwܝw9pwܝw9pwܝw9pw= ς,> ς,> ς,> ς,> ς,{tσy=A<{tσy=A<{tσs>ρs>ρs>ρs>ρs>ρн@^ {t/н@^ {t/н@^݋{t/EнA"^݋{t/EнA"^݋{t/"/"/"/"/"/ ~9, 7Pof@;}5j 7Pof@;}5j %%%%%%%%%%%%%%%%%%%%fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fCaF?fJ yHxE &@)P@Pdv;dvfGDj-ZZkնI})j- h{f:R֙{ީcg{:=3w7*4j 'wwgO;*wUWrG_厾};*wUWrG_厾};*wUWrG_厾};*wUWrG_厾};*wUXmW#jڮjjڮjjڮjjڮjjڮjjڮjj9<~Ox7Ys<<>޾<~O}"AD'>O}"AD'>O}"AD'>O}"AD'>O}"AD'>O}"AD'>O}"AD'>O}"AD'>O}"AD'm4h,XnFcr6m4Ԝ6mwXnFcr6m4h,XnFcr6m4h,Xnnr6wFm4h,XnFcr6m4h,s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>s@>sHC"D0$! `HC"D0$! `HC"D0$! `HC"D0$! `HC"D0$! `HC"D0$! `HC"D0$! `HC"D0$! `HC"D0$! `HC"CEP:TCEP:TCEP:TCEP:TCEP:TCEP:TCEP:TCEP:TCEP:TCEP:TCEP:T`.W]\ vr5j\ vr5j`.W]\ vr5j`.W]\ vr5j`.W]\ vr5j`=,aiK{X=,aiK{X=,aiK{X=,aiK{X=,aiK{X>},ciKX>},ciKX>},ciKX>},ciKX>},ciK#qD58GTjQ#qD58GTjQ#qD58GTjQ#qD58GTjQ#qD58GTjQ#qD58GTjQ#qD58GTjQ#qD58GTjQ#qD58GTjQ#qD5:):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)fkyq!DžvGC4{W/ۋTFo/qãR[ojG$.-x$q}}Z)>6-"^n_^xkV/:Ib@W.zys[ob--^hEvۋmՒ}.\o/%ۇښ%x{٢.埏x{yM+WYG..L.f'S뒛F76&Nw_]ȥcmҞ%{=tr:[H^)e2c rd&v[\X;ܖMg%J~,SL'2knK^5?a}L-G6d+Tq杇o<[zJ2~ƹ?ѳ^!S*gݮd{P)3zkx}L%Xf2Uܙ,xBGvv3.2;RLrGj2۝˔yl~dHRRj)1~nq8udƽMrpkˡF[δltGN3;*9S w0Tɗ)"]el~<9Uٲ{d,M*d)L-;KSno44i{aePrr{cT.{n|*'g˥}_"3-edJ#{ҹTMO SbE>޻M+weǨG+SSb:<\bG8Y"*&'RB~wRq2H2()If)\39ٕ/rFg;df=B|$yΊ$qӱokqqɈuբhٿZ3L4>>v}ǖ!J3gp/qlo߰ cfe?$EF=Y~[kw>OAi{7\7[]ٟ:~Vw1 -vNi-XԂiw ~t>#5{~:?$~84g8,qeXXa߷EđGk>f 1O}Ѿcﵻ3v}δ;loOW E|bU]ch]g߱wڻ϶/_%X86:q\ 5&%&N\x˶m[RgGG/^x2v+t39nܽjflɅB>sI*zi53TR,\;R~qe_8V(=[xiXXtI&WNG6o>Hnd*~x1+3 eѕ%;lxl/<"-+;r[JfwbXТ>͍ sD%?*V&sJyJ\>3kɣ|(˶]g+rrVB'{+wfy[9?Q]ץ"ϫvYC9E}i񫗬\C'],wч}8z}G\uG5^}C+{sW}7իV߼}ܶq\ӎOOs͖5<|FW;qN|Ig+N9Xwio=}o_y#g6r_[FoݴvCg83sw:Y_8ȳ}śms9Ooív#ӝPD[Ol?OL-O?QO>O>QO>O>QO|>qOr+"x|k"' |"'oouO=mO=eO=]Ol=UOL=MO,=EO ==O<5O<-O<ïlyoaݫ䫏.zzܫoZuZ5ZZZxpD,8̊.+X"ɋ#/"ȋ/z"Nj/j"Ƌ/ZȮ⺊*⹊*:"Ë /*"‹/X"/ ".".께*.ꑨIH@*4$= I HJ@ 4$ /PB -PB +PB )PB 'PlB %PLB #P,B!P B}PAuPAmPAePA[m]uYe]uf*FaE\W]Tu1ETO}3֊.颧.r颦.bx颥Z?ՃZ;Z7У럆ㅻ碞y.x碝u.ҹ8碜q.¹Y:\4rE"\r1E \qEw\q1Eo\qEg\q1E_\tqEW\Tq1EO\4qEG\q1E?A{ 5J{ Ov]/8ޢxq]rOm fݪuխ5t-Fs-6r-&q-Hp-o-n?Ymg[m1E_[tmEW[Tm1EO[4mEG[m1E?[lE7[l1E/[/p}+lQ![|lѱ[\:/"xV篂q>4'Zà Z,hZh1~"!̧C*,ˣy~Q;,:,9,H8T?YO83st;DfEczCϐ, RnnT 5HAZ RjX˧Qw0sm32HA Rd %0HA R` .HuA R\ނ ,HeA RX e*HUA Ov=$ )(H?A Nrt )&H/Aj JRt )$HAF2t M)" nB AJ먛@5hY4x H`|UZZZZUZGѵ]kѵ]е ]kе]ϵ\kϵ\ε\kε\͵\k͵\̵\k̵\˵\k˵\ʵ\kʵ\}̽{> iHaF2Re+#UiHQFz2Rd##HCF 2ҏz>rtc#)?Vb#iH!F0GøV|[mŶV\[QmŴV<[lŲV[QlŰvLL2_½p2E#SL1EǼ{b)&a Ɉ0CE UWq^EyUW]EwU|N9O7:JFeTQF]TlQEUTLQEMT,QDET QD=TPC 5TPC 9BBdU4VXnxV>ׁ1:f|x*ѰEB<[ (؇"{(ꡘ"w(ڡX"=gs>S9{6oټe[6?#1s9G9O(gXC8r$~18=̽?gO~c#8>wΫa#n=b#^h=b#N(=Z3\nw')}4)gۗ&*e"2拝%juQlkvkٵfV>-Œy\ˎl*S%;K24>.ϫ⟮>|0IONZr3*rc/@#l8 xu9yl]}۾cߕBDz=7a+3rz_PK (Ntimetable/images/PKu(N]WUK&timetable/images/arrow_menu_expand.pngSMHQ(P]wgpݝU\uI(ggμiَb:F(ш((=3D@й7bЃQ[st%s|vWoLq.:C6A>zl.YC&3mͭjEAV^~.c'9ޱ6V$nm͞LLUÖ+{1+Ҡ T$Aā&P$9 XN`y!GdQ9XsUځWEv1zc[fRĔD9,/I!AV6TjacY߫y4c4]yig2–(2Smg84 YXFmfF4({#v uXAڈ -Vb4atCyAIx(, )祄GM*q!MV4↢Q)$!$|JL$H*)Dy1Rx\ZpMnt[tChR=C#w }'gOW +zOX WTHˍo-/i[x7oxrw_g޿t.t̮߼}V֭=zoN.\=޵cb{/:gmSz♋3w??|N$o6+_V,7WQdDөnqboPKu(N&/&timetable/images/arrow_scroll_down.pngSkPn N3O6Kڵ fڤUփkeɫv]m hSEMt>~ooO=~ڽGwl-|\]?c5Кj>o#@;%<>urV=bN<̼{pQ֞WPKu(NJv$$timetable/images/arrow_scroll_up.pngSkPLnEp <2lKͶIG kf;m;QAՃكC7o5^MM1 3Qתth=jtN:YM5|,@-TEefIJkuR/UMpF$ÅD#3zhf㏟X`[Yv)U^u-WjX Ȅ*%p1@t@ lWgA_,gP>)NH´!,˷(@D (  jZՊ]eۄx*w]+qoPQCT"n03h(0}#6vAt7xdY6vSb7 ;Kåښ* o|4R5ʂ5=ߦI1:6W䒒egٖ EM/\2`ZtAˉt!8L'.1@K<.B)kR.Ɩ܀b}bՂ Ɲژࠍ=PXL%۵p73cd}~tUP{=?1???Z_|Km%-W 7~z#67/iz>˹̓^;Y.=?L ??{yi~3׭[sW|~i2~]`F7v[ߺ(ے^mPKu(NE=?(timetable/images/arrow_widget_expand.pngTMhP u!<2Pj&ڤu;KW%kܒ% 8 qzG0"Sԣ_z̓ҵ3sC--E,[_v(By\RHt4AT'`Smţ#L˦My#WUmb0' +JGi6m˰` :phv0NjNHY"&*(S+tW"gAUOF5F #il z8?'B˰<>.$ IJ6hRVIt[.`lK S*% Ey3V>3(wWQGiiĖ[  SVmi2uiga~ki77cC& ]Tt4|Ҡjt1HR)iEZ8DiůJ"c'VBlXVb|<,96a'&Ȁq !B '9!PX\Zc l`K$;P!4ULa 1,\/95;czA&FW26 z5?c1_R" lH81n8=Lj:r7+5W6\X:۷z%=兾Ío_vS1,}(n|G cgNt-7 <~繫cgڮj_ {Wn.{ޯJ%PKu(N$ timetable/images/bullet.pngSo@7-kE&6q#4 U:ؗJs+qP( tb:?+ bbc``GHmP8{ͅڝk LT:&n]Ub6"n":0hfbc {\XvBWo߱uTv)Wzk {g;7 B xA䡘yEAKN[[t]B78vx(r!Dk>M  }^%*˦OjP؏ECVCN=O許 "?ړLLe^v\^O*qYɥlNM BY` (ZAO5lJYY2J!Rnŏ(G\D"8l`O3` 8b,Q9~}r=0֏Yҿ^u'bhy4ssjyg%Y1kPKu(Nmg>timetable/images/calendar.pngS=o@vPiNHep7DlԱU8vB"TM'ؗj3entccĀ@ @̝ !#$8q z}_[:5q~aJ٬,ΝON3$˸CVm*Eud9ޣy9鸍&iV68+p0ɘ_^GQ5W,p]Uj`[ RZ]\J,₰^Є KrBnkBQ:Uu5F;@w^{{AR_[fjuAʑa%:E[P(-l2ܗ]hq2!|750!l5?TR[hp 4dQ>02o6@DԲRX,>{YlF+s^.KZURlEWdQYђ$";QY5""?E9j-;.vE^ִdQsbMT8tUfzTe$>GiRFa}4#%e20)BZy9!R)'." <;t Es+:a@/̸mhGYc'H,Ο)F)Oر  䜑*'*93Vdi-f 뺤z+pRUXSYuy.~|C_}9=4$8+JNQږyӌF񖐉x#*2 h5!h:\LrD8O 4*.(s59\BA99*\}t:^~_9I826 L[ZRr/+>ZW[Cn`F pʇ :ϮK27ul6\o2]aɊ$iJ6Qz˖*YYGb9[4*8`fނ|L:gVuwNGzy#&}1ӢGQv'ZqY5_RK nm^VmUQM7yPTG7-w#*n"8XsbCw\32CsR{UCӽ~Z`R0`2I؝\mI0/jo,81HsY<:TU)iޏDEAƒk/r3c<7"9h]Ӳ~]'` l%0F/zS1lH{' ƊF)؟,i\@ alBo_?x73vֻ2[&JjN,u.@E,b2Ze>'1أwRqNm]'R(/7sz jϏA6eQ{ 0Xs2&x.t:6"$!;*!spot"ĕ&֜qt@OW~hMHX v([|̢<8`gxO&k.8Ȇkv7X8D}HE8}6% jFx' _DjS ^ :,rg]/" $0@ą2 аuEL =sM GU4=ߌ 촠C81%zg>xYycqV19z s`?W$q%|&@+!K \Ō/ӼKoa|||. )óx )72u 5j4Kn^͝f bg lnPuQ]~;XaUG mkLFԎ3zڄ>:@ o6]&iYlJK{#-#TUd L*f$t :J435J|ئ\2;=bzP;XgX'82bI*QE(1,ݓAgs8#)UG=KA)hq+zݣH&PªuASQؘi\!BAM%s0/)&#6 7ImiCLoN[eω\T0x`5pʏam ˁL..[8ƂQr{xгRƁ–0%g 7"^IHtzॿ3NOѪ/ӢK?~։mPSO|H6 W@sT- O0G|U>*69":琟xŒgE?& ^""5N R7["%z-a=Gϟnm׉;蜛:ƒ=ӈNmb..&ؘda!C~`*$H4^~T`ZWwNLm LJ7qŁaHuo/?\)|]|x3#7wox}3sh\K&QLnpeI l&<fӼ_($% _dO/a= FPe@`L):X]ctXDHn6Mnz.qZ%fıŌ2[PtKIoo^MbBLve[if44|Q/b3ܶܵ,`qƯ2).nY(# =ez:ye$?嫭QoHMR{6[̌Hdtऄ:1S"U94 i `tol:CZ)8iG 2*?eqS'MooLz'-#Mq dbttf!V>A٬>17[6%VbǕub%wBX&jU'U3A8m~)fHK/9EjNf]荴Ƌ5%&6\rUla CGP%%CH"Q }f;DުgNZܴKS&n,dl3-o*`Oz))LߵBﱼ4Ad{cw?@y4ɧtp9_ D(Q>> ) $Z?x O.ӂ9^5@W1'SF>uJ+ >DV*j*"H&TƍSU@Zۓ=C=c6[:&_c9ѹ)i1"N}/_L^z+'ՑYZI[Ef~[=.7F;8vY~uS3͌=W^]0 B!f7ρQr'|}\~\.2؏9VjSIe QE G> ` αǺe%.iF1D y\`|lM5kt$k[w#D h>r֋2 T/ #tuyeYmfngozUh RDәBsJ(KCLƪ/EjJ[He!C:kP"tazN9Rn+TEB-cF[U?6/Jh'ڱG6q *!շX3 X6ZYIc$g5޿k y:?[$j>-ۚ.xX!j 6?۪uJ MIy+JMt$vn%8}UӬ=n7p⽕(~IJu"P3Yc eO3JǷhøH@ 'yy ?ڃX^\`x r/~d=4n83v~6L[}I7:,t}7BL[?d6Kǁƙ ۍcA6u E^W5gl67u6FP9:tcY_iϴ.Zz92sP`1|n^'*og37>YQi~CKE@#Yby/8xɇzuQ7iZphAcdT ^#V{Ut¤`0uxoq}mt41hN;fPKu(Npm(l)timetable/importer/wordpress-importer.php\s6,Jcײ=;Y<\3V|,X$f(GP~\jnIaow0FuM,lHs_sQ%W]ʢEezwy–u]L&@U"ոP[ h'FVՅyՂN[(`hnڏa:umB\x]eH e *y^w -x TC r*<jĶmfJl`梞-cgHC0eJ68AF|H֢`lED;O=wb",b :.k۳/$J&X5s~'I*KzhA^yt<]DEUY?|:‡ 8vN aL(&jތKOqIm%ǩ|(gK1h2A}Ѻ DLs h2ح( \P*!7Hz l BՏAi-2矛iqj0l &.b&э&sּـ9.:]8KWi=8n)M};El0S̄ _2QYz3cdcF_ =L%}z lC~O2jou ^jHd|dz4q$Ld-P/Rk MX zf]%x9OadjM,#  bfc >:[PeP.Du A:UTd _lASY g #pHD!"nDATZ~i -7 (dki#BVΎ k"Iw*DP`- 0~/#VL=,%v%">jo~"N4ۊMΣX#hI!$FYF (2x]W/UvRjmT Ŵ~P󀜺-G{r]ar60G1ly0|vK1#\8Xhar̐7= 8ڴi@ЬE욂:Qia@%t5ht1 'PRƳbHl)t]"3tgȡ#!Q!NJh+͜DAV A(G6mfH'yKeA %Mȋ%$"ڀ2@5LEūqXݤqfF֑2@\lwUv$쨲Jj5$8;XI;فM0HM"&JyZƉwŹI[_9{66v:Y~ JGq'b#唸TB`Xby}@HHm$ rg i1]SBt@1f_e=,# T:H֠3Bi;Tg0Zxa %^ &zSGE#Mcvt*Py!䢢~fkox~/|?65*q{уl{ꞈAg.vɫPG묎QhȆ-2k=] Χx' <|4KXL0?\7%MzL"k:v}Tu{i iW^iIs@<([;|/V S2Iv ț &a$~OʄjPL0h_9V@&x, sOp7S鉗XNL z*]e&6U@v<$ ZqJɭ&zۑbTaJ4dYвh릧垟Q^5l^[b7|~ܪjI~2rm!{JY?f`+^G'X>h^~xagBܤۅ5Na ԙ=حZKB /p'ҳ}Ygve6N,@1c ]G|X@LK2&\voɿ-PAڬtɰo(wmXX;# Ԅ r 橀1[&J{v|4]g:FW=O^[ c ]h ZLyt`Y*+e5f`02.ʔ?okӋu9,]Zen& S.RgW{:N0[Li kd¾G+'uq!1")>i ;c@'NvĶzLEbFmv&w<V]jZ)daզzآ/'O A i//g{i{5>ߚׂҨy$|nOuٕQN]|s48AB ht.OGLRWxh˼.u\ BzFOf7j_+OB5[\e# ĦTW(qk%QJ>ht$i^8͘~xK9w@Le]i8P^%㰳GJpbHDKw7z陘>CG| }5ͩ * w ,.v+˾{EM es v'*8naIڛ97:+ϋㅰO>8ǿ6j D.Л Ǩr:5'/(W<8[U:uCRhEJv[fc8_B:>~3 Xg{_kȁj] k8\v`C -Ц6"$pÙ 2g +o?> xH n'y`0\/G'pAӦmv] XqCpFA(W eheo.h;4nDwڽ.=6k wAR&eώ!m; taHݕ*#ުl"tLPyM oVD]b^͐5ݺgN\ JyQ+I9<&OܾP`oWln>uO|7_9E#yLE??gsK.֪C_R~֤vp m=rVq~}<3ꦆG,,#a=oBQX՝`o (xlS疭&za#O,Wd.fbjS-:\,Jx.F#pEQvn,u}EfB*]9ϚYܴm{deLDç4Mtw EsZJ|$Z;2Sް M$\/-~_ b~y~^d~g@M.וp)=⿺pތB5; aM[7_śK>Ϊz:iĤ')oF444^=TKB#EF(wa?=jŘ^G '*/D~ rE]4Q?^z caJ5wϽ &/(tבlW&nIxvuA\au5Վ`t{ ZPhGrksgUU² }-jyANg2CcUB&\ޛJY7$?/bm}GuMl<պ= զ 檕cŔ;7x:&c(_?qodt'ܽbd^ M”X I05\-|籃xt&`W2Uh``򁈣oNʦs-y8VE p*gi]oWz֊67 E.b<'zrkk!%PyzS[hpi"Fa)|83H+[ >Q 0&CK'|n nWvtW8TV)m{0أ?c} 9pn5/qQmH87]cl;Ei48CQDQIf'']i[dR{qF_?}UH@;R`DrGोf'^1_NLP%lVC &v Yd{pOgZ d{t$}#_?;ᖛ7߾%Pxo9&HwEѧmMTwNk?4c>P@ya|FG{:!AtONܨC2[7:l%k1I;9y Z;9`vj>ы]ѾSdhPZWODK/wlTAdR*)1w̠kʈ6tUh(}ya(MOm ʽ20bw/i/ntK@^L?:ܲ ˖IKhuL=v6d[$ITkNȮ{~)5E#P4"LHo4CgZɚ_U5ίoTƼW6u9Ho rld+8K=eQKDsjG"`@ߠS[&I.`sV7Ť5Ğd^hɣ4VeDj%pl Fj{R=gEKN0CM|7vy5Pt4x+]6! rBv`B`PIDCViVVXi@Fl)J`3iȠkVTnM[ t\A~潃<BKCUxJ8?LJc/ #!|f yZ(ت!3/KPr}}B,WZB8i Z )Vb'U(hHbkFk͌" }L ,kbk̯ *h֝|k [z=bRfZE5jHXwڣF zU5PH89 (e9`%Ⱦx>L 'u9_! J6؜pfbm)\l,{O^v?eƈe),뺐Sߕ߲#9#F 8 gc߸D&6UƮDL _UHxO d Yx<ޘ7Z@UN˾w H'  \3ijNإcfm>O&0'7G4Kǔ$!(7WLs&ÍJ9Aڙ-Gɺ!A; UV`=qz$}WD뭴Q+uj_AȌ;)%՜/X7oU >j{G5p& ɐ8y/:(8 (RH77{u|t4LœEfqXjXfgk/ xwh JYof=!xُ'0ܣY\Ou).lƋc~ـiT?'Hu9 ܠ1hRR\PC:=Z0 >itVTJeY̺N"*$&2w_Ep#S5P INSjCQFeGy<{[\G&cruaD! mL"js"ow1CF.࿍HXԾz.dͪi"Rimv, Kdߕ"ﲴEEZm{h=cC}#J0L$$nlihu(L^( keĺ^5N]Er?S:p T͉6qU/B%$(Sdeo`*/U|VY2{dSlvߓ;%:pSI:\KT%FfcGK?3Y|›Qfˆ{l)+6&=Ȧ߹MMڶ|S]La$Nj1(3!:pn,6 -edīJ&n\͹gc[Z#Ty]*{mN^]]T,[Xއ_%`}GϮ̇ͪj|JAPU׳b[a@d0s_ܞkJ{CS.q|} GmY9nN9Bshk3Ki̙')?QW-9KFA,P;`\R(^EUzPOy#U. ]uMxN DoUޱ9]܄1 l=]Ay(7;OR-,Z9[0wfvcr]y^5B߼1 g\w>h\W};Kt 2Xֺ f+/Uֵ;J$,E >.L2R0FvO [ElճyX-WNȦOY\gMA^nsXMn2rU`JIY+ÎtنE94G!:V`DsX01be]_[80>9UQ+R/|H/~N2dS^MG nd$' J?B5 +ܪx|<=&f{ .Fب1PɷP䉘'1fSt;jlF{ܯ#vV"=e5͌NWGάn:l r\ !WG cz*WG^`a5n䕳K˯6%(KYxU&&芿N̾cLd)|ȣѹ?PK (N timetable/js/PKmQ'55 A!timetable/js/jquery.ba-bbq.min.jsW[s~_(Ɔ\Ѹr3אLvΩ"*a pbl-ߖ/@2sΞV׭O-v[t}33=hg )HkŇA0N9gB`E p&dS-sv|2DZDS /şxđ$嬦'1^mTxz/!lx42)iM`h dHbgJ":e(=#R1AT2CfLS1>4茞ƪ.CV4ҔDsc vu!teER6[m'Irdԁm5~ي@9z*{GCǤfPTk![zMXg; ĄO&CCthi &{X@V}s.R],l5gW!X#z?]R zw Y Xwc?4fb5d!N\buQǾ0O]x7ր쮩-Yǐy]:$Đv x@2<P@jl#1h \ ;*(c&;zpɦ܀  Oh yE#byz_fOۦ k"j^@bME5cxn9~FkFS%U}+ w)AldXA:nTCO ndQꍍ?| Tޔrx|2agdbq0Wzϵ8r껄0Ҷ3ANUp!V6aQu&BUs6Zh.w%s +n>1<8”4O,$‘*]ǏP, k[*2i&jL嫹!+Z)Bp6=w6Ոtv)ƽbz PzHlW`8_!|}bǀ~kW6%8;lPUS4 Hk++zngE g,ߊwZCsV3;x|ӴE&4p 4~ʠMnZU[gJ8SLn;<h@ T>@|y:ʇPo\qt^LND{&Or>{*JqM;I#*iO{y6QW7R|dtCdz||4@?7@6zh A7h'a6}흓>;ꉁ :wյxwͰ0FA/yw/i௏>tjo55ja);z_ocm =ЦJB5Ɠ^ U5 ?wm0vo¦[#QZE^. Ƹy7hMutQiNw WW5<:_g,{}~׌SսqUX7 P%J ʧf{ B;,RQ/ N-<]-uYVeÜ7mQrI[Ҽ݁x3<$H9PN#氉(.Q|bO1wbʘ(SN5jCZ&L;ti|AרRW6Bղml2rYpSx~!X=<ݛBM)R5r'uFzZQ;Bʧ0;u ;M -Q0yfנ5I׹{f51ARWuE[.bPL?7M![a>XL]N[{[ٰ%q&6. 3QT6ONu|@T0:pQ-BbFǘ |AfWVּ }sSzxk$ՉNleTyКȪ~[iz GbjU"Yi/ VV}/td?}' G@,ISlr Qcq-x%?'sY֕VQqN4}.mvq 0+NYIZԚŽO^D'Pd $}QY~U̜v!PLYlaY{X2:y`Gbݧdbsf'ڃHѓI`_!ᨫɐzLPPZqbV{IZ)DPjC/Ys 9{4{4SQ w4}Kmim2ՆB 'Ӱ*{VyP5h!m'^cWُR};IߩA cs ,?'n=|VVKKHVлp4dHDڐ$TB? 2ː }(dCF1ߋfsSf+'fa\SB.* -P{o15|D١`cz8g'6#Ǽj7~MuÒeGv"rI]op~5 H+wlLТH{"t}57T4%9#KEM5UEu;j"|-4;:%&У9 ϶yKLƙhi LhxAH!L X458}EbZKE /I˗۳8ۏqHymKù3c,D1=F6!NZ9E^/)\GE`\&S`}3S$nm:TEM|KolP *v'S*}jJM7a+ bR4Ax݁q:/$'ʶ=u=Q.ݏZZw 7\Ksg+%Vf["J^73>0û7ۑŭuKlK{j&|%| &]Y>jRSK#$e8 DŬ4c4 x>dw%q`~'kOY_#AE~Fkxi. XuHևծ9sMY:e& =nn#< `m)N\0*k;| OqaO26zͳ"cSi`hߞbboW'~R ع]rf9{ᱷYse;;rY k̓ W}ҝ͜11R4o =u ȅ /"\luiUEM甡 kZlaDwv֍05ڥƮ7R#ǣ2ζju!C(<lg5&zЉ-n|ܛ"6wvq$0s(21d$bӞxUiyW&01gl]&OOGv:bK{^}B u0HQ`gbWJ6{KcyDS|N^?8h˴Ͳx`>һzBD\aQ6hjQ"LПa\Ȯ)~" @sF_FZk,1`PHy^<zd1Ș #A$B1ąK Z*fӏ!2tPL|Y{ܗGx]ƌctx>I]>GށF}v=܍/E[oCmq=[*^xUE~ӑO{]0wx?٢ڳ/ڳ/(]hS/:zXdڎ3y\uM}s#a6ٲ,o`7)uySp$&ͯk^y~Fz|RlE 7wGY~XoixGwfv)%cGni*du,[3')4! kKCmC(L5ȋv8۹0bI3RQ%'W|$JE'VV7ŲꋑwiJE,ϾOPm}X (`W}Mj@CM gwY<@:%eVtǡpu*n\$d侳p%!,pY,pp1@a*xBҡӁ@JWobO-'l1*MYrdp>?Ks*peḚQi#T)w_hYE~گCTHb0*׾[Ak6GqG~F?IJ>1Sݳ>4}_Nc+*hz,_(ۉ6 mKCx'ʚ똩PܢkO.bWW%YPvqڰi{|TK@LA2Uĵ" d$H--0ABh)[Ť_5JkrAX}C_Ś$.-@z\9)E\=Z/Q/(mIJJtq c(    F濟zk}~tWߪoU]5{ Z*KF3C^`K+=j/%RG<My,M<~W)⩟<]UOhx/#~ARU9-Ϸ?/Ypy֨ȺSym;uMC7&e–16Wxc+ŭHR-TCдʸdxousjBi,9饍l2#.^"5R@E@Oд0fZ^8R=6jUCboZaovg2ڡF;/-܇ 翆 ݝtdz-"H *OtJ$CչIMM 1Ջn^Ś04i=\X$oĬxTc+?3G:|+El }+C裳|,'Y'{d#~R{2M ]fhh2؏R9`>+u2EUN|軉rsBȷ&\er.l !;zO nyekK{z>IY}ؗ>pA:l[-{༟VWR斮xd^,O[1Kv;|foFR?sY.ب\|YJ(i[xSûQ8qҤr1L>ﳚSg0]Sr|1L,"{o6msz*‹gC. 肗.]%VE;'X;eNʝ}1TB,&IsV@Խ-_(D۵D`޶Dg_'Y+V '{PT6`@ s.?ŷf`XY91O ;'v[RT=~Z .6bЪeF/ VA!fvRߊkHt Og%LOj҄ M*Ac4ҚVX BYu lE|79%/-"zXɷʮַ ˆF[r2*Z!,TƌE7r0e]oQ鼑 Mg8d|QҀxlOqjA'[rOBǶ*/Ί&rȎXkTn6~vPPSn˓% ɜza=v+m;eOo̜Cvz,:n#Y*#("Iբ +D3@el]t _8~Ik~/Hq'@d $K]ܨDҋd =d*6+Tŏxs#T̍gxPPG\? "j}*͹~uc>lb7-Lny.{fQ31u+=;=@(&`>POMŲli^~@1;b3a ^Rf?R6Z)ܣ:x?krN; Ǐ-<OVyډbz:\{Vwn޷>6oi]n*,r';%rv&ƣ.o NN.P=0Fվ'U?Q8ɮWL?l!-Ǐ>Y{/^X=/xe@0Q^Vr'=яX|ɓY & 2(иMD1v3Jbz5CC@3 ;t5uTU$O= Hݮ0}GL¢ϒ' ?7pO"^^y#\5O5^oSDsQ5i7Z(k gXZa_zӔ8Ar昨8ư_@"ޏ'vo85$S钺6L"d?sâ|탾Nk!*rH`}ya%xd%nW!׹$sRTf.*ʘ/9U S&?oŋUB,fA={bD8savf'{spIp*PLzA;U+v&a 8tz^RB}u5''F1֔ݡҚ\*[ꛪWBp ra^90XGscVF*U;]v%Xmu$+<]7'vdʋNJ jNJAMURHQ1i~k8N00ԋYOJQ;5s>;9y ttL%xw%ě)6D q?s4 u {.kVp2(8d& K >IOyI8yZGwiP%m;P~X/fZ`i= 2otn+yFR94xBl$x|x$`U8* uG<Ճ=3j΋s/!(!gYڊ4![ ol>`{G'Av&?qM8}p)L4찷 ?Ft  bк a%k):KG/P֍|C?r´3gu:%服y[~cA9;WA6ߪv;M-isM""tL&ոoI駋+N)$>}y$o>%Spï*qͺkb6kR fxe>{]sVg3a}"vMvqI!ui rT8n{:ۚ(\h1He-CjKAصt 5g#l$ ]> 5xO[D w@xi`ָO9twygNa$.э5G%e;7)}_0u՗ 1Dǥ1,dUٖ4Li hSO8K^3|~h,IAANtֻ'7o'n7Xv.7kcc[ı|Q& q^Dnu6[{UqQvBnq۸Fs0nhʢQUh}T=/)D|yB)vK*(^>X8+`**~L ^F-O%g|maQ;0Ea_]t/tw݅NS)zH`v=pUT>^+yy$ Ugm`$_Kֶq]. d(u=ʻV!>>pQX6j cc͌HTiCp %9֜!2ў"rx_%[wrڽ9OW)exG }V+=ZسC3>a71ZG/SԔN!s50iW`6ߩB^M,Q#H$'؊ZN?m:\^d*q);Ģ4N+VvX@x'VW2,ڼOj^F<4f_!.UJe-Føf$ IּdV&XɖA<6V8{O^~ӁTO j8!m@:qL͚~~!VHA򰈯a{5QŬmQҚWK՘~n͡lǎݛ$;(H| 95d_C|fuu 8_NaS&|Vġg[[8;Ia+`,x%@;kVYU{ʶX'xGN0 ~($8c4$)H]C3P41Z7Y {0X>D/.{\Y*aH0E3TSTi;SVNBόT^f}CȺ4c'@ x_h_ɯl84bl)rvԸ&wt{(]ryU 'l@vJ:gS- $nQ+;㢽JY3&ǭG-Jc{)^d#sS:ݲh&-&y[**ƺTT`:" jgBxR@0(-=,+35dR SOJig2wehǜBfC!1-V >i8daWiWh˗ }VH'ɔ⠫?&3*%]B35ÀpB'x oFv:bp(m3Q&4r{ͅ~5=+ļVyOowm]ep[Ngh]Nވ uJ`ʻX| Cc8CIUFA(? HeknT<'8* 5ԥFr:RcB==_o*^{KnKobz?OصwwUMsjJUuZ[xnc7 n4oEU=W(`Q(g|ϳV8ViUJܮ4.~Xi\ڪ{uf. a;z/ݜJaCͯO}x9u31mG怶:kqMA%f" IIw/-5/<3CtCO7&%aO}x _wV#$w珳$#g$?߽rO'kLÅ^81Xu+%/e?cGO_=}O }No%mhc"/I_J`1iKnZ2Cdyd뚼i6h_HtS^9ձŐ3t1erCuuJD kh=nϴRcÊ9w7+i͊8B-KUX>bzumw7+Z,Bh|O^$/dCizKKV#w1˘aRY|ՅUc%~-y۰Q$Ӻ*UE6g^Sߚ00v6tc<@GX°Uq{Gߴ8vm!9fRUqmGa_c^|:K4QNDaJT7wzn Eb53&*6Fjkصxq|nfh3 t߉)Cr'z|;rGȐ|@&*5I @6l*%|"؏DPbMMX6,)?uk1 6*VH++V\rSF _LX0'[0a 1L41@'}@lJu`1߄ZE}NCW"-5Vhpc,]ӀR]+c 8p9efHKi6(/;T3]#' {H`NƂ, }7+;&V="U]\F`z l FxM\F?@(x%/}N^j8(a4&+v&~e*6P SUfAG{@>xV}12zơtp|s*;zϐԴԷ`s[Gjۢ >Zvh0Mx45m@I# @)K\TGjpE T/- 4,a?ZݟtQSPX "qVb+<\2ym'LEÆIE =FvJ_CV,z_oW 88Z"H!>$^ckؑS5\^мb5 RA\,!(|,һ ~8jl;FxY06k::V5,SN|qM;" 2{<]2':lYoq/$'#]-]{9qVUA&ATr5cs& qxsnMl8x9  45M vRͷd&,Ղ;S `W2.\aBIDdT S58+\kyv"E9HF gj۝QMyLA"qKĂBK(j0|eLCc;6(|}8|@ցHÇE^Vk>z^:l.GHh3Ѷ,oBUUU8e@rq? TЮ#̣ ٮ8{]}QL~"lsˁ0N 9؍G1Rc8Vx?#ߩVm g{ĹBס/G2 5Qo1:$5 ևa؆SZ%M[${}7eU.)CvA#:D!V믃ymKSw:T]sxH;%S [kb炂x7hOcDlB V19*21w}:O`^f| TyXe}_x29)g]%ބIʽsj&pظa}~ymXNm* -1%KU ƼS6dp$ hDl ecM+q3r+AL%evDfMC:D4< c!{dN4NSUqz"b} qyF$N`ޑA3U1G_>}x#9m i@i/ /SfCiipg D6n5t^8ɣ{>%{#`s{ދ&I+3q~0 d[';GuY6+85tT({77timetable/js/jquery.qtip.min.js[}s6>!b^g*&ki=De3SGbXv>ֻՋK٫{C]e7@N|m:Í.d.=9?kDB+dNw. ⡏Fĵx@!Pep2/# =ӪrxTױ;F AU}.bN XQ- Ihdj pn)UR_H%;gҗEU`1~)+JQN`38J "g7lO`Dž_VZu}JtD9=^fw9*V䨄S,?(5"uUKnLbS䁶Zc=ZS se5VaM;%\,j QcT\FG"g݆3I X3?3`CL]t;5U'Аg20,Kjb rgSDXDY^xx.@  v\ hOPr9M⣣tHW3cuKS8T0vai;ɵLzVm2)i2󜢿"_ɢx8*5[Se/V^HB(`@ “y$\'?flwO[.Tzg&rqŧ,&hIItn2pxWwW vg38ןZ>1ͅ;߁=FA߽HQDڶ ?@Bv׃GD رd+أNh`1B-m=\+OcblY® KYFْ }QDOo"8YTYW<mR r)291@yjLQJl` Q (J?{45Z_Ñ  +NlC!FD2*PX$L"%5kWZ ?JOwbbfRp]gWW_ā4!E:qDT{uV l_UH6]M. Ǡ ޮ@ xe6V HJ; !*s!m%pD$j<06j,5 ζDZ6HҒĠOƪJD=/ܻnQfMHnE}r_a֮;SQ̧17szn|F'tt*n.J3&K]BÄExs6c軎`CI:tDDik"RB2%15_ dc^z`%#f7 +skY( ;pHy!@MVG*R:0a :486 A3i_N6P%Ktl}_HA- U;eWK?S=G}<mnov.c[0%\si|41TRCٙNSt)ʺ&YDRZڽ=tn%qW)?=]Mnт:HI>߽(tQ| f6-8AGvD0-br$G$Ю57Zb/ٍ\ΆmK}P!GsjF%1wN*ya;h=N'w+m@grȿA4G,;Eo?y E.$f!uߔu3/5G 63^LjvfWr:h5|08GَnI\vx$hlCԚ }L箒aRj<^Euh^z/Zm)eٝ JiwkΤATV 9Zc>O0VEq#Ѱ /vh z]w \hՒ@qb~_K{zPNjҵ 0]m##x$-ȴqV{jv5qs{Z[Zj{`zWbڦ&λ(MIS;yA6d6'5,kRKٲsv`N'KRG.Y}҆v"Z2[UIS|#U*6 [Ht`<8&g@y AdJz 4[xbTTQUg]mCNZT ӱ \ɑ!PyBQl#G;F7YH/Ȋ@>Dx!ۛPfO,rkX:/9Vׯ֟\y@^|k|)}M"+\wXC^S66/a [J ^X1+-v&pPiOZfPgT$uܾlW3o1*Tsͨ@MQǠbQ㟲 ^37M nq_w '؜-{qyHeC!:Vߊ,ؽJ& e^BXuO==xڗm#r'W  )"OSP${({oՐ{` N;wax%MQD2ergmO Y9m -j:ü~:<"'_mq[8Ivu'R嬨x 5rEN=:r -vȦ%!nXk=]9Ӣݣl<@Hnu:}_IHO4]Mז KfJ㸴j.2dhcM`·@~N-gBZ2K[q<^h 7@Yq$Gmw.a[,V.~G[@:ſբYLs/nKq,8{2ӉHڭ2Ц\ ̫FXoW> y^Oր ;zh!.Bev]y9ܡ$(Ii5(0R3c^gb{AX6/kt4=tFVILy$˥03 į6e-(z 볷0*U r t;A(A1ֈM^2M&Qq*I8ND3=꽝aB4r`ze;Z.} bbwx=۽0>+l`>8di+ (~j3z6\ j2&"VHS2Jߔ*#U"ݚȘCDC4L D,Ȱr˵9sLR|ƽ:@j*U5/ݑFwU X5מPE2Ƥ#Ka@JQ'UŋwUB-]O{&U0EUUkШt0YQbghPU]#hx)V845n"{t^zKH/'FK !ؘ'@_WUnS] (XIK ))e׏SA_~?a‹5kC_!U 8o'cUyFJ}X 57t#E\GgquYZ h[Xk~Pk[@HJg,^*B.7|^jABGā;jj!QE;B9]O y17SѠa \e)WMJ;fwQj LN_CJ1-`hqn3G)$[^4NSP 2ՉV;1 W?xKb&tk $uk0 ^3rU߼α}t4:*9%ԯ5wI/P1&;FW!{PSz6>G^DRIRic!_T [ ωO>Ҏw^2_ޤ/-@ @RoXtd}=_hh8cU6Vf.,^LFqgw\CtJn}lC$^IVzaN]F`|n#W jLj(B[n\k/cUz16v3 :5EK>pnbՃon_[|#y^L=@u*%i(uDYU"azahZN\cӠQ̳rmϷ 7Vlyi6C gZ$guܾ0Z4nrG7nhص ](bnhx/1ܨ➭ZsT L4TL{~FV2Y6_*Wo$Lސ Ab[WGs<#'$؟zc{^mEhF_Hײ:hMѩ-ZU,fn7#ZeNt@ttd "?s"ydgl_#cyJƓXRIj4LW )eߟ݂$M{ Q@)٢C X};Lz+egJ9l?Qbd0f9)iHud},+]~R:.WaUQ>^&y?h=*~4eې LC~KwB: Ai91㦚^Xmn&WYWly^> *8k$u *&lbtoPUY$,z5W\jW,jkĆQu4 LhVJQpC[PG(uv|iJUW]rQuz4'SJF柱M`f)%'_)CE4d^lQU42B#Gs БOS~/4;u :]azvt`#ɇYxkĵ`Ql9c3ZLGq`~rx8'~Ykk~sX"nVJ;RuwFhb:a^}! ow SD[_AE*HE2u(iM^pZ9#΃JU;kBTqoUD p#͆&_+iJYX0N1Й3gGyV44XA(R 7bc d}Ođ@= ^/vk; Txv)ݑyxkd<ĵ)*d4Ã8q\=O~}ENFǕ.퇢)N&WS3:vVq4Uar?^S_4=rDg_մ1F:3lG:u0 JSht4|=F%aW¤I _ &PQnȟx_д޴+ p90眔P%3LW RSU ŏ_S߻^3Om KG.N_[4Ĝ2ZȋvB6JFutdݲĔp%6eKz1 Q.'='=t{y^M7:$zbm_OoOU}'ul+'x6a-l4v0W ~]Rk@IVkh?#BI>uYIt𦀟h=D/=*ITH8ʓtNeFڥ^l*|`h$1g ufi 1 눹0|ʋ cw+7/AX>;JrZm=UG 6qB GC`)oʐȭIOA.Eut5bwtMT%N"qϟfˉc ί}nuYuxj=lUҟ]b~tɃi8#2g>{-6 3ǨH1#^{wx0'L/.ьXdX0>%p {?N)$.S *Tjp!\ck$i FK(P ,~ZKG% l\Fm/P5:3p~p^8PXB]b3,{Ned G):*]*b{s+Zv-VQ۴X(۠TTt< QO!&U nAQ^sOVbE-~pzVt^S|ҥK7Y bm@B,1'Qxf@{mVXj3:&b w[~P~n)5mvS(q[Ow`[C4)"ǀh>tauIYήαQhWlTnw}>PcӀ&ج9*#}c>}AV( `š8lgmX ƥ>y;c:|7qmc>2I cP>`Z]Nn^`Rhݪ EFJp)Ql=2dYc`4x܌[/aJk6m(^먅 SXj- weI& Qd8qؼؠn A^H9YGل4Kc(R_Tė!N}"U8VAY "D]ߚ R"Tsӷg#8ѵ`{ʇ*R/&/dG7WPH4Ġm/X/iS>2F=j{-=.';'q$7 ̕M(Oȃ=&GY6ev'X!k94e`2"n@B7SNB$pmsw;-8ে\:HߒAW& DDF!W{(49Jr:M k>u\ߕ]s޿BdZ0 %G(8M0l AEI){߱JIPbz߃qV‹RNY hFisk۴"X,;lFeBG>5AwB] %ֽVojN# MKbWe#[ҀebVWrslV =͎Bbmɽjv1V ~e/{&99~WyNeRPhR[Ͻ5L)O&K` ~dR1ɇ/Pb>Fz:@BDRmK]v:#5FOfNS= =U͙Mb)>Z_O=xGA$?7SX p?)ԑ0Yg/;J@G$14<'h(w*B(x/OL(Ay%VšO{(^X\\pMN@no>e.{` SA3 =QT FLb1~q1|#^V!ꎯ{R녮(HOJ ߌ4hj~PJV-8bb.VG1&]氋D֭7}lNJfގfvY)X$gwucy)1%hrVGrC[Ό÷AwV]kz֞O"룅t_CV#s"NAt/w{ցWXl @絤<~-w1$ cg{1yƌGDSs6 qp'IJ(2 yei}54* f12;:V% -?k5 eK(F)eH#X?zsyWwXwݕ(ywZ±8Kީ+$ <FBNl BL.wq<ΤUv%H3+ChNH3!_ĩ>ȧ%N!rbc54/H2*.?/]nINjY A ԀRjWYgƗnhdFM-bﭙ3 _ >szv70Hs*ax֜n}?HYl-@M[t(!>QC %Y~8L\Ycz[E |rE1kɠZAߑ4'xz}H?KsQ^o!ϻytEԢDGX Rpzh8Me@U `7 Q;P'Dz.>r|pA["/)0wl S6Taߧ^x]\B{^3`(K gt;"k+7bCP N햢w{_;01Rf+q3«ܒej!.dG\螛kb=5iĐ/@ƋJXwܕJw⡹EѰ-`(rPPna@4z9\.z5ߡ JO$AKZ ~[JZ+}0 l d,^߆fJ.Gr:° edq? IѦ@ʮ$KMF)Iو ~9y*E)nnsQšb*Pn7ҡR AaQU -&*+}{n"wrv[3Fx47IKI.GQUrMpJ%@"۠L u46*ęsW'9239g4E(C9=(V7|WGș~!㬫,]:sN8MLRcSO@]F*vxw$3P_0`Ga8}xmOx -l'è|V_m3dAZgoТi`Ex [ǰ}oFko`gG Nb9K:uHm7y ySdPUBAq/Dqdozl,[rà'xK&-0lMWիIsQGNW8 MN7:1q|_OћFm, ڐfJ ##3{h9j*?J# *pisg\Z THp[f4{Y<=';1)qS)>E,_i>^'GD[]? e}aWO6V$#IDI9adדW d+蜄Peg\0ѸN}eU[Wc;9WN_JuJwqA Fw7\2 RkbwF~UD G̒/=(qM'ȠpVZp|,NlDZap1!jφy^5 i.ӷ|KktGb7`ZL~+!AQ[ޣHؙ&Z3O|{AN-}/\IV:,xtb arbDzeL[qDaߣ_rZrʤ?#]rikGFWCp!J2x")b +fj)-Z!B_в t 8Z?lR+{ N&;!d[r5pn@"|6FɳOۭVԂzaP_yDg\d[#Ug|W&}Ddq-BM-z|^ g'6;Ǣ2VssLָSrP\vFky2glkvDbg8T~ur ӏ@,̿~A2PK\P< B*]timetable/js/timetable.jsnpjm$<_}[pvXbv,^{MdNl#t =%¦&6&h.!*+5_ E Q3jxէnw /9Nd!|f¼,/BO> fx:G#t#߁zWnN1z>nm;( 9;q?Y6zAs_Š`a?mA/w8NX6Cۖ"[:C^c4$ av0:G}ەD!c/ih})]DYOI]o֏NUSKg8:j*u /16e[Xk/2-ARZ7 d&"m FqW_5Bvnݴ:]!CX'}o:}ޘ AU_~zU+,5XR$1RcT/;g6lA8܆i=g0=&'0s2^Q"2'. cӉ#܄>H돬rIÖV~KIa%F!qu\M= u \:7sJ*upXf7L5P^f{<5#KT YF'itNo?}9|:gX[pxrOYK.(YxL)Tl[luHAF8ul<> T͆Mga؃') QuSwR(Ƨ Yp?D&_5tӇf>|+nFWVqn"*wjH4[4g8Wcҳn,?YV ǜ}-G\]|/i4eq) Cr؁abmxC: 9S`_B]fe$! iJk dЈÚ2LGgݎ٢s8v<0ce`'27`ÜZ{>޸u MLcsY47muCܗbNPJC˳q?y[o yɵ`$Nch2D<Y Gdn EMCf:LP_uSuRymGo3S&SjXV1ķO~晰$8)kƼ}IznJ ,%6cnPURf:dZ7 `J<\T1hbRbAHr0, >@NckXj00)9@jb=;!$g3yl2,*FXegeOX^e7u[- C"_}%.&죗F%D>WF#|Hw".Fu8""}&x7pt:}'GdL_JwY 4DqYfAϲ #\@5y5q`87*WΪ l!/Zù=:Q\ [ۣzI8b ^0Z^E/xFۑϐPm|UM"~MX WG hp =y.{+hX 6ԟ^UטIMÆJFxTrFP] ;UTf:´ǖ I,v䟥>d2Mb?:A|]C`ZiNɬw2>dY3KRhCp ]?x,J+*CvUk;wfJ2CZŪ9O>9#&h|B("[u?ш- o\ƗfXq:~CFum{Y{JOIfҵajA6~EE'C @BL&^,U:dV[cNchp:&O IѤR3*#;\uܾ J] !!"P_造YH0T&vMlDR+cLlQ_G!yv!# #:V"p?nLޯ6lwKߨTz~m3}d3fcة#Q?Aܦ܌c#T1ު+qg|6uGpX>" {֒TbYV7vhKGV.=Hr] 8⁛AU8gox33|,]+KcKa2 %‚4w$)7֏Ol,[UEW5Q=r=lϱhs^_ɜ踔y Ƅ$]2ST8lB~I\tKnx"VZR&}I^y>jw/|(E2UT02d DԠ8 q Df&ͥ'kM8փ]1d)x 5af iQXC9L miER}N{w8:{:Su˧7iCCBd:FZc(sש`׼ɀcv|P)sY sa.& a3n6pTah#'/JKa9&UL;yUUY@j;ӸB߇ŊZPT 6ۧH2^*?*>6G8k~h#Aa8c)tU^@l@Q7c3Gmv$çp#f%j󗢲?xjvswόFU6D. V/ f|Ѐ_iM+ZS4]:7. ;FH Mv.bp@!5'O5*®!T"{ ʧc.'6G+ iF/0!張0޹vU|>@NO.Jf;ƺG~26*67yD GzK!`/w3x&n(! 7vjGzpi2,u?o걀Ow(.isFNY{cLh4)ɚp"xpE +4qZ}]KWr\qVNkHvK]tetuߦ<]:H`< w}`*y^~O~BSm-e=i-P<鏁>t-НO}?S@?3ϟnkK4Чo~A:3wn.BYЧ)5_`DJJtzI:Nn+P,Y<*󊫘F~y=$У^;WV-m΂XoX~Orlok#}F֫ib%ykAJs##Y+7 z ۠=,wfWװ6'y}@o;A7lx緰|_OdO? :gl[Aky3%t t d_*Yw/E|Hov.!;ag>kx>^bc>l7[nАp?Huln6ml/6A6XY%,>~O< E?ŧ/ZeKҿg>yzzw>^2{937r}`~.70b - zc7q7o}Cl?1cC/XUɾx>0f~aَ4?c@>8bB^lwGy}oW/ry({t+le}\>c,1Ɠ?3~u(^T'ߏ=kfj,uGL`&X`y6]~w^_ǿuw0^} nЭ7_nd>w'ob~_(&7=~fGSw3ǁv~V@σۭ,#z>}ǫᓘ9~=r;ᅢ0O;x};8n 9\_;9Nm [>.kou A]f\x`7}nv}7vWv_v~-}ϘfvwL,,qi-yK_n߼~/obJ+fČ;g^8øFPI1 }3<>wdmxOcx>^|e1oYߠzyBpCoqi"R Qg\0}?Ge첵9:rM k_&k ҳ` ]@~ ͂uxR&S0>0E/}g}Z(ʹc\^f>ߛ O/ǹe9 :s+m,}`Ly ?Dq~AE'R"YӃAı>F0-7} wʕ+췻ׯÂj7ols c=t`YޟG)+P0ϼ&y~~MpmqʻG "p&kb'z6e>D\)WaqEp@xvk t7s*h~( ?_s||t?2cSRyVNKSnG%1,g+F';IE\iqWK)sn]4xI;?CHRIL1\%Hv=AH1iHa0>q*պt"p NzهFV5Fbڡ]` 菌ЌXe-'1JRU?Zy5JǤ<7:vI^2[C NƢQǕ*9eJ(A 'pČ\@dy5j5"hEQ!ܶpƩA}A@xj.Jʑ~3 L~*6}x2q'*,gB7 yIpāyrr#fv&PQFC^K.h_f]Dt60ҰA'JU dw,|]d*la]5M āMNRt? g(L8<A9*%Vƃ u]/sUhd,.gUTA3*kpR<馽|qc 0F;:NB0 B ?͑ۈۋ"ehsuRtgcv{ xF+@wC"`h$b%}GDjYMNNo!M)E5)JTJĐ&S*m.v?GִI4#fWG6wP53QuNnAx"XE?ZW6[ jl#\9v ȪṄ-7:jt\Ƴtd}t%[RAE.Qw[[c|?Zf'.3&zkaf[LcUdY9HO?GgvPst0dLnM{r]/u4pW\C Iam :)*NDznP,H2Ck UZF%G_y67J*T'XVX (8 ?SdtQdP´:~2 Y)NE`q撸"ZP0Xԕx3|jYzs{hRI9>:>:||( #9fiz֒ʡjkH τàI€'~fnג<(,LxỔ2%DU=J;;U3JY30J2ՖD eew7P5@~ %Z_e iYN/xeQct"5TW<:jV Ƹ{`rBictbE-FK4j&&Irni|=+K~_/{\FqÅ#B#TKxם"{* C}+Bd F\ aRm)X@kԺ. qgewE$;h#D݇됿:ב9/:pjbvǖ@ [k1|Z[vjt8CCS FS 0+jcK5zr #"-v[\3%?Xck[%BEu]mc_P AG1GLFR]=?u,OC44ȀnfA&s\f]"' G1gUR:eo-+9%hGM$5v]n[Xrze\?&jDYu#U-t#ݹU$4|kK?wgVӴ5߭MDsAZRs.*zɪΙv,[ɄNMl#{$鈜"lh/fb;J5G5e"2SG5Ji'mt5'Mthz5Rm!]AZ8E|gR!qk.-ٽPq&2nqmjnܪXgՖr[0J579$T,thC-Gj,!|iP}[{s3ȔHN?c1_Ɩz&BVcw͛02+˛1nXהb6n%r"85h{E^\c&NFj +xJ[5kX "u gd3$MIv/`l uSG _n᧡AZWC_A 96f/s k%=2zÖ.`QYԷ#*SB+cj=55P\3cYc'DtE@f{sՃ*?4̗lXWҙ҉2y˺Mt) µ)_.ΊNGunS}=Hx$l'̔nlxP_jB:讻,ꦋi*ȶ̾) .%q, [ZܥcHy?snQK2LwWJv1aB1Ɖk\d6uj]Kc$zZbf/Z!pN.j \{u|U誉j,(Ëdseedyu'^28bMO9 s#ؽr &+Ƥ090TA*5 N:n LBYKR0 W%y2ҔIU\xs(l59I G:_ |11*NI}fn9ɬ27${RinKmX>`zgWۧe'YU,5N䛗D* |r$Kv 6\-CiL|{ej3ӭT+ kr_=G |EO$ġ𱢳ц))$D*8}yvӀ ]HòRYE2f Չ 'vfX f+.@\fB@b;S^.qI.CGZ: NCGҊq,ӑ+ rv/ڰەK ӮlNr^dOv/M˨!7+LQP z͜ ׬ (@'k ,lAw}q"i?Z`ciԃǚ⦜bۆbd)Ol>N|_77͖9U'f9"{N% Q%:U;D1J(V%M.8M(*fUtQypbKUe'5p2v5Nt*81AziDnlM-*81ա7R6TPjt*DhlORP,t9p\o"ׇn%`tz  q.X8tɑ=lge$;;yinga: 5@\F-Br"Iw>}8cʨGqnc0% dGWRe0҃:Q/id#8 xb d鹳%>6p*fggH_;q1qEzǏ_Lȧ$uG)ǒlf''#'Re{ }rnDP7Bo+)d4 xcㄆ:) iLȦqQ@0P8NN_yC:,E Uh." $_h~a+9iu]x4R\ z($,:ʜ婨OP\b9\Ĵܧ5GF}MZ[66*J$o +@Ξ#4s?]*!fv}q=,&!bz96*05i皙{wͶ]l-cYqMV">lE7O\uЙmM̦Bi덚I2͙t?QA3'(rjPk4J/ #ggZ&2>mP}Yҧ3ަdySAZF OFf  [.`;_SH陧?#,?'&+U4tُwhտqW*a;vYf~'5VuqJ& |7><@ߐ AL_YR0;YN; 0 @@8{_:\¬Nj9.rU Y prAubۻx)K|sdW7i#9Pi'9xSr&O(9 :\{ym4eP+T4|(;9Z^`mE-eтRF ]GOBݲF`BNV'ur-PRDw"t|ݥqMqCCBȏWSc LH 6ݿ\dd\6Y8תͤfu6{e<7R\> 7!]d93nt1wYΜ"z.q8Y˜u>`񐏗( @I/k˺IRz4,`p]oQ^XRpa+\?flIwňm7iz~8(f,G9w Ič*aўaVvif$GEG޻ D)J6xOXރo_S㚰X  _B ,8d9TpX޸6oNCWZI=>J;Jˊۛ;,OEyP^!w:s`Fa켸0 ec~ew<_~9\M˅4ꁼ]U5g^~@3Ka1gIHT϶7@M} 4a(V^ ~y4:m Ȥ?lXV $b]s?ra{-i=K5Yr_[qr"erϱw!1 'z2V6ZV*o1y]*iVۧD0ix(Xf!q\?KXga#F-:1*;;b\)#&KVAxz+53D2F.HsjBYSӮztDPѸ.4 O,TгbBZFZE y,QcED(S4(B](ef=E}h(ZeV|6 NjW~%gIE+p Lnj4T F *6㒕0qcG0^X9yЏ!E ,5Br5H:[3T~k-0O\V8,$6o^E5ϗ|]&QoD8ȧ_ ]Hp) <9>yqy52m_A-Af3)A=~ NYGH=rQڵGִ ^GEA(Fm,X^ ^]3Â5ogFZ&en:.TOIMdFqE$x4.ʍ-ʓ Dy[?/:8;2y8Q^OD/:J߷7PD$:w\e|̜\(xɧy3C4?W|&Χ_YkDrl*򏘼hA|U_n%N 1F~-I `,+Uik.إZ!vPEhlFuw eD\zUDyq*݌8Z_KSW0!?]kpV6vSqS59GRŵl }„̨ 4hn0١f+79,۰!|ƓB|» 2?#`d3w , K:Y <$}?nZRS=@=?K~Ğ5y JdZaya–IDZ֨cM ~.Qz.ZZ =ʷ^e[#Kª޴I6-'O%{HOluw#fA;MC IE0ަAEdc6li֫Jv׮MkkZl+hUL{.FgkN\P^dW fT+bq]*"~rZ8jxk\D=WhgyHcߑq]l5v74Xn^ѤAJY/قIxGD{cCcM2+eU+g}U/DkV4Vٱd{[p4+Ji{l5IWfiytO;_m#IHVFK">d=kjɏ E( t"pvx{X ]:(tʬ*Z"5ITfYYY_JAkCД[[h$_u)nhS[aC9|v4Y,읪hi˜+rnaX&eOU>'ǚiIJ8XK?[븊-dwTI§U+oɤ~w۹X ]4WA;{* ̦2/>-bsvCr;Y$nwdNLchoqG&mYEnb ڦ0'4+<0$emrLQ .!z˗hwqouQ]+fGL i^`ӆ'kUr<nQ"tm}{{ [IV@@Nj* 6?'ԉ+{_#oqa$cFwTV+wY8V"ݩqFWdWܴ$=׿ b  '}bg֭*>θKBeո3KZ!L9a\(V};eqWA]F~$37xʃ:cZCB"]w9ti1YGNsIm(z ‰Zo\Fvg=ʗ쯹ߨd=rHjW0H@"5<6ҽgs}0dR#(YLn''J3N"׫MZ#{Zٵ gư>3eqN-"s#Oc so7v5&_k=,.VzOͮ.Nޮ*0m"Tg">n͑ Nm^N9T\Rmhz:gCڦÚOf|ittAb\ufGQ[7φ5LrS=$0lLzm|wv>2WghMƕf- =S5{*k 5WK~oDqƜb kl]l PstZULcCH8 q &mbf*WٌxRFp =#{t'9"7q dPS4m؅5D'D]oS-:& xڴڿu|/|O>O#`~PT?C,_^^+ sxg1>OBq>CsW>LAYN_sDD[)M4x{ijԆ|!0.D1Q ?,܃7{w2#h&̇%crtMMzu2=#-jng },MSAv4xױϩb8I)JDӘ{CЀtdwax@sD-sQi2nZnƊl@lp9, q:2OEWfԏ*a9~\pavoB2~7I!yP%'4.5Q51H-7RvOki O, y i{.Z8i_A8%B>qBERrks/f!twm0O{ ˁcGen\.e٣ P"t(E %WQ 8%۵R{ -ħ`|҇_#0YC_p+X QI_zt^ݻ s1-}6ͷ!1vzth7"}y- awiD<^B@,>/"۽dEuE1SiifI8 0]OW$ŗ TOmP(*D :mKpaPs\̓fx/?Wliopj&Z,[İ=^Ăop)95LMDB7 7TYwﺩ-/tZ4J,#' 6%o5 ] %J,Qb;$icyщA +@r|iqtaX}P-㤨U,hvd>lD:ZY"$ 2^vo+YyRz)$ˣo$·l(Cd}+@4d™S+m {~[mP5Y}%`FZq-bؤU]F<КZqlu @u mk2fș(Iy$5U4{N,Mo$gaFHC[b 0z5)TGzaHh/T2M`PGK15Qm3t$GtT,/gdPiK⏱rĒ42XZb& r#|^SB)o6-=,D-7cǑRCwȑP̡$!dw%zo3(5y0 XSqj.^Jˑ2 Y0} {1 {?ý~kuvھB$~'ĮG8UH槞q4U|A{nЃ&kj5p:?a0 ]N|$b+A,myB^~h0x3=VR1Y!I]2' F2 ܽ/ھPsd۵HyF~h V x{[:. 'ylJ+y9Wt Ad۲:>7_ &*0'P1sL&H]2TqNxqۊT6A _r\>^s4㫾_ykƳ5,iVi4E=9>6nӓp8$0,6` AAP_T/,rKkWwՑ'y8"@_.?ݵPY9>a=Vɪz|:(e0'~D :bTC=Z vy/8^ 2WLZ9%nuĊ4҈#-_f#%{~] 5ɚtE953NE뽊iS.;q}C"aeRp= êvo`*hwgJ},*ľPER>8w`fJe"mUl]^X9!Bui  `6O E"W`n: lB;qb0tIˤV.MEJn.z[N lq 5%=(A@:;ɤx$oqNM}8+0)wjjjV8hjڎc=b,/ϩ=:^/8V#UP1307GN3>QaJ+bpO~ סZvB􎊐;vƖh9ٵc5cӒ]&UJT<瘈 = |f6gvٲ!+lCgWZg#eSw$(Rd/ ̸hޕ(lO%0 pR\y+ޞGoNh3^R&jEn( >NݓZ>jޡaX*g7դgp~P2+dme itFmN jU4aer YH?PU(ޯSPR60p݅hx[Aq;]|FGU &~˙TBV[DX@=&oqiQި@ i:lI:B˜t]Ä_M3a0RJ3M i4檝+vVEqEn'qCrR'i$+nnʳeO52JK^׬L5꘤ m[1#Ӿ|甯aqg{5B.8g oWfL@Ԟ\ED#.7isudO"`l2K~ VJrUGr0ñ=H_$3F3 Xk ڴ9,k_7!@̓a~1-nrdNarjM!we57|9)hcUJpAjYn.]1&yYRpu! 0y6h!}6Nxe<m K0.kEtᠬe%ejH)!sxCj vo c ޜgFM[6 j_Z&~ԠgY†s*^5-fC1j[&9k3:|X+OKa-A8"A9r†$[STqEp]`k\ 2xZ}IvL9zeIV!l w4s䗆SO,)JV#wuA?5+e sAn~*EL%mAȍY$V0>!!RAm{ޭ#ͳA? $K(v}?U5+ZʟEMH*iV.-|gJ"9W{X;wI:F^ێYݝ$!/XUmgm6Kae.):> d>h/TzKAA~WxToF T2*̚}e$rqI;QBT?yև`8~'4丫 iUi⼽1F5[b[ig2=EPKzSQWva(timetable/languages/timetable-default.moPMO0 9HHv]H^ +D͚Ckڑ=CoaJPÍwE\o=GVE'u=aE|"#Fxp~Rx !.J9*Ȓ,),IBy&|A Yzr^ LQs%`T0qXϔ@n.tK⡳-_V.騩\T3ipW~[=^M*?hѷ Cx9䮓<fI>t`8B_}EN!b6ZHr ]R넠-O4.rWr2,2 Xb_sf1aT/?M]ȊU, i+Y^pQiowޟ!^޿}9M r w7Ysه9#ŷ^/-ɗ twu\o{$W^P0^gCF؟dvLɾ5#')?}Ge!3Բ|wr{<~~>{~Ms6aQO{_Tȟ)SJ3(I|"/ .x?0:2}Ia,74ƻU?TJAMK#Z5 p. F( UBMsp4,}ò/ܴJ>Qj P~ҍ׈!<9l.$r7yGQ 2#޴/nC1@c5>utcQ3'5369'cyC ka؃GCaQa?1G?L1Lr&6<1ƶ9_l< 6Llx5v4=0ent?4%L5A nQ$B3*$QBM<;IE11=[q*zV-l5)qp?!3/nHΌ߭_S,^ӜԬvl|[#06/d`פv?9`Z$hL7r|5ܐ=M"lAԄ#^6Y6,K/-6o#AܝpY )eeLg N|kl.ȼw܄ I0W> 96FAUt> @j|uf _(X7޾7e[ݑ&n6Lzs rۨCϡ6Mhϫ_'17ƙ;TGYa3A-oLO<xѝ)e\+v"z /j2<0Wǘk9~-P;R|^'ae]e$/.">@M_ C mDmXF&!J-T}=QoFRtަhQ-m$B,#x{/mAR$x-dU,(›x=Ib$,޾xhxy\?C)tAJvTþP *n/;Jl͡bOɸĭBk݋^Nwq(iYaXyTC(5b/к, >1kBJպ SE|DIl'^vT*M0>"̢.͹li%pci-PNX+t+qHuSy&r, G=wcI]:s\TTϮK&\+iưx#{QXa_JI{> bC<1ɋAlڙ`:aBO-zJp}.XA VD -)iF>d}D(?**\Aׇv`ON?Ӟtch}*p$ IB?DOpchjcM&]xO$LGW6Ɓ7aj6mg `sJڬ4䶶J>PŁ f[uDzcFYbirUIl0N V-6Ddw܍hR2Y l5516c{gf{zd//u #ц(57hC0^ ;D׃AI[B5Z dRK󺍣)e;ڲ;[A|ZLw\-> zM8Vno3?Uodf"!-h"-6Iɹyth6WO2  m8wLܳu3A>Z< kdLep=.4LZ[G"VؙECZ˖}BZL:NO}B ^4k2faz*\kgoM[D5Cr^Fht+V>Į}U>FZDBlU Bp1\aﵸА< >}M Vso|;Eh;/dpΓ5}͞7rWЖkyX͓:, ٖkL-74Mk-MaA7Dj A 64]h>Fh"IVu67˝V?^`K]6>*FRfz҂,nLpx.s!BXG1r0b]{G:/m,бb1/qCZ0ؠiL-9=0K ٶli@`^т^E4%R*Bjic6cAlZVoqQCocF7UXm1R?IkOD'b}N[ A'u}&;hm@բ!@E})h#q 0Mhfn]'2Fg5~xvkzE[ pscՖ+%ozёKC+J%.0؁/cVx OnôZ$넪'ө$ 36Xvx33T61srrJANg&o }|RƲŭKqrTQH?bzb*x"VVYx£<8YTD`EjoܣqN%Deti]&Zlhbja]FMLiDxT mv:WXPlY"GN upḠmr+HZFiv{ulǀmf&];7_v9-H du78A݅8=!l|@yxi]CO >xsSoC L\A|+64kD vVuf{[]I8tӄ3:ʚ}Ӄ̕IeCY8,zR3e 􏶔&8'Jaly`x Q @*s%2 sH4[ 8\*.|NlA< @c4>~ZIܵظ$ܵX}ޢ%**wuBe7nA\UsmS2;6,mhCq#Z`cF%b/2*C`Жa/"U[ʬmZ\~Ƞ-Hn{u۩(G*0y56u9e%r![5hѻ!R@1AO}!ݤ J=p*CT[-~R3tZ>Q WAY7-7nOd)&.vv1Qu/qAœ p|x&lL~+jE~ 7%z Ӛ3eaW7!n3=ÎWSGz}}cF,+ g-I:9Ё#fHZ'A vz{E䅺!Yw38^0z>~IŔ14'M74:8 !tw}̻kJ,Ȧ(c_0zpQ'Q&Փ`P_g_^uhxa{唫$ɢ9fIMm~ͷLbTmJ6؊ Q5 ~zULf;<{]̞ l#Q9n{ w)ͦ~%ןУ\9| Tm pcI[S w2B.sH$"-Gbz d&yvͤ$!~AJfr۽ce $Z&YGfPF ݚR[3i7`x1{3 7lS{MA0HQƫnk4L]"6B7`^8ゕB@">Ɂ%%k^IQw}J\WiV= n?ǝ5(=+1Xo(SǢCvS8:M`] Տfq0dǑq_}@Lxi`u@,_Ugh1qBLs+D=P$W1җy@,>۳g P_x%(lNjIl  qm^ɗ,Y]2@VPT$QNbޔv]@ϼߓh(}G2R$sH! m٦ .Ÿ9fXIaBU/ED.lPݤ] Eo(} Vl0gN]7<8 B1;C*U&ag^1䨃#{J'OSޱzgJ11=1ymL@y#Un"ڬҕ6 ~bx OĨٷ=H0dP-7,hJ؎ +AӺҷ=[rd:+7THs؍ld#w) ([ꖩw/v,XWYK͏Bg绫nűYl{S;R;?G0~?Fb,ړ>Z ^XedpJ'>4TTwh҇`>-Md+܏l(1t# &j}bIQ74n5J'ȵ4^ (>[NlfLXPLc%yԵE4mi(F~X}c@ݯ2-ZL4Vb ޼ v@ lDbTVX .#.mc#8:dtdR 0*K<[3WJޮx+tA:ws}C$BKO4#2퇞\Ɏ/@*q mL;GX=cy xbDrF瓖ΨoޓNuBFW{~) V;yK6P4S_%=*^覦wE.mgW5G4cǴHa]3^)WLuZDb7㨭Dzn|U[/ C ؘ blھgO:_+LTIXͮ<ɬt١-wۨX40J֗&!g7[;i !a+,FPz{?E[x, !pÊF9hy(Nz٦AdQJR?u/'O1(| bsmʐK= Ez dYZɆPKzSQĆ%F&timetable/languages/timetable-de_DE.moZ \Wu}&6f3%,;o${Y[˒=FI0eZ3,!@!@( \)*!* * R,TB6s}E=/7\3.<[[/6з^ 5ρ>tj!=z5ׯnY׃>aW~x^ z x)A=vqПibIxWo~i3}.]S3F!68Ky~{#7BT(5,: _`Z绢rELj@^>RVg1n_yX>6(D(Z1֋01^WA]q֗w]w@8-}`y|oe$qa{vw:zION>b}nIL}]ytW{~{Xow,cś?rr/w^gh<},] t>!7vo1.|ky|@c?`Q~8WCrYCY8Ճ}@ Mr=[xOp6s4aüϟ?a#g@d#/a=~#2oeyNz7{+[}-ϭ7|VEq2IЯ4vwq)+M>jʿ2ybubpq~o}4L'ADq4_zsgkfL9z mΰ>0r,ró7O_5YGz79mkXOc=z}3rmCiQ㧏2[A/#)?$1{=ɎcS*XC?l5cg)'l'=Ogb?}7~bYJ?z`| h sfl(`;{ a`"AblÿK+XnK }Z;Aq<Cm>y+4wSe?K_iL  ưSl71afS =L.e6|.6|^"W T۪7MoF /ƽ_?ߑwD rǶ㇆C0qHZn,{MsNEQKUHĔT[ t|OU՝P:͖D*xV-ǵʮ*SB%mEJF~o87qdo);ɶi Ѩ LL6˓i37=1rnUyQ{=UOq :^Mx\$Щyr*~&=eᝪݒQ:Sk~,c,cAQ݂h<%ڧAB̆U\*h;Ъb!bhזe2$a%]WL[F-cφ\?Zl +p ?8*3iY%޵(w5-TZGr}ʓש4i]-,6[L)=T^bX0TȲY@(naGiǺ@Ԉdg-muZe lLF~S,-%b'RMhh`<_H Pk4Yt80Hy6$wfG2l+R\7Y!=F"vhn9ck8O/E1o2CqBc;6!liӲ°T 75YS t?=Y=3>᪴cԡV[.ƨ-F6mp3SpfkXKg*SѤ(]R)yfsMk.y J\UH񓼟*)Pm̓f3Y e;0nE̳M;-6 Vr?f,o" ݗ@C) XYթŁEG U6l8Fc3ȡJdltB Kb`lu_݅,';r9ºS;P8Wdثm~Q5UQU)UDRMYmTaz2'˨@ CPomFqӄsHuVlvl P=*4 OlveEB8dgwbvog tziA=E@[ŢߖXIOV VG)/)2&(DʒBtꙊ!Ȏt#6CJk]f2,/.Ȇґa59-Wi螥/ÝOU1 LTSGG^Dw+1>EctDKX QvV%+ԣo[j]aYMK$ ʶgS)~u L!.\BE{ HU>[a£tq*:&~:%\X#bkje%NZz$YǓ'-^XMڝu7cbVեTњ\!QIa`ROiApߺ_V泹 梪AkUР-O\N(sԳkMz/ إFuuIETH3^1 >au:ꝋjcl'U&Àᷴ=csf>xh Y YnԄX5EOC"A<&eMIx0B5&#K(*)s^f8|NI_ j.x[0Zk$Bu8ڷ;Oi?' / 2;m_L )`H3db2Qrx!];Aa*m[HSAׂ΅Cٍ) % D c),'PqKyhH,( I`!~c PZHb\ŷY#Ys'.s]EvkNȮ wZGw9\?$,~R3S9}(TF9@Y-B=)S֮ $DhU1Qnh =*0a.QZ9$@$ tue.1Uґ?y!, :ci=V {#lrJTܺ/<tStzymKK7o"}X$7Q\=1=!_4 07=%HI,w&%q@(W0I5ε]jͺ1{Ew.fTbH,8^# ~r},Kh` 7 a.0,I*Oti#JMc<Ɠ7ʔ͎UˬH^)@ PKzSQ 0&timetable/languages/timetable-de_DE.po=SzBԹ:*ߒ(ƉygC}ktz! 4Jr/ٌ\E ɷ1q5w'세?<Ģ䜞FaJC@)}HƁψ _Mw M~=! ,)uNH?s?Dy_kD{QO0s(x6]EYSA (*>ރ[ 77n賛pKSdD9V݄ME1n&tNtXʱAL+98(sn4Mnn)^]psSχm%&/mFc;Nl4\?mYM6z0[sYcEֲPVE4*ȥ/6d$jv]_$!A@֔>0;xų1ע zoie%??2#E+HJ5]頫QS2:Y2v, 06KӀi.zY>l-Q8s9Bun;ԋ&D C `I2 "ۅO_q$*ê yϛAl$rm" 2^hw6!li|rv]n$/.8(S;.7Ll{:9Be0Ɍ\d7 iSN:K(<& D_7鲆bZ-8WU [Ad} ]3Tt_'v8#gls7-G-.ĵׄ$eA:#󊃛X!ԃJG#NxǞno}L=(KcL*DpAAuCp!nk>[L1i@ i@<; #F1ʝQ"pjP,Y;`,&;f}]r@/[pK>ɨ Aۄ%tGwkˉnRkX`fܵa&VYUya~gs-%^4I]#NrdՒ=+cY!_Q $Rl)K0HFk'xc_pƊ+sXMȝdlgBj&tߙQ/r{BD6I\ kzGPqnjn·mhrSKS4\)e&WKHb[ ȓwA!pv3XPZ\  Sa,󬴩=%^țRTf]Kx!4+FM**eWN^0RwFDޒ[L\",>h)ݱV3Z2cQF+}oYE4(^U\Wzi|H뽯!mC1r Tɶ@}a% we4g'({e"FeAr93XKqLx~Vݢ_U˒`NF]_V\u6mLR38ںL͗/j}eYf<E y3zjKXiPs4_ sꖙMԓX֨, 5.bQAt0%@y %vB~Ȋ`2F]^ܦ$A]%AM,jOIrCnk_lh쏵5M!bTSQ,(TA+vSO8?>#Xݚ1T;HxeK02 P#{B%@y4z#bʑ650.<YP`sA W&xic0^WAn\ڟގPsAveĠ9+?@)1ٕx:]~0,$ *d)~geJ_Z_|@>-"J=@nN8d+ o a)<>)HE R03#^ 4lb!oPK-x02LE|ªм t H`exY-tV[-h"qoeUV Cd 77`s/aSSe؃Lp) `Բl;^88jWĿJj"zME8"ӷ|X 辐fm3Ew漋ik0[_v~0z uwL8>3iq^ t*Nq泚$8R?~x fP11 ڷ0W(b-/@RB[Fva䙒VYeB*okK>%}X XI&Zcj?P ֙s7j7i7Y1uQ2mϋ^C~,~cXyEO7m #!'PcP.? nQKJ{1Y-ԇf)f4=iSPcrOC1Ü5e-gA(!"x! ߭ځWHqa~2>Fђ#ӣ˖%אhpiF iW8Ș[,7x;Xh>.eiTnbtn _$BTYv\dշ}+g4!A˹l}@W [P_t5(& 1dDzdg~89/!I(Kթx謆I,F\;XlA,/ ait0>RBoc2dNDA`Ǭuq3 1?).J6/B<֒}~dh>DžrǬ[aEQ!6*x2,k[թ<.xu*&zi[#%E݃l~9߃H2?'>OC%W$m`efsԲcz"nMcA RG߆|3de,ӨO 욧Q*OY!qeac./މg3R+^b`>) թԑ0ՍmR.聬mvDn_k=b/ګr!5a.Pkʨ5nj?͒Dzn3щThI \ȄEf;K ^9h5ZZh5WpZ96'~PT>ߊ&iƟ:/9yS t캼,9`TNkȮ߬ϵnjyʮ܁F;-g ECxOg+v'Ln#Hܦ \<]/#_pf 3p2juk779UkKZcD۲iʧv)'EJ{&v g(DkՒ=eLR7yEMIvւzu^Z Z'q"JfEM:aY~fNEIG靠EzNl] 03vʲ; - jH6KG6%]Z0r,-;Tr^A&MxƜTZmLF^ _'ɾMbsk1WO 65kd vN}ӯ_0wvFA pv@[-ce @~0\ijX<#8I~C1L~ mO_4=^S8cyGQ|_\Iqz'?vc`C mu8vU8hR'nۺ-hpT"\#ԂAi('[36 Pѫ@3 O8,Eڬ:5k<"tGRzϮ<'^ ϱNQ3\]}5g$i]cRbM s^lW^M|"cnG}剒.a^8V:&_-D}h;}wV$~_j Fz}FcGhDQ/r~Cʅ_:czC / 8[8Nu4o|Kh1#i;jwl-Cs s4;#X4xe̓Ȩ=fb>x G y j>:-Kۍ !t>WD\*H̷D/" =#?iNٌМ$1Q c5`s99S_BY{P; vl:N17cҜ1Ё+I&{Q @cᖕߍ1 WԢ<~0&Va=I_csFzEnXXCwxN{kAR߅;К5ͲKĞ h,y*^eW#CA빁 Zel ]Sыê%tS(8S҆D'Y<$"πv?vײ,[оt*n[rciAU3 |FOTj91&LHN/2l(ʎ #K#FĐ9沎,58WA+t"Y@~wf$bTy{MƀD#v #DKGWjn:1V&%b\=?sFy]!LC 6@=]j4>BA᳥VQo@?{ҝҼKV|:BJ.yiNB|7^W@@#S 36U #*u&oz &LėHq kI" =QV.w:Vl& :Rc1KGPom㍓LфEc@C'7ZGѶwTAoC,(TYOJ١`3 J,$ 'zE>uy>wа]%@f:v͔@K: jsweox'O3YP ~p%q\Iė=%w߰ \KEu nPX'F-Qj4@O!yb-% +/KԽ]LRi/u,;nb4bા#`֟bxN=SfgT/SPx#ݍJ7Y/!G hᨭp!{TSVe {Uč-gR"5nN]u%IЃ;i &M2qc|=6qz:y!3M@+ѨѵjaFZp@WCrvh [йEg Ttԯ ^1L%|@ҤֵXLvX:OdiQ֝BQ hMN3+4W_i5hZOq.dxC*=`d!z"kl>q2L.zb[) qwzZ]:j9//%6yvE]{5X ɷFi0I!%F*&AE$=(4KcREJV!la1T^n,Ӄ\>B\%tUq]覸څ7oz'}P h/,oGA&inKUvCΠtoIYupSs1-6y9֟TZ֫=^ɵyv|~Y2S~~g4J>llk%^‹q|#AFZޏ 1)߳@y`hsfwI&zS5y41p_tYǕTMol swr~^%ؾ6R4^W-r6ERk#4Q%ۊZTGyzH~\ ~ȝqD>$&%'/8$&CB]guP C@0jԜYy-j%mPBd_N:{2m +KWT׏HWiB42laPEAd.W5l9;Vkn)U ,7iRB(WƷ5lWJ2sj~(p7la!d] Se9 { |!Tf,ΣEGJju q a˗uǍ%i@~ttAXAMAMl4}(>5ATZm1i`>UG~sB)%pFK#;cn"˔c'>va8 }/k)ZmV#] o((U!s&9b9+iX.'NOK؃J_Lu~zMg .'}fٙn:U EFBZcPo#W>i'K(0aU/根[ (SsR͢-bkE6BJl)*FV臽12_F΢4u"qD WњzCd',]GNbpY/c1y\'z m喈VƘLY#skO4F8J%=?Lbo¹!*htQLNEh˨9; 88F[a{j=/[b@AkfCS%?Zm ۤ+8,? ֒˸  s{%wWAW/2qŭísP9Yi4:-GqKh20_Z b8OSߊ[u> w3 ]%dg_S/馠=r^[C/jMAaoD~[mo<7=e[?R=h' 5Rj.|֎XsyJ7WXʍйĽ2㿪NDr~uff T$TT5L5DIB3<\9[ Zlj6^wLӛpqIsKhVԴ7Mx&x*Imf0@S {&罉BʮJ@nKOjiyK<=cdT5r8޾yt -kH~z,$/'4&.sKg)3Ҽ*[؛vC~dFդ4wʾ9O,૭j`խP^_heγO5ßFx|c8PiKx|g~0& ~YҌ&goG{;aUF:0p+M6習JRT S=PKzSQ β4ʙ&timetable/languages/timetable-fr_FR.mo|y|Wn H&@ e%[jKmH ۲$;]eUWujim$j61xxL5!.&8NR#w$J?!E=Lp9Ab$x"qyFӞNI2'-/$dxӆ/!  3mhף&&xm)|>ϯ% vQ'фՉ} k:1NN';ub:$+óhbg\3YbKw}x *xu]ob zo]zb9l9,nZZy?x|t9]ʿ ׅ0^ `tn 7vaw;^F]Wt=_7nv߾ փu>?xR{0`ֳ f`7NDc8oј`/G+@Y_=ؿ+oJy%*nUWw~oPGWwv{%JӕWy/Y|2/O]U*׽\>%UCUKE@/e/m x/'A2%+ >  Wjt5m5ej7$x?{VX7G`7$޻t}l 9ڿ85Prgm|-Usoajpt? ~'}w~/ֱożW^}v|P%%ZmkAV_X }8ukV}]uw\ ^Jw렧׭άެ}փn^Ǻ~jy%%.K&!MV][4m>+yO r;RRY`}@pO\z<ՏoAإb4?1:?{ֽ|?6U0:n Go>K˥̯_t'PMCh?0װ}{9?v~[߾u|Ð c??> 0uA|7p[0n|vAU~Dy ][ m~n}ѶBl+{A;T{b߾=VF0KG@G_YMF =s@˶NܢvQ >nz޴ |dmP9 b珂.~ݣzGaOnx=QGgO~auc8yw1zd ͪ~>11׏a猃+?7|ǼC}=׽;@*çR;ى8e3m%?W\ 9]E U_?'2ɹ>>T_]m/~j8 ޹kGTwa9~εاעZbp-7B.8 _5 ޫ^M@~<yu~׀>/<3y<;TcGPlU|PA *%g Ñ ;Q>@|Su?ϲ!xc:o}1aӇ7[{<=O A!1a7>bBBV>ؗs *b**UgؿoT~WUr7 ~McFOcjv__~c| { UJ,3;<2>9>R|޷j̽#; >^{,\ڇsZo9yh?sUl?؇]_FF%x FoFog7A޿FpVOlXߣ7~]{ o%]r+xǍ>pmJonzn^};*vn>;ߴ@<a7/=8Vy } 㯁yEZhkA^8ב a%x{+WS@k%ㇰWO 7<~!C9z\y'w|N|}0aE~}0LJ1oCo}>:wA_qt=y{G>}?q9o$"Q(8 :,+(OG/ž}3G!(_r7rոwC:Fp̻?=cXǠ?1Knq?;+:=|U8q{϶{T^woz ~ɾ&+_khY o9sT̡27߱B+c׀U-a;|ā|y7Le`sow -o=[|,y̨z ;ދZOwz~cn**4Th 6LͺOi+Ys?jY^sTXf s㵶!}`gԷ[Iy}eUAj"h4e>\y=?~_%^ ~: 5hjm ZTe+gئ3U-i }TT5Y_2 wI7[l|>y[;Mo_cAwSl-[\ބw^aSճ?|u6~~ Qv_=?]]T] v}3_p{5UK[`s_ӏ,T~Dj+5x r\g</'ضiU_7JCn݂׃K}U-_@p'n_~:l^YՊC^΁hlWϐO>7|^{ 4obbۂȖȥlۨ]Q>SZs_{=WZ\ʞ{(ՎtIgO9zx$?K[ۓsy߿iE5 b-]xzS Ԙo FKƋ~` rkkbn+o-\_՗ݽa{0kjE!;5ٮzۦN9>Nꖣ^sCOX6,[7 7t֓wXk LÛD6;i odHwߵzbL pL@;bZxƪm!}#=9zfDusEKئWD*$d9&”sfNaMo6veZ4ҒVV_uV_[[YNYΤNM'y HAVoqm*ŊrpD] 5}4(YX2"+p]jtvԆTE̗oD㕍u', ]8^<ʈ- _0T-SUöV̦%C? .m4Ü\}S"WJ3Ðo[{l.+|ڼQ V(R %bޖ)Rq15vflEhCfa"&E7=b eCp_X @j5u#X;JP \4ISdkZkMRVM$"4*H~' V)kA+e<Ɛv5Ir kƄ+yh,el,zgsHAԤD>FhڀdhT3TT1 %]&70]S_/=}d OxȓfIOK߅ OtcҰV#e+ /j/u[B$9>:u_kRE3?A*6Wl5,D|.|SA x1h#] ${ԽDt܀0t Fa2.|J4(H@ܳA}z+ Ѥ7- yrcI޷.$[DcOǓQkK?N l4v`'/gT!,h4;G\1^)yRQD3M] Š0Yesz]ad c.dYdB ꫖Ff\z -]O*M6jJU#962$bjC_E}p˓8"ϢГzRk65=[ōY[(HlpC:ukLzɀ1)+EP(1tn)wXLm9s"UO|WD~P۷ x2.K| >Q8={y mb6Id ɷFeR:Empƒc]|Lz]hPJVVkR1oCk?HdEm+HqS )b,6Y$HۂbҮz1RC@D;m3tRGR9Ql6'%«+Oyi8rd~ 0B΀O\9:6C؞8zӂq,s0R*=I/;RP$+U^aՆLm|SLc<;T GCeO*քf<1"|[}O×pbL 6xGZ`3+aU.ayZ;iDz&\&0@FtW@KtCT45}LDӆ:-+PՆ#TREIEr[ډ*GdLYA>Tc *H-39{,C{ 9I M i:1un9 cXЇ=9„z)}U6f(#(K + Veg imV!1"maїJ Vi%.*r> '+[_J17iym1ʧީ˓^hlLqWq RZOLsI9A$9#֍kɤ2p*fBI.7φU (\nLT Y*89'7iŹI9TcI)4m-!*1~֤F9=7L@F8eBČ񭊊xtKdB[q>VZ rq'&=]/UV`2χbX_?p7P^ul597H!TD/J}1ⓔ^-^ O5BZDr&x̫VHG"IR t}j.%<V4LEWTJK^S<ݴJYiM&'5MKް7wEZsU(EY3fb/< $%7ut%6J: 8w^y-[X|C2t)aװ2e8m}$ X2Ff#Y9tC B˦F 5r9)Di7-~Z(? F>PKO LzȎHG^N1G)IfS=IOTxܲ|8&O3ƀ=UtJ6'͜Ŝ C}5FF T7=Y9KFV7(4Je*%8R/p/ǥ![풊,bj÷ԁ,;C #NDLS)3k;6nFԔ $!*'Rd(Wl1wնpp0|%%~TMrຜw<n+Vi~&mR[Et"eB:8jۣ:6#?a!/1-ԮI2*#9MFz-z09d2.k![UseV6Ҿ1fGXgo9MsuҎ'. s!#y+X36?9}ĕ*;{Iy1OJ9=]4"NRfeE^Ϻ6G_w&tD?@,}ca?ANL3Kw21< JAٞHEȣL8[C2;2#.Z"K$''o̞ī:ػe1)K[U7PW{+=UX^dO#e3ado;K$!nXS])=Q cHlU-dhLW5k,1Y{!<dNkӺ ij@ÆNr@ R!'ay![w2c68YxE&N\ǒ< ͞ΞpD9dqJpC_앳Ur8zR䞧; Ξ dOiU#gYxy/P?/Af ƍL//ac9vVN9ݮ L$"39N6k8S ̒Qfr2J[ʏm}@'=\ N?="g"L!e b3'K7H'`)x0<&A-4H?-Ef ?3`J`+5@6azex;,! 㰛#8ddݤv;>oNi8W')RI !'Vb!9V6LqϨ }gggKl"J=XNG~z܇S"]*SpȥmDnFƎ;4ĢFM|M O"KJZ'\êzWѝ1qb5D)KSj !gZG^~اPZE oj\,``riw\mTՙ=̱͊- 3ibdn%NZ˶8l ! )K=6 H$qb8)*=1_7r̼dH`I6λh(ƺYhF׽$WNxIKN.fk]]\{Yݚ8kYer%Mɒ꧎UfuLZQf"9È_7uVce)kzթ 4aiC)eU_8@=Ho=QS"mz}}(LeHSuk++_/x$lzDZ !("I,ASCQqRi;Q7o2cMd"/Anw,ߨMEhhO$-"$ie:jd,5uKOӤZgʼnϮ04*89Wr>MzuT8Pf b$ucA sCd$+\m?6/#mp} D n-:;Nwl:dhcKp}RW'yO~üN|{LAv>iVAYA|qdUH]UE;4,>60F֗00KsH.<1R3ʳ1e)IƉ`\amQ/nkrAْU< `.>p:Pi'oF2vDVey'⤆UI72{MvMGsBQ6UuUM.V6(R.J`@zs"E8 馂>d*Q+DyN[g]6q4Ri'U3Bƃ; 65]ô[T[dsۤSYcԇ D(Bs)hAt|kk빖M d El|V#̐Ǫ5L LHzW.սxgvT t mHUkQԭm$PZɈ'"%}C:Lښ'nA2L)oՠ!$G"Xp8dԗV*édIL&a&0)I\m68+EPfB/iZ4ce8֜j#t'6x^*bj*rmmhn$0/o4 |QN%j-ӾV(k8L7sА?{.ʩ+xp꣚nGAz\z抛y;[LK_Mh]V='!q,J&4$2R&gMY:&# ɑ`(X+֡Ja/I}P-ӧC^9i]p?V|+cSd6 Y"RC@%2TX|-7f_4oQ V%2Jp 2kI[L_y֊{ 2 A:d(ٛѝ\$H@Azpb@N*U*A zj.}}r~HEJkhK$Efr+9S7G7*~~ ?_뙖sWϸ-[%c $~ r1PkKX3zTRؓ,!rYsX{aesjQZC ސL%N\-_DC|Ǹlkbs~l$WM^]7)GQk w1a|Ѐ~Хb&;~MF̎`}G-GA?b *#h=.X?>`-fǞ҄4v?$Lc4s0mr5Ƀ /R -Qj>CTi @f1rܝGɲx!4f(;s* 1T.n"i1pɴU]:Qz&@ 73;R5TSw8ZtbY\B#p 2ݔ(>6u` tnr|`ә|`t` SĆs2 t^]>rΜCgՓЋj˱PYWn {l kՠ&`R,$rI!~ƀȌw K fH"J[W(z0zuFălDO.>&3bu:ሥ댑'^ 8lHbGa1V.Lm9\Qu.ClQY'/h.|SmS9vQw|GcMԢo7՘;݀/g9J/YcH;omk( ?(W Lx< Xa7/&H"5T %VK"*3:쿤/n@?M>U}kV &D닥P~*>i`("{M̯3Ð0]=í׸~Lju!Ti#Z9^= XayL 뭕`A);@_8C; aXJ@ <! (Z<%.۠0 S-#e#]Tn&NO<8c>fMsK"'5l2^);sqлUD3Fu:ڊbi8(+IU]H wWbnKZ&#dx; "YS(_~×͋f6cݞ[ݼ 봎nr 𸲦&dSNk tW2z %1]ػ9 f\ԯ^k_wؕnH)@*qƦ< 14*[Ӱ"F*;/r4N.2-%b%WFkޣ.jH :=x22]ԭ6'vjeB~3Z:2BB~#:̎I <*'rw(^QZL*mRGNxȞ +4 0 wOb%XiHB]kV1;fZiPKzSQ 99y&timetable/languages/timetable-fr_FR.po\rܶ96$UαlGITJbfsH %+op"?yxݭS#n4?t7Ď+!&_Y$xk~`1]{lD 1_ИsjN$sfixr1*uD}8H%t׌Q8J V=zQ Ř(3܇4foBri$X/Njr[fˢ ߝŚDz_1EJsy fH_g`!gd2Q*zAtg[Q?=wxLg$ц+YH!lofJܰg77ng70~qtsSdπ^FdO$tA及F{x CƗ_(ƛ$܇gWY7DI"i`돉ˈ7ӌslE6(K*2S&~ON%ޓ|QP0Lj5V8g*pou"`,cy^fN3ٱPYEFu|Dv>E q?2+dyYڋ*3fd/:/`}Иigڣ]46YNcTƴmkf5&4-ff|Y}j]:V&rQV 15gUf/ ֈ1QVb%A*U\ʁMFOgkҞuw^/tbnVG켜/ͩ28/g΋.Ά٘6ojaji.FAe|rj`MiuHAk^e#RXKǮ=v8XO xb7vw x2oR.%@*%܇X;yd ! &3bҠ ?'ᤔj8n6&bB71=><% " " CpP"X-ЅDxlW=Jr~,r} [ uh{\@XD(vF=Dǘ1xC ŀ09)0G2YMJ:>S.C2Bhs>^yIr"$5G4c0!bȵޡp "qe,'zϡ gu!pkⓏL.Dre"v`Ɲ.S=SϤXY!KvgD3Jyk3 21/32Mģ 7V IډhgiJ; p ckB#~Eo5~Gl'#.vo|Fj} 3K5-C>$ j3H իtV3 }7{(Nat2`>Vٴ VǷ6D #>oz1$ f9| ^1Fg^Ux ,1qF t |/.sד@KAʙIBhP A`YNޥ}l*|.q?>>7 ydd{WeS)ZN}a|mA&81Sm7K[zw㮘 pGϯx4?ߥv|F&XHF";Ja=`WU *,@f^@^D#;tr?IiXPˇ7v?"$d0'2<!$ջ&ɺe-GU6٩]=@}a叅j(*Cw$n-eHxBscy!3~ibn=䎪G?m! m֥٪K1)+1M8S#╜\Hl1pP3OrpS;S D &W[) [>KLl2gLI0 `a&`I,q!j@zf1P+IR wL3U=j⌃#Y|؁, ]X֐`T0r[3iY~5W=B,[k 7p(8Pw9tGEg RYQAP% JՎGda)o / օmPH Gz lճgJjFyqՙuO BsTuEQ8<qMKC e-any ̍ypqQ5Z-0ZIvEmMsUj)OyS9 f k 5Y {*P| X (cXUP ,U=6`:ZQT[%SG JM \r=s'u)\?|8%0(`5taAuPix_$ %ƙ<*;?JË `?dA=D0O< D w눡sC0BQcFXa :>HVMOEָDK_2:<5ۉ]dPBu@ t3!e@%l$*m.u5cr3o2JɺPXr|hQp,up@p[)#x<y.:'yljt^6m%&w0Mm︻c8 7,YZRtϣiAÜ5Lr~z$}(7ZD )zGSmaո)B/ɈySr4ѭTl)f{,sɹJrWEɖ))sM˨Tx \ 캒F.'X0\&k2N״v˩hFV<|MSk 4{&{ȩ PτʌN13236su#E%ksP|[޼>KfP̺4`KD|iroۈ0Z΋" B<##-L8B ' -L.&<^ӵ/lUTlY| +an6[.tbh|Fk:D<(UjVS[]tŮ.ZQ..~%4"bE}Ve6մgxO.CBfKrcitR)Ejqv$_ c) aE J[by.5:V䝿Br#yi~֞}ox^Cz"7n_1gnB1ٴi|l!p7[x3QI3MiZG,\,B(Q[k5jm1:.'kY.Aiκ“e>9;zyֈrvWD #OIsƞw<"c 3]-Zv3C/&A=z{|i(_y0XkQ4rZWץ@q^ňixt_lX.8*{lA]`Tc"k!mÞ[Qby9,bR2>XxW]2a]*.m&ЋQJڞ.>F>ޓ/ATV ّw) ަbUv7|(l oq 8Wpo<(8W!!JIF?J`q{2Rdg=Rx%,mrYO3>Ȇf^C(w9[ ؗi䰧]\i,2VZac lV532d\CHf ysk2\nH++I?HY?4I+-J4b0{ݸE3glnuKxs9 dIv e[I[%=ȿ dldJ*`X-,"YZdl넭{Y]}Y|3̣dt[Ld)>$SY~oH&{/n2\HD,61vXV2F]tUft!Mq2J{]XLl2xUVRT侙&&i{1F̊/0 .|v#pg e&Y )3V)vZEf(+$+6]|URQ&VlK?KfMK-qGf`&hZJɇQ2޻ϷitR=2=n>25 $Yfj*`՛Jp맊<2%cW +ȷNS#)Y.#jr$ p@9k#ZU" HkҒǺfd2oxR&,mƮ=w]0\O)a~kfi@k5<+>e Xc]g`LOi/E~1=eȻ J)$0XTBN~nI^ B4tA!c3=CSKPSypym}4=̕5PlwNIRj$) rDFαL"pI(EȄmaFý\fqWFs7-$.$F."eݮ$/][Fd؟$+׎:{fātݞ*q Å8ωjPyOjȵYghP}I>ejj;|~2.g}TM\ iƵ)r`9ig\,Gw;Z4 iܖSEmԹ")T+.iiwfQZ4V 8Իs 1K 5芝t}6 I-*ւ(VmTLħh"W@2Y?2{辍KK9ʥa"Ώ~jSU醖`ƌ6_Z"Mx_^fd@fW%e?H1Q7s9Ffo5hDli_oo(ҀB(jתft6Ԕ:weSg2Pӑ_Ygh0]sScV{~y :K5/n:rԁT@ܪ5zQ6mu;/,\+rTr;5~(H\}G jAؤϝ eAK0ᷴt-)) 1ȉA瑃xs /J9OҶ/%2bNy @io89I90"I8<@-'a>BpP8X_;-eG"8SQłA/=cxN. )!q@s·PYсTe/* L|Ĵ61h g`*L\d(W],|U9. QawO{ vnR n/|XvJ5ӻO.Z;EM!DٟM$31,<,4p[[K%&w\74yB@>(O/'6aX?;Ri` [p'pp˦ObK RN"b;nZ'6C:kZ{ΖO33f0^$4xK6e#ض,oǒfo>&5#S8Ju52QgeÜssrN)#8v1Kilm֘P̄N+.ŻX5Ҝ|Ve\g;f(=7G2ΏGht*Dz,pβU(y-n`k`[бE.E^X'Îe<b%'v,CLhLˊzL-lxZp@…$\G%aZ.Zst9^)T:Y-īSOeZO 5>1y#d~\2~<LXmO_.7 k%uXk'm`N_JD0PM ҏX+[p <W쏺~uZ2&xW:O^eb0bۑ+W" [O47Fuz KQ_w٧4?-_Ŷ# a73rsw ]^c;&^*K71P Ao2j5F_0(dt(Oo-?,F`:13 V8Kj6RAd^wBA8׊ {&Cp_ z<~ߊfRB dMKjb!Z`Ŗ^)3) dbVT܈loO oKCVQ{nPt.!j]24rӌƱ= $֥:̭DK,ͫk=@HPJ͢{ǗQ_Ht N( ,=81O~c>UO:__˛aӕ F 59;6'D%$WafϗJ_{iYC;hfnQ3HXK ]ڈ2p)m=*þwv{MBg^rZM~m$;7/yuy[aQWP +¢bOsT]-̕⩚{<);Z&J--䊑MWp,i04O6WcJ<sGܚC_G1ԞEY^aR%֜^*92;ˎPY8R9 S6MȻp2ƺҘ&ݱlOl|v`:<'w^0d>+ [P*wY7̨)^O}pcGp#++ =O䨳 Vg nƲAZἂ U9Sbd5~h3JtU(l,:𶷸DD6|8ӿP͛˾a0+b j"yXrݤ@%da6sy]5/t~xCRvYbUnsCe yUҼMϓrMOޜm{ Bk!iބ(@[Iju5b4HӉ] ^0܂.)%(ˌ: JbfjTcϾ<:#U=_G/s^h(U'Vi BI7L3/f y ͔*[Y7UF(O# o .2|U88* 5*@%͚=,TxE5˛`lff7)Ќei4V@wr2жP.4VɫlpS$4 59ԘLhrdNsz)>ECHHqI{ܻx왬V|Mcʊ@ı~nCfc $%MY{/CKBQ]N cNY`ؒI?5y'0ĨG3Sfdؔ|AZ7NjJԇ޲p$|ʳL=﹵7hAYd)Ygi29@!B拱y>hw;.=LGS,`${[ț-GS"~WḠ+&{p$l٦4>QMJ@޿<|ŒU'MӢߘG/7|0*DjFe;S=P˨IILTmq.ՆhJ!V^2d(pSN^CղqP:`hrmYT֟h1>GŤ mQfKQ9s@͐ 34XτW816Qr6ѓe':֕? ͫȏcbݞmF:W,nn@lm8b>w٨bB:ŀ:XAvlw]flrDn$n}Zxuw1 r>3 ucX cyY%WnBlgiμGrQP{8)cpR+"Mrg^@0qA pTE*x#K1*&pד?3'78G&Atd}ف({փmB:[; =MА ղj6* liv]H:qM;f@ {8GbP*B|˼b˚x埮 EY_.]pb2Esyku5dy?]nF}WyQŖEk}1P"eHC'Xwf2K.ɕI.wwngòcGxr02;?!7vYQ澸ER}>9FUl?7b_%,U7¤wYm6eXlSx*A_s`;0ǫiҦtJXj! hwJeLjl*ŗzF&sb~e n"z4_R̘D]hW,+Ւ=v,ص+:Jd4]5LK$CSvUDm'?WGK*L42cϏ73g3Zȍ5ws42[XPaO3k\ƱM^"uF1xQ񾶽U dZ%S~` yӗHc]7# -G⾇dSmXCM{赱aYh3_ƉTΈS&*lA!y}C /bfkih5z"3ܽ!)s#GNZmZ;]C" "N{E6 Ն˨'$ #ȗeL]dG]|d1 :(٫U̳襓0e@.Y{]_3V AU*i/gkZ{:^CsimLkv6MD&- {2KQ㥰^!nMظBl؊5md8Ep8,I9oL|جQb NH̓X?C%Pȁ##T LS ܓ\W<€/Ѣy5m:3 GUA`LAbL; 9<_v.(%|K1> Hcγ-Vu_VĜ AQv[ܗƭ5uTC:@7 PvZ`rƅO׋}J5WE\>@)SDIqKYUB4˙b,.;ttmrJPjxN "8pR7=+&xhg׉)뇩s`ph{[FMgGlpnrVٿ~.1y@ʫ<]#ZPFS= ^+H=wUc8ÀAWZ'Dϴnij m7^k̴˿El[pN V8nyu~}b%~ xY"{U0l" *K Ѩ<%7QYJAhZ&Q66#K}'& {VkuKK]~ PKzSQ3v5&timetable/languages/timetable-nl_BE.mo|y\Ui-( HWҝtgiNV骛uo. $DDCP|":GG>mTuw~{RK43>]gmw9 hO;]g y/$N G q|'⏔~,!g B!΢FO]$k^O8Lp |\!^FR| .| v0y Q"|6S< <`;\?| >^ o%x IO !k]ϝxs: |W%8\H;;@K;0Wk K^Osq/b:wgv9(vEݫ7Wa'I/%xѾ h]>uuu 4-<>?U;sP >_FpB^_p %x>g9k"]sоttO#xNM?ܹwE ?j"EXEB/ŠqbuŚ///8X ~|.5'K^m^ٹ/޲rtK&x\K%K1nRX 9kb=߲ukK-Oeon`2sηa2Z1,C?"8ח 6/ʁ֡?y^ٗ8rrsrt9۸/Gr_}rÉ+rA?@;cs+Wg߱FV@/Yuz;A2=Cp#`Y :k%g% ZyX***-@V_x^٫tzjz5a`5X Yݹ!]Ajՠν{%wDÉK-f~~L55 m$L$₵~_q>VZIZ聗u KME\.#]kxZ7 ,tn͖n{Y7" na{ e勠vg}Y\^y`% .d{r7viJjw\tϻ~ǎKAכ/\u>}MgmZWlz ͠?mYj3iEX^ {!bw$KDn$rGf'XlE?e}X/dIpcyaw^z"[GlaQ~O? >y-7v5| 5AMnwAp>[C{byƽsgx}`x<09{ <~ctxXkt`;Ѿxlrv v7ہ1gϾ@?N ȉovu;8};W~7@?v?xc:;^ pd'sh';>;N~\_< z}%Wࣤ7 >;Mm(}!m6/i{J!X%W,cHz"~KvAv^GCףGA6Bb}6WA7ƺLؠ~t{~[Sl'٠s+B\z< ?@n<sηq9z9q oh I;ׅEZ.ue.ꏹ:ǿ< }6 9#UЧZ8WA;Ы|?{7(?{7+jfyڍַwct= xJ{:]~Gd}aA>a~O/G~Nz.1>\cGt~Ǽ1//|``/(~%o>E;`{D?+:,_b*DWNv~g[]x[jˬ~N]55+5S3?Cc1ws U]7~a 1c?A5n>5~jq8ҽ?k{>M=:iv {̄ gM&As'1IeړXݓh7`ix>ۇ1}d?ڧ˵XǧEׁ^u ø7LpQ%Uc |f7ġv߀ǻ . #1܈}7b ;y}nr&MfҦ`On]ι~Ȏ[YnA?obgނ<_.{An;WPuvCؗ}ٷNʷbqw VP/s+[܊} 0ڭGn]=ķnGCFy0;O> aA`ᄁp~kϮW:UG1߻B>}? ~xHk= oB>t1C1o1ck 7:|~| 1^/#o,yYǡǡGCo9>~7ߟ'#u iwS;=s n]'0'5ntt'@O_)a:'Uoa/y곈6}Q:}em[5z~}e9i~ZKm>y ?^Oe>}o]_-Cex9Fg3>X@κR%б~~h/G|ޗ;&6)B@/ ^> {/g?_sg8S)x^{o5f+u ާ"y}x[lW/LͯOBwi8}L/;º),*G+[6i%̱tt~{Δ26}|a69~'a|6 D>[_?a?|VFG8&lY}T noؖ/A{q|om?.?A_k!7y.;Sf\x==:3۰xJ3]3Qޛطa~\N6)Cp}oԸn7g=UMW hMØZCV]a 6+klÞp Y.>rm籯Z_|@ov1eTS֍/1\!'6.ǽ qyl軄i]`ŸMme zΩ=wdnɰ#p 7 Ӳ PpC'Ȋά1dV`0'GVff#0 VffVmpݒ-5}=F-W3WU$ )O=3KcIt9Y12}cVd]4,X#FP*Vat13F,H[̚U2u^×6Yk\hŊ崯^*ȈT4Fk8Ɠ\lY#s nU1 RHQ4j ?Ue`lcVݾj] \/Su u bTgINd|3W#ʌ[2-1v͢LvOtG5F~e¬ZroD{71eƈ2-MNszTe OdxE9fN$([1fbY1˶4XTC*tEӑsnffJ, `:̶A;&/2qFUMGڪ-IsP"ktL"_3L^ 4ZM'ׂnZ9*BtJ YӓU^bF'RWd%/bƕfAXQ{3uLxy" fXdj2mI0⹕:1*ҝf5n(dg!c\;8f I8i[Vl*ʒG+#WBnz3FʹC9a[ c]3VE,*6GR)£57iӍ%zfX=R$u&5f7ܑ>,Kup:4Ye!Z(mG4ЫTaYCOw&]GLW6}WXg58+C=5s6+HsD4f筚+QfbEsZV–hE^wLI<#4òYlץ*΄nO+VQMX M`[b8RHc<FʯfsXE۩ZdhM :NrQZv=[lqf#ѕ>S]ӲgW佈RZquifM_c _NK ;ğF09:WXc:+Hʁ,YC 7 ,;$\`.`1?u^H3E^uCnG|#tݤ''0 ؂s>lK][Izc/D⚄.(囍F\YEsEA.7Л(@9)B9EvYtd8\^X*[v\*_4wzMU̪mP mzxY-yd#3`!Svݍ|I1[=H=?h̞i0$A,'7U^vk;Z H[h|qF݄[mzlfU P!D?~`UQI^]k']e9TO$eqN0D"o.5x1n)EwTv] 1[e ^5B"+ Hɓ%MbKbD|7TJ"M=%#pvR/ nQe!h ,FhV}.Vj빞NbcriVDAѥo7ռkzE3j䔦<ыf>"IpWCF7Q~&92w 6'/LSei6݊5н#йJd\Ri؎btNg}"(|̒F9A\F uB [GF'urćVHCN]aA|]"bEΔҖF: f Daw: !^UAA6J9E*:&g3QAɮP%C1[O1J6;كRWչKj!,yh/)~>Z LTNmnUIt(@҈d7}%5geFf5ήu'm&IAco5i\:@ur ~?Ϋ߮PFRW422nj^isȷiɺP-Fϊu 3J-zfTߚlyQ9'6(c\hU 4V*t7 h ec,t6SKZ^:~RnF;u!|6l4X #6ϯ~L(lRMw1c|xH/6~;s)/6^-d[ ISKBNOQeFG"di g9P+JPuփT` (:Z4' sd2KG&I:2k c ~Jb",jQByohL;T&nfAST92RC g+R#N3 Y4JZrH,=A,Zftp5tXj:hDIjqߤ"ONĈ)(R[_F8$dP+Խ-6PZGZF83W+8X--.:.SQ:BjV=1SIՈ2ꤟKy_֙v'm[j9;^{-ٺǓ $fahV|΁l[q"z,MџU2[ч59|%ăV3OEXt`,'k#~;tjK\ah@}옲AlǣʅXU@!4 gvy&^=Cڪ*?GH(D *F~nTEWIMtQlF8~b3Adg_WDaIVcɂeFYzWiqiׇ رHmrrߦ 1 9?Qbsa!FTZATk7nyb;ft?k6\y²J vT_زG8zIcDb܏#YSsL[xHYZY#ܨ*Y)u,=z$ f,A|ͮC"]]6R )WhnUYI)N/7ýRd[\W[IfxSr保VE*f NEEZܓL0Qh(ZN:C1MzG)m1+oT婴JOL;Sgf4SikǾ Lऋ[LrzN\ T?k' ϸiu$¡9ԨaLz"Es7%yS©wTRScŦUW ʼUI6ȪM:^2vp 㧩[lU&kIDf~}7 =ek W.>qG4*:_P`_Ѹ<HܪBԏa6c$g2ޡj5$TMiT<TM i/X'S"z/2Ҟѩ_) ۢlSBd%OC+'[kL(v%R 2떧WʧG2U S#z̎"sǾXḋ=s㼀Ni99. AŴf_j ^\jOY^>]Um,莝b) 3 W>~>Ӱi\R{0Ulq\[<5ӤRPvq6)ҔsJ;ZvR.a֍ѳz'A0a^$I55Jў'eK;%Yd2 広;Ut`(ȘT0&+ŒPI@9#bd.ޝU>KPJE{WyWWhݓ%0jq#3Y8YHeq #yJ,tP>oԇt0 Ncܧe<9TJS,2+7"[ћ72.暈~Kg1::,X$~ Eӥ16bVLgz`aĐ4"~Ml . J8 Qt:V߃L\'9V,(m(-Tigd*tƵ*d|>锇ZcMU(V c~g`Jak 0SXezS$! էl6+ F.OHlhulpJE3w[)~Xͷ?tg =-GAniq;>x++u-p /,Iȣnu,D72ToxÑ&?-zm7}AALЂF7zC[8$Qs)o=H} ;6lKV}mXܜ1o@ F ]9s~[ft,uv^۹|s׭saS-,Uq,Pwу39h:A '2yDrPG}>u:ݺU#/wn7$|f WȌ;dBJbk+ǒaObU_ _r-qd3 JXV2&?lhQGuyvFH|W_@j3ƕuxLc ٢T1@1K}޹Y1mjьpkLCU$kDWr=uW2M'@>hGpAw.Wsx#n2[uhb7E$}#Ċ.x9n{ۖK5EO5L=S!DŽ`pI4KfMqh Z2sQ2@YKmb u~iHtQ"'oV?Hk,%NQ"HCto9. Cl24]b|}nůǩq|* 7{B9J %gv%YQ0ۭ]A2'*)KSJ#3ˈIt2k$C5,O*k G} %f~=f@-zĀE5K|4)0Z@ֲ #_2=y@JJY6Nplk:hzc YΨ2U:.%/eQ@T؎Tv;-^\Ң5`*r݊ JayXwX2!bA_Tׇk61UFX CAm\mCb,궰ɷK2~X露aDwwI3Ԫ'D5d/+WL^fabI֑.7nXz)eN*M%3{ɀMc/Da5ۜMEax Ҷ$/rnT#(ﰱ 43h䈢J YTӘ8J5 i̺T_LĪ 01L~ؓhFXgĻeQD2iꬃ[=YA,E$6)$ i6YLڑLuZEDH-~$$W_Gz{RkKڜ˨[Ԇ+*|IY¸Mh)B㒳uh\=jC29||>Eq[n FDl0Ջ+Y9b{5*5v@V+mfyR_Tϓ>RI/co1r|;oBnEp͒-HT'Ά0G_lxr5/MˉucT"l_kڂ*եdHSϙQ3?W/\&ΩtK?U-aLЗ !* 6i]i_$ͳmuG銸ս/Ǘ,_t@&6_׉SOE͔t*uK1Mw)cN@`ԏ%O"SX 2ʯxﯻj|?gb!mO36H5@?gp(TEOďnV?w6:Q^6ўVAiyӺgx_Mݙ`5>ҍ2r4i+|(9@1L m-_tIyQ]NOEv*6^QL]j-oS:ѸX1ssO,ʒَ]E/hz0ץ*4D-=w"`7]xoKd?_%Ϙ#Q泐~doB .OЋ2 \5y (c0Gz7wj)gJ!>sEȘ.'tb֎_ಜvLJUeqfƘ[a}L\|XU?M+cj9ɽV|nC3Hvp9mhJ'nTYnx!qh "P#AE%)SlM`Dy'q VFP3%JQޞUs%Ҥu(U @ԿX&%*S,W /1'acW@5Ƿv {n4-@@ p_kѿO|?''p=[7gԶZa6BQM$;m[y/'S6<Ɇq{nC9҈4݃F߄˰{6x` % ~SIKi"  D&3saj$[v0DN(@a]dˆ*Ts܁ 2ءa%V耖dpOs-z0 ]s\`  fdٔ641΅x"" hb (N!pf;wq:**Ծ~b_"]볯 VjfNbpX{4#ڣI 3fh:>jGͧ5R) 5?Ϝx¢kQwhkJA!-Wt.7rt|25 Z-GAgҼxf5 *qZ dOfոx>CmaiY<7 N͋gM͋-a5վ]hA}ؓڳA7Ts0Q2G;pCu3iYQm|7;?Yt02;]ezĻ؍Zi.N͋iwiv yZdOmɻ8͖879qQq A4cFkr-GD$SNu0X12 !pOXAsՙNl>(-`,KP~ J5s_`&av#"f÷#Zyp>.5ɐ"@agXƃϴkm P}k[>!_Q@WSptX1.15>&هY+ {@ԷNer46Uzlz#o(Һx2kr#5fz!: QZp,aE_x wE+ ?SBѤBw'C=FW] LRd@8/!dOקњA"N"yl?c܅[/'wdy2EHFtĩUqmk.^;GGGXôõ%'c 2h|%װlMAEm5V&=;2`:#8=矣̿w!e6c\ŮG}Ƒv9k.G؃;#h2_.l^eyB'-Sj1 b?.&" nf(+U`Uyu\ɬbCV}U }$DSӈ{1#y[]+#B^3mր 2 } ~3!{=/+' ?UvӀi=`xKmbX=IX1Kn>35}~yНЇ!d(5srE=j*p]1zmaDKou/5J[nYOA 6!+x8 \vqK^` GG\, 5xĻH9(qm}oK{o1:dFQ5)wZ[{߲XqYa;aAďxz3,\1u.@WeJz'gL E! ?c]=CmN `b78{l&IH=|"!Pzw*e*6[s>t{l(+It2줈KeUٲgIO&)) R T3bh)~fYrV q3­'@8- ,E#sIZ, %fkD +(?!M+ 4D&%O^jAܝyAj1O.wh됴\-bw t)#$빥Ts(c1OLsl%7d{seDbk3NfĿ:8*̤: [^auTb[ A*`礗\*EW\*y4`Is<AB?Qj0a0"KRǕ鞠F*!iL)Zjw]{ϵ!TqF@PEÄ"_b!y~K6YV-YaD)@&RHQS,ےǨ[KO=vHH)h$irNgM{P"@v EdD)M$Fr:`GG2Ne]<׹d%QHK4Ѝ#pWHz" wUxEnI >VڍɾW*?QQe@W)k((4P?t5 En,]h2/i6? %}8MX|Aɔ]U^'!uۧew+Oe|0 [iktIiI1B <gg)Zp1Hhqb4(rݲ#nf qnq}óW||nݻ팻ω.IIٍ=r8S&.歧ckRQ`7<*{ ]lw`yqK+uWbhJKY1V5)hHV]Dɒ^bْƭ Gnټ"-O Nۭ9‚YPMW@ޏ{gv\2m:4HT\Z.?^mgjݾBݲ;EOǭQ>I6+O |}_e_2:2`*PK*-=Oanz3ԅ<suV6$y‡ٟn{oF U3vUrv`ϵ41+H4KV0̬c-p/c~-79<[*%XLGH{-<]?mӀ9Vpg[5H݃8)ˋ Ʃ@b)کgY뮹="Dx"uV䜟V=4qv@oiu*rzdSN%'9=%`a@}5RSk ;Ƀ4rÅ{0mU<:b#䄩FH2AJ6(`W**%ieDwdrHx*B]]yکʅwKumW=?*̔b ĢëN8[ckڷr"TzxgtK,BHGujB^~HWmou3E%QCsu*4uR<Te0a=G` X1HPe8dC,qGVu*Ð^QEABЋ E"8"%ԃОTuLItR|U5'EP"H2]7|ɦaY~Fv!T-k0;- z2'UFjaC+9e#%Q/L7˼uFOԹjIfMrzWWPZC\&\Z ^+f.~'D&D*<7n#+'>9-ə!pe䲣&ڋ) gӈ̓||lWa XL`!vш@eM|ϛZƮ(SyxD{Qv5, k Q/xDx YI Z,b+ȍ-`[m7,P6Fo|).UYbw.{OL{88/HMxX)_E٩{kԮ\\Ԃv(^*XXB7!k3܏C^9^ 8!{7dL: 6>:{dj=L R/i?D%޴e'&AH^дOC+ (*E(&F=Nףwb2CnѣCfi^Mef\WC{O~L@c}qG<ԙ+y̶l ( 4A̞r׷f \JcłW0O\W2\Q3 7/fQGKkr&n CX"H=1upJ2yimFpJ"+C*ףz g5xUZZc^qAc/'];R^*;SY\H%WšM-,]aNkhs'r T5׌ ίșECGهuf!u"u4zYSOx'Ӆn#IB3ݨF@zVX!/ -%NR[DJTm8 ߃"Л:mI &@*7PlE.c9:g,D@zVSKŇqHkg3-= Y4]OX'&"&r3FridSa͂JJNEc:4vqi4^/$'Wwfj2v.ij>CʒE,$DIK:t൳OFȡlQҴxh) ECeO|[i!9Dtri46s[TX]c/ =#?o-H$.o9(\Mh%Eq%c\.o\J!'{fc&!dh]x.pi@xbJ!;t&ӏZmY oďLY2 {DpST?Ow)G=THcIڏCU ̑OfL?O ?dU6:'##9CIsq4 RՐyLSSS+16f3j/BcUF]AMck"5X^ւ_u~RP(\H)DꑤL;MK\[;̭ &s͂?qW?+F=ژ |$pF- ,Ÿȳ2#S3k}cBWu(̖C;- ~zH,p#q'/Z]ѕPȿ<Ϸh>N麷g] kQRcm-D#c1M|ũ*`H'l'~K̵UhћYu E@jǬڪ 7Ò9/.@gɕa^ZtK.*06 mx7fXe#nz,a&_<@ehtF4%A :?ޕ&Vw-BHəDBu ]8T͇!K# 귌~UGc5  CwIugѠy5١c`C#'|kí { ےbձ{C V!l@ &ˢGC{:g}z`]؋v,jKw(K Tbʒ:쏔|SPmw%}vPv+7_&Å FPr;@ '=qu~-hm>,[fQ4w8/VmM[h"yJw/_ 25RHnf+CttRÃsĢۇZߩ?DG;o=ygJ>tѭTXU0AQ`?S%l6 =g4suMEp%0[vo̫C0˖i ʲӃ~ۯܺA.P-d=DŽ `+7=p",ڋ=7!.yI|4,g2"_Y&tSC/ZK&^X ]Vz^b@Vp u* iAE뺆n |V2V:| jeh+9҂Z!VemJ0b=ˆǟd&Yclwk eHwuEDz!S[!wz=ꪧ[/9vW, n==sOff撤 Ca=e3QsjX|v0Wl"ܰv6Xgz@?rzWzY'Pޕ,A5wȕ3΂eY=0jP9߼|nҊ6xʮa<'|r>,/yGxo/=*6Ȇ[b"yc<@K-'ou K<]fATo߰Ngpg'zw=|@" ˀ1dȱr Rۦƒf3VDMZQY]צdp{kwAA2GV/@ B/_+޸70 B$|Hw.z;&QLA%ט>nԌ0 A)Ѱt]Mrmq pOn/iof7 Wi6獃OgNKcC>oEwOmʸْbG8Y8?͖.t6VO#l4#  a_ 2A {?%p$J&ՠh (٩1ފgZ wC)ͫu4H lp>pyP$<^d+( cTx~8. H+?:CN@Rr Iⓟ؇Oedj`nxb', &+}TU&GE!WʍC)뢢t?K<0ƫ^r.ٌ|S dl(c/3@`>X^@W.լ^d BdDi%Ҟ~#_u/ $OSC{20$t3ەmWmIau:@"iڦi((q%!G_̞eZ$gfw[<_g5EXɲEb010AN5tRJs PДw%!zX۪ {a |6? HOH'5wa3apي"BʹGUڃ/#zY3Ip?A Ay^<6dL綺9}4hke @PAXH_UKiUzz o_N8Imh]ݯGw kU&)]^B=6dt+aU?hDl?bn څ!T,!#0d̑UP =-=}M1:405N܃EEl0 $/%^zm I$" 飨+̅IEeWNJL<>?JFQsܿo}z=Ȇ4U^^mnL#$_phi70+3.t߳S20cQy$G>;e$W./땮9|O'K.9?F#=7T{ݧ/c{h~Xr iU/rIgIrg+3`^=2tku5|3V(ApN6x8:?gIdZxcaZJ- NGH\ۚ#cad'wh`_i:@.: {LӞ4[Y-E>AU؍Bvh2ƣ#K֤V.'A-H ,ye+Yj (28+!EAӿ#-MC|ci)`{哫f" L:>R7-NG;Ђ?N]x9({%F݁"Ncg!œexp>ܞCo-]R6*\۶č[ k\-XlTsP2#K+/f0M8pHb,]Cp|{WF1 y#_uAԲ'抅`XI`$+S5"NGw<G-ԙ39iHÖʜA 0wCJ-Yn($Rt=vukpa>IDLzSjT΋AeO(E^`!+DGX:CS@(1QUH0GW^wTRG[ZitQ7{'#n@\mfR ㏝x?c8̖QQ>EoYf7iW6 !:ާ:&,r˴ rڝwxݲp_rf'jZ=Bٳm'Z/b+LN$DZcl̪Й>EfcXGJ%bJaw Bj/Ē?M=ګwYOm<]s~ۑpwDyC#i@v_:trۿdi5݉~HT81|gALy]زCl/KKo3#Acs=pY{7ѓa;}}~ :1L{ ZU<(J(QFŒ㱄`1W˽ābAC<]ev]T-XՍ%4q+1Ź`oTf~U9c\J_=NkM~!jwY{F&v03 ~ dnx4] *퉺0'`7T>}}*{|YTB ?D y@3S.9oi.'T<j-km&"K^7.Y(?xEb젫BǎG|MOssSP&mxp_ZL6= x z%E^>%-l wxi+o0Jn@3W$-D<[~ 8SA8'E("EW|+o&^Fp 3 2 %ο\Epu_Hp3s /|_C_/"-~#s{B9 Qfw|H; .2x3@vݪN|9AEPg:1y|3c_LW/<6KzbYv3R~l1{bKo.x7c^t1[@`<A"v'&x6G ꍎ.م^> ԅqvua|ә.{3GwK¼>х~E.a~既ҥRۺt Ap[ |xx%;.~?HD)y]u޴ y22ee7,zݱ\r;G-L c؇u1We9ۤrn ?+0߭'V`Va. I!/_~RX#/`Kp9JͫV8w~Y |~c%ןIoVCs5+ <>ۃ} 4VaWaޫWa0U0f?OP|GDۼ1]xwaW_:}+!#%W`=S5n!zEh,D6Y^ x 쎭kck0`Gn-!f-엟Juؗ:+oH?5/W 7c&HS3ޏ;o=첫c~G z6 " i{|'z5@^>zx AС9|)˷AA^G ~.u .BZIo> H*8Dva$I? $E؏Ð [01,n0a}߻;jx~E? a/6a6A l?PMM6a6ل}AYrc33GY#KG0#h?<:6q#D^}cr#Cx(1< N(5= y@ol?go;vxm|ৣo~vi[i&g9~5Ʒ W|5(_kv;D~pgv@^<,gݽ\(_n߉ ;|݉qN{.՞]g.sl؅y}w.7wa?zvcϥ1nԳvcߦw7H[ 3_nQ{@n#'޷~yG<~Gy/䬽חE{gWE$^Rڋx|/!a/o%}Hta>>}X[Aܱt'ߓ?>w\t k5XoCGk /βDYm]7Zea_Ο[X (_V@z[  X X ǯ?.yu(huE"`s?WD?H"Qiw = ׆9dI6a|+\Ha~P_;= SANߩT tڙ%,o%)G8<.߷A'*c}S>6]3fB X~_`~yX.+v$Ov2~%OEnl#>@o!Y!(u/!쌗6`g 7Jp)AlLNßjv-7ӐcW?]x!p:zZ? ~1<4 z,x,ѿ<8yt}3/>[sn>p@X{`:ʃ}~BxuWߓY#c[^xvso@@_ z =?!C;z{W爯ԫCntp؇F_~{GG0%5o9yz~xO{ >ytQϢ'X-G{O>}{(ob^OEx:F9O\{ &珃_("?5Z=ցrLwJ7 !iPJ)]16]=n ~s^> !Y >#뤼wԟuo_mCĊqCRl@e#l7x7n:[g\L_f[82߀c9Lo@ܪ/|:NvߵlC?ɶ+՛ad~9VH忆_&{"ߟs$[/8+wu~ofcF֙71%w;ۉ{ y.ѿ-ηs9Wu@gL`Ԁ{n}ji:743R˺_[ǟ!;w_bA~#[AϠ2g>6 }@8aH>)_4 ͲÀ.S? qJ_L~3;Hߗӿ$&^Ct_sγib}Z&Xɫ|u?@LkR~rJWv#]Ge/4p>Ol3:`r_Wה bG-|I_嘒0 1l׀Q⿇;р~l;I!s(Ձnc!Y ?PٿzۀɜwZ Rsuo9(/O>&9d~5`u4}^Hu|΀]oSx_;Atvte}@%}.Ol8HF55^DyRK,/:}_kv+J&փT ~~ϣْ~{TfNy}\py. kJkZŢp+Ֆ9e,.|熎۠Yn \ĺ|~  ƕW滗N'}>ɛTt\35˩F} ]w&sQ1t"mՐ:̘ \sA`|UlRgU[PfͲ%T8ou͞YZEZ k,y*6ՔrCs&8NG AC3T~- <,Nb?^wx hqN@ꩆNĦ͏WzUqg̠u+˞ Z@wj6jWjx{~37ʜ\-x F%ZEUTUTXeu:M\vZ`ȕk9jv.2U j+?KkqМ=%^mVդ,Um)d6/kb3`Me 0 0)D;E%.E Ζ & hT7S4TyO>,Ȭ{\l& }-V]ENrIJbX;h͉"&)sYUE틌HC:=QՈу(O<}ɢ=^Tͺx #n/pZ)״}n{.amZ?c HaSwqYUf,0qC-k$JI`P[lZ}m3Mc]6 1Jk#Jdž:, 7[q=ՉXL3ܵ疜2+ x#!>F<'lg#uucc'A}*όVF*4d5a㍜rHIk[ M_=28s2{)l(w-F9bA-\FBtF3^k[ЫDž C(GSsZ'ְE1GmBe^"/2$/h<j4jzoWP$4\7Ğk;ld4L.Kյ wPn1۔-Qi 1KmMi<`#fn7 QZԕ UX!)KR3d)iwTRI<95^o-EYHIuOB =W@RМT娩HMZh3b)UI;n"7Wcxz>JEDTHnG̒ZoBҪajG%p L3E}:'0`U>>8hW 4Jsc*i49M6i%`a 3_py}Iʩj*b!"U-AY.ZM$ ^1&B-MM)$՛.9>WWػ Q1WSl[vH3-!e6JrY],ȭP $PkNy,XZ@2\{vfdYivhGM2 b-&t rj̕yr"hCqfs"Q<,u,ekOiMh47ݙQ͘LcfaR,.ՇXתZؗx6UϲM'i0Z ;_v,RgikGN;$ ųNݴtVܷ1u$x8D,C6Ѱzj vxDzzx0bu.1km}{Ό(,6L {=sA+T̍&;3_IՈ25IV0!l;ή:z9;{lEFKD'Ӱ5c'G|hR恴Ng\81$47 :?R(faad<(;n\J~DAjZbteZ%B]WrH&hxb=U.Ƣ<09Ԩ'b%X;C[;w3HҀkĤn[숄[ۭ2lVZw,I?eGim7 GrĸwԞdYmLZb9euNMjVHYSTq ]((IdдP 8n6௻=Pt #'cvlv,OUzVr_ͪ5Jjliw"N\olWOqZI4h:3Tuf dj2IRqAyKdqci*SsvKщÈ$޲nӶN wN$ֵIa--7B `D"8H|e޶&ttAXZCۋ ũ㦌y N^e%Nb-eʛu]f1 zi5aS"W6k[c7$nMltAӴ2xrbK|]hU)3:Ћ %Ac]oiՄzh'TȭtSr?nR2˖t m][^6ePUpDWמrPU];.ӎk{ӧtj&=bo 6&=U3-5#=g$Jq"s")'p4c88,/c*`Q'h[LscDڗF1G6QM@ 2Ŧ]-ZW`a6hxDŷ-.^|$Yifx_jP"oN.nj-"iU6+Ʌ^uU5BD,͡ UGPj/8,!$#f9H*thY^*B xEeGIyMNѪ֩pˤ_6 ߡ 1ȮnUmG/zDtPbl\.͑"9"1~J9mF( (nw"~:aK#h 7dAQNP T"1m+YܶԒ&>Gݜ9Aq-߸˰*Z N_򆕺lh_Y0M>7 U" 4YttXKhQ E\I|CRh]iUy 6hp(uDk$Ge-pVnM*
    ', esc_html__( 'Upgrade message from the plugin author:', 'whistle' ), ' ', wp_kses_data( $item['upgrade_notice'] ), '