/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Author : * Damon Chaplin * * Copyright 1999, Ximian, Inc. * Copyright 1999, Ximian, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ /* * EDayViewMainItem - canvas item which displays most of the appointment * data in the main Day/Work Week display. */ #include #include "e-util/e-categories-config.h" #include "e-day-view-layout.h" #include "e-day-view-main-item.h" #include "ea-calendar.h" static void e_day_view_main_item_class_init (EDayViewMainItemClass *class); static void e_day_view_main_item_init (EDayViewMainItem *dvtitem); static void e_day_view_main_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); static void e_day_view_main_item_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags); static void e_day_view_main_item_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height); static double e_day_view_main_item_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item); static gint e_day_view_main_item_event (GnomeCanvasItem *item, GdkEvent *event); static void e_day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *dvmitem, GdkDrawable *drawable, int x, int y, int width, int height); static void e_day_view_main_item_draw_events_in_vbars (EDayViewMainItem *dvmitem, GdkDrawable *drawable, int x, int y, int width, int height, gint day); static void e_day_view_main_item_draw_day_events (EDayViewMainItem *dvmitem, GdkDrawable *drawable, int x, int y, int width, int height, gint day); static void e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, GdkDrawable *drawable, int x, int y, int width, int height, gint day, gint event_num); static GnomeCanvasItemClass *parent_class; /* The arguments we take */ enum { ARG_0, ARG_DAY_VIEW }; E_MAKE_TYPE (e_day_view_main_item, "EDayViewMainItem", EDayViewMainItem, e_day_view_main_item_class_init, e_day_view_main_item_init, GNOME_TYPE_CANVAS_ITEM); static void e_day_view_main_item_class_init (EDayViewMainItemClass *class) { GtkObjectClass *object_class; GnomeCanvasItemClass *item_class; parent_class = g_type_class_peek_parent (class); object_class = (GtkObjectClass *) class; item_class = (GnomeCanvasItemClass *) class; gtk_object_add_arg_type ("EDayViewMainItem::day_view", GTK_TYPE_POINTER, GTK_ARG_WRITABLE, ARG_DAY_VIEW); object_class->set_arg = e_day_view_main_item_set_arg; /* GnomeCanvasItem method overrides */ item_class->update = e_day_view_main_item_update; item_class->draw = e_day_view_main_item_draw; item_class->point = e_day_view_main_item_point; item_class->event = e_day_view_main_item_event; /* init the accessibility support for e_day_view */ e_day_view_main_item_a11y_init (); } static void e_day_view_main_item_init (EDayViewMainItem *dvtitem) { dvtitem->day_view = NULL; } static void e_day_view_main_item_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) { GnomeCanvasItem *item; EDayViewMainItem *dvmitem; item = GNOME_CANVAS_ITEM (o); dvmitem = E_DAY_VIEW_MAIN_ITEM (o); switch (arg_id){ case ARG_DAY_VIEW: dvmitem->day_view = GTK_VALUE_POINTER (*arg); break; } } static void e_day_view_main_item_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags) { if (GNOME_CANVAS_ITEM_CLASS (parent_class)->update) (* GNOME_CANVAS_ITEM_CLASS (parent_class)->update) (item, affine, clip_path, flags); /* The item covers the entire canvas area. */ item->x1 = 0; item->y1 = 0; item->x2 = INT_MAX; item->y2 = INT_MAX; } /* * DRAWING ROUTINES - functions to paint the canvas item. */ static void e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, int x, int y, int width, int height) { EDayViewMainItem *dvmitem; EDayView *day_view; GtkStyle *style; GdkGC *gc; gint row, row_y, grid_x1, grid_x2; gint day, grid_y1, grid_y2; gint work_day_start_y, work_day_end_y; gint day_x, day_w, work_day; gint start_row, end_row, rect_x, rect_y, rect_width, rect_height; struct icaltimetype day_start_tt; gint weekday; #if 0 g_print ("In e_day_view_main_item_draw %i,%i %ix%i\n", x, y, width, height); #endif dvmitem = E_DAY_VIEW_MAIN_ITEM (canvas_item); day_view = dvmitem->day_view; g_return_if_fail (day_view != NULL); style = gtk_widget_get_style (GTK_WIDGET (day_view)); /* Paint the background colors. */ gc = day_view->main_gc; work_day_start_y = e_day_view_convert_time_to_position (day_view, day_view->work_day_start_hour, day_view->work_day_start_minute) - y; work_day_end_y = e_day_view_convert_time_to_position (day_view, day_view->work_day_end_hour, day_view->work_day_end_minute) - y; for (day = 0; day < day_view->days_shown; day++) { day_start_tt = icaltime_from_timet_with_zone (day_view->day_starts[day], FALSE, e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); weekday = icaltime_day_of_week (day_start_tt) - 1; work_day = day_view->working_days & (1 << weekday); day_x = day_view->day_offsets[day] - x; day_w = day_view->day_widths[day]; if (work_day) { gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]); gdk_draw_rectangle (drawable, gc, TRUE, day_x, 0 - y, day_w, work_day_start_y - (0 - y)); gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING]); gdk_draw_rectangle (drawable, gc, TRUE, day_x, work_day_start_y, day_w, work_day_end_y - work_day_start_y); gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]); gdk_draw_rectangle (drawable, gc, TRUE, day_x, work_day_end_y, day_w, height - work_day_end_y); } else { gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING]); gdk_draw_rectangle (drawable, gc, TRUE, day_x, 0, day_w, height); } } /* Paint the selection background. */ if (day_view->selection_start_day != -1 && !day_view->selection_in_top_canvas) { for (day = day_view->selection_start_day; day <= day_view->selection_end_day; day++) { if (day == day_view->selection_start_day && day_view->selection_start_row != -1) start_row = day_view->selection_start_row; else start_row = 0; if (day == day_view->selection_end_day && day_view->selection_end_row != -1) end_row = day_view->selection_end_row; else end_row = day_view->rows - 1; rect_x = day_view->day_offsets[day] - x; rect_width = day_view->day_widths[day]; rect_y = start_row * day_view->row_height - y; rect_height = (end_row - start_row + 1) * day_view->row_height; if (GTK_WIDGET_HAS_FOCUS(day_view)) gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED]); else gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED]); gdk_draw_rectangle (drawable, gc, TRUE, rect_x, rect_y, rect_width, rect_height); } } /* Drawing the horizontal grid lines. */ grid_x1 = day_view->day_offsets[0] - x; grid_x2 = day_view->day_offsets[day_view->days_shown] - x; gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_GRID]); for (row = 0, row_y = 0 - y; row < day_view->rows && row_y < height; row++, row_y += day_view->row_height) { if (row_y >= 0 && row_y < height) gdk_draw_line (drawable, gc, grid_x1, row_y, grid_x2, row_y); } /* Draw the vertical bars down the left of each column. */ grid_y1 = 0; grid_y2 = height; for (day = 0; day < day_view->days_shown; day++) { grid_x1 = day_view->day_offsets[day] - x; /* Skip if it isn't visible. */ if (grid_x1 >= width || grid_x1 + E_DAY_VIEW_BAR_WIDTH <= 0) continue; gdk_draw_line (drawable, style->black_gc, grid_x1, grid_y1, grid_x1, grid_y2); gdk_draw_line (drawable, style->black_gc, grid_x1 + E_DAY_VIEW_BAR_WIDTH - 1, grid_y1, grid_x1 + E_DAY_VIEW_BAR_WIDTH - 1, grid_y2); gdk_draw_rectangle (drawable, style->white_gc, TRUE, grid_x1 + 1, grid_y1, E_DAY_VIEW_BAR_WIDTH - 2, grid_y2 - grid_y1); /* Fill in the bars when the user is busy. */ e_day_view_main_item_draw_events_in_vbars (dvmitem, drawable, x, y, width, height, day); } /* Fill in the vertical bars corresponding to the busy times from the long events. */ e_day_view_main_item_draw_long_events_in_vbars (dvmitem, drawable, x, y, width, height); /* Draw the event borders and backgrounds, and the vertical bars down the left edges. */ for (day = 0; day < day_view->days_shown; day++) { e_day_view_main_item_draw_day_events (dvmitem, drawable, x, y, width, height, day); } } static void e_day_view_main_item_draw_events_in_vbars (EDayViewMainItem *dvmitem, GdkDrawable *drawable, int x, int y, int width, int height, gint day) { EDayView *day_view; EDayViewEvent *event; GdkGC *gc; gint grid_x, event_num, bar_y, bar_h; ECalComponentTransparency transparency; day_view = dvmitem->day_view; gc = day_view->main_gc; gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); grid_x = day_view->day_offsets[day] + 1 - x; /* Draw the busy times corresponding to the events in the day. */ for (event_num = 0; event_num < day_view->events[day]->len; event_num++) { ECalComponent *comp; event = &g_array_index (day_view->events[day], EDayViewEvent, event_num); comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); /* If the event is TRANSPARENT, skip it. */ e_cal_component_get_transparency (comp, &transparency); if (transparency == E_CAL_COMPONENT_TRANSP_TRANSPARENT) continue; /* We can skip the events in the first column since they will draw over this anyway. */ if (event->num_columns > 0 && event->start_row_or_col == 0) continue; bar_y = event->start_minute * day_view->row_height / day_view->mins_per_row; bar_h = event->end_minute * day_view->row_height / day_view->mins_per_row - bar_y; bar_y -= y; /* Skip it if it isn't visible. */ if (bar_y >= height || bar_y + bar_h <= 0) continue; gdk_draw_rectangle (drawable, gc, TRUE, grid_x, bar_y, E_DAY_VIEW_BAR_WIDTH - 2, bar_h); g_object_unref (comp); } } static void e_day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *dvmitem, GdkDrawable *drawable, int x, int y, int width, int height) { EDayView *day_view; EDayViewEvent *event; gint event_num, start_day, end_day, day, bar_y1, bar_y2, grid_x; GdkGC *gc; ECalComponentTransparency transparency; day_view = dvmitem->day_view; gc = day_view->main_gc; gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); for (event_num = 0; event_num < day_view->long_events->len; event_num++) { ECalComponent *comp; event = &g_array_index (day_view->long_events, EDayViewEvent, event_num); comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); /* If the event is TRANSPARENT, skip it. */ e_cal_component_get_transparency (comp, &transparency); if (transparency == E_CAL_COMPONENT_TRANSP_TRANSPARENT) continue; if (!e_day_view_find_long_event_days (event, day_view->days_shown, day_view->day_starts, &start_day, &end_day)) continue; for (day = start_day; day <= end_day; day++) { grid_x = day_view->day_offsets[day] + 1 - x; /* Skip if it isn't visible. */ if (grid_x >= width || grid_x + E_DAY_VIEW_BAR_WIDTH <= 0) continue; if (event->start <= day_view->day_starts[day]) { bar_y1 = 0; } else { bar_y1 = event->start_minute * day_view->row_height / day_view->mins_per_row - y; } if (event->end >= day_view->day_starts[day + 1]) { bar_y2 = height; } else { bar_y2 = event->end_minute * day_view->row_height / day_view->mins_per_row - y; } if (bar_y1 < height && bar_y2 > 0 && bar_y2 > bar_y1) { gdk_draw_rectangle (drawable, gc, TRUE, grid_x, bar_y1, E_DAY_VIEW_BAR_WIDTH - 2, bar_y2 - bar_y1); } } g_object_unref (comp); } } static void e_day_view_main_item_draw_day_events (EDayViewMainItem *dvmitem, GdkDrawable *drawable, int x, int y, int width, int height, gint day) { EDayView *day_view; gint event_num; day_view = dvmitem->day_view; for (event_num = 0; event_num < day_view->events[day]->len; event_num++) { e_day_view_main_item_draw_day_event (dvmitem, drawable, x, y, width, height, day, event_num); } } static void e_day_view_main_item_draw_day_event (EDayViewMainItem *dvmitem, GdkDrawable *drawable, int x, int y, int width, int height, gint day, gint event_num) { EDayView *day_view; EDayViewEvent *event; gint item_x, item_y, item_w, item_h, bar_y1, bar_y2; GtkStyle *style; GdkGC *gc; GdkColor bg_color; ECalComponent *comp; gint num_icons, icon_x, icon_y, icon_x_inc, icon_y_inc; gint max_icon_w, max_icon_h; gboolean draw_reminder_icon, draw_recurrence_icon, draw_timezone_icon, draw_meeting_icon; GSList *categories_list, *elem; ECalComponentTransparency transparency; day_view = dvmitem->day_view; /* If the event is currently being dragged, don't draw it. It will be drawn in the special drag items. */ if (day_view->drag_event_day == day && day_view->drag_event_num == event_num) return; style = GTK_WIDGET (day_view)->style; gc = day_view->main_gc; /* Get the position of the event. If it is not shown skip it.*/ if (!e_day_view_get_event_position (day_view, day, event_num, &item_x, &item_y, &item_w, &item_h)) return; item_x -= x; item_y -= y; event = &g_array_index (day_view->events[day], EDayViewEvent, event_num); /* Fill in the event background. Note that for events in the first column of the day, we might not want to paint over the vertical bar, since that is used for multiple events. But then you can't see where the event in the first column finishes. */ if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), event->comp_data), &bg_color)) { GdkColormap *colormap; colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view)); if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) gdk_gc_set_foreground (gc, &bg_color); } #if 1 if (event->start_row_or_col == 0) gdk_draw_rectangle (drawable, gc, TRUE, item_x + E_DAY_VIEW_BAR_WIDTH, item_y + 1, MAX (item_w - E_DAY_VIEW_BAR_WIDTH - 1, 0), item_h - 2); else #endif gdk_draw_rectangle (drawable, gc, TRUE, item_x + 1, item_y + 1, MAX (item_w - 2, 0), item_h - 2); gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]); /* Draw the right edge of the vertical bar. */ gdk_draw_line (drawable, style->black_gc, item_x + E_DAY_VIEW_BAR_WIDTH - 1, item_y + 1, item_x + E_DAY_VIEW_BAR_WIDTH - 1, item_y + item_h - 2); /* Draw the vertical colored bar showing when the appointment begins & ends. */ bar_y1 = event->start_minute * day_view->row_height / day_view->mins_per_row - y; bar_y2 = event->end_minute * day_view->row_height / day_view->mins_per_row - y; /* When an item is being resized, we fill the bar up to the new row. */ if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE && day_view->resize_event_day == day && day_view->resize_event_num == event_num) { if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) bar_y1 = item_y + 1; else if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_BOTTOM_EDGE) bar_y2 = item_y + item_h - 1; } comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); /* Only fill it in if the event isn't TRANSPARENT. */ e_cal_component_get_transparency (comp, &transparency); if (transparency != E_CAL_COMPONENT_TRANSP_TRANSPARENT) { gdk_draw_rectangle (drawable, gc, TRUE, item_x + 1, bar_y1, E_DAY_VIEW_BAR_WIDTH - 2, bar_y2 - bar_y1); } /* Draw the box around the entire event. Do this after drawing the colored bar so we don't have to worry about being 1 pixel out. */ gdk_draw_rectangle (drawable, style->black_gc, FALSE, item_x, item_y, MAX (item_w - 1, 0), item_h - 1); #if 0 /* Draw the horizontal bars above and beneath the event if it is currently being edited. */ if (day_view->editing_event_day == day && day_view->editing_event_num == event_num) { gdk_draw_rectangle (drawable, gc, TRUE, item_x, item_y - E_DAY_VIEW_BAR_HEIGHT, item_w, E_DAY_VIEW_BAR_HEIGHT); gdk_draw_rectangle (drawable, gc, TRUE, item_x, item_y + item_h, item_w, E_DAY_VIEW_BAR_HEIGHT); } #endif /* Draw the reminder & recurrence icons, if needed. */ num_icons = 0; draw_reminder_icon = FALSE; draw_recurrence_icon = FALSE; draw_timezone_icon = FALSE; draw_meeting_icon = FALSE; icon_x = item_x + E_DAY_VIEW_BAR_WIDTH + E_DAY_VIEW_ICON_X_PAD; icon_y = item_y + E_DAY_VIEW_EVENT_BORDER_HEIGHT + E_DAY_VIEW_ICON_Y_PAD; if (e_cal_component_has_alarms (comp)) { draw_reminder_icon = TRUE; num_icons++; } if (e_cal_component_has_recurrences (comp)) { draw_recurrence_icon = TRUE; num_icons++; } /* If the DTSTART or DTEND are in a different timezone to our current timezone, we display the timezone icon. */ if (event->different_timezone) { draw_timezone_icon = TRUE; num_icons++; } if (e_cal_component_has_organizer (comp)) { draw_meeting_icon = TRUE; num_icons++; } e_cal_component_get_categories_list (comp, &categories_list); for (elem = categories_list; elem; elem = elem->next) { char *category; GdkPixmap *pixmap = NULL; GdkBitmap *mask = NULL; category = (char *) elem->data; if (e_categories_config_get_icon_for (category, &pixmap, &mask)) num_icons++; } if (num_icons != 0) { if (item_h >= (E_DAY_VIEW_ICON_HEIGHT + E_DAY_VIEW_ICON_Y_PAD) * num_icons) { icon_x_inc = 0; icon_y_inc = E_DAY_VIEW_ICON_HEIGHT + E_DAY_VIEW_ICON_Y_PAD; } else { icon_x_inc = E_DAY_VIEW_ICON_WIDTH + E_DAY_VIEW_ICON_X_PAD; icon_y_inc = 0; } if (draw_reminder_icon) { max_icon_w = item_x + item_w - icon_x - E_DAY_VIEW_EVENT_BORDER_WIDTH; max_icon_h = item_y + item_h - icon_y - E_DAY_VIEW_EVENT_BORDER_HEIGHT; gdk_gc_set_clip_origin (gc, icon_x, icon_y); gdk_gc_set_clip_mask (gc, day_view->reminder_mask); gdk_draw_pixmap (drawable, gc, day_view->reminder_icon, 0, 0, icon_x, icon_y, MIN (E_DAY_VIEW_ICON_WIDTH, max_icon_w), MIN (E_DAY_VIEW_ICON_HEIGHT, max_icon_h)); icon_x += icon_x_inc; icon_y += icon_y_inc; } if (draw_recurrence_icon) { max_icon_w = item_x + item_w - icon_x - E_DAY_VIEW_EVENT_BORDER_WIDTH; max_icon_h = item_y + item_h - icon_y - E_DAY_VIEW_EVENT_BORDER_HEIGHT; gdk_gc_set_clip_origin (gc, icon_x, icon_y); gdk_gc_set_clip_mask (gc, day_view->recurrence_mask); gdk_draw_pixmap (drawable, gc, day_view->recurrence_icon, 0, 0, icon_x, icon_y, MIN (E_DAY_VIEW_ICON_WIDTH, max_icon_w), MIN (E_DAY_VIEW_ICON_HEIGHT, max_icon_h)); icon_x += icon_x_inc; icon_y += icon_y_inc; } if (draw_timezone_icon) { max_icon_w = item_x + item_w - icon_x - E_DAY_VIEW_EVENT_BORDER_WIDTH; max_icon_h = item_y + item_h - icon_y - E_DAY_VIEW_EVENT_BORDER_HEIGHT; gdk_gc_set_clip_origin (gc, icon_x, icon_y); gdk_gc_set_clip_mask (gc, day_view->timezone_mask); gdk_draw_pixmap (drawable, gc, day_view->timezone_icon, 0, 0, icon_x, icon_y, MIN (E_DAY_VIEW_ICON_WIDTH, max_icon_w), MIN (E_DAY_VIEW_ICON_HEIGHT, max_icon_h)); icon_x += icon_x_inc; icon_y += icon_y_inc; } if (draw_meeting_icon) { max_icon_w = item_x + item_w - icon_x - E_DAY_VIEW_EVENT_BORDER_WIDTH; max_icon_h = item_y + item_h - icon_y - E_DAY_VIEW_EVENT_BORDER_HEIGHT; gdk_gc_set_clip_origin (gc, icon_x, icon_y); gdk_gc_set_clip_mask (gc, day_view->meeting_mask); gdk_draw_pixmap (drawable, gc, day_view->meeting_icon, 0, 0, icon_x, icon_y, MIN (E_DAY_VIEW_ICON_WIDTH, max_icon_w), MIN (E_DAY_VIEW_ICON_HEIGHT, max_icon_h)); icon_x += icon_x_inc; icon_y += icon_y_inc; } /* draw categories icons */ for (elem = categories_list; elem; elem = elem->next) { char *category; GdkPixmap *pixmap = NULL; GdkBitmap *mask = NULL; category = (char *) elem->data; if (!e_categories_config_get_icon_for (category, &pixmap, &mask)) continue; max_icon_w = item_x + item_w - icon_x - E_DAY_VIEW_EVENT_BORDER_WIDTH; max_icon_h = item_y + item_h - icon_y - E_DAY_VIEW_EVENT_BORDER_HEIGHT; gdk_gc_set_clip_origin (gc, icon_x, icon_y); if (mask != NULL) gdk_gc_set_clip_mask (gc, mask); gdk_draw_pixmap (drawable, gc, pixmap, 0, 0, icon_x, icon_y, MIN (E_DAY_VIEW_ICON_WIDTH, max_icon_w), MIN (E_DAY_VIEW_ICON_HEIGHT, max_icon_h)); gdk_pixmap_unref (pixmap); if (mask != NULL) gdk_bitmap_unref (mask); icon_x += icon_x_inc; icon_y += icon_y_inc; } gdk_gc_set_clip_mask (gc, NULL); } /* free memory */ e_cal_component_free_categories_list (categories_list); g_object_unref (comp); } /* This is supposed to return the nearest item to the point and the distance. Since we are the only item we just return ourself and 0 for the distance. This is needed so that we get button/motion events. */ static double e_day_view_main_item_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item) { *actual_item = item; return 0.0; } static gint e_day_view_main_item_event (GnomeCanvasItem *item, GdkEvent *event) { EDayViewMainItem *dvtitem; dvtitem = E_DAY_VIEW_MAIN_ITEM (item); switch (event->type) { case GDK_BUTTON_PRESS: case GDK_BUTTON_RELEASE: case GDK_MOTION_NOTIFY: default: break; } return FALSE; } )&|BhndE\lToi4vS#S&.@ d]K5zbISQtr%L4̚yf]nzR:/}?p^Nb^:QXc'8+yJtzT uz3w Tot TByrKVh nHp"*\u~yT@90ঙI9T&}ȻQ!I0O]]d'U#DEC!:ix'D|R &"R(19,dۆvbtNy*{k(ԑ-h]O&9#x>~,|8`3rpM&,* 1&]`:yф5- K=R#Y^uvY7Dbl%? 7pX#8KYx*O놽~F>_ ̀Y)@/O[#l˗^ ]F Iw4$y@ES_ /TzV8cmL?`xZw '+1w7sp_Znnn.7w@zA3[FNߡEW|xگ`~rSe@|cwvPiYKc'Ϻg?!H+|?*c;Կ!a,#KĎx糾ޯZ- upZױ^-Z?QxgxPNV[덕2d!;z6El8evv$<,Φ%E|]ߐl/sԨ_ܾ(LFW[GOOK#ſв&@4v!ƽt4B'rf%!ա ?(ýڸw *׊/_QBdܭyem[.ſI9eki婌 ?B='V"n/ߡw9W__e%tv[ݦb#x0蔉8?c'pU]'V+kߢw8hΟW?K ]mH?!O M> $H[F~/KھZ=ԇG.`qk(C4k(Ɖl ̳'WeY#yN)AdF89Mp<uA;ԯ8nCuO@1(n .;tдqHT,8BR 1dQ{Ȼ$Kg7ž  !XH е-2"$%yJ^`'%0!agXF<ͣG! !PCr#p5lrDZQ5XFGϮKן* n|Yu|3θ;~8a9GH~ߵ]쀞@i fk$}Kh9X(;_=Jոx5.lT7Z6{vS3шAAB,|F=8Z9rosmW1CDWg[AOJ',Rh(YPB tlL=p!%Ξq p\\\ dH1 oPGF$2&Wa] ֖ˡzl<{nD`F7T]& $^`YZm2Y :nyPVE?"T!_*;%qAεcO#2W˒]RQ KxK)GgLWB0!Q ,Æ6t x.2p848^yICBJdG'+ī}L~9&;k tr[.BpW~0¶Q%O%wm;M?UNϥ9dxtb0FFV^?}XxID8y)3l<;!1[_9G$ߥovhuK Z#+1%ż eE$Fs9y:ǹs;O=;4(ߓ$8cH@{MBrxU\A{$izXadW`! .rCkdDt?AUhqdi ya}HNpLH>7yr ]Z#-,,Cp[xǢoQ/[],%dWLx}Unq=|Z_-!?+x_o-GBo6U0M'·.R7)z_JO톽0"Lȱ Q&%:_$pD{$Q0VͩOew*8q8^lm 8힣W[wZߧ"ȹؙzк.-S^œ,SkL4܁ ȟ~TMrN˃ԤA{bUIfdTY(CF6 K>{vհ㶌gǜo[jvmsKm(YIt*M5+f:L wDønC;?uNw;{;'n'λ pTyw!39'zY|vs~t|~v_Y7:+Ƭ}Sgp~[wO)wG;g{{x/[w| ǢxhXv?vr?Pn TҤB1h +C߶O(y#*bZheL"FE@(hK>B`}.'#}wʻLgsE+s\0g\~$G9?q\,%݆#K~\X2b?R(CNQLUh?֚Jg5*uX[ӽ=csHRWZĖxƒڇETfH N/DӧddjI*]YRۆSLmDFDLڽ@5>Y/F>/J)z |_s, U5E$hCֳgߏ|tp<J!>B!t1T> Җ8ꮲ#n)OA=L_αꍜM=TY>) ?g ,UظG.i֒& ؿ*\7)}t5PC+emH#+#+Bm5XLYstm X;ڡ278ݤ+!Q:P};f)3_j]bm"xzuai˱ۻn Xm |8ѣ:׬5V2Bh ^ǕhV8 _[JwauB)^?#@w2V+e׿vxy tjV_W_W_W_ gEem5WV_Yo[!'XoK4Z ڊp_? BhKb#YtӤUpaJܞO57k"9EEylBRU3XGZZkW?+ϥ YU7}^om4֭fZ_vlW֟$<g꺹uX׫sZs:MG\ZZkIj," Y¨ok)񗚬lٶ`=$r:A/K VVyW/Ȇ9ޥf໩"@2VeKTBt)jcqSFو}?r}P]:pCgB~9|sxġc^/d Q5]GGǯ_&k9?:FjL򳨥?w=Y2>&ľF5kVH3[ Xh!'mT)|0(v+sR4a7[fYjL]}/e Vh5ZSP;b>П)H؇ 0eA٬M1#y~?(b|.-SȇS!ZBQܱ'Zf[YH*ź'˶Q_ǑjR 6R[S7nE2 Ҭ5(ną^$4+!hBlP,)~6 y*7RfTY| Py/z!{lJbo)!h 9*9sȬlKf:zy{zvjZa)=?h.h>w]3\hbMr FQ˹ˎ=wq/cwsk)AƖK=Ii) "DT2|O$;LJhEtqt-߾;BUH]v:!'$.("bY+~Dk%kk,Jo E);UP ֿBڒI)cѫ9G0w5@Uz%{,_DZٮ8Q jXn5ugA\r<|[u#atщ6bj3/FF =)Om$`(FXj̞\&Z$Q:: t˲*AV׿tТHc@VL&#֤Jq]sw3ޟIn5H)굤Ȥxlk4h<\Q@2>aTdrB6B?ߌ6!4?gW?G6fs]Bx77+eDm2G#4kQnf&C S"d1D$O5Qy5s>fdErr|s4<̌P |_i?gs% GcjlnFU~ײj1WHaZhDYٝ94ıP}Msэ Ŋa7D|'G\sVmu ds oxݓGjH~}8S=&q(0*Q]gh]@\WBE2@UʱA6"p%vɉ@[U.ٴ$a0O!-n";r˜=wo?n= "t̶JKKbC閇 |'w2u:wzm$JGx$~CA\:XyZa)ӟO9s<;fn4W~<$>4䢱\siu`If#kޒ`"’F-#tD\$tLR)]p'KYL#. wN@\)v(Q~ݑzV0"Sb'n:a>c*Roc( w=45]Pw kZuľ9Ć;!Nrw?\dUR.|YF6k덕ذq.BkOQwI<%@ұZpN Fl"A-'g_)ᥝy_yd˿.:;>J=xG vl3@_(t/yÃ?'hV?K2ܭkjo[=HK뢺ޮ7Uvkjfӽ֧^a^RHwGw'J&~ 70@E`|Bet9< ?ja&ݷ6nc5kjNݶji£[os_/# pi"*I 9d2Yڀ -d?bxZZsu[F /!ɛ f2w Q] p2tG{+H Ay <2liSzˎ]M)Jt^¡?uѵ+BL,cʁO'lx9׫+?:} W=PAP?~`/ _Weϼ5k+?ss/ :j#y^nn0KBwN+D6K]j+K M=1 zժZMǶ7}c6jl6U'oy2#_w@) _F@,HjˬTlObٮ7[vE(w'DSTZ]cfCzkYVx=XDygRDEfxkS.7Iʼ6e3`c PJPADCbBichQqVZ" {׊קYm^H m6cB9{{(MV/H+{ٵ.^xWNorgllxrq#޶^(^_%QoU/dq_&N[k'\MdVj́TPR`a$k u(kk|)rdvƙv|I1,tG~QaP_TSUE3/ nw~[b1X&I!u Q@ELmTE(af36W~N`d<l~X0U` [Bf x!7{gg?8,y.~.D:'DxbLfkuqҙcڵūY+57S.ɰj^ qwgp aE=Fz"nX S=?SR@qGNfL|nmy^&^[>0O=5`h]Ƅvu38h6vcѬoy\wK*K0~Lejg)S 4IOkKxNYQ)Rav&K QUΆ\NJġu4nkfe7N;3qfy A'~Ǯߟ߼;??NeͥѻC-9N9pk!1*]`gU4pjN7r ,!nuONώ?r4Z8svTFxӓFc&swm >Q蘢HԪZCwf58]]k  {0)فܶOd(Xl!ݽz"oHQ}pv^{Gg2_(d|q ?v?X4>]Ih$oNl!M &vWaI@uv$">|X>J9| l!< uoNzG'XLP'fzi=f^:k#9ϣiSt[*zl=:6:Ôb:-D]h2p3GCfk7<w>'٬V@d#p!YI{lN3 ))R![OQ'RdzcýB4CQ p7|-R>'RFIwgEa[`R;Bjnb(r'@ s8HE3uEÌGR=kl +Fi" pe)uzc2cw덕e4{צ)Uu3M\'^\f ͦ8=S}?iZcDa._;i9fJ#;4nd8ie2VgUw}3ʹyDX؎?NGB6Tndؗ.3*/%+rhc;?K\H_[_Y606 tm4{ Ǯ6NǘpkxaXYFxG[=m_.XUe2{&0fIB\^ϿBƻ 9ʽዒ|8oi %QQߋ0GTDIk&-XA]=N|;L=CQKyy6a#\g?'#E`Υ܈>퓚Z͓]׉ Cp%FRn>ʆHtN9aO''oJ򚟿^`]>Hzφn{CϹ5\E:!yg1Fw0h gk{ofk?/#$_ߛix< 7BӅ߇[[c?5WK q37Bgi8m3grfCvҌ4/\.g]I+Ub֑li'zj<_B-r.gFϱ JYͨ}?4w&<07Wu}ey4ކm;^lmc:z!g*dXw,2Bw9oZ_-#.QOT@AG':DWs]7YzANmgn`˗lu>_ snw#r!O gǨn$KthlM|xg`>xRx? DyĦ4bwPɨuYz[A=XXx~+M1qhcL=4sV CLguʹ0<_W]Fȼc6jr!ls?z,!{gZpoTJ)!`L3=}4Fc^ ;&a:f$5h"eء1[a =>T<ҏ*yVC.?Ξ, ?ƣ?>+eWc"bfkntmfQm6뵪ݫ{Iƒ]yHXf:Uk?.D^.[nٮ0&PRM6&z-PJnro;hMm$LċDZmBx]PwG@PfgU4s/ ,'ǝu͑1,r.#MC3b. m4+r$k\K% HE,N"9^{-sH#7܂{:{;];ty7'݌p^,=spb8\?]5/S[,% n>sjRA(#Nڭ%[R+8pKtN6Oτ3D7M{O#iRk(ḳEt६#5n#Bc>(t{RX v@/:,8tFMfqey{\BXVpSґEIJ& i~jrell`|E/3_Qٌ T Z?YG :WZ8rMs[?>_Fu]4wMU̫݅p Y.., Üghy GY =zcE-#*v/qXQ 0Dp5t!BO᛼9kwF](AXVB_6"#zmɊz+Տƶ =W+ȪWLZ>L\' l>/XK <(!O+>VzY(ϷClXp%PB/ _yo">-IӨ`pzn !J^lޮ}brNiz řuPK/Ј\9+z'yr}Y@{#p )-yИ R~te mCSDV~ x99"rq9z'ސ8vG-\BG@&&:=t0 :Y GHj A KJ/XK.BሒƢ.HZS^GaJ7"]%Q`@jwgb (>:rǓ^S <qwl??4D?;t޳m3+n۩=3Τ]b7#4Fؤ;|{%$nw;cwwoz}Ws~Wޠ]b 0I-lA􄈅el9n g pc1%p̘v7iHXLށIR8܀YwMKS WEdzUq|r$.(%ܚBg<-_A ow`~٦n]\I4eBZMfAZkATP =';o1u}z"3"Vۻ/a,σ=uJWBo5TpJ89t\lآ0=]厶)ݍ\ Z x(|f>EhKnYEU*b47ڔ 59ł؞.8˗x{-7c[X7ℕFNtPT*1ۨ0+(8#'f7- +_7)jTtf`a4@n/h-0i V8֋LAOB%zDy^8<lj T]r|rB?FFNW YSJ5L`;>{4Og0&bN=5h 3K]7|ۡ"7vHqL%k_NG;ubmBZ.nBpcU ={ˍX㩆c~J 0zfKW. v'Ya`BJLo$֊ŭIinAìTdRW/R H긅` LɸΨ70&Xx,P_MoQPO`#kAG>S@u0գ'hQ mgF%򼐖=3ƴ(ňHKf@uںA\Da3w\+4_b@/+Vbs+U@I9fF"!Apl'z{ *Ǖd TXM"ɎwLF0ěmLziQGaŬב\7#i̠46b8}*= Xom:Sƀ4I9X8v`Å֭IPfbP$G%=Y߹_D7kM"W_l+ ]@Sqhly"#}ًN )J@+au55~j'QZ{H" Z_;u jKQc1`QO|)C߉NOB 48;0Nb4w˯4V# U|bS%;RvĊ.< *ic3(4ISϩ B %<3Mb 'վ&S܄ iH\8<=UI5 du%B88 t#3N%Q0D R(t*@?훦 L\/ @/:E̐G|q&1:5vgED"C ao3)jۉOa i,y.zujm'&}HކM c'#QQ*@K 7\zS#]cL! ;'*`R7Jͭݟ8sXM(! wDj9w&| A:o4CLR vG||h&}x=-"BgA/f/%lgIb$*(J-::0JkY~']3kߵ-|u^oa?߾mwUwc)`nAn[LFbvMق]g 7~εo_eTxHQ5FƋƱh6b 8> å?p0Eyf4ʇ[HcjGp1RL")ow*U{IJLpP5{h!*8(~W".^tX7>n@,<>`ݟ*xOF2\󱵿 #WJ~oA7{( 'GGՓF-8(}@Ƌ ݕ sޙ/j UPT8×iu4GKɭx @_aSu%ِQ(<(87 tu9^{ ^*c;izIMLC˾>ZR{a3gВ'+IM܅[K3DQXXT}?b{xb>pkGMtegU߹r)]|(5d LkBBOFEO7A'O;/ǣn>I䊜|ҝJ0F=9?qRYqDFE/@&w/?uZX}ӱt*AT ,Cc'#}]KK;bF8Q/`aJÞIvn9nJ%5DR7Od5|zpDC.1KD KTt31KFEs LT)72Jl=YK9.my6^U?xM-buq+p4c|bYX2_#9`.v$.ȥ:Bot(Z=fA6.JU:ńh}]?v&%REIKP.˲|:jS^H\^~7eMXzۋs]b|K v~F} n[wT:((2z.Y>7J<$iXABY* @Ky:{[Q@v%=1/( Uґɡϳ!zP"B%]u1CZhd_/8?Xa6!^P>Qhx+YpsޤZ8e9œ0}aޅsy7o+ ϩ9[K)T"{b{ J+W\9F.}ωb|= >m%/nsRl² foaY~P5mb- p` z^  ]BїSo*5} aKk\ r,z6ve<Ԥ~baIJWYLSdڷ6|YKs8BnAH"{oofvWHH콍acfjGruo  g|E1Zw:bfjuuM{$= zW?a}X*+QdAX27HD$y-Z(7E(\>NޓuU\"DBGI}G<#6W+]$! /TSZ\VcT5JZ3^|=w<]-)?*rgem'G7>k>a:SdH*n! 5+Z}U+-<ʋz7B'4Ea~sd c\KE#6#+q#BhY%q("HQ w2c_ir6w6yܡŦV ONRQ Ff,D$wN'bxrlJQX-n]G-A*ְ/ß{VBńHLɈgZnJN?x,|`V w_:M޾AÇ.ON(^AIV0xDǀE)~+L5;zO*7&2D1@wf3 iYw,O5qnn;3͓W@.*k!:.ClŃ)$>F#Sد0H[d e~806&sPzXt7-#wi+p_O8!Эuҫ?r{R-Or_mwM&nx H˵b\,TAšJd@)Iy*GcAY3m0vhL" 7"E&{C8_Z}B!Y[^neoxQ;|WW٬VUJU8+ gZv(o7Ug)r>3GJZ!+r*`\EKUse5xLX8cL4=1I!1>G 84 ltA^ M44,;GѤZvpx0͙ h4߶;-X~A-Gɜ1w.k2<^945Z 3-tف0>ĕVt/Wy=@| ."|s Kt*ԋFgxA2V>KF:ޟ68}8]k{%${i;W \-`(:X%`uta'7͙vmXd2 g0$ '#0nḺ'iN-h#stB"AAGQ{"/@1w$ D]eG߽έ "l'<z!~"sZhZ.܍;;x~;K@ɕ\z@dh M5sڒ qX$ 8^] Q ".<εi?\"mM6빛pi/c(} Xw(|s^̼|@ׯ9U8?S e)Mh,ALQUWڱ}z+v$Z|z@+=@  *%7gOQŊJ՗zV{#I7gR 0'c`O,szh\=ܛ{K-_ќ ǿ]MȬF4U] jh4z VH[nt(PtY|TQ ?"vȚ޵o|ifQ*ywn&h8b4ݩM n}m;1E ^e≠-4q81QYPs|R¯ЮTl K4ݳkW\m.ƦC3d!K$xCmǷ@of3Ssі-giP!k/K`@le›px[]"P:I$p`#L!@]@oX:|ͲABWw%c 4dt >x@(l*@6C, /[6&|3,jl(x)YD>8U?En}1'T ^b%DIvMh?K9ff"!,fY&c=W0rb\j `ln˾>fg"R˱ (4)Kk ˒Ϋτ>RM#ø>Eχ1CL$q8qcl>34x3A opBî]4cU煦Xw;vAYST$ X(͓Q0!^47V }W%;Ϟ(*.%^*"yfLG>#R"d{&RA%1s.&{ƚŰ?h Z/Y"q!h6뿽:;;oaQf>O̡xɽ}P:j .5L6p]av1i肹;@DVTD$,77Oax< ~M`woMcl:o?:ؽL3{,ybD2ݟ7 6PeDy,tٸ6QH=B.u $Z4K$9h|Lo'2#9AecV`-\%"UUP:̨u5x=ϱgش w'ex2ƇnL0|1܅1=چw~pN4tZ@7ƩC' 8u*廿3: B )'*&r2ߕ+n$rMa@*a`3uj #{kX4yiж8C2Y_L<$^K39 "F 2ah~$dH$D*ž}0#U'g*$6ڏ/TQ@ ˿]׏y><kT36 C駋j"JJ@ Vy&([PiU9  [`V atE%A2I%2-\cn^]U7|4`f9;{0QCm9FCل2!G~AiZ:>JZ HRF$r(]hZu,z&%t ;P&*v(C-xcx]4 j^z`xngMh1 YCEi XT75NW?56:y. 3)"ޱPH=.ha/YDW{U*xBa(rGF߰a:> ʟpV_XNng!:?I#" t҈KmD_Ji6rC Ǟ›-N}bm´~`})=wڸ߯_7Y̚Y;IHN` 6$M;߿{%y!M)mStҕtMWKy$՛ eQ!"7?C$2b@τhgLrx-"а\~8c\R2D&ٓDU'dSMOe)M '\3q) ױAxVӗDA668O + `Soܡ]Z pC{,LG[.XТ y %Alz@@v@u LXP!WWkxh&aX#.^ڬTj _<<8(AZQ0,FXΥבWU=8QuS{yzΒ o)ݔMX{~):AUD[[-yL,` V>;|C9*jݩx(w0Chz0uXS~wi6ZACNo-TJ%sNu YF"Npl^舜1n*aI$)v@(L)SVM9fKa*i"kFa7 WCHK g$IpIIR):R9DI}Ep$nvhbYGӋ+xq$ba?x:Ҙ‡B1+|Ɨe|vꅓ[\Hf$jc;. (rxWy ,n^R4<qS8-G΃.y`Ӳ,46[ 8YsX(Pgp3U+EygJ3.@;2^0U%uC<˿޶PoaVUcur_-WW_7cQUS[5R$J^٩dK hy:NMiWXIsD8\p\ |{fR'!:d#?_#뭩 ;d^Dt*2N'2T =wb. 7f Z ֆj{,PC LE;cu칍PFz+TxFNt-J!}vs%I)Bɷɕn& Й\,u"J5S-z[tP̟~CBTA}x&}O?PmNTtDir: qc/6zW`E)eyg|ķ}\pW*;~͖vrѐa}Wז}s39pbO`V/COÄ ho #P >G#څa3Tek͆"۵N-9]5b8pyvF) O"|.qR!FY*/klk4v6$z7-3s@B.Q܀URG3.T%%psR1YNCev7 \}f!PGu+b+VQ+EԊ jQ+#jZ Q#jA_?5oM}F=U,{ S]*?XnyJU]F9@ڽXQI`5|(@铄1=`Gq`dut[mf Q3<C*!lFJpxU.g;AʵLu'ٮ5$Z4r2{udR-<K>79=y8|s>}s>{@4  %f,q,z}i7ჱOt!Բ.y0xsCv@f|MT5_e+<݄%ُ;D/"#xxyK̖(5$xZ6)ej_p>!6 afAzϲs1,oaǩO= E(F=l+6AYH9|!% $}t[0ۍf(ǏZ?^/L7ȇ;¢O, UwП$^% wBUbthv~)FHӲ{! z:~~wyH[NX~/["_q_JXVp(/ZF×7‹UaOX~X?XWUbe/#<%M"joU?޸KOɟ =O [sGKh5 n_5(to^R)SzHƶ~>khu_&J+JSNMTÄ<\R2y=Vwr5ް.K/}::4@eFk{{{/P<:,»5\$ۇTaT'9vo(m|OJIʊ[Fh#Sy~;Zt>,x?HTjyeDжdJ*1dԁpɍPCH5 }D~WZWֿzi>͙(eaXPJ_ A PUa WʟܮSf4 8VJwTɞE?Ɔ(f2AƊQS-62Y=S @S'9&JXeۃt wt 67]YYhϗ89_  )>wI8tTtO[{G~3h)]KCŧ_U{{A#.EnnbIl}=ɜHӧY^iCDWuΐ:񧧆Ҥϯ@ 1b23P/3،7.4ڜ+0me ro1q?zrOky(乗<#4p:i m{1N_[~h!Z:?j_eHk]+384ެgEp-1\iN ~bs˛dEk4]]{w6[J^HIVn:N컉6=: I)G'}gEa;{939(i(QZS+A8ԲSn9q/+[CiFLHډ~{B]٘Gy,*]q,/ʧcpA"KU%--;?JF[XqU0vy` Eb5 S(ߐ~*cg-bSfMWo bY)s[A>y"F BJtdأgoJScdSEuChs* pDM(B낌=3=ɕ{z#B6rkrʧgذژ]\XRB#W38mSPҏo_vj}AEA$HVǸAOȯ` wx{pc12wmu8f56Ӵm4CC%ˎ vf=Z pӑFB_Wn5sw9&1_}n^ l5*ܳ;Ԋ4mY'5]%h+žr"*ALIؘ 'w15!+Bn\[MW7v*B {~cvQ[ou{cwHYs:Wn)m>mo#<7W6r0i#Ii`%9e^7 3PԥAW1Mk'|k=uڦr> d,lQ%zB&Tw |Wo)^ns \&<Uc;VX9sc6zzUK^MgXrݻkE`Z.+2num3CLu<ZzjKkJ{`OCVY=F=]Dc>#G?xwVESUvag%?+=~Uqoop ]}rG4 ndnbwzVD`_nc~[ q3?=XXQٱ /DU|˛Bjr,жBvђdwAzLR(͕G%A>ف4&M΂Os%o}K~`?s/,4 Y8ߍ%1"N(RC1k}L󔚤9# xA.Cws'r) '/F8#iQ,ד-\ }Kyh4 l"Q ip%+)2, 22u"UΈۖԞU? }C*4 䙹 FaNdyO4=kaF'p $=YF+hz`a&fHOϰ{_pXs:=@A<|*l[[ nfgF =wE\ D}`á~wE#;"d̲#d?$2/cr~aߐʤpɏYкSqѩm}ƬZ{Ϸ'K ʏ( o&ׂ~9D1~|ДOqEN߾z:^:x ؖ}"}}FTK4ZFfzNId ëQ Hƙp?ytTf';Vz5m?y("Rx"4tW!$Csa-ѹY`Ei٦qv~277طb JBo^kzv:IM~h4*?cYY(E }:|iE9n6{nqڊݭ@O^3@[ _"bxdpcǍ8B(eBKRrF&NƤC.!ýmI(@[|#j1GjٜIa}">v?,D^FdIӃ?/ֵߥxt __bwV:0Я5-#w*RW=1oi `X|׺MwK-%`O;6!ZǶN+#׌ ]q$w̾ۨ5в ? ,<ޅE ,-긃׍6½oo%EߙIj&k8 zS뢉;8|}#c~&*8?u7o>x!I =2r}T+yL䃡,CZ}r:8xjxqpǓ^{fCH!\.HtǛ "#-ғŭ,tni1 (XkǭFosb$5$G^~c'Qn@eQH)V[&x%l3+l{ǍCς=628N@OoN %2"vsZ@"!cYI>jƒOy>nj==w4Ãv12.,|*R+慢ipUOz.tol9Zy~ά'ѻ$_ؑ5ɱ)T D})0Aa(ȩ[?A46ʭ'>}?l5;vhkcm`̻ppoL'4ZXzkgr-I=L3~Q Jpmk mMO5Σs)0 r)3$20˓ÍڴXX%G`!^M?fфsy/?T ̍8GC/2votւ`yR@'ZRI#V#qO-ZCbHZI :ε)gemn٭u mnO"J*T=i { J,d&HdrEag:9=g8>#q$Veca TiJe溲^$(&_oefgS^'5&8}x8A;F'T,,s_:G2515Sֹk3EыvQJHY?ohm`Yn)h7lOm;5;k 8>-J/;0 fh|1餳ICp5tyH+{rI‰ڤ6"Y,P\%E_CiФH*2E;UcOFhfj"~YIZaE0IB?KƔw p$)_5lװqu@|)0f)Z =En|ڂ/=>kZM~XS斊^sAX8MY04Ȣ$DYy>^>/H_8H#{:xH4cP<4kAp9ICϵ '#4hM[ BNNW@9J`2ɟDEPcRZ",{8Kdy)Ly +a02Lya먱C]0vr~Y|訒i0+'6z7zy=}Ⱥh&~UdUsO_VͳիF!㑆+ K Uy.a1e= ^"7,((.:k&Q뚋n{%oJ%bK*Zaxr6D[RLzvN ˪I *U18%&2|~t Bm+o_}Vw!)-'[:H|C5CʸL k 4FmYVPy O/ϭ@;8q" @+#>Fd =E'se"2U\8vX-611,FWڡo楏^U@JR`ƭPd-8m-wrȈr30LhT4;݆QoqoO֕,f#6?H' 7;F_G׃˓ʰIvcg#0Ѳ9pY-7|<KqM.?cvÌ^䥟cD^ 7奟{H2O8~Ky駘|Njx⥟Mq꥟JO~‰3(It饟0b/OX~c^8O)/43TOs嘗~OOE~*~y/􅬗>'_ Rs!i5??<7' lֱf @Ekn 6A2Oizso guRYΣ~V*.4gR{* $zܜH-:hwcQݺufVLͣJm$HGQtE..1y<ֻ 24BL<7gy>{y=(m.q!(W^")0L1ImQfjnžozop+&N'>pqe $ R ڂ9]/ oZ9"D9ƮC7:[T pr&kߡI mK '(~d%zd>2Q6<ϷVD' &oޚص9mAלO-=gYb&{.Cj"ӓ[݅l1@BQq]U(NÑ}šȁlhXβBG~џO-+Xӷ<ץF}MG[CKU㮝δ?֋jU 6IHEov< xdE)iRP.KQ7ԺϱT.֐9,cc)5ȳ.%/5K[*GVc\K1_Vc'b)ϑI\$;^L\yeYˉI<4,Va 5ɠ*5&fu1_y>>\r: و@g`-3Z4d P}fkPg|<^yI dSQr *:/$~ ҢNͨiJ8`;Q%vF`LP-@H%S0^$=]t‹eHհDc.h4vv}uD@⠻|Ɍ_<7\Sӯ$ꮇ b@K߳m^0 ˜-:B{Ku(T!vίw i^ 퐴6*{Z}TcAI n,ό x"f[3u6Dσd7x3 ?G"~-{2 ()`{$9ňH