routino-3.4.3/ 40755 233 144 0 15003125373 6353 5routino-3.4.3/src/ 40755 233 144 0 15003125373 7142 5routino-3.4.3/src/planetsplitter.c 644 233 144 55767 14774247216 12457 0/*************************************** OSM planet file splitter. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2017, 2023, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include "version.h" #include "types.h" #include "ways.h" #include "typesx.h" #include "nodesx.h" #include "segmentsx.h" #include "waysx.h" #include "relationsx.h" #include "superx.h" #include "prunex.h" #include "files.h" #include "logging.h" #include "errorlogx.h" #include "functions.h" #include "osmparser.h" #include "tagging.h" #include "uncompress.h" /* Global variables */ /*+ The name of the temporary directory. +*/ char *option_tmpdirname=NULL; /*+ The amount of RAM to use for filesorting. +*/ ssize_t option_filesort_ramsize=0; /*+ The number of threads to use for filesorting. +*/ int option_filesort_threads=1; /* Local functions */ static void print_usage(int detail,const char *argerr,const char *err); /*++++++++++++++++++++++++++++++++++++++ The main program for the planetsplitter. ++++++++++++++++++++++++++++++++++++++*/ int main(int argc,char** argv) { NodesX *OSMNodes; SegmentsX *OSMSegments,*SuperSegments=NULL,*MergedSegments=NULL; WaysX *OSMWays; RelationsX *OSMRelations; int iteration=0,quit=0; int max_iterations=5; char *dirname=NULL,*prefix=NULL,*tagging=NULL,*errorlog=NULL; int option_parse_only=0,option_process_only=0; int option_append=0,option_keep=0,option_changes=0; int option_filenames=0; int option_prune_isolated=500,option_prune_short=5,option_prune_straight=3; int arg; printf_program_start(); /* Parse the command line arguments */ for(arg=1;arg1024*1024) print_usage(0,NULL,"Sorting RAM size '--sort-ram-size=...' must be positive and in MB."); else if(option_filesort_ramsize==0) { #if SLIM option_filesort_ramsize=256*1024*1024; #else option_filesort_ramsize=1024*1024*1024; #endif } else option_filesort_ramsize*=1024*1024; #if defined(USE_PTHREADS) && USE_PTHREADS if(option_filesort_threads<1 || option_filesort_threads>32) print_usage(0,NULL,"Sorting threads '--sort-threads=...' must be small positive integer."); #endif if(!option_tmpdirname) { if(!dirname) option_tmpdirname="."; else option_tmpdirname=dirname; } if(!option_process_only) { if(tagging) { if(!ExistsFile(tagging)) { fprintf(stderr,"Error: The '--tagging' option specifies a file '%s' that does not exist.\n",tagging); exit(EXIT_FAILURE); } } else { tagging=FileName(dirname,prefix,"tagging.xml"); if(!ExistsFile(tagging)) { char *defaulttagging=FileName(ROUTINO_DATADIR,NULL,"tagging.xml"); if(!ExistsFile(defaulttagging)) { fprintf(stderr,"Error: The '--tagging' option was not used and the files '%s' and '%s' do not exist.\n",tagging,defaulttagging); exit(EXIT_FAILURE); } free(tagging); tagging=defaulttagging; } } if(ParseXMLTaggingRules(tagging)) { fprintf(stderr,"Error: Cannot read the tagging rules in the file '%s'.\n",tagging); exit(EXIT_FAILURE); } } /* Create new node, segment, way and relation variables */ OSMNodes=NewNodeList(option_append||option_changes,option_process_only); OSMWays=NewWayList(option_append||option_changes,option_process_only); OSMRelations=NewRelationList(option_append||option_changes,option_process_only); /* Create the error log file */ if(errorlog) open_errorlog(FileName(dirname,prefix,errorlog),option_append||option_changes||option_process_only,option_keep); /* Parse the file */ if(!option_process_only) { for(arg=1;arg9?"=":""); fflush(stdout); if(iteration==0) { /* Select the super-nodes */ ChooseSuperNodes(OSMNodes,OSMSegments,OSMWays); /* Select the super-segments */ SuperSegments=CreateSuperSegments(OSMNodes,OSMSegments,OSMWays); nsuper=OSMSegments->number; } else { SegmentsX *SuperSegments2; /* Index the super-segments */ IndexSegments(SuperSegments,OSMNodes,OSMWays); /* Select the super-nodes */ ChooseSuperNodes(OSMNodes,SuperSegments,OSMWays); /* Select the super-segments */ SuperSegments2=CreateSuperSegments(OSMNodes,SuperSegments,OSMWays); nsuper=SuperSegments->number; FreeSegmentList(SuperSegments); SuperSegments=SuperSegments2; } /* Sort the super-segments and remove duplicates */ DeduplicateSuperSegments(SuperSegments,OSMWays); /* Check for end condition */ if(SuperSegments->number==nsuper) quit=1; iteration++; if(iteration>max_iterations) quit=1; } while(!quit); /* Combine the super-segments */ printf("\nCombine Segments and Super-Segments\n===================================\n\n"); fflush(stdout); /* Merge the super-segments */ MergedSegments=MergeSuperSegments(OSMSegments,SuperSegments); FreeSegmentList(OSMSegments); FreeSegmentList(SuperSegments); OSMSegments=MergedSegments; /* Cross reference the nodes and segments */ printf("\nCross-Reference Nodes and Segments\n==================================\n\n"); fflush(stdout); /* Sort the nodes and segments geographically */ SortNodeListGeographically(OSMNodes); SortSegmentListGeographically(OSMSegments,OSMNodes); /* Re-index the segments */ IndexSegments(OSMSegments,OSMNodes,OSMWays); /* Sort the turn relations geographically */ SortTurnRelationListGeographically(OSMRelations,OSMNodes,OSMSegments,1); /* Output the results */ printf("\nWrite Out Database Files\n========================\n\n"); fflush(stdout); /* Write out the nodes */ SaveNodeList(OSMNodes,FileName(dirname,prefix,"nodes.mem"),OSMSegments); /* Write out the segments */ SaveSegmentList(OSMSegments,FileName(dirname,prefix,"segments.mem")); /* Write out the ways */ SaveWayList(OSMWays,FileName(dirname,prefix,"ways.mem")); /* Write out the relations */ SaveRelationList(OSMRelations,FileName(dirname,prefix,"relations.mem")); /* Free the memory (delete the temporary files) */ FreeSegmentList(OSMSegments); /* Close the error log file and process the data */ if(errorlog) { close_errorlog(); if(option_keep) { ErrorLogsX *OSMErrorLogs; printf("\nCreate Error Log\n================\n\n"); fflush(stdout); OSMErrorLogs=NewErrorLogList(); ProcessErrorLogs(OSMErrorLogs,OSMNodes,OSMWays,OSMRelations); SortErrorLogsGeographically(OSMErrorLogs); SaveErrorLogs(OSMErrorLogs,FileName(dirname,prefix,"errorlogs.mem")); FreeErrorLogList(OSMErrorLogs); } } /* Free the memory (delete the temporary files) */ FreeNodeList(OSMNodes,0); FreeWayList(OSMWays,0); FreeRelationList(OSMRelations,0); printf("\n"); fflush(stdout); printf_program_end(); exit(EXIT_SUCCESS); } /*++++++++++++++++++++++++++++++++++++++ Print out the usage information. int detail The level of detail to use: -1 = just version number, 0 = low detail, 1 = full details. const char *argerr The argument that gave the error (if there is one). const char *err Other error message (if there is one). ++++++++++++++++++++++++++++++++++++++*/ static void print_usage(int detail,const char *argerr,const char *err) { if(detail<0) { fprintf(stderr, "Routino version " ROUTINO_VERSION " " ROUTINO_URL ".\n" ); } if(detail>=0) { fprintf(stderr, "Usage: planetsplitter [--version]\n" " [--help]\n" " [--dir=] [--prefix=]\n" #if defined(USE_PTHREADS) && USE_PTHREADS " [--sort-ram-size=] [--sort-threads=]\n" #else " [--sort-ram-size=]\n" #endif " [--tmpdir=]\n" " [--tagging=]\n" " [--loggable] [--logtime] [--logmemory]\n" " [--errorlog[=]]\n" " [--parse-only | --process-only]\n" " [--append] [--keep] [--changes]\n" " [--max-iterations=]\n" " [--prune-none]\n" " [--prune-isolated=]\n" " [--prune-short=]\n" " [--prune-straight=]\n" " [ ... | ...\n" " | ...\n" " | ... | ..." #if defined(USE_BZIP2) && USE_BZIP2 "\n | ..." #endif #if defined(USE_GZIP) && USE_GZIP "\n | ..." #endif #if defined(USE_XZ) && USE_XZ "\n | ..." #endif "]\n"); if(argerr) fprintf(stderr, "\n" "Error with command line parameter: %s\n",argerr); if(err) fprintf(stderr, "\n" "Error: %s\n",err); } if(detail==1) fprintf(stderr, "\n" "--version Print the version of Routino.\n" "\n" "--help Prints this information.\n" "\n" "--dir= The directory containing the routing database.\n" "--prefix= The filename prefix for the routing database.\n" "\n" "--sort-ram-size= The amount of RAM (in MB) to use for data sorting\n" #if SLIM " (defaults to 256MB otherwise.)\n" #else " (defaults to 1024MB otherwise.)\n" #endif #if defined(USE_PTHREADS) && USE_PTHREADS "--sort-threads= The number of threads to use for data sorting.\n" #endif "\n" "--tmpdir= The directory name for temporary files.\n" " (defaults to the '--dir' option directory.)\n" "\n" "--tagging= The name of the XML file containing the tagging rules\n" " (defaults to 'tagging.xml' with '--dir' and\n" " '--prefix' options or the file installed in\n" " '" ROUTINO_DATADIR "').\n" "\n" "--loggable Print progress messages suitable for logging to file.\n" "--logtime Print the elapsed time for each processing step.\n" "--logmemory Print the max allocated/mapped memory for each step.\n" "--errorlog[=] Log parsing errors to 'error.log' or the given name\n" " (the '--dir' and '--prefix' options are applied).\n" "\n" "--parse-only Parse the OSM/OSC file(s) and store the results.\n" "--process-only Process the stored results from previous option.\n" "--append Parse the OSM file(s) and append to existing results.\n" "--keep Keep the intermediate files after parsing & sorting.\n" "--changes Parse the data as an OSC file and apply the changes.\n" "\n" "--max-iterations= The number of iterations for finding super-nodes\n" " (defaults to 5).\n" "\n" "--prune-none Disable the prune options below, they are re-enabled\n" " by adding them to the command line after this option.\n" "--prune-isolated= Remove access from small disconnected segment groups\n" " (defaults to removing groups under 500m).\n" "--prune-short= Remove short segments (defaults to removing segments\n" " up to a maximum length of 5m).\n" "--prune-straight= Remove nodes in almost straight highways (defaults to\n" " removing nodes up to 3m offset from a straight line).\n" "\n" ", , , , \n" " The name(s) of the file(s) to read and parse.\n" " Filenames ending '.pbf' read as PBF, filenames ending\n" " '.o5m' or '.o5c' read as O5M/O5C, others as XML.\n" #if defined(USE_BZIP2) && USE_BZIP2 " Filenames ending '.bz2' will be bzip2 uncompressed.\n" #endif #if defined(USE_GZIP) && USE_GZIP " Filenames ending '.gz' will be gzip uncompressed.\n" #endif #if defined(USE_XZ) && USE_XZ " Filenames ending '.xz' will be xz uncompressed.\n" #endif "\n" " defaults to all but can be set to:\n" "%s" "\n" " can be selected from:\n" "%s" "\n" " can be selected from:\n" "%s", TransportList(),HighwayList(),PropertyList()); exit(!detail); } routino-3.4.3/src/types.h 644 233 144 34411 14672572020 10524 0/*************************************** Type definitions Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2014, 2019 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef TYPES_H #define TYPES_H /*+ To stop multiple inclusions. +*/ #include #include #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif /* Constants and macros for handling them */ /*+ The number of waypoints allowed to be specified. +*/ #define NWAYPOINTS 99 /*+ An undefined waypoint index. +*/ #define NO_WAYPOINT ((waypoint_t)~0) /*+ An undefined node index. +*/ #define NO_NODE ((index_t)~0) /*+ An undefined segment index. +*/ #define NO_SEGMENT ((index_t)~0) /*+ An undefined way index. +*/ #define NO_WAY ((index_t)~0) /*+ An undefined relation index. +*/ #define NO_RELATION ((index_t)~0) /*+ An undefined location. +*/ #define NO_LATLONG ((latlong_t)0x80000000) /*+ The lowest number allowed for a fake node (allows 65535 of them). +*/ #define NODE_FAKE (((index_t)~0)<<16) /*+ The lowest number allowed for a fake segment (allows 65535 of them). +*/ #define SEGMENT_FAKE (((index_t)~0)<<16) /*+ The latitude and longitude conversion factor from floating point (radians) to integer. +*/ #define LAT_LONG_SCALE (1024*65536) /*+ The latitude and longitude integer range within each bin. +*/ #define LAT_LONG_BIN 65536 /*+ A flag to mark a node as a super-node. +*/ #define NODE_SUPER ((nodeflags_t)0x8000) /*+ A flag to mark a node as suitable for a U-turn. +*/ #define NODE_UTURN ((nodeflags_t)0x4000) /*+ A flag to mark a node as a mini-roundabout. +*/ #define NODE_MINIRNDBT ((nodeflags_t)0x2000) /*+ A flag to mark a node as a turn relation via node. +*/ #define NODE_TURNRSTRCT ((nodeflags_t)0x1000) /*+ A flag to mark a node as adjacent to a turn relation via node. +*/ #define NODE_TURNRSTRCT2 ((nodeflags_t)0x0800) /*+ A flag to mark a node as deleted. +*/ #define NODE_DELETED ((nodeflags_t)0x0400) /*+ A flag to mark a segment as being part of an area (must be the highest valued flag). +*/ #define SEGMENT_AREA ((distance_t)0x80000000) /*+ A flag to mark a segment as one-way from node1 to node2. +*/ #define ONEWAY_1TO2 ((distance_t)0x40000000) /*+ A flag to mark a segment as one-way from node2 to node1. +*/ #define ONEWAY_2TO1 ((distance_t)0x20000000) /*+ A flag to mark a segment as a super-segment. +*/ #define SEGMENT_SUPER ((distance_t)0x10000000) /*+ A flag to mark a segment as a normal segment. +*/ #define SEGMENT_NORMAL ((distance_t)0x08000000) /*+ The real distance ignoring the other flags. +*/ #define DISTANCE(xx) ((distance_t)((xx)&(~(SEGMENT_AREA|ONEWAY_1TO2|ONEWAY_2TO1|SEGMENT_SUPER|SEGMENT_NORMAL)))) /*+ The distance flags selecting only the flags. +*/ #define DISTFLAG(xx) ((distance_t)((xx)&(SEGMENT_AREA|ONEWAY_1TO2|ONEWAY_2TO1|SEGMENT_SUPER|SEGMENT_NORMAL))) /*+ A very large almost infinite distance. +*/ #define INF_DISTANCE DISTANCE(~0) /*+ A very large almost infinite score. +*/ #define INF_SCORE (score_t)1E30 /*+ A flag to mark a deleted way. +*/ #define WAY_DELETED ((highway_t)~0) /*+ A flag to mark a deleted relation. +*/ #define RELATION_DELETED ((transports_t)~0) /* Simple Types */ /*+ A waypoint index. +*/ typedef uint16_t waypoint_t; /*+ A node, segment, way or relation index. +*/ typedef uint32_t index_t; /*+ A printf formatting string for an index_t type (this should match the index_t definition above). +*/ #define Pindex_t PRIu32 /* PRIu32 and PRIu64 are defined in intypes.h */ /*+ A node latitude or longitude (range: +/-pi*LAT_LONG_SCALE = +/-3.14*1024*65536 = ~29 bits). +*/ typedef int32_t latlong_t; /*+ A node latitude or longitude bin number (range: +/-pi*LAT_LONG_SCALE/LAT_LONG_BIN = +/-3.14*1024 = ~13 bits). +*/ typedef int16_t ll_bin_t; /*+ A node latitude and longitude bin number (range: +/-(pi*LAT_LONG_SCALE/LAT_LONG_BIN)^2 = +/-(3.14*1024)^2 = ~26 bits). +*/ typedef int32_t ll_bin2_t; /*+ A node latitude or longitude offset (range: 0 -> LAT_LONG_BIN-1 = 0 -> 65535 = 16 bits). +*/ typedef uint16_t ll_off_t; /*+ Conversion from a latlong (integer latitude or longitude) to a bin number. +*/ #define latlong_to_bin(xxx) (ll_bin_t)((latlong_t)((xxx)&~(LAT_LONG_BIN-1))/LAT_LONG_BIN) /*+ Conversion from a bin number to a latlong (integer latitude or longitude). +*/ #define bin_to_latlong(xxx) ((latlong_t)(xxx)*LAT_LONG_BIN) /*+ Conversion from a latlong (integer latitude or longitude) to a bin offset. +*/ #define latlong_to_off(xxx) (ll_off_t)((latlong_t)(xxx)&(LAT_LONG_BIN-1)) /*+ Conversion from a bin offset to a latlong (integer latitude or longitude). +*/ #define off_to_latlong(xxx) ((latlong_t)(xxx)) /*+ Conversion from a latitude or longitude in radians to a latlong (integer latitude or longitude). +*/ #define radians_to_latlong(xxx) ((latlong_t)floor((xxx)*LAT_LONG_SCALE+0.5)) /*+ Conversion from a latlong (integer latitude or longitude) to a latitude or longitude in radians. +*/ #define latlong_to_radians(xxx) ((double)(xxx)/LAT_LONG_SCALE) /*+ Conversion from radians to degrees. +*/ #define radians_to_degrees(xxx) ((xxx)*(180.0/M_PI)) /*+ Conversion from degrees to radians. +*/ #define degrees_to_radians(xxx) ((xxx)*(M_PI/180.0)) /*+ Node flags. +*/ typedef uint16_t nodeflags_t; /*+ A distance, measured in metres (will not overflow for any earth-based distance). +*/ typedef uint32_t distance_t; /*+ A duration, measured in 1/10th seconds (will not overflow for 13 years). +*/ typedef uint32_t duration_t; /*+ A routing optimisation score. +*/ typedef float score_t; /*+ Conversion from distance_t to kilometres. +*/ #define distance_to_km(xx) ((double)(xx)/1000.0) /*+ Conversion from kilometres to distance_t. +*/ #define km_to_distance(xx) ((distance_t)((double)(xx)*1000.0)) /*+ Conversion from duration_t to minutes. +*/ #define duration_to_minutes(xx) ((double)(xx)/600.0) /*+ Conversion from duration_t to hours. +*/ #define duration_to_hours(xx) ((double)(xx)/36000.0) /*+ Conversion from hours to duration_t. +*/ #define hours_to_duration(xx) ((duration_t)((double)(xx)*36000.0)) /*+ Conversion from distance_t and speed_t to duration_t. +*/ #define distance_speed_to_duration(xx,yy) ((duration_t)(((double)(xx)/(double)(yy))*(36000.0/1000.0))) /*+ The type of a highway. +*/ typedef uint8_t highway_t; /*+ The different types of a highway. +*/ typedef enum _Highway { Highway_None = 0, Highway_Motorway = 1, Highway_Trunk = 2, Highway_Primary = 3, Highway_Secondary = 4, Highway_Tertiary = 5, Highway_Unclassified = 6, Highway_Residential = 7, Highway_Service = 8, Highway_Track = 9, Highway_Cycleway = 10, Highway_Path = 11, Highway_Steps = 12, Highway_Ferry = 13, Highway_Count = 14, /* One more than the number of highway types. */ Highway_CycleBothWays = 16, Highway_OneWay = 32, Highway_Roundabout = 64, Highway_Area = 128 } Highway; #define HIGHWAY(xx) ((xx)&0x0f) /*+ A bitmask of multiple highway types. +*/ typedef uint16_t highways_t; #define HIGHWAYS(xx) (1<<(HIGHWAY(xx)-1)) /*+ The different types of a highway as a bitmask. +*/ typedef enum _Highways { Highways_None = 0, Highways_Motorway = HIGHWAYS(Highway_Motorway ), Highways_Trunk = HIGHWAYS(Highway_Trunk ), Highways_Primary = HIGHWAYS(Highway_Primary ), Highways_Secondary = HIGHWAYS(Highway_Secondary ), Highways_Tertiary = HIGHWAYS(Highway_Tertiary ), Highways_Unclassified = HIGHWAYS(Highway_Unclassified), Highways_Residential = HIGHWAYS(Highway_Residential ), Highways_Service = HIGHWAYS(Highway_Service ), Highways_Track = HIGHWAYS(Highway_Track ), Highways_Cycleway = HIGHWAYS(Highway_Cycleway ), Highways_Path = HIGHWAYS(Highway_Path ), Highways_Steps = HIGHWAYS(Highway_Steps ), Highways_Ferry = HIGHWAYS(Highway_Ferry ) } Highways; /*+ The type of a transport. +*/ typedef uint8_t transport_t; /*+ The different types of transport. +*/ typedef enum _Transport { Transport_None = 0, Transport_Foot = 1, Transport_Horse = 2, Transport_Wheelchair = 3, Transport_Bicycle = 4, Transport_Moped = 5, Transport_Motorcycle = 6, Transport_Motorcar = 7, Transport_Goods = 8, Transport_HGV = 9, Transport_PSV = 10, Transport_Count = 11 /*+ One more than the number of transport types. +*/ } Transport; /*+ A bitmask of multiple transport types. +*/ typedef uint16_t transports_t; #define TRANSPORTS(xx) (1<<((xx)-1)) /*+ The different types of transport as a bitmask. +*/ typedef enum _Transports { Transports_None = 0, Transports_Foot = TRANSPORTS(Transport_Foot ), Transports_Horse = TRANSPORTS(Transport_Horse ), Transports_Wheelchair = TRANSPORTS(Transport_Wheelchair), Transports_Bicycle = TRANSPORTS(Transport_Bicycle ), Transports_Moped = TRANSPORTS(Transport_Moped ), Transports_Motorcycle = TRANSPORTS(Transport_Motorcycle), Transports_Motorcar = TRANSPORTS(Transport_Motorcar ), Transports_Goods = TRANSPORTS(Transport_Goods ), Transports_HGV = TRANSPORTS(Transport_HGV ), Transports_PSV = TRANSPORTS(Transport_PSV ), Transports_ALL = TRANSPORTS(Transport_Count )-1 } Transports; /*+ The type of a property. +*/ typedef uint8_t property_t; /*+ The different types of property. +*/ typedef enum _Property { Property_None = 0, Property_Paved = 1, Property_Multilane = 2, Property_Bridge = 3, Property_Tunnel = 4, Property_FootRoute = 5, Property_BicycleRoute = 6, Property_Count = 7 /* One more than the number of property types. */ } Property; /*+ A bitmask of multiple properties. +*/ typedef uint8_t properties_t; #define PROPERTIES(xx) (1<<((xx)-1)) /*+ The different properties as a bitmask. +*/ typedef enum _Properties { Properties_None = 0, Properties_Paved = PROPERTIES(Property_Paved ), Properties_Multilane = PROPERTIES(Property_Multilane ), Properties_Bridge = PROPERTIES(Property_Bridge ), Properties_Tunnel = PROPERTIES(Property_Tunnel ), Properties_FootRoute = PROPERTIES(Property_FootRoute ), Properties_BicycleRoute = PROPERTIES(Property_BicycleRoute ), Properties_ALL = PROPERTIES(Property_Count )-1 } Properties; /*+ The speed limit of a way, measured in km/hour. +*/ typedef uint8_t speed_t; /*+ The maximum weight of a way, measured in multiples of 0.2 tonnes. +*/ typedef uint8_t weight_t; /*+ The maximum height of a way, measured in multiples of 0.1 metres. +*/ typedef uint8_t height_t; /*+ The maximum width of a way, measured in multiples of 0.1 metres. +*/ typedef uint8_t width_t; /*+ The maximum length of a way, measured in multiples of 0.1 metres. +*/ typedef uint8_t length_t; /*+ Conversion of km/hr to speed_t - simple inline function with error checking. +*/ inline static speed_t kph_to_speed(double xxx); inline static speed_t kph_to_speed(double xxx) { if(xxx>255) return(255); if(xxx<0) return(0); return((speed_t)xxx); } /*+ Conversion of speed_t to km/hr. +*/ #define speed_to_kph(xxx) (int)(xxx) /*+ Conversion of tonnes to weight_t - simple inline function with error checking. +*/ inline static weight_t tonnes_to_weight(double xxx); inline static weight_t tonnes_to_weight(double xxx) { if(xxx>51) return(255); if(xxx<0) return(0); return((weight_t)(xxx*5)); } /*+ Conversion of weight_t to tonnes. +*/ #define weight_to_tonnes(xxx) ((double)(xxx)/5.0) /*+ Conversion of metres to height_t - simple inline function with error checking. +*/ inline static height_t metres_to_height(double xxx); inline static height_t metres_to_height(double xxx) { if(xxx>25.5) return(255); if(xxx<0) return(0); return((height_t)(xxx*10)); } /*+ Conversion of height_t to metres. +*/ #define height_to_metres(xxx) ((double)(xxx)/10.0) /*+ Conversion of metres to width_t - simple inline function with error checking. +*/ inline static width_t metres_to_width(double xxx); inline static width_t metres_to_width(double xxx) { if(xxx>25.5) return(255); if(xxx<0) return(0); return((width_t)(xxx*10)); } /*+ Conversion of width_t to metres. +*/ #define width_to_metres(xxx) ((double)(xxx)/10.0) /*+ Conversion of metres to length_t - simple inline function with error checking. +*/ inline static length_t metres_to_length(double xxx); inline static length_t metres_to_length(double xxx) { if(xxx>25.5) return(255); if(xxx<0) return(0); return((length_t)(xxx*10)); } /*+ Conversion of length_t to metres. +*/ #define length_to_metres(xxx) ((double)(xxx)/10.0) /* Data structures */ typedef struct _Node Node; typedef struct _Nodes Nodes; typedef struct _Segment Segment; typedef struct _Segments Segments; typedef struct _Way Way; typedef struct _Ways Ways; typedef struct _TurnRelation TurnRelation; typedef struct _Relations Relations; /* Functions in types.c */ Highway HighwayType(const char *highway); Transport TransportType(const char *transport); Property PropertyType(const char *property); const char *HighwayName(Highway highway); const char *TransportName(Transport transport); const char *PropertyName(Property property); const char *HighwaysNameList(highways_t highways); const char *TransportsNameList(transports_t transports); const char *PropertiesNameList(properties_t properties); const char *HighwayList(void); const char *TransportList(void); const char *PropertyList(void); #endif /* TYPES_H */ routino-3.4.3/src/ways.h 644 233 144 12352 13455415301 10337 0/*************************************** A header file for the ways. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2016, 2019 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef WAYS_H #define WAYS_H /*+ To stop multiple inclusions. +*/ #include #include #include "types.h" #include "cache.h" #include "files.h" /* Data structures */ /*+ A structure containing a single way (members ordered to minimise overall size). +*/ struct _Way { index_t name; /*+ The offset of the name of the way in the names array. +*/ transports_t allow; /*+ The type of traffic allowed on the way. +*/ highway_t type; /*+ The highway type of the way. +*/ properties_t props; /*+ The properties of the way. +*/ speed_t speed; /*+ The defined maximum speed limit of the way. +*/ weight_t weight; /*+ The defined maximum weight of traffic on the way. +*/ height_t height; /*+ The defined maximum height of traffic on the way. +*/ width_t width; /*+ The defined maximum width of traffic on the way. +*/ length_t length; /*+ The defined maximum length of traffic on the way. +*/ }; /*+ A structure containing the header from the file. +*/ typedef struct _WaysFile { index_t number; /*+ The number of ways. +*/ highways_t highways; /*+ The types of highways that were seen when parsing. +*/ transports_t transports; /*+ The types of traffic that were seen when parsing. +*/ properties_t properties; /*+ The properties that were seen when parsing. +*/ } WaysFile; /*+ A structure containing a set of ways (and pointers to mmap file). +*/ struct _Ways { WaysFile file; /*+ The header data from the file. +*/ #if !SLIM char *data; /*+ The memory mapped data. +*/ Way *ways; /*+ An array of ways. +*/ char *names; /*+ An array of characters containing the names. +*/ #else int fd; /*+ The file descriptor for the file. +*/ offset_t namesoffset; /*+ The offset of the names within the file. +*/ Way cached[3]; /*+ Two cached nodes read from the file in slim mode. +*/ char *ncached[3]; /*+ The cached way name. +*/ WayCache *cache; /*+ A RAM cache of ways read from the file. +*/ #endif }; /* Functions in ways.c */ Ways *LoadWayList(const char *filename); void DestroyWayList(Ways *ways); int WaysCompare(Way *way1p,Way *way2p); /* Macros and inline functions */ #if !SLIM /*+ Return a Way* pointer given a set of ways and an index. +*/ #define LookupWay(xxx,yyy,zzz) (&(xxx)->ways[yyy]) /*+ Return the name of a way given the Way pointer and a set of ways. +*/ #define WayName(xxx,yyy) (&(xxx)->names[(yyy)->name]) #else static inline Way *LookupWay(Ways *ways,index_t index,int position); static inline char *WayName(Ways *ways,Way *wayp); CACHE_NEWCACHE_PROTO(Way) CACHE_DELETECACHE_PROTO(Way) CACHE_FETCHCACHE_PROTO(Way) CACHE_INVALIDATECACHE_PROTO(Way) /* Data type */ CACHE_STRUCTURE(Way) /* Inline functions */ CACHE_NEWCACHE(Way) CACHE_DELETECACHE(Way) CACHE_FETCHCACHE(Way) CACHE_INVALIDATECACHE(Way) /*++++++++++++++++++++++++++++++++++++++ Find the Way information for a particular way. Way *LookupWay Returns a pointer to the cached way information. Ways *ways The set of ways to use. index_t index The index of the way. int position The position in the cache to store the value. ++++++++++++++++++++++++++++++++++++++*/ static inline Way *LookupWay(Ways *ways,index_t index,int position) { ways->cached[position-1]=*FetchCachedWay(ways->cache,index,ways->fd,sizeof(WaysFile)); return(&ways->cached[position-1]); } /*++++++++++++++++++++++++++++++++++++++ Find the name of a way. char *WayName Returns a pointer to the name of the way. Ways *ways The set of ways to use. Way *wayp The Way pointer. ++++++++++++++++++++++++++++++++++++++*/ static inline char *WayName(Ways *ways,Way *wayp) { int position=(int)(wayp-ways->cached); int n=0; if(!ways->ncached[position]) ways->ncached[position]=(char*)malloc(64); while(!SlimFetch(ways->fd,ways->ncached[position]+n,64,ways->namesoffset+wayp->name+n)) { int i; for(i=n;incached[position][i]==0) goto exitloop; n+=64; ways->ncached[position]=(char*)realloc((void*)ways->ncached[position],n+64); } exitloop: return(ways->ncached[position]); } #endif #endif /* WAYS_H */ routino-3.4.3/src/superx.c 644 233 144 37301 14242177043 10701 0/*************************************** Super-Segment data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2022 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include "types.h" #include "segments.h" #include "ways.h" #include "typesx.h" #include "nodesx.h" #include "segmentsx.h" #include "waysx.h" #include "superx.h" #include "files.h" #include "logging.h" #include "results.h" /* Local functions */ static Results *FindSuperRoutes(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,node_t start,Way *match); /*++++++++++++++++++++++++++++++++++++++ Select the super-nodes from the list of nodes. NodesX *nodesx The set of nodes to use. SegmentsX *segmentsx The set of segments to use. WaysX *waysx The set of ways to use. ++++++++++++++++++++++++++++++++++++++*/ void ChooseSuperNodes(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx) { index_t i; index_t nnodes=0; if(nodesx->number==0 || segmentsx->number==0 || waysx->number==0) return; /* Print the start message */ printf_first("Finding Super-Nodes: Nodes=0 Super-Nodes=0"); /* Allocate and set the super-node markers */ if(!nodesx->super) { nodesx->super=AllocBitMask(nodesx->number); log_malloc(nodesx->super,SizeBitMask(nodesx->number)); SetAllBits(nodesx->super,nodesx->number); } /* Map into memory / open the files */ nodesx->fd=ReOpenFileBuffered(nodesx->filename_tmp); #if !SLIM segmentsx->data=MapFile(segmentsx->filename_tmp); waysx->data=MapFile(waysx->filename_tmp); #else segmentsx->fd=SlimMapFile(segmentsx->filename_tmp); waysx->fd=SlimMapFile(waysx->filename_tmp); InvalidateSegmentXCache(segmentsx->cache); InvalidateWayXCache(waysx->cache); #endif /* Find super-nodes */ for(i=0;inumber;i++) { NodeX nodex; ReadFileBuffered(nodesx->fd,&nodex,sizeof(NodeX)); if(IsBitSet(nodesx->super,i)) { int issuper=0; if(nodex.flags&(NODE_TURNRSTRCT|NODE_TURNRSTRCT2)) issuper=1; else { int count=0,j; Way segmentway[MAX_SEG_PER_NODE]; int segmentweight[MAX_SEG_PER_NODE]; SegmentX *segmentx=FirstSegmentX(segmentsx,i,1); while(segmentx) { WayX *wayx=LookupWayX(waysx,segmentx->way,1); int nsegments; /* Segments that are loops count twice */ logassert(countnode1==segmentx->node2) segmentweight[count]=2; else segmentweight[count]=1; segmentway[count]=wayx->way; /* If the node allows less traffic types than any connecting way then it is super if it allows anything */ if((wayx->way.allow&nodex.allow)!=wayx->way.allow && nodex.allow!=Transports_None) { issuper=1; break; } nsegments=segmentweight[count]; for(j=0;jway.allow & segmentway[j].allow) { /* If two ways are different in any attribute and there is a type of traffic that can use both then it is super */ if(WaysCompare(&segmentway[j],&wayx->way)) { issuper=1; break; } /* If there are two other segments that can be used by the same types of traffic as this one then it is super */ nsegments+=segmentweight[j]; if(nsegments>2) { issuper=1; break; } } if(issuper) break; segmentx=NextSegmentX(segmentsx,segmentx,i); count++; } } /* Mark the node as super if it is. */ if(issuper) nnodes++; else ClearBit(nodesx->super,i); } if(!((i+1)%10000)) printf_middle("Finding Super-Nodes: Nodes=%"Pindex_t" Super-Nodes=%"Pindex_t,i+1,nnodes); } /* Unmap from memory / close the files */ #if !SLIM segmentsx->data=UnmapFile(segmentsx->data); waysx->data=UnmapFile(waysx->data); #else segmentsx->fd=SlimUnmapFile(segmentsx->fd); waysx->fd=SlimUnmapFile(waysx->fd); #endif nodesx->fd=CloseFileBuffered(nodesx->fd); /* Print the final message */ printf_last("Found Super-Nodes: Nodes=%"Pindex_t" Super-Nodes=%"Pindex_t,nodesx->number,nnodes); } /*++++++++++++++++++++++++++++++++++++++ Create the super-segments from the existing segments. SegmentsX *CreateSuperSegments Returns the new super segments. NodesX *nodesx The set of nodes to use. SegmentsX *segmentsx The set of segments to use. WaysX *waysx The set of ways to use. ++++++++++++++++++++++++++++++++++++++*/ SegmentsX *CreateSuperSegments(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx) { index_t i; SegmentsX *supersegmentsx; index_t sn=0,ss=0; supersegmentsx=NewSegmentList(); if(segmentsx->number==0 || waysx->number==0) { FinishSegmentList(supersegmentsx); return(supersegmentsx); } /* Print the start message */ printf_first("Creating Super-Segments: Super-Nodes=0 Super-Segments=0"); /* Map into memory / open the files */ #if !SLIM nodesx->data=MapFile(nodesx->filename_tmp); segmentsx->data=MapFile(segmentsx->filename_tmp); waysx->data=MapFile(waysx->filename_tmp); #else nodesx->fd=SlimMapFile(nodesx->filename_tmp); segmentsx->fd=SlimMapFile(segmentsx->filename_tmp); waysx->fd=SlimMapFile(waysx->filename_tmp); InvalidateNodeXCache(nodesx->cache); InvalidateSegmentXCache(segmentsx->cache); InvalidateWayXCache(waysx->cache); #endif /* Create super-segments for each super-node. */ for(i=0;inumber;i++) { if(IsBitSet(nodesx->super,i)) { SegmentX *segmentx; int count=0,match; Way prevway[MAX_SEG_PER_NODE]; segmentx=FirstSegmentX(segmentsx,i,1); while(segmentx) { WayX *wayx=LookupWayX(waysx,segmentx->way,1); /* Check that this type of way hasn't already been routed */ match=0; if(count>0) { int j; for(j=0;jway)) { match=1; break; } } logassert(countway; /* Route the way and store the super-segments. */ if(!match) { Results *results=FindSuperRoutes(nodesx,segmentsx,waysx,i,&wayx->way); Result *result=FirstResult(results); while(result) { if(IsBitSet(nodesx->super,result->node) && result->segment!=NO_SEGMENT) { if(wayx->way.type&Highway_OneWay && result->node!=i) AppendSegmentList(supersegmentsx,segmentx->way,i,result->node,DISTANCE((distance_t)result->score)|ONEWAY_1TO2); else AppendSegmentList(supersegmentsx,segmentx->way,i,result->node,DISTANCE((distance_t)result->score)); ss++; } result=NextResult(results,result); } } segmentx=NextSegmentX(segmentsx,segmentx,i); } sn++; if(!(sn%10000)) printf_middle("Creating Super-Segments: Super-Nodes=%"Pindex_t" Super-Segments=%"Pindex_t,sn,ss); } } FinishSegmentList(supersegmentsx); /* Unmap from memory / close the files */ #if !SLIM nodesx->data=UnmapFile(nodesx->data); segmentsx->data=UnmapFile(segmentsx->data); waysx->data=UnmapFile(waysx->data); #else nodesx->fd=SlimUnmapFile(nodesx->fd); segmentsx->fd=SlimUnmapFile(segmentsx->fd); waysx->fd=SlimUnmapFile(waysx->fd); #endif /* Free the no-longer required memory */ if(segmentsx->firstnode) { log_free(segmentsx->firstnode); free(segmentsx->firstnode); segmentsx->firstnode=NULL; } /* Print the final message */ printf_last("Created Super-Segments: Super-Nodes=%"Pindex_t" Super-Segments=%"Pindex_t,sn,ss); return(supersegmentsx); } /*++++++++++++++++++++++++++++++++++++++ Merge the segments and super-segments into a new segment list. SegmentsX *MergeSuperSegments Returns a new set of merged segments. SegmentsX *segmentsx The set of segments to use. SegmentsX *supersegmentsx The set of super-segments to use. ++++++++++++++++++++++++++++++++++++++*/ SegmentsX *MergeSuperSegments(SegmentsX *segmentsx,SegmentsX *supersegmentsx) { index_t i,j,lastj; index_t merged=0,added=0; SegmentsX *mergedsegmentsx; SegmentX supersegmentx; mergedsegmentsx=NewSegmentList(); if(segmentsx->number==0) { FinishSegmentList(mergedsegmentsx); return(mergedsegmentsx); } /* Print the start message */ printf_first("Merging Segments: Segments=0 Super=0 Merged=0 Added=0"); /* Open the files */ segmentsx->fd=ReOpenFileBuffered(segmentsx->filename_tmp); if(supersegmentsx->number>0) supersegmentsx->fd=ReOpenFileBuffered(supersegmentsx->filename_tmp); /* Loop through and create a new list of combined segments */ lastj=-1; j=0; for(i=0;inumber;i++) { int super=0; SegmentX segmentx; ReadFileBuffered(segmentsx->fd,&segmentx,sizeof(SegmentX)); while(jnumber) { if(j!=lastj) { ReadFileBuffered(supersegmentsx->fd,&supersegmentx,sizeof(SegmentX)); lastj=j; } if(segmentx.node1 ==supersegmentx.node1 && segmentx.node2 ==supersegmentx.node2 && segmentx.distance==supersegmentx.distance) { merged++; j++; /* mark as super-segment and normal segment */ super=1; break; } else if((segmentx.node1==supersegmentx.node1 && segmentx.node2==supersegmentx.node2) || (segmentx.node1==supersegmentx.node1 && segmentx.node2>supersegmentx.node2) || (segmentx.node1>supersegmentx.node1)) { /* mark as super-segment */ AppendSegmentList(mergedsegmentsx,supersegmentx.way,supersegmentx.node1,supersegmentx.node2,supersegmentx.distance|SEGMENT_SUPER); added++; j++; } else { /* mark as normal segment */ break; } } if(super) AppendSegmentList(mergedsegmentsx,segmentx.way,segmentx.node1,segmentx.node2,segmentx.distance|SEGMENT_SUPER|SEGMENT_NORMAL); else AppendSegmentList(mergedsegmentsx,segmentx.way,segmentx.node1,segmentx.node2,segmentx.distance|SEGMENT_NORMAL); if(!((i+1)%10000)) printf_middle("Merging Segments: Segments=%"Pindex_t" Super=%"Pindex_t" Merged=%"Pindex_t" Added=%"Pindex_t,i+1,j,merged,added); } if(jnumber) { if(j==lastj) { AppendSegmentList(mergedsegmentsx,supersegmentx.way,supersegmentx.node1,supersegmentx.node2,supersegmentx.distance|SEGMENT_SUPER); j++; } while(jnumber) { ReadFileBuffered(supersegmentsx->fd,&supersegmentx,sizeof(SegmentX)); AppendSegmentList(mergedsegmentsx,supersegmentx.way,supersegmentx.node1,supersegmentx.node2,supersegmentx.distance|SEGMENT_SUPER); added++; j++; } } FinishSegmentList(mergedsegmentsx); /* Close the files */ segmentsx->fd=CloseFileBuffered(segmentsx->fd); if(supersegmentsx->number>0) supersegmentsx->fd=CloseFileBuffered(supersegmentsx->fd); /* Print the final message */ printf_last("Merged Segments: Segments=%"Pindex_t" Super=%"Pindex_t" Merged=%"Pindex_t" Added=%"Pindex_t,segmentsx->number,supersegmentsx->number,merged,added); return(mergedsegmentsx); } /*++++++++++++++++++++++++++++++++++++++ Find all routes from a specified super-node to any other super-node that follows a certain type of way. Results *FindSuperRoutes Returns a set of results. NodesX *nodesx The set of nodes to use. SegmentsX *segmentsx The set of segments to use. WaysX *waysx The set of ways to use. node_t start The start node. Way *match A template for the type of way that the route must follow. ++++++++++++++++++++++++++++++++++++++*/ static Results *FindSuperRoutes(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,node_t start,Way *match) { static Results *results=NULL; /* static allocation of return value (reset each call) */ static Queue *queue=NULL; /* static allocation of internal value (reset each call) */ Result *result1,*result2; WayX *wayx; /* Insert the first node into the queue */ if(!results) results=NewResultsList(8); else ResetResultsList(results); if(!queue) queue=NewQueueList(8); else ResetQueueList(queue); result1=InsertResult(results,start,NO_SEGMENT); InsertInQueue(queue,result1,0); /* Loop across all nodes in the queue */ while((result1=PopFromQueue(queue))) { index_t node1; SegmentX *segmentx; node1=result1->node; segmentx=FirstSegmentX(segmentsx,node1,2); /* position 1 is already used */ while(segmentx) { NodeX *node2x; index_t node2,seg2; distance_t cumulative_distance; /* must not be one-way against the direction of travel */ if(IsOnewayTo(segmentx,node1)) goto endloop; seg2=IndexSegmentX(segmentsx,segmentx); /* must not be a u-turn */ if(result1->segment==seg2) goto endloop; wayx=LookupWayX(waysx,segmentx->way,2); /* position 1 is already used */ /* must be the right type of way */ if(WaysCompare(&wayx->way,match)) goto endloop; node2=OtherNode(segmentx,node1); node2x=LookupNodeX(nodesx,node2,2); /* position 1 is already used */ /* Don't route beyond a node with no access */ if(node2x->allow==Transports_None) goto endloop; cumulative_distance=(distance_t)result1->score+DISTANCE(segmentx->distance); result2=FindResult(results,node2,seg2); if(!result2) /* New end node */ { result2=InsertResult(results,node2,seg2); result2->prev=result1; result2->score=cumulative_distance; /* don't route beyond a super-node. */ if(!IsBitSet(nodesx->super,node2)) InsertInQueue(queue,result2,cumulative_distance); } else if(cumulative_distancescore) { result2->prev=result1; result2->score=cumulative_distance; /* don't route beyond a super-node. */ if(!IsBitSet(nodesx->super,node2)) InsertInQueue(queue,result2,cumulative_distance); } endloop: segmentx=NextSegmentX(segmentsx,segmentx,node1); } } return(results); } routino-3.4.3/src/sorting.c 644 233 144 70176 14775261105 11053 0/*************************************** Merge sort functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2009-2015, 2017, 2019, 2023, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #if defined(USE_PTHREADS) && USE_PTHREADS #include #endif #include "types.h" #include "logging.h" #include "files.h" #include "sorting.h" /*+ Enable debugging print statements +*/ #define DEBUG 0 /* Global variables */ /*+ The command line '--tmpdir' option or its default value. +*/ extern char *option_tmpdirname; /*+ The amount of RAM to use for filesorting. +*/ extern size_t option_filesort_ramsize; /*+ The number of filesorting threads allowed. +*/ extern int option_filesort_threads; /* Thread data type definitions */ /*+ A data type for holding data for a thread. +*/ typedef struct _thread_data { #if defined(USE_PTHREADS) && USE_PTHREADS pthread_t thread; /*+ The thread identifier. +*/ int running; /*+ A flag indicating the current state of the thread. +*/ #endif char *data; /*+ The main data array. +*/ void **datap; /*+ An array of pointers to the data objects. +*/ size_t n; /*+ The number of pointers. +*/ int fd; /*+ The file descriptor of the file to write the results to. +*/ size_t itemsize; /*+ The size of each item. +*/ int (*compare)(const void*,const void*); /*+ The comparison function. +*/ } thread_data; /* Thread variables and functions */ #if defined(USE_PTHREADS) && USE_PTHREADS static pthread_mutex_t running_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t running_cond = PTHREAD_COND_INITIALIZER; static int wait_for_free_thread(thread_data *threads,int nthreads,int *threads_running); static void wait_for_all_threads(thread_data *threads,int nthreads,int *threads_running); #endif /* Thread helper functions */ static void *filesort_heapsort_thread(thread_data *thread); /* Local functions */ static index_t filesort_merge(int fd_out,int nfiles,size_t itemsize,size_t largestitemsize, int(*compare_function)(const void*, const void*), int (*post_sort_function)(void*,index_t)); /*++++++++++++++++++++++++++++++++++++++ A function to sort the contents of a file of fixed length objects using a limited amount of RAM. The data is sorted using a "Merge sort" http://en.wikipedia.org/wiki/Merge_sort and in particular an "external sort" http://en.wikipedia.org/wiki/External_sorting. The individual sort steps and the merge step both use a "Heap sort" http://en.wikipedia.org/wiki/Heapsort. The combination of the two should work well if the data is already partially sorted. index_t filesort_fixed Returns the number of objects kept. int fd_in The file descriptor of the input file (opened for reading and at the beginning). int fd_out The file descriptor of the output file (opened for writing and empty). size_t itemsize The size of each item in the file that needs sorting. int (*pre_sort_function)(void *,index_t) If non-NULL then this function is called for each item before they have been sorted. The second parameter is the number of objects previously read from the input file. If the function returns 1 then the object is kept and it is sorted, otherwise it is ignored. int (*compare_function)(const void*, const void*) The comparison function. This is identical to qsort if the data to be sorted is an array of things not pointers. int (*post_sort_function)(void *,index_t) If non-NULL then this function is called for each item after they have been sorted. The second parameter is the number of objects already written to the output file. If the function returns 1 then the object is written to the output file., otherwise it is ignored. ++++++++++++++++++++++++++++++++++++++*/ index_t filesort_fixed(int fd_in,int fd_out,size_t itemsize,int (*pre_sort_function)(void*,index_t), int (*compare_function)(const void*,const void*), int (*post_sort_function)(void*,index_t)) { int nfiles=0; index_t count_out=0,count_in=0,total=0; size_t nitems,item; thread_data *threads; int nthreads,i,more=1; char *filename=(char*)malloc_logassert(strlen(option_tmpdirname)+24); #if defined(USE_PTHREADS) && USE_PTHREADS int threads_running=0; #endif /* Allocate the RAM buffer and other bits */ nitems=(size_t)SizeFileFD(fd_in)/itemsize; if(nitems==0) return(0); if(option_filesort_threads==1) nthreads = 1; else if((nitems*(itemsize+sizeof(void*)))option_filesort_ramsize) nitems=option_filesort_ramsize/(itemsize+sizeof(void*)); nitems=1+nitems/nthreads; #if DEBUG printf("DEBUG: filesort_fixed nitems=%lu option_ramsize/option_threads=%lu => nitems=%lu datasize=%lu nthreads=%d\n", (size_t)SizeFileFD(fd_in)/itemsize,option_filesort_ramsize/option_filesort_threads,nitems,nitems*(itemsize+sizeof(void*)),nthreads); #endif threads=(thread_data*)calloc_logassert(nthreads,sizeof(thread_data)); for(i=0;i1) thread=wait_for_free_thread(threads,nthreads,&threads_running); #endif /* Read in the data and create pointers */ for(item=0;item1) wait_for_all_threads(threads,nthreads,&threads_running); #endif /* Shortcut if there are no files */ if(nfiles==0) goto tidy_and_exit; /* Shortcut if only one file, lucky for us we still have the data in RAM) */ if(nfiles==1) { for(item=0;itemoption_filesort_ramsize) datasize=option_filesort_ramsize; datasize=datasize/nthreads; datasize=FILESORT_VARALIGN*((datasize+FILESORT_VARALIGN-1)/FILESORT_VARALIGN); #if DEBUG printf("DEBUG: filesort_vary datasize=%lu option_ramsize/option_threads=%lu => datasize=%lu nthreads=%d\n", 2*(size_t)SizeFileFD(fd_in),option_filesort_ramsize/option_filesort_threads,datasize,nthreads); #endif threads=(thread_data*)calloc_logassert(nthreads,sizeof(thread_data)); for(i=0;i1) thread=wait_for_free_thread(threads,nthreads,&threads_running); #endif threads[thread].datap=(void**)(threads[thread].data+datasize); item=0; /* Read in the data and create pointers */ while((ramused+FILESORT_VARSIZE+nextitemsize)<=(size_t)((char*)threads[thread].datap-sizeof(void*)-threads[thread].data)) { FILESORT_VARINT itemsize=nextitemsize; *(FILESORT_VARINT*)(threads[thread].data+ramused)=itemsize; ramused+=FILESORT_VARSIZE; ReadFileBuffered(fd_in,threads[thread].data+ramused,itemsize); if(!pre_sort_function || pre_sort_function(threads[thread].data+ramused,count_in)) { *--threads[thread].datap=threads[thread].data+ramused; /* points to real data */ if(itemsize>largestitemsize) largestitemsize=itemsize; ramused+=itemsize; ramused =FILESORT_VARALIGN*((ramused+FILESORT_VARALIGN-1)/FILESORT_VARALIGN); ramused+=FILESORT_VARALIGN-FILESORT_VARSIZE; total++; item++; } else ramused-=FILESORT_VARSIZE; count_in++; if(ReadFileBuffered(fd_in,&nextitemsize,FILESORT_VARSIZE)) { more=0; break; } } #if DEBUG printf("DEBUG: filesort_vary thread=%d file=%d item=%lu total=%u ramused=%lu more=%d\n",thread,nfiles,item,total,ramused+item*sizeof(void*),more); #endif /* No new data read in this time round */ if(item==0) break; /* Update the number of items to sort */ threads[thread].n=item; /* Shortcut if only one file, don't write to disk */ if(more==0 && nfiles==0) { filename[0]=0; filesort_heapsort_thread(&threads[thread]); } else { /* Create the file descriptor (not thread-safe) */ sprintf(filename,"%s/filesort.%d.tmp",option_tmpdirname,nfiles); threads[thread].fd=OpenFileBufferedNew(filename); if(nthreads==1) { filesort_heapsort_thread(&threads[thread]); CloseFileBuffered(threads[thread].fd); } #if defined(USE_PTHREADS) && USE_PTHREADS else { threads[thread].running=1; pthread_create(&threads[thread].thread,NULL,(void* (*)(void*))filesort_heapsort_thread,&threads[thread]); threads_running++; } #endif } nfiles++; } while(more); #if defined(USE_PTHREADS) && USE_PTHREADS /* Wait for all of the threads to finish */ if(nthreads>1) wait_for_all_threads(threads,nthreads,&threads_running); #endif /* Shortcut if there are no files */ if(nfiles==0) goto tidy_and_exit; /* Shortcut if only one file, lucky for us we still have the data in RAM) */ if(nfiles==1) { for(item=0;itemdatap,thread->n,thread->compare); /* Write the result to the temporary file if given */ if(thread->fd>0) { if(thread->itemsize>0) for(item=0;itemn;item++) WriteFileBuffered(thread->fd,thread->datap[item],thread->itemsize); else for(item=0;itemn;item++) { FILESORT_VARINT itemsize=*(FILESORT_VARINT*)((char*)thread->datap[item]-FILESORT_VARSIZE); WriteFileBuffered(thread->fd,(char*)thread->datap[item]-FILESORT_VARSIZE,itemsize+FILESORT_VARSIZE); } } #if defined(USE_PTHREADS) && USE_PTHREADS /* Signal that this thread has finished */ if(thread->running==1) { pthread_mutex_lock(&running_mutex); thread->running=2; pthread_cond_signal(&running_cond); pthread_mutex_unlock(&running_mutex); } #endif return(NULL); } /*++++++++++++++++++++++++++++++++++++++ A function to sort an array of pointers efficiently. The data is sorted using a "Heap sort" http://en.wikipedia.org/wiki/Heapsort, in particular, this is good because it can operate in-place and doesn't allocate more memory like using qsort() does. void **datap A pointer to the array of pointers to sort. size_t nitems The number of items of data to sort. int (*compare_function)(const void*, const void*) The comparison function. This is identical to qsort if the data to be sorted is an array of things not pointers. ++++++++++++++++++++++++++++++++++++++*/ void filesort_heapsort(void **datap,size_t nitems,int(*compare_function)(const void*, const void*)) { void **datap1=&datap[-1]; size_t item; /* Fill the heap by pretending to insert the data that is already there */ for(item=2;item<=nitems;item++) { size_t index=item; /* Bubble up the new value (upside-down, put largest at top) */ while(index>1) { int newindex; void *temp; newindex=index/2; if(compare_function(datap1[index],datap1[newindex])<=0) /* reversed comparison to filesort_fixed() above */ break; temp=datap1[index]; datap1[index]=datap1[newindex]; datap1[newindex]=temp; index=newindex; } } /* Repeatedly pull out the root of the heap and swap with the bottom item */ for(item=nitems;item>1;item--) { size_t index=1; void *temp; temp=datap1[index]; datap1[index]=datap1[item]; datap1[item]=temp; /* Bubble down the new value (upside-down, put largest at top) */ while((2*index)<(item-1)) { int newindex; void **temp; newindex=2*index; if(compare_function(datap1[newindex],datap1[newindex+1])<=0) /* reversed comparison to filesort_fixed() above */ newindex=newindex+1; if(compare_function(datap1[index],datap1[newindex])>=0) /* reversed comparison to filesort_fixed() above */ break; temp=datap1[newindex]; datap1[newindex]=datap1[index]; datap1[index]=temp; index=newindex; } if((2*index)==(item-1)) { int newindex; void *temp; newindex=2*index; if(compare_function(datap1[index],datap1[newindex])>=0) /* reversed comparison to filesort_fixed() above */ ; /* break */ else { temp=datap1[newindex]; datap1[newindex]=datap1[index]; datap1[index]=temp; } } } } /*++++++++++++++++++++++++++++++++++++++ A function to merge an array of sorted files efficiently. The data is merged using an "external sort" http://en.wikipedia.org/wiki/External_sorting where only one item is read from each file at a time. index_t filesort_merge Returns the number of items written to the output file int fd_out The file descriptor of the output file (opened for writing and empty). int nfiles The number of files to open and merge size_t itemsize The size of each item (non-zero if a fixed size sort). size_t largestitemsize The maximum size of each item (non-zero if a variable size sort). int (*compare_function)(const void*, const void*) The comparison function. This is identical to qsort if the data to be sorted is an array of things not pointers. int (*post_sort_function)(void *,index_t) If non-NULL then this function is called for each item after they have been sorted. The second parameter is the number of objects already written to the output file. If the function returns 1 then the object is written to the output file., otherwise it is ignored. ++++++++++++++++++++++++++++++++++++++*/ static index_t filesort_merge(int fd_out,int nfiles,size_t itemsize,size_t largestitemsize, int(*compare_function)(const void*, const void*), int (*post_sort_function)(void*,index_t)) { int ndata=0; char *data,*filename; void **datap; int *fds,*heap; index_t count_out=0; int i; /* Allocate the memory */ filename=(char*)malloc_logassert(strlen(option_tmpdirname)+24); heap=(int*)malloc_logassert((1+nfiles)*sizeof(int)); if(itemsize) data=(void*)malloc_logassert(nfiles*itemsize); else data=(void*)malloc_logassert(nfiles*(largestitemsize+FILESORT_VARALIGN)); datap=(void**)malloc_logassert(nfiles*sizeof(void*)); fds=(int*)malloc_logassert(nfiles*sizeof(int)); /* Re-open the files */ for(i=0;i1) { int newindex; int temp; newindex=index/2; if(compare_function(datap[heap[index]],datap[heap[newindex]])>=0) break; temp=heap[index]; heap[index]=heap[newindex]; heap[newindex]=temp; index=newindex; } } /* Repeatedly pull out the root of the heap and refill from the same file */ ndata=nfiles; do { int index=1; if(!post_sort_function || post_sort_function(datap[heap[index]],count_out)) { if(itemsize) WriteFileBuffered(fd_out,datap[heap[index]],itemsize); else { FILESORT_VARINT itemsize=*(FILESORT_VARINT*)((char*)datap[heap[index]]-FILESORT_VARSIZE); WriteFileBuffered(fd_out,(char*)datap[heap[index]]-FILESORT_VARSIZE,itemsize+FILESORT_VARSIZE); } count_out++; } if(itemsize) { if(ReadFileBuffered(fds[heap[index]],datap[heap[index]],itemsize)) { heap[index]=heap[ndata]; ndata--; } } else { FILESORT_VARINT itemsize; if(ReadFileBuffered(fds[heap[index]],&itemsize,FILESORT_VARSIZE)) { heap[index]=heap[ndata]; ndata--; } else { *(FILESORT_VARINT*)((char*)datap[heap[index]]-FILESORT_VARSIZE)=itemsize; ReadFileBuffered(fds[heap[index]],datap[heap[index]],itemsize); } } /* Bubble down the new value */ while((2*index)=0) newindex=newindex+1; if(compare_function(datap[heap[index]],datap[heap[newindex]])<=0) break; temp=heap[newindex]; heap[newindex]=heap[index]; heap[index]=temp; index=newindex; } if((2*index)==ndata) { int newindex; int temp; newindex=2*index; if(compare_function(datap[heap[index]],datap[heap[newindex]])<=0) ; /* break */ else { temp=heap[newindex]; heap[newindex]=heap[index]; heap[index]=temp; } } } while(ndata>0); /* Tidy up */ free(filename); for(i=0;i. ***************************************/ #ifndef WAYSX_H #define WAYSX_H /*+ To stop multiple inclusions. +*/ #include #include "types.h" #include "ways.h" #include "typesx.h" #include "cache.h" #include "files.h" /* Data structures */ /*+ An extended structure containing a single way. +*/ struct _WayX { way_t id; /*+ The way identifier; initially the OSM value, later the Way index. +*/ Way way; /*+ The real way data. +*/ }; /*+ A structure containing a set of ways (memory format). +*/ struct _WaysX { char *filename; /*+ The name of the intermediate file (for the WaysX). +*/ char *filename_tmp; /*+ The name of the temporary file (for the WaysX). +*/ int fd; /*+ The file descriptor of the open file (for the WaysX). +*/ index_t number; /*+ The number of extended ways still being considered. +*/ index_t knumber; /*+ The number of extended ways kept for next time. +*/ transports_t transports; /*+ The types of traffic that were seen when parsing. +*/ #if !SLIM WayX *data; /*+ The extended ways data (when mapped into memory). +*/ #else WayX cached[3]; /*+ Three cached extended ways read from the file in slim mode. +*/ index_t incache[3]; /*+ The indexes of the cached extended ways. +*/ WayXCache *cache; /*+ A RAM cache of extended ways read from the file. +*/ #endif char *ifilename_tmp; /*+ The name of the temporary file (for the ID index). +*/ int ifd; /*+ The file descriptor of the temporary file (for the ID index). +*/ way_t *idata; /*+ The extended way IDs (sorted by ID). +*/ char *ofilename_tmp; /*+ The name of the temporary file (for the ID offset index). +*/ int ofd; /*+ The file descriptor of the temporary file (for the ID offset index). +*/ offset_t *odata; /*+ The offset of the way in the file (used for error log). +*/ index_t *cdata; /*+ The compacted way IDs (same order as sorted ways). +*/ char *nfilename_tmp; /*+ The name of the temporary file (for the WaysX names). +*/ int nfd; /*+ The file descriptor of the temporary file (for the WaysX names). +*/ uint32_t nlength; /*+ The length of the string of name entries. +*/ }; /* Functions in waysx.c */ WaysX *NewWayList(int append,int readonly); void FreeWayList(WaysX *waysx,int keep); void AppendWayList(WaysX *waysx,way_t id,Way *way,node_t *nodes,int nnodes,const char *name); void FinishWayList(WaysX *waysx); index_t IndexWayX(WaysX *waysx,way_t id); void SortWayList(WaysX *waysx); SegmentsX *SplitWays(WaysX *waysx,NodesX *nodesx,int keep); void SortWayNames(WaysX *waysx); void CompactWayList(WaysX *waysx,SegmentsX *segmentsx); void SaveWayList(WaysX *waysx,const char *filename); /* Macros / inline functions */ #if !SLIM #define LookupWayX(waysx,index,position) &(waysx)->data[index] #define PutBackWayX(waysx,wayx) while(0) { /* nop */ } #else /* Prototypes */ static inline WayX *LookupWayX(WaysX *waysx,index_t index,int position); static inline void PutBackWayX(WaysX *waysx,WayX *wayx); CACHE_NEWCACHE_PROTO(WayX) CACHE_DELETECACHE_PROTO(WayX) CACHE_FETCHCACHE_PROTO(WayX) CACHE_REPLACECACHE_PROTO(WayX) CACHE_INVALIDATECACHE_PROTO(WayX) /* Data type */ CACHE_STRUCTURE(WayX) /* Inline functions */ CACHE_NEWCACHE(WayX) CACHE_DELETECACHE(WayX) CACHE_FETCHCACHE(WayX) CACHE_REPLACECACHE(WayX) CACHE_INVALIDATECACHE(WayX) /*++++++++++++++++++++++++++++++++++++++ Lookup a particular extended way with the specified id from the file on disk. WayX *LookupWayX Returns a pointer to a cached copy of the extended way. WaysX *waysx The set of ways to use. index_t index The way index to look for. int position The position in the cache to use. ++++++++++++++++++++++++++++++++++++++*/ static inline WayX *LookupWayX(WaysX *waysx,index_t index,int position) { waysx->cached[position-1]=*FetchCachedWayX(waysx->cache,index,waysx->fd,0); waysx->incache[position-1]=index; return(&waysx->cached[position-1]); } /*++++++++++++++++++++++++++++++++++++++ Put back an extended way's data into the file on disk. WaysX *waysx The set of ways to use. WayX *wayx The extended way to be put back. ++++++++++++++++++++++++++++++++++++++*/ static inline void PutBackWayX(WaysX *waysx,WayX *wayx) { int position1=wayx-&waysx->cached[0]; ReplaceCachedWayX(waysx->cache,wayx,waysx->incache[position1],waysx->fd,0); } #endif /* SLIM */ #endif /* WAYSX_H */ routino-3.4.3/src/mman-win32.h 644 233 144 5064 12531126220 11217 0/*************************************** Windows 32 memory management functions from https://code.google.com/p/mman-win32 File header comment created by Andrew M. Bishop, all source code unchanged from original. ******************/ /****************** Copyright (c) 2010,2012 Viktor Kutuzov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ***************************************/ #ifndef _SYS_MMAN_H_ #define _SYS_MMAN_H_ #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. #define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif /* All the headers include this file. */ #ifndef _MSC_VER #include <_mingw.h> #endif #include #ifdef __cplusplus extern "C" { #endif #define PROT_NONE 0 #define PROT_READ 1 #define PROT_WRITE 2 #define PROT_EXEC 4 #define MAP_FILE 0 #define MAP_SHARED 1 #define MAP_PRIVATE 2 #define MAP_TYPE 0xf #define MAP_FIXED 0x10 #define MAP_ANONYMOUS 0x20 #define MAP_ANON MAP_ANONYMOUS #define MAP_FAILED ((void *)-1) /* Flags for msync. */ #define MS_ASYNC 1 #define MS_SYNC 2 #define MS_INVALIDATE 4 void* mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off); int munmap(void *addr, size_t len); int mprotect(void *addr, size_t len, int prot); int msync(void *addr, size_t len, int flags); int mlock(const void *addr, size_t len); int munlock(const void *addr, size_t len); #ifdef __cplusplus }; #endif #endif /* _SYS_MMAN_H_ */ routino-3.4.3/src/segments.c 644 233 144 24107 13455663676 11221 0/*************************************** Segment data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include "types.h" #include "nodes.h" #include "segments.h" #include "ways.h" #include "fakes.h" #include "files.h" #include "profiles.h" /*++++++++++++++++++++++++++++++++++++++ Load in a segment list from a file. Segments *LoadSegmentList Returns the segment list that has just been loaded. const char *filename The name of the file to load. ++++++++++++++++++++++++++++++++++++++*/ Segments *LoadSegmentList(const char *filename) { Segments *segments; segments=(Segments*)malloc(sizeof(Segments)); #if !SLIM segments->data=MapFile(filename); /* Copy the SegmentsFile structure from the loaded data */ segments->file=*((SegmentsFile*)segments->data); /* Set the pointers in the Segments structure. */ segments->segments=(Segment*)(segments->data+sizeof(SegmentsFile)); #else segments->fd=SlimMapFile(filename); /* Copy the SegmentsFile header structure from the loaded data */ SlimFetch(segments->fd,&segments->file,sizeof(SegmentsFile),0); segments->cache=NewSegmentCache(); #ifndef LIBROUTINO log_malloc(segments->cache,sizeof(*segments->cache)); #endif #endif return(segments); } /*++++++++++++++++++++++++++++++++++++++ Destroy the segment list. Segments *segments The segment list to destroy. ++++++++++++++++++++++++++++++++++++++*/ void DestroySegmentList(Segments *segments) { #if !SLIM segments->data=UnmapFile(segments->data); #else segments->fd=SlimUnmapFile(segments->fd); #ifndef LIBROUTINO log_free(segments->cache); #endif DeleteSegmentCache(segments->cache); #endif free(segments); } /*++++++++++++++++++++++++++++++++++++++ Find the closest segment from a specified node heading in a particular direction and optionally profile. index_t FindClosestSegmentHeading Returns the closest heading segment index. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. index_t node1 The node to start from. double heading The desired heading from the node. Profile *profile The profile of the mode of transport (or NULL). ++++++++++++++++++++++++++++++++++++++*/ index_t FindClosestSegmentHeading(Nodes *nodes,Segments *segments,Ways *ways,index_t node1,double heading,Profile *profile) { Segment *segmentp; index_t best_seg=NO_SEGMENT; double best_difference=360; if(IsFakeNode(node1)) segmentp=FirstFakeSegment(node1); else { Node *nodep=LookupNode(nodes,node1,3); segmentp=FirstSegment(segments,nodep,1); } while(segmentp) { Way *wayp; index_t node2,seg2; double bearing,difference; node2=OtherNode(segmentp,node1); /* need this here because we use node2 at the end of the loop */ if(!IsNormalSegment(segmentp)) goto endloop; if(IsFakeNode(node1) || IsFakeNode(node2)) seg2=IndexFakeSegment(segmentp); else seg2=IndexSegment(segments,segmentp); wayp=LookupWay(ways,segmentp->way,1); if(!(wayp->allow&profile->transports)) goto endloop; if(profile->oneway && IsOnewayFrom(segmentp,node1)) { if(profile->transports!=Transports_Bicycle) goto endloop; if(!(wayp->type&Highway_CycleBothWays)) goto endloop; } bearing=BearingAngle(nodes,segmentp,node1); difference=(heading-bearing); if(difference<-180) difference+=360; if(difference> 180) difference-=360; if(difference<0) difference=-difference; if(differencespeed; speed_t speed2=profile->speed[HIGHWAY(wayp->type)]; distance_t distance=DISTANCE(segmentp->distance); if(speed1==0) { if(speed2==0) return(hours_to_duration(10)); else return distance_speed_to_duration(distance,speed2); } else /* if(speed1!=0) */ { if(speed2==0) return distance_speed_to_duration(distance,speed1); else if(speed1<=speed2) return distance_speed_to_duration(distance,speed1); else return distance_speed_to_duration(distance,speed2); } } /*++++++++++++++++++++++++++++++++++++++ Calculate the angle to turn at a junction from segment1 to segment2 at node. double TurnAngle Returns a value in the range -180 to +180 indicating the angle to turn. Nodes *nodes The set of nodes to use. Segment *segment1p The current segment. Segment *segment2p The next segment. index_t node The node at which they join. Straight ahead is zero, turning to the right is positive (e.g. +90 degrees) and turning to the left is negative (e.g. -90 degrees). Angles are calculated using flat Cartesian lat/long grid approximation (after scaling longitude due to latitude). ++++++++++++++++++++++++++++++++++++++*/ double TurnAngle(Nodes *nodes,Segment *segment1p,Segment *segment2p,index_t node) { double lat1,latm,lat2; double lon1,lonm,lon2; double angle1,angle2,angle; index_t node1,node2; node1=OtherNode(segment1p,node); node2=OtherNode(segment2p,node); if(IsFakeNode(node1)) GetFakeLatLong(node1,&lat1,&lon1); else GetLatLong(nodes,node1,NULL,&lat1,&lon1); if(IsFakeNode(node)) GetFakeLatLong(node,&latm,&lonm); else GetLatLong(nodes,node,NULL,&latm,&lonm); if(IsFakeNode(node2)) GetFakeLatLong(node2,&lat2,&lon2); else GetLatLong(nodes,node2,NULL,&lat2,&lon2); angle1=atan2((lonm-lon1)*cos(latm),(latm-lat1)); angle2=atan2((lon2-lonm)*cos(latm),(lat2-latm)); angle=angle2-angle1; angle=radians_to_degrees(angle); if(angle<-180) angle+=360; if(angle> 180) angle-=360; return(angle); } /*++++++++++++++++++++++++++++++++++++++ Calculate the bearing of a segment when heading to the given node. double BearingAngle Returns a value in the range 0 to 359 indicating the bearing. Nodes *nodes The set of nodes to use. Segment *segmentp The segment. index_t node The node to finish. Angles are calculated using flat Cartesian lat/long grid approximation (after scaling longitude due to latitude). ++++++++++++++++++++++++++++++++++++++*/ double BearingAngle(Nodes *nodes,Segment *segmentp,index_t node) { double lat1,lat2; double lon1,lon2; double angle; index_t node1,node2; node1=node; node2=OtherNode(segmentp,node); if(IsFakeNode(node1)) GetFakeLatLong(node1,&lat1,&lon1); else GetLatLong(nodes,node1,NULL,&lat1,&lon1); if(IsFakeNode(node2)) GetFakeLatLong(node2,&lat2,&lon2); else GetLatLong(nodes,node2,NULL,&lat2,&lon2); angle=atan2((lat2-lat1),(lon2-lon1)*cos(lat1)); angle=radians_to_degrees(angle); angle=270-angle; if(angle< 0) angle+=360; if(angle>360) angle-=360; return(angle); } routino-3.4.3/src/results.h 644 233 144 10356 13066777144 11075 0/*************************************** A header file for the results. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2017 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef RESULTS_H #define RESULTS_H /*+ To stop multiple inclusions. +*/ #include #include "types.h" /* Constants */ /* A fake result pointer. */ #define NO_RESULT ((Result*)~0) /*+ A result is not currently queued. +*/ #define NOT_QUEUED ((uint32_t)0) /* Data structures */ typedef struct _Result Result; /*+ The result for a node. +*/ struct _Result { index_t node; /*+ The node for which this result applies. +*/ index_t segment; /*+ The segmemt used to get to the node for which this result applies. +*/ Result *prev; /*+ The previous result following the best path to get to this node via the segment. +*/ Result *next; /*+ The next result following the best path from this node that was reached via the segment. +*/ score_t score; /*+ The best actual weighted distance or duration score from the start to the node. +*/ score_t sortby; /*+ The best possible weighted distance or duration score from the start to the finish. +*/ uint32_t queued; /*+ The position of this result in the queue. +*/ }; /*+ A list of results. +*/ typedef struct _Results { uint32_t nbins; /*+ The number of bins in the hash table. +*/ uint32_t mask; /*+ A bit mask to select the bottom log2(nbins) bits. +*/ uint32_t number; /*+ The total number of occupied results. +*/ Result **point; /*+ An array of nbins pointers to results in the data array. +*/ uint32_t ndata1; /*+ The size of the first dimension of the 'data' array. +*/ uint32_t ndata2; /*+ The size of the second dimension of the 'data' array. +*/ uint32_t nallocdata1; /*+ The amount of allocated space in the first dimension of the 'data' array. +*/ Result **data; /*+ An array of arrays containing the actual results, the first dimension is reallocated but the second dimension is not. Most importantly pointers into the real data don't change as more space is allocated (since realloc is not being used). +*/ index_t start_node; /*+ The start node. +*/ index_t prev_segment; /*+ The previous segment to get to the start node (if any). +*/ index_t finish_node; /*+ The finish node. +*/ index_t last_segment; /*+ The last segment (to arrive at the finish node). +*/ waypoint_t start_waypoint; /*+ The number of the starting waypoint. +*/ waypoint_t finish_waypoint; /*+ The number of the finish waypoint. +*/ } Results; /* Forward definition for opaque type */ typedef struct _Queue Queue; /* Results functions in results.c */ Results *NewResultsList(uint8_t log2bins); void ResetResultsList(Results *results); void FreeResultsList(Results *results); Result *InsertResult(Results *results,index_t node,index_t segment); Result *FindResult(Results *results,index_t node,index_t segment); Result *FirstResult(Results *results); Result *NextResult(Results *results,Result *result); /* Queue functions in queue.c */ Queue *NewQueueList(uint8_t log2bins); void ResetQueueList(Queue *queue); void FreeQueueList(Queue *queue); void InsertInQueue(Queue *queue,Result *result,score_t score); Result *PopFromQueue(Queue *queue); #endif /* RESULTS_H */ routino-3.4.3/src/errorlogx.h 644 233 144 4555 13454331526 11372 0/*************************************** Header file for error log file data types and processing function prototypes. Part of the Routino routing software. ******************/ /****************** This file Copyright 2013 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef ERRORLOGX_H #define ERRORLOGX_H /*+ To stop multiple inclusions. +*/ #include #include "types.h" #include "typesx.h" /*+ A structure containing information for an error message during processing. +*/ typedef struct _ErrorLogX { latlong_t latitude; /*+ The error message latitude. +*/ latlong_t longitude; /*+ The error message longitude. +*/ uint32_t offset; /*+ The offset of the error message from the beginning of the text file. +*/ uint32_t length; /*+ The length of the error message in the text file. +*/ } ErrorLogX; /*+ A structure containing a set of error logs (memory format). +*/ typedef struct _ErrorLogsX { index_t number; /*+ The number of error logs. +*/ index_t latbins; /*+ The number of bins containing latitude. +*/ index_t lonbins; /*+ The number of bins containing longitude. +*/ ll_bin_t latzero; /*+ The bin number of the furthest south bin. +*/ ll_bin_t lonzero; /*+ The bin number of the furthest west bin. +*/ } ErrorLogsX; /* Error log processing functions in errorlogx.c */ ErrorLogsX *NewErrorLogList(void); void FreeErrorLogList(ErrorLogsX *errorlogsx); void ProcessErrorLogs(ErrorLogsX *errorlogsx,NodesX *nodesx,WaysX *waysx,RelationsX *relationsx); void SortErrorLogsGeographically(ErrorLogsX *errorlogsx); void SaveErrorLogs(ErrorLogsX *errorlogsx,char *filename); #endif /* ERRORLOGX_H */ routino-3.4.3/src/results.c 644 233 144 16770 13517016361 11062 0/*************************************** Result data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2017 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include "results.h" #include "logging.h" #define HASH_NODE_SEGMENT(node,segment) ((node)^(segment<<4)) /*++++++++++++++++++++++++++++++++++++++ Allocate a new results list. Results *NewResultsList Returns the results list. uint8_t log2bins The base 2 logarithm of the initial number of bins in the results array. ++++++++++++++++++++++++++++++++++++++*/ Results *NewResultsList(uint8_t log2bins) { Results *results; results=(Results*)malloc(sizeof(Results)); results->nbins=1<mask=results->nbins-1; results->number=0; results->point=(Result**)calloc(results->nbins,sizeof(Result*)); #ifndef LIBROUTINO log_malloc(results->point,results->nbins*sizeof(Result*)); #endif results->ndata1=0; results->nallocdata1=0; results->ndata2=results->nbins>>2; results->data=NULL; results->start_node=NO_NODE; results->prev_segment=NO_SEGMENT; results->finish_node=NO_NODE; results->last_segment=NO_SEGMENT; results->start_waypoint=NO_WAYPOINT; results->finish_waypoint=NO_WAYPOINT; return(results); } /*++++++++++++++++++++++++++++++++++++++ Allocate a new results list. Results *results The results list to be reset. ++++++++++++++++++++++++++++++++++++++*/ void ResetResultsList(Results *results) { uint32_t i; results->number=0; results->ndata1=0; for(i=0;inbins;i++) results->point[i]=NULL; results->start_node=NO_NODE; results->prev_segment=NO_SEGMENT; results->finish_node=NO_NODE; results->last_segment=NO_SEGMENT; } /*++++++++++++++++++++++++++++++++++++++ Free a results list. Results *results The results list to be destroyed. ++++++++++++++++++++++++++++++++++++++*/ void FreeResultsList(Results *results) { uint32_t i; for(i=0;inallocdata1;i++) { #ifndef LIBROUTINO log_free(results->data[i]); #endif free(results->data[i]); } free(results->data); #ifndef LIBROUTINO log_free(results->point); #endif free(results->point); free(results); } /*++++++++++++++++++++++++++++++++++++++ Insert a single entry into the hashed list. The data is stored in a hash table with "Linear Probing" https://en.wikipedia.org/wiki/Linear_probing for handling collisions and this operation is adding an item to the hash table. Results *results The results structure to insert into. Result *result The result to insert. index_t node The node that is to be inserted into the results. index_t segment The segment that is to be inserted into the results. ++++++++++++++++++++++++++++++++++++++*/ static inline void insert_result(Results *results,Result *result,index_t node,index_t segment) { uint32_t bin=HASH_NODE_SEGMENT(node,segment)&results->mask; while(1) { Result *r=results->point[bin]; if(!r) break; bin=(bin+1)%results->nbins; } results->point[bin]=result; } /*++++++++++++++++++++++++++++++++++++++ Insert a new result into the results data structure in the right order. Result *InsertResult Returns the result that has been inserted. Results *results The results structure to insert into. index_t node The node that is to be inserted into the results. index_t segment The segment that is to be inserted into the results. ++++++++++++++++++++++++++++++++++++++*/ Result *InsertResult(Results *results,index_t node,index_t segment) { Result *result; /* Check if we have hit the limit on the number of entries */ if(results->number==(results->nbins/2)) { uint32_t n; #ifndef LIBROUTINO log_free(results->point); #endif free(results->point); results->nbins<<=1; results->mask=results->nbins-1; results->point=(Result**)calloc(results->nbins,sizeof(Result*)); #ifndef LIBROUTINO log_malloc(results->point,results->nbins*sizeof(Result*)); #endif for(n=0;nnumber;n++) { uint32_t i=n/results->ndata2; uint32_t j=n%results->ndata2; result=&results->data[i][j]; insert_result(results,result,result->node,result->segment); } } /* Check if we need more data space allocated */ if((results->number%results->ndata2)==0) { results->ndata1++; if(results->ndata1>=results->nallocdata1) { results->nallocdata1++; results->data=(Result**)realloc((void*)results->data,results->nallocdata1*sizeof(Result*)); results->data[results->nallocdata1-1]=(Result*)malloc(results->ndata2*sizeof(Result)); #ifndef LIBROUTINO log_malloc(results->data[results->nallocdata1-1],results->ndata2*sizeof(Result)); #endif } } /* Insert the new entry */ result=&results->data[results->ndata1-1][results->number%results->ndata2]; insert_result(results,result,node,segment); results->number++; /* Initialise the result */ result->node=node; result->segment=segment; result->prev=NULL; result->next=NULL; result->score=0; result->sortby=0; result->queued=NOT_QUEUED; return(result); } /*++++++++++++++++++++++++++++++++++++++ Find a result; search by node and segment. The data is stored in a hash table with "Linear Probing" https://en.wikipedia.org/wiki/Linear_probing for handling collisions and this operation is finding an item in the hash table. Result *FindResult Returns the result that has been found. Results *results The results structure to search. index_t node The node that is to be found. index_t segment The segment that was used to reach this node. ++++++++++++++++++++++++++++++++++++++*/ Result *FindResult(Results *results,index_t node,index_t segment) { uint32_t bin=HASH_NODE_SEGMENT(node,segment)&results->mask; while(1) { Result *r=results->point[bin]; if(!r) break; if(r->segment==segment && r->node==node) return(r); bin=(bin+1)%results->nbins; } return(NULL); } /*++++++++++++++++++++++++++++++++++++++ Find the first result from a set of results. Result *FirstResult Returns the first result. Results *results The set of results. ++++++++++++++++++++++++++++++++++++++*/ Result *FirstResult(Results *results) { return(&results->data[0][0]); } /*++++++++++++++++++++++++++++++++++++++ Find the next result from a set of results. Result *NextResult Returns the next result. Results *results The set of results. Result *result The previous result. ++++++++++++++++++++++++++++++++++++++*/ Result *NextResult(Results *results,Result *result) { uint32_t i; size_t j=0; for(i=0;indata1;i++) if(result>=results->data[i]) { j=result-results->data[i]; if(jndata2) break; } if(++j>=results->ndata2) {i++;j=0;} if((i*results->ndata2+j)>=results->number) return(NULL); return(&results->data[i][j]); } routino-3.4.3/src/tagging.c 644 233 144 66160 14664130435 11002 0/*************************************** Load the tagging rules from a file and the functions for handling them. Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2015, 2024 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include #include "files.h" #include "tagging.h" #include "xmlparse.h" #include "logging.h" /* Constants */ #define TAGACTION_IF 1 #define TAGACTION_IFNOT 2 #define TAGACTION_INHERIT 3 /* Not a real action, just a marker */ #define TAGACTION_SET 4 #define TAGACTION_UNSET 5 #define TAGACTION_OUTPUT 6 #define TAGACTION_LOGERROR 7 static const char* const default_logerror_message="ignoring it"; /* Local variable (intialised before each use) */ static int64_t current_id; /* Local parsing variables (re-initialised by DeleteXMLTaggingRules() function) */ static TaggingRuleList NodeRules={NULL,0}; static TaggingRuleList WayRules={NULL,0}; static TaggingRuleList RelationRules={NULL,0}; static int current_list_stack_depth=0; static TaggingRuleList **current_list_stack=NULL; static TaggingRuleList *current_list=NULL; /* Local parsing functions */ static TaggingRuleList *AppendTaggingRule(TaggingRuleList *rules,const char *k,const char *v,int action); static void AppendTaggingAction(TaggingRuleList *rules,const char *k,const char *v,int action,const char *message); static void DeleteTaggingRuleList(TaggingRuleList *rules); static void ApplyRules(TaggingRuleList *rules,TagList *input,TagList *output,const char *match_k,const char *match_v); /* The XML tag processing function prototypes */ //static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding); //static int RoutinoTaggingType_function(const char *_tag_,int _type_); static int NodeType_function(const char *_tag_,int _type_); static int WayType_function(const char *_tag_,int _type_); static int RelationType_function(const char *_tag_,int _type_); static int IfType_function(const char *_tag_,int _type_,const char *k,const char *v); static int IfNotType_function(const char *_tag_,int _type_,const char *k,const char *v); static int SetType_function(const char *_tag_,int _type_,const char *k,const char *v); static int UnsetType_function(const char *_tag_,int _type_,const char *k); static int OutputType_function(const char *_tag_,int _type_,const char *k,const char *v); static int LogErrorType_function(const char *_tag_,int _type_,const char *k,const char *v,const char *message); /* The XML tag definitions (forward declarations) */ static const xmltag xmlDeclaration_tag; static const xmltag RoutinoTaggingType_tag; static const xmltag NodeType_tag; static const xmltag WayType_tag; static const xmltag RelationType_tag; static const xmltag IfType_tag; static const xmltag IfNotType_tag; static const xmltag SetType_tag; static const xmltag UnsetType_tag; static const xmltag OutputType_tag; static const xmltag LogErrorType_tag; /* The XML tag definition values */ /*+ The complete set of tags at the top level. +*/ static const xmltag * const xml_toplevel_tags[]={&xmlDeclaration_tag,&RoutinoTaggingType_tag,NULL}; /*+ The xmlDeclaration type tag. +*/ static const xmltag xmlDeclaration_tag= {"xml", 2, {"version","encoding"}, NULL, {NULL}}; /*+ The RoutinoTaggingType type tag. +*/ static const xmltag RoutinoTaggingType_tag= {"routino-tagging", 0, {NULL}, NULL, {&NodeType_tag,&WayType_tag,&RelationType_tag,NULL}}; /*+ The NodeType type tag. +*/ static const xmltag NodeType_tag= {"node", 0, {NULL}, NodeType_function, {&IfType_tag,&IfNotType_tag,NULL}}; /*+ The WayType type tag. +*/ static const xmltag WayType_tag= {"way", 0, {NULL}, WayType_function, {&IfType_tag,&IfNotType_tag,NULL}}; /*+ The RelationType type tag. +*/ static const xmltag RelationType_tag= {"relation", 0, {NULL}, RelationType_function, {&IfType_tag,&IfNotType_tag,NULL}}; /*+ The IfType type tag. +*/ static const xmltag IfType_tag= {"if", 2, {"k","v"}, IfType_function, {&IfType_tag,&IfNotType_tag,&SetType_tag,&UnsetType_tag,&OutputType_tag,&LogErrorType_tag,NULL}}; /*+ The IfNotType type tag. +*/ static const xmltag IfNotType_tag= {"ifnot", 2, {"k","v"}, IfNotType_function, {&IfType_tag,&IfNotType_tag,&SetType_tag,&UnsetType_tag,&OutputType_tag,&LogErrorType_tag,NULL}}; /*+ The SetType type tag. +*/ static const xmltag SetType_tag= {"set", 2, {"k","v"}, SetType_function, {NULL}}; /*+ The UnsetType type tag. +*/ static const xmltag UnsetType_tag= {"unset", 1, {"k"}, UnsetType_function, {NULL}}; /*+ The OutputType type tag. +*/ static const xmltag OutputType_tag= {"output", 2, {"k","v"}, OutputType_function, {NULL}}; /*+ The LogErrorType type tag. +*/ static const xmltag LogErrorType_tag= {"logerror", 3, {"k","v","message"}, LogErrorType_function, {NULL}}; /* The XML tag processing functions */ /*++++++++++++++++++++++++++++++++++++++ The function that is called when the XML declaration is seen int xmlDeclaration_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *version The contents of the 'version' attribute (or NULL if not defined). const char *encoding The contents of the 'encoding' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ //static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the RoutinoTaggingType XSD type is seen int RoutinoTaggingType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int RoutinoTaggingType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the NodeType XSD type is seen int NodeType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ static int NodeType_function(const char *_tag_,int _type_) { if(_type_&XMLPARSE_TAG_START) { current_list_stack_depth=0; current_list=&NodeRules; } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the WayType XSD type is seen int WayType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ static int WayType_function(const char *_tag_,int _type_) { if(_type_&XMLPARSE_TAG_START) { current_list_stack_depth=0; current_list=&WayRules; } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the RelationType XSD type is seen int RelationType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ static int RelationType_function(const char *_tag_,int _type_) { if(_type_&XMLPARSE_TAG_START) { current_list_stack_depth=0; current_list=&RelationRules; } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the IfType XSD type is seen int IfType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *k The contents of the 'k' attribute (or NULL if not defined). const char *v The contents of the 'v' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int IfType_function(const char *_tag_,int _type_,const char *k,const char *v) { if(_type_&XMLPARSE_TAG_START) { if(!current_list_stack || (current_list_stack_depth%8)==7) current_list_stack=(TaggingRuleList**)realloc((void*)current_list_stack,(current_list_stack_depth+8)*sizeof(TaggingRuleList*)); current_list_stack[current_list_stack_depth++]=current_list; current_list=AppendTaggingRule(current_list,k,v,TAGACTION_IF); } if(_type_&XMLPARSE_TAG_END) current_list=current_list_stack[--current_list_stack_depth]; return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the IfNotType XSD type is seen int IfNotType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *k The contents of the 'k' attribute (or NULL if not defined). const char *v The contents of the 'v' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int IfNotType_function(const char *_tag_,int _type_,const char *k,const char *v) { if(_type_&XMLPARSE_TAG_START) { if(!current_list_stack || (current_list_stack_depth%8)==7) current_list_stack=(TaggingRuleList**)realloc((void*)current_list_stack,(current_list_stack_depth+8)*sizeof(TaggingRuleList*)); current_list_stack[current_list_stack_depth++]=current_list; current_list=AppendTaggingRule(current_list,k,v,TAGACTION_IFNOT); } if(_type_&XMLPARSE_TAG_END) current_list=current_list_stack[--current_list_stack_depth]; return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the SetType XSD type is seen int SetType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *k The contents of the 'k' attribute (or NULL if not defined). const char *v The contents of the 'v' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int SetType_function(const char *_tag_,int _type_,const char *k,const char *v) { if(_type_&XMLPARSE_TAG_START) AppendTaggingAction(current_list,k,v,TAGACTION_SET,NULL); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the UnsetType XSD type is seen int UnsetType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *k The contents of the 'k' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int UnsetType_function(const char *_tag_,int _type_,const char *k) { if(_type_&XMLPARSE_TAG_START) AppendTaggingAction(current_list,k,NULL,TAGACTION_UNSET,NULL); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the OutputType XSD type is seen int OutputType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *k The contents of the 'k' attribute (or NULL if not defined). const char *v The contents of the 'v' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int OutputType_function(const char *_tag_,int _type_,const char *k,const char *v) { if(_type_&XMLPARSE_TAG_START) AppendTaggingAction(current_list,k,v,TAGACTION_OUTPUT,NULL); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the LogErrorType XSD type is seen int LogErrorType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *k The contents of the 'k' attribute (or NULL if not defined). const char *v The contents of the 'v' attribute (or NULL if not defined). const char *message The contents of the 'message' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int LogErrorType_function(const char *_tag_,int _type_,const char *k,const char *v,const char *message) { if(_type_&XMLPARSE_TAG_START) AppendTaggingAction(current_list,k,v,TAGACTION_LOGERROR,message); return(0); } /*++++++++++++++++++++++++++++++++++++++ The XML tagging rules parser. int ParseXMLTaggingRules Returns 0 if OK or something else in case of an error. const char *filename The name of the file to read. ++++++++++++++++++++++++++++++++++++++*/ int ParseXMLTaggingRules(const char *filename) { int fd; int retval; if(!ExistsFile(filename)) { fprintf(stderr,"Error: Specified tagging rules file '%s' does not exist.\n",filename); return(1); } fd=OpenFile(filename); /* Initialise variables used for parsing */ retval=ParseXML(fd,xml_toplevel_tags,XMLPARSE_UNKNOWN_ATTR_ERRNONAME); CloseFile(fd); if(current_list_stack) free(current_list_stack); if(retval) return(1); return(0); } /*++++++++++++++++++++++++++++++++++++++ Delete the tagging rules loaded from the XML file. ++++++++++++++++++++++++++++++++++++++*/ void DeleteXMLTaggingRules(void) { current_list_stack_depth=0; current_list_stack=NULL; current_list=NULL; DeleteTaggingRuleList(&NodeRules); DeleteTaggingRuleList(&WayRules); DeleteTaggingRuleList(&RelationRules); } /*++++++++++++++++++++++++++++++++++++++ Append a tagging rule to the list of rules. TaggingRuleList *AppendTaggingRule Returns the new TaggingRuleList inside the new TaggingRule. TaggingRuleList *rules The list of rules to add to. const char *k The tag key. const char *v The tag value. int action Set to the type of action. ++++++++++++++++++++++++++++++++++++++*/ TaggingRuleList *AppendTaggingRule(TaggingRuleList *rules,const char *k,const char *v,int action) { if((rules->nrules%16)==0) rules->rules=(TaggingRule*)realloc((void*)rules->rules,(rules->nrules+16)*sizeof(TaggingRule)); rules->nrules++; rules->rules[rules->nrules-1].action=action; if(k) rules->rules[rules->nrules-1].k=strcpy(malloc(strlen(k)+1),k); else rules->rules[rules->nrules-1].k=NULL; if(v) rules->rules[rules->nrules-1].v=strcpy(malloc(strlen(v)+1),v); else rules->rules[rules->nrules-1].v=NULL; rules->rules[rules->nrules-1].message=NULL; rules->rules[rules->nrules-1].rulelist=(TaggingRuleList*)calloc(1,sizeof(TaggingRuleList)); return(rules->rules[rules->nrules-1].rulelist); } /*++++++++++++++++++++++++++++++++++++++ Append a tagging action to the list of rules. TaggingRuleList *rules The list of rules to add to. const char *k The tag key. const char *v The tag value. int action Set to the type of action. const char *message The message to use for the logerror action. ++++++++++++++++++++++++++++++++++++++*/ static void AppendTaggingAction(TaggingRuleList *rules,const char *k,const char *v,int action,const char *message) { if((rules->nrules%16)==0) rules->rules=(TaggingRule*)realloc((void*)rules->rules,(rules->nrules+16)*sizeof(TaggingRule)); rules->nrules++; rules->rules[rules->nrules-1].action=action; if(k) rules->rules[rules->nrules-1].k=strcpy(malloc(strlen(k)+1),k); else rules->rules[rules->nrules-1].k=NULL; if(v) rules->rules[rules->nrules-1].v=strcpy(malloc(strlen(v)+1),v); else rules->rules[rules->nrules-1].v=NULL; if(message) rules->rules[rules->nrules-1].message=strcpy(malloc(strlen(message)+1),message); else rules->rules[rules->nrules-1].message=(char*)default_logerror_message; rules->rules[rules->nrules-1].rulelist=NULL; } /*++++++++++++++++++++++++++++++++++++++ Delete a tagging rule. TaggingRuleList *rules The list of rules to be deleted. ++++++++++++++++++++++++++++++++++++++*/ void DeleteTaggingRuleList(TaggingRuleList *rules) { int i; for(i=0;inrules;i++) { if(rules->rules[i].k) free(rules->rules[i].k); if(rules->rules[i].v) free(rules->rules[i].v); if(rules->rules[i].message && rules->rules[i].message!=default_logerror_message) free(rules->rules[i].message); if(rules->rules[i].rulelist) { DeleteTaggingRuleList(rules->rules[i].rulelist); free(rules->rules[i].rulelist); } } if(rules->rules) free(rules->rules); rules->rules=NULL; rules->nrules=0; } /*++++++++++++++++++++++++++++++++++++++ Create a new TagList structure. TagList *NewTagList Returns the new allocated TagList. ++++++++++++++++++++++++++++++++++++++*/ TagList *NewTagList(void) { return((TagList*)calloc(1,sizeof(TagList))); } /*++++++++++++++++++++++++++++++++++++++ Delete a tag list and the contents. TagList *tags The list of tags to delete. ++++++++++++++++++++++++++++++++++++++*/ void DeleteTagList(TagList *tags) { int i; for(i=0;intags;i++) { if(tags->k[i]) free(tags->k[i]); if(tags->v[i]) free(tags->v[i]); } if(tags->k) free(tags->k); if(tags->v) free(tags->v); free(tags); } /*++++++++++++++++++++++++++++++++++++++ Append a tag to the list of tags. TagList *tags The list of tags to add to. const char *k The tag key. const char *v The tag value. ++++++++++++++++++++++++++++++++++++++*/ void AppendTag(TagList *tags,const char *k,const char *v) { if((tags->ntags%8)==0) { int i; tags->k=(char**)realloc((void*)tags->k,(tags->ntags+8)*sizeof(char*)); tags->v=(char**)realloc((void*)tags->v,(tags->ntags+8)*sizeof(char*)); for(i=tags->ntags;i<(tags->ntags+8);i++) tags->k[i]=tags->v[i]=NULL; } tags->k[tags->ntags]=strcpy(realloc(tags->k[tags->ntags],strlen(k)+1),k); tags->v[tags->ntags]=strcpy(realloc(tags->v[tags->ntags],strlen(v)+1),v); tags->ntags++; } /*++++++++++++++++++++++++++++++++++++++ Modify an existing tag or append a new tag to the list of tags. TagList *tags The list of tags to modify. const char *k The tag key. const char *v The tag value. ++++++++++++++++++++++++++++++++++++++*/ void ModifyTag(TagList *tags,const char *k,const char *v) { int i; for(i=0;intags;i++) if(!strcmp(tags->k[i],k)) { tags->v[i]=strcpy(realloc(tags->v[i],strlen(v)+1),v); return; } AppendTag(tags,k,v); } /*++++++++++++++++++++++++++++++++++++++ Delete an existing tag from the list of tags. TagList *tags The list of tags to modify. const char *k The tag key. ++++++++++++++++++++++++++++++++++++++*/ void DeleteTag(TagList *tags,const char *k) { int i,j; for(i=0;intags;i++) if(!strcmp(tags->k[i],k)) { if(tags->k[i]) free(tags->k[i]); if(tags->v[i]) free(tags->v[i]); for(j=i+1;jntags;j++) { tags->k[j-1]=tags->k[j]; tags->v[j-1]=tags->v[j]; } tags->ntags--; tags->k[tags->ntags]=NULL; tags->v[tags->ntags]=NULL; return; } } /*++++++++++++++++++++++++++++++++++++++ Create a string containing all of the tags formatted as if HTML. char *StringifyTag Returns a static pointer to the created string. TagList *tags The list of tags to convert. ++++++++++++++++++++++++++++++++++++++*/ char *StringifyTag(TagList *tags) { static char *string=NULL; /* static allocation of return value */ int i,length=0,used=0; for(i=0;intags;i++) { length+=strlen(tags->k[i]); length+=strlen(tags->v[i]); length+=16; } string=realloc((char*)string,length); for(i=0;intags;i++) used+=sprintf(string+used,"",tags->k[i],tags->v[i]); return(string); } /*++++++++++++++++++++++++++++++++++++++ Apply a set of tagging rules to a set of node tags. TagList *ApplyNodeTaggingRules Returns the list of output tags after modification. TagList *tags The tags to be modified. int64_t id The ID of the node. ++++++++++++++++++++++++++++++++++++++*/ TagList *ApplyNodeTaggingRules(TagList *tags,int64_t id) { TagList *result=NewTagList(); current_id=id; current_list=&NodeRules; ApplyRules(current_list,tags,result,NULL,NULL); return(result); } /*++++++++++++++++++++++++++++++++++++++ Apply a set of tagging rules to a set of way tags. TagList *ApplyWayTaggingRules Returns the list of output tags after modification. TagList *tags The tags to be modified. int64_t id The ID of the way. ++++++++++++++++++++++++++++++++++++++*/ TagList *ApplyWayTaggingRules(TagList *tags,int64_t id) { TagList *result=NewTagList(); current_id=id; current_list=&WayRules; ApplyRules(current_list,tags,result,NULL,NULL); return(result); } /*++++++++++++++++++++++++++++++++++++++ Apply a set of tagging rules to a set of relation tags. TagList *ApplyRelationTaggingRules Returns the list of output tags after modification. TagList *tags The tags to be modified. int64_t id The ID of the relation. ++++++++++++++++++++++++++++++++++++++*/ TagList *ApplyRelationTaggingRules(TagList *tags,int64_t id) { TagList *result=NewTagList(); current_id=id; current_list=&RelationRules; ApplyRules(current_list,tags,result,NULL,NULL); return(result); } /*++++++++++++++++++++++++++++++++++++++ Apply a set of rules to a matching tag. TaggingRuleList *rules The rules that are to be matched. TagList *input The input tags. TagList *output The output tags. const char *match_k The key matched at the higher level rule. const char *match_v The value matched at the higher level rule. ++++++++++++++++++++++++++++++++++++++*/ static void ApplyRules(TaggingRuleList *rules,TagList *input,TagList *output,const char *match_k,const char *match_v) { int i,j; char *match_k_copy=NULL,*match_v_copy=NULL; if(match_k) match_k_copy=strcpy(malloc(strlen(match_k)+1),match_k); if(match_v) match_v_copy=strcpy(malloc(strlen(match_v)+1),match_v); for(i=0;inrules;i++) { const char *k,*v; k=rules->rules[i].k; if(!k && rules->rules[i].action >= TAGACTION_INHERIT) k=match_k_copy; v=rules->rules[i].v; if(!v && rules->rules[i].action >= TAGACTION_INHERIT) v=match_v_copy; switch(rules->rules[i].action) { case TAGACTION_IF: if(k && v) { for(j=0;jntags;j++) if(!strcmp(input->k[j],k) && !strcmp(input->v[j],v)) ApplyRules(rules->rules[i].rulelist,input,output,input->k[j],input->v[j]); } else if(k && !v) { for(j=0;jntags;j++) if(!strcmp(input->k[j],k)) ApplyRules(rules->rules[i].rulelist,input,output,input->k[j],input->v[j]); } else if(!k && v) { for(j=0;jntags;j++) if(!strcmp(input->v[j],v)) ApplyRules(rules->rules[i].rulelist,input,output,input->k[j],input->v[j]); } else /* if(!k && !v) */ { if(!input->ntags) ApplyRules(rules->rules[i].rulelist,input,output,"",""); else for(j=0;jntags;j++) ApplyRules(rules->rules[i].rulelist,input,output,input->k[j],input->v[j]); } break; case TAGACTION_IFNOT: if(k && v) { for(j=0;jntags;j++) if(!strcmp(input->k[j],k) && !strcmp(input->v[j],v)) break; if(j!=input->ntags) break; } else if(k && !v) { for(j=0;jntags;j++) if(!strcmp(input->k[j],k)) break; if(j!=input->ntags) break; } else if(!k && v) { for(j=0;jntags;j++) if(!strcmp(input->v[j],v)) break; if(j!=input->ntags) break; } else /* if(!k && !v) */ { break; } ApplyRules(rules->rules[i].rulelist,input,output,k,v); break; case TAGACTION_SET: ModifyTag(input,k,v); break; case TAGACTION_UNSET: DeleteTag(input,k); break; case TAGACTION_OUTPUT: ModifyTag(output,k,v); break; case TAGACTION_LOGERROR: if(rules->rules[i].k && !rules->rules[i].v) for(j=0;jntags;j++) if(!strcmp(input->k[j],rules->rules[i].k)) { v=input->v[j]; break; } if(current_list==&NodeRules) logerror("Node %"Pnode_t" has an unrecognised tag '%s' = '%s' (in tagging rules); %s.\n",logerror_node(current_id),k,v,rules->rules[i].message); if(current_list==&WayRules) logerror("Way %"Pway_t" has an unrecognised tag '%s' = '%s' (in tagging rules); %s.\n",logerror_way(current_id),k,v,rules->rules[i].message); if(current_list==&RelationRules) logerror("Relation %"Prelation_t" has an unrecognised tag '%s' = '%s' (in tagging rules); %s.\n",logerror_relation(current_id),k,v,rules->rules[i].message); } } if(match_k_copy) free(match_k_copy); if(match_v_copy) free(match_v_copy); } routino-3.4.3/src/osmparser.h 644 233 144 4256 14454034334 11356 0/*************************************** Header file for OSM parser function prototype. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2014, 2023 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef OSMPARSER_H #define OSMPARSER_H /*+ To stop multiple inclusions. +*/ #include #include "typesx.h" #include "xmlparse.h" #include "tagging.h" /* Constants */ #define MODE_NORMAL 3 #define MODE_CREATE 2 #define MODE_MODIFY 1 #define MODE_DELETE -1 /* Functions in osmxmlparse.c */ int ParseOSMFile(int fd,NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations); int ParseOSCFile(int fd,NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations); /* Functions in osmpbfparse.c */ int ParsePBFFile(int fd,NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations); /* Functions in osmo5mparse.c */ int ParseO5MFile(int fd,NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations); int ParseO5CFile(int fd,NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations); /* Functions in osmparser.c */ void InitialiseParser(NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations); void CleanupParser(void); void AddWayRefs(int64_t node_id); void AddRelationRefs(int64_t node_id,int64_t way_id,int64_t relation_id,const char *role); void AddNode(int64_t node_id,double latitude,double longitude,int mode,TagList *raw_tags); void AddWay(int64_t way_id, int mode,TagList *raw_tags); void AddRelation(int64_t relation_id,int mode,TagList *raw_tags); #endif /* OSMPARSER_H */ routino-3.4.3/src/routino.c 644 233 144 53533 14664130432 11056 0/*************************************** Routino library functions file. Part of the Routino routing software. ******************/ /****************** This file Copyright 2015-2017, 2019, 2020, 2024 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include "routino.h" #include "types.h" #include "nodes.h" #include "segments.h" #include "ways.h" #include "relations.h" #include "fakes.h" #include "results.h" #include "functions.h" #include "profiles.h" #include "translations.h" #include "version.h" /* Global variables */ /*+ Contains the libroutino API version number. +*/ DLL_PUBLIC const int Routino_APIVersion=ROUTINO_API_VERSION; /*+ Contains the Routino version number. +*/ DLL_PUBLIC const char *Routino_Version=ROUTINO_VERSION; /*+ Contains the error number of the most recent Routino function (one of the ROUTINO_ERROR_* values). +*/ DLL_PUBLIC int Routino_errno=ROUTINO_ERROR_NONE; /*+ The function to be called to report on the routing progress. +*/ Routino_ProgressFunc progress_func=NULL; /*+ The current state of the routing progress. +*/ double progress_value=0; /*+ Set when the progress callback returns false in the routing function. +*/ int progress_abort=0; /*+ The option to calculate the quickest route insted of the shortest. +*/ extern int option_quickest; /*+ The options to select the format of the file output. +*/ extern int option_file_html,option_file_gpx_track,option_file_gpx_route,option_file_text,option_file_text_all,option_file_stdout; /*+ The options to select the format of the linked list output. +*/ extern int option_list_html,option_list_html_all,option_list_text,option_list_text_all; /* Static variables */ static distance_t distmax=km_to_distance(1); /* Local types */ struct _Routino_Database { Nodes *nodes; Segments *segments; Ways *ways; Relations *relations; }; struct _Routino_Waypoint { index_t segment; index_t node1,node2; distance_t dist1,dist2; }; /*++++++++++++++++++++++++++++++++++++++ Check the version of the library used by the caller against the library version int Routino_Check_API_Version Returns ROUTINO_ERROR_NONE if OK or ROUTINO_ERROR_WRONG_VERSION if there is an error. int caller_version The version of the API used in the caller. This function should not be called directly, use the macro Routino_CheckAPIVersion() which takes no arguments. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC int Routino_Check_API_Version(int caller_version) { if(caller_version==Routino_APIVersion) return(ROUTINO_ERROR_NONE); else return(ROUTINO_ERROR_WRONG_API_VERSION); } /*++++++++++++++++++++++++++++++++++++++ Load a database of files for Routino to use for routing. Routino_Database *Routino_LoadDatabase Returns a pointer to the database. const char *dirname The pathname of the directory containing the database files. const char *prefix The prefix of the database files. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC Routino_Database *Routino_LoadDatabase(const char *dirname,const char *prefix) { char *nodes_filename; char *segments_filename; char *ways_filename; char *relations_filename; Routino_Database *database=NULL; nodes_filename =FileName(dirname,prefix,"nodes.mem"); segments_filename =FileName(dirname,prefix,"segments.mem"); ways_filename =FileName(dirname,prefix,"ways.mem"); relations_filename=FileName(dirname,prefix,"relations.mem"); if(!ExistsFile(nodes_filename) || !ExistsFile(segments_filename) || !ExistsFile(ways_filename) || !ExistsFile(relations_filename)) { Routino_errno=ROUTINO_ERROR_NO_DATABASE_FILES; return(NULL); } else { database=calloc(1,sizeof(Routino_Database)); database->nodes =LoadNodeList (nodes_filename); database->segments =LoadSegmentList (segments_filename); database->ways =LoadWayList (ways_filename); database->relations=LoadRelationList(relations_filename); } free(nodes_filename); free(segments_filename); free(ways_filename); free(relations_filename); if(!database->nodes || !database->segments || !database->ways || !database->relations) { Routino_UnloadDatabase(database); database=NULL; Routino_errno=ROUTINO_ERROR_BAD_DATABASE_FILES; } if(database) { Routino_errno=ROUTINO_ERROR_NONE; return(database); } else return(NULL); } /*++++++++++++++++++++++++++++++++++++++ Close the database files that were opened by a call to Routino_LoadDatabase(). Routino_Database *database The database to close. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC void Routino_UnloadDatabase(Routino_Database *database) { if(!database) Routino_errno=ROUTINO_ERROR_NO_DATABASE; else { if(database->nodes) DestroyNodeList (database->nodes); if(database->segments) DestroySegmentList (database->segments); if(database->ways) DestroyWayList (database->ways); if(database->relations) DestroyRelationList(database->relations); free(database); Routino_errno=ROUTINO_ERROR_NONE; } } /*++++++++++++++++++++++++++++++++++++++ Parse a Routino XML file containing profiles, must be called before selecting a profile. int Routino_ParseXMLProfiles Returns non-zero in case of an error or zero if there was no error. const char *filename The full pathname of the file to read. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC int Routino_ParseXMLProfiles(const char *filename) { int retval; retval=ParseXMLProfiles(filename,NULL,1); if(retval==1) retval=ROUTINO_ERROR_NO_PROFILES_XML; else if(retval==2) retval=ROUTINO_ERROR_BAD_PROFILES_XML; Routino_errno=retval; return(retval); } /*++++++++++++++++++++++++++++++++++++++ Return a list of the profile names that have been loaded from the XML file. char **Routino_GetProfileNames Returns a NULL terminated list of strings - all allocated. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC char **Routino_GetProfileNames(void) { Routino_errno=ROUTINO_ERROR_NONE; return(GetProfileNames()); } /*++++++++++++++++++++++++++++++++++++++ Select a specific routing profile from the set of Routino profiles that have been loaded from the XML file or NULL in case of an error. Routino_Profile *Routino_GetProfile Returns a pointer to an internal data structure - do not free. const char *name The name of the profile to select. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC Routino_Profile *Routino_GetProfile(const char *name) { Profile *profile=GetProfile(name); if(profile) Routino_errno=ROUTINO_ERROR_NONE; else Routino_errno=ROUTINO_ERROR_NO_SUCH_PROFILE; return(profile); } /*++++++++++++++++++++++++++++++++++++++ Free the internal memory that was allocated for the Routino profiles loaded from the XML file. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC void Routino_FreeXMLProfiles(void) { Routino_errno=ROUTINO_ERROR_NONE; FreeXMLProfiles(); } /*++++++++++++++++++++++++++++++++++++++ Parse a Routino XML file containing translations, must be called before selecting a translation. int Routino_ParseXMLTranslations Returns non-zero in case of an error or zero if there was no error. const char *filename The full pathname of the file to read. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC int Routino_ParseXMLTranslations(const char *filename) { int retval; retval=ParseXMLTranslations(filename,NULL,1); if(retval==1) retval=ROUTINO_ERROR_NO_TRANSLATIONS_XML; else if(retval==2) retval=ROUTINO_ERROR_BAD_TRANSLATIONS_XML; Routino_errno=retval; return(retval); } /*++++++++++++++++++++++++++++++++++++++ Return a list of the translation languages that have been loaded from the XML file. char **Routino_GetTranslationLanguages Returns a NULL terminated list of strings - all allocated. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC char **Routino_GetTranslationLanguages(void) { Routino_errno=ROUTINO_ERROR_NONE; return(GetTranslationLanguages()); } /*++++++++++++++++++++++++++++++++++++++ Return a list of the full names of the translation languages that have been loaded from the XML file. char **Routino_GetTranslationLanguageFullNames Returns a NULL terminated list of strings - all allocated. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC char **Routino_GetTranslationLanguageFullNames(void) { Routino_errno=ROUTINO_ERROR_NONE; return(GetTranslationLanguageFullNames()); } /*++++++++++++++++++++++++++++++++++++++ Select a specific translation from the set of Routino translations that have been loaded from the XML file or NULL in case of an error. Routino_Translation *Routino_GetTranslation Returns a pointer to an internal data structure - do not free. const char *language The language to select (as a country code, e.g. 'en', 'de') or an empty string for the first in the file or NULL for the built-in English version. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC Routino_Translation *Routino_GetTranslation(const char *language) { Translation *translation=GetTranslation(language); if(translation) Routino_errno=ROUTINO_ERROR_NONE; else Routino_errno=ROUTINO_ERROR_NO_SUCH_TRANSLATION; return(translation); } /*++++++++++++++++++++++++++++++++++++++ Free the internal memory that was allocated for the Routino translations loaded from the XML file. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC void Routino_FreeXMLTranslations(void) { Routino_errno=ROUTINO_ERROR_NONE; FreeXMLTranslations(); } /*++++++++++++++++++++++++++++++++++++++ Create a fully formed Routino Profile from a Routino User Profile. Routino_Profile *Routino_CreateProfileFromUserProfile Returns an allocated Routino Profile. Routino_UserProfile *profile The user specified profile to convert (not modified by this). ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC Routino_Profile *Routino_CreateProfileFromUserProfile(Routino_UserProfile *profile) { Routino_Profile *rprofile=calloc(1,sizeof(Routino_Profile)); int i; Routino_errno=ROUTINO_ERROR_NONE; if(!profile) { Routino_errno=ROUTINO_ERROR_NO_PROFILE; free(rprofile); return(NULL); } if(profile->transport<=0 || profile->transport>=Transport_Count) Routino_errno=ROUTINO_ERROR_BAD_USER_PROFILE; else rprofile->transport=profile->transport; for(i=1;ihighway[i]<0 || profile->highway[i]>1) Routino_errno=ROUTINO_ERROR_BAD_USER_PROFILE; else rprofile->highway[i]=profile->highway[i]; if(profile->speed[i]<=0) Routino_errno=ROUTINO_ERROR_BAD_USER_PROFILE; else rprofile->speed[i]=kph_to_speed(profile->speed[i]); } for(i=1;iprops[i]<0 || profile->props[i]>1) Routino_errno=ROUTINO_ERROR_BAD_USER_PROFILE; else rprofile->props[i]=profile->props[i]; } if(profile->weight<=0) Routino_errno=ROUTINO_ERROR_BAD_USER_PROFILE; else rprofile->weight=tonnes_to_weight(profile->weight); if(profile->height<=0) Routino_errno=ROUTINO_ERROR_BAD_USER_PROFILE; else rprofile->height=metres_to_height(profile->height); if(profile->width<=0) Routino_errno=ROUTINO_ERROR_BAD_USER_PROFILE; else rprofile->width=metres_to_width(profile->width); if(profile->length<=0) Routino_errno=ROUTINO_ERROR_BAD_USER_PROFILE; else rprofile->length=metres_to_length(profile->length); if(Routino_errno==ROUTINO_ERROR_NONE) return(rprofile); free(rprofile); return(NULL); } /*++++++++++++++++++++++++++++++++++++++ Create a Routino User Profile from a Routino Profile loaded from an XML file. Routino_UserProfile *Routino_CreateUserProfileFromProfile Returns an allocated Routino User Profile. Routino_Profile *profile The Routino Profile to convert (not modified by this). ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC Routino_UserProfile *Routino_CreateUserProfileFromProfile(Routino_Profile *profile) { Routino_UserProfile *uprofile=calloc(1,sizeof(Routino_UserProfile)); int i; Routino_errno=ROUTINO_ERROR_NONE; if(!profile) { Routino_errno=ROUTINO_ERROR_NO_PROFILE; free(uprofile); return(NULL); } uprofile->transport=profile->transport; for(i=1;ihighway[i]=profile->highway[i]; uprofile->speed[i]=speed_to_kph(profile->speed[i]); } for(i=1;iprops[i]=profile->props[i]; uprofile->weight=weight_to_tonnes(profile->weight); uprofile->height=height_to_metres(profile->height); uprofile->width=width_to_metres(profile->width); uprofile->length=length_to_metres(profile->length); return(uprofile); } /*++++++++++++++++++++++++++++++++++++++ Validates that a selected routing profile is valid for use with the selected routing database. int Routino_ValidateProfile Returns zero if OK or something else in case of an error. Routino_Database *database The Routino database to use. Routino_Profile *profile The Routino profile to validate. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC int Routino_ValidateProfile(Routino_Database *database,Routino_Profile *profile) { Routino_errno=ROUTINO_ERROR_NONE; if(!database) { Routino_errno=ROUTINO_ERROR_NO_DATABASE; return Routino_errno; } if(!profile) { Routino_errno=ROUTINO_ERROR_NO_PROFILE; return Routino_errno; } if(UpdateProfile(profile,database->ways)) Routino_errno=ROUTINO_ERROR_PROFILE_DATABASE_ERR; return(Routino_errno); } /*++++++++++++++++++++++++++++++++++++++ Finds the nearest point in the database to the specified latitude and longitude. Routino_Waypoint *Routino_FindWaypoint Returns a pointer to a newly allocated Routino waypoint or NULL if none could be found. Routino_Database *database The Routino database to use. Routino_Profile *profile The Routino profile to use. double latitude The latitude in degrees of the point. double longitude The longitude in degrees of the point. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC Routino_Waypoint *Routino_FindWaypoint(Routino_Database *database,Routino_Profile *profile,double latitude,double longitude) { distance_t dist; Routino_Waypoint *waypoint; if(!database) { Routino_errno=ROUTINO_ERROR_NO_DATABASE; return(NULL); } if(!profile) { Routino_errno=ROUTINO_ERROR_NO_PROFILE; return(NULL); } if(!profile->transports) { Routino_errno=ROUTINO_ERROR_NOTVALID_PROFILE; return(NULL); } waypoint=calloc(1,sizeof(Routino_Waypoint)); waypoint->segment=FindClosestSegment(database->nodes,database->segments,database->ways, degrees_to_radians(latitude),degrees_to_radians(longitude),distmax,profile, &dist,&waypoint->node1,&waypoint->node2,&waypoint->dist1,&waypoint->dist2); if(waypoint->segment==NO_SEGMENT) { free(waypoint); Routino_errno=ROUTINO_ERROR_NO_NEARBY_HIGHWAY; return(NULL); } Routino_errno=ROUTINO_ERROR_NONE; return(waypoint); } /*++++++++++++++++++++++++++++++++++++++ Calculate a route using a loaded database, chosen profile, chosen translation and set of waypoints. Routino_Output *Routino_CalculateRoute Returns the head of a linked list of route data (if requested) or NULL. Routino_Database *database The loaded database to use. Routino_Profile *profile The chosen routing profile to use. Routino_Translation *translation The chosen translation information to use. Routino_Waypoint **waypoints The set of waypoints. int nwaypoints The number of waypoints. int options The set of routing options (ROUTINO_ROUTE_*) ORed together. Routino_ProgressFunc progress A function to be called occasionally to report progress or NULL. ++++++++++++++++++++++++++++++++++++++*/ DLL_PUBLIC Routino_Output *Routino_CalculateRoute(Routino_Database *database,Routino_Profile *profile,Routino_Translation *translation, Routino_Waypoint **waypoints,int nwaypoints,int options,Routino_ProgressFunc progress) { int first_waypoint,last_waypoint,this_waypoint,nwaypoints_routed,inc_dec_waypoint,start_waypoint,finish_waypoint=-1; index_t start_node,finish_node=NO_NODE; index_t join_segment=NO_SEGMENT; Results **results; Routino_Output *output=NULL; /* Check the input data */ if(!database) { Routino_errno=ROUTINO_ERROR_NO_DATABASE; return(NULL); } if(!profile) { Routino_errno=ROUTINO_ERROR_NO_PROFILE; return(NULL); } if(!profile->transports) { Routino_errno=ROUTINO_ERROR_NOTVALID_PROFILE; return(NULL); } if(!translation) { Routino_errno=ROUTINO_ERROR_NO_TRANSLATION; return(NULL); } /* Extract the options */ if(options&ROUTINO_ROUTE_QUICKEST) option_quickest=1; else option_quickest=0; if(options&ROUTINO_ROUTE_FILE_HTML) option_file_html=1; else option_file_html=0; if(options&ROUTINO_ROUTE_FILE_GPX_TRACK) option_file_gpx_track=1; else option_file_gpx_track=0; if(options&ROUTINO_ROUTE_FILE_GPX_ROUTE) option_file_gpx_route=1; else option_file_gpx_route=0; if(options&ROUTINO_ROUTE_FILE_TEXT) option_file_text=1; else option_file_text=0; if(options&ROUTINO_ROUTE_FILE_TEXT_ALL) option_file_text_all=1; else option_file_text_all=0; if(options&ROUTINO_ROUTE_FILE_STDOUT) option_file_stdout=1; else option_file_stdout=0; if(option_file_stdout && (option_file_html+option_file_gpx_track+option_file_gpx_route+option_file_text+option_file_text_all)!=1) { Routino_errno=ROUTINO_ERROR_BAD_OPTIONS; return(NULL); } if(options&ROUTINO_ROUTE_LIST_HTML) option_list_html=1; else option_list_html=0; if(options&ROUTINO_ROUTE_LIST_HTML_ALL) option_list_html_all=1; else option_list_html_all=0; if(options&ROUTINO_ROUTE_LIST_TEXT) option_list_text=1; else option_list_text=0; if(options&ROUTINO_ROUTE_LIST_TEXT_ALL) option_list_text_all=1; else option_list_text_all=0; if((option_list_html+option_list_html_all+option_list_text+option_list_text_all)>1) { Routino_errno=ROUTINO_ERROR_BAD_OPTIONS; return(NULL); } /* Set up the progress callback */ progress_func=progress; progress_value=0.0; progress_abort=0; /* Check for loop and reverse options */ if(options&ROUTINO_ROUTE_LOOP) nwaypoints_routed=nwaypoints+1; else nwaypoints_routed=nwaypoints; if(options&ROUTINO_ROUTE_REVERSE) { first_waypoint=nwaypoints_routed-1; last_waypoint=0; inc_dec_waypoint=-1; } else { first_waypoint=0; last_waypoint=nwaypoints_routed-1; inc_dec_waypoint=1; } /* Loop through all pairs of waypoints */ results=calloc(nwaypoints,sizeof(Results*)); for(this_waypoint=first_waypoint;this_waypoint!=(last_waypoint+inc_dec_waypoint);this_waypoint+=inc_dec_waypoint) { int waypoint=this_waypoint%nwaypoints; int waypoint_count=(this_waypoint-first_waypoint)*inc_dec_waypoint; if(progress_func) { progress_value=(double)waypoint_count/(double)(nwaypoints_routed+1); if(!progress_func(progress_value)) { Routino_errno=ROUTINO_ERROR_PROGRESS_ABORTED; goto tidy_and_exit; } } start_waypoint=finish_waypoint; start_node=finish_node; finish_waypoint=waypoint+1; finish_node=CreateFakes(database->nodes,database->segments,finish_waypoint, LookupSegment(database->segments,waypoints[waypoint]->segment,1), waypoints[waypoint]->node1,waypoints[waypoint]->node2,waypoints[waypoint]->dist1,waypoints[waypoint]->dist2); if(waypoint_count==0) continue; results[waypoint_count-1]=CalculateRoute(database->nodes,database->segments,database->ways,database->relations, profile,start_node,join_segment,finish_node,start_waypoint,finish_waypoint); if(!results[waypoint_count-1]) { if(progress_func && progress_abort) Routino_errno=ROUTINO_ERROR_PROGRESS_ABORTED; else Routino_errno=ROUTINO_ERROR_NO_ROUTE_1-1+start_waypoint; goto tidy_and_exit; } join_segment=results[waypoint_count-1]->last_segment; } if(progress_func) { progress_value=(double)this_waypoint/(double)(nwaypoints_routed+1); if(!progress_func(progress_value)) { Routino_errno=ROUTINO_ERROR_PROGRESS_ABORTED; goto tidy_and_exit; } } /* Print the route */ output=PrintRoute(results,nwaypoints_routed-1,database->nodes,database->segments,database->ways,database->relations,profile,translation); if(progress_func && !progress_func(1.0)) { Routino_errno=ROUTINO_ERROR_PROGRESS_ABORTED; goto tidy_and_exit; } /* Tidy up and exit */ tidy_and_exit: DeleteFakeNodes(); for(this_waypoint=0;this_waypointnext; if(output->name) free(output->name); if(output->desc1) free(output->desc1); if(output->desc2) free(output->desc2); if(output->desc3) free(output->desc3); free(output); output=next; } } routino-3.4.3/src/test/ 40755 233 144 0 15003125373 10121 5routino-3.4.3/src/test/oneway-loop.sh 777 233 144 0 12064636362 15775 2start-1-finish.shroutino-3.4.3/src/test/loop-and-reverse.osm 644 233 144 7304 12606772336 14060 0 routino-3.4.3/src/test/coincident-waypoint.sh 777 233 144 0 12333356554 16043 2a-b-c-d.shroutino-3.4.3/src/test/a-b-c.sh 755 233 144 1103 13364652274 11363 0#!/bin/sh # Run planetsplitter run_planetsplitter # Run filedumper run_filedumper # Waypoints waypoints=`run_waypoints $osm list` # Run the router for each waypoint for waypoint in $waypoints; do case $waypoint in *a) waypoint=`echo $waypoint | sed -e 's%a$%%'` ;; *) continue ;; esac echo "Running router : $waypoint" waypoint_a=`run_waypoints $osm ${waypoint}a 1` waypoint_b=`run_waypoints $osm ${waypoint}b 2` waypoint_c=`run_waypoints $osm ${waypoint}c 3` run_router $waypoint $waypoint_a $waypoint_b $waypoint_c done routino-3.4.3/src/test/loop-and-reverse.sh 755 233 144 1302 13364652316 13664 0#!/bin/sh # Run planetsplitter run_planetsplitter # Run filedumper run_filedumper # Waypoints waypoints=`run_waypoints $osm list` waypoint_start=`run_waypoints $osm WPstart 1` waypoint_middle=`run_waypoints $osm WPmiddle 2` waypoint_finish=`run_waypoints $osm WPfinish 3` # Run the router for each loop and reverse option for waypoint in WP WP-L WP-R WP-LR; do echo "Running router : $waypoint" option_loop="" option_reverse="" case $waypoint in *L*) option_loop="--loop" ;; esac case $waypoint in *R*) option_reverse="--reverse" ;; esac run_router $waypoint $option_loop $option_reverse $waypoint_start $waypoint_middle $waypoint_finish done routino-3.4.3/src/test/node-restrictions.sh 777 233 144 0 12064636362 17177 2start-1-finish.shroutino-3.4.3/src/test/dead-ends.osm 644 233 144 16570 12326256227 12542 0 routino-3.4.3/src/test/loops.sh 777 233 144 0 12064636362 14660 2start-1-finish.shroutino-3.4.3/src/test/roundabout-waypoints.osm 644 233 144 10276 12327506431 15124 0 routino-3.4.3/src/test/no-super.osm 644 233 144 11616 12064636362 12463 0 routino-3.4.3/src/test/prune-short.sh 777 233 144 0 12114364765 15354 2only-split.shroutino-3.4.3/src/test/turns.sh 777 233 144 0 12064636362 14677 2start-1-finish.shroutino-3.4.3/src/test/is-fast-math.c 644 233 144 450 12154147145 12562 0#include int main(int argc,char **argv) { #ifdef __FAST_MATH__ if(argc>1) printf("Compiled with -ffast-math => results may differ slightly.\n"); return 0; #else if(argc>1) printf("Not compiled with -ffast-math => results should match exactly.\n"); return 1; #endif } routino-3.4.3/src/test/a-b-c-d.sh 755 233 144 1202 13364652253 11601 0#!/bin/sh # Run planetsplitter run_planetsplitter # Run filedumper run_filedumper # Waypoints waypoints=`run_waypoints $osm list` # Run the router for each waypoint for waypoint in $waypoints; do case $waypoint in *a) waypoint=`echo $waypoint | sed -e 's%a$%%'` ;; *) continue ;; esac echo "Running router : $waypoint" waypoint_a=`run_waypoints $osm ${waypoint}a 1` waypoint_b=`run_waypoints $osm ${waypoint}b 2` waypoint_c=`run_waypoints $osm ${waypoint}c 3` waypoint_d=`run_waypoints $osm ${waypoint}d 4` run_router $waypoint $waypoint_a $waypoint_b $waypoint_c $waypoint_d done routino-3.4.3/src/test/run-one-test.sh 755 233 144 5077 13452410701 13043 0#!/bin/sh # Exit on error set -e # Test name name=`basename $1 .sh` shift # Use suppressions file in case compiled with sanitizer LSAN_OPTIONS=suppressions=sanitizer-suppressions.txt export LSAN_OPTIONS # Slim or non-slim if [ "$1" = "slim" ]; then slim="-slim" dir="slim" else slim="" dir="fat" fi # Libroutino or not libroutino LD_LIBRARY_PATH=$PWD/..:$LD_LIBRARY_PATH export LD_LIBRARY_PATH if [ "$2" = "lib" ]; then lib="+lib" else lib="" fi # Pruned or non-pruned if [ "$2" = "prune" ]; then prune="" pruned="-pruned" else prune="--prune-none" pruned="" fi # Create the output directory dir=$dir$lib$pruned [ -d $dir ] || mkdir $dir # Run the programs under a run-time debugger debugger=${TEST_DEBUGGER:-} # Name related options osm=$name.osm log=$name$lib$slim$pruned.log option_prefix="--prefix=$name" option_dir="--dir=$dir" # Generic program options option_planetsplitter="--loggable --tagging=../../xml/routino-tagging.xml --errorlog $prune" option_filedumper="--dump-osm" option_router="--profile=motorcar --profiles=../../xml/routino-profiles.xml --translations=copyright.xml" if [ ! "$2" = "lib" ]; then option_router="$option_router --loggable" fi # Run waypoints program run_waypoints() { perl waypoints.pl $@ } # Run planetsplitter run_planetsplitter() { echo "Running planetsplitter" echo ../planetsplitter$slim $option_dir $option_prefix $option_planetsplitter $@ $osm > $log $debugger ../planetsplitter$slim $option_dir $option_prefix $option_planetsplitter $@ $osm >> $log } # Run filedumper run_filedumper() { echo "Running filedumper" echo ../filedumper$slim $option_dir $option_prefix $option_filedumper $@ >> $log $debugger ../filedumper$slim $option_dir $option_prefix $option_filedumper $@ > $dir/$osm } # Run the router run_router() { waypoint=$1 shift [ -d $dir/$name-$waypoint ] || mkdir $dir/$name-$waypoint echo ../router$lib$slim $option_dir $option_prefix $option_osm $option_router $@ >> $log $debugger ../router$lib$slim $option_dir $option_prefix $option_osm $option_router $@ >> $log mv shortest* $dir/$name-$waypoint echo diff -u expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt >> $log if ./is-fast-math; then diff -U 0 expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt | 2>&1 egrep '^[-+] ' || true else diff -u expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt >> $log fi } # Run the specific test script . ./$name.sh # Finish exit 0 routino-3.4.3/src/test/super-or-not.sh 777 233 144 0 12064636362 13764 2a-b.shroutino-3.4.3/src/test/expected/ 40755 233 144 0 12725336336 11735 5routino-3.4.3/src/test/expected/roundabout-waypoints-WP06.txt 644 233 144 1577 12601522406 17417 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218454 -0.520798 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219482 -0.520837 9* Junct 0.113 0.07 0.11 0.1 96 182 main 1 -0.219692 -0.520509 15 Junct- 0.043 0.03 0.16 0.1 96 122 roundabout -0.220082 -0.520522 14 Junct- 0.043 0.03 0.20 0.1 96 181 roundabout -0.220171 -0.520685 -2 Waypt#2 0.020 0.01 0.22 0.1 96 241 roundabout -0.220268 -0.520863 8* Junct 0.022 0.01 0.24 0.1 96 241 roundabout -0.221566 -0.520921 -3 Waypt#3 0.143 0.09 0.38 0.2 96 182 main 2 routino-3.4.3/src/test/expected/loops-WP09.txt 644 233 144 3465 12601522413 14335 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220739 -0.517801 19* Junct 0.187 0.23 0.47 0.5 48 91 high street -0.220301 -0.517576 22* Junct- 0.054 0.07 0.52 0.6 48 27 loop 2 -0.219946 -0.517397 24 Inter 0.044 0.06 0.56 0.6 48 26 loop 2 -0.219266 -0.517579 21* Junct 0.078 0.10 0.64 0.7 48 345 loop 2 -0.219013 -0.517333 -2 Waypt#2 0.039 0.05 0.68 0.8 48 44 loop 2 -0.218805 -0.517131 25 Inter 0.032 0.04 0.71 0.8 48 44 loop 2 -0.218417 -0.517462 23* Junct- 0.056 0.07 0.77 0.9 48 319 loop 2 -0.218794 -0.517763 20 Inter 0.053 0.07 0.82 0.9 48 218 loop 2 -0.219266 -0.517579 21* Junct 0.056 0.07 0.88 1.0 48 158 loop 2 -0.219946 -0.517397 24 Inter 0.078 0.10 0.95 1.1 48 165 loop 2 -0.220301 -0.517576 22* Junct- 0.044 0.06 1.00 1.2 48 206 loop 2 -0.220739 -0.517801 19* Junct 0.054 0.07 1.05 1.2 48 207 loop 2 -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/node-restrictions-WP05.txt 644 233 144 3416 12601522410 16641 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219564 -0.520846 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.520893 4* Junct 0.122 0.07 0.12 0.1 96 182 main 1 -0.220682 -0.520141 9* Junct 0.083 0.08 0.20 0.2 64 91 high street -0.220695 -0.519489 12* Change 0.072 0.07 0.28 0.2 64 91 high street -0.220140 -0.519342 14 Inter 0.063 0.08 0.34 0.3 48 14 nopass road -0.220170 -0.518653 -2 Waypt#2 0.075 0.09 0.41 0.4 48 92 nopass road -0.220140 -0.519342 14 Inter 0.075 0.09 0.49 0.5 48 272 nopass road -0.220695 -0.519489 12* Junct 0.063 0.08 0.55 0.6 48 194 nopass road -0.220694 -0.519227 15 Inter 0.029 0.04 0.58 0.6 48 89 long road -0.220386 -0.519076 16 Inter 0.038 0.05 0.62 0.6 48 26 long road -0.220961 -0.518928 17 Inter 0.066 0.08 0.69 0.7 48 165 long road -0.220427 -0.518622 18 Inter 0.068 0.09 0.75 0.8 48 29 long road -0.220949 -0.518422 21 Inter 0.062 0.08 0.82 0.9 48 159 long road -0.220455 -0.518238 22 Inter 0.058 0.07 0.87 1.0 48 20 long road -0.220746 -0.518070 23 Inter 0.037 0.04 0.91 1.0 48 149 long road -0.220739 -0.517801 26* Junct 0.029 0.04 0.94 1.0 48 88 long road -0.220784 -0.516035 31* Junct 0.196 0.18 1.14 1.2 64 91 high street -0.219593 -0.515985 -3 Waypt#3 0.132 0.08 1.27 1.3 96 2 main 2 routino-3.4.3/src/test/expected/dead-ends-WP01.txt 644 233 144 2307 12601522417 15013 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220263 -0.519309 13* Waypt#2 0.052 0.07 0.35 0.4 48 21 dead-end 1 -0.220702 -0.519478 12* Junct 0.052 0.07 0.41 0.4 48 201 dead-end 1 -0.220739 -0.517804 18* Junct 0.186 0.23 0.59 0.7 48 91 high street -0.220782 -0.516137 24* Junct 0.185 0.23 0.78 0.9 48 91 high street -0.220817 -0.514062 32* Junct 0.230 0.29 1.01 1.2 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.06 1.2 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.15 1.3 96 2 main 2 routino-3.4.3/src/test/expected/turns-WP13.txt 644 233 144 6657 12725336245 14372 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct 0.072 0.04 0.07 0.0 96 182 main 1 -0.219123 -0.520207 12* Inter 0.069 0.09 0.14 0.1 48 91 top road -0.219131 -0.519426 20* Inter 0.086 0.11 0.23 0.2 48 90 top road -0.219135 -0.518823 23* Inter 0.067 0.08 0.29 0.3 48 90 top road -0.219145 -0.517626 33* Inter 0.133 0.17 0.43 0.5 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 0.47 0.5 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 0.48 0.6 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 0.50 0.6 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 0.52 0.6 48 72 roundabout -0.219153 -0.516826 46* Junct- 0.018 0.02 0.54 0.6 48 27 roundabout -0.218966 -0.516910 44 Inter 0.022 0.03 0.56 0.6 48 335 roundabout -0.218923 -0.517072 39 Junct- 0.018 0.02 0.58 0.7 48 284 roundabout -0.218998 -0.517207 37 Inter 0.017 0.02 0.59 0.7 48 240 roundabout -0.219144 -0.517257 36* Junct 0.017 0.02 0.61 0.7 48 199 roundabout -0.219145 -0.517626 33* Junct 0.041 0.05 0.65 0.8 48 269 top road -0.218619 -0.517921 32* Inter 0.067 0.08 0.72 0.8 48 330 loop 5 -0.218431 -0.518243 28 Inter 0.041 0.05 0.76 0.9 48 300 loop 5 -0.218600 -0.518557 25* Inter 0.039 0.05 0.80 0.9 48 241 loop 5 -0.218691 -0.518602 -2 Waypt#2 0.011 0.01 0.81 1.0 48 206 loop 5 -0.219135 -0.518823 23* Inter 0.054 0.07 0.86 1.0 48 206 loop 5 -0.219145 -0.517626 33* Inter 0.133 0.17 1.00 1.2 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 1.04 1.2 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 1.05 1.3 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 1.07 1.3 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 1.09 1.3 48 72 roundabout -0.219153 -0.516826 46* Junct- 0.018 0.02 1.11 1.3 48 27 roundabout -0.218966 -0.516910 44 Inter 0.022 0.03 1.13 1.3 48 335 roundabout -0.218923 -0.517072 39 Junct- 0.018 0.02 1.15 1.4 48 284 roundabout -0.218998 -0.517207 37 Inter 0.017 0.02 1.16 1.4 48 240 roundabout -0.219144 -0.517257 36* Junct 0.017 0.02 1.18 1.4 48 199 roundabout -0.219145 -0.517626 33* Junct 0.041 0.05 1.22 1.5 48 269 top road -0.219135 -0.518823 23* Junct 0.133 0.17 1.35 1.6 48 270 top road -0.219131 -0.519426 20* Junct 0.067 0.08 1.42 1.7 48 270 top road -0.219123 -0.520207 12* Junct 0.086 0.11 1.51 1.8 48 270 top road -0.219107 -0.520828 6* Junct 0.069 0.09 1.58 1.9 48 271 top road -0.220666 -0.520893 5* Junct- 0.173 0.11 1.75 2.0 96 182 main 1 -0.221308 -0.520914 4* Junct- 0.071 0.04 1.82 2.0 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.85 2.1 96 181 main 1 routino-3.4.3/src/test/expected/node-restrictions-WP06.txt 644 233 144 3416 12601522410 16642 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219564 -0.520846 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.520893 4* Junct 0.122 0.07 0.12 0.1 96 182 main 1 -0.220682 -0.520141 9* Junct 0.083 0.08 0.20 0.2 64 91 high street -0.220695 -0.519489 12* Change 0.072 0.07 0.28 0.2 64 91 high street -0.220694 -0.519227 15 Inter 0.029 0.04 0.31 0.3 48 89 long road -0.220386 -0.519076 16 Inter 0.038 0.05 0.34 0.3 48 26 long road -0.220961 -0.518928 17 Inter 0.066 0.08 0.41 0.4 48 165 long road -0.220427 -0.518622 18 Inter 0.068 0.09 0.48 0.5 48 29 long road -0.220949 -0.518422 21 Inter 0.062 0.08 0.54 0.5 48 159 long road -0.220455 -0.518238 22 Inter 0.058 0.07 0.60 0.6 48 20 long road -0.220746 -0.518070 23 Inter 0.037 0.04 0.64 0.7 48 149 long road -0.220739 -0.517801 26* Junct 0.029 0.04 0.66 0.7 48 88 long road -0.220212 -0.517903 25 Inter 0.059 0.07 0.72 0.8 48 349 nopass road -0.220176 -0.518543 -2 Waypt#2 0.070 0.09 0.79 0.9 48 273 nopass road -0.220212 -0.517903 25 Inter 0.070 0.09 0.86 0.9 48 93 nopass road -0.220739 -0.517801 26* Junct 0.059 0.07 0.92 1.0 48 169 nopass road -0.220784 -0.516035 31* Junct 0.196 0.18 1.12 1.2 64 91 high street -0.219593 -0.515985 -3 Waypt#3 0.132 0.08 1.25 1.3 96 2 main 2 routino-3.4.3/src/test/expected/dead-ends-WP06.txt 644 233 144 2557 12601522416 15026 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220739 -0.517804 18* Junct 0.186 0.23 0.49 0.5 48 91 high street -0.220296 -0.517634 20* Junct- 0.052 0.07 0.54 0.6 48 21 dead-end 2 -0.219991 -0.517512 21 Waypt#2 0.036 0.04 0.57 0.6 48 21 dead-end 2 -0.220296 -0.517634 20* Junct- 0.036 0.04 0.61 0.7 48 201 dead-end 2 -0.220739 -0.517804 18* Junct 0.052 0.07 0.66 0.7 48 201 dead-end 2 -0.220782 -0.516137 24* Junct 0.185 0.23 0.85 1.0 48 91 high street -0.220817 -0.514062 32* Junct 0.230 0.29 1.08 1.3 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.13 1.3 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.22 1.4 96 2 main 2 routino-3.4.3/src/test/expected/coincident-waypoint-WP04.txt 644 233 144 1202 12601522420 17144 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.217286 -0.520780 7 Waypt#1 0.000 0.00 0.00 0.0 -0.217286 -0.520780 7 Waypt#2 0.000 0.00 0.00 0.0 96 270 main 1 -0.218523 -0.520806 6 Waypt#3 0.137 0.09 0.14 0.1 96 181 main 1 -0.218523 -0.520806 6 Waypt#4 0.000 0.00 0.14 0.1 96 270 main 1 routino-3.4.3/src/test/expected/no-super-WP02.txt 644 233 144 1057 12601522412 14734 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.216472 -0.519026 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.216671 -0.515660 -2 Waypt#2 0.374 0.47 0.37 0.5 48 93 road2 -0.216579 -0.517212 -3 Waypt#3 0.172 0.21 0.55 0.7 48 273 road2 routino-3.4.3/src/test/expected/turns-WP06.txt 644 233 144 3650 12725335772 14366 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct- 0.072 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 5* Junct 0.173 0.11 0.24 0.2 96 182 main 1 -0.220671 -0.520223 11* Inter 0.074 0.09 0.32 0.2 48 90 high street -0.220691 -0.519461 19* Junct 0.084 0.10 0.40 0.3 48 91 high street -0.220708 -0.518842 22* Inter 0.069 0.09 0.47 0.4 48 91 high street -0.220724 -0.518071 31* Junct 0.085 0.10 0.56 0.5 48 91 high street -0.220143 -0.518162 30 Inter 0.065 0.08 0.62 0.6 48 351 loop 2 -0.219850 -0.518416 27 Waypt#2 0.043 0.05 0.67 0.7 48 319 loop 2 -0.220100 -0.518718 24* Inter 0.043 0.05 0.71 0.7 48 230 loop 2 -0.220708 -0.518842 22* Inter 0.069 0.09 0.78 0.8 48 191 loop 2 -0.220724 -0.518071 31* Junct 0.085 0.10 0.86 0.9 48 91 high street -0.220739 -0.517425 34* Inter 0.071 0.09 0.93 1.0 48 91 high street -0.220760 -0.516647 48* Inter 0.086 0.11 1.02 1.1 48 91 high street -0.220784 -0.516035 54* Junct 0.068 0.09 1.09 1.2 48 92 high street -0.221431 -0.516056 53* Junct 0.072 0.04 1.16 1.2 96 181 main 2 -0.221376 -0.518235 29* Junct 0.242 0.30 1.40 1.5 48 271 bottom road -0.221360 -0.518860 21* Junct 0.069 0.09 1.47 1.6 48 271 bottom road -0.221308 -0.520914 4* Junct 0.228 0.28 1.70 1.9 48 271 bottom road -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.73 1.9 96 181 main 1 routino-3.4.3/src/test/expected/turns-WP04.txt 644 233 144 3767 12725335624 14371 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct- 0.072 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 5* Junct 0.173 0.11 0.24 0.2 96 182 main 1 -0.220671 -0.520223 11* Inter 0.074 0.09 0.32 0.2 48 90 high street -0.220691 -0.519461 19* Junct 0.084 0.10 0.40 0.3 48 91 high street -0.220708 -0.518842 22* Inter 0.069 0.09 0.47 0.4 48 91 high street -0.220724 -0.518071 31* Junct 0.085 0.10 0.56 0.5 48 91 high street -0.220143 -0.518162 30 Inter 0.065 0.08 0.62 0.6 48 351 loop 2 -0.219850 -0.518416 27 Inter 0.043 0.05 0.67 0.7 48 319 loop 2 -0.220100 -0.518718 24* Inter 0.043 0.05 0.71 0.7 48 230 loop 2 -0.220206 -0.518739 -2 Waypt#2 0.012 0.01 0.72 0.7 48 191 loop 2 -0.220708 -0.518842 22* Inter 0.057 0.07 0.78 0.8 48 191 loop 2 -0.220724 -0.518071 31* Junct 0.085 0.10 0.86 0.9 48 91 high street -0.220739 -0.517425 34* Inter 0.071 0.09 0.93 1.0 48 91 high street -0.220760 -0.516647 48* Inter 0.086 0.11 1.02 1.1 48 91 high street -0.220784 -0.516035 54* Junct 0.068 0.09 1.09 1.2 48 92 high street -0.221431 -0.516056 53* Junct 0.072 0.04 1.16 1.2 96 181 main 2 -0.221376 -0.518235 29* Junct 0.242 0.30 1.40 1.5 48 271 bottom road -0.221360 -0.518860 21* Junct 0.069 0.09 1.47 1.6 48 271 bottom road -0.221308 -0.520914 4* Junct 0.228 0.28 1.70 1.9 48 271 bottom road -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.73 1.9 96 181 main 1 routino-3.4.3/src/test/expected/turns-WP01.txt 644 233 144 2530 12725335423 14346 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct- 0.072 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 5* Junct 0.173 0.11 0.24 0.2 96 182 main 1 -0.220671 -0.520223 11* Inter 0.074 0.09 0.32 0.2 48 90 high street -0.220691 -0.519461 19* Junct 0.084 0.10 0.40 0.3 48 91 high street -0.220111 -0.519553 17 Inter 0.065 0.08 0.47 0.4 48 351 loop 1 -0.219817 -0.519807 15 Inter 0.043 0.05 0.51 0.5 48 319 loop 1 -0.220067 -0.520109 13* Inter 0.043 0.05 0.55 0.5 48 230 loop 1 -0.220191 -0.520132 -2 Waypt#2 0.014 0.02 0.57 0.6 48 190 loop 1 -0.220671 -0.520223 11* Junct 0.054 0.07 0.62 0.6 48 190 loop 1 -0.220666 -0.520893 5* Junct 0.074 0.09 0.70 0.7 48 270 high street -0.221308 -0.520914 4* Junct- 0.071 0.04 0.77 0.8 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 0.79 0.8 96 181 main 1 routino-3.4.3/src/test/expected/turns-WP08.txt 644 233 144 4467 12725336077 14376 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct 0.072 0.04 0.07 0.0 96 182 main 1 -0.219123 -0.520207 12* Inter 0.069 0.09 0.14 0.1 48 91 top road -0.219131 -0.519426 20* Inter 0.086 0.11 0.23 0.2 48 90 top road -0.219135 -0.518823 23* Inter 0.067 0.08 0.29 0.3 48 90 top road -0.219145 -0.517626 33* Inter 0.133 0.17 0.43 0.5 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 0.47 0.5 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 0.48 0.6 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 0.50 0.6 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 0.52 0.6 48 72 roundabout -0.219153 -0.516826 46* Junct 0.018 0.02 0.54 0.6 48 27 roundabout -0.219184 -0.515968 55* Junct 0.095 0.12 0.63 0.7 48 92 top road -0.220784 -0.516035 54* Junct 0.178 0.11 0.81 0.8 96 182 main 2 -0.220760 -0.516647 48* Junct 0.068 0.09 0.88 0.9 48 272 high street -0.220097 -0.516762 47* Inter 0.074 0.09 0.95 1.0 48 350 loop 3 -0.219872 -0.517009 43 Inter 0.037 0.04 0.99 1.1 48 312 loop 3 -0.220089 -0.517279 35* Waypt#2 0.038 0.05 1.03 1.1 48 231 loop 3 -0.220739 -0.517425 34* Junct 0.074 0.09 1.10 1.2 48 192 loop 3 -0.220724 -0.518071 31* Junct 0.071 0.09 1.17 1.3 48 271 high street -0.220708 -0.518842 22* Junct 0.085 0.10 1.26 1.4 48 271 high street -0.220691 -0.519461 19* Junct 0.069 0.09 1.33 1.5 48 271 high street -0.220671 -0.520223 11* Junct 0.084 0.10 1.41 1.6 48 271 high street -0.220666 -0.520893 5* Junct 0.074 0.09 1.48 1.7 48 270 high street -0.221308 -0.520914 4* Junct- 0.071 0.04 1.55 1.7 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.58 1.7 96 181 main 1 routino-3.4.3/src/test/expected/dead-ends-WP03.txt 644 233 144 3025 12601522417 15013 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220263 -0.519309 13* Junct- 0.052 0.07 0.35 0.4 48 21 dead-end 1 -0.219924 -0.519179 14 Inter 0.040 0.05 0.39 0.4 48 20 dead-end 1 -0.219567 -0.519373 -2 Waypt#2 0.045 0.06 0.44 0.5 48 331 dead-end 1 -0.219924 -0.519179 14 Inter 0.045 0.06 0.48 0.5 48 151 dead-end 1 -0.220263 -0.519309 13* Junct- 0.040 0.05 0.52 0.6 48 200 dead-end 1 -0.220702 -0.519478 12* Junct 0.052 0.07 0.57 0.6 48 201 dead-end 1 -0.220739 -0.517804 18* Junct 0.186 0.23 0.76 0.9 48 91 high street -0.220782 -0.516137 24* Junct 0.185 0.23 0.95 1.1 48 91 high street -0.220817 -0.514062 32* Junct 0.230 0.29 1.18 1.4 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.23 1.4 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.32 1.5 96 2 main 2 routino-3.4.3/src/test/expected/loops-WP05.txt 644 233 144 3345 12601522414 14327 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220280 -0.519256 15* Junct- 0.052 0.07 0.33 0.3 48 29 loop 1 -0.219910 -0.519112 17 Inter 0.044 0.06 0.37 0.4 48 21 loop 1 -0.219237 -0.519286 13* Junct 0.077 0.10 0.45 0.5 48 345 loop 1 -0.218764 -0.519471 12 Inter 0.056 0.07 0.51 0.6 48 338 loop 1 -0.218380 -0.519134 16 Waypt#2 0.056 0.07 0.56 0.6 48 41 loop 1 -0.218776 -0.518838 18 Inter 0.055 0.07 0.62 0.7 48 143 loop 1 -0.219237 -0.519286 13* Junct 0.071 0.09 0.69 0.8 48 224 loop 1 -0.219910 -0.519112 17 Inter 0.077 0.10 0.77 0.9 48 165 loop 1 -0.220280 -0.519256 15* Junct- 0.044 0.06 0.81 0.9 48 201 loop 1 -0.220695 -0.519489 11* Junct 0.052 0.07 0.86 1.0 48 209 loop 1 -0.220739 -0.517801 19* Junct 0.187 0.23 1.05 1.2 48 91 high street -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/turns-WP02.txt 644 233 144 2411 12725335500 14341 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct- 0.072 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 5* Junct 0.173 0.11 0.24 0.2 96 182 main 1 -0.220671 -0.520223 11* Inter 0.074 0.09 0.32 0.2 48 90 high street -0.220691 -0.519461 19* Junct 0.084 0.10 0.40 0.3 48 91 high street -0.220111 -0.519553 17 Inter 0.065 0.08 0.47 0.4 48 351 loop 1 -0.219817 -0.519807 15 Inter 0.043 0.05 0.51 0.5 48 319 loop 1 -0.220067 -0.520109 13* Waypt#2 0.043 0.05 0.55 0.5 48 230 loop 1 -0.220671 -0.520223 11* Junct 0.068 0.09 0.62 0.6 48 190 loop 1 -0.220666 -0.520893 5* Junct 0.074 0.09 0.70 0.7 48 270 high street -0.221308 -0.520914 4* Junct- 0.071 0.04 0.77 0.8 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 0.79 0.8 96 181 main 1 routino-3.4.3/src/test/expected/cycle-both-ways-WP02.txt 644 233 144 2203 12601522417 16175 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.221402 -0.520913 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220268 -0.520863 8* Junct 0.125 0.38 0.12 0.4 20 2 main 2 -0.220062 -0.521204 2 Inter 0.044 0.13 0.17 0.5 20 301 roundabout -0.219665 -0.521190 3 Junct- 0.044 0.13 0.21 0.6 20 1 roundabout -0.219482 -0.520837 9* Junct- 0.044 0.13 0.26 0.8 20 62 roundabout -0.219692 -0.520509 15* Junct- 0.043 0.13 0.30 0.9 20 122 roundabout -0.220082 -0.520522 14* Junct 0.043 0.13 0.34 1.0 20 181 roundabout -0.220768 -0.519742 16 Inter 0.115 0.34 0.46 1.4 20 131 residential road -0.220811 -0.518939 19* Junct 0.089 0.27 0.55 1.6 20 93 residential road -0.221319 -0.518949 -2 Waypt#2 0.056 0.17 0.60 1.8 20 181 main 3 routino-3.4.3/src/test/expected/turns-WP14.txt 644 233 144 6540 12725336307 14361 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct 0.072 0.04 0.07 0.0 96 182 main 1 -0.219123 -0.520207 12* Inter 0.069 0.09 0.14 0.1 48 91 top road -0.219131 -0.519426 20* Inter 0.086 0.11 0.23 0.2 48 90 top road -0.219135 -0.518823 23* Inter 0.067 0.08 0.29 0.3 48 90 top road -0.219145 -0.517626 33* Inter 0.133 0.17 0.43 0.5 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 0.47 0.5 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 0.48 0.6 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 0.50 0.6 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 0.52 0.6 48 72 roundabout -0.219153 -0.516826 46* Junct- 0.018 0.02 0.54 0.6 48 27 roundabout -0.218966 -0.516910 44 Inter 0.022 0.03 0.56 0.6 48 335 roundabout -0.218923 -0.517072 39 Junct- 0.018 0.02 0.58 0.7 48 284 roundabout -0.218998 -0.517207 37 Inter 0.017 0.02 0.59 0.7 48 240 roundabout -0.219144 -0.517257 36* Junct 0.017 0.02 0.61 0.7 48 199 roundabout -0.219145 -0.517626 33* Junct 0.041 0.05 0.65 0.8 48 269 top road -0.218619 -0.517921 32* Inter 0.067 0.08 0.72 0.8 48 330 loop 5 -0.218431 -0.518243 28 Inter 0.041 0.05 0.76 0.9 48 300 loop 5 -0.218600 -0.518557 25* Waypt#2 0.039 0.05 0.80 0.9 48 241 loop 5 -0.219135 -0.518823 23* Inter 0.066 0.08 0.86 1.0 48 206 loop 5 -0.219145 -0.517626 33* Inter 0.133 0.17 1.00 1.2 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 1.04 1.2 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 1.06 1.3 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 1.07 1.3 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 1.09 1.3 48 72 roundabout -0.219153 -0.516826 46* Junct- 0.018 0.02 1.11 1.3 48 27 roundabout -0.218966 -0.516910 44 Inter 0.022 0.03 1.13 1.3 48 335 roundabout -0.218923 -0.517072 39 Junct- 0.018 0.02 1.15 1.4 48 284 roundabout -0.218998 -0.517207 37 Inter 0.017 0.02 1.17 1.4 48 240 roundabout -0.219144 -0.517257 36* Junct 0.017 0.02 1.18 1.4 48 199 roundabout -0.219145 -0.517626 33* Junct 0.041 0.05 1.22 1.5 48 269 top road -0.219135 -0.518823 23* Junct 0.133 0.17 1.36 1.6 48 270 top road -0.219131 -0.519426 20* Junct 0.067 0.08 1.42 1.7 48 270 top road -0.219123 -0.520207 12* Junct 0.086 0.11 1.51 1.8 48 270 top road -0.219107 -0.520828 6* Junct 0.069 0.09 1.58 1.9 48 271 top road -0.220666 -0.520893 5* Junct- 0.173 0.11 1.75 2.0 96 182 main 1 -0.221308 -0.520914 4* Junct- 0.071 0.04 1.82 2.0 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.85 2.1 96 181 main 1 routino-3.4.3/src/test/expected/loops-WP04.txt 644 233 144 3464 12601522414 14330 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220280 -0.519256 15* Junct- 0.052 0.07 0.33 0.3 48 29 loop 1 -0.219910 -0.519112 17 Inter 0.044 0.06 0.37 0.4 48 21 loop 1 -0.219237 -0.519286 13* Junct 0.077 0.10 0.45 0.5 48 345 loop 1 -0.218997 -0.519053 -2 Waypt#2 0.037 0.04 0.49 0.5 48 44 loop 1 -0.218776 -0.518838 18 Inter 0.034 0.04 0.52 0.6 48 44 loop 1 -0.218380 -0.519134 16 Inter 0.055 0.07 0.58 0.6 48 323 loop 1 -0.218764 -0.519471 12 Inter 0.056 0.07 0.63 0.7 48 221 loop 1 -0.219237 -0.519286 13* Junct 0.056 0.07 0.69 0.8 48 158 loop 1 -0.219910 -0.519112 17 Inter 0.077 0.10 0.77 0.9 48 165 loop 1 -0.220280 -0.519256 15* Junct- 0.044 0.06 0.81 0.9 48 201 loop 1 -0.220695 -0.519489 11* Junct 0.052 0.07 0.86 1.0 48 209 loop 1 -0.220739 -0.517801 19* Junct 0.187 0.23 1.05 1.2 48 91 high street -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/super-or-not-WP04.txt 644 233 144 1602 12635017000 15533 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.217183 -0.527270 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.217197 -0.525552 5* Junct- 0.190 0.12 0.19 0.1 96 90 Main road -0.217216 -0.523210 8* Junct- 0.260 0.16 0.45 0.3 96 90 Main road -0.217245 -0.519637 11* Junct- 0.397 0.25 0.85 0.5 96 90 Main road -0.217248 -0.515206 19* Junct 0.493 0.31 1.34 0.8 96 90 Main road -0.215941 -0.515611 18 Inter 0.152 0.19 1.49 1.0 48 342 Local road -0.216087 -0.515786 -2 Waypt#2 0.025 0.03 1.52 1.1 48 230 Local road routino-3.4.3/src/test/expected/loop-and-reverse-WP-R.txt 644 233 144 1327 12606772160 16417 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219540 -0.514010 -3 Waypt#3 0.000 0.00 0.00 0.0 -0.220817 -0.514062 14* Junct 0.141 0.09 0.14 0.1 96 182 main 2 -0.220749 -0.517228 -2 Waypt#2 0.352 0.44 0.49 0.5 48 271 low street -0.220666 -0.521060 4* Junct 0.426 0.53 0.92 1.1 48 271 low street -0.219526 -0.521010 -1 Waypt#1 0.126 0.08 1.04 1.1 96 2 main 1 routino-3.4.3/src/test/expected/dead-ends-WP02.txt 644 233 144 2557 12601522417 15023 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220263 -0.519309 13* Junct- 0.052 0.07 0.35 0.4 48 21 dead-end 1 -0.219924 -0.519179 14 Waypt#2 0.040 0.05 0.39 0.4 48 20 dead-end 1 -0.220263 -0.519309 13* Junct- 0.040 0.05 0.43 0.5 48 200 dead-end 1 -0.220702 -0.519478 12* Junct 0.052 0.07 0.48 0.5 48 201 dead-end 1 -0.220739 -0.517804 18* Junct 0.186 0.23 0.67 0.8 48 91 high street -0.220782 -0.516137 24* Junct 0.185 0.23 0.86 1.0 48 91 high street -0.220817 -0.514062 32* Junct 0.230 0.29 1.09 1.3 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.14 1.3 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.23 1.4 96 2 main 2 routino-3.4.3/src/test/expected/node-restrictions-WP02.txt 644 233 144 3426 12601522411 16640 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219564 -0.520846 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.520893 4* Junct 0.122 0.07 0.12 0.1 96 182 main 1 -0.220682 -0.520141 9* Junct 0.083 0.08 0.20 0.2 64 91 high street -0.220695 -0.519489 12* Change 0.072 0.07 0.28 0.2 64 91 high street -0.221123 -0.519360 13 Inter 0.049 0.06 0.33 0.3 48 163 somepass road -0.221154 -0.518671 -2 Waypt#2 0.075 0.09 0.40 0.4 48 92 somepass road -0.221123 -0.519360 13 Inter 0.075 0.09 0.48 0.5 48 272 somepass road -0.220695 -0.519489 12* Junct 0.049 0.06 0.53 0.5 48 343 somepass road -0.220694 -0.519227 15 Inter 0.029 0.04 0.55 0.6 48 89 long road -0.220386 -0.519076 16 Inter 0.038 0.05 0.59 0.6 48 26 long road -0.220961 -0.518928 17 Inter 0.066 0.08 0.66 0.7 48 165 long road -0.220427 -0.518622 18 Inter 0.068 0.09 0.73 0.8 48 29 long road -0.220949 -0.518422 21 Inter 0.062 0.08 0.79 0.8 48 159 long road -0.220455 -0.518238 22 Inter 0.058 0.07 0.85 0.9 48 20 long road -0.220746 -0.518070 23 Inter 0.037 0.04 0.88 1.0 48 149 long road -0.220739 -0.517801 26* Junct 0.029 0.04 0.91 1.0 48 88 long road -0.220784 -0.516035 31* Junct 0.196 0.18 1.11 1.2 64 91 high street -0.219593 -0.515985 -3 Waypt#3 0.132 0.08 1.24 1.3 96 2 main 2 routino-3.4.3/src/test/expected/super-or-not-WP01.txt 644 233 144 1603 12635016647 15551 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.216158 -0.518809 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.216435 -0.518515 13 Inter 0.044 0.06 0.04 0.1 48 133 Local road -0.215866 -0.517931 14 Inter 0.090 0.11 0.13 0.2 48 45 Local road -0.216470 -0.517412 15 Inter 0.088 0.11 0.22 0.3 48 139 Local road -0.215930 -0.516823 16 Inter 0.088 0.11 0.31 0.4 48 47 Local road -0.216451 -0.516221 17 Inter 0.088 0.11 0.40 0.5 48 130 Local road -0.216158 -0.515870 -2 Waypt#2 0.050 0.06 0.45 0.6 48 50 Local road routino-3.4.3/src/test/expected/coincident-waypoint-WP03.txt 644 233 144 1442 12601522420 17151 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.217022 -0.520773 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.217022 -0.520773 -2 Waypt#2 0.000 0.00 0.00 0.0 96 270 main 1 -0.217286 -0.520780 7 Junct- 0.029 0.02 0.03 0.0 96 181 main 1 -0.218523 -0.520806 6 Junct- 0.137 0.09 0.17 0.1 96 181 main 1 -0.219153 -0.520826 -3 Waypt#3 0.069 0.04 0.23 0.1 96 181 main 1 -0.219153 -0.520826 -4 Waypt#4 0.000 0.00 0.23 0.1 96 270 main 1 routino-3.4.3/src/test/expected/no-super-WP01.txt 644 233 144 2121 12601522412 14724 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.215814 -0.519419 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.215737 -0.519035 7 Inter 0.043 0.05 0.04 0.1 48 78 road1 -0.215935 -0.518253 10 Inter 0.089 0.11 0.13 0.2 48 104 road1 -0.215772 -0.517713 13 Inter 0.062 0.08 0.19 0.2 48 73 road1 -0.215952 -0.516838 15 Inter 0.099 0.12 0.29 0.4 48 101 road1 -0.215755 -0.515945 19 Inter 0.101 0.12 0.39 0.5 48 77 road1 -0.215897 -0.515462 -2 Waypt#2 0.055 0.07 0.45 0.6 48 106 road1 -0.215755 -0.515945 19 Inter 0.055 0.07 0.50 0.6 48 286 road1 -0.215952 -0.516838 15 Inter 0.101 0.12 0.60 0.8 48 257 road1 -0.215868 -0.517244 -3 Waypt#3 0.046 0.06 0.65 0.8 48 281 road1 routino-3.4.3/src/test/expected/loop-and-reverse-WP.txt 644 233 144 1327 12606772160 16220 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219526 -0.521010 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.521060 4* Junct 0.126 0.08 0.13 0.1 96 182 main 1 -0.220749 -0.517228 -2 Waypt#2 0.426 0.53 0.55 0.6 48 91 low street -0.220817 -0.514062 14* Junct 0.352 0.44 0.90 1.1 48 91 low street -0.219540 -0.514010 -3 Waypt#3 0.141 0.09 1.04 1.1 96 2 main 2 routino-3.4.3/src/test/expected/oneway-loop-WP01.txt 644 233 144 2325 12601522410 15431 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219564 -0.520846 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.520893 4* Junct 0.122 0.07 0.12 0.1 96 182 main 1 -0.220695 -0.519489 9* Inter 0.156 0.20 0.28 0.3 48 91 high street -0.220739 -0.517801 12* Junct 0.187 0.23 0.47 0.5 48 91 high street -0.220405 -0.517799 13 Inter 0.037 0.04 0.50 0.5 48 0 reverse loop -0.220210 -0.518605 11 Waypt#2 0.092 0.12 0.59 0.7 48 283 reverse loop -0.220333 -0.519485 10 Inter 0.098 0.12 0.69 0.8 48 262 reverse loop -0.220695 -0.519489 9* Inter 0.040 0.05 0.73 0.8 48 180 reverse loop -0.220739 -0.517801 12* Junct 0.187 0.23 0.92 1.1 48 91 high street -0.220784 -0.516035 18* Junct 0.196 0.24 1.11 1.3 48 91 high street -0.219593 -0.515985 -3 Waypt#3 0.132 0.08 1.25 1.4 96 2 main 2 routino-3.4.3/src/test/expected/dead-ends-WP10.txt 644 233 144 3025 12601522415 15007 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220739 -0.517804 18* Junct 0.186 0.23 0.49 0.5 48 91 high street -0.220782 -0.516137 24* Junct 0.185 0.23 0.67 0.8 48 91 high street -0.220361 -0.515961 25* Junct- 0.050 0.06 0.72 0.8 48 22 dead-end 3 -0.220019 -0.515847 26 Inter 0.040 0.05 0.76 0.9 48 18 dead-end 3 -0.219672 -0.516031 -2 Waypt#2 0.043 0.05 0.81 0.9 48 332 dead-end 3 -0.220019 -0.515847 26 Inter 0.043 0.05 0.85 1.0 48 152 dead-end 3 -0.220361 -0.515961 25* Junct- 0.040 0.05 0.89 1.0 48 198 dead-end 3 -0.220782 -0.516137 24* Junct 0.050 0.06 0.94 1.1 48 202 dead-end 3 -0.220817 -0.514062 32* Junct 0.230 0.29 1.17 1.4 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.22 1.4 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.31 1.5 96 2 main 2 routino-3.4.3/src/test/expected/turns-WP12.txt 644 233 144 4601 12725336204 14347 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct 0.072 0.04 0.07 0.0 96 182 main 1 -0.219123 -0.520207 12* Inter 0.069 0.09 0.14 0.1 48 91 top road -0.219131 -0.519426 20* Inter 0.086 0.11 0.23 0.2 48 90 top road -0.219135 -0.518823 23* Inter 0.067 0.08 0.29 0.3 48 90 top road -0.219145 -0.517626 33* Inter 0.133 0.17 0.43 0.5 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 0.47 0.5 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 0.48 0.6 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 0.50 0.6 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 0.52 0.6 48 72 roundabout -0.219153 -0.516826 46* Junct- 0.018 0.02 0.54 0.6 48 27 roundabout -0.218966 -0.516910 44 Inter 0.022 0.03 0.56 0.6 48 335 roundabout -0.218923 -0.517072 39 Junct- 0.018 0.02 0.58 0.7 48 284 roundabout -0.218998 -0.517207 37 Inter 0.017 0.02 0.59 0.7 48 240 roundabout -0.219144 -0.517257 36* Junct 0.017 0.02 0.61 0.7 48 199 roundabout -0.219145 -0.517626 33* Junct 0.041 0.05 0.65 0.8 48 269 top road -0.219135 -0.518823 23* Junct 0.133 0.17 0.79 0.9 48 270 top road -0.219131 -0.519426 20* Junct 0.067 0.08 0.85 1.0 48 270 top road -0.218482 -0.519542 18* Inter 0.073 0.09 0.93 1.1 48 349 loop 4 -0.218258 -0.519789 16 Waypt#2 0.037 0.04 0.96 1.1 48 312 loop 4 -0.218474 -0.520060 14* Inter 0.038 0.05 1.00 1.2 48 231 loop 4 -0.219123 -0.520207 12* Junct 0.074 0.09 1.07 1.3 48 192 loop 4 -0.219107 -0.520828 6* Junct 0.069 0.09 1.14 1.4 48 271 top road -0.220666 -0.520893 5* Junct- 0.173 0.11 1.32 1.5 96 182 main 1 -0.221308 -0.520914 4* Junct- 0.071 0.04 1.39 1.5 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.41 1.5 96 181 main 1 routino-3.4.3/src/test/expected/fake-node-with-loop-WP01.txt 644 233 144 2546 12601522415 16743 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.216904 -0.520770 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.217286 -0.520780 10 Junct- 0.042 0.03 0.04 0.0 96 181 main 1 -0.218086 -0.520797 -2 Waypt#2 0.088 0.06 0.13 0.1 96 181 main 1 -0.218523 -0.520806 9 Junct- 0.048 0.03 0.18 0.1 96 181 main 1 -0.219482 -0.520837 8* Junct 0.106 0.07 0.28 0.2 96 181 main 1 -0.219692 -0.520509 14 Junct- 0.043 0.03 0.33 0.2 96 122 roundabout -0.220082 -0.520522 13 Junct- 0.043 0.03 0.37 0.2 96 181 roundabout -0.220268 -0.520863 7 Inter 0.043 0.03 0.41 0.3 96 241 roundabout -0.220062 -0.521204 4 Junct- 0.044 0.03 0.46 0.3 96 301 roundabout -0.219665 -0.521190 5 Junct- 0.044 0.03 0.50 0.3 96 1 roundabout -0.219482 -0.520837 8* Junct 0.044 0.03 0.55 0.3 96 62 roundabout -0.218523 -0.520806 9 Junct- 0.106 0.07 0.65 0.4 96 1 main 1 -0.217741 -0.520789 -3 Waypt#3 0.086 0.05 0.74 0.5 96 1 main 1 routino-3.4.3/src/test/expected/node-restrictions-WP08.txt 644 233 144 3152 12601522410 16641 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219564 -0.520846 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.520893 4* Junct 0.122 0.07 0.12 0.1 96 182 main 1 -0.220682 -0.520141 9* Junct 0.083 0.08 0.20 0.2 64 91 high street -0.219009 -0.520075 10* Waypt#2 0.186 0.17 0.39 0.3 64 2 dead end road -0.220682 -0.520141 9* Junct 0.186 0.17 0.58 0.5 64 182 dead end road -0.220695 -0.519489 12* Change 0.072 0.07 0.65 0.6 64 91 high street -0.220694 -0.519227 15 Inter 0.029 0.04 0.68 0.6 48 89 long road -0.220386 -0.519076 16 Inter 0.038 0.05 0.72 0.6 48 26 long road -0.220961 -0.518928 17 Inter 0.066 0.08 0.78 0.7 48 165 long road -0.220427 -0.518622 18 Inter 0.068 0.09 0.85 0.8 48 29 long road -0.220949 -0.518422 21 Inter 0.062 0.08 0.91 0.9 48 159 long road -0.220455 -0.518238 22 Inter 0.058 0.07 0.97 1.0 48 20 long road -0.220746 -0.518070 23 Inter 0.037 0.04 1.01 1.0 48 149 long road -0.220739 -0.517801 26* Junct 0.029 0.04 1.04 1.0 48 88 long road -0.220784 -0.516035 31* Junct 0.196 0.18 1.23 1.2 64 91 high street -0.219593 -0.515985 -3 Waypt#3 0.132 0.08 1.36 1.3 96 2 main 2 routino-3.4.3/src/test/expected/dead-ends-WP09.txt 644 233 144 2557 12601522415 15030 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220739 -0.517804 18* Junct 0.186 0.23 0.49 0.5 48 91 high street -0.220782 -0.516137 24* Junct 0.185 0.23 0.67 0.8 48 91 high street -0.220361 -0.515961 25* Junct- 0.050 0.06 0.72 0.8 48 22 dead-end 3 -0.220019 -0.515847 26 Waypt#2 0.040 0.05 0.76 0.9 48 18 dead-end 3 -0.220361 -0.515961 25* Junct- 0.040 0.05 0.80 0.9 48 198 dead-end 3 -0.220782 -0.516137 24* Junct 0.050 0.06 0.85 1.0 48 202 dead-end 3 -0.220817 -0.514062 32* Junct 0.230 0.29 1.08 1.3 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.13 1.3 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.22 1.4 96 2 main 2 routino-3.4.3/src/test/expected/turns-WP11.txt 644 233 144 4601 12725336173 14353 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct 0.072 0.04 0.07 0.0 96 182 main 1 -0.219123 -0.520207 12* Inter 0.069 0.09 0.14 0.1 48 91 top road -0.219131 -0.519426 20* Inter 0.086 0.11 0.23 0.2 48 90 top road -0.219135 -0.518823 23* Inter 0.067 0.08 0.29 0.3 48 90 top road -0.219145 -0.517626 33* Inter 0.133 0.17 0.43 0.5 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 0.47 0.5 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 0.48 0.6 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 0.50 0.6 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 0.52 0.6 48 72 roundabout -0.219153 -0.516826 46* Junct- 0.018 0.02 0.54 0.6 48 27 roundabout -0.218966 -0.516910 44 Inter 0.022 0.03 0.56 0.6 48 335 roundabout -0.218923 -0.517072 39 Junct- 0.018 0.02 0.58 0.7 48 284 roundabout -0.218998 -0.517207 37 Inter 0.017 0.02 0.59 0.7 48 240 roundabout -0.219144 -0.517257 36* Junct 0.017 0.02 0.61 0.7 48 199 roundabout -0.219145 -0.517626 33* Junct 0.041 0.05 0.65 0.8 48 269 top road -0.219135 -0.518823 23* Junct 0.133 0.17 0.79 0.9 48 270 top road -0.219131 -0.519426 20* Junct 0.067 0.08 0.85 1.0 48 270 top road -0.218482 -0.519542 18* Inter 0.073 0.09 0.93 1.1 48 349 loop 4 -0.218258 -0.519789 16 Inter 0.037 0.04 0.96 1.1 48 312 loop 4 -0.218474 -0.520060 14* Waypt#2 0.038 0.05 1.00 1.2 48 231 loop 4 -0.219123 -0.520207 12* Junct 0.074 0.09 1.07 1.3 48 192 loop 4 -0.219107 -0.520828 6* Junct 0.069 0.09 1.14 1.4 48 271 top road -0.220666 -0.520893 5* Junct- 0.173 0.11 1.32 1.5 96 182 main 1 -0.221308 -0.520914 4* Junct- 0.071 0.04 1.39 1.5 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.41 1.5 96 181 main 1 routino-3.4.3/src/test/expected/loop-and-reverse-WP-L.txt 644 233 144 1713 12606772160 16410 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219526 -0.521010 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.521060 4* Junct 0.126 0.08 0.13 0.1 96 182 main 1 -0.220749 -0.517228 -2 Waypt#2 0.426 0.53 0.55 0.6 48 91 low street -0.220817 -0.514062 14* Junct 0.352 0.44 0.90 1.1 48 91 low street -0.219540 -0.514010 -3 Waypt#3 0.141 0.09 1.04 1.1 96 2 main 2 -0.218970 -0.513986 15* Junct 0.063 0.04 1.11 1.2 96 2 main 2 -0.218820 -0.520980 5* Junct 0.778 0.97 1.89 2.1 48 271 high street -0.219526 -0.521010 -1 Waypt#1 0.078 0.05 1.96 2.2 96 182 main 1 routino-3.4.3/src/test/expected/loops-WP08.txt 644 233 144 3465 12601522413 14334 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220739 -0.517801 19* Junct 0.187 0.23 0.47 0.5 48 91 high street -0.220301 -0.517576 22* Junct- 0.054 0.07 0.52 0.6 48 27 loop 2 -0.219946 -0.517397 24 Inter 0.044 0.06 0.56 0.6 48 26 loop 2 -0.219597 -0.517490 -2 Waypt#2 0.040 0.05 0.60 0.7 48 345 loop 2 -0.219266 -0.517579 21* Junct 0.038 0.05 0.64 0.7 48 345 loop 2 -0.218794 -0.517763 20 Inter 0.056 0.07 0.70 0.8 48 338 loop 2 -0.218417 -0.517462 23* Junct- 0.053 0.07 0.75 0.9 48 38 loop 2 -0.218805 -0.517131 25 Inter 0.056 0.07 0.81 0.9 48 139 loop 2 -0.219266 -0.517579 21* Junct 0.071 0.09 0.88 1.0 48 224 loop 2 -0.219946 -0.517397 24 Inter 0.078 0.10 0.95 1.1 48 165 loop 2 -0.220301 -0.517576 22* Junct- 0.044 0.06 1.00 1.2 48 206 loop 2 -0.220739 -0.517801 19* Junct 0.054 0.07 1.05 1.2 48 207 loop 2 -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/roundabout-waypoints-WP04.txt 644 233 144 1577 12601522407 17416 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218454 -0.520798 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219482 -0.520837 9* Junct 0.113 0.07 0.11 0.1 96 182 main 1 -0.219692 -0.520509 15 Junct- 0.043 0.03 0.16 0.1 96 122 roundabout -0.219878 -0.520515 -2 Waypt#2 0.020 0.01 0.18 0.1 96 181 roundabout -0.220082 -0.520522 14 Junct- 0.022 0.01 0.20 0.1 96 181 roundabout -0.220268 -0.520863 8* Junct 0.043 0.03 0.24 0.1 96 241 roundabout -0.221566 -0.520921 -3 Waypt#3 0.143 0.09 0.38 0.2 96 182 main 2 routino-3.4.3/src/test/expected/loops-WP07.txt 644 233 144 3346 12601522413 14331 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220739 -0.517801 19* Junct 0.187 0.23 0.47 0.5 48 91 high street -0.220301 -0.517576 22* Junct- 0.054 0.07 0.52 0.6 48 27 loop 2 -0.219946 -0.517397 24 Waypt#2 0.044 0.06 0.56 0.6 48 26 loop 2 -0.219266 -0.517579 21* Junct 0.078 0.10 0.64 0.7 48 345 loop 2 -0.218794 -0.517763 20 Inter 0.056 0.07 0.70 0.8 48 338 loop 2 -0.218417 -0.517462 23* Junct- 0.053 0.07 0.75 0.9 48 38 loop 2 -0.218805 -0.517131 25 Inter 0.056 0.07 0.81 0.9 48 139 loop 2 -0.219266 -0.517579 21* Junct 0.071 0.09 0.88 1.0 48 224 loop 2 -0.219946 -0.517397 24 Inter 0.078 0.10 0.95 1.1 48 165 loop 2 -0.220301 -0.517576 22* Junct- 0.044 0.06 1.00 1.2 48 206 loop 2 -0.220739 -0.517801 19* Junct 0.054 0.07 1.05 1.2 48 207 loop 2 -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/turns-WP03.txt 644 233 144 2411 12725335533 14350 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct- 0.072 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 5* Junct 0.173 0.11 0.24 0.2 96 182 main 1 -0.220671 -0.520223 11* Inter 0.074 0.09 0.32 0.2 48 90 high street -0.220691 -0.519461 19* Junct 0.084 0.10 0.40 0.3 48 91 high street -0.220111 -0.519553 17 Inter 0.065 0.08 0.47 0.4 48 351 loop 1 -0.219817 -0.519807 15 Waypt#2 0.043 0.05 0.51 0.5 48 319 loop 1 -0.220067 -0.520109 13* Inter 0.043 0.05 0.55 0.5 48 230 loop 1 -0.220671 -0.520223 11* Junct 0.068 0.09 0.62 0.6 48 190 loop 1 -0.220666 -0.520893 5* Junct 0.074 0.09 0.70 0.7 48 270 high street -0.221308 -0.520914 4* Junct- 0.071 0.04 0.77 0.8 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 0.79 0.8 96 181 main 1 routino-3.4.3/src/test/expected/roundabout-waypoints-WP05.txt 644 233 144 1453 12601522407 17410 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218454 -0.520798 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219482 -0.520837 9* Junct 0.113 0.07 0.11 0.1 96 182 main 1 -0.219692 -0.520509 15 Junct- 0.043 0.03 0.16 0.1 96 122 roundabout -0.220082 -0.520522 14 Waypt#2 0.043 0.03 0.20 0.1 96 181 roundabout -0.220268 -0.520863 8* Junct 0.043 0.03 0.24 0.1 96 241 roundabout -0.221566 -0.520921 -3 Waypt#3 0.143 0.09 0.39 0.2 96 182 main 2 routino-3.4.3/src/test/expected/turns-WP15.txt 644 233 144 6540 12725336336 14364 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct 0.072 0.04 0.07 0.0 96 182 main 1 -0.219123 -0.520207 12* Inter 0.069 0.09 0.14 0.1 48 91 top road -0.219131 -0.519426 20* Inter 0.086 0.11 0.23 0.2 48 90 top road -0.219135 -0.518823 23* Inter 0.067 0.08 0.29 0.3 48 90 top road -0.219145 -0.517626 33* Inter 0.133 0.17 0.43 0.5 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 0.47 0.5 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 0.48 0.6 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 0.50 0.6 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 0.52 0.6 48 72 roundabout -0.219153 -0.516826 46* Junct- 0.018 0.02 0.54 0.6 48 27 roundabout -0.218966 -0.516910 44 Inter 0.022 0.03 0.56 0.6 48 335 roundabout -0.218923 -0.517072 39 Junct- 0.018 0.02 0.58 0.7 48 284 roundabout -0.218998 -0.517207 37 Inter 0.017 0.02 0.59 0.7 48 240 roundabout -0.219144 -0.517257 36* Junct 0.017 0.02 0.61 0.7 48 199 roundabout -0.219145 -0.517626 33* Junct 0.041 0.05 0.65 0.8 48 269 top road -0.218619 -0.517921 32* Inter 0.067 0.08 0.72 0.8 48 330 loop 5 -0.218431 -0.518243 28 Waypt#2 0.041 0.05 0.76 0.9 48 300 loop 5 -0.218600 -0.518557 25* Inter 0.039 0.05 0.80 0.9 48 241 loop 5 -0.219135 -0.518823 23* Inter 0.066 0.08 0.86 1.0 48 206 loop 5 -0.219145 -0.517626 33* Inter 0.133 0.17 1.00 1.2 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 1.04 1.2 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 1.06 1.3 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 1.07 1.3 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 1.09 1.3 48 72 roundabout -0.219153 -0.516826 46* Junct- 0.018 0.02 1.11 1.3 48 27 roundabout -0.218966 -0.516910 44 Inter 0.022 0.03 1.13 1.3 48 335 roundabout -0.218923 -0.517072 39 Junct- 0.018 0.02 1.15 1.4 48 284 roundabout -0.218998 -0.517207 37 Inter 0.017 0.02 1.17 1.4 48 240 roundabout -0.219144 -0.517257 36* Junct 0.017 0.02 1.18 1.4 48 199 roundabout -0.219145 -0.517626 33* Junct 0.041 0.05 1.22 1.5 48 269 top road -0.219135 -0.518823 23* Junct 0.133 0.17 1.36 1.6 48 270 top road -0.219131 -0.519426 20* Junct 0.067 0.08 1.42 1.7 48 270 top road -0.219123 -0.520207 12* Junct 0.086 0.11 1.51 1.8 48 270 top road -0.219107 -0.520828 6* Junct 0.069 0.09 1.58 1.9 48 271 top road -0.220666 -0.520893 5* Junct- 0.173 0.11 1.75 2.0 96 182 main 1 -0.221308 -0.520914 4* Junct- 0.071 0.04 1.82 2.0 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.85 2.1 96 181 main 1 routino-3.4.3/src/test/expected/loops-WP01.txt 644 233 144 3344 12601522414 14322 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220280 -0.519256 15* Waypt#2 0.052 0.07 0.33 0.3 48 29 loop 1 -0.219910 -0.519112 17 Inter 0.044 0.06 0.37 0.4 48 21 loop 1 -0.219237 -0.519286 13* Junct 0.077 0.10 0.45 0.5 48 345 loop 1 -0.218764 -0.519471 12 Inter 0.056 0.07 0.51 0.6 48 338 loop 1 -0.218380 -0.519134 16 Inter 0.056 0.07 0.56 0.6 48 41 loop 1 -0.218776 -0.518838 18 Inter 0.055 0.07 0.62 0.7 48 143 loop 1 -0.219237 -0.519286 13* Junct 0.071 0.09 0.69 0.8 48 224 loop 1 -0.219910 -0.519112 17 Inter 0.077 0.10 0.77 0.9 48 165 loop 1 -0.220280 -0.519256 15* Junct- 0.044 0.06 0.81 0.9 48 201 loop 1 -0.220695 -0.519489 11* Junct 0.052 0.07 0.86 1.0 48 209 loop 1 -0.220739 -0.517801 19* Junct 0.187 0.23 1.05 1.2 48 91 high street -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/coincident-waypoint-WP02.txt 644 233 144 1322 12601522420 17145 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.216959 -0.520771 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.217286 -0.520780 7 Junct- 0.036 0.02 0.04 0.0 96 181 main 1 -0.218523 -0.520806 6 Waypt#2 0.137 0.09 0.17 0.1 96 181 main 1 -0.218523 -0.520806 6 Waypt#3 0.000 0.00 0.17 0.1 96 270 main 1 -0.219117 -0.520825 -4 Waypt#4 0.065 0.04 0.24 0.1 96 181 main 1 routino-3.4.3/src/test/expected/turns-WP09.txt 644 233 144 4467 12725336134 14371 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct 0.072 0.04 0.07 0.0 96 182 main 1 -0.219123 -0.520207 12* Inter 0.069 0.09 0.14 0.1 48 91 top road -0.219131 -0.519426 20* Inter 0.086 0.11 0.23 0.2 48 90 top road -0.219135 -0.518823 23* Inter 0.067 0.08 0.29 0.3 48 90 top road -0.219145 -0.517626 33* Inter 0.133 0.17 0.43 0.5 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 0.47 0.5 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 0.48 0.6 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 0.50 0.6 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 0.52 0.6 48 72 roundabout -0.219153 -0.516826 46* Junct 0.018 0.02 0.54 0.6 48 27 roundabout -0.219184 -0.515968 55* Junct 0.095 0.12 0.63 0.7 48 92 top road -0.220784 -0.516035 54* Junct 0.178 0.11 0.81 0.8 96 182 main 2 -0.220760 -0.516647 48* Junct 0.068 0.09 0.88 0.9 48 272 high street -0.220097 -0.516762 47* Inter 0.074 0.09 0.95 1.0 48 350 loop 3 -0.219872 -0.517009 43 Waypt#2 0.037 0.04 0.99 1.1 48 312 loop 3 -0.220089 -0.517279 35* Inter 0.038 0.05 1.03 1.1 48 231 loop 3 -0.220739 -0.517425 34* Junct 0.074 0.09 1.10 1.2 48 192 loop 3 -0.220724 -0.518071 31* Junct 0.071 0.09 1.17 1.3 48 271 high street -0.220708 -0.518842 22* Junct 0.085 0.10 1.26 1.4 48 271 high street -0.220691 -0.519461 19* Junct 0.069 0.09 1.33 1.5 48 271 high street -0.220671 -0.520223 11* Junct 0.084 0.10 1.41 1.6 48 271 high street -0.220666 -0.520893 5* Junct 0.074 0.09 1.48 1.7 48 270 high street -0.221308 -0.520914 4* Junct- 0.071 0.04 1.55 1.7 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.58 1.7 96 181 main 1 routino-3.4.3/src/test/expected/node-restrictions-WP07.txt 644 233 144 3152 12601522410 16640 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219564 -0.520846 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.520893 4* Junct 0.122 0.07 0.12 0.1 96 182 main 1 -0.220682 -0.520141 9* Junct 0.083 0.08 0.20 0.2 64 91 high street -0.219009 -0.520075 10* Waypt#2 0.186 0.17 0.39 0.3 64 2 dead end road -0.220682 -0.520141 9* Junct 0.186 0.17 0.58 0.5 64 182 dead end road -0.220695 -0.519489 12* Change 0.072 0.07 0.65 0.6 64 91 high street -0.220694 -0.519227 15 Inter 0.029 0.04 0.68 0.6 48 89 long road -0.220386 -0.519076 16 Inter 0.038 0.05 0.72 0.6 48 26 long road -0.220961 -0.518928 17 Inter 0.066 0.08 0.78 0.7 48 165 long road -0.220427 -0.518622 18 Inter 0.068 0.09 0.85 0.8 48 29 long road -0.220949 -0.518422 21 Inter 0.062 0.08 0.91 0.9 48 159 long road -0.220455 -0.518238 22 Inter 0.058 0.07 0.97 1.0 48 20 long road -0.220746 -0.518070 23 Inter 0.037 0.04 1.01 1.0 48 149 long road -0.220739 -0.517801 26* Junct 0.029 0.04 1.04 1.0 48 88 long road -0.220784 -0.516035 31* Junct 0.196 0.18 1.23 1.2 64 91 high street -0.219593 -0.515985 -3 Waypt#3 0.132 0.08 1.36 1.3 96 2 main 2 routino-3.4.3/src/test/expected/no-super-WP04.txt 644 233 144 2237 12601522412 14737 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.217903 -0.519035 6 Waypt#1 0.000 0.00 0.00 0.0 -0.218100 -0.518253 9 Inter 0.089 0.11 0.09 0.1 48 104 road4 -0.217937 -0.517713 12 Inter 0.062 0.08 0.15 0.2 48 73 road4 -0.218117 -0.516837 16 Inter 0.099 0.12 0.25 0.3 48 101 road4 -0.217920 -0.515945 18 Inter 0.101 0.12 0.35 0.4 48 77 road4 -0.218143 -0.515189 21 Inter 0.087 0.11 0.44 0.5 48 106 road4 -0.217911 -0.514640 26 Waypt#2 0.066 0.08 0.50 0.6 48 67 road4 -0.218143 -0.515189 21 Inter 0.066 0.08 0.57 0.7 48 247 road4 -0.217920 -0.515945 18 Inter 0.087 0.11 0.66 0.8 48 286 road4 -0.218117 -0.516837 16 Inter 0.101 0.12 0.76 0.9 48 257 road4 -0.217937 -0.517713 12 Waypt#3 0.099 0.12 0.86 1.1 48 281 road4 routino-3.4.3/src/test/expected/turns-WP05.txt 644 233 144 3650 12725335745 14365 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct- 0.072 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 5* Junct 0.173 0.11 0.24 0.2 96 182 main 1 -0.220671 -0.520223 11* Inter 0.074 0.09 0.32 0.2 48 90 high street -0.220691 -0.519461 19* Junct 0.084 0.10 0.40 0.3 48 91 high street -0.220708 -0.518842 22* Inter 0.069 0.09 0.47 0.4 48 91 high street -0.220724 -0.518071 31* Junct 0.085 0.10 0.56 0.5 48 91 high street -0.220143 -0.518162 30 Inter 0.065 0.08 0.62 0.6 48 351 loop 2 -0.219850 -0.518416 27 Inter 0.043 0.05 0.67 0.7 48 319 loop 2 -0.220100 -0.518718 24* Waypt#2 0.043 0.05 0.71 0.7 48 230 loop 2 -0.220708 -0.518842 22* Inter 0.069 0.09 0.78 0.8 48 191 loop 2 -0.220724 -0.518071 31* Junct 0.085 0.10 0.86 0.9 48 91 high street -0.220739 -0.517425 34* Inter 0.071 0.09 0.93 1.0 48 91 high street -0.220760 -0.516647 48* Inter 0.086 0.11 1.02 1.1 48 91 high street -0.220784 -0.516035 54* Junct 0.068 0.09 1.09 1.2 48 92 high street -0.221431 -0.516056 53* Junct 0.072 0.04 1.16 1.2 96 181 main 2 -0.221376 -0.518235 29* Junct 0.242 0.30 1.40 1.5 48 271 bottom road -0.221360 -0.518860 21* Junct 0.069 0.09 1.47 1.6 48 271 bottom road -0.221308 -0.520914 4* Junct 0.228 0.28 1.70 1.9 48 271 bottom road -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.73 1.9 96 181 main 1 routino-3.4.3/src/test/expected/node-restrictions-WP03.txt 644 233 144 3426 12601522411 16641 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219564 -0.520846 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.520893 4* Junct 0.122 0.07 0.12 0.1 96 182 main 1 -0.220682 -0.520141 9* Junct 0.083 0.08 0.20 0.2 64 91 high street -0.220695 -0.519489 12* Change 0.072 0.07 0.28 0.2 64 91 high street -0.220694 -0.519227 15 Inter 0.029 0.04 0.31 0.3 48 89 long road -0.220386 -0.519076 16 Inter 0.038 0.05 0.34 0.3 48 26 long road -0.220961 -0.518928 17 Inter 0.066 0.08 0.41 0.4 48 165 long road -0.220427 -0.518622 18 Inter 0.068 0.09 0.48 0.5 48 29 long road -0.220949 -0.518422 21 Inter 0.062 0.08 0.54 0.5 48 159 long road -0.220455 -0.518238 22 Inter 0.058 0.07 0.60 0.6 48 20 long road -0.220746 -0.518070 23 Inter 0.037 0.04 0.64 0.7 48 149 long road -0.220739 -0.517801 26* Junct 0.029 0.04 0.66 0.7 48 88 long road -0.221166 -0.517916 24 Inter 0.049 0.06 0.71 0.8 48 195 somepass road -0.221157 -0.518560 -2 Waypt#2 0.070 0.09 0.78 0.8 48 270 somepass road -0.221166 -0.517916 24 Inter 0.070 0.09 0.85 0.9 48 90 somepass road -0.220739 -0.517801 26* Junct 0.049 0.06 0.90 1.0 48 15 somepass road -0.220784 -0.516035 31* Junct 0.196 0.18 1.10 1.2 64 91 high street -0.219593 -0.515985 -3 Waypt#3 0.132 0.08 1.23 1.3 96 2 main 2 routino-3.4.3/src/test/expected/loops-WP03.txt 644 233 144 3464 12601522541 14330 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220280 -0.519256 15* Junct- 0.052 0.07 0.33 0.3 48 29 loop 1 -0.219910 -0.519112 17 Inter 0.044 0.06 0.37 0.4 48 21 loop 1 -0.219578 -0.519198 -2 Waypt#2 0.038 0.05 0.41 0.4 48 345 loop 1 -0.219237 -0.519286 13* Junct 0.039 0.05 0.45 0.5 48 345 loop 1 -0.218764 -0.519471 12 Inter 0.056 0.07 0.51 0.6 48 338 loop 1 -0.218380 -0.519134 16 Inter 0.056 0.07 0.56 0.6 48 41 loop 1 -0.218776 -0.518838 18 Inter 0.055 0.07 0.62 0.7 48 143 loop 1 -0.219237 -0.519286 13* Junct 0.071 0.09 0.69 0.8 48 224 loop 1 -0.219910 -0.519112 17 Inter 0.077 0.10 0.77 0.9 48 165 loop 1 -0.220280 -0.519256 15* Junct- 0.044 0.06 0.81 0.9 48 201 loop 1 -0.220695 -0.519489 11* Junct 0.052 0.07 0.86 1.0 48 209 loop 1 -0.220739 -0.517801 19* Junct 0.187 0.23 1.05 1.2 48 91 high street -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/node-restrictions-WP01.txt 644 233 144 3426 12601522411 16637 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219564 -0.520846 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.520893 4* Junct 0.122 0.07 0.12 0.1 96 182 main 1 -0.220682 -0.520141 9* Junct 0.083 0.08 0.20 0.2 64 91 high street -0.220695 -0.519489 12* Change 0.072 0.07 0.28 0.2 64 91 high street -0.221123 -0.519360 13 Inter 0.049 0.06 0.33 0.3 48 163 somepass road -0.221156 -0.518615 19* Waypt#2 0.082 0.10 0.41 0.4 48 92 somepass road -0.221123 -0.519360 13 Inter 0.082 0.10 0.49 0.5 48 272 somepass road -0.220695 -0.519489 12* Junct 0.049 0.06 0.54 0.5 48 343 somepass road -0.220694 -0.519227 15 Inter 0.029 0.04 0.57 0.6 48 89 long road -0.220386 -0.519076 16 Inter 0.038 0.05 0.61 0.6 48 26 long road -0.220961 -0.518928 17 Inter 0.066 0.08 0.67 0.7 48 165 long road -0.220427 -0.518622 18 Inter 0.068 0.09 0.74 0.8 48 29 long road -0.220949 -0.518422 21 Inter 0.062 0.08 0.80 0.9 48 159 long road -0.220455 -0.518238 22 Inter 0.058 0.07 0.86 0.9 48 20 long road -0.220746 -0.518070 23 Inter 0.037 0.04 0.90 1.0 48 149 long road -0.220739 -0.517801 26* Junct 0.029 0.04 0.93 1.0 48 88 long road -0.220784 -0.516035 31* Junct 0.196 0.18 1.12 1.2 64 91 high street -0.219593 -0.515985 -3 Waypt#3 0.132 0.08 1.25 1.3 96 2 main 2 routino-3.4.3/src/test/expected/loops-WP11.txt 644 233 144 3345 12601522564 14332 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220739 -0.517801 19* Junct 0.187 0.23 0.47 0.5 48 91 high street -0.220301 -0.517576 22* Junct- 0.054 0.07 0.52 0.6 48 27 loop 2 -0.219946 -0.517397 24 Inter 0.044 0.06 0.56 0.6 48 26 loop 2 -0.219266 -0.517579 21* Junct 0.078 0.10 0.64 0.7 48 345 loop 2 -0.218794 -0.517763 20 Inter 0.056 0.07 0.70 0.8 48 338 loop 2 -0.218417 -0.517462 23* Waypt#2 0.053 0.07 0.75 0.9 48 38 loop 2 -0.218805 -0.517131 25 Inter 0.056 0.07 0.81 0.9 48 139 loop 2 -0.219266 -0.517579 21* Junct 0.071 0.09 0.88 1.0 48 224 loop 2 -0.219946 -0.517397 24 Inter 0.078 0.10 0.95 1.1 48 165 loop 2 -0.220301 -0.517576 22* Junct- 0.044 0.06 1.00 1.2 48 206 loop 2 -0.220739 -0.517801 19* Junct 0.054 0.07 1.05 1.2 48 207 loop 2 -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/super-or-not-WP05.txt 644 233 144 1602 12635017465 15553 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.216144 -0.515853 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.215941 -0.515611 18 Inter 0.035 0.04 0.04 0.0 48 50 Local road -0.217248 -0.515206 19* Junct 0.152 0.19 0.19 0.2 48 162 Local road -0.217245 -0.519637 11* Junct- 0.493 0.31 0.68 0.5 96 270 Main road -0.217216 -0.523210 8* Junct- 0.397 0.25 1.08 0.8 96 270 Main road -0.217197 -0.525552 5* Junct- 0.260 0.16 1.34 0.9 96 270 Main road -0.217182 -0.527397 -2 Waypt#2 0.204 0.13 1.54 1.1 96 270 Main road routino-3.4.3/src/test/expected/roundabout-waypoints-WP02.txt 644 233 144 1577 12601522407 17414 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218454 -0.520798 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219482 -0.520837 9* Junct 0.113 0.07 0.11 0.1 96 182 main 1 -0.219577 -0.520689 -2 Waypt#2 0.019 0.01 0.13 0.1 96 122 roundabout -0.219692 -0.520509 15 Junct- 0.023 0.01 0.15 0.1 96 122 roundabout -0.220082 -0.520522 14 Junct- 0.043 0.03 0.20 0.1 96 181 roundabout -0.220268 -0.520863 8* Junct 0.043 0.03 0.24 0.1 96 241 roundabout -0.221566 -0.520921 -3 Waypt#3 0.143 0.09 0.38 0.2 96 182 main 2 routino-3.4.3/src/test/expected/turns-WP07.txt 644 233 144 5056 12725336032 14357 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct 0.072 0.04 0.07 0.0 96 182 main 1 -0.219123 -0.520207 12* Inter 0.069 0.09 0.14 0.1 48 91 top road -0.219131 -0.519426 20* Inter 0.086 0.11 0.23 0.2 48 90 top road -0.219135 -0.518823 23* Inter 0.067 0.08 0.29 0.3 48 90 top road -0.219145 -0.517626 33* Inter 0.133 0.17 0.43 0.5 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 0.47 0.5 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 0.48 0.6 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 0.50 0.6 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 0.52 0.6 48 72 roundabout -0.219153 -0.516826 46* Junct 0.018 0.02 0.54 0.6 48 27 roundabout -0.219184 -0.515968 55* Junct 0.095 0.12 0.63 0.7 48 92 top road -0.220784 -0.516035 54* Junct 0.178 0.11 0.81 0.8 96 182 main 2 -0.220760 -0.516647 48* Junct 0.068 0.09 0.88 0.9 48 272 high street -0.220739 -0.517425 34* Junct 0.086 0.11 0.96 1.0 48 271 high street -0.220238 -0.517313 -2 Waypt#2 0.057 0.07 1.02 1.1 48 12 loop 3 -0.220089 -0.517279 35* Inter 0.017 0.02 1.04 1.1 48 12 loop 3 -0.219872 -0.517009 43 Inter 0.038 0.05 1.08 1.2 48 51 loop 3 -0.220097 -0.516762 47* Inter 0.037 0.04 1.11 1.2 48 132 loop 3 -0.220760 -0.516647 48* Junct 0.074 0.09 1.19 1.3 48 170 loop 3 -0.220739 -0.517425 34* Junct 0.086 0.11 1.27 1.4 48 271 high street -0.220724 -0.518071 31* Junct 0.071 0.09 1.34 1.5 48 271 high street -0.220708 -0.518842 22* Junct 0.085 0.10 1.43 1.6 48 271 high street -0.220691 -0.519461 19* Junct 0.069 0.09 1.50 1.7 48 271 high street -0.220671 -0.520223 11* Junct 0.084 0.10 1.58 1.8 48 271 high street -0.220666 -0.520893 5* Junct 0.074 0.09 1.66 1.9 48 270 high street -0.221308 -0.520914 4* Junct- 0.071 0.04 1.73 1.9 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.75 2.0 96 181 main 1 routino-3.4.3/src/test/expected/loops-WP10.txt 644 233 144 3346 12601522413 14323 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220739 -0.517801 19* Junct 0.187 0.23 0.47 0.5 48 91 high street -0.220301 -0.517576 22* Junct- 0.054 0.07 0.52 0.6 48 27 loop 2 -0.219946 -0.517397 24 Inter 0.044 0.06 0.56 0.6 48 26 loop 2 -0.219266 -0.517579 21* Junct 0.078 0.10 0.64 0.7 48 345 loop 2 -0.218805 -0.517131 25 Waypt#2 0.071 0.09 0.71 0.8 48 44 loop 2 -0.218417 -0.517462 23* Junct- 0.056 0.07 0.77 0.9 48 319 loop 2 -0.218794 -0.517763 20 Inter 0.053 0.07 0.82 0.9 48 218 loop 2 -0.219266 -0.517579 21* Junct 0.056 0.07 0.88 1.0 48 158 loop 2 -0.219946 -0.517397 24 Inter 0.078 0.10 0.95 1.1 48 165 loop 2 -0.220301 -0.517576 22* Junct- 0.044 0.06 1.00 1.2 48 206 loop 2 -0.220739 -0.517801 19* Junct 0.054 0.07 1.05 1.2 48 207 loop 2 -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/turns-WP16.txt 644 233 144 2153 12601522402 14341 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct- 0.072 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 5* Junct- 0.173 0.11 0.24 0.2 96 182 main 1 -0.221308 -0.520914 4* Junct 0.071 0.04 0.32 0.2 96 181 main 1 -0.221360 -0.518860 21* Junct 0.228 0.28 0.54 0.5 48 91 bottom road -0.221711 -0.518511 26* Waypt#2 0.055 0.07 0.60 0.5 48 135 loop 6 -0.221376 -0.518235 29* Junct 0.048 0.06 0.65 0.6 48 39 loop 6 -0.221360 -0.518860 21* Junct 0.069 0.09 0.72 0.7 48 271 bottom road -0.221308 -0.520914 4* Junct 0.228 0.28 0.94 1.0 48 271 bottom road -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 0.97 1.0 96 181 main 1 routino-3.4.3/src/test/expected/cycle-both-ways-WP01.txt 644 233 144 2176 12601522420 16177 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.221402 -0.520913 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220268 -0.520863 8* Junct 0.125 0.08 0.12 0.1 96 2 main 2 -0.220062 -0.521204 2 Inter 0.044 0.03 0.17 0.1 96 301 roundabout -0.219665 -0.521190 3 Inter 0.044 0.03 0.21 0.1 96 1 roundabout -0.219482 -0.520837 9* Junct- 0.044 0.03 0.26 0.2 96 62 roundabout -0.219692 -0.520509 15* Junct 0.043 0.03 0.30 0.2 96 122 roundabout -0.219271 -0.519532 17 Inter 0.118 0.15 0.42 0.3 48 66 residential road -0.219302 -0.518908 20* Junct 0.069 0.09 0.49 0.4 48 92 residential road -0.220811 -0.518939 19* Junct- 0.167 0.10 0.65 0.5 96 181 main 3 -0.221319 -0.518949 -2 Waypt#2 0.056 0.04 0.71 0.6 96 181 main 3 routino-3.4.3/src/test/expected/dead-ends-WP08.txt 644 233 144 2307 12601522416 15021 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220739 -0.517804 18* Junct 0.186 0.23 0.49 0.5 48 91 high street -0.220782 -0.516137 24* Junct 0.185 0.23 0.67 0.8 48 91 high street -0.220361 -0.515961 25* Waypt#2 0.050 0.06 0.72 0.8 48 22 dead-end 3 -0.220782 -0.516137 24* Junct 0.050 0.06 0.77 0.9 48 202 dead-end 3 -0.220817 -0.514062 32* Junct 0.230 0.29 1.00 1.2 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.05 1.2 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.14 1.3 96 2 main 2 routino-3.4.3/src/test/expected/turns-WP10.txt 644 233 144 5162 12725336146 14355 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218453 -0.520799 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219107 -0.520828 6* Junct 0.072 0.04 0.07 0.0 96 182 main 1 -0.219123 -0.520207 12* Inter 0.069 0.09 0.14 0.1 48 91 top road -0.219131 -0.519426 20* Inter 0.086 0.11 0.23 0.2 48 90 top road -0.219135 -0.518823 23* Inter 0.067 0.08 0.29 0.3 48 90 top road -0.219145 -0.517626 33* Inter 0.133 0.17 0.43 0.5 48 90 top road -0.219144 -0.517257 36* Junct 0.041 0.05 0.47 0.5 48 89 top road -0.219291 -0.517193 38 Inter 0.017 0.02 0.48 0.6 48 156 roundabout -0.219352 -0.517060 42 Junct- 0.016 0.02 0.50 0.6 48 114 roundabout -0.219304 -0.516904 45 Inter 0.018 0.02 0.52 0.6 48 72 roundabout -0.219153 -0.516826 46* Junct- 0.018 0.02 0.54 0.6 48 27 roundabout -0.218966 -0.516910 44 Inter 0.022 0.03 0.56 0.6 48 335 roundabout -0.218923 -0.517072 39 Junct- 0.018 0.02 0.58 0.7 48 284 roundabout -0.218998 -0.517207 37 Inter 0.017 0.02 0.59 0.7 48 240 roundabout -0.219144 -0.517257 36* Junct 0.017 0.02 0.61 0.7 48 199 roundabout -0.219145 -0.517626 33* Junct 0.041 0.05 0.65 0.8 48 269 top road -0.219135 -0.518823 23* Junct 0.133 0.17 0.79 0.9 48 270 top road -0.219131 -0.519426 20* Junct 0.067 0.08 0.85 1.0 48 270 top road -0.219123 -0.520207 12* Junct 0.086 0.11 0.94 1.1 48 270 top road -0.218605 -0.520090 -2 Waypt#2 0.059 0.07 1.00 1.2 48 12 loop 4 -0.218474 -0.520060 14* Inter 0.015 0.02 1.01 1.2 48 12 loop 4 -0.218258 -0.519789 16 Inter 0.038 0.05 1.05 1.2 48 51 loop 4 -0.218482 -0.519542 18* Inter 0.037 0.04 1.09 1.3 48 132 loop 4 -0.219131 -0.519426 20* Junct 0.073 0.09 1.16 1.4 48 169 loop 4 -0.219123 -0.520207 12* Junct 0.086 0.11 1.25 1.5 48 270 top road -0.219107 -0.520828 6* Junct 0.069 0.09 1.31 1.6 48 271 top road -0.220666 -0.520893 5* Junct- 0.173 0.11 1.49 1.7 96 182 main 1 -0.221308 -0.520914 4* Junct- 0.071 0.04 1.56 1.7 96 181 main 1 -0.221561 -0.520922 -3 Waypt#3 0.027 0.02 1.59 1.7 96 181 main 1 routino-3.4.3/src/test/expected/super-or-not-WP02.txt 644 233 144 1211 12635016670 15541 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.216828 -0.519457 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.217245 -0.519637 11* Junct 0.050 0.06 0.05 0.1 48 203 Local road -0.217248 -0.515206 19* Junct 0.493 0.31 0.54 0.4 96 90 Main road -0.216919 -0.515308 -2 Waypt#2 0.038 0.05 0.58 0.4 48 342 Local road routino-3.4.3/src/test/expected/dead-ends-WP07.txt 644 233 144 3025 12601522416 15016 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220739 -0.517804 18* Junct 0.186 0.23 0.49 0.5 48 91 high street -0.220296 -0.517634 20* Junct- 0.052 0.07 0.54 0.6 48 21 dead-end 2 -0.219991 -0.517512 21 Inter 0.036 0.04 0.57 0.6 48 21 dead-end 2 -0.219635 -0.517707 -2 Waypt#2 0.045 0.06 0.62 0.7 48 331 dead-end 2 -0.219991 -0.517512 21 Inter 0.045 0.06 0.67 0.7 48 151 dead-end 2 -0.220296 -0.517634 20* Junct- 0.036 0.04 0.70 0.8 48 201 dead-end 2 -0.220739 -0.517804 18* Junct 0.052 0.07 0.75 0.9 48 201 dead-end 2 -0.220782 -0.516137 24* Junct 0.185 0.23 0.94 1.1 48 91 high street -0.220817 -0.514062 32* Junct 0.230 0.29 1.17 1.4 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.22 1.4 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.31 1.5 96 2 main 2 routino-3.4.3/src/test/expected/dead-ends-WP11.txt 644 233 144 3273 12601522415 15015 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220739 -0.517804 18* Junct 0.186 0.23 0.49 0.5 48 91 high street -0.220782 -0.516137 24* Junct 0.185 0.23 0.67 0.8 48 91 high street -0.220361 -0.515961 25* Junct- 0.050 0.06 0.72 0.8 48 22 dead-end 3 -0.220019 -0.515847 26 Inter 0.040 0.05 0.76 0.9 48 18 dead-end 3 -0.219341 -0.516206 23 Inter 0.085 0.10 0.85 1.0 48 332 dead-end 3 -0.218493 -0.515789 27* Waypt#2 0.105 0.13 0.95 1.1 48 26 dead-end 3 -0.219341 -0.516206 23 Inter 0.105 0.13 1.06 1.2 48 206 dead-end 3 -0.220019 -0.515847 26 Inter 0.085 0.10 1.14 1.3 48 152 dead-end 3 -0.220361 -0.515961 25* Junct- 0.040 0.05 1.18 1.4 48 198 dead-end 3 -0.220782 -0.516137 24* Junct 0.050 0.06 1.23 1.5 48 202 dead-end 3 -0.220817 -0.514062 32* Junct 0.230 0.29 1.46 1.7 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.51 1.8 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.60 1.8 96 2 main 2 routino-3.4.3/src/test/expected/roundabout-waypoints-WP07.txt 644 233 144 1454 12601522406 17412 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218454 -0.520798 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219482 -0.520837 9* Junct 0.113 0.07 0.11 0.1 96 182 main 1 -0.219692 -0.520509 15 Junct- 0.043 0.03 0.16 0.1 96 122 roundabout -0.220082 -0.520522 14 Junct- 0.043 0.03 0.20 0.1 96 181 roundabout -0.220268 -0.520863 8* Waypt#2 0.043 0.03 0.24 0.1 96 241 roundabout -0.221566 -0.520921 -3 Waypt#3 0.143 0.09 0.39 0.2 96 182 main 2 routino-3.4.3/src/test/expected/no-super-WP03.txt 644 233 144 1547 12601522412 14741 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.217185 -0.519054 5 Waypt#1 0.000 0.00 0.00 0.0 -0.217382 -0.518273 8 Inter 0.089 0.11 0.09 0.1 48 104 road3 -0.217219 -0.517733 11 Inter 0.062 0.08 0.15 0.2 48 73 road3 -0.217399 -0.516857 14 Inter 0.099 0.12 0.25 0.3 48 101 road3 -0.217202 -0.515964 17 Waypt#2 0.101 0.12 0.35 0.4 48 77 road3 -0.217399 -0.516857 14 Inter 0.101 0.12 0.45 0.6 48 257 road3 -0.217219 -0.517733 11 Waypt#3 0.099 0.12 0.55 0.7 48 281 road3 routino-3.4.3/src/test/expected/coincident-waypoint-WP01.txt 644 233 144 1442 12601522420 17147 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.216904 -0.520770 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.217286 -0.520780 7 Junct- 0.042 0.03 0.04 0.0 96 181 main 1 -0.217741 -0.520789 -2 Waypt#2 0.050 0.03 0.09 0.1 96 181 main 1 -0.217741 -0.520789 -3 Waypt#3 0.000 0.00 0.09 0.1 96 270 main 1 -0.218523 -0.520806 6 Junct- 0.086 0.05 0.18 0.1 96 181 main 1 -0.219080 -0.520824 -4 Waypt#4 0.061 0.04 0.24 0.1 96 181 main 1 routino-3.4.3/src/test/expected/loop-and-reverse-WP-LR.txt 644 233 144 1713 12606772160 16532 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219526 -0.521010 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.218820 -0.520980 5* Junct 0.078 0.05 0.08 0.0 96 2 main 1 -0.218970 -0.513986 15* Junct 0.778 0.97 0.86 1.0 48 91 high street -0.219540 -0.514010 -3 Waypt#3 0.063 0.04 0.92 1.1 96 182 main 2 -0.220817 -0.514062 14* Junct 0.141 0.09 1.06 1.1 96 182 main 2 -0.220749 -0.517228 -2 Waypt#2 0.352 0.44 1.41 1.6 48 271 low street -0.220666 -0.521060 4* Junct 0.426 0.53 1.84 2.1 48 271 low street -0.219526 -0.521010 -1 Waypt#1 0.126 0.08 1.96 2.2 96 2 main 1 routino-3.4.3/src/test/expected/roundabout-waypoints-WP01.txt 644 233 144 1454 12601522407 17405 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218454 -0.520798 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219482 -0.520837 9* Waypt#2 0.113 0.07 0.11 0.1 96 182 main 1 -0.219692 -0.520509 15 Junct- 0.043 0.03 0.16 0.1 96 122 roundabout -0.220082 -0.520522 14 Junct- 0.043 0.03 0.20 0.1 96 181 roundabout -0.220268 -0.520863 8* Junct 0.043 0.03 0.24 0.1 96 241 roundabout -0.221566 -0.520921 -3 Waypt#3 0.143 0.09 0.39 0.2 96 182 main 2 routino-3.4.3/src/test/expected/dead-ends-WP04.txt 644 233 144 3273 12601522416 15020 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220263 -0.519309 13* Junct- 0.052 0.07 0.35 0.4 48 21 dead-end 1 -0.219924 -0.519179 14 Inter 0.040 0.05 0.39 0.4 48 20 dead-end 1 -0.219235 -0.519555 11 Inter 0.087 0.11 0.48 0.5 48 331 dead-end 1 -0.218387 -0.519137 15 Waypt#2 0.105 0.13 0.58 0.7 48 26 dead-end 1 -0.219235 -0.519555 11 Inter 0.105 0.13 0.69 0.8 48 206 dead-end 1 -0.219924 -0.519179 14 Inter 0.087 0.11 0.78 0.9 48 151 dead-end 1 -0.220263 -0.519309 13* Junct- 0.040 0.05 0.82 0.9 48 200 dead-end 1 -0.220702 -0.519478 12* Junct 0.052 0.07 0.87 1.0 48 201 dead-end 1 -0.220739 -0.517804 18* Junct 0.186 0.23 1.05 1.2 48 91 high street -0.220782 -0.516137 24* Junct 0.185 0.23 1.24 1.5 48 91 high street -0.220817 -0.514062 32* Junct 0.230 0.29 1.47 1.8 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.52 1.8 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.61 1.8 96 2 main 2 routino-3.4.3/src/test/expected/dead-ends-WP05.txt 644 233 144 2307 12601522416 15016 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219535 -0.521016 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.521052 5* Junct- 0.076 0.05 0.08 0.0 96 182 main 1 -0.220666 -0.521060 4* Junct 0.049 0.03 0.12 0.1 96 180 main 1 -0.220702 -0.519478 12* Junct 0.176 0.22 0.30 0.3 48 91 high street -0.220739 -0.517804 18* Junct 0.186 0.23 0.49 0.5 48 91 high street -0.220296 -0.517634 20* Waypt#2 0.052 0.07 0.54 0.6 48 21 dead-end 2 -0.220739 -0.517804 18* Junct 0.052 0.07 0.59 0.7 48 201 dead-end 2 -0.220782 -0.516137 24* Junct 0.185 0.23 0.78 0.9 48 91 high street -0.220817 -0.514062 32* Junct 0.230 0.29 1.01 1.2 48 90 high street -0.220344 -0.514042 33* Junct- 0.052 0.03 1.06 1.2 96 2 main 2 -0.219539 -0.514007 -3 Waypt#3 0.089 0.06 1.15 1.3 96 2 main 2 routino-3.4.3/src/test/expected/node-restrictions-WP04.txt 644 233 144 3416 12601522522 16644 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219564 -0.520846 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220666 -0.520893 4* Junct 0.122 0.07 0.12 0.1 96 182 main 1 -0.220682 -0.520141 9* Junct 0.083 0.08 0.20 0.2 64 91 high street -0.220695 -0.519489 12* Change 0.072 0.07 0.28 0.2 64 91 high street -0.220140 -0.519342 14 Inter 0.063 0.08 0.34 0.3 48 14 nopass road -0.220173 -0.518597 20 Waypt#2 0.082 0.10 0.42 0.4 48 92 nopass road -0.220140 -0.519342 14 Inter 0.082 0.10 0.50 0.5 48 272 nopass road -0.220695 -0.519489 12* Junct 0.063 0.08 0.57 0.6 48 194 nopass road -0.220694 -0.519227 15 Inter 0.029 0.04 0.60 0.6 48 89 long road -0.220386 -0.519076 16 Inter 0.038 0.05 0.63 0.7 48 26 long road -0.220961 -0.518928 17 Inter 0.066 0.08 0.70 0.7 48 165 long road -0.220427 -0.518622 18 Inter 0.068 0.09 0.77 0.8 48 29 long road -0.220949 -0.518422 21 Inter 0.062 0.08 0.83 0.9 48 159 long road -0.220455 -0.518238 22 Inter 0.058 0.07 0.89 1.0 48 20 long road -0.220746 -0.518070 23 Inter 0.037 0.04 0.93 1.0 48 149 long road -0.220739 -0.517801 26* Junct 0.029 0.04 0.95 1.1 48 88 long road -0.220784 -0.516035 31* Junct 0.196 0.18 1.15 1.2 64 91 high street -0.219593 -0.515985 -3 Waypt#3 0.132 0.08 1.28 1.3 96 2 main 2 routino-3.4.3/src/test/expected/roundabout-waypoints-WP03.txt 644 233 144 1453 12601522407 17406 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.218454 -0.520798 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.219482 -0.520837 9* Junct 0.113 0.07 0.11 0.1 96 182 main 1 -0.219692 -0.520509 15 Waypt#2 0.043 0.03 0.16 0.1 96 122 roundabout -0.220082 -0.520522 14 Junct- 0.043 0.03 0.20 0.1 96 181 roundabout -0.220268 -0.520863 8* Junct 0.043 0.03 0.24 0.1 96 241 roundabout -0.221566 -0.520921 -3 Waypt#3 0.143 0.09 0.39 0.2 96 182 main 2 routino-3.4.3/src/test/expected/loops-WP02.txt 644 233 144 3345 12601522414 14324 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220280 -0.519256 15* Junct- 0.052 0.07 0.33 0.3 48 29 loop 1 -0.219910 -0.519112 17 Waypt#2 0.044 0.06 0.37 0.4 48 21 loop 1 -0.219237 -0.519286 13* Junct 0.077 0.10 0.45 0.5 48 345 loop 1 -0.218764 -0.519471 12 Inter 0.056 0.07 0.51 0.6 48 338 loop 1 -0.218380 -0.519134 16 Inter 0.056 0.07 0.56 0.6 48 41 loop 1 -0.218776 -0.518838 18 Inter 0.055 0.07 0.62 0.7 48 143 loop 1 -0.219237 -0.519286 13* Junct 0.071 0.09 0.69 0.8 48 224 loop 1 -0.219910 -0.519112 17 Inter 0.077 0.10 0.77 0.9 48 165 loop 1 -0.220280 -0.519256 15* Junct- 0.044 0.06 0.81 0.9 48 201 loop 1 -0.220695 -0.519489 11* Junct 0.052 0.07 0.86 1.0 48 209 loop 1 -0.220739 -0.517801 19* Junct 0.187 0.23 1.05 1.2 48 91 high street -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/fake-node-with-loop-WP02.txt 644 233 144 2426 12601522415 16741 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.216959 -0.520771 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.217286 -0.520780 10 Junct- 0.036 0.02 0.04 0.0 96 181 main 1 -0.218523 -0.520806 9 Junct- 0.137 0.09 0.17 0.1 96 181 main 1 -0.219171 -0.520827 -2 Waypt#2 0.071 0.04 0.24 0.1 96 181 main 1 -0.219482 -0.520837 8* Junct 0.034 0.02 0.28 0.2 96 181 main 1 -0.219692 -0.520509 14 Junct- 0.043 0.03 0.32 0.2 96 122 roundabout -0.220082 -0.520522 13 Junct- 0.043 0.03 0.36 0.2 96 181 roundabout -0.220268 -0.520863 7 Inter 0.043 0.03 0.41 0.2 96 241 roundabout -0.220062 -0.521204 4 Junct- 0.044 0.03 0.45 0.3 96 301 roundabout -0.219665 -0.521190 5 Junct- 0.044 0.03 0.49 0.3 96 1 roundabout -0.219482 -0.520837 8* Junct 0.044 0.03 0.54 0.3 96 62 roundabout -0.218842 -0.520816 -3 Waypt#3 0.070 0.04 0.61 0.4 96 1 main 1 routino-3.4.3/src/test/expected/loops-WP06.txt 644 233 144 3345 12601522413 14327 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.219562 -0.520851 -1 Waypt#1 0.000 0.00 0.00 0.0 -0.220223 -0.520885 5* Junct- 0.073 0.04 0.07 0.0 96 182 main 1 -0.220666 -0.520893 4* Junct 0.049 0.03 0.12 0.1 96 181 main 1 -0.220695 -0.519489 11* Junct 0.156 0.20 0.28 0.3 48 91 high street -0.220739 -0.517801 19* Junct 0.187 0.23 0.47 0.5 48 91 high street -0.220301 -0.517576 22* Waypt#2 0.054 0.07 0.52 0.6 48 27 loop 2 -0.219946 -0.517397 24 Inter 0.044 0.06 0.56 0.6 48 26 loop 2 -0.219266 -0.517579 21* Junct 0.078 0.10 0.64 0.7 48 345 loop 2 -0.218794 -0.517763 20 Inter 0.056 0.07 0.70 0.8 48 338 loop 2 -0.218417 -0.517462 23* Junct- 0.053 0.07 0.75 0.9 48 38 loop 2 -0.218805 -0.517131 25 Inter 0.056 0.07 0.81 0.9 48 139 loop 2 -0.219266 -0.517579 21* Junct 0.071 0.09 0.88 1.0 48 224 loop 2 -0.219946 -0.517397 24 Inter 0.078 0.10 0.95 1.1 48 165 loop 2 -0.220301 -0.517576 22* Junct- 0.044 0.06 1.00 1.2 48 206 loop 2 -0.220739 -0.517801 19* Junct 0.054 0.07 1.05 1.2 48 207 loop 2 -0.220784 -0.516035 30* Junct 0.196 0.24 1.25 1.5 48 91 high street -0.220311 -0.516015 31* Junct- 0.052 0.03 1.30 1.5 96 2 main 2 -0.219596 -0.515984 -3 Waypt#3 0.079 0.05 1.38 1.6 96 2 main 2 routino-3.4.3/src/test/expected/super-or-not-WP03.txt 644 233 144 1212 12635016730 15540 0# Creator : Routino - http://www.routino.org/ # Source : Routino test cases - (c) Andrew M. Bishop # License : GNU Affero General Public License v3 or later # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n -0.217245 -0.519637 11* Waypt#1 0.000 0.00 0.00 0.0 -0.215919 -0.519064 12 Inter 0.160 0.20 0.16 0.2 48 23 Local road -0.216435 -0.518515 13 Inter 0.083 0.10 0.24 0.3 48 133 Local road -0.215866 -0.517931 14 Waypt#2 0.090 0.11 0.33 0.4 48 45 Local road routino-3.4.3/src/test/oneway-loop.osm 644 233 144 10263 12114366272 13155 0 routino-3.4.3/src/test/no-super.sh 777 233 144 0 12064636362 13402 2a-b-c.shroutino-3.4.3/src/test/prune-short.osm 644 233 144 65656 12114416166 13210 0 routino-3.4.3/src/test/invalid-turn-relations.osm 644 233 144 22476 12105426741 15325 0 routino-3.4.3/src/test/sanitizer-suppressions.txt 644 233 144 16 13452410542 15417 0leak:FileName routino-3.4.3/src/test/prune-straight.sh 777 233 144 0 12114436047 16033 2only-split.shroutino-3.4.3/src/test/dead-ends.sh 777 233 144 0 12064636362 15350 2start-1-finish.shroutino-3.4.3/src/test/loops.osm 644 233 144 16247 12064636362 12054 0 routino-3.4.3/src/test/only-split.sh 755 233 144 752 13364652324 12603 0#!/bin/sh # Pruned or non-pruned - special case if [ "$2" = "prune" ]; then case $name in prune-isolated) prune="--prune-none --prune-isolated=100";; prune-short) prune="--prune-none --prune-short=5";; prune-straight) prune="--prune-none --prune-straight=5";; *) prune="";; esac pruned="-pruned" else prune="--prune-none" pruned="" fi # Run planetsplitter run_planetsplitter $prune # Run filedumper run_filedumper routino-3.4.3/src/test/roundabout-waypoints.sh 777 233 144 0 12317323573 17737 2start-1-finish.shroutino-3.4.3/src/test/fake-node-with-loop.osm 644 233 144 10546 12327506445 14465 0 routino-3.4.3/src/test/fake-node-with-loop.sh 777 233 144 0 12326742550 15401 2a-b-c.shroutino-3.4.3/src/test/prune-straight.osm 644 233 144 20500 12327506436 13657 0 routino-3.4.3/src/test/a-b.sh 755 233 144 1004 13364652304 11135 0#!/bin/sh # Run planetsplitter run_planetsplitter # Run filedumper run_filedumper # Waypoints waypoints=`run_waypoints $osm list` # Run the router for each waypoint for waypoint in $waypoints; do case $waypoint in *a) waypoint=`echo $waypoint | sed -e 's%a$%%'` ;; *) continue ;; esac echo "Running router : $waypoint" waypoint_a=`run_waypoints $osm ${waypoint}a 1` waypoint_b=`run_waypoints $osm ${waypoint}b 2` run_router $waypoint $waypoint_a $waypoint_b done routino-3.4.3/src/test/cycle-both-ways.osm 644 233 144 10655 12327513605 13723 0 routino-3.4.3/src/test/coincident-waypoint.osm 644 233 144 10700 12333376606 14674 0 routino-3.4.3/src/test/Makefile 644 233 144 2723 13454404165 11610 0# Test cases Makefile # # Part of the Routino routing software. # # This file Copyright 2011-2015, 2018 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../../Makefile.conf # Executables EXE=is-fast-math$(.EXE) ######## all : ######## test : test-exe $(EXE) @./run-all-tests.sh ######## test-exe : cd .. && $(MAKE) all-exe all-lib is-fast-math$(.EXE) : is-fast-math.o $(LD) $< -o $@ $(LDFLAGS) is-fast-math.o : is-fast-math.c $(CC) -c $(CFLAGS) $< -o $@ ######## install: ######## clean: rm -rf fat rm -rf slim rm -rf fat+lib rm -rf slim+lib rm -rf fat-pruned rm -rf slim-pruned rm -f *.log rm -f *~ rm -f *.o rm -f $(EXE) rm -f core rm -f *.gcda *.gcno *.gcov gmon.out ######## distclean: clean ######## .PHONY:: all test install clean distclean .PHONY:: test-exe routino-3.4.3/src/test/start-1-finish.sh 755 233 144 1061 13364652340 13252 0#!/bin/sh # Run planetsplitter run_planetsplitter # Run filedumper run_filedumper # Waypoints waypoints=`run_waypoints $osm list` waypoint_start=`run_waypoints $osm WPstart 1` waypoint_finish=`run_waypoints $osm WPfinish 3` # Run the router for each waypoint for waypoint in $waypoints; do [ ! $waypoint = "WPstart" ] || continue [ ! $waypoint = "WPfinish" ] || continue echo "Running router : $waypoint" waypoint_test=`run_waypoints $osm $waypoint 2` run_router $waypoint $waypoint_start $waypoint_test $waypoint_finish done routino-3.4.3/src/test/run-all-tests.sh 755 233 144 3656 13364652727 13240 0#!/bin/sh # Run with a debugger or not? debugger=valgrind debugger= TEST_DEBUGGER=$debugger export TEST_DEBUGGER # Overall status status=true # Functions for running tests run_a_test () { script=$1 shift if ./run-one-test.sh $script $@ ; then echo "... passed" else echo "... FAILED" status=false fi } compare_results () { if diff -q -r $1 $2; then echo "... matched" else echo "... match FAILED" status=false fi } # Initial informational message echo "" ./is-fast-math message # Get the list of tests scripts=`echo *.osm | sed -e s/.osm/.sh/g` # Loop round the different test types for type in 1 2 3; do case $type in 1) suffix="" arg="" description="" ;; 2) suffix="+lib" arg="lib" description="libroutino" ;; 3) suffix="-pruned" arg="prune" description="pruned" ;; esac # Run the script (non-slim mode) for script in $scripts; do echo "" echo "Testing: $script (non-slim, $description) ... " run_a_test $script fat $arg done # Run the script (slim mode) for script in $scripts; do echo "" echo "Testing: $script (slim, $description) ... " run_a_test $script slim $arg done # Check results if $status; then echo "Success: all tests passed" else echo "Warning: Some tests FAILED" exit 1 fi # Compare normal/slim results echo "" echo "Comparing: slim and non-slim results ($description) ... " compare_results fat$suffix slim$suffix # Check comparison if $status; then echo "Success: slim and non-slim results match" else echo "Warning: slim and non-slim results are different" exit 1 fi done # Finish exit 0 routino-3.4.3/src/test/super-or-not.osm 644 233 144 7676 12635017361 13254 0 routino-3.4.3/src/test/turns.osm 644 233 144 43517 12064636362 12073 0 routino-3.4.3/src/test/waypoints.pl 755 233 144 3443 12306670127 12543 0#!/usr/bin/perl # # Routing test case generator tool. # # Part of the Routino routing software. # # This file Copyright 2011-2014 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Command line if($#ARGV<1 || $ARGV>2 || ! -f $ARGV[0]) { die "Usage: waypoints.pl list\n". " waypoints.pl \n"; } # Parse the file open(FILE,"<$ARGV[0]") || die "Cannot open '$ARGV[0]'\n"; my %waypoints=(); my @waypoints=(); my @waypoint_lat=(); my @waypoint_lon=(); my $innode=0; while() { if($innode) { if(m%%); } elsif(m%%) { $innode=1; push(@waypoint_lat,$1); push(@waypoint_lon,$2); } } close(FILE); # Perform the action if($ARGV[1] eq "list") { print join(" ",sort @waypoints)."\n"; exit 0; } if($waypoints{$ARGV[1]} ne "") { print "--lat$ARGV[2]=$waypoint_lat[$waypoints{$ARGV[1]}] --lon$ARGV[2]=$waypoint_lon[$waypoints{$ARGV[1]}]\n"; exit 0; } exit 1; routino-3.4.3/src/test/cycle-drive.sh 755 233 144 1052 13364652311 12705 0#!/bin/sh # Run planetsplitter run_planetsplitter # Run filedumper run_filedumper # Waypoints waypoints=`run_waypoints $osm list` waypoint_start=`run_waypoints $osm WPstart 1` waypoint_finish=`run_waypoints $osm WPfinish 2` # Run the router for each profile type profiles="motorcar bicycle" for profile in $profiles; do case $profile in motorcar) waypoint=WP01 ;; *) waypoint=WP02 ;; esac echo "Running router : $waypoint" run_router $waypoint --profile=$profile $waypoint_start $waypoint_finish done routino-3.4.3/src/test/cycle-both-ways.sh 777 233 144 0 12327512664 16173 2cycle-drive.shroutino-3.4.3/src/test/node-restrictions.osm 644 233 144 16636 12114366273 14372 0 routino-3.4.3/src/test/copyright.xml 644 233 144 2406 12563645242 12703 0 routino-3.4.3/src/test/invalid-turn-relations.sh 777 233 144 0 12064636362 17477 2only-split.shroutino-3.4.3/src/filedumper.c 644 233 144 133644 13713767721 11550 0/*************************************** Memory file dumper. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2018, 2019, 2020 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include #include #include "version.h" #include "types.h" #include "nodes.h" #include "segments.h" #include "ways.h" #include "relations.h" #include "errorlog.h" #include "files.h" #include "visualiser.h" #include "xmlparse.h" /* Local functions */ static void print_node(Nodes *nodes,index_t item); static void print_segment(Segments *segments,index_t item); static void print_way(Ways *ways,index_t item); static void print_turn_relation(Relations *relations,index_t item,Segments *segments,Nodes *nodes); static void print_errorlog(ErrorLogs *errorlogs,index_t item); static void print_head_osm(int coordcount,double latmin,double latmax,double lonmin,double lonmax); static void print_region_osm(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations, double latmin,double latmax,double lonmin,double lonmax,int option_no_super); static void print_node_osm(Nodes *nodes,index_t item); static void print_segment_osm(Segments *segments,index_t item,Ways *ways); static void print_turn_relation_osm(Relations *relations,index_t item,Segments *segments,Nodes *nodes); static void print_tail_osm(void); static void print_node_visualiser(Nodes *nodes,index_t item); static void print_segment_visualiser(Segments *segments,index_t item,Ways *ways); static void print_turn_relation_visualiser(Relations *relations,index_t item,Segments *segments,Nodes *nodes); static void print_errorlog_visualiser(ErrorLogs *errorlogs,index_t item); static char *RFC822Date(time_t t); static void print_usage(int detail,const char *argerr,const char *err); /*++++++++++++++++++++++++++++++++++++++ The main program for the file dumper. ++++++++++++++++++++++++++++++++++++++*/ int main(int argc,char** argv) { Nodes *OSMNodes; Segments *OSMSegments; Ways *OSMWays; Relations*OSMRelations; ErrorLogs*OSMErrorLogs=NULL; int arg; char *dirname=NULL,*prefix=NULL; char *nodes_filename,*segments_filename,*ways_filename,*relations_filename,*errorlogs_filename; int option_statistics=0; int option_visualiser=0,coordcount=0; double latmin=0,latmax=0,lonmin=0,lonmax=0; char *option_data=NULL; int option_dump=0; int option_dump_osm=0,option_no_super=0; int option_dump_visualiser=0; /* Parse the command line arguments */ for(arg=1;argfile.number); printf("Number(super)=%9"Pindex_t"\n",OSMNodes->file.snumber); printf("\n"); printf("Lat bins= %4d\n",(int)OSMNodes->file.latbins); printf("Lon bins= %4d\n",(int)OSMNodes->file.lonbins); printf("\n"); printf("Lat zero=%5d (%8.4f deg)\n",(int)OSMNodes->file.latzero,radians_to_degrees(latlong_to_radians(bin_to_latlong(OSMNodes->file.latzero)))); printf("Lon zero=%5d (%8.4f deg)\n",(int)OSMNodes->file.lonzero,radians_to_degrees(latlong_to_radians(bin_to_latlong(OSMNodes->file.lonzero)))); /* Examine the segments */ printf("\n"); printf("Segments\n"); printf("--------\n"); printf("\n"); printf("sizeof(Segment)=%9zu Bytes\n",sizeof(Segment)); printf("Number(total) =%9"Pindex_t"\n",OSMSegments->file.number); printf("Number(super) =%9"Pindex_t"\n",OSMSegments->file.snumber); printf("Number(normal) =%9"Pindex_t"\n",OSMSegments->file.nnumber); /* Examine the ways */ printf("\n"); printf("Ways\n"); printf("----\n"); printf("\n"); printf("sizeof(Way)=%9zu Bytes\n",sizeof(Way)); printf("Number =%9"Pindex_t"\n",OSMWays->file.number); printf("\n"); stat(ways_filename,&buf); printf("Total names=%9zu Bytes\n",(size_t)buf.st_size-sizeof(Ways)-OSMWays->file.number*sizeof(Way)); printf("\n"); printf("Included highways : %s\n",HighwaysNameList(OSMWays->file.highways)); printf("Included transports: %s\n",TransportsNameList(OSMWays->file.transports)); printf("Included properties: %s\n",PropertiesNameList(OSMWays->file.properties)); /* Examine the relations */ printf("\n"); printf("Relations\n"); printf("---------\n"); printf("\n"); printf("sizeof(TurnRelation)=%9zu Bytes\n",sizeof(TurnRelation)); printf("Number =%9"Pindex_t"\n",OSMRelations->file.trnumber); if(errorlogs_filename) { printf("\n"); printf("Error Logs\n"); printf("----------\n"); printf("\n"); printf("Number(total) =%9"Pindex_t"\n",OSMErrorLogs->file.number); printf("Number(geographical) =%9"Pindex_t"\n",OSMErrorLogs->file.number_geo); printf("Number(non-geographical)=%9"Pindex_t"\n",OSMErrorLogs->file.number_nongeo); printf("\n"); stat(errorlogs_filename,&buf); #if !SLIM printf("Total strings=%9zu Bytes\n",(size_t)buf.st_size-(OSMErrorLogs->strings-(char*)OSMErrorLogs->data)); #else printf("Total strings=%9zu Bytes\n",(size_t)buf.st_size-(size_t)OSMErrorLogs->stringsoffset); #endif } } /* Print out internal data (in plain text format) */ if(option_dump) { index_t item; for(arg=1;argfile.number;item++) print_node(OSMNodes,item); } else if(!strncmp(argv[arg],"--node=",7)) { item=atoi(&argv[arg][7]); if(itemfile.number) print_node(OSMNodes,item); else printf("Invalid node number; minimum=0, maximum=%"Pindex_t".\n",OSMNodes->file.number-1); } else if(!strcmp(argv[arg],"--segment=all")) { for(item=0;itemfile.number;item++) print_segment(OSMSegments,item); } else if(!strncmp(argv[arg],"--segment=",10)) { item=atoi(&argv[arg][10]); if(itemfile.number) print_segment(OSMSegments,item); else printf("Invalid segment number; minimum=0, maximum=%"Pindex_t".\n",OSMSegments->file.number-1); } else if(!strcmp(argv[arg],"--way=all")) { for(item=0;itemfile.number;item++) print_way(OSMWays,item); } else if(!strncmp(argv[arg],"--way=",6)) { item=atoi(&argv[arg][6]); if(itemfile.number) print_way(OSMWays,item); else printf("Invalid way number; minimum=0, maximum=%"Pindex_t".\n",OSMWays->file.number-1); } else if(!strcmp(argv[arg],"--turn-relation=all")) { for(item=0;itemfile.trnumber;item++) print_turn_relation(OSMRelations,item,OSMSegments,OSMNodes); } else if(!strncmp(argv[arg],"--turn-relation=",16)) { item=atoi(&argv[arg][16]); if(itemfile.trnumber) print_turn_relation(OSMRelations,item,OSMSegments,OSMNodes); else printf("Invalid turn relation number; minimum=0, maximum=%"Pindex_t".\n",OSMRelations->file.trnumber-1); } else if(!strcmp(argv[arg],"--errorlog=all")) { for(item=0;itemfile.number;item++) print_errorlog(OSMErrorLogs,item); } else if(!strncmp(argv[arg],"--errorlog=",11)) { item=atoi(&argv[arg][11]); if(itemfile.number) print_errorlog(OSMErrorLogs,item); else printf("Invalid error log number; minimum=0, maximum=%"Pindex_t".\n",OSMErrorLogs->file.number-1); } } /* Print out internal data (in OSM XML format) */ if(option_dump_osm) { if(coordcount>0 && coordcount!=4) print_usage(0,NULL,"The --dump-osm option must have all of --latmin, --latmax, --lonmin, --lonmax or none.\n"); print_head_osm(coordcount,latmin,latmax,lonmin,lonmax); if(coordcount) print_region_osm(OSMNodes,OSMSegments,OSMWays,OSMRelations,latmin,latmax,lonmin,lonmax,option_no_super); else { index_t item; for(item=0;itemfile.number;item++) print_node_osm(OSMNodes,item); for(item=0;itemfile.number;item++) if(!option_no_super || IsNormalSegment(LookupSegment(OSMSegments,item,1))) print_segment_osm(OSMSegments,item,OSMWays); for(item=0;itemfile.trnumber;item++) print_turn_relation_osm(OSMRelations,item,OSMSegments,OSMNodes); } print_tail_osm(); } /* Print out internal data (in HTML format for the visualiser) */ if(option_dump_visualiser) { index_t item; if(!option_data) print_usage(0,NULL,"The --dump-visualiser option must have --data.\n"); for(arg=1;argfile.number) print_node_visualiser(OSMNodes,item); else printf("Invalid node number; minimum=0, maximum=%"Pindex_t".\n",OSMNodes->file.number-1); } else if(!strncmp(argv[arg],"--data=segment",14)) { item=atoi(&argv[arg][14]); if(itemfile.number) print_segment_visualiser(OSMSegments,item,OSMWays); else printf("Invalid segment number; minimum=0, maximum=%"Pindex_t".\n",OSMSegments->file.number-1); } else if(!strncmp(argv[arg],"--data=turn-relation",20)) { item=atoi(&argv[arg][20]); if(itemfile.trnumber) print_turn_relation_visualiser(OSMRelations,item,OSMSegments,OSMNodes); else printf("Invalid turn relation number; minimum=0, maximum=%"Pindex_t".\n",OSMRelations->file.trnumber-1); } else if(!strncmp(argv[arg],"--data=errorlog",15)) { item=atoi(&argv[arg][15]); if(itemfile.number) print_errorlog_visualiser(OSMErrorLogs,item); else printf("Invalid error log number; minimum=0, maximum=%"Pindex_t".\n",OSMErrorLogs->file.number-1); } } exit(EXIT_SUCCESS); } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of a node from the routing database (as plain text). Nodes *nodes The set of nodes to use. index_t item The node index to print. ++++++++++++++++++++++++++++++++++++++*/ static void print_node(Nodes *nodes,index_t item) { Node *nodep=LookupNode(nodes,item,1); double latitude,longitude; GetLatLong(nodes,item,nodep,&latitude,&longitude); printf("Node %"Pindex_t"\n",item); printf(" firstseg=%"Pindex_t"\n",nodep->firstseg); printf(" latoffset=%d lonoffset=%d (latitude=%.6f longitude=%.6f)\n",nodep->latoffset,nodep->lonoffset,radians_to_degrees(latitude),radians_to_degrees(longitude)); printf(" allow=%03x (%s)\n",nodep->allow,TransportsNameList(nodep->allow)); if(IsSuperNode(nodep)) printf(" Super-Node\n"); if(nodep->flags & NODE_MINIRNDBT) printf(" Mini-roundabout\n"); } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of a segment from the routing database (as plain text). Segments *segments The set of segments to use. index_t item The segment index to print. ++++++++++++++++++++++++++++++++++++++*/ static void print_segment(Segments *segments,index_t item) { Segment *segmentp=LookupSegment(segments,item,1); printf("Segment %"Pindex_t"\n",item); printf(" node1=%"Pindex_t" node2=%"Pindex_t"\n",segmentp->node1,segmentp->node2); printf(" next2=%"Pindex_t"\n",segmentp->next2); printf(" way=%"Pindex_t"\n",segmentp->way); printf(" distance=%d (%.3f km)\n",DISTANCE(segmentp->distance),distance_to_km(DISTANCE(segmentp->distance))); if(IsSuperSegment(segmentp) && IsNormalSegment(segmentp)) printf(" Super-Segment AND normal Segment\n"); else if(IsSuperSegment(segmentp) && !IsNormalSegment(segmentp)) printf(" Super-Segment\n"); if(IsOnewayTo(segmentp,segmentp->node1)) printf(" One-Way from node2 to node1\n"); if(IsOnewayTo(segmentp,segmentp->node2)) printf(" One-Way from node1 to node2\n"); } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of a way from the routing database (as plain text). Ways *ways The set of ways to use. index_t item The way index to print. ++++++++++++++++++++++++++++++++++++++*/ static void print_way(Ways *ways,index_t item) { Way *wayp=LookupWay(ways,item,1); char *name=WayName(ways,wayp); printf("Way %"Pindex_t"\n",item); if(*name) printf(" name=%s\n",name); printf(" type=%03x (%s%s%s%s)\n",wayp->type, HighwayName(HIGHWAY(wayp->type)), wayp->type&Highway_OneWay?",One-Way":"", wayp->type&Highway_CycleBothWays?",Cycle-Both-Ways":"", wayp->type&Highway_Roundabout?",Roundabout":""); printf(" allow=%03x (%s)\n",wayp->allow,TransportsNameList(wayp->allow)); if(wayp->props) printf(" props=%02x (%s)\n",wayp->props,PropertiesNameList(wayp->props)); if(wayp->speed) printf(" speed=%d (%d km/hr)\n",wayp->speed,speed_to_kph(wayp->speed)); if(wayp->weight) printf(" weight=%d (%.1f tonnes)\n",wayp->weight,weight_to_tonnes(wayp->weight)); if(wayp->height) printf(" height=%d (%.1f m)\n",wayp->height,height_to_metres(wayp->height)); if(wayp->width) printf(" width=%d (%.1f m)\n",wayp->width,width_to_metres(wayp->width)); if(wayp->length) printf(" length=%d (%.1f m)\n",wayp->length,length_to_metres(wayp->length)); } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of a turn relation from the routing database (as plain text). Relations *relations The set of relations to use. index_t item The turn relation index to print. Segments *segments The set of segments to use. Nodes *nodes The set of nodes to use. ++++++++++++++++++++++++++++++++++++++*/ static void print_turn_relation(Relations *relations,index_t item,Segments *segments,Nodes *nodes) { Segment *segmentp; TurnRelation *relationp=LookupTurnRelation(relations,item,1); Node *nodep=LookupNode(nodes,relationp->via,1); index_t from_way=NO_WAY,to_way=NO_WAY; index_t from_node=NO_NODE,to_node=NO_NODE; segmentp=FirstSegment(segments,nodep,1); do { index_t seg=IndexSegment(segments,segmentp); if(seg==relationp->from) { from_node=OtherNode(segmentp,relationp->via); from_way=segmentp->way; } if(seg==relationp->to) { to_node=OtherNode(segmentp,relationp->via); to_way=segmentp->way; } segmentp=NextSegment(segments,segmentp,relationp->via); } while(segmentp); printf("Relation %"Pindex_t"\n",item); printf(" from=%"Pindex_t" (segment) = %"Pindex_t" (way) = %"Pindex_t" (node)\n",relationp->from,from_way,from_node); printf(" via=%"Pindex_t" (node)\n",relationp->via); printf(" to=%"Pindex_t" (segment) = %"Pindex_t" (way) = %"Pindex_t" (node)\n",relationp->to,to_way,to_node); if(relationp->except) printf(" except=%03x (%s)\n",relationp->except,TransportsNameList(relationp->except)); } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of an error log from the routing database (as plain text). ErrorLogs *errorlogs The set of error logs to use. index_t item The error log index to print. ++++++++++++++++++++++++++++++++++++++*/ static void print_errorlog(ErrorLogs *errorlogs,index_t item) { ErrorLog *errorlogp=LookupErrorLog(errorlogs,item,1); printf("Error Log %"Pindex_t"\n",item); if(itemfile.number_geo) { double latitude,longitude; GetErrorLogLatLong(errorlogs,item,errorlogp,&latitude,&longitude); printf(" latoffset=%d lonoffset=%d (latitude=%.6f longitude=%.6f)\n",errorlogp->latoffset,errorlogp->lonoffset,radians_to_degrees(latitude),radians_to_degrees(longitude)); } else printf(" No geographical information\n"); printf(" '%s'\n",LookupErrorLogString(errorlogs,item)); } /*++++++++++++++++++++++++++++++++++++++ Print out a header in OSM XML format. int coordcount If true then include a bounding box. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. ++++++++++++++++++++++++++++++++++++++*/ static void print_head_osm(int coordcount,double latmin,double latmax,double lonmin,double lonmax) { printf("\n"); printf("\n"); if(coordcount) printf(" \n", radians_to_degrees(latmin),radians_to_degrees(latmax),radians_to_degrees(lonmin),radians_to_degrees(lonmax)); } /*++++++++++++++++++++++++++++++++++++++ Print a region of the database in OSM XML format. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. int option_no_super The option to print no super-segments. ++++++++++++++++++++++++++++++++++++++*/ static void print_region_osm(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations, double latmin,double latmax,double lonmin,double lonmax,int option_no_super) { ll_bin_t latminbin=latlong_to_bin(radians_to_latlong(latmin))-nodes->file.latzero; ll_bin_t latmaxbin=latlong_to_bin(radians_to_latlong(latmax))-nodes->file.latzero; ll_bin_t lonminbin=latlong_to_bin(radians_to_latlong(lonmin))-nodes->file.lonzero; ll_bin_t lonmaxbin=latlong_to_bin(radians_to_latlong(lonmax))-nodes->file.lonzero; ll_bin_t latb,lonb; index_t item,index1,index2; if(latminbin<0) latminbin=0; if(latmaxbin>nodes->file.latbins) latmaxbin=nodes->file.latbins-1; if(lonminbin<0) lonminbin=0; if(lonmaxbin>nodes->file.lonbins) lonmaxbin=nodes->file.lonbins-1; /* Loop through all of the nodes. */ for(latb=latminbin;latb<=latmaxbin;latb++) for(lonb=lonminbin;lonb<=lonmaxbin;lonb++) { ll_bin2_t llbin=lonb*nodes->file.latbins+latb; if(llbin<0 || llbin>(nodes->file.latbins*nodes->file.lonbins)) continue; index1=LookupNodeOffset(nodes,llbin); index2=LookupNodeOffset(nodes,llbin+1); for(item=index1;itemfile.latzero+latb)+off_to_latlong(nodep->latoffset)); double lon=latlong_to_radians(bin_to_latlong(nodes->file.lonzero+lonb)+off_to_latlong(nodep->lonoffset)); if(lat>latmin && latlonmin && lonlatmin && olatlonmin && olonoitem) if(!option_no_super || IsNormalSegment(segmentp)) print_segment_osm(segments,IndexSegment(segments,segmentp),ways); segmentp=NextSegment(segments,segmentp,item); } if(IsTurnRestrictedNode(nodep)) { index_t relindex=FindFirstTurnRelation1(relations,item); while(relindex!=NO_RELATION) { print_turn_relation_osm(relations,relindex,segments,nodes); relindex=FindNextTurnRelation1(relations,relindex); } } } } } } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of a node from the routing database (in OSM XML format). Nodes *nodes The set of nodes to use. index_t item The node index to print. ++++++++++++++++++++++++++++++++++++++*/ static void print_node_osm(Nodes *nodes,index_t item) { Node *nodep=LookupNode(nodes,item,1); double latitude,longitude; int i; GetLatLong(nodes,item,nodep,&latitude,&longitude); if(nodep->allow==Transports_ALL && nodep->flags==0) printf(" \n",item+1,radians_to_degrees(latitude),radians_to_degrees(longitude)); else { printf(" \n",item+1,radians_to_degrees(latitude),radians_to_degrees(longitude)); if(nodep->flags & NODE_SUPER) printf(" \n"); if(nodep->flags & NODE_UTURN) printf(" \n"); if(nodep->flags & NODE_MINIRNDBT) printf(" \n"); if(nodep->flags & NODE_TURNRSTRCT) printf(" \n"); for(i=1;iallow & TRANSPORTS(i))) printf(" \n",TransportName(i)); printf(" \n"); } } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of a segment from the routing database (as a way in OSM XML format). Segments *segments The set of segments to use. index_t item The segment index to print. Ways *ways The set of ways to use. ++++++++++++++++++++++++++++++++++++++*/ static void print_segment_osm(Segments *segments,index_t item,Ways *ways) { Segment *segmentp=LookupSegment(segments,item,1); Way *wayp=LookupWay(ways,segmentp->way,1); char *name=WayName(ways,wayp); int i; printf(" \n",item+1); if(IsOnewayTo(segmentp,segmentp->node1)) { printf(" \n",segmentp->node2+1); printf(" \n",segmentp->node1+1); } else { printf(" \n",segmentp->node1+1); printf(" \n",segmentp->node2+1); } if(IsSuperSegment(segmentp)) printf(" \n"); if(IsNormalSegment(segmentp)) printf(" \n"); printf(" \n",distance_to_km(DISTANCE(segmentp->distance))); if(wayp->type & Highway_OneWay) printf(" \n"); if(wayp->type & Highway_CycleBothWays) printf(" \n"); if(wayp->type & Highway_Roundabout) printf(" \n"); printf(" \n",HighwayName(HIGHWAY(wayp->type))); if(IsNormalSegment(segmentp) && *name) printf(" \n",ParseXML_Encode_Safe_XML(name)); for(i=1;iallow & TRANSPORTS(i)) printf(" \n",TransportName(i)); for(i=1;iprops & PROPERTIES(i)) printf(" \n",PropertyName(i)); if(wayp->speed) printf(" \n",speed_to_kph(wayp->speed)); if(wayp->weight) printf(" \n",weight_to_tonnes(wayp->weight)); if(wayp->height) printf(" \n",height_to_metres(wayp->height)); if(wayp->width) printf(" \n",width_to_metres(wayp->width)); if(wayp->length) printf(" \n",length_to_metres(wayp->length)); printf(" \n"); } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of a turn relation from the routing database (in OSM XML format). Relations *relations The set of relations to use. index_t item The relation index to print. Segments *segments The set of segments to use. Nodes *nodes The set of nodes to use. ++++++++++++++++++++++++++++++++++++++*/ static void print_turn_relation_osm(Relations *relations,index_t item,Segments *segments,Nodes *nodes) { TurnRelation *relationp=LookupTurnRelation(relations,item,1); Segment *segmentp_from=LookupSegment(segments,relationp->from,1); Segment *segmentp_to =LookupSegment(segments,relationp->to ,2); double angle=TurnAngle(nodes,segmentp_from,segmentp_to,relationp->via); char *restriction; if(angle>150 || angle<-150) restriction="no_u_turn"; else if(angle>30) restriction="no_right_turn"; else if(angle<-30) restriction="no_left_turn"; else restriction="no_straight_on"; printf(" \n",item+1); printf(" \n"); printf(" \n",restriction); if(relationp->except) printf(" \n",TransportsNameList(relationp->except)); printf(" \n",relationp->from+1); printf(" \n",relationp->via+1); printf(" \n",relationp->to+1); printf(" \n"); } /*++++++++++++++++++++++++++++++++++++++ Print out a tail in OSM XML format. ++++++++++++++++++++++++++++++++++++++*/ static void print_tail_osm(void) { printf("\n"); } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of a node from the routing database (in visualiser format). Nodes *nodes The set of nodes to use. index_t item The node index to print. ++++++++++++++++++++++++++++++++++++++*/ static void print_node_visualiser(Nodes *nodes,index_t item) { Node *nodep=LookupNode(nodes,item,1); double latitude,longitude; int i; GetLatLong(nodes,item,nodep,&latitude,&longitude); if(nodep->allow==Transports_ALL && nodep->flags==0) printf("<routino:node id='%"Pindex_t"' lat='%.7f' lon='%.7f' />\n",item+1,radians_to_degrees(latitude),radians_to_degrees(longitude)); else { printf("<routino:node id='%"Pindex_t"' lat='%.7f' lon='%.7f'>\n",item+1,radians_to_degrees(latitude),radians_to_degrees(longitude)); if(nodep->flags & NODE_SUPER) printf("   <tag k='routino:super' v='yes' />\n"); if(nodep->flags & NODE_UTURN) printf("   <tag k='routino:uturn' v='yes' />\n"); if(nodep->flags & NODE_MINIRNDBT) printf("   <tag k='junction' v='roundabout' />\n"); if(nodep->flags & NODE_TURNRSTRCT) printf("   <tag k='routino:turnrestriction' v='yes' />\n"); for(i=1;iallow & TRANSPORTS(i))) printf("   <tag k='%s' v='no' />\n",TransportName(i)); printf("</routino:node>\n"); } } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of a segment from the routing database (as a way in visualiser format). Segments *segments The set of segments to use. index_t item The segment index to print. Ways *ways The set of ways to use. ++++++++++++++++++++++++++++++++++++++*/ static void print_segment_visualiser(Segments *segments,index_t item,Ways *ways) { Segment *segmentp=LookupSegment(segments,item,1); Way *wayp=LookupWay(ways,segmentp->way,1); char *name=WayName(ways,wayp); int i; printf("<routino:way id='%"Pindex_t"'>\n",item+1); if(IsOnewayTo(segmentp,segmentp->node1)) { printf("   <nd ref='%"Pindex_t"' />\n",segmentp->node2+1); printf("   <nd ref='%"Pindex_t"' />\n",segmentp->node1+1); } else { printf("   <nd ref='%"Pindex_t"' />\n",segmentp->node1+1); printf("   <nd ref='%"Pindex_t"' />\n",segmentp->node2+1); } if(IsSuperSegment(segmentp)) printf("   <tag k='routino:super' v='yes' />\n"); if(IsNormalSegment(segmentp)) printf("   <tag k='routino:normal' v='yes' />\n"); printf("   <tag k='routino:distance' v='%.3f km' />\n",distance_to_km(DISTANCE(segmentp->distance))); if(wayp->type & Highway_OneWay) printf("   <tag k='oneway' v='yes' />\n"); if(wayp->type & Highway_CycleBothWays) printf("   <tag k='cyclebothways' v='yes' />\n"); if(wayp->type & Highway_Roundabout) printf("   <tag k='roundabout' v='yes' />\n"); printf("   <tag k='highway' v='%s' />\n",HighwayName(HIGHWAY(wayp->type))); if(IsNormalSegment(segmentp) && *name) printf("   <tag k='name' v='%s' />\n",ParseXML_Encode_Safe_XML(name)); for(i=1;iallow & TRANSPORTS(i)) printf("   <tag k='%s' v='yes' />\n",TransportName(i)); for(i=1;iprops & PROPERTIES(i)) printf("   <tag k='%s' v='yes' />\n",PropertyName(i)); if(wayp->speed) printf("   <tag k='maxspeed' v='%d kph' />\n",speed_to_kph(wayp->speed)); if(wayp->weight) printf("   <tag k='maxweight' v='%.1f t' />\n",weight_to_tonnes(wayp->weight)); if(wayp->height) printf("   <tag k='maxheight' v='%.1f m' />\n",height_to_metres(wayp->height)); if(wayp->width) printf("   <tag k='maxwidth' v='%.1f m' />\n",width_to_metres(wayp->width)); if(wayp->length) printf("   <tag k='maxlength' v='%.1f m' />\n",length_to_metres(wayp->length)); printf("</routino:way>\n"); } /*++++++++++++++++++++++++++++++++++++++ Print out the contents of a turn relation from the routing database (in visualiser format). Relations *relations The set of relations to use. index_t item The relation index to print. Segments *segments The set of segments to use. Nodes *nodes The set of nodes to use. ++++++++++++++++++++++++++++++++++++++*/ static void print_turn_relation_visualiser(Relations *relations,index_t item,Segments *segments,Nodes *nodes) { TurnRelation *relationp=LookupTurnRelation(relations,item,1); Segment *segmentp_from=LookupSegment(segments,relationp->from,1); Segment *segmentp_to =LookupSegment(segments,relationp->to ,2); double angle=TurnAngle(nodes,segmentp_from,segmentp_to,relationp->via); char *restriction; if(angle>150 || angle<-150) restriction="no_u_turn"; else if(angle>30) restriction="no_right_turn"; else if(angle<-30) restriction="no_left_turn"; else restriction="no_straight_on"; printf("<routino:relation id='%"Pindex_t"'>\n",item+1); printf("   <tag k='type' v='restriction' />\n"); printf("   <tag k='restriction' v='%s'/>\n",restriction); if(relationp->except) printf("   <tag k='except' v='%s' />\n",TransportsNameList(relationp->except)); printf("   <member type='way' ref='%"Pindex_t"' role='from' />\n",relationp->from+1); printf("   <member type='node' ref='%"Pindex_t"' role='via' />\n",relationp->via+1); printf("   <member type='way' ref='%"Pindex_t"' role='to' />\n",relationp->to+1); printf("</routino:relation>\n"); } /*++++++++++++++++++++++++++++++++++++++ Print out an error log entry from the database (in visualiser format). ErrorLogs *errorlogs The set of error logs to use. index_t item The error log index to print. ++++++++++++++++++++++++++++++++++++++*/ static void print_errorlog_visualiser(ErrorLogs *errorlogs,index_t item) { char *string=LookupErrorLogString(errorlogs,item); printf("%s\n",ParseXML_Encode_Safe_XML(string)); } /*+ Conversion from time_t to date string (day of week). +*/ static const char* const weekdays[7]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; /*+ Conversion from time_t to date string (month of year). +*/ static const char* const months[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; /*++++++++++++++++++++++++++++++++++++++ Convert the time into an RFC 822 compliant date. char *RFC822Date Returns a pointer to a fixed string containing the date. time_t t The time. ++++++++++++++++++++++++++++++++++++++*/ static char *RFC822Date(time_t t) { static char value[80]; /* static allocation of return value */ char weekday[4]; char month[4]; struct tm *tim; tim=gmtime(&t); strcpy(weekday,weekdays[tim->tm_wday]); strcpy(month,months[tim->tm_mon]); /* Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 */ sprintf(value,"%3s, %02d %3s %4d %02d:%02d:%02d %s", weekday, tim->tm_mday, month, tim->tm_year+1900, tim->tm_hour, tim->tm_min, tim->tm_sec, "GMT" ); return(value); } /*++++++++++++++++++++++++++++++++++++++ Print out the usage information. int detail The level of detail to use: -1 = just version number, 0 = low detail, 1 = full details. const char *argerr The argument that gave the error (if there is one). const char *err Other error message (if there is one). ++++++++++++++++++++++++++++++++++++++*/ static void print_usage(int detail,const char *argerr,const char *err) { if(detail<0) { fprintf(stderr, "Routino version " ROUTINO_VERSION " " ROUTINO_URL ".\n" ); } if(detail>=0) { fprintf(stderr, "Usage: filedumper [--version]\n" " [--help]\n" " [--dir=] [--prefix=]\n" " [--statistics]\n" " [--visualiser --latmin= --latmax=\n" " --lonmin= --lonmax=\n" " --data=]\n" " [--dump [--node= ...]\n" " [--segment= ...]\n" " [--way= ...]\n" " [--turn-relation= ...]\n" " [--errorlog= ...]]\n" " [--dump-osm [--no-super]\n" " [--latmin= --latmax=\n" " --lonmin= --lonmax=]]\n" " [--dump-visualiser [--data=node]\n" " [--data=segment]\n" " [--data=turn-relation]\n" " [--data=errorlog]]\n"); if(argerr) fprintf(stderr, "\n" "Error with command line parameter: %s\n",argerr); if(err) fprintf(stderr, "\n" "Error: %s\n",err); } if(detail==1) fprintf(stderr, "\n" "--version Print the version of Routino.\n" "\n" "--help Prints this information.\n" "\n" "--dir= The directory containing the routing database.\n" "--prefix= The filename prefix for the routing database.\n" "\n" "--statistics Print statistics about the routing database.\n" "\n" "--visualiser Extract selected data from the routing database:\n" " --latmin= * the minimum latitude (degrees N).\n" " --latmax= * the maximum latitude (degrees N).\n" " --lonmin= * the minimum longitude (degrees E).\n" " --lonmax= * the maximum longitude (degrees E).\n" " --data= * the type of data to select.\n" "\n" " can be selected from:\n" " junctions = segment count at each junction.\n" " super = super-node and super-segments.\n" " waytype-* = segments of oneway, cyclebothways or roundabout type.\n" " highway-* = segments of the specified highway type.\n" " transport-* = segments allowing the specified transport type.\n" " barrier-* = nodes disallowing the specified transport type.\n" " turns = turn restrictions.\n" " speed = speed limits.\n" " weight = weight limits.\n" " height = height limits.\n" " width = width limits.\n" " length = length limits.\n" " property-* = segments with the specified property.\n" " errorlogs = errors logged during parsing.\n" "\n" "--dump Dump selected contents of the database.\n" " --node= * the node with the selected index.\n" " --segment= * the segment with the selected index.\n" " --way= * the way with the selected index.\n" " --turn-relation= * the turn relation with the selected index.\n" " --errorlog= * the error log with the selected index.\n" " Use 'all' instead of a number to get all of them.\n" "\n" "--dump-osm Dump all or part of the database as an XML file.\n" " --no-super * exclude the super-segments.\n" " --latmin= * the minimum latitude (degrees N).\n" " --latmax= * the maximum latitude (degrees N).\n" " --lonmin= * the minimum longitude (degrees E).\n" " --lonmax= * the maximum longitude (degrees E).\n" "\n" "--dump-visualiser Dump selected contents of the database in HTML.\n" " --data=node * the node with the selected index.\n" " --data=segment * the segment with the selected index.\n" " --data=turn-relation * the turn relation with the selected index.\n" " --data=errorlog * the error log with the selected index.\n"); exit(!detail); } routino-3.4.3/src/nodes.c 644 233 144 44120 13755013433 10460 0/*************************************** Node data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019, 2020 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include "types.h" #include "nodes.h" #include "segments.h" #include "ways.h" #include "files.h" #include "profiles.h" /* Local functions */ static int valid_segment_for_profile(Ways *ways,Segment *segmentp,Profile *profile); /*++++++++++++++++++++++++++++++++++++++ Load in a node list from a file. Nodes *LoadNodeList Returns the node list. const char *filename The name of the file to load. ++++++++++++++++++++++++++++++++++++++*/ Nodes *LoadNodeList(const char *filename) { Nodes *nodes; #if SLIM size_t sizeoffsets; #endif nodes=(Nodes*)malloc(sizeof(Nodes)); #if !SLIM nodes->data=MapFile(filename); /* Copy the NodesFile header structure from the loaded data */ nodes->file=*((NodesFile*)nodes->data); /* Set the pointers in the Nodes structure. */ nodes->offsets=(index_t*)(nodes->data+sizeof(NodesFile)); nodes->nodes =(Node* )(nodes->data+sizeof(NodesFile)+(nodes->file.latbins*nodes->file.lonbins+1)*sizeof(index_t)); #else nodes->fd=SlimMapFile(filename); /* Copy the NodesFile header structure from the loaded data */ SlimFetch(nodes->fd,&nodes->file,sizeof(NodesFile),0); sizeoffsets=(nodes->file.latbins*nodes->file.lonbins+1)*sizeof(index_t); nodes->offsets=(index_t*)malloc(sizeoffsets); #ifndef LIBROUTINO log_malloc(nodes->offsets,sizeoffsets); #endif SlimFetch(nodes->fd,nodes->offsets,sizeoffsets,sizeof(NodesFile)); nodes->nodesoffset=(offset_t)(sizeof(NodesFile)+sizeoffsets); nodes->cache=NewNodeCache(); #ifndef LIBROUTINO log_malloc(nodes->cache,sizeof(*nodes->cache)); #endif #endif return(nodes); } /*++++++++++++++++++++++++++++++++++++++ Destroy the node list. Nodes *nodes The node list to destroy. ++++++++++++++++++++++++++++++++++++++*/ void DestroyNodeList(Nodes *nodes) { #if !SLIM nodes->data=UnmapFile(nodes->data); #else nodes->fd=SlimUnmapFile(nodes->fd); #ifndef LIBROUTINO log_free(nodes->offsets); #endif free(nodes->offsets); #ifndef LIBROUTINO log_free(nodes->cache); #endif DeleteNodeCache(nodes->cache); #endif free(nodes); } /*++++++++++++++++++++++++++++++++++++++ Find the closest node given its latitude, longitude and the profile of the mode of transport that must be able to move to/from this node. index_t FindClosestNode Returns the closest node. Nodes *nodes The set of nodes to search. Segments *segments The set of segments to use. Ways *ways The set of ways to use. double latitude The latitude to look for. double longitude The longitude to look for. distance_t distance The maximum distance to look from the specified coordinates. Profile *profile The profile of the mode of transport. distance_t *bestdist Returns the distance to the best node. ++++++++++++++++++++++++++++++++++++++*/ index_t FindClosestNode(Nodes *nodes,Segments *segments,Ways *ways,double latitude,double longitude, distance_t distance,Profile *profile,distance_t *bestdist) { ll_bin_t latbin=latlong_to_bin(radians_to_latlong(latitude ))-nodes->file.latzero; ll_bin_t lonbin=latlong_to_bin(radians_to_latlong(longitude))-nodes->file.lonzero; int delta=0,count; index_t i,index1,index2; index_t bestn=NO_NODE; distance_t bestd=INF_DISTANCE; /* Find the maximum distance to search */ double dlat=DeltaLat(longitude,distance); double dlon=DeltaLon(latitude ,distance); double minlat=latitude -dlat; double maxlat=latitude +dlat; double minlon=longitude-dlon; double maxlon=longitude+dlon; ll_bin_t minlatbin=latlong_to_bin(radians_to_latlong(minlat))-nodes->file.latzero; ll_bin_t maxlatbin=latlong_to_bin(radians_to_latlong(maxlat))-nodes->file.latzero; ll_bin_t minlonbin=latlong_to_bin(radians_to_latlong(minlon))-nodes->file.lonzero; ll_bin_t maxlonbin=latlong_to_bin(radians_to_latlong(maxlon))-nodes->file.lonzero; ll_off_t minlatoff=latlong_to_off(radians_to_latlong(minlat)); ll_off_t maxlatoff=latlong_to_off(radians_to_latlong(maxlat)); ll_off_t minlonoff=latlong_to_off(radians_to_latlong(minlon)); ll_off_t maxlonoff=latlong_to_off(radians_to_latlong(maxlon)); /* Start with the bin containing the location, then spiral outwards. */ do { ll_bin_t latb,lonb; ll_bin2_t llbin; count=0; for(latb=latbin-delta;latb<=latbin+delta;latb++) { if(latb<0 || latb>=nodes->file.latbins || latbmaxlatbin) continue; for(lonb=lonbin-delta;lonb<=lonbin+delta;lonb++) { if(lonb<0 || lonb>=nodes->file.lonbins || lonbmaxlonbin) continue; if(abs(latb-latbin)file.latbins+latb; index1=LookupNodeOffset(nodes,llbin); index2=LookupNodeOffset(nodes,llbin+1); for(i=index1;ilatoffsetlatoffset>maxlatoff) continue; if(lonb==minlonbin && nodep->lonoffsetlonoffset>maxlonoff) continue; lat=latlong_to_radians(bin_to_latlong(nodes->file.latzero+latb)+off_to_latlong(nodep->latoffset)); lon=latlong_to_radians(bin_to_latlong(nodes->file.lonzero+lonb)+off_to_latlong(nodep->lonoffset)); dist=Distance(lat,lon,latitude,longitude); if(distfile.latzero; ll_bin_t lonbin=latlong_to_bin(radians_to_latlong(longitude))-nodes->file.lonzero; int delta=0,count; index_t i,index1,index2; index_t bestn1=NO_NODE,bestn2=NO_NODE; distance_t bestd=INF_DISTANCE,bestd1=INF_DISTANCE,bestd2=INF_DISTANCE; index_t bests=NO_SEGMENT; /* Find the maximum distance to search */ double dlat=DeltaLat(longitude,distance); double dlon=DeltaLon(latitude ,distance); double minlat=latitude -dlat; double maxlat=latitude +dlat; double minlon=longitude-dlon; double maxlon=longitude+dlon; ll_bin_t minlatbin=latlong_to_bin(radians_to_latlong(minlat))-nodes->file.latzero; ll_bin_t maxlatbin=latlong_to_bin(radians_to_latlong(maxlat))-nodes->file.latzero; ll_bin_t minlonbin=latlong_to_bin(radians_to_latlong(minlon))-nodes->file.lonzero; ll_bin_t maxlonbin=latlong_to_bin(radians_to_latlong(maxlon))-nodes->file.lonzero; ll_off_t minlatoff=latlong_to_off(radians_to_latlong(minlat)); ll_off_t maxlatoff=latlong_to_off(radians_to_latlong(maxlat)); ll_off_t minlonoff=latlong_to_off(radians_to_latlong(minlon)); ll_off_t maxlonoff=latlong_to_off(radians_to_latlong(maxlon)); /* Start with the bin containing the location, then spiral outwards. */ do { ll_bin_t latb,lonb; ll_bin2_t llbin; count=0; for(latb=latbin-delta;latb<=latbin+delta;latb++) { if(latb<0 || latb>=nodes->file.latbins || latbmaxlatbin) continue; for(lonb=lonbin-delta;lonb<=lonbin+delta;lonb++) { if(lonb<0 || lonb>=nodes->file.lonbins || lonbmaxlonbin) continue; if(abs(latb-latbin)file.latbins+latb; index1=LookupNodeOffset(nodes,llbin); index2=LookupNodeOffset(nodes,llbin+1); for(i=index1;ilatoffsetlatoffset>maxlatoff) continue; if(lonb==minlonbin && nodep->lonoffsetlonoffset>maxlonoff) continue; lat1=latlong_to_radians(bin_to_latlong(nodes->file.latzero+latb)+off_to_latlong(nodep->latoffset)); lon1=latlong_to_radians(bin_to_latlong(nodes->file.lonzero+lonb)+off_to_latlong(nodep->lonoffset)); dist1=Distance(lat1,lon1,latitude,longitude); if(dist1=0 && dist3b>=0) distp=sqrt((double)dist1*(double)dist1-dist3a*dist3a); else if(dist3a>0) { distp=dist2; dist3a=dist3; dist3b=0; } else /* if(dist3b>0) */ { distp=dist1; dist3a=0; dist3b=dist3; } } if(distp<(double)bestd) { bests=IndexSegment(segments,segmentp); if(segmentp->node1==i) { bestn1=i; bestn2=OtherNode(segmentp,i); bestd1=(distance_t)dist3a; bestd2=(distance_t)dist3b; } else { bestn1=OtherNode(segmentp,i); bestn2=i; bestd1=(distance_t)dist3b; bestd2=(distance_t)dist3a; } bestd=(distance_t)distp; } } segmentp=NextSegment(segments,segmentp,i); } while(segmentp); } /* dist1 < distance */ } count++; } } delta++; } while(count); *bestdist=bestd; *bestnode1=bestn1; *bestnode2=bestn2; *bestdist1=bestd1; *bestdist2=bestd2; return(bests); } /*++++++++++++++++++++++++++++++++++++++ Check if the transport defined by the profile is allowed on the segment. int valid_segment_for_profile Return 1 if it is or 0 if not. Ways *ways The set of ways to use. Segment *segmentp The segment to check. Profile *profile The profile to check. ++++++++++++++++++++++++++++++++++++++*/ static int valid_segment_for_profile(Ways *ways,Segment *segmentp,Profile *profile) { Way *wayp=LookupWay(ways,segmentp->way,1); score_t segment_pref; int i; /* mode of transport must be allowed on the highway */ if(!(wayp->allow&profile->transports)) return(0); /* must obey weight restriction (if exists) */ if(wayp->weight && wayp->weightweight) return(0); /* must obey height/width/length restriction (if exists) */ if((wayp->height && wayp->heightheight) || (wayp->width && wayp->width width ) || (wayp->length && wayp->lengthlength)) return(0); segment_pref=profile->highway[HIGHWAY(wayp->type)]; for(i=1;ifile.properties & PROPERTIES(i)) { if(wayp->props & PROPERTIES(i)) segment_pref*=profile->props_yes[i]; else segment_pref*=profile->props_no[i]; } /* profile preferences must allow this highway */ if(segment_pref==0) return(0); /* Must be OK */ return(1); } /*++++++++++++++++++++++++++++++++++++++ Get the latitude and longitude associated with a node. Nodes *nodes The set of nodes to use. index_t index The node index. Node *nodep A pointer to the node if already available. double *latitude Returns the latitude. double *longitude Returns the logitude. ++++++++++++++++++++++++++++++++++++++*/ void GetLatLong(Nodes *nodes,index_t index,Node *nodep,double *latitude,double *longitude) { ll_bin_t latbin,lonbin; ll_bin2_t bin=-1; ll_bin2_t start,end,mid; index_t offset; /* Search for offset */ start=0; end=nodes->file.lonbins*nodes->file.latbins; /* Binary search - search key exact match is wanted else lower bound is acceptable. * * # <- start | Check mid and exit if it matches else move start or end. * # | * # | Since a lower bound match is wanted we can set end=mid-1 or * # <- mid | start=mid if mid doesn't exactly match. * # | * # | Eventually either end=start or end=start+1 and one of * # <- end | start or end is an exact match or the lower bound. */ while((end-start)>1) { mid=start+(end-start)/2; /* Choose mid point (avoid overflow) */ offset=LookupNodeOffset(nodes,mid); if(offsetindex) /* Mid point is too high */ end=mid-1; else /* Mid point is correct */ {bin=mid;break;} } if(bin==-1) { offset=LookupNodeOffset(nodes,end); if(offset>index) bin=start; else bin=end; } while(bin<=(nodes->file.lonbins*nodes->file.latbins) && LookupNodeOffset(nodes,bin)==LookupNodeOffset(nodes,bin+1)) bin++; latbin=bin%nodes->file.latbins; lonbin=bin/nodes->file.latbins; /* Return the values */ if(nodep==NULL) nodep=LookupNode(nodes,index,4); *latitude =latlong_to_radians(bin_to_latlong(nodes->file.latzero+latbin)+off_to_latlong(nodep->latoffset)); *longitude=latlong_to_radians(bin_to_latlong(nodes->file.lonzero+lonbin)+off_to_latlong(nodep->lonoffset)); } routino-3.4.3/src/osmo5mparse.c 644 233 144 44424 14454035661 11635 0/*************************************** A simple o5m/o5c parser. Part of the Routino routing software. ******************/ /****************** This file Copyright 2012-2015, 2017, 2019, 2023 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #if defined(_MSC_VER) #include #include #define read(fd,address,length) _read(fd,address,(unsigned int)(length)) #define ssize_t SSIZE_T #else #include #endif #include #include #include #include #include "osmparser.h" #include "tagging.h" #include "logging.h" /* At the top level */ #define O5M_FILE_NODE 0x10 #define O5M_FILE_WAY 0x11 #define O5M_FILE_RELATION 0x12 #define O5M_FILE_BOUNDING_BOX 0xdb #define O5M_FILE_TIMESTAMP 0xdc #define O5M_FILE_HEADER 0xe0 #define O5M_FILE_SYNC 0xee #define O5M_FILE_JUMP 0xef #define O5M_FILE_END 0xfe #define O5M_FILE_RESET 0xff /* Errors */ #define O5M_EOF 0 #define O5M_ERROR_UNEXP_EOF 100 #define O5M_ERROR_RESET_NOT_FIRST 101 #define O5M_ERROR_HEADER_NOT_FIRST 102 #define O5M_ERROR_EXPECTED_O5M 103 #define O5M_ERROR_EXPECTED_O5C 104 #define O5M_ERROR_FILE_LEVEL 105 /* Local parsing variables (re-initialised for each file) */ static uint64_t byteno=0; static uint64_t nnodes=0,nways=0,nrelations=0; static int64_t id=0; static int32_t lat=0; static int32_t lon=0; static int64_t timestamp=0; static int64_t node_refid=0,way_refid=0,relation_refid=0; static int mode_change=MODE_NORMAL; static uint32_t buffer_allocated; static unsigned char *buffer=NULL; static unsigned char *buffer_ptr,*buffer_end; static int string_table_start=0; static unsigned char **string_table=NULL; #define STRING_TABLE_ALLOCATED 15000 /*++++++++++++++++++++++++++++++++++++++ Refill the data buffer and set the pointers. int buffer_refill Return 0 if everything is OK or 1 for EOF. int fd The file descriptor to read from. uint32_t bytes The number of bytes to read. ++++++++++++++++++++++++++++++++++++++*/ static inline int buffer_refill(int fd,uint32_t bytes) { ssize_t n,m; uint32_t totalbytes; m=buffer_end-buffer_ptr; if(m) memmove(buffer,buffer_ptr,m); totalbytes=bytes+m; if(totalbytes>buffer_allocated) buffer=(unsigned char *)realloc(buffer,buffer_allocated=totalbytes); byteno+=bytes; buffer_ptr=buffer; buffer_end=buffer+m; do { n=read(fd,buffer_end,bytes); if(n<=0) return(1); buffer_end+=n; bytes-=n; } while(bytes>0); return(0); } static void process_node(void); static void process_way(void); static void process_relation(void); static void process_info(void); static unsigned char *process_string(int pair,unsigned char **buf_ptr,unsigned char **string1,unsigned char **string2); /* Macros to simplify the parser (and make it look more like the XML parser) */ #define BEGIN(xx) do{ state=(xx); goto finish_parsing; } while(0) #define BUFFER_CHARS(xx) do{ if(buffer_refill(fd,(xx))) BEGIN(O5M_ERROR_UNEXP_EOF); } while(0) /* O5M decoding */ #define O5M_LATITUDE(xx) (double)(1E-7*(xx)) #define O5M_LONGITUDE(xx) (double)(1E-7*(xx)) /*++++++++++++++++++++++++++++++++++++++ Parse an O5M int32 data value. uint32_t o5m_int32 Returns the integer value. unsigned char **ptr The pointer to read the data from. ++++++++++++++++++++++++++++++++++++++*/ static inline uint32_t o5m_int32(unsigned char **ptr) { uint32_t result=(**ptr)&0x7F; if((**ptr)&0x80) result+=((*++(*ptr))&0x7F)<<7; if((**ptr)&0x80) result+=((*++(*ptr))&0x7F)<<14; if((**ptr)&0x80) result+=((*++(*ptr))&0x7F)<<21; if((**ptr)&0x80) result+=((*++(*ptr))&0x7F)<<28; (*ptr)++; return(result); } /*++++++++++++++++++++++++++++++++++++++ Parse an O5M int32 data value. int32_t o5m_sint32 Returns the integer value. unsigned char **ptr The pointer to read the data from. ++++++++++++++++++++++++++++++++++++++*/ static inline int32_t o5m_sint32(unsigned char **ptr) { int64_t result=((**ptr)&0x7E)>>1; int sign=(**ptr)&0x01; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<6; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<13; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<20; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<27; (*ptr)++; if(sign) result=-result-1; return(result); } #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-function" #endif /*++++++++++++++++++++++++++++++++++++++ Parse an O5M int64 data value. int64_t o5m_int64 Returns the integer value. unsigned char **ptr The pointer to read the data from. ++++++++++++++++++++++++++++++++++++++*/ static inline int64_t o5m_int64(unsigned char **ptr) { uint64_t result=(**ptr)&0x7F; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<7; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<14; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<21; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<28; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<35; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<42; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<49; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<56; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<63; (*ptr)++; return(result); } #if defined(__clang__) #pragma clang diagnostic pop #endif /*++++++++++++++++++++++++++++++++++++++ Parse an O5M sint64 data value. int64_t o5m_sint64 Returns the integer value. unsigned char **ptr The pointer to read the data from. ++++++++++++++++++++++++++++++++++++++*/ static inline int64_t o5m_sint64(unsigned char **ptr) { int64_t result=((**ptr)&0x7E)>>1; int sign=(**ptr)&0x01; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<6; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<13; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<20; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<27; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<34; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<41; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<48; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<55; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<62; (*ptr)++; if(sign) result=-result-1; return(result); } /*++++++++++++++++++++++++++++++++++++++ Parse the O5M and call the functions for each OSM item as seen. int ParseO5M Returns 0 if OK or something else in case of an error. int fd The file descriptor of the file to parse. int changes Set to 1 if this is expected to be a changes file, otherwise zero. ++++++++++++++++++++++++++++++++++++++*/ static int ParseO5M(int fd,int changes) { int i; int state; int number_reset=0; int error; /* Print the initial message */ printf_first("Reading: Bytes=0 Nodes=0 Ways=0 Relations=0"); /* The actual parser. */ nnodes=0,nways=0,nrelations=0; if(changes) mode_change=MODE_MODIFY; string_table_start=0; string_table=(unsigned char **)malloc(STRING_TABLE_ALLOCATED*sizeof(unsigned char *)); for(i=0;i. ***************************************/ #ifndef NODESX_H #define NODESX_H /*+ To stop multiple inclusions. +*/ #include #include "types.h" #include "nodes.h" #include "typesx.h" #include "cache.h" #include "files.h" /* Data structures */ /*+ An extended structure used for processing. +*/ struct _NodeX { node_t id; /*+ The node identifier; initially the OSM value, later the Node index, finally the first segment. +*/ latlong_t latitude; /*+ The node latitude. +*/ latlong_t longitude; /*+ The node longitude. +*/ transports_t allow; /*+ The types of transport that are allowed through the node. +*/ nodeflags_t flags; /*+ Flags containing extra information (e.g. super-node, turn restriction). +*/ }; /*+ A structure containing a set of nodes (memory format). +*/ struct _NodesX { char *filename; /*+ The name of the intermediate file (for the NodesX). +*/ char *filename_tmp; /*+ The name of the temporary file (for the NodesX). +*/ int fd; /*+ The file descriptor of the open file (for the NodesX). +*/ index_t number; /*+ The number of extended nodes still being considered. +*/ index_t knumber; /*+ The number of extended nodes kept for next time. +*/ #if !SLIM NodeX *data; /*+ The extended node data (when mapped into memory). +*/ #else NodeX cached[3]; /*+ Three cached extended nodes read from the file in slim mode. +*/ index_t incache[3]; /*+ The indexes of the cached extended nodes. +*/ NodeXCache *cache; /*+ A RAM cache of extended nodes read from the file. +*/ #endif char *ifilename_tmp; /*+ The name of the temporary file (for the NodesX ID index). +*/ int ifd; /*+ The file descriptor of the temporary file (for the NodesX ID index). +*/ node_t *idata; /*+ The extended node IDs (sorted by ID). +*/ index_t *pdata; /*+ The node indexes after pruning. +*/ index_t *gdata; /*+ The final node indexes (sorted geographically). +*/ BitMask *super; /*+ A bit-mask marker for super nodes (same order as sorted nodes). +*/ index_t latbins; /*+ The number of bins containing latitude. +*/ index_t lonbins; /*+ The number of bins containing longitude. +*/ ll_bin_t latzero; /*+ The bin number of the furthest south bin. +*/ ll_bin_t lonzero; /*+ The bin number of the furthest west bin. +*/ }; /* Functions in nodesx.c */ NodesX *NewNodeList(int append,int readonly); void FreeNodeList(NodesX *nodesx,int keep); void AppendNodeList(NodesX *nodesx,node_t id,double latitude,double longitude,transports_t allow,nodeflags_t flags); void FinishNodeList(NodesX *nodesx); index_t IndexNodeX(NodesX *nodesx,node_t id); void SortNodeList(NodesX *nodesx); void RemoveNonHighwayNodes(NodesX *nodesx,WaysX *waysx,int keep); void RemovePrunedNodes(NodesX *nodesx,SegmentsX *segmentsx); void SortNodeListGeographically(NodesX *nodesx); void SaveNodeList(NodesX *nodesx,const char *filename,SegmentsX *segmentsx); /* Macros and inline functions */ #if !SLIM #define LookupNodeX(nodesx,index,position) &(nodesx)->data[index] #define PutBackNodeX(nodesx,nodex) while(0) { /* nop */ } #else /* Prototypes */ static inline NodeX *LookupNodeX(NodesX *nodesx,index_t index,int position); static inline void PutBackNodeX(NodesX *nodesx,NodeX *nodex); CACHE_NEWCACHE_PROTO(NodeX) CACHE_DELETECACHE_PROTO(NodeX) CACHE_FETCHCACHE_PROTO(NodeX) CACHE_REPLACECACHE_PROTO(NodeX) CACHE_INVALIDATECACHE_PROTO(NodeX) /* Data type */ CACHE_STRUCTURE(NodeX) /* Inline functions */ CACHE_NEWCACHE(NodeX) CACHE_DELETECACHE(NodeX) CACHE_FETCHCACHE(NodeX) CACHE_REPLACECACHE(NodeX) CACHE_INVALIDATECACHE(NodeX) /*++++++++++++++++++++++++++++++++++++++ Lookup a particular extended node with the specified id from the file on disk. NodeX *LookupNodeX Returns a pointer to a cached copy of the extended node. NodesX *nodesx The set of nodes to use. index_t index The node index to look for. int position The position in the cache to use. ++++++++++++++++++++++++++++++++++++++*/ static inline NodeX *LookupNodeX(NodesX *nodesx,index_t index,int position) { nodesx->cached[position-1]=*FetchCachedNodeX(nodesx->cache,index,nodesx->fd,0); nodesx->incache[position-1]=index; return(&nodesx->cached[position-1]); } /*++++++++++++++++++++++++++++++++++++++ Put back an extended node's data into the file on disk. NodesX *nodesx The set of nodes to modify. NodeX *nodex The extended node to be put back. ++++++++++++++++++++++++++++++++++++++*/ static inline void PutBackNodeX(NodesX *nodesx,NodeX *nodex) { int position1=nodex-&nodesx->cached[0]; ReplaceCachedNodeX(nodesx->cache,nodex,nodesx->incache[position1],nodesx->fd,0); } #endif /* SLIM */ #endif /* NODESX_H */ routino-3.4.3/src/prunex.c 644 233 144 122462 14242177045 10721 0/*************************************** Data pruning functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2011-2014, 2019, 2022 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include "types.h" #include "segments.h" #include "typesx.h" #include "nodesx.h" #include "segmentsx.h" #include "waysx.h" #include "prunex.h" #include "files.h" #include "logging.h" /* Global variables */ /*+ The command line '--tmpdir' option or its default value. +*/ extern char *option_tmpdirname; /* Local functions */ static void prune_segment(SegmentsX *segmentsx,SegmentX *segmentx); static void modify_segment(SegmentsX *segmentsx,SegmentX *segmentx,index_t newnode1,index_t newnode2); static void unlink_segment_node1_refs(SegmentsX *segmentsx,SegmentX *segmentx); static void unlink_segment_node2_refs(SegmentsX *segmentsx,SegmentX *segmentx); static double distance(double lat1,double lon1,double lat2,double lon2); /*++++++++++++++++++++++++++++++++++++++ Initialise the data structures needed for pruning. NodesX *nodesx The set of nodes to use. SegmentsX *segmentsx The set of segments to use. WaysX *waysx The set of ways to use. ++++++++++++++++++++++++++++++++++++++*/ void StartPruning(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx) { SegmentX segmentx; index_t index=0,lastnode1=NO_NODE; if(segmentsx->number==0) return; /* Print the start message */ printf_first("Adding Extra Segment Indexes: Segments=0"); /* Allocate the array of next segment */ segmentsx->next1=(index_t*)calloc_logassert(segmentsx->number,sizeof(index_t)); log_malloc(segmentsx->next1,segmentsx->number*sizeof(index_t)); /* Open the file read-only */ segmentsx->fd=ReOpenFileBuffered(segmentsx->filename_tmp); /* Read the on-disk image */ while(!ReadFileBuffered(segmentsx->fd,&segmentx,sizeof(SegmentX))) { index_t node1=segmentx.node1; if(index==0) ; else if(lastnode1==node1) segmentsx->next1[index-1]=index; else segmentsx->next1[index-1]=NO_SEGMENT; lastnode1=node1; index++; if(!(index%10000)) printf_middle("Added Extra Segment Indexes: Segments=%"Pindex_t,index); } segmentsx->next1[index-1]=NO_SEGMENT; /* Close the file */ segmentsx->fd=CloseFileBuffered(segmentsx->fd); /* Print the final message */ printf_last("Added Extra Segment Indexes: Segments=%"Pindex_t,segmentsx->number); } /*++++++++++++++++++++++++++++++++++++++ Delete the data structures needed for pruning. NodesX *nodesx The set of nodes to use. SegmentsX *segmentsx The set of segments to use. WaysX *waysx The set of ways to use. ++++++++++++++++++++++++++++++++++++++*/ void FinishPruning(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx) { if(segmentsx->next1) { log_free(segmentsx->next1); free(segmentsx->next1); segmentsx->next1=NULL; } } /*++++++++++++++++++++++++++++++++++++++ Prune out any groups of nodes and segments whose total length is less than a specified minimum. NodesX *nodesx The set of nodes to use. SegmentsX *segmentsx The set of segments to use. WaysX *waysx The set of ways to use. distance_t minimum The minimum distance to keep. ++++++++++++++++++++++++++++++++++++++*/ void PruneIsolatedRegions(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,distance_t minimum) { WaysX *newwaysx; WayX tmpwayx; transport_t transport; BitMask *connected,*region; index_t *regionsegments,*othersegments; index_t nallocregionsegments,nallocothersegments; if(nodesx->number==0 || segmentsx->number==0) return; /* Map into memory / open the files */ #if !SLIM nodesx->data=MapFile(nodesx->filename_tmp); segmentsx->data=MapFileWriteable(segmentsx->filename_tmp); waysx->data=MapFile(waysx->filename_tmp); #else nodesx->fd=SlimMapFile(nodesx->filename_tmp); segmentsx->fd=SlimMapFileWriteable(segmentsx->filename_tmp); waysx->fd=SlimMapFile(waysx->filename_tmp); InvalidateNodeXCache(nodesx->cache); InvalidateSegmentXCache(segmentsx->cache); InvalidateWayXCache(waysx->cache); #endif newwaysx=NewWayList(0,0); CloseFileBuffered(newwaysx->fd); newwaysx->fd=SlimMapFileWriteable(newwaysx->filename_tmp); connected=AllocBitMask(segmentsx->number); region =AllocBitMask(segmentsx->number); log_malloc(connected,SizeBitMask(segmentsx->number)); log_malloc(region ,SizeBitMask(segmentsx->number)); regionsegments=(index_t*)malloc_logassert((nallocregionsegments=1024)*sizeof(index_t)); othersegments =(index_t*)malloc_logassert((nallocothersegments =1024)*sizeof(index_t)); /* Loop through the transport types */ for(transport=Transport_None+1;transporttransports&transports)) continue; /* Print the start message */ printf_first("Pruning Isolated Regions (%s): Segments=0 Adjusted=0 Pruned=0",transport_str); /* Loop through the segments and find the disconnected ones */ ClearAllBits(connected,segmentsx->number); ClearAllBits(region ,segmentsx->number); for(i=0;inumber;i++) { index_t nregionsegments=0,nothersegments=0; distance_t total=0; SegmentX *segmentx; WayX *wayx; if(IsBitSet(connected,i)) goto endloop; segmentx=LookupSegmentX(segmentsx,i,1); if(IsPrunedSegmentX(segmentx)) goto endloop; if(segmentx->waynumber) wayx=LookupWayX(waysx,segmentx->way,1); else SlimFetch(newwaysx->fd,(wayx=&tmpwayx),sizeof(WayX),(segmentx->way-waysx->number)*sizeof(WayX)); if(!(wayx->way.allow&transports)) goto endloop; othersegments[nothersegments++]=i; SetBit(region,i); do { index_t thissegment,nodes[2]; thissegment=othersegments[--nothersegments]; if(nregionsegments==nallocregionsegments) regionsegments=(index_t*)realloc_logassert(regionsegments,(nallocregionsegments+=1024)*sizeof(index_t)); regionsegments[nregionsegments++]=thissegment; segmentx=LookupSegmentX(segmentsx,thissegment,1); nodes[0]=segmentx->node1; nodes[1]=segmentx->node2; total+=DISTANCE(segmentx->distance); for(j=0;j<2;j++) { NodeX *nodex=LookupNodeX(nodesx,nodes[j],1); if(!(nodex->allow&transports)) continue; segmentx=FirstSegmentX(segmentsx,nodes[j],1); while(segmentx) { index_t segment=IndexSegmentX(segmentsx,segmentx); if(segment!=thissegment) { if(segmentx->waynumber) wayx=LookupWayX(waysx,segmentx->way,1); else SlimFetch(newwaysx->fd,(wayx=&tmpwayx),sizeof(WayX),(segmentx->way-waysx->number)*sizeof(WayX)); if(wayx->way.allow&transports) { /* Already connected - finish */ if(IsBitSet(connected,segment)) { total=minimum; goto foundconnection; } /* Not in region - add to list */ if(!IsBitSet(region,segment)) { if(nothersegments==nallocothersegments) othersegments=(index_t*)realloc_logassert(othersegments,(nallocothersegments+=1024)*sizeof(index_t)); othersegments[nothersegments++]=segment; SetBit(region,segment); } } } segmentx=NextSegmentX(segmentsx,segmentx,nodes[j]); } } } while(nothersegments>0 && totalwaynumber) wayx=LookupWayX(waysx,segmentx->way,1); else SlimFetch(newwaysx->fd,(wayx=&tmpwayx),sizeof(WayX),(segmentx->way-waysx->number)*sizeof(WayX)); if(wayx->way.allow==transports) { prune_segment(segmentsx,segmentx); npruned++; } else { if(segmentx->waynumber) /* create a new way */ { tmpwayx=*wayx; tmpwayx.way.allow&=~transports; segmentx->way=waysx->number+newwaysx->number; SlimReplace(newwaysx->fd,&tmpwayx,sizeof(WayX),(segmentx->way-waysx->number)*sizeof(WayX)); newwaysx->number++; PutBackSegmentX(segmentsx,segmentx); } else /* modify the existing one */ { tmpwayx.way.allow&=~transports; SlimReplace(newwaysx->fd,&tmpwayx,sizeof(WayX),(segmentx->way-waysx->number)*sizeof(WayX)); } nadjusted++; } } } else /* connected - mark as part of the main region */ { for(j=0;jnumber,nadjusted,npruned,nregions); } /* Unmap from memory / close the files */ log_free(region); log_free(connected); free(region); free(connected); free(regionsegments); free(othersegments); #if !SLIM nodesx->data=UnmapFile(nodesx->data); segmentsx->data=UnmapFile(segmentsx->data); waysx->data=UnmapFile(waysx->data); #else nodesx->fd=SlimUnmapFile(nodesx->fd); segmentsx->fd=SlimUnmapFile(segmentsx->fd); waysx->fd=SlimUnmapFile(waysx->fd); #endif SlimUnmapFile(newwaysx->fd); waysx->number+=newwaysx->number; waysx->fd=OpenFileBufferedAppend(waysx->filename_tmp); newwaysx->fd=ReOpenFileBuffered(newwaysx->filename_tmp); while(!ReadFileBuffered(newwaysx->fd,&tmpwayx,sizeof(WayX))) WriteFileBuffered(waysx->fd,&tmpwayx,sizeof(WayX)); CloseFileBuffered(waysx->fd); CloseFileBuffered(newwaysx->fd); FreeWayList(newwaysx,0); } /*++++++++++++++++++++++++++++++++++++++ Prune out any segments that are shorter than a specified minimum. NodesX *nodesx The set of nodes to use. SegmentsX *segmentsx The set of segments to use. WaysX *waysx The set of ways to use. distance_t minimum The maximum length to remove or one less than the minimum length to keep. ++++++++++++++++++++++++++++++++++++++*/ void PruneShortSegments(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,distance_t minimum) { index_t i; index_t nshort=0,npruned=0; if(nodesx->number==0 || segmentsx->number==0 || waysx->number==0) return; /* Print the start message */ printf_first("Pruning Short Segments: Segments=0 Short=0 Pruned=0"); /* Map into memory / open the files */ #if !SLIM nodesx->data=MapFileWriteable(nodesx->filename_tmp); segmentsx->data=MapFileWriteable(segmentsx->filename_tmp); waysx->data=MapFile(waysx->filename_tmp); #else nodesx->fd=SlimMapFileWriteable(nodesx->filename_tmp); segmentsx->fd=SlimMapFileWriteable(segmentsx->filename_tmp); waysx->fd=SlimMapFile(waysx->filename_tmp); InvalidateNodeXCache(nodesx->cache); InvalidateSegmentXCache(segmentsx->cache); InvalidateWayXCache(waysx->cache); #endif /* Loop through the segments and find the short ones for possible modification */ for(i=0;inumber;i++) { SegmentX *segmentx2=LookupSegmentX(segmentsx,i,2); if(IsPrunedSegmentX(segmentx2)) goto endloop; /* : Initial state: ..N3 -------- N2 : S2 : Final state: ..N3 : = OR = : : Initial state: ..N1 -------- N2 ---- N3 -------- N4.. : S1 S2 S3 : : : Final state: ..N1 ------------ N3 ------------ N4.. : S1 S3 : Not if N1 is the same as N4. Must not delete N2 (or N3) if S2 (or S3) has different one-way properties from S1. Must not delete N2 (or N3) if S2 (or S3) has different highway properties from S1. Must combine N2, S2 and N3 disallowed transports into new N3. Must not delete N2 (or N3) if it is a mini-roundabout. Must not delete N2 (or N3) if it is involved in a turn restriction. = OR = : : Initial state: ..N1 -------- N2 ---- N3.. : S1 S2 : : : Final state: ..N1 ------------ N3.. : S1 : Not if N1 is the same as N3. Not if S1 has different one-way properties from S2. Not if S1 has different highway properties from S2. Not if N2 disallows transports allowed on S1 and S2. Not if N2 is a mini-roundabout. Not if N2 is involved in a turn restriction. */ if(DISTANCE(segmentx2->distance)<=minimum) { index_t node1=NO_NODE,node2,node3,node4=NO_NODE; index_t segment1=NO_SEGMENT,segment2=i,segment3=NO_SEGMENT; SegmentX *segmentx; int segcount2=0,segcount3=0; nshort++; node2=segmentx2->node1; node3=segmentx2->node2; /* Count the segments connected to N2 */ segmentx=FirstSegmentX(segmentsx,node2,4); while(segmentx) { segcount2++; if(segment1==NO_SEGMENT) { index_t segment=IndexSegmentX(segmentsx,segmentx); if(segment!=segment2) { segment1=segment; node1=OtherNode(segmentx,node2); } } else if(segcount2>2) break; segmentx=NextSegmentX(segmentsx,segmentx,node2); } /* Count the segments connected to N3 */ segmentx=FirstSegmentX(segmentsx,node3,4); while(segmentx) { segcount3++; if(segment3==NO_SEGMENT) { index_t segment=IndexSegmentX(segmentsx,segmentx); if(segment!=segment2) { segment3=segment; node4=OtherNode(segmentx,node3); } } else if(segcount3>2) break; segmentx=NextSegmentX(segmentsx,segmentx,node3); } /* Check which case we are handling (and canonicalise) */ if(segcount2>2 && segcount3>2) /* none of the cases in diagram - too complicated */ { goto endloop; } else if(segcount2==1 || segcount3==1) /* first case in diagram - prune segment */ { prune_segment(segmentsx,segmentx2); } else if(segcount2==2 && segcount3==2) /* second case in diagram - modify one segment and prune segment */ { SegmentX *segmentx1,*segmentx3; WayX *wayx1,*wayx2,*wayx3; NodeX *nodex2,*nodex3,*newnodex; index_t newnode; int join12=1,join23=1,same13=1; /* Check if pruning would collapse a loop */ if(node1==node4) goto endloop; /* Check if allowed due to one-way properties */ segmentx1=LookupSegmentX(segmentsx,segment1,1); segmentx3=LookupSegmentX(segmentsx,segment3,3); if(!IsOneway(segmentx1) && !IsOneway(segmentx2)) ; else if(IsOneway(segmentx1) && IsOneway(segmentx2)) { if(IsOnewayTo(segmentx1,node2) && !IsOnewayFrom(segmentx2,node2)) /* S1 is one-way but S2 doesn't continue */ join12=0; if(IsOnewayFrom(segmentx1,node2) && !IsOnewayTo(segmentx2,node2)) /* S1 is one-way but S2 doesn't continue */ join12=0; } else join12=0; if(!IsOneway(segmentx3) && !IsOneway(segmentx2)) ; else if(IsOneway(segmentx3) && IsOneway(segmentx2)) { if(IsOnewayTo(segmentx3,node3) && !IsOnewayFrom(segmentx2,node3)) /* S3 is one-way but S2 doesn't continue */ join23=0; if(IsOnewayFrom(segmentx3,node3) && !IsOnewayTo(segmentx2,node3)) /* S3 is one-way but S2 doesn't continue */ join23=0; } else join23=0; if(!join12 && !join23) goto endloop; /* Check if allowed due to highway properties */ wayx1=LookupWayX(waysx,segmentx1->way,1); wayx2=LookupWayX(waysx,segmentx2->way,2); wayx3=LookupWayX(waysx,segmentx3->way,3); if(WaysCompare(&wayx1->way,&wayx2->way)) join12=0; if(WaysCompare(&wayx3->way,&wayx2->way)) join23=0; if(!join12 && !join23) goto endloop; /* Check if allowed due to mini-roundabout and turn restriction */ nodex2=LookupNodeX(nodesx,node2,2); nodex3=LookupNodeX(nodesx,node3,3); if(nodex2->flags&NODE_MINIRNDBT) join12=0; if(nodex3->flags&NODE_MINIRNDBT) join23=0; if(!join12 && !join23) goto endloop; if(nodex2->flags&NODE_TURNRSTRCT2 || nodex2->flags&NODE_TURNRSTRCT) join12=0; if(nodex3->flags&NODE_TURNRSTRCT2 || nodex3->flags&NODE_TURNRSTRCT) join23=0; if(!join12 && !join23) goto endloop; /* New node properties */ if(join12) { newnode=node3; newnodex=nodex3; } else /* if(join23) */ { newnode=node2; newnodex=nodex2; } newnodex->allow=nodex2->allow&nodex3->allow; /* combine the restrictions of the two nodes */ newnodex->allow&=~((~wayx2->way.allow)&wayx3->way.allow); /* disallow anything blocked by segment2 */ newnodex->allow&=~((~wayx2->way.allow)&wayx1->way.allow); /* disallow anything blocked by segment2 */ newnodex->latitude =(nodex2->latitude +nodex3->latitude )/2; newnodex->longitude=(nodex2->longitude+nodex3->longitude)/2; PutBackNodeX(nodesx,newnodex); /* Modify segments - update the distances */ if(!IsOneway(segmentx1) && !IsOneway(segmentx3)) ; else if(IsOneway(segmentx1) && IsOneway(segmentx3)) { if(IsOnewayTo(segmentx1,node3) && !IsOnewayFrom(segmentx3,node3)) /* S1 is one-way but S3 doesn't continue */ same13=0; if(IsOnewayFrom(segmentx1,node3) && !IsOnewayTo(segmentx3,node3)) /* S1 is one-way but S3 doesn't continue */ same13=0; } else same13=0; if(WaysCompare(&wayx1->way,&wayx3->way)) same13=0; if(same13) { segmentx1->distance+=DISTANCE(segmentx2->distance)/2; segmentx3->distance+=DISTANCE(segmentx2->distance)-DISTANCE(segmentx2->distance)/2; } else if(join12) segmentx1->distance+=DISTANCE(segmentx2->distance); else /* if(join23) */ segmentx3->distance+=DISTANCE(segmentx2->distance); /* Modify segments - update the segments */ if(segmentx1->node1==node1) { if(segmentx1->node2!=newnode) modify_segment(segmentsx,segmentx1,node1,newnode); else PutBackSegmentX(segmentsx,segmentx1); } else /* if(segmentx1->node2==node1) */ { if(segmentx1->node1!=newnode) modify_segment(segmentsx,segmentx1,newnode,node1); else PutBackSegmentX(segmentsx,segmentx1); } if(segmentx3->node1==node4) { if(segmentx3->node2!=newnode) modify_segment(segmentsx,segmentx3,node4,newnode); else PutBackSegmentX(segmentsx,segmentx3); } else /* if(segmentx3->node2==node4) */ { if(segmentx3->node1!=newnode) modify_segment(segmentsx,segmentx3,newnode,node4); else PutBackSegmentX(segmentsx,segmentx3); } ReLookupSegmentX(segmentsx,segmentx2); prune_segment(segmentsx,segmentx2); } else /* third case in diagram - prune one segment */ { SegmentX *segmentx1; WayX *wayx1,*wayx2; NodeX *nodex2; if(segcount3==2) /* not as in diagram, shuffle things round */ { index_t temp; temp=segment1; segment1=segment3; segment3=temp; temp=node1; node1=node4; node4=temp; temp=node2; node2=node3; node3=temp; } /* Check if pruning would collapse a loop */ if(node1==node3) goto endloop; /* Check if allowed due to one-way properties */ segmentx1=LookupSegmentX(segmentsx,segment1,1); if(!IsOneway(segmentx1) && !IsOneway(segmentx2)) ; else if(IsOneway(segmentx1) && IsOneway(segmentx2)) { if(IsOnewayTo(segmentx1,node2) && !IsOnewayFrom(segmentx2,node2)) /* S1 is one-way but S2 doesn't continue */ goto endloop; if(IsOnewayFrom(segmentx1,node2) && !IsOnewayTo(segmentx2,node2)) /* S1 is one-way but S2 doesn't continue */ goto endloop; } else goto endloop; /* Check if allowed due to highway properties */ wayx1=LookupWayX(waysx,segmentx1->way,1); wayx2=LookupWayX(waysx,segmentx2->way,2); if(WaysCompare(&wayx1->way,&wayx2->way)) goto endloop; /* Check if allowed due to mini-roundabout and turn restriction */ nodex2=LookupNodeX(nodesx,node2,2); if(nodex2->flags&NODE_MINIRNDBT) goto endloop; if(nodex2->flags&NODE_TURNRSTRCT2 || nodex2->flags&NODE_TURNRSTRCT) goto endloop; /* Check if allowed due to node restrictions */ if((nodex2->allow&wayx1->way.allow)!=wayx1->way.allow) goto endloop; if((nodex2->allow&wayx2->way.allow)!=wayx2->way.allow) goto endloop; /* Modify segments */ segmentx1->distance+=DISTANCE(segmentx2->distance); if(segmentx1->node1==node1) modify_segment(segmentsx,segmentx1,node1,node3); else /* if(segmentx1->node2==node1) */ modify_segment(segmentsx,segmentx1,node3,node1); ReLookupSegmentX(segmentsx,segmentx2); prune_segment(segmentsx,segmentx2); } npruned++; } endloop: if(!((i+1)%10000)) printf_middle("Pruning Short Segments: Segments=%"Pindex_t" Short=%"Pindex_t" Pruned=%"Pindex_t,i+1,nshort,npruned); } /* Unmap from memory / close the files */ #if !SLIM nodesx->data=UnmapFile(nodesx->data); segmentsx->data=UnmapFile(segmentsx->data); waysx->data=UnmapFile(waysx->data); #else nodesx->fd=SlimUnmapFile(nodesx->fd); segmentsx->fd=SlimUnmapFile(segmentsx->fd); waysx->fd=SlimUnmapFile(waysx->fd); #endif /* Print the final message */ printf_last("Pruned Short Segments: Segments=%"Pindex_t" Short=%"Pindex_t" Pruned=%"Pindex_t,segmentsx->number,nshort,npruned); } /*++++++++++++++++++++++++++++++++++++++ Prune out any nodes from straight highways where the introduced error is smaller than a specified maximum. NodesX *nodesx The set of nodes to use. SegmentsX *segmentsx The set of segments to use. WaysX *waysx The set of ways to use. distance_t maximum The maximum error to introduce. ++++++++++++++++++++++++++++++++++++++*/ void PruneStraightHighwayNodes(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,distance_t maximum) { index_t i; index_t npruned=0; index_t nalloc; BitMask *checked; index_t *nodes,*segments; double *lats,*lons; double maximumf; if(nodesx->number==0 || segmentsx->number==0 || waysx->number==0) return; /* Print the start message */ printf_first("Pruning Straight Highway Nodes: Nodes=0 Pruned=0"); /* Map into memory / open the files */ #if !SLIM nodesx->data=MapFile(nodesx->filename_tmp); segmentsx->data=MapFileWriteable(segmentsx->filename_tmp); waysx->data=MapFile(waysx->filename_tmp); #else nodesx->fd=SlimMapFile(nodesx->filename_tmp); segmentsx->fd=SlimMapFileWriteable(segmentsx->filename_tmp); waysx->fd=SlimMapFile(waysx->filename_tmp); InvalidateNodeXCache(nodesx->cache); InvalidateSegmentXCache(segmentsx->cache); InvalidateWayXCache(waysx->cache); #endif checked=AllocBitMask(nodesx->number); log_malloc(checked,SizeBitMask(nodesx->number)); nodes =(index_t*)malloc_logassert((nalloc=1024)*sizeof(index_t)); segments=(index_t*)malloc_logassert( nalloc *sizeof(index_t)); lats=(double*)malloc_logassert(nalloc*sizeof(double)); lons=(double*)malloc_logassert(nalloc*sizeof(double)); /* Loop through the nodes and find stretches of simple highway for possible modification */ maximumf=distance_to_km(maximum); for(i=0;inumber;i++) { int lowerbounded=0,upperbounded=0; index_t lower=nalloc/2,current=nalloc/2,upper=nalloc/2; if(IsBitSet(checked,i)) goto endloop; if(segmentsx->firstnode[i]==NO_SEGMENT) goto endloop; /* Find all connected nodes */ nodes[current]=i; do { index_t node1=NO_NODE,node2=NO_NODE; index_t segment1=NO_SEGMENT,segment2=NO_SEGMENT; index_t way1=NO_WAY,way2=NO_WAY; int segcount=0; NodeX *nodex; /* Get the node data */ nodex=LookupNodeX(nodesx,nodes[current],1); lats[current]=latlong_to_radians(nodex->latitude); lons[current]=latlong_to_radians(nodex->longitude); /* Count the segments at the node if not forced to be an end node */ if(IsBitSet(checked,nodes[current])) ; else if(nodex->flags&NODE_MINIRNDBT) ; else if(nodex->flags&NODE_TURNRSTRCT2 || nodex->flags&NODE_TURNRSTRCT) ; else { SegmentX *segmentx; /* Count the segments connected to the node */ segmentx=FirstSegmentX(segmentsx,nodes[current],3); while(segmentx) { segcount++; if(node1==NO_NODE) { segment1=IndexSegmentX(segmentsx,segmentx); node1=OtherNode(segmentx,nodes[current]); way1=segmentx->way; } else if(node2==NO_NODE) { segment2=IndexSegmentX(segmentsx,segmentx); node2=OtherNode(segmentx,nodes[current]); way2=segmentx->way; } else break; segmentx=NextSegmentX(segmentsx,segmentx,nodes[current]); } } /* Check if allowed due to one-way properties */ if(segcount==2) { SegmentX *segmentx1,*segmentx2; segmentx1=LookupSegmentX(segmentsx,segment1,1); segmentx2=LookupSegmentX(segmentsx,segment2,2); if(!IsOneway(segmentx1) && !IsOneway(segmentx2)) ; else if(IsOneway(segmentx1) && IsOneway(segmentx2)) { if(IsOnewayTo(segmentx1,nodes[current]) && !IsOnewayFrom(segmentx2,nodes[current])) /* S1 is one-way but S2 doesn't continue */ segcount=0; if(IsOnewayFrom(segmentx1,nodes[current]) && !IsOnewayTo(segmentx2,nodes[current])) /* S1 is one-way but S2 doesn't continue */ segcount=0; } else segcount=0; } /* Check if allowed due to highway properties and node restrictions */ if(segcount==2) { WayX *wayx1,*wayx2; wayx1=LookupWayX(waysx,way1,1); wayx2=LookupWayX(waysx,way2,2); if(WaysCompare(&wayx1->way,&wayx2->way)) segcount=0; if(wayx1->way.name!=wayx2->way.name) segcount=0; if((nodex->allow&wayx1->way.allow)!=wayx1->way.allow) segcount=0; if((nodex->allow&wayx2->way.allow)!=wayx2->way.allow) segcount=0; } /* Update the lists */ if(segcount==2) { /* Make space in the lists */ if(upper==(nalloc-1)) { nodes =(index_t*)realloc_logassert(nodes ,(nalloc+=1024)*sizeof(index_t)); segments=(index_t*)realloc_logassert(segments, nalloc *sizeof(index_t)); lats=(double*)realloc_logassert(lats,nalloc*sizeof(double)); lons=(double*)realloc_logassert(lons,nalloc*sizeof(double)); } if(lower==0) /* move everything up by one */ { memmove(nodes+1 ,nodes ,(1+upper-lower)*sizeof(index_t)); memmove(segments+1,segments,(1+upper-lower)*sizeof(index_t)); memmove(lats+1,lats,(1+upper-lower)*sizeof(double)); memmove(lons+1,lons,(1+upper-lower)*sizeof(double)); current++; lower++; upper++; } if(lower==upper) /* first */ { lower--; nodes[lower]=node1; segments[lower]=segment1; upper++; nodes[upper]=node2; segments[upper-1]=segment2; segments[upper]=NO_SEGMENT; current--; } else if(current==lower) { lower--; if(nodes[current+1]==node2) { nodes[lower]=node1; segments[lower]=segment1; } else /* if(nodes[current+1]==node1) */ { nodes[lower]=node2; segments[lower]=segment2; } current--; } else /* if(current==upper) */ { upper++; if(nodes[current-1]==node2) { nodes[upper]=node1; segments[upper-1]=segment1; } else /* if(nodes[current-1]==node1) */ { nodes[upper]=node2; segments[upper-1]=segment2; } segments[upper]=NO_SEGMENT; current++; } if(nodes[upper]==nodes[lower]) { if(!lowerbounded && !upperbounded) { nodex=LookupNodeX(nodesx,nodes[lower],1); lats[lower]=latlong_to_radians(nodex->latitude); lons[lower]=latlong_to_radians(nodex->longitude); } lats[upper]=lats[lower]; lons[upper]=lons[lower]; lowerbounded=1; upperbounded=1; } } else /* if(segment!=2) */ { if(current==upper) upperbounded=1; if(current==lower) { lowerbounded=1; current=upper; } } } while(!(lowerbounded && upperbounded)); /* Mark the nodes */ for(current=lower;current<=upper;current++) SetBit(checked,nodes[current]); /* Check for straight highway */ for(;lower<(upper-1);lower++) { for(current=upper;current>(lower+1);current--) { SegmentX *segmentx; distance_t dist=0; double dist1,dist2,dist3,distp; index_t c; dist3=distance(lats[lower],lons[lower],lats[current],lons[current]); for(c=lower+1;c=0 && dist3b>=0) distp=sqrt(dist1*dist1-dist3a*dist3a); else if(dist3a>0) distp=dist2; else /* if(dist3b>0) */ distp=dist1; } if(distp>maximumf) /* gone too far */ break; } if(cdistance); prune_segment(segmentsx,segmentx); npruned++; } segmentx=LookupSegmentX(segmentsx,segments[lower],1); if(nodes[lower]==nodes[current]) /* loop; all within maximum distance */ { prune_segment(segmentsx,segmentx); npruned++; } else { segmentx->distance+=dist; if(segmentx->node1==nodes[lower]) modify_segment(segmentsx,segmentx,nodes[lower],nodes[current]); else /* if(segmentx->node2==nodes[lower]) */ modify_segment(segmentsx,segmentx,nodes[current],nodes[lower]); } lower=current-1; break; } } endloop: if(!((i+1)%10000)) printf_middle("Pruning Straight Highway Nodes: Nodes=%"Pindex_t" Pruned=%"Pindex_t,i+1,npruned); } /* Unmap from memory / close the files */ log_free(checked); free(checked); free(nodes); free(segments); free(lats); free(lons); #if !SLIM nodesx->data=UnmapFile(nodesx->data); segmentsx->data=UnmapFile(segmentsx->data); waysx->data=UnmapFile(waysx->data); #else nodesx->fd=SlimUnmapFile(nodesx->fd); segmentsx->fd=SlimUnmapFile(segmentsx->fd); waysx->fd=SlimUnmapFile(waysx->fd); #endif /* Print the final message */ printf_last("Pruned Straight Highway Nodes: Nodes=%"Pindex_t" Pruned=%"Pindex_t,nodesx->number,npruned); } /*++++++++++++++++++++++++++++++++++++++ Prune a segment; unused nodes and ways will get marked for pruning later. SegmentsX *segmentsx The set of segments to use. SegmentX *segmentx The segment to be pruned. ++++++++++++++++++++++++++++++++++++++*/ static void prune_segment(SegmentsX *segmentsx,SegmentX *segmentx) { unlink_segment_node1_refs(segmentsx,segmentx); unlink_segment_node2_refs(segmentsx,segmentx); segmentx->node1=NO_NODE; segmentx->node2=NO_NODE; segmentx->next2=NO_SEGMENT; PutBackSegmentX(segmentsx,segmentx); } /*++++++++++++++++++++++++++++++++++++++ Modify a segment's nodes; unused nodes will get marked for pruning later. SegmentsX *segmentsx The set of segments to use. SegmentX *segmentx The segment to be modified. index_t newnode1 The new value of node1. index_t newnode2 The new value of node2. ++++++++++++++++++++++++++++++++++++++*/ static void modify_segment(SegmentsX *segmentsx,SegmentX *segmentx,index_t newnode1,index_t newnode2) { index_t thissegment=IndexSegmentX(segmentsx,segmentx); if(newnode1>newnode2) /* rotate the segment around */ { index_t temp; if(segmentx->distance&(ONEWAY_2TO1|ONEWAY_1TO2)) segmentx->distance^=ONEWAY_2TO1|ONEWAY_1TO2; temp=newnode1; newnode1=newnode2; newnode2=temp; } if(newnode1!=segmentx->node1) unlink_segment_node1_refs(segmentsx,segmentx); if(newnode2!=segmentx->node2) unlink_segment_node2_refs(segmentsx,segmentx); if(newnode1!=segmentx->node1) /* only modify it if the node has changed */ { segmentx->node1=newnode1; segmentsx->next1[thissegment]=segmentsx->firstnode[newnode1]; segmentsx->firstnode[newnode1]=thissegment; } if(newnode2!=segmentx->node2) /* only modify it if the node has changed */ { segmentx->node2=newnode2; segmentx->next2=segmentsx->firstnode[newnode2]; segmentsx->firstnode[newnode2]=thissegment; } PutBackSegmentX(segmentsx,segmentx); } /*++++++++++++++++++++++++++++++++++++++ Unlink a node1 from a segment by modifying the linked list type arrangement of node references. SegmentsX *segmentsx The set of segments to use. SegmentX *segmentx The segment to be modified. ++++++++++++++++++++++++++++++++++++++*/ static void unlink_segment_node1_refs(SegmentsX *segmentsx,SegmentX *segmentx) { index_t segment,thissegment; thissegment=IndexSegmentX(segmentsx,segmentx); segment=segmentsx->firstnode[segmentx->node1]; if(segment==thissegment) segmentsx->firstnode[segmentx->node1]=segmentsx->next1[thissegment]; else { do { index_t nextsegment; SegmentX *segx=LookupSegmentX(segmentsx,segment,4); if(segx->node1==segmentx->node1) { nextsegment=segmentsx->next1[segment]; if(nextsegment==thissegment) segmentsx->next1[segment]=segmentsx->next1[thissegment]; } else /* if(segx->node2==segmentx->node1) */ { nextsegment=segx->next2; if(nextsegment==thissegment) { segx->next2=segmentsx->next1[thissegment]; PutBackSegmentX(segmentsx,segx); } } segment=nextsegment; } while(segment!=thissegment && segment!=NO_SEGMENT); } } /*++++++++++++++++++++++++++++++++++++++ Unlink a node2 from a segment by modifying the linked list type arrangement of node references. SegmentsX *segmentsx The set of segments to use. SegmentX *segmentx The segment to be modified. ++++++++++++++++++++++++++++++++++++++*/ static void unlink_segment_node2_refs(SegmentsX *segmentsx,SegmentX *segmentx) { index_t segment,thissegment; thissegment=IndexSegmentX(segmentsx,segmentx); segment=segmentsx->firstnode[segmentx->node2]; if(segment==thissegment) segmentsx->firstnode[segmentx->node2]=segmentx->next2; else { do { index_t nextsegment; SegmentX *segx=LookupSegmentX(segmentsx,segment,4); if(segx->node1==segmentx->node2) { nextsegment=segmentsx->next1[segment]; if(nextsegment==thissegment) segmentsx->next1[segment]=segmentx->next2; } else /* if(segx->node2==segmentx->node2) */ { nextsegment=segx->next2; if(nextsegment==thissegment) { segx->next2=segmentx->next2; PutBackSegmentX(segmentsx,segx); } } segment=nextsegment; } while(segment!=thissegment && segment!=NO_SEGMENT); } } /*++++++++++++++++++++++++++++++++++++++ Calculate the distance between two locations. double distance Returns the distance between the locations. double lat1 The latitude of the first location. double lon1 The longitude of the first location. double lat2 The latitude of the second location. double lon2 The longitude of the second location. ++++++++++++++++++++++++++++++++++++++*/ static double distance(double lat1,double lon1,double lat2,double lon2) { double dlon = lon1 - lon2; double dlat = lat1 - lat2; double a1,a2,a,sa,c,d; if(dlon==0 && dlat==0) return 0; a1 = sin (dlat / 2); a2 = sin (dlon / 2); a = (a1 * a1) + cos (lat1) * cos (lat2) * a2 * a2; sa = sqrt (a); if (sa <= 1.0) {c = 2 * asin (sa);} else {c = 2 * asin (1.0);} d = 6378.137 * c; return(d); } routino-3.4.3/src/sorting.h 644 233 144 4321 14251172034 11014 0/*************************************** Header file for sorting function prototypes Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2012, 2018, 2019 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef SORTING_H #define SORTING_H /*+ To stop multiple inclusions. +*/ #include #include "types.h" /* Constants */ /*+ The type, size and alignment of variable to store the variable length +*/ #define FILESORT_VARINT uint16_t #define FILESORT_VARSIZE sizeof(FILESORT_VARINT) #define FILESORT_MAXINT ((FILESORT_VARINT)~0) #define FILESORT_VARALIGN sizeof(void*) /* Macros */ /*+ A macro to use as a last resort in the comparison function to preserve on the output the input order of items that compare equally. +*/ #define FILESORT_PRESERVE_ORDER(a,b) ( ((a)<(b)) ? -1 : +1) /* Functions in sorting.c */ index_t filesort_fixed(int fd_in,int fd_out,size_t itemsize,int (*pre_sort_function)(void*,index_t), int (*compare_function)(const void*,const void*), int (*post_sort_function)(void*,index_t)); index_t filesort_vary(int fd_in,int fd_out,int (*pre_sort_function)(void*,index_t), int (*compare_function)(const void*,const void*), int (*post_sort_function)(void*,index_t)); void filesort_heapsort(void **datap,size_t nitems,int(*compare)(const void*, const void*)); #endif /* SORTING_H */ routino-3.4.3/src/segments.h 644 233 144 17360 12663133501 11204 0/*************************************** $Header: /home/amb/CVS/routino/src/segments.h,v 1.38 2010-12-21 17:18:41 amb Exp $ A header file for the segments. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2016 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef SEGMENTS_H #define SEGMENTS_H /*+ To stop multiple inclusions. +*/ #include #include "types.h" #include "cache.h" #include "files.h" #include "profiles.h" /* Data structures */ /*+ A structure containing a single segment. +*/ struct _Segment { index_t node1; /*+ The index of the starting node. +*/ index_t node2; /*+ The index of the finishing node. +*/ index_t next2; /*+ The index of the next segment sharing node2. +*/ index_t way; /*+ The index of the way associated with the segment. +*/ distance_t distance; /*+ The distance between the nodes. +*/ }; /*+ A structure containing the header from the file. +*/ typedef struct _SegmentsFile { index_t number; /*+ The number of segments in total. +*/ index_t snumber; /*+ The number of super-segments. +*/ index_t nnumber; /*+ The number of normal segments. +*/ } SegmentsFile; /*+ A structure containing a set of segments (and pointers to mmap file). +*/ struct _Segments { SegmentsFile file; /*+ The header data from the file. +*/ #if !SLIM char *data; /*+ The memory mapped data. +*/ Segment *segments; /*+ An array of segments. +*/ #else int fd; /*+ The file descriptor for the file. +*/ Segment cached[4]; /*+ Three cached segments read from the file in slim mode. +*/ index_t incache[4]; /*+ The indexes of the cached segments. +*/ SegmentCache *cache; /*+ A RAM cache of segments read from the file. +*/ #endif }; /* Functions in segments.c */ Segments *LoadSegmentList(const char *filename); void DestroySegmentList(Segments *segments); index_t FindClosestSegmentHeading(Nodes *nodes,Segments *segments,Ways *ways,index_t node1,double heading,Profile *profile); distance_t Distance(double lat1,double lon1,double lat2,double lon2); double DeltaLat(double lon,distance_t distance); double DeltaLon(double lat,distance_t distance); duration_t Duration(Segment *segmentp,Way *wayp,Profile *profile); double TurnAngle(Nodes *nodes,Segment *segment1p,Segment *segment2p,index_t node); double BearingAngle(Nodes *nodes,Segment *segmentp,index_t node); static inline Segment *NextSegment(Segments *segments,Segment *segmentp,index_t node); /* Macros and inline functions */ /*+ Return true if this is a normal segment. +*/ #define IsNormalSegment(xxx) (((xxx)->distance)&SEGMENT_NORMAL) /*+ Return true if this is a super-segment. +*/ #define IsSuperSegment(xxx) (((xxx)->distance)&SEGMENT_SUPER) /*+ Return true if the segment is oneway. +*/ #define IsOneway(xxx) ((xxx)->distance&(ONEWAY_2TO1|ONEWAY_1TO2)) /*+ Return true if the segment is oneway towards the specified node. +*/ #define IsOnewayTo(xxx,yyy) ((xxx)->node1==(yyy)?((xxx)->distance&ONEWAY_2TO1):((xxx)->distance&ONEWAY_1TO2)) /*+ Return true if the segment is oneway from the specified node. +*/ #define IsOnewayFrom(xxx,yyy) ((xxx)->node2==(yyy)?((xxx)->distance&ONEWAY_2TO1):((xxx)->distance&ONEWAY_1TO2)) /*+ Return the other node in the segment that is not the specified node. +*/ #define OtherNode(xxx,yyy) ((xxx)->node1==(yyy)?(xxx)->node2:(xxx)->node1) #if !SLIM /*+ Return a segment pointer given a set of segments and an index. +*/ #define LookupSegment(xxx,yyy,ppp) (&(xxx)->segments[yyy]) /*+ Return a segment index given a set of segments and a pointer. +*/ #define IndexSegment(xxx,yyy) (index_t)((yyy)-&(xxx)->segments[0]) /*++++++++++++++++++++++++++++++++++++++ Find the next segment with a particular starting node. Segment *NextSegment Returns a pointer to the next segment. Segments *segments The set of segments to use. Segment *segmentp The current segment. index_t node The wanted node. ++++++++++++++++++++++++++++++++++++++*/ static inline Segment *NextSegment(Segments *segments,Segment *segmentp,index_t node) { if(segmentp->node1==node) { segmentp++; if(IndexSegment(segments,segmentp)>=segments->file.number || segmentp->node1!=node) return(NULL); else return(segmentp); } else { if(segmentp->next2==NO_SEGMENT) return(NULL); else return(LookupSegment(segments,segmentp->next2,1)); } } #else /* Prototypes */ static inline Segment *LookupSegment(Segments *segments,index_t index,int position); static inline index_t IndexSegment(Segments *segments,Segment *segmentp); CACHE_NEWCACHE_PROTO(Segment) CACHE_DELETECACHE_PROTO(Segment) CACHE_FETCHCACHE_PROTO(Segment) CACHE_INVALIDATECACHE_PROTO(Segment) /* Data type */ CACHE_STRUCTURE(Segment) /* Inline functions */ CACHE_NEWCACHE(Segment) CACHE_DELETECACHE(Segment) CACHE_FETCHCACHE(Segment) CACHE_INVALIDATECACHE(Segment) /*++++++++++++++++++++++++++++++++++++++ Find the Segment information for a particular segment. Segment *LookupSegment Returns a pointer to the cached segment information. Segments *segments The set of segments to use. index_t index The index of the segment. int position The position in the cache to store the value. ++++++++++++++++++++++++++++++++++++++*/ static inline Segment *LookupSegment(Segments *segments,index_t index,int position) { segments->cached[position-1]=*FetchCachedSegment(segments->cache,index,segments->fd,sizeof(SegmentsFile)); segments->incache[position-1]=index; return(&segments->cached[position-1]); } /*++++++++++++++++++++++++++++++++++++++ Find the segment index for a particular segment pointer. index_t IndexSegment Returns the index of the segment in the list. Segments *segments The set of segments to use. Segment *segmentp The segment whose index is to be found. ++++++++++++++++++++++++++++++++++++++*/ static inline index_t IndexSegment(Segments *segments,Segment *segmentp) { int position1=(int)(segmentp-&segments->cached[0]); return(segments->incache[position1]); } /*++++++++++++++++++++++++++++++++++++++ Find the next segment with a particular starting node. Segment *NextSegment Returns a pointer to the next segment. Segments *segments The set of segments to use. Segment *segmentp The current segment. index_t node The wanted node. ++++++++++++++++++++++++++++++++++++++*/ static inline Segment *NextSegment(Segments *segments,Segment *segmentp,index_t node) { int position=(int)(segmentp-segments->cached)+1; if(segmentp->node1==node) { index_t index=IndexSegment(segments,segmentp); index++; if(index>=segments->file.number) return(NULL); segmentp=LookupSegment(segments,index,position); if(segmentp->node1!=node) return(NULL); else return(segmentp); } else { if(segmentp->next2==NO_SEGMENT) return(NULL); else return(LookupSegment(segments,segmentp->next2,position)); } } #endif #endif /* SEGMENTS_H */ routino-3.4.3/src/relationsx.c 644 233 144 126266 14774476224 11611 0/*************************************** Extended Relation data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2015, 2018, 2019, 2020, 2022, 2024, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include "types.h" #include "segments.h" #include "relations.h" #include "nodesx.h" #include "segmentsx.h" #include "waysx.h" #include "relationsx.h" #include "files.h" #include "logging.h" #include "sorting.h" /* Global variables */ /*+ The command line '--tmpdir' option or its default value. +*/ extern char *option_tmpdirname; /* Local variables */ /*+ Temporary file-local variables for use by the sort functions (re-initialised for each sort). +*/ static SegmentsX *sortsegmentsx; static NodesX *sortnodesx; /* Local functions */ static int sort_route_by_id(RouteRelX *a,RouteRelX *b); static int deduplicate_route_by_id(RouteRelX *relationx,index_t index); static int sort_turn_by_id(TurnRelX *a,TurnRelX *b); static int deduplicate_turn_by_id(TurnRelX *relationx,index_t index); static int geographically_index(TurnRelX *relationx,index_t index); static int geographically_index_convert_segments(TurnRelX *relationx,index_t index); static int sort_by_via(TurnRelX *a,TurnRelX *b); /*++++++++++++++++++++++++++++++++++++++ Allocate a new relation list (create a new file or open an existing one). RelationsX *NewRelationList Returns the relation list. int append Set to 1 if the file is to be opened for appending. int readonly Set to 1 if the file is to be opened for reading. ++++++++++++++++++++++++++++++++++++++*/ RelationsX *NewRelationList(int append,int readonly) { RelationsX *relationsx; logassert(sizeof(relation_t)>=sizeof(index_t),"Size of relation_t type must be at least as large as size of index_t type."); relationsx=(RelationsX*)calloc_logassert(1,sizeof(RelationsX)); /* Route Relations */ relationsx->rrfilename =(char*)malloc_logassert(strlen(option_tmpdirname)+32); relationsx->rrfilename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+48); /* allow %p to be up to 20 bytes */ sprintf(relationsx->rrfilename ,"%s/relationsx.route.parsed.mem",option_tmpdirname); sprintf(relationsx->rrfilename_tmp,"%s/relationsx.route.%p.tmp" ,option_tmpdirname,(void*)relationsx); if(append || readonly) if(ExistsFile(relationsx->rrfilename)) { FILESORT_VARINT relationsize; int rrfd; rrfd=ReOpenFileBuffered(relationsx->rrfilename); while(!ReadFileBuffered(rrfd,&relationsize,FILESORT_VARSIZE)) { SkipFileBuffered(rrfd,relationsize); relationsx->rrnumber++; } CloseFileBuffered(rrfd); RenameFile(relationsx->rrfilename,relationsx->rrfilename_tmp); } if(append) relationsx->rrfd=OpenFileBufferedAppend(relationsx->rrfilename_tmp); else if(!readonly) relationsx->rrfd=OpenFileBufferedNew(relationsx->rrfilename_tmp); else relationsx->rrfd=-1; relationsx->rrifilename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+48); /* allow %p to be up to 20 bytes */ relationsx->rrofilename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+48); /* allow %p to be up to 20 bytes */ sprintf(relationsx->rrifilename_tmp,"%s/relationsx.route.%p.idx.tmp",option_tmpdirname,(void*)relationsx); sprintf(relationsx->rrofilename_tmp,"%s/relationsx.route.%p.off.tmp",option_tmpdirname,(void*)relationsx); /* Turn Restriction Relations */ relationsx->trfilename =(char*)malloc_logassert(strlen(option_tmpdirname)+32); relationsx->trfilename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+48); /* allow %p to be up to 20 bytes */ sprintf(relationsx->trfilename ,"%s/relationsx.turn.parsed.mem",option_tmpdirname); sprintf(relationsx->trfilename_tmp,"%s/relationsx.turn.%p.tmp" ,option_tmpdirname,(void*)relationsx); if(append || readonly) if(ExistsFile(relationsx->trfilename)) { offset_t size; size=SizeFile(relationsx->trfilename); relationsx->trnumber=size/sizeof(TurnRelX); RenameFile(relationsx->trfilename,relationsx->trfilename_tmp); } if(append) relationsx->trfd=OpenFileBufferedAppend(relationsx->trfilename_tmp); else if(!readonly) relationsx->trfd=OpenFileBufferedNew(relationsx->trfilename_tmp); else relationsx->trfd=-1; relationsx->trifilename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+48); /* allow %p to be up to 20 bytes */ sprintf(relationsx->trifilename_tmp,"%s/relationsx.turn.%p.idx.tmp",option_tmpdirname,(void*)relationsx); return(relationsx); } /*++++++++++++++++++++++++++++++++++++++ Free a relation list. RelationsX *relationsx The set of relations to be freed. int keep If set then the results file is to be kept. ++++++++++++++++++++++++++++++++++++++*/ void FreeRelationList(RelationsX *relationsx,int keep) { /* Route relations */ if(keep) RenameFile(relationsx->rrfilename_tmp,relationsx->rrfilename); else DeleteFile(relationsx->rrfilename_tmp); free(relationsx->rrfilename); free(relationsx->rrfilename_tmp); DeleteFile(relationsx->rrifilename_tmp); DeleteFile(relationsx->rrofilename_tmp); /* Turn Restriction relations */ if(keep) RenameFile(relationsx->trfilename_tmp,relationsx->trfilename); else DeleteFile(relationsx->trfilename_tmp); free(relationsx->trfilename); free(relationsx->trfilename_tmp); DeleteFile(relationsx->trifilename_tmp); free(relationsx); } /*++++++++++++++++++++++++++++++++++++++ Append a single relation to an unsorted route relation list. RelationsX* relationsx The set of relations to process. relation_t id The ID of the relation. transports_t routes The types of routes that this relation is for. node_t *nodes The array of nodes that are members of the relation. int nnodes The number of nodes that are members of the relation. way_t *ways The array of ways that are members of the relation. int nways The number of ways that are members of the relation. relation_t *relations The array of relations that are members of the relation. int nrelations The number of relations that are members of the relation. ++++++++++++++++++++++++++++++++++++++*/ void AppendRouteRelationList(RelationsX* relationsx,relation_t id, transports_t routes, node_t *nodes,int nnodes, way_t *ways,int nways, relation_t *relations,int nrelations) { RouteRelX relationx={0}; uint64_t longsize; FILESORT_VARINT size; node_t nonode=NO_NODE_ID; way_t noway=NO_WAY_ID; relation_t norelation=NO_RELATION_ID; relationx.id=id; relationx.routes=routes; longsize=sizeof(RouteRelX)+1*sizeof(node_t)+(nways+1)*sizeof(way_t)+(nrelations+1)*sizeof(relation_t); if(longsize>=FILESORT_MAXINT) /* Ensure no overflow of FILESORT_VARINT integer */ { logerror("Route Relation %"Prelation_t" contains too much data; ignoring some ways (or change FILESORT_VARINT to 32-bits?)\n",logerror_relation(id)); nways=(FILESORT_MAXINT-(sizeof(RouteRelX)+1*sizeof(node_t)+(nrelations+1)*sizeof(relation_t)))/sizeof(way_t)-1; longsize=sizeof(RouteRelX)+1*sizeof(node_t)+(nways+1)*sizeof(way_t)+(nrelations+1)*sizeof(relation_t); logassert(longsizerrfd,&size ,FILESORT_VARSIZE); WriteFileBuffered(relationsx->rrfd,&relationx,sizeof(RouteRelX)); WriteFileBuffered(relationsx->rrfd,&nonode,sizeof(node_t)); WriteFileBuffered(relationsx->rrfd,ways ,nways*sizeof(way_t)); WriteFileBuffered(relationsx->rrfd,&noway, sizeof(way_t)); WriteFileBuffered(relationsx->rrfd,relations ,nrelations*sizeof(relation_t)); WriteFileBuffered(relationsx->rrfd,&norelation, sizeof(relation_t)); relationsx->rrnumber++; logassert(relationsx->rrnumber!=0,"Too many route relations (change index_t to 64-bits?)"); /* Zero marks the high-water mark for relations. */ } /*++++++++++++++++++++++++++++++++++++++ Append a single relation to an unsorted turn restriction relation list. RelationsX* relationsx The set of relations to process. relation_t id The ID of the relation. way_t from The way that the turn restriction starts from. way_t to The way that the restriction finished on. node_t via The node that the turn restriction passes through. TurnRestriction restriction The type of restriction. transports_t except The set of transports allowed to bypass the restriction. ++++++++++++++++++++++++++++++++++++++*/ void AppendTurnRelationList(RelationsX* relationsx,relation_t id, way_t from,way_t to,node_t via, TurnRestriction restriction,transports_t except) { TurnRelX relationx={0}; relationx.id=id; relationx.from=from; relationx.to=to; relationx.via=via; relationx.restriction=restriction; relationx.except=except; WriteFileBuffered(relationsx->trfd,&relationx,sizeof(TurnRelX)); relationsx->trnumber++; logassert(relationsx->trnumber!=0,"Too many turn relations (change index_t to 64-bits?)"); /* Zero marks the high-water mark for relations. */ } /*++++++++++++++++++++++++++++++++++++++ Finish appending relations and change the filename over. RelationsX *relationsx The relations that have been appended. ++++++++++++++++++++++++++++++++++++++*/ void FinishRelationList(RelationsX *relationsx) { if(relationsx->rrfd!=-1) relationsx->rrfd =CloseFileBuffered(relationsx->rrfd); if(relationsx->trfd!=-1) relationsx->trfd=CloseFileBuffered(relationsx->trfd); } /*++++++++++++++++++++++++++++++++++++++ Find a particular route relation index. index_t IndexRouteRelX Returns the index of the route relation with the specified id. RelationsX *relationsx The set of relations to process. relation_t id The relation id to look for. ++++++++++++++++++++++++++++++++++++++*/ index_t IndexRouteRelX(RelationsX *relationsx,relation_t id) { index_t start=0; index_t end=relationsx->rrnumber-1; index_t mid; if(relationsx->rrnumber==0) /* There are no route relations */ return(NO_RELATION); /* Binary search - search key exact match only is required. * * # <- start | Check mid and exit if it matches else move start or end. * # | * # | Since an exact match is wanted we can set end=mid-1 * # <- mid | or start=mid+1 if we find that mid doesn't match. * # | * # | Eventually either end=start or end=start+1 and one of * # <- end | start or end is the wanted one or neither is. */ while((end-start)>1) { mid=start+(end-start)/2; /* Choose mid point (avoid overflow) */ if(relationsx->rridata[mid]rridata[mid]>id) /* Mid point is too high */ end=mid-1; else /* Mid point is correct */ return(mid); } if(relationsx->rridata[start]==id) /* Start is correct */ return(start); if(relationsx->rridata[end]==id) /* End is correct */ return(end); return(NO_RELATION); } /*++++++++++++++++++++++++++++++++++++++ Find a particular route relation index. index_t IndexTurnRelX Returns the index of the turn relation with the specified id. RelationsX *relationsx The set of relations to process. relation_t id The relation id to look for. ++++++++++++++++++++++++++++++++++++++*/ index_t IndexTurnRelX(RelationsX *relationsx,relation_t id) { index_t start=0; index_t end=relationsx->trnumber-1; index_t mid; if(relationsx->trnumber==0) /* There are no route relations */ return(NO_RELATION); /* Binary search - search key exact match only is required. * * # <- start | Check mid and exit if it matches else move start or end. * # | * # | Since an exact match is wanted we can set end=mid-1 * # <- mid | or start=mid+1 if we find that mid doesn't match. * # | * # | Eventually either end=start or end=start+1 and one of * # <- end | start or end is the wanted one or neither is. */ while((end-start)>1) { mid=start+(end-start)/2; /* Choose mid point (avoid overflow) */ if(relationsx->tridata[mid]tridata[mid]>id) /* Mid point is too high */ end=mid-1; else /* Mid point is correct */ return(mid); } if(relationsx->tridata[start]==id) /* Start is correct */ return(start); if(relationsx->tridata[end]==id) /* End is correct */ return(end); return(NO_RELATION); } /*++++++++++++++++++++++++++++++++++++++ Sort the list of relations. RelationsX* relationsx The set of relations to process. ++++++++++++++++++++++++++++++++++++++*/ void SortRelationList(RelationsX* relationsx) { /* Route Relations */ if(relationsx->rrnumber) { index_t rrxnumber; int rrfd; /* Print the start message */ printf_first("Sorting Route Relations"); /* Re-open the file read-only and a new file writeable */ rrfd=ReplaceFileBuffered(relationsx->rrfilename_tmp,&relationsx->rrfd); /* Sort the relations */ rrxnumber=relationsx->rrnumber; relationsx->rrnumber=filesort_vary(relationsx->rrfd,rrfd,NULL, (int (*)(const void*,const void*))sort_route_by_id, (int (*)(void*,index_t))deduplicate_route_by_id); relationsx->rrknumber=relationsx->rrnumber; /* Close the files */ relationsx->rrfd=CloseFileBuffered(relationsx->rrfd); CloseFileBuffered(rrfd); /* Print the final message */ printf_last("Sorted Route Relations: Relations=%"Pindex_t" Duplicates=%"Pindex_t,rrxnumber,rrxnumber-relationsx->rrnumber); } /* Turn Restriction Relations. */ if(relationsx->trnumber) { index_t trxnumber; int trfd; /* Print the start message */ printf_first("Sorting Turn Relations"); /* Re-open the file read-only and a new file writeable */ trfd=ReplaceFileBuffered(relationsx->trfilename_tmp,&relationsx->trfd); /* Sort the relations */ trxnumber=relationsx->trnumber; relationsx->trnumber=filesort_fixed(relationsx->trfd,trfd,sizeof(TurnRelX),NULL, (int (*)(const void*,const void*))sort_turn_by_id, (int (*)(void*,index_t))deduplicate_turn_by_id); relationsx->trknumber=relationsx->trnumber; /* Close the files */ relationsx->trfd=CloseFileBuffered(relationsx->trfd); CloseFileBuffered(trfd); /* Print the final message */ printf_last("Sorted Turn Relations: Relations=%"Pindex_t" Duplicates=%"Pindex_t,trxnumber,trxnumber-relationsx->trnumber); } } /*++++++++++++++++++++++++++++++++++++++ Sort the route relations into id order. int sort_route_by_id Returns the comparison of the id fields. RouteRelX *a The first extended relation. RouteRelX *b The second extended relation. ++++++++++++++++++++++++++++++++++++++*/ static int sort_route_by_id(RouteRelX *a,RouteRelX *b) { relation_t a_id=a->id; relation_t b_id=b->id; if(a_idb_id) return(1); else return(-FILESORT_PRESERVE_ORDER(a,b)); /* latest version first */ } /*++++++++++++++++++++++++++++++++++++++ Deduplicate the route relations using the id after sorting. int deduplicate_route_by_id Return 1 if the value is to be kept, otherwise 0. RouteRelX *relationx The extended relation. index_t index The number of sorted relations that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int deduplicate_route_by_id(RouteRelX *relationx,index_t index) { static relation_t previd; /* internal variable (reset by first call in each sort; index==0) */ if(index==0 || relationx->id!=previd) { previd=relationx->id; if(relationx->routes==RELATION_DELETED) return(0); else return(1); } else return(0); } /*++++++++++++++++++++++++++++++++++++++ Sort the turn restriction relations into id order. int sort_turn_by_id Returns the comparison of the id fields. TurnRelX *a The first extended relation. TurnRelX *b The second extended relation. ++++++++++++++++++++++++++++++++++++++*/ static int sort_turn_by_id(TurnRelX *a,TurnRelX *b) { relation_t a_id=a->id; relation_t b_id=b->id; if(a_idb_id) return(1); else return(-FILESORT_PRESERVE_ORDER(a,b)); /* latest version first */ } /*++++++++++++++++++++++++++++++++++++++ Deduplicate the turn restriction relations using the id after sorting. int deduplicate_turn_by_id Return 1 if the value is to be kept, otherwise 0. TurnRelX *relationx The extended relation. index_t index The number of sorted relations that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int deduplicate_turn_by_id(TurnRelX *relationx,index_t index) { static relation_t previd; /* internal variable (reset by first call in each sort; index==0) */ if(index==0 || relationx->id!=previd) { previd=relationx->id; if(relationx->except==RELATION_DELETED) return(0); else return(1); } else return(0); } /*++++++++++++++++++++++++++++++++++++++ Process the route relations and apply the information to the ways. RelationsX *relationsx The set of relations to use. WaysX *waysx The set of ways to modify. int keep If set to 1 then keep the old data file otherwise delete it. ++++++++++++++++++++++++++++++++++++++*/ void ProcessRouteRelations(RelationsX *relationsx,WaysX *waysx,int keep) { RouteRelX *unmatched=NULL,*lastunmatched=NULL; int nunmatched=0,lastnunmatched=0,iteration=1; if(waysx->number==0) return; /* Map into memory / open the files */ #if !SLIM waysx->data=MapFileWriteable(waysx->filename_tmp); #else waysx->fd=SlimMapFileWriteable(waysx->filename_tmp); InvalidateWayXCache(waysx->cache); #endif /* Map the index into memory */ waysx->idata =MapFile(waysx->ifilename_tmp); /* Re-open the file read-only */ relationsx->rrfd=ReOpenFileBuffered(relationsx->rrfilename_tmp); /* Read through the file. */ do { index_t i,ways=0,relations=0; /* Print the start message */ printf_first("Processing Route Relations (%d): Relations=0 Modified Ways=0",iteration); SeekFileBuffered(relationsx->rrfd,0); for(i=0;irrnumber;i++) { FILESORT_VARINT size; RouteRelX relationx; way_t wayid; node_t nodeid; relation_t relationid; transports_t routes=Transports_None; /* Read each route relation */ ReadFileBuffered(relationsx->rrfd,&size,FILESORT_VARSIZE); ReadFileBuffered(relationsx->rrfd,&relationx,sizeof(RouteRelX)); /* Decide what type of route it is */ if(iteration==1) { relations++; routes=relationx.routes; } else { int j; for(j=0;jrrfd,&nodeid,sizeof(node_t)) && nodeid!=NO_NODE_ID) ; /* Loop through the ways */ while(!ReadFileBuffered(relationsx->rrfd,&wayid,sizeof(way_t)) && wayid!=NO_WAY_ID) { /* Update the ways that are listed for the relation */ if(routes) { index_t way=IndexWayX(waysx,wayid); if(way!=NO_WAY) { WayX *wayx=LookupWayX(waysx,way,1); if(routes&Transports_Foot) { if(!(wayx->way.allow&Transports_Foot)) { logerror("Route Relation %"Prelation_t" for Foot contains Way %"Pway_t" that does not allow Foot transport; overriding.\n",logerror_relation(relationx.id),logerror_way(wayid)); wayx->way.allow|=Transports_Foot; } wayx->way.props|=Properties_FootRoute; } if(routes&Transports_Bicycle) { if(!(wayx->way.allow&Transports_Bicycle)) { logerror("Route Relation %"Prelation_t" for Bicycle contains Way %"Pway_t" that does not allow Bicycle transport; overriding.\n",logerror_relation(relationx.id),logerror_way(wayid)); wayx->way.allow|=Transports_Bicycle; } wayx->way.props|=Properties_BicycleRoute; } PutBackWayX(waysx,wayx); ways++; } else logerror("Route Relation %"Prelation_t" contains Way %"Pway_t" that does not exist in the Routino database.\n",logerror_relation(relationx.id),logerror_way(wayid)); } } /* Loop through the relations */ while(!ReadFileBuffered(relationsx->rrfd,&relationid,sizeof(relation_t)) && relationid!=NO_RELATION_ID) { /* Add the relations that are listed for this relation to the list for next time */ if(relationid==relationx.id) logerror("Relation %"Prelation_t" contains itself.\n",logerror_relation(relationx.id)); else if(routes) { if(nunmatched%256==0) unmatched=(RouteRelX*)realloc_logassert((void*)unmatched,(nunmatched+256)*sizeof(RouteRelX)); unmatched[nunmatched].id=relationid; unmatched[nunmatched].routes=routes; nunmatched++; } } if(!((i+1)%1000)) printf_middle("Processing Route Relations (%d): Relations=%"Pindex_t" Modified Ways=%"Pindex_t,iteration,relations,ways); } if(lastunmatched) free(lastunmatched); lastunmatched=unmatched; lastnunmatched=nunmatched; unmatched=NULL; nunmatched=0; /* Print the final message */ printf_last("Processed Route Relations (%d): Relations=%"Pindex_t" Modified Ways=%"Pindex_t,iteration,relations,ways); } while(lastnunmatched && iteration++<8); if(lastunmatched) free(lastunmatched); /* Close the files */ relationsx->rrfd=CloseFileBuffered(relationsx->rrfd); if(keep) RenameFile(relationsx->rrfilename_tmp,relationsx->rrfilename); /* Unmap from memory / close the files */ #if !SLIM waysx->data=UnmapFile(waysx->data); #else waysx->fd=SlimUnmapFile(waysx->fd); #endif /* Unmap the index from memory */ waysx->idata =UnmapFile(waysx->idata); } /*++++++++++++++++++++++++++++++++++++++ Process the turn relations to update them with node/segment information. RelationsX *relationsx The set of relations to modify. NodesX *nodesx The set of nodes to use. SegmentsX *segmentsx The set of segments to use. WaysX *waysx The set of ways to use. int keep If set to 1 then keep the old data file otherwise delete it. ++++++++++++++++++++++++++++++++++++++*/ void ProcessTurnRelations(RelationsX *relationsx,NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,int keep) { int trfd; index_t i,total=0,deleted=0; if(nodesx->number==0 || segmentsx->number==0) return; /* Print the start message */ printf_first("Processing Turn Relations: Relations=0 Deleted=0 Added=0"); /* Map into memory / open the files */ #if !SLIM nodesx->data=MapFileWriteable(nodesx->filename_tmp); segmentsx->data=MapFile(segmentsx->filename_tmp); waysx->data=MapFile(waysx->filename_tmp); #else nodesx->fd=SlimMapFileWriteable(nodesx->filename_tmp); segmentsx->fd=SlimMapFile(segmentsx->filename_tmp); waysx->fd=SlimMapFile(waysx->filename_tmp); InvalidateNodeXCache(nodesx->cache); InvalidateSegmentXCache(segmentsx->cache); InvalidateWayXCache(waysx->cache); #endif /* Map the index into memory */ nodesx->idata=MapFile(nodesx->ifilename_tmp); waysx->idata =MapFile(waysx->ifilename_tmp); /* Re-open the file read-only and a new file writeable */ if(keep) { RenameFile(relationsx->trfilename_tmp,relationsx->trfilename); relationsx->trfd=ReOpenFileBuffered(relationsx->trfilename); trfd=OpenFileBufferedNew(relationsx->trfilename_tmp); } else trfd=ReplaceFileBuffered(relationsx->trfilename_tmp,&relationsx->trfd); /* Process all of the relations */ for(i=0;itrnumber;i++) { TurnRelX relationx; NodeX *nodex; SegmentX *segmentx; index_t via,from,to; ReadFileBuffered(relationsx->trfd,&relationx,sizeof(TurnRelX)); via =IndexNodeX(nodesx,relationx.via); from=IndexWayX(waysx,relationx.from); to =IndexWayX(waysx,relationx.to); if(via==NO_NODE) { logerror("Turn Relation %"Prelation_t" contains Node %"Pnode_t" that does not exist in the Routino database.\n",logerror_relation(relationx.id),logerror_node(relationx.via)); deleted++; goto endloop; } if(from==NO_WAY) { logerror("Turn Relation %"Prelation_t" contains Way %"Pway_t" that does not exist in the Routino database.\n",logerror_relation(relationx.id),logerror_way(relationx.from)); deleted++; goto endloop; } if(to==NO_WAY) { logerror("Turn Relation %"Prelation_t" contains Way %"Pway_t" that does not exist in the Routino database.\n",logerror_relation(relationx.id),logerror_way(relationx.to)); deleted++; goto endloop; } relationx.via =via; relationx.from=from; relationx.to =to; if(relationx.restriction==TurnRestrict_no_right_turn || relationx.restriction==TurnRestrict_no_left_turn || relationx.restriction==TurnRestrict_no_u_turn || relationx.restriction==TurnRestrict_no_straight_on) { index_t node_from=NO_NODE,node_to=NO_NODE; int oneway_from=0,oneway_to=0,vehicles_from=1,vehicles_to=1; /* Find the segments that join the node 'via' */ segmentx=FirstSegmentX(segmentsx,relationx.via,1); while(segmentx) { if(segmentx->way==relationx.from) { WayX *wayx=LookupWayX(waysx,segmentx->way,1); if(node_from!=NO_NODE) /* Only one segment can be on the 'from' way */ { logerror("Turn Relation %"Prelation_t" is not stored because the 'via' node is not at the end of the 'from' way.\n",logerror_relation(relationx.id)); deleted++; goto endloop; } node_from=OtherNode(segmentx,relationx.via); if(IsOnewayFrom(segmentx,relationx.via)) oneway_from=1; /* not allowed */ if(!(wayx->way.allow&(Transports_Bicycle|Transports_Moped|Transports_Motorcycle|Transports_Motorcar|Transports_Goods|Transports_HGV|Transports_PSV))) vehicles_from=0; /* not allowed */ } if(segmentx->way==relationx.to) { WayX *wayx=LookupWayX(waysx,segmentx->way,1); if(node_to!=NO_NODE) /* Only one segment can be on the 'to' way */ { logerror("Turn Relation %"Prelation_t" is not stored because the 'via' node is not at the end of the 'to' way.\n",logerror_relation(relationx.id)); deleted++; goto endloop; } node_to=OtherNode(segmentx,relationx.via); if(IsOnewayTo(segmentx,relationx.via)) oneway_to=1; /* not allowed */ if(!(wayx->way.allow&(Transports_Bicycle|Transports_Moped|Transports_Motorcycle|Transports_Motorcar|Transports_Goods|Transports_HGV|Transports_PSV))) vehicles_to=0; /* not allowed */ } segmentx=NextSegmentX(segmentsx,segmentx,relationx.via); } if(node_from==NO_NODE) logerror("Turn Relation %"Prelation_t" is not stored because the 'via' node is not part of the 'from' way.\n",logerror_relation(relationx.id)); if(node_to==NO_NODE) logerror("Turn Relation %"Prelation_t" is not stored because the 'via' node is not part of the 'to' way.\n",logerror_relation(relationx.id)); if(oneway_from) logerror("Turn Relation %"Prelation_t" is not needed because the 'from' way is oneway away from the 'via' node.\n",logerror_relation(relationx.id)); if(oneway_to) logerror("Turn Relation %"Prelation_t" is not needed because the 'to' way is oneway towards the 'via' node.\n",logerror_relation(relationx.id)); if(!vehicles_from) logerror("Turn Relation %"Prelation_t" is not needed because the 'from' way does not allow vehicles.\n",logerror_relation(relationx.id)); if(!vehicles_to) logerror("Turn Relation %"Prelation_t" is not needed because the 'to' way does not allow vehicles.\n",logerror_relation(relationx.id)); if(oneway_from || oneway_to || !vehicles_from || !vehicles_to || node_from==NO_NODE || node_to==NO_NODE) { deleted++; goto endloop; } /* Write the results */ relationx.from=node_from; relationx.to =node_to; WriteFileBuffered(trfd,&relationx,sizeof(TurnRelX)); total++; } else { index_t node_from=NO_NODE,node_to=NO_NODE,node_other[MAX_SEG_PER_NODE]; int nnodes_other=0,i; int oneway_from=0,vehicles_from=1; /* Find the segments that join the node 'via' */ segmentx=FirstSegmentX(segmentsx,relationx.via,1); while(segmentx) { if(segmentx->way==relationx.from) { WayX *wayx=LookupWayX(waysx,segmentx->way,1); if(node_from!=NO_NODE) /* Only one segment can be on the 'from' way */ { logerror("Turn Relation %"Prelation_t" is not stored because the 'via' node is not at the end of the 'from' way.\n",logerror_relation(relationx.id)); deleted++; goto endloop; } node_from=OtherNode(segmentx,relationx.via); if(IsOnewayFrom(segmentx,relationx.via)) oneway_from=1; /* not allowed */ if(!(wayx->way.allow&(Transports_Bicycle|Transports_Moped|Transports_Motorcycle|Transports_Motorcar|Transports_Goods|Transports_HGV|Transports_PSV))) vehicles_from=0; /* not allowed */ } if(segmentx->way==relationx.to) { if(node_to!=NO_NODE) /* Only one segment can be on the 'to' way */ { logerror("Turn Relation %"Prelation_t" is not stored because the 'via' node is not at the end of the 'to' way.\n",logerror_relation(relationx.id)); deleted++; goto endloop; } node_to=OtherNode(segmentx,relationx.via); } if(segmentx->way!=relationx.from && segmentx->way!=relationx.to) { WayX *wayx=LookupWayX(waysx,segmentx->way,1); if(IsOnewayTo(segmentx,relationx.via)) ; /* not allowed */ else if(!(wayx->way.allow&(Transports_Bicycle|Transports_Moped|Transports_Motorcycle|Transports_Motorcar|Transports_Goods|Transports_HGV|Transports_PSV))) ; /* not allowed */ else { logassert(nnodes_otherflags|=NODE_TURNRSTRCT; PutBackNodeX(nodesx,nodex); segmentx=FirstSegmentX(segmentsx,relationx.via,1); while(segmentx) { index_t othernode=OtherNode(segmentx,relationx.via); nodex=LookupNodeX(nodesx,othernode,1); nodex->flags|=NODE_TURNRSTRCT2; PutBackNodeX(nodesx,nodex); segmentx=NextSegmentX(segmentsx,segmentx,relationx.via); } endloop: if(!((i+1)%1000)) printf_middle("Processing Turn Relations: Relations=%"Pindex_t" Deleted=%"Pindex_t" Added=%"Pindex_t,i+1,deleted,total-relationsx->trnumber+deleted); } /* Close the files */ relationsx->trfd=CloseFileBuffered(relationsx->trfd); CloseFileBuffered(trfd); /* Free the now-unneeded indexes */ log_free(segmentsx->firstnode); free(segmentsx->firstnode); segmentsx->firstnode=NULL; /* Unmap from memory / close the files */ #if !SLIM nodesx->data=UnmapFile(nodesx->data); segmentsx->data=UnmapFile(segmentsx->data); waysx->data=UnmapFile(waysx->data); #else nodesx->fd=SlimUnmapFile(nodesx->fd); segmentsx->fd=SlimUnmapFile(segmentsx->fd); waysx->fd=SlimUnmapFile(waysx->fd); #endif /* Unmap the index from memory */ nodesx->idata=UnmapFile(nodesx->idata); waysx->idata =UnmapFile(waysx->idata); /* Print the final message */ printf_last("Processed Turn Relations: Relations=%"Pindex_t" Deleted=%"Pindex_t" Added=%"Pindex_t,total,deleted,total-relationsx->trnumber+deleted); relationsx->trnumber=total; } /*++++++++++++++++++++++++++++++++++++++ Remove pruned turn relations and update the node indexes after pruning nodes. RelationsX *relationsx The set of relations to modify. NodesX *nodesx The set of nodes to use. ++++++++++++++++++++++++++++++++++++++*/ void RemovePrunedTurnRelations(RelationsX *relationsx,NodesX *nodesx) { TurnRelX relationx; index_t total=0,pruned=0,notpruned=0; int trfd; if(relationsx->trnumber==0) return; /* Print the start message */ printf_first("Deleting Pruned Turn Relations: Relations=0 Pruned=0"); /* Re-open the file read-only and a new file writeable */ trfd=ReplaceFileBuffered(relationsx->trfilename_tmp,&relationsx->trfd); /* Process all of the relations */ while(!ReadFileBuffered(relationsx->trfd,&relationx,sizeof(TurnRelX))) { relationx.from=nodesx->pdata[relationx.from]; relationx.via =nodesx->pdata[relationx.via]; relationx.to =nodesx->pdata[relationx.to]; if(relationx.from==NO_WAY || relationx.via==NO_NODE || relationx.to==NO_WAY) pruned++; else { WriteFileBuffered(trfd,&relationx,sizeof(TurnRelX)); notpruned++; } total++; if(!(total%1000)) printf_middle("Deleting Pruned Turn Relations: Relations=%"Pindex_t" Pruned=%"Pindex_t,total,pruned); } relationsx->trnumber=notpruned; /* Close the files */ relationsx->trfd=CloseFileBuffered(relationsx->trfd); CloseFileBuffered(trfd); /* Print the final message */ printf_last("Deleted Pruned Turn Relations: Relations=%"Pindex_t" Pruned=%"Pindex_t,total,pruned); } /*++++++++++++++++++++++++++++++++++++++ Sort the turn relations geographically after updating the node indexes. RelationsX *relationsx The set of relations to modify. NodesX *nodesx The set of nodes to use. SegmentsX *segmentsx The set of segments to use. int convert Set to 1 to convert the segments as well as sorting them (the second time it is called). ++++++++++++++++++++++++++++++++++++++*/ void SortTurnRelationListGeographically(RelationsX *relationsx,NodesX *nodesx,SegmentsX *segmentsx,int convert) { int trfd; if(segmentsx->number==0) return; /* Print the start message */ printf_first("Sorting Turn Relations Geographically"); /* Map into memory / open the files */ #if !SLIM segmentsx->data=MapFile(segmentsx->filename_tmp); #else segmentsx->fd=SlimMapFile(segmentsx->filename_tmp); InvalidateSegmentXCache(segmentsx->cache); #endif /* Re-open the file read-only and a new file writeable */ trfd=ReplaceFileBuffered(relationsx->trfilename_tmp,&relationsx->trfd); /* Update the segments with geographically sorted node indexes and sort them */ sortnodesx=nodesx; sortsegmentsx=segmentsx; if(!convert) filesort_fixed(relationsx->trfd,trfd,sizeof(TurnRelX),(int (*)(void*,index_t))geographically_index, (int (*)(const void*,const void*))sort_by_via, NULL); else filesort_fixed(relationsx->trfd,trfd,sizeof(TurnRelX),(int (*)(void*,index_t))geographically_index_convert_segments, (int (*)(const void*,const void*))sort_by_via, NULL); /* Close the files */ relationsx->trfd=CloseFileBuffered(relationsx->trfd); CloseFileBuffered(trfd); /* Unmap from memory / close the files */ #if !SLIM segmentsx->data=UnmapFile(segmentsx->data); #else segmentsx->fd=SlimUnmapFile(segmentsx->fd); #endif /* Free the memory */ if(nodesx->gdata) { log_free(nodesx->gdata); free(nodesx->gdata); nodesx->gdata=NULL; } /* Print the final message */ printf_last("Sorted Turn Relations Geographically: Turn Relations=%"Pindex_t,relationsx->trnumber); } /*++++++++++++++++++++++++++++++++++++++ Update the turn relation indexes. int geographically_index Return 1 if the value is to be kept, otherwise 0. TurnRelX *relationx The extended turn relation. index_t index The number of unsorted turn relations that have been read from the input file. ++++++++++++++++++++++++++++++++++++++*/ static int geographically_index(TurnRelX *relationx,index_t index) { relationx->from=sortnodesx->gdata[relationx->from]; relationx->via =sortnodesx->gdata[relationx->via]; relationx->to =sortnodesx->gdata[relationx->to]; return(1); } /*++++++++++++++++++++++++++++++++++++++ Update the turn relation indexes and replace them with segments. int geographically_index_convert_segments Return 1 if the value is to be kept, otherwise 0. TurnRelX *relationx The extended turn relation. index_t index The number of unsorted turn relations that have been read from the input file. ++++++++++++++++++++++++++++++++++++++*/ static int geographically_index_convert_segments(TurnRelX *relationx,index_t index) { SegmentX *segmentx; index_t from_node,via_node,to_node; from_node=sortnodesx->gdata[relationx->from]; via_node =sortnodesx->gdata[relationx->via]; to_node =sortnodesx->gdata[relationx->to]; segmentx=FirstSegmentX(sortsegmentsx,via_node,1); do { if(OtherNode(segmentx,via_node)==from_node) relationx->from=IndexSegmentX(sortsegmentsx,segmentx); if(OtherNode(segmentx,via_node)==to_node) relationx->to=IndexSegmentX(sortsegmentsx,segmentx); segmentx=NextSegmentX(sortsegmentsx,segmentx,via_node); } while(segmentx); relationx->via=via_node; return(1); } /*++++++++++++++++++++++++++++++++++++++ Sort the turn restriction relations into via index order (then by from and to segments). int sort_by_via Returns the comparison of the via, from and to fields. TurnRelX *a The first extended relation. TurnRelX *b The second extended relation. ++++++++++++++++++++++++++++++++++++++*/ static int sort_by_via(TurnRelX *a,TurnRelX *b) { index_t a_id=a->via; index_t b_id=b->via; if(a_idb_id) return(1); else { index_t a_id=a->from; index_t b_id=b->from; if(a_idb_id) return(1); else { index_t a_id=a->to; index_t b_id=b->to; if(a_idb_id) return(1); else return(FILESORT_PRESERVE_ORDER(a,b)); } } } /*++++++++++++++++++++++++++++++++++++++ Save the relation list to a file. RelationsX* relationsx The set of relations to save. const char *filename The name of the file to save. ++++++++++++++++++++++++++++++++++++++*/ void SaveRelationList(RelationsX* relationsx,const char *filename) { index_t i; int fd; RelationsFile relationsfile={0}; /* Print the start message */ printf_first("Writing Relations: Turn Relations=0"); /* Re-open the file read-only */ relationsx->trfd=ReOpenFileBuffered(relationsx->trfilename_tmp); /* Write out the relations data */ fd=OpenFileBufferedNew(filename); SeekFileBuffered(fd,sizeof(RelationsFile)); for(i=0;itrnumber;i++) { TurnRelX relationx; TurnRelation relation={0}; ReadFileBuffered(relationsx->trfd,&relationx,sizeof(TurnRelX)); relation.from=relationx.from; relation.via=relationx.via; relation.to=relationx.to; relation.except=relationx.except; WriteFileBuffered(fd,&relation,sizeof(TurnRelation)); if(!((i+1)%1000)) printf_middle("Writing Relations: Turn Relations=%"Pindex_t,i+1); } /* Write out the header structure */ relationsfile.trnumber=relationsx->trnumber; SeekFileBuffered(fd,0); WriteFileBuffered(fd,&relationsfile,sizeof(RelationsFile)); CloseFileBuffered(fd); /* Close the file */ relationsx->trfd=CloseFileBuffered(relationsx->trfd); /* Print the final message */ printf_last("Wrote Relations: Turn Relations=%"Pindex_t,relationsx->trnumber); } routino-3.4.3/src/osmxmlparse.c 644 233 144 52513 14454035662 11734 0/*************************************** OSM XML file parser (either JOSM or planet) Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2023 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include "osmparser.h" #include "xmlparse.h" #include "tagging.h" #include "logging.h" /* Local parsing variables (re-initialised for each file) */ static int current_mode=MODE_NORMAL; static uint64_t nnodes,nways,nrelations; static TagList *current_tags; /* The XML tag processing function prototypes */ //static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding); static int osmType_function(const char *_tag_,int _type_,const char *version); static int osmChangeType_function(const char *_tag_,int _type_,const char *version); //static int boundsType_function(const char *_tag_,int _type_); //static int boundType_function(const char *_tag_,int _type_); static int changesetType_function(const char *_tag_,int _type_); static int modifyType_function(const char *_tag_,int _type_); static int createType_function(const char *_tag_,int _type_); static int deleteType_function(const char *_tag_,int _type_); static int nodeType_function(const char *_tag_,int _type_,const char *id,const char *lat,const char *lon); static int wayType_function(const char *_tag_,int _type_,const char *id); static int relationType_function(const char *_tag_,int _type_,const char *id); static int tagType_function(const char *_tag_,int _type_,const char *k,const char *v); static int ndType_function(const char *_tag_,int _type_,const char *ref); static int memberType_function(const char *_tag_,int _type_,const char *type,const char *ref,const char *role); /* The XML tag definitions (forward declarations) */ static const xmltag xmlDeclaration_tag; static const xmltag osmType_tag; static const xmltag osmChangeType_tag; static const xmltag boundsType_tag; static const xmltag boundType_tag; static const xmltag changesetType_tag; static const xmltag modifyType_tag; static const xmltag createType_tag; static const xmltag deleteType_tag; static const xmltag nodeType_tag; static const xmltag wayType_tag; static const xmltag relationType_tag; static const xmltag tagType_tag; static const xmltag ndType_tag; static const xmltag memberType_tag; /* The XML tag definition values */ /*+ The complete set of tags at the top level for OSM. +*/ static const xmltag * const xml_osm_toplevel_tags[]={&xmlDeclaration_tag,&osmType_tag,NULL}; /*+ The complete set of tags at the top level for OSC. +*/ static const xmltag * const xml_osc_toplevel_tags[]={&xmlDeclaration_tag,&osmChangeType_tag,NULL}; /*+ The xmlDeclaration type tag. +*/ static const xmltag xmlDeclaration_tag= {"xml", 2, {"version","encoding"}, NULL, {NULL}}; /*+ The osmType type tag. +*/ static const xmltag osmType_tag= {"osm", 1, {"version"}, osmType_function, {&boundsType_tag,&boundType_tag,&changesetType_tag,&nodeType_tag,&wayType_tag,&relationType_tag,NULL}}; /*+ The osmChangeType type tag. +*/ static const xmltag osmChangeType_tag= {"osmChange", 1, {"version"}, osmChangeType_function, {&boundsType_tag,&modifyType_tag,&createType_tag,&deleteType_tag,NULL}}; /*+ The boundsType type tag. +*/ static const xmltag boundsType_tag= {"bounds", 0, {NULL}, NULL, {NULL}}; /*+ The boundType type tag. +*/ static const xmltag boundType_tag= {"bound", 0, {NULL}, NULL, {NULL}}; /*+ The changesetType type tag. +*/ static const xmltag changesetType_tag= {"changeset", 0, {NULL}, changesetType_function, {&tagType_tag,NULL}}; /*+ The modifyType type tag. +*/ static const xmltag modifyType_tag= {"modify", 0, {NULL}, modifyType_function, {&nodeType_tag,&wayType_tag,&relationType_tag,NULL}}; /*+ The createType type tag. +*/ static const xmltag createType_tag= {"create", 0, {NULL}, createType_function, {&nodeType_tag,&wayType_tag,&relationType_tag,NULL}}; /*+ The deleteType type tag. +*/ static const xmltag deleteType_tag= {"delete", 0, {NULL}, deleteType_function, {&nodeType_tag,&wayType_tag,&relationType_tag,NULL}}; /*+ The nodeType type tag. +*/ static const xmltag nodeType_tag= {"node", 3, {"id","lat","lon"}, nodeType_function, {&tagType_tag,NULL}}; /*+ The wayType type tag. +*/ static const xmltag wayType_tag= {"way", 1, {"id"}, wayType_function, {&ndType_tag,&tagType_tag,NULL}}; /*+ The relationType type tag. +*/ static const xmltag relationType_tag= {"relation", 1, {"id"}, relationType_function, {&memberType_tag,&tagType_tag,NULL}}; /*+ The tagType type tag. +*/ static const xmltag tagType_tag= {"tag", 2, {"k","v"}, tagType_function, {NULL}}; /*+ The ndType type tag. +*/ static const xmltag ndType_tag= {"nd", 1, {"ref"}, ndType_function, {NULL}}; /*+ The memberType type tag. +*/ static const xmltag memberType_tag= {"member", 3, {"type","ref","role"}, memberType_function, {NULL}}; /* The XML tag processing functions */ /*++++++++++++++++++++++++++++++++++++++ The function that is called when the XML declaration is seen int xmlDeclaration_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *version The contents of the 'version' attribute (or NULL if not defined). const char *encoding The contents of the 'encoding' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ //static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the osmType XSD type is seen int osmType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *version The contents of the 'version' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int osmType_function(const char *_tag_,int _type_,const char *version) { /* Print the initial message */ if(_type_&XMLPARSE_TAG_START) printf_first("Read: Lines=%"PRIu64" Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes=0,nways=0,nrelations=0); /* Check the tag values */ if(_type_&XMLPARSE_TAG_START) { current_mode=MODE_NORMAL; if(!version || strcmp(version,"0.6")) XMLPARSE_MESSAGE(_tag_,"Invalid value for 'version' (only '0.6' accepted)"); } /* Print the final message */ if(_type_&XMLPARSE_TAG_END) printf_last("Read: Lines=%"PRIu64" Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the osmChangeType XSD type is seen int osmChangeType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *version The contents of the 'version' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int osmChangeType_function(const char *_tag_,int _type_,const char *version) { /* Print the initial message */ if(_type_&XMLPARSE_TAG_START) printf_first("Read: Lines=%"PRIu64" Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes=0,nways=0,nrelations=0); /* Check the tag values */ if(_type_&XMLPARSE_TAG_START) { if(!version || strcmp(version,"0.6")) XMLPARSE_MESSAGE(_tag_,"Invalid value for 'version' (only '0.6' accepted)"); } /* Print the final message */ if(_type_&XMLPARSE_TAG_END) printf_last("Read: Lines=%"PRIu64" Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the boundsType XSD type is seen int boundsType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int boundsType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the boundType XSD type is seen int boundType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int boundType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the changesetType XSD type is seen int changesetType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ static int changesetType_function(const char *_tag_,int _type_) { current_tags=NULL; return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the modifyType XSD type is seen int modifyType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ static int modifyType_function(const char *_tag_,int _type_) { if(_type_&XMLPARSE_TAG_START) current_mode=MODE_MODIFY; return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the createType XSD type is seen int createType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ static int createType_function(const char *_tag_,int _type_) { if(_type_&XMLPARSE_TAG_START) current_mode=MODE_CREATE; return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the deleteType XSD type is seen int deleteType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ static int deleteType_function(const char *_tag_,int _type_) { if(_type_&XMLPARSE_TAG_START) current_mode=MODE_DELETE; return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the nodeType XSD type is seen int nodeType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *id The contents of the 'id' attribute (or NULL if not defined). const char *lat The contents of the 'lat' attribute (or NULL if not defined). const char *lon The contents of the 'lon' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int nodeType_function(const char *_tag_,int _type_,const char *id,const char *lat,const char *lon) { static int64_t llid; /* static variable to store attributes from tag until tag */ static double latitude,longitude; /* static variable to store attributes from tag until tag */ if(_type_&XMLPARSE_TAG_START) { nnodes++; if(!(nnodes%10000)) printf_middle("Reading: Lines=%"PRIu64" Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations); current_tags=NewTagList(); /* Handle the node information */ XMLPARSE_ASSERT_INTEGER(_tag_,id); llid=atoll(id); /* need int64_t conversion */ if(current_mode!=MODE_DELETE) { XMLPARSE_ASSERT_FLOATING(_tag_,lat); latitude =atof(lat); XMLPARSE_ASSERT_FLOATING(_tag_,lon); longitude=atof(lon); } } if(_type_&XMLPARSE_TAG_END) { AddNode(llid,latitude,longitude,current_mode,current_tags); current_tags=NULL; } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the wayType XSD type is seen int wayType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *id The contents of the 'id' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int wayType_function(const char *_tag_,int _type_,const char *id) { static int64_t llid; /* static variable to store attributes from tag until tag */ if(_type_&XMLPARSE_TAG_START) { nways++; if(!(nways%1000)) printf_middle("Reading: Lines=%"PRIu64" Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations); current_tags=NewTagList(); AddWayRefs(0); /* Handle the way information */ XMLPARSE_ASSERT_INTEGER(_tag_,id); llid=atoll(id); /* need int64_t conversion */ } if(_type_&XMLPARSE_TAG_END) { AddWay(llid,current_mode,current_tags); current_tags=NULL; } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the relationType XSD type is seen int relationType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *id The contents of the 'id' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int relationType_function(const char *_tag_,int _type_,const char *id) { static int64_t llid; /* static variable to store attributes from tag until tag */ if(_type_&XMLPARSE_TAG_START) { nrelations++; if(!(nrelations%1000)) printf_middle("Reading: Lines=%"PRIu64" Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations); current_tags=NewTagList(); AddRelationRefs(0,0,0,NULL); /* Handle the relation information */ XMLPARSE_ASSERT_INTEGER(_tag_,id); llid=atoll(id); /* need int64_t conversion */ } if(_type_&XMLPARSE_TAG_END) { AddRelation(llid,current_mode,current_tags); current_tags=NULL; } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the tagType XSD type is seen int tagType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *k The contents of the 'k' attribute (or NULL if not defined). const char *v The contents of the 'v' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int tagType_function(const char *_tag_,int _type_,const char *k,const char *v) { if(_type_&XMLPARSE_TAG_START && current_tags) { XMLPARSE_ASSERT_STRING(_tag_,k); XMLPARSE_ASSERT_STRING(_tag_,v); AppendTag(current_tags,k,v); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the ndType XSD type is seen int ndType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *ref The contents of the 'ref' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int ndType_function(const char *_tag_,int _type_,const char *ref) { if(_type_&XMLPARSE_TAG_START) { int64_t llid; XMLPARSE_ASSERT_INTEGER(_tag_,ref); llid=atoll(ref); /* need int64_t conversion */ AddWayRefs(llid); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the memberType XSD type is seen int memberType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *type The contents of the 'type' attribute (or NULL if not defined). const char *ref The contents of the 'ref' attribute (or NULL if not defined). const char *role The contents of the 'role' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int memberType_function(const char *_tag_,int _type_,const char *type,const char *ref,const char *role) { if(_type_&XMLPARSE_TAG_START) { int64_t llid; XMLPARSE_ASSERT_STRING(_tag_,type); XMLPARSE_ASSERT_INTEGER(_tag_,ref); llid=atoll(ref); /* need int64_t conversion */ if(!strcmp(type,"node")) AddRelationRefs(llid,0,0,role); else if(!strcmp(type,"way")) AddRelationRefs(0,llid,0,role); else if(!strcmp(type,"relation")) AddRelationRefs(0,0,llid,role); } return(0); } /*++++++++++++++++++++++++++++++++++++++ Parse an OSM XML file (from JOSM or planet download). int ParseOSMFile Returns 0 if OK or something else in case of an error. int fd The file descriptor of the file to read from. NodesX *OSMNodes The data structure of nodes to fill in. WaysX *OSMWays The data structure of ways to fill in. RelationsX *OSMRelations The data structure of relations to fill in. ++++++++++++++++++++++++++++++++++++++*/ int ParseOSMFile(int fd,NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations) { int retval; /* Initialise the parser */ InitialiseParser(OSMNodes,OSMWays,OSMRelations); /* Parse the file */ nnodes=0,nways=0,nrelations=0; current_tags=NULL; retval=ParseXML(fd,xml_osm_toplevel_tags,XMLPARSE_UNKNOWN_ATTR_IGNORE); /* Cleanup the parser */ CleanupParser(); return(retval); } /*++++++++++++++++++++++++++++++++++++++ Parse an OSC XML file (from planet download). int ParseOSCFile Returns 0 if OK or something else in case of an error. int fd The file descriptor of the file to read from. NodesX *OSMNodes The data structure of nodes to fill in. WaysX *OSMWays The data structure of ways to fill in. RelationsX *OSMRelations The data structure of relations to fill in. ++++++++++++++++++++++++++++++++++++++*/ int ParseOSCFile(int fd,NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations) { int retval; /* Initialise the parser */ InitialiseParser(OSMNodes,OSMWays,OSMRelations); /* Parse the file */ nnodes=0,nways=0,nrelations=0; current_tags=NULL; retval=ParseXML(fd,xml_osc_toplevel_tags,XMLPARSE_UNKNOWN_ATTR_IGNORE); /* Cleanup the parser */ CleanupParser(); return(retval); } routino-3.4.3/src/segmentsx.c 644 233 144 62023 14433450037 11366 0/*************************************** Extended Segment data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019, 2022, 2023 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include "types.h" #include "segments.h" #include "ways.h" #include "typesx.h" #include "nodesx.h" #include "segmentsx.h" #include "waysx.h" #include "files.h" #include "logging.h" #include "sorting.h" /* Global variables */ /*+ The command line '--tmpdir' option or its default value. +*/ extern char *option_tmpdirname; /* Local variables */ /*+ Temporary file-local variables for use by the sort functions (re-initialised for each sort). +*/ static NodesX *sortnodesx; static SegmentsX *sortsegmentsx; static WaysX *sortwaysx; /* Local functions */ static int sort_by_id(SegmentX *a,SegmentX *b); static int deduplicate_by_node_ids(SegmentX *segmentx, index_t index); static int delete_pruned(SegmentX *segmentx,index_t index); static int deduplicate_super(SegmentX *segmentx,index_t index); static int geographically_index(SegmentX *segmentx,index_t index); static distance_t DistanceX(NodeX *nodex1,NodeX *nodex2); /*++++++++++++++++++++++++++++++++++++++ Allocate a new segment list (create a new file or open an existing one). SegmentsX *NewSegmentList Returns the segment list. ++++++++++++++++++++++++++++++++++++++*/ SegmentsX *NewSegmentList(void) { SegmentsX *segmentsx; segmentsx=(SegmentsX*)calloc_logassert(1,sizeof(SegmentsX)); segmentsx->filename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+40); /* allow %p to be up to 20 bytes */ sprintf(segmentsx->filename_tmp,"%s/segmentsx.%p.tmp",option_tmpdirname,(void*)segmentsx); segmentsx->fd=OpenFileBufferedNew(segmentsx->filename_tmp); #if SLIM segmentsx->cache=NewSegmentXCache(); log_malloc(segmentsx->cache,sizeof(*segmentsx->cache)); #endif return(segmentsx); } /*++++++++++++++++++++++++++++++++++++++ Free a segment list. SegmentsX *segmentsx The set of segments to be freed. ++++++++++++++++++++++++++++++++++++++*/ void FreeSegmentList(SegmentsX *segmentsx) { DeleteFile(segmentsx->filename_tmp); free(segmentsx->filename_tmp); if(segmentsx->usedway) { log_free(segmentsx->usedway); free(segmentsx->usedway); } if(segmentsx->firstnode) { log_free(segmentsx->firstnode); free(segmentsx->firstnode); } if(segmentsx->next1) { log_free(segmentsx->next1); free(segmentsx->next1); } #if SLIM log_free(segmentsx->cache); DeleteSegmentXCache(segmentsx->cache); #endif free(segmentsx); } /*++++++++++++++++++++++++++++++++++++++ Append a single segment to an unsorted segment list. SegmentsX *segmentsx The set of segments to modify. index_t way The index of the way that the segment belongs to. index_t node1 The index of the first node in the segment. index_t node2 The index of the second node in the segment. distance_t distance The distance between the nodes (or just the flags). ++++++++++++++++++++++++++++++++++++++*/ void AppendSegmentList(SegmentsX *segmentsx,index_t way,index_t node1,index_t node2,distance_t distance) { SegmentX segmentx; if(node1>node2) { index_t temp; temp=node1; node1=node2; node2=temp; if(distance&(ONEWAY_2TO1|ONEWAY_1TO2)) distance^=ONEWAY_2TO1|ONEWAY_1TO2; } segmentx.node1=node1; segmentx.node2=node2; segmentx.next2=NO_SEGMENT; segmentx.way=way; segmentx.distance=distance; WriteFileBuffered(segmentsx->fd,&segmentx,sizeof(SegmentX)); segmentsx->number++; logassert(segmentsx->numberfd!=-1) segmentsx->fd=CloseFileBuffered(segmentsx->fd); } /*++++++++++++++++++++++++++++++++++++++ Find the first extended segment with a particular starting node index. SegmentX *FirstSegmentX Returns a pointer to the first extended segment with the specified id. SegmentsX *segmentsx The set of segments to use. index_t nodeindex The node index to look for. int position A flag to pass through. ++++++++++++++++++++++++++++++++++++++*/ SegmentX *FirstSegmentX(SegmentsX *segmentsx,index_t nodeindex,int position) { index_t index=segmentsx->firstnode[nodeindex]; SegmentX *segmentx; if(index==NO_SEGMENT) return(NULL); segmentx=LookupSegmentX(segmentsx,index,position); return(segmentx); } /*++++++++++++++++++++++++++++++++++++++ Find the next segment with a particular starting node index. SegmentX *NextSegmentX Returns a pointer to the next segment with the same id. SegmentsX *segmentsx The set of segments to use. SegmentX *segmentx The current segment. index_t nodeindex The node index. ++++++++++++++++++++++++++++++++++++++*/ SegmentX *NextSegmentX(SegmentsX *segmentsx,SegmentX *segmentx,index_t nodeindex) { #if SLIM int position=1+(segmentx-&segmentsx->cached[0]); #endif if(segmentx->node1==nodeindex) { if(segmentsx->next1) { index_t index=IndexSegmentX(segmentsx,segmentx); if(segmentsx->next1[index]==NO_SEGMENT) return(NULL); segmentx=LookupSegmentX(segmentsx,segmentsx->next1[index],position); return(segmentx); } else { #if SLIM index_t index=IndexSegmentX(segmentsx,segmentx); index++; if(index>=segmentsx->number) return(NULL); segmentx=LookupSegmentX(segmentsx,index,position); #else segmentx++; if(IndexSegmentX(segmentsx,segmentx)>=segmentsx->number) return(NULL); #endif if(segmentx->node1!=nodeindex) return(NULL); return(segmentx); } } else { if(segmentx->next2==NO_SEGMENT) return(NULL); return(LookupSegmentX(segmentsx,segmentx->next2,position)); } } /*++++++++++++++++++++++++++++++++++++++ Sort the segment list. SegmentsX *segmentsx The set of segments to sort. NodesX *nodesx The set of nodes to use. WaysX *waysx The set of ways to use. ++++++++++++++++++++++++++++++++++++++*/ void SortSegmentList(SegmentsX *segmentsx,NodesX *nodesx,WaysX *waysx) { int fd; index_t xnumber; /* Print the start message */ printf_first("Sorting Segments"); /* Map into memory / open the file */ #if !SLIM nodesx->data=MapFile(nodesx->filename_tmp); #else nodesx->fd=SlimMapFile(nodesx->filename_tmp); InvalidateNodeXCache(nodesx->cache); #endif /* Map the index into memory */ nodesx->idata=MapFile(nodesx->ifilename_tmp); waysx->idata =MapFile(waysx->ifilename_tmp); /* Allocate the way usage bitmask */ segmentsx->usedway=AllocBitMask(waysx->number); log_malloc(segmentsx->usedway,SizeBitMask(waysx->number)); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(segmentsx->filename_tmp,&segmentsx->fd); /* Sort by node indexes */ xnumber=segmentsx->number; sortnodesx=nodesx; sortsegmentsx=segmentsx; sortwaysx=waysx; segmentsx->number=filesort_fixed(segmentsx->fd,fd,sizeof(SegmentX),NULL, (int (*)(const void*,const void*))sort_by_id, (int (*)(void*,index_t))deduplicate_by_node_ids); /* Close the files */ segmentsx->fd=CloseFileBuffered(segmentsx->fd); CloseFileBuffered(fd); /* Unmap the index from memory */ nodesx->idata=UnmapFile(nodesx->idata); waysx->idata =UnmapFile(waysx->idata); /* Unmap from memory / close the file */ #if !SLIM nodesx->data=UnmapFile(nodesx->data); #else nodesx->fd=SlimUnmapFile(nodesx->fd); #endif /* Print the final message */ printf_last("Sorted Segments: Segments=%"Pindex_t" Duplicates=%"Pindex_t,xnumber,xnumber-segmentsx->number); } /*++++++++++++++++++++++++++++++++++++++ Sort the segments into id order, first by node1 then by node2, finally by distance. int sort_by_id Returns the comparison of the node fields. SegmentX *a The first segment. SegmentX *b The second segment. ++++++++++++++++++++++++++++++++++++++*/ static int sort_by_id(SegmentX *a,SegmentX *b) { index_t a_id1=a->node1; index_t b_id1=b->node1; if(a_id1b_id1) return(1); else /* if(a_id1==b_id1) */ { index_t a_id2=a->node2; index_t b_id2=b->node2; if(a_id2b_id2) return(1); else { distance_t a_distance=DISTANCE(a->distance); distance_t b_distance=DISTANCE(b->distance); if(a_distanceb_distance) return(1); else { distance_t a_distflag=DISTFLAG(a->distance); distance_t b_distflag=DISTFLAG(b->distance); if(a_distflagb_distflag) return(1); else return(FILESORT_PRESERVE_ORDER(a,b)); /* preserve order */ } } } } /*++++++++++++++++++++++++++++++++++++++ Process segments (non-trivial duplicates). int deduplicate_by_node_ids Return 1 if the value is to be kept, otherwise 0. SegmentX *segmentx The segment to examine. index_t index The number of sorted segments that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int deduplicate_by_node_ids(SegmentX *segmentx, index_t index) { static index_t prevnode1=NO_NODE,prevnode2=NO_NODE; /* internal variable (reset by first call in each sort; index==0) */ static index_t prevway=NO_WAY; /* internal variable (reset by first call in each sort; index==0) */ static distance_t prevdist=0; /* internal variable (reset by first call in each sort; index==0) */ if(index==0) { prevnode1=NO_NODE; prevnode2=NO_NODE; prevway=NO_WAY; prevdist=0; } if(prevnode1==segmentx->node1 && prevnode2==segmentx->node2) { node_t id1=sortnodesx->idata[segmentx->node1]; node_t id2=sortnodesx->idata[segmentx->node2]; if(prevway==segmentx->way) { way_t id=sortwaysx->idata[segmentx->way]; logerror("Segment connecting nodes %"Pnode_t" and %"Pnode_t" in way %"Pway_t" is duplicated.\n",logerror_node(id1),logerror_node(id2),logerror_way(id)); } else { if(!(prevdist&SEGMENT_AREA) && !(segmentx->distance&SEGMENT_AREA)) logerror("Segment connecting nodes %"Pnode_t" and %"Pnode_t" is duplicated.\n",logerror_node(id1),logerror_node(id2)); if(!(prevdist&SEGMENT_AREA) && (segmentx->distance&SEGMENT_AREA)) logerror("Segment connecting nodes %"Pnode_t" and %"Pnode_t" is duplicated (discarded the area).\n",logerror_node(id1),logerror_node(id2)); if((prevdist&SEGMENT_AREA) && !(segmentx->distance&SEGMENT_AREA)) logerror("Segment connecting nodes %"Pnode_t" and %"Pnode_t" is duplicated (discarded the non-area).\n",logerror_node(id1),logerror_node(id2)); if((prevdist&SEGMENT_AREA) && (segmentx->distance&SEGMENT_AREA)) logerror("Segment connecting nodes %"Pnode_t" and %"Pnode_t" is duplicated (both are areas).\n",logerror_node(id1),logerror_node(id2)); } return(0); } else { NodeX *nodex1=LookupNodeX(sortnodesx,segmentx->node1,1); NodeX *nodex2=LookupNodeX(sortnodesx,segmentx->node2,2); prevnode1=segmentx->node1; prevnode2=segmentx->node2; prevway=segmentx->way; prevdist=DISTANCE(segmentx->distance); /* Mark the ways which are used */ SetBit(sortsegmentsx->usedway,segmentx->way); /* Set the distance but keep the other flags except for area */ segmentx->distance=DISTANCE(DistanceX(nodex1,nodex2))|DISTFLAG(segmentx->distance); segmentx->distance&=~SEGMENT_AREA; return(1); } } /*++++++++++++++++++++++++++++++++++++++ Index the segments by creating the firstnode index and filling in the segment next2 parameter. SegmentsX *segmentsx The set of segments to modify. NodesX *nodesx The set of nodes to use. WaysX *waysx The set of ways to use. ++++++++++++++++++++++++++++++++++++++*/ void IndexSegments(SegmentsX *segmentsx,NodesX *nodesx,WaysX *waysx) { index_t index,start=0,i; SegmentX *segmentx_list=NULL; #if SLIM index_t length=0; #endif if(segmentsx->number==0) return; /* Print the start message */ printf_first("Indexing Segments: Segments=0"); /* Allocate the array of indexes */ segmentsx->firstnode=(index_t*)malloc_logassert(nodesx->number*sizeof(index_t)); log_malloc(segmentsx->firstnode,nodesx->number*sizeof(index_t)); for(i=0;inumber;i++) segmentsx->firstnode[i]=NO_SEGMENT; /* Map into memory / open the files */ #if !SLIM segmentsx->data=MapFileWriteable(segmentsx->filename_tmp); #else segmentsx->fd=SlimMapFileWriteable(segmentsx->filename_tmp); segmentx_list=(SegmentX*)malloc_logassert(1024*sizeof(SegmentX)); #endif /* Read through the segments in reverse order (in chunks to help slim mode) */ for(index=segmentsx->number-1;index!=NO_SEGMENT;index--) { SegmentX *segmentx; if((index%1024)==1023 || index==(segmentsx->number-1)) { start=1024*(index/1024); #if !SLIM segmentx_list=LookupSegmentX(segmentsx,start,1); #else length=index-start+1; SlimFetch(segmentsx->fd,segmentx_list,length*sizeof(SegmentX),start*sizeof(SegmentX)); #endif } segmentx=segmentx_list+(index-start); if(nodesx->pdata) { segmentx->node1=nodesx->pdata[segmentx->node1]; segmentx->node2=nodesx->pdata[segmentx->node2]; } if(waysx->cdata) segmentx->way=waysx->cdata[segmentx->way]; segmentx->next2=segmentsx->firstnode[segmentx->node2]; segmentsx->firstnode[segmentx->node1]=index; segmentsx->firstnode[segmentx->node2]=index; if(!(index%10000)) printf_middle("Indexing Segments: Segments=%"Pindex_t,segmentsx->number-index); #if SLIM if(index==start) SlimReplace(segmentsx->fd,segmentx_list,length*sizeof(SegmentX),start*sizeof(SegmentX)); #endif } /* Unmap from memory / close the files */ #if !SLIM segmentsx->data=UnmapFile(segmentsx->data); #else segmentsx->fd=SlimUnmapFile(segmentsx->fd); free(segmentx_list); #endif /* Free the memory */ if(nodesx->pdata) { log_free(nodesx->pdata); free(nodesx->pdata); nodesx->pdata=NULL; } if(waysx->cdata) { log_free(waysx->cdata); free(waysx->cdata); waysx->cdata=NULL; } /* Print the final message */ printf_last("Indexed Segments: Segments=%"Pindex_t,segmentsx->number); } /*++++++++++++++++++++++++++++++++++++++ Prune the deleted segments while resorting the list. SegmentsX *segmentsx The set of segments to sort and modify. WaysX *waysx The set of ways to check. ++++++++++++++++++++++++++++++++++++++*/ void RemovePrunedSegments(SegmentsX *segmentsx,WaysX *waysx) { int fd; index_t xnumber; if(segmentsx->number==0) return; /* Print the start message */ printf_first("Sorting and Pruning Segments"); /* Allocate the way usage bitmask */ segmentsx->usedway=AllocBitMask(waysx->number); log_malloc(segmentsx->usedway,SizeBitMask(waysx->number)); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(segmentsx->filename_tmp,&segmentsx->fd); /* Sort by node indexes */ xnumber=segmentsx->number; sortsegmentsx=segmentsx; segmentsx->number=filesort_fixed(segmentsx->fd,fd,sizeof(SegmentX),(int (*)(void*,index_t))delete_pruned, (int (*)(const void*,const void*))sort_by_id, NULL); /* Close the files */ segmentsx->fd=CloseFileBuffered(segmentsx->fd); CloseFileBuffered(fd); /* Print the final message */ printf_last("Sorted and Pruned Segments: Segments=%"Pindex_t" Deleted=%"Pindex_t,xnumber,xnumber-segmentsx->number); } /*++++++++++++++++++++++++++++++++++++++ Delete the pruned segments. int delete_pruned Return 1 if the value is to be kept, otherwise 0. SegmentX *segmentx The extended segment. index_t index The number of unsorted segments that have been read from the input file. ++++++++++++++++++++++++++++++++++++++*/ static int delete_pruned(SegmentX *segmentx,index_t index) { if(IsPrunedSegmentX(segmentx)) return(0); SetBit(sortsegmentsx->usedway,segmentx->way); return(1); } /*++++++++++++++++++++++++++++++++++++++ Remove the duplicate super-segments. SegmentsX *segmentsx The set of super-segments to modify. WaysX *waysx The set of ways to use. ++++++++++++++++++++++++++++++++++++++*/ void DeduplicateSuperSegments(SegmentsX *segmentsx,WaysX *waysx) { int fd; index_t xnumber; if(waysx->number==0) return; /* Print the start message */ printf_first("Sorting and Deduplicating Super-Segments"); /* Map into memory / open the file */ #if !SLIM waysx->data=MapFile(waysx->filename_tmp); #else waysx->fd=SlimMapFile(waysx->filename_tmp); InvalidateWayXCache(waysx->cache); #endif /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(segmentsx->filename_tmp,&segmentsx->fd); /* Sort by node indexes */ xnumber=segmentsx->number; sortsegmentsx=segmentsx; sortwaysx=waysx; segmentsx->number=filesort_fixed(segmentsx->fd,fd,sizeof(SegmentX),NULL, (int (*)(const void*,const void*))sort_by_id, (int (*)(void*,index_t))deduplicate_super); /* Close the files */ segmentsx->fd=CloseFileBuffered(segmentsx->fd); CloseFileBuffered(fd); /* Unmap from memory / close the file */ #if !SLIM waysx->data=UnmapFile(waysx->data); #else waysx->fd=SlimUnmapFile(waysx->fd); #endif /* Print the final message */ printf_last("Sorted and Deduplicated Super-Segments: Super-Segments=%"Pindex_t" Duplicate=%"Pindex_t,xnumber,xnumber-segmentsx->number); } /*++++++++++++++++++++++++++++++++++++++ De-duplicate super-segments. int deduplicate_super Return 1 if the value is to be kept, otherwise 0. SegmentX *segmentx The extended super-segment. index_t index The number of sorted super-segments that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int deduplicate_super(SegmentX *segmentx,index_t index) { static int nprev; /* internal variable (reset by first call in each sort; index==0) */ static index_t prevnode1,prevnode2; /* internal variable (reset by first call in each sort; index==0) */ static SegmentX prevsegx[MAX_SEG_PER_NODE]; /* internal variable (reset by first call in each sort; index==0) */ static Way prevway[MAX_SEG_PER_NODE]; /* internal variable (reset by first call in each sort; index==0) */ WayX *wayx=LookupWayX(sortwaysx,segmentx->way,1); int isduplicate=0; if(index==0 || segmentx->node1!=prevnode1 || segmentx->node2!=prevnode2) { nprev=1; prevnode1=segmentx->node1; prevnode2=segmentx->node2; prevsegx[0]=*segmentx; prevway[0] =wayx->way; } else { int offset; for(offset=0;offsetdistance)==DISTFLAG(prevsegx[offset].distance)) if(!WaysCompare(&prevway[offset],&wayx->way)) { isduplicate=1; break; } } if(isduplicate) { nprev--; for(;offsetway; nprev++; } } return(!isduplicate); } /*++++++++++++++++++++++++++++++++++++++ Sort the segments geographically after updating the node indexes. SegmentsX *segmentsx The set of segments to modify. NodesX *nodesx The set of nodes to use. ++++++++++++++++++++++++++++++++++++++*/ void SortSegmentListGeographically(SegmentsX *segmentsx,NodesX *nodesx) { int fd; if(segmentsx->number==0) return; /* Print the start message */ printf_first("Sorting Segments Geographically"); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(segmentsx->filename_tmp,&segmentsx->fd); /* Update the segments with geographically sorted node indexes and sort them */ sortnodesx=nodesx; filesort_fixed(segmentsx->fd,fd,sizeof(SegmentX),(int (*)(void*,index_t))geographically_index, (int (*)(const void*,const void*))sort_by_id, NULL); /* Close the files */ segmentsx->fd=CloseFileBuffered(segmentsx->fd); CloseFileBuffered(fd); /* Print the final message */ printf_last("Sorted Segments Geographically: Segments=%"Pindex_t,segmentsx->number); } /*++++++++++++++++++++++++++++++++++++++ Update the segment indexes. int geographically_index Return 1 if the value is to be kept, otherwise 0. SegmentX *segmentx The extended segment. index_t index The number of unsorted segments that have been read from the input file. ++++++++++++++++++++++++++++++++++++++*/ static int geographically_index(SegmentX *segmentx,index_t index) { segmentx->node1=sortnodesx->gdata[segmentx->node1]; segmentx->node2=sortnodesx->gdata[segmentx->node2]; if(segmentx->node1>segmentx->node2) { index_t temp; temp=segmentx->node1; segmentx->node1=segmentx->node2; segmentx->node2=temp; if(segmentx->distance&(ONEWAY_2TO1|ONEWAY_1TO2)) segmentx->distance^=ONEWAY_2TO1|ONEWAY_1TO2; } return(1); } /*++++++++++++++++++++++++++++++++++++++ Save the segment list to a file. SegmentsX *segmentsx The set of segments to save. const char *filename The name of the file to save. ++++++++++++++++++++++++++++++++++++++*/ void SaveSegmentList(SegmentsX *segmentsx,const char *filename) { index_t i; int fd; SegmentsFile segmentsfile={0}; index_t super_number=0,normal_number=0; /* Print the start message */ printf_first("Writing Segments: Segments=0"); /* Re-open the file */ segmentsx->fd=ReOpenFileBuffered(segmentsx->filename_tmp); /* Write out the segments data */ fd=OpenFileBufferedNew(filename); SeekFileBuffered(fd,sizeof(SegmentsFile)); for(i=0;inumber;i++) { SegmentX segmentx; Segment segment={0}; ReadFileBuffered(segmentsx->fd,&segmentx,sizeof(SegmentX)); segment.node1 =segmentx.node1; segment.node2 =segmentx.node2; segment.next2 =segmentx.next2; segment.way =segmentx.way; segment.distance=segmentx.distance; if(IsSuperSegment(&segment)) super_number++; if(IsNormalSegment(&segment)) normal_number++; WriteFileBuffered(fd,&segment,sizeof(Segment)); if(!((i+1)%10000)) printf_middle("Writing Segments: Segments=%"Pindex_t,i+1); } /* Write out the header structure */ segmentsfile.number=segmentsx->number; segmentsfile.snumber=super_number; segmentsfile.nnumber=normal_number; SeekFileBuffered(fd,0); WriteFileBuffered(fd,&segmentsfile,sizeof(SegmentsFile)); CloseFileBuffered(fd); /* Close the file */ segmentsx->fd=CloseFileBuffered(segmentsx->fd); /* Print the final message */ printf_last("Wrote Segments: Segments=%"Pindex_t,segmentsx->number); } /*++++++++++++++++++++++++++++++++++++++ Calculate the distance between two nodes. distance_t DistanceX Returns the distance between the extended nodes. NodeX *nodex1 The starting node. NodeX *nodex2 The end node. ++++++++++++++++++++++++++++++++++++++*/ static distance_t DistanceX(NodeX *nodex1,NodeX *nodex2) { double dlon = latlong_to_radians(nodex1->longitude) - latlong_to_radians(nodex2->longitude); double dlat = latlong_to_radians(nodex1->latitude) - latlong_to_radians(nodex2->latitude); double lat1 = latlong_to_radians(nodex1->latitude); double lat2 = latlong_to_radians(nodex2->latitude); double a1,a2,a,sa,c,d; if(dlon==0 && dlat==0) return 0; a1 = sin (dlat / 2); a2 = sin (dlon / 2); a = a1 * a1 + cos (lat1) * cos (lat2) * a2 * a2; sa = sqrt (a); if (sa <= 1.0) {c = 2 * asin (sa);} else {c = 2 * asin (1.0);} d = 6378.137 * c; return km_to_distance(d); } routino-3.4.3/src/nodes.h 644 233 144 12404 12550223461 10461 0/*************************************** A header file for the nodes. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef NODES_H #define NODES_H /*+ To stop multiple inclusions. +*/ #include #include #include "types.h" #include "cache.h" #include "files.h" #include "profiles.h" /* Data structures */ /*+ A structure containing a single node. +*/ struct _Node { index_t firstseg; /*+ The index of the first segment. +*/ ll_off_t latoffset; /*+ The node latitude offset within its bin. +*/ ll_off_t lonoffset; /*+ The node longitude offset within its bin. +*/ transports_t allow; /*+ The types of transport that are allowed through the node. +*/ nodeflags_t flags; /*+ Flags containing extra information (e.g. super-node, turn restriction). +*/ }; /*+ A structure containing the header from the file. +*/ typedef struct _NodesFile { index_t number; /*+ The number of nodes in total. +*/ index_t snumber; /*+ The number of super-nodes. +*/ ll_bin_t latbins; /*+ The number of bins containing latitude. +*/ ll_bin_t lonbins; /*+ The number of bins containing longitude. +*/ ll_bin_t latzero; /*+ The bin number of the furthest south bin. +*/ ll_bin_t lonzero; /*+ The bin number of the furthest west bin. +*/ } NodesFile; /*+ A structure containing a set of nodes. +*/ struct _Nodes { NodesFile file; /*+ The header data from the file. +*/ #if !SLIM char *data; /*+ The memory mapped data in the file. +*/ index_t *offsets; /*+ A pointer to the array of offsets in the file. +*/ Node *nodes; /*+ A pointer to the array of nodes in the file. +*/ #else int fd; /*+ The file descriptor for the file. +*/ index_t *offsets; /*+ An allocated array with a copy of the file offsets. +*/ offset_t nodesoffset; /*+ The offset of the nodes within the file. +*/ Node cached[6]; /*+ Some cached nodes read from the file in slim mode. +*/ NodeCache *cache; /*+ A RAM cache of nodes read from the file. +*/ #endif }; /* Functions in nodes.c */ Nodes *LoadNodeList(const char *filename); void DestroyNodeList(Nodes *nodes); index_t FindClosestNode(Nodes *nodes,Segments *segments,Ways *ways,double latitude,double longitude, distance_t distance,Profile *profile,distance_t *bestdist); index_t FindClosestSegment(Nodes *nodes,Segments *segments,Ways *ways,double latitude,double longitude, distance_t distance,Profile *profile, distance_t *bestdist, index_t *bestnode1,index_t *bestnode2,distance_t *bestdist1,distance_t *bestdist2); void GetLatLong(Nodes *nodes,index_t index,Node *nodep,double *latitude,double *longitude); /* Macros and inline functions */ /*+ Return true if this is a super-node. +*/ #define IsSuperNode(xxx) (((xxx)->flags)&NODE_SUPER) /*+ Return true if this is a turn restricted node. +*/ #define IsTurnRestrictedNode(xxx) (((xxx)->flags)&NODE_TURNRSTRCT) /*+ Return a Segment index given a Node pointer and a set of segments. +*/ #define FirstSegment(xxx,yyy,ppp) LookupSegment((xxx),(yyy)->firstseg,ppp) /*+ Return the offset of a geographical region given a set of nodes. +*/ #define LookupNodeOffset(xxx,yyy) ((xxx)->offsets[yyy]) #if !SLIM /*+ Return a Node pointer given a set of nodes and an index. +*/ #define LookupNode(xxx,yyy,ppp) (&(xxx)->nodes[yyy]) #else /* Prototypes */ static inline Node *LookupNode(Nodes *nodes,index_t index,int position); CACHE_NEWCACHE_PROTO(Node) CACHE_DELETECACHE_PROTO(Node) CACHE_FETCHCACHE_PROTO(Node) CACHE_INVALIDATECACHE_PROTO(Node) /* Data type */ CACHE_STRUCTURE(Node) /* Inline functions */ CACHE_NEWCACHE(Node) CACHE_DELETECACHE(Node) CACHE_FETCHCACHE(Node) CACHE_INVALIDATECACHE(Node) /*++++++++++++++++++++++++++++++++++++++ Find the Node information for a particular node. Node *LookupNode Returns a pointer to the cached node information. Nodes *nodes The set of nodes to use. index_t index The index of the node. int position The position in the cache to store the value. ++++++++++++++++++++++++++++++++++++++*/ static inline Node *LookupNode(Nodes *nodes,index_t index,int position) { nodes->cached[position-1]=*FetchCachedNode(nodes->cache,index,nodes->fd,nodes->nodesoffset); return(&nodes->cached[position-1]); } #endif #endif /* NODES_H */ routino-3.4.3/src/errorlogx.c 644 233 144 64161 14166353501 11402 0/*************************************** Error log processing functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2013-2015, 2019, 2022 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include "typesx.h" #include "nodesx.h" #include "waysx.h" #include "relationsx.h" #include "errorlogx.h" #include "errorlog.h" #include "files.h" #include "sorting.h" /* Global variables */ /*+ The name of the error log file. +*/ extern char *errorlogfilename; /*+ The name of the binary error log file. +*/ extern char *errorbinfilename; /* Local variables */ /*+ Temporary file-local variables for use by the sort functions (re-initialised for each sort). +*/ static latlong_t lat_min,lat_max,lon_min,lon_max; /* Local functions */ static void reindex_nodes(NodesX *nodesx); static void reindex_ways(WaysX *waysx); static void reindex_relations(RelationsX *relationsx); static int lookup_lat_long_node(NodesX *nodesx,node_t node,latlong_t *latitude,latlong_t *longitude); static int lookup_lat_long_way(WaysX *waysx,NodesX *nodesx,way_t way,latlong_t *latitude,latlong_t *longitude,index_t error); static int lookup_lat_long_relation(RelationsX *relationsx,WaysX *waysx,NodesX *nodesx,relation_t relation,latlong_t *latitude,latlong_t *longitude,index_t error); static int sort_by_lat_long(ErrorLogX *a,ErrorLogX *b); static int measure_lat_long(ErrorLogX *errorlogx,index_t index); /*++++++++++++++++++++++++++++++++++++++ Allocate a new error log list (create a new file). ErrorLogsX *NewErrorLogList Returns a pointer to the error log list. ++++++++++++++++++++++++++++++++++++++*/ ErrorLogsX *NewErrorLogList(void) { ErrorLogsX *errorlogsx; errorlogsx=(ErrorLogsX*)calloc_logassert(1,sizeof(ErrorLogsX)); return(errorlogsx); } /*++++++++++++++++++++++++++++++++++++++ Free an error log list. ErrorLogsX *errorlogsx The set of error logs to be freed. ++++++++++++++++++++++++++++++++++++++*/ void FreeErrorLogList(ErrorLogsX *errorlogsx) { free(errorlogsx); } /*++++++++++++++++++++++++++++++++++++++ Process the binary error log. ErrorLogsX *errorlogsx The set of error logs to update. NodesX *nodesx The set of nodes. WaysX *waysx The set of ways. RelationsX *relationsx The set of relations. ++++++++++++++++++++++++++++++++++++++*/ void ProcessErrorLogs(ErrorLogsX *errorlogsx,NodesX *nodesx,WaysX *waysx,RelationsX *relationsx) { int oldfd,newfd; uint32_t offset=0; int nerrorlogobjects=0; int finished; ErrorLogObject errorlogobjects[8]; /* Re-index the nodes, ways and relations */ printf_first("Re-indexing the Data: Nodes=0 Ways=0 Route-Relations=0 Turn-Relations=0"); reindex_nodes(nodesx); printf_middle("Re-indexing the Data: Nodes=%"Pindex_t" Ways=0 Route-Relations=0 Turn-Relations=0",nodesx->number); reindex_ways(waysx); printf_middle("Re-indexing the Data: Nodes=%"Pindex_t" Ways=%"Pindex_t" Route-Relations=0 Turn-Relations=0",nodesx->number,waysx->number); reindex_relations(relationsx); printf_last("Re-indexed the Data: Nodes=%"Pindex_t" Ways=%"Pindex_t" Route-Relations=%"Pindex_t" Turn-Relations=%"Pindex_t,nodesx->number,waysx->number,relationsx->rrnumber,relationsx->trnumber); /* Print the start message */ printf_first("Calculating Coordinates: Errors=0"); /* Map into memory / open the files */ #if !SLIM nodesx->data=MapFile(nodesx->filename); #else nodesx->fd=SlimMapFile(nodesx->filename); InvalidateNodeXCache(nodesx->cache); #endif waysx->fd=ReOpenFileBuffered(waysx->filename); relationsx->rrfd=ReOpenFileBuffered(relationsx->rrfilename); relationsx->trfd=ReOpenFileBuffered(relationsx->trfilename); /* Map the index into memory */ nodesx->idata=MapFile(nodesx->ifilename_tmp); waysx->idata=MapFile(waysx->ifilename_tmp); waysx->odata=MapFile(waysx->ofilename_tmp); if(relationsx->rrnumber) { relationsx->rridata=MapFile(relationsx->rrifilename_tmp); relationsx->rrodata=MapFile(relationsx->rrofilename_tmp); } if(relationsx->trnumber) relationsx->tridata=MapFile(relationsx->trifilename_tmp); /* Open the binary log file read-only and a new file writeable */ newfd=ReplaceFileBuffered(errorbinfilename,&oldfd); /* Loop through the file and merge the raw data into coordinates */ errorlogsx->number=0; do { ErrorLogObject errorlogobject; finished=ReadFileBuffered(oldfd,&errorlogobject,sizeof(ErrorLogObject)); if(finished) errorlogobject.offset=SizeFile(errorlogfilename); if(offset!=errorlogobject.offset) { ErrorLogX errorlogx; latlong_t errorlat=NO_LATLONG,errorlon=NO_LATLONG; /* Calculate suitable coordinates */ if(nerrorlogobjects==1) { if(errorlogobjects[0].type=='N') { node_t node=(node_t)errorlogobjects[0].id; lookup_lat_long_node(nodesx,node,&errorlat,&errorlon); } else if(errorlogobjects[0].type=='W') { way_t way=(way_t)errorlogobjects[0].id; lookup_lat_long_way(waysx,nodesx,way,&errorlat,&errorlon,errorlogsx->number); } else if(errorlogobjects[0].type=='R') { relation_t relation=(relation_t)errorlogobjects[0].type; lookup_lat_long_relation(relationsx,waysx,nodesx,relation,&errorlat,&errorlon,errorlogsx->number); } } else { latlong_t latitude[8],longitude[8]; int i; int ncoords=0,nnodes=0,nways=0,nrelations=0; for(i=0;inumber)) ncoords++; } } if(nrelations==0) /* only nodes and/or ways */ ; else if(ncoords) /* some good nodes and/or ways, possibly relations */ ; else /* if(nrelations) */ { for(i=0;inumber)) ncoords++; } } if(ncoords) { errorlat=0; errorlon=0; for(i=0;inumber++; offset=errorlogobject.offset; nerrorlogobjects=0; if(!(errorlogsx->number%10000)) printf_middle("Calculating Coordinates: Errors=%"Pindex_t,errorlogsx->number); } /* Store for later */ logassert(nerrorlogobjects<8,"Too many error log objects for one error message."); /* Only a limited amount of information stored. */ errorlogobjects[nerrorlogobjects]=errorlogobject; nerrorlogobjects++; } while(!finished); /* Unmap from memory / close the files */ #if !SLIM nodesx->data=UnmapFile(nodesx->data); #else nodesx->fd=SlimUnmapFile(nodesx->fd); #endif waysx->fd=CloseFileBuffered(waysx->fd); relationsx->rrfd=CloseFileBuffered(relationsx->rrfd); relationsx->trfd=CloseFileBuffered(relationsx->trfd); CloseFileBuffered(oldfd); CloseFileBuffered(newfd); /* Unmap the index from memory */ nodesx->idata=UnmapFile(nodesx->idata); waysx->idata=UnmapFile(waysx->idata); waysx->odata=UnmapFile(waysx->odata); if(relationsx->rrnumber) { relationsx->rridata=UnmapFile(relationsx->rridata); relationsx->rrodata=UnmapFile(relationsx->rrodata); } if(relationsx->trnumber) relationsx->tridata=UnmapFile(relationsx->tridata); /* Print the final message */ printf_last("Calculated Coordinates: Errors=%"Pindex_t,errorlogsx->number); } /*++++++++++++++++++++++++++++++++++++++ Re-index the nodes that were kept. NodesX *nodesx The set of nodes to process (contains the filename and number of nodes). ++++++++++++++++++++++++++++++++++++++*/ static void reindex_nodes(NodesX *nodesx) { int fd; NodeX nodex; nodesx->number=nodesx->knumber; /* Open a file for the index */ nodesx->ifd=OpenFileBufferedNew(nodesx->ifilename_tmp); /* Get the node id for each node in the file. */ fd=ReOpenFileBuffered(nodesx->filename); while(!ReadFileBuffered(fd,&nodex,sizeof(NodeX))) WriteFileBuffered(nodesx->ifd,&nodex.id,sizeof(node_t)); /* Close the files */ CloseFileBuffered(fd); nodesx->ifd=CloseFileBuffered(nodesx->ifd); } /*++++++++++++++++++++++++++++++++++++++ Re-index the ways that were kept. WaysX *waysx The set of ways to process (contains the filename and number of ways). ++++++++++++++++++++++++++++++++++++++*/ static void reindex_ways(WaysX *waysx) { FILESORT_VARINT waysize; int fd; offset_t offset=FILESORT_VARSIZE+sizeof(WayX); waysx->number=waysx->knumber; /* Open files for the indexes */ waysx->ifd=OpenFileBufferedNew(waysx->ifilename_tmp); waysx->ofd=OpenFileBufferedNew(waysx->ofilename_tmp); /* Get the way id and the offset for each way in the file */ fd=ReOpenFileBuffered(waysx->filename); while(!ReadFileBuffered(fd,&waysize,FILESORT_VARSIZE)) { WayX wayx; ReadFileBuffered(fd,&wayx,sizeof(WayX)); WriteFileBuffered(waysx->ifd,&wayx.id,sizeof(way_t)); WriteFileBuffered(waysx->ofd,&offset,sizeof(offset_t)); SkipFileBuffered(fd,waysize-sizeof(WayX)); offset+=waysize+FILESORT_VARSIZE; } /* Close the files */ CloseFileBuffered(fd); waysx->ifd=CloseFileBuffered(waysx->ifd); waysx->ofd=CloseFileBuffered(waysx->ofd); } /*++++++++++++++++++++++++++++++++++++++ Re-index the relations that were kept. RelationsX *relationsx The set of relations to process (contains the filenames and numbers of relations). ++++++++++++++++++++++++++++++++++++++*/ static void reindex_relations(RelationsX *relationsx) { FILESORT_VARINT relationsize; int fd; offset_t offset=FILESORT_VARSIZE+sizeof(RouteRelX); TurnRelX turnrelx; /* Route relations */ relationsx->rrnumber=relationsx->rrknumber; /* Open files for the indexes */ relationsx->rrifd=OpenFileBufferedNew(relationsx->rrifilename_tmp); relationsx->rrofd=OpenFileBufferedNew(relationsx->rrofilename_tmp); /* Get the relation id and the offset for each relation in the file */ fd=ReOpenFileBuffered(relationsx->rrfilename); while(!ReadFileBuffered(fd,&relationsize,FILESORT_VARSIZE)) { RouteRelX routerelx; ReadFileBuffered(fd,&routerelx,sizeof(RouteRelX)); WriteFileBuffered(relationsx->rrifd,&routerelx.id,sizeof(relation_t)); WriteFileBuffered(relationsx->rrofd,&offset,sizeof(offset_t)); SkipFileBuffered(fd,relationsize-sizeof(RouteRelX)); offset+=relationsize+FILESORT_VARSIZE; } /* Close the files */ CloseFileBuffered(fd); relationsx->rrifd=CloseFileBuffered(relationsx->rrifd); relationsx->rrofd=CloseFileBuffered(relationsx->rrofd); /* Turn relations */ relationsx->trnumber=relationsx->trknumber; /* Open files for the indexes */ relationsx->trifd=OpenFileBufferedNew(relationsx->trifilename_tmp); /* Get the relation id for each relation in the file */ fd=ReOpenFileBuffered(relationsx->trfilename); while(!ReadFileBuffered(fd,&turnrelx,sizeof(TurnRelX))) WriteFileBuffered(relationsx->trifd,&turnrelx.id,sizeof(relation_t)); /* Close the files */ CloseFileBuffered(fd); relationsx->trifd=CloseFileBuffered(relationsx->trifd); } /*++++++++++++++++++++++++++++++++++++++ Lookup a node's latitude and longitude. int lookup_lat_long_node Returns 1 if a node was found. NodesX *nodesx The set of nodes to use. node_t node The node number. latlong_t *latitude Returns the latitude. latlong_t *longitude Returns the longitude. ++++++++++++++++++++++++++++++++++++++*/ static int lookup_lat_long_node(NodesX *nodesx,node_t node,latlong_t *latitude,latlong_t *longitude) { index_t index=IndexNodeX(nodesx,node); if(index==NO_NODE) return 0; else { NodeX *nodex=LookupNodeX(nodesx,index,1); *latitude =nodex->latitude; *longitude=nodex->longitude; return 1; } } /*++++++++++++++++++++++++++++++++++++++ Lookup a way's latitude and longitude. int lookup_lat_long_way Returns 1 if a way was found. WaysX *waysx The set of ways to use. NodesX *nodesx The set of nodes to use. way_t way The way number. latlong_t *latitude Returns the latitude. latlong_t *longitude Returns the longitude. index_t error The index of the error in the complete set of errors. ++++++++++++++++++++++++++++++++++++++*/ static int lookup_lat_long_way(WaysX *waysx,NodesX *nodesx,way_t way,latlong_t *latitude,latlong_t *longitude,index_t error) { index_t index=IndexWayX(waysx,way); if(index==NO_WAY) return 0; else { int count=1; offset_t offset=waysx->odata[index]; node_t node1,node2,prevnode,node; latlong_t latitude1,longitude1,latitude2,longitude2; SeekFileBuffered(waysx->fd,offset); /* Choose a random pair of adjacent nodes */ if(ReadFileBuffered(waysx->fd,&node1,sizeof(node_t)) || node1==NO_NODE_ID) return 0; if(ReadFileBuffered(waysx->fd,&node2,sizeof(node_t)) || node2==NO_NODE_ID) return lookup_lat_long_node(nodesx,node1,latitude,longitude); prevnode=node2; while(!ReadFileBuffered(waysx->fd,&node,sizeof(node_t)) && node!=NO_NODE_ID) { count++; if((error%count)==0) /* A 1/count chance */ { node1=prevnode; node2=node; } prevnode=node; } if(!lookup_lat_long_node(nodesx,node1,&latitude1,&longitude1)) return lookup_lat_long_node(nodesx,node2,latitude,longitude); if(!lookup_lat_long_node(nodesx,node2,&latitude2,&longitude2)) return lookup_lat_long_node(nodesx,node1,latitude,longitude); *latitude =(latitude1 +latitude2 )/2; *longitude=(longitude1+longitude2)/2; return 1; } } /*++++++++++++++++++++++++++++++++++++++ Lookup a relation's latitude and longitude. int lookup_lat_long_relation Returns 1 if a relation was found. RelationsX *relationsx The set of relations to use. WaysX *waysx The set of ways to use. NodesX *nodesx The set of nodes to use. relation_t relation The relation number. latlong_t *latitude Returns the latitude. latlong_t *longitude Returns the longitude. index_t error The index of the error in the complete set of errors. ++++++++++++++++++++++++++++++++++++++*/ static int lookup_lat_long_relation(RelationsX *relationsx,WaysX *waysx,NodesX *nodesx,relation_t relation,latlong_t *latitude,latlong_t *longitude,index_t error) { int iteration; index_t index; /* Is it a turn relation? */ index=IndexTurnRelX(relationsx,relation); if(index==NO_RELATION) return 0; else { TurnRelX turnrelx; SeekFileBuffered(relationsx->trfd,index*sizeof(TurnRelX)); ReadFileBuffered(relationsx->trfd,&turnrelx,sizeof(TurnRelX)); if(lookup_lat_long_node(nodesx,turnrelx.via,latitude,longitude)) return 1; if(lookup_lat_long_way(waysx,nodesx,turnrelx.from,latitude,longitude,error)) return 1; if(lookup_lat_long_way(waysx,nodesx,turnrelx.to,latitude,longitude,error)) return 1; return 0; } /* Is it a route relation? */ for(iteration=0;iteration<8;iteration++) { index=IndexRouteRelX(relationsx,relation); if(index==NO_RELATION) return 0; else { int count; offset_t offset=relationsx->rrodata[index]; node_t node=NO_NODE_ID,tempnode; way_t way=NO_WAY_ID,tempway; relation_t temprelation; SeekFileBuffered(relationsx->rrfd,offset); /* Choose a random node */ count=0; while(!ReadFileBuffered(relationsx->rrfd,&tempnode,sizeof(node_t)) && tempnode!=NO_NODE_ID) { count++; if((error%count)==0) /* A 1/count chance */ node=tempnode; } if(count && lookup_lat_long_node(nodesx,node,latitude,longitude)) return 1; /* Choose a random way */ count=0; while(!ReadFileBuffered(relationsx->rrfd,&tempway,sizeof(way_t)) && tempway!=NO_WAY_ID) { count++; if((error%count)==0) /* A 1/count chance */ way=tempway; } if(count && lookup_lat_long_way(waysx,nodesx,way,latitude,longitude,error)) return 1; /* Choose a random relation */ count=0; while(!ReadFileBuffered(relationsx->rrfd,&temprelation,sizeof(relation_t)) && temprelation!=NO_RELATION_ID) { count++; if((error%count)==0) /* A 1/count chance */ relation=temprelation; } if(!count) return 0; } } return 0; } /*++++++++++++++++++++++++++++++++++++++ Sort the error logs geographically. ErrorLogsX *errorlogsx The set of error logs to sort. ++++++++++++++++++++++++++++++++++++++*/ void SortErrorLogsGeographically(ErrorLogsX *errorlogsx) { int oldfd,newfd; ll_bin_t lat_min_bin,lat_max_bin,lon_min_bin,lon_max_bin; /* Print the start message */ printf_first("Sorting Errors Geographically"); /* Work out the range of data */ lat_min=radians_to_latlong( 2); lat_max=radians_to_latlong(-2); lon_min=radians_to_latlong( 4); lon_max=radians_to_latlong(-4); /* Re-open the file read-only and a new file writeable */ newfd=ReplaceFileBuffered(errorbinfilename,&oldfd); /* Sort errors geographically */ filesort_fixed(oldfd,newfd,sizeof(ErrorLogX),NULL, (int (*)(const void*,const void*))sort_by_lat_long, (int (*)(void*,index_t))measure_lat_long); /* Close the files */ CloseFileBuffered(oldfd); CloseFileBuffered(newfd); /* Work out the number of bins */ lat_min_bin=latlong_to_bin(lat_min); lon_min_bin=latlong_to_bin(lon_min); lat_max_bin=latlong_to_bin(lat_max); lon_max_bin=latlong_to_bin(lon_max); errorlogsx->latzero=lat_min_bin; errorlogsx->lonzero=lon_min_bin; errorlogsx->latbins=(lat_max_bin-lat_min_bin)+1; errorlogsx->lonbins=(lon_max_bin-lon_min_bin)+1; /* Print the final message */ printf_last("Sorted Errors Geographically: Errors=%"Pindex_t,errorlogsx->number); } /*++++++++++++++++++++++++++++++++++++++ Sort the errors into latitude and longitude order (first by longitude bin number, then by latitude bin number and then by exact longitude and then by exact latitude). int sort_by_lat_long Returns the comparison of the latitude and longitude fields. ErrorLogX *a The first error location. ErrorLogX *b The second error location. ++++++++++++++++++++++++++++++++++++++*/ static int sort_by_lat_long(ErrorLogX *a,ErrorLogX *b) { ll_bin_t a_lon=latlong_to_bin(a->longitude); ll_bin_t b_lon=latlong_to_bin(b->longitude); if(a_lonb_lon) return(1); else { ll_bin_t a_lat=latlong_to_bin(a->latitude); ll_bin_t b_lat=latlong_to_bin(b->latitude); if(a_latb_lat) return(1); else { if(a->longitudelongitude) return(-1); else if(a->longitude>b->longitude) return(1); else { if(a->latitudelatitude) return(-1); else if(a->latitude>b->latitude) return(1); } return(FILESORT_PRESERVE_ORDER(a,b)); } } } /*++++++++++++++++++++++++++++++++++++++ Measure the extent of the data. int measure_lat_long Return 1 if the value is to be kept, otherwise 0. ErrorLogX *errorlogx The error location. index_t index The number of sorted error locations that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int measure_lat_long(ErrorLogX *errorlogx,index_t index) { if(errorlogx->latitude!=NO_LATLONG) { if(errorlogx->latitudelatitude; if(errorlogx->latitude>lat_max) lat_max=errorlogx->latitude; if(errorlogx->longitudelongitude; if(errorlogx->longitude>lon_max) lon_max=errorlogx->longitude; } return(1); } /*++++++++++++++++++++++++++++++++++++++ Save the binary error log. ErrorLogsX *errorlogsx The set of error logs to write. char *filename The name of the final file to write. ++++++++++++++++++++++++++++++++++++++*/ void SaveErrorLogs(ErrorLogsX *errorlogsx,char *filename) { ErrorLogsFile errorlogsfile; ErrorLogX errorlogx; int oldfd,newfd; ll_bin2_t latlonbin=0,maxlatlonbins; index_t *offsets; index_t number=0,number_geo=0,number_nongeo=0; offset_t size; /* Print the start message */ printf_first("Writing Errors: Geographical=0 Non-geographical=0"); /* Allocate the memory for the geographical offsets array */ offsets=(index_t*)malloc_logassert((errorlogsx->latbins*errorlogsx->lonbins+1)*sizeof(index_t)); latlonbin=0; /* Re-open the file */ oldfd=ReOpenFileBuffered(errorbinfilename); newfd=OpenFileBufferedNew(filename); /* Write out the geographical errors */ SeekFileBuffered(newfd,sizeof(ErrorLogsFile)+(errorlogsx->latbins*errorlogsx->lonbins+1)*sizeof(index_t)); while(!ReadFileBuffered(oldfd,&errorlogx,sizeof(ErrorLogX))) { ErrorLog errorlog={0}; ll_bin_t latbin,lonbin; ll_bin2_t llbin; if(errorlogx.latitude==NO_LATLONG) continue; /* Create the ErrorLog */ errorlog.latoffset=latlong_to_off(errorlogx.latitude); errorlog.lonoffset=latlong_to_off(errorlogx.longitude); errorlog.offset=errorlogx.offset; errorlog.length=errorlogx.length; /* Work out the offsets */ latbin=latlong_to_bin(errorlogx.latitude )-errorlogsx->latzero; lonbin=latlong_to_bin(errorlogx.longitude)-errorlogsx->lonzero; llbin=lonbin*errorlogsx->latbins+latbin; for(;latlonbin<=llbin;latlonbin++) offsets[latlonbin]=number_geo; /* Write the data */ WriteFileBuffered(newfd,&errorlog,sizeof(ErrorLog)); number_geo++; number++; if(!(number%10000)) printf_middle("Writing Errors: Geographical=%"Pindex_t" Non-geographical=%"Pindex_t,number_geo,number_nongeo); } /* Write out the non-geographical errors */ SeekFileBuffered(oldfd,0); while(!ReadFileBuffered(oldfd,&errorlogx,sizeof(ErrorLogX))) { ErrorLog errorlog={0}; if(errorlogx.latitude!=NO_LATLONG) continue; /* Create the ErrorLog */ errorlog.latoffset=0; errorlog.lonoffset=0; errorlog.offset=errorlogx.offset; errorlog.length=errorlogx.length; /* Write the data */ WriteFileBuffered(newfd,&errorlog,sizeof(ErrorLog)); number_nongeo++; number++; if(!(number%10000)) printf_middle("Writing Errors: Geographical=%"Pindex_t" Non-geographical=%"Pindex_t,number_geo,number_nongeo); } /* Close the input file */ CloseFileBuffered(oldfd); DeleteFile(errorbinfilename); /* Append the text from the log file */ size=SizeFile(errorlogfilename); oldfd=ReOpenFileBuffered(errorlogfilename); while(size) { int i; char buffer[4096]; offset_t chunksize=(size>(offset_t)sizeof(buffer)?(offset_t)sizeof(buffer):size); ReadFileBuffered(oldfd,buffer,chunksize); for(i=0;ilatbins*errorlogsx->lonbins; for(;latlonbin<=maxlatlonbins;latlonbin++) offsets[latlonbin]=number_geo; SeekFileBuffered(newfd,sizeof(ErrorLogsFile)); WriteFileBuffered(newfd,offsets,(errorlogsx->latbins*errorlogsx->lonbins+1)*sizeof(index_t)); free(offsets); /* Write out the header structure */ errorlogsfile.number =number; errorlogsfile.number_geo =number_geo; errorlogsfile.number_nongeo=number_nongeo; errorlogsfile.latbins=errorlogsx->latbins; errorlogsfile.lonbins=errorlogsx->lonbins; errorlogsfile.latzero=errorlogsx->latzero; errorlogsfile.lonzero=errorlogsx->lonzero; SeekFileBuffered(newfd,0); WriteFileBuffered(newfd,&errorlogsfile,sizeof(ErrorLogsFile)); CloseFileBuffered(newfd); /* Print the final message */ printf_last("Wrote Errors: Geographical=%"Pindex_t" Non-geographical=%"Pindex_t,number_geo,number_nongeo); } routino-3.4.3/src/xml/ 40755 233 144 0 15003125373 7742 5routino-3.4.3/src/xml/xsd-to-xmlparser.c 644 233 144 40631 14774246747 13426 0/*************************************** $Header: /home/amb/CVS/routino/src/xml/xsd-to-xmlparser.c,v 1.10 2010-04-23 18:41:20 amb Exp $ An XML parser for simplified XML Schema Definitions to create XML parser skeletons. Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2015, 2019, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #if !defined(_MSC_VER) #include #endif #include #include #include #include "xmlparse.h" /*+ A forward definition of the xmltagx +*/ typedef struct _xmltagx xmltagx; /*+ A structure to hold the extended definition of a tag. +*/ struct _xmltagx { char *name; /*+ The name of the tag. +*/ char *type; /*+ The type of the tag. +*/ int nattributes; /*+ The number of valid attributes for the tag. +*/ char *attributes[XMLPARSE_MAX_ATTRS]; /*+ The valid attributes for the tag. +*/ int nsubtagsx; /*+ The number of valid attributes for the tag. +*/ xmltagx *subtagsx[XMLPARSE_MAX_SUBTAGS]; /*+ The list of types for the subtags contained within this one. +*/ }; /* The local variables and functions */ int ntagsx=0; xmltagx **tagsx=NULL; char *currenttype=NULL; static char *safe(const char *name); /* The XML tag processing function prototypes */ static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding); static int schemaType_function(const char *_tag_,int _type_,const char *elementFormDefault,const char *xmlns_xsd); static int elementType_function(const char *_tag_,int _type_,const char *name,const char *type,const char *minOccurs,const char *maxOccurs); static int complexType_function(const char *_tag_,int _type_,const char *name); static int sequenceType_function(const char *_tag_,int _type_); static int attributeType_function(const char *_tag_,int _type_,const char *name,const char *type); /* The XML tag definitions (forward declarations) */ static const xmltag xmlDeclaration_tag; static const xmltag schemaType_tag; static const xmltag elementType_tag; static const xmltag complexType_tag; static const xmltag sequenceType_tag; static const xmltag attributeType_tag; /* The XML tag definition values */ /*+ The complete set of tags at the top level. +*/ static const xmltag * const xml_toplevel_tags[]={&xmlDeclaration_tag,&schemaType_tag,NULL}; /*+ The xmlDeclaration type tag. +*/ static const xmltag xmlDeclaration_tag= {"xml", 2, {"version","encoding"}, xmlDeclaration_function, {NULL}}; /*+ The schemaType type tag. +*/ static const xmltag schemaType_tag= {"xsd:schema", 2, {"elementFormDefault","xmlns:xsd"}, schemaType_function, {&elementType_tag,&complexType_tag,NULL}}; /*+ The elementType type tag. +*/ static const xmltag elementType_tag= {"xsd:element", 4, {"name","type","minOccurs","maxOccurs"}, elementType_function, {NULL}}; /*+ The complexType type tag. +*/ static const xmltag complexType_tag= {"xsd:complexType", 1, {"name"}, complexType_function, {&sequenceType_tag,&attributeType_tag,NULL}}; /*+ The sequenceType type tag. +*/ static const xmltag sequenceType_tag= {"xsd:sequence", 0, {NULL}, sequenceType_function, {&elementType_tag,NULL}}; /*+ The attributeType type tag. +*/ static const xmltag attributeType_tag= {"xsd:attribute", 2, {"name","type"}, attributeType_function, {NULL}}; /* The XML tag processing functions */ /*++++++++++++++++++++++++++++++++++++++ The function that is called when the XML declaration is seen int xmlDeclaration_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *version The contents of the 'version' attribute (or NULL if not defined). const char *encoding The contents of the 'encoding' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding) { /* Add the XML declaration as a tag. */ currenttype=NULL; elementType_function("xsd:element",XMLPARSE_TAG_START|XMLPARSE_TAG_END,"xml","xmlDeclaration",NULL,NULL); complexType_function("xsd:complexType",XMLPARSE_TAG_START,"xmlDeclaration"); attributeType_function("xsd:attribute",XMLPARSE_TAG_START|XMLPARSE_TAG_END,"version",NULL); attributeType_function("xsd:attribute",XMLPARSE_TAG_START|XMLPARSE_TAG_END,"encoding",NULL); complexType_function("xsd:complexType",XMLPARSE_TAG_END,NULL); if(currenttype) free(currenttype); currenttype=NULL; return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the schemaType XSD type is seen int schemaType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *elementFormDefault The contents of the 'elementFormDefault' attribute (or NULL if not defined). const char *xmlns_xsd The contents of the 'xmlns:xsd' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int schemaType_function(const char *_tag_,int _type_,const char *elementFormDefault,const char *xmlns_xsd) { return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the elementType XSD type is seen int elementType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *name The contents of the 'name' attribute (or NULL if not defined). const char *type The contents of the 'type' attribute (or NULL if not defined). const char *minOccurs The contents of the 'minOccurs' attribute (or NULL if not defined). const char *maxOccurs The contents of the 'maxOccurs' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int elementType_function(const char *_tag_,int _type_,const char *name,const char *type,const char *minOccurs,const char *maxOccurs) { xmltagx *tagx=NULL; int i; if(_type_==XMLPARSE_TAG_END) return(0); for(i=0;itype) && !strcmp(name,tagsx[i]->name)) tagx=tagsx[i]; if(!tagx) { ntagsx++; tagsx=(xmltagx**)realloc((void*)tagsx,ntagsx*sizeof(xmltagx*)); tagsx[ntagsx-1]=(xmltagx*)calloc(1,sizeof(xmltagx)); tagsx[ntagsx-1]->name=strcpy(malloc(strlen(name)+1),name); tagsx[ntagsx-1]->type=strcpy(malloc(strlen(type)+1),type); tagx=tagsx[ntagsx-1]; } if(!currenttype) return(0); for(i=0;itype,currenttype)) { tagsx[i]->subtagsx[tagsx[i]->nsubtagsx]=tagx; tagsx[i]->nsubtagsx++; if(tagsx[i]->nsubtagsx==XMLPARSE_MAX_SUBTAGS) { fprintf(stderr,"Error: Too many subtags (%d) seen for type '%s'.\n",XMLPARSE_MAX_SUBTAGS,currenttype); exit(EXIT_FAILURE); } } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the complexType XSD type is seen int complexType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *name The contents of the 'name' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int complexType_function(const char *_tag_,int _type_,const char *name) { if(_type_==XMLPARSE_TAG_END) return(0); currenttype=strcpy(realloc(currenttype,strlen(name)+1),name); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the sequenceType XSD type is seen int sequenceType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ static int sequenceType_function(const char *_tag_,int _type_) { return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the attributeType XSD type is seen int attributeType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *name The contents of the 'name' attribute (or NULL if not defined). const char *type The contents of the 'type' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int attributeType_function(const char *_tag_,int _type_,const char *name,const char *type) { int i; if(_type_==XMLPARSE_TAG_END) return(0); for(i=0;itype,currenttype)) { tagsx[i]->attributes[tagsx[i]->nattributes]=strcpy(malloc(strlen(name)+1),name); tagsx[i]->nattributes++; if(tagsx[i]->nattributes==XMLPARSE_MAX_ATTRS) { fprintf(stderr,"Error: Too many attributes (%d) seen for type '%s'.\n",XMLPARSE_MAX_ATTRS,currenttype); exit(EXIT_FAILURE); } } return(0); } /*++++++++++++++++++++++++++++++++++++++ The XML Schema Definition XML parser and C program generator. ++++++++++++++++++++++++++++++++++++++*/ int main(int argc,char **argv) { int i,j; /* Parse the XSD file */ if(ParseXML(STDIN_FILENO,xml_toplevel_tags,XMLPARSE_UNKNOWN_ATTR_IGNORE)) { fprintf(stderr,"Error: Cannot parse XML file - exiting.\n"); exit(EXIT_FAILURE); } /* Print the header */ printf("/***************************************\n"); printf(" An automatically generated skeleton XML parser.\n"); printf("\n"); printf(" Automatically generated by xsd-to-xmlparser.\n"); printf(" ***************************************/\n"); printf("\n"); printf("\n"); printf("#include \n"); printf("#if !defined(_MSC_VER)\n"); printf("#include \n"); printf("#endif\n"); printf("\n"); printf("#include \"xmlparse.h\"\n"); /* Print the function prototypes */ printf("\n"); printf("\n"); printf("/* The XML tag processing function prototypes */\n"); printf("\n"); for(i=0;itype)); for(j=0;jnattributes;j++) printf(",const char *%s",safe(tagsx[i]->attributes[j])); printf(");\n"); } /* Print the xmltag variables */ printf("\n"); printf("\n"); printf("/* The XML tag definitions (forward declarations) */\n"); printf("\n"); for(i=0;itype)); printf("\n"); printf("\n"); printf("/* The XML tag definition values */\n"); printf("\n"); printf("/*+ The complete set of tags at the top level. +*/\n"); printf("static const xmltag * const xml_toplevel_tags[]={"); printf("&%s_tag,",safe(tagsx[0]->type)); printf("&%s_tag,",safe(tagsx[1]->type)); printf("NULL};\n"); for(i=0;itype); printf("static const xmltag %s_tag=\n",safe(tagsx[i]->type)); printf(" {\"%s\",\n",tagsx[i]->name); printf(" %d, {",tagsx[i]->nattributes); for(j=0;jnattributes;j++) printf("%s\"%s\"",(j?",":""),tagsx[i]->attributes[j]); printf("%s},\n",(tagsx[i]->nattributes?"":"NULL")); printf(" %s_function,\n",safe(tagsx[i]->type)); printf(" {"); for(j=0;jnsubtagsx;j++) printf("&%s_tag,",safe(tagsx[i]->subtagsx[j]->type)); printf("NULL}};\n"); } /* Print the functions */ printf("\n"); printf("\n"); printf("/* The XML tag processing functions */\n"); for(i=0;itype); printf("\n"); printf(" int %s_function Returns 0 if no error occured or something else otherwise.\n",safe(tagsx[i]->type)); printf("\n"); printf(" const char *_tag_ Set to the name of the element tag that triggered this function call.\n"); printf("\n"); printf(" int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag.\n"); for(j=0;jnattributes;j++) { printf("\n"); printf(" const char *%s The contents of the '%s' attribute (or NULL if not defined).\n",safe(tagsx[i]->attributes[j]),tagsx[i]->attributes[j]); } printf(" ++++++++++++++++++++++++++++++++++++++*/\n"); printf("\n"); printf("static int %s_function(const char *_tag_,int _type_",safe(tagsx[i]->type)); for(j=0;jnattributes;j++) printf(",const char *%s",safe(tagsx[i]->attributes[j])); printf(")\n"); printf("{\n"); if(i==(ntagsx-1)) /* XML tag */ { printf(" printf(\"nattributes;j++) { char *safename=safe(tagsx[i]->attributes[j]); printf(" if(%s) printf(\" %s=\\\"%%s\\\"\",ParseXML_Encode_Safe_XML(%s));\n",safename,tagsx[i]->attributes[j],safename); } printf(" printf(\" ?>\\n\");\n"); } else { printf(" printf(\"<%%s%%s\",(_type_==XMLPARSE_TAG_END)?\"/\":\"\",_tag_);\n"); for(j=0;jnattributes;j++) { char *safename=safe(tagsx[i]->attributes[j]); printf(" if(%s) printf(\" %s=\\\"%%s\\\"\",ParseXML_Encode_Safe_XML(%s));\n",safename,tagsx[i]->attributes[j],safename); } printf(" printf(\"%%s>\\n\",(_type_==(XMLPARSE_TAG_START|XMLPARSE_TAG_END))?\" /\":\"\");\n"); } printf(" return(0);\n"); printf("}\n"); } /* Print the main function */ printf("\n"); printf("\n"); printf("/*++++++++++++++++++++++++++++++++++++++\n"); printf(" A skeleton XML parser.\n"); printf(" ++++++++++++++++++++++++++++++++++++++*/\n"); printf("\n"); printf("int main(int argc,char **argv)\n"); printf("{\n"); printf(" if(ParseXML(STDIN_FILENO,xml_toplevel_tags,XMLPARSE_UNKNOWN_ATTR_WARN))\n"); printf(" return(1);\n"); printf(" else\n"); printf(" return(0);\n"); printf("}\n"); return(0); } /*++++++++++++++++++++++++++++++++++++++ A function to return a safe C identifier from an XML tag or attribute name. char *safe Returns the safe name in a private string (only use once). const char *name The name to convert. ++++++++++++++++++++++++++++++++++++++*/ static char *safe(const char *name) { static char *safe=NULL; /* static allocation of return value */ int i; safe=realloc(safe,strlen(name)+1); for(i=0;name[i];i++) if(isalnum(name[i])) safe[i]=name[i]; else safe[i]='_'; safe[i]=0; return(safe); } routino-3.4.3/src/xml/test/ 40755 233 144 0 12531652211 10720 5routino-3.4.3/src/xml/test/bad-double-quote-attr-invalid-utf8.xml 644 233 144 233 12064636364 20061 0 routino-3.4.3/src/xml/test/bad-end-tag-space-at-end.xml 644 233 144 204 12064636364 15750 0 routino-3.4.3/src/xml/test/good.xml 644 233 144 252 12064636364 12401 0 routino-3.4.3/src/xml/test/bad-single-quote-attr-left-angle.xml 644 233 144 233 12064636364 17574 0 routino-3.4.3/src/xml/test/bad-double-quote-attr-invalid-ascii.xml 644 233 144 233 12064636364 20263 0 routino-3.4.3/src/xml/test/bad-single-quote-attr-invalid-ascii.xml 644 233 144 233 12064636364 20272 0 routino-3.4.3/src/xml/test/bad-attr-entity-ref.xml 644 233 144 252 12064636364 15233 0 routino-3.4.3/src/xml/test/bad-tag-attr-no-quotes.xml 644 233 144 217 12064636364 15651 0 routino-3.4.3/src/xml/test/bad-comment-extra-double-dash.xml 644 233 144 205 12064636364 17143 0 routino-3.4.3/src/xml/test/bad-end-tag-space-at-begin1.xml 644 233 144 204 12064636364 16347 0 routino-3.4.3/src/xml/test/bad-xml-header-at-begin.xml 644 233 144 204 12064636364 15704 0 routino-3.4.3/src/xml/test/bad-start-tag-space-at-begin.xml 644 233 144 204 12064636364 16655 0 < level1> routino-3.4.3/src/xml/test/bad-text-outside.xml 644 233 144 235 12064636364 14634 0 text routino-3.4.3/src/xml/test/test.xsd 644 233 144 2512 12064636364 12447 0 routino-3.4.3/src/xml/test/bad-tag-level-nesting.xml 644 233 144 203 12064636364 15516 0 routino-3.4.3/src/xml/test/bad-unexpected-end-tag.xml 644 233 144 204 12064636364 15653 0 routino-3.4.3/src/xml/test/bad-double-quote-attr-amp.xml 644 233 144 233 12064636364 16324 0 routino-3.4.3/src/xml/test/bad-tag-attr-space-after-equal.xml 644 233 144 222 12064636364 17212 0 routino-3.4.3/src/xml/test/bad-single-quote-attr-right-angle.xml 644 233 144 233 12064636364 17757 0 routino-3.4.3/src/xml/test/bad-unexpected-right-angle.xml 644 233 144 213 12064636364 16535 0 > routino-3.4.3/src/xml/test/bad-xml-header-not-first.xml 644 233 144 203 12064636364 16142 0 routino-3.4.3/src/xml/test/bad-xml-header-at-end.xml 644 233 144 202 12064636364 15364 0 routino-3.4.3/src/xml/test/bad-unbalanced-tag-start-end.xml 644 233 144 203 12064636364 16735 0 routino-3.4.3/src/xml/test/bad-double-quote-attr-left-angle.xml 644 233 144 233 12064636364 17565 0 routino-3.4.3/src/xml/test/bad-end-tag-with-attr.xml 644 233 144 221 12064636364 15431 0 routino-3.4.3/src/xml/test/bad-single-quote-attr-amp.xml 644 233 144 233 12064636364 16333 0 routino-3.4.3/src/xml/test/bad-comment-ends-triple-dash.xml 644 233 144 203 12064636364 16774 0 routino-3.4.3/src/xml/test/bad-tag-attr-space-before-equal.xml 644 233 144 222 12064636364 17353 0 routino-3.4.3/src/xml/test/bad-unexpected-attribute-name.xml 644 233 144 225 12064636364 17260 0 routino-3.4.3/src/xml/test/bad-single-quote-attr-invalid-utf8.xml 644 233 144 233 12064636364 20070 0 routino-3.4.3/src/xml/test/bad-early-end-of-file.xml 644 233 144 173 12064636364 15376 0 routino-3.4.3/src/xml/test/bad-unexpected-left-angle.xml 644 233 144 213 12064636364 16352 0 < routino-3.4.3/src/xml/test/bad-end-tag-space-at-begin2.xml 644 233 144 204 12064636364 16350 0 < /level1> routino-3.4.3/src/xml/test/bad-double-quote-attr-right-angle.xml 644 233 144 233 12064636364 17750 0 routino-3.4.3/src/xml/Makefile 644 233 144 5611 13121002124 11404 0# XML test programs Makefile # # Part of the Routino routing software. # # This file Copyright 2010-2015, 2017 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../../Makefile.conf # Compilation targets DEPDIR=.deps XMLDIR=../../xml X=$(notdir $(wildcard $(XMLDIR)/*.xsd)) C=$(foreach f,$(X),$(addsuffix -skeleton.c,$(basename $f))) D=$(wildcard $(DEPDIR)/*.d) O=$(foreach f,$(C),$(addsuffix .o,$(basename $f))) E=$(foreach f,$(C),$(addsuffix $(.EXE),$(basename $f))) EXE=xsd-to-xmlparser$(.EXE) ######## all: $(EXE) $(C) $(E) ######## xsd-to-xmlparser$(.EXE) : xsd-to-xmlparser.o ../xmlparse.o $(LD) $^ -o $@ $(LDFLAGS) ######## %-skeleton.c : $(XMLDIR)/%.xsd xsd-to-xmlparser$(.EXE) -./xsd-to-xmlparser < $< > $@ @test -s $@ || rm $@ %-skeleton$(.EXE) : %-skeleton.o ../xmlparse.o $(LD) $^ -o $@ $(LDFLAGS) .SECONDARY : $(O) ######## ../xmlparse.o : ../xmlparse.c ../xmlparse.h cd .. && $(MAKE) xmlparse.o ######## %.o : %.c -@[ -d $(DEPDIR) ] || mkdir $(DEPDIR) || true $(CC) -c $(CFLAGS) -I.. $< -o $@ -MMD -MP -MF $(addprefix $(DEPDIR)/,$(addsuffix .d,$(basename $@))) ######## test: test-skeleton$(.EXE) @status=true ;\ echo "" ;\ for good in test/good*.xml; do \ echo "Testing: $$good ... " ;\ if ./test-skeleton < $$good > /dev/null; then echo "... passed"; else echo "... FAILED"; status=false; fi ;\ echo "" ;\ done ;\ for bad in test/bad*.xml; do \ echo "Testing: $$bad ... " ;\ if ./test-skeleton < $$bad > /dev/null; then echo "... FAILED"; status=false; else echo "... passed"; fi ;\ echo "" ;\ done ;\ if $$status; then echo "Success: all tests passed"; else echo "Warning: Some tests FAILED"; fi ;\ $$status test-skeleton$(.EXE) : test-skeleton.o ../xmlparse.o $(LD) $^ -o $@ $(LDFLAGS) test-skeleton.c : test/test.xsd xsd-to-xmlparser$(.EXE) ./xsd-to-xmlparser < $< | sed -e 's/XMLPARSE_UNKNOWN_ATTR_WARN/XMLPARSE_UNKNOWN_ATTR_ERROR/' > $@ ######## install: ######## clean: rm -f *~ rm -f *.o rm -f $(EXE) rm -f $(E) test-skeleton$(.EXE) rm -f $(D) $(DEPDIR)/test-skeleton.d rm -f $(C) test-skeleton.c rm -fr $(DEPDIR) rm -f core rm -f *.gcda *.gcno *.gcov gmon.out ######## distclean: clean ######## include $(D) ######## .PHONY:: all test install clean distclean routino-3.4.3/src/version.h 644 233 144 2077 15002742572 11027 0/*************************************** Routino version. Part of the Routino routing software. ******************/ /****************** This file Copyright 2016, 2017, 2019, 2020, 2023, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef VERSION_H #define VERSION_H /*+ To stop multiple inclusions. +*/ #define ROUTINO_VERSION "3.4.3" #define ROUTINO_URL "" #endif /* VERSION_H */ routino-3.4.3/src/uncompress.h 644 233 144 2131 12302106364 11520 0/*************************************** Function prototypes for file uncompression. Part of the Routino routing software. ******************/ /****************** This file Copyright 2012-2014 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef UNCOMPRESS_H #define UNCOMPRESS_H /*+ To stop multiple inclusions. +*/ int Uncompress_Bzip2(int filefd); int Uncompress_Gzip(int filefd); int Uncompress_Xz(int filefd); #endif /* UNCOMPRESS_H */ routino-3.4.3/src/profiles.h 644 233 144 6056 13455663534 11200 0/*************************************** A header file for the profiles. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef PROFILES_H #define PROFILES_H /*+ To stop multiple inclusions. +*/ #include "types.h" /* Data structures */ /*+ A data structure to hold a transport type profile. +*/ typedef struct _Profile { char *name; /*+ The name of the profile. +*/ /* The parts that are read from the XML file */ Transport transport; /*+ The type of transport. +*/ score_t highway[Highway_Count]; /*+ A floating point preference for travel on the highway. +*/ speed_t speed[Highway_Count]; /*+ The maximum speed on each type of highway. +*/ score_t props[Property_Count]; /*+ A floating point preference for ways with this attribute. +*/ int oneway; /*+ A flag to indicate if one-way restrictions apply. +*/ int turns; /*+ A flag to indicate if turn restrictions apply. +*/ weight_t weight; /*+ The minimum weight of the route. +*/ height_t height; /*+ The minimum height of vehicles on the route. +*/ width_t width; /*+ The minimum width of vehicles on the route. +*/ length_t length; /*+ The minimum length of vehicles on the route. +*/ /* The derived parts */ transports_t transports; /*+ The type of transport expressed as a bitmask. +*/ score_t props_yes[Property_Count]; /*+ A floating point preference for ways with this attribute. +*/ score_t props_no [Property_Count]; /*+ A floating point preference for ways without this attribute. +*/ score_t max_pref; /*+ The maximum preference for any highway type. +*/ speed_t max_speed; /*+ The maximum speed for any highway type. +*/ } Profile; /* Functions in profiles.c */ int ParseXMLProfiles(const char *filename,const char *name,int all); char **GetProfileNames(void); Profile *GetProfile(const char *name); void FreeXMLProfiles(void); int UpdateProfile(Profile *profile,Ways *ways); void PrintProfile(const Profile *profile); void PrintProfilesXML(void); void PrintProfilesJSON(void); void PrintProfilesPerl(void); #endif /* PROFILES_H */ routino-3.4.3/src/profiles.c 644 233 144 106753 13455663672 11243 0/*************************************** Load the profiles from a file and the functions for handling them. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include "types.h" #include "ways.h" #include "files.h" #include "profiles.h" #include "xmlparse.h" /* Local variables (re-intialised by FreeXMLProfiles() function) */ /*+ The profiles that have been loaded from file. +*/ static Profile **loaded_profiles=NULL; /*+ The number of profiles that have been loaded from file. +*/ static int nloaded_profiles=0; /* Local variables (re-initialised for each file) */ /*+ Store all of the profiles. +*/ static int store_all; /*+ The profile name that is to be stored. +*/ static const char *store_name; /*+ This current profile is to be stored. +*/ static int store; /* The XML tag processing function prototypes */ //static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding); //static int RoutinoProfilesType_function(const char *_tag_,int _type_); static int profileType_function(const char *_tag_,int _type_,const char *name,const char *transport); //static int speedsType_function(const char *_tag_,int _type_); //static int preferencesType_function(const char *_tag_,int _type_); //static int propertiesType_function(const char *_tag_,int _type_); //static int restrictionsType_function(const char *_tag_,int _type_); static int speedType_function(const char *_tag_,int _type_,const char *highway,const char *kph); static int preferenceType_function(const char *_tag_,int _type_,const char *highway,const char *percent); static int propertyType_function(const char *_tag_,int _type_,const char *type,const char *percent); static int onewayType_function(const char *_tag_,int _type_,const char *obey); static int turnsType_function(const char *_tag_,int _type_,const char *obey); static int weightType_function(const char *_tag_,int _type_,const char *limit); static int heightType_function(const char *_tag_,int _type_,const char *limit); static int widthType_function(const char *_tag_,int _type_,const char *limit); static int lengthType_function(const char *_tag_,int _type_,const char *limit); /* The XML tag definitions (forward declarations) */ static const xmltag xmlDeclaration_tag; static const xmltag RoutinoProfilesType_tag; static const xmltag profileType_tag; static const xmltag speedsType_tag; static const xmltag preferencesType_tag; static const xmltag propertiesType_tag; static const xmltag restrictionsType_tag; static const xmltag speedType_tag; static const xmltag preferenceType_tag; static const xmltag propertyType_tag; static const xmltag onewayType_tag; static const xmltag turnsType_tag; static const xmltag weightType_tag; static const xmltag heightType_tag; static const xmltag widthType_tag; static const xmltag lengthType_tag; /* The XML tag definition values */ /*+ The complete set of tags at the top level. +*/ static const xmltag * const xml_toplevel_tags[]={&xmlDeclaration_tag,&RoutinoProfilesType_tag,NULL}; /*+ The xmlDeclaration type tag. +*/ static const xmltag xmlDeclaration_tag= {"xml", 2, {"version","encoding"}, NULL, {NULL}}; /*+ The RoutinoProfilesType type tag. +*/ static const xmltag RoutinoProfilesType_tag= {"routino-profiles", 0, {NULL}, NULL, {&profileType_tag,NULL}}; /*+ The profileType type tag. +*/ static const xmltag profileType_tag= {"profile", 2, {"name","transport"}, profileType_function, {&speedsType_tag,&preferencesType_tag,&propertiesType_tag,&restrictionsType_tag,NULL}}; /*+ The speedsType type tag. +*/ static const xmltag speedsType_tag= {"speeds", 0, {NULL}, NULL, {&speedType_tag,NULL}}; /*+ The preferencesType type tag. +*/ static const xmltag preferencesType_tag= {"preferences", 0, {NULL}, NULL, {&preferenceType_tag,NULL}}; /*+ The propertiesType type tag. +*/ static const xmltag propertiesType_tag= {"properties", 0, {NULL}, NULL, {&propertyType_tag,NULL}}; /*+ The restrictionsType type tag. +*/ static const xmltag restrictionsType_tag= {"restrictions", 0, {NULL}, NULL, {&onewayType_tag,&turnsType_tag,&weightType_tag,&heightType_tag,&widthType_tag,&lengthType_tag,NULL}}; /*+ The speedType type tag. +*/ static const xmltag speedType_tag= {"speed", 2, {"highway","kph"}, speedType_function, {NULL}}; /*+ The preferenceType type tag. +*/ static const xmltag preferenceType_tag= {"preference", 2, {"highway","percent"}, preferenceType_function, {NULL}}; /*+ The propertyType type tag. +*/ static const xmltag propertyType_tag= {"property", 2, {"type","percent"}, propertyType_function, {NULL}}; /*+ The onewayType type tag. +*/ static const xmltag onewayType_tag= {"oneway", 1, {"obey"}, onewayType_function, {NULL}}; /*+ The turnsType type tag. +*/ static const xmltag turnsType_tag= {"turns", 1, {"obey"}, turnsType_function, {NULL}}; /*+ The weightType type tag. +*/ static const xmltag weightType_tag= {"weight", 1, {"limit"}, weightType_function, {NULL}}; /*+ The heightType type tag. +*/ static const xmltag heightType_tag= {"height", 1, {"limit"}, heightType_function, {NULL}}; /*+ The widthType type tag. +*/ static const xmltag widthType_tag= {"width", 1, {"limit"}, widthType_function, {NULL}}; /*+ The lengthType type tag. +*/ static const xmltag lengthType_tag= {"length", 1, {"limit"}, lengthType_function, {NULL}}; /* The XML tag processing functions */ /*++++++++++++++++++++++++++++++++++++++ The function that is called when the XML declaration is seen int xmlDeclaration_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *version The contents of the 'version' attribute (or NULL if not defined). const char *encoding The contents of the 'encoding' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ //static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the RoutinoProfilesType XSD type is seen int RoutinoProfilesType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int RoutinoProfilesType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the profileType XSD type is seen int profileType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *name The contents of the 'name' attribute (or NULL if not defined). const char *transport The contents of the 'transport' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int profileType_function(const char *_tag_,int _type_,const char *name,const char *transport) { if(_type_&XMLPARSE_TAG_START) { Transport transporttype; int i; XMLPARSE_ASSERT_STRING(_tag_,name); if(store_all) store=1; else if(store_name && !strcmp(store_name,name)) store=1; else store=0; if(store) { for(i=0;iname)) XMLPARSE_MESSAGE(_tag_,"profile name must be unique"); XMLPARSE_ASSERT_STRING(_tag_,transport); transporttype=TransportType(transport); if(transporttype==Transport_None) XMLPARSE_INVALID(_tag_,transport); if((nloaded_profiles%16)==0) loaded_profiles=(Profile**)realloc((void*)loaded_profiles,(nloaded_profiles+16)*sizeof(Profile*)); nloaded_profiles++; loaded_profiles[nloaded_profiles-1]=(Profile*)calloc(1,sizeof(Profile)); loaded_profiles[nloaded_profiles-1]->name=strcpy(malloc(strlen(name)+1),name); loaded_profiles[nloaded_profiles-1]->transport=transporttype; } } if(_type_&XMLPARSE_TAG_END && store) store=0; return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the speedsType XSD type is seen int speedsType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int speedsType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the preferencesType XSD type is seen int preferencesType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int preferencesType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the propertiesType XSD type is seen int propertiesType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int propertiesType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the restrictionsType XSD type is seen int restrictionsType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int restrictionsType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the speedType XSD type is seen int speedType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *highway The contents of the 'highway' attribute (or NULL if not defined). const char *kph The contents of the 'kph' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int speedType_function(const char *_tag_,int _type_,const char *highway,const char *kph) { if(_type_&XMLPARSE_TAG_START && store) { double speed; Highway highwaytype; XMLPARSE_ASSERT_STRING(_tag_,highway); highwaytype=HighwayType(highway); if(highwaytype==Highway_None) XMLPARSE_INVALID(_tag_,highway); XMLPARSE_ASSERT_FLOATING(_tag_,kph); speed=atof(kph); if(speed<0) XMLPARSE_INVALID(_tag_,kph); loaded_profiles[nloaded_profiles-1]->speed[highwaytype]=kph_to_speed(speed); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the preferenceType XSD type is seen int preferenceType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *highway The contents of the 'highway' attribute (or NULL if not defined). const char *percent The contents of the 'percent' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int preferenceType_function(const char *_tag_,int _type_,const char *highway,const char *percent) { if(_type_&XMLPARSE_TAG_START && store) { Highway highwaytype; double p; XMLPARSE_ASSERT_STRING(_tag_,highway); highwaytype=HighwayType(highway); if(highwaytype==Highway_None) XMLPARSE_INVALID(_tag_,highway); XMLPARSE_ASSERT_FLOATING(_tag_,percent); p=atof(percent); if(p<0 || p>100) XMLPARSE_INVALID(_tag_,percent); loaded_profiles[nloaded_profiles-1]->highway[highwaytype]=(score_t)(p/100); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the propertyType XSD type is seen int propertyType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *type The contents of the 'type' attribute (or NULL if not defined). const char *percent The contents of the 'percent' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int propertyType_function(const char *_tag_,int _type_,const char *type,const char *percent) { if(_type_&XMLPARSE_TAG_START && store) { Property property; double p; XMLPARSE_ASSERT_STRING(_tag_,type); property=PropertyType(type); if(property==Property_None) XMLPARSE_INVALID(_tag_,type); XMLPARSE_ASSERT_FLOATING(_tag_,percent); p=atof(percent); if(p<0 || p>100) XMLPARSE_INVALID(_tag_,percent); loaded_profiles[nloaded_profiles-1]->props[property]=(score_t)(p/100); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the onewayType XSD type is seen int onewayType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *obey The contents of the 'obey' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int onewayType_function(const char *_tag_,int _type_,const char *obey) { if(_type_&XMLPARSE_TAG_START && store) { int o; XMLPARSE_ASSERT_INTEGER(_tag_,obey); o=atoi(obey); loaded_profiles[nloaded_profiles-1]->oneway=!!o; } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the turnsType XSD type is seen int turnsType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *obey The contents of the 'obey' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int turnsType_function(const char *_tag_,int _type_,const char *obey) { if(_type_&XMLPARSE_TAG_START && store) { int o; XMLPARSE_ASSERT_INTEGER(_tag_,obey); o=atoi(obey); loaded_profiles[nloaded_profiles-1]->turns=!!o; } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the weightType XSD type is seen int weightType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *limit The contents of the 'limit' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int weightType_function(const char *_tag_,int _type_,const char *limit) { if(_type_&XMLPARSE_TAG_START && store) { double l; XMLPARSE_ASSERT_FLOATING(_tag_,limit); l=atof(limit); if(l<0) XMLPARSE_INVALID(_tag_,limit); loaded_profiles[nloaded_profiles-1]->weight=tonnes_to_weight(l); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the heightType XSD type is seen int heightType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *limit The contents of the 'limit' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int heightType_function(const char *_tag_,int _type_,const char *limit) { if(_type_&XMLPARSE_TAG_START && store) { double l; XMLPARSE_ASSERT_FLOATING(_tag_,limit); l=atof(limit); if(l<0) XMLPARSE_INVALID(_tag_,limit); loaded_profiles[nloaded_profiles-1]->height=metres_to_height(l); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the widthType XSD type is seen int widthType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *limit The contents of the 'limit' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int widthType_function(const char *_tag_,int _type_,const char *limit) { if(_type_&XMLPARSE_TAG_START && store) { double l; XMLPARSE_ASSERT_FLOATING(_tag_,limit); l=atof(limit); if(l<0) XMLPARSE_INVALID(_tag_,limit); loaded_profiles[nloaded_profiles-1]->width=metres_to_width(l); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the lengthType XSD type is seen int lengthType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *limit The contents of the 'limit' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int lengthType_function(const char *_tag_,int _type_,const char *limit) { if(_type_&XMLPARSE_TAG_START && store) { double l; XMLPARSE_ASSERT_FLOATING(_tag_,limit); l=atof(limit); if(l<0) XMLPARSE_INVALID(_tag_,limit); loaded_profiles[nloaded_profiles-1]->length=metres_to_length(l); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The XML profile parser. int ParseXMLProfiles Returns 0 if OK or something else in case of an error. const char *filename The name of the file to read. const char *name The name of the profile to read. int all Set to true to load all the profiles. ++++++++++++++++++++++++++++++++++++++*/ int ParseXMLProfiles(const char *filename,const char *name,int all) { int fd; int retval; if(!ExistsFile(filename)) return(1); fd=OpenFile(filename); /* Delete the existing profiles */ if(nloaded_profiles) FreeXMLProfiles(); /* Initialise variables used for parsing */ store_all=all; store_name=name; store=0; /* Parse the file */ retval=ParseXML(fd,xml_toplevel_tags,XMLPARSE_UNKNOWN_ATTR_ERRNONAME); CloseFile(fd); if(retval) { FreeXMLProfiles(); return(2); } return(0); } /*++++++++++++++++++++++++++++++++++++++ Return a list of the profile names that have been loaded from the XML file. char **GetProfileNames Returns a NULL terminated list of strings - all allocated. ++++++++++++++++++++++++++++++++++++++*/ char **GetProfileNames(void) { char **list=calloc(1+nloaded_profiles,sizeof(char*)); int i; for(i=0;iname)+1),loaded_profiles[i]->name); return(list); } /*++++++++++++++++++++++++++++++++++++++ Get a named profile. Profile *GetProfile Returns a pointer to the profile. const char *name The name of the profile. ++++++++++++++++++++++++++++++++++++++*/ Profile *GetProfile(const char *name) { int i; for(i=0;iname,name)) return(loaded_profiles[i]); return(NULL); } /*++++++++++++++++++++++++++++++++++++++ Free the memory allocated when reading the profiles. ++++++++++++++++++++++++++++++++++++++*/ void FreeXMLProfiles(void) { int i; if(!loaded_profiles) return; for(i=0;iname) free(loaded_profiles[i]->name); free(loaded_profiles[i]); } free(loaded_profiles); loaded_profiles=NULL; nloaded_profiles=0; } /*++++++++++++++++++++++++++++++++++++++ Update a profile with the highway preference scaling factors. int UpdateProfile Returns 1 in case of a problem. Profile *profile The profile to be updated. Ways *ways The set of ways to use. ++++++++++++++++++++++++++++++++++++++*/ int UpdateProfile(Profile *profile,Ways *ways) { int i; /* Check the allowed transport type */ profile->transports=TRANSPORTS(profile->transport); if(!(profile->transports & ways->file.transports)) return(1); /* Normalise the highway preferences into the range ~0 -> 1 */ profile->max_pref=0; for(i=1;ihighway[i]<0) profile->highway[i]=0; if(profile->highway[i]>1) profile->highway[i]=1; if(profile->highway[i]>profile->max_pref) profile->max_pref=profile->highway[i]; } if(profile->max_pref==0) return(1); /* Normalise the property preferences into the range ~0 -> 1 */ for(i=1;iprops[i]<0) profile->props[i]=0; if(profile->props[i]>1) profile->props[i]=1; profile->props_yes[i]=profile->props[i]; profile->props_no [i]=1-profile->props_yes[i]; /* Squash the properties; selecting 60% preference without the sqrt() allows routes 50% longer on highways with the property compared to ones without. With the sqrt() function the ratio is only 22% allowing finer control. */ profile->props_yes[i]=(score_t)sqrt(profile->props_yes[i]); profile->props_no [i]=(score_t)sqrt(profile->props_no[i] ); if(profile->props_yes[i]<0.01f) profile->props_yes[i]=0.01f; if(profile->props_no[i]<0.01f) profile->props_no[i]=0.01f; } /* Find the fastest preferred speed */ profile->max_speed=0; for(i=1;ispeed[i]>profile->max_speed) profile->max_speed=profile->speed[i]; if(profile->max_speed==0) return(1); /* Find the most preferred property combination */ for(i=1;ifile.properties & PROPERTIES(i)) { if(profile->props_yes[i]>profile->props_no[i]) profile->max_pref*=profile->props_yes[i]; else profile->max_pref*=profile->props_no[i]; } return(0); } /*++++++++++++++++++++++++++++++++++++++ Print out a profile. const Profile *profile The profile to print. ++++++++++++++++++++++++++++++++++++++*/ void PrintProfile(const Profile *profile) { int i; printf("Profile\n=======\n"); printf("\n"); printf("Transport: %s\n",TransportName(profile->transport)); printf("\n"); for(i=1;ihighway[i]*100)); printf("\n"); for(i=1;ihighway[i]) printf("Speed on %-12s: %3d km/h / %2.0f mph\n",HighwayName(i),profile->speed[i],(double)profile->speed[i]/1.6); printf("\n"); for(i=1;iprops[i]*100)); printf("\n"); printf("Obey one-way : %s\n",profile->oneway?"yes":"no"); printf("Obey turns : %s\n",profile->turns?"yes":"no"); printf("Minimum weight: %.1f tonnes\n",weight_to_tonnes(profile->weight)); printf("Minimum height: %.1f metres\n",height_to_metres(profile->height)); printf("Minimum width : %.1f metres\n",width_to_metres(profile->width)); printf("Minimum length: %.1f metres\n",length_to_metres(profile->length)); } /*++++++++++++++++++++++++++++++++++++++ Print out all of the loaded profiles as XML for use as program input. ++++++++++++++++++++++++++++++++++++++*/ void PrintProfilesXML(void) { int i,j; char *padding=" "; printf("\n"); printf("\n"); printf("\n"); printf("\n"); for(j=0;j\n",loaded_profiles[j]->name,TransportName(loaded_profiles[j]->transport)); printf(" \n"); for(i=1;i\n",HighwayName(i),padding+8+strlen(HighwayName(i)),loaded_profiles[j]->speed[i]); printf(" \n"); printf(" \n"); for(i=1;i\n",HighwayName(i),padding+8+strlen(HighwayName(i)),loaded_profiles[j]->highway[i]*100); printf(" \n"); printf(" \n"); for(i=1;i\n",PropertyName(i),padding+8+strlen(PropertyName(i)),loaded_profiles[j]->props[i]*100); printf(" \n"); printf(" \n"); printf(" \n",loaded_profiles[j]->oneway); printf(" \n",loaded_profiles[j]->turns); printf(" \n",weight_to_tonnes(loaded_profiles[j]->weight)); printf(" \n",height_to_metres(loaded_profiles[j]->height)); printf(" \n",width_to_metres(loaded_profiles[j]->width)); printf(" \n",length_to_metres(loaded_profiles[j]->length)); printf(" \n"); printf(" \n"); printf("\n"); } printf("\n"); } /*++++++++++++++++++++++++++++++++++++++ Print out all of the loaded profiles as JavaScript Object Notation for use in a web page. ++++++++++++++++++++++++++++++++++++++*/ void PrintProfilesJSON(void) { int i,j; printf("var routino={ // contains all default Routino options (generated using \"--help-profile-json\").\n"); printf("\n"); printf(" // Default transport type\n"); printf(" transport: \"motorcar\",\n"); printf("\n"); printf(" // Transport types\n"); printf(" transports: { "); for(j=0;jtransport),j+1); printf(" },\n"); printf("\n"); printf(" // Highway types\n"); printf(" highways: { "); for(i=1;itransport),(int)(0.5+loaded_profiles[j]->highway[i]*100)); printf(" }%s\n",i==(Highway_Count-1)?"":","); } printf(" },\n"); printf("\n"); printf(" // Speed limits\n"); printf(" profile_speed: {\n"); for(i=1;itransport),loaded_profiles[j]->speed[i]); printf(" }%s\n",i==(Highway_Count-1)?"":","); } printf(" },\n"); printf("\n"); printf(" // Highway properties\n"); printf(" profile_property: {\n"); for(i=1;itransport),(int)(0.5+loaded_profiles[j]->props[i]*100)); printf(" }%s\n",i==(Property_Count-1)?"":","); } printf(" },\n"); printf("\n"); printf(" // Restrictions\n"); printf(" profile_restrictions: {\n"); printf(" %12s: { ","oneway"); for(j=0;jtransport),loaded_profiles[j]->oneway); printf(" },\n"); printf(" %12s: { ","turns"); for(j=0;jtransport),loaded_profiles[j]->turns); printf(" },\n"); printf(" %12s: { ","weight"); for(j=0;jtransport),weight_to_tonnes(loaded_profiles[j]->weight)); printf(" },\n"); printf(" %12s: { ","height"); for(j=0;jtransport),height_to_metres(loaded_profiles[j]->height)); printf(" },\n"); printf(" %12s: { ","width"); for(j=0;jtransport),width_to_metres(loaded_profiles[j]->width)); printf(" },\n"); printf(" %12s: { ","length"); for(j=0;jtransport),length_to_metres(loaded_profiles[j]->length)); printf(" }\n"); printf(" }\n"); printf("\n"); printf("}; // end of routino variable\n"); } /*++++++++++++++++++++++++++++++++++++++ Print out all of the loaded profiles as Perl for use in a web CGI. ++++++++++++++++++++++++++++++++++++++*/ void PrintProfilesPerl(void) { int i,j; printf("$routino={ # contains all default Routino options (generated using \"--help-profile-perl\").\n"); printf("\n"); printf(" # Default transport type\n"); printf(" transport => \"motorcar\",\n"); printf("\n"); printf(" # Transport types\n"); printf(" transports => { "); for(j=0;j %d",j==0?"":", ",TransportName(loaded_profiles[j]->transport),j+1); printf(" },\n"); printf("\n"); printf(" # Highway types\n"); printf(" highways => { "); for(i=1;i %d",i==1?"":", ",HighwayName(i),i); printf(" },\n"); printf("\n"); printf(" # Property types\n"); printf(" properties => { "); for(i=1;i %d",i==1?"":", ",PropertyName(i),i); printf(" },\n"); printf("\n"); printf(" # Restriction types\n"); printf(" restrictions => { oneway => 1, turns => 2, weight => 3, height => 4, width => 5, length => 6 },\n"); printf("\n"); printf(" # Allowed highways\n"); printf(" profile_highway => {\n"); for(i=1;i {",HighwayName(i)); for(j=0;j %3d",j==0?"":", ",TransportName(loaded_profiles[j]->transport),(int)(0.5+loaded_profiles[j]->highway[i]*100)); printf(" }%s\n",i==(Highway_Count-1)?"":","); } printf(" },\n"); printf("\n"); printf(" # Speed limits\n"); printf(" profile_speed => {\n"); for(i=1;i {",HighwayName(i)); for(j=0;j %3d",j==0?"":", ",TransportName(loaded_profiles[j]->transport),loaded_profiles[j]->speed[i]); printf(" }%s\n",i==(Highway_Count-1)?"":","); } printf(" },\n"); printf("\n"); printf(" # Highway properties\n"); printf(" profile_property => {\n"); for(i=1;i {",PropertyName(i)); for(j=0;j %3d",j==0?"":", ",TransportName(loaded_profiles[j]->transport),(int)(0.5+loaded_profiles[j]->props[i]*100)); printf(" }%s\n",i==(Property_Count-1)?"":","); } printf(" },\n"); printf("\n"); printf(" # Restrictions\n"); printf(" profile_restrictions => {\n"); printf(" %12s => {","oneway"); for(j=0;j %4d",j==0?"":", ",TransportName(loaded_profiles[j]->transport),loaded_profiles[j]->oneway); printf(" },\n"); printf(" %12s => {","turns"); for(j=0;j %4d",j==0?"":", ",TransportName(loaded_profiles[j]->transport),loaded_profiles[j]->turns); printf(" },\n"); printf(" %12s => {","weight"); for(j=0;j %4.1f",j==0?"":", ",TransportName(loaded_profiles[j]->transport),weight_to_tonnes(loaded_profiles[j]->weight)); printf(" },\n"); printf(" %12s => {","height"); for(j=0;j %4.1f",j==0?"":", ",TransportName(loaded_profiles[j]->transport),height_to_metres(loaded_profiles[j]->height)); printf(" },\n"); printf(" %12s => {","width"); for(j=0;j %4.1f",j==0?"":", ",TransportName(loaded_profiles[j]->transport),width_to_metres(loaded_profiles[j]->width)); printf(" },\n"); printf(" %12s => {","length"); for(j=0;j %4.1f",j==0?"":", ",TransportName(loaded_profiles[j]->transport),length_to_metres(loaded_profiles[j]->length)); printf(" }\n"); printf(" }\n"); printf("\n"); printf("}; # end of routino variable\n"); } routino-3.4.3/src/types.c 644 233 144 32600 13455661543 10524 0/*************************************** Functions for handling the data types. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include "types.h" /*++++++++++++++++++++++++++++++++++++++ Decide on the type of a way given the "highway" parameter. Highway HighwayType Returns the highway type of the way. const char *highway The string containing the type of the way. ++++++++++++++++++++++++++++++++++++++*/ Highway HighwayType(const char *highway) { switch(*highway) { case 'c': if(!strcmp(highway,"cycleway")) return(Highway_Cycleway); break; case 'f': if(!strcmp(highway,"ferry")) return(Highway_Ferry); break; case 'm': if(!strcmp(highway,"motorway")) return(Highway_Motorway); break; case 'p': if(!strcmp(highway,"primary")) return(Highway_Primary); if(!strcmp(highway,"path")) return(Highway_Path); break; case 'r': if(!strcmp(highway,"residential")) return(Highway_Residential); break; case 's': if(!strcmp(highway,"secondary")) return(Highway_Secondary); if(!strcmp(highway,"service")) return(Highway_Service); if(!strcmp(highway,"steps")) return(Highway_Steps); break; case 't': if(!strcmp(highway,"trunk")) return(Highway_Trunk); if(!strcmp(highway,"tertiary")) return(Highway_Tertiary); if(!strcmp(highway,"track")) return(Highway_Track); break; case 'u': if(!strcmp(highway,"unclassified")) return(Highway_Unclassified); break; default: ; } return(Highway_None); } /*++++++++++++++++++++++++++++++++++++++ Decide on the type of transport given the name of it. Transport TransportType Returns the type of the transport. const char *transport The string containing the method of transport. ++++++++++++++++++++++++++++++++++++++*/ Transport TransportType(const char *transport) { switch(*transport) { case 'b': if(!strcmp(transport,"bicycle")) return(Transport_Bicycle); break; case 'f': if(!strcmp(transport,"foot")) return(Transport_Foot); break; case 'g': if(!strcmp(transport,"goods")) return(Transport_Goods); break; case 'h': if(!strcmp(transport,"horse")) return(Transport_Horse); if(!strcmp(transport,"hgv")) return(Transport_HGV); break; case 'm': if(!strcmp(transport,"moped")) return(Transport_Moped); if(!strcmp(transport,"motorcycle")) return(Transport_Motorcycle); if(!strcmp(transport,"motorcar")) return(Transport_Motorcar); break; case 'p': if(!strcmp(transport,"psv")) return(Transport_PSV); break; case 'w': if(!strcmp(transport,"wheelchair")) return(Transport_Wheelchair); break; default: return(Transport_None); } return(Transport_None); } /*++++++++++++++++++++++++++++++++++++++ Decide on the type of property given the name of it. Property PropertyType Returns the type of the property. const char *property The string containing the method of property. ++++++++++++++++++++++++++++++++++++++*/ Property PropertyType(const char *property) { switch(*property) { case 'b': if(!strcmp(property,"bicycleroute")) return(Property_BicycleRoute); if(!strcmp(property,"bridge")) return(Property_Bridge); break; case 'f': if(!strcmp(property,"footroute")) return(Property_FootRoute); break; case 'm': if(!strcmp(property,"multilane")) return(Property_Multilane); break; case 'p': if(!strcmp(property,"paved")) return(Property_Paved); break; case 't': if(!strcmp(property,"tunnel")) return(Property_Tunnel); break; default: return(Property_None); } return(Property_None); } /*++++++++++++++++++++++++++++++++++++++ A string containing the name of a type of highway. const char *HighwayName Returns the name. Highway highway The highway type. ++++++++++++++++++++++++++++++++++++++*/ const char *HighwayName(Highway highway) { switch(highway) { case Highway_None: return("NONE"); case Highway_Motorway: return("motorway"); case Highway_Trunk: return("trunk"); case Highway_Primary: return("primary"); case Highway_Secondary: return("secondary"); case Highway_Tertiary: return("tertiary"); case Highway_Unclassified: return("unclassified"); case Highway_Residential: return("residential"); case Highway_Service: return("service"); case Highway_Track: return("track"); case Highway_Cycleway: return("cycleway"); case Highway_Path: return("path"); case Highway_Steps: return("steps"); case Highway_Ferry: return("ferry"); case Highway_Count: ; case Highway_CycleBothWays: ; case Highway_OneWay: ; case Highway_Roundabout: ; case Highway_Area: ; } return(NULL); } /*++++++++++++++++++++++++++++++++++++++ A string containing the name of a type of transport. const char *TransportName Returns the name. Transport transport The transport type. ++++++++++++++++++++++++++++++++++++++*/ const char *TransportName(Transport transport) { switch(transport) { case Transport_None: return("NONE"); case Transport_Foot: return("foot"); case Transport_Horse: return("horse"); case Transport_Wheelchair: return("wheelchair"); case Transport_Bicycle: return("bicycle"); case Transport_Moped: return("moped"); case Transport_Motorcycle: return("motorcycle"); case Transport_Motorcar: return("motorcar"); case Transport_Goods: return("goods"); case Transport_HGV: return("hgv"); case Transport_PSV: return("psv"); case Transport_Count: ; } return(NULL); } /*++++++++++++++++++++++++++++++++++++++ A string containing the name of a highway property. const char *PropertyName Returns the name. Property property The property type. ++++++++++++++++++++++++++++++++++++++*/ const char *PropertyName(Property property) { switch(property) { case Property_None: return("NONE"); case Property_Paved: return("paved"); case Property_Multilane: return("multilane"); case Property_Bridge: return("bridge"); case Property_Tunnel: return("tunnel"); case Property_FootRoute: return("footroute"); case Property_BicycleRoute: return("bicycleroute"); case Property_Count: ; } return(NULL); } /*++++++++++++++++++++++++++++++++++++++ A string containing the names of highways. const char *HighwaysNameList Returns the list of names. highways_t highways The highways type. ++++++++++++++++++++++++++++++++++++++*/ const char *HighwaysNameList(highways_t highways) { static char string[256]; /* static allocation of return value (set each call) */ string[0]=0; if(highways & Highways_Motorway) strcat(string,"motorway"); if(highways & Highways_Trunk) { if(*string) strcat(string,", "); strcat(string,"trunk"); } if(highways & Highways_Primary) { if(*string) strcat(string,", "); strcat(string,"primary"); } if(highways & Highways_Tertiary) { if(*string) strcat(string,", "); strcat(string,"tertiary"); } if(highways & Highways_Unclassified) { if(*string) strcat(string,", "); strcat(string,"unclassified"); } if(highways & Highways_Residential) { if(*string) strcat(string,", "); strcat(string,"residential"); } if(highways & Highways_Service) { if(*string) strcat(string,", "); strcat(string,"service"); } if(highways & Highways_Track) { if(*string) strcat(string,", "); strcat(string,"track"); } if(highways & Highways_Cycleway) { if(*string) strcat(string,", "); strcat(string,"cycleway"); } if(highways & Highways_Path) { if(*string) strcat(string,", "); strcat(string,"path"); } if(highways & Highways_Steps) { if(*string) strcat(string,", "); strcat(string,"steps"); } if(highways & Highways_Ferry) { if(*string) strcat(string,", "); strcat(string,"ferry"); } return(string); } /*++++++++++++++++++++++++++++++++++++++ A string containing the names of transports. const char *TransportsNameList Returns the list of names. transports_t transports The transports type. ++++++++++++++++++++++++++++++++++++++*/ const char *TransportsNameList(transports_t transports) { static char string[256]; /* static allocation of return value (set each call) */ string[0]=0; if(transports & Transports_Foot) strcat(string,"foot"); if(transports & Transports_Horse) { if(*string) strcat(string,", "); strcat(string,"horse"); } if(transports & Transports_Wheelchair) { if(*string) strcat(string,", "); strcat(string,"wheelchair"); } if(transports & Transports_Bicycle) { if(*string) strcat(string,", "); strcat(string,"bicycle"); } if(transports & Transports_Moped) { if(*string) strcat(string,", "); strcat(string,"moped"); } if(transports & Transports_Motorcycle) { if(*string) strcat(string,", "); strcat(string,"motorcycle"); } if(transports & Transports_Motorcar) { if(*string) strcat(string,", "); strcat(string,"motorcar"); } if(transports & Transports_Goods) { if(*string) strcat(string,", "); strcat(string,"goods"); } if(transports & Transports_HGV) { if(*string) strcat(string,", "); strcat(string,"hgv"); } if(transports & Transports_PSV) { if(*string) strcat(string,", "); strcat(string,"psv"); } return(string); } /*++++++++++++++++++++++++++++++++++++++ A string containing the names of the properties of a way. const char *PropertiesNameList Returns the list of names. properties_t properties The properties of the way. ++++++++++++++++++++++++++++++++++++++*/ const char *PropertiesNameList(properties_t properties) { static char string[256]; /* static allocation of return value (set each call) */ string[0]=0; if(properties & Properties_Paved) { if(*string) strcat(string,", "); strcat(string,"paved"); } if(properties & Properties_Multilane) { if(*string) strcat(string,", "); strcat(string,"multilane"); } if(properties & Properties_Bridge) { if(*string) strcat(string,", "); strcat(string,"bridge"); } if(properties & Properties_Tunnel) { if(*string) strcat(string,", "); strcat(string,"tunnel"); } if(properties & Properties_FootRoute) { if(*string) strcat(string,", "); strcat(string,"footroute"); } if(properties & Properties_BicycleRoute) { if(*string) strcat(string,", "); strcat(string,"bicycleroute"); } return(string); } /*++++++++++++++++++++++++++++++++++++++ Returns a list of all the highway types. const char *HighwayList Return a list of all the highway types. ++++++++++++++++++++++++++++++++++++++*/ const char *HighwayList(void) { return " motorway = Motorway\n" " trunk = Trunk\n" " primary = Primary\n" " secondary = Secondary\n" " tertiary = Tertiary\n" " unclassified = Unclassified\n" " residential = Residential\n" " service = Service\n" " track = Track\n" " cycleway = Cycleway\n" " path = Path\n" " steps = Steps\n" " ferry = Ferry\n" ; } /*++++++++++++++++++++++++++++++++++++++ Returns a list of all the transport types. const char *TransportList Return a list of all the transport types. ++++++++++++++++++++++++++++++++++++++*/ const char *TransportList(void) { return " foot = Foot\n" " bicycle = Bicycle\n" " wheelchair = Wheelchair\n" " horse = Horse\n" " moped = Moped (Small motorcycle, limited speed)\n" " motorcycle = Motorcycle\n" " motorcar = Motorcar\n" " goods = Goods (Small lorry, van)\n" " hgv = HGV (Heavy Goods Vehicle - large lorry)\n" " psv = PSV (Public Service Vehicle - bus, coach)\n" ; } /*++++++++++++++++++++++++++++++++++++++ Returns a list of all the property types. const char *PropertyList Return a list of all the highway proprties. ++++++++++++++++++++++++++++++++++++++*/ const char *PropertyList(void) { return " paved = Paved (suitable for normal wheels)\n" " multilane = Multiple lanes\n" " bridge = Bridge\n" " tunnel = Tunnel\n" " footroute = A route marked for foot travel\n" " bicycleroute = A route marked for bicycle travel\n" ; } routino-3.4.3/src/logging.c 644 233 144 37520 14774243462 11015 0/*************************************** Functions to handle logging functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include #if defined(_MSC_VER) #include #include static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL); int gettimeofday(struct timeval * tp, struct timezone * tzp) { FILETIME file_time; SYSTEMTIME system_time; ULARGE_INTEGER ularge; GetSystemTime(&system_time); SystemTimeToFileTime(&system_time, &file_time); ularge.LowPart = file_time.dwLowDateTime; ularge.HighPart = file_time.dwHighDateTime; tp->tv_sec = (long) ((ularge.QuadPart - EPOCH) / 10000000L); tp->tv_usec = (long) (system_time.wMilliseconds * 1000); return 0; } #else #include #endif #include "logging.h" /* Global variables */ /*+ The option to print the output in a way that allows logging to a file. +*/ int option_loggable=0; /*+ The option to print elapsed time with the output. +*/ int option_logtime=0; /*+ The option to print memory usage with the output. +*/ int option_logmemory=0; /* Local data types */ /*+ A structure to contain the list of allocated memory. +*/ struct mallocinfo { void *address; /*+ The address of the allocated memory. +*/ size_t size; /*+ The size of the allocated memory. +*/ }; /* Local functions */ static void vfprintf_first(FILE *file,const char *format,va_list ap); static void vfprintf_middle(FILE *file,const char *format,va_list ap); static void vfprintf_last(FILE *file,const char *format,va_list ap); static void fprintf_elapsed_time(FILE *file,struct timeval *start); static void fprintf_max_memory(FILE *file,size_t max_alloc,size_t max_mmap); /* Local variables */ /*+ The time that program_start() was called. +*/ static struct timeval program_start_time; /*+ The time that printf_first() was called. +*/ static struct timeval function_start_time; /*+ The list of allocated memory. +*/ static struct mallocinfo *mallocedmem; /*+ The number of allocated memory blocks. +*/ static int nmallocedmem=0; /*+ The length of the string printed out last time. +*/ static int printed_length=0; /*+ The maximum amount of memory allocated and memory mapped since starting the program. +*/ static size_t program_max_alloc=0,program_max_mmap=0; /*+ The maximum amount of memory allocated and memory mapped since starting the function. +*/ static size_t function_max_alloc=0,function_max_mmap=0; /*+ The current amount of memory allocated and memory mapped. +*/ static size_t current_alloc=0,current_mmap=0; /*++++++++++++++++++++++++++++++++++++++ Record the time that the program started. ++++++++++++++++++++++++++++++++++++++*/ void printf_program_start(void) { gettimeofday(&program_start_time,NULL); program_max_alloc=program_max_mmap=0; } /*++++++++++++++++++++++++++++++++++++++ Record the time that the program started. ++++++++++++++++++++++++++++++++++++++*/ void printf_program_end(void) { if(option_logtime || option_logmemory) { if(option_logtime) fprintf_elapsed_time(stdout,&program_start_time); if(option_logmemory) fprintf_max_memory(stdout,program_max_alloc,program_max_mmap); printf("Finish Program\n"); if(option_logtime==2) printf("[ m:ss.micros] "); else if(option_logtime==1) printf("[ m:ss.mil] "); if(option_logmemory) printf("[ RAM,FILE MB] "); if(option_logtime) printf("elapsed time"); if(option_logmemory) { if(option_logtime) printf(", "); printf("maximum memory"); } printf("\n"); fflush(stdout); } } /*++++++++++++++++++++++++++++++++++++++ Print the first message in an overwriting sequence (to stdout). const char *format The format string. ... The other arguments. ++++++++++++++++++++++++++++++++++++++*/ void printf_first(const char *format, ...) { va_list ap; if(option_logtime) gettimeofday(&function_start_time,NULL); if(option_logmemory) { function_max_alloc=current_alloc; function_max_mmap=current_mmap; } if(option_loggable) return; va_start(ap,format); vfprintf_first(stdout,format,ap); va_end(ap); } /*++++++++++++++++++++++++++++++++++++++ Print the middle message in an overwriting sequence (to stdout). const char *format The format string. ... The other arguments. ++++++++++++++++++++++++++++++++++++++*/ void printf_middle(const char *format, ...) { va_list ap; if(option_loggable) return; va_start(ap,format); vfprintf_middle(stdout,format,ap); va_end(ap); } /*++++++++++++++++++++++++++++++++++++++ Print the last message in an overwriting sequence (to stdout). const char *format The format string. ... The other arguments. ++++++++++++++++++++++++++++++++++++++*/ void printf_last(const char *format, ...) { va_list ap; va_start(ap,format); vfprintf_last(stdout,format,ap); va_end(ap); } /*++++++++++++++++++++++++++++++++++++++ Print the first message in an overwriting sequence to a specified file. FILE *file The file to write to. const char *format The format string. ... The other arguments. ++++++++++++++++++++++++++++++++++++++*/ void fprintf_first(FILE *file,const char *format, ...) { va_list ap; if(option_logtime) gettimeofday(&function_start_time,NULL); if(option_logmemory) { function_max_alloc=current_alloc; function_max_mmap=current_mmap; } if(option_loggable) return; va_start(ap,format); vfprintf_first(file,format,ap); va_end(ap); } /*++++++++++++++++++++++++++++++++++++++ Print the middle message in an overwriting sequence to a specified file. FILE *file The file to write to. const char *format The format string. ... The other arguments. ++++++++++++++++++++++++++++++++++++++*/ void fprintf_middle(FILE *file,const char *format, ...) { va_list ap; if(option_loggable) return; va_start(ap,format); vfprintf_middle(file,format,ap); va_end(ap); } /*++++++++++++++++++++++++++++++++++++++ Print the last message in an overwriting sequence to a specified file. FILE *file The file to write to. const char *format The format string. ... The other arguments. ++++++++++++++++++++++++++++++++++++++*/ void fprintf_last(FILE *file,const char *format, ...) { va_list ap; va_start(ap,format); vfprintf_last(file,format,ap); va_end(ap); } /*++++++++++++++++++++++++++++++++++++++ Record the memory allocations (record the amount in use). void *address The address that has been allocated. size_t size The size of the memory that has been allocated. ++++++++++++++++++++++++++++++++++++++*/ void log_malloc(void *address,size_t size) { int i; if(!option_logmemory) return; /* Store the information about the allocated memory */ for(i=0;ifunction_max_alloc) function_max_alloc=current_alloc; if(current_alloc>program_max_alloc) program_max_alloc=current_alloc; } /*++++++++++++++++++++++++++++++++++++++ Record the memory de-allocations. void *address The address that has been freed. ++++++++++++++++++++++++++++++++++++++*/ void log_free(void *address) { size_t size=0; int i; if(!option_logmemory) return; /* Remove the information about the allocated memory */ for(i=0;ii) memmove(&mallocedmem[i],&mallocedmem[i+1],(nmallocedmem-i)*sizeof(struct mallocinfo)); /* Reduce the sum of allocated memory */ current_alloc-=size; } /*++++++++++++++++++++++++++++++++++++++ Record the amount of memory that has been mapped into files. size_t size The size of the file that has been mapped. ++++++++++++++++++++++++++++++++++++++*/ void log_mmap(size_t size) { if(!option_logmemory) return; current_mmap+=size; if(current_mmap>function_max_mmap) function_max_mmap=current_mmap; if(current_mmap>program_max_mmap) program_max_mmap=current_mmap; } /*++++++++++++++++++++++++++++++++++++++ Record the amount of memory that has been unmapped from files. size_t size The size of the file that has been unmapped. ++++++++++++++++++++++++++++++++++++++*/ void log_munmap(size_t size) { if(!option_logmemory) return; current_mmap-=size; } /*++++++++++++++++++++++++++++++++++++++ Do the work to print the first message in an overwriting sequence. FILE *file The file to write to. const char *format The format string. va_list ap The other arguments. ++++++++++++++++++++++++++++++++++++++*/ static void vfprintf_first(FILE *file,const char *format,va_list ap) { int retval; if(option_logtime) fprintf_elapsed_time(file,&function_start_time); if(option_logmemory) fprintf_max_memory(file,function_max_alloc,function_max_mmap); retval=vfprintf(file,format,ap); fflush(file); if(retval>0) printed_length=retval; } /*++++++++++++++++++++++++++++++++++++++ Do the work to print the middle message in an overwriting sequence. FILE *file The file to write to. const char *format The format string. va_list ap The other arguments. ++++++++++++++++++++++++++++++++++++++*/ static void vfprintf_middle(FILE *file,const char *format,va_list ap) { int retval; fputc('\r',file); if(option_logtime) fprintf_elapsed_time(file,&function_start_time); if(option_logmemory) fprintf_max_memory(file,function_max_alloc,function_max_mmap); retval=vfprintf(file,format,ap); fflush(file); if(retval>0) { int new_printed_length=retval; while(retval++0) while(retval++tv_sec; elapsed.tv_usec=finish.tv_usec-start->tv_usec; if(elapsed.tv_usec<0) { elapsed.tv_sec -=1; elapsed.tv_usec+=1000000; } if(option_logtime==2) fprintf(file,"[%3ld:%02ld.%06ld] ",elapsed.tv_sec/60,elapsed.tv_sec%60,elapsed.tv_usec); else fprintf(file,"[%3ld:%02ld.%03ld] ",elapsed.tv_sec/60,elapsed.tv_sec%60,elapsed.tv_usec/1000); } /*++++++++++++++++++++++++++++++++++++++ Print the maximum used memory without a following newline. FILE *file The file to print to. size_t max_alloc The maximum amount of allocated memory. size_t max_mmap The maximum amount of memory mapped memory. ++++++++++++++++++++++++++++++++++++++*/ static void fprintf_max_memory(FILE *file,size_t max_alloc,size_t max_mmap) { fprintf(file,"[%4zu,%4zu MB] ",max_alloc/(1024*1024),max_mmap/(1024*1024)); } /*++++++++++++++++++++++++++++++++++++++ Log a fatal error and exit. const char *message The error message. const char *file The file in which the error occured. int line The line number in the file at which the error occured. ++++++++++++++++++++++++++++++++++++++*/ void _logassert(const char *message,const char *file,int line) { fprintf(stderr,"Routino Fatal Error (%s:%d): %s\n",file,line,message); exit(EXIT_FAILURE); } /*++++++++++++++++++++++++++++++++++++++ Create an error message before logging a fatal error and exiting. const char *_logassert_format Returns a constant string. const char *format The error message format string. ... The other arguments. ++++++++++++++++++++++++++++++++++++++*/ const char *_logassert_format(const char *format, ...) { static char string[256]; va_list ap; va_start(ap,format); vsnprintf(string,sizeof(string),format,ap); va_end(ap); return(string); } /*++++++++++++++++++++++++++++++++++++++ Allocate some memory by calling calloc() and checking for failures. void *calloc_logassert Returns the newly allocated pointer. size_t nmemb The number of members in the array to allocate. size_t size The size of the array to allocate. const char *file The file in which the error occured. int line The line number in the file at which the error occured. ++++++++++++++++++++++++++++++++++++++*/ void *_calloc_logassert(size_t nmemb,size_t size,const char *file,int line) { void *temp=calloc(nmemb,size); if(!temp) { char string[64]; sprintf(string,"Failed to allocate %zu bytes of memory",nmemb*size); _logassert(string,file,line); } return temp; } /*++++++++++++++++++++++++++++++++++++++ Allocate some memory by calling malloc() and checking for failures. void *malloc_logassert Returns the newly allocated pointer. size_t size The size of the memory to allocate. const char *file The file in which the error occured. int line The line number in the file at which the error occured. ++++++++++++++++++++++++++++++++++++++*/ void *_malloc_logassert(size_t size,const char *file,int line) { void *temp=malloc(size); if(!temp) { char string[64]; sprintf(string,"Failed to allocate %zu bytes of memory",size); _logassert(string,file,line); } return temp; } /*++++++++++++++++++++++++++++++++++++++ Allocate some memory by calling realloc() and checking for failures. void *realloc_logassert Returns the newly allocated pointer. void *ptr An existing pointer to be reallocated. size_t size The size of the memory to allocate. const char *file The file in which the error occured. int line The line number in the file at which the error occured. ++++++++++++++++++++++++++++++++++++++*/ void *_realloc_logassert(void *ptr,size_t size,const char *file,int line) { void *temp=realloc(ptr,size); if(!temp) { char string[64]; sprintf(string,"Failed to allocate %zu bytes of memory",size); _logassert(string,file,line); } return temp; } routino-3.4.3/src/files.h 644 233 144 11720 14775261234 10466 0/*************************************** Header file for file function prototypes Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef FILES_H #define FILES_H /*+ To stop multiple inclusions. +*/ /* If your system does not have the pread() and pwrite() system calls then you * will need to change this line to the value 0 so that seek() and * read()/write() are used instead of pread()/pwrite(). */ #if defined(_MSC_VER) || defined(__MINGW32__) #define HAVE_PREAD_PWRITE 0 #else #define HAVE_PREAD_PWRITE 1 #endif #if defined(_MSC_VER) #include #include #define read(fd,address,length) _read(fd,address,(unsigned int)(length)) #define write(fd,address,length) _write(fd,address,(unsigned int)(length)) #define ssize_t SSIZE_T #else #include #endif #if defined(_MSC_VER) || defined(__MINGW32__) #undef lseek #define lseek _lseeki64 #endif #include #include #include "logging.h" /* Types */ /*+ A 64-bit file offset since a 32-bit off_t (which is signed) is smaller than a 32-bit size_t (which is unsigned) that can be written to or read from a file. +*/ typedef int64_t offset_t; /* Functions in files.c */ char *FileName(const char *dirname,const char *prefix, const char *name); /* Functions in files.c for mapped files */ void *MapFile(const char *filename); void *MapFileWriteable(const char *filename); void *UnmapFile(const void *address); int SlimMapFile(const char *filename); int SlimMapFileWriteable(const char *filename); int SlimUnmapFile(int fd); /* Functions in files.c for buffered files */ int OpenFileBufferedNew(const char *filename); int OpenFileBufferedAppend(const char *filename); int ReOpenFileBuffered(const char *filename); int ReplaceFileBuffered(const char *filename,int *oldfd); int WriteFileBuffered(int fd,const void *address,size_t length); int ReadFileBuffered(int fd,void *address,size_t length); int SeekFileBuffered(int fd,offset_t position); int SkipFileBuffered(int fd,offset_t skip); int CloseFileBuffered(int fd); int DeleteFileBuffered(const char *filename); /* Functions in files.c for simple files */ int OpenFile(const char *filename); void CloseFile(int fd); int DeleteFile(const char *filename); offset_t SizeFile(const char *filename); offset_t SizeFileFD(int fd); int ExistsFile(const char *filename); int RenameFile(const char *oldfilename,const char *newfilename); /* Functions in files.h */ static inline int SlimReplace(int fd,const void *address,size_t length,offset_t position); static inline int SlimFetch(int fd,void *address,size_t length,offset_t position); /* Inline the frequently called functions */ /*++++++++++++++++++++++++++++++++++++++ Write data to a file that has been opened for slim mode access. int SlimReplace Returns 0 if OK or something else in case of an error. int fd The file descriptor to write to. const void *address The address of the data to be written. size_t length The length of data to write. offset_t position The position in the file to seek to. ++++++++++++++++++++++++++++++++++++++*/ static inline int SlimReplace(int fd,const void *address,size_t length,offset_t position) { /* Seek and write the data */ #if HAVE_PREAD_PWRITE if(pwrite(fd,address,length,position)!=(ssize_t)length) return(-1); #else if(lseek(fd,position,SEEK_SET)!=position) return(-1); if(write(fd,address,length)!=(ssize_t)length) return(-1); #endif return(0); } /*++++++++++++++++++++++++++++++++++++++ Read data from a file that has been opened for slim mode access. int SlimFetch Returns 0 if OK or something else in case of an error. int fd The file descriptor to read from. void *address The address the data is to be read into. size_t length The length of data to read. offset_t position The position in the file to seek to. ++++++++++++++++++++++++++++++++++++++*/ static inline int SlimFetch(int fd,void *address,size_t length,offset_t position) { /* Seek and read the data */ #if HAVE_PREAD_PWRITE if(pread(fd,address,length,position)!=(ssize_t)length) return(-1); #else if(lseek(fd,position,SEEK_SET)!=position) return(-1); if(read(fd,address,length)!=(ssize_t)length) return(-1); #endif return(0); } #endif /* FILES_H */ routino-3.4.3/src/errorlog.c 644 233 144 12763 13755013500 11206 0/*************************************** Error log data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2013, 2019, 2020 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include "types.h" #include "errorlog.h" #include "files.h" /*++++++++++++++++++++++++++++++++++++++ Load in an error log list from a file. ErrorLogs *LoadErrorLogs Returns the error log list. const char *filename The name of the file to load. ++++++++++++++++++++++++++++++++++++++*/ ErrorLogs *LoadErrorLogs(const char *filename) { ErrorLogs *errorlogs; errorlogs=(ErrorLogs*)malloc(sizeof(ErrorLogs)); #if !SLIM errorlogs->data=MapFile(filename); /* Copy the ErrorLogsFile header structure from the loaded data */ errorlogs->file=*((ErrorLogsFile*)errorlogs->data); /* Set the pointers in the ErrorLogs structure. */ errorlogs->offsets =(index_t* )(errorlogs->data+sizeof(ErrorLogsFile)); errorlogs->errorlogs_geo =(ErrorLog*)(errorlogs->data+sizeof(ErrorLogsFile)+(errorlogs->file.latbins*errorlogs->file.lonbins+1)*sizeof(index_t)); errorlogs->errorlogs_nongeo=(ErrorLog*)(errorlogs->data+sizeof(ErrorLogsFile)+(errorlogs->file.latbins*errorlogs->file.lonbins+1)*sizeof(index_t)+errorlogs->file.number_geo*sizeof(ErrorLog)); errorlogs->strings =(char* )(errorlogs->data+sizeof(ErrorLogsFile)+(errorlogs->file.latbins*errorlogs->file.lonbins+1)*sizeof(index_t)+errorlogs->file.number*sizeof(ErrorLog)); #else errorlogs->fd=SlimMapFile(filename); /* Copy the ErrorLogsFile header structure from the loaded data */ SlimFetch(errorlogs->fd,&errorlogs->file,sizeof(ErrorLogsFile),0); errorlogs->offsetsoffset =sizeof(ErrorLogsFile); errorlogs->errorlogsoffset_geo =sizeof(ErrorLogsFile)+(errorlogs->file.latbins*errorlogs->file.lonbins+1)*sizeof(index_t); errorlogs->errorlogsoffset_nongeo=sizeof(ErrorLogsFile)+(errorlogs->file.latbins*errorlogs->file.lonbins+1)*sizeof(index_t)+errorlogs->file.number_geo*sizeof(ErrorLog); errorlogs->stringsoffset =sizeof(ErrorLogsFile)+(errorlogs->file.latbins*errorlogs->file.lonbins+1)*sizeof(index_t)+errorlogs->file.number*sizeof(ErrorLog); #endif return(errorlogs); } /*++++++++++++++++++++++++++++++++++++++ Destroy the node list. ErrorLogs *errorlogs The node list to destroy. ++++++++++++++++++++++++++++++++++++++*/ void DestroyErrorLogs(ErrorLogs *errorlogs) { #if !SLIM errorlogs->data=UnmapFile(errorlogs->data); #else errorlogs->fd=SlimUnmapFile(errorlogs->fd); #endif free(errorlogs); } /*++++++++++++++++++++++++++++++++++++++ Get the latitude and longitude associated with an error log. ErrorLogs *errorlogs The set of error logs to use. index_t index The errorlog index. ErrorLog *errorlogp A pointer to the error log. double *latitude Returns the latitude. double *longitude Returns the logitude. ++++++++++++++++++++++++++++++++++++++*/ void GetErrorLogLatLong(ErrorLogs *errorlogs,index_t index,ErrorLog *errorlogp,double *latitude,double *longitude) { ll_bin_t latbin,lonbin; ll_bin2_t bin=-1; ll_bin2_t start,end,mid; index_t offset; /* Search for offset */ start=0; end=errorlogs->file.lonbins*errorlogs->file.latbins; /* Binary search - search key exact match is wanted else lower bound is acceptable. * * # <- start | Check mid and exit if it matches else move start or end. * # | * # | Since a lower bound match is wanted we can set end=mid-1 or * # <- mid | start=mid if mid doesn't exactly match. * # | * # | Eventually either end=start or end=start+1 and one of * # <- end | start or end is an exact match or the lower bound. */ while((end-start)>1) { mid=start+(end-start)/2; /* Choose mid point (avoid overflow) */ offset=LookupErrorLogOffset(errorlogs,mid); if(offsetindex) /* Mid point is too high */ end=mid-1; else /* Mid point is correct */ {bin=mid;break;} } if(bin==-1) { offset=LookupErrorLogOffset(errorlogs,end); if(offset>index) bin=start; else bin=end; } while(bin<=(errorlogs->file.lonbins*errorlogs->file.latbins) && LookupErrorLogOffset(errorlogs,bin)==LookupErrorLogOffset(errorlogs,bin+1)) bin++; latbin=bin%errorlogs->file.latbins; lonbin=bin/errorlogs->file.latbins; /* Return the values */ if(errorlogp==NULL) errorlogp=LookupErrorLog(errorlogs,index,2); *latitude =latlong_to_radians(bin_to_latlong(errorlogs->file.latzero+latbin)+off_to_latlong(errorlogp->latoffset)); *longitude=latlong_to_radians(bin_to_latlong(errorlogs->file.lonzero+lonbin)+off_to_latlong(errorlogp->lonoffset)); } routino-3.4.3/src/osmpbfparse.c 644 233 144 74415 14454035662 11710 0/*************************************** A simple osm-specific PBF parser where the structure is hard-coded. Part of the Routino routing software. ******************/ /****************** This file Copyright 2012-2015, 2023 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #if defined(_MSC_VER) #include #include #define read(fd,address,length) _read(fd,address,(unsigned int)(length)) #define ssize_t SSIZE_T #else #include #endif #include #include #include #if defined(USE_GZIP) && USE_GZIP #include #endif #include "osmparser.h" #include "tagging.h" #include "logging.h" /* Inside a BlobHeader message */ #define PBF_VAL_BLOBHEADER_TYPE 1 #define PBF_VAL_BLOBHEADER_SIZE 3 /* Inside a Blob message */ #define PBF_VAL_BLOB_RAW_DATA 1 #define PBF_VAL_BLOB_RAW_SIZE 2 #define PBF_VAL_BLOB_ZLIB_DATA 3 /* Inside a HeaderBlock message */ #define PBF_VAL_REQUIRED_FEATURES 4 #define PBF_VAL_OPTIONAL_FEATURES 5 /* Inside a PrimitiveBlock message */ #define PBF_VAL_STRING_TABLE 1 #define PBF_VAL_PRIMITIVE_GROUP 2 #define PBF_VAL_GRANULARITY 17 #define PBF_VAL_LAT_OFFSET 19 #define PBF_VAL_LON_OFFSET 20 /* Inside a PrimitiveGroup message */ #define PBF_VAL_NODES 1 #define PBF_VAL_DENSE_NODES 2 #define PBF_VAL_WAYS 3 #define PBF_VAL_RELATIONS 4 /* Inside a StringTable message */ #define PBF_VAL_STRING 1 /* Inside a Node message */ #define PBF_VAL_NODE_ID 1 #define PBF_VAL_NODE_KEYS 2 #define PBF_VAL_NODE_VALS 3 #define PBF_VAL_NODE_LAT 8 #define PBF_VAL_NODE_LON 9 /* Inside a DenseNode message */ #define PBF_VAL_DENSE_NODE_ID 1 #define PBF_VAL_DENSE_NODE_LAT 8 #define PBF_VAL_DENSE_NODE_LON 9 #define PBF_VAL_DENSE_NODE_KEYS_VALS 10 /* Inside a Way message */ #define PBF_VAL_WAY_ID 1 #define PBF_VAL_WAY_KEYS 2 #define PBF_VAL_WAY_VALS 3 #define PBF_VAL_WAY_REFS 8 /* Inside a Relation message */ #define PBF_VAL_RELATION_ID 1 #define PBF_VAL_RELATION_KEYS 2 #define PBF_VAL_RELATION_VALS 3 #define PBF_VAL_RELATION_ROLES 8 #define PBF_VAL_RELATION_MEMIDS 9 #define PBF_VAL_RELATION_TYPES 10 /* Errors */ #define PBF_EOF 0 #define PBF_ERROR_UNEXP_EOF 100 #define PBF_ERROR_BLOB_HEADER_LEN 101 #define PBF_ERROR_BLOB_LEN 102 #define PBF_ERROR_NOT_OSM 103 #define PBF_ERROR_BLOB_BOTH 104 #define PBF_ERROR_BLOB_NEITHER 105 #define PBF_ERROR_NO_GZIP 106 #define PBF_ERROR_GZIP_INIT 107 #define PBF_ERROR_GZIP_INFLATE 108 #define PBF_ERROR_GZIP_WRONG_LEN 109 #define PBF_ERROR_GZIP_END 110 #define PBF_ERROR_UNSUPPORTED 111 #define PBF_ERROR_TOO_MANY_GROUPS 112 /* Local parsing variables (re-initialised for each file) */ static uint64_t byteno; static uint64_t nnodes,nways,nrelations; static uint32_t buffer_allocated,zbuffer_allocated; static unsigned char *buffer=NULL,*zbuffer=NULL; static unsigned char *buffer_ptr,*buffer_end; static int string_table_length=0,string_table_allocated=0; static unsigned char **string_table=NULL; static uint32_t *string_table_string_lengths=NULL; static int32_t granularity=100; static int64_t lat_offset=0,lon_offset=0; #define LENGTH_32M (32*1024*1024) /*++++++++++++++++++++++++++++++++++++++ Refill the data buffer and set the pointers. int buffer_refill Return 0 if everything is OK or 1 for EOF. int fd The file descriptor to read from. uint32_t bytes The number of bytes to read. ++++++++++++++++++++++++++++++++++++++*/ static inline int buffer_refill(int fd,uint32_t bytes) { ssize_t n; if(bytes>buffer_allocated) buffer=(unsigned char *)realloc(buffer,buffer_allocated=bytes); byteno+=bytes; buffer_ptr=buffer; buffer_end=buffer; do { n=read(fd,buffer_end,bytes); if(n<=0) return(1); buffer_end+=n; bytes-=n; } while(bytes>0); return(0); } #if defined(USE_GZIP) && USE_GZIP static int uncompress_pbf(unsigned char *data,uint32_t compressed,uint32_t uncompressed); #endif /* USE_GZIP */ static void process_string_table(unsigned char *data,uint32_t length); static void process_primitive_group(unsigned char *data,uint32_t length); static void process_nodes(unsigned char *data,uint32_t length); static void process_dense_nodes(unsigned char *data,uint32_t length); static void process_ways(unsigned char *data,uint32_t length); static void process_relations(unsigned char *data,uint32_t length); /* Macros to simplify the parser (and make it look more like the XML parser) */ #define BEGIN(xx) do{ state=(xx); goto finish_parsing; } while(0) #define BUFFER_CHARS_EOF(xx) do{ if(buffer_refill(fd,(xx))) BEGIN(PBF_EOF); } while(0) #define BUFFER_CHARS(xx) do{ if(buffer_refill(fd,(xx))) BEGIN(PBF_ERROR_UNEXP_EOF); } while(0) /* PBF decoding */ #define PBF_FIELD(xx) (int)(((xx)&0xFFF8)>>3) #define PBF_TYPE(xx) (int)((xx)&0x0007) #define PBF_LATITUDE(xx) (double)(1E-9*(granularity*(xx)+lat_offset)) #define PBF_LONGITUDE(xx) (double)(1E-9*(granularity*(xx)+lon_offset)) /*++++++++++++++++++++++++++++++++++++++ Parse a PBF int32 data value. uint32_t pbf_int32 Returns the integer value. unsigned char **ptr The pointer to read the data from. ++++++++++++++++++++++++++++++++++++++*/ static inline uint32_t pbf_int32(unsigned char **ptr) { uint32_t result=(**ptr)&0x7F; if((**ptr)&0x80) result+=((*++(*ptr))&0x7F)<<7; if((**ptr)&0x80) result+=((*++(*ptr))&0x7F)<<14; if((**ptr)&0x80) result+=((*++(*ptr))&0x7F)<<21; if((**ptr)&0x80) result+=((*++(*ptr))&0x7F)<<28; (*ptr)++; return(result); } /*++++++++++++++++++++++++++++++++++++++ Parse a PBF int64 data value. int64_t pbf_int64 Returns the integer value. unsigned char **ptr The pointer to read the data from. ++++++++++++++++++++++++++++++++++++++*/ static inline int64_t pbf_int64(unsigned char **ptr) { uint64_t result=(**ptr)&0x7F; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<7; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<14; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<21; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<28; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<35; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<42; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<49; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<56; if((**ptr)&0x80) result+=(uint64_t)((*++(*ptr))&0x7F)<<63; (*ptr)++; return(result); } /*++++++++++++++++++++++++++++++++++++++ Parse a PBF sint64 data value. int64_t pbf_sint64 Returns the integer value. unsigned char **ptr The pointer to read the data from. ++++++++++++++++++++++++++++++++++++++*/ static inline int64_t pbf_sint64(unsigned char **ptr) { int64_t result=((**ptr)&0x7E)>>1; int sign=(**ptr)&0x01; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<6; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<13; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<20; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<27; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<34; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<41; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<48; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<55; if((**ptr)&0x80) result+=(int64_t)((*++(*ptr))&0x7F)<<62; (*ptr)++; if(sign) result=-result-1; return(result); } /*++++++++++++++++++++++++++++++++++++++ Parse a PBF length delimited data value. unsigned char *pbf_length_delimited Returns a pointer to the start of the data. unsigned char **ptr The pointer to read the data from. uint32_t *length Returns the length of the data. ++++++++++++++++++++++++++++++++++++++*/ static inline unsigned char *pbf_length_delimited(unsigned char **ptr,uint32_t *length) { uint32_t len=pbf_int32(ptr); if(length) *length=len; *ptr+=len; return(*ptr-len); } /*++++++++++++++++++++++++++++++++++++++ Skip any pbf field from a message. unsigned char **ptr The pointer to read the data from. int type The type of the data. ++++++++++++++++++++++++++++++++++++++*/ static inline void pbf_skip(unsigned char **ptr,int type) { uint32_t length; switch(type) { case 0: /* varint */ while((**ptr)&0x80) (*ptr)++; (*ptr)++; break; case 1: /* 64-bit */ *ptr+=8; break; case 2: /* length delimited */ length=pbf_int32(ptr); *ptr+=length; break; case 3: /* deprecated */ break; case 4: /* deprecated */ break; case 5: /* 32-bit */ *ptr+=4; break; } } /*++++++++++++++++++++++++++++++++++++++ Parse the PBF and call the functions for each OSM item as seen. int ParsePBF Returns 0 if OK or something else in case of an error. int fd The file descriptor of the file to parse. ++++++++++++++++++++++++++++++++++++++*/ static int ParsePBF(int fd) { int state; unsigned char *error=NULL; /* Print the initial message */ printf_first("Reading: Bytes=0 Nodes=0 Ways=0 Relations=0"); /* The actual parser. */ byteno=0; nnodes=0,nways=0,nrelations=0; string_table_allocated=16384; string_table_length=0; string_table=(unsigned char **)malloc(string_table_allocated*sizeof(unsigned char *)); string_table_string_lengths=(uint32_t *)malloc(string_table_allocated*sizeof(uint32_t)); zbuffer_allocated=0; zbuffer=NULL; buffer_allocated=65536; buffer=(unsigned char*)malloc(buffer_allocated); buffer_ptr=buffer_end=buffer; while(1) { int32_t blob_header_length=0; int osm_data=0,osm_header=0; int32_t blob_length=0; uint32_t raw_size=0,compressed_size=0,uncompressed_size=0; unsigned char *raw_data=NULL,*zlib_data=NULL; uint32_t length; unsigned char *data; /* ================ Parsing states ================ */ BUFFER_CHARS_EOF(4); blob_header_length=(256*(256*(256*(int)buffer_ptr[0])+(int)buffer_ptr[1])+(int)buffer_ptr[2])+buffer_ptr[3]; buffer_ptr+=4; if(blob_header_length==0 || blob_header_length>LENGTH_32M) BEGIN(PBF_ERROR_BLOB_HEADER_LEN); BUFFER_CHARS(blob_header_length); osm_header=0; osm_data=0; while(buffer_ptrLENGTH_32M) BEGIN(PBF_ERROR_BLOB_LEN); if(!osm_data && !osm_header) BEGIN(PBF_ERROR_NOT_OSM); BUFFER_CHARS(blob_length); while(buffer_ptr(sizeof(primitive_group)/sizeof(primitive_group[0]))) BEGIN(PBF_ERROR_TOO_MANY_GROUPS); break; case PBF_VAL_GRANULARITY: /* int32 */ granularity=pbf_int32(&buffer_ptr); break; case PBF_VAL_LAT_OFFSET: /* int64 */ lat_offset=pbf_int64(&buffer_ptr); break; case PBF_VAL_LON_OFFSET: /* int64 */ lon_offset=pbf_int64(&buffer_ptr); break; default: pbf_skip(&buffer_ptr,PBF_TYPE(fieldtype)); } } if(nprimitive_groups) for(i=0;izbuffer_allocated) zbuffer=(unsigned char *)realloc(zbuffer,zbuffer_allocated=uncompressed); if(inflateInit2(&z,15+32)!=Z_OK) return(PBF_ERROR_GZIP_INIT); z.next_in=data; z.avail_in=compressed; z.next_out=zbuffer; z.avail_out=uncompressed; if(inflate(&z,Z_FINISH)!=Z_STREAM_END) return(PBF_ERROR_GZIP_INFLATE); if(z.avail_out!=0) return(PBF_ERROR_GZIP_WRONG_LEN); if(inflateEnd(&z)!=Z_OK) return(PBF_ERROR_GZIP_END); buffer_ptr=zbuffer; buffer_end=zbuffer+uncompressed; return(0); } #endif /* USE_GZIP */ /*++++++++++++++++++++++++++++++++++++++ Parse a PBF format OSM file (from planet download). int ParsePBFFile Returns 0 if OK or something else in case of an error. int fd The file descriptor of the file to read from. NodesX *OSMNodes The data structure of nodes to fill in. WaysX *OSMWays The data structure of ways to fill in. RelationsX *OSMRelations The data structure of relations to fill in. ++++++++++++++++++++++++++++++++++++++*/ int ParsePBFFile(int fd,NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations) { int retval; /* Initialise the parser */ InitialiseParser(OSMNodes,OSMWays,OSMRelations); /* Parse the file */ retval=ParsePBF(fd); /* Cleanup the parser */ CleanupParser(); return(retval); } routino-3.4.3/src/fakes.c 644 233 144 27550 12563633051 10451 0/*************************************** Fake node and segment generation. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include "types.h" #include "nodes.h" #include "segments.h" #include "fakes.h" /*+ The minimum distance along a segment from a node to insert a fake node. (in km). +*/ #define MINSEGMENT 0.005 /* Local variables (re-initialised by DeleteFakeNodes() function) */ /*+ A set of fake segments to allow start/finish in the middle of a segment. +*/ static Segment fake_segments[4*NWAYPOINTS+1]; /*+ A set of pointers to the real segments underlying the fake segments. +*/ static index_t real_segments[4*NWAYPOINTS+1]; /*+ A set of fake node latitudes and longitudes. +*/ static double fake_lon[NWAYPOINTS+1],fake_lat[NWAYPOINTS+1]; /*+ The previous waypoint. +*/ static int prevpoint=0; /*++++++++++++++++++++++++++++++++++++++ Create a pair of fake segments corresponding to the given segment split in two (and will create an extra two fake segments if adjacent waypoints are on the same segment). index_t CreateFakes Returns the fake node index (or a real one in special cases). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. int point Which of the waypoints this is. Segment *segmentp The segment to split. index_t node1 The first node at the end of this segment. index_t node2 The second node at the end of this segment. distance_t dist1 The distance to the first node. distance_t dist2 The distance to the second node. ++++++++++++++++++++++++++++++++++++++*/ index_t CreateFakes(Nodes *nodes,Segments *segments,int point,Segment *segmentp,index_t node1,index_t node2,distance_t dist1,distance_t dist2) { index_t fakenode; double lat1,lon1,lat2,lon2; /* Initialise all the connecting segments to fake values */ fake_segments[4*point-4].node1=NO_NODE; fake_segments[4*point-4].node2=NO_NODE; fake_segments[4*point-3].node1=NO_NODE; fake_segments[4*point-3].node2=NO_NODE; fake_segments[4*point-2].node1=NO_NODE; fake_segments[4*point-2].node2=NO_NODE; fake_segments[4*point-1].node1=NO_NODE; fake_segments[4*point-1].node2=NO_NODE; /* Check if we are actually close enough to an existing node */ if(dist1<=km_to_distance(MINSEGMENT) && dist2>km_to_distance(MINSEGMENT)) { prevpoint=point; return(node1); } if(dist2<=km_to_distance(MINSEGMENT) && dist1>km_to_distance(MINSEGMENT)) { prevpoint=point; return(node2); } if(dist1<=km_to_distance(MINSEGMENT) && dist2<=km_to_distance(MINSEGMENT)) { prevpoint=point; if(dist13 && lat2<-3) lat2+=2*M_PI; else if(lat1<-3 && lat2>3) lat1+=2*M_PI; fake_lat[point]=lat1+(lat2-lat1)*(double)dist1/(double)(dist1+dist2); /* (dist1+dist2) must be > 0 */ fake_lon[point]=lon1+(lon2-lon1)*(double)dist1/(double)(dist1+dist2); /* (dist1+dist2) must be > 0 */ if(fake_lat[point]>M_PI) fake_lat[point]-=2*M_PI; /* * node1 fakenode node2 * #----------*----------------------------# real_segments[4*point-{4,3}] * * #----------* fake_segments[4*point-4] * *----------------------------# fake_segments[4*point-3] * * * node1 fakenode[prevpoint] node2 * #----------*------------------%---------# real_segments[4*prevpoint-{4,3,1}], real_segments[4*point-{4,3,2}] * fakenode[point] * #----------* fake_segments[4*prevpoint-4] * *----------------------------# fake_segments[4*prevpoint-3] * *------------------% fake_segments[4*prevpoint-1] * #-----------------------------% fake_segments[4*point-4] * %---------# fake_segments[4*point-3] * *------------------% fake_segments[4*point-2] */ /* Create the first fake segment */ fake_segments[4*point-4]=*segmentp; fake_segments[4*point-4].node2=fakenode; fake_segments[4*point-4].distance=DISTANCE(dist1)|DISTFLAG(segmentp->distance); real_segments[4*point-4]=IndexSegment(segments,segmentp); /* Create the second fake segment */ fake_segments[4*point-3]=*segmentp; fake_segments[4*point-3].node1=fakenode; fake_segments[4*point-3].distance=DISTANCE(dist2)|DISTFLAG(segmentp->distance); real_segments[4*point-3]=IndexSegment(segments,segmentp); /* Create a third fake segment to join adjacent points if both are fake and on the same real segment */ if(prevpoint>0 && fake_segments[4*prevpoint-4].node1==node1 && fake_segments[4*prevpoint-3].node2==node2) { if(DISTANCE(dist1)>DISTANCE(fake_segments[4*prevpoint-4].distance)) /* point is further from node1 than prevpoint */ { fake_segments[4*point-2]=fake_segments[4*prevpoint-3]; fake_segments[4*point-2].node2=fakenode; fake_segments[4*point-2].distance=(DISTANCE(dist1)-DISTANCE(fake_segments[4*prevpoint-4].distance))|DISTFLAG(segmentp->distance); } else { fake_segments[4*point-2]=fake_segments[4*prevpoint-4]; fake_segments[4*point-2].node1=fakenode; fake_segments[4*point-2].distance=(DISTANCE(fake_segments[4*prevpoint-4].distance)-DISTANCE(dist1))|DISTFLAG(segmentp->distance); } real_segments[4*point-2]=IndexSegment(segments,segmentp); fake_segments[4*prevpoint-1]=fake_segments[4*point-2]; real_segments[4*prevpoint-1]=real_segments[4*point-2]; } /* Return the fake node */ prevpoint=point; return(fakenode); } /*++++++++++++++++++++++++++++++++++++++ Create a fake segment connecting a node to itself. index_t CreateFakeNullSegment Returns the index of a fake segment. Segments *segments The list of segments to use. index_t node The node that is to be linked. index_t segment The segment that is to be emulated. int point The waypoint number. ++++++++++++++++++++++++++++++++++++++*/ index_t CreateFakeNullSegment(Segments *segments,index_t node,index_t segment,int point) { Segment *segmentp=LookupSegment(segments,segment,1); fake_segments[4*point-2].node1=node; fake_segments[4*point-2].node2=node; fake_segments[4*point-2].way=segmentp->way; fake_segments[4*point-2].distance=0; return(4*point-2+SEGMENT_FAKE); } /*++++++++++++++++++++++++++++++++++++++ Re-initialise the fake node data storage. ++++++++++++++++++++++++++++++++++++++*/ void DeleteFakeNodes(void) { unsigned int i; for(i=0;i. ***************************************/ #include #include #include #include #include "types.h" #include "typesx.h" #include "nodesx.h" #include "waysx.h" #include "relationsx.h" #include "osmparser.h" #include "tagging.h" #include "logging.h" /* Macros */ /*+ Checks if a value in the XML is one of the allowed values for true. +*/ #define ISTRUE(xx) (!strcmp(xx,"true") || !strcmp(xx,"yes") || !strcmp(xx,"1")) /*+ Checks if a value in the XML is one of the allowed values for false. +*/ #define ISFALSE(xx) (!strcmp(xx,"false") || !strcmp(xx,"no") || !strcmp(xx,"0")) /* Local parsing variables (re-initialised for each file) */ static NodesX *nodes; static WaysX *ways; static RelationsX *relations; static node_t *way_nodes; static int way_nnodes; static node_t *relation_nodes; static int relation_nnodes; static way_t *relation_ways; static int relation_nways; static relation_t *relation_relations; static int relation_nrelations; static way_t relation_from; static int relation_from_count; static way_t relation_to; static int relation_to_count; static node_t relation_via; static int relation_via_count; /* Local parsing functions */ static void ProcessNodeTags(TagList *tags,int64_t node_id,double latitude,double longitude,int mode); static void ProcessWayTags(TagList *tags,int64_t way_id, int mode); static void ProcessRelationTags(TagList *tags,int64_t relation_id,int mode); static double parse_speed(way_t id,const char *k,const char *v); static double parse_weight(way_t id,const char *k,const char *v); static double parse_length(way_t id,const char *k,const char *v); /*++++++++++++++++++++++++++++++++++++++ Initialise the OSM parser by initialising the local variables. NodesX *OSMNodes The data structure of nodes to fill in. WaysX *OSMWays The data structure of ways to fill in. RelationsX *OSMRelations The data structure of relations to fill in. ++++++++++++++++++++++++++++++++++++++*/ void InitialiseParser(NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations) { /* Copy the function parameters and initialise the variables */ nodes=OSMNodes; ways=OSMWays; relations=OSMRelations; way_nodes=(node_t*)malloc(256*sizeof(node_t)); relation_nodes =(node_t *)malloc(256*sizeof(node_t)); relation_ways =(way_t *)malloc(256*sizeof(way_t)); relation_relations=(relation_t*)malloc(256*sizeof(relation_t)); } /*++++++++++++++++++++++++++++++++++++++ Clean up the memory after parsing. ++++++++++++++++++++++++++++++++++++++*/ void CleanupParser(void) { /* Free the variables */ free(way_nodes); free(relation_nodes); free(relation_ways); free(relation_relations); } /*++++++++++++++++++++++++++++++++++++++ Add node references to a way. int64_t node_id The node ID to add or zero to clear the list. ++++++++++++++++++++++++++++++++++++++*/ void AddWayRefs(int64_t node_id) { if(node_id==0) way_nnodes=0; else { node_t id; if(way_nnodes && (way_nnodes%256)==0) way_nodes=(node_t*)realloc((void*)way_nodes,(way_nnodes+256)*sizeof(node_t)); id=(node_t)node_id; logassert((int64_t)id==node_id,"Node ID too large (change node_t to 64-bits?)"); /* check node id can be stored in node_t data type. */ way_nodes[way_nnodes++]=id; } } /*++++++++++++++++++++++++++++++++++++++ Add node, way or relation references to a relation. int64_t node_id The node ID to add or zero if it is not a node. int64_t way_id The way ID to add or zero if it is not a way. int64_t relation_id The relation ID to add or zero if it is not a relation. const char *role The role played by this referenced item or NULL. If all of node_id, way_id and relation_id are zero then the list is cleared. ++++++++++++++++++++++++++++++++++++++*/ void AddRelationRefs(int64_t node_id,int64_t way_id,int64_t relation_id,const char *role) { if(node_id==0 && way_id==0 && relation_id==0) { relation_nnodes=0; relation_nways=0; relation_nrelations=0; relation_from=NO_WAY_ID; relation_from_count=0; relation_from_count=0; relation_to=NO_WAY_ID; relation_to_count=0; relation_via=NO_NODE_ID; relation_via_count=0; } else if(node_id!=0) { node_t id; id=(node_t)node_id; logassert((int64_t)id==node_id,"Node ID too large (change node_t to 64-bits?)"); /* check node id can be stored in node_t data type. */ if(relation_nnodes && (relation_nnodes%256)==0) relation_nodes=(node_t*)realloc((void*)relation_nodes,(relation_nnodes+256)*sizeof(node_t)); relation_nodes[relation_nnodes++]=id; if(role) { if(!strcmp(role,"via")) { relation_via_count++; if(relation_via==NO_NODE_ID) relation_via=id; } } } else if(way_id!=0) { way_t id; id=(way_t)way_id; logassert((int64_t)id==way_id,"Way ID too large (change way_t to 64-bits?)"); /* check way id can be stored in way_t data type. */ if(relation_nways && (relation_nways%256)==0) relation_ways=(way_t*)realloc((void*)relation_ways,(relation_nways+256)*sizeof(way_t)); relation_ways[relation_nways++]=id; if(role) { if(!strcmp(role,"from")) { relation_from_count++; if(relation_from==NO_WAY_ID) relation_from=id; } else if(!strcmp(role,"to")) { relation_to_count++; if(relation_to==NO_WAY_ID) relation_to=id; } } } else /* if(relation_id!=0) */ { relation_t id; id=(relation_t)relation_id; logassert((int64_t)id==relation_id,"Relation ID too large (change relation_t to 64-bits?)"); /* check relation id can be stored in relation_t data type. */ if(relation_nrelations && (relation_nrelations%256)==0) relation_relations=(relation_t*)realloc((void*)relation_relations,(relation_nrelations+256)*sizeof(relation_t)); relation_relations[relation_nrelations++]=relation_id; } } /*++++++++++++++++++++++++++++++++++++++ Add a node after processing the tags associated with it. int64_t node_id The id of the node. double latitude The latitude of the node. double longitude The longitude of the node. int mode The mode of operation to take (create, modify, delete). TagList *raw_tags The accumulated set of tags for the node. ++++++++++++++++++++++++++++++++++++++*/ void AddNode(int64_t node_id,double latitude,double longitude,int mode,TagList *raw_tags) { TagList *processed_tags=ApplyNodeTaggingRules(raw_tags,node_id); ProcessNodeTags(processed_tags,node_id,latitude,longitude,mode); DeleteTagList(raw_tags); DeleteTagList(processed_tags); } /*++++++++++++++++++++++++++++++++++++++ Add a way after processing the tags associated with it. int64_t way_id The id of the way. int mode The mode of operation to take (create, modify, delete). TagList *raw_tags The accumulated set of tags for the node. ++++++++++++++++++++++++++++++++++++++*/ void AddWay(int64_t way_id,int mode,TagList *raw_tags) { TagList *processed_tags=ApplyWayTaggingRules(raw_tags,way_id); ProcessWayTags(processed_tags,way_id,mode); DeleteTagList(raw_tags); DeleteTagList(processed_tags); } /*++++++++++++++++++++++++++++++++++++++ Add a relation after processing the tags associated with it. int64_t relation_id The id of the relation. int mode The mode of operation to take (create, modify, delete). TagList *raw_tags The accumulated set of tags for the node. ++++++++++++++++++++++++++++++++++++++*/ void AddRelation(int64_t relation_id,int mode,TagList *raw_tags) { TagList *processed_tags=ApplyRelationTaggingRules(raw_tags,relation_id); ProcessRelationTags(processed_tags,relation_id,mode); DeleteTagList(raw_tags); DeleteTagList(processed_tags); } /*++++++++++++++++++++++++++++++++++++++ Process the tags associated with a node. TagList *tags The list of node tags. int64_t node_id The id of the node. double latitude The latitude of the node. double longitude The longitude of the node. int mode The mode of operation to take (create, modify, delete). ++++++++++++++++++++++++++++++++++++++*/ static void ProcessNodeTags(TagList *tags,int64_t node_id,double latitude,double longitude,int mode) { transports_t allow=Transports_ALL; nodeflags_t flags=0; node_t id; int i; /* Convert id */ id=(node_t)node_id; logassert((int64_t)id==node_id,"Node ID too large (change node_t to 64-bits?)"); /* check node id can be stored in node_t data type. */ /* Delete */ if(mode==MODE_DELETE) { AppendNodeList(nodes,id,degrees_to_radians(latitude),degrees_to_radians(longitude),allow,NODE_DELETED); return; } /* Parse the tags */ for(i=0;intags;i++) { int recognised=0; char *k=tags->k[i]; char *v=tags->v[i]; switch(*k) { case 'b': if(!strcmp(k,"bicycle")) { if(ISFALSE(v)) allow&=~Transports_Bicycle; else if(!ISTRUE(v)) logerror("Node %"Pnode_t" has an unrecognised tag 'bicycle' = '%s' (after tagging rules); using 'yes'.\n",logerror_node(id),v); recognised=1; break; } break; case 'f': if(!strcmp(k,"foot")) { if(ISFALSE(v)) allow&=~Transports_Foot; else if(!ISTRUE(v)) logerror("Node %"Pnode_t" has an unrecognised tag 'foot' = '%s' (after tagging rules); using 'yes'.\n",logerror_node(id),v); recognised=1; break; } break; case 'g': if(!strcmp(k,"goods")) { if(ISFALSE(v)) allow&=~Transports_Goods; else if(!ISTRUE(v)) logerror("Node %"Pnode_t" has an unrecognised tag 'goods' = '%s' (after tagging rules); using 'yes'.\n",logerror_node(id),v); recognised=1; break; } break; case 'h': if(!strcmp(k,"horse")) { if(ISFALSE(v)) allow&=~Transports_Horse; else if(!ISTRUE(v)) logerror("Node %"Pnode_t" has an unrecognised tag 'horse' = '%s' (after tagging rules); using 'yes'.\n",logerror_node(id),v); recognised=1; break; } if(!strcmp(k,"hgv")) { if(ISFALSE(v)) allow&=~Transports_HGV; else if(!ISTRUE(v)) logerror("Node %"Pnode_t" has an unrecognised tag 'hgv' = '%s' (after tagging rules); using 'yes'.\n",logerror_node(id),v); recognised=1; break; } break; case 'm': if(!strcmp(k,"moped")) { if(ISFALSE(v)) allow&=~Transports_Moped; else if(!ISTRUE(v)) logerror("Node %"Pnode_t" has an unrecognised tag 'moped' = '%s' (after tagging rules); using 'yes'.\n",logerror_node(id),v); recognised=1; break; } if(!strcmp(k,"motorcycle")) { if(ISFALSE(v)) allow&=~Transports_Motorcycle; else if(!ISTRUE(v)) logerror("Node %"Pnode_t" has an unrecognised tag 'motorcycle' = '%s' (after tagging rules); using 'yes'.\n",logerror_node(id),v); recognised=1; break; } if(!strcmp(k,"motorcar")) { if(ISFALSE(v)) allow&=~Transports_Motorcar; else if(!ISTRUE(v)) logerror("Node %"Pnode_t" has an unrecognised tag 'motorcar' = '%s' (after tagging rules); using 'yes'.\n",logerror_node(id),v); recognised=1; break; } break; case 'p': if(!strcmp(k,"psv")) { if(ISFALSE(v)) allow&=~Transports_PSV; else if(!ISTRUE(v)) logerror("Node %"Pnode_t" has an unrecognised tag 'psv' = '%s' (after tagging rules); using 'yes'.\n",logerror_node(id),v); recognised=1; break; } break; case 'r': if(!strcmp(k,"roundabout")) { if(ISTRUE(v)) flags|=NODE_MINIRNDBT; else logerror("Node %"Pnode_t" has an unrecognised tag 'roundabout' = '%s' (after tagging rules); using 'no'.\n",id,v); recognised=1; break; } break; case 'w': if(!strcmp(k,"wheelchair")) { if(ISFALSE(v)) allow&=~Transports_Wheelchair; else if(!ISTRUE(v)) logerror("Node %"Pnode_t" has an unrecognised tag 'wheelchair' = '%s' (after tagging rules); using 'yes'.\n",logerror_node(id),v); recognised=1; break; } break; default: break; } if(!recognised) logerror("Node %"Pnode_t" has an unrecognised tag '%s' = '%s' (after tagging rules); ignoring it.\n",logerror_node(id),k,v); } /* Create the node */ AppendNodeList(nodes,id,degrees_to_radians(latitude),degrees_to_radians(longitude),allow,flags); } /*++++++++++++++++++++++++++++++++++++++ Process the tags associated with a way. TagList *tags The list of way tags. int64_t way_id The id of the way. int mode The mode of operation to take (create, modify, delete). ++++++++++++++++++++++++++++++++++++++*/ static void ProcessWayTags(TagList *tags,int64_t way_id,int mode) { Way way={0}; int oneway=0,area=0; int roundabout=0,lanes=0,cyclebothways=0; char *name=NULL,*ref=NULL,*refname=NULL; way_t id; int i; /* Convert id */ id=(way_t)way_id; logassert((int64_t)id==way_id,"Way ID too large (change way_t to 64-bits?)"); /* check way id can be stored in way_t data type. */ /* Delete */ if(mode==MODE_DELETE || mode==MODE_MODIFY) { way.type=WAY_DELETED; AppendWayList(ways,id,&way,way_nodes,way_nnodes,""); } if(mode==MODE_DELETE) return; /* Sanity check */ if(way_nnodes==0) { logerror("Way %"Pway_t" has no nodes.\n",logerror_way(id)); return; } if(way_nnodes==1) { logerror_node(way_nodes[0]); /* Extra logerror information since way isn't stored */ logerror("Way %"Pway_t" has only one node.\n",logerror_way(id)); return; } /* Parse the tags - just look for highway */ for(i=0;intags;i++) { char *k=tags->k[i]; char *v=tags->v[i]; if(!strcmp(k,"highway")) { way.type=HighwayType(v); if(way.type==Highway_None) logerror("Way %"Pway_t" has an unrecognised highway type '%s' (after tagging rules); ignoring it.\n",logerror_way(id),v); break; } } /* Don't continue if this is not a highway (bypass error logging) */ if(way.type==Highway_None) return; /* Parse the tags - look for the others */ for(i=0;intags;i++) { int recognised=0; char *k=tags->k[i]; char *v=tags->v[i]; switch(*k) { case 'a': if(!strcmp(k,"area")) { if(ISTRUE(v)) area=1; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'area' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 'b': if(!strcmp(k,"bicycle")) { if(ISTRUE(v)) way.allow|=Transports_Bicycle; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'bicycle' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } if(!strcmp(k,"bicycleroute")) { if(ISTRUE(v)) way.props|=Properties_BicycleRoute; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'bicycleroute' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } if(!strcmp(k,"bridge")) { if(ISTRUE(v)) way.props|=Properties_Bridge; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'bridge' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 'c': if(!strcmp(k,"cyclebothways")) { if(ISTRUE(v)) cyclebothways=1; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'cyclebothways' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 'f': if(!strcmp(k,"foot")) { if(ISTRUE(v)) way.allow|=Transports_Foot; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'foot' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } if(!strcmp(k,"footroute")) { if(ISTRUE(v)) way.props|=Properties_FootRoute; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'footroute' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 'g': if(!strcmp(k,"goods")) { if(ISTRUE(v)) way.allow|=Transports_Goods; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'goods' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 'h': if(!strcmp(k,"highway")) {recognised=1; break;} if(!strcmp(k,"horse")) { if(ISTRUE(v)) way.allow|=Transports_Horse; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'horse' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } if(!strcmp(k,"hgv")) { if(ISTRUE(v)) way.allow|=Transports_HGV; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'hgv' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 'l': if(!strcmp(k,"lanes")) { int en=0; float lanesf; if(sscanf(v,"%f%n",&lanesf,&en)==1 && en && !v[en]) lanes=(int)lanesf; else logerror("Way %"Pway_t" has an unrecognised tag 'lanes' = '%s' (after tagging rules); ignoring it.\n",logerror_way(id),v); recognised=1; break; } break; case 'm': if(!strncmp(k,"max",3)) { if(!strcmp(k+3,"speed")) { way.speed=kph_to_speed(parse_speed(id,k,v)); recognised=1; break; } if(!strcmp(k+3,"weight")) { way.weight=tonnes_to_weight(parse_weight(id,k,v)); recognised=1; break; } if(!strcmp(k+3,"height")) { way.height=metres_to_height(parse_length(id,k,v)); recognised=1; break; } if(!strcmp(k+3,"width")) { way.width=metres_to_height(parse_length(id,k,v)); recognised=1; break; } if(!strcmp(k+3,"length")) { way.length=metres_to_height(parse_length(id,k,v)); recognised=1; break; } } if(!strcmp(k,"moped")) { if(ISTRUE(v)) way.allow|=Transports_Moped; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'moped' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } if(!strcmp(k,"motorcycle")) { if(ISTRUE(v)) way.allow|=Transports_Motorcycle; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'motorcycle' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } if(!strcmp(k,"motorcar")) { if(ISTRUE(v)) way.allow|=Transports_Motorcar; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'motorcar' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } if(!strcmp(k,"multilane")) { if(ISTRUE(v)) way.props|=Properties_Multilane; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'multilane' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 'n': if(!strcmp(k,"name")) { name=v; recognised=1; break; } break; case 'o': if(!strcmp(k,"oneway")) { if(ISTRUE(v)) oneway=1; else if(!strcmp(v,"-1")) oneway=-1; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'oneway' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 'p': if(!strcmp(k,"paved")) { if(ISTRUE(v)) way.props|=Properties_Paved; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'paved' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } if(!strcmp(k,"psv")) { if(ISTRUE(v)) way.allow|=Transports_PSV; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'psv' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 'r': if(!strcmp(k,"ref")) { ref=v; recognised=1; break; } if(!strcmp(k,"roundabout")) { if(ISTRUE(v)) roundabout=1; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'roundabout' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 't': if(!strcmp(k,"tunnel")) { if(ISTRUE(v)) way.props|=Properties_Tunnel; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'tunnel' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; case 'w': if(!strcmp(k,"wheelchair")) { if(ISTRUE(v)) way.allow|=Transports_Wheelchair; else if(!ISFALSE(v)) logerror("Way %"Pway_t" has an unrecognised tag 'wheelchair' = '%s' (after tagging rules); using 'no'.\n",logerror_way(id),v); recognised=1; break; } break; default: break; } if(!recognised) logerror("Way %"Pway_t" has an unrecognised tag '%s' = '%s' (after tagging rules); ignoring it.\n",logerror_way(id),k,v); } /* Create the way */ if(area && oneway) { logerror("Way %"Pway_t" is an area and oneway; ignoring area tag.\n",logerror_way(id)); area=0; } if(cyclebothways && !oneway) { logerror("Way %"Pway_t" is cyclebothways but not oneway; ignoring cyclebothways tag.\n",logerror_way(id)); cyclebothways=0; } if(roundabout && !oneway) { logerror("Way %"Pway_t" is roundabout but not oneway; adding oneway tag.\n",logerror_way(id)); oneway=1; } if(!way.allow) return; if(cyclebothways) way.type|=Highway_CycleBothWays; if(oneway) { way.type|=Highway_OneWay; if(oneway==-1) for(i=0;i1) way.props|=Properties_Multilane; if(oneway && lanes==1) way.props&=~Properties_Multilane; } if(ref && name) { refname=(char*)malloc(strlen(ref)+strlen(name)+4); sprintf(refname,"%s (%s)",name,ref); } else if(ref && !name) refname=ref; else if(!ref && name) refname=name; else /* if(!ref && !name) */ refname=""; AppendWayList(ways,id,&way,way_nodes,way_nnodes,refname); if(ref && name) free(refname); } /*++++++++++++++++++++++++++++++++++++++ Process the tags associated with a relation. TagList *tags The list of relation tags. int64_t relation_id The id of the relation. int mode The mode of operation to take (create, modify, delete). ++++++++++++++++++++++++++++++++++++++*/ static void ProcessRelationTags(TagList *tags,int64_t relation_id,int mode) { transports_t routes=Transports_None; transports_t except=Transports_None; int relation_turn_restriction=0; TurnRestriction restriction=TurnRestrict_None; relation_t id; int i; /* Convert id */ id=(relation_t)relation_id; logassert((int64_t)id==relation_id,"Relation ID too large (change relation_t to 64-bits?)"); /* check relation id can be stored in relation_t data type. */ /* Delete */ if(mode==MODE_DELETE || mode==MODE_MODIFY) { AppendRouteRelationList(relations,id,RELATION_DELETED, relation_nodes,relation_nnodes, relation_ways,relation_nways, relation_relations,relation_nrelations); AppendTurnRelationList(relations,id, relation_from,relation_to,relation_via, restriction,RELATION_DELETED); } if(mode==MODE_DELETE) return; /* Sanity check */ if(relation_nnodes==0 && relation_nways==0 && relation_nrelations==0) { logerror("Relation %"Prelation_t" has no nodes, ways or relations.\n",logerror_relation(id)); return; } /* Parse the tags */ for(i=0;intags;i++) { int recognised=0; char *k=tags->k[i]; char *v=tags->v[i]; switch(*k) { case 'b': if(!strcmp(k,"bicycleroute")) { if(ISTRUE(v)) routes|=Transports_Bicycle; else if(!ISFALSE(v)) logerror("Relation %"Prelation_t" has an unrecognised tag 'bicycleroute' = '%s' (after tagging rules); using 'no'.\n",logerror_relation(id),v); recognised=1; break; } break; case 'e': if(!strcmp(k,"except")) { for(i=1;i1) { if(relation_to!=NO_WAY_ID) logerror_way(relation_to); if(relation_via!=NO_NODE_ID) logerror_node(relation_via); if(relation_from!=NO_WAY_ID) logerror_way(relation_from); logerror("Turn Relation %"Prelation_t" has more than one 'from' Way (used first one).\n",logerror_relation(relation_id)); } if(relation_to_count>1) { if(relation_to!=NO_WAY_ID) logerror_way(relation_to); if(relation_via!=NO_NODE_ID) logerror_node(relation_via); if(relation_from!=NO_WAY_ID) logerror_way(relation_from); logerror("Turn Relation %"Prelation_t" has more than one 'to' Way (used first one).\n",logerror_relation(relation_id)); } if(relation_via_count>1) { if(relation_to!=NO_WAY_ID) logerror_way(relation_to); if(relation_via!=NO_NODE_ID) logerror_node(relation_via); if(relation_from!=NO_WAY_ID) logerror_way(relation_from); logerror("Turn Relation %"Prelation_t" has more than one 'via' Node (used first one).\n",logerror_relation(relation_id)); } if(relation_from!=NO_WAY_ID && relation_to!=NO_WAY_ID && relation_via!=NO_NODE_ID) AppendTurnRelationList(relations,id, relation_from,relation_to,relation_via, restriction,except); } } /*++++++++++++++++++++++++++++++++++++++ Convert a string containing a speed into a double precision. double parse_speed Returns the speed in km/h if it can be parsed. way_t id The way being processed. const char *k The tag key. const char *v The tag value. ++++++++++++++++++++++++++++++++++++++*/ static double parse_speed(way_t id,const char *k,const char *v) { char *ev; double value=strtod(v,&ev); if(v==ev) logerror("Way %"Pway_t" has an unrecognised tag '%s' = '%s' (after tagging rules); ignoring it.\n",logerror_way(id),k,v); else { while(isspace(*ev)) ev++; if(*ev==0) return(value); if(!strcmp(ev,"km/h") || !strcmp(ev,"kph") || !strcmp(ev,"kmph")) return(value); if(!strcmp(ev,"mph")) return(1.609*value); if(!strcmp(ev,"knots")) return(1.852*value); logerror("Way %"Pway_t" has an un-parseable tag '%s' = '%s' (after tagging rules); ignoring it.\n",logerror_way(id),k,v); } return(0); } /*++++++++++++++++++++++++++++++++++++++ Convert a string containing a weight into a double precision. double parse_weight Returns the weight in tonnes if it can be parsed. way_t id The way being processed. const char *k The tag key. const char *v The tag value. ++++++++++++++++++++++++++++++++++++++*/ static double parse_weight(way_t id,const char *k,const char *v) { char *ev; double value=strtod(v,&ev); if(v==ev) logerror("Way %"Pway_t" has an unrecognised tag '%s' = '%s' (after tagging rules); ignoring it.\n",logerror_way(id),k,v); else { while(isspace(*ev)) ev++; if(*ev==0) return(value); if(!strcmp(ev,"kg")) return(value/1000.0); if(!strcmp(ev,"T") || !strcmp(ev,"t") || !strcmp(ev,"ton") || !strcmp(ev,"tons") || !strcmp(ev,"tonne") || !strcmp(ev,"tonnes")) return(value); logerror("Way %"Pway_t" has an un-parseable tag '%s' = '%s' (after tagging rules); ignoring it.\n",logerror_way(id),k,v); } return(0); } /*++++++++++++++++++++++++++++++++++++++ Convert a string containing a length into a double precision. double parse_length Returns the length in metres if it can be parsed. way_t id The way being processed. const char *k The tag key. const char *v The tag value. ++++++++++++++++++++++++++++++++++++++*/ static double parse_length(way_t id,const char *k,const char *v) { char *ev; double value=strtod(v,&ev); if(v==ev) logerror("Way %"Pway_t" has an unrecognised tag '%s' = '%s' (after tagging rules); ignoring it.\n",logerror_way(id),k,v); else { int en=0; int feet=0,inches=0; while(isspace(*ev)) ev++; if(*ev==0) return(value); if(!strcmp(ev,"m") || !strcmp(ev,"metre") || !strcmp(ev,"metres") || !strcmp(ev,"meter") || !strcmp(ev,"meters")) return(value); if(!strcmp(ev,"'")) return(value*0.254); if(!strcmp(ev,"′")) return(value*0.254); if(!strcmp(ev,"’")) return(value*0.254); if(!strcmp(ev,"ft") || !strcmp(ev,"feet")) return(value*0.254); if(sscanf(v,"%d' %d\"%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d'%d\"%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d'-%d\"%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d' %d''%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d'%d''%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d'-%d''%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d′ %d″%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d′%d″%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d′-%d″%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d’ %dâ€%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d’%dâ€%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d’-%dâ€%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d - %d%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d ft %d in%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); if(sscanf(v,"%d feet %d inches%n",&feet,&inches,&en)==2 && en && !v[en]) return((feet+(double)inches/12.0)*0.254); logerror("Way %"Pway_t" has an un-parseable tag '%s' = '%s' (after tagging rules); ignoring it.\n",logerror_way(id),k,v); } return(0); } routino-3.4.3/src/visualiser.h 644 233 144 6117 12327765765 11547 0/*************************************** Header file for visualiser functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2014 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef VISUALISER_H #define VISUALISER_H /*+ To stop multiple inclusions. +*/ #include "types.h" #include "errorlog.h" /* Functions in visualiser.c */ void OutputJunctions(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax); void OutputSuper(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax); void OutputWaytype(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,highway_t mask); void OutputHighway(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,Highway highway); void OutputTransport(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,Transport transport); void OutputBarrier(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,Transport transport); void OutputTurnRestrictions(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax); void OutputSpeedLimits(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax); void OutputWeightLimits(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax); void OutputHeightLimits(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax); void OutputWidthLimits(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax); void OutputLengthLimits(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax); void OutputProperty(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,Property property); void OutputErrorLog(ErrorLogs *errorlogs,double latmin,double latmax,double lonmin,double lonmax); #endif /* VISUALISER_H */ routino-3.4.3/src/typesx.h 644 233 144 7023 14664132233 10672 0/*************************************** Type definitions for eXtended types. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2016, 2019, 2022 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef TYPESX_H #define TYPESX_H /*+ To stop multiple inclusions. +*/ #include #include #include #include /* Constants and macros for handling them */ /*+ An undefined node ID. +*/ #define NO_NODE_ID ((node_t)~0) /*+ An undefined way ID. +*/ #define NO_WAY_ID ((way_t)~0) /*+ An undefined relation ID. +*/ #define NO_RELATION_ID ((relation_t)~0) /*+ The maximum number of segments per node (used to size temporary storage). +*/ #define MAX_SEG_PER_NODE 64 /* Bit mask macro types and functions */ #define BitMask uint64_t #define LengthBitMask(xx) (1+(xx)/64) #define SizeBitMask(xx) (LengthBitMask(xx)*sizeof(BitMask)) #define AllocBitMask(xx) (BitMask*)calloc_logassert(LengthBitMask(xx),sizeof(BitMask)) #define ClearAllBits(xx,yy) memset((xx), 0,SizeBitMask(yy)) #define SetAllBits(xx,yy) memset((xx),~0,SizeBitMask(yy)) #define ClearBit(xx,yy) (xx)[(yy)/64]&=~(((BitMask)1)<<((yy)%64)) #define SetBit(xx,yy) (xx)[(yy)/64]|= (((BitMask)1)<<((yy)%64)) #define IsBitSet(xx,yy) ((xx)[(yy)/64]& (((BitMask)1)<<((yy)%64))) /* Simple Types */ /*+ A node identifier - must be at least as large as index_t. +*/ typedef uint64_t node_t; /*+ A way identifier - must be at least as large as index_t. +*/ typedef uint32_t way_t; /*+ A relation identifier - must be at least as large as index_t. +*/ typedef uint32_t relation_t; /*+ A printf formatting string for a node_t type (this should match the node_t definition above). +*/ #define Pnode_t PRIu64 /* PRIu32 and PRIu64 are defined in intypes.h */ /*+ A printf formatting string for a way_t type (this should match the way_t definition above). +*/ #define Pway_t PRIu32 /* PRIu32 and PRIu64 are defined in intypes.h */ /*+ A printf formatting string for a relation_t type (this should match the relation_t definition above). +*/ #define Prelation_t PRIu32 /* PRIu32 and PRIu64 are defined in intypes.h */ /* Enumerated types */ /*+ Turn restrictions. +*/ typedef enum _TurnRestriction { TurnRestrict_None =0, TurnRestrict_no_right_turn, TurnRestrict_no_left_turn, TurnRestrict_no_u_turn, TurnRestrict_no_straight_on, TurnRestrict_only_right_turn, TurnRestrict_only_left_turn, TurnRestrict_only_straight_on } TurnRestriction; /* Data structures */ typedef struct _NodeX NodeX; typedef struct _NodesX NodesX; typedef struct _SegmentX SegmentX; typedef struct _SegmentsX SegmentsX; typedef struct _WayX WayX; typedef struct _WaysX WaysX; typedef struct _RouteRelX RouteRelX; typedef struct _TurnRelX TurnRelX; typedef struct _RelationsX RelationsX; #endif /* TYPESX_H */ routino-3.4.3/src/router+lib.c 644 233 144 45343 14664130434 11443 0/*************************************** OSM router using libroutino library. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2016, 2018, 2024 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include #include #include "version.h" #include "routino.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif /*+ The maximum number of waypoints +*/ #define NWAYPOINTS 99 /* Local functions */ static char *FileName(const char *dirname,const char *prefix, const char *name); static void print_usage(int detail,const char *argerr,const char *err); /*++++++++++++++++++++++++++++++++++++++ The main program for the router. ++++++++++++++++++++++++++++++++++++++*/ int main(int argc,char** argv) { Routino_Database *database; Routino_Profile *profile; Routino_Translation *translation; Routino_Waypoint **waypoints; Routino_Output *route; int point_used[NWAYPOINTS+1]={0}; double point_lon[NWAYPOINTS+1],point_lat[NWAYPOINTS+1]; char *dirname=NULL,*prefix=NULL; char *profiles=NULL,*profilename="motorcar"; char *translations=NULL,*language="en"; int reverse=0,loop=0; int quickest=0; int html=0,gpx_track=0,gpx_route=0,text=0,text_all=0,none=0,use_stdout=0; int list_html=0,list_html_all=0,list_text=0,list_text_all=0; int arg; int first_waypoint=NWAYPOINTS,last_waypoint=1,waypoint,nwaypoints=0; int routing_options; /* Check the libroutino API version */ if(Routino_CheckAPIVersion()!=ROUTINO_ERROR_NONE) { fprintf(stderr,"Error: Executable version (%d) and library version (%d) do not match.\n",ROUTINO_API_VERSION,Routino_APIVersion); exit(EXIT_FAILURE); } /* Parse the command line arguments */ if(argc<2) print_usage(0,NULL,NULL); /* Get the non-routing, general program options */ for(arg=1;argNWAYPOINTS || point_used[point]&1) print_usage(0,argv[arg],NULL); point_lon[point]=atof(p); point_used[point]+=1; if(pointlast_waypoint) last_waypoint=point; } else if(!strncmp(argv[arg],"--lat",5) && isdigit(argv[arg][5])) { int point; char *p=&argv[arg][6]; while(isdigit(*p)) p++; if(*p++!='=') print_usage(0,argv[arg],NULL); point=atoi(&argv[arg][5]); if(point>NWAYPOINTS || point_used[point]&2) print_usage(0,argv[arg],NULL); point_lat[point]=atof(p); point_used[point]+=2; if(pointlast_waypoint) last_waypoint=point; } else print_usage(0,argv[arg],NULL); argv[arg]=NULL; } /* Check the specified command line options */ if(use_stdout && (html+gpx_track+gpx_route+text+text_all)!=1) { fprintf(stderr,"Error: The '--output-stdout' option requires exactly one other output option (but not '--output-none').\n"); exit(EXIT_FAILURE); } if(html==0 && gpx_track==0 && gpx_route==0 && text==0 && text_all==0 && none==0) html=gpx_track=gpx_route=text=text_all=1; /* Load in the selected profiles */ if(profiles) { if(access(profiles,F_OK)) { fprintf(stderr,"Error: The '--profiles' option specifies a file '%s' that does not exist.\n",profiles); exit(EXIT_FAILURE); } } else { profiles=FileName(dirname,prefix,"profiles.xml"); if(access(profiles,F_OK)) { char *defaultprofiles=FileName(ROUTINO_DATADIR,NULL,"profiles.xml"); if(access(defaultprofiles,F_OK)) { fprintf(stderr,"Error: The '--profiles' option was not used and the files '%s' and '%s' do not exist.\n",profiles,defaultprofiles); exit(EXIT_FAILURE); } free(profiles); profiles=defaultprofiles; } } if(!profilename) { fprintf(stderr,"Error: A profile name must be specified.\n"); exit(EXIT_FAILURE); } if(Routino_ParseXMLProfiles(profiles)) { fprintf(stderr,"Error: Cannot read the profiles in the file '%s'.\n",profiles); exit(EXIT_FAILURE); } profile=Routino_GetProfile(profilename); if(!profile) { char **list=Routino_GetProfileNames(); fprintf(stderr,"Error: Cannot find a profile called '%s' in the file '%s'.\n",profilename,profiles); fprintf(stderr,"Profiles available are: %s",*list++); while(*list) fprintf(stderr,", %s",*list++); fprintf(stderr,"\n"); exit(EXIT_FAILURE); } /* Load in the selected translation */ if(translations) { if(access(translations,F_OK)) { fprintf(stderr,"Error: The '--translations' option specifies a file '%s' that does not exist.\n",translations); exit(EXIT_FAILURE); } } else { translations=FileName(dirname,prefix,"translations.xml"); if(access(translations,F_OK)) { char *defaulttranslations=FileName(ROUTINO_DATADIR,NULL,"translations.xml"); if(access(defaulttranslations,F_OK)) { fprintf(stderr,"Error: The '--translations' option was not used and the files '%s' and '%s' do not exist.\n",translations,defaulttranslations); exit(EXIT_FAILURE); } free(translations); translations=defaulttranslations; } } if(Routino_ParseXMLTranslations(translations)) { fprintf(stderr,"Error: Cannot read the translations in the file '%s'.\n",translations); exit(EXIT_FAILURE); } if(language) { translation=Routino_GetTranslation(language); if(!translation) { char **list1=Routino_GetTranslationLanguages(); char **list2=Routino_GetTranslationLanguageFullNames(); fprintf(stderr,"Error: Cannot find a translation called '%s' in the file '%s'.\n",language,translations); fprintf(stderr,"Languages available are: %s (%s)",*list1++,*list2++); while(*list1) fprintf(stderr,", %s (%s)",*list1++,*list2++); fprintf(stderr,"\n"); exit(EXIT_FAILURE); } } else { translation=Routino_GetTranslation(""); /* first in file */ if(!translation) { fprintf(stderr,"Error: No translations in '%s'.\n",translations); exit(EXIT_FAILURE); } } /* Check the waypoints are valid */ for(waypoint=first_waypoint;waypoint<=last_waypoint;waypoint++) if(point_used[waypoint]==1 || point_used[waypoint]==2) print_usage(0,NULL,"All waypoints must have latitude and longitude."); else if(point_used[waypoint]==3) nwaypoints++; if(first_waypoint>=last_waypoint) { fprintf(stderr,"Error: At least two waypoints must be specified.\n"); exit(EXIT_FAILURE); } waypoints=calloc(nwaypoints+2,sizeof(Routino_Waypoint*)); /* Load in the routing database */ database=Routino_LoadDatabase(dirname,prefix); /* Check the profile is valid for use with this database */ if(Routino_ValidateProfile(database,profile)!=ROUTINO_ERROR_NONE) { fprintf(stderr,"Error: Profile is invalid or not compatible with database.\n"); exit(EXIT_FAILURE); } /* Loop through all waypoints */ nwaypoints=0; for(waypoint=first_waypoint;waypoint<=last_waypoint;waypoint++) { if(point_used[waypoint]!=3) continue; waypoints[nwaypoints]=Routino_FindWaypoint(database,profile,point_lat[waypoint],point_lon[waypoint]); if(!waypoints[nwaypoints]) { fprintf(stderr,"Error: Cannot find node close to specified point %d.\n",waypoint); exit(EXIT_FAILURE); } nwaypoints++; } /* Create the route */ routing_options=0; if(quickest) routing_options|=ROUTINO_ROUTE_QUICKEST; else routing_options|=ROUTINO_ROUTE_SHORTEST; if(html ) routing_options|=ROUTINO_ROUTE_FILE_HTML; if(gpx_track) routing_options|=ROUTINO_ROUTE_FILE_GPX_TRACK; if(gpx_route) routing_options|=ROUTINO_ROUTE_FILE_GPX_ROUTE; if(text ) routing_options|=ROUTINO_ROUTE_FILE_TEXT; if(text_all ) routing_options|=ROUTINO_ROUTE_FILE_TEXT_ALL; if(list_html) routing_options|=ROUTINO_ROUTE_LIST_HTML; if(list_html_all) routing_options|=ROUTINO_ROUTE_LIST_HTML_ALL; if(list_text) routing_options|=ROUTINO_ROUTE_LIST_TEXT; if(list_text_all) routing_options|=ROUTINO_ROUTE_LIST_TEXT_ALL; if(reverse) routing_options|=ROUTINO_ROUTE_REVERSE; if(loop) routing_options|=ROUTINO_ROUTE_LOOP; route=Routino_CalculateRoute(database,profile,translation,waypoints,nwaypoints,routing_options,NULL); if(Routino_errno>=ROUTINO_ERROR_NO_ROUTE_1) { fprintf(stderr,"Error: Cannot find a route between specified waypoints.\n"); exit(EXIT_FAILURE); } else if(Routino_errno!=ROUTINO_ERROR_NONE) { fprintf(stderr,"Error: Internal error (%d).\n",Routino_errno); exit(EXIT_FAILURE); } /* Print the list output */ if(list_html || list_html_all || list_text || list_text_all) { Routino_Output *list=route; int first=1,last; while(list) { last=list->next?0:1; printf("----------------\n"); printf("Lon,Lat: %.5f, %.5f\n",(180.0/M_PI)*list->lon,(180.0/M_PI)*list->lat); if(list_html || list_html_all || list_text || list_text_all) printf("Dist,Time: %.3f km, %.1f minutes\n",list->dist,list->time); if(list_text_all && !first) printf("Speed: %.0f km/hr\n",list->speed); printf("Point type: %d\n",list->type); if((list_html || list_html_all || list_text) && !first && !last) printf("Turn: %d degrees\n",list->turn); if(((list_html || list_html_all || list_text) && !last) || (list_text_all && !first)) printf("Bearing: %d degrees\n",list->bearing); if(((list_html || list_text) && !last) || (list_html_all && list->name) || (list_text_all && !first)) printf("Name: %s\n",list->name); if(list_html || (list_html_all && list->name)) { printf("Desc1: %s\n",list->desc1); printf("Desc2: %s\n",list->desc2); if(!last) printf("Desc3: %s\n",list->desc3); } list=list->next; first=0; } } /* Tidy up and exit */ Routino_DeleteRoute(route); Routino_UnloadDatabase(database); Routino_FreeXMLProfiles(); Routino_FreeXMLTranslations(); for(waypoint=0;waypoint=0) { fprintf(stderr, "Usage: router [--version]\n" " [--help ]\n" " [--dir=] [--prefix=]\n" " [--profiles=] [--translations=]\n" " [--language=]\n" " [--output-html]\n" " [--output-gpx-track] [--output-gpx-route]\n" " [--output-text] [--output-text-all]\n" " [--output-none] [--output-stdout]\n" " [--list-html | --list-html-all |\n" " --list-text | --list-text-all]\n" " [--profile=]\n" " [--shortest | --quickest]\n" " --lon1= --lat1=\n" " --lon2= --lon2=\n" " [ ... --lon99= --lon99=]\n" " [--reverse] [--loop]\n"); if(argerr) fprintf(stderr, "\n" "Error with command line parameter: %s\n",argerr); if(err) fprintf(stderr, "\n" "Error: %s\n",err); } if(detail==1) fprintf(stderr, "\n" "--version Print the version of Routino.\n" "\n" "--help Prints this information.\n" "\n" "--dir= The directory containing the routing database.\n" "--prefix= The filename prefix for the routing database.\n" "--profiles= The name of the XML file containing the profiles\n" " (defaults to 'profiles.xml' with '--dir' and\n" " '--prefix' options or the file installed in\n" " '" ROUTINO_DATADIR "').\n" "--translations= The name of the XML file containing the translations\n" " (defaults to 'translations.xml' with '--dir' and\n" " '--prefix' options or the file installed in\n" " '" ROUTINO_DATADIR "').\n" "\n" "--language= Use the translations for specified language.\n" "--output-html Write an HTML description of the route.\n" "--output-gpx-track Write a GPX track file with all route points.\n" "--output-gpx-route Write a GPX route file with interesting junctions.\n" "--output-text Write a plain text file with interesting junctions.\n" "--output-text-all Write a plain text file with all route points.\n" "--output-none Don't write any output files or read any translations.\n" " (If no output option is given then all are written.)\n" "--output-stdout Write to stdout instead of a file (requires exactly\n" " one output format option, implies '--quiet').\n" "\n" "--list-html Create an HTML list of the route.\n" "--list-html-all Create an HTML list of the route with all points.\n" "--list-text Create a plain text list with interesting junctions.\n" "--list-text-all Create a plain text list with all route points.\n" "\n" "--profile= Select the loaded profile with this name.\n" "\n" "--shortest Find the shortest route between the waypoints.\n" "--quickest Find the quickest route between the waypoints.\n" "\n" "--lon= Specify the longitude of the n'th waypoint.\n" "--lat= Specify the latitude of the n'th waypoint.\n" "\n" "--reverse Find a route between the waypoints in reverse order.\n" "--loop Find a route that returns to the first waypoint.\n" "\n"); exit(!detail); } routino-3.4.3/src/#nodesx.c# 644 233 144 53160 14774000057 10762 0/*************************************** Extented Node data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019, 2020, 2022 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include "types.h" #include "nodes.h" #include "typesx.h" #include "nodesx.h" #include "segmentsx.h" #include "waysx.h" #include "files.h" #include "logging.h" #include "sorting.h" /* Global variables */ /*+ The command line '--tmpdir' option or its default value. +*/ extern char *option_tmpdirname; /* Local variables */ /*+ Temporary file-local variables for use by the sort functions (re-initialised for each sort). +*/ static NodesX *sortnodesx; static latlong_t lat_min,lat_max,lon_min,lon_max; /* Local functions */ static int sort_by_id(NodeX *a,NodeX *b); static int deduplicate_and_index_by_id(NodeX *nodex,index_t index); static int update_id(NodeX *nodex,index_t index); static int sort_by_lat_long(NodeX *a,NodeX *b); static int index_by_lat_long(NodeX *nodex,index_t index); /*++++++++++++++++++++++++++++++++++++++ Allocate a new node list (create a new file or open an existing one). NodesX *NewNodeList Returns a pointer to the node list. int append Set to 1 if the file is to be opened for appending. int readonly Set to 1 if the file is to be opened for reading. ++++++++++++++++++++++++++++++++++++++*/ NodesX *NewNodeList(int append,int readonly) { NodesX *nodesx; nodesx=(NodesX*)calloc_logassert(1,sizeof(NodesX)); nodesx->filename =(char*)malloc_logassert(strlen(option_tmpdirname)+32); nodesx->filename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+40); /* allow %p to be up to 20 bytes */ sprintf(nodesx->filename ,"%s/nodesx.parsed.mem",option_tmpdirname); sprintf(nodesx->filename_tmp,"%s/nodesx.%p.tmp" ,option_tmpdirname,(void*)nodesx); if(append || readonly) if(ExistsFile(nodesx->filename)) { offset_t size; size=SizeFile(nodesx->filename); nodesx->number=size/sizeof(NodeX); RenameFile(nodesx->filename,nodesx->filename_tmp); } if(append) nodesx->fd=OpenFileBufferedAppend(nodesx->filename_tmp); else if(!readonly) nodesx->fd=OpenFileBufferedNew(nodesx->filename_tmp); else nodesx->fd=-1; #if SLIM nodesx->cache=NewNodeXCache(); log_malloc(nodesx->cache,sizeof(*nodesx->cache)); #endif nodesx->ifilename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+40); /* allow %p to be up to 20 bytes */ sprintf(nodesx->ifilename_tmp,"%s/nodesx.%p.idx.tmp",option_tmpdirname,(void*)nodesx); return(nodesx); } /*++++++++++++++++++++++++++++++++++++++ Free a node list. NodesX *nodesx The set of nodes to be freed. int keep If set then the results file is to be kept. ++++++++++++++++++++++++++++++++++++++*/ void FreeNodeList(NodesX *nodesx,int keep) { if(keep) RenameFile(nodesx->filename_tmp,nodesx->filename); else DeleteFile(nodesx->filename_tmp); free(nodesx->filename); free(nodesx->filename_tmp); DeleteFile(nodesx->ifilename_tmp); free(nodesx->ifilename_tmp); if(nodesx->gdata) { log_free(nodesx->gdata); free(nodesx->gdata); } if(nodesx->pdata) { log_free(nodesx->pdata); free(nodesx->pdata); } if(nodesx->super) { log_free(nodesx->super); free(nodesx->super); } #if SLIM log_free(nodesx->cache); DeleteNodeXCache(nodesx->cache); #endif free(nodesx); } /*++++++++++++++++++++++++++++++++++++++ Append a single node to an unsorted node list. NodesX *nodesx The set of nodes to modify. node_t id The node identifier from the original OSM data. double latitude The latitude of the node. double longitude The longitude of the node. transports_t allow The allowed traffic types through the node. nodeflags_t flags The flags to set for this node. ++++++++++++++++++++++++++++++++++++++*/ void AppendNodeList(NodesX *nodesx,node_t id,double latitude,double longitude,transports_t allow,nodeflags_t flags) { NodeX nodex={0}; nodex.id=id; nodex.latitude =radians_to_latlong(latitude); nodex.longitude=radians_to_latlong(longitude); nodex.allow=allow; nodex.flags=flags; WriteFileBuffered(nodesx->fd,&nodex,sizeof(NodeX)); nodesx->number++; logassert(nodesx->numberfd!=-1) nodesx->fd=CloseFileBuffered(nodesx->fd); } /*++++++++++++++++++++++++++++++++++++++ Find a particular node index. index_t IndexNodeX Returns the index of the extended node with the specified id. NodesX *nodesx The set of nodes to use. node_t id The node id to look for. ++++++++++++++++++++++++++++++++++++++*/ index_t IndexNodeX(NodesX *nodesx,node_t id) { index_t start=0; index_t end=nodesx->number-1; index_t mid; if(nodesx->number==0) /* No nodes */ return(NO_NODE); /* Binary search - search key exact match only is required. * * # <- start | Check mid and exit if it matches else move start or end. * # | * # | Since an exact match is wanted we can set end=mid-1 * # <- mid | or start=mid+1 if we find that mid doesn't match. * # | * # | Eventually either end=start or end=start+1 and one of * # <- end | start or end is the wanted one or neither is. */ while((end-start)>1) { mid=start+(end-start)/2; /* Choose mid point (avoid overflow) */ if(nodesx->idata[mid]idata[mid]>id) /* Mid point is too high */ end=mid-1; else /* Mid point is correct */ return(mid); } if(nodesx->idata[start]==id) /* Start is correct */ return(start); if(nodesx->idata[end]==id) /* End is correct */ return(end); return(NO_NODE); } /*++++++++++++++++++++++++++++++++++++++ Sort the node list. NodesX *nodesx The set of nodes to modify. ++++++++++++++++++++++++++++++++++++++*/ void SortNodeList(NodesX *nodesx) { int fd; index_t xnumber; /* Print the start message */ printf_first("Sorting Nodes"); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(nodesx->filename_tmp,&nodesx->fd); /* Open a file for the index */ nodesx->ifd=OpenFileBufferedNew(nodesx->ifilename_tmp); /* Sort the nodes by ID and index them */ xnumber=nodesx->number; sortnodesx=nodesx; nodesx->number=filesort_fixed(nodesx->fd,fd,sizeof(NodeX),NULL, (int (*)(const void*,const void*))sort_by_id, (int (*)(void*,index_t))deduplicate_and_index_by_id); nodesx->knumber=nodesx->number; /* Close the files */ nodesx->fd=CloseFileBuffered(nodesx->fd); CloseFileBuffered(fd); nodesx->ifd=CloseFileBuffered(nodesx->ifd); /* Print the final message */ printf_last("Sorted Nodes: Nodes=%"Pindex_t" Duplicates=%"Pindex_t,xnumber,xnumber-nodesx->number); } /*++++++++++++++++++++++++++++++++++++++ Sort the nodes into id order. int sort_by_id Returns the comparison of the id fields. NodeX *a The first extended node. NodeX *b The second extended node. ++++++++++++++++++++++++++++++++++++++*/ static int sort_by_id(NodeX *a,NodeX *b) { node_t a_id=a->id; node_t b_id=b->id; if(a_idb_id) return(1); else return(-FILESORT_PRESERVE_ORDER(a,b)); /* latest version first */ } /*++++++++++++++++++++++++++++++++++++++ Create the index of identifiers and discard duplicate nodes. int deduplicate_and_index_by_id Return 1 if the value is to be kept, otherwise 0. NodeX *nodex The extended node. index_t index The number of sorted nodes that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int deduplicate_and_index_by_id(NodeX *nodex,index_t index) { static node_t previd; /* internal variable (reset by first call in each sort; index==0) */ if(index==0 || nodex->id!=previd) { previd=nodex->id; if(nodex->flags&NODE_DELETED) return(0); else { WriteFileBuffered(sortnodesx->ifd,&nodex->id,sizeof(node_t)); return(1); } } else return(0); } /*++++++++++++++++++++++++++++++++++++++ Remove any nodes that are not part of a highway. NodesX *nodesx The set of nodes to modify. WaysX *waysx The set of ways to use. int keep If set to 1 then keep the old data file otherwise delete it. ++++++++++++++++++++++++++++++++++++++*/ void RemoveNonHighwayNodes(NodesX *nodesx,WaysX *waysx,int keep) { BitMask *usednode; NodeX nodex; index_t i,total=0,highway=0,nothighway=0; node_t bitmasklength; int fd; /* Print the start message */ printf_first("Checking Ways for unused Nodes: Ways=0 Highway Nodes=0"); /* Re-open the file read-only */ waysx->fd=ReOpenFileBuffered(waysx->filename_tmp); /* Map the index into memory */ nodesx->idata=MapFile(nodesx->ifilename_tmp); /* Allocate the node usage bitmask */ #if SLIM bitmasklength=nodesx->number; /* The number of nodes in the database */ #else bitmasklength=nodesx->idata[nodesx->number-1]+1; /* One more than the highest OSM node number in the database */ #endif usednode=AllocBitMask(bitmasklength); log_malloc(usednode,SizeBitMask(bitmasklength)); /* Loop through the ways and mark the used nodes */ for(i=0;inumber;i++) { WayX wayx; FILESORT_VARINT waysize; node_t node; ReadFileBuffered(waysx->fd,&waysize,FILESORT_VARSIZE); ReadFileBuffered(waysx->fd,&wayx,sizeof(WayX)); while(!ReadFileBuffered(waysx->fd,&node,sizeof(node_t)) && node!=NO_NODE_ID) { #if SLIM index_t index=IndexNodeX(nodesx,node); /* Index bitmap by node number in the database */ #else node_t index=node; /* Index bitmap by OSM node number */ #endif waysize-=sizeof(node_t); #if SLIM if(index==NO_NODE) continue; #endif if(!IsBitSet(usednode,index)) highway++; SetBit(usednode,index); } waysize-=sizeof(node_t)+sizeof(WayX); SkipFileBuffered(waysx->fd,waysize); if(!((i+1)%1000)) printf_middle("Checking Ways for unused Nodes: Ways=%"Pindex_t" Highway Nodes=%"Pindex_t,i+1,highway); } /* Close the file */ waysx->fd=CloseFileBuffered(waysx->fd); /* Unmap the index from memory */ nodesx->idata=UnmapFile(nodesx->idata); /* Print the final message */ printf_last("Checked Ways for unused Nodes: Ways=%"Pindex_t" Highway Nodes=%"Pindex_t,waysx->number,highway); /* Print the start message */ printf_first("Removing unused Nodes: Nodes=0"); /* Open a file for the index */ nodesx->ifd=OpenFileBufferedNew(nodesx->ifilename_tmp); highway=0; /* Re-open the file read-only and a new file writeable */ if(keep) { RenameFile(nodesx->filename_tmp,nodesx->filename); nodesx->fd=ReOpenFileBuffered(nodesx->filename); fd=OpenFileBufferedNew(nodesx->filename_tmp); } else fd=ReplaceFileBuffered(nodesx->filename_tmp,&nodesx->fd); /* Modify the on-disk image */ while(!ReadFileBuffered(nodesx->fd,&nodex,sizeof(NodeX))) { #if SLIM index_t node=total; /* Index by node number in the database */ #else node_t node=nodex.id; /* Index by OSM node number */ #endif if(!IsBitSet(usednode,node)) nothighway++; else { WriteFileBuffered(fd,&nodex,sizeof(NodeX)); WriteFileBuffered(nodesx->ifd,&nodex.id,sizeof(node_t)); highway++; } total++; if(!(total%10000)) printf_middle("Removing unused Nodes: Nodes=%"Pindex_t" Highway=%"Pindex_t" not-Highway=%"Pindex_t,total,highway,nothighway); } nodesx->number=highway; /* Close the files */ nodesx->fd=CloseFileBuffered(nodesx->fd); CloseFileBuffered(fd); nodesx->ifd=CloseFileBuffered(nodesx->ifd); /* Free the now-unneeded index */ log_free(usednode); free(usednode); /* Print the final message */ printf_last("Removed unused Nodes: Nodes=%"Pindex_t" Highway=%"Pindex_t" not-Highway=%"Pindex_t,total,highway,nothighway); } /*++++++++++++++++++++++++++++++++++++++ Remove any nodes that have been pruned. NodesX *nodesx The set of nodes to prune. SegmentsX *segmentsx The set of segments to use. ++++++++++++++++++++++++++++++++++++++*/ void RemovePrunedNodes(NodesX *nodesx,SegmentsX *segmentsx) { NodeX nodex; index_t total=0,pruned=0,notpruned=0; int fd; if(nodesx->number==0) return; /* Print the start message */ printf_first("Deleting Pruned Nodes: Nodes=0 Pruned=0"); /* Allocate the array of indexes */ nodesx->pdata=(index_t*)malloc_logassert(nodesx->number*sizeof(index_t)); log_malloc(nodesx->pdata,nodesx->number*sizeof(index_t)); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(nodesx->filename_tmp,&nodesx->fd); /* Modify the on-disk image */ while(!ReadFileBuffered(nodesx->fd,&nodex,sizeof(NodeX))) { if(segmentsx->firstnode[total]==NO_SEGMENT) { pruned++; nodesx->pdata[total]=NO_NODE; } else { nodesx->pdata[total]=notpruned; WriteFileBuffered(fd,&nodex,sizeof(NodeX)); notpruned++; } total++; if(!(total%10000)) printf_middle("Deleting Pruned Nodes: Nodes=%"Pindex_t" Pruned=%"Pindex_t,total,pruned); } nodesx->number=notpruned; /* Close the files */ nodesx->fd=CloseFileBuffered(nodesx->fd); CloseFileBuffered(fd); /* Free the no-longer required memory */ if(segmentsx->firstnode) { log_free(segmentsx->firstnode); free(segmentsx->firstnode); segmentsx->firstnode=NULL; } /* Print the final message */ printf_last("Deleted Pruned Nodes: Nodes=%"Pindex_t" Pruned=%"Pindex_t,total,pruned); } /*++++++++++++++++++++++++++++++++++++++ Sort the node list geographically. NodesX *nodesx The set of nodes to modify. ++++++++++++++++++++++++++++++++++++++*/ void SortNodeListGeographically(NodesX *nodesx) { int fd; ll_bin_t lat_min_bin,lat_max_bin,lon_min_bin,lon_max_bin; if(nodesx->number==0) return; /* Print the start message */ printf_first("Sorting Nodes Geographically"); /* Work out the range of data */ lat_min=radians_to_latlong( 2); lat_max=radians_to_latlong(-2); lon_min=radians_to_latlong( 4); lon_max=radians_to_latlong(-4); /* Allocate the memory for the geographical index array */ nodesx->gdata=(index_t*)malloc_logassert(nodesx->number*sizeof(index_t)); log_malloc(nodesx->gdata,nodesx->number*sizeof(index_t)); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(nodesx->filename_tmp,&nodesx->fd); /* Sort nodes geographically and index them */ sortnodesx=nodesx; filesort_fixed(nodesx->fd,fd,sizeof(NodeX),(int (*)(void*,index_t))update_id, (int (*)(const void*,const void*))sort_by_lat_long, (int (*)(void*,index_t))index_by_lat_long); /* Close the files */ nodesx->fd=CloseFileBuffered(nodesx->fd); CloseFileBuffered(fd); /* Work out the number of bins */ if(nodesx->super) { lat_min_bin=latlong_to_bin(lat_min); lon_min_bin=latlong_to_bin(lon_min); lat_max_bin=latlong_to_bin(lat_max); lon_max_bin=latlong_to_bin(lon_max); nodesx->latzero=lat_min_bin; nodesx->lonzero=lon_min_bin; nodesx->latbins=(lat_max_bin-lat_min_bin)+1; nodesx->lonbins=(lon_max_bin-lon_min_bin)+1; } /* Free the memory */ if(nodesx->super) { log_free(nodesx->super); free(nodesx->super); nodesx->super=NULL; } /* Print the final message */ printf_last("Sorted Nodes Geographically: Nodes=%"Pindex_t,nodesx->number); } /*++++++++++++++++++++++++++++++++++++++ Update the node ids. int update_id Return 1 if the value is to be kept, otherwise 0. NodeX *nodex The extended node. index_t index The number of unsorted nodes that have been read from the input file. ++++++++++++++++++++++++++++++++++++++*/ static int update_id(NodeX *nodex,index_t index) { nodex->id=index; if(sortnodesx->super && IsBitSet(sortnodesx->super,index)) nodex->flags|=NODE_SUPER; return(1); } /*++++++++++++++++++++++++++++++++++++++ Sort the nodes into latitude and longitude order (first by longitude bin number, then by latitude bin number and then by exact longitude and then by exact latitude). int sort_by_lat_long Returns the comparison of the latitude and longitude fields. NodeX *a The first extended node. NodeX *b The second extended node. ++++++++++++++++++++++++++++++++++++++*/ static int sort_by_lat_long(NodeX *a,NodeX *b) { ll_bin_t a_lon=latlong_to_bin(a->longitude); ll_bin_t b_lon=latlong_to_bin(b->longitude); if(a_lonb_lon) return(1); else { ll_bin_t a_lat=latlong_to_bin(a->latitude); ll_bin_t b_lat=latlong_to_bin(b->latitude); if(a_latb_lat) return(1); else { if(a->longitudelongitude) return(-1); else if(a->longitude>b->longitude) return(1); else { if(a->latitudelatitude) return(-1); else if(a->latitude>b->latitude) return(1); } return(FILESORT_PRESERVE_ORDER(a,b)); } } } /*++++++++++++++++++++++++++++++++++++++ Create the index between the sorted and unsorted nodes. int index_by_lat_long Return 1 if the value is to be kept, otherwise 0. NodeX *nodex The extended node. index_t index The number of sorted nodes that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int index_by_lat_long(NodeX *nodex,index_t index) { sortnodesx->gdata[nodex->id]=index; if(sortnodesx->super) { if(nodex->latitudelatitude; if(nodex->latitude>lat_max) lat_max=nodex->latitude; if(nodex->longitudelongitude; if(nodex->longitude>lon_max) lon_max=nodex->longitude; } return(1); } /*++++++++++++++++++++++++++++++++++++++ Save the final node list database to a file. NodesX *nodesx The set of nodes to save. const char *filename The name of the file to save. SegmentsX *segmentsx The set of segments to use. ++++++++++++++++++++++++++++++++++++++*/ void SaveNodeList(NodesX *nodesx,const char *filename,SegmentsX *segmentsx) { index_t i; int fd; NodesFile nodesfile={0}; index_t super_number=0; ll_bin2_t latlonbin=0,maxlatlonbins; index_t *offsets; /* Print the start message */ printf_first("Writing Nodes: Nodes=0"); /* Allocate the memory for the geographical offsets array */ offsets=(index_t*)malloc_logassert((nodesx->latbins*nodesx->lonbins+1)*sizeof(index_t)); latlonbin=0; /* Re-open the file */ nodesx->fd=ReOpenFileBuffered(nodesx->filename_tmp); /* Write out the nodes data */ fd=OpenFileBufferedNew(filename); SeekFileBuffered(fd,sizeof(NodesFile)+(nodesx->latbins*nodesx->lonbins+1)*sizeof(index_t)); for(i=0;inumber;i++) { NodeX nodex; Node node={0}; ll_bin_t latbin,lonbin; ll_bin2_t llbin; ReadFileBuffered(nodesx->fd,&nodex,sizeof(NodeX)); /* Create the Node */ node.latoffset=latlong_to_off(nodex.latitude); node.lonoffset=latlong_to_off(nodex.longitude); node.firstseg=segmentsx->firstnode[i]; node.allow=nodex.allow; node.flags=nodex.flags; if(node.flags&NODE_SUPER) super_number++; /* Work out the offsets */ latbin=latlong_to_bin(nodex.latitude )-nodesx->latzero; lonbin=latlong_to_bin(nodex.longitude)-nodesx->lonzero; llbin=lonbin*nodesx->latbins+latbin; for(;latlonbin<=llbin;latlonbin++) offsets[latlonbin]=i; /* Write the data */ WriteFileBuffered(fd,&node,sizeof(Node)); if(!((i+1)%10000)) printf_middle("Writing Nodes: Nodes=%"Pindex_t,i+1); } /* Close the file */ nodesx->fd=CloseFileBuffered(nodesx->fd); /* Finish off the offset indexing and write them out */ maxlatlonbins=nodesx->latbins*nodesx->lonbins; for(;latlonbin<=maxlatlonbins;latlonbin++) offsets[latlonbin]=nodesx->number; SeekFileBuffered(fd,sizeof(NodesFile)); WriteFileBuffered(fd,offsets,(nodesx->latbins*nodesx->lonbins+1)*sizeof(index_t)); free(offsets); /* Write out the header structure */ nodesfile.number=nodesx->number; nodesfile.snumber=super_number; nodesfile.latbins=nodesx->latbins; nodesfile.lonbins=nodesx->lonbins; nodesfile.latzero=nodesx->latzero; nodesfile.lonzero=nodesx->lonzero; SeekFileBuffered(fd,0); WriteFileBuffered(fd,&nodesfile,sizeof(NodesFile)); CloseFileBuffered(fd); /* Free the memory in the segments */ log_free(segmentsx->firstnode); free(segmentsx->firstnode); segmentsx->firstnode=NULL; /* Print the final message */ printf_last("Wrote Nodes: Nodes=%"Pindex_t,nodesx->number); } routino-3.4.3/src/relations.h 644 233 144 10517 12550223461 11354 0/*************************************** A header file for the relations. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef RELATIONS_H #define RELATIONS_H /*+ To stop multiple inclusions. +*/ #include #include #include "types.h" #include "cache.h" #include "files.h" #include "profiles.h" /* Data structures */ /*+ A structure containing a single relation. +*/ struct _TurnRelation { index_t from; /*+ The segment that the path comes from. +*/ index_t via; /*+ The node that the path goes via. +*/ index_t to; /*+ The segment that the path goes to. +*/ transports_t except; /*+ The types of transports that that this relation does not apply to. +*/ }; /*+ A structure containing the header from the file. +*/ typedef struct _RelationsFile { index_t trnumber; /*+ The number of turn relations in total. +*/ } RelationsFile; /*+ A structure containing a set of relations (and pointers to mmap file). +*/ struct _Relations { RelationsFile file; /*+ The header data from the file. +*/ #if !SLIM char *data; /*+ The memory mapped data. +*/ TurnRelation *turnrelations; /*+ An array of nodes. +*/ #else int fd; /*+ The file descriptor for the file. +*/ offset_t troffset; /*+ The offset of the turn relations in the file. +*/ TurnRelation cached[2]; /*+ Two cached relations read from the file in slim mode. +*/ TurnRelationCache *cache; /*+ A RAM cache of turn relations read from the file. +*/ #endif index_t via_start; /*+ The first via node in the file. +*/ index_t via_end; /*+ The last via node in the file. +*/ }; /* Functions in relations.c */ Relations *LoadRelationList(const char *filename); void DestroyRelationList(Relations *relations); index_t FindFirstTurnRelation1(Relations *relations,index_t via); index_t FindNextTurnRelation1(Relations *relations,index_t current); index_t FindFirstTurnRelation2(Relations *relations,index_t via,index_t from); index_t FindNextTurnRelation2(Relations *relations,index_t current); int IsTurnAllowed(Relations *relations,index_t index,index_t via,index_t from,index_t to,transports_t transport); /* Macros and inline functions */ #if !SLIM /*+ Return a Relation pointer given a set of relations and an index. +*/ #define LookupTurnRelation(xxx,yyy,ppp) (&(xxx)->turnrelations[yyy]) #else /* Prototypes */ static inline TurnRelation *LookupTurnRelation(Relations *relations,index_t index,int position); CACHE_NEWCACHE_PROTO(TurnRelation) CACHE_DELETECACHE_PROTO(TurnRelation) CACHE_FETCHCACHE_PROTO(TurnRelation) CACHE_INVALIDATECACHE_PROTO(TurnRelation) /* Data type */ CACHE_STRUCTURE(TurnRelation) /* Inline functions */ CACHE_NEWCACHE(TurnRelation) CACHE_DELETECACHE(TurnRelation) CACHE_FETCHCACHE(TurnRelation) CACHE_INVALIDATECACHE(TurnRelation) /*++++++++++++++++++++++++++++++++++++++ Find the Relation information for a particular relation. TurnRelation *LookupTurnRelation Returns a pointer to the cached relation information. Relations *relations The set of relations to use. index_t index The index of the relation. int position The position in the cache to store this result. ++++++++++++++++++++++++++++++++++++++*/ static inline TurnRelation *LookupTurnRelation(Relations *relations,index_t index,int position) { relations->cached[position-1]=*FetchCachedTurnRelation(relations->cache,index,relations->fd,relations->troffset); return(&relations->cached[position-1]); } #endif #endif /* RELATIONS_H */ routino-3.4.3/src/xmlparse.c 644 233 144 210451 13160531572 11224 0/*************************************** A simple generic XML parser where the structure comes from the function parameters. Not intended to be fully conforming to XML standard or a validating parser but sufficient to parse OSM XML and simple program configuration files. Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2017 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #if defined(_MSC_VER) #include #include #define read(fd,address,length) _read(fd,address,(unsigned int)(length)) #define snprintf _snprintf #define ssize_t SSIZE_T #else #include #endif #include #include #include #include #include #if defined(_MSC_VER) || defined(__MINGW32__) #define strcasecmp _stricmp #else #include #endif #include #include "xmlparse.h" /* Parser states */ #define LEX_EOF 0 #define LEX_FUNC_TAG_BEGIN 1 #define LEX_FUNC_XML_DECL_BEGIN 2 #define LEX_FUNC_TAG_POP 3 #define LEX_FUNC_TAG_PUSH 4 #define LEX_FUNC_XML_DECL_FINISH 5 #define LEX_FUNC_TAG_FINISH 6 #define LEX_FUNC_ATTR_KEY 7 #define LEX_FUNC_ATTR_VAL 8 #define LEX_STATE_INITIAL 10 #define LEX_STATE_BANGTAG 11 #define LEX_STATE_COMMENT 12 #define LEX_STATE_XML_DECL_START 13 #define LEX_STATE_XML_DECL 14 #define LEX_STATE_TAG_START 15 #define LEX_STATE_TAG 16 #define LEX_STATE_ATTR_KEY 17 #define LEX_STATE_ATTR_VAL 18 #define LEX_STATE_END_TAG1 19 #define LEX_STATE_END_TAG2 20 #define LEX_STATE_DQUOTED 21 #define LEX_STATE_SQUOTED 22 #define LEX_ERROR_TAG_START 101 #define LEX_ERROR_XML_DECL_START 102 #define LEX_ERROR_TAG 103 #define LEX_ERROR_XML_DECL 104 #define LEX_ERROR_ATTR 105 #define LEX_ERROR_END_TAG 106 #define LEX_ERROR_COMMENT 107 #define LEX_ERROR_CLOSE 108 #define LEX_ERROR_ATTR_VAL 109 #define LEX_ERROR_ENTITY_REF 110 #define LEX_ERROR_CHAR_REF 111 #define LEX_ERROR_TEXT_OUTSIDE 112 #define LEX_ERROR_UNEXP_TAG 201 #define LEX_ERROR_UNBALANCED 202 #define LEX_ERROR_NO_START 203 #define LEX_ERROR_UNEXP_ATT 204 #define LEX_ERROR_UNEXP_EOF 205 #define LEX_ERROR_XML_NOT_FIRST 206 #define LEX_ERROR_CALLBACK 255 /* Parsing variables and functions (re-initialised for each file) */ static uint64_t lineno; static unsigned char buffer[2][16384]; static unsigned char *buffer_token,*buffer_end,*buffer_ptr; static int buffer_active=0; static char *stored_message=NULL; /*++++++++++++++++++++++++++++++++++++++ Refill the data buffer making sure that the string starting at buffer_token is contiguous. int buffer_refill Return 0 if everything is OK or 1 for EOF. int fd The file descriptor to read from. ++++++++++++++++++++++++++++++++++++++*/ static inline int buffer_refill(int fd) { ssize_t n; size_t m=0; m=(buffer_end-buffer[buffer_active])+1; if(m>(sizeof(buffer[0])/2)) /* more than half full */ { m=0; buffer_active=!buffer_active; if(buffer_token) { m=(buffer_end-buffer_token)+1; memcpy(buffer[buffer_active],buffer_token,m); buffer_token=buffer[buffer_active]; } } n=read(fd,buffer[buffer_active]+m,sizeof(buffer[0])-m); buffer_ptr=buffer[buffer_active]+m; buffer_end=buffer[buffer_active]+m+n-1; if(n<=0) return(1); else return(0); } /* Macros to simplify the parser (and make it look more like lex) */ #define BEGIN(xx) do{ state=(xx); goto new_state; } while(0) #define NEXT(xx) next_state=(xx) #define START_TOKEN buffer_token=buffer_ptr #define END_TOKEN buffer_token=NULL #define NEXT_CHAR \ do{ \ if(buffer_ptr==buffer_end) \ { if(buffer_refill(fd)) BEGIN(LEX_EOF); } \ else \ buffer_ptr++; \ } while(0) /* -------- equivalent flex definition -------- S [ \t\r] N (\n) U1 [\x09\x0A\x0D\x20-\x7F] U2 [\xC2-\xDF][\x80-\xBF] U3a \xE0[\xA0-\xBF][\x80-\xBF] U3b [\xE1-\xEC][\x80-\xBF][\x80-\xBF] U3c \xED[\x80-\x9F][\x80-\xBF] U3d [\xEE-\xEF][\x80-\xBF][\x80-\xBF] U3 {U3a}|{U3b}|{U3c}|{U3d} U4a \xF0[\x90-\xBF][\x80-\xBF][\x80-\xBF] U4b [\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF] U4c \xF4[\x80-\x8F][\x80-\xBF][\x80-\xBF] U4 {U4a}|{U4b}|{U4c} U ({U1}|{U2}|{U3}|{U4}) U1_xml ([\x09\x0A\x0D\x20-\x25\x27-\x3B\x3D\x3F-\x7F]) U1quotedS_xml ([\x09\x0A\x0D\x20-\x25\x28-\x3B\x3D\x3F-\x7F]) U1quotedD_xml ([\x09\x0A\x0D\x20-\x21\x23-\x25\x27-\x3B\x3D\x3F-\x7F]) UquotedS ({U1quotedS_xml}|{U2}|{U3}|{U4}) UquotedD ({U1quotedD_xml}|{U2}|{U3}|{U4}) letter [a-zA-Z] digit [0-9] xdigit [a-fA-F0-9] namechar ({letter}|{digit}|[-._:]) namestart ({letter}|[_:]) name ({namestart}{namechar}*) entityref (&{name};) charref (&#({digit}+|x{xdigit}+);) -------- equivalent flex definition -------- */ /* Tables containing character class defintions (advance declaration for data at end of file). */ static const unsigned char quotedD[256],quotedS[256]; static const unsigned char *U2[1],*U3a[2],*U3b[2],*U3c[2],*U3d[2],*U4a[3],*U4b[3],*U4c[3]; static const unsigned char namestart[256],namechar[256],whitespace[256],digit[256],xdigit[256]; /*++++++++++++++++++++++++++++++++++++++ A function to call the callback function with the parameters needed. int call_callback Returns 1 if the callback returned with an error. const char *name The name of the tag. int (*callback)() The callback function. int type The type of tag (start and/or end). int nattributes The number of attributes collected. unsigned char *attributes[XMLPARSE_MAX_ATTRS] The list of attributes. ++++++++++++++++++++++++++++++++++++++*/ static inline int call_callback(const char *name,int (*callback)(),int type,int nattributes,unsigned char *attributes[XMLPARSE_MAX_ATTRS]) { switch(nattributes) { case 0: return (*callback)(name,type); case 1: return (*callback)(name,type,attributes[0]); case 2: return (*callback)(name,type,attributes[0],attributes[1]); case 3: return (*callback)(name,type,attributes[0],attributes[1],attributes[2]); case 4: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3]); case 5: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4]); case 6: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5]); case 7: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5],attributes[6]); case 8: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5],attributes[6],attributes[7]); case 9: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5],attributes[6],attributes[7],attributes[8]); case 10: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5],attributes[6],attributes[7],attributes[8],attributes[9]); case 11: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5],attributes[6],attributes[7],attributes[8],attributes[9],attributes[10]); case 12: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5],attributes[6],attributes[7],attributes[8],attributes[9],attributes[10],attributes[11]); case 13: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5],attributes[6],attributes[7],attributes[8],attributes[9],attributes[10],attributes[11],attributes[12]); case 14: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5],attributes[6],attributes[7],attributes[8],attributes[9],attributes[10],attributes[11],attributes[12],attributes[13]); case 15: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5],attributes[6],attributes[7],attributes[8],attributes[9],attributes[10],attributes[11],attributes[12],attributes[13],attributes[14]); case 16: return (*callback)(name,type,attributes[0],attributes[1],attributes[2],attributes[3],attributes[4],attributes[5],attributes[6],attributes[7],attributes[8],attributes[9],attributes[10],attributes[11],attributes[12],attributes[13],attributes[14],attributes[15]); default: ParseXML_SetError("Too many attributes for tag '%s' source code needs changing.",name); return(1); } } /*++++++++++++++++++++++++++++++++++++++ Parse the XML and call the functions for each tag as seen. int ParseXML Returns 0 if OK or something else in case of an error. int fd The file descriptor of the file to parse. const xmltag *const *tags The array of pointers to tags for the top level. int options A list of XML Parser options OR-ed together. ++++++++++++++++++++++++++++++++++++++*/ int ParseXML(int fd,const xmltag *const *tags,int options) { int i; int state,next_state,after_attr; unsigned char saved_buffer_ptr=0; const unsigned char *quoted; unsigned char *attributes[XMLPARSE_MAX_ATTRS]={NULL}; int attribute=0; int stackdepth=0,stackused=0; const xmltag * const **tags_stack=NULL; const xmltag **tag_stack=NULL; const xmltag *tag=NULL; /* The actual parser. */ lineno=1; if(stored_message) free(stored_message); stored_message=NULL; buffer_end=buffer[buffer_active]+sizeof(buffer[0])-1; buffer_token=NULL; buffer_refill(fd); BEGIN(LEX_STATE_INITIAL); new_state: switch(state) { /* ================ Parsing states ================ */ /* -------- equivalent flex definition -------- """"<" { BEGIN(TAG_START); } ">" { return(LEX_ERROR_CLOSE); } {N} { lineno++; } {S}+ { } . { return(LEX_ERROR_TEXT_OUTSIDE); } -------- equivalent flex definition -------- */ case LEX_STATE_INITIAL: while(1) { while(whitespace[(int)*buffer_ptr]) NEXT_CHAR; if(*buffer_ptr=='\n') { NEXT_CHAR; lineno++; } else if(*buffer_ptr=='<') { NEXT_CHAR; if(*buffer_ptr=='/') { NEXT_CHAR; BEGIN(LEX_STATE_END_TAG1); } else if(*buffer_ptr=='!') { NEXT_CHAR; BEGIN(LEX_STATE_BANGTAG); } else if(*buffer_ptr=='?') { NEXT_CHAR; BEGIN(LEX_STATE_XML_DECL_START); } else BEGIN(LEX_STATE_TAG_START); } else if(*buffer_ptr=='>') BEGIN(LEX_ERROR_CLOSE); else BEGIN(LEX_ERROR_TEXT_OUTSIDE); } break; /* -------- equivalent flex definition -------- "--" { BEGIN(COMMENT); } {N} { return(LEX_ERROR_TAG_START); } . { return(LEX_ERROR_TAG_START); } -------- equivalent flex definition -------- */ case LEX_STATE_BANGTAG: if(*buffer_ptr!='-') BEGIN(LEX_ERROR_TAG_START); NEXT_CHAR; if(*buffer_ptr!='-') BEGIN(LEX_ERROR_TAG_START); NEXT_CHAR; BEGIN(LEX_STATE_COMMENT); break; /* -------- equivalent flex definition -------- "-->" { BEGIN(INITIAL); } "--"[^>] { return(LEX_ERROR_COMMENT); } "-" { } {N} { lineno++; } [^-\n]+ { } -------- equivalent flex definition -------- */ case LEX_STATE_COMMENT: while(1) { while(*buffer_ptr!='-' && *buffer_ptr!='\n') NEXT_CHAR; if(*buffer_ptr=='-') { NEXT_CHAR; if(*buffer_ptr!='-') continue; NEXT_CHAR; if(*buffer_ptr=='>') { NEXT_CHAR; BEGIN(LEX_STATE_INITIAL); } BEGIN(LEX_ERROR_COMMENT); } else /* if(*buffer_ptr=='\n') */ { NEXT_CHAR; lineno++; } } break; /* -------- equivalent flex definition -------- xml { BEGIN(XML_DECL); return(LEX_XML_DECL_BEGIN); } {N} { return(LEX_ERROR_XML_DECL_START); } . { return(LEX_ERROR_XML_DECL_START); } -------- equivalent flex definition -------- */ case LEX_STATE_XML_DECL_START: START_TOKEN; if(*buffer_ptr=='x') { NEXT_CHAR; if(*buffer_ptr=='m') { NEXT_CHAR; if(*buffer_ptr=='l') { NEXT_CHAR; saved_buffer_ptr=*buffer_ptr; *buffer_ptr=0; NEXT(LEX_STATE_XML_DECL); BEGIN(LEX_FUNC_XML_DECL_BEGIN); } } } BEGIN(LEX_ERROR_XML_DECL_START); /* -------- equivalent flex definition -------- "?>" { BEGIN(INITIAL); return(LEX_XML_DECL_FINISH); } {S}+ { } {N} { lineno++; } {name} { after_attr=XML_DECL; BEGIN(ATTR_KEY); return(LEX_ATTR_KEY); } . { return(LEX_ERROR_XML_DECL); } -------- equivalent flex definition -------- */ case LEX_STATE_XML_DECL: while(1) { while(whitespace[(int)*buffer_ptr]) NEXT_CHAR; if(namestart[(int)*buffer_ptr]) { START_TOKEN; NEXT_CHAR; while(namechar[(int)*buffer_ptr]) NEXT_CHAR; saved_buffer_ptr=*buffer_ptr; *buffer_ptr=0; after_attr=LEX_STATE_XML_DECL; NEXT(LEX_STATE_ATTR_KEY); BEGIN(LEX_FUNC_ATTR_KEY); } else if(*buffer_ptr=='?') { NEXT_CHAR; if(*buffer_ptr=='>') { NEXT_CHAR; NEXT(LEX_STATE_INITIAL); BEGIN(LEX_FUNC_XML_DECL_FINISH); } BEGIN(LEX_ERROR_XML_DECL); } else if(*buffer_ptr=='\n') { NEXT_CHAR; lineno++; } else BEGIN(LEX_ERROR_XML_DECL); } break; /* -------- equivalent flex definition -------- {name} { BEGIN(TAG); return(LEX_TAG_BEGIN); } {N} { return(LEX_ERROR_TAG_START); } . { return(LEX_ERROR_TAG_START); } -------- equivalent flex definition -------- */ case LEX_STATE_TAG_START: if(namestart[(int)*buffer_ptr]) { START_TOKEN; NEXT_CHAR; while(namechar[(int)*buffer_ptr]) NEXT_CHAR; saved_buffer_ptr=*buffer_ptr; *buffer_ptr=0; NEXT(LEX_STATE_TAG); BEGIN(LEX_FUNC_TAG_BEGIN); } BEGIN(LEX_ERROR_TAG_START); /* -------- equivalent flex definition -------- {name} { BEGIN(END_TAG2); return(LEX_TAG_POP); } {N} { return(LEX_ERROR_END_TAG); } . { return(LEX_ERROR_END_TAG); } -------- equivalent flex definition -------- */ case LEX_STATE_END_TAG1: if(namestart[(int)*buffer_ptr]) { START_TOKEN; NEXT_CHAR; while(namechar[(int)*buffer_ptr]) NEXT_CHAR; saved_buffer_ptr=*buffer_ptr; *buffer_ptr=0; NEXT(LEX_STATE_END_TAG2); BEGIN(LEX_FUNC_TAG_POP); } BEGIN(LEX_ERROR_END_TAG); /* -------- equivalent flex definition -------- ">" { BEGIN(INITIAL); } {N} { return(LEX_ERROR_END_TAG); } . { return(LEX_ERROR_END_TAG); } -------- equivalent flex definition -------- */ case LEX_STATE_END_TAG2: if(*buffer_ptr=='>') { NEXT_CHAR; BEGIN(LEX_STATE_INITIAL); } BEGIN(LEX_ERROR_END_TAG); /* -------- equivalent flex definition -------- "/>" { BEGIN(INITIAL); return(LEX_TAG_FINISH); } ">" { BEGIN(INITIAL); return(LEX_TAG_PUSH); } {S}+ { } {N} { lineno++; } {name} { after_attr=TAG; BEGIN(ATTR_KEY); return(LEX_ATTR_KEY); } . { return(LEX_ERROR_TAG); } -------- equivalent flex definition -------- */ case LEX_STATE_TAG: while(1) { while(whitespace[(int)*buffer_ptr]) NEXT_CHAR; if(namestart[(int)*buffer_ptr]) { START_TOKEN; NEXT_CHAR; while(namechar[(int)*buffer_ptr]) NEXT_CHAR; saved_buffer_ptr=*buffer_ptr; *buffer_ptr=0; after_attr=LEX_STATE_TAG; NEXT(LEX_STATE_ATTR_KEY); BEGIN(LEX_FUNC_ATTR_KEY); } else if(*buffer_ptr=='/') { NEXT_CHAR; if(*buffer_ptr=='>') { NEXT_CHAR; NEXT(LEX_STATE_INITIAL); BEGIN(LEX_FUNC_TAG_FINISH); } BEGIN(LEX_ERROR_TAG); } else if(*buffer_ptr=='>') { NEXT_CHAR; NEXT(LEX_STATE_INITIAL); BEGIN(LEX_FUNC_TAG_PUSH); } else if(*buffer_ptr=='\n') { NEXT_CHAR; lineno++; } else BEGIN(LEX_ERROR_TAG); } break; /* -------- equivalent flex definition -------- = { BEGIN(ATTR_VAL); } {N} { return(LEX_ERROR_ATTR); } . { return(LEX_ERROR_ATTR); } -------- equivalent flex definition -------- */ case LEX_STATE_ATTR_KEY: if(*buffer_ptr=='=') { NEXT_CHAR; BEGIN(LEX_STATE_ATTR_VAL); } BEGIN(LEX_ERROR_ATTR); /* -------- equivalent flex definition -------- \" { BEGIN(DQUOTED); } \' { BEGIN(SQUOTED); } {N} { return(LEX_ERROR_ATTR); } . { return(LEX_ERROR_ATTR); } -------- equivalent flex definition -------- */ case LEX_STATE_ATTR_VAL: if(*buffer_ptr=='"') { NEXT_CHAR; BEGIN(LEX_STATE_DQUOTED); } else if(*buffer_ptr=='\'') { NEXT_CHAR; BEGIN(LEX_STATE_SQUOTED); } BEGIN(LEX_ERROR_ATTR); /* -------- equivalent flex definition -------- \" { BEGIN(after_attr); return(LEX_ATTR_VAL); } {entityref} { if(options&XMLPARSE_RETURN_ATTR_ENCODED) {append_string(yytext);} else { const char *str=ParseXML_Decode_Entity_Ref(yytext); if(str) {append_string(str);} else {return(LEX_ERROR_ENTITY_REF);} } } {charref} { if(options&XMLPARSE_RETURN_ATTR_ENCODED) {append_string(yytext);} else { const char *str=ParseXML_Decode_Char_Ref(yytext); if(str) {append_string(str);} else {return(LEX_ERROR_CHAR_REF);} } } {UquotedD} { } [<>&] { return(LEX_ERROR_ATTR_VAL); } . { return(LEX_ERROR_ATTR_VAL); } \' { BEGIN(after_attr); return(LEX_ATTR_VAL); } {entityref} { if(options&XMLPARSE_RETURN_ATTR_ENCODED) {append_string(yytext);} else { const char *str=ParseXML_Decode_Entity_Ref(yytext); if(str) {append_string(str);} else {return(LEX_ERROR_ENTITY_REF);} } } {charref} { if(options&XMLPARSE_RETURN_ATTR_ENCODED) {append_string(yytext);} else { const char *str=ParseXML_Decode_Char_Ref(yytext); if(str) {append_string(str);} else {return(LEX_ERROR_CHAR_REF);} } } {UquotedS} { append_string(yytext); } [<>&] { return(LEX_ERROR_ATTR_VAL); } . { return(LEX_ERROR_ATTR_VAL); } -------- equivalent flex definition -------- */ case LEX_STATE_DQUOTED: case LEX_STATE_SQUOTED: if(state==LEX_STATE_DQUOTED) quoted=quotedD; else quoted=quotedS; START_TOKEN; while(1) { switch(quoted[(int)*buffer_ptr]) { case 10: /* U1 - used by all tag keys and many values */ do { NEXT_CHAR; } while(quoted[(int)*buffer_ptr]==10); break; case 20: /* U2 */ NEXT_CHAR; if(!U2[0][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; break; case 31: /* U3a */ NEXT_CHAR; if(!U3a[0][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!U3a[1][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; break; case 32: /* U3b */ NEXT_CHAR; if(!U3b[0][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!U3b[1][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; break; case 33: /* U3c */ NEXT_CHAR; if(!U3c[0][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!U3c[1][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; break; case 34: /* U3d */ NEXT_CHAR; if(!U3d[0][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!U3d[1][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; break; case 41: /* U4a */ NEXT_CHAR; if(!U4a[0][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!U4a[1][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!U4a[2][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; break; case 42: /* U4b */ NEXT_CHAR; if(!U4b[0][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!U4b[1][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!U4b[2][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; break; case 43: /* U4c */ NEXT_CHAR; if(!U4c[0][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!U4c[1][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!U4c[2][(int)*buffer_ptr]) BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; break; case 50: /* entityref or charref */ NEXT_CHAR; if(*buffer_ptr=='#') /* charref */ { int charref_len=3; NEXT_CHAR; if(digit[(int)*buffer_ptr]) /* decimal */ { NEXT_CHAR; charref_len++; while(digit[(int)*buffer_ptr]) { NEXT_CHAR; charref_len++; } if(*buffer_ptr!=';') BEGIN(LEX_ERROR_ATTR_VAL); } else if(*buffer_ptr=='x') /* hex */ { NEXT_CHAR; charref_len++; while(xdigit[(int)*buffer_ptr]) { NEXT_CHAR; charref_len++; } if(*buffer_ptr!=';') BEGIN(LEX_ERROR_ATTR_VAL); } else /* other */ BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!(options&XMLPARSE_RETURN_ATTR_ENCODED)) { const char *str; saved_buffer_ptr=*buffer_ptr; *buffer_ptr=0; str=ParseXML_Decode_Char_Ref((char*)(buffer_ptr-charref_len)); if(!str) { buffer_ptr-=charref_len; BEGIN(LEX_ERROR_CHAR_REF); } buffer_token=memmove(buffer_token+(charref_len-strlen(str)),buffer_token,buffer_ptr-buffer_token-charref_len); memcpy(buffer_ptr-strlen(str),str,strlen(str)); *buffer_ptr=saved_buffer_ptr; } } else if(namestart[(int)*buffer_ptr]) /* entityref */ { int entityref_len=3; NEXT_CHAR; while(namechar[(int)*buffer_ptr]) { NEXT_CHAR; entityref_len++; } if(*buffer_ptr!=';') BEGIN(LEX_ERROR_ATTR_VAL); NEXT_CHAR; if(!(options&XMLPARSE_RETURN_ATTR_ENCODED)) { const char *str; saved_buffer_ptr=*buffer_ptr; *buffer_ptr=0; str=ParseXML_Decode_Entity_Ref((char*)(buffer_ptr-entityref_len)); if(!str) { buffer_ptr-=entityref_len; BEGIN(LEX_ERROR_ENTITY_REF); } buffer_token=memmove(buffer_token+(entityref_len-strlen(str)),buffer_token,buffer_ptr-buffer_token-entityref_len); memcpy(buffer_ptr-strlen(str),str,strlen(str)); *buffer_ptr=saved_buffer_ptr; } } else /* other */ BEGIN(LEX_ERROR_ATTR_VAL); break; case 99: /* quote */ *buffer_ptr=0; NEXT_CHAR; NEXT(after_attr); BEGIN(LEX_FUNC_ATTR_VAL); default: /* other */ BEGIN(LEX_ERROR_ATTR_VAL); } } break; /* ================ Functional states ================ */ /* The start of a tag for an XML declaration */ case LEX_FUNC_XML_DECL_BEGIN: if(tag_stack) BEGIN(LEX_ERROR_XML_NOT_FIRST); /* fall through */ /* The start of a tag for an element */ case LEX_FUNC_TAG_BEGIN: tag=NULL; for(i=0;tags[i];i++) if(buffer_token[0]==tags[i]->name[0] || tolower(buffer_token[0])==tags[i]->name[0]) if(!strcasecmp((char*)buffer_token+1,tags[i]->name+1)) { tag=tags[i]; for(i=0;inattributes;i++) attributes[i]=NULL; break; } if(tag==NULL) BEGIN(LEX_ERROR_UNEXP_TAG); END_TOKEN; *buffer_ptr=saved_buffer_ptr; BEGIN(next_state); /* The end of the start-tag for an element */ case LEX_FUNC_TAG_PUSH: if(stackused==stackdepth) { tag_stack =realloc(tag_stack ,(stackdepth+=8)*sizeof(xmltag*)); tags_stack=realloc(tags_stack,(stackdepth+=8)*sizeof(xmltag**)); } tag_stack [stackused]=tag; tags_stack[stackused]=tags; stackused++; if(tag->callback) if(call_callback(tag->name,tag->callback,XMLPARSE_TAG_START,tag->nattributes,attributes)) BEGIN(LEX_ERROR_CALLBACK); tags=tag->subtags; BEGIN(next_state); /* The end of the empty-element-tag for an XML declaration */ case LEX_FUNC_XML_DECL_FINISH: /* The end of the empty-element-tag for an element */ case LEX_FUNC_TAG_FINISH: if(tag->callback) if(call_callback(tag->name,tag->callback,XMLPARSE_TAG_START|XMLPARSE_TAG_END,tag->nattributes,attributes)) BEGIN(LEX_ERROR_CALLBACK); if(stackused>0) tag=tag_stack[stackused-1]; else tag=NULL; BEGIN(next_state); /* The end of the end-tag for an element */ case LEX_FUNC_TAG_POP: stackused--; if(stackused<0) BEGIN(LEX_ERROR_NO_START); tags=tags_stack[stackused]; tag =tag_stack [stackused]; if(strcmp((char*)buffer_token,tag->name)) BEGIN(LEX_ERROR_UNBALANCED); for(i=0;inattributes;i++) attributes[i]=NULL; if(tag->callback) if(call_callback(tag->name,tag->callback,XMLPARSE_TAG_END,tag->nattributes,attributes)) BEGIN(LEX_ERROR_CALLBACK); if(stackused>0) tag=tag_stack[stackused-1]; else tag=NULL; END_TOKEN; *buffer_ptr=saved_buffer_ptr; BEGIN(next_state); /* An attribute key */ case LEX_FUNC_ATTR_KEY: attribute=-1; for(i=0;inattributes;i++) if(buffer_token[0]==tag->attributes[i][0] || tolower(buffer_token[0])==tag->attributes[i][0]) if(!strcasecmp((char*)buffer_token+1,tag->attributes[i]+1)) { attribute=i; break; } if(attribute==-1) { if((options&XMLPARSE_UNKNOWN_ATTRIBUTES)==XMLPARSE_UNKNOWN_ATTR_ERROR || ((options&XMLPARSE_UNKNOWN_ATTRIBUTES)==XMLPARSE_UNKNOWN_ATTR_ERRNONAME && !strchr((char*)buffer_token,':'))) BEGIN(LEX_ERROR_UNEXP_ATT); #ifndef LIBROUTINO else if((options&XMLPARSE_UNKNOWN_ATTRIBUTES)==XMLPARSE_UNKNOWN_ATTR_WARN) ParseXML_SetError("Warning on line %"PRIu64": unexpected attribute '%s' for tag '%s'.",lineno,buffer_token,tag->name); #endif } END_TOKEN; *buffer_ptr=saved_buffer_ptr; BEGIN(next_state); /* An attribute value */ case LEX_FUNC_ATTR_VAL: if(tag->callback && attribute!=-1) attributes[attribute]=buffer_token; END_TOKEN; BEGIN(next_state); /* End of file */ case LEX_EOF: if(tag) BEGIN(LEX_ERROR_UNEXP_EOF); break; /* ================ Error states ================ */ case LEX_ERROR_TAG_START: ParseXML_SetError("Character '<' seen not at start of tag."); break; case LEX_ERROR_XML_DECL_START: ParseXML_SetError("Characters ''.",tag->name); break; case LEX_ERROR_XML_DECL: ParseXML_SetError("Invalid character seen inside XML declaration ''."); break; case LEX_ERROR_ATTR: ParseXML_SetError("Invalid attribute definition seen in tag."); break; case LEX_ERROR_END_TAG: ParseXML_SetError("Invalid character seen in end-tag."); break; case LEX_ERROR_COMMENT: ParseXML_SetError("Invalid comment seen."); break; case LEX_ERROR_CLOSE: ParseXML_SetError("Character '>' seen not at end of tag."); break; case LEX_ERROR_ATTR_VAL: ParseXML_SetError("Invalid character '%c' seen in attribute value.",*buffer_ptr); break; case LEX_ERROR_ENTITY_REF: ParseXML_SetError("Invalid entity reference '%s' seen in attribute value.",buffer_ptr); break; case LEX_ERROR_CHAR_REF: ParseXML_SetError("Invalid character reference '%s' seen in attribute value.",buffer_ptr); break; case LEX_ERROR_TEXT_OUTSIDE: ParseXML_SetError("Non-whitespace '%c' seen outside tag.",*buffer_ptr); break; case LEX_ERROR_UNEXP_TAG: ParseXML_SetError("Unexpected tag '%s'.",buffer_token); break; case LEX_ERROR_UNBALANCED: ParseXML_SetError("End tag '' doesn't match start tag '<%s ...>'.",buffer_token,tag->name); break; case LEX_ERROR_NO_START: ParseXML_SetError("End tag '' seen but there was no start tag '<%s ...>'.",buffer_token,buffer_token); break; case LEX_ERROR_UNEXP_ATT: ParseXML_SetError("Unexpected attribute '%s' for tag '%s'.",buffer_token,tag->name); break; case LEX_ERROR_UNEXP_EOF: ParseXML_SetError("End of file seen without end tag ''.",tag->name); break; case LEX_ERROR_XML_NOT_FIRST: ParseXML_SetError("XML declaration '' not before all other tags."); break; case LEX_ERROR_CALLBACK: /* The error message should have been set by the callback function, have a fallback just in case */ if(!stored_message) ParseXML_SetError("Unknown error from tag callback function."); break; } /* Print the error message */ #ifndef LIBROUTINO if(state) fprintf(stderr,"XML Parser: %s\n",stored_message); #endif /* Delete the tagdata */ if(stackdepth) { free(tag_stack); free(tags_stack); } return(state); } /*++++++++++++++++++++++++++++++++++++++ Return the current parser line number. uint64_t ParseXML_LineNumber Returns the line number. ++++++++++++++++++++++++++++++++++++++*/ uint64_t ParseXML_LineNumber(void) { return(lineno); } /*++++++++++++++++++++++++++++++++++++++ Store an error message for later. const char *format The format string. ... The other arguments. ++++++++++++++++++++++++++++++++++++++*/ void ParseXML_SetError(const char *format, ...) { va_list ap; char temp[2]; int line_length,error_length; #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-overflow" #pragma GCC diagnostic ignored "-Wformat-truncation" #endif line_length=snprintf(temp,1,"Error on line %" PRIu64 ": ",lineno); #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic pop #endif va_start(ap,format); error_length=vsnprintf(temp,1,format,ap); va_end(ap); if(stored_message) free(stored_message); stored_message=malloc(error_length+line_length+1); line_length=sprintf(stored_message,"Error on line %" PRIu64 ": ",lineno); va_start(ap,format); vsprintf(stored_message+line_length,format,ap); va_end(ap); } /*++++++++++++++++++++++++++++++++++++++ Return a stored error message. char *ParseXML_GetError Returns the most recent stored error. ++++++++++++++++++++++++++++++++++++++*/ char *ParseXML_GetError(void) { return(stored_message); } /*++++++++++++++++++++++++++++++++++++++ Convert an XML entity reference into an ASCII string. char *ParseXML_Decode_Entity_Ref Returns a pointer to the replacement decoded string. const char *string The entity reference string. ++++++++++++++++++++++++++++++++++++++*/ char *ParseXML_Decode_Entity_Ref(const char *string) { if(!strcmp(string,"&")) return("&"); if(!strcmp(string,"<")) return("<"); if(!strcmp(string,">")) return(">"); if(!strcmp(string,"'")) return("'"); if(!strcmp(string,""")) return("\""); return(NULL); } /*++++++++++++++++++++++++++++++++++++++ Convert an XML character reference into an ASCII string. char *ParseXML_Decode_Char_Ref Returns a pointer to the replacement decoded string. const char *string The character reference string. ++++++++++++++++++++++++++++++++++++++*/ char *ParseXML_Decode_Char_Ref(const char *string) { static char result[5]=""; /* static allocation of return value (set each call) */ long int unicode; if(string[2]=='x') unicode=strtol(string+3,NULL,16); else unicode=strtol(string+2,NULL,10); if(unicode<0x80) { /* 0000 0000-0000 007F => 0xxxxxxx */ result[0]=(char)unicode; result[1]=0; } else if(unicode<0x07FF) { /* 0000 0080-0000 07FF => 110xxxxx 10xxxxxx */ result[0]=(char)(0xC0+((unicode&0x07C0)>>6)); result[1]=(char)(0x80+ (unicode&0x003F)); result[2]=0; } else if(unicode<0xFFFF) { /* 0000 0800-0000 FFFF => 1110xxxx 10xxxxxx 10xxxxxx */ result[0]=(char)(0xE0+((unicode&0xF000)>>12)); result[1]=(char)(0x80+((unicode&0x0FC0)>>6)); result[2]=(char)(0x80+ (unicode&0x003F)); result[3]=0; } else if(unicode<0x1FFFFF) { /* 0001 0000-001F FFFF => 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ result[0]=(char)(0xF0+((unicode&0x1C0000)>>18)); result[1]=(char)(0x80+((unicode&0x03F000)>>12)); result[2]=(char)(0x80+((unicode&0x000FC0)>>6)); result[3]=(char)(0x80+ (unicode&0x00003F)); result[4]=0; } else { result[0]=(char)0xFF; result[1]=(char)0xFD; result[2]=0; } return(result); } /*++++++++++++++++++++++++++++++++++++++ Convert a string into something that is safe to output in an XML file. char *ParseXML_Encode_Safe_XML Returns a pointer to a static replacement encoded string (or the original if no change needed). const char *string The string to convert. ++++++++++++++++++++++++++++++++++++++*/ char *ParseXML_Encode_Safe_XML(const char *string) { static const char hexstring[17]="0123456789ABCDEF"; /* local lookup table */ static char *result=NULL; /* static allocation of return value */ int i=0,j=0,len; for(i=0;string[i];i++) if(string[i]=='<' || string[i]=='>' || string[i]=='&' || string[i]=='\'' || string[i]=='"' || string[i]<32 || (unsigned char)string[i]>127) break; if(!string[i]) return((char*)string); len=i+256-6; result=(char*)realloc((void*)result,len+7); strncpy(result,string,j=i); do { for(;j') { result[j++]='&'; result[j++]='g'; result[j++]='t'; result[j++]=';'; } else if(string[i]>=32 && (unsigned char)string[i]<=127) result[j++]=string[i]; else { unsigned int unicode; /* Decode the UTF-8 */ if((string[i]&0x80)==0) { /* 0000 0000-0000 007F => 0xxxxxxx */ unicode=string[i]; } else if((string[i]&0xE0)==0xC0 && (string[i]&0x1F)>=2 && (string[i+1]&0xC0)==0x80) { /* 0000 0080-0000 07FF => 110xxxxx 10xxxxxx */ unicode =(string[i++]&0x1F)<<6; unicode|= string[i ]&0x3F; } else if((string[i]&0xF0)==0xE0 && (string[i+1]&0xC0)==0x80 && (string[i+2]&0xC0)==0x80) { /* 0000 0800-0000 FFFF => 1110xxxx 10xxxxxx 10xxxxxx */ unicode =(string[i++]&0x0F)<<12; unicode|=(string[i++]&0x3F)<<6; unicode|= string[i ]&0x3F; } else if((string[i]&0xF8)==0xF0 && (string[i+1]&0xC0)==0x80 && (string[i+2]&0xC0)==0x80 && (string[i+3]&0xC0)==0x80) { /* 0001 0000-001F FFFF => 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ unicode =(string[i++]&0x07)<<18; unicode|=(string[i++]&0x3F)<<12; unicode|=(string[i++]&0x3F)<<6; unicode|= string[i ]&0x3F; } else unicode=0xFFFD; /* Output the character entity */ result[j++]='&'; result[j++]='#'; result[j++]='x'; if(unicode&0x00FF0000) { result[j++]=hexstring[((unicode>>16)&0xf0)>>4]; result[j++]=hexstring[((unicode>>16)&0x0f) ]; } if(unicode&0x00FFFF00) { result[j++]=hexstring[((unicode>>8)&0xf0)>>4]; result[j++]=hexstring[((unicode>>8)&0x0f) ]; } result[j++]=hexstring[(unicode&0xf0)>>4]; result[j++]=hexstring[(unicode&0x0f) ]; result[j++]=';'; } if(string[i]) /* Not finished */ { len+=256; result=(char*)realloc((void*)result,len+7); } } while(string[i]); result[j]=0; return(result); } /*++++++++++++++++++++++++++++++++++++++ Check that a string really is an integer. int ParseXML_IsInteger Returns 1 if an integer could be found or 0 otherwise. const char *string The string to be parsed. ++++++++++++++++++++++++++++++++++++++*/ int ParseXML_IsInteger(const char *string) { const unsigned char *p=(unsigned char*)string; if(*p=='-' || *p=='+') p++; while(digit[(int)*p]) p++; if(*p) return(0); else return(1); } /*++++++++++++++++++++++++++++++++++++++ Check that a string really is a floating point number. int ParseXML_IsFloating Returns 1 if a floating point number could be found or 0 otherwise. const char *string The string to be parsed. ++++++++++++++++++++++++++++++++++++++*/ int ParseXML_IsFloating(const char *string) { const unsigned char *p=(unsigned char*)string; if(*p=='-' || *p=='+') p++; while(digit[(int)*p] || *p=='.') p++; if(*p=='e' || *p=='E') { p++; if(*p=='-' || *p=='+') p++; while(digit[*p]) p++; } if(*p) return(0); else return(1); } /* Table for checking for double-quoted characters. */ static const unsigned char quotedD[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0,10, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 10,10,99,10,10,10,50,10,10,10,10,10,10,10,10,10, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 10,10,10,10,10,10,10,10,10,10,10,10, 0,10, 0,10, /* 0x30-0x3f "0123456789:;<=>?" */ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, /* 0x60-0x6f "`abcdefghijklmno" */ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0-0xaf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0-0xbf " " */ 0, 0,20,20,20,20,20,20,20,20,20,20,20,20,20,20, /* 0xc0-0xcf " " */ 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, /* 0xd0-0xdf " " */ 31,32,32,32,32,32,32,32,32,32,32,32,32,33,34,34, /* 0xe0-0xef " " */ 41,42,42,42,43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for single-quoted characters. */ static const unsigned char quotedS[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0,10, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 10,10,10,10,10,10,50,99,10,10,10,10,10,10,10,10, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 10,10,10,10,10,10,10,10,10,10,10,10, 0,10, 0,10, /* 0x30-0x3f "0123456789:;<=>?" */ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, /* 0x60-0x6f "`abcdefghijklmno" */ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0-0xaf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0-0xbf " " */ 0, 0,20,20,20,20,20,20,20,20,20,20,20,20,20,20, /* 0xc0-0xcf " " */ 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, /* 0xd0-0xdf " " */ 31,32,32,32,32,32,32,32,32,32,32,32,32,33,34,34, /* 0xe0-0xef " " */ 41,42,42,42,43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for characters between 0x80 and 0x8f. */ static const unsigned char U_80_8F[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30-0x3f "0123456789:;<=>?" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6f "`abcdefghijklmno" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80-0x8f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0-0xaf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0-0xbf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0-0xcf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0-0xdf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0-0xef " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for characters between 0x80 and 0x9f. */ static const unsigned char U_80_9F[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30-0x3f "0123456789:;<=>?" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6f "`abcdefghijklmno" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80-0x8f " " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90-0x9f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0-0xaf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0-0xbf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0-0xcf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0-0xdf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0-0xef " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for characters between 0x80 and 0xbf. */ static const unsigned char U_80_BF[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30-0x3f "0123456789:;<=>?" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6f "`abcdefghijklmno" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80-0x8f " " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90-0x9f " " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0-0xaf " " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0-0xbf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0-0xcf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0-0xdf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0-0xef " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for characters between 0x90 and 0xbf. */ static const unsigned char U_90_BF[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30-0x3f "0123456789:;<=>?" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6f "`abcdefghijklmno" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8f " " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90-0x9f " " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0-0xaf " " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0-0xbf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0-0xcf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0-0xdf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0-0xef " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for characters between 0xa0 and 0xbf. */ static const unsigned char U_A0_BF[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30-0x3f "0123456789:;<=>?" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6f "`abcdefghijklmno" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9f " " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0-0xaf " " */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0-0xbf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0-0xcf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0-0xdf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0-0xef " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for U2 characters = C2-DF,80-BF = U+0080-U+07FF. */ static const unsigned char *U2[1]={ U_80_BF }; /* Table for checking for U3a characters = E0,A0-BF,80-BF = U+0800-U+0FFF. */ static const unsigned char *U3a[2]={ U_A0_BF, U_80_BF }; /* Table for checking for U3b characters = E1-EC,80-BF,80-BF = U+1000-U+CFFF. */ static const unsigned char *U3b[2]={ U_80_BF, U_80_BF }; /* Table for checking for U3c characters = ED,80-9F,80-BF = U+D000-U+D7FF (U+D800-U+DFFF are not legal in XML). */ static const unsigned char *U3c[2]={ U_80_9F, U_80_BF }; /* Table for checking for U3d characters = EE-EF,80-BF,80-BF = U+E000-U+FFFF (U+FFFE-U+FFFF are not legal in XML but handled). */ static const unsigned char *U3d[2]={ U_80_BF, U_80_BF }; /* Table for checking for U4a characters = F0,90-BF,80-BF,80-BF = U+10000-U+3FFFF. */ static const unsigned char *U4a[3]={ U_90_BF, U_80_BF, U_80_BF }; /* Table for checking for U4b characters = F1-F3,80-BF,80-BF,80-BF = U+40000-U+FFFFF. */ static const unsigned char *U4b[3]={ U_80_BF, U_80_BF, U_80_BF }; /* Table for checking for U4c characters = F4,80-8F,80-BF,80-BF = U+100000-U+10FFFF (U+110000- are not legal in XML). */ static const unsigned char *U4c[3]={ U_80_8F, U_80_BF, U_80_BF }; /* Table for checking for namestart characters. */ static const unsigned char namestart[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* 0x30-0x3f "0123456789:;<=>?" */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60-0x6f "`abcdefghijklmno" */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0-0xaf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0-0xbf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0-0xcf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0-0xdf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0-0xef " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for namechar characters. */ static const unsigned char namechar[256] ={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 0x30-0x3f "0123456789:;<=>?" */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60-0x6f "`abcdefghijklmno" */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0-0xaf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0-0xbf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0-0xcf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0-0xdf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0-0xef " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for whitespace characters. */ static const unsigned char whitespace[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30-0x3f "0123456789:;<=>?" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6f "`abcdefghijklmno" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0-0xaf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0-0xbf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0-0xcf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0-0xdf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0-0xef " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for digit characters. */ static const unsigned char digit[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 0x30-0x3f "0123456789:;<=>?" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6f "`abcdefghijklmno" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0-0xaf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0-0xbf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0-0xcf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0-0xdf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0-0xef " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ /* Table for checking for xdigit characters. */ static const unsigned char xdigit[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x0f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x1f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x2f " !"#$%&'()*+,-./" */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 0x30-0x3f "0123456789:;<=>?" */ 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40-0x4f "@ABCDEFGHIJKLMNO" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50-0x5f "PQRSTUVWXYZ[\]^_" */ 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x6f "`abcdefghijklmno" */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x7f "pqrstuvwxyz{|}~ " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80-0x8f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90-0x9f " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0-0xaf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0-0xbf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0-0xcf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0-0xdf " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0-0xef " " */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* 0xf0-0xff " " */ routino-3.4.3/src/logerror.c 644 233 144 11367 14774246326 11225 0/*************************************** Error logging functions Part of the Routino routing software. ******************/ /****************** This file Copyright 2013, 2015, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include "typesx.h" #include "files.h" #include "logging.h" /* Global variables */ /*+ The name of the error log file. +*/ char *errorlogfilename=NULL; /*+ The name of the binary error log file. +*/ char *errorbinfilename=NULL; /* Local variables (re-initialised by open_errorlog() function) */ /*+ The file handle for the error log file. +*/ static FILE *errorlogfile=NULL; /*+ The file descriptor for the binary error log file. +*/ static int errorbinfile=-1; /*+ The offset of the error message in the error log file. +*/ static offset_t errorfileoffset=0; /*++++++++++++++++++++++++++++++++++++++ Create the error log file. const char *filename The name of the file to create. int append The option to append to an existing file. int bin The option to enable a binary log file. ++++++++++++++++++++++++++++++++++++++*/ void open_errorlog(const char *filename,int append,int bin) { /* Text log file */ errorlogfilename=(char*)malloc(strlen(filename)+8); strcpy(errorlogfilename,filename); #if defined(_MSC_VER) || defined(__MINGW32__) errorlogfile=fopen(errorlogfilename,append?"ab":"wb"); #else errorlogfile=fopen(errorlogfilename,append?"a" :"w" ); #endif logassert_format(errorlogfile,("Cannot open file '%s' for writing [%s].",errorlogfilename,strerror(errno))); /* Binary log file */ if(bin) { errorbinfilename=(char*)malloc(strlen(filename)+8); sprintf(errorbinfilename,"%s.tmp",filename); errorfileoffset=0; if(append) { if(ExistsFile(filename)) errorfileoffset=SizeFile(filename); errorbinfile=OpenFileBufferedAppend(errorbinfilename); } else errorbinfile=OpenFileBufferedNew(errorbinfilename); } else errorbinfile=-1; } /*++++++++++++++++++++++++++++++++++++++ Close the error log file. ++++++++++++++++++++++++++++++++++++++*/ void close_errorlog(void) { if(errorlogfile) { fclose(errorlogfile); if(errorbinfile!=-1) CloseFileBuffered(errorbinfile); } } /*++++++++++++++++++++++++++++++++++++++ Log a message to the error log file. const char *format The format string. ... The other arguments. ++++++++++++++++++++++++++++++++++++++*/ void logerror(const char *format, ...) { va_list ap; if(!errorlogfile) return; va_start(ap,format); errorfileoffset+=vfprintf(errorlogfile,format,ap); va_end(ap); } /*++++++++++++++++++++++++++++++++++++++ Store the node information in the binary log file for this message. node_t logerror_node Returns the node identifier. node_t id The node identifier. ++++++++++++++++++++++++++++++++++++++*/ node_t logerror_node(node_t id) { if(errorbinfile!=-1) { ErrorLogObject error={0}; error.id=id; error.type='N'; error.offset=errorfileoffset; WriteFileBuffered(errorbinfile,&error,sizeof(ErrorLogObject)); } return(id); } /*++++++++++++++++++++++++++++++++++++++ Store the way information in the binary log file for this message. way_t logerror_way Returns the way identifier. way_t id The way identifier. ++++++++++++++++++++++++++++++++++++++*/ way_t logerror_way(way_t id) { if(errorbinfile!=-1) { ErrorLogObject error={0}; error.id=id; error.type='W'; error.offset=errorfileoffset; WriteFileBuffered(errorbinfile,&error,sizeof(ErrorLogObject)); } return(id); } /*++++++++++++++++++++++++++++++++++++++ Store the relation information in the binary log file for this message. relation_t logerror_relation Returns the relation identifier. relation_t id The relation identifier. ++++++++++++++++++++++++++++++++++++++*/ relation_t logerror_relation(relation_t id) { if(errorbinfile!=-1) { ErrorLogObject error={0}; error.id=id; error.type='R'; error.offset=errorfileoffset; WriteFileBuffered(errorbinfile,&error,sizeof(ErrorLogObject)); } return(id); } routino-3.4.3/src/relationsx.h 644 233 144 12236 13547422532 11553 0/*************************************** A header file for the extended Relations structure. Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2015, 2019 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef RELATIONSX_H #define RELATIONSX_H /*+ To stop multiple inclusions. +*/ #include #include "types.h" #include "typesx.h" /* Data structures */ /*+ An extended structure containing a single route relation. +*/ struct _RouteRelX { relation_t id; /*+ The relation identifier. +*/ transports_t routes; /*+ The types of transports that that this relation is for. +*/ }; /*+ An extended structure containing a single turn restriction relation. +*/ struct _TurnRelX { relation_t id; /*+ The relation identifier. +*/ way_t from; /*+ The id of the starting way; initially the OSM value, later the SegmentX index. +*/ node_t via; /*+ The id of the via node; initially the OSM value, later the NodeX index. +*/ way_t to; /*+ The id of the ending way; initially the OSM value, later the SegmentX index. +*/ TurnRestriction restriction; /*+ The type of restriction. +*/ transports_t except; /*+ The types of transports that that this relation does not apply to. +*/ }; /*+ A structure containing a set of relations. +*/ struct _RelationsX { /* Route relations */ char *rrfilename; /*+ The name of the intermediate file (for the RouteRelX). +*/ char *rrfilename_tmp; /*+ The name of the temporary file (for the RouteRelX). +*/ int rrfd; /*+ The file descriptor of the open file (for the RouteRelX). +*/ index_t rrnumber; /*+ The number of extended route relations. +*/ index_t rrknumber; /*+ The number of extended route relations kept for next time. +*/ char *rrifilename_tmp; /*+ The name of the temporary file (for the ID index). +*/ int rrifd; /*+ The file descriptor of the temporary file (for the ID index). +*/ relation_t *rridata; /*+ The extended relation IDs (sorted by ID). +*/ char *rrofilename_tmp; /*+ The name of the temporary file (for the offset index). +*/ int rrofd; /*+ The file descriptor of the temporary file (for the offset index). +*/ offset_t *rrodata; /*+ The offset of the route relation in the file (used for error log). +*/ /* Turn restriction relations */ char *trfilename; /*+ The name of the intermediate file (for the TurnRelX). +*/ char *trfilename_tmp; /*+ The name of the temporary file (for the TurnRelX). +*/ int trfd; /*+ The file descriptor of the temporary file (for the TurnRelX). +*/ index_t trnumber; /*+ The number of extended turn restriction relations. +*/ index_t trknumber; /*+ The number of extended turn relations kept for next time. +*/ char *trifilename_tmp; /*+ The name of the temporary file (for the ID index). +*/ int trifd; /*+ The file descriptor of the temporary file (for the ID index). +*/ relation_t *tridata; /*+ The extended relation IDs (sorted by ID). +*/ }; /* Functions in relationsx.c */ RelationsX *NewRelationList(int append,int readonly); void FreeRelationList(RelationsX *relationsx,int keep); void AppendRouteRelationList(RelationsX* relationsx,relation_t id, transports_t routes, node_t *nodes,int nnodes, way_t *ways,int nways, relation_t *relations,int nrelations); void AppendTurnRelationList(RelationsX* relationsx,relation_t id, way_t from,way_t to,node_t via, TurnRestriction restriction,transports_t except); void FinishRelationList(RelationsX *relationsx); index_t IndexRouteRelX(RelationsX *relationsx,relation_t id); index_t IndexTurnRelX(RelationsX *relationsx,relation_t id); void SortRelationList(RelationsX *relationsx); void ProcessRouteRelations(RelationsX *relationsx,WaysX *waysx,int keep); void ProcessTurnRelations(RelationsX *relationsx,NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,int keep); void RemovePrunedTurnRelations(RelationsX *relationsx,NodesX *nodesx); void SortTurnRelationListGeographically(RelationsX *relationsx,NodesX *nodesx,SegmentsX *segmentsx,int convert); void SaveRelationList(RelationsX* relationsx,const char *filename); #endif /* RELATIONSX_H */ routino-3.4.3/src/segmentsx.h 644 233 144 15640 14426167633 11407 0/*************************************** A header file for the extended segments. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2023 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef SEGMENTSX_H #define SEGMENTSX_H /*+ To stop multiple inclusions. +*/ #include #include "types.h" #include "typesx.h" #include "cache.h" #include "files.h" /* Data structures */ /*+ An extended structure used for processing. +*/ struct _SegmentX { index_t node1; /*+ The NodeX index of the starting node. +*/ index_t node2; /*+ The NodeX index of the finishing node. +*/ index_t next2; /*+ The index of the next segment with the same node2. +*/ index_t way; /*+ The WayX index of the way. +*/ distance_t distance; /*+ The distance between the nodes. +*/ }; /*+ A structure containing a set of segments (memory format). +*/ struct _SegmentsX { char *filename_tmp; /*+ The name of the temporary file (for the SegmentsX). +*/ int fd; /*+ The file descriptor of the open file (for the SegmentsX). +*/ index_t number; /*+ The number of extended segments still being considered. +*/ #if !SLIM SegmentX *data; /*+ The extended segment data (when mapped into memory). +*/ #else SegmentX cached[4]; /*+ Four cached extended segments read from the file in slim mode. +*/ index_t incache[4]; /*+ The indexes of the cached extended segments. +*/ SegmentXCache *cache; /*+ A RAM cache of extended segments read from the file. +*/ #endif index_t *firstnode; /*+ The first segment index for each node. +*/ index_t *next1; /*+ The index of the next segment with the same node1 (used while pruning). +*/ BitMask *usedway; /*+ A flag to indicate if a way is used (used for removing pruned ways). +*/ }; /* Functions in segmentsx.c */ SegmentsX *NewSegmentList(void); void FreeSegmentList(SegmentsX *segmentsx); void AppendSegmentList(SegmentsX *segmentsx,index_t way,index_t node1,index_t node2,distance_t distance); void FinishSegmentList(SegmentsX *segmentsx); SegmentX *FirstSegmentX(SegmentsX *segmentsx,index_t nodeindex,int position); SegmentX *NextSegmentX(SegmentsX *segmentsx,SegmentX *segmentx,index_t nodeindex); void SortSegmentList(SegmentsX *segmentsx,NodesX *nodesx,WaysX *waysx); void IndexSegments(SegmentsX *segmentsx,NodesX *nodesx,WaysX *waysx); void ProcessSegments(SegmentsX *segmentsx,NodesX *nodesx,WaysX *waysx); void RemovePrunedSegments(SegmentsX *segmentsx,WaysX *waysx); void DeduplicateSuperSegments(SegmentsX *segmentsx,WaysX *waysx); void SortSegmentListGeographically(SegmentsX *segmentsx,NodesX *nodesx); void SaveSegmentList(SegmentsX *segmentsx,const char *filename); /* Macros / inline functions */ /*+ Return true if this is a pruned segment. +*/ #define IsPrunedSegmentX(xxx) ((xxx)->node1==NO_NODE) #if !SLIM #define LookupSegmentX(segmentsx,index,position) &(segmentsx)->data[index] #define IndexSegmentX(segmentsx,segmentx) (index_t)((segmentx)-&(segmentsx)->data[0]) #define PutBackSegmentX(segmentsx,segmentx) while(0) { /* nop */ } #define ReLookupSegmentX(segmentsx,segmentx) while(0) { /* nop */ } #else /* Prototypes */ static inline SegmentX *LookupSegmentX(SegmentsX *segmentsx,index_t index,int position); static inline index_t IndexSegmentX(SegmentsX *segmentsx,SegmentX *segmentx); static inline void PutBackSegmentX(SegmentsX *segmentsx,SegmentX *segmentx); static inline void ReLookupSegmentX(SegmentsX *segmentsx,SegmentX *segmentx); CACHE_NEWCACHE_PROTO(SegmentX) CACHE_DELETECACHE_PROTO(SegmentX) CACHE_FETCHCACHE_PROTO(SegmentX) CACHE_REPLACECACHE_PROTO(SegmentX) CACHE_INVALIDATECACHE_PROTO(SegmentX) /* Data type */ CACHE_STRUCTURE(SegmentX) /* Inline functions */ CACHE_NEWCACHE(SegmentX) CACHE_DELETECACHE(SegmentX) CACHE_FETCHCACHE(SegmentX) CACHE_REPLACECACHE(SegmentX) CACHE_INVALIDATECACHE(SegmentX) /*++++++++++++++++++++++++++++++++++++++ Lookup a particular extended segment with the specified id from the file on disk. SegmentX *LookupSegmentX Returns a pointer to a cached copy of the extended segment. SegmentsX *segmentsx The set of segments to use. index_t index The segment index to look for. int position The position in the cache to use. ++++++++++++++++++++++++++++++++++++++*/ static inline SegmentX *LookupSegmentX(SegmentsX *segmentsx,index_t index,int position) { segmentsx->cached[position-1]=*FetchCachedSegmentX(segmentsx->cache,index,segmentsx->fd,0); segmentsx->incache[position-1]=index; return(&segmentsx->cached[position-1]); } /*++++++++++++++++++++++++++++++++++++++ Find the extended segment index for a particular extended segment pointer. index_t IndexSegmentX Returns the index of the extended segment. SegmentsX *segmentsx The set of segments to use. SegmentX *segmentx The extended segment whose index is to be found. ++++++++++++++++++++++++++++++++++++++*/ static inline index_t IndexSegmentX(SegmentsX *segmentsx,SegmentX *segmentx) { int position1=segmentx-&segmentsx->cached[0]; return(segmentsx->incache[position1]); } /*++++++++++++++++++++++++++++++++++++++ Put back an extended segment's data into the file on disk. SegmentsX *segmentsx The set of segments to use. SegmentX *segmentx The extended segment to be put back. ++++++++++++++++++++++++++++++++++++++*/ static inline void PutBackSegmentX(SegmentsX *segmentsx,SegmentX *segmentx) { int position1=segmentx-&segmentsx->cached[0]; ReplaceCachedSegmentX(segmentsx->cache,segmentx,segmentsx->incache[position1],segmentsx->fd,0); } /*++++++++++++++++++++++++++++++++++++++ Lookup an extended segment's data from the disk into file again after the disk was updated. SegmentsX *segmentsx The set of segments to use. SegmentX *segmentx The extended segment to refresh. ++++++++++++++++++++++++++++++++++++++*/ static inline void ReLookupSegmentX(SegmentsX *segmentsx,SegmentX *segmentx) { int position1=segmentx-&segmentsx->cached[0]; segmentsx->cached[position1]=*FetchCachedSegmentX(segmentsx->cache,segmentsx->incache[position1],segmentsx->fd,0); } #endif /* SLIM */ #endif /* SEGMENTSX_H */ routino-3.4.3/src/ways.c 644 233 144 7012 13452412002 10277 0/*************************************** Way data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include "ways.h" #include "files.h" /*++++++++++++++++++++++++++++++++++++++ Load in a way list from a file. Ways *LoadWayList Returns the way list. const char *filename The name of the file to load. ++++++++++++++++++++++++++++++++++++++*/ Ways *LoadWayList(const char *filename) { Ways *ways; ways=(Ways*)malloc(sizeof(Ways)); #if !SLIM ways->data=MapFile(filename); /* Copy the WaysFile structure from the loaded data */ ways->file=*((WaysFile*)ways->data); /* Set the pointers in the Ways structure. */ ways->ways =(Way *)(ways->data+sizeof(WaysFile)); ways->names=(char*)(ways->data+sizeof(WaysFile)+ways->file.number*sizeof(Way)); #else ways->fd=SlimMapFile(filename); /* Copy the WaysFile header structure from the loaded data */ SlimFetch(ways->fd,&ways->file,sizeof(WaysFile),0); ways->namesoffset=sizeof(WaysFile)+ways->file.number*sizeof(Way); memset(ways->ncached,0,sizeof(ways->ncached)); ways->cache=NewWayCache(); #ifndef LIBROUTINO log_malloc(ways->cache,sizeof(*ways->cache)); #endif #endif return(ways); } /*++++++++++++++++++++++++++++++++++++++ Destroy the way list. Ways *ways The way list to destroy. ++++++++++++++++++++++++++++++++++++++*/ void DestroyWayList(Ways *ways) { #if !SLIM ways->data=UnmapFile(ways->data); #else size_t i; ways->fd=SlimUnmapFile(ways->fd); #ifndef LIBROUTINO log_free(ways->cache); #endif DeleteWayCache(ways->cache); for(i=0;incached)/sizeof(ways->ncached[0]);i++) if(ways->ncached[i]) free(ways->ncached[i]); #endif free(ways); } /*++++++++++++++++++++++++++++++++++++++ Return 0 if the two ways are the same (in respect of their types and limits), otherwise return positive or negative to allow sorting. int WaysCompare Returns a comparison. Way *way1p The first way. Way *way2p The second way. ++++++++++++++++++++++++++++++++++++++*/ int WaysCompare(Way *way1p,Way *way2p) { if(way1p==way2p) return(0); if(way1p->type!=way2p->type) return((int)way1p->type - (int)way2p->type); if(way1p->allow!=way2p->allow) return((int)way1p->allow - (int)way2p->allow); if(way1p->props!=way2p->props) return((int)way1p->props - (int)way2p->props); if(way1p->speed!=way2p->speed) return((int)way1p->speed - (int)way2p->speed); if(way1p->weight!=way2p->weight) return((int)way1p->weight - (int)way2p->weight); if(way1p->height!=way2p->height) return((int)way1p->height - (int)way2p->height); if(way1p->width!=way2p->width) return((int)way1p->width - (int)way2p->width); if(way1p->length!=way2p->length) return((int)way1p->length - (int)way2p->length); return(0); } routino-3.4.3/src/errorlog.h 644 233 144 14565 12550223461 11216 0/*************************************** Header file for error log file data types and associated function prototypes. Part of the Routino routing software. ******************/ /****************** This file Copyright 2013-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef ERRORLOG_H #define ERRORLOG_H /*+ To stop multiple inclusions. +*/ #include #include #include "types.h" #include "typesx.h" #include "files.h" /*+ A structure containing information for an error message in the file. +*/ typedef struct _ErrorLog { ll_off_t latoffset; /*+ The error message latitude offset within its bin. +*/ ll_off_t lonoffset; /*+ The error message longitude offset within its bin. +*/ uint32_t offset; /*+ The offset of the error message from the beginning of the text section. +*/ uint32_t length; /*+ The length of the error message in the text section. +*/ } ErrorLog; /*+ A structure containing the header from the error log file. +*/ typedef struct _ErrorLogsFile { index_t number; /*+ The total number of error messages. +*/ index_t number_geo; /*+ The number of error messages with a geographical location. +*/ index_t number_nongeo; /*+ The number of error messages without a geographical location. +*/ ll_bin_t latbins; /*+ The number of bins containing latitude. +*/ ll_bin_t lonbins; /*+ The number of bins containing longitude. +*/ ll_bin_t latzero; /*+ The bin number of the furthest south bin. +*/ ll_bin_t lonzero; /*+ The bin number of the furthest west bin. +*/ } ErrorLogsFile; /*+ A structure containing a set of error log messages read from the file. +*/ typedef struct _ErrorLogs { ErrorLogsFile file; /*+ The header data from the file. +*/ #if !SLIM char *data; /*+ The memory mapped data in the file. +*/ index_t *offsets; /*+ A pointer to the array of offsets in the file. +*/ ErrorLog *errorlogs_geo; /*+ A pointer to the array of geographical error logs in the file. +*/ ErrorLog *errorlogs_nongeo; /*+ A pointer to the array of non-geographical error logs in the file. +*/ char *strings; /*+ A pointer to the array of error strings in the file. +*/ #else int fd; /*+ The file descriptor for the file. +*/ offset_t offsetsoffset; /*+ An allocated array with a copy of the file offsets. +*/ offset_t errorlogsoffset_geo; /*+ The offset of the geographical error logs within the file. +*/ offset_t errorlogsoffset_nongeo; /*+ The offset of the non-geographical error logs within the file. +*/ offset_t stringsoffset; /*+ The offset of the error strings within the file. +*/ ErrorLog cached[2]; /*+ Some cached error logs read from the file in slim mode. +*/ char cachestring[1024]; /*+ A cached copy of the error string read from the file in slim mode. +*/ #endif } ErrorLogs; /* Error log functions in errorlog.c */ ErrorLogs *LoadErrorLogs(const char *filename); void DestroyErrorLogs(ErrorLogs *errorlogs); void GetErrorLogLatLong(ErrorLogs *errorlogs,index_t index,ErrorLog *errorlogp,double *latitude,double *longitude); /* Macros and inline functions */ #if !SLIM /*+ Return an ErrorLog pointer given a set of errorlogs and an index. +*/ #define LookupErrorLog(xxx,yyy,ppp) (&(xxx)->errorlogs_geo[yyy]) /*+ Return the offset of a geographical region given a set of errorlogs. +*/ #define LookupErrorLogOffset(xxx,yyy) ((xxx)->offsets[yyy]) /*+ Return the string for an error log. +*/ #define LookupErrorLogString(xxx,yyy) (&(xxx)->strings[(xxx)->errorlogs_geo[yyy].offset]) #else /* Prototypes */ static inline ErrorLog *LookupErrorLog(ErrorLogs *errorlogs,index_t index,int position); static inline index_t LookupErrorLogOffset(ErrorLogs *errorlogs,index_t index); static inline char *LookupErrorLogString(ErrorLogs *errorlogs,index_t index); /* Inline functions */ /*++++++++++++++++++++++++++++++++++++++ Find the ErrorLog information for a particular error log. ErrorLog *LookupErrorLog Returns a pointer to the cached error log information. ErrorLogs *errorlogs The set of errorlogs to use. index_t index The index of the error log. int position The position in the cache to store the value. ++++++++++++++++++++++++++++++++++++++*/ static inline ErrorLog *LookupErrorLog(ErrorLogs *errorlogs,index_t index,int position) { SlimFetch(errorlogs->fd,&errorlogs->cached[position-1],sizeof(ErrorLog),errorlogs->errorlogsoffset_geo+(offset_t)index*sizeof(ErrorLog)); return(&errorlogs->cached[position-1]); } /*++++++++++++++++++++++++++++++++++++++ Find the offset of error logs in a geographical region. index_t LookupErrorLogOffset Returns the index offset. ErrorLogs *errorlogs The set of error logs to use. index_t index The index of the offset. ++++++++++++++++++++++++++++++++++++++*/ static inline index_t LookupErrorLogOffset(ErrorLogs *errorlogs,index_t index) { index_t offset; SlimFetch(errorlogs->fd,&offset,sizeof(index_t),errorlogs->offsetsoffset+(offset_t)index*sizeof(index_t)); return(offset); } /*++++++++++++++++++++++++++++++++++++++ Find the string associated with a particular error log. char *LookupErrorLogString Returns the error string. ErrorLogs *errorlogs The set of error logs to use. index_t index The index of the string. ++++++++++++++++++++++++++++++++++++++*/ static inline char *LookupErrorLogString(ErrorLogs *errorlogs,index_t index) { ErrorLog *errorlog=LookupErrorLog(errorlogs,index,2); SlimFetch(errorlogs->fd,errorlogs->cachestring,errorlog->length,errorlogs->stringsoffset+errorlog->offset); return(errorlogs->cachestring); } #endif #endif /* ERRORLOG_H */ routino-3.4.3/src/files.c 644 233 144 60217 14775261255 10471 0/*************************************** Functions to handle files. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2024, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #if defined(_MSC_VER) #include #include #define read(fd,address,length) _read(fd,address,(unsigned int)(length)) #define write(fd,address,length) _write(fd,address,(unsigned int)(length)) #define open _open #define close _close #define unlink _unlink #define ssize_t SSIZE_T #else #include #endif #include #include #include #include #include #include #if defined(_MSC_VER) || defined(__MINGW32__) #undef lseek #undef stat #undef fstat #define lseek _lseeki64 #define stat _stati64 #define fstat _fstati64 #endif #if defined(_MSC_VER) || defined(__MINGW32__) #include "mman-win32.h" #else #include #endif #include #include "files.h" /*+ A structure to contain the list of memory mapped files. +*/ struct mmapinfo { char *filename; /*+ The name of the file (the index of the list). +*/ int fd; /*+ The file descriptor used when it was opened. +*/ char *address; /*+ The address the file was mapped to. +*/ size_t length; /*+ The length of the file. +*/ }; /*+ The list of memory mapped files. +*/ static struct mmapinfo *mappedfiles; /*+ The number of mapped files. +*/ static int nmappedfiles=0; #define BUFFLEN 4096 /*+ A structure to contain the list of file buffers. +*/ struct filebuffer { char buffer[BUFFLEN]; /*+ The data buffer. +*/ size_t pointer; /*+ The read/write pointer for the file buffer. +*/ size_t length; /*+ The read pointer for the file buffer. +*/ int reading; /*+ A flag to indicate if the file is for reading. +*/ char *filename; /*+ The name of the file. +*/ #if defined(_MSC_VER) || defined(__MINGW32__) int delete; /*+ Set to non-zero value if the file is to be deleted when closed. +*/ #endif }; /*+ The list of file buffers. +*/ static struct filebuffer **filebuffers=NULL; /*+ The number of allocated file buffer pointers. +*/ static int nfilebuffers=0; /* Local functions */ static void CreateFileBuffer(int fd,int read_write,const char *filename); /*++++++++++++++++++++++++++++++++++++++ Return a filename composed of the dirname, prefix and name. char *FileName Returns a pointer to memory allocated to the filename. const char *dirname The directory name. const char *prefix The file prefix. const char *name The main part of the name. ++++++++++++++++++++++++++++++++++++++*/ char *FileName(const char *dirname,const char *prefix, const char *name) { char *filename=(char*)malloc((dirname?strlen(dirname):0)+1+(prefix?strlen(prefix):0)+1+strlen(name)+1); sprintf(filename,"%s%s%s%s%s",dirname?dirname:"",dirname?"/":"",prefix?prefix:"",prefix?"-":"",name); return(filename); } /*++++++++++++++++++++++++++++++++++++++ Open a file read-only and map it into memory. void *MapFile Returns the address of the file or exits in case of an error. const char *filename The name of the file to open. ++++++++++++++++++++++++++++++++++++++*/ void *MapFile(const char *filename) { int fd; struct stat buf; offset_t size; void *address; /* Open the file */ #if defined(_MSC_VER) || defined(__MINGW32__) fd=open(filename,O_RDONLY|O_BINARY|O_RANDOM); #else fd=open(filename,O_RDONLY); #endif if(fd<0) { #ifdef LIBROUTINO return(NULL); #else logassert_format(0,("Cannot open file '%s' for reading [%s].",filename,strerror(errno))); #endif } /* Get its size */ if(stat(filename,&buf)) { #ifdef LIBROUTINO return(NULL); #else logassert_format(0,("Cannot stat file '%s' [%s].",filename,strerror(errno))); #endif } size=buf.st_size; /* Map the file */ address=mmap(NULL,size,PROT_READ,MAP_SHARED,fd,0); if(address==MAP_FAILED) { close(fd); #ifdef LIBROUTINO return(NULL); #else logassert_format(0,("Cannot mmap file '%s' for reading [%s].",filename,strerror(errno))); #endif } #ifndef LIBROUTINO log_mmap(size); #endif /* Store the information about the mapped file */ mappedfiles=(struct mmapinfo*)realloc((void*)mappedfiles,(nmappedfiles+1)*sizeof(struct mmapinfo)); mappedfiles[nmappedfiles].filename=strcpy(malloc(strlen(filename)+1),filename); mappedfiles[nmappedfiles].fd=fd; mappedfiles[nmappedfiles].address=address; mappedfiles[nmappedfiles].length=size; nmappedfiles++; return(address); } /*++++++++++++++++++++++++++++++++++++++ Open a file read-write and map it into memory. void *MapFileWriteable Returns the address of the file or exits in case of an error. const char *filename The name of the file to open. ++++++++++++++++++++++++++++++++++++++*/ void *MapFileWriteable(const char *filename) { int fd; struct stat buf; offset_t size; void *address; /* Open the file */ #if defined(_MSC_VER) || defined(__MINGW32__) fd=open(filename,O_RDWR|O_BINARY|O_RANDOM); #else fd=open(filename,O_RDWR); #endif if(fd<0) { #ifdef LIBROUTINO return(NULL); #else logassert_format(0,("Cannot open file '%s' for reading and writing [%s].",filename,strerror(errno))); #endif } /* Get its size */ if(stat(filename,&buf)) { #ifdef LIBROUTINO return(NULL); #else logassert_format(0,("Cannot stat file '%s' [%s].",filename,strerror(errno))); #endif } size=buf.st_size; /* Map the file */ address=mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(address==MAP_FAILED) { close(fd); #ifdef LIBROUTINO return(NULL); #else logassert_format(0,("Cannot mmap file '%s' for reading and writing [%s].",filename,strerror(errno))); #endif } #ifndef LIBROUTINO log_mmap(size); #endif /* Store the information about the mapped file */ mappedfiles=(struct mmapinfo*)realloc((void*)mappedfiles,(nmappedfiles+1)*sizeof(struct mmapinfo)); mappedfiles[nmappedfiles].filename=strcpy(malloc(strlen(filename)+1),filename); mappedfiles[nmappedfiles].fd=fd; mappedfiles[nmappedfiles].address=address; mappedfiles[nmappedfiles].length=size; nmappedfiles++; return(address); } /*++++++++++++++++++++++++++++++++++++++ Unmap a file and close it. void *UnmapFile Returns NULL (for similarity to the MapFile function). const void *address The address of the mapped file in memory. ++++++++++++++++++++++++++++++++++++++*/ void *UnmapFile(const void *address) { int i; for(i=0;ii) memmove(&mappedfiles[i],&mappedfiles[i+1],(nmappedfiles-i)*sizeof(struct mmapinfo)); return(NULL); } /*++++++++++++++++++++++++++++++++++++++ Open an existing file on disk for reading. int SlimMapFile Returns the file descriptor if OK or exits in case of an error. const char *filename The name of the file to open. ++++++++++++++++++++++++++++++++++++++*/ int SlimMapFile(const char *filename) { int fd; /* Open the file */ #if defined(_MSC_VER) || defined(__MINGW32__) fd=open(filename,O_RDONLY|O_BINARY|O_RANDOM); #else fd=open(filename,O_RDONLY); #endif if(fd<0) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot open file '%s' for reading [%s].",filename,strerror(errno))); #endif } return(fd); } /*++++++++++++++++++++++++++++++++++++++ Open an existing file on disk for reading or writing. int SlimMapFileWriteable Returns the file descriptor if OK or exits in case of an error. const char *filename The name of the file to open. ++++++++++++++++++++++++++++++++++++++*/ int SlimMapFileWriteable(const char *filename) { int fd; /* Open the file */ #if defined(_MSC_VER) || defined(__MINGW32__) fd=open(filename,O_RDWR|O_BINARY|O_RANDOM); #else fd=open(filename,O_RDWR); #endif if(fd<0) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot open file '%s' for reading and writing [%s].",filename,strerror(errno))); #endif } return(fd); } /*++++++++++++++++++++++++++++++++++++++ Close a file on disk. int SlimUnmapFile returns -1 (for similarity to the UnmapFile function). int fd The file descriptor to close. ++++++++++++++++++++++++++++++++++++++*/ int SlimUnmapFile(int fd) { close(fd); return(-1); } /*++++++++++++++++++++++++++++++++++++++ Open a new file on disk for writing (with buffering). int OpenFileBufferedNew Returns the file descriptor if OK or exits in case of an error. const char *filename The name of the file to create. ++++++++++++++++++++++++++++++++++++++*/ int OpenFileBufferedNew(const char *filename) { int fd; /* Open the file */ #if defined(_MSC_VER) || defined(__MINGW32__) fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY|O_RANDOM,S_IREAD|S_IWRITE); #else fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC ,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); #endif if(fd<0) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot open file '%s' for writing [%s].",filename,strerror(errno))); #endif } CreateFileBuffer(fd,-1,filename); return(fd); } /*++++++++++++++++++++++++++++++++++++++ Open a new or existing file on disk for appending (with buffering). int OpenFileBufferedAppend Returns the file descriptor if OK or exits in case of an error. const char *filename The name of the file to create or open. ++++++++++++++++++++++++++++++++++++++*/ int OpenFileBufferedAppend(const char *filename) { int fd; /* Open the file */ #if defined(_MSC_VER) || defined(__MINGW32__) fd=open(filename,O_WRONLY|O_CREAT|O_APPEND|O_BINARY|O_RANDOM,S_IREAD|S_IWRITE); #else fd=open(filename,O_WRONLY|O_CREAT|O_APPEND ,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); #endif if(fd<0) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot open file '%s' for appending [%s].",filename,strerror(errno))); #endif } CreateFileBuffer(fd,-1,filename); return(fd); } /*++++++++++++++++++++++++++++++++++++++ Open an existing file on disk for reading (with buffering). int ReOpenFileBuffered Returns the file descriptor if OK or exits in case of an error. const char *filename The name of the file to open. ++++++++++++++++++++++++++++++++++++++*/ int ReOpenFileBuffered(const char *filename) { int fd; /* Open the file */ #if defined(_MSC_VER) || defined(__MINGW32__) fd=open(filename,O_RDONLY|O_BINARY|O_RANDOM); #else fd=open(filename,O_RDONLY); #endif if(fd<0) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot open file '%s' for reading [%s].",filename,strerror(errno))); #endif } CreateFileBuffer(fd,1,filename); return(fd); } /*++++++++++++++++++++++++++++++++++++++ Open an existing file on disk for reading (with buffering), delete it and open a new file on disk for writing (with buffering). int ReplaceFileBuffered Returns the file descriptor of the new writable file. const char *filename The name of the file to open, delete and replace. int *oldfd Returns the file descriptor of the old, readable file. ++++++++++++++++++++++++++++++++++++++*/ int ReplaceFileBuffered(const char *filename,int *oldfd) { int newfd; #if defined(_MSC_VER) || defined(__MINGW32__) char *filename2; filename2=strcpy(malloc(strlen(filename)+2),filename); strcat(filename2,"2"); RenameFile(filename,filename2); *oldfd=ReOpenFileBuffered(filename2); DeleteFileBuffered(filename2); #else *oldfd=ReOpenFileBuffered(filename); DeleteFileBuffered(filename); #endif newfd=OpenFileBufferedNew(filename); return(newfd); } /*++++++++++++++++++++++++++++++++++++++ Write data to a file descriptor (via a buffer). int WriteFileBuffered Returns 0 if OK or something else in case of an error. int fd The file descriptor to write to. const void *address The address of the data to be written. size_t length The length of data to write. ++++++++++++++++++++++++++++++++++++++*/ int WriteFileBuffered(int fd,const void *address,size_t length) { #ifndef LIBROUTINO logassert(fd!=-1,"File descriptor is in error - report a bug"); logassert(fdreading,"File descriptor was not opened for writing - report a bug"); #endif /* Write the data */ if((filebuffers[fd]->pointer+length)>BUFFLEN) { if(write(fd,filebuffers[fd]->buffer,filebuffers[fd]->pointer)!=(ssize_t)filebuffers[fd]->pointer) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot write to file '%s' [%s].",filebuffers[fd]->filename,strerror(errno))); #endif } filebuffers[fd]->pointer=0; } if(length>=BUFFLEN) { if(write(fd,address,length)!=(ssize_t)length) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot write to file '%s' [%s].",filebuffers[fd]->filename,strerror(errno))); #endif } return(0); } memcpy(filebuffers[fd]->buffer+filebuffers[fd]->pointer,address,length); filebuffers[fd]->pointer+=length; return(0); } /*++++++++++++++++++++++++++++++++++++++ Read data from a file descriptor (via a buffer). int ReadFileBuffered Returns 0 if OK or something else in case of an error. int fd The file descriptor to read from. void *address The address the data is to be read into. size_t length The length of data to read. ++++++++++++++++++++++++++++++++++++++*/ int ReadFileBuffered(int fd,void *address,size_t length) { #ifndef LIBROUTINO logassert(fd!=-1,"File descriptor is in error - report a bug"); logassert(fdreading,"File descriptor was not opened for reading - report a bug"); #endif /* Read the data */ if((filebuffers[fd]->pointer+length)>filebuffers[fd]->length) if(filebuffers[fd]->pointerlength) { memcpy(address,filebuffers[fd]->buffer+filebuffers[fd]->pointer,filebuffers[fd]->length-filebuffers[fd]->pointer); address=(char*)address+filebuffers[fd]->length-filebuffers[fd]->pointer; length-=filebuffers[fd]->length-filebuffers[fd]->pointer; filebuffers[fd]->pointer=0; filebuffers[fd]->length=0; } if(length>=BUFFLEN) { if(read(fd,address,length)!=(ssize_t)length) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot read from file '%s' [%s].",filebuffers[fd]->filename,strerror(errno))); #endif } return(0); } if(filebuffers[fd]->pointer==filebuffers[fd]->length) { ssize_t len=read(fd,filebuffers[fd]->buffer,BUFFLEN); if(len<0) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot read from file '%s' [%s].",filebuffers[fd]->filename,strerror(errno))); #endif } else if(len==0) return(-1); filebuffers[fd]->length=len; filebuffers[fd]->pointer=0; } if(filebuffers[fd]->length==0) return(-1); memcpy(address,filebuffers[fd]->buffer+filebuffers[fd]->pointer,length); filebuffers[fd]->pointer+=length; return(0); } /*++++++++++++++++++++++++++++++++++++++ Seek to a position in a file descriptor that uses a buffer. int SeekFileBuffered Returns 0 if OK or something else in case of an error. int fd The file descriptor to seek within. offset_t position The position to seek to. ++++++++++++++++++++++++++++++++++++++*/ int SeekFileBuffered(int fd,offset_t position) { #ifndef LIBROUTINO logassert(fd!=-1,"File descriptor is in error - report a bug"); logassert(fdreading) if(write(fd,filebuffers[fd]->buffer,filebuffers[fd]->pointer)!=(ssize_t)filebuffers[fd]->pointer) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot write to file '%s' [%s].",filebuffers[fd]->filename,strerror(errno))); #endif } filebuffers[fd]->pointer=0; filebuffers[fd]->length=0; if(lseek(fd,position,SEEK_SET)!=position) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot seek in file '%s' [%s].",filebuffers[fd]->filename,strerror(errno))); #endif } return(0); } /*++++++++++++++++++++++++++++++++++++++ Skip forward by an offset in a file descriptor that uses a buffer. int SkipFileBuffered Returns 0 if OK or something else in case of an error. int fd The file descriptor to skip within. offset_t skip The amount to skip forward. ++++++++++++++++++++++++++++++++++++++*/ int SkipFileBuffered(int fd,offset_t skip) { #ifndef LIBROUTINO logassert(fd!=-1,"File descriptor is in error - report a bug"); logassert(fdreading,"File descriptor was not opened for reading - report a bug"); #endif /* Skip the data - needs to be optimised */ if((filebuffers[fd]->pointer+skip)>filebuffers[fd]->length) { skip-=(offset_t)(filebuffers[fd]->length-filebuffers[fd]->pointer); filebuffers[fd]->pointer=0; filebuffers[fd]->length=0; if(lseek(fd,skip,SEEK_CUR)==-1) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot seek in file '%s' [%s].",filebuffers[fd]->filename,strerror(errno))); #endif } } else filebuffers[fd]->pointer+=skip; return(0); } /*++++++++++++++++++++++++++++++++++++++ Close a file on disk (and flush the buffer). int CloseFileBuffered returns -1 (for similarity to the *OpenFileBuffered* functions). int fd The file descriptor to close. ++++++++++++++++++++++++++++++++++++++*/ int CloseFileBuffered(int fd) { #ifndef LIBROUTINO logassert(fdreading) if(write(fd,filebuffers[fd]->buffer,filebuffers[fd]->pointer)!=(ssize_t)filebuffers[fd]->pointer) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot write to file '%s' [%s].",filebuffers[fd]->filename,strerror(errno))); #endif } close(fd); /* Delete the file if Windows */ #if defined(_MSC_VER) || defined(__MINGW32__) if(filebuffers[fd]->delete) unlink(filebuffers[fd]->filename); #endif /* Free the file buffer */ free(filebuffers[fd]->filename); free(filebuffers[fd]); filebuffers[fd]=NULL; return(-1); } /*++++++++++++++++++++++++++++++++++++++ Create a file buffer. int fd The file descriptor. int read_write A flag set to 1 for reading, -1 for writing and 0 for unbuffered. const char *filename The name of the file. ++++++++++++++++++++++++++++++++++++++*/ static void CreateFileBuffer(int fd,int read_write,const char *filename) { if(nfilebuffers<=fd) { int i; filebuffers=(struct filebuffer**)realloc((void*)filebuffers,(fd+1)*sizeof(struct filebuffer*)); for(i=nfilebuffers;i<=fd;i++) filebuffers[i]=NULL; nfilebuffers=fd+1; } filebuffers[fd]=(struct filebuffer*)calloc(1,sizeof(struct filebuffer)); filebuffers[fd]->reading=(read_write==1); filebuffers[fd]->filename=strcpy(malloc(strlen(filename)+1),filename); #if defined(_MSC_VER) || defined(__MINGW32__) filebuffers[fd]->delete=0; #endif } /*++++++++++++++++++++++++++++++++++++++ Delete a file from disk. int DeleteFileBuffered Returns 0 if OK. const char *filename The name of the file to delete. ++++++++++++++++++++++++++++++++++++++*/ int DeleteFileBuffered(const char *filename) { int fd; for(fd=0;fdfilename,filename)) break; #ifndef LIBROUTINO logassert_format(fdfilename)); #endif #if defined(_MSC_VER) || defined(__MINGW32__) filebuffers[fd]->delete=1; #else unlink(filename); #endif return(0); } /*++++++++++++++++++++++++++++++++++++++ Get the size of a file. offset_t SizeFile Returns the file size if OK or exits in case of an error. const char *filename The name of the file to check. ++++++++++++++++++++++++++++++++++++++*/ offset_t SizeFile(const char *filename) { struct stat buf; if(stat(filename,&buf)) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot stat file '%s' [%s].",filename,strerror(errno))); #endif } return(buf.st_size); } /*++++++++++++++++++++++++++++++++++++++ Get the size of a file from a file descriptor. offset_t SizeFileFD Returns the file size if OK or exits in case of an error. int fd The file descriptor to check. ++++++++++++++++++++++++++++++++++++++*/ offset_t SizeFileFD(int fd) { struct stat buf; if(fstat(fd,&buf)) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot stat file descriptor '%d' [%s].",fd,strerror(errno))); #endif } return(buf.st_size); } /*++++++++++++++++++++++++++++++++++++++ Check if a file exists. int ExistsFile Returns 1 if the file exists and 0 if not. const char *filename The name of the file to check. ++++++++++++++++++++++++++++++++++++++*/ int ExistsFile(const char *filename) { struct stat buf; if(stat(filename,&buf)) return(0); else return(1); } /*++++++++++++++++++++++++++++++++++++++ Open an existing file on disk for reading (in a simple mode). int OpenFile Returns the file descriptor if OK or exits in case of an error. const char *filename The name of the file to open. ++++++++++++++++++++++++++++++++++++++*/ int OpenFile(const char *filename) { int fd; /* Open the file */ #if defined(_MSC_VER) || defined(__MINGW32__) fd=open(filename,O_RDONLY|O_BINARY|O_RANDOM); #else fd=open(filename,O_RDONLY); #endif if(fd<0) { #ifdef LIBROUTINO return(-1); #else logassert_format(0,("Cannot open file '%s' for reading [%s].",filename,strerror(errno))); #endif } return(fd); } /*++++++++++++++++++++++++++++++++++++++ Close a file on disk (that was opened in simple mode). int fd The file descriptor to close. ++++++++++++++++++++++++++++++++++++++*/ void CloseFile(int fd) { #ifndef LIBROUTINO logassert_format(fd>=nfilebuffers || !filebuffers[fd],("File '%s' is buffered - report a bug.",filebuffers[fd]->filename)); #endif close(fd); } /*++++++++++++++++++++++++++++++++++++++ Delete a file from disk (that was opened in simple mode). int DeleteFile Returns 0 if OK. const char *filename The name of the file to delete. ++++++++++++++++++++++++++++++++++++++*/ int DeleteFile(const char *filename) { int fd; for(fd=0;fdfilename,filename)) break; #ifndef LIBROUTINO logassert_format(fd==nfilebuffers || !filebuffers[fd],("File '%s' is buffered - report a bug.",filebuffers[fd]->filename)); #endif unlink(filename); return(0); } /*++++++++++++++++++++++++++++++++++++++ Rename a file on disk. int RenameFile Returns 0 if OK. const char *oldfilename The old name of the file before renaming. const char *newfilename The new name of the file after renaming. ++++++++++++++++++++++++++++++++++++++*/ int RenameFile(const char *oldfilename,const char *newfilename) { rename(oldfilename,newfilename); return(0); } routino-3.4.3/src/mman-win32.c 644 233 144 12565 12531126220 11236 0/*************************************** Windows 32 memory management functions from https://code.google.com/p/mman-win32 File header comment created by Andrew M. Bishop, all source code unchanged from original. ******************/ /****************** Copyright (c) 2010,2012 Viktor Kutuzov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ***************************************/ #include #include #include #include "mman-win32.h" #ifndef FILE_MAP_EXECUTE #define FILE_MAP_EXECUTE 0x0020 #endif /* FILE_MAP_EXECUTE */ static int __map_mman_error(const DWORD err, const int deferr) { if (err == 0) return 0; //TODO: implement return err; } static DWORD __map_mmap_prot_page(const int prot) { DWORD protect = 0; if (prot == PROT_NONE) return protect; if ((prot & PROT_EXEC) != 0) { protect = ((prot & PROT_WRITE) != 0) ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ; } else { protect = ((prot & PROT_WRITE) != 0) ? PAGE_READWRITE : PAGE_READONLY; } return protect; } static DWORD __map_mmap_prot_file(const int prot) { DWORD desiredAccess = 0; if (prot == PROT_NONE) return desiredAccess; if ((prot & PROT_READ) != 0) desiredAccess |= FILE_MAP_READ; if ((prot & PROT_WRITE) != 0) desiredAccess |= FILE_MAP_WRITE; if ((prot & PROT_EXEC) != 0) desiredAccess |= FILE_MAP_EXECUTE; return desiredAccess; } void* mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off) { HANDLE fm, h; void * map = MAP_FAILED; #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4293) #endif const DWORD dwFileOffsetLow = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)off : (DWORD)(off & 0xFFFFFFFFL); const DWORD dwFileOffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL); const DWORD protect = __map_mmap_prot_page(prot); const DWORD desiredAccess = __map_mmap_prot_file(prot); const off_t maxSize = off + (off_t)len; const DWORD dwMaxSizeLow = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL); const DWORD dwMaxSizeHigh = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL); #ifdef _MSC_VER #pragma warning(pop) #endif errno = 0; if (len == 0 /* Unsupported flag combinations */ || (flags & MAP_FIXED) != 0 /* Usupported protection combinations */ || prot == PROT_EXEC) { errno = EINVAL; return MAP_FAILED; } h = ((flags & MAP_ANONYMOUS) == 0) ? (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE; if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE) { errno = EBADF; return MAP_FAILED; } fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL); if (fm == NULL) { errno = __map_mman_error(GetLastError(), EPERM); return MAP_FAILED; } map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len); CloseHandle(fm); if (map == NULL) { errno = __map_mman_error(GetLastError(), EPERM); return MAP_FAILED; } return map; } int munmap(void *addr, size_t len) { if (UnmapViewOfFile(addr)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } int mprotect(void *addr, size_t len, int prot) { DWORD newProtect = __map_mmap_prot_page(prot); DWORD oldProtect = 0; if (VirtualProtect(addr, len, newProtect, &oldProtect)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } int msync(void *addr, size_t len, int flags) { if (FlushViewOfFile(addr, len)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } int mlock(const void *addr, size_t len) { if (VirtualLock((LPVOID)addr, len)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } int munlock(const void *addr, size_t len) { if (VirtualUnlock((LPVOID)addr, len)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } routino-3.4.3/src/waysx.c 644 233 144 53630 14774476214 10545 0/*************************************** Extended Way data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2018, 2019, 2020, 2022, 2024, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include "types.h" #include "ways.h" #include "typesx.h" #include "nodesx.h" #include "segmentsx.h" #include "waysx.h" #include "files.h" #include "logging.h" #include "sorting.h" /* Global variables */ /*+ The command line '--tmpdir' option or its default value. +*/ extern char *option_tmpdirname; /* Local variables */ /*+ Temporary file-local variables for use by the sort functions (re-initialised for each sort). +*/ static WaysX *sortwaysx; static SegmentsX *sortsegmentsx; /* Local functions */ static int sort_by_id(WayX *a,WayX *b); static int deduplicate_and_index_by_id(WayX *wayx,index_t index); static int sort_by_name(char *a,char *b); static int delete_unused(WayX *wayx,index_t index); static int sort_by_name_and_prop_and_id(WayX *a,WayX *b); static int deduplicate_and_index_by_compact_id(WayX *wayx,index_t index); /*++++++++++++++++++++++++++++++++++++++ Allocate a new way list (create a new file or open an existing one). WaysX *NewWayList Returns the way list. int append Set to 1 if the file is to be opened for appending. int readonly Set to 1 if the file is to be opened for reading. ++++++++++++++++++++++++++++++++++++++*/ WaysX *NewWayList(int append,int readonly) { WaysX *waysx; logassert(sizeof(way_t)>=sizeof(index_t),"Size of way_t type must be at least as large as size of index_t type."); waysx=(WaysX*)calloc_logassert(1,sizeof(WaysX)); waysx->filename =(char*)malloc_logassert(strlen(option_tmpdirname)+32); waysx->filename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+32); /* allow %p to be up to 20 bytes */ sprintf(waysx->filename ,"%s/waysx.parsed.mem",option_tmpdirname); sprintf(waysx->filename_tmp,"%s/waysx.%p.tmp" ,option_tmpdirname,(void*)waysx); if(append || readonly) if(ExistsFile(waysx->filename)) { FILESORT_VARINT waysize; int fd; fd=ReOpenFileBuffered(waysx->filename); while(!ReadFileBuffered(fd,&waysize,FILESORT_VARSIZE)) { SkipFileBuffered(fd,waysize); waysx->number++; } CloseFileBuffered(fd); RenameFile(waysx->filename,waysx->filename_tmp); } if(append) waysx->fd=OpenFileBufferedAppend(waysx->filename_tmp); else if(!readonly) waysx->fd=OpenFileBufferedNew(waysx->filename_tmp); else waysx->fd=-1; #if SLIM waysx->cache=NewWayXCache(); log_malloc(waysx->cache,sizeof(*waysx->cache)); #endif waysx->ifilename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+40); /* allow %p to be up to 20 bytes */ waysx->ofilename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+40); /* allow %p to be up to 20 bytes */ sprintf(waysx->ifilename_tmp,"%s/waysx.%p.idx.tmp",option_tmpdirname,(void*)waysx); sprintf(waysx->ofilename_tmp,"%s/waysx.%p.off.tmp",option_tmpdirname,(void*)waysx); waysx->nfilename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+40); /* allow %p to be up to 20 bytes */ sprintf(waysx->nfilename_tmp,"%s/waynames.%p.tmp",option_tmpdirname,(void*)waysx); return(waysx); } /*++++++++++++++++++++++++++++++++++++++ Free a way list. WaysX *waysx The set of ways to be freed. int keep If set then the results file is to be kept. ++++++++++++++++++++++++++++++++++++++*/ void FreeWayList(WaysX *waysx,int keep) { if(keep) RenameFile(waysx->filename_tmp,waysx->filename); else DeleteFile(waysx->filename_tmp); free(waysx->filename); free(waysx->filename_tmp); DeleteFile(waysx->ifilename_tmp); DeleteFile(waysx->ofilename_tmp); free(waysx->ifilename_tmp); if(waysx->cdata) { log_free(waysx->cdata); free(waysx->cdata); } DeleteFile(waysx->nfilename_tmp); free(waysx->nfilename_tmp); #if SLIM log_free(waysx->cache); DeleteWayXCache(waysx->cache); #endif free(waysx); } /*++++++++++++++++++++++++++++++++++++++ Append a single way to an unsorted way list. WaysX *waysx The set of ways to process. way_t id The ID of the way. Way *way The way data itself. node_t *nodes The list of nodes for this way. int nnodes The number of nodes for this way. const char *name The name or reference of the way. ++++++++++++++++++++++++++++++++++++++*/ void AppendWayList(WaysX *waysx,way_t id,Way *way,node_t *nodes,int nnodes,const char *name) { WayX wayx={0}; uint64_t longsize; FILESORT_VARINT size; node_t nonode=NO_NODE_ID; wayx.id=id; wayx.way=*way; longsize=sizeof(WayX)+(nnodes+1)*sizeof(node_t)+strlen(name)+1; if(longsize>=FILESORT_MAXINT) /* Ensure no overflow of FILESORT_VARINT integer */ { logerror("Way %"Pway_t" contains too much data; ignoring some nodes (or change FILESORT_VARINT to 32-bits?)\n",logerror_way(id)); nnodes=(FILESORT_MAXINT-(sizeof(WayX)+strlen(name)+1))/sizeof(node_t)-1; longsize=sizeof(WayX)+(nnodes+1)*sizeof(node_t)+strlen(name)+1; logassert(longsizefd,&size,FILESORT_VARSIZE); WriteFileBuffered(waysx->fd,&wayx,sizeof(WayX)); WriteFileBuffered(waysx->fd,nodes ,nnodes*sizeof(node_t)); WriteFileBuffered(waysx->fd,&nonode, sizeof(node_t)); WriteFileBuffered(waysx->fd,name,strlen(name)+1); waysx->number++; logassert(waysx->number!=0,"Too many ways (change index_t to 64-bits?)"); /* Zero marks the high-water mark for ways. */ } /*++++++++++++++++++++++++++++++++++++++ Finish appending ways and change the filename over. WaysX *waysx The ways that have been appended. ++++++++++++++++++++++++++++++++++++++*/ void FinishWayList(WaysX *waysx) { if(waysx->fd!=-1) waysx->fd=CloseFileBuffered(waysx->fd); } /*++++++++++++++++++++++++++++++++++++++ Find a particular way index. index_t IndexWayX Returns the index of the extended way with the specified id. WaysX *waysx The set of ways to process. way_t id The way id to look for. ++++++++++++++++++++++++++++++++++++++*/ index_t IndexWayX(WaysX *waysx,way_t id) { index_t start=0; index_t end=waysx->number-1; index_t mid; if(waysx->number==0) /* There are no ways */ return(NO_WAY); /* Binary search - search key exact match only is required. * * # <- start | Check mid and exit if it matches else move start or end. * # | * # | Since an exact match is wanted we can set end=mid-1 * # <- mid | or start=mid+1 if we find that mid doesn't match. * # | * # | Eventually either end=start or end=start+1 and one of * # <- end | start or end is the wanted one or neither is. */ while((end-start)>1) { mid=start+(end-start)/2; /* Choose mid point (avoid overflow) */ if(waysx->idata[mid]idata[mid]>id) /* Mid point is too high */ end=mid-1; else /* Mid point is correct */ return(mid); } if(waysx->idata[start]==id) /* Start is correct */ return(start); if(waysx->idata[end]==id) /* End is correct */ return(end); return(NO_WAY); } /*++++++++++++++++++++++++++++++++++++++ Sort the list of ways. WaysX *waysx The set of ways to process. ++++++++++++++++++++++++++++++++++++++*/ void SortWayList(WaysX *waysx) { index_t xnumber; int fd; /* Print the start message */ printf_first("Sorting Ways"); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(waysx->filename_tmp,&waysx->fd); /* Open a file for the index */ waysx->ifd=OpenFileBufferedNew(waysx->ifilename_tmp); /* Sort the ways by ID and index them */ sortwaysx=waysx; xnumber=waysx->number; waysx->number=filesort_vary(waysx->fd,fd,NULL, (int (*)(const void*,const void*))sort_by_id, (int (*)(void*,index_t))deduplicate_and_index_by_id); waysx->knumber=waysx->number; /* Close the files */ waysx->fd=CloseFileBuffered(waysx->fd); CloseFileBuffered(fd); waysx->ifd=CloseFileBuffered(waysx->ifd); /* Print the final message */ printf_last("Sorted Ways: Ways=%"Pindex_t" Duplicates=%"Pindex_t,xnumber,xnumber-waysx->number); } /*++++++++++++++++++++++++++++++++++++++ Sort the ways into id order. int sort_by_id Returns the comparison of the id fields. WayX *a The first extended way. WayX *b The second extended way. ++++++++++++++++++++++++++++++++++++++*/ static int sort_by_id(WayX *a,WayX *b) { way_t a_id=a->id; way_t b_id=b->id; if(a_idb_id) return(1); else return(-FILESORT_PRESERVE_ORDER(a,b)); /* latest version first */ } /*++++++++++++++++++++++++++++++++++++++ Discard duplicate ways and create and index of ids. int deduplicate_and_index_by_id Return 1 if the value is to be kept, otherwise 0. WayX *wayx The extended way. index_t index The number of sorted ways that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int deduplicate_and_index_by_id(WayX *wayx,index_t index) { static way_t previd; /* internal variable (reset by first call in each sort; index==0) */ if(index==0 || wayx->id!=previd) { previd=wayx->id; if(wayx->way.type==WAY_DELETED) return(0); else { WriteFileBuffered(sortwaysx->ifd,&wayx->id,sizeof(way_t)); return(1); } } else return(0); } /*++++++++++++++++++++++++++++++++++++++ Split the ways into segments and way names. SegmentsX *SplitWays Returns the set of segments that have been created. WaysX *waysx The set of ways to process. NodesX *nodesx The set of nodes to use. int keep If set to 1 then keep the old data file otherwise delete it. ++++++++++++++++++++++++++++++++++++++*/ SegmentsX *SplitWays(WaysX *waysx,NodesX *nodesx,int keep) { SegmentsX *segmentsx; index_t i; int fd,nfd; char *name=NULL; uint32_t namelen=0; /* Print the start message */ printf_first("Splitting Ways: Ways=0 Segments=0"); segmentsx=NewSegmentList(); /* Re-open the file read-only and a new file writeable */ if(keep) { RenameFile(waysx->filename_tmp,waysx->filename); waysx->fd=ReOpenFileBuffered(waysx->filename); fd=OpenFileBufferedNew(waysx->filename_tmp); } else fd=ReplaceFileBuffered(waysx->filename_tmp,&waysx->fd); nfd=OpenFileBufferedNew(waysx->nfilename_tmp); /* Map the index into memory */ nodesx->idata=MapFile(nodesx->ifilename_tmp); waysx->idata =MapFile(waysx->ifilename_tmp); /* Loop through the ways and create the segments and way names */ for(i=0;inumber;i++) { WayX wayx; FILESORT_VARINT size; node_t node,prevnode=NO_NODE_ID; index_t index,previndex=NO_NODE; ReadFileBuffered(waysx->fd,&size,FILESORT_VARSIZE); ReadFileBuffered(waysx->fd,&wayx,sizeof(WayX)); waysx->transports|=wayx.way.allow; while(!ReadFileBuffered(waysx->fd,&node,sizeof(node_t)) && node!=NO_NODE_ID) { index=IndexNodeX(nodesx,node); if(prevnode==node) { logerror("Way %"Pway_t" contains node %"Pnode_t" that is connected to itself.\n",logerror_way(waysx->idata[i]),logerror_node(node)); } else if(index==NO_NODE) { logerror("Way %"Pway_t" contains node %"Pnode_t" that does not exist in the Routino database.\n",logerror_way(waysx->idata[i]),logerror_node(node)); } else if(previndex==NO_NODE) ; else { distance_t segment_flags=0; if(wayx.way.type&Highway_OneWay) segment_flags|=ONEWAY_1TO2; if(wayx.way.type&Highway_Area) segment_flags|=SEGMENT_AREA; AppendSegmentList(segmentsx,i,previndex,index,segment_flags); } prevnode=node; previndex=index; size-=sizeof(node_t); } size-=sizeof(node_t)+sizeof(WayX); if(namelenfd,name,size); WriteFileBuffered(fd,&wayx,sizeof(WayX)); size+=sizeof(index_t); WriteFileBuffered(nfd,&size,FILESORT_VARSIZE); WriteFileBuffered(nfd,&i,sizeof(index_t)); WriteFileBuffered(nfd,name,size-sizeof(index_t)); if(!((i+1)%1000)) printf_middle("Splitting Ways: Ways=%"Pindex_t" Segments=%"Pindex_t,i+1,segmentsx->number); } FinishSegmentList(segmentsx); if(name) free(name); /* Close the files */ waysx->fd=CloseFileBuffered(waysx->fd); CloseFileBuffered(fd); CloseFileBuffered(nfd); /* Unmap the index from memory */ nodesx->idata=UnmapFile(nodesx->idata); waysx->idata =UnmapFile(waysx->idata); /* Print the final message */ printf_last("Split Ways: Ways=%"Pindex_t" Segments=%"Pindex_t,waysx->number,segmentsx->number); return(segmentsx); } /*++++++++++++++++++++++++++++++++++++++ Sort the way names and assign the offsets to the ways. WaysX *waysx The set of ways to process. ++++++++++++++++++++++++++++++++++++++*/ void SortWayNames(WaysX *waysx) { index_t i,nnames=0; int nfd; char *names[2]={NULL,NULL}; uint32_t namelen[2]={0,0}; uint32_t lastlength=0; /* Print the start message */ printf_first("Sorting Way Names"); /* Re-open the file read-only and new file writeable */ nfd=ReplaceFileBuffered(waysx->nfilename_tmp,&waysx->nfd); /* Sort the way names */ waysx->nlength=0; filesort_vary(waysx->nfd,nfd,NULL, (int (*)(const void*,const void*))sort_by_name, NULL); /* Close the files */ waysx->nfd=CloseFileBuffered(waysx->nfd); CloseFileBuffered(nfd); /* Print the final message */ printf_last("Sorted Way Names: Ways=%"Pindex_t,waysx->number); /* Print the start message */ printf_first("Updating Ways with Names: Ways=0 Names=0"); /* Map into memory / open the file */ #if !SLIM waysx->data=MapFileWriteable(waysx->filename_tmp); #else waysx->fd=SlimMapFileWriteable(waysx->filename_tmp); #endif /* Re-open the file read-only and new file writeable */ nfd=ReplaceFileBuffered(waysx->nfilename_tmp,&waysx->nfd); /* Update the ways and de-duplicate the names */ for(i=0;inumber;i++) { WayX *wayx; index_t index; FILESORT_VARINT size; ReadFileBuffered(waysx->nfd,&size,FILESORT_VARSIZE); if(namelen[nnames%2]nfd,&index,sizeof(index_t)); ReadFileBuffered(waysx->nfd,names[nnames%2],size-sizeof(index_t)); if(nnames==0 || strcmp(names[0],names[1])) { WriteFileBuffered(nfd,names[nnames%2],size-sizeof(index_t)); lastlength=waysx->nlength; waysx->nlength+=size-sizeof(index_t); nnames++; } wayx=LookupWayX(waysx,index,1); wayx->way.name=lastlength; PutBackWayX(waysx,wayx); if(!((i+1)%1000)) printf_middle("Updating Ways with Names: Ways=%"Pindex_t" Names=%"Pindex_t,i+1,nnames); } if(names[0]) free(names[0]); if(names[1]) free(names[1]); /* Close the files */ waysx->nfd=CloseFileBuffered(waysx->nfd); CloseFileBuffered(nfd); /* Unmap from memory / close the files */ #if !SLIM waysx->data=UnmapFile(waysx->data); #else waysx->fd=SlimUnmapFile(waysx->fd); #endif /* Print the final message */ printf_last("Updated Ways with Names: Ways=%"Pindex_t" Names=%"Pindex_t,waysx->number,nnames); } /*++++++++++++++++++++++++++++++++++++++ Sort the ways into name order. int sort_by_name Returns the comparison of the name fields. char *a The first way name. char *b The second way name. ++++++++++++++++++++++++++++++++++++++*/ static int sort_by_name(char *a,char *b) { int compare; char *a_name=a+sizeof(index_t); char *b_name=b+sizeof(index_t); compare=strcmp(a_name,b_name); if(compare) return(compare); else return(FILESORT_PRESERVE_ORDER(a,b)); } /*++++++++++++++++++++++++++++++++++++++ Compact the way list, removing duplicated ways and unused ways. WaysX *waysx The set of ways to process. SegmentsX *segmentsx The set of segments to check. ++++++++++++++++++++++++++++++++++++++*/ void CompactWayList(WaysX *waysx,SegmentsX *segmentsx) { int fd; index_t cnumber; if(waysx->number==0) return; /* Print the start message */ printf_first("Sorting Ways and Compacting"); /* Allocate the array of indexes */ waysx->cdata=(index_t*)malloc_logassert(waysx->number*sizeof(index_t)); log_malloc(waysx->cdata,waysx->number*sizeof(index_t)); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(waysx->filename_tmp,&waysx->fd); /* Sort the ways to allow compacting according to the properties */ sortwaysx=waysx; sortsegmentsx=segmentsx; cnumber=filesort_fixed(waysx->fd,fd,sizeof(WayX),(int (*)(void*,index_t))delete_unused, (int (*)(const void*,const void*))sort_by_name_and_prop_and_id, (int (*)(void*,index_t))deduplicate_and_index_by_compact_id); /* Close the files */ waysx->fd=CloseFileBuffered(waysx->fd); CloseFileBuffered(fd); /* Free the data */ log_free(segmentsx->usedway); free(segmentsx->usedway); segmentsx->usedway=NULL; /* Print the final message */ printf_last("Sorted and Compacted Ways: Ways=%"Pindex_t" Unique=%"Pindex_t,waysx->number,cnumber); waysx->number=cnumber; } /*++++++++++++++++++++++++++++++++++++++ Delete the ways that are no longer being used. int delete_unused Return 1 if the value is to be kept, otherwise 0. WayX *wayx The extended way. index_t index The number of unsorted ways that have been read from the input file. ++++++++++++++++++++++++++++++++++++++*/ static int delete_unused(WayX *wayx,index_t index) { if(sortsegmentsx && !IsBitSet(sortsegmentsx->usedway,index)) { sortwaysx->cdata[index]=NO_WAY; return(0); } else { wayx->id=index; return(1); } } /*++++++++++++++++++++++++++++++++++++++ Sort the ways into name, properties and id order. int sort_by_name_and_prop_and_id Returns the comparison of the name, properties and id fields. WayX *a The first extended Way. WayX *b The second extended Way. ++++++++++++++++++++++++++++++++++++++*/ static int sort_by_name_and_prop_and_id(WayX *a,WayX *b) { int compare; index_t a_name=a->way.name; index_t b_name=b->way.name; if(a_nameb_name) return(1); compare=WaysCompare(&a->way,&b->way); if(compare) return(compare); return(sort_by_id(a,b)); } /*++++++++++++++++++++++++++++++++++++++ Create the index of compacted Way identifiers and ignore Ways with duplicated properties. int deduplicate_and_index_by_compact_id Return 1 if the value is to be kept, otherwise 0. WayX *wayx The extended way. index_t index The number of sorted ways that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int deduplicate_and_index_by_compact_id(WayX *wayx,index_t index) { static Way lastway; /* internal variable (reset by first call in each sort; index==0) */ if(index==0 || wayx->way.name!=lastway.name || WaysCompare(&lastway,&wayx->way)) { lastway=wayx->way; sortwaysx->cdata[wayx->id]=index; return(1); } else { sortwaysx->cdata[wayx->id]=index-1; return(0); } } /*++++++++++++++++++++++++++++++++++++++ Save the way list to a file. WaysX *waysx The set of ways to save. const char *filename The name of the file to save. ++++++++++++++++++++++++++++++++++++++*/ void SaveWayList(WaysX *waysx,const char *filename) { index_t i; int fd; index_t position=0; WayX wayx; WaysFile waysfile={0}; highways_t highways=0; transports_t transports=0; properties_t properties=0; /* Print the start message */ printf_first("Writing Ways: Ways=0"); /* Re-open the files */ waysx->fd=ReOpenFileBuffered(waysx->filename_tmp); waysx->nfd=ReOpenFileBuffered(waysx->nfilename_tmp); /* Write out the ways data */ fd=OpenFileBufferedNew(filename); SeekFileBuffered(fd,sizeof(WaysFile)); for(i=0;inumber;i++) { ReadFileBuffered(waysx->fd,&wayx,sizeof(WayX)); highways |=HIGHWAYS(wayx.way.type); transports|=wayx.way.allow; properties|=wayx.way.props; WriteFileBuffered(fd,&wayx.way,sizeof(Way)); if(!((i+1)%1000)) printf_middle("Writing Ways: Ways=%"Pindex_t,i+1); } /* Write out the ways names */ SeekFileBuffered(fd,sizeof(WaysFile)+(offset_t)waysx->number*sizeof(Way)); while(positionnlength) { size_t len=1024; char temp[1024]; if((waysx->nlength-position)<1024) len=waysx->nlength-position; ReadFileBuffered(waysx->nfd,temp,len); WriteFileBuffered(fd,temp,len); position+=len; } /* Close the files */ waysx->fd=CloseFileBuffered(waysx->fd); waysx->nfd=CloseFileBuffered(waysx->nfd); /* Write out the header structure */ waysfile.number =waysx->number; waysfile.highways =highways; waysfile.transports=transports; waysfile.properties=properties; SeekFileBuffered(fd,0); WriteFileBuffered(fd,&waysfile,sizeof(WaysFile)); CloseFileBuffered(fd); /* Print the final message */ printf_last("Wrote Ways: Ways=%"Pindex_t,waysx->number); } routino-3.4.3/src/logging.h 644 233 144 10221 14774237042 11004 0/*************************************** Header file for logging function prototypes Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2017, 2019, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef LOGGING_H #define LOGGING_H /*+ To stop multiple inclusions. +*/ #include #include "typesx.h" /* Data structures */ /*+ A structure containing a single object as written by the logerror_*() functions. +*/ typedef struct _ErrorLogObject { char type; /*+ The type of the object. +*/ uint64_t id; /*+ The id of the object. +*/ uint32_t offset; /*+ The offset of the error message from the beginning of the text file. +*/ } ErrorLogObject; /* Variables */ extern int option_loggable; extern int option_logtime; extern int option_logmemory; /* Runtime progress logging functions in logging.c */ void printf_program_start(void); void printf_program_end(void); #ifdef __GNUC__ void printf_first(const char *format, ...) __attribute__ ((format (printf, 1, 2))); void printf_middle(const char *format, ...) __attribute__ ((format (printf, 1, 2))); void printf_last(const char *format, ...) __attribute__ ((format (printf, 1, 2))); void fprintf_first(FILE *file,const char *format, ...) __attribute__ ((format (printf, 2, 3))); void fprintf_middle(FILE *file,const char *format, ...) __attribute__ ((format (printf, 2, 3))); void fprintf_last(FILE *file,const char *format, ...) __attribute__ ((format (printf, 2, 3))); #else void printf_first(const char *format, ...); void printf_middle(const char *format, ...); void printf_last(const char *format, ...); void fprintf_first(FILE *file,const char *format, ...); void fprintf_middle(FILE *file,const char *format, ...); void fprintf_last(FILE *file,const char *format, ...); #endif void log_malloc(void *address,size_t size); void log_free(void *address); void log_mmap(size_t size); void log_munmap(size_t size); /* Error logging functions in logerror.c */ void open_errorlog(const char *filename,int append,int bin); void close_errorlog(void); #ifdef __GNUC__ void logerror(const char *format, ...) __attribute__ ((format (printf, 1, 2))); #else void logerror(const char *format, ...); #endif node_t logerror_node (node_t id); way_t logerror_way (way_t id); relation_t logerror_relation(relation_t id); /* Runtime fatal error assertion in logging.c */ #define logassert(xx,yy) do { if(!(xx)) _logassert( yy,__FILE__,__LINE__); } while(0) #define logassert_format(xx,yy) do { if(!(xx)) _logassert(_logassert_format yy,__FILE__,__LINE__); } while(0) #ifdef __GNUC__ void _logassert(const char *message,const char *file,int line) __attribute__ ((noreturn)); const char *_logassert_format(const char *format, ...) __attribute__ ((format (printf, 1, 2))); #else void _logassert(const char *message,const char *file,int line); const char *_logassert_format(const char *format, ...); #endif /* Memory allocation with logging */ #define calloc_logassert(xx,yy) _calloc_logassert (xx,yy,__FILE__,__LINE__) #define malloc_logassert(xx) _malloc_logassert (xx ,__FILE__,__LINE__) #define realloc_logassert(xx,yy) _realloc_logassert(xx,yy,__FILE__,__LINE__) void *_calloc_logassert (size_t nmemb,size_t size,const char *file,int line); void *_malloc_logassert ( size_t size,const char *file,int line); void *_realloc_logassert(void *ptr, size_t size,const char *file,int line); #endif /* LOGGING_H */ routino-3.4.3/src/uncompress.c 644 233 144 25036 14774246325 11565 0/*************************************** File uncompression. Part of the Routino routing software. ******************/ /****************** This file Copyright 2012-2015, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #if defined(_MSC_VER) #include #define read(fd,address,length) _read(fd,address,(unsigned int)(length)) #define write(fd,address,length) _write(fd,address,(unsigned int)(length)) #define close _close #else #include #endif #include #if defined(USE_BZIP2) && USE_BZIP2 #define BZ_NO_STDIO #include #endif #if defined(USE_GZIP) && USE_GZIP #include #endif #if defined(USE_XZ) && USE_XZ #include #endif #include "logging.h" #include "uncompress.h" /* Local functions */ #if !defined(_MSC_VER) && !defined(__MINGW32__) #if (defined(USE_BZIP2) && USE_BZIP2) || (defined(USE_GZIP) && USE_GZIP) || (defined(USE_XZ) && USE_XZ) static int pipe_and_fork(int filefd,int *pipefd); #endif #if defined(USE_BZIP2) && USE_BZIP2 static void uncompress_bzip2_pipe(int filefd,int pipefd); #endif #if defined(USE_GZIP) && USE_GZIP static void uncompress_gzip_pipe(int filefd,int pipefd); #endif #if defined(USE_XZ) && USE_XZ static void uncompress_xz_pipe(int filefd,int pipefd); #endif #endif /* !defined(_MSC_VER) && !defined(__MINGW32__) */ /*++++++++++++++++++++++++++++++++++++++ Create a child process to uncompress data on a file descriptor as if it were a pipe. int Uncompress_Bzip2 Returns the file descriptor of the uncompressed end of the pipe. int filefd The file descriptor of the compressed end of the pipe. ++++++++++++++++++++++++++++++++++++++*/ int Uncompress_Bzip2(int filefd) { #if defined(USE_BZIP2) && USE_BZIP2 && !defined(_MSC_VER) && !defined(__MINGW32__) int pipefd=-1; if(pipe_and_fork(filefd,&pipefd)) return(pipefd); uncompress_bzip2_pipe(filefd,pipefd); exit(EXIT_SUCCESS); #else /* USE_BZIP2 */ logassert(0,"No bzip2 compression support available (re-compile and try again)."); return(0); #endif /* USE_BZIP2 */ } /*++++++++++++++++++++++++++++++++++++++ Create a child process to uncompress data on a file descriptor as if it were a pipe. int Uncompress_Gzip Returns the file descriptor of the uncompressed end of the pipe. int filefd The file descriptor of the compressed end of the pipe. ++++++++++++++++++++++++++++++++++++++*/ int Uncompress_Gzip(int filefd) { #if defined(USE_GZIP) && USE_GZIP && !defined(_MSC_VER) && !defined(__MINGW32__) int pipefd=-1; if(pipe_and_fork(filefd,&pipefd)) return(pipefd); uncompress_gzip_pipe(filefd,pipefd); exit(EXIT_SUCCESS); #else /* USE_GZIP */ logassert(0,"No gzip compression support available (re-compile and try again)."); return(0); #endif /* USE_GZIP */ } /*++++++++++++++++++++++++++++++++++++++ Create a child process to uncompress data on a file descriptor as if it were a pipe. int Uncompress_Xz Returns the file descriptor of the uncompressed end of the pipe. int filefd The file descriptor of the compressed end of the pipe. ++++++++++++++++++++++++++++++++++++++*/ int Uncompress_Xz(int filefd) { #if defined(USE_XZ) && USE_XZ && !defined(_MSC_VER) && !defined(__MINGW32__) int pipefd=-1; if(pipe_and_fork(filefd,&pipefd)) return(pipefd); uncompress_xz_pipe(filefd,pipefd); exit(EXIT_SUCCESS); #else /* USE_XZ */ logassert(0,"No xz compression support available (re-compile and try again)."); return(0); #endif /* USE_XZ */ } #if !defined(_MSC_VER) && !defined(__MINGW32__) #if (defined(USE_BZIP2) && USE_BZIP2) || (defined(USE_GZIP) && USE_GZIP) || (defined(USE_XZ) && USE_XZ) /*++++++++++++++++++++++++++++++++++++++ Create a pipe and then fork returning in the parent and child with a different end of the pipe. int pipe_and_fork Returns 1 for the reading (parent) end of the pipe and 0 for the writing (child) end. int filefd The file descriptor of the file. int *pipefd Returns the file descriptor for the end of the pipe. ++++++++++++++++++++++++++++++++++++++*/ static int pipe_and_fork(int filefd,int *pipefd) { int pipe_fd[2]={-1,-1}; pid_t childpid; #define PIPE_READER 0 #define PIPE_WRITER 1 if(pipe(pipe_fd)) { logassert(0,"Cannot create pipe for uncompressor (try without using a compressed file)"); return(1); } if((childpid=fork()) == -1) { logassert(0,"Cannot create new process for uncompressor (try without using a compressed file)"); return(1); } if(childpid==0) /* The child */ { int i; *pipefd=pipe_fd[PIPE_WRITER]; /* Close all unneeded file descriptors */ for(i=0;i<255;i++) if(i!=filefd && i!=*pipefd) close(i); return(0); } else /* The parent */ { struct sigaction action; *pipefd=pipe_fd[PIPE_READER]; /* Close all unneeded file descriptors */ close(pipe_fd[PIPE_WRITER]); close(filefd); /* Ignore child exiting and pipe signals */ /* SIGCHLD */ action.sa_handler=SIG_IGN; sigemptyset(&action.sa_mask); action.sa_flags=0; sigaction(SIGCHLD,&action,NULL); /* SIGPIPE */ action.sa_handler=SIG_IGN; sigemptyset(&action.sa_mask); action.sa_flags=0; sigaction(SIGPIPE,&action,NULL); return(1); } } #endif /* (defined(USE_BZIP2) && USE_BZIP2) || (defined(USE_GZIP) && USE_GZIP) || (defined(USE_XZ) && USE_XZ) */ #if defined(USE_BZIP2) && USE_BZIP2 /*++++++++++++++++++++++++++++++++++++++ Uncompress a file using bzip2 as a pipeline. int filefd The incoming, compressed, data. int pipefd The outgoing, uncompressed, data. ++++++++++++++++++++++++++++++++++++++*/ static void uncompress_bzip2_pipe(int filefd,int pipefd) { bz_stream bz={0}; char inbuffer[16384],outbuffer[16384]; int infinished=0; int state; if(BZ2_bzDecompressInit(&bz,0,0)!=BZ_OK) exit(EXIT_FAILURE); /* no error message because in sub-process */ do { if(bz.avail_in==0 && !infinished) { ssize_t n=read(filefd,inbuffer,sizeof(inbuffer)); if(n<=0) infinished=1; else { bz.next_in=inbuffer; bz.avail_in=n; } } bz.next_out=outbuffer; bz.avail_out=sizeof(outbuffer); state=BZ2_bzDecompress(&bz); if(state!=BZ_OK && state!=BZ_STREAM_END) exit(EXIT_FAILURE); /* no error message because in sub-process */ if(bz.avail_out0) { m=write(pipefd,p,n); if(m<=0) exit(EXIT_FAILURE); /* no error message because in sub-process */ p+=m; n-=m; } } } while(state!=BZ_STREAM_END); if(BZ2_bzDecompressEnd(&bz)!=BZ_OK) exit(EXIT_FAILURE); /* no error message because in sub-process */ exit(EXIT_SUCCESS); } #endif /* USE_BZIP2 */ #if defined(USE_GZIP) && USE_GZIP /*++++++++++++++++++++++++++++++++++++++ Uncompress a file using gzip as a pipeline. int filefd The incoming, compressed, data. int pipefd The outgoing, uncompressed, data. ++++++++++++++++++++++++++++++++++++++*/ static void uncompress_gzip_pipe(int filefd,int pipefd) { z_stream z={0}; unsigned char inbuffer[16384],outbuffer[16384]; int infinished=0; int state; if(inflateInit2(&z,15+32)!=Z_OK) exit(EXIT_FAILURE); /* no error message because in sub-process */ do { if(z.avail_in==0 && !infinished) { ssize_t n=read(filefd,inbuffer,sizeof(inbuffer)); if(n<=0) infinished=1; else { z.next_in=inbuffer; z.avail_in=n; } } z.next_out=outbuffer; z.avail_out=sizeof(outbuffer); state=inflate(&z,Z_NO_FLUSH); if(state!=Z_OK && state!=Z_STREAM_END) exit(EXIT_FAILURE); /* no error message because in sub-process */ if(z.avail_out0) { m=write(pipefd,p,n); if(m<=0) exit(EXIT_FAILURE); /* no error message because in sub-process */ p+=m; n-=m; } } } while(state!=Z_STREAM_END); if(inflateEnd(&z)!=Z_OK) exit(EXIT_FAILURE); /* no error message because in sub-process */ exit(EXIT_SUCCESS); } #endif /* USE_GZIP */ #if defined(USE_XZ) && USE_XZ /*++++++++++++++++++++++++++++++++++++++ Uncompress a file using xz as a pipeline. int filefd The incoming, compressed, data. int pipefd The outgoing, uncompressed, data. ++++++++++++++++++++++++++++++++++++++*/ static void uncompress_xz_pipe(int filefd,int pipefd) { lzma_stream lzma=LZMA_STREAM_INIT; unsigned char inbuffer[16384],outbuffer[16384]; int infinished=0; lzma_ret retval; if(lzma_stream_decoder(&lzma,UINT64_MAX,0)!=LZMA_OK) exit(EXIT_FAILURE); /* no error message because in sub-process */ do { if(lzma.avail_in==0 && !infinished) { ssize_t n=read(filefd,inbuffer,sizeof(inbuffer)); if(n<=0) infinished=1; else { lzma.next_in=inbuffer; lzma.avail_in=n; } } lzma.next_out=outbuffer; lzma.avail_out=sizeof(outbuffer); retval=lzma_code(&lzma,LZMA_RUN); if(retval!=LZMA_OK && retval!=LZMA_STREAM_END) exit(EXIT_FAILURE); /* no error message because in sub-process */ if(lzma.avail_out0) { m=write(pipefd,p,n); if(m<=0) exit(EXIT_FAILURE); /* no error message because in sub-process */ p+=m; n-=m; } } } while(retval!=LZMA_STREAM_END); lzma_end(&lzma); exit(EXIT_SUCCESS); /* no error message because in sub-process */ } #endif /* USE_XZ */ #endif /* !defined(_MSC_VER) && !defined(__MINGW32__) */ routino-3.4.3/src/router.c 644 233 144 64251 14774507017 10707 0/*************************************** OSM router. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2016, 2018, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include "version.h" #include "types.h" #include "nodes.h" #include "segments.h" #include "ways.h" #include "relations.h" #include "files.h" #include "logging.h" #include "functions.h" #include "fakes.h" #include "translations.h" #include "profiles.h" /*+ The maximum distance from the specified point to search for a node or segment (in km). +*/ #define MAXSEARCH 1 /* Global variables */ /*+ The option not to print any progress information. +*/ int option_quiet=0; /*+ The option to calculate the quickest route insted of the shortest. +*/ extern int option_quickest; /*+ The options to select the format of the file output. +*/ extern int option_file_html,option_file_gpx_track,option_file_gpx_route,option_file_text,option_file_text_all,option_file_stdout; int option_file_none=0; /* Local functions */ static void print_usage(int detail,const char *argerr,const char *err); /*++++++++++++++++++++++++++++++++++++++ The main program for the router. ++++++++++++++++++++++++++++++++++++++*/ int main(int argc,char** argv) { Nodes *OSMNodes; Segments *OSMSegments; Ways *OSMWays; Relations *OSMRelations; Results *results[NWAYPOINTS+1]={NULL}; int point_used[NWAYPOINTS+1]={0}; double point_lon[NWAYPOINTS+1],point_lat[NWAYPOINTS+1]; index_t point_node[NWAYPOINTS+1]={NO_NODE}; double heading=-999; int help_profile=0,help_profile_xml=0,help_profile_json=0,help_profile_pl=0; char *dirname=NULL,*prefix=NULL; char *profiles=NULL,*profilename=NULL; char *translations=NULL,*language=NULL; int exactnodes=0,reverse=0,loop=0; Transport transport=Transport_None; Profile *profile=NULL; Translation *translation=NULL; index_t start_node,finish_node=NO_NODE; index_t join_segment=NO_SEGMENT; int arg,nresults=0; waypoint_t start_waypoint,finish_waypoint=NO_WAYPOINT; waypoint_t first_waypoint=NWAYPOINTS,last_waypoint=1,waypoint; int inc_dec_waypoint=1; printf_program_start(); /* Parse the command line arguments */ if(argc<2) print_usage(0,NULL,NULL); /* Get the non-routing, general program options */ for(arg=1;argNWAYPOINTS || point_used[point]&1) print_usage(0,argv[arg],NULL); point_lon[point]=degrees_to_radians(atof(p)); point_used[point]+=1; if(pointlast_waypoint) last_waypoint=point; } else if(!strncmp(argv[arg],"--lat",5) && isdigit(argv[arg][5])) { int point; char *p=&argv[arg][6]; while(isdigit(*p)) p++; if(*p++!='=') print_usage(0,argv[arg],NULL); point=atoi(&argv[arg][5]); if(point>NWAYPOINTS || point_used[point]&2) print_usage(0,argv[arg],NULL); point_lat[point]=degrees_to_radians(atof(p)); point_used[point]+=2; if(pointlast_waypoint) last_waypoint=point; } else if(!strncmp(argv[arg],"--heading=",10)) { double h=atof(&argv[arg][10]); if(h>=-360 && h<=360) { heading=h; if(heading<0) heading+=360; } } else if(!strncmp(argv[arg],"--transport=",12)) { transport=TransportType(&argv[arg][12]); if(transport==Transport_None) print_usage(0,argv[arg],NULL); } else continue; argv[arg]=NULL; } /* Check the specified command line options */ if(option_file_stdout && (option_file_html+option_file_gpx_track+option_file_gpx_route+option_file_text+option_file_text_all)!=1) { fprintf(stderr,"Error: The '--output-stdout' option requires exactly one other output option (but not '--output-none').\n"); exit(EXIT_FAILURE); } if(option_file_html==0 && option_file_gpx_track==0 && option_file_gpx_route==0 && option_file_text==0 && option_file_text_all==0 && option_file_none==0) option_file_html=option_file_gpx_track=option_file_gpx_route=option_file_text=option_file_text_all=1; /* Load in the selected profiles */ if(transport==Transport_None) transport=Transport_Motorcar; if(profiles) { if(!ExistsFile(profiles)) { fprintf(stderr,"Error: The '--profiles' option specifies a file '%s' that does not exist.\n",profiles); exit(EXIT_FAILURE); } } else { profiles=FileName(dirname,prefix,"profiles.xml"); if(!ExistsFile(profiles)) { char *defaultprofiles=FileName(ROUTINO_DATADIR,NULL,"profiles.xml"); if(!ExistsFile(defaultprofiles)) { fprintf(stderr,"Error: The '--profiles' option was not used and the files '%s' and '%s' do not exist.\n",profiles,defaultprofiles); exit(EXIT_FAILURE); } free(profiles); profiles=defaultprofiles; } } if(!profilename) profilename=(char*)TransportName(transport); if(ParseXMLProfiles(profiles,profilename,(help_profile_xml|help_profile_json|help_profile_pl))) { fprintf(stderr,"Error: Cannot read the profiles in the file '%s'.\n",profiles); exit(EXIT_FAILURE); } profile=GetProfile(profilename); if(!profile) { fprintf(stderr,"Error: Cannot find a profile called '%s' in the file '%s'.\n",profilename,profiles); profile=(Profile*)calloc(1,sizeof(Profile)); profile->transport=transport; } /* Parse the other command line arguments that modify the profile */ for(arg=1;arg100) print_usage(0,argv[arg],NULL); profile->highway[highway]=(score_t)(p/100); free(string); } else if(!strncmp(argv[arg],"--speed-",8)) { Highway highway; char *equal=strchr(argv[arg],'='); char *string; double s; if(!equal) print_usage(0,argv[arg],NULL); string=strcpy((char*)malloc(strlen(argv[arg])),argv[arg]+8); string[equal-argv[arg]-8]=0; highway=HighwayType(string); if(highway==Highway_None) print_usage(0,argv[arg],NULL); s=atof(equal+1); if(s<0) print_usage(0,argv[arg],NULL); profile->speed[highway]=kph_to_speed(s); free(string); } else if(!strncmp(argv[arg],"--property-",11)) { Property property; char *equal=strchr(argv[arg],'='); char *string; double p; if(!equal) print_usage(0,argv[arg],NULL); string=strcpy((char*)malloc(strlen(argv[arg])),argv[arg]+11); string[equal-argv[arg]-11]=0; property=PropertyType(string); if(property==Property_None) print_usage(0,argv[arg],NULL); p=atof(equal+1); if(p<0 || p>100) print_usage(0,argv[arg],NULL); profile->props[property]=(score_t)(p/100); free(string); } else if(!strncmp(argv[arg],"--oneway=",9)) profile->oneway=!!atoi(&argv[arg][9]); else if(!strncmp(argv[arg],"--turns=",8)) profile->turns=!!atoi(&argv[arg][8]); else if(!strncmp(argv[arg],"--weight=",9)) profile->weight=tonnes_to_weight(atof(&argv[arg][9])); else if(!strncmp(argv[arg],"--height=",9)) profile->height=metres_to_height(atof(&argv[arg][9])); else if(!strncmp(argv[arg],"--width=",8)) profile->width=metres_to_width(atof(&argv[arg][8])); else if(!strncmp(argv[arg],"--length=",9)) profile->length=metres_to_length(atof(&argv[arg][9])); else print_usage(0,argv[arg],NULL); } /* Print one of the profiles if requested */ if(help_profile) { PrintProfile(profile); exit(EXIT_SUCCESS); } else if(help_profile_xml) { PrintProfilesXML(); exit(EXIT_SUCCESS); } else if(help_profile_json) { PrintProfilesJSON(); exit(EXIT_SUCCESS); } else if(help_profile_pl) { PrintProfilesPerl(); exit(EXIT_SUCCESS); } /* Load in the selected translation */ if(option_file_html || option_file_gpx_route || option_file_gpx_track || option_file_text || option_file_text_all) { if(translations) { if(!ExistsFile(translations)) { fprintf(stderr,"Error: The '--translations' option specifies a file '%s' that does not exist.\n",translations); exit(EXIT_FAILURE); } } else { translations=FileName(dirname,prefix,"translations.xml"); if(!ExistsFile(translations)) { char *defaulttranslations=FileName(ROUTINO_DATADIR,NULL,"translations.xml"); if(!ExistsFile(defaulttranslations)) { fprintf(stderr,"Error: The '--translations' option was not used and the files '%s' and '%s' do not exist.\n",translations,defaulttranslations); exit(EXIT_FAILURE); } free(translations); translations=defaulttranslations; } } if(ParseXMLTranslations(translations,language,0)) { fprintf(stderr,"Error: Cannot read the translations in the file '%s'.\n",translations); exit(EXIT_FAILURE); } if(language) { translation=GetTranslation(language); if(!translation) { fprintf(stderr,"Error: Cannot find a translation called '%s' in the file '%s'.\n",language,translations); exit(EXIT_FAILURE); } } else { translation=GetTranslation(""); if(!translation) { fprintf(stderr,"Error: No translations in '%s'.\n",translations); exit(EXIT_FAILURE); } } } /* Check the waypoints are valid */ for(waypoint=1;waypoint<=NWAYPOINTS;waypoint++) if(point_used[waypoint]==1 || point_used[waypoint]==2) print_usage(0,NULL,"All waypoints must have latitude and longitude."); if(first_waypoint>=last_waypoint) print_usage(0,NULL,"At least two waypoints must be specified."); /* Load in the data - Note: No error checking because Load*List() will call exit() in case of an error. */ if(!option_quiet) printf_first("Loading Files:"); OSMNodes=LoadNodeList(FileName(dirname,prefix,"nodes.mem")); OSMSegments=LoadSegmentList(FileName(dirname,prefix,"segments.mem")); OSMWays=LoadWayList(FileName(dirname,prefix,"ways.mem")); OSMRelations=LoadRelationList(FileName(dirname,prefix,"relations.mem")); if(!option_quiet) printf_last("Loaded Files: nodes, segments, ways & relations"); /* Check the profile is valid for use with this database */ if(UpdateProfile(profile,OSMWays)) { fprintf(stderr,"Error: Profile is invalid or not compatible with database.\n"); exit(EXIT_FAILURE); } /* Find all waypoints */ for(waypoint=first_waypoint;waypoint<=last_waypoint;waypoint++) { distance_t distmax=km_to_distance(MAXSEARCH); distance_t distmin; index_t segment=NO_SEGMENT; index_t node1,node2,node=NO_NODE; if(point_used[waypoint]!=3) continue; /* Find the closest point */ if(!option_quiet) printf_first("Finding Closest Point: Waypoint %d",waypoint); if(exactnodes) node=FindClosestNode(OSMNodes,OSMSegments,OSMWays,point_lat[waypoint],point_lon[waypoint],distmax,profile,&distmin); else { distance_t dist1,dist2; segment=FindClosestSegment(OSMNodes,OSMSegments,OSMWays,point_lat[waypoint],point_lon[waypoint],distmax,profile,&distmin,&node1,&node2,&dist1,&dist2); if(segment!=NO_SEGMENT) node=CreateFakes(OSMNodes,OSMSegments,waypoint,LookupSegment(OSMSegments,segment,1),node1,node2,dist1,dist2); } if(!option_quiet) printf_last("Found Closest Point: Waypoint %d",waypoint); if(node==NO_NODE) { fprintf(stderr,"Error: Cannot find node close to specified point %d.\n",waypoint); exit(EXIT_FAILURE); } if(!option_quiet) { double lat,lon; if(IsFakeNode(node)) GetFakeLatLong(node,&lat,&lon); else GetLatLong(OSMNodes,node,NULL,&lat,&lon); if(IsFakeNode(node)) printf("Waypoint %d is segment %"Pindex_t" (node %"Pindex_t" -> %"Pindex_t"): %3.6f %4.6f = %2.3f km\n",waypoint,segment,node1,node2, radians_to_degrees(lon),radians_to_degrees(lat),distance_to_km(distmin)); else printf("Waypoint %d is node %"Pindex_t": %3.6f %4.6f = %2.3f km\n",waypoint,node, radians_to_degrees(lon),radians_to_degrees(lat),distance_to_km(distmin)); } point_node[waypoint]=node; } /* Check for reverse direction */ if(reverse) { waypoint_t temp; temp=first_waypoint; first_waypoint=last_waypoint; last_waypoint=temp; inc_dec_waypoint=-1; } /* Loop through all pairs of waypoints */ if(loop && reverse) { finish_node=point_node[last_waypoint]; finish_waypoint=last_waypoint; } for(waypoint=first_waypoint;waypoint!=(last_waypoint+inc_dec_waypoint);waypoint+=inc_dec_waypoint) { if(point_used[waypoint]!=3) continue; start_node=finish_node; finish_node=point_node[waypoint]; start_waypoint=finish_waypoint; finish_waypoint=waypoint; if(start_node==NO_NODE) continue; if(heading!=-999 && join_segment==NO_SEGMENT) join_segment=FindClosestSegmentHeading(OSMNodes,OSMSegments,OSMWays,start_node,heading,profile); /* Calculate the route */ if(!option_quiet) printf("Routing from waypoint %d to waypoint %d\n",start_waypoint,finish_waypoint); results[nresults]=CalculateRoute(OSMNodes,OSMSegments,OSMWays,OSMRelations,profile,start_node,join_segment,finish_node,start_waypoint,finish_waypoint); if(!results[nresults]) exit(EXIT_FAILURE); /* no message because one printed in route calculator */ join_segment=results[nresults]->last_segment; nresults++; } if(loop && !reverse) { start_node=finish_node; finish_node=point_node[first_waypoint]; start_waypoint=finish_waypoint; finish_waypoint=first_waypoint; /* Calculate the route */ if(!option_quiet) printf("Routing from waypoint %d to waypoint %d\n",start_waypoint,finish_waypoint); results[nresults]=CalculateRoute(OSMNodes,OSMSegments,OSMWays,OSMRelations,profile,start_node,join_segment,finish_node,start_waypoint,finish_waypoint); if(!results[nresults]) exit(EXIT_FAILURE); /* no message because one printed in route calculator */ nresults++; } if(!option_quiet) { printf("Routed OK\n"); fflush(stdout); } /* Print out the combined route */ if(!option_quiet) printf_first("Generating Result Outputs"); if(!option_file_none) PrintRoute(results,nresults,OSMNodes,OSMSegments,OSMWays,OSMRelations,profile,translation); if(!option_quiet) printf_last("Generated Result Outputs"); /* Destroy the remaining results lists and data structures */ #ifdef DEBUG_MEMORY_LEAK for(waypoint=0;waypoint=0) { fprintf(stderr, "Usage: router [--version]\n" " [--help | --help-profile | --help-profile-xml |\n" " --help-profile-json | --help-profile-perl ]\n" " [--dir=] [--prefix=]\n" " [--profiles=] [--translations=]\n" " [--exact-nodes-only]\n" " [--quiet | [--loggable] [--logtime] [--logmemory]]\n" " [--language=]\n" " [--output-html]\n" " [--output-gpx-track] [--output-gpx-route]\n" " [--output-text] [--output-text-all]\n" " [--output-none] [--output-stdout]\n" " [--profile=]\n" " [--transport=]\n" " [--shortest | --quickest]\n" " --lon1= --lat1=\n" " --lon2= --lon2=\n" " [ ... --lon99= --lon99=]\n" " [--reverse] [--loop]\n" " [--highway-= ...]\n" " [--speed-= ...]\n" " [--property-= ...]\n" " [--oneway=(0|1)] [--turns=(0|1)]\n" " [--weight=]\n" " [--height=] [--width=] [--length=]\n"); if(argerr) fprintf(stderr, "\n" "Error with command line parameter: %s\n",argerr); if(err) fprintf(stderr, "\n" "Error: %s\n",err); } if(detail==1) fprintf(stderr, "\n" "--version Print the version of Routino.\n" "\n" "--help Prints this information.\n" "--help-profile Prints the information about the selected profile.\n" "--help-profile-xml Prints all loaded profiles in XML format.\n" "--help-profile-json Prints all loaded profiles in JSON format.\n" "--help-profile-perl Prints all loaded profiles in Perl format.\n" "\n" "--dir= The directory containing the routing database.\n" "--prefix= The filename prefix for the routing database.\n" "--profiles= The name of the XML file containing the profiles\n" " (defaults to 'profiles.xml' with '--dir' and\n" " '--prefix' options or the file installed in\n" " '" ROUTINO_DATADIR "').\n" "--translations= The name of the XML file containing the translations\n" " (defaults to 'translations.xml' with '--dir' and\n" " '--prefix' options or the file installed in\n" " '" ROUTINO_DATADIR "').\n" "\n" "--exact-nodes-only Only route between nodes (don't find closest segment).\n" "\n" "--quiet Don't print any screen output when running.\n" "--loggable Print progress messages suitable for logging to file.\n" "--logtime Print the elapsed time for each processing step.\n" "--logmemory Print the max allocated/mapped memory for each step.\n" "\n" "--language= Use the translations for specified language.\n" "--output-html Write an HTML description of the route.\n" "--output-gpx-track Write a GPX track file with all route points.\n" "--output-gpx-route Write a GPX route file with interesting junctions.\n" "--output-text Write a plain text file with interesting junctions.\n" "--output-text-all Write a plain text file with all route points.\n" "--output-none Don't write any output files or read any translations.\n" " (If no output option is given then all are written.)\n" "--output-stdout Write to stdout instead of a file (requires exactly\n" " one output format option, implies '--quiet').\n" "\n" "--profile= Select the loaded profile with this name.\n" "--transport= Select the transport to use (selects the profile\n" " named after the transport if '--profile' is not used.)\n" "\n" "--shortest Find the shortest route between the waypoints.\n" "--quickest Find the quickest route between the waypoints.\n" "\n" "--lon= Specify the longitude of the n'th waypoint.\n" "--lat= Specify the latitude of the n'th waypoint.\n" "\n" "--reverse Find a route between the waypoints in reverse order.\n" "--loop Find a route that returns to the first waypoint.\n" "\n" "--heading= Initial compass bearing at lowest numbered waypoint.\n" "\n" " Routing preference options\n" "--highway-= * preference for highway type (%%).\n" "--speed-= * speed for highway type (km/h).\n" "--property-= * preference for proprty type (%%).\n" "--oneway=(0|1) * oneway restrictions are to be obeyed.\n" "--turns=(0|1) * turn restrictions are to be obeyed.\n" "--weight= * maximum weight limit (tonnes).\n" "--height= * maximum height limit (metres).\n" "--width= * maximum width limit (metres).\n" "--length= * maximum length limit (metres).\n" "\n" " defaults to motorcar but can be set to:\n" "%s" "\n" " can be selected from:\n" "%s" "\n" " can be selected from:\n" "%s", TransportList(),HighwayList(),PropertyList()); exit(!detail); } routino-3.4.3/src/translations.h 644 233 144 4646 12601525105 12060 0/*************************************** Load the translations from a file and the functions for handling them. Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef TRANSLATIONS_H #define TRANSLATIONS_H /*+ To stop multiple inclusions. +*/ #include "types.h" /* Type declarations */ typedef struct _Translation { char *lang; char *language; char *raw_copyright_creator[2]; char *raw_copyright_source[2]; char *raw_copyright_license[2]; char *xml_copyright_creator[2]; char *xml_copyright_source[2]; char *xml_copyright_license[2]; char *xml_heading[9]; char *xml_turn[9]; char *xml_ordinal[10]; char *notxml_heading[9]; char *notxml_turn[9]; char *notxml_ordinal[10]; char *raw_highway[Highway_Count]; char *xml_route_shortest; char *xml_route_quickest; char *html_waypoint; char *html_junction; char *html_roundabout; char *html_title; char *html_start; char *html_segment; char *html_node; char *html_rbnode; char *html_stop; char *html_total; char *html_subtotal; char *nothtml_waypoint; char *nothtml_junction; char *nothtml_roundabout; char *nothtml_title; char *nothtml_start; char *nothtml_segment; char *nothtml_node; char *nothtml_rbnode; char *nothtml_stop; char *nothtml_total; char *nothtml_subtotal; char *gpx_desc; char *gpx_name; char *gpx_step; char *gpx_final; char *gpx_waypt; char *gpx_trip; } Translation; /* Functions in translations.c */ int ParseXMLTranslations(const char *filename,const char *lang,int all); char **GetTranslationLanguages(void); char **GetTranslationLanguageFullNames(void); Translation *GetTranslation(const char *lang); void FreeXMLTranslations(void); #endif /* TRANSLATIONS_H */ routino-3.4.3/src/cache.h 644 233 144 21730 12550223461 10416 0/*************************************** Functions to maintain an in-RAM cache of on-disk data for slim mode. Part of the Routino routing software. ******************/ /****************** This file Copyright 2013-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #if SLIM #ifndef CACHE_H #define CACHE_H /*+ To stop multiple inclusions. +*/ #include #include "types.h" /* Macros for constants */ #define CACHEWIDTH 8192 /*+ The width of the cache. +*/ #define CACHEDEPTH 16 /*+ The depth of the cache. +*/ /* Macro for structure forward declaration */ #define CACHE_STRUCTURE_FWD(type) typedef struct _##type##Cache type##Cache; /* Macro for structure declaration */ /*+ A macro to create a cache structure. +*/ #define CACHE_STRUCTURE(type) \ \ struct _##type##Cache \ { \ int first [CACHEWIDTH]; /*+ The first entry to fill +*/ \ \ type data [CACHEWIDTH][CACHEDEPTH]; /*+ The array of type##s. +*/ \ index_t indices[CACHEWIDTH][CACHEDEPTH]; /*+ The array of indexes. +*/ \ }; /* Macros for function prototypes */ #define CACHE_NEWCACHE_PROTO(type) static inline type##Cache *New##type##Cache(void); #define CACHE_DELETECACHE_PROTO(type) static inline void Delete##type##Cache(type##Cache *cache); #define CACHE_FETCHCACHE_PROTO(type) static inline type *FetchCached##type(type##Cache *cache,index_t index,int fd,offset_t offset); #define CACHE_REPLACECACHE_PROTO(type) static inline void ReplaceCached##type(type##Cache *cache,type *value,index_t index,int fd,offset_t offset); #define CACHE_INVALIDATECACHE_PROTO(type) static inline void Invalidate##type##Cache(type##Cache *cache); /* Macros for function definitions */ /*+ A macro to create a function that creates a new cache data structure. +*/ #define CACHE_NEWCACHE(type) \ \ static inline type##Cache *New##type##Cache(void) \ { \ type##Cache *cache; \ \ cache=(type##Cache*)malloc(sizeof(type##Cache)); \ \ Invalidate##type##Cache(cache); \ \ return(cache); \ } /*+ A macro to create a function that deletes a cache data structure. +*/ #define CACHE_DELETECACHE(type) \ \ static inline void Delete##type##Cache(type##Cache *cache) \ { \ free(cache); \ } /*+ A macro to create a function that fetches an item from a cache data structure or reads from file. +*/ #define CACHE_FETCHCACHE(type) \ \ static inline type *FetchCached##type(type##Cache *cache,index_t index,int fd,offset_t offset) \ { \ int row=index%CACHEWIDTH; \ int col; \ \ for(col=0;colindices[row][col]==index) \ return(&cache->data[row][col]); \ \ col=cache->first[row]; \ \ cache->first[row]=(cache->first[row]+1)%CACHEDEPTH; \ \ SlimFetch(fd,&cache->data[row][col],sizeof(type),offset+(offset_t)index*sizeof(type)); \ \ cache->indices[row][col]=index; \ \ return(&cache->data[row][col]); \ } /*+ A macro to create a function that replaces an item in a cache data structure and writes to file. +*/ #define CACHE_REPLACECACHE(type) \ \ static inline void ReplaceCached##type(type##Cache *cache,type *value,index_t index,int fd,offset_t offset) \ { \ int row=index%CACHEWIDTH; \ int col; \ \ for(col=0;colindices[row][col]==index) \ break; \ \ if(col==CACHEDEPTH) \ { \ col=cache->first[row]; \ \ cache->first[row]=(cache->first[row]+1)%CACHEDEPTH; \ } \ \ cache->indices[row][col]=index; \ \ cache->data[row][col]=*value; \ \ SlimReplace(fd,&cache->data[row][col],sizeof(type),offset+(offset_t)index*sizeof(type)); \ } /*+ A macro to create a function that invalidates the contents of a cache data structure. +*/ #define CACHE_INVALIDATECACHE(type) \ \ static inline void Invalidate##type##Cache(type##Cache *cache) \ { \ int row,col; \ \ for(row=0;rowfirst[row]=0; \ \ for(col=0;colindices[row][col]=NO_NODE; \ } \ } /*+ Cache data structure forward declarations (for planetsplitter). +*/ CACHE_STRUCTURE_FWD(NodeX) CACHE_STRUCTURE_FWD(SegmentX) CACHE_STRUCTURE_FWD(WayX) /*+ Cache data structure forward declarations (for router). +*/ CACHE_STRUCTURE_FWD(Node) CACHE_STRUCTURE_FWD(Segment) CACHE_STRUCTURE_FWD(Way) CACHE_STRUCTURE_FWD(TurnRelation) #endif /* CACHE_H */ #endif /* SLIM */ routino-3.4.3/src/Makefile 644 233 144 21157 13713767735 10670 0# Source code Makefile # # Part of the Routino routing software. # # This file Copyright 2008-2015, 2017, 2018, 2020 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../Makefile.conf # Sub-directories and sub-makefiles SUBDIRS=xml test # Compilation targets DEPDIR=.deps C=$(wildcard *.c) D=$(wildcard $(DEPDIR)/*.d) EXE=planetsplitter$(.EXE) planetsplitter-slim$(.EXE) router$(.EXE) router-slim$(.EXE) \ filedumperx$(.EXE) filedumper$(.EXE) filedumper-slim$(.EXE) \ router+lib$(.EXE) router+lib-slim$(.EXE) ifneq ($(HOST),MINGW) LIB =libroutino.so libroutino-slim.so LIB+=libroutino.so.$(SOVERSION) libroutino-slim.so.$(SOVERSION) LIB+=libroutino.so.$(LIBVERSION) libroutino-slim.so.$(LIBVERSION) else LIB =routino.dll routino-slim.dll LIB+=routino.def routino-slim.def LIB+=routino.lib routino-slim.lib endif INC=routino.h ifneq ($(HOST),MINGW) LINK_LIB=libroutino.so LINK_SLIM_LIB=libroutino-slim.so else LINK_LIB=routino.dll LINK_SLIM_LIB=routino-slim.dll endif ######## all: all-local for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done all-local: all-exe all-lib all-exe : $(EXE) all-lib : $(LIB) ######## PLANETSPLITTER_OBJ=planetsplitter.o \ nodesx.o segmentsx.o waysx.o relationsx.o superx.o prunex.o \ ways.o types.o \ files.o logging.o logerror.o errorlogx.o \ results.o queue.o sorting.o \ xmlparse.o tagging.o \ uncompress.o osmxmlparse.o osmpbfparse.o osmo5mparse.o osmparser.o ifeq ($(HOST),MINGW) PLANETSPLITTER_OBJ+=mman-win32.o endif planetsplitter$(.EXE) : $(PLANETSPLITTER_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## PLANETSPLITTER_SLIM_OBJ=planetsplitter-slim.o \ nodesx-slim.o segmentsx-slim.o waysx-slim.o relationsx-slim.o superx-slim.o prunex-slim.o \ ways.o types.o \ files.o logging.o logerror-slim.o errorlogx-slim.o \ results.o queue.o sorting.o \ xmlparse.o tagging.o \ uncompress.o osmxmlparse.o osmpbfparse.o osmo5mparse.o osmparser.o ifeq ($(HOST),MINGW) PLANETSPLITTER_SLIM_OBJ+=mman-win32.o endif planetsplitter-slim$(.EXE) : $(PLANETSPLITTER_SLIM_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## ROUTER_OBJ=router.o \ nodes.o segments.o ways.o relations.o types.o fakes.o \ optimiser.o output.o \ files.o logging.o profiles.o xmlparse.o \ results.o queue.o translations.o ifeq ($(HOST),MINGW) ROUTER_OBJ+=mman-win32.o endif router$(.EXE) : $(ROUTER_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## ROUTER_SLIM_OBJ=router-slim.o \ nodes-slim.o segments-slim.o ways-slim.o relations-slim.o types.o fakes-slim.o \ optimiser-slim.o output-slim.o \ files.o logging.o profiles.o xmlparse.o \ results.o queue.o translations.o ifeq ($(HOST),MINGW) ROUTER_SLIM_OBJ+=mman-win32.o endif router-slim$(.EXE) : $(ROUTER_SLIM_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## FILEDUMPERX_OBJ=filedumperx.o \ files.o logging.o types.o ifeq ($(HOST),MINGW) FILEDUMPERX_OBJ+=mman-win32.o endif filedumperx$(.EXE) : $(FILEDUMPERX_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## FILEDUMPER_OBJ=filedumper.o \ nodes.o segments.o ways.o relations.o types.o fakes.o errorlog.o \ visualiser.o \ files.o logging.o xmlparse.o ifeq ($(HOST),MINGW) FILEDUMPER_OBJ+=mman-win32.o endif filedumper$(.EXE) : $(FILEDUMPER_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## FILEDUMPER_SLIM_OBJ=filedumper-slim.o \ nodes-slim.o segments-slim.o ways-slim.o relations-slim.o types.o fakes-slim.o errorlog-slim.o \ visualiser-slim.o \ files.o logging.o xmlparse.o ifeq ($(HOST),MINGW) FILEDUMPER_SLIM_OBJ+=mman-win32.o endif filedumper-slim$(.EXE) : $(FILEDUMPER_SLIM_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## %.o : %.c -@[ -d $(DEPDIR) ] || mkdir $(DEPDIR) || true $(CC) -c $(CFLAGS) -DSLIM=0 -DROUTINO_DATADIR=\"$(datadir)\" $< -o $@ -MMD -MP -MF $(addprefix $(DEPDIR)/,$(addsuffix .d,$(basename $@))) %-slim.o : %.c -@[ -d $(DEPDIR) ] || mkdir $(DEPDIR) || true $(CC) -c $(CFLAGS) -DSLIM=1 -DROUTINO_DATADIR=\"$(datadir)\" $< -o $@ -MMD -MP -MF $(addprefix $(DEPDIR)/,$(addsuffix .d,$(basename $@))) ######## ROUTER_LIB_OBJ=router+lib.o router+lib$(.EXE) : $(ROUTER_LIB_OBJ) $(LINK_LIB) $(LD) $^ -o $@ $(LDFLAGS) $(LDFLAGS_LDSO) router+lib-slim$(.EXE) : $(ROUTER_LIB_OBJ) $(LINK_SLIM_LIB) $(LD) $^ -o $@ $(LDFLAGS) $(LDFLAGS_LDSO) ######## LIBROUTINO_OBJ=routino-lib.o \ nodes-lib.o segments-lib.o ways-lib.o relations-lib.o types-lib.o fakes-lib.o \ optimiser-lib.o output-lib.o \ files-lib.o profiles-lib.o xmlparse-lib.o \ results-lib.o queue-lib.o translations-lib.o ifeq ($(HOST),MINGW) LIBROUTINO_OBJ+=mman-win32.o endif libroutino.so.$(LIBVERSION) : $(LIBROUTINO_OBJ) $(LD) $^ -o $@ $(LDFLAGS) $(LDFLAGS_LIB) $(LDFLAGS_SONAME) libroutino.so.$(SOVERSION) : libroutino.so.$(LIBVERSION) ln -sf $< $@ libroutino.so : libroutino.so.$(LIBVERSION) ln -sf $< $@ routino.dll : $(LIBROUTINO_OBJ) $(LD) $^ -o $@ $(LDFLAGS) $(LDFLAGS_LIB) routino.def : routino-lib.o dlltool -v --output-def $@ $< routino.lib : routino.dll routino.def dlltool -v --dllname routino.dll --def routino.def --output-lib $@ ######## LIBROUTINO_SLIM_OBJ=routino-slim-lib.o \ nodes-slim-lib.o segments-slim-lib.o ways-slim-lib.o relations-slim-lib.o types-lib.o fakes-slim-lib.o \ optimiser-slim-lib.o output-slim-lib.o \ files-lib.o profiles-lib.o xmlparse-lib.o \ results-lib.o queue-lib.o translations-lib.o ifeq ($(HOST),MINGW) LIBROUTINO_SLIM_OBJ+=mman-win32.o endif libroutino-slim.so.$(LIBVERSION) : $(LIBROUTINO_SLIM_OBJ) $(LD) $^ -o $@ $(LDFLAGS) $(LDFLAGS_LIB) $(LDFLAGS_SLIM_SONAME) libroutino-slim.so.$(SOVERSION) : libroutino-slim.so.$(LIBVERSION) ln -sf $< $@ libroutino-slim.so : libroutino-slim.so.$(LIBVERSION) ln -sf $< $@ routino-slim.dll : $(LIBROUTINO_SLIM_OBJ) $(LD) $^ -o $@ $(LDFLAGS) $(LDFLAGS_LIB) routino-slim.def : routino-slim-lib.o dlltool -v --output-def $@ $< routino-slim.lib : routino-slim.dll routino-slim.def dlltool -v --dllname routino-slim.dll --def routino-slim.def --output-lib $@ ######## %-lib.o : %.c -@[ -d $(DEPDIR) ] || mkdir $(DEPDIR) || true $(CC) -c $(CFLAGS) $(CFLAGS_LIB) -DSLIM=0 -DLIBROUTINO $< -o $@ -MMD -MP -MF $(addprefix $(DEPDIR)/,$(addsuffix .d,$(basename $@))) %-slim-lib.o : %.c -@[ -d $(DEPDIR) ] || mkdir $(DEPDIR) || true $(CC) -c $(CFLAGS) $(CFLAGS_LIB) -DSLIM=1 -DLIBROUTINO $< -o $@ -MMD -MP -MF $(addprefix $(DEPDIR)/,$(addsuffix .d,$(basename $@))) ######## test: test-local for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done test-local: ######## install: install-local for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done install-local: all-local @[ -d $(DESTDIR)$(bindir) ] || mkdir -p $(DESTDIR)$(bindir) @for file in $(EXE); do \ if [ -f $$file ]; then \ echo cp $$file $(DESTDIR)$(bindir) ;\ cp -f $$file $(DESTDIR)$(bindir) ;\ fi ;\ done @[ -d $(DESTDIR)$(incdir) ] || mkdir -p $(DESTDIR)$(incdir) @for file in $(INC); do \ if [ -f $$file ]; then \ echo cp $$file $(DESTDIR)$(incdir) ;\ cp -f $$file $(DESTDIR)$(incdir) ;\ fi ;\ done @[ -d $(DESTDIR)$(libdir) ] || mkdir -p $(DESTDIR)$(libdir) @for file in $(LIB); do \ if [ -f $$file ]; then \ echo cp $$file $(DESTDIR)$(libdir) ;\ cp -df $$file $(DESTDIR)$(libdir) ;\ fi ;\ done ######## clean: clean-local for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done clean-local: rm -f *~ rm -f *.o rm -f $(EXE) rm -f $(LIB) rm -f $(D) rm -fr $(DEPDIR) rm -f core rm -f *.gcda *.gcno *.gcov gmon.out ######## distclean: distclean-local for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done distclean-local: clean-local ######## include $(D) ######## .PHONY:: all test install clean distclean .PHONY:: all-local test-local install-local clean-local distclean-local routino-3.4.3/src/routino.h 644 233 144 33717 12663650335 11073 0/*************************************** Routino library header file. Part of the Routino routing software. ******************/ /****************** This file Copyright 2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef ROUTINO_H #define ROUTINO_H /*+ To stop multiple inclusions. +*/ /* Limit the exported symbols in the library */ #if defined(_MSC_VER) #ifdef LIBROUTINO #define DLL_PUBLIC __declspec(dllexport) #else #define DLL_PUBLIC __declspec(dllimport) #endif #endif #if defined(__GNUC__) && __GNUC__ >= 4 #if defined(__MINGW32__) || defined(__CYGWIN__) #ifdef LIBROUTINO #define DLL_PUBLIC __attribute__ ((dllexport)) #else #define DLL_PUBLIC __attribute__ ((dllimport)) #endif #else #ifdef LIBROUTINO #define DLL_PUBLIC __attribute__ ((visibility ("default"))) #endif #endif #endif #ifndef DLL_PUBLIC #define DLL_PUBLIC #endif /* Handle compilation with a C++ compiler */ #ifdef __cplusplus extern "C" { #endif /* Routino library API version */ #define ROUTINO_API_VERSION 8 /*+ A version number for the Routino API. +*/ /* Routino error constants */ #define ROUTINO_ERROR_NONE 0 /*+ No error. +*/ #define ROUTINO_ERROR_NO_DATABASE 1 /*+ A function was called without the database variable set. +*/ #define ROUTINO_ERROR_NO_PROFILE 2 /*+ A function was called without the profile variable set. +*/ #define ROUTINO_ERROR_NO_TRANSLATION 3 /*+ A function was called without the translation variable set. +*/ #define ROUTINO_ERROR_NO_DATABASE_FILES 11 /*+ The specified database to load did not exist. +*/ #define ROUTINO_ERROR_BAD_DATABASE_FILES 12 /*+ The specified database could not be loaded. +*/ #define ROUTINO_ERROR_NO_PROFILES_XML 13 /*+ The specified profiles XML file did not exist. +*/ #define ROUTINO_ERROR_BAD_PROFILES_XML 14 /*+ The specified profiles XML file could not be loaded. +*/ #define ROUTINO_ERROR_NO_TRANSLATIONS_XML 15 /*+ The specified translations XML file did not exist. +*/ #define ROUTINO_ERROR_BAD_TRANSLATIONS_XML 16 /*+ The specified translations XML file could not be loaded. +*/ #define ROUTINO_ERROR_NO_SUCH_PROFILE 21 /*+ The requested profile name does not exist in the loaded XML file. +*/ #define ROUTINO_ERROR_NO_SUCH_TRANSLATION 22 /*+ The requested translation language does not exist in the loaded XML file. +*/ #define ROUTINO_ERROR_NO_NEARBY_HIGHWAY 31 /*+ There is no highway near the coordinates to place a waypoint. +*/ #define ROUTINO_ERROR_PROFILE_DATABASE_ERR 41 /*+ The profile and database do not work together. +*/ #define ROUTINO_ERROR_NOTVALID_PROFILE 42 /*+ The profile being used has not been validated. +*/ #define ROUTINO_ERROR_BAD_USER_PROFILE 43 /*+ The user specified profile contained invalid data. +*/ #define ROUTINO_ERROR_BAD_OPTIONS 51 /*+ The routing options specified are not consistent with each other. +*/ #define ROUTINO_ERROR_WRONG_API_VERSION 61 /*+ There is a mismatch between the library and caller API version. +*/ #define ROUTINO_ERROR_PROGRESS_ABORTED 71 /*+ The progress function returned false. +*/ #define ROUTINO_ERROR_NO_ROUTE_1 1001 /*+ A route could not be found to waypoint 1. +*/ #define ROUTINO_ERROR_NO_ROUTE_2 1002 /*+ A route could not be found to waypoint 2. +*/ #define ROUTINO_ERROR_NO_ROUTE_3 1003 /*+ A route could not be found to waypoint 3. +*/ /* Higher values of the error number refer to later waypoints. */ /* Routino routing option constants */ #define ROUTINO_ROUTE_SHORTEST 0 /*+ Calculate the shortest route. +*/ #define ROUTINO_ROUTE_QUICKEST 1 /*+ Calculate the quickest route. +*/ #define ROUTINO_ROUTE_FILE_HTML 2 /*+ Output an HTML route file. +*/ #define ROUTINO_ROUTE_FILE_GPX_TRACK 4 /*+ Output a GPX track file. +*/ #define ROUTINO_ROUTE_FILE_GPX_ROUTE 8 /*+ Output a GPX route file. +*/ #define ROUTINO_ROUTE_FILE_TEXT 16 /*+ Output a text file with important junctions. +*/ #define ROUTINO_ROUTE_FILE_TEXT_ALL 32 /*+ Output a text file with all nodes and segments. +*/ #define ROUTINO_ROUTE_FILE_STDOUT 64 /*+ Output a single file type to stdout. +*/ #define ROUTINO_ROUTE_LIST_HTML 128 /*+ Output a linked list of points containing the HTML file information but as plain text. +*/ #define ROUTINO_ROUTE_LIST_HTML_ALL 256 /*+ Output a linked list of points containing the HTML file information as plain text and with all points. +*/ #define ROUTINO_ROUTE_LIST_TEXT 512 /*+ Output a linked list of points containing the text file information. +*/ #define ROUTINO_ROUTE_LIST_TEXT_ALL 1024 /*+ Output a linked list of points containing the text all file information. +*/ #define ROUTINO_ROUTE_LOOP 2048 /*+ Route between the points in a loop returning to the first point. +*/ #define ROUTINO_ROUTE_REVERSE 4096 /*+ Route between the points in reverse order. +*/ /* Routino output point types */ #define ROUTINO_POINT_UNIMPORTANT 0 /*+ An unimportant, intermediate, node. +*/ #define ROUTINO_POINT_RB_NOT_EXIT 1 /*+ A roundabout exit that is not taken. +*/ #define ROUTINO_POINT_JUNCT_CONT 2 /*+ An un-interesting junction where the route continues without comment. +*/ #define ROUTINO_POINT_CHANGE 3 /*+ The highway changes type but nothing else happens. +*/ #define ROUTINO_POINT_JUNCT_IMPORT 4 /*+ An interesting junction to be described. +*/ #define ROUTINO_POINT_RB_ENTRY 5 /*+ The entrance to a roundabout. +*/ #define ROUTINO_POINT_RB_EXIT 6 /*+ The exit from a roundabout. +*/ #define ROUTINO_POINT_MINI_RB 7 /*+ The location of a mini-roundabout. +*/ #define ROUTINO_POINT_UTURN 8 /*+ The location of a U-turn. +*/ #define ROUTINO_POINT_WAYPOINT 9 /*+ A waypoint. +*/ /* Routino user profile array indexes */ #define ROUTINO_HIGHWAY_MOTORWAY 1 /*+ A Motorway highway. +*/ #define ROUTINO_HIGHWAY_TRUNK 2 /*+ A Trunk highway. +*/ #define ROUTINO_HIGHWAY_PRIMARY 3 /*+ A Primary highway. +*/ #define ROUTINO_HIGHWAY_SECONDARY 4 /*+ A Secondary highway. +*/ #define ROUTINO_HIGHWAY_TERTIARY 5 /*+ A Tertiary highway. +*/ #define ROUTINO_HIGHWAY_UNCLASSIFIED 6 /*+ A Unclassified highway. +*/ #define ROUTINO_HIGHWAY_RESIDENTIAL 7 /*+ A Residential highway. +*/ #define ROUTINO_HIGHWAY_SERVICE 8 /*+ A Service highway. +*/ #define ROUTINO_HIGHWAY_TRACK 9 /*+ A Track highway. +*/ #define ROUTINO_HIGHWAY_CYCLEWAY 10 /*+ A Cycleway highway. +*/ #define ROUTINO_HIGHWAY_PATH 11 /*+ A Path highway. +*/ #define ROUTINO_HIGHWAY_STEPS 12 /*+ A Steps highway. +*/ #define ROUTINO_HIGHWAY_FERRY 13 /*+ A Ferry highway. +*/ #define ROUTINO_PROPERTY_PAVED 1 /*+ A Paved highway. +*/ #define ROUTINO_PROPERTY_MULTILANE 2 /*+ A Multilane highway. +*/ #define ROUTINO_PROPERTY_BRIDGE 3 /*+ A Bridge highway. +*/ #define ROUTINO_PROPERTY_TUNNEL 4 /*+ A Tunnel highway. +*/ #define ROUTINO_PROPERTY_FOOTROUTE 5 /*+ A Footroute highway. +*/ #define ROUTINO_PROPERTY_BICYCLEROUTE 6 /*+ A Bicycleroute highway. +*/ /* Routino types */ /*+ A data structure to hold a Routino database loaded from a file (the contents are private). +*/ typedef struct _Routino_Database Routino_Database; /*+ A data structure to hold a Routino waypoint found within the database (the contents are private). +*/ typedef struct _Routino_Waypoint Routino_Waypoint; /*+ A data structure to hold a Routino routing profile (the contents are private). +*/ #ifdef LIBROUTINO typedef struct _Profile Routino_Profile; #else typedef struct _Routino_Profile Routino_Profile; #endif /*+ A data structure to hold a Routino translation (the contents are private). +*/ #ifdef LIBROUTINO typedef struct _Translation Routino_Translation; #else typedef struct _Routino_Translation Routino_Translation; #endif /*+ A data structure to hold a routing profile that can be defined by the user. +*/ typedef struct _Routino_UserProfile { int transport; /*+ The type of transport. +*/ float highway[14]; /*+ A floating point preference for travel on the highway (range 0 to 1). +*/ float speed[14]; /*+ The maximum speed on each type of highway (km/hour). +*/ float props[7]; /*+ A floating point preference for ways with this attribute (range 0 to 1). +*/ int oneway; /*+ A flag to indicate if one-way restrictions apply. +*/ int turns; /*+ A flag to indicate if turn restrictions apply. +*/ float weight; /*+ The weight of the vehicle (in tonnes). +*/ float height; /*+ The height of the vehicle (in metres). +*/ float width; /*+ The width of vehicle (in metres). +*/ float length; /*+ The length of vehicle (in metres). +*/ } Routino_UserProfile; /*+ Forward declaration of the Routino_Output data type. +*/ typedef struct _Routino_Output Routino_Output; /*+ A linked list output of the calculated route whose contents depend on the ROUTINO_ROUTE_LIST_* options selected. +*/ struct _Routino_Output { Routino_Output *next; /*+ A pointer to the next route section. +*/ float lon; /*+ The longitude of the point (radians). +*/ float lat; /*+ The latitude of the point (radians). +*/ float dist; /*+ The total distance travelled (kilometres) up to the point. +*/ float time; /*+ The total journey time (seconds) up to the point. +*/ float speed; /*+ The speed (km/hr) for this section of the route (ROUTINO_ROUTE_LIST_TEXT_ALL format only). +*/ int type; /*+ The type of point (one of the ROUTINO_POINT_* values). +*/ int turn; /*+ The amount to turn (degrees) for the next section of the route (ROUTINO_ROUTE_LIST_TEXT or ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML_ALL format). +*/ int bearing; /*+ The compass direction (degrees) for the next section of the route. +*/ char *name; /*+ The name of the next section of the route (ROUTINO_ROUTE_LIST_TEXT or ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML_ALL format) or previous section of the route (ROUTINO_ROUTE_LIST_TEXT_ALL format). +*/ char *desc1; /*+ The first part of the description of the next section of route (ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML format). +*/ char *desc2; /*+ The second part of the description of the next section of route (ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML format). +*/ char *desc3; /*+ The third part of the description, the total distance and time at the end of the next section of route (ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML format). +*/ }; /*+ A type of function that can be used as a callback to indicate routing progress, if it returns false the router stops. +*/ typedef int (*Routino_ProgressFunc)(double complete); /* Routino error number variable */ /*+ Contains the libroutino API version number. +*/ DLL_PUBLIC extern const int Routino_APIVersion; /*+ Contains the Routino version number. +*/ DLL_PUBLIC extern const char *Routino_Version; /*+ Contains the error number of the most recent Routino function (one of the ROUTINO_ERROR_* values). +*/ DLL_PUBLIC extern int Routino_errno; /* Routino library functions */ #define Routino_CheckAPIVersion() Routino_Check_API_Version(ROUTINO_API_VERSION) /*+ A wrapper function to simplify the API version check. +*/ DLL_PUBLIC int Routino_Check_API_Version(int caller_version); DLL_PUBLIC Routino_Database *Routino_LoadDatabase(const char *dirname,const char *prefix); DLL_PUBLIC void Routino_UnloadDatabase(Routino_Database *database); DLL_PUBLIC int Routino_ParseXMLProfiles(const char *filename); DLL_PUBLIC char **Routino_GetProfileNames(void); DLL_PUBLIC Routino_Profile *Routino_GetProfile(const char *name); DLL_PUBLIC void Routino_FreeXMLProfiles(void); DLL_PUBLIC int Routino_ParseXMLTranslations(const char *filename); DLL_PUBLIC char **Routino_GetTranslationLanguages(void); DLL_PUBLIC char **Routino_GetTranslationLanguageFullNames(void); DLL_PUBLIC Routino_Translation *Routino_GetTranslation(const char *language); DLL_PUBLIC void Routino_FreeXMLTranslations(void); DLL_PUBLIC Routino_Profile *Routino_CreateProfileFromUserProfile(Routino_UserProfile *profile); DLL_PUBLIC Routino_UserProfile *Routino_CreateUserProfileFromProfile(Routino_Profile *profile); DLL_PUBLIC int Routino_ValidateProfile(Routino_Database *database,Routino_Profile *profile); DLL_PUBLIC Routino_Waypoint *Routino_FindWaypoint(Routino_Database *database,Routino_Profile *profile,double latitude,double longitude); DLL_PUBLIC Routino_Output *Routino_CalculateRoute(Routino_Database *database,Routino_Profile *profile,Routino_Translation *translation, Routino_Waypoint **waypoints,int nwaypoints,int options,Routino_ProgressFunc progress); DLL_PUBLIC void Routino_DeleteRoute(Routino_Output *output); /* Handle compilation with a C++ compiler */ #ifdef __cplusplus } #endif #endif /* ROUTINO_H */ routino-3.4.3/src/nodesx.c 644 233 144 53354 14774476204 10674 0/*************************************** Extented Node data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019, 2020, 2022, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include "types.h" #include "nodes.h" #include "typesx.h" #include "nodesx.h" #include "segmentsx.h" #include "waysx.h" #include "files.h" #include "logging.h" #include "sorting.h" /* Global variables */ /*+ The command line '--tmpdir' option or its default value. +*/ extern char *option_tmpdirname; /* Local variables */ /*+ Temporary file-local variables for use by the sort functions (re-initialised for each sort). +*/ static NodesX *sortnodesx; static latlong_t lat_min,lat_max,lon_min,lon_max; /* Local functions */ static int sort_by_id(NodeX *a,NodeX *b); static int deduplicate_and_index_by_id(NodeX *nodex,index_t index); static int update_id(NodeX *nodex,index_t index); static int sort_by_lat_long(NodeX *a,NodeX *b); static int index_by_lat_long(NodeX *nodex,index_t index); /*++++++++++++++++++++++++++++++++++++++ Allocate a new node list (create a new file or open an existing one). NodesX *NewNodeList Returns a pointer to the node list. int append Set to 1 if the file is to be opened for appending. int readonly Set to 1 if the file is to be opened for reading. ++++++++++++++++++++++++++++++++++++++*/ NodesX *NewNodeList(int append,int readonly) { NodesX *nodesx; logassert(sizeof(node_t)>=sizeof(index_t),"Size of node_t type must be at least as large as size of index_t type."); nodesx=(NodesX*)calloc_logassert(1,sizeof(NodesX)); nodesx->filename =(char*)malloc_logassert(strlen(option_tmpdirname)+32); nodesx->filename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+40); /* allow %p to be up to 20 bytes */ sprintf(nodesx->filename ,"%s/nodesx.parsed.mem",option_tmpdirname); sprintf(nodesx->filename_tmp,"%s/nodesx.%p.tmp" ,option_tmpdirname,(void*)nodesx); if(append || readonly) if(ExistsFile(nodesx->filename)) { offset_t size; size=SizeFile(nodesx->filename); nodesx->number=size/sizeof(NodeX); RenameFile(nodesx->filename,nodesx->filename_tmp); } if(append) nodesx->fd=OpenFileBufferedAppend(nodesx->filename_tmp); else if(!readonly) nodesx->fd=OpenFileBufferedNew(nodesx->filename_tmp); else nodesx->fd=-1; #if SLIM nodesx->cache=NewNodeXCache(); log_malloc(nodesx->cache,sizeof(*nodesx->cache)); #endif nodesx->ifilename_tmp=(char*)malloc_logassert(strlen(option_tmpdirname)+40); /* allow %p to be up to 20 bytes */ sprintf(nodesx->ifilename_tmp,"%s/nodesx.%p.idx.tmp",option_tmpdirname,(void*)nodesx); return(nodesx); } /*++++++++++++++++++++++++++++++++++++++ Free a node list. NodesX *nodesx The set of nodes to be freed. int keep If set then the results file is to be kept. ++++++++++++++++++++++++++++++++++++++*/ void FreeNodeList(NodesX *nodesx,int keep) { if(keep) RenameFile(nodesx->filename_tmp,nodesx->filename); else DeleteFile(nodesx->filename_tmp); free(nodesx->filename); free(nodesx->filename_tmp); DeleteFile(nodesx->ifilename_tmp); free(nodesx->ifilename_tmp); if(nodesx->gdata) { log_free(nodesx->gdata); free(nodesx->gdata); } if(nodesx->pdata) { log_free(nodesx->pdata); free(nodesx->pdata); } if(nodesx->super) { log_free(nodesx->super); free(nodesx->super); } #if SLIM log_free(nodesx->cache); DeleteNodeXCache(nodesx->cache); #endif free(nodesx); } /*++++++++++++++++++++++++++++++++++++++ Append a single node to an unsorted node list. NodesX *nodesx The set of nodes to modify. node_t id The node identifier from the original OSM data. double latitude The latitude of the node. double longitude The longitude of the node. transports_t allow The allowed traffic types through the node. nodeflags_t flags The flags to set for this node. ++++++++++++++++++++++++++++++++++++++*/ void AppendNodeList(NodesX *nodesx,node_t id,double latitude,double longitude,transports_t allow,nodeflags_t flags) { NodeX nodex={0}; nodex.id=id; nodex.latitude =radians_to_latlong(latitude); nodex.longitude=radians_to_latlong(longitude); nodex.allow=allow; nodex.flags=flags; WriteFileBuffered(nodesx->fd,&nodex,sizeof(NodeX)); nodesx->number++; logassert(nodesx->numberfd!=-1) nodesx->fd=CloseFileBuffered(nodesx->fd); } /*++++++++++++++++++++++++++++++++++++++ Find a particular node index. index_t IndexNodeX Returns the index of the extended node with the specified id. NodesX *nodesx The set of nodes to use. node_t id The node id to look for. ++++++++++++++++++++++++++++++++++++++*/ index_t IndexNodeX(NodesX *nodesx,node_t id) { index_t start=0; index_t end=nodesx->number-1; index_t mid; if(nodesx->number==0) /* No nodes */ return(NO_NODE); /* Binary search - search key exact match only is required. * * # <- start | Check mid and exit if it matches else move start or end. * # | * # | Since an exact match is wanted we can set end=mid-1 * # <- mid | or start=mid+1 if we find that mid doesn't match. * # | * # | Eventually either end=start or end=start+1 and one of * # <- end | start or end is the wanted one or neither is. */ while((end-start)>1) { mid=start+(end-start)/2; /* Choose mid point (avoid overflow) */ if(nodesx->idata[mid]idata[mid]>id) /* Mid point is too high */ end=mid-1; else /* Mid point is correct */ return(mid); } if(nodesx->idata[start]==id) /* Start is correct */ return(start); if(nodesx->idata[end]==id) /* End is correct */ return(end); return(NO_NODE); } /*++++++++++++++++++++++++++++++++++++++ Sort the node list. NodesX *nodesx The set of nodes to modify. ++++++++++++++++++++++++++++++++++++++*/ void SortNodeList(NodesX *nodesx) { int fd; index_t xnumber; /* Print the start message */ printf_first("Sorting Nodes"); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(nodesx->filename_tmp,&nodesx->fd); /* Open a file for the index */ nodesx->ifd=OpenFileBufferedNew(nodesx->ifilename_tmp); /* Sort the nodes by ID and index them */ xnumber=nodesx->number; sortnodesx=nodesx; nodesx->number=filesort_fixed(nodesx->fd,fd,sizeof(NodeX),NULL, (int (*)(const void*,const void*))sort_by_id, (int (*)(void*,index_t))deduplicate_and_index_by_id); nodesx->knumber=nodesx->number; /* Close the files */ nodesx->fd=CloseFileBuffered(nodesx->fd); CloseFileBuffered(fd); nodesx->ifd=CloseFileBuffered(nodesx->ifd); /* Print the final message */ printf_last("Sorted Nodes: Nodes=%"Pindex_t" Duplicates=%"Pindex_t,xnumber,xnumber-nodesx->number); } /*++++++++++++++++++++++++++++++++++++++ Sort the nodes into id order. int sort_by_id Returns the comparison of the id fields. NodeX *a The first extended node. NodeX *b The second extended node. ++++++++++++++++++++++++++++++++++++++*/ static int sort_by_id(NodeX *a,NodeX *b) { node_t a_id=a->id; node_t b_id=b->id; if(a_idb_id) return(1); else return(-FILESORT_PRESERVE_ORDER(a,b)); /* latest version first */ } /*++++++++++++++++++++++++++++++++++++++ Create the index of identifiers and discard duplicate nodes. int deduplicate_and_index_by_id Return 1 if the value is to be kept, otherwise 0. NodeX *nodex The extended node. index_t index The number of sorted nodes that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int deduplicate_and_index_by_id(NodeX *nodex,index_t index) { static node_t previd; /* internal variable (reset by first call in each sort; index==0) */ if(index==0 || nodex->id!=previd) { previd=nodex->id; if(nodex->flags&NODE_DELETED) return(0); else { WriteFileBuffered(sortnodesx->ifd,&nodex->id,sizeof(node_t)); return(1); } } else return(0); } /*++++++++++++++++++++++++++++++++++++++ Remove any nodes that are not part of a highway. NodesX *nodesx The set of nodes to modify. WaysX *waysx The set of ways to use. int keep If set to 1 then keep the old data file otherwise delete it. ++++++++++++++++++++++++++++++++++++++*/ void RemoveNonHighwayNodes(NodesX *nodesx,WaysX *waysx,int keep) { BitMask *usednode; NodeX nodex; index_t i,total=0,highway=0,nothighway=0; node_t bitmasklength; int fd; /* Print the start message */ printf_first("Checking Ways for unused Nodes: Ways=0 Highway Nodes=0"); /* Re-open the file read-only */ waysx->fd=ReOpenFileBuffered(waysx->filename_tmp); /* Map the index into memory */ nodesx->idata=MapFile(nodesx->ifilename_tmp); /* Allocate the node usage bitmask */ #if SLIM bitmasklength=nodesx->number; /* The number of nodes in the database */ #else bitmasklength=nodesx->idata[nodesx->number-1]+1; /* One more than the highest OSM node number in the database */ #endif usednode=AllocBitMask(bitmasklength); log_malloc(usednode,SizeBitMask(bitmasklength)); /* Loop through the ways and mark the used nodes */ for(i=0;inumber;i++) { WayX wayx; FILESORT_VARINT waysize; node_t node; ReadFileBuffered(waysx->fd,&waysize,FILESORT_VARSIZE); ReadFileBuffered(waysx->fd,&wayx,sizeof(WayX)); while(!ReadFileBuffered(waysx->fd,&node,sizeof(node_t)) && node!=NO_NODE_ID) { #if SLIM index_t index=IndexNodeX(nodesx,node); /* Index bitmap by node number in the database */ #else node_t index=node; /* Index bitmap by OSM node number */ #endif waysize-=sizeof(node_t); #if SLIM if(index==NO_NODE) continue; #endif if(!IsBitSet(usednode,index)) highway++; SetBit(usednode,index); } waysize-=sizeof(node_t)+sizeof(WayX); SkipFileBuffered(waysx->fd,waysize); if(!((i+1)%1000)) printf_middle("Checking Ways for unused Nodes: Ways=%"Pindex_t" Highway Nodes=%"Pindex_t,i+1,highway); } /* Close the file */ waysx->fd=CloseFileBuffered(waysx->fd); /* Unmap the index from memory */ nodesx->idata=UnmapFile(nodesx->idata); /* Print the final message */ printf_last("Checked Ways for unused Nodes: Ways=%"Pindex_t" Highway Nodes=%"Pindex_t,waysx->number,highway); /* Print the start message */ printf_first("Removing unused Nodes: Nodes=0"); /* Open a file for the index */ nodesx->ifd=OpenFileBufferedNew(nodesx->ifilename_tmp); highway=0; /* Re-open the file read-only and a new file writeable */ if(keep) { RenameFile(nodesx->filename_tmp,nodesx->filename); nodesx->fd=ReOpenFileBuffered(nodesx->filename); fd=OpenFileBufferedNew(nodesx->filename_tmp); } else fd=ReplaceFileBuffered(nodesx->filename_tmp,&nodesx->fd); /* Modify the on-disk image */ while(!ReadFileBuffered(nodesx->fd,&nodex,sizeof(NodeX))) { #if SLIM index_t node=total; /* Index by node number in the database */ #else node_t node=nodex.id; /* Index by OSM node number */ #endif if(!IsBitSet(usednode,node)) nothighway++; else { WriteFileBuffered(fd,&nodex,sizeof(NodeX)); WriteFileBuffered(nodesx->ifd,&nodex.id,sizeof(node_t)); highway++; } total++; if(!(total%10000)) printf_middle("Removing unused Nodes: Nodes=%"Pindex_t" Highway=%"Pindex_t" not-Highway=%"Pindex_t,total,highway,nothighway); } nodesx->number=highway; /* Close the files */ nodesx->fd=CloseFileBuffered(nodesx->fd); CloseFileBuffered(fd); nodesx->ifd=CloseFileBuffered(nodesx->ifd); /* Free the now-unneeded index */ log_free(usednode); free(usednode); /* Print the final message */ printf_last("Removed unused Nodes: Nodes=%"Pindex_t" Highway=%"Pindex_t" not-Highway=%"Pindex_t,total,highway,nothighway); } /*++++++++++++++++++++++++++++++++++++++ Remove any nodes that have been pruned. NodesX *nodesx The set of nodes to prune. SegmentsX *segmentsx The set of segments to use. ++++++++++++++++++++++++++++++++++++++*/ void RemovePrunedNodes(NodesX *nodesx,SegmentsX *segmentsx) { NodeX nodex; index_t total=0,pruned=0,notpruned=0; int fd; if(nodesx->number==0) return; /* Print the start message */ printf_first("Deleting Pruned Nodes: Nodes=0 Pruned=0"); /* Allocate the array of indexes */ nodesx->pdata=(index_t*)malloc_logassert(nodesx->number*sizeof(index_t)); log_malloc(nodesx->pdata,nodesx->number*sizeof(index_t)); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(nodesx->filename_tmp,&nodesx->fd); /* Modify the on-disk image */ while(!ReadFileBuffered(nodesx->fd,&nodex,sizeof(NodeX))) { if(segmentsx->firstnode[total]==NO_SEGMENT) { pruned++; nodesx->pdata[total]=NO_NODE; } else { nodesx->pdata[total]=notpruned; WriteFileBuffered(fd,&nodex,sizeof(NodeX)); notpruned++; } total++; if(!(total%10000)) printf_middle("Deleting Pruned Nodes: Nodes=%"Pindex_t" Pruned=%"Pindex_t,total,pruned); } nodesx->number=notpruned; /* Close the files */ nodesx->fd=CloseFileBuffered(nodesx->fd); CloseFileBuffered(fd); /* Free the no-longer required memory */ if(segmentsx->firstnode) { log_free(segmentsx->firstnode); free(segmentsx->firstnode); segmentsx->firstnode=NULL; } /* Print the final message */ printf_last("Deleted Pruned Nodes: Nodes=%"Pindex_t" Pruned=%"Pindex_t,total,pruned); } /*++++++++++++++++++++++++++++++++++++++ Sort the node list geographically. NodesX *nodesx The set of nodes to modify. ++++++++++++++++++++++++++++++++++++++*/ void SortNodeListGeographically(NodesX *nodesx) { int fd; ll_bin_t lat_min_bin,lat_max_bin,lon_min_bin,lon_max_bin; if(nodesx->number==0) return; /* Print the start message */ printf_first("Sorting Nodes Geographically"); /* Work out the range of data */ lat_min=radians_to_latlong( 2); lat_max=radians_to_latlong(-2); lon_min=radians_to_latlong( 4); lon_max=radians_to_latlong(-4); /* Allocate the memory for the geographical index array */ nodesx->gdata=(index_t*)malloc_logassert(nodesx->number*sizeof(index_t)); log_malloc(nodesx->gdata,nodesx->number*sizeof(index_t)); /* Re-open the file read-only and a new file writeable */ fd=ReplaceFileBuffered(nodesx->filename_tmp,&nodesx->fd); /* Sort nodes geographically and index them */ sortnodesx=nodesx; filesort_fixed(nodesx->fd,fd,sizeof(NodeX),(int (*)(void*,index_t))update_id, (int (*)(const void*,const void*))sort_by_lat_long, (int (*)(void*,index_t))index_by_lat_long); /* Close the files */ nodesx->fd=CloseFileBuffered(nodesx->fd); CloseFileBuffered(fd); /* Work out the number of bins */ if(nodesx->super) { lat_min_bin=latlong_to_bin(lat_min); lon_min_bin=latlong_to_bin(lon_min); lat_max_bin=latlong_to_bin(lat_max); lon_max_bin=latlong_to_bin(lon_max); nodesx->latzero=lat_min_bin; nodesx->lonzero=lon_min_bin; nodesx->latbins=(lat_max_bin-lat_min_bin)+1; nodesx->lonbins=(lon_max_bin-lon_min_bin)+1; } /* Free the memory */ if(nodesx->super) { log_free(nodesx->super); free(nodesx->super); nodesx->super=NULL; } /* Print the final message */ printf_last("Sorted Nodes Geographically: Nodes=%"Pindex_t,nodesx->number); } /*++++++++++++++++++++++++++++++++++++++ Update the node ids. int update_id Return 1 if the value is to be kept, otherwise 0. NodeX *nodex The extended node. index_t index The number of unsorted nodes that have been read from the input file. ++++++++++++++++++++++++++++++++++++++*/ static int update_id(NodeX *nodex,index_t index) { nodex->id=index; if(sortnodesx->super && IsBitSet(sortnodesx->super,index)) nodex->flags|=NODE_SUPER; return(1); } /*++++++++++++++++++++++++++++++++++++++ Sort the nodes into latitude and longitude order (first by longitude bin number, then by latitude bin number and then by exact longitude and then by exact latitude). int sort_by_lat_long Returns the comparison of the latitude and longitude fields. NodeX *a The first extended node. NodeX *b The second extended node. ++++++++++++++++++++++++++++++++++++++*/ static int sort_by_lat_long(NodeX *a,NodeX *b) { ll_bin_t a_lon=latlong_to_bin(a->longitude); ll_bin_t b_lon=latlong_to_bin(b->longitude); if(a_lonb_lon) return(1); else { ll_bin_t a_lat=latlong_to_bin(a->latitude); ll_bin_t b_lat=latlong_to_bin(b->latitude); if(a_latb_lat) return(1); else { if(a->longitudelongitude) return(-1); else if(a->longitude>b->longitude) return(1); else { if(a->latitudelatitude) return(-1); else if(a->latitude>b->latitude) return(1); } return(FILESORT_PRESERVE_ORDER(a,b)); } } } /*++++++++++++++++++++++++++++++++++++++ Create the index between the sorted and unsorted nodes. int index_by_lat_long Return 1 if the value is to be kept, otherwise 0. NodeX *nodex The extended node. index_t index The number of sorted nodes that have already been written to the output file. ++++++++++++++++++++++++++++++++++++++*/ static int index_by_lat_long(NodeX *nodex,index_t index) { sortnodesx->gdata[nodex->id]=index; if(sortnodesx->super) { if(nodex->latitudelatitude; if(nodex->latitude>lat_max) lat_max=nodex->latitude; if(nodex->longitudelongitude; if(nodex->longitude>lon_max) lon_max=nodex->longitude; } return(1); } /*++++++++++++++++++++++++++++++++++++++ Save the final node list database to a file. NodesX *nodesx The set of nodes to save. const char *filename The name of the file to save. SegmentsX *segmentsx The set of segments to use. ++++++++++++++++++++++++++++++++++++++*/ void SaveNodeList(NodesX *nodesx,const char *filename,SegmentsX *segmentsx) { index_t i; int fd; NodesFile nodesfile={0}; index_t super_number=0; ll_bin2_t latlonbin=0,maxlatlonbins; index_t *offsets; /* Print the start message */ printf_first("Writing Nodes: Nodes=0"); /* Allocate the memory for the geographical offsets array */ offsets=(index_t*)malloc_logassert((nodesx->latbins*nodesx->lonbins+1)*sizeof(index_t)); latlonbin=0; /* Re-open the file */ nodesx->fd=ReOpenFileBuffered(nodesx->filename_tmp); /* Write out the nodes data */ fd=OpenFileBufferedNew(filename); SeekFileBuffered(fd,sizeof(NodesFile)+(nodesx->latbins*nodesx->lonbins+1)*sizeof(index_t)); for(i=0;inumber;i++) { NodeX nodex; Node node={0}; ll_bin_t latbin,lonbin; ll_bin2_t llbin; ReadFileBuffered(nodesx->fd,&nodex,sizeof(NodeX)); /* Create the Node */ node.latoffset=latlong_to_off(nodex.latitude); node.lonoffset=latlong_to_off(nodex.longitude); node.firstseg=segmentsx->firstnode[i]; node.allow=nodex.allow; node.flags=nodex.flags; if(node.flags&NODE_SUPER) super_number++; /* Work out the offsets */ latbin=latlong_to_bin(nodex.latitude )-nodesx->latzero; lonbin=latlong_to_bin(nodex.longitude)-nodesx->lonzero; llbin=lonbin*nodesx->latbins+latbin; for(;latlonbin<=llbin;latlonbin++) offsets[latlonbin]=i; /* Write the data */ WriteFileBuffered(fd,&node,sizeof(Node)); if(!((i+1)%10000)) printf_middle("Writing Nodes: Nodes=%"Pindex_t,i+1); } /* Close the file */ nodesx->fd=CloseFileBuffered(nodesx->fd); /* Finish off the offset indexing and write them out */ maxlatlonbins=nodesx->latbins*nodesx->lonbins; for(;latlonbin<=maxlatlonbins;latlonbin++) offsets[latlonbin]=nodesx->number; SeekFileBuffered(fd,sizeof(NodesFile)); WriteFileBuffered(fd,offsets,(nodesx->latbins*nodesx->lonbins+1)*sizeof(index_t)); free(offsets); /* Write out the header structure */ nodesfile.number=nodesx->number; nodesfile.snumber=super_number; nodesfile.latbins=nodesx->latbins; nodesfile.lonbins=nodesx->lonbins; nodesfile.latzero=nodesx->latzero; nodesfile.lonzero=nodesx->lonzero; SeekFileBuffered(fd,0); WriteFileBuffered(fd,&nodesfile,sizeof(NodesFile)); CloseFileBuffered(fd); /* Free the memory in the segments */ log_free(segmentsx->firstnode); free(segmentsx->firstnode); segmentsx->firstnode=NULL; /* Print the final message */ printf_last("Wrote Nodes: Nodes=%"Pindex_t,nodesx->number); } routino-3.4.3/src/queue.c 644 233 144 12775 13157512275 10513 0/*************************************** Queue data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2013, 2017 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include "results.h" #include "logging.h" /*+ A queue of results. +*/ struct _Queue { uint32_t nincrement; /*+ The amount to increment the queue when full. +*/ uint32_t nallocated; /*+ The number of entries allocated. +*/ uint32_t noccupied; /*+ The number of entries occupied. +*/ Result **results; /*+ The queue of pointers to results. +*/ }; /*++++++++++++++++++++++++++++++++++++++ Allocate a new queue. Queue *NewQueueList Returns the queue. uint8_t log2bins The base 2 logarithm of the initial number of bins in the queue. ++++++++++++++++++++++++++++++++++++++*/ Queue *NewQueueList(uint8_t log2bins) { Queue *queue; queue=(Queue*)malloc(sizeof(Queue)); queue->nincrement=1<nallocated=queue->nincrement; queue->noccupied=0; queue->results=(Result**)malloc(queue->nallocated*sizeof(Result*)); #ifndef LIBROUTINO log_malloc(queue->results,queue->nallocated*sizeof(Result*)); #endif return(queue); } /*++++++++++++++++++++++++++++++++++++++ Re-use an existing queue. Queue *queue The queue to reset for re-use. ++++++++++++++++++++++++++++++++++++++*/ void ResetQueueList(Queue *queue) { queue->noccupied=0; } /*++++++++++++++++++++++++++++++++++++++ Free a queue. Queue *queue The queue to be freed. ++++++++++++++++++++++++++++++++++++++*/ void FreeQueueList(Queue *queue) { #ifndef LIBROUTINO log_free(queue->results); #endif free(queue->results); free(queue); } /*++++++++++++++++++++++++++++++++++++++ Insert a new item into the queue in the right place. The data is stored in a "Binary Heap" http://en.wikipedia.org/wiki/Binary_heap and this operation is adding an item to the heap. Queue *queue The queue to insert the result into. Result *result The result to insert into the queue. score_t score The score to use for sorting the node. ++++++++++++++++++++++++++++++++++++++*/ void InsertInQueue(Queue *queue,Result *result,score_t score) { uint32_t index; if(result->queued==NOT_QUEUED) { queue->noccupied++; index=queue->noccupied; if(queue->noccupied==queue->nallocated) { queue->nallocated=queue->nallocated+queue->nincrement; queue->results=(Result**)realloc((void*)queue->results,queue->nallocated*sizeof(Result*)); #ifndef LIBROUTINO log_malloc(queue->results,queue->nallocated*sizeof(Result*)); #endif } queue->results[index]=result; queue->results[index]->queued=index; } else index=result->queued; queue->results[index]->sortby=score; /* Bubble up the new value */ while(index>1) { uint32_t newindex; Result *temp; newindex=index/2; if(queue->results[index]->sortby>=queue->results[newindex]->sortby) break; temp=queue->results[index]; queue->results[index]=queue->results[newindex]; queue->results[newindex]=temp; queue->results[index]->queued=index; queue->results[newindex]->queued=newindex; index=newindex; } } /*++++++++++++++++++++++++++++++++++++++ Pop an item from the front of the queue. The data is stored in a "Binary Heap" http://en.wikipedia.org/wiki/Binary_heap and this operation is deleting the root item from the heap. Result *PopFromQueue Returns the top item. Queue *queue The queue to remove the result from. ++++++++++++++++++++++++++++++++++++++*/ Result *PopFromQueue(Queue *queue) { uint32_t index; Result *retval; if(queue->noccupied==0) return(NULL); retval=queue->results[1]; retval->queued=NOT_QUEUED; index=1; queue->results[index]=queue->results[queue->noccupied]; queue->noccupied--; /* Bubble down the newly promoted value */ while((2*index)noccupied) { uint32_t newindex; Result *temp; newindex=2*index; if(queue->results[newindex]->sortby>queue->results[newindex+1]->sortby) newindex=newindex+1; if(queue->results[index]->sortby<=queue->results[newindex]->sortby) break; temp=queue->results[newindex]; queue->results[newindex]=queue->results[index]; queue->results[index]=temp; queue->results[index]->queued=index; queue->results[newindex]->queued=newindex; index=newindex; } if((2*index)==queue->noccupied) { uint32_t newindex; Result *temp; newindex=2*index; if(queue->results[index]->sortby<=queue->results[newindex]->sortby) ; /* break */ else { temp=queue->results[newindex]; queue->results[newindex]=queue->results[index]; queue->results[index]=temp; queue->results[index]->queued=index; queue->results[newindex]->queued=newindex; } } return(retval); } routino-3.4.3/src/relations.c 644 233 144 24100 13754203452 11345 0/*************************************** Relation data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2019, 2020 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include "types.h" #include "relations.h" #include "fakes.h" #include "files.h" /*++++++++++++++++++++++++++++++++++++++ Load in a relation list from a file. Relations *LoadRelationList Returns the relation list. const char *filename The name of the file to load. ++++++++++++++++++++++++++++++++++++++*/ Relations *LoadRelationList(const char *filename) { Relations *relations; relations=(Relations*)malloc(sizeof(Relations)); #if !SLIM relations->data=MapFile(filename); /* Copy the RelationsFile header structure from the loaded data */ relations->file=*((RelationsFile*)relations->data); /* Set the pointers in the Relations structure. */ relations->turnrelations=(TurnRelation*)(relations->data+sizeof(RelationsFile)); #else relations->fd=SlimMapFile(filename); /* Copy the RelationsFile header structure from the loaded data */ SlimFetch(relations->fd,&relations->file,sizeof(RelationsFile),0); relations->troffset=sizeof(RelationsFile); relations->cache=NewTurnRelationCache(); #ifndef LIBROUTINO log_malloc(relations->cache,sizeof(*relations->cache)); #endif #endif if(relations->file.trnumber>0) { TurnRelation *relation; relation=LookupTurnRelation(relations,0,1); relations->via_start =relation->via; relation=LookupTurnRelation(relations,relations->file.trnumber-1,1); relations->via_end =relation->via; } return(relations); } /*++++++++++++++++++++++++++++++++++++++ Destroy the relation list. Relations *relations The relation list to destroy. ++++++++++++++++++++++++++++++++++++++*/ void DestroyRelationList(Relations *relations) { #if !SLIM relations->data=UnmapFile(relations->data); #else relations->fd=SlimUnmapFile(relations->fd); #ifndef LIBROUTINO log_free(relations->cache); #endif DeleteTurnRelationCache(relations->cache); #endif free(relations); } /*++++++++++++++++++++++++++++++++++++++ Find the first turn relation in the file whose 'via' matches a specific node. index_t FindFirstTurnRelation1 Returns the index of the first turn relation matching. Relations *relations The set of relations to use. index_t via The node that the route is going via. ++++++++++++++++++++++++++++++++++++++*/ index_t FindFirstTurnRelation1(Relations *relations,index_t via) { TurnRelation *relation; index_t start=0; index_t end=relations->file.trnumber-1; index_t mid; index_t match=NO_RELATION; /* Binary search - search key any exact match (may be multiple) is required. * * # <- start | Check mid and exit if it matches else move start or end. * # | * # | Since an exact match is wanted we can set end=mid-1 * # <- mid | or start=mid+1 if we find that mid doesn't match. * # | * # | Eventually either end=start or end=start+1 and one of * # <- end | start or end matches or neither does. */ while((end-start)>1) { mid=start+(end-start)/2; /* Choose mid point (avoid overflow) */ relation=LookupTurnRelation(relations,mid,1); if(relation->viavia>via) /* Mid point is too high for 'via' */ end=mid-1; else /* Mid point is correct for 'from' */ { match=mid; break; } } if(match==NO_RELATION) /* Check if start matches */ { relation=LookupTurnRelation(relations,start,1); if(relation->via==via) match=start; } if(match==NO_RELATION) /* Check if end matches */ { relation=LookupTurnRelation(relations,end,1); if(relation->via==via) match=end; } if(match==NO_RELATION) return(match); while(match>0) /* Search backwards for the first match */ { relation=LookupTurnRelation(relations,match-1,1); if(relation->via==via) match--; else break; } return(match); } /*++++++++++++++++++++++++++++++++++++++ Find the next turn relation in the file whose 'via' matches a specific node. index_t FindNextTurnRelation1 Returns the index of the next turn relation matching. Relations *relations The set of relations to use. index_t current The current index of a relation that matches. ++++++++++++++++++++++++++++++++++++++*/ index_t FindNextTurnRelation1(Relations *relations,index_t current) { TurnRelation *relation; index_t via; relation=LookupTurnRelation(relations,current,1); via=relation->via; current++; if(current==relations->file.trnumber) return(NO_RELATION); relation=LookupTurnRelation(relations,current,1); if(relation->via==via) return(current); else return(NO_RELATION); } /*++++++++++++++++++++++++++++++++++++++ Find the first turn relation in the file whose 'via' and 'from' match a specific node and segment. index_t FindFirstTurnRelation2 Returns the index of the first turn relation matching. Relations *relations The set of relations to use. index_t via The node that the route is going via. index_t from The segment that the route is coming from. ++++++++++++++++++++++++++++++++++++++*/ index_t FindFirstTurnRelation2(Relations *relations,index_t via,index_t from) { TurnRelation *relation; index_t start=0; index_t end=relations->file.trnumber-1; index_t mid; index_t match=NO_RELATION; if(IsFakeSegment(from)) from=IndexRealSegment(from); /* Binary search - search key any exact match (may be multiple) is required. * * # <- start | Check mid and exit if it matches else move start or end. * # | * # | Since an exact match is wanted we can set end=mid-1 * # <- mid | or start=mid+1 if we find that mid doesn't match. * # | * # | Eventually either end=start or end=start+1 and one of * # <- end | start or end matches or neither does. */ while((end-start)>1) { mid=start+(end-start)/2; /* Choose mid point (avoid overflow) */ relation=LookupTurnRelation(relations,mid,1); if(relation->viavia>via) /* Mid point is too high for 'via' */ end=mid-1; else /* Mid point is correct for 'via' */ { if(relation->fromfrom>from) /* Mid point is too high for 'from' */ end=mid-1; else /* Mid point is correct for 'from' */ { match=mid; break; } } } if(match==NO_RELATION) /* Check if start matches */ { relation=LookupTurnRelation(relations,start,1); if(relation->via==via && relation->from==from) match=start; } if(match==NO_RELATION) /* Check if end matches */ { relation=LookupTurnRelation(relations,end,1); if(relation->via==via && relation->from==from) match=end; } if(match==NO_RELATION) return(match); while(match>0) /* Search backwards for the first match */ { relation=LookupTurnRelation(relations,match-1,1); if(relation->via==via && relation->from==from) match--; else break; } return(match); } /*++++++++++++++++++++++++++++++++++++++ Find the next turn relation in the file whose 'via' and 'from' match a specific node and segment. index_t FindNextTurnRelation2 Returns the index of the next turn relation matching. Relations *relations The set of relations to use. index_t current The current index of a relation that matches. ++++++++++++++++++++++++++++++++++++++*/ index_t FindNextTurnRelation2(Relations *relations,index_t current) { TurnRelation *relation; index_t via,from; relation=LookupTurnRelation(relations,current,1); via=relation->via; from=relation->from; current++; if(current==relations->file.trnumber) return(NO_RELATION); relation=LookupTurnRelation(relations,current,1); if(relation->via==via && relation->from==from) return(current); else return(NO_RELATION); } /*++++++++++++++++++++++++++++++++++++++ Determine if a turn is allowed between the nodes 'from', 'via' and 'to' for a particular transport type. int IsTurnAllowed Return 1 if the turn is allowed or 0 if not. Relations *relations The set of relations to use. index_t index The index of the first turn relation containing 'via' and 'from'. index_t via The via node. index_t from The from segment. index_t to The to segment. transports_t transport The type of transport that is being routed. ++++++++++++++++++++++++++++++++++++++*/ int IsTurnAllowed(Relations *relations,index_t index,index_t via,index_t from,index_t to,transports_t transport) { if(IsFakeSegment(from)) from=IndexRealSegment(from); if(IsFakeSegment(to)) to=IndexRealSegment(to); while(indexfile.trnumber) { TurnRelation *relation=LookupTurnRelation(relations,index,1); if(relation->via!=via) return(1); if(relation->from!=from) return(1); if(relation->to>to) return(1); if(relation->to==to) if(!(relation->except & transport)) return(0); index++; } return(1); } routino-3.4.3/src/filedumperx.c 644 233 144 26424 13713770012 11700 0/*************************************** Memory file dumper for the intermediate files containing parsed data. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2017, 2020 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include "version.h" #include "typesx.h" #include "nodesx.h" #include "waysx.h" #include "relationsx.h" #include "files.h" #include "sorting.h" /* Local functions */ static void print_nodes(const char *filename); static void print_ways(const char *filename); static void print_route_relations(const char *filename); static void print_turn_relations(const char *filename); static const char *TurnRestrictionName(TurnRestriction restriction); static void print_usage(int detail,const char *argerr,const char *err); /*++++++++++++++++++++++++++++++++++++++ The main program for the file dumper. ++++++++++++++++++++++++++++++++++++++*/ int main(int argc,char** argv) { int arg; char *dirname=NULL,*prefix=NULL; char *nodes_filename,*ways_filename,*route_relations_filename,*turn_relations_filename; int option_dump=0; /* Parse the command line arguments */ for(arg=1;arg=0) { fprintf(stderr, "Usage: filedumperx [--version]\n" " [--help]\n" " [--dir=] [--prefix=]\n" " [--dump [--nodes]\n" " [--ways]\n" " [--route-relations]\n" " [--turn-relations]]\n"); if(argerr) fprintf(stderr, "\n" "Error with command line parameter: %s\n",argerr); if(err) fprintf(stderr, "\n" "Error: %s\n",err); } if(detail==1) fprintf(stderr, "\n" "--version Print the version of Routino.\n" "\n" "--help Prints this information.\n" "\n" "--dir= The directory containing the routing database.\n" "--prefix= The filename prefix for the routing database.\n" "\n" "--dump Dump the intermediate files after parsing.\n" " --nodes * all of the nodes.\n" " --ways * all of the ways.\n" " --route-relations * all of the route relations.\n" " --turn-relations * all of the turn relations.\n"); exit(!detail); } routino-3.4.3/src/prunex.h 644 233 144 2761 12731266071 10664 0/*************************************** Header for super-node and super-segment pruning functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2011-2012 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef PRUNEX_H #define PRUNEX_H /*+ To stop multiple inclusions. +*/ #include "types.h" #include "typesx.h" /* Functions in prunex.c */ void StartPruning(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx); void FinishPruning(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx); void PruneIsolatedRegions(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,distance_t minimum); void PruneShortSegments(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,distance_t minimum); void PruneStraightHighwayNodes(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx,distance_t maximum); #endif /* PRUNEX_H */ routino-3.4.3/src/translations.c 644 233 144 157522 13452411162 12117 0/*************************************** Load the translations from a file and the functions for handling them. Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2016, 2019 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include "files.h" #include "translations.h" #include "xmlparse.h" /* Default English translations - Must not require any UTF-8 encoding */ static Translation default_translation= { .lang = "--", .language = "English (built-in)", .raw_copyright_creator = {"Creator","Routino - http://www.routino.org/"}, .raw_copyright_source = {NULL,NULL}, .raw_copyright_license = {NULL,NULL}, .xml_copyright_creator = {"Creator","Routino - http://www.routino.org/"}, .xml_copyright_source = {NULL,NULL}, .xml_copyright_license = {NULL,NULL}, .xml_heading = {"South","South-West","West","North-West","North","North-East","East","South-East","South"}, .xml_turn = {"Very sharp left","Sharp left","Left","Slight left","Straight on","Slight right","Right","Sharp right","Very sharp right"}, .xml_ordinal = {"First","Second","Third","Fourth","Fifth","Sixth","Seventh","Eighth","Ninth","Tenth"}, .notxml_heading = {"South","South-West","West","North-West","North","North-East","East","South-East","South"}, .notxml_turn = {"Very sharp left","Sharp left","Left","Slight left","Straight on","Slight right","Right","Sharp right","Very sharp right"}, .notxml_ordinal = {"First","Second","Third","Fourth","Fifth","Sixth","Seventh","Eighth","Ninth","Tenth"}, .raw_highway = {"","motorway","trunk road","primary road","secondary road","tertiary road","unclassified road","residential road","service road","track","cycleway","path","steps","ferry"}, .xml_route_shortest = "Shortest", .xml_route_quickest = "Quickest", .html_waypoint = "Waypoint", .html_junction = "Junction", .html_roundabout = "Roundabout", .html_title = "%s Route", .html_start = "Start at %s, head %s\n", /* span tags added when reading XML translations file */ .html_node = "At %s, go %s heading %s\n", /* span tags added when reading XML translations file */ .html_rbnode = "Leave %s, take the %s exit heading %s\n", /* span tags added when reading XML translations file */ .html_segment = "Follow %s for %.3f km, %.1f min", /* span tags added when reading XML translations file */ .html_stop = "Stop at %s\n", .html_total = "Total %.1f km, %.0f minutes\n",/* span tags added when reading XML translations file */ .html_subtotal= "%.1f km, %.0f minutes\n",/* span tag added when reading XML translations file */ .nothtml_waypoint = "Waypoint", .nothtml_junction = "Junction", .nothtml_roundabout = "Roundabout", .nothtml_title = "%s Route", .nothtml_start = "Start at %s, head %s", .nothtml_node = "At %s, go %s heading %s", .nothtml_rbnode = "Leave %s, take the %s exit heading %s", .nothtml_segment = "Follow %s for %.3f km, %.1f min", .nothtml_stop = "Stop at %s", .nothtml_total = "Total %.1f km, %.0f minutes", .nothtml_subtotal= "%.1f km, %.0f minutes", .gpx_desc = "%s route between 'start' and 'finish' waypoints", .gpx_name = "%s route", .gpx_step = "%s on '%s' for %.3f km, %.1f min", .gpx_final = "Total Journey %.1f km, %.0f minutes", .gpx_waypt = "WAYPT", .gpx_trip = "TRIP", }; /* Local variables (re-intialised by FreeXMLTranslations() function) */ /*+ The translations that have been loaded from file. +*/ static Translation **loaded_translations=NULL; /*+ The number of translations that have been loaded from file. +*/ static int nloaded_translations=0; /* Local variables (re-initialised for each file) */ /*+ Store all of the translations. +*/ static int store_all; /*+ The translation language that is to be stored. +*/ static const char *store_lang; /*+ This current language is to be stored. +*/ static int store; /*+ The chosen language has been stored. +*/ static int stored; /* The XML tag processing function prototypes */ //static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding); //static int RoutinoTranslationsType_function(const char *_tag_,int _type_); static int LanguageType_function(const char *_tag_,int _type_,const char *lang,const char *language); //static int CopyrightType_function(const char *_tag_,int _type_); static int TurnType_function(const char *_tag_,int _type_,const char *direction,const char *string); static int HeadingType_function(const char *_tag_,int _type_,const char *direction,const char *string); static int OrdinalType_function(const char *_tag_,int _type_,const char *number,const char *string); static int HighwayType_function(const char *_tag_,int _type_,const char *type,const char *string); static int RouteType_function(const char *_tag_,int _type_,const char *type,const char *string); //static int HTMLType_function(const char *_tag_,int _type_); //static int GPXType_function(const char *_tag_,int _type_); static int CopyrightCreatorType_function(const char *_tag_,int _type_,const char *string,const char *text); static int CopyrightSourceType_function(const char *_tag_,int _type_,const char *string,const char *text); static int CopyrightLicenseType_function(const char *_tag_,int _type_,const char *string,const char *text); static int HTMLWaypointType_function(const char *_tag_,int _type_,const char *type,const char *string); static int HTMLTitleType_function(const char *_tag_,int _type_,const char *text); static int HTMLStartType_function(const char *_tag_,int _type_,const char *text); static int HTMLNodeType_function(const char *_tag_,int _type_,const char *text); static int HTMLRBNodeType_function(const char *_tag_,int _type_,const char *text); static int HTMLSegmentType_function(const char *_tag_,int _type_,const char *text); static int HTMLStopType_function(const char *_tag_,int _type_,const char *text); static int HTMLTotalType_function(const char *_tag_,int _type_,const char *text); static int HTMLSubtotalType_function(const char *_tag_,int _type_,const char *text); static int GPXWaypointType_function(const char *_tag_,int _type_,const char *type,const char *string); static int GPXDescType_function(const char *_tag_,int _type_,const char *text); static int GPXNameType_function(const char *_tag_,int _type_,const char *text); static int GPXStepType_function(const char *_tag_,int _type_,const char *text); static int GPXFinalType_function(const char *_tag_,int _type_,const char *text); /* The XML tag definitions (forward declarations) */ static const xmltag xmlDeclaration_tag; static const xmltag RoutinoTranslationsType_tag; static const xmltag LanguageType_tag; static const xmltag CopyrightType_tag; static const xmltag TurnType_tag; static const xmltag HeadingType_tag; static const xmltag OrdinalType_tag; static const xmltag HighwayType_tag; static const xmltag RouteType_tag; static const xmltag HTMLType_tag; static const xmltag GPXType_tag; static const xmltag CopyrightCreatorType_tag; static const xmltag CopyrightSourceType_tag; static const xmltag CopyrightLicenseType_tag; static const xmltag HTMLWaypointType_tag; static const xmltag HTMLTitleType_tag; static const xmltag HTMLStartType_tag; static const xmltag HTMLNodeType_tag; static const xmltag HTMLRBNodeType_tag; static const xmltag HTMLSegmentType_tag; static const xmltag HTMLStopType_tag; static const xmltag HTMLTotalType_tag; static const xmltag HTMLSubtotalType_tag; static const xmltag GPXWaypointType_tag; static const xmltag GPXDescType_tag; static const xmltag GPXNameType_tag; static const xmltag GPXStepType_tag; static const xmltag GPXFinalType_tag; /* The XML tag definition values */ /*+ The complete set of tags at the top level. +*/ static const xmltag * const xml_toplevel_tags[]={&xmlDeclaration_tag,&RoutinoTranslationsType_tag,NULL}; /*+ The xmlDeclaration type tag. +*/ static const xmltag xmlDeclaration_tag= {"xml", 2, {"version","encoding"}, NULL, {NULL}}; /*+ The RoutinoTranslationsType type tag. +*/ static const xmltag RoutinoTranslationsType_tag= {"routino-translations", 0, {NULL}, NULL, {&LanguageType_tag,NULL}}; /*+ The LanguageType type tag. +*/ static const xmltag LanguageType_tag= {"language", 2, {"lang","language"}, LanguageType_function, {&CopyrightType_tag,&TurnType_tag,&HeadingType_tag,&OrdinalType_tag,&HighwayType_tag,&RouteType_tag,&HTMLType_tag,&GPXType_tag,NULL}}; /*+ The CopyrightType type tag. +*/ static const xmltag CopyrightType_tag= {"copyright", 0, {NULL}, NULL, {&CopyrightCreatorType_tag,&CopyrightSourceType_tag,&CopyrightLicenseType_tag,NULL}}; /*+ The TurnType type tag. +*/ static const xmltag TurnType_tag= {"turn", 2, {"direction","string"}, TurnType_function, {NULL}}; /*+ The HeadingType type tag. +*/ static const xmltag HeadingType_tag= {"heading", 2, {"direction","string"}, HeadingType_function, {NULL}}; /*+ The OrdinalType type tag. +*/ static const xmltag OrdinalType_tag= {"ordinal", 2, {"number","string"}, OrdinalType_function, {NULL}}; /*+ The HighwayType type tag. +*/ static const xmltag HighwayType_tag= {"highway", 2, {"type","string"}, HighwayType_function, {NULL}}; /*+ The RouteType type tag. +*/ static const xmltag RouteType_tag= {"route", 2, {"type","string"}, RouteType_function, {NULL}}; /*+ The HTMLType type tag. +*/ static const xmltag HTMLType_tag= {"output-html", 0, {NULL}, NULL, {&HTMLWaypointType_tag,&HTMLTitleType_tag,&HTMLStartType_tag,&HTMLNodeType_tag,&HTMLRBNodeType_tag,&HTMLSegmentType_tag,&HTMLStopType_tag,&HTMLTotalType_tag,&HTMLSubtotalType_tag,NULL}}; /*+ The GPXType type tag. +*/ static const xmltag GPXType_tag= {"output-gpx", 0, {NULL}, NULL, {&GPXWaypointType_tag,&GPXDescType_tag,&GPXNameType_tag,&GPXStepType_tag,&GPXFinalType_tag,NULL}}; /*+ The CopyrightCreatorType type tag. +*/ static const xmltag CopyrightCreatorType_tag= {"creator", 2, {"string","text"}, CopyrightCreatorType_function, {NULL}}; /*+ The CopyrightSourceType type tag. +*/ static const xmltag CopyrightSourceType_tag= {"source", 2, {"string","text"}, CopyrightSourceType_function, {NULL}}; /*+ The CopyrightLicenseType type tag. +*/ static const xmltag CopyrightLicenseType_tag= {"license", 2, {"string","text"}, CopyrightLicenseType_function, {NULL}}; /*+ The HTMLWaypointType type tag. +*/ static const xmltag HTMLWaypointType_tag= {"waypoint", 2, {"type","string"}, HTMLWaypointType_function, {NULL}}; /*+ The HTMLTitleType type tag. +*/ static const xmltag HTMLTitleType_tag= {"title", 1, {"text"}, HTMLTitleType_function, {NULL}}; /*+ The HTMLStartType type tag. +*/ static const xmltag HTMLStartType_tag= {"start", 1, {"text"}, HTMLStartType_function, {NULL}}; /*+ The HTMLNodeType type tag. +*/ static const xmltag HTMLNodeType_tag= {"node", 1, {"text"}, HTMLNodeType_function, {NULL}}; /*+ The HTMLRBNodeType type tag. +*/ static const xmltag HTMLRBNodeType_tag= {"rbnode", 1, {"text"}, HTMLRBNodeType_function, {NULL}}; /*+ The HTMLSegmentType type tag. +*/ static const xmltag HTMLSegmentType_tag= {"segment", 1, {"text"}, HTMLSegmentType_function, {NULL}}; /*+ The HTMLStopType type tag. +*/ static const xmltag HTMLStopType_tag= {"stop", 1, {"text"}, HTMLStopType_function, {NULL}}; /*+ The HTMLTotalType type tag. +*/ static const xmltag HTMLTotalType_tag= {"total", 1, {"text"}, HTMLTotalType_function, {NULL}}; /*+ The HTMLSubtotalType type tag. +*/ static const xmltag HTMLSubtotalType_tag= {"subtotal", 1, {"text"}, HTMLSubtotalType_function, {NULL}}; /*+ The GPXWaypointType type tag. +*/ static const xmltag GPXWaypointType_tag= {"waypoint", 2, {"type","string"}, GPXWaypointType_function, {NULL}}; /*+ The GPXDescType type tag. +*/ static const xmltag GPXDescType_tag= {"desc", 1, {"text"}, GPXDescType_function, {NULL}}; /*+ The GPXNameType type tag. +*/ static const xmltag GPXNameType_tag= {"name", 1, {"text"}, GPXNameType_function, {NULL}}; /*+ The GPXStepType type tag. +*/ static const xmltag GPXStepType_tag= {"step", 1, {"text"}, GPXStepType_function, {NULL}}; /*+ The GPXFinalType type tag. +*/ static const xmltag GPXFinalType_tag= {"final", 1, {"text"}, GPXFinalType_function, {NULL}}; /* The XML tag processing functions */ /*++++++++++++++++++++++++++++++++++++++ The function that is called when the XML declaration is seen int xmlDeclaration_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *version The contents of the 'version' attribute (or NULL if not defined). const char *encoding The contents of the 'encoding' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ //static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the RoutinoTranslationsType XSD type is seen int RoutinoTranslationsType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int RoutinoTranslationsType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the LanguageType XSD type is seen int LanguageType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *lang The contents of the 'lang' attribute (or NULL if not defined). const char *language The contents of the 'language' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int LanguageType_function(const char *_tag_,int _type_,const char *lang,const char *language) { if(_type_&XMLPARSE_TAG_START) { XMLPARSE_ASSERT_STRING(_tag_,lang); XMLPARSE_ASSERT_STRING(_tag_,language); if(store_all) store=1; else if(!store_lang && !stored) store=1; else if(store_lang && !strcmp(store_lang,lang)) store=1; else store=0; if(store) { int i; for(i=0;ilang)) XMLPARSE_MESSAGE(_tag_,"translation name must be unique"); if((nloaded_translations%16)==0) loaded_translations=(Translation**)realloc((void*)loaded_translations,(nloaded_translations+16)*sizeof(Translation*)); nloaded_translations++; loaded_translations[nloaded_translations-1]=(Translation*)calloc(1,sizeof(Translation)); *loaded_translations[nloaded_translations-1]=default_translation; loaded_translations[nloaded_translations-1]->lang =strcpy(malloc(strlen(lang )+1),lang ); loaded_translations[nloaded_translations-1]->language=strcpy(malloc(strlen(language)+1),language); } } if(_type_&XMLPARSE_TAG_END && store) { store=0; stored=1; } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the CopyrightType XSD type is seen int CopyrightType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int CopyrightType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the TurnType XSD type is seen int TurnType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *direction The contents of the 'direction' attribute (or NULL if not defined). const char *string The contents of the 'string' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int TurnType_function(const char *_tag_,int _type_,const char *direction,const char *string) { if(_type_&XMLPARSE_TAG_START && store) { char *xmlstring; int d; XMLPARSE_ASSERT_INTEGER(_tag_,direction); d=atoi(direction); XMLPARSE_ASSERT_STRING(_tag_,string); d+=4; if(d<0 || d>8) XMLPARSE_INVALID(_tag_,direction); loaded_translations[nloaded_translations-1]->notxml_turn[d]=strcpy(malloc(strlen(string)+1),string); xmlstring=ParseXML_Encode_Safe_XML(string); loaded_translations[nloaded_translations-1]->xml_turn[d]=strcpy(malloc(strlen(xmlstring)+1),xmlstring); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HeadingType XSD type is seen int HeadingType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *direction The contents of the 'direction' attribute (or NULL if not defined). const char *string The contents of the 'string' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HeadingType_function(const char *_tag_,int _type_,const char *direction,const char *string) { if(_type_&XMLPARSE_TAG_START && store) { char *xmlstring; int d; XMLPARSE_ASSERT_INTEGER(_tag_,direction); d=atoi(direction); XMLPARSE_ASSERT_STRING(_tag_,string); d+=4; if(d<0 || d>8) XMLPARSE_INVALID(_tag_,direction); loaded_translations[nloaded_translations-1]->notxml_heading[d]=strcpy(malloc(strlen(string)+1),string); xmlstring=ParseXML_Encode_Safe_XML(string); loaded_translations[nloaded_translations-1]->xml_heading[d]=strcpy(malloc(strlen(xmlstring)+1),xmlstring); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the OrdinalType XSD type is seen int OrdinalType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *number The contents of the 'number' attribute (or NULL if not defined). const char *string The contents of the 'string' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int OrdinalType_function(const char *_tag_,int _type_,const char *number,const char *string) { if(_type_&XMLPARSE_TAG_START && store) { char *xmlstring; int n; XMLPARSE_ASSERT_INTEGER(_tag_,number); n=atoi(number); XMLPARSE_ASSERT_STRING(_tag_,string); if(n<1 || n>10) XMLPARSE_INVALID(_tag_,number); loaded_translations[nloaded_translations-1]->notxml_ordinal[n-1]=strcpy(malloc(strlen(string)+1),string); xmlstring=ParseXML_Encode_Safe_XML(string); loaded_translations[nloaded_translations-1]->xml_ordinal[n-1]=strcpy(malloc(strlen(xmlstring)+1),xmlstring); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HighwayType XSD type is seen int HighwayType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *type The contents of the 'type' attribute (or NULL if not defined). const char *string The contents of the 'string' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HighwayType_function(const char *_tag_,int _type_,const char *type,const char *string) { if(_type_&XMLPARSE_TAG_START && store) { Highway highway; XMLPARSE_ASSERT_STRING(_tag_,type); XMLPARSE_ASSERT_STRING(_tag_,string); highway=HighwayType(type); if(highway==Highway_None) XMLPARSE_INVALID(_tag_,type); loaded_translations[nloaded_translations-1]->raw_highway[highway]=strcpy(malloc(strlen(string)+1),string); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the RouteType XSD type is seen int RouteType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *type The contents of the 'type' attribute (or NULL if not defined). const char *string The contents of the 'string' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int RouteType_function(const char *_tag_,int _type_,const char *type,const char *string) { if(_type_&XMLPARSE_TAG_START && store) { char *xmlstring; XMLPARSE_ASSERT_STRING(_tag_,type); XMLPARSE_ASSERT_STRING(_tag_,string); xmlstring=ParseXML_Encode_Safe_XML(string); if(!strcmp(type,"shortest")) loaded_translations[nloaded_translations-1]->xml_route_shortest=strcpy(malloc(strlen(xmlstring)+1),xmlstring); else if(!strcmp(type,"quickest")) loaded_translations[nloaded_translations-1]->xml_route_quickest=strcpy(malloc(strlen(xmlstring)+1),xmlstring); else XMLPARSE_INVALID(_tag_,type); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HTMLType XSD type is seen int HTMLType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int HTMLType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the GPXType XSD type is seen int GPXType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. ++++++++++++++++++++++++++++++++++++++*/ //static int GPXType_function(const char *_tag_,int _type_) //{ // return(0); //} /*++++++++++++++++++++++++++++++++++++++ The function that is called when the CopyrightCreatorType XSD type is seen int CopyrightCreatorType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *string The contents of the 'string' attribute (or NULL if not defined). const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int CopyrightCreatorType_function(const char *_tag_,int _type_,const char *string,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmlstring,*xmltext; XMLPARSE_ASSERT_STRING(_tag_,string); XMLPARSE_ASSERT_STRING(_tag_,text); loaded_translations[nloaded_translations-1]->raw_copyright_creator[0]=strcpy(malloc(strlen(string)+1),string); loaded_translations[nloaded_translations-1]->raw_copyright_creator[1]=strcpy(malloc(strlen(text)+1) ,text); xmlstring=ParseXML_Encode_Safe_XML(string); loaded_translations[nloaded_translations-1]->xml_copyright_creator[0]=strcpy(malloc(strlen(xmlstring)+1),xmlstring); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->xml_copyright_creator[1]=strcpy(malloc(strlen(xmltext)+1),xmltext); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the CopyrightSourceType XSD type is seen int CopyrightSourceType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *string The contents of the 'string' attribute (or NULL if not defined). const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int CopyrightSourceType_function(const char *_tag_,int _type_,const char *string,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmlstring,*xmltext; XMLPARSE_ASSERT_STRING(_tag_,string); XMLPARSE_ASSERT_STRING(_tag_,text); loaded_translations[nloaded_translations-1]->raw_copyright_source[0]=strcpy(malloc(strlen(string)+1),string); loaded_translations[nloaded_translations-1]->raw_copyright_source[1]=strcpy(malloc(strlen(text)+1) ,text); xmlstring=ParseXML_Encode_Safe_XML(string); loaded_translations[nloaded_translations-1]->xml_copyright_source[0]=strcpy(malloc(strlen(xmlstring)+1),xmlstring); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->xml_copyright_source[1]=strcpy(malloc(strlen(xmltext)+1),xmltext); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the CopyrightLicenseType XSD type is seen int CopyrightLicenseType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *string The contents of the 'string' attribute (or NULL if not defined). const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int CopyrightLicenseType_function(const char *_tag_,int _type_,const char *string,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmlstring,*xmltext; XMLPARSE_ASSERT_STRING(_tag_,string); XMLPARSE_ASSERT_STRING(_tag_,text); loaded_translations[nloaded_translations-1]->raw_copyright_license[0]=strcpy(malloc(strlen(string)+1),string); loaded_translations[nloaded_translations-1]->raw_copyright_license[1]=strcpy(malloc(strlen(text)+1) ,text); xmlstring=ParseXML_Encode_Safe_XML(string); loaded_translations[nloaded_translations-1]->xml_copyright_license[0]=strcpy(malloc(strlen(xmlstring)+1),xmlstring); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->xml_copyright_license[1]=strcpy(malloc(strlen(xmltext)+1),xmltext); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HTMLWaypointType XSD type is seen int HTMLWaypointType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *type The contents of the 'type' attribute (or NULL if not defined). const char *string The contents of the 'string' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HTMLWaypointType_function(const char *_tag_,int _type_,const char *type,const char *string) { if(_type_&XMLPARSE_TAG_START && store) { char *xmlstring; XMLPARSE_ASSERT_STRING(_tag_,type); XMLPARSE_ASSERT_STRING(_tag_,string); xmlstring=ParseXML_Encode_Safe_XML(string); if(!strcmp(type,"waypoint")) { loaded_translations[nloaded_translations-1]->nothtml_waypoint=strcpy(malloc(strlen(string)+1),string); loaded_translations[nloaded_translations-1]->html_waypoint=strcpy(malloc(strlen(xmlstring)+1),xmlstring); } else if(!strcmp(type,"junction")) { loaded_translations[nloaded_translations-1]->nothtml_junction=strcpy(malloc(strlen(string)+1),string); loaded_translations[nloaded_translations-1]->html_junction=strcpy(malloc(strlen(xmlstring)+1),xmlstring); } else if(!strcmp(type,"roundabout")) { loaded_translations[nloaded_translations-1]->nothtml_roundabout=strcpy(malloc(strlen(string)+1),string); loaded_translations[nloaded_translations-1]->html_roundabout=strcpy(malloc(strlen(xmlstring)+1),xmlstring); } else XMLPARSE_INVALID(_tag_,type); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HTMLTitleType XSD type is seen int HTMLTitleType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HTMLTitleType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->nothtml_title=strcpy(malloc(strlen(text)+1),text); loaded_translations[nloaded_translations-1]->html_title=strcpy(malloc(strlen(xmltext)+1),xmltext); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HTMLStartType XSD type is seen int HTMLStartType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HTMLStartType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; const char *p; char *q; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->nothtml_start=strcpy(malloc(strlen(text)+1),text); loaded_translations[nloaded_translations-1]->html_start=malloc(sizeof("")+strlen(xmltext)+sizeof("")+sizeof("")+1+1); p=xmltext; q=loaded_translations[nloaded_translations-1]->html_start; strcpy(q,""); q+=sizeof("")-1; while(*p!='%') *q++=*p++; *q++=*p++; while(*p!='%') *q++=*p++; p+=2; strcpy(q,"%s"); q+=sizeof("%s")-1; strcpy(q,p); strcat(q,"\n"); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HTMLNodeType XSD type is seen int HTMLNodeType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HTMLNodeType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; const char *p; char *q; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->nothtml_node=strcpy(malloc(strlen(text)+1),text); loaded_translations[nloaded_translations-1]->html_node=malloc(sizeof("")+strlen(xmltext)+2*sizeof("")+2*sizeof("")+1+1); p=xmltext; q=loaded_translations[nloaded_translations-1]->html_node; strcpy(q,""); q+=sizeof("")-1; while(*p!='%') *q++=*p++; *q++=*p++; while(*p!='%') *q++=*p++; p+=2; strcpy(q,"%s"); q+=sizeof("%s")-1; while(*p!='%') *q++=*p++; p+=2; strcpy(q,"%s"); q+=sizeof("%s")-1; strcpy(q,p); strcat(q,"\n"); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HTMLRBNodeType XSD type is seen int HTMLRBNodeType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HTMLRBNodeType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; const char *p; char *q; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->nothtml_rbnode=strcpy(malloc(strlen(text)+1),text); loaded_translations[nloaded_translations-1]->html_rbnode=malloc(sizeof("")+strlen(xmltext)+2*sizeof("")+2*sizeof("")+1+1); p=xmltext; q=loaded_translations[nloaded_translations-1]->html_rbnode; strcpy(q,""); q+=sizeof("")-1; while(*p!='%') *q++=*p++; *q++=*p++; while(*p!='%') *q++=*p++; p+=2; strcpy(q,"%s"); q+=sizeof("%s")-1; while(*p!='%') *q++=*p++; p+=2; strcpy(q,"%s"); q+=sizeof("%s")-1; strcpy(q,p); strcat(q,"\n"); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HTMLSegmentType XSD type is seen int HTMLSegmentType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HTMLSegmentType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; const char *p; char *q; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->nothtml_segment=strcpy(malloc(strlen(text)+1),text); loaded_translations[nloaded_translations-1]->html_segment=malloc(sizeof("")+strlen(xmltext)+2*sizeof("")+2*sizeof("")+1); p=xmltext; q=loaded_translations[nloaded_translations-1]->html_segment; strcpy(q,""); q+=sizeof("")-1; while(*p!='%') *q++=*p++; p+=2; strcpy(q,"%s"); q+=sizeof("%s")-1; while(*p!='%') *q++=*p++; strcpy(q,""); q+=sizeof("")-1; strcpy(q,p); strcat(q,""); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HTMLStopType XSD type is seen int HTMLStopType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HTMLStopType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->nothtml_stop=strcpy(malloc(strlen(text)+1),text); loaded_translations[nloaded_translations-1]->html_stop=malloc(sizeof("")+strlen(xmltext)+1+1); strcpy(loaded_translations[nloaded_translations-1]->html_stop,""); strcat(loaded_translations[nloaded_translations-1]->html_stop,xmltext); strcat(loaded_translations[nloaded_translations-1]->html_stop,"\n"); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HTMLTotalType XSD type is seen int HTMLTotalType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HTMLTotalType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->nothtml_total=strcpy(malloc(strlen(text)+1),text); loaded_translations[nloaded_translations-1]->html_total=malloc(sizeof("")+strlen(xmltext)+sizeof("")+sizeof("")+1+1); strcpy(loaded_translations[nloaded_translations-1]->html_total,""); strcat(loaded_translations[nloaded_translations-1]->html_total,""); strcat(loaded_translations[nloaded_translations-1]->html_total,xmltext); strcat(loaded_translations[nloaded_translations-1]->html_total,""); strcat(loaded_translations[nloaded_translations-1]->html_total,"\n"); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the HTMLSubtotalType XSD type is seen int HTMLSubtotalType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int HTMLSubtotalType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->nothtml_subtotal=strcpy(malloc(strlen(text)+1),text); loaded_translations[nloaded_translations-1]->html_subtotal=malloc(sizeof(" [")+strlen(xmltext)+sizeof("]")+1+1); strcpy(loaded_translations[nloaded_translations-1]->html_subtotal," ["); strcat(loaded_translations[nloaded_translations-1]->html_subtotal,xmltext); strcat(loaded_translations[nloaded_translations-1]->html_subtotal,"]"); strcat(loaded_translations[nloaded_translations-1]->html_subtotal,"\n"); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the GPXWaypointType XSD type is seen int GPXWaypointType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *type The contents of the 'type' attribute (or NULL if not defined). const char *string The contents of the 'string' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int GPXWaypointType_function(const char *_tag_,int _type_,const char *type,const char *string) { if(_type_&XMLPARSE_TAG_START && store) { char *xmlstring; XMLPARSE_ASSERT_STRING(_tag_,type); XMLPARSE_ASSERT_STRING(_tag_,string); xmlstring=ParseXML_Encode_Safe_XML(string); if(!strcmp(type,"waypt")) loaded_translations[nloaded_translations-1]->gpx_waypt=strcpy(malloc(strlen(xmlstring)+1),xmlstring); else if(!strcmp(type,"trip")) loaded_translations[nloaded_translations-1]->gpx_trip=strcpy(malloc(strlen(xmlstring)+1),xmlstring); else XMLPARSE_INVALID(_tag_,type); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the GPXDescType XSD type is seen int GPXDescType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int GPXDescType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->gpx_desc=strcpy(malloc(strlen(xmltext)+1),xmltext); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the GPXNameType XSD type is seen int GPXNameType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int GPXNameType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->gpx_name=strcpy(malloc(strlen(xmltext)+1),xmltext); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the GPXStepType XSD type is seen int GPXStepType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int GPXStepType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->gpx_step=strcpy(malloc(strlen(xmltext)+1),xmltext); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the GPXFinalType XSD type is seen int GPXFinalType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *text The contents of the 'text' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int GPXFinalType_function(const char *_tag_,int _type_,const char *text) { if(_type_&XMLPARSE_TAG_START && store) { char *xmltext; XMLPARSE_ASSERT_STRING(_tag_,text); xmltext=ParseXML_Encode_Safe_XML(text); loaded_translations[nloaded_translations-1]->gpx_final=strcpy(malloc(strlen(xmltext)+1),xmltext); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The XML translation parser. int ParseXMLTranslations Returns 0 if OK or something else in case of an error. const char *filename The name of the file to read. const char *lang The abbreviated language name to search for (NULL means first in file). int all Set to true to load all the translations. ++++++++++++++++++++++++++++++++++++++*/ int ParseXMLTranslations(const char *filename,const char *lang,int all) { int fd; int retval; if(!ExistsFile(filename)) return(1); fd=OpenFile(filename); /* Delete the existing translations */ if(nloaded_translations) FreeXMLTranslations(); /* Initialise variables used for parsing */ store_all=all; store_lang=lang; store=0; stored=0; /* Parse the file */ retval=ParseXML(fd,xml_toplevel_tags,XMLPARSE_UNKNOWN_ATTR_ERRNONAME|XMLPARSE_RETURN_ATTR_ENCODED); CloseFile(fd); if(retval) { FreeXMLTranslations(); return(2); } return(0); } /*++++++++++++++++++++++++++++++++++++++ Return a list of the languages that have been loaded from the XML file. char **GetTranslationLanguages Returns a NULL terminated list of strings - all allocated. ++++++++++++++++++++++++++++++++++++++*/ char **GetTranslationLanguages(void) { char **list=calloc(1+nloaded_translations,sizeof(char*)); int i; for(i=0;ilang)+1),loaded_translations[i]->lang); return(list); } /*++++++++++++++++++++++++++++++++++++++ Return a list of the full names of the languages that have been loaded from the XML file. char **GetTranslationLanguageFullNames Returns a NULL terminated list of strings - all allocated. ++++++++++++++++++++++++++++++++++++++*/ char **GetTranslationLanguageFullNames(void) { char **list=calloc(1+nloaded_translations,sizeof(char*)); int i; for(i=0;ilanguage)+1),loaded_translations[i]->language); return(list); } /*++++++++++++++++++++++++++++++++++++++ Get a named translation. Translation *GetTranslation Returns a pointer to the translation. const char *lang The abbreviated name of the language of the translation or NULL to get the default or an empty string to get the first one. ++++++++++++++++++++++++++++++++++++++*/ Translation *GetTranslation(const char *lang) { int i; if(!lang) return(&default_translation); if(!*lang && nloaded_translations>0) return(loaded_translations[0]); for(i=0;ilang,lang)) return(loaded_translations[i]); return(NULL); } /*++++++++++++++++++++++++++++++++++++++ Free the memory that has been allocated for the translations. ++++++++++++++++++++++++++++++++++++++*/ void FreeXMLTranslations() { int i,j; if(!loaded_translations) return; for(i=0;ilang); free(loaded_translations[i]->language); for(j=0;j<2;j++) { if(loaded_translations[i]->raw_copyright_creator[j] != default_translation.raw_copyright_creator[j]) free(loaded_translations[i]->raw_copyright_creator[j]); if(loaded_translations[i]->raw_copyright_source[j] != default_translation.raw_copyright_source[j]) free(loaded_translations[i]->raw_copyright_source[j]); if(loaded_translations[i]->raw_copyright_license[j] != default_translation.raw_copyright_license[j]) free(loaded_translations[i]->raw_copyright_license[j]); if(loaded_translations[i]->xml_copyright_creator[j] != default_translation.xml_copyright_creator[j]) free(loaded_translations[i]->xml_copyright_creator[j]); if(loaded_translations[i]->xml_copyright_source[j] != default_translation.xml_copyright_source[j]) free(loaded_translations[i]->xml_copyright_source[j]); if(loaded_translations[i]->xml_copyright_license[j] != default_translation.xml_copyright_license[j]) free(loaded_translations[i]->xml_copyright_license[j]); } for(j=0;j<9;j++) { if(loaded_translations[i]->xml_heading[j] != default_translation.xml_heading[j]) free(loaded_translations[i]->xml_heading[j]); if(loaded_translations[i]->xml_turn[j] != default_translation.xml_turn[j]) free(loaded_translations[i]->xml_turn[j]); } for(j=0;j<10;j++) if(loaded_translations[i]->xml_ordinal[j] != default_translation.xml_ordinal[j]) free(loaded_translations[i]->xml_ordinal[j]); for(j=0;j<9;j++) { if(loaded_translations[i]->notxml_heading[j] != default_translation.notxml_heading[j]) free(loaded_translations[i]->notxml_heading[j]); if(loaded_translations[i]->notxml_turn[j] != default_translation.notxml_turn[j]) free(loaded_translations[i]->notxml_turn[j]); } for(j=0;j<10;j++) if(loaded_translations[i]->notxml_ordinal[j] != default_translation.notxml_ordinal[j]) free(loaded_translations[i]->notxml_ordinal[j]); for(j=0;jraw_highway[j] != default_translation.raw_highway[j]) free(loaded_translations[i]->raw_highway[j]); if(loaded_translations[i]->xml_route_shortest != default_translation.xml_route_shortest) free(loaded_translations[i]->xml_route_shortest); if(loaded_translations[i]->xml_route_quickest != default_translation.xml_route_quickest) free(loaded_translations[i]->xml_route_quickest); if(loaded_translations[i]->html_waypoint != default_translation.html_waypoint) free(loaded_translations[i]->html_waypoint); if(loaded_translations[i]->html_junction != default_translation.html_junction) free(loaded_translations[i]->html_junction); if(loaded_translations[i]->html_roundabout != default_translation.html_roundabout) free(loaded_translations[i]->html_roundabout); if(loaded_translations[i]->html_title != default_translation.html_title) free(loaded_translations[i]->html_title); if(loaded_translations[i]->html_start != default_translation.html_start) free(loaded_translations[i]->html_start); if(loaded_translations[i]->html_node != default_translation.html_node) free(loaded_translations[i]->html_node); if(loaded_translations[i]->html_rbnode != default_translation.html_rbnode) free(loaded_translations[i]->html_rbnode); if(loaded_translations[i]->html_segment != default_translation.html_segment) free(loaded_translations[i]->html_segment); if(loaded_translations[i]->html_stop != default_translation.html_stop) free(loaded_translations[i]->html_stop); if(loaded_translations[i]->html_total != default_translation.html_total) free(loaded_translations[i]->html_total); if(loaded_translations[i]->html_subtotal!= default_translation.html_subtotal)free(loaded_translations[i]->html_subtotal); if(loaded_translations[i]->nothtml_waypoint != default_translation.nothtml_waypoint) free(loaded_translations[i]->nothtml_waypoint); if(loaded_translations[i]->nothtml_junction != default_translation.nothtml_junction) free(loaded_translations[i]->nothtml_junction); if(loaded_translations[i]->nothtml_roundabout != default_translation.nothtml_roundabout) free(loaded_translations[i]->nothtml_roundabout); if(loaded_translations[i]->nothtml_title != default_translation.nothtml_title) free(loaded_translations[i]->nothtml_title); if(loaded_translations[i]->nothtml_start != default_translation.nothtml_start) free(loaded_translations[i]->nothtml_start); if(loaded_translations[i]->nothtml_node != default_translation.nothtml_node) free(loaded_translations[i]->nothtml_node); if(loaded_translations[i]->nothtml_rbnode != default_translation.nothtml_rbnode) free(loaded_translations[i]->nothtml_rbnode); if(loaded_translations[i]->nothtml_segment != default_translation.nothtml_segment) free(loaded_translations[i]->nothtml_segment); if(loaded_translations[i]->nothtml_stop != default_translation.nothtml_stop) free(loaded_translations[i]->nothtml_stop); if(loaded_translations[i]->nothtml_total != default_translation.nothtml_total) free(loaded_translations[i]->nothtml_total); if(loaded_translations[i]->nothtml_subtotal!= default_translation.nothtml_subtotal)free(loaded_translations[i]->nothtml_subtotal); if(loaded_translations[i]->gpx_desc != default_translation.gpx_desc) free(loaded_translations[i]->gpx_desc); if(loaded_translations[i]->gpx_name != default_translation.gpx_name) free(loaded_translations[i]->gpx_name); if(loaded_translations[i]->gpx_step != default_translation.gpx_step) free(loaded_translations[i]->gpx_step); if(loaded_translations[i]->gpx_final != default_translation.gpx_final) free(loaded_translations[i]->gpx_final); if(loaded_translations[i]->gpx_waypt != default_translation.gpx_waypt) free(loaded_translations[i]->gpx_waypt); if(loaded_translations[i]->gpx_trip != default_translation.gpx_trip) free(loaded_translations[i]->gpx_trip); free(loaded_translations[i]); } free(loaded_translations); loaded_translations=NULL; nloaded_translations=0; } routino-3.4.3/src/functions.h 644 233 144 3117 12725333236 11350 0/*************************************** Header file for miscellaneous function prototypes Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2016 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef FUNCTIONS_H #define FUNCTIONS_H /*+ To stop multiple inclusions. +*/ #include "types.h" #include "profiles.h" #include "translations.h" #include "results.h" #include "routino.h" /* Functions in optimiser.c */ Results *CalculateRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile, index_t start_node,index_t prev_segment,index_t finish_node, int start_waypoint,int finish_waypoint); /* Functions in output.c */ Routino_Output *PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,Translation *translation); #endif /* FUNCTIONS_H */ routino-3.4.3/src/superx.h 644 233 144 2420 12064636364 10666 0/*************************************** Header for super-node and super-segment functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2011 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef SUPERX_H #define SUPERX_H /*+ To stop multiple inclusions. +*/ #include "typesx.h" /* Functions in superx.c */ void ChooseSuperNodes(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx); SegmentsX *CreateSuperSegments(NodesX *nodesx,SegmentsX *segmentsx,WaysX *waysx); SegmentsX *MergeSuperSegments(SegmentsX *segmentsx,SegmentsX *supersegmentsx); #endif /* SUPERX_H */ routino-3.4.3/src/output.c 644 233 144 141236 14672572467 10756 0/*************************************** Routing output generator. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2017, 2019, 2024 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include #include #include "types.h" #include "nodes.h" #include "segments.h" #include "ways.h" #include "relations.h" #include "functions.h" #include "fakes.h" #include "translations.h" #include "results.h" #include "xmlparse.h" #include "routino.h" /*+ To help when debugging +*/ #define DEBUG 0 /* Constants */ #define ROUTINO_POINT_IGNORE -1 /*+ Ignore this point. +*/ /* Global variables */ /*+ The option to calculate the quickest route insted of the shortest. +*/ int option_quickest=0; /*+ The options to select the format of the file output. +*/ int option_file_html=0,option_file_gpx_track=0,option_file_gpx_route=0,option_file_text=0,option_file_text_all=0,option_file_stdout=0; /*+ The options to select the format of the linked list output. +*/ int option_list_html=0,option_list_html_all=0,option_list_text=0,option_list_text_all=0; /* Local variables */ /*+ Heuristics for determining if a junction is important. +*/ static const char junction_other_way[Highway_Count][Highway_Count]= { /* M, T, P, S, T, U, R, S, T, C, P, S, F = Way type of route not taken */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, /* Motorway */ { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, /* Trunk */ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, /* Primary */ { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, /* Secondary */ { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 }, /* Tertiary */ { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1 }, /* Unclassified */ { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 }, /* Residential */ { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 }, /* Service */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1 }, /* Track */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1 }, /* Cycleway */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* Path */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* Steps */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* Ferry */ }; /*++++++++++++++++++++++++++++++++++++++ Print the optimum route between two nodes. Routino_Output *PrintRoute Returns a linked list of data structures representing the route if required. Results **results The set of results to print (consecutive in array even if not consecutive waypoints). int nresults The number of results in the list. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. Profile *profile The profile containing the transport type, speeds and allowed highways. Translation *translation The set of translated strings. ++++++++++++++++++++++++++++++++++++++*/ Routino_Output *PrintRoute(Results **results,int nresults,Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,Translation *translation) { FILE *htmlfile=NULL,*gpxtrackfile=NULL,*gpxroutefile=NULL,*textfile=NULL,*textallfile=NULL; Routino_Output *listhead=NULL,*htmllist=NULL, *textlist=NULL,*textalllist=NULL,*htmlalllist=NULL; char *prev_bearing=NULL,*prev_wayname=NULL,*prev_waynameraw=NULL; index_t prev_node=NO_NODE; distance_t cum_distance=0; duration_t cum_duration=0; int point=0; int point_count=0; int roundabout=0; /* Open the files */ if(option_file_stdout) { if(option_file_html) htmlfile =stdout; if(option_file_gpx_track) gpxtrackfile=stdout; if(option_file_gpx_route) gpxroutefile=stdout; if(option_file_text) textfile =stdout; if(option_file_text_all) textallfile =stdout; } else { #if defined(_MSC_VER) || defined(__MINGW32__) const char *open_mode="wb"; #else const char *open_mode="w"; #endif if(option_quickest==0) { /* Print the result for the shortest route */ if(option_file_html) htmlfile =fopen("shortest.html",open_mode); if(option_file_gpx_track) gpxtrackfile=fopen("shortest-track.gpx",open_mode); if(option_file_gpx_route) gpxroutefile=fopen("shortest-route.gpx",open_mode); if(option_file_text) textfile =fopen("shortest.txt",open_mode); if(option_file_text_all) textallfile =fopen("shortest-all.txt",open_mode); #ifndef LIBROUTINO if(option_file_html && !htmlfile) fprintf(stderr,"Warning: Cannot open file 'shortest.html' for writing [%s].\n",strerror(errno)); if(option_file_gpx_track && !gpxtrackfile) fprintf(stderr,"Warning: Cannot open file 'shortest-track.gpx' for writing [%s].\n",strerror(errno)); if(option_file_gpx_route && !gpxroutefile) fprintf(stderr,"Warning: Cannot open file 'shortest-route.gpx' for writing [%s].\n",strerror(errno)); if(option_file_text && !textfile) fprintf(stderr,"Warning: Cannot open file 'shortest.txt' for writing [%s].\n",strerror(errno)); if(option_file_text_all && !textallfile) fprintf(stderr,"Warning: Cannot open file 'shortest-all.txt' for writing [%s].\n",strerror(errno)); #endif } else { /* Print the result for the quickest route */ if(option_file_html) htmlfile =fopen("quickest.html",open_mode); if(option_file_gpx_track) gpxtrackfile=fopen("quickest-track.gpx",open_mode); if(option_file_gpx_route) gpxroutefile=fopen("quickest-route.gpx",open_mode); if(option_file_text) textfile =fopen("quickest.txt",open_mode); if(option_file_text_all) textallfile =fopen("quickest-all.txt",open_mode); #ifndef LIBROUTINO if(option_file_html && !htmlfile) fprintf(stderr,"Warning: Cannot open file 'quickest.html' for writing [%s].\n",strerror(errno)); if(option_file_gpx_track && !gpxtrackfile) fprintf(stderr,"Warning: Cannot open file 'quickest-track.gpx' for writing [%s].\n",strerror(errno)); if(option_file_gpx_route && !gpxroutefile) fprintf(stderr,"Warning: Cannot open file 'quickest-route.gpx' for writing [%s].\n",strerror(errno)); if(option_file_text && !textfile) fprintf(stderr,"Warning: Cannot open file 'quickest.txt' for writing [%s].\n",strerror(errno)); if(option_file_text_all && !textallfile) fprintf(stderr,"Warning: Cannot open file 'quickest-all.txt' for writing [%s].\n",strerror(errno)); #endif } } /* Print the head of the files */ if(htmlfile) { fprintf(htmlfile,"\n"); fprintf(htmlfile,"\n"); if(translation->xml_copyright_creator[0] && translation->xml_copyright_creator[1]) fprintf(htmlfile,"\n",translation->xml_copyright_creator[0],translation->xml_copyright_creator[1]); if(translation->xml_copyright_source[0] && translation->xml_copyright_source[1]) fprintf(htmlfile,"\n",translation->xml_copyright_source[0],translation->xml_copyright_source[1]); if(translation->xml_copyright_license[0] && translation->xml_copyright_license[1]) fprintf(htmlfile,"\n",translation->xml_copyright_license[0],translation->xml_copyright_license[1]); fprintf(htmlfile,"\n"); fprintf(htmlfile,""); fprintf(htmlfile,translation->html_title,option_quickest?translation->xml_route_quickest:translation->xml_route_shortest); fprintf(htmlfile,"\n"); fprintf(htmlfile,"\n"); fprintf(htmlfile,"\n"); fprintf(htmlfile,"\n"); fprintf(htmlfile,"\n"); fprintf(htmlfile,"

"); fprintf(htmlfile,translation->html_title,option_quickest?translation->xml_route_quickest:translation->xml_route_shortest); fprintf(htmlfile,"

\n"); fprintf(htmlfile,"\n"); } if(gpxtrackfile) { fprintf(gpxtrackfile,"\n"); fprintf(gpxtrackfile,"\n"); fprintf(gpxtrackfile,"\n"); fprintf(gpxtrackfile,"%s : %s\n",translation->xml_copyright_creator[0],translation->xml_copyright_creator[1]); if(translation->xml_copyright_source[1]) { fprintf(gpxtrackfile,"\n",translation->xml_copyright_source[1]); if(translation->xml_copyright_license[1]) fprintf(gpxtrackfile,"%s\n",translation->xml_copyright_license[1]); fprintf(gpxtrackfile,"\n"); } fprintf(gpxtrackfile,"\n"); fprintf(gpxtrackfile,"\n"); fprintf(gpxtrackfile,""); fprintf(gpxtrackfile,translation->gpx_name,option_quickest?translation->xml_route_quickest:translation->xml_route_shortest); fprintf(gpxtrackfile,"\n"); fprintf(gpxtrackfile,""); fprintf(gpxtrackfile,translation->gpx_desc,option_quickest?translation->xml_route_quickest:translation->xml_route_shortest); fprintf(gpxtrackfile,"\n"); } if(gpxroutefile) { fprintf(gpxroutefile,"\n"); fprintf(gpxroutefile,"\n"); fprintf(gpxroutefile,"\n"); fprintf(gpxroutefile,"%s : %s\n",translation->xml_copyright_creator[0],translation->xml_copyright_creator[1]); if(translation->xml_copyright_source[1]) { fprintf(gpxroutefile,"\n",translation->xml_copyright_source[1]); if(translation->xml_copyright_license[1]) fprintf(gpxroutefile,"%s\n",translation->xml_copyright_license[1]); fprintf(gpxroutefile,"\n"); } fprintf(gpxroutefile,"\n"); fprintf(gpxroutefile,"\n"); fprintf(gpxroutefile,""); fprintf(gpxroutefile,translation->gpx_name,option_quickest?translation->xml_route_quickest:translation->xml_route_shortest); fprintf(gpxroutefile,"\n"); fprintf(gpxroutefile,""); fprintf(gpxroutefile,translation->gpx_desc,option_quickest?translation->xml_route_quickest:translation->xml_route_shortest); fprintf(gpxroutefile,"\n"); } if(textfile) { if(translation->raw_copyright_creator[0] && translation->raw_copyright_creator[1]) fprintf(textfile,"# %s : %s\n",translation->raw_copyright_creator[0],translation->raw_copyright_creator[1]); if(translation->raw_copyright_source[0] && translation->raw_copyright_source[1]) fprintf(textfile,"# %s : %s\n",translation->raw_copyright_source[0],translation->raw_copyright_source[1]); if(translation->raw_copyright_license[0] && translation->raw_copyright_license[1]) fprintf(textfile,"# %s : %s\n",translation->raw_copyright_license[0],translation->raw_copyright_license[1]); if((translation->raw_copyright_creator[0] && translation->raw_copyright_creator[1]) || (translation->raw_copyright_source[0] && translation->raw_copyright_source[1]) || (translation->raw_copyright_license[0] && translation->raw_copyright_license[1])) fprintf(textfile,"#\n"); fprintf(textfile,"#Latitude\tLongitude\tSection \tSection \tTotal \tTotal \tPoint\tTurn\tBearing\tHighway\n"); fprintf(textfile,"# \t \tDistance\tDuration\tDistance\tDuration\tType \t \t \t \n"); /* "%10.6f\t%11.6f\t%6.3f km\t%4.1f min\t%5.1f km\t%4.0f min\t%s\t %+d\t %+d\t%s\n" */ } if(textallfile) { if(translation->raw_copyright_creator[0] && translation->raw_copyright_creator[1]) fprintf(textallfile,"# %s : %s\n",translation->raw_copyright_creator[0],translation->raw_copyright_creator[1]); if(translation->raw_copyright_source[0] && translation->raw_copyright_source[1]) fprintf(textallfile,"# %s : %s\n",translation->raw_copyright_source[0],translation->raw_copyright_source[1]); if(translation->raw_copyright_license[0] && translation->raw_copyright_license[1]) fprintf(textallfile,"# %s : %s\n",translation->raw_copyright_license[0],translation->raw_copyright_license[1]); if((translation->raw_copyright_creator[0] && translation->raw_copyright_creator[1]) || (translation->raw_copyright_source[0] && translation->raw_copyright_source[1]) || (translation->raw_copyright_license[0] && translation->raw_copyright_license[1])) fprintf(textallfile,"#\n"); fprintf(textallfile,"#Latitude\tLongitude\t Node\tType\tSegment\tSegment\tTotal\tTotal \tSpeed\tBearing\tHighway\n"); fprintf(textallfile,"# \t \t \t \tDist \tDurat'n\tDist \tDurat'n\t \t \t \n"); /* "%10.6f\t%11.6f\t%8d%c\t%s\t%5.3f\t%5.2f\t%5.2f\t%5.1f\t%3d\t%4d\t%s\n" */ } /* Create the head of the linked list */ if(option_list_html) listhead=htmllist=calloc(1,sizeof(Routino_Output)); if(option_list_html_all) listhead=htmlalllist=htmllist=calloc(1,sizeof(Routino_Output)); if(option_list_text) listhead=textlist=calloc(1,sizeof(Routino_Output)); if(option_list_text_all) listhead=textalllist=calloc(1,sizeof(Routino_Output)); /* Loop through all the sections of the route and print them */ do { int first=1; int next_point=point; distance_t junc_distance=0; duration_t junc_duration=0; Result *result; #if DEBUG printf("Route section %d - waypoint %d to waypoint %d\n",point,results[point]->start_waypoint,results[point]->finish_waypoint); printf(" start_node=%"Pindex_t" prev_segment=%"Pindex_t"\n",results[point]->start_node,results[point]->prev_segment); printf(" finish_node=%"Pindex_t" last_segment=%"Pindex_t"\n",results[point]->finish_node,results[point]->last_segment); Result *r=FindResult(results[point],results[point]->start_node,results[point]->prev_segment); while(r) { printf(" node=%"Pindex_t" segment=%"Pindex_t" score=%f\n",r->node,r->segment,r->score); r=r->next; } #endif result=FindResult(results[point],results[point]->start_node,results[point]->prev_segment); /* Print the start of the segment */ if(gpxtrackfile) fprintf(gpxtrackfile,"\n"); /* Loop through all the points within a section of the route and print them */ do { double latitude,longitude; Node *resultnodep=NULL; index_t realsegment=NO_SEGMENT,next_realsegment=NO_SEGMENT; Segment *resultsegmentp=NULL,*next_resultsegmentp=NULL; Way *resultwayp=NULL,*next_resultwayp=NULL; Result *next_result; int important=ROUTINO_POINT_UNIMPORTANT; distance_t seg_distance=0; duration_t seg_duration=0; speed_t seg_speed=0; char *waynameraw=NULL,*wayname=NULL,*next_waynameraw=NULL,*next_wayname=NULL; int bearing_int=0,turn_int=0,next_bearing_int=0; char *turn=NULL,*turnraw=NULL,*next_bearing=NULL,*next_bearingraw=NULL; /* Calculate the information about this point */ if(IsFakeNode(result->node)) GetFakeLatLong(result->node,&latitude,&longitude); else { resultnodep=LookupNode(nodes,result->node,6); GetLatLong(nodes,result->node,resultnodep,&latitude,&longitude); } /* Calculate the next result */ next_result=result->next; if(!next_result) { next_point++; if(next_pointstart_node,results[next_point]->prev_segment); next_result=next_result->next; } } /* Calculate the information about this segment */ if(!first) /* not first point of a section of the route */ { if(IsFakeSegment(result->segment)) { resultsegmentp=LookupFakeSegment(result->segment); realsegment=IndexRealSegment(result->segment); } else { resultsegmentp=LookupSegment(segments,result->segment,2); realsegment=result->segment; } resultwayp=LookupWay(ways,resultsegmentp->way,1); seg_distance+=DISTANCE(resultsegmentp->distance); seg_duration+=Duration(resultsegmentp,resultwayp,profile); /* Calculate the cumulative distance/duration */ junc_distance+=seg_distance; junc_duration+=seg_duration; cum_distance+=seg_distance; cum_duration+=seg_duration; } /* Calculate the information about the next segment */ if(next_result) { if(IsFakeSegment(next_result->segment)) { next_resultsegmentp=LookupFakeSegment(next_result->segment); next_realsegment=IndexRealSegment(next_result->segment); } else { next_resultsegmentp=LookupSegment(segments,next_result->segment,1); next_realsegment=next_result->segment; } } /* Decide if this is a roundabout */ if(next_result) { next_resultwayp=LookupWay(ways,next_resultsegmentp->way,2); if(next_resultwayp->type&Highway_Roundabout) { if(roundabout==0) { roundabout++; important=ROUTINO_POINT_RB_ENTRY; } else { Segment *segmentp; if(resultnodep) segmentp=FirstSegment(segments,resultnodep,3); else segmentp=FirstFakeSegment(result->node); do { index_t othernode=OtherNode(segmentp,result->node); index_t thissegment; if(IsFakeNode(result->node)) thissegment=IndexFakeSegment(segmentp); else thissegment=IndexSegment(segments,segmentp); if(othernode!=prev_node && othernode!=next_result->node && thissegment!=realsegment && IsNormalSegment(segmentp)) { int canexit=1; if(profile->oneway && IsOnewayTo(segmentp,result->node)) { if(profile->transports!=Transports_Bicycle) canexit=0; else { Way *wayp=LookupWay(ways,segmentp->way,3); if(!(wayp->type&Highway_CycleBothWays)) canexit=0; } } if(canexit) { Way *wayp=LookupWay(ways,segmentp->way,3); if(!(wayp->type&Highway_Roundabout)) { roundabout++; important=ROUTINO_POINT_RB_NOT_EXIT; } } } if(resultnodep) segmentp=NextSegment(segments,segmentp,result->node); else segmentp=NextFakeSegment(segmentp,result->node); } while(segmentp); } } else if(roundabout) { roundabout++; important=ROUTINO_POINT_RB_EXIT; } } /* Decide if this is an important junction */ if(point_count==0) /* first point overall = Waypoint */ important=ROUTINO_POINT_WAYPOINT; else if(result->next==NULL) /* Waypoint */ important=ROUTINO_POINT_WAYPOINT; else if(first) /* first point of a section of the route */ important=ROUTINO_POINT_IGNORE; else if(roundabout) /* roundabout */ ; else if(realsegment==next_realsegment) /* U-turn */ important=ROUTINO_POINT_UTURN; else if(resultnodep && (resultnodep->flags&NODE_MINIRNDBT)) important=ROUTINO_POINT_MINI_RB; /* mini-roundabout */ else if(resultnodep) { Segment *segmentp=FirstSegment(segments,resultnodep,3); do { index_t seg=IndexSegment(segments,segmentp); if(seg!=realsegment && IsNormalSegment(segmentp)) { int cango=1; if(profile->oneway && IsOnewayTo(segmentp,result->node)) { if(profile->transports!=Transports_Bicycle) cango=0; else { Way *wayp=LookupWay(ways,segmentp->way,3); if(!(wayp->type&Highway_CycleBothWays)) cango=0; } } if(profile->turns && IsSuperNode(resultnodep) && IsTurnRestrictedNode(resultnodep)) { index_t turnrelation=FindFirstTurnRelation2(relations,result->node,realsegment); if(turnrelation!=NO_RELATION && !IsTurnAllowed(relations,turnrelation,result->node,realsegment,seg,profile->transports)) cango=0; } if(cango) { Way *wayp=LookupWay(ways,segmentp->way,3); if(seg==next_realsegment) /* the next segment that we follow */ { if(HIGHWAY(wayp->type)!=HIGHWAY(resultwayp->type)) if(importanttype)-1][HIGHWAY(wayp->type)-1]) if(importantnode); } while(segmentp); } /* Calculate the strings to be used */ if(!first && (textallfile || textalllist)) { waynameraw=WayName(ways,resultwayp); if(!*waynameraw) waynameraw=translation->raw_highway[HIGHWAY(resultwayp->type)]; bearing_int=(int)BearingAngle(nodes,resultsegmentp,result->node); seg_speed=profile->speed[HIGHWAY(resultwayp->type)]; } if(next_result && (important>ROUTINO_POINT_JUNCT_CONT || htmlalllist)) { if(!first && (htmlfile || htmllist || textfile || textlist)) { if(DISTANCE(resultsegmentp->distance)==0 || DISTANCE(next_resultsegmentp->distance)==0) turn_int=0; else turn_int=(int)TurnAngle(nodes,resultsegmentp,next_resultsegmentp,result->node); turn =translation->xml_turn[((202+turn_int)/45)%8]; turnraw=translation->notxml_turn[((202+turn_int)/45)%8]; } if(gpxroutefile || htmlfile || htmllist) { next_waynameraw=WayName(ways,next_resultwayp); if(!*next_waynameraw) next_waynameraw=translation->raw_highway[HIGHWAY(next_resultwayp->type)]; next_wayname=ParseXML_Encode_Safe_XML(next_waynameraw); } if(htmlfile || htmllist || gpxroutefile || textfile || textlist) { if(!first && DISTANCE(next_resultsegmentp->distance)==0) next_bearing_int=(int)BearingAngle(nodes,resultsegmentp,result->node); else next_bearing_int=(int)BearingAngle(nodes,next_resultsegmentp,next_result->node); next_bearing =translation->xml_heading[(4+(22+next_bearing_int)/45)%8]; next_bearingraw=translation->notxml_heading[(4+(22+next_bearing_int)/45)%8]; } } /* Print out the important points (junctions / waypoints) */ if(important>ROUTINO_POINT_JUNCT_CONT) { if(htmlfile) { char *type; if(important==ROUTINO_POINT_WAYPOINT) { type=malloc(sizeof("")+strlen(translation->html_waypoint)+1+4+sizeof("")+1); sprintf(type,"%s#%d",translation->html_waypoint, (point_count==0?results[point]->start_waypoint:results[point]->finish_waypoint)); } else if(important==ROUTINO_POINT_MINI_RB) type=translation->html_roundabout; else type=translation->html_junction; if(point_count>0) /* not the first point */ { /* *N*: *latitude* *longitude* */ fprintf(htmlfile,"
Follow *highway name* for *distance* km, *time* min [*distance* km, *time* minutes] */ fprintf(htmlfile,translation->html_segment, (roundabout>1?translation->html_roundabout:prev_wayname), distance_to_km(junc_distance),duration_to_minutes(junc_duration)); fprintf(htmlfile,translation->html_subtotal, distance_to_km(cum_distance),duration_to_minutes(cum_duration)); } /*
%d: %.6f %.6f\n", point_count+1, radians_to_degrees(latitude),radians_to_degrees(longitude)); if(point_count==0) /* first point */ { /*
Start at Waypoint, head *heading* */ fprintf(htmlfile,translation->html_start, type, next_bearing); } else if(next_result) /* middle point */ { if(roundabout>1 && important!=ROUTINO_POINT_WAYPOINT) { /*
leave roundabout, take the *Nth* exit heading *heading* */ fprintf(htmlfile,translation->html_rbnode, translation->html_roundabout, translation->xml_ordinal[roundabout-2], next_bearing); } else { /*
At *waypoint/roundabout/junction*, go *direction* heading *heading* */ fprintf(htmlfile,translation->html_node, type, turn, next_bearing); } } else /* end point */ { /*
Stop at Waypoint */ fprintf(htmlfile,translation->html_stop, type); /*
Total *distance* km, *time* minutes */ fprintf(htmlfile,translation->html_total, distance_to_km(cum_distance),duration_to_minutes(cum_duration)); } if(important==ROUTINO_POINT_WAYPOINT) free(type); } if(htmllist) { int strl; char *type; if(important==ROUTINO_POINT_WAYPOINT) { type=malloc(strlen(translation->nothtml_waypoint)+1+4+1); sprintf(type,"%s#%d",translation->nothtml_waypoint, (point_count==0?results[point]->start_waypoint:results[point]->finish_waypoint)); } else if(important==ROUTINO_POINT_MINI_RB) type=translation->nothtml_roundabout; else type=translation->nothtml_junction; if(point_count>0) /* not the first point */ { /* Follow: *highway name* for *distance* km, *time* min */ strl=strlen(translation->nothtml_segment)+ strlen(roundabout>1?translation->nothtml_roundabout:prev_waynameraw)+8+8+1; htmllist->desc2=malloc(strl); sprintf(htmllist->desc2,translation->nothtml_segment, (roundabout>1?translation->nothtml_roundabout:prev_waynameraw), distance_to_km(junc_distance),duration_to_minutes(junc_duration)); /* *distance* km, *time* minutes */ strl=strlen(translation->nothtml_subtotal)+8+8+1; htmllist->desc3=malloc(strl); sprintf(htmllist->desc3,translation->nothtml_subtotal, distance_to_km(cum_distance),duration_to_minutes(cum_duration)); if(htmlalllist) htmllist=htmlalllist; htmllist->next=calloc(1,sizeof(Routino_Output)); htmllist=htmllist->next; if(htmlalllist) htmlalllist=htmllist; } htmllist->lon=longitude; htmllist->lat=latitude; htmllist->type=important; htmllist->dist=distance_to_km(cum_distance); htmllist->time=duration_to_minutes(cum_duration); if(point_count==0) /* first point */ { /* Start: At Waypoint, head *heading* */ strl=strlen(translation->nothtml_start)+ strlen(type)+strlen(next_bearingraw)+1; htmllist->desc1=malloc(strl); sprintf(htmllist->desc1,translation->nothtml_start, type, next_bearingraw); htmllist->name=strcpy(malloc(strlen(next_waynameraw)+1),next_waynameraw); } else if(next_result) /* middle point */ { if(roundabout>1 && important!=ROUTINO_POINT_WAYPOINT) { /* At: Roundabout, take the *Nth* exit heading *heading* */ strl=strlen(translation->nothtml_rbnode)+ strlen(translation->nothtml_roundabout)+strlen(translation->notxml_ordinal[roundabout-2])+strlen(next_bearingraw)+1; htmllist->desc1=malloc(strl); sprintf(htmllist->desc1,translation->nothtml_rbnode, translation->nothtml_roundabout, translation->notxml_ordinal[roundabout-2], next_bearingraw); } else { /* At: Waypoint/Roundabout/Junction, go *direction* heading *heading* */ strl=strlen(translation->nothtml_node)+ strlen(type)+strlen(turnraw)+strlen(next_bearingraw)+1; htmllist->desc1=malloc(strl); sprintf(htmllist->desc1,translation->nothtml_node, type, turnraw, next_bearingraw); } htmllist->turn=turn_int; htmllist->name=strcpy(malloc(strlen(next_waynameraw)+1),next_waynameraw); } else /* end point */ { /* Stop: At Waypoint */ strl=strlen(translation->nothtml_stop)+ strlen(type)+1; htmllist->desc1=malloc(strl); sprintf(htmllist->desc1,translation->nothtml_stop, type); /* Total: *distance* km, *time* minutes */ strl=strlen(translation->nothtml_total)+8+8+1; htmllist->desc2=malloc(strl); sprintf(htmllist->desc2,translation->nothtml_total, distance_to_km(cum_distance),duration_to_minutes(cum_duration)); htmllist->turn=turn_int; } htmllist->bearing=next_bearing_int; if(important==ROUTINO_POINT_WAYPOINT) free(type); } if(gpxroutefile) { if(point_count>0) /* not first point */ { fprintf(gpxroutefile,""); fprintf(gpxroutefile,translation->gpx_step, prev_bearing, prev_wayname, distance_to_km(junc_distance),duration_to_minutes(junc_duration)); fprintf(gpxroutefile,"\n"); } if(point_count==0) /* first point */ { fprintf(gpxroutefile,"%s%02d\n", radians_to_degrees(latitude),radians_to_degrees(longitude), translation->gpx_waypt,results[point]->start_waypoint); } else if(!next_result) /* end point */ { fprintf(gpxroutefile,"%s%02d\n", radians_to_degrees(latitude),radians_to_degrees(longitude), translation->gpx_waypt,results[point]->finish_waypoint); fprintf(gpxroutefile,""); fprintf(gpxroutefile,translation->gpx_final, distance_to_km(cum_distance),duration_to_minutes(cum_duration)); fprintf(gpxroutefile,"\n"); } else /* middle point */ { if(important==ROUTINO_POINT_WAYPOINT) fprintf(gpxroutefile,"%s%02d\n", radians_to_degrees(latitude),radians_to_degrees(longitude), translation->gpx_waypt,results[point]->finish_waypoint); else fprintf(gpxroutefile,"%s%03d\n", radians_to_degrees(latitude),radians_to_degrees(longitude), translation->gpx_trip,point_count); } } if(textfile) { char *type; if(important==ROUTINO_POINT_WAYPOINT) { type=malloc(sizeof("Waypt")+1+4+1); sprintf(type,"Waypt#%d",(point_count==0?results[point]->start_waypoint:results[point]->finish_waypoint)); } else if(important==ROUTINO_POINT_MINI_RB) type="Mini-RB"; else type="Junct"; if(point_count==0) /* first point */ { fprintf(textfile,"%10.6f\t%11.6f\t%6.3f km\t%4.1f min\t%5.1f km\t%4.0f min\t%s\t\t %+d\t%s\n", radians_to_degrees(latitude),radians_to_degrees(longitude), 0.0,0.0,0.0,0.0, type, ((22+next_bearing_int)/45+4)%8-4, next_waynameraw); } else if(!next_result) /* end point */ { fprintf(textfile,"%10.6f\t%11.6f\t%6.3f km\t%4.1f min\t%5.1f km\t%4.0f min\t%s\t\t\t\n", radians_to_degrees(latitude),radians_to_degrees(longitude), distance_to_km(junc_distance),duration_to_minutes(junc_duration), distance_to_km(cum_distance),duration_to_minutes(cum_duration), type); } else /* middle point */ { fprintf(textfile,"%10.6f\t%11.6f\t%6.3f km\t%4.1f min\t%5.1f km\t%4.0f min\t%s\t %+d\t %+d\t%s\n", radians_to_degrees(latitude),radians_to_degrees(longitude), distance_to_km(junc_distance),duration_to_minutes(junc_duration), distance_to_km(cum_distance),duration_to_minutes(cum_duration), type, (22+turn_int)/45, ((22+next_bearing_int)/45+4)%8-4, next_waynameraw); } if(important==ROUTINO_POINT_WAYPOINT) free(type); } if(textlist) { textlist->lon=longitude; textlist->lat=latitude; textlist->type=important; if(point_count==0) /* first point */ { textlist->next=calloc(1,sizeof(Routino_Output)); textlist->bearing=next_bearing_int; textlist->name=strcpy(malloc(strlen(next_waynameraw)+1),next_waynameraw); } else if(!next_result) /* end point */ { textlist->next=NULL; textlist->dist=distance_to_km(cum_distance); textlist->time=duration_to_minutes(cum_duration); } else /* middle point */ { textlist->next=calloc(1,sizeof(Routino_Output)); textlist->dist=distance_to_km(cum_distance); textlist->time=duration_to_minutes(cum_duration); textlist->turn=turn_int; textlist->bearing=next_bearing_int; textlist->name=strcpy(malloc(strlen(next_waynameraw)+1),next_waynameraw); } textlist=textlist->next; } junc_distance=0; junc_duration=0; if(htmlfile || htmllist || gpxroutefile) { if(prev_wayname) free(prev_wayname); if(next_wayname) prev_wayname=strcpy((char*)malloc(strlen(next_wayname)+1),next_wayname); else prev_wayname=NULL; if(prev_waynameraw) free(prev_waynameraw); if(next_waynameraw) prev_waynameraw=strcpy((char*)malloc(strlen(next_waynameraw)+1),next_waynameraw); else prev_waynameraw=NULL; } if(gpxroutefile) prev_bearing=next_bearing; if(roundabout>1) roundabout=0; } else { if(htmlalllist) { htmlalllist->next=calloc(1,sizeof(Routino_Output)); htmlalllist=htmlalllist->next; htmlalllist->lon=longitude; htmlalllist->lat=latitude; htmlalllist->type=important; htmlalllist->dist=distance_to_km(cum_distance); htmlalllist->time=duration_to_minutes(cum_duration); htmlalllist->turn=turn_int; htmlalllist->bearing=next_bearing_int; } } /* Print out all of the results */ if(gpxtrackfile) fprintf(gpxtrackfile,"\n", radians_to_degrees(latitude),radians_to_degrees(longitude)); if(important>ROUTINO_POINT_IGNORE) { if(textallfile) { char *type; if(important==ROUTINO_POINT_WAYPOINT) { type=malloc(sizeof("Waypt")+1+4+1); sprintf(type,"Waypt#%d",(point_count==0?results[point]->start_waypoint:results[point]->finish_waypoint)); } else if(important==ROUTINO_POINT_UTURN) type="U-turn"; else if(important==ROUTINO_POINT_MINI_RB) type="Mini-RB"; else if(important==ROUTINO_POINT_CHANGE) type="Change"; else if(important==ROUTINO_POINT_JUNCT_CONT || important==ROUTINO_POINT_RB_NOT_EXIT) type="Junct-"; else if(important==ROUTINO_POINT_UNIMPORTANT) type="Inter"; else type="Junct"; if(point_count==0) /* first point */ { if(IsFakeNode(result->node)) fprintf(textallfile,"%10.6f\t%11.6f\t%8"PRId32"%c\t%s\t%5.3f\t%5.2f\t%5.2f\t%5.1f\t\t\t\n", radians_to_degrees(latitude),radians_to_degrees(longitude), (int32_t)((NODE_FAKE-result->node)), ' ',type, 0.0,0.0,0.0,0.0); else fprintf(textallfile,"%10.6f\t%11.6f\t%8"Pindex_t"%c\t%s\t%5.3f\t%5.2f\t%5.2f\t%5.1f\t\t\t\n", radians_to_degrees(latitude),radians_to_degrees(longitude), result->node, (resultnodep && IsSuperNode(resultnodep))?'*':' ',type, 0.0,0.0,0.0,0.0); } else /* not the first point */ { if(IsFakeNode(result->node)) fprintf(textallfile,"%10.6f\t%11.6f\t%8"PRId32"%c\t%s\t%5.3f\t%5.2f\t%5.2f\t%5.1f\t%3d\t%4d\t%s\n", radians_to_degrees(latitude),radians_to_degrees(longitude), (int32_t)(NODE_FAKE-result->node), ' ',type, distance_to_km(seg_distance),duration_to_minutes(seg_duration), distance_to_km(cum_distance),duration_to_minutes(cum_duration), speed_to_kph(seg_speed), bearing_int, waynameraw); else fprintf(textallfile,"%10.6f\t%11.6f\t%8"Pindex_t"%c\t%s\t%5.3f\t%5.2f\t%5.2f\t%5.1f\t%3d\t%4d\t%s\n", radians_to_degrees(latitude),radians_to_degrees(longitude), result->node, (resultnodep && IsSuperNode(resultnodep))?'*':' ',type, distance_to_km(seg_distance),duration_to_minutes(seg_duration), distance_to_km(cum_distance),duration_to_minutes(cum_duration), speed_to_kph(seg_speed), bearing_int, waynameraw); } if(important==ROUTINO_POINT_WAYPOINT) free(type); } if(textalllist) { if(point_count==0) /* first point */ ; else /* not the first point */ { textalllist->next=calloc(1,sizeof(Routino_Output)); textalllist=textalllist->next; textalllist->dist=distance_to_km(cum_distance); textalllist->time=duration_to_minutes(cum_duration); textalllist->speed=speed_to_kph(seg_speed); textalllist->bearing=next_bearing_int; textalllist->name=strcpy(malloc(strlen(waynameraw)+1),waynameraw); } textalllist->lon=longitude; textalllist->lat=latitude; textalllist->type=important; } } if(wayname && wayname!=waynameraw) free(wayname); result=next_result; if(important>ROUTINO_POINT_JUNCT_CONT) point_count++; first=0; } while(point==next_point); /* Print the end of the segment */ if(gpxtrackfile) fprintf(gpxtrackfile,"\n"); point=next_point; if(result) prev_node=result->node; else prev_node=NO_NODE; } while(point\n"); if((translation->xml_copyright_creator[0] && translation->xml_copyright_creator[1]) || (translation->xml_copyright_source[0] && translation->xml_copyright_source[1]) || (translation->xml_copyright_license[0] && translation->xml_copyright_license[1])) { fprintf(htmlfile,"

\n"); fprintf(htmlfile,"\n"); if(translation->xml_copyright_creator[0] && translation->xml_copyright_creator[1]) fprintf(htmlfile,"
%s:%s\n",translation->xml_copyright_creator[0],translation->xml_copyright_creator[1]); if(translation->xml_copyright_source[0] && translation->xml_copyright_source[1]) fprintf(htmlfile,"
%s:%s\n",translation->xml_copyright_source[0],translation->xml_copyright_source[1]); if(translation->xml_copyright_license[0] && translation->xml_copyright_license[1]) fprintf(htmlfile,"
%s:%s\n",translation->xml_copyright_license[0],translation->xml_copyright_license[1]); fprintf(htmlfile,"
\n"); } fprintf(htmlfile,"\n"); fprintf(htmlfile,"\n"); } if(gpxtrackfile) { fprintf(gpxtrackfile,"\n"); fprintf(gpxtrackfile,"\n"); } if(gpxroutefile) { fprintf(gpxroutefile,"\n"); fprintf(gpxroutefile,"\n"); } /* Close the files */ if(!option_file_stdout) { if(htmlfile) fclose(htmlfile); if(gpxtrackfile) fclose(gpxtrackfile); if(gpxroutefile) fclose(gpxroutefile); if(textfile) fclose(textfile); if(textallfile) fclose(textallfile); } return(listhead); } routino-3.4.3/src/xmlparse.h 644 233 144 10145 12563633052 11211 0/*************************************** A simple XML parser Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef XMLPARSE_H #define XMLPARSE_H /*+ To stop multiple inclusions. +*/ #include #include /*+ The maximum number of attributes per tag. +*/ #define XMLPARSE_MAX_ATTRS 16 /*+ The maximum number of subtags per tag. +*/ #define XMLPARSE_MAX_SUBTAGS 16 /*+ A flag to indicate the start and/or end of a tag. +*/ #define XMLPARSE_TAG_START 1 #define XMLPARSE_TAG_END 2 /*+ A forward definition of the xmltag +*/ typedef struct _xmltag xmltag; /*+ A structure to hold the definition of a tag. +*/ struct _xmltag { const char * const name; /*+ The name of the tag - must be in lower case. +*/ const int nattributes; /*+ The number of valid attributes for the tag. +*/ const char * const attributes[XMLPARSE_MAX_ATTRS]; /*+ The valid attributes for the tag. +*/ int (*callback)(); /*+ The callback function when the tag is seen. +*/ const xmltag * const subtags[XMLPARSE_MAX_SUBTAGS]; /*+ The list of valid tags contained within this one (null terminated). +*/ }; /* XML Parser options */ #define XMLPARSE_UNKNOWN_ATTRIBUTES 0x0003 #define XMLPARSE_UNKNOWN_ATTR_ERROR 0x0000 /* Flag an error and exit. */ #define XMLPARSE_UNKNOWN_ATTR_ERRNONAME 0x0001 /* Flag an error and exit unless a namespace is specified. */ #define XMLPARSE_UNKNOWN_ATTR_WARN 0x0002 /* Warn about the problem and continue. */ #define XMLPARSE_UNKNOWN_ATTR_IGNORE 0x0003 /* Ignore the potential problem. */ #define XMLPARSE_RETURN_ATTR_ENCODED 0x0004 /* Return the XML attribute strings without decoding them. */ /* XML parser functions */ int ParseXML(int fd,const xmltag * const *tags,int options); uint64_t ParseXML_LineNumber(void); void ParseXML_SetError(const char *format, ...); char *ParseXML_GetError(void); char *ParseXML_Decode_Entity_Ref(const char *string); char *ParseXML_Decode_Char_Ref(const char *string); char *ParseXML_Encode_Safe_XML(const char *string); int ParseXML_IsInteger(const char *string); int ParseXML_IsFloating(const char *string); /* Macros to simplify the callback functions */ #define XMLPARSE_MESSAGE(tag,message) \ do \ { \ ParseXML_SetError(message " in <%s> tag.",tag); \ return(1); \ } \ while(0) #define XMLPARSE_INVALID(tag,attribute) \ do \ { \ ParseXML_SetError("Invalid value for '" #attribute "' attribute in <%s> tag.",tag); \ return(1); \ } \ while(0) #define XMLPARSE_ASSERT_STRING(tag,attribute) \ do \ { \ if(!attribute) \ { \ ParseXML_SetError("'" #attribute "' attribute must be specified in <%s> tag.",tag); \ return(1); \ } \ } \ while(0) #define XMLPARSE_ASSERT_INTEGER(tag,attribute) \ do \ { \ if(!attribute || !*attribute || !ParseXML_IsInteger(attribute)) \ { \ ParseXML_SetError("'" #attribute "' attribute must be a integer in <%s> tag.",tag); \ return(1); \ } \ } \ while(0) #define XMLPARSE_ASSERT_FLOATING(tag,attribute) \ do \ { \ if(!attribute || !*attribute || !ParseXML_IsFloating(attribute)) \ { \ ParseXML_SetError("'" #attribute "' attribute must be a number in <%s> tag.",tag); \ return(1); \ } \ } \ while(0) #endif /* XMLPARSE_H */ routino-3.4.3/src/tagging.h 644 233 144 5110 12153161715 10747 0/*************************************** The data types for the tagging rules. Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2013 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef TAGGING_H #define TAGGING_H /*+ To stop multiple inclusions. +*/ #include /* Data types */ typedef struct _TaggingRuleList TaggingRuleList; /*+ A structure to contain the tagging rule/action. +*/ typedef struct _TaggingRule { int action; /*+ A flag to indicate the type of action. +*/ char *k; /*+ The tag key (or NULL). +*/ char *v; /*+ The tag value (or NULL). +*/ char *message; /*+ The message string for logerror (or NULL). +*/ TaggingRuleList *rulelist; /*+ The sub-rules belonging to this rule. +*/ } TaggingRule; /*+ A structure to contain the list of rules and associated information. +*/ struct _TaggingRuleList { TaggingRule *rules; /*+ The array of rules. +*/ int nrules; /*+ The number of rules. +*/ }; /*+ A structure to hold a list of tags to be processed. +*/ typedef struct _TagList { int ntags; /*+ The number of tags. +*/ char **k; /*+ The list of tag keys. +*/ char **v; /*+ The list of tag values. +*/ } TagList; /* Functions in tagging.c */ int ParseXMLTaggingRules(const char *filename); void DeleteXMLTaggingRules(void); TagList *NewTagList(void); void DeleteTagList(TagList *tags); void AppendTag(TagList *tags,const char *k,const char *v); void ModifyTag(TagList *tags,const char *k,const char *v); void DeleteTag(TagList *tags,const char *k); char *StringifyTag(TagList *tags); TagList *ApplyNodeTaggingRules(TagList *tags,int64_t id); TagList *ApplyWayTaggingRules(TagList *tags,int64_t id); TagList *ApplyRelationTaggingRules(TagList *tags,int64_t id); #endif /* TAGGING_H */ routino-3.4.3/src/fakes.h 644 233 144 3742 12563633051 10433 0/*************************************** Header file for fake node and segment function prototypes Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef FAKES_H #define FAKES_H /*+ To stop multiple inclusions. +*/ #include "types.h" /* Macros */ /*+ Return true if this is a fake node. +*/ #define IsFakeNode(xxx) ((xxx)>=NODE_FAKE && (xxx)!=NO_NODE) /*+ Return true if this is a fake segment. +*/ #define IsFakeSegment(xxx) ((xxx)>=SEGMENT_FAKE && (xxx)!=NO_SEGMENT) /* Functions in fakes.c */ index_t CreateFakes(Nodes *nodes,Segments *segments,int point,Segment *segmentp,index_t node1,index_t node2,distance_t dist1,distance_t dist2); index_t CreateFakeNullSegment(Segments *segments,index_t node,index_t segment,int point); void DeleteFakeNodes(void); void GetFakeLatLong(index_t fakenode, double *latitude,double *longitude); Segment *FirstFakeSegment(index_t fakenode); Segment *NextFakeSegment(Segment *fakesegmentp,index_t fakenode); Segment *ExtraFakeSegment(index_t realnode,index_t fakenode); Segment *LookupFakeSegment(index_t index); index_t IndexFakeSegment(Segment *fakesegmentp); index_t IndexRealSegment(index_t fakesegment); int IsFakeUTurn(index_t fakesegment1,index_t fakesegment2); #endif /* FAKES_H */ routino-3.4.3/src/optimiser.c 644 233 144 203473 14664377416 11431 0/*************************************** Routing optimiser. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2017, 2019, 2024 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include "types.h" #include "nodes.h" #include "segments.h" #include "ways.h" #include "relations.h" #include "logging.h" #include "functions.h" #include "fakes.h" #include "results.h" #ifdef LIBROUTINO #include "routino.h" /*+ The function to be called to report on the routing progress. +*/ extern Routino_ProgressFunc progress_func; /*+ The current state of the routing progress. +*/ extern double progress_value; /*+ Set when the progress callback returns false in the routing function. +*/ extern int progress_abort; #endif /*+ To help when debugging +*/ #define DEBUG 0 /* Global variables */ /*+ The option not to print any progress information. +*/ extern int option_quiet; /*+ The option to calculate the quickest route insted of the shortest. +*/ extern int option_quickest; /* Local functions */ static Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t start_node,index_t prev_segment,index_t finish_node); static Results *FindMiddleRoute(Nodes *supernodes,Segments *supersegments,Ways *superways,Relations *relations,Profile *profile,Results *begin,Results *end); static index_t FindSuperSegment(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t finish_node,index_t finish_segment); static Results *FindSuperRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t start_node,index_t finish_node); static Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t start_node,index_t prev_segment,index_t finish_node); static Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t finish_node); static Results *CombineRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,Results *begin,Results *middle,Results *end); static void FixForwardRoute(Results *results,Result *finish_result); #if DEBUG static void print_debug_route(Nodes *nodes,Segments *segments,Results *results,Result *first,int indent,int direction); #endif /*++++++++++++++++++++++++++++++++++++++ Find a complete route from a specified node to another node. Results *CalculateRoute Returns a set of results. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. Profile *profile The profile containing the transport type, speeds and allowed highways. index_t start_node The start node. index_t prev_segment The previous segment before the start node. index_t finish_node The finish node. int start_waypoint The starting waypoint. int finish_waypoint The finish waypoint. ++++++++++++++++++++++++++++++++++++++*/ Results *CalculateRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile, index_t start_node,index_t prev_segment,index_t finish_node, int start_waypoint,int finish_waypoint) { Results *complete=NULL; /* A special case if the first and last nodes are the same */ if(start_node==finish_node) { index_t fake_segment; Result *result1,*result2; complete=NewResultsList(8); if(prev_segment==NO_SEGMENT) { double lat,lon; distance_t distmin,dist1,dist2; index_t node1,node2; GetLatLong(nodes,start_node,NULL,&lat,&lon); prev_segment=FindClosestSegment(nodes,segments,ways,lat,lon,1,profile,&distmin,&node1,&node2,&dist1,&dist2); } if(IsFakeSegment(prev_segment)) prev_segment=IndexRealSegment(prev_segment); fake_segment=CreateFakeNullSegment(segments,start_node,prev_segment,finish_waypoint); result1=InsertResult(complete,start_node,prev_segment); result2=InsertResult(complete,finish_node,fake_segment); result1->next=result2; complete->start_node=start_node; complete->prev_segment=prev_segment; complete->finish_node=finish_node; complete->last_segment=fake_segment; } else { Results *begin; /* Calculate the beginning of the route */ begin=FindStartRoutes(nodes,segments,ways,relations,profile,start_node,prev_segment,finish_node); if(begin) { /* Check if the end of the route was reached */ if(begin->finish_node!=NO_NODE) complete=begin; } else { if(prev_segment!=NO_SEGMENT) { /* Try again but allow a U-turn at the start waypoint - this solves the problem of facing a dead-end that contains no super-nodes. */ prev_segment=NO_SEGMENT; begin=FindStartRoutes(nodes,segments,ways,relations,profile,start_node,prev_segment,finish_node); } if(begin) { /* Check if the end of the route was reached */ if(begin->finish_node!=NO_NODE) complete=begin; } else { #ifndef LIBROUTINO fprintf(stderr,"Error: Cannot find initial section of route compatible with profile.\n"); #endif return(NULL); } } /* Calculate the rest of the route */ if(!complete) { Results *middle,*end; /* Calculate the end of the route */ end=FindFinishRoutes(nodes,segments,ways,relations,profile,finish_node); if(!end) { #ifndef LIBROUTINO fprintf(stderr,"Error: Cannot find final section of route compatible with profile.\n"); #endif return(NULL); } /* Calculate the middle of the route */ middle=FindMiddleRoute(nodes,segments,ways,relations,profile,begin,end); if(!middle && prev_segment!=NO_SEGMENT) { /* Try again but allow a U-turn at the start waypoint - this solves the problem of facing a dead-end that contains some super-nodes. */ FreeResultsList(begin); begin=FindStartRoutes(nodes,segments,ways,relations,profile,start_node,NO_SEGMENT,finish_node); if(begin) middle=FindMiddleRoute(nodes,segments,ways,relations,profile,begin,end); } if(!middle) { #ifndef LIBROUTINO fprintf(stderr,"Error: Cannot find super-route compatible with profile.\n"); #endif return(NULL); } complete=CombineRoutes(nodes,segments,ways,relations,profile,begin,middle,end); if(!complete) { #ifndef LIBROUTINO fprintf(stderr,"Error: Cannot create combined route following super-route.\n"); #endif return(NULL); } FreeResultsList(begin); FreeResultsList(middle); FreeResultsList(end); } } complete->start_waypoint=start_waypoint; complete->finish_waypoint=finish_waypoint; #if DEBUG printf("The final route is:\n"); print_debug_route(nodes,segments,complete,NULL,2,+1); #endif return(complete); } /*++++++++++++++++++++++++++++++++++++++ Find the optimum route between two nodes not passing through a super-node. Results *FindNormalRoute Returns a set of results. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. Profile *profile The profile containing the transport type, speeds and allowed highways. index_t start_node The start node. index_t prev_segment The previous segment before the start node. index_t finish_node The finish node. ++++++++++++++++++++++++++++++++++++++*/ static Results *FindNormalRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t start_node,index_t prev_segment,index_t finish_node) { Results *results; Queue *queue; score_t total_score; double finish_lat,finish_lon; Result *start_result,*finish_result; Result *result1,*result2; int force_uturn=0; #if DEBUG printf(" FindNormalRoute(...,start_node=%"Pindex_t" prev_segment=%"Pindex_t" finish_node=%"Pindex_t")\n",start_node,prev_segment,finish_node); #endif /* Set up the finish conditions */ total_score=INF_SCORE; finish_result=NULL; if(IsFakeNode(finish_node)) GetFakeLatLong(finish_node,&finish_lat,&finish_lon); else GetLatLong(nodes,finish_node,NULL,&finish_lat,&finish_lon); /* Create the list of results and insert the first node into the queue */ results=NewResultsList(8); queue=NewQueueList(8); start_result=InsertResult(results,start_node,prev_segment); InsertInQueue(queue,start_result,0); /* Check for barrier at start waypoint - must perform U-turn */ if(prev_segment!=NO_SEGMENT && !IsFakeNode(start_node)) { Node *startp=LookupNode(nodes,start_node,1); if(!(startp->allow&profile->transports)) force_uturn=1; } /* Loop across all nodes in the queue */ while((result1=PopFromQueue(queue))) { Node *node1p=NULL; Segment *segment2p; index_t node1,seg1,seg1r; index_t turnrelation=NO_RELATION; /* score must be better than current best score */ if(result1->score>=total_score) continue; node1=result1->node; seg1=result1->segment; if(IsFakeSegment(seg1)) seg1r=IndexRealSegment(seg1); else seg1r=seg1; if(!IsFakeNode(node1)) node1p=LookupNode(nodes,node1,1); /* lookup if a turn restriction applies */ if(profile->turns && node1p && IsTurnRestrictedNode(node1p)) turnrelation=FindFirstTurnRelation2(relations,node1,seg1r); /* Loop across all segments */ if(IsFakeNode(node1)) segment2p=FirstFakeSegment(node1); else segment2p=FirstSegment(segments,node1p,1); while(segment2p) { Node *node2p=NULL; Way *way2p; index_t node2,seg2,seg2r; score_t segment_pref,segment_score,cumulative_score; int i; node2=OtherNode(segment2p,node1); /* need this here because we use node2 at the end of the loop */ /* must be a normal segment */ if(!IsNormalSegment(segment2p)) goto endloop; /* must obey one-way restrictions (unless profile allows) */ if(profile->oneway && IsOnewayTo(segment2p,node1)) { if(profile->transports!=Transports_Bicycle) goto endloop; way2p=LookupWay(ways,segment2p->way,1); if(!(way2p->type&Highway_CycleBothWays)) goto endloop; } if(IsFakeNode(node1) || IsFakeNode(node2)) { seg2 =IndexFakeSegment(segment2p); seg2r=IndexRealSegment(seg2); } else { seg2 =IndexSegment(segments,segment2p); seg2r=seg2; } /* must perform U-turn in special cases */ if(force_uturn && node1==start_node) { if(seg2r!=result1->segment) goto endloop; } else /* must not perform U-turn (unless profile allows) */ if(profile->turns && (seg1==seg2 || seg1==seg2r || seg1r==seg2 || (seg1r==seg2r && IsFakeUTurn(seg1,seg2)))) goto endloop; /* must obey turn relations */ if(turnrelation!=NO_RELATION && !IsTurnAllowed(relations,turnrelation,node1,seg1r,seg2r,profile->transports)) goto endloop; if(!IsFakeNode(node2)) node2p=LookupNode(nodes,node2,2); /* must not pass over super-node */ if(node2!=finish_node && node2p && IsSuperNode(node2p)) goto endloop; way2p=LookupWay(ways,segment2p->way,1); /* mode of transport must be allowed on the highway */ if(!(way2p->allow&profile->transports)) goto endloop; /* must obey weight restriction (if exists) */ if(way2p->weight && way2p->weightweight) goto endloop; /* must obey height/width/length restriction (if exist) */ if((way2p->height && way2p->heightheight) || (way2p->width && way2p->width width ) || (way2p->length && way2p->lengthlength)) goto endloop; segment_pref=profile->highway[HIGHWAY(way2p->type)]; /* highway preferences must allow this highway */ if(segment_pref==0) goto endloop; for(i=1;ifile.properties & PROPERTIES(i)) { if(way2p->props & PROPERTIES(i)) segment_pref*=profile->props_yes[i]; else segment_pref*=profile->props_no[i]; } /* profile preferences must allow this highway */ if(segment_pref==0) goto endloop; /* mode of transport must be allowed through node2 unless it is the final node */ if(node2p && node2!=finish_node && !(node2p->allow&profile->transports)) goto endloop; /* calculate the score for the segment and cumulative */ if(option_quickest==0) segment_score=(score_t)DISTANCE(segment2p->distance)/segment_pref; else segment_score=(score_t)Duration(segment2p,way2p,profile)/segment_pref; cumulative_score=result1->score+segment_score; /* score must be better than current best score */ if(cumulative_score>=total_score) goto endloop; /* find whether the node/segment combination already exists */ result2=FindResult(results,node2,seg2); if(!result2) /* New end node/segment combination */ { result2=InsertResult(results,node2,seg2); result2->prev=result1; result2->score=cumulative_score; } else if(cumulative_scorescore) /* New score for end node/segment combination is better */ { result2->prev=result1; result2->score=cumulative_score; result2->segment=seg2; } else goto endloop; if(node2==finish_node) { total_score=cumulative_score; finish_result=result2; } else InsertInQueue(queue,result2,result2->score); endloop: if(IsFakeNode(node1)) segment2p=NextFakeSegment(segment2p,node1); else if(IsFakeNode(node2)) segment2p=NULL; /* cannot call NextSegment() with a fake segment */ else { segment2p=NextSegment(segments,segment2p,node1); if(!segment2p && IsFakeNode(finish_node)) segment2p=ExtraFakeSegment(node1,finish_node); } } } FreeQueueList(queue); /* Check it worked */ if(!finish_result) { #if DEBUG printf(" Failed\n"); #endif FreeResultsList(results); return(NULL); } /* Turn the route round and fill in the start and finish information */ FixForwardRoute(results,finish_result); results->start_node =start_result->node; results->prev_segment=start_result->segment; results->finish_node =finish_result->node; results->last_segment=finish_result->segment; #if DEBUG printf(" -------- normal route (between super-nodes)\n"); print_debug_route(nodes,segments,results,NULL,6,+1); #endif return(results); } /*++++++++++++++++++++++++++++++++++++++ Find the optimum route between two nodes where the start and end are a set of pre/post-routed super-nodes. Results *FindMiddleRoute Returns a set of results. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. Profile *profile The profile containing the transport type, speeds and allowed highways. Results *begin The initial portion of the route. Results *end The final portion of the route. ++++++++++++++++++++++++++++++++++++++*/ static Results *FindMiddleRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,Results *begin,Results *end) { Results *results; Queue *fwd_queue,*rev_queue; Result *start_result,*finish_result; score_t total_score; double start_lat,start_lon; double finish_lat,finish_lon; Result *result1,*result2; int force_uturn=0; #ifdef LIBROUTINO int loopcount=0; #endif #if DEBUG printf(" FindMiddleRoute(...,[begin has %d nodes],[end has %d nodes])\n",begin->number,end->number); #endif #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_first("Finding Middle Route: Super-Nodes checked = 0"); #endif /* Set up the finish conditions */ total_score=INF_SCORE; start_result=NULL; finish_result=NULL; if(IsFakeNode(begin->start_node)) GetFakeLatLong(begin->start_node,&start_lat,&start_lon); else GetLatLong(nodes,begin->start_node,NULL,&start_lat,&start_lon); if(IsFakeNode(end->finish_node)) GetFakeLatLong(end->finish_node,&finish_lat,&finish_lon); else GetLatLong(nodes,end->finish_node,NULL,&finish_lat,&finish_lon); /* Create the list of results and queues */ results=NewResultsList(20); fwd_queue=NewQueueList(12); rev_queue=NewQueueList(12); /* Insert the finish points of the beginning part of the path into the results, translating the segments into super-segments. */ if(begin->number==1) { index_t superseg=NO_SEGMENT; if(begin->prev_segment!=NO_SEGMENT) superseg=FindSuperSegment(nodes,segments,ways,relations,profile,begin->start_node,begin->prev_segment); start_result=InsertResult(results,begin->start_node,superseg); InsertInQueue(fwd_queue,start_result,0); /* Check for barrier at start waypoint - must perform U-turn */ if(superseg!=NO_SEGMENT) { Node *startp=LookupNode(nodes,begin->start_node,1); if(!(startp->allow&profile->transports)) force_uturn=1; } } else { Result *begin_result=FirstResult(begin); Result *end_result; while((begin_result=NextResult(begin,begin_result))) { if(!IsFakeNode(begin_result->node) && IsSuperNode(LookupNode(nodes,begin_result->node,3))) { index_t superseg=FindSuperSegment(nodes,segments,ways,relations,profile,begin_result->node,begin_result->segment); if(superseg!=begin_result->segment) { result1=InsertResult(results,begin_result->node,begin_result->segment); result1->score=begin_result->score; } else result1=NO_RESULT; result2=FindResult(results,begin_result->node,superseg); if(!result2) /* New end node/super-segment pair */ { result2=InsertResult(results,begin_result->node,superseg); result2->prev=result1; result2->score=begin_result->score; } else if(begin_result->scorescore) /* New end node/super-segment pair is better */ { result2->prev=result1; result2->score=begin_result->score; } else continue; if((end_result=FindResult(end,result2->node,result2->segment))) { if((result2->score+end_result->score)score+end_result->score; start_result=finish_result=result2; } } } } /* Insert the start points of the beginning part of the path into the queue */ if(!finish_result) { Result *result=FirstResult(results); while(result) { if(result->prev) InsertInQueue(fwd_queue,result,result->score); result=NextResult(results,result); } } /* Insert the start points of the end part of the path into the queue */ if(!finish_result) { end_result=FirstResult(end); while(end_result) { if(!IsFakeNode(end_result->node) && IsSuperNode(LookupNode(nodes,end_result->node,3))) { result1=InsertResult(results,end_result->node,end_result->segment); result1->next=NO_RESULT; result1->score=end_result->score; InsertInQueue(rev_queue,result1,0); } end_result=NextResult(end,end_result); } } } /* Loop across all nodes in the two queues, alternating between them */ while(1) { int queue1_empty=0,queue2_empty=0; /* Forward queue */ if((result1=PopFromQueue(fwd_queue))) { Node *node1p; Segment *segment2p; index_t node1,seg1; index_t turnrelation=NO_RELATION; /* score must be better than current best score */ if(result1->score>=total_score) continue; node1=result1->node; seg1=result1->segment; node1p=LookupNode(nodes,node1,1); /* node1 cannot be a fake node (must be a super-node) */ /* lookup if a turn restriction applies */ if(profile->turns && IsTurnRestrictedNode(node1p)) /* node1 cannot be a fake node (must be a super-node) */ turnrelation=FindFirstTurnRelation2(relations,node1,seg1); /* Loop across all segments */ segment2p=FirstSegment(segments,node1p,1); /* node1 cannot be a fake node (must be a super-node) */ while(segment2p) { Node *node2p; Way *way2p; index_t node2,seg2; score_t segment_pref,segment_score,cumulative_score,potential_score; double lat,lon; distance_t direct; int i; /* must be a super segment */ if(!IsSuperSegment(segment2p)) goto endloop_fwd; /* must obey one-way restrictions (unless profile allows) */ if(profile->oneway && IsOnewayTo(segment2p,node1)) { if(profile->transports!=Transports_Bicycle) goto endloop_fwd; way2p=LookupWay(ways,segment2p->way,1); if(!(way2p->type&Highway_CycleBothWays)) goto endloop_fwd; } seg2=IndexSegment(segments,segment2p); /* segment cannot be a fake segment (must be a super-segment) */ /* must perform U-turn in special cases */ if(force_uturn && node1==begin->start_node) { if(seg2!=result1->segment) goto endloop_fwd; } else /* must not perform U-turn */ if(seg1==seg2) /* No fake segments, applies to all profiles */ goto endloop_fwd; /* must obey turn relations */ if(turnrelation!=NO_RELATION && !IsTurnAllowed(relations,turnrelation,node1,seg1,seg2,profile->transports)) goto endloop_fwd; way2p=LookupWay(ways,segment2p->way,1); /* mode of transport must be allowed on the highway */ if(!(way2p->allow&profile->transports)) goto endloop_fwd; /* must obey weight restriction (if exists) */ if(way2p->weight && way2p->weightweight) goto endloop_fwd; /* must obey height/width/length restriction (if exist) */ if((way2p->height && way2p->heightheight) || (way2p->width && way2p->width width ) || (way2p->length && way2p->lengthlength)) goto endloop_fwd; segment_pref=profile->highway[HIGHWAY(way2p->type)]; /* highway preferences must allow this highway */ if(segment_pref==0) goto endloop_fwd; for(i=1;ifile.properties & PROPERTIES(i)) { if(way2p->props & PROPERTIES(i)) segment_pref*=profile->props_yes[i]; else segment_pref*=profile->props_no[i]; } /* profile preferences must allow this highway */ if(segment_pref==0) goto endloop_fwd; node2=OtherNode(segment2p,node1); node2p=LookupNode(nodes,node2,2); /* node2 cannot be a fake node (must be a super-node) */ /* mode of transport must be allowed through node2 unless it is the final node */ if(node2!=end->finish_node && !(node2p->allow&profile->transports)) goto endloop_fwd; /* calculate the score for the segment and cumulative */ if(option_quickest==0) segment_score=(score_t)DISTANCE(segment2p->distance)/segment_pref; else segment_score=(score_t)Duration(segment2p,way2p,profile)/segment_pref; cumulative_score=result1->score+segment_score; /* score must be better than current best score */ if(cumulative_score>=total_score) goto endloop_fwd; /* find whether the node/segment combination already exists */ result2=FindResult(results,node2,seg2); if(result2 && result2->next) { if((result2->score+cumulative_score)score+cumulative_score; finish_result=result2; start_result =result1; } goto endloop_fwd; } if(!result2) /* New end node/segment pair */ { result2=InsertResult(results,node2,seg2); result2->prev=result1; result2->score=cumulative_score; } else if(cumulative_scorescore) /* New end node/segment pair is better */ { result2->prev=result1; result2->score=cumulative_score; } else goto endloop_fwd; /* Insert a new node into the queue */ GetLatLong(nodes,node2,node2p,&lat,&lon); /* node2 cannot be a fake node (must be a super-node) */ direct=Distance(lat,lon,finish_lat,finish_lon); if(option_quickest==0) potential_score=result2->score+(score_t)direct/profile->max_pref; else potential_score=result2->score+(score_t)distance_speed_to_duration(direct,profile->max_speed)/profile->max_pref; if(potential_scorescore>=total_score) continue; real_node1=result1->node; seg1=result1->segment; segment1p=LookupSegment(segments,seg1,1); node1=OtherNode(segment1p,real_node1); node1p=LookupNode(nodes,node1,1); /* mode of transport must be allowed through node1 */ if(!(node1p->allow&profile->transports)) continue; way1p=LookupWay(ways,segment1p->way,1); segment1_pref=profile->highway[HIGHWAY(way1p->type)]; for(i=1;ifile.properties & PROPERTIES(i)) { if(way1p->props & PROPERTIES(i)) segment1_pref*=profile->props_yes[i]; else segment1_pref*=profile->props_no[i]; } /* calculate the score for the segment */ if(option_quickest==0) segment1_score=(score_t)DISTANCE(segment1p->distance)/segment1_pref; else segment1_score=(score_t)Duration(segment1p,way1p,profile)/segment1_pref; /* Loop across all segments */ segment2p=FirstSegment(segments,node1p,1); /* node1 cannot be a fake node (must be a super-node) */ while(segment2p) { Node *node2p; Way *way2p; index_t node2,seg2; score_t segment_pref,cumulative_score,potential_score; double lat,lon; distance_t direct; seg2=IndexSegment(segments,segment2p); /* segment cannot be a fake segment (must be a super-segment) */ /* must not perform U-turn */ if(seg1==seg2) /* No fake segments, applies to all profiles */ goto endloop_rev; /* find whether the node/segment combination already exists */ result2=FindResult(results,node1,seg2); /* must be a super segment */ if(!IsSuperSegment(segment2p) && !(result2 && result2->prev)) goto endloop_rev; /* must obey turn relations */ if(profile->turns && IsTurnRestrictedNode(node1p)) /* node1 cannot be a fake node (must be a super-node) */ { index_t turnrelation2=FindFirstTurnRelation2(relations,node1,seg2); if(turnrelation2!=NO_RELATION && !IsTurnAllowed(relations,turnrelation2,node1,seg2,seg1,profile->transports)) goto endloop_rev; } /* must obey one-way restrictions (unless profile allows) */ if(profile->oneway && IsOnewayFrom(segment2p,node1)) /* working backwards => disallow oneway *from* node1 */ { if(profile->transports!=Transports_Bicycle) goto endloop_rev; way2p=LookupWay(ways,segment2p->way,1); if(!(way2p->type&Highway_CycleBothWays)) goto endloop_rev; } way2p=LookupWay(ways,segment2p->way,1); /* mode of transport must be allowed on the highway */ if(!(way2p->allow&profile->transports)) goto endloop_rev; /* must obey weight restriction (if exists) */ if(way2p->weight && way2p->weightweight) goto endloop_rev; /* must obey height/width/length restriction (if exist) */ if((way2p->height && way2p->heightheight) || (way2p->width && way2p->width width ) || (way2p->length && way2p->lengthlength)) goto endloop_rev; segment_pref=profile->highway[HIGHWAY(way2p->type)]; /* highway preferences must allow this highway */ if(segment_pref==0) goto endloop_rev; for(i=1;ifile.properties & PROPERTIES(i)) { if(way2p->props & PROPERTIES(i)) segment_pref*=profile->props_yes[i]; else segment_pref*=profile->props_no[i]; } /* profile preferences must allow this highway */ if(segment_pref==0) goto endloop_rev; node2=OtherNode(segment2p,node1); cumulative_score=result1->score+segment1_score; /* score must be better than current best score */ if(cumulative_score>=total_score) goto endloop_rev; if(result2 && result2->prev) { if((result2->score+cumulative_score)score+cumulative_score; finish_result=result1; start_result =result2; } goto endloop_rev; } if(!result2) /* New end node/segment pair */ { result2=InsertResult(results,node1,seg2); /* adding in reverse => node1,seg2 */ result2->next=result1; /* working backwards */ result2->score=cumulative_score; } else if(cumulative_scorescore) /* New end node/segment pair is better */ { result2->next=result1; /* working backwards */ result2->score=cumulative_score; } else goto endloop_rev; /* Insert a new node into the queue */ node2p=LookupNode(nodes,node2,2); /* node2 cannot be a fake node (must be a super-node) */ GetLatLong(nodes,node2,node2p,&lat,&lon); direct=Distance(lat,lon,start_lat,start_lon); if(option_quickest==0) potential_score=result2->score+(score_t)direct/profile->max_pref; else potential_score=result2->score+(score_t)distance_speed_to_duration(direct,profile->max_speed)/profile->max_pref; if(potential_scorenumber); #endif FreeResultsList(results); return(NULL); } /* Turn the route round and fill in the start and finish information */ if(start_result!=finish_result) { start_result->next=finish_result; finish_result->prev=start_result; while(start_result->prev && start_result->prev!=NO_RESULT) start_result=start_result->prev; FixForwardRoute(results,finish_result); if(!start_result->prev && start_result->next) start_result=start_result->next; while(finish_result->next && finish_result->next!=NO_RESULT) finish_result=finish_result->next; } results->start_node=start_result->node; results->prev_segment=start_result->segment; results->finish_node=finish_result->node; results->last_segment=finish_result->segment; #if DEBUG printf(" -------- middle route (via super-nodes/segments) score=%.3f\n",total_score); print_debug_route(nodes,segments,results,NULL,4,+1); #endif #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_last("Found Middle Route: Super-Nodes checked = %d",results->number); #endif return(results); } /*++++++++++++++++++++++++++++++++++++++ Find the super-segment that represents the route that contains a particular segment. index_t FindSuperSegment Returns the index of the super-segment. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. Profile *profile The profile containing the transport type, speeds and allowed highways. index_t finish_node The super-node that the route ends at. index_t finish_segment The segment that the route ends with. ++++++++++++++++++++++++++++++++++++++*/ static index_t FindSuperSegment(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t finish_node,index_t finish_segment) { Node *supernodep; Segment *supersegmentp; #if DEBUG printf(" FindSuperSegment(...,finish_node=%"Pindex_t",finish_segment=%"Pindex_t")\n",finish_node,finish_segment); #endif if(IsFakeSegment(finish_segment)) finish_segment=IndexRealSegment(finish_segment); supernodep=LookupNode(nodes,finish_node,3); /* finish_node cannot be a fake node (must be a super-node) */ supersegmentp=LookupSegment(segments,finish_segment,3); /* finish_segment cannot be a fake segment. */ if(IsSuperSegment(supersegmentp)) { #if DEBUG printf(" -- already super-segment = %"Pindex_t"\n",finish_segment); #endif return(finish_segment); } /* Loop across all segments */ supersegmentp=FirstSegment(segments,supernodep,3); /* supernode cannot be a fake node (must be a super-node) */ while(supersegmentp) { if(IsSuperSegment(supersegmentp)) { Results *results; Result *result; index_t start_node; start_node=OtherNode(supersegmentp,finish_node); results=FindSuperRoute(nodes,segments,ways,relations,profile,start_node,finish_node); if(!results) continue; result=FindResult(results,finish_node,finish_segment); if(result && (distance_t)result->score==DISTANCE(supersegmentp->distance)) { FreeResultsList(results); #if DEBUG printf(" -- found super-segment = %"Pindex_t"\n",IndexSegment(segments,supersegmentp)); #endif return(IndexSegment(segments,supersegmentp)); } if(results) FreeResultsList(results); } supersegmentp=NextSegment(segments,supersegmentp,finish_node); /* finish_node cannot be a fake node (must be a super-node) */ } #if DEBUG printf(" -- no super-segment = %"Pindex_t"\n",finish_segment); #endif return(finish_segment); } /*++++++++++++++++++++++++++++++++++++++ Find the shortest route between two super-nodes using only normal nodes. This is effectively the same function as is used in superx.c when finding super-segments initially. Results *FindSuperRoute Returns a set of results. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. Profile *profile The profile containing the transport type, speeds and allowed highways. index_t start_node The start node. index_t finish_node The finish node. ++++++++++++++++++++++++++++++++++++++*/ static Results *FindSuperRoute(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t start_node,index_t finish_node) { Results *results; Queue *queue; Result *result1,*result2; #if DEBUG printf(" FindSuperRoute(...,start_node=%"Pindex_t" finish_node=%"Pindex_t")\n",start_node,finish_node); #endif /* Create the list of results and insert the first node into the queue */ results=NewResultsList(8); queue=NewQueueList(8); result1=InsertResult(results,start_node,NO_SEGMENT); InsertInQueue(queue,result1,0); /* Loop across all nodes in the queue */ while((result1=PopFromQueue(queue))) { Node *node1p=NULL; Segment *segment2p; index_t node1,seg1; node1=result1->node; seg1=result1->segment; node1p=LookupNode(nodes,node1,4); /* node1 cannot be a fake node */ /* Loop across all segments */ segment2p=FirstSegment(segments,node1p,4); /* node1 cannot be a fake node */ while(segment2p) { Node *node2p=NULL; index_t node2,seg2; score_t cumulative_score; /* must be a normal segment */ if(!IsNormalSegment(segment2p)) goto endloop; /* must obey one-way restrictions */ if(IsOnewayTo(segment2p,node1)) { Way *way2p; if(profile->transports!=Transports_Bicycle) goto endloop; way2p=LookupWay(ways,segment2p->way,2); if(!(way2p->type&Highway_CycleBothWays)) goto endloop; } seg2=IndexSegment(segments,segment2p); /* must not perform U-turn */ if(seg1==seg2) goto endloop; node2=OtherNode(segment2p,node1); node2p=LookupNode(nodes,node2,4); /* node2 cannot be a fake node */ /* must not pass over super-node */ if(node2!=finish_node && IsSuperNode(node2p)) goto endloop; /* Specifically looking for the shortest route to emulate superx.c */ cumulative_score=result1->score+(score_t)DISTANCE(segment2p->distance); result2=FindResult(results,node2,seg2); if(!result2) /* New end node/segment combination */ { result2=InsertResult(results,node2,seg2); result2->prev=result1; result2->score=cumulative_score; } else if(cumulative_scorescore) /* New score for end node/segment combination is better */ { result2->prev=result1; result2->segment=seg2; result2->score=cumulative_score; } else goto endloop; /* don't route beyond a super-node. */ if(!IsSuperNode(node2p)) InsertInQueue(queue,result2,result2->score); endloop: segment2p=NextSegment(segments,segment2p,node1); } } FreeQueueList(queue); #if DEBUG Result *s=FirstResult(results); while(s) { if(s->node==finish_node) { printf(" -------- super-route\n"); print_debug_route(nodes,segments,results,FindResult(results,s->node,s->segment),8,-1); } s=NextResult(results,s); } #endif return(results); } /*++++++++++++++++++++++++++++++++++++++ Find all routes from a specified node to any super-node. Results *FindStartRoutes Returns a set of results. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. Profile *profile The profile containing the transport type, speeds and allowed highways. index_t start_node The start node. index_t prev_segment The previous segment before the start node. index_t finish_node The finish node. ++++++++++++++++++++++++++++++++++++++*/ static Results *FindStartRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t start_node,index_t prev_segment,index_t finish_node) { Results *results; Queue *queue,*superqueue; Result *result1,*result2; Result *start_result,*finish_result=NULL; score_t total_score=INF_SCORE; int nsuper=0,force_uturn=0; #if DEBUG printf(" FindStartRoutes(...,start_node=%"Pindex_t" prev_segment=%"Pindex_t" finish_node=%"Pindex_t")\n",start_node,prev_segment,finish_node); #endif #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_first("Finding Start Route: Nodes checked = 0"); #endif /* Create the list of results and insert the first node into the queue */ results=NewResultsList(8); queue=NewQueueList(8); superqueue=NewQueueList(8); start_result=InsertResult(results,start_node,prev_segment); InsertInQueue(queue,start_result,0); /* Check for barrier at start waypoint - must perform U-turn */ if(prev_segment!=NO_SEGMENT && !IsFakeNode(start_node)) { Node *startp=LookupNode(nodes,start_node,1); if(!(startp->allow&profile->transports)) force_uturn=1; } /* Loop across all nodes in the queue */ while((result1=PopFromQueue(queue))) { Node *node1p=NULL; Segment *segment2p; index_t node1,seg1,seg1r; index_t turnrelation=NO_RELATION; /* score must be better than current best score */ if(result1->score>=total_score) continue; node1=result1->node; seg1=result1->segment; if(IsFakeSegment(seg1)) seg1r=IndexRealSegment(seg1); else seg1r=seg1; if(!IsFakeNode(node1)) node1p=LookupNode(nodes,node1,1); /* lookup if a turn restriction applies */ if(profile->turns && node1p && IsTurnRestrictedNode(node1p)) turnrelation=FindFirstTurnRelation2(relations,node1,seg1r); /* Loop across all segments */ if(IsFakeNode(node1)) segment2p=FirstFakeSegment(node1); else segment2p=FirstSegment(segments,node1p,1); while(segment2p) { Node *node2p=NULL; Way *way2p; index_t node2,seg2,seg2r; score_t segment_pref,segment_score,cumulative_score; int i; node2=OtherNode(segment2p,node1); /* need this here because we use node2 at the end of the loop */ /* must be a normal segment */ if(!IsNormalSegment(segment2p)) goto endloop; /* must obey one-way restrictions (unless profile allows) */ if(profile->oneway && IsOnewayTo(segment2p,node1)) { if(profile->transports!=Transports_Bicycle) goto endloop; way2p=LookupWay(ways,segment2p->way,1); if(!(way2p->type&Highway_CycleBothWays)) goto endloop; } if(IsFakeNode(node1) || IsFakeNode(node2)) { seg2 =IndexFakeSegment(segment2p); seg2r=IndexRealSegment(seg2); } else { seg2 =IndexSegment(segments,segment2p); seg2r=seg2; } /* must perform U-turn in special cases */ if(node1==start_node && force_uturn) { if(seg2r!=result1->segment) goto endloop; } else /* must not perform U-turn (unless profile allows) */ if(profile->turns && (seg1==seg2 || seg1==seg2r || seg1r==seg2 || (seg1r==seg2r && IsFakeUTurn(seg1,seg2)))) goto endloop; /* must obey turn relations */ if(turnrelation!=NO_RELATION && !IsTurnAllowed(relations,turnrelation,node1,seg1r,seg2r,profile->transports)) goto endloop; way2p=LookupWay(ways,segment2p->way,1); /* mode of transport must be allowed on the highway */ if(!(way2p->allow&profile->transports)) goto endloop; /* must obey weight restriction (if exists) */ if(way2p->weight && way2p->weightweight) goto endloop; /* must obey height/width/length restriction (if exists) */ if((way2p->height && way2p->heightheight) || (way2p->width && way2p->width width ) || (way2p->length && way2p->lengthlength)) goto endloop; segment_pref=profile->highway[HIGHWAY(way2p->type)]; /* highway preferences must allow this highway */ if(segment_pref==0) goto endloop; for(i=1;ifile.properties & PROPERTIES(i)) { if(way2p->props & PROPERTIES(i)) segment_pref*=profile->props_yes[i]; else segment_pref*=profile->props_no[i]; } /* profile preferences must allow this highway */ if(segment_pref==0) goto endloop; if(!IsFakeNode(node2)) node2p=LookupNode(nodes,node2,2); /* mode of transport must be allowed through node2 unless it is the final node */ if(node2p && node2!=finish_node && !(node2p->allow&profile->transports)) goto endloop; /* calculate the score for the segment and cumulative */ if(option_quickest==0) segment_score=(score_t)DISTANCE(segment2p->distance)/segment_pref; else segment_score=(score_t)Duration(segment2p,way2p,profile)/segment_pref; /* prefer not to follow two fake segments when one would do (special case) */ if(IsFakeSegment(seg2)) segment_score*=1.01f; cumulative_score=result1->score+segment_score; /* score must be better than current best score (if finish node already found) */ if(cumulative_score>=total_score) goto endloop; /* find whether the node/segment combination already exists */ result2=FindResult(results,node2,seg2); if(!result2) /* New end node/segment combination */ { result2=InsertResult(results,node2,seg2); result2->prev=result1; result2->score=cumulative_score; if(node2p && IsSuperNode(node2p)) nsuper++; } else if(cumulative_scorescore) /* New score for end node/segment combination is better */ { result2->prev=result1; result2->score=cumulative_score; } else goto endloop; if(node2==finish_node) { if(!finish_result) { Result *result3; while((result3=PopFromQueue(superqueue))) InsertInQueue(queue,result3,result3->score); } if(cumulative_scorescore); else if(node2p && IsSuperNode(node2p)) InsertInQueue(superqueue,result2,result2->score); endloop: if(IsFakeNode(node1)) segment2p=NextFakeSegment(segment2p,node1); else if(IsFakeNode(node2)) segment2p=NULL; /* cannot call NextSegment() with a fake segment */ else { segment2p=NextSegment(segments,segment2p,node1); if(!segment2p && IsFakeNode(finish_node)) segment2p=ExtraFakeSegment(node1,finish_node); } } } FreeQueueList(queue); FreeQueueList(superqueue); /* Check it worked */ if(results->number==1 || (nsuper==0 && !finish_result)) { #if DEBUG printf(" Failed (%d results, %d super)\n",results->number,nsuper); #endif #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_last("Found Start Route: Nodes checked = %d - Fail",results->number); #endif FreeResultsList(results); return(NULL); } /* Turn the route round and fill in the start and finish information */ results->start_node =start_result->node; results->prev_segment=start_result->segment; if(finish_result) { FixForwardRoute(results,finish_result); results->finish_node =finish_result->node; results->last_segment=finish_result->segment; } #if DEBUG Result *s=FirstResult(results); while(s) { if(s->node==finish_node || (!IsFakeNode(s->node) && IsSuperNode(LookupNode(nodes,s->node,1)))) { printf(" -------- possible start route\n"); print_debug_route(nodes,segments,results,FindResult(results,s->node,s->segment),4,-1); } s=NextResult(results,s); } #endif #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_last("Found Start Route: Nodes checked = %d",results->number); #endif return(results); } /*++++++++++++++++++++++++++++++++++++++ Find all routes from any super-node to a specific node (by working backwards from the specific node to all super-nodes). Results *FindFinishRoutes Returns a set of results. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. Profile *profile The profile containing the transport type, speeds and allowed highways. index_t finish_node The finishing node. ++++++++++++++++++++++++++++++++++++++*/ static Results *FindFinishRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t finish_node) { Results *results,*finish_results; Queue *queue; Result *result1,*result2; Result *finish_result; #if DEBUG printf(" FindFinishRoutes(...,finish_node=%"Pindex_t")\n",finish_node); #endif #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_first("Finding Finish Route: Nodes checked = 0"); #endif /* Create the results and insert the finish node into the queue */ finish_results=NewResultsList(2); results=NewResultsList(8); queue=NewQueueList(8); finish_result=InsertResult(finish_results,finish_node,NO_SEGMENT); InsertInQueue(queue,finish_result,0); /* Loop across all nodes in the queue */ while((result1=PopFromQueue(queue))) { Node *node1p=NULL; Segment *segment1p=NULL,*segment2p; Way *way1p; index_t real_node1,node1,seg1,seg1r; index_t turnrelation=NO_RELATION; score_t segment1_pref,segment1_score=0; int i; real_node1=result1->node; seg1=result1->segment; if(seg1!=NO_SEGMENT && IsFakeSegment(seg1)) seg1r=IndexRealSegment(seg1); else seg1r=seg1; if(seg1!=NO_SEGMENT) { if(IsFakeSegment(seg1)) segment1p=LookupFakeSegment(seg1); else segment1p=LookupSegment(segments,seg1,1); } if(seg1==NO_SEGMENT) node1=real_node1; else node1=OtherNode(segment1p,real_node1); if(!IsFakeNode(node1)) node1p=LookupNode(nodes,node1,1); /* mode of transport must be allowed through node1 */ if(seg1!=NO_SEGMENT) if(node1p && !(node1p->allow&profile->transports)) continue; if(seg1!=NO_SEGMENT) { way1p=LookupWay(ways,segment1p->way,1); segment1_pref=profile->highway[HIGHWAY(way1p->type)]; for(i=1;ifile.properties & PROPERTIES(i)) { if(way1p->props & PROPERTIES(i)) segment1_pref*=profile->props_yes[i]; else segment1_pref*=profile->props_no[i]; } /* calculate the score for the segment */ if(option_quickest==0) segment1_score=(score_t)DISTANCE(segment1p->distance)/segment1_pref; else segment1_score=(score_t)Duration(segment1p,way1p,profile)/segment1_pref; /* prefer not to follow two fake segments when one would do (special case) */ if(IsFakeSegment(seg1)) segment1_score*=1.01f; } /* Loop across all segments */ if(IsFakeNode(node1)) segment2p=FirstFakeSegment(node1); else segment2p=FirstSegment(segments,node1p,1); while(segment2p) { Node *node2p=NULL; Way *way2p; index_t node2,seg2,seg2r; score_t segment_pref,cumulative_score; /* must be a normal segment unless node1 is a super-node (see below). */ if((IsFakeNode(node1) || !IsSuperNode(node1p)) && !IsNormalSegment(segment2p)) goto endloop; /* must be a super segment if node1 is a super-node to give starting super-segment for finding middle route. */ if((!IsFakeNode(node1) && IsSuperNode(node1p)) && !IsSuperSegment(segment2p)) goto endloop; /* must obey one-way restrictions (unless profile allows) */ if(profile->oneway && IsOnewayFrom(segment2p,node1)) /* working backwards => disallow oneway *from* node1 */ { if(profile->transports!=Transports_Bicycle) goto endloop; way2p=LookupWay(ways,segment2p->way,1); if(!(way2p->type&Highway_CycleBothWays)) goto endloop; } node2=OtherNode(segment2p,node1); if(IsFakeNode(node1) || IsFakeNode(node2)) { seg2 =IndexFakeSegment(segment2p); seg2r=IndexRealSegment(seg2); } else { seg2 =IndexSegment(segments,segment2p); seg2r=seg2; } if(seg1!=NO_SEGMENT) { /* must not perform U-turn (unless profile allows) */ if(profile->turns) { if(IsFakeNode(node1) || !IsSuperNode(node1p)) { if(seg1==seg2 || seg1==seg2r || seg1r==seg2 || (seg1r==seg2r && IsFakeUTurn(seg1,seg2))) goto endloop; } else { index_t superseg=FindSuperSegment(nodes,segments,ways,relations,profile,node1,seg1); if(seg2==superseg) goto endloop; } } /* lookup if a turn restriction applies */ if(profile->turns && node1p && IsTurnRestrictedNode(node1p)) turnrelation=FindFirstTurnRelation2(relations,node1,seg2r); /* must obey turn relations */ if(turnrelation!=NO_RELATION && !IsTurnAllowed(relations,turnrelation,node1,seg2r,seg1r,profile->transports)) goto endloop; } way2p=LookupWay(ways,segment2p->way,1); /* mode of transport must be allowed on the highway */ if(!(way2p->allow&profile->transports)) goto endloop; /* must obey weight restriction (if exists) */ if(way2p->weight && way2p->weightweight) goto endloop; /* must obey height/width/length restriction (if exist) */ if((way2p->height && way2p->heightheight) || (way2p->width && way2p->width width ) || (way2p->length && way2p->lengthlength)) goto endloop; segment_pref=profile->highway[HIGHWAY(way2p->type)]; /* highway preferences must allow this highway */ if(segment_pref==0) goto endloop; for(i=1;ifile.properties & PROPERTIES(i)) { if(way2p->props & PROPERTIES(i)) segment_pref*=profile->props_yes[i]; else segment_pref*=profile->props_no[i]; } /* profile preferences must allow this highway */ if(segment_pref==0) goto endloop; if(!IsFakeNode(node2)) node2p=LookupNode(nodes,node2,2); /* mode of transport must be allowed through node2 */ if(node2p && !(node2p->allow&profile->transports)) goto endloop; cumulative_score=result1->score+segment1_score; /* find whether the node/segment combination already exists */ result2=FindResult(results,node1,seg2); /* adding in reverse => node1,seg2 */ if(!result2) /* New end node */ { result2=InsertResult(results,node1,seg2); /* adding in reverse => node1,seg2 */ if(result1!=finish_result) result2->next=result1; /* working backwards */ result2->score=cumulative_score; } else if(cumulative_scorescore) /* New end node is better */ { if(result1!=finish_result) result2->next=result1; /* working backwards */ result2->score=cumulative_score; } else goto endloop; if(IsFakeNode(node1) || !IsSuperNode(node1p)) InsertInQueue(queue,result2,result2->score); endloop: if(IsFakeNode(node1)) segment2p=NextFakeSegment(segment2p,node1); else segment2p=NextSegment(segments,segment2p,node1); } } FreeQueueList(queue); FreeResultsList(finish_results); /* Check it worked */ if(results->number==0) { #if DEBUG printf(" Failed\n"); #endif #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_last("Found Finish Route: Nodes checked = %d - Fail",results->number); #endif FreeResultsList(results); return(NULL); } /* Update the results */ results->finish_node=finish_node; #if DEBUG Result *s=FirstResult(results); while(s) { if(!IsFakeNode(s->node) && IsSuperNode(LookupNode(nodes,s->node,1))) { printf(" -------- possible finish route\n"); print_debug_route(nodes,segments,results,FindResult(results,s->node,s->segment),4,+1); } s=NextResult(results,s); } #endif #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_last("Found Finish Route: Nodes checked = %d",results->number); #endif return(results); } /*++++++++++++++++++++++++++++++++++++++ Create an optimum route given the set of super-nodes to follow. Results *CombineRoutes Returns the results from joining the super-nodes. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. Profile *profile The profile containing the transport type, speeds and allowed highways. Results *begin The set of results for the start of the route. Results *middle The set of results from the super-node route. Results *end The set of results for the end of the route. ++++++++++++++++++++++++++++++++++++++*/ static Results *CombineRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,Results *begin,Results *middle,Results *end) { Result *midres,*comres; Results *combined; #if DEBUG printf(" CombineRoutes(...,[begin has %d nodes],[middle has %d nodes],[end has %d nodes])\n",begin->number,middle->number,end->number); #endif #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_first("Finding Combined Route: Nodes = 0"); #endif combined=NewResultsList(10); /* Insert the start point */ midres=FindResult(middle,middle->start_node,middle->prev_segment); comres=InsertResult(combined,begin->start_node,begin->prev_segment); /* Insert the start of the route */ if(begin->number>1) { Result *begres; if(midres->prev==NO_RESULT) begres=FindResult(begin,midres->node,midres->segment); else begres=FindResult(begin,midres->prev->node,midres->prev->segment); FixForwardRoute(begin,begres); begres=FindResult(begin,begin->start_node,begin->prev_segment); begres=begres->next; do { Result *comres2; comres2=InsertResult(combined,begres->node,begres->segment); comres2->score=begres->score; comres2->prev=comres; begres=begres->next; comres=comres2; } while(begres); } /* Sort out the combined route */ while(midres->next && midres->next!=NO_RESULT) { Results *results=FindNormalRoute(nodes,segments,ways,relations,profile,comres->node,comres->segment,midres->next->node); Result *result; if(!results) { #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_last("Found Combined Route: Nodes = %d - Fail",combined->number); #endif FreeResultsList(combined); return(NULL); } result=FindResult(results,midres->node,comres->segment); result=result->next; /* * midres midres->next * = = * ---*----------------------------------* = middle * * ---*----.----.----.----.----.----.----* = results * = * result * * ---*----.----.----.----.----.----.----* = combined * = = * comres comres2 */ do { Result *comres2; comres2=InsertResult(combined,result->node,result->segment); comres2->score=midres->score+result->score; comres2->prev=comres; result=result->next; comres=comres2; } while(result); FreeResultsList(results); midres=midres->next; midres->score=comres->score; } /* Insert the end of the route */ if(end->number>0) { Result *endres=FindResult(end,midres->node,midres->segment); while(endres->next) { Result *comres2; comres2=InsertResult(combined,endres->next->node,endres->next->segment); comres2->score=comres->score+(endres->score-endres->next->score); comres2->prev=comres; endres=endres->next; comres=comres2; } } /* Turn the route round and fill in the start and finish information */ FixForwardRoute(combined,comres); combined->start_node=begin->start_node; combined->prev_segment=begin->prev_segment; combined->finish_node=comres->node; combined->last_segment=comres->segment; #if DEBUG printf(" -------- combined route (end-to-end)\n"); print_debug_route(nodes,segments,combined,NULL,4,+1); #endif #if !DEBUG && !defined(LIBROUTINO) if(!option_quiet) printf_last("Found Combined Route: Nodes = %d",combined->number); #endif return(combined); } /*++++++++++++++++++++++++++++++++++++++ Fix the forward route (i.e. setup next pointers for forward path from prev nodes on reverse path). Results *results The set of results to update. Result *finish_result The result for the finish point. ++++++++++++++++++++++++++++++++++++++*/ static void FixForwardRoute(Results *results,Result *finish_result) { Result *current_result=finish_result; do { Result *result; if(current_result->prev && current_result->prev!=NO_RESULT) { result=current_result->prev; result->next=current_result; current_result=result; } else current_result=NULL; } while(current_result); } #if DEBUG /*++++++++++++++++++++++++++++++++++++++ Print a debug message about a route. Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Results *results The set of results to print. Result *first The result to start with or NULL for the first result. int indent The number of spaces of indentation at the beginning. int direction The direction of travel, -1 = backwards (prev) or +1 = forwards (next). ++++++++++++++++++++++++++++++++++++++*/ static void print_debug_route(Nodes *nodes,Segments *segments,Results *results,Result *first,int indent,int direction) { Result *r; char *spaces=" "; if(first) r=first; else r=FindResult(results,results->start_node,results->prev_segment); while(r && r!=NO_RESULT) { int is_fake_node=IsFakeNode(r->node); int is_super_node=is_fake_node?0:IsSuperNode(LookupNode(nodes,r->node,4)); int is_no_segment=(r->segment==NO_SEGMENT); int is_fake_segment=is_no_segment?0:IsFakeSegment(r->segment); int is_super_segment=is_no_segment||is_fake_segment?0:IsSuperSegment(LookupSegment(segments,r->segment,4)); int is_normal_segment=is_no_segment||is_fake_segment?0:IsNormalSegment(LookupSegment(segments,r->segment,4)); int is_start=r->node==results->start_node&&r->segment==results->prev_segment; int is_finish=r->node==results->finish_node; printf("%s %s node=%10"Pindex_t" segment=%10"Pindex_t" score=%8.3f (%s-node,%s-segment)%s%s\n", &spaces[8-indent], (is_start||is_finish?"*":(direction==-1?"^":"v")), r->node,r->segment,r->score, (is_fake_node?" fake":(is_super_node?" super":"normal")), (is_no_segment?" no":(is_fake_segment?" fake":(is_super_segment&&is_normal_segment?" both":(is_super_segment?" super":"normal")))), (is_start?" [start]":""), (is_finish?" [finish]":"")); if(direction==-1) r=r->prev; else r=r->next; } } #endif routino-3.4.3/src/visualiser.c 644 233 144 77076 13160256411 11551 0/*************************************** Extract data from Routino. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2017 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include "types.h" #include "nodes.h" #include "segments.h" #include "ways.h" #include "relations.h" #include "errorlog.h" #include "typesx.h" #include "visualiser.h" /* Limit types */ #define SPEED_LIMIT 1 #define WEIGHT_LIMIT 2 #define HEIGHT_LIMIT 3 #define WIDTH_LIMIT 4 #define LENGTH_LIMIT 5 /* Local types */ typedef void (*callback_t)(index_t node,double latitude,double longitude); /* Local variables (intialised by entry-point function before later use) */ static Nodes *OSMNodes; static Segments *OSMSegments; static Ways *OSMWays; static Relations *OSMRelations; static double LatMin; static double LatMax; static double LonMin; static double LonMax; static int limit_type=0; static Highway highways=Highway_None; static Transports transports=Transports_None; static Properties properties=Properties_None; static highway_t waytype=0; /* Local functions */ static void find_all_nodes(Nodes *nodes,callback_t callback); static void output_junctions(index_t node,double latitude,double longitude); static void output_super(index_t node,double latitude,double longitude); static void output_waytype(index_t node,double latitude,double longitude); static void output_highway(index_t node,double latitude,double longitude); static void output_transport(index_t node,double latitude,double longitude); static void output_barrier(index_t node,double latitude,double longitude); static void output_turnrestriction(index_t node,double latitude,double longitude); static void output_limits(index_t node,double latitude,double longitude); static void output_property(index_t node,double latitude,double longitude); /*++++++++++++++++++++++++++++++++++++++ Output the data for junctions (--data=junctions). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. ++++++++++++++++++++++++++++++++++++++*/ void OutputJunctions(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ find_all_nodes(nodes,(callback_t)output_junctions); } /*++++++++++++++++++++++++++++++++++++++ Process a single node and output all those that are junctions (called as a callback). index_t node The node to output. double latitude The latitude of the node. double longitude The longitude of the node. ++++++++++++++++++++++++++++++++++++++*/ static void output_junctions(index_t node,double latitude,double longitude) { Node *nodep=LookupNode(OSMNodes,node,1); Segment *segmentp; Way *firstwayp; int count=0,difference=0; segmentp=FirstSegment(OSMSegments,nodep,1); firstwayp=LookupWay(OSMWays,segmentp->way,1); do { Way *wayp=LookupWay(OSMWays,segmentp->way,2); if(IsNormalSegment(segmentp)) count++; if(WaysCompare(firstwayp,wayp)) difference=1; segmentp=NextSegment(OSMSegments,segmentp,node); } while(segmentp); if(count!=2 || difference) printf("node%"Pindex_t" %.6f %.6f %d\n",node,radians_to_degrees(latitude),radians_to_degrees(longitude),count); } /*++++++++++++++++++++++++++++++++++++++ Output the data for super-nodes and super-segments (--data=super). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. ++++++++++++++++++++++++++++++++++++++*/ void OutputSuper(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ find_all_nodes(nodes,(callback_t)output_super); } /*++++++++++++++++++++++++++++++++++++++ Process a single node and output all that are super-nodes and all connected super-segments (called as a callback). index_t node The node to output. double latitude The latitude of the node. double longitude The longitude of the node. ++++++++++++++++++++++++++++++++++++++*/ static void output_super(index_t node,double latitude,double longitude) { Node *nodep=LookupNode(OSMNodes,node,1); Segment *segmentp; if(!IsSuperNode(nodep)) return; printf("node%"Pindex_t" %.6f %.6f\n",node,radians_to_degrees(latitude),radians_to_degrees(longitude)); segmentp=FirstSegment(OSMSegments,nodep,1); do { if(IsSuperSegment(segmentp)) { index_t othernode=OtherNode(segmentp,node); double lat,lon; GetLatLong(OSMNodes,othernode,NULL,&lat,&lon); if(node>othernode || (latLatMax || lonLonMax)) printf("segment%"Pindex_t" %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(lat),radians_to_degrees(lon)); } segmentp=NextSegment(OSMSegments,segmentp,node); } while(segmentp); } /*++++++++++++++++++++++++++++++++++++++ Output the data for segments of special highway types (--data=waytype-oneway etc). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. highway_t mask A bit mask that must match the highway type. ++++++++++++++++++++++++++++++++++++++*/ void OutputWaytype(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,highway_t mask) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ waytype=mask; find_all_nodes(nodes,(callback_t)output_waytype); } /*++++++++++++++++++++++++++++++++++++++ Process a single node and output all connected segments of a particular special highway type (called as a callback). index_t node The node to output. double latitude The latitude of the node. double longitude The longitude of the node. ++++++++++++++++++++++++++++++++++++++*/ static void output_waytype(index_t node,double latitude,double longitude) { Node *nodep=LookupNode(OSMNodes,node,1); Segment *segmentp; segmentp=FirstSegment(OSMSegments,nodep,1); do { if(IsNormalSegment(segmentp)) { Way *wayp=LookupWay(OSMWays,segmentp->way,1); if(wayp->type&waytype) { index_t othernode=OtherNode(segmentp,node); double lat,lon; GetLatLong(OSMNodes,othernode,NULL,&lat,&lon); if(node>othernode || (latLatMax || lonLonMax)) { if(IsOnewayFrom(segmentp,node)) printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(latitude),radians_to_degrees(longitude),radians_to_degrees(lat),radians_to_degrees(lon)); else if(IsOnewayFrom(segmentp,othernode)) printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(lat),radians_to_degrees(lon),radians_to_degrees(latitude),radians_to_degrees(longitude)); } } } segmentp=NextSegment(OSMSegments,segmentp,node); } while(segmentp); } /*++++++++++++++++++++++++++++++++++++++ Output the data for segments of a particular highway type (--data=highway-primary etc). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. Highway highway The type of highway. ++++++++++++++++++++++++++++++++++++++*/ void OutputHighway(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,Highway highway) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ highways=highway; find_all_nodes(nodes,(callback_t)output_highway); } /*++++++++++++++++++++++++++++++++++++++ Process a single node and output all connected segments that are of a particular highway type (called as a callback). index_t node The node to output. double latitude The latitude of the node. double longitude The longitude of the node. ++++++++++++++++++++++++++++++++++++++*/ static void output_highway(index_t node,double latitude,double longitude) { Node *nodep=LookupNode(OSMNodes,node,1); Segment *segmentp; segmentp=FirstSegment(OSMSegments,nodep,1); do { if(IsNormalSegment(segmentp)) { Way *wayp=LookupWay(OSMWays,segmentp->way,1); if(HIGHWAY(wayp->type)==highways) { index_t othernode=OtherNode(segmentp,node); double lat,lon; GetLatLong(OSMNodes,othernode,NULL,&lat,&lon); if(node>othernode || (latLatMax || lonLonMax)) printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(latitude),radians_to_degrees(longitude),radians_to_degrees(lat),radians_to_degrees(lon)); } } segmentp=NextSegment(OSMSegments,segmentp,node); } while(segmentp); } /*++++++++++++++++++++++++++++++++++++++ Output the data for segments allowed for a particular type of traffic (--data=transport-motorcar etc). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. Transport transport The type of transport. ++++++++++++++++++++++++++++++++++++++*/ void OutputTransport(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,Transport transport) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ transports=TRANSPORTS(transport); find_all_nodes(nodes,(callback_t)output_transport); } /*++++++++++++++++++++++++++++++++++++++ Process a single node and output all connected segments for a particular traffic type (called as a callback). index_t node The node to output. double latitude The latitude of the node. double longitude The longitude of the node. ++++++++++++++++++++++++++++++++++++++*/ static void output_transport(index_t node,double latitude,double longitude) { Node *nodep=LookupNode(OSMNodes,node,1); Segment *segmentp; segmentp=FirstSegment(OSMSegments,nodep,1); do { if(IsNormalSegment(segmentp)) { Way *wayp=LookupWay(OSMWays,segmentp->way,1); if(wayp->allow&transports) { index_t othernode=OtherNode(segmentp,node); double lat,lon; GetLatLong(OSMNodes,othernode,NULL,&lat,&lon); if(node>othernode || (latLatMax || lonLonMax)) printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(latitude),radians_to_degrees(longitude),radians_to_degrees(lat),radians_to_degrees(lon)); } } segmentp=NextSegment(OSMSegments,segmentp,node); } while(segmentp); } /*++++++++++++++++++++++++++++++++++++++ Output the data for nodes disallowed for a particular type of traffic (--data=barrier). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. Transport transport The type of transport. ++++++++++++++++++++++++++++++++++++++*/ void OutputBarrier(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax,Transport transport) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ transports=TRANSPORTS(transport); find_all_nodes(nodes,(callback_t)output_barrier); } /*++++++++++++++++++++++++++++++++++++++ Process a single node and output those that are barriers (called as a callback). index_t node The node to output. double latitude The latitude of the node. double longitude The longitude of the node. ++++++++++++++++++++++++++++++++++++++*/ static void output_barrier(index_t node,double latitude,double longitude) { Node *nodep=LookupNode(OSMNodes,node,1); if(!(nodep->allow&transports)) printf("node%"Pindex_t" %.6f %.6f\n",node,radians_to_degrees(latitude),radians_to_degrees(longitude)); } /*++++++++++++++++++++++++++++++++++++++ Output the data for turn restrictions (--data=turns). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. ++++++++++++++++++++++++++++++++++++++*/ void OutputTurnRestrictions(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ find_all_nodes(nodes,(callback_t)output_turnrestriction); } /*++++++++++++++++++++++++++++++++++++++ Process a single node and output those that are 'via' nodes for a turn restriction and the associated segments (called as a callback). index_t node The node to output. double latitude The latitude of the node. double longitude The longitude of the node. ++++++++++++++++++++++++++++++++++++++*/ static void output_turnrestriction(index_t node,double latitude,double longitude) { Node *nodep=LookupNode(OSMNodes,node,1); index_t turnrelation=NO_RELATION; if(!IsTurnRestrictedNode(nodep)) return; turnrelation=FindFirstTurnRelation1(OSMRelations,node); do { TurnRelation *relation; Segment *from_segmentp,*to_segmentp; index_t from_node,to_node; double from_lat,from_lon,to_lat,to_lon; relation=LookupTurnRelation(OSMRelations,turnrelation,1); from_segmentp=LookupSegment(OSMSegments,relation->from,1); to_segmentp =LookupSegment(OSMSegments,relation->to ,2); from_node=OtherNode(from_segmentp,node); to_node =OtherNode(to_segmentp ,node); GetLatLong(OSMNodes,from_node,NULL,&from_lat,&from_lon); GetLatLong(OSMNodes,to_node ,NULL,&to_lat ,&to_lon); printf("turn-relation%"Pindex_t" %.6f %.6f %.6f %.6f %.6f %.6f\n", turnrelation, radians_to_degrees(from_lat),radians_to_degrees(from_lon), radians_to_degrees(latitude),radians_to_degrees(longitude), radians_to_degrees(to_lat),radians_to_degrees(to_lon)); turnrelation=FindNextTurnRelation1(OSMRelations,turnrelation); } while(turnrelation!=NO_RELATION); } /*++++++++++++++++++++++++++++++++++++++ Output the data for speed limits (--data=speed). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. ++++++++++++++++++++++++++++++++++++++*/ void OutputSpeedLimits(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ limit_type=SPEED_LIMIT; find_all_nodes(nodes,(callback_t)output_limits); } /*++++++++++++++++++++++++++++++++++++++ Output the data for weight limits (--data=weight). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. ++++++++++++++++++++++++++++++++++++++*/ void OutputWeightLimits(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ limit_type=WEIGHT_LIMIT; find_all_nodes(nodes,(callback_t)output_limits); } /*++++++++++++++++++++++++++++++++++++++ Output the data for height limits (--data=height). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. ++++++++++++++++++++++++++++++++++++++*/ void OutputHeightLimits(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ limit_type=HEIGHT_LIMIT; find_all_nodes(nodes,(callback_t)output_limits); } /*++++++++++++++++++++++++++++++++++++++ Output the data for width limits (--data=width). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. ++++++++++++++++++++++++++++++++++++++*/ void OutputWidthLimits(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ limit_type=WIDTH_LIMIT; find_all_nodes(nodes,(callback_t)output_limits); } /*++++++++++++++++++++++++++++++++++++++ Output the data for length limits (--data=length). Nodes *nodes The set of nodes to use. Segments *segments The set of segments to use. Ways *ways The set of ways to use. Relations *relations The set of relations to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. ++++++++++++++++++++++++++++++++++++++*/ void OutputLengthLimits(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,double latmin,double latmax,double lonmin,double lonmax) { /* Use local variables so that the callback doesn't need to pass them backwards and forwards */ OSMNodes=nodes; OSMSegments=segments; OSMWays=ways; OSMRelations=relations; LatMin=latmin; LatMax=latmax; LonMin=lonmin; LonMax=lonmax; /* Iterate through the nodes and process them */ limit_type=LENGTH_LIMIT; find_all_nodes(nodes,(callback_t)output_limits); } /*++++++++++++++++++++++++++++++++++++++ Process a single node and output those and connected segments that have a speed, weight, height, width or length limit change (called as a callback). index_t node The node to output. double latitude The latitude of the node. double longitude The longitude of the node. ++++++++++++++++++++++++++++++++++++++*/ static void output_limits(index_t node,double latitude,double longitude) { Node *nodep=LookupNode(OSMNodes,node,1); Segment *segmentp,segmentps[MAX_SEG_PER_NODE]; index_t segments[MAX_SEG_PER_NODE]; int limits[MAX_SEG_PER_NODE]; int count=0; int i,j,same=0; segmentp=FirstSegment(OSMSegments,nodep,1); do { if(IsNormalSegment(segmentp) && countway,1); segmentps[count]=*segmentp; segments [count]=IndexSegment(OSMSegments,segmentp); switch(limit_type) { case SPEED_LIMIT: limits[count]=wayp->speed; break; case WEIGHT_LIMIT: limits[count]=wayp->weight; break; case HEIGHT_LIMIT: limits[count]=wayp->height; break; case WIDTH_LIMIT: limits[count]=wayp->width; break; case LENGTH_LIMIT: limits[count]=wayp->length; break; default: limits[count]=0; break; } if(limits[count] || HIGHWAY(wayp->type)way,1); if(wayp->props&properties) { index_t othernode=OtherNode(segmentp,node); double lat,lon; GetLatLong(OSMNodes,othernode,NULL,&lat,&lon); if(node>othernode || (latLatMax || lonLonMax)) printf("segment%"Pindex_t" %.6f %.6f %.6f %.6f\n",IndexSegment(OSMSegments,segmentp),radians_to_degrees(latitude),radians_to_degrees(longitude),radians_to_degrees(lat),radians_to_degrees(lon)); } } segmentp=NextSegment(OSMSegments,segmentp,node); } while(segmentp); } /*++++++++++++++++++++++++++++++++++++++ A function to iterate through all nodes and call a callback function for each one. Nodes *nodes The set of nodes to use. callback_t callback The callback function for each node. ++++++++++++++++++++++++++++++++++++++*/ static void find_all_nodes(Nodes *nodes,callback_t callback) { ll_bin_t latminbin=latlong_to_bin(radians_to_latlong(LatMin))-nodes->file.latzero; ll_bin_t latmaxbin=latlong_to_bin(radians_to_latlong(LatMax))-nodes->file.latzero; ll_bin_t lonminbin=latlong_to_bin(radians_to_latlong(LonMin))-nodes->file.lonzero; ll_bin_t lonmaxbin=latlong_to_bin(radians_to_latlong(LonMax))-nodes->file.lonzero; ll_bin_t latb,lonb; index_t i,index1,index2; /* Loop through all of the nodes. */ if(latminbin<0) latminbin=0; if(latmaxbin>nodes->file.latbins) latmaxbin=nodes->file.latbins-1; if(lonminbin<0) lonminbin=0; if(lonmaxbin>nodes->file.lonbins) lonmaxbin=nodes->file.lonbins-1; for(latb=latminbin;latb<=latmaxbin;latb++) for(lonb=lonminbin;lonb<=lonmaxbin;lonb++) { ll_bin2_t llbin=lonb*nodes->file.latbins+latb; if(llbin<0 || llbin>(nodes->file.latbins*nodes->file.lonbins)) continue; index1=LookupNodeOffset(nodes,llbin); index2=LookupNodeOffset(nodes,llbin+1); for(i=index1;ifile.latzero+latb)+off_to_latlong(nodep->latoffset)); double lon=latlong_to_radians(bin_to_latlong(nodes->file.lonzero+lonb)+off_to_latlong(nodep->lonoffset)); if(lat>LatMin && latLonMin && lonfile.latzero; ll_bin_t latmaxbin=latlong_to_bin(radians_to_latlong(latmax))-errorlogs->file.latzero; ll_bin_t lonminbin=latlong_to_bin(radians_to_latlong(lonmin))-errorlogs->file.lonzero; ll_bin_t lonmaxbin=latlong_to_bin(radians_to_latlong(lonmax))-errorlogs->file.lonzero; ll_bin_t latb,lonb; index_t i,index1,index2; /* Loop through all of the error logs. */ for(latb=latminbin;latb<=latmaxbin;latb++) for(lonb=lonminbin;lonb<=lonmaxbin;lonb++) { ll_bin2_t llbin=lonb*errorlogs->file.latbins+latb; if(llbin<0 || llbin>(errorlogs->file.latbins*errorlogs->file.lonbins)) continue; index1=LookupErrorLogOffset(errorlogs,llbin); index2=LookupErrorLogOffset(errorlogs,llbin+1); if(index2>errorlogs->file.number_geo) index2=errorlogs->file.number_geo; for(i=index1;ifile.latzero+latb)+off_to_latlong(errorlogp->latoffset)); double lon=latlong_to_radians(bin_to_latlong(errorlogs->file.lonzero+lonb)+off_to_latlong(errorlogp->lonoffset)); if(lat>latmin && latlonmin && lon AllowOverride Options=MultiViews,ExecCGI FileInfo Limit This can be placed anywhere between the and tags which should be at the start and end of the file. -------- Copyright 2008-2020 Andrew M. Bishop. routino-3.4.3/doc/DATA.txt 644 233 144 11262 12572106465 10441 0 Routino : Data ============== A router relies on data to be able to find a route. OpenStreetMap Data ------------------ The data that is collected by the OpenStreetMap project consists of nodes, ways and relations. Node A node is a point that has a latitude and longitude and attributes that describe what type of point it is (part of a way or a place of interest for example). Way A way is a collection of nodes that when joined together define something (for example a road, a railway, a boundary, a building, a lake etc). The ways also have attributes that define them (speed limits, type of road and restrictions for example). Relation A relation is a collection of items (usually ways) that are related to each other for some reason (highways that make up a route for example). The OpenStreetMap Wiki explains the data much better than I can. Router Data ----------- The information that is needed by a routing algorithm is only a subset of the information that is collected by the OpenStreetMap project. For routing what is required is information about the location of roads (or other highways), the connections between the highways and the properties of those highways. Location of highways (nodes) The locations of things is provided by the nodes from the OpenStreetMap data. The nodes are the only things that have coordinates in OpenStreetMap and everything else is made up by reference to them. Not all of the nodes are useful, only the ones that are part of highways. The location of the nodes is stored but none of the other attributes are currently used by the router. Location of highways (ways) The location of the highways is defined in the OpenStreetMap data by the ways. Only the highway ways are useful and the other ways are discarded. What remains is lists of nodes that join together to form a section of highway. This is further split into segments which are individual parts of a way connected by two nodes. Properties of highways (tags) The ways that belong to highways are extracted from the data in the previous step and for each way the useful information for routing is stored. For the router the useful information is the type of highway, the speed limit, the allowed types of transport and other restrictions (one-way, minimum height, maximum weight etc). Connections between highways The connections between highways are defined in the OpenStreetMap data by ways that share nodes. Since the ways may join in the middle and not just the ends it is the segments defined above that are not part of the OpenStreetMap data that are most important. The information that is extracted from the OpenStreetMap data is stored in an optimised way that allows the routing to be performed quickly. Interpreting Data Tags ---------------------- The tags are the information that is attached to the nodes and ways in OpenStreetMap. The router needs to interpret these tags and use them when deciding what type of traffic can use a highway (for example). There are no well defined rules in OpenStreetMap about tagging, but there is guidance on the OpenStreetMap Wiki "Map_Features" page. This describes a set of recommended tags but these are not universally used so it is up to each application how to interpret them. The tagging rules that the router uses are very important in controlling how the router works. With Routino the data tags can be modified when the data is imported to allow customisation of the information used for routing. Problems With OpenStreetMap Data -------------------------------- The route that can be found is only as good as the data that is available. This is not intended as a criticism of the OpenStreetMap data; it is generally good. There are some problems that are well known and which affect the router. For example highways might be missing because nobody has mapped them. A highway may be wrongly tagged with incorrect properties, or a highway might be missing important tags for routing (e.g. speed limits). There can also be problems with highways that should join but don't because they do not share nodes. A lot of these problems can be found using the interactive data visualiser that uses the same Routino routing database. -------- Copyright 2008-2010 Andrew M. Bishop. routino-3.4.3/doc/ALGORITHM.txt 644 233 144 46204 12572106465 11262 0 Routino : Algorithm =================== This page describes the development of the algorithm that is used in Routino for finding routes. Simplest Algorithm ------------------ The algorithm to find a route is fundamentally simple: Start at the beginning, follow all possible routes and keep going until you reach the end. While this method does work, it isn't fast. To be able to find a route quickly needs a different algorithm, one that can find the correct answer without wasting time on routes that lead nowhere. Improved Algorithm ------------------ The simplest way to do this is to follow all possible segments from the starting node to the next nearest node (an intermediate node in the complete journey). For each node that is reached store the shortest route from the starting node and the length of that route. The list of intermediate nodes needs to be maintained in order of shortest overall route on the assumption that there is a straight line route from here to the end node. At each point the intermediate node that has the shortest potential overall journey time is processed before any other node. From the first node in the list follow all possible segments and place the newly discovered nodes into the same list ordered in the same way. This will tend to constrain the list of nodes examined to be the ones that are between the start and end nodes. If at any point you reach a node that has already been reached by a longer route then you can discard that route since the newly discovered route is shorter. Conversely if the previously discovered route is shorter then discard the new route. At some point the end node will be reached and then any routes with potential lengths longer than this actual route can be immediately discarded. The few remaining potential routes must be continued until they are found to be shorter or have no possibility of being shorter. The shortest possible route is then found. At all times when looking at a node only those segments that are possible by the chosen means of transport are followed. This allows the type of transport to be handled easily. When finding the quickest route the same rules apply except that the criterion for sorting is the shortest potential route (assuming that from each node to the end is the fastest possible type of highway). This method also works, but again it isn't very fast. The problem is that the complexity is proportional to the number of nodes or segments in all routes examined between the start and end nodes. Maintaining the list of intermediate nodes in order is the most complex part. Final Algorithm --------------- The final algorithm that is implemented in the router is basically the one above but with an important difference. Instead of finding a long route among a data set of 8,000,000 nodes (number of highway nodes in UK at beginning of 2010) it finds one long route in a data set of 1,000,000 nodes and a few hundred very short routes in the full data set. Since the time taken to find a route is proportional to the number of nodes that need to be considered the main route takes 1/10th of the time and the very short routes take almost no time at all. The solution to making the algorithm fast is therefore to discard most of the nodes and only keep the interesting ones. In this case a node is deemed to be interesting if it is the junction of three or more segments or the junction of two segments with different properties or has a routing restriction different from the connecting segments. In the algorithm and following description these are classed as super-nodes. Starting at each super-node a super-segment is generated that finishes on another super-node and contains the shortest path along segments with identical properties (and these properties are inherited by the super-segment). The point of choosing the shortest route is that since all segments considered have identical properties they will be treated identically when properties are taken into account. This decision making process can be repeated until the only the most important and interesting nodes remain. To find a route between a start and finish point now comprises the following steps (assuming a shortest route is required): 1. Find all shortest routes from the start point along normal segments and stopping when super-nodes are reached. 2. Find all shortest routes from the end point backwards along normal segments and stopping when super-nodes are reached. 3. Find the shortest route along super-segments from the set of super-nodes in step 1 to the set of super-nodes in step 2 (taking into account the lengths found in steps 1 and 2 between the start/finish super-nodes and the ultimate start/finish point). 4. For each super-segment in step 3 find the shortest route between the two end-point super-nodes. This multi-step process is considerably quicker than using all nodes but gives a result that still contains the full list of nodes that are visited. There are some special cases though, for example very short routes that do not pass through any super-nodes, or routes that start or finish on a super-node. In these cases one or more of the steps listed can be removed or simplified. When the first route reaches the final node the length of that route is retained as a benchmark. Any shorter complete route that is calculated later would replace this benchmark. As routes are tested any partial routes that are longer than the benchmark can be immediately discarded. Other partial routes have the length of a perfect straight highway to the final node added to them and if the total exceeds the benchmark they can also be discarded. Very quickly the number of possible routes is reduced until the absolute shortest is found. For routes that do not start or finish on a node in the original data set a fake node is added to an existing segment. This requires special handling in the algorithm but it gives mode flexibility for the start, finish and intermediate points in a route. Algorithm Evolution - - - - - - - - - - In Routino versions 1.0 to 1.4 the algorithm used to select a super-node was the same as above except that node properties were not included. Routino versions 1.4.1 to 1.5.1 used a slightly different algorithm which only chose nodes that were junctions between segments with different properties (or has a routing restriction that is different from connecting segments in versions 1.5 and 1.5.1). The addition of turn restrictions (described in more detail below) requires the original algorithm since the super-segments more accurately reflect the underlying topology. Algorithm Implementation - - - - - - - - - - - - The algorithm that is used for finding the route between the super-nodes using super-segments is the A* algorithm (or a slight variation of it). This was not a deliberate design decision, but evolved into it during development. This algorithm relies on calculating the lowest score (shortest distance or quickest time) to each node from the starting node. The remaining score for the path to the destination node is estimated (based on a straight line using the fastest type of highway) and added to the current score and the result recorded. At each step the unvisited node that has the lowest current score is examined and all nodes connected to it have their scores calculated. When the destination node has been reached all remaining unvisited nodes with scores higher than the destination node's score can be discarded and the few remaining nodes examined. The algorithm used to find the route between super-nodes using normal segments is Dijkstra's algorithm (although it is implemented as the same algorithm as above but with no estimated cost). Since these routes tend to be short and the CPU time for calculating the heuristic cost function is relatively large this tends to give a quicker solution. Routing Preferences ------------------- One of the important features of Routino is the ability to select a route that is optimum for a set of criteria such as preferences for each type of highway, speed limits and other restrictions and highway properties. All of these features are handled by assigning a score to each segment while calculating the route and trying to minimise the score rather than simply minimising the length. Segment length When calculating the shortest route the length of the segment is the starting point for the score. Speed preference When calculating the quickest route the time taken calculated from the length of the segment and the lower of the highway's own speed limit and the user's speed preference for the type of highway is the starting point for the score. One-way restriction If a highway has the one-way property in the opposite direction to the desired travel and the user's preference is to obey one-way restrictions then the segment is ignored. Weight, height, width & length limits If a highway has one of these limits and its value is less than the user's specified requirement then the segment is ignored. Highway preference The highway preference specified by the user is a percentage, these are scaled so that the most preferred highway type has a weighted preference of 1.0 (0% always has a weighted preference of 0.0). The calculated score for a segment is divided by this weighted preference. Highway properties The other highway properties are specified by the user as a percentage and each highway either has that property or not. The user's property preference is scaled into the range 0.0 (for 0%) to 1.0 (for 100%) to give a weighted preference, a second "non-property" weighted preference is calculated in the same way after subtracting the user's preference from 100%. If a segment has a particular property then the calculated score is divided by the weighted preference for that property, if not then it is divided by the non-property weighted preference. A non-linear transformation is applied so that changing property preferences close to 50% do not cause large variations in routes. Data Pruning ------------ From version 2.2 there are options to "prune" nodes and segments from the input data which means to remove nodes and/or segments without significantly changing the routing results. The pruning options must meet a number of conditions to be useful: * The topology relevant to routing must remain unchanged. The instructions that are produced from the reduced set of nodes and segments must be sufficiently accurate for anybody trying to follow them on the ground. * Any restrictions belonging to nodes or segments that stop certain types of traffic from following a particular highway must be preserved. * The total length must be calculated using the original data and not the simplified data which by its nature will typically be shorter. * The location of the remaining nodes and segments must be a good representation of the original nodes and segments. Since the calculated route may be displayed on a map the remaining nodes and segments must clearly indicate the route to take. The prune options all have user-controllable parameters which allow the geographical accuracy to be controlled. This means that although the topology is the same the geographical accuracy can be sacrificed slightly to minimise the number of nodes and segments. The pruning options that are available are: * Removing the access permissions for a transport type from segments if it is not possible to route that transport type from those segments to a significant number of other places. The limit on the pruning is set by the total length of the isolated group of segments. This significantly increases the chance that a route will be found by not putting waypoints in inaccessible places. * Removing short segments, the limit is set by the length of the segment. This removes a number of redundant segments (and associated nodes) but rules are applied to ensure that removing the segments does not alter junction topology or remove node access permissions or changes in way properties. * Removing nodes from almost straight highways, the limit is set by the distance between the remaining segments and the original nodes. This removes a large number of redundant nodes (and therefore segments) but again care is taken not to remove node access permissions or changes in way properties. Turn Restrictions ----------------- The addition of turn restrictions in version 2.0 adds a set of further complications because it introduces a set of constraints that are far more complex than one-way streets. A turn restriction in the simplest case is a combination of a segment, node and segment such that routes are not allowed to go from the first segment to the second one through the specified node. Exceptions for certain types of traffic can also be specified. Currently only this simplest type of turn restriction is handled by the algorithm. The first complication of turn restrictions is that the algorithm above requires that super-segments are composed of segments with identical properties. A turn restriction is not the same in both directions so a super-segment cannot include any route through that turn restriction. The node at the centre of the turn restriction must therefore be a super-node to avoid this. In addition to this all nodes connected to the turn restriction node by a single segment must also be super-nodes to avoid any long-distance super-segments starting at the restricted node. The second complication of a turn restriction is that the optimum route may require passing through the same node more than once. This can happen where the route needs to work around a turn restriction by driving past it, turning round (on a roundabout perhaps) and coming back along the same highway. Without turn restrictions a route could be defined purely by the set of nodes that were passed; no node would exist more than once along a route between two points. With turn restrictions the route is defined by a node and the segment used to get there; no route between two points will ever need to follow the same segment in the same direction more than once. This means that the optimisation algorithm calculates scores for directed segments (indexed by segment and end node) rather than for nodes. A side-effect of this is that a route that works around a turn restriction must be calculable using the super-segments that are stored in the database. This puts a limit on the amount of database optimisation that can be performed because if too many super-segments are removed the optimum work-around may also be removed. The solution to this is to ensure that the database preserves all loops that can be used to turn around and reverse direction, previously super-segments that started and finished on the same super-node were disallowed. Another side-effect of having the route composed of a set of locations (nodes) as well as the direction of travel (segments used to reach them) is that via points in the route can be forced to continue in the original direction. If the chosen method of transport obeys turn restrictions then it will not reverse direction at a via point but will find an optimum route continuing in the same direction. The only exception to this is when the route ahead at a waypoint is into a dead-end and an immediate U-turn is allowed. A side-effect of having the starting direction at a via point defined by the previous part of the route is that overall non-optimal routes may be found even though each section between via points is optimal. For a route with a start, middle and end point defined it can be the case that the shortest route from the start to the middle arrives in the opposite direction to that required for the optimal route from the middle to the end. The calculation of the route in separate sections therefore may give a non-optimum result even though each section is itself optimum based on the start conditions. Overall the presence of turn restrictions in the database makes the routing slower even for regions of the map that have no turn restrictions. Data Implementation ------------------- The hardest part of implementing this router is the data organisation. The arrangement of the data to minimise the number of operations required to follow a route from one node to another is much harder than designing the algorithm itself. The final implementation uses a separate table for nodes, segments and ways. Each table individually is implemented as a C-language data structure that is written to disk by a program which parses the OpenStreetMap XML data file. In the router these data structures are memory mapped so that the operating system handles the problems of loading the needed data blocks from disk. Each node contains a latitude and longitude and they are sorted geographically so that converting a latitude and longitude coordinate to a node is fast as well as looking up the coordinate of a node. The node also contains the location in the array of segments for the first segment that uses that node. Each segment contains the location of the two nodes as well as the way that the segment came from. The location of the next segment that uses one of the two nodes is also stored; the next segment for the other node is the following one in the array. The length of the segment is also pre-computed and stored. Each way has a name, a highway type, a list of allowed types of traffic, a speed limit, any weight, height, width or length restrictions and the highway properties. The super-nodes are mixed in with the nodes and the super-segments are mixed in with the segments. For the nodes they are the same as the normal nodes, so just a flag is needed to indicate that they are super. The super-segments are in addition to the normal segments so they increase the database size (by about 10%) and are also marked with a flag. Some segments are therefore flagged as both normal segments and super-segments if they both have the same end nodes. The relations are stored separately from the nodes, segments and ways. For the turn restriction relations the initial and final segments are stored along with the restricted node itself. Each node that has a turn restriction is marked in the main node storage with a flag to indicate this information. -------- Copyright 2008-2013 Andrew M. Bishop. routino-3.4.3/doc/INSTALL-MS-WIN.txt 644 233 144 13422 12572106465 12006 0 Routino : Installation on MS Windows ==================================== Using Cygwin ------------ Cygwin is a large collection of GNU and Open Source tools which provide functionality similar to a Linux distribution on Windows. A Cygwin DLL provides substantial POSIX API functionality therefore providing direct compatibility for most UNIX source code. Since Cygwin aims to replicate a Linux-like system on Windows it is the simplest method of compiling Routino. The disadvantage is that all programs compiled with Cygwin require a number of runtime Cygwin libraries which may introduce a runtime speed penalty. The installer for Cygwin can be downloaded from http://cygwin.org/; there are 32-bit and 64-bit versions available. For compiling Routino the Cygwin installer should be run and the following packages selected (any dependencies will be automatically be selected at the next step): * base packages * gcc-core (in 'Devel' menu) * make (in 'Devel' menu) * libbz2-devel (in 'Libs' menu) * zlib-devel (in 'Libs' menu) * perl (in 'Perl' menu) To compile Routino open the "Cygwin Terminal" change to the Routino source directory and compile using the make command. The programs that are compiled 'planetsplitter', 'router' will require the Cygwin runtime to be able to run them. The library 'libroutino.so' should be usable with other Cygwin compiled programs. Native Compilation ------------------ Routino has limited support in the source code for compiling on Microsoft Windows. This includes a set of functions that can replace the mmap() and munmap() UNIX functions which are not available on Microsoft Windows. The source code should be downloaded, either as a release version file or from subversion - no instructions are provided for this step. The release versions include some files (mainly the web icons) which are not included in the subversion source (and which may be difficult to create on Windows). Using Microsoft Visual C - - - - - - - - - - - - The Routino source code (for the router at least) has been modified so that it will compile with the Microsoft Visual C compiler. Compiling Routino with MSVC is not supported directly since there is only support for using Makefiles in Routino. The files that need to be compiled for the Routino router can be found from the Makefile in the src directory listed in the 'ROUTER_OBJ' variable. To compile the router in slim mode the pre-processor definition 'SLIM=0' must be set and for non-slim mode 'SLIM=1' must be set. The default directory for the Routino data files must be set in the 'ROUTINO_DATADIR' pre-processor variable. If the router command line '--data' option is going to be used then this variable can be set to any value. Since Microsoft Visual C does not fully support the C99 standard it is necessary to tell the compiler how to handle the inline functions. This can be done by passing in the command line option '-Dinline=__inline' to the C compiler. Using MinGW - - - - - - MinGW is the "Minimalist GNU for Windows" which includes some of the common GNU programs; principally gcc and related programs for software development. The installer for MinGW can be downloaded from 'http://mingw.org/'. For compiling Routino the MinGW installer should be run and the following packages selected: * mingw-base * msys-base * mingw32-pthreads-w32 * mingw32-libz (dev package) * msys-perl To compile Routino open a DOS command window and set the path to the installed MinGW and MSYS software. For example if MinGW was installed in the 'C:/MinGW' directory then the path needs to be set to 'C:\MinGW\bin;C:\MinGW\MSYS\1.0\bin'. From within this DOS command window change to the Routino source directory and compile using the MinGW version of make with this command 'mingw32-make'. After compiling Routino a set of library files are created ('routino.dll', 'routino.def' and 'routino.lib'). These should be usable for linking with programs compiled with MSVC. Using MinGW-W64 - - - - - - - - MinGW-w64 is an alernative implementation of the same concept as MinGW but allows for compilation to 32-bit or 64-bit executables. The website for MinGW-w64 is 'http://mingw-w64.org/' but the downloads are available from 'http://win-builds.org/'. Installation of MinGW-w64 is slightly different from that for MinGW but a similar set of packages will be required. The compilation method for MinGW-w64 is the same as for MinGW and the same files will be compiled, the only difference is that by default a 64-bit version will be created. Limitations - - - - - - A native Microsoft Windows compilation of Routino is more complicated than compiling on Linux, other UNIX system or Cygwin. This is probably not an option if you are unfamiliar with software development on Microsoft Windows. The size of files that can be accessed with an MSVC or MinGW (32-bit) compiled version of Routino is limited to 32-bits (less than 4 GB). The MinGW-w64 compiler on 64-bit is able to handle larger files (bigger than 4 GB). The Windows operating system does not have a function equivalent to the 'fork()' function on UNIX. This means that it is not possible to use the planetsplitter program's built-in file decompression with an MSVC or MinGW compiled version of Routino. Example Web Pages ----------------- No instructions are available for using the Routino example web pages with the Microsoft Web server (IIS). For information on setting up Apache see the "Example Web Pages" section of the main installation instructions. -------- Copyright 2008-2015 Andrew M. Bishop. routino-3.4.3/doc/NEWS.txt 644 233 144 122522 15002742445 10521 0Version 3.4.3 of Routino released : Sat Apr 26 2025 --------------------------------------------------- Bug fixes: Fix bug that would crash on some turn relations (partial undo of v3.4.2). Note: This version is compatible with databases from versions 2.7.1 - 3.4.2. Version 3.4.2 of Routino released : Sat Mar 29 2025 --------------------------------------------------- Bug fixes: Fix bug with using uninitialised memory. Fix some problems caused by changing index_t to 64-bit type (not default). planetsplitter: Refactor some code OSM tagging: Rework the node tagging, only consider barriers as blocking access. Translations: Updated Spanish & German translations. Note: This version is compatible with databases from versions 2.7.1 - 3.4.1. Version 3.4.1 of Routino released : Sat Jul 1 2023 -------------------------------------------------- Bug fixes: Fix error with sorting (without threads, not slim mode). Note: This version is compatible with databases from versions 2.7.1 - 3.4. Version 3.4 of Routino released : Sun Jun 11 2023 ------------------------------------------------- Bug fixes: Avoid infinite recursion when parsing route relations. Ignore excess data rather than fail to process huge route relations. planetsplitter: Speed up node processing on large databases. Merge some steps together to speed up processing. Speed up multi-threaded sorting, increase default memory size. OSM tagging: Don't route through barriers (fence, wall etc) explicitly tagged on a node. Add platforms (public transport) as highways, equivalent to a path. Only look for access tags on barriers not other nodes. Python: Change from distutils to setuptools for building. Do not try to install python module with 'make install' but suggest options. Translations: Updated French, Polish, Spanish translations. Added Slovak translation. Documentation Recommend multi-threaded sorting. Web pages: Test with the latest version of Leaflet (1.9.4). Test with the latest version of OpenLayers (7.4.0). Note: This version is compatible with databases from versions 2.7.1 - 3.3.3. Version 3.3.3 of Routino released : Wed Dec 30 2020 --------------------------------------------------- Bug fixes: More bug fixes for compiling python library (environment variables). Ensure that we do not try memory mapping a zero length file. Catch NULL pointers being passed into the library functions. Fix some documentation errors. planetsplitter: Reduce memory use by mapping more data from file rather than allocating it. Python: Support the use of the progress callback function when calculating a route. Translations: Updated Czech, Dutch, German and Russian translations. Added a Finnish translation. Web pages: Zoom to the visible markers from the URL if no lat/long/zoom in the URL. Improve the setting / clearing of the cookie for the home location. Update the URL when new waypoints are added etc. Update the visualiser/fixme data as you move around the map. Test with the latest version of Leaflet (1.7.1). Add support for the latest version of OpenLayers (6.4.3). Note: This version is compatible with databases from versions 2.7.1 - 3.3.2. Version 3.3.2 of Routino released : Wed Sep 18 2019 --------------------------------------------------- Bug fixes: Ensure that parallel compilation works in the python directory. Updated the version number in the executables to "3.3.2". Note: This version is compatible with databases from versions 2.7.1 - 3.3.1. Version 3.3.1 of Routino released : Sun Sep 8 2019 -------------------------------------------------- Bug fixes: Ensure that 'make clean' in the python directory deletes auto-generated files. Include the python directory in the release file (include in 'FILES'). Note: This version is compatible with databases from versions 2.7.1 - 3.3. Version 3.3 of Routino released : Sat Sep 7 2019 ------------------------------------------------ Bug fixes: Make the openlayers and leaflet zoom to the same level on clicking the route. Add some more memory debug logging (for queue data structure). Fix bug with route calculation that may not give optimum solution. Fix parallel make to not have failed targets due to 'mkdir' race condition. Supress compilation warnings from gcc-7 and gcc-8. Supress compilation warnings from clang-5 and clang-5 static analyser. Suppress runtime warnings from gcc's runtime sanitizer. Bug fix for race condition in multi-threaded sorting algorithm. Bug fix for HTML router when named locations are used. Fix some error messages for consistency. Add extra checks to avoid data overflow and file corruption in planetsplitter. Add more checks for memory allocation success/failure. planetsplitter: Do not store nodes in route relations (they are not used). Documentation: Added an extra Perl module that is required. Translations: Updated German, French and Hungarian translations. Added Italian and Spanish translations. Added incomplete Czech translations. OSM tagging: Some small changes to access tagging and highway naming (prow_ref). Add heuristics to decide what transport types are allowed on ferrys. Web pages: Update to use the latest version of Leaflet (1.5.1). Add support for the latest version of OpenLayers (5.3). Default to showing search boxes for locations not lat/long fields. Python: Created a Python (version 3) interface to the router and routing database. Extras: Update documentation. Improve log summarisation HTML page formatting. Note: This version is compatible with databases from versions 2.7.1 - 3.2. Version 3.2 of Routino released : Sun Mar 12 2017 ------------------------------------------------- Bug fixes: Don't crash if the start & finish of a route are the same point (some cases). Update installation instructions in case Apache root is not '/var/www'. Improve messages if default profiles, translations or tagging files not found. Fix an error in filedumperx detected by gcc-6 indentation checker. Ensure that selecting a language web-page defaults to that language output. Ensure that a language that is missing some translations still get valid HTML. Fix Perl scripts that include others (current directory not on include path). Web pages: Update to use the latest version of Leaflet (0.7.7). Move the route buttons to be above the waypoints so they stay on screen. Remove MapQuest as an optional tile source (no longer available). Adjust some CSS and HTML so that the layout is preserved when zooming. Translations: Updated French, German, Polish & Russian translations. OSM tagging: Handle more tags like access:foot=* by translating them to foot=*. router: Ignore junctions forbidden by turn restrictions when describing route. Extras: Don't crash in the statistics dumper if some ways are *very* long. Note: This version is compatible with databases from versions 2.7.1 - 3.1.1. Version 3.1.1 of Routino released : Sun Mar 6 2016 -------------------------------------------------- Bug fixes: Updated the version number in the executables to "3.1.1". There are no other changes compared to version 3.1. Version 3.1 of Routino released : Sat Mar 5 2016 ------------------------------------------------ Bug fixes: Make the whole of the highlighted entry on the webpage clickable. Fix Makefiles so that 'make -j 4' works. Fix Makefiles so that 'make test' works from a clean directory. Fix bug on webpage with 'oneway' or 'turns' in the URL arguments. Print error message on webpage if geolocation function unavailable. Fix bug where the optimum end of the route was not being found. Reduce the preference for service roads in the default routing profile. Remove literal type conversion error when validating profile values. Library: Add a version number to the shared library (SONAME). Include the version number of Routino into the library as a string variable. Add loop and reverse route as options to the library. planetsplitter: Use 64-bit numbers for the node ID when processing an OSM file. router: Change file output formats so that waypoint numbers are included. When calculating a route with loop and reverse start route from waypoint 1. Calculate the route from both ends towards the middle. Translations: Change the names of the GPX route waypoints in translations.xml. Updated French and German translations. Documentation Updated the instructions for setting up on Apache (version 2.4.x). Web pages: Add a loop & reverse checkbox, replace loop & reverse buttons with icons. Extras: Add scripts to process the database and create maps of highway statistics. Note: This version is compatible with databases from versions 2.7.1 - 3.0. Version 3.0 of Routino released : Sat Sep 12 2015 ------------------------------------------------- Bug fixes: Use a single definition of MAX_SEG_PER_NODE to avoid confusion. Fix bug with built-in translation strings if no XML translations available. Fix bug with makefiles related to creating new translations. Remove some pthread code that was still there when compiling without pthreads. Fix a use-after-free memory error and use of uninitialised allocated memory. Ensure that allocated strings are long enough for temporary filenames. Programs: Add a '--version' option to all of the programs. Source Code: Various C language cleanups including using '-pedantic' compiler option. Various changes to allow compiling with Microsoft Visual Studio C compiler. Various changes to allow compiling with MinGW or Cygwin on Microsoft Windows. Makefile updates: 'make clean' = release, 'make distclean' = SVN repository. API: Create a library API that can perform routing functions. OSM tagging: Remove cycle_barrier and bicycle_barrier since they do not block bicycles. Translations: Updated Dutch and German translations. Added Hungarian and Polish translations provided through translation web page. Documentation: Add meta tags to HTML to help mobile devices, tidy up the CSS. Create instructions for compiling on Microsoft Windows. Create API description for Routino library usage. Web pages: Allow drag-and-drop of waypoints within the list and onto the map. Note: This version is compatible with databases from versions 2.7.1 - 2.7.3. Version 2.7.3 of Routino released : Sat Nov 8 2014 -------------------------------------------------- Bug fixes: Limit the property preference ratio to 100 instead of 10000. Don't allocate memory for sorting that won't be used. planetsplitter: Added an option to print out the allocated/mapped memory at each step. Speed up database generation by compacting results after each pruning step. Speed up database generation by sorting nodes geographically before pruning. Reduce memory use while generating the database. router: Added the options to print out time and allocated/mapped memory at each step. Translations: Updated German translations. Note: This version is compatible with databases from versions 2.7.1 & 2.7.2. Version 2.7.2 of Routino released : Thu June 26 2014 ---------------------------------------------------- Bug fixes: Make the visualiser display all segments including those crossing the border. Fix two errors that cause crashes only on 64-bit systems. planetsplitter / router: Increase the size of the caches for the slim programs by a factor of four. Translations: Updated Russian translations. Updated German translations. Note: This version is compatible with databases from version 2.7.1. Version 2.7.1 of Routino released : Sat May 17 2014 --------------------------------------------------- Bug fixes: Fix typo in documentation for command to get SVN version. Fix router crash when waypoint is on roundabout. Don't duplicate super-segments when merging them with normal segments. Change routing instructions for bicycle if highways allow cycling both ways. Make translation script work with older versions of Perl. Fix router crash if fewer than two waypoints are specified. Revert router speed decrease with special-case tagging rules. Fix web page search function when it returns non-ASCII text. Fix router failure due to invalid assumption about allowed U-turn. Fix bug with updating XML files in web/data directory (Makefile error). Fix router web page error due to absence of cyclebothways property entry. Fix results error if a waypoint node was passed again on way to next waypoint. Fix router crash when route contains consecutive coincident waypoints. Fix bug with slightly incorrect distances when pruning short segments. Test cases: Create new test case for roundabout waypoint bug fixed in this version. Create new test case for invalid U-turn assumption bug fixed in this version. Create new test case for cycling both ways. Create new test case for consecutive coincident waypoints. router: Remove cyclebothways as a property that can be used as a routing preference. Web pages: Disallow route calculation if fewer than two waypoints are selected. Update visualiser for change of cyclebothways handling. Translations: Updated Russian translations. Updated German translations. Note: This version is not compatible with databases from previous versions. Version 2.7 of Routino released : Sat Mar 22 2014 ------------------------------------------------- Bug fixes: Fix web-page CGI bug that did not allow more than 9 waypoints to be routed. Fix typo in documentation strings in filedumper program. Fix error in function prototype that stopped 64-bit node type being used. Don't lose super-segments when merging them with normal segments. Don't exceed the database lat/long limits when searching for visualiser data. planetsplitter: Don't overflow (and wrap-around) conversions of lengths, weights etc. Add some new formats of length, weight and speed parsing. Add .xz uncompression as a compile-time option (default is disabled). router: Remove ancient undocumented option to specify lat/lon without --lat/--lon. Add a '--output-stdout' option to output the route in a selected format. Add a '--reverse' option to calculate a route in the reverse order. Add a '--loop' option to calculate a route that returns to the first waypoint. Output valid HTML4 (use strict DTD and use numeric entity for apostrophe). OSM tagging: Allow bicycles both ways on certain oneway roads if tagging allows. Handle "access=bus" like "access=psv". Configuration Files: Updated Dutch translations. Updates to the XML parser tagging rules. Added French translations for the routing output. Documentation: Update the algorithm documentation for finding the shortest path. Update documentation HTML to strict 4.01 DTD. Web pages: Some changes to HTML, CSS formatting and Javascript to improve usability. Added a French translation of the router web page. Add the option to choose between OpenLayers and Leaflet for map rendering. Check compatible with OpenLayers v2.13.1 and make this the default. Create the router and visualiser pages from templates and translated phrases. Note: This version has removed specific support for IE6 and IE7 browsers. Note: This version is compatible with databases from version 2.6 (although cycling both ways on one-way highways requires a database update). Version 2.6 of Routino released : Sat Jul 6 2013 ------------------------------------------------ Bug fixes: Force '...' in tagging rules to match even with no input tags. Built-in translations for GPX-route file gave nonsense durations. Handle some cases that potentially caused divide by zero (not crashes). Compilation: All configuration is now contained in the top level file Makefile.conf. Default to using -ffast-math option for faster maths and glibc workaround. Code improvements: Improve router internal data structures to increase performance. Add another layer of caching to significantly speed up slim mode operation. Add a layer of file buffering to significantly speed up reading/writing. Enable more compile-time warnings and fix them. planetsplitter: Create a binary log file to allow searching for errors geographically. Simplify processing for changes (segment files not kept). Don't prune isolated regions for transport types we don't have. Web pages (visualiser): Allow displaying the error logs on the map. Allow selecting any item displayed and showing more information about it. Extras: Create a separate directory to put extra (non-essential) programs and scripts. * tagmodifier - a tagging rule testing program. * errorlog - a script to summarise the planetsplitter error log. * plot-time - a script to plot a graph of the planetsplitter execution time. * find-fixme - search an OSM file for "fixme" tags and display them on a map. Note: This version is not compatible with databases from previous versions. Version 2.5.1 of Routino released : Sat Apr 20 2013 --------------------------------------------------- Bug fixes: Stop contradictory log error messages about 'access=foot' etc. Move the HTML charset definition to within the first 1024 bytes of file. Don't prune short segments in some cases that would change routing. Fix bug with pruning straight highways around loops. Fix some bugs with installation documents and scripts. Fix Javascript to work with OpenLayers v2.11 again. Fix XML character quoting for special characters in 7-bit ASCII range. Fix bug with parsing XML containing UTF-8 characters four bytes long. Fix two bugs for simple routes with the option of not passing a super-node. planetsplitter: Improve the pruning of straight highways (detect larger straight sections). Configuration Files: Accept some more tag values for OSM file parsing. Handle alternate forms of mini roundabouts (junction=roundabout). Note: This version is compatible with databases from version 2.4 / 2.4.1 / 2.5. Version 2.5 of Routino released : Sun Feb 9 2013 ------------------------------------------------ General: Replace 'motorbike' with 'motorcycle' everywhere. planetsplitter/tagmodifier: Major changes to file reading: Faster XML parser. Reads PBF files natively (not for changes, not tagmodifier). Reads o5m/o5c files natively (not tagmodifier). Reads bzip2 or gzip compressed files natively (if compiled for them). Data can no longer be read from standard input. planetsplitter: Report errors with self-intersecting ways, clarify some other error messages. Configuration Files: Tagging configuration can now use an rule. The tagging configuration and rules can be nested. Change the way that the multilane property is derived from the lanes tag. Accept some more tag values for OSM file parsing. German translation now supports roundabouts. Documentation: Describe numerical limits (OSM identifiers and maximum database size). Web pages: Allow different data and tile attributions for each map source. Include MapQuest as an optional tile source. Web pages (visualiser): Allow plotting segments of highways that have a particular property. Note: Starting with this version the planetsplitter and tagmodifier programs will no longer read data from standard input. Note: Existing mapprops.js files need to be updated for this version. Note: This version is compatible with databases from version 2.4 / 2.4.1. Version 2.4.1 of Routino released : Mon Dec 17 2012 --------------------------------------------------- Bug fixes: Fix error with finding routes with low preference values (router). Fix error when searching for default profiles.xml (router). Fix bug with printing log messages when output is not stdout (tagmodifier). Stop various crashes if trying to process file with no data (planetsplitter). Note: This version is compatible with databases from version 2.4. Version 2.4 of Routino released : Sat Dec 8 2012 ------------------------------------------------ Bug fixes: Fix pruning short segments in slim mode (gave different results to non-slim). Fix error with segment lengths for some segments from ways that are areas. Fix latent bug with route relations when compiled for 64-bit way/relation IDs. router/planetsplitter: Replace all debugging "assert" statements with fatal error messages. planetsplitter: Delete ways that are not used from the output files (names remain though). Delete turn relations that are not used from the output files. Speed up the processing, mainly by reducing the number of I/O operations. Change the pruning of isolated regions to look at each transport type. Slim and normal mode now give identical results (sorting preserves order). Log some more error cases, clarify some existing ones. Added a --append option which must be used to append files to existing data. Added a --keep option which can be used to keep parsed, sorted data. Added a --changes option to allow appending OSM change files (.osc files). Configuration Files: Accept some more tag values for OSM file parsing. summarise-log.pl Can now generate an HTML version with links to OSM information for each item. Deleted obsoleted files: The CGI scripts customrouter.cgi and customvisualiser.cgi have been removed. The noscript.cgi and noscript.html web pages have been removed. Note: Files deprecated in version 2.3 have been removed in version 2.4. Note: This version is not compatible with databases from previous versions. Version 2.3.2 of Routino released : Sat Oct 6 2012 -------------------------------------------------- Bug fixes: Fix for highway type visualiser (was missing one-way segments). Fix a real-life routing problem with oneway streets and super-segments. Find a route even if an end waypoint forbids the specified transport. Include the final junction in the HTML output (was missed in some cases). Test cases: Create new test cases for two bugs fixed in this version. router: Improve the error message for some cases of failing to route. planetsplitter: Log an error if a foot/bicycle way doesn't allow foot/bicycle transport. Do not mark nodes as super-nodes if they allow no transport types through. Web pages (visualiser): Allow plotting nodes that block each transport type. Configuration Files: Change the default license/copyright notice in the translations.xml file. Note: This version is compatible with databases from versions 2.2 or 2.3/2.3.1. Version 2.3.1 of Routino released : Sat Aug 11 2012 --------------------------------------------------- Bug fixes: Create marker-XXX-grey.png icon which gets used before Javascript removes it. Provide full set of 99 marker icons instead of just 19. Add more limit icons (0.0-0.9, 20.0-40.0 and 161-200). Fix router web page problem with placing initial marker (coords not updated). Hide waypoints so that they are not visible when Javascript adds them to HTML. Fix web page font problems by choosing an explicit font pixel-size in the CSS. Fix potential crash in XML files containing lots of key/value pairs in a tag. Web pages (router): Unused waypoints show as blank rather than 0,0. Add a button to insert a waypoint to close the loop. Write the command line and execution time to the log file. Note: This version is compatible with databases from versions 2.2 or 2.3. Version 2.3 of Routino released : Sat Jul 21 2012 ------------------------------------------------- Bug fixes: Handle OSM files that contain changesets (don't raise an error). Force bicyle/foot routes to allow bicycle/foot transport. Fix problem running CGIs on Macs (md5 program name). Fix bug with pruning straight highways (uninitialised data). Fix bug with XML parsing error log (could miss some unrecognised tags). Web pages (all): Make compatible with OpenLayers v2.12 (but don't change the install script). Make all HTML files standards compliant. Allow the HTML files to parse the query string instead of using a CGI. Move all user-editable parameters to paths.pl and mapprops.js. Web pages (router): Add a button to put a marker at the current location (Javascript geolocation). Add a button to centre the map on a given marker. Automatically insert the waypoints in the HTML from the JavaScript. Added a German language router web page translation. Add buttons to switch between lat/long and placename with Nominatim lookups. Web pages (visualiser): Allow plotting segments of each highway type. Allow plotting segments accessible to each transport type. planetsplitter: Add a new '--logtime' option that prints the elapsed time of each step. Make the sort functions multi-threaded (run-time option). Improve the XML parsing speed slightly. Note: This version is compatible with databases from versions 2.2. Note: Existing mapprops.js and paths.pl files need to be updated to include new items for this version. Note: Existing OpenLayers installations must be updated if they were installed with older Routino provided script (the old OpenLayers.js will not work). Note: The CGI scripts customrouter.cgi and customvisualiser.cgi are deprecated and will be removed in version 2.4 Note: The noscript.cgi and noscript.html web pages are deprecated and will be removed in version 2.4 Version 2.2 of Routino released : Sat Mar 3 2012 ------------------------------------------------ Bug fixes: Fix some Makefile bugs. Fix XML parsing (previously it allowed invalid XML comments). Fix errors in HTML and GPX output files (highway names and bearings). Fix errors in visualiser CGI related to oneway streets and in slim mode. Ensure that no non-initialised memory is written to disk. OSM tagging: Parse information about roundabouts and store it in the database. Documentation: Update documentation to reflect changes in program usage and function. Web pages: Change to OpenLayers v2.11. Move the map preferences (ranges and URLs) to a separate file. Prepare the visualiser.html web page for translation. The customrouter script should now pick up the preferred language. planetsplitter: When discarding duplicate segments prefer to discard those that are areas. Ensure that XML file is OSM version 0.6 format. Add a new option to prune nodes and/or segments (enabled by default) - that form a small isolated sub-network. - that are very short. - that are not needed to represent a straight highway. router: Change the format of the text file output (not the all points text file). Output better HTML directions for roundabouts (e.g. take second exit). Describe mini-roundabouts as "roundabout" rather than "junction". filedumper: Ensure that all nodes needed for segments are included when dumping a region. Include a bounding box when dumping a region. *** Important Note: The tagging.xml files from Routino v2.1.1 or earlier *** *** contain invalid XML that will not be allowed by Routino v2.2 or later. *** Note: The format of the text file output has changed in this version. Note: This version is not compatible with databases from earlier versions. Version 2.1.2 of Routino released : Sat Nov 12 2011 --------------------------------------------------- Bug fixes: Speed up the routing by a factor of 3 for slim mode by copying data to RAM. Speed up routing & reduce memory use by a factor of 2.5 by stopping earlier. Delete profiles.js and profiles.pl when cleaning up (make clean). Improve output for translated versions (highway type names and text files). Fix the summarise-log.pl script for segments which are loops. Fix invalid XML syntax in tagging.xml file. Configuration Files: Add extra tagging rules to handle problems found in the error log for UK. Added Russian translations for output files. Documentation: Improve the documentation for the tagging rule configuration file. Note: This version is compatible with databases from version 2.1 or 2.1.1. Version 2.1.1 of Routino released : Sun Oct 23 2011 --------------------------------------------------- Bug fixes: Speed up the routing by a factor of 5 by improving data handling functions. Speed up database generation by reducing the default number of iterations. Fix the handling of the 'except' tag on turn restrictions. Fix the 'make install' option for the XML files. Add some more typecasts when printing data from filedumper program. Make the CGI script more robust if shortest/fastest is not passed in. Note: This version is compatible with databases from version 2.1. Version 2.1 of Routino released : Mon Oct 3 2011 ------------------------------------------------ Bug fixes: Fix bug in pathological cases with binary search (don't crash). Make stricter checks for closest nodes just like in v2.0.3 for segments. Fix routing bug where start node is a super-node and finish is close by. OSM tagging: More testing of turn relations; invalid or useless ones are discarded. An error log file can be generated to record parsing and processing errors. Configuration Files: Add new options in the tagging rules XML file. Add extra tagging rules to handle many problems found in the error log for UK. Create special-use tagging rule files for walking, riding and driving. Test cases: Create new test case for bug fixed in v2.0.3. Save expected results to allow future regressions to be found. Note: This version is not compatible with databases from earlier versions. Version 2.0.3 of Routino released : Thu Aug 4 2011 -------------------------------------------------- Bug fixes: Handle start node being a super-node with no previous segment (don't crash). Make stricter checks against the profile when finding the closest segment. Find a valid route if the start and end point are the same location. Choose the better route if one with and one without super-nodes are available. Note: This version is compatible with databases from versions 2.0, 2.0.x. Version 2.0.2 of Routino released : Sun June 26 2011 ---------------------------------------------------- Bug fixes: Fix error with handling ferry routes (were ignored). Force roundabouts to be one-way (was present in v1.5.1). Handle super-nodes with no segments when processing (don't crash). Code improvements: Use C99 standard by default and fix related warnings. More code tidy-up for 32/64 bit node and index types. Free some memory in various places (not serious leaks). Note: This version is compatible with databases from versions 2.0, 2.0.1. Version 2.0.1 of Routino released : Tue June 7 2011 --------------------------------------------------- Bug fixes: Turn relations that specify missing nodes/ways are deleted (don't crash). Shorten the messages printed by planetsplitter to keep below 80 characters. Code improvements: Various code tidy-ups and 32/64 bit node and index improvements. OSM Tagging: Check whether node/way/relation IDs fit in 32-bits (code ready for 64-bits). Note: This version is compatible with databases from version 2.0. Version 2.0 of Routino released : Mon May 30 2011 ------------------------------------------------- Bug fixes: Fix mis-spelling with surface=asphalt tag Routes between two waypoints on the same segment now work. Fix reading of numeric entities from XML files (store as UTF-8 internally). Fix turn description in HTML file (angles were biased to the right). Fix possibility of occasionally missing turn information from output files. Test cases: Added test cases for routing in slim and non-slim modes. Documentation: Update documentation to reflect changes in program usage and function. Install the license file in the documentation directory. OSM tagging: Process the tags associated with turn restriction relations. Remove the roundabout type from the parsing. Add parsing of mini-roundabouts. Configuration Files: Update profiles with new options related to turn restrictions. Web pages: Change to OpenLayers v2.10. Visualiser can display turn restrictions. Put the profile information into separate files and auto-generate them. planetsplitter: Store information about turn restriction relations. Quite a large code re-organisation - now faster and uses less memory. router: Take turn restriction relations into account when routing. Continue same direction of travel at each waypoint (unless dead-end). Add a new option to specify an initial direction to start travel. filedumper: Print out statistics about what highways are included in the database. Version 1.5.1 of Routino released : Sat Nov 13 2010 --------------------------------------------------- Bug fixes: Ensure that enough memory is allocated for filenames. Fix bug that sometimes causes crash when processing route relations. Documentation: Update documentation to reflect changes in program usage and function. Programs: Add an option to make the output more suitable for a log file. Documentation: Update documentation to reflect changes in program usage. Version 1.5 of Routino released : Sat Oct 30 2010 ------------------------------------------------- Bug fixes: Check that number of nodes/segments/ways doesn't exceed numerical limits. Allow 32-bit systems to seek within files larger than 4GB. Allow nearly 4G nodes to be stored instead of 2G before. Added rules to makefile for installation (paths specified in top-level). Stricter checking of UTF-8 in XML files and better UTF-8 output. Improve error message if parsing of command line options fail. Fix bugs in router's --help-profile-json and --help-profile-perl options. Rename heapsort function to allow compilation on Mac OS with no change. Reduce impact of property preferences close to 50% by using sqrt(). Documentation: Update documentation to reflect changes in program usage and function. OSM tagging: Traffic restrictions on nodes are now included in default tagging file. Added processing for ferry routes (as pseudo-highway type 'ferry'). Process foot and bicycle route relations to create new properties. Configuration Files: Added Dutch output translations. Added ferry information to profiles. Added foot and bicycle route relation processing. planetsplitter: The slim mode now includes the output data as well as the temporary data. The slim mode is now a separate executable and not a command line option. Traffic restrictions on nodes are now understood when parsing OSM files. Falls back to installed tagging.xml configuration file as last resort. router: Added a slim mode (as a separate executable and not a command line option). Traffic will not be routed through a node that does not allow it. Falls back to installed profiles.xml & translations.xml files as last resort. filedumper: Added a slim mode (as a separate executable and not a command line option). Web pages: Added Dutch translation of router.html. Version 1.4.1 of Routino released : Sat Jul 10 2010 --------------------------------------------------- Bug fixes: Don't crash if start and finish are the same point. Don't crash if several translations but --language option not used. Don't crash if middle part of route cannot be found. Don't allocate so much memory for intermediate nodes; routes much faster. Fix problem with finding closest segment to the specified point. Documentation: Provide HTML versions of the documentation (copy to web directory at install). Change URL for website to http://www.routino.org/. Configuration Files: Added German output translations. planetsplitter Slight change to algorithm for finding super-nodes. Web pages: Provide HTML versions of the documentation. Change URL for website to http://www.routino.org/. Provide updated HTML files, the same as on the website. Change to OpenLayers v2.9.1 and build custom version if Python available. Version 1.4 of Routino released : Mon May 31 2010 ------------------------------------------------- Bug fixes: Speed up start/via/stop point within segment search algorithm. If no segment is found don't try routing but exit with error. Improve the error messages by adding operating system error info to them. Rewrite of tagging rules fixes bug with wheelchair access allow/deny. Files greater than 2GB can be read/written on 32-bit systems. Fix bug with profile preferences when optimising a route. Stricter check on profile validity before starting routing. planetsplitter: Add --parse-only and --process-only options (for incremental parsing). Allow filenames to be specified on command line (default is still stdin). Improved the '--help' information to describe all options. Remove --transport, --not-highway, --not-property options (use config file). Use tag transformation rules in configuration file not hard-coded. router: Removed compiled-in profiles and use profiles loaded from XML file. Improved the '--help' information to describe all options. Change the name of the --profile-json and --profile-perl options. Allow selection of the outputs to generate (or none). Added HTML route instructions output. GPX route file contains instructions at each waypoint. Read in XML file of translated words/phrases for outputs. Added options to specify file of translations and language to use. Remove copyright.txt file and put information into translations file. filedumper: Improved the '--help' information to describe all options. Added the option to dump an OSM file containing database contents. Web Pages: Combined generic map CSS into one file (not copied in two). Much better support for IE6/7/8 with browser detection but not perfect. Re-organised and tidied up the Javascript. Added button next to waypoints to centre it on map. Added button next to waypoints to set as home location (uses browsser cookie). Create shorter URLs for custom map (ignore default values). Reduced and clarified the amount of editing to customise the Javascript. Made it easier to translate by moving text out of Javascript (not visualiser). Prepared for translated versions of web page (Apache Multiviews). Added option to select language of output. Use HTML output from router to get translated instructions. Version 1.3 of Routino released : Thu Jan 21 2010 ------------------------------------------------- Bug fixes: Ensure output even if the distance between two adjacent route points is small. Correct the determination of waypoints for abbreviated output. Check the command line values for filedumper --dump options. Made the verbose output consistent between different places. OSM tagging: Recognise "designation" tag to determine designated paths. Recognise "steps" tag to determine the highway type. Recognise "wheelchair" tag to determine if wheelchairs are allowed on highway. Recognise "moped" tag to determine if mopeds are allowed on a highway. Recognise "surface" and "paved" tags to determine if a highway is paved. Recognise "lanes" tag to determine if a highway has multiple lanes. Recognise "bridge" tag to determine if a highway is a bridge. Recognise "tunnel" tag to determine if a highway is a tunnel. New Features: Remove "bridleway" and "footway" highway types and use "path" highway instead. Added "steps" as a new highway type separate from the "path" type. Added "wheelchair" and "moped" to the list of possible transports. Added "paved", "multilane", "bridge", "tunnel" to list of highway properties. Web Pages: Updated for new features listed above. Added popup to display instructions for each step in route on mouse-over. Added buttons next to waypoints for: add / remove / move up / move down. Highlight user selectable parts of form in yellow on mouse-over. A few small changes, improved CSS, improved Javascript. router: For each waypoint choose closest point on a segment and not just closest node. Added the ability to set preferences based on highway properties. Changed the text output formats to include bearing and turn information. Version 1.2 of Routino released : Wed Oct 21 2009 ------------------------------------------------- OSM tagging: Recognise tags "vehicle" and "motor_vehicle". Handle duplicate ways in the input OSM file (e.g. concatenation of 2 files). Database: Identical ways are combined to reduce database size (~80% fewer ways stored). Routing: Fix weight, height, width, length restriction routing. Allow up to 99 waypoints to be specified instead of 9. Visualiser: Don't display speed limits for tracks and paths unless a value is set. Draw all super-segments that cross the selected boundary. Web Pages: A few small changes, improved CSS, improved Javascript. Changed marker colour when waypoint not selected. planetsplitter: Optional slim mode uses minimal memory at the expense of temporary files. router: Less CPU time for routing (~30% less). filedumper: Allow dumping individual nodes, segments and ways (for debug). Version 1.1 of Routino released : Sat Jun 13 2009 ------------------------------------------------- Inputs: Improve parsing of OSM file (imperial units). Ignore nodes that are missing from the input OSM file. Outputs: Create GPX route files as well as GPX track files. Read in an optional copyright.txt file and include contents in output. Make better choices about what to output in the abbreviated text file. Routing: Allow generating a route with intermediate waypoints. Use preferences for highway types instead of yes/no choice. Choice of closest node to start/finish points ensures transport allowed. Visualiser: Added data extraction function for viewing routing database data. Web Pages: Include full set of web pages for creating customised online router. Documentation: Included NEWS.txt file. Included documentation for installation of web pages. Version 1.0 of Routino released : Wed Apr 08 2009 ------------------------------------------------- First version. routino-3.4.3/doc/html/ 40755 233 144 0 15003124307 10060 5routino-3.4.3/doc/html/output.html 644 233 144 37671 12520735062 12367 0 Routino : Output

Routino : Output

Router Output

There are three different formats of output from the router, HTML, GPX (GPS eXchange) XML format and plain text with a total of five possible output files:
  • HTML route instructions for each interesting junction.
  • GPX track file containing every node.
  • GPX route file with waypoints at interesting junctions.
  • Plain text description with the interesting junctions.
  • Plain text file with every node.
The "interesting junctions" referred to above are junctions where the route changes to a different type of highway, more than two highways of the same type meet, or where the route meets but does not take a more major highway. When the route follows a major road this definition eliminates all junctions with minor roads.

The output files are written to the current directory and are named depending on the selection of shortest or quickest route. For the shortest route the file names are "shortest.html", "shortest-track.gpx", "shortest-route.gpx", "shortest.txt" and "shortest-all.txt", for the quickest route the names are "quickest.html", "quickest-track.gpx", "quickest-route.gpx", "quickest.txt" and "quickest-all.txt".

The HTML file and GPX files are written out according to the selected language using the translations contained in the translations.xml configuration file. The text files contains untranslated header lines (in English) but the data is translated.

HTML Route Instructions

The HTML route instructions file contains one line for the description of each of the interesting junctions in the route and one line for each of the highways that connect them. The coordinates are also included in the file but are not visible because of the style definitions.

An example HTML file output is below (some parts are missing, for example the style definitions):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<!-- Creator : Routino - http://www.routino.org/ -->
<!-- Source : Based on OpenStreetMap data from http://www.openstreetmap.org/ -->
<!-- License : http://www.openstreetmap.org/copyright -->
<HEAD>
<TITLE>Shortest Route</TITLE>
...
</HEAD>
<BODY>
<H1>Shortest Route</H1>
<table>
<tr class='c'><td class='l'>1:<td class='r'>51.524658 -0.127877
<tr class='n'><td class='l'>Start:<td class='r'>At <span class='w'>Waypoint</span>, head <span class='b'>South-East</span>
<tr class='s'><td class='l'>Follow:<td class='r'><span class='h'>Woburn Place (A4200)</span> for <span class='d'>0.251 km, 0.3 min</span> [<span class='j'>0.3 km, 0 minutes</span>]
<tr class='c'><td class='l'>2:<td class='r'>51.522811 -0.125781
<tr class='n'><td class='l'>At:<td class='r'>Junction, go <span class='t'>Straight on</span> heading <span class='b'>South-East</span>
<tr class='s'><td class='l'>Follow:<td class='r'><span class='h'>Russell Square (A4200)</span> for <span class='d'>0.186 km, 0.2 min</span> [<span class='j'>0.4 km, 1 minutes</span>]
<tr class='c'><td class='l'>3:<td class='r'>51.521482 -0.124123
<tr class='n'><td class='l'>At:<td class='r'>Junction, go <span class='t'>Straight on</span> heading <span class='b'>South-East</span>
<tr class='s'><td class='l'>Follow:<td class='r'><span class='h'>Southampton Row (A4200)</span> for <span class='d'>0.351 km, 0.4 min</span> [<span class='j'>0.8 km, 1 minutes</span>]
...
<tr class='c'><td class='l'>21:<td class='r'>51.477678 -0.106792
<tr class='n'><td class='l'>At:<td class='r'>Junction, go <span class='t'>Slight left</span> heading <span class='b'>South-East</span>
<tr class='s'><td class='l'>Follow:<td class='r'><span class='h'>Vassall Road</span> for <span class='d'>0.138 km, 0.2 min</span> [<span class='j'>6.3 km, 6 minutes</span>]
<tr class='c'><td class='l'>22:<td class='r'>51.478015 -0.104870
<tr class='n'><td class='l'>At:<td class='r'>Junction, go <span class='t'>Straight on</span> heading <span class='b'>East</span>
<tr class='s'><td class='l'>Follow:<td class='r'><span class='h'>Vassall Road</span> for <span class='d'>0.087 km, 0.1 min</span> [<span class='j'>6.4 km, 6 minutes</span>]
<tr class='c'><td class='l'>23:<td class='r'>51.478244 -0.103651
<tr class='n'><td class='l'>Stop:<td class='r'>At <span class='w'>Waypoint</span>
<tr class='t'><td class='l'>Total:<td class='r'><span class='j'>6.4 km, 6 minutes</span>
</table>
</BODY>
</HTML>

GPX Track File

The GPX track file contains a track with all of the individual nodes that the route passes through.

An example GPX track file output is below:

<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="Routino" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<metadata>
<desc>Creator : Routino - http://www.routino.org/</desc>
<copyright author="Based on OpenStreetMap data from http://www.openstreetmap.org/">
<license>http://www.openstreetmap.org/copyright</license>
</copyright>
</metadata>
<trk>
<name>Shortest route</name>
<desc>Shortest route between 'start' and 'finish' waypoints</desc>
<trkpt lat="51.524658" lon="-0.127877"/>
<trkpt lat="51.523768" lon="-0.126918"/>
<trkpt lat="51.522811" lon="-0.125781"/>
...
<trkpt lat="51.478015" lon="-0.104870"/>
<trkpt lat="51.478127" lon="-0.104174"/>
<trkpt lat="51.478244" lon="-0.103651"/>
</trkseg>
</trk>
</gpx>

GPX Route File

The GPX route file contains a route (ordered set of waypoints) with all of the interesting junctions that the route passes through and a description of the route to take from that point.

An example GPX route file output is below:

<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="Routino" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<metadata>
<desc>Creator : Routino - http://www.routino.org/</desc>
<copyright author="Based on OpenStreetMap data from http://www.openstreetmap.org/">
<license>http://www.openstreetmap.org/copyright</license>
</copyright>
</metadata>
<rte>
<name>Shortest route</name>
<desc>Shortest route between 'start' and 'finish' waypoints</desc>
<rtept lat="51.524658" lon="-0.127877">
  <name>START</name>
  <desc>South-East on 'Woburn Place (A4200)' for 0.251 km, 0.3 min</desc>
</rtept>
<rtept lat="51.522811" lon="-0.125781">
  <name>TRIP001</name>
  <desc>South-East on 'Russell Square (A4200)' for 0.186 km, 0.2 min</desc>
</rtept>
<rtept lat="51.521482" lon="-0.124123">
  <name>TRIP002</name>
  <desc>South-East on 'Southampton Row (A4200)' for 0.351 km, 0.4 min</desc>
</rtept>
...
<rtept lat="51.477678" lon="-0.106792">
  <name>TRIP020</name>
  <desc>South-East on 'Vassall Road' for 0.138 km, 0.2 min</desc>
</rtept>
<rtept lat="51.478015" lon="-0.104870">
  <name>TRIP021</name>
  <desc>East on 'Vassall Road' for 0.087 km, 0.1 min</desc>
</rtept>
<rtept lat="51.478244" lon="-0.103651">
  <name>FINISH</name>
  <desc>Total Journey 6.4 km, 6 minutes</desc>
</rtept>
</rte>
</gpx>

Text File

The text file format contains one entry for all of the interesting junctions in the route and is intended to be easy to interpret, for example for creating other output formats.

An example text file output is below:

# Creator : Routino - http://www.routino.org/
# Source : Based on OpenStreetMap data from http://www.openstreetmap.org/
# License : http://www.openstreetmap.org/copyright
#
#Latitude   Longitude  Section   Section  Total    Total    Point Turn Bearing Highway
#                      Distance  Duration Distance Duration Type
 51.524658  -0.127877  0.000 km  0.0 min  0.0 km   0 min    Waypt  +3          Woburn Place (A4200)
 51.522811  -0.125781  0.251 km  0.3 min  0.3 km   0 min    Junct  +0  +3      Russell Square (A4200)
 51.521482  -0.124123  0.186 km  0.2 min  0.4 km   1 min    Junct  +0  +3      Southampton Row (A4200)
...
 51.477678  -0.106792  0.204 km  0.2 min  6.1 km   5 min    Junct  +0  +3      Vassall Road
 51.478015  -0.104870  0.138 km  0.2 min  6.3 km   6 min    Junct  +0  +2      Vassall Road
 51.478244  -0.103651  0.087 km  0.1 min  6.4 km   6 min    Waypt

The text file output contains a header (indicated by the lines starting with '#') and then one line for each waypoint or junction. Each line contains the information for the current node and the next segment to be followed. For each of the lines the individual fields contain the following:
Item Description
Latitude Location of the node (degrees)
Longitude Location of the node (degrees)
Section Distance The distance travelled on the section of the journey that ends at this node.
Section Duration The duration of travel on the section of the journey that ends at this node.
Total Distance The total distance travelled up to this point.
Total Duration The total duration of travel up to this point.
Point Type The type of point; either a waypoint Waypt or junction Junct.
Turn The direction to turn at this point (missing for the first line since the journey has not started yet and for the last line because it has finished). This can take one of nine values between -4 and +4 defined by: 0 = Straight, +2 = Right, -2 = Left and +/-4 = Reverse.
Bearing The direction to head from this point (missing for the last line since the journey has finished). This can take one of nine values between -4 and +4 defined by: 0 = North, +2 = East, -2 = West and +/-4 = South.
Highway The name (or description) of the highway to follow from this point (missing on the last line since the journey has finished).

The individual items are separated by tabs but some of the items contain spaces as well.

All Nodes Text File

The all nodes text file format contains one entry for each of the nodes on the route.

An example all nodes text file output is below:

# Creator : Routino - http://www.routino.org/
# Source : Based on OpenStreetMap data from http://www.openstreetmap.org/
# License : http://www.openstreetmap.org/copyright
#
#Latitude   Longitude  Node      Type   Segment Segment Total Total   Speed Bearing Highway
#                                       Dist    Durat'n Dist  Durat'n
 51.524658  -0.127877  8439703*  Waypt   0.000  0.00    0.00   0.0   
 51.523768  -0.126918  8439948*  Junct-  0.119  0.15    0.12   0.1     96    146    Woburn Place (A4200)
 51.522811  -0.125781  8440207*  Junct   0.132  0.17    0.25   0.3     96    143    Woburn Place (A4200)
...
 51.478015  -0.104870  8529638*  Change  0.138  0.17    6.26   5.6     48     74    Vassall Road
 51.478127  -0.104174  8529849*  Junct-  0.049  0.04    6.31   5.7     64     75    Vassall Road
 51.478244  -0.103651  8530008   Waypt   0.038  0.04    6.35   5.7     64     70    Vassall Road

The all nodes text file output contains a header (indicated by the lines starting with '#') and then one line for each node and the segment that was used to reach it. This file therefore contains exactly the same model as is used internally to define a route (a series of results each of which is a node and the segment leading to it). For each of the lines the individual fields contain the following:
Item Description
Latitude Location of the node in degrees.
Longitude Location of the node in degrees.
Node The internal node number and an indicator "*" if the node is a super-node.
Type The type of point; a waypoint Waypt, important junction Junct, unimportant junction Junct-, change of highway Change or intermediate node Inter.
Segment Distance The distance travelled on the segment defined on this line.
Segment Duration The duration of travel on the segment defined on this line.
Total Distance The total distance travelled up to this point.
Total Duration The total duration of travel up to this point.
Speed The speed of travel on the segment defined on this line (missing on the first line).
Bearing The direction that the segment defined on this line travels in degrees (missing on the first line).
Highway The name (or description) of the highway segment (missing on the first line).

routino-3.4.3/doc/html/limits.html 644 233 144 17142 12520735050 12314 0 Routino : Numerical Limits

Routino : Numerical Limits

32/64-bit Data IDs

The OpenStreetMap data uses a numerical identifier for each node, way and relation. These identifiers started at 1 and increase for every new item of each type that is added. When an object is deleted the identifier is not re-used so the highest identifier will always be higher than the number of objects.

The identifier needs to be handled carefully to ensure that it does not overflow the data type allocated for it. Depending on the data type used to store the identifier there are are a number of numerical limits as described below:

  1. If a signed 32-bit integer is used to store the identifier then the maximum value that can be handled is 2147483647 (231-1) before overflow.
  2. If an unsigned 32-bit integer is used to store the identifier then the maximum value that can be handled is 4294967295 (232-1) before overflow.
  3. If a signed 64-bit integer is used to store the identifier then the maximum value that can be handled is 9223372036854775807 (263-1) before overflow.
For the purposes of this document the possibility of overflow of a 64-bit integer is ignored.

The part of Routino that handles the node, way and relation identifiers is the planetsplitter program.

ID Above 31-bits

The first identifier exceeding 31-bits (for a node) is predicted to be created in the OpenStreetMap database in February 2013.

All versions of Routino use unsigned 32-bit integers to store the identifier. Therefore all versions of Routino will continue working correctly when node number 2147483648 (231) or higher is present.

ID Above 32-bits

The ability of Routino to handle identifiers larger than 32-bits does not depend on having a 64-bit operating system.

Before version 2.0.1 of Routino there was no check that the identifier read from the input data would fit within an unsigned 32-bit integer. Earlier versions of Routino will therefore fail to report an error and will process data incorrectly when node number 4294967296 (232) or higher is present.

From version 2.0.2 the code is written to allow the node, way and relation identifier data type to be changed to 64-bits. This means that a consistent data type is used for handling identifiers and the format used for printing them is consistent with the variable type.

From version 2.0.2 onwards it is possible to make a simple change to the code to process data with node identifiers above 4294967296 (232) without error. The binary format of the database will be unchanged by the use of 64-bit identifiers (since the identifiers are not stored in the database).

To recompile with 64-bit node identifiers the file src/typesx.h should be edited and the two lines below changed from:

typedef uint32_t node_t;

#define Pnode_t PRIu32
to:
typedef uint64_t node_t;

#define Pnode_t PRIu64

A similar change can also be made for way or relation identifiers although since there are currently fewer of these the limit is not as close to being reached.

Between version 2.0.2 and version 2.4 a bug means that route relations will ignore the way or relation identifier if it is equal to 4294967295 (232-1).

From version 2.4 onwards when a numerical limit is reached the planetsplitter program will exit with an error message that describes which limit was reached and which data type needs to be changed.

Database Format

The other limitation in Routino is the number of objects stored in the database that is generated by the planetsplitter data processing. This number may be significantly different from the highest identifier in the input data set for two reasons. Firstly any nodes, ways or relations that have been deleted will not be present in the data. Secondly when a partial planet database (continent, country or smaller) is processed there will be only a fraction of the total number of nodes, ways and relations.

The limiting factor is the largest of the following.

  1. The number of nodes in the input data files.
  2. The number of segments in the input data files.
  3. The number of highways in the input data files.
  4. The number of relations in the input data files.
Normally the number of nodes will be the limiting factor.

32-bit Indexes

Before version 1.2 the database could hold up to 4294967295 (232-1) items of each type (node, segment, way) since an unsigned 32-bit integer is used.

Versions 1.3 to 1.4.1 have a limit of 2147483647 (231-1) items since half of the 32-bit integer range is reserved for fake nodes and segments that are inserted if a waypoint is not close to a node.

From version 1.5 the limit is 4294901760 (232-216) for the number of items of each type that can be stored. The small remaining part of the 32-bit unsigned integer range is reserved for fake nodes and segments.

64-bit Indexes

When using a 32-bit operating system it is not possible to create a database that exceeds about 2GB in total. This will be fewer than 232 objects in the database in total. The use of 64-bit indexes will require a 64-bit operating system.

From version 2.0.2 onwards it is possible to make a simple change to the code to index the database objects with 64-bit integers insted of 32-bit integers.

To recompile with 64-bit index integers the file src/types.h should be edited and the two lines below changed from:

typedef uint32_t index_t;

#define Pindex_t PRIu32
to:
typedef uint64_t index_t;

#define Pindex_t PRIu64
This change will affect nodes, segments, ways and relations together. The database that is generated will no longer be compatible with Routino that has been compiled with 32-bit indexes. The size of the database will also grow by about 50% when this change is made.
routino-3.4.3/doc/html/algorithm.html 644 233 144 50311 12520734723 13002 0 Routino : Algorithm

Routino : Algorithm

Algorithms

This page describes the development of the algorithm that is used in Routino for finding routes.

Simplest Algorithm

The algorithm to find a route is fundamentally simple: Start at the beginning, follow all possible routes and keep going until you reach the end.

While this method does work, it isn't fast. To be able to find a route quickly needs a different algorithm, one that can find the correct answer without wasting time on routes that lead nowhere.

Improved Algorithm

The simplest way to do this is to follow all possible segments from the starting node to the next nearest node (an intermediate node in the complete journey). For each node that is reached store the shortest route from the starting node and the length of that route. The list of intermediate nodes needs to be maintained in order of shortest overall route on the assumption that there is a straight line route from here to the end node.
At each point the intermediate node that has the shortest potential overall journey time is processed before any other node. From the first node in the list follow all possible segments and place the newly discovered nodes into the same list ordered in the same way. This will tend to constrain the list of nodes examined to be the ones that are between the start and end nodes. If at any point you reach a node that has already been reached by a longer route then you can discard that route since the newly discovered route is shorter. Conversely if the previously discovered route is shorter then discard the new route.
At some point the end node will be reached and then any routes with potential lengths longer than this actual route can be immediately discarded. The few remaining potential routes must be continued until they are found to be shorter or have no possibility of being shorter. The shortest possible route is then found.

At all times when looking at a node only those segments that are possible by the chosen means of transport are followed. This allows the type of transport to be handled easily. When finding the quickest route the same rules apply except that the criterion for sorting is the shortest potential route (assuming that from each node to the end is the fastest possible type of highway).

This method also works, but again it isn't very fast. The problem is that the complexity is proportional to the number of nodes or segments in all routes examined between the start and end nodes. Maintaining the list of intermediate nodes in order is the most complex part.

Final Algorithm

The final algorithm that is implemented in the router is basically the one above but with an important difference. Instead of finding a long route among a data set of 8,000,000 nodes (number of highway nodes in UK at beginning of 2010) it finds one long route in a data set of 1,000,000 nodes and a few hundred very short routes in the full data set. Since the time taken to find a route is proportional to the number of nodes that need to be considered the main route takes 1/10th of the time and the very short routes take almost no time at all.

The solution to making the algorithm fast is therefore to discard most of the nodes and only keep the interesting ones. In this case a node is deemed to be interesting if it is the junction of three or more segments or the junction of two segments with different properties or has a routing restriction different from the connecting segments. In the algorithm and following description these are classed as super-nodes. Starting at each super-node a super-segment is generated that finishes on another super-node and contains the shortest path along segments with identical properties (and these properties are inherited by the super-segment). The point of choosing the shortest route is that since all segments considered have identical properties they will be treated identically when properties are taken into account. This decision making process can be repeated until the only the most important and interesting nodes remain.

Original data
Original Highways

Iteration 1
First Iteration

Iteration 2
Second Iteration

Iteration 3
Third Iteration

Iteration 4
Fourth Iteration

To find a route between a start and finish point now comprises the following steps (assuming a shortest route is required):

  1. Find all shortest routes from the start point along normal segments and stopping when super-nodes are reached.
  2. Find all shortest routes from the end point backwards along normal segments and stopping when super-nodes are reached.
  3. Find the shortest route along super-segments from the set of super-nodes in step 1 to the set of super-nodes in step 2 (taking into account the lengths found in steps 1 and 2 between the start/finish super-nodes and the ultimate start/finish point).
  4. For each super-segment in step 3 find the shortest route between the two end-point super-nodes.
This multi-step process is considerably quicker than using all nodes but gives a result that still contains the full list of nodes that are visited. There are some special cases though, for example very short routes that do not pass through any super-nodes, or routes that start or finish on a super-node. In these cases one or more of the steps listed can be removed or simplified.

When the first route reaches the final node the length of that route is retained as a benchmark. Any shorter complete route that is calculated later would replace this benchmark. As routes are tested any partial routes that are longer than the benchmark can be immediately discarded. Other partial routes have the length of a perfect straight highway to the final node added to them and if the total exceeds the benchmark they can also be discarded. Very quickly the number of possible routes is reduced until the absolute shortest is found.

For routes that do not start or finish on a node in the original data set a fake node is added to an existing segment. This requires special handling in the algorithm but it gives mode flexibility for the start, finish and intermediate points in a route.

Algorithm Evolution

In Routino versions 1.0 to 1.4 the algorithm used to select a super-node was the same as above except that node properties were not included. Routino versions 1.4.1 to 1.5.1 used a slightly different algorithm which only chose nodes that were junctions between segments with different properties (or has a routing restriction that is different from connecting segments in versions 1.5 and 1.5.1). The addition of turn restrictions (described in more detail below) requires the original algorithm since the super-segments more accurately reflect the underlying topology.

Algorithm Implementation

The algorithm that is used for finding the route between the super-nodes using super-segments is the A* algorithm (or a slight variation of it). This was not a deliberate design decision, but evolved into it during development. This algorithm relies on calculating the lowest score (shortest distance or quickest time) to each node from the starting node. The remaining score for the path to the destination node is estimated (based on a straight line using the fastest type of highway) and added to the current score and the result recorded. At each step the unvisited node that has the lowest current score is examined and all nodes connected to it have their scores calculated. When the destination node has been reached all remaining unvisited nodes with scores higher than the destination node's score can be discarded and the few remaining nodes examined.

The algorithm used to find the route between super-nodes using normal segments is Dijkstra's algorithm (although it is implemented as the same algorithm as above but with no estimated cost). Since these routes tend to be short and the CPU time for calculating the heuristic cost function is relatively large this tends to give a quicker solution.

Routing Preferences

One of the important features of Routino is the ability to select a route that is optimum for a set of criteria such as preferences for each type of highway, speed limits and other restrictions and highway properties.

All of these features are handled by assigning a score to each segment while calculating the route and trying to minimise the score rather than simply minimising the length.

Segment length
When calculating the shortest route the length of the segment is the starting point for the score.
Speed preference
When calculating the quickest route the time taken calculated from the length of the segment and the lower of the highway's own speed limit and the user's speed preference for the type of highway is the starting point for the score.
One-way restriction
If a highway has the one-way property in the opposite direction to the desired travel and the user's preference is to obey one-way restrictions then the segment is ignored.
Weight, height, width & length limits
If a highway has one of these limits and its value is less than the user's specified requirement then the segment is ignored.
Highway preference
The highway preference specified by the user is a percentage, these are scaled so that the most preferred highway type has a weighted preference of 1.0 (0% always has a weighted preference of 0.0). The calculated score for a segment is divided by this weighted preference.
Highway properties
The other highway properties are specified by the user as a percentage and each highway either has that property or not. The user's property preference is scaled into the range 0.0 (for 0%) to 1.0 (for 100%) to give a weighted preference, a second "non-property" weighted preference is calculated in the same way after subtracting the user's preference from 100%. If a segment has a particular property then the calculated score is divided by the weighted preference for that property, if not then it is divided by the non-property weighted preference. A non-linear transformation is applied so that changing property preferences close to 50% do not cause large variations in routes.

Data Pruning

From version 2.2 there are options to "prune" nodes and segments from the input data which means to remove nodes and/or segments without significantly changing the routing results.

The pruning options must meet a number of conditions to be useful:

  • The topology relevant to routing must remain unchanged. The instructions that are produced from the reduced set of nodes and segments must be sufficiently accurate for anybody trying to follow them on the ground.
  • Any restrictions belonging to nodes or segments that stop certain types of traffic from following a particular highway must be preserved.
  • The total length must be calculated using the original data and not the simplified data which by its nature will typically be shorter.
  • The location of the remaining nodes and segments must be a good representation of the original nodes and segments. Since the calculated route may be displayed on a map the remaining nodes and segments must clearly indicate the route to take.

The prune options all have user-controllable parameters which allow the geographical accuracy to be controlled. This means that although the topology is the same the geographical accuracy can be sacrificed slightly to minimise the number of nodes and segments.

The pruning options that are available are:

  • Removing the access permissions for a transport type from segments if it is not possible to route that transport type from those segments to a significant number of other places. The limit on the pruning is set by the total length of the isolated group of segments. This significantly increases the chance that a route will be found by not putting waypoints in inaccessible places.
  • Removing short segments, the limit is set by the length of the segment. This removes a number of redundant segments (and associated nodes) but rules are applied to ensure that removing the segments does not alter junction topology or remove node access permissions or changes in way properties.
  • Removing nodes from almost straight highways, the limit is set by the distance between the remaining segments and the original nodes. This removes a large number of redundant nodes (and therefore segments) but again care is taken not to remove node access permissions or changes in way properties.

Turn Restrictions

The addition of turn restrictions in version 2.0 adds a set of further complications because it introduces a set of constraints that are far more complex than one-way streets.

A turn restriction in the simplest case is a combination of a segment, node and segment such that routes are not allowed to go from the first segment to the second one through the specified node. Exceptions for certain types of traffic can also be specified. Currently only this simplest type of turn restriction is handled by the algorithm.

The first complication of turn restrictions is that the algorithm above requires that super-segments are composed of segments with identical properties. A turn restriction is not the same in both directions so a super-segment cannot include any route through that turn restriction. The node at the centre of the turn restriction must therefore be a super-node to avoid this. In addition to this all nodes connected to the turn restriction node by a single segment must also be super-nodes to avoid any long-distance super-segments starting at the restricted node.

The second complication of a turn restriction is that the optimum route may require passing through the same node more than once. This can happen where the route needs to work around a turn restriction by driving past it, turning round (on a roundabout perhaps) and coming back along the same highway. Without turn restrictions a route could be defined purely by the set of nodes that were passed; no node would exist more than once along a route between two points. With turn restrictions the route is defined by a node and the segment used to get there; no route between two points will ever need to follow the same segment in the same direction more than once. This means that the optimisation algorithm calculates scores for directed segments (indexed by segment and end node) rather than for nodes.

A side-effect of this is that a route that works around a turn restriction must be calculable using the super-segments that are stored in the database. This puts a limit on the amount of database optimisation that can be performed because if too many super-segments are removed the optimum work-around may also be removed. The solution to this is to ensure that the database preserves all loops that can be used to turn around and reverse direction, previously super-segments that started and finished on the same super-node were disallowed.

Another side-effect of having the route composed of a set of locations (nodes) as well as the direction of travel (segments used to reach them) is that via points in the route can be forced to continue in the original direction. If the chosen method of transport obeys turn restrictions then it will not reverse direction at a via point but will find an optimum route continuing in the same direction. The only exception to this is when the route ahead at a waypoint is into a dead-end and an immediate U-turn is allowed.

A side-effect of having the starting direction at a via point defined by the previous part of the route is that overall non-optimal routes may be found even though each section between via points is optimal. For a route with a start, middle and end point defined it can be the case that the shortest route from the start to the middle arrives in the opposite direction to that required for the optimal route from the middle to the end. The calculation of the route in separate sections therefore may give a non-optimum result even though each section is itself optimum based on the start conditions.

Overall the presence of turn restrictions in the database makes the routing slower even for regions of the map that have no turn restrictions.

Data Implementation

The hardest part of implementing this router is the data organisation. The arrangement of the data to minimise the number of operations required to follow a route from one node to another is much harder than designing the algorithm itself.

The final implementation uses a separate table for nodes, segments and ways. Each table individually is implemented as a C-language data structure that is written to disk by a program which parses the OpenStreetMap XML data file. In the router these data structures are memory mapped so that the operating system handles the problems of loading the needed data blocks from disk.

Each node contains a latitude and longitude and they are sorted geographically so that converting a latitude and longitude coordinate to a node is fast as well as looking up the coordinate of a node. The node also contains the location in the array of segments for the first segment that uses that node.
Each segment contains the location of the two nodes as well as the way that the segment came from. The location of the next segment that uses one of the two nodes is also stored; the next segment for the other node is the following one in the array. The length of the segment is also pre-computed and stored.
Each way has a name, a highway type, a list of allowed types of traffic, a speed limit, any weight, height, width or length restrictions and the highway properties.

The super-nodes are mixed in with the nodes and the super-segments are mixed in with the segments. For the nodes they are the same as the normal nodes, so just a flag is needed to indicate that they are super. The super-segments are in addition to the normal segments so they increase the database size (by about 10%) and are also marked with a flag. Some segments are therefore flagged as both normal segments and super-segments if they both have the same end nodes.

The relations are stored separately from the nodes, segments and ways. For the turn restriction relations the initial and final segments are stored along with the restricted node itself. Each node that has a turn restriction is marked in the main node storage with a flag to indicate this information.

routino-3.4.3/doc/html/installation-ms-windows.html 644 233 144 16500 12563643607 15633 0 Routino : Installation on MS Windows

Routino : Installation on MS Windows

Using Cygwin

Cygwin is a large collection of GNU and Open Source tools which provide functionality similar to a Linux distribution on Windows. A Cygwin DLL provides substantial POSIX API functionality therefore providing direct compatibility for most UNIX source code.

Since Cygwin aims to replicate a Linux-like system on Windows it is the simplest method of compiling Routino. The disadvantage is that all programs compiled with Cygwin require a number of runtime Cygwin libraries which may introduce a runtime speed penalty.

The installer for Cygwin can be downloaded from http://cygwin.org/; there are 32-bit and 64-bit versions available. For compiling Routino the Cygwin installer should be run and the following packages selected (any dependencies will be automatically be selected at the next step):

  • base packages
  • gcc-core (in 'Devel' menu)
  • make (in 'Devel' menu)
  • libbz2-devel (in 'Libs' menu)
  • zlib-devel (in 'Libs' menu)
  • perl (in 'Perl' menu)

To compile Routino open the "Cygwin Terminal" change to the Routino source directory and compile using the make command.

The programs that are compiled planetsplitter, router will require the Cygwin runtime to be able to run them. The library libroutino.so should be usable with other Cygwin compiled programs.

Native Compilation

Routino has limited support in the source code for compiling on Microsoft Windows. This includes a set of functions that can replace the mmap() and munmap() UNIX functions which are not available on Microsoft Windows.

The source code should be downloaded, either as a release version file or from subversion - no instructions are provided for this step. The release versions include some files (mainly the web icons) which are not included in the subversion source (and which may be difficult to create on Windows).

Using Microsoft Visual C

The Routino source code (for the router at least) has been modified so that it will compile with the Microsoft Visual C compiler.

Compiling Routino with MSVC is not supported directly since there is only support for using Makefiles in Routino. The files that need to be compiled for the Routino router can be found from the Makefile in the src directory listed in the ROUTER_OBJ variable.

To compile the router in slim mode the pre-processor definition SLIM=0 must be set and for non-slim mode SLIM=1 must be set.

The default directory for the Routino data files must be set in the ROUTINO_DATADIR pre-processor variable. If the router command line --data option is going to be used then this variable can be set to any value.

Since Microsoft Visual C does not fully support the C99 standard it is necessary to tell the compiler how to handle the inline functions. This can be done by passing in the command line option -Dinline=__inline to the C compiler.

Using MinGW

MinGW is the "Minimalist GNU for Windows" which includes some of the common GNU programs; principally gcc and related programs for software development.

The installer for MinGW can be downloaded from http://mingw.org/. For compiling Routino the MinGW installer should be run and the following packages selected:

  • mingw-base
  • msys-base
  • mingw32-pthreads-w32
  • mingw32-libz (dev package)
  • msys-perl

To compile Routino open a DOS command window and set the path to the installed MinGW and MSYS software. For example if MinGW was installed in the C:/MinGW directory then the path needs to be set to C:\MinGW\bin;C:\MinGW\MSYS\1.0\bin.

From within this DOS command window change to the Routino source directory and compile using the MinGW version of make with this command mingw32-make.

After compiling Routino a set of library files are created (routino.dll, routino.def and routino.lib). These should be usable for linking with programs compiled with MSVC.

Using MinGW-W64

MinGW-w64 is an alernative implementation of the same concept as MinGW but allows for compilation to 32-bit or 64-bit executables.

The website for MinGW-w64 is http://mingw-w64.org/ but the downloads are available from http://win-builds.org/. Installation of MinGW-w64 is slightly different from that for MinGW but a similar set of packages will be required.

The compilation method for MinGW-w64 is the same as for MinGW and the same files will be compiled, the only difference is that by default a 64-bit version will be created.

Limitations

A native Microsoft Windows compilation of Routino is more complicated than compiling on Linux, other UNIX system or Cygwin. This is probably not an option if you are unfamiliar with software development on Microsoft Windows.

The size of files that can be accessed with an MSVC or MinGW (32-bit) compiled version of Routino is limited to 32-bits (less than 4 GB). The MinGW-w64 compiler on 64-bit is able to handle larger files (bigger than 4 GB).

The Windows operating system does not have a function equivalent to the fork() function on UNIX. This means that it is not possible to use the planetsplitter program's built-in file decompression with an MSVC or MinGW compiled version of Routino.

Example Web Pages

No instructions are available for using the Routino example web pages with the Microsoft Web server (IIS).

For information on setting up Apache see the "Example Web Pages" section of the main installation instructions.

routino-3.4.3/doc/html/readme.html 644 233 144 26241 15003124307 12244 0 Routino : Software

Routino : Software

Routino Introduction

Routino is an application for finding a route between two points using the dataset of topographical information collected by http://www.OpenStreetMap.org.

Starting from the raw OpenStreetMap data (in the form of the '.osm' XML files available on the internet) a custom database is generated that contains the information useful for routing. With this database and two points specified by latitude and longitude an optimum route (either shortest or quickest) is determined. The route is calculated for OpenStreetMap highways (roads, paths etc) using one of the common forms of transport defined in OpenStreetMap (foot, bicycle, horse, motorcar, motorcycle etc).

When processing the OpenStreetMap data the types of highways are recorded and these set default limits on the types of traffic allowed. More specific information about permissions for different types of transport are also recorded as are maximum speed limits. Further restrictions like one-way streets, weight, height, width and length limits are also included where specified. Additionally a set of properties of each highway are also recorded. The processing of the input file is controlled by a configuration file which determines the information that is used.

When calculating a route the type of transport to be used is taken into account to ensure that the known restrictions are followed. Each of the different highway types can further be allowed or disallowed depending on preferences. For each type of highway a default speed limit is defined (although the actual speed used will be the lowest of the default and any specified in the original data). To make use of the information about restrictions the weight, height, width and length of the transport can also be specified. Further preferences about road properties (e.g. paved or not) can also be selected. The simplest type of turn restrictions (those formed from an initial way, a node and a second way) are also obeyed.

The result of calculating the route can be presented in several different ways. An HTML file can be produced that contains a description of the route to take with instructions for each of the important junctions. The contents of the file are created based on a set of translations specified in a configuration file. The route is also available in a GPX (GPS eXchange) XML format. format file containing either every point and highway segment (a track file) or just a waypoint and translated instructions for the important junctions (a route file). Additionally there are two plain text files that contain all data points or just the important ones (intended for debugging and further processing).

One of the design aims of Routino was to make the software are flexible as possible in selecting routing preferences but also have a sensible set of default values. Another design aim was that finding the optimum route should be very fast and most of the speed increases come from the carefully chosen and optimised data format.

Disclaimer

The route that is calculated by this software is only as good as the input data.

Routino comes with ABSOLUTELY NO WARRANTY for the software itself or the route that is calculated by it.

Demonstration

A live demonstration of the router for the UK is available on the internet in both OpenLayers and Leaflet versions:
http://www.routino.org/uk-leaflet/
http://www.routino.org/uk-openlayers2/
http://www.routino.org/uk-openlayers/

The source code download available below also includes a set of files that can be used to create your own interactive map.

The interactive map is made possible by use of the OpenLayers or Leaflet Javascript library from http://www.openlayers.org/ or http://www.openlayers.org/two/ or http://leafletjs.com/.

Documentation

A full set of documentation is available that describes how to install and use the programs as well as what should go in the configuration files and how it works.

Status

Version 1.0 of Routino was released on 8th April 2009.
Version 2.0 of Routino was released on 30th May 2011.
Version 3.0 of Routino was released on 12th September 2015.
Version 3.1 of Routino was released on 5th March 2016.
Version 3.1.1 of Routino was released on 6th March 2016.
Version 3.2 of Routino was released on 12th March 2017.
Version 3.3 of Routino was released on 7th September 2019.
Version 3.3.1 of Routino was released on 8th September 2019.
Version 3.3.2 of Routino was released on 18th September 2019.
Version 3.3.3 of Routino was released on 30th December 2020.
Version 3.4 of Routino was released on 11th June 2023.
Version 3.4.1 of Routino was released on 1st July 2023.
Version 3.4.2 of Routino was released on 29th March 2025.
Version 3.4.3 of Routino was released on 26th April 2025.

The full version history is available in the NEWS.txt file.

Changes in Version 3.4

Bug fixes:
Avoid infinite recursion when parsing route relations.
Ignore excess data rather than fail to process huge route relations.
planetsplitter:
Speed up node processing on large databases.
Merge some steps together to speed up processing.
Speed up multi-threaded sorting, increase default memory size.
OSM tagging:
Don't route through barriers (fence, wall etc) explicitly tagged on a node.
Add platforms (public transport) as highways, equivalent to a path.
Only look for access tags on barriers not other nodes.
Python:
Change from distutils to setuptools for building.
Do not try to install python module with 'make install' but suggest options.
Translations:
Updated French, Polish, Spanish translations.
Added Slovak translation.
Documentation
Recommend multi-threaded sorting.
Web pages:
Test with the latest version of Leaflet (1.9.4).
Test with the latest version of OpenLayers (7.4.0).

Note: This version is compatible with databases from versions 2.7.1 - 3.3.3.

Changes in Version 3.4.1

Bug fixes:
Fix error with sorting (without threads, not slim mode).

Note: This version is compatible with databases from versions 2.7.1 - 3.4.

Changes in Version 3.4.2

Bug fixes:
Fix bug with using uninitialised memory.
Fix some problems caused by changing index_t to 64-bit type (not default).
planetsplitter:
Refactor some code
OSM tagging:
Rework the node tagging, only consider barriers as blocking access.
Translations:
Updated Spanish & German translations.

Note: This version is compatible with databases from versions 2.7.1 - 3.4.1.

Changes in Version 3.4.3

Bug fixes:
Fix bug that would crash on some turn relations (partial undo of v3.4.2).

Note: This version is compatible with databases from versions 2.7.1 - 3.4.2.

Other Versions

There is a version of Routino (in subversion, on the branch called "destination-access") that allows the first and last waypoint of a route to be on highways with access="destination" or access="private". The database is not compatible with this version of Routino.

License

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

It is important to note that for this program I have decided to use the Affero GPLv3 instead of just using the GPL. This license adds additional requirements to anybody who provides a networked service using this software.

Copyright

Routino is copyright Andrew M. Bishop 2008-2025.

Homepage

The Routino homepage has the latest news about the program.

Download

The download directory contains the latest version of the source code.

Subversion

The source code can also be downloaded from the Subversion repository with a command like the following:
svn co http://routino.org/svn/trunk routino

The source code can also be browsed in the Subversion viewer which also has a list of the latest changes.

routino-3.4.3/doc/html/example0.png 644 233 144 351656 11541143677 12413 0‰PNG  IHDRôA^#X oFFs6È *8 pHYs  ÒÝ~ü vpAgŽÌdKž€IDATxÚìÝuTÉú7ðou1‚k„AâBÜÝ]‰»+qwÙdã¾wwWbDˆ$ „·ƺëýc&{É{w×ïÝ„úp§Ó]tÏ<ÓÝ©©®zŠ€a†a¦°êÆ~¼D¼¬_„+Ò[ŤÍÇvªþ°”"pg‘JNË°×ØÎôÈx^¸(ÎC#TC)éa‰žÏXæ£.•.ysÇó™ÇG J(‡Ñ¸Ü`R_h º—é# ÄϘp<”žùW†a†a )_8@ƒ÷È€“G”¦¡Í^²rÓü'MœY«UégÎ{m—)_Cež&l×W7Å Š+²FÀ<Œ8±îõ›øéëÝ·Zs%ù}ÿdWËŽIlÃxR‚¬Ç8q/}OHÀƒ jýÍ0ÿ Vqg†a¦ð)Ø .Â-'­¡GÓ“[Šøöw˜ ‘N([³Wie·eŠŸà ±ûIgŒÏ×ЉGémZLfÓRžm˜¢÷1–:úó«ƒRŽ»ÑýYÇ×?§Ì–Yµ‚<#=…ºŒ&£?Žã2‘#Ì!² <ó÷cw†a†a +b©¸Ã" Ç'âÚ‘ƒd–EÇÑhKÁ g<†;¹Œ.U­Tð˜Þ å_úãêHóaú£zѨàsȯ¤Œ´Ÿì®´YþX½ÜØ~WÌSMlõ•/#ʽr}“SײΖ¨pŸž¡oñÖAQtµ¾„µÄ3ë„e†a†a V+£(œ‰?aiAa®8ž‚µ½Ö:ï7nv7Öz^º^ë‰A¾ÞgIþW^Ÿk7næCI’ =c“%ßý©kºŽã¶£ª¾í´ÞáAèæŸÓòÎç[«æ’Î\urÈ\QTÑ%˜Š+x xp–¯ìaþ«¸3 Ã0 Ãü$ࡇW‘CA%FÐx[Š´Yäè6©C­eŠÕôñqw×8‡óº†ƕʕҟ$žäûñs?_Èn’7hùô;¥^5ÝõìTìÏùyŸô–ý<ˆ¸Bï¡–¡vâ¢õiemðÌ_ð, Ã0 Ã0¿Ã rHÀÓÈÄZ:•pƒBjª…žoÖ§}̹¸óæ“ɱŠ÷º ¿ÜDÿ•Õ›Š>q¼c{¢-’¯7–7?³Û­8"mÒôXIWŸ´Z¿òE‡JŽrHâcr^ÚÒAt(váÞñ;ÈÒ›—‘h¤!Çò °ñ…kqg†a†ùûXºÓX:´¸C ®1 ÂñWzE-EìŽÉ ÒØ>öFû¿Z½K©5>Ÿ]c컡±i£9_;Îf~­j¡h(«pÅÉÃÈŒø)foº–öøØå¦ï}ziÏÐ6\sR‰4„®ÇQº­1_‡|Ö‘¦0cw†a†a˜\ÁþèY˜Žž|R¤ÇhkzÉRÄµšª“¢úÈ*Ukû ýP91pˆËI‡Í$“"?ÄÐ^ð ¨ ˆ“&J:¤6ézvZ´wB½5;ïŽy~éÓ»vŸvX•¹èÃ-#X+>¡‰(ƒãxx–!¾°aw†a†a˜VÁ!­ž°…‘‚V\y²Å/4•-z9-µ]7òEµŸƒÓ}¨d¨¦ÈTT‘¥™7åæõ&;¡¯(³ U®—û™ƒ ÄtýÄܨ6ñg–:ߎ~¹!²aÒ¦´uÖÆ0âJSÚ…~Àh¬ƒRH ƒ föüØXÅa†aæß§@5šTÇvLàNr‰Zp:ÇR¤ÂHÞŽk&Ù×*WÆ¡cRÉ:>ý¥ÛäÞR—ü.ù{ Ò'ü .S#£’‘ÆÑSêÞ-Ïsß;®¬ñâÕºá_Ì™_,û!Â!tŽP3° ‰ÈŽ%—üQ±Š;Ã0 Ã0Ì¿[ÁN,Ap†-çLìIèr¥'ÑÓ,t+þѣµÞ”îܼb`†— À@:R¿ÃXÅ|…Ë!_ÈÙhÅtÙØ¬Á¹tô×Òû¼UýüúÎâ—ËS6k/ê·YöCnq•à@*ãºÑ¢Ôi:ýˆ÷°…-8ä ‡õŒÿþ±Š;Ã0 Ã0Ì’¥¶%Î’b’LÀuüL.’Þh"Þ¡±–Žà~%Ùm&U-æ:õUeVjá9Ôå5@š¡†öNþLã.åisI6é!="ÙŸ˜¾>[¿mÿ½uïêì*÷$çýåÍtõ³¯­m=îTE]ÌÁ}ܰ&—K/ù#œJ Ã0 Ã0Ìž¥ún‚½Qþ|ÙB* 3h=d)ÂÇ“4òÓ a!õ4#–V½¬)]ʳ»Ë $˜˜ÞÍ)â\YMîžäÓ›ÇÒlj®4I¨?nÏ›§/Þ¿'ud1;¶Vtc1/õ—”â"‰-w€TˆTÛ´Sm}£î½j™Î.~Ò/aÝÔ¥a> _?>Ó­]Îý…Á=WGGí>Y¯L§-2íÂ}¸–Ò÷Æ_$ŸÈ04†ß×ä•Ö ñÌw‚G\`4è gíï Ã0 Ã0ÿU<8œÅ$ÂyHâ’IK<’–äÇqʜц1¦¦·ÞÇoû²éŜ܊٣¦Ö÷.^ÏþB9_»÷«²>'_®ï[,³ÊU•DzÙùqò´Ï/3½Ë,VoQÚ®è\¥|ZoÃ)íª3eÚýÆÆB'ñ>A‹\‰/8ŽCŠ•ˆÀ+˜ B´lemñJD#YÖ±‰a†aæ?ˆP@ïÄu"]…Öb5‹ãi8[ÄûgÝb_eÄævÝËè¤lX9ÀX$Íy«zzJHshŠAkŠÔ¹Kó3¨‹Ñ¨eÎ2t®™'•ÙàåºôBm(ïäÄ©¿,øuÑÃkoïžqïê ¨3mo}9ùœœÌ$âl)æb§µ%Þ3öqýyù|þ)÷Î0S(/ú¡\aWHù­*Ï0 Ã0 Ãü»È Ê‚ñ&јÍå’)ä©pFœO7ZŠ”›áçσ´(s¸s‘znã]]Ûª3¡/] ȼøû9’´6º5—oí>ý ø´"ÛÕ¿HfŽÒæY½M¾¹«5Ï_QBê·Ç<¶ØÈ¼Ë¦rÚ‘êÆ6J„²bFdîG×ÔÊ+nD|õæÌ¸7©‰©y±ÆDóËѹQ¤6ÒÄDš†Š¸x|Aòa´ke¼ÿS‡*6òSŸ‘‡|` *!ãp÷Yh†a†aþ%rHÁÃÌDoTãús‰JÜ(V yt)}!è|Š#Jyìø¢åøÒŸ»oot,ð¹|¾J#?ˆ£in¤lþj-5$ :÷6fÈêÕGŸ¸'I©‹‹ëðzÛ¶Š–¶ÞòMï7½ Nouö—ŽQÍB[•kŸ›æ|ƾ…ú²é\~ñU Yåòž“]Ò÷·ê¶¶Áµ·ó?glœø 3êó!ÅKÏ k…[¢³åås/È8â@:¤åáŒv,;Íÿ–Ä^PäÈ´ÖŠ{”…«¸3 Ã0 ÃüKd€³TÙ¹²¹ˆCшÅÅ^üJTs¹=á}ן+o}º¦«oYM¼ÃxåÀl/nЦ™+3kêüȯï|;q[‘³å_µ{ØìMù/ÖYT—ØVŠ›ž\)‹ ì³Ü³tu0Ì\bæÚˆ‰O®½uÿîë´¾nsJœöSå÷‡ge<~2ËÍMµÃóý µjTö q­^l€Û‚Q¥«f¥œ^7à~ѨÑF¿hwËTF”‹O¬D;I_®&9dn/£›Ðûp 6B‚|6cëÄþ¤Â,³†›ô@Yø²¯O Ã0 Ã0ò[jbm…¾õèB´äF¢!*ÁK”оÐà-@ò.ˆ¸•áÒ~W¹…Ý’, ø¬PùÈ}a¼x <–'WMÝš×äÐÈkžo>®zp¸ò“×|¾˜3ÞrnyCpÑ4#û^^ cÇw{>ÈÜ$¸¬»gÑŽ;U¾¥ì=+;n˜øÊ5ùÜt\Á#ìÝõ,,vêˆ>U•Á+:¼*i,ï®qd[Äœ—ïa¬/”¯‹Ã«Ä{põÞï&®ÓF¾«šºî×û£ê^Š‹m™4ëË"­ZHÂAÌÆ5<¥‰ƒux‡ ä~3íóŸÐ¬ˆÿý¢Û­gܼÄv†a†a˜¿A 8ëò@´DiþCýuÁªCK÷©;#§µhj¯}pq爧”F˜Ço¦ôÖ¯ãNPa¿-ƒœ^7´ÚO[†\¯Õ:¸¢÷%‡·÷@4x‰i\or—(ˆ‘˜Dz¬}âWŸEëæQ]dB…pï1íUµ]ýÎrMH ÞɈÄû¹àÞJz¸L²û<ïXƒ‹~é>Ù«[+J es—õ-™¿oVµ^G(ß¼ßxJ—4äüòéÈCí.L(^³té ¶ãä}¥C î¿MRIù ÷°ÞºJÁRLþÇt«V:±¸õã$ápƒÅ„ù†¥7ž]„ Ã0L!gi_WA)Ú¡6üÈÒÈSÒ‘Ö"Mp }+t/ÑÃååÞ×3§7‹Ê¥kŽø•Ò»''€Òˆ ãC(½_b‚ñË´“†ø­3âEõÅíÜcl—<‘{F¶î`<¡rÈÀ£(œ¡–´åD£'líšS©2ýòðÅ$JidµIõ‡Ù·m_¶C"‰à劒V8„™ü¯ä éYð(þµÇhn®{ÝÊ·Ú¤Ï×&]ì*Pº¸ÜÀÞ”ÎÛÜ7;ïüŒ#=—Pºàqÿ•”.<> YLؘ·ƒÇºU,¹Ùe”ò‹¢zÁ½qÙd)†Y¨‡2ð4Öä’„¥ÿ7r<äK@†5Ü]H|`1a €â·K,‘p'ÃÉp#«È*4à £u«Rv12ßœ9_ÛŸÞâ-É:²Í œ9NìÌaæ;c`jÝèë¸Ö¤Ë_l9¨Z~ñRGVÌ_ݪ~ÝåÃ#Ó(4¾¥·‡õ¢ô^« ýß>Ü;«oóy_ú?ª¾ÑNÑ>vÚ‚{àìÈ*|â$R²íÖð¿Ý]-+6ð“9ëÖ²F¯ã)½ó0ì}úÐÒžE SÍfÖ}n$ÙÄmQ ~p„ äÜRÒ :®)ƒ÷÷é÷Þ±½fÀü„†}*%®šP²ËJë&˜–ÍiÔ'$?bV÷^×éàyõúî§tѹäÍÎÑy6Œm]½FÉyξÊfòãß¼—F$1ärqκªà„SÌ?gr½ZÆ2kˆ“>„µª2€ËâP`•=‹ ówœ9íØ™Ã0Ìw†ûÿÛˆ¹=„’@lÆxÔ³®!d ^6®ÒÏû§‹~¶k?Ö\éÚæÑ)½ç6¡5¥wž‡)½Ó1ìX²Ãn&ŽÏéú¬’OÑÎ{Ô6ßì¹9‘ãæ£ jÂ×zlîÚ© ð“¸-d¡eEƒÎŒ^~Zï µFøS¹}RóݶÓÛ7ýˆÙ‰¨‰’pÇ.LG3ë>-¿›ÀEI)lÆ8n i„ì‚ñ©d?WÝbiµ&é!{3í§fwGéÂŒ)?¡ßfmß™>=£(?µßBJw¸":xtÅö'f×*V:Ùv–¼Ÿ´kÁ½I¶s=È |Æ$t¶®RC ;Ñþa‹k4vªäjYæÕd `1)Ô,³Žá‚á¸:žv<-âNÝ)à~Ìý HQ¤kù‚m¨ ³{ámYtèèÐQ"wÙî²pßî¾P|Q|!ÉìÌaæOç¯+Ê 8„$…„!šÌ'ø¦çz“•ݽ?Ÿ=òÓÓv¥ÅÅáÇÆè)X4¾/¥·VÛMé½Á&¾¾÷zßž3:÷ÒU9n¯SGʧ܃d#?…“7d žXWYÚõÿîN%Üòš8XZ⃪z÷rØŸy(|@J#'‘›Ñk²:ÿ¤ª¨(±öªE8Æþï¤iË'¯…üò€t(XÐWïð@Óú§^M‚BºÅu óìIé’ŠƒJ˜+ÍÙÜg¦nÊÌýjQ:ÿm¿XJäö?þ.ll|'Œ®R­|ðM¹ú¦Í–o{ﱇŒÃU,G}‡»uÏ:Ôü6Žjí_Ýϱä2iÊ‚Æpí¹önY®&­&•;²óÈÎyk»®íÚc‹s¢s"I€=ìÉg2ˆ B}1Æzæ´áÚ`†õÌiW­ÔxÔí¨ÛÂá붬ÛÒ3Þ9Æ9†$@ 5ùD†!hÈ"Æ0ÌÿXj+–b(jñ·¹h²ÿ¯ 6é]¹÷ɳE—Üj»˜¶ ?6–£4Â4~'¥·3ÃFSz'6LÿÁá`µþƒ'TèQɱˆÔi–ê›AœäˆÇä é‡p…=”Ö Ü?Sa%µ‘‰¥–e%'_%éô˜üº¸{OJ¬™x6©Þ‘ô'Üò]•›,ƒhI¢Â–?Üî·×PÞp#¹ ¸FáÒ×£Xøl³¿¬ë_?»‚WÆç©qÝ{QºÈuÀbziÞ¾÷uÑ3ãz#ç¦ö@éûAN¯U£üÛÌð¨[ºl´Ë2e¦<ë›ÃÖ#GH}Ž#2ܲ®’Y_ «þ¾}i«×­h ÿd‘±,&…Zk´Fk Æ`Øä†âY•Ô*©|ÀÙf¯·îͺ7Cû8p:`ÄÌÙ¡d(«¸3_‘Ïäó×ñ¥u¥uÀ‘›Gnn8³!kCÖðIŽk×ZÏœî¤/é‹,b ÃüXZµí ‚ }Ñ%9/² é¤<’¿VR¥%ùõ\‰g«µö9^jµºÓVý/W‡Ž)½;~|"¥SÆ·¦ôv£0åÓ [7õXÚÿYËÚ¥Ž8¶Ð¼Rh ŠÀ½#‡ð† ÔÖ¼çÿ_oõR-”AÞ‹ëAú[V\)½‚ï0‚Ò£'nÝÃûu¨êùØ>Ïú¦’F¸úìßRVA qÇ çß™X°Hñ]>ê Kl¯ªö!/ìyç0JŸxœÒù-ûMÌ[5ãdÏ™”.Ú¿¥‹n 0¾WŽ ìä6)³Öõ2-<[ÙVF~+²‰TÀNt@-”€lØÊüŹ =?6ÊE 8BÃÇ3™ 5d²ÈR×q×­×l1Y1eµ×F\ëä¼¼Ùòf=r;è<  šíDÛ‰Üs2†Œ!uqgPœ…±àb¸’eYnö²ÙË %×Zwj@¯aS†M©ÑÚv¦íLî9‘^"±hÎ"Æ0Ì)Ы۲¢.²°Œ£\#Ò鯋·\WÝ¿x¹³Å—:·ëGé­ñãNSz§sØaJï¬ {NéÝnã“"Wþò¡»û V«JCÚÿ¦‹KåBHS’F&àu•¥²þhG–ã½ÉSÔC%xîLÑ5éBÓïš&Ô ô¶)lb“:•=½­ùÔÉÒ7ÿál‰·¼»’ÄÏ9±Á‚ëÝ_ªïÛLÕ¹ÞÚr'>D輊Òűƒ¤‚ý\UŸ›ù‡gµëuSl?w_ß*”.®>°RÔÄš]ÛÎY_,ŸäÓÔ¾…ºô7G)K¼ðœkIJ!jÈ~¤ËÚâ¯9÷55³ °±P‰]é…ôþD‚Hxð *^Å+[m;½íô®—ÏóŸçÇŒ«Y­fµ†Ö4RÜsî9÷†EŒ)ˆOä%jËrß­}·¼–™™Ñxú–é[æ‡[ÏœÁÜ`nê¢.BYĆù*Ø¶Ý •áÃ/á’o2šó¹Çäx·² ¶l¸;wÃæ® ¯¤ŒºCé½ÚzQñö”Þ¢ãÞ=í»ur›K¶¼TÚס–:Y¾¦à~H:™Œ·ø€ƒ€òð‡‹uî¢ié+áÄu ¡–YZ§ïìU»JMJo%Ž‹¦ w~ ‹²¾Í„2Ö1iä2ióOTÜÿêˆÖßÍPžÄ «1’ëMª ©`A¯wv U}¦—®ëZöЧÁ7u­Hé )]P¢€¶Ä mÏS⎹Q}ÛRºäæ ŸZOØÖeÅÜI +”sô·©!ÿ6N®9@\ð3†ZWYž\NK5nYK¦â‹pƒ¬«ò0½Ùõ^8‘Ùd6™mYv~èüÐY»7}oúžŒ+3¯Ì¼´¯¬´¬´t%¬ÅZ%‰$‘$B9{ˆÅ|Å_à/ðÇ,Ë=ô|Ð#2ê—¨_^ÝšL'ÓIe,gWƒ«ÁÕ@(BÑ‘EŒa˜®@Û°+ì¡$~ˆÁl¢'3[° âª¬-¿©M›šjßRW§­œÕñ$¥7¿ŒkOiÄ®ñ£(h3¾¥wF„Œ´ß<¢›qÄÝö[ʵPdÊnóßT|%Ãø.$ gðÚ[W)!ÿïV(¹fä±¾ën}¼ Ћͮ§Œù™ÒˆSã§üÜiØ…Ú›áG(ÉÒ 7þÍ]OäIXIÆá*~–¸q.dUÁ".Nʇ åŒÙu§•sxë5VÞ1Ò%û-£ó<ú®×þbÍNãÞ¯¥ ðH(6>¬³qJFíƒenúÝp,£ù¥àÞÈ.Da;YHl@ƒo¶r…¤6ò¤Ü°um&;èlle±–þLd8.|;)<ÈKò’¼´,{íñÚãµçŒéŒéŒé\õsÕÏU÷ºçuÏëäCNz“Þ„}Ác¾Áoç·óÖÙ—CÅP1TŒ.]*ºÔôäéÉÓ­ùdÈur\Ç0 Ã01†aþ dɳNê ?ño¸ÏähÁ"|(7‘,ïOš'–oc}É.S)½qzìAJ#RÆo¢ôöݰ.”Þ¾Öæá¦_%¡½+7m¦š¡¸-1ÜçDV!™Œ!®Øe]õ57ùÿ¤ÚH:€be¹œ¿ß¯Î{ôQ—?Œ*CéÝW|ÏvYò¡ím8òôÀýÿÈ‹(øTÁŽP“xèpžœE¾æ[$V³ÝæÓĵKOûÐ"¬w§”.5à¥óŽ÷C¾Ë,ÒkžPq®}Ÿë”þ´~p‘íøÄ.n‹»7æ*… én“ðÍgÚšœ&89QüÖi§0 l5êCûãž«l7ª¾žo‘ƒ³ì>P8q]¹®œ5÷j°"X¬¸'½'½'=RåH•#U”­”­”­¬E᱈1ñ5ø¼uÈiÛ~mûµí÷¼ÞózÏë-Œ]»0ÖÚÒSUQqYĆù—œ)GëJPÍTÌîÆ7h°îÑÑ_+ww ôV‹qÓ(0ßCéݱã(½AÇž{òf«mî{åÕUíWÜ’* î‡ïÉ-#SѵáÈ!ù· 0ý×­ÁhÔµ,Ú ªz²FÙÍÏUMé½¶F5Úµ¼÷HtF%x_Ä`:üà»ÿø«’€$àq¡hÀ?!Ùߦ?qÞ­\+¿<%©vB™KïãÇì4ƒÒEqKP:_Û_’ûlFóž!”ÎoÛo4¥‹’–ýÜÒò®yóš6ØSa„·Áî’ê›ö|)²„à!†¢*¡œÔ­ÅiC¾†ê” ’ÀC2Ô@ Ên… ã3¤²Að ÃüÓ,U2L°SÑ®èˆMînö×T‡:GÕ¸¨UõÒcËšƒ¸VÄç´%@Þc< ¡¡á~%LÜf{nÙË{‡Þ^ïã`Й4ÂeËîùÙÜn²HŒ¦ý¨½°GœH‡[’* "þ<•¤»x…Ï–hè*é?›Ö&4ù2(7ª4œ–«ÚjҕβN£m¯)®¤αӗ"vxŒ©¨ˆÅÿÁWe†"(:ã® "ÝO¯‘\P\&OÈPÒ9­Žn”¡ñÜõ[í=x{}`»Jö£úרÔ! ¯ÿ ÷ŽÉ”7 35ô0Õ3Ìs¹«ú¬x>3¦q½JºÁ¥BŠÖüåýÃÓoÆoïóØ+Æ3îVVù¼qr Ÿp\!]Ñ@ÜAÀ90@°VåÿLŸÞ?³i*iÊ'ª"¤«~ë¹55H »':J(¡¤éDjMöä°Éa“Ã&òš¼&¯³d5Èj€EX„EäyFžá Þ€ Ne¾%‡rË¢åÌ!“Éd2™V¥UiU¤! i@ L0ÁÄÆ0Ì?‰ŽHp c8xLvœ¢ZÞhh#ÍYÿ•e«šGß|›øùù<@¨-”§åÅ~ÔtçÊþcãŽ{¦¥Ÿòj1yò¤Þ»Ÿ^š]Ì 3í.“÷d$^âæ¡•°QEЃԌáÖ–[ÌÂJ_r¡·¼*ó¡w*ùlvQ-HˆÒGñT2Å'Ó£ŽíËSâGbÿkn–hY~j Å1ô儉èʵ%åð!5KWÅPñŽ[/ÜêÛêtnÉ„ÌÓ¥#6'FçÖNWì’÷-àb$fÞ&¿ˆÎÉpÂe„ê‹}è:†ŽI;v íò‡³F~œqÔ»7ƒžO®ßpk‡ó‹û{~y#÷é¦OÅÒMÊ`…·LÈm¬5Ô2¸‹(=ä#gðMòBb®wèŸÞüØâýKW (ºJ“«ìCG¡†Ò(^Ü6Ò\Eâ…×ÖÎOpßæûÿs’È.Ijñ¥Ume‹$j¤¸AÆ“(Öǽ°QC µ¥3 ‚Œ`ÇÁŽƒ‹¹b®˜›y-óZæ5$æo°…-l-‹dF†‘z¤©G-ZÑVÔ:¸™ê©žêÙœx ÃüÃä‚'§¸¦äšØSäèÆJ_Ç»ž­Ó§Â@ÏvZ‹÷\O^7-e_гÔNŒEÆÅ­Ð@,K;‹Ý {kÿx‹ï·ßs ² #H:YŠƒÔ@ÍïÏ|rÊ–áȾ éDŸâî¥lÝ‘-Dr›IW¨p„J¡…þÞe±`äã‰<Ú >è ØÎ¨ÃËÈR˜Þ1¿¸á×íx‚؇†¼Úýa]×^¥¹âGË«ÅÏ+w»È:ç39F*j{æ®×Ù{ìÑtPú‡+Èú^«ÐÂÍ6ÏGƘ~[ü}zçå“gÉlV’!»HUá<}E}Ñ{q‘HBDôÏvfHÀIêóåUi²ÅËDåÛ0ÕPÓqŠÝ ;Ø}iÎ)9%§tÙî²Ýe»øX|,>NU§ªS¿>düÓÆÌŸF.r‘k=M¶Ñmt›eˆ*iBš&$ŠD‘(ËV¢ ¢`§Ã0ÿËW}O¸@-Rq:-Ž‡èƒ›½6õ.Ù‡›/o*±·í%)ô¢F¦"óM–Þ¼F2ŸoDŒæVBej a‚ðÃ<1 ‚Ò8‡ç–L]ic³«ë/’²‡éÊÕílú-áâ©[T…Òì#:‹-1 ³´ÁÔ?a]Ï2°ÕÒòŠÃ¸)€¦7ɼÁvî(yGöh9c óÈmxŒì¡Ïº¾«×§jùSþჄ(£+ï)¶ÖM˜™3 -õ Áe‰ò˜âÒ´ÄFÅ+þ4¸XÈýÀ¸­òÇ­Þ®ÞFçŤ½}˜Þ;g>\Ü'›ð›IC2ÝÄíô><ð yÐý‰¶RãÏžCÌCM•WZ'º—ÚqëI*»?:ÍÑük9ÉrÉrÉòÃ6‡mÛDž‹<y®TR©¤RÖyÑH{Òž´gcþW•«ÊUµ,‡´ iÒæV‰[%n•ØÞt{ÓíMízÛõ¶³æþ'-IKÒ’EŒa˜€% £—1?a(jy~r9¥¾Ÿå~æá0:0¢Ìø€¤Gö ¬å˜iÛZÑG°åˆ¢~ôh\i²yPÃ2_Þc¹í§÷Uöoè7Ò‡'½¹5yí…ÎÇÔCl¦JûYÊ“aÄÛ¾›·gy2ky:ë ”8‰îhÈqDŽ[ Ú…̵—¹\¤ßáçÕG„´=Jéü›ýSºpÝ€¢ºÒ3'öò6GÍÉês„Ò%§û´hbr×5+v7;^ÅÏ+ÍÎ_Õ«àÞølNFf“ZØ)ÖU6þ¯¶r¢5©¦9$%}fYEkàœFh dw‰B¤8Š£¸eQ¦–©ejÛÛÛs¸9Üž±!cCÆkÉ)ÿæÉH†u¢%aˆ0D".—‹Ë¹±ÜXn,YCÖ¯“„xÂÃ0 ó7XÚÚÍ òvÜjò“± ·‡NoXv˜]²ÃI›ÃøPãÔ‚ˆSïËg8äœÖ'öäÖÑDcþÝ1¶ÄTœ@òaL£Ù~ú É´E¬Ç…¢ \Æ©k»ÖrX¦L„=Ô“{X‡ÐïçíâkîdäB‡®8„pQ¤ÔF$£µ¤W›Ì¢ú|cÊnɳÊï:‡dlŠ:}pÈý“k"ê=¬ž û’`ó¦«\ËI\¸vù~ÚHýyµfºM©q=k¿,“÷T5¼vÛ{‹tÎUªÔßy‰]ÁN4Ò¹ô6úb ™…;XMŽ#{0•ñ5û"ÿß>¯8@œAßÛ•çH«XV‰‡h[Ì@\`Ïî…È,€5ã‡K+—V.­dkdkdkÒÖ¥­K[g˜j˜j˜j-y÷pŒùJ(¿~á'2"#2Keª¨ŠªÐýÑßZÒ#Œ,` Ãü](((ù…TÅi±‰xŠÖvÈ×l—?m;º–Öw5Š2ä²~¦vœñêÆ1'ýž·Gº ð9Öüë?tÏÒȱ=GÔµ3~I*–º4O`9úx¤;%¨^:¾ÓlU¢è#1æ¯Ñ=tÝcYΙ?2¤ñ ñ ñ ÙÆlc–=”=”Y·¡j ‹Ã0l åÊ“=DGO‚èÖúu|?–zðÙµ>q‹È—kûíMhõZúÁ/cš¢ üh)Ú{¬ù×lã°7øÕÜ n Ê¢\RÆd]È_ŒDÚ«nvýl’Ü;:¶U6³'-PþÖ¯4߯¿ú*Fw¢5¦‹é4 ÕPnp䛒änÞec¬¹ùÎ~O;Æ>©wu[Þù&½•¸•þôzRZÚVùB©œ?/É–†J¤ÚÃyyùÅݧi–Ù„U®³©\·HóÐS­.kÐÔ½2|+9ôR â8zD,A—Ñt.–Œ'EH+ÂL4…?Šþ§Ûà9€¾¢>¶µäOdîȇ fúC° pb² •©˜ k›ºÓ§)NSdf™YfNß¾;}·¡¸¡¸¡¸õQãC<ÄC0æwxcô7úý…ËÂeá²lŽlŽl¿œ_Î/·–ôƒüXÀ†ù,• ¬GWaŽJ'I÷Jjp#º»7Ì üDzóm¸Pã0Cys©W.T|ÝÞ\M"Æò®逺C…"J‰H…qOñ)ÈŒ+ùi@ödxÍïq2ïnc5h „ŒfÒrt1œ` ›*–Á£(DD# ÙÂEÚ™Þ ýp‹ùä©§3˜> U·&>îs¿j×Íü™=}ÝuÓãáÚ„5_bT•õPœ¬$“ ×ô‚Qê0GÑWV~ÂÕz(WíÞ²ÁÝZ×ÞoY±jnÕ¾ž/‹ÅèRšDÏ  æc(j¢Ì É)I¹µÍU M›Ð˜j0"°ƒ÷#‡©È…FqAgó×;öÅÒo€ÁRa¦ÛÑS…'´'½íhZœ„ÈqÓ˜*JÄ+»Bžî|çß8oç’KzÎ>°ìZ¿‡üÇ©+äÕ$ç¸'¼NvYRW¤‹6ÔqÜn#ȬRgN¹ök÷ mÊí;¯½¿ì%·óÐÛqFäè4Ç5%äy…L·Î¸+·ÎØú/Vá9€>§Áš¥òXi’t"ã!¬«L¡aiGŸ˜aYáòÑå£ËG™D&‘I2ªfTÍ¨Š¡Š¡¤!iHâu•a~O RbYo‰·Ä[4œ†Óp®W„+Âõàzp=¬% d|g†ù8a‚€ý¸†w4 Þ˜9<½²ÜIÉuÅ]é>ì[С‡‚oì‹ ÍÙ¦kf¼Ãoâò‰?]G3Ñ¿ÍAAšN+a¡%qaÂʔṓò–苚‚ÇFz×o³ÇQû’pÊù8 w8üðiH v¦IFò1§qW4Sêà:ú¢©¤=BveMÓ/5Æî÷|Êûq•ƒ6O>S»÷œ£·¶Ý[·ês’"Z¾GªæwI.ñwu;òFëÖiÎÊÎHªõ"ç¬x bjýø×„v65ëVY´–s؉î£ZZ hOšã f‘ÏÐã"V *[_Ï?5c«¥â^Ѷ‘üä¤4™û‰»#ˆ$NаûF¡¹à)ÙH6’¨Šª¨ê\Ò¹¤sIù ù ùŠÔ²©eSËZZR¹/Üî "6æwüŠ_ñ«eQÛAÛAÛÁ¨2ªŒ*¥L)SÊdSdSd_“jÕC=Ôccæ‰AI4Œ't)݇HßæZ;u›§5ùÞ¦F1–ÞÕVÈÓÔÛ?ëô*PÂU±¥ÖÄ‘…l¢z‰*èXKw‘ØÁIyYÕµ)ù£L"@·ànÀLïúö’ýü=n¿µÊh …î¼2X¶@ìÀEóqñ!íMáqîÄ‘àaq÷²g¡ïÆ×ß»½ù…ES÷]ºêv¯z|¹/­•}mdÜQ>61”1%A@<. ôªV§¤æÚ¢~¥š•Úy¯ÃÒÚ +Ùqsr£çÑó¨$hDL˜a\™K<á %äÖW%ÿ÷7à/FQoRv[ê/Mà—péÖ-¬«L¡ÑmÐF+ŽÇâ>îã¾½Â^a¯0›Ì&³)«CV‡¬ÐB -Æb,Æâ ¾à ó; ¶¸ŸÏŠgÅ âñÈrÜ@n 7в•hˆ†°¦†aþ˜rH¸(Ò—<‚3Ú`cè Fgû;ÞuŠUe?—ã¾¼±=fûÇõ©3òn 2‚áŠFÃqKâÈÂ0êNØB€›˜šþkvKý©Ì¹DÀ¯¸WdƒÓpU€]¼Ê_VÒ2m: | éÙE ü¶,nEKLSh&ª iÈãÕd Ö?4' yÇ\_ŸŠRôö'®‡>=À]¿vûLÜÙÏMä¤Nüy=…£L¦;¤É_hóD2‡ï×»jåƒÞ78·ÈÛ¹²Ã’ÚÅ*ìôèíxŠNB5ôÕt6ýÈ 5‘Aúá,¡=‚Qì›®4ÔOé¼kýì>Ä„ÝîlãrZåª(c-߇1›Ý7 …§xЧA™ÄIâ$qÚ|uóÕÍWÛ=¶{lWëi­§µžZ ò| ÈÆüâH‰ef¸u9êrô”ý)ûSöWdWdWdÅSЧ·Vë9žã9žEŒa˜?BN’f¸'(ÀÙ½R%È^>^ÿëÆîèÏÂø³ºQ×ÈèZµ5etE~ÁŒA#îçAªÂrH uÜ‘ž¸oY>å»hh›Ñ”Þ]>Þd”_¹ÌÉÉÉÉNξŸ}?ûª%S)íM{ÓÞ,bÌ¡+è ºÂ²œçççmècècè£ R©‚­E›¢)š²ˆ1 ó;l¡‚ŒèÉ%2ýÐ5ëêÊ/ò\]þcÉuîý1žó$«ïëž=Ojü eôþ/a†:T|DÛ ˜ iÜ,#ÖR = †<®B²Sö`€æc€”J2¸îþ‹Š~´ÿZü%v>ìtû†¥{• DëÀÖ{臥Â&ZŸžÅ*4G¢%×°ÍPa׃§Â»-¤éöCÊ. õšW *RÍivàÞ ëh}zš<Çtâ”Dë+±ùm`+á„4’z¨É¥ÒFÒñ|'n}é¬â^x,ÅR¬¶œ¬šhM´f¡&FcÛ8¯V^-ݾœ9r)©Mj“Räù@²HmR›Ô&ăxX§Ñy€x€8€˜‰™˜‰vh‡vB‚X€ ‘¤ Ѳ( Q.Ê…{œgGr¹'ܲzèá 5ÔPCY¡<Æ0Ìßfê'(ÅŸDšŒŸ±·Mh%-F‘šd§àb¼.D”„wx;ØpÀ4@xÂwã“ ô)Š`z¡Žže’)<2‘Ãë/ñ3úâ1M¤Ý`¤ð­ý&ÙlÅà[ò„lAOË`Vvêýn<ÿò;F˜0—ñˆª(Ex‰7çIVkóL?™SOÏ~3!qx]Ÿ­ÇÏ¿ì¹üˆíÍ›×*¼µûè,¿-”Ü‘5–%Hºå·×rúÊ_¤#ù~µåÂ|ßû<8¡Õ½ÝÎ#ë´­WÑçû@º 0FÔÑ<Ô nX‰á$×ÑhÏѦ´8í&=-u”ƒŠt<ŽB+éÇ­ Ìð^ïPñøŒ¢!1Ùšûœù{è l‚ËxhN?Ò1¤,~Áx®8qÅcº¡¸³÷øóÑï5Iß)^êÜ »»^V†{ƶúôÜæ¸,@rŠ/ÁŸæ/›!æÃæD±‹8³gjH~À˜«aý65;w¬_7±~b ÞN®MéŒÃÊS3ê"«qŒëÍÞÖû¼ôgiGI^õÁ›^Ÿ¾{ïñÇê©+Èy|À>Ú>èÎ>©ÖS<…Æc<.Øm´ÛHL“FLáwÖ~©ýRÿ‡ÆáÆá†3Ç,;Øþ`{æ¬Y3øºæÃæÃ†c&ÞÄ›Ï {…½Â^ã>ã>ã>!DB(¥”þgnk°k¸T.•KERŸ·x‹·–a‘ô}E_!ш¶T:ƒÄà^ᕵü;¼Ã;E£hâ‡8d#ÙÈCò¬ËÈ@rƒd! YÈüÿ~Ò‘†4ä£ š >ðùÈ5Ô ˆD$¤¸‹»p†Ü`[ØÂÁZ9v€`Øüá²ì`g]v‚œ€Àö°'¾Ä—øÂ npCAxÃÞÖ’%P% ”DI”„J(IIR’”„+\áŠ`#ØúÕ«<Ê£¼%b¢RTŠJüŒŸñó¿òq©GªGkƒÖÍ|ï:Úu´[ÈêÍ«7¯jû¸ùãæqsÓ•éJñ3]MWÓf˜‹¹È`—#Ãj–Ê&¸d®"i*zˆéÅ_N8ÝðÈ +;–7t4-¼³úý—“ÝÜñv,ù•TÁ:ˆ>@+Bk ÷“º¸DCé 4 Øêåeíµvç«>3ùQ*QæyûãƒÌ?×þ4*âð"âJîb<=BôÅDlÄm½RÁ/vƒçud>ñ t"}kY-SóE¹Ín•°÷<:úfµ´àþõw—ºÏàÉ:I7äOו6“ÜæÌd®ô†|°l¦¾£Amt½äs8)ã§·ðB{7úcû”ÕäÂ*‘@xÙ?Wì]þíb~|ð€Wq•sg‰³D§b‘Å"kt.þ¹øçñ÷± ñ$ªsTç…Ux.ð¬QÓf´ÍèàˆÜ„Ü„´éù½ó{ë í í í´´´ô·õ·õ·u)º]Šn½n½n½î˜î˜î˜~Š~Š~о‚¾‚¾‚!ÓiÈÌ7å›òMú™ú™ú™ú^ú^ú^ú}€>ÀpÅpÅpECCC¯Ñkô]¼.^Ÿ?"Dþa´0Zm™êùÀ>÷{÷ø‡#ÖýÑŸÜ$7É|Áì¤*ª¢€³<¡š´Ð\BúÑ,š…º´?íO;á.àvc7vÿ+åQ‘øµkÊ?ðW–/'–¯4GpG –$)$…¤Øl¶Ùl³YÒKÒKÒKþFþFþF.—Ëår›6lÈ—É—É—Ùt³éfÓëÃõáú(‡*‡*nÉKÉKÙM êÔ5æ²Ø[ìýdeº:]íu¼Ä7ÄÙ®S\§HïIß“n¨Àõàz ßa˜BÇRew +ðYl!n¤å=BˆÊ£QÉJg½÷¡”x†.Ï·×Ý7MÚrvÅË©X‡q8B)$à`‚¹ðe’ùg8KL²šæ‡’¦×ÉÛìU‡ Ž6¶ƒ—+ömœR§g­Ë÷'çHkÜ  @]¼’å©…¥æ¬ƒÔRe'æc7T'©Æ_„FâÖS¢“p ÑHXÑ.,Hô®1¸LHbàÚæ/?x¾H™a´Ñ F Cº¡QÏR5}Þ·XÄsÔÉ+Qâ¾ymï¨pi¾&sc -´áGâI§Ð)€‘ y#Ý$ݤ¤ß¥ßeØÓ1§£á£C3‡fü[ÕÕõ!Í8Í8YI$Hê!™.™.™.Y'Y'YÇ—àKð%¤·¥·¥·¥nR7©›d¶d¶d¶¤„¤„¤„±˜±˜±˜I0 &ÁxÄxÄxÄXÆXÆXÆXÞXÞXÞXÉXÉXÉTÝTÝTÝ8Ó8Ó8ÓÔÐÔÐÔÐ0Í0Í0Íàdp28™“ÌIæ$ÃcÃcÃcí í í } } }¼éyÓó¦777äÏž;\ÛCÛCÛC_F_F_F[R[R[2·En‹Ü†–†–†–ÚCÚCÚCyùyùyù:ª£:*žOŠ'Eƒh âqƒ¸Að<Oñ®xW¼+¬ÖkÄÑâhq4¶a¶Y«¿*¨ÐDz@zàðDë„uØ'™*™ ššâvq;fö ù:ÒßÚj>‘L$ùëüuþ:™L&“Éü~¿ƒ„‘0ÆÏåçòsÉX2–Œå³ùl>[=N=N=NrLrLrLù\ù\ù\~U~U~UqLqLqL‘¦HS¤ÉÉÉ©ÒTiª4É]É]É]uWuWuWþ%ÿ’©ž¡ž¡ž!   .¡.¡.ÁãñÇ4n7×’kɵ”?—?—?çs‹¹Å²j²j²j–nNRµT-UKR…T![#[#[#›$›$›$k'k'kG6 dƒtœtg²o;Þ‹<yfZŽÃ;‡w†û^õ½Ú4së°­Ã^„¨Ô È8œÃ9ªg"Ã0p…lÈDŽ`8¡ŸÛŒ¯ÙÜw¶OÇbsý0ƒ;DΟö¾íüNö®KÒ•ìUpÆPІX3n±*ûoŽÓ[ˆ… Õ êîëk›F~l•º8o›¼Ï9¦9¬T+Q/Ubê‚,y¾„äÓdeýeþu–ÈOEÌÄVa•R f¢Ê“fØéxT˜N Šæ:yñvrbRƒÅçxܘT«öä2­ëÍóiåÞ÷” ’¶1\Ö'¥àb‡Æåt~‡¾©¸Û­W“¹¡3‹}¡QE A2IJѲÑä…>Bõ!Î.ÎnÇð¸½q{?¤YõeÕ­u»³vgEvÏðÏð·yo»Ãv‡ÍA› 6”ͯ¯¯T5T5T5ä ¹B®Py«¼UÞêÇêÇêÇ6{möÚ쵉³‰³‰““““––V”W”W”WœTœTœ”—‘—‘—Q¼S¼S¼“½–½–½V$+’Éš»š»š»®+\W¸®°1ÚmŒ‰ƒÄA¹T¹T¹Tô=EO±ØFl#îw‰»èsúœ>¨@*‡ŠCé\:—ΈĂ`'ØYnLb±‡ØC˜.L¦S_êK}óä/È_ ÷Ñûè}t¥t¥t¥òüóüóüóóóuº]„V¦•iey¯ò^å½ÒnÐnÈÝ£ýEû MñJóJ»=Ûw¢ïD"^/j¦b¥º¾¾ñúFšGJ—”.Õf©Õbº2^¯é/Ý'Ý'ݧT‚JN‘N‘NQßQßQß‘ý,ûYö³*R©Š”í—í—íW6T6T6”š¥f©Y3D3D3„Sp NAê’º¤.I%©$•ÛÍíæv““ä$9ÉMã¦qÓˆ±#v\9®WŽ|&ŸÉgKurŠœ"§¸.‚‹ [Ȳ…ïÄwâ;aV`˜?̦ãè8:.~þüüùBM¡¦PSŸ¥ÏÒg™ÏšÏšÏ———¶¶¶Zb’Y&³Lf™ümùÛò·QUQ•>Tª}c°1ؼpÍóÈóxï¡x®x®›hšašaøì¶Öm­K;ãuãu¾"ôÐ ðR‰Lv12L¡e=è+”ûÒ©R“ägnG÷mfV'v`¶ÉÏ 17Ùßýj7aâXjCGJd¼ Ùn6 ù´ aAôWœÃ ,Cq¸æ•È2Ýx_ê“WÖºê1!‚7ò4ä=4N骕/òßÒ>á‚zÄêîÿ¾¡À²&˜±·ð‚·:£ ‚P”MòÈ$sIQM‹^»Ÿ>áÞáÚ*ã%›QyDÐäf fz&ÜY.Rß'Œáå·-îum|eEX´ ‘.è‚Ï$‡ä`SÞÖ¼­èsyûåí™Bu¡:s¦rªrª$)B!5,xÚôiÓŒTGuÖ¿*e݃¥uA‘ˆD¤u¹j Æ_–xOâ)k/k/k/SÈ2…<\.—•••­”­”­”ieZ™V>M>M>M1C1C1Câ+ñ•øÊÏËÏËϫʩʩÊ)æ+æ+æ«*ª*ª*ZÚ€5•5•5•UíUíUí±ŠXE¬r‰r‰r‰ººº"\®Wª”*¥J=I=I=IYZYZYÚæµÍk›×ª+ª+ª+.¶.¶.¶üD~"?‘ûÈ}ä>rœçÀ ç†sÃ-#c¹õÜz\Vx)¼nÜXvcÙÈs>|. +o×Í®[‰—9a9aË©sÕ¹g×Ôˆ¬¹8 ouÞêO#q¸ ´-AKˆÅ‹âEZŒ£Å„•ÂJa%¦Ñ4ZÌsÄñ²xY¼,&ˆ b‚e(°¸CÜ!îÈnœÝ8»±y‚y‚y‚.M—¦K3º]Œ.z½¿ÞßÒUɸӸӸS7P7P7ÐÜÉÜÉÜ)/>/>/^Ø l6äÅåÅåÅwwwçÍÍ››7W(æ†æ†æ†ŠËÅåâr}{}{}{ËCgCgCgá´pZ8mL6&“Má¦pS¸q€q€q€å)ŠÁh0Œ´íA{éBº1+ß=ßÝX¥Y£f¤·CCÄiÓ:^.àà½ç½ë{Wy$défÃ>¨‡hD³‹‘a 1 wd/úÑ¥t8âªÏ(õÌC^;¬üP¯–¨˜øêBLÝ”¢—×=äâë“îD!BxB/"Ák,þÆ>\Æn!÷…ËŠ]éá„~_ÆänÃ>•EkæË—ë²YU-ÑH3b$«AÁ‚øŸe€Áº|oðI8EÕt)ò1 ½¹¢d†S{º‡Ou‹‘ÈBôÔD4ë^¢HÑãæW¿Sªl“ýþ}Št$ÆJ³7ö>%}(›+q]Ò3<ïiÈÔ½—óKÈ|À>ÚŒ Nýññ2^Æ; FÁ(¤— +V­ÖöÛwî¸E¢Hé]ºwé^1\ ÏÛÂuçºsQÔ‡úP5ú Ú“f¤ifÉ$c©¦“ž¤'é‰>–íhÿµŒ¸@\ . —éez™^¥WéÕÿôû² Ää&s“¹É|ŸÄ'q7¸Ü ®;×ëÎky-¯åªsÕ¹ê6Î6Î6Î6^6^6^ʪʪʪêjêjêj6ƒlÙ RµQµQµQ Q Q Ѩ5jZSESE=V1B1®¢rˆrÈ…ÀúêOXš$+%+婺|=ø×(}}}ý;!DiñK^l^ì—™ÚòÚòùûŒ&£ÉhҞממ7O5O5OÍy—ó.çÉÁä`rÐúh}´>†††ÚUÚUÚU¦¦¦¹ rä.Û‹íÅöôýD? …‹ÂE:…N¡SÄzb=±ž¥«½F¯ÑkÂa°ÑÿûgçÉy’’’88¸üàò¡¡’PIèÜCÕU?ä±¹óæÎ{jéSõ©4çqËqGñ–]‰ SèX†ô‰  dqº–¦£ïQçy›Z©;¤6,ð»YK7Ë?yWÅûŸx;® ²Åt? áï €ä=Œ 0—BÅ÷>·ÜP*u‹fap{/@ž#óS©å7®þ:åõ–E7ßð~\o2X(*>¢q¯ÏBøßÿ¼Àƒ€ƒ"DîéMdânú€ºá8¢‘È¿#ùdq7ß  X*î”.tïo£Wë²Õ¿Îu°Åó'„ëÇõãú¡=ÚCUúHé#%]yvåÙ¥¤Ñ¢÷¥¹¹¹X¶’d™aù«øXÐ0 ³0 áG8áG8Ò˜4&ÉR²”,%—Éer™PB åêqõ¸zÜRn)·”‹â¢¸(Žr”£|[¾-ß–;ÂáŽpÕ¸j\5²’¬$+IRTÀLÁ”ÿfû7êßHse_‰}%zÎÞÜms·¾CôÐÓaYs±¹ÈWøS|Ê0,YbH#Òˆ4"»È.²‹ëÌuæ:sÓ¹éÜt¾_‡¯Ã·æ[ó­9gà \"—È%r[¹­ÜVK'®×€kÀ©8§"È#òˆ¬"«È*Ò”4%MIR…TA"‘MÒHçe9xè­Ð[½ƒ^¸¾pZ>õÀÔ³¾ÆÄî(‚â(Ž2ìBd˜ÂŒÈ Ä¡ÊÂ#¨®wC‡;™sÎôzW̺}/¬{j‡“ý†Ø{ùº©Ó°³Ðy¸ˆA6ûòïDâÇ'Ïa[HCw4x4ýŽvÛ‰6mu[|¹êš)Ÿ†– \%¿/A†¢7°¥YðþÇÎê8„¡3ß—\ - ù¶{´ÂWæ žã‹^¡`†ÔRFâ Õ_Ð_0ö1565+++KËJËÊËâ8Žã-fb&:``Á?|¬+~æaæY‡Â\.ðS€u«åµMÂ$Lúfo7p7 ‚ *k–wPàá‘õ €e«%©¢#áhI‰h]cI¼h [Ø¢8Š£¸%" $ePeà?øY“0Z’*–Gy”'±$–ŒÇxŒGþ¹Mç6™¶5}ßô}é4ÏPÏPõÚ¯w¾¾è÷ÚëµWN1¾ߣMhºƒv¤é3KÚJ¼Æk¼¶&–|ЧxjM@ù/ñÉHF2}KßÒ·HE*RñÏñÜš˜Ò ÖT•ùÈG>´ÐBkMg©‡zkÞL0á#>â#>à>ÐLšI3±‹±Øº|×qÝztKÊKÂÊÿ[%TB¥ßYïØ¡ZѶh†fHÏišÓ4m”©¨©¨.Èa¶ÃlU^ã5^ $Jb j ¼‡8v12L¡biü±R¾Ð£©Íu%hU1‹êXÍäõCs”ÂÅçâìÂm8÷*Öı²¹¿¸ë˦ÑÙϳÖÞӊ ¹.ÜO¨/NhØA…v,xž«ÃÊR•Ã< À<(8%µ;¦(&sCuxÃÕÚ\Ï.ŒÂàü‚_,ÕDÝ$Ý$ݤüÏùŸó?+)))w*w*wZKŽÃ8Œcƒ¼¾¦“ÚKíIe³Ú¬Î½d 4æÔµYn³œvÂu\G¤#éC^¨fF(0kÖ”¬)YS¨šª©Ú.Ö.Ö.ÖÒµÉú É2ýÃ0…+ $3чTÇ\ôGµFB%w¯.Á¶%nºÔB7Ik’~Ý#r\ÂÒ'bž¥Ì"M‰+E{ñ'L¬­ýwIÁƒ#9ä<†‹qtœÞØ•Um׬¶­ï£Æ•KM-ƒÏ»3ósçmÖÈ~7‰ÜRœ¬&åp °_Xÿü¸ßªæÞc}‹©Ozå>ðL“÷ÜnÚCó©„ÖÇeÜÇ}Vëû>. 8 c±Vîλpí$k¸Áä½…>X‚1¨Ž’,L?6zžž§çÑMÑÔ` 06þlüYž(O”'Ê×Ë×Ë×[J’¶¤-iË"Æü Qˆ‚¥kL}L}L}²Ó²Ó²Ó¤õ¥õ¥õF9Œre-9#0‚Œa K™yÄ8T.µÆ£o½>Fzv§!⯴XB¥äg9Ž%Ý*[{1 ­‰xƒž áï°Ìo8"€öÀN®9E<Üiá_ê:Æ¢+™, ÉÙ­Ý· Ç¾ºw{¡!6Q'’D2!bVáxð…êÉðwK‚ ¸À”Ö¦ %—ù&Ü.õYyéö¬;ú‡Æ·HÇ4ôÀjÜÅk¬Ö%\Â%r‰\"—,VVVÊ·É·É·)î+î+¾Î÷ÙmÐñYؘ?Bch ± 652525ÊqÉqÉqñ°ó°ó°³mdÛȶ‘¥$éFº‘nlÆ>†) $äî’nä®°ö£ovmåZÚƒÿY±FzÀ8ï~pI%͹¤M5Î#kÈ)œ¢Aô)Ú°þ!ÌùÚÜ82ZøU¬Dç4]]9±JÉ}E§¨94æõõ¯3î_®Y3Á ù ©(£åàìFü}\FÁp†ú`‰¬6·‰Ë±í-÷‘vµö”š‹º(ÏÂôƒ;„C8DâH‰³dP1Î2Î2Î’{˽åÞòòò¯m¢–ìì ó³äÉáÁƒ7ž1ž1žÉ(—Q.£œlllã-Ç[Ž·¬%Gc4F³€1L¡`©²ï$f,¼·Ñíþ+Šn·lÞ»òŠbPVäi\Ÿ}!¿ÝÎöZ¿n‰ý˜àA@­-ÊÌ…(O7à^‘k¤;b»l¨Q¢—ÜE3Q^1œ;7bç… u_Ë„Òâ{M“¸Šh$ DVeÿ~p‚ ìO{ÓÅ¿–Ëд“'KKZ{JÍD}Vqÿá%  dY@à-Þâm~Éü’ù%-=Ú™ŠLÅ×Që±ë­)æXºÊ 777åÔÉ©“SG2F2F2Æ6ß6ß6ßZ²+º¢+ à P®d<é†ò8Ûˆí8¾Ž“¿Îã‹g’½žKûó;Ž>ºù%vZœ!Ù'ç*¹O6£5ÐX3Ì_S0ß À•"{ˆVt#é齊.°×·~^£‘¯?šš«ˆO¿8|ŽÍ~âÉ­ªïîáR‘Nîbé‚8$#‡…ðûÂ!ΰƒúc±”ã–r¶såQ²ëù0ƒ°÷ÂpÙìÄNX³Çhƒ´AÚ s+s+s+å$å$¥5‡:UR%U ^ðbacþ%K}0‚,”Ê å³FeÊ%ÍfH3f9Ìr˜e=õ“Ád0 Ãüà8p $‡Ð_ð_ÓëÊ,EˆäV—1õU%®£·8Œ.3¦h{n¨uµÍ›QâXêJc¸vä:!ÃzÜd-ÂÈ ®ÐТèDE&ò o7¡öd¿4ç3îå4Ýq‘Oå._Ô> ñßÕþô,ûg$s'JélêÃú´— ".ÄNÖ÷Ú{a\ÔôÄb\'r‰ŒÂ,lÇ=öuè{Ä!ΰ¥ioºRÖ˜_Kk&Ès¤±–Ídê³ É Ë\¤ÝEÝEÝEá“ðIø¤ŒWÆ+ã-Ých ¢A¬âÎü шF4é@:–žî9¥rJå”’Ö”Ö”Ö´]b»Äv‰e~V²,$ ­3¶2 óã± |TBæÒ¸…ËØ‚>ãÛe”3a,¹LDl7—“w»x,êƒñ±¹–è…ÍdiŒÖ˜‚ã`£×ÿˆF˜¹@²‹ä /‘ÔœTmàãÜ¿ø,Ç·ô(F£ÊcúvcjåŽÏ–}ìJ*!sAÏAÂòó|¯,w;úý°˜ßÊ-åÒ5eo¥Ö®2˜Æ§×p ×,‹ÚPm¨6Tx!¼^(¥J©Rj£´.ê¢.Š а€1(±ˆ%Ä8Xzºgzfzfz’&¤ iâÐÜ¡¹Cs˼ô0=L³ÎW óà ‚r§8)M³P ?WR2ƽ{õ¡%·yôÁ#šA‰ó“sfê^úmš¡*Š‹ÛÅJTgmQfþš%?ÏHt@”#~p–ôç‡pö—¶z_:$Cøî„'ËÈì_Ÿyúb¨OÐ=ØB&¡Þ"0C`Í%ßë‡ ØÓ«´]Lüøµ\†mªî"DмŽyóªhõáZ_ÍvÍv;_Í#Í#ÍEë$Û˰ ëXÀæGBÚ~² £¬áYvŠû£K5cÞ˜._^=uâ²½·Oˆ—nDnŸLœÅp!ZÜJa3¤þ!Kßô2(gô¢ qŸÈ-'G5ìШÜuôBCø¢µ¹±¼;çR™¨b_4o/8Œëˆµ&åd¾s\–«ÞÑhÇ}$Ùä,@/Sµ:LvFÒ)ÈC¾H)¥uÑ,çÃŽFÓh4†š†šÆ™ÒÕÒÕ*££££Ç\ÆaÉ@KIHI‹ó7Ψ0FÃà/”ÎÙ™³37('7'7û¡$[’-ü…Fb+ZçòýGg?˜Ä4“‹id‹ØÚ¯e‘Uv*¨`iN´d%›%õwxÁ:‹é|Fò;ܨóÀÇÊ¢Oì¶áޤ?üb¯{渾±=?vÎJâ–s™ÄW|FC©šÍ;ûã‘d¹ë‰1”ä“aøU<¤]‹rë.ÿ™ßKäd-é¾ýÃù³¯ŒÂkq]€¹èêx8¤±I¬~ØS#ë¥^g4$œBÅCêkÒM’ 6-%Å$®ÖRíLXÅýGW°\:Ò!P5Uc#Æ`­Oëíð3ÌìvÀüDˆ€5w»À„3ÌRZ«a„ Br»´£Ú›ïë|^žý ‹~狱{éqÝi§ê. œ¨È}2‘ÅÍòµ‡âH=ñ­Có+ø—¨ãz°Ú¦’[Ý«£Ønê&h3&V‡Ÿ}ûQÅ0ˆ.ÃÈ aý\\öL}š1 9Ä‘<ºÒm4_’';)m¤p•Tå+Y ‘Öd-î Ã0 Ãü#¨Ú`³„ã%ä¾I+”_DŽÌ\oPUl·» èçµÑÁÁ¼ÁØBY¡\Ô†?­@a7>"¹'Ö[PÂß>Üõˆf?Â%÷8ÿ#n7"cÃÒ2²“ôU¹2 O©+Úâaf #?..k´>ÈX ¶Xˆâú„A¸´9o’ûð«¸ÖRmŒb,X Ãü°8pàà8€ÏÚ«æßâ bŠ@xC‰¨ÿgëcÓSU´§n¸©;Ž£1*WQâ¦Kd z±„¸‘–ƒÜa[H#&Ždã<†‹¯iOjï|ÑnMp—"õN”˜‹ò¦qB›\!㤶ÿÑ:7~ÙxŽ/¤I#˱—ÅNº§e¾/DуÆÚæcüm2†8¡}oûû6A2ëd(t(N┲ÿ̆ùaÈ!ÿmy1Ö\%W‘ÉphKª’ª¨fݪ†šÍ;È0ÿD¬*BuÃMľ–ÆïÏHʬ[hLAk‡ö•:ôqGbÈTz¸Ñu±Ý*UªÌÆ2ÿÚ£ŠºXYòÀ„ îhM§à(ïÁ'ÓFضO/w~¤¿Ðb8*ĉÎ;«^¨öº¯y°0^L†3lÁa>vâ%Úì¤û±qù]Í'…»y.ÆÁ¦Çü®@ýigT6Iêh)DÒ[x H a!cæŽpt¶Ù¶Ùüʱ•c%{*-½‡x‘9YºÐ@ˆÊ,` óOš€ ¸IF'ìÐß4>¾ïþicÖç­,*Ÿ')ܧX/'˰TJ²ÉyŒ,t­ÇDPî gOBh°¨öŒ²Šz•æ/sñ"=QÅ£<ß¿M«}òÄíRï¼ÑÕP\üLGPÈXŸˆÂ‚ÓŸ66_Ñu2 2‡óI¤Q4Vt8esH>ÕZjŽãT±Š;Ã0? r„ pGd>2¡ÛØbc‹Mœ¹òÂÊ GRÝž»=7 °L#E\‰+*±ˆ1Ì?É2‘P4ƨ"“?àh_HÛÊ ™_ãQé•#QåàIz9Ùdm}/ ,ï² ÇÁòû2 ¿LôÓóÈÅEŒ(‘ñ€Txˆ(šl iž[µšÜ3ÏÓè à„$Ž«{eè#1!ó­<±a¦+W‡œ&¼h¦Ó¨'›h©°áòç›Ï áÚãPóup¤;á!¡¶´³mmE©#Œ!"˜XV™<ºòP!rlÁxb¶Á ÑvÖ­Í' HRaÃ*ZŒ££ÑíèS4DC4¦ù4wp $ ßåÀMKdDˆe¾2_™¯ãÇ!ŽC,_Z’C’C’C~»G²ûÃü{¤" zZ•ÄV,@?$½þ~^z@žSº§v˜z€Ë~õ½ óÞmpåÉa‚Y«Jƒ$ =Ì{ >ŠÃëpÑ,p—0„á:£³èì´Ói§ýÉäâÉÅŸ”y{äí‘[{µµ´µäöè†n†f4„† ðà{{‹$‚D -MKÃů—_/©¡“¡“!äcjÔ:©u‚ÁÆf—+Ö®X;´´.^Ÿ±›KàøÞßûK¦? RéAéAÛïû½ï· MÑcEuì®Ø¤Øä=˺ÓÇÄ áv‹ñIã“FÜÕwÖwNqÈ={ZדºPêBŠ’¢¤(b!ê3ôú ÎGçCJ‘R¤”¥5Ý,7ËÍò\>—ÏåqçqÞRé'uHRGwNwNwÎò·ä9FޡРu¥®Ô5×3×3×ÓÜÄÜÄÜ„Ü 7È ´Fk´_Š/Å—¹ƒr嫉ÕÄj8ŒÃ8Œ8€ĸ÷üëù×u­¹Æ\¡BV³¬f‰M¿„| ù 2µQ–pîïAŠ‘b¥ 3]ʺ” (ÛcA[—Ý]rwID×¥O–>é’Eª“êÄ‘N èïòMºÁ ™@è«é«™J4ŽmÖ4mjÚÔ4¤Ú¤Ú¼Øà–ç–çq.oTÞ(®1çÉyJö8H$’‘±ë““*[/O”'z+55ýhk~©Ø«Øk<7xnÉÝúúNs¹4.Mšfm „Gx„ld#›\"—È%’NÒI:áa7vc7:¢#:{bOì!ƒ 2K =®á®‘äù@’ƒä Í¡94Ä™8gbKl‰­õåf! YØ€ Ø€²(‹²d-YKÖb=Öc=b‹XÔDMÔÄ|Áqµ¸Z(kûØö±Û§SEN™¢ä†sÃéEz1»Ì¼UóV HuJuÂM¢"*:‹‚â»Ël°k±§q§ÝmÝmÝmåwäwäwÒíÒíÒí ­OEâ!²»ÃüÛÌÄVDp£‰ž$ #¨‚^{õ%î^ú¼ªª‘>¯Tõ5ƒÓ+Û5qð!ÿ³!ÇŒ`xÃÏ€ï` *Äš>›Ê™¹9äw€ÔÇU±:݇êb=ñ=,‚ޱ¾™–ÍhåÐâC‚—ô(š€ûBGF$<¬œ¸çVÿç’úq#È ²GˆwÑÖ/â>d—ù?X+î¹å ¦÷„Ù¢¹Mú“朑„!ZsOÖQ à€V€V± ýÝâ‡;"L&›×åWͯšÙÁ\Ò\R[iHCz£7>À6àüßòÐüùYòrœÅYx½ï2Ée’Ë£òòu³g/ΚrS~Sžôdé…¥Ζ ›è&á1M§éö½°ÜRn)ÞÓpÎÝióS›Ÿô+… ²Eç¡óì/þ øYžíÛ=ZùO׺Þn‰&B6ªª¶;­ôOø„O´-mKÛ***ªF¨F¨FÐxOãéz€È$2‰L¤ Ò‘æ¤9iné™M¯Ñkôšr„r„r„âââ•S9•[öIî“û侯Vc«±•DH"$´6­Mkã$Nâ$Â…p!šÛšÛšÛü6~¿v¤iGÒž´'íÅâGñ£ÜQî(Ûá|ÝùºçÙ÷ô=-Y©Q¥F‚ÌÌ’ö „GâPd#›ûHè÷6Ô˜€€åd9Ynùå¶Òm¥ÛJÙ Ù Ù‹´i/Ò^>>>Y{ÿG"‘ìfÆ0ÿ6ðàè|šˆî°ƒ ò§Ûc¦hGc¨°¼ð®åÇúp©p8:\ã5l ùUTU°¾ð€ŠÂj´Du#jò“Iu’B–q­‰ «ÌׄGt˜8YL¦D`4X ’üÎÅ×Ü•7r}h_Gi {Ø}JY¿˜ûñ×m5‡äF¹Ïþ:W—Gï1^5yîW™4 ü:¶ŠaÐûFùþ~çÄ£óôýÅÜyÎÑ>óÅg/ï}ª^Ÿ÷–2äâñ}¶ ÿpǹãÜqËr¥•Tjð:åuÊë”]®»\w¹Z£ÚŽ´#í¾Ë·W¥Qš[Æ-ã6YVôÜwp¿¾oï½½ã51kbÖ¤F…áS®üKå_¤“Úä´É‘6i2¯É<.¥}íöµeaÁ݃»ó¿÷w×ar‡ÉÕ&¯ª°ªBØ^q½âJu²Ûe·‹3‘ed„;¸ÿïòÚLâ’¸$8Á NcÆŒ xõáÕ‡WÆ6Û`lk¡hD#½Ð ½ Ñm‹aþ+ˆ0ÉR‰÷»U´‚Ý!ý¨Ë3FfSzê^Õ®¬Ü±•µäTâ…#Aò_ÈHVð*( ÅlBwr´ÂM\#Òž{Î'uðûÐÿïÙeù6þa.6=¼] ü°°úÀ5úŸ¨·°të‰ÖœÒ߇Ò[Ã:O/?&Ï×qÓ£ǪìV²¿Á]oS]>Œï =fàê¢:ì¡€ŒÍ¥Ãü¥Å=ÜhJ4Û ]DOn6©FŠpR"!jçáJ£b¯õ|žLj¡ {:ÃXY’:ÀÁ:d™7Ï1Ï1…bfP#¿ßÀ­‡F<–¬”¬”Ä1BŒðH ûîßû-ÜB.£1ü"G6ÍÃ` ¶ns£õd Cæ`vá!£1”É?JiI¬YÐߟR€áÓALiYß=Ñ“Kâ’8‰xG¼#.*³¯Ì¾–‘[un5Üù¡ô¡tò´ìÞÙ½_I%®WIsŠ9Åüé;ûìÜà7Kˬ¨nÜ*¸UPø)ü~É1É1É1–E|K¾%ßRÐ :AÇ.w†ù÷¢í1 §° Ä„Ý_Þæ.O Ê:ïë MÅ$ÿ„¢Ïì'){ÈWIzèÎú˜Gãf£:`&ÎÿÛ^„eò#ËÌ£5Qîd3©‚sÜ)Ò˜\%5I6Yb6 ŢÍèÔ,Íþe­Ý7I%|Ä[¥j•,½tjñQN³BJ:»»WÚȹöòûX4Ìnߊ"&;µÛI·U¶]é'þ3 ô‡¸…P€ &—]æØWT®R±}Ûf WÕ:0íxýü_ ÑŸï’hF^P-2©zÙ€Tæ/÷{óHS5q5)îIÊ“|Âa$é«.%o/„«¡9J (ž± X‡ëíÂ.ìÒ­Ò­Ò4œ†Ó{æ†æ†æV¸ƒ;¸#æ‹ùb>µ¡6tèòÞ5ЀÃ*¬‚ȹqnhAôD_z^€Žt#Ý —ŠKñv¥]éØÃáП¼+Ôs<Çsú޾£¯é ú‚ ú¹ú¹¹ sÞç¼ÿÌ‘™dfþ¬Æj¡nÔ®@ôA¨5'ü÷" a_‹¯Åׂ!¢¹¡¹¡¹aîdîdî”s"çDÎ ä!y–ð¨ú¨Ï.w†ù7KBt¨Œ@¸š|ÌõEÍ—ã>•îúÙ»‹c?»…ª3²Àråü?ºÄßÝû*6ùwŠ4#Ù"¡³(ù[i³|;ÇH/4Aæ¢?ª“¤ª /𣔵*ìG(©‘ÖÆzZšCEt›e÷Öƒw}áPWé[ü½ÇcÛö>F÷±¶6•ÇŽwûTqtÀW¿²>~Ýœ;Ø*USåÎÒéî ë-ÙüI®6 Ľ)AÜú‘n7ŸÖ–4þ’0 e|Nû¤©éñù7ï yZ5%öl…ˆÊ+Pw± yÂ¥qe±[,"V ýQ>,§óÕ×Á©] ÁÆdÓKa‚XÆæÄoIºŽÜ´m*.­‡5˜ 3J/,Á5ÖæÎð…/|éSú”>µ¬P‡©ÃÔaæsæsæs¹$—ä~må=8ñC½÷\ä~­‚‹_Ä/8g]_Õ+Ó][ÎBÖw1z¡6j£¶8Z-ŽF]ÔE]ÕKÕKõSA"H¨D©‹ÔGb;¶ãz£7Î}gUvÙMv“Ýt2L'«_«_«_k¦i¦i¦eÚeÚeÚeöÌì™ÙÓR’V¢•h%v¡ÿéX¦ÎÒAñ%¸Z\­¯Wžx[¼»¨ˆŠˆù¦$óg‹$d‘_Heœ¡éN4xÔôÍ¢”~];´,Š]¶ëÔíåWËžö;䬹;íUÏd#w‹Š}"èÿ×=¯`«yÁ•L"žØÏÍ%>d?DìÈ6q…,Fо´4ØŽ}8õW¯hX¬’c…²å}—:;—úT|®“¤ŒŸoó}Ÿ îemi™¾?;…ñÔeåöè$Ö££<Æ€jA£É½„R€¹ºØ8#7Õ=/$®srÃìôG%Þä¥x<«ÿî@jN‚/{rÅ—Í↥·þöyCNÂðwìþíÕ8¿uÒûSE3ÿ1_[ÜóÕLɦ¢\,B¶‚&ØK~ÅLÍMù#™µÇ'iƒ “}&û²ngÝκ}0û`öAtAta}Y_ÖÛ° ÛÄ¡ññ Ïàš¨‰·[,¶p,ÏZžÕÙ õ‰³’³’%c2§fNÕ&¡-Ú"UPoEµç§C -x6„-Çe,ÀQðïç$?ÎÙ˜bûõb޵Ý~—敊Ür¬|ºÉ_I¶)·h†éú?œÅ@{ÌÄ\E ľ¿ý¼6~æ• §”«ï¼ÝbŸÛTÇ!¦ª©ÊúÚ<­ôÜm‰U¿J+Ý­¾:eØw4k{Xõ4”¬H?r[ЮxØô:‘boa¶¦ï»Í_ç<‰Yó17#ë}­ä5¹KcvˆÉèíñú4’€IDATN‘ñâùã7SÒ‹lÔRà `÷ï#ö*΢W0JÄ…Òý¬1Ç‚X v˜ÕâsØæ‡4cê‚…ºßì‰cWä;¨¡ŸsR­Ù§Y¯;Í+ˆ¤9$DAúšm”?‘½†7Jè‰ÊpÃq‰\àÔG}ÔN¥¥¥ë6è6è6XXXê[^Ã5\Vh„Fh$¨ìÒ Ò Ò †Ã ‡Wg«³ÕÙ… 7n²}lÛOx³du‘œ%g‰>דÙ³+fWÌ^˜½0{ñ!èCЇ ,Ï,Ï,Oý¦ º ‹8(~6hcÚÞ<Çs¤Še’eë¾tïÒ½ &HçHçHfNñšâ5«yæÔÌ©$†ž 'Øžñ ÓÀ§×ùi`Iðb‹Ã’ž¤MÍO‹¯úùYNg›EŽgÍ*xî*uËâŠÙ"E°ìc¡UFHáYLÃx¤HkIlé(›5æå Ë×[Z‘Ú·©X~¹}׊šÒq–“Ê™»Ü²v¸ciolgn`YÃh& ¤ÇèYø25Æ"&°ø‹ì8 â;é6i‚”{ÔtÒX“w2÷D?~W*}ô£Å/­¾4}½ðã®Ì_d,+Ø÷¾irnnñä Aŧr–´À-d#J¸Áæx„—øŒì^²5X›Ú¥ºÃ¼…X€öú”;‹]ã÷Tv‘ÿƒsÐU «GjÓ4+ù|'HÈ"(šG^š”½ÑÊñ¤*‚‰:»H1„Ç¡PÈæ0×g¿ÎB–P˜ m]%âJ\‰+#Œ0ÂÕáêpu¤o¤o¤otµuµuµÕ¯Ô¯Ô¯ô ¶D½%!“Ìr,ÇrøÁ~æÍš?4=czÆôL^ã¼Æy §N+œ&”¬b«Ø*¶J¨n+ŽŸtÈr"Ñ´©ñ~Ìû1jÖj_«}UiªYªÙçùó¦oÇc»¯×Ækãõ-“…°1‘Ÿžª¨Šªx‰—x)9!9!9!“‡ÉôW´W´W”••q‡p¨D*µ Ð Ð=ÑSZFZFZÆö íAÛƒê£ê£ê£©ƒR¥ÒçJš€ ˜ Úe♇"ñxI’†ˆ#¦ÄT7öÜås—1±4±”~?güœñ]†©‡©‡iRÎ¥œK9w¯Ó½N÷:‘£ä(9ʶ²­l«þj¢ÛÌ[˜Ã5fpqh„L.“>!ÊÚh/éj†Êz¼ã¥÷dcPnÙìǧ¾¬’ŸùåÙ¥77SÞÕÿò"§<æã2êßw]±ÆúãÙôµ#u(ÈB’ÈZ±`ÖˆÁž±öüAÞƒ-D(6a;ìÁa'´X-ú—‹”~H韭LVç(gè˜ëjpLò’{oœ$'­€·ÈB!Æ¡NI GùP\¡IB’p'pNp‚“Pƒóû(£bñˆPQU``“1“‘-d ÙBDA¾=‹-ÛJ ð€‡à$•H%R‰É'“O&ŸÔóÕóÕóS¤4Hi Ú3Ø 6CTÙR„t„=d1ŽË…=UPUI8’pdé)÷Sî§`½Ñz£õÆ©§>žú¸Œwï2Þ̃y02ˆ "ƒô*»àõ.òß"‡0P{W÷”wã(OB\–Øí7ñì(­U¡ÖfÅ0y‘túÞwÙç¹ìi¦<Ùùî·–ïv Ï)ÂÄá #½&†’ ¤î¾D†ø‚3Î/áÝXª¶n$Ÿ¬ËçƒY[þ ?NâÞ꿃*R¢ÿ#§·ò£ú%®’Ú¤86€Í5:,;.)eÖÙàtPUõ(²•t€·ø< 0é‡Q;I;I;E)E)E)m%m%m¥’ä#±[°eÃü ó7ÌwØâ°ÅaK“¨&QM¢ægÍÏšŸ5Ùe²Ëd—Ô=©{R÷ Ñ “2)“ê¯#ì·ˆü…Ðjä3–òIl,l2+<ë¸Ö·¨à~Îy»CªÙ(ÞÏØõSÂǤGQ\&Í!ég:„koë"øR,œÙb:«ËŽ¡.$¿I¤xä79¡DÅEäã®)þGv7ågõh•àŽk,“U7,%ÙÀ(¦É|¤Áz_®h‚ê¢àDŠ—U">ćøH–H–H–°Ïì3û¬íªíªíªo™‚¤ˆ+TFeT% % % åZ¹V®ÕÆiã´qªµªµªµú–%1Åg4AáP>W>W>×¾Ÿ}?û~ª‰ª‰ª‰©Ñ©Ñ©Ñ«l*›Ê¦ŠÃ¡ ¨ÚBV«j¨†jô=GÏ)”NJ§¥—>\úðÅØc_Œ­êZÕµªë¤+“®Lº"K‘¥ÈRô{ƒOðOô×ÃèÿJ@ìÈ 2¥aS×8»¦íJ­p™oqœ¹ªÏj†O#}I_Ò7UªNU/Ö,Ö,Ö|êü©ó§Î-ÛâîÄkL¬ÁÖ³õl=)CÊ2úpU!•­8?ü5¸Â¦ü"öžõÀ|En]yÅýö\yY{ÉDò ÎØú’70cŒ&GûŠÙrÞt4‰šŽc¢í\äWæGÅ]¡|¯~  \xOfÀÚè$®œÜ8MzPâ!´!P^¢àDà g8 ‡’ý’ý’ýF­ZµÖ=Ô=Ô=,hZд ©¾åmÜÆíÿÂ7,þø5 (©NªÃ™ô'ýQ…T%UQ÷û} úà@ÔAáP6V6V6ÖÀßÀßÀ_C5TC‹EŠ¢o>î'q'KXïŠ-5Ÿ;?w~N2HÉÈÕåêruÚ«Ú«Ú«ú¥]*R‘*‡†šV9ä‚“^ è…7Kß,}³tEé¥W”Î[Ÿ·>o}—‚.] zŒè1¢ÇfŬ˜•Q•¡ú O±ÙCTßÿ“”‡+,Xv‰9¢1»É¹jjç^¸¥[Æ/ÔœÏÏTÅ>Ÿòv[ê=´C}¸³ÌƒÍE õéED~Q~PWr(Ô©Â Å*1sÖÖ྄ãdFçd3%núFðwBlaU¦•iey%y%y%Þœ7çÍÕëÔëÔßì—qˆCÜá20ý£×yÈÏž±gèβƒ\#Å¢¦ß àÁ‹[ä©H*’ŠÂ±¤·¤·¤·ü¦ü¦ü¦–i™–©^ª^ª^ê›ÞÄMÜ, ],À ¡·ä89ŽæÞæÞ¦«É<2wMm”Ú(y+`ºŠzå!_%Áú®…Z>˜æƒéú~xð àAÀ–s[Îm9Çæó‡Çì³o̾Æ3Ïh<ƒÉäGÒ2´ Õ§¸… ` Šó?H xÀ(¨aiy¬¤b­NÙ¹£\aœÙ Ï^µëɨ˜g_;ážá#ŸÊÆ3Gq9%"òCpjÖ[%§¦ÊÀU÷žÝ`5¤ù²]Ò^&GdC¥–®di‚ªbÉ/ý¶2€ gÃÙpÞ7ä ÉJ²’¬¤ 4&è[Ãø{z®¿#¡EP{bµR)m¡ª¥ª¥«ÌçÎSyªeª%o C" Ÿðé×þIYËa9‚§/ÁF°ºãºãºãÄŠX+®W«§oê8à#>âãŸü%*¢"*¢*¡’>ZÈ#ì¸Â®Ä“xO}ËÒ(Òz×<ä!O¨{ªÿ—|ä³ì>“Ëä2éÏ÷â{±>vcìÆx´2¡&ÔÑ1aFÂŒô=º ]{ŠX€E˜‡yØ'Þâ%sëì;±;ù\>—Ï%;ÉN²ód¥“•NV*õ¦Ô›Roúš÷5ïkÈY KÛž¶=m{ŒŒŒ?9AN¬'ëÉzêw`„åœÈŸ!ä1&2f„AU:•ù`oUÁÄH> ÏÈTh>D}•çžK,J[ŸßŒøsì`YÆ‚‰áÃ"â TŒœÊ$u.‘Êpã§± LgÙ6IuSµ¼Št¨¾Ñ ôDSQp"Ä‘8GáX2B2B2ÂhŸÑ>£}:•N¥Sæææ ¯ ™Ýÿ _±éKD}æÒ¸4L골Ϣêölß³}Ã!¿Õ~«:! iH#„|S!ïŠp,í,í,ílàcàcà£qÔ8j‹êÕ+Ò+îì;ÅNýøæb¶0¡ØÖ@ Ä@ÜÃ=Ü#H#Òˆ<'ÏÉsjKm©-ÝIwÒœ3çÌ9sk¸5Ü.•KåR麅n!„Bð ¯ð C1Cõ³f0ƒû¾°/ì&»Én²Ýl7ÛÍÖ±ulþø;ÅNé_ e¡,¥PŠ%ò£øQ|ŸŠí+¶çž—Xj`¨óÃÃOÍ2cþæzv=M=A3d ïÈ2áwJ­ˆ”ôUÄ …ÇqÇáø'âDœ¶)·)·)ï¸wàÞggg›¹És“ç&Ûï¶ßm¿[PÙ Oxò­2´sFäÏ‚F‘^$ÕQNM‡×˜ì2NÒC¶Sò‹yCöáñµ—Ò/ƒÑ PÐUPÕ7S‘ˆÈ¯Œ¤ø¶SÖ1eúlÑþŒ±18•$_ÁÉŒ%+«°!xKBŽL}Ïú,ò[„I_Ìô‚Ò‰H¬E:ÒÙ)tA´†%,¿/Ÿŧ¤„ÝXÃVHG:Òéz‡.“×’×’yê¶ë¶ëÎ+µJ­2}ÐK…(DéýÈÿJËÕlÌÆl\Ã5Œ²ÚhµÑ<@õQõ‘w‘½“½+µ §qšZü-\•T~á$aìyÀåˆDDËJÉJIÉ}å¾Ò½Ú—Ú—ê$õ1õ1åfÒt Õˆñ##Y&Ëdɤ iBü0 £0 ­Ð ­‹8Ïó<ϳƬ1k¬w/¯¨¡?¡ÿôÉÅþýº’®¤+åÇäÇäǸÜîÌIæ$s’.’.’.’œ‘œ‘œ1ijÒÔ¤©¡³¡³¡³U€U€U€eeeb§b§b§IªIªQ«H«ÈÒ=¥ÎRçó'*´ªÐÊ×^ñUñµJè½÷Z¬íå>É}’nwè¦ÐM¨Aú‘~P‹ño%aW‚‚ i@IwÒt/¨RP¥ Êò·Ëß.këcëcëãÙÖ³­gÛ@Ã@Ã@ÃÙíf·›ÝN9V9V9VŸËv°Ó»Õ‰›þ}I”,,09é9µ±¿ÒOéÇ"€©ØsXÂzE\PÜ‹s‡pˆËä2¹LÅ%Å%Å%Ó{¦÷LïÉOÈOÈO(f+f+f+F)F)Fï2Þe¼Ëð´áiÃÓfkÌÖ˜­1]gºÎt±¥±¥±¥â±â±â±Å,‹Y³Œ^½0zaòÅä‹ÉÓE¦‹LÈëÈëÈë ±ˆ%³È,2‹ô$=IOÚ–¶¥mÙGöQ;è¯Q_ëÇŠÇŠHcrŸÜwí4ÅiJ#×ÏÃ?ßùùMìÁò§qš‰áÊÿ+A}_ÏÖ³õÔŸúSÿ¯_=¾z,+»¬ì²²Ëë/¯¿¼¾¯¹¯¹¯ùØÀ±cWq«¸Uq&ÎÄYï6#˜ëéþ»33Èpb‚ݺIütÖÅr¹I‘¢t7ûS¦†P²wØšÙ%cTáâ—–ï2ÓA…•è[xŽDQâ""¼F²…?4ãù¼wî%ÕÍ<“«òáÒ!;Ë M³äS¤Õa)Îó·Ù ¶³°DÅý¬ì/ñ‡± aÍuä:ª“ 2 2’ª* •†ÉréNéNMM•Ì7JJõnŸ.p ·–[«9Sô¨èQòVŽqŒó4 5 …CfÌàóø<äÁîâÞýÛ Œhˆ†X03fÆ,Êœ,s²l§vÛ=žër²áɆ§ÞGeFe>øæìñŸÑ~YÅÝ ^ñÖ¼5ïÍùsþ˜Ö-5ïéø§ã§~(l^Ø\éë?Ïžbþ맯ŸÚå»ò]ªZZ÷0^m¼ZqÅú¹õsëç&ƒM› 6¹erËä–Q°Q°Q°A€A€A€‘»‘»‘»qeãÊÆú f#fÄŒ˜ÑU£«FWž=7znmmMf“Ùd¶æ¸æ¸æ¸®Š®Š®Š&Q“¨IT«ÕjµZ{\{\{\{J{J{J{W{W{7¿F~ü™Ÿ3?g~Îß–¿-[þÁüƒù3·gnÏÜžÕ3«gVϱ…có÷gìËØ§VÙ¾³}~É;Ê;ªüýôké×^޲Ûi·“¯;¨;(‹Bjû¡#:â‚X6ì AÕRFnç·óÛ©u ÑñÑñÑñkÜ׸¯qŸ7lÞ°yúõëÖ¯[¿ä²Ée“Ëžyxæá™t]F—ñUùª|UÌÃ<Ì+á#ò/þ  HwòXgÁ>2yÅ:¥c-:»Û4R8á I"3Ÿž‹»’Âeì̵UîÆ006Š­Åm,GQ€""€1HGŽð‡æ†n3ÎuPíÑX˜‡ô“ ß‘©L–È?JË£4вgŽ5(k˜ŠâûCê  øÅüb¾ 7“› Ó¶Ú¶Úܰ§ÕžV[S é¤éÄ.¯Øºb«×ÎÍn4Ó}Èœ5ØÊ 31SSƒ1ÆÈÒÐÇ#8‚Ò苾øà»ÌwYrF²c²ãáù‡òiÓ:ÄvˆÕt qq—— íÚ]µ•®£ëГËý jR 6þQ…ᘃ9˜é4ÝiºcE]–.« o‚[‚[´ ©Aj°lA"¨Š?Åïú¥G¬à²5#i{¾ ߆7­Y1²LFy¾<P@7ÓÍ=V8­8fâçîçî²­ÔÑRG»¶× Ñ Éu—””M’ì“ì“ì“ô—ô—ô—¼¼¼`çØ9v®ÐªÐªÐªpuáêÂÕ…× ¯^/p.p.pN M M -r)r)rÉ_”¿(‘ò…ò…òEQFQFQFÞž¼=y{òçæÏÍŸ›_?¿~~ýÌüÌüÌüìñÙã³Ç$$$¸¸¸¦K–>,×*×*׊ËåÇò:^ÇëØ ¶‚­Ð÷næ}ëh25ÊH*8Œrü$3,3,<³TF©Œ”caÑaÑÒ<ŒÅX­;óa>ø"*îÿS°bÿäCÎ7ç›óÍ9 ΂³¸Ýäv“ÛMlfÙ̲™5ùêä«“¯úËýåþò¯V_­¾ZÝœqsÆÍ´­Gëñ^ÃSÙEëû¿Š Rp¤Q’¸ˆBÆ{n-uÜÒØÌ×:C1 N´ iôÌ)îiŠJõE³Yw“ž£Æ¤.ïϯe%!‡•ˆÈ_‚`qÿ¦¸süxÞÈ|¯ùÞ2ªV¨ZaÙDI´$Ú0åÝ›wo¶gN¸0á‚ã3•+ûÌPÕTÕL/Gª*ÜÐÇØ‰d Á4½›z75 UeÓʦ {¤ìIÙ“|xïá½í[˜š²9HC<õ^¢ ó0óøx>žOòŠ8´shçØ qˆ#[¿ò_ùÔ¾ì{[@ÈX,Â",ú¥G¬`?´‚F0oæíê§ê§ò“&ýMú»»¨¨è¶f¼Éx£ë¬½ ½ð9'õrêå§s^ä¼øü8¯e^Ë‚«¹&¹&¹&¹7soæÞÌ©”S)§RaNaNaN¡K¡K¡K¡i¡i¡iQÕ¢ªEUóeù²|™*K•¥ÊR^R^R^Êšÿ4ÿ©6V«ýßÓþðÿáÌ9œÃ¹Î4@4ÐûÀ>°€ZÐÁt0µ~Þéy'í¨¦#›Žl9³cHÇ¡3¾_ø~ñ»Ûnwz]…”'åɶ™mf9â4ö?‹2òán”n”n¹@. ASƒ¦MutwtwtïW¾_ù~å'¦LL™˜’‘‘J»Ð.´ †?Ãÿª»sÿ³Ðutût“øNX-N×lRžØ@ Ù‚þ¬©²¦fVÔÏ´;˜ 4 çHy\ᯠ–¢ðDD$ˆ+fq·ÑMãËæ]Qei4¸LÆñXˆ…Ü ´l„ü$wƒVTIuçù`Tƒƒx#ý Œ Ø!±ʇ’÷²æ²æFV97sn,‹ïßáCÓå¦Ë §$¤$Ü« ñÑøä¶ÆŒ!% ‡4iIZ’žl/ÛË6ää©ì$ ƒ‰4ª‡j™–!ŠßÇïÃS´@ Pd"ó¯ ê")$…¤°z¬«g©´TZ*­ÎX±:“––––––L’I2ÂjYMV“Õ7¾!ƒ @2X @ð€[Æ-˪šÝ"»E(ß?Ü0ÜðTâ›îoºëò"æGÌßû‘McÓ´Ô7Õ7µgP„"ý 4ÿ–Ã8üÇû-Ä›xoú𾦝á ox³ Ä‚ôªù,Á¶mcÛpqÁF0›Íf³Ùú+ç 9úòõ…(D!’„$d »Ùv†5%“È$ÔUöVöÎ(SÔ´¨if-sosoI4yL£K` lVaà^ˆ®€ÿ“s›Á6lÃ6æÏü™?ú¡úm ݺ%Ôþý!ûC­¹Ö\kn27™›ÌM¼?ñþÄûi>i>i>¤)iJš²Ûì6»-­þóSX€¶,6˜ffe¼DÒàn¥sŽwÄSv7y}ÊÒ<ÙËÅï|2^â9,Ê÷â£l æ Ñ#aqHC.<@A5fü¾MÞÕmt¢CÈJñN,ÙÜÁÐHvFvƒ›J›©4:Ï“*°ƒ¹xý!RHA|¶“›ËÍEoÝEÝŤ»o Þl,xßâ}‹Ä¬÷ Þ7¸¸õéS͵×__ݲGqÀDL„¬ÄôTd3n͸å˜p&áÌÖ¸ôméÛ Ãë·ªßJÒ8Ö5ÖUí¬w‡÷ ÿš/E>“Ïä33fÆÌØ.Å.Å.ÅfœÍ8›qéÒ;¤wH}”ú(õ‘àNÃ,™%— @2’A‰LVž|&ŸÑ Z­É-cÓÖ¦ííÖyÑyÑŸœ³i6-Z·/nŸ*HUAU9üp…hD#š#bDëÓú´>¶` ¶`6`Ûζ³í8‚#8²…l!Îã<ÎãŽá›Çæ±yì;Äé>ê>ê>â2.ã²>;{qW„&h‚&?|nôGÿªð@;È",ß'ß§p¡uWd*2ͱú¬>Bá|…r±øÎÿ<¼¾ðšRTEUT 0©Ôj‡5µÖÔZSË®]»U'VXuâü·óßÎ;寔Sní/Ú_´ŸT'ÕIuÁ"X„0êmù"Ä2u1’™@nh9Ñx¿ç•Òƒ¬: Æh–8+mt^…·û>?É~ENKä}ÙYv ÀQQx""Ä"9Ѐ¯¹©ëÏçæVP™¨ïÁˆ "Ñl?”×™$ÈR#É=®MÐ{¶—…Ì) ðˆD$TTJ¥xίæWcôµe×–ñ]¦}˜ö¡ŒÖë¬×d×ã™g|,õ±=J*“Êü2ˆ B2ÛÄ6¡ðçï"©@*/ì5{Í/Ÿ¾|Z[Õ{¹÷r·¶,:ä7 ­ZCÕ4¾(¾Hís8‡&|… Ñws Ä(@Ã<‡yóìÚÚµµkûnû ï6¤nOÝžºžð„'3d†Ìðç–ô_Â'|¥Ýh7:…¿Íßæ¯¾½÷ö^ÙЙa3Ö;e®Ë\w©Ê…ä É·|03È4œÇyÜÁ%\Â3˜Ã©Xˆ…XÈ>±Oì“N«Óê´è†nè¦÷ö‚×÷ŠËK±?FqœÂ)œúoõóÎn’Ý$» †°!ŠcŠcŠch‹¶h‹$ ÕQÕÅAñK ì¶qàÀñ |Ÿ@Æ1dLê¤ÔI©“­^´zÑêÕMW7]Ý´þåú—ë_§§§]ydå‘•GØ3öŒ=C(BŠ1ƒ1¢×û" #È!AE”‚UíNØesŸdO9-À^3·¨— Šô·#í¾ ÷‚&‘óº*Ì™‰*»ˆÈÿ¹™W™Uh‹š,#±,Ï\Å4}2€ÈøYì S™¼“·’zÈÌéú@å` SQqÿCr‘ ±ˆ%ÖÌ“y²ÇiÒ™›¸sÖµeÊÑ”£!=_Í~5{]S ^Àõs}#4*}ìÞÅŽ±cl[²M²ÌÉ¥À¥ ý”ŒnÝ2´‘6‘6Ë€ÝAôAôB/Üý+¡¢ç\ÀØÂ¶666Æ Œ7Hýšú5õ«ÆTcª1åŒ9cÎXç­óÖy‹RHÁ†0<€3œ!‘%Ë’Uæ…|!Ÿ|™oÈ7ÌþÈ=çž#…å°dòùŽð…Œ@PˆÂ¿£¦ü”JLþ˜ü1ùcø[ü-þ–É“&HÒ„4Ê6郛E~GP°Il›Dƒh J¨”P)¡ÒRÏ¥žK=—Ÿ[~nù¹{<ìñ0sLæ˜Ì1»k»&W…«ÂUÑ-×-×-ÇtLÇtQ}ÿ´ÐGU”… á*¾4\Se™Óy<&H.KVµ×žyT7Úå‹3: eÙn–‹Áà@A /JRDä±HC6鉓X Bžk£6Ñ„t1Ò5`‡˜Ú4Y.µ—ºpkiªþ}åa3Q|ˆœ܇9ÌA¥ÒíZå`åà̽:syÞRò˜g¼A¬A,1Ä\€ƒ~û؆Aï: :è¦é¦é¦!©Huñsñsñ+Œ)Œ)ŒùôôÓÓOO…mq¶—íe{õžÙ"RH!×û”'! ZC¹¡Üx"‰ ’^…Ʌɪ~º]6°†¬!ÒŠù@Íýû!÷;ÎŽ³ã¦ÏLŸ™>£¥h)ZJÿ²¨¸ÿš ú”‘Gø#üÚ‹ö¢½žÆ>}»©ú¦ê›ª«©© ,5°ÔÀR­LZ™´2ѽнн •ieZYo8+­þ–h…Šì ³ÃtÉ n)5©_ª’£ÃÔ'UÈå"U[í»{"ý’ãžâ¿}`=Á‹‹‘ÿ Åk¤#‡z“½d*²PUn3•…æ@¹Î‰_À>š3¸({,%tÍÐ¿Ï ¶0Å÷‡“ðøÏF6xfÎÌÉ8bLŒéL2žŒ§/X}V÷°ð-U u š¤È·‡Ë`ð@,biGr\§Ž¬ kƒXt@$ëíOE(ú z× ½ÐKÈ="¿#¿#¿SºwéÞ¥{FFF¿oý¾õûÖxxÁJ³Ò¬´þ»‰ž¾‚g9Àà‰Áƒ'¬kÄ)m”6J›ÿ¥îæFäFäFð3ù™üLÓ$Ó$Ó$½â%`#‰ƒâ—C°‘ ¾ïçqçykÞš·¢XÏÕË>Ë>«`lÁØ‚±Ÿo¾ýù¶¾øy/Ö‹õ¦GP/vb'v 'Œ_¿6~ÍrY.Ë-à ø¾Ä÷1 ißœ|twtwtw”þJ¥?ÝJ·Ò­ÉÉÉú–bpªH± UÔFmÔRj¶i¶i¶­ [¶2ìy©ç¥ž—*s»Ìí2·çv›Ûmn7 g g g>ˆâƒôŽ7*¨ ú¥g: Ü™/›Œsxˆ—ø\Û¿Âp{_úÔÐ^Ú]èBžÖ~=ük>Þá32hYº—äá ’)C‘ßB76§q_8U0I3[›kM3í$êJH4¬YÒ,ºØÈÌE‘‰üÔ³o¹Þs½çzOvNvNvî“Ë'—O.Õ ªT×[„\"RH!eWØvE/È“ò“ò“Ì—ù2_e-e-e­ßÇ7xƒ7¡¦œ¦œ¦\®.W—«“l’l’l2;lvØì[Žù¾è‹¾â Ñ­ Ký l›@¦)dJ†:C¡^ôpÑÃEß{¼÷xïQûhí£µNÞ;yïä½Ü*n·ŠÜ$7ÉMD! QúÚ¿‚c^ñ>ÖByØQs²†¤ð˜?34©fD¥—++em¹`C1½° ëUÑã¸I‰1ÙcˆTÀ ÈCá/^[CDä ‚ÝœmÆS¼NLP{kN2™6C—CSI¹à5>™4pw‘ŸáQ,r)‡R¥(G9Ê%™$™$™°Sì;…²(‹²ÈCòD±ý€7Àv±]lq'îÄ]¿õ_ÂRU ÇZ;­Ö®À´À´ÀT2Y2Y2Ùx–ñ,ãYú¡äGüˆŸ8D¾ ¿lb«Ùj¶š6§ÍiówYï²Þe­º´êÒªKÙ ³f/lÖ2¬eذ#ÃŽ ;Â:²Ž¬#B§Ð)XÕXý?hw/®¦»Á&$† CwŸÆ’Ü º,áǰ¬ ÛÊR0Âe…-oê_^åZÕü_–=Ò-Q-árZÃwö_¬s„ljŒfEl”8èDDþˆo“Èöqª…™š]5õ-m?]çG×Ñ6â1Âüž‘ÙŠ"ùI®ö°‡=z£7z»Wv¯ì^™kÄ5⽟ö~ÚûiÂc†x/âÅRY*KŦGðè=†c8&œ0œi8Óp&»À.° … ;vÂ&l¦ÜÇ/ø‚/¡îˆîˆîHÑ›¢7Eo¸<.Ë3:etÊè[.ù†hˆ†ˆG<âÅ¡!¢Ÿ[Š©ï¼;ïλsžœ'çùØÿ±ÿcÿŠŠŠiEÓŠ¦ .=¸ôàÒI™I™I™—,/Y^²¤Ôƒzð^Ãkô¥šWœ’cã (Ð Q P Ž$ÇPâC²ÈJÒµá¥óäw±j:°]ߺ%Ÿ-Êõ´idqG~»Û“Þ%î7k%= ¦}ÿá4{_°_70ÏÓÄÝÊLë–½;¿Q³°}Ä”š""¿‡>‹ Ä™o®2ÙÞÊTUR>Ô6Úåô*BBðÊ<ÍÀUvN™ÈOŠP u[ÁV h©Š¥*–ª(á$œ„{¿÷ýÞ÷{'Ò4$ ‹{<‹è]ŒÎâ,ÎêŹÉp“á&V‘Ud‹Úµ)jSâûøïñ^ðZÖ¾Ò¾Ò¾Ê×åëòu’I¤Àô¥éKÓ—ú–ÝÑÝÅA!ò;ªäNìÄNT'ÕIÉX2–Œ=—.ÿ\þñ¯Ç¿ÿ*í$í$í```QWQWQWÁoå·ò[éºnÐï þœ*)÷Í}ÀVLFS*%Ëħ[Éz–’ÊØ‚³ˆB,Â6‡½E7¾1ŸÎžèrù lŸËÛ‘&níêx¯w»5wèÀÕu´BÇJ×ÒÖ®îø®ò˜R•ì“{^­šê—ß»QÅþ-V•]`y¡lEí6–£k‹»¸KlHQãœ^>0k‹ˆüÈ7‹ûÞ³ßÛmÛ¼íì½Ç´~ÜøLÙ)¥–êm±@¦S„É›´#©¨’´£bÏ|lžõY×Nzº0òAë‰/z‡vÈ+Èqúú"ÏúmÌäýÇß$$u™Ž¦£ÉRAe'¤€ü°;!¦jùåùæ*³Ž=B48PÐkÍ`Í]åWíK]$DMnì5ûhÞÄ ”ÌJ™ÈÏ ù@>‚%Ì®±]c»Æ¦á¦á¦á_;š}5Ëê˜Õ1«£ð˜d£Ø(1øéÿ ¸Ê¼Æk¼”x“Ö&­MZ³çì9{ž·$oIÞ’ßÇOø„O$†ÄAU*0)0)0á¦qÓ¸iÆ[Œ·oÑ·l…Vh% ‘€°ƒ'­eGÙQjKm©mÖ´¬iYÓ–í[¶oÙ¾wƒß ~7¸W‹«ÅMÓMÓMÓIßHßHß°ú¬>«ýØýZΙâŽ.I8…áô­DšIrÕÉG4Àhœ`ÃÙ´ãSÙ8X³ìúÀm±MqÀð„4°y^­j®Óæù Œ¯zvÁâãí+Ý0^3©ËžÛË×)º–ÝFf7jeÒɧ9Ê:x9t5]EöÊ!IðŒLÔNº5WÒÖô?cy=!ÖxºËZÉííLó:;·½ëÔÁm–/Ý÷ÎiL•MÏnôÓe†jáÙsµÏ*^Ô±SÚÕ¯S4nó¸Í#{Ípžá<ƒ)v*v*v2cfÌŒé+úо‚<àQ\æâù5ù¶Êߌ0ÄB |A¼ºöšrªö‰Î „¼Â9€Å"Ñ\i`&SÀpЂÓO3â~²ÈO± ÄPœ}}}Íš˜51kò¥å—–_ZjjjÒEt]ÄàðD‰ý€ð T *1—˜KÌÙN¶“íÔ¾×¾×¾/ñ}ÌAr° °s0sÔCÕCÕC©Žê¨Îà¨ÁQƒ£ú–•Q•ÅA!òO!¨’†0„!ŸÊ§ò©´­GëŇƇƇ.òZäµÈkÅõ×W\o½¾õúÖë“ë'×O®¿ùÓæO›?qï¸wÜ;Ý5Ý5Ý5ýrQ¸ë§%(äÂ9K˜ÂÍQ®h‰Úp%k0>„’˜Hœ]Å0¬ÄMá¿ ˜‹W R¥d =[=Á#Á¶oý•åÙõŽVléhUshùݶµÜû»¬²Ø€þÔŸTÇj2›,#P, :¨æj—¾¹ò±0ÓéU÷36¾¨˜à’v'ôfì’¯¯^&¾k”á’žv#ß]/u˜YLoÎö"ƒð;Ðy³³¬ê“ë…ÜxoÌç_ísµÏeû/»¾ìJº5µûÔîS½êß«¯~£uo×½]÷vMÜš¸5q÷Ëß/¿¼LÖ“õd½Y_TßE~5¾YÜp¡œ}@ÚkÍx+fZ8Pã¡ëFd4˜ŽãŠtižô!a|Ñûp•` s¼D*²EQŠü· A$ˆ±–ÂR Í Í ÍF8Œp‘­ÊVe«¾<ÿòüËs!k; ca,ìmZ¿2Ų7d'Ù©x£x£xâX‹Ê¿š5ÿj‰ïc@œ‰3qNäMÌ›˜7Q2]2]2]ñZñZñmq"TÊüˆø¨÷fùgPB ¥PÜM7X7X7˜^§×éõ /,¼°Ðî½Ý{»÷Ãö Û7lßH»‘v#퉊DÃããcêL]©#ŸÅ§ñjâ‹|¬¦=é="G”ƒ®*ï̺êÀÞ3à.}û@ÃÍroI×¶vLùȪ¼vªÜ$¾zç”ÊCݺXŸq¬b}ÕøªÕjÛ“@€3&ÞÚÃÐÌÐUû*?jâ3‡ç–R. —™röΜ$„ ‰ôuá‡á_+äº|ÎOwÎOÄ3`ªÿèI cð”ø¡<Ø0¬ÂMleçð‚ÍÇ>„èÖó'Y0aŽúùö íÕA‡GèþèON¤Ý‹ž/z¾h6þÚøkã»Íx<ãñŒÇM§4ÒtÊ"—E.‹\öxíñÚãu0ú`ôÁh}1¬;ä¹#‰ÓÖç#ùâ0ùßæ›âžŠ(1UàˆƒAn^ õl €”²’ý4ì32”J%ó •šéÚ;Xþh‰¶8„ë¢(EþkÅQE7tC7Ë]–»,w9-qZâ´$çKΗœ/‰;w$î@/ôB/¦aVÒr'ÿ5R %¡$TÚCÚCÚ#1#5‰šDMb‰ï£†/™ßJ©ž/<_x^µ[µ[µÛÈÈÈÈÈH(AÅwæ;óõ2F—ˆÈ¿z7íÃ>ìãwð;ød/ÙKöî6ÝmºÛÔa—Ã.‡]]*u©Ô¥úŒ~3úΨ1Ñ}b¹Iw&xÇß§it%ÍæmxŽ7×óß'*³íƲär­\^Zœ¨¸¶´¿eo'¯²¶VršPnŸK¸Å9I¸t.G©+’JZd+ÜZ“>ÔæÅ&\ùü §A|•Ïw³;†ËãN¦ÈïsQÞŸ‹žÎ{]5e{~|Ñ'Íi¬ÇŽï}9 np„©$Ó‘ÇÌ›À¾ ;ñ6ìZ±xlAf‚‚€G0 ù»òÂåá;ıCô=BdöÍì›ÙwúÄé§Oz~èù¡çtvÐÙqÆ=÷¨l˲-˶\ï³Þg½O¦o¦o¦/ÑѱҬ4+­WÜE¼Èÿ4ßwÂæ²ÛxŽƒ0rü•ê|`¬p¤¹|JMÈS¤U ‰†h‘¹hŒª ¢â.òß„\%WÉU–ŲX–y†y†y†“½“½“ý;ù;ù;yb÷Äî‰ÝõŠ{&Ëd™¢ÄþшF´Á.p ±!6ÄáGx‰ïÝ\ÁáPSMSMSM¢ Ñ„HfHfHf`!b! gá,Þð†·¨¸‹üËŠ©+f$Fb$’„$v‰]b—6FlŒØøÌ¹†s §ÔºUêÖ¨ï6cÐŒ&SON-=uД•™6™SsÍË•sñ´èÐ\V#Ê¥Bݵ^NöÓ<Ç»¾´Œ.ŸäzØ¢“ékÅ<€ ÄLeýYRTtíøH@+åãóåWQ¯w.ÅýZúÓñÎ>ÛgžÚ'¦Ì‡Rw?K(~ÿ¾§¿ÙÁÆd)ƒcÄ¡$yc;δ¬!Öi»êæ°†¸ˆEÈF0Öÿ`êÿyŠ´”l¾/ß—ïK2I&ÉÔYê,u–;±;ñ^û^û^```Ö©q§Æ;õtêéÔs…Û ·no¸7ÜކÒPʧñi|Ú£=ÚÃF0B! Q(I‘ÿ%$?ÜBAˆÁáDv¥ºÕfcÛÒ[\)JL–Ê9i©¯òYÑ#ÌEcTÓ¦ý¢è ÓgÕ¥xŒÇ8ÈRY*ϱ–ÃKȲ!4•¦Ò¨‚*°œUôï’ ¾b¯Ø+"#2"c‘,’E"ÉH† *¨†0„éó-¤"©zÅQpêˆE,bY*Ke‰ˆF4Ô¤©ÞYê,u:nÐÜ ¹Ü)=-=-íŠz¹z¹š#Ȳ“…³pv -Ñ-‘ d YÈB6²‘­?þùíñ‚¥Êæ0×+&0‰>3Œ1Œa,„ÊéÿËÎ3˜ÁLŸ=Z8/ȳ-Ú¢­ sJ)¥LÑXÑX!áKñ¥x¯¼‚¼‚<ŠA„ð¿_q § ¯ª¼¦¼¦¼¦Z¡Z¡ZaðÅà‹ÁySySySUUU B…x»‹üËssfÎÌ™b­ÌVf+7]Ütõ„™A3wû¨1Öh¯Ê¦Ou¨t“¨•ËSHsn£rXÀú¼O˜Tjbdô±l&ÛÀÒ“dóçTò£¬„·ISgåmxöêtòÕÛŸž¯Jì¾åufJë .—Sš©¼5·t¥ôß*ÒóÔˆT!6ˆÀ ÞƒídÕÙ–Š8†[ˆc³Ù[ôd™2%x0T°ëÿôîÏšŠÛÅYY2Kf‰1ƒ1ô"½H/ÞÜÜ|ž÷yÞçyQQQ5Ï×<_óüšñkƯ¿YºYºYz­Þµz×êaæaž~>fHÑúþóPÜIµ ºÀåQNˆF4âpW‘-´â/õø1wìD!A8̹©¬¤vcÙ¬ºàK»Ñ5´šéhùHi}ÀQ2‹ø¢šèuð‹b SØxÒt Ær¥\i’/%R¢R([*[j?õ¯ dUæÿª¨Šªÿòw0†1,‹ÏÉnžnžåóHCÒPÞ.neÜÊΰ€>±j¬HDBæD! Qä¹F®‘ëä:¹Nn’›ä&»Ãî°;Â67‚Œ`v‚`'p‡qX&ˆ± }ÑÝØÝˆÔ_üà?ÁV†hˆ†ú2"UQUI]R—ÔÕç~n†fh{ØÃíÐíô¹q„<â°€…^¥.‡r(G:’ŽD¿PfYGÖÏñÏÙ6†Á%\Â%¶”-eK…BB8‚#8",rþ$—b)– ‡ºçºçºPooCkI $P®Sû©ý´Áú–rÈ¿/J l7ÛÍvc b`Ñš¢5EkŠ&M,šhccc8ÕpªáTQ!½IoÒ[ô«ù·¬ïB]ç"VÄŠ¨õ#]>]ût-aÜæ…›Í×zξ`LÀhÛӎ͆?«Ú™Î½wöΫç3ÖŒCm®2ˆH~¬Ó'ÈŸV-êPB™ô€ˆæo4© ž¼ÎI _þÙ:»Ö÷û²f莽A-H]’‹Æû²s¬¿€ÇzaÊ£·>‰¤î_´—ÿçd%ƒ 2lÁláÛóíùöÜWî+÷5fAÌ‚˜S§„O Ÿ9`怙|‰/ñ%sræäÌÉqë4ÖiìAõAõAµÖ\k®5§Ïésúœ¯Á×àkè¯ÿ7ßz1j寥øòIx®Á|Z ø~€­ 0C‘(¶?âÅÁ+|DyÈ­«Š×\e†ØÊb»+uà h“÷²šjè†Ãâƒíƒ‡J(‘-´(„’3kï6M`<ŽàÊçgäg¤•?•{*wì`¥V©UºôñîãíU­«Äú¥(+çíË{•÷*ÿ‹pë*]•®Jט˜ÂÒ„4!M Þ¼)x£&j¢&üH~$?2Ï4Ï4ÏTPjÕ[Õ[Õ[óÓòÓòÓh0 ¦Á…# GŽPöPö( S¨ H‡úûêïË_èVÉ­RÈ¢»Çhc`cx®alÃXCóøxÍRfÌŒµ­ø¦|SÔìÓ û§Çpø¡«‚ ^'8Á yÈ#Ö$¤±ú¸Š«à` S8âCN±ìälÛÀæaa^nÂg ŠþœÁ™¤*¼z Ç„G.€­ØŠ­¿ó•®á®éw`G1Uz¼:èèizšž–(Ô:P2’Œ$#I"I$¹~\?®t–t–ôxQFQFö‰ô&éM¾Òutz5à6>àBJð(,i………EO‹ž=5:ltØè°‘ÔHj$ÍfÙ,›a4Fc4.à.ˆ˜È¿…+F¸Ç²ƒ,RðdAښ̶ªoi< ˱0L4¸Éx—6UËÓ…Kvªøôȳ=¯Ö§ÛÅ=K\’œØ9uEÞå5t*\‡Ó7Uò˜ô@$Yq¤ëŽùì2f³ÝxÄ6ã ¢øüNöáhˆá¿“ÄùgPÙ‹#Ä¢ÖÙ˸ŒË:N§Ó‘ä9‘Q+£VF­Ùíf·›ÝnDíµGÔîeÝ˺—õ˜1!cBÜ2Ý2Ý2×ô\ÓsMÏìÙ5²kÐÏô3ýÌ×áëðuðŸñYLNð_@PÙ½árAÞÈ“äIt &ÁüNmmmm„h´F Oxb38p ÐA'þF¿Ç÷ŸǢŽi ü•ø¯l9óbkؼ‘N¦ÉIÓ)òXi¡9™‰Æ¨à0¢DQþ]äHF2rÉ:²Ž0|À²¦0Űܧ(D .\™üîùÝU~¯-^»x×1ªc42ðþÂû —júNé;¥ßžVÀ²0žñ(#L—|Y¾,_–Oæ“ùdØÁvüAþ ?ßáÏ^Å:‡Îó1óÙUv•]ÕõÔõÔõ$‘$’DêÚéÚéÚñ&¼‰vºäŽäŽé°W/_½œe_:­tڀײ/²/N‹Ó§?#†O Ÿ\·ê1­Ç´ÞFYÓ²¦}è˜_7¿nQÝ«««Ü#¹Grä}Èû÷!w~îüÜùªçªçªç…Ç WSSSîWîWî/r.r.rœ+”éÊt¥Bk¢5ÑZ10à`Á7Á000˜ÃüÛ’NÒIºttt´­´­´­ÄOâ'ñ“͔͔ͤ>Ô‡út5èjЕ"‡È!ƒÓ§ NÓÝt7Ý-¯-¯-¯-‰–DK¢å“å“å“iÍ  …ÂG$ ’Ÿ5>k|Vê/õ—ú^7¼nx]¾D¾D¾D¾Z¾Z¾ÚHg¤3Ò Ž@B®n%·’[itÍèšÑ5¹ŸÜOîGoÐt§é#ÓGæÍ`Íàü·Ïß>¿ ºk×6•‡VØXac¶ÇKï—Þ;ÅN1¸ÂSKâ°e›Ø&¶IÈSWWW\\lxÂð„á £›F7n U0É2†ŒŸï"‚Êh#0˜À„w7xaø†žUx<™Ÿ›7ìÿj(çÉ¥ä+åù+ì>ÿê9à¢þ ç0ç$Õ¹ $/€Ïº÷ü(fÅz³;hÆ¡Sã(Z€‡Züö(!ùXjZÁ©õd=YO2ƒÌ 3Š–-+Z¶!xCð†à>OàÇÆŽÛ>¸}pû`çgÎÏœŸ­±bÄŠ¯^;½v"íH;ÒN˜Y!+d…z'CÁIä?¼àG8â9MN“Ókw¬mÛ£še5Ëúgã+ÄWx¾oûýí?tåMyS´‚+\Ñ/ñRŒOø=~´¸ïÁs¼Å!Èî¬<ª¾Í¯b„y‹8…»R·™Ú™L”/“ÖÂ"Á˜ _TÅ@TÜÿ@ºÈ*ò†¼A8_…¯¢¥š÷š÷JÁk¶/$@U"{gXŸ(o o@^&·Kn‡&MÖ*^¯y½æÍ¢‰º‰º‰¸Æ\cÎô€é³Ë£K>I>I>ÉHn$7’³PÊB ež2O™'YMV“Õ&SL¦˜L!ÉGòQê#õ‘ú(º*º*ºò}ø>|Ã+†W ¯Ì4˜);!y.yÎÚç·Èo¡‰QÖRÖ2ò•“³x…@Zœ3363¶®Zçh£Mšª—©—¥ß–äKòe׸ýÜ~n?¢Q4ŠÛÉíäv’¹d.™«¥¥•¿?þþ¢]E»ŠvŒ-[0¶ © © ©0¡0¡0¡`QÁ¢üÚÚÄæa͇5woJŠLŠŒî%1—˜Ks|R}RÇì5Ùm²Û–“ÆKã¹xY'Y'Y'Y¨,T*k"k"k"‰‘ÄHb ëÖ3¬GÇÒ±t¬‘‡‘‡‘ÝB·Ð-F·nݦÖÔšZJ %†Iº$]’n´Ùh³ÑfÒœ4'ÍùYü,~ËÆ²±ü$~?‰1#fÄÞ°7ì ß’oÉ·|’ŸØâ¡wyÝl>ŸÃâ]ãzJwr¹4 R4C9Åî3+¶…1KÌ×]{V:h†ÒØþßýùrÅðËØ2¶LPèIÒŸô¦Á4˜~zóéͧ7AAA5GÕUsÔÚ̵™k3×Y?fý˜ë[®o¹®¯‹,Xî…e€¨¾ÿENJã0!0…)äŠ Š f‡:ìè°cUÓ½»÷îî_—?ÍŸþàˆhAÇã>ñ%S/úKøÑâ~Œ½@€J@NMeu]ì$«KÛ‘£äW–®¡MM;ËÓ¤µõ7À\ÒÕEù[Ømv›˜÷¥ÿ—þ¯ºÖÖ&¹#¹c`^Ͷš­üudxd¸Š‘Oäz2WæŠ%¦{#1€éŠ-ÂŽ‘##7é:è:D‚L#ÓÝ$ݤø=ð„çÿyo”A™ÎøÀ>ÂZœøâϵçÚsíq:˜¦ƒ¹Ê\e®2ʆ²¡Üdn27Y2N2ŽŽàóø|.ø¬™¬™¬™\d\d\d¬\¨\¨\¨j¥j¥jU8£pFá !T+O•§ÊS  # # #UUUuv:;—× ¯AþSÌÇ|]׊òŠòœµ‘«#WûŽJ–þ,OõÊb­Ykö÷p¯„Þ–ÏñÏ!œ¶“¶“¶³ff¦’äºä:wHúQúQê  ¨†j¨&Ö‡ù“鉞H!+Èr0Ï$o ÏRŒãï—÷Îïý²Æm,’]”t ){瓪”.÷‹·Áf±QØ…q°Ã'¼G*>»ÿËŒMÁú.xK J¼óa>ô}D½(÷¢Ü‹rkÖ¬ œ8?p~‹û-î·¸?7qnâÜÄrÊU(WaÇÓOw<ÕôÔôÔô$$‚DWЧCÐ@1Yð†x¨‡zxÎ ˜ó¥É—&éNM>5Ù¿šö‹ö‹º´‡´·\  ÐAT€=¾ˆ¿ÈoùÁÇš4ÇQÌb7ÑK*}²ýhQêißvÛ¸¡äi)5—w“›–¹MXý•&G½,#ÙM{“[Úaü1ÖLåï·é€*ì»À)MW™®Ò½Ùî³Ýgi‡Õ«kMœ¼zòê–ž—z^  ÕiuŒà#øì, r䀰±EC€?L£i4m‘‰=¬ «ÂÊ o`sÙ\6½Ñ½a kXã4NKJöÿAÕȪ‘ÒùŽ+ÕÕÝ1OOnlœSœ“¶fBÕ„ªü?瘴Û±]á¢pQ¸Ÿ7>o|Þ˜7æyã0ã0ã0…ŸÂOágÌŒ™Ñ“ç&ÏÍ/KJ†%Õ[w¬_Û¯a_âV'¸$¸˜íä¬9këQë Öç…h6k6kÜÔ1êuŒ*N§ŠÓlÔlÔl,ò)ò)òÑ©t*ªÈ±È±ÈQ÷D÷D÷¤páþÂý|4ÍG6-lZØT“§ÉÓäaVa•xgý[Ä#ñ(‹²(+µ•ÚJ¥Ûúlë³ý`­Žµ:Ö©;¦Ý˜v£Ç>*xTðà2W«ÀÕÖ½Ö½Ö=Å&ò§azŒ2R‰çùÃ,£y¿š]\¾œY³¸C»ÆÍ/–ºróÞšø—íïO|ÁŽÝ‡æ  ¼á†ËÁ{Q„¿õS§Óè4:_Á¯àWpœç0ôøÐãCÜ3pÏÀ=ò\y®<÷¶ä¶ä¶DðXL>–|,ùu§îÔWð ^¡W.Å,4ÿ (((a„ cŒ1µiÓ:Wt<Ðq¿§½“½“£ÿ˜ûcî¬ö\ö\öü1'æÄ•-gËÙ2Qx¿åGW™£xw°€œx•¿º™Å³²ÜMr”ÜB0ÝH3L[ÊÈôÙ?ÈB4C à{Ȥ"& &ï$ïÄéTxPá@«ÏêYÄ[ñVrPPU»Án Ö‚ëI áo–È\˜Á a\AAy†Ïø Ž÷å}ùkP@¡ßŽÌÕ¿w`la [½e8†c¸>ó®°­fØè§Q!­¡ â íûïK¼„>ðmTµ¨jšQóÚ ð=yN†“åøŒÏÐa&¡®é…8'â$ØVÙ#öˆ=bÕYuV=?.?.?îwÊðE#ÑÅþ®=ÅlŠ™ÿÕ*)UR¼ÏÝÛyogìÇ m.´¹õ0 ¿{§þHt@‡ß9_5Qó‡3‚Û†¼àE©#uD=ÔC=Ä!qúJŸð ŸX6ËfÙú”šBM!åe"‘¨Ô j«Û8 IHÒ·QB‰"$ ŸP€–ˆÆhŒùè„NXÂÆ²±h ‚ ú2+%u;^H ý_«©©©©Y’=({PÚíÅP® Wä9…úöB^ßÿû}“½°0˜Š©˜Š\ä"— $É@!–6¦icz“Þ¤7eee—¹`.˜{±zÎê9ë&'oIÞ’q¢ÃÞ{»Î¡þÔŸ¾”«åj+n 7ÁÕãêqõ¨’*©’ž¥géYº.¤ iZV †Ô’Ãä09LÖ5d )CÊ2DADã8ŽãD ÈÈNÄQóÿ…%,aI‘ABàqn±¢Å Sÿe5–Õ蜠 ÐT®fgG6B ±Á!‚«(6‘?™îh‚²ØŒ ðåìhkâùÎðØÎÁS aS|òw^½0¦»…Òd¦kûE\dI8€l¥àé(ЦD"…ôûTr7I/Ú‹öââ9žã$Þâ-Túì颧äφðîþØT0H¯›^W¥X2bÉ?³Ù!³¯Es͹æä? ±ˆ…R›ÈŸŒPö(ñHƒìaòÊê}ߌ `ì=ë)UH¸Ñe{82wÓÛ$E±ýŠç€ß€ ØÀ옳£žÔ“z¦|Jù”ò)pPà ÀAN8uà”$A’ ISoL½1õ–Ÿ]~vùY›4›4›4¾?ߟïOrI.É…#á¨wΡ¢)æß…1Æ£nÔºÝ)ºStç©ëS×§®œgÇÙ5:Ðè@£ô½Gïñ½ø^|/,Á,åVœ³ÊBóÍ£Kw†a¥s®)§¨ is¢&7v„éãdj‰/ÂÑY-8£/²0}1DæßE -r#Ölù/"¤ä;ÊŽâ–p"Ì,̬Ð* aßR÷ÿ¡ýlÌFŽ(6‘?¡ì‘äà=¾"/ÆóãÝŒã¸Àž³ÛH‘^£ +x¹F[öDCT3É'W1„,ólü3÷¸^}—B )ËÇò±BŒ¶¦¶¦¶æ&lÂ&¼/z_ô¾h\Ô¸¨qQ~9~9~9¥ K–2\4|ÑðEÃc c c õµë±z¬žÞYQˆÅ"…DþU„Œ@7ÙMvSˆ8ºmwÛî¶]R=Jõ(åýÈû‘÷#ÿ”²)eSÊ’íd;ÙÎ$LÂĨ=?®Å‚€ð‡Ù æš³HYO]…˜¹ðG˜Ö8Q$õ1ô“´àš@J:ÀS´¸‹ˆˆ” „Ío$$¡*9@ ‡´'í1 åQ^ï/+ZØDþ“п9`¼ xç’±Ù.<…Š[NíKW´g:ñIä,Y‚΢Êþ/ ÈJ°ÁSPPþ ÿ…ÿ‚8´­GëŽ 8òÕâW‹_-öÜê¹Õs몪«ª®ªÚBÛBÛBËš³æ¬¹ ²ë㎕]`ùWU­˜³ÂŒÀˆ·o-ÞZÄÖ‹­[Ïúµõkë×>[|¶ølÁS<ÅS´A´Uö§âŠ;ÆÖ !¦æ8*[¨Ý !jÜÏ‚˜ÆØV¶EÒÈÀ@¢à,¡À£#Ê‹Š»ˆˆH B õwÈΈbÙ@˜±‹ì"Ö"qЀ˜Nä?Êg¤£@PÝR§äï×D«vh•“X2Þµ²Ýy;º‘Öºf|6‹F0–££(¶á>|Ö{¢'zò^ÂK89'çä/ª½¨ö¢Ú„ÞzOè}©ÿ¥þ—ú;D9D9DÍ«2¯Ê¼*£jª5ª–l”l”lËgù,Ÿ6¤ iCÈ…ß ‰ü3 ªÏøŒÏd ™B¦`6fcöÝ»!wC$žO‰gsŸæ>Í}èz^`“Ø$6I_ûE4¤ø­â®†Uà H@A²Ï+m5«Á!çvˆYËd'% L$e¹WúµxÂY¥ˆˆˆˆˆÈ¿ÀnŒ—0†¤ùº¢/êÓïŽIÉy …vï,FY8§ÚTP¸²LƒAt 1*‘µ>~„K‚ ÍC<ÄCÑ!é$¤§/J_”¾hA¹å”; 9 9 ¡ hÚ`蘡c†Ž™SNý9õ-[Z¶´lÉ?äòiÍ¢Yð€<~(%òÏð_ñ•ì&»ÉnÜÇ}Üw w wüâñÅ㋇{s÷æîÍËW,_±|E!Ïý@?Т!EàÇAV ´Ø‹Žh(XÞ³½•óU7Aˆ)yÌ.ò™Ô¸@zL"7HÜ9}NnÒT€‹(J‘¶ÁˆF> ¡É5,œ£ŽM(ý%&{@êâ†E¨¢¿¼¦Ãh«÷ÆŒa)Q’«d¬(·Oèÿ×݈Y3kfM<ˆñP¨ Ô¶mضaÛ⽋÷.Þ›f™f™fÙ!¢CD‡ˆU«W– +V.Œ—ñ2^¦Wß¯à ®èÕJQ}ÿ§á§òSù©ÄžØû)R>¤„œ 9rÒõ³ëg×ÏM4YÐd>!²¢ZåQ^”ÛëhÉ´F5áDö:¥¿:…Ï%k¡À.ð' ®ÈŽsŸ ËË"8cØÂ£4ÄTI""""""ÿÛpQ$Øã„¦Žv??&^—šxZv0!ÆdZ뎦Á†»P%4øˆ“*ŠíOC(`'ö–½eo†0„ ¾ì—u—u—uŠ@E "Z­ŽV×^V{YíekW®]¹ve«Ò­J·*ͧóé|:Z£5Z“ dÙ ªïÿ313©”J©T(ª¦ S†)skäÖÈ­Q'¬NX0Ón¦ÝL»ñÓùéütRÔ#õD±ýÖÇ]G® :$ùwU^ZJMÉE£Ò÷l™Á;{Sé}“B2G³Xr©H…Ñš4CfDDDDDDþã:b9mIºÁ 0‹ÿùxvW”e­Yi¬i_ÃNn5¬M£ÊÃŽ‘E¤Laü½ØÈ¿ø(¨ÚePeXÖ…u!™$“d¾lö²ÙËf7nܸ’x%ñJ¢C˜C˜CØÜ‚¹s üWù¯ò_E,‰%±d,€Ъ´*­ªWßM`1üBAAu[t[t[PuQ÷aÛ‡m¶ýpéÃ¥—ª¬¬²²ÊJÏîžÝ=»£º¡ !!$ä‡è‚_TlÅ)„Zö–´C˜0œ“¶)åF]¡U_O{М=öd·<éªÌœÊgY® ŽKŒb![ Ø‹S‰ˆˆˆˆˆÈ?I&r¡Â#DâÞ#9_Ö¦›³m…eÔ¾¸NV ™G¾s¢ùh„#)º—ün~ Â^¢ðþdŠûOÄAd–Ì’YÒkô½–——7³ì̲3Ëî1ÝcºÇ”ä#ùÈaÑâ‡E/t_è¾ÐÝb­ÅZ‹µ|ÅG‘ ’A2PQQïœ#°þ‘Ì; :GâHózåõÊëõÒç¥ÏKî9÷œ{Þ´ZÓjM«áNá_¯ÎWG)”úµ‹~þ^V™nè‚ñ€ ˆºÊ‘Ÿcß/¦!Ÿ‡È!W¶“$²³œq›%~£¾: Òm± fd (Œ¡9¿öJHDDDDD䟂{Âl0 60‡aR³´Ìü+™esÊõ@Kþ2kZv«ó!‹F2*™G/±­,C1]¾¹³þ„=ú›uÙ6°üà÷;¯þœÏàýx?ÞD‘(¥{«{«{»5fkÌÖ˜Å[oY¼%#'#'#§½W{¯ö^ëÊ­+·®\Íõ5××\/¤;¤.Ô…ºà.á’>€U¬ú[„Äš‚ägc6f_¼tñÒÅKªþªþªþõ.Õ»Tï’éZÓµ¦k…btB'tú•Óqþ¨¸+¡…GPM…!œ÷X}‚oí%Åg¾Ž7{T‘«½€uð¼gÜGÙÀØRnbPŸ^d3Y:»Kî.¸ŽläC¥ôâÖˆˆˆˆˆÈÁ€Ë<Ø|¤!E¥¨s'¦ßË1WÖXÆ”ïëòÂüšYÅfùE(`) @ןPqžú‚ú%ƒ 2ìÁ¤Á N¸Fš&ðNïTûsëÅXøª¬*«*؆©õ W—^]zuét¯é^Ó½^mµýÕöêgªŸ©~f‰Û·%nm®µ¹ÖæŠ?ÅŸB,bK<‰'ñDŠP¤wËõ$-´Ð²mlÛ†ÅXŒÅ¯Û½n÷º]\ã¸ÆqÚ:´uhÛ„4!MˆD’FÐñ+gvÿ½à‰lpúz`©l#Y ¨º“3šš©—º3ªy{Ã't摊s¶\ä|Ýz¦b'+ÇV¡¥¤W|ü>è ˆ¾°³ˆˆˆˆˆˆÈo`·™1È2¯S}²Æù¤ŸËYRø UðÜn®Å£Ty¦´—‡|Aƒæ¤ÖO˜ÉMxî[Âvú²GÐk°{Icv—ÝÅvRT nB  $%b^P¿êµX‹µ|¾߀®¦«éꈥK#–N|1ñÅÄ—C.‡\±©cSǦΌf3šÍh6ríȵ#×JÞKÞKÞ³XËbéGú‘~üa‘#ºÐ^ì÷È=r¯ðYá³Âg÷ªÞ«z¯ªicÓÆ¦}àÍd3ÙÌ*³Ê¬²_\üè!ïÉC}pª‹Û÷Ž’”Cî+w¸ï:â;ßÙ3àˆßü\·Ž]r±t7ÆBÖO´ _´³BŸ¥§Ú=2Y%\&Ð ¤Éå*ò¿7›ÀMŽ—%/K^–üÞô½é{Óg;œípVß&™Kæ’EY‰ˆˆü3HríI¶p|bÞ<¾Í –èÈ?¸Ÿ3Ñ·VRù$;{áUr™´ÁÝŸ®Ö°†5c0@8®Ùáf‡Í*÷ éR*·õ‘ÖGÌ¢ô-ã1)­?6‚ŒJÌ$¨‰Å2Ƈä!y(K'I'I'›2nʸ)!¶!¶!¶áÞáÞáÞË´Ë´Ë´¶¶¶BKDƒhÊ¢,Êþpå_NÃi¸P§Ö ^ð­ӷNß:}éÖ¥[—n•‘–‘–‘ ‹(:œ§ÃQ)ýÎÈì‹XH¤{² ÷4¸“X½l÷5\\íó»kûÕ¨=ê¬ãn¿¦|=Õm~^ÍÙ^#ìg\½nP×üªmÊL¶î×á_³»ô Ñ/ô€/Êê7¤üÏ$H*¾“°ÃàMÚA ¨ØüN‘ßÂe_™æ¡ Üa¿ósÍìP˜iúéZ’†Ü r¦Ê½2/­mõíeþ„OÒú¨úð‚6Ò7ô }ã¾ß}¿Ó—…Ž CÕ\{p]¹©ÒTi|õQŸ} ¯È+r…(Da‰Iž(ØÈ…JcØ5d YCrŽœ#ç4k5k5k7­Þ´zÓêEW]Yt%­kZ×´®­ýZûµöÛä·Éo“ŸW¶W¶W6߃ïÁ÷ VÄŠX;bGìôWþ…ý¶…1ÀÇñq|¡„(þPü¡ØÕ±«cç»å¸å”~P¯W½^u¡‚ *RÔìÂ*ÔÖ_A é/«q‘gHÃYB©]¬ÂÓPí9Æ»“3c‹{ÉdKçÇ .÷ðù¸WíÒ¿¶9Wgx!c6M¼ÀØÃ+“ú¦» ¹¿ÁÛJ/­õ3RÝJ–¢ œ`¦ÿ ¸ª¾ +b ¿åÏ!©d>ýÐæ=© ÚÁô{%¢úþ¿…hqù‹(ö¼ ƒ‰¶Ó…ä qÄÌA«ß¶)¹ÐÎäÑ?Yú´lîSþ .ÿ ØÂRo˜<|­×˜ú>•ôr&­qGï#ý³¡‡„îgºž±™ºT²TÒ%g‚ÏŸ*åÖ¯ ^±ÜªºUu«Ýú^ר `ƒ’ö³ëÀ+¼Â+rˆ"z Tö«ìWÙïКCk­‰\¹,rÙÕÞW{_íÝúVë[­o¿ YB–%ßÇ󯫾 B]O×ÓMÂq?Òôk98rpÌ•½‘{# “|’|2i_¬ù¹_N>¿sn®#EÐB“ë¯\­^‘žWØPÙdé‚’Xb›:<%§`@ûÊÓ.t|;öÓåÌŠIÅ*Û^æÆ†Õƒû®°éÔ~k}âöR·Ífr…´i‡4\ÀHh¡_b¦ÚâXrH!Á ôC:€„fËv•sÅmšîzÏz“yy¸±â€`#}Ð^ÐB+æ¸ù—àÀ蟱]Ù>V~.sd_Ћp•&ÒJ¤%•“åøDf%–ˆÀ Å´FG4D˜Ëuö›P˜ Z³-ÂqláÇò™:m²n7¯-)ON{y»ÅZybÚÀ îp€)øŸ¬zŠ ÂJ!Eò‘|$/Ž»8.-zÏÊ=+fÖM®›<ñA³qÍÆµú:¥û”îSì V¬6X+¯IeR™TÖ—C*Y>ßÅË-yÁ ^l=[ÏÖs”£¾}-úÚDˉ–-¯;_w¾îlãaãaã1+bVĬˆ‘‰‘’’b³Ø,6‹< ÈÁQD¯¾ÿ …œŠkY Ñ Y( e7Èv² ¿½øöâ[_âWǯ¾I­ºYuûR±æìš³åeÊ-*·HÖIÞ_ÞŸëß; þL9ž`$Úá:£¾pâô«^û|2¶ìð8~û‚ ƒšEùYÞQ¿:,ïôÌÜñù ]§û\fìqðämüÝ·< nß¶¿¸Ÿ‹'ô%šÉ℃Ä‘˜®ÿ,CÈÚ•eñ¥Å4ôFmÎö%ý‹7qaŸc^­O“vÇ\}ôŒuZVׯÎ&£òò~äöc:ª¢+º~ßmùŸ@´¸‹ˆü)nKð·œåΑÖ;L–ÕíçimŸn8Cf)­ð÷/Cv‘:8Ï=¥ïÉ CËÆd9ñÄ)ôF³ï…ÓéOãиãÐXø>¦WŒ2¿ô3îøË ³™òöµå¡²>èûUñX˜ÿ¤öébÏt²p­öÛÚoë†\Q]Q]É‹°Ž°Ž0^ºg鞥» ®\1¸¢o;’Œ$#õo,‰!›¿ñS§ýiª×deeG5bÔˆGæÌ™‡ËÂeá²å+—¯\¾Òî–Ý-;½ ž¶¤-iK´A´)ÁÒøûR*¾ 9‡s8GwÑ]tB†!¿}Óü›óoº4<úæè›1dEΊœ.ƒG;Œv0Z™V¦r!FBJ²Hšÿª“æÔ@Y®9CšÃ (ö×î¼£ac+¢GtÐ|™?}`¯&wŸb°K*焌ï°]nžn˜{cöº2]ý ³òR}ôŽ6`¶zòÝÜ e&×èSã þWSà9f#AòÓMÂmg ƒïÎ0‹IY§Þä¼>Ó ˾J¸Ñ‡;»Ui—Üî¼ã¨ðõÏæq•¾&ç\<0XqrÉU}©…¡@*#‰ìÀ \EÿÍÁF¤¤#*î""ÿÉ (x<†?2Œ1îYNœéú¡Ú~¯&Nu¬ôúQCu9|³Üš¾]ËNŽï¹ºF׺ã=¿Ú/´»e‘f4N:KR†üáåmiwÒK iä­FŽ¡·±]PŽ0ƒ=,a9¤±ªÔ>ðé-êHÚ=;±kpŸŒ… ¬”xò䛡Ÿ¬\LûLb€Lùé~;á*…RTGu€Ö¥uI–ðbƒüù r®Û^·½nééé97wnîÜ\î*w•» ;ØÁYÈ‚¾}‰t!ú|zßUmÒ•t%]á—o¹€Z7mÝ´uÓk#®¸6"ê^Ô½¨{GN9qäDI5&Õ˜¤›è&º Û° ÛôW¤Zr2óX–¸†k¸FÒ‡ô¡þw/†ñLã™Æc½•Þʆç6ŸÛ<0pGÕU;ö‹™3ósÚŽ¶;ÚžîÕ¼aó†–Ý«\¯r]²_/ç'ä ÿÒ3§t}A!²æd«öµ1åÊÛ#eªøy£¬ÍËŸ=¶_Ó¹ò6Ò Ô–œAªð.ó@…›Üè”ÝÂQm70Ö+°’öÍíÓãÃ{d;iéݰËõÏÜE+²€ÔÆ%ÚŸ„Å÷[”û¯xíÑïë?ý'“úHÇrò™ŒÃ«â [8Ö²t­zoÇñÞÝ{h3±cOkOÏ_öxz­ תoqó›²(=ðr¹É»¶K÷øÖ¯„ žøß Ïý…w‘ÿÅl–ôõ&õ„ãÙM5¯™´gã²I5_0ö¬ñ¬Âµóæ´ôJc,d×ä,Æ„L eìþî‰öÙ»/]uâê©U£:»/?8²VÃ2ϵò¬¨¨Ö¶ì`›öæÑòAÿà;¤ãüiS žÎ'‰Ä‘!p{0 -~x>ý¹Ïªf¨ W˜Ârx£"lƒjÏÑfca'kf]j8j@½UÛëMH´yL ê\$‚¢Y•Q™óå|9_át£4pÇøŽñãgãŸ6~¦ÙL³™f$…¤bF̈™>hU äÚ›‹«Úˆ@™Ef‘Y‰êÕ«îsßç¾Ï=Ò7Ò7Ò÷ÊÉ+'¯œl}¶õÙÖúçj£6j“éd:™^bz]ü÷j‚&hBüˆñÓ;  üp’:¤©S%ºJt•è!‡‡røØÅc- w wpŒ‰yÐ|õ©Õ§š¿9ãæŒ0·«‘W#Ÿ”Y8fá˜öŸ<ŽzÕ_Å’¼$/áû+L“’ß:°68È®at¨œå]4D½ rÝÝ|’¹@ÓÉL²Äj¨‘Nþ:w¡ª‹Æ†«NË“žÙ«òãT'ú[\îjÕ¯73§ÆiÞkHÍÚ²…—ÕƒgÆN¬§±p2 7¸6öÃzËÛ½ùC¬.Ë'…d˜[‚2zå]÷—xï}û, N°‚wFúJ¼5ë'L¯ÐÓµ¿Å´9G¦ÖÛÝ­WãÞeË| ¯J]fÀÌåu¡Ã9Ù1û]!ªuyß‹žFåû®^OmÛ dfÔòôÞoª'zg=%:²ïÇæÁýWX""""ÿ2 Œ\$­q‡·å§² [7ó÷†—;7èå±èÜú˜ä°ëÏœ•OJ¿™·ªHhš±û½AÒ©Ýa6Ôêœq´|´eSüÐ8¸ì€OdR÷m‘ñ¹sZ¯|凲_W嶉ڞð)íLز˜J_>û×=uIÚ«Ë¢°FlçÁ€í¸o¢Vd1IÆ1É`΂:òù«¬ _Àf0v‰I0‡pq?à+rÈhbŽ=l=‹Ç ¨§ ›Ò%݇˜icÔYv»tVŒì«„Ì&Î8ŠãŒ¡óOúk Уh¡l(É!9$çÙ³f«G¯½zô´Üi¹Ór;ßè|£ó³³³ 9r6ä`;¶c;nán¡š¡™Þ¹Bð)/)h ¦ØþCu6Œ cÃhYZ––X±*bÕäÑ“GO=Íwšï4ßf›ulÖq–f–f–Æ}’û$÷I;wíܵs—æ©æ©æ)}KßÒ·¼ïÁ{è¯)ˆõg‰ð}„þ¶B+´¢†ÔÂö°ç7ó›ùÍ‚•]hn»Ôv©íR_âK|I½võÚÕkWsRÍI5'YÖµ¬kY· º ºà@Ìþ˜ý¯&ܯx¿âu™Íëc‘šHÍŒåŠÁŠÁæÍ™9ûh¡ªJs€G&2øKÏŸ'ê@ÖÇþ;jO,?‹YtnðIÍ»ùöP~œ›< NÝÊÎ2k5ž8Œùä©+ů³ìüH“†`ìÑšI¯Ô»oëÆ3ÆBfMÖžH^Ø©íl³åÆ—dIBKJÈ|пíoUÅþlk‚p]ÁºßMàAöz¸DmÉVä MÌ ƒd{föÍ«í“^éÂÀ‘» ¹6ű‡«&Õaì±ã䚯ÖpìÙõ™ÏÁ²£Ì|šÊuÇoÎÖ¶›ËXdÞìÓŒ…¶ÚÞmR‡¦µI ÀWn=NÖ`º£º˜¯µ¤#ZÜEDþ#ÃR.„& áDßC-êV¨Ç؃ä‰É¹†w´åΔéFYD›U”FwhÛà¸û›%·†ÅÔo}ëùºv]kÇì?è8 tæ¦`sÿ Œ=Ì›4±ð²S¯2¦ìÍX˜Ç”dÆÂ6:3öŸ4]ÅÝÐŽ«›µ 8n”ý#ƒÍ»{TY6Χñì.¯|n”]erë•ví-¶5ø£¯Lj"èTO¬I$ˆp2ØâŠpc± ð…/ªÃùÌû†CBu´)é$œèÚÔ'ªìpÆžxNfì‰Sà„­FîmTEi˜IKshSÈÊÔ?Dï&ÑÐAïh×­]·vÝ8>p|à>1|bøÄ1écÒǤ ¯Òƒô =ˆGx„Gú«•\ëûo|»iÚ„6Ñw«9לkîÏûóþü#úˆ>¢Ïv>Ûùlçš­k¶®Ùj•e•e¥w¢ehZF°Äë¯üß `êãÇp G bC¶-d nâ&nohÑÛ¢·Eïz{êí©·g^çyçu<$xHäþÈý‘û£ËG—.áø…ãŽÏª=«ö¬Ú cÆ4Œ6J0J0ŠÕßó ç ,XVt¹úñêÇ㇣Gmó³-m[ÚJ Cä9@ÿÒó'7ƒ„ŽÂqO«J+J?ÕÌ=°®öÖüOj¶Ïo3зm…rÕœ÷9D†úñ9›”Â⊷РqÊùžj„éúÜ:¡µv×måø|ÆBS§$„vÞÖ¼—‰£Öê‹q°þsgÑýß“"ým¸ÿ{Ë€bn*Ô˜¬@iŠ,¬.Þ°óÃF˼ »º#©woÆBl&cìþ퉕{¼ò”Ä°Ó ‡MÚcxÖ¦]ŒNÉoù…®-hÊú‹ŸF¾åÞŸ9áSîØë_ÆÔZQ>È®2ê¢"lè.RDÊCNTÝKôÝ!*î""ÿ .a:â,–¢#—D¿’˧V,”¶]Â^‡fNyʂ͛¼t°¬•¯×z²¿3´ºÔ_UÉÅaùÐ[mËy]ÿ~܆ƷïÚø¹{ãÌÙyÿ£Œ…T˜üбÇÝ&7f,¤Åä(ÆB®O±`,$JmÆBNLfŒ…ÄLi®¶¹7Ž1tox?߃sf^ò6÷úÀíuot ðq*[ÊåœíA“zÿL·hKrP‰„3$èa“ò¤‘cìa ÃæmMº ǵ·WXi·\™uóñ¸ ~`jö‰¥ó­ÛŒ^%»H=\ÇÌ€_ øe‹›á:¡:‘¥d)Y*œèéÖÓ­§[ˆgˆgˆçÓ‘OG>9øÂà ƒ/èßÚ—ô%}ѽÑû›@Kl®AÅ_’xOâ‹7iö¼Ùófϯž»zî깈+W"®ì?½ÿôþÓBrIý»Z¤!„oR5Ô×ÿÅ¥m c“î¤;éNÓi:Mÿ£7Uó©æSÍg´f´f´æß!¿C~111Q4ŠFÑûíî·»ßnÕÞU{WííÒ¸Kã.]n¸Üp¹ñ;›Gæ‘i€Xi²4ÙÈëHÅ#O ‰xñ2ºOþ û6LÇ$LÂL*¥Rj¢ÏÉókBcÉ$¢/$ÔbE™^Žõæ÷û Ûµ ×@%ßkÁ¹Amö¬6·l3}û‰Ä™?dby€Mè&©Äy}¦óð«áÙHõòæ½qoÙˆ»Ñ  Y79ÿ©ÁΈÞÚÒžv LÖ믖G½I”ƒ , <íÿíÉÂrH¸.t™Z¼Ií” ì¶ÍXœÓÞ]«½s%`c&WcìñÊÉÕ­o¸¥åÄ MÝœÕ6§ã~R$-MqjŽ}<ø|‡AMê90ö¸æäzŒ…¬œ¬9²hf»oŸ˜‡k 8Á²¿<øIäOBTÜEDþd¤€’太íÌ&3›Ì,§sC4DxÀã[÷/õ"Žx)×ÈtH°š–9qƺ>ùµ ^ êÉØ¢2ƒÛLmPÞk¿¾}:™KõoæŠ)ÚCО4™Ö ]„¬ëßp¯’î¼Æ?UWé¾Õ„PÆB<&¿jw¸ÕÀV^¹n-­ôS]EÒ‰ JÃ&߯üóÏ_<¢jÒ$”b(:£ªpÚÕܶ‹"kýàquWÓ¸ßÚ>Þ“±GA“>1öÀib?ƆLx+`mj]Ó‡5º¹Œ*~yî8½Mv‘ÆÈ‚Þ•ˆt#Û ÃmL²]iÑÚ¨îÇkAK†ºñÝôš¸ˆM¾ßmBf›…õ Këƒ(h]„‚ï·‡è8Sâw‘ÿä ÿ-%À²q#V5ÍØãA“[0ö¸ÒäZŽÏj®¿¿¦ÐÝdÁo6…¤Ä ñ˜K5´1i'9ÀÍ¥ršLëvÿs%ÜÚ¶ÊÀ2rë%#º¶¯R™ÛÕ6°As÷[×9vµÿpôÖ ¯Œ=Ø;1š±§nS] Í™rŸ±ÐúS0ZÊ0Æ/œÜŸ±ž‡2vïí„ð÷þǧ!AçŸksÉà‹õÎuxÔ`¢û:¯ƒ¥­`üÌÐ\Úàï+³ÆQ²¯öoÙÚc?öé¨À9ñmv$uÿì]e@VËÖ~Öì—A¤Pl±E,ÄÀnEB0hìÆîîÀÂn±‘î²»»›˜ïÇÞx_¿sνçž{ÂxÿŒÃìy÷ž½föš5k=«¦‰¾v$U%{TgÖ´Ï¡•ïè;"¯\nÂ&l"ÉHªXw`Ýu³²²R¦¦LM™ÚíL·3ÝΈeæÌœ™Ž"Åhˆ¼­„V‚”\L?\?\?|’Ù$³IfÙí³Ûg·O«V;­v Q Q ‘Òm¥ÛJ·¥ahÉZ²–0 L~¥çù1œ‹¹˜KqGqÔ‘:Ò¯DP”[UnU¹U®•\+¹V;&vLì±ÀcÇóZäµÈkq6õlêÙÔÝ3vÏØ=cxÍá5‡×tÝàºÁuƒJ¡J¡Ê¯|Ùköš½¦ãtœŽÃ(Ë,ºE)CÊäFnä†`#¸ ª  Ò&§MN›¼?aÂþGGG˜Â¦â†ð‡"Ðü/Ð9ÈÄ2¨C 2™®‹æ«‡*Q-»]æÃ&¹÷ßÉ?E÷i3MÇC©–t4#ô¤8jþÕÒ!¯d·EX±CL“jˆJ«î7™}×l·‘_sÎSÒÃ:qžR?´¤°ö/¿x·IÕ#Ì*J²§#èÓiÔ@eèË Ù¯-RZP‡²tÿ È{™þº¡_DÛÇN®¥n0 ˜óôþái¼\ÂÙÎÓ’Ãg†ï.ò»<ä¡wG竲æ‚“z»A!8O+©.ÁæÐ‘ºOÄ›2¢%x"–‡|ôžêü‚óÔ·a/¸oª6!õùÍ®cÕCUI¶‘>Ó8\¦6(Æ‚ŸN°~(wøÓ šZF£7j!«ÐSõ–òa÷Õr›.ô;ÆÇ¤5wý{Î;ÖÏY¿ÅÈëv[^÷S4ôäåaùƒÄÚ!m8OkîÊyƾˆÎ3.Dìã<ÊÝ"€IDAT3*RŸóì¥Q­9Onr/gçNß&ÙW\ê1$¦ãȸ™¡%]òk¼nú±ÆCs[͵ÑJ“äïaÇî ëÛzq~úò¸%¥KãcÃxõ¦Ö÷$ « ÄZ–ž3È+‹OðOh3m¦ÍbEðëà×Á¯³§dOÉž’2!eBÊ„‹;,î°Xº´ˆ±"1YÏ2 ~qz@©”J’g¿!D~cýÆúM=–z,õXNåœÊ9•§šzhê!CCC‰ô‚cãØ8ÃƿճT#ÏxsgqV°¬k),X¾ùzZOëæ8Ìq˜3´pháР]6tÙÐ%?-?-?í ¡3”09arÂäù[ço¿µí½¶÷ÚÞ39`rÀäÀ¯<¨*©’*EPE ‰HXónE¤#ébQù‚òå Ëh-£ìÓÙ§³O{Þö¼íy[TÖ™=³gö?ëbzÃÐI,jV¾«Tû¶GØ­.m9Ÿ”8@ó)Ň®Nnÿ¢¡‹¨Ü ÏÊHŽ~!"ÜBš£,džBc’RëTt¬°á✇úÕä<áÉœ' u{±'®aàýŽï7¯(ùÍ Ø{:„L,ûâå&O­XÚPÅ D 9kK ôÕ.Ó壺QÁ)×M:»sž²%¬ çÉÝCçrž6+<ìîønÃÖ/ó ëÚlŽÉ½_y½³õô™ì¿úÅ_nÔ¡ %pœB0Í¡jØ£qLõœ’EÖÚ击ïçÅi Ãkpž2'Ì¥×a`ûîÒ™°nÔKÊê÷ýZÝå§™´¡ŠÉðE}ÒE6Fá#rГìPŠ8ݨ kXCYÃïÖN¢PÜPàOžSéìJY@j·‰M?Ú¶*r;õ1xïÖ=¼é±¥³ï{WÃ,Á@ØÁ:hŠ0ÿƒë¦xÎ)¦ÿS‡ d膦°£µT‡…©lÍ‘™f”ûï»Ñ¨¥!»o¾Ï`’æµîÝ[Ø5\šº¼™vüüyw;»Ñ+öö€ùï­æ.â<ýeÄ@γ'Eµå<óBdKÎ3¯Gvâ<Ó8â%çI¡ÊŸO̺öË®~”¬´¨~—ðQñ}vÖËßýÌãÜÅVºD_*9¨ÙµqO§vY& ’ b„ 6“ž’fb&ô¾K×y«ðNìÄNœÂ)œ¢:T‡êDÔ¨Q7{{ööìí§ªœªrªJK¯–^-¥t÷ì»Ä.Á ^ð’¾Ì?FžQ9oujL©1â‡8±¦fÍ6šqãÇ=>ctÆèŒÑæ¸Íq›ãœ§;Owž.L/Ö‹õÂU\ÅU©OQ6,a KQ5'eR&eJ¤DJüå-˜_7¿n~½SÍN5;Õ\öxÙãe–',OX~Qù¢òEå¬Y²¬-Y[²¶$ s@ç€Î6£lFÙŒæ ó…ù_Mµ9l›Ãš°&¬‰Û mþ[—žJ¨„J,˜—ågè~³ûÍî7/M¹4åÒ”i=¦õ˜Ö‹±‹YGÖ‘uÏ.¾{gªÿ `<Âptg„—8r)kØ|ïr¼t²Ë_ΧÕñí¾Ï®g»d—i2=šm¨üj‚€_ ž ÃÚS7±l}Íxj9­´ÕK »á<½wxZ‰M¢YˆëÛîÇ ‡lôKi›ê$Y È…˜„bœDYrÅF3¡*ûWÆ5€±£ž–†úÂàasÜÚØ}ìÅYœ§. Ëæ<¹mè,ÎSRÃêi9{QÇîÛk©˜ïÿJÔfÒS² ud~Ioñ{ø×E>„±lcY\s·‹ÍjÚŽ(æ)Ê¡ç¹JJxX­3»Ö~èÝEë–úpeF呃Qä„{ˆþ¦3È~õÚä6-á†Jt‘üP ld ´R(Jø+uà+*Ìïx:)wøÓ°ÑðbF´Ïeš‚%ÝØ9x’†ç<Î3U#.sž¡Qµ÷…í÷¡êÁ‚EÑUª=”ûÓó†Ê¯oUa =RB˜Å «ØZÁ’™!5ü=™<©ÐWãv+“ºƒ,·tTíÜê=Q š?˸²lQ÷/ªœ1èçéFá;9OÛÌyz—ðóœ§çGXqžV=4ó¼wã*xººZ’4rœrÜkÃ÷­‹_FGÚÛ÷oÑÿæJ£‹t˜Mc¿Jhø½)¯"? €&Ñ$š$:Ï(P> |`Âû ï'¼Ï˜;0wàqÿãþÇý›¼hò¢IËJWÖ•uýª·C]“WmãxjE­Hr¡q°t°t°\/¬Ö k Ö¬=:ÿèü£3Z©µRkå(ß [Ä!š± xRŸ¯s¿—Aó˜æ1ÍcÞÞÞã6ŒÛ0nÑG^yqzêé©§§æ{æ{æ{8zà裛#6Glvá:Âu„ò åÊ3~Ù«À*° ”I™”‰ú¨ú_æ×ÿè¾Â¢Y4‹ŠìkØ×°¯qÜú¸õq½}‹÷-Þ[ËbšÅ4sµ¦ÖÐ 7Ò•ná-‰å¤³›·^Êùävr>uÉÀÛÉÝnnC‚ú¨J“‘„9XöøíE­ŒJ ‚8±XgJ"ñ:74‡ªØž3»UÇcœg(G´(u**¸ïœâVuxNÏ£µgIÝTÄ=Le³é™Ód²Ç&±^#Hµ‹ìnÀÉöjUOÞ^´=h Œóôiáï9OúÚóôJá»/o²ìW¥gÇæ†vË•£dÛØ.I 2˜5ÄkÄ!ÚPÿbþo—€ ˆA?DçH]él$[x¼îìgpž67¼çé}ŸEÖïžPk°ô,ë©AÙNú+ïüobY+A5a šNöØ!lcÉ´J°b=¾Þ,ÉC/Pk¾ªƒ³Ez¹©]·x¤X/0[g¼T5U¦#ÌÁmRЕP©l±þ¾ PÜPàÏÛÏTIŠ>ª²Í²gùÊO?Ø9ÈŸLË Ÿt­ï–™ý?˜:UÕ¸]hC9Ò†/1Bë‚` #h¡?ZÁ[0­QŠÓsŠÂ¡kGÝX>³¦Æ¿ÕNeMGGë»Æ‹µï´«ÚPݦǤ¥>ëê«6£yû |wq¿V/mã4 ç<#rÔ‰£:ë*ÕòöJ¼µ;Îs]F¹˜·#6ĺ[v÷-)E‘°IXB…’=õû…|¶QeR&éë ’¦’¦’}4úhôÑÜm¹Ûr·3>f|̸Á…\.­#ÔêÀ®pý.ó­þ;©+û×-Ñ’Š¨ˆŠÄ?jïÔÞ©½3zgôÎè9»rvåœO1N1Nž0=`z`®ªƒªƒ^}`ùÀ–€P¢â¢â¢d÷Öî­ÝíaºÃt‡éoY½eõ–Õ9•r*åTºðî» ïŽçÏ;ž·°taéÂRO#O#O#CCC“_¹Áú¬>«[¸…[ð|¾Ê„úgm¢Ä~|àÚE»h/‹bQlì\µ¹js]nm¿µ½P¥G=,”î*Ÿå³|˜ÃŽ?Ój*€@´W±–(Í]²îšúp>9c@>/šbã“™k2h®×n5®¤&\‘ƶÖã÷å÷’s8a³éY‰eÕ ÊšBpLÀ¨Z-žržÑ,«hýÉgÃzsž¾$Bu׮]Øh¦+òu,jSñDö½U>=ý9OÝö”ódÚ‰óôváWŸ‡ÄÕ¼1ùâÀ¨ú›t¬4µÊ˜ã¥ e«(:Ђ´…øƒùM唎’Är½ £ö^9äBÉýdýÐÞOt÷æûß¶N6Õ>ƒÅE3¦JÓpÿû‰ðA8ÒÒÃzMÈ„5§8”b#Fÿ6ݘñ,½ ÍÖ:ja`å•SµÃÚÀÍóìØ3/pèZß)sê¦Í7Û­êû……“œºTxn¨" :T@=¨Û÷™çL¡¸+ ÀŸ+¡ͧje¼(à {d׺ÁyF÷ˆ¾œg®´]æßL²§ z¬+õA ÔÅ7gQ•7»Tƒ *PuBš0í¥y²óB,³§ž,ù÷ÝhC}Ÿ²KmÇ.†©áË»udÓƒF=ªxû°ß|ÿÖ‰ÏÌŽ˜xøÚîLËmicOŽw©ÕË®Èns5Iy¥J¡D"òKšïQ…U‡:Ô¥'Ê¥Ü2‡%Í®š]5»Î,œY8³0wEîŠÜºèz kuVU/#zþ¥óá<ó õ—b‡˜dT¥çôœžûŒô9 19595Í#cFÆŒ“oý¹?¯µÏ©–S-Àa¾Ã|  5!½YK –,¶N K KI;“{&÷ÌѼԼԼԕW~\ùÑ÷¸ïqßã¶%¶%¶%¿r#å©<•LSÁTÞïüï”4Ö”5eµÅrgÎzn^°yÁ´=AùAùîWÍߘ¿‘•ÑbF#ͺu•Žà$.”hW¾~,ç“K|à|òËw/®ú¢c¼Ñ$Íáj‘P†FYx„=¿[¿NpíJûðÙØ† %7á9k²Ô,T¥é~ÎÓ:…÷øœvrÕ°Êœg׊*·Ö*J»¥®ûÖ!–™̦*µÏä<É!$žó”YaÕ8ON -à<Å&ônl¯ñÉm:T»Rѡ ¯^¼+íGnc;ÊMï?ãS ž'”‡T©^•1ÏlÒ]ÒòçioÃwqžaá¾²Iø w‰¯†õ¢,RÁTø¢á_ù:å&¿t¡JqÔI²@¡3½lX_êû›—ÖÀD×¾m÷ØÐ`\ß~®õ‚öyO¹ïu÷ü­˜¥}>|êw¢ÇÐYœgÏêÎy:ïÃù…öb–¿›ô¶f΃‰{Îú˜gælèëÕPI¯Œ ˆôÉ…š¡Ú÷8/Š» üoS „h;±Bù¼’3˽²uSa¿ >7µJت÷8v|ÈT·ÌÖf3ÑMPQ0d]©×wû¼À< Ej÷˜O·(géÂ5êMÊX†×8Œ _^ê–ç>_éèèâáF ç™ö¼Ö¼Á *6Ö[·¢CÐÑG'æ×8VãXõþb{¦Ä”˜‚ô¥·ïQy• ¤ô‚$Ç­­­ˆ%c—Œ]26/6/6/v¯û^÷½îNZNZNÒÇERjEŽ‘ ¿ `Oói>º£;¤Ø9-Úe¬z½êuØÙ•ñ+ã›]?QýDõ¥5N|8ñaá Õ!«Cº¥y¦yž¸rèí¡·G Ÿ9|æð®õ×[\o±¦¹¦¹¦ùW¿8 £0Š:Q'êDÞäMÞ_ÉÕßï’$žÉLÄDô†ܨg¹Áå«gûnöÝ\éÒvÇ펋Æö5èk`ÑA¼72"#<ýéVWyÅ}R@³©5jq]ÇÇŠß›4¯ÿ­»UÂÏu-gïTad¹Ò„JÿÀ0ÉÙ*ˆ! a¨;TkÆÆô}VÏ’—¤Ü [’˜\tyëv»ƒüWÔñ\ð`ÕÍ~ïx`ÒÐÐÎÓ{„¿0aƒCß½*{Ô·ÿŠLèÏfФc º~YdÑr¦ÈØpºNú8ˆhSµ¼uáµÚáРƒ¥«“—‡®uûHÊàiÕý+ÍÕ÷Ek¸À„¦ëdð?Ý•ü$j†š0G<æ¡ÕÁ#L£ ÔG˜­ÀsV‘VãÓ/;ÐÑÓ´U)_užÍ@½7=í›ÙÅ.â®w¡ULVŸ÷–gC¶sžâ&pžù,r0ç™c"õ9ÏÚ™ÊyÖéÈËï¯;6øbîã§þuV/0­þ›qw"VÙ›o;áAUϪ‚m¾öP¨Aåh,õÇ ï óß/W…⮀ÿ3˜3mÁ[$`:·yì²Õê~©]¢àB–ú*\5sçrÕîž°€ô0ýPU`ò¿‹Iæ»°/a²ªP†€XŒGkV‘¶ãŽL}¦«*PîMÇ´ÚiûQS¥Ê[ÓxÓn;½]ô|nÈ™:gꟹwÄàˆÁáÓÍ­›[7·;¦#t„ŽiÑ[ÉwÈ}.Ÿ¨¨7õ¦ÞbY/K/K/kYeu–ÕÉÏÈÏÈÏØ™»3wg®íÛ¶W]¤‹tQÊØÊä\_ È[¸}àAEP) 3­Ò¦Jß{sïÍñÇÓû¥÷»:ò¤öI휕3ÌÐtZë.­»4>¨»Wwoë_v,ôú}h8 §áІ6´%uùÛ=;ØA€#)^¬×w\_·N;Šw¯iÒõn×»†—¥–ïð®Œ^ö'‚¼âÜË%Áa$çÑþ>ÍJNMØ_ïéñgzŒ«3´m…2JÄ4™ÌÿðU.D %Cl mä‰1¬W—Ù5#_:î03Ì1ð…yËísçD»M¾aè,«z¯gu2zlR?ýz–å×i;©JVDÀuY<Ó£:¨ŽJ_%•þoòh;¶ŒÞ”9wèà®® 9O¿áÄyÚ®ð ]O&7m+Q/Ñ*ª‹¨”û]᪂ÜS4G-XPõA¶LSТ 6žn“ñ¿ïÀú£qr¹r‘íôªF¬h~ÈÝ#mÞ’ÝlÞ5>j3x:癎÷8OÐã<=;œóôná78OK ŸÄyÊž°Ö·‚·ùúôÛÙr’©çŽQV½kÕYÙnEæ6Ršªà­êÕ8Ëyö´£9ÏKµ`ŠéÀÏ Âa 3hÑ@RÁT%Ê_óB¡¸+ À„¨@i@»ËœÉS¬Þ¶vüéÖïøšô€ð[œ§µ o<¸w‡ûÕv¡*£ݤ@œùéÇŽ€E}ª`[Á^ÿÐäÇ“M>–½){Sö¡ÄÙ‰³g÷{Ûïm¿·_]VH…Tø¥ïOy•cYaÛÙv&±­6Zm´zCÝ u7Ô-Ð+Ð+ÐÛ6lÛ°mÃ,t-t-t¥öX'Öé;~ö¹s fËl1šFÒH™©iÓþÀž){¦DžÏµÏµ¿x³çÅžûŸë¼´óRÙ9•Ñ*ÿbô‡?ª³MlÛD5©&Õ”ß,}£#fƒ2Çf6ž'3»¾v}…®¶slç•kW®­´SjÙü't”ùZqï^Î)Ï:œóèŸaŸ_ß·ôS«qOú{œ¬¸Á¤½ØFXGW~ÛÝâwAÞeå5#ˆbeYÁ<+44·˜²ìm´gõ:œŸqxôâàU6yNjVÊüª›ITHfh'˜È™þ"Ȉ&âé" £,ëöÑ xp~w_?óÒVIÛB­J³g„Ìk©_烥zË h1žÉM›2”ƒ”a 3èÂ^¨JÛ©NlMz°ô+ÑÊ•ûdQ~ ú¤Víë>³ü0³Ê šV¦U_2£{ðhw _(çI…¡m9ÏÞÕšó,‡ÈÑœgùGnä&nNÜœ¸9ß ß ß`Aà‚À†Û ·JVjV™Uf_'„ÿ¾Ôw¹`i,¥‰eë-Ö[¬·l‹Ü¹-2?7?7?wåÄ•WNÔ]§»NwÔ^›i3m©9ʬkÄ$û²mcÛÆ¶¹IîIî‰/vïÛ½oG¢akÃÖ†NÀ~·pßgnQyyÕƒzFÏЃ™13øÐ1:†Ò_eýŒŠûQÜ.SÜ«V0t-9Ÿâáóø]ÜØv}ˆœiã?q`xͽ•—I£t›¡KÚÏË«ïÐ Nd…4,ü•ûpûÀíóïäßÉ¿³ûØîc»Õ\wp])‹[ÅV±UX‹µX+õóݺ‘°¬k!–«6ªÚ¨j£½÷>Üû0^þ¼üyÑ*Ñ*Ñ*ªµUk«ÖÆ@ Ä@šA3¨,yÐ÷®¾‹üý×qס h Ü?pÿÀ}gŸ|fиá㆓RIÒð½}mø¯A8I¸—j©ªm|td¸A÷ÖŸÆ/ï{„ó»ý«L9Þܵf’˜3•-¦öø€v°‡…bô~e<ÍpcYÝ!e-R»¦´$>f¾©w\ò½ÍõÜê»±®_›þ•ûìÖµn}ʳªÅ¯y§<'¾~qÄyÈKÎ3.EDrž^áÌyzxø]ÎÓ»„_æ<­mx]ÎS'…}¾#Û>~ öÚFÃ7{ œÓ~gµv cœŠMÌÔ/©Ö•]øÍ»2ÄiŒF²µ4“­¥OdK•p¡¯‚T~çC‚$&{)½c~ãìŠYœ§Ú‡-á<Ó&âѾœ©-ÚI;~a6ÛCóah}/ïQ¡¸+ð߈‹œgvv@žíJ4p 8±Ì•\`„ _ ?œW7¦¾ÈË+ÚD˜¸ûóÏ©•8OYV¬Cߤº\zôl ù¯×ŸŸ òÞÉ-Ñ-™'ódRȯùvóíæÛ—ù-ó[æ—w/ï^Þ½c.Ç\޹´vkíÖÚí«÷AT–)\ŽIý›†ü6æ0ecØ6F¬¨1¬Æ°Ã:tèСü¨ü¨ü¨±æcÍÇšËvËvËv# ò!Ÿ/sQåO48þ¨Ú_,èÐ&¯š¼jòª¼£yGóŽv›×m^·y¨ŒÊ¨L^äE^? —¿_MæúX(±¬g®–£â|iò°9Ï”¬žØ¦?8Ÿ.ó}¼ôjÛóõ¥@Cb˜Šþ7TWŒÞ×Cù¯ÓHI%®­¶»ÂÐù«æ:U›¿×sÕUÅ;OmXbs¬ý†­u¯§ˆô^Íù™5ã#9O?®õ)øD»¡áU÷&ø??©?wº÷£1¬OJÝ5;T 6¹k¦W¨1÷·nAXÊÓbBI—àfbÑ®p†éŸ@˨öC ÊY{i‡|°;®9d!/ÊhX0}Ml¯­šãÕÖ)í½öÉï0ï[~_¤BqWà÷Íúa¦”©ìêñªo„ÅíÖ6É4?i«k­­ñøWJ9!Œ-¤EDHD´ e(ÿ£±:ÿ;” #u¤#³WçºÔÜ´cþÀùülšNxÅ7¯O šfh¸Uk\àc¼ÀA~sù¤¿UI#¼BöU~ÍêÚÕµ«O98åà”ƒ9sç4N‰I‰I‰ñâ;Åw ™‘™IWù’/ùJ}~/^àòÎ3õPõ˜3sfR.Þ†6jØèxÉñ’ã%9rå4š¸vâÚ‰ëeÎ2g™­tÕ=Ü+ÛL~‡”™Ò†M¼k!Nˆâb¦ÄL‰™’“ž“ž“îRÏ¥žK=éáäƒtøañãÐ200õéJÝ…w‰}F·.Çùä’ù‡)«šížÜýQ³ÂÚGý¥«’àƒ6ŠÁûhB J(3—°‘m«-(ïq5ã}–ïUÙ^9kRT3Oo¹Ù*-Î~qiÓØÃ–sšwÛ?½R€UÃ~‡5_ñ‘Iÿ 2£¿ù+ïq!²ýÂVN°d½¨/Yã*&ȱëüåI¤‡ü²ºš/Õâ•¶eõX>£û"^”±$bùã){'ùO«yζ«´ °‹¬¹~/Ë¥BqWà?@ž+ËуàæhžVY¦*ÎêÙ¯b³Å|RãjçÛ[á´:j¯“ýì†Ã«Ô0öÕ<š@•±öRKœ‚LÎ5⻊ !,t¥çbÙϨmG§ ¿ä¶¡Ñ|Kz•ð#±åÇÕoÝOj: à‚¨ …(ýWu h@òùf“Ùd6YZ‘ž Ï„gÁ®Á®Á®™2;dvÈöÌöÌöÓeL—1]´|µ|µ$•ue]Y×_Èó·½}ú¥õ=Œ…1)šÂ5Þ5Þ5þØÓcO=Íí™Û3×{Ô¸QãFmQ=¯z^½M¤‰¬c1IR_ßò‡<ñ훼5ykòöÄÃO<<©yR󤦑‘‘x2CU©*UUL”'Ñ­¤y‘N¾d»óf÷ M÷ñSÒ6ä|òô›“Î ìÐ:FÃ\)Væ ‘ôaú)ï7—ªp”þë„4LfŒšá[;$}rÆ“Ô[s‹Ç= \6b×à-Æãš½mÂÊõLüegT×0Æ6Ókk´ˆªc– M¿²Òýýù)ðGC²ÇUŒ's\Ãø•S#¸æ;³ü#WqÝ”Yaíº½oÖÍv#\àcÙLa(ñïà –C90¡·Ð[èM ¨œ¦kOמÒáÚÃk¯Œlÿºýk¯l›€Âiá´pJPRòÿ”3@І:”[ֿ̨1m÷@ÆáûÂîwKÎåT;93ysX—¨=JóO6™õ:"A=üÂükC¯6±1×Ö¿®y@¾KY3Á….c7¦ T%—ûâ›Æ{ÃPZG pPù®RkÁ&.eƉNœgdE¬á<µEØU/ݬÐÍ`Ë2™15’Ì üQ ü—õ½u¢NØ‚-Ø"¦dêbßž‹}üºøuñëò¶æmÍÛ:ßs¾ç|O“&/L¤¥‚¡`(BºÐýeŸßþSc0c0kÆš±fb…{c÷ÆîµììÊçäåäåœ\upU?i3É4™&5AuT‡!Ô¡þ]¨ï"ÁÃDšH’†à2Ôe¨ËдÎiÓ:¯}¿öýÚ÷áááRûk¸†kŠÉñ½ã?-úçð/à‹z¨\ZŸ¯æW^uÿ¨óù bÙ*ªÍ_Ïátj«æ*¿PÚ)¼bVh[ÄqaïA ûÛQŠR”’‘9à­KýÖ:ܲ»©î¯>¨Üœ —´£úem¿Ú)oœ’¥ró™—ÇÔ…бE¹¡ÒÖµd]I^\j\º;òÛ°Ã$Ìâ „)˜Rppp Œxò ÄÚ¿3±9Bkáí.ÞZr„4ºûÄq‰è¤ÒMfí0Ù²eùêÈ@5–âhƒC¨3$¢÷¾¡·&ZOKQ ŽWxUZI-éWç}pŽ?àÓ´mµzi^6Î*:ýùšÊáÒ§¥ ,K“¥ÑS¡Š©ð3AôJ/A)8s£8â%ûKÝøú&Õk˜Î‹Òí[ZG-ê­ò7ÍöµÉ>}íyÞkÏ63=îÕﯢ^GÉ,Ýk×*êÜ£ʌå¦û»œy´Èz—]ÁÇ-ŸG¿·C<2zK£qŸäêAoDãÞàŠ$›+ÿfü¯CŒÝbCèl©_éu¾¤Fp¥{úCÜxÍëæ¹ØÅwðƧ/Ýyt4Ýô< û Úœ¿äê|Þâ +ꢥ(ý¶ù.¾‹ïBô@tB'tÚ±~Çúë_f¼Ìx™Z)´Rh%×Í®›]7¾5|kø6Ú%Ú%Úå|ÆùŒótŽÎÑ9Ëcy,¦` ¦HA±%(ùmÞ³ø©ÅY°K°¤´AiƒÒbØîÉà“Á'ƒMºštµžãÂ]¸N¼0[˜U/ª^½Ø]lËÓ»n~ݼè%R"®ñº¼.ö|C³é—àààtšNÓinÈ ¹¡Õ3«gVÏÔÜÕÜÕÜïm¸·áÞ†ã>Œû0'q'qp@19~ttƒ¬Y[rÄU”ƒ ”¦ô8Vëç3ºø=øœ=þqßwöEÎìfe´Vs–š‡xõÇALQ ÞW—‘¶É†Ù0É».¼_x¿ðuWæ^™s»$*'êâØîÀÄãò;€-x‚Øÿǫ𽸔¬`‡i ô  •fñ5û›{½ozÔzðZ~=ó}¤÷îÂh;/ ÙZ!Š•‘s¥`1º}3ïë« »¬6íÀ'Y‚ðŠ6‰5ÆuMz1ƒé+fx´Þd½%&Ð$¨ÁX‡3©v¢ãt’â1c ©ÿŸr¤ô‰Æá:¢1*š>Ô¯­YåÖŠm3}v½I* ­ÄyöõáÉ+^…÷¨Uw®ÝãµKãC«ºR9Þ`Hçiá•9O]Èyz@ø™ ¹Ÿôë;¤fÇÇÎÇ•ýeœ}•ìLèÆ¦ÒpÌF IUòDºÿ,ìa]Ò@6¤ÀÇi†~zsžQ7Â󌊣‡ <]_Êô)pAF âI…B þ4ȳ¦ŒÀŒ`ŽÌ‘Iç¾NmœÚ8µÙœ°9asBA—‚.]öoÙ¿eÿ–Úk¬ýQ’çæÔœšã ®|‰ÅøöC9åŸz†`q⤲ºšu5uÝö;Ø/æÑ±sÇÎmj¦f¦ #:2;&0}¾ƒ7«5¨ ª‚ª ÑHLdÙDv5ñjâÕÄžk{®í)ñ±xÏâaØ(&Ä÷Žÿ´¸ç£Ïi5ÎÑz¼Æg½|ùñÀçTpfÏÖ–ñJ|µnµ«Ê”²„‰ì–tUMCO1¸_AܦÃt¸´}iûÒ6 *Tv‰s‰sñäûÈï¶û‰N'Z¨Cz¤UºPöXöPpÆ,A ôѳ  Õ/êú·k(à9ÜŸQv­õ½®//ÜßöL÷ÝcØ` œúZ9•ߨå¤þDé¾è¿KcÑuÿá;W2XÃåp»1PVN(O™¥9¼ TŠÝJÊñÞÆË×ÖlÆÃÑP£Eë^º¶.Ÿÿ2¦Ó+Ônëæ4Ki9õG*WASX Ô¡ò°+ðïQ‚RpL’5ŒPŽnâ†-*VÁ­ÄÒß"U×P¦É^PÇ´ 9ö·²Â*.U>’v¹Z¡OP³ygOÖòð¡øàÒs•ß·ï^4 J®RÓ:^ïá¢Üµæ^™KV°U{ s_b×MuœÒ]¡wɶÒQ|YÐ5Ì¢óäƒ<èB *Pƒ dÿØ&_ *­'˜òw¨ƒÙjSTšËºôìÜœÙõELiò"÷ɹ·Þ±ñÎW`;&¢ 7)]È«á5Þã³B þ4£Å’É<ÌüÒ÷¥ïKß³…l![x.î\ܹ¸¨ÃQ‡£§nHݺÁ¼¼yyóòÓ·Nß:}kûôöéíÓù ~‚Ÿ@Ò†×x×ø„OøôM³¿‹O-šÌc1ã-Þò^؃=Å • •_ŽMRNR^ò(Ù#Ùc‰¾±š±šQ.ö`g\›kcÌ`³oúÍÎÃ<Ì+YU²ªdÕ T£Â„ *Lø¸öãÚk   PPâ)žâq7pC1!~ È>³™tW,ûí¬Uh;‘?ž¥Pý]û±½/r>¥‹Ï»*ôÝÊIqÙt·«·¯PåQžå±<–'V´kÚ®i»¦ç=Ï{ž÷\¢²De‰Š²•²•²õ¡>Ô[±[¿»èöÿF¨ #±VÔK¬8š:»UÇNüm–y䨒« ×BtkäT§BtG¡ÝÔ'ÿ^á–㬎¨Íè4iáŽâ«0AëiÆýµOGÍïÙ¡V¥» vÄÞK^¸Ñ»ÙòÓë¶võÖá<³á„<Î?EFÞîd*qû°ñt“L~å·ø‘ ÎRu¨@ÆÓ{ª(V‡¯èæU3‡ót§ð´âå§ö~õ1îEPÛê–s+œ’„¢P8ÈliY—¥ºÑ0¡ªšIë=•£Úžã<Ñ!Äžó´ ðNœ§T -å<åS؈Sžî¢ß6ºþ6ëž_ÝÏ^ÌFgÖ™’I½àñ%ÉÎßn‰g;˜@¨ª0í¡ìÞÚöméáÄs!+ùú´Îáî;c& ó”öѲýòÕ`? æ7 ñ8“e²L±BW¦+Ó•MŽ˜19"‹gñ,žÚ7µoj_///v”e)³d–Ìò³à[}krÖw–ÇòØMlÇvjÖÓ²§e³9ssææ4[{bí‰uSÔ»©wS÷‚=ìQp¾åÍ EQI¼„ B!öEì‹Ø µj'Ô®v ÚjÄ ›Æ¦±iß½F¡€(ÿ«Õì–¢­ñfágã¢3Ðÿ¼­˜³©Ô–>áƒ5,Õ{¨&Kí¿eŸ° 1ˆALiTiTi”²¡²¡²a³Òf¥ÍJ?7üÜðsÃä#ÉG’|¾õùÖç[dGvd‡îèŽîßýH¦à,â>¶¡:¡ *_¹w/B£8ªô«¤4‹m¯uÖvœá8è@ªP‚ ô—sW39~b” ”yS")3=ZD…¥+¸3=´ÄB«GFµ+Ïœ;(³±V|ÐüiÕfëÖÐl˜õÉ öÊO•æRsÙ·O›K;eñ¦Ëçm¯Zè§—?­¼Üq†Õ-½Š¥¹5@)ÅßR,œ?DYåà»ÆìÈ­tWç×kØTÊП>þnG—GÅNŸÜ‹Õ…UK¥¸ N뤷*¸}½ÖÓ¦TLp³Ø¸¤méþž×Ç\ÚL®8”i:ýðàpÇ«cÎtò,^soTJXžÍݪŒH @n¸U©ýÖ"p¯îÁ«÷þÛÓ*´›Vÿ ãQã!è€ì,ÝÉóOl{At<"£T:Sú«Çd(:¢?ÈÕøHÜÃ%Üï¿´U´C19(£ßÍknl},á¢r±=ÐÕa%m-Äxþ:D#Q„¢Òz¥õJëÑÚC{^¿(~QþpßΣwøDy¿w¨n9N¦#¸õµõ视HÃäNîäŽ^è…^jjjâ©ãAãƒÆõzêõÔë‰:¨ƒ:bHÍWi5¾cÑ1Úˆ×bE—+nï*û•?µ*Ø›ßHÛ>bý摵[¬@=8BŸîÑPœû“ïá_ô—e¼Úë1-hÕÂLIW¾¹“¥uo½Žó— -i²èùăVƒNržÖ6¼ç©ËÃ28ϤˆroÊ]½âî¸îußô ï7F}øTÕQ¥V‹b/M¬zé˜Öº—~ÉÆ kw5P™§”,ôbÖƒ÷NFˆ‘~æ;¤óSà+ÈY…©9Þa.5Æ+,Öz§~P¹qÖ¼Çzøqž\úˆóôõáï¶~©ÍP–ÃìÈM0`©;ò°½ 5(IŠ”\.Lç©?³?ppP0Ÿ˜î~óB㘤>oÊ5ÐU^-ÝB <ÀTÅœø ÷­! ² †bMW¿®~]ýN '…“ByyùÂ] w-Ü¥ûP÷¡îCéªô€À Npú%£ü7s˜Ã\rž„\ ¹rõLâ™Ä3‰s[Îm9·%š¡š‘>链äÍÿ­=‘‚°LX&,ƒ>ô¡ß:µujëÔË—=.{Ì~;ûíl)n„ÞÐzƒ¦hЦ aÿ‰ ØÓª.–8›§êßyÙyÔ†ž×‹ßLøÐ/‘óè>íƒý]V:Ha… Åý— ~Ô$ËDT@T@TÀéèÓѧ£G:t)¥Š@¢…ЍˆŠ?Ô³‹IË• €Ulg’Z.äýöc‡˜rž~)ÂöB•˜S}ËØšS°]ákTø~Xž³«ÑS8Ìr)æ— ku·M78°¦rÔ^ª¯„8 ÜÊyzQD#ÎS4BŸsžö(|Ù›àç‚^. oä^»‘àôÚx·|ÖÙ†u^>º'!ð0çiÉí8OW>í¦¿]Ã2·™½Lœàkè}Cრü/h…º°`j4 ·ÅŠ•,ÂÚ=†óŒÈˆÀ’mI/Bû\þ´©}¿YÆ!å‹5*à) ”9Ó&¼,›¿Pš•!û"·G0íÙI¦Kµä›h To¨l2tŠ÷­êý¯ÎÙÞ1çiÃ=8O^ËyÚÖð¨WÍâÎÕœ›;DÅ5Ö¦«‰µö'ù„H¶–&ÓH2ÅF©JÊ¡ïÿ†¦¨ s6‘n“4¯Ç5í7¾ÞHÎ3nElá<ãPDÒD6`¬‹ä,ÄBé2¡êÁR!PÿäÕwFŒ˜è3-Ö4¾ÕøVã[qIqIqI 4Ž)ˆ)ˆ)pXå°Êa•ô{±^¬£ñ. oS}W†2”™13fÆbþÔ*gªœ©r&¡{B÷„îÇgŸu|–ã]Ç»Ž’{0ÓeºL÷›{Š:¨ƒ:òK>1>1>1—]>vùX¤w¤w¤·ØFp…€ÿt` ©]Y¨c¬“NÌý}‘zÝd¼Å¤æýc9næãíᄂ†ÄÿªPÜ%ˆ¾q—q—á _ø–W~\ùq;ãvÆíŒËz—õ.ë]W5^Õx8ÀÕbµX­ï&_ÝïGW¸AbÑ|ØT~¶úº‰½§qž16"úaôžõþæ÷ ´%ùJúØø_«¢Â!Z²õ  UØÁº¬%G7´D©á"ÜÂÂÆ­«YšLÝ4þ|›A/;Ç= ÌyÆíˆãœ§Ü Äy†~D“çwúº¶êt䳿™U—ÚtÑûðÕ¼¨I…Ø);,3¤Ab÷×:­K†'®ÞXlt*(¸yI­„>Á—Ú¯idjóFúõ74ê “®Âëý{„¨jkB JB6“FŠÕ}oµxW¥çi^ὋVÇ?öªÈ÷T§àŠ®9ÎLI—Þ£\’[èßüÊ¿~KPF}8˜mb {ù†ú}ttÕÚŒ=Óoh½»ï}áÿšóô9å8Oív„óô.áéöï=à¿dTAŸáu¡ûJ+P%ÿ+IÞÍT¨¬`í/Ó?¢À –x_–¹|®¶¡jÍëѱ†ÊóAiOÃ>rPgÐuçæ—V¸ ¨€„f,’ÂbõM@^ÕžŒÉ˜ÌbY,“bª/¯¾¼úòØF±bÞ|zóéÍû‡îºhà 4\ u°™mf›1 ³0KNο=ñUX…UäAäA/轘tzÒéI§/¾|øòáÐÏ¡ŸC?#È`cØ6о!ñ5Xƒ5bìœÌ]æ.sŸÆ§ñi<'>'>'¾më¶­Û¶Ï è=½§÷ß¿.è3E‹©¹©v¢†Ã•âàUÞ%œOž=`çÑš>ÂÊâö †J튻OÁSðËm?´ýÐöCÁ¦‚M›nZ¸iá&ÕDÕDÕD‰fëGõ?kŠ0‡ ªÀÕ`½ÍYc-[mç§ÒwD( <¹aX“nÚž¶íÚ°‡‘0›í¤y¿O4åÜ`ÄŠ^¤‚ÌŠVàéW- 0-ÛÔ9dÙbGì¤ žE|D™à7œ§æ‡½á<%.¬çã"–>˜¿»‹ß¨ù·‡Žl2©ÊG˃å—õƒó©5Ù òG-ØÂµ` }6’®‘t¸¼pé°zn¾œg8FŒ+™™äòövòö·CÌè×Ó4Sæ°1tëKЪ"ï{¼+KJ ‰Ïz¿ñíí·ïîÒòÝR\#1*¤/çé7"šL»ê¯ßP:‡dç˜ ¹ÂzÐøƒ©…ÔþÅMDíQŠ%Â<¶‡æË71[©?YséÜ·ƒ¸Þ{8hoOÿIœ§w ÏyRvhmÎÓ_DT½Òpï÷rˆKÇÎ^å 4Î)ÇÉ÷Àö35ª†;Ø )æW'Wÿa±Q2uF*¢Ð 5Û—6`óšóT¯°y|JÚ•ð¹q/gvh@™ä«´Œjã ‚Ñ 5þòÈ~?äUm‘VaÛÄ$\‹Zµ,j-5\j¸Ô0Ï!Ï!Ïá¸Îqã:íF·Ýn´$Ÿ"zPê!·Ê}sŠ#»Ì.³ËbÙí–Û-·[©7Ro¤ÞØg»ÏvŸ­±†±†±Ú¡ÚÑsz^–÷÷›À|€dHÒ¾§}OûÞ¶òÛÊo+Ÿô4éiÒÓ*U«”ªPª¢êŸ䉭ü×56)]‘EåMôhçÂ?Oa>û9Ÿœ3àÌî…= ›¾‡t I»q 1€Ò#=ÒSê¢ÔE©Ë ¯^3¼ÎÝ;wïܽ÷îÞ[løƒf¡<4˜3mÁGXÂÚAU;ØWëÄyV‡ÈXÎ3&GDL~:pRýD±¹ìˆ0ŸiC*ÿF¹‘'X<ˆð–E}è…|6– È }J#›÷‰ê VvStääƒaaœ§?Œ0å<•…Esžº1ìÁ¿Ýj¾ESZû5lpß6¼¼îWüÄtŽüO³È»1½PGúƒœ½œœqÑ4‘*b›–ƒÚK¥óÙW¼ëÊ?¥Ì«ÃyZËpÛ½•§8xõ>ÚtUÐf¨nc;Ê+dßäÔSlÅ8x²æŽ™@C©^ù'sõ‘·³Å`$<ðq$û$¼fGÌî×чó´:áΜ§‰H[ßû®êjå…Â6žREò#m¬ù•Þþ[ȯ«•` ª†ûˆ¦ÇñÅ–°‡y©nèúâQ;ZÎ+ºÇsžêv€ó”GaaœgÔp9cµviïŠ}Z¶8WÅ‘õ¢Ý(–.Ö‡TY!«E­~ó׿šlÿz&ÚEî8!–÷øDï÷rãÓ,Â+ò{I#CÍzUò(gïƒ Ðƒ2ËaæÔè'ü2|WßU &c2&­Tš5?j~œTiR¥I•²×d¯É^“º-u[ê6ÿ&þMü›|5uÖÐ*“|Mh~#y-ħk…Vh…c8†c²Á²Á²ÁkBÖ„¬ 93þÌø3ã{¼ëñ®Ç;é)ÚPj#R+~ RjBMħ0-0-0-H¾—|/ùÞá&‡›n¢5DkˆÖ‰Kg Æ`ŒBœ>L‚;jRî–…I%$ùtk­ÂùÔ?ðÒÉËìH…¯O›!’HÝÆ;ÄýÔ#&@€À*²Š¬¢ÈkWÉ®’]¥D¯D¯D¯ý}÷÷Ýß×8×8×8ë±ë©)5¥7p„Є…ÓQ)l’\]Û̼¤yÊΰ¼ 3%²ÙþúS—µ«Î´h>£à‹«ØŒ2¾y›´Ì¡ŽD„Ò òu0«æµJ[{ø»/´óϺ´âpU%g®…èržÞ‘óÔ¥a™œ§÷ Ï»2hó„þ-&6[ßÄp‡î3uǯ^àvŠ–S*uE†T¥,¥cúÿJ—\ ËefTO,×uµO7œöÖêÈóÁáE~ Uƒ“9O?á\»Ó™êw¤öª4w¿ÈÌ?¿Ñ•W¿Ê#cõežA?ØÁú_ª~–@Û.hŠÊìs%/hÂV3¢ü÷6\Ìyúш %ÏÞ‡˜Ý­°s‘o«Š¯MÛ—“Ò$Q,5-Sdÿä‘ûR‡êïäÎ,&°­´@¾a“îÕ[š¾<5ím‹ƒNÍ nÈyÊþ°œ§¬ëÌyòÛÐü¤ö‹ªt™ÚܳÖ ¨C 2Y+VÖÃ:Ð<”ÝûhóΧ­öÝÌùdíͯ×÷žËbÈ ïp Ð ­P ¦?éˆYÀHA RÄŠ€ë×®Ÿµ?kÖ~‚0A˜ M{jFͨÙWËÙ V‘VC²ˆ[µ3j¥­výà– ýS9ÏÚ™šÿnul¯ªú/uæ«’#‘:!í+«ö~jxÁŸ- hùžÕΩŒ‘¼ªc€s‡Ô¬¥‘ÝfqžärŽóÔÙaœ§L «ÏyÚð±çcâû6:gÔj©ÛAÝê«¥° )aëDI¤‚†pB™+ËïW©0€gºevÄÁï:Nwöç<­Ox­â.§ú×ýhprÊ0íF‰U-MjJ©°–Ô®l˜þ!Ðø—òÇv0%’¶1*Ÿ”ŽÕñ²W2LT PR$oWv“¹’3BÐ e¡ÕßÚ¹ÁŸ¹óaË")”³µ]½ –7?ÕOryöùRü©aùœ§‡mîÔÛuV%é$e3S*;£ø«Ã‘奴ªÂ˜õ£LR'5œÅHù†mšºXYMKv_\·«=ç©%aï8OæÌyªEØ\ÎCºìÕ˜RÎkPÓí52Ì¿ºgV¶á-ëC¤.U‰j·:T $k.Ô')~cÊ|ßì»8ÏX1—óŒ•+g¸„6”¶¬d‰Ë[˜ãÛ ûSà·  UH:)Ò(MžJ¡ý¶öÛÚo;>éø¤ã“ò·äoÉß²`æ‚™ f28d ­ê‚¡`(~ýaøG]hdA&}x;¢#:ê´Õi«Óvûýí÷·ßÏ1 c@‹ A-$V=*¢"*ú‡ß‚µ¦ÖÔ•Q•ûNé;¥ï”ü¢ü¢ü¢Èã‘Ç#K-;¢#:Jl? üœ©2mš XL©÷ÔÆœOí=ðç“–÷rûH¸i—ÚoU6+¥J<@$ºÿ|Ãdèƒ>e “Õ—¨/Q_²»Êî*»«d¦f¦f¦Ö|\óqÍÇ8Š£8*훼€Ô_@úTw†ìT,•FíŽÏñónÎ_g‰¬ÿ©ñÉqCy½qUžy‹¶mÁ‚õ¤>øŒ*ÓÊQš|oågh+©: ÛÝÙ¸úáóÑ1]úâ<5*,Žó´áU8OŸÁ8O1ίˆÑí3!À½ÝܪÊ{j婚µöd3i4öa*¼$¾Ùÿ`ûÕîAhªŒh2nA ¦b£Çlõ’ó´”ðÙœ§Ô Óɳ\“ÙkzyG­•4MØL»Èã+»ìߥ¾Ëù[³>”AÒ‡Ù¦ŠÁ9zAu{µ ‹˜4Ô2ßÿQÿl£·•L­«KI³™'=Anc|¾Èÿn+Oø8€Ô± QÖ/týÔë_½Ñ­ïΓG†.䯶.Œš¶æî¨ ;²“Lê*Ü)¿KÈÛ›G`F0#fČĊ†– -Zî_¾ùþå~~~«õWë¯Ö¯èTÑ©¢¤> Ž‚£àˆj¨†jrsíŸ[7š¢)šR>åS>Üáw?W?W?× ×.\»pm®É\“¹&t‘.ÒEr$GrŸúŸ5´ÑPJRTá¤ÈI‘“"Ï­8·âÜ ï¡ÞC½‡BºÐ¥Ù4›f;î= üÍ2ÂXÊ o±böÖ¯ê4âÅÑ…>k¹Ú$½þÓ‰Z×Ý´bnyS­uPƒZ‹Ó_|:207æÆÜ 5¨µyØæa›‡Ùg²ÏdŸY–³,gYŽŠ®Š®J™)éHÿ)¥ ,¡+k(Ô&‰8o~ƒ!]?sž™YŸól§(½Þ×<>Ø'°Yô„Ì…+ì”ï@¸Ž†Z‹ac:ͬ>ðrú¦uýŽsžV5¼&ç)ËÃêqžò&,‚ó´ áJÉ1K‚ºî °õÚ]µ™ª±2zÈ÷#lfñ´ˆ‘'$¯ú?Í*§ˆÐ)ê€$GØ¥ÿ@g¶Úá³1ëöô^X:$¥X%Î3nGœZÛh¸µ‡•$3ît5P_æÝ_õYøE¿BmTÆc>ß P3=7zmJÏuIÓõê~[ñèÃÀàä kì=«íŸ}Ó]+t±÷ÕZ›¿êA“µ§.p€ôþäQý‡V< £Ñuéá ³§ëdºc×ÄŠžZœ§- Êyʦ°F9ÂJ¥ËÊÇk»«ve†´÷h35Á±oâYä· Ó1 …lvƒ¶Ë7QÚ,«ÅBC{vWcÍ%ڜؿ/çéÉÄyRfh}ÎÓÂO¼ÝtdÖàÞsW Žvlkf6Bç+úYº°’™03Z‰gW6N¯ø†óÔþa{yn&"Î2+«£L¥œ’¯`AÃÈ[PŠ„¯3+ðAÞØ40@PÔ5±Âqšã4ÇiÛ¶mÛ¶m[Þ§¼OyŸöOÝ?uÿÔz•ëU®'¹ZQoêM½ñPæÔ!2¦ÿC`CÙP&©Â•c+ÇVŽ=\|¸øpqÂÔ„© S«ï¯¾¿ú~‘ž¥±4–ö¼ì`‡T¤"•ªRUªºQØ(lÎ):STÓ¢¦EM é‰f³Ùl¶"[êO A›æ‘Dê7rœ+U=ÆùäyV–Ö¸¹çÅ#¯÷œV{ˆÉö e‰…ë“5.ÿD$Ú üáÜÅ]ÜÅ+¼Â«9qsâæÄ]vqØÅaÝ'vŸØ}¢Ô¼%kÉZþx¬íÿ²š‚EUØ ‚_hÛINMJÓ‡ŒáG3ÆG,˜})¨Cã¯RÆTªmZ«Ü‹Eƒ›¸¿˜´¹a¿gœ§õ ÀyêÁ°Çœ§ ŸWêœh”´xaj—^û4™_é³ú•²ŽòýÐ @dõ¯ ³/ô£‹œúÎ0­2n ‡ñF_M?š58§dΩÔàᜧÎ{èÓ¯µ•C§õæLn’{Æ_a,£T‡2Ô AvH˜Ãʉ´›kÞS§$¯Êê螦œ“¶aÁ´—õ#§Üʶ·*Xï8“¶¥u—œçtÙeåªÈþîƒÊwÓê¨"½5a;NK0 ~¨_öÊ¿C¼(Ђ[H’=âX·5‹9ÏPŠð(ÉO˜|ó¹Ç¡MG«kW2®%]*£hÜø¥$|ÿ€?Á~0uš…òML¦èÐ0Öµo׺ûŸúìï0óôÎáç8OšªÊyæíH÷{-w·ñ0îe­z[õÊk‡¨†É÷°[;Zæ9¨83µVh«ÒÕÉE!ÙQígT“Ô5á{KǞ¥\$|HIJÌd¡g¡g¡·jÚªi«¦åëäëä뜨w¢Þ‰Úr:ät¸öU7ƒØ 2·Ò_‘Õ¿c^DÊ,~—ŸážMx=áõ„×Ü/¸_pʈʈÊÀ&lÂ&¼Å[¼ÅP ÅÐ`7¢Fe®˜Æ‘ƑƑW\ypåᛇo¾iÙײ¯e_hA Z_yº+ð“ÎÐ9ä…÷byàÇZ¨|WœdÐZñ“ Ÿú%|2®jŸ9žö¶¾fRòAƒæRåŸn”âY<‹‡ l`ã`ï`ï`?+~Vü¬š4hZØ[Ø[ØÃÎpSIÿLC1cZRFÔX³EåwFÏx1hï–n¾ì´íšc½"œ^X?Ö[8G;èk¥×ºqƒT8O7ßÇyêãpÎ37EVÿþظ!î‡Ì<ÖaZ[õúQÖ½ÙFTUþeZ‚¥#]Q]ªRùÝÄvÿ;ä©“˜ÕËaã»,¬1ŠótÍð˜’f •‚cŸ¬ˆ«˜ï|¾R¥ W¤öy̚ʉþ,åïÞól/S!ÉϾ–jåÎ7R¶åù¬ã<Å'ÌóÔraûž·9xqP=ÏA £,bæóà×pžv.|DIóÄ!ë8O»>óœÞ†Š}u›¤´ƒ«Œ·¬X¼zÂÙ~[‹6OèܯIé©Iý§÷®Ñ¨RW±P@¯)ø' w¸Ã"(‚"Ä ¿§~Oýž^t¿è~Ñ}‚Ò¥ eÌ7é&Ý”<Ï~¶Ø< †+<á;•òJM‹Ûý¶+ $Î3\"]ŠOÆ_ V{kuxÉàÝœgØDØqžR+̈óÔag‹ÆO³aå˜Ñ­:6Ó«ñÞìʯHi«@µÉŸÊRÀH Êß?Êò¬ §0Ù#V“<„LÑâ]n“¦µ•qžnÏk¦Õ¯–±{YT·8­Sêó•J™ -ÁSRG&$YúŸÔw%9›· ªÀH8ÂΔ}œšZÕ¨fõ`óÞ"ÿ[¥3’¶†Vå<åiX१±~ººlsØn,ª²jT›íP­Úúg­ÆÚqžÒ=Ìšó”ea Þu8>aÈõzî¨}“ΠþÒeËh*zÃv_½‘o ò#|³ÑЕ4©]Tš™»lmwK®œü.ôçéG"¬våNÚÐVSEUÉKÐ"ØšNq 㿳ù§V†:CýKwhÎË7¬›TÅÛ°(æè¨š-+ð gCt8OYº–ótŠŠ*Ü7½·÷Ö:‹U«WÞ_…YÝðà 1gë¿›í7ª–ÃLiB8’Ò—¨'…âþ€é1=&9Î)ÏVž­<;¸zpõa72fdÌÈòZ–¶,-´u«­­¶ê·­åYËS%Mh%´¢QÒÅF0ú¹þˆ*x]ÔE]‘ Nè%ôz- Y²,$/9/9/Ùç•Ï+Ÿ2¶¨4€üýò,l¶[à Oxvm×µ]×vö]Øwaßø¡ã‡Ž/Ë¥S‡êP¤ (€”ܸau }ƒÉŸfoÒwx‘êY?çS*ø q­ïîÐWš}XÚòS,Îâ¤-A JÄŠr-ʵ(×bÇÃwXwJ#UT€tmú™h•kugÛ®¡¾KcÇ„ ã<ãpĦù¹Cê»J*5;Át¨ª¡ââÅÿòjYÚ¡ªp½¤£b…g±ËM«/oƵ Ìå<©4Ô‹óT¯°UÊmTí›h;Ì¬ŽŽä…ÌÞ²ÖäJ¡dùbMÕu6úT’ƒ7éRÄyfßHÕ’´D¥:œ§w q`á åö¬_÷Õž+õ°™©PuÂt´—îçÛTßOc-zØ\Š&m$"|Ù€ÐÑM÷qžááÇyrrè©+*[Lúg>-_Q}†ô’§’-¶ÿò‡ëXí©>ÊA¤ TXÇNÐ"ù†Ubª—>skûœg„ŒJKٷٻéÖƒWöqytgS\uýÚ{õºFE {¤gŠ}˜ŽNI1WAþøS@ž>R—tI‰H,‹)ò)çSÎ'(|~øü:§’'Žo3b׈]UQõ¸À…•GUT…Ú?pçÚІ¶¬F©ØF©*ÛHï~¢ñ÷ß>ðO Û¶-lsòsòsòצ¬MY›¢¤¤$QJI¼ªßf"è¿¢÷ðfÄ Ãу¶´Ukboš¿Ãî¹FÉœgiŽP¾vðh›æË|CÖ5¯îØÖZ§ü‘¯zh8#ÙzІ?¼Ê6ß´¥SîÞkQÆ¿ëÝ8±’fÉΤf!ŸŠgÆOv hoR|hÓÎgܨò©=X+ò†´¡*ù½ÿ¨B¹LºHI9Ô£, ºÇT÷*¶™ï¼Žïò¤T+¡Bð&ÎÓk†ŸÎm¹ªnÏޖꆖZ’J*[+L`eKÿ D ¹0ŽÅ’¤Žk¼U“)M;á¿¥áüÏùñÇ-å¾IËBu9OwO½ÛtWmßå]'»½¨ò•1¤Ôº>R‘ŠÔ‚4ýÏ *ð·B J_«š±f¬j ê›W1¯báçÓß§¿MÅ¥³—ÎŽ, êÔßþ4ÅP ú™Â NeÔ“?¤¤Q:ÐNùàòÁ僷ôÙÒgKŸì^Ù½²{µmÚ¶i[)ïŠPN('”û›në!BŠPª§TO©Þ¼'óžÌ{’ãŸãŸãßüXóc͉Kì:»Î®+P`¼á*uSÔô”Sßî“Õ{ý§Yã›ö ã|–R@ÕÅC<¸Ô@u¡¼’[M/`núýå÷Ù¢ ~ —Ê2ÎW™¯2_åìü³óÏÎïü¡ó‡ÎRjbêD¨ô¡ÿ‡m¨?Öa-DZÆîå]uçÉÏyÆÔˆAÅÓ“j†²ì#Öc=ÖµÚÙjgë#{<÷x®®5!`BÀ€ÖöÖöêWɈŒ Œ§xŠcЀÆ?¸™7…)LÙt6M+üMüMüM.Ü»pï½–3,gXÊRd)²)P5yÈû«oŠVÒJZ)êF0‚v²l';nÜþ¸½í<Ûy¶’ƒ(í¥½´WᦀÚe^ª*áBË}˜µ¯»VÑš û5å|ú3¿U±õº´mâ+‰Î ÜÁF¬@û/iÒPÐeºL—á/xU®\9øXб cA‡;v4_`¾À|H ɈSL$ñ õÿò«Ä<ÐBèÊ6Ro¦E«¾$r/óVÿÞŸ] ‚˜‡’M ;T¾\S¥ÊùÉQ‹ëwíÁyJIX8ç©gžñ¹ªÃ2ášP޲hY#SáÿÅÞùËEY^ ]Fµ°Ÿ¢ÈÛàG8D¥õèU»3ç©óÂUЇZìÍyz^„Õ¦¦c¶ Uï¦ ‹”Æß€K}þ2œWž^° &ôesh²XaÝÇ(K{éŽ^¯zÎâ<µ|Xhi“Ä•!“9OQ?uÜÒ–Ýzתl«§/me1CМ2¨Ç— µÒMüÅoZ®oRE"ÙzJæjãUjÈ[;ëIljœ§ú…%pžÖ)¼åÉ7óëuJW[ 2RVò¨?r¨31,ùéf®ÄEÆEÆE¦|Lù˜ò±ª[U·ªn¢O<³d–ÌRþ„á¯ëÇú±~âÊ_eN•9Uædºeºeºí°Üa¹ÃRµ¹jsÕæOèÀ£€莪°…F(fê46çÞ q^ƒyÅI:ýçð’© ?9ß׃˦±F$¹7!æ 臘À„%²D&yïùó;æwìâÛ‹o/¾¨2Qe¢ŠpP8(¤Ctˆa:¦cºB”ä „Nh,¹»ô'U4$qsÈÐõ¿Øbe~Ëœÿ= ¤ÒË•e¦Kt:<š³¯k@çRßÄ€œ§G„ç<Ü+¾Ž”ÞHpdþ4ÍP_õ©Í2÷Ö‡2è+¿ÆéKº7|ÈyÚùðCÅâ;[ÆyFˆ.ËÇ„6Ûªl c’*¨°Ö$—K–ûß²ØÈ;&µB]XZ¬-u‘oV¹k•š¶oøÑ9ƒrž|;´€óÇ0•WGŸ ~5­Ç¬Úöh*×% ŒÑÕ¾d\þëèEOîÙ WVÌ‘§X=å˜oiƒýœgtˆèÏÕŠCì Mw{úµªh`Ò®ÜpiM‹£6_2üœ)„ä¥B@pQœªëÊ-Zã·FmÓЋ½/ö¾‘=´dhÉÐÃ’|ª15¦_øÂ÷N»£ÀßÑ€Èbe±²Ø™ófΛ¹âìÖ³[Ïïþ¤û“n™¸û€°XX,Ìüûû!/™pÄâD݉ºuOß<}óôÍ‘GG)Å a.æb®”1ý¯°skBšÒÜÑ„&4›oh¾¡ù†swÏÝ=ww~àüÀùÒ°™“9™ÿ¤Ž¸ ü ZÃfR9}àz¸^Ÿíõ9Ÿì3`6/žbç“’:ßww›OÚ³Tz+ÅB à ÌùQ‡„‚(ˆ‚à W¸jÐþ ýaýËõ/׿ÌÒÈÒÈÒhbßľ‰½´È)÷ |ÑúîG¨J~–°üRó£õÉ“EªÓLÜË].¹]¯üª´]ÒŠP¥b„¶Áù;¸8ôP³Ìššæ’{Ëe¦Ô@Ú(ÿ«:Bm‘ –•Z E¬ÉÊØÈAÍësžî~ø³ù©èজ§/?íÿᆅ(ÂH ÜäŒ{ØÊÿ —ñíÈ[úÃÉ›h0”²×-©bc¸,×uUËž&œg ‰YZ#qkÈlÎÓö†/Üž=i£çS£´ò5Ô¥ -[AET9X‰ÿõýüÈõÆêÓž²€rÏ—õ»Z·.~“˜’ò¹qBëà%·’ìBÑaP£¥[Lo¿Pܪü+Šà'…&4¿¼—븒͕Í`RT­öµ¼j J•8êTF¼A¼A¼}eûÊöeÉwD[濤HqùÂfÑ,š%– ¦L7˜¾µxkñÖâS'N8u¢¦vMíšÚ’bjÁ,˜Å7tëäK¾ä‹«¸Š«Îsç:ÏMóMóMó=úüèó£Ï³³³ÅTÈ@2þ»» l`ƒ$”­ð§Ïž>{úìÐÆCmŒÆhŒÆÔ“zRO…Ô)PWXÁ QfÛÛ|°ó×Mü}ôZŸ`Î'7às>cÈ«LZhuW{%.Åtpä h@ƒ1Æw×A®ƒ\å¿Ë—ÿnmÓµM×6U¾®|]ù:ò‘|ôAôQìƒø ZP‡bš WØ#Ú%V/î|©©ç­"Z—ŒKZj|iì¦ýN$èÖT·'Àš¢È›ÄöÂ(¶ž¦‰åò#µ«dìíýÎˈóôe៊3dÁ«‹&> 91ôE'µê’3la=ZFµp@ªÑþØÇÅOÛ1m…uì(-+t-5¯©ÌYU)r`ójœ'ݵ-=—¨âÈy†FD›+Ûb× ˜ÚN·ÁFù.Ù:KZ_ýÊÿÂ$Ÿ×Öï1]Ðv¯t#Ô\[²Å´ÿ^®‘x#d;ç–m—U Óhf.]êÇæÓhœÄ}x- $+‘•ÈJððЊû 6ˆ bƒPåPÎ~“ý&ûMŽŽŽ{Tö¨ìQÑY©³Rg¥Ôô&nâæ7$âìÅ^ìEuTGueeeƒn ܸ<,xXð0À;À;@Ê(ÏV³ÕlõW×þY¨/1îÀE\ÄÅ™ÕfV›Y-Ï9Ï9ϹuRë¤ÖIÒ϶¥¶ÔV1§(ƒ3ŒP ˆ"3ôÜó­êöâ|ªúÀRç‰cûW¹ó8¼´ËõJåÇiÍ—DÙªàê8UQU%ÎWÀ”óSÎO9_p¡àBÁ¿M~›ü$¥ŠÂ)œÂâ£À¯@nq¥ë4DX¯ù@-_iWÞ¤ÕÎ=/ñœ”’°Éœg¬Ž˜¶ýá„‘mÊ(cÈÇ7ARà©ñ;=- £Äí Ó»4ä<½oø-Η„LùwbïÐuýÃ[U«"eôdö´/Ié_xâÿ,Ny×%È 0ešŽ»òMº¨»¡Ò•û w…ûærž®¾‹ßLÖ íT|616dãÜ[CF¹k˜©ʤCsYÁ–.£*¡‚Ô…òÿ`ƒÿ€c¢‡…[bEì¹qCZûsž~:†ó“Ð×ùçV{÷Ò(Gõ•£q sÑ…æ’ã¿[Å'ñ×%¹lSdAd!2`+++ï ß¾/<÷NîÜ;;9v*Ë àÊ\YYºÂmæÇƒ.t¡K;hí+ÚÅ´‹isî̹3çÎ,m¿´ýÒ2rØ÷x÷R §o :Ћe±L ^os½Íõ6×O·?Ýþtû˜Ä˜Ä˜DÝzºõtë‘d¡ÿsá OxІ?Y¡¬PV¸ëÙ®g»žeoÈÞ½¡òˆÊ#*fŸ7y“·Bô(CeèA›†à$Õaì€&''s>ÍË×ÿÓâñ^}'~¨6vzŸ 5-ç–—r(²,RæÅûƒ@´š_Á\A ´@ ³`³`³àNt8Ñ!>,>,>ÌÊÆÊÆÊF¤}$'r"§¿:lEïò®& Ô ib¹ÎAû•†ßN?ê9øpqýSã‚[sžÖ>¼êÐyÞœ[Êw`ÞË ¢æÐ¬Y«&õ¬ÆyÚºð‘%•Cj½èyİI'×u•üÄ–2´(áè†ZÒÅÊ™ý¸4¾p9;á¦0{Z…bu‰ñîrú—O/h¿”ó´ÕáƒKŽ%Ä¿å<#&bbzÈò&ÝGW[i\ÁYêá ùã"ó²s ¿Ç/ÚÈ«Â6F‹Õ~“ÚF:ã<µ(Üôsñ©SÁƒßw<ѨOÁ^ßPJD{¨%N~Õ¿Q}·‚¬XÖu«;ºwtïèž«›«›«»GsæM³f ̈tôÒCÅàý€¨…Z¨%1MÂ$Lš 6Am‚Z¾r¾r¾rá!ÍÑÍÿe÷Ïí@ ¤@ÑaFç’Î%Kªo¨¾¡z~~~ë.­»´–"|Ø<6ÍÕý?íçoà$³‹y}óúæõ,,,Þ8xãàò]Ëw-ßUg2$C2TˆžeЇÔX3²ƒ”±Ò¿FmÛsœOßîô.blÕÞ9Ÿº|à5×É–— ׈m„v´‡Ü~³*±‰l"›(–}ý|ý|ýÎ<=óôÌÓq]ÇuוE²H)y¤MÄDLTˆÿrl-,›™“Ä3D«cgOÎSW…=* Mȱ}›bMÈźFv×Ì‚«»Û<5Úu;h»µßÎS߇7-]x7d]añ>}ÿB·ýÕÇ™IÔ™,Œ®‘ú¢¤¸‹¿‰ù^ÞC}‚àÊ2™YÙÓ —Xm~£çÜÚ—ßgײ‰ó”¶aúœ'Ÿ=ÿpÚßAMüN´åN£ä»^°b:GXCï?<‹<Ÿ}.õA–XvJ²QÓ;ýÔö Ã Ø¢S ½‚Ó9OÝö*âD·¤ZR ªÐES$:Á•¿rRà÷à^á³a6ÌFí†Ú µ‹"E.Š<r.ä\ÈØJc+­ÄdLÆdôŽÞÑ; Çp ‡*T`úàŸ ð€‡4›…@!p³ãfÇÍŽ9åsÊç”o5­Õ´VÓ¤„Gß²ƒ‡üwß›y3Éž=èà ƒƒ´+hWÐnñ©Å§ŸR1R1R1‚#áˆã8ŽãÂ100ÚI;i§Xáèè˜QœQœQ¼H‘þ"}•í*ÛUÊÀ‰¿«€Ô ƒŒqšNÅŠNG–Zîàé3Ûùo~Ó|ŒvïòC)üíÃĸ}1ÜàÓzGFÛ5åZ?z:ë舦œ§\ ]\˜¿ÇÓïu_Ç@£BI?²RŠG%˜@û˯üÝ2)þžÇ<-¤ê؇ xÃI¬i¤ZUÍøÕéÊk#{½åj‰<Ö”‘2™áF)Dò½ë2·™u´ŽÖ‰åZ#j¨5â;ÅN±4µ4µ45—F.\¤-EQEý²‡b>ËŸá ö$Nâ¤ø6ví4Úy¼åñ–Ç[¦_H¿~Áú¸õqëã’XTÜ¿eˆ®\×q×áø›l0Ù`²áˆöí#ÚÏ2že<«±¸Æâ‹E«< ¤4ðÏÊWÀv³Ýl7œá gŸ>-|Zœk{®í¹¶a‰a‰a‰h‹¶h‹»¸‹»R˜¬ ÈCL§Ê&XSeëšFë8Ÿ¾ÖoÀÛ)cööžÍùŒr~q|j¯,‘³0rÅ”‡Ú-Oäb/`¬@ÌÿçvÓí¦Ûͧ§§M‰›7%êvÕíªÛÛ±Û©;u§î ™Qà¿€¼ÒB†Ø€e˜J¦Ñêh½Lê³,ÖÓn®÷ìš•‡ÄÌZw¦ÏÖ]Å댗}¢ü•…ÊBeÅ’£À¯MÅrűl¿¸Â±r-y×è^»xÏ„œ~8Ÿ8ðÈŒ¤õjGHÊÇŒG/8Áºßû³SSjJR¼¥£¥cåé‡ÒåïKx—ð.ýykóÖæs€$â>¡XÁ“ Àÿ‘œñ&nšú I*ÛTã˜|}BN7>ÓéþÆ9wÇyží»¬×í·ú¯ŒÖ³N¬'%áàl¤ÄLßþ¶Qj_Èq“…¶l8ˆ5• M t<ãýç—ï”Äyæ¦ÈªÅOOu ¶ã<Ý5üæq‡ùâí–›¯×­*õàM³+Ì–¤ôN†ÕuCÔ=o×Þ®é“Áy’FÈ)Î3FFÌ›Ó/¨‹k=ieËe©Ž`&:Êoœø ƒ 2¶“íd’Ÿn;“v&íL²Ã²Ã²Ãö¿Ûÿnÿ;+5+5+5ÌÄL̤=´‡öH&ï×ð!ºI8êÈA¢Ùp6‚å ËJÓ:uôë-¼Ñ ÑÃ1å~7>1–ÐZB娕›û|îó¹Ï¯$_I¾’ÜiN§9¤ì.Bu¡ºPzÐû¯òí£…(Ä<Áååå’ÙI³“f']м yA3àdÀÉ)œcãØ8)›é è1=¦Çb…¥—¥—¥×þÍû7ïß|`É%–X-°Z`%QîÒ+zE¯†B~M–ŠIÀ)±l¶Y;F}ï¥Òaq_ò“’ò·SL}2×u°l(|£Ì ˜Cÿ»øBb>Œ`£¶m#*­œyoæ½®!#gœÕv)m£m(³kZÁ šŠ)¤ÀŸ€›¸)ÎrЋÕk/l·pÞ‡ë®{ÐûeÀ ÿú6fƒuU_l’cRYö €ðaý=©¼ î=Ñ=á O,–U’U’UªT!ˆÇUë_­_‹§}Ÿö½QC1]àGz hà³x4¬2þ ÄEߟüÉQˆâZÕ2ªY5SózͳÑÓ^E½v3{¶ì¦7[îÔØ^óó”ÂàB»â¦à8j£¾·Ïág¡DR™·á$.•V/½ÉSh9ÕÆ¡w‡>,z;)-§å´œžÆ={ç~ÇýŽûî ܸsWîÊ]©õ Rª¦ïëô²¥(Å ÌÀ TGuìU©§ROö‡GîU‘‡<µ¢ãcýÐâ×ů‹¥dU(BѰaäààÔŽÚQ;‘Ñ<É<É<Él±Ùb³Åw¯Ü½r÷Ê­g·žÝz†[¸…[|)_Ê—~gF.JÖ—¬/YP„"ôä瓟O~¾ªtU骒½—½—½W½õ:Ôë€b£XºJºÿ•ßH(Ù ­Ð v°ƒ‰`"˜:ž:ž:ž…*…*…*Ÿ+|®ð¹ëËú²¾¨†j¨¦Xl~ü÷Ká¤ã"Þ£Åo3?'ù¼ ø¨òÙŸØk ƒ#àŒ+hMU.[Ær©›4u¡ö‡32~ ؃=؃c8†Å)Å)Å)TŸê—L½x70u3QÐçD:NÇ¡‹s8ÇŸC€  SàÄ¿}KÌÄLdº™º™ºéé U“Oûv¹¢0½p*×yÔèÑüâ"žÊ~±¸ÜÅÝ/Œï ¢ÊüQ$²ÐðA<žT1¹Ò~”îm“bx}F£cCŽlWÙ¾áhå‹{ÑBæD.¨YrrÝ<é`Ì“°@³”:£îâÍŽ‡Ægä—¿ï}eoäñ¥–)±ç×ݪú,SØÀ’h9_ÅßÀ_"|,F J¢÷§¿S.úówüÇ옳;?úüèó£wDíˆÚ¥ÝZ»µv뀼€¼€<ÝÛº·uo‹Š-£e´LR…¿}ˆ 1 ð{Å^ÁÆpö²ö²nãÜeB— ýsŸ›?7ç9;pv ¯ëí·gW‚/|áËËñrØðÝ¿kMhB“úR_ê‹—x‰—ÆmŒÛ·ÑSÖSÖS~ÒâI‹'-žë>×}®Kµ©6Õæ*\…«|—F®®èŠ®ôš^ÓëwªïTß©ž¸uâÖ‰[ÅÅÅí£ÚGµ¢[t‹nñÀ$‡™ßÏ3ÓíѾ$´$´$çp笖Y-³Zö¹ÿçþŸûßlw³ÝÍvðƒü$¾üû¸ûŠÅægÀ­¸óHE-F.–|z[\Zï©ù»{ý Â²]%ÍKwsA/C}§Š+í¥{´CšŽÊ߹Ϩhõ©Úè$N¼}»÷í¾e5"jĴܽÅ{‹¯æx#œXá:®ã£B¼øƒYNáNñwü®sWç®Î]'o'oÇMoýßú½¸•›u:Y HÀZ¡¹Ðœ„ÌðHêáÇpöøˆÏ(†ŒçÁ#KÕødX³…ôŠ*Þ{øäÖÛµÝõ'jÆõ?çQ¼QñÚOÛ“}ÿÜå$Ãjåç«¿5ª¨m§Ovj–ºÂR­ÃÁ'no±9ÕãrG¶‹uÃÞ”&ðݸ‹Çxƒ÷øønu¾|Â'|ÂÀ¾œ/ç˱û±«óVç­Îç Ïž/¬1°ÆÀ»Íè6£Û ¾†¯ákDEPLu÷?±sü=(E)Ji$¤‘¥SK§–N5k:×tnO‹ž=ú+/P^ Uûžú=u“¹¥¹¥xxåΕ;Ÿ p7qåQ—¿û·ìø”x•x•x‰ª§Ãg‡ÏŸK”,(Yp-ûZöµìÒ+¥WJ¯Ð1:FÇ00á;{Fq›!ªàÉHF²HÔçççòÄã‰Çûöì?4ß`|ƒñb€)M£i4í+ü¿GwtGw¸Â®ÊEÊEÊEV­¬ZYµzçúÎõë ×®7\± «°Š—ãåx9…k®¿ú0‡¾ÌƒÕ ubʘ•Ùí®5XÀùÌcþï>Ý?¤ï¢7æ£Kz«h QNWÒ®š/™¿oüâ³Á6ý¢Í÷æ‘©À·)jµ„ZB-TGuT÷¨èQÑ£bÖÔ¬©YSWW[]mu5í"í"í"ÔAÔ¡†Ôþƒ"—»”6Sc¥*x€™bMÃzU’Íìg;ÊvBñ±”±ƒÞrž¿9úêm~>Ègc¯ö=>kK\OlšÐ¡uÀPIà‘ù‹Åú_Ê7=¥§ôT,·ŠnÝ*:C+C+CëøÊã+¯¬¢_E¿Š>,a KêFݨ›Ô÷é6#ÞU=ÔC=H 91'æ==zzôôÓ7Nß8ý|á…FHÍ'° ØÍT™*Ò¥Ô¡þ„DŸÅYÉ€uSuSuÓU^«¼Vy¥/L_˜¾Ðí€Û·¢w»‚ü½S8"xƒ7x#ºµD>‰|ùä¢ì¢ì¢lšÍ4›i64œ†ÓpzFÏè™´ýOMz¤GzbŒ‡n®n®nîÖZh°9asÂf‹;w,îHMÅ`Y~ü÷&wñ„ªb)…‚£üù™÷?9á1wAÒpÙ FúzÍÔoª”…¨†£aYš•ïz´J¤I¥Iš¨N­¨Ué2r$GÔ…&4¥ñü Øù*ð?ÁîpçœsÎQ€8¿u~ëüV·¢nEÝŠy1y1y1¯•^+½Vb{ض‡ßáwøŸbd>¡%¢É€÷âÉhÉ!é² ²²KÍ¼ØøÞ¥Ã–Y67®.9šWphó‚í#3í»>]é¼/¶X¥võâ·XÛÆ í±­$7¡Â÷B@©P É Íðï?ëÄ·Š” D ¶ã-yKÞ’ È€ Žn=ºõèÖSýNõ;ÕÏ`–Á,ƒY>j>j>jð„'®ú¸êcóåÞ˽—K <—çÒºÒ¥Q_êá=ÞÿnZRd‚*T¡ªÕA«ƒVëWÖ¯¬_}hþ¡ù‡æ7¼nxÝð:¸3wæÎßÔoa–aËfÙ,[LÏtrÝÉu'×=ªô¨Ò£J5§ÕœVsš]W»®v]¹×ãz¬kÅZý®§n‚&h"žöë Ö¬7ØHÓHÓHóÅÄ_L,ô-ô-ô•¶Á¢ÃŒ? ظ‚@Ü øN|D1J^~¨ûy J"KºÓkŒE_¡€†Ryý»‹TŸK“y,š úw?ZrS¿åoQÀð#Håçùydá-Þ~ù»"¸MÿÔšZSëÒ¼Ò¼Ò<ÝÝÝ’‹j,ª±èqÆãŒÇgûíw¶º¡ºá ÎàŒ”3ïçÁ|B±´=n‡Q8PSJ¼í£z((íû©™ÒѬú…ÂÙš‡Òo›œÒªRïѬ3?º·¤òðq«ˆ}üÄ<+¼Å'ç”%[€æ¨’/ªbþç£E(7¥H@ø9~ŽŸ[«¼Vy­òã…>^ØH»‘v#íæBs¡¹Àçò¹|.»Ì.³2g’oÇ1@tÉ¢,Ê*õ.õ.õ6õ5õ5õõyçóÎçR¤R¤RäF“&M.](ºPÄô™>ÓçÏø3þLR¼¾wåUv°ƒ¸=³õ±õ±õÑÙ£³GgÏÃ÷ß?|_X½°zauéí‡! aßýóTšVšVš†K¸„KùŸó?çÎwÌwÌw´Ì²Ì²ÌrmèÚе!F`F`*¦bª¤”ÿ{ˆ[\VI«’V%-á¤pR8ymüµñׯm-ÚZ´UjóÏñ\±¨(ð dÐs’Ò%ô[R=«•ΙXÒß¿ˆO˜Ôo`Ñ´ ný´Ñª¼ÚLÊ GoP‚xŸ) À€˜à£"«È*жÆzƒë ®78×"×"×"özìõØëjÕªÄ0 Ã0ŒÁŒQd ø X})yÀÿë?µ+u`Äa0qûÿ—31—c \Õž¤þï…¨|·Fk´fJL‰I£;ðêÀ«¯æ—Ë/—_n{Àö€íúÍô›é7“ßÑÚ@¾ ™©*Ç` ư@ÈÅtB#FŒ 8§tNéœÒ’%!KBÔ“Õ“Õ“Å[yÍÀ·)fKíL©³xf8°óÀÎ;ç¯Î_¿zxÅᇗq™{Á ^p„#¨ÐgúL¢½nãÚÆµkúôéöÙ{dï½gzÏôž¡:¡i“6i‹çN¿5/¨ u¡.¢óÕàyƒç žwzÒéI§' z<èñ ‰Ù±ˆEìä‰Wàgƒ CóÉN,{ÆÚ®2 ü°`\“>«KL&êõË/­>qUÿF}÷V”r7²AT㦀ÿâ¼k±V¬:n踡ãÎøŸñ?ã?öæØ›coŠõÒ²®€¹DS{°øŒhŽKè‚•Øœ%g˜ô¢N€à}oÀjð³5çuÍ&“û5EËŸÑêüð@}šú4õiëö¬Û³nÏ™þgúŸé¦¦V–¢K“4IStÆÉ%ÿ»•S¹äýïËËËR‘ŠTÄÅÅU-¬ZXUò?¦´‘6–‰Õ¹Ù&Wr%W±<«Â¬ ³*œ;qîĹÞ^Þ^Þ^¢=žæÑ<š‡ ¨€ ?Èc‹ªÑE~•ƒ*UЦ–\–ËrYÇŒŽ3¤Qò%_òýý#9ÏežË<—óuÎ×9_Çã¼Çyó’‰GÆdL&p+ À¿Gx#–¾²˜aðìUÂèÖ½V”¤L ê¯ÆùdÓaq ;ºHíïÓh2TŒ› ü&Dëct@±By®ò\å¹Ûõ·ëo×Ï6È6È6hTÔ¨¨Q¢hjOí©ýoÚløÿ£ @ž†½ùÿMt7À¤§°:Zÿ"—#r¨þ¢þäÃU=ȃ<Ärã“O6>™Ú>µ}jûSO <5°Æá‡k–Zn§í´½ìeþ3J0õ¢^ÔK´.ëééʼn;$ï}Þû¼÷›l>°¹Ôr2M–b(ð]¦”ú=H@D…R+C+C+cç‚ v.È É É ©Q§FuÄõŠ `Ø€pëRPA¢ÂôÕcTQg#ÎFœX1xÅàƒ•­”­”­ððmÑm…+i ¦`Š8’*L…©°íÊÛ•·+g¾É|“ùÆá¨ÃQ‡£R6b‘Á]Ÿ pÚð–<Ç %Èžj¿/øÔÿÓºb—GªNËŠ"jIïôN©oV‘Ò‰ÓÔƒƒâ㦀¿ ñxÔ…\ÈE$ùªž[=·z®ñã Æ¹?rä~~íùµç×Jî1™ÈD¦ä-ªÀ‚s"Ò°©@© ¨^ô€q`9x¿ 0SIDATÀJ' à€_™¸aÚ/׿ªb ÿD?]‘åÝ»q7¦Í´™vʸ”q)㎮8ºâèŠ Ê”+(÷oÚ¿iÿ¦*^*^*^b{¼À ¼ø[}ÄEuStÚ‰§xŠG?ôC?ÿ¶þmýÛ:Öu¬ëX7§ONŸœ>[nY¸e¡d7g«x­H.ü#At’1!2I?-}-}-}uêÕ=z=æzÌõ˜û÷ îˆë¯Ãëð:?”g¿1wé,ÌÂ,xÃÞ‰²DY¢ì¦ñMã›Æµj9Ôª•R+¥V aCæÅ¼˜—$ÿr +²"+q$-¼,¼,¼tè,ÐYp¯ó½Î÷:?O|žø Å/~øü©á§•%GKgÒ*ôEK(Ñ\r0°Ò0Qí %`X€Ö¨«ØT@ß„âÆˆY¬n°ºÁjÝkº×t¯euÈêÕá•ç+ÏWž˜Žé˜ÎƒxR ÛÀ'¹²p‘¶¶;'àl8„€mÛ ¼Œ› ¦^P,ÚìÛ­PæS¯iýcoå>a4Fc4¿Ëïò»"7KÌݘ»1wo.º¹èæ¢#Œh0¢ÅðÃ[ çíy{ÞžMgÓÙtXÃÖ¹WŽ=†ªQ5ªVZXZXZèâæâæâÖ®g»žíz¾6}múÚt“ß&¿M~>8|p -Ò"-~äØ\Ú"£Î2¶Œ-CUTEÕŠ£*Žª8JßIßIßé¦÷Mï›ÞOv?Ùýd·è±Ím¹-·ýǃƒó¼ïÀœ™3s~°ûÁî»ã_Æ¿ŒipÍàšÁµfg›mv–NÓi:Í=¸÷‚Vå@dA¢˜Å#‹GtÓuÓuÓïñ{üîûÜ÷¹¯È³Ä½¸÷R, ü>4ƒ5Œ ´e¶$CƵÊ! ;µç|r­ý9ŸfçëµgqµÍF‹ÍefÌ”æAJŠ|¢ (ðÿ :Ɉ‰9üáõMê›Ô7­z¹ê媗g›Ÿm~¶yK§–N-%BUÁKð¼þ‹ | ü>È;Òt‘{I7 p-l® g@ÖêÿwÃD¦ yBIEàðïû×?‘]¬î×¶_Û~msæ,ÌY¸?wîþ\³f;Ìv *¡Y’%Y~5›þŠ*b¦aš8®ÞA½ƒz‡µ×^\{1ÿSþ§üO#sGæŽÌ•. §p GMÔDÍ<|\ /îÅz±ÿkï¾ã¢¸ÖÿÎY–Þ;H•. н`¯¨±&kì-ÁÞ»ÆÞ5öÞ vE ˆRD•¦"(i»{~Ìæ^¼I¾77Wï/‘óöõò5޳Ãî™ÙáÌ™ç<Ï׊Yþ³ügùg¤e¤e¤MÔ˜¨1QCyí2™ˆLÐ Ñð ?‘Í©95‡´ åþ³ûÏî?ß|róÉÍ'·»Þîz»«S{§öNí1³1›Pj  z$ ¢QŽ(æ0‡yP¯ ^A½243434gŠfŠf*ƒjèizšžÊ3ñË÷Ÿ\ͲPËÂr¬æ˜ã=²™|É– Œ-¿üáÞšà–]/ÁFÐ#Wñ±]Є·Çýͤ™4S(áá{Ç÷Žï{®÷\ï¹^8záè…£¶Õ¶Õ¶ÕB %U¥ªT•·Øg"übºiÝ€Ï5úþsËð]Z]wþënTÚvÕYŧ´þg„tIHB’Ú0µajÃv¦íLÛ™öxÂã 'Ì[9o引†d+ÙJ¶BzÐûŒÕUÝáwÚŠ¶¢­„!çBÎ…œ‹?2þäÑУ¡GC ì ì ì”4u³Ç|ÙU-‹QŒbaQµ«jWÕ®6:mtz¸àႇ :úvôíè +XÁJ$IEÒ/ü¼nÒt¡ ]bBLˆ éKú’¾kÍÖš­5K|—ø.ñÝDƒ‰™A†0„ Ýt|‡ïðéGú‘~ÂÎï2¿Ëü.Oòžä=É:0t`¨À@´M´M´_$¸ÿ„„œÅ3„-t¡yåÔЇ1¶$2(ŽÉ–5™úpÎØÖ=§«»©ì­R^»|°3xãqÜGüáGâˆr¬.Ø5Ø5Ø5½Ez‹ô+ÍWš¯4Ö+‡íš£9šófû|t”¨xýë&.+`Kl﾿*…B¶Òë¬F_y8Ío«ÓÍ%©$•¤ ˾]}»úv½»õîÖ»[ïM¾7ùÞäV­Z(›t<OÇÿzŸêдUN6mÔ¶QÛFmoùÜò¹åõuÔ×Q_·ÛÔnS»MÊ-Òƒô 2 ÿóÝHüuW6É&ÙÂçµr±r±r ;v:ìtس°gaÏ,¯[^·¼®Ü²+éJºÖŸôµu³Ç4×|\óq151515çÎ9œsÐ:¬uXë0¼á oaæ’‚%l/=-=-=½Ëo—ß.¿ÈÌÈÌÈÌfWš]ivEù0ø€F;víØr¶œ-'nĸ}²î²Ðùþ?ãgvˆb‡T[¨¶Pm´/h_Ð>ccc›ëÙ׳¯gß«½W{¯–úSê/ľ+£ö5õð‹¢¨Åd1Y,$è4O6O6O¶êiÕÓªgQHQHQÈëM¯7½Þ„ ˜€ LÆdLöNKý5D±)l ›OxÂóQþ£üGùÉúÉúÉúÖÄšX“î:Ýuºë ñˆ§Y4‹fá0ã°Ð’ÅÅÅ–Û-·[n/\<¸xpvïìÞÙ½…Öc™,“e~±³&¸Ï‡\E&Ž Ëkgu>ÔXÁØRŸ‘Ö¬tñÁï³×L_Òÿ©sC åc}Büñ–·Ç) Ù„xŽp„£}ª}ª}êýö÷ÛßoCzCzCjqÕâªÅUè@:Ê.;/·ôÿ[@%¢ ôý?×ht€aipÆ&¬Í:ÐÈ; –áo!G =ûMd.™Kæ ËfÅfÅfÅgjÏÔž©{÷,îÙGC y¤Ür%YI”!4ÿÕ<:¯%ƒÉ`2XXÚdh“¡Mx8àá€óÎ8Àâ…Å ‹Ê-MˆÉ?ׇÑP˜À¤nhÇ€ÇxœTžTžT¾àõ‚× ^+£'éIêß4Js˜Ãœ£Çè1aE¿ð~áýÂS¬S¬S¬w­Ýµv×Zõ õ õ ü€ðƒhhhp…÷VõVõVMìŸØ?±ÿa£ÃF‡È÷ä{ò=nâ&n 7üÊÀýÇêvܧüÐl°kcKGŽl#/[4w„cAù÷ã{7n~Ó@çI ÈúÕÉû;b눭#¶ÆyÅyÅym[³mͶ5B¥=å¦Ñy‹ýEÔgà¢áÿº‰1€yßÀ¡èãó«ã? ÈÍ:«êÆÙ×wuKÝ 7È a¹Ïü>óûÌ;0vàÕŒ«W3”a3¤=iOÚ+÷ðŸÞèÖ Ôù@>²½ª½ª½jXlXlXlÌ«˜W1¯zæöÌ홫Üò¹D.)÷ ŒÓ×MÐM  h 5¨Y¦¾L}™ú£ÐG¡B{éôÒé¥#lCú>¤Oýt ÈrAˆz7|oøÞðý‰N':èÓ-¦[L·´m¡l•*+TVËïß¾KÞ•¼+y×’Ú%µK”iÉP2” å†úì“}…Þf—»Wh …[ÏÞjmTuS9ª;K}²ªr¦99…AhÇã”l`åãÔ¯ð¾jJ›Ò¦ÂìSzOïžÞ==D! Q¤ iCÚu%y³ýEÔÔYN¹Ps#tÈ'°d¬ÙÝr`ÿfðŒ¶X y¸„[áøýo • T¡ UVËj™ðïÚ0•0•0•èŠèŠè 3#3#3£‘#Fà[|‹o•…Ì®à ®üÇBçR(‘S€ˆ‚DA¢ ””›J›J›Êðêðêðê0µ0µ05CbH ëÌ:³ÎÊ=A2õ L`‚ø€âæâæâænjnjnjòxy¼<þÙÐgCŸ Å<Àåöõ!H¦.¢L]*£2*{gðÎàAä÷‘ßG~/M‘¦HSº‰»‰»‰UD*"‘l€l€l:£3:;4whîÐ\¶Y¶Y¶ùyÃç Ÿ7&ø*§óç®ÜŸ<'댸wJsp2¯f/—^¹¨êÝüÒa-Yø’>AÁ}ž¹\·Î¶Q1¥&d o7ŽSÉ„“p.d«piäÒȥѕ¤+IW’î¥ÞK½—Úðnû ïÂF0¢igÚ™7ÛßB)­B0ŒJÿݤc_8¸ <‹_MÛ'y€uuVñhxt,KÇ Ës<æx̹5øÖà[ƒ£G ŽÜþ‡ö?´ÿA¹eSÚ”6Ròý¡À•º£ûWÉU¢LÚË«—W/¯EŒ"Fqyäå‘—G:wî¨|¾B®“ëäú/­žMÌE.r…Om½Ùz³õæ;–w,ïX^Ú~iû¥íúOõŸê?UÆÁbPŸÏ[åì‹(D!Ên”Ý(»Q7moÚÞ´ˆŠˆŠˆrnáܹ…UŒ^¥WéÕí±Ûc·ÇÆeÆeÆe¶¨iQÓB9P ä¨á×îÏžˆ×õKÇÝs‘ɽӌ-k;òuEö¼QCõ™lÕÝÑþ#gøx8ú Û¨<¡ß‘dÞn'–î¸oྤiIÓ’¦mÚµiצ]’6’6’6ÊnŸ„ô·;¸u–µ€ ãcuB(h(Œ&¶€Q‰@wÔyí) !uÖ]Ëú8Ú&t‹á gòš¼&ʧO“‚&M Šÿ9þçøŸY²>d­•£•£•CÄDLÄÂxð¿ _©Û᪱LKMKMKχž=·Þ>Þ>Þ*MUšª4M4I4I4©º[u·ê®H[¤-ÒVæ¨æþ>êf)…Ðá®ªŠ°»F;€y[8à]…¹Aý@±h&`6€_"àëþýån_Ó†4Æc WqW?<þðøŒY³2f¹Ív›í6{ðÁ7ßBkH "AÊð•:c꿱çP„"”Σóè<Ú‡ö¡}‚*ƒ*ƒ*í·Ùo³ß!ŠEˆÎœ)8S@HI`,€a<Êjõéü–CN¨u@"‘è\ì\ì\¬½X{±öâg/ž½xöB+•Ç ™v°;°£ž^ „¡ T ‚>¢è#ŒÁŒ¹àzÁõ‚kmNmNmNÛÉm'·l˜g˜g˜g²Ôd©ÉRPPÐÜþ¹ýsû—Ô–Ô–Ô ÙfØev™]®××Vî¿A&â:V Ëæ:ZÕ˜|>(º:wÁ¬aû[õxtÀÒ‰Û|:@jÓŸÈp"B78ÁŠ·WŸQkjM­…eÛ+¶Wl¯\Ÿr}Êõ)7jnÔܨñêáÕë&c2&Ó´mÀ[ì‹QwÐâ!ˆþuwOØ3ö©€÷©ÝF$dèHÿ=Éêæ{ÙIvå8n§¢NEŠ¢k£k£k¯=¾öøÚc‡cÇ”Ù<(¡„þrƒSw|]H):šŽ¦£…ÕmDmDmD÷ß?|ÿðõ·×ß^ëâëâëâ«Ü›õ¢^¿±·úC(4‰L"“èWô+úÕF—.]’ç$ÏIžÓáA‡ )š¢©hŒhŒhL}ÈgÿGSbJLDH¥R©TºÅb‹Å‹'jOÔž¨ ž=xöàÙmŠÚµ)Šÿ þÁòšå5ËkDN"'‘“r»°ë£Ân\½ó߸Ç#…Âbõ*y¤b]áéªi5+TÐK¤+Àú±p=Wõ]ªSP‚jÔ²1¬1 o˜BŸ7=WOé@:,šE³ht@tp v v 6kdÖȬQŽ4Gš#M9•r*åJP‚…¿Â_áÏ m|1„g”•×äB*ɧ@õ 9BÀ¹Nðý}XÞô€\È`â´M= õY¿äs¥ÎØ6̳ÁdÙEvÝÜ}s÷ÍÝ·#oGÞŽ466Y²6d­(X, fsØ6å(GùGg (  *D…¨(V+V+Vë¥ë¥ë¥­[;¶V]K]K]ë誣«Ž®JKK£b*¦bE¶"[‘­üVÖ·06Bz¤ÛÄ6±Mf&f&f&6° ²æeÍËš÷"êEÔ‹(Ä 1ì ;ÃÎ|áùìÿ0–ÇòXu¤ŽÔ±¢¢¢¢¢âvðíàÛÁ²XY¬ì´´ÿÝV7ZÝhuY|I|I|æÕ7¯¾yÕ_x6KÖ“õd=Îâ,Îð–äþ¬Z,Äp¡ŠªÔF|LÅí^jpﮇ[²2è«Zv?¸Åé—ƒŒÚ]¤ùd&QŽUàF  o<®žjˆ†h(TKV,8¶àØ‚cñKâ—Ä/ùÖ÷[ßo•ß”ºÙ‘¹/˜ÐÉV¯³B(ü”ýÏ5*ë`l=Aá@Û×ÙÏC ç(o ”¾ÌqκIcH ‰–ܜܜܮ­¿¶þÚú˜ä˜ä˜äN=;õì¤Ì N“Ãä°ru§¢Ž&£‰r¬}jã©§6NHKHKHÛ;yï体Õ"Õ"Õ"QˆBb5Vÿòœ¹>i‰´DZp€Ç6Žmccc²W¾W¾W®*S•©Ê`3˜!ùÈç-öÑyûïñU¨B•¾ƒ¾ƒ¾ÛéÙ§gŸžpÏùžó½i×L®™\×}´íѶøzEõŠê­vhGÑDÑDÑD¨C½îÕ‚«þ»÷ûÈF¾PEµÊPV&·çZ1¨z.ä´]5ÅKÅ|£Ç%k$?«TŠâ•§l XØ7=W¿m£1£hDë=Ö{¬÷¸IN“œ&9Õ³ªgUϺcuÇêŽ&a&)áñGÌ_:a´¶€2o òÒ\:dÓ`Gw˜ý \·ÀþÞÐÁ „ ÿ,D@šø%Ú^òŵÂfXSÖ”5²m¤§¤§¤§œœsrÎÉ9â â â ÁµÁµÁµZ¡Z¡Z¡ì5{Í^ãŽá˜ðýÂ<Ø.¶‹íòéáÓçGï¸Þq½ãJ'•N*´#tGèŽÐêÕ-ª[$’D’0 ³0«^+í`;¶ícû d8T;T;TëNÓ¦;í•Î+W:5*5*5*´ íB» š¡ÿš+ ^0€m@P‡Â.…] }îÝ)ºÓNüFüFÅTÜYÜ#Þ¯{¿.ïHΚœ5Y7Žp7úÜc»Çvíö§íOÛŸ¦o¡o¡o!d­ù(9ŸmR']¦Ö-­[Z·Ž¤I9’±4biÄR[[[eS’@X/JÕýŒ:ÐÑ#zDn èe;üŠÊU•«¢"Ÿ¶>m›ä °`צåÞ{ l‘<3yæ‹GkÌÖ˜mÖÿFÿ:ý­^Z½¤w•/ËG>xº‚zí¿œú…äG©|ÂA9ŠZÔ~·ÛÜŸöߌHEЉÙ‰P0†ï}*WUå! “Qì9sÒÈ‘ŒP])§:^e&–¸WA‡7=Wã1“1™QXÁ ÇõVè­([‘³9gó…‚œ™93Ù’wï2â­Q€,bOØŸzš³‚û}u»?QÀäÀ/}{Q0”ÀvÀ‰!0ŶùÀqk¸Q'ä†lœösý £Ê§3Oø¾œÄIœdÚL›i³l#ÛxpçÁ7·0naܦõÒÖK[Ïê\Ô¹¨Ë˰ÆaÃÆ8v⸾FÆ>”}(ûPfTFTFTu§îÔ]Q®(W”+§òØb¡……Ö0€ \L]L]L%n7‰[ŒsŒsŒsIRIRIîáîá4N gÖßšpõn?Ú  Ú’BR0ó0313YK` ì+öûJHŸ#É”dJ2MMM}Úù´ói׺¤uIëÇ,Ç,Ç,­¾Z}µúÒ¶´-ñJwNwÎtÞãyiÅÆŠñÕO÷>Ý»gŸn®n®n®ÑwFßUØUÕVÕ²ë0‚½†R”²Wü·C}ö)*½MÀO¸/,–ÙT¿ª=…šÚë2M:´#Å(b[ðÜh|P»ôÉ~"Çý©BùCLÛÔvªíT#ó_ã¿&hHžsžsÞ¨@%|9 P@ŒI#Òˆud`¯Ž÷¿$L9º×"ïb8…V0дF†@?Ø)“ÿ¹Káâ,k @™£FYk´ú/øùëv§Z¡Z‘t’NÒñ/ñ’”‘2R¦â©â©â™3&gLÎÄ}¹ûr÷Ý ‡Šgººw÷3:gtNwFSIS‰Oà“¢'EOZ4;hvp1™AfÁ¬ëÃz*§Ö‡`?Bè&ê@:BI¸†ï¾køNe¶Êl•ÙÏ«ŸW?¯Æe\Æe¬À ¬Àø?þ-?©pÜ…Ä£7p7¨>Õ§úXõX¯¸«¸«¸+ÔÙ69ˆDî–î–î–Í£šG5ò¼áyÃó†gÏþžýuWê®Ô]ù¡Û‡nºå{å{å{]uþÕùQ_G}eê‘êñôë7Ò7ÒWÓ½xPq–¨KÔ7Ž"£HÈsÓ‘¦#»~ocóºgyßò¾¯Þ‘ad&3Á¸Þ•ýâ”§çÿ]ÉÎ#» Ÿªj]ã-û¶F&Û$zFš“žè‡Gxf\(m¥È››«§„îÅ1ƒ:jQ« ŠE¸Û¾ëû®ÏZk^k^c.÷—û‹“ ö"[ËÖâ}Ý©K÷›„»:¿ºÙ@ ÀLâ¸c4 ¦#ôË€%VðóU8fy~@€0ý žÒ”gñ?ÿþ\4¡ M8ÃÎp‚œàG8 Ëd™F¦a*¦b*Æc<Æ“9d™Ã옳cÓØ46 Ѐ†Ðì£q£úFud´šÚÄ÷6¡6¡ O O íøÄŸšï¾*|Õ£³yò&¼?‰þè“T•ªRU!ƹ0悽؋½CÂðð¨ÞwÃÆl.›Ëæ ÇÈÝÛÝÛÝ[ä(r9¦–¦–¦– ™òéVº•nU* …ƒÏ%Œ^7ES4EôA²l'Û‰6Ñ&ÚŠE€" î¹¤Å´˜³žk=×znóƒÍ6?ØR­¥ZK5k-k-k-SSS‡š5;jv<Ÿñ|Æó·ßn|»ñÝÚ»µwkã|ã|ã|‹îÝ/ºåXŽ,À#H !ß<Úðhƒì0~]Cº†ØÿjÞWóúIû¶ëÛîCŸu-×µ\k Ox’pÈ c2e¸Ï‘_Ï|‚I6¢Fäñ•'°á,®y•u#c¯ËÕßÜéøZ3CµBåG‘Ê6ÑÞ±ÓÏÛFŠv®8*í4¹ŠLe]`‹!üpÜï|+ùX;÷ Ï!zu¯¹N0!ZHàÊ@8x´Î6B¶øé xTg½0þ¬øÃïæŸõ…å5Xƒ5ä ¹B®HI"‘Œd$ ™a„VÈ ÙÐíÓî¤ÝI»“Ñ£ FLƒMƒMƒÍΚ5;këiëiµÎª‡U·A•´’ùÉw»ïö Q:!:!¾ë+ÞT¼yùþzåõÊ™ÝããíÇÿÿsL“·Þ>(8ò¥!iH’Cä9$”QcwÙ]vWò¥v¤„¢KDƒh° VÁ*ŒZµ6j½·ÁÞ{hjkjkj‡T‡T‡T¿8þâø‹ãÔ€PÅKÅKÅ˿Ч¨û”FúÐ'^Ä‹x‘ïÈwä;E{E{E{eÌzj³Ôf©Íò9èsÐç ×N¯^;ýŒüŒüŒ\-]-]-Õ{¨÷Pï£8Š£¹7soæÞ| ÿ@ÿ~|e|e|åƒãŽ?8þ6ümøÛðßx;oèšË^²—¬‚½b¯Ø*•H•HZ*O”'*N»t=èòr{ðöàí=>è}ЫÊ''×éeôËè—äGò#9Ä:²ŽŒ'0¨w>ňûD\b±@K«6Ô¦}¸V»AÖEç€ä”8 Ï` £gÒ( ¯–ÊÕoªPA j@0Ó¡I ˆn!©xÊ̘¾Åj¬FY-y÷û3êž7C_ÆÔÙØ"€Ÿö@È$Ø{èÀ½vÀ/ýs-5 E8=[ÿÙ1—(§ìÂ(„d’L’I"I$‰$Ÿä“|<Á<‘ÛÊmå¶l›Áf(‡­à‡>ÃìÁÕ6ªmTÛ¨MS›¦6Í2Þ2Þ2Þòå!ËCV•V•V•V¬6Xm09nrÜ丮LW¦+Ók¢×D¯‰Þ ½z+tGëŽÖ­x£x#›![#[£qáAЃ ›'²OfŸ,Xl0Î`\á;¶m«.±ogßι|ÐôAÓWõJë–Ö-¾×‹s/Îe®~0ðÁÀ–<,yX’]#­‘ÖH™ócÊ"WÔ˜ScÀPÖ9öƒü”uªP…ª¿ýØ<#A$ˆ±l'ÛépÂá„à ý¡úCõ‡>—?—?—N/œ^8»° »X/Ö‹õ–þ?¿s!èEHÚЈœ 'È ÚŸö§ýåáòpy8 gáLÙ±–È$2‰¬a~Ãü†ùm3Úf´Íð2ó2ó2s8âpÄሉµ‰µ‰uqËâ–Å-óå/Ê_ôøÈã#ÜytçÑG)v)v)v¯{½îõºWÝ·@ÑF´ófÞÌ›…°"œÛ {…½Â ð„-e[e[[É2€LKÝ–º-m÷-É-I¸Ã ½AzƒZ÷©èSѧb½d½d½&N†“álÀó:øE¯þø#îTDT©19ZYéxJçß>6âV—›Á†k´{d;™³©Õ}‹äðÉ—S´ä#îÇqÿ_ÔYÑ{ÿsoKdü*°"0˜î¯€)†>ièâ ¾‚ ñC{x vâ Ó bÒ†JÜÅÝ—Ië'­Ÿ´~2\g¸ÎpÁ>ƒ}û ‡3fõÀêÕ‹,>XæXæXæX%Y%Y%i•i•i•‰ŸŠŸŠŸªº¨º¨º¨¥ª¥ª¥*:):):í,ÚY´³àZÁµ‚kïæ¾›ûnîÛ¾oû¾í›{<÷x–ÅË™/g¾]êÔÒ©eŠWqTqTy§²¯Ë¾ÖìÿÌÿ™£Dõ°êá{} }©Zn6n66“¥ ¥ µ(ó-ó-ó­ô©ô©ôy6ïÙ¼gó¢h<Þõx×ã]™a™a™a] º|\ ÜþðnZpqPÈáͲ†¬!Îã<Î4úû×'†bÑ2Ñ2Ñ2ù ù ù‰!Ò!Ò!Òyóçkz¬é±¦‹[,n±¸…Pï™91'椌tÿߨ۞ÍÑÍ•Ù÷CŠPÖŽµcíÐ >N¤¨µNkÖ:§FNœù]÷»îw½e»–íZ¶k0¥Á”S4+5+5+E¢ QEÚÙ´³igSTSTSTccc£&EMŠšôîлCï}ôNæ`æˆJD%¢!XˆeGÙщþŸ7r´m@Ï+ňûv·q } (Ö®\=§|eMZ­jÉ·„B̆°$“ ÍîêYˆÔB…òæ3¢9ŽãþW„.»è²‘Ÿ#ëÀ°fXM â‡òtÔ×ä)1êw‚A6ûäŠõ©ßÊCØšõ` Tö°`»°¯ÎÞƽ_5¶hlÑØnÖĬ‰™¯ù$óIæ“,v[ì¶ØmÑÊ¢•E+£mFÛŒ¶‰ŒDF"Óæ¦ÍM››3g6N:M:M:­¦mMÛš¶µWj¯Ô^©Í¨Í¨Í¨W;¯v^®^®^®^î¸Üq¹ãrUsUsUsOåžÊ=•'Êå‰J.•\*¹ô~ÿûýï÷YYYVXVXVXÖýøn?º¦îîª j²j² T2#2#Rc‹7oP1*:\tx\Pà _8ú¸Ä¸Ä¸,õ¿àÁÿ‚Sc§ÆN=§xNñœÒ,­YZ³´Ê•;*w¤g¥g¥g¥ÞK½—z/azÂô„é±§cOǞγɳɳQöÍú¢/ú ?]¨½J‡Óát¸BG¡£ÐaÇÙqv\™ý¯œ'df`†â”â”ââ‡8ÇÙŽ³g]¢KtŸy=ózæ%LW¥3éL:Sî/÷—ûöwU70i7vc7%”P‚,d!K±H±H±#1#…ÍU*U*U*}Ý|Ý|ÝšD6‰léUíUíUí>Õ}ªûT­6Zm´ÚT˜W˜W˜Ühy£å–QjQjQjO‚ž= Êyžó<çùGïAÈ3@H aCVͪYµ|¥|¥|¥ò½ýñ#+‚"E¶"[‘M숱KÒNÒNÒ¾wðÞÁ{ûxôñèãØ6°m`ÛõG×]”5bX#ex°ï^|ŠŽ»váñE6–ͨi&—VT_­ „˜&“-€¼œÝµ4Ò6‘…7ja#h@»ìÇqŸ…÷à ^ð‚+\á 7¸ÁM*L‚I°Ð#ãÈ82ß¡ß)+†(³r€•3Ñ6gÀÀèt~Øò^õþ˜ôgëtoj”Œ5}$Ö —$£ª»ÕT¿+Û!›ÞFÍîµÝ«Î1ÆÓŒ§iéK¿“~§¥)—ÆKã5·kn×Ü®¹Hs‘æ¢*¿*¿*¿âââÂÓ…§ O§œJ9•rê}Êû”÷)Ù³f?ÌÖËÖËÖËÝ—»/w_ö€ìÙJªKªKª«5ª5ª5dýdýdý”Ÿw@YJ TV‰…PE•N èæÇüXç|q¾X1-ù¨Òa¤v-ÈfÀûÕÑÑïhD÷=Ú÷hߣ}-6Zì§ã§ã§ÓèZ£k®9':':'Úl°Ù`³¡Éµ&ך\ëÕ¿Wÿ^ý r r r²¥ÙÒliT¯¨^Q½¢ý£ý£ýóÜóÜóÜKÄ%âqÝžõ¥¾ÔWH[ÉÜ™;sBMpgpFè"ÿFRÉò„Ëó¡ûëø`aYN–“多T“jE°"X\÷ê|¯ó½Î÷¶Cm‡ÚmÛ:·u®[ÿ¶þm-Ò-Ò-ÒM&šL4™X£Q£Q£‘™˜™˜™xÏëž×=¯ÈŠÈŠÈŠè³Ñg£Ï¾mý¶õÛÖÝz=!OÈr„!Gî w…;&b"&²ì{ð» CÿøÍXÝ“£9š£¹vóøÖã[omÕ6ªmT—í]¶wÙ~fá™…gfågågå ]|–Ì’Y2¿øÕŸ¢œ6Ô Vq¦¶d³,GñŠM¹¼s¨]GÛ®½\ÇØ|…ìgù³Ôêü^ů\569·Ÿ! ËÙiôÁ”¡FY„ã8Žû}uÇ턼+;°;H‰ ä:¹N®ã.îâ.~ÂOøI¡¥ÐRh¡Ú¡ÝÚ½/iF|Oÿh|Ò¸‹ñ)ã.ær+…¹Üx‘Ž›qO {ƒ=ÖýŒ¿s®R‹T–Œùy¶÷DŸÃ+žë=S[d\‘ò¤Ñ†6Ò™RWÓsv ì Ô/s-sÍùîñ»Çï¿Í‘;#wÆ›Ü7¹oró¬ò¬ò¬Þ˜½1{cöÖì­Ù[³¼‚¼‚¼‚W+^­xµ¢¦sMçšÎ¨5b ÒšCsˆŒÈˆŒM`ØÖ’µd-…Ü ¬)kÊšâ0c—GL‘AhD¼ˆ\q7Q w¸£†Mf“a‰X@,ɲ gض“-aKØoÔùÖýN÷;Ýï܈q#n7ÝnºÝô²÷²÷²÷ŒòŒòŒÒ Ó Ó ¢Þ+++ÓµÒµÒµâÇ=Ž{ütËÓ-O·$ÞI¼“x'oeÞʼ•¿q,¤ù‘üH~dØ#öˆ%²D–ˆýØýÿû0Hi â–â–â–S±S±Sñ¾Š}û*Þ]xwáÝ…¾!}Cú¾“¾“¾“u¢NÔY%«d6ç}ÝO§ ]èM¢I4ÉZ²–¬eÙAv]f—ÙGµƒU^ª¼Tyémïmïmï£æ£æ£æŸíŸíŸí¶Ým»Ûvñ3ñ3ñ3Òt#ÝÞ„¿ ———?:~tüèlY¶,û7nè z‚žŠI±9l›ƒÃ8ŒÃŸñ(O„[ë—ä%yI†‘adØÜ¹sçÎ;0`þÀüýUû«öW­)\S¸¦Ü%wÉ]6” eC‘‹\ä~±E¯8寂ODň’5²2E1ûþÐæ~ý[E~âkæ¤d³A™â¢§e=\Žmþù\eÕtÙ:ùA,A|0gþùp•ã8Žû h€â>@d$ɬ!kΰÿî¥t]GשժժÕjÜи¡qü•y+óV¶ílÛÙ¶³žl=Ùz²õ8ëqÖãŒòòòuÃuÃuÃuïëFéÞ7¸kipW#]:Yã¤l´ì ;ð.¿`ö ÿØÖ1!ëÞ[kXËfÈ{–¿«àÅûYïœÜÿºëë…£Ÿ~>X»EÎO9?¥,Û[¶·Ü¡4µ4µ4µ\T.*áŽáØï¾[wêNÝ?ê¤ •³Ãì0nán!©ÎŸ$ AÈEóÉ‚LêŽì~ýÏ?B]La”WñJñJñê£Cd¥a¥aejajajá^ä^ä^ÔôiÓ§MŸzÞö¼íyÛàŽÁƒ;† >,ÿ¡ü‡ò^vÙýe÷Ìî™Ý3»Ç®ˆ]»"zFôŒèyòå=ªŠ©Š©ŠùèME’HIÞ7ä ÃÆ°1LÁLjT£Z9Öû9Âl¤B*$ÇTˆb…8@5@5@u£ûF÷îk#ÖF¬ë>Ö}¬»2çŒð®„)¹\Ý*¤îp‡;™Afô{ú=ý^þRþRþÑ$WÉÉɇB‡B‡Â¶{Úîi»Ç{÷ï=víÛ5¶Øo±ßbqPqPqPÁö‚íÛSæ¤ÌI™s§óÎw:'~Hüø!·Un«ÜV؇}¿{)ë\Æe\f­X+ÖJ¸1Æ)œÂ)£Åÿûp&º”.¥Ksss=u=u=u7EmŠÚUEªHùvÝ·ë¾]÷|÷óÝÏwÓ@„›+~Éü²‘OµÑbK¾’Ïc~ìôz­.KüNL-j9ÉC†Å…ãëš²+7 ß‘ðÓ¢W‹Ë´>,"ýp‹ÙôSÖá8Žã~Ÿ¬`Šä ÈV©Ô@ï‰f¸f¸¤¿ö5ík>— .NÖÔÔ÷hp°ÁÁ-ƒ-ƒ-ƒmŠlŠlŠŒÇ1#m-m-m-^#^#^£š©š©š©æ¦æ¦æVõ¨êQÕ£‚U« V½kù®å»–olÞØ¼±yööjÞ‚×µ¯ß¿5Ì?Pàðr±Ï]ïmiÞ1v1öНJÕKOk{Ûzû¨õˆ00©p{bþÄ\1í÷>„H,‹Ä88Á$LÂ$Ì€0VÌŠY±0R®Ì³ñ׉ù®ûNDAD¤DJ¤$ŠD‘(Ò‘t$å¯å¯å¯ýRƒµk Özž÷<ïyÞ7Ð7Ð7Ð)Ó)Ó)Ó5Ö5Ö5Öè•Ñ+£Weee•—+/W^~>ÿùüçóïÝ/º_”¸*qU⪌!C2†¼£ï軋@ÙÀ6BM!o–` –0cfÌŒ•“bÿûQa!›~?ôC?a²éDÑDÑDQH‡!ŽjÕ<ª¹ªhUѪ"bClˆ û‘ýÈ~üC-é8#ʸ€ ¸ |NRËjÙGÏáÕߨ¿Qãâïâïâï=È{÷ V=ZõhÕÃá©ÃS‡§šK5—j.—‹ËÅåB~›$i’4IúHÿ‘þ#ýˆ%K"–¼ |ø6ð7ÎÆÕ¢Õ¢Õ 3…™ÂLY (øK¤õÚ*$MHÒ„…²Pº(pQà¢Àþ)ýSú§ìf»Ùn¶!cCƆ á9›òWÈ3ÃÇÝ¿PŸ¢Ž©pQÝ‚<V¼W|èZ}"v}ŬØœVó•ŠéMR¿¨¶ÿ-#ö¢7Z(ƒ'9Žã¸ßAš“æðc9,…æ=Í{ªd¹÷wï/õ§!4D1ªý°öþjòU“¯z¯Ò™¥3K£—F•F•T^ãQãQãQSSSSSS[[[•R•R•’}&ûLö™,Ã,Ã,ÃÜ˹—s/ç8ç8ç8¿iý¦õ›Ö…c ÇŽ)¶)¶)¶Éo–ß,¿2†_’ù¶Å;Ì}u27CÜP£™†¶R:˜ê<~ûømY¶s¶3–’½d/ÙAòH‚˜ÓÂNÌÅ\ÌeÛØ6¶M¾F¾F¾F7üwÍÿ:Ó4ë¾9ä³2VÆÊ˜scnp \ƒähM¢…úšŒ1ÆØûïg¼ŸŽp„#<"<"Šw'+È ²‚^ èÜÃ=ÜÊ-)Ëß‹0öoC a…Õ 5j,ÔH:št4éèÌQ3GÍ¥üìnĸ}ôZŽû=´!1C’°Ü·Êµ³ÍeÙñ…O‡Ÿ’Û,2þ¸ºÙÑ0—Þ‘ ¯Z½SžQMÈ!Ò˜·ÇqÜÿJ0ärÑíµk¿Þ²,tYho½¶¡mCÍÏØö¶ííÐJœ'ÎSéôìz#6b#B§Ð)"‰H"’ÐN´íDv“Ýd7®à ®À6°Vno¨ÐÆ´1zÑ@ˆ¾´5mÞô{ú=b?öÃX¹¥ð¡|4Ž+‡XkbM÷Óýt?u¢NÔé÷^ªÙP³¡fÃæ]šwiÞ%(.(.(n³ãfÇÍŽ·NÞ:yëdÂÍ„› 7ÜÜÜbGÅŽŠuÌõ˜ë1×iYÓ²¦euÏêžÕ=˲ȲȲèwß› L`B£i4¦8c&`‚òÅCLf’™d¦°Â?Î?Î?.¢ID“ˆ&§ÂN… ÓUÑUÑUn/©'õ¤ž4Œ†Ñ0eõ_“A™ÏŸ>#‚:uê¼=s{æǫ̈´¨´¨´„Ý »v'X'X'X_Ò½¤{Iw æ.èv®Û¹nçLLL~÷;²†®¡k¨U£ju;¸_HçU jP£b*¦baZ¶»Ä]â.¹'¾'¾'¾šz5õjª]»v=”a…£Éqÿæê´É¿Lòh9Îúб¼z÷‚.Ãæ×V.œ7|8Û½Ä0¨Ù¨Y¾ÑN”ß&U'‹x»qÇýÁ†ž°()•”Ò†ZŽZŽ€Î#€(W”ûñæ4ˆÑ ªI5©&9H’ƒ¤iGÚ!™ÈTNúœŠ©˜ŠŽèˆŽÊpî϶°H‹XÄ’‘d$I[ÑV´Õ¯7—DJ"%‘6 mÚ4ìy¯ç½ž÷½\ôrÑËóçΟ;î碟‹~.JïšÞ5½kâŠÄ‰+η=ßö|ÛMS7MÝ4589898Ùc¥ÇJ•ÒåÒåÒå¿Þ¿Ç†–ÒRZJº‘n¤;Í¢Yô%faÆŒÜ?rÿÈM<>ðxóüKó/Í?LÑGô¡È^d/²ÿõÞTUUíììB>„|ù°+jWÔ®¨ð‡áæïOߟ¾ÿAõƒêÕ—4.i\ÒXriÉ¥%—‚‚‚Me¦2ÓßÈñ"äÂ'[ÉV²U9š>c1VH›øËFun–¾$?àü@“Çä1íF»Ñnó»Ìï2¿KêÂÔ…© §Ÿ>~úxtAt¡Ô€`†ð2—Üÿ4Á>Ì–]×ÝÐm_©5O>tyÍæÑÃR[Ñ-$h.iÓÑS97\å!Fx»qÇýauôS ÇÈCòTc–açG£Œ_j'æKU÷Øå!yô1}LÓZBK~ïEÚǵko~ªù©æ§¦8Lq˜â°uÞÖy[çÝùñÎw~LÓOÓOÓïß-¾Û}Íûš÷5Oã4Nã»îßuÿ®{ˇ-¶|h®m®m®ýë=“’@Â…åe_-ûjù“ç’ç’«¿éøMÇ¡͑Ӛ®5]k†÷@ïÞœpnÀ¹mg¶Ùvæ®û]÷»îñqñqñqI/’^$½83öÌØ3c®X¸báŠîÓºOë>M?F?F?æ7>ØvlÇvÑÑÑ2…L!S` XüF[ÕÔœšSsaÙýû÷7áÃ'†O¼~ëú­ë·ìíí± ˰ŒT‘*R¥œcÀ}A>Ùád3p±oW”«UªÊ/±TÖ€Rl&çP!êF¿Ók >]m^9ޤ€õ¼ÇqÜÿA 1jQ‹Jat‘ š€ýl8ŽÖ˜5fƒ•[Ê!ÿÇÔÀ¿f%Nî÷Ôi3˜)˜‚)˜r l! QHÂH ÃiœÆiæÂ\˜Ké ÒA¥ƒîãŸTÍUÍUÍ{:ötìéÈ™#k´«Ñ®F»66llhqÎâœÅ9§T§T§ÔÁŒÁÈpÌpÌpLß¾!}Cò½ä{É÷ÊÊRžÌy2牶t­t­zK³.f]ôËßY½³zõüÕœWs²w¸d¹d¹^ìð}‡ïžzæ{æ{º¸¸è:è:è:Tίœ_9¿pYá²ÂeW;^íxµãíäÛÉ·“…*F¯B_…¾ U~ÒõXõ˜‚)˜"d‚º›¬ˆ±"ù!ù!ù¡ªþº­ê¡®êkÅkÅkbOì‰}²Y²Y²Ù½%÷–Ü[Òר¯Q_£@Ç@Ç@ÇusÖÍY7G9yZ jPãuU¿$Ÿn$f,üàŒˆEšÚÑ[ú:gûŒ­îêžQ_¢6D¬¢á¦¶êÇ÷CS†Ì8?9ÒY4< }åçYŽÓx‚L~08Žã8î‘@‰rjé|ÌÇ|2‘L$iÚƒößßßøhû«¸Š«Z¥Z¥Z¥.W]®º\meÓʦ•›ª›ª›ªõLë™Ö3­c¬c¬c*s*s>x½xQúcÖܬ¹q×_6}ÙtýCc™±Ìå'v‘]ÄÙ‚… S6]ÙtåÊr§ñNã›;U>¨|Pšù¢ðEáËËOß<}óôÍý;úwô¨>P} Z„"i0 ¦!¼RFÊHÙH6’ […­Âã1ã•™é…?Üï CÈ2„å°–ã¢æ¢æ¢¶Óc§ÇNê˜ê˜ê˜QÙ£²Geg.Î\œ¹˜l![È¡Œo7îcƒá ;á^X¥ u#Û]7º—©bÊ¢°][é2JýdÖÀ†m£”§6V#aŠNõ»á8Žã8î¿PwZÈfS‚”ÐytGGÐtÄtΡsè;;»Ás϶zlõÜîðüÃó‡UïÎÚµhaè’Ð% §öšÓkN¯Vƒ¬Y úÝŸµŽ®£ë„(mCýÊÿå‡ñ„fb&f Ué º‚®˜'''MižÒ<¥ù,×Y®³\•§Æ-r‹ÜB4@ÞÎÜǺÁ –ÊåxLEÏ«#‡t<ÃØÇ á¬r¹ipè-éˆf÷«­Ý¢yÊSÊ{0“7ÇqÇ}Âä㡊¡Bi¡ Ïïå´}+ú–ž¶lnÙܦ_‡¯:|åºjMÄšˆ›»w½~{aÁ‚M¯ÇEŽ‹tÝêÜݹ»¶á¯÷@RI*I%kȲFY\iFat ~@>º€.  „essó;>w|îø\ÛvmÛµm]º:tUnÙ•v¥]y‹qk[˜Bˆ…ÇÌú;·q`²¥ãFvalIqÐÛxýq[zM4Z¡ñAÒC…„á%ŽòÆã8Žã¸ÿ‘ºÓ:…” }hÚG´F´F´MÑô— ·n&ý4é'íþþêÏü~ ñ×ÖMX§9È$ß$“‰ñÃ{•S*§DQä9BŽ(«ºþúgqŸŠðŒ¥z YGÖ‘uÂê…]v]Øõ‰É“'&Ó¦L *Ú’Óä49¯ñ5¾æãîÜ/Áúø ß T!ÝàÑur“çL¾,5¸›B¶ØcÄ™ŒÊ)÷úMµÙªÛ@ú@x5%úˆáÇqÇqÿÔ ³Ñ….t p›ì$;ÉAÕŪ‹©ŽOwŸîª²¦¤)QÓnº¡éµ"ŸDŸDµ%ªVªVä¦b*¢ºAã7öÉ}î8‰L"“0Ã1\(­{ÇëŽ×¯›Ën.»¹Ì6×6×6W(†EH àyf¸_8ÂÚd°LX1ÿtÛÑ(c+4B|kï,0¼Ë»¿ß38Ø5×è­®²²]Fº¢Œ7ÇqÇqÜ@xš!Ô…*3æ?ÿtþÓ¤KI—’.ÍÚ:k묭ÂzâJ\‰ëG¯åþ†>Ýã’T¡–$“o(¬x‹ò9•AéO2…‰b“vc‰DU¤é¨zE¥³òUÓÑ‚xðÃÀqÇq *PùÇxy !¥Ýh7ô¡ÞÔ½”w£ÝÐGøßßx÷¿!¤w¬@*躅nf2œéy¦ç™ž…§ Ož xð&à}GûŽöYËcy$ŽÄ‘8ž’ƒ³NËÈ"¢,ŽÝ_Ï­‹m#övu³ÑÛʦ̵ÿÆŽ±Õ¦£çu´°onî(l#šBî’^üËÎqÇq÷'­Æj¬¦SmªMµçµŸ×~^ûÔ•©+SWΘ5cÖŒY˜ˆ‰˜H¨5B‚Ä›ƒh<¹Mº Ëí4XhšÎØÊˆQóË=æ.þf»µêÊèÆƒŒÜÓ ¶¡Èd¢ M¨þ2¥•ã8Žã8ŽûOQ}ªOõ…e·n/Ü^„KÃ¥áÒ‹o,¾±Ø¾Æ¾Æ¾#1#I))%¥<Þýoy”?ñþvàž ‹\k+äþŠ—Õµ›E3è}ÒíÙZöÖàš†…Úåöí°]ÔxÇã8Žã8îOêª* …ÄŽØ»»»»ðgáÏŸ™t1ébÒeð´ÁÓOÃ>ìÃ>Í¢Y´²®ªbÞûûøÄw¶ 1,UX®ØXÓ¬ötÉ™ªF5Ž*‡h(.0‘ñi¼z#ˆ@@˜?ÛƒKÐæwŽã8Žã¸?¥nÌz34C3tDGtõˆûnÄ!MX¬XV{FV[º½újÍ"Ñ5ò3é‹Zv˜‰Ò¥ïÕ"!c^ØŒ‹Ð‚*XÃqÇq÷§‰ ‚ˆY1+f%dpÏèÑ;£÷–7ZÞhidkdkd;Àa€ÃÜÆm܆%,a‰¾è‹¾<‰çßŧq_Æî bPÐò Õ³dã #*IÍEBEÈjˆ=ÑÚ75ÞÀÐÂjD úЀ?ÇqÇq’0î.Œ¦Ûb#?'?'?w.ý\ú¹ôüEù‹òµ¾Ûúnë»î'ÜO¸Ÿ`Á,˜SsjNÍÁÀÀxþõ}ê÷y¸xÔBEiëjQMzáîÊÕV¨¤nt7î³£Lf0\£R²žÎ']Q(ŸœÊqÇq÷ PPPE–"K‘Eº“î¤{ryryrùýÄû‰÷¿5þÖøÛA‚Ñö´=mÏö±}l–a–ñºª‡ÃûI±CH@¢=<ª÷Èýúe÷«[ÖæBBv?E,û™é¾Õ¨T›)2$k© äP€ñwŽã8Žã¸O@؃=؃îèŽî8‚#8r2îdÜɸi´@Ú®G»ízx¸{¸{¸³1l CI"Iä÷×÷©ï«Öã>RD7ÉH"A> ¤xD•}%•Óùr_Å6Vl|Dj¯>D´€¶#¥ÊWi@ÌcÜ9Žã8Žã> ¨@……²PŠoð ¾I,O,O,¿½øöâÛ‹u.ë\Ö¹<°çÀž{âü€xÄ+;ý¼®ê_اî¸Ác<§ ˆ9I‚"¨” ¨ ­+’¶¢¦«ù©œ¤wôú¨ç¨žP¾j4Ù Žã8Žã¸O@d¨Bªèº‡îêª^8sáÌ…3¥J/”^ð½æ{Í÷šãLÇ™Ž3™˜‰™˜¼ /È ^Wõ¯ìSwÜ«!‡œíD KEj!+ ª,ªiŒ¹BŽè€Æ¢^ämk¹C»Bú½ð"r_¡ ?ÇqÇqŸL5ªQ­Ø­Ø­Ø-ÔUMYž²uÇ›ÈÂ%¬(>Sy°æœb‘¼L~‰D’Q¤‡è,ù†¨†jÔH~qŸNZ Žã8Žã¸OL¨«úRñRñRSOòKòKò»ëz×õî-óÆæ-FêŒÔ§…­Ø*vSœTœdZh‹¶è†Ôð4‘%Ÿ%éóÀ\–ßÚTŒ¬ú¾ê¢ì†<ƒôÆq,"it>Q5š¡i¥vAù‚E žü`pÇqÇ}bucÖÝà7LÇtL>KÏÒsa¹á¹á.FíŒÚUÜo˜Ô0IÃKÃYÙvÁ Ì@LÇtñ&üëø<Ù:Ûb/».,t¨h\õmÕ ™ª¼ mIŽ)“Ö¤P¿¥ú$5e&2~hÈÅpÇqÇ}B]ÕF¬k„]Ø…ëé­Ó[gYï·cÜ÷‰ÙîÙîQ&˜| ßaóæ H+ô@ §?ÐЙ7Þ_ÇçqÿšÆ]¨C¢Â!•ºÕ­jfÉÎ*æá!‡@P²‘x˜,–vTÿ?  šðG1ÇqÇqŸ…0î> ³0‹œ#çà\Ù±²c‰qâÅÄ‹Oš4mÛ´m ·HO¤gIñäÖA)Ô ÆK2ý•|–ìé¬Nà66Bùûþ¤ÕkªjäSåËÁR˜´+ùÖð°ÆqµíЀ H_âŽPe"PÔ@?0ÇqÇqŸÅr,G> (ÿ úAU¼4miÚ·hŒÆlLEIE‰Š9˜L‹904A’x£}É -âݘNt1ÃÒ×NžÒ÷*“/4›±åI!:w/ŒŒë:\Øœ¡—±íáÍã8Žã8î³ ÿMVƒŒÿÏ­y¦¿œÏóø#E(ÃQôGVŒå8øöByÛJ/P„blª"YÃKì¨òLòŠŸ¨9Óƒ*º‘è¶üpÇqÇ} RHAQjä#hH½©7ÆÑF´Æ krå–Ü_Æg •QF®§ãJ`)$¯7—¡²{D€°—°Ð°TuTÑÕÎSk.žS¥"‹“Gc5:Á=ùAá8Žã8Žûl*Pñ°d8à© ài5¿µ%÷ðyî¢``Pƒ Dx‹ T½›ôaf• ­ˆ Ø¤(Ñ,P5UYªë+é¬j9Pãdqç8Žã8Žã¸ß¢ò¿ù1O+üªÚPAkÈ^¢…†¶8YtQËBm—¸§2ŸÌ2t$ž8‚8ž^†ã8Žã8Žã>ö?Š[Ê›_~­²€Vð›±µ,Os¹jSñ)Ým’yª#…mÈi B?$ÇqÇq÷kÿ£Žû«Í¥-?ì@)ì`¡xÂ^3IšÊM•uZ5jëÅÂ6d1áYe8Žã8Žã8î7}ÎŽ{J¨ï:}x_5Úd"úÈ™b6{† j!*±zk$£U{(7º…áè ÇqÇqÇýÚçì¸×BñK5Ôwq—«»Â›õ@(«e³ØÔˆ’E6ÚÔÜTƒ”]üL£ÚPƒ˜Žã8Žã8Ž«ësvÜ“ðEÂbå\ÙuÙÃòëUy5E¢~ô íUÅ;ÅÃ0 µÍBg]áÊtÐþ°ú7å8Žã8Žã8®Þùœ÷Ÿ‘…·ÂbõY/E‹‚«~U*Í©Y(üÙ)½žê'Ôæ¢Õ¨eÙ 7Ì Ï ÇqÇqÇÕõ9;îáx‰×B1¦Êá²Ý²³oåå+ˆ‚EijgmLÒ5Ϫ§ÐÙ¤‘°D„à´G˜ñÃqÇqÇqu}ÆŽ;{Œ< ŘjnÈ£·ŠgU-­Ñ€ŒD‘vP•ç+– •æªý,¹©RLP9h ˜ðÃqÇqÇqu}Î÷‡x…w0ƒÔkÄòbÅÝ÷G>ì©îM&½1‰ fI:M$šªaâ3"P[aŠ*qƒ1tùá8Žã8Žã¸º>gÇ=oðž4ÃÌ@.áf¡]ezµ¡CdR¶ÜÐRCE²MrXôX”«Ì@Ó V0â†ã8Žã8Žãêú¼“S3ñ–ê- ˆ¡òÎçÃ*U€†ÐYs…¡âýVꕪaâ1¢8jª|•Ì`È ÇqÇqÇÕ¥ò÷ý¯P@“H*È+Y-LÞ•o©š‚|rýÙAV­q^í½jº4@,S©T¾Ê&F?÷`£p? Ë¥ªíkÒa\û³Ì€ö#>ä5œC=iGÉOÊ~P8Žã8Žã8î_}þŽûhv÷…å’¢ê!µäú5“dÉ¢­¤7©… áˆ7š+Í•¸ñƒÁqÇqÇq¿ç³wÜ‚‹ˆK²«†Õ4¯XT;IC7“žD1!Íx½´@âËÇqÇqÇýžÏ?â>?!VX.u©¾V[òánÍYYO:¶%/<ÄsÃá%øÁà8Žã8Žã¸ßóùGÜGâ<»Uˆ@KžWu« ©È­í+{AùŠTˆÁSão¥¶’Óü`pÇqÇqÜïùü#îCÙiܪ¢ï­ú±ælùÀÚE¨%#ˆ:À"Y’ñZÍ-’#ÊÈ €‚OQå8Žã8Žã¸ºT>÷`>؉‹d Nc^éîê¯j”©nXk1½Nzrg5Z»™ô!\P]èCjÊbLÇqÇqÇøtÜŠëx(’Ò‡ä+™†BÌDy5²[Ñ!Õ¢‘eÐT£P²w‘bœ@ 2!…*¨@-dü qÇqÇqÜçqJTCbPˆ V¾­ö˜:ë°¸$ñTqÙ¨9‹nÐdŽo°ËÐ<Ï ÇqÇqÇ)ý?¦õnKt}—IEND®B`‚routino-3.4.3/doc/html/example4.png 644 233 144 204063 11541143743 12376 0‰PNG  IHDRôA^#X oFFs6È *8 pHYs  ÒÝ~ü vpAgŽÌdKž€IDATxÚìÝuXÉö7ðoµŒà’ $ˆwwwwwwWâîîîîîîî#à2Ú]ï3ÙKÞ{÷wwォ9Ÿ}žlÓSÓ3œž†Cõ©*B!„Í0TEI¬ÁU<Ðf‘H¦.׋{ç>×{u9¸S®^¾)î§a4ù›}Í=ÔÎ|;‰Ñh/Õ;³#,‰§ Ùǯ?z¯ò¾#Oï½Õ¤Õ0U1—fWqcà€B(Ë/ =f¢?öà D`P ‚SàɃQ!„òƒò…+œ †œBà}Íe¾SÞ«Š5ÌU²çú¢cƒ³x+Îi:-ß`©®Œ5WÆ+³µ‹Ä!B7–AÊ!Å^ˆy›5&tŽÿ•ÜO<YžJ¯ìGÞ@¨Ä¦³JjFÞŸµï§$žü(q'„BÈçÿO Eá8›Äò©5øX~ÏÖ$sFw/ç‹—•©ïZ§Àü²y»r:¥;`-n¨oªf½©úñ :®ï¦ñ¶¾°LT¦žŸúnî—¯çœwË¥ŒE>ZãÄ8±qj6u%W¸ƒ0‰0À3¬P('¿%î„BùQ100è A„XÙ.$ã{Àr MÌ?£º­a‘¯YZû¬è½¦X«œÁ­:æÝXU“Q `WªéE>³+¬§&“üTêjm¯|ä§·ÞzÒ'òÅbçëž¾¾uó>›í/øO±™XyTæ~Ü„"HDR B€*T:-äç?°„B!Dƒ ŽE–ˆ±hÃ*³íl¢:™ï㊭aÙÚÙŠø¹l[¾bþÃ5ÞÖöÞ͆‹Ñ SiÓ:söa覉w¸£«—0$e§Ñ}S‰‡gÞtŸýêœÇ¾¿KÈc;Žxž}`}”Ç|‡>ØŒƒ!B€ ¥ïä_¡ÄB!ä_±õÄa…"4b ˜3 |Ÿ¨ƒ7›ñºÞŽ<Õ³-î[&1´P©|YZdŒÔyª)­”¹Š¥Žn®ä,žJÈc¤¶ñkÓF™«ÍÕ]ëúôðÆ~w«¼ø.6¾nÒNÛK ŽÌ÷Õç¼– 3&a5Üž©Q9 @‰;!„BÈÿE "L°BÁd4@%á=‹Ãnu¿Ä€ä)­­2ä_cΰîe»å]™g W —ã8eݧl6„[XGhüÅ¢ý×#É÷¹¡yî´4ßõOOj˜*XŠZÚ^Pä‚/[£„©Åù6LÀ~œ†2$[1B!„Bþ[M¼ tÐ žpº²fÌ9}·rú­Ú·ÜËÖÎÿâÝÊ¡ÆñœO[ÕEU}ÂäöýR^IisóI3;Vç|ÊÎcž¼êŸØäPÏBB>èokFÉ'ì/5ÓQŽ]†‚ëð„´!B¤“ðc !„Bȯ¥f(P`ÂRŒÛ0ovNÙÅóë¶&™Ö¹r>Ý[.Þ7·¹÷²b5C.¸^vP5Û,åÕ̓•Ìê ~R·Y³VÊ\(|±xä€/óv\­üøôþÀÇ7"–ÙŽÃrc4²9ÌÈnªgøSˆÙ8†Ë @€•†´þ((q'„BùO¥Òš îpÅmôF}¡Û„Ñêk‰[ÃÜ7¼?z$ö©[*(´|çÌù;d‹×ÜÖ¼WYæ›ô–eÖ·jm£Ÿ¯ó’·œ³a‡;½jø1mn³«Cžì?WóÕô÷öœMŽm¼óFqÀcÍ^‹o²OnÉ©"þï‹wB!„ÿGh!#&XX'<ÀNÁ…½bS”ù¼ `kR¼|VÅwÐ2et¡h<>çâÌ2“ÅYì„ÑÉpÙ\EhÆ¢ÐO³V›_fÝ`=¤LÝøàQñHŸÅ[®üà^ÌÇ_òÙŽÃ8sÀUÔã;p™?GWÌÄ+|ÆWZæéïŠwB!„ÿµô©si#Pe!ìÌËòæü †a«­a³9C³ÖðºÔ Ð<Õ»ðùp«f,aº`í$dŠ1hvèÍóÔaF“¥ã¶BLo´¿öäIÃÇæ¨|_m=ú‘I¤elûÀ®*ÎÊ%’×T嘆àø#ðNË_%î„B!¿%[¶e›£] "[ƒ8œF)ÜÄîJ˜©É(õ•ü›ÜÏW<{âé¥6åö)¸0ÓG׀ꦜN+`zjɪ §Šµ…}ÚFšÈ¸â)« á«f^ž|?tq¾Ëã?x(Oÿ¿×‰ÒÈa¸‚§ö’[ÿ;•ÓB!„òohÒÍ 35QF<ËÌl\ú&âkq“8ºoÛÒ•óžåx´Y Χ ë²WY–¡ýÞÔkc×·m¦öÔ6wZÑcó6Ü|´ëu]g2Díün Ï@ŸÀ–y}óî±M*!3³¯ÌÏì/ÀÒýK!„BùYé“flDkTgïÀq)}CŸƒ.*®WéráI_öl³ói»ús>v|«ÛIiWR ß4rÎùË7œs›sÎçXÍzê0Hb¢#`¸íhÒja,‹Å#LD/û 8@™NÈ_…ˆ‚È|F"R쳓B!„߇­på8ž#³0k0-QKJD6&i–q¾yÞ¥oÖFÛáôäT¤Ur’>J¡œÝó¤âo+¦ZjjGꊥå1Þ26ŠÊ¢Z¸±ÒŒÄëo_uÝäøÌP;;::+ïŸ'¾M剕 L½° çp‹@86²p”BH¸€‡ˆG* öê|*¦!„B!äg¥ïB!Cf'‘Š‹ì¢°#}Ã¥½;U,½á} ®7 ¼”›sξãœó›[8çü݃£>›ý8vµ¡•óYz\y¾k`禇†n,ß¿ ¯ûCÇ úÆé&gÏXsvVÜ´ïÒA†Dݹºˆ¾¹¼YÚoØaicm€b„nâ >Rh!„Bþ0¶¤Y„A¨Çn°L¨‚T˜|dï¼ø|«Å9e-ÕÇŽlmî8Ó³ü‡VNÄ:Ë¥%ºàÒüÑè3^ÒÀó'¬KÝ­¯åÔÒq£4MøˆAbîˆå±ã“‚—å¸ÝîÕÅú»_1¥“_¥õ·½¬˜‡dÍ•| }x‚·ˆD,íK<ÑÀÖ?öC‘ÅÇ#³Kì»Ïqï“<±=Ð °;)4„B!DX`…*ø°%ˆW?óÞp›0°S—2eÆÏíi)Õú3ùHržh]ìsËb/»NߺÀk½xE÷µ÷š²ÍòÞl³@žàÌzW ì´pS.KN¥¼z—Э’׈‹"•KE¬‹ÛŸâ¼èÊõÚÏ^o›ø°Äéh¿$]н&^pD6ð7,ŸG.û{³Ý þ÷W`¥ÿbïö³àƒ-˜F1!„Bù3`õ™ˆ Ø€^È”µ•Ïu·\©N¾êçm}&¢¯‰óÛí‡'LìÚ9±lW@½ôÏÍ×È·¤ç›ÅSä,{>¥ò¸–í¶p>ung³Ú-¬pû¥©uÇ·‰â|âüó8ŸÞ±ë­—E®k6*­’±p¢s‚n²Ö'ýѤÅBöÉXŒÑö]zÈèýžÄÜZŸúJ¾y{8ñ&„Ù„ XðmQB!„ò»² u†3\…CB^Æxy~×–Œx¯ò‚Â%óžñIc÷x}\u<¹b·‰³:®—ZÆxË,‰ „‚¬{Á#äó…”¡†zGÏ<ÿúnýÃëFQ®hÊ ¼ÍžâyÊu¯Ë§aúwVsk>S¬ù“¥Œ÷n§/ú]•å -¾ƒ[Zòo ª+†J®âæÈ ŸÒ®&v566Â4Å%v ØÀ¾ J€á<î!)H£­¿¹F)ù7°m³æ‰Š !„BÈK\*œf»àWx–*ºÝïsRë3Çû1_<Û®_yίØ9²Î™üž¶ö, G¤ýÉa¨ ÂV «Šyh—þÈ…îgvó.5ïKÝÒ¥'%Ÿ7·½Àù”3óª9ÃZ·vzìʶ^jDØŽîœOoßµóóÎ5M{Œt¯Ø¦P£ŒÃÇ;Nýî}^f/Y+viñؾKO[3w•hjn¡<«ÊDŠ !„BÈ@€† èŒòB_vqÐÀÚ#B«ßçüv­a畳s (ñ¨ø†IN9yèÏhv³Ì{™^`ôÐþ4/»$è Ad]q[žì +–þ³Wΰíå×z;ËÌùÒadZëIœOKíZŽg ëÖþxʧ1qmŽp>éiÇiœO=ßeÀûiÃʵôš«üž‚k¼õÎåö§?š˜fM0 uQÁð†'DûL94áøÿÆ ” ù ±Z–²A,Å„B!äÂŽ±º¸bÛ.164Ô¿œºà¢yÐóÙSúlæìFöaY[>¬êÛž‚K:Ñ•=¶/äôÏdˆ?í÷CFd>±•¬"kŽÁø.‰ÏùÀgJ†’3kÖ*S²bÌ“QwÚå|Z….½­µ'ÌlßÔ6öyÛÂꃰ  s>5²K¦×[/j>qèþòÁ¶fÊíVßùhú£ >b¹àÎr"æûoRøÿBX“ê.Å}í!Žf+XYŠ !„BÈïÊÐØ6…ì# fÞ¬0+~vͼÓÍ*së僊òÖW—n|¥îbs‹1Cu‹dEÔ 5Xe<ÂN þE¯"¤ëÿî„’ÈÇ*`& SXK¦Kß0‡ÆlnW¦¬ù¹„!¶ÿh—6•8Ÿªë|€ó‰3;¬Km1Ö¯ÍcÎ'vê0ˆóéJ·ᮃ½š]ïWµz17 F]\ú£I+…ž,0ì»iÅÖÿȼˆºÇKŸ´m‹åØyÖ‚bB!„ò;I×ÿ,¹ˆÁ,Ù¶Ý`k¹/!Ó•Ê—ƒç(ÏÏŽï׌óËs¬^¶„gÐ2[!;ÛÁ´?‡ý¯+ÿ£Ÿ^Y(’Ŭ¬ŒéúÕvá¼pF‰ZÝKîyß`Ø×–Ç8Ÿ>¹ë ¥û„ËíÛ¦å[¿ÍcÎ'å蘋ó)aË¿_0Œ·Ê:L(o*8+K,.–ï^vcëŒsXŒüÈ{÷±}`+ù¿­9Ò¸OùÞöˆMcá¬Õ!B!„üNÀ±R¸"$%Xmd×ünæYY¾õîu%~Ðmίfô~_ð”I ÆÙŸ4”yb¾½¢]í9-£”®Ì¦ !·Ìò ŠMÂ>ŒJß0Gu¯Šy'Õ®¶«X¹¨“#»´>Æù”AKóësw–¶}쬶eo˜{û…œO_ÑuãëOƒ5=&¥r¯"ü:lH4q;Á*°'̯í»4öžrÑmǾ•<ág¸ˆo™M¡˜B!„üæl©©HÂ%Á›·ín٧ʽܵ9¿Ã†Ç™¼O-è3ØTíbð ·¢Õreõ½†3XžÂK!'«è¾ØüÙ*ãµ!ঠ8™ÝeÍÒ7ñÑ»Tp\3±L5c1ˇÃö·¬Âùt§®9Ÿx¬Ã¾”c.¶™Êù¤â]9ŸVªËÃÈÉCÛ´˜:êxålE:û^s¹ã¨¤?š8‚E°ø„ èŠÒÈ?Jáÿ…£•Û¤Uµ×‰wØ{Ö®ÐCG‘!„Bù 9AÓÑUY1GMç*ß~³dÇú®Ù•ñçžõS8¿9lhâÆ c\j%²Êl2Û"¬$VK1 ów˜¾'ÞpÚ²fÌ•¥â.&§oèï¡wy7Õ­FæâSÃOÛ"óiãºÜR„åjÊoì¡¶^ê–°=‚8ŸúºKÖÈþÃ*´ñS‡„”·cÂÛlà/ÃÞuÐp>}W7¼90¤Aóv‹>Öï\¶d ca·6ê“°aí_¥Û´M8ç-ÌœO1už‘°eL|ÛøÙUj)Õ6ÏlŸ«žŸÓÍÁeÌa;‰Ý耒(`àÇØúØ¿_Xã.>\G8WD¶ܦˉB!ä7Ñ*tg§kÛ1£oO¹ÂdÎï\iY}¦nß_3éÞ›{<*9F²ø„élËŠ½p„þO5‘búršŠÈ…lì®3±+}Ã@xÞwóñµb¶B%#jyÙ"Œó)w;ã|âÓŒÑV°,˜¹ÊùôÚ]Ì_2Ž k3pÁ¥º7JÎä¥õønÊraˈ=Â0Ö™ùÛwÙ{ú{—Ó„; Û¼NPxÆõìaå™@×!„BÈÿ˜ acX6ìE*Na@¶“~Áî ·ß7Àôöôà>1œß 1l視»ŠMgãXY$IbVv9ÿߣl/b`¸Qè$AÈÀ¥oâÑÇá½îËä U •|õpÐäf#8Ÿv·kiÎ'îì°%¥ö˜ƒm6ð aóÚßà|Ú󮞱Fh£]R/¹l™ìý3ìq[œþhb?ö„õÇ< B%ä@柶þÝ||1­ÕÓüMý^xÙ×µÖ±±¬]Y„B!ÿ3é&m&°èo%%›‹Ž-P{ç×</R^j4°üÿ3»ÔͼÈ{‰kSvÕÃflÁ_.ý§ÔY(ÌÊÁ,ìgEð }CωNC6Œ}\9ªH×w¡ÃV¶ ã|z`Wj {Û¡¡!pìÁ¶þÖé6´ïÈùÔžÄ?ËÚ5šÓ½öÐ’ y¸ïñŒÞß½n±6Ì[X ¤bË1[%º­(h<ê ‚xRбºŽÓ;jëôžYºp¾ùÏ– X×ä=çÓºŽæ|r¥ŽWRnyÓæ¤2fºöy9Ÿ6»Ë•¤c»·}´Ñ·Ù«JÓòÝÍT+ÞôG6²Šˆb¥°SQ ÁÈò§ØÊ_ÏxÙ-²cÅÂÁûíÛ"ôeOèZ#„Bù ÿèKÖ 2+oÛn^¬ò ÜÙ8¿Rdp!eê¹ùýÒœ9Û¿i¹Üæd¹ok#ºíØ·2s¥P[✮?žÇma++Èô ]o8ŒÕÅ è^f{>ト~?à|Ú­.IœOìÝa—¡úØ—mËZöO(ØÞó)‡:0¡s‡«|U)7¦ø®€¾ß%ñ؀Ȣ+ÛΪc,êÿTNóçØÊùì°z¶(—Ó϶GöÖ°dºâ!„Bþ¬óÅv„5Äu}í¹û7«?µí§nºÚxpeί4çèëYU›ìí÷²j¸h²æËýØAüiX+þðÆeôBC!€ámú†J:µsèÚõSñ#y–<Ÿ8pLÓ4Χd휓óÉ—;UO Û¾MšùùøyíÆs>½k×b WÇÎm´IÓ<¥S¹'û´ö(f;š0^ðbÅ~>ûg˜'žóY)ÝÏ?XÎ1ßÛû”22 ë…@d€}Z!„B~5oxÂUl'Lbýl;zièWðç·¶ »f>yêYŸÃ¦Ûç› l_À;Ç~ï戫èÁ޳¸ž~âHò/¤Ø„=˜--:°ëß5i¯©,Ïíߢ̇ükï_ìÔh*çÓwtç|âå'S£Ç¶h++½'Üjߎó)}:ëÇ'ŒêPbí¦&O+$o™åŒOPú£±6؉‘‚޹àV jÚøÝ¶2Îgzv«0ÝrææýA#3ž(r³±0”Y°A½Ã³# ûp/èB!„ò‹¸Á :€LG>–Î’Cí¢;ÇV­j³.`^¦µN¥æN´}çßìp'[¿= Æž]&4c»¯U?óGXƒ¸ *8…ógÙúá988$ÈÙD<ÂV GVH\„ m Ýç8öÑó¦OBy úw/”gYîbs»œÔXµ¶q ¹ˆu©PPèÀ kÚéDÍÃmÓWkÙ=מn{gZÚñ–Ï ó5ç7¾Ú_6jÁUа ¬…ò’WåÛ‘„D$Ú¶Z @ý ¿kΧ/è*/Knðª¬Ù¾+¡pÅ8ÔBYúTB!„ü"éú_¶_lÛãFwì_úç7Ä!Ÿ”zç—÷Ÿ{ûè—Þoò½È~Æ{(v 7‚D?¡;E!üÄßV^¡ç²D6%}çŽÚ÷š‘½ò•Z’Ïçq³~Ïïå|jB—+œOÝñcŠyŒ¹Í}kï ÙÛÝã|šW—ni]Æ·nß~ë –9«Ì*R1s¯$€Æ~–±øÊ†á.Ö£.r#ð§­¿U?<çÓ‚:¿ßz¨e¾*ËXëÆ°PŸ>„B!¿kÎúÄþˆÕ pàüúâ!Q³ÆôŠ®ØÀÖ^Ê"æûil¡ éo°ºç|ÀÀ …øm„[†hœCØ,曾¡Ãí­ØëZÉðИû7û&6žÍù´O]Ý8ŸT¡cãÎqÓÛž2—ß­Ý Î§ììd°^š¸£ãõÍš¶«˜¯ü‰ìõý_~÷ºs‘+² ¬Æ¡>*Ù÷KÿË)&%@=ÊUhk^ŠÅ-buk+³2äDFxÐÙ'„Bù7l½¬Ù_ñƒàÅBÔ`ñƒýš=+<ÛËݯµKC¥sòi#Kó¥AêÝâÖS7¶ã%¶¢§õšò’w@/¼‚ŒT`¡pþWlÅ3&(PlI<ïoTV2sOî†ýhšÂ0v«ÓüMM~Kq ½v4}ø$ÜR3.ävÏÞõŠçÏõ DD¦UîYpM4 Ì8Å0Å\ƒ5f—p°ýŽÂIÙc›¶ÊÝ*Ë«ý×_Tù ,z{Ýï™×õo}*­€—çÛ…<ÁDx²wاÆò{p…Ö^H£‚Cÿ‹ ¸:yiÇ”‹gzèê?qè¯uÓ”°ÿU`  ³O!„òo10!Q¨ÄÚà)Ö Aðë,<û'µ8Óÿ¾eÇ™1}p~kû°… 6¯\ôŒý)V6àd àïD÷­0c ÆH]„êìèÿ×j1µ ,T;äÙù]}ëç|ê².o8ŸÜ½ãÇ´cç´ ²†Lj÷’ó):%YOOìÒqÏ:¥iÏŠ ËÌæ{é»FI,Eofb\ÅNtAûÿÑÀVŒ¿CEçÏšIrSùª0€m°•Ô³ð€3_B!„Ÿ¥ Ñ–„ñ¡ü.¯ŠÜèŒý£ŒmâŠåwÞæxRË¡(=±è僯Í×_;æû¤sÅLgŽÈÂ*À3¬È߉Xíå4ôÆdëFõoÀ&à vNà8‚£8ŒI[ßÜ=ò"W•ëÚßиã¶çr\®ø>\;ý>­£|B|. ‘¦š}L­,­=­^Ö€B¡È Ô³vÔØ²}yËŠ•“KgË–Û/7¿†^Xµ܌R(€CØ/dWYg¸À®öwõ‹WlÄe^Ï)I³[r–Æ·þ ¸Ã‘Î/!„BÈ¿`ë-5Ã……³øÀµ¼0ºvË)ûÎo·£z…œnÊÓ´ê– y°ØcÙÐýÓœ×%mNS„×b(«¡šx_Îí¥ä÷”>æf˜aæaE Õ õP ÇqSHb›Ykëtë¶½ëíUÚ®v$o“;/:\Éû~ÞW¦ù¬9¡i§}©»¬™ö6Íh\ʪ§¹y÷|ëO+mëV ݹªu½ªŸŠ7ÊêìÓÁˆÆtå/Å×ËX(°¸ÕhŠüÈ1Ý2O?ÓÏx¥°iíŸÞi¬§T*Øwñç½'>oK®œ–—uÁy,â«Q}éüB!„|Ç6sH4Ai!7ÛÊLj_.sýá3•¨PnW¶ƒ<·%“õþÓ1ùÊ’»–ÜtÄÒÅÊ”ãü /ˆmƒå8A“>þ騿‰7À+Ë€˜,ô`Áì±2™—àÛj¥²–-¢ \ÊÕíF¿àÍëgëï3 P)yL=,û¬~ÂÏÎÈQšLÒkŒÇwhŸ”Œü²ÚóΗŸÏ+¯}hd?V!Ù1Ö@©Ã×ñ4 ÇNœ´lµ¦›bR)4áTûÉWÇ n/ù_sïhÿð°)¸ƒÕtî!„B~ޏG¸ÅìÉ\­z%[Õ4•»œkÐcs›Ó û–áüÆ™¡–Fîåç„̳µaF6ïìOfèœäÿ–þ̸@-¦¡J²û°à,(oÛƒú š•²¡Þ½<³³e¼r¬ÇüúOy¡Ior>µPçɆcÕ¶5ŒI㎷ýÊùôr]3¥ö_ }ÍÝA­Tý\ìcÖ¡>ÑÎ2­ýe“p=„.¬=ó’}‚K LRK¢_¥ï- ÓÄKÌ•´¿Å,pú6K%!„B±ÓB ϰ=ÕNª¿*”f“3´O‹¢E‹È^ÂV—ôiòÔó)׋½s?ö躡j±­HS?q †@ L°PuûŸVúû I0À„0œÂ->2Ê£/ª£´”C¨ÈvΛ»Yô >AâIHÄœw Î ùÒ=cá§9â*|É6Øg B‘ ½S»3hwŠ#Ù¢Æ_r¿ÍÜ wð(ÿ;åç߇. ¿>õiæ+.oê}Zn¯åÙˆò:±+XÃu|1NÁì8~z»œOéÛɘ³V†X×+¶wÈN!Ûè¬B!„Ø¥ë!g¯X7<´m·}]sz¾²œ_ï>ÔÏ|ít‡>Vkÿ+‡Ô­îZÜ5[S[©´XŽ%Rÿ&Ä|X 6c’‰9ã*>¢jØÏx)Xòið,´t¶»£Þ3Î'wëtŠóÉÇ;4e·¼ía£ÿ¸±mp>ÕÐ…™…•ë踽OËŒ•ÏT]šS ÐÿóË ( O8 ‹q)ÃçuŽíXi¨!„BH:¶šã樒,7²ÃW{Gs]vu¯e«BƒùYËn«,—p2ꆟ,p9W„æÌÀÛGß6w WØB«ƒbåeh‰¥¿ åy2‹¶§FóT”Öã¸Ê¶²zÖóÖ—ÖÏûs=¾±¼Ê‡5;ŽÖjdÝ1ëâæK÷ÞýÒ]£Y!×Ò¾×=Ð,68:¿jeTóEùŒk¬oñ´‚Çy÷®u—Ö¬’s]Ö$]6‹<]B*¬Po8{Vqè¥ë`ÚPÍ!„Bˆ­Ý+T飘ŽZ-Ê0îÞ™ÕñÉ{+da޵œÕ‰i;Lwào]Ê}ÇÜ[wàÚa«—2D­ÆV° ¸S¸Š~È¿![]‹-•×C†¤:òVü sÅzLÚ±@öÀìn-oݳðúÍ><Ú~ªyÿü“³Ïéf-Z%Ä¥Rr¶Ÿ¡€ÚCj3$š—£Håodí›qLy¬rãd£pרßýÍç1Àq€¾ÅŸB!ä;\(ÇÎ0O¥¦ú–ïò9ê¹Ç)mhï–«‹ÔEvK ++8UÕ.Ýt¡]Dó»^χDUC V¡!ïǯ ”½·žü½ìóÄà‰è€qÊz^ƒÆXTAQöV\dÞXÏu;<мjY»ÀFõD‰Z{*vªfÄÛ˜WÂaÑG(«™¡û¬QÍkÌ#,/Œ LžæÊÕöfÿäÛô»û!}Ym1Š9!„Bˆ-á–!CD6¸Aá£y$ºµU}Kî‡Wvºu²¸Z(q±ˆiúötmÑ+-X&a»pEèÏbí 4¥ŸÔü½¥/6O†&ÌÂÜãù!¡o3|%¡ ;kìj¾liz,èy»ÈžÕޝu_ü~»f›œIvÖõ×ö–‹›´Ææ 0¿¬ÝAΧøtº>©TV%Rl¯ÂŽã-¶Rä !„B˜·0ËÑ ®^Oþ¡oeë³3Ö~žœßz2lÞ¯~Õ*ݱµG ÛÙ äGNRôÈwÒlÍ„õ˜ è™WXElÀПZåÅë*9Â27?âÚ¡RÍꆉQo|—¸/|Ñ`V¹QöQâN!„™Áž`‰Â¡kgÛ½ôÍ`}µFœ_k5Ø¢¾±ÿËØð##{Ï͞ݷç0–·QIpf+˜…ü¶Ï—DÛaëÃpnßšw„~BËŠs²ŸõW¥ôÏu=¦õ–-CB!„(PÁÅöÂJ¶R™£^ä› ¹„¼ö‰l9§zRˆdõ3–´j¤ºYrí9vÝlñúõcì fbaˆQµ|<÷‚ ",°B¡p’ÁVTc‚Š}`ëp¾˜¿Å5 C±7kÂ,Jaµ˜ºå^/ü°í»ÄÝ¥§ö€¼(Š„BùáMETU³òÙ<­ñçú:5ò.xÒm‘G}”õZò]ãÆ¨ÌŸ+¦8/_ºÕý—Hƒz¢-êáôÐB†&P—(ùeÒ lEIÌÄzEÃçr ÓP¥™#æ¢ï?wîšUc’Œö¯¨àö'Ó|î„BùqÈ!°Ž1|w@BÝCŠùlŸXÓk´yA¼cÚpM7‹ƒ27ç ¿ë)q“–‰ƒ…Æ½š…„¯(e'ÿôY·VX1Gp…Gpå»w§)²AŒÇaC~8C-EB!?8B‹$¤ÂÄ,ìÉr#OžìßémÉ0ö^Ü “ ?'ç~õèŪ/¯ÖT=šéQÔÃd,Wò÷üòà\(ä·ðÄ]„è¼PZ+ÌÇdEWT@ÞQ_;!„B~ IH…IÜ.¼`W•j/Uõ\±wÙ>W}Vòt@~u·)µ‹ðVÿX3mNÓÝË<‹žd0„(ÖˆeWçó@î *­@Oþ÷伞 µ/¥g¢‡æ°4]LæGÑc0Q…ÂD!„¿9°&L­Ø‚í8â¶Ö¹°îøØÖm§½)’¿²'숔Gh}{Écmtù5'ݽ¯cðCÔdÞŸ»@ $JÙÉoGBøÃfÄëÈÇ¥¾â×OúM:—/'’G¤¦±gh؃Ó,B!„üm9ÃÆ|ÙZ%:žŸ®þ¥XÑ€7e?–º8ÛTçkÿäÛriײ×G×\õèÊ%kÅI5s„³ì¯®ø(Piöò[™à ÏÛhœÄâ÷~úºn €a)š *…‰B![:h ¢1*"jU‡sy£tA\?=o7k™÷ªsÒ&ÃAía÷X‡|'Ý.­Ž8rîÙÝÈwÂ1Áƒ•å5ÕK¼ ¬P PO;ù­Ie¾Ì ùøiÒÄ[ÂL—}úje ¢)›Îê²2œ>‰„Bùû!@€f(Â|ÁÀ «®jW¾ºßˆ&½ »¬Ì\ÝU¯f3­R§'4·¯YÛáj”¥©5—5V0 ÕYNnFA §YøÈïC`¹áw~ùH¹„xAvñÕÐܶ?>UQŒÂD!„¿!*T¡!»Å²ó*êNžÛÇêÙÇéiïWå¿©nT÷©ÁÂíqõÞgý^¿9øY®(WÇF!JÕ¨'ø*{];¥ìäw! 7¼à¦á1EÎ)ž ..ºrmÛÃl"ª  …‰B!C¥c•`á·à‰AÝ×;ÿ@àî ³ÖF†±–»Æ,†ÊÕ15Ö캲œ9á2ºá.á  ƒ#̰R ÉïCBx™?å½ù"9«¨W:Çhy?€0ÃYiäÄyúC’B!#îp†Ž`Ÿ0çÉ<9Ó¾ ;œ#û–l|ªÀ!‹_Âè´/šœO¿·rÿU͇1IÄ‘Â[–¦ìSÁ{à E%¿/Apƒ#ÿŒ1ØÄʾl¬“¨Ù)il³(‚&B!„üMh CD<’adï°‡uæû8Ðu¤o‡k<½3l×›Åüò ‘Eyw3¾éÚ±G“ŸœWýÔ®ü 7ó:؃¸„ !€äw' îpâ¯ø8lE²Aèë¼X^!¾°?>EDa"„BÈß„(–ÀJ«‡yyžZh|H„ïýNj‰9{«Ï Ÿ-’pT~*9-{p àñ—WËÞ/ŽM q¬šÆÝø5ˆìÃQ ù]I BäÀJ~ÎÂ+6DZ±ÌÅçX è„ø @WB!ä/¯𢔠 #ض eØ¢¾­åÈÑAð¨ç0MÙžüÐðõøápâèÙ›¶ùÜÇ*!. W;óíp#´¶ÕU)ä÷'±Ó¨‚ì<=q`X¼Cˆä&$Ùf“P‚e§œB!iÎp€Fh%\e¥®²WíUbAhÿQÍ·ÖØ’;‹¥k¼wêÙà¶ßaÉ”îóÖ\|jxn ±Š‚•Âs~‹Ä@¤À@CQÉG°\V pwäCføqß¹¬œ(·EFd„/ˆá|&rÂ(X„BùKÒBÉ6ÿ‹ê®NáÙx"ŠcîmÇ5%Ãôm¤R¨,ÍrÕß_ð8.úùögæ?Æ "sù|€’‘ Õµ“?–T˲Qy/Ù¶P#Õ&Îýô´À|AŒÚAíÌ·£Ê£0‹B!1L0Ã*4dטò¢ÖV?X||¶‘UòöwRk™6Z”J<îM/°9æf©¤#©ËŒ‘Â|ÁÈŠñì|.<ÀÀ¨®üáç䥖ÅÖ¹ÂÜÄ€wãÇœµ4iBSa­pUmƒ^8ˆÖ(‚Ü,B!„üŨàà,¾bž"œGhjêI±“ v¾XjŽðH~$äÜä`1ùö“G5?gØùôlíçNl++ƒ#J{µ$o êk'BRsˆ’‹cÙ@í¦žvž õ”÷hä}’?á#¬¬% !‹B!1Žp€N¨!lcÉêCÞ šc*Êy¹ˆœ?Àw«¹BJ”i ¶J¥ûÃN/oz©ïŇðf(‰üÄ[|D4,°B¥@’?)±®é•ù™ð–E;e„?_Ä›9®Õše‹~š%m0hL‚™¡1ò!§)\„Bù‹p#´ÌO¦ÞP®uôÓÝ–[ÌÕúZÑ·Š›éºÅ¬Ñ:O×=8²óÂÛðB7Æ=}óéšpŽ-E„ú†«oŸñÝ -´Dþ„Ä4ãXk¦c‰Ø'uw:¢É(/× —úˆ­`† ŽÆ,)X„Bù °Õ¢Û&m|ÄÖ ¿ŒÌèÛ=Oƒ»Ÿ†löÊP·­ÙÕUijjËÜ™í¶-»lö·ŒTš±¢ÌÌö¢ú`¥ìäÏFJ±æŒ`zv^ê.µcˆ<]ܧË*]WØ?ÿu‚LøB#„BÈŸœ­=—1 -x1ìȸÜ=³“óà"MO矩®4¤ZHÝ3h3íulÈóeM÷Ÿ¿Û,eýÙë.e8/o_bIJuíäÏDˆÏk8g< •¹°{Ê ~ƒ88ɯ¤AºžÒqнU 1_ !„BþÔÒÍý"YDY¸Ìâ62÷,Sÿu>]¦ÂY.¸G«zk²2×àž¤˜bÃ:lhu}&¡=Š(¥ÔXþ˜•Rvòg$ÄoOi ƒÀ<Ø#5Œ?@N‡±ò±¼¶»ØCè`oUð¦`B!äOƒƒ ›=+gÕ+_TŸl~ÏÝ£úžlV§P.e^JˆÑ,µu¥ß¾B{(îI¿§!o~aì(†¡,ßÏÍhjOý)i'JBܼ´CÆ#óF¸²RMäÕtç%U\¡-* ‚ÑÖˆU?Ü)X„Bù“²-±¤‘{óZ|!t¨ƒ Ãf¶ô/z$Ã@@Ý(µ`eEßÖ|×/açŒM[žßÈŪÀŒ,/Ùa{O=MûHþÄ„Ø\)ËÒV³2Ì žåZÞA%ö¬U¨ÅjØ[UD&¸Q°!„ò'e‚V6—Á9^•ïAsÖñªv ªÓ$Ï'åAê:“»è¥³vòÁ­g~®û:¥®pTôdÕ•<'+•Ç?;!¶uZFƒ#>1#{ª:£F#BŒb«tƒDW!ÕÞ*œ!ÓŠa„BùÓ €¡ ª¢( f‘l*â[:5w—¼¥·‹Z­‡°@¤>â¢HÝ›"ñe—¯98öáG¶ƒÂ|µœò™ß¶‡úÚÉŸÿÃn~§<áà§\P µ™«ïã&×Nc&Ú?Éu°o´ÐPÈ!„ò'¢B»‹ØdµššÀoWN-2(«¾ÖÐòýƒŠZâÓ‚ÌX^­ƒl—gm—ëC¿,‹?š²ÑÍøu8¢•=õ'äOO0A͢泖PZ«'ÄjŒ³]äþË êªÛ[µâëqŽÐPâN!„? "œÃbtPgª¾€_¾oú°p/]7Í3¡¼¸[ž(º>uyìëµ}¥/†¿gÓXNDo‰p€2Í!Cþ*Ó!ÅIÍ–nÍ¥.º3gvPŸÃÇ#¿C5]#[ÞpNÐB¦B!äf+ßµBÊ\Øuôåg‘ +ŠåWä,RûhÙ;ƒ,3’?›°Éò'yü¤KÍ7š'/JëivœÙ|öžE(Æ! FX(œä¯B2ö±öQ‡¥¶¸Z:ÍÒ>1‰áÜëè´9PylÂqœ¡wB!„ü h!C‚'2‹AVIè"ÞgkÇ o·±¨²)e”r„S¼®Å…ƒ7EÎÜqÁýEYqˆ°Š1%«úœß‡&˜)ä¯E2úX=•†iG,o•IB]iÀ­¼ŒkŒ¾Žv\ "Cpáp„/2QÈ!„ò‡±õµa†Uú$šÙëG¥ÏÑîKµ~¡…òòœ5¼ÕL¦z–á쾺 9ÇY×—»±Ã<ÐÒAéÉ¢Ù8|…7&"ÃOóµÓ€Tò"íIjÔ^–cÖ¡xÉê²H˜¸•×v›¥+®9'TÀpƒ zH)d„BùÃpp€Å³0$¨eÔ…ÜÉk—s¼=âCë¤"^b%ž‹W.ëÎËþ‡®~Wäbã{"Ï#kÑŒòð…2DJÙÉ_‘`ð·Ô´ÖOiazf̓0Œ@ËÝÐÌ¥¹V”î±B,€]„€C…ŒB![¹ "[„Î,—z‰·„oõ%÷ËU §£W7ó`ãE‹>Å7m µÂØR«J^Ö0W¼Æ|á‚Ð}„ &X P8É_‘dØcyeUSš7˜Ÿ ŠM ¢ ü•V.šóò!–f[…ƒÔãN!„?ˆ´°3Ð’ïG!^ÞUçTB÷æóM¼‚7\£@’¿:‡¸^–¬7u6ß„¬ /Æ‹a˜Sm9Z4 FöˆMµ·ÕQâNÈ?‰G<â…(D!ш¶oÛRvJÙ !ä¿¡@…*L`‰¬¤òR­Å?øÍ¸Æ¥\ë§U?†lQF›—Yß±åÚò®%÷eyxþ‘)|qô–}Ám5Œ»ñ Ð@¦ªò×'À-´É£ ÇL¾€`–©Åxa>©¾¼Pœ‚«pà/~jKÉ!ìýëÖŠµb­˜™™™™Ýf·ÙmAdAfžÌ“yÚÛ;ÂŽ6Bùõ@#”àC0„‡?ºáÄ0c«WÅJgΓµ£ûYÞÝ£Ö‹Ùü%kjä‚¥»p{,pý0Ëqzh!ÁLuíäï@€&˜R¯XR­³~z> ûpXë"nawœ/ikKÛÛÖF^ä Âܘs³mç©§Bž *V¨X¡b©¥”Pai…¥–fk—­]¶vöö YCÖâF!¿štX.öãøy€Ùfûew?Ým]½YyRÍ⻦N’²¸æu(;Éo}ñ³£çÄ…¥žë‹“ÙH¾—«èL°R É߃½ô%u¥ÕY½ Îóñl,\ÄN²š,$C§Uú)¶6lª¢$…Œ{];@¼$^/IzI/éÅ]â.q— HB!¡PÈÞÞ ^ð¢°Bȯàd¤Á+»…µ¬ê`4ŽßÓÞRr–n§¾ˆ´^Þ§¿¥™ô2ö™í²ëöù¤—á(+‚EJ ÕÊcðñH¦@’¿{âžÒÀZ]QaV›ðdt€RŽl‚PÄCuÖ•²·íƒ²(H!#`°mª#Ôê~—ßåw‘YE½­ÞVoó3ü ?c¨š‚¤PØ!äWHƒ1¿0–ÍW7óüsÙð Y{µìU­mÈ >ÓÔϪ°õÂHÖtæõ%îíˆç›2SÙHÖ…wçg‘ß>1!#ßzÜ››( U3ªGØ0dƒ“ÐHhÂÜÝÂõÓtKím»°’ÈK!#™éÛ*Âr_¹¯Üðø*¾Š¯ÒdÕdÕd•NI§¤Söyf²#;²SØ!äW8‰%舖(IóDNêô߸rþ¹Ã<©/Ž µY¡GO^NŒ _SçPÝû™Y9|Á|µ¹šÂoÁNÐÒÄäïÇž¸'4¿±¬áÍÔã¼=¡r yY~çfÒ¯ÔµµaP˜å¢ÂCy(µm¿^ðzÁë–Ñ–Ñ–ÑRE©¢Tñ~§ûîwzWÿ]ýwõÑ Ñ¿æ¯ùkŠ!„ü"îp^(*leqj$ij”šú%Óöúó*× ®bž’8ÜÍDy–Ô|ŒÛš W-âðœ`ïÙD" qHD LHò÷ó­T¦†y³5ÖrCÙ¤ŽeËY „&Ì^»Iºšoå1íQˆz ððȶi*m*m*ÍÏóóü¼ÐLh&4‹‰‰‰O[š¶4m)‚Œ`¬ÄJ¬¤°BÈ¿¡…"¨€zSmÄe¾ŒG¢ÞÔ£]³–I6+LY§íúDoÜÀ Ü o•·Ê[1Ó1ݾ “ 2…B~– &˜¡½ÙK€êŒÝÍvUº”«PÉ…ùŠûLR§Y%5Æ0(ešyÖ ýÖ§·Âxq^@&ôd>ìAvô£ªvòw¿P‰QÆœægæóЧz÷0–ug¯Ù*—=šIòV{ÛF?…Œ˜aþ¶h6Oà <ñmýë<„‡ðŒÀŒ°NµÀ …B~– œUeÀ^mùx¦¿œaôÀ6‹ÞGoa+ó¦hÄAGÛ]Yööì¹OwoF‚Í`…pS9©ŽáÃìK,QU;ù[ !©ŠÑ`Úe¦X”uì%›Œ~`ì9»xj»Kím›"~2B¾ã OxB„ (4ŠB~7d@8B-žyIþ–kSªFÐqùÞçU2M·LO;oYbYhiÁs+½fì•*øŒh€Á4i‰%ò#`†5~†á i¬y¸õ¼úž‰¬óp‘Å:ç–o‰›\ÀDTgþpã ŒRB!„ü$à+¾²fLƒµ–ÖJJ'—¦ò)`T÷¦¹ºr¿¤ÖqMåÎF-g;[?^ýÂå]ÎØ'‚*œaÑêY5?3¬P)äG `,* òiÃ67×Vz+@%œeÛ¶MœæË=ÅaÐB -ëˆPd¦”ï¸Â®öw+¬°Ò5B!¿+Çæ²¹0qRå”sì ›C‡t_ëS8Où´”×™óǼuO•¼6-m³¿äƒ‘Š·êÇ‹À'c¶áš­Ì†"I~ëS˜mÉ ÈJUSvëBe4ú±-¨ A0;ÅH¯D/#LØÍOá2ÁÎø„ZŒü°l³³Û¬Ã:¬ãq<ŽÇ¡;º£»í] !„ü0q•­õ®Íó]¯#?í´Ö¶0óu37òNˆÄ ¼ ’Ó÷‰ûcYË*Ùá£" ï§›,]{;4”ƒÅz¶6¬7Š!ˆG~h,Ý¢Ú¶ò 4Ð )H¡ºvBù7 juu÷C$Þ ¡H•\÷3y`Šc& ‘Ÿ|—ݺWõäãä6Rˆ0:”ÂX0ßg/„ü8¾ûèǻޙžÈ_µD'Ýq餰ɱ£ì#­²7êÍŠ"ŽüÐÒ§æC1C‰HD¢*¡¼à/û£éS|B!6ð†3߇ŒXˆ؆]¥Y^ôT}ÔÅJ‰”jæàÎy2 ꡤÚE½Â›Ûžòtòòƒù>q¿™ÖÛ8@Vxñ6¼# ÅôK墯ֆuA(²RàÈÍþð·mJ ¥…ÒB&2‘‰ê õ†zƒWäyE{K[í;!„ôš¡2rA†Ám•SIÝæBæì7Ü÷Éy1‡¯ñž©MÏW½Û2r$Žâî«syþˆÂFÈw‰{\|š·Ñ €ÜÕ2¼6æ#AÔ o'K•„öFÝ‘ ¾8òCó†7¼m›Òi‡´ƒ]b—Ø%u¼:^Ï'ò‰|¢½%•ÍBHz"B–‰Cø"CÙ-gíí^Ø©¹Æ@?6áã¾ØCi[>(1mǰ•¬(ñƒ< ià?!ß%î±ESïá6ó…³jâEøT8ˆý½ã}IKØÚ°y(ƒ ù¡¥_9u7vc7b‹X„"¡p…+\)H„ò/(P¡²~Ì÷ˆ)r?ä7†Èµ¥:èËsñO7V<÷úº½ÑEà'hmé>!}ýí×Ä””4A)äàó @ƒâøè´Y»KÎ `¼=–`¼áG !p†3œ!B„L0A…C!ÿB5”D0ï‹ñXê`\á±9.{ŽÁgi›‹E(ƒB?_ÚóòÖâ0îÛŸ¥P];! Xl_˜O(Õx%DyÊk‰EX [¨Ÿy{÷x‡ÎºUp‚dµy>B*˜!€'<á 2d$#ÉTC!ÿ±þ,AÍ¡¾æ–eªéágg`Á iðQF)’asZvkåÇ–ˆY_Üa†à)Þ#•‚Gˆ€7H‚Ñö…u?Ìë¤ö¶ôWJ™+; ðÞêY7½^§«‹¤ÀÌGò@tA^ø"#…ü Ò¯œº™oæ›ñŸñåPåXF–‘ÑÕA!ßãààÂa^£(ò"[îSY=<ÞøïÌXÁi)€x}ÿMøÃ¸— S¯™@V ä+p‹‚Gˆ€p$Á`ûÂ:]-ÀŸ§ä´4Rœ…,Nj~Ù­š~½6 O˜À–ódìÃKä/<)|äå8Ø/¡yÂ!ŽWCl¡àb#!‰ßnBYfª©|i ³ŒµÖ÷]¦¿,=ÅBž•Ç9¯ÐŽIÝ…}Bšõ‘â ôB2ÂÂG~P馃”wÊ;åì;Ä)3•™ÊL.q‰Kö–¾ýaL!?´ FÖx%‚·Â$AlQ.¢`·¬-pÇ:Kðhööq…7Yb§£,LpŒÂ:¡ zD¹¢FRð±‘ð±H¶}a©§PÛ§0GXç°8֌Ղ¢úóKÍôáZGÍYi´xÙš[Q©ÇüÀÒ/«”yð€Žâ(ޢРˆýQNÓ—B°MlªóÝÜŒ-nýœ<µÝJäÊõÎ'3 ©KÔ_N|lij'‘Mbñ¹¬æàëyS00¬£Ÿ¥„ØÜ–¸‹`­¦¬åƒ“ÝL3¬÷aa-Ù[ˆ|8·¸^Ô¥ÉÍ57Ä$Ál»íÏò‹&¼#°HµÀ‹=}×@ †B¾Ó呎ÐBôêævÎaŠÿ/'ý(ĈUÄ#ÏÊ¿k«<.±:æ ;Æj☥¶ã&JÙ IOÀSÄ  fn®P£·š›k@ú0/õ zû91Í=9¯äC>{ËôE5„òc²À ^؃Ӹ[5¶ÈêÌÕðŒUd6ÍTê^^÷Øü9P yÕjêI4¶§û„t<ÄgÄ2+*Ãuù*Þ4ñªñ¬i La¡ÊžÈk8”·ŠÉRcv™eµ?/Δ¸“VºµQÅb ±{Êž²§Êå‹ò…âŸø'{K#Œß¦[%„Ôp´GE~“{c„¶žÆYš–×%`œÛnäb½p&iYj}sê‰ê×c_—Æ ÜÇSµ3?ÍóÛÓ}BH:â#bØ8ö û¡…#œŒiWMaÛ&4P'ó/¨­? ­÷H×…8l^68CGá#?&æÎÜ™}V%ñ†xC¼ÁY"KTN+§•Óü)ÊŸÚ›¦! i1BÈJ€&f-Ù{4ÆX-”Ë{ g]½Þ &~—‡¿üuvZ¯Ïˆ­“"Â3ŒÁrœ¡àò¯.©»x‡(a‹eWaB*Râ¥=7,„§l„:‡7ç³™FØŒç%Vé—ÛŸç ‰ È+Ý`)ÎÃy8€TFeT†|àcoI¥2„™ \$É£‰ëHÇåùzæ˜è½ ·”®JŽ„åqc£×å?$ú"ñq ‘p&X(z„ü3Á~Ó;Þà‹mWZVk´Ú J µŒ°šmC/€D¼G=‡sºÃ2B8眻ëhDÛgs/Žâ(Ž È€ öG©T†òc=™[7¨äuØaP~M`y· (j=g½ùf×ÇàøIŸ;ƵHÍ Px,ÏÃÇRÜù9ö…Ùùv¼Âg„€¡¯Ò]Ù¯ÞVf©Z6ù`ð çÜFëOiîa €Œ8ò#³ NµýÍ+ŽÇŠcY}VŸÕ·ÈÙ"«…ÕÂja{Ó$$!‰"FùØîå7BWtQ'©*ª}¡¯¡û4%Ó©¹7¦‡Ë™úyä4&™,ãå$,Î’¶iÇ»_w]Ô_œÂt‚(àToHÈÏ^^6½øqܱm&U3,‰©;,¯”:â$¡( p¯ÜFévkËSÈI¿6*û¾°/l›Æ¦©[Ô-ễy°½¥ &bEùAØRvœà††(k%׺×ô/—¥¨¡µ|ʵª)¯nU†nR§¢7´ôÇôß*ÚK£-zR ùù‹ Àã^Ù¶S»›W+ýŒm¬.Já>¾²5^ Ê-D7Wö òÝÜoðoxÄ£j¡2!2Ù¥RBÈÖ²çG.ŠnB+6yÑ {ú³&‹˜œ‘IMTãÕpž«¬;Œ;-%ÍFó¥€ÒQin?Â;<Á# $!?ç[ût\ÀÛfJ#s”e„q˜u–²Ÿ]Ù5ñÖE¯Ý(§òtÐÙûà?á>Á 3Ì”²B~ Èmƒõ…Õ‚™eS–«E¸o¹%ùof^6îZ—›¥rY›‰äÞð‚Ø+]víe]]ßNÓZÓYç¢ó´†5Aoô¦pòs¾õ¸OÇ9~:ˆ`©=͇,vÖNÐ3/¼ðá.Ç4Kå2B¾c–šˆD$Ú{Üà'{¯<¥ï„¿7 "˜a "sÕ¢j8?ãñØÕUÿlùŠÁUN»fÒUÊ[ŸÎT°ê"4oOÞ޶׸·^'¿Ž³;Î~!Ýs¸ç`;˜š¦Q‡PP ùù Îf:?ƒ›0"xÊkS[Ë=c' ¬eð‰²O?È_¸TÔÃá-fÀ ª=)I_6@È }:^QжÉò‡ü!\á W衇ž¦†$„üÍÙò…f,Ÿ‡í²ìlÍÂè~c+;äzÒ,ƒ¨ôI˜Êf%–z¹U™ãØÝñüã/g®Ÿ^²gÏú¡ë³`Ï?Æcùv¾‚JÈÏùÖãÞqcbR6ƒ»±rÊS-Ë,€Í*¸…ÇNµ¤ÕâL¤Â3|áúSŸ"!?[R`íX;ÖŽÕd5YMóTóTóTÔAÔAs4GsÄ!q0BÈß­¯½ò"«8GxÇDµ‚ÅÏö,Òðu¡©­+ÕÒä4ª.©3MOÌ|™¸ïAæ/q‚\Q×Ds4å­¹±9Z ®K×…¦ÂráÛºì.p‡;…–Ÿó­Æ½!V`—8Š=bøF^•‡¤›žšá!‡$´Àp‡¦r[ñ °s¸7F`>Š#~Dò^7Bºk§!"¡å¥x)^Êþ¨7¼á *T !äoE„ÁÖ×.¸³Å,A‰T·òm/Ÿ÷9}l×%7Y†šžXf Iú.òˆ»¶-¼ÿñËäx-Oàñ9ktë[k k náÇù·tIˆG<˜Ÿó-ùøˆ$³ñ¬ZÁ ÞðNkcÝ¢T Îs^@.(ŽE—ez³î"ü±ç± ]ј‚H~h H@Œ0ˆ`#Øž¬S‘ !äïG€*TÃbôà_xn>FsKV¤÷«n õ¯¶Êñµc=é•é¼´´¶ðÐÆ7êTîý±XÔÍ”y½³Î}}:ÑÚÈ:ÉçZÚu«Ëõ…š‡EGEGEGÙI?- ùÅ„Ÿ.EŽ“ül;’oZ*›´æk¸ò~©¤¸Ü­«þˆVµ·ŸÏ¢"‘üÐl¿rdȉHDÚ÷‹!Rx!¶Šv'8B/¼XMå­zˆß¨?»ìÒàKýZ¿,ÒÌ:Þ8Ê¢˜3Y}1­çæyÃÎ-‰öŠ˜òÕ+*ãÊŒù¥dižÜÌôÈtÍt,ycòÆäMö#ÓX B~1ữöáì' 3°>Â0^ùr¹¬)”s)£»§ñ¶µa“Pƒ•¤ ’ˆ¼à ,°°þì»%&H#¤B²xU¼*]‘ÆKã…/âVq+bƒhÿ1Œ•Bþ’´!Ù*ÚÙFVw”ê<>2px¦½îñ ÖõkTaµ´âkåR˜ã-݈ùÝveyr(ärΗµØ.V ÷ÜóyLöH‘'Ë}äzÉs“ç'/T’•då[©L"Aa&ä—¾ûê^á“m3ÅÝt² ?Êc‘•·ÆÐ[¨îÒMûY³—q `SPEÌà %ù!Ä!1ȉR(Åð¢¼hâ±Ø;±wÜ:Ws®ö¹ÝÇ«¯ª•ƒÊAÈY Ãßð76BÈ_’­€Å ¬x„Í艶Üݘ–ÉlÄŠ%C&VY˜5Ùßì ð$^åZÔÝ–'Ol°¾á7¡­PMW³«GyA—L.™]²‰/ħâvÃTÃTÃTå°rX9l•(D}ë4$„üß¾ëqçSqñ[ þeiÚ:S4:ñ\â3qÏåOâDa·s>ísy¾ý £P¹)ˆäÇÁÚ°CìŸÅgñYþm‚ ®~£é¦¦› Ï©V-¬zí–oZ¾)y Fæ™ù ~ƒßÀ,ÀŠ!ä/I„cÑÕůBÖ•ßGE|S:•-Óªjr)Ï€ùÖ$cKÖ¯»c×Ñ­ç̱§V¦4Ü2gëÙ§o÷äÝJºuË/7–ËS¥J9d9i9i9i+5¤B~¹ï{ÜWà`ñ !æ êGõq˜…Wâ{¡°Ó¹šF‘ÊŽc0+ŽL ©ÜÉB ‘¤kiK]KÝJ¬QX£°é%gŽ›9îÝð<…Þèýê`‚s‚sÅËî^î^l2ûÄ>qðþ¼?Eò—á4H…fÁ‹-e_•ŠªÌ ÕgÆ\Ï/ž_=cå-òyKÜö¸íqÛÍçÌçÌçìc„îã>îSÈ ù%¾ïq߀[xfÛN2”0eWoò܉Æm|@¢àÆ:uÒ—ì“ܱÁ(ŠDò™‰¾èk[€)­[ R;ÚÚÔÚ4ùhª9ÕüeåœåÜ×QK£–ÂpÀ ÜÅ] !ä/Ã6ác*Œ0³a,ލ}¹ÌïøxµtÙ¿|ÍàO•âô3Ä|„¼Êq¿æÜ*;¡lÍrîã3bE¡?«§úª³yº =ZÙéïï/7“›ÉÍããã-×,×,×ì“ç>óo¹!äß] é-ã—¿ýÕ× M1Æ)ãùBþ ð€“p‡…:)2kÙÛ÷B(üi'ò)€Ò(  0Hïå×òkù†´KÚ%DË9ä:W¹¢\Q÷ÙáÃ;¤! ipCFd¤°Bþ2lóÆ}ÅY„ YmvCZ õ“Ø¢5*GgÙži·óG€}`»o{°.ºèÐÄå+.F±nÌkÔHu$¯wTÃtÔE=Ô³õ©;Ïvží<[v‘]d—¯S¾Nù:…/â‹ø"ÛX ÜÄMܤÀòK|_*³ —q϶?9MoŒU_«kù+¶M¨Â< ²Y,ÊqˆÔSh Äz"ËP± ù1ðe|‡0ÁdŸÚ>µ½±™áœáœ0ã0.iar³äfñÝbæÇÌG]ÜÀ ¼Æc<¦¸BþôÐBFäFf±£p…”çê">}àó¦ù &ÔÏU1$¨¯ÒÜTßrÔèažÅv=0sïI$F%o6Ôf1lÞñ•ðA[wΆ³(Žâ(îÒÏ¥ŸK?ù¶|[¾»4viìRÛ}Köœ=gÏyvžg§ðòëÍF-؇’¸h´+åè¤ä1Û„šŒ¯×nç³*uo¹PSkJñp€#åñÂÁÓ¾ø !?"D±ŸØOì‡R¨Ó³M/>½x„ú&뛬õuõsÔÏ¡Xˆ…âñƒø!„üh }[wB(Ìö3m»Ìµü=²œJ›rÚØÿõÞ¹…ýÖ+¯êé±³Á©BílmĆÂT6…þp‚Ô@ Ô`ÙcfﶘspÎÁ9_]yuåÕ•Ú»j諾ËþÜ{â=ñ…Ÿ_îû„û9b¾-‚`4XCcÊIK¥Šðœ½b+µ”:ßy².T{iHEªº/Pï¢=J¡…’ü(PìË-]ÅqçyÞ„eã¯ùk^‘‹\Ä,ôC?h œnHBþ´l fX¡°¢HÃzµ+?Ã<ƺvqø²\;¸geƒ~”Öƒ‰b]&ÍÒ-!GG½¨¿êî¡®ˆµ…Yl‰2IÍÁM¸‹çø€`Æ.ìÂ.ÊCy¨æ‹æ‹æ‹ËF—.Ój¦ÕL«™–+-WZ.û«ÏÀ Ì “@È/÷}â®üc“¿Ç|L®c¹«œŽãæj¾Ãù±n”&Öá$®ª©ü+ò¢5Š"…’ül¿ä¬°Â g¸Á Ðýü™7Fa6 `oC!N¶{¶Î×0N+Öð8ü"OD»8¿§V|¸è¨LWV)áªYÄЦ˜iÒj;ð"¶ˆ-²ø•t+éVÒIpœC€!À`nnnkÉ·ñm| B~¹ïkܰBµ_N…x%ÌKme)ªŒbgØY6 àCyçÚ‘'ù‚\W®k ·˜,ɬÚ u*’‚í—œ-}OFŒ8ÄA‚V|Å'|Â'¼Å[*’!„ü©9@f(€ðZèÈ^(õÔç|b÷} ÊšÑ)¾¾’§¹"§9™š[ËŠ-äR½tsûŸcŸj}™–”&D…Yc5›*òp€2Ò`„Åv`6Žcã¸Â®8îrÜå¸Ë±¹csÇæiÒ>¤}HíŸÚ?µ?ŽàŽ`æa B~¹ï{Ü °~ëuWžqgÞ$©yе+{Ê>a Žà÷œ^h·Ê¥õZ)N¼ MŸ&…$„BþdH‘ ,l«…jˆúœï(²%×ÂLÏg èqªô<«Ù”ÉœC´8 Öõ›î¸~ÝÍþgGÞ©ÿ&R¼!|f—Õ5jž Xú”Ýn*¦bª­›ÃyŒóç1އ;N±¤XR,ɉɉɉö–C0Cè„òËýÿ‰»åÛÍ}¾”+¼^ÒyS‚¥ò°¶àóÕÏN'5òiÝhy°4f¨àhÂB‘BI!„ü©ÙîZ`…"dbë™ÄËòr¨ìì´PWp­çðWUýœ»8õ“NKŸs¸ó…wá›ÃޝŸvå=Bp5”çêR>S°'íGþ³nè†n¶M‡ãÇŽ;tvèìÐ9µmjÛÔ¶)A)A)Aö5S'ò‰|"B~¹ï÷4X¡Úoñ‡¡J'06ï„ʾ²=0ª§‘ÑÁ*×–žêêJoDû²2¬:rÀBI!„ü©¹ÃzìÄT4g'YS<V B‹Ÿû«ò oõœK2®Wc•£ê›ð·ï’š÷ö˜çyö>ÏÏÏò-,šÝÄ&´ÇDì·÷ÙÿL,ëÏú3ûZÑÍš94sèïÐß¡²w²w²wblblb¬­?žwá]x:-„ürÿân3á M>UäCå½1“‹®¯|3éy‰ýUzVXÙnp‡Ëj.î Wk+5X5 fX…aoY'\ª°Ó̉Mc…pÓÐÕzM.TB!ä7’>¶@Ê>`5*ª]¸ÄoŒÕþEÉeÇ:›i³µ€¥°bÍ×Á¨tUfm8i0N4-¶deöŠFFÔÀLh CüEËÉ#Á¶¾vœÁœq©æRÍ¥š’[É­äNõKõKõ³¯qqq‘–¨#ä¿ã d¡”ØQkÛQ5*аÐs çœ_iÉ9çןrÎù³vœs>¤X;¯ò^¡ A¢W÷ó3ÄÀZb¾´Lœ"d ZÖ‘8„ö‡Eû­¶ÊÝ*w«ÜöWi$4щ"ä×ú~¦4˜aÁ䀸,iarS9UIV¼å%Ö²–ìb/频úÀúÙÔkÖŽîÅK„MXÖrhžÞ‘…¿œJ{v·Èë]q•ϸÝûÍ¥Wž´ütùKýÄxc­¯ú„©ӕƽF?Ô„kBVûò&|-ªð>XÇã:Þcvâ6ãîÃ,öÄžþ6'„B~Ž­L .Ìe&V\í †òu¹ .ö*3ÿHÿ¶KaµrÍ:@ì«?® [$o_¿üvë©çOJ‰y„>l¸ÒG}ÂOá3î#þW¿zADA[Œf’f’f’‡¯‡¯‡¯%Ðh üêùÕó«§­!ŸÄ'ñIØ‹½ØK'_NúûøÀß¶Éz¥Ä¥¼™(ŠÑÊ2¡ è‚æ‚$Í"ÑÅa ª »QϱªË!m‡Ü#\'ës#(À#µ jºäøš¶&yžåÅ«´~I·Ï?Uá¦ü|^´Ç½:¯~5?œõºnt1SIs+Ë8sá`.€œ€¨ ˆ+D+;Ž|"T?>Ÿóåüª#‰Hµ—ÜüÜ<²„BÈÖ²«ààxŽíè…m¸Ë „bL?+´g‰r9½‹y¦éê¨JUõÕ£ã/¤/ÍF}]ÕñR\CK¸¨=ÔA܇‘ w!B„åÿŠúOX dœsι\M®&Wspp°\µ\µ\Mx—ð.á¡a#6b#4B~­•¸'ã,ŽÚ6Õ‚–Åf ë™’7IÖܱ.²Ü’·ËOå- SפíÛ}ÿ¼ç›IEã²=sÊâ³Å³„Óí}Gù v®:Ür.&µÉàh÷áù‘'1ctgXvr9öy|Ë´ª1JÜÈÔÐ"šÆû¯ysEäís‹îtz3?ávÊÓ³¤î©‡LG”î x]z»ýÄV,‘§ðê8® |$w縀æHD*ÌHFÌözB!äÇa›ÙM€ 'á¦Ð†ÝWÃT+s¯Ý¹R§j(ãЄ6m17Kn‚b½çÎîUÊ©´ ¦OB/ö”åQ?ñ>ÆÞ)ö+Sv»ìÈŽìxx!½“ÞI:wuîjycycy;(vPì {˘tÒùµþUâ¾XMRí·®_†í/9k K×Åå&ê«Ø“œ ¼#s$û%º ,X#G×ñ\†¬w=ZiLò~DÂ>ÔÓË£ž.ƒ'<+ë¿äš—}T†-P A• Ö…jxÄœè:©ENkïdzÿìJ×ßU~×þË”T‡Âõ_º$.LÞjp°õÿ{Ï{0¡B[æŒ­èŠÆ¬&÷B¾…'ñ|EØ+ÔCO!äoÈV‰n…UHª°Vª£z‚¯¬*}Ÿ­Àè©¶½«Æ æWÂ] ÍQÂ"é\çËüÁ€wžÂ6O9¥Öã³`å¿ìöòƒül‰»pG¸#Üq¨ëPס®aaa]ì¡ØC±‡PP€Ïçóù| À  Hȯ¹ÜÿÙv<ç>†$ëe%{J'K€rɧ†~¦TÂí ] êÃP û°ÒÜÂZBévºîM„?›^áól‡É »tjŸ«_Ö’î·ò¨Ÿ=ÛY”³c¦J%Có<ð\Ú/Ø)HÒÉÄç€ä"d§ÈÉB†ÈRÄùfêBý{žlÚ;_7CÕ¤óògŸ#ÅÆ?xþúô—È»q¯¯Ç>?ùÞìw±†ßŒÞ‚Ƙ…Ç*8«0Ξ™Wް‹ø(Š UU7¾—àÔk¼8@&ØÔ~KcÛ !„üµØ:¤¬P 23›Šuº†;ùgðÊî¶²ÎÐΕ³iª‹ã[h!;ÉÍ6M:2ñÙæÅ|ïÎ;767”‹êÞÏñŸì“3þ7¿ Ýà7Û¦KˆKˆKˆv¢v¢vbÜǸqS ¤H-`oy'p‚N !¿Ö¿HÜùD~÷1’Lm­™âÃ+S2ƸWs8 E]ÆUo§ºú'¬,ëÆšò¦¼*Ï#”gûY€0LÈ…Û_“ê¥T¿4')â¥9ðVßê¡;,»f=ëãäz¡æ³’w³*¸8»”ákè´€žnÈZŧ¶kY÷ ³fb#$êO9^ã !ÏPï…÷¹oãŽ0¥)›S_¦õ7í~ÿìë¬4ÃÕÏ®|é}ªî­×o’Ì{]'Úûӆ؆²qn‰SýÔÜñ{ Àk…§B«ö|6.ðŠèÍ7ñ0¾W±'ñ ó° ×ðïðõðƒŒBùß²MØ`»‡<]Pp /„áÂ~a˲ƒÛT5tö÷rY¨­Ô>t/—Årxiµ «ÙE–Œ‚< 7 ¢^áCºéþ»ßt*Ôo¿ný+úWô¯ˆ¸ Û¶%lãgùY~Gqô[9.!ä×úW=î q ¬)»MµÍq Ï ²y<ŒB]á&­³ȘGŸOS[*' f&K„r—?Qxy®¨iÊ;x"rÀ—gù!ìe•ÙIlÃ&¬S2«×ø¬´lÆ:–YÏð_aû×þS(FØ#ô.>?÷¿¾Ÿf/Ÿ!OM@ŠÇýü˃Ëû<,|?Gh†P}'&ùb+Ôp|åÚT·:'\ëîäœÍË}]{ÔyÒÌt>õœ5öq¯·;ã·ÝÎýìSTÝ.áÖ¯-ïÇ…Ï rñMÒ—£I>)« ÇÔp @ÌDåosõXÅ)Œã­ù 4Vó}<Vcn¦¿)I B![Š€LðO `.Ê4õ/è-¾•úæÇ(Ù')Â'|ÂCp ~ºìâ¢xþ ÙÎ÷p 3¼áŠ*¨Â¨‹’dÓÐåØ56†=eëÐFÙ«îW—\¿ðØûý’ëxlë¡à<Ôq¦nA¦Åž{²¾•3«¯Pµtу•НÙ”áªÿÇŒã³;Ÿv©½èz ý´ã×JÕ #OXÿÂÈ×Ì»-`-ÃYüÅø† ¸×I ™^üØ/éÃÕ©O{Ä ?¹ûæÄˆI/2Eöÿz<éHÚZË,eª²J9‰Z8ˆó¶÷ L¼X$›Çð–¨+QHmÉð Â%¼´ŠG2ŒÔ7O!ä7”nöa¾`ee•êj¾³Tã¼;37{ªýb•¹†Ææy¢IZ£vtÙã«uofyºûS!ÛÍ$å¡Ú„ϱ­¨ ¬¿M'”g˜g˜g ca,,!%!%!Eí¡öP{@…wBþ3ÿªÇ}ŽãªØ‡Z©ùye59~QÚ;ãUôB„$•qwÞÖe¥&Dœ"M™0Ý4@ øÀú>}}h$b àŽí_ŒÀn.s‰‹°p+–bæ °I8Æü„£¬<Û¤zªÕ‹ÉER3³½@*Œx±çÝõ8lÅI<€@hå ñÞ×Ë;8ùMA§ ö=ò¦MÌ8,äZ–ί\C="Äæ»Ë{¹—sï¤ÝáQL×!¨t@ õÕQbi–kaMÚW,tîÓíØŒÆÍ7‡½È÷Å÷BÉ{¥ßÞ}:èí˸GÏw¼wOðzçõ2¾& @‹ÄÁ€ dn˜É¼ÃÖóz˜Ä¯ð(žãQ°fX Ð<ô„Bþ+éî÷²6Ì ûÔbê¾ßµ£“»¾ðÒ̃ºVj¬«õe „üÒéêÑ£—¯¾uš=c[î›-Ä.Â,6\™ Ê܈è°©0ÂúÛ½Y×P×P×Pa–0K˜•°2aeÂJ„#á¶Á©”¸òŸþøg&X¡â,Ò âDhS*Z*C¤Þä—Q]qLXÁ³!^U:nzƒØ[‰@ê¡<&áîÿŠ×·À žÝC°Qå*çP5¸ÀEtÄ=´be`Äzɶ ¿Ž[¸Ë}x=,@f´À®ÇgÂâKèSƒ¤ýÏŠ¼5}íö S„>þô%Gû>…\½,2Îjr·Üàcy †q@ÇnÜQdU¼+TWÇð>T½Éëñd~’›ÑÐ~kÒ–ÄS=!„_ÂV¢ÙuŸmFVp¾M±ažss…Vù“rθˆç±<¶âÇãIeº˜ÕñÔ4óEK9ë{ÁÀ±…ðG]~ŸµÊ=3xfðÌ ”Êe¢££mE2ì{Á^ð <Ï@§”_Kú¹xãqfÆÖ4´ž‹Z“gsŒ ù 8N(›e£{'—^o ÆÞJÊŽ¡šs` ü‡ï%}kë¥^½¸Î®sp  A„ë!À Îб9¬ ® ®lKb/ÙNîŸZ ¿…g0\¼Uö>a;ÎàùDý íB¹”ÃPÝ iIq<{ü§WiY¤DVC¡þÙ[x¤-ÍáÖ+Së ŸÃ…êòVVø¬{$<πͮÍr Hïñ©Ê[Ô æ6†Š–q-“cź7 Ÿu¸Ûþý©‹·ï_|ùQùZ&õÊûÑû“b,P ©¥0ø6v^8%x°RèÁð˼&à¦ó͸ÉWâ^`6âžã-¾Ð XB!v¶T»"Š#§˜,Ôdƒ‹Ú›7곺qÏ":v®Ÿ;Ï8kCcs h™*äë)϶ž}ò¡IL¹Ä3‚ [ÃÕ[¼.O…hŸ£ý?-²¬°ÂŠ¬ÈŠ¬Î›7;o,‚E°Ä­[·Ö^$³û±-Ð-èÄòký|âÞ'q“ ¾”1Ÿ¹r+9•(æ2è&Ô&±ÞYœ=ÆØÚ³Y¬+ý›ç™¶zÛ¿©0‡ð¯È¯p^˜søÃ®¬/ˆóÂrV„ÅR´‡ŸòBËûf›úY®æš`¹zW¼šzWñ ØŽÍ@¶óþw=·^œÑkMÇ€ÛîÙ‹È}ͯZ!SpýŒ~^í=ë¯,?«Ùì0Ažè³Ùq€Ì}àóÆÉ¡:JÉ™ýEWÊùÍêOC’¯ÜúâIô‰;Õ^4þÜåѽ·=ãç]Ëù¸ÝDŽز “R3h Á[%t1ЈUÂ\Á$Þ„_Bµ.ßɳa%öâ Š%„ŽH0Á «Ä61«²RÍÁÛÙš«k¦s“–ws)énio¬kÞ/¿Ò+šY2¯ìtýæ‰'7r‡w¾ EXU5—:˜_Ѿ¬ÒoóKÚ6ŸŒ¼à…HD"ÒáŠÃ‡+ á„p"öhìÑØ£xŒÇxÌŽ±cìOæÉ<™N/!¿ÖÏ&î¨À×á,€RÀ×*i3MÏLK¬9ÕIÒ.6 ­„Úl§PÎû¥ÓS}}»LGMC œÁßõ;Hÿ·ÂD#‘/â@<‚pÔAäÃFŒEVGNx±{lz²<ì#›‰•|-_QáCÑX‡|@,vmmÍ-y§Ï:³…ƒÆøUr{SÅP´z¶åŽäíâ[8¸¨ÿ=ç¼îç½t9¥÷Å4çù"÷ ìâ?Éih ²¶wÉÜÕw‡d4æNjaš÷ùLlPJ™— f$¼6åiÏ/ÃNL¿Ù5|à‹§‘åb7$L-gnn}¢äUú£4öâ¬íú :fb™€W<—ºEÕüÏi›€˜‹D¤Qßá|eäÛ6“›mxe‹Ð™Y‘Ê›«*ߎ¯Ðâ4€ßv”UOôDOþ„?áOäòy€cNÇœŽ9ÍçÍçÍçSN¦œL9io™9ÃÞ7Où•~¾Ç½và4&@ìgÃ&Ó)ÓëW¥±œ(eú"«ÆR2”Ò×ÖÎ0`CP!ð;'îÿ·T`ÆœÂCû¿¶ïNâ"Öq+W¸Š²èŠ[ÌÌ0½è%,D4dDáŒé°¹§¥adÆÏ=‰ÏHÄYÜy ûŒ Ý'8E”Ï[0&ëÇbÞ!^öåC¶}Úçîø6ÖÌÓ};w¤ÞjqÞá©x: ŽãV·—ÈÒÔýpµ™Å7g©<íOì5"6Òh¼ùäÅî/.¶¼×6rÔ“Áo#â^>÷y·5áUdž¨¬qì?ê€væ¸nû.Ø8憩,?“Ùn^“Oà—ùž£Q­±ÅBÈ_’3ÜáŽdÄ#žÝ20³Uè,ìQ ÖuÒ”ÏÝ •ÿ¿|®Ê^Õ~Æ@s—„3‰§ÍþCf-KºdPzªÕyvá;È|ø3Ô㟟ßlÛÅvñ¯ü+ÿê¶Ûm·Ûní@í@íÀTcª1Õh ²Y‚ìMàÐI&ä?óó‰{7ìâç02²&LH{eÒ˜ó*‹ÕîÌ /&ÀÊ: ¨ëq]ù$\LAsäDf\ù‹Tf§/8¹„ûxÃu| gVUQႼÈDc &³çlZ±JÈ=/ÊÛco‹¸ð¥zü„” »qO°g—¢€ö¬epã,_<]—ùtpN-V6·5Óƒ o vÌ"ltßÝßý¸ó4M”‘R„…€¦—tÌ÷°ï§Ùõá{ͱIý;•-Wv¦Œ·¬‹ˆŒŠIÊò|AäôØŠ—G{xñÜ£þŸÄË/î¼–VÞØÖÒ–Oä õS°GÁA C¼/ÔPÇñh>T½Áëò$~‚ÅBÈŸž­$2ñˆG „ŸPs Zô)ïx¯_Dƒ]9Ž«yS\Tx¤»ïx ×øy«Oº=î~"ú¡Pd’z’WãŸ!C„ËïR`yWp¹‘¹½ yò*ä8Ìq˜ã°¤[I·’nÙò|'ß™~UBȯù!ñ3¸7ƒ¥HC/X?ÝLªbˆ·[N°‰zƒ¼’P„Y¼êèC5¯npeËXeçÕt0ýòðŸ! 8Æpp` ·Ý²<ƒ¡ìe,oq#AXÀá>kÂŽX•ýê¶—ÅÞeüºÍ¶èê ÜÄ›+Óæl2]/åœèà)W(Y;ïâÌç+$|›9*øŒß`—ÜÁ3;¸±Ì¼ ¸,ršâ–Ix)6sª+Ë Wn½r ûuû•KV? ½fŒ±¤Æ%%›f=Ìö&{¼ùlÅ»3Þ?»”|ÿsdâ‡E_ÒÖ½óþ\$iJõ8&8nû†„ÕÌÂB1køM> p ³ùvÜå¶•b×ã(`?Îã)%ô„ò»JߥR…( :¶ Ѽ¦÷Í,§Žär ö\09v¸µZDšÑ}“>Rš)Œ±D®2¯®|xÂŽ‰g>ó¢…@ÖL]©îåñ¸G\D"Raú}¾ 6Mgӹ®¸Ôs©çROw\w\w<:6:6:ÖXÕXÕX÷q÷q‡pˆN;!ÿk¥Dc8Z2[É:¼ÜÔÿz㪜OòìX‰óiS»¬:ÒÖ»j7[sI/hØH¸Áº(J¶¸6O°ƒ…A,š• Ø>ö˜ÕÀâÿû.>Nþú‚•k‰Ï6±ï–Æ &mx:ƱVÒ³y›Ó:¿à«.Œ¸†ókºÁ9¿š<¸ç×› ©ÄùµFƒ+s~½×à—œ_®>8kÄù¥»mÞ³eò“ú¯Gok)‘³®©lhȲ ëÝCœjÿßïÝd¥1U*)–`1Â]¡ ëŽ\úið¬˜î{$¶ ˆlÛÓ¢¦EM‹zãòÆåK½}õöÕÛgo%F‰Q+BÈ¿À~úÏNèÂ"X^A`ý°˜}¤ÓÔ]›¯n|s™sίÜV"9¿W•sÎwG=¸qw‡GK‡1bNapYX̱æxýG}CÂ#á‘`ïS¯Ú¶jÛªmo¸ßp¿á¾nìº±ëÆºYÜ,nè ƒŽµ`-Í'CÈèç§^E8>0Æ¢­jáN¼vli“ližCÅ … æâ=Ýšêkóª =¬ÍÔ@õ ž¡Z faý¿ôýôyÐ sT[·É\4DQä†?&  Ê£Š 3Kfç1š¹³ûl,;‚I¨’4>¥©¡Ç™ã·Ý#î9~÷{=ô¨äääóÀ}Œ> ì˂Ƭ‹*'ê‘ewÿl“Üx½qߣßèXÒÑ[;ÐNë–ÏzÁ¹x »ÜjÔªj‰à‡ÆÉ/Íu£#âS¯¾êôaSb³«ƒŸ¶ŠérîÍ^ƒŸŒ¼ôµcRµ4Ë-K°å²u” ø(²7e©µØD`jG~Ÿ·SKªkxJ£ –!)0ã¾"fXh€!„üBZÈ!C‚ˆþhrâ(q'[©8*Ùx6@“àE ¼†®ßt\ΚÅ•Øã×öu+¥³-·Q¢ÌœªÉñÿ½ó‹"ÙÚø[ÕÈ9£HRA$ˆY1æœ0çPÌ9ëšóšsBÅ,FLA•$A@%g˜éúþ˜Ñ‹ßÞ½÷î®nìß<úÝÕÕ=ÕU=§«N½G*ÏxUš{²t…<žKõãme§yÃï(øøQDHU¤5ÇiŽÓ§rYå²ÊåÍÍÍÒ“¥'KO¢å(gÙAv§p §„æ ðKùyÃ]Ñù£‘‰ØÀFy‰Cd.°BC؃g ùã-¤ñbªÝS%Fº+b©NÙK2û±šác¸ÿgž éÊÿ—`À#8Î# àÑgIsð8Mmè1"&‹‰Y#K’ŸàÏ}¨Ÿ{ªÛ¹1HÄÇ¥;pöx$¸[\>õoºÞiÅä&©õ¦™xÛùÕ(Ñ*qkeÝôz½e–¼ž…診º(@e¶fÑÑZÐè©mX 5;ëxµC£Z5£írÖÕ&Ó)çRYê³ã‰õrc>%d/‰LŠÏÈ:ö¶"C§PíŪÄ7ÊŽË=åûqÀa­¾|¯gXHz“$£z¬MØƳ†X€óF¬r.‚ÿ½<þD(ô×ù¹ ’i¤®¢'!cØ>t–¯”ƒY×N¬Y¬vtÓ. z=Þ­¼ÁD­IÒö%2f¨·ÆlçÖs5ðœã®óÙÔGb%9+iEš!¾x†ó8M¨A‚"”¢òwýŽŠ™ƒ~è‡~8‹³8«¶Vm­ÚZ $ xañÂâ…•ó*çUÎÃLÁœÇyœš†€À¯ãç wÅûº*Ä!™øû¾ühe€\!® üY~¯zÉ#qœÖ&Õ.Ò£ù“KEeÙLz à$ý³°/ŸÏB@ÑOþˆN@Ä(b1ú‘eÄcÈNL€[‹ýÂp¶·äíåmùâÙÕ<Ä3¤Âh<ŒÊõ‚5×Û‡YŒ×k›dž¥íÔ´¤~lÍ®­8Ï4»el|B]LŸ‰šr3±;çgúÂÌ_ƒ™Âd˜z¾Z¨Y¸CŸLVfúЧÄàmƒ´¢œé±¢ä3¹žáº¯Ô>޼»à©<9"mmvXÁ4À,LáÁf)¿†B‹·;7v&¾Ä…T‘Xžò˘?=dõ1‹qFСø¡ )D(Cd¸†m%zȽ¦'d«åÛyo¬E 9^], žÚ½O;÷Žcov}á¨Y#Ëì¸æm@–Æ&UÃȾª¬ªT™kͺ³!¤5óGž²kŒ¯:¢5h ™NŠh·X€ö¨ü ’ÛºHërQ„6ÏV û®âE/µ*»ÄºvkåÄ´å¶Íò¥{÷:/ r,kõ×ammî£sD]M»‰Êp€ðvƆ^*ªÆ«LfÕ\Ùîïj;§¼ƒ¬i‘¼´CÓ‚Ä ™—‹ù‡Û_œËjxG?20iïÛøôÜü}é]>Ž-ÞZä^Ò­œ~ùRmÁâioJ´Ù4lcÁXÁ#Œ]F8Ò±'‰Õ8„(F*ñJ¿$Õc]kB *Xƒñð$= ÅfÊ&ÃB1j¡Rû†Úë!}æ;îòËêcÑ ¸†­ÉlÍQ?E.X‹È¿Xt¢‚;ktïajé*§i}ê誘N°ÖܾÃlû°´]Å-‹:nuœæ2Îíp€IDATm±âäüTù.ùÎ?ì»ÛÃöÌ–Ù2[Eˆ%µUj«ÔV¡…(,Q)Q)QQôÄ€<Á<šŒ€À¯ãî9oK«*$h 'XðÙÖNµ½ø8wCó²t‹¨¥òÙµmàŸC |Šì Œ8žcåår9T° 9Ð#¡d²éNâJÎáNà´Ü”Än–N(¿V…h¼F&¢ñÚ#³6ö€Zo•0ɇ¦³œ.׬mw¾F™f^c©ã ó‹®÷êŒ2ö©íf¤™'Þ :«$kÄè+-èÞP­íòIgêLÔ 689ý×_?oqù±Ɇ¹«ž'd;<Íx3õÓ‡§îo´>lŽ›ÔêÃÙYyù)œà à$1@DFœ%‰bšÌAü ÌZ² ¬]ñiÈýêçP@@@àφÂ[]Ï{;f¡'—KÝH ùD¾›Î&2ÀB²[-z5ôœO Ç#lzNqNh açc [ÙiÙ€Õa¾,‘ï€7¯½·ÁðtâÓ›Kãzg(£ó Í+Eƒ²g×™«³Rg­õ*‹|‹v‰­Þh¼ÑÀJ,ÅR´B[´…ò/¿¿303ä2¹L.Ã+¼Â+Ý·ºouß–û”û”û”î+ÝWº¨@[Ê–²¥è„Nè$<Õ~¿ÀpÏ*íÀäSøGÌB½P\!ŠÐ~'<À%ûH'4D ¡7~gäÕNRð¹¬Ûc¹BÓzÐ@3´ƒ#:À 5È ² ƒ‰¢È2bF¢1½tey“J£ÛgŸ ·ñ ;ˆg' ¡­¾[¿…¶“ÊÊ6CÜ.Xy÷h4¤Ör{ãç´bLôŽ©ÅhnÒ£:3ꦣW Öº'M5‡G®y4Pæ-ý´9_\ó©OÁäÒÙÏÚ$nÉó½é˜úæîà'“šæ·.ñ©\_PZ~\V Oa*vø¸tšK®c"Žâ=¯Á3#öŽY` P‚*¤á ‘"” A@@à@1  QÎ…r T“ì#êLË™…|¿ŽM—,7uèr´Y{Û³› LqOj8Ö±¡É!@~M~`ÌJ^)¯yh~lfæžeÞ‡‚ÂçßNˆ¼˜2À 6‘Ëàt¨ o!Oá/•F–»–OŽO{müZµý«öGÚ©[ìPäPt+évúítbG‰£BŠñ¨Œ¹d.™«½¤ºZuµêjý-ú[ô·”©•©•©hhh)³úÃþ‚É. ð[ø†ûÇgÅ¥ó ]hð5`ƒ9ÔPÔ–ËS¯+.ɱ ÈTÔ‡ÞBÇü]©^Û‹bœÁmÄ*þg`@SA}&B9«Ä8bŽdl§¾4†ØQDNÈNÈó>.Éw)ÁÇù(A<Þ5Îù¸óèyDö GCõÚÖxÐÆßu[Íõv Í5©£Ü¦‹qlý#ÖZú’ëš6Ü6@Ä f0Í`’jš ãÕÒìa3Û`´Ó°¹]VºªÅ‡wg>䔺Gð¯Ì²Lî_ŽJx7-Î9uI~F|ÝwkrvÔ(¦e†ÿïûåNP™‹p\%»ÉlVÊZ±ÝLµÆZtÂTª.¯&ü8|3fºbþs†¡ Í SÉ ¾3;Éjð}Ù0…6wOm¹Á®áD§žE š·Ëw›d~ SÙ€¼J6à Ef÷]ŸÖOsØ6ñÜËç…çFÝ3Œÿ,Ø"L¤Ô‹L“·’gñ©7õ¥[*Õ*’*^Ǯݻ¹kb×û]ï[ï±Þc½‡{ͽæ^ó§ùSü)ÌÁÌÁ¬Ášßµfz¢'zâ(Žâ¨j‚j‚j‚ÆF+,+,+,KÚ”´)i£Èȶ²­l+Ú¢-Ú J@à×ñß ÷j Þiò¼ç…Yp$ÓÑ–Ç(ÓÁ*‘­Ô¼* ¢Íèâ¼Pb!¸ÂŸ’rT~–nd°Â$ù: ØŽQÃr “I.|ñF¡q 1•mæ ol‰öòNº^^"¬½}Ú«ÔÚ×±8¢»¯î‘Z-õòÚ”¸X7YìðÆH¯æ CNõ¦h¶¸7¿äö«Ùj6¢•uç©Ý© ›ÑÚYCÑ;^û¼¨K½ßmɺZpñ͘´“yŸ”¿‰ütþÆÌˆ ÉÜ˼$ƒ+øVüc¶˜—±ÕhŒNJ«üêt‡—Ë…R/>›ù3G¾˜Ã*ÑC±M©ê D‹øu¨@‘âùI»’hb9rÙþkÀ„G]‹­Œý´úîw1ëR³éËõÈç0€ïÏÚ$ŒÇ­Ln”?ó‡å'­# އÜRyµ·Ê½ÊP6‹'®8Œpƒ+{Ëjc oÀÏb›Ún¤&1%^ ?òä.É]’»šµ1kcÖÆ¤©IS“¦m2Úd´!÷È=r­ekÙÚßõi×ýÑ{°{T_©¾R}¥å®å®å^~ºütùé¾€/øÑ02áÕèÌÐtÏO/KÚ}Ø—;¬Ø^¦'p@@»’{DmE {Ó¸…ØÏ‚ð†ÍÂÃÁC$ Ÿ„E±JªÇ1õBcÔ&ÑØÁämKòÞ¼ »‰KÖc;ظçâ#Ãù¦]HSŸZœ¸«J)w¨Ú#ÜiÉ–„3©Î¹‘›ƒÎ<¨Ùµ/´J*ÊîVÃ%ל.#Ûä¾ü"6Q(8På•ÈÁƒ±`Ì‚>âiõÓê§ÕOÏIÏIϱèoÑߢ¿åË+–W2jgÔΨMçÑytžœÉ™ü÷}’µFk´V$%ó$ó$óÔlÔlÔl*l*l*lŠJŠJŠJpp€­akØtDGtš€À¯ã¿î¡Èþl|WváW°ý9©å“ª¦é„‰‹iW@.?SÓD·ŽVÊpåò–üv•ˆ…=¶à."„*þ £Xn¥à%’É4ÙlFer¹œ• p »HkÄÐýIJ‹8‡³¼9‡½(3ª¸S…$ {mÌÆd+‹ÑØ¢ÖPÅß½¦}¨iúUO´C®×ÆÌ§± 5îi]Ëôˆ†£f;­@ñ>€îÀAµ­Z¡ÒÁVÐÚ/]n…ÑZWº_oa•%s.m,»öÒä]£üU¯×¥æ~ªxZëõ­M7‹_÷Á6âfÜŽ YÙˆrÏÊs¸ÀæËw²0 ¸½ô4™†>d(&òø©Ìœu`Ga†¼GþOÕ—þ¶(|ÖEà@ê^ä ‡¤,Çg3´bÞ<ôªãkª:aP÷Þõ|·Ë³{¤V¦þPôåý…‰©žv—mÝÑ(pîã°c97뿪õþàGÝ‚Lzbɦò)ÌOþˆ¯Å&+C2U J¹°ô+Á\þ*•¿JF‘QdTÆóŒçÏ߇¾}êÐס¯C_KMKMKÍÒÒR¶Ž­cë031‰HDâïTyÞÄ›x+†øUâTâTâ4;kvÖìœý"ûEö‹Üe¹Ër—aöaa ÍM@à·ðß ÷h|@"Y1D®Åç ªèWdðArKÅŒwb>F'5˜ê\âBè¶ÙòOp £Ð[e™¿ÕTÞ"Ù–†úrÆ‚à =hÀÞpF#ØÃœÇZô#ÈabAžaJq¿Rýò¾÷…dÜC€]¸€g:zO´{«Ð~¦vQܱþ{ÛQÆ—:\ôH³ÞÒØ®®Ô0ÕòœñEzº.ZMTÆ‘Qb'ÒMô\MÊ;Ã~—ž“3ú¬ï ¯su×mÉ?]V÷ã輸R—x’nTètwrÔñô‡÷D{½KJ ËT)˜žUV®-Í·ä7c4€ÍÖ"[Θ„³ç,"ÞmbŽl{æˆD<Þ# PŒ,ä(uëþúˆ”Á F¢šr ©?Y$oÈ{0CÅ[{H£dm³©wûZ»m9ܧqÝEº?¨¹ {Åš*5€“qe¹y!å÷M¼ýªö¦Û§x’™åœ3±ø€Ë}BÈ þ0oÇÞò£ùÛ,9°ÄTåy+ªé†ý”vh‡väyGÞUhWhWh'¬OXŸ°¾%iIZ;-;-;-®”+åJåÓåÓåÓ1­Úç÷Á ^ð ÜÀ ÑÑÑÕæªÍU›W”V”V”¼)xSðv°ƒëÉz²žXÕX-4=_ûÐúϼÂ'‚€ª3ò¾|ƒ‚[K«,‰‹ö2Õ\TòžüiÝpU i‘¤R4Ÿ{_ÁW‰x ` ¡rÿT‘ÎF.ŠqAxŽãÁÜa‘bG¤1*q’šÓd)Ñ#ëd™ò@>:·aÁÉÒž¹(¨$#¸ˆ‡x£,ØæDýúÝ[nw¯¹·l¤º¾Îul ¬êm´²5¸mpÁð˜Ú9€Ýâ“4§j¶”<Ó„vé"ëa–2]ÍŽÃ÷¬)ЫÉõ òѸ¬Å£í/Š2<™ûJ'cï멯óËŸ~k÷aRæôÙ…ÎÐùw_”l#µ°†N&.$‚¶¦÷ˆ©ÜS¾^ŠÊµ ä«Å±.Hµ>ʃ‘ÁDD‚k¤¿›y°‡òÝ|koì§÷JsÁß®åõS¦îµÃ¹•þKýåª?U^r;@>Hþ"×»0¯ªÿ‘õ7O½Èݾì|ð³Û‰ÓãsbáŒpìævÓ2›waÁl6ßßÉô Š7¡ý‚™<D1sfÎÌ1 “0)avÂì„ÙESЦMqLuLuLÕ²Ö²Ö²ÎKÉKÉK!óÉ|2ÿwrqçÀCò§Ø ž¯ž¯ž/—ÆKãKÝKÝKÝ+{UöªìEú“þ¤?[ÍV3ÁdøMüÃ…"aDå­äÖòîŸ6–l®…}”ÐxHùx>àƒÚ•³Ò®¢ôPŘ*ú“&°€àa ðo"ņC‚а¼¸ŽQüˆyèEz ú`Á *`(œDÛÁ.!6QšÞ!Ç?éÈBP'éTÉÜÚ køë¦X·0UÑlÛ‚oÐÎbC›í®ê5_ÙÔ˜¤©¯ê-Ù%:†—Rm‘@ú£­ywãçª>ýJMclš÷C'bwš¥md«ã Síóß$§®Îyôziz|Ѿ’'§Þù…NY–Ö±¬nÅ„ªÉl2{‰Ùr°w òn@jPC9JQ*4?Œê‘›kõ¸Óô¹&wáµX=x0h¬Që,Ý4±OÏ.®†iøäÖ-°7²>§W/+S«žì=ëËÏâ'AÐå6I\¸*ïÈð1N ²G)NBn‘¸…tùv~.óG,°(¨2Šê/E9äì9{Ξc7vcwÔ©¨SQ§ŠÏŸ+>g¶Ól§ÙNÝ2Ý2ݲK¶•j5•ÊDQâ–t7] mÔ…´ðA¨^ÿˆâGt$–ãÎ!ðyq˜bTì:ƒ##‰nÓzä ‘Úä éYÞ¥bzåê}·dã‘‹x„„£’ãâVÜu½wš®*ÒV{\ˬž¶¯tïVsbÝäš?ho¬=¹fcÝy†7õ/ªŸøçÌs¹¥l¼=¬è:Ø£N¸1Ê^ó»§­íÕÜéF-‰ªœÛ>ewÁÅëÃKRê>¦/g§mËj¸*æµIJ­l¿ò… Ñbùù¹‚!Ÿâ?]–‘” 7ÉE—åÕMvÅ÷âo-ßZml&¡=ñ$EØŒû¸„½ “]»‘FU•ÎkšÝ·é?w»ï“†ëͶ®wàçòó¾¿à´Ec®f„h§Ø¯!Ç{=?jùüNj1`wFÕ|›À:°öìÜ ˆQ†DT)Ï.ÿµçú/@aæ*ôXdA–¹)sSæ¦ìâìâìb½ëz×õ®»Õr«åV+É4É4É´ÚÓ†‚ÿ çý_Є&4áø(Œrƒõë Öóóøyü¼¢ëE׋®ã=Þã½`² |+þ›áŒ¤‘½ØˆÎL›e6Ù©EÙ¥š•Ч2#æÅDzU6HúIÍ9ê«<Ê FÐÆ}¡z~ÕM[9*!cYÚËyÖœ1èC›©Wá0YLmÈyrþpïæõØ…Jµª‘rŸ,äÖ,Áé³·‹Ó¸Ø«Ž.=욚ͨ÷Áòžî”zí-÷ê…y¾uÙQË×á‰åÝZõ4;¸ˆyâÙªb=¨è‰†{ÞÔwR쉆Íä'ÿù^-WõrJò~É|íù-¦uW¼H˜^“¾Ký\ýúÖ,kz©©ÉáNk¸5}D‹¹t³ÜžßÀwfØEØ*=j?_ÂâWoK5éFôG'4æti?2^îÇfCPW‘±_Ͷ{&L?ב[|#sÇÞÆ áY5@V ðùÝëAêÜéûô^FøÎðóëŸ{O»ßäõB`ÀUlD#ú‚Œ õå3øfìG<ÅKÌU¾œ—¢ü‹Éþ­(F1ŠÑmІ_ϯç׿^ùzå땎M›:6uuququ 06`,\à—ïn²+PƒÔXwÖuWÌè~Òý¤û‰÷å}yßÂÐÂÐÂPÄ 1BÃøVüwU™DdÐVÄ…ˆå*L©çŒ,©]Ú7¹Bú@þž¿ÉjJ$s¸®¢æä(zFÁ:P*Wà›QÝ”ÏAJX41”uãÁ)æá*’መ‡!h _t@]êLr±—Ì"ÆäoÎ&±˜è‰¯CßoŽ|úþŽ¢0Í—êÏž$èûj&HMÜûÕ 0;×f²Û–ZkÜÎÕ¾©¢öóZ­t¦i¤ªl"›Õ:ÓmïÌ*ŒLu³3ëúšteñÆÉ ï—rXÁoé Õm^·©Ž]Útn=ãœÎ–Nr‹—–µ¬Rô…iÜúŒÜ“WñgÙVÌÆ6!Å(WÎ<ü’ÊQ éBÄ8CŒ1vòM|'æLj’ž$Ú§K“ Û³\غum©U?ÛÔ˜˜‹|È9@>L¾à|¹31ÞLÿ”ºÌñÈ•WÓCâŠËÓ*µ«b‚q‰'¯É&³ЖOg³Y±2$ÓOŸTß–×x×TLÅTÌ»ò®¼kØõ°ëa×$ H`úÐô¡éCâJ\‰+ó`̯𠯉HD~Ç:WƒÔ°{±U¨B•ö íÚ+ØB¶-,D¡ - ðÇ ÓD¹ôdÌ4÷³víYæ—ÆÆ•8-(t…±•ž#ÞÕÓ4š¥«œ”$7‚B½ üÁˆª)"/Ã8xÑÓÔˆ Íç¦Q#Ž£ÎÄò?`ÿÖr¯á…¡+;.röØÖkZÍ6îíÞžçk—SçlÇÁý>¥&Ì9ë÷`b¥Ce½ÈZ•ÃËMCj•—•—EÈoŸ^ÙåÇõÈHÚź³þuÉêÅÕK&'‰;öQr–¨Ã M?*Çãþ3´ZOiÔ¦ÍÈ5¢Jæ+쨞ÑSÛåb­Ùgz,_Ñmcõü02Âoc–MëÁX˜þÌþ‘fûüÏߥÇR×5’Ñâ³¢µ_=H48s’„½XŒÊM g˜ßÿKO èèAzp€BÇ†Ž {ÝäºÉu‡$‡$‡$å&„„¥ÃÌ÷£Z …òŒ»Én²{ëë­¯·¾~úãÓŸþØgoŸ½}ö*÷v'ÝIw¡Ù üNˆ–Ò¡DùÖ>ȨÁ«Úõ[³htY™ã›ƒíYöŠâWÛ:ÙÔP÷$H0Üþ”T÷yí„æ°'6HÇVr›ôÆSBzã>™EŒ°¨"“~Z€ú¦êëZÚè5YžºÅiÅë÷!Œ1§Éc¯¼c,Qƒ±² ÆL™xŸ±°Õþ™/»Y:,pA£aÍ.ê·Ò^®öcõ2¹etA­H1Vn’@ô•§¿€€Àg´ ©"I¦ks«é>2£z–zõ­*ŒÖžž±ôz×€rŸ;ë§æ0úƒ_cO[ÅXˆ|F·Ô·gƒÆ6›Ò OM÷t6iRýʹ“$‘ ˆE.AQòçžø‡öH2Œ #ÃiÝ;ºwtï\|pñÁÅOÓŸ¦?Mï¥ÖK­—aq›¸Mܦï~A !HÂñÏñ‡_~uøU¤a¤a¤a›am†µQ^­`¸ |+DÿK&6‘ˆÅP¸½jŒl[ kÅO£-I~„ÒðÎì¥v”F’P¡jªû”_Å#Ä3 ¦ ð•÷¹ÚCLvÖxN«È ’K.’i0--/µ/ ˆ=‘Z¦ž´-|SíNeÁs~”ùË´h°h™è“¾5§^îo ¦Åí`Ä:Z»èº,‡Maãñ÷wß㤻}]`⋺§[ß™ùª{¢ô‰¹J‰4êEî5fƒþì 3a=°‹±w@! ”À?êKºP¦x‚=H]ÈGüÀof}Aå`£ì¼-b jM¶î³Ãõú°§\멯×K‹Êö²9€h+çù~Dv\‰Ën•‹Q±C·{žŸõ$ïYaZYw<Ã0@dÀÙ‘"YW¹óbÖl'!Æ…ò—~÷‡ö?fÁ,˜ñ Ä#¯m^Û¼¶É»’w%ïjžÒ<¥yŠéVÓ­¦[1 £0Š=eOÙSØÂ¶H@¾ËI D±ä”§ÃépÍ0Í0Í0VÁ*XÅÇ¥—~\ŠC8„CBCøVüO†;æ±x À(â+Kd·Ë&ɶËå’[ä¹à%TŒT4tÔÎ ’waäÕüS‹QŠJ6…ÝG¹œ5c ö¨Cô…#«KÍÈ¢óxðu£+»ûß¿>ùÊî/e쀽§Ê<{Ùs#_wŽtœØ±A#¹E&@™ºÉHýHUõoÛ¤dâðîsF°{åo±oíUµ—_h&´ÍR.ë‡Mȸ=4ŒÜ”çñ§ÙNÌÂ&\PNÓpªµs²xâ9ÝFô‰¿\…oÍ6ð`À³ †]µ6NOë{Õíâ°Jïùu v¬Q}T–GÌ‹­,´,½)ïyØ<°Otävós–Ñò7Ólṟ h}²ɬ/v ]¶@Í4qo¿è½Wýg`–a½KïÒ»òþòþòþ É É Ée¦e¦e¦õ êÔ+P¤þHýQ‰[‰[‰±'öÄþ;J¹ÀàsÌÑ}Ñ}Ñ}5 5 5 >“Ïä3s?ä~Èý¬.÷û,–P@CÉVÒF‘np«ÆãUÙ#群Ão_Zgè\ÆVLá»AµËæ½yW¿-z0‚‘²Ï ÏÈ3£¨#ç)2YrKECEý¡AzQ¥ÿ«xª(PTÓSÏ%§ÖúËk_÷:[råVÃÉŒ…ûÎÜÊØÃŒiÇ{ÜÁs®Çµi^¸€ë”éªm§eÚDÑá”çÚM40„Ö#—‰>Ìa ¨C!ä“Àß ÅøºT .´ N«h/â_=‹‰ª¾FÔÊc·z¶Mïxnâ˜ÉŒ=îã±ûk§þÀXXæLï’÷.LYõã¬Yǽ‡Ù.«®÷¸z \Wº‘ìÀL‚7L jÑSÿüõCiÚŸöW\o“M>6ùìì줤¤kefefemhC›ªRUªú¯§šbŒy€y€yÀÓ;¦wLïæßÍ¿›oTnTnT®|‚¹7â&4pßëYAˆ ¡ D53õîi¿]á·´ï<Æ–% gl…ýˆÚÇåî¶S¾O †»À? DÊ)uà"6b„È’s$Å?ÍØ"¢AT­ÛGç.´íÔ£hÞÞ“3 -aÁØÃÓÓ[0ºb†¸üæí€©}Èç‰:6hwªáP«°Ó+×t¢K&¸þy“Ò¡F0åþJˆÀ}n±¤Êqˆî"Ĭzc½éÚÝÔu¦õ+kX–¦wÎv¬c¡É32öPoº”±þÓ«ø”ûc¦¿=Q¹8·‹a ƒ-k}eî“ 2;h/El”›¤1ØÿZ¼ÄK¼T¸Áè,ÒY¤³è¬çYϳžÑ§£OGŸnÖ0¬aÔ¡uêK}©¯"öê÷¸âM¼‰·"]?·~nýÜû÷î\–^–^–ê;ë;ë;+sê}¢/4vß 2 q¸ HkmPk¬ÚèY⤭=±ò­†¿clyÎðÒkAÃ{vôPæ¿„D ^Wùb:æ 0…<"ýAk’}(ªžÝeQ&-v$Ïxé¥?ðšÏÄSŒ…î›q±G§c,¼ÍŒ•ÓïÖ¶îúˆõ½õ»µ(±[ȹÐ\º¤z9¢î\oª‰õ˜å¬×W/6ÄÕÚ§ô ÏͤgÉ…êYèºîy´KtƒÐ¹‡ëÀXx¨ÿ$ÆîÇM½ÎXè´äy÷šL»~ñÂZÇ^GÛúº¶|ÿU IÑ%?úÂDôEåî;k­ü>+bE¬éMi›Ò6¥Åœ‹9snÌ1CÆ QfRÈAZÃÖßåN’“ä¤"ÝrCË -7„¼ yòêäú“ëO®×Ö×Ö×þl¬+tè~'Na z' GxOrúa¯Qº3¶ªÖÈ1L¾üÄðÛŒ‹ë‡&°‰FîïlY@àÏâõµštõ'¹¤%õ «q¦zFëæõt³6 šØ&â]›€w£“ Ÿï/fì‘hZ c¡GgøËßÝ?0Ýæ¡ÝŽ›õÒ*Ûî“VõG*w¾:aY‚tbƒd¬AC8ÀB¹CШøc©.Ï:ýИ"-Lv’ZX¢Ø¬VCežd[·¼Ñu~ ‰Ü¥ëÛ±G?ø1ö°|úÆBô¦?bìÁX¿õ³v °«ã½¦Ýk÷‚/–}}¹Jjc2G Ikå&1D³ÖÏG’d Nâ$NŽœ;rîȹ‘ç#ÏGžß5iפ]“¨ u¡.Êüžð„ç÷¸jM­©ò• ç²žËz.{²ãÉŽ';vð;ø¼J™J™J™âj‚„@@à÷BˆEÍ© QÊK]ó<¥ýjÆVuޱåm‡Ÿ6åtÏvŠ½Ä ?`(Œ  u¡ò”(¦æ¬Ä$t¤×© ñÂS¬CõŒV5ÌéuŸ1¤e“ýIõNÏ}™±PÕnŒ=ºèÇ1ö¨ûôAŒ…lšQûã§AŽã&u?íR$q¯Ý«^§G['Ú›¼$ Ð/gÔâ~~2ïJŸÒúdqC:VßÞ}gË5vˆ¶Ïî/c,´ËÌŒ=r˜Þ˜±‡§§d,LkFYÝmâ;¦çŽVùöŽhOT©ÆW%_¥šÄ±}•›QTÿ¦µJº‘n¤›bƒ{¹{¹{yDZDZDÚÕ¦W›^m*FH#”N20à‹ý7…®¡kèEz„l„l„ìYì³Øg±+V¬X±b]DÑEʬ;°ãk}}ïŽÈŽ:‘ãB'.ökÚ:‘±Õz£&³÷˺ÛœÂf,ík««ª#R¦x‰%˜ Ô›€ÀÏ¢ˆõè‚:0!XÎí ÈW#ñ†—uõÔ½¦¬îs§a@üÂcoGx3"ž1±Ð†~‹ ¹àgÁØ£Ã3Ƽœpdö°[3ç hüÒpŒN¥úäêåpGh09 †¬€ Ì¡û·5kþX†º¢uYÂ:x‹s˜&’pZä«E¢Î3Ì7\í¿îa¯X™ÆýaÓG22Èo(cZO3a,L{fŸV‡n##Ӻ亴Sߦj"Y§ÙÖ0,פ8‚A  •' ð_ ÿ_Ñ‚Z’bÄ™Ðö¤~õŒªé ‰Ã$Ó^Ýî†lÜujàaÆBOÍ<ÊØ£QÓ;1¢â×™±Ðó3Z$ç96ºpÖ¾¤ÑƒÚõj^5þÕŸcÜéQ*"Ø€éèªÜ^}N@@৺Œô M9²•¤Ò1®zÆuÆšZí-}Õû|Õ“`i ‘ú5`ìAÿižŒ…_™™‘y&wŒþt»~­=´Toª¸JVT/û@«HBqŸ_MÅÿÈQˆB”òÉÐKµ—j¯Ýov¿Ùý&òtäéÈÓÃ,†Y ³€ \àB×Óõtý7>»Â*¨ÃÕáê ê ÎüÔù©óS_'¼Nx0Ò|¤ùHsåÓL‹jQ-4A“/k ~¸Žä ©H/ÿÑÛ¬Q,+_i<²¶üÜ’°¡mòŽÏO”æae ³Þ „z“^Ä@¨7_@u_Üfp†i2ì&‘d0"ªgTgjæÒ»=O´Êµ{ü¨îÎξª|{qÓ0úãŒUŒ=¬œÉXxû™Ó–ž_=öÄ–„izí–Z^0s×ÝóÕ UÈhl¢ IñgÉ×j/‚;ÀÏc‚š¨©H’XÚ›•‹Ï‹Ïsib5±eµ|3L¯ìÔ Ù 3éb›óŸ\µ8‡±°¼™êŒ=l:í ca#gÖÊ\ÁiÜ]ÿCß5*´ØmÒH§MõS‘*²xK˜ò•FÊ?¹•zÃÞä 9H†0¯5^k¼Öëˆ×¯#VØ®°]a«ìÐ?Òé0‡9Ì¿í%pøaÜ0Ezåž•{VîIòOòOòïÙ¾gûžíÞíÜîwªP…ê_ª~þúÐh²™(ߘ§Z·thÄØòðÍežKÈSåS—LÖ³KŽãt›cÊ.]›„ajL@à·Q]f.FÂKÔ‘ëþµw/×’ÆÓno5M©C¯¼Z7º—oų;EÓŒ 7ÉØCÿiÑŒ…M˜Y3§ÿ•æívòõîç`ßÍtîW}|9ùDê¤ ‚Œ¦ÜñSµ?½ß 1mˆ;r±ƒ´@0ZÒñ³æXujß6°ãn­ÿqTtÃÌœ+W’&ve,tÞŒåŒ=85­ cáÖ3g¼Ï¾Øt¼ææÈ©íÚÞ0½kpBó«(A¢z\]’„cXAÊM‚s×Oà–rK¹¥Ð€4ÚvnÛ¹mçgYϲže=yôäÑ“úúúЃôÈp2œ ÿf'Þ…]Ø…d$#™N¥SéÔí“·OÞ>9îxÜñ¸ãÄÄ”±,¸#Üîˆp§þèÒ›h+ÒƒTÝmê>á=—MîUe·xήlñ ­!Ã×z´wP.—áÞP«ÏBQ¿ …ѬÐÇPlF q…Þ¤jÄî§ÙÛÿаÊZï„ÍÕ.óªúÝ]4­+c¡6~w{xhz[ÆBÃüòËE·÷M½}èà|³Ž›Ö«O-Ô~ZŽÈ“kCd¨@”KД~ùW$_-¡ž/zƒZ“ᢙܪMjâìçQöê8hêÑ,l©ÝÖ½[÷Î ÛºjË܇랙Þp/õÁõö-Æî¯›ÁXhï£+RîìœæºµdÚ½v‘u'X>1|õU3O'Cp…T‘õ¨@¾˜éTXNýoŸ „Ö£õh=ņÚOk?­ýôr‹Ë-.·x°ùÁæ›=\=\=\¡5¨ÑšBS¾ÙÉÛ“ö¤½"­ÝZ»µvëÃe‡Ë—=yÿäý“÷Íùæ|se\Î’³ä,…<?â)ñ‚¨"V‘n÷Ún[­ÂÊ‚%ç†fT._ì9¤c«ÂGNÿÔ"Øy‹"hE^ õ& ð­»bµ@]hA ` CRJÖ¢Š:‘e¬–ÙÜÕÇÎÂäý‘v nwöÊow½ßÄÆÂ«üý{°xj&cáÆ3g=»i=¹õÕÞ÷YÓ:Ám¤åc.Š›ÉyU?-M>xÂV0…4ÿ2ñ&~èCmà+ì†?|È=2ÉÜzÛÄ«zÞn­D5mgÃ:KÍTüö÷ìà¸ôáȇݎ›§^`Œ±„lÆ{2‰1Æ¢Xef©UIî ã–¬3/­S´£‘õ|£¯–M‹$œ1IÃìÄ(XÀÚÊ—¡]ý/ðàÁ£;º£»Ú"µEj‹öÆìÙw î@ÜŸ>7|n(2r{¹½ÜÞoÕ_ÉCò-3d c?¨m³qžçÑGa.ˆwÓ×´†Pm¿+ÕMçX€îd7i„›¤’,EjõŒú–Ï éªqqžK>m¾|i ÆB}flcìá»éÞŒ…®ö;ÄXȈ™=·ì¾8°tÔëÓ4q˜èS½Ñî ­G(Çö UH„[ñP=&¨9 ¡M.~HçÊ8=’+²áÌÈÏÁñ×£a*-ò’6*¶­»ÁoÒ‡¶îwÚlº×ûC¶óÅùãO2òqæEÆ"Í|ÀXXK¿ŒEtŸÀØÝ6£gä,y‡ËvqcìåMÆ‹ÍcŒ±³ß¾HˆT^Ú@®}DBŽU˜‚þhþ¹U{µøu~(J‡*4döØ{`ïˆÈˆÈˆÈqâÄ©•¨•¨•(³&!éÿ½lÿº3ž¦§éiEÚÅÙÅÙÅùÞ¾{ûîí TTT·èoÑߢ¿RŒ2…¤á |+~ÉBŸdä}Ø^ y®üdaZÕ6™ž±\üI:ú<Ï÷1rÖè«v ïA±Qþ5áí±]° p÷…êøîð`ø¼ÈoVâ"£Œâ"Æá15%ljñ#åçŸâüqã¼f»qoÉV›€æ‘ÑS=ûø»_êû´µ¥­‰õˆZiºY@¥O¥_£)õ MmMq07n8oÑ ü†ãvØf=_r6íÞé×c²[æ/VŒí{‘lâ·‡õ¸ÇT™7và‚ðLiœÉ /ܢ߄ÂÕA8ÃRô&dú¡5¡£tašÇvâ:ëÎ,QCù—F¡_ªã§þÞêµI­Í.Ñuæ íPÛ£©5i~¥Þ@£l#]=*鉳ˆ¢$à-y5€›R Šâ‡÷=³—”f¦äeo- rx8;~sN…q:L]Ú{?‘<¿Sß©fèr©þç Í7r]Y¢éPc?£Ó™w³Ï}ð% É^2cØ)öHyAB«øÍí]b—Ø%ä#ùOEOEOE%ýKú—ô·±²±²±ÒÍÐÍÐÍ(Õ(Õ(Õ ƒÉ`2˜U{HüÊÓ.&‹ÉbEZÃQÃQÃQ#U#U#õÚ;µwjù™ù™ù™¨D%*¿_ø'ÿƸA¹ NÜ…kFÏÄOsêCø>Ký†–3¶ªõÈžAaÃ;ùTˆTD}DÊ¥lÄǰJ¨<?˜êÑRÛ£1êÐé$•8~¨ÄÌêk¬3¶ÓÑñ[п¦‡æ›¤“Þ£Ž12Âï=cöûQÆ”O[ÅXxÝ™Ï^È {=çÄ`—&j„wÔiP½Ú‰ìÇCšA[“)B µjW"Œ°þoT÷Hæ@AI¢ŠK\º›ç6Ðÿ"¹kÿÊò¾QçÑ}ºu¹´¹æäÖ‹¢Fí¿0d{Ù˜Û–S?1ž6s3c¡kü–2ÖÆ2ÆBŸÏXÀXH¤ß‰ªéw—M ˆ.?¸b¸þ­f©xup¦]zÝ÷©ÖëOøÞÿ¦¡­€=w5ØÕàYÉÓ…Oú‡ûgùg‘¤?éO©15Æ^ìÅ^P¡%|#|àEkÍÍÍ>=ëô¬Ó³" # # ½c½c½•ëÓHWÒ•týížîÜ~n?·_‘îÑ!¢CD\^\^\Þ¶ËÛ.o»Œ±‹±X…UX…-Ø‚-Â-øVü’÷BT J¡7 ;ÉobòOÏÊVT¼#Gôª§ €ÃÏÑy¤²_©ñTÚK<<¿©L*[ˆih˜+Tµ€ÀŠü—A¶[Ç>˜Y1 #—±¾œ íE&¥·Ï®•ßd#N!‡Ó®÷޽Ðçz›}uGLjÓ}®Sïz'm¢ô?¼=_ìH­oé¶Y=`â›æM¦üÐSZø‘K7Kßíq¡Qôœ”«™#ó[Àœ;Bo’5|<›Ì²ŒÀ/ˆ¨DäÂÍù {XÂP&˜ˆÞp§K‰3 %ˆ:6É;ñuYG9Ø8 hÉ4ÝgPG½Ðú´Õ¹ä5¿Qˆíï³ »˜o¶ioj¨uV/M{›j íÄér7ù#€®!™7ƒjóûËÅò”÷öŸÚ%ÇÞJY–wý^­g§ÞÏ¿Ò%¤øÍ„ŒºŸº–hä'•—ÝÄ}Ôø²r‚á0œ¸ºôiË|Лh‹Šú‰ŽTήZé{üáiÏÓíâê“ú¤ËÛ.—»\<&xLäÉÈS‘§ˆ-±%¶Œg<㿚Cøu|ÄG|TÔ¡¬BV!«x]ãu×5jŸª}ªö)×ñ®ã]ÇmÚ´OðO~S+tô-` Å«—êkÕת¯¥ÖRk©uq‡âÅÐ]Ð…«ÇÕãêÉSå©òTá ü´‡,°O/øuôÍØò°á[6qØÄWq~j}CÌCtu´š*"EÄï„Êø“¢ð‰¯ægLÊÉFB¹qtõתϒµâtѽÑ]?¹Ô¿{ûÎþ{4c+cl§×cì¡Åt#ÆBÕüÒóÞ]Û0éÒzlj+Z뺅Úß0;óÕ}Р¯¨éˆÛØeX·¯suqÃ@¬Ç`jCÎ=®=]D’m¤–ÿÜ¡šËÔPÕkùÈ¥W-6ZÚE»¾Í —Åã»xfõ¸h>ÁŒ±‡üê2ÒÀo(cag\b,ôš_c¡Sü3ÑÁ`ÙâÛNÓȽ[Ëú{lØ?ñ@«ƒfz«9½58««¦þòg¯YŽ}0õçzSŽ®§”tC 6`°r¯T!EmÔFm2Œ #Û‹‹‹¢Dˆ>°'hOО ÉÉÉLÁLÁxŒÇx¡ ~ÌasbGìˆ4¡ ÍAу¢E¿Xþbù‹å;Nï8½CéN(¡ä·õ2E4Ö^´í¥ðb¶lزaËÞ„¼ y²°ÓÂN ;AúÐçZq­¸VÂÍøãð@-˜b4•kü8»×pO“¯l9â”|ò’¥CÍ2wÌ-ä`7Ô赞£"Mz¡òþTw§©˜ Dc1‰"Cð´zFÕ•’…ÝÛ´T«uè¶¢måÃï]¶Š±Ðâ‡ÙÍ{«§ä0aé¿5×ÿZý‰ G×/lÞ ™Û¸"öœI6)¯@A5Åú¿E­~þ.>h;êLn“Ú"/®U%#ŒÆ?=HäÂ-¦M[ê§iœxÅk@}‡}f—yËböj0dOá¼ õ“Ÿ3öøÂ,ÆÂÓfÜa,4Ào8cëÍŒc,äàŒ¹¯o§OñHZºá¨GG®.ÜÐåÂàç^qõ.º-²»gòFÍ\%IêýÓó’§džÒ7ÈÒAÄ ï°K0m¿Zú\ÝÙ¢šëñ Ä»±»kdÖȬ‘y)úRô¥èÈÔÈÔÈÔ!‡rP‘“ºRWêú¥–8!>À¯†‚‚Ò t Ð™qµwµwµúòé˧/Ï?>ÿøücÃXÃXÃXÅ^"%R"ý•300s?Ï¤Ï ™23äeË—-_¶œ&™&™¦\˜N_Ò—ô¥ + ðÇáS= …#8H€U)>Í›pŒ­úaäÉŠ6‹Î ެèµôôðÍîF5v)Ç4‘¬%õ…ÊøK¢(# bÆÂGTkF¿2©É²€ŒõØdZmîfÏ5úñ/ïwóÓa,,~Æ}ƩŌ…iÏH¯jp·ûÔÇêr£‰®cSóÝ_•s”4ÀòôAJŒ¹BòåìæŸÿê׿†º¨,\Çl²›4Ær‡tÅ=²›¸âÜaøï °|oÖ[÷U‹ç.5ÖÏ_?´AÓ…Oöî}?dy‘oúÄ`&½—1í$ca£föe,,zÆtÆB‡úi0ïß±‡Ù3N&…Þ5Š¿1gý½^Xk6þyëÙ ƒ–›/ŸM¦ïîÂE…ÜêÌ]¥©$†¨á%6(wü:%u…Ϻ5¬a­‘ô¹×ç^Ÿ{QZQZQZW^ix¥¡ÕN«V;ãÄ´mF› ]í4Ã'ä y¢H›ÉÌdf²@Hé£uÖ=Z×¶OÛ>mû(fEh( ¥¡¿ò4‡q‡•íGW¤+Ò][sm͵5£7EoŠÞ4têЩC§*›ƒõ£~Â}øã0ƒ64(‡,ìQ<%&Ó¦ÅNÇ[£>*¶tØÂуŠ[ÕvÔðf×jý`üIqçNΓvBå üå©6Ocá÷gª0jæ7±°%3‚ í=£c!^~ËJß”Iá>?Þ|wéÉ­³{_ô,³KµÒ6{§—ó³gÕºd úŠÖ'}H0œ‚´ ªÌóM£“¢Ctè:€ÐHÔHÔHÜn¼Ýx»qÌǘ1Æ-Œ[GJH )Qê|/Æb,†*T¿\À/å ®à Ò‘ŽtÑBÑBÑÂU)«RV¥¼^÷zÝëu£ÎŒ:3Jé´ÆãÎqçŽ.¿ø,aCÄC¬ÚLµ™j³;w>™ðd“ =m{Úö´U6(KjI-…Û" ðmù%?(G’É22 ŒeŸ-ÚP’‹ ò‚•[³~ ˆ•Ò‘ê×ŇEŸÇ•@"D€|%T' ð×B±¼•» †²h¦Î¤¨Ò7dÉcCY?væºe˜~âÝëKJ¼åpÀÓØÙ6¾ùùíÞ»yš»ëM×çÕçˆ÷qCäžÝÑf®í Î×›j[>¾ß-:ÆÙsÓ‡€5Qܽ6Ѧi®%+Ë6T8¨ Ð;ÔŠôãðö,w…T¤ã •×öý–6Š!‡ú¨ ¸¢6 ±SÑN"5Èu²˜b—Ü–×bÍåÆò #i¬$A|Ê(IG_uk}ؾ2ÚÓ·W›æöS›ô®K O'èfªµÑŠÐº©"Ä!€|8ï p'‰!ÀìÉöµ"ݪ“Yª9 й—ž©k N\ö>¥_¸íÛ§¹¯ŠR+ƒ‹õJ#*Œ™ºôÉB9É$Qä ÿŽbRVÂêa6’‘b~³e0‰!AÀWß”¯¶|ù· (Ìgù,ƒ0ƒŠmŠmŠmí>´ûÐn§}Nûœöy[y[y[Ý˺—u/ë᥇—^"Ä€°2VÆÊ”#÷Š˜ ÿ;Š%¡‡¸CÜ!ÙrÙrÙò·+ß®|»’ßÉïäwÚÛÛ‹÷Š÷Š÷V…V…V…âžáà‡_p–Ú¨Ú¨BªÄ‰âDq¢–Ž–Ž–NÕÀªUóÆäɃh€l/ÛËö¢=Ú£½psþ0¸i$„ôT¤[»Ym4Ualí€1õŠÛ,X:h$ck›¾=¸½Ë¦ÚŠŒ…`ÆÓÇ{ľ² #{&¹ѰQ}&9X½Ñn6Õ ‰þ—¸­ ÿìÿå:f~ÔG-"#[‰ºÈ›ëJ58êN¬~zh%F£ku6Ù«}g´¸k¹ëæãú‹,;EÇ4?¸gÈ™~ð™ék‹Èõa,¬ßÆÂºû}bìñÿŒ=5ýZqÕ–“Œ^¨¶v{§Î ™W¥Wv#[«k¶£j„éë’ ºöß©pdÞKÄÁd1±Á9BðK0]¾˜éΔ„‚\ä"×$É$É$é\ñ¹âsÅQ£:FuÓoL¿1ý”ÙÒ…t!z¡z éC@@È"²ˆ,Rl°nmÝÚºõ•³WÎ^9Ö/¬_X?‡^½z)”gèX:–ŽýÅ'q#nDÙêŒ|||ƒu‚u‚uîôºÓëN/³`³`³`eÖHD"R¸-0ô8™N¢¨¯fúÉ`L~ù¢:CUuX¼cÈTÆVóG·V~Jß¹å¨7XÀD¨= øšMòÈjn ]H:UÏh`ª3@½ó’#ÍZؽyráÈCŒ…yÎŒbì‘å´Œ… öÛÄØÃ~ª)3 Æt˜Ò û Ó•‹µ¾2ÐI†§d±D &¢š(wC¸mN’–¸Gî“Þx@ Á@x@ã§—_ó¥qŽŽO§‘M¬ËV'k­ÿX¶çÉà'Å›oL”1ö@{zÆÂfb,¼ÇŒ‹Œ…ÞöëÃØ“~³jUu 6˜>.nçÑnÃÅçï­¸ß5}â€^Ƕµ,13ÖmÍͦ¯©ÆÏU›èw–6¢w¨=‡½X€>ÊE¥jËv9N‡ÓQ¤»øuñëâQQQt+üVø­pÇ.Ž]» ¡¹N®“ëJA“ä—R5Q7pãó«ì¾Ä}‰ûc½c½c½»Çuë=èAl"›È&À¿à–ö =HEÚâ½Å{‹÷ #F,¼¦rM嚊¤™¤™äóRãîèŽî ø¶üòe^Á^T‹;TM“©åß)]¹];M=Z’‹ V ý,µOÒ%¨„%a!Rp ­`û'YR& ðû ð;W„XCÊtÙ\ÆË}Xs¼£ýI4©Áê‹Mø´8ÿdɼ%+öã!~ì}Ñùyã.UÍÎY—NìÞ£qƒAõ¯Ö¹®ÿ 7ÙÀZ?PsØ¿úž¯Ç‹»u­ßát»•ojØx­ñËØT׬nyŸG _ÓÍÜQ*WL kÀæ²›r/Ù ùFö€yþ¿+M…–k‚ý.óqžƒ\2_î|צB/­ñázõÌ_ÕÙg5Z¯9@Æñã~#KÅTšCûr9ÿáëŒ,,¯t|ìŸñ1ì^Ÿè³)}žõJpÌÙüTýõªìÇá>ýÒ{j0È`Á ’FÒHZIÛ’¶%m™.ÓeºAB ‡\¯& ð­ùÅÆ4;¼ƒ=PYÕ]WœP9Svq±Òsbu dj™Ò§d2MÌÙ¶šÕdÝþiT7:¯ãby)ó`"<‚.Öà0–¡?WNÛ“á™c?5)´ßsö"žáÔ®ÛC_¥õ®Ùºn]ÿ±÷»Lr|ìÑÒÞ×°!ÒY;k_eé®·£#›Ü›ð¸uÜ¿sÌå¯î*º¾4ÅîS÷Š©2ð—q¢!`*7î¬Ý¢‘žƒYZç¦MÛœix½Nº~ªù;ÃãǵCµÆª’&´cùü€>gyoªV¸¿àV™Aê€ìÓ…;#[¾yœsåj¿0»¤ a“b¦‡r/¸QvªÂ¯R.#žêÁƒ{I“H SÁ ÜäÍùµÌ}0'°‘(æ§óÉ,•ð„šUoåüŠQóíØŽíQ¡^¡^¡¾·ÉÞ&{›¸luÙê²µqÆ5×èT«S­Nµ®®¹ºæêI"I$sgîÌ]9ú.‚ÿ{mç"¹(E)J#?F~ŒüØgsŸÍ}6Û]±»bwEœ+ÎçVTT(D9•U!zõê$þÄŸøûûûòÉ|2ŸŒc8†cÂë–€À÷à—‚¯bwñ@#pE“*¼«’rýKWX È°¦æ^,’½åkéÕTùQ¢Ê¥’þ„Èx¶Z †»€€À*P2ð…%8-—ó‹Ø)’Hæ¡‚^#®deáø’Þ5à žá€Í•ÅÏõo¯V/iTAçGÛ¶Ú®ojŒä·eİ‘^gµŒÅ†ÅÔŸ4ôư&=Vï5 [S˜úîJF—OL\G$)m’`ùTõdIÙñºÇ cµZüe>ý©%é ór @Õ2Þ5q\Zfaˆ¯î¼?ðÌùí¶OÚbb]³ªBÕcê¼ûì¾òôÿ}«%\oêGzb–`)ŸÆÆ1=y'¾9sD Þ#-u¨ù¿.Šï+…R–ÇòXmOÛÓöqoãÞÆ½=›|6ùlòèâÑÅ£‹vØi`§°þaýÃúçõËë—×Ü'÷É}ÖŠµbB Î_RÛéHGºâUçå»—ï^¾+lSئ°Á2ƒeËìÚ´;Kci,%$ƒd0ÂûÅ-Ó¤I“T›jSí\›\›\ù<ù<ùÄGa”¯ëµ®×º^1ÏbžÅ<ó]ç»Îw²¹â3˜ÁL¸ß–_>nQ 9丄Oã*!/ZZyKž"~s ‘ÆžŠæS =nÒ^«H½‹ò¨-èvBu übî%Õ–·²·0Åx~ö ÷N\.9$~ÈãZ“‰6¯Ÿ¿µ{ÙñÕÑWG_i??÷lxüØW_íÔáEƒÂYMNÉNê;ðNç™d‹ËK±-yKŽIèƒSpcRìÇcÞ”Ênðelcƒ•8§¼’o[T@áîòÏñ©HEªb¤vÏê=«÷¬þ¨òQ壊û÷îºävÉí’ËRX K¡FÔˆ)1™ÈÿLŠPÄŽ³ãì¸Â€Nï“Þ'½O–]–]–]­VµZÕjeUfUfU¦˜¡›éfºù¿”©p¤QŒ£¿Å[¼ÕH×H×Hç¸. çiÎÓœÏk>îàî Å(n…€À Q'Ú›(W OéÓܽþÆV5åS齨tˆ¶ÜcéëaQ½-œë´Qä¡Î¤ *…ÊøÆTÛú?n§uÒT:w°žt†ÊÅ%ÇU.ÒÅôU¬A-ÜE-¡R'Æw?ôC?@H€bó˜¢1EcŠžŽ:þéø@ï@ï@o333üˆñ#¹En‘[Õ]n~®nICÒ4TlК¯5_kþ¡ã‡Ž:Þ¾¢}Eû X–Ün ·æ¿”éw¸+âé:…N9q4âhÄ‹m/¶½Øææçæçæ§ìekéZºVpjøÁ§êd·"=è–Û{û˼çr×ÎU–‹g ñb»–û/÷¸i@}¥j1=CæG¡Þ¾ êÿZG É@2ªÒ~´yF½i[RE{Ò¾d"u$ÒúóAÄ[ñïóŸÕR_þòàzÁ­¨ZA1GI òU~ß Ñ&ÚD‰HD¢š·š·š÷aßþ‡}ŸÝzvëÙ­9ïæ¼›óN™³#éH:*B…GµÀÏ¡èPêOý–v^Úyiç×®¯]_»NÖ›¬7YOY« ç–ÿ³V1CàókÀÙgoœ½18bpÄàzëê­«§t•ùu1Y¾#œ”\#CéŽçnY/*«»øÅÐL™æâCv3¶"hDÚ‚ƒín6œ¤ÌoI‚Ho¡ÞþþedKHaKƒ` Þt”ÿT!üÿ#º¤4`@¼` ÄÊèÐ_—/ðK©¾\µ éB”–-6¶ØØbc˜{˜{˜û}¿û~÷ýi4Òh¤Œ8KJH )ùrÏ„‘Ýÿ£q4N1_1®Û¸nãºE÷ˆîÝcSÖ¦¬MY’’’Ï2×p ×~¶ù?â§õ´m9ÚrôUr•\%ÁÖÁÖÁÖµ­k[×¶Vž±­E…™+ïÓ£Ýa¬/Nà&D ¹7K›•ϯ(Ë7ÃG²Ì@iK’ º¨-—žV0î¨-x% ü!(<Ó € xÇÄ;²0D8|•Ó–¶†- i9PPPv‹Ýb·0ã0îeÆËŒ—ŞŞŞuVÔYQg…F®F®F.T 2šŒ&£¶´5Xƒ5 YO---éFéFéÆ’Ô’Ô’ÔŠŒŠŒ ¥FòŒߥ[ÿ*XOv˜]ƒ ,§²ôjyQ•¹ÈE¤œìÀRHioòƤ†ê6I}¨Bšdiÿh c?š=}ª*|Äf|ƒ¼Ú@­…:´1 Ú¤Kš!é"Zä#Ríùƒ…jOÚÛü*íÙy” W Mô€&ÊÀaì÷W¡Py_€X€d$#™7æyã㽎÷:Þëû;÷wînÝܺ¹uëdÚÉ´“)ÓeºL—t"H'ÔG}ÔÆÝÿ ®ä«tè12˜Ô06Z³%G¸(C ŠÀ!ï iµÉe?#Ï™žCŸüý ÿÛ\…Ù­Ž¢²[|ëüV|kµ“﨔ÒI祔N!íè!E0GÌaì÷7ÀÇ¿ãßñïhkÚš¶NŠIŠIŠ9µåÔ–S[d‹e‹e‹}—ù.ó]f9Ür¸åp~)¿”_JdDFdÊqwa^÷§(¤+Q‰Êããã$Ç$Ç$Gî÷‰ûäQåQåQs˜Ã\)Óù3ƒä 9¨HëlÓÙ¦³MíˆÚµ#y§óNç.9Sr¦äŒ2ëflÆf¡â¾¿v|ÂûH:â–•õ® ©:[r¡*Df‚‰¤%QØ v@ÓR:A’ƒId0 ‘à›²K8Œáè.Tº€€ÀŸ)’X’`AšÂ‚ßX•Åo¬˜¼òhÅ䲡ãýˆr³ë äf«äx¤’GœUxâŒR j 5¡ % ÁAÂKx /Q,ˆ<›s6çl΋±/ƾkþÔü©ùÓÑ#G=R¡þŽõXõ° l„q÷Ã{¼Ç{ä#ù¬ˆ±¢(½(½(=±“ØIìTïP½Cõ)–#™Èü7u¨xš‰™˜©Ø é¯é¯é/].].]^0¶`lÁØÒf¥ÍJ›)æÕÙav˜*^@àÏ„Bjê!2qÓá§™Úe2«\ž;¼”U­h2<á¹tR@x­jÃUû)š‚x\*O@@à/Ú—±[K¬…%ÔE×¾Ö0­®“-Z[¢•øìÑ+‚9Dø¬?˜-˜Ã˜¨Àø‹ §<ƒÀ¿¯ù/£æ¤’BEºáކ;îxtæÑ™GgÚ=´{h×*½Uz«tÅ^Ú“ö¤=Z‚€Â§ éBºÆ0†±»¥»¥»åséséséYû³ögíuúêôÕé $ qˆûi1"±H,+¼áGŽ9v䨄~ ýú͉Ÿ?'^y*+jE­00@¨x?ÈU$á˜bÃEùЮÞ/[á0¢cË¢†ÝJÐõ ï{Áâ¸~-P"ªJê£D¨<¿ÿ2U¨ yZü~’Oü%ïÏÉE6æÚ 1Ô€j£òÂøð¿G1î»[±•Þ¦·ém‘†HC¤1§ÇœszÄèÆèÆèZ~hù¡å:Kt–è,¡*T…ª‰d"™¨4@ªW§5£Ê8¦¶b[±­ø6¹Mn“[n}¸õÁm“Û&·MЇ>ô•®8p_"$hA Z\>—Ïå+6Ln:¹éä¦)©)©)©U'ªNTUäÕÕÕTö¾c_þ•Ç)–rqÿšPËv.>\n   \ÙsæÇži “ëè>Tå¥ (Gd¸€!ÕT“þüükáj9€r¤2 ¤‚ÃYp°Ä{XBŒƒ¡ L9NÏ ƒôèÉš<=Iö«= û.¿‹p”rÝQŠZ„¢8˜‚ûbô £ÄÿBá³>S0…E³h-+–ËŠ <ø¶ÛÛno»Õ÷­ï[ß·xÿðþá|9_Ηã)žâ©ÂŸ[0¿jÆšL“i*Ìë¬%YK²–¼óvÎÛ9ÆÞÆÞÆÞ¶õlëÙÖCrCN“Óä´ÒmIÁ\ÌÅ\ÞŠ·â­`˜èÑ£7¦¢UE«ŠVEoŠÞ½A! QÈX P* |¾ÙXOfIqßòê£ÌÒXkվ⻜«æKÉ‘Rñ¬@[8 •. ð†A9R!G Ì‚*¤£J¹—B¦¤LaC•%¼T–¨_;±Eýš¤›÷I7@~À;Æãä4r˜!fø,+©.ð_PÈDú3æO¢H‰R8l[tlѱE2s™¹Ì¼glÏØž±¶1¶1¶1,œ…³pÒ™t&•æ£àõ®h¶*L…©Ðûô>½_<¿x~ñüxq¼8^¬æªæªæjsÀæ€ÍÌÃ<Ìãmy[Þc0c”ÏÄLÌdy,åIR$)’½Íz›õ6—Í,›Y6³È¬È¬H9–¯0ñW%ïÇ7{œ}š_2³,€;jËGðÁÌLc†x è¥viOq e¦ƒ¤3<„JøÛ"ÇÈQÊ£©èŽÔÒÑgo•Ž.·Z9¸ÜJrmÄÉ5Õñ^©Ž]¬³@tQ)B“îÈ€.€¡DÍý‚B&R $,¥³t""""º’u%ëJVx¯ð^á½L4M4M4ǺuëNf“Ùd6¬a kÄ#ñ‚Ê»’çxŽçdÙGö¡-Ú¢m²i²i²iÞ²¼eyËìÛ¶?¬·Do‰ÞV“Õd5‰Ñ#Ÿãª*cI Du¸êpÕáiii•W+¯V^-í[Ú·´¯"';À°‚ô³€À÷ãÛ¸?.¬Wªƒ0.«gÌ¢!¢\oâ2QeçŸ gÔÞÃþÆ؉T"•˜Išc¦lý“î²õÅ}—0Ãà{ÌPeÍöl•5ªífïSmGê¾§aŠÛ0…ÁB¨Æ¯P¸¾tEWt%GÈr¤ªiUÓª¦û5ökì×ÈÑÎÑÎÑn¹²åÊ–+½J½J½JÙV¶•m¥óè<::ÐŽ0Þœ7çÍqwp'nrÜä¸Éىىى¶¶¶¦Z¦Z¦ZЬ$‘$’D届Ŧ•¨D¥jªjªjªæ Íš/ÊõÊõÊõ M M M”9çaæ V@à{våßB5<ë~axñ‘Ψ'_ͤl<>Š élñ[ªÌtà$¼‡ üQ¸»ˆA G9äÐfÚ0¡>0Aw8£{ù²£ãË—•µð­_Ö‚ÅT.g1\¬®'‹wÐÇ;ÔÂmÔBõç+]p üÇ=2‘+øü …ÚÌóSÏO=?u‰^¢—¨XO¬'Öª>T}¨ºÎ,Y:³>Ù¤ˆ‘"ÁyCŒé(;ÊŽ*Fßï%ÞK¼—7'oNÞmmmmmm3#3#3#…p$®à ®@Ѐ¼à¥(Fê!õzhøjøjøVÜ®¸]q»pnáܹŠÅ¬l1[Ì ?)$ 8®HÛìÔ[¢™ÇÜ—¡]rr¡ó dÆ~¸5ö˜_J³ÞŽ3 5¨‹Óºd#L  ¡öþ!(¤!E  (šÓ)hþoò)ôã?£ú%¥rhÀN‡tˆ ûEtòŸ¹¤5yÈÃb,Æbmmí€Ó§NGµ‹jÕnú‡é¦PVê2…LQõ ýsPjïÖ_s|ÍñggŸ}vvºþtýéúð«ö©‡z¨G[Ò–´¥"¿} ûö-Ù<²ydsqÊÅ)§˜š˜š˜*G܉3q&ÎB |?~Ûˆ{ r>Ë;–ù:þjÁÈÊÃ2OÑH­y"¿¬f¼®ŠV)ÊQŠy[~»Žžh;¡êþ!ðø¼¤•A ø­x„úd/ꃣŸÀ`¨Ãg•÷²/ÇCÅxÊoÂSä£ò!£IÁ†hÀŸÇø¥ÿ^¡£ ]èbCl>|*øTpÈýû!wYYY“Î~ý:û988(Ýf&ÓÉt2ªP…ªôè»Bä1ÉHFS4EÓç>Ï}žûȞ˞˞×/ª_T¿ˆ\#×È5lÄFlT¨Ð z@éò*•J¥R©Æ%K—J[•¶*mõÉæ“Í'8Ãά%kÉZ ]^@àûñÛ ÷WÈÿl¸WyðúìiáÁJS™3׆ŽC%ÀGòŒÇiøªÅ€‘S$‡ÍÀ|Ü‚'lPC¨z ¥_œcØhÄ€ãÝÁA½jÂ…<Oš OÅŸ’;ŸIîhìÝüøðãR"%Rº±n¬1 ÄàÝ«‹<>Æc<ŽlÙ<²yÕµªkU×jøÔð©áSãtÓ5N+Mü“8‰“ʵ•y*óTæIÎHÎHΔ·(oQÞ¢*¤*¤*„ð„'<¶a¶ ]@àûñÛïQÈBž¢ŒÊþ²—|Pn³²í•U\"¹B[ ‚oÌéìSU—šJæ‹&q‘Dp†) …ª@%RP ²ªé^3Ïøñ RxBZex«Y•¡|bêbùDU¯&ª^ÒGãIÑ9’étòþxl!P ÿÂÊY9+Ç Â ù ù ùŒƒåË–gÎ<œy¸ÙófÏ›=÷‰ò‰ò‰bíX;ÖD Ró䟬ò~ ×pMaĨó¡Î‡:é¹é¹é¹ZZZ./\^¸¼€;ÜáN]©+ueMYSÖTq¨Q{£öFíùD>‘O,++ShÔ(œj„- ð½ùM†;{Žl䃇\E°¼”¯Ê_~»rÐ[ÄRžñ; §¨ûKǪÜäÞrgÁAi ü³Ç<þ3ùXƒ|™«_QÂê—Un4.«¬(7½¢˜>°jI¨m ˜¥¶U²¤S ÉøÑÛðˆ)< ý›×O5ã›é3}¦O†‘adXÜÛ¸·qoÏ»w;ïFkÒš´æ°¦ÃškjàeàeàÅZ°¬^á^)Gîÿ‘n3l5[ÍV+\eŠ-,Zøâü‹ó/Îk¦h¦h¦ÔîX»c펊ñxåE'tB'űºáºáºá¼ïÅ{7)nRÜD¡QƒR”¢TX, ð½ùm#îw‘€t¨ByyŒÌEÖ ;¼Ø·l!d\/z“ÙñÃX¢V_©¥8NÜ–;D#”tua-¡êþ@^£ê P‡7n²E)d‹Ê2g·+ˬ4_íPi.’(ÉÅé-†ˆÓ¡Âl QýÉX²".+÷73ªÆ·Hp‡pˆ%GÉÑ}Oô=Ñ7îcÜǸ–ö–ö–ö#†Ž:b(¹L.“Ë4’FÒH´C;´û‡*ŽïÅ^ì¥SéT:•wãÝx·„â„â„bIII‡Z6µljÙÐTšJSy-^‹×bE¬ˆ)‚aé]Ô»¨w‘ïÆwã»,BòEu)§…wµ?üáÏ,™%³”¥ÈRd)ûîï¾ë0ס®CÝNºr;Õð‡iÓÃN 81€Œ"ãÉxö‘e³ìPKb``ìöû4#ÍH³444w:ïtÞé8¥9¥9¥YZZ>À<cŒ1F“hMҳѳѳá›ñÍøfÙ%Ù%Ù%BÇø=ùS„lb®H—˜ÊùãГ'3úÜ%SPÀâeÒT{ÆG¡º¾ ò/Fu.N!÷‹Éþy? žÐp 9„‘•gÃ'«×|®0å³geÏÊž¥,MX–* ð»ð-Fóñ‰Šd‘¤òˆl'K—™ÉWQw’íÐB>˜ÍÕÚ­%T·€€€ÀïD>Ô‘`-À?Δó‹ ÚT¼ˆ=Ž ì±ôàŽÙÒƒª›æg«n" *ÉEñ(‚=!Ç?d´ÝF0R.‡q‡Í،͸‹»¸Kš&¤ ¹AnÔ„šPº“î¤;ñPÙT6•Må‡ðCø!ò=ò=ò=Uë«ÖW­W|çAР!Iž]+ºZñZêµtïûðšá5Cneºdº,;sìÚ±kòù}ù}Ö dÉ6²l£ªT•ªcbLŒ±k°ÍÑÍ•ËaÿêpàÀñGù£üQd"™¯Þ¿zÿê}Qã¢ÆEíÚ5´k¨1\c¸Æp¨Bªâ“â“â“êÝÕ»«w—¯¯¯ÈÍÏÍÏÍW–V]__@@à»ñ TlÙv±X= (²2WTž" ”g‹[‘6ä9^ÂØh•F/Õ{è‚AŸCŠ|GxpàÄÈD!2ÑJ®…V娇rpn'Ã87ñ­9‘â[š?ÍÓü¡TcÍR}YÎ-UYìé9Ø#žï…øop%ŠkîS •P Ú  ÚðùüFŒÇxŒWjÃÿULX9ä³Ú¬6«­¸;¯Õ^«½V+s.s.s6jnÔܨ¹™­™­™mÞ¡¼Cy‡ôFëÖ-¾'¾'¾Wú©ôSé§*·*·*7eiÈ@†Ðí¾7ßÂpï‹„aäï*­šTìS)“7 Òq\%€Éˆ7¢•£&]øýPøªz `$°#?ÂNþ´D**o»ò¶²éõ—˦#GTÇð̼òX…ó mpÁb¨!šJI€}IË ƒ2ÈÐÑ‘¸wâ®4Ðß“÷ä=j jÈÉÉ1üë£ä8Žã¸"ɵæZs­%Û$Û$ÛÔÌÔÌÔÌjUÖª¬UiµÅj‹Õ–š|M¾&oÖÙ¬³Yg…k¶Þ"½Ez‹ôëê×Õ¯«m m m ÕJ«•V+^‹Ù1»"•œ»9w«’5}5}Ëu«zVõD{¾”/Í©KrH޹ÌTÏToå¦åÎËÓwdëgë§L~”üèõ„×^OMMM~³êͪ7«Ê[•·*o¥xQR5Q“3ä 9C^—×åu•â‰ùÈG>*Q‰Ê¯â•þÙ˜Žé˜®PæÉtÏtÏtÏÚ“µ'kOÝÙug×íbåbåbõ’{ɽäô·éoÓß&,,\¸»pwány±¼X^¬,'©H:€À÷æ[ÄkŒ]ì¤AãSziqùÄBßòý•ã ϪŒWK0³L÷h¨6@¡Â~W2ð¨ÀTà9;„ç°Ã Øá—‹;2Ä´ª6@,ð†5ÀåßbPÈQ9äx9*”ÿ›3µ@34C6>â#NáN1Åç'ÒÞ´.­KëyyyëÒ¤;HÛJÛJÛʨببØZÝZÝZÝü¸ùqóã©©©zçõÎëWUUUUU“\‘\‘\‘H ¤d™@&FFF}¬ñ±ÆÇï²Þe½Ëú0ûÃì³súåŽË—”úfÙ›ewOµ›j×ñ¸Ùy³óùã@U 2<*´+´ã‹ãìâìë»ø¸øØYÔ±¨cÑ|GóÍw ¼;ðîÀ»ïÄïÄïÄá5Ãk†×ŒéÓ?¦zZzZzZrçäÎÉ•–ùG|ÄçÕ\1ˆA yBž'ˆ@"˜:SgêØˆØøÕ,ÄK.r‘«pOâòùƒ± ± ± NæNæNæNnNnNnŠ™½Ûz·õn‹ʼnâÄ¢§EO‹žV-¬ZXµPùíXK€t¹gïÉ·qŸÀÎâÖÁò‚«eË*¼JZUr²–¨¤£ÈMHX{®[)ý$Î`?åèƒb!‹¬A@@@à÷¡L†é5œðrhÀŒÁ ïÐïPÁ^¢€: , A%^¡³8CLƒ·51­rfü›ò"!ФÔ[ê%õª=®öøÚãk§æ3s3s3sýûú÷õïß5¾k|׬žY=³z†é†é†é“ &LR±U±U±­ZPµ jA•Q•Q•QeóÊæ•ÍåëåëåëK6•l*Ù”u7ënÖÝÌK™—2/%E%E%E¥ÖN­ZûS§„O y§òNåÊm’Û$·IîéÜÓ¹§¡øžÝIjŸÔ>ЬÞõ~(m/{.{.•ˆœEÎY ³,²,’Ô£{D÷¨sË~‘ý"»‹uZ×iÝêx«ã­Ž[ß°¾a}£ŽfÍ:š.]]ººt•yɼd^)/R^¤¼ˆÿ*þÕ‹˜1/bÂËÂË¡%K¦XÞZý'ŽHˆ„Hèz†žacØ6†wå]yW…ÿfÊ'"‰4›fÓlžñŒgO|Ÿø>ñ´bЊA+jšÔ4©i‚"¡Hs„æÍ¢•¢•¢•E“‹&M–í•í•íU.NB’„N& ð½ùkÀ¯c |ÑñˆÅ32Œ¾}´nÔŸfç,/™Ìã/òswÏ8•ó¸qÉîøKûÈ:<Àzæ}tn€€€€À©öÿ¿ÌÆÆä<#›½@.§Y³ˆîÓ鹬DÖ¡òމOTU`wU¼dïù¾Rü‚SÉ›û·Ý>&îVr®äœ~=ãGÆ4BÔk©×Ò¨Ô¨Ô¨Ô¤1HcêYÕ³ªgåÝåÝåÝ 6l.ØœïžïžïžÛ(·Qn£¼íyÛó¶çôÎéÓ;£OFŸŒ>iUiUiUñgâÏÄŸùü1øcp¥}¥}¥}å”Ê)•Sä÷ä÷ä÷~ö[å 9Ün47šug]YWÞ‹Æûß«Eå½Ê{•÷&f&f&f´i7Òv&ÎÄ™X?·~nýÜjºÕt«ézWô®è])ºRt¥èÊÇóÏ<Ÿi•i•i]'ºNtÇÖ­['9%9%9} 臯!HgÒ™t&wÈr‡©15¦ÆÖ±ul.á.á*®âêïã1OдÏÇóñ6Á6Á6Á{›ìm²·‰b–`ôÊÑ+G¯lÖ0¬aØ<ù<ù?}~ºì¡ì¡ì!ŽàŽ`†`ˆÐ¡þÜè@*"KªK–*6\o=øiûÇŒ­Þ3ê8cË» Ÿö*|ÊžºŠ½¤vcØ©Hjô¯££åñš1ùÐXsÆ{>‡1Æbtc,º8©mRÛè—‘“"'E Œ6Œ6¼«zWõ®ê±€cÇÖ/\¿pý©S¦:ô[Üoq¿ÅR;¤vHm°­Á¶Ûôòôòôò~é¥CbH é}zŸÞ§é4¦S{jOíÉ 2ƒÌÀlÀhÊü´=Jre¢Í¢ÍÜ:Ñ$Ñ$î¥h³h3MâÖpkÈl2ŠŒâ48N‡Ì#óȼŸ;¯¡£¡£¡£w®w®wî¸äqÉã’wiíÒÚ¥õ@ýúõèìèìèì(Û(Û(Û(Å¢Xà´ÀiÓf­›µnÖº®Q]£ºFÕm]·uÝÖ?ûÅÌasŽã8Ž£†Ôb%Vb¥rou)ÌoéCú¥3«®¶®¶®ö:èðìijÏNtèÛ¡o‡¾ƒ6 Ú4hSÜǸqç{Í÷šï…]Ø…]p„#1ó1_è.ß›oáãž2”ðG.Þ@+?¨òƒ|0€uè‰"Ö’¹¨ßçÆh4RÑ–Ô*Ž(W©Žë˜h†µ8 Ü?bÄ29b †P­l”TUY«´Kþâ¢gÈV3VÝ]e+/•—©Frœêµº—ç\žw­åµ–)ƒÓåéòâµEóŠæß/¾_|¿8½8½8½2®2®2K«}LÆdL& $$þ¤?éÏŽ±cìÎâ,Î*¤Y bAxƒ7xƒ8Ä!Ž…³pκ²®¬+ P€eiñˆÿwz8|:?˜ ÕjÞ(³¾ú¾DÎäLÎp7p?âGüˆÁŒÁä9@(Ôo>†~ ý¤¤¤§8TýºúuõëÆîÆîÆîÛ4nÓ¸‡‡‡eWË®–] ¼ ¼ ¼F¶Ùbd‹Š'O*ž¤#éHpOpOp“ù&óMfp\p\p\J¿”~)ýJ‚J‚J‚ªûÍ“=dÙCÛÐ6´ ïÄ;ñN,˜³`…£ *PŠß26Ïœ˜s"õH=R/_;_;_;Å(Å(ŨõÜÖs[Ï­u¤Ö‘ZG¤ÑÒhi´¸™¸™¸YNlNlN¬B“,!KÈ…Ö»Ðiþ î2©$Ëv6è~¢ÅSƯr™ÉÇ,õ›5wvâ€ëÖцítá‘ Ù‰<<*O@@@àOÍ(,ÇERe¦úyµq9Œ1ö.ˆ1ÆÞ\`Œ±KÆkÒØ{ª÷Ôÿ\µ Ô‚+áJ¸®ׂkAÓÁt0q!.İ€…2ëŸ' âJRŠ MHÒ„ëËõåúÒ«ô*½ús‡j¶Öl­ÙÚóµçkÏ×þñþñþñ{oí½µ÷ÖýK÷/Ý¿w)îRÜ¥(×(×(ׇÁƒŸ3:gtÎÈ?Ð?Ð?ÐÓÙÓÙÓÙºƒuë?{m÷p÷ȲƒìPÎ3Ã1ûuuÈ=âqÊßeß$ß$ߤ¸»qwã¹úæê›ûl쳱ϛ1oƼ3`Á€(ôݹZ\-®La S¡»üeàz‘h2F‘^©âÞ¸+_é<ÒC~qÉÓ¡^yÃæŸt§á Z+L?‚‚´5éJt„zøSc ;Ø)’ô8וëÚîY_Q_‘·÷€žzvÐï·«ß®.Ò=ô406)5)%cÈ82Ž~àêruI "A¤=iOÚ+GÊ»¡Û—ÕMÝX›Õc©6B#4"jD¨‘{ä¹G̈1CmÔFퟪ§§ç\Û¹¶síÝvØ}Ó¨M£6º™x3ñfbøá?†ÿ“““ÿRòRòRriÆ¥—f¬Ñ[£·Fo¤öHí‘ÚŽ›7;n&ÉGò³ñȹ;ÜîmM[ÓÖð†7¼?ïø7 ªч´ å‘ì‘ì‘|ßó¾ç}Ï€µkÖž³8gqÎâEì‹Ø±ü:ùuòSùŠ{Ž:Š€À_í9G¶“fŠô4Ï–7]Z2¶üÕˆ²Kê )M\|sè3ŸwË­Û+ó3r… êM@@@àoÅß#ªèoAЀ>ô¡¯ÛDkÒš´&gÏÙsö?Í®Ði1Úc´Çhw¦w¦wæâ÷‹ß/~Ôó¨çQÏû¯ï¿¾ÿ:Á;Á;ÁûyÀó€ç·‡Ür{È‘¹Gæ™ëÇùq~\“½Mö6ÙkœjœjœJÚ6¤Mõò‰ ±!6T“jRMbM¬‰5ÎáÎÁ¾ðUŒš+³*\ƒÚ¡کŪŪż xðê᪇«®ºívÛí¶[ؾ°}aûZ¿ký®õ;ÅA\K®%×ò/ü& ð—BôÍJÚ‚ÐÏ>…9ã˼*<Ø8¶œ¥³qìîK¬¸w´½Nˆ Ü"ÛЮ€£Âmø“R]¦Ðpàz‰ìEöp„Žø€0‚‘¼†üŽüÄ,Œ…A:Ð" Ñ?âjŸuX‡u<Ïó<3˜ÁŒ4&Ic2šŒ&£™=³gö²f²f²fðTí£¶Lm™Ú²I ’$Õ)¯S^§ÜÙÕÙÕÙÕu¼ëx×ñN'N:të8Öq¬oß&¾MR}R}R}b.Ä\ˆ¹ðÌï™ß3¿q‚8Aüb׋]/v)…)‹P„"ôB/ôRÞÞ8Gã0 Ó07åMySbN̉y©c©c©cr~r~r~{5îÕ¸'k+k+k[Ѱ¢aEòü²ü2åe,€ÀÆ0º‹€À÷曽“·D¯XmV„ºjÙ{Y.¹ZÒ~«Y,›]dÅT2Uòd²ãµñS¶¿ ¹úB,jN»‘DzGüEÖH¸ ÿªÇ0±‡=ìÑÝÑ0È1rŒ#a$Œ„ñøGüW+ÁT¦ªLU™j¼Æxñ§áNÆ·Ü×r_Ë}6Ûl¶Ùl3V7V7V×sÖsÖs–;ÊåŽÅÅÅIW’®$]I(N(N(V,}»çíž·{Š¥ÅÒbéO/P%ŠEÉuäÚríqGÇw|pÒà´ÁiU%U¥U¥e†eeþ¹þ¹þ¹/ν8õâL'ÑIü&~¿I¸½ßÿò­ ê…`üÈΡ5Æ:ûš70, _7òªÏn™±¿ê;iÇo¬}ºyåà–Q±¢º–äÊšñ³™žp¾šßx…WxEËi9-'$Ê—É—É—ýô ¾}5ú6®Ù¸fãšuSë¦ÖMuÔsÔsÔ«Ý®v»ÚíL‡›7^Þ§¼OyŸRÓRÓRÓO]?uýÔ5âUÄ«ˆWá¥á¥á¥ésÓç¦Ï}«úVõ­*ŸÍgóÙŠ’G4k¶iÓ¦Ù›fW-®Z\µ8Ï'Ï'ÏgzâôwÓß%Ñ$Ó$S…_ÄñE øÞ|3WÖëpç 9èSïüx™ ß…¿CÇp´+ ¸pzHºÊ8QgÄŸÈ#ô îf S€¯"§:ÀŠh¦0 LŽt¤“xOâ±;°ƒqŒc\ñ™â3Ågnã_ O O OË0Ë0Ë0û*û*û*w{w{wû 2d½2zeôªß¢~‹ú-P4 h@QêÙÔ³©g_Oz=éõ¤·åoËß–‡œ  HÙ’²5ekîŒÜ•¹+õ§êÏÕŸ[¢VbZbZÈ 5 5—É&±IlVc5V 7P@à{óí–’ ‡jã žâ­d>÷íÝypTU¾ðï¹··4ÝÙY‚$‘€D ›‚"qMAFV– 0aMÁ0¢ŒŒ2ãÃ2 ‚;£€Š "È$ì„,„@ötßî{ïytû*<*Ö«÷ÒL1õýüuªëœî®ó­îúÕ©sΧl¸Ð}ú¸!£œpöµ…[&†¥Ùίy°Çé»Óßù¨õÞKj’ŽóFwy±ûp„aý¯•Žg"™J¶’­d »° »±ÝØnÜpI¥²DY¢,‰ðGø#üm'¶Øvbª'Õ“êI.L.L.L—8.q\\J\J\жN+×ʯô-è[зr­GÇõî–Ð-A}βŲÅÑŸëÏÕ£«VV­òíèÿ§ —/\÷ŠbüTfÈ †Ct;HGû_® ³.V‡)»sžºcÐÓÆ¹?¶O; åŸÛlëÐÏõŠÏ‹#¢«à^D&'ˆˆèÿ¨æ..¸àÉ"Y$+ó”yÊ<%R‰T"kê<ë<ë<›š”š”š”>+}Vú¬¥«–V-­ú2oWÞ®¼#çlÍÙzh£”R~¿CJ)¿Ÿ$¥”§>•RÊøe͵æZð+LÀDty­¸Vi&.ˆí_Ž;Ù¿§,|qNúDzò%môà½%ÛúµvÙ[ìÕ_ºxÙÿý¨"""úÿ«YÊk5ã1Ÿãs|.†ˆ!bˆÒCé¡ô¸y¨ó=§á4âËâ—Ç/Ú7mxÚðɾ9¾9²´-á@ï.ï®#ÉÚ%íR“Ôf}šõ |–!>Ÿpâ‰n½ŒÄàFO¬Åùm‡ÒÎyXò°@Oñ’ÈùœZ¢Ðÿ|ëJ4øðœØŒÑèxeeU‚w åªpË/õûŒ×£Ö8æÙ ×LÛqËÈ"Žã91S¤"E‚T‰ˆˆn :ô`»)š¢iðl Æ‹…b!º qe}®Íº6+½þàŒÁF&a 0Ô,Çò¢5yûò‚VÊJ¹UnåÔÝ>R‡XaÁ`´€ ðJï>è´VÊ…ÝÆLóÿ˜õÝ3ËŠßœûÛ‘gSîhô˜‰AÊ+bŒˆåäýºº[q/…J°“àÆFLÉŸ\vµê0 òÄoŒir„Üñ®íYëJg'ëu.î° hÌPÌ0ˆˆˆþÍlpÀ¼ðbÞÀjcËNËNœ†àQT´€v#_L 0cnED·ì°)ÇÄ(†vm3£ÙHi,Ú–SyÿÜgG ’rQlFD·ˆ¦+ãšú¨ãÄ^ñ$'ˆˆˆˆè×)uöN•Ðàk1V ¼P”_ùjµ2äâ¹ÇqÅ5<9+¬¥½kpÔûøဵ×þ‰ˆˆˆˆþã(uü~â§_6½xû-Í©ˆÒß6f©ñb°8Ž&ÌMþ5Õ= d…#ç#N8Qmê¸p—Kp—íÊçüw¹µÙúqË;ʘ[¤/¶{½aáPadO,Á»pÃ;à """"ªM]¯¸/F¶<hV6ôÕÕ’ñÚ`ÿk–Êeñ ürŠü®Ñ'î¢zMa@‡”1X‰½ˆ€6†ADDDDT›º^qÇq1Ðö|£0NVN×Vú7‹¡â]‘«9I^i¼Â=#l¦!%x¥ˆbáNDDDDôkêzÅý¹G` µr§6ů–Ä{*´T(±Êßð•<$›Gg…½j«PWžTH¸`çáT""""¢ÚÕõŠûß±G¡Ã€QõßrÿÏeyÞ·|#áVоºR£IDATÄ|Ó.sdëØëŽ—l;Ôj‘*¾‡ ÀÍ[eˆˆˆˆˆ~M]¯¸ÏÅÇØ«¼-â°ÅÔ ñÁµuUÃ<ýõwJ¡ùžÔÐ7b=J]®tgÄ‚à¨0Xêü›ý©ërùu|‰ƒêñ†2`AI ª“¼V@¹®¼ež’—dŠû1k–å嘖ΠŽMÁQ™èŠö ƒˆˆˆˆ¨6u]¸{à‡û¡ÁŽ+0¡”oöu1² ›äÝè Ïáõ¨R(6ÞñûÈzá‰A⤣?à """"ªM]îd¾?B„Y:ÁwXo‹ù–¹Pì­áT‹•õÊã±e®ÇÙਙ¢;:0 """"¢ÚÔuá.@ÎÀ×8x¡l¬ö¿ 32ä½x­Pß2S…»Ug| xýÄC ƒˆˆˆˆ¨6¡9:BnÿÍëí<Ó|Vÿׯ9ã(ÇdôCž2@äÅ|öOûª`ÿ©èŒd†ADDDDT›îò ¼‰]vñšêEÞ,ï ýnóaqF¼ŒtxÅzÑ"®“Ë6#ÐG¬@oN%""""ª]h ÷pù‚\…0X D—_¯*ðLñï×s•ÍB'á^±:F:lÖ>%Z T(=òDDDDDt£Ðî=°ÀFѦʽս/ø?Ðçˆ9"GìÄE¼>Ä–©ÚÐqˆ[0]`À ì‘'""""¢…f{W¼†õâ^¬Æôò$ÏZ†ö >Zo¡¢ƒ°²'úƒ}·u)¾G>ŠÍ£r«,ÀhtB;FBDDDDt3KHÞõ p'1Ëæòwrqi­JwÂDþÃt›Ñ®G{K»ÃúOk¦ö?‘€©xUðƒ!""""ª)4+îÝêgPŒ24CCÔ/ômÖ»B½D'XÍ\óñÈÙa=íúÜÍë­‡ VXÅeñ"Æ1""""¢›…¦pìV·ÃçqW¯žõ|á[ ;ÚËR9OžrEÚgXK#ÓÂ>·½?üðc†‹ÞŒ„ˆˆˆˆèfÊ­ù˜’aÞÏüã´A¢yX^”]C-ÙêCîÓöW­“GRÅËè6Œ„ˆˆˆˆèf·¨p/V‘æQÜæ0s—lTo­-Ó’‘eŸ`íì´N<ŽŒ„ˆˆˆˆèf·¨p¿tWiZÅWš¢¡Ù-ñõiu©2Ö5ÛjWGúˆ©h‡DÞäNDDDDt³[T¸5¯hQý!~ñˆ4Þr"®X¢ÕÙn¯õšz:Øéô@+ÞäNDDDDt³[µâþAi“ò;Ñ"IÆÊO‘ÂáámìÕÖ(8P.¬ÀÇØ‰X¸àd0DDDDD5…²p¿ F Yõ¦ö•¿yŸ1P.S{Š(±Â7×5™u<ü;xQ…J£¿™.wâI´C2ƒ!""""ª)”…ûa£2Ðôõ4‹ä¹’žšK?¦nSV `n2ïmØÊãìŒãb–øLÀhl@w4G<ƒ!""""ª)”…û>äãZ éU æ W³=ojó,‰ÊYñ[hæ}rMÔ¢0«½¡µ™:\-ÁÏPaA[4F,ƒ!""""ª)”…û¸‚2Ø¡@øÓŒ³QéóÞ.þí¼'î„Ý„¹‚W+iò39M–D,¶w·æÛžR7)?÷Ã߃úg0DDDDD5…rÅý ~F!2QÒ?ÎøÊp¯©íY‡¢ˆ¿êÝÍAòHt™ã'ëd[ž«Üu ’ÁÕÊÂ}Žãœò 6 Sž«/G•ý¾ò%@Ý£¶4¶ÊùR·Ø¾° Routino : Data

Routino : Data

Data

A router relies on data to be able to find a route.

OpenStreetMap Data

The data that is collected by the OpenStreetMap project consists of nodes, ways and relations.
Node
A node is a point that has a latitude and longitude and attributes that describe what type of point it is (part of a way or a place of interest for example).
Way
A way is a collection of nodes that when joined together define something (for example a road, a railway, a boundary, a building, a lake etc). The ways also have attributes that define them (speed limits, type of road and restrictions for example).
Relation
A relation is a collection of items (usually ways) that are related to each other for some reason (highways that make up a route for example).
The
OpenStreetMap Wiki explains the data much better than I can.

Router Data

The information that is needed by a routing algorithm is only a subset of the information that is collected by the OpenStreetMap project. For routing what is required is information about the location of roads (or other highways), the connections between the highways and the properties of those highways.
Location of highways (nodes)
The locations of things is provided by the nodes from the OpenStreetMap data. The nodes are the only things that have coordinates in OpenStreetMap and everything else is made up by reference to them. Not all of the nodes are useful, only the ones that are part of highways. The location of the nodes is stored but none of the other attributes are currently used by the router.
Location of highways (ways)
The location of the highways is defined in the OpenStreetMap data by the ways. Only the highway ways are useful and the other ways are discarded. What remains is lists of nodes that join together to form a section of highway. This is further split into segments which are individual parts of a way connected by two nodes.
Properties of highways (tags)
The ways that belong to highways are extracted from the data in the previous step and for each way the useful information for routing is stored. For the router the useful information is the type of highway, the speed limit, the allowed types of transport and other restrictions (one-way, minimum height, maximum weight etc).
Connections between highways
The connections between highways are defined in the OpenStreetMap data by ways that share nodes. Since the ways may join in the middle and not just the ends it is the segments defined above that are not part of the OpenStreetMap data that are most important.
The information that is extracted from the OpenStreetMap data is stored in an optimised way that allows the routing to be performed quickly.

Interpreting Data Tags

The tags are the information that is attached to the nodes and ways in OpenStreetMap. The router needs to interpret these tags and use them when deciding what type of traffic can use a highway (for example).

There are no well defined rules in OpenStreetMap about tagging, but there is guidance on the OpenStreetMap Wiki "Map_Features" page. This describes a set of recommended tags but these are not universally used so it is up to each application how to interpret them.

The tagging rules that the router uses are very important in controlling how the router works. With Routino the data tags can be modified when the data is imported to allow customisation of the information used for routing.

Problems With OpenStreetMap Data

The route that can be found is only as good as the data that is available. This is not intended as a criticism of the OpenStreetMap data; it is generally good.

There are some problems that are well known and which affect the router. For example highways might be missing because nobody has mapped them. A highway may be wrongly tagged with incorrect properties, or a highway might be missing important tags for routing (e.g. speed limits). There can also be problems with highways that should join but don't because they do not share nodes.

A lot of these problems can be found using the interactive data visualiser that uses the same Routino routing database.

routino-3.4.3/doc/html/example1.png 644 233 144 413161 11541143712 12370 0‰PNG  IHDRôA^#X oFFs6È *8 pHYs  ÒÝ~ü vpAgŽÌdKž€IDATxÚì½u`ÕØöþýì$GëNÝ X¡)§ÅÝ¥¸»»»»0¸»»;-îÅ+´Ô&ûý#™ûë¼ß;÷ÎF`úO8g““³’³³²öZÏ"`0 ƒÁøÞ…Ú¨€q ·5#„d¡iW¯2= ;õV•ìr½@ã<Ç xjzm~nž!M¥ËÉ AK¡?šÛúÒš¶)ÇvüŒ³®wB÷ö8óõ9ÃóË XЏ!^B'ÌEìÆiðà@ Be†gü3ƒÁ`0Œï_8ú"DPüˆñ|¢'Ä4†Þ–‡xQÇ'ö>½w•v+¸¡WéR‰ù;8úÚ4W‹–c”y€h/u¢Û´§Ô»„È5?ßáÍø$Ï.|´ïúÃÁ¯«Èû!艊d Q“§Òiú„aŽã*pàX$þû9î ƒÁ`0¿¹¤U…œáˆ胆\y²#¥ô òË -öØë|²OŲþ¡‘û…m *¥>§~Æ/´Ì6q–…ÖRc𡛝P_èdj>TúÙ¤ùçθ²éaü¹¨ßiÜX¢ÇÚfxÑâÔŠ’ÐB&E\’eÆ3 ƒÁ`0¿h –7I7<Ä~ÙGJäRzB@EÏ»Z¯¨®–Œ“—wBé4—ÎþõØwm˜FKjk¥tªµs'ËΉ':d®1757ÜÇ;Õ=(÷~%z\!µ±Ó‘pUÞÅ%ßì¤2 ƒÁ`üÑäÖe/‡r…H>òšÞ§åi z #±]X‹à¿°¿¥ìÌÐè|°}ž1€”-22_³öäJr ˆ—zƒæºjmöTSQëò- ï{¿.:ßëò’N«¥VbÇóÂ`~ ÙJÞ‹¢øZ|KkI7¥8¸Ã>HÂ{¼g§åŸsÜ ƒÁ`0¾&²·¥NnöDÖ" gQ'°™BCü Ž •›n/j—÷êIJ|¡‘᥽.;Ÿ¤£b—œJ&ÞRWëÏOçër4ùUGR–fº›¯jz©Åmº´å%íóïÏIgÿŸ; åP£p””9‰†¥ÓüÃ/%ƒÁ`0 Æ×G <̰BÄpÔE%¾ÙE*ˆU©–N‘‡G…qBóž‘¥[*ÕëLj€©»O´/M‹›ËZWG‰÷¥4m1ÓºÆ.e¼ªn|Ð*Ç[Z¸êzì̇6ÒLËs±ñ™5§‚N}=íþ•ûáB#~6_\œ'WÐ@jA)%FvÞ™Ï`0 ƒÁ`ü"¹§8ð؈֨IÞ‚âbîžZØ~ë\uF©IÍGl)Oéäá#)ó¢Õ”›69†ìšq"¥”>{J)¥)½)¥tNýùCfÐíæßpÉ€ròÞ„Ù\ògÑ-”ÐC ;!ÿÂá‡<ÿºŒ‹Á3 ƒÁ`üiÈÞ—¬ ãƒà:N §¸ƒ\¾Ü Ööùì9vëòÎwæ|Þ:4¥E±û’v~ðŒK²:šßƶɾ’µå|Š1Áø8±Éá|ëg¾,Þ=¨æÕ>Þå„-ôœdÁ&þg{ ñØLÊb+Æ#.pPÞ`…­ ƒÁ`0 †BîP)<â‡8D¢ Êä¨ß£KÔÉ· -ʼ/[!rrá}*´ÜÕkÄ’Fâ«K≌ÄKó(¥ônMJ)}B)¥ï¼tÚÔÒaW‰”ÎÐ3èqñþIMËñ­¶ÄÁ¨ëªšûSø›$…ô%kñ‡”—ä^­Œ¿¼®…j“°ÏúPÚ#mCáHC&3 ƒÁ`0 Æ ìa{4DC4ÄvlÇvC1Ã{¼Ç{[­­ÖVëÿÁÿƒÿ‡¼kóŽÏ»ÂÕÑm¦k6.¡ Ÿé]Âqº_瘺[<’ò>žE|²^rH-•¸&y¹t.KÈÞ›_øtüi9>âíÊ˳›IwH¯+v»µ « yæÓ«YZᦄ»B¶`ûÒ”Ú,ãyÖsK3ìÇ\lá}ÈRƒ¶Á;¨‘ˆl˜‘#ÌËËøë!~yœ}íSÞ&¤¾ËpÁô@s4ÆØÁLÃ`0 ƒñ»Ýt $øÃþX…UX…nè†nˆG<âåö—í/Û_öªîUÝ«ºûq÷ãîÇ…ÃÂ!á DÓ!üi>ŠÛšÖ/ó™!´ãÝÊ3ÝõÊÓ°yÐ É&Gg,¢Mßh²ïµüÇ=/êrmÒt9¶U׸ªZ´íÞ)K­AÁ½°|4ÆZ®‰%ŽöÒþ¨ZÃ/…0Fñ²Ìç´Œú‹&]S?^¾Õýžúe“äð,ßœ9Êáç#œ¤×ሠêH¬|/’«¼•ñ'"8OÒ×~Û-µOH/T@8sÜ ƒÁ`0~Dé¨*AÂlÌÆl8À¨Žê¨.±ímÛÛ¶·oß¾\oºÞt½©öP{¨=$^â%¾ðƒ¿uµµ‘%ãmËwªž‹ý²Îµ:U>»ÈºÇÔT2rÙz;íµýyÎnúÜ7þÑ—z¤™$‰Ñìh{Hs}åâ7±ÙOC»ýXºeÁ쎛Âf=·9§k¦I -ç-× w ëŒóƒo8>л,Dý eÄÞ¥#¦æ·®}rçÙËûK‹\=ó°UæsSs58"sÝÉSk[© ]G ÀLè †̰²þç 8ŸÐ«´?UwC$Šb3 ƒÁ`0 Æo¢8Š£8*¢"*ÂŽpÄP …’Sn×Í®›]7ïFÞ¼¹óî¼;/<ž Ïè ú‚¾@S4ESSiS„©TÒõ¤I7>¶øhø0*' g°aû*nÈè¨-N¢{ {V4½·Ôx}âMÇ´Z뜬÷"Í®¬Ms§…Ò1‹·&ÖÑÖ¦Šnê}ÿ÷”n}±—ì\sSõ,¡gŸˆSG6/Y(Ûo­ÓjÛ3:w«`xbR[†d·3 ‰u µ»0Õú/Û=_I.dÑBzuõ£Ó;¹‡¯âÛè›653?ú9ŽX‡exŠÏôºbã#’~ÖvŠñ×éôìt ¥P“˜­ ƒÁ`0þ#DiiDAá Oxâ9žã9la [ÜÂ-Ü’Ú«íÕöj¯4¯4¯4÷²îeÝË µ„ZB-ÅY@,--?.ü¸ðãÂ„Ú õšäË9œ³ý ÔÎ<ž5·ÔH+<Øê—³ÍüFx«k¢rò£ï¥½/§¾6.Zx©Ëss–ä—NªmÕÜzÒžØáš`ÈÝNïë'åé÷_’°òÎuà6¯ÂzßéÚ¶¸6o ÛÚµšêÔÖÚÃ:ÒxÚÜËêîÛÎW7g¾ºÞÍ2½zzET)ØiÝŽ;£_$ÿØò†×ÓÐä™y³;Èߎ?Fn‘ú’"é4IMU [°ÀÊø?Áé¨îz`éˆâ$N2+3þÃôÄ`0 Æ÷Œ¬ã'8¡: ƒòŠì²—A”±­j[Õ¶ªßL¿™~3]m\m\m„l![ÈFy”Gyr’œ$'M¦@S`âÔÄ©‰Sß¿~l,c,cTTeøC¼WJt—Hå;ç¯-îiïæ”©;Že†–m·½d~ª½ëóÙgÃ]÷æ9êsˆž¥¡x*d —;õFõ#uU©?ÝH³IYò”!½p;9 yGæÝ*ö®Nâ¥[x—’xiù´ØÏ컾\Ã"Ï[,xÂ÷²ki{è½QÈ<Þ<3ûhÖ`CBÈGç»6u§¡ZZñ½ö–BÈÍÅ$.þÙçõ¾7o>­ŸX3³xöÀ>/9Bš‹Ýérú«‡'x‰$¤BÀ:¶þ ʪV¼¤¼Í-#ƒH³ j¨¡V¶`Qq$ŽÄ1w~L.Šño¯œ¥XХą¸vå0Œ0r©L"+¸‚+ÿw ‹ÞEï¢Õ†jCµßW|_ñ}Ôè¨ÑQ£«dVɬ’XºKé.¥»èÂuáºðŸíb:¦c׈|"íåÏ,^5ß7ƒeØÙ£ý‹[>œ.ÑO°6¸Òn°w³ˆÊÃò5ÁTôG+ï^^­=ITͨšQ5«ö¨Ú£j     Ÿ<º]Øíp…+\á7¸rÈJR…ôÅLÔÍýáËæùâºqV•Ú%#Ë$ Õ·MsJ§ûw©e->aPûò†~c¯´ žM¼Ñ¡"¥Ó^vq¹rÈŒ–Ç9Vš®ñ*äXßîÈÏÌÆá~àœH$ýì;2mšß™Ø´†}iÏñ»ŽgÄ~âÉ RAò ÝéEfƒÁ`0 …؉‡q‡ÇxŒÇŒÁì¤vR;©}ûúöõíë”î”î”.D ‘B$-OËÓò¸‹»¸k7„ÂßÛ¾·}o›8#qFâ ³ŸÙÏì§ìya.ãÎ`;va?ךÄ­´™–¦–c#g•lx¤Æ´ru‚<°—4$»ÎÇÆµoPóÖ°2ûìQæ§bu§7N§ÌСSBkkkÐ~Ð~Ð>~ùøåã—HE*Rá oxã)žà‰õn&o1 ­H5²‡L“FÒÍ4[>¨¼o\?:ÎêšSzk!—.^ÅHPˆ³½Í`­)ÌigÙf­¯ß  Fêmê믓CÓvn°¹W,¾úbóåý÷^§~ÎÑå½ ë¸þä½µžL—Àý06PC…l˜aa×ÿÀüWõŽ•;!oóÉ9Ò’Ù„A„Aò¦M¼M¼M¼{¤{¤{¤kªkªkªª‹ª‹ª‹22w •Á€ \9½lzÙôrórórórMtMtMTuVuVufWƒÁø›’»)R$"‰1ƒ1èŒÎèœ{ Ó9§sNçŠúõ)êSyaå…•FMš5µÊœ*sªÌ‰‰‰)=±ôÄÒýûø÷ñï#T* •~öQ…H!RÃ1Ãs¿Î_å^EÙ¯–¡4 Xm)vaò@OÉ÷l÷þ%)½p}`­JŸŠð9¬üˆÞMï«/Y)²Rd¥ªšªšªšðÆáÃs¹ÇÜcedTA•ÿß÷Õÿë“ÊéH1xÒÙ¹úv~ã`i­S¨ìÀwó‡ëZ= tƸ®“ÄÈ ËÚ‡å”Û¼ÍsJ'çëXˆÒ©;Wz·pñF*ÃgùÅ8çuøY„ìÄ],#ÝpË|ðÿéË³Ž­ÿÁþ±ú°_ùW-øÂY6ów?w“`LuTGu¾…} ûjÔ,¨™t_º/Ý«W%®JêúÔõ©ë±»±v°ƒ³ƒxoâ-O¾'|OøžêÔ7¨/­J«Òª±Cc‡ÆU®œ=؃=J>(ƒÁ`üUä®à D q÷pO™®â*®Ê®:]uºê#ø>‚ËY—³.g¹¥ÜRn)­KëÒºhŒÆhlhehehõ!âCćˆDc¢1Ñh^b^b^¢|ÖŒÀˆ!Òt]€™˜‰™ò1Äh>4ÃZGÞ¶’&hLãvšƒ°EèΕBAa2×t›ùX‰G—Ï{Þy÷¾¹D:á5-O× Ð8ÊØÅØÜ²À²È²”>£Ïè3­·Ö[ë-x‚‡™˜‰™(å³¹‘½< $PàÀIz:”œšäÇ;ÚœŽÅìwuRýÓ…á8Œ+øqáõùOôíë†{ç»Øåx‰Œ|g=ìl )Ž«"'65¼0 æ¹^!6Þª•3¥ZÓK:t;[²ZHƒõõïš_Nù¡GìŒÇç’›e†e÷’ïJf'i?–ÓêI_Ãjðà”£b¾èÿA°Í£ÚÍoƒ-ì`V¤¼1’23}¿xÁ ^4”†ÒP`€AŽŒòòòñ'ù“üI²l `–Ÿeþ1¯ñ¯åMëëë£h"¿•ßÊo••`…V63Œ¿¹ÒFÎüˆ¨¸é¶°…-)KÊ’²N;v:íô»äwÉï’Ã6‡mÛøž|O¾§|¤ŽÔ‘:fÞ˼—yïÃÓO?:ÈÄRŒáW’(òîyÿ¤‚©SÇà8b±lRìŽÇ^½êF†Ö!½H“€3Þm§ØNÌ- Ùç²Â ¦à*Žsô‡'!ºYøÉ.yÂ3òYyñÖ«—k¯Þô¸ÃÇUéòÆc~0yBúˆ}隉VØ‚ˆÃ[$0þg—­Ý0á%Ÿ,èaA }‡gp@´H‡Ff ïŽ„ UQU130CÕGÕGÕ‡wâx§ÏC>ù<$§zNõœêp‡;Ü1 Ó0™¡ gR¤¶R[©­PT(*MÓÅtѰɰɰ -Ð-äÒUf0ƒñÐÐHI ­€ ¨;eÅÅÓÅÓÅÓÛ×Û×Û×e•Ë*—Ud-YKÖ npCGtDÇô–é-Ó[~Œýû16 H}BŸÐ'ò»8“ëÏ6°ùEe6[è BWÔAQ:TZB›©ßªJòÂÔ¤ÎWÊV¦å²]-Ô—íDíàÕív^½=íŽó‹âÉ&n"yCJs¤WÔ™,#UHêD¨“I4‰&aC'r"'jÏhÏhÏÈQ8E÷æ×cQŽÄý1EÔSÕsíIKâD§Ñ®´ËGï´èŒÙcæÅÕI+ZÄ|T§ÇÞR•ó7jU­èËàˆÀçË6 ¥Mæ/–æq9%1¾ãl¡m3eLôÙ¢—º-iÍ—üCÑ뻟–ßXønó—«ßµM)¶s€ÔÂt4 óÈk+-¥©„gø„$pJ[«ï×?ײsåÚµˆ†¼àܱ5P Ð Øïú;%W&ŸÆ§ñi%BJ„”‰:u"ê„c-ÇZ޵”‘éHG:3#7rŒJÞöâ7ÄoH-R‹Ô"ùÎå;—ïœ2ènà†r3c0Œ¯Gîœug8Ãð~6& YÈroëÞÖ½mñáŇ^©j¥ª•ªF{D{D{DµŽjպʮ*»ªì*y±äÅ’=›x6ñl"Ôê ?ÓcQŠVåÌø_“˜+Ÿ›ûÌ•&ʽuhPË–%ŽRzõÈ(©ÄùW|v?è×czžCÎñ6Î8ˆùhCÎ?)Ä+«Ä¿ÿU6WÙ\esTDTDT„Wi¯Ò^¥•‘¹j~#œbQ‚z(Š¢Á" Ⓠägkï>×ÚÚ‡Vypñ¤÷=†7Ž §tÚÁ.ù)”Ò!'+eLZ›CtÛÄ}íïS:£o× ñLJÎk¹jÑêúÞå2üû8m±Ïû3S½!_HWÒ÷°SyI„ï3^Ð_S­fêvª3Uurꛎ›î|؃öXƒ½ìWÿÝá _øÊ?KÙq– K…¥âñøðÐ]Ðû°û ‚ *%m†ÁÐB ­¼I>’ä#ÝL7ÓͼšWójåÊÉ@2”›\©5 ƒñ»ÈÕ–ïMÕP ÕP ¥P 1ee. äö8íqÚã[Ü·¸oq§BN…œ OâI<Žp„Óôý®O×§ëÖ'¬OXÿ)íSÚ§4é¢tQR”÷ˆñ#~Ô:PLÂ$LRÒG¥\i'¿„ ”Ó“H ïèsúÂm‹c^]ínkêg$³–Wò7Ô/„Ý|î~T:¡nj@v*y@Ú£ ¥ëQjà”P5HÉ Ñ-t ÝBÚ“ö¤½.C—¡ËÀmÜÆí? Ù$wœû îáÕbÒ¹ÔJ%ò#²q…{HŽ‘!ïK}i’qe.Îá–û¦w·¤gû†FN(|¨u‹"QcÝÆÙç§žÆ/¦™ÆrÙVC^ÿËv¥´´/J?.° wÑAA•W¿™þ|Ïúq·'œ†3Ú’VÒº‘&)î»üxñ­¦Ó¼ÔÛ¢nðK·ÎõCä'•»¡~¯\Ã5\“7ívÛí¶Ûµ+jWÔ®Èî‘Ý#»óýùþ|e¤¼ È`䂸Wâ*o{ óæ5¬º[u·ên¡kC׆®UÉ ÖePe˜Å Æïâÿ¶FÊß–oË·urr*©/©/©¯2¨Ê *ƒ¢vFíŒÚõ0êaÔÃ*¤ ©BJ®+¹®ä:{{{.•KåRö)Ïð Ï”2VùÉïh"dT¤qÅ:ˆ¸€þ~‡=JÙ5Iq9øªÇpó™Ó/ûu¢ôÆýa7œmú,¼( ÅsL|x/r~ð€ýÏö–ùOù¾ù‹üÅ öì+ØG—.]>bDĈˆJ ­j¡tÐA÷ÕÏ‹ <8Ù¡ÇMŒEWpndIî!.klÝõ¾ÃNDq% /Î×"¥Óã»Ö§tÒÆë²êŽ9Ðfm;qgû”NÓÕç³iÔ¤Öw¤ÔK/_>oc×…Ž#~v®{“{¤,˜~¨‚|ðUœøo.†ÓÞV-ægÙŽPg ?*¯@Ec³Áw‡< åÊÌSµPµPµ‚…`!Øa°Fˆ'Äâ eÙQN›a0r#B„¨lŸÁœ¡/è úQ¡a„‘EÜ Æ€á.€(€8Ä!Nv^=÷yîóܶ*lUتP)T •ìMö&{¹An´2­L+§îKÝ—ºïцGm¸|3øfpbFbFb†ä,9KÎx‡wx§Ó˲ )HAʿфùõh¡l`!"ΑàQ ÇÕn×­ô%çÏ®ÃmÚ§Õj~ÄóOÜ“jnÿpöÚ³(\&kÐDÜ/U¥¼E"2~¶Ï\õfR}©¾Tß8Ä8Ä8D.Qå+òùŠÂGá£ðGqGQåQþ«Ÿ Deå¢$&c••JÉ´W‚T„™Û@Bp)¥SVRλYÕÏH7ueF¯å»ÛÀ!A?Kýý9âF˜!r]È=b/-¥¡4­hhð0× -®W /PµÌÃĶ䳠ånŒ]³¦Ü•ŸÚ¤<ˮ­"Fr@êJµôÕ¿ÑT‘våt§îÔÝ8Ç8Ç8Ç~˜ý0ûaüj~5¿Z£‹ÑÅd’L’I”¸ûIœÄɯ~Žrgœé½ – Þx…QèÀ&×±ê³sf@–jNáFßuê›ÏPOSèTà¥Áó#U+&;°éHiRfÎ'C¤)Äî©pŸû<¸o¥äPKÛ­a¡A;= xóyîÈK•ï|­M›^TÝEÁ&5JkÐtܦÍá€h衆,Š0ñ? A› <à7ëë«ü„ÛXèRÈ‹IlVøÎ³ßNáNÉ?0m6HD#i$4Î4Î4ÎTâ¦YÈBÖ/Š[1¾cè'ú‰~’¯%q´8Z-EHRW«ÎU'‹È"²ˆ> è8ÀÌb ã7BAAI‰#q4›fÓl7ƒ›ÁÍà\ع°saë0ë0ë0¹p3#<#<#üý­÷·ÞßJ®“\'¹NîÝ{bOì_Î_ÿõ¦¿ù޹ ãQ‡I2jh…|ܘ¬6y"¬¶¥?è*KÏÌáÖ|×Þzñ¾ÄŽø3;žU#gÈ\”úÓ‚´`5Ò‘ óÏöl†fB!Â#<Â#Ã'Ã'Ã'Ym†óçü9uuu¥T÷ω¸ÿÂùR¶ãð ïQ³°Q2R+Ö‘†¸Ží\g²åm½/¥2ö/Åeܽ´ùåíÛÏòõèVƾi[®H| w¡öžsœLXb¾héŸs6Ëhâ~^;V%ö¾ñ%¿v­‹f‘õï©_ YãúÓR·¢?„%;pÈPÃT4@Âè%´Ç ŒÀA\úg¶rš*ü ~´þ‘j_Ny­; C ›¾;äVrŽ;UŪbU±tEG™ç™ç™ç)Oöò¤Æ\vÆÿå#>⣼)•‘ÊHeè :ˆ’£>d/ÙK~Òª’s. ã·QµQ›¶¤-iKîwŽ;çêêJ³hÍ"„BhDß›{oî½¹Éc“Ç&UŠãçb.æ¢.ê¢.Í 4÷q÷•=õ@ Tàù^Ü=¢S¥£t{x©|%Üw4ìPm]þ¢–]™“Œ%9gáç>áÑúž×:Ò{(‰yÄ™Ü"Ãñ ïñå߸ì2²ãÞÐA¾;¢ Q†(9©•×òZ^«Û«Û«Û+¯ˆ’¤iñ·8ƒÿ¯°•Ð}(…âhÚ”^'oˆ×9-2±5m^N¸aíŒUg^Ü,SeÞÚåÇö xzhblôóGéq†Sú*Úzš&¸Íõ#ÑF­1Ù|DÀ¥¢AŸó‘¾zœÖiy­®ëŽ6­YéYh3Ïò.f:51š–‡3êê!ˆ{D’ÒJF¾Ìß>†ã¦ u¸rúT¡Ÿ$¿Dº£üØœðÝ!;îña{Ø«ƒÔAê tGwt7W2W2WbFbüª«HFnîhDc>æc¾’a)“;žÁ`0~=rôºú¡Ÿ¬ckkë¤vR;©å¿Ì´Ì´Ì´¸ qâ6ˆuźb]%\vЇb(†â0ãðW?Z5Tàá[hÄ R)šƒ˜ƒKGtl_ÆM‚Ñd¢ª©íM‰c½/L~yìÌÁ[+ß•!5‘ù4RÚDËÃ˘-ådžh€ò#‡¡­¡­¡-¾à ¾ðKø%ü­½Ö^k¯<”@ ”øŸ›1}=rǹïá >Ò`jAiÉ {Ä`Ú¡s$Ë’îe λ°À%ñÞûRs—ÆïÓô™äèõOê¦xfVÔõ¡Úºª©ªí¼öŬÆ[¶yøa¤]ûš%ÚçS_1t¾X{àºÚÍl++²×³Ë\:ݰA*DûÓXî)E‚H¶a¢ÿî…­^rÛÈ ]¼P»­¼Ö ApÃ!67|gäv¹ö`öhâ5ñšxZV£ÕLLL˜‘ÿ…\Ù–˜…Y˜¥´ûîþ蚨‰šÊ»ŸÛƒÁøg!—¹Ë 2‘‰Ì<çòœËsŽ¿Æ_ã¯IÅ¥âRñ„؄؄Xƒ` É $ƒºRWꪄ þœcÙõ3Ñ‹!W‰^ªCóÓC ]ËžVýfä½À;ÒIk11Ò4Ò°ÔrfÂìõ×®m H#iî.H*KaÒkzNqéxåïò ŸðI~Áâbq±¸XŠXŠXЍÃÕáêpÍ#Í#Í#ØÁvTEUT¥¤Öä^gøû`…I±Þ lÄ^Q’(ÝK®‘LÔ‚_z £“Év).ã^ŸMEn½}V¿cSCzu¦ )šhM´&Ú­©[S·¦´mF›™šš&š͉fÄ 14ˆÑŸÊLÿÌ$O ”A<&ÐPt¤Ô „…\‘1­Ç•zE/r¥‰WM]GØr|uìÙø¬Ø¨GûòM¤Ž).» ¸_u¼7q7åû¸…Xˆ…˜K™K™KÁ.pQçUçUçå]yWÞ[±[QEÿ¥µò÷D.À•£ñ„–£’†ÐkÄEôDC.€ãMú}ƒŸñÀ‚§—VÜ«ÝzÝÑ©Ý>íK¾ºùéä/þÙ-µ'´ÕÔIBiaïgð37­:á˜4 +-=¶€û‰Çí"«Ç¬ïÙlq¿‚Û<Æ;¯E+ÜE¦h¢è9Î|ÁNb%>x¥¸ìB.9п ƒiû¯Z.Gå(¥í0p…#›%¾#rµ —7YB–E—Ñet™ù…ù…ùÅ¿~NL„ñï‘u‡òÍR~ðÃÜÁ¥ðKæk´a0ß6²Û=30/ñ/½¢½¢½¢Õ Õ Õ å‚Ÿ}nô¹‘UoÕ[õJ€ w’ÞŸ‰l á:sˆ íD¯ VÛ95ö\±°D_Gq²a¹y¡¡hÎ~söèô¯^YEJà ¦B ¥Å’Ö_y·•áDˆ-)–KŠé˜é˜é˜LÑähr49ªõªõªõÊ꺜0óÏ:ïòÌ}|D2ªãG’âéKø_lÅ4a)׎\þ|5ksÎêU^±uö ¹ôʾ´:zõƈ»;¦UÖ½µ‰ÑéU|Q®TΓìU†áöT­¹Ví–CÓí;=OÖkµº@“á•–DÌõM÷h!£÷‘— ô=‚HKlÅ0Ž-.a šã§ ”œTó'ÂÔŸNp¬©»§uƒœÀKýáDË£|àÁf‰ïˆP„"TÞÔxi¼4^Ü3î÷Ìn 7…K÷¥ûÒO j©HE*3ãß;áJÖ?.†b(&'_)­¹eØãƒÁø_éŽîè.×ÌÓ…éÂtWÑUtÑ]ÑÕ:Æ:Æ:æÃÌ3?Ì„/|á«HÐ’?=>j=ÔÄ70LJ£C©íÝÕÚ›…Ÿ&3´³äN8øé&.ï»gÑÝË|⇤tã$nyNwRŠÞ0Àô¯´Ã_ƒqo…Vh%ŽGŠ#ÍEÌEÌEd5wu]u]u]Õ,Õ,Õ,%¡Q.Òýç"‹9Ê‘øwh…QÖþÒVZ™LÃì$" ØkXo>m´pÛ%Ÿ»ª\_SëèÈî÷.¿üñQ—Ô˜ì>úÚ™šá\+n9ã`cM³Ž„SÞéqI‡|ÏöîÔ¹f±õ÷š9V^‘è÷:O5º ­0KiÊ’ý°Å>Œ\&a ûµÄÊ]äúÕài½ìhÒIššHÇX¤>4=Q^l!û»BÎxh.k.k.s6œ gc~`~`~ ÝnH?¹\ÌqgüoðoäMñ–xK¼%kËð”§<ýY?B¸À…ŒÁ`ü*ädÎy˜‡y؉Øé:Ãu†ë »3vgìÎÉd2™üåÀ—_ä´Èi‘ÓBéЇ8Äý©é1rEr`&éä0zÒ ô1Zõj× LÑ«…ë(àáÎ5Â[¤'—øx9½í‡_>ˆ€I°Òƒ¸†·Ø†Óxú3¥ö_à ¼À ò‘|$åõsó"ó"ó"\À\P¨Tj/µ—ÚK/ÏÀäÞY”þLÏÞ ‹BhN5°ATE(òósI:™òepöYy1öÄ£|eÞ,_³?´wïúëéÛ%WÊðÔÎÕ™5ƒÔÍU¥ùÙ_²;›i¶Ƶ+R¼UÞ|g7u¸U½÷¦«-EåÏëíâúÇj<ïÒrt5·•”Æ 2qXZ(€€¯]ØÊt‘ôÊᜮ‰f5 ÝHŠâÒQyàÌæŠï¹ó@=V=V=–£å¨yŽyŽyŽxD<"Q~ä_ð_˜Áÿ†\u’d'ÙÑ$šD“¸‡ÜCî! #a$L™«G/ƒÁ`üŠ£8ŠÃ~ð#}I_Ò×}¨ûP÷¡ä"¹H.ЧÅÓâéûû{z‡Þ¡wpçq·q·ÿÔã” ’¼xÉÒmꎑnGßèXÝlyøDúÀ<ÚÚˆŒW—¬,¾Ê=ûÇÕÞtK½Ä[¹Z¤‰ä#Ý¥g ü¦¨­¼¶ˆD$ÊÝ©ÃÃÃÅõâzQîÑÍ(Í(Í(åèNàÄ7˜²(kÔÈåÇñ/ÄÁÔŽ!Ë‘ˆÓ|2‡xgž2•5oZ¶ìJ¡{[#¬X~УwƒÝ¯­½ç˜t;ƒØ8Ùdéjðíù«\ˆi¡A0}R}$™°¶.S´y`å¸×Ý׋\[¥i­Ê^•Zñ%Õ¦ÇáFç!Ž÷xÅW$gI ŒGcTUŽJø##ñ ¡’=4ÔÏø üf¾†ÕÏJ¬àÆ÷ï ya ÚªÚªÚÊ]à.p,•-•-•iÚvPžn3‘‰Lf0Æ¿!Wª éD:‘N$“d’LE[Fnÿ!ÃRe ƯA.,‡r('ç¬Û¶-l[Ø©½S{§ö´-D e7ÈnÝ uHêÔ!È‹¼È‹ÞèÞê<#¶<àÞ†¯Kê‹>RGê<¸^óÂÅßyöòupÚ*¦eŸ4[Sò¦¬IŸSm{ß[Ó1EÐ^Ü.¢3”¼ölÿÕ«õ„¦‡éa#ÁÆÕÆÕÆÕÒi€4€ ₸ }}}EWg Ö` ÔPC­(ÁKÈ¾Š "D9öM{ÁÑ¢/u¡ŽØ‹v¨Å #±X•ÓÔ4Ëì³ WñÛÇÞ3½ª\;¦À¿½½ó—®Ppgi³ç9Ǫ˜ÃµáÊdzÍÎG$âÔáLÉð|ù›蟱¿Ò3›CN¼ròáÑØÊoj~j'‚V¢Ã¹¸Žp#ñØ+%Ó[°ƒ<8X )E·¿qH¥§©‹½^;HÕE=—×rW­œ•‚¢ÜY_Ã(ˆ‚ò¦Æ 1h Çqg>i>i>‰ä }Ð}°{±—Œño0£¼I+ÓÊ´2­EkÑZʲµ|“ØÝØý³lxƒÁø¿È®°ì|'! I²òºwqïâÞÅùÅüb~1-GËÑrIç“Î'}E_ÑWÉöþkŠ/)w‚s$aÖ`q]ÜÀËÞ¡D׸ƥšˆ÷³–›Šó‘¶jÍ­ ) æÖ"KmšÍ…“íÈ‘žÓÕpø=.»‚G˜j™j™j‰[Ä-âa¿°_د»¬»¬»ŒJ¨„JÊŠ„œ0#wCÿVÉí ¿E ÒÐ [qR2R |`ÄbŒ†qgHµ”ÉÙšœ*qOêntº•ÿiõÖÚâ>ù“»Õ*±!$¹âÄ€(÷G˜(ÍÏjf×3vÕ¸òwɆVçBkùû5^°…oÇMâƒÖob,}ýøã‹—n¼.õ©@$ËÐçÈ´¦ûiGÌBsüˆ}¿­c+BߢŠ]‚z²ª™ê 7€¬—ŸNI>8ÃŽÍßÑ Y‚” %dKs\s\sœ ã¸0“ƒÉÁä »Yd#ÙH6Ê"\ÌbŒÃ+¼Â+yÓ:Ð:Ð:P$A„–BK¡%W€+À)éXL’Á`üä¸ép Çp¼Å[¼ÕnÑnÑnqç:Ïu­CëÐ:V“Õd5%ÔL¨™PS™Uú¢/úþ©ÙÛ²h#:YzI›Â5°tx‹˜´’áζŽz}=RSm:>ìõðÀ§Ò›‡Ÿ¼õÄŒLœ@_º Gñ9ÿc)ê/!Ë ƒÅ`ó‰ùÄ|x×x­?¯?¯?OÒHISìó}PŒÿ¯°ZôÅ4ëré ­F&âvp6pÃi½¸ùÓÍÓO«Í_;ïè¦õ¶V?k¾Ì½üÒ@wL㡺ÈÇ …ÎfÞn^a³Ž±NiÏ…Ÿ º{Æ©Ãöš›·­nU#ÚX.0¨w!z½°”j¨eQ °/A®‘®p‚ó¿r[T¿¶· ‡ ª¢õm3Ô»;a ÈMUÞ †ÓO‌o/xÁ‹Ž¢£è(9GYÕRÕRÕ’n§Ûévóóó¥=ò!_î¨*ƒñ3äš´!mHa—°KØeii)v»‰Ý”‘OñO™Á¿Hî(WB¢ÄÀ^â%^" HPÞý3o« 㟈œœéw¸ ¼À ¼Ûe·Ën—åjñ˜xL<öiò§ÉŸ&+A%9L«›ÄWGÖ©…Rð%‡1‹4D(Z`ÑÄ»&—yÍ÷ÔöPíà>«ò—îyðéÓæU§F?¨Cn‘ö¸&î–ÆÐÙJÙâ5ÊÕD%Q%e/ãJãJãJzžž§ç¹n\7®›>]Ÿ®OWÆË• ù®d… Zp’š6¥»Höc1?„œ# M…,§¬-w¼üôMù–+qÐ?fÀŸ¯öfÐçöz{ÝSmᣗw652d™xH¦ÞͺÊï+\ZÙ¹E­±›Þ·˜V¹tÞÉ>冷ô6 Óy(‰N¸[xÊW!§H3,AG4R®‰ÿ#1ÉIi´$&Ø>S­á“„~Ü}¢(y#vбóø]P ¥PJ¾dUÞ*o•·°VX+¬µ6¶6¶6¶¤YÒ,ʲ£q4ŽŒñ‹<Çs<—7­:«Îª“â¤8)N8&ŽÉ· e¤g¦_-ö±Í—[š’*•j²*^³[•fÜaœii'ÚXc¬®­½Ãw·=Ü´õÑ軎¶ ©>¶ôÒ€|ž+ðY¤‚xŠV¡ÛI|ð†ë@ZWX þ¼c« E¢>]¥ë- ãsø‹ÄŒTݶP³3ø]†â(®8î—U¢JT‹j«Ú*Öo‰·¬³Å brˆŒ!cH[Òt Ýh7ÚM‰¡¾Á¼¡·émz[qÚnán!±ˆU¤¸äR!aýÈ¥N@ch ¡ÞÔ›z“dY@ ’‚¤ FaF)7fY˜LV9`0 yÕN.dè(ë˜yõõêëÕ]Ð]ä¾"III4Ò@eám–ð€*ð¸„Åh!=£Ói 7‹<$ƒ‹4ÿX⣺­ª_÷3Ÿ÷äéË#^–9½ûfù·§¹2¤WT…aPCó¯îú¿ÚÐ +¬919191ÐB -9EN‘S:•N¥Sɯ(±yÆ/‘ÛgÉ@Œˆ£Ã©%1ÍPS(Ä¥“ñ9L“Í!û‡<À+ìÇÃ*¯ÇÄø?•\×ná{óž­¼2hjž‘€ôBL5ôÍîiôÔlàIMÒ 6õ oØ(d‡w÷ç?|·xyLì¹Ç'.VUùÃ0Åi:ƒÖ¨ÈÕ&»1…‚ÎÅa˜mÆÏh·ƒÒ©}; ÔvMq¸¬œ÷“xƒ­ì¬}ÜÇ\AOôDOÛ;»2"æFÌ-ö°hí¢µQë7ÍÃÈ02Œ»ÃÝáîå„rB9A#h ‡¿Ãßágñ³øY|y¾<_ž3rFÎÈíävr;¹\®§æÔœšì&»ÉnR™T&•qWqÓ1ÓÿÔ©ù{@~Š—‘»çnÂ&lB2’‘Lj“Ú¤6IF’‘ä5yM^Ëg‡ëÏõçúsó¸yÜ<.KãÒx5¯æÕ|¾?ߟŸÊOç§óùíüö²ÉåÞ–{[ý‡ûjì³ë°ÀaòY÷p÷˜ù Æ¿AN’©Šª¨jWÜ®¸]ñŠï+¾¯ø>Ê>Ê>Ê>rxäðÈáB^!¯WIÆ“có¹2ÉcÒù'øfWªô ¢ôŠeðËëÓÓú…š^X<@Œ² §¾ŠÔ‡àÌ»’+_ý`È›NÙNÙNÙUrªäTɉnÝ"ºE¡‹….º¨¿q#ßkŽûï'W )€˜Åå!6¸ˆ£(¥Ñ•pQØ.¬j¤í´òBÿtJ§NG)rºÓ8“Û¸Ú2úŒÛö.¥Ó.v¾i›äÓ1aGþ˜›Õ†VÓåé?öß\€æŠãWµ;¤Z£î&h*xÿ8ûØèKº×C>Æ‘£ˆÇZ ˆag盥º¡n€§®¤Ö©uU=kŽ«9ÎíˆgÏÖJÒ:i©yV›¬6·Äöˆía°ÝŒnÖbV‹Õb]c]c]cÝbÝbÝbéoéoéo}g}g}g9f9f9öUŽ–žÁàF(ZòÉHF²¬6 ´þy†gxFŸÑgô>â#>*yùr¹’<òá½AoÐx€x ˆ]Ê™‘²0V:Ò‘®lg ÊþåæS)HE*Þã5^c6b#"H9RiÔDMp%¢Ánº™nÆjŒÂ(ø"Áp„”8‡,¨‡z8ÀÐ@ ìa{¥ÄJtÊùÝp„#œ¸wâ®4Ìòƒüˆ@*Yžù‘ù•ý„ !ÄžØ{eŒœà$/=+B`òžƒŒ`Z„¡EÇ?ˆ¢7 ](tAs[SKSëɶÇG±^@ä1¬1^7^Ç",ÀÄán°Ÿ#ƒÁP8Ó8hD#:¿o~ßü¾Þ‹½{/–×oãÄ7ˆoðªä«’¯J¢z ‡’$óç kÈ”Dx’3¤!.^ünØ­*+Õ­f‡ÞÉ·Ôý^ª–ð3Œ=5ýÉÔÆ7ÆÝ<| P.âT©-Gxƒ$¹¤õ«¡¬a¿K±TwNwNw.¢bDňŠrõZêëÔש¯oï¾½ûönùÑÛ±Û•UtÆoƒSÖ9DP€'d?i)RZŸn‘‡htÂ%¡\½…ß ð,s³Àµ Eý¹å¸ÒÓànð4-Wi8WKx§Y VYœÍO¬q—»|èûùÃŒNÒïÍ9gx5ãÓÙ°BB0<`çRUßKÛÀ´ùG7ÁeüZd±)ÉOò›G™»™»•^V{_í}íwÕýUÆy0=xk}k͘ðèÆ£7r‘\4Däæfff˜žšžšžf{f{f{oood}Êú”õ)kkÖÖ¬­Ùo²ßd¿É6f³–U–U–UÞÂ[xS˜)ÌfìoìoìožižižiÜaÜaÜaÚjÚjÚjhahahalmlmlÝ=»{v÷¬ÒY¥³J›÷š÷š÷JS¤)Ò”ÿò½‚Œàÿ2Fv—0£‰éOúÓÖ4‚FüK*–÷¯íæhN“{ä}DÒƒŠÑýûOš²|v#×߯ŸK¨QI^ú„ÖBk¡µ&U“ªIÕÕÖÕÖÕVÍPÍPÍKšøsü9þœ¾ˆ¾ˆ¾ˆ t‚N×N×N׎óçü9ÝÝݾ>?šíãéM½i€Oi»ÒvRYOÖ«çªÞªÞnÏ·¨í¢¶7Ú\{ý-iN:’Ž4ŽÞ Ìqg0À4LÃ44DC4TwUwUwu:ætÌéæc>æ[W[W[WZöiÙ§eJùû¿2A¾zB¦ü)X! /ùT²Ûª§Ðàöuk¬.Ô¼`«ümóTšXÖJU͉Ö£g¯Ysõ„8EZG'“‚$Öãn®ý¯‡,ÙL@@¬öV{«½¹·¹·¹· ô‚^µGµGµGÕHÕHÕÈ2Í2Í2M–¦PJ{¿Ÿ*QPè ‚ h}º…¸b¦s-‰¹nZb-oݳ§æ=<ÇÜÛý¢T‹~aãóÎë&–ª–ß>*)èMž6€ôQ\hnoh Á0AŠWá?ѽbe´íXÍrüÐËÅŸ ?Óït`3@×§Ùøn3’à Wùúž6¥Myàû€©ŸÉÍäf6Xâ-ñš)¶}lûèítº áœpN8'ŒF £…YÂ,a?ŸÇÏS5Q5Q5Ö ë„uÂáŠpEx&<žYÆZÆZÆZ—Z—Z—š{™{™{™ š š ZzZzZzšýÌ~f?KKKósósósó*ó*ó*Ó'Ó'Ó'c¨1Ôj ¶[ƒ Œ Œ ŒÎFg£³¥»¥»¥»AmPÔæCæCæCÙ¯²_e¿ÊNÌNÌN4u2u2uÊZœµ8kq†O†O†±°±°±pfÌ™=Ò—§/O_žq=ãzÆuÚ“ö¤=¥‰ÒDi¢ä.¹KîÒfi³´YÖ —ŽHG¤#bE±¢XQúAúAú0Så{„>;°}a]­V«çSŽr¼@$"e•Ëœ‘9ÃTÇPÔPôg6ohÁßæoó·Ét2LçÇòcù±Ä‘8G®)×”kÊé9=§çúr}¹¾ä 9HÑÇ;wÔ1êuŒí Û¶/t6:~¥~¥~¥MšMšMší~Ûý¶ûÁGð±I·I·Ij µ…Úº~º~º~*•ÊF;V;V;VÕ[Õ[Õ[ÝSÝSÝS}H}H}ˆïÂwá»hzhzhz¨æ©æ©æ©ï«ï«ïó ù†|CM¬&V+§6iŒ£ÆÈ{óÞ¼·æ°æ°æ0YN–“åêüêüêü‚¨*©*‰žb>1w"ìIØ¡ò!ŸulsXd¿È1hŒÆp€7¼Ù‘Á`(yíÑåJ×'®O\ŸèèèȳåçgŸŸ}~fˆ4D"q ÇpLi$ôçÔPQPP.Y†dqº´ŽÆ¹s,¤7ìmk”ìÇ5¦Z‰'f›#šÚëS÷V½ûüË«R>“0Äc]Aó£³¢!#ë–|=>ã3>ËG+u—ºKÝM¦@S >R©^ ¯„WêÂêÂêÂÎÂY8%ш9îE'ýŒ6)®§:ªÁ8TC)Ò Ç±UÑ€¶Ý¾èn“ç­öÿø¸Bü®¨IÁÞó^/úªrg¿•®Th¨ZÁï50zš¥’h c¦ù{Žþ™ãîtPWA`åO·ß8rÄ}­D+ñ&ÞÄ›RF¿Ÿû~îYÓëN¯#…H+Òêވ˵/×Þ“õþÕûõ/íœíœmblÎڜխխխՕӕӕӟ՟՟U«ƒÕÁúp}¸>\÷E÷E÷EŽÚªó©ó©óé ´+µ+µ+u—t—t—´µµuuuµiÚ4mš:V«ŽÕlÔlÔlt´:Z­ÚóÚóÚóÚþÚþÚþ|,ËÇjGhGhGH¯¤WÒ+©©ÔTj*ívH;¤GÒ#é‘4Iš$M’NK§¥ÓÒXi¬4Vº.]—®K}¥¾R_é”tJ:%…H!RˆTZ*-•¦÷é}zßTÝTÝTÝìcö1ûŒNF'Ã^Ã^Ã^Ã]Ã]Ã]ƒ“ÁÉà”½'{Oöž¬©YS³¦fUÌ.˜]0µeb¯Ä^ÏI“œ¯U¡ÄB‰ÙvÖÖöQB[¡íµÌÓO?<µjå“•O\'yõôê©ÒùéüTÍTÍTÍl?Ù~²ý¤¾¥¾¥¾¥Ÿ¯Ÿ¯Ÿ¯j¯j¯j¯+ + + ë¥ë¥ë¥vP;¨d×Y¯ŠWÅ+çïÈ;òŽ»À]à.Ƥ1iÌ œÀ \<ÏÅsµ¸Z\-r•\%W¹Â\a®0yH’‡²¢‹\3À¥p)\ ñ!>ćKä¹D¹K®8Yœ,N633³Œ°Œ°Œ022o‰·Ä[ƥƥƥ¢‡è!zdgg‹•ÄJb¥œ9=rzH—¥ËÒeC C C ÓSS’) ¤ )¨ü’"ÑE¢U/¹ÓÜi<’L‘CJ1ëŸÊ`0äHvi”Fi9ýL&“Éd÷ŽîÝ;b=Öc½xP<(Lšœ49i2–a–QµP µ|õ#”;\òàÀ¡"B‰íHã¨Ô:±ZûËò¹ç-çvÈ|4k¯©@zzúdãìiW6V›MqùIâDÖÓ¡”R|u—]FNµ…-lEI”DÉf3„9Å8Å8ÅÈ“®º™º™ºYvçìÎÙeÝwvþÁä~Ì„&ÌÂ9ܦ“À¡ú¢Ê {¹òäGcóEKÔ%iHV†ù–yÕDb j£ÙXß¼üçŽûÝQµÜsË–Ùü»`va†@ -ÒÑ=ö•_Wv]Ù«WûöÏykð0x$ÔJ,X:õyÚ‰´*o¥„17òr›ÌR,ÅÒ_úX•YeV™µÕµÕµÕ5šM„Æ 1h ªëªëªëênênênª•ª•ª•ê–ê–ê–êPu¨:”ŸÆOã§©¶ª¶ª¶:Tu¨êPU¦ Ó…Ù¯·_o¿^3V3V3ÖnŠÝ»)¶õlëÙÖÓÆiã´qz¢'zb³Ìf™Í2ÍDÍDÍD­N«Óê´{´{´{´ÍµÍµÍ544tsususҜҜҸ)Ün 7ƒ›ÁÍàtœŽÓq¸ Ü~0?˜ÌUà ð¸ò"D˜MþÏýŸÏ€°ƒ¯ÄWÊ ¸µøûâï#Œš5j–t\8&“nˆÛÅí4ƒfÐ I”DI¤ èº@¬-ÖkÓsô='‹'Jë¥õÒze GÊ‘r¨;u§îÆSÆSÆS²KmJ0%˜ÌïÌïÌïäu Ã!Ã!áœ}9ûröYÛYÛYÛeÌþ˜ýÑòÒòÒòRN:2™Mf“9§^N½œz†^†^†^ƑƑƑ™ã3ÇgŽçŠsŹVUcÕXí¬vV;kkkqª8Uœj¾a¾a¾!í“öIûLZ“Ö¤•_7f3ŒRO©§ÔÓ<Ï<Ï<Ï8ÖÔÁÔÁ'ÌÛÆÛæEÛ”Ç)¹#|'¾×Ųö·Ü´ÜT¸ïá.°"ƒÁP÷/ø‚/öÍì›Ù7sªíTÛ©6Fb$Ff É’5$u~êüÔùòú…~¡_”¸û×Fv°Ý% M§p^cßH[jüÍö3Êœ•ze}2ÍUï²Û§-¾níö3·:¿XüA“¶ŸoÁiÈ0q¦4&ÁóÒõ׈D$*÷è†hˆ†ÆÆÆ¤©@*¨º«º«ºkÐþ ý%P%HÒ„4¡„J˜þÛWDîØ*³ 'pÅ*J”FO¬Åx’Iú & §‹°ãо‡y^Î?´ïÑ€×þÕn†œò>0­Ü—Ðn5ŸÞt÷‡¹ÄøåíP:5O§k‹ž6œ]q”¼Or ñØÂìü=@TDOôò¶ç0Ôahµ¡ÕVoX& R©F"iCÚ žð$É$¤‘»ä.¹Ë…r¡\(7”Ê å®pW¸+œ…³p¾6_›¯Í/ã—ñËø»ü]þ®@"Εså\å)ø«£äyÁïå÷ò{ÕjµZ­Ön×n×nׇêCõ¡¶:[­Î¾©}Sû¦W®8\ñ^ç½Î{]HÅŠ!‹.~¸øá*õªÔ«R¯Î…:ê\h¾«ù®æ»:¹vríäÚoV¿Yýfvmmssäê‘«¶xáñÂãÎ#I”ĸ(‹£ÅñNo"v͈ÍSbDÏ=G½ƒ1èß¾ûþí{è} ÷öíÛ·oß>fjÌÔ˜©õ.Ô»PïBͤšI5“ÊÝ/w¿ÜýðÐðÐðÐ|7òÝÈwÃ{¦÷Lï™r’Œ};ûvöíìüíüíüm:Út´é¨wÐ;è´Í´Í´ÍÔÔÔxoà ¼-oËÛbaÐ_u] >B%¡’ï0¯¯²úˆ%K¼oåñÎãÍàëðu2?øÀ‡ý Ú  ÚÈ›…ã ÇŽ‹ŠŽŠŽŠŽªU=ªº¬¬¬2RÖûscíî$çDJÉÛóý{ÿP1žÒ«uçH‡ÏŸ06ñõ~×î~ÝoÙ­ ?Hì%wI[Üú«ÌIÊ“ò¤¼"ñ\î¹ÜsyôÅè‹Ñ«î¨º£ê¿v~íüÚ)CåZ)Yñœ*ê\WÚ*2ŽG.E¾:—Ä=Œ~–߯¿ÎÏ÷õ ZlˆV:§2Çý»@Žz^Çu\—UJ¢¢¢+Õ©T§R2Ël,³Që¡õÐz(&ã1ã& øk/J‚–h‰–Ø€ Ø k¶ÈOÿd™Af(„#ᢹh.šÇãÆq§¸SÜ)9¯š÷à=x¾>_Ÿ¯ÏâFq£HI rÊö`öüù&\YîüÖó[_L¤”ÒËEM3M3“ÞPJ鈕ËS–§üεÜ6ü-Þâ-MF“Ñœ-gËÙrã¹ñÜx¾ߌoÆWà+ðx=¯çõÜGî#÷‘;Ìæs+¹•ÜJ.†‹áb¸(.Š‹"b Y ’Ì&³Él2œ 'ÃåsAZ‘Ö¤µü±þík 5ïÕ¼WhMáa…‡)Ç#«ëÈš9 ã{f&`áG}Q}Q}ÑòƒË.?¸Ê—*_ª|)7´ÜÐrC555•>ßPþç;Ñï€äÚvh„ )TÐåPÊž#?ô*cÙy®zÿs”^Ó 4øh ÷žòxò‘ôÅ#å? ÿÿΗÄŽØ;Y7ÌÍÓÍÓͳJµ*ÕªT«²ºÊê*«K¾-ù¶ä[a¥°RX©´Ã«Ú¨Í.Æ¿TÿJ}€ÉèËw"çI“ÜC~–*cßS³_µ÷'õOÆw€ÜaNU|‚'x">Ÿ‹Ï%ÉCòàzr=¹ž¤iAZ(e+Þð†÷ÿÜ—N^zÛ–ë/×˸ˆ‹¸ˆÊ+§sýý_àà ®àŠ²7OxÂS9Â&h‚&Šè¡ l`£#ʯÈùu9¿_v £0 “ü$?É"(‚"J7YYZQ~h)„B(DŠ’¢¤(ñ!µImêE_Ò—3‡õØk`^aÕõU×mÛNµÚ¢ý0·an½ù<òá›ñUùª8 t”§q4N—”së‰IYªRÞ¾ƒ;¸£HX>ÆcaŠDè~Ô(27ð•ËúÎ+ëm*ÒÜÒ0í¦a¦ê•]/íˆ9ñÛ6ÞX˜¾0«ƒiÿ»I´b¼Ô‘NüË\ö<ȃ<´:­N«#ñˆ×WÒWÒW¢É4™&“"¤)"„!Bˆ@‘a³ñ߇Ü^· X0 ppágË7¶SUþ !a°ƒf½ïÙñ•5_ïYïYï‰FÑ(ù2|¾ ?›ŸÍÏVFʺ¹ŒpTB%yS­ý¨ýÈe©Š¨ŠÐ‹ü&~“MûVö­Ha2Œ Sôtå¸ÿw‰eœeœeÝC÷Ð=ª,U–* S1S•·‰’ÝÇ`0¾/TPA¥4† B‚œœœl;Øv°í 'Ý¥¶OmŸÚ>kNÖœ¬9hЦhЉ˜ˆ‰_=Ön=Ô0à ‘|ÄÒ ³±·'Íéh¹R¨¬n)h„ÂÚyª¸G›MHÜXÿxøc¹„Eh"•¡ÛhE¼À¤ýV•gTYÞq(†b¨ª°ª°ª°»«»«»«´BZ!­°ÆXc¬1xøÃÃÌ1æs º¢+ºþU馌ÿ•ÿç¸óàí k¸Ø‹8ÜÅm¼Â[kÿ.xŒÇx,ÇJ­­­­+¬+¬+xwÞwŠ Å…âÊÈ !ˆ Fd#[Þ¤+h9Z;iZz:—ΕœÄSâ)ú΢³”F62ñÙG–zXj[j[jÓj´­&ìö ûå²fe¤œ°Ä`0¾7äžÍ}Ð}äAOµ§ÚS7xƒ7â@q 809;9;9›Î¢³è,¥ÂêÖBÿ`2‘3ß‘[@ÆIC¨+}[1=ì½wbí×C‚{ÒQæ3Öúd*÷ˆ„Îü¼uËÈôûÙ͉‰%#i?zõþ²„¼”™+Äæ¶Ãm‡ÛÝbÝbÝb¹Cj†&C“¡yßõ}×÷]•©ZÖ†g²d/ãï ‡Âð†;@‹¢‘æ™ð˜wVfð™ôc f¢ ª23}ã$  Êâšµ£vÒSé©ô”¯Ã×áëpÓ¹éÜty ñ"^Ä‹Œñ_Èø*R€ XL“ÅÄçÎsçÕ·Õ·Õ·•‘¿>eˆÁ`|KtB't’µÆí·Ùo³ßæææFçÐ9tŽq¾q¾q~r…ä É”Ük9Šü§8Ä$ɘ׈Çû|úêrãç·ŸSú¡z‘f»ª/Z 5¸—çÜ:óδ©ÃÉþ—“†°`¡d¢Ã¨?´PCø DeËÈU[±ˆE,æ`æx=žF<Çs<—J¥ƒ‡þq8.á.)’вËþ'û2~ŠÁ0Ó`ZWuLèËßuÈÔUÖ^Ãq$"‡,EKÔdfúÆ‘5_+¢"*ÒšCs¤gÒ3éWƒ«ÁÕàWð+øÊÈÿ\°È`Èd"™ò&íM{ÓÞ–A–A–A¤éAz¨.«.«.+#ÿYü ãBÎVO@¼:yuòêÄ¿æ_ó¯É|2ŸÌO•0*a”ØDl"6A9”C9Ä!q_Ý!¶‡j²‘+ON‹ç¤tqÕ¼%wûÎŒ_!oÞ¦ã™yŒã¤ý\&WjÜÖÕ³¯þ 9JwáDFrÞd3â âÿT½öÜÈ–¹‡{¸‡“8‰“Î Î Î ¶ílÛÙ¶“3ݳÏfŸÍ>›r å@ÊTB%TB{´G{ÅéÿsŠ}¿að‚;Ô´0mª¶å{ðçúéŠi»A‚ehŠjÌLß8ïðï°k±VN]J¥‡\{®=מ 悹`edÀ Æø/ÈÊ6Dú$}’>™Ìfî÷ˆ{¤þ¬þ¬þIÁF.8c0ßrAd ”@ ]]]§·NoÞÒÆ´1mlIµ¤ZRlllåUÅ­üÚ±v4P¥à/©¥‰Ô¯Ë "ë§—è:°üféDvóM §Îºþ‡]Îy6úÜæ;éク‰øK.Òã>ã>E–W–þzÎ¥ÜbÉ¬Ü îqC ZbuÏôæ¢N!“ƒ›¸æà*ÆÓÓY\Zªaû„žë®^Û!•¡!ô5Š’¸ /Ú`Ý_lÛ¹˜‹¹ˆB¢t‘ºH]¤Ë,—Y.³è!zˆ2f3™É§“O'ŸVD„K J(Ž;ãG ÁN4MèHUþ<bï© ¾¡¼? ÕÁÌô]xÄË›ÖÎÖÎÖÎô½D/ñcù±¼Ò¿KÖaýÕÿÙq·‡=ìé z‚ž°Ü±Ü±Ü!›Éf²Y=^=^=^ÉÊŒï9^‰HD¢ª¡w•»Ê]u{êöÔí)õ¤žÔÓ:Ð:Ð:0icÒÆ¤JÃ>¹Ë„0úzˆ@9 ™Ž4F:O«¹®uX¤ûÍoÖ%¼’´^êMrãÕû„ëÛKþäÁmò|òr‘ÔÅ)BJ¤· ê/R”›ÙÉÝd­°ÂêZݵºkuí5í5í5B!$5>5>5ÞXÌXÌXLQæ‘‹}ÿ@8‚;¥Ã´ ¦ª ðç8ƒ½½¶‡ªŽò[›„ªgfú Ÿégª$0ˆ=ÅžbOšI3i&ßïÇ÷S¦Ýƒ8ˆƒ¬Û%ã¿ ;î}Ñ}aËgËgËg¹ÐYUKUKUKé?ø1QHãGŽ—‡! aòüàœêœêœjÝþºýu´C;´K÷H÷H÷øÒàKƒ/ —]vô¿6E7LÞÑô5B0±kÇ:=Š´ÍW"ÿqÒlc€ehfræ cØxa}ðÕñ¤8’0 çp` T0Áò“ŽÖŸŠ\N*7\‹µXKî;äŽgÏž è^º—îµ,¶,¶,–›Œã!â¡Òwö5^ã5»0ÿ‰pÈØÑG´7]¥òå:p+í’Ô=U•÷‡“r(ÀÌô]« “u±u±u15P5u…ºB] àŽá‹¸3þ rqê@ Ä@Ù)·tµtµtåNs§¹Óª'ª'ª'ò-GIÐb– Æ·ŠüX. ãÊëºÅP ż‹xñ.B–’¥d)=@ЉíÛ%¶£ýiÚ_4¼û¸ÿÍ6Тä¦HÅéZÊã–“E?«?šõ c9œîe8ÍÓÇ-ع}ýM¿Oe>ïÏ àzq÷IºŸôF6Œ°üe¶•ËIgc6fËC.C]†º µ¹ks׿®Üó;kHÖ¬!i®i®i®Jv{¢ÅÂ%ÿ\8Ã64c°‘”ç<ÉX[^½CP+¿¸(ÉJǾ’„$yS,ÓtšNÓù| ¾…7Å9œÃ9æ¸3þ YÈBiMZ“Ö²Snigigi'ÇàÕÕÕå×é;ú޾ck8 Æ7‹üX.7÷9‰“8i¯µ×Úkísìsìsèºn066NjžÔ<©9œá gtC7tûŠ…jà‘Žl˜È[ìDgº‰æ ÷/-–XìA=/Ø» m„ÆüÜwâë×)'×ö?šðȆž§ž´+ÝC ºâ4náý_r Rma [âK|‰¯çÏ1žcÈD2‘LD(Bú±ëÇ®»¢2*£²ìÊËUm,\òÏ…Cœ`KŸÓqØ‚LΕëk·Dµ‚ª¼?%ÌÌô]🡤ÊX÷[÷[÷Ó/ô ý",– ËIR€ü´öÂÜ,Ư!W´ÌZßZßZßÚÖÚÖÚ–ïÈwä;ÂîpWâjòí„Á`|{¸À.J¸'éH÷HðHðHPy©¼T^Ü`n078auÂê„ÕŠøc Ô@ |Â'|úŠ…fX!rQäDÉ‘Îoè½ H—£Ý$ÙH·§Z/ª‰Üº%%v—¾=éµõÓ¾ 7.[EÒ¤#4Šš”’Ö¿–S8…Sh‚&hb»Þv½ízÇ…Ž âü€r–å,ËY–b—b—b§´º“ÓcX¬ý¿°Sº’É(Cò²“ü]+â.>Š© µ¡6¼oÇÛâB\”‘r ;ƒñŸ¹…[¸%oZº[º[º[6[6[6«~Pý úAUPUPUPY @S¯b0¾1dá`9vž‚¤8wrîäÜI{U{U{•;ÅâN}^öyÙçeY-³ZfµÄ,Á Ã0 ûŠGe T\wî&±oˆóéÊâ6!aî¤Å”Z% w±´OO3ãÌúêw“£6ZbŸ™&Xºˆˆ¹A†`7.à92‘ó_fU9^.÷‘m‡vh'L¦ Ó<y4òhD·Ò­t«©³©³©sÒ¨¤QI£”@[MÔDÍÜá9Æ?ÎrI*FP¾È@…;vT骶pƒÜi8†ÓY(¸2c}ãäN•9n=n=N9ÊQŽ/Âá‹?âGü”‘,âÎø5<Çs<—o3b/±—ØKÜ#î÷ðõøz|=a¾0_˜¯Œdm˜Œo7¸Á £1£É²†¬ñŠðŠðŠ@AëMëMëÍļ‰yó¢ ª Šâ\>Æc<þ*Ç£† Ö:š²qÁC¤IFu¨8ÐúDì=]»ÉîzëWc‚µ ׎‹#:C/¡æ_ìöÊ–± lððð|6ølðÙ€<ȃ<´;íN»'nHܸAI:’KQåX;K’ù&2—Y–Xç9Tßâïc íJ›ÚjFªs¸f\uGê%UDkôG_ Àg&ûf‘ÛÔĽâ^q/M¡)4…çãùxéôNz§Œd©2Œ_ÃÜÁYñÀ2Ë2Ë2ËzËzËzKh.4š«««Ë7FÂH˜¼ÂóËÑ ÆŸ‰œ*C@@È[ò–¼¥14†ÆÈwi²4YšLý¨õÃHŒÄH\Â%\ú*G"‚" GÑyñ ÙB1>ŒÜšr©Ó첓y{Íz ²*/¼yþm}ù.m|y›ì"Ñ8%¶—:ÑšPA ¬áì$»ÝržzI”DI§t§t§tÛxÛxÛx¹CjÎîœÝ9»Sò¥äKɇ»¸‹»˜‚)˜¢8ýÌqÿ&à2º˜ó‹ÉYò€,¤nÒ)» Õn^µWðÁb|€•´BqdÆúÆÉ]œÚZl-¶¦ 4&ð£ùÑüh‡6*#™ª ã×ðOð;±;Ñ ½ÐK¬/ÖëÓ~´íWhQ¡E…ióióióQ‘ŠTTà Æ·Á.ìÂ.y3ãsÆçŒÏ´ mB›À ^ðâæps¸9d@`aÑW죬ÂÏç2Hˆ”@{Ã¥™¥R\¾‘ƒKÄùÖ·$d¯45BEbOî(u¹aA\‘ ¬±Ë.ãG8žðD0‚ìÚÚµµkk¡ˆPD(Â%r‰\âÇäÉ“¥R©` ‰Hd.û·—^ÏôÜü˜‹'‰d7²èTúÜf¦•*CgTÖC MP”‰B~óÈ%Dk¨5Ô*ý ý ýÀy#oÌoÌoÌÿS?Ëqgü>ã3>“Id™$/ïÊÍ·¥cÒ1éÙF¶‘mœçÀ9(õ²`ƒÁø6ø€ø tr(m)m)mŒ‚QµPäž~6emÊÚ”E6²‘îèŽîð1ØA5qÂ-Œ’è`¨ßªunŽzÝæmÄm©ºe˜´DÕЮŠfÉ^Û3‰ÏFßÜú,2q8W’ìÃzú`Œkÿ;° °D 6@  p[í¶Úm5Í¢Y4ËxÐxÐxð³÷gïÏފ挬Öe†ù/,¥e|¸ôãXk>¢%éØ[i!ýb{Xí¦úA;\èÃÇÀ MHa2c}ãÈ-–tÝEwi h h `#6b£¬é®Œ4À3ãW‹XÄÊ7fS)Èd 4yyy%ÉArP–qS‘ŠTf0ãÁLJdžò(òé“Ò'¥O"SÉT2•ÿÀà?èÖëÖëÖ+}U›¢)šþaŸ.g£gÂ3Þ‘]èJÓ÷hÔaÍŠ…f…f‡Vðl‹)bIisæåŒ¥Æ»³¼·N¾¹Ãâg"u$Ùä‚fC‹X»h”5L3Ì0»r=äzH§Ö©ujÒô#ýR¢S¢S¢ g g g° Û° ƒ1ƒÙeøíÁ¥©Œ)f79wº“zÙUÍà÷j ¶üåú¯‹üðbÆúÆ‘cÚ™v¦ß¶}ÛömÛO¾Ÿ|?ù&Ož8\ù ¯ðŠŒñk •¨rÛ{\ðqÁǯ8^q¼âxmëµ­×¶———*˸«±«™ÅŒo9Ä31Q?È•9*svc7v )BŠb[ж mAy IGÒñë–*'†Äa%Ú æà¤S¤]YMöˆM1åJí¡‘†c–L¾š>]»ÃÙYÏ»^{ö¨Ü§×‚ïHΊW¥Ùtðy¬]jÈ«‘‹±‹‰žè‰>ORž¤½Oï[ZZ&e'e'e+ðòÃ’¼âÁøæà¾1œ5ž‚DìÉmq&¥z[Õsa¶§0—ŸªŒª‰`âÉŒõ“+ÞIÇÐ1tÌó€çÏ_||ññÅס¯C_ÿÔ"GîÖÆ`ürkDȲr·Ô €ÕK0ß,VXaE)”B)Ù5ÏiœÓ8§±´IÚ$m"×ÉurÝf¿Í~›ýò<@]©+u•Å"×çæšs„LÞÊ á´ö¨ZßRÔÙ·Ž?ç\DrëJ²¢RÏjO2oH‹½9èòb€ø€ÆþëøÅ¿<Ö.5FaFÉÁ5çQΣœGÙž³=g{NÖãÊzžõ<ëyjXjXj˜Üè ‘ˆD$üVá¾lËišŽ8“ûÒDzôcUÛùJšî|®ƒ2ª&áÁŒõ“ûGn;Ø‘¦¤)iJ†!d)FŠ‘b?]5PD„ñ=»(êE®¿·x‹·ŠTƒÁøVûr ‡€€úúúäXr,9¹Uœ*£î¯î¯î=؃=¨ƒ:¨óû?—›JI€ØH,)µ÷‹ð0Ùë7½ùâ#$³á“y>Ô^¥­¹xáÞ~wf<_÷~Rš#É&GЋ>AFýÞ<ȃ”Œ%Û`²'.êëüŽ±Ù«^MNkš5ÎÔ**jD9Ìþ61j9^.—ò§#éÎÎÎ6?Úühó#º  º¤WJ¯”^)ómæÛÌ·X‡uX÷»RŒÿ(8$?©¨µŒØZ:Î×&*² ·¨Þ¥­AÿS3”&tvÂZæ¸3Œo†\½ d‚®£ëè::N ”ö%rôË#ŒÌ` Æod&fb&|àŸ¬ñYã³Æ›¯š¯š¯ÒdšL“í2ì2ì2„ÍÂfa³2^n!ôkEwb"êJÁt5-ŒÊð€Susø]]q}˜úš0Kõ”opGû þ§M‡ _½úº#™Lòb;òÐFX -Ô ý ¢í¹Åïáîá:®ãºw˜w˜wfc6fÓtšNÓ„!A écúX @¼Á¼aÚ÷g:(ÚJA9/­¥E\g¢%ûšˆN“t+4òOˆ£m°Gaõ¿¢S ƒñOGV˜èèè„t éÒ)¤hHÑ¢®C]‡ºUn¥r)ƒñÛx‰—x‰6hƒ6RŽ”#åËËË  HàÇðcø1úúúÊx9Qä?#§³Y!B"¾äÆÐštªÕª^F°£ñå¨÷!c­33Û¯J“‰=Ù:9bC÷Ø×Ùe-787òI &Db.Œ0Ãú·°’kßýØ£8Š£Ž :.´u±u±u‘ËO³Wf¯Ì^ùùåç—Ÿ_Â.pÁŒÀ¦ööýÀûXûHÃrªZZZðóH ¼¤7Ôßéˆ~–vmµ8ÆwƒñM1 Ã0LÞԯЯЯž<5xjpXpXp˜K´K´K´ü.9MN“ÓÌ` ÆoD~–ePœà§ôNéÒ;¡1£1§å´œÖá¸Ãq‡ãŠô¡¬GþŸ«M4Pƒ—ËXI4BQ2œT¾‰ Ûo,3óÐË…á6ñšçl¯~Í|rùý«<üXn#+æH{é>H +m+¹q’ì‚AqoìÞØ½±ê”ê”ê”lŒDÛDÛD[i°4XŒh€HB’˜N×÷gÌcuå¶¼'sA¤&ùÐZÔqœî•† !ý‡4Ø@ýª¼ ãY±;°Cya°GØc¼`¼`¼`.e.e.…8€ÊíP„‘™ÁøÈ±då´ÏiŸÓ^I%ƒ1Ã.«ï Îàc©emÕÒôØZn „†Ú¢‘ýDM¨ÊLŠ“r< T,âþ?‘ûiÞÞðF/ôB/ôFoôFY”EÙŸÎËNc0þDdÇ]vDˆ5Ã5Ã5Ãå|Zù´òiåsÌ|(GÜUTT´>Z­Nã4N£9š£ùÏö ßSÕP''0›Ô•ŽÐšµê”éP¤hd¨Ÿg¨¥ƒ1ËR'£núcÏ Öf_½€—؉d ÉC¶( –þ>.»ì'ØÂ¶ŠûtLÇtO“§ÉÓDm¨ µ‹‹ÅÅÉ­’[%·B)”B)TDETÄs<ÇsvY}op†Ý–çV)»–¹Ÿù!tdŽ.ð¥1ökÔíUc¸’D¶(—·žEÜÿGr/ó}À|À2,Ã2Å ¸‚+¸¢¼Ë²ÓŒ?Ùq‡wx‡fh†fÚFÚFÚFô=}Oß[3¬Ö ÌÃ<ÌSb„¹…# Æoã^ᢅ(©‹ÔEê’µ0kaÖB9åCÓIÓIÓI¿C¿C¿CvdÉP2” ýÙl … ‹ÑQ4ŽzÐq6¯´×U='Mé˜?Ò*-Ͼg¾®úlÿ@›µ±ÑÑÎ?êÿ>Õ‡ÏÇ­"éÒAZ•JÈñoRŠ*#û 0äyƉwâx»vì:À~ðËÌÌü¼ùóæÏ›ÑÐaCë8ñ}"–ÆÖÀÌÍ&Ë.€›K"¤ÑÖ¼´³ýµ$ìát$+Dè þŸð…/|e瀫ÈUä*ª‡«‡«‡ËBWV£Õh5Z+Y+Y+)?»¸‹»ÿà難z¥´èÛÎ –Ϭ œáL¬DOô(ˆ2(ƒ˜aæb¸v\;\ÀMÜÄrÌÆlxÃ>0 9ÿfoR®¿Ü±<¡ÿÒCüú/å€þgûÿçwÿóç~#3²µÉ]r—ÜÕš´&­I–ƒ4æsŒ9rë冚[8’Á`ü6>á>#1#u¦ÎÔ9çrÎåœË´mE[©¶¨¶¨¶Øœ´9is2%+%+%KÎí–‹Ya‚dÁ ß{FD“$Ð>C½Zå+ñ2ð‡À9.*ÚÝ8ÄÚ"õcâ›ÌˆE…öÔ¸S€Ô!À0šE{ÑA8ކCF Èîø8ŒÃ8Ï2že<Ëp¸ \¬À ¬HP'¨Ô´m@(Qù½Ø‹½ì‚ú>pê¤é™}LæúçFÚÓPZ½í êÆüf.‚|"M•±Zqÿ¹Û¸-»éŽqŽqŽq%[•lU²º¡º½®öºÚëjÏÉsòœª¤*©JïÒ»ôŸì¸çäúû¶‘c±s+35SêHWÒ•dbckt1º "J P…ñïñþ7~–üà÷3‡^v»å‡¹D‰æú“Ë¿ò"/ò*Ý s»ér&e0‚¬4ÊýÀ ôÌõ'ïS~]nÁÝ ÑPi¬-Ö?ñ!M¶ ål8ÎF}S}S}ð G G GP…Q˜Å´Œ? 3Ì0Óô½øÃ?{jöÔì©æ’æ’æ’I#i$%«{faÊ¡ÊÉêïrš W‰ì'ÔR-ZÚs¸ËJߎ»k(\V\k©'âWh„6 ï¬]uƳ²ïÞ}q'OHg,’ ІࠂXÿV! ¹Ò¦J¡”“““Ó§)NSè:…N±$[’-ɉ«W%®’{M(ë„rz-[«ÿ.`šÌQ†£&Oœåb¸eR-IGÚrBu~yŒÙ0¸€Ãß§³Ø?ƒ\M[h?Úö­¢U´r'¸Ü î"w‘»¨8Fp€Ã?ò;ÊQvÙYE,b¹J\%®¥±4Vq¾%TPAEL„ŠHêFÝ Ø\Vp™ºŠv¾v¾õ¢ôDzSújé«w|nn>?ŠEÎ+Ä’ÚHM¥¦ÈF6²•iWî¸[°E‘ôú¿¼Å[¼ý7¯¿ÿÿÜu•(€ò½z¯z¯z/ß–oË·µ†YìaâVq«¸Uù=<ˆ2&ë±ëe§Ó0È0È0Èn7‡«Õ‰êD»vvíìÚ …‹ÂEkŠ5Åš‚º¨‹º‡l„xºj Ыé°ð¥~Ë‚:ºt’Úeí2}ú J.œõ|i‹}9wy¢Æ ÄTÄU¥ÅÒßG¯]Æö°WîNp‚“kŠkŠkŠÖ¢µh-òÌŸô0éaÒCó>ó>ó> Ä@ ”cðÌeÿž`„ ¦ìË–lël€žAºqJÎ!l š êÝFµÕÏ0 õP!øqx ÷«È«ËD&2Él2›Ì¶t´t´tÌZŸµ>k=>â#>bæ`Î?ò+– %H z‘^¤=ƒ<ƒ<ƒ Ù²/doŒ‚Q „òS×ÉÜQáÖÌÛ -IKÒRHSÝQÝI«“3üÌpÛ±6161|¾ ßEê-õ–zËÑ\~?‚Áoå·ò[± «°JNƒ!-H ÒBè$t:OâI<嫈.¡Kèùu9NŒÝØÝòR‘ŠTUŒ*F£¸àgqg•µ“8‰“ª(U”*Ф“t’N¯Ð+ô ñ&ÞÄ›n èþ„?Âgò™|¦*B¡Šà§óÓùéÂá‚pA9BùZ•mõOD.hŸkŸkŸsá\8nll,Õ“êIõ”ÅèT¤"•M` Ɔ<Ó®Ã:¬“ËÄ3wgîÎÜ-”NJ'9Îs°miÛÒ¶eòªä Éù(n4&®–êRUéÈBó¬kw´vváN4ÉœfAT~ü‘©ë7ó×wvJ_o\ÉUâv“B´¾”…vʪ÷»Î+Ï{rEHɪ¨Šªr7SÒŒ4#Íh:M§érª²ØÜMÑ”„"t: U^*/•WðƒàÁhZ‡Ö‘3û“Þ&½MzK3i&ÍTæð'xÂòÿ¢{õ2 ¡e):ºó=KñSÛµ±œ˜èÑ¡tí#…ö)Å©$‡øüÛ\[Æ/!K@œÜÜÜkl¬±±ÆÆM„&B£Œ‘5+þ‰Èyùðäüù/òsKÕÜ€IDAT_T3®f\͸ü¡ùCó‡~K'3Ðh4J•6*íòî+;®ì¸ÞôŠáŠáñ(z|Õ‚RJ_ܤ”Ò—#(¥ô®9ýKú—“  j¿¨Ã7ÔõÕõÕõÿYß:dJÈ”)Õ«V¯Z½jÉS%O•<¥¯­¯­¯­tø›†i˜ö<òCŽj¨óÙå³ËgW£vÚ5jçë¯w¾ÞÊ˜š¨‰šr ›ÌŒ?9 €€Èé1ïT¼SñN´*Z­*¦-¦-¦•ò¹Gä´P—ïN®n]6vWÍ8škÚKZ|!g`ÔN+ž¶,$õ`ÆBä‡/œa¨×ʺ5—ÓZäÎGqGñÿ±wžQdÙÛnUwÓÝdEI 0!bÀ¨`ÎcÎ9acs¨ã˜sœsÎYEÁ$‡¦SÕ}?Ürßö?3»3»3»:S?¾EuÑ}úÖ­Sçžóœª¨Šª¿å46UmªÚTuststsôÞç½Ï{_Ù9eç”S5¯j^Õ¼:·ëÜ®s»Nã:ë4®ý²öËÚ/k†× ¯®¨ ¨ ¨ ­W{ÃÞr¿†qÏg|iZKÛ‰'iGÌÆ 4à;Ž$ßñ¦ö¦Zr=I_T'å)°S®P•Ág9BÖ6‚ñ~À¬q)MJ“ÒL¯—Ø;b'¥s|=XÆ×ãx¦."¶Û‹íÑMÐDã¤qÒ8uØÛao‡½-O·<Ýò´g1ÏbžÅ>Ú~lù±åÚ [ ¶<œÿýúï×+—ªÇ«Ç‹cÄ|1Ÿ{ÊepÍ‘Ç#×Þ]ej•©C‹ Y7d]•OÁGƒ.߸|ãòº>êú¨+‹Ðp…¸B\!Ñ,šE³4A3ñAK™È_³ÿ?—ƒdý5‰IË¿²mOx“,&‹ÉbÚ”6¥M9wÎsç/ðø Éí’Û%·ÓÕÕ%ÎÄ™8ÓÍt3Ýü[!cŸÚ#ŒV§¬NYâR¹T.U¿^¿^¿žEÉer™\þêÆ­ŒÌ_ƒxÄ#žÍ<úÆúÆúƦ»¦»¦»Ê:Ê:Ê:šLÍ'ÍÅ…3ßJ/D y5ž—YX$±ÅóúWJÍ7ÙäVÑS¼³rRV˜°®Ù5=¶C %©DÞ“™ôM§yÈî_®`[Î~,Õ}ÑC0CHsÒœ4§„JcñcIS4ES¶&i]ܺ¸uq»’v%íJÚØØh®i®i®©—¨—¨—¨÷©÷©÷qý¸~\?êI=©'ë‡ÊÒeÙ6Wž+Ï•7o6o6oWˆ+ĈCâ$]¹ UÀÿO•ihÜbN7¹ ›Ä ¼T‚‘$’hò£C õ|å<À5t@ ¼°;åŒO|VÂfÙŠ2” %C±K°Dì'öû1Ç T ÂW‘Va9M3!E¦„Sž+Ï•sÄ1‡ô&½Iïzcë­7¶³ogßξåK•/U¾”é•é•éÕ¡3‡Î:³¡ð†«®&~Jì›Ø^¿ü¯®¬=VõXÕV…Z½jõªûØîIÝ“B»…¦‡¦—<\òpÉÛøMü&~GÍ5wÔ4O6O6O&Èò®¡kèV¶õ?ü*†b(F÷Ò½t¯TÒúoð†Î£óèéŠÛbzŸ®ÅèðÓÿË np“Â",†ÍªŒØìÊRUY:ÊÜÿÿcQÞPÞPÞдѴѴQû¨}Ô>¶¥lKÙ–²}hûÐö¡µ›µ›µ›b‚b‚b§ãtœŽËår¹\bE¬ˆCÇÐ1Lš¾¤/éKó1ó1ó1CCC}°>X,¹òû±ûÅâq‡” ÏÄ ˜­ddüÃqÏq0¼1­7}Û‹QŠK\o´‚1Ac7Õª¾rã@Ú¡,ŠîɆ“‘²öY¦>L~ ?…]B—Ð%fYcÖHGZ¤ ýÏÐ@” q ·p‹{Æ=㞉ޢ·èÍfïR·JÝ*u«£ÐQè(DGG[e[e[eߟxâý‰›¯m¾¶ùÚéøÓñ§ãÙ)É82€ QÜkî5J ZH¶p€ƒh+ü$ü´'zׯøèø‘ñ#{UéU¥W•ºo꾩ûf(?”Ê—O*ŸT>i-·–[Ë=)ò¤È“"ìÌáG$mæ³úŸíijrÕ©˜Š©ì!‡¯ÈWä+ŠUŪbUs¼9Þ/)B°›ß·Ø–¨ ª  Ö` Ö(***&+&+&;;;ooo°é)zŠž’{¦~u°5æÊÌÇ|Ì'OÈ"åþÒ@0#1ò‹#e¾6ØlÜýÐK±KsSrSr?ºWt¯éÞÄJe¦ª/Ö&ËTc?¯ZγZèÊçŠ‡Š“Mu„’úz7SÕ9-¶5»å;ŒÂ®6É$³„,ÚœîÁ` Æ`VúI:¤íI{Òž…QeY—õs´´´lÙ²9¤}¨}¨}hÓÕ¦«MWõõõëDëDëD¥µÒZiMŸÐ'ô‰T¼î7¸ÑGô}„ld#[\ .˜¢LQ¦¨‚è‚è‚è\ß\ß\ß<«<«<+ÃjÃjÃê|u¾:_­¯¤¯¤¯$ýû¦hŠÏé”÷VYÛJæ¨(U¸zÆÕïÃ:u^ýð©kw*ÎhٳɬÈÈÄj’^ß$¹4õ÷ð×Îq/Š¢(*M‘€eJ”)Q¦AõÕT÷IõIõIý¹þ«°ø:[`;˜Ø¢v÷íîÛÝrgÈ!wN–:Yêd©øåñËã—~}øõá×=¢{D÷ˆ¶mEÛÏîò+¼Â+HI ´Ç¢çI) Ñ ¹QÜ(Nj٭خخØÞÞÔÞÔÞtäÑ‘GGÅ·ŒoßòpÜá¸Ãq­·~Üú1ÓäaÇs¹Î\gÉ™¶üD¬Ý‰…Æ| c c căˆÜÍîfw)i„Ø{òmv`ªù8pÚÚÚ5JÔ(Q£D­•µVÖZi×É®“]'éÈ;¸ƒ;ò4&#ó§Àf³›¸‰›lÛiÓ:§õa'Â&„•ç‹•\\Ò­Ä¥k±Ëæ·îOK]¯0ò¥W{³µç„ú ·²Ópä<©Ÿ° §ññàWÿ!%”P¥YiVš4‡ÂCá¡(Ý©t§Òª¼®òºÊë j,¨± vLí˜Ú1a%ÃJ†• W†+Õa/Ã^†½ Ë Ë Ë {ö0ìaÝBu Õ-T³vÍÚ5k‡˜BL!¦2æ2æ2f¯ë^×½®;z;z;z[•°*aU‚Ç¿ã½çÆz¬ÇzâE¼ˆ)NŠ“âÄ…¸—¿`™?TàÁå„ë »LFÁ$!“TÓù8x’'p²s¶ê£X ˜Š6ðCQl&೪ K™p \—@·Ò­t+u¥®ÔU:’ þw°L/aòˆ3È 2ƒé®°DåååˆúŽõë;vœÒqJÇ)¥*—ª\ª²þ‘þ‘þÑÞн¡{C·zmõÚê•´8iqÒb,Æb,æÞro¹·âFq£¸‘ÆÓxÿ«ñ÷L=‹³8Ëvð[ø-üú”>¥O͕̕̕pwq)HAÊŸþ~,%5'`&ð‡øCü!aŒ0Fà \¸4pi·kÝ®u»V'¹Nrdr\ âZĵˆk±>}}úúôKn—Ü.¹Ñ(E£È ò‚¼`å‰b€ H}OÙôúkKð–EŸD<(2%n&7“›ù¤ï“¾OúŽ8nà¸m굩צ^'ÛN¶l#F<°1`cÀÆ5ÇÖ[sìPä¡ÈC‘ì”\—Çå‰>¢è#uZýcÝwÝ×A9NŽ“ã¼ïÃûˆÅÄbb1a°NX'}ÄWô}ÅòS¿­aËšU1{*k*k*k*³•ÙÊìüwùïòß1÷]ÒŽ¸‚+¸"_è_Ý7˜HI"+tÚé´ÓigÙ^e{•íÅMæ&s“ï¹?æþ˜üáùÃó‡“BB¤›•ì}ÇqG>²‘m|hXj¨“R<å‡4êZ¤°ÓË.µ«5·Ë õùùä­«Ö{EÞfáþ«ç‰:d{jFi6«ÏÛt²±µI²Uص«¡]«]§]§]©]©]©Z®Z®Z®z z zÀÍàfp3躃îúZ,Æb,‰‡ÄC¢“è$:‰GÅ£âQÝZÝZÝÚ¼y+òVäøæøæøæÇçÇçÇë7ê7ê7JÎÃ<Ì“ö°õgÖýƒ…?²‘lIŠ7 IH¢¯ékúúWðäñ)óP`"ê |îé‚jl$ €z8Kvd VÚ,V®àG³È"鎲(ŠòÀ’ù–½E™ë̦žÿŽ&½¥ÛÚ=Ѓ8â@§Óét:K w»ìvÙírç~ûuîU:ªtTi—x—x—øWý^õ{ÕoÏÖ=[÷lݶ#lG˜¾³¾³¾3º¢+º’ä9A}¨õ‘â¯ìtŒß2½ZvŠeVš†i˜&Dƒh`z½Þ‡¥2Æ/Œ_¿°oǾûv¬Ú«j¯ª½ÆÇŽd2™Wl]±uÅÖ6m>Úö¤=i«¸Š«4‡æÐ)Ïò?wMØÃûbˆqâÖqë¸uTKµT+Öë‹õqGpä›lKÄìÃÚ*]ÄE\TÖUÖUÖUVWVWV7w5w5w¦ Ó…éhŽæh.§Ê|ÕXŒsÒ‡ô!}òKä—È/á4Ôi¨ÓÐ÷Ü{î=GÒƒô Z¢%Zb/öb¯ì¾uœÂ)œ"ç9{ÎÞ\G(+Lw0‰÷XÞòEë³µ®:.3ÀéBžšöàÒ*dTÊ\xªg¼ÞöÀ”ò]‚œWØÙi§ƒ#»¸@ÎÀ½ãrÈ2²Œ,“Ú^Ã5\#EHR„¦ƒé`}”>Jelmlmlmèkèk蛳*gUΪÜ{¹÷rïåË+–W̰ааð‹EËsZh¡•RYR‚º”.¥K±‹°ˆEèå1&óg£ Cq óM…¥a(a^"|!d+šA_mROyWøÁ즧pEà[|@reóý­±tL™SË"”>ðj¢&jJ*ïlf6sÖ-d I:I'ét@'ÐÙt6­òQù¨|Ýlt³ÑÍïr¿Ëý.7 ) ) )÷yîóÜç±?Æþûã6Ý6Ý6Ý ò‚¼ÞùH>’ô =CÏдmð‡©¦°wË"ô*¨ ’ ‘ˆDò”<%OãÇ5Žk<KT@ª§zª'ûÉ~²¿ ¢ ¢ bVaî̺3ëά¾íû¶ïÛ>¸Vp­àZ?,ùaÉK‚}ƒ}ƒ}—[>nù¸ŒâÅ3Š“\’Kréz„‘òzÙ*Á?×zÿ9LɘYæGîGîGn$7’)ŽÇ‹ã¥F2’‘üX&Ú-Ђ© ©ß©ß©ß Ë…åÂr}¾@_ b2½ kÈ|E0ÅØÀ&]þºüu,­ RA¥‚J¥³Kg—ÎöÜè¹Ñs£Þ¨7êïTïTïTl‰– %h <Ã3<“ ù‘DwÐUGô*x›žŸPÐJ¬)UÅÌ· 7ùÚ|«¹V¥Ä&Åèv1IøPпÀGßß0Q?HŸ˜S<Ç;§D^í¼Úyµ³dÈ`p28œÌuÍuÍuŹâ\qîÿ‹Í½p$u¬]Ø…]’kÎÆ ²0M÷oQ;Kæ¯ ¹ŽìaÛ§KõìÛh¥Ó»¿§ÆéW{4½S|@·f¹šÕVíU¥ãƒq Ëe»ý&þÚª2}ãÈr…\)—^.½\zXbXbX¢Û^·½n{¥#YkëË\ÀXÄ"–«ÅÕâjYâUÙ«²Wå‰e'–XöÒÊK+/­Œ[·"nÅÞ¨½Q{£:¼éð¦ÃÕnÕn•TÌÄ U9GΑsüòbø“5[~Ëg¤  œçƹ±Ú3Ú3Ú3N 81àĹá熟W#®F\­Y[³¶fÕÕÕÕÕÕYžŒëÀuà:°Ä¡_8ÿ?gF@êA¨Ü®Ü®Üü)øSð§:‹ê,ª³Èa‘Ã"‡EÒ‘‡q‡¿±[ ÕPMúª’£äh¹ýåö—Û~ ü@øbßû¾Ø÷Ò‘pás¡›ÌW+ gÀ ãÈ82Žíðœé9ÓsfØÍ°›a7k5©Õ¤V—.5\>—t¯Ã:¬û (™ÿp…¿IY\Ù‘í—ñÓäåÙÏ)¥ôJ}}CÃÄ”Rº^{ùäå£v±6ílÚXŸ±Ùe³[RgÿçÁ!Á$˜KkÂ]Ð]¤"Ti:G‚Ì·Ä‹Ý9õß™{¤" €’.¤MÔÏ•¥‹m}«"ªù*oä0 P ßXãv™?¦ÈË–¡à'Gq—þú{§Ev<»=롇žÌ"³È,ÖB¼%Þo)s”9ÊœvëÚ­k·®•m+ÛV¶%J$”HHÛ˜¶1m㮥»–îZº~èú¡ë‡~(þ¡øéÈäz€ ÄL1SÌü¹ ÍÿÀz,¢Ãb䬘Õ_ôýÉ|2ŸÌ×…éÂta˱ËqC{C{C½ zAô‚²Ên(»aZæ´Ìi™ûìöÙí³[]fu™Õer¶ålËÙF–’¥d)½EoÑ[F0‚SÚåjÓTÉB²$%Öºh†aØWÑNë÷ÂÖˆ·›ÛÍíVf(3”âºúè꣫ % % %™ÄI"I$Iì'öû±ÆIÒ{þï(Þü'°²'f™0„!Œ)ºpVœg•³6gmÎÚÄ ·Ü~pûAÿ»ýïö¿[aV…YfÍ.2»Èì";õ;õ;õëϬ?³þL^X^X^YCÖ58ó8OE*Rñ‹n² ‹¬n¶:Á½áÞpoÄ®bW±«$$ Ih‚&h‚øˆo­pÓbqœÿÿÿA]E]E]Eˆâ„8ÖËP:òüz™¯I'8©œú â ¨5¢æq»Çí·SÝUÝUÝuxíðÚáµ_Œ_Œ_Ì£ÌG™2ÅÃâañ0»¾ØãñŸÒAæ×PAŽì"£PžÔ/K´òøÑ¾•{I×T«}8ƒ¡p\çÇŽo·>Ñ=OûpÄœ/ܧ?·P ? ca$ÈÈü à,Éž ¯iZ   ‹Þ(N‡¨§+.óµ-”~¼”C¢ |eÃÉ|Ar#•ô1mïR(…RÒ_ž*Ãö°È·-laK|‰/ñe™ÙÌe·UÚ*m•]§wÞuú’¡K†.Úbk‹­-¶êªéªéªí\¸sáÎ…k¬=°ö¾ýûöïÛop1¸\ÈUr•\E[´E[:‚Ž #XôZú¿ßÖäÎfçp瘔¤ôX²ƒì ;®¼rðÊÁk®¸fkþÖü­ù,úØÓ«§WO¯˜Ð˜Ð˜Ðбc+ÆÒ^´íE)¥”J¢iÌe·HÑù"êGq ° H8 'ád<OÆKýíyó_ï™?ÇŸãÏq¡\(*ŒÆ ã   ¤#ã1Ë—õ7sµÙfMãG`Fb ±†Ø„؄؄X]Q]Q]Q·T·T·Ô’}Jö)Ù‡éj£;º£; 7È.û/…“XG\Eñ/‘]¥Yé§E=0ž(c”> ñ¯†fœ3ÿ ¼§Í”a ;n x„`‚$A,#ó·ä‹ˆ{¦}ÁÃc5%Ö¢Þè¡î¯8Ém¶î®\¡X 4£$Nɶ{X¼ÀJƒƒƒiM£iæAæAæA˜Š©˜úE« “qlL“Æ,—iѰÛg=C=C=C—ä.É]’“““„vB;¡Ýiñ´xZÜ¢Û¢Û¢»“r'åN 6a6q˸eÜ2±£ØQìH©#u”\4æø2g½[–»\EPDêØÇ²·¿þH›e|C4DCA#h÷Ž{ǽËöÈöÈö`mønκ9ëæ¬ÞÖ½­{[W.W¹\åróÌ?2ÿÈî ÝA»ƒ6vÚØic'Ý Ý Ý r—Ü%wi  Rz’E±ÇÅqqÜ]î.wW\'®× g„3Âéý|ã²zÚpm¸6œéH˜\M®&WIùŸ·Ö’ùš±Œ¾/ÄB,doòŠäÉ+òdæ“™Of–YvfÙ™ƒ‡!?6?6?ö]Ëw-ßµÄ ¼À ÔAÔ‘¥þKx£0ìéN8`!â"j.רã2¬Äb˜P?o¼ñ@ÜÑ ™[0-PCì)®§£pøQ6žÌß™/÷›ºú±lñ‘v¢u蕞×pU4:e7^…@z¡,<¹1Éß‹Lqr’œ$'9{Ξ³§uhZGL“Ä$éHVBÄÜbG8‘Ïä3ùLa¯°W”g¼í¼í¼íº%uKê–TWý]õw©g©g©g=7<7<7lrÙä²ÉåXì±Øc±&O“§É“< ÈZŠ–¢¥DÑCôÔšÙmûç%˜,º\%Pâ‹ý–“_?,"ÎÞó)œÂ)é³›a†™l![È–óÝÎw;ßíᆇn´aІA–oX¾aù>{ûìí³7°]`»Àvk.¯¹¼æòÝJw+Ý­$™Ùó$=IOJ{Fd_‹¯Å×2kÍZ³VØ'ìö¡2*£ò©î‚å:Ë~fßò}ÜÇ}U„ª¾ª>YMÖ5¬ {üÂù“ù±¼–CŠP6ÿ¤Y§Y§Y?[ólͳ5~ù~ù~ù%^•xUâ•!À`øäóÉç“á¡ Ê Ì/´]“ùci†Pøà,îà¥ýk«*÷U9VÂâHø´±YÛó?^Ø—ÿö!öã š¨?}!ç²ËÈ|á¸gdêÜô®aCi#ŒAÇU¶ž«¨ÇÅ8ú¢Ü1CvÜÿöXÞ oã6n3Õ¦CBV“ÕäsÆðwøßWâJ\iÚv* …ŠNMš:5my«å­–·Z÷iݧu÷ãîÇݧ/O_ž¾|ÛÔmS·MÝòjË«-¯2GdŽÈOx“kÌ5æ‹åÄrb9éü?‹åKÛL—†e´ÿ€ðƒ“«“«“+ë³hŽ7Ç›ã³C²C²C¤N{,þëÇò¦ÅÜ P°Ý¼šWóê´niÝÒºý€ð®v¾ÚùjçžzvêÙ)ôNèÐ;«V¬Þ4|ÓðMÃw(v(v(ôåôåôå¸ÕÜjnµ¸[Ü-î¦-h Ú‚î§ûé~tDGt$oÈò9É\á?¦ÃÄFýà? ABˆñ ð…/|¥V_l•€Õ°ãéHG:2 ä!y¬a YB–%´<-OË+w)ß)ßñãùiü´ÜÀ\E®‚è.ÉicœÌ·‹£³ñ3³1û]¯w½ÞõÒæjsµ¹ž=;zvôwðwðw0‚ A9erÊä”aéa’4ªì&þðà@H7₃tuC±š/*Ü-¾Ý±±MKÕzsÉú÷oÒüóŸ¼ÿ1%ÓHÖ ì¢½èÔ“'#ó…Ž{õvžG ÇÒ[3œ{\Í`èt”æèû¼OdåeþRdN©åVlÙn¿‰¿¶Ž{'tB'¶©ê©ê©êʇò¡|íKµ/Õ¾¤y¤y¤yDj¤é@:–/ÌÌÌݬجج¸u?ê~Ôõ*׫\¯2?u~êüÔòNåÊ;}1J_ä…”“Êø-r„L¾žÃçð9õÖÔ[SoMÃZ k5¬U}põÁÕKGŽÅØÿSêô]Æ –6añrKYâE#ŠFLÞ7yßä}×]¯»^w½m¼m¼m\üjñ«Å¯úô ègyJû0û0û°:‰uë$V«‰ÕDÅEÅEÅEéϬ¤ïçïÁ“&`&@td:™N¦s¾œ/çË är¹d.™KæÛóíùöü^~/¿—Ïæ³ùl®×놭؊­†©k:6rlT¥G°{°{Í’5vר]1¦‚w.-º%Q%±û°OžÀ¾y,éÛ¢-Ú2 o6Ò*”«P®B¹ˆ#~Œø±j骥«–VWVWVW–Žß‰Øù c[æ‚æ¶“mpLõîµ·¶¥—u#ÊÒþW‡w^Þ{dû†%ÐP†œ'-q8ù[‘–BZv^žN‹Ê¨Ž’t1Rp *„à½Í«™Ê8¸G»âGlÆ^ØÁ)ÈA¾lÄ_…ÅiؤÏòªYÖ5ËÀö†7¼¥ÜbÆ·ݱhƒBjÖ¤5בÉD;tC7âM¼‰7½B¯PÖôâJÉ~%û•ì×CÑCÑCQ·gÝžu{jêhêhê<ˆzõ jó–Í[6o9›y6ól¦9ÜaÎ ·È-r‹&К@}¨õùÂYÿ-KØ¥Q¥‘ˆD$ªýÔ~j?S¢)Ñ”(Рť¬zS+ÿÖG³ ]HÒ…¬õW™«ÌU~êý©÷§¦ÄL‰™s;âvÄíˆ>¡}Bû„† 6Ì¿’жèmC¶ Ùî°½Èö"^ú4}šê’Õz«õFS¸)œ¤s±\,çÀ5æÓMtG"IÒÕPUÐíÑÕQÕ‰±"VB3¡™ÐŒpŠÿÿƒ-~Û±ýÿtbÞ€ Ø@z’ž¤§Ò 4( VqVqVq|o¾7ß[Ñ_Ñ_Ñ_¹P¹P¹ëÍõæz;Ìt˜é0ӯ߯߯ßõ•ë+×W…¶ÚZh«mcÛÆ¶m·Øn±Ýb{ÝÎÅÎÅÑ×ÞÙÞÙ{EÃÍ 7c‚ª™ªW„L%S¿iQ¯E½÷Oß~?˜\&OÈ9ÌúÍcY´Êñññ‚½`/Ø?‰|ù$ÒêºÕu«ëvz;½ÞŸ÷çýù‡îݺ ÷„{Â=©Ôõ â }ÿè‹Êð¦S°û°¾ø®R‹’£>"YaG–b¹Ð€^;TíòЧsq®(ŽŽˆ„ Q¶¼Œ  @2 >gO.b¦à/$Ð(>‰äoPQGo9fj{ªÂw°[üŽò´^¡8Üq åÆÑÿ l`#Mô÷¡‚ŠïÎx¡Üî ²È ²‚{Fj“Ú€!=ò÷E_À¯Òž|G¾£¯iM…EÂ"á®"¤p‰áˆÎV·C·ÃAmÔþh‡÷vlØúTëM­79ouÞã¼'U“ªIÕ¬Z´>h[ü¶ømñ¹×s¯ç^g1r.†‹ábÄAâ qnànü¦æA?§:ª£:kË¢¹¨¹¨¹¨­­m\k\k\ûá퇷Þb=Öc=r‘‹Ü¿È¨³LÊF6²ÅÛâmñ6¹L.“ËÌ¡?²õÈÖ#[=|ôðÑÃÞÍz7ëÝ,|døˆðÑâ§DO)QÖ¹¬slƒ­§¶žÊ^š68mpÁЂ*UL1ÆÕÆÏéOEq‡%æîáVb%V~ñN‚Œ`M &Ph;Ûv¶ílû`û`û`«EV‹¬Ù<²ydóÈú•õ+ëWV÷¬îYÝS™T&•ɹ±scçÆŽ¯_;¾¶q±q±q±½a{Ãö†ãyÇóŽçµAÚ mµ³µ³µ³µ¿µ¿µ¿ú´ú´ú´ê½ê½ê½$¸+±’9ý\ Ȳo™kŽà^˜Ï‡‡+†WWðíIÉ3¿SWó<ó<Œ)HGº<ýE°tµgb&fâ.î⮾’¾’¾Ò›'6Ol'NœìÒÁ¥ƒK‡CK -14qVâ¬ÄYRyý=Üýo½ û«€µ?»KO¢½Øƒîò\ä>Öql™q^ŸœÓà., ´Ó% Ÿâ›>™Ú·!€âÞ OvÚed ¼Dôìóô0mœï`*ÜR? öd=@»ˆñM_uä!F:Žz£B‘ÙqÿUXlæ ®ã: ÐâTqjnç¬Yu|vRvDºž®A×Óõßð'õ„ü¬ïØ ¶‚õ[?[?±ÕQ]ëem_µ}Õ$¼±ucëòåÅ@1?R—ªK=RùHå#•×{­÷Zïõ´ëÓ®O»Jcnåz^£Åh1ú‹ÛíïuÙQˆB‹±Y§Z§Z§*f+f+f'Nœ<øµûk÷ן•æïàÎ_²jƒ­ð°|( ¥¡è†nèÆÙr¶œí«²¯Ê¾*;qÌÄ1ÇÜzxëÍ­7=«öìÞ³{ã§Mú5ébÕ±LÇ2‹¤O-.ÌŽ ÇM5òöäí9ê¶iò¦ÉY+Þœ{sÎ%½†{ mˆfŸfŸc)ÇRŽ¥´Í´Í´Í´iÚ4mš6_›¯Í×(4 º‰uë&Ö‰Ö‰Ö‰V~V~V~ÚkÚkÚkš M&H½]½]½]Õ\Õ\Õœ„’Pj®d®d®dîdîdîdždždždªaªaªazjzjzjÖ™uf9ÙœlNÎÍËÍËÍ3©L*“ª ZAµ‚jú(}”>*kHÖ¬!Y'²NdÐÖÖÎ,”Y4³¨kN2'µõ˜rrÊIë'öZ{-€×x­˜§ðPxH«níÐeþz33Ó’:„C8”Ý$»Iv“¤#IG’Ž”~\úqéÇû=ö{ì/8Zp´à蛨7Qo¢$ª6hƒ6Rýƒ,ùïAAAI7Ï"”AHéV^»œÆzüäšeÛÀV<½7óYjÆÌ¬vù•Œ0C„Ãè ÜPE6 Œ  Àsä|n¿bž-V Oòö›ê ¶Ú0«Bü)@D/;Ô׬¶JÆ#‘ô;ºöCtAcÙ|¿ KŒYƒ—xIÚ‘v¤]ÕF5ÛÕlWrU`©ÀR¦!b::²rdåİ{¥ï•ΠóÓùaB´̿þHDÒ–´߈œÈM½£ÍŽ6Eí‹Y³6TJ ¥5ë­<­<ù€”B)…nxïk¿¯ý†¶¹ls¹\ôÒäK“Ù¸Š\E®¢¸IÜ$n¢4J‘õÿ|1š%Õ0 L0ir49šþ‰¿d¸c¸c¸Clˆ ±¡[éVºõ[±ù¿‰¥“± Û°M4ŠFÑH¶‘md›ØDl"6Ùo»ßv¿mü½<ì÷x j *Âv¸Ûp7—¢E=Æn˜ÊÚPæqÑîE» ·S¤PÌÓLÖLVDñíùöŠñŠñŠñŠÇŠÇŠÇŠ@E "J(Ñóz^Ϭ)XS°F_M_M_-ÿRþ¥üKŸ}zôéQA±‚bÅr/ä^ȽPð}Á÷ßç¿Ì™ÿR÷D÷D÷¤àfÁÍ‚›ºººY‘Y‘Y‘Y§²NeÊ»žw=ïz®_®_®_ÊŠ”)+2‚3‚3‚OÁSð¤èºA̳ÅlÔDMÔ´4†s¬ó3çgIGžÇ?WìV(Š‚ú³ú³ŸBR´)Z6fhWE£0c0FžÌþRXª  "%H R"õ|êùÔóV)V)V)~=ýzúõô=ä{È÷þŒþŒþLj@j@j€Ô¤éçÕ2¿;XCMZ ™¸‹«xåYxªíE¢Íe=¢³h×swG¾ž›wG'r1ä1^Чh4ÂaÙ|22sܳ?ç©›æŠùty1M47sÿIsY‘€%Ô“fØ®´«ŒWôåöq:s¼ À.Ÿ[£Ëü„$sùᴇX Ï-uµÔÕ‘OfV›Y-‡UÆ'åFæFòÓ_”|Q’»¢õÓúa¥ØFlóÍ8‘hˆ†P ~‚_Á›âÍ‹7/ó÷ùûŠ–\#®‘: éHßþfÏê=«c<ÇE‹Î*šó&ç ¾Ç÷øžt%]IWq€8@€@"PRù÷"ë?‡e·G"‘hh¡éªéªéJŸÓçôy¦@S ¡³él:›5¢™4“fþ-F¦E¹}A_Ð|<Ïdz@ó;ß÷µß×N;œÖ$­‰é'£ƒÑ¡`®â*]$†‰a\ ¼ÄËßõx×#½ñÓ6OÛèCÍ/Í/³eoÍÞšÝ>»}vû¬Y²d„g„g„ç…ç…ç…Ü n7ýýý¶ç›ç›çk¸a¸a¸QRR’³3ggÎ΂ׯ ^ÿ›RŒ¬’â×(†b(FPwRwRwò<îyÜó¸ßQ¿£~GíŒíŒí²Â²Â²ÂpWqUJÓù½¬ÇD43!‹vPð±¼¶æíòB±æ¸cn'¬G:‰¬{äôriÚC”EqØp„ÛÎU —Äo­O³ŒÌŸ†IHÿœÝkj*»æU0¾0/ ¤-‰‚ zÐKNm5Ï­¬Ugßó—Í¥AQîp–Í÷/ÐH…§(@IÔC=Ò(P( --«LV™ÄŸ®Å^‹åz«‹¨‹ ƒž¤'éSú”>ýú?iB¶’­tØRlé×Þ½­{[õ»mvÛŒK׌×Ô?Y9Y9Å=»—x/1‹æ¼Éy£r±jnÕܸаа.  èI¨‘aÙ%ô?‡•”ÍÀ ÌPµRµRµR-V-V-61ý.ý.ý.ößéizšž–ä ÿª‹=ôÐK2yñˆG¼P]¨.T/õºT~©üè5Cã‡Æ‡­žY=Óæ½ª¡ª¡Ù Äpo“¬W­º\ñ°ûawô IgÃ÷úd}²ðPx(<”ä›±›áýXt`}^¥íé˜Žé¬Ø”|O¾'ß³œu–@Å\+,Çr,§{èº;°;XGX°îS¬È˜=…°OÊZ)Úœ¶ -¤,gR’”„Žã¸f°f¨f(Þb:¦£Z¢%ë6€Ldâïñ8÷÷„]ÏñÏqGp„5lz~ôùÑçGÕ+Ô+Ô+ÜÛº·uoë·Ío›ß¶û)÷SªªK]#–a–ÉE«¿ÃäÛÉ$4¢»©]úØ.µšZ­z™ÛEv ’¸Ml•¦HO5Œ~,¼Ñf­A&Þ O¬HwÓŽ X)ÛWFæ3a8ÓêÐú«’UåÎ{÷Ù߬05N{Ø}8¥SíºEÞ6tQët‡ÚRêÖÒåç‡M˜,ïW)Žâ(ŽÕ  ¤©Ejµ­ßYßY¿¤SìÙØ³KîÇšcÍ#SfT™Q…·±ûf9™ªJU½ô§”Òx¥”>®E)¥›®Ÿ0ž0ºn+VHZ\&9$‡äH/cQö?ƒk¸†kìü¶:[­®Vt­èZÑÕ+W¯\½²¦¥¦¥¦¥tä ¬ÀŠ¿ì8´Ôá©Ú¨ÍÍãæqó¤=&˜`j=ºõè֣誎ªÔ¸ÿéþ§mc¶OÝ>õûË_,±øÔN_µ¡Þ†zã­X/°ööMöMþ…ÿå _ø’N¤éÄ}à>pøCü!þßïÆwã ñ…øBÜ%îw‰kÂ5áš#1#YGÖ‘uDETD%}L].¨ Ÿ…ôªW ¯^5"†D ‰âÆÿŒÿ现6° ì`;yû[`¹ÂsGq…P…¬[ ¶<%xJð”ˆ-"ZT̪˜U1‹µ$c=%Ð}ÐçÎ#ó+=$ç` 5¥ç{Íu¾&Œ¿à6LIS®Oéz©ö²ß)9E¬b0YM±Çð#Év“‘±D¤" bl'V“³# ÆFPpfâ*4]slʪf+•Ã9?rÀcì†aóMm™ÿ ë+™‡É˜Lch ¹xõdÓ“MßL~üðñÜÓ9Ž9ޝ>¾vxí X«î¨î(ú..¢ ª¢ª¤£òÕCv’óäzüÿLŒP›j㫯p0ðZàµÒEü’ü’öZᄎûêýÊ÷Ý_4ÀüèùÑZ•V¥U! H`ùåÒ‹îÆý{¨¡†šXkbÍ„5‹E‹(¹7roäÞ2¦2¦2R=QQü¦FNß –ñikXÚÌ%sÉ\ Á a»«¾ªúªê«­ý·ößÚ?îD܉¸g¶žÙzfk¿ýnö»©UWUWeG¹[4¹hrT¹F-µÊ vvV¤+(ÝÄL>'59  }3ö±ˆ¸»Þp½áz#|UøªðUªW¨^ásò£Ð7õ¹dþ(,×-Ä;w<^»ríʵ+‡{…{…{yóç=Nºìì‰=±—ë"~Óõ– ÂC¶½7oFj‹"4ájèGyáæ°ÈžÍ›TúPU¹‰$D@ …¼Ž!#ó%à#Ò‰a°Gºš¶É¾ª?kp3HYáGšMÚœTnãs­Èeâ)½Î¶ÐÈæû¤à=Þ3W’kÇ©9µ¹Š)Â!6Ú mñ ¯ðê­g(è7æD:¢0 ³Mk{ëµÖk5^6µmj;Î)T¨P¡„I~I~“ëL¹5åÖ;ëw›Þm »rìʱ+¹ÍÜfn3  4‹°‹¤|÷ÿ8~püàø:âuÄën7·›Ûíêêêhíhíh-¸ÅXŒý"ýF†Âí#­ÉK´ÂD.{Ï猛ҹ¿] MhÞŒüT^g÷áé'ÿœ(€¢±dãÉÈüÒ%uoÌÍ#éä* ÈG^æpÝ“‚e—@ÆŠ h;:Ÿ¨¸-xâTM»Zó¹ŒÏ yJ’ù?°UT@±®XW¬K‘GäÑõi×§]Ÿ6çÅœs^äÎ;wú»ßÕø®F×n]»uí&‰Ç¸þ\®?&b"&J7Î/úÎnŸm[Ú¶´mÜ=îwOÜ*n·ÒV´mÅNL£h‚œàDŽ’£äÛȱp¤ÌÏÍÏÍÏY^¾ÂKá¥ð"mHÒæçGÊüMaÄÏð Ϥ®ÀÃ1Ã_L|1ñÅÄÔw©ïRßY·o5>`CÀ†€ šbšbšb˜ŒÉ˜,å»[jÆÿ!‚rã¸§Ä ¡ðƒ6ôY¹NEfÚ^h=‡¡°½˜ò -9Y¬MR¬Á”A*²a‡¡ŒÌÏáðYÈ% ˜þ9û3·áª©€d(© iÈÁU¼q6ÛÔÕT–^'Ë2Éüv£bNO,bË´Ò¹¡ÜPnè‰â'ŠŸ(¾‹±ÂkáµðºWá^…{n³»Íî6»Å5âq S#‘Zœü{Ñw¶¦!@€ |ª|ª|ª6©Mj“y¼y¼y|AjAjAªtÎ븎ëßÜõÊ“,ÃRb¶qÛ¸mb¬+Æj·i·i· ¯2¼Êð*“·OÞ>y{ÑáE‡~eÚ•iW¦ Ë–9,s_Ó}M÷5EÒF “¤°XQ¬(V”V2 ö¯kkk±[±ÕÜÚÜÚÜú›Ÿlí‹ ÕTšJS…±ÂXa,™Ef‘YÜ&n·I:R.N•±Œš³Bvg8ÙV¢•h¥Ä•‰+WfuËê–ÕÍ&Õ&Õ&µ´GiÒÊÃÊÃÊè†j¨†–h‰–rô Qeh1Z†â2’  ¼æç8KTÍ87„p«¹’§‡ÞÚ÷ÒÛq “¹FÜIÂá>ž"E†22?‡“އá<±]ú®Bñ2Ä"bÙOv‘>°C&tÎ)ÚXÍVÙd2ÿæ¾ÛÃöLÉ[ÌsÄÒ–´%m÷…ï ß¾þÆúëo(÷)÷)÷ .3¸Ìà2 ß5|×ð¸V\+®å|9_ÎíÑíwÔÊâHí'í'í'î=÷ž{ÏšÞ›ûšûšûJçLG:Ò¿{ZÞòEˆÉ82ŽŒÃÌÁ1L ÃÛ¶ l»Ä‰ÿÿŽ©S;¦òeù²|Ùæææè9Ñs¢ç$îNܸ›;ÇãΡ?ú£?ýH?ÒRY0û/L†r·ˆ[DÏÓóô¼ÐWè+ôýæGfò'²‡ØCìancncnCf’™d¦òòòt$û“‘± F|ïñ=&`&www$ÔM¨›P7ß&ß&߯qãÇþsýçúÏ%åH9RµP µPõQÿo¤òn9_…¢¼¹ŽÜRN4Ò%´“ÓûÖ©åû”X^ø(n™Ì²³²f_>«úÞ-Ë‘O   tÐÿ£Ë‡ŒŒŒœ4¡ìÀK|b»tžæ±œ„ªb(·†lÇ€¾G¦SSí9µÜtXæ·ÁâL,Wx/öb/àpݸn\·ÕuV×Y]gûÖí[·oÕ–Ò–Ò–õrÔËQ/Cφž =+®W‰«¸~\?®Üà·ßµ²•ÔvÑvÑv!»È.²«`_Á¾‚}¬QÒêþc[>ý0ë±+´<Ê£ Ëá{Í)Õ=Ùd2¿Vnk;ØÑ'ô }"FˆbKÇÒ±1ÏbžÅ<;`<`<`t\ç¸ÎqÝ8Ÿq>ã|ÊèÊèÊèÄÚbm±6éEz‘Ï:¾¿%j¥†jV¢jÓ˦—M/âGüˆ_~~~~~>²‘l)–Ïzj~0—Yo6`¹In’›¬rÀù„ó çÓJL+1­Äq„8Bt¾ê|Õùê©Â§ Ÿ*sJÞà ¤¨3ÀðÌÁn 7…›ßüh,@ ¤¡ô–¾¥oY·Wb&fbæ«óÕùÏMìe9H™Ÿcé¾wGwt'vÄŽØ¥M›>ö©óSç§Îô}DyEyEyE¹7soæÞLŠ»¯Çz¬—®¸o×}¯€’pÃxtE(Žc>Z‘ $·yÂ5'ƒ¸d+y+fÓ®4Ó|M8'Bè/ö ë4Ô ªš~¢÷wn™³qk޳ŵ Og_±Ü„UÖÛµZëy®¼så“(²(KDNÏ÷–ëLdd~ÏÓÇzwØfN}C);?ÖôThÌOã‚És÷ðÔa¼z·UmÙd2¿vó‚¬ÐÑ‘é‹Ó$šD“ [0lÁ°S÷OÝ?uߣ‘G#FÓºNë:­«ÞG3è :ƒ»ËÝåîJ¢‡Ö°†õ/üæì&"‰ÌÕÚií´v„BH~p~p~ðçÑŽðÕ9î–J&*¨ â¹@.ÝРݨµ¢V!ÛB¶…l[Ú`iƒ¥ š6kÚ¬i³Üê¹Õs«/Ù»dï’½cK-=¶ô›²oʾ)Ë á†pC$ÉËÑÑÒùm9ïñ亮óŒÆ?cZ+‚»à.¸óã5W" ¬¦ÂLÍÔL¹\ ®…rrrt¤<à!_¸2¿:›½À ¼ „J0ã1þC‹->´x[ð¶àmw•»Ê]-©*©*©rjïÔÞ©½Ô¤é)žâéÛlîƒ9É ðÿð ®aúpÍÈ=À¯âΓíä(©Žõ˜‰¸Œ†‰=´ =‰ Šûé2q õ£FŸ,žÎËÛ½ûTºÒt®—)tð!ó¬±ÍoßtZY´cf‘Å>y½Ë›¢¼oßY?ÌêH¡îÊt›aÎ*®˜"HÑ «°»I5Òƒ •ìÌä5edd,øq_†xʶóû×CôÌvB/.id-€D$;ø«*d“Éü›0GYô6½Mo“<’Gòt?ê~Ôý8uØÔaS‡]lx±áņ¾|7ønø!ꇨ¢ŠÔ)R§H±’XI¬ÄŠ%÷ëçz=ÔC=ÄAT$)’IªwªwªwÆWÆWÆWb †Ïý;YÜýë¹}ZÆ×™JÌyîïíàjÓÚªo„]•¾µvœ^âìÚÅçÛL=¿lñ½–½wxON|ù½Ðwbu„Í­âQdœ}¦RÑY_L?'ÿ;ª5…ãÄfÆáº¹ú ææ&ÁÓdz¥gC„  á°_jÇVÉXÈFFFþq“ž ¸Ï6óZ“McõÍÌó„Åä‚z˜" @}xÙi¬Þ*ŽldÃÉü›°ˆ/<LÓÁd*™J¦æwÎïœßy¦ÛL·™n¶¶¶ÖVX[aíÔSOL=1¢ëˆ®#ºfwÏîžÝ˜ˆ‰˜¨’*©Rr4Ù9»£;ºãNá”uoëÞÖ½•M•M•MuututuLMLMLM¤Ûä9œÃ¹ÿ±ØŸ=H æ¤9iδnÄ1D ñkâ×įÉPq¨8T ©R5¤ªù¬ù¬ùì.ß]¾»|—w]Þuy׬¦YM³šr7¸Ü ñ®xW¼KûÓþ´ÿ-™~{aœ…î Fb$FJ+ó0ó¾ù±—‹\ä²²išA3h†é‚é‚éQQ)ë+ë+ëKGA‘/V™_Å2m†u„(…R(Å®¾¤'IO’žhfhfhf888øO÷Ÿî?ýþÊû+ï¯4«Ì*³ #0#° °à‹ÙàϘaÜà ;Üà Ézt$Q …i/LÅ:Œþ„k(„VX!B…L§Àn%z r¾çõÁ­¤!ÄX:ÙýpøÉÊ‚wtàrホ#ô¶›UHGåÞà? LKØ-h*w“€wó2yý¤BÃÔ³¬)©1º)¡ª`êCDˆîaZ¼.^ßôfëO[2™M»M»9'ΉsQé1É2Ì!#ó·DrÜélœ£w±<Šå÷729 3u1÷€†¬³jà!JØSmUÎA „Êf“ùaÓ®J(Y®W‡«“|>ù|òù Á‚'ϯ<¿òüÊAë‚Ö­›Üxrãɧì²wÊÞì™Ù3³g’EdYD‡Ñat˜”×ÞЈݮ¬Î[·:¯ P(²êgÕϪoŒ6F£¥¤‘;¸ó91ìÀÏnÒÜqî8w\l(6²=}û4ö`?À~€}‘=EöÙóæÕ›Wo^ý4à§? 8x,ð˜Ô\]º±u»ˆ]$'›=̰–L¿v;ÌD&2¥©¡°¢°¢0s/L¹¦\Sî7ŸuÊ¢w Ñ YÔSè t:xOâ¥Ô G8J=åâT™…¥ûÎ\ðƒ8ˆƒ¦S€)à‰Í›'6åJ”+Q®„S[§¶Nmúôèÿ(÷Qî£\Z‹Ö¢µŒ`ãnáÖð~xp  ‚’Ú0c ׌»B\IY‹ræ"B$u£ Àl ì00­§$ûʺ¸Ü)Ï:Á—üc\²+–°r^(ú&¸Âóˆ{Š­(+’f€¹£p EI-€4!3ÁƒNLëÅ”¬¹SM¯o§%½þTãB佘7!qÝŸîMÝôâãÇ%ùë¼"v;gº)ÕJW¥“hÓÄ9ï>¶ªQ3¢f¿;ž xâ3­äÈ’#çåÍË›——e“e“eÃRÄ‘âHq¤Ôƒ…`¾Î¤#™?™DÜéÜ„e@óž:›îé{˜`ÅâM>ô M´««ªÀ?‡5¬0fÿPùøû]Éü±0ç’^¼-Þosœçñ®Â» ï*LN˜œ09a®a®a®¡îµº×ê^ÓQÕÑÉÖ“­'[ …‰ÂDÉB‚HGÒ‘t¤¶Ô–Új]µ®ZW¥‹ÒE颢¢BÏÑsô€ÔE]Ôý|^Ë›ÍtLÇt)RÞPl(6´É°É°ÉÜvpÛÁm›Ø4±ibc5Ìj˜Õ°Ë£.ºÉ'ù’qñŸ^¡îµî([´@m >‚P”$sÑŽP\#“‰ ¹…AÂ\‘§…óâ?nΊ Å-Ål÷™Îßi{»„;ÕŽ©çW>w»Tòõ¨øÎ{=-TÛ¾¥6Wõ£6Jyàvã0`¾&„|_È'2N\mª)ë2*æ {Úò}LöÉ«U²½ø4.ùõð»+ž,Iž96Oa\k,aªfîóO°Hxú›åÈ@*Ûyh,ÔP?m}­òµÊs 4¸QÅFsÍuvvžo;ßv¾mBõ„ê Õ‰‘‰‘¡Gè´@ ´=™¿'Ÿ#îݰ ‡áOð9o õaym ÕLÓRœ» Ð[b¬M”b ¿+QF¸Ã6ò#óÀ¢ïyÈCž˜'æ‰yÜhn47:±tbéÄÒ3‹Í,6³Ø”‡SNy™™™Þ6½mzÛ˜21ebÊ0Íi‘:„†ÐÆaÖ\Ò\Ò\¢óé|:¿àZÁµ‚kLÙ†D“hMSh ýoµö°¼µ0v313UPU0¾Ü¤r“ÊMŠ~ý(úQ¥¨JQ•¢²Êg•Ï*¿^µ^µ^µ)~Sü¦xCUCUCU®׃ë!¦‰ibš«c*ì–’Žÿ9, ü=AOH%Å,Jý­Ãä YûI˜„Iæ4sš9´$-IKE¾"_‘™˜‰™¤)FŠÉÓ›ÌïžÇ˜ûÞmІ(‰’(³g Îü¬ü³òÏÊ´ hЮø„âŠOлëÝõîïZ¿ký®5ë«€+¸‚+çau)"ª£¼É8€ ÜRR–Äâ$Žb·°\ÜCo`9öàöS @!ö66³4E«¦–]^ä`ùå>í§†>)?°X\ål¿û®ÛܲÑ츧˜‡K¤7Ză,èuÚÀZ 0¥"øãô´ùúô;öI;R§Ý]ŸØúc»„õ¯çf=»>(¡xò–W×?¤dôÐC²Â5´îGòi¤çGÞÓÅÔ ‹HEn9_ VÐÂÅàOq»¸[ܳò¹æ~(›uuh9Jo^Ý…Òkõ†_§ôÊ›a/(½Y{T¥×+Ô ƒÏ튶ûøzÿľcÎ¥,-Û>vfdß9µŸ†U¶òì绳hŠã …§"Hô —T9²‰\ ÙEx²‘ÔÂR¯0'ƒN¨òð²˜áinœ€ ˜@Ž‘cäÛáVÇ­Ž[%Âa‰pÇæŽÍ›Ë»/ï¾¼»Ï‡>ú|`+«Ò)sI.É•Îc;ØÉƒNæïÀçT™÷ÈB.™Lº¡\©ê:™· õ‘†@8á<µ£”¡ü(þ®ÝO£úbθ‚5úóx™ŒÇÙ”2ÿeš¬U“¸T\*.å‹ðEø"犜+r®ˆ£¿£¿£ÿp«áVíúlé³¥ÏCWCWC×m·mܶ‘8â`µÆjÕõ%õ%õ%ÓÓÓÝlÝlÝllÃ6lÃìÀŽ?ñS0WÏBÅ…ØbÃTYDWÑUtõªêUÕ«ê0Ó0Ó0Sh~h~h¾°FX#¬Ùç¶ÏmŸÛÒEK-]”~,ýXú1iý*½J¯ÒA#¤’Ó?#¶d餆! aLÙñˆG<EGÑQßücv³Xb„!Fx!¼^( …B!©EÓhÄ ÆRÛ^Fæw\M¯ð ¯˜Ú z¢'z¾Ü÷rßË}š·š·š·EÇ_t|€G€W€W\‡ûÝî÷ÎWç5Ì‹ŽÙ"h:VÌ-üá¸x8ηyå[씃siÏiN6õ£ªÜóY^£LÙh·n –«WpÕá\w@™ÉïhCÚ ÝÅ¢@ûˆåšÄ½~Ë%7ÊyŸð*;-ø™ÿû9ó.$ßOýÐ÷ôð[_ôÏÜ“;Mï`Ì?>K[¸aÛT,å’w´ VCoˆ­¨ZìOÇ!JtA8Dx¢Á/ÎðŸaó¼EC+ª¢*ªââ¸8..¥BJ…” #;òî€i¦ ˜ÖnA»íôéÔ§SŸN¾±¾±¾± ·/ܾp{ŠmŠmŠ-§àœBô=D)R.`•ùKóÙqç@@è,\Aæ!)¹L%„RÀ8ª èOVn|ÎÑá'Í5« 9\Ñ$‹Ña²ã.ó‡Âß˸ŒËB9¡œPŽã8Žãö&îMÜ›¨‰ÖDk¢¿übð‹ùòäçÔÍ©›S÷ð¹Ã石ªcUÇªŽ¶³¶³¶s^ï¼Þy½ FŒ(!y+¶bëŸøž™k(@€À-ç–sËÅâqs,o°¼ÁòÏ<ðÌsƒçÏ ï_¾ùþåšÁk¯¼?lØþ0Ú—ö¥}¹º\]®®ØFl#¶‘4+þ½’Ó¦Þ°k°5P5Ð}Ð+±+¿ùÑ•Œd$³M±·Ø[ìMëÑz´™H&’‰˜‚)˜‚UX…Up†3œeÇ]æwcY´Êêp†`†°yàé”§“žNÒLÒLÑLq*å¤sÒùg—4—Œ¿àAäƒK¸.& =«ëxô¬Q¿|ÛbœßÇ¢ì–VÊ÷,\'À¶¸«c5«@Û]ÊÒxg.,è;Êü5® ÞB3ÀxC(¤£Ÿoþéñ‘7Ssvžok_Ö½ž÷è~rxBû7£²ž'–z½îS €Î_¼oI9Šxà::‘Τ09…X\Eº˜@=é$s ¡%-Á0";þO~¹ø;sËØk-ú7‹Ä b·óá|ŒÁÆ`cðb,Æb<}ûjëâ­‹·.Öþ ýAûCߦ}[ôm1jë¨%£–änÈ+“WænüÝõw׫ÆYU²ªd¾œÝ=»;í3̘ˆ»¸‹õØŽíð‡?>÷µüIE*Rwå»=3—½1£1{Ì`.»ö‰ö‰öIÿ…ýö_ØòbË‹-/j'k'k'_Ûum×µ]‹ú/꿨Ò¶¤mIÛ$±ÂOø„O¢è#ú|¡ªþó’S–ÝÎþ;;’ÿ•Ëó°˜=³¹å«Üáw¤#éä¹An(*****bV`…¹±¹±¹ñ_d”Z$°‰µÄZb-aš0M˜Æoâ7ñ›¸¹¹Åâ@q Tw÷ wŒ–ùýXºï]Ñ]ñ¾Ãw¦Á¦s¦s÷nß;uïÔw{ì=ræÜXŸØi~ºït¸Óü[n›SmqEÊQÕ odº¹2 hÄJLX (îxÂ%ä¸åt)p~yêcxöû›=žtO¯sŠ»ð:ðòŽû§ÞÜ͹¬«d,’µ Ψ•ÞÕ6à’U8Âypç¸f¢‹¸ŒVKÑZÓ±i>šàG3h¾$D¡0é>ÝŽåú¡ (Äâ ñë÷LH 8ÔôPÓCMß5×ü]óQ¥G•UºÔ¶RÛJm›7gÞœys–·YÞfy›ƒÜAî ÇDl‰ q!.ôýD?Ióû/rÙÊÿËŠ¯ !Np‚“t¯¿‹»¸+×*ü_ü¶O?Ç¢rFß™¡€F`4­ˆ©t…ÒÄ¿æìBÕ÷TÀe ÓÐT£ÀcùZø›Ã.6&¥w ×pM8'œÎ!øÏO/åÑŽ GÙžÕ?¬þaõv'ívÙíjŸØ>°}à˜1#mGÚ®Þ¿rØÊaîP|P$«ß×}_—^+ŠTB¥/Nʦø§ä)yJÔDMÔĉ8'Ö´\Šs_À\`ot3ÝL7ã<.ã2mECi(±ã&p¸Xî÷ àÁ ˆ ăâÁÒõJ×(]#:<:":¢r‰Ê¾•}uDGtdKç-·t^•¸*qUb®6W›«å½x/ÞKl'¶ÛÑö´=mû¸ûÒ s©ma [R„!’¾8½B¯Ð+ҔǜKK~ŒÇxŒçxŽçR´˜= ýsثؙ‡Ð!téFº‘nL¬S¸(\.âáз>T™NË?’„$!Iðü?n·ÛÆã‡ñä{GqGqùâ–ù&/æ>îÀìà=øÇüc¡²PJ(õÖø¾åû–.]Ï9¦ò%áÞ³q€íUÒi},ªà št¯ö³gi“®Ny8ú}ðãö¯ÛfNz°àÅé´2WË?øø¶/€RìÞ ÀŸ×AJ˜Ç÷äÒÉwbwñÚŠöt]*N¶‹f(°7%ý O0yßÑÑtDñ޼#ïxoÿ½ý÷öpá>Â}Bâ„Ä ‰UGTQuĘmc¶ÙæñÊã•Ç«u3ÖÍX7C¿Z¿Z¿šÓq:N' ‰…¤Ât˾2ÿM,]vrúߊ2ÿ•à “C¤%Ûþž {Sù5¥ÓWô¸k.>9·Ëº‚*“t}µ¦ôIŸqÒñ*r”t•íö«üZqªºŠºŠZšÊÿÅ©Ʀކzêm¨}¸öáÚ‡+¬¬°²ÂÊÒçKŸ/}¾ôöÒÛKo/yïÿÿø–ó-ç[Îó–ç-Ï[^Á^Á^Á“<&yL*2¹Èä"“Ýuî:wËV—­.[]¾sùÎå;çùÎóçÛ³f?ÌÑÖÑÖÑÖ¶ŠmÛ*¶JÛS¶§fŸnœn¼Ÿ’ñ*ãÕE!­pZáXë{3îÍ8\á®î®®kíÑá£Ã•­f…YÕÆªªUUIðO£-iy½åõcùÇ /ü`þƒfì‹Ø±/"Ü!Ü!ÜáðMYFÖ“‘ŒdâGüˆI$‰$‘kÎ5çšsk¹µÜZ¾/ß—ï«´RZ)­ª~¨ú¡ê‡°eaË–9ò޼#ÿóïý›ä Î@*Bµ9nsÜæxÍ‹5/Ö¼X][][]«>¦>¦–Šä°K±TžÆdþX¸8~*?-…ºÁ[Ãj‡ÕNczhÌ»ÑÆ )(};VØlJ¸™¢ï“_y?ó@›ž½6Ž-{´|ãÍ]­©Ýqíà_8éIŒGIn0yJŠ“C¤ n’¼Á,<ÀfôEsÔF©o¬ÔÚR®€í¸CîÉÕ³Ùh³Ñfãè¬ÑY£³®ë®ë®ën_½}õöÕù׿_›ÍÅ×Å×ÅW²öCî!÷PZeµ<³Ì‹ŽÔ B§Ð©­ÕÖjkÅ4Å4Å4„#áŸ/’ÿQGáo„/"ît&.âvú´\·Þ‚tUÓ¹ðÀåH~—k[Ϊ–r±ô‚ñ¨ÒøA6ã¿5%ý•¦&È"»"Dˆ…‚  R|R|R|ÂP ÅPjGí¨TõOÒt Ôý”ÅqË¡ÊÑEt]Ä2A™"»äd³=ÞÔ›zKY×303̽…ŽBdzÎ8; p×w¡ß…zÎöMöMvpq†3Ô] {S§KN—B&ÝRtKAM!FˆÉqÊ^—½.«wVï¬ÞYáYáYáYϳžg=ÏÐeè2t¦Û¦Û¦ÛÁ c¾1ߘ¯Ÿ¡Ÿ¡ŸQ@ H1&š*˜*dÕN>ºÈaßš¾5ËŽ¨P©B¥‚ÝBI¡dÝ”º'ëžlԢẆëŒ9i•Ó*Û|ìÚ±kK«.õYêóîÔ»SïN)++“3ä 9à jñOñ”Àà°¥ü"~¿ˆÌ!sÈ®/×—ëKê“ú¤>?‘ŸÈOÄlÁE!E!E!®W«Æ/æó‹¹;ÜîŸÂ§ð)Ün 7…/Ï—çËó­ùÖ|k–¯X§X§XG¦‘idoÇÛñvü%þ‰œ$'ÉI…›ÂMá†Øˆ Q!*DêNÝ©{Éå%——\~³ï;7û~óãöžáÛÖ k…µB¤)Dò>¼ï£èªèªøŒ((!OW2ðô….肘„IêšQšQÚzŠ2Jë”~h¨|deB'€S[uRÜj?iʎöæ(Cû‚µÿ¸wìÇR¾174%u‰ y,–¥ëieñ´ø–¾—Ò’ô~ª0£8D”ûfÍd)W`;ØÑ DƒØL•W?¯~^ý¹˜‹¹xazazaêW±_Å~ë¬7²ÞH÷ŸÜrÿiNðœà9Á8>p$ÕIuRUQUéuz^—Shþ«0Í?øÁ­u999[ϲže=ËXÍXÍXí*w•»Ê‰§ÅÓâi©wõ;¼Ã;Ùx?çËT™•¸EŸ°é!óA¿±Žø^¼F1 óð”ËUâvÚÖW ŠÚ€ãABàäÿ›§!-´ÐÒ­t+ÝŠ–h‰–ß°dùÎY:GMÔDMÞÌ›ysΊœ9+ÞÌx3ãÍ eaeaeaÅ{Å{Å{©¹çÀ9ðn¼ïƲ¨¼‚Wð\O®'ד9å ?…ŸÂ4"H#ržœ'ç0 £0ŠoÎ7盫.Xm¶ÚüqÞÇ 7|ÚøqüÇñE‹Šò>š~2ý”לïÈw´ R´U´­WyråÉü,M’&‰_ÍÝänr¸ Ü~ ?È_ä/òÉmr›Ü633ÓMÔMÔMÔŸÑŸÑŸÑM×M×MÏ“ÿ&ÿžÚÚ¥Ù¸÷áž—wÍk5¯UI ¡!TwLg g¹QoÔç6mÙ´å€Û¡c‡ŽÙÖ¶¥¶4¨^P½ zdÙEv‘¤©Á_ç¯ó×ÙÒ°â¨â¨â(ú¢/ú*((¤.Œ¼ oÃÛp˸eÜ2¾=ßžob(†b, ‰Þ£÷è=–AK÷Ò½t/“W£…iaZ˜YRR‰& ’:Í,À:˜¦ƒ¡)¤6j£6ÓÀ!óÈ<2õåjr5¹šÒwÍú~»X§ «…ÕÂjq”8J¥¬®¬®¬Î¹p.œ‹d76ªedþPÄLq 8oÏÍ'Ógܹ}çá¥53¢Â'×êÓ—oŠÁ0m,vDLPÑ#æ¶Æñ¼/טì¡?! ôí.<ŸÐhŒÀô)8px›ÿáz~ I/,ÕP´>­O듲¤,)‹J¨„J»•»•»•o›½mö¶Ùð›Ão¿YfV™YefÍ žÓnŸ?m×´]Åžø˜}Ì+µ•ÚÊ®¡]C»†ZƒÖ 5XŸ´>i}Rs[s[s[Í–»¨»¨»¨#Õ‘êHMMM—Ö.­]Z[ÕV×S×+ÛÆo¥ßJúɽ¯{ßצá¦ádº$©N(†+†g]ÿ4üÓð3Ï|wæ;{—.=H#Ò€4ö{„=’¼c- "‰HhWÚ•v•¶ïÒ»ô®¡Œ¡Œ¡ ©HEñ°xX¤…ÝÂna·XX,,¦hÚÁÔÔÔÔÔ”Ëãò¸¼’×J^+yå|h 4é›bYõß.ìý3' šFÓhq®8WœË4¡¹Î\g®³”eë8ÈÓ˜Ì|[( GèÒƒûŽËM‹HÞ‘|ñü¡v×§ôž¾ Ǹ·âz±í£àû? 7…åÂxÜÄø¢á8à%¶HúÇéXÄøï‹Ž³+÷!}H²÷š{ͽ¾áyÃó†çÐjC« ­6*yTò¨äÚûkﯽtÑuF×)¹«ä®’»–` –Ààjp5¸’4’FÒhiZš––t´˜f—\ùgÀ,ÌC}Ð}ò&æMÌ›¨ñÒxi¼¤™v&`6a6É©2¿2÷XÍ9ô¼ØóÂúE“u¹n,=¹R—`jž=°÷… [ê5¬´£ˆãl9[ìWa*%ÇŽ?FtŽèѹÇêó{ã÷ÆO’™#“È$2é/8¢DA8‰“8‰±?MÐM$gý·´gú5–bÃ6‡wÜuptÙi§¦ê½v²ýdûnÓNM;Uíj$"Ç)•!ÊeˆS¢S¢S¢çJÏ•ž+Ë®,»²ìÊ*[«l­²5|DÄÔˆ©‘q æ7˜?+oÕ:«¤Â”Rz½½ÉÓä™àL)¥Ç¼+÷®\‘†î­Ý[­YtEÑ®fW³«Ù¥¸Kq—âNGœŽ8q¬áXñ†]s»ævÍm›Ú6µmª%Z¢%špM¸&\yOyOyOéªtUº’’@¾ÈÑ”ùOˆÄ?9H’ƒAƒ6m   s:étÒé¤ôW[bKleƒÉüÁØÂ޼ ׋Ì!Ö$’4h¶¢Ž™†¯Ï ¶Ž»6c”ý™²KÝ;ùd²‡‘^ÅòÔe¤‹Ób½W 5ÔÜDn"7‘íP…ªBU¡ÑÚhm´öêOWºúÓmÇÛŽ·c´1Ú­g5ÏjžÕØ‘œgÅY¡j¡–t6ËæP2ì÷Õ­ÑZ2s¾_§Ú”jSªM©#Ôê‡9ba;ɉ—ù¾L•ù —? ŸeN×iôéâ+q}A¶sµ‰x2$[Tôç˜öëpÒeHPÈéa¿L RÂ6i8 §á†µ†µ†µb¼/Æ›{š{š{Jš©ˆ|‹—¢E ê¢.êJÏÊŸð Ÿèmz›Þ–dõX<ƒ‰²=ì >ð4i²3³¿Z–(±jtËÊôÁô2½Œ ”Gùç7.ݸ¬¤°§ô"ê@¢IÒp×ñ#öc?ñ'þÄ_êZ¥QšŽ§ãéxSSSƒ ÿ ÿ ÿ d ã—>ûr?8h5ë»sßÃiGñ<® mAÛÔ^œ>8}h“¼;y7€ÝØ ú¡ŸôÚFh„F¿jÕÓ8Ó¨ˆŠ¨(í)Ò(-å².ŒLB‹ÉG²E^¦™À"Fz‹Ölˆý•Y’ q²%K–ôÂŽaçaçdŬL»m³V2íÑí¿øÞ¿E^à^ : mGÛÑvÂUáªp•kÈ5äZ+bEp §pŠ5®g©Dß|‚Ì×C.2‘) y´mFaLBôó³)µr_æ‰wÔo´í­ Ï+4QmË_抒×f^à(*ÙtÿÀRj“iÀO§‰ÓÈJ²’¬4¾0¾0¾X|yñåÅ—?Mù4åÓ”Á=‚{×Pk@­EBŠ„ ™ÿiþ§ùŸn”»QîF9n·‹Û%®׊k1ã1^ºCýwúfü}¾¯›¸‰›l½]¨,T*§M;švÔç‚ÏŸ n…Ü ¹bõfh€hÀzxËß¿b>¢ =‰Ú)¬~R~Èy;AÙÉÃppr³.ã)W·ïwKTQ3B¾ƒÖ°VNæîpÎPÈ‹¿‚eT€5ƒD YgÐ/2hå:÷$È7Vx*<ñÊ]Ê]ŠîÊñÊñŠtå.å.n=߀ÿÜǯ¼þÑ‚›a¹$ç ox³¥:HI ÙKö’½\%®W‰[Å­âVqfNàUœê˜ê× ™u}vÈì—./«¼¬ÒÔܬd³’؈s8§´R ø’¤q&ÎÄYrŽ™ÖëðwÇq{±{1ó1Ÿõ”R‰˜£\UQUЏ[*²Ëü{¨ ‚JZ ”‹)S.&lWØ®°]ucëÆÖU?P?P?®Ê¡Š¡²Ùdþ`z¢‚° Ѩ«XÁ¿áÞ>{¾Ý¦û$J¯åtÈñ>V|`aç<û‘šÏ‰¨û1 ­d³ýóëZÚ¾‡{¸ÇÔÜÙŽÛkl¯±}—ë.×]®wZÝiu§Õ釧ž~Øò~Ëû-?‡Ì¶c;¶“Cb¾8³|wþc±HFrŽvŽvŽ+V*¬THóæ!Í•qÊ8e“?Æ8ŒÃ8Ù`ÿŠ^¨üy9ÞÊ–¿Ïe'{Œ¹Ôþ…iÒž]U”ΙÜûÓú¹-Ô’ÜM¾é‚×è‰Ðÿ£-#ó—†Áà%•äY[fÍ›5ï¥× Ó SÓȦM%Ýz>•OåSe[}BBØc[Åë¯W¼¶$lIØ’:Öu¬ëXkkkK‡ŽÆhŒ–-&ó§ŒÃ7d âÙö¹ÑKÜÛ= ôZ§§MµÏ$ ¹[':ˆx·‘Ž­Å[Œ“ù¶°¬Ž·…ÐC0©Ä¸a<6b£×—Û||ÅÐCô=Äb?yyyL¸"·GnÜ‚I0 ŸgeI2™?æ Æá>¡"J¡ØÓ…ï¹õ ÐS´šb¥²²Ô2O'çDiâÉ$ÇÈP9öû/0Àƒ4KÆ` ¦Õh5ZëÇõãú½_ÿ~ýûõÑk¢×D¯Ùua×…]ø| ¾F¯1½Æô³Èq‘ã"Ç¢AEƒŠ‰!bˆ"iLUFeT¶,•Íü±;±“µ8R…T!5£kF׌®L|¢ÐÜBs Íe©¶’~ZY”EYÙl–|¹ì®‡ù³(õ åð}Þ “^˜Gn[d@'Ór¶U­Æ¨l””M”MLÏMS.é‚N(#g¹ÿ ,s‘e¾],s+s‘…,ä"R?¾4|À|À+¼’X¿j\á W¶ù´îÓºOëþê‘Û°ísɾŒÌ†"4°‚÷ðo-{U/½6nŠGÐÕS¹Õþf>Ùè†a°&fLÄ •q@6Þ¿Àr–V@…¸B\!®`î»>X¬fðÏMÏMÏM 80à@¨c¨c¨c±êŪ«>õÕÔWS_Åuëו“`Ì’i"M¤‰RèM¾›ÿ{°ïe–a‚„ T·T·T·bÚbÚbZgƒ³ÁÙ`uÕêªÕUƒÑ`4Ù1R‚±¬¸àÿFÜ `þœ{$æS:07Îäc&ä%y‚U€ø=½oóÌj‡²–F£ÈâïC@”GIÙ”222ß –Õ+°+ðð·q·™ä¨ôWùLæ¿ÂýÓIK’O¡ÚãÌ|Gn¡×p7XoÀìÇ5òi WÙmù0'¥[pàÀ1÷WpWÈò†¼Ù£Ü£Ü£56jlÔsëçÖÏ­½Ô^j/õœ¡s†ÎÚ¤e“–MZ²þÌe'uHRGrÙ劣ÿä{9€8€;¸ƒ;yûóöçíÏqÎqÎq¶ZgµÎjË3—g.ÏÀÔ!X5 ì²[ðsÇ]Џ‹Ó¨ír̆@óX”&É&€.£é6»TNÊ=êaÊþŠ0BEKRÞ²)edd¾,™ú¡úI=zÙ²øk¼Æké¯ò CæÏãR¡g†/B>Lϲ6äë7 •¡ yôT‘¬B³¬s•Û·ùqæBGÚ¹8‰²Ù~7,Ñ…°Ö@ Ô ãè8:Ž·çíyû[Ú[Ú[Úh·h·h·saçÂÎ…:^èx¡ãcŒ=2öȈ A#‚4³4³4³èyzžžçZq­¸V’"CÎÃþ½0.&ûøðèSú§ôOé¤'éIzºs;çvNZ¿ŽCâ$y9Œàÿ:î:˜þq3 Z"ûƒ¾´Ñ"¡ä,ôâV*j;©v)BÔË%yiÈ’( ¸lJ™ßÁfz¯a-”º†#æÇ¯'¦.Ì_ P'ñ„ko'+›â^ó‹ôtì…pÌÄS®;)LŽÊfû7aÒ·,O}+¶b«@*Pb bøÐîC»í&ÔœPsBÍØŸbŠý‰×òZ^ÛþUûWí_M³Ÿf?ÍÞ-Ê-Ê-JÜ#î÷pW¹«ÜU„ !R*¬œÿÛa‚Å,Pò Ÿð)£KF—Œ.= zô°vµvµvµµ³µ³µ“’d6`6ÈaÆÿ¸›`Æ,¸PASÙþzã>pĈ‹âlz–zY¯VVàP_VÜâI¯jŒ’¤ˆlJ™ßÝŒ“H„:˜rkéjš:½ZýÑ.w@f‘ê…Ùå¨=Š®+4ßæTP€;r£ä¨ã„eoTL0Q+jE­H+ÒŠ´*8Vp¬àØÜs7ÎÝ87enÊÜ”ÌR™¥2K…ÏŸ>~™ùeæ—)ç_οœ¿è#úˆ>\—À%Hò¾rëïe"&b":£3:ë6ë6ë6§¿M›þV[ -и–q-ãZ†uO—JT™Läßž/‡W>Œ0‘Ñ¡0 díÔ¿3:¡菱($[.G£QV™4‹¬¼¬À¥Q!p‡£šmÏJž•<+ù¥ÝK»—vM÷5Ý×tŸtL2ŸÌ'˶’‘‘ùUÀ»rȆ´Õ¾œXÜ;cÖ‘éƒ:Rz}ôˆÒç›.=С…敺‡j±ô*.`Â7ðéXÓÂ(ŒÂߨ÷ò³D—Ÿg¾4OožÞ<ýTî©ÜS¹wwßÝ}w÷övÛÛmoWíSµOÕ>I_/sß™: ÃÖ°–þÏ®‚hD#¥P ¥ôz}XdXdXdò5Ê×(¯HR$)’$—¥Íü×1þ¯ªŒfl…/TlGNrΦÜÞÊëB®à¦ô5Ñ—ã ™‚«9Ò8B—·×yêØÆû"¶m,f¯>«šÈŸ7ßîÓ’¨ˆ^ˆå<È*dà(æ 9*¢$\äH¼ŒŒŒŒŒŒÄg´&ã#2 {ž²4§jš}v‰‚âáì%î`³Ý¶¿¦”R+(@H'ö•÷Na~î<ÌÃ<4Gs4Ç5\Ã5É•ÿú±LýUB ¥´c –` ÙAvû÷;ïwž0j¨ £^||ññÅÇc€1À8Ý}ºût÷–}[ömÙ—¢…h!A!ÍH3Ò ùÈG¾d9…æÿ_ÏñÏññ8wHîÜ!¹çsÏçžWUUumëÚÖµ­T“° «°JV˜ùòŠ{Ưå×³íª¡õõ ÜŸ-¦”Òkùb'j}ó¥”Þ«H©¸ŠÒ^ã@éÅÀ¡WÎô[<²uÙŽ‡#šÔRQ:s›¾8çxòŠæÔdÞI–Á[lËÈ|#Èw™?Œ™Œ&\i²︅Ü|ní…JKf¶DéÙ#ï˜ìÎýíçSÈ=ÑNê²B¶“º8ý•~–Þ–¨ Á7鶪¡–jÿÀi¸ ÜNZ÷ð8æqÌãØ¢‹,Zp{ýíõ·×_ñ¹âsÅ'úVô­è[êåêåêåìH&1ù…¼ÜȉÁlò#~Äl‡waïÂÞ…ªªªË%•K*—„™˜‰™’ú{1C1ùáG‚‹ã;ñmØv•)u7Ô zá’û »È].«xZrœ!otvç[Y>E e/ŽéCé¥ä¡Ý(½î?ò%¥Ë s}ÐjÝ­N ûžlº!ð£]aí*ËóózŽ’³Ä·0Fºx­ ”s¿d¾dÇ]FFæE1˜ïD¤(ïæ ž7ªNu×oŽò¢ôJ½á=ëM ²*žÈþJÎ’æ¸ôÕ}MB¢ÐmѶìݲwËÞ ©èRÑ¥¢‹ÔÚŒe~³´‡o+ó›Xü°)$…¤°mu :P8rËÈ-#·\_}ýõõ·zßê}«wŒsŒsŒsQSQSQ;’[Î-ç–#üâÌ2™ÈD&{˜±kcׯ®Mí굫׮º,tYè2ëÝÖ»­wK~wpwþžFú¥ìóåbž¸Ÿmf+©îßѺÌl1À³BóÅŠáÃË«4rýÕòѧúL™{eìËì‡×‰º<ÀxÙ\ ›éÁÀÝþùn7WDŒù®þ´Û7V/iÿxTïïÆ•òéâ`)¨EBëÑ<ciGTø‰ó%ëEŒ:Ò{P~õ™ñ–—™7¼áÖhÖR/ùR”‘‘‘‘ù-¨ O·S f£JÃïéÇ‹r;Cc¾&¾Áq¨áܳԻ¢ZéxL¾º»‹3œáŒ7xƒ7$ä‘<;G;G;G»1vcìÆ8´uhëÐV=S=S=p°[°Ej]ô­Ü+-Ó3l`êFݨ131ëãõñúøùæwšßinݹuçÖÍ—5.k\ͨšQ5£–6\ÚpiÃJÉ•’+%‹Äâ&=)¥Ð°3³èûßÓs`Ÿº!¢!{ðË É É É©˜S1§¢uyëòÖå‹:u.*‰on![ÈÔB-Ô’Îð·‘àü¥¹ ô-Û,8ažgNÍu20"‘œÈ¥Ü ’À©»Œ6Û¦¿÷¾ãˆ„M7^ü8eal»—{âº=ÿ)7SwÓs€ˆK÷š_(rêògSc’Úœq«×›ê‡Š¯pk`»‚n§ôhgØòãy-ׄ´ƒ ÔŸó쿺t!`—Ù À´C;´ÃnìÆnR˜&…„ IÇÈz®2222ÿ–NL{´G{lÂ&lb7ï_8æ[Ä3Ú•ÎÂ1<@’^WLIÊCß ³D%²ªdŒÇAÇd´F=”…#laõÕeø²Ì&h‚&ô(=Jš™™ ±B¬ -´Ð–r)åRÊEå§òSù¡Z¡vav}cº+ìÝæ!y’ˆ¤‚*¨B Åo"›È¦½^{½öz<~ðøÁO O O Þ7¼oxߘSkN­9µZµoÕ¾U{z‡Þ¡wèz€ ÉErÑR˜òow¥3«ÞÀ ÜÀLÁq¤8R™^:½tziÑ™ö¤=Ý v)ìÂRtRt¢‹è"ºq¥9ào#Jþ ƒƒN¦gp(¡ÈÕª˜ò3>ì0¸¢çO~‚o:Ç’€IDATHK‡;ÊÅ\ô;÷›§¤]ÍtÈ>^çþÃìKÃU:=s5o³áE›Ë¦#R¿×]É[_`œ*¹Ñ«¿SÓñ•{”¬ÖùÞª5¯;n[ôbp³ÚkK7÷rpÚG#éqÔtâ!˵%W‰‚l&¡8޵ƒúp„í?2ÌþW“4»œ<á O¬Æj¬Ær,ÇrÌÆlÌæ›ðMø&ô}FŸI‹8npƒ›¬p/###ó»a~»WC5TÃvlÇv&‡D$"ÇqÇ1Ó1]Ñ]DHn=ËšýFrˆé#¸ÑÁlûî»Dsr+c!“Ƽ m𺴿ç‡سxˆÓ¸ƒ÷PBñU=®°ïkakP·ÊÝ*w«Ü{ïý½÷†Ö†Ö†Ö…  ð/ð/ð/àžpO¸'hƒ6hƒ^è…^ßXôÁîï|øðáãkE׊®¥®§®§®GkÑZ´I$‰$QÒáQB å߉·üÆÙõ[…Q˜Œ$=IÏ´"ii¹¦ì®Ù]‰›ÙÖlk5š[Æ-³ª¨®®ì¢¼ª¼ æöWDETü»Î–nØ€)l[QS¡Px¿Úí|d{j˜Ù«ç÷â€)}º¾zÔ<:µm%b@cðšcšýšvULÁæÊoê «w LQu\õœZ•«Î«¦«qí»á =+-Üþý°úôËN lEéµ #}(½1\Kéµ*#®çÅ¿7påš»£§†k‡–¿UôñÏßß“[DÆgÜÃgJÕŸœo9˜Š£8Šãná–å!Vj+µ•ºdvÉì’ÙoU¼UñV‰‰%&–˜¨Ø Ø Ø ‰±[ŽÌ_9Ç]Fæ¿„…˜ ²™²™²™Í>›}6ûX¸ä_¼¶?ú£¿¤Dq Çp =Ñ=á W¸JÇ|=nâXtFuð €¶¹º¹rBÊ”åúÙSz}ìÈŽ¯FÇöêÑEÙSQŽK@ |á†iè…šßÊ×èèëèëè[³mͶ5ÛFh#´Ú²/˾,û’Kæ’¹äX`,Æ~ußËoÇò=sàÀI͘Z…V¡U =<új端v¾e¼e¼e\T°¨`QA±ÖÅZk-½´ W†+#UÆ_IžYÉòä%^â%÷{È=D2’ñ ÷ÍÊîÁ݃clÏÞž³tûàíƒGøOí>µ»uŠf§f'W¸Jk S&! Õ¹>ÄÇ››·^^»¥s\{o1û!²«ÿûGßh¯°º©˜Áo–¦T“2Ny¾‚_ÛòiÊð¹a)õbêª;<¨^•µ5¬ §!EëVœ[âJ¡‰k‹ŽQE”Ê:xäxÿe”^ÕXLé¿á“(½>~ä輩' RÙ='´Ùýˆ6•;­j¬˜Èí·|ƒ|n1™ŒöG´PCñ;ñ–Iô@&%]T͹æ\ó¢3ŠÎ(:£jNÕœª9a1a1a1õ¦×›^ozC·†n Ý´3µ3µ3ÑÑßã{|/7_ø+!;î22"ìÖÞMÐÕQÕµe´e´eB6†l Ù\%´Jh•ÐróËÍ/7¿Ø°bÊ ³5ÛšmÍ*NÅ©8Ò—ô%}õü×q×a‚ &,À,@T@©\RTÿƒHg;ÔC)6yðÓ¸g\é»ëÖ ]RzmÙˆÁiΓûå—íä“àº@2R&™ ÝWú 2ë±ugx†gl·³à,8 µ¬jYÕ²ŠèÑ3¢g鿥›—nNj’𤦤ÜÂä#-G·8z-îød2™L&[Ò2¦eL˘ÓÞ§½O{ÇyÅyÅyí*»«ì®²Õ Õ Õ ’ {q½¸^8ÓÿPb#óÛ…]_lì#>â#¯âUü/|"Û~¶ýlûÕ}\ou½ÕsZμ0óÂéG·nܺñh¥”¾zD)¥«û*rª_FzI Y}Åßa‚ü¥ÄY8Žkü÷ä6×K ¡µÄ¬ŒÅº—úËÀÙˆTE[Ù½T â+¯p±ÜNàÂt“ÒTÁTç¡æ¡ú‘ʉ¿ƒÿÊÂN…gvrhã©k?  ŽÿÞLJ?Ý3ŽñÔ´ù¶;NÞyÕÿe³ªå‚[M­3»dá"ë‹ì´O´žh=B¥ŒBèd_§¨VÕ.û\8ç}7ïíÙ-ØÞ¿µ·ÅÅϘ; Ñ¢´&@ž“¾¸x¼BF_á;ÜA"R f¿1MÅrY–9ÜePe$ù!€ãHÇ‘Ž#}xÞ‡·³³£;èºCd?ÅâGCˆ!äÿ±÷•áQ%[׫N{:îNÜ=„xw'¸Ëàî0h`ðÁÝ]†ÁÝœÁ! !$„„qïîú~œÃ¼Í73÷½÷½wæ"Yý<<‡Nõ‘:%»v­½vM°©©©©©é›SoN½9ÅñÝ57ëõGëQzÔãÏÀŽs0sX“Úâ•Å+‹W:÷tîéÜS.U.U.ú ý…þÚT›jS£=F{Œö !©{_÷¾î}é«ÒW¥¯Ê­Ë­Ë­+T©ô¡Ïñn/á.!©HýKž:%¨AH¡R­W·SÏxQüîyéÿ~C7ê5“š‰Ú»ß·³1ÒKæ¥3y„MÌÉ!¡„~~s K aë*$¦Ä”˜ò y…¼”ñ)ãSÆ{†z†z†Z&Z&Z&ª©©¥–§–§–s{#ÐpGqô ›7Ùûdg|!„ÒYtÅñ×ëP‡º£’£’£’ìUÙ«²WÜ;rïȽîsÝçºÏm3Ûf¶ÍzóõæëÍn9ºåèlÁl!?‘ŸÈOtDqWùœë„]´°5РЉ4 H¶‡Ò™t&ÉE‰‚DA¢ïß ¾‚öí Úd=ȺŸu?ÑZ~~ƒšÒÆÒÆô!öc?Ù d&a~Â(ŒBOß°æ=dÔ 8Žl|À#TCP1Z¹[êKôüчxI<™i:Hwµ4¾|fÁ´âiä'âJ„ÊAÊçÊÚgkŸ­z¶´¶km—Úïl±Ýn{E=A¥Pz>s uq×m«=Arþ™ìùòMGaõò«XwëXRÒ¾.Wä.ÆCW´Qø8[üb¾MçÀ´$ö²×A²‡d\as-ÞûÑ€¬ì}ÂKc^lïx.#%¿Â±ºY/×ZŽ0·ÈFu)@íh?fC>ªQ å<©fÓgײ%(A ·î?8¡¢¢bw×î®Ý]“““^6/›—MoÓÛô6}M_Ó×¥V¥V¥VÚµ;ks2šVYVYVY¹É¹É¹ÉUáUáUᘩñ©G=êQzüFaFa&`‚ © © ©Q¨Q¨Q¨ºD]¢.¡‹ébºXuGuGu‡ÔRÃÌaæ0sX¯­(R)Š4igÒΤÉ|“ù&óY³»úLõ™ê3565656Õ†Õ†Õ†åíÊÛ•·+Í(Í(Í(“”IÊ$u§êNÕâ°³M Ä@ $H#Òˆ®¦«éjNOú0ã0r‘‹ÜËœzB”-\@kúèòr]Ö᳑O;áïå7´q4‰×΀.ZÀ„’\2;Aéçjβæ{ JPÂUÉ^ìÅÞ‚îÝ º¿p|áøÂÑu¿ë~×ýVŽVŽVŽªAªAªAiGÒŽ¤/|áË G²*4_¢Û«µ¨å¬ Ö¬œƒ9˜Ã˜3æŒùíÑ·Gß><}xúði/§½œö²ñ™ÆgŸo3Þf¼}ûþöý×;®w\ïX5¨jPÕ ^4/š­º®º®ºÎŸ|6A™ì3²Ï;ƒ1˜‰f¢™hÚ”6¥M©>Õ§úšÅmÌlÌlÌÃÃÃ===[¶l­k¥k¥kÅêɼyúæø›ãWc¯|¸ò¡ªr—r—®ÜÊËʋ٦þ^ýý‡Öù“ó'K:K—H—”÷¬˜S1‡»ú7€?]Ðf8E“ðJ¸l®VÕéBW¥§"á„]|^ æµMsý:é³ P èÒxz Ã0ÇÔÔÔÒ¦§ý˜6C5G5G5Çn¹Ýi»ÓʧªyÊ·V»­žX?ža¡/~}®ó<ô­oQ·ÙØ;X_rüÖcù°%mçûÌèù¶I¨ßeµ£¹q<ÀL'¿†= ²ÿ$§‘“;ñ=ºbð¡Æžlr«8½EvǂР?öþ™SŒ”øÒêÛ´U`Ž`/.â9·ñÆv}˜À„‹mgCNÅCÌËçåóò­ž[=·zn#²ÙˆDŽ"G‘#ͧù4ŸÝZ-—–KË¥oâÞĽ‰+˜\0¹`²3ãÌ836+mVÚ¬‰‹ÄE6I6I6I/¾ñý‹ï¹à›Ÿñ3~Æ[¼ÅÛo|j®G=êQÿ¬¯Žå¯kA Z†v†v†vÒ™Ò™Ò™$›d“ìÂ…… ¦Å¦Å¦Åj÷Ðî¡ÝC7I7I7I/P/P/P%ŒF s„9¡@( ˜AÌ føˆøˆøˆøœøœøœž³ž³ž³éÓ)¦S”•ÊJe¥z³z³zsÅòŠåËËž•=+{Vܬ¸Yq³ª‡U«ÖÚÕÚÕÚÕ™×™×™svã.ìGE[´E[´G{´ÇS<ÅS–Ài–³œÝ|ä#Å(FñŸ>û[ä¡„\aÚ“7´‘šRAòàWkrS0€ðÈPd “˜vÌšjgá$ ‘/袶0‡2ñ%Ÿõ›eÉ3ã1ãÙ%VΜ97Ø€c·õnëÝÖ7°i`ÓÀF]£®Q×¼½½á Þà GX½ŒË¸ü›ïìOÇtLg-mf³€Y79orÞäñ)ãSƧŒpá<¹sxçðÎáÝFuÕm”C ‡-æöœÛsnÏœ œ œ &Œ cÂÔ&jµ Žã8Žsuû÷˜ïšõÏR_Øeö` Æ`’D’HOçÓù¬ÈþÈ´“i'ÓN®ž®ž®ž­Ú·jߪ½÷}ïûÞ÷-[¶<ÌßËßËß›1,cXư‹ô"½Hã·Çoß~+ä–Û-·²eeåeåø B¥“DDÊù9ç真UñªxU§ñ4ž]袕ÿñÈMê‹ `@déFº‘nj]µ®Z‹°‹8ì ¦‚©¶¶¶:*t”³µ³µ³5~Äø±²¦²¦²æÆä“oLŽÏÏÏ}°êÁª«^wõ)Ì#Rªy?ºÚÏEË»U¸¹ºß6ÞÒÕ@9ýJõèÕ”&¼ïBéÍKãÚRšpo¼vFÆÁ­\–}Ñ1Òι›µ¿~ïOžëGæ49†æÿóÎNí:?{-ðZà5?ºitÓè¦ò®ò®ò®ò…ò…ò…Që£ÖG­wV9«œU¢(Q”(ê“j:ƒ38CÂ.ŒÉ.Â.Â.B>B>B>Bþ\þ\þÜËÒËÒË’+Ï& `שõúî_nï¨N­G=þ³`çVICºÐ•\\\`åÙòlyvMM ' ™‚¤pæï3<ó?í³ýxýxýħŧŧ fÌ6˜m'°Ø ¼oÆ› „B†††ÑÛ¢·EoSìPìPìPÜRÜRÜRœUœUœ±Ž±Ž±ŽiÓ(¦QTHTHTHãI'5žÔ0¹arÃd7¾ßoîfîf_{¿ö~~8?œÎ1õÿì¡u‰.ÑåÂ7gaf1cò¤Ð‚–ãÐÙÔ¤`÷ÉW#æRšp`ÜÝGs·­è+4ygÈ×NçÎpƒôGÖö–YxÁ ^¿éph0¦Á˜cäÉòdy²|¾|¾|¾­½­½­=÷S ‘ ÷«¯š’Û° Û˜&„á¢/^ox½áõý§÷ŸÞú‘Õ#«GVw\ÜqqGçé§wžþI¥ö!}Hî?ÿ)ž7kŸèBºp \ȲlàéòtyºŸìÀt`:Øm„6¾ïû¾ïû~Ë´-Ó¶L»–t-éZÒó>Ïû<ï“ð<áyÂó}ê}ê}êq‡ÇwØó çAσ#‰‘Äè“gI"I$‰¬&«ÉjÌÃ<ÌãDÙ>pXî°Üaylululµ[¼[¼ÛGJöª™ó[3ƒŒ!®ìq¸®£¯õô’ÓµzW…Ï\ÜÇ’Ò¹y03³Éî fJcrƒôüƒÎÉŠy±a=£_~5ú5|EøŠð2±L,Ë/É/É/ ƒ…ÁBi©”3sI%ÙM‚ùÃy]>5âYtxëdpJ´àV›WuäÒ€Q ¥·wŽÿ‰Ò›=Ç™Qg\AYôÙýÃãWî97êšßX§½&£¸¿ä œ»9Û8Ý‘m”!:JÑL!”—õ”õ’õ‘UÉ*e¾Y¾Y¾Yúïôßé¿ûä¬{G3òý;|‡ï ƒ 2Á5Á5ÁµÆÎ;Ë&È&È&Èle¶2[ÃÃî<»¬®Ç—;ÞÖîõ¨Ç_Vƒ àÐÞ¡½C{ùDùDùDù`ù`ù`g{g{gÎŒãHŸtKðÀCs4Gs–M¼ˆñÂ\Á•|Y–¹.=(=(=hñÞâ½Å{×V®­\[ùfûfûf'''ËÖÈÖÈÖÄèÇèÇè+¾S|§øNaþ?ÖД ” ” Œ...™25dª§ÈSä)²;fwÌî˜Q™Q™Q™T HL-SËü—ˆq2öØp‡Þ!é„»/¶ö~I—Ü.¯Ðétû‘ó|ÄNåæWHãÏx1+I- ƒ:ÐùbÞ²¦…Œ`s¡À{C{C{CÅDÅDÅDÙlÙlÙl›&6MlšpåOáNÁ†0üƒ³}‰ÐÔŠi†fhÆÉÉãý­Î[·:¿(wQî¢Ü{sî͹7çÖž[{ní‰333—ttt`K2]™®LWnÏŠÅ?oÄkºÁ/ø…$“d’L,ˆ±ø}qÓA¦ƒL±Ëéyç]œwñRÂ¥„K ‰ïß%¾KMM=™|2ùdò´–ÓZNkÙ¬¸Yq³béuéuéõ?¸x&“Éd2ºŒ.£ 8Àá“ûgïmF`œá gC:‡tɽä^r¯°õaëÃÖ   r.Qvi÷UgŸýsªL?죿b p(W¬Y^{L™®zMó#”¤Ìõ÷‰Z ûs?è WØà¶Æ[q,Û5máŽÆÆÆ>iû¤í“¶žžž¢ Q(Hë’Ö%­K¾|?ø~H™š2%eJ±VqÏâ;*µ!±&íƒ-XŒþð§¿RL<:â†ÍË‹Gq/£æù¦ZŶj;ÝçYÇêˆJÇ—¢B)_tYûŠ.‘l^‚öö|»Î­Á¥%zf>·í‰eåãt§Âi仪å5YJž$\ôš¨ÊU®³õ2ýþësÙ²›d÷¤Õ´ŠVqÓ k²ÛÀ6܆Û¤â b`A]T]T]TæÎÌ™;]O»žv=ÍÖ@Ïž <‹÷ï/Þ¯NU§ªSÙhk.°©õ¨G=¾M°3;®žÇyœg˜&À¤Ø¤Ø¤5¨Aržržr^ÎΜ9;¹’¬æ·&e‚ÝÊ?û?ŽIÁRYqI6ä‘õÉ=ÆcÓ™þËô_²ŽfÍ:Úýp÷ÃÝwéÓ5Æú¦õMë›ËN,;±ìDVÛ¬¶Ym™nL7¦›šª©šrûQ¿gÀ³×bÍâ:Ô¡Žè¢Ãôbz1½TmTmTm4YH¼¼¼~3üføÍm”m”m hÐ2 ¥gµgµg5ÝQl_l_lÿ ûAöƒìóÖç­Ï[?==½Îÿ:ŸSgb‘ld“•d%YIÇÐ1tŒ:TªE)JQú‰»&Ý…ÝOKCÒ*¶Tl©ØRìQìQìaÐÝ »AwãÓÆ§OçTçTçT³­ˆ]}­CæŸî¶t6¶ C ÌžXúºüaUMRYN~¼^Ÿ‘wÓZ†BWC)diPú?o[óÍ¡Elˆ 1!&ĤäDɉ’Ig“Î&õL÷L÷L×þ ýAûƒh½h½h½÷{ï\ïÜg›žmz¶©`HÁ‚!ä$aÈ šM“h ž!˜J&”´V?W¥ú×ü“ÜÞ…]CÞa‘ÃãócL:·ö?Ù$!ø…íwVN¦ÃtVÍ0<©e÷šíòðïp>ªsÝÒë“s?l>U÷`à‡ÕçßÖz9+%ñÙÅÔ@œÆ6t$OHÜ"«È34¢è*h¡P~²ŽÓÈšÆN9„A”Ó)§SN'óÕæ«ÍWëõ×ë¯×_¿P¿P¿Ðd“É&“M¹Wr¯ä^á,6œâëàc±™ÞØi•MYe kX³mÈB²¸çeCµ~ßNêQz|k`Gvb–B ©±—±—±—ÄTb*1eÍ‹’ö%íKÚ—{—{—{s lÎÔfô`õ^Nj|XhzÙ”L¬á4LÃ4âJ\‰+íL;ÓÎÕøŸæ–=΄3á‚A @ï©ÞS½§úûô÷éïÓrÔrÔrˆ ÄÂa‚0ApGpGp‡WË«åÕjùiùiùi¹h¹h¹è¯×_¯¿^¨¾§¾«V©ÕjuÝ÷u]ê"”¨Ó®™ýÒðµ×»Šw÷T‹ŒÆTÿd`ç^ T¨V«e²Æ-o·˜Qxà₤ož?³L‚tb@VÀÑÏ;Dõ÷ï5"Á/ø…›¢…¨4Ó4Ó4S6Ùf Í@›ÎOŸ:?e?¹$—䔡 ep…+\?IÜó%Î)š÷,…RêC}¨‰#q$®vpíàÚÁkÞ¯y¿æý» ï6¼Û0´ûÐîC»Ë¬eÖ2kV“gÙÉe'—¼ÓúNë;­™¾L_¦¯ú‘ú‘úçÑgë™M 931“Œ #È–ªD=¨õP­U­U­%È#òÈî¸Ýq»ãa†a†a†òžòžòžoÞ:¼5M0M0M¨\W¹®r]Rû¤öIíT>¨|PyÞë¼×y¯— _.|¹°n`ÝÀº\±f¬kLÄDLT§¨SÔ)°ƒì(¥”R,Æb,þ¤þ,Äö.îâ.â!ªýÕþjÿümùÛò·™†›†›†———äøåøåøA:Ðô Çé~Cˆ€  Ñ•éJ È//.ÎìØÒ9Ò~a”.X0pËiß^ b9ò _ÂÉdèC âêü HGÏÏÏ X°4`©ü‘ü‘üQôÉè“Ñ'#EŠýÐý Æ‚áxçFƒŒ Zúa釥[%†&†ÞZqëÉ­'£Fl;²-sóO)¹,Ù Ùà3Üg¢ÏĉeK&–hw Ýv÷U÷U÷UÏ ž<3¸¸ê⪋«6wØÜas‡Ž5k:ÖXšYšYšýÁ f3ƒYJFb$Frûí¿§ÿ>ìa{,Çr,g©n¾Í}›û6oæ×̯™ŸeKË––-¹’¬ôê7“’é#x`ÀcHÃN¸Àg†ôslÑÒ9Åý*©j®e¿GIY#];ˆõ›J½$ÜÖ!™Š×ÿœ7â“×Éšàl#à1<†çVëVëV«°QØ(l¢vDíˆÚ!++ëøÌñ™ã3.º\Æ{Œ÷ïihÒФ¡‰\.—É£e1²–²Ž±Ícv(îF <ñØzµ­Ÿ] R½SÒ,áÃñU]WnMüqó¡n)½%§¤ôÖò¸¡”ÆgŽSSzóɸïîŸûé‡îò¾-”žOÌ×ÕúdeO: 61~d/*±ƒÎý!ã0–=ÔÕÖÕÖÕŽ|ù4ò©¬§¬§¬g˜|:øtôˆèÑ#dQ²(YT“#MŽ49booÏ Clüר9ê ÷zÔãßkÆ` f¿°µµµµµU8(ŠÕŠÕŠÕ.]\º¸pG/4€ >»gù½·~,Æb,;Ê‘0FBÑÐ ÿø¶Ñ¦½µMçF ìæWØøô¢ï‡QzyÈ€±Y½rœnv½}RJﵬ;_+y¶•RJ·ÅLJćˆV …B!´P ÎÆRG~W_ 4µVXe߆o÷ñiíÓÚ§u̘…1 ÃÂÂô‰>ÑÿøŒ,êÏÞË— òÿïí3ÙL6“ÍÕL ?…Ÿ2Ò`äÀ‘o„^«½VûH÷i‡§–Ø9wçÜÖ û:ôuhݹ+úk×lëŠmM¶5‰÷¸Yv³,©URç¤ÎÖ>Zûhíö%Û—l_2^à-r>øU=¬m pâF}D½JÚQЀZw£¸§hYñÕ ~¬$í!ÿ§èeš¯¼z VaV©¨¨<ïò¼Ëó.ª‡ª‡ª‡6Km–Ú,Uå¨rT9öKí—Ú/eV0+˜ï]Þ»¼w±e;Ëv–é2Óe¦ËpWq•&К€°…Í»šlUNqfÛŒ ËrUÅ£Š3DŒe@I« ëZÿ¥ØûØvJ7YÒʳñ}{§áÞí£|K?óºcéŒüÎLÇ€¦ž ¯¶4õ,±xœZY`¹Ëã\—”ºõ¦ÇKO(ö(o[3„Ý1„yCâ 6 ‚Ĩ‡Q)]N舎¥‡K”É?œ8ÿ°E;‹víÄCÄCÄClÙ.²]ôb‹ /&p¡9ìjò5^ãõ_þæYÞÛ0 Ã0rŒ#Çè1zŒcÓSc7vc÷'åÛ¢-ÚêÔéÔéÔn7Ün¸]§R§R§R+H+H+H¢%Ñ’h \®WšM³i6ÙMv“ݪªª*ª¢*Ê_È_È_ˆØˆ­žÝ^z|›` –‡º›±™œ'çÉy‹õë-ÖÓ«ô*½ª¬SÖ)ëòÌòÌòÌ8O*;b°SŸ4G36¾u=Öb5«!FÐA4”ÿ÷žìVTr‚Z«Å¾ü÷#f¶›ç»t˜qûU¾7ì5(7ü¨HPӲƵΤN¤|@QSêDŠpV*sª¦jqªÈNdç^à’ï’ÿ¶2§4§´pXá°ÂaœàKb|…Wxõ…©ž³AƬs‡]ÔíÁìQöPöPöHé“Ò'¥¯5¯5¯µ‘ޑޑŽÇU«W“?$HþPÚ¬´Yi3ŽXâG8jÒK¾`pé`À°õÃæ4 —È%rIé¡ôPz°~¶oRSÇ͘7eÞ”Ãzö l÷¶×Ô^SÉ>PíÇŒ)Š~pèÁ¡ÂWyCò†\̼ôàÒƒ ]/´½ÐöÙ¡g‡žú0áĸë¶@ ´ ¤‚T°ûKÔ†ÚPÕÕÕÎN`[WêP÷70XñÇüù òØ·;ow^7D7D7Äe¬ËX—±\Ä2ëvdã¿"ü ›¹+#«¿0Uô8íK¯éðEÇ„ë K¾MȬÁeœÁ%ô'­ŽQÿÒøÀ¾ŒÑÑ,‰‚^¤éÅ4ã4ã4ãÚ÷µïkß;88(]•®JWë9Ös¬çX\²¸dq‰ššZ}O}O}‘0FR~¡üBù…Œ—/3^æ>È}û€»Ê[d #Ͱ“`Ã_Ã;C6Ç—?®qÙÿ«wê“÷®tzñc3» ÅvOF“Ž&~Nï|í­Ú -ulD†nbû½F5ó¢†&G´õ¸£§¿ñÖçg‡?³}æ™iO¿{±/˲ØÃ0‰‚¹É˜‘ô£ãQ«N§}é”Ìõ™W2?'''ò'ð'ð'˜9™9™9eGeGeG•O*ŸT>‰ÛbÓWýûƒ,ë—b3Âj†Š²ß°CÀLÀîRD _Ÿ¯Ï×MMM—6”6”6Ô/Ö/Ö/Ö_­¿Zµ¸Ÿ¸Ÿ¸/‰—ÄKbŠ™b¦˜Ëš6C1”J©”J•~J?¥_ùôòéåÓ…O…O…OER‘T$¥ëè:ºŽqa\Ž«ÊzÜÿάoõ¨G=>°ƒÎø?°û{aaa’»’»’»¬÷®|Tù¨òQÅ‚bA±€ hã矧ª™“[!ø˜‰~hLš’*,§Át¢”5ªj*Ö[&].<Ú½yì"·Ý?xtmXjG­S ~È%t¨w zÆ—‰÷Ç\LH3^dtàT[;£ «ÎE›ê6.]ÿ.gI© ,a·z¥l¥Ì°‡©™©™nˆa_þ©?¦žI=“×"¯E^ n¿”åïÅ^ìýÂZˆ¦ðëÚñ¯œ«œ«œûÔæ©ÍS¯^¼½4ziôÒ³‹gÏ.OÒž¤=I+·,·,·äò” âZË—î*Òœ%@@TAlT/?‡?çüºKÃ. £Sõ·ëo_s`õÕÙ©5-jZð‡òOñO©VÉT²Õ-–9/sþ5ô¼è¼¨Ð§ðUá+n§ÀÄĤî¡î¡îÁgÓôý€¸0SÿµÊ^‹ÍI\€ÔÒZZKÅOÄOÄOêÂëÂëÂUö*{•=›òì3]äÿÛø ÷Â„ŠœšRàlÕ'èV#i#8Î;¯sV´Šß 0Ì…œKŽpù_~¬Çjî²É5t¡ Ý ó ó se­²VYëäâäâäBý©?õg¥ŽTZ*-•–úŠúŠúÊ›9oæ¼™“u*ëTÖ)eKeKeKnÍÍÄîð„¸ÐKðR©R©¨ YLÜp˜´%”¬¯sUVÏ>‰[‡Óq·~¬ùÁãí¾ë>!¶ÆÍ¸ûE‚«”é)Jç—›ù˜4ÐÖ™Œþ / ZÓÒÀ‹wbtüðW/7ÏÿeÍ“ê»á©¼\/88Yõ¾Š_ñ:G³'gªmm¸í‚ƒ‚ý‚½ Î78ßàÜSñSñS 7ȲÛÇ,c웳šk¦À `“ÐUt]ÅÕä#<£ߟ@¼]¼]¼Ýp£áFÃÚs´çhÏÑž®=]{ºöíÚ éBº.ä¦ÌçxŽç\dwkukuë*—*—*—²e;Êv”u.ë\Ö¹âLÅ™Š3…΅΅Ζk-×Z®u{íöÚí5MGÓÑ:³tféÌ*Š Elæ<îyÿŠ|oõ¨G=>7°£;Ú³âŒqˆCœù{ó÷æï™vL;¦>à>ä:ç:ç:sÑ5ÝÐ ÝXÉÝÏî‰àƒA”PãtECÃ4%íTÕýè4:‘ʸ‹žbžºñFLïxÛowÐ8ï1–TI;dy¬ZUg´·âbFê¶åú?(Mêø*¢À…½HÉár’:?Û1sìÛdcc;c§²SÅï‹ó³wçœÍ9koo¯k¯ë‘ä‘ä‘$QJ”e?ƒŸñq~߉ØÉÍ_Xï;k¾³± oñokmjmjmR¦4Liè“î“î“®g¡g¡gáõÆë×›ÇÂÇÂÇÂÊ•*p´ŠP„"ô«êG¬‡[D˜˜ž° ™FF‘QÅ KâKâ*ÞÞ¾¯èèôWÞ.Þ®ªkj…Z±ßd߃}ZL‹Y8f 3—™KïÓûô¾j»j»j;~ÂOøé3]$³Â‘,b ¦Ú§Ú§ÚóºòºòºÖ¦Õ¦Õ¦qý‡IÙ¾Þ1öÞ|\©÷û)¨‡'(û¨ÿÖš?>º:ç^ÿÚVÃ<ÚØq[$¼,¦ÙõÖYD ¸ŒË—fÚfÚfÚ±±±Mµ›j7ÕŽ’EÉ¢dRc©±Ôø“ó°,mv+ö]ëãMa F |ÉK2 ™Žä:‘jiè1Ó|ïîêi—›]*rÖ~øJž£ôVß8¥·{^¼í¬xxŸ½Ë§×4ï¶×ÛËr±pÿýG.šèŽè™¨8bMøÃ°‡²Y”¬qô›èôè—†C±áÇèì?›œØ0 6üÈ–°äR°‰H^à^üÁ# È¡ÐGècØÑ°£aG‡×¯^888†Ž:Zöì;Ùw1á1á1áŠ+Š+Š+ŠÇŠÇŠÇŠ5Š5Š5QO¢žD= ïÞ-¼›_Ž_Ž_Ž­™­™­™ž©ž©ž©ð„ð„ðg‚k–°ÔÏÖÏÖÏŽ12b¤¢¢¢çõg¡™Jã A=ǽõø·ÀÒ9à6{bã·ß6~+""¶ lAØá]á]áÇðwÖ#øùð•ÙûA¤@@“¾xÀ¸’]åçxO˜±äÇ–­BØÝ½Q»&½ó{Jol;‹Òø¤qjJæÇeÕ¾¼~Tʯ{–è0:â°Ï4ËOBZyÙE¨ÂfœÄºŽªàCcqÚðŽ0 dê‘z]}{NÊÌ÷Ýo‹Spþܧ›ë׳ùUÏ¢Ž’¨yÎñ–?Yÿ¤Ÿ¡×W×\<¸šy,îVÓØÕä¢a¢(³ßú…ÇÏ=æoycýKýÇö)FiO/úóºÎkÌl&íÒíF6xUü 8¤øŠú­ºP]ƒïð:C Z¿I’}À|àÌz–÷Nã(JR·P·P·Pç¥ÎK—ºR]©®Tw¼îxÝñ‰@"(E¢HÉ!9Üòfæaýþ@¨º[u·êneJeJeJEMEMEMéƒÒ¥J¼K¼K¼«-ª-ª?Í£ÖmÑ–=Lˆ 1a™ú¬Jkù°òaåÔ‹”‹”‹„›…›…›µµµ™öL{¦½z­z­z-ÈÅ>]=êQ¯lg£zÒ‘Žt£r£r£rÉ+É+É+Ò„4!MòÃóÃóÃkÕ6ªmÄ™ì7q7ÿËž?MÏz?4‡ó–ŒÄcõzZ†ÁÔ™~‡ lZô Ûº¥]µïÅÖ'C_Ú»Lf.@ÒÑ EP\w+ýõ‹•C_|øþt`›×*À*dã2W˜Nä–ÊG%T—0G˜«L¥ª£ª£*ðùåç—Ÿ_ÖÒÒÊ×Ê÷4ñ¬õ¬%OÉSò4%?%?%¿üTù©òSAAA¶ […­B2V2V2öYÖ³¬gY5Ö5Ö5֜⠛_öK;§³ó`! QXiTiTi”¼;ywònï&ÞM¼›è%è%è%x†{†{†?îû¸ïã¾uvuvuvœ~Q{´Gû¯Š¢Éö‹óÔˆ!yÈ+ÓÎÎ.šñhÈ£!ùyó95¤zHuNÈûÒ÷¥¤Œœ"§€y˜÷E>¯æ>€t CDA¡î.á}BŸÐ'ß(—œGÆG»ï ‹¦F½)×¼VÅÐ颞¿ÒÂ%ß ùeஆ— ¶ ¿–YCþsæ—æÊ˜M¡/¯ 6~ŸMxûûßþßÀï·3ÀL´$ ¤+î£$¿jtyj#Ö/˜Éô3 Ù”1ï çsJã#Ʀ4~ø¸s”Þ’Å5¡ôºÁzý‡Õ»:Ýì±46Ç=«‘KßkCjʢ·¯Œ£(³ØdYcÆ›Ë_ËŸ#°Z ±ûðÝŒ]!L0¤›©›©›i›l›l›ì5Ñk¢×Ä « « «èwÑï¢ßÅtŠéÓI1B1B1BÑYÑYÑY®–«åj™£ÌQæõ>ê}Ôû A3‚f8¼sxçðÎx”ñ(ãQZUZUZUdYAVüA4B#4â†XµÝ¡Š¡\H«æª]ƒ3ç7Úo´ßhyŽ6WŸ,y¢ÝñP”µó¡Úõ>Ýè·¯• žñC|áÔÍ`‘/\¦­¼uTØhà“‘Õ33³–gOcz¨TªýéÝîŒWvÎJÎî­N–>©V;HyBÝ–&PË*ï:_ú +kO+¯ã=îÓU1U'«tжõ)úPfZ¦*+¨hWq²Â¸vIõ÷Ç1€@÷<&D¿BÑ1¶HÅZJ=Ò„ñ%Ë0ȉ9Ž…ØGéz IX‹#xH×ã8cÝŽÛt ~¦ñÀŽÈp€ ½Ë„e-KGAFfÀ0Œ—¾P_ Ï«|«z«† l`Ãy빬âõ¨ÇWM³€ÍzO㣉38ƒ3hÖhÍ…å}MF<;>³=ý^à…ùó æÈh2šŒ¦.Ô…ºŒ*U0Š |G2’‘ÌÕØßóŽà J¨É â…cäNaêxêH—Ñîmt7 Ýn¨OIO·&Üë[¤kéªóêwý^ÜȘUøÓú»Çú?^°§ðW§ÔĂڒ.U)øÀæcCÂÕ>ê­Ô_-RÇÒ5W¾uPýþÖ8Ý6¤ iSp·ànÁÝ÷÷Þß{ÏÏÚÏÚÏڡʡʡêÞó{Ïï=çŒÑ×x×%ö%ö%öIo“Þ&½u÷r÷r÷2œi8Óp¦—•—•—Õ‹/F¼ñÞþ½ý{{î2Ó0 Ó¸Œ",žm_JÏb»“‘Œä¯¯¯”Ù)³Sf{õ÷êïÕßbÅ:‹uªUª&uTê¨ÔQt ]C×pºF‹±‹¿`Zë&ÑM†’¡d¨C”C”C”’Q2JæÕ¡W‡^âÌxƒ7õJn_:þ7Ãý!ò?zÍk¦ª<Õ†EÓk¦×e%¶‰\@ÕÕž¦Ë´“%¶H'‹ÈrêO'Ò@lF_´Á\û*묪ߚûS¼Æu  ñ°C,ÃpD0®ÌvRVÒªbsmÜÖ«gð‡¼ú6íGyQ`g›Ž#¯vXà×1r˜OŒÅ!þ{Ý=ºUÒ_'µs#€Ð¡˜ƒ:s$ƒPm!vûflm{þ8骈š×ʼ2AÕ4UvéÛʜڥ…GJTä6ø°º¼[~ć֪vï¢òÌDfeÅ*¥YImÅs^ë"AÙCqãR¿Êšº}µÝ”ÇU]ê”Pï©ë¬l¯ºR— ÔUo¯¢Zª®­S*›©ÓàŠ¶˜L9§g3HØ \Î~p„Ïo¹Ñð1EìÌØm8®ä¼ò%åƒ+–S õtÕU¾Hp„ßHëÉ8±½ð’à ¿TµPuRµ1+i:‹± i"ŒÍ¸…ƒôRé÷X…«Ø‚ÓxŠjÔBÅ-¢jP j¡„Š;®B-”¨EÔ¿•©ûí¯êzåøzüí`»ë_?‹³8ËïÂïÂïbæoæoæ_y½òzåõânÅÝŠ»Ñ´m\ä"—ÛпŽë¸ÎáËhY‹%ÉÅQe£qŒæÍ3šÇJ(w)w)w½ïû¾ïû¾ìv?GÃû«—.<ÎÏM@Ð Á°çI™–¤£j¬z mOG óM†ë´ë×ÎØwþpQÛ³Þ»›Aw òVÿ4ÊË)̯ˆßàxbóãšukŽÉ“¶å/ÞXµ“½³Š”Gõ#Ú™JÔMÔ7é=”  â9ûŸ˜ìØlwÈr§.¸.¸.ø™Î3g:²S²S²S94Âz¬ÇzÕ^Õ^Õ^NEíà@•M•M•Íã /<¾à¶Ùm³ÛfsÆœ1gÜíÜíÜí$³%³%³_¿zýêõ+ÎdgÕßa}æf«`õÚ£…(\À\(nRܤ¸É³+Ï®<»â9ÇsŽç«>V}¬ú0vŒc—Ò4¥iJSº˜.¦‹¹=‡ƒ8ˆƒ_dÿbãFøàƒÏ+âñŠl¯Ú^µ½J¢?ÑŸ^ľˆ}‹ýØý,áªÞdÿÒñ¿îÉÈEËî«k£ªQ?)¾PTëBtψMQ«ª»VhµCäÀOä;Ö Ž©ã£!l`öMÔåþUƒ"¯Q€)Ø‚[êu-U‘n„õ<¦3éW:»Ò¦Vr|ö ¼º~7n¿ZÓ¡qöÍû´Šón;Æ{YÅÉ*]R$X*g定ä3*h¨P¥–ÔZiKm¾µ4 Jõ#€úг­D]ÐVˆG:š“Õi@æ$ŒLDˆúuCwÊ£1JFSK=+-jF–(ïV[Uú¢²emp±u9­É(ý¹bbMVñäŠiµ}ÊøWjJƒ*gÕf–~_1¶æE™º²EâC§²‹Õ+’ªw×ÙU«.R¶®ØZý¡®EåÙê6Ê9åk«.×®+Uv©íR)­Ù¡|TaQ5µîUUתæÕ#ßåÎ,JÔQë© öÕ®Qöa&׎VnåÙÔ_YÃÕç•J0ÄîHÀ¥ø´ ÓÑ È&ŒC âH;ø’uˆC ¦ iD&’nhHŸ!…8Cïà öâM¥'q ¯p‰x‹«xˆL¬£Çñ˜^D"2ñ+îá öá2Òð ïPüÕéÔ㯦¹ÉF€ôFoô&wÉ]r×]ß]ß]ßÌÍÌÍÌÓbZ\(.Š_F¾Œ|YnVnVþqü€ÀiI­ÅZ¬ý"½ï”¼$/ÉKšA3h†ñ^ã½Æ{Ååârq9S¸¶pmáÚš53jfp4HVÄö?û¼šJbj¨AI0ò±ˆÄ ²\=›ÚÒW*¨ãébƒeÚ•¢ŸZµ:åõÓØþMýÍ-[8ëÅ@­ÔWX÷sóz—ßÚ¡wnnÊûµ¦GÃmϪÊÏ.?ƒÈxñL*Ù­Ž§©T=šjÓöWžu=üóàÍ¥¹4—%¥ÎOŸ:¿¬eY˲–>Ï}žû<×Ý®»]w{éÍÒ›¥7Yú('˜‚¤° zž¶}ÚöiÛRCjˆíJÛ•¶+8p8 .‰‹Ò~Hû!íVH€&nŒÆhüíùsîq…(D!'™„$$úúú¦ä¥ä¥äy„z„z„Z¸[¸[¸«Z©Z©Z½(~Qü¢X½O½O½ó[‰ù¼Wb%V²É†Ìû˜÷1ïÃ*ÈUÍ®š]5û列#^ŽÀ$LÂ$®~êñ…ã3BR1à†EØ!ì PòãKz®h:°ùÏŽŒY*Dêëêïï·Éû¡ì ¼ÝÏ=O-/T•VÓ…ã'L¦yôjîþ}ƒÈGÕø`ˆžãGœ#KÐ÷! >ô;º†‚lâ×_ÞV'¬q”|¤ _¨p¹óòvz½r&Vê{1: ¢üëä")ÀÒ‡±gö¢œ3Ÿ¼"ÇÈϤ`:“‰!»2 Oæò kI1À´'·Èà` $‚¸h or¸h€°Çì¿¶0H9Y¨„êÞ@íh¥·²oÍU¿êìÚ“ÊÕUµjÕŒÊÖ57ëâ+Ó«'(×UÔš¨VUï®­t®Î®MRNä7úKNÐ`²Að¡Ø©rвîuÓ·‚÷Ír–æU(-®Lª]WVñ¡vv‘yYßêÆâqõ´²>•Fµ~ùMŠ®[â]‘S{@£MÕ÷Ô­i9Í„æü%o0›Ð“9Gº’;Ls””ÕdšÐ¾t-îóÞñ®1WU—ÕétÕ<óùXvvêlÛÙ4N'®$®æÅ/Š_xGói¾*XÕXÕÕõ*õß$XÊÁÜÁ4DC4´a3Âf„óBç…Î UkUkUk‰ q!.Ìff3³¹¶Em‹Ú¹L.“ËdÞμy»fOÍžš=Ü bBLˆ 5£fÔŒ£‘|)[Þ,[Ýžð$]HÒÅ»§wOïž&Þ&Þ&Þô}FŸ% H4 pMášÂ5ØŠ­ØÊ™_ÿ)Â<0PB5t¡o*³‹,RMTw¤cØ"â7Â=¼÷C&µ™å5`m«éÞ3¼œÃLöê[ôÀœ'J¥¬Z¦\³‡^2~^³°f÷Ô»ÝSog>)ν£k¤3naÝŠú.˜×ÈA ç×g÷üþoø¿àtB't2­1­1­ÙÕwWß]}õžé=Ó{ÖåH—#]Žd8d8d8¦¤)iJOÓÓô4gj³â ¬¢¹#áh-±–XKÝÝÝ]]] ‚ ‚ ‚S3R3R3ª…ÕÂj!1S5US5jQ‹Ú/Æ|gïÐ NpâÒ0E! Q¦#MGšŽô8âqÄã¿)¿)¿iÆ–Œ-[^ñ^ñ^ñØ4ŽˆE,b9ÿ=›Mås!‰$‘$Ò@HcÇ=>K9K9K™1!cBÆ„!¯†¼òªTP*(pÊ{ÚІvýðüåâó¸'!0ÊÚmÊM*ã¢ìªÊš1Hgõ{å2Z¡&Rò "˜Ì<¨¡àcè"ï®WÍ­J¨i:œ1 ŽT™ØŒ#ô8O›É"' V4Õ-x6ðÞô{Jž’§Ë++zT\Pœ©»›—Â{³xÄTÛ«_¬y wÿºà´` ÀZë‚h3ÇP¬s@<]¯‡¶©h¶Á:&"‰ÁfEâ‡úÖÚ.¢xƒ3ÚýDí é®OÓŸ§&ºk°Jç¹øµþmoáñná`þÑ5„÷JÔN8‹÷JÒPèÉ?(ŠŽá¹Šátþ‘ ÏQd#Îsã7vçÙ‚¼h@ æ$žÂÑüí’PäjƒÞÃ!m ‘fÈÄÃ`лŒƒ|·°PñT€ú´z@3‘ „ø›X#\Ý€vÔ~t§ºTíCmT|u<«šªê¦^ ¢a´Z¡òP7R™«_ÑÊ¢õ¥j®t-y_UW2£âjMvɈŠîµ¾E1eëªß,*9]•Vr¨BQ{½@»duÕ»âóe'kªŠš”O©¹\ޠʤŽWósídåÍJÝšvÊ5ÕOk+ÛU/ª¦zYëV—¥Ê-?T5»ÎPå¥ÓvjÐ!êÿ‰RÞ]èvöç|¢ÕòÒ!¥û˜Iª£ª§%' Öªº( •…üX~,?¶Þdÿæ i:°Ù+¢!ê¯Ð_¡¿ÂÞÂÞÂÞB}V}V}–5 jkkÅgÅgÅgÇÇÇl^Ú¼´yivÑì¢ÙÅwï2Þe¼kõ®Õ»VµOjŸÔ>A>ò‘Ï¥\aõ4R‚”Ï”‘ÌÖÆTLÅTÖ[¬³Ug«ÎVý<ý<ý<ú†¾¡oJß–¾-}[ú}é÷¥ßs‰ä.â".þžH3Øs*z#ˆ„’,F(¼`¬ÒQw¤Z·DYüm-®‡”Ú/œÜ³§g£î7<öšoP‡EãBN«’êòÔNôº¢›öaaÍž°{=ï½xn”ûà&¯ŽÇ'WÕ­Ueô¢„B‚_ÀG5j ä®þï˜ì,Xv-jQ›ß5¿k~×Ì^™½2{ùøøxNñœâ9%Ã:Ã:Ú[ÎÏ ¬À ΃n+Xe-ÉZ’µ¤Î¡Î¡ÎÁ¹sç6ƙƙƙ¾u¾u¾uφ>úlhéÆÒ¥±[°˰ ˸t6Ÿ³ù®yW/ñ/¹ÐÕ4¤!-Ï9Ï9ÏYP'¨Ô9p:átÂò¦åMË›63lfØÌxVø¬ðYaNENENiH’†4&ЄÏz´a÷²RI*I¥nÔºÙ]¶»lwYËRËRËòͨ7£ÞŒª´­´­´åzÓ—Kª‡þ7Ãý ^â-ù ËÑŠêÑ!Ô17³,·R`„Ì}¥)mJù†-ÄË„]DV¼ ¦÷«@˜Bï+e¸ÿ_ÁÜìj ˆª\}Œþl8Ùà;ëycšŽ~þ:*}æë…Y¹ï§½Ÿ¦ñË8tÂr  µP¡@Ü{|èS tÖ(5ä“«5ÚOþßâ·#g4Àv@X"°g2µ%ÁºŒÖ=¡J{«ÄP®c¦• |+-Ž0ÚÛ$G"íV’–séÉQA•¾»¶ƒèƒno-¹¯ó^ËTðTû„V{áuu’aÂz~ÒÂíú¯µÛ‰íÙZ „[t’$Ù›:Wµêgt¥§D³Èw‚…ÄP¤/Œ¦–oo+ÀˆŒ. ‡ tÇ,Á è‘Æ1…+€nаSMÚß;0`müŠòÀ`"|a @=«a„`èÁ@3èâaõunÎUÝêV”¯ø±vkyUÕ»Z¯ŠAÕo•*j×.ºU&¨ÙSQPýCÝúÊ êUuÚeÅ•!uKË+~¨}Wܸ²CíóòêâüÒÅL¨íßÞÓÛ´n3¢L×ðª¡ä;Ãq×Ú6;ìjØÕi §-œ†8‡´ê;ÁWMƒf&fb&+™*²Y‹¬ÝBÜBÜBx7y7y7™3ÌæL†$C’!É9s ç€Åa‹Ã‡-c,c,cø»ù»ù»ýýýí+ì+ì+L~5ùÕä×w‹ß-~·8; ; ;€ö¤=)'·Êå3nhWx…WŸ‘iÅJô²F'5ö0ö0ö8 œNì7… ¨{S÷¦î á>áÓµt-]û¼¢ðP‹:¨_Xñ>0 I3UŽºÞ¡MéID8 ´s ßêøý8YW×ÀuÕþ ­·a" D$€Ýx„_•WÕ“NϾòúê†îÇëœ~’Püúà'”â&1“ŸlP¹¨šÒ6x J9ƒ¹JÃdÿOÍt1 “0‰n¥[é֔ДДÐFûío´¿áˆ/¾<óúÌë3¯†0„}²ö–Ã&?ó8ŸÛ4·inÓª¼ª¼ª<÷!îC܇èèèx;{;{;§ìOÙŸ²¿¨kQ×¢®øßã{ŽÂÄ*Áþ»=šä™æhŽæD‡èw‚w‚wq¸@\`ÇØ1v ¯¯¯s¹Æ\ã„§á g®Æ>g°‚ž ( @ô@k;k;k;­%ZK´–¤õLë™ÖS™¥ÌRf1ÆŒ1c¬Þ¨Þ¨ÞX?TùSÍ?†¬`Æ›Lv;U?Ú’&Oˆæû…ͽв4øzUVé…ÊF¼ þ$^çnËwêù°Ä³ÂˆlÂSl§Cà‰¾õUü X–ê¬ÁQ¨(Tp5àvÀm­³Ò¥?>šühÒ£IE‹Žaæ1í™öªëÊJoÚœªiÌ` + ´IOÄÂmIÑ Ñp"Ý €:"‚8 3‰‚ é…&pG „Á}О¨@5Ôê%Ԗн´ê?÷v_rµÂ%‚7¼¢O)èÏòº ‹Gxïfü$FO;Vë­¸±ïïžW¬Þ˜xè6 “ë* ûç%¾{©=G<š7Â`´Îñí=¢%&ïõ÷J^é´ÑúAèhöÂ0\KW»ô¤è¦ ˜œÉ ä;ófó­x.$™ßšļÜçÿÄØ —ñmyÃùe¼2rñüæ¼Sð†1uq$[Ü¥oXC€ÑPMKXS¦ÐˆŒH`>ÉT÷h ÊCPö¡ ¥¼ç˜Nï^.´xÐìZÝx«{›ŒÃfg†uñÕâ²Äà ú{²Ž.¡îÔ å¨Dm}'øÊá8p¹nâ&nz]óºæuÍô²éeÓËÔ•ºR×’ô’ô’ô¤õIë“Ö«6«6«¸àn©·Ô[êmûÚöµík“““A– K¥¾¤¾¤¾DÆ1dLi«ÒV¥­2y™¼Lëy¥|ʧ|ŒÄHŒä eÖÃÊúØþ[¦k6±‰–Þã=Þ3ÙáÌð •A+ƒVjÖ­5ºöMí›Ú7/=¼ôðR…s…s…3—8åãþ«r ’TPG¼À,rŽiB.ªÔ¯é ¶ˆü@À6³&é¾§áC¹EÀ-ÛSü•b=þvqPnQç%öä}“™’íƒo?9ß÷î÷w•>ª)êL2ˆ°0„.=BÈDÊ8úÍ_ 1Ä3ÁL0¬NQ§¨S¢îFݺ»¡Ë†.º$ôJè•Ðk@Í€š5œÛÒöQ-ž{#¬ÁÍjû°QÎp†³ÄUâ*quKqKqK1Ž6Ž6Ž®ÙU³«f×Ës/Ͻ<—=4{höPNÆÔÖ°æ’}QªG¤%iIZR•Q™é/¦¿˜þâèèÈ„3áLø‹U/V½X•y=ózæuN¤Õ°àh3Ÿ'ؼò[±[ù Ÿá3k³æN”8J%3wÌÜ1s/ ½0ôÂPÞÞÞUwUwU÷úAúKÇÿæqŒwÈez“gHUÕÑJä{–®¢x!д1M>æë2Þ:/E;„ÆPØA a}å~!„²kbÖ{aTdTdT¤ËÓåéòòžæ ó„E>|(POVïWïWßTY©¬p›p—ÿÿ“qcä# ³P`+€d€³( `nà6˜ À:a ˆA7ŒÃdÒÁd1†"Sу4"óÉ@„b2º£!&‘žhD¾G'`6ú‘ÆHCJéšE»«÷Òj:˜î£å A›AXÝä£Ü‹ ¿¥—þˆR(}[ç'zašù¨¨#i¢ÒQÙ*;ßµº;õù•q]Dõÿ (­Ñˆ;Ú€}g‘’þÂJÞ%Óº'Äïu\´ÄÂtÝÇÒΆúûµ/‹>úèü(ž­S¥µ_Øß°½î*q½R?Ñ`½(©p‹ž@;P8_(Ìäëè´—¶KkÅ­)Òïʼn‚i}Ñyþý+Ò\‘…ÄTt˜G2C¤ÇÛÂo+RðÜæ H:ï ºÄܪ¾P¾¨ôVÙ™::Iž«”='ËySòøï²Þ=§¯±'™ ²ˆäÑrZIkÁJüõøšÀ2ÚÙœŽ]Ð]lllL™3=¦£££²RY©¬^œzqêÅ)U¥ªRUI"I$‰¤NÔ‰:Ul­ØZ±•å#dgegegÙxØxØx¿4~iü’8'â¤c©c©céÕÌ«™W³¢uEëŠÖevÉì’Ù…c‡³ðƒü¸œÓ¬ïŸUªù;Í,ö*¬«b b qãÆ Ä•âJq%«ƒQ4£hFÑŒŠ³g+Î"ÁæLöæ>Y:ˆjPøÁ ÆLƒº¿"•ö Îˆ¤NjP4.õœj!®Û~‡oiÏ~1¦®q¨Vòmusu%@õéÜ[¹IYï’·8ùþÉ ÏÏ}ÖL­§Î¦yXŽ)/‰yKލv©  °û DàÿM&; V*W8¦rNeNeNeÁ€‚Ì:˜u0ë`_l_l_üÚùµókgòùü@—Ò¥t)·xcë“]ÎU \BÃB¢°Ê¨Ê¨Ê(ùXò±äc.k]Öº¬5¿k~×ü®k€k€k€ØRl)¶L?™~2ý$Äy§q-Ñ-¿€¾I@@8Þÿj¬Æê¼ñyãóÆ¿,|Yø²ÐåµËk—צ>¦>¦>ï¾kø®¡ÊBe¡²àb3.à.|v‹–ÝîA<ˆÝMwÓÝVc¬ÆX111ÉŸ“?'Nanana. P€jBM¨ÉW›#¢¿Ó‡pŠì=Mýž9{RºðÇAUU^Ó/ôr£¹sËûŸV„:©¬¹üväÞ|Ì·ZáG8ëbÄŒ˜û™ø™ø™ÄzÅzÅzÙ¬³Yg³Ž+É2V?¯â#Œ  1€ Æ ü±‹Û؈®Pá F“FÈÅÒH°™,&n8ÄœaZ+$“ Ç#—×.ýœ/+òäéŠ- Oùf+S˃– È~"Ã%¢$›‰5™Ll°‡ô"bl"-Q‹UÄï0àÁÿÁ÷'Xò*_ÝÖZï…­ÍêkÝh 7;¡kånnÛZÿ°–³» ‰I ÒuP {ÙuµÜufâˆ+íV.ӛгó¹Õ—Fïlj{vë¥æ{×¥¤”ÒGZ”RzWH)¥7Î?øpÇOà(3¾ÈU!%«‰ÖÔg=¾thf^ü¿~Ì©¬ÝM»›v·ˆÙ³#fGO‰ž=E^"/‘—XïµÞkýqlds³°…-l1#0‚æÓ€á[÷†oýø?ð »!»!»!+’ÉŠää䢊¢Š¢Š¼£½£½£u×ê®Õý”drWp…Õxæ¾ÑLT÷×Õ‰¬`Ź*>/}^ú¼”'Êå‰r\ ûûû²1\"¶&“¥´>:†H( °—ȼ!§4‹8UY]Óo¿S<¥]ÓØ2Ãó¡#~¢4áǸJo{†Òøuãr^îÞ;³°ik¾×Xé.ñþGÏ´3l`IRÉ <Ä=lF÷ϧ粡Ìì±4]š.Mßh¾Ñ|£yâÐÄ¡‰C[Ìl1³ÅLV¥‡À àü §f•IØ«´"­H+ÇrÇrÇrù ù ù E´"ZíêêÊÎÎç‚qÿ Áçß[€ÃÆBg¡³Ð9,.,.,ŽÍ/n2ÅdŠÉN`‘ÇüŒÁðô0 S1U£Þ÷/«É  Vc$"ˆr0ì!2\`ÈV3G!ñáµe~$ãy×™d²—ߟ׎ñsx§7Áw|Ó7ÙCVŸI3$ÿé-‡ðŽ X¬Šìò™éŸ`dÖ¬a~ȱˆ%JÙÁØ©^+=/ú »½¡û}]±—«/Wrylr;åÅ…ŠÃéé9¿~ùð̵«¾ïô‹øšÈAhLrHs'Ó‰ÎR3õøÒÛ6 6®=Ú£=oooQà¸ÀqãdGeGeGå¹ò\y®ÇmÛ·9‚†Î ç§×+X°Ê*šéÙó‡<ó±æcÍÇ6Êh”Ñ(CÞAÞAÞA–!ËeÈ·È·È·DmŠÚµÉÃÌÃÌÃL'“Æ}rÏì9eAÆ‘jþ:°Ì{)¤jkkkkk‡{†{†{Ê“äIò¤      ÞcÞcÞc®<›vêÇÏõìKè!¿`0cJ6~*lçpÏÒ\Ïh‰ïðï#^'œ¾0l ¥·Tq‡)½Q0ö%¥wæN°Ïwè†㓻v §k¬µBh­y^"óš‚ø˜IšÕ¢ù|ÐýÑŸ<#ÏÈ3ö‹)7¦Ü˜r#M¦NSMš:4•{cž1Ϙ[>ý33‹>èƒ>‘`hhE¢H‰íÛ'¶_–_–_– ZP-ø˜,o'vb'«ÇÿŒo¬¸*;Ïœ·9osÞÖ$ºIt“hß‘¾#}GrL÷žè‰žŸû~>`UÛðŽðްä¥Ö“ZOj=éEÍ‹š5+Æ­·b÷*ú‘~¤',[o¼H™ÎËö9Ø´¬Èž©×·YÝ®¿ôžFéÜÃýçŽï"#[¸†Ro¸ÿ0ØC×I®“\'Å>‹}ûÌmÛ ·A\vãòë“jŠA bØÕ Ž9(r¼J^%¯ jÔ0¨!W’LYoÇ¿Í )AhDZ†Ä ë1Ÿø¢t/è6×9ëþĽ­ÛÞ¨¥‘ï#Mc?ÄÅ´Š)‹qUØ7i;<&:zoTrä-·–®?¹<08f0_ÿ•æOÎ|vàdÏ“—&^Né¿ ; $wänç%ã@|á G˜BáoæZ=¾\°‹m6c%À%Ë%Ë%Ká£ðQøÈÚÊÚÊÚ  ˆà4:þ š&‚|àÃIj€777ÐêŠÕ«+ÁW‚¯_‘O–O–O–-”-”-”¯•¯•¯GÈ#äN~N~N~âóâóâóŸ\%Èà µß÷—¬2 kÌÔ6¨mP«è¨è¨è¨ˆQÄ(bìvØí°ÛÁ•߆mØ#Áè“ó°t¶Jz16ñú2ËÈ Í"&öz™‡¹>n…òßéY;ð¥w˜ññ”^¯ÛÒ„qgò8=$bñî¡·Â?Ø1ï¦ó I€éNn-Ò™0ø¸SÁÿ-)Óg Þ<Þ<Þ<–ËÞ©S§N:%Õ%Õ%Õ­ ]º*T#ŽÇpciå?­j¥ùöÙ„DlœÀx»ñvãíááá±Ãc‡ÇoTܨ¸Q±nC݆ºGov9j cÿAKþ|À>éIœÄI6"E§D§D§$Ú&Ú&Ú&rnäÜȹº;uwêr­'p'>»§h‡vhGHáæ²7FÜq#uSê¦ÔM“c&ÇLŽaû¯5¯5¯uýPý͹CÖ‘XöØ_jÃ7KÉýyŠIÏê¹³ÌûŒ tî¸þ½–­lãþ‚ë­õ†;W \ÆD{ØÃ^è!ôz4^ÝxuãÕŠ}Š}Š}ú{õ÷êïå2²[í_‡¯]¬÷‚EÒÖhv£Ùf+¼Þ ïДДÐÑFÑFÑÇhwÖÏñï€Ýy½o™p¦‘°«p `;ŽÝøMFøŒ¥4~Ü„;u/ûŒ|¡ò¸6ply»%Qzn»¸Þ$%?íßî“ÿ•½ëo¬§ü^€÷ÌÍÍY:ª2ª2ª2ºAtƒèzÅzÅzÅܯ¦jì)ýóf |ð¹QâáÐ'½¯ ¯ oƒìÙ ²ÃÚ†µ k+ÏgÈ3ä¶r[¹­üüüAXpXpXpƒ. º4èŸßÃÿ4ûÁÁM?ë¿vÿ½ñËüËüË!LÂÈwÉwÉw…÷ ïÞKª”*¥J®Ÿà žp¿e}›Ágcr˜_#ÒHóôÆFzâ›S§÷ª :ôZuÀ¶¿¥ ã»Pz#ol¥ ›âjKï³^¾òƨ¨²ÍJtJ?yuFLGÒcÐ ~0†$Ÿ¥OõÀ2›kH áôÅ}m}m}m/>¿øüâó¿œøåÄ/V[­¶ZmåŠ?!OÈ“õüÜ1äúoñ–ýB?P?P?](ÆfÆfÆf†M ›6Å(Í(Íè#Ñ(™È„/|áû/·ó¿lZ4v'|ö`çOž?yþÔlu³ÕÍV;«ÕÎjN­…Í™ ¹ ùpçpŽ=‰D"‘hUäªÈU‘‰9‰9‰9]c»Æveg@&„ aB>ÙÙ«Ç·F›4‚ŠLmËð^¶ˆkÒ%šÒÙÇûn¢t®_¯=/»m‰á|õ†»&ˆ± ì±Å~‹ýûc—Æ.]ê—á—á—Áä3ùL>«pŒÎèü‰Äã×}èCŸ3;t ÷b÷b÷bù;ù;ù»¨5Qk¢Ö˜:š:š:râVÙÈFöÿñZ,µ€MÙ­ W¸ÂÕPl(6{Þ÷¼ïy?zgôÎèò¦ò¦ò¦²|Y¾,_¨T†öíÚßi¯Ó^§½ZË´–i}ê„A„‡xˆ‡C üá Kf¹‡¶Èª¼1F1‡)½}dü~Õë#ÇtɬËÿÛ$ªyuv¬ÈAr4‹ˆ¢EÑ¢h'''ÿ0‡0‡0ù]ù]ù]YSYSYS¹J®’«‚;w îdÕÓª§UOž’§ä}*\È’y4³fþó®ÖD‡qÇÒ݌݌ݸ%ÄnùnùnŸPŸPŸP.p–ýØ¡l¹˜à&2Û‰’¸  ÁQYti ž_ßn«ÏÖ—V{—ö=Fé­Š¸µ”Þx36…Ò[¹qKëL.-E¶;M¶n"odìf6ö“Ê›@RˆcNÖü–“]|‰¤56}}"¡í®í®í~0ã`ÆÁŒ=ô|Ð3 6 6 &0 Ó‹éÅôú—Û›f°² ¬9Ð2Ð2Ð2ˆÄ1çcÎÇœìÙ#²‡¥»¥»¥;÷+ÖgÏÆ-üþœŸÊP†2öÐd»Év“í²rY¹¬k¦~=þš&2/q†=Ö3Òº,¹”õ}yZ=×­ß]Jç÷«>s­_Ñ$Ð&Ç‘†Ÿ÷fãß‚hD#šõ“’@¼ã½ã½ã›T6©lRi3Þf¼Íx®†u‰.Ñýjëú—c9–³^=Ë»–w-ï*î)î)î)Šû^ö½ì{qµÁnÿýãÉFÓ˜ð†7¼‰=±'öŸ”Ù‚-Øbìjìjìê—è—è—µ/j_Ô>y¼F^ÆÇÉˡvíÚÁþ¥ýKû—’3’3’3Ÿœ‡ QˆÈ²àýÏ=?c ™FqTû¶V‰xéÝ.?mìG—ßô;‡Òø+q¼Ó7–Œë”&¬êòÏò"™ïÉá<ÆC ñÿªïôwB³n=àV‡:äøîÝnpƒ›‹‘t&Ig_=_=_=ùHùHùHyг}ŸxØ>Ë&Bú³«ÿX/&Àkœ×8¯qòòò2™‹ÌÅÌÒÌÒÌRhA‚“8 .¨”çÂô!Ÿpp §1¦‡OìP·>Ä?ìÞÒ½¸Ó”ÞäͦôÖ¸Eu¹—Fß¿xf»·#ü|Â,?¹[¦¹J2™Xa/º!®=÷‹o½l’ öxá“…O>y’ù$óIf/‹^½8Wq$ŽÄñŸbºÿã–ÆŽ ‡q‡Ù/øùù=ûyöóì§x­x­x-{+{+{ë`â`â`òÉyXîgà&cût¬BN$"I&“Édré §6œÚÄ£‰G¥Òæã²vFa·ðþn?–Ä~äAصµkk×6>%>%>åÌŠ3+άÐÒÒâÞÚ?&æÕã«Å> DGâ~ÃØ“Å7ÂnlÙ˜ÒùNFPÕœƒý®ÞY2ôJ›Ëò8óM×;(°>6 $èhëhëhGŽ=:lBØ„° âÍâÍâÍœ2.«&ñuã1ã1;”èÛèÛèÛÈÞËÞËÞ+¶*¶*¶zkykykq\á`f}²` 0l€ÝLÁÍ‹ðüx~>>r¹¾\¿ñ³ÆÏ§ðµøZ|-ôD,\ÈIÒI!™.ÔRpÍtoÞ?Xf'ºtg…wÇÁtïþc—Szs÷8¥ úq×U&WÈhçK¯Wôì¸J~! …Í'ü]FAN¢Žñ%û~ÓÞf i_Ó2“xì¢Ó0 Óºïr¼ËñûSïO½?uÙ¹eç–#ZDë7%«P„"ôߺ¢æèǾeÎp†³ƒ¾ƒ¾ƒ¾|¥|¥|e̦˜M1›ÜŸ»?wΫæUó>Ž«ë°ë>ÓúÔØ°ìdÙɲSL`L`L`ðäàÉÁ“™ÅÌbf1yeØ|n Òt !-æLÌ™˜3‰‰‰Û¥Û¥Û¥Lc¦1ó±ÿ²¢–õøæ …B~8ãH8ƒãÌä^ãb—Pº`ïÀ”α듪ݨC€ö¸Žè‡fp‚,¾ÑÓ4.Û¶9lk2 É€&<{öàüß„ÉÎb –` {(öû‹ýƒsƒsƒsYŠ,EVÃY g5œ%X.X.XΕ‹±ûÉÉú<ØÜ`&1“˜IVr+¹•<`HÀ€!2[™­ÌVî+÷•ûÊÒdi²4V8 „µl=Øz° ^/ˆÿ仡ºqˆU!áþNxæL;ÂßïïÙð¥ =Æ·¨ë|¹á(I•õï1Ï£ßûW7à¶2y#˜]äc Þ‹6£iüic‘d’L’µUÚ*mÕ'n¬fˆæþÃ×›ñûçb³N GŽ0!“ʤ2iT~T~T¾\(Ê…š–-§uýÏ·¢šçg[ïflÆf4A4Ñ,høÐð¡áCÿ­þ[ý·Ê{È{È{È’dI²$¹¶\[®}6úlôY¯U^«¼VéÔ?¨ÿi‚tvßl6aÓ'õÀCLˆ áÞþ¾ý}ûûŠE„"B¬V;¬tØà°ñ'«OJÉ"ò Ÿ¾Ù» §v†¿ö_Ö¬ýJo´Û•Òø’8¥7‡Žs¤ôV縨KÍW>îÔ e|c'û>ŸÜU DÑù…Ñ">˜ƒ¿©"¾^^/iOÚ“öì±ïß!¾Cî ¾7øÞà“sOÎ=9Wä%òyqo¦ º Ëx”؈ب)¥`¹Ür¹åòÈY‘³"gÅÇÇûÍõ›ë7W´Z´Z´š»g1úÞÿËF0{u–xf+X F F F‡T…T…TÉïÉïÉï™M6›l6™+pà¿üâùàƒO𓿤9+3=Âe„Ë–¿9Óe¦ËLŽØÃî'°lþz|›à»2ÞdDB{ï‰.¡²W”.08޾œíÝwTÆüñâïëÒRHœ¹dbÙç­ú Ð ¸±nooA¨n¨n¨®B¦)dúÕúÕúÕÜ:x Æ`ÌWkôh‚åñ›Â¦äyDùv÷íîÛ]±A±A±!jQÔ¢¨EºFºFºF\mÜÅ]Üå B"$Ÿ¤ôâçç·¶µ¶µ¶ ÒÒÒ—{È=äòáòáòáòòò²Ó²Ó²ÓÔÔÔ–m,ÛX¶áïàïàïøä®ØàBoxÛó©ü; ›b© Z"”T“¨ÂTd{¥3ƶù‘Ò„Uqå”Þ83¶ùSÝËúO7»iÔQ§ ùèa9¹Fz"…»öß9™iNÆ¿†_ïñyëóÖçmľˆ}û†‡ nXeXeøÑ—ɲ!AÈ'íÿkêË,X¢‹ L`"x,x,xt%èJÐÙLÙLÙLE#E#E#—B—B—…¬ð¢#áø_ëÝìý³Úì¢WÀc1‡˜C¦6¦6¦6té4Ò‘»ÉÝänòyˆ ›ttt²ª´ª´ª vvv½‘½‘½‘)eJ™R>P>P>0À$À$ÀÄRÏRÏR¨ˆŠ¨>¹“ à“”4ÿ©iCÃ_NÞ“‰È!^8?Óõ¹Ò‹ÏŽïîÓß_5üFôØhJvÇß9{Z£–Å"­È<ÜD Ü?äý­“뮈ÒEé¢tÿþ'üO(F*F*FF¯Œ^½R¾Q¾Q¾1<8<8<Øü¦ùM󛟜ánáÖ'Rž_‡Ï.Â'c2&³ O?O?O?ù"ù"ù"YŽ,G–¸9psàfþyþyþy,ÄB,Äp ÇðÏâþ5— l”Âï$É2‚Œ°>n}ÜúxðªàUÁ«ä¥òRy©,F#‹‘_”_”_Œxñ:ⵓÔIê$•¬•¬•|’扄`„X€EÆ'ŒQìP8ÊgÆ”ÆÌTzNõêäÍžFv³ŒÂ×N$ó­JûÕêûË”Æ_÷žÒcŸPz[g|TJÞîÁ}– Ím+ò~*xÁoÏìÒ¼ïó†ÃLømäü6Õ™4DB;;;VD¬ˆX‘¸>q}âúNuê:Õ! acš1͘fa»²ƒìðçЭ;[wvȲe!ËbÔ1êuØì°Ùa³ ûö7ìÏýj<Æc<«ñõçüû¡1j/Ó^¦½,¢SD§ˆNÑÞÑÞÑÞúaúaúaÜ^:K¤üoÍÿxÄ3[™­ÌÖ]»2ve<)}Rú¤40.0.0ŽQaV1«˜Uõ9C¾iðZ{ƒ‡æljfœL«çY pS­šy¸K±Á´½:7µwµšÎ6¦#éMl¿¡ b»;5²ábíÐí|#|#|#š>lú°éC›Y6³l>æJ¼Žë¸þª¶ÿãJÒ'úDŸ}j‹',NDˆþýAá§ðSø9.r\äø‰ŒÄFb#±qîìÜÙ¹sp‡àÁX¹=9‹òòÑ¢/D_ð÷÷7icÒÆ¤ 7`i‚M¥ÎJsj¦žù+5 Uæ1ãK¸Äh×€ÞvòJ“ËÎc´T].ŸEé­“ãÖ·ÝÁŽPÁ³b“!‚tÿÂá–e¨³ôâO¸D$’,I–$«QËF-µ”—ÉËäeÑnÑnÑnÑw¢ïDß‘---yÈ—‰‚Ä0fŒžï¿_ü"ìd1Á×§ËúúÚ¹W9ZÎ^Ùß3¸*g剿C~¦ôv×ñq”Æ ÇÍ¢ôÖ¸y™Ãi øi”´c ¿“´¤Ÿ8’Jò#Ò‘ŒíèùI~Ë&Ic4Fc’M² §Á5à΀;úbê‹©3GÏ=“sL0G˜#Ì‘?PÊÿOõî2`À`v[hi µ„ZÂÀgÏŸÅ b±‚È+‘W"¯X¾·|oùQÛÇîp'3ÉL2óOÏü÷€Õ=cçå¶h‹¶J¥‡²éˆ¦#šŽpÝèºÑu#‚„ NðÔ Npú/ NóÈ< Ûoµßj¿õŒõë3Ö—6^Úxi£“ÄIâÄÎpÆœ1gÌ¿ÙþQ`’•„ wíéá—Néœ{ý#•^3 z¯­¾?ófß=m½Û9qÓÏ›Ü'c¿¹jÊCòX¿£®Ž®Ž®NÔܨ¹QsÃŽ… ;¦¥«¥«¥Ëmjò_¿,À,`µ÷jïÕÞÞ!¼CxVyºa^ü†yÒ¥Ò¥Ò¥Ž)Ž)Ž)¬Âºüœüœüœ¼£¼£¼£bbb]d\d\dœÏ Ÿ>3ŒZµ6j£8Š£Ÿ p,ÁÆÖ¿ù°ÿNŽð7~-Ÿ¹Ç8’Vì×3öÛ¾šÒ:¾ZÕüJŨŒ‚g÷Ž˜ºî³äô ˜#ŒÁob‘]îFÓ>¯}^û|HyHyH¹ììì¬@V +ˆ7ë`ÖÁ¬ƒ›®›®›®ü†ü†üFtftft¦|¿|¿|P· nAÝô*õ*õ>úq٤⬗úËÒÖ4XÑ=€nsÝæºÍ£ì£ì£ì£%Ñ’h‰ü¾ü¾ü¾Åe‹Ë—¹ò—p —¸ãÏÿ©5ŸÔö°ÿ=!M,ËÅrç5Îkœ×D´ŽhÑZ¨°”×ÈwÊ{ÉùŠ gù®p¯p§°EÆy†+  {ø˜zw™ÞT?ÄigóÉ•-ýr—??Ä›ÒøµãöSzsÝ8?JÊÇÇd>4pú¢%CmÂW›HõÊ$­4¯Î7æé“[˜…~¿…É~Õœõÿx½y½y½ÙxªÈÔÈÔÈÔOàûµà¤à¤à¤×B¯…^ c&ÇLŽ™,çÉyržÝs»çvÏ9y¬?û¿ <ß³ fÌ’5‘5‘5a½ïâtqº8›Áû¡úý­ Âf3‡Ùe†|’|’|Ò-õ-õ-õÎ;ì|`xÒð¤!G[Ò¤ÓÔãk¿¢ ±ñHa ?T¢¦œÆÒ}T›¾Cv‰nó%¼\ãB­BÑGÉ­3¤¢`CßD]²<9V8¯¨0ª1ª1ªßßß~›ÿ6ÿm~eieie)¶c;¶k¦)ù†À2 `ƒ ‹ ‹ eOeOeOá„?°&»¿£¿£¿£¨•¨•¨•z­z­z-›¶FµSµSµ3/9/9/9Ç6Ç6Ƕ¸uqëâš,Ï’Ý>ÞØAÐ#ôÈ' j¨¡þ›ž´JîZT-RϤ–L QáѼµ;sn-h8Àm²©¼•<ü;S#s!Ðm]£±edïFw:x¯æ\ͺºÇD‚,Ì UÄ,Ž„£†ô_¾vj¡  œR>['ºÐ…®þ ýú3<·{n÷Ü.üQø£ðGÜÀ ܨò¨ò¨òHÉIÉIÉ)­(­(­`)Í¥¤””‡sçÎ |>é"é"é"ß§¾O}Ÿ¾øfà›™E™E™EÜ"-éHçTJØShÞÏçÍ»bÓÇ|ïñ=¯ ¯ ¯‰ÓT§©NS™wÌ;æ+Ä–û6÷mîÛ÷úïõßësYH‡a†qçQAÕgÝÙ'eïö5^ã5%”P‚©˜‚IxÕóªçUÏK»œv9ír¡MnÞó•~–g 3ŒüL’èrŠÉ¬6­ª«û¹µcO“ÞFAþ‘ã§ִB9½tÙešþýÆoÔ?êé¾t:“0ë˜Ó•çJM«­¿tü@R‹ ©'DŸ¤›f¿-9@`¬ÉzÒãH@º²¡jm„؆$´Ô}æµú··XõêÔ?°É’^¯~½úõê7Ò7Ò7Ò’’__ßÇ9sçdYAÇÒ±ô¯q¨i¶y6£ð œÀ‰ºÖu­ëZ§ø¦ø¦øÖðkø5|SSSCCCÝûº÷uïW¬¨XQ±"Ý.Ý.ÝŽ¶§íi{.ûG1ŠQü·Žó1óYuñÏÅ?ÿ\Ò«¤WI/ñ†c Çšë™ë™ë½)ySò¦„SXú;Ç1 ÊÉ%»À.–-/Z^4èaÐàGÆžŒ={Š´Š´Š´ðOñ”Þ¡wèúŽòõá_ðäÑñ8I9Vëûƒe-*‰òº±z3퇇xá¼=$Eß_Ô\`Àõ‚5ÁûªË(D!ŠÝz˜ ÌfæÌ;™wª[R·¤nIî›Ü7¹o8…–½]ƒÔ|s-î%^â%$GeTFe夜”vÔբ¸\.0ƒÌêÎÖ­;›Ý0»avÃû{ïソ÷Y—g]žuáLvV!˜%'°‰ÖÙå› Rc°û/<éÿF€za3lB:+ËUãÕÆk­}cÔû…]ª›ÓžÊiª!}|»[ez#ôd}èO0ƒ79É´" h¸ÿLv6;êBºFFFÞ[½·zoÖ ë„uì¶{ÅáŠÃ‡“Z$µHjÁšì\îÀ8Ä!.;<;<;ü᫇¯¾*.).).aÖ2k™µL&“Éd:té4Ò{÷ï5âiâiâim†Õ ð|>1?°wÅòGY½ê Àñ¶ãmÇÛìÔÈr[+NWœ®8žžNh àZàœÁ™ÏnAòa]ˆoXb †"œ˜’3hÌ{ÉH eÆ’|Î8X €IDATü𶨴¤EJÇ”ëÏÚg8¾ºõÌÙZf Åt+ÎÕ+,éÖ+dS̆ŽË:ök¶¢ã¦Nûû½mb\Ó«ŒÝ#²ÊEåw*wlh{_ù‡,ßÓ|ÂÒ ×oœI7Íþµä8ï “EŽc;&£©ZM§Ã–6¦ûüIûø¿µÿ¯”–ÓrZΊ´¾½½åuÎëœ×Ù¬•Y+³Væ±æ±æ±¬´î'‘5ؽͶh‹¶èè¡6P¨ Òî§ÝO»Ÿ>&}Lúu²:Yl²Ðd¡ÉBÛÛÛ’OòI>÷[–¸ò÷¥(E)ëw§™4“ffee1-˜L SjJM)φgóáfØEþß3šµFk´¦½ioÚ‰HD¢¥‰¥‰¥‰à´à´àtæèÌÑ™£é:‡ÎáñŠxEŸQ¤M=þ[ ÍñëÇLÞW-§™L¯zôcjïá5¯g˜öv¦å‹z2['ædCgð¡©@ÌbÄßPMÀL`7Íú›õ7ëÛ° aAÃò€< ¸’ìJýÛ aŸšÕ͵…-lmBlBlB† C…¡l‚l‚lBx—ð.á][:¶tl)í(í(íøÉØyÖÇ©/ÿ9×§†F;Ï—™H²Ç]†)šy Q5½Ñ|ÜM•Íe÷‘/T{nN‰óïñàDBÍ—™/3_&«•ÕÊj£J£J£J£øQü(¾Þ3½gzœî¸fþÔÏTJ3?€3¬¡G†le®1Æ$ˆ™EÞ ¸Àú7}ßÁ5Î&Þ e‘ì‘Ë£•«GnŠz|÷ÃÆí].Ö\î?ú4¥WÎ ›÷úÅ胭¯~¨–U+n7¯ü¥|烉ÊÝugoâý® ¯àt·Æ&£>ižd+J™ rµÜWßf€é¿)¤2Ï™çÌsö‹©ë§®Ÿº>õCê‡ÔC3‡få2ž’±d,Ë©{ý=Ðì¬`ƒt # ”JÃ¥áÒpi¢Q4ªIT“¨&L“Çäqå5¥fÿ~°.!…ÎBg6ï‡âŽâŽâŽÅ‹œˆ3—Áôo±$–Ä’=Ö²Ô²Ô²\ï¾Þ}½û·nÜZm}´õQVå‰Ä âÕwŽzKÑœ÷EW_l/\Sæ0-¤g›šŒ=zO§tqÁç‹[„9☓¤<ð!øjë„h|4D?ÆñcšÌo2¿É|ëÖ¬?RbXmòÏ&ûÚ êõRT DEDEDEÈ:É:É:y˽åÞòOʳۗl‚tÖ|Ô¬ÿ/¡Å"ðÀg‚È.¼eÿ¸ÒnÔE2¥·ûï_Wtõñèùëé=ÜÇ5¹ÁÆ+Ù2ŒYÿ[B™¬õ®9Y²þcÖpXÖYÖYÖEÕEÕEÕEOˆž= =ô5õ5õ5Ä âS”k¦YÑØú»ÔWFÓ¦MoÜ©q§Æä‰òDybtZtZtšì‚ì‚삳®³®³.ãÏø3\ ,G›ùï.½4¯È&ˆˆˆ„E†E†EF'E'E')–*–*–Ú=±{b÷Q)+©HåX?“]ÓL7$d1ÁNÞnæ ù‰Ë '9öShI¹àAD‘O¹•ÛÜaÞ†úœ¿·´yû¸·ž‡& ØMéõ¾c)MÜ>QHéÝMr)½×aÒJ/™lVPüfÌ/RîPJéÓ£”RšœB)¥‡—¼4z¥ÃÝZ^æi†L@o4ƒ×o-ŠWo²ÿ{`Ì3ÆŒ —ls±ÍÅ6ïî½»÷îÞuãÖ[7N4J4Jôqát7pã¿p‹,‘&A2»mvÛì¶|¡|¡|apfpfp¦ñã9Æs0ó0óÓ‹!ÆÏñdžw²}à v;ˆ›îhº£éïÓÞ§½O“ dÙ€öhöšcì_8\=&ÉcÖ~`³ºžœœ\r½äzÉÕoŸß>¿}\{3bF\¯'S`?LÂc¼#Lê»TÝÚÔ½œÙµO¥ Ï ÚëüÝSÙ!ý±Ž±Ä#ŒÇrtE‹¯¼fXÍfKXÂR{Šöí)‘N‘N‘Nººº’4Iš$óêÂ!ªoJ¿Ï»ÉŒfF3£™Ìf9L“ÃDDDD„Ÿð~ú8n}ÃðÈ<âƒËÌSƆø„ê¶Ðjv»ró©^Ã(ïfÛk‡ý+ú•_ËZSÞe^ÜÎvån.Ѷϰ-¿žO<Ÿ¸}ÍÍÖ7î%ýZZTZt> µ4õŒÅ³‹¦eð…üÈ6²•l©ÿ£íp¢ 0vqvqvq—+.W\®¸ÜüróËÍ-Ü-Ü-ÜYò Çþ;!bGìˆ×é—8-qZÒüIó'ÍŸx óæ1Œ+ÉfËf•[>lÁla³|H÷K÷K÷‡?þX¶_¶_¶_ÏDÏDÏ„có³Rñž™ÂLa¦°oÜ3Õ3Õ351"1"1âЕCW]Ñ–hK´%\l€†Th=¾môF 8aAS^#fwrλNê~³~ì˧êùÚlÏ'öo×BÍÏø 8áHÒ‡°ü«­v]ž|ä³_ØçÚçÚç6U6U6Uzò:*tTè(ñ ñ ñG?%›Ìèïi™ÿ³£Çµb†'˜Êc˜XÒž¿ƒ7“a& éŸÀÞ×ÂRwOϱûÝÎ- –±öÖþõº4-™|&p˜šÒ;£'ØPz{Ñø9”Þ?˜Ò[åqÛ(½µ"nhuÚ¯…#Mã·¯óúîâjïÑÓ£/tª‰näì°Ï²ƒ^û?»"ï*üÔvÃÅ “ß¿vÿÚ„»ò&äá QÈØ06Œ G1úÏý=Ððøòññíïïß'÷É}mmmÆ5¨v¤i÷·Ž¨1ˆA ëB–‘ed™§§g“Ò&¥MJmmmmmmYú "Aäó0Ù5ëGc/ÝSè)ôÆVÄVÄV¸­q[ãöqaÌ2Ýÿ:U=èA<#ÏÈ3ÖãÞü\ósÍÏ%/J^”¼hݯë~]÷+wã|Â'|.íZ=¾Rü+ª2¥¨’ãRU¯§ü‚ÇUók‹É&C?¤¡Jm¥NÐ+n!š¤c$´"ݺ6u<|0ø`ÂWZlÞSxÀƒ¯â«ø*ãýÆû÷+O)O)OåIó¤yRz“Þ¤7q Çpì“)¿,ÊP†2ØÀ6ÜpY…*TqË¡ÏSäßbÁWU«ÐUŒ#ÙKø,Óœsùqákö\+ýyÂÔë±yʆ•jL=ÑÛ³ÑÊ[·“GäxžïtgÀ«kLÓžLP Ô|º€š wf[ã ÁÒt'Ý]ô]ô]ô­¬¬Ô£Õ£Õ£y'x'x'^ǾŽ}›~7ýnú]ÎlmÖhÍi{³uþx4ß›?5¡eƒäØßf9d9d9”Ü.¹]rÛ5Ö5Ö5VÏ\Ï\Ïœ^¡Wè§3NgœÎèëë§ÉÒdi²Úµj?p{,‹°‹p÷qÿ?Ü4Ÿn$Fb$+¥gjjÚÀ§OU'U'U'Ò—ô%}_4{ÑìE³êˆêˆêìÃ>ìC7tC7Îèü+tŠ` =Á æè–ð`ÚÖ‘ÅÄ“ST{Ó*6V³~åªä¼™©A-S;˜wÓÕŠîî¿ÛzM›a®ŽÃ›XóõçFëˆDWx»µj„:‰"kÐ…yOìªK×Ö¾+³¬©~¿âƒnÅ÷_LÎw¼Tò`CæÐ‹H¬Í\•U/+¿^þ¤jNÝìß(~÷²’â éMÒHs ÂâÅOãàŸ®®í]Ûc·Å~ïýÞî}zùôj}¼µWk¯ËÅ—«/Wß{ÿíý·löª¦jªþ ûøß÷x÷lcÕ,Õ,Õ¬'FOŒžy®÷\ï¹Þ§È§È§èjÒÕ¤«I\É¿³ÎYÙ†‹¸ˆ‹Â a…°BË]Ë]˽¦ª¦ª¦êÿ±wÞaUíßÿΞơ÷Þ¤ ¢ *¨ ì½GE½÷Þ{ï±Æco±¡±wl"@š4)ÒÛ9pvÞ?vÍCÞ$¿'E󘸯äÚk™-gfvöÞ™ûþÞ¥K7–näŒcz†ž¡gÐíÐî\Ÿuè¹z’¹1scæF“& L%%%¤IÓ¤iÒêåÕË«—óÚY܈úqGs˜Ãœn¡[èNÖÂÅÂÅÂÅ¢V§V§V'ãlÆÙŒ³ü 7™¸û±_x,€P8óÁ"ÞX‰è¦F4h3”ÒÅO¢tQÈÀ×ë'ÝïµÐ²£ÞNm~vŠ(ˆ-²ÿ…µQ×õÅF02Œ6Œ6ŒíÚ5´k“[Mn5¹Å´aÚ0mø¹.ÿ¢às&P.Iû ,EÑqæ 9DÆ}$rÿÙ‡Ûµ¡ôAÙTÚY·:¿‘”v$a¨q¾þ ­~h€¬'>ˆâÏ“Ìóâ=â=â= ö5Ø×`_ÐÛ ·Aozô èÀ°¬Å‹ø£¸ù!Ω¦n¯þ+O‡ÜàVw%J$9‡9‡9‡v ìØ5àDÀ‰€ÁÁÁ>v>v>vÇ ŽûÙ99ñÐEݧS2†1Œ%±’XI¬÷yïóÞçÊÊÊ‚ ‚ ‚ œ|œ|œ|øòœ’<àñæ‰ëF)lÂ82/E ˜¡dÉ&ã?ïþ5]©¶è›f×ê·7©ô¨ÍK×Ü=Ó…öI;ytÆài”Þ9<1›Ò{G'½¦4jûP•1řҭ§ô¦ô‘ršvÉþÈÐQf?f¯Ôeߪ'#žøÞéÖ¤Õ#‡]:ý4.K—þfåí%Á¸&n$r#‰L3rÕØ„ñàÿ,‡¤Ü(G“Á„ÏŽ9/r^ä¼È˜;1wbîìì½³÷ÎÞÒi´€w7ªÛ÷þ Æ0†1™AfœWz=êõ¨¿+~Wü® 7 Ü0oGKbI,ÿÖ{{ЧxÊÍk­ÑZ£µ&èÇ ƒ~lÑ«E¯½$+%+%’îµEÛÏб–›ÎÐ….t#cd£=F{Œ=z ô€ÝD»‰vä5S‘ŠÔOrÜÇׂù$Ÿäoi±¥Å–ѾѾѾÝÇuן$íH;ÒN°4>Ð 60Ãð¡FÐÜ1½Û €ZªZ4ø„ªÏ‚ñj9³Úö[ä¼×ÄL WˆNzÿuJ…O· Ï9 ìn°»ÁîÐÝ¡»Cw×{[ïm=>–s0s„î#ð+Ô^r•è¢\½1Zåò©¯¬ìLµï2ÇQuhrÆéKt¾`<‘’–ˆA{âJŒPÃA:D:D:„Ë ô4èiÐS.<Ô¿•+ÿV¦õMë›Öç¯Ë% B‚~y'ëñÛ‹±‹ë1šm4Ûhv —.-\‚N:øUàW_q9tú8ôqèÃ|Ë|ËðžÐD›híŸåþ+wÛ ­Ð ó1ó¹®Ý]»»v* * * ¼x)ðR“QMF5%z(z(zOxÂC1Cÿä댶@˜’2ñ"•ˆŒ>Yw¿<ˆ¹ÁhwãFºÏåÛ;%ùηïøã„ ?>=ðíɯL :Ÿ<ü0¥Qû'+(}ì?͌҇>S )}2¥ˆÒ»ê3«UW5ÇHÀcÍ·MœÔ6hLŸžÁ_97m´Ó>Ù°ZÒPTÊôû•|Lúâ!9IBp…l!ž8C$¸‡I‹®ðøY½“_owâM¼‰7.â".ZYXYXYœó;çwÎïIÒ“¤'Iý³úgõçó*0¡L(ó!¤Op›ùËÏ3€À àLÌF"E<Žyó8æd‡“NvÐuÖuÖuæåYŸáž}ò»’B )ÖaÝwYófæÍÌ›…‡‡76olÞ˜×Há?¤?Ï´eܯÈ@ƇÉÓrÓrÓòÐ{¡÷Bï5Íošß4_rMrMr ýÑý1 Ó0í#ß· Á€#é"é"éòCæ™?d>}ú8Ôe»Ëv—í|GèJº’//?ŒÀoâ 3}D DËÒÚø6Qºlý×'îó¾é©Ø¾H¢ÉPËLãÜALYC<þUõPWCÆ&0‘Ï’Ï’Ïju¿ÕýV÷ýçøÏñŸ£©©ÉË>Á ^K¿‰â¯+RBV|X`m5ÈcÍÒªŒ«ïÆŸª¹z}â8 J£¾Ÿj=áJ¯IÞ÷€4bî0­‰§Z’ÜInÔ¤g“AM-Z´€›Ïö{æ÷Ìï™a­a­a-~.ä—sLâÑOÖ3ëzÞs/Nd  ¶AmƒÚ÷x÷x÷ø o‚¾ ú&`UÀª€UÁ~Á~Á~K—4.ÑX¡±Bƒ—Îäó°F øN¸ßÈEMpsç³f;ÌvEEEøùùi}­õµ¥Ã»ÓüßuUל­èã1v /YN\p‚Ü!=pŸì&>¸€™è ¿_žÀ<ÆÐOãfK÷gÍJ&_é5®ñÕÛš›zv/+QF¡:{cÃøn”Þï7¹¥ûL©¡ôaø”rJŸL–ÁNºIÆßL0=ð.¢cäž•Yçhí}¯á û†NâÑ)Æù7›¨Jt›i"Š`V“9HÂa ¨Ó'™?üqT'r€ f‚™`nwÏq=Çõ]]]}Þý¼ûyw;;;.¾…iÌ4fþÞpÉ)dÙ@6pÛ† C…¡âpòáäÃÉ·GÜq{„O©O©O)÷Îb†1ØaŸü†¸ø%îé7¸¹žr=åz*” eBÇcŽÇq÷ƒé˜ŽéŸuåÎÀ Ì@´AÉÉÉžfºÍt›é†ö íÚÏt’é$ÓI|I.XŸ3÷?VËÖbì[Ø·°oq#êFÔ¨ó~Ìû1Ï ß ß Ÿo‰q"N³ ðsè@“ávr}i,Ó¢Üý ¥+ô†$VÏmÝï5¥Ë¢‡øšÚ˜òù,EÞä iý/¬—xùa9»ÞôzÓëMëÖ)¬“«¥«¥«%â‡8^sƒsø¿‘CÊ Fæ-ãAÚp»'_ìS¯™ŠÒG¦ŽW^{ ìûËÞ#zÏqžmä $Ï«Æ3ÎÓ:44¸2èH˜VHAp„¿¬•ƒ/kÐT¶ÞZî<ä(N 1}ÑŠ¿âßó1ù³wìaÏ+0p¡EÖ­;[wnu¨Õ¡V‡>|¸'pOà___³{f÷ÌîýÊ)OørÝßXG»F£F>¾]}»úv ˜0%`JPpPpP°Õ`«ÁV¼›€þóû—s’ÿˆ]Dc¦h?sƒl½frȱÿ»JJ톇Wvìà>÷ržvómö3ý·²MnÄC飖SQU>Å‹Ò(Õ”¦”Þ_5¹¥÷¢&3¥Ï/ÖµõZÆúnÝú,ß6|ª¯sg'ßqö}ÌÆh´ÿÍKNC_x1×ÒŒ9è‘FÄÏ0ÚPÿ)ˆù˜ËëÄ„˜.m–Ž–Ž–Î–ò-å[ÊãrãrãrçOž?yþd& dÆŸñÇB,ÄBÞCWàϱ뱞„‘0ÆX3ÖŒõ"ŸE>‹|æ$ÌI˜3pÍÀ5×pE‡E‡E‡?ù 7g”sýÁžØ{oooiˆ4Djênênê·QŽÇxŒÿÔp|»»»œÐ ¡B'x~ãùç7L¦?ÓŸOÅ­ìýu0`øÔT€v™í2Ûe>4{höÐìÛÍßnþv³Æ øò¯ð ¯„GáßÍ N-A5H%‹ÈhXSPš{¢lmE!ä)ÓGD{C„Xq¦Æ(©ø!æTáñ_HØþ¹1ƒ1˜Ëý)Ök‹µ Ïž7ÎÈþ%\ˆ§µ|Çqœ3%]¢]¢]¢¥õ¤õ¤õ¸ähïV½[õnUÆáŒÃ‡±[°…%/@>òá†z0Dc8Á 0ÞL(©ÀF²x‘3ª0ÖƒPEügxk‹ŒÉ[“ezW4Z¸n·§ïÕe²_?ûµ®ž~V•&_éåªßÒ“k7PKä“$G‰ìÈ’ ÔlPù—x ¬ÌÍ{UÔ­²õÓ‰ƒòj/T=ØžÚÿF`L@æÞ÷’Ò‹ÕoªÖ)NÖr¿:ädŠ™¤-éƒ8±åìtjN-лqÑÈd·±U´e¨†@£ÿÏY‚ý˜á¿Üxˆ1ƒ1e‘e‘e‘û_íµÿ•û.÷]î»Âz…õ ëu#ýFúôÛ'nŸ¸}‚Ô'õI}ZE«hÕ' üý¨û1ùqãDLÄDf'³“Ù©¦¦–èèèÀå(uÒtÒtÒ$$ƒd¨"U‘ªH>÷gwtG÷OòK]à.cƒÌXf,3–µ•µ•µe=XÖ£lÙþ²ý|`ýç75°K°„s7ÊVf+³•yyyz+õVê­Ô.Õ.Õ.-.(.(.àä8Õü¿Ì‚Ë­”Òö´=mo{Öö¬íY k k 딇)SVL¨˜P1¿––*ðKDȽT^õÖ™©Qº²÷0·òÎsÖ÷›HéJ ]±Ðë±KC~ŒZAÜ=¨ÿ æQ¸ù .i<ŒÑ^£½F{CtBtBtšå5Ëk–'‰’DI¢¸è~>?¨€Àï§®¯ð&€—ø×qÕò¸a¢f·Ä¡ºÌ~݇RJŸ†RJéó©”Rúü)¥”îõ[·a|ã1]&zF„^m2ÓZ«ÙéúMçZ4^§e*m+>Á<üK·¦(Le‚ɰ¢y̲JÔ›YNf1G7FJ–#ƒ $؉ËXN°‚ñO^éugsë.œÍs<ŸØH¼F¼F¼Æi°Ó`§ÁoÞ¼ Ô Ô Ô ŠŠŠöÑöÑöÑÖ·Ö·ÖÿyVÅC8„C?ÛÃ]¥ŽéÀí¶O·O·O* * * È È Èô>î}Üû¸t·t·ôƒ¾ø~¬ÅDò˜ôÂmQ 3…L$óˆ ¾ÿ­šQÓ”JDÇÂŽ4jCfùÊ¡IÍéþKÆuhž×ñ‡·ÃžSzïö¤,JïwšìOiTÎOJ£NN‘Sú°ÍT†Ò;7'æ&ɆÔ?ÝléÚ'f]ë·¦in³³õ»›ºŠ1ñäÈo]—™AÞs±®H<"ÏÉ D£=š£ÿçÿmb#n=Ddä&¹Inr»'WL®˜\›››p â@ÄíáÚõ‡}¢Oôë:2ýK¨ÛÛ9ÿrî#“ë“œÚØ‡öÿ¡©´ßºà8f3õQõ›W4¯h^q;ávÂí„C+­8´ÂÈÞÈÞÈž¢“Ådñ'Ç8ïv-hAËÈÛÈÛÈ;¨uPë ÖMÇ5×tœ(^/ŠçËJ2¿nEÈ®påvÔoT¿QýF¡‘¡‘¡‘ Œ50âKÖÍóðWbrà¦Ó‡éÃíXºéþ¥û/%^J¼Ô³_Ï~=ùH&ŸÉgò9ý™Õ$ð×’}¤%·Ý¼ÈZer†¾\’òõêªAs“ú‡Rº¼ýf3‹‚ö{U`@ÈìÁW°ƒá¯juÿ³h€h€¦hЦHB’8½põpõpu.³_òGüˆ…Þ"ð'©“þT3Œ ·º)x¿èEºŽÍ~´³öMížÇ÷TU-öe°ó)1YÚÒ;½Ç\®2¹Òeì¥ü™gÎ ÷NºH6pΓ;—öy~3mã7ݯÜ?×¾æêò‘ý<Ç5íæè1¡}u‹vzžŽƒ¾3º£Û]î¨f.um}Ï\#;ÿèí/`‹¸@t‰i(ÑÅ3¾b‰HNî‹Ì˜¤cGö ˆ¸ 0}à dbÖÿ<çƒ5¢F´E`‹Àœ+Kà„À 4h\oY½eõ–ñÜu9 cCÂ?ÅIœÄInÓ@Ë@Ë@+`FÀŒ€S¦L xð"à…þ.ý ú ñ=Zâ=¢ï™Á¢9Ì~ò+Ù'DLÒÃb¤á%ľ!&Î?ìy3=/tÇÓ­»ÊûÞ­Œ¿N«;Žláçâë5ÍZnl µê7ë3‹ŒÃ ò Çu2•˜á{äà†¢3ü`ÿ¡Ðg©"!‚"rƒÜ 78•!.®àdæÉÌ“™OG=õtÔÐNC; íÄgv0;˜ÿ3î<Ñÿ—®öÇrY! |p0À|€ùógkÎÖœ­¹“s'çNŽóçÎ8l&œ gÂ?ᯮ3›î¸Àqã‚ðfáÍ›9·wnïÜžw"å‚¿¹DlŸ?ÜgØyœÇy΃_w»îvÝíA;‚víð½â{Å÷ŠÆ4iÓ¸§_fÕøÃMjLŒ‰1w- 7 7 ·½º{u÷êÆhÆhÆhú¥û¥û¥sÎ9¢á¢á"A£é‹àßÓx† |5Eª %…ÊÖµÏ42™qÄ`{²K-mtfi¶†,(U`Ž@ê0úÇ×§Òº »°K–%Ë’e-4Zh´°²seçÊÎ9r:åtâÅs« O,ðç¨A-Xè@jB'Ñ-d$y„üg ß\È]ÀÚá"qFù†‘IÄßC½PHGKë²iÒ£jïäÖ’J5èêÈe† Oh?›pÀ”a+¥]U(;T­ikv˜ê$ëT;HÕ’-¬µQi°óž'VMÊ\žw­lbZËw¦¥ç³N,®‘ñ ïH™n†"O»Ì§d]ù4ņÂeeû^Eʾ®^U\¿|¼bYyt•a͘ZÃÿϦrø¼ÁÇš½~ ¤/‘bâ1,R0*rˆì![óI>É'•¡1Mãœ_9§Ü4` Šk›Ö.¬fÇÚ}m7G‡èˆu:&”'$¤WiVVÙð _¸¬±áG¸¤LR$ÉušçÔÏ©SĬ%ºÌf32½AZ^z×Âô …׸۩…ê>»‡Û65Õ÷P_í!wð1rmv®þ|ÓÖA©wY-óêêôÌx›ædù]é ØË:ˆ¾ÇHæ<³€+²ršlª¼]8¡bÉ›ò¬Œ’+‰3,Šº\ø.ê}êú«ÚÑ3ÞÞΞ]гâ{–N¦‰î°0 G°íÄ:"m&–=ÆúÑbÖšn¦îÔ‚n‚?ƒÎ¹'­Æÿ¯ñyŽ2*¨ ¢42µL-S›3ÿ/ €,$ ÉBjCm¨ÍógÏŸ=ÖlT³QÍFyLñ˜â1%2;2;2›§Ãép^cêãîÃ0 Ã8%(ÙCÙCÙCùùùEŒ"FSYTYTYÄ9SÑlšM³?aÎÑOÁ9œÃ9n}­ekÙÚR@ ˆÑ£F#ŒõŒõŒõ²äYò,¹Â]á®pÇflÆf.Þã\…‚‚M¢I4¹UD£fFÍŒš=ñ|ÄóîîîÜÊ}KßÒ·‚Õñ%ðÇgÜ!i¨T=ªi¯Š+©œT $h¦ÈúÔœZ®W_+H,²“Χs)  Ù?:/7krqK/¢Ë겺¬r’r’rg¦3*FŨTPAõ!µÍ{¼Ç{¡“ üI¸ ?Oã¹Ù)Åõ²íeúóÜûŸê߸„–t)éò|aüÅøÄ.¤3³ìÓV§Ý©sü-qQòBý°ì¬d‹|¯š™¸Fý‚¬ƒ¸µå÷Fo5¿5«1Ô¬owÔ ÚÏêÉͦi÷6NÒ› >ÚÎǼ½ÎK­ùêÒ]jï¥Ñ♉j>âcòβ41‘4‘u—8²™âž€Æi‰¡§º\ºÄp«E']• Ð •Ri šÀ›ˆ•¯ê.f*"U†ŠûŠþµÖÕ;”—kí*ãýj§Õ<¨…*¡¥¬¢eªaNrÉWi÷ÞM.­—æ”Û­4þ­í»¥=rf½ßS¹ª ¬$»Ê¥¬c©FîµÌái»•Ä´Êb¡u˜"®¦ž$RY«òg<Œõ¬•ÎWhGºSBmsó»¹ÈEnLï˜Þ1½UýUýUýÝç¹ÏsŸ'>">">R;¤vHí´G{´¯gòàTbæaæ©oUߪ¾UÞAÞAÞ¡R¯R¯R¯¢¢¢¢¢‚O¯¶+°âŸØ©iÚ„6A! Q˜{$÷HVc­Æê<×y®ó\‚þý 9Ës–ç,çûç.õû[™Ó³ŠG<â¹1///íkÚ×´¯eŸÏ>Ÿ}¾¼yyóòæL¦Ó};f_ ¯Í/?> ¾œÞ@ X4S6SÙ¿¦¬hi¥R¡ƒ2#=­­Sûˆµ48"Ÿ ó #§É¨Z–Ρ€¤ÿhÃ= YÈâfèVº•n%{É^²W¼L¼L¼ U¨Bÿ=Í- yËþ:Üpÿwq— hÓOÕ» ™ß!Ó&Ó&&xýàõƒ×E­ŠZµ"÷É}rŸ¶ -h‹À/åF~5¨A˜v‡;ÜÍG˜0aâbâbâR¡ªPU¨Þßzëý­ò§åOËŸrŽ%tD'¡ú¡ßG¨í×xלOvRpRpRpa^a^ažY³þfýë5¯×¼^ó$q’8IL®“ëäúG›¨åÔÄm‰-±¥5´†Ö¨U«6Væ-ó–y=+zVôL™¡ÌPfðysÿŠkÐÿ–x€\º%•H%R‰rÏçžÏ=¯ÕN«V;ó@ó@óÀççgŒÆhŒæWì‹P„¢ß5/>ƒ0HU *P º¡›ãÇ)ŽSZ -…Vöœì9Ùsð¾ÂW¼Õ!„¥~1üñ÷u¸ŽGˆ ¶bEu‘Ò¾¸ªjKu´+¦“ª?ÍSM40’Mç‘©¤-j°…¿ùG¿ª¸™žHD"’šãÆ5Œk(™)™)™Éú±~¬ŸŠU±ª ÙuT,þ0ÜëŸKs}‘ˆ”ì—ì—ì×®»Hw‘ÈU|R|²¢²Ê¾Êž´$«È*’N^‘WªD6]Œ$ ¥qè¶ðÂu´ƒioÔCšÁ^Ä Fp5ôaÈa ch Ð &Ѓ:}4äVÛ)—©¼8ÿ'CøÀÈ:wú-:‘`¢‹:4*eu†iÈeot/kÖ—Iµ5zI Ýu:©)¬sM&k}g³Ý¤ƒö^ë6&QZ§mŠM6kß4Þ§7G}ž¯ÖJ™½dµHÊ4•4‡3ïDß‹o1[ñ‘ *'·Äo´§¨5³öJµ.6Aö†Œ¦Úµ+Q+ âAÁ´üÞ¶]ìÞgëzyŠ—Â !Ê•Öéø±™9Æ9¶,n 03Ä^ô몽ÕÑeßVþP÷ôMRÇ<×+£7K7¿gø¼GvûDÛLÿâæ9Ëß?ªà2&î—Ú¼?`“û‰Kx„tœÀ-¼¡_Ó•¸¬šÈ¥3ðoQľ×}EÉËØ ( à 5ZFËh–a–Ž?8¾enËÜ–¹®†®†®†Òi„t}üúøõñd)YJ–ò9)àŽ|´™éOgÍÃ<ÌãLv¹‡ÜCîa“b“b“B½¨õJ{–ö,íYÎ…œ 9²pZ%Ýd¯{#‡è!zˆ ý,3,3,3L5N5N5öHöHöHv˜à0ÁaBRTRTRÿ^ãfþúš÷¢NÕ©:gÄk³Ú¬6K=©'õ,/,/,/äÒA %”7QÑÿ`”.@ ¸lµïF¼ñn„ÕV?Xý ÝU»«vWƒE‹ ½¯x_ñ¾‚_qúý3\Ÿw‡;ÜÕç«ÏWŸoWbWbWR1µbjÅÔôféÍÒ›qW§{é^ºWðnøm†¡‰LÈhTq;öÙuïw–ҕLJé)mæoYöjN÷~!ÚýdG$Œ×µh ¡ò~?Dè=î•`¢a¢a¢¼(xQð¢&:MtšèˆY1+f¡}èc$FþÌœþ«³ÍÅ^Æjt&GI~dÎ2êÄ]´ƒ¹@6Šçˆ¾&Õ’Yb{f„h3Ivÿ¹ 2Žd7Tâ¢iŒ¦ÁÚ·Ôü½4Î{u~æçd?f|ón7=Ê×DŽêã§ú¾`ÎŽÖk~œ¿ZÕ¥ß#«í«{ÏH´ýþAÄþ¼Ógl‡Û)_?n/¥×ÎìNéÀQ³Vd¾=þÖ EEÿ‡«ª—ß¹E«¸c‘27vÐãõ+´Ú/Ùí>Ó;üP¿ÅáM]v›u5pÕè„…ŽÀ_¹Ï•$—X‰×‰&–iH¢!ð‚%ÿgÑŸÈ/úeSGô”’R†¿ þöAà 4¼žt=éz’çpÏáž¼JCÆæÎç™…š3›¸ç‘“ü?âÇ 4lÐ0´0´0´Ð“xOÂe »È.²‹4%MISþ 2È ûh÷3 £0ŠÿÔ±ƒì¦î˜ºcꎗҗҗÒñ>ã}Æóodæ=óžùx.aCÿp   ðºëu×ënв eAËŒ6m4ÚÈK…nÀløÇ¯NsIå¸L¦0…©s'çNÎÂO„Ÿ?á®á®á®¹˜‹¹øßã{>)ÕïøÕ\Ê*ÎÁÆ`²ÁdƒÉ—¢.E]ŠºÙòfË›-G9ŽrÅ—Ô"ZDKZ~ ™ÎÄ1–0…Ô7tjó¬Y¥«†÷®.ž÷|€nåáyŽý_8®5Z®×ƒïX¦Ø9ÿøß^÷aãf)¸„2OðOøåQ¿Ž1ŒaŒ+¸òÁ™Åé¬ÓY§³m|Úø´ñ±ßi¿ÓþƒD#ç¦õw†vÕ}áô€?ìQ„ A;aôÉzä2ßJ\EÌ2œ‰alI+ò„ôÃ$á{ ú+—›JŸ‰n[e¢§åçõÈ©Âø~k³fýln ðh³Ü½×ˆ‰mÇ8·9ÿÕ=ýsI—(¥ô™¥”¦. ”Ò#Ó+º=4PëÙù·G"=2•hà;&‡iLÂÈ 2ј?M:0‚™þ‘àÌwNZ· U¨"ÓÉt2}eÔʨ•Q1ûböÅìÛš¶5mkšD!QHÄ…¸¬ÅZ¬ýì~KÝ÷'0ÝcºÇtO°n°n°n«>­ú´ê£M´‰ö‡’us…~ ãUêPuuuå> ÚOm?µýÔW_m|µqËî-»·ì[‰­ÄV¼à §‡öׂ!ÂÅ$Ȟʞʞ¶ºÑêF«þ»ýwûïæ*îÓ«-Ú¢í¿¤?ç!yœzŒn‚n‚nB€V€V€–_†_†_†ÖN­ZFìD$rÉÒþk·êBº.ܶ³®³®³îcõÇêÕϼ:óêÌ+É9É9É9Þo¾#:¢£0¨ü$Ìa†hÈbƒè&z´dåa½æÝ쟥´Yà1Ý/Î~–åw|<ŠÜêM@àwÁåçãž5*¡êÝÜ»¹wóÀØÀØÀXá†C ‡òKÛ9ÈAÎgý[Ô …&Ѓ:a ]43L/X£=ZÀDZmÈ,bƒƒŒ?9‡Z‘ŒiMzˆ®2qä x¤¨)a(F~—#A„çŒÊYÁW:¼üîåw/ÄnŠéÙäåé—æEþÐso#`ÃYÕ³;ýRgŽômcÉ”Ÿ|ØèCOˆTùäpéÜÓHIãv84rhäÐèŠáÃ+†?6îú´ëÓ®Où♃ÌA~¾öskN"ÐŽp”דד×kÚ<´yhÈÛ·!omÙ ²ùðÉzgq–Ï6ð‰³ˆYÄ,â¶Ý,Ý,Ý,¯ä]É»’wæô™ÓgNÛšÙšÙšq%J¢$Êpɉ˜ˆ‰\Ëî0Üa¸#¤SH§NÞ;¼wxï WÈò!²Æ°ø—ôd.Ç —ƒv!ba£ûî7ºßÚ©µSk';‘ÈNÄ'ƒ;ƒ38ÞþŸN¤éÄ}âv½ÒõJ×+ÑvÑvÑvßÌýfî7s Æ‚ùP{œ¨€Ào÷&·aº> ãXUË7 ](]f2ÄMÙy¾ícUÓ…¯>ínÝè´S?|4"Í¡üR«L@àwég\ÄE\„Ì`¦?S¦þ̈ˆï ï ï ‘¯ÈWäË™|š«‰Yw†»á@¼‘‡eŒÙŒwL ãMÚ‰®0±ä{ñQ{òL%:@òÿïS’€0’-}Õ$ët[®h¤ÛÒfŸM…Í>é~ééÏS…siÔê†| ¦üÇ…«Ï¯ð¾â¾¹ÝÇ'OŒ^½$zÉé°Óa§Ã̃̓̓ñ ¾Á7ä*¹J®~¬<£áiåžÁ§xЧð€<\f¸Ìp™v2ìdØIÏXÏXÏXÑVÑVÑVÇqçtÍÿ¦ºåd4ƒŒ`yžÜsÊ­‰q¦ª l`cw×î®Ý]á:Ãu†M)šR4å­Ç[·ü 4÷´rÇþi¤0`èSú”>åB{_†¾ }Z®_®_®_¿Yýfõ›i-ÔZ¨µ[Á È2áOÖ —#– VÝNÝNÝNºYºYº¹¼Yy³òfU²*Y•Œo©«¸Š«ÿBáBNð”K¼e Xä3ùL>S¡V¡V¡¦­§­§­§¨¨Èå^ÅÜÁŸÕç$Ó™t&¹³9¼vxíðZÿžþ=ý{ï|Þù¼ó)é\Ò¹¤3Ÿžïkú5ýZB~ßsúŠp›Û¶7²Ò‹xÇNÏê³—5ZØ0â¥ËÛ Ù~D­WlP0äЀ–؃ñ$G…zø/$  ܦãÇ#ŽGÂÞ„½ {ãÚܵ¹ks^C†{1¸Áí'ç ?gpp³€œ’Ï/¿«½ S{¡ÞåÇÓê]ä/Vï¿ÁR§Î„© €þØþР "(ÏüUsÆœ1‡-lak/µ—ÚKÏí8·ãÜŽ˜Á1ƒc÷èÑ7‚/¹‰ÙÄl⟈O=ï^w≠EèWêWêW®\¸:ð›Ào¿1|gøÎð_ò.îâîÿ¸BÇb,Ær÷¯££s6êlÔÙ¨Gk­}´Ö}¤ûH÷‘œž:o2þ¹êq"Nĉó\7_k¾Ö|m˜K˜K˜‹û÷'îOxaJN.³Z¡Õ¿¶ûÀx‰—xÉÕ†ã|ÇùŽó[Ïk=¯õ¼ú~õýêûavaöb/öòA«u™‰ÌDfІ6´Û¯h¿¢ýŠèFÑ¢m{´íѶGÇ5ŽkÿY |i#äŸ;Œ–cà+xÀ>+®Ø´¬°òŒ2«¦šl%_“FF žötéw¢0T¡eá=Ò¡ Ù?4Õ‚€À§†S$hƒ6h#Z#Z#Z£ÝM»›v7Níøý‚÷ Þ/àµ÷ä=yÏ¿þ Ü\7 ˜|äóÞ¢ß`¾È^ Úíòåj·êÛí4ªo×.,<_»P-swkµLÙ’±ž²%"OÆ]䉈Àã8бÛ°çgF¤°ÒøûaÀ€a³Ùl6›iÈ4d&+“•ÉÊãÛo?¾½öAíƒÚ_õÿªÿWýmÓmÓmÓÙ ìva KX¾?]ms½…ûHX€X š š š`WkWkW+~ ~ ~#É‘äH L L L1s0‡wŠøßö.Ç'­¼Uy«òÖ+¿W~¯üÄ7Å7Å7o4¾Ñx.q9ðG1…)Léz€@ JP¢•¤•¤•$š&š&šVµ¦jMÕôFoô&•¤’T"±ˆý×öanu%ÉHF*P‘;&wLî˜Ê)•S*§{{{j:j:j:bVaŸ˜‰©óËz[ŠR”šÊLe¦2…: u¦mLÛ˜¶±¢GEŠÜÓA]©+ÂRþä[Äá[n;>c¬a—&”.>5è¥Ë ¾îwgï7í¦a éOî+ô†/Nbz õ& ð+T¢•Ü+P/@/@/ àRÀ¥€K-½[z·ôVgÕYu–Ï2x'qR¨°OÂKÀ€ÖøY`=ÓÂÞ€i!£[Öʨæ£5oèn0í¯»€éO§Ñ'úDNp‡ù0!áÂy?Çs˜RLÄä­ô÷Œ!Ü'—ýt"&bbÃs Ï5<Ö)¬SX'‡~ý>ˆÛú¾|ö\n%‡S(ŠA b \4pÑÀׯ5^kôïÚ¿kÿ®hŒÆh,ŠE‹¢…ABàÀ€€ÈÀ ‡¼î,¶¤Ã"Z³øý  Z³¤ù 7ÏdcŽwy­ý\}¼ߟÇá5Ε' ð3¸¥Õ:aaõ´ëi×Ón}½õõÖ×ݸpÀ—äää¸òŸõŸÌs,†9ìÄaW·ˆtžKštž£¾K’£¾“ÄÑÞI¢Y¨Y¥Yø³ó4#õÑ :Ðøé?!¤õ·kþ'Ñä‘<’ÇWä™fgš¹»ã;î ¼3ðÎÀ€peú1ý˜~¿<ÃGãná·©k¬k¬kì¯ç¯ç¯4%hJУ7FoŒÞð%Ó‘ŽtþâsXoáç0s˜9œ³JcÓÆ¦Mce±²XÙ±ècÑÇ¢5¬5¬5¬ù©Ã8ŒÃàüû°û¸«È/É/É/ù®ó]ç»Îwïß=ò-ò-r^ƒã0ã¾ 5¨:ê13 fÌ îÜ-¸[‹A-µ$^#^#^ïòÕG}Ô'_“¯ ï³®7Jo”Þ¨ýû=ö{D½‰zõ&ø‡à‚à[ós¹&¬æ}™üÙ nѰµPaî ºP½ú«šLˆ‰ñ„˜ý†¦j¨K­$¯uãä×eÙPƒb²‹ôDˆPé?à ^ðÂ0 Ã0æ-ó–y«ßR¿¥~ËÚ®µ]k»–h–h–hòó1œ_;·+𩡨äƒNlÌE6Òj½‘’8㜕‹^Û*%¾vL*,Hxÿ² Árœå ËqõÞÔ˨÷F,~ Æ#ú PBøˆúÂVPÁ BZE«÷5OAùÀÊSô=ÅüÈüÈüøtäÓ‘OG^¸xáâ…‹:‘:‘:‘;ì8°£n ݺ-èvºn'#ÉH2ò£©¼sÆw È™ãŒ!cÈÚ®²]e»J6P6P60wîþÜýÝ ºtÃu\Çu´G{´çƒP?‡L,X:ŽŽ£ãPˆB¾W½W½We{g{g{ë<Ñy¢óĺ§uOëžPB %¿^ô{Öˆ¸2œÎ•"ˆä%òy‰ú=õ{ê÷”vJ;¥]•G•G•¿rGqô_–úK8“šs ÒtŠ:u(êP"-‘–HÕ‰:Q'f3‰™„«Ù‡}ØGŽ“ãä8'(©o¯o¯oo±Ãb‡ÅޢܢܢܴçiÏÓžó­OãiüQ“¿òØýÙ•Ô~úÚ{׫âau€ 4¦Ïè$«9Pö½DW•½A5jP‹0€´*]@àg8ÃΜ‚»\O®'×Ó‰Ö‰Ö‰V¶Q¶Q¶ÉÏÏç•7Æ` Ƴ,3ÿy1²XäQWä!c‘OTÂW«…v…²B»DDßDJEel¥Âù{G8oÔÆc¿QÆLß1Ã=Õ!ÜC†Hp%Úp…¦@a¾.œÏúŒÀšD“hRmvmvmöw®ß¹~çúFçÎÎý —f/Í^šT“jRM>¼»5¨ùKæ{]˜ÆhŒÆœjŠkÅZ±†s çÎ-ŸP>¡|BJÓ”¦)Mé3úŒ>ãà Ÿã9žvÝXNåTŽhïv½ÛõnWÒ£¤GILOšž4=é<Ây„óÎé…‰ab˜˜ß¥ÕÃÍÐÄAäê\=\=\=œ‹Ø)[þ¶ü-ï ÒíйÈEî2jPPÜÆmÜæúÛ‚mÁ¶ÈÙ˜³1g£èˆèˆèˆq™q™q™ÈVd+²Åp Çp¼À ¼àDt^ê¼ÔyirÀä€ÉBƒBƒBƒÔ#©GR`¶a=AOР!ðÇG¶KHÃ!n{Á̰ÝÞ‹(]²sðôÚõ ì<)‰šç: Ô×Ïn‡Å ®ŒÈÄQB½ üŒ:º¿¶mÛ624dhãF5nÄ'õàЃô„ û,¨;É¥ÍâBÊê ½D*¤— ò¨äkdÎÐÈ’{´½.÷ E)úPŠäè‚ltùé@¹P½ÿ©DH?HXKb¹ín#ºè6âѳGÏ=»ÜÿrÿËýŽ G_²;éþSæ¿]PÇiDã¤ÆI“¾Û}·ûnîÜ!¸ƒY•Y•Y_r#6bãG¸â§Ãö°Yˆ,D|¦ˆ1c<Æx¼¹øæâ›‹Ój¦ÕL«áo_›Ñf´Ñ Ð鿜“S‰áÖ%º¡º5èÝ wƒÞ!ÏCž‡<7—˜KÌ%|.ïÄ—9é°°óz—*¥J©ÒgŒÏŸ1Á¦Á¦Á¦Ç Žð*1L[¦-Ó–ÛîÍôfz3Ïo<¿ñüÆê]«w­ÞÅ÷íd _2mp)xXq»Ê@8ª³7¨¹ædI_ñ Þ²®?¾Ð^ÒÍ„Jàáò>Æ 1œ®ßS¿§~O†0„!ù_å•ÿïéAs Ì>êÎG–£圗*aGŒE"Æ*[SMeë÷FßU¾7ªž±ôZõ fÇÀ5Ìõš}™ê52 —t™ÖR¬Åi˜ã4^  / CÕO%…Õ%”Præ;Í¡94‡Hˆ„HÎõ<×ó\ÏGšL0™`2aØìa³‡Í&·Émr›O…“‚¤üa•w®Î;¢#:rZÚ¤©GêÙ}k÷­Ý·êÝÕ»«wÏëš×5¯k“Ãä0|@!7·ú˾ñùÀ霡E\¦ˆ„ ;vn)ÜR¸Åq—ã.Ç]š•š•š•l)[Ê–þ,ÅÕo¡5¨q뜓’voíÞÚ½i1-¦ÅeË–=äœsøò_¦k÷ÑrGqT)UJ•Ò‚yó æ‰v‹v‹v›4;iv’L!SÈ–eY–ÅhŒÆhç!ÎCœ‡ÔN¨P;!}~úüôùüÚ,ׂB°ûÌGkøqé°Š¶Èƒ)ô¨%asO¼DÔ]s¢¤R̵“ñha1X@€7Vc5VsyµöjíÕÚ«q]ãºÆuåZåZåÚbÍbÍbMÞèÞèÍë¸ |žpFI2ÒŒÍpÂft† :c¹qªOªTx÷Ô­ðVÒ+Í•T´jC©h•VÊì;Z)¢cQ Ü ‡Øfc6fÃv?…Ã~ÉF´BÊP& ´¶7Çä¶í›ëÛkm¦^‹Ö®8<·Q¿TJW_~hÒó–á †B9ÔÅW² ¦Ð†¦P{_4AB/v‹Ü"·Ü‹Ý‹Ý‹Ã3Â3Â3êm¬·±ï/KäDNä21ŠÀçg0þ'L²3-êéIâez¶›y¶’úF.ªúFúSôgèOùÙYº1ÇÐ 2Ü‚ ´Áütæ/шçÜ“&a&¾2|eøêÄ‘GNyjÿÔþ©ýÄØ‰±cù'hGÆñGýßÏ—Ã’s]»‡{¸çrÀå€Ë°¾a}Ãúz,öX챘éÉôdzò™/¹§øè´@F“Ñd4·=?~~üüøgûŸí¶ØÄa‡Mä]ø8ùK{ØÃþ7Ï£A4ˆ·íôØé±ÓãÖwZßi}Çv®í\Û¹|¡k¸†kB| ‰HDr+izcôÆè ¾|5øªïTß©¾S™sÌ9æœg3ÏfžÍî<ºóèΣÓe§ËN—éæèæèæpTuë\àËä¯ 7qx n³zšŠ².%Õß׆ˆÏ‘ÃÄ P‰Ù#–Eº6ZÚP  •ª¾ìdz ÑŽBÕ |ÑpÉe^á^ÉåÎrg½fzÍôšUݯº_u¿Ð«Ð«Ð Žp„#=IOÒ“¼J†À?nI»÷Ù-¸²&piÃQQTÓ@Q”V“¾(­æ­4Ãö­Ôè‰Ñ%£'γ9ÏÖš£.Õšƒ“lOœ„þP@]TuØ9lñAVRö…ðœñ­ Mh7âFÜ êÔ/¨¿O±O±OQÛ®¶]m»öÛwlß±aiÃÒ†¥tÝD71ÙáÌpþ9ª;;ÎmsF§Žâ Oxùùùšo1ßb¾¥º¬º¬º,¹yróäæì1ö{ ¶°…-/þøÏrZà~i*R‘Ê0\B«Ú‡µkzLô˜è1‘üᆿrg8Ã™Ž§ãéxÜÇ}ÜWß®¾]};«Çê±z•+'VNä]n†’¡d(/zø%íráÎ6°MiPiPiPáw…ß~§9UsªæTÃ"Ã"Ã"{•½Ê^¥n¢n¢n’®HW¤+*õ+õ+õ¹'AOFà¯î¯PüÁp¯1fËè©ÒuJµZkQ(3œ(6žílì¦i­þ N^d'Œ¯q­` ¡ê¾P8³ƒ 95 L´¦iMÓš¦6Tm¨ÚÐJQ¥¨RTšYšYšÉ#0#„jû—@Qõ“6|.ƒ\$«´‘ /„à K±K+²*2*²n&ä'Ü,œ’ûuáík½Bµ¯i´]wG£-Yh–H¢\EQŽ4Z4ø2«à (uøW‡­Õýˆ„I˜D¦’©dêÅÇ_||kö­Ù·f¥¥¥^1xÅàÒiŽ4‡v¤iGbDŒˆÑÿ×"½Ð ½°‹±XR&)“”Ù±v¬+‹Ä"ñÛ„· oÊBÊBÊBp'p‚7ü'™ÜÇÆ[¼ÅÛøþñýãû+2™ŠL‡®]ºš63mfÚŒ÷¥^Xñ+çñeX†eòþòþòþê=Õ{ª÷¬|Qù¢òEÅöŠíÛ¹°Tºn ÅqÎaæ".⢪«ª«ªkžCžCžVbVé:éÖ×­ï4ÒiŒÓ¹¾ÜPn˜<8yHòeseses^O†[íøs[ìÃî¡S"¿.«ˆÉ7¬[ýf‘ÞÀN´zÉöÁ²È«ƒî´ë.,ÑÇ` FfcˆP{_(ZЂ/‘p]ëºÖumhƒÐ¡ ì¯Ú_µ¿Ê—œˆ‰˜(TØA]w‹y˜‡yhe?¹Ó<“šá™Zܤ µ8Ž—Ökt”­.[ËXJ™R¡ Ñ 1m0ZB‹ßÿo i­›]µ˜“bþiJwMwM¿œp9árÂcÃdž ;ì<°ó@¾ä]r—ÜåÏP×mff€—-v¼êxÕñjèžÐ=¡{šÌj2«É,f³ÙÆË#6DC4üÇ×^=uÍ–š-5[°8`qÀ"Ê/Ê/Ê/Ø+Ø+Ø Np‚¹An¿tâ´}¸u½z;ôv«««59ÖäX“cLw¦;Ó÷çôyêÂõ¥nè†nRs©¹Ô¼E^‹÷-Þ·ÜÕòhË£»òwÕîª}‘ý¢êEU‡ ötØ d‰F‹F‹FÿfÔ€Àï¢Ë1€"ùbérÉëñCtˆ£tqÚ Í”.Ú8pûc·1>]¯i7S+‘-ã2ìø0D |Ap¦†<àÁíKŠ%žK|—ø. bƒØ V{‚öí Üö­|ü%÷g˜Á«ð«êß¶#¾­qcu…Æ MgÆkl’F¶ë&ê¸kÄ¢±è€èÀïù·ŠÇÕI±TW»}ä„‘FNˆŽŽ>]xºðt¡ÁdƒÉ“ù£žážñÛQˆB·©{W÷®îÝ@HÀí€Û·õªõªõ>°nÅVlý•–ú'2ã0ŽSÂ!á$œ„O;mì´±ñëâ×ů3tÌÐ1CùŽ“Æ¤1i?;VÐ@&2‘Éí°ÚfµÍj[ëÅ­·^ìÖ×­¯[_¾äc<Æc>ËGÝÏÅZ(¡$ä-yk/¶ËµËm7´m^Û¼'—/¿›q×õ®k“CM¤Mø<LSŪbq(¿‰Tä@ŽZ¨ªíkªäí/oZݵ"f;ufGÐlí2I¼$P´‡y(€ú0‚¶Põ_Übñ$LÂ$ÎVï†Þ ½Ò@i 4°ìzÙõ²ëo+ÞV¼E’„7xƒ7Âó×C8‹LCSLƒ6DÐF€h$j[¥-©mUa;U£ÂVi¶ÌEi&î:¨¸«Ù¦nÃÍ6i~¯ž­ù=< †ÎáÎñê4ú0€>7yò/‚Ë(Ì%iâÌÐ]dÙuðÚÁk¯½ˆxñ"¢^Ûzmëµ|óÍnÖ¯Ò|ŽöI™\2wš·øÒˆF4¢¹MçíÎÛ··¶imÓÚÆî¦ÝM»›|™Y˜…Yœ¼Pa_8ÿ¿"©€@ò^ÌpŠñaÃ)nߺ–¸}[¯A½¦õˆsÅ…âÿ¤—wà!2‚ à~/ô_`ÊsóßjPƒ§Ííò ò ò»ïzßõ¾ëÍ37ÏÜ<ã­á­áÍ+r0QLÃϵ۵´ki×242424²éž¦{šî‘Ê¥r©~ðƒú¡úýûº–ÈPd(2„¬`ÕÍÑQ[£¶Fm=Úõh×£]M{˜ö0íÁWð²‡ìá뙓ËäºåññïpïpïðÀ… ê^н {¿À—³fXwE‹Ó~éBº.Ìeæ2sùÈGþ¯tÛ ÆŸñorË+Å+eBÀôSÓOů¦”Ò'c)¥ôq ¥”¾~D)¥Vø£Æ“Çä±00 üYÃf¢%äq‚4 1çp@އ’ÒU±Ã2ª,æ>ïßAá¶àÅÀ>Öº:Ï5ø0V²ñØ+TžÀÇJ¬ÄJ˜Ãæj†j†j†>ó|æùÌ ºt!肇‡7SEÔ‰:Q*Làÿƒ3 DÔá uØö°A\F®€h†h‹h†y„ùó×x×K®ñ&=Lf›ô`£øpQO-‰=Zò;Ôþ5¦Õ ¬À f#³‘Ù(ž"ž"ž²$nIÜ’¸¸aqCã†îøfǶÛÔƒÔCÕCI8iKÚê´Õé ÓÁÿ¸ÿ)ÿS>4ð7ð7ðçÏÆÅ|¨¥J@@Èj²š¬æv÷1îcÜçÈÄ#LŒRE©¢T>O}žú<åä Ez"=Ñ1Ç1ƒ1Üäååß¾|ï›î›î›.1’IŒøºúwÄüœÓ —„«=Ú£=yCÞ7¢¯E_‹¾þeqµujëÔÖ¹†»†»†O0š`4Áh{ØöÝÛw_ÿîê¡«‡^5HñIñ‰ê¬¸¡¸ñ`–R¤=è©HQ¤Äö¯‘ÖH-Ù¯µ_Ë­`$’D ƒá—Œø/ýo‘ÃÄwˆSQZ£üüŠ6UGPH’PVBÍéPµx‰7c«1[:JÒËvÐü)¡·€À—÷š¼In’›4›fÓlƒñã Ækºiºiºáᑬž¬ž¬b‹X^š›øÀ¼Ø«ðUH§*¤#HÇK¼T¹ªÆ¨\³‘läuÎÏël¥nám¥n;½¹¦íô·aZí߆Õθ|¤v‚Á€¤Àj 5äÒ›ÈE-jºÎ?É„3g`fP{jOík“k“k“¿÷íÄo'z%x%z%zuõêéÕ³óûÎ¥K=;ôðÐCûÇö±ö±²U²•²•é²tQºè}ÜûçïŸãGüˆy#•sùàôXþPPPz‡Þ¡wÈäòC^ç¼Îy3¼3¼3¼½‚½‚½‚íoÙß²¿õ€> (=JÒ£üJ WRH!Õ>«}Vû¬ÈEä"r)¤…´Öè×è×èósÌÈ@Æ?¾®¸Ùô:ɹH )!%h‹¶hKûÑ~´Ì`3zžž§ç¹n¢sKç–Î-ûKö—ì/5Ðd@“þëü×ù¯³8fqÌâ˜îÝ-º[dcÔ"Õ"SR“'-¾µ÷öôÛÓÛhFD¨6¡µÊg ‡ &Q à?,á ga0ü’ÿõSÐUˆC&¦@…Ym2{úªT:É#¯‰JèKì4m¡£«™ÿ ù_¸«À §'ÀÜaÎ0gˆ)1%¦ÕúÕúÕú¢.¢.¢.8Ó8 X’©ÿ”‚› p¥€+Z£5Zà np«íR³¶¶K*Òž¦BÞ2ycÙ­±ód·¤Ñ=Š¥ÑµÇW·­=®ì‘h§äÝ!"2A2T¹È@4U?™,Ÿué1ƒ1Äœ˜s¢Oô‰>yH’‡L;¦Ó.Í:Í"Íâ»iß-þnñÔsSûMí×#¡û’îKÒZ¥ÎI#>(™,™\º²Ô«Ô+cdÆ•Œ+ä,9MNS9Õ |´É¿5´÷,Îâ,'¦IÑF´Ñ«>¯ú¼ê–––äëë+j&j&j¦ÚªÚªÚÊKÓrŠ4RH!Õê¤ÕI«aC˜r¶œ-g‘Žt¤ÃîpGÒö¬.虋 (BŠD E E ÙìNv'5¦ÆÔ7p70S1Uz^z^z¾Q\£¸FqMãšÆ5kìÒØ¥±‹[µ[µ[µÖn­ÝZ»«nUݪºUô èAуH«H«H«;êw·ÞÝúF3©oR߬uï’Þ%—\}}õ5S_â q°‡ÝK»—ÒHqqƒ —¢Œ¢ 4Gô Ý¨ÕÃr!JàÏöp)ãNøtι©—Âf-‰ùz¯¢Õ¼oúŸ§ì’ÄÁßåÚø;g~®‚\B õ&ð¥AtˆÑá¶jŒjŒj¼õ½õ½õ›Z4µhjaìaìaìÁ—Ô"ZDK¨1? gbrsÏ6І îKÜáÿºA4d¾Ö’uÐýQ¬*ï6û¸¼³ß(‹ÙÿÓ9Rt‡ ºóú!§‹Ô‚„`8†c8Öc=ÖsóßÄ›xor‰\"—KÆ’±d¶2[™­ø?à‡ÿrâbÝou¿=vêÞˆ{#â.)›(›ÜîR¨*T=>þÞî½Ý²–‡“'ÿìi"Q$Š‘0FÂ} ðŠæœ×û¿#“1çz1–Œ%c9SÕ»‹wï.wîÝ5:6ëØ¬c³´{h÷Ðþàé."""â?^“½&{M‹‹‹7v4v4väMÞó8óu5þO ײk±k‰ñ!>LW¦+Óõ—Å Ú´5hë¹Âs…犱‡Ç{øÐ¢C‹-ºÞàzƒë âçÇÏŸÿ\ù\ù\yþÜùsçÏ­?¸þàúƒÝ»'vO4²6²6²æFÿO¬Ï›Ÿ7?ßb¦·Ì[æpß¡‰ï‡Nÿ©AsLàÏ>ûóH!YÀmÍtÜaµ±rÝ‚¯ή™7߀ ”.9=xÙÄþ"Ï'|O wO @ #HŸŸ§ñ"Yê3I–´íÂ+Ò¶Z×"j]“g´Ý*ÏÅd¡q¦Ì_ºº3ÖzЃîáä 9Èôcú1ýD"‘H$bF0#˜ŒÁüG/b6ßl¾Ùü&ý›ôoÒ?ü@øðýbûÅö‹ÞtÆðÃ×[¿2þnj׭^·ŠC)¥³ËØe¯žRJé¯l^Ù„ËBõBõloÔ;]ïôo^æ®áÇÄ1qüÏZ‡uXÇÿõŸbªÖ…SC ±ñ;ãwÆï.×\®¹\åååâTãTãTÃ}¨ýd?á?ðdF2#™QËi-§µœæ?Ë–ÿ,34fðŸ4p>»_Z·šÀ&¤?éOú3·™ÛÌm\Æe\þåAšššcÇŽë=Ö{¬÷aßþ‡}?2~dütÓÓMO7ÅŒŽ3úFĈë'¯Ÿ¼~rŸÐ>¡}BÓÓÓóvò˜|&ŸiÉ4f=âE¼Ä3$$D=Äâ½úSô§? Ù²Å/Ùõc5,5,5,¡ ]èb ¶`‹0Ä}™| W™>8…GXÅYÕ5?–›+›Öö0|&í'º`6ŠÍîjiª¯P"T¹Àü´ýgùµz æ`æ ¥(ÅflÆfÃ1ûYI? P ‚jì¤Ç±j5ؒͰ¥•ZÔB¹oþrå¾Ú×[µÆê–GŒÕm³ÇÚfeGæOÊŽ,i[\¯¤-&c2&Ñ%"ªI¨&(R!†bˆÁ‚‚@À¢5`¡‚ }Ð}ˆq $ƒd ’CrH—Ç@ÕRÕRÕ’â?ÿx¶c;¶s›"‘ƒÈAºSºSºS~P~P~Ð6É6É6©^R½¤zIVVVæ‹Ì™/Ò Ñ Ñ Ñ_¥¿J•AOƒž=uZê´Ôi©3Jg”Î(Ö’Pƒ² ïG½USOk°Öàê´šö5í1е`-Šú»ä®Õ&óvæí–¤.ª¿¨~¦Ó»ÀwiÓ¦ |5çÕœWsîYݳºg•¼7yoòÞêàêàêàŸyõE_ô---g嬜•Ó*ZE«xD%”P~Öþñ«° «¸Ñ&_+_+_ë­ä­ä­Ä#Û#Û#»¾¨¾¨¾(Ñ:Ñ:ÑšÌ'óÉ|*¢"*ÒôÑôÑô‘VJ+¥•åýËû—÷WÆ)ã”q|^[Îäs€ûàFÔæhŽæÌ=æsè]¢«: : :@ÐôW\þPþPþ°ajÃÔ†©ÁEÁEÁE.C]†º µ`ÿÀþáÃ7†oJ»—v/í^p®à\Á¹¤¡IC“†^]yuåÕ•qAqAqA9Osžæ!Þ<}M—#g¯…r3î´5lÑWh¿ uPT‚Â`‰L‘™€ª€Ž:jÓüZ㘥…ù"K‹š»µù5wß%½+|÷¦²cePe‡ÿrþ@øÃYÈA‘ˆÄß¼‘«ä*¹jœfœfœ¦ï¡ï¡ï¡c®c®cnlmlmlm÷½Ý÷vß[ì¶Øm±ÛÚÔÚÔÚTßRßRßRn#·‘ÛHGKGKGK^H^H^¨ùªùªùâk|¯ËV—­.[o‘o‘o‘ÿ,ÿYþ³¼…y ó¾Z¨Q¨‘ü}‚w‚w× ßNø¶]M«³­Îõ¹²Z•µ,kùZrÜú¸uƒãž O…¼Z_µ¾………UWª®T]Iï”Þ)½Óƒüðà‡gMž5yÖ$³0³0³0muÚê´Õ¿ò#Ÿã9ž“çä9yŽ›¸‰›TNåTŽØˆ? yüßâ'8a†`—djLî˜Ü1¹C}‡úõ=Ùúdë“­M^4yÑdf3‡™Ãnd7²­Õ¬Õ¬Õêß«¯þ½Œ#2F¼¼þòúËë¼âûE\ÄE¼Æk¼þ›~EÝú CÂøÒD ‚6¡Mh^O½ºËu—ë.wºët×énÓM;4íà÷ÚïµßkË*Ë*Ë*¶m5ÚJÇHÇHǤJ?”~è¹â¹â¹"þdüÉø“·Ko—Þ.M?˜~0ýà/oG´E´E´…íÉöd{RêB]PˆBþ®@çHD"’ ~Õé¢ÓE§‹çYϳžgY«bUÑ“£'GO®¸\q¹â2.Ü}ÑWðwÿrø3îÃèú#à ¡%ݪlYÕÊ«5fP2ûÔ@Jóètýµj‡¥'œøÙ"„Vüp&;'(™ dBMUjÐ!ÐA †"¥B­|w…Zw'Àh¨Q„ÑP›Î6I6*"«¬¸˜ñ(;.ã] ˜J—üÊùoànq›òzr[¹­ý û™ö3-ƒ,ƒ,ƒ,Â,Â,Âô/ë_Ö¿lºÍt›é6³Ûf·Ínûûû®4\i¸R®%×’k)o(o(oÔ4¨iPÓ@ÙIÙIÙ©¶Um«ÚVÏ+žW)|Rø¤pcáÆÂü½ÙÀ³û©S;žnãfãfS©¨¯—±ââ¹3Þù¾óM©Š wÜìÜÓ¹gý§õÕ_äçåçåçeÕþªýUçkÎל¯y¾ð|áù¢Ö¥Ö¥Ö%Õ6Õ6Õöuòëä×Éñ©ñ©ñ©QÑQÑQÑ)ÓS¦§Lç4ë¾âˆ±"VÌ æs‚íÆvc»Ñæ´9mŽx€ÿ3Sþ-Þâ-óóó[ÉV²•q3âfÄÍ­­­²_f¿Ì~™ÈCä!òPù¨|T>X‚%X¢9Qs¢æDòùŠ|UUUu¨CÄ‘8G_Ó×ôÓ›ìuW&à0žŒ'ãɲl,ËÆâ!â!W\:@:@: éЦ+š®hÊ4eš2 û7ìß°¿›–›–›–£Áh0•¾•¾•¾¥þ¥þ¥þýû?ö¿9àæ€›†& Múúõëׯþ»¸8v¤i‡X€Ô”šRS•£ÊQåÈ«ÕuÑù¿MvÎ.j‡vh‡A„A%{Kö–ìÍ_¿:µ…Ž…Ž…ŽÅh‹Ñ£kkkøl¾u?›ê àc„5\ÀXôE0ð'‰¹twóãmŸ¶ŒªgºTuŒô0"ëÒûŸìíÏ®%«pk¨ ÐIh ç  ]èB»Î?nO=ÔC=8ÃΜJ7êÃõáW¸ýÖ)õ¯ºÐ÷ÝœV+avç¶þîB=6‘¯ÝË®aßI2™»ŒV‚ç›+6Ò«••†·Mû˜öÑðUߦ¾M³D³D³Dsæ:Íuò›ò›ò›*/•—Ê«ähÉÑ’£Å3‹gÏ|ÿôýÓ÷O‹G*õþàûƒïf É’1$#'#'#'áL™„3Ý ºtSj(5” …‡ÂƒíÂva»üf=¢…¢é¢A¢A´#mGÛ±Øaì°ß_‘r‘\$™´4iiÒÒ§›O7ŸnîcÜǸqèèÐÑ¡£í+ÛW¶¯ôÍõÍõÍ˺•u+ë–7!oBÞ„w›ßm~·ùiû§íŸ¶ÐíA·ÝÒN¤H;‘gŸgŸg_÷üd.™Kæ’åd9YN5©&Õ¤kèºgpgøyë¿ÅeŽÿjPgÕYu›M6›l6í°Ùa³Ã•¨Då÷1îcÜߨ½±{c'•ÆJcy7ònä­Y©Y©YùüÂó Ï/t.è\Ð/ð/à W¸~#Ò>ðÁWø _‘dYÀý³)l ›R· Þ!½Cz‡l;Ûv¶íø*ðU૦M›6mÚÔ¬‹Y³.ÆEÆEÆEªTUª*5Ý5Ý5Ý5éXÒ±¤c³g=κ9ëæ¬›³òÚæµÍk[;¸vp퇈‹Ld"“QgÔuVÆÊXÿ4UÔù÷±˜‚)˜‚=؃=ÜãÛø}ã÷ß³ÍÙæló'®O\Ÿ¸VÆWÆWÆózùßâ[|+ ~_Ãp×…:ÔĺŒŒÌ¬Mc‹èü‹aýãBŸ¶þÑ5Êæ%P{^õäõý|í’=õ[n:xª”„`;FÒ'˜„½(F%ª…føpÒ¢^ð‚ˆ@´B+´B€ä ‡_@¿‰›¸ù»Î9#0B¶Z¶Z¶ZÍSÍSÍS>Nþ•|œô¹ìœ4_Òš~/Ù¦÷M#{›í±g¥†É¶dûÈP¦vHí€w… Ñ®ÌtfzqJ±}±}ö¨ìQÙ£r¤9ÒiFuFuFu®*W•«*šP4¡hBîæÜ͹›ß|{ðíÁ¢”¢”¢”ß_ $˜“`>¯'7ï‚„Ðv´mGÍ©95Ç",Çr” Œ%s€9@’˜÷Ì{lÁ¼A[8ÀªSUÐoÙ46ÙÈf³Ù¶l[zˆ¢¿"¥`¤0R)¼œ¼œ¼œl_ؾ°}á¡ï¡ï¡ïzÊõ”ë)---^á{f`FZxZxZxÔƒ¨Qýýý_ïz½ëõ®„ˆ„ˆ„ˆ_ùažð„§(F#Š¡ÚT›j³“ÙÉìdÌÇ|ÌÿºòÄ’XKšI3i¦zŠzŠzÊ«5Vk¬šMj6©Ù¤yæM˜7!rnäÜȹº·uoëÞö\æ¹Ìs™Â_á¯ðbñÄ≅R¬+Å\lã0ÿÉ[©»ò  hðŸûÈ>²v¡]hZJKii݃$·%·%·›²MÙ¦¬GµGµGuó’æ%ÍKœkkkÅïÄïÄïH/Ò‹ô*\8¸pð·'nOÜžÜyrçÉgáÏŸ…'.M\š¸ôWng43šld#›mÁ¶`[pŸPÝŸ›wç>­Û¢-ÚrWt­ïZßµ¾UµUµUu›Æ¦± Êe‚’Ÿwç ý*T¡J˜wø]ˆ½/rÚЂöaE¯‹AN”.w2ƒ–. “…6h½5¬_Ûñ·¿/aK#ú+¶*¶Ý»\y¤òøÓ,Å6ŶÅU·lÜÒ¦*Œ c]Ÿ¹-v[lýÎúõ;ýú+ôWH^K^Kþ‹ûç—Ì4f3I<‰'ñd™Gæ‘îàîð3‹œ/µ7¼á MhBó#×9ç½;°ƒ›u&»Én²›iÁ´`Zü²¸¦Ÿ¦Ÿ¦Ÿ}GûŽöû<ìó°ÏÃõ%ëKÖ—œ±9csÆæ®ÿ]ÿ»þ '<Ž›7?nþ· nÜ6¦lLÙ˜2êÙ¨g£ž¹*\® G G Ç_©OâIïpåeF‹ž{†_2MñÌ¿ZÔ˜lEîÐQЃ¯Ð ÿ9äó3j›±›¥6R©Ô@j 5æKó¥ùRW©«ÔU#M#M#M}ºútõéêÕ;«w–ÍÍÍd˜&©d*™JækækækU¨*Tªx­x­x­¥¥Uu¾ê|ÕyÅ*Å1ÅJ³Š•ßRuÑ=2ïòãÔ6i“Õ»€ÂL†@k£6cÛŒz|i˥ߪcš0M˜&ä¹En!á§&Ô„šÐ'ô }Bkh ­áf7?£8(Rç , $$Ñb´-:„¡CØŽlG¶ã/Õ©;Rw¤—¦—¦—¦WªWªWªSo§ÞN½RRR {ö4ìYeXeXeX]]{5÷jîÕ/¼xðâñŽÇ;ïx{êí©·§R‡¥Ký5'ŸÛ¸Û$™$“dÄ#ñÔ™:Sg Ã0 û£uÈ…TªÆ¨Æ¨Æô¸ÕãV[sé\:—^p}ÀõSý¦úMõ³še5Ëj–C²C²CrºaºaºaBç„Î 11רù¿k’»7¸Áä’\’‹ýØý|'ç¾Uõ,õ,õ,—Ù.³]f7qiâÒÄ%`GÀŽ€Vç¬ÎYÓ,Ò,Ò,’xJ<%žiýÓú§õ“ÄIâ$q§âNź=íö´ÛÓ²—e/Ë^ö+¿÷˜è˜èÛžm϶§õi}ZŸO õùèzqÉø¸œó0óÜ,Ü,Ü,,Ã,Ã,ÃRz¤ôHé‘´7ioÒ^øÂ¾¼x+—³V˜wÿ—ò1g¹Î±/>$7.z]mW³JZ‹,šJ{CO–#~&šf°V=@Í2…Á5PrœDöB¿ø/¼Â+¼âcôÎéÓ;g=Âz„õΈ”uuuP­6Zm´,P( g³Ùl6› ‚dØ6€u`X‡Êù•ó+çWæWæWæWnªÜT¹©jBÕ„ª U}«úVõUÚ)í”v555жжж¼ã °Ð·ÆÞêéßs¤x¸¿¸?{ aCdÌUæjRUìÁ؃d™Ï\c®ÑXv»«±«éFº‘nd§³ÓÙé?Kíô[¯Ïçõð ÝJz‹Þ¢·T¬ŠU±\&Q>½§‰Þ}Ñ—ªSuª^¼­x[ñ¶køÏ?íéÚÓµ§×3¬gXÏÐí™Û3·gÍf4›Ñl†Üà˹–s-çF<ŒxñpàöÛnOVOVOVyé套—’ž%=Kzö0úaôÃèÛ^l{± 0€ÁÏªŠ›J»&º&ºF'Ò‰t"kÌ³Æ¸Š«¸ú›„íÌvf;s!•¯b_žŠå”yì’ì’ì’LmMmMmåååÑѸءءØ%(A P@ñ+µÇE\p2‘+°+Æ…qáÜXkÖšµæÃ1ŒcÅXyÔxÔxÔøøø¸ßu¿ë~×ã¸ÇqãÚ#µGj¬hZÑ´¢iqLqLqÌ}§ûN÷îÝ1ºcôZóµækÍ7ùoòßäóW_†eX¸À…8'ℱ‹±\Dª•ª•ªougÓ?)Þ,d!‹µ„%,3<2<2<ŒŒŒ̲ͲͲ³¾Êú*ë«Ê¹•s+ç¢=Ú£=¶a¶ ç¿•¶èü$[HKÖ•Ž¡÷&´ºìÙjýP+O5ÕVU×ÚùÊÖt#Ñè&>þðδ‹6/ç¦\f(9Oú³„¶ÿ Ÿ* ð3êhVгô,=keeåÞÒ½¥{ËŠŠŠŠŠ ò ù†|£l«l«l[“Y“Y“©LR&)“*]+]+]+Õ*Õ*Õ*µ*µ*µªŽT©:Rc]c]cÍ®dW²+i2M¦É¿yuBD„Bk¨’*a1ÄxûÞ³RHySãKƒ3þ¸ÏÎÁi.æb.³ŸÙÏì'/ÉKòR¥P)T?3pÅ‘âHq¤þý;úw¼ÆzõëÓܧ¹Os{Öžµg­[?¶~l¦c¦c¦SiSiSi“Ïæ³ùlv«ìVÙ­bücücü￾ÿúþë´±icÓÆæ¶Ëm—Û©HE*S>ćøp®GÔ‚ZP ºŒ.£ËøŒ³'p'ø•œi˜†ixЧx*”FJ#÷÷Úßk/—6.m\ÚŒM›>6½jmÕÚªµúúú÷Ø{ì=¶òrååÊËñ Ø€ œZ?'Ó‰ÑÑŒˆ1"–²”ýÙǘ–––åCˇ–ƒ¬ƒ¬ƒ¬½­¼­¼­¬$V+‰ñã Æh M¡)ɧ’O%ŸJz‘ô"éEÔ¤¨IQ“î¶¼ÛònËüfùÍò›±bVÌò‘¤1iL“ä9À2,Ã2h‰–h‰jT£šs|ú‡õ(‚¬ðoð†‹¦°LµLµLMÿ&ý›ôoRRRxYOÎLÐîû×3 féK Øíô}ßÿtS5×Yû/u˜ëª© Q5$ E©¢Àþ×x~?ñpÈÓ¥ D›KÖ©ÆQ†NšA@@@à·àò;rib,û[ö·ìï6Ðm ÛÀÚµ/j_¼-[þ¶Ñ}¢ûÐpNÃKKKkÖÖ¬­YKV’•d% $€ž§çéyº˜.¦‹ë^KÔ@Ô@Ô ÉÒ&K›,mеA×]}}}Ý©;u§2=™žLÐ ò™|&Ÿy$~$~$~Úéi§§¢í£í£íÓI:Iÿ»…™ÀL`&à.áÛíÎvçd+?aéßß‹¸ô|1µ7hoÐÞÀ5¾ªDU¢*y÷4îi\ŶŠmÛøÏ§Q…QÂø)ð›D¢…WÜv˜Ø¥íÐÝ×#J•5ó'èDéÒ‚!cBZmhÄ•û1È#¡Þþ ÁF0·)Y(Y(Y¨-Ñ–hK´µµEq¢8Q_’›“{ŒÇxŒÓ8Óœ› 7ëÉ;$4ES4åCM`¨A jB5ÿMÔuɨú¨Ï§Ñy†gxFfdÀ0¿ÿúüëó¯×Z¯µ^kÝ>«}Vû,ËBËBËBCbHÌÏ*/†Är$ùÏKn¦ßÆ0þ•þ7Ñл° »¸@mWSWSWÓðá/Â_8Ítšé4¦0…)/'j kX œÀoE=q»øÞõÊâ„ñ¤ªÊy•–)‡Ío; ”殈z{ö± ׯ›¹2âÌZR*Ô›€€€ÀG€óåu€þµ†Ë—@Ýd=ïðï˜4&°ó`ªÉIDATIµµµû­ƒ´.i]Òºr9ärÈåq>ã|ÆùìØ´cÓŽM7¾ºñÕ¯^¹¼ryåÂ9ÕÜ[zoé½¥gÞywæÝœsn̹Ü+¸Wp/'O'O'O.Ôµî™k<¸ñàG}µzÔ*R™™Òát‡-¶XXVYVýìÒ´Ò´Ò¼†z õ:Ðm Û@·}¹ûr÷åÞÞs{Ïí=1ëcÖǬ_¿4~鹡熞º8yqòâäîA݃º™ØšØšØþÖ¯==="—Éer™ÿ4åÿð§lþépqíjíjíjÿÿÿ˜Vþ­ü[ùk\Ô¸¨q Ð pGpD þ}ˆ?Ö‰¨?6à Ž@ÚÍÂ~%iµVìh–a†Š$LC2{˜i*™¸1L`SrH#“ç+ÿƒºËýáG8`Çÿu36c3?kË•¼Zÿ¹ÔÍœj3˜ñ~á6° ŠQŒbò„d~Þܼ¹y~ìlØÙж…m Û¿u-f$3’ɘ2¦Œ)†b(†òø2^þJ[syU¹®¯ñ¯ëŸªªþ©pƒpƒp篿vþš/¿[°åg¬<ÑöÜ£Ç8’trñVÞð„NáôÝ¢Ù/Ðò%…ƒÛÝqö®ãPMµWj6\$ñ‡„ÊøhÔ5Ѹ ENcä.áéAzL„üòPu'õ¹ês­eVÇ­Ž÷:7àÖ€[O­•S”S¢f)Ìæ÷Kª7Tox:W‘¥ÈòôõiëÓö—g`3ƒ™ÁdÙGöñ=¹ðhCÂðWîPàÏÁexè¨é¨é¨èèèú½ñ{ã÷FÓTÓTÓ”/ÉeøapoŽ#{|&:"±ÍkJo´ˆÒŲQ϶÷ìalÒSG¢ÈÁ€("ûÐí>9\fPŽ—x‰—L ÃĈº‰º‰ºÕ-hZaoŸN)¥É­)¥4¹¥”æ˜PJ©ys;S;SRH%.’U’Uä¹GîñI—8ê†Û |\Ì`3^øàzÇõŽëðþáýÃû;;;óm×aÖñ‘Â'Ó?þñýX”@%ºA'1Þ¹Û+¬«gBÅ =ZkÅ^ÔÍÝ—„iÌ—œÍÅ1ô€3™o8Rü<Ž]@@@@@@àQ73¨ÜàÆ‡ÀZ–äk²,Dl`Sªz¿êýªWzî9Xe±Ë8ŠJ±[Š/æ‡ä‡à8Z EMr jÀ§:ªkÖ ·ø¸pY¹”R¶°…m†{†{†»ñ9ãsÆçL£L£L£2m3m3m+›T6©lÂçUÝŠ­Ø*Tžà31z "HámÑ|¥ËÚ~=«æàü݆½_3×sÀ·[f†üb³ŽŒ"fBå üêæUå23\[»¶vm¶1lcØFçåÎË—óå¹\¶uøòñ°ŠQаc¡‚Lö¸’üЧYC¼UKédú^g›´\\¥1@܃Iâן4Yþ·Hë$äš‹ÝØ-Ú&î.î.š(î îÀÿ›¸»¸;÷×_9Jàï“wäÖO¸L6°M¦Y¦Y¦™2C™¡Ì0î`ÜÁ¸ƒÆmÛ·qp;°;iÈ.ÓU¦ ’JaÆæ­,[UQ‚ÖŒ3¤VDýd/¤çÅã4H&‰¦`!Ipƒ‰Ð ŸÊ:RŒ‹ñ5¾VÕñ¬ùÿ8¿r”Àß çŒ´‹°ó0óJõKõKõsõsõsõ­ÅÖbk±…®…®…n¢u¢u¢5ïo [Ø" iHªðŸÅÇ›q/‡J²CHwnG^vùêJŠ‘/zÙ¨Ä|‹*ý>šr[® Ý‚Sˆ„ÒŸY~?qˆC¯ÛÓ]Ð%+%+%+¥úUõ«êW¦§MO›žÖHÔHÔHÄxŒÇx~†^p˜ùò±c½#Üfu•;; úµ‡U³Eú¤yŽ&¬»Ï¢¯£©Ë]‚N¤ë ua‰M@@@@@@@àOÀ™àÐ ø¼ªƒJ•Êß“¿'ÚmµÛj·­çXϱžƒT¤"Û±Ûy}AùçÅGn*ºñÈâ¶+îÖŒS¹•}§L®m.Þ¬& @÷Ó£2M±úuˆ! ¬ÂnhA 2¡1þ0u}Ö `˜À&ç2ÎeœS®U®U®5žj<Õxª¶H[¤-âÒ6aæ`Ž üóÏâcc­G4Mæ6ˇ֜Su)~^}§¦J¬"HjèBšbRO³·ú:Ô¢æÔ¨A*4†€€€€€€€ÀŸ„›w?ó8Ï)¸—[”[”[äææÊ4d2 ËHËHËHä!yP‡:Ôa X•÷OácϸïG xý²[Mzíð²$[kHæ2÷H+HØô­ùn­™òqXƒb¢Â”@rÁpøÓpóîÜlz"A³hÍÊ*Ë*Ë*SÌWÌWÌ7Ê7Ê7Ê×ÎÐÎÐÎÀ4LÃ4ÞÐø‡ð±gÜ—Ñkˆ†"ˆÊ)š×D=¯:V ÆžÙ‡KôµÑ_'ß%e˜þLQA MH>¢¾€€€€€€€À— 7ïÞíÐã0ãJ»–v-íúþÛ÷ß¾ÿVæ s9XM³šf5 7q7± «° Ð „pÕÏŸïã~ÏP T;”j KªªÏ*ÇAÉ"³Y%M£>KÕ,%Dy¤îA @ˆ„ÆøKpóî\*'þøoñ6#$#$#D!Rˆ"ã»Æwïêèèèèè шFÂ&TÞçÏÇžqŸƒs¸Í f8ÍV«*T‡ßï®èUÕD4„ÉaOQ:ëzHóÅã5r’ôà’C$D4 |¸¹óy˜‡y°†5¬K—.9œ× ¯A^IŽ$G’ceneneŽD$"Å(F1oô óîŸ1Û\Þ€kx(Š$»™.0…EE¨´«–L³—M¦ùÔKó©D*Ò0ÈÕ!Í5ÁðC@@@@@@@à#À™à*¨ âal`›ìõÙë³××l¬ÙX³QïÞ;½wšs4çhÎÁ œÀ ìÅ^ìòª~Î|lý 5¨Á=( C.X0¥'•¾ªù¨eGÒúhH_Ы¢rFybY ·N{?w9Œ¯ÑUh 'õ¸+°­Ñ­K•.*]”¿1cþFõêÔXì±Øc±¥(E)t¡ ]ØÃöBå}ž|lÃÀU lñPå£Ú³ûØ¥äq#2QsŒt7ôÕ)wæšIBÑLh Ì=ÜÃ=.=­¦Õ´:Ã*Ã*ÃJ1K1K1Ëä‚É“ Zƒµk FÒ†Ä †?V ± ò9ñ± w tná%·£d¡â]vª&ÒXOXˆ»’³¤½i3MW9AV¡ ñC@@@@@@@à#Ãù¬·E[´ÅP ÅÐ’k%×J®å·ÎoßZm¹ÚrµåÖ­/Z_ÄDLÄDhCÚ0†1ŒQ‹ZÔ UøùðiBB{Ñ“¸Ãm¾?]U¢XV³IuBµ—(1 =Ë ¥®ê&²]a2|á*4†€€€€€€€ÀG¦®Ï:g”[À™G3fUnVnVn6´4´4´4e:Êt”´‡´‡´œà'tDGtªðóá“î´vãGnû}¿ŠÖŠVÕójuUŽ$ŸlÅ$T‘iDij¡‘,ëÅ•!ë7¡1> ܼû\Á¸Â®¥¦¥¦¥¦ùSó§æO% ÉB²Ð£›G7nÆ.Æ.Æ.¸‹»¸Kt‰.Ñ*ïóáÓîFt)Ý9Äå$•]ªø¡êJ®ÊÙNŠÈmÈ !‡ djÚÒ®`À@Œa¤¬ÀòCŸnÞ=qˆ#šD“hÒLšI3Kû•ö+í§¬¬\•R•R•B†!doèK D¨¼Ï‡Oc¸a¡ µPå-)ßYYV=¾fGíh²¤ÛyЉ:ßK/ŠºÂ:¨%[Ñö`ù!O ]DÑE\z¦2¦Œ)cÞx;àí€üù3òg”%–%–%r†>EGÑQBýÛqƒŒˆ'va2yCBIýD­ñ½º^¤tq›A)]vé넛΃ŸµyhƸã¦cÂà+Tž€€€€€€€€€À/ù4?/ƒ|¼BøS:”®-vW”×Ê¡Bƒeãh¸¦ŽÚ Ù{µ 2 éõê ŠúJsBq ;)pw…†ø$È ƒ ( ÀVlÅV’CrH?ËnNÍ©9FaFý¬¤ÀgÀ§1ÜE`@ˆ”À&0*6VžW…BDæKˆØkì1.jÖÒïŒ"4öÊ%Ûí•Rò‚LD/ F@@@@@@@à“P×…Qõ›ÉR“ý3ãÓÈAªÀ‚B1DHF.òó¯UíV,‚&´˜N£Ï4Ê6K´õÉ“e1PB %Nbi-4‰€€€€€€€€€À/aþžËÞ©²S>Ð6ìSú–ú«wßykÅÉ–H†qyd)‚ÑPh_ò7î9)eY•+4…Û‡½BM5öHG‹ÓtæËFJÚó…ö‘ðšD@@@@@@@@@à—üM†{Æ7Å1å Ôƒ k WLõma†hN—HEƒ¹2d<`#(¹ ü’¿ÉpÏ—I+Ö –XAWµ›êÐ1È뉦kÕHŠEI|¡ï‚‚’»€€€€€€€€€À/ù› ÷Ì.EwËÀÍ`Cè%dØh£Ÿ¶“¬H"‡rh`;Îá2 ¡ u¡aêò) ÷|( â6+kµ]Ø–ªº_Ô‚ÈÈyÖ‹½g±M·\ë=”¨B…j(;^G'¸ÃQhº|JÃý)òQÆm*ØËôDQ¢bÍ0Ñ-æ0±TÙV&1š3Ô“±˜¸4í°p€¥Ð0uù”†û]d£Û¬6PÍR­Ë/®º§< ¶`ÒHO(XÐQú×5Zªµ— í5ÆkˆÑ–0F@@@@@@@@@ .ŸÒpC.Š!¢ôU©±ÅÖU)Ê Dƒ‰dAÆÖ°ë «¯WÛ¨–*.EA  –´„5Œ„†¨Ë'4Üéd  ° ÕæµrÖ£À©ò¸b:ª™r2’ž£i‘Î Y+Iš´³è(ZPõam¡aêò)gÜá-r1ú`kG×ÞRi¾\¹¡:jL YQÌö¤±ú¥j©’ñÒ,‘!ó! µ1Œ¡+4Œ€€€€€€€€€@]>¥áþžã Ó…˜ã&ÎÂ’¾ÍH*nZÖ`Š Routino : Usage

Routino : Usage

Program Usage

There are five programs that make up this software. The first one takes the planet.osm datafile from OpenStreetMap (or other source of data using the same formats) and converts it into a local database. The second program uses the database to determine an optimum route between two points. The third program allows visualisation of the data and statistics to be extracted. The fourth program allows dumping the raw parsed data for test purposes and the fifth is a test program for the tag transformations.

planetsplitter

This program reads in the OSM format XML file and splits it up to create the database that is used for routing.
Usage: planetsplitter [--version]
                      [--help]
                      [--dir=<dirname>] [--prefix=<name>]
                      [--sort-ram-size=<size>] [--sort-threads=<number>]
                      [--tmpdir=<dirname>]
                      [--tagging=<filename>]
                      [--loggable] [--logtime] [--logmemory]
                      [--errorlog[=<name>]]
                      [--parse-only | --process-only]
                      [--append] [--keep] [--changes]
                      [--max-iterations=<number>]
                      [--prune-none]
                      [--prune-isolated=<len>]
                      [--prune-short=<len>]
                      [--prune-straight=<len>]
                      [<filename.osm> ... | <filename.osc> ...
                       | <filename.pbf> ...
                       | <filename.o5m> ... | <filename.o5c> ...
                       | <filename.(osm|osc|o5m|o5c).bz2> ...
                       | <filename.(osm|osc|o5m|o5c).gz> ...
                       | <filename.(osm|osc|o5m|o5c).xz> ...]
--version
Print the version of Routino.
--help
Prints out the help information.
--dir=<dirname>
Sets the directory name in which to save the results. Defaults to the current directory.
--prefix=<name>
Sets the filename prefix for the files that are created. Defaults to no prefix.
--sort-ram-size=<size>
Specifies the amount of RAM (in MB) to use for sorting the data. If not specified then 256 MB will be used in slim mode or 1024 MB otherwise.
--sort-threads=<number>
The number of threads to use for data sorting (the sorting memory is shared between the threads - too many threads and not enough memory will reduce the performance).
--tmpdir=<dirname>
Specifies the name of the directory to store the temporary disk files. If not specified then it defaults to either the value of the --dir option or the current directory.
--tagging=<filename>
Sets the filename containing the list of tagging rules in XML format for the parsing the input files. If the file doesn't exist then dirname, prefix and "tagging.xml" will be combined and used, if that doesn't exist then the file '/usr/local/share/routino/tagging.xml' (or custom installation location) will be used.
--loggable
Print progress messages that are suitable for logging to a file; normally an incrementing counter is printed which is more suitable for real-time display than logging.
--logtime
Print the elapsed time for each processing step (minutes, seconds and milliseconds).
--logmemory
Print the maximum allocated and mapped memory for each processing step (MBytes).
--errorlog[=<name>]
Log OSM parsing and processing errors to 'error.log' or the specified file name (the '--dir' and '--prefix' options are applied). If the --append option is used then the existing log file will be appended, otherwise a new one will be created. If the --keep option is also used a geographically searchable database of error logs is created for use in the visualiser.
--parse-only
Parse the input files and store the data in intermediate files but don't process the data into a routing database. This option must be used with the --append option for all except the first file.
--process-only
Don't read in any files but process the existing intermediate files created by using the --parse-only option.
--append
Parse the input file and append the result to the existing intermediate files; the appended file can be either an OSM file or an OSC change file.
--keep
Store a set of intermediate files after parsing the OSM files, sorting and removing duplicates; this allows appending an OSC file and re-processing later.
--changes
This option indicates that the data being processed contains one or more OSC (OSM changes) files, they must be applied in time sequence if more than one is used. This option implies --append when parsing data files and --keep when processing data.
--max-iterations=<number>
The maximum number of iterations to use when generating super-nodes and super-segments. Defaults to 5 which is normally enough.
--prune-none
Disable the prune options below, they can be re-enabled by adding them to the command line after this option.
--prune-isolated=<length>
Remove the access permissions for a transport type from small disconnected groups of segments and remove the segments if they end up with no access permission (defaults to removing groups under 500m).
--prune-short=<length>
Remove short segments (defaults to removing segments up to a maximum length of 5m).
--prune-straight=<length>
Remove nodes in almost straight highways (defaults to removing nodes up to 3m offset from a straight line).
<filename.osm>, <filename.osc>, <filename.pbf>, <filename.o5m>, <filename.o5c>
Specifies the filename(s) to read data from. Filenames ending '.pbf' will be read as PBF, filenames ending in '.o5m' or '.o5c' will be read as O5M/O5C, otherwise as XML. Filenames ending '.bz2' will be bzip2 uncompressed (if bzip2 support compiled in). Filenames ending '.gz' will be gzip uncompressed (if gzip support compiled in). Filenames ending '.xz' will be xz uncompressed (if xz support compiled in).

Note: It is recommended use the --sort-ram-size and --sort-threads options because they can make a significant reduction in the amount of time that it takes to create the database. Selection of the values to use will depend on the computer being used and the size of the dataset being processed. Selecting half the number of CPU cores and half the amount of available RAM is a reasonable starting point.

Example usage 1:

planetsplitter --dir=data --prefix=gb great_britain.osm
This will generate the output files 'data/gb-nodes.mem', 'data/gb-segments.mem' and 'data/gb-ways.mem'. Multiple filenames can be specified on the command line and they will all be read in, combined and processed together.

Example usage 2:

planetsplitter --dir=data --prefix=gb --parse-only          great_britain_part1.osm
planetsplitter --dir=data --prefix=gb --parse-only --append great_britain_part2.osm
planetsplitter --dir=data --prefix=gb --parse-only --append ...
planetsplitter --dir=data --prefix=gb --process-only
This will generate the same output files as the first example but parsing the input files is performed separately from the data processing. The first file read in must not use the --append option but the later ones must.

Example usage 3:

planetsplitter --dir=data --prefix=gb --keep    great_britain.osm

planetsplitter --dir=data --prefix=gb --changes great_britain.osc
This will generate the same output files as the first example. The first command will process the complete file and keep some intermediate data for later. The second command will apply a set of changes to the stored intermediate data and keep the updated intermediate files for repeating this step later with more change data.

The parsing and processing can be split into multiple commands as it was in example 2 with the --keep option used with --process-only for the initial OSM file(s) and the --changes option used with --parse-only or --process-only for every OSC file.

router

This program performs the calculation of the optimum routes using the database generated by the planetsplitter program.
Usage: router [--version]
              [--help | --help-profile | --help-profile-xml |
                        --help-profile-json | --help-profile-perl ]
              [--dir=<dirname>] [--prefix=<name>]
              [--profiles=<filename>] [--translations=<filename>]
              [--exact-nodes-only]
              [--quiet | [--loggable] [--logtime] [--logmemory]]
              [--output-html]
              [--output-gpx-track] [--output-gpx-route]
              [--output-text] [--output-text-all]
              [--output-none] [--output-stdout]
              [--profile=<name>]
              [--transport=<transport>]
              [--shortest | --quickest]
              --lon1=<longitude> --lat1=<latitude>
              --lon2=<longitude> --lon2=<latitude>
              [ ... --lon99=<longitude> --lon99=<latitude>]
              [--reverse] [--loop]
              [--heading=<bearing>]
              [--highway-<highway>=<preference> ...]
              [--speed-<highway>=<speed> ...]
              [--property-<property>=<preference> ...]
              [--oneway=(0|1)] [--turns=(0|1)]
              [--weight=<weight>]
              [--height=<height>] [--width=<width>] [--length=<length>]
--version
Print the version of Routino.
--help
Prints out the help information.
--help-profile
Prints out the selected transport profile (type, speed limits, highway preferences etc.)
--help-profile-xml
Prints out all the loaded profiles as an XML file in the same format that can be loaded in.
--help-profile-json
Prints out all the loaded profiles in JavaScript Object Notation (JSON) format for use in the interactive webpage.
--help-profile-perl
Prints out all the loaded profiles as a Perl object for use in the router CGI.
--dir=<dirname>
Sets the directory name in which to read the local database. Defaults to the current directory.
--prefix=<name>
Sets the filename prefix for the files in the local database. Defaults to no prefix.
--profiles=<filename>
Sets the filename containing the list of routing profiles in XML format. If the file doesn't exist then dirname, prefix and "profiles.xml" will be combined and used, if that doesn't exist then the file '/usr/local/share/routino/profiles.xml' (or custom installation location) will be used.
--translations=<filename>
Sets the filename containing the list of translations in XML format for the output files. If the file doesn't exist then dirname, prefix and "translations.xml" will be combined and used, if that doesn't exist then the file '/usr/local/share/routino/translations.xml' (or custom installation location) will be used.
--exact-nodes-only
When processing the specified latitude and longitude points only select the nearest node instead of finding the nearest point within a segment (quicker but less accurate unless the points are already near nodes).
--quiet
Don't generate any screen output while running (useful for running in a script).
--loggable
Print progress messages that are suitable for logging to a file; normally an incrementing counter is printed which is more suitable for real-time display than logging.
--logtime
Print the elapsed time for each processing step (minutes, seconds and milliseconds).
--logmemory
Print the maximum allocated and mapped memory for each processing step (MBytes).
--language=<lang>
Select the language specified from the file of translations. If this option is not given and the file exists then the first language in the file will be used. If this option is not given and no file exists the compiled-in default language (English) will be used.
--output-html
--output-gpx-track
--output-gpx-route
--output-text
--output-text-all
Generate the selected output file formats (HTML, GPX track file, GPX route file, plain text route and/or plain text with all nodes). If no output is specified then all are generated, specifying any automatically disables those not specified.
--output-none
Do not generate any output or read in any translations files.
--output-stdout
Write to stdout instead of a file (requires exactly one output format option, implies '--quiet').
--profile=<name>
Specifies the name of the profile to use.
--transport=<transport>
Select the type of transport to use, <transport> can be set to:
  • foot = Foot
  • horse = Horse
  • wheelchair = Wheelchair
  • bicycle = Bicycle
  • moped = Moped (Small motorcycle, limited speed)
  • motorcycle = Motorcycle
  • motorcar = Motorcar
  • goods = Goods (Small lorry, van)
  • hgv = HGV (Heavy Goods Vehicle - large lorry)
  • psv = PSV (Public Service Vehicle - bus, coach)
Defaults to 'motorcar', this option also selects the default profile information if the '--profile' option is not given and a profile matching the transport name is found.
--shortest
Find the shortest route between the waypoints.
--quickest
Find the quickest route between the waypoints.
--lon1=<longitude>, --lat1=<latitude>
--lon2=<longitude>, --lat2=<latitude>
... --lon99=<longitude>, --lat99=<latitude>
The location of the waypoints that make up the start, middle and end points of the route. Up to 99 waypoints can be specified and the route will pass through each of the specified ones in sequence. The algorithm will use the closest node or point within a segment that allows the specified traffic type.
--reverse
Find a route between the waypoints in reverse order.
--loop
Find a route that returns to the first waypoint after the last one.
--heading=<bearing>
Specifies the initial direction of travel at the start of the route (from the lowest numbered waypoint) as a compass bearing from 0 to 360 degrees.
--highway-<highway>=<preference>
Selects the percentage preference for using each particular type of highway. The value of <highway> can be selected from:
  • motorway = Motorway
  • trunk = Trunk
  • primary = Primary
  • secondary = Secondary
  • tertiary = Tertiary
  • unclassified = Unclassified
  • residential = Residential
  • service = Service
  • track = Track
  • cycleway = Cycleway
  • path = Path
  • steps = Steps
  • ferry = Ferry
Default value depends on the profile selected by the --transport option.
--speed-<highway>=<speed>
Selects the speed limit in km/hour for each type of highway. Default value depends on the profile selected by the --transport option.
--property-<property>=<preference>
Selects the percentage preference for using each particular highway property The value of <property> can be selected from:
  • paved = Paved (suitable for normal wheels)
  • multilane = Multiple lanes
  • bridge = Bridge
  • tunnel = Tunnel
  • footroute = A route marked for foot travel
  • bicycleroute = A route marked for bicycle travel
Default value depends on the profile selected by the --transport option.
--oneway=[0|1]
Selects if the direction of oneway streets are to be obeyed (useful to not obey them when walking). Default value depends on the profile selected by the --transport option.
--turns=[0|1]
Selects if turn restrictions are to be obeyed (useful to not obey them when walking). Default value depends on the profile selected by the --transport option.
--weight=<weight>
Specifies the weight of the mode of transport in tonnes; ensures that the weight limit on the highway is not exceeded. Default value depends on the profile selected by the --transport option.
--height=<height>
Specifies the height of the mode of transport in metres; ensures that the height limit on the highway is not exceeded. Default value depends on the profile selected by the --transport option.
--width=<width>
Specifies the width of the mode of transport in metres; ensures that the width limit on the highway is not exceeded. Default value depends on the profile selected by the --transport option.
--length=<length>
Specifies the length of the mode of transport in metres; ensures that the length limit on the highway is not exceeded. Default value depends on the profile selected by the --transport option.

The meaning of the <preference> parameter in the command line options is slightly different for the highway preferences and the property preferences. For the highway preference consider the choice between two possible highways between the start and finish when looking for the shortest route. If highway A has a preference of 100% and highway B has a preference of 90% then highway A will be chosen even if it is up to 11% longer (100/90 = 111%). For the highway properties each highway either has a particular property or not. If the preference for the property is 60% then a highway with the property has a preference of 77% (sqrt(60%)) and one without has a preference of 63% (sqrt(100-60%)). A highway with the property will be chosen even if it is up to 22% longer than one without the property (77/63 = 122%). The overall preference for each highway segment is the product of the preference for the highway type and all of the preferences for the highway properties.

Example usage (motorcycle journey, scenic route, not very fast):

router --dir=data --prefix=gb --transport=motorcycle --highway-motorway=0 \
       --highway-trunk=0 --speed-primary=80 --speed-secondary=80 --quickest
This will use the files 'data/gb-nodes.mem', 'data/gb-segments.mem' and 'data/gb-ways.mem' to find the quickest route by motorcycle not using motorways or trunk roads and not exceeding 80 km/hr.

filedumper

This program is used to extract statistics from the database, extract particular information for visualisation purposes or for dumping the database contents.
Usage: filedumper [--version]
                  [--help]
                  [--dir=<dirname>] [--prefix=<name>]
                  [--statistics]
                  [--visualiser --latmin=<latmin> --latmax=<latmax>
                                --lonmin=<lonmin> --lonmax=<lonmax>
                                --data=<data-type>]
                  [--dump [--node=<node> ...]
                          [--segment=<segment> ...]
                          [--way=<way> ...]
                          [--turn-relation=<relation> ...]
                          [--errorlog=<number> ...]]
                  [--dump-osm [--no-super]
                              [--latmin=<latmin> --latmax=<latmax>
                               --lonmin=<lonmin> --lonmax=<lonmax>]]
                  [--dump-visualiser [--data=node<node>]
                                     [--data=segment<segment>]
                                     [--data=turn-relation<rel>]
                                     [--data=errorlog<number>]]
--version
Print the version of Routino.
--help
Prints out the help information.
--dir=<dirname>
Sets the directory name in which to read the local database. Defaults to the current directory.
--prefix=<name>
Sets the filename prefix for the files in the local database.
--statistics
Prints out statistics about the database files.
--visualiser
Selects a data visualiser mode which will output a set of data according to the other parameters below.
--latmin=<latmin> --latmax=<latmax>
The range of latitudes to print the data for.
--lonmin=<lonmin> --lonmax=<lonmax>
The range of longitudes to print the data for.
--data=<data-type>
The type of data to output, <data-type> can be selected from:
  • junctions = segment count at each junction.
  • super = super-node and super-segments.
  • waytype-* = segments of oneway, cyclebothways or roundabout type.
  • highway-* = segments of the specified highway type (e.g. highway-primary to display segments ofprimary roads).
  • transport-* = segments allowing the specified transport type (e.g. transport-foot to display segments accessible on foot).
  • turns = turn restrictions.
  • speed = speed limits.
  • weight = weight limits.
  • height = height limits.
  • width = width limits.
  • length = length limits.
  • property-* = segments having the specified property (e.g. property-paved to display segments of paved highway).
  • errorlogs = errors logged during parsing.
--dump
Selects a data dumping mode which allows looking at individual items in the databases (specifying 'all' instead of a number dumps all of them). More than one of the following parameters can be specified on the command line.
--node=<node>
Prints the information about the selected node number (internal number, not the node id number in the original source file).
--segment=<segment>
Prints the information about the selected segment number.
--way=<way>
Prints the information about the selected way number (internal number, not the way id number in the original source file).
--turn-relation=<relation>
Prints the information about the selected turn relation number (internal number, not the relation id number in the original source file).
--errorlog=<number>
Prints the information about the selected error log that was stored when the data was parsed.
--osm-dump
Dumps the contents of the database as an OSM format XML file, the whole database will be dumped unless the latitude and longitude ranges are specified.
--no-super
The super segments will not be output.
--latmin=<latmin> --latmax=<latmax>
The range of latitudes to dump the data for.
--lonmin=<lonmin> --lonmax=<lonmax>
The range of longitudes to dump the data for.
--dump-visualiser
Dumps the contents of the database as HTML formatted items for display in the visualiser web page.
--data=node<node>
Prints the information about the selected node number (internal node number, not from the original source file).
--data=segment<segment>
Prints the information about the selected segment number as if it was a way (internal segment number, unrelated to original source file).
--data=turn-relation<relation>
Prints the information about the selected turn relation number (internal turn relation number, not from the original source file).
--data=errorlog<number>
Prints the information about the selected error log that was stored when the data was parsed.

filedumperx

This program is a modified version of filedumper that will dump out the contents of the intermediate data that is saved by planetsplitter after processing using the --keep or --changes option. This is intended for test purposes only and gives no useful information about the routing database.
Usage: filedumperx [--version]
                   [--help]
                   [--dir=<dirname>] [--prefix=<name>]
                   [--dump [--nodes]
                           [--ways]
                           [--route-relations]
                           [--turn-relations]]
--version
Print the version of Routino.
--help
Prints out the help information.
--dir=<dirname>
Sets the directory name in which to read the local database. Defaults to the current directory.
--prefix=<name>
Sets the filename prefix for the files in the local database.
--dump
Dumps the complete set of data in the intermediate files that are written by planetsplitter using the --keep or --changes options.
--nodes
Dumps the node data.
--ways
Dumps the way data.
--route-relations
Dumps the route relation data.
--turn-relations
Dumps the turn relation data.
routino-3.4.3/doc/html/index.html 644 233 144 10252 12563643544 12132 0 Routino : Documentation

Routino : Documentation

Data

A good router relies on good data and the OpenStreetMap data is a good source. There are however a number of things that need to be considered about the data used.

Tagging

In addition to the raw data the way that are tags are used is also important. With Routino the tagging rules are contained in a configuration file and can easily be customised to change the interpretation of each tag.

Program Usage

There are four programs that make up this software, two create the routing database and use the information in it and the other two perform additional functions. Full instructions for using the four programs are provided.

Configuration Files

When the programs are run they read in one or more configuration files. These files contain information about the routing preferences (types of highways, preferred speeds etc), tagging rules and translation information for the outputs.

Output Files

The final result of running the router is one or more output files that contain the calculated route.

Numerical Limits

When processing data there are numerical limits for the range of data identifiers that can be handled and the size of the database.

Algorithm

The algorithm that is used by Routino takes the OpenStreetMap data and creates a local database of the important information for rapid routing.

Installation

The Routino source code comes with a set of files that can be used to create a working server very easily. The full information about installation describes how to compile the programs and install them on UNIX-like systems such as Linux.

MS Windows Installation

Routino can also be compiled and used on Microsoft Windows systems (with some limitations). There are specific MS Windows installation instructions describing how to compile the programs.

Library

The Routino routing algorithm is also available as a shared library that can be linked with other programs to allow routing from within them.
routino-3.4.3/doc/html/installation.html 644 233 144 40400 13756227311 13515 0 Routino : Installation

Routino : Installation

Quick Start Guide

The instructions below are a complete list of the minimum required to get Routino installed and running under Apache on Debian Linux. Other Linux versions will be similar and other UNIX based systems will also be similar although may have distinct differences. There is some support in Routino for compiling on Microsoft Windows which has its own installation instructions.

These instructions should not be considered as complete or a secure installation for the reasons given in more detail in the Configuration of Web Files section below.

The starting point for the installation is in the Routino source code directory after it has been uncompressed. Most of the steps will need to be run as the root user.

The first thing to do is to install the packages which are required for compilation of Routino as described in the Pre-Requisites section below.

apt-get install gcc make libc6-dev libz-dev libbz2-dev
After this the programs can be compiled:
make
The files for the web interface can now be copied to the web server directory. On Debian this is /var/www (or more recently /var/www/html) and the files changed to be owned by the user Apache runs as. The instructions below are based on the assumption that the files are placed in /var/www, replace this with the chosen installation location if different.
cp -a web /var/www/routino
chown -R www-data:www-data /var/www/routino
To be able to use Routino some data will need to be processed and a script is provided for this. This will download the data for the UK which may take a while and then process it.
cd /var/www/routino/data
sh -x create.sh
The routino web pages also require either the OpenLayers (older version 2 or incompatible newer version) or Leaflet (recent version) Javascript library to be downloaded and installed; scripts are provided for this.
cd /var/www/routino/www/openlayers2
sh -x install.sh
cd /var/www/routino/www/openlayers
sh -x install.sh
cd /var/www/routino/www/leaflet
sh -x install.sh
To run the Perl scripts that are used on the Routino web page you will need to install some extra perl packages.
apt-get install libcgi-pm-perl libwww-perl liburi-perl libjson-pp-perl
Finally to make the web pages work you will need to add the extra lines to the Apache configuration file as described in the Configuration of Web Server section below. You don't have to use vi and can use any text editor.
vi /etc/apache2/sites-enabled/000-default
apache2ctl restart
Now everything should be set up and the web page should work if accessed at http://localhost/routino/www/routino/router.html.

When everything is working you should read the rest of this document carefully and make the following changes:

  • Download your choice of OSM data - edit the file data/create.sh and run it again.
  • Edit the www/routino/mapprops.js file to match the downloaded data and personal map preferences.
  • Move the files in the web server directory so that only the contents of the www directory are accessible by the web server.
  • Edit the file www/routino/paths.pl to reference the new file locations.

Pre-Requisites

The programs are written in standard C language with minimal external requirements so only a small set of development tools are required (gcc, make). The compilation tools to use and the command line options are defined in the file Makefile.conf.

There is some support for multi-threading that uses pthreads and additional development libraries for this may be required (on Linux this might be part of the standard C language development files). The multi-threading is enabled by default but can be disabled at compile time by commenting out two lines in the file Makefile.conf.

To use the built-in gzip file decompression function and to process all PBF format files the zlib (or libz) development library is required (on Linux this might be in a package called libz-dev). The gzip function is enabled by default but can be disabled by commenting out two lines in the file Makefile.conf.

To use the built-in bzip2 file decompression functions the bzip2 (or libbz2) development library is required (on Linux this might be in a package called libbz2-dev). The bzip2 function is enabled by default but can be disabled by commenting out two lines in the file Makefile.conf.

To use the built-in xz file decompression functions the liblzma development library is required (on Linux this might be in a package called liblzma-dev). The xz function is not enabled by default but can be enabled by uncommenting two lines in the file Makefile.conf.

To compile the source code from subversion requires the Perl Graphics::Magick module to generate the web page icons (on Linux this might be in a package called libgraphics-magick-perl). The released source code packages contains the icons so this package is not required for compilation.

To use the web page interface an http server is required. Instructions below are for Apache but any server that supports CGIs should work.

The web pages use the Perl scripting language and a number of the default Perl modules. To use the search function on the router web page the Perl module JSON::PP must be installed (on Linux this might be in a package called libjson-pp-perl if not part of the standard Perl installation).

Compilation

To compile the programs just type make at the top level of the source tree. There are a number of options that can be given when compiling to change the compilation options:
make CLANG=1
Compile with clang instead of gcc (default is CLANG=0).
make FASTMATHS=0
Compile without fast maths option (default is FASTMATHS=1).
make SANITIZE=1
Compile with gcc (or clang) sanitizer (default is SANITIZER=0).
make COVERAGE=1
Compile with gcc so that 'gcov' can be run to check code coverage (default is COVERAGE=0).
make PROFILE=1
Compile with gcc so that 'gprof' can be run to profile execution time (default is PROFILE=0).

This program has been written to run on Linux, no cross-platform compatibility has been specifically included but on the other hand other platforms have not knowingly been excluded either.

Any information on improving the compilation process on anything other than x86 Linux is welcome.

Installation

After compilation the executable files are copied into the directory web/bin and the default XML configuration files are copied into the directory web/data. This is in preparation for using the supplied example web pages but is also a useful location to copy the files from for normal use.

The required executable files are planetsplitter, router and filedumper and the *-slim versions of the same files. They can be copied to any location and need no special installation environment. The filedumperx executable is for debugging and not required.

The configuration files are called profiles.xml, tagging.xml and translations.xml. The names of the configuration files can be specified on the command line but by default are also looked for in the directory that contains the routing database with these names.

Example Web Page

The directory web contains a set of files that can be used to create a working set of web pages with interfaces to the routing algorithm.

The files in the web directory will require copying to a location that is accessible by a web server. After copying the files some of them need to be edited; search through the files for lines that contain the words "EDIT THIS" and make appropriate edits (more details below).

Configuration of Web Files

The assumption in this description is that the whole of the directory called web is copied into a directory that is accessible by an Apache web server.

This is not a secure configuration but an easy one to configure.
Only the directory www should be accessible by the web server. Do not use this configuration unmodified in a public web server.

The directory structure is as follows:

   web/
    |
    + /bin/                    <- The Routino executable files (when compiled).
    |
    + /data/                   <- The Routino database and default configuration
    |                             files.
    |
    + /results/                <- An empty directory to store the results.
    |
    + /www/                    <- The files that must be available to the web
        |                         server are below this level.
        |
        + /openlayers2/        <- A directory to hold the older OpenLayers v2
        |                         library (optional; newer openlayers or leaflet
        |                         can be used instead).
        |
        + /openlayers/         <- A directory to hold the newer OpenLayers
        |                         library (optional; older openlayers v2 or
        |                         leaflet can be used instead).
        |
        + /leaflet/            <- A directory to hold the Leaflet library.
        |                         (optional; older openlayers v2 or newer
        |                          openlayers can be used instead).
        |
        + /routino/            <- The main HTML, Javascript, CSS and CGI files.
            |
            + /documentation/  <- The HTML version of the Routino documentation.
The directory bin will be filled by running the compilation process. For a secure installation the bin directory should be outside of the web server, the file www/routino/paths.pl contains the path to the bin directory.

The directory data must contain the Routino database and is also the default location for the configuration files. The routing database is created by downloading the OSM files for the region of interest and running the planetsplitter program. There is a script in the directory that will download the OSM files and create the required database. The script should be edited to set the names of the files to be downloaded. For a secure installation the data directory should be outside of the web server, the file www/routino/paths.pl contains the path to the data directory.

The directory results is a temporary directory that it used to hold the GPX and text files generated by the Routino router. The directory must be writable by the web server process since it is the CGI scripts that are run by the web server that writes the results here. For a secure installation the results directory should be outside of the web server, the file www/routino/paths.pl contains the path to the results directory.

The directory www and its sub-directories are the only ones that need to be within the web server accessible directory.

A Javascript map drawing library is required and either the older OpenLayers version 2, newer Openlayers or Leaflet can be used. The library is loaded dynamically when the HTML is opened based on the value that is selected in mapprops.js.

The directory www/openlayers2 is for the older OpenLayers version 2 Javascript library that can be downloaded from http://www.openlayers.org/two/. (This version of Routino has been tested with OpenLayers library version 2.13.1). There is a script in the www/openlayers2 directory that will automatically download the files, create an optimised OpenLayers.js and copy the files to the required locations.

The directory www/openlayers is for the newer version of the OpenLayers Javascript library that can be downloaded from http://www.openlayers.org/. (This version of Routino has been tested with OpenLayers library version 6.4.3). There is a script in the www/openlayers directory that will automatically download the files.

The directory www/leaflet is for the Leaflet Javascript library that can be downloaded from http://leafletjs.com/. (This version of Routino has been tested with Leaflet library version 1.7.1). There is a script in the www/leaflet directory that will automatically download the files.

The directory www/routino contains the main HTML, Javascript and CSS files as well as the CGI scripts that perform the server-side routing functions. The description below lists all of the files that contain editable information.

paths.pl
This contains the names of the directories that contain the executable files, router database and temporary results; the prefix for the routing database; and the names of the executables.
mapprops.js
The parameters in this file control the Javascript map library (defaults to Leaflet), the boundary of the visible map (defaults to UK), the minimum and maximum zoom levels (defaults to between 4 and 15 inclusive), the source of map tiles (defaults to the main OpenStreetMap tile server), the data editing and browsing URLs (default to the OpenStreetMap website) and the number of waypoints allowed (defaults to 9).

The directory www/routino/documentation contains the HTML version of the Routino documentation.

Configuration of Web Server

The file www/routino/.htaccess contains all of the Apache configuration options that are required to get the example web pages running. The only problem is that some of the configuration options in that file will not work unless they are allowed by the AllowOverride option in the main Apache server configuration file.

If you have copied the routino web directory into /var/www and named it routino then the entry that you need in your Apache configuration file is this one:

     <Directory /var/www/routino>
         AllowOverride Options=MultiViews,ExecCGI FileInfo Limit
     </Directory>
This can be placed anywhere between the <VirtualHost *:80> and </VirtualHost> tags which should be at the start and end of the file.
routino-3.4.3/doc/html/configuration.html 644 233 144 24661 13755526237 13706 0 Routino : Configuration

Routino : Configuration

XML Configuration Files

New in version 1.4 of Routino is the use of configuration files to allow more information to be provided to the programs at run-time. The configuration files that are used are:
  • Tagging transformation rules for the planetsplitter program.
  • Routing profiles for the router program.
  • Output translations for the router program.
In keeping with the nature of the input and output files the configuration files are also XML files. Each of the files uses a custom defined XML schema and an XSD file is provided for each of them.

Tag Transformation Rules

The default name of the tagging transformation rules XML configuration file is tagging.xml in the same directory as the generated database files. Other filenames can be specified on the command line using the --tagging option. When processing the input it is possible to have a different set of tagging rules for each file; for example different rules for different countries.

The tagging rules allow modifying the highway tags in the source file so that the routing can be performed on a simpler set of tags. This removes the special case tagging rules from the source code into the configuration file where they can be easily modified. Part of the provided tagging.xml file showing the rules for motorway_link and motorway highway types.

<?xml version="1.0" encoding="utf-8"?>
<routino-tagging>

  <way>

    <if k="highway" v="motorway_link">
      <set v="motorway"/>
    </if>

    <if k="highway" v="motorway">
      <output k="highway"/>

      <output k="motorcycle" v="yes"/>
      <output k="motorcar"   v="yes"/>
      <output k="goods"      v="yes"/>
      <output k="hgv"        v="yes"/>
      <output k="psv"        v="yes"/>

      <output k="paved"      v="yes"/>
      <output k="multilane"  v="yes"/>
      <output k="oneway"     v="yes"/>

      <unset k="highway"/>
    </if>
...
  </way>

</routino-tagging>
The rules all have the same format; an if or ifnot element at the top level for matching the input and some other elements inside to be used if there was a match.

Within the if and ifnot rules any of the rules can be used. These are if, ifnot, set, unset, output or logerror elements.

The rules for matching the if or ifnot elements are the following:

  • An if rule that has both k and v specified is only matched if a tag exists in the input that matches both.
  • An if rule that has only the k attribute is matched if a tag with that key exists.
  • An if rule that has only the v attribute is matched for each tag with that value (i.e. the contents may be used more than once).
  • An if rule that has neither attribute specified always matches.
  • An ifnot rule that has both k and v specified is only matched if no tag exists in the input that matches both.
  • An ifnot rule that has only the k attribute is matched only if no tag with that key exists.
  • An ifnot rule that has only the v attribute is only matched if no tag with that value exists.
  • An ifnot rule that has neither attribute specified never matches.

For set, unset, output or logerror elements inside of an if rule an unspecified value for the k or v attribute is replaced by the values from the tag that matched the outer if rule. This makes it simple to delete tags that match a particular rule without having to specify the parameters more than once. For elements inside of an ifnot element an unspecified value for the k or v attribute is replaced by the values from the outer ifnot rule. This means that either the outer ifnot element or the inner element must specify both k and v attributes between them. For nested if or ifnot elements the outer k and v attributes are not inherited by the inner elements.

The set and unset elements either create or delete a tag from the input data that was read from the file. If the set element is used and the tag already exists then it is modified. The output element adds a tag to the set that will be used by Routino to determine the data properties. If the output element is used and the tag already exists then it is modified.

The logerror element will cause an error message to be added to the error log file that reports that the key and attribute combination are not recognised. If the k attribute is specified but not the v attribute then the tag value that matches the specified key is looked up and used. An additional message attribute can be specified to be printed at the end of the logged error.

The default logged error message is:

Node XXX has an unrecognised tag 'key' = 'value' (in tagging rules); ignoring it.

The specified message attribute will replace the final part of the logged error.

Routing Profiles

The default name of the routing profiles XML configuration file is profiles.xml in the same directory as the database files. Other filenames can be specified on the command line using the --tagging option.

The purpose of this configuration file is to allow easy modification of the routing parameters so that they do not all need to be specified on the command line. In versions of Routino before version 1.4 the default routing parameters (preferred highways, preferred speeds etc) were contained in the source code, now they are in a configuration file. When calculating a route the --profile option selects the named profile from the configuration file.

Part of the provided profiles.xml file showing the parameters for transport on foot is shown below:

<?xml version="1.0" encoding="UTF-8" ?>
<routino-profiles>

  <profile name="foot" transport="foot">
    <speeds>
...
      <speed highway="cycleway"      kph="4" />
      <speed highway="path"          kph="4" />
      <speed highway="steps"         kph="4" />
    </speeds>
    <preferences>
...
      <preference highway="cycleway"      percent="95" />
      <preference highway="path"          percent="100" />
      <preference highway="steps"         percent="80" />
    </preferences>
    <properties>
      <property type="paved"        percent="50" />
      <property type="multilane"    percent="25" />
      <property type="bridge"       percent="50" />
      <property type="tunnel"       percent="50" />
...
    </properties>
    <restrictions>
      <oneway obey="0" /> 
      <weight limit="0.0" />
      <height limit="0.0" />
      <width  limit="0.0" />
      <length limit="0.0" />
    </restrictions>
  </profile>
  <profile name="horse" transport="horse">
...
  </profile>
...
</routino-profiles>

Output Translations

The default name of the output translations XML configuration file is translations.xml in the same directory as the database files. Other filenames can be specified on the command line using the --translations option.

The generated HTML and GPX output files (described in the next section) are created using the fragments of text that are defined in this file. Additional languages can be added to the file and are selected using the --language option to the router. If no language is specified the first one in the file is used.

Part of the provided translations.xml file showing some of the English language (en) translations is shown below:

<?xml version="1.0" encoding="utf-8"?>
<routino-translations>

  <language lang="en">
...
    <turn direction="-4" string="Very sharp left" />
    <turn direction="-3" string="Sharp left" />
    <turn direction="-2" string="Left" />
...
    <heading direction="-4" string="South" />
    <heading direction="-3" string="South-West" />
    <heading direction="-2" string="West" />
...
    <route type="shortest" string="Shortest" />
    <route type="quickest" string="Quickest" />
    <output-html>
...
    </output-html>
    <output-gpx>
...
    </output-gpx>
  </language>
</routino-translations>
routino-3.4.3/doc/html/tagging.html 644 233 144 73654 13765144732 12462 0 Routino : Tagging Rules

Routino : Tagging Rules

Tags And Attributes

The different tags and attributes in the OSM format XML that are used by Routino are described below.

Routino handles the tags in the input file after they have been processed according to a set of rules defined in a configuration file. The first half of this file describes the tags that are recognised by Routino after being processed; the second half of the file describes the transformations that are in the default tagging configuration file.

Tags Recognised After Processing

This section describes the tags that are recognised by Routino after the tag transformations have been applied. This is therefore a much reduced set of tags compared to the original OSM data and also includes tags which are specific to Routino.

In all cases of tag processing values of true, yes, 1 are recognised as being affirmative and any other value is negative.

Node Tags And Attributes

The node attributes id, latitude and longitude are used. The id attribute is required to associate the node with the ways and the position attributes are required to locate the node.

Transport Specific Tags

One tag is recognised for each of the different modes of transport: foot, horse, bicycle, wheelchair, moped, motorcycle, motorcar, goods, hgv and psv. These indicate whether the specific type of transport is allowed to pass through the node or not.

By default for nodes all types of transport are allowed to pass through a node and specific tags must be used to remove the permissions for the transport.

The roundabout Tag

The roundabout tag for mini-roundabouts is recognised and used to improve the description of the route.

Way Tags And Attributes

The tags from the ways in the data are the ones that provide most of the information for routing. The id attribute is used only so that the many segments associated with a way can share a set of tags taken from the way. The nd information is used to identify the nodes that make up the way.

The highway Tag

The most important tag that is used from a way is the highway tag. This defines the type of highway that the way represents. Any way that does not have a highway tag is discarded.

There are more highway types defined than are used by the router. The subset that the router uses are:

  • motorway
  • trunk
  • primary
  • secondary
  • tertiary
  • unclassified
  • residential
  • service
  • track
  • cycleway
  • path (1)
  • steps (2)

Note 1: This changed in version 1.3 of Routino - the bridleway and footway types were included within the path highway type.
Note 2: This changed in version 1.3 of Routino - the steps type was separated from the footway type.

Transport Specific Tags

One tag is recognised for each of the different modes of transport: foot, horse, bicycle, wheelchair, moped, motorcycle, motorcar, goods, hgv and psv. These indicate whether the specific type of transport is allowed on the highway or not.

By default for ways no types of transport are allowed to pass along a highway and specific tags must be used to add the permissions for the transport.

The name Tag

The name tag is used to provide the label for the highway when printing the results.

The ref Tag

The ref tag is used to provide the label for the highway when printing the results.

The lanes Tag

The lanes tag is used to identify whether a highway has multiple lanes for traffic and this is used to derive the multilane highway properties.

The paved Tag

The paved tag is used to identify whether a highway is paved or not, this is one of the available highway properties. A paved tag may exist in the original data but normally the surface tag needs to be transformed into the paved tag.

The multilane Tag

The multilane tag is used to indicate that a highway has multiple lanes for traffic.

The bridge Tag

The bridge tag is used to identify whether a highway is a bridge and therefore set one of the available properties.

The tunnel Tag

The tunnel tag is used to identify whether a highway is a tunnel and therefore set one of the available properties.

The footroute Tag

The footroute tag is used to identify whether a highway is part of a walking route and therefore set one of the available properties. This is not a standard OSM tag and is normally added to the individual highways by looking for route relations that are designated for foot access.

The bicycleroute Tag

The bicycleroute tag is used to identify whether a highway is part of a bicycle route and therefore set one of the available properties. This is not a standard OSM tag and is normally added to the individual highways by looking for route relations that are designated for bicycle access.

The cyclebothways Tag

The cyclebothways tag is used to identify whether a highway allows cycling in the opposite direction to a signposted oneway restriction.

The oneway Tag

The oneway tag is used to specify that traffic is only allowed to travel in one direction.

The roundabout Tag

The roundabout tag is used to specify that a highway is part of a roundabout to improve the description of the calculated route.

The maxspeed Tag

The maxspeed tag is used to specify the maximum speed limit on the highway; this is always measured in km/hr in OpenStreetMap data. If the tag value contains "mph" then it is assumed to be a value in those units and converted to km/hr.

The maxweight Tag

The maxweight tag is used to specify the maximum weight of any traffic on the highway. In other words this must be set to the heaviest weight allowed on the highway (for example a bridge) in tonnes. If the tag value contains "kg" then it is assumed that the value is in these units and converted to tonnes.

The maxheight Tag

The maxheight tag is used to specify the maximum height of any traffic on the highway. In other words this must be set to the lowest height of anything above the highway (like a bridge) in metres. If the tag value contains a measurement in feet or feet and inches then attempts are made to convert this to metres.

The maxwidth Tag

The maxwidth tag is used to specify the maximum width of any traffic on the highway. This must be set to the minimum width of the constraints at the wayside in metres. If the tag value contains a measurement in feet or feet and inches then attempts are made to convert this to metres.

The maxlength Tag

The maxlength tag is used to specify the maximum length of any traffic on the highway (usually from a traffic sign) in metres. If the tag value contains a measurement in feet or feet and inches then attempts are made to convert this to metres.

The area Tag

The area tag is used to specify that a way defines an area. This is used only so that in the case of duplicated segments those belonging to an area can be discarded in preference to those that are not.

Relation Tags And Attributes

The tags from the relations are used to associate more properties with the highways that are part of that relation. The id attribute is used so that relations that are members of other relations can be identified. The member information is used to identify the nodes and ways that make up the relation.

The footroute Tag

The footroute tag is used to identify whether a relation defines a walking route and therefore should be applied to the individual member highways.

The bicycleroute Tag

The bicycleroute tag is used to identify whether a relation defines a bicycle route and therefore should be applied to the individual member highways.

The type, restriction & except Tags

For turn relations the information about the allowed or disallowed turns are stored in the type, restriction and except tags. For a turn restriction the type must be equal to "restriction", the restriction must define the type of turn relation and except defines transport types which are exempt from the restriction.

Tag Transformations

This section describes the set of tag transformations that are contained in the default configuration file. The configuration file tagging rules are applied in sequence and this section of the document is arranged in the same order.

Node Tag Transformations

Barrier Defaults

The first part of the tag transformations is to decide on defaults for each type of node. This uses the barrier tag in the OSM file and converts it into a default set of disallowed transport types.

Transport types through different barrier types
Barrier foot horse wheelchair bicycle moped motorcycle motorcar goods hgv psv
kissing_gate, footgate, stile, v_stile, turnstile, squeeze, squeeze_stile, cycle_barrier, bicycle_barrier yes no no no no no no no no no
horse_stile, horse_jump, step_over yes yes no no no no no no no no
horse_barrier, cattle_grid yes no yes yes yes yes yes yes yes yes
motorcyle_barrier yes yes yes yes no no no no no no
bollard, car_barrier, car_trap yes yes yes yes yes yes no no no no

Generic Access Permissions

The access tag is used to specify the default access restrictions through the node. If the tag value is no or private or a selection of other values then all transport types are denied access (later tag transformation rules may add specific transport types back again).

Other Access Permissions

A tag named vehicle means any of the bicycle, moped, motorcycle, motorcar, goods, hgv and psv transport types. A tag named motor_vehicle is transformed to mean any vehicle except a bicycle.

Specific Access Permissions

The final part of the access permissions is to use the specific transport type tags.

One tag is recognised for each of the different modes of transport: foot, horse, bicycle, wheelchair, moped, motorcycle, motorcar, goods, hgv and psv. These indicate whether the specific type of transport is allowed through the node or not; the values listed for the access tag are also accepted here.

Mini-roundabouts

If the highway tag has the value mini_roundabout or the junction tag has the value roundabout then a junction tag with value roundaboutis passed through.

Way Tag Transformations

Highway Defaults

The first part of the tag transformations is to decide on defaults for each type of highway. This uses the highway tag in the OSM file and maps it into one of the highway tags that are recognised by Routino, defining the default allowed transport types and adding a number of properties.

The first part of the highway tag checking is to ignore the highway tag if it has a value that indicates a non-highway. These are the proposed and construction values for future highways, the no, abandoned and disused values for previous highways and a small number of other values.

The second part of the highway transformation is to convert the highway tag into one that is recognised by Routino.

Mapping of equivalent highway types
Original tag Transformed tag
motorway_link motorway
trunk_link trunk
primary_link primary
secondary_link secondary
tertiary_link tertiary
minor, road unclassified
living_street residential
access, services, layby service
byway, unsurfaced, unpaved track
footway, bridleway, pedestrian, walkway path
route=ferry ferry (1)
Note 1: A ferry route is converted into a highway of type "ferry" so that routes using a ferry can be calculated.

The type of highway also determines the defaults for the types of transport allowed on the highway. The default assumptions are as shown in the table below.

Transport types on different highway types
Highway foot horse wheelchair bicycle moped motorcycle motorcar goods hgv psv
motorway no no no no no yes yes yes yes yes
trunk no (1) no (1) no (1) yes yes yes yes yes yes yes
primary yes yes yes yes yes yes yes yes yes yes
secondary yes yes yes yes yes yes yes yes yes yes
tertiary yes yes yes yes yes yes yes yes yes yes
unclassified yes yes yes yes yes yes yes yes yes yes
residential yes yes yes yes yes yes yes yes yes yes
service yes yes yes yes yes yes yes yes yes yes
track yes yes yes yes no no no no no no
cycleway yes no yes yes no no no no no no
path yes yes (2) yes yes (2) no no no no no no
steps yes no no no no no no no no no
ferry (3) ?? ?? ?? ?? ?? ?? ?? ?? ?? ??

Note 1: A trunk road may legally allow foot, horse or wheelchair access but in the absence of other tags is considered to be too dangerous.
Note 2: A path allows bicycle or horse access by default only if actually labelled as a highway of type "bridleway".
Note 3: Ferry routes use a set of heuristics to guess the the allowed transport types starting with nothing allowed and then using the tags given.

Finally for the highway tag a number of default properties are added depending on the highway type.

Default properties on different highway types
Highway Properties
motorway paved, oneway, multilane
trunk paved, multilane (1)
primary paved, multilane (1)
secondary paved
tertiary paved
unclassified paved
residential paved
service paved
track paved (2)
cycleway paved
path paved (3)
steps
ferry

Note 1: A highway of this type has the multilane property by default if it is oneway.
Note 2: A track is paved only if it is tagged as tracktype=grade1.
Note 3: A path is paved only if it was originally tagged as highway=walkway or highway=pedestrian.

Generic Access Permissions

The access tag is used to specify the default access restrictions on the highway. If the tag value is no or private or a selection of other values then all transport types are denied access (later tag transformation rules may add specific transport types back again).

Other Access Permissions

A tag named vehicle means any of the bicycle, moped, motorcycle, motorcar, goods, hgv and psv transport types. A tag named motor_vehicle is transformed to mean any vehicle except a bicycle.

The designation tag is used as an alternative method of identifying the legal right of way on a path (in the UK at least). The tag transformations convert these tags into a set of allowed transport types as shown below.

Aliasing of designation types
Designation tag Equivalent access permissions
restricted_byway foot=yes, wheelchair=yes, horse=yes, bicycle=yes
public_byway, byway, byway_open_to_all_traffic foot=yes, wheelchair=yes, horse=yes, bicycle=yes, moped=yes, motorcycle=yes, motorcar=yes
permissive_bridleway, public_bridleway, bridleway foot=yes, wheelchair=yes, horse=yes, bicycle=yes
public_cycleway foot=yes, wheelchair=yes, bicycle=yes
permissive_footpath, public_footpath, footpath foot=yes, wheelchair=yes

In addition to these there are some other tags and values that will modify the transport permissions on the highway.

A highway that is tagged as motorroad with a value of yes will deny access to foot, horse, wheelchair, bicycle and moped transport.

A highway that is tagged with footway or sidewalk and one of a set of popular values will allow foot and wheelchair access even if the road type would not normally do so.

A highway that is tagged as cycleway with one of several values will allow bicycle access. If the value of the cycleway tag is opposite_lane, opposite_track or opposite then the cyclebothways tag is set.

A highway that is tagged as oneway:bicycle with the value no will also cause the cyclebothways tag to be set.

Specific Access Permissions

The final part of the access permissions is to use the specific transport type tags.

One tag is recognised for each of the different modes of transport: foot, horse, bicycle, wheelchair, moped, motorcycle, motorcar, goods, hgv and psv. These indicate whether the specific type of transport is allowed on the highway or not.

Highway Properties

By default the properties for all highways are not set; highways are not paved, not a bridge, not a tunnel etc.

If there is a surface tag then the highway is assumed to be unpaved unless the tag value matches one of the following: paved, asphalt, concrete or many other values listed in the configuration file.

Support for the obsolete paved tag is also provided and the highway is paved if this is set to a true value.

The lanes tag is passed through to be used to set the multilane highway property.

The bridge and tunnel tags are copied directly from the input to the output.

Highway Restrictions

The oneway, maxspeed, maxweight, maxheight, maxwidth and maxlength are copied directly from the input to the output without modification.

Roundabouts

If a highway is tagged as junction=roundabout then a roundabout=yes tag created on the output.

Highway Names and References

The name and ref tags are copied directly from the input to the output.

Highway Areas

The area tag is copied directly from the input to the output.

Relation Tag Transformations

The type tag is passed through without change.

Routes

The route tag can be used to determine whether a relation is part of a walking or bicycle route so that the footroute or bicycleroute properties can be applied to the highways that make up that relation.

The tag transformations that are applied for route relations are defined in the table below.

Route properties from different route types
Relation Tag footroute Property bicycleroute Property
foot, walking, hiking yes no
bicycle no yes
bicycle;foot, foot;bicycle yes yes

Turn Restrictions

No tag transformations are defined for turn restriction relations but the restriction and except tags are passed through without change.
routino-3.4.3/doc/html/library.html 644 233 144 115411 12606774344 12513 0 Routino : Library

Routino : Library

Library Usage

This page describes the libroutino shared library that can be compiled from the Routino source code and used in other programs.

Compilation

The libroutino shared library is compiled by default when the Routino source code is compiled. There are two versions; a normal version and a 'slim' version that uses less memory but is slower. The names of the libraries are libroutino.so and libroutino-slim.so

Including

To use the Routino library in another program the source code for that program should include the routino.h file. The functions that are available in the library (both versions) are listed in this file along with all of the constants and data types that are required.

Linking

After compiling the program that uses the library it needs to be linked to the library. For gcc this requires adding -lroutino or -lroutino-slim to the linker command line, possibly with a -L... parameter to specify the location of the library.

Example Library Interface Code

An example of a program that can link to the libroutino library is provided in the Routino source code called router+lib.c. This is an almost exact re-implementation of the standard Routino router program using the libroutino library.

Library License

The source code for the libroutino and libroutino-slim libraries is the GNU Affero General Public License v3 the same as for the rest of the Routino software.

Linking with AGPLv3 Source Code

If libroutino is linked with other APGLv3 code then the same license applies to the combination as to the two parts.

Linking with GPLv3 Source Code

The AGPLv3 license is almost identical to the GNU General Public License v3 except that network interaction with an AGPLv3 program requires the same source code access as distributing compiled GPLv3 programs. This means that libroutino can be linked or combined with code that is released under the GPLv3 without changing the license of that code.

If there is no network interaction with the resulting program then the Routino source code can be treated as if it was GPLv3 code for the purposes of distribution and use.

If there is network interaction with the resulting program then the AGPLv3 license will apply since this is required by section 13 of the GPLv3.
The Software Freedom Law Center description of the GPLv3 and AGPLv3 licenses describes combining GPLv3 and APGLv3.
My understanding is that only when modified Routino code is linked with GPLv3 code does network interaction require the modified Routino code to be released.

Linking with Other Source Code

Linking libroutino with code released under any other license must preserve the terms of the Routino license on the combination if the software is distributed or interacted with over a network.

Routino Library API

Preprocessor Definitions

A version number for the Routino API.
#define ROUTINO_API_VERSION 8

Error Definitions

No error.
#define ROUTINO_ERROR_NONE 0

A function was called without the database variable set.
#define ROUTINO_ERROR_NO_DATABASE 1

A function was called without the profile variable set.
#define ROUTINO_ERROR_NO_PROFILE 2

A function was called without the translation variable set.
#define ROUTINO_ERROR_NO_TRANSLATION 3

The specified database to load did not exist.
#define ROUTINO_ERROR_NO_DATABASE_FILES 11

The specified database could not be loaded.
#define ROUTINO_ERROR_BAD_DATABASE_FILES 12

The specified profiles XML file did not exist.
#define ROUTINO_ERROR_NO_PROFILES_XML 13

The specified profiles XML file could not be loaded.
#define ROUTINO_ERROR_BAD_PROFILES_XML 14

The specified translations XML file did not exist.
#define ROUTINO_ERROR_NO_TRANSLATIONS_XML 15

The specified translations XML file could not be loaded.
#define ROUTINO_ERROR_BAD_TRANSLATIONS_XML 16

The requested profile name does not exist in the loaded XML file.
#define ROUTINO_ERROR_NO_SUCH_PROFILE 21

The requested translation language does not exist in the loaded XML file.
#define ROUTINO_ERROR_NO_SUCH_TRANSLATION 22

There is no highway near the coordinates to place a waypoint.
#define ROUTINO_ERROR_NO_NEARBY_HIGHWAY 31

The profile and database do not work together.
#define ROUTINO_ERROR_PROFILE_DATABASE_ERR 41

The profile being used has not been validated.
#define ROUTINO_ERROR_NOTVALID_PROFILE 42

The user specified profile contained invalid data.
#define ROUTINO_ERROR_BAD_USER_PROFILE 43

The routing options specified are not consistent with each other.
#define ROUTINO_ERROR_BAD_OPTIONS 51

There is a mismatch between the library and caller API version.
#define ROUTINO_ERROR_WRONG_API_VERSION 61

The progress function returned false.
#define ROUTINO_ERROR_PROGRESS_ABORTED 71

A route could not be found to waypoint 1.
#define ROUTINO_ERROR_NO_ROUTE_1 1001

A route could not be found to waypoint 2.
#define ROUTINO_ERROR_NO_ROUTE_2 1002

A route could not be found to waypoint 3.
#define ROUTINO_ERROR_NO_ROUTE_3 1003

Routino Option Definitions

Calculate the shortest route.
#define ROUTINO_ROUTE_SHORTEST 0

Calculate the quickest route.
#define ROUTINO_ROUTE_QUICKEST 1

Output an HTML route file.
#define ROUTINO_ROUTE_FILE_HTML 2

Output a GPX track file.
#define ROUTINO_ROUTE_FILE_GPX_TRACK 4

Output a GPX route file.
#define ROUTINO_ROUTE_FILE_GPX_ROUTE 8

Output a text file with important junctions.
#define ROUTINO_ROUTE_FILE_TEXT 16

Output a text file with all nodes and segments.
#define ROUTINO_ROUTE_FILE_TEXT_ALL 32

Output a single file type to stdout.
#define ROUTINO_ROUTE_FILE_STDOUT 64

Output a linked list of points containing the HTML file information but as plain text.
#define ROUTINO_ROUTE_LIST_HTML 128

Output a linked list of points containing the HTML file information as plain text and with all points.
#define ROUTINO_ROUTE_LIST_HTML_ALL 256

Output a linked list of points containing the text file information.
#define ROUTINO_ROUTE_LIST_TEXT 512

Output a linked list of points containing the text all file information.
#define ROUTINO_ROUTE_LIST_TEXT_ALL 1024

Route between the points in a loop returning to the first point.
#define ROUTINO_ROUTE_LOOP 2048

Route between the points in reverse order.
#define ROUTINO_ROUTE_REVERSE 4096

Linked List Output Point Definitions

An unimportant, intermediate, node.
#define ROUTINO_POINT_UNIMPORTANT 0

A roundabout exit that is not taken.
#define ROUTINO_POINT_RB_NOT_EXIT 1

An un-interesting junction where the route continues without comment.
#define ROUTINO_POINT_JUNCT_CONT 2

The highway changes type but nothing else happens.
#define ROUTINO_POINT_CHANGE 3

An interesting junction to be described.
#define ROUTINO_POINT_JUNCT_IMPORT 4

The entrance to a roundabout.
#define ROUTINO_POINT_RB_ENTRY 5

The exit from a roundabout.
#define ROUTINO_POINT_RB_EXIT 6

The location of a mini-roundabout.
#define ROUTINO_POINT_MINI_RB 7

The location of a U-turn.
#define ROUTINO_POINT_UTURN 8

A waypoint.
#define ROUTINO_POINT_WAYPOINT 9

Profile Definitions

A Motorway highway.
#define ROUTINO_HIGHWAY_MOTORWAY 1

A Trunk highway.
#define ROUTINO_HIGHWAY_TRUNK 2

A Primary highway.
#define ROUTINO_HIGHWAY_PRIMARY 3

A Secondary highway.
#define ROUTINO_HIGHWAY_SECONDARY 4

A Tertiary highway.
#define ROUTINO_HIGHWAY_TERTIARY 5

A Unclassified highway.
#define ROUTINO_HIGHWAY_UNCLASSIFIED 6

A Residential highway.
#define ROUTINO_HIGHWAY_RESIDENTIAL 7

A Service highway.
#define ROUTINO_HIGHWAY_SERVICE 8

A Track highway.
#define ROUTINO_HIGHWAY_TRACK 9

A Cycleway highway.
#define ROUTINO_HIGHWAY_CYCLEWAY 10

A Path highway.
#define ROUTINO_HIGHWAY_PATH 11

A Steps highway.
#define ROUTINO_HIGHWAY_STEPS 12

A Ferry highway.
#define ROUTINO_HIGHWAY_FERRY 13

A Paved highway.
#define ROUTINO_PROPERTY_PAVED 1

A Multilane highway.
#define ROUTINO_PROPERTY_MULTILANE 2

A Bridge highway.
#define ROUTINO_PROPERTY_BRIDGE 3

A Tunnel highway.
#define ROUTINO_PROPERTY_TUNNEL 4

A Footroute highway.
#define ROUTINO_PROPERTY_FOOTROUTE 5

A Bicycleroute highway.
#define ROUTINO_PROPERTY_BICYCLEROUTE 6

Type Definitions

Typedef Routino_Database

A data structure to hold a Routino database loaded from a file (the contents are private).
typedef struct _Routino_Database Routino_Database

Typedef Routino_Waypoint

A data structure to hold a Routino waypoint found within the database (the contents are private).
typedef struct _Routino_Waypoint Routino_Waypoint

Typedef Routino_Profile

A data structure to hold a Routino routing profile (the contents are private).
typedef struct _Routino_Profile Routino_Profile

Typedef Routino_Translation

A data structure to hold a Routino translation (the contents are private).
typedef struct _Routino_Translation Routino_Translation

Typedef Routino_UserProfile

A data structure to hold a routing profile that can be defined by the user.
typedef struct _Routino_UserProfile Routino_UserProfile
struct _Routino_UserProfile  
   {  
      int transport; The type of transport.
      float highway[14]; A floating point preference for travel on the highway (range 0 to 1).
      float speed[14]; The maximum speed on each type of highway (km/hour).
      float props[7]; A floating point preference for ways with this attribute (range 0 to 1).
      int oneway; A flag to indicate if one-way restrictions apply.
      int turns; A flag to indicate if turn restrictions apply.
      float weight; The weight of the vehicle (in tonnes).
      float height; The height of the vehicle (in metres).
      float width; The width of vehicle (in metres).
      float length; The length of vehicle (in metres).
   }  

Typedef Routino_Output

Forward declaration of the Routino_Output data type.
typedef struct _Routino_Output Routino_Output

Type struct _Routino_Output

A linked list output of the calculated route whose contents depend on the ROUTINO_ROUTE_LIST_* options selected.
struct _Routino_Output
struct _Routino_Output  
   {  
      Routino_Output* next; A pointer to the next route section.
      float lon; The longitude of the point (radians).
      float lat; The latitude of the point (radians).
      float dist; The total distance travelled (kilometres) up to the point.
      float time; The total journey time (seconds) up to the point.
      float speed; The speed (km/hr) for this section of the route (ROUTINO_ROUTE_LIST_TEXT_ALL format only).
      int type; The type of point (one of the ROUTINO_POINT_* values).
      int turn; The amount to turn (degrees) for the next section of the route (ROUTINO_ROUTE_LIST_TEXT or ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML_ALL format).
      int bearing; The compass direction (degrees) for the next section of the route.
      char* name; The name of the next section of the route (ROUTINO_ROUTE_LIST_TEXT or ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML_ALL format) or previous section of the route (ROUTINO_ROUTE_LIST_TEXT_ALL format).
      char* desc1; The first part of the description of the next section of route (ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML format).
      char* desc2; The second part of the description of the next section of route (ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML format).
      char* desc3; The third part of the description, the total distance and time at the end of the next section of route (ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML format).
   }  

Typedef Routino_ProgressFunc

A type of function that can be used as a callback to indicate routing progress, if it returns false the router stops.
typedef int (*Routino_ProgressFunc)(double complete)

Variable Definitions

Global Variable Routino_APIVersion

Contains the libroutino API version number.
const int Routino_APIVersion

Global Variable Routino_Version

Contains the Routino version number.
const char* Routino_Version

Global Variable Routino_errno

Contains the error number of the most recent Routino function (one of the ROUTINO_ERROR_* values).
int Routino_errno

Function Definitions

Global Function Routino_CalculateRoute()

Calculate a route using a loaded database, chosen profile, chosen translation and set of waypoints.
Routino_Output* Routino_CalculateRoute ( Routino_Database* database, Routino_Profile* profile, Routino_Translation* translation, Routino_Waypoint** waypoints, int nwaypoints, int options, Routino_ProgressFunc progress )

Routino_Output* Routino_CalculateRoute
Returns the head of a linked list of route data (if requested) or NULL.
Routino_Database* database
The loaded database to use.
Routino_Profile* profile
The chosen routing profile to use.
Routino_Translation* translation
The chosen translation information to use.
Routino_Waypoint** waypoints
The set of waypoints.
int nwaypoints
The number of waypoints.
int options
The set of routing options (ROUTINO_ROUTE_*) ORed together.
Routino_ProgressFunc progress
A function to be called occasionally to report progress or NULL.

Global Function Routino_Check_API_Version()

Check the version of the library used by the caller against the library version
int Routino_Check_API_Version ( int caller_version )

int Routino_Check_API_Version
Returns ROUTINO_ERROR_NONE if OK or ROUTINO_ERROR_WRONG_VERSION if there is an error.
int caller_version
The version of the API used in the caller.

This function should not be called directly, use the macro Routino_CheckAPIVersion() which takes no arguments.

A wrapper function to simplify the API version check.
#define Routino_CheckAPIVersion()

Global Function Routino_CreateProfileFromUserProfile()

Create a fully formed Routino Profile from a Routino User Profile.
Routino_Profile* Routino_CreateProfileFromUserProfile ( Routino_UserProfile* profile )

Routino_Profile* Routino_CreateProfileFromUserProfile
Returns an allocated Routino Profile.
Routino_UserProfile* profile
The user specified profile to convert (not modified by this).

Global Function Routino_CreateUserProfileFromProfile()

Create a Routino User Profile from a Routino Profile loaded from an XML file.
Routino_UserProfile* Routino_CreateUserProfileFromProfile ( Routino_Profile* profile )

Routino_UserProfile* Routino_CreateUserProfileFromProfile
Returns an allocated Routino User Profile.
Routino_Profile* profile
The Routino Profile to convert (not modified by this).

Global Function Routino_DeleteRoute()

Delete the linked list created by Routino_CalculateRoute.
void Routino_DeleteRoute ( Routino_Output* output )

Routino_Output* output
The output to be deleted.

Global Function Routino_FindWaypoint()

Finds the nearest point in the database to the specified latitude and longitude.
Routino_Waypoint* Routino_FindWaypoint ( Routino_Database* database, Routino_Profile* profile, double latitude, double longitude )

Routino_Waypoint* Routino_FindWaypoint
Returns a pointer to a newly allocated Routino waypoint or NULL if none could be found.
Routino_Database* database
The Routino database to use.
Routino_Profile* profile
The Routino profile to use.
double latitude
The latitude in degrees of the point.
double longitude
The longitude in degrees of the point.

Global Function Routino_FreeXMLProfiles()

Free the internal memory that was allocated for the Routino profiles loaded from the XML file.
void Routino_FreeXMLProfiles ( void )

Global Function Routino_FreeXMLTranslations()

Free the internal memory that was allocated for the Routino translations loaded from the XML file.
void Routino_FreeXMLTranslations ( void )

Global Function Routino_GetProfile()

Select a specific routing profile from the set of Routino profiles that have been loaded from the XML file or NULL in case of an error.
Routino_Profile* Routino_GetProfile ( const char* name )

Routino_Profile* Routino_GetProfile
Returns a pointer to an internal data structure - do not free.
const char* name
The name of the profile to select.

Global Function Routino_GetProfileNames()

Return a list of the profile names that have been loaded from the XML file.
char** Routino_GetProfileNames ( void )

char** Routino_GetProfileNames
Returns a NULL terminated list of strings - all allocated.

Global Function Routino_GetTranslation()

Select a specific translation from the set of Routino translations that have been loaded from the XML file or NULL in case of an error.
Routino_Translation* Routino_GetTranslation ( const char* language )

Routino_Translation* Routino_GetTranslation
Returns a pointer to an internal data structure - do not free.
const char* language
The language to select (as a country code, e.g. 'en', 'de') or an empty string for the first in the file or NULL for the built-in English version.

Global Function Routino_GetTranslationLanguageFullNames()

Return a list of the full names of the translation languages that have been loaded from the XML file.
char** Routino_GetTranslationLanguageFullNames ( void )

char** Routino_GetTranslationLanguageFullNames
Returns a NULL terminated list of strings - all allocated.

Global Function Routino_GetTranslationLanguages()

Return a list of the translation languages that have been loaded from the XML file.
char** Routino_GetTranslationLanguages ( void )

char** Routino_GetTranslationLanguages
Returns a NULL terminated list of strings - all allocated.

Global Function Routino_LoadDatabase()

Load a database of files for Routino to use for routing.
Routino_Database* Routino_LoadDatabase ( const char* dirname, const char* prefix )

Routino_Database* Routino_LoadDatabase
Returns a pointer to the database.
const char* dirname
The pathname of the directory containing the database files.
const char* prefix
The prefix of the database files.

Global Function Routino_ParseXMLProfiles()

Parse a Routino XML file containing profiles, must be called before selecting a profile.
int Routino_ParseXMLProfiles ( const char* filename )

int Routino_ParseXMLProfiles
Returns non-zero in case of an error or zero if there was no error.
const char* filename
The full pathname of the file to read.

Global Function Routino_ParseXMLTranslations()

Parse a Routino XML file containing translations, must be called before selecting a translation.
int Routino_ParseXMLTranslations ( const char* filename )

int Routino_ParseXMLTranslations
Returns non-zero in case of an error or zero if there was no error.
const char* filename
The full pathname of the file to read.

Global Function Routino_UnloadDatabase()

Close the database files that were opened by a call to Routino_LoadDatabase().
void Routino_UnloadDatabase ( Routino_Database* database )

Routino_Database* database
The database to close.

Global Function Routino_ValidateProfile()

Validates that a selected routing profile is valid for use with the selected routing database.
int Routino_ValidateProfile ( Routino_Database* database, Routino_Profile* profile )

int Routino_ValidateProfile
Returns zero if OK or something else in case of an error.
Routino_Database* database
The Routino database to use.
Routino_Profile* profile
The Routino profile to validate.
routino-3.4.3/doc/html/example3.png 644 233 144 241144 11541143732 12374 0‰PNG  IHDRôA^#X oFFs6È *8 pHYs  ÒÝ~ü vpAgŽÌdKž€IDATxÚìÝu|KÖ7ð_uÅ•¸'ÁÝÝÝ‚»»»»»^ÜÝÝ!X€B—±®÷ž»ÞÝ}vŸg¯Àå|ù|vûöÔôÌœ™žœ©>UÅ@!„ò³Ú(M¸…'j/Å2…¶×²ÎA—l,¥ ìQ¤¿k–Ýäi=t®º¾RO>’ÃtU4» côéçs¦l½TìqÍÃ'#Ǫrêiké*²[¸†‰0G TæWÑó1q"0!SàɃQ!„ò“r… ,Q Y84Àù¶õRËâ}7”i^¤|¿­¥'z9­r4j¾M_×8I{Æ8ŸP½B)ôfŽŠ‚Š”«I±ÞIÅyÜ za\©ˆ‰6y/ì¡›ËjHxo~É´Ÿ’xò_ ÄB!?Ÿÿ?…3l –êñIü±Üij€“Õµak*5 ¾ÝÃ7¤…Ÿ³M Ë󚣆²¹Mµu ÷$w~UÃÍz«œ ¯õÓ³¯ÌŽ_ü%yú¢Ë“#v]/S*Á˜,~›,ùI빑«0KŽ\h¡ƒFJàÉŽwB!„ü¬4P@D.ô0°ýÈÄuö„DŽ4“B]¹a©d¯Ž.ël*Ó¡p`‡îÅøÖVPø°[y’6^o>±›¬ŸÊM©7t5&ð »ï¿÷z¥Õ£‘oîß‹Ç'飉UpcUQ“»s-J!È‚Œ ÑÛBþõ–B!„``ÀÁQÅP¥c:±šì6]šÉs£Ü°rC¿Rîvã:W­r¢^¬oCçlŒøY8«­¨Ý¢ëË"1 ½U©æ5MÒFfí˳ÛQîéÅwáKn-zî–<:­¨|ñ ûÀŸó±<±Ç „z)}'ÿ %î„B!ÿŒÜŸŒB ÖŒY!—¯ãÓ¥ÓpÆ0Ø`'Þ4Ù[´®ßª1®•Ò‹•¨ìÕ®Àg@Z"is*èjéi+¬Ä‹B9åDEçÔÍ9ãuukn‡GžØ>øQ­èañ)©3öÉ%X0DH¯ø@¬‚'f`# Ü”©Q9 @‰;!„BÈÿD Dha€3Ñ 5„÷ì+H‡ù5Ø# ŠPÑÐÁ1dcÁE£ûTî]|}ÑaNõ¬Ïà¼á°qgî[}3ÃX•‡XTì%6ÒÌV¥ÆtM>™±²Ô]Õ+ËÕÁw>¾¨§­¦/­_.? ÈW¶É8M*Ë÷`*ŽàÌ „B.æ¡7„B!„G®‰·†*øÃ6B8kìò7±­b¶[;Ô®rÃ×ñëGåµKå|Ά^’ä2MÙupÖ›‰Yîp>c~÷ºœÏÙsâ‹è!é­Žwr(ñ¬Ð³ªñʳ¦‡šŽ¹¨ÂnÀˆ;p€9ÔPB„HoÂÏý$„B!ÿ[*ˆ¡ƒFh±ãÄNÌ™]6îç-ù¹‰ÛÛñV(Ë Ò XS¦~¡«67Ì%Õ}Õ¼ººFOi8?§Ù©Ú¬(\(y­lÜÐ/æKöÞªùüÂßçwcÖÈÇaA˜€ælËc÷¤‹<’ûb!Nã À@CZ”¸B!„ü_åÒê;Øà ©P…íÀé C!¹aÐ]çûô+ø«ÚÓ3¤›_ªê*^Ü _ª5Ó¯1ÄJ y’ÙR“ò€s6úDèæ 9‹ÛÜùâÈåúÑsß›r6a48öðþÌe¹O‚Ÿ©_kšÜ’SEü_%î„B!¿ ¨¡D6´Ð³x‚}‚5‹f³ŒKy+þDnR¶ª·ÑuøÈJ•4ÅÐrJᕞJ¦°³y–¹7tµ„6,ƒU›Õ!ªi†m†ãÆÙÛŸ<+ç²r×í3ÏŸã̷ЄïÅ þ á˜h|B2-óôWE‰;!„BÈo-ê\ðбB,ž?ç•y[~£±[nXïRábÞM†¾©0¼XѺáþc]>Ü MË+§½jè!x eT{5‚êUöè<­¾ûžÏ´±V˺Þ~ñ¢ùs]bp²Ü£Ÿ+2ÅPŶ—}`·ŒVÆwÆ8^_z(݇<à$|Àz[~t”¸B!„üžälKž£] "Û„¯¸€ ¸‡“Ü50_U@1HáÑ*"¸l@úȹv¹„-wK°H¶Æ 9¡ÚH½·ÆWœ-6«[¨â¾–ÍÚûvÃü3#Š­ ¾áû<õƒ½1òÿ{Üù¨ˆ ŒÆMDšJzäþw*§!„B!äßPå›f$꣒x‰éØäüMÄ7âq ÎkÏ}Y|Ø©6å8Ÿ3º×!ãªiŽ]eßž´µsiÈÿÎA9¥O/ÙæsïÙ!lÕ„Ï=r¤Ô3~˜Ë0ßöÅ]‹”¦('Ž=Y2³ÇKÓ°|ÿK!„Bù—ò'ÍØŽŽ¨ËâÁq=C—cÖÇ,kLhRãFÉÉ'&8tÚÃùœéáœOšÒ¡ÐƒŒœ›Ù%ïåqÎyÔ;Î9O àœóE†eþ "͇+˜h#M±Q˜ÄRð ÓÑßôæPAIoÈBD¼à‚OHG–ivRB!„òÇ WÎàâ°“± ‹Ñ é‚È&f,È[ª[rýõ»Í‰—÷Z¾8gPX*Å|«Y šYºec«gëë«ÇiÊäÍ»Ÿ×"ÑKÒó¼óÒïÄF‡ï°x™[‡[YXXß¿JÍæé5rjûc .ã>;‹·ØÎÞ¢B¡ÀU !„BÈŸF Dèa€$¸°UH•>ñ°:¬G¯J•¦,Ð×°/ódfÑÏš”W¹¯ËD…ÏݽÌi«xS“<`Så6Åïu,Z4ÐÓÌF%ûô\[D_ØXUzÌËi6(7‰+QHQY¬³åë‘,«7ï4|ùfÏô§Cb.|vÏÐd™jâ |Å6þŽù£ wâ©(bznòuJáÿx¡ë=V:÷5½ .Ø…9B!„ïkÊDlÃ6ô‡›w—;¶E²?œ‹ìlx1f–ó]ǤMï™^9Ð$ÿ}ƒ[¸–wx·rv³Â•¯d՜ܾË.Îg/î©“zO+ÙuuvãI9Ÿ¾´ÛÎçv¿UzØ–ÖÓÆçÔÈ+™n•¦™©vÉ4ÅJ¡/‹B&Vb‚i—”PÐ{ôGƒÔ.MË¿‹L9‘~ ÇB ÇU,ûuQB!„ò‡’‡‡ZÁ 6Âq¡8c¼*?ŠÛ«&{\sYÉòÅ/ºä°ÇÜ+V'žÉ¬Þ{ú‚šdWÊ»¯SˆÍ„06˜½æ'PèÓÕ¬Q¹MN]|•¿õd6hÍ Äd9œ·9d½Èr´Y¼Á\WÔ¬MÑ}ÔWr>`ùÅlM¥ÿ.×íõ!»ü‹Å6âθfisn¥‡çµÔŽÇœÂuv1ØÆ¾ Êá #YÈ¡­¿»Y!;ÇÊÛ,†9 †bB!„òçW Ø~XÃÊûÅýSFÇ‹g†LÔ]»ÔepUÎïŒåÛ3®ÑŹ=Kccgºó44E5a$k#«%è’ÿÈ%"ëbÏâRái»¾É¹0i}g')fÚÞnvœÏíÞóUÏaªÖ}ÇÙUïT¢E1VS,fó²õ¬:k‹ø&‰/üÄe–cùùõT*_=éÅø‡Nq>§Z¯††Sçwm;mÒ«Î%¥'Ó®v+Éùì¸^novXÑvú¨#UCw»Ù6µ:•ÿh‚€¬ìXa$}ûò(…ÿ/LkU׺¬«)ÄŸÙ:V™bB!„ò‡²‚9Tò¦0–%°@æÌJ²²—6-¹Ð¦&7Üø0¼4ïxkõˆ–7¯Ôµ›h>J³Bi5B=Vϰ#þ£Gòõ÷@y³jØÂ,Öžiò7,èQÀÏöæÜ°úŸÊå¦ ™`Ý©ç³5=r>}~·-Ùí&¹wzÎùô݆s>ר;ô­Í§6w¦¸×®[ÆÖÞѯ\ƒ>å¾o6:¹ýiÎçÎ Ÿgì3õF×Î9Å'5íôœó»á|Ö´žUß/Í;xªjÃxµ²÷²Öó°ñëXO\ÆJ„À ¦îcÓÀVò?Ût²åÀªL›ÃÞ²þT‡D!„òa`[Á*à¦&”c í3mBÌï]_µãît3uøÎo 8pÖŒf“MwŰÔTÑnõ9-£"_™M”@ÈŠ"‘ÍÀaŒÏß°`]§êöÅg4¬³¿L•Äsãzu<Íù¬á=+ò;ÓƒºÎùeÒ‚Î*ã¡iv]—s>w]øö7G¬h;abVÍþ¥|=,™oË4q;˪±ÌoL»T¦žrÑnïÃv®5` +X‹±‚’Í¢˜B!„üîäÔTÂuÁ™••w·XëqPCβ1_µÎç— ¡­s-p¸mé:E¼]oã"Ö¡Ÿ%fµ`ͯ6¿1¹2^ â1 Å™ìk“¿‰‹™u5‹MÓ+ÕÉ+£ÿpvô‘öµ8ŸkÞ“óé§»Î::ñZ§ÙœÏ(Û݆ó9z=›9ªS»ÙãÏÔô+ÕÓõ¶õC cþ£‰cY †˜ŠpT„Ü)…ÿ'NÕì”SÛTc$>dïYWØÀ Š !„BÈïÈfPb. 6«…<,2»­±Q>x·jïÖðã”Ë/9¿7zTúöm­¤³šl&Û%l¬"Vc,šÿîÏ0O¼Ìa.tfm˜ ËÆ#ÌÌßÐ#ÕÞÌ:~¶m=ϲ³ßž9©/çs&÷ºo<:­H×ó¹Á“Žwv’vM;ØÍŸóÙozyÇ ]­ý•±›ª= {ïžc×Ñúhþ£±0 E9a%ëÇÜQžp3Ý üôiü•v=«5¨ÏÔìà„ƒ¨‹PlG?à£@!„òsóU–s¡ë)oO¼ÞuW…Kœß~=²³|uðÐò)GNîêÿÉã˜Ó:ëµh €Il²ÿ„çœ`kCG`€0œ5cß$Ó•lYmZ²rhÈž÷ £#Úâ|ö^•9Ÿþ±[ZVìÄ·¶ñ¨iñÝTœÏÝßlÖ¶ËŠ„¦=+—÷…CE›³ß„ê1{ËZ²Qxc¦]æ?ñ<ñ÷|úF7yj~LýXí)ïaqKèœ"„BùýuÙ æÅúˆ NÇí†ZL|[nï©^ {®/6ƒóÛFœ[9mX¥Z3äöì ‡÷¦;«¡ÄŸ½öŽŠ_Ÿ[‹4\;³u¬`þ&Îݬ'XÄÍô¬;¤¬æÝ´‘ÚvnœÏ[Þ»“ôbÚè®Ñ9e&µîô–óéún:Îgi{ÎKÛ51µsêÂZ 'Vè\t¡Ë-‡OùÆá±½ˆÃtCy„šnøy¶>÷<­e/—6c­jÁ ˆì ôx@§!„BÈï¢9ª¡˜Ð‡]@мcÞ ~Êj39xuLœ~ãÅÆƒº%{žì3€;åÚ×°ˆc¡øˆ¹l4óÆ!XÀ컚H19Mu{Ì€;,éØŸ¿¡/"lÇ&W÷+Q>¦þȨvÓ8Ÿõ¨çdΧí–stҼ΂~ÙTÏ.çsöÒ})0~Z§aË®7¾[ñDA'µý7S– 3XF³žÌôK^ìé¯]NóÖ|Ĥ¶üßH°ob D!V• tNB!„üÆ,a›ÈüpÙ8¡~çÜ횥ï93e6öˆIœ?*6vô¨í÷—™Ë&³ÊÈPøˆÞì!  ~€×¨4•10ÜÅxôP@pd+ò7±hþ^óedfµÚ%ÊG?>³ÍXÎç< ¯Èùô}Ýve5œx¬Ó6^mÚ’®w9Ÿó*Ü!%tüÙNêeYM2+W âxÐveþ£‰ƒÙ ÖK05PžØúW“ðz¬m‡ÈÖî¯LëZ [Ø$V‚Î,B!„ßL¾I…©ìó¯%%;KO m¸—óÛö#V]o1¬ê;½ó{5ö\á¼Ê¦5»Ãš`§¶ì‡ËAÿ!uJ²*Ð GX)<ÉßÐaºåHóm“ž×L,_lôúöÓ8Ÿë®’´Ób»5Ïõt¬³‡aîÔm]»s>»_Ïe©O&±.-õi8ª|ZQîz¦€ó7›ŠðâØ2VÃQ•LûÿbeÙËצtN©ÐÕ÷ [ª)ÎìëLç!„BÈoKØ*X³òv©3AJ÷V9æ: ÞÀ¯ÔÎù-i$뺨þ¦àѦö—WVë×;ÿ°}ÈÖ ”†Üñ £ÐAhÍj|»Ø“WˆÝT+CŸØrÓ‹9½4buÛ¦œÏV÷¼Ìù̲ݿd§NjÐ)ÉÐcj½.ÙœÏ+žðùö¸›¬jÜ̳ò-¿Úom‹íÁÐb+; þ·"p ¨ øûâsÊNíÚmy­M{½ºË{ÄÉ,•M£S‹B!ä7 §¬7± }ÅuÂ)6ßl©ú¥²ëáÓ³ 4ýÀùÝ£Úw_«=tê}ïõêŽÁ’`]Ù5ÖwPÅà[XBý—Љ”¿^`ÕqëÅìk–¿‰u†Y3uܘºÕU%–=¿<¤B+Îçv ?ÎùôòݺeßšT©Ógî=íL7‘óY{vÊ85ٲ˩•6M/T*‘â±ÕiÜ7oÂXœÇ\v)8Ž…hê¦~¬­Æ±3{Z5Q´†ïFÓóO¼Øv:Ë!„B~j¨ „pÖ£Ñ!•¶§x–”„ÛúQ'´[ÎE 0r~·Ü¨ó ¤òÆ€þò„K‚ 4ØüU[æOš‹Ã ®,žið@pb 'ó7,PÆj©Åœ¡9•}C*DW1²íÎg íéÏùŒîMsŒ“6vVêFLY×e'çs²zíÏh4Ù¶Ë©µÛ¼¨Ñ'Xåö¥À¾üGc}1 å…Ol«°‡é¹:ÿ{ÆùœáõÚuY0[Þ£h$4dWè,#„Bù¯È“6zÃv¸Œeh ð¼â²Ü§íg¾êúåaµ9¿9rÕÅ£K—´m¯ÊV~Q|d˜v±rÈÆ®Ÿ.br%º\4PM<'hØ7CQm&›Y¨ ˜_±dðÒ—k†niõžó9iá8ŸY£ûͬßu:gœ8uK×âœÏYØëfÆÝI}:?ÛîÚ&ºÆœàGn æ?š°UG"«€˜:„×w=°•¿™Õ;®{õ’>GLÛ% b/è\#„Bù?þÞ—,l”¬ª¼Ý¶LÍáA~œß,5¢„qöå¥C,s–]¼4¤u• ÐE^rÑZèÂ~-óø9W •ç|ýñì8»YUÄåohs×|’&ihŸJ¿ç=‰\½åÎçÜï•ÁùôÝöçÖÕ¹²þÈÔ°®¶œÏ:Þ30S{v[·ÁµE­*Ëî÷)çúMm(¥hÃ~au1 MÿVNóý lå|á´¾Ýúµ+ýµ°»¼Gé$lb™tÆB!„ü7Xo抓ì$kŽ;fCÔG•}¾Ûø±ó`iÇ­–#jr~óÄðE§Þ,¨ÝRkjˆÕÁ5ÓU_Þèçâ߆µ!ð€3n ?š >̱ù:–·ìbþ±ìÉ¢«^M6±uç³¼{æ|æus MêÚ)G÷jÊ’.S8Ÿ^&íÖ¤Å]üw¨Ú†Ô84Ó¥£ÃD@ùhBA<ÁÁ‰•ùÛðÙïažxÎdõ¹2æX‹àMòóT`zÖ¾p„-}Z!„Bþל᱋0ƒ –wô;ÙÜ=ì4ç÷÷Œ¾­;wþåÀÚWÚ ëê\ðˆs³À-ôegX3ÜÉ?q$ù'òlõÇA,T¬º±;ß4骪©\<¤]¥!›#® òo1›ó¹{ÃS9Ÿ~£Û¹ìÏ“ÚuVL½ßµ ç³ö4Ë;3u|·r›w´Š¬–Y¶½×EÿüGc°ã ³Æ}¬CÔ7Ýð‡leœÏwè]m®þ⽈áã œ-u¯¥0Šé±MzÈ0 ‡×ô !„BùØÂæƒÌE0󄹕¼”zÅÃÓ6tÚâ³Äm³åtE[Ë«ê+Cvš?ô|pÙ¤Kk„6ìR¥¥Oü6â@‚Náü—ä~x”P²éx†Ýo(¸34—Ú-²hÆ[¿(Æ}1¤Oyÿ¢k‚ʲ¾ H)RüaºR†ÕB˜Ð•Tuшª“¹´É†ÊoGî‰×®î~ßåµî¶Õ;ׄc¦‡ FØ*6•µ3FñÚüd 馭z!ýޝšó¹Ë•k2›EWÖ™v¥¡l0 P™>„B!ÿ‘|ý¯‚=[Ž/òöä ݇T|Âù]qäGc“+k‡,LypêË€wÁ¯.:Â^ €¿è.ôaã)„¿AüåzôZ(†Bâb–ÎfåobÕ]ý^5®p…UÁ.ÏÛ ~Õòç³ÓzÝä|æ„î Yº‰ºN†Sº<æ|ŽS¯Þ9½¦tìÚu÷ðö…k-(UÝ3Ô) 2½Ë§Y=$³Ñx„­hŒ øþm`ëïÕÏùÿžïwo\k óa½Y¼{ÑMé3@!„òŸcm™Ná F¢„Û…IÖï?Ÿ=Ó7LÚvµùPsÎ﬙¸`bÿÏÕ›Éí^bð߯*¡ø ¬îù'¿``PCüu„[ƒÏ¸(b ˜kþ†æÔÕbÿÛåßKЏ7(½åBÎç| ·å|FµîòöMžÛù¼®Ü”Þ]†s>k_\Ãõé{»?ÜÚ¦u—êÁUÏ4õˆúæqà «³«¬&£)j˜ö+~Ë)&€tŠKÖP?WE‰×Ä]b]ƒ— £ìéÝ'„Bù7ä^ÖøÀUü 8±BR OÅ”îm^–\èdçÞѺ¹±gæ…<–>ñK³ìGóÄÝçïþ‚(ìF?Ãmcï†þˆ†ÙÈ…žÂù_‘‹g´0Â('ñ¼?œQÓèɸ-Ž +ê £Ù]lÌñжԺ¯Æm{M¯wœÏìÓ=!§Ù¤Eý …¦úw‰â|Vµ† Ó{u?¸Åغ_õæ•Júú¹^ÿæƒQ«1€i™ ·°½ÐÌtÃÿi`«ÆãQÝê“j†²µò–0”m“KêYAØÃŠÞ_B!„I%D9 ã£ø#^Aè‰#ãó:}-bµÇ✬ j˜âÕëQO’Ûn½}ÚõEfƒ˜Ë,àŪ!:(<èa0•Ó¨03 ۥ˼›ŠØ+X‚ã$Náfì~÷èäë"µºmézf[Ëî{†].x£úû¯]Ì«-”gÅWŠ‘ŠÙ:mý5C?ƒ“Á§›P"Î?û’}·½õvý²¶}õš™ýü‚܃ømôÇ*®æ:T@(ŽãˆÆn±ž°† lLÏê?^±U@Wò&–ª +ÅDÁWøµ„ßv° ÷—B!äŸ{KuÐÃÈÞ²¡øÀÕ¼$ú”´-¬t]ÚeoÝj…m‘9uõõ„áÊbß5£ŽÌyr)U“±3Ç(¼‹±z’–âÜTÚAþHùc®ƒ:> ÅÐNÒA‰&h€3¸'d°¬‘!Ô0×°çÐÖgyo µ:o}²x«vû¬®™ß,þ~I2S}RUuQGin¨æÄæäå­fO¥óFeÛ>Á¾¾[/;7®Ul߆ŽMj,ÛÂÛÊ¥;ñsy¾IXÊá Š»ØˆÖAAˆù–yú}ñŒ×˜6§ë«Oûòšk„ ZùéÐÙO{2kæg½p+øFTà z !„B¾!ÏÒ­PQb»™VÄ•ÜìÄØyæ-Ê5ô©²ßïÒ»""'Æ„¤U*¡ /¿ã¤¾—Ïðw< {0kq–&}üîÈóÄçBsÄvÌú²@öÜ8“—ã¿ü­•ÄÚ·K ½^0±÷ÝRî;«7õâ207ÕöÕ6¸ GY*»¨LT¹)¦’Œ_yú^õ‹òq_6:<<õéŠñÍñ-LÇ*¢;Íšñ-<c°çL[ ù¦˜4–˜z¾k»Ì[“GtUxܶYjaúð°YxˆôÞB!„ü+âAá>3%s š”ïè__[åF‘áÏu.,T‰ó»Gé[ØU]Th‰Ü†å±)ˆ7Ý™ý©kp’ÿYþwÆfPc <‹€W¡G8Ë7šUS­Wæ6y\t¡_›§û.mÉKÌ0ï~óÙ%zÎÌÝ;Iê\//cò™Îɜϭî–=xJh×úü;.«ý©L‚÷(—Ï.1µéa3p }…^¬+s"¦ .00…TMø³ŠÑbŽxÙ°q¦§èË_g©$„B!&j¨ ÀKìB?©‡äÄo Ù $Ø®téRJ'a$«‡ëf9ÊÙW²î”‰·;ýìŽ"F#4`»‘#}ä*Œ„J( …žªÛ¿[ù¯ƒd ZLÃyÜçã DU B]TTª³ý¹Wt½õfÇÂ^ Çð¢PÌ¢vÂúÒ§@ÉÈ‚_«}ñá²`TæÈî•ç¨Þ'Žc+Z~ Šõ l8Þ£Ü>å«êï‹­z{gv¤çMëwM>®5ÕòlGUø =ØMlâ¾硳˜2·Ë>Îg ê‘W¸cŠÍMù²óˆÃz×!„BLòõ³hÖOåíÎoêÏ ®Ìù>£Üu·/th0 ¹yldãº6emüZËmÅ*,Bø!þý³À|±37f…[H@7Ô3½ãÕ —f/‹Uôë{Í¢š¼ä|fïç9Ÿy¦Ç8mÉk;ŸÈó˜<©óÎgçöbÚÓªt·øe`û5/Ö^]Xô1ûLJP0Ç[¬ÄuǃV[,†™n1ÐP B!„|äšã¶hˆò,pU?TÝQÚŽܾC‰ü’þ€A©,g™§s.ôF‘ÕÅaNÅ6÷ 7Ùrƒ¹ÑÀ+ÑKÆ¿çÉ<1Yú̳Q îØŠ3B6ÛÍš®¢ ŸŽy~3fm­›öžjаwÁµ×Ç_úÒG•¤Z§l ~¯y¢Z™k•Û-ï‹`. 1Žo»"8ÏwóÉ­í"«Ù_± i¼º~­Â[¼34~*kå\²a€8ÃÊ¡–yÍ`#щj®ùXÀÌŒ™13¸Á nü.¿Ëï f03U¥Iþ6¬„BÈH®G×ÃI‘ f±S½q4·ëɹ¿_hyÁÍŽVÒôœ½Ú‡ð0¬æ®o9zû„ÁÉ8RªÃÖ±j¸‹ó¸…ÁÈ¿ ¹®ENåÍ „B²àø1fƒ­˜.ta¾ì‰ÎÎPÕpð0žáÍ»Ãxvðíù¶CBf,êm(]«uL¿$—Q€Ô×8J7-7]·Õ`„¢ê]ïA&V…ϱZwϵxk“Ø÷›ß|öC-†š ¤øò¿ldódžÌ“ùSþ”?5¥ì2JÙ !䯃ƒ UØEæ`¬/Åòý.§ZæŒÐ~c©ÆЗ3p±šemõêýþW»Ä´}äôjdb$ašóÁü&*˜zëÉ_[®ižx<Ý0Ù¸•×ã'0 µPš=ט3¶rÍÞeOTÑí†n—Ζk³½ÿù2çëÇÄ&E 'D¡²jžæ“JÒmÒÕ¿Î[¦uÐÕ¬s(à£kkEþDz;nVY]Àzœ£Èò/™ÃæÈArðÏñ¼ÀÆ l¬+ÁÊpÖpÖp6å^ʽ”{(„B(„×x×6Bù!)Lk\ `ðƒ-Œ|Cï.¡uwû<ö±´í¡–a‘û59QÆ„i‘›Ío¶cµ˜ ÙM6„­–DIä´ÐCOáü)ä/6ÏD.´X€«xÌg@*¦­‡…Jlc^¸î†¾Æi¼º‡ÓxÕ% J¹çëׯsé•¿4J,8ÃÝ „(«Uç½×]ýæ—ŸÝs³ÓªCmBþ(€ò¦pM¸&\+>­ø´âÓJ¼)ñ¦Ä›B7 Ý,dä–h‰–0Bù`„Äna¢TޝâÜé…}9K‹Igº,/;Áø*csÞ:Õk'³{»œO xþ*9Þ=¥¡PšídéÒTÉ‹¿Gò(eÿÉåå›Ah5Îá–áƒtƒ×`nØŠ©‚Óà&«ŽmuêÑË2ïbïÜ~ê¬sí˜ísÎw=e½/ñŒjƒb "ù›w›-š0ÕlÂnŠ/!ÿ ;ý.â".êVèVèVðkü¿†R(…R¦[³…, !„üäžv#$,FÂÞqéOŸú®»Y…–Î6£U{ùÝyû¯ª¤^Ù'VXêýd/sÆlÔà+ùC C&^!‡I¾‘`k"ºa*Wqfà2ºÂ(Ìc™TžïäªDOyKßNª^ñ{é6è›w›Ójg%ý"$äßÉ¿d†¬`Å겺¬®Ð[è-ôN˜œ09a²éV!ßòÅ„B~,FHàbWa=[/-’üøûÖ…œ\âÚ/ªË ­0ÌÍ+oP±†ªåðEï÷.yäôæÍ‡V)óñ€Ä/R&ïÃs „"’üKr¯…FÓÀÖ1|%…½ÑMÀRIi¹´çòˆ75>ßô¸[÷SUÆPŠ"!ÿw 6 6 6BùáÍF_Ô–¼ùBþ…˃,[8‡³]aßÈ,Ñp;óQÞöDÏOÕ³¬Ö®>²!" 9pB?tFœ†ÔP"Z*’!ÿ¡|[Qó±Õ¨â‹¹sЙcÐßwnã­Ò*òLÿm„nº3ÍçNÈLYYYYY95 !„Œ"Vˆ½ÅD¾›£Q‰>…ʸ†uM¯Ÿ[d‚nYªEÎÕ[½¹qqáuîw²¾>ÍX•{\!¤1f4“¼ø1ä"šRvò?ëÖÁÆá$nrà$n~Óãn9K™+¦âÊ V0ƒš¢GÈÿúŒ“¸Äi HBù1YÃjd Z¦g×Ù8~ŒçñÌ™=bËOcïÅCÐ*}Ì.+ƒ¢Ÿ½Þð%zSíSnÏ¡ fb­Ôœ¿ç'QѰ¦@’ßÃßw¢ÕrÅfa)žÀᨆÄS_;!„B~"ȆVüExÍnÛI…x…Ú—ËÄû}ªý²üŸ逶¨¡—kö\5gQëkŸ¼L“‘››+$²,@ZÊ}¹500H´=ùí ( w8<ÍÕQŠ—¢½ê„b®˜ÉO¡&bZ¢…‰B!q `­˜vc~ÁIÛÍV%5g&uì<§ô=Åye2{ÁN*Š ¬z®þ\uÓ¹ã"4,¯1RÊäC¸54PAA);ùý( 8CÇýy#åÅ ñ‰ÍG³ë/g3Çfç°—h‡z8ˆ ,B!„üeYÁ*6¹²ÍÆ¢Ò~¡î—2¥}ÞUN¨á»PÛ(yHæeE›Êæw&ÔßðìæuÃ@£¥”+,.±«¼®”ËŸÀ F $ùýœ âEy+•¥ØW¼j7Ø,TÓ `XV¨Ma"„BÈ_–*ˆh‰ê(*¤1Ü^¹]qUÜ:·xoC¥÷’UÆŽÜcêv)æÁçl¯oŒ9yù壸xsá´`Ï*óúÒuÞ óÏÎMÈïCbÌ•9 9wUŽx_˜o}جŽJB%HhÍæ²Æ¬§O"!„BþzDŒÂR!—•”l¤p¾qðØVJÚú¬÷¬kc&ùió ¡Ùs3éºLQmîv+QßÚPÄ"脺¬0×! ch>òÇXœ`Çï¢%§,'^­]ÕCUL·OGm”¡0B!ä/È ’МÝg¼–´¹ZFˆn±"äž´]:, cÕŇB/¹GO¹7âe‘Dö•G¢¤’Îò ¦ºvJÙÉB@œ`+ä-1KYX¼"äZ[kú*Ê7³é¨…0 !„Bþ‚* ¾˜Æj@ÏïÃÃûŒhr!ä¨ïÿ4ûK†¹“ôò¼rûoM¬·iÿ͵Ì7ÐGq/` ÈƒŽ–í  ÂV<’à+”Þ¢J\o•¤2*˜` «ˆÂ¸B?$ !„òb+hX(ûˆ9| Ïä™n‡÷ZÅ *ßò|èq½{Ú„œ/ªûn–Ïç>^ä–êÇ$ûŒÑÂ8!–åKà - E%,þ°…ÿ„‰ØÁ* ®l’¥¨Ú§PÉ7³¡(…‚&B!„üE¨ „ˆTd"Åã ëÉs |œk'ór›œ1Ó‰!ʳ"K</µõæI§2_\‘Ü¥p~Œëx#À1\ÇkÐ@ò‡;Xòh>»‘)8 ƒ¬V*׉¯M·D)øS˜!„ò¡ƒFa"Kc¥¼*Ï.1¥PŒkD© ĤW¹Ÿô á”2Ra¹æÉQŸç_¢×¼_™’%¾²:Ò4nËoC„`ŽJÈJDˆXϯÂJˆf‹,Z*¹ø +=P.è ÐïJB!„üðú¢5*’0–=d;P‰­Ô¡EÁkæ‚}ó9Æ_2Ÿæ&Ç‹N¤OX¸cËÝɬ²amäROþ ¬aµ¼º*’üñìj!€E?ÜØ–j^Ha+dÈ7³(ÇÀÁ)g'„BÈÍ æP „[Lell<$õ/·¬X)ñmw×Ûä¥OuÎ^¤Ìµ=b¾jVŸ%›®Eæ¾Ò2ˆB.«€Wü>?†aÈB. E%AC åv†'\(aUY™®ìŒ('†1|> ÃŽ,B!„üÔPA!Ïÿ"ÙI³¸OGY,žªî¾©ü4³NŠ ¨©X`^L±ìù×ϯ~I¸¸ôÕK†$,æñNÈDôT×Nþ\BFývã{!}`ë)Nje5ج‡ø‚/H’ºI=ù/苪(IÁ"„BÈFƒ:„æì6sBqtÃæºÇÊNñW«héÏ–Rívƒ¹±/ˆÇsCw&Ý«q2{M^œ°TÈcex_ {00ªk'úÇ9sµ~¥a±p÷°à½ùi+_uUŽÐZØ,Ü’:¡?Ž¡#J!ˆ‚E!„ŒΊ"뉷ÿS”7Y…S¢«.­ç…y4 TC¾wBJÇœ¹øÈòX¤d…PL@Œ˜È6h†‹6B¶©UQXAI+†B!ä»#@C+ÔFiÈâØl Ãc¶zvP¯âÕj{a™ (Š+â4ïJ¥V^»éؤ§ l/+¥Rã'þÀtêk'ßÿ‡]o|Á?ÀÝxU*)4d¹Ø?~˜kíßXN4Ÿnú$7Âr¾ –PCE!#„BÈwD‚.öV°™R)?¨™]j¸·YƒQU‡ø—Ö§æøë>°âjs¥~rÑͽîŒú²&õTÖF´D3´áw`¦ÔŸïž …ä%Ê;JgÅ:Œ³ýãökÍÃ4uM­:ð­8 ¨(q'„BÈwB.c%ºIó%? ÉÃÞ·~Z²¿¦·ê¥PU< œ.ÚDÚEN¾}¸âµ·¯ß²9¬0ŽÁ‡·Çv˜C%Í!C~‚ö¸ÑRòËyk("-ú0+v^ÁÅ>ļަ…܆·Æ6ƒ%ÔPRÈ!„ò'“Ëw 0BbÖìñKðÃúæbÕu…K5VÅxϼú±á)Š\㊇æDôÂ,ÅR¾ƒwƒ?¦Á·)äG'à87“ædši{êîÂQÖ‰—áe0Ú²¡ò³¨òØ36ÛÔVC‰;!€d"SÞ”Â%½¤—êIo¥·|™¤’TÆ_Œ Œ ð÷pÏta—RvBùo!A¦²tVÞ%5àÜ/Ød]¥cdí„B»Œtk ñl­ºrÿª‡½ž^y¦}»òóHæÈ¾à4Ûò«PAIUäÇ'@5Ô™ãsOk]Á ¬‘Êð’|¬eSårqnÁœ¿þ[[ÆA~v"Dˆ(/xÉ;T‘êÚêÚ*­f’f’R­þªþjVÖ|šù4q ¢ž¢ 0À?!ˆ‚G!ÿG}ÑåøHŒäSàÞ8;:¯Ct™ŠžE½»Û]â} IR“¤_¼³ã–­Þ“˜€kŒ1X‹K0ƒ 訮üȃÚì›úlÀ_‚_€Ã8¡¶w±‡V×Õ+ÕMm¢8 RÈÈO‡™&W¸ÂU¡P¾Q¾A?tG÷9'÷ßW|™î„ó ç±×öÌÙ3çæü{?ì|užÿ<|À¼QÔQ¶R¶ú'G#„ò?3‡ V„Åb2¿Â}°Ìo¡{€Ý…Þ[š,(š­;šž=CáeSܼò ÷­eï.ü¼èë´ìËbSq&Çq } - Hò×`*}É^o°’îó`žÀ&Áì«Ï 9v²Ü`6KnÃF¢6ÊSÈÈOGž2ìNáüáÃsý ý ¬Ál±ÖØV´­¨1h^j^j^šß0¿akQÁ¢‚ò˜z˜zã4N³óì{€fh†f¦£É=÷„Bþsh Dò``÷±™õ@#LÀé)»êË/Ðì3+¥Øªl` 5¥ìä¯Ç”¬dŽÓ½Óoâm¤3¼+V  ÅYûj«5[¯>%·aÝP’¡‘¿”ü³¾lÃ6lC4¢èBŒ#Äøºøºøº„Ö ­ZÇ“y2O¦¬;®;þÞìãˆ#¦Ôî1¹ÇäÏú‡o¾ÆF%G%÷Kê´¦Óšá Î/8oktdŽÌo²ÏjŸÕ!;Bv„ì°··GGtDG\À\ÀvlÇvÓ˜ü?!!äçdk˜ ¥…Ýì«LJs¯ S‹}qû¥é’šMkéf¥ÉýÌDåEÛ‰¶›¦ÞÒøŠW,”½gS‡D|E:² ¥@’¿ž_KeêévRôÎÆÒ$ÑÀJA/„°~ì­BÓMUÀT\BW”@öâ"(p䇧†jSŸw8ÂŽæhŽæX…UXåôÉé“Ó'ïýÞû½÷Û–±-c[F –‚¥àÄÞ‰½{ÇvŽ;.3%S©Î­˜s2çdÞ±/U¿TU¯Ö:i.=9ÒåH—Œ¥Ù–Ù–ž‹½šx5ñjîYÒ³¤£Ñ±¦cM«JV•¬*ň={àý‹÷/Þ¿à]xÞÅ”¾ÏÃ<Ìà ¼À ºÈKù騡‚#$@º'µàJ¬Á4™mî]éƒâ“‘·ÀÒæ…Yɳ‹®™½ûrÜæÆþ7…Ù[6¯yynÍÏ" YL$U¦Ä=ÃV¯ß¢ÿ$µ—(®=ÑÎL€™Í&Í(åI¹ k‡â¦)ð"(pä#5Â#j¡ja36c3¼à/yà©ÕW«¯V_½[{·öníœëœëœ+4š ÍÒ&§MN›———’‘‘ù_QxÀÃi‚Û8·qŠ$u%u%©³ X—´_i¿2óPκœuï…ø>ñ}R£¿fÍö+áçççW`[m¶äyAn›i›i›ù®Í»6ïÚdvÉì’ÙÅôl÷c?ö£5Z£µ©žçûG!=0h¡ƒQÎb™T—»ñmö׸^¤DùŒà².3¤9úÖÆ$m®~ŽnÁ<³Ýíî;ó²º6•À=ã9i"mZb‰¾+É_šDµòrµûõ£zãÅfb0{…•Öê>Ša¦¶­w ù®ýãÏ阎éèƒ>è#¢°'ì {âZ̵˜k±’SKN-9Õ·Šoß*ŠMŠMŠM ‹%,ŠØ±1bclhlhl¨¡¡¡ r‘‹\Ä#ññä Qa3˜!yÈ3U̧! i܇ûpÜÄMÜä#ø>â½ð^x/÷ÒXi¬4V…†RhH±‘ÅFi¾Ï|Ÿù>”A”AB‚5Xƒ5ÿæ•BÈÈŽp„Ì Q|/‰é¼‰O’›Ø„للù4öiìÓ¸@ë­ ´FTA•´[i·Òn½kú®é»¦É·“o'ß–ZÂlÁìÃ>샬`eZ Õ¶°5¥òÿ39¡—“ûb(†bò‰Ì™-2[<«ó¬Î³:ž×<¯y^óêëÕ׫¯ke×Ê®•­ó¬ó¬ób>Å|Šù”è’è’èbê}—ݰ€Zh©žòÃKC2’Y¦Âfý>C cëÖÊóÀø>­cŠ„s÷ŒŽ_[+¬Zš_Ëöu|¾ñµu|ᔂ$\dŸ¥KR  (äg À$TCHæ…ÜYZ®kh`jàû`±Îr©r­8ZÆÇº£<Áñ‰RòÈŸ¶ú¾è€è€˜ònu²:YìýÈû‘÷#×h×h×hu¼:^Ÿ=6{löØ„Þ ½zÇÏŸ?_RKjI øÀ+°+ÐÝÑýŸ$Çù{»ƒŒ`¹ÙÈF¶©,G–ÿ^‘ˆD$Z Z`+¶b«TB*!•ˆCâ>2}dúH¿5~küÖ8Œví0ºÈ¢"‹Š,²ãvÜŽÇ”)S6O‘§ÈS`F`’‘ŒdìÁì:èèã@ù±*l1[ -³}ZUxR·{-FVõuj^rU‰‹Yo´‚!)Å.U‘¾cu§#åw¯6Þ•Ìy–+X²(,Ál¥’Ÿé„I†çåíÈ€AË›Oàú£º¯ä|Ί^«Ï¡Ëû:c% 0cœ ‡laEq#ÞGöJDvb'vÊkšÊ; ÁB°poêÞÔ½i¹­å¶–ÛZû`탵VŸW}^õyEöÙ[d¯Ån‹Ý»¿9ÎìÀ”EY”5íù“32sfÎÌåí‚õ Ö/Xÿ‚î‚î‚îvÈíÛ!nÜ:¹u2µlıFßÜ9ÿ1ë¡êa–a™¼C¬"V«ø)ý”~ʪ¨Šª¨#Ôêå+•¯T¾’ó5çkÎ×¾9Ú]ÜÅ]8ÃÎÿós&„ïŽLñZU@å*ï˜*ny»åæ§Oœs~ÅVׂóȃœs¾øþy\‰—ÛˆgW7MG!Ò7ù¹NšçHB*‚à×ÌšúšÆP 8>”Ÿ3›§²Vº! élŽá<æ°шGþù{¾ÝáwÄ 1è„Nè$÷@Ûž·=o{>¤tHéÒE6ÙPdƒe¶e¶evêÂÔ…© Ÿ> |ø²í˶/ÛfwÈîÝ_ð_L½õ]Ñ]ME)2¹ðæµC;´“7­OXŸ°>!n7‰› ‡ ‡ ‡¹ÈE.šZÊUïùå?æyœÇy Á ÁR,ÅRã5ã5ãµ}Œ>Fÿ´øÓâO‹§lNÙœ²Ùò‘å#ËGE}TôQ‘±EÆ«j¨j¨jhú™±K°Ä´t”||ª€'„|ÿ$Hà¸Ç×ñùh 7Xf®M’.fµ1Î2¤ªîÞd¯QÌãýYš:ÒÚ¼Þ¬)Sb7r›°€Jå©# ùYÐ@‘ø€ÄÌkúåÆ…Ê¢8ôÒu.™¯R Qt7Û î©l†Jx†x6P™Gþ°Oèßûå$õ2.ã2€øÁ~æÌ/˜_(²¯È¾"ûÂÆ† ëXϱžc½œàœàœà¨SQ§¢N=Â#K}‘‘‘3/f^Ìâ#>¢š¡Ùÿ±gZ ^H/¤ü¿ÇïÉ“E~S¸òŸ?¹<ƒ»¼®êB,ÄBãã〷ƒÞz;èi‰§%ž–H÷N÷N÷¶ŽµŽµŽ-6½ØôbÓ;vì ¸¨¸¨¸húy#/)%ÏX/ŸÒwBÈw†%á&éãÍv³Óã¿Áu¡µ¯¾‘t@_Li÷éžäÎ;˜{3/7''' p‡-žánÒ |ò³ž6wðåí-9m×xÅù̺=*ócÓ}º•Žë5ê`»ä‚ל¸CE¹Ðеe(nä·þ æKpP@¨X‹µXkÚ_eQÖþ¶ýmûÛ%”xPâA­[µnÕºU«f­šµj–ØYbg‰õê;ÔÿæÈŸð ŸL“*š>Äÿm ËŽ²£ì¨¼]ݾº}uûk¸†k¸ÒçJŸ+}\»4viljY‘Udÿ× ÿh‘É¥î·q·Máy x xP°HÁ"‹ToT½QõFµ+Õ®T»RéK¥/•¾äðÖá­ÃÛo޶+±Np‚Ó?‰6!„üI„A,ž•· †zL³¿úñÁÑÎ÷Kµo¥úðqÈq6xL±=–î¯'•\U@hÅ1_x£ QôÈÏI‘ÿ?Ò?iÇé%ø"|½t‚gš-T®Qܰz¡>ª”O’›˜Ú(Ø‹S>òÈ_¹€˜ªÌía{\Â%\²ð¶ð¶ðö)çSΧœóQç£ÎGÅGâ#ñQVtVtVt¼.^¯Kä‰<‘K§¥ÓÒiTFeTF}ÔG}Ó Uy¾ù±þUåú÷C.¡‘ŸíU\ÅUÓõƒ8ˆƒ†R†R†RшF4¾nüºñëFÿTÿTÿT[[[ÿà.Á]‚»¼ÿåý/ï‰]»2v¥a a a <‡=â!š&¸Ì¿š,!„ü‘TPBd›X_øÂ›û"&ð³gmŒkI§µêR8‡ëÆž'D6ˆ_øjÿ›í÷IŒAna04xIBòsú¦ß1}b^eýp‘|áÅkf*nˆÌ›+Å&r6e~»ƒÿòÓ'@0­ *O¼(µ‡=ìmmm½_z¿ô~á^ƽŒ{ãEãEãÅ÷!ïCÞ‡<ê÷¨ß£~ Rg©³ÔÙ´P‘\í=1Ñ”²Ë~«K«ùûì›  šÀv°3 –ÍÿˆÿüÏVDÛ-ÑÒô³daQJÅ”Š)Ï{<ïñ¼ø=ñ{â÷ȃt}Oùžò=Ú?´hÛŶ‹m›V•Sö9˜ƒ9ßü< „?’Ü`/Õ•¶qwÄáÒJÕ*áf(‹ù€r¢Ò*²lܳ¯†C’Ÿ¬ì¤($Ì‚0 Œ ÿÈÏë›~ªMn¼ö%€‚p•ªp_ôМQœvXtWº(6˜ `¥QGþ×X¾2y6•A„A¦¥ŽÎã<Î;µtjéÔ2¬~Xý°ú/¼Pð‚f¸f¸føg»ÏvŸíž>{úìé³W ^-xµ@;Z;Z;oðoL}ÒýÐýL)éï׳žoÈ©ÔBj!µà;ùN¾“]`ØyQ§¿a¿Í˜üuð×q×1ó1_^J]]ýõØ×c_}Þîy»çí2eÊ8dgcgcgr6älÈY;;;q–8Kœ…q‡qXõXæhŽæ¿ñ³%„ÿ™œaÅ£–ã,ö`EV\åÑ ý$i¥±\V]૘âiŽè‚&(/õ’nò¶¦¿ü»¿jJÈïæ›R™Ô{9òưÂ'Þ‰WãUy¢™PÆ,GÙMTa°^(o)xä?”¿FTLÇtLÇ—ð%|‰ÜÄBi¡´PúÔó©çSϹ¼syçòâ`q°88«UV«¬VqÇâŽÅK\•¸*qÏãy<°pgqÖ´"©<ñâS ÓmÐmÑm­«YW³®&>ˆrîçÜϹ/í”vJ;M-å…™~+ùûà?ã3>›Vfm…Vh%ø2ê˨/£ÒcÓcÓcbbb]Â]Â]Âý²ü²ü²l&ÛL¶™“““œæ˜æ˜æh:šOyH+­ÆJù½µAMÁeÎv€YR÷âÏ(l„|38µ±_ÐgßHÎgêzœÍ­9éfçPž:·AøóŽãB—˜ÖeTL:±{7òï>XùzÖ=á OSáJmÔFmy·ÊMå¦róíìÛÙ·så©•§VžZ;¶vlíØª}ªö©Ú'`IÀ’€%Ê(e”2ê›#ßÀ Üø—õ‡ª U…ªòv»Éí&·›|[s[s[s2õdêÉTÇÇÇÓSóa>Ìçг¼C`û¦×Üy¤óHç‘å:”ëP®CºuêÖ©[uBÕ U'øúú O…§ÂSSSùºGþ%¨¨†òÛ!@ÀV0þð„Scmå‘…Î\Þ6$’ó[É#&<¼±±R§‘rsvˆÕ !²ozÜSJg?Ì}†¬3<%-ÿÈgÃ\"˜YD(¢År¦Sh *¡€<òOåò81_ñ_131Snâ²Ûe·Ën¯#^G¼ŽØô±écÓǨ5jÚÏ.Ÿ]>»Ä5ˆk× ½izÓô¦†afJ(åúìJ¨„Jßô ÿñ}Ã:è`ú)ËÓxOã·ùm~›d#ÙH¬À ¬0µü½ßü¯q‰K\2ýLºû¸ÿyáç…Ÿf8g8g8ûŽóç;ÎÅÏÅÏÅ/àUÀ«€W¶ãlÇÙŽ{;öíØ·c3»gvÏìn:Ú\ÀÓ„’ù_ õÄBþFHØ`fØÌߣS©ˆBñÎ\©«h„A¼¯z7ýUåä €–([¡–Ó}S $!?1Eþ¤"9=++Ç¥PùR|Æ}¨P –;Õ³•…áà1ïŠUØC°†>#ã7„G~tòr?*¨ B2­ØŠ­¨‡z¨'7±c9ÆrŒïA߃¾ øð-à+ŠÓ¯§_O¿———Ç{ð¼ÖaÖa6a“ièjþ$øÏMó?“¢(Š¢¦’ù'J¾´þ%ÇD~nòÏ$ù¹€ ¸[+·Vn­ÈÓ‘§#O§¾L}™úR.žqšà4Ái‚Õ«=V{âÒãÒãÒß?~ÿøýc^WãÕXiVš•ÆK¼ÄK¸Á n¼ /È â$Nâ¤iâN ´ !ä?TåÈa 6`7arÉIo8LÄ6ÅA¶+Œ•øûcu®ŒZÐÀ-Q ”™‰È…^þÝYc)ÕXÈɈQ,‹ù‚K9ü¾]ªyOÍsXâ!Hí¸Èƒ /¸â4žã ‘ ±ˆýfO=ÔC=åRåRåR/£—ÑËèÁ<˜SmUmUmÕî×î×µˆµ's4¬5¬5¬5ÍÚ.Ït(lÈ©°[°[X:KgéòŽÜC¹‡ri;i;i;I¹R®”«{§{§{§sÒ9霴SµSµS¥ŽRG©£éIHB „ÿÈ6LA C7cEÞNqU&¶«âÖÛ»ס™!x~ñWÊBƒ¬„Ö|¬ùXëÖ%¬KÀþðG]ÔE]„"¡¦ éqÂAyæÙLÁ¹"Ÿûsî#8‚#¦[¿·º|ù]k€hØÀ†_â—ø%«,«,«¬°›a7ÃnzõóêçÕO¥T)UJƒÆAã ¹¦¹¦¹f6ÅlŠÙ1P MÇÌwåBþglºè†Õxc{Ð2^]¢\^‘S.}QBJ—¶~9ûeD6^nŽ;––‚çˆG¦Toå5iRZBò¸œ¸‹`¨cÜÌGdÚjç" gíY,D>†ëm®ir”mUwÅ A''!¬8œ`Cáû©™Ãæò¦RTŠJQe®2W™«z©z©z‰-Äb ‡¥K––èT¢S‰N…S §NÕ|Ñ|Ñ|AT@$#É8Žã88üí§àõ5-¥•çÒ)ƒ2(G8Âñ»xnù#)?+yøì)œÂ)¸Â®…< y 9r,ä˜Ã ‡72ögìÏØ#[³8fqŒwŒwŒwôùèóÑçsVæ¬ÌYi:æ,ÌÂ,:!ÿ‘ö¨ OX@ Ñ©·íeóYOœ,ÍÆ#I¬%ž|Y5¾YŠñyÕ˜I/ØiV§¥D© ×Ò´„ä§@$’#¦k+…J‰éõµÅu ¡ ÌI:¦¿#eXSÍUWÙ-/q~°ƒ%¢(€?±ØùëlþO‡?þt¸øIü$~âá<œ‡3+fŬ_9¾r|å~ÇýŽû¯™^3½fÚ-³[f·,~UüªøU A A A¨Žê¨Ž;¸ƒ;‚!‚»¸‹»ßÌÿ½É—³¦¬)kjêeߎíØþÍ;ÖŸœüs®Ë+ËÎÃ<ÌC!B!åTåTåÔ‚u Ö-X×u™ë2×eÂ4aš0íóñÏÇ?=ýõô×Óó–æ-Í[j:š<Û¬Ú¡i{:¦c: „C D¨ ‚£*#¤ú¨’}ß §j¡€Š˜õ¦a¢̊ÆSÆþÆhEÌ‚ ‘ÆIœªÛ ù†‘ø„”ƒn(mlb\q9/V7åØdÖDšÇßsgËVJkÑBÑ[x-Ô€/l`Fáû©}À˜ª·3Ûf¶ÍlkÚ/'߀´‚iÓ ¦ø¥ø¥øy›y›y›9v<ìx¸ðŒÂ3 Ïpttttt|·åÝ–w[2Êe”Ë0-ò%OYˆÍØŒÍx…WxõÝ-ý£…ZySz =`&`›È&²‰(Ò(p„#<ÿH€?”ü³G.ã‘N4DC4´Ï¶Ï¶Ï.\0¸`°µƒµƒµƒ\Åþþæû›ïoÆŽ={XZ*-•–²…l![ˆOø„O¦ë D Å_ñW؈Ø%”Pš&$„EŒEœp+ñ¨v™R‰žñ’Ug7ÐTÛÀØøÆçºOj´E—B¥ch‰hx@4Ý—Pà)>!…P6¼1ßÀ[§7ʵ+AbÅŒ«xne9N¹[¼®˜É>3oÌoà +JÜrù“éc8†c@Ló¨È=åÇp ÇRg¦ÎL™¶1mcÚF÷ëî×ݯ{/ò^ä½Èé‰Ó§'¶glÏØžùÐøCãc—Ç.]nô5ú}á Oxb/öb/Ú¢-Ú~G¯=Á–75]5]5]…­ÂVak^á¼Ây…ÌÌÃL-åÄ÷÷–ž{¹$æîáüà?ÖŠµb­|júÔô©é¥öR{©UUTUTU2×e®Ë\%EIQÒWǯŽ_-ïY‹µXËûò¾¼ï¿y\JÙ !ÿ‰1èŠêüwÆXu••bNñŸÉ¶SQ„™ãEÆšì]±³uïlxS¯CÒ ~÷ÂRp‡‚GH~ ŸˆO²Ó²Ó²Ó I†$Cæb.æ" Hø=ŸJ¾Ùxä ûq‡qrÊn>Ñ|¢ùÄ€ 68q:ãtFZ/­—ÖLø˜ð1!zSô¦èMº²º²º²xŽçxnšç§/ú¢ïww•ƒò# € 'X{ö^šÇëñ7Åæù—q>à ±63[ -Äß¾ž|>§ÿ'¤tÌúˆ\Ì€±)x„ü³Sêâ‘(,`)ì´ÈFVêðœW¹+!’•ñ¶|!S ;ñʾ¼ù³_ë\­  QÞä '|rÁÆp ÇpÔFmÔÆœÁ™ÜÀÜÀÜÀÈr‘å"Ë=ôüÑóGiMÓš¦5µ±±±±± š4'hNÑ5E×]cÑÇ¢EÓê¤rÊ.WÃ{ÃÞûÿÁ‹q7pÓŠ¡¼ïÇû!ˆ`;ÙN¶“U`XSÓßc mþcª¡†ÚôÃFîeoŽæhîìì69lrØdçêÎÕ«çIyRžôz×ë]¯w½8÷âÜ‹s¦”= iH3%ýñ)e'„üf$HàÂpá³DUu¥ÑÅsÜ|lÞÙ^23à›ßkûžLüEªÍWðâØ‚(Ž$¤ÿZŽHÉO¤!“åa†è‰ ™mµ·ô=LÍ*#ëð·ï`°¬nöëÊeôü'ò-•—[º‰›¸‰®èŠ®òL2I‹“'-N M M õZéµÒk¥ÇC‡Ý=Ý=Ý=m›Ú6µmú!àCÀ‡€øàøàø`^Ž—ãå°˱·p ·ð ~Á/ß”‹üÎcŒýš:;Á N¦udåyÍó÷ëjÄ¿õçK©å’yÉ*'8ÁI\$.ùÏòŸå?˽œ{9÷rb„!F$OKž–<íMÍ75ßÔÌüù!óƒé ‰ l`[ØÂö›G¡”ò[©r(ăy5ÞW13Š·ö9bçƒý*gA»°Vç&ÜÕ¼uGwTÄá£PˆÕúIQœæn'äŸäT€Ã¼wåu5ö“îã«ä&5`GØ~ÖÖHEŽÃgó½f4¾›üwä øm؆mX‡uXÇLÁúnúnúno¼}ðöÁ“ãOŽ?9ž””dhhXðBÁ /”8RâH‰#vÍìšÙ5Ã` Æ`Sʾû°%Q%MòGN(i kX›z¾ßã=Þ#9Èù]KN©'c2&›êìà'OOϰÓa§ÃN{5ñjâÕ„Y3kf×*®U\«ˆW¯"^™Rvù§Å#<Â#ìÀìøã¯WB~¬9Ó`Ÿ±´T’ϰoe3Îbmp¿‚Ówà¾1ÜX0míW}^‹7U|Ò]‘„Tˆ88X#Z?CÈ?#˜R_ð_ä]9Þ†ÏRØËI•„lú<©öMÌ/kNPÈÈ%on6²‘m*;éþè/Ï'“Ö(­QZ£§ê§ê§ê—[_n}¹5§}Nûœöö•í+ÛW   Ö¸iÜ4n¦uLïã>îã®ášéQ~·””K\â¿öëŸÁœ‘gs—KePQñogØÿý9äÿù!÷‹Á|1MÂx —pÉ3À3À3 ø—à_‚±[i·ÒneŽeŽeŽå‹/¼Ï›ò¦¼©i–/xÁË4#еZ-!äÄú1K¶B¾ªçSÃé„ùð•oUÛ«(m¸l¸÷nB`êŒOÝ¿¶Ë.0ò^”O¢¸òoˆÏg¶IÞn˜äãóÎxÆþµñ“_w~ÇùÌÇ=6O˜P«EiSrÏÎ »)nä7“?I]ˆ…X˜ÿF³gfÏÌž5 jÔ´Ú­j·ªÝª}°öÁÚË/+¿¬ü2×E®‹\±¾¬/ûu”wx‡wòMSêü›öÁ‹!bˆ"oOÑLÑLÑ<Ë}–û,wžç<ÏyžŠEŒ"ÆÔtva× yrIùÚ@µBµBµ¢è颧‹ž®9®æ¸šãj©k©k©ƒcƒcƒcÍëš×5¯kºï4LôüsàЄ„ßüÛ ½Žéè…ŠêÏfõ4O‹±‘1ƒ#5ºZiçé³ò¾ìx}8ó^J™ª†UUB Â^±¦XBHÈ¿>½dýù<”73êhsõéÙ{õÑÆFâ ¡4{ à1¢mÇk¨«RÈÈï"ÿ`Ö‘‰‘h„Fh$/Æ”[<·xnñÈ£‘G#>w~îüÜ9-/-/-Ï¢‘E#‹FAfAfAfÅ“‹'O¶fÖÌšÁ¾ðE bƒË¸ŒËòÂCûÔÿ·=ñö°‡½é`W„+Âa…°BX¡ýªýªý* ‘†H¦™ìM«Ãþ'ò§Ôò3<‡s8gº’ÐíÐÎ~‘ý"ûEa×®…]ssssss3\2\2\Š^½$zɳ³ÏÎ>;›s6çlÎYÓ0Ó­ØŠ­xЧxJCN !¿;ÁtƒCKØ¢9ÊÀÅPÊX„«íê{Tñ*ÛQyÞ¦¶¶ f¥cEcËÒöwUÕÍÕÓ1‹°ˆ­ÀÜ0Mþ‹@ÉÇ´4 _‰»ˆ–{å²ûè6ç5Ä{Y†«’ÅM&Am[H³XiO!#¿£üƒYOâ$Nâ.ມºÉEÉþÉþÉþéËÓ—§/÷°ô°ô°ôŒ÷Œ÷Œwѹè\t6Î6Î6Î #F$Œˆs‹s‹s3V5V5VÅP ÅPÓì4[°[þ«Á¬ùï%— ¤#é¦yoäg~Çqü?ú‘?¥–k呈Dùç'ä y~3ýfúÍôØá±Ãc‡’)™’¥mHÛ¶áM‡7ÞtHíŸÚ?µ¿éhã1ãMÿòó¤”òÇSö¯h+t`ÃÅ¥RÜuˆW«ç¥VZZᢔž›)Å E0ŰH»XwTÚ+¼WR•R½EQLÆFîÇËñ²¨‹º¨‹³8‹³ô FH~¿¦sqOäͬºDýؼцÆ#ìª`ÁnxŽXk3õvÅ ùƒÈ_Óò¥rÏñÁy~°~°~ð;çwÎ<{òìɳ¤âIœЫޫޫŽû]ô»èw1,3,3,Óq‹ãÇ-XŠ¥XjJÙåU?+£2*ÿÏÓ®p5Õ ŸÀ œ@ Rò¿è×—_©üÓB®×·‡=ì-oXÞ°¼ÂCx÷¹àsÁç‚°YØ,l~¿÷ýÞ÷{#¼#¼#¼S‡¤I‚¯øŠ¯((Ù˜Ùÿäø„òûQA Q^MYØ(蘟q­TŠ»VYrÏsÍä[½îV(lh.>Q¼ÙK‹³êš¡¢òžÊ³hëb¬˜Êq‡Ÿ…‘eJÙ÷`ö|ó(TìG~z¿ö¸ÏÅeþ‡ Â3»Ÿî¸Þ.w˜¾‹¡ÌØfusÏ`}ZµK9¨Da#9锿¬3 SŸtOôDOøÃþéãÓǧð4ài€Ë—).S|Þú¼õyk§±ÓØi¬×X¯±^ó±âÇŠ+ÆÎ;7¯r^å¼_Sv¹E®#—ý'½;ùo}€x ÷¸3sfÎÌQ •PÉÔÛýŸ¤ïòêª.p‹¼Ãµ›k7×nþJ¥¿Òl‰Ù³%9µrjåÔzûèí£·>õúÔëS/Ó}â(ŽšfµÏD&2iÈ)!䥀:èadeðK¥Ò’=dÿÜÆÆìåÚŽ#üjM²éoÖTjªÜò¢ÑÅÐÜ}f›,SïfÒÍë× ×vçK=zºØà:Áu’F~ÁD•ŒÊ‰Ê1´7´7´7}³É]$YÈBõÁ“Ÿû„“Íåqy( žõFÛYÿ8¯‡†JøÈ|ÙG€㯭««BÅ·°€ó`€‘.Á“?Ì?~Æä¾s9=]€X ’FI£>â#>"E›¢MÑú ñâ7Ä9Æ9Æ9ÆËàeð2Øs{nÏãîÅÝ‹»—˜œ˜œ˜,•–JK¥ñ/ñÐLÕáÿ3%”PÊ›,‚E°ù^Æcˆ1{±{á g835dþ󥊡˜6>6>6vkíÖÚ­-\ªp©Â¥ Ô*P«@­˜O1Ÿb>e¸d¸d˜z»M‹:…#áxxñOþ<È“*ʧPKEKEKE”"J•|9ùròe©°TX*Ì\™+så÷ù}~ßt/ùrZßmÑVž8ÒfŠÍ›)Xp Ýz»õvëõõõßµ}×ö]Û¸kq×â®I¥‹ÒEÓõyù*yé¥?pÙ)Bù†Ü×^ Að ñL4ÆI‰üÒÀÝ­P2®cÍbárR…ì«Zí<©£pÿ¾Ã‡1ÆÖ…·…V)sÎëêýÄÉŠjŠÏ_*$wHî k÷¤Þ“z…Ux”£«cÇfÞfÞfÞ¯3_g¾ÎL¶J¶J¶‚ì`g꼘€ ˜@é;ùY¹ÃVbË`áò޳§»Ü«Óó9ë{máé3ìºW¾0Ô¹e%¤a;áz¡ÊÂî<ò'Ë_õ(¯`Ú-Ñk°käÝ /…—ÂË·§oOßž•ÛVn[¹m›:6ulª´ªÒªJ«€ºuê*Ê(Ê(ʘŽÓ=ÐÃ0 ÃL{òÍo ö{‰¦b•Ùïg¿Ÿý>ªATƒ¨ý½ú{õ÷’‹yXÖ‡õ1Í#÷ÐËõúòS>ÅN±S>Ö>Ö>ÖU4U4U4µ µ µ e^–yYæ¥Ã`‡Áƒ¿y1MϪ< !.ñïWù„úì*³‘·Ã®^q—åöõ [ºaWFéÂùíù#1éf÷Z•öÌ+·`Çâ]ý{TªÆýkô”°˜ÀÓwšÊCå¡òîÜ%¸K­uµÖÕZWmOµ=Õöx÷òîåÝ뛫‹«° «LÛ (þVA@ÈÏC1JhÁ.à Îp>ìÐaHÍÜÏÙØë*?:ݻ۰ؔ+ÛTµžc¶QÓÔt‡ÌÆ`ŠùŽäOjå4W^+4«fVͬšO-žZ<µÆ¥—j\ªU+ªVTç2Îeœ ذ/ðíìI ° P`š]ø›ÄýÁì³D…F…F…ößÙgÿ¦'ÒŒ5cÍLýërÏÀü¢ùEó‹¡½C{‡ö®Õ³VÏZ=k.«¹¬æ² CA‡‚©æªæªæšW˜UUPÅ´‡V9%„ü¹äu1d§±}Y)|ÁÕ}¥QñþÁ‚ oº8r~£Ð°mœßZ9bñíÌÄfmÕíÕfª);œwì¨÷ ïÁÙ}Jù”ò)å#†ÕcõX=Ä#ñ¦=,úùùÕ(R£H"5u5u5uEûíS´ªªê×é}啳ÍasÓêÚ ñSð×ÿg`|n"IøŒÏ™›õÆ"¯¥\Á{ò1jg±·pÎÖѬ z€Üž-E Ô¤ ’ïHþ ¦r‰œàdꃅQ•y$óHæ‘g‡žzv(²{d÷ÈîÙc³Çfµ)lSئp±ýÅöÛT7¨nP]ó2æeÌ˘Jqä¹@%ÿ´•š|ÿÞà ÞÈ»gœqSIÌ,ÌÂ,ç·Îo߆õ ëÖ¯@vìÙy5ójæÕ|µøÕâW‹#¯F^¼ª««‹+¸‚+ŽánZ –†œB¾$pŒ@GTû gÙcþ0jú‹ž«+ªKŽ,Ö²Àv@šÍÊ&>ÊZ5À¸øØ…Û† CGã ‡KAöm¥©Ò]©HÊ•”+)WLÇ4ƒÌL%ˆ»° »xâQ1‘1‘1‘/о(ú¢¨ÖLk¦5s?æ~ÌýXððàáÁÃ-ßZ¾µ|kš‰ë=Þã½ib€ü«‚ò—#üíTäà8Ç?"MÞ‘yO̸@G¾‰Ûòž§<¢(/®µ 7;©–Lí—²æ¨NA$ß©üI¼<•¤Üw.¯':0àSܧ¸OqS¦n½TQª(Uôôô :/tž§ÊSå©f 3…™B‚Øcö˜=6ý™‘/ÑÊxäé »£;ºKG¥£ÒQñ”xJ<8&pLà˜ /A_‚¾˜ûšûšû¦(R)Šÿÿÿ„¸„¸„8SoS4@TC5T3Í6ó¯…BþxrE»%,`&žœX}c¬tœßmº°òêÀëcœ:F•jc˜’7^oÔ¹\1§ß¼%.ÿlþµOV¼½»ý#»žÊ"ª›ê%9or"r®dÍþšýÕtä$ ÁÔ=ÑÑ@€¼&ÆçŸ|>ð´ðÓÂO § ©Bª`÷Ñî£ÝÇ÷÷wyú8ÀHE*RÑ ÍÐÌÔ½B½ïä/çÛËî‡Dy3c´îƒáry Œæa˜Î×*+‹qBëJšÇ*g¹ ›z¬<‘üò‰OÁLA)”B)<Á<Ñ]Õ]Õ]*U(ªÐ³»Ïî>»›²'eOÊ‹¾}-ú*U¨T¡RÁyÁyÁy¶*[s[sC„!Â5,“e2oáªp•/D7t;*|>0²3ìŒuë6ÖmB³BsBs¼*xUðª€9˜ƒ9qRœ'=õêÿÔ?«lVÙ¬²ˆF4¢MºNáN™úŠ(Y'„|ÔPB!Ïö³Zxh|--áã|Ǹ²K]¶ep‹j ®®˜fq_3viïý^O²ŽW¿Q#ª'ÛÏ"ª°Õdëe…—‚§õL Oëcègègèg:¾|%SþÆ“ å«—áG8˜À„Œ/2^<™üdò“ÉIK’–$-1{cöÆìMÐÆ A}û<öyÌZ°¬…©›FNâó‹ROþ¾ÌqÑø(ofÙiÏê—ÁÈOñxóŽØ¥ru­{«?©VâÎlj£€%xA¡$?€ü³ÂßÀ Ü0-ZTuP½Ð ½¾VýZõkÕ E†"CáâçâçâçõÑë£×G§"NEœŠX²îbÝåËÅ/þ_ü_6|9êå(ýð\Û\[eC6˜ þ0êÝÔwSÕfÂTaj‰ˆ’ÅJS•UžRžÊ*U9«ò›eo–½Y–˜˜ˆó8óƒ1ƒ‚(ˆ‚ß<Ïü¥8„òg‘]-ô0àv¢:swôfj¦dc×­9½ÖrïLU1€gðZ·µO˜9½ÙÖæ7m…’‚'ë*5‘NòPËú–̲¹xD<&žÊ~šý,û™á«á«ÁÔãÎãx3õšç/LD"9çœs,Æb,ÖõÑõÑõyîúÜõ¹«_¿>~}<;yvòìp*àTÀ)‹¶m-ÚFeGeGeëíôvz;ä"¹ò’v¦mB~pßô¸óÙ¸ök þeuÎígôà˸‚ÏÇU¼R~§ ¬‚Õ¯”KMwª¢ ’Ì?ÖÁŸÃ9œ3ÕJ~À|0 ƒáý÷>Ü{ó(æQL¼w¼w¼·òˆÒMéæþÖÕÅÕ¥Zɺ ê6(˜TÊ·”oN+³úfõ+ôiìר¯]Ûþ†þeqq°8øÓ”O>ˆ¸q3â¦)e—+æåÚ÷y˜‡yT‹IùN‰!`ÂQWLª±pêø4ÍØ£r¥µ3+8ø,5dä Ñ{'HÙš‡ÞýæO:¿>;,÷¾î ›ƒûÌ[>Œ ³1Úä*;+»(»dŽÈ‘9B_S_S_Óôí'_uüGòwµ\Ž(ù™„I˜dL4&£oFߌ¾ùÒá¥ÃK­R«Ô*ÝÖ¸­q[º"tEè «±Vc­ÆšŠ{£7z£=Ú£½éÈÔûNþ„²¬Ú¯ Mëþ¡¿27Ö™–Öí½>pÊ„.Í9Ÿ9»§O¯Úe—­g:£3…bìÅüEäÿ*oÖh-“ÊßÄÕÖ-Ì-¬ÈÜ€£Gg §oœÆ9ç·=ŌŢÛsÎùumæÌ;îÃ]û»öv÷„{¦;À0Õnþã#BÈ÷èäMaÓ³’òvýsåÊ}9o˜½®×¥3ƒ‹s~«ÉÈÊžÔ^Ì4Y…)³æ‚F°lå=ÍŠ7+Þ¬øÃ¬‡Y³f ³…Ù‚-D ¿&ëù¦îý—þñûy$Fb¤¼Ãf³Íf›Íe•TfPÂu ×)\éA¥•8sç<î›ã,Æb,þ'Ç$äGÄ^1 DÊÛµŠõ ÖÛN=Û5U·nJÝ.¥yÚìͽV ÝS¹nH-¹¢·ÐQ‘ ù+Ê?ñ¢ÜO3ƒ0ö¬+ LŠ E»O½~ôúh£±¾±þíky ó>Yhèlè|Pó2ûe¶é¾˜‚ýÚWôG&„ïM¾ Ùh懓ò¶‡S{ë#qm„öÞÈùµiCçs~·ïÈäõÊQ×ë>’ÛˆÕ…!¬ ¾âÆÃ…aÂPy— ]*t©ð´ÊÓ*O«Œ-8¶àØ_‹åøù¿!ÿgùSí(€HF2’åªUˆ*¤¸¢¸¢¸¢VíZµkÕ®¾¬ú²êËÂÂÂØ=výÚ²°ÁÔ—OßÉä;Aó[Ão BÞüÚ,ǘ÷Õ8…/篱 _X Y1K£’‰ Líû£<è÷*ù Ê¿2«<ŸúYœÅYe®RP Òdé…ô"»}N‹œjá”pŠÏc7ÙMÕ\q»¸]5Ȭ¯Y_´Aô`ÌŸù›úxh•SBÈ÷Ož7.—0M8Ʋ»ŠeŠÁ ¶bÓP󚟽~q;`•°ìÀ½ÓO¶|.=*}íºk‰¬7³Æ&)NÇ›Âu0Ð]äCÚºÛºÛºË+Ñ}½ñõÆ×¦…ꦲ©l*"ñkîñoä/tü‚/øG8ÂÏð ÏtOtOtOž+ž+ž+bô1ú=Ê£<Êû$ù$ù$oQ¼Eñššš¦µ±áŽÁ V°2“úàÉwïÿKÜqåÍÔ™9fy)Ò!i3æ{ ‡=D¶€%ZŒT8 MŸð~(ÊÜhÞ ò—•?ÉŽB¢¤GÒ é£úéÊä9å9åÚä^ν, 3.6.ÎxžÙ&³Mꇤ¥IK¡Bò0ä#ivBÈÀ j(Qað» 7Y®ñ•´‚Oôªå•°Ô¦Æêþ7ŒmuM ˳ûå67‡÷œoy®fºyæÎ܆˜‰¾¨Ícà‚žr=›Çæ±yð„'<í[Ø·°o¡z§z§z—Þ$½Iz衇^-ŒFã9žãùõÌ‹£8ŠcÆa¯Ê«òª1Wb®Ä\‰*U&ªŒN¯ÓëôÎ÷ï;ßÉÉɶ‰µ‰µ‰5M¿+÷ÙûÃþßL`@È`!À4½£µJ½^ù9#sbNÅ´G§4é2–ó5ú´_®j0«l;˜ÃÊ)ÂCÁÁt¡‰Ÿ¢8X,FÔC½¹~sËÎ-#½ó~çÝTÓ´`Ó‚…åX.~?ˆè!ä ‚â×!òBIv„iäíJ·CúzÏ™u!oH¼áñå僷ŸßÒŒøÒw_³ó%L½ébsa6›„( X *”EY”ê u…ºr›…O>Yø$Ú1Ú1Ú±A»í´3Ý÷²xY¼ü<ÿüå.eQeM«vìfÙͲ›U6¬lXÙ°ÚfµÍj›UZyhå¡.Ÿ\>¹üºVFtALÄDL¤ùž}›p¿BLÓ3åå ó²Îé«k ¯X4[H¤¥V35ÅÔW‘ƒldK‡ù2麢B)”ä§ OÔ(_ñ½…38çóV¼óãoø^‹\Ä Æ`¨ ‚Šæb'„|×äÎ 0²ÒÈÁV)œ_ä>ö“lz™Y«ѯf®Ùxµ=ÅP›jõ®B§Æ¿nºáÑñ}OnŠ …l•q†Tkñ¯ðYÈ…s1s¥x)^ŠˈeÄ2–-ZÌ Ì Ì Ìh˜Ñ0£¡éÑå’•ÿ^þâÆ»¸‹»XõXØ©R'¤Nˆ˜13bfÒ­¤[I·Ô‘êHud‘E9àÓ˧—O/lÇvlÇLÌÄLÄ!q¦£Q<ùÎ|ûqÌ7s4£HÈl¤d<+œÁC,¤V|¯ÕsÍx•#¶ànIÙ<ÅÑ¥Q”BI~ ò9 0À ¶°E3 Æ`$1gæŒñ؆mpƒ|Lm!äû$_ ”;Œ¸ÉÂ$á9ËFOôÄÆ+úέZ¦hX`}‡¥ØÄŸàÄë¢1]¾º=¿îÃ5 ã\ãã[I' ç(†Ö˜ÿÍÖÉl2›Œ—x‰—],ºXt±xfñÌâYNíœÚ9µsnæÜ̹)·ä«ùj¾ú7{EùËå)&;£3:Ë#”´ µ µ ŸÞzÿéýØò±åc˳¬kp1àbÀÅâK‹/-¾TÝDÝDÝÞð†·iV1yBÉ_#FWPÉŸîÛ˜ò`øõCÏKðX’ÝA_Ú8ž]d—Øx€â­Ê©Ç©,•W••õoõZ}&ë‚N(JŠä§¿2iHC&¾â+0À€d|ÄG|D,bé+žò]3‡”ÐÁo„îìµ±‰ôŠOïs¸YÕóz¤65mkTæXjÛ*‹í”úk¹Ì>6ø2'#GˆJ²–’Ÿ$òn0‡Jä zÓ‘Gc4Fã6nã¶EU‹ªUÍCÍCÍC³c³c³c³¬³¬³¬M-§c:¦ÿޝQî/¯‹º¨‹ã8Žã¼1oÌË ³fÉ.’]$à`ÀÁ€ƒ.}\ú¸ô1¿m~ÛüöËÀ—/3Úg´Ïh•X‰•¸ˆ‹¸ˆÃ8ŒÃ¦¹çi™<ò'ù¶Ç=†_?ˆÆ—ÜŠ·Ê(¡›eg‘ì#öÒXþØòµz·²¢™ZñU| ­òÿ­ûH!„ï“ ˆÈF.ôl/k€'R!éß[jW‘ån¯ í{¾âƒNë¦+(êÍGhϵغåÞKã6}'Þ>±Ò&)”gB„öMÊ`3ÙL6S¾êhUÖª¬UYËÕ–«-Wg½ÏzŸõ>óFæÌrJÍGð|ÄïøJå>x¹¥1£1Ê¡Êɉxb»Äv‰íž>|úðéÃôééÓÓ§[ϱžc='8<8<8ܹ•s+çVˆhJÙ; :˜Rvêš!’ÿ?q×ÿzqŸ¯æFÞ$ãŠ6M_EYûàK¥O–çT>Ê š ÊŠ‘ÐAG+V ~JB!ä»&§šz`ÜØV¦à•yÔ´ ´\® Ûì0&º¶»U/ËÁŠ •Æ]™t¢çÕø·;§Ù:çæ{ÂMÔ3¾’Vó…˜…M8gš8òÀ˜ÒqóÏæŸÍ?›[š[š[æ 9È®•]+»–)¥^‚%Xò»¿jùJ©Üû~wpG^»š L`Bzxzxzx„g„g„g¢w¢w¢·¦¶¦¶¦vMM¿¿¿à/ø þØÿÇÞy‡E‘l}øWÝ3ä,Y@rFAÌ"‚bÀ0'Ì PÌ9ç0çœsŽHPA$((9g˜éúþèq/~»{ïî½›Üí×çá)kjª»OWõœ>u꜓~€€IDAT8‰Gx„Gßd¼”x?o]e*!ùáÝt)<Ѻ$º:¶ö.8r’4A­ô>=¬$‡‹ª|E;ØrÙˆí +4¤À{AœY4¡ E„`.z{ÒË™}d-³{köô®^[:Ûèæn×Õ™¦¥éX>p²Öfㇱ´ ÝOOÂ!Ž g`/³Ù×ýk•¾>d%YIVòeÕ­ª[U·ªW9®r¼üEù‹òåƒË—†-laKçÒ¹t.žâ)žþî×^ß>ùȧ,e)‹ã8ŽãµŽµŽµŽ âq‚¸Æ¤Æ¤ÆÄ˜Scjfifif©p^á¼Âùd÷d÷d÷Úµj;ÈzSƒÔPŽr”Ët'! ÀïÌ·÷JÔA‚u0…rx[º¼fn­ RŽ{Ü*zê(½—›Î>V(Õ0eßò…-i(ˆR@@@@@à/ ð±e¨bæ•:rÊÔzhaç«^ÃKºÙÚºÔnªlY3ˆ(±œèjÀ“­™?|ÚTÜ“µa–’=´ ½ˆ&ós*»ŒýØý|Q­™Z3µfªcTǨŽ)‹/‹/‹ç^s¯¹×L„`<ÆcüŸ,™¡Š¡…QÅ1Ã1É)É)É) kÖ&¬­‘«‘«‘3,2,2,j¼ ñ‚Æ T U U eö{~k[´E[!¼ÀÃÿWÜkPGB0^¨C-ꊬªFÖnÄ@¶±hƒ4ˆ™\% ¹wr:ŠÇä›É†9ìa0€–2I@@@@@à/ó¯€ÌRRFZr©täíl}Ñ^²nÖ„Ëm䥳jÞÖEË)©ÉïØ¦v6îõ“ë#Ãî%wbæ‘\â mÈ…ÓS N¦°ÿ|"9À½Ñ½ù Õ Õ Õ >P#GçÑy ·¾ª}7qáG8ïBSª[ª[ª»=v{ìö¬#YG²Ž(x)x)xÙKí¥öRó$ó$ó$ Á Á<ÌÃ<ÜÃ=Ü“õ)‚èÿ9$ üÏü”Å}1&mùŠ 1§œPv¯YfÇ‹¹+šîUšØâ²×D½ÃgŒ|ÆÙÑP— 欹*  öalH:'Œ¹OTÈjÒaXÉèüÃ1áMT@@@@@àw¢¾:\)8’‰ýèÀùS}¾xÞˆ¤–ŸÛ.húÐð¸Ä¹ÎU*)Ð)Y-+]änUõ²šuHI&ס¬ƒÄ`‘÷¶9ÌaNÓi:MGò§²Te©ÊR©“ÔIêTVVVVV&ky7pã/ä^ÿLøL¼ MrS{°ö`íÁ¸Qq£âF¥‰ÒDi"ºî£ûÌ;™w2ïä0Êa”Ã(ñ{ñ{ñ{xÃÞ¼Ò/ó€ÿ×4ß%ÈAÌ´bG± ùŠN¤s黎r”R6ˆRJ#(¥ôÝpJ)é6\·½®c±«û|ÔH„-¢ÝìJÆ’ÙÆÈ“Þøˆk˜#û˜•-å |°lÀ—Wg­ÎZ•¦–¦–¦ÖãRK=.ÉÚd±Yl– +?ö_2&™q#£ù²_Œ—³}·-´p†äËÖS+%U¡s‚îúå{Û:„ËÚ§3Τ ô¡M™Gû/g'vb§¬Ÿ &ˆ ZÙee—•]^e¾Ê|•Ù#¹GrdÙ§Œ£ñÝÈsöaT ¾BßVßVß¶mXÛ°¶aÞÁÞÁÞÁÍ·5ßÖ|›¦³¦³¦³ì[ˆ@Ú  Úüp_þ‹F@à¿âÿ[ÜkQ‡°‚_Qò®t[Yq„´Lª'V¬q®n-ž$-•T\«y_¹|ýŠñî-–FîÞñ¨ß¾x×£ G¾;6~‘mÑ»»nwJ±Ú(¿ÁísÉÊyT‘žB€d¢t>÷›ÆÕÐKh_¬a"Ò‰¤d ¤b9qã0½Ðü—A±ø÷ðf0)8Pf©!îÜH®ˆ²w5Û¡ÛfËéO:´Â&i”Ä‘5P¼-¿t—êyƒ7’ÓÚ÷ã[±Ì2››ÂiÒd#EÿÁ£ýǸ®C ±ü'ùOòŸ´.h]кPgVgVgV°¨`QÁ"¾!]C×Ð5ߌd#vÓŠÝE°,›#Ý͸°j('j(•ÛΪ)›9ÊÞj×äGÚÏQ_¡ l S­Š¡è¢f•_y ls]Rrå熥Z/'ÎÍòˆ'nÎÑŠéžÜ;¿öÍú¾9n5-k×-° F6°ì/Àîa%ä1FÑ}HåÒ-Ôš†ÐLtF!JP!s¹ù¹8²ÿx•E"NcN!šÎ`F3nDq½ãÄílõÜT*tçL¥Þ\òÛÛI¢¼óò÷ õGA›ÀQ-\‡9¢Á‚é¯TÜ­`+Ô¡uâ‹â‹â‹j Ô¨5¨ ¯ ¯ /]Qº¢t…¬åœÁ™ï@ªõcÀ¿Ç{¼ÇDLÄD$! IÅ6Å6Å6±{b÷Äî±ö´ö´öÔÛ©·So§Ý»)vS”V*­TZ™VžVžVNWÓÕt5øPöÊP†²¬!ˆ¤À¯ä§÷2<ÄM¾È¹Ôí¨•#ËJÅr¯$Ûë^ˆO‹Ä'Š—U¨¼t>öqƒ´åÍ Íß©˜èŸhÐBe£üÅQâx€õg•^¨º‰†6uŽæì&p(ÑɃº³T\X4¨Ò;WZ8·Âñu@jÿ"ýÛ]¢ö||ùhû«Ñi[Š_–¿®yW:¾âZÍ éx)¨€±?œî4v0)¡å´3ns K5éÊ` JPZ”¡µ¨BÍ·YÜþæð‘݈¡ÂD1CI,·”“P‹1õº×Õ¹†i?êZs¢v@ÅlÉJ¸MÞ´yñ£äò{•Kj¾0“Hqà¾Pº@fûµ*;€8âÀk¡âhq´8Z£ŸF?~uÎuÎuÎEŠ6mÀ\Áº—î¥{eŠþ_Ÿú1àyxØÀ»±»kÆ×Œ¯÷:îuÜëªsUçªÎ™(š(š(šo6ßl¾YÙCÙCÙãýÞ÷{ßï­QªQªQB&2‘ÉG²—Å€øÅü”⾃+å.òÅ’¤øäØ£JïWzN47M”ßÊ–1ëÅ "f§Ò‹&fO©º2"TUÎUÉú´[Òtœ©[¼m/½Ve KÔ]|¬,toÛU5ŠÖ,W#¾Œ,€¹BƒèjõPÐn€óì6[ÎÓðƒ',–IŸH¶q)©sºW4»/ÿÊ0ã]ØØ×£>uü4"oe…Ö›')Šyþ%ÛÊNV©8ùÿÎù‚áÈ #ª8‰±èKºP]ô£'h)mŒùØŽ3,ôCxOt ¤à˜ Æ‹ 改;t¯7Ó<ÃÜyþª‘'›Gs…ÕUµÉÌ+¹+ó˜í¢GcžÑן>³S™#d³ô׃®ç-åÿÓ™ðŠx6²‘-Z&Z&Z¦zXõ°êáš·5okÞ–¾-}[úVÖò{±¸ÿ˜úcxëûlÁÚ„6¡M>à> ¼¨¼¨¼ÈÊÃÊÃÊC______9T9T94ádÂÉ„“¥F¥F¥F˜€ ˜€ T Çp Çë»À/›î?æ4ég€~U©ä™Ô²|t©4TßG1Hn84ÅKí±*.ŠKÑ —°·ÖOÒB:î¾oRnßG”nŠ,}±¶XãªÊ»iZj¾pà̲Œh¶Ýv”¡gKG‡×ú‹¬[7´V±)ˆß²‰€HÑfWŠËm+˜4S²‚™‚£ÑÄ»ý'7Wå]Z^ò.ûã­‚¢×‰îç}Œ.üYxýñŠ˜ Ÿ ân¦Dåœ@_¬G 4Æ>,’yæyŠÏŒãÎxstmA¸êNSa(Kú@¾™Šß ¼AJ)8RKV¡œ âP#m]Kµ¥{»éh.×™]{ÆO¬"plùeïŽï ϾúÌhÅx.}Ê­¤}‘ˆøò(Ž:Ð_TqWqWqWÌUÌUÌ-hWЮ ]¥E¥E¥…¬%rñûE $2‰ èŒÎèÌG•ÉÖÌÖÌÖ¬Ò¯Ò¯Ò·Ñ·Ñ·ÑW×S×S×kòªÉ«&¯’w&ïLÞ™=9{rödYo˰ ˰‹°HPßþ=?¡¸Óeô!b±f•™Ö “J«’kʰ@³“Ò}H¹Ý”ÓÓRñUŒ'mÉ8ÒŸö§ÞÔiO.Sfc‡£!/óK‹{”wÝXŒr6tãkdÀþØ`¥T…ëbõFõUÔŸty×2Úò‹ËK‘v¾ãjÓ‰hä¥ßM½­¦¶Ö¥õÛ%Š÷”#Ø¢¦pÖ;ÓN‰}G¡¦Rz¼â}åôšóïò×WV=ßÿ.,oò=ßÒÊ^oþÐ=GïË‘‚€ª¶…%: ¹­ø%0ÀA&±!>A7à í€Éô]J!‡qÉØŒSˆÀ{|B¾0…þrðÛù5ä¹ð‡® IÌlæ2sb·óŒ¡Þµ¦cŒtÕBn07å­ÂûÝ…7f^ßÕéÉ~ò””Á…fá9Xø!™²Þþ÷_:~ó%@§ŸN?~ä¹Cîä™å™å™ÑF´m$ûU­E-j¿û»P?üÜÁD! Q„BHIvIvIvìÐØ¡±CmÚ´¨ë£ë£ëcWdWdW¤4@i€Ò€´õiëÓÖË$³ »° Ó1Óe/õ" à§-îÛð ¯Q:HÊÏ×t«-,N¬×.F5ãËDÑùÒ[’+:Šåº‰Ú13HM]ª4šÆsJ´=•r•ÒOh€Æ°‚YL#•¹H:’»8…c8$5æ"èúJóêîuëß!ùàÿÊžB¹Ìf²ûû% §º$X¶×vp3-׊mbÝ^ÿk¬•£¶£¢‡ 5ØÁðQNVﯰßjq ¯l7˜ëjîomÔ<®x$)ˆ›”~¶èÔKûw_²|_«¥HòŦl)H‰šVšw³T¿|Õm¾^è‡uèøU¬Óƒxà&îaBŸ£/×—^¢VØKˆª¿() ?^•3…!°w5éjîu3g¨‰ûÆî«Ûw1³•VN¯m[5Iš€Hÿäµ»ï¬Ê5)<_®Àj1ÃÉ i!w”nüHëÅKQ?¦~Lýs‡¹ÃÜád¤‡¥‡¥‡Ñ]ÐEæ"ò÷¹_¥W„"É*¢…¨ZÓZÓZÓ8Ó8Ó8S³cfÇÌŽ™l6Ùl²Ù|‘ù"óEÊNÊNÊNïsßç¾Ï­Ñ­Ñ­ÑÅS<ÅS Ä@ D²%êóS÷Q8ŽkÌ¢ˆkuÇ%ޝÜëeï*¦`2›Æ˜I{ÖÆÁ]³\î’HÊ|Á¼… 9à‡!õÉÈ¢ýh2Ì¥”^ €1ô /ô„+|Ñfd5Æ£‰ H9„¡Ò‹Üengä“8½Œ‘ˆã-ôTƒ•×)l5ÜÑ࢒¹ë ÛFŒwëæWÍ<Ý÷ØÓ7ú¬³HÙRõ¾ò\ùH@a3M~±òAQgW8,Õ6rEãzÃIJŠžùUY~(«2ü0÷ó´ÒÌðU rgß=µ,uy’áÇéù·KoT¬[/]%Ý'½‹®¸ŠÇü90+]ò‘l&JH§¦Ü^4åÑ+Ô׊÷²M±E(Cµ0µ~GêEa¶0ÒVÚ‹ÛO϶êëtÖ¸ïÂ{#fº•nªê[»™­Q¼/'¿úæî¸pß(“„ó_L˜Æä<IßpýèF>£*ê ù}ŒPš 4h6 ÇÉqr¼èaÑâ‡2•]ªPý[)î?†WµÝà7"\Â…¤T¥T¥TUÜ­¸[q×ê…Õ «ú&ú&ú&J¾J¾J¾I±I±I±ÅÎÅÎÅÎàå` ш–E¶©¿MVàÉOYÜWã6ÂÙ)ä>3˜kB;reEÛ+?U‡c2cÔr„jÒaj{ålØ•¢Õ,aÖÔHÁúP…â7ýÔW_3ƒÀ¼âÿR`ÎS1QuT‚]ÀF gŽ1·HCæ&iOŽq ¸1ÜÓ²f†ÕæI¨@5’.|Š,ÄIÜE<¬;Z,Ö‹l¯ê|Å8ÍEÅb„Ö§r‹e:³l"LÆh%«;j¥²M'i¶Ó-ÏjBËMa¤EkS­ÃÑb—IÄÒ~#:4}ôåeNõñ¨YIó ž´Œi”þ¾ðmâ™ ÍbÝOúYL °@! @¢uD¹ä0íå4ŒfQ{,†;Fb'jQ'‹Û A©ø/©·ÞK† \âܸô²ú(ME×]ÆAc=ûÊ/”7 ½˜&¢¢ð›7Ÿ…§«lX{Ê>ÊõgÖ“ÙÒ%œ˜Và ؉ TÿàŒñ; qXã°Æa&Љb¢JRJRJR E(b%Vb%¶a¶ýmïTý ’›±›eU[¢%Zf/Ë^–½¬Z³Z³ZÓj³Õf«Í#5FjŒtšè4Ñibò–ä-É[²-³-³-¡-ha!b!–c9– “@à§÷HÀá!*Áá-XÈ—wô–ÎD)EŸ¡)Æâ³‡\'3u½U•¥¡àE °=ÐËñ±¿âøu|õ‡CÌÄQŽr”‚“ÃÊbb0˜´A5“äÓH¼@4Õ§=°Æðù¸)KsZÄ!9@9^ª[•#?Û5y¦9Ïb‡!£v°ý—×.¶.wmØÉÔL/Qi¤j ÒDq2úŠú°7ù7¢K†Íô›+õìý‰âzuïØÇ\Ÿó¯ì#1K úÒ«ôò»fé5ùã^NU,ºªõöÒ›gޱ·>V9ÖhÖ=§ i.fQ@ãh¢%ˆ96šéÌ- ¹4˜‹¢=h½KkÑ[¶4É+ñ‚…^@@@@à—À»hŽBw4!ÇÑ”GÙ¬:¥Öcp“RÛë:Û©C]œiJ™·KÛŒŸ³~Ô½ÕµOëÚI2˜*rlƒ|QõÇä*×i¯Ó^§=SΔ3åyzyzyz¨BªÈsòœ<§e´Œ–ýÍïoçÕ÷{¸‡{2;ú-Ü­â.Å]Š»¼¶xmñÚÂf®Í\›¹zÓõ¦ëM·Ó³Ó³ÓS~­üZùujjjjj*íM{ÓÞ²DNüzß'­÷Oàƒèç> Ýq‹Æ!µ0+èR}Uòj\:›l„5,ÄWÙEL[“£š£Õ&¥¹¼( &·0)ˆ­ÿå¹Ôz¼•z."’ ˆ¤ ÀH˜Br8 P…ÙHÚ œQ'[I)yO6µlzE‹*Åx‡ª§/ھÜÆ$.S ’ß&n¥¬ð\´Ó]Ëá‚ѯAÍZ4ªj:ÝÒO«Òb—aªÆ$Ã!Ú_”S˜Î╤-“­ð–I´‚éqõV°PÔúÒíë¸'µC«:Ô-T*­îðZ!­Wñõ‡JÑ#2î=}ùñýgi~›Š° «œË¥¹u6åZa€;üe1÷-Ò èVúŒÆ\ÁzQt/n! kq¡HD:òŸ6¼ªÝî°e˘.$HZÇM¦}¦ìï;±™ö¨1=íI¬ªúÖ¶€<á˜ÆÅ$ã3ûå¶+yÀ¨‘D™{A}iXYŒöß>,2¯Jò[*µ¡ mrrr2’Œ$#‹ŠŠp —p [±[a3˜ý#î]}ç–t¤#]æ2ôñ¸Ö£Ö£Ö#Î5Î5ε"»"»"»Ñ…F]0»evËì–ÊY•³*gßxwâ݉ZÕZÕZUÜÄMÜÄ ÁÞŸ^Ðþiü¼â>wñŠ_–)jUݸ¶쥶Ò,¢…6Çô`–“‘z&ªZJ øöd=éNZÿî#‡·Ðó+P::“棉”RWJa=¨“©Ä™ÒŒÜÄ.Œ@Ci·N¯ÚP3­.¼jS êÂo"üFòª›G2pÇóÇFÑ N¹´ÖÑ=à lúRÓÒ=Ó>¢a§¦5Ö=uêŽhp]1 ô¡Üq¥%âeúÇ•ÄTúi*JÑJlÜ*´RMÛÿefYXôª¤øœ;¯:%õÍö“>±hs„mÜðÏÅm‹—Wæ‡%¯–FëÀô!žC–Ó~4½8_z–šc/.â¹°)V@@@à‡<ä B j!a,È1"‘îå¬èˆf'íÆ>Z2N­¥f݈jßÚËâdE©Üú%Æ{GGF݉nŸ2šÉgšoÎŽ›Aà +K«ôûüHóê©.t¡‹|ä#_½T½T½”1d Ãûû{øÃþd;ÙN¶ÓJZI+ÿqw“W’X°`áxàáEGÑQ©$•¤’ò½å{Ë÷Ú(Ø(Ø(è*ë*ë*ËåÊåÊå¾×¯ÿ^¿¤kI×’®˜‚)˜‚\ä"gqge}Ö‹ê#ðwågwxÐCx ïU¹®æ]ÍN‰-·\tŽ,Ç`¦9Ë´Ó{¯’ ØÀykÐnhxþ'LžLä „n§€‡4•¸9tG4ÆQ,D#¸Ãº$†ÃDâ@>“uØKÒé™Í ”R‘‰œ; òÝå^ˆÏêÒz¨äj± ¡§FšWUóÎæÏÛÝpò7pµnn£ê¤ùXUWÁV”¡ä&÷?¥úfþFËU‚ÍÐh„šq_t>o£Sm_êW³9ûAEy›÷Å™kK®F¬L˜˜7ëΚ¨±)I Û)u©hW;P/u’NGk\ÄCþ‚˜éŒ©!˃djÇBsn$½Eme›b‹QŽ •ÂÛ¶€€€Àß Þ’ZƒZH‚ ˜Ji8½¡´N!Rnâ~ÃY½¼‡häqÀï»Ëªú ý@?ÐL“Ƥ)×(×(×TVVV˜W˜W˜ËZŠ!†ø­bò×ÎßßQ…Qp‚œp'q2×)×)ש¦CM‡šÖ·­o[ßÖiˆ4Dõë5ÖûÐäC“M²²²d½ÁŒÁÀÁúþ†YD¦k¾ÜºÔ¢Ñ¨’ÐtØ ië%ëFPº¢jŒêÒ–$îr|¶ #ÿ›Ëã­×Aí(è4c(¥ûfjPúlWP_JŸjÔ|év©Å„­—“Ötèû$¨éÀaÍæu>áÞÚ¼_£µšüûs ‹ˆV19Ò”T’U¨D<Î"rƒýÚè÷÷düçÁ°l_^µ:kuVšZšZšZK=.õ6‹Íb³Y üjT¡ M¾HbmRËJDì) Å›ƒ¦7õŽ£4rHðYéÔǺÓÕ ì¯¿™|Úq·Eg½Æü·;r•èËzûc~’‘Œd¾¨¾K}—ú®‹[/n½¸õɤ'“žL²º`uÁê‚ìÜ, ÆB¸ÉõîÎ×û£u¨}¢ÿõÞÉ[Ë[Ë[; wî0¼cXǰŽažšžšžš   ¤’T’¯«|I~ûï{øñó®2ãpŽ>ˆѨxIer\­“t7žT‰w2K !#Ñ\ý¶Âtñ]¨X‰°…1¾“·½ú'¡ˆEU ”H8)58ÁúÈÁ ¬ ‰äOØA‘6§#°›ÃZ<Éë\´¤üÉy“Ø‘Ü^î"-Âs(ã)JPš?æ"È2²Œ,£R*¥Rµ…j Õ*è+è+èç?Íšÿ´zbõÄê‰20¿EUàçà½Õ'þë£q4.Í!Í!Í¡êRÕ¥ªK–ù–ù–ù†ê†ê†êÊÍ”›)7KLLLLL,±-±-±Ås<Çs,Á,á#Ø.4'~Þǽ=6âr0~%F•ÕoªÇ×5–ÞB7òˆHL@õ\¹­¬òQŒT ÑЀPŒÊ¿Ù{?Ü+Q:Y)z` Çp %‡”"g1ƒ "GI8ñ$¹˜Å™Ò`úYâ(•—N)šQ©¿ö&‘¼ÊÐÔôUŒ]š;Û>0ð·?Ùh«ºv3»G©nwlK ²lUŒWª=ƒ¿œ³B®¥bžX^Ê£ä´õSô«té„VŒw’”V=Òž|)/[sâ}¯œùÑo’êrº¿Y–îR4=âT\Ýçëù#‹Äå7J˜/»‚&z‰"­±ŠÍf܉?·“Ö`!gÍm£FPA[,ü£ü3ù—åÍFŒ?I%N8ˆ-t1÷€›Lµ€zN9·Âgékƒ!zÃ'+pY@Ù\fú¤¸¼qŽ9»däþk³=˜ 泃FÑíœ"–Â#Á|ŒvOOOù òä/”/._\¾¸fEÍŠš²È3|\Ÿ£¾ünìÆn´G{´ÇTLÅÔìÞÙ½³{W*U*U*Ùô°éaÓCÃUÃUõ±¨±¨±è½ô½ô½4‡Íasd iCÚÈÒ]U¢•4“fÒLY Ðÿ Ÿ-é(¯ð!"u‚¸Ç@*]~wÔKJWfŒi¶`lRw7²“1a& íဧÆHAn2šÃFX´G$B0”Ü#~xǼdlI?v)sŽ„üÌ7ûê¾Ñj¡2¢ñ1‹ë:‹''õC³¸‹/V é³$5ëô»1½ËÃ﬘RFé³}3¦Sú¢xÖJŸ_™‘LiÔÚ™§(}þ$¸¶jÍ}¹éÓǵñW½7zÓ±þ–ÆûKÛ‡µÓx¼q‹;Ôí÷ˆß‹ÛˆüîôECØ~ aî3–d*ð‹á +èÂЀÄÿæÅïoàã. ð_"1X¨@r˜x±¬I­ßÄz»éV½ÙG>«·ïò.øÃŒÃc$v½(‡ÊÈä@ŽJö>¾róßžý Jåɾ̛ZþpXEV‘•yWwíݵw×Þ1Sb¦ÄLYw`ÝuH9)'岦ˆ@„0~¤Þ?}èCgpgøE™¢LQ¦c+ÇVŽ­¼\½\½\;Ìî0»Ãls}s}s}aeãïÊÏ+^üäA `è¥Ô —¸À Ía Ž6çN¨´•O3ê}ÞÈï.ž\©QOæâVS`= ÂÅ $ Söw ö”P‚”PBýqž´‡3ŒsœˆÉb¢AÖHR¥'¹ ¹ O—#…ÝËñ)È[ºçO¼{-f‚[mpZ`2µå'‡}› £ µ ×ö¶· n9,3å´LDÇ”•Eçf«¶k•>ê:`Ü]£³ÜG/Ú?ü|S‹,§‚«UŸbO¤8^z“ÿ¡$gÉËÔÄÏÙÇ“k>k”*½]•ò>·¹ä„ÔCz'Ðþ‡ëŠÅ:¸0—H?òi¨€­DKº•r´9à"!N¶øË vz0|üuî_M@áúÀêN÷£»t¥ÔÜ*Ÿ¼Áù±­|›;õ¢gµódµ)òÞÏ>ÏPn+ŸP²ƒÝÀá5ÀÞâr˜.rfrçåÚ“Öx‰!ˆÅE„*” ‡2T¢ö½F^­œŒÉ˜Œ Ø€ *7Tn¨Ü{-÷ZîuEXEXEU¡*T…cbLïÒ»ô®04~õmáÙÈF6b " YÈ’H $q'âNÄ(ïYÞ³¼§i¼i¼i¼ùBó…æ ß)¾S|WТ EA lÄFl¤‡éaz8gIÎ’œ%hˆ†he(CYf}øNøyÅwP„"¤ ¹…_ªÕZä:i †;ÏíSö“{&NPÛ¬è+¬xj¥¨Š%[Hox k.ÿaÖ ƒÒg(p"Êàc YF1ŽìÂ$¸Òµ8€ÛE×ážÔ[Ú‘[ŠØéE,Òc,žºÕZT7ØF˜LÔo™Ú0[Ý©UEã8ã6™ixÏô‘ÞIe1+jÅÎÄÍØ ƒ·†Á*Ôú#•‹» ­’I34à†‘•9ù¹ý+´“3Ê ãDig ="5ß)åy¸à•4-*cmNDÉS8c¦q ³d—Ág¿ëÅÎcº“!Ä…Ô‘8Žá–Q.€†ÒƆÅ8+Ä¡ø¡yˆP…HpÛá/ e“˜“’ÕÒœÖâ :QY,ÿhz¯þ^ÍºŽ¿Ûã­£ªQ¶á Õû€$ƒNêF’ýuÙuŸ$j´íE‡“4QxEoR®öt­Eí(ÚͰ0&‚ÊÎCAAÉqrœç+Ô-Ô-Ô-¿(~QüRšXšXš h@ƒéÍôfzKII äÂ0À*¬Â*ÌÅ\ÌM’>$}HÅÒŠ¥K­/Y_²¾¤ßI¿“~'Æ' Ou¢NÔ¥6R©MÞµ¼ky×dY¡´¡ mAqÿ¾ø®9 Ë?Uט‰æô2íOoª6•¿+wX«Dñ‚üÜO5è„@<ÃXÒm0MPÝ!õU 8 ÅBœ¡ À L0b°£ €®è{æ $eL3ÉXoÔæ*v(SËE!ÊðÔ"vrâÞöUÚ¥°[¬iÓ½Qö›Žþ®ÛMã›õ²Ž×.´7mä§9Úܼa£ÊJê-FŒ6g£§­ÓYAQo•þ,ã•mÐì£ñ±ñsª;IZ•I+;µ*I¹œu­œ ÝñöBvó ^^JÝ—œ˜YX¼?Ó7o|ù¶²f=«™.ʉ ‘éG‰: Àvú+èDÐkˆD&Öá^b5ã)ÊQ…™×§ðæ' ð}QßWXJPÀL„éCì¥t*Lx«EƒSêw”’†wï2ßqwPvçr#KýÙªþ7M*h*¾Rv²†=¯û8ôSå*§“ý­5 &™«îŽÜi¸cdÆîòve]·9¸,æÎM—î–îúÓ®Ý&0¡Á4˜c–a™òåÊ#È:²Ž¬«H­H­HE1ŠQL®‘käÒ†4aÈüãmæa¡âC|òç-Î[Œ-Ø‚-M†7ÞdxµWµWµ“Éd2™Ò i…´zЃž¬>Ó­ÀwůPÜ ’+ëjäÐN0á®ÐƒÔKÑ[|‚½£zM~«¨l,­€'àk !߀ZÔý¨â!céSÊpR© X…h‘pâfiJ.à$NâŒÔ€{FïVNª¾Y‡$! 1Hr˲ÂPê§!—Ûj–Ó5c+›‹FUªE-ä‡6¼Òô±µ¿^+WÃÛªEâŠóØZ²FÜy§Í;ŠV.ùCgºÀî‘ö©i8¬ñØâÆE‹«×ǹ¥é®zýèƒvŽý«Ïï§çç¾jö^-wKÂøÔö¹×%ç¥ÎÒÓ8 )€SÄu鲦$šªÒ.¸Í ¥h;z™V ’‘Ba대€À_1D`eù¼w`ú°…Œ+i+Ì ¤t2LäBÄ1¢w#.tiëxt’EŸiM>8«ØtÑy KÉÉ4€ZÓ!4…Ÿs›îÞLž°QçLÊ«»QKú}–ýFÙ—6¬åÝÎ~ž=Qc®ÆJµæ«LŠM¼RÚ¿Wy¯‚•XŠ¥hŽèø'$6‚!ÂÝänr7‘‡<ä©…ª…ª…VùUùUù•ĔĔÄðQÞéH:’Ž”E;žê¿ŠP„"µ¢VÔŠ"‡È!Ý:Ý:Ý:ÎóãüD{D{D{Èj²š¬Æ ¼À <Æc<–}—ß.,ð]ñ+÷,Q™eoÁ8(Æ=£&Ê¥âQ”úGù(1ÁS\°ŸtCs ³ñwFZÏá$_PH[ÓýГòÑ8u¡´†Ñ ®0"wÈv #*ˆ&ˈ!‰A`åÊê–µº÷Ï¿@ îãÀìÄ%ÄžÒFŒrHƒ¶êN +=‡»^6Óõéí>¼Ñr[=£ joôÏiWz£ºYmœâ@LW7Z%òm yJQ¸6Œª|¤qù[ŠÅUoòû—L­œ뙲µhÈ]·——>½8ìÅ•ÔVÅ*ºÔn(9W^}BR"M§ vXl&SHna2Žá §BS]ú‘š`JP:d ¥(F™¡V@@àO7(ÈÉÖBY0Œ*ÙO”©–Sén ”[$n%êä{¬µ·åàÙ-§7Km>Þ±¹þa@zSz %ÔLZ+u€4¼8.+kï2ŸÃ·#çßÿðòJúXCédö3«Á(p&ÒtîjåËê¦ÕS3’ô’½ßyõ>jWn_f_v/õ~æýLbC‰#ŠñOÆ$LÂ$jL©±(E”"JÑÐÑÐÑЩ̬̬Ì,Ô.Ô.ÔÆ6lÃ6:”¥C±‹±XDÿük¯ý(Žâ(àóBóBóBgg纕u+ëVÖd×d×d“§ä)y*õ–zK½ùû%ëG°¸‡ü Å=/¶Ü¤râ  Î˜Ãèˆ:²EÊvâJ‘»€LGc˜€à# ¼KÿÁÓø_ä¢å8‹ûˆãÿRPà6U@c*B5­ÅÒiØÁ aÞ âO¤dä¤t17(oI±KòV£‰øØ¢ o×±‹xÙ€Ý;t4zêÜt»ñ›æ /©2ŽR _½¸ÆGÍÕ|–»¥jÁnDJÚÚS3´¡“¨”a ‹ÙÚüà¥bq¿2¢rUÛÜgs *›Eqï ³õŸ\‹þð1 ¡É§%ÅŸí>®)ØUbTÎTéü¿ë+þZ`Dd."qƒ„Ù´’¶§!T‰vÀZtÃtþ&Sœ`Ïø­àÕt~ýsF“ùL¦“·\wzŠqèHÁ¶ôúÔn£MóÉN}ÊœÛx»Nix Óéz@Z' ØR‘ᓦ¯gØoŸ|!þuéÿÇ:‰~²£´…“™KLg m/ÍæBf³µV©&µ&)nmܦ¸-=Rz<éñÄ|¯ù^ó½l›Ä&qg¸ÓÜiÌÁÌÁ¬Áš?R0¤éFºQB % ;v*ìTñQñQñ©1­1­1-ŸY>³|¦¬é~nCø—Æh€¸ˆ‹¸È»Ê¾3|gø®QÛFmµ•>—>—>OòMòMòÍVÈVÈVøÙÞ²!úÙwÆRÜ녕ʽ.͆# DGne¨V‰4˜ZÕ¢ÛLkš8Îh 1® ¢ý RÚ¯ïÖô3Ì0EºŽ6¥ Žc9‘©¤C°þpÆ%ÜÃsL§Ûñ”jÂ[£FÆ?ÈÔŠB<2ÀÐÚ¯¾Jy¡­µÉQÍývGµÓ*ò¬pÕ6+o¹Øþ½®–ñ Vñ®h¶¸5;dz”,UÝ™Z»yJcDì`1V={zÚ:xEç=¯ôù¸5ûFÉ•÷ã2NuQýþeþÅ;3£.§±ñE©Ú¹+¸öÜsº˜“ÐÕhn2­ü2ìˆ>zA…-dÙÎ\ ¦Ž\97ŽÖ¢9F`»,ªƒ-V@@à¿CrñÏO¦‰!¶¢®áŽRgÚGäzkZn¦¤6à€‹¡¯q«I¦PÌ>¥öçG;$‚”'¬Ls/ž¹~ù)ó—%'Âî)¼ÛW׬NG2‹œ MqÎpESšL­°†ÓæfÑ-|l7bL HgØÂ¶i¾i¾i¾%—J.•\2ô4ô4ôÔo¥ßJ¿ÕgÏÏžŸ=Écò˜<¦kéZºö}Ú Æ` æ·H*ª(ª(ª¨5¢Fª/T_¨¾P¢S¢S¢ƒ$$!‰Ò@ˆ}؇}°úÕðn-ü®Ò؉¼Ê®‘¯‘¯‘o™b™b™B¶‘md[ŠmŠmŠmvÓì¦ÙMqp@;ÿÞᑈDY?ß!ÿIqÏGÍWo¹’Uçkp!ÒºyA& ô… ¸jöÔ‡…s_ë!Š“†öê×øÃ^E6Ï”ª”CE_éx. Ñ˜üÉ#7¤jÛN÷KsŸG/¸Ûø]£/‡ò4K²p˜Ë !¦t:—Nƒ¤Ï¸Ftª,%S êdK¿Qª¸Ü îñ'þÄÿóëϯ?¿þþ%üK¸ýûöLUMUMUÃ*Ã*Ã*é:ºŽ®ÃLÌÄL¤ )ðdoâWl¦ØL±™Úµ7jo ,.X\RZRZRÊ+‹tAg`ö`0è~õUmÞÑè)žâ©è°è°è°Ýy»óvçUUU‹Æ+—t#éFÒ Ä 1èŽîè.¨ì?þ“âƒ\”ðÅšáR5®¼hhÍÀºÛÚ¹r÷šrN´‹î)ª8—¸Ì{ºƒZr/pþè­Bd™¿õT’ñ ytÍ@c)¥(ÐZPÁø  Üa rk1t# Gˆ ‰Å´ò• ªCL1]vÜšzqÃ~Œ¼àE>’äczzú‡ 6|ØÐŽ´#툚š[ÉV²•Ò@i 4õþý1ð)Vb%VÊŸ—?/^¥»Jw•îYáYáYáå­Ë[—·† l`÷ݯ€WµáGœÆiœæ×^¬|¬|¬|´|´|´|ÊO”Ÿ(?ñnÁ»ïÔJk¥µRÌÇ|ÌçCs~ÓÀßä¡õïy‡|”‚€º³Òœsɽš¥u¦ÄE}™b!j9îŒf¤¢Š|™\­h>û¥†«q,œamA¸ÿê[¤sPˆrœÀm¼Æ Ü(ÁV< OùL±”Ã3Òµ8Å4d¥D‹¬“dI/q1…ÍKNUö)D‰†,”à Bñ^Ö±ÅI£ zµÛÑ$ÒxŸ3,ä5‡4±¶ÔÑ5sØdf©}_û²Îq¥ ½Ç¥ªNWm'« õþò‹ÌGšJ4U»ŽlÑÇX oË[ŸIž^UÛg;Þ–e=}1÷Æç}Iw>%W¿–l“;%+0/§”  4~êBÉvÒk˜©Ä…D1˜ÇÄ@ê!]ŽÎü‡²½ ä›Í±-H½9Ê‚’aD—ˆn’ž\u£¡ÒîõÖ Òz§º`ÜÕÓ§뻳Iûñ –+®ê:KméPéÛBŸÒ¢:¿£îž~[¸cÙÅG±÷Sò2 âБaC˜sd6çBÑÙ\snÕ‚"ÞC„jÔ@ò+VòDADÒ†´!¦` ¦|˜ýaö‡ÙeÓʦ•MsüäøÉñ“š¹š¹šyQzQzQ:™Oæ“ù‹; ,Ô 5¾B¹»rwåîŠ†Š†Š†FFFÒÒÒÄø?z„¡G„aø+°‚¬d4û¡ú™ 7n6Üp›á6Ãmu±u±u±Il›ÄVH+¤R¼Á¼Ac4Fc!˜òß•ÿ ¸Óp|Bl!‚¨º½Ô\Ú+SÅ–ìg“y.‘û¬ÝIiœÂyù¢ÁÌášquø‘–0¶0R~"Sl$ä0ˆOË‹+`)ƒ=˜‡¾¤7‘C,ÂP8Ae؈Sˆ¢;éUÄ¥Ègv*NA& €pŒ‚“üt¹¹V ‚5ÓÍÛ(¨vlË9{™lôÜÑTÙø­¶ÑÕŠ>r»EÇ/¯.²ˆ:6ì¥÷Z±ËÀJƒ7m¢±¹ÕJOÉêDO¶E—Þ§}Z]ð,iifbÙþ;r/N |³,£k•]ͤº©t*Çl)èG iO’‹ˆ “ f*{Ž=A·â±¥¢lQ›/ú"ú‚Ï4—æBJPB5*Q) ?ú™›­`ŽFì&–Ü”ºpjÔn*k”ºËožÜ¿oÓË#UºÚ•Øêš_вC|í§ºýBp³¸)?ç{Ÿ¤,\Uttxd§7Nžåøó!÷H/<Á!ÜC¦t7—#°,0²,ª¿)¤Ò×ô5}„ $útôéèÓåÊ/”_0Üe¸Ëp—f•f•fU‘¨HT$BGtDG\ÅU\ýÝ¥ÊG 4³1³ÕO«ŸV?Í…p!\HIjIjIª,þIªP%¨’¿p¬Š ‚ä G*H© ýh?ÚOO]O]OÝ´“i'ÓN”RJiŠ~Š~Š~á´Âi…Ó‹\äÂö°—õ#Èùo;@þ=¯‘…|è@Ií!É©vÑ—ªÊšBÈ3÷H.[²‘Vªµ’—ˆ¢Åí˜f%8t`m¨!W¯À¿…ÿƒå¸@A ¸„ƒøº9Œ·ŠGw°d 1Ä}Æœ%"bE^>Õ¾5µ«ßHÙšƒ·HA®à>“;!nÏÞÒú¨ÚTA¾ýÞ¦Uf¯¼k›õ4žl—f¼^}“ÕTãšótî6¸¢|à^SÌe—Ò‰¶0?¨io ëHm=’$q!kû¶qºSÂTD×NóN)¹rkäs¹t»çLüìŒíÙŠÔ½IÒOo”TWz¹Ô)—”^(žŸ˜M:\2F2JÜR$]“ÖWÙùëâø·ß¦Þ Ø:L7ñ eØ‚'¸Š}¼Ê®î®â«¨Ð}Më'~sw yÑü¹ÃlË@­7—›pm¹€U»ñ9L=Ýv 9Ñ÷…øY»×>•üÙÇLYÍ…ÑI´õ¦—á %(@Œ*¤ Nvtéÿà¨À«_D u;ksÖæ¬Í9å9å9åZ·´niÝrmäÚȵQªAªAªA½§ÍïïÓ¬%(a&`_¡á£á£áC—Óåtyñ¹âsÅçP€*û/‚—[}6aF§Ñi-5Zj´´Þi½Óz§h–h–hÖ§ÈO‘Ÿ"3Ë3Ë3ËeqÜ}àä#ù‚ ÿÙL@;4%—± ÝùŠMŸºå´R¥tÍα65Òņ;ä¿™~Xà µOÊûec/aØõÏšÀoS/0i¨C™4EŽ0W]Ò“ά'sQ‰°û÷ݸô¶ieØqhNçWV7¯×vN„bȱ¡wKân‹§úQÖ+h ¥a$¨=¥á/fô¦4,%è*¥aJ_(žáOidé¬;9_.JüwïOßx`Òüsã¢L£ÚÅe-)œòðòÊËóFܘã>g@A´˜}Êl!§HO|ïQËN5¿|èFžÁ莖ìdæ9úã†;™¹Ï`˜'¥£gî¤ôé½€õ”>³ Ü@ièÜ ÷ûom=ðsãö¶Žþ5eo`Ü™5¤˜4†+`úOªß–¦hЦð„'<hD/軠1b&ÄLX½gõžÕ²íždF†ýAÒ6ƒÌð¯ñ P€Âؼ±ycó^×¾®}];mÿ´ýÓ¾j½H/ÒKž?K}7ËC8ÄodN*œT8éîëîëîë=É{’÷$§§§Vž•gåùœµð€<~¢¿)ÿ9ªL >3í‰ K¨U.SaUÙwÙRæ©ô w—6W•“›Ãöµ!ÇÐàh@I®ÀoF}+uJPA  Š´' Ècn Ž0Â< G+ A'Ø1MH!ö‘YDæÒ)ôMÌä¤ð/[b.%…yÀw¦¯ûâCƒ!ªäõ› ´;gxÁsªëÖFk\/XÝmpÒjxÃÑjí5T>)l&[”º3Û® ­Ñ5ÐhA϶¢ßƒ&jë¥5RÉb·µ“ZÏy=§;úzvï0ã‚ÆÖn Ë—Vµ«ãçB{”‰%¥uÜyº ³±·QŒrTËVþøIÕ¨…„ø1Î=L„t3×6!Ƥ‰éâÛò³åŒYMYºöh§Ö8Ç@4u!éH逞}Óé}`þ§eŽG×GÕÞÈ KüP^Q«^‡0LH"IÂK:•®GG.“Φ岔L?~Rý¶$! IŒ˜3b®)×”kq+âVÄ­A}ôÁ Ô Ô ”4%MISêFݨ›,b÷K¼ÄËßQæŠP„¢l#l5ªQ­~Nýœú9ZI+ie‰]‰]‰00ÿõ×"üá>êŽÈJd%²² ¶ ¶ V›©6SmfqâÅ=’Ò“Ò“Ò¥5Òi La SœÀ œÖ4¾A,fv‘"¾<. Ùyošµþêø„ §eC¯SºÒcôGUÝYš²÷Û{ùŠžû) Õ Z@iØè Ñ”>]Л҈3ý^î6¢oï¥M×ÈŸ­ýæA¢Â6$©Ø‡Å$«âaþø‹žÄLb&A ZÐâ™ÃLJKÿ–þ-}ûTûTûTÙ&Œ„‘0™ÃÌï‡;Üá.+oÇvl_“»&wMnôÖè­Ñ[»©vSí¦*;Áâþcê[Ç`#¬ÅZ¬åÓ*Ùζm;Û+Ò+Ò+²ÕÌV3[ÍTUPUPýš•ß„úã~þˆ~I#ºÏ‘‚ÅPyRâÀ}Áfé)ÎŒ¡DôA.½Žú¦jRåÂø·¹ëŠ4…÷=¿õ-Ù‹‚;ÃJ8[(E7´-ID&¶a @k((ÇäÞ«ÊßÐÿŒÒ«^Gƒo;Ä»–¬jÏ„¤’Iˆ£bêƒCcij±X *S*QýƒÿúoÉF! Q˜õ ëAÖƒ¤§IO“ž6~Ùøeã—vÖvÖvÖ ‹%,b¢˜(&JÊI9é﹚§ e(óŠ#cËØ2¶šyšyšyœ7çÍyv-ìZØUEà'n'((L`¼Ç{¼çÝ97rnäÜк¡uCkÉqÉqÉñ¤¨¤¨¤¨²ê²ê²jY|>nLý~þ1ü2Å}þ¿÷Òuã$þt¤=À´#EØ]dà£a¼z´Jª P¿4õ•àx†D a¼(ðÕÚÍ·P‚7Äd'é€×LYA ɃÊêJÛªsq'ÓÃ+"”?ßÞ¹Ùj°SÕ£M{$Á5æ‘h™(¿9«\lªÆ Ë]²¿dî¢é²¥-&N>Ðk¯“æŽu—RÞÚéð`æ»^eN.\ÍŸÓ™< JÔ~ôÕ§½±‹±@!!”À?ú[º`¼À^ f\HÖs[è0RP “8íFSÍûïlzkä«NM­u•7¨‰åËZoÉ@´õø2:'¡Â%DáJt܈§D¿(Š-ͨê…XŒDÚ¬ )“ôÚÓÎÔœî‚#ÄØË‡CþaÞý©óšPjB܈q+êXÔ±¨cÚî´Ýi»Û¤·Io“n°Í`›Á6ÞÝ‚¾¢¯è+X–ø€?ì±ùmá]e(((cÁX0 5j4¤›éfº¹¸¸¸¸¸XÂ?o#W€ðð€/ë¼Òy¥óÊì’Ù%³KÔúQ¿‹‹ £Ų¸1|ä~«À?Œ_¤¸c}Šxº@W[!¹_5E²C*•»GŽ’{â¡ « ¢¡tAy'ð#­çŸZŽJÔÒiô œ¥RÚšRØ¢t0ŽÔŽ1$¹Dãù°[º×CüžÜšz=ä‡>vBƒ¹ §«<úÚ²c’º¿tœÜÕÙ]j’Hª¬?¦ÁKEå˜hÙ²bò¨^süÏÑÇÕÉØ¿ö†Rüó·ª:fó‰Ëb3²v/AîJ‹¸3tfa3.Ë–éÿ$›Ÿ€ÀD½qNv¼f¶“$XªÀu 9P`£áFj›3Üp½2²Ög¾“öNí5Š¡@Ýi@;Ó•¥¦•w¥}Ž4¼Ô?æåކLc¤ïeX4Än`“ýH£°™’ÒªŠ#Hþ!Þ{ýìÑ–a–1™‡ÌC©ŸÔOê÷!íCÚ‡´*ƒ*ƒ*‡‡‡ågÊÏ”ŸU¸V¸V¸[bKlGƒ,êÀçòT›¬6Ym²´´´AéÒ;¥wd-“§~´Ÿã8ŽãüŠ„º¢º¢º¢ÍT›©6SEA¢ QPÆÄŒ‰3j3j3jq ·p ]Ð]ð_ðE¤ÀiádñäËÎ÷Œ®ë­Ê3÷ýP nÇRës)]0zÈFE߃múòmÈmÁÇ]àoŠt¡+ç3H,‰eŸˆºŠº²"C‘)»T4BäÒ—‘ù¿Š§‹.‰Œ=´\ m¸µ6©ïùŠë÷šO-¡4rÈÌm”†~8AéóNÁ[ ÝnLv>²pÛ-«©ºšAK~ÂÉŽBT0œq ×H4„T  EÈ Þ+xûº M¨A™©cú’àúMôX¨D¯t¿Í£cf× “ÇM¥ôyÿà[”>Y;}=¥Y3}*ŽÜ»7q7ù¢nœnœnÜ›6lîÞ-¼[¨3Wg®Î\Ù̆Øa€Ë‹±ËåÆÈ‘ãâââ}Àû€÷&êMÔ›¨3ÑL4 cØϞ+û®ðÌøEÏ BìQ EÈAdœ¥õX½\¢4üØŒ`éÇ'-BmvÎܺÏðö96ùj½•Ÿ)<øæ€ed 2‰Ò°ÍaÙBÊ'?—úáY§a Zä‘]¤–ðÕJF óä¶÷,jc½'ìånÍ!)}¶>è6¥¡Õ;) Ó |FéÓñAB³wŽ´»ëãV½¬úb–}Úä±ÂTf)%dUbˆþf£Ÿ – &ƒÉ`œÂ)œ3wÌÜ1s_^|yñåÅÝSvOÙ=…qa\Yûú z~ÛÇÛGò‘|äËwnܹñ‹/v¼Ø±á؆cމÅŽbGYÓ38ƒ3ÿБϻ»<ÅS<å+LLL<ó<ó<ó<==”6(mP*k·qû«ˆ…ç¶À‡2ä µa,Èf¾âfð°iÞ«)]}Ìÿ¥Ë;ŽŸ0íL™qÂzŒ€.T¡,O@@¿4ϳSЕ¹Åè“Îx…5°¯ßÐÌÈp‘V¯yQÃÛµ<êpfþØk”†+Îp¥ôÙ• –Òg½‡R¶yFeDÜžü¡Ž¦ô:ãR&ç$^-z\¿V‹é@œ˜~$ž8`~8º-^àáGjóŠiLFWD¡kýú^»Ú­±yöT´c¶Ÿ„Òpß™ƒ(}fØ‚ÒÐ3c(P›QÆ„è×ggûb[GxEF回o0ªÄ‡°dUõ³¨þí¤Jz’ž¤'_ѬºYu³ê¨Œ¨Œ¨Œ­n´ºÑJ>J>J>Jæ$3ƒ~ˆ@ÿ›Âtgº3²¬ê~üøˆ}û6öíü²ùeóËx?{Yì”X€ÿ ‘ÏK^ JPBŠ Ë„£3Tg¨ÎÐöÒöÒöÒŽÞ½;z›Œ3g2Nö­\ä"0€ÁÏÍ _¶\XZÔ!JÐ…<”¡Rܦö¥d€éxŒ,ªLí6‹EéªqŠòÑ4Á8‚G˜‚ˆdÔÔ˰8;p“ëÉÐûðÇA‚(,gw2OÉÙ´Ì/Ë /¯r;ú4bŒûš »Ofóõ§s’¥Û{äc“tm Çgº¥»·Ï¬öœÓö@ñк™óŸk¯3N£Vyª´{Dßrç©e2ÈaPDaLa¿­Z#ðç«üèj}¨# ’cÕÈsΕ{CÒWpÃM·&ö3n¼á·.´oÜùYË»j[çòÙp )—<ØÏ¬qœyŠfÑAÿÌUé};m Ä9Ë‹“Ÿh$ÆÁœ6äÊ ²ˆá{rƒ8޾Ãh,ýa-«µËH&¼¿x2Áû²gvÌì˜Ù±Ü½Ü½Ü]¹L¹L¹Ìf‚Í› ¼W4ùD>‘O¿‹ 8C0„/ª'ª'ª'Šgˆgˆg”F•F•F¡ e(#FĈñ™_ÿãŸ÷Dç£èLÅTL…&4¡©¢¢b-²Y‹äÖÈ­‘[ó9ùsòçäOŽŸ?9âîà†c8†# YÈúæ^ üj{‘T“e|ÅN—^­Ú®¤Ü*ë1iÜÝ¥G<Ï.c:(ßÒH§Zk(ÿ rx.O@à?ÀüÿˆŒ)9GtY}Æ›4®ßPQNþŽœýƒ¾›\†mÚ}zðJÃOÏșҧ~”F^Ÿù9ååÙÂq mvpSS¼«ÐTnEýØ\¦ŽD!‡0UV%þGîèˆF4¢eO†¾Š}û†¼yòþå™—g^ži2Òd¤ \àf³Ùð× äYyVž 9ëÓ¬O³>%½OzŸô~xÕðªáUƒä˜9Ìfœà§¿ù©ÿ߈ØÈ¯9ÈyÊyÊy6Ëh–Ñ,Ãûˆ÷ï#.^.^.^ìzv=»žWëÑ­Ñú'úø_`»’d _^¾ÇÇÐ=ŽV¯Ôc%½°$b„gщù†f¸™™Â°?èÒ—h røÔ÷Åm&0#P…ò’ CTý†ÊT©¡üÃ>'ÛÚ<f·«ûEÎèqBÀSJÃ÷ÌXEihmÀKJ#½gæe,½¸züÉ­´¼–š^6l¦¹÷›*±ØÌ,$å_C¾Ö{‘~<~}Ø/’8¦3XT-¾(¾Èfˆ•ĦõÚÍ0¸¥½K5l£Æ”+žóoXNžCiDÑLeJC[\§4bÌÌFY.;Mx|xðG÷R“}w Ïú‡"ud%>ã ®bÚ71RþÉ£Ô>ð!‡È!r:ÐÎDµ‰jÕø,›+,WX®°”Mè=Ìf¢!þ¶§ÀN`'°²³oV¼Yñ&uiêÒÔ¥½Ïõ>×ûœ¬ÍEö"{ò‡ü?â¾tFgtÆ\ÌÅ\²Š¬"«Î8œq8ã=ß{¾÷üî-Ü[¸+±&'‰'ávb¤ìƒGËø'ðãû½càIš¡;I[Y75ŠÒð~3ÆÖ¤?ØÐt[EÀc¯—v“L_è¼ûf˜g’á¸NêÈÔ ?¨éŒ°ú'Ÿ „q`¾Âê•Õ+«W×Ú^k{­íÓ-O·<ÝâÖÔ­©[S~‹$“Τ3é¿ÙÁEDDdwG!D!D!äàȃ#ŽŒ94r¨[°[°›,Žþo{Ü¿(ŠP„¢l×ÀðŠáÃ+ž¦ž¦ž¦žÆžÆžÆ; v|µ¬ŸÅÙo£Š ü>O‰·Dq|Ù+Éf{£ÒÚ’%F|®]¾Øc¸3¥«"ý/æ·}Ôd+ßFÀø“w‚Ü~ë©XO…Ñ„á KèJ²uŒY†Kõ7lÚÅÆDÿËQ¯÷»w.öº5pò9J#낃(}ºxz¥‘z3g•ÅÞ5ŸÚáÎê_ú¯éðÁuŒés6šÉv®Xf6É%nð@S˜ÁÚPýnòM üúhUx¢Ì‚`t!ɤ±k˜[ä¹OܰúÇ_Ò QKQRo¢c½ÔP!è@ŸNŽKCÇ„ö<ÑðÓeJ)ýC)¥/¦PJi4­Íª4«(¼3iÂÒCÖó2ºÅ8êšÏ×Z¿7‘«G2ð»àèC]öò Œ«_z¡z)-RZ¤´hß›}oö½I8˜p0á`—;]ît¹Ã7d÷±ûØ}¿Õ|%³È,2‹£­¢­¢­rzñéŧ?œõpÖÃYÛ¶;l—=7‚˜ &èo(ù…úe†0„ñÕW5®j\m›Û6·m®×v¯í^ÛÍŸ›?7ÿºß/9È5¬a-8Æüþ£´na_v²5ÈÔþ\õ`ѳákÊ; oEËÖ³\ºÖ«±ë0P€’HÊ&RáÑ+ ð»Sß…`$z£5{€‰"waøÿ:÷°v2è´íJ€[ÇÜ\_4y0¥‘»fö¡4ta ¥a}ƒ¦SúôaP÷«ÌZÓ¾zý›tXdÛU¼T¬+ЬߣKVâ%yH†!õ›Ñâÿj°õ¶6 ÈaÒo™¦5Æt'‘ùï;h²ßªÀ`æà³Þãí쎟¹¿ÓÛ„ÈãóÆìäôŸúÌØGéããôòŽ'7;×àѶ*×*×·ŠCe›_]—ô«v;×ÿSaûáMîÖï“\&ŽXÂÌ#Ť­¬J$¨êÿêP‡:óšyͼæ+–8-qZâ”Ø%±Kb—éÓ ¦àáq!.ă1ƒÿ÷Ã’R@ ør#ÛF¶l¯]-ºZt]îºÜu9S?S?S?YØÊZRKjÿV2¯¯p¯Çz¬ç‹ é é é-Þ¶xÛâ­W•W•W•ãÇ+ŽW{Æž±Ç¬ÁøÂ¾Â°ø£X/¸òE•Ýr§Å†¥I󋆊kò¾†ÒõJã=7ÍëºõçÕq“Ä bøC©¯:Äô"!ÄwI-YŠOõÚ70}­Ã¬ ›à±$˵«“†RÞeÆvJC?úP¾:è0¥a£göŽÜrepåPù·Ä¢wì›úýˆž²‡2˜hCfÛƒ2!'ÜŠ?ú9ABêä2ˆL¶ŠÕ"…" Ö„ýÌ7ƒÕǩȗu–w/·´Û4%·c³ž›÷ËÍireþÄS”†åͼBiÔЙO)h´‰Ò¨^³ÏQúÐs쌂%qÍ&á2¥”Æß¥”Ò¸"J)=ß5ù퇗²SÌödž‘Áb¦Ám¾ z¯ÿݤÁŒ`Fð1d÷Üop¿¨—Q/£^L8˜p0A©B©BIæqŽT¤þ¿—íÿ˜AŒ,6¼]s»ævÍïw¼ßñ~dzWÏ^={Uw”î(ÝQ²`”›Éæ¯`þVxžü¦[v0;˜ì2Þe¼ËxïæÞͽ›7ŸÛ|nó¹rqrqr2?LÇtL—•…uJÿ_³Ñ' E_¶×BZ(=UšQ·]¢¥'çË@Žãúë6Q t_À`“4”¶äl±¾X‹¸†'‚¸~w¸zqý±W(C\Á<e È ¢E‚H5F&§7ÉÛ4¯u/Ùfq®Í˘éýƒ›]𪃩¥¾ùèFšÙ@m—Ú ÷iK ,ܧÙ7Ôk>oÑÐâævÚ^Ê~½ä|Æã3IãrÚŽ*çmûI F2&`SEêƒ8‰Ûˆ•)gHÁ ·è‚ÿÉç£;‹ ‹ãXŠ~$ŠìÆ@t€#4d.Lóè.Ü¢½¨)Œ¤þ0(Tj)1KÒﯶÅ%ÆzžîˆNVn­ÌI›ëƒust55ö*Lf6Ê5Q@t’|8SN `g£¨c°þKŸœ%•YéE9ÛJݶ¸¥ F/.Þ>/ä^ˆ?*ïRÒq¹ÚxN“Õ÷RMIŠÁ½ Ý3Ys.ä! É>2ãèiúLvB¨øŸÇ½J¯Ò«(F1Š_‰^‰^‰*ü*ü*ü,Ì,Ì,Ì4?k~Öü\©R©R©B†‘adØo|+¶b+Ÿ·U­N­N­Nõ£êGÕÙìG¶ôtééÒÓ¼B§Ð)D ÿ&ó®z ¶a¶á žà‰Õ«+VW´kµkµk+++ßå¼Ëy—SëXëXëˆÓ8Óðƒüø¬·BúCNß‘áp…lœØ—mÍœ+pêO¸þKƒFTSºªÃ˜>·#FuëR#Rõɶ²=Ç*Ax2õ³¥z£¬™@ò‰Ø“¨ÅÌú ÖéÙhh-ð3vS}ŸzÊÇÿ8¥a£ƒ¾Púì@CéÓê€U”FÚÍŒ}+=ª;2iÎÉa.-7…éuÕp®ßÓ@(ó™é@¦AòPªw&‚…õ—Qß2Ç‚C|‰"®²ý™r\t‘ÝÈü‡»¶ïLŸèvÛ¿Ç1—«[Œ§†uXíàòðUãî›Nϧ42cæJÃ×-¥4ÂoÆ2JÃ_ÏX@iØË “u—M?S}hŨ{ÚÏRèÜiÐY¯L»/öŸÌ7èñOø~?1ÐÖÀÞÐÝλc+^-|µ0828;8› "~ÄÑcô=ìÃ>ì||3º  ºð£E4[4[4û̬3³ÎÌz©óR祎OœOœÌîKz¤Çÿnñe° XY&ÔŽ:>êø(¾M|›ø6Ûô¶émÓûfð!w¨@ñ²`ަò¦ò¦òž™ž™ž™666Úô‡i“µA bd¡0+»Àoᱏ—¢u|¼É)n3•æÇV­¨ùHŽj5WNG ÷ž›£ñLá€üK•Wò}Å£Š[Iä% €¶pÆ\AÔ*Rp?Ùî!ï¹GÔŒ20²p ›0„U`ú’)™Þ9Š[nÂiDáHÆ­~q—ûßòÜo7zŠg¯¹NýNYD7È8[®Ü‘1¿§é¹zÐä÷mZN[ßG¾ñ¨£WïV¾× }Ù=fNú¬1ÅmÑ‚‚=ÊÜ%k¸D:•6§w(Á¼E òP[/›¬-L¡wØA“Ñ͘¥¤ '“ˆ26K»qv´«tÎh É2دm­\j~ÆÑ¸Úy¾{˜åuŸóÍ}n±ð6ÐQ;¯•¡¾]ñ ßÕ¤®Òg³†dì F;P-–¦±ÍïX–w/}YÑ­ÇbO™Ý7¬üý¤Ïvù=*TŠÓʪ«îâ Œ~Ø9AqN¬sšt¤]Ш‹BEEGkg׎¨r"ôŒÇ/û„Ƥ1ñMö½æ{íÑØGã{yêåé—§‰%±$–”£å¾±e üwä!y¼ %5’IM’Q’Q’‘Õi«ÓV§›Nl:±éÄÛ;n︽/ð/þ'™óá ½à/¬À ¬PéªÒU¥«Â}…û ÷+NWœ®8(D!ŠQ`iˆ4DòÝK˜—ØnìÆnÞIFç¬ÎY³¦M;›Ê6ñ§T¦T¦TæË?– ÷p÷ÐíÐ5¨A0Hþ ¼aÙvÇZ¼º<±ËXJ—GŒ:Hé²É#'¿KRÖ0LSC­•l´—‘†ø(O@à/ ï_ÏϘT“M„a'0«¿ú,·Vœ)z<ö\|—ÆOîïØå—Gé³Û3¶QúÌ2ÐÒP“@]JÕ‚2‹>ÞÜ8åêÇÉ+:hº†ÛÞ1ü6ðY8Ì;ÆžtÅ}ì„,­Û?È×¹~pÃKØ€aŒ9O´XofYH¶#,ÿ¹¯ª.S^¯¨Õî™KßFt¬¼¯zc‹“.‹'úzd÷¾Òp’!¥¡¹Av”†9 4¢ëŒ«”†ß ª£4|ZÐbJ£:®Z|ß)€<^°­ÊÏmãÉÛï:ÓGÉ)Yû¼¦’rüÏž³û¡+òcû1,³aHO\ÂF|µ,*Aò°‚¬ÈH2’Œä«‹‹‹bÆŒ9¸÷öÞÛ{o˽—{/÷Ó0 Ó01Q˜‚¿ Ñ ‰ ±!6P…*T‡Æ óvùÛåo—ï<³óÌÎ3²Ù͆üo³Ì6°a.2™‹PƒÔ†J†J†JÞ¿zÿêý«9’9’9¾!kÊš²¦ß±Ty·žXÄ"–/ªø¨ø¨ø´~ÖúYëg^!^!^!Ök‰µçpçp7pã›L±‚­]àOà `€áP•ý_eÏì¾£<$Tº²ÝèÓÒ©K–Ž0ÌÚ9·t¨½ÍÝ$-G¾3–ô% ‚ð¾ê»Ó8ÀD1XL¢Ép¼ªßPñœ‚‘ÜÂ^ží”¬£ŸŒØ^6¨£tÔã«( /Ÿq„Þ}¼zZ¥Q¦ÁÛ ƒo6žüáØ†…mº£ùû¡ ¿Éí@šâlY{f¦lûÚןÉzëÿRýz-]Ð6LrŸX‰:³ÝE2ihñã/‰\ØÅÌ!ƒv 2TN¾ÞyPcûý“fWùHÞì=ì<|oé¼Û¦¾¦ôùåY ”FfÌx@iø¹ Q”>w˜™@iØ¡sk’îgNsKÝp¦¹ÿ³£7nô½<ìuç‡+®‹lë¿Wj¨*ïóãã’Wd(^sÄwÈ^Ò·‰>b–`:~³õ¹¾2RO5!nĸ!!1Ê2Ê2ʺs5æjÌËO/?½ü4üÐðCÃñ-™¦LS¦éRb…üÿ5 0Ì$f3‰3ÓÔ¶©mSÛWñ¯â_Å_|~ñùÅç:q:q:qü§DžÈ“ÿÖy£?ú£?1&ÆDÑê©7¦Þˆoß*¾ÕøãŒ—¹Ð0'˜̉ïRm­ïÄ5 £ 3aÈ;!w­‰[·&Þ©Þ©Þ©ÎãœÇ9c^2/™—è†nèÆ§¦úñ¼ø3°‡´‰FÀ,ä€Ué]Ú´d)]µ~Ì©ÏEg‡½¬é»ǫ̂-ÍtvêÊÇL YK Âø.Q‚IJòŒG‘ÛšùF¥&{É2¾Ëà–VìÝ>›ŒúërñOziP‘8ã ¥OÉôrJ#ÔgdÖ9?ì5}Á ÇŇ}ï´ÔtlÕð›trŒ8c/ %ý <Â\ÈCÿ•럛+ì`„lÜÂlBZày@zà1 !MqÍ óS˜~1ì§ù®mT_£ ó7Œpnµðž}_†//r[yò#*ÿøsÀ)J#üg 4"fF ¥á#‚T(J îDihÎŒS©gvûswælxÜk '¾î0»ùmûå ˆO‰¦2_~îÄE¥ì¦ {ƒùDÞ%Äc£ìƒÿ.’:¯î˜ÃæL_¦/Ó—¯îÿ¸ÿãþ£Õ¢Õ¢Õ®7¿Þüzs³]f»Ìvñvb¦5Óši-Lµß`¾ /È ¾l(1”J.1—˜K̳uÏÖ=[×±Çþûó«"L8΄ÿ—‡YÕ?D÷OA Rs‹¹Å\̦˜M1›úù÷óïç/õ_̾Gaa†`³YÈ,tZç´Îi÷ ïÞ3Ü·ºouߪ ® ® KL‰áŽáßÁóJà„!Ô¡Â°ÈÆ^~`NeZ•; t²\åÈ…c‡–Sºª£ÿ¨Ö7­×Ëç¿Ä6#‰— <ïžzöxâ:e–’DëGíBº¤·4·xtDwG·Yu+~8DiØÔ E”>MÈ 4üNPh혇 Z_J_Õ§W·‡ÚÛ¨ÿø€"MÖ€$e¼ûšAŠÿ‹$½¯ŸÅÖ›0¸Èæ°ò$ÝÌ$£ÿÍ÷&àž»£ŠñŠõãšï<·cÙ)ßk)»Îô›Iièö)|2SÒpàÁ”F,™q›Òð~3¬) ë´¬òÄ=L›ÙeÏÝa7žžêÖ!§ß*›Ofꆵ ~ö¨ZÀì 9D…yÇ4&ý‰'(NC jP”µùM³“ ¢A4ø *)*)*);ôvèíÐ{“÷&ïMÞ„… H© L¦Ó‹±‹e(þ;®ã:®#™È---\•¾*}UzÒº¤uIëüÏúŸõ—9­±Ø ìÈAî¿ÛÊ;„0`Àˆg‹g‹gotÜè¸ÑñÅÄ_Lìt¨Ó¡N²’BRHÊw&C^ávƒÜŽpÈ^o¬T­T­T½z{õöêÝÖ®­][;u]u]u]Ù·êmW¶\ üÞüšŸÀT£id™  JsΗm¬(D yËŒšÓ ˆU2c”o‰ˆ¾Ú•œ¡ ¢A@¾ T' ð}Áoo%@Ÿ@#h U¦òh è0ïÉ RDGÐôì-Óˆ)o!"5eØÖ#ç†ÄͶRìVìõÅÕ£a3­Àœòñ~v¸Ô£<çZí~«•ºéó'=cÞ4ñØœ{nM4ûØ3Æ £iÅʪ5öìæcFrG9[š€‡ˆÆ'd"¥²sûý¶6Š!‹Æ°‚>šÂ :Ø„éèÄL!FäYH °[jÉ©Ñ6R=i €Ñ€|œÜñiÝTŠÛÃòîÞ}=ÛØNoÙÏŽèœÖû ™¥ä©¥vWAˆYBé(® Àž":µ%;*”Ê4ëNe+8—³ñŸÖ”œ¼18âKºßí HËäW…ïÊ>Õ>*תŒªÑþ¥ê2I6ªI‰&×¹ÔŸÊÓ ê€ÙHCʹÔ’æb -Ã9ç¾¹R®Þöåÿ>@a1-¦ÅŠ¡ZnQnQnq8äpÈá§ýNûöû˜ù˜ù˜=Î~œý8;ôjèÕЫD›hmZE«h•Lõás‚ ür|á _ö0{˜=,Y.Y.Yž¼2yeòJn·‹ÛeóÈæ‘Í#ñ>ñ>ñ¾ºðºðºp™ß¶=ìaÿ+Žb [ØòwGÜBÜBÜBm‘Ú"µEuÑuÑuÑ%K&–|Ý·pGp仑^ýQÇ»l‰–hÙк¡uCkãÆ;ŒwHs¤9Òœäˆäˆäˆ’]%»Jv¡E(’eBý×<Æ­À_ 6€„‘>|¹ƒ«Ù&J×çPî¹`éÐ1”®m3öþ0o—ÍV%²¹p€x"P„¼ =¿!¼j˳ÁèËÆ2E$þ?lÎ’aomvUwã³i—:z:ݘ59›ÒÈ.3í(}z+à¥Ï*‚ô)}¶d†\˜âî§Câíòžb_&÷InŒøbý~5²Ñä#™ƒ"䇣ÿ/y[ëû÷C¸3êd?‘g=™Y$ˆèãÚÿÜWUƒ”'+jøm3ݪnÁ©-jn—lb¼*ª½¹iÊbJæm¦4,&è¥kf¼¡4Ü;襃g4 4,n†$#øÂõ Ko´^oÒ·Ý➣LZÍóã*g–(W!¦¢·?w\RBü°EäÁzÆœ\"FŽn_ÓäAô§îP†2”ù$$‚D¾:èsÐç Ï±Å±Å±ÅÇŽ;~ì¸ÚaµÃj‡‰˜ˆ‰ŸñŸ…)õ¿À¼eÞ2oÑÑÙËßËßË?L>L>Lþ» ï.¼kعa熲((äy@üêÔ‹‘¢««{Vî¬ÜY¹§öOíŸÚÛγg;OÖ¿± ß™ø¢…(¾¨5HkÖ vsÛÍm7×ËÝËÝËÝ|ùsY¨k¬Â*¬â· £Nà/ «M™?bË"©Þš°"uÌúª¡ ã‡yPºz¤·¹z"]`@ÈœÀ˜A‚ôþæÔw·ØˆéèBfœa&’wİ~C»Õ¦kµ/Ú:zh›ÝÒ CÆëS~tÆJŸÉަôÙ–Àþ”†aÆ«ç%{ÅC$“ÆôIm6\ÅB1VîPý~D[ÙÙŒ Lü·•÷Ïþ%çÉ«ù-ш„l#Ê"¶£Âj0͈ٿ$ZÉF01ºëïS0VÜ£ºé– ™v‹yÓæÐÞá“$  \KiTaðJ#¼‚¶RÑ+(ŸÒ磃{SúÔ?ðfyÝvStß*±y—Æ IçÚÎ9î–f7-ý"h’f-û¯$—ÌÀ{r•øàYL,p<ÇŒ€ïjú_Ó£–ÏFÂH QˆBýTýTýÔ åÊ/”GwîÝuÜÀqÇ ”5_È,d¢/ú¢¯0™~5„,"‹È"¾Â¼ƒyó×Ï_?ý|ÄÀˆíûÚ÷µïË«›Ìxf<3þWÄŽØ;¾¬c¦c¦cvoì½±÷Æ>Xú`郥ºCu‡ê•5½†k¸ö×—˜¬ÌGƒ¨ˆUÄ*âV†­ [zŸ÷>ï}Þ1Ô1Ô1”wÃ&lÂ&øÀ>?Ñ€À_ æ $|PH4V2È×W\½Èz„{]§Å;‡O§tåÑ…;=z÷l$ó[#¸Âú‚ôþAð?fõÔhRDV°ã˜…¤[ý†Úƒ”»/Y0ư­Íû1§Ž9Li„ÇÌhJŸ™äQ6,h3¥¡»‚ÓgžÓ×išsífC Vj/VûFA'Ñd$^‘9Ä—0ýÑRö´ ‚;ØŽQäi‡Çä 釧d11ÁQ †T~|úÆñz]ºiyμjuîI‡Ï%{_ {Q¾åŽöd ¥OÕ{S©;ó0¥‘½g\¡4ü~PJ_ œÕ¨®ë#íÀ »Žõ%¾øxÅ“™“õ=Þ¼£i…¡žfv6“ĨüœØDoÙóŒ;ó€±%° Ð_öÁ÷i§žBÃj°¬_ö ò ò Š*‹*‹*»y/ò^¤£¯£¯£/Üáwr‹Ü"·dqf•è×b cãî|}•ÝŸ²?eJœOœOœO¯„^ ½ -h‘Íd3Ù mhCûWÜÒÞ¤7éÍ—M4L4L4¢.D]ˆºp£Ùf7šÉµ•k+×VÖ´z¡×_db<Æc¼Ìkß[ì-öv½àzÁõ‚wï6Þmšé5Ók¦'¿I~“ü&YûX€?Ñ€À_Æ•´F_6ï¥=T# ýƬõƒ^P»¥þ#îÐê~£åNÛiÝiS|}ónK Òø‡R_éì‚6pdüH 1"K‰î·™• úiŸWKWÛÓÞ9úu×Ã~#;S®=ÉÒ0½ 1”>å6Rá8sÜ;ÑñW£»,±=·Í4“ëúW4=¿9bs™Ý*òw·bŠžŠÊL Ë~æüÔš~°ÝÝpBPK¿.nyGªæ{úD'…œÔs‚Òˆ…Á®”F6˜1ŸÒð#A($3Í) イ”>;äP<úæá)ïlÚtd ÑÜŒa¬{`—-›XÝÓZñªQ?+“æ=cEÚ1ÈcÒexŠ¥‡Ü+'¥` ¦` o¯•¯¯¯Ø¬°Ya³Ḃ˜16¥oJß”ŽP„"”Ì!sÈYò(@(ü«!£È(2 :ÐÎì³wÎÞ=/z^ô¼•ýWö_Ù;±;ùÐhŽæhþ+zîEz‘^|ÙIËIËIëÅž{^ì99ùää““EgDgD²˜ñ芮èú—ïßÏGƒÉF6²ÜÜܼ]¼]¼]ܓܓܓ===díy[û¿æ¦ ² |ƒ$¢ŠD~À©ŸWíç`Ú6¥ËÊGFRºÜlT“û–c|û’©d*™&[8ï{˜ Ò!1D0‚.ÔpËàÇîa"ÈúMÔv+¯•ÏmÔ}©³ßó”=CiÃ'ƒC( Ïœ¡Eé3ý@BiDf°bnä•/N.çïܦƒ´Õå—þø€¢á`»<ã,¥Q9ÁÇ)\=£9¥Q~3«(LJöß:EçmÅá³ÃÏrÑíJ¿ubìn7ŒÖ™¦ºDž‘³ýÄæN6žI%—˜¦™ˆj„b|Ñ–h+èC®Þ¿+õ£¼&£¿FݱoißÒ¾åãi§=ž¾.|]øºngºéö5UÐKò’¼ü*D!Êû¯“6éIz’žüNƒŽK:.é¸ä¥ÒK¥—Jçžxþ¡ø¼ø¼ø¼¬ý¯´‹×WÜÛ¸¶qmãúÊô•é+ÓÝkv¯Ù½†iÉ´d¾®tyÀQ)¹Â®ü–h¾Â´Ì´Ì´ÌËÞËÞ˾ݑvGÚÑØ¢±Ec‹¬ý<ÁYYˆ#ð§òë«­¢ñ €;ز)5>u©…Á•-jLP¦c¬º‹$É\#-c…=rŠì'âGˆ„£Û) ùâ1 Ô |FJ1KpF*åÑÓ$…ÌC s“4%+K'Vô«1>ˆëˆÅA‹ë‹cù%z+9¤ú—tr´ì¨Þô½Ñ@z_Btܵº+}^ì>òMã)#îŒlÙ{õ>ˆ5¥Ÿ>^ÿì›OÅÖr·å*[~0}¥xª¿œÑÓœDÍã:qjmî—?Æ”ôðór%@Ý2®iÊ„Œ¬Rë¨ï|9Û$y{¾ú³7qM³ë•ßXüê¾òêÿ]Õ¶Dú`–`)—A'P-i7® uD:¾ íþëTóß/üõÊCò´ˆÑ"Æ›ñf¼’’’ϧO;Ÿ6¶|lùØòÁÝwÜ-Â/Â/¯h`ÑÀ¢ä yBžÐö´=m/Lš_!íLd"RH!ÿÿ1þc©g©g©§ö2íeÚËlÙ²9ÇÄ1q ùL>“Ï”PBõÈÔy¥óJçcÁX0ù«óWç¯æt9]NWö¢U†2”ýE¥´k±–zQ/ê¥?A‚þ³>f}Ìúp‹¹ÅÜâä^ɽ’{ËËËó¹fi_Ú—öâ üøÕŠ;Ýp¼ÁpV¨Ö>©«.µ®.­™…ät0ýHïi'(¨ˆ/’md$,qå‡ã ¾…W¤  üvQjAWA^jLõ¨&êðsÈrþC§bÞiÛ{æñg/–?©}ïÛÊËáƒáÙ€Õì]'t=ÖÒÏ,\¼$W—ËmqÈnsjðâÖ­\Õ®¡¨‰e)älÓÌàߘg¬:P«$Ý_ÞªR¹æn|ৃ¥¦÷z¿Ôûtð‘Ë«#i "¿t,mûI%{[ñ~€Ìø8&À–ô'ú¸‡kx†d\ÇsdÒ@º‘Ò‘ÜrzÎØ'™¥¹¾2ôOSÙëÃG#¹„K¸DKh -á•§S–§,OY¶voíÞÚÝÞÐÞÐÞp¤ÒH¥‘J›R6¥lJ!ÉF²#0#p'qu¨C0uþÃĺMoÓÛ¼«LEMEMEÍçÇŸ~líeíeíe÷ÚîµÝë¸Þq½ãz“T’JR)CÊðŠþ/?ŠFFF‰'ñ$¾èDщ¢؃=؃žè‰žHB’þâ¨?y7!/xÁKý úAõƒV%V%V%l[ÇÖ¥ßM¿›~7k`ÖÀ¬|Äz:N§Óñ_ðEWß'Óá wæ3iH¾âÈÀ¾×ÛeQºvÊØ7µ‹RöiÁð¡=Ն˟çɾµ]*­·€€€ÀÏ‚ýaIÚ60eC™\òæGílÛ=j*±ð:·yn¼§Ilæ;Í;ŸÃgÖt¨.—”se¢gEÕóªÇÇ.M{ø:o¥”Òè”RšZD)¥gªV¿R[7 O4ègeèËä2ÍIF‘ì"{1ÿ‡Ð„¿inÑ4bˆ!† \àBX™ª·füšñkÆÇ\¹s}·înÝݺr·änÉÝ"¦Ä”˜Êl¥¿U¨B•ucÝX7¾¢çžwzÞIÔLÔLÔÜÝjw«Ý­äÊ?” $à1ãñè“îÙ…t!]øX4K7-Ý´tÓÛmo·½ÝÖ·cߎ};Êæ’R:ÐùÓ$P_eï†nèS˜Â”½È^d/º4qiâÒÄû®÷]ï»Íû4ïÓ¼ø¾ø¾ø¾¬ý œÀ‰ož?~½Ý¢RHqù"µ–-­½'ÍA7‰Ú“æÈ ¯Dó9愾·Z™²¯ì[[Ñ^‚¸~5üw$_ýJi2 0‘ʾÃc¤‚Wˇ²ÇÙäiŠEÒëd›ø®ï޽;öNýõ…ØQ‰ãß]yw"®ßíNoKgµ<-9¥5ûòGX¹­.ñbK’LŽ’)èÓp¥ò8€çœ÷ŠÞáªè$J1+qAv&¿UnQÞÝå5^ã5>á>ñÛ(÷®Þ»zïê<…<…<…fƒš j6ȷзз¦ÓtšÎè2ºŒ®,å Ný{ÊP†2z‚ž '`CföÏìŸÙ?Û&Û&Û¦QûFíµ7«2«2«â×@˜-ÌfËè“÷í¶‚¬|äk<Òx¤ñˆ]Ë®e×o.Þ\¼™oH’ƒä *Q‰Ê?MüÙ¶ø¿öî;>ŠjýøçÌlOï$!’B€PB“¡Jï"Mz) BD¥÷@@0T)†H€T„aÉgñAÔIDAT@zÛ:ç÷Ç,¿^îï^¯Êóޯװ™™Ýœ³»yöÌsžƒÆhŒ¾è‹¾8Žã8^=¸zpõ`×®7\o”•”•”•$×L®™\ÓaŠ0E` ¦` "‰È‘êFÈßÅëBvI¾cbßfáµçs¾¨Á[Œçy¾é`iø~êø>¾a1ÖmBk#5!䫸në°p»°×ÔïD9«§iöÏߢÙ/Ì® ÖkP'P…õO"FýÑýÙ.¶‹í’ïY<²xdñ•1WÆ\Ó1¦cLG¯N^¼:ÉùÓ,–Ų؊)7äym˰ÌZêÑ~¶ýlûÙ뷬߲~Kb\b\b\;C;C;ƒuz±¸X\üÿ9gB"Wˆ—Ëzn,ßX¾±<ñDâ‰Äõ‚êÕ ²¾Ë ‹„Eÿ³/WòãÊõì¯ã:¬kû†ø†ø†´ÝvtÛÑ-g´œÑr†«ÆUãú¬Øh’d=–ª‘q¯`þ”·ÅÖüÔja½aa¦ªó¦½Ù¯^9´|ô…×vÕÞf}ïd³YMj7BÈKaóËÂãÌ d­Ð_èÏ® …¶Ì$ôú±qBMö#ÀZ?;ˆu”ÿ=ûo…-ןÿ×Pì†h)èÐò5J دö's`ÌÈ@†®£®£®ã†È ‘"¯Å^‹½;ë³îZ÷ìÌ:³ÎÖDØÀ†Zï¹áGaº0]˜.ßñ~—÷»¼ß%µ^j½Ôzœ'8Op¶¶j]V—Õýÿ¬Y»›±YÞÔÎÓÎÓÎÛ•¼+yWòùŒóç3‚÷ï–‹Q@è,tþÜ+~‹G<âåM—~.ý\úµ\ÞryËåmë¶­Û¶®Ïk>¯ù¼fÝ3ùȇ?üáO/ò%ªÙa6XÞî¼·F¬ßÜòy×?2ÛÍ{òæ—œGvκˆŒ·î_•a}¨Ý!ÿ¿ÙjjG°>­ÿdÓÿ-«[¸²p… Jëêп>?ùoUœ®Ú•ueÖËæËš/k¾ì§ðŸÂ ?=õôÔÓSÙ6²md]q–•²RVúsŸÑtÕCH’„$ùzÅèî~µçÕžW{.Ï^ž½<[õDõDõ¬ŒÄaÆá羉BY( •ËzVšZij¥©ßÿnüwã®8ºâ芪㫎¯jý‹ÏŠX+ú“ßῌî¯Çz¬·¾e§ÚNµÚt_Ó}M÷Eܸq?0)0)0ɺ§¼ê_a-!ÿù;ú÷Æûa+~€ ,¦úÙ†–QRSß~yr¤\å½oÄ ­„VB«ssÎÍ97çð¶ÃÛosÚî´Ýiûˆ#ZŒhápÌá˜Ã1a„‘µd-YKª«ý\<–ÇòXŒÆhŒ¾ùàæƒ›JZ•´*im›g›g›'¯PËF°lÄsÏ6³1[.ëiwÎîœÝ9uwuwu÷’Ì’Ì’L½›ÞMÿl*êAÄÁ?éw¬˜‰¾k°FÎSWwUwUw îÜ3¸§®‹®‹®KÎÔœ©9So]ºuéÖ%LÆdL¶¦Çȳ,(>!›·õïÂ{ñ ü0Ìàà¹Æ²Cúbƒ`®kQ0=ûïC-ôai•*kWªjC رoX;Ô¡I„ÿ¡_>}Lxž`ž€ÃRá'€ ÿ6pÀ 8°®÷ÝXW呹”G´½–új{ }¼ }PjÞ‹RÜÁAÜzÂåàýþ.r•wyôîàŽä!yH[zoé½¥÷Ýð»áwÃëw¯ß½~÷×=_÷|Ý“;q'îÄ^g¯³×QµQ›ÆÝÿ $žÍ³y¶\ÉçêW¼úcQtQtQ´[¹[¹[yÕ²ªeUŸM!m€h𼓱Ùl6›-oÛ%Ø%Ø%¨ÕêÀC‰¡Ä ïªïªïj½~rpà¥ÿvCöÎèŒÎ8„C8$x Þ‚wàòÀåËlll 'N(œZ)µRj%i°4X tÐa/öb/MB%/¿7p/ÃH,@+¸B“Õ¹`Eñè² FÉä(lfQ,ÀøÛÏTmÛ£¥(†ˆ\Ü…-Ô..BÈ_Qoˆ¸°¯àb˜~L4L/í¬(•Z´”Zë¶­;®Û¦ÆïU ÂD!LD1bP odà±ß?@„Qº+Ý•î ­…ÖBëÛ‰·o'nÿtû§Û?5Ï3Ï3Ï‹\¹ rAÕ¡U‡V*½/½/½ÏÌÌÌÌÖqw7ý-¹Ô£FK=J=J=n×¼]óvMñ©øT|ÚÐÔÐÔÐoxÃÛZ¦óyv`¬WÑv8ípÚ¡KÓ¥éÒòÇåËWª.U—ªåë'|5_ÍW¿ôßKµ=à´Fk´Æ>ìÃ>ÿîþÝý»{lðØà±¡,©,©,)¹erËä–†•†•†•ˆE,b±‹°ˆBvòwô{Ç'"ñ-bXgìÁ‚ò>Æs¦Ý¥ûLçÌ•0޵`Z€âkíªªÇªr1žE±s–é5~0=¨Ñ !i j0Üæ…¸ _ö|¥e¦li™a› Ê™^>Xœ:Pœ©ÉßzV“ÏÂ4 Cv¡ : ‡Žšðw’Wîd``’JRI*¹däîÜݹ»s¯º>êú(ï+ÞW¼¯Œ>bøˆáÖ…~>ÆÇøØ:¹ÆÝK^õ³(àż˜Ç;Ç;Ç;+k)k)k…®]º^žŒGx„GÏkCÍ¢Y´¼mß̾™}3Mš&M“V¼±xcñFS¨)Ô*/ù$¯9ú#ù ÌȌ̈阎é>N>N>N>!>!>!ò׿tÏtÏtÏâÅŠX¿À´C;´£¼zäRSgð{0ÑüÌä‘“ºNàÆ…yC˸)ºÉÐ[ êñ»z¦Ø_× Õö·4)ØOGù`Ðý~åø•ãWfÍ<šytlÛ±mǶ•ÓlŠ@EàK©ƒ^1dÿ Ÿá3yÓ¶ªmUÛªMÕMÕMÕc#ÆFŒ ½z%ôŠÐNh'´ÃGø!´$ùǼ—çqòÅ%ñ—o®ÃJ6è=´A=žÀ§òk¶CÔ›•ŽNg´’úô0ÁŒ}x³BÕdBùëûåRº€÷¸/îAÄnˆ¨Š‡¨ %*C ¸uœžC g08 Û|$aûV÷#ûq–ˆC™Øe¨ÂTOˆ?ý4Jü 9g}"&b"¿Ê¯ò«æs‰¹dcÌÆ˜1éÝÓ»§w¯Y;²v䀸qâ$½¤—ô¸‚+¸"çsÓ"M¿zÛq;n{ØÃ>{~öüìùé³Òg¥ÏòèèÑÑ£c@h@h@(r‘‹\¶ƒí`;¬iK²ÁŒÁ–U–U–UÈD&2:.t\¨¯¯Ÿ¿4iþRy5\þ.—¿û«cÿ¸Ši-ïâ]¼+¿*õõõ‚Þ z7è]ÝÝÝ}¾@Ÿ–˜–˜–(ÅJ±R,.ã2.ãŽá]‡!ÿ /l¬çQiI?}sµQE:ÉïóÖÚ~Êb=»›ª9 kÅw¶¨ENùã0ƒÃ‚{° ^È„ Y0Y*ÀÕa혵ÉÚ1Šýsû­Eh @…ºP£”‹ŸÉe"UPAųxÏb ¦`ŠƒÙ³fÇõŽë×»’]%»Jv£ÂG… g3ÙL6~ðƒR‚ªòn•€$°oØ7ì´E[´½ãyÇóŽgþ‚üù ‚7oÞà<ßy¾ó|îÃ}¸sfÎìÙºªíY{Ö^¾‚¡î¡î¡îaãiãiãiœcœcœSR§¤NIë£THbyäPÛ ^ðÂûxïc<Æc|µ«Õ®V»êiçiçigœdœdœ”´(iQÒ¢Ò/J¿(ý303¬¯gïÊy€¿/v™Ø*o÷Q;«ºÈG?¶Go7×)jçjFx÷×Ô¾`Í5T¼.tf'i,‰òöË'œ D€5ûùž}HÀ>Íܨ՚¹¶M~aÛD1óm„°Îé¡°U‹*ðe ZÇñù„­ÂVÁúw'l@Ø€°'Ÿl|²ñ…¥–^XÚqBÇ 'X÷”§«:ÂŽ4î.·[ıEòŠE€âà™ƒgž9v>ì|X¨&Tª‘'° }…¾B_ëKz4ÍFËãßÎ:ÜtoÓ½M÷N95æÔ˜°‘a#ìcóòLƒöœ]á W\ÅU\•ïðÜé¹Ósg륭—¶^Ú¦W›^mzy{{[÷¿‹»¸ ;ØÁŽcÈ?÷­üGTxSdŸ.Š+ wÖ¡–¹šÁ…›0Ó6S™.œ·î´íQ‹Æ’!ÿ`rº‹ èagp@%¡*¡ÂÐC¿`Óý‚ò摵˛óDãBž(Þpj%ÞÀ]¸à.ªàªà×_œ ‚AõŠ"r™Èh)ZŠ–«Í$lOØž°ý€p@8 (•ÎJçÁ6ƒmÛ8Îpœá8Cª&U“ª±bVÌŠ)Œ³.Æ´‰oâ›äÑ÷ŒS§2NåÏÊŸ•?ËÁÁÁÁÁÁËÝËÝË].i]ýÔ¶°EWtEWyü[³_³_³ß¶È¶È¶ÈðÐðÐðÐZlQ|_Äý¡çYqb«œ›^uQ×±©cSǦMš4·‰ÛÄm÷¯Ü¿rÿʃ¥–>Xj½2…(D¡Å(¦"Bþ¶ ·°EÞö_å<ß.Ÿ‡/Ü2Ì¡tÛ{aƒîp¾4vÔæ©™MûÔœ t°QD !l*Á¶Ôz„W„\R€€fÂD4ûûÉõãŸÑþ¼e =lQ_˜‚úpÄ98B§Ÿ‹N¾šSZó‘|ÌÃ<Ìsupupuصc׎];â#â#â#¦äLÉ™’cmÔ‰l"›h=êß/0ôʰÖÞ,Þ²xËâ-×v_Û}m÷—).S\0µÂ-¡µÖ™xxxžlu²ÕÉVûtûtûtN&'“Ó³9…(Dáï}Z¾\ÆhŒ¶¾öi÷i÷5~§ñ;ßiw´ÝÑvGk•Õ*«Uf},8ÀÁº!¯€?6➈Ügåõ̲D:T8ܸÁÜJqœÅ~€%CZà“⤱/ƒe(µ´•ñïÑ uDMOyEHx6¥•C޳Òg8‹Úl jCžB Àadz*ïå?_ JpEZŽ+(@SÀ,܆þÌþx6Ư~Ex¹VŒœàÄü™?óZø´ðiáúðõáëÃÍMÌMÌMºLí2µËÔ°]a»ÂvñÏøgü3a‚0A˜ W>y¥Gßåñì;¸ƒ;x ¯áµ„N :™Ì æ„Úŵ‹k³Ãì0;ŒeX†erš_…Ñ_i¿Ò~å°Üa¹ÃòòúåõËë999ãu¼Ž×1 Ã0ì¿~V'¡.Çr,—¯(¶*¶*¶†L ™2ÅNi§´S\,¸Xp1µrjåÔÊÖ}FaNâ$NRByü±—x2 ž’ ¿R´ÎèiÛ£a¤ËR{Ѷ‘ºDp¶åòi˜X´‚?*SÓB^9e?' &òH„(…C„Î JZ wÐJþ¯êx—kªã¶kVŒµ]#tðúNèHN2x2Ð\XŠæ?ýr}ørð"׊‘ÄHŒdŸ²OÙ§GöÙwdßé}§÷Þç~Èýû¡¡[†nºEÍÔLÍxwÞwg®Ì•¹¾Ò¯ÀŠÓ4/à.\nv¹Ùåf¦Ã¦Ã¦Ã•;UîT¹Så•wTÞa ñ·b+¶Ê_“䃴´´4ç5ç5çËg”Ï(Ÿa)¶[Š­KeíÁìùï Žh€Ö{²‘ì€à€à€`çýÎû÷—¶-m[Ú6ùLò™ä3ÆB>ÔéG§~”úJ}¥¾ùú|}¾5P5ä)­¿óùè ƒoá-¼…)˜‚)¾|øð>ì}Øû°é†é†éFª_ª_ª_É%?”ü`„:1ñç÷ •z$¯ˆ?¸ó‚à3äµ!¯ y͵ƒk×¼9oΛ#ÉH¶ŽÜ¿’i3üCþ!ÿPN•)~¯ø½â÷®ï½¾÷ú^»L»L»Ìê«w®ÞYgN̉9YÓQ§N9œâ+ø ¾¢P, E$! IÖE¯þsrZ‹ \à´LË´ò£TšZij¥©þ›ü7ùoâ:®ãº § § §\Ÿ\Ÿ\ÁATAkâ!¯˜?6â~·-̰èÍuÍuÇ•D–¿³Ø[øICx†}?uUe’²­¸^¸h½@7ØSÓBÈ¿!0 Ø@€ ê‹#Pß<7ó¬ynù£™åŒÞÖ0z+,ÃÊeVó7•YÐph `Úߌ%Ë벊ÿ° U¾UPA…õXõlÛÄ6mí·µßÖ~IO’ž$=©\5¸jð°ÁÃ̾cß±ï„ËÂeá2"ˆWt¤v Ö`0I˜$L’êKõ¥ú·Jn•Ü*QµWµWµ¯â_Å¿Š¿pO¸'Ü“ì%{ÉÞš6#@€àXîXîX.Í‘æHs â â â~~½þ§ùåòžrZËB,ÄBžËsy®}ª}ª}juKuKu‹ÂFa£°Éú6ëÛ¬o³:euÊê„k¸†kòþT#ˆ¼ÊþXàþÒp}€9hÅ;K¤ÝÙ#‹>*m …0YÈ5;òæü¸s æŽr„Z)ú ¡Ö£êÃŽÔô„òoÈé.€R(E¼e âÑ£!V Z¬4¦ÇåÓË?ê[þ‘郳×L@ÐÃÀ/Ãy«Ì™°EMÑ5ጰ.¬ó)1i‚ &®åZ®e'Ø v¢è\ѹ¢s뎮;ºîh™±ÌXf|}ÙëË^_Ö0¬aXÃ0)JŠ’¢„ !HzE§3ÞÆmÜfûØ>¶OÎ,ÏB²PPPPPPP¹Få•kø&ú&ú&òDžÈY"Kd‰ò¡_9|åðŸÍgóÙAAÿM©‰Š™èoãm¼±‹±ê«ê«ê«Ákƒ×¯ÕlÒlÒlÊqÎqÎq¾uñÖÅ[11ï༃s8‡s”CÈïU¾ð£ÙN;ØÀfÎöVÙuÌœ/¹6ò~¹÷{×£ºBçßò†¯£Ãuë4V¶ 7°ŽBþ+r€)×  ‡ ^¬#¼ôúÍ>ý¦ü¡Ø @sBˆõŽREš¥XŠ¥Â a…°Bñ±âcÅÇÑ£G?N|=±sb篲¾zøÕCm’6U›Ê’YKCîàÜþ@~ößci,¥ÉwøøøÈ3K/nº¸éâ¦=[ôlÑÑ…r¡\°V9Švvv½ª½ª½ªí^Þ½¼»õ~Öƒõ`=þ£GïÞèžè‰žì}ö>{¿ö'µ?©ýI»‚ví Îo8¿á|Z£Ö‹Ï¶[„-®¥®¥®¥r%™§Gžyzä?êY(Bj-øƒÄø5ðkà×À]pÜ…²è²è²èäFÉ’é zƒÞ _ÀJ¬ÄJkºµ“WÞ ¸DÈ— Yòv©§9CÚgË^WÈa'ØDò$dWzÍaŽíjnBy8,?‡/yØŽ<”âÒ³â¼ëÒØ¢llX.ã,WsmèÍ5m£¯Çh)bV)bðˆ{ã²ùdC'$A‡gUáÝþâ¡{Åõ5gb&f²l[!l6 …öB{¡½òmåÛÊ·3g~—ùÝÆ;ó6æ±{ìcöñÎo¬c½ÿ&ÿJþ•ø7|5_r,Ã2±¯ØRlÉv°­l+j£6j[ÏÿOM§‘3ÝåŒÿª¨Šªã3ÆgŒ/ßU¾«|Wh¿Ð~¡ý”’RRJüSþ)ÿTŒcħûN÷îóXËcóRòRòR¬g{ÞX¸j«¡†_á+|_øÂ×ÛÖÛÖÛ¶J¿*ýªô³<µ<µ›}6[÷OG:Ò­"iA%B~ãT±å³øiÜÀ8Å—yæ#úLsŒå±²%kÃÀpî‹l{kO¡+=[R„BÈK$A„à€G(Â#´´Ø£¥ß@±þ¶ŸÄúÊØY—•±vK7åÛ--sYæSæbÎÕšs,ìA0R¤ÞHyϤb7¸Á qÙö€=`1,†Å°­l+ÛÊÛñv¼$J¢$âK|‰/+žÆš%ÑÐÁº=c1Vþ©×W^_y}åèèèrÈåË!777ϯ ¯ QNÚ·wÎqα´P6R6²ïä:Àu€Ý6LÅÔ:‡7 oÒ^Œ°‹°K3g<¾ÓòŽîŽÎú(å(G9fafá4Nã´ T‚ mÐm¤eÒ2iÆ` ÆXkÃW\"ê¯Ì ,¼:¯Î«Ë½“ªKÕ¥êÊÃÊÃÊÃÜ›¹7soæ¥óÒyéò7åoÊßäéé©R¨*EѺ¢uE댟?1~‚+¸‚+¸…[¸e=³|=D#ßÝØvh‡vví6Úm ŽŽŽVRRzü øApÖŽ¬Y;¬ÕååŒö2”Y×$ „üÊ‹Üûa~Â(X­?o_ÒÉh6qÔ£E#€ HñzÓ>WG‹.BÈŸGN,`8C€ C Bû A–+¥jËKÛ÷`ikžR{¡y räØ@âÓ!áY¦; Â"ð…:<†µÀ$ÀÞ6à Ì0£3:£3 gá,Ü ?dÙCTFeT¶4²4²4âøåfµ[°EÞ[‹­ÅÖª•ª•ª•:/—Î«Š±Š±Š±Ú§Õ>­ö©ä#ùH^]¼ºxu‘S³ç:ÏužëâââàêàêàjßÒ¾¥}KÉžñ bMî‰Ü¦;v‘v‘z'S/S/´“ʤ²Ü–Ër½ÍžÎžÎ,_¶0,ë‹Ç.]2×Ý9{çlêØÔ±©cÏß9çü´Ei‹Òé[ê[ê[þjNøÀGtÝD7ÉIr’œx1/æÅ(@ ¬ÕÍÿÊiS0SäÊ<Â…? Ïþ:ûëì¯Cf†Ì ™Y·¨nQÝ¢›š›š›‹ƒÅÁ¢è®è®èž¿5kþVS S S ëyR‘ŠTkÂŒüûvDGt”Cvå0å0å°àÍÁ›ƒ7kjjÊuÙÓN¦L;É—óå|9ŠP„"k¥vBÈs¼ˆuãc5ß5°}šUV¢W©ÿÖ8Úm·fŒî€±˜áùµÝ.mô¥'„? Á ì„ |=„ëÂq1ÇÍHlYa€X ×µÞ”`A!,°à:,0Ðÿ‹GjަhŠÇx‚'ØŽíØÎåÛoæ !BˆâÞѽ£{G§ANƒœ9Ts¨æPͽĽĽÄÏÆÏÆÏÆ{‹÷ï-¾÷|ïùÞsÞë¼×y¯V«ÕjµÊ!Ê!Ê!ªƒªƒªƒêBu¡ºecÙØ¢ø¢ø¢ø'•ŸT~RùnöÝì»Ù93sfæÌÌíŸ7:oôí{i ÒtùrRФ Î[¼özí-Z{xÐÐà`pH)I J ªY»n§º‚|}}›}Ñì‹f_ <1ðÄÀw•w•w•q>q>q>‰$ȺŸu?ëþ.wºÜébÌŸà žÍæJD"Ù%v‰]ÂE\ÄEnÃm¸ –a–ýê*ÄÿVò'§'Ië¤uÒº·nܺq«–w-ïZÞµ–ïÆq,A,…‡Ê:”¶4Šæ0 o± ây‚“QýTYÀS­£ò÷rš!N!Ž2pë2L©¨…TØZjÀ^¬^¸‹Æ¸ ¿ *øB#’aÄ Ñ “á%~L6¾…iÿâügpçäMuGuu‡ê£«©>ÆçkŸ¯}¾öòöòöòv9írÚå´Ç '¼B½B½Bݲܲܲ\Ç»Žw¯ ÐhLsLsLsLî&w“»±™±™±™åcËÇ–K——./]ž}"ûDö‰GxtàvüíøÛñ÷ªß«~¯úÓ[Oo=½•¿={þö¼&yMòšäíÈÛ‘·ò píøív·ÛÅx…. ]ZÖΜ`NP«aаì÷²}³}oÛ\íyµg`lðÜà¹Aû[¶n¹¥å––[üŽúõ;hhhW·[Ýnu»™;˜;˜;d^ϼžy=%9%9%ùzâõÄë‰qåqåqåC2†d ‘§·VüÇTLÅTÂNa§°“ä#ùH©žTOª'gðÿÏÖ d Cx,<K\â¿y)òRä èAу¢+'WN®œŒp„#Ü®«]W»®ŠSŠSŠSÅAÅAÅA¦‰¦‰¦‰8ƒ38cÍMD ñÞÀhЦhZ­Iµ&ÕšTò¨äQÉCoÒ›ô¦¤ÍI›“6—5(kPÖÀ:N‚„PÈNÈâEÔ ø‰ÖHÁ \cC„ô³KÞÚØé\Ó=UTš.í—Þ¹ÐãÁöÜ K¿L9ð [‚ñ1¯t§ „ÿ¹Š%  š³½hŒÇü:òD;ŸbáÇ^ J]f¬×wθ¤Õ.å'4Ì¥s’Qy]8)¨ÒNÛ|l³²{éžÒ=.¡g=ÎÚž³©bSÅÖhk´5Ú²d;H»[»[»ÛÒÃÒÃÒ£pEáŠÂáááyòå5Êÿ<ÿóüÏsûäöÉíó ïƒ¾úÞ7Ý7Ý7¥ìLÙ™²óÉÉ''Ÿœ4ƒÁƉƉƉ–S–S–SÏý­r‘‹\qŽ8BÁ{ðn¼›ÔA" ùÏ›EóPóPó°’W%¯J^94rca,Œù%ø%ø%T›RmJµ)Î:,>X|°øà“½Oö>Ùû¨Ú£jª] ¼x5ð‚ß¿ ~·kÝ®u»VŽ#äüjª%뺰.ì8;ÎŽs×q_—ð%8€8€C8„CNƼPG¨#Ô‘R¤)Åÿ¤ÿIÿ“kš¬i²¦‰tYº,]usÔÍQ7CòCòCò?8ûÁÙÎÆøÆøÆøÎÿhþGó?‚J(± °ð€FaFy®ò\å¹*¸_p¿à~òߤ÷’ÞKz/{nöÜì¹xˆ‡xˆ €2Ú ùs9B ¢ªàÄÞ—ïø¾uÔ•v8ÿðë·¶p¾°ëÐÉÉqßìådý¨ŠÀ—Gè ¡Æ#„¿´¹¬VÉ›¶í;]LåÜ2ø†7çœ'ÌâœóDGÎ9¿Zr»íí¶Wo^y|üÀ«nWÝNhOhOh7ïÚ¼kó®ßûø½ß›TcRI5úÏë?¯ÿ¼ö÷Úßk¯ÎÊ:+ë¬tÎwÎwÎÿoŸscnÌM8-œN YB–% ÁB0›Æ¦±iøŸà8À®òþBea“°I,W¬P¬—(Æ+Æ‹7++„Ûâbq1›ÉÞbo‰¶¢£èÈÞeï²wŸ÷¸n5ÝjºÕì˜×1¯cÞè;£ïŒ¾³Ú~µýjûm~´ùÑæê㫯>Žˆˆˆçñ<žÇLŽ™3yÆ’Kf,éß-¾[|HëÖ!­Ÿû‹yÃÞ¢(Š¢(¸ n‚>ÀøÀúÓŠ¥0_Ö—õeÖdV'''‡µí×¶_ÛþÚäk“¯MîаCà {‡ôé’”“”“”3mÁ´ÓXþ_à‹Š 09Þp¼áx£EÍ5[ÔŒhÑ6¢­ÿ2ÿeþˬûïÂ.ì‚-laKo/Bþ[/"ǽåÐÃ5Œ<¤Á¾àˆ1Ç` z¡˜·àuµë”§Å‘¶4ª*%õ£6ø31 MñÖR7BÈ_ƒ 7¸‰Ða ´ÆF·MÆ*e] æ_Ãc‡öKS€¥ÌR®½,ÚŠÚÃ!ßÍúnÖù¤Ã-·ÈŒÊ²dYJ>*~·øÝ’Ó%§KN—d•d•d“ŒIÆ$¼_á&›€ ˜Àn±[ìÀ°|3ßÌ7[k’,Æb,æGø~iHC’„$ÇãxïÆ»ñn(D! ­gKAÊ¿ª‡#eIQR´r1füê÷e`nán­#.×B¢ØZ¶–­•«ß<9ÿäü“óGœ8q–µùÞæ{›ï=Â=Â=·iܦq›†® ]ºVíVµ[Õn®\;¸vÞ|xóáÍ — — —²…,Ü ¿~+<íQÚ£´G'“N&LÊìŸÙ?³é‘Ò#¥G*æÍ³¯Ù×ìk¡ÐFh#Õ’jIµøI~’Ÿ”]`€†?26ÏkñZ¼ e¡,´À¡À¡À!Ó=Ó=Ó½U¿VýZõ«U%ªJò‘|e]e]eÝ‚õë ÖC 4B¸.„Kã¤qÒ8íXíXíØ`e°2X©®¯®¯®Ÿ½;{wök3ÖZŸíAÄA” %”4KÈÿæÃ‰ß1#[(ß±ªN­Í¯piQýá¤Ä÷§¾‘ýÎÌŒ7¾÷»êátU>†­B>ÎRãBÈ_Ú[Xø¬Jºæm›½ºè¤\Î9¿{„sÎÓöqÎyaUÎ9oҸ㤎“þýÉ_ÁWðKÅR±Tl.6› QB”Å겺¬®¼4u׿Îâöò3‘K=Êw4aMX±ŸØOì' ‡žw¨]k»Öv­[¥¶Jm•:=ezÊô”5±kb×Äž>púÀéI’$ˆ¯_/¾Þ™“gNž9¹Ç}û÷é1Óc¦Ç´ kÖ*̯½_{¿öÏ}n§p §Øì ö…õ:ÃflÆæß׆âYñ¬hý»y;òväí¤ýIû“öXôaчE;|ì𱃼LRÿ«ý¯ö¿jíÓÏ…Ï…Ï…“ÂIádØÁ°ƒaÛjwªÝ©Ÿ6ø´Á§Ê»Ê»Ê»ÖŒÁü—ë_BþV^Ĉ»ü]y=nâ¾|G~ŠÞÏ #7ã¿ÃÀIýH‘ ÎpùD×JSù¶€ãàl̺Ð×lBùK;†ÍØ%oëê×.N¼ß¿_¥b…ØMì&]’ÚIíÔ%B¬›^~móµÍl$30‹N §y¼´\Z.§¬ð/øü iº4]š./èc Ýä©¿õ×ùó ?“ ãÙü¿À/X~²üdù wqw™Žé˜ÎZ‰| b \C¦ødñÉâ“§‚N :…S8»$»$»$¿î~Ýýº‡†††††6¨× ^ƒz¡¾¡¾¡¾Þ ½z/ŒjÕ:ªõþCú韑‘‘t9érÒåtKº%Ýráý ï_xÿfäÍÈ›‘Ü»q·ß6•x\<.çÑ<šGKjI-©­e+VX¯H€Ïåsù\ØÃöé,¥³'Ÿ>ùôɧçÎœÖ ë„uz½^¯×RüIñ'ø?àìÄNì¬~¹úåê—ÝSÜSÜSJÒKÒKÒ“—'/O^nªbªbª‚åXŽåÖÒ“4ÊNÈ_Ä>gMåíÉ­ZüP·ç “‡µ71?äÍseó~|­ÓÝ ýÚY÷çì ‹¢v#„”ƪ¢„œ½í¸È…ÁGðƒÅ`1ø·»+>P| øÀýk÷¯Ý¿îø¨ã£Žæ=œ÷pÞÃM­6µÚÔêtêéÔÓ©·:Þêx«c®„] »Ž½yìÍcon|gã;ß™*N§ŠMÖ4YÓdÇ={÷XÖ†µ©x~æÏü™¿`'Ø vÌù1?ìÁìA$" -´ÐZw•Sƒ"Ý Ý Ý]É»’w%ŸrfÈ™!Ç=Ž{÷8óù™ÏÏ|ÞÌÐÌÐÌ T­[µnÕºµÓvNÛ9- [¶,tä2ÈeõœÙÈF¶õz­„JȦxagúçŸåæŽ)ï`hÈGó…<‹æëqZUM¼+´s<§áÊ·±l%:£`u!„üEU,Ò燨!öV+‚Q5PYÈAÂî–Ê–ã–ãPòŸøO°ƒ#!/Côª)©p[‚%X"I’$Ið‚¼XcÖ˜5f#Ø6‚ó`lnjnjnšƒäX‡Åå›nnnAÛun×¹¨ÔêÃê…Õ «WoL½1õÆÔÚVk[­m5GÕUsTd“È&‘Mîuº×é^§Ä}‰û÷]›zm굩·”·”·”×W__}}µu€»Å(FoôFok÷& IB&c2&Kž’§äɼ™7ó.«YV³¬æ‚;w *¬|°òAK´%ÚmH0$Š‹‹í ì ì üzøõðë!Ï ÈPf(3”¹›s7çnÆ ÜÀ kݘ¿Ëj²„üå½° 3–ÎìÌ«ób„´¯Ü¡êüC¥f·œÁóý| RPMR]šPó𘠙Ÿß8~²Eü Å9á#–gn*ÍäÎÔ „Bȯ®o$#É‚^Ð zÃbXŒeeeÁo²ígÛ϶_cŸÆ>}Bî…Ü ¹WÓ¹¦sMçêÕ#ªGxõê9TßWßW߷̳̳Ìói·§Ýžv»˜|1ùbr\Y\Y\YÖ;Yïd½“®Mצk¥ÇÒcé±|æÆÿÔø§åë–/Z¾È¼À¼Ð¼ðñ®Ç»ïZkY‹µ(ßR~´üháÕÂë…×ÝÝÝÌ­ÍmÌm¬‰1k±k)£ë…¥Êð&X‚uØwŽ<íSb®$u•Ž #ÅB7¸ŠqÂz—)šÑŠ.¸NM;5íÔ4¹<¥.]—®K¯{¿îýº÷«7®Þ¸zãúËë/­¿´F—à‚à‚*#«^ªzIj¥ñÑøp-VcµÂFlnh}´>¦“—É £`€eàà²ò÷Ñ5á'/Ã,ø³;ìÐéìQÉÝÛñìï ùŽ—D†õû1äþnµlÕšu€±7qñç¥"!„òÇU\ÞH^Öj4Fc´\yõgýY!Bˆ"~{¨n«Î¢³øú¬òY5 ËàÈÁ‘ñUïßýi®ÁÇàóS5ý)ý©«ƒŒžFÏÊïú/ö_,׆gƒØAvž¿öBëF;¬EÆþ+ƒÓ:¥p¾ðã¡38_1TymòDmï<÷yöµlC …ÆN‚ã 5!„ò'©° ¬\õEHR…T±½Ø^üÕ*­žÊª÷«ÞÔŽsÎ3:rÎyFÎ9˜Ã9çUf½ô†¼'‹fÙCjZB^þÛ÷E)„Fô†{0 Yê«á ³ãÇÍõ,+œ¾Ñ¼§²ØÎP]WDå”ã:Þe3XS„ÒÌB!äOR±ªz5TC5kš/|áËF³ElšÁž…sgæÎâÖod¿‘?LÀyÕU1«°*ç›gX Vò¾ï£¦%äï#žpe ôC D¨€Å:£ÉZε>ÕtcÞ¥7?ºnN¯¨ôPïJ_»Œ—³áÌ•B!„äã#L€vbÒÉ…OJãö€µ²Låƒø[To+¿Ô5Qƈs àsŒD-øb€§Ô„BÈÿ˜ h`„z¼‡oñ­è¥ø^ñ=Ò`€ÁºO ÔP[š;™;a!†cø¯Ž"„ü ØB •ȆÂ"ß1 EíéþQÜòÑþ‘.% æ¼=¨/繎thíPíKÏyqû‘õ Æ#„B!äß^Ø™J`€‘­Å[¬|GÎÃ’¥e" ù\G.°\ttœ©­¡na=jNã4P¾À±B!„Bþq„|¾]¸ý,éEßÙRCš 'ó&ËLчõch$Aš^9Îi²Ý{Æ‹ùp>ÎÐACA!„BÈó¼àÀ†Ü—·KÞ5U·d¿f˜e¾®Ø,|Ã\)†]ÛÚôÑÚC„àíð¶À¨©3!„Byž=âþ .òTy³ÄÃø–YÌmègúXá.d±7aâ“ø¥JírlªÁ38wÁ—øÐ@EA!„BÈó¼è÷­¸Ž»òvùsOKrÉ4צ=lÛÂ|¡”&ðÇ^«í¦kÇ`*’m(ƒî„B!„ü;/zÄ}1?‰«P@„Xò½a’IÌ÷)/6ø¢Xp>Å ~…8ÏÓ.U ¯ ]™"8l¡¦É©„B!„<ß‹qÿç3,°”.3®2Ý+| ßhŒ‚ÃæKjžÄk¹æi¢U‡Å2Ö”]†€U•!„B!äßyÑ#îsð~61OÄHK¹e{îúÒ7Ê»â![ÚÊ èâÐWí$®ÂY[h=J Å &„B!„üƒ¼èpyŽã‚x˜}+ôD%(Ÿ2?½ò„R ¿ÏCí:)ç)>p©¡Û¡Ùm=jZ >u!„B!Ïó¢÷r˜`Â9 ÆcHŠö›YæÁ,áÁç·pFL²ÙNﱎ6öUäƒØf Awê B!„BžçEî ø`ã7À!A*cŒ7×BÚ(-bß³ZЉO… Âë®…¶¾štëQ3X[„SgB!„òÀèÙèÙÄÖ¤.ïÃV£MN%„B!äù^NànÏçò¯ …â#碼ÒGå“LçÌ™Â&²dh˜ž­qᕲ3†²@T‚AΑ'„B!„üÚË Ü#°ÛQ3,9»K~,óÒÏ5m7¿ÃÞaI,`wñ}Õ8Q…úð„ ‹A4ƒ’œ#O!„Bùµ—“ãÞc«‹5˜VäWîmihlf®,œ)Þ¦¨O*Wâ2â©”À÷ñG†&¨C]B!„BÈo)^ÊYoâž }Ñ’ðü“‚Ú†R³rð>,’älûHÓ]]C­QPŽ3|mêfêÎ|1K9ð®QÇB!„RÑËq—³ÕÓð…ð‡Ü {Ì- °ö¬ ”R¦ôºã,m;õx£]€Í¨ „’e±E]B!„BÈo½œÀ]ÎVWCxŒ'OÒË7h‹ú¼€¿ÇSlÕÓ•Žƒµ?¨¶ÁLØHÖº„B!„ßþœ‡ÉCÔ4 @mT‘âù]ÞB7@qQln—ª^ªœ OIe µ©K!„Bù­?)pôFñàr@JoH±¼’ÍZÕ8E¦Ã<õeëNëYW4¢.!„B!ä·þ¤Àý~õ‚ÁÅ'Tƒ‡äŽ˜"W oÙÎRªÅaò>l2ê  Ur'„B!ä·þ¤À=' 8°l®18Z¾å|<+œÅYvze®˜jÝi3"P“*¹B!„ò[Öˆûö‚ÊEUQáÇ]ù<„;³C¤}mu™Ò ØÀ«ñ¾‡+l¡£Ž!„B!¤¢—¸?y³tá„É]ªgéÃ?Û1'vÌb/­¯<Ýéºý%èQŠKwiÿ=PAÔ1„B!„Tô2÷x¹X¾Î𞢊ÎzÁ Õãß8}¤Uª=”þb¤˜{¡@¼àJC!„BHE/3p¿Ç(„˜i°%TªT0[ßÌÏì„­¬*Ô¤U®Ótó4ó5WYâaˆ°ÀÌ^ƒܨc!„B©è%îü²ðH€¾¦ÙËÒ&7ªì®a/ôì©0˜åSy¾Ã'ê¶Ê‡ªÞânáš5>n°§Ž!„B!¤¢—9â~÷qp7²œ°hž~S:¬|4‚À–›ÛJ}ùUçBÍmåDÕÑU¨n=ªÜáHC!„BHE/3pßë¸%4fÀŒã7ùš,§Â±%Ñ€xJ¬aÙÇçs³½BuL1[!±ál¯õ¨8AKC!„BHE/3pÿé¸'رÌØÂ>§AqNiXÄ~,ËÒ\:ÏkªßV~.¬×1åqµõ(ØACC!„BHE/3p/‚ø!AУEŹÆBóEÜ’ ©àˆ¢¡Ò³‘Ã8Û4ëQŒ:…B!„ÿë寜:?"EÞ,écªa CÙϲSèÆ²Ù'`ü&yV±Ÿc{œ:ƒB!„çyé;g‘,oM2f˜›¦™W[ò„öLþ‡ɸïál·V§ Î „B!äy^~àÞŠoÀ)y;oIYŽ1¹¨¦!ÒÚT`}1à¶. */ /*----------------------------------*/ /* Body HTML formatting */ /*----------------------------------*/ BODY { /* fonts and text styles */ font-family: sans-serif; font-size: medium; /* margins, borders, padding and sizes */ padding: 0; margin: 0; } A.ext { /* fonts and text styles */ text-decoration: underline; } PRE { /* fonts and text styles */ font-family: monospace; } PRE.boxed { /* display style, position and size */ overflow-x: auto; /* margins, borders, padding and sizes */ padding: 0.5em; border: solid; border-width: thin; } /*-----------------------------------*/ /* Header HTML formatting */ /*-----------------------------------*/ DIV.header { /* margins, borders, padding and sizes */ padding: 0; padding-top: 0.5em; padding-bottom: 0.5em; border-width: 0; border-bottom: solid; border-bottom-width: thin; margin: 0; /* text alignment */ text-align: center; } DIV.header H1 { /* fonts and text styles */ font-size: 150%; font-weight: bold; text-decoration: underline; /* margins, borders, padding and sizes */ padding: 0.25em; border: 0; margin: 0; } /*-----------------------------------*/ /* Footer HTML formatting */ /*-----------------------------------*/ DIV.footer { /* fonts and text styles */ font-size: 80%; /* margins, borders, padding and sizes */ padding: 0; padding-top: 0.5em; padding-bottom: 0.5em; border-width: 0; border-top: solid; border-top-width: thin; margin: 0; /* text alignment */ text-align: center; /* floats */ clear: left; } /*-----------------------------------*/ /* Content HTML formatting */ /*-----------------------------------*/ DIV.content { /* margins, borders, padding and sizes */ padding: 0.5em; border-width: 0; } DIV.content H1 { /* fonts and text styles */ font-size: 150%; font-weight: bold; /* margins, borders, padding and sizes */ padding: 0; margin-top: 1em; margin-bottom: 0.25em; } DIV.content H2 { /* fonts and text styles */ font-size: 140%; font-weight: bold; /* margins, borders, padding and sizes */ padding: 0; margin-top: 0.75em; margin-bottom: 0.25em; } DIV.content H3 { /* fonts and text styles */ font-size: 120%; font-weight: bold; /* margins, borders, padding and sizes */ padding: 0; margin-top: 0.75em; margin-bottom: 0.25em; } DIV.content H4 { /* fonts and text styles */ font-size: 110%; font-weight: bold; /* margins, borders, padding and sizes */ padding: 0; margin-top: 0.5em; margin-bottom: 0.125em; } DIV.content P.center { /* text alignment */ text-align: center; } DIV.content OL, DIV.content UL, DIV.content DIR, DIV.content MENU, DIV.content DL { /* margins, borders, padding and sizes */ padding-top: 0; padding-bottom: 0; margin-top: 0.25em; margin-bottom: 0.25em; } DIV.content UL UL, DIV.content UL OL, DIV.content UL DL, DIV.content OL UL, DIV.content OL OL, DIV.content OL DL, DIV.content DL UL, DIV.content DL OL, DIV.content DL DL { /* margins, borders, padding and sizes */ padding-top: 0; padding-bottom: 0; margin-top: 0; margin-bottom: 0; } DIV.content FORM { /* margins, borders, padding and sizes */ padding: 0.5em; margin: 0.5em; } DIV.content INPUT { /* margins, borders, padding and sizes */ padding: 0; border: 1px solid; margin: 1px; } DIV.content BUTTON { /* margins, borders, padding and sizes */ padding: 0; border: 1px solid; margin: 1px; } DIV.content INPUT.left { /* text alignment */ text-align: left; } DIV.content INPUT.center { /* text alignment */ text-align: center; } DIV.content INPUT.right { /* text alignment */ text-align: right; } DIV.content TABLE { /* margins, borders, padding and sizes */ padding: 0; border: 2px solid; margin: 0; margin-left: auto; margin-right: auto; border-collapse: collapse; } DIV.content TABLE.center { /* text alignment */ text-align: center; } DIV.content TABLE.noborder { /* margins, borders, padding and sizes */ margin-left: auto; margin-right: auto; border: 0; } DIV.content TABLE.noborder-left { /* margins, borders, padding and sizes */ margin-left: 0; margin-right: auto; border: 0; } DIV.content CAPTION { /* position */ caption-side: bottom; /* text alignment */ text-align: center; /* fonts and text styles */ font-weight: bold; } DIV.content TD, DIV.content TH { /* margins, borders, padding and sizes */ border: 1px solid; } DIV.content TABLE.noborder TD, DIV.content TABLE.noborder TH { /* margins, borders, padding and sizes */ border: 0; } DIV.content TABLE.noborder-left TD, DIV.content TABLE.noborder-left TH { /* margins, borders, padding and sizes */ border: 0; } DIV.content TD.left, DIV.content TH.left, DIV.content TR.left { /* text alignment */ text-align: left; } DIV.content TD.center, DIV.content TH.center, DIV.content TR.center { /* text alignment */ text-align: center; } DIV.content TD.right, DIV.content TH.right, DIV.content TR.right { /* text alignment */ text-align: right; } DIV.content IMG.center { display: block; /* margins, borders, padding and sizes */ margin-left: auto; margin-right: auto; } DIV.content IMG { /* margins, borders, padding and sizes */ border: 0px; } /*------------------------------------------------*/ /* */ /* Special case layout for narrow screens */ /* */ /*------------------------------------------------*/ @media screen and (max-width:640px) { /*----------------------------------*/ /* Body HTML formatting */ /*----------------------------------*/ BODY { /* fonts and text styles */ font-size: small; } } routino-3.4.3/doc/html/example2.png 644 233 144 272260 11541143722 12375 0‰PNG  IHDRôA^#X oFFs6È *8 pHYs  ÒÝ~ü vpAgŽÌdKž€IDATxÚìÝu|Ëú?ðÏÌn¤nT N)еh§¸·´Š»sÐâîîîîRÜJ[ÚRÜÝ)ÖRI²;¿?6çÜð»÷~¯Aæ×ëÞ=“Élú$žLF8Žã8Žã~6ƒ†¬À\Ѹ‹sļN •½OöX^AU,¦dw×,»xäæйêºÊÙ@rÃ%6¢éôúOÇrŠŒ^}Â'5dשÔÙuòBuUÉœÁ˜ÃÕÙiDa*ú`ŽCŒžû_Žã8Žã~R®°%|@…cø8_´žmYºë²JMJt[]qd1wgÉ*[«akôµ¥‘y‡¥ÑÒtÍÿ-ÐÃd)#×a#YªR¥ £“Õ™~‹ªÕ/s1ÆË·i!g?ËcÚ=†Ê9òjåüì´–™uV;nëÇJOM|2óí»±3NŽJÛpÖñA…çÀ(á=%d”\H^Ê$¦FÌÂ'ä : ñžû÷ñÄã8Žã¸Ÿ"ä@Ù†Lœ%WHQdËãÙ+ÔV*VxçÞÎeI•Ú–(Ö¶Céí^ajGÑ“\È•óžè%úŠœ'ÝÔnªb¬!JzÎâ7&]ïùøö|«„=7î%%>Á+ñ„wp àFj"„ågy¨€OøŒ,   Cæ/ ÷Ïß°ÇqÇq †:ðAQò #ABÈf2VÏv1I©X½~¡ ùí†EÖ òÝ_ç‘W}çídˆðšÉ«š·JוÜ@:«?˜_Ö†˜µ5×núñ‡±³‹\˜qÍõA¹wƒ?–RÚN‘g¤§t eOÐë±* ÐCâé;÷ðÄã8Žã8îQzâsa€D›’ÆÄ 9l +‚3úÁëq/|K©Ú… q­öÉǯJ÷ÖŽ¯y–œ—]Eªo )Z Ç©¿j„ùaeö/ºZ3µcoì_Û;%ôn¿'~ÞªœŠZ¤É·XO,@AŒÃr2˜1SãÃi8h6ºÄü‚*¢¦‘#¹–9çt¡´%y‰Þê•_uœaaŸ4qí•«•»Ìßpñðµ+©ožG¿-£´C1Ç„³-8Çn!Sq¯ðŽoóô£â‰;ÇqÇqÜïÍ4u®Šbð¢>¤8y®±ê¬;ÁبT¬s¢„Gxß{Uúû”ª[x¨Ë €ä¸\ÿ¼Ó†êA+¨·h©úÖ—Á¹yú›ü®æ=²šuñúõ&×t/˼Szôs"ö‘-ä¹ YI¥Ç¬®|YN‚  Þàžñ—å{ÇwŽã8Žã¸?’’m)k´k @ +ðñ¨‚D`Œ©jG±—X yZ™ÊE> œ\e·K¹¹nÏíï²­Ÿ]6ï†ÞCë%LêÓ]š¦êÇï+g-˹¿lê¹ñi>óËœóºöᙽtãÿ;ïTT…7ãéçÒÏÅ«Mi×Ò;”ÖDaP¼#ö¸i<1ù_Žã8Žã8Žãþ)Ó¤™‚‚b-Ú¡6y†³¦]öZïµ |®ü¸wû‡;DlblÒØØŒݶxòçìó_Ê'æ2ÆØ‡Œ1–Q„1Æfæžvü¿H À¥5q9I2pcÑÝxs¨¡â/È÷B@9¸Ã¯ð YÆÕI9Žã8Žã¸?‡2på0ná1¦aV`&Ú žø‰ dÄçi¹³u³ÎÞ~¸òåÉ-–×=6ˆ–âsÑÇ+Њj'èÆU~ôE_W3L[)»TnRnӗåOù”ðènì:‹›9µ˜•……•ôôÖ§G_اàœ=yݱ'‘DŽà>Ö’û¨‚²qéø€/È1ŽÎçƒi8Žã8Žã8îŸ2íB ‚ŠÅœ!/ð[L+.ìTuÍSf–Óï¬7cŒ¥?aŒ±Ä Œ1öäÊA—õù|¡‰±iùºž¿µ­_Çû­­Ù§œ«]ºE Y3ÓÖ„Ãä&iEöÀDc‘*ˆ¼;÷›{ƒ˜µR­wçlÑG£¼‰xˆç<4ÇqÇq%i@Ai8¹DÜŠ/ÈsÝ“o´ÕüSmç—hšO¥¯=rX»œ!Sj>kûìH†•ꚸ@[¬*»:ü¸“ØïÔÑ«¾l7«gÙÆb­8‰>„‚÷ƒÅ£?[T4¹ýÝ3kÍR:Þ¦oªfÞÍV(EŽ’VR6ÝÆ.\Ç#·xâ[ÿÚ7…»‹}AëŒ'¯Þ?ýì€èŠ–hŠÅØÊCÃqÇq÷—QA„= © Y€ò+Ö¶cúÅtªVmôÌnú*] [3d–z­Í¸•s»ÒØÉç8­ÎkßõXQ½eéÄv%Ê–*VÐÌFMéV=Ë+©/!Õ”S™¿v™j…0ÅÅêB•«Þïβšw>¡þÍ{›Æ¦÷yÿ:ÿgm–qL<µÀ{¬aIaTbNìJŸ›ò»Oáÿ|e—˜ïÜÕø*¸`&ñ˜pÇqÇ} H#"` Ö ;Ü<Úº$Ø–üòìèÝÞΆ§ÇôÊc,9jÈDZ±?U„›>¶LSׇ‡ó'6.QýTVȨ6í706qfGÜ9®|ÔÂ/ G‹xÉØØÙѳ›Ü!6éNÅ~«ZÄý’œ[þ“ÕGíx‹ikâ|Ú•ÜA&æc¸±È *ˆü5ú3 Þ—FùÞÈØÿ)‘ôÇtôÇiÌùuSŽã8Žã8îO¥Lµ‚lè>ZšV“íÁÅ#ú¥†Ì)Pú¸K6Iež˜÷|áËÙAÇN‹‰ÿR-7I' i9Ò›ÜfûQüÕé¬A9áßz÷dõœ{M_Ú }T$Ëá˜ÍN떃͞Ìu¥ eò2t/ôÕœ·[¾5Û¢*¼Áu@½ï†Â ÑFXÿ¸ñÇÙ>Åæ6Ëû“pgÉ1<ÀòÁðÁ)¤"YÈæ[ÿpM³|ת“ÄxL8Žã8ŽãþZÂBO¶Á6p¨âï³9ÿ«ÏíŽî3BwæDûÞ5K8È«ããÇ}”úä#‚ÇÆÇ¡é@‰„aÚ›¶ì—VÐֹʬ· «V—ydÔÌ(ÊØ„ãKË%âÚEÝËŽ¹4ÒI~·%ÚŽ±ÉQ±ouì§nÑu˜]P„_SÇ!V£-&~õ<Ï‘;¤-¹H4¸f,2ã[ÿ0·ù·òQ¦€Ö$aDà1á8Žã8Žû PPŒAGÔ¤½HÞà VNêS;±äzƒOI'ÎíëµòšqÑÇ,íÍŽ«·“¾Ä;‰ ncÌ ùm]v-DˆÐB„@bq…^d/©dzÂ"!ù¶Ø¶™c¾µÚŒ·ÑòÛclÒ—ØÌ-®sÔá¬#ÞG`lÜ“›xªSß§“×hã0¨dÍåV8›YÕ4ßmÚšPˆì'Í1 QÅà Æ•rø‚ã¿þY¾~Œï–…¤?)ÄcÂqÇq÷W!‡HCœWŽýGúø¨!Ï9£ë?TwâØ³žë¹Td°G›ô0goc .jr͸‘ÓßSAø­éÎÇ!qÇqÇýI@æ‘*8O?RRß>ÓÆ×<_b©¥5Û]aNç?ôOfìB‘þOw›0®ñ(ãƒÌ6Žh7ƒæ\–Q4f?xÓb¤^’qØ…_L+­íd_z\ýZÛ*ÕxytX§v‡›Ð¿cU–0Ö;zpöæ‘Ó"ÕÒÎ8»¨¹ŒM^»öÞ‹óZ ‘Ò½‚g¾–{Íט¶&Ì#GH ¹NlpÏX¤6&ð<ýǶ\níìKXÁZxDUd ÇqÇqÜNIMµPC¤g©3©¬·éšê]Ÿ±ËdÈû<çcszÈ«u¦XÛŠµJz¸^Äq,A7z‡– ¡0‡ö×6¿3ed¼(ž`z ãI iiZÅÅÌ:ÐbÅØjµr+韼»M(c“-c;26öPô®¬=#ÎDLdl\å6ŒMªÒ)ýñøA­'þr8¤P…Ž®­/[H¦­ CÉÒ/0±¨ŠBÈÏSøà`HDv˜qŒ‘p™<%Q°´<2ÇqÇq K˜A…Éè0Š\Ì0»¨µQ%?\°euliôÉ›½%Æú´vÍëzŸHO6ÐÕT$U±CÑ䆦=ñ0‡9$-‰ ù‚Œ7­Xàƒ½™õ“‰¶u VžxÿèÀ‘­½›4ªS’´'®dÔ±œ2#÷E:ÉâvDflâ½Nû lsjèŠÀôrOógÛµ³ÞcÚ)‡¾ð§óI7’%QnÆ;èOŸÆŸjÝ1°^]¢!÷¨v 6Êb-bþ„·ÇqÇqÜÏI0YÎh=ÒQ9q6jC•Œ]¼=0R.sºw߀ŒÝ6tU`¯ÓëÅhO€Èd¾üÏÙtbk}”FLCÚŸ4&_%ÓªÙ¦X­è[¾zYßMOŸNk³“±‰ ª36öEôǬG#îG¬awâžD«›¼­3îظUûyÏu¬à‡ª6G¾ U*¹Oš‘A¸½Æ"óŸxøDÏ®wÃÓÍ÷jR5•R;1‹_SÇqÇqZ›œ#î¤+$ wÚg××bÄ}ÿ-;E6Ûoc{ 8:?®_µÐqJ}ò– ÃSãƒ5Pá¯Þ{G ñ×ç@ã#N ‘d )jZÅ9Úz¸Åãñk÷©¬}70¯µcSævŽ¯Ç Žº›]id‹ˆûŒÕGë›×qÊÇ #>D~˜ZD•ÈRÓ].8¼2mÌÀ9Ì [ðÛ”5ÞñóLl½V w\³N.16C­BaÙ=’ùåÄqÇq÷‡h‚@øÐ.$JÁ”^ÝTã»|zÈcýòã {E¿+x Kæ”clñ˜”Å L&ƒ‰vÂfßÔBЦÃi‚P…H*H>a›iE/8¤Ù:}TÈ/àAÝwZÇ16!¥ã(ÆÆî‰~ž½gä”HªŸ3¦`{™±Éõ;éÞ:þÑoÎÙ†—ªî/ZØIcÿÕ’åtqÄ:˜t$ŒEÊfO?öpšûæF¶jPø¾ãsûpc Š“š„òkŠã8Žã8îwf s¨ÉR;ñÇзÐÑüÅìÚtxt/ϼGñz¾a,ÅgèàAëÚl«4™Œ"ÕñYô<Èe…;¿ƒ¿Qe D@p ¿ FÍGæ™V±ïiþTûv`f`˜_ÀÝôþã[elRJlUÆÆnÞUÄÞˆ5,0nVÔ%Æ&ÝŠuÈ(ûˑ͜¬ðÌêÕŠôÉ·Ãv¾ikBortÃ,ôG0Š¢ào[4Ïoµm{÷EþÛNÆ}­è*2’øñ+‹ã8Žã8îwc²h#C^ÿ:¤d}Å‘eëoaì¢ý€yÒÞ³MûÕ|X`ËÔN Îs^`Ó‚$p¬§ s¾»ôïRgZžÔ€Žî&pÅ´¢ÃXËækF^ yY!ö‰Ïà¥mâ›ì«–óâE7Éñ¹7²€aò˜5Q›Ø­ãœWF’öMgt©?(àc)æzØÑù«ó~@=xÐÇd©„þ¨‹jÆrñŸì,û}yßhÄ´ÈŒ*Q^;Ü>ãì@Ž’H~}qÇqÇý¾èjjMê)Ç{«ò7Ï6oÛ{s>U«O,cä$jFÝe럤®$ô×·}È›Ö T„'òã¡-mA‚¿ÞìÉÝ×nŒ•¡Ë#ÿ±>N÷GXتc5O26¾r‡·_>Œ¬ñÆ3¦Nû/ŒM)ûüõÅaãÚ…/hظ`õ …ÂîÛ–þ*Ú½‘‡ÕäØoƒÀ- †ø÷ÅgW=7tE±-î”aù@âø¥ÅqÇq÷;PRÖóX®ÂzL5›­¹©ŠÚuh‚c£gŒ]º>¨µ´ñLXß1IK5í Ô’ì'Qä iƒT†LGSïø¾&¶JCǽìh> T°×rãóNÝÉZ~•qÇqÇý4PCŠÐX҃ѾÕV—É(X^¦õƒöç­:z§‡ÄØ%ÿAÇêÉR‘îʃè jCŠØü¨“-M“æÒp‡+yB´H¦N„à€iEÇJV³-&õÍ®îå[ånÕ[ÍblBߎ…çÛ¡Q¶4ry¤J7`ô’öë›”ÕiÛç£lÛ\Öòzp—2j··Ž[M[#]1ôYGêÂö°3Þ¡ŒÎÿ–16É/¶Në¾³ŠLTJÄ´>9ů2Žã8Žã¸ÿ‰²h£\a‡“˜ƒV€‚§\æz¶zÍœ=Ù/Œ±„ß3{V«6ê/ª·â A¬°øã 6ütSF¢+ƒ‚F£…£TK¾šŠj3ÊÌBÓ ÇÔªåË̾¹¨ïªæO›ô1v8cãƒ;œÏJñ0â¨4b̪¨ÒŒMšÞéüçK#»D^]ëÚònð¤2)nõòí0m®%AxIª`;&¢ŠÁý›žØÊîM¹Óùq‡ òžÅv#¶ö"×ùµÆqÇq÷_¢ëK¦+©ŠÔTŽ[U éï]ˆ±óøIOÎîc™=çø‰>-jx—ឦÔ¬i{òë0Ÿs§P%q6é'ñ`H¦IM<6­hsÉ|¤öMß.Õ6—ɽò wP³+ŒMJêô™±±=¢·åÔy'²º~÷˜rQ¶ŒMØ×±XÆtŒ^²Ìµih•·yú»~•Äc ŠC%ØÍ¤6F¢ÑoÃi¾‰­ŒMëÝ­uÅ÷%ò+%*'º‚dò+Žã8Žã8îA:W H$˜õÑìQu¹üpù‹ÈÞòº Í„0v~ÿïM k–g¬¿“ÔÂãƒÕÛÞèçâoÓZ_€3Ρ;šPORL+æ °loû¢òR ní7¢E6c<:–`lü¹˜ÚÙÅGFEdënžÕ~4c“cc+}¼0rfûÂëÔ­|ƒywiç0PIiÅŒ¦N¤ÒoÓg¿…uâ›–ÕåÔ½5,ʬPž§èHô¤;¼¶üÝÂqÇq÷s†l„öté­t;Ð$¹CŒ%m|QwôØÍžûó’OµìUÖ¹ènçÄЕ&‘`ºp$÷˜Nl-Œ˜..¢Ñ$á«*QêÕÌ>­«=ó]™v¦Wᦛ¼%öccÏEýòzdëH•ÔcLRT{Æ&ôìh–{xÌ/Ñþ+×5¿˜Y¹ûq—¦­‘lÅ0ª%ÖH´E]ãúÄVÂØT‡Î“õÇÓúsHåWì*–c/’!Cãáü§”~x*¨ÈX\ÅF D&À M”Šv3,zš±×}˜út (\j‘w%Goë“€œ!×Ïí§«`XHËÑhR^Ý^+¨ä$ç½3TßqñƦ'y ;$¹ÜÖ]´zèú|¯ñ´eP6TMÆÖÒÆ6ã3>á“qb«ä?ð¯flòœXÕ¢ÌÆw«ëŒEáŒB=Tçï Žã8Žã¸‹Iÿ+µ'sñV95¼CŸªW»$ |!…ŸZÜgzFòÁ·=–¹]ä¸ó lAòÓ.äÂß!þÊxôPø ¸0“|"L«XuÐ`ô€ü-o–Ÿîd—¿u©cf|.ù4âmã/)S„Ç.mÆlD7ÃEé‹FwÜ… _=çÿD<“ ’’ijîpFˆT90[ìFêÒÁä–gÈk–—!.âšÓ–é×ïëë¾/žìîÐ#¼²oÉ+þܖٹ㢠£$wBÎ]ÒŒœÅÞ¨-å?ÉhÑÖ»­ûÝÝ ·CŸIó%ä¿é”ÐúQÓU%°šl3ýˆë ò»ä – hŒid0È`ÿõ (&_Ø!ëÌñ®ÚF×ÍûhlÕþÆoy˜¾üÕç8Žã8Žû—ýDƒIn`»çÞסÏçÖñoú¤é·ÑkcI›ÏíW®UHÅãÆ‡È œ†´PñþI´›Ø `„؉Ö&ÿ¿Z󱯭—_ýâ7Oõump˜±‰‹:=dl|—ϳœYØP|Láöw›óÙ?¶S‡«¤Ý‚šT+ïUÈõìWoŒ,D’GÔ¸€­è„ÆÆ;þ«‰­„=AÕ+õ8U ÕÚ—¬Q†Ô“¢°‡}9Žã8Žãþ)5T”$Œ b), ÞèˆÝ¿äF¼¯äkµÉâ¨RTÝO¼u{Þ+ïZ­¾xÈõz-bƒë˜L,àN‘ <’\èa0§Q£ÆÖÊ'Yc2×±…Z‚áb?Æm|˜ràvÉÐèUQ‡×4ë°©ßɢ炞ú¾oo¶Kc¡:"ÜŠu.ymõg Ý NÏhê÷¸ð—öÑ[êlؼ¸MPHfÕB…¼ó{³‹èŽLÃt¨‚²Ø‡ÝB9rt„5l`c|VÿöŽ­Ÿ™Š…[~Vo­ÄÔ‹þ:„¿0ì`Á__Žã8Žã¸@é-ÕA‰Ü'}ñŒiXyt)o[Bå:»ý–Ú%l¥ÙµõuhÕ¡ë¢A»']9ñAûy}¶Dï >¤ŽœÇz1fÚÁý™Lc®ƒ:´–uP!õp‰ô3YOÊ&6í\}5÷¾!4råज़·ÞjuÆü|é§³Þõ+õu{Íí9õôìGÙ¹¹ Iº|LRµêRÆËku¼Ù0Ôgë²váa/*7õ°ré€bxÉR*«ÂVÐEÄWH_\Âr´€/ŠB0ÙæéŸôÅ7)êÖ«­¹áRp¹^ó_í<òjSfHviÒ §0-G zñ×—ã8Žã8î+ÊÊ!]ÑU©7ÙHòä^LÅÌöbÞÔ¿¾gm…ö2o½›!íÆˆ¾«ù©bÖÐw2é0{ÈÊaF`1ŽðE¿9Ê:ñ9ÐÃ@òa-ÆÓ®¤¹&gþlóoµdÒ¦õ˲g‹¾ì|©Bþbëƒêã2úK¥òºêwòÓ=ä9®z©vÇÞHïÙ§-šëß.w¸¼çΫSÒ½}ÏšÛòÁ‚"¥lËÆlÅQãÄVƒÉ“’ߘcQ­3/Œ%¸h3ÛÂøæ!pËùkÇqÇq÷Ï;h1&sõÂÚ®›Wã\Éþ×tñs{UcìÒñAú¦v5gŸ¥Ô!¹d4žLþÒ=8¹ÿ›é+c 3h0 õ@Ò ÇièQÎÊfꥪœðÔRÓ 9ž?Ôuv£Ìoœy‡DÆ&úuŸ³e¤Y'÷ó¨Ã‘ï›\#ÖíKïÑe£ên/ÜnNØ«JÏ=¹¼p‚hŒ§ýŒ½èJ;‘(âDã—D”Ζ™õ ÙÂYbC†Ÿ¢;,]¥’ûÑ?u @€ j£6j£/ú¢/>à> ÙÈÆ ¼À ä 9øŒÏøŒLd"_ð_ðñÑx¬Üû Ÿð髚Çq÷cÐ@ 7±ÝäÙ‰] UÉ8¼Ô³uÅŠTNt ©ƒ³fÙª‰§²*=±;t5A| ¥õÈFdË/˜¡ "ò ç£Û¿Y¦¿ƒ|Fò‡cHbàBMôBmT‹Ò ²-ç”®³Þlo¹ëx€½¸^üÁŒÖ)åfÛűü¢ïßà2!©rz|é”›O³UFæ5{ëýȽXcïb¿ðߪºôÔgÁý„‰7 ž·~þb±q,ÏZÔ„!籂iÙ|#:‹Ñ“ÛoUe©Ÿ‹á%ëϳãò­ƒï>U%Çð›X<І¿vÜ j¡º¡º‘ö¤=iHD"Ò˜ú¿ÄK¼Äc<Æcö”=eOåÏñÏ÷>ÅS<5–<Â#<ÂC<ÄCã‰x€|DàïÆtç9kXÃîp‡;œà'¸Â®ÆrxÀf0ƒ ¡ A -´(ŒÂ( 4ÐOâIY°¼à/ÔDMÔD34Fc´@k´Æ~2›Ì&}ÐíXm„"GÙuvGx¬Â ¬À\Áã/ ÊíÛÔ Ð€zQ/êEGÑQt ¥¡4TÐ ZAK‘Gä‘ÐLh&4#»Én²[è,t:““ä$9)8‚=OÏÓóô½Ao¨««“Ú¤6©-W“«ÉÕžÖ{Zïi=–ÆÒXšñk†ò%Šã8î[¦$gz ‹Ï…,rР—3»Ž¤Ké¤âs‹®Ìg%ÍÞ’w ™ëˆÔU{.î78IåZd Ä%Ãôæü))”¦LlURvbƒÕKÛ/rEgg¨iر Wqïá.\ÝqÿX«>¾ã‹Ìèl¨ZÜ:8³Ð—A€ÜU¤‹Ëù¤[Œ@Hk^òèå8¢&<÷†^:Úô¾ÍË®¢éyíûZô5ë‰ãüøÉh qJ¦c:¦“}dÙGÐôá¦á¦á&ÛÇö±}¢§è)zª'ª'ª'’æ¤9iNf‘YdD'ÑI$™$“d2•L%Sé3úŒ>#×ÉurZQ+j%Èä¶r[¹­üL~&?“óä<9O>&“ÉÝåîrw¹¤\R.)¿‘ßÈo˜sbNJÊ.o—·ËÛY:KgéÒ2i™´Lò•|%_©«ÔUêjð6x¼å{ò=ùž!ÅbH1¸Ü îR¬+ÅJ¥ŽRGýYýYýY¹ÜGîc˜i˜i˜i ’A’¶J[¥­¬*«Êª¢š¡óc~Ì™13fÆBX aeYYVEQE=èÊm36c3½KÒƒrQ¹ž\}Ñ €v¡Óét¹–*‡þƒ˜W@TÀxŒÇxr“Ü$7Ñ ½Ð‹< È¥„,'ËÉrr†œ!g”×E¼(^/’Ùd6™-ú‹þ¢?£q4Nx-¼^ …†BCÑItÈ ò‚¼PUQUQU!HR@¼#ÞïEdY$„ aB˜PS¨)Ô¤éD:Qy,I%©$•ºQ7êF§Óét:mF›Ñf$ä‘<êM½©7ÎáÎ ]„.B\ÄE\ ƒ„AXƒ5X#Tª UIyRž”§ûè>ºOy]”a6Òi‹´åYijˆgÆÄݶ°å‰;ÇqßFkãÄAª-ǰm.¿8ì°ÌÔ£¦B!”ÐûN –š…› Úu§UŠÓ­Æ/ká –¡ +Ⱥ£Ê?X!„ûñä׉À>!£¤ÕÌŒi0¡¨Hšã0f š°è-s®4»Ûfϲ›Õm zP¨»Û»~=ª4ó¹ôÎÃűº˜¤º,žÕ­Èšw[ÎÂyªµ³È ×_%îvû̪k*XŠ£<ò?ÑgÑ6„ ÁJ¬ÄÊ/i_Ò¾¤=éò¤Ë“.ˆE,b_žŠ}ûiò§ÉŸ&k>j>j>Òƒô =(º‰n¢ýL?ÓÏâq‡¸ƒ¶¦­ikq‰¸D\"~?ˆ„‹ÂEá¢!D´ íB»!BˆB—Ñet™0G˜#Ì¡h'ÚIX#¬ÖÐyt§ ‹…ÅÂbÍzÍzÍzAdA&{ȲGtEgÅ¢XëÃú°>ʨz¶ˆ-b‹ØP6” E0‚Ì^³×ì5®ã:®³`Ì‚ÙX6–UÆ^³’¬$+ɲƒì /ÅKñÊ× ÃÃÕÁÊ`eìï_,-–¶¶¶jjjKë¥íÒvÝV]]Ÿæo¼°¶î¡º‡HÌÅ\}‚n†nÆÙûö%¼{öž¾§ê¡ª¶ª¶‚…`!XÐ%t ]"Ìf ³hZ€Wˆ+Ät Cdz…ÙÂl±ØGìCÇÓñt¼ 4Œ†Ñ0²“ì$;q§qš'ÅIqxždÙEv¡+º¢+I $¥Q¥É²…lA%TB%rœ'ÇI8 'áXÕXM^‘Wä’„$²—ì%{åIò$y’ÜHn$7’‰Ldbüb“ÆÒXšTB*!•P†ëèžèžèž Ú¡”&¥IilÇÆ)¿“°“ì$;i8j8j8šoK¾-ù¶¨[«[«[³¥l)[Š]Ø…]üºã8î»!÷¸¤ ([Hl8{ŒÎíËÖÞà]Æ3ÕÓÒ6F×ï³EÎûLdß‘žÇÝXi~¾5 %"ê“ó¤Y( ²À(ò ‡ž‡ó§`:o+9ÈÃ4œF*5Œ[wÑjdyn¬îœ>øn{ŒC¸Õþ1êù•Lô*Ô-²âüb›¼,:.¿âiTÎÓä>Õ&ºò£µß«JVljN㫞 ¾á3òÂá –ä0a#«ÃǸs€(D!Šæ§ùi~Z¤iyZž–§³è,:‹–¥eiYjA-¨ 4B-ŒF“PJB…¹Â\a®pT8*â„8!NŒãÅxšæ£ùDåv^)·’[É­d;ÙN¶c*¦b*y£¼QÞÈš²¦¬©ÔSê)õÄP ÅP)RŠ”"ѽÑ[š+Í•æ25S3µ2wÂ>Ú>Ú>ZuVuVuVº+Ý•î¾K—þ.eQe£ó••‹8Žã¾aD$Œfs±³ªÛß°4Üwظ½ƒ¿Ù• IJXßÖŽ˜ë¼®_r>oæ=Q^F7“%ÒAy ›Œ+¸…‡<†œ‘éÄV7¬ÆòtEógK°›D¦({¡^E›Þï}ÕÓ>UêÎ-´ÁÅÿ«Ä}Þ¤÷öö.¾{Й‰H¤L)SÊ” K…¥Âr7¹›Ü± „!‚!,”…²Pão-Ñ-•¤ŸÙ3{f¯ô£ã6nãö_ö¾Z‰•X‰Ä †_dÇ}—”žv 2(}F«vrù[»ðá³ZM»y6oRz ; ;fxø¡dV'Ãþʵ»”ßüê¾Ù3ÏŒdòˆ\& r&ëÂxÇ÷Ï)sJÕ! Ht éI<å¶ž=B |èeÚ›¶©yªPc· _%îkç¤O}¼#ªï–öǧñÄû9ÃÎJroLýMoʽv°ƒÝWå®»kbM¬•/ ,‘%²Dcbš€$(KLâ Îà náný9VÅæ•B*…Ì.·©Ã¦ª/b¶˜}nÍÏ3žsgÐŽÐ>jñ¸ÆãYÌ•*ãÈ€cœ•Þne¢mAâGüˆŸ²qˆ‘²øæ;¼Ã;ãÚ;¯ð ¯Œ_ð”5s”ÕuL•I·Jú}ÜÇ}ÜÀ Ü åH9RNYî“陞éy/;Çqß !Š.%+${ù [ï·¢øQ—ÕÇÛÏûÜB´Ì¯šF ˆCµMUõ‡Ÿ^Tø|ë‰ks/F<‡7LÃFà *ˆ ‡$÷/˜ìØŠ‹Œha=iNôÒV‰mPª|5ÆÝº›fjúòÈq€×&·¸ÿiÆÅ¾•ÔPI:•…• M—VT~0½×tùEÓÓå•aÊ’‹ÊòˆÊ±²¢²þ‰-laKydΆ³áw[Þö¹í“Yífù›åm‚m:Ûtžõqð¥Á—^»eÌȘAIIb¥™óÁNìÄN㢓ʖUJ¬LÍT_ÓE*MoÊB–Êr“ÊVY†¿»™.^©KiSY söadÈÿ¾f`öë& ¦“•!3˜ñ…Ú9Žû.MDW„Él:{v¸ƒ“½,›:—;j;ϾÙKÃÅ̔ܵ/ ¾ ʲZ¼p÷²´;Ȇº!á83h Bòø¸vîßd2±˜ŠÕ’šÍd"&¡>ª ÌD¯¿%î ÌÆC'þºr³Ìø`þ/.÷­1MR•¤öOÄê°º¬.ê£!fÉÙfÙf¨¦ Q…oµZ­VJ çéyÝB­Î–D“h­Lå/ÇqÜwC”'÷1‚­aæhà×¥x%×rQŸêæ”®›óÁ"{ˆº­Þ\šYbIþ„¬÷éŸäìЄHf²;Û‹Üå);÷_0ͺu0À€a8€ó 8€ó_õ¸[NPå°•à +˜ý޽n÷#±… ŒûÞ óèd:ÅX*Ke=äÎrg"‚ÁWqUÙ+ÔØ÷¯ô‹sÇqß2kX@ƒÏø‚<¢'gÉ0¶—å²ÌñbÄ‘§ÂNä©<ÍNª¼ï^½½ìíÝaÝ®6@8Æc±Ü„=eP waÍÉýèoG«¹âJ:»ˆ+HÅ<á}í÷(ƒL³1³#­`+Ö™ufc”Á9çäˆt iJ^±Rl6¬;hrÜ€¢òà `eÐDsG¼)Ø«÷‹“…LvM1SÐ ¡­‡û£ˆ(‹p†Žf T‡Å^›fë´Öodý’Mn¢5ê0`ây°8Žã8ŽûaYÁjG\ÉJ©”<šÅ×~[©¢çÃêÏ«¤yMÏkð®Of²ªªMuó„áu—]=ÖÐS²”sè z‚œfµåvd¾z ÷G¢ð…œ f¥Xsµ¥ÐU8m×Û¬¬¶3DP,Ds„ñ0qÇq÷ÃÒB Í„R²AÂìUkÅÓÂêÉ¥;ª=•­>¯ËÙ«Ùo—a^æ¨íÙ圼™òø‰9=DíIuVW>ËšÃIÙP‡“û#‰ð!®ÄMØuäWg Itªõ.³ZjÕ £™L’j|)7Žã8Žã~@((r¡ƒDgÓR^¶‘cÙòÞC›÷(oë¹´`m3¹P^®¡ì—É™{uíG«WF_x©oa(iÈ :Z›”`:”þ ÷ç ÄN°c—ÐŒ Sù §i1kWM_u²ñþ±C%&Žã8Žã~@dÈ´ I"EX¨¼•y»zZÞèq·é<ßDy­¼K.F‡jFËw–=‘ÿîèÄ7K¾´!ïÉ/x)«å#l™q\;OÙ¹?…7œ`+`Í0AUB8Es¬­µ]Uõ•»ÉX„¢ÇqÇq? *(/Ä‘`èYпˀðxß=^Û ´?ahš3RŸ’ëžÓUº0¢ÎŠmçKœCgìÁY\‡9´‘ _7Œû³ˆ( X±¬›§òÔÂR«7jIµ@€!¤*Jàÿ"ÉqÇqÜÄVÐ’²ä&±Ñ,“eºíÊ·Åêq¯€fÇÊîÓçÿ8<û­ú¹}´åµÉ©Kw_P?{öÆþó`:Œ>"ÙÒ.¬rǧ¢r.ŠÂ°…{…XGªQW2ÒRPoÕÊݤ/* (ÇqÇq?5Tð™È%O°ƒtd»;Ì5ÂÜ…ƒs¾Íf:ÁWuD /}Ý&—K£H0¾ÀZbrG¶Ö°€FÙ]•’ûó‰$¡(ÂÞ£Îäù`^\´¥Ÿ•»É8ø“"``êbis®½}kóóã³oÝ$åð3Ùq<ƒ2‘ =×ÎýµèçzúµÒSšKž‘¥€üXnnÕÛ,F¼Å[¼‘£åŽl3º¢&Êó`qÇq÷¡ ȃÚ„\$N(h¬¬½·òèBÃBKU|]ÀR®—·Ö`.³¢H\vý›Ä*Ÿ|Y”û˜Î¦¹¤+Âf„kçþò·sæBý|ÃLz‰˜°Îì•—&FM[Еô‚îØ‹v¨o,Žã8Žã¾32)…wX‚¸ÏhªÃÅŒqå:ž©2ƒ^U]¥¾ÔVULÈL¾~µî«|[oœ¨Ë’l$Õp@Š’X3¨ ‚ò¾vî[@?wÒ—J’“äYÈåx«1Õ¹j—XóðÒ~(ɃÅqÇqÜwÆæÐÒ:tÉ”ÓYK¨[yQâ\•¯§ëF]`Ö˼Ø(>ÓÇ/nq6˜ugYKÀ^x„çx = y ¹oø©aÞ]ÝMúˆ¼¶tD6µ´X©Ñ©ôf“T/Å59ê<ª#h†2(Œx.Žã8Žã¾Ö°€†¸ââäK2e‹üÚdU»a%Û]¬øH²ÍKÐëÔ«ÉÚ+¶ž~tßïÒ¨_\¤'ÉB<2£+¾ë ç-qßú);w¤¡(Ñ’OXKyû`y@í¨Z¬"öÚB ÍH)xñ`qÇq÷PÆ¢+‹6^%+Ð’CAôêRªqJ¹Å×sÊWɆ"ò²lùKYýÌ©í7-JÎÔГZ’ŠDGv"=±Ž§ìÜ·Fü¨ÊÍÐ9“˜‘}p’·ÉÅU“…]ZñŒ°Äøþo€âpcÀ[0Žã8Žã¾qÊXô,œÃ8´f•°Åq±]AK«ZÄûN•—æ|Ñ7;[äÓ¸íüåÐÀ[‹Îä¥Ýz²^t ˆmÒVӸŒ™kç¾%ôC霓¹ñ‰5I•¦°KÌÓÜRuWì¯í&Î&kÕAaâʃÅqÇqÜ7ÍdíQ/¨è96É(Ø­Z£{e´nåÝOÛ½–Í ™ÒÌ»ÏR^F\ôš¶ ë0Q¨ U‘3Ø#葇,Ȫû¤÷Ç­SÖm¸u©$ …KHi"ýÆžz¾ì#÷ £%³e/#ÕHŽ|‚iX4ýEèA j™Ö#uŒµ‚à[,Žã8Žã¾QyÐÁ@f’ 8ÉÂØ”-®ó/¬SáÍK½®|Y•g§ò2©™±rüÞצ¾ª•q/«!=(8 y)+ÁîÂÀ‡Çpß:šÑ.Û1Ç/H.¹![¡,†ãð’,Óölèc­R°‚ŠïÆqÇqÜ7‡‚‚ 9ÂP‘#ÉDôC*Y8Ñ»S骛ƞΡTì)Ì{¬}XáCõÅ+öŽLN¶?Ì–kH¯X²±Þ×Î}ûovÝé:{†üÒi¹<­Or° …Ø.–gÏr„ùXã;¹æ² °„j2Žã8Žã¾!2d0¡GÆËµä,9äK…þfõÕìS¸¢þCvaÝ3RZc®Ò*µ²S ·‹>ÌZŽfhŒ–,hkLý9î›Gó »Ëe þR;ùˆP‹0² `YûÅæå´µµÚ²ÕØ ¨yâÎqÇqÜ7B„Š“˜hyª¬f;äà]¿§-ÒËw×vVߤ5…íª±‚Í »;‡Þ]ÜUõÌýÛ÷É$R{áÉÚ`-Ì¡…Н!Ã}/hÞ>ÉR.”}ßPRžK»+roÁÅÞ×¼–¶©R‡µÀì…%4PñqÇq÷S†ï A&Ö$½Ø ÂÒ&BÍ%%*Ô?Xý²Wý”Ìg¹ÍÉxÕ Õèqg×ê.µÊœ—ÝMgG­Èlò”½ƒF!¹Ðóprß 1·§¡§<8{¿Þư×ršæªà…qì-+k×ÀÌSS…Ì:aã8ïqç8Žã8î  "à'2H0í$¤‘•£†´_[Ñ…¤jÒ3ÕËÚÖ§÷&z8|”«És™¥Ó6{b‘<ôY»Ïœ„`V’…ÑsÚSªû=ö?©p¦YjôãSx•hɼظBž²sß#šS@_×Ð(«uÞMCäÐÁÄf‹–Ö­4‚˜Jüˆ'9ƒTyÈ8Žã8Žû (}ä*ˆÈj€ûþQè¡&ó—œCy®5ÐEr%Vž µl¤š+LÀ˜³Û¿ÕåÓ8¸Ÿ9ÌaKØÀ+0Õ¥´KµK©§pF8ƒô<=¯™hvÅìŠÐS¬#ÖA&2‘‰Bð†7ÇqÜ©+šÂŸ Ä@6ÐGç¶½[©jÁRìN°.†7rø›õo=¾<ž³p’GŠ3è!XŒ0ƒ"t|\;÷# ÈEò¾œ×1LØ ˜±iØ…ýka¹luV3_SÕX·>J£(÷^%èÒ-ÐBu]¬NFGü‚_ÆZ[fmÛÁí‚Ûl¼¯{_?p÷ší5ÛÞ>SfN™ ‚äˆ#TSTSŒÓªø°Žã¸Ÿ9´IIò£Ø)æ‰9…¦ç/bßyUø´R_t{>Ä~'ºÛ”6¯>.ÿêÊ—¦¿žñ>îËI¡‘0ž c;™Œ.ÈA <ÜÁ˜@|Yj°’ÁXöœŒ„5>“£¤.)ž/Âr™Ù¥ˆ0ðq?É•ñ·ôš€€ÐCcðñQŸ®»£»c&¨©ìã¾Ö}­\O‚I¸PE¨bÙÖ¼›y7ÁUuKu‹agÙYR–„’PâI<‰§qØŒÒsÏqÇý3æÐB…läÂ@’°’Ä †ãÐèQú€iÚ­fÄÕª]fIêqw2nJ¯­·%Ÿú|GO’ ˜'Õ‘ ì Þâ2y ¹‰15Éjl¨-ÉÐÉÍY&¢aŽ/ÂN2†V°—Í‹i«ëöDu”ã!ã~p*¨ ‚j¨1S1•.¢‹è"y¥¼R^I=¨õ¨¿ö¥Ú—ÚÏ7Ÿoî¾Ó½‡{L­¡Š¡ ¹Ã|˜OF‚þ³þs@qÿâþÅËÅ•_z¼ÞOg¦3cÙCöl#ÛÈ6d#ÙÆðĸÇq÷7ÙÈ…^ð¥#Ély=+Ë^U¿_ö£G÷6ÝkE¿Ä¦æõ6Hd5FZLMØâŸºåõà÷®Y31‘ #Xv¾üÓ•ûau©åÿʧ cFtL×=®}[ý™8èšõÞ{¿(4]©CrHA<å±â~@h 1'#Éä 9CΘVñ¾ë}×ûî÷ îÜ/MôMôMÖ%ìOØˉ1ÆT`Œ±{cì~AÆ»’û)ãSÆÉð#Ÿ|î^ªGL+­•ÖJk¼š’I2IÆ'|Â'ã Dˆ|ŸŽã¸ßÅt&Ód¾úºê£Ø`û©qåÃë0–h1h¤xúcßêé×VŸˆn À%H ¼Ålø¢(Ü`Ëß>Õ9îbL2‡éêW°–òaÖó0 Mhi’D®Úæš-ÕTêh”'%ð”ÏPå~Ää–‡<äÑ´-!W+È” õ,?Z~´üååå>8|pø`×d×d×äw×Þ9¼sØÞ`[ñmÅ/7VdXÑ ÕÆÊ]ä×òkÑ^ü$~já×(ªQTå‰eÞ–yÛqNŒ_Œ_¹Ïe•=¶Èz‘õ"ë” )R*(O„úR_ê+_‘¯ÈWŒ=ýzè¡ç»úq÷“²ƒ5ÌhEº‘¼—w±g̽úŸx·Ít!áÅëÎ}j”sG-XLÓ¶a»âì…ãÞã)Kž’1l-{Érñ YÈãä~<ÆÄ=«Žn½!Cï,­“G RzêKº‘{¶¢6Z] Àœ@üP[°ie¯´Ì“xŽã~TyÐA¢ýÉ#â)×fnl{ËmÁgKú|.SÙeœ=øôàÓñâÄHŸœ>9}òáÙ‡gžÝãB =.Øw³ïfßÍø€@"´%mI[c‰Òþß/õØ ­ÐŠ è¥@ýTýTý´ã´ŽÓ:N;RüHñ#ůœ¼ròÊÉ# 4<Ò0¢mDÛˆ¶êéêéjã¬:›Î¦³QEPä«¿ˆã8îE°…\$!جuQ÷Qå»R`e±ö”i/Ü0бóƒûOÚž:nP£MÆúûH}$Ì·Xâ~ j …ƒ{Ú=]mh6L>×'*•±‰Þ/ˆh\³ú(¥¢p€È0î›fš:[Àä 9HGâH•b³]f»Ìv5š Í„í‰Û·'¦H)RàÒ•KW.]™3%fJL™ee–•YöUÃWèz;°;ŒEZh¡ýÏáïÒkº„.¡_}aðã;ÆwÌ¢ž‹z.꙼(yQò¢Ä1‰cÇÌy6çÙœgE'Pô×k­<Ê£¼ñÏ2DË׃ç8îÇ`‹|È ˜A«*#ž–(Lºtj¾ªÜ\Æ’ ª›¿¨·ƒnΩ”~{¼Í=?ç{‹WØ‚&di€óÐBÍSvî§bŸdénó4xàƒVaìøXûèvŒM¼Ö©ÎÚ‰-V¾SêêBò>?îešÔ®Çz¬J ¥„R¦U*®8¸âàX€¸|ÿòýË÷/»_v¿ì¾Ñ{£÷FïZÛkm¯µ]ÌsÅ\¥>y@ÆÝOía{cCÿÎUð÷}ð˱Ë•)°Je Ë–5b£c£c£ãoÆßŒ¿™v:ítÚéý÷?Üÿ°ÅZ0m’¾¡oèx›ìê ¤á8ŽûΑ–D•ʱu Õ1àAüº%mce·ã£:eìÒ›¾3a@XXCÁšö"é êMª Ú À8̆ã~"F"¾™ñ9ò˜®¾ÔC‚q‚lÈr,±œ­Z, VR"Ò>(†W|ä÷0¾ÙýÐØ[bË"X‹ ABöÚhÝ3ºgtÏÐG¡BÙéìtvº³^Ìz1kOøžð=áë3Ög¬ÏÈjžÕ<«¹±aUQ•\H.$úiú¿³Þ 3¹)-tGwt—u²NÖÑ´-u&ëLÖ™eg–Yvæêƒ«®>èü©ó§ÎŸÊ• *4 m@Ú€´òûËï/¿¾ã|ÇùŽÏœž9=s"®Ä•¸¢ª¡»Çî±{x…WxõÕÔ[Žã¸ï©Af’™Èc}ØϦ%•Øt`M/§&åøϺ—G o2ì>ˆŸÖ-ŒØ°q¡tI6gY4‡Z’;˜…MXÍcÈýLÌ;èqL9¾Q¤×Ü&Ù~Ü ó›4¯Ó£hÿ´ÖPƒ Í#ýá[Xñ¸q™¿"B}¨õ1-1onÞܼy[‡¶mvµÜÕrWËÔe©ËR—]˜taÒ…Iãë¯?¾~Ɇ%–løÕµp‹Ü"·p —pÉX¤lÆôû2ýe@‚‰L&“Éd¥ÀÖ°Fï”Þ)½SNyžò<å™––¶;wwîîÜFà o4ü«¿½­Gë¡3:£ó?hŸã8î[FAAÄÛjGµ«R0FXuÕùW¯cì”­®)c7v0ÆØÌ¤c8õD©#O‰ç-ø Aîçºh®á >Ààš¢‘zBDiX_vÔlŠÚZå†;øD&ޱ2l;¡ðÀq*Óa'JÿzôGšL“i²|M¾&_£7éMz3àiÀÓ€§sìçØÏ±40h`»§»§»çÕä«ÉW“GÞyäý‘±#cGÆÞÜwsßÍ}4¦ÓtŒÇxŒg¾Ì—ù¢*ª¢ªñ¼Êz꿯<ä!ÏøYÁ Vl$ÉF*ËA~Æg|Æ\¿¹~sý†÷Þwxß+¯|¼òѽƒ{÷Ã<‡yó5>j|”K¢K¢K¢|P>($HRIHB’±}¾'+Çqß>2Ù6 áËÌÅŸ®|²ZJ Ô †{_‰SXw)K[K^œÛ™4"*lDÒpÐBIY:’ã~$¯l_²c—úw»Ãs¦!&ü²{÷èF™fË4mÔ7õ+âò¸qeC"E RB+ÓÊ´²i•b Š5(Ö`Bâ„Ä ‰çGœq~DÊç”Ï)Ÿ÷UØWa_…˜Ô˜Ô˜T‹ñã-ÆP…Pˆ6¥MiÓ¯/†¿(Í5é×'eHR†'ÇÉq¥Äú£õGëžx>àùÍÍMJLJLJÌö¦Û›noZ¯t½ÒõJ›6F;ÑN´F`Fü}ûÇqßp‚µ°Vå®2®Ó5,{Ñä…y÷ícì¼6çyî«»cláÓøyñ³•:Âq™¸œwLp?§¯¶Xÿ\K×ÚÐ åH ¨ØLÖP{_e¦r´ª¥qSOÏQç :Š‘¨„óÐqåãXò‘‹\ä’Kä¹Äü˜óS:Üͨ5£íµ;ÔîP#ËF–,Ý˹—s/÷qÈÇ!‡Ì8˜q0cyÑåE—}TîQ¹GåŒ /!KÈv]g×å¹ò\yîW½øÕèp¥__€¥³t–ŽÁŒÁ$‘$’Ä϶Ÿm?ÛÎÀ ÌÀ…ð áÂûêwªß)e•Èᵆ×^ËÏÃÏÃÏcѧEŸ}ÊXž±dVȬY_]ãé$¤£¡Ñ?ˆ6ÇqÜ_„ö"OˆŸr\´l8ûÓ/’÷DöÜ&‡]ø4èÙ‹>ûHï!>›ŠYæ¿%P1µ#mNRˆûA£:Õo06~HL¹Á}Tó7·~™±ÛoGÁÝ.1ÆËìYNêñ¸q¿“ ’0s0‡ž¡gèÓ*% —(\¢ðÔaS‡MvÉâ’Å%‹”Ž)S:î^¹{åî•­Ÿµ~Öú™•ÖJkõëªêРȲ‡ìAY”EYcù÷µx¢é—HD"’æ£ùh>Ó*!ƒB… Ú2qËÄ-Sߦ¾M}{~óùÍç7î<¸óàÎvÛì¶Ùm3^é$âOüVv“å8Žûó©¡‚ ˜Óz¤<àÛú®Û ­bì¢ë€«Œ]Üß¿ö_¦Ôo|UlJ3ÈXã£rqãx𸟚iâ×¶öÿ~Œ_3ÌÐkŒkû3Ÿ#FµŒÊ_M.t#ÿn¥ŽFÒI/7î{Û™ †q€HsÒœ4GTA¥ŠM¦M¦Mf×]]wuÝuH<$Ó§O?~rÈÉ!'‡Œ->¶øØâj¨] ¶iÃTKµT«´iL|Œq¦cýŸâ)ž’CŒ_§óåË—/_¾Ñæ£ÍG›Ÿïq¾Çù©êTuªz}þõù×çèÐ; ÷Wá¿H.’‹ÆÿàÓX9ŽûóƒI¼…ñÓitdÌðj{ØÔ‹D2–\vHói{º»×ÈQîUEˆÅé¯ÛÒþ›!÷3MÜûv«Ñ¥\ÆÆŸŠ™«Û6ºJû"º|cm;œ¨Uü½G}¥Ž°›jÈ\7î?F[dü– ’_È/äRˆ"…Œufc6f×{Xïa½‡›&nš¸ibò›ä7Éo’4Iš$Í‚Ý v/Ø]åU•WU^}ÕpwÚvWFu‹~Ô阦¿(}ð/è ú´Jíûµï×¾¿5akÂÖ„Ôã©ÇSŸZwjÝ©uýökد¡Íl›Ù6³ñßAv_Å_ùõƒ'ñÇýÑj¡~ýä9‚MØv´ý¬¸ÖV,ó|×~Ÿ •O î÷Kĉ:õËX = œ¢ïÈ=þÙÄq_%îQå+¤—<ÅØø‡1›ó4£~‰\ÍØ„ŽY¿ø„j¢ÔóÑòd÷0Qí _ø aB˜fZ¥øâ7Šß˜’9%sJfÂÇ„ /_¿|ýòõ=–{,÷X¶šÙjf«™f™f™f™Æ÷í2²Œ,S¶[‚<àñÎõ3Ä“‚‚GâHI "AJ±Ko—Þ.½'?Ÿü|òó„b ÅŠ¥\L¹˜rqE=Vô¨jSÕ¦ªÍWMæ§ùiþŸ(†Çýµ–cêCÔ¶¹å#m£w­÷Õëvœ± £úë_9îšÒ9µ€à´Þf<òÁf$œ˜cOÜ9î«UeÞÈvÎu`‡<¹«!ø(¤Ñ SÅ`ºÀ^¨Ñ%አ¸ÌƒÇýLWkéŒÎèL<ˆñ`ñ,žÅKǤcÒ1§§§„–Z~hù¡ÑŠF+­p|êøÔñéÇ '|œ°+tWè®ÐÕÚÕÚÕÚ×ý_÷Ý߸vûbº˜.–cåX9Öx®Ld˜ÐÏøc3ý)(({ËÞ²·¸Žë¸.´Z ­^Í}5÷Õܡφ>ú¬‘ª‘ª‘*Jˆ¢„ /*¼¨ð¢°aÿÂþ[“¶&mMZ[gmµu²6fmÌÚ¨LceïØ;öÁFð_°«²• l` XÀ–°„¥qʲ2.ßÚä¦ÔQ~+0Àƒqåe­ƒÉM)Q6ÔÍE.rgTJöb/ö9Žûã  ´q#‡äÂ̕嫾¡Ü|vs-[©]Ô'cžïÊhœ÷¬Ú›sŸ¦“¥$ñ¬)‹G(Ç}Õã^¥•ÇA—-,i‚CÌ…/ÕFäEdyÓŽt¹ß¹n…ùÅó¾Uæt1ùÄãÆý£7´ÐÂ8I”Œ%cÉX,Ã2,3­Ød|“ñMÆoú¸éã¦i÷Òî¥ÝK“0&aÌü¹óçΟ[qHÅ!‡|Õðer™\þjïþûÈ›CZN–“勱0Nêò2ó2ó2›¸sâΉ;/Ù\²¹d“ü:ùuòëE—]ZtÉ÷©ïSß§¦MÒ~´í÷ÕYþý˜+5=á O"èŽî莥XŠ¥ÆYY5ÈŒ˜3âK|‰/ 'á$oðo”/ipƒÜøËËq?¡7Ý@ÖÃâ.ujYãcçÞ (ÄzžwìßaaäÀ¦u ¢š¡9A㬒îó¸qÈ¥¿%îÅê8lµÞÇØ„†1o³’G<‰8ÈØ´]ÎôϨZÓGÙˆÝhi2ΰ†ÞÏýÖ1É£;c Æ`0fc6ê£+ºÒX:–Ž5­^êT©Ó¥NÏÌš™53ëRä¥ÈK‘i]Òº¤uÙô|èù°h¹¢åŠ–óê=Ô{héÌÒ™¥3+I•¤J’ÿ1ÿcþÇ*ž©x¦âjGí¨ñŒ.p +qÜ¢PŒÞ¥EHMäCŒÚ_kŠ[“ŠìeÂ’»;ߤÿ¼:a•Y¡,˜Aј¸sñ9¿nê®;"9ʤâÒ VO¸C²ˆ˜œÍ’ì>˜wÔ^ƒ%.c»Üš ¬ Á®8„k¸ÇƒøO))”òã{B¢¬æÁ^±WìÕWË ~ò‹\dá=Þ£ Š ˆéÊh§!NÅœŠE6ŒÜ¹3übø®ð]Öç¬ÏZŸýPäC‘E6íß´ÓþµákÃ׆¿¿ýþöûÛñOãi<——ÈKä%¨Šª¨Ê7ú˜öxЧx*¯“×Éë¨@*È5äríØŽíHgé,u^ÜyqçÅ5’k$ÕH꺪뮮»|GúÖ÷­¿Ôia̘«ån¶¸ÙÂØÚ*ãÿŸÁ¯‹unÄ~ìÿû§`Y3Ó14"H#ñ¥øR|).Š Á_ð½EoÑ[Y›_˜"L¦Ï„gÂ3•¯ÊW嫚 š š î÷ˆ{Ä 1H R]S]S]Û‹íÅöâZq­¸VÕPÕPÕPØ$l6 qBœg4Õ ÍÐLé³'½IoÒƒ0ƒPõPl![ÈÉYr–œQµQ[z"=‘ž 'z¢'ÆaÆñ½f9îA@@èUÒ‡|”‹Ê­ÙÏmnýì[– óbù²a#ý"‰9ë³c¤kúÓÞÚA À <Å<ŽSˆxˆÏ¿Žõ4ŒaûYƒ/¶ú>R’6ØUk/_µ53ë¢mˆ,dAdž1/tB5dÁ‘'îÿ‚i uÇqܘÐ(cs Ú ó~æýèÚ–¶E* !!¢y6ò Ïk˜Þ0½Dv±Å>dgd7ÍnzòíÉ‹'/®8¹â䊓ד®']OB’Dž’§ä)ÛÏö³ýr-¹–\ë«‘Ü„ ÂaƒqÙûì>»Ïž³çì¹¼F^#¯‘ÏÊgå³,“e²LÙ[ö–½Y VƒÕ0Øl ¶ºµºµºµ†[†[†[†J†J†Jºººú}‚>Áàhp48666ålÏÙž³ÝƒzPªMצkÓ ‘†HC$ò!òýƒ+—ã¸ß £oiÜ“+J¥QÖû˜‡½ýÃ-"þHM{xÿÜ{ÃÇ /溾8¦¡[‚$x9qŸa\'Õ0Y.ËneíÖIVæ!š|Â1@îÉÎÙÖ2[¦y‰ë„’Ŭ5Ûź¢Ú£ß¿‚„()»ª˜ª˜ª˜M%›J6•äªrU¹ªq­ñ8€_õÍ'H52ŸÌ—K}¥¾+K%ŒOï9Ðk­×Ú\+iŸ´Ï¼®Y ³¾×ë_¯OÓ,p°À:qK»-íŽn>b~ÄñˆGpƒä[`=ñ0aã1‡c˜lÇlG«$;½ž9ÈMå¦Ä™8gêA=¨ùH>’Ê+kØcØcØ#—ÆKã¥×ÒkéµÁÍàfpËÝ—»/wŸd.™Kæ­AkÐÊ·ä[ò-i€4@ _¯_¯_o˜i˜i˜ixdxdx¤3è :ƒ¾™¾™¾™!ÛmÈ–öKû¥ýy~y~y~ú}„>EPEØ|6ŸÍG7tC7ã_}×qÝx¬š×ï^¿{ýŽ0ÂC[´E[6McÓŒu^â%^ò7ÇýÎla3”…#îà®àWC?Ë 1Ö²‹jv³pvùÄî˧mÎJÉÎËkL×x/oe-Pxø8P÷O¿þ¥Ÿ*a ³ˆ~¤¡‘ë"³sâ Ìeì½ÕÍPÕU± ÝE³ W%s©;ŠÃv<|ÿÂnìÆnXÁ VV­Z ¬h]Ѻ¢užœ'çÉB%¡’PI#ŒÆ'ä9Á NßËG’ádxÞ9G¶n“e“¥º­îªîj¨#Ý”njK"ñ[:îš¿kþô÷µµ™›¿\ørd ’çxŽçl›Áf×úP'ðžõ?þŠ!*1gçÙyv^%ŒFIÛ¥íÒö§§žÞ{z/ã]Æ©ŒSº+:?ß—Hùº|].nØdؤ¯%®×}Úñ±ÉÇ&|ØòaKN®>KŸ•7&·Wn/ƒh ¢~¾~¾~¾ÞFo£·‘<$ÉÃPØPØPXÊ/å—òKáR¸n j rc¹±ÜX –‚¥`Ã{Ã{Ã{åùŸg ”@‰ë/êjrS˜¦ìŽp„# ¢  ^ð2®–“ùïŸ.–óg®¢Ãq?5¦†ÒÖZŒ©ÐºÆƒr=Zã²aš4f¯É£kÝ3&£:ò`Esé*ZN> —óàqœBÄdüº”ž>\Þ#Ge•Õ=0Ì ïIKR’\€µoiv_c¡>!μ%I’Q®pàáûLWá(Š¢(ª¤ ÔžÚSû\ë\ë\ëœÑ9£sF“v¤iǰlÁ÷òÇJÛÒ¶ú«¹9¹9yës{äöз18œ + Û Ûò£:ªpÍ?)ÿ¤Â½ í(´#­Ý5ÇkŽÌ90Ú„6¡MŒË*QâƒþÀ—Ê䖃䑈DTú˜¥T)UJ-»¶ìÁ²ûÝíëÝ×»tzÙø²ñ6_Ô)êò ŽàT MÑôéÊg‡Ÿ¾uwÜÝqB%UŒ*ÆPZ_Z_Úø š&ÍŠÿ{¢çe\þmiٮ芮d%YIV*¿G±§ì){ª|ÍÃMÜÄMãØxÆ~ñk¸†kx‚'xbü¨ü <Ÿld#·p ·p7p{°{Œ‹K*_c”úÈ@OÙ9îü(ZG~Am¶é°Á¶·¥ƒ¦³É’O\ ÂO^ û¿=òn@.n^Üâc®¡$2å¢l5k‚UüÚä8…È”Ä] †ZÒJ6 Ó6ï’á ô¤ñ†ŠUaz›3Ú8U+õyá3=‘-) 'Øðkè_˜‚)˜¢æ¼ÎyóúÞ¶{Ûîm#ÉF²1£TF©ŒRç3ÎgüÚËØ ­Ðê»û+ÕPk›Y޳çXK!ŽÈ™ ŽÇË®Pa@%©’´à¼7óÞìŸvôÖÑ[kÒVÏX=ãEÙe_”UN д€ì%{É^8‹³8û=úV¯o“ÕÍ›¡šÑj´­&÷•ûÊ}…ƒÂAá`Ûm7¶Ý±1buÄj§•N5j>8ü ߃|FŸ¨r¢ŠÔ•%²D9OZ&-³X(ôz= ¸¹óæN– 7¸I×  ð‡qµP µÐmІt#ÝH7”C9”Ã]ÜÅ]ö€=`ðñؘ@+É·’p+CYNâ$N2 L0&åÜî÷x÷ü Âqª6¨‰‚8„3œ:Ûž4ŸP`¾“¥Ù#¼. nÖ|Ò8£úµ|ʼ¹N‘º8$¿”«°õ`ÉSvŽû•ˆxƒ]+¹¬üòSݼҺú©8É{õ ògKõdUiUZŒ\pÛQv°ÄÀÿ“É*Ú9­sZç´¾‹»¸ûë½ÊB‡ ± •䯨+ÿ½hMz“ÞXÁƲ±}Š×·®omvÒ¬ŸY?v€l"›Š-.:¶èØò¤ôôÒÓý^–jTªQëy­Ž´:R¡Kùªå«n¸·áÞ†{»[în¹»¥œ"§È)´:­N«Ëä ò´C;´3®oºQ÷ï3]‡gva)MJ“Òr¹ˆ\$ßÅ|ó]8vàØcƒ{÷î!VË‹å/¬¼~!}ÚÙiý¦õ{ôåÑ‹G/àll/1¿µ]µQ ÅPŒ]gÃÙpGq7¦ã0˜Ìd&ã".â¢ñ1?Ü„lŽãþ*ˆ ††:¨ß Aå{=¥E m  *&Ü«ÿ|FfUé Ô]º+z eHà i$ÛÀƒÇq_Û‚hö‘X²mÝÄVa!®ŒM<Ñq§¾Êè#íW½žùKψ>®Ã¬+[—ü#ÝpóyðþÓEå:¡:‘ñd<O&“Éd²ñ'~…ɦE?ÈŸ¾‡ž£ç* ¬è[Ñ7æXŒ#­œ²ò—•¿$M›46Ñ5Ñ5ÑuV“YMf5)•^*½TºécÉ*²Š¬Â0 Ã0cßnéßaºÂ½-laKV“Õdµi• ÙA³ƒfo5l5l5¤š§š§šŸ*yªä©’} }¥¾’eËPKãÞ„b’ê™ê™¸A• J©æ©æ‰ªª¤&™Ifþv–¿­ÄÂq÷"OIÏ_ÿÕÛ]iR©¦íØ ux°¢§çõsèðºÁìrnD%”¦}É+âoL÷9ŽûÊpÔE5Rµ`£ÌoÐH¨6±É!î䦎ÚùòKÑöQ1“mô–!ÆËo*R±‚ï§&B­ ±hezžž§;„*B ë„uPc36Û®´}fû¬r`e¿Ê~Á9Áº`Ý€»î¸»·ìÞ²{Ë^1¿b~ÅüÄ/'~9ñK·«Ý®v»j±Òb¥ÅJcû­Ð ­ˆˆá«óò ˜þžhŒÇˆ@]G×ÑuJÖ^k¯µïé×Ó¯§ß™œ39grRú§ôOé¿ýØöcÛÕXVcY¯öµU–æä1ç8îw3QÂŒCM¸ÚJœt?tÓ– c÷ ¸÷)þà“Z·²ùFZµ€ÔpëÑ…‡ãþ‘†(ƒbt/ñÁIh`Ëñ¡a—*æclÊ›ÎÞÙÍF.ˆô“óÆm‹±ñšo×ÌÒ¸p$ÙŽ{à?`qÿÜ9œÃ9å0_õ|ÕóU¯™\3¹fr•éU¦W™4=hzÐôQ3GÍ5óâ닯/¾¾’ÿJþ+ù×Û¬·Yoö"ìEØ r€ ÆÀhKÚ’¶4®¢$‘¼^‰ƒé>©§p §ÈQr”U ŠêŠêŠêæzÏõžë}9óræåÌ‹º‹º‹º©·§ÞžzÛµ¿k×þÆסuhÃ13¶ö½oÆqÜ·€‚‚ÐRä01þb_~JÉJùs?Î9°·‡3˽×ÿȵÙk{wèOË’K¤µñQPíëMý8ŽSˆHÁ¼¤Óˆ¹ ç±/,ëCÿì[9ËšCtò ÖŠ jÚ%íÌW™-~ˆ;²+ˆ¼Žû?4B#4R6«Wü]ñwÅo_º}éö%ïºÞu½ë­x°âÁЧntºQÌÓ˜§1OËö(Û£l1sÇÌ3·šªšªšjM…5ÖTx°õÁÖ[•†iÚ†¶‘µ²VÖbVa•±¿9yÈû)b« ÁRVP)(AëÒº´®(ÊÊÒ U U U=nö¸Ùã¦S¦S¦Sæ»6ïÚ¼k³ÚfµÍj›ÍG7Ý|T~+¿•ßÒÛô6½-GÊ‘r$†°¯¦´rÇý/dÈ`´?½N,åµRIf]mpél7O›~¶'Ì ¸JæË^g¶¦;¿Ü,‡±÷¬ú '®c)Nã#ÇýS*º‚WsïlU¡KqsƦé»Ú})8âMÄVöi‚cÌ¥Z—ŠûºŸUêÃx„_û|íóµ“w&ïLÞ¹¢ÐŠB+ •Y\fq™ÅÆÇöFoô&$€üÓö9ŽãþwaðGq!‰^&#•‚åÍï®U†±¤‹ƒ+0–2¨LãÕo­'ØÔ@ýI0´ÐüðŸç÷_" âxI•‚ö=Ë¥½Î2¦8vn—}yä‚H[Æ&ˆ1'Ûì-w«¸q‹ž¸sÿÎûÊx¬l,Õýa˜Q(´Ph¡ÐÿÿÿP1T GÁÑ8äÃù1?6‡Î¡shʼ”y)ó’¯'_O¾¾´êÒªK«–ÿXþcù_J¯ô¾+~¤Ô4’"DˆÆ)§£1£•â 3+̬0sݬu³ÖÍJ&É$™\r¾ä|ÉyðñÁÇ7koÖÞ¬½10[éVºõ«‰¿¦ãã9Žã~/–°„%I&ƒˆ1ˆEû66£-V&[æy…%&ø hóaÑÁK½ÆødÊv ôu%yð8î_}hµ_Ç7ŸVúHa_Æ&6ì´(·Û¨j‘¿06þuÌΨºÈ·€R‡'îÜ¿Å4èˆD$"]Ð]Š®-º¶èÚœœœÀ#G8Þw¼ïx_©®Y Y YÐtTÓQMGíz¶ëÙ®giŸÓ>§}>;õìÔ³SûOí?µÿT—p—p—ð¯NFÃh˜ñ?”>øïwb¥é(ó:¨ƒ:ô*½J¯K¾à ¾D¿Œ~ý2¾c|ÇøŽ©íSÛ§¶ßßi§ý7hÜ qÓÆŒ{Öš.9j:>žã8î?eúéjØ(4D0z„Zã.È~CŠZç{›w9¾_¯¹Œ{Ó§PJð²B¾¶áÃM®'¡¿mÊÆqÜ?#\£ÎĸJLý\oOχRÒ¸m1/òžŒºù±ñ©1+‡mZñ­ñÒâ‰;÷ß©ŒÊ¨Œ ‹°‹JÊ%å’rhjhjhjµiÕ¦U›fëiëiëiú ‚] v)ØeÔûQïG½?ÓìL³3Í®h®h®h¶ïÙ¾gûž›lj°I DãÀº‚® +‹XÄW4W¾B|/I¼iÊ~'p‚$‘$’¤¸¦¸¦¸¦L0uÂÔ Iš$M’&Y“¬IÖÌWÍWÍWM/š^Ô¸¼&)AJ؉ØilígPÄqÜÁ°@@”Fi”F4¢C8„C؆mØö÷"õˆ#>ÛÛ®µ­y¨ïãFî^¢«õñh*Íbo·Þ^™˜Q©|ïšÇj΂/|àC7 ABe¾’Çý B ’Jº+ÇÕkvΟöyਉQ~†Ø1Öíã¿2fØ´/ äjÞÆK‘'îÜÊ´÷½ º  *¢"* Äa°ÒÇJ+},ìtØé°ÓU V)X¥ åBË…– •mƒL›©±´ÆÒKWXýaõ‡”Å)‹S'žM<›xvª˜?ø¼yïÊ9+;ŽÏih•¥â=µâ”ý ‹/_¹|&iJb½Äz,'DMˆ²Í²Í²5vÒ ô½ðÕ§ÿ‘ãHw\ÿuúšM5ó­f ¯¸öÜÚ$±ñÕ:Öóé#Üïñæ1ö íÇ~ìWŠ­j[Õ¶ª]5¬jXÕ°° ° ° 777R–”%eÓ¤* *ydùªÞù­ó[ç·#FŒ8UýTõSÕÓË¥—K/·;lwØî°f훵oÖ^ë¥õÒz)õé$:‰NÂ,Àãó1½ý^Lÿ±Ù†mØF»ÓîÔ8·Ä.Ö.Ö.vl…±ÆV¸ðì³ Ï.¾\ør᥹Ks—æúŒñã3Æ07âFÜld[ãK:rÜÏCùrî¸G¢·@ ´ÀLÌÄLÜÁÜùªˆŠ¨¨^ª^ª^j‘d‘d‘äåååãìãìã0'`NÀœQ5¢jD .\0$>$>$>¤]H»v!/B^„¼2:dtÍü5ó×ÌÐ! C@ß{¾÷|ïy8{¸x¸Ù…Ú•´Sk«i¨OR†ÅGûÅ6dìüÁþ-;û¾ßñ«K|§;†kÝ¿~j;4ªÑ(àXä±5ÇÖ¤UO+•Vje§•Vvò¶ò¶ò¶RêÑvavÆ3î§–ˆ!ˆÁx@ íÉ1rûüœØ¬‘ŒMHèèÅØ¸#¯téq´q¤ñz¹ŒwØÍÃÆý!Ò‘ãº(öQöQöQÕ7TßP}ChththtÑÇE}l袌’Wöû|xA[ÓÖ´µicUTUTUTKË/-¿´üeëËÖ—­·&nMÜ:wÐÜAsùò9äsÈ´>mB›Ð&¦xþ§i÷O µ£vÔδ¤âãŠ+>^_{}íõµS;§vNí¬ŒeïÓ;¦wŒÅd‹É“¿znk°kŒæ);ÇýxL?7”NŠöhöH@‚¤üß Ð©t*j[Û¶¶mí‚æÍ š—r,åXÊÑ?Ê?Ê?*poàÞÀ½Á˃—/Þ¼=x{pFpFpFpZpZpZHéÒ!¥ƒZµjá¿Ë—ÿ®ROK=-õÔ#Ù#Ù#9_ç|óuVÛ©íÔ_}Ž‚¿wjUq©µŒ]8`—Üöä—>‡rUñÚ^q• {çå·rKuF]Cµt¤í©q˜J>• V*¸µÜÖŠ[+^±¸bqÅâ@äÈ‘µßÕ~WûÝWçJ#i$í×?•÷¾s?§ü°…•M>“X¥àÈ¡ö‰µº16ii§UìÓ8»Awãû:7«†X‹x†NDex!?÷»Qþ¹RF4>ÅSð* •„JJö¨ö¨öh×ö]Ûwm¼ûñîÇ»§uHëÖaË©-§¶œ ~ü0øáWYD‘EÆ)§Ê`ÞÛÄqß;å*VzЕëZùS¶HÓA± ÄâŸ5 8 ΂³euËê–ÕÝD7ÑMôŽ÷Ž÷ޝxµâÕŠW«7¨Þ zƒI!“B&…Ì ™2/¤rHåÊ¡¡¡Ákƒ×¯­y°æÁš«4¨Ò Jƒ2…Ë.SØc»Çví¶‹lÙ.Òdk²5ÙÿôùÏÀļ{hI2ž¨Wúv¡ëùfÌàY·kúq§WõÌØÅ'ÜläwMyFÞÿ¶HÀŒÆ(rˆ"Æç@ç@çÀ¹Ò\i®tÙò²åeËsÛÏm?·½ó‹Î/:¿ íH;ÒμL’I2í(Ÿ÷³Ѧä$œà ç]mû„ìblÒòN§Ùž±Ñýe ˜ß²¦õ$³åÚFÆ<ÀDôæqãþùùˆ–h‰V)Èß1ÇüƒbƒbƒbƒGíîéîéîi¬¿k±Ö¸Æ°B -´ô$=IOš6\üSñOÅ?MI’:%5¡JB•„*)³Rf¥ÌZ¶6lmXÍÊ5+׬lZŸ¬"«È*ìÀìøµèŸ ¤QJLz€ˆ7ñ&Þ``0ŽJ/v¤Ø‘bGŸ_|~ñùä¥ÉK“—&¹&¹&¹N>1ùÄä.\:¹Wr ‹Éb²È@†±}>å”ã~$Êm{Ø+Ÿxÿ¬¢°_Ø/ì·zmõÚêµË)—S.§J-q´ÄQÿgþÏüŸzzz999¿ ~ü2Ä/Ä/ÄÏxœ’’äääSyJå)•§”)U¦T™REÚi[¤­C]‡ºu…-ÂaË?}ž6° ©H*’Šxƒ7xºG3ÌAo‘Òx†ñ¢ €,:g7¯{‹µŒW÷cìBƒµ6¹¡® ™O°—®#) †3è5T¿Í&RC 5M£i4ÍX¤NR'õÕwVßY.\ HÖ&k“µSöLÙ3e3u¦ÎÆÏX*R‘Šð†7¼ ŸÀÊý (ˆ` ÎdR°vO‹y·›ø¸Sù@ÜØ¨W/ÅÁºÖyîËìOÛUê“Þ¸…=Ü}¸ûðàKÁ—‚/õ êÔ×ÕÓÕÓÕÓXÿ ¾à ò#?òõñ‹\ä’ö¤=io<Émr›Ü®Q'¢NĶìmÙÛ²SO¤žH=qÞÿ¼ÿyÿQ7FÝuÃ}û:÷u_](céX:ö«g«œåï~®¥/è ú´$<><><þà°­¥r€IDATƒÃK±M±M±=²ÿÈþ#ûÛŒm3¶ÍXq­¸V\k|lSÚ”65nn¢àSN9îgðÿØ;ë€(¶öÏÌ.Kw‡  H#H *vw·bQvwa]»»»»¥;Q @®Ý9¿?f½ïú»÷¾ï}ã¦óÙgÏžΜ9óÌsžØ‹½Ø«µNkÖ:Ë8Ë8Ë8###/‰—ÄK43hfÐ̰waïÂÞ…‘0F¤¥¥¥¹Ò\i®4X, u u u jÔ4¨©‡½‡½‡}Ý ºAuƒ .\2¸¤ê¥ê¥êõ‹Gç×Þnè†n|ØGÌÄLÌäíã¿ÙEì8³ý˜%d<_1«ÎQã!”&©Ç® ôVbôƒ7«öid§s]­ ¦¡/É+2÷¿9ÖOWN[Æ–±U®is Í6Î{ž÷<ï™.M—¦K÷tßÓ}Owwwwůâ™x&ïðï?Ó„&4… %ð7‡=Käd_^3¥}Ó )”ÎT(O˜™Õo@þéÉ^½VºÂb¼ñyÅ}ÇG”ã&ð›ãx •¨ä+ꞯ{¾îùð†á Æ4iÒØØÄØÄØD13‡!däCŽØˆ||t˜Á fdÙ@6(Lkú7õoêߌ‹‹‹¿–s-çZΣæš?j~<èxÐñ nÝ ºHâ%ñ’x¾=3˜Ì V¼N(‹Ô‘ˆD$3ŠÅŒâ+´çkÏמ?MmšÚ4µÄé‰Ó§ß ¹r/d›É6“m&.&.&.ŠsFWtEW"!òÕf]Öþ~(Y¨ë\Õ¹ªs5¸upëàÖ7>Þø¸ÿþ ‚nݺ:'tN蜰Åa‹Ã‡5kÖ ¬]X»°vaaa¡¡¡õëÖ÷óó³ogßξ®®®Š†Š†ŠSŸ©ÏÔÿ™s8‡s8G ˆ1À ¬À >Z—"á¿ðÓEX0¼¦œÉaܾæ~i^ããdݽvŵõcGÈúßjUYçRêèЦü#ë´äÛ«¤#ýH”tíßöÿƒÅXŒÅä$9INòí=Ú{´ß;yï体ïÙܳ¹gsþÀùç´åÚrm9ånˆ1"FŠ?ÃB¿7ìòœ(ŽÅ-ýÚÓŠyc –UÌÖ·º¸xšaŸûvM-oÌÌ,Mœ…qø Q^p½á otFgtF‚T?«~Vý¬ðÀðÀðÀ`ƒ`ƒ`½{z÷ôîýªŽUˆ QaY–e¿y„øùùùùùm4Øh°Ñ Ý+Ý+Ýën“»Mî6Y™»2we®›ÜqÿV?TÀÞdo²ñ¢þ¢þà vn7Ü.¸]Ø»=n{\ZUZUZUBJBJBÊäüÉù“óõ«õ«õ«=La¦0SŠT¤*:ýwíéþ*|Æg(â”ó62ÍÝš»5w yò0äahFhFhF¨z¨z¨:¯A   N N NõXè±Ðc¡}û:öuLMMµ ­uD>j;¯Èà#Ïð{’<¿F¨U諨Mf{ä˾†Ë5¼äöÔôŸ-;y£"ê(¥)ÓÇyÎ|: ¼ñ¾ »‚9AV¢'ÂÑZPÿ—Æ~ªP…Â<£0 £X=VU8š0a6bMõšê5ÕwGÝuwTB»„v í"3#3#3U‡¨QUøé1LSñÍZ*døûÁš’S_]ñ¦0aï½ßQ:wýÀ{²:3Jûn­ô™ñ°_VËÍNm')Ú«³¤Ÿ0n¿9Ê^p·…-lÉx2žŒwÞá¼ÃyG¸G¸G¸G`·ÀnÝx½O'ŸN>¬[¶:Ì?´H3ÒŒ4û5TÝ®º]u{‡äÉ’Ï8<ãðŒ‡'žxxârÅå÷—ß3æÆ˜ÚœÖp­áßüì0ôÍïu²×É‹.Û_lŸÞ"=4=ôTö©ìSÙmüÚøµñSŽWCf“Ùdö7:!A3$ ð÷æ-Þâ-JO_O_O?Ü/Ü/Ü/8#8#8#Ä:Ä:Ä:øeðËà—Žû÷;î7½hzÑô¢ÆX±cÙ(6Šú™>ù$Jë°ëi•Z ZÀîpW¼ü÷kË%Ä£¹M:! QˆF³Snó“ÛšQš”çOi’Jì–ëW&t^ª~_Õ[ô‰B}²žxÿ&µüÙ*™;’»ä.¹Ë—5whîÐÜ1þËø/ã¿$W$W$W¤%¦%¦%Æ'Å'Å'ÙÙÙñ-™ÇÌcæ1à‡ozø{Àl%ãˆbr]ï7Ëå0ÇqÀÃÚý3N÷/³œÝyÀÊnw<~pPãÛ°3I9Y$Œ›Àï5A•¬!çaæñºñ)ñ)ñ©F²F²F²°aÂ:H/J/J/65njÜÔ8pyàòÀ宕®•®•¼ˆï`à`à``kjkjkjµÏjŸÕ>3©™ÔLj8ÆpŒáÃs†ç Ïi^Õ¼ªyU|F|F|Æ®]»3NÎ89ãäÍ‹·ôoéß+»;ûîì}MŽv=Úµ3 Ó€NaŽ&vš¸8t“t“ô^ì뷯ߦi¦F§F¯œ±r÷ÊÝöùöùö_Ùå!y$„„E ¿=- ð=PƒÔðE++«ˆÙ³#f¯^¼"ävÈíÛ¡ö¡ö¡öd"™H&þL9ÈA1!&ÄÛ° Û`s˜+¾ýß ¦¼yÌ´€3;žÙôÕ˜v’yÏãÞy”&ž+˽!Šª—=ôèô!ãëUZê^TœH[pøšaƒWNüg(EŒ!ÉErQùËεk;×^®¼\y¹òÞÈ{#ïÜsqÏÅ=]‹\‹\‹¿ò'þÄŸ4&Ic¥óLhþ’|»m´©ô9?Ï‹V:Ô„pY\}éX‚WìÆ“9¨ÕLE.j8Xâ ̤Â8 üpàÀ)–Ú)˜‚)$ŽÄ‘¸Ú6µmjÛTž¨nán‘•d%YI>’ä#ÙJ¶’­ä=yOÞóº|y•¼J^%7’ɸ.…K)¿Y~³üæIד®']óêiÆ<`ê’Îcèhå~þÃ3)A JxÅ mF›Ñf¤!iHžð<,>,>,þÐîC»íbîÄ܉¹ã¼Àyó‚%–4ZÒhddäxâñÄã‰|g$ä‘>d|Èøz‡êªwèü€Pm\m\mLòI>ɧNÔ‰:¡Å(æ³(Ž" ðWŒÅ}ìåË^V¦–UËg´ê›\ã4óo#*[8rÈ©»¥žËø6¢tf))6šþ0x›N€©†©†©†“““õ{ë÷Öïí-ì-ì-ômômômþ>§a¦‰ÜDn"7Iª$U’ª‘ ‘ ‘ ³Jg•Î*S¹¹¦¹¦v”fC͆ƒOONšœôö1¥”&¦W¯­^ûÌRJOÖ¾}ÿö=Æ` ¦0s˜Œ"”…]@@@á"yGqÐ ôÞë½×{t+èVЭ0Û0Û0[—–.-]Z"ˆPüŠ·Sÿ=¹Ð…)e“âK °o;íBD¥‰9±ñ”ÞvÁõ+¿tQÓ¡úPÜ !ZØŒ"œE¤¢‡ßÎ EÙÄ…Ï×1™ÆLã+TUU£Ô£Ô£Ô×%®K\—¦—¦—¦·R}¥úJuk?k?k?¾%#a$ŒÁþ1ë«^à/°„(³·¿ÆX-š[¡VUÀ½æ¶ÒWdNôÁ’%$G#N4‚éˆ!#àLÌAÁXFàwÃ|*ÿTþ©OñOQuPç›–1ˆAŒbË•wØâ#Äóöå|¶Â÷x÷ˆ(ƒ 2ÈÉÉU£Š0(~VÒ¯¤ÖÒtGn½œ97jžUVVV2æ(FqÉÉÒ®¥]¿ÄæÉ?'¬Æjzœž§ç%ÛVï~q9òO…¤BR!‘7–7–7æERµ×j¯Õ^ã^à…·ç÷‰ˆ¢ °p‚5 ØL>±’Ÿç’é²—Û-qwÛÛ"Úy ׬6RÞ²4¼|bM×áñˬ¯¨•®*®ÝA^!ð†Zb°Â2^ùo¤½æ÷]yñ½5¨áæps¸9|¨ßš75ojÞ¬¸½âöŠÛŸg}žõyÖÀF liîkîkîÿ9þsüç××Wæsˆ9Ämá¶p[0“1YŠ—×Á ü©‰GK(ÞDµU$Ź%¥Sz7¬>1£m߉”.‘ëñƒJËy¾Ý¡ hˆg0wˆþß %6Q#jDÌ!sÈÒŸô'ýI<‰'ñxˆ‡x¨h¯hì§ðB<Ÿ¯=Ú£=ÆaÆ)Ü¿®ã:®# ÙÈy‹,DÈF9ÊŠú.ô}+z[ÿmývªí굫‡qø?°ÙìGÁùI@@àgàó¤ÖG}Ôç³>û®ó]ç».Ì2Ì2Ì2ˆ b‚Ñ<Ñ<‘Âô›Ì ¿bˆ¾>ÇS² gz'MÅ%ÎçÇŽì!?Ã&ÊU6ÿv»þ³#¶:Iù6l+f&™XAêPýCB.*ïgÞÇ}ÜWŽæ°/`_À¾CƇŒßít·ÓÝN—_~|ùqÇt| øÕ>ìÃ>Þꛞ…5\àOÍ`x ™¤"go0ï²LèÒ#ªvÑLÇ~z”.š:$wÛâŽ'‚Í·«+é‹w„@x ƒ'ðýÀƲ±l,_^°{Á’KÞÚ¼©}SÛ¶EÛmIØ<6ÍÆJ@@àáõ»×í®Û]·Ks¤9Òœ&M<šxhUiUiU)ZÄ@ üMÎAI,%š¸‹ ¸ŠUh«õF=E¥ÝÝ›6öœBém³èrJ“übomˆµ‘>GŽc,«Á´"]°3ÐòO1žHð5Ý*¬Â*’D’H_a1Àb€Å€õnëÝÖ»¥Æ¤Æ¤Æ$&$&$& £Ãè0Êp Ç(ö˜&…IQ(z~!7¶€ÀÅ·QÉMŽ~À d•¶®½'¿ÀœÇ],¸Îô€ÖcÕÉ*†Ø†‹HäÊi>\Ð ¤aø>àµ/üf·t¡‹öƒ1È#&Ä“±;`Ø(Úü~%)CÊx±<´<´<[°[xUõËê—Õ/+ÚûÁïë~øÿ>Í+ìFæ,£E\q÷ Yx`è¼€FžC\&˜_àD´¥=×ÈMž6uËÚ¤«Ø‚u8Ç™s?PgôÀ,œU¸´þ±ðvüØŽÆhŒ¦~Ôú1ÙáÌð¬mYÛ²¶EmŽÚµùÐC7Ý`Ø6`ð„ÁOX®·\o¹ž…—…—…çËùr¾ŒcÄ)ÿ)¹Æ “WàåÛ-­*ȾZ¤QO*Åòòžµä“Ér•Lè8ZO«±d’Цø†¸¸MmFmum)é‹Þp¬Ü¾ ”m+Kñ_PŠBBdÈG6²‘Ld ¬¿¿’ð‚`ªPU1³bfÅL\À\`j˜¦FÃAÃAÃAá–ʧXúߢ5ˆQŽJÔ2*Ì|òQÌ=¥½ú.hnì8`DßN}Üåç*'ÔæVMãšrû†§,mwE=¯êKËJc¦/cHq[9;:óðñ·[~A·ž[Ï­çÅ÷ªFUª-Æb,FFmFmFmä‰È‘'õõõ¬ü­ü­üggÎΜ™Þ/½_z?Òˆ4"øNô}A_(²±V ÂDøýùöݱ²¯Zwù3ªE;—xÖÌ“ !OI6ÜDz_ó…d¯8@M"*dïC €ÎpC=a(þ3Ê•/*_D/Ð ôCÆ1êOÕŸª?E! QH<ˆñøŸŒ·h/G%jÉ|ÒÇ8kî)½ìn'5\´¼íèÍMÆRoy{Ú‹m¡ÚBÔtÎúÍ­ÍE÷å³Ë˜#d·ƒkD+Á‚ù8òO7 ¼øÎ;˜2`Àðâ;€>wÇñññÄ–[Nl™¡‘¡‘¡a£j£j£ºh좱‹Æ¶éئc›Žô(=Jò"»"q/²ÿ>îÂ?áÿ îµ_o?º–ÊiÛ’ëÕ_jýáL¾ý]Á}Ò¼¨b#¾¬:E+ŠC 8Pt& a+ ¥€€€€€À¿A9ÊQÎ놫U/ª^$“‡ÉÃà7¸©ÌR™¥2‹7ÿ þÔŸú+Ì6þ{j!G>“<…b¨j;«oP غo‚~ÓúNzÔs˜lÕÕ¢GV\êûÜfQ£}‡îª3<Æd9Ç]¦'± çð¸¿DP9ÞÐ…w` @è$:‰NbuXV'U=U=U=Ê$Ê$ÊäZص°ka†ç ÏžŸxf♉gb½b½b½Ô¨-P[À'Îc:1˜N ÷b!ˆ¤ÀïÈ·‚{d?f¦œ)Š£ªN×GòÉTq—a¤.·=Um#zËÞãDš£,„¡ø7ÈB²xݰü„ü„üDÅœŠ9s„ ‰“ÅÉâdÉ É É œÇyœG[´EÛÿꈺЄ«…Pfñ&§éq*ÇðE놿 Œö2t)5ç¸R¹Œ«÷l쫟sFÝ_azí)¦aš`&éÄa:û¿–,—7OÚƒ=Ø#§r*§¤šT“êìnÙݲ»M š45èÀºë¬cÕYuV½GfÌ™stæèÌÑ1iiÒÒ¤%w„;Âa™D&¾ð…¯"•ž`/ð»ðÿ÷ZȰf CJæTOªÑCÊp‰›OOQ#õ—*cÙ몥¢jæªâWmЀ‚»€€€€€À¿CrÃÇB‘¨ì[Ù·²/ $$Pü@ü@ü@â(q”8*„Âfh†fÿá±xQû ÊPÍÌ!ö8"ŸÊõ¤ã»¦‡Ü®×ixP§§îïj÷VÅÉÖ+z³Ææ¯t»æðigáÔŠîìv¦šXÒa4 ­æ1µÿðˆû‹¡œµµ¨¥*¡Ò‰t"*ÏUž«<·xÇâ‹w,Î]œ»8·È±È±È1<><><>Þ9Þ9ÞÙÕÁÕÁÕ³ål9[æ)ó”yªÈ"8° ü.üÁ½µd=z µ¨AmQ½Êþ5KÑuÅËŸ1“§n§òLÅHm—Ä[Ò¶p‚à úÂdø7à5î+±+i5­¦Õ¼àˆ>èƒ>â8qœ8Nu©êRÕ¥¼PHz’ž¤ç¿}~½2pL9*.—Ž‚™}¨…žÎá¥÷Fâ¦Ö.ææ‰{ª.6Ù³2uÖ¥½iµïç3Ém"–7á>Ó»ŠÞäó˜_C%*QÉ[«Ó#ô=BTˆ QáõñGUŽªU™8}âô‰ÓŸ§?OžîÒÓ¥§KÏE›m^´¹}aûÂö…\)WÊ•òQöÉ=rÜÄwßšŸšÊȰvó¥ÊÏV$â@Å¥Gæn©ê—öÚÕùåƒk—ÙôcF’I˜Ê¼!¸]¨0€6T!Š`ï% ðOÈG>òÉZ²–¬å-°+#*#*#¨)5¥¦l›Ä&IîJîJîB ZÐB&2‘©H÷ëC†t! Ö¡“†’âClØZÛ˜™a;-Ìßëž`æŠ Sp¥ áú­©7¶Ø%u%+‰'ÎqSé Ú »q Ïÿ¶q²øÐ½ 0´†ÖÐ^ƒN(¡„Þmv·ÙÝfc¹±ÜXîÆCn 1J7J7JŸP4¡hBQÔʨ•Q+EN"'‘õ¤žÔ“Ä b)Äwþª Æþ§üœÆ½±"A|E®˜ÓxZzÉûcØÑ¼yv„Ý)yÜøxøˆ}§ôOãbiô”ýÀõ¥nà`;ÜÇfôb2g² %¤c¢Ñ?“&±€€€€Àw}@мvMHMHMˆ¬@V +€4 ¡Z¢Z¢Z‚R”¢”6¥MiSÃÆÿ¢gþËÇV¯A-äįÈLn5¡¯§äöÛhJÓÍþóꎔ‡Ê^r»>UçÍ/³<´¢ÿµs23¹/—F¢ÑNpÇ ìþÑ¢ýï÷™µy!{æaoBÃ0LA®n®n®î¸öãÚk¿ÅþûWpù\>—ß»¦wMïšù]çwßÕ8Â8Â8‚ÛÂmá¶|’OòÑMÐDßFp`øMP‡ ÄŒ?;€ÆW4#Ý;x>W¡”Ò„.”Rš\D)¥ÏÜ(¥4rOçyæÕ»fñB'ðŸwÌ,&ÄNÔ‹mA>1~ä(ªpKÐAñ5+ˆò%Ø(6ŠâË rä,Èy«ýVû­vÛcmµ=¦h“Ãæ°9ÂX ü NàNðwÍΚ5;ûÿàÿƒÿáîáîáî® ]º6$+È ²BÑžwˆüç(=U™-¤ŠØñåö‡­lÏË,®OûL¾ñÚš±jú\¯‰òk4°Øn©¢ý;Æ´€:$Aö;4ùø‰¡ËO-_Ú´/h_p©ôRé¥Ò{‡ï¾wx_·}Ýöuóûì÷Ùï3ßF!¾óÙ=x4  aÊ üwÓS™ Ô {P*|Eñ³’J»ˆ“ä¥r±fµ[•¿¸›¼DnVþ²úaÅ”Uec…TÞë¸éIS÷Ó·˜öŠ\—sDº­Ç«°ç¶õçXè&ë,׸®’Χ4C¶G~ŽšrI´#TÑãpŒ9ʨrtD©ƒç˜Ž;XîèŠPÔ‡âßPÁ^@@@@àïÇ9œÃ9^ã^Õ¤ªIU“Z‡Z‡Z¼Æk¼Vm§ÚNµÁF° ùѦ0ýÅÞx-»(3Œ<"º\ íFÕìîX8é<^5:Æ6l#s™C²˜!ª·DK–YïUM­>Þñ¶NF,«Á´&ݸV\1½ƒ TCäQ'ÔÿeV1Ä+*~Àøì'ûÉþãÇ ŽL7uÜÔqo>½ùôæSƒš5 jæšÍ5›kÖqXÇa‡QCjH as˜“v¤i§Ê(,ÿ€Ÿ{“–Ö|‘ güÙµ4…ÕbsåëT¢Áô0üé{4Àlø`8ö“—Ø…¾"Ë’›l¦'éCBQ†¥Ð‚ú×— ÁäF@@@@à/¯q_…UX%--];¬vXí0šL“i²ZZZèèèB 4‡9̦^ä@A‘€Õ膤7¼ˆ1ÉÁÚ%aÃ_³Ì1 Ñ^‹ýl£ž&zXœ¥3gÉΉ)WÉ¢­¸´ã- „p| 'U¨Bc0chÍ ÌTf*35e}Êú”õQvQvQvׯ^ÔÙ¤³IgSì¥ØK±—¢R£R£RUת®U]KOÐôbR‘ —7¡9 ü÷0÷ÙÞl¾ìº"Ô.ƒ–^)Ý}\T›ÿüaPYZñ¦[ïòú|R?¿vuöàå¹6'nGæV2_ŒÖ¡ôúë±Ö”&ÄF›Pšx%¦;¥I÷b«)Mý<žRzË"úè§1Ç–Õ}¼}ûÒ>ÑÛÂ':6Íïâ2¸^OËH£1š«4djb±Û/›h,Û‹”°zL{Ò¸#óa sèÀ:Pœb~Sÿ-Äœ˜sÞ”¢J•*Ò*i•´JÚZÚZÚZç±ÎcÇŠ¦ÑˆFôÏt!þ‡Y 3‡d…pëÑÕÓÓÒ£˜-ÜæëO£HA۳̈·Þ§ M&7Lo’D¾špJ±_¼HJ¾"—ä’\¾¬ê¢ê¢ê·;nwÜîämÉÛ’·¥I’:d¥ÁJƒ•µµµŠ^ˬeÖÂ.pù¦g_ÁÏ½ç­æJ¸£|±øÅ“Wé;Õ_Î“Ž°µÉ”¬gYæ¦ø¨lÍÝ4IF»i=¿=fÍš ŠQŒâo 9x¾ÆV—ƒcž0 HsΙ³ ‚#ÜêYÄÌ=´g€%µ“äE„ŠƒÙ}®¯~vs^Z›ú¹)lE†ÈÏs-ènEo•|¨¿?¼Žœ²5¡ MjBM¨ ‘‘U‰ªDU¢øÞñ½ã{¿É|“ù&sD“MF4 ª ª ª²Š°Š°Š˜›37gnÎ=³{f÷̈ñ"^h‡vhÇëãÚw>d•Ÿ  Mh¢ U¨RÄú.ù9Á}?žÓ,€ie‰ì¶Ü¾l`­ü–i3µ*ÃÑMðÜð´FcÕ¬¢™ŸÇ|Ú—z%ÿm^½õ2ß¹i˜Ü5ë¦ë¥›®·ÌÌHo€$Î2ß L<¥nW£q’wvN¦Ôo;޳8¡Vc?ÎÔR­ŸØME`˜è£%ê«þY²Á¥¯ÓNÓ|4lhvà<é‰/1ù!域~T¸çѧŒŠ|¯äŽO|2¸UóP”5ìUÚÇ7_V°™6ã ¾Îö1¬3– 'È6¹Rn̹õ´ˆöƒ6ZbƒÒ;®p‹üðÏŸx¼ÐVݵºkuWJ(¡„,'ËÉrµ7joÔÞ(L,”+”,ÚÉs2÷h(7šž0Õ?©¾~Ó½q'ÂO¨‹$ᢄŠ3Ø­›V¿o¸y÷Y‡'›™fä,¨ü 7˜ê"_P©x& ÏÃ_s½ÊP†2EIQ‘B Ø‰ØyÔæ¨ÍQ›­>´úÐ*N#N#N£~Jý”ú)‹‚/ ^ßc}õ=Žì;²ïÈ>ÜÅ]Ü%7ÉMr“Ó`¬ˆ?Ëïß3¼'ÿšzGq”L&“Éd„ !4’FÒH¸Â® C&^ ÿøÁΦW‘Žé¨ Q©Mu™y¡¼òUu)¦ëE¨_…œ[D‹Mdš­Õ®1Û˜˜¸0®.7¦EÈ_YÞª¤Wá½1z¶zöÕ3ÌžX².ºªmŸ.Îü,ÞÂÆ2 Ô:‰Û“‹FþÚ†â ]LÚ²ž¶'Œº‹ã<µì£1Üâ³ažFo³e&ãtBÕFâMºnÆ 4'7†q¹æþÆð(·ªìP•W»¢l`e÷Z’)þ„’‘7uøe½¾q2=äcÏÇšo“ VlñÙ¬,«´nÅÜšõH°ÀQ{l`Rsâ‡Vt"=N;c:ÎйtR°§ð›p ð¹(UˆöÂ2& ðÛqq‘/–5+kVÖŒëÃõáú°íÙöl{-5-5-5” %ø‚/øòXÓapÀ'¡œîÄk¼ýáì˜E!›ë_µl˜pUôfªÓƒø¬Fo˜r»!É%ÑxEwaŽc<>¡DPaý‡ðãÏ‚KåTN娂-ØÂz°¬Gê™Ô3©g¢Ó£Ó£Ó'<˜ð`ƒÀˆÀˆÀˆ˜Þ1½cz[eYeYe­­­UWW“äyA¥TJ¥ÈCòâûO÷Xþ®ð¯¦p€ŸÖ ½Ñ½ŠP„*¦çs<Çs¬Çz¬W¼Ä~7"û/B¬±‹ø²XUôLTx!sÀë–ãhå|ÇAM¸˜Yãû?ÞÐežØŽõ`Ž£ :£ñ%š?wÆLÒßðó{§Ì&ùM®4Y:^j!ýX/èL“+~í’ƒe®¹žË}ÕÛW¿aýYÁ±žŸìEU[ìrÂÒ+‘+ƒÄß¶C£’ÙçGêQšnQi·s§"OÞr^Õ­ËîÕÆc…jjØò™óh··ö ´Õr$ƒDêÿ|Ø!Ì22“Åì&‹ÈÒ wÐÁ°ýúµ`ÿ÷½#ظ ü±€,x7£Ëè2ºþíüÛù· kÖ>¬}ã´ÆiÓˆ±#v ƒkXÃÆÐ…:Û–™Eâønb|»šz†Pšt'N"·¼n:ö@ñÞó]FJ<ìì—Yñm˜çŒ=i¬8®`Ñþ¿BÙNF‘Œ  .R©‹b¢b¢b¢û$öIì“Z“Z“Z³¼ryåòJ«ÎV­:+~êÌ83΄APüöo^y¬€¼Á¼ÁxŒÇøŸ6×:§uNëœ}©}©}©}[û¶öm , , , \Æe\þ~&ÚÏiÜ`7N1¯‰NÕî–5”…ç.}V> #Ù·L]y»šÇðÑ+S9*’3ÙÈÁCdÀíéê‡†ÈÆGX¡:  `ƒü3 gä_+XP¸XË[ËZKdac¡oktÞ(ÓxŠÆUµÁ*þšíÕzŠ¥ô½ÞiÍzÅëÊò*—^Xðìbþ”W“ïML"uk^˜\×å$c< òMuC'{ܵêìášiq¥Ž‹‰¿VœV´º±ÊP¦™:«R¨¹ß`–†<œFu çÔm TªÕ^ÎûP8´|Iñ²ÁÕ-Ÿç½ŸR´ùF؃zÝ®—ßOû˜–Q’ݬxÅ—ñe}«[ÊÇs1t¦b8fÛ’™D&á£gE×RWº‚æ¢7®á>²P‚rÔ ¨ôÿ65¨A ¯óæ“øTv¬ìXÙQ­ƒZµl$ÉFª>T}¨ú°R£R£R}уIvÊWpN4Þk]ýBãu3 ¼mÜLž_]*sg?¨´­Ÿ±¦èæ¦û¯£?÷eôÉ |âpQÔT‘V©²ï0àão²<Q$cšAf³*fUÌZ¶bÙŠe+2Wf®Ì\éééJCi(µÔ´Ô´Ô\^½¼zyu¢$Q’(aü?Æ»Ì]æ.#áç#ý+æÉ_~ˆ×‘7Fc4æ `` KX¶_Õ£ìöû@ÇAÇAÇÁ¬Ð¬Ð¬PïžÞ=½{’Ç’Ç’Ç-‰–D+ãPÆ¡ŒCþþþ$•¤’Ôïg»èçlÜà<ÙQä2Ó“s£a\iѪŠ÷U‰É80%¡z´öFvžhK˜…ÕQrp€!T!F²ÅÇ:…ô ‡÷x÷üE*M+}Wšý<í9^¨¼7xÿðÃ0‹MŸ,–Í220Z¤æ¤vHí¬ÎM+Õzrí :»Û…Xêå%}6/°x³ Óç½Ý‘N7 ^ûYqcËkÅÉÖ³µœ¦» p³ Ìwûª953ržd3HWýõVõŽ74ÍÔ ¨í6¶2¬c¼C±¢ì¼ ·y¬n÷ÿ@_gvËéXü)ñäãQ9ç“Ö>=”Óçqÿ7I7žxg^X'·G©ˆÂY,øcÕÁ°'É66“WØKQô¦Ûh)õÁtà œF-ä ?nD üªQj†èŒÎè\á[á[᫬¬Ìö`{°=Ô/¨ŸW?[I*I%aÖ‘–$›+¡ïi/õɪA¢Àµ¶Ñ·¤Ë´Œ´–K†’7¬*óà¨û¥Ï­¸t¤KúvÓŠ,•wåd4Pƒe¨D­0ðÿcxù‘7qQ Tè,:‹ÎR8SÖ¢µGÕŽªUË^™½2{åè½£÷ŽÞë8×q®ãÜÙV³­f[­5]kºÖôèæ£›nÆflÆf²‰l"›è:„QåÏì |nF0‚º£;ºÃŽpÄb,ÆbÜÄMÜTÌöáŽá:Þ:Þ:ÞzMõšê55Ñ1Ñ1ÑÑ<¦yLó{”=Ê•_”_”_„¼à¥‡šŠT¤*Žøý˜øyÁ½2p¸Š px’²PYyJ¸;ô6<1ç˜ ä4‰3nª­±ë- R‹Yh‹&˜ƒkHWôÃÛáÕAÔQ8 Ä@ D&2‘Y±¡bCņWx…Wø8ðc¿½Mìù²ñ‹Õ—)¹»?½ÈµÎyõÉôÓˆW·>Îùâÿ ñÛÃS¨öTé,rv¶bt¨ËÊKï~ãÓÎffCŠÌpH¶Ú¦×Zwæm ‹S¢ULS@’κÛ°é`pÖuÆõD;'W—ªWEÆ‘¯¿d½ùöjÌÇ‹_tSû?—ä^¼iõðb–GZÉó©¹gªíjÕä×é1 „P@[qSÌÄDöëÍ| t'uåJ¸ñÔœ~;*¶&éï>^xWtEWlÅVl­*«*«*ヲ§ÙÓìiÕªÙªyüsƒŒ!uÈ-hцôS|ÏAº>¥îE–÷Ð@vPžû*þíúB‡ÈãËÛ]‹‘s ]Ä“UÈÃ|ŒF¬|ðw‚׎óšr^Ó<s0‡1eLÓä±Éc“Ǿ‰|ù&rê멯§¾ö;ëwÖïlœUœUœUÝuÖ¸Ön­ÝZ»Ê!•C*‡°!l"¿)¿)¿©èŸ(båýñb«²ÇŸ Œ×¦ón£ð€‡rsÉlÉlÉlãCƇŒé/Ò_¤¿HïÞ½*¥*¥*¥r¹‹Ü¥t{éöÒí¹+rWä®(é_Ò¿¤¿è±è±è1ŸE¸¢wEïŠÞ|o´”–ÒRaºA4MÞò娸àóîk(]`3D³&~F³¾n5Á3¥ýV4¹o¿Îj‰bþœA%Õ¥å€€ÏøŒÏÊMÄÍÅÍÅÍ­¯[_·¾îËú²¾¬ô¼ô¼ô¼TUª*U•n“n•n Í Í ýèóÄç¾O¢Ål óDuU5?U÷îœ ™&ÞÂ6ÕߨũºH¥žFVsêîwèÊ¢åVÞÚí_2€«zéíhJï<÷„Ò;Ïǽ¥4eË8GJïÔ·ŒÒ[7¢*Ç\̵ýãÁÃk?²cvnk‹Q¯:NrWñ™áhjrÁô‹~²zñ/ÀFL\²ïI41ÁNTã2F#‘† Ì ­tC üIlÜþÇðvÌ—p —ø £^F½Œz… 6*\5\.±?gÜ~Öa<ÚðmÝnyÞy¥·cbêÉz\+»°2ôÒÞÑ*Á©n^ ù6ä.éó£nRðÑú£øÉ˳€YÀ(vñUžª }úDº]º]ºÝ7Ù7Ù7Ùæ´ÍQ›½ª½Tõ$Ç  Œ?éwÒèâÚ??) CÃiÕmÒýOØjNß÷‚¯î1Ñ\ÇÖ¯ß×?xl ¥ =cSšT'ö¥I-cÓ)MJŠ3£4)66‡ÒäÍq[)½QõñÉ™!}.ïõž–Ù"x¼Iâu,Ìßó²ÕjmõL•¦ÿbÌÇ0kÈ\v9s”,'HÜEG4°àþéîApø-¸‹»¸Ëµ[j·Ôn2‘LF ’1ÿg®Bcf$‰f÷37ÈFr—ôE¡œPfд tóÀÝ!î¿°x]¦Z¡Z¡Z¡_¹_µ ß>:ÜÓ}µ‡†Ç~MmõÆ’W)Ö=éöŒÒ„º1ç)Mž7éÄ®y7Ûìf2_Ò“ a&’hÒo1KÑ³ð¤ø³¡+f¶aÓ˜iÌ(¢ýxßô¾é}sÿ™ýgöŸI·H·H·¸¼ãòŽË;ºLë2­Ë4ånH?ÒôSü¡ãÿ¿ÖùÞxk bCÄDLÄ?m®Ú[µ·joËDËDËDÏsžç<Ï5©hRѤ"¢wDïˆÞÒiŒ4Æg‡ÏŸ¶}mûÚöåÅ=2ŸÌ'ßJ>û°û01Q! ê@:ÂdùU0ÓÉXRŸ/”ØX(¾5•öÙ#˜¹¸Ÿ¥s+iÍòk&óU¼å°$ôý_XiÓ§ º  ±$–Äò§ ¯^7¼î2Ûe¶Ëì&Ó›Lo2=Ì'Ì'Ì'ônèÝÐ»ÒæÒæÒæA³‚fͲßb¿Å~‹¦³¦³¦ó7]ð ‡Óp'H YHÀÞdžÝ¢æly÷ÏOSÏ]³J²¾%ãûÁfÆÜÁƒŠü™ÓÖ Eí,_îߣÝ/Ò¹Q{(½S6.ŸÒäqë)M7‘Ò¤)±_(½Ý1F—Ò5Q™o?ï1Ðk¯Ë´5- Çèvòwï&äQme`:]‡zÑ/Þ0&çI+\gö1 I2éŽdœÂB´ƒìK´°Tÿë­ ¸ üô@ô1ļ\ç9Õó’çÆæ§›ŸkîòØÓÂçÊò¡cç4«Giˆ˜sÜ®7¢Îçè½5dSýÖVbݾò™Äâ…¢OAdÿ3£¬-Ž@"ØÑìhv4_aqÁâ‚Å…E¹‹rå¦ÎI“:'qOâžÄ=±¦±¦±¦jÕ:ªuä[2Ý™îLw8Ã_åœ_/Ä+ëÔÝà7Eˆ‘(D!ê§ÍÅÞbo±·áYó†g—:.u\lll~3üføÍfëš­k¶ÎßÕßÕßÕá’Ã%‡K†ï ß¾cv2;™?stÞ»c5Vcµ"¼ãOÏJàW]ÇÄYP‡"ç³B£aŸ·MZÕK“óœeÝ/žÖÎËtcEqÛSøöì*R@¦ü&ͯ^Ñæ4|p~%t5t5t5œú;õwꜜœ **ÊkâÃ:„uëð$àIÀ§h§h§hí%ÚK´—ü̱x‡Z¸À/±ýÉ%Ò·² E$Šc®c%ºüÒÉÚX›†h‡Ïò:jÅOé‘èvòÕ|YÛáyýW½Gý¯¿‹2§ô¶]t-¥ÉFq-)½³yÜ JS—¡4ÍküÊG­|T»½A»c׿žkã3¥[ï<Iµë ÕÛ*{Ù½¿xÕ$¸(Q{ñ`m˜^¤/ÑCúHŒ"Ëžp+ü·SRÜ~ ¼á /å Çt‡™õ77ê×èQãmSÛ<ÛÔ˜ë%øjîÁÕ ‘]9÷›^ÑIØÀ»Ö|{&ÿÑ€ø(ðçç'Ofò<$ù²ÊI•“*'G{Œöí‘”‘”‘”‘Ú;µwjïå6Ëm–ÛXž° ¾ëþäºv-*I=êu7Ê6p½aq¹a¶­Žáš§êë×5¯g¸K£‡¾›¡“F}Õ!5.5„~±zTÃçf3Û‡4Ya´*¿êy­má’÷U*)·ž&|Út}xú‰\ÊÍgg?Ý|_•Û¥”äX4)_!Ó“u1¿`À¬ EĆŽÂ z3° w°˜îC]‹ãx€ƒ¸†—¸Œ»x/D¹ø]ùGœ1Àj¨b7³ÓY†>åZË«4n­19èâ§ßhT®Å`“Ïå»ô¼%{ÙpF¯vÍêðÕSDK¿­q­Ãt%äÞÜÚ ”¢â/óû{C9œ4 A]©+u%±$–ÄÖ ­Z3tÕ§UŸV}ÊZ—µ.kÝðžÃ{ïjjjiagaga·ôÔÒSKO¥´Ii“Ò†éÏôgúsé\:—®Ðèó/¼|4@ÔC=ÔC‚„‘‰‘ŠS¸‹»¸«V¦V¦V¦Ÿ¤Ÿ¤ŸdòÉä“É'mV›Õf%êu‰º¬§¬§¬gÑ¢¢EE‹ c c cs5s5s5+NVœ¬8IûÑ~ô«éÎK¼ÄKd#Ùè…^è…ƒ8ˆƒJQõ‰ãˆ?ì`‰\L@wFL6’þ/wMîÔ”Ò9¤”.˜?xÓ‡>&M‡òÍEjŒ ™]¨ÿoNÊï¦üÛ¡’C2êÇÔ©³]n»Üvy€M€M€ô’ô’ôRèÃЇ¡¥[¥[¥[C;…v íäúÄõ‰ëÃDÃDß‹ó Ÿðé÷Yþ”FO`>Ú2.d7ÊØ Ìy²šñ%‡ÿU^Õ'*/Ù"ÿ¹ ÍnDZ·«qµI2nlx—{u7-è)w¹¦5ÖÒd³¸Ž”&]ŠÓ¡4ùZÜaJ“÷Ä­¥4E6n$¥7ëEÉŸ”ìÝçÙ¾ÖÓO·¸4á\Oïaás¼N×±×®Ô˜®²ã_<5ÂÉYBDV¬%¹ËÌ$ˆR±=¾y¨(!hÜþ+þ‘¦G3˜¼!. !£qÈ!¾~nÀÎfÛƒ²ïPJiÂ(ùlJÓ](¥ô@ð=;ùÚsTöÌz&¹J& ì†öo‚²¡ /øV¢•|…;çιs{<÷xîñ¼ßï~¿ûý.§]¾ù~‡;.u¸ôcçqž­e‹²Ùç¢QÛ]. ÿ™C‹‚EÁ&–&–&–N>N>N>A{‚öíiú¬é³¦Ïšš55kjð)àSÀ§úï뿯ÿÞð‘á#ÃGŒ+ãʸþÌ™ó>Šë±ëùDœßÌyß|mÉDÎðå¤7ÃÅm»Qùœ‹Ò(÷aP£„©C^´ö!k˜:Ìp|F8ã&Æ¡ÿp¢¼Þ&0A´Aä!yÊM$·$·$·¬3­3­3ol¼±ñF©ÔGê#í.í.í.夜”kò²ÉË&/=k¼êÊÕȯÿàrNýœ Í}•)~,Äû;Á(}`0fŒcÆi0Ä`ˆÁøÂøÂøÂ´Öiþiþ‰Ë%>3vt»Ñí˜Û?ß%)#i$Mk¼Öl­Ùö‡ìØð]ä»ÈwQ¸f¸f¸fó}Í÷5ß¼1xcðF>üº™ª™ª™ªä”ä”äÔÏtwWq-Ñ-r‘`úò‡Á‚!Çð ;a3Ÿ½4`BË…”Î)PFåsí¼|pa”¬Ãk] õ/j±Š 1 ¯qò>se1z6a.â".*7Ù‹ìEöV{¬öXíñzèõÐë¡´´´tžtžtž´­´­´mhEhEh…·¾·¾·¾™™™™™™Š¥Š¥Ê·n²¼#Ñ2,Ã2儽¿(ÊóµJ:l¢ŠŒcELsÒQ”Ìnb¬É b…_¶bÏ#“±Ë«Ä!ÆDc´oǦng7™Ó 7Kù¸¾C÷Íå»/ÌYLiªýøF”¦î߉Ò;7–Ò¤Ô¸º”Þ.IéÍëÑß~Þÿb ÿ¡¾³&·j<{ÇÀ ~-:4êl·«ožzÿBCO,ðS˜Õ¤”ÔeüÈT¼Ål„à V?.7ãwkApøUüd%$ˆ=ΓÒ§•ëëeX•^léB‹_XIéõÎC´>~Ê9~ûCòTJ)½S[;´úÌ‹¯(èÜ|eÑçšï<¨É…zZfVúeÿüôÙL9Éæ0%ä,É$‘x‚¥åæo¢¡w$?š:œÅ* MbG1ßDÚÖ¡!–\›z¡‹µëŽ& »@iò½¸K”Þ>û”Òk¹CUÞ¦¿O½^œt…kÇõI ª¹]íðB;Ã^yøìгƒø~Ø•¢I¢IÂÿÍù‰›)¹B®+Ê5Íç…} ûrabò¹äsÏ (¥ôÍiJ)}×™RJ_Ô£”ÒG[]muÕ¿µßV¿­ ê6ðkà§¿@þ‘ºH]ôm$xÞ>Zéc;Ø —âO²à¾ôrYàJçF ìÅ›U¯ß„ܰIo{›¸/±¼h²\1¯n“ˆô/0é¢!]¢Kt¿ùÇ“ñd¼AŠAŠAŠÛ:·unëšø7ñoâ6 l@Øi¨4Tú2ôeèKÿ\ÿ\ÿ\Ûž¶=m{ªQ;£væ›cÂ)œÂ  EÐI刭ÿ.¼Q ¿Á*…',Ès2؇Ì;rHt•]ËÿÒOÕ‚TŠYι¸î,ƒaÃ϶³ruÛi2¹Qó†÷¯m~ØË¤HzzîðJ“¤±9”¦6ßÒ”¢q])½siÜ}J“Ôb÷Ë"®ÆŽ9úåð™+#v%NY“Öµzþð!³ÔZnjÜÞ&¡ÞxËPÝAªÇTV±™?sxGØÁ” 'gÀ‘Ó¤%®‘&(Fÿ)åÓÝIºótÙίó¥NxF“—š/51³0 M†0E6¿7Ê’W-? ? 6a'°B;…Z„ZÈ^±lº¦4 ’¤"Ñ.Ñ®ì:9s&Ê.ɳåÙ‹X€ôDOÞj€n¡[èÌÁ̆ùÏÉ¿!¸çˆJWt0[åc¸Û´ŽF‰¸ZtGç䎘à&NØLZ¡,ÿôR–r¢-Ø‚-Ø…]Ø XÀ}Ñ}a kX/^8¼…(D–W–W–—E‹ ÇŽ3'Îg‹³%S%S%S-OZž´â3Ê„0g¼Rb°ƒÃh‘ÍDƒêc­#Å-¦Ñ*ÓÅþ¢fmv4µï9Á¯g¦÷›FÃ62ÝÈÏÊ´˜Ö•×È!Oüò8'gãìˆíç“§\~v"s€Þt$›Åê2ª\y&w²"­Ê³jôó/L^¨5}ÖtgÓŽeN¥N¥—Þ\þxù#q IC*§r*ˆìßüëÙlÀÞÞ›Å9rŽƒš8hbıfÍ›5/[V[[2¾X­Xãää*Z—_/¿Îx0ƒ™ÁPEC4DŠQ¬p*ýwå?éê¤d*Óz¤Ó¤º“飹ï¬Ì›.êÓ‰Ò͇H»åºÙ7áÛˆ:1mÈ¿ð¦Šò–ô ^fç§µšó4çiΫ§WO¯žž„„DØü°ùaó¥šRM©¦´—´—´WHbHbH¢ÛB·…n gÎ0œÝØÝßq+¶b«"?™²/öo±9ÅÛð↳L7Ò[t‹]ÏX‘ `á?ïÀUÛö„a¯(t¾äÑa«û„ÁMÛÞ^¹z@×¥£ÏˆÓœDÁnðbZ1­˜Vü—ýõ_ÔÑ˼—y/óVÌ]1wÅ\¶Û‡íCV“Õdµ"Q¼Àß•¯A¨Y°ð‡?ü•s‘¶¿ÞþvûÛ‰‰Á‰Á·:ßÒ¸¥#Šª‰ªiÔÜ;Ä;DäÇú³_ýÍ|á Wa8ÿºü+»RX©ò¢%ŸÐD#ŒNª‹ù"]¦FëŒè<€@ûÑ®ãÔ_t<”5ñ|U}èC_‘F8±ˆE5ªQ]6¥lJÙ”Wx…Wø8áã„LRLRLRÌDf"3‘ÚeµËj—™;ÌæŽA+ƒV­ô¦êMÕ›Z<µxjñÔ¬ì¬ì¬ì¼5ykòÖ` b â®lL“Æð„'f.5—šKMýMýMý³¤YÒ,)¹N®“ët]D ëÝßÞâ¼5¨á¯5§Â©p*ž ž ž £{î5ºéOzÇŽ«p¡4Cο.ÿJpÏGõWQ¯¸kåáê®Üzùgºl† †a=aŽîµ–’Pƒ*Tˆéˆ‡%ô (BÉ_xl”¾'x‚'x†gx¦ØNšŒÉ˜Œ¹˜‹¹•L%SÉd"™øØôcÓM̢̢͢Ì>˜}0û y\ó¸æqf$3’©×@¯^]©®TWj9Ér’å¤Aƒ>}Éø’ñ%£&¹&¹&üç§4Gs4çmñ±äù3©A jø×‰oÊÊ5U¨BÕ7åÊŸ|và¾ÐJ¸a-¼h–A†ZÔ ž¨  rœ4Ã5¦ s•0$Hײ€ÊAµóSñ¹HÅsäNßó!Ï zDe6›VWËlÎò&uÝVY, >à¦iéëlX÷˜­åQ£‡š9ú±†4Õö™o"3ÏÐ 1E{Ýåà^eÙ¬g“ðY •שL¨=žu3ß±ì~êýçÃso^Ú—öä]ßô¯Z}>ünk®géÎ/ ÊšU{É ßÆÀ(ÅxgÂÈpt)àN! o°šÁ:«pëpñy(,é(ç1mŽÆ¨Gîc úãL¹ÅEpô"Nhä:Ô¾IÇ;pþÇÚÿÖ¬¸­j»¨Ý(ì••¯¾w+L[qþð¡ÙÛÎn}¤]^]yµº Þ(Ø@f6Y%ïÅM§ý@p£}K”^£×è5~=ÿàúÁõƒëÇ‚ êt¯Ó½Nw›Ó6§mNgÕ˪—U™ÌLf&Ë©œÊ…•ìï¯eçEöýd?ÙOU¨ U±r³r³r›òfÊ›)oô·èoÑßr¾çùžç{9|äÈ‘#õKê—Ö/-èUи 1NÂ~˜JgШÀ,Ìõ¯Ë¿Ü‘ûUø®iÃÍ¥[ ÞWªÒM—1my²ü •©^}í;¨Ä9TɃ¹¡ô"jð °Wqço5Z¼ Ìk»çc>æc%Vb%6c36ób½l©l©lé‡K.}¸”ý"ûEö £¡FC†Z„Z„Z„êXèXèX3bFÌtwêîÔÝ©ç¢ç¢çRr³äfÉÍ¢9EsŠæpŸ¸OÜ'ö û…ý’{<÷xîñ’½%{Kö¢=Ú£=.à.üæÿ©=ìa¯HeÅ¿0´Fk´†7¼ˆ7ˆÓÁ;0ˆ¢%LcòÄ‘eL=²E4æÊYî,]WQÓ]îý ïPˆgoßu*t\ïs ‰'°ÖÇêIŒ¦º–Û 6´õêãÐÖ¤Ü%¹îÃf9u"õêǬÖHÄF¬–Æ{•ó¢:õ¡óQ­s}»;†Wzù·)n¨QôÅ·²ùƒy)ùë3d/)–Þ}ú""ïz‚ÅãÙ÷µ_eçµ®í.kÅ1pÿæ?s°Ö0d/3ÉN¼ÆGs™t(Õ£sè;tÇ' Rå¾#øUÈ[ 8’J†ã3é„:xÊåR'4¡(Ü;Õïe¦Ù»}g××½ö„9ÜV¯Ô¸%Êäøq½‡‘ïCòÖWþ°Æ÷ؤ”¤Ý]ŸYgoû¬WœƒmÀg±¡c¹L#¿ÍYÓÑ #F~GTù·vÆÜî w† &ƒÉà¬Y²d'f'f':uuêêÔÕFËFËF+¡"¡"¡‚.¦‹ébÄ!qÈ@­ê_¨@E!²o ÈNÃi¸Ö[­·Zo'wžÜyrgûrûrûò´óiçÓÎ/y¹äå’—ÆÆÆ¤éAz”¾.}Uú êP…*ŠQ„¢ÿpÇ^àOÿÜï#Å|±º¯\›++ê]Ý­ö¼ažÊ%UoPÎ…¶0Þ§IÕ&òšyIWS{.»1°òOYæòtç5ßC0C u¨+¢œÆ#ñr¹ƒÜá>á>oÿ¼ýóv½'zOôžX>²|dùHç²ÎeË"o‘·È[ë™Ö3­gº}tûèöA(BJ‘F¤‘I“.&]jœjœjœ0#1RþBþBþ¢¶ymóÚæ²7²7²7²«²«²«µ›k7×n–Ê e…²N²N²Nµµµ²Å²Å²Åµåµåµå2™¿ÌŸ èš@h÷˜{Ì=¦géYz–¾¦¯ékzŠž¢§p÷q«•>?ù×5Ÿa…xøËùzíÿòò#¶  s•‰%†Ìc2ŸØWß®= oœóôà§ äOñ ˜qêúcèt×ð”êÝÔ28­°Y®ââÞß²:ø€[ªå0»3:ýtWjl”ô%j^S9®vK¿†ScèÍV¿Ódqè…Úõr¿¢&Ë{²¥/«š?tÉx?àÂ¥Ôòwú)ŸV~ZöÞ0·Ké•“¥ «råœ)íðÍÍÎ6&¹tÝ}œ!]FÒ T‚±HG>+tóù(þštZ@@à/H‘i”€`:ÀŸmÄŒ#Óå8jįv–iÆouÌÇ^íjëµjЀ§ë.Q÷@ûê…µê+c+ %TÝÚ<òìýgõ–_>°$5ç“[ÁȲ+NL*ãBzs;8úŠÂ]¦QŒUWÙˆñ§„#áäyGÞUëTëT뼎ÿ:>˜“`â í í ÍV°l…%‘FÉ{2™E–‘ùÀV±þ.N±ÿDÉíŸ%}ˆŽœ%í¸õÔ‡Þ’¯çѦ&1úÏ´¦íÕ¶Ê5slŸNkÜš<1˜£¶¨m.wä½å #JŠj»ïŒ¿¸ÿQáêÙG¯¥_ÎøüñyÁc¸!ëÙõÌ!2ó ×è®·–êC /!Bª!û7'þ‰`A-¨FaF½žðzÂë ¥cJÇ”Žiø¾áû†ïµmµmµm‹2‹2‹2É2…Ld³¿<ü%ŒB¢˜Ì f'ãdœl°é`ÓÁ¦m*ÚT´©(S4¦hÌ’K:,éù óAæuKuKuKñSñSñSYSYSYÓÊ Ê Ê Å¼ç eþâü Á&â=>£DU5‘ÛÊÛç/+_Q=›Â<‡„{Îe6SªzXÒVÔ“Ù^=´V†îÄu`ø.Ê•àPB %h‰–h 7¸Á‡.hUЪ UAEAEAEè§ÐO¡ŸØ-ìv ͦÙ4›YÈ,d–Õ/«_VŸÞ 7è ±X,‹É²‡ì!$€àÞáÙB¶-¼éù@>xƒ7x÷ÄtLÇt2ŸÌ'óùÝv7»›Ý­R_¥¾J}bH ‰!ÌasÃÆ0ƒÌpçqmÑm[®#1#éh:šŽæÒ¹t.+ä ¹Bn·ÛÇùp>œw…»Â]‘ï’ï’ïâÜ9wÎKâ’¸d.Œ ã¸*®Š«âîq÷¸{5Kj–Ô,‘Ý—Ý—Ý•ÛËwÈ&É^Ɏ˧ʟËÏÊÊ2deIµjN×>“…ËûËfgÔTùìtí«䃸váXæ$¹loa¡¡;Ëþ¢Å|>ŽMM7HÝ=wYÎp?i£MªkŶl=Ñs•[l)ÀödLëVY¯×Ë« »ƒ†Î;— Óþ2³rͳ°wž…þoZå4+Öyà÷zå箎¥vxgvOú²cžeÕ’šòfÔ‰n…7¿–ràÈf!Ã1ãØÓì:º»±…-勊Ù|Q¶(Y4æAêPG*P!,7¼f]98Ôƒ-¬ÙL:9+÷à´©3|(4ª·–,Ù¥cÏãý5[:70¶=¢ïˆ'5ïkSšM»rã¹Qjs™dL›_´³or³‡.¯oçæB.‘ö¸m¸„òÕÜ$:ñ‹À‚ƒJTCöoŸ¹rÈéú€>à4÷ößÛoÙ‘²#eGÌך¯5_«W©W©WY$*‰†0„á$Nâ¤pÙÿ’hBš0€ Ø·ì[ö­\&—ÉeM]›º6uíµÿÕþWyO†õ©ëS×§¦Lr$YV‡Õa Kدú+>âÍ(ŒÂ(ÅÎ_ÃÓä#ᔢ¥ô1}LScjLùØù4’.¦§éêJã1 Ѓ†ÒÚ„¶£i]ŒÂi¨àÝFW%äæÉëÈä­+žWæU‘²mªu¸~ÚZ]ôØ;·ï绫nõÿ|D[O=F´Ú½žíBÝsÒD‹× =ê^ÔaúRgx³Ñm™x9¯Òšy%*QíÈVºÀ)Ü4ß.ÏÌuÛ!¤g½µzMh¤U|©|zµ4uÙsÍÜÙæßiøÎäþûWÝ>GgëÆTîÊhõqb!S•Z²²d7c%ß/¿WÜ>ÿNþyÙY±(G´E®,²óòœ  ø]`”öÀcš’RЏ“ØÄ‹ì:¾šmÔT[/ ¸a×}Òê^©Rœ'ØG럸IÜ€ âÖ¬Žh虬Ì ÉžN©âÛÁ®¼/ f¯3wÈ.FÒf´)=/¨CbT"µŠ£Ëÿ‹Ùü„O8/ƒ ²œå9Ës–ç–å–å–éŸÓ?§ÎËÚËÚËúÙ³7f?þï¿6ÁŸÀŸ~G½ e(#Èr@ÞJÞJÞÊýû!÷Cq×ã®Ç]×ÈÔÈÔÈÜÛmo·½ÝeÊ8”Áì`v0;8KÎ’³Ô¡1Bc;ˆÄ*¯,¯,¯”ϑϑÏ6´¡ø€Â0ÿÕùWûà Oö0§íƒÓËÞ·Êõ׊¶ :ìl^ÃU.®•>‘-¥Æ®v«|ŽöÊÖ(©S>˜Ä ké2 Râ?é…?FŽ‘c¬kÀˆz‰z‰z±rVÎÊÙ!ìvû™ýÌ~fKÙR¶TQŸÃæ°9"M‘¦H“íÌvf;³ÍØfl3QkQkQk¶[‡­#z+z+z+Òé‹ôYSÖ”5eÛ±íØvl(ʆŠˆˆ0˜FL#ÜÆmÜVì?ð:~^ëÏ—-a KØÂ¶Ä˜cÔG=Ôƒ La 3A—PrÈTbC‘2rÑœgyw‰;ÉÕå^Òûµïå\³—Ú.TôšÉ@';]*™d[e"W;`ßÄÌ_=Ëy‚U·v#M ê§›£õB|Àr `Ò }ÈA€8‘FkÏx4ÜüÐémeÎÓË3}%“ºHÛýÁñrýíön_¹Qp3?É895ÙcGÀ EKÙtæ‘ü5Ê®£E¨°¨åh ûÙÿ[”B7¢'ZÃÕcº‘ò5\ÚW¹a7«°MN‘ÑIݧ{=÷µhØÂ¤PÛCV0£ h¢v¥ë½›Yí×&Ðüè‡~/Î`|™Gd ©äÑZ‚»x‚LEDN)AÞÿ >L°.t¡ËûPM7uÞÔyŒ:u2:ïqÞã¼Ç¤a“†MFú>¤ÝEwÑ]ÂtøË ô¢E^“×ä5µ§öÔެĬĬ$¾"¾"¾Â¹›s7çnz\èq¡ÇÌi3§ÍœÆocãá•R)•:^q¼âxŦ›M7›nO<=òôÈ»&ïš¼k‚ÇxŒÇ|ôw” ä/ñï»ç_G•É@Ó„x±\•ªS‚Aåõ*üp‘-anʳ¹‹´‘–ŠÊD¶­(ìïê7Ð…º0¸¿ u¨CT“jR -hAKa…f S˜ÒBCp ·p H Ql¢ñf-FJc¥_c˜À†0ä{SD,„AD;дƒ ÿø(˜õ+E©ÿ©¿+º¢+óùÀ| §È)rŠéÂtaºm¢M´™@& $£Éh2šÉb²˜,•‡*UŠ‹‹‹>ˆ>ˆ>ˆ>Š>Š>Š>‰>‰>‰f‰f‰f©˜¨˜¨˜°ÓØiì4•k*×T®‰²DY¢,bM¬‰5DRC4IoR‡Ê `º1–d?Ù@J˜L WËP fŸkÆ©vE&Bê|¬üÒ™½ÞgW6âÒáÇmKê×X(ÊÔš©v˜}iÿÉ´¥Z KQ—êmœ$–úêÕuô ·IF¨ÏVQg6‹—«:0bËε:brY¥r@¼´ ËãgbcÝFs*ŠPÈ-iæÝnN»eιÒU¡Þ—ÝZ|¢2¶ÆkÄÛ‹YL&˸çô*–ãÒQ‚ Ôü4Ž„€€À¿ Ÿ © 5‘6DŒƒÄ#à _ε¢nÄŠt$÷[´ñ˲ïÙÃÞ«m°¶k®™ ±µ Gyy<Àöb>lö2:ÿýì†;—Ü©9ó1áù벪5:µ‘€áyN^ ަKÆ}¤hj”\K ‘ç^à¿;ÊyržœgÒ¹¤sIçz¼îñºÇk³[f·ÌnOâI<©õ¡>ŠàÅiHCš05þÔ(‹ìÎÄ™8ÓTšJS5£5£5£'˜<`òçÎ=œ{<èþ ûƒîK¶-Ù¶d[åçÊÏ•ŸÉ.²‹ì¢Ãè0:Œ7ÇU-R-R-’ߔߔ߬wl*PAwÐtöc?öcöaøLT¿Ï*מiÏ´­­­õõõeg²3Ù™¢Q¨@|B|B|‚ `ØñQññaö8{Š=/®'V}7%ŠDµ¢IÌ}6ƒ­#šÀÍÀ&•Â…¤U21_Ï»‰ÄìDæn]Æ´±F+Ƕ–×5÷»ä[ÏÕr³¦ÆKÔ-m+´îTn©iî|ºåÎg'¬µ;«~‘\Ýš4ÌWõ®ôûœWž»C>êÚ† gÙ—›NäÝšýZVêR1¡æ‹âÆË$#ñˆÔ…)´9oº>|üßPc' ðwBùN‘Âõ˜j2“|¤ÁIãéú#ù†!:'¬'DJ;>r¯×åhÈ2»L€il@nÃâ•"É]‹'sí¶xÑ|¢µÅô´óCR³©¶³l‚báÔd-ÈÙrù`:C0 ûÆ0¨úÑæ÷ù§#™H&’ÛÏíçö;::n¶yØæaÅ'ŠOŸˆMŒMŒM|jûÔö©-I $Ñ $Ìü‰çðWs¦.è‚.¤iFšÑ[ô½5I2I2IÒ¥¬KY—²wäyG&^Ÿx}âõÙ/²_d3ã™ñÌxN‹Óâ´0 Ó0MR")‘”xºxºxº¨”ª”ª”ÞvØýa% K–,Ä]ÜÅ]žÀ_ѯiD§"˜{eÎ\6–Ë÷quJTIGäÑÓXjj£-×(|ò(oq‘ž rüIáU믕>ÿüºóvï•>|æ¶ Ѐ†bÀ ^ðRìð¶tÊß*—ù¨´|ʧÚ_ø(§‘âÏ™/W¡ UÜqî8w¼†ÿ 5€RH¿9õÝØÝŠ²Ô V”÷ákÒçdAº°GØÌIö(Ó…mÌ3ç‚ gÌF¦ÉÃÏo‘¶G^P}2—Ì$3Ù&.ÅZœ^È«2¨W̸5Ε=W {&®)* ºD¥J¯ŸÇzoÃ:Zð^d—›žü¬ù'ÃÝ—Ö>;±ÙúôÈÇEÅ6åãk\ø…ÝÌ|$'9U:“ZQºЏÎ5),â…;J@à+ÚЀ%(G5‰"¶¸Æ˜¡ä´|×’.E€‘ήu«MoÚÿjcÛvOŸÔ•JŽªIXm@6š[`:[ðáuÞ¥Êüø.Ôï¶ß9î¼óŸ/Ñ¥ý+›ð!oH$S1À6™•¼-µÃÌU(»~w‘]±&WÐ ZÁûå\ɹ’såÅÍ7_ÜtMsMsMs¬ïXß±þÓéO§?Îçí–srN.ˆìVx‘½z ³ŒYÆ,ãÌ83άÏò>Ëû,ïТC‹-JG•Ž*µ¸Ïâ>‹û¼Øûbä¹Cîð!e303Ô©=R{¤¡¡QÞ»¼wyïÊØÊØÊXÅdv`‡0ä߬Œi@ð嶃ê.ç¦Ì:hXuäô}nP:÷ÙÀ}¯= î*–¼óÈÄ^aÜþ+È/|”“CÄHŒÄb,ÆbÁQl—¢¥Ä’XK‡;îIz’ž לˆÿñyíÄ-¾Ðøh+¶Í³ýƒ®V\­Ø¼ûƈÌëôìÏ íΆòðË "Ršø æ¥‰×b“)½Ý*Æøý¥CAƒ¢bçtëè¹Õ:Òd·VªrçŒ79‚jÒ°X‡ht‡Â½ŽBM |—ðšuÔƒªp ±Œ#9ø­Ù!¢ÎcCëÕ‘±#š=-ó½à<*ŸÒ$÷ØLJoŒ;„Ò;’q{²ËvnÚˆþ©Yz´íÕŽ+÷ 2dH)¢Ã/øbˆþ_nŠ?>J˜ñ!>ŠŠuÓ×M_÷êö«Û¯nÚ¿†Éô&ž0J¹šrÙåÊQ²Õr¹Ê%²“\ðªÆªšºêG„wÿ3~IÓüïî|ÄG|Tý—q—žˆ@„€¯á£ýð¦D¼o€La ÃêJ‰ž`¹ÌèßäFgŠN9vÇõSÀpiåâôÌú&Z§n;Sqø††©ZA¡'è_fΨvQÙhn>G';><ºôÙ¨Õz¹_8T~Ýý•hó†Ó¦ž½ŒùhøEÂ[¥'¬Â<¦ãNšÉõ¹4zkq éß¸ß ü]Q2G!«I0«ˆ'WåBéRXj¾Ô¨­ö²è]Ïxè_1ÅÑÅpáBµ[@íù€6§óJl*.Ê;î°8Öå~Új‹#6÷å/·}°+°À:`\Éf¼¥]±eSå÷©vàÕj‚ZÈþIj¤ßŸÙ˜ÙÌUæ*sUÞ]Þ]ÞýõÛ×o_¿­4«4«4s.v.v.Ö¸­q[ãv¹W¹W¹i@¦ݟ¥L¨L“ÇäqÑ\4íbábábÛ,¶Yl3­nZÝ´ºíß³Ïþ=û öì/`Æ{Žâ^)}šÀ&´7íM{#)HQ V V ægH¥A¥A¥B¸OÆ“ñ´œ–Óraø¿#˜DòQ˜"¸_²‰>‘ŽLCÆÃ¸Òä¦ÉîP;id˜e£¶‹‚¶ú!èJËg':pžÔB§äËù²‘'(Mzg@ibFìVJ“Åqí?«:<|äú±±a]¶¯ÛÖ`Ê7o@6£€”Éx SèCj@$èáþvw:T¡=hCƒ©e:‘qÊMLÕ ì4ïÍsöCHØÇ–GFMiJ—qç(½±hìJ“râ"Êw\:>fþ†ñã÷Dô·Ÿm™¬Ÿ¢ÜÛ–YFÖ`!F!¦0€¦RöÔ¿À*Ätgº3Ýùóõûì÷Ùïó5ïkÞ×¼Ïë×;¯W×¼®y]sè@:Œ£Æ¨ ÓêOÒü"ăxðe''§]I»’v%¥?K–þliÃ¥ —6T®:\u8øwpw”ç¡aH Ò‚´piíÒÚ¥uxhxhx¨Ù,³Yf³-y?´¿ÂìøŸ®„8¡jPÈ*GÿºNÙ«¹1³ºN¦tö›þÉ”Îm0°Þy«áŠKApøŽàSI_Åe\â+l3l/Ù.k6¡é„p÷Ð ¡C_ºñxä½ÈÉFé ž˜ÜÜrnB¦³ žœÚ7<€Òd‡¸v”Þ¾Ó‡Ò¤¡±Ùe«ÎÏé¾nXÌhéÆ`×[ÎßÑÖ0b6 bO‚ñK¾Þ¨áC@@Øš Ta;³Žsèþ£‰~´N; ÝèÒn•*?è±ÖœÒÄ·±Ó(½¥-¡4¡{t-—ychô«½53 Ûº[#î“jÒk˜Nä±STñž$E#´'x‚'¼ŒîtÝéºÓ‡9rÿÀý÷4Jj”Ô(‰÷,bz1½˜^ à ? Þ7ŒŸ‡IgÒ™O•¨®®®®®¾´biÅÒŠ#Œx0bß´}ÓöM3n<Üx¸¢}) ?ÎX $Šr;´C;~½MMM÷màÛÀ·Aè”Ð)¡StzëôÖé­h9£1Z¸ßdžâ8_Ö^ªÞXÍ7=cÔnÓª¹M¼£tNÁ€Š³çtl©°º#'‘]‚!ðÁg+ìƒ>èC²I6ÉòÐñÐõ0Þ”þ íö:l¬ô½Ë#—Ž (ÿ¨á;[Æ`GüÑÈÓAEù NOi¢V¬¥ %±ª”¦¬çXnu¡ÅÈC'zÍ7j«Þ´²‘g‹D)è­ÜHÕ"IŠ6pQT‰!#\?)ʶãúЇÇ&Ç•›0k˜¥ÌºA»ÚÜwO|T¸c[ÿf”&'ŽEé§cÏQšë+/ºîuîÄñE ;í ëå=Ä&û›z’{D,!®8‘è ?Å|Ó¿8¤.©Kêòåå–XþáᑇGÚwhß¡_#Öóá ma [aÒý0J3­3:£3™B¦Ånj̇˜1î ¸7àÞ€3©gRϤ:ntÜè¸Qq}Ÿ‘gä™â·?}õŠD$"y)KÝUÝUÝ5txèðÐá~~~¢U¢U¢U ŒÏ™*ðݱCÑ™¸`¤ˆ !äÀ­NƒµjOé|ëAC©|ÎÞ—SvÚö)ü`‡:ä> …dËß!k±kù¢z¶z¶zvÀ³€gOC¾„| )’ÊÃÄaºVÖ–ë->áîÿw³êeÌj^š;uP‰_ùë&{ßöCi’NìJŸÇÎ¥4qCì(YÏë’±ñ—ì—FuôkuÜÏ¿®¿Ú^‰¡H[Ñ…=¬ MrÈ8<'ú¸‡‰p„5ôß /Ò,"°? 1cÐ ÉvŒkd-±ÆLÅ]c©:YeU»¢ ûõ7$¤­ÓëÕÒÛKbÎSz«*z ¥ úÑ·)½9,&þÖ§5z¬kyÝ¿}½Nè…Ù_§69Cêa43™”PEÿûwšý,X° ‡û}؇}ƒ& š4hRÚÑ´£iG×Z7jÝ(ƃñ`ÆAB„ ø‡Ñ]Ð…iÊ4ešò=Ízšõ4K¾ž|=ùúuóëæ×Íž< Pˆé|vsÅo™_xÉä3é õ õ õÃ÷‡ïßï9Ûs¶çlôGôW´ä}·¾;4 ±(±# ßç³ãúŒiº€Ò»¡tNØ€aÏ£ÆèÎK\°ý` -hƒ'ðÝñð€/š…š…š…J‡H‡H‡„8‡8†8ß ¾|S[¦ýNû*ãHã)!GH{åÌ iôŠu›èùüéüíú.¤4ác¬6¥ ƒcÎPš¨kAéͪèþ×¹UÎ]Fm1Ý)™YCŠˆ£r?l/f1Ïh%Èùæ •#uüvüäu‘¹Ë¸’Ä wÐR¹¾ýÚà…·oŠVOè.£4±M\Jo;E7¦ôÖèA”&iÇV&0ëM{ í¸¦É— Ñ”¨1šßô|†Ñ"؆™èª¨âݸÿ¦£JÚ‘v¤_á]å]å]uçÃw>œñ?ãÆ_rGrGrG¡©íè!LÆß>ü±¬`Ť1iŒ" VˆAˆAˆÁµªkUתRî¥ÜK¹×Ë»—w/ožÊ\e®¢Z Å×iýÁ¿§Æ` ÆðG±N·N·NoÚ±iǦë×/®_¬0ª±€,xoá‚|§ˆ²h@sï‰nþ¡”.Ð<šfÏnÛE&ÕÕ^뱚®äžÂšë f"R7ï~IåãÙóA*õsëçÖÏ•fJ3¥™¡¥¡¥¡¥Þ»½w{ïíííÄ,Á4At‘Êöb’‰Ê]êßÐVQ r¤uzë3·õ>HéÍѺ”&=г¢4i~l9¥7¸¨[÷å[Ôzµ‰ä:tu›¡W¨5J’ Ü»„9@âñû160…¶"Ó¤€Àÿú.¾ Í60ƒ.^á¢D*¬6ùÆIÔÇÍ)Öbé™î‹ouz,Ó¼Ñ?z¥ ½cúQz34Ê”Ò$¸.ên¿ØŸ úЦÐ#\c•š©ŠâžÂ0ØŒ.ÙDÄðÌ¡ ¨~?ûJ|žTÞ–Ý4À4À4àªùUó«æ×]®»\wqõtõtõäc˜@„=·ß e‹ö¡d(Q„e¬—\/¹^òɺ'랬›¾,}Yú²‰ý'öŸØŸœ'çÉyÆ™qfœñÏñüÇûèŸ]¯É˜ŒÉ|Ñy¤óHç‘Í2še4˰Xb±Äb‰âæb.æ~c/ðA@@Ø£¤ŠÌæ+Öx´÷šG¹ùõ½å.ÎÑ/åSÉD›ùö–FUú½ù_(GŠ0xß)±ˆE,â‡8QŽ(G”ãëëz2ôdèÉ0Ó0Ó0ÓúUõ«êW)ÚoÃV>¨$D䈻ì f%™¤Ü¥8€-dú žÜª°akV6ïBémµ1¥‰-cÝ)MX“Fi’zì†çvïK£˜Î#<œê˜¯Ñ ý憮ƒ·˜Ã,$¹ÄÑè /Å‚(/ðŸ¡lc}è0,YÒ1\¹¡{Výafu7UL8q´6õšfÔqJ$1î”ÞìBiò鸬Œ´ƒ…C ¢º…úh«]TõT™«Ü›ÇÔ’;HĶ]îþlÑÖîáîñEµNjÔ:­¹þåú—iÒ¤è_§þuàx0ñL</LÒß%í8ÙGö‘}p \ô“ô“ô“¶îݺwëÞô÷éïÓ߯J]•º*U}§úNõð†7¼q'pâëûOæ3¯âÓÆ` öééÓÓ§g³ÎÍ:7ë¬{B÷„î×~^à^—廆mIRÉ ¾?†Hzˆ§²Ö­û[Õ­ºt™¨ã ÙÓkýǶ¦4q`l;Jׯ§4ñcì〉ã®^´zXn` kÃ]šªÊý0kI11g<ÈT~½Õÿ¢±6~_La+Å”ÌtfzŠªÄGÅGÙbu±R»X³s†kµ–êŽ:!=šï~Æ~äDJ“Šâ4(½åušÒ¤AqÖ9ñÇ]†_·½ç;ß’:ëM}u¿É…LjÉž>ž>žP‡:Ô™L&“Ɇí7Á°`0EÀßöí Ú$öKì—Ø/±{b÷Äî­¯¶¾ÚúªâÒɉœü‡y‰/ñ%¾0ƒÌ,o[Þ¶¼Ý|EóÍW8Mvšì¤°zÇ0 Ã08ÂŽÂÅù¾W‰GD ùrø ‡UÖ%5Å3ô˪™3#¤¯;¥ó“‹Îºæ¶’o#Šb“g¸ (XX]èBWu¨êPÕ¡~[ý¶úm u u u’ÆKã¥ñvjvjv_3ÀPlž*ëu”mh@¨#r“tE³‹T‘zʇu‘Ô}m°kýûØ]a®]Ow~Ò¤§qm)M‰ÙOiRtìƒ/GÎMÜr²ûü m{7ÜbÎâb ^†h'&€C-á Cê?¦|ø«b hA oÔÅzŒC rôÃ[v!sŽ"—‰üôGúëµ3ÔuÜŒêÏ2WÙÒ±YÃY·Ýj·ÇâýqJ)}K)¥©£(¥ô­É©¨[^x!rø¬mõ'hu¿¡±íãoÒÁˆTXòW°ƒQ¦ÐQ¼<3ë×À‡öhöêÓÕ§«OßôpÓÃMŸn}ºõéÖZ\hqoÈnb7±›„½³ÿ¼9ŠH˜¶L[¦-_íiìiìi|áò…Ë.ß½p÷ÂÝ Ãû ï3¼ÿ-s¹À\ÀXŒÅXÞuøß¸"|`Ç—x‰—|Eýµõ×Ö_Û¢E‹-ZØ<·ynóÚІ6 'á$üßÐâ ü]!Íp?ðe—f ³*¯L¿Ý·[uÙ ç¾þ´t‘åPûY‹Â]½v€*ÔErf;‘ K„€À7Kó\Á¾hðÑà£ÁÇ~!ýBú…†††š„š„šô6èmðÕ<à1}aþÅ%^¢¤% ‡7¬ÙžÌ2IØÊ \©³Yïtü¬HIÐåì5Gw ™NiÊ’qÍ)½½;&˜Ò„O±b.ìšlìâå³&´Ó^5°»=éŽlS’“‘ÄõG3 þÌAþÏ«ä6ê†z0#ÛIs8ùàä{Y÷²îeÍן¯?__e†Ê •dÙ@6 9?çýw_¢Ú  Ú(~z…\!WܪݪݪÃmÃmÃmsssŽ­å(G¹p¡€9ÿ}BsÊ~±yÉ‹)E½ÅÕù3†ö]HéõaÒe“[°>]`âõÌ ÆR6ÊËôFl„"C^ݼºyuó¬ììCJBJBJü²ý²ý²UóTóTóà7¸a6fcö¯:вè¼ÃHG&%d ^)7¬·ÄÒCwàtÿþ}«~j~løPJfǤRš³›ÒäñqË)½q!jßÍŠU&]zwÌ ^e?XÁz“wÊýˆ±cK<Ç E•:T[ä?圠0‚9Nºá#[Éê“B‘kN~á—ãt†jšIJ›K|Ëì—ÆŒÊ ó¾"]~½s^®Û‰)#öQšð9î¥wzÇݤ4)8f¥wÚO8DéU騂™ïpÊáéqJ)}r‘RJQJéá–¯½VD°f{²í˜Û¤'ä˜1èŽÀ¯HéÕBà?‚éÇôcúñ&y=;÷ìܳó´;iwÒ¶>ÝútëSõrõrõ¯bܼÁaÄþC”×ð$$!‰w V×R×R×Zí³ÚgµÏým÷·Ýß¶}äö‘ÛGN3œf8MñÓ6¤ ióõ‚ýGºðEX„Eü9¨Bªðëê×Õ¯kðÀàÁ5_i¾ÒüºÂó»»Sþ‡ë[¡”/Ö@^(ßWò¡v•LßD.ΗôƒÇq]ŒÝ4»ªïG6,“ߢ~\ÌE,ÂTœÂ a¸¾k((¨bɾöÏ{ÿ÷þïýußë¾×}¯7Lo˜Þ0µ®j]ÕºÚÛÛ?ñxâñÄe(Co×øÎæ§p øêä7 ‘@Ê ã1y@úâ£B“ÒWŽM¿„ÍÆöûÉXSsÌ0}ë¨^¼Ý[÷ˆ OqhëÐÈv¡À¾`N©ym¨ãøÌõ†EÆýW^ŸíWÇãÒŽí½ÙýµEá„ÒñÕ6~À,òDá)Ó¸DY„b9ÎâÿÚ»ï¸(Žÿ௙½½ƒÒD@ÅŠ-öÞ{7*bì½wc‰5–Ø+öQì…"¨Ø+( ÒÛÝÎï=óÁ_â盢ù˜8OŸïws·»·7;»Ì;ç=—‘¢ËS£…Æ+Â_"5¤º$ƒ 6c Z“«dÚ¡*ÂDWÚcÙ8Êš3'”ÑBûKÁ›ç›D¼t¾kÓÆhqå·±VÝê—¯Z½ 9T¡£Õ++S“ÕªAt¢’Œ²­ä :‰ú€0 ù@ ż—-_MÎOMÉ|µ$ûô1¯s£î,~[dý¶•ë5¸¦¸&bðƒ¾eå>£+ÞÓšjÚv³Ž°Ú‘ýjÏëNdYCF¡/ÛÎÎëH-D~bÿJ}`Øvïðïâdq²8Y^û¼öyí]œ]œ]œM_˜¾0}‘¯ÎWç«IÒ…ta¥nÜï"Ý·¥À¤t¤#¢‡è!ÏâYü·fßš}k¬ V+Ÿ¹?sæ>C>C>CþæÎ›;oîBRH ™Š©˜ÔÞV¡…(üÃÇ ¥€d``ò{ò{ò{ú!ú!ú!ù¹ù¹ù¹ùÝò»åwÓ u]õ>#å¾V]áwiQþLwÞÌæÝ†ˆm¦Dt+dlf­^-]êѸa‘L%k#›­»«Xc3fòÂã¸ßpGqTZ4¨`PÁ Bȶm!ÛÂÆ‡_'°N`À²[Ên)»E·¾Ý(åñý£Jïóƒ,h89F@6ºïCw$Vv&'õ6vlq®Ò¡¤§ët~ÍØù¬ˆï»P/b'cç¯Etaìâ³óâÜÖœí8sø¨6wü̬ÒM{ê‡~ðg¨9 ¤ëH1qÿè‘pÿ]é>”|Côp@hCW’Ͳ½Âú¤Üõ¸ícÕ¤O›¦›*Xì0äB­‰ñ½Ü×uYAߟ†¾aìò³ÈÅŒ]œ1…±KíGLeìbâˆñŒ]ˆØZ2÷|éõ´Ü|kéßúן(Ì€ÕçVø®ð½ž7!nÂÈË#ÓF¦‘¤=iO­©5µÆ¬ÁƒûÉHsmÙ(Ù(Ù¨ßíønÇw±–±–±– n6¸Ù@nG𒦤)tÿ“× +\áJi Õ%sìnÕݪ»Õå]—w]ÞufÄ™gF„Z‡Z‡ZënuCè:°€ÅïJõø1R<ý^ìÅ^iÙê‰Õ«'õóëç×Ï÷uñuñuÑ­Ù ÝПß·?Òãž"”H‘´šmâ"¦}s½`zÑò“Yƒd‰÷ÄÑ&çU?*cÕqÊVòïªk”š †Pøb /jŽ+Ej²Hn§` ¦äMÊ›”7éžé=Ó{¦ZUhU¡•ö¡ö¡ö¡óCç‡Î³²²Þ¹½s{ç†}؇}Òp´ú_ÿ;±Tow<îá(°ÆŒâ6ÌÑ«‰ÚÂ3êKÂ_O{W¯ ó2D!›GŸìz'¬éºà’r[†n“QùJå–ný¬&B™—ßÝ slüàµÎöÝpï6ã*—üˆ#æ·Ü~lxøíMŸçaéërwPÂÏô&ùI\"z°wì)<0 ·‚·(†÷¶þ<àKTƒ'l0­@§Jä"H °HÛXôd´`ý° `@(4$Õv­…›Av¹vÔä@ø¸j\5Ø]åûÅ.õl-v›=3^ª÷P6Ì­¿ö<@g“T@AÅ åÚ”—oêä<¾y2ejæÑ3Ž×·¿wè› ¹÷¾ð|Ó4OýîqNaÁ Ä Œ €a#¼OºÔa ÑšËÎÉÚÉ~*UÜ­¸Ó–s;ÂvÔõJö!>ä›ûßüæàé>§ûžî»-v{ìvâJ\‰+™ÈÄ?P‡¹IG:Ò¥2ÔiŠ4EwËÜ-s·Lùíå·—ßî7Ào€ß€cËŽ-;¶ ×p ×x™ÿR)  ä¹ Z‹Ö¢u˜&L¦éy§çžw¤uVì^±{Åîs¯Î½:÷ŠúR_ê+žOˆ'ðoðæ/ƒ4ûé,Áh F=_=_=ŸMgÓÙôÜðÜðÜp]Ö2éG?³œN=¸£,€ æ nßÈnöalÚ¥ë›:¨û ÛÉúm/Ø_051ª.mDrˆ=žðÂã¸ß $r‡;ÜuznInInIu¼êxÕñªT+¨VPU÷ªîUÝeÁ²`Y0áÇ™ý•þiÛRqÆäiŒ3ÂRz,øà`­épòM—#õó<OŽZX»å*Æb~6ž±‹ŠjÆÎÝ~±‹ßôºÍ¾â~Ž36ö.®>³bºóuó3|âRL@z–Z’*XƒH¼Ÿjçë‰u.ýÌ! óÑ…ºÝÄL¨G'’ d))ƒiÛÔpªÁ<=³ç+·rd}”ßû¸l­ÁñH£›ÙD6‘MAÅAÅAÅuRê¤ÔIQOPOPë†Àb8†c8?Ü{^°…1C7T„03¥aHÀØÌy½¶Õž¸³KlQ«);z,°*³ÜJw;¦Éâà ã>ªôŸÏa†aÒ¢áNÆ;C¯‡^½V?¬~XýÚåj—«]ÎöºíuÛëºMõ‰>Ñ×e(Ý+ó©þ$—ž«²êÂM¸OÓÉÖiò0 »ï›Yfê!õ¬ûMoW:Õô[cÆ.gGÞgì\üð³Œ]ü~DŸ"½“š!žkjR¯ou¯h5ïƒb¸Oú#‘ÄV¸ˆGØŽž üf3ñK>ƒþðD¤á(F‘•$§È)ÒgÈJâ‡}€åoíÀé¥]kÓÛ¡W+}Sfþ¸ùÝ|«O¸¶fÍË®Ór:3tš)ϼ¶±K½#Û2v)aÄpÆ.v‹P3võÎÈúŒ{5bÛ£K;Vôž¦æØ H¬5ªÊ1¯iöãåÛdCè˸,[8E+ ‡éS’Dôq ü¹LêR3¥Ê¡mE[ÑVÒËmδ9ÓæL¼Q¼Q¼Ñ¡*‡ªªâüƒóÎ?覭 ¦Á4˜ß>A5¼F®‘kÒ²ÆNc§‰¢Q4ŠžŸ{~îù¹uÚÔiS§ôT„^¤éE^bÿýZ&zDè3bFÌ”£”£”£f¯›½nöºë¯w¼ÞqëÁ­·´ñ¶ñ¶ñÖ­oOì‰ýûK ²O˜Y«¡‘´¨­­¦¦¦Ò(¤QH#…ƒÂAá ;ò.èòËs0ŽƒŒ¡¦ÒtiìÈZ=×{ c³ zßÌï>¡Oç\ÆfÖéÝ#øˆã÷EøÃö胦ðENá;ÚÜ%ÞšMÎÿz#åMÅùv‡V™FÕ¨~ÑõæFùxڤν[ôè•UåHΠ-Œß3b#cWöEbìâþsÆ®´ô`ìòÉ‘ksõŽWRçÙÖ}=Nîo9[Õ2¶ïîf~®e­­Í ³Ôúk•û~ý¹tIC¡0ƒ!»I_b‡ƒè„zðBuø ,L`ˆÏ¸XºÏò09LKË+V¬Œ™3+fÖ…í¶_Øú~øž¤ç/?xx¶™¿PòÂFa£°Qz¡íA{ÐÛ+o¯¼½rÞ€yæ ¯‘¯‘¯ÑÚ%#ɼØÞ_´ÿip—~^ÔbD‹-F\ö¾ì}Ùû|Úù´ói C†6ÔeТq4ŽÆ!¡ýŒõö^à…4ë¶ÓY§³Ng럯¾þy·ZnµÜjéîÒMÐMà g8ó“ùo¿Ðÿ a¹@Zj³`¶·–¿óB[Utlÿk߸äÕÉñÈ48exR¯C×úÛ[©²édÂðûÆôGRÏÅì\ð(â…Îq¿K´A¤ )ò†ò†ò†~™~™~™ú©ú©ú©Ò ¬dGÆÑ tÝð¨ê£ªªæ·Êo•ߪx{ñöâí%UJª”T)N+N+N+6.6.6f£Ø(6êOO]ÔE]4+õ¯(À$ã„›‡”B ­Bª‰ Å\ö3ËCEL—vP.Ýn´qË~ ¾iî­×upƒ]žólºÛ61>hêhä"¡€6—µ=Õ=.æiÓ{£$>ŒêyÎàa¼ø=3fºÉƒhMr€ Åö3kÉN¢î/÷³?Ÿ+£t¦ù¾h‰jtiD®rƒÄd±‹ciÿ­ù( # 附ùV–•I¯$w9d.†4ªô¸ìÍjzó­˜È+Lô„/@s€b ±$€8¯ž—–’7#éâ£é§®Z$#5$Æ")-µëÅ%IEÏJŠ JˆÆû7nßY¤= Íh >‡ÂE ak™5~ÂaÄA(4ÿ£¼=0€ŠP„"rŽœ#çX bA/"^D¼èjÐÕ «ÁC7Ý84H3H3H“Ó'§ON–ÂRXŠBÃo½AoÐb¤)FÖu¨ëP×aʦ)›¦lJ»žv=íú·Ã¾öí°Ç_q\š}“ÕauX^nºÒëF»ÑnâFq£¸±šºšºšzzé=¦÷0 2 2 Z“µ&kMÖª«¬@¾'ß“ïÙ2¶Œ-Ã}ÜÇýÏ’«Gz•ˆD$J#š*Ì«0¯Â<‡@‡@‡À†7 o¾ð}áûÂW ›dZ¦eZéºãgóßê7Ü-Ȭ}ú³ A™eµÖû/¦ö}Òä^áÌ¢‚âêMúó”cmNôO¸9ëÕéêqOÉ2lBO¶C±ñïx¡sÜÿy]þçÀr,Çr  2«aVì†ïXß±¾cµW´W´WPõQgqgå³ä³ä³¤dšššZ­ÖFC4DC4Þo·V¦•ieE>E>E>Ŏ/Z8´phá†Â …Š”EÊ"eQqQqQ±vvvøH|$>Òõ¸ÿ~-Ð-HÒ˜¸’rd+†WíV1PÔÍàX¾o™&³[œ ê:³¿[Ó[Þ휔­o¶@c6 ÃÈ= „jõ.´¸qüå󵇳nŽÝq:úÞ]Ï‚IE‰Z]Ï–lš0€ˆÚµCÙ–LÑÅg£Ú¡"•p ¼áHΑÞäЄþL»Ì^2Kí;1–=.½‘l†p‰&Ø_²¼i˜QÿxÕ..7ÂŒ|=lkz{:5_ãuÛÉÄÜQxcPWÖж՞ F'€š }€"ªé“§)¸WÒý±IÚËÜ­çäIwRkì¿{ÞãÞÏǽؔÝéáò—gßù0¥8JûÁÏòšŒÀ=\Æ-¼@î#SÙVÜ`]1±§ëåþÒ’ÀQPP]ÃÝ“y2O›w6ïlÞ-·ZnµÜʹ­s[ç¶+ W®4\½cõŽÕ;è:N“Åd1{°{øÍàÞ7È2L`SÙT6µ\­rµÊÕZ2hÉ %ƒÌw™ï2ßÕKÓKÓK“|"ùDò Ú‘v¤ÅUâ*qÕWZbR$ºhhYZ––ŸŠOŧ®Æ®Æ®ÆsÃæ†Í s9ârÄåÈẇë®;!uBê„Tq¬8VË|˜ó<àñÁôLŸ–Ý‹XÄJs øûû›Ü7¹or?þyüóøçRD>Ëe¹,—_ ÿöjû±ï‘ˆgèyö%™ÚÃYÅ 4‰¯éPˆ¡â¤2ž&³ÔÓ‘  Y&FaÌ k<æÎq¿ç2ûOæ`ÜÁÜ‘nßy­òZåµÂxŒÇxÝ ÝÞðÖ…¾¨¡†šÞ¦·émÅÅÅ)Ú•%²D–¨ë’2 ;ÂŽÌ‹y1/Ö‡õaºžNfÁ,˜“1“o+ÞV¼­hqÑâ¢Å…- [¶,jZÔ´¨iÑ¢¢EE‹ £ £ £´îZw­{ÉÂ’…% 5?k~Öü¬9¡9¡9¡ÒFi£X‹Òu>Ͱå}‹’¬Å!à~ïçMÞž‹mQ±Xm}pì UŸ¦5½ßt‰lÐÓë²WW—ÕÅ]Á28ÊÏÚar0*™Û?;·StÕ†óÏí8ûfïÔ³s\|3!kE!° ñ¤'â±»‘ÀrX(æ`¢qÖ0ƒ?a Ú—dº¡¬@«Ha÷™ ™Œ}Ëò4ÿ™a4×á–õ[“†> ËE›í ™U©…c™Úf~ e4–9Ž1ªipP/R± P(GY8 b›2€ü i\x5¼ßäyð;Û;^Oº½}|jU³Ôn‡×^:ø Â³Áig³škçˆ21º©Z`-€Ù a7­&¾fãYeñ‘Øš½eVl:ÜtQõï3ßW°ñÿ«3_hMfÁ,˜ &‚‰`’ö.í]Ú» "6DLØ1aÇ„mnµ¹ÕæÖÅü‹ùóož¸yâæ 2™L&“Ù>¶íÓ5†x^êß_ÚëÙz¶ÇqÇ…? ž¶6mmÚZ§µNkÖº-t[è¶0ùtòéäÓ̃y0]æï¿žküŸ¥T“T#ÕH51ALŒãããGŽ èÜǹsŸky×ò®å-ÇâÚ¶Ú¶Ú¶ä*¹J®¢-Ú¢ígl²K: :àŽàˆªƒªƒªƒÒAé t(h^м ya^a^a´ÐBËV³Õlõi‚¹måý£â*» ÐË­_2L£ÿîTaŸâeÆÏ (b¹°1OÓ£œŒb8¡3& ›Q®Ÿp„5Ç} ´ÐB«@vGp„¥CéP)þR÷G7™È¤ñ4žÆß?wÿÜýsì{ö=û^¯¹^s½æò`y°Y½² ‹+^©xçEú¥3mv§´¹ÞêAÅ·‹ã îÎ|uåuXF…œ2ºOÚ¦ûÿî–£Ô´%~èÇÖà¡x€QÖWc¡­+NEŠqä—\ÐøGNVUªÁ­í¬í¬í,…gœ˜vbÚ‰iµÍk›×6»v3ìfÏ¥=—ö\ñ,âYÄ3ÆaF0‚,Õ·?9Eü×éžáÙN¶“íÌ’Y2ËûÇî»ÌÏÏÏÏϯʤ*“ªLÚ7mß´}ÓØX6–Õ¥”ýzîÒóL 4Ðè:AÖaÖуô =‘‘‘° `AÀ‚;·ïܾs{Ò¸Iã&{]ëu­×µÈ6²lcXÖá³7Ù¥ƒíNº“îŒ2ʨÊOå§òS½T½T½ÌšŸ5?k~ajajaª.ßüìÀ^ý¿¼Ç}+’ð @AlIsmrîƒâHÍn$«o*[Ì›yZhôS•qdéCìÙr¶Œ†PüéÉ~9îk&M(^8¼pøùÎç;Ÿï¬û“#Å2.Á,)t.t.ü`X±&ÖÄš®¢«è*¡“ÐIèDch Q2%S2E/E/E/½ zô*¨ìUö*{Å2Å2Å2ÕÕÕYYYú>¤…‰ÂDa"íJ»Ò®R¦ÁB°,„©ÂTaªÞ+½Wz¯ô*êUÔ«¨kìÇ~ì—“±hÍ¢Å1FŒÑ^Ö^Ö^¯ŠWÅ«bœ!¦1vœÝ*yWr½dkÉwÅç‹R²ä9yyfQ¸Ú÷­Þé7·¦Ô°c•SeöéÑXß««ï¥r.&ZÙDeÚ¿ÒÏcmŽT‚GY›…CÅV±¾Í[ì1¹ž²%æð¸„šÏ+¼©¹¯¸ƒ8 YW°ÕZ71­fæÕÐîY“êÕ»¸ì¬rÔí¹ùSû'–[Ô[Œ/õSA´ýÄuâ÷MdçmkªŸýcÖÉ‹§^íÈþ!¶Æ½+onwÉýÑ‚Kƒo®~ùM@Öñ‚íEÅZ ¨€ªÂ-úˆD1:ã„h/Îa–hƒÑØŠÕˆE®8\|Ì. aÐÂÀ¤o¸ÿŠ~f©©´ ˰ =Ñ=‹ Š Š Ö­ ZTyIå%•—– ,X¦±ccÇÆŽ‡gž}x6‰%±$–° {ú$ý”å~Oig ÈG>òcÓcÓcÓÛ,n³¸Íb÷Cî‡ÜÉ3äòŒ’¬’¬’,݈iFÕ¯¡d$«±«¥¼Ú—Ú—Ú—={8öpl|®ñ¹ÆçÞô{ÓïM¿¹±scçÆ¾¨õ¢Ö‹Z´­CëˆÄbÝ0ÖÏG.uÙX–ÈE.rõvëíÖÛ-ß.ß.ß^èTèTè$¦‹éb:nàn *ª¢*¯þ_Ç%þG7è†kØÂ~B5tUÏRe«œŒìú®~Xhž£·ÃDÍ}1=!ñͪ£ªFËÛG™kö‹.â÷èˆÊpÃV$à/tŽû,.â".ê²ÁH7ñ—x‰—ng´<-OË+ú)ú)ú)Í”fJ3E]E]E]eeeÅjÅjÅjù4ù4ù4ùAùAùAÅ"Å"Å"ÅrÅrÅrùùù¹ÜGîC‰#qÔå®)F1Šu}{ÒL±YÈBá°ãìgC9™BÑNdo‘¬dŸæRÑÂK±%YÊšj„†yg´Ì `]¹Êr—7†3éMùbz n€d•ì½w¾èf™Vkâ.íÈ)I]žîš•,·PlQ<"NõŽ´Q”9ûêŽéiK3#W@ ÝêDZ‰€h h§ÂïaÿgG²^~{ÛËê×+Ý_úfÜù¤›~i¸h‘äöäÝÇÊMhM#HKŒÇdLŸ±þÌŒ agP)x‰Ì¯zªy©¹ÓЈæÒ\š+Þï‹÷{öìÝDzeË›#nޏ9bÈ´!Ó†L˼–y-óšÔÊj²šŒ'¹ûˆ?ñ'þì»ÅnÙt°é`ÓakúÖô­éRÉ^?xýàõ7]nºÜtÑ­ËbYì¿¶fþj^ @h€xM¼&^kØ0°aàØcWŒ]!ó–y˼gfÌ̘™qÐê ÕA+A!(…¶Š¶Š¶Šîùšø¹9Á Nº,1§q§Ëß,³üMç7ÎoœßÜzèý¡sç<ÎA b8À×ü¯Áïq_‹HÂFˆÐæÇ”f»f}‡ä)¶#{ÂNZ$«Ôò½d éWìÿåsx„"Çýq¥›zF0‚‘.ŠQzÔûþ:–A††hˆ†º×­a k]bGib&S˜ÂT—ÒQúЇrÈuY¥þå!yâ,q–8«0²0²0ò7â¤ÈKÉŒÀÙ}Ù}Ù}™™ÌLf&‹”EÊ"…%Âa‰ÔˆW]W]W]W]R]R]RîWîWîW=P=P=PLTLTL”5’5’5"KÉ"2ŸŒ&-IÚ“>¢eæ‚)}¬ˆ”í—½ÅFrgî&æ«âœS:=ÙèÕ¬Lœ¾ªYfsEp‰g¸é:• ÎV/ôÍ®½¥Ç®Z&þá†Sð(Ê`oP ÇW Lß\'èyÁ(Ö׮ͭžoPtâÖð§ë²N¶ˆµ~ºîtå¸U.¿¬“úT¶ä]íX6£?÷|îùÜš84qh¢~ýú6 d9xûà탷)¥”RmCmCmCÝSÄ¿“Ô?Ó8M[ÓÖ´µÁ9ƒsç´KµKµKs/ä^Ƚ »«ïÃ>ìãužû¸¡¨jô Æeé…íZª‘ÊØœÁ}’Š+Lú©kLÎÓñ];73êªÜ)O×mµ~kZoŽã¾8ÒÏøÀGÊfƒ½Ø‹½x…WxE\ˆ q!½H/ÒKzåO~Ê|ÌÇ|âI<‰§,C–!ËP¿P¿P¿°ˆ´ˆ´ˆ,S±LÅ2]ö»ìs‰òŒö<ãyÎ'×'Ó'­j•*uôªÕ­ömµ þ‡ªŽ­®v ‰¯i0Ä §¼e³³Ok“~Ëó~›hÏ }‹ô _ª‘–Sÿ|FáØÂ~×§<ŽN¼x}Áü~-2˜èÝd^¿n-MýG;œ´^b|”,$‘¤Ù¯“Ü'Á*»$ì¤tÑ’Æhº¨¨{[øÏ¤Tܨ]RÙ¾ /È i¹ÞËz/ë½¼\õrÕËU££¢£¢£*«|¬ò1ÝšCÈ2D·žåý÷¦]›€ ˜@ÓÁtð„À o ¾5øÖà‘·FÞyKWœ"é?mìÄï'uOHµèyEt÷+›$›$›¤m¶ Ø6 aIÂ’„%s¼æxÍñR¹©ÜTn¤3éL:—žïPë:£3:KAbòLy¦<3ø\ð¹àsaÕª…UÓo¢ßD¿‰nÍoð ¾áUžû8ò¾ô Õƒ”-ÞÚȽZcóŒúÕ*Ì›x§«Eþ–‰.]n”_`9˴ÁÏ ãþU¤øË„ =Ð=031»° »€$HÃj1#1ük?ài%@ƒUU^Ê»ÆÖFC W˜«Ì.™EX8Yo·;aØÐ0ÞäöÂj»VïØôl.cŒ%4aŒ±G™Œ1¶3¹`Öµ£¹mÓe>¶â†ShE_Ó*¤!Õ#?‚Õ‡Vï?þSÎ-úU“šS•Q•‰@"HÏyf÷›Ýov¿„C ‡­°ZaµÂJqTqTq”8'â¤KÊý†0„¡PU¨*èâž›ov¼Ùñ;¦wL¨¾¢úŠêÊhe´2Z÷Œî ÎàÌ¿°ŽIR‚é¹ÁÒK,]X)±Rb¥õë Ö˜V5­jª++ò޼#ïtÛ–ú©ù·Žá.-ªÍÕæjó:—ê\ªs©zÏê=«÷$gÉYrV÷$Áv°ãUþëñÇ«c1´ÐâÞ@‹7(†6gJñIí+4`õI ž± ²|ª +lå|séÈÜ…ïÑuѽÞOÅÂqÜ?^z©çq¿1‡¨®§Júã' 1”Âudº ‚((l`TAT‘sð‡?ü¥^R‘T$ÙV¶•mCÄ1¤0±Eî…(L.€ïøã2öcüððF«„>‰ç+¶­ òÞ”Þ¨X(:fÚOa ltóæÝú7|³“ƒ¶kšêøÄäz®Ý”ܼÖ%®Çi°±LÁ.±;øW˜­Ç^B‹k`è ü’M\JLÈýuR¸‹4­Ì3<Ã3i¦Õ«3VgøÅûÅûÅtèÐᛌo2¾ÉØ“²'eO µ¢VÔJ4 ECi¸OùQ9ÈAÛ¶°-¨‰š¨ù¼Íó6ÏÛ¤y¥y¥y9Öt¬éXÓ¹À¹À¹àŽìŽìŽLtþ™S¤ü]¤æ¬TǶc;¶K/ D‚†ºuê2!dBÈ„§xЧ˜9mæ´™Ó2¯f^ͼJZ“Ö¤53a&ÌDw¿*”øw’NQËÔ2µLzbë•ë•ëŲ…l¡®þKc‡8î¿\dik¢þm›ŸÉŒÍ¬Ò»aqƒI¶]µU§Üíߺl¥(·ÚÒ:´ â‹ã¸?¤ô2+XÁ MÑMuýú§q§‘‡\ä Oðš´%.ÿW»ƒz¤ºrL3åÕþÉ[Tûé$zƒNÔ½íˆh8ò‚ÿ[Ïo;´C;²‹ì"»¤—ûæôÍé›7 n@Ü€¨Q ¢Ø5´kh׫° «ÈIr’œüŸõƒþ£Ê–T!UHé£qFãŒÆmزaˆ-I—“.']®WT¯¨^‘4R˜-ÌfÿK¾»T7Ú£=ÚÓQtÕÍÝqlDZÇ^ ¼x50º{t÷èî!6!6!6º;ÃT:•NÕu%H#þ·") ¯Ë}—û.÷ë%×K®—\®°\a¹÷CŽª¡ªéf)æ¸ÿNØK ÈJi¹óIÿ—Űi~=+•8MÑ5œ­˜Ö©GAÿ+Õwùè²Ód©ÈËã¸ÏBj¨¥ER–ô"½¨’¶£íÈuÚÖ%%´%mKÑŠä,@j½ßˆ4þ÷þ?K-Yüò_U…V¨ŠšT5P*€Í|JĘc<ÄC<Ôo ß@¿ÁÆN;mìtýäõ“×OŽ~2úÉè'º5‘F¤‘®Å›,ÿ L`BGÒ‘t¤ô”&SšLir×ï®ß]¿!fC̆èfD–ff@+´ú%0ìŸHýŸû@ÐÒruRT'Ñ»£wGï¾²ìʲ+ËÚEµ‹j¥[3–ÆÒXôGôÿå@þç×÷@ Ä@i±Ò©J§* 7 7 7³··×Õ)[ÿËý‚’!ݤåF{½N–›Xà9éF·Tá¤ô®+›~¬ç³ñë램2X·¾9FZórã8îâ?„•”p¥Çà ÖLtÿ“”€öÿÿ1T_¨aAÂaäPüÆþ¹?ªôpÕoÈ7D7Ì.taèÂÐ…—.\ ˆ‰ˆ‰ˆ‰¨¦®¦®öþçYÉ#y¿œ3>\õ¿ É4™&KÏ+ú7ë߬³„ -Z,J[”¶(M‘®HW¼O#!HùG~ÉÿÔò„Ó1†Ñ0Fõ©>ÕŸpÂý ÷“ì’ì’ìÖ6ZÛhm#ãŸ6þ™d’L’Ij’š„çwÿ8 J¾'ߓ勵¿¡¡¡ç¾?÷ý¹ï><øð`³»fwÍîJÁ!ÄžØûØw,ýÃ/‘$’D –/-_Z¾\×p]Ãu sssæaæAù\ù\ùœ´ -H i‚ª_ïçl>æc¾´¨ªªZÿ† ÿ ³AgƒÎªzAŸá_,¢,˜ˆD$*c•±ÊØu“ÖMZ7éºëu×ë®3ÎÏ8?C—~”!GÈ©éYºéÏé8ÂŽx‡wx'½Ð£UV=Z%OŸ4~éÀ¥—êA’BBþÏ.¤íC0C„!@^nÐ. ]À¥ŒK—2.Ù]²»dW7¸npÝ`é]Z‹Ö¢ï‡¦™õÄð(ÁÝËÆËÆË&ü§ðŸÂrðpðpðà?âGüxÕæþ)ÕÔ9¤b†£BÏ ë;ô›!¬xZF|V2=¨ÇƒDåà]-îÝÐï¡×N·Ñ·¸ó7OÌq÷çèÿÒ|wÂ8Á@väÃ&²Yn¯d³pR6ã—e°‡ ïóÏöÄö°&*Xÿ’FÐ}÷Û%ÿK*É&Ù$[Z®²¼Êò*ËÏï<¿óüÎsîçÜϹ×|^óyÍçÒ»´%mI[þzœn˜ã:N€5¬aààà”¨LT&*w{ìöØíaÒÖ¤­I[( €ÉHFòú]JE¢SJ)ÕýÀ©R?¤~ôúèõÑëã,â,â,Y ²d¥[s8N‡ë&ð’¾ã—©z¡—´(<ž Ïýûù÷óïW+¯V^­<óPóPóP]ÝŽE,byÕæþä0a³ôÂ~m·¦ n16Ý«§cS㻟|`q¹í¾²[ÌMB¡‚2ªG|Ç ã¸ÿ4UTp$/á âWëÉY÷cé"…Ú„>PªWžÇeÿ6©ßw –` ý™þL–©ej™zt‹Ñ-F·H2M2M2Ý0mô ÓL&›L6™LUTEUdD}ѳÿUqÚQ;ª›_ÓUî*w•ÿL~&?““¯O¾>ùÚ‘ÿ"ÿE0‡9Ì¥‰®¾¸>éRÇCŽ’£ä¨î»tsíæÚm¿Õ~«ýVq5âjÄÕ˜ÖoZ¿iý‰ŠDE"YKÖ’µ4s¿äu±¥oª  ’’’Ò?¤H=ªGõÞß-c0óZÍýaäR°UZ^]±UfXcÓ÷l/^ŸÖm^Úð1ƒ;©Ô¿Œƒµ­îÆqœÌ'¡¼Ü8Žû#@@YpÂK8AŽ2¿L®þ¾Ÿ^ À ft›ƒH·‘õÏ’ßïBhÀ‘P8B€=„_ý¼—ø·‹|™GæIËÒüî{ºïé¾§{ü£øGñú7èß ¿.? $$P·Ïo]º ݉;q‡Œ`¤ž¡ž¡ž±bÌŠ1+Æ$ù%ù%ùµ;ÑîD»ºÚyZ8-œþ‚½tªÇoÉ·D7ªD½R½R½ruÜê¸Õq×®\øÑãG=L˜<0y ÛV -´ÿ˜úp÷pOZ4igÒΤ]}‡úõªî¯º¿ê~LÀL@ Ô@ ÃƼV>Y_Oj^nÛÂP>pO³g¬–^[y´àgxK1^¦ËøN¦£¼y¡s÷Æ ƒO¡E ì‚)OÏ6#U[S1¡14&w\î¸Üqwäwäwäú~ú~ú~.ë\Ö¹¬ÃXŒÅXÑUt]Ñ}Ñ÷|ÐRS[„‡q‡ÑÍÑ\* •…FDDøøø=½õôÖÓ[3ìgØÏ°çúÎõ+]MWÓÕº~zi&Ô/'oÌGê9öaöéòÉü¤ÿ“þOˆA bò¾Éû&ïLÃ4LCUTEUd! Y¼VsXé÷!kCŽWÊalz|ϵEYŸvy©­>mzÏK—{¦;–ÖP{²—ÇqÿrÆcè¡9ô0À|Yd•}²Hµ|gSµ\oÀºÛzdûÝÆË>ó£@eàñ›¤Ð—8€DFdD&¿(¿(¿¸¤É’&Kš$y&y&yÎSÌSÌSQd¥ë—½ƒ;¸Ã ¯4a0H„:¨ƒ:MW4]Ñtŵ—×^^{ùSÑOE?™››Kk’Ñd4ýEt34C3H©îYJß]}wõÝuíðµÃ×G7nÝ´Êê*««¬ÖyÒƒôÐmûOí`#Á¶°…)LaêvÔí¨ÛÑz}êõ©×ÇIí¤vRë’WÅP å£8¾fŸ®ÇýJv…|¼† LYTÂwô‚lºÐZ=B^ k¡»‚†¢yeã8î_ŒÈÂÈB1Ž¡‘$‘šùךkæçîj;-w³<}†Yªf/{¥š­WwÔZ½ºt½éKº¶ø¶(Kdæ±áPŒb£)𢩔ø¯¤zIõ’ê?ªTÿ¨~küÖø­q5fÔ˜žžžÏ–°%l KÇÒ±0 Lx¿»T¢½h/ÚãNáTòä!ÉC^=|õðÕCת®U]«ÚÙÙIXÉCò<üß­B©#u/‹—ÅËMÄ&b±k~×ü®ù%µKj—Ô^¾`ù‚å ®õ½Ö÷Z_úý‰þÄ.±Kì’®¯ýŸ2{ŒôÓ4©HÅHŒÄHuŠ:E‚Y0 ÎÉÎÉÎÉÖM%• Ÿ竾”ÿŠRMð´˜ì˹}aEš ‚vS²H—YÒQêù}zQ·ÒVÔ‡7¯lÇý‹Iá.rhQ-Œ1lhCØ 9*¡yáÔM §„vò)eIÅÓX’pÓ4L¸‰'0Ç8âg8¢ôýU€)(¾òn"N§‹Ó¥l3‰Û·'n?@ÐTn&7“›u3èfÐÍÀä;“ïL¾EgÑ™ä’Ã{(u“1mb›Ø&)ÉæÃ3Ï<<“9:stæhcccccc;+;+;+]âÈC8„CRòÁ¿õ8¥~e"DêOý©¿¸D\".ñÝï»ßwÿ¨!QC¢Tyª¦ù˜æîFîFîF ݺ'tŸÓjN«9­DoÑ[ô&UHR¡E¨nˆç?«¯]ªõPõ¤ã7Xi°Ò`¥ d‚,/%/%/E[[[[[[—!ç)žâ)¿©r¶¾µÆq,’–­â ô‡?­:ª[ljš­“ëw-alfï^ƒ·:µ?Z7Œl'oa؉žhÆKã8 8AlJ%ª#Âèc„éV9Õäºâ”zÍâê54Üî ÿ`¡tþ“fWÊÿ•DsQùž|O¾ „ó¼çyÏó¾azÃô†éâæ‹›/n®$J¢$DJZnA,ˆ›!H#ÒHj.—÷*ïUÞë’ÿ%ÿKþ'›lv²™C¢C¢C¢®1ýñ9#ÝKŸ‹õXõdÙCö éH;pìÀ±ãGÅŠµ¯î¾ºûêº&º&º&ê6=OÎÝì¹ÿôÔŸ„JtW­k‘k‘kQ·n ÜÊÕ(W£\ ÝJ«±«a+X}͵—ûkU­6b¢ô'¤¼^¶ÊóúðosZaÓ¦wd…Ó×öTù¹ÇÙÆ­cå²;º‹ë.ƽ$ÄqÇýŒ† ”ƒ’$) H’ž"╞Â`á±k •çûOTž§£Ãéû¼2¸~U9ËKÏ®ú–¼%o¥e¯ò^å½ÊŸ8pâÀ‰ל¯9_snžÐ<¡¹.>˜œ#çȹ_Jì«Íò^ºµlÜܸ¹qó]λœw9_êr©Ë¥.M77ÝÜt3ª¡ªéf'ýÜ“19À$–ÄÝ4I²;ewʾºàê‚« ¢³¢³¢³‚·o Þ&½K7ÑMtÓ¿$—¹”Ifö`üáŸlŸlŸìðwáïÂßÙ|góÍwÒ7%žÄ“xòaÖÜ_“ƒ¹ø€ ‚ÞsEšÂõô½¾QMo36ípŒM]Óý§k^ƒ«µ½}zûô,Â-Â-Þ?©¸Û¸­[þ:{ßgafI¡24ŽÆÑ¸‰ &&Ü ½z3tDƈŒÒŠ‚JP ªÏr R• !H‚…`éå†m¶mØöÜýs÷ÏÝ¿´ûÒîK»Ûºµukë&½KÝ©;ý0ÔöŸuK­ l`CH À&lÂ&™£ÌQæXõMÕ7Uß„í Û¶ÓXn,7~?*ƒÉpÒUð—¶ŽÆ<‡4Ð&i*k|_]ÎíT0¡=ÁÜÅîì¡Q[¥“¥OéSQ-ªE5c1²O—†£Åd.™Kæj/h/h/TœSqNÅ9C † -P—S—S—Ûu{×í]·wÞÛyoç=ÝÑÎç‰ó>xðåŸAéÉ€<à†hˆ†º‰–ŽáޱXËbeZ™V¦ zô2è¥^s½æzÍÙ=vÝó‘ùÈ|d*w•»Ê¾ð…/ú úðÛ#÷g BÈBŒ‹¹XÕdiõåŒÍÝǤ¸ê¤À®!é[ÇUíœo7ÞhÁi2çñ/<Žã¸ÿ“Ô¹"Ãû¦wU’ƒªý%ç QDÇ‚ë^’Á2 ÔdNj<Þ‚ ¼a†0{¿ñ¿"Ťԋ©=èÑ´ÕM¾Sûií§µŸ^¬p±ÂÅ 111ÕžV{ZM×gIÑAtÐ×x t:PUP¥Æ¹çjœ»:âꈫ#öï ÞìtÈéÓ!]g‘,’õ ú¶KçéL:“ÎÒ²õ`ëÁÖƒ7õÙÔgSŸ„* Uª,¬´°ÒÂJªUŠ*…˜b‚{¸‡{œñ/¹6vFgtÆ]ÜÅ]D"‘[Ýh˜Ñ0£a.Z­‹¶ŽW¯:^a¦a¦a¦5Ój¦ÕL«k^×¼®¹^K½–zï3ÉŒÀŒà7ƯÙ_‹ð»„GxAmÉ@b¨5dÌàÍšÜ6ùýšFšj_ˆØ@£r*ë%{AD¬Ì‚;LJ%:ã8Žã>Füåÿ2P0\e&¸ « ,ˆ,ØK¦Ï^ÂY»Îú䕚Ú] ŽÈÅ -pLxЦðÄm–‰ÛºŒ4ïsÚüóH}®(@è%z‰^t1]LŸÝyvçÙÑÑÑÑÑÑM{6íÑ´GOÚSÖS–”œt7én!)$…ˆD$ˆ@¤ã^}µJʈ?Eœ"NÜàöØû±÷cïg¡ÏBŸ…:lrØä°©ìe,ûcJÕ”ª)UiwÚv×2-Óþµ"åE)F1ŠY1+fŲò²ò²ò‘î‘î‘î>ž>ž>žIû’ö%í›»lî²¹Ë HÒ€4޳tþ™/¡ uÿÌas Æ` &kÉZ²–mf›ÙfHÿ4ˆÑ ½<½<½<«AVƒ¬™¬3Yg²Î0Û0Û0[ÏBÏBÏ¢ ¬ ¬ Gpº¬>š;š;š;ì {ÃÞ Qˆâyܹ¿ÖÓ§H¥H. yÈK× `+2ˆœÈD9+Ãú(nÊ[Ð1§äï/–ƒú+‰¿ä8Žût¤F¼@ P‚—ì^ ˜ÁU`ðË:€› P^62ÒK6¢þ!ÙìÔÀN]“Ý–¼€-¬IUXC€”ˆ’ü²‡© 5#1’-f‹ÙbM¤&R¹¶ÇÚÞk{?ïö¼ÛónþÛü·ûooqµE|‹xæÉܘ™Eæ’¹_Q“]ÂÀÀØ<6Í#Á$˜?3yfòÌä‰É“'&&ÏLž™W_W_W_«V;¬vhµZ­Vûzâ뉯'ª&©&©&)”J¥›ÒMé¦:¤:¤:DŒ‰11Öý@5„! ùÍûKdóho¢³ßyWeÃòáŒÍ>Ôצ@ž.NìÝtMϵ¹ªËøé®‚cHÁV^nÇqŸ‘ò``@›Û ´¹ºÎ6gu½'«è=‘E¹þ ‹ú`}CšüKƒ€Àê oº—nŽÂ(Œ’’BJ“Þ }…¾B_y¤ƒÌ 3ŒŒŒœ­­­ý¦ûM÷›^«L­2µÊ„›†›†›Ö-S·LÝ2¡$”„ÏížÛ=·[Ï·žo=_³þfýÍ´mF›Ù˜Ù˜Ù˜YW³®f]ÍÚËÚËÚËÆËÆËÆKh,4ë>Ìžðä·7î/‘)¨7Ù--7Û_!Êù¡ølz|¯uE5&þÐå§ßë¹¹“·ßf÷Uœ7Ü9Žã>7ªû_E¶l#ìCŒjgïªM4Õ[4î•Þ"²ß¢˜ì×m¥@ËR±ñ7)Gµ4l´?ú£¿nXd4¢M‚H "ÇÉqrœÚS{jO ?Ð0ã1þ¿ïز±IžIÞ®=û_ìäørñåè9éUÒ«\8™Z9µòÔ›ën®[z}CbH Õ£zTØ[b‹Ù˜ÙABtÃaÿéÈN²“씦þ©Ý³vÏÚ=Ï8?àü€ýóöÏÛ?Ï$ß$ß$_·¦)1%¦`ÿRó×Þð¦¶Ô–ÚJ/‡¶mÚþT¿SýNõ»ÖöZÛkmÛ¿mÿ¶½.¡']B—Ð%p„#ÿÖr6 Lt3ÅJ}ê'p'~½¢,_–/Ë767676w:ãtÆéLUTEUÔH¯‘^#½þ™úg꟩?´þÐúCƒc‚c‚c|ü}ü}üm«ÙV³­¦Q„(BøÍ‰û+>A[6šÅà&¦Â ȉ-ÎÐ+LÑDi_Ék’Ú$·`m5SÝJï ¾Aç÷ÃX9Žã¸ÏH„ÀM©ÈF*jjP³kQÁÛ%Á_~rt¬ü¤á¼M™†óòÍ:ä›kÞžÔÓ¼…ÝÜ[áÎ'8©ÇZ„–°„%á‘äyA¢H‰"[ÉV²•ÕcõX=QQÀJ¬ÄÊһѥ G8ÂuË1¥wíVÙ­²[eŸdŸdŸd~Øü°ùaKKKÛ\;w;wë~¦/M_Õ7{möZ[C^M^ͨ¡E{‹ö†ÛßùAAõ…º†u ï _=|õ¸æcýÇúºO)@ 0£11ˆA UPU 6j£¶¸P\(.Ä À]zJ)×Í—O -´¬<+ÏÊKgç®þ]ý»ú• *T² ± ± ±{e÷ÊîÕ;ö޽cRêF]ö§}è#ùȧ2*£21ULS=R=R=RGÍ5oÔÓ4ÃñVV„·¶ÙHˆxéÎ0†ÊB}¼‚¡.Ë À~YÖ@-4Р¡‘”£Z×@I^’—(ƒ2(£­¦­¦­ÆðŸ:[°[¤E¡–PK¨¥XªXªXªo§o§oçXìXìXìü½ó÷Îß;ˆ¢ƒh×Ä®‰])4Ûl¢ÙD³‰æžæžæžÆÆÆF5jÕ˜;sÏQ½~]òذ“a§BÓ’–%-QOÌóßz’·ä­½ÆÖÌÖlÆ¢i•¦Uz¾ü•ù+ó”õÏ?>wàÝw^||ññÅÇ÷fÞ›yofaÍš…5?h59À‚¥`)XЦ¢©hÊrXËÑWHC ¿„Á”3Ã1%(AIj@j@j@Úê´Õi«=GyŽòåûØ÷±ïãä*ÉU’«Hy{>hþþš”|äãîàŽè!zˆ&åMÊ›”•>*}Tz™9eæ”™sùñåÇ—/ ]º0TsAsAsxâw¸Ãýÿø”ßOÚÔØ5‚Œ00L&“Éd¶‰mb›¤êÒêôGú#ýѰ’a%ÃJVVV&£LF™Œ2Xg°Î`ÊGå£ò)ù±äÇ’‹ÔEê"uÖ ¬AYƒ^+^+^+²ke×Ê®U8©pRá$v™]f—uÃI¥O_à^à,Îâ,R‚ö”=eOÑmк íw|]Þdÿê}Šy㱂íƒ2¨ß<ÏÏ-”Ý©ðÇâþ–»UôˆïlWîÒó}_99Žã¸¿  BE؉"$² H„;nÀ§„ œÒ ©f©b€{Ì·Tê=9(´È‚ZÜ€E ã“BŒ`¼B:Ò±Û±Iÿ~Õ¡žÔ“zZ5°j`ÕÀ´³igÓÎÆÎÆÎÆÎV¹V¹V¹å Ê”3°ßb¿Å~KÙ§eŸ–}j¶×l¯Ù^======ywywywÅ!Å!Å!e–2K™E’d`v|v|v|z™ô2éež¤=I{’özÔëQ¯G½m—Ñ?£ÿ£§÷¦Þ›ÚdåP÷¡î¶ØíµÛûnèÀ‹ªEÆEÆwr“Ý“Ý+úTnX¹¡{Y·²neC–‡,YÞ1ºctÇè'ò'ò'òË—.;$µOjŸÔþù³çÏž?{Üäq“ÇMt-si¢$ IH"×È5rM7ÄÓ€0)[ÈÔoš dHáIâzq½¸þ惛n>ð¶÷¶÷¶÷¾è}Ñû"®à ®À0øhëRúFZh¡%õI}RŸT$IEy´w|îøÌ2™e2Ë$ïBÞ…¼ ¤/éKú²Õl5[-í E(ú“ßÈ f0“žÌ 2*£²îø¥ÙI#éKn‚›àflllÒפ¯I_Ëi–Ó,§©“ÔIê$™…ÌBfAoÑ[ôVîæÜ͹›ßÈßÈßÈßõ~×û]ï7 ß,|³°°waïÂߘ žx/âÅz±^¬—”mF÷îSý á¾bŸà!ùpˆÍ…+šïÑ¿«wøì‹ževóégãk| vŽl}ø&í]ãN\ŽZ“xˆM¬\Ñ•W_Žã¸¿•4 ƒ jxA ;rvx‚@¯¾`àhà¨.V«‹ÕÕÕõvëíÖÛ­m®m®mžµ8kqÖâwïÞdT˨–Q-sYæ²Ìeo[¿mý¶õ‹6/Ú¼hó¬äYɳ’;;ïì¼³3ýtúéôÓÅÅÅÅß[ü­öŒöŒöÌG¿Õ[¼Å[a¼ÐGèÚ³¦¬©.v»ÿþbQ½T½T½´±³±³±«f\͸šq%R‰T"åË%–Ktî<Üy¸Ù!³Cf‡råÊ9”¾7}oúÞTçTçTç···+å®”»Rî‘÷#ïGÞ¯ékúúƒì4¤ iBšSä9Åô™>ÓgsÙ\6W×ø;ŒÃ8ü÷DÌS_êK}Å;âñŽËi—Ó.§×­ Z¤ùQó£æÇÈ¥‘K#—&]Oºžt¤“t’ά™5³ÖýÌ(Õ€–ž0°*¬ «Òäl“³MÎŽÆcÒˆ4"¦ž6zÚè£cŽŽ9:† èq8H„gx†g¿ë@¥YHË¢,Ê¢<Ê£<Ú¡Úa,Æb,â!J+ÊÜeî2wýýý + + +‹"‹"‹"½z;ôv¨©©±l[ç‘ç‘ç‘ó$çIΓ7ƒÞ z3è­Í[›·6E&E&E&hŒÆxŸÑe"&b¢nîҞ艞ºÐ.HŒ7Ó¹èA%s¢¦dŠôÂÑZ]âê]alÖêÞ[›öMa·/Ûµ¥n4:©‹•èCÅ ã8î‹6‘4|?×µº½›‰QëwÓv»iÏc‰£c,É„1ÆrÕyT'áVìàØÁñ,,£õ¢õ¢õ6ïÚ¼kó®ùæO˜?a¨×P¯¡^í&µ›ÔnRý§õŸÖê»Ôw©ïR³L³L³Ì?zhÄ’XKCch }NŸÓçÔƒzP2‚Œ #° °Æ°€…´>-C7ÑMBl±l±0W6X6X¸%[,[L ³…ÙdéMz jÁD0!cÉX2öcŸkYѲ¢eÅ 2dôÜÿqÿÇ+ŒV­0:kpÖà¬A«„W ¯â]ã]ã]ãY<‹gQâ†E ûnîws¿›Û4¾i|ÓxÏZžµ84GâH© u¡.¢·è-z³Óì4;­ëc–"ÂÿJßüTLÅT"‘ˆR¯öË –,»ë:¬ë°ÕVT[QmÁᇦÛévº]\)®WJ!d)YJ–²!lR&´Lh™Ð…M6]ØÔí{·ïݾ?ª8ª8ª7yÜäq“Ùz¶ž­—ŽY74SjÅKe.-K?a‘5d Y£ì[ CçÐ9úuôëèױееŠ5Ýkº×t¯:R©ŽÔ3Õ3Õ3-‰.‰.‰.lWØ®°]Ö7Yßd}“˜˜˜]”]”]Tp à@ÁÝbÉ:¬Ã:¤"©8Ó8'x‚'xЧxú—bî9î ¼¹á )&Ó¤~ðm¾54މ3ý{¥ŠISFv»™6fÔÃGË%XÖ5•¦r ädâæëÅ~iuã>¡I }¥åª—[°Â•zUÕîŸ×-<³û¸½OUéì8Ý6 µHSbÂËã8î‹æw¸K‹t‹ÐThZ÷z[Y[YƒZvhY߼݊v+¾QvhÙ¡¥…µM¾M>éKú“þôµà)x’cä9Fê‘z¤ž®§¼šý2ºéŸÛ<*=—j5TC5¢Oô‰>9CÎ3ÄŽØ»Â*J1L6L6L®T¾RùJå;6ïØ¼cóE½õ^ÔûÄÃO<¼¼êòªË«’Þ%½KzwKqKqKq`ÄFÌ6›m6Û¬—q/ã^ÆW\\q±kþ±N §„S´­Ek¡ Áû7>f#…»Ô¦µim)mbÕΉU£ ¢ ¢ Ž8~àøçUΫœWéÖ¼J¯Ò«dDI;øÎá;‡ï¶%lKض+hWЮ ò©åS˧êNu‰"Qº3~—q™#bô±ãW¿T¿T¿të4Öi¬ïHß‘¾#ÃÒÂÒÂÒÂG† Y'ºNtèÌÌL/o/o/oë%ÖK¬—èõÑë£×ç7vç8è"Ôçb.æBš3‰7й¯M&ËH°´<,¬Æ‰Ê5›v»g}ÍòÉž]/ä?œt¢Ûõ†O¼¦•«§[Ÿ‘C¤ /7Žã¸•Ǭ¢…Ô—ls˜KÓ6Qê@ÁCðøõê²²²V«­V[­nÚ µAꤗ“^Nz¹)lSئ°˜»1wcî>hð Áƒ‰»w%îú¹ëÏ]îúÓ˜ŸÆü4&Bˆ"„ 5Ak‚ÖX?µ~jý”Ô&µIíÒû'.Ä…¸PCjH I9RŽ”Ó%Fì„Nè¤ËÎ.Y…UX%¥†ÔÕÕÝ~jû©í§·%nKÜ41hbÐD)FöBöBöBÚ¨cPÇ ŽAWG^yuäé§oœ¾Qݹºsugé]A)(¥.ä),}lÒUõêÕ?:>t|èøPJý_³gÍž5{†»‡»‡»×_TQýEÕ›Wo^½yňŠ#¬£¬£¬£§§§£ü7b#6ê&Qª†j¨¦«“ŸalÇýƒÑ~¤#1—–»ì¨B¼"Å~S§÷h_’0éJ×™qêÎ×:œó›ê®ž",!"YÄËã8î‹Vºw¹¼à%Œ”µ”µ6ÊÆËÆ 3d}e}…Dzñ²ñ(!A$H·¦!L` ïƒÒ³ƒìH $ÒD?ä¹@.|lSý©úSõ§V?Zýhõ£Ýú‡u[ôpÑÃEc,b,b,N&œL8ŸŸŸgggõ<êyÔó)ÙS²§d·èÝ¢w‹ÞÞ¼xø?0™&ÓdZŸÖ§õ¥l6¤éFºIïÎŽ›7;.ñxâñÄãƒâÅŠ'5H RCz·‘I#“F&1šMŒæÊ¹+箜kÛ­m·¶ºmII"I¿þD)ý¢c ÇŽ-|3|3|3jí©µ§ÖžzsëÍ­7·Þˆz#ê©R)¤’W°W°W°¾¾¾Š¨ˆêã½ãñuqê_fÀÇ}iÈ}bˆÛÒr}Gp§É%“ÏvË/ÖNѵ9c3žö¶\!¸±w‰´Ž,„6#Wx¹qÇq_‘ÒMIxÀCê•G"‘HF’‘d$ ¡!4ä×›ª†ª†ª†:884iߤ}“össçæÎÍÝ3kϬ=³Î/9¿äü’ä˜ä˜ä˜oo¼½ñöØ“cOŽ=ùaùËX1'bNÄœÊÝ*w«ÜM]¤.Rt¨¥,^/‹'ÉCò°¿þýû÷MŠMZµlÕêU«¥u| |µ¾Ú•Oøð‹ïß=¾ûȵ#׎\[z?tD'”””8‡8‡8‡øôé?²¦²¦²¦²Áµ×\««_W¿®~pfpfpf…é¦W˜nímímí­§§÷·[±“0 “P5QŽp„#äCÎ+÷uÜB>ÕŽZá4V±=¨…~•:ÙûZæ_žÛëpÃÉÂ"2ä#õž(ïx|NÜâ§N׈¿)»@ç M°8Š™ñÓÀqÇqLÃt·q›ÒBZ(ňk§j§j§þz#u[u[uÛ@‡@‡@ϧžO=ŸV4«hVѬ|ÝòuË×µíaÛöGa›Â6…mòmómómß4}ÓôMÓ«·¯Þ¾zûrþåüËùÏÇ<ó|Ì}½ûz÷õÄWâ+ñ•´çÀ!,;¹ló²Í/¿yÙäe“‘ûGy`lå±c|J|Œ}Œ£Y´,Z6¡`Bþ„|…\!WÈ-Œ-Œ-̃̃̃Œž=3z&/////O‘GäQΤœI9“²ŽeË:–a•a•aõöÅÛo_”4-iZÒôƒ/æw¸KÑð¬«Ãêèæå³r_±O÷i>"‘8ŠËFæÊéòøÝGîm×GÑWð¢M®ê-z'öL‰èuôíÕ òzŽê—ŒÝÄGü4pÇqÜJ7Lm`Ä"±ä¹Cî`9–c9˜À]y)ê0u˜:Ì)Ã)Ã)Ãã®Ç]»S¦Lõ}áûÂ÷…qeãÊÆ• &L4˜HshÍyºóéΧ;ï¾;øîàû¯î¿ºÿêÂÎ ».ìzµøÕÂW 7 ÞÐkC/ùDùxùøTšJS©Û2·En‹žŒ{2÷ÉÜ…>Zø({Jö”ì)ÖÖÖrs¹¹Ü\ã§ñÓøÏ,žY<ó­Ñ[£·FoF¿ýftŽwŽwŽwArArAòß×îpGk´Fk]z¢%=‹àÕãÞß>•ðGy¬Gî+Æ èŽÇuFôk×Ãê–~…‘l°^7ÅÃ]®Ô½ëÑ}ó^ï³Ï„r¤jë°'h58~28Žã8îw‘•JÃ.aé2½(‰’(µ‡µ‡µ$©¤KèºÄ¸Ä¸Ä¸¤ÒàJƒ+ ...pOsOsOsìçØÏ±ŸmÛ ¶Š6ee¿j’Ú$µIîY…ÆÂ¶V-ÛZ¶ÂlÙ)Ù)Fj’šd¾Ø@l°¤Õ¹Cæ>Ü|«õ­Öz•Ô>jŸìô¬UY«rbrbrb^—{]îu¹wÏÞ={÷¬xzñôâé(D!ÞOutçq¦0…©”)_—_šTzæÀqÜgÔþïS†ÉèéäšÃŽ´é¨}0Å¿Û%ÆfÕîí²¯}ç±õÍÉ8’@r± Ž`*ñÂã8Žã¸?©tܼj¨‰;q'ît@'PjBM>¶©þ}ýûú÷ƒË— .×}T÷QÝG-]µ4oiÞ©'_œ|‘Ð(9*9*ncŒÅždŒ±«÷Ä;â¤ÙŒ1ÖÄ¥Õ¬V³Êº¨]Ô¶•mØ.PUUýèqÞÅ]ÜÅZ¬ÅZØÂ¶¿qüÇýMš£"ÊI©–¨ yLǤõ»Ý¬K›:¦ûA–;½¨gÛ³™}÷7õV+UQÊ|éb%]qõ—©"8Žã8ŽûëJ7…¥,+ýÑýq'p‚´#íH;Z—Ö¥u½©þV}­¾Ö!Ëá‡Ú7éÖ©[§xçâqÅã..².²¾ä[˜P˜°³xqñâr—<“=“ãÓ¥TŒc1cQ5PCw |)Ç}AêÃŽºF=¬ÃÃýqÝî5¼ÃØ´ù=¾clZÝòëþÕk•a5ÉÈ[í =Pr q¼ð8Žã8îoRjX¤ )ô.½Kï õ…ú³´ÚÊž9=K­Çc0ÆØÃ¶Œ1ö21ƴ唀‘˜ùt› 'èa Æ`ŒncÞÎqŸåòýT²P„b´‚>ö 'ª½Z™W¶p ´4²S?íbÓµª ­ú;Å Y—׸±ä;Œ |H8ÇqÇýM4Ð@£[v†3œE&2‘Iýâ¤?™If"¶°ÍjôvÔÛQÝ-ÛömÛW[C0DŠ?Ê`9–¿%©Ñ©Ñ0ÄZ¬©vvæ` êöÌó½pÜ­laAdh 7P³Ã!hc3kõŠ(¹9éZ×eoÖoÙå~{›Õ惥èlÒ‹XðÂã8Žã8Žã¸ÿîÓõ¸¿CЉ9CìÄЗßf¥çÅä ÓF°Îì¬ñE¤|¥~uûlv A€{´hh‰éPST9Ô‚~hÇ\Í&éÍSäÐÆô¢…5”|p*ÇqÇqÇ}ܧîq_Ž H„ZhóÿPò4ëEáOÅ]`H_“É¢’%3o‹ ÕtÅ!Ÿ“XhÁò¬2ÇqÇq÷ß|ê÷ñ8ˆ³t±E”X¤-Ðn»!¯CAS@èCÓÄ­¬MŒÛ(M…h¹G¦é¶Òƒì“ ÇqÇqÇý‹|êæòbœÂáù‘¶€ dÈÌD~¹B9@3èOâöŒU0l(Ÿ$›aCµ[·Õ Ô€??ÇqÇq÷1Ÿºá^€”àŠ Ä+ˆ Ù{ŠC´“ 0°8'$Ò4²Ó~ ‰‘£´ÙŒîhÆOÇqÇqÇ}̧n¸`Ýð3» â»Åñ_ÈÄŸÄ™ä(ñ†¾ð†n¤-²ÔeU÷u[}Gê €Ÿ Žã8Žã8Žû˜OÝpgÀF"·¤²z]+ÉÃ÷Ú¾¬2f£",eß‘D2ØÆÈPÐwÖ!‹Ñ”„ò“ÁqÇqÇqóy†„vfûqYZÌð-ˆ(–—ÄhhãH6¾ES¼ -È ó‹z”«tëCu¸ó“ÁqÇqÇqóYîì¬ÇIiùÍÚü9…“ Wh<Äšä™î($‰›mºDo¤´Yp>8•ã8Žã8Žã>îó4ÜØD¶ zAH5ËÎÈK-ZrA“B÷܆Š’5æL¥7Aâ RŒ<ÇqÇqÇqú< ÷ºXŠí(€Ú×»sÏæÛN,Ù®CÆdr O0èb €?laN¢Ð!ÐB”bä9Žã8Žã8ŽûÐç‰q¯ùØH*c Fd—+°/ê[¨é©ñG{@d«‡¦Ã•§åK‹—x#&²},=_~J8Žã8Žã8î×dŸe¯·ŠtÜFÔd®¬[ðΧ(O£¯1ZÑP4S§ªš)½”*ùù ¢Õ%MK𑲆y ¸„ëüÄpÇqÇq\iŸ§Ç]ŠV¿‡7È‚ ¬aùΤx¦(©O‚ SÄÆ&£õê)[ºl„rÈÉs2ýø)á8Žã8Žã¸_û< w)Z] <Ä+¤§ß/ø¹x#€:ðgïØvGm¢)gÒMï„bJP‚ìF'ÎO ÇqÇqÇýý{>&³Cáñ’~|à(Ƴ'¬†~{ÙU!Ôð®rž|ˆ4$•Ì@]øðSÂqÇqÇq¿ö75ÜS;ät+T›ØA<Él Ö)ÉRŒ')È›èVÚ@¾A5~J8Žã8Žã8î×þ¦†û³òïºåDp†µh/ : Kioõh¹Rè)­C†ÁŽ<“;ÇqÇqÇýÚßÔpíšã–¿ ׉L´?2c6¯dfÂhÃBù[á®n¥Í¨‹Š<“;ÇqÇqÇýÚßÕã¾ý]™l'ø"å˜;†—°"†èdä£Ì—›B¨±qPCŸŸŽã8Žã8Ž+ís6ÜÓQ­´˜·¾(ºÄJôÓ¶fË„zÄ”œÑ‰ÊŒ4½at …ÈC®¶™ØEsøÂŸŽã8Žã8Ž+ís6Üãñ¹Òbq=ñ5{Y¯H­IöÓUD ˆ»ÅÊÖ “õ«ãE޳艨W8ðÃqÇqÇq¥}Άûy¼Ä[i±PÐ'¦_-X_4AæHï“–(ýØZÓ9zr¥µÜEè$dâ)ÈP v°à'†ã8Žã8ŽãJûœ ÷›x…,(AAJºi+ˆ6ïÆ†”ÄCº•8A)BüÁb„þ$ÕdU‚ì¹p´Ðêp€%?1ÇqÇqWÚgl¸³+xŽ7(‚VÔØik¿í’ÿ¤h/ ÉÚg,Óx²Žü¥¢•°›^×ÅÃ{ÂFüÄpÇqÇq\iŸ³Çý ž" ƒ` VÒO­U½Y›×³`#T”’Eš:b–`–¥z$ÿVñB° åu[ùÁ &üÄpÇqÇq\iŸ³á¾7ð€`±[lÍsÓ¬¹ÓáŒà¥ÝÇ&3‘Lñ³lœL$½È^ÝVž0…?1ÇqÇqWÚçl¸ŸÅ}<¥†$œ˜C5Œ^WÉy­Ð–<׆ŠYEe¤|Ý Oä…º­\`?1ÇqÇqWÚçl¸g£E(7¸£¹ÈÎy[œ¥¹Šb{Ó²¤¼aä¶ÕŒ©ïé¶"ü¤pÇqÇqÜÿïóÏœ:gqGZÌm]⥭wM9íNÚ”¤‘ ìRmÆ«Oñ“ÁqÇqÇqóÙîl Îã¶´œ=´ø¡æHÉÍ m­OTä(d¸gÖf†ëôeüdpÇqÇqÜÇ|þ†{Ûˆ3ÒrÆÜü×Å·³+uÒLª…ÄÀÜ´=lØQ/ŠŸ Žã8Žã8Žû˜Ï*Ó {qu§P¿Ø*/¿¸BÉ.êM»À%$Û…¾Ò¯ÎOÇqÇqÇ}Ìçïqï=ì4ȳ†Ù'åU+vÔô%]‰€‹H2 Q½”OÒmP-´ |˜*ÇqÇqǽ÷ù{Ük±eØ”¼½“—WPœs¬htñ€^%ßì$»bÖFÙ]¾ÁpG9ØÂF```üôpÇqÇqœäó÷¸·À ì¤WI#<ÖìÖdk s&Ö.ºBÓÁ~Â~ÓVÊnÂq\À]<Â\ÁA%?=ÇqÇq'ùü=îQHÄ]º‡“48à æo’ ú—ø¤ FLÍ*¨†ÊæÈfê×P$É_³óè…EØ„^hÁOÇqÇqÇIþ,¿²ßÔªƒœIEND®B`‚routino-3.4.3/doc/LIMITS.txt 644 233 144 14050 12572106465 10727 0 Routino : Numerical Limits ========================== 32/64-bit Data IDs ------------------ The OpenStreetMap data uses a numerical identifier for each node, way and relation. These identifiers started at 1 and increase for every new item of each type that is added. When an object is deleted the identifier is not re-used so the highest identifier will always be higher than the number of objects. The identifier needs to be handled carefully to ensure that it does not overflow the data type allocated for it. Depending on the data type used to store the identifier there are are a number of numerical limits as described below: 1. If a signed 32-bit integer is used to store the identifier then the maximum value that can be handled is 2147483647 (2^31-1) before overflow. 2. If an unsigned 32-bit integer is used to store the identifier then the maximum value that can be handled is 4294967295 (2^32-1) before overflow. 3. If a signed 64-bit integer is used to store the identifier then the maximum value that can be handled is 9223372036854775807 (2^63-1) before overflow. For the purposes of this document the possibility of overflow of a 64-bit integer is ignored. The part of Routino that handles the node, way and relation identifiers is the planetsplitter program. ID Above 31-bits - - - - - - - - The first identifier exceeding 31-bits (for a node) is predicted to be created in the OpenStreetMap database in February 2013. All versions of Routino use unsigned 32-bit integers to store the identifier. Therefore all versions of Routino will continue working correctly when node number 2147483648 (2^31) or higher is present. ID Above 32-bits - - - - - - - - The ability of Routino to handle identifiers larger than 32-bits does not depend on having a 64-bit operating system. Before version 2.0.1 of Routino there was no check that the identifier read from the input data would fit within an unsigned 32-bit integer. Earlier versions of Routino will therefore fail to report an error and will process data incorrectly when node number 4294967296 (2^32) or higher is present. From version 2.0.2 the code is written to allow the node, way and relation identifier data type to be changed to 64-bits. This means that a consistent data type is used for handling identifiers and the format used for printing them is consistent with the variable type. From version 2.0.2 onwards it is possible to make a simple change to the code to process data with node identifiers above 4294967296 (2^32) without error. The binary format of the database will be unchanged by the use of 64-bit identifiers (since the identifiers are not stored in the database). To recompile with 64-bit node identifiers the file src/typesx.h should be edited and the two lines below changed from: typedef uint32_t node_t; #define Pnode_t PRIu32 to: typedef uint64_t node_t; #define Pnode_t PRIu64 A similar change can also be made for way or relation identifiers although since there are currently fewer of these the limit is not as close to being reached. Between version 2.0.2 and version 2.4 a bug means that route relations will ignore the way or relation identifier if it is equal to 4294967295 (2^32-1). From version 2.4 onwards when a numerical limit is reached the planetsplitter program will exit with an error message that describes which limit was reached and which data type needs to be changed. Database Format --------------- The other limitation in Routino is the number of objects stored in the database that is generated by the planetsplitter data processing. This number may be significantly different from the highest identifier in the input data set for two reasons. Firstly any nodes, ways or relations that have been deleted will not be present in the data. Secondly when a partial planet database (continent, country or smaller) is processed there will be only a fraction of the total number of nodes, ways and relations. The limiting factor is the largest of the following. 1. The number of nodes in the input data files. 2. The number of segments in the input data files. 3. The number of highways in the input data files. 4. The number of relations in the input data files. Normally the number of nodes will be the limiting factor. 32-bit Indexes - - - - - - - Before version 1.2 the database could hold up to 4294967295 (2^32-1) items of each type (node, segment, way) since an unsigned 32-bit integer is used. Versions 1.3 to 1.4.1 have a limit of 2147483647 (2^31-1) items since half of the 32-bit integer range is reserved for fake nodes and segments that are inserted if a waypoint is not close to a node. From version 1.5 the limit is 4294901760 (2^32-2^16) for the number of items of each type that can be stored. The small remaining part of the 32-bit unsigned integer range is reserved for fake nodes and segments. 64-bit Indexes - - - - - - - When using a 32-bit operating system it is not possible to create a database that exceeds about 2GB in total. This will be fewer than 2^32 objects in the database in total. The use of 64-bit indexes will require a 64-bit operating system. From version 2.0.2 onwards it is possible to make a simple change to the code to index the database objects with 64-bit integers insted of 32-bit integers. To recompile with 64-bit index integers the file src/types.h should be edited and the two lines below changed from: typedef uint32_t index_t; #define Pindex_t PRIu32 to: typedef uint64_t index_t; #define Pindex_t PRIu64 This change will affect nodes, segments, ways and relations together. The database that is generated will no longer be compatible with Routino that has been compiled with 32-bit indexes. The size of the database will also grow by about 50% when this change is made. -------- Copyright 2013 Andrew M. Bishop. routino-3.4.3/doc/LIBRARY.txt 644 233 144 51356 12606774417 11052 0 Routino : Library ================= Library Usage ------------- This page describes the libroutino shared library that can be compiled from the Routino source code and used in other programs. Compilation - - - - - - The libroutino shared library is compiled by default when the Routino source code is compiled. There are two versions; a normal version and a 'slim' version that uses less memory but is slower. The names of the libraries are libroutino.so and libroutino-slim.so Including - - - - - To use the Routino library in another program the source code for that program should include the routino.h file. The functions that are available in the library (both versions) are listed in this file along with all of the constants and data types that are required. Linking - - - - After compiling the program that uses the library it needs to be linked to the library. For gcc this requires adding -lroutino or -lroutino-slim to the linker command line, possibly with a -L... parameter to specify the location of the library. Example Library Interface Code - - - - - - - - - - - - - - - An example of a program that can link to the libroutino library is provided in the Routino source code called router+lib.c. This is an almost exact re-implementation of the standard Routino router program using the libroutino library. Library License --------------- The source code for the libroutino and libroutino-slim libraries is the GNU Affero General Public License v3 the same as for the rest of the Routino software. Linking with AGPLv3 Source Code - - - - - - - - - - - - - - - - If libroutino is linked with other APGLv3 code then the same license applies to the combination as to the two parts. Linking with GPLv3 Source Code - - - - - - - - - - - - - - - The AGPLv3 license is almost identical to the GNU General Public License v3 except that network interaction with an AGPLv3 program requires the same source code access as distributing compiled GPLv3 programs. This means that libroutino can be linked or combined with code that is released under the GPLv3 without changing the license of that code. If there is no network interaction with the resulting program then the Routino source code can be treated as if it was GPLv3 code for the purposes of distribution and use. If there is network interaction with the resulting program then the AGPLv3 license will apply since this is required by section 13 of the GPLv3. The Software Freedom Law Center description of the GPLv3 and AGPLv3 licenses describes combining GPLv3 and APGLv3. My understanding is that only when modified Routino code is linked with GPLv3 code does network interaction require the modified Routino code to be released. Linking with Other Source Code - - - - - - - - - - - - - - - Linking libroutino with code released under any other license must preserve the terms of the Routino license on the combination if the software is distributed or interacted with over a network. Routino Library API ------------------- Preprocessor Definitions - - - - - - - - - - - - A version number for the Routino API. #define ROUTINO_API_VERSION 8 Error Definitions No error. #define ROUTINO_ERROR_NONE 0 A function was called without the database variable set. #define ROUTINO_ERROR_NO_DATABASE 1 A function was called without the profile variable set. #define ROUTINO_ERROR_NO_PROFILE 2 A function was called without the translation variable set. #define ROUTINO_ERROR_NO_TRANSLATION 3 The specified database to load did not exist. #define ROUTINO_ERROR_NO_DATABASE_FILES 11 The specified database could not be loaded. #define ROUTINO_ERROR_BAD_DATABASE_FILES 12 The specified profiles XML file did not exist. #define ROUTINO_ERROR_NO_PROFILES_XML 13 The specified profiles XML file could not be loaded. #define ROUTINO_ERROR_BAD_PROFILES_XML 14 The specified translations XML file did not exist. #define ROUTINO_ERROR_NO_TRANSLATIONS_XML 15 The specified translations XML file could not be loaded. #define ROUTINO_ERROR_BAD_TRANSLATIONS_XML 16 The requested profile name does not exist in the loaded XML file. #define ROUTINO_ERROR_NO_SUCH_PROFILE 21 The requested translation language does not exist in the loaded XML file. #define ROUTINO_ERROR_NO_SUCH_TRANSLATION 22 There is no highway near the coordinates to place a waypoint. #define ROUTINO_ERROR_NO_NEARBY_HIGHWAY 31 The profile and database do not work together. #define ROUTINO_ERROR_PROFILE_DATABASE_ERR 41 The profile being used has not been validated. #define ROUTINO_ERROR_NOTVALID_PROFILE 42 The user specified profile contained invalid data. #define ROUTINO_ERROR_BAD_USER_PROFILE 43 The routing options specified are not consistent with each other. #define ROUTINO_ERROR_BAD_OPTIONS 51 There is a mismatch between the library and caller API version. #define ROUTINO_ERROR_WRONG_API_VERSION 61 The progress function returned false. #define ROUTINO_ERROR_PROGRESS_ABORTED 71 A route could not be found to waypoint 1. #define ROUTINO_ERROR_NO_ROUTE_1 1001 A route could not be found to waypoint 2. #define ROUTINO_ERROR_NO_ROUTE_2 1002 A route could not be found to waypoint 3. #define ROUTINO_ERROR_NO_ROUTE_3 1003 Routino Option Definitions Calculate the shortest route. #define ROUTINO_ROUTE_SHORTEST 0 Calculate the quickest route. #define ROUTINO_ROUTE_QUICKEST 1 Output an HTML route file. #define ROUTINO_ROUTE_FILE_HTML 2 Output a GPX track file. #define ROUTINO_ROUTE_FILE_GPX_TRACK 4 Output a GPX route file. #define ROUTINO_ROUTE_FILE_GPX_ROUTE 8 Output a text file with important junctions. #define ROUTINO_ROUTE_FILE_TEXT 16 Output a text file with all nodes and segments. #define ROUTINO_ROUTE_FILE_TEXT_ALL 32 Output a single file type to stdout. #define ROUTINO_ROUTE_FILE_STDOUT 64 Output a linked list of points containing the HTML file information but as plain text. #define ROUTINO_ROUTE_LIST_HTML 128 Output a linked list of points containing the HTML file information as plain text and with all points. #define ROUTINO_ROUTE_LIST_HTML_ALL 256 Output a linked list of points containing the text file information. #define ROUTINO_ROUTE_LIST_TEXT 512 Output a linked list of points containing the text all file information. #define ROUTINO_ROUTE_LIST_TEXT_ALL 1024 Route between the points in a loop returning to the first point. #define ROUTINO_ROUTE_LOOP 2048 Route between the points in reverse order. #define ROUTINO_ROUTE_REVERSE 4096 Linked List Output Point Definitions An unimportant, intermediate, node. #define ROUTINO_POINT_UNIMPORTANT 0 A roundabout exit that is not taken. #define ROUTINO_POINT_RB_NOT_EXIT 1 An un-interesting junction where the route continues without comment. #define ROUTINO_POINT_JUNCT_CONT 2 The highway changes type but nothing else happens. #define ROUTINO_POINT_CHANGE 3 An interesting junction to be described. #define ROUTINO_POINT_JUNCT_IMPORT 4 The entrance to a roundabout. #define ROUTINO_POINT_RB_ENTRY 5 The exit from a roundabout. #define ROUTINO_POINT_RB_EXIT 6 The location of a mini-roundabout. #define ROUTINO_POINT_MINI_RB 7 The location of a U-turn. #define ROUTINO_POINT_UTURN 8 A waypoint. #define ROUTINO_POINT_WAYPOINT 9 Profile Definitions A Motorway highway. #define ROUTINO_HIGHWAY_MOTORWAY 1 A Trunk highway. #define ROUTINO_HIGHWAY_TRUNK 2 A Primary highway. #define ROUTINO_HIGHWAY_PRIMARY 3 A Secondary highway. #define ROUTINO_HIGHWAY_SECONDARY 4 A Tertiary highway. #define ROUTINO_HIGHWAY_TERTIARY 5 A Unclassified highway. #define ROUTINO_HIGHWAY_UNCLASSIFIED 6 A Residential highway. #define ROUTINO_HIGHWAY_RESIDENTIAL 7 A Service highway. #define ROUTINO_HIGHWAY_SERVICE 8 A Track highway. #define ROUTINO_HIGHWAY_TRACK 9 A Cycleway highway. #define ROUTINO_HIGHWAY_CYCLEWAY 10 A Path highway. #define ROUTINO_HIGHWAY_PATH 11 A Steps highway. #define ROUTINO_HIGHWAY_STEPS 12 A Ferry highway. #define ROUTINO_HIGHWAY_FERRY 13 A Paved highway. #define ROUTINO_PROPERTY_PAVED 1 A Multilane highway. #define ROUTINO_PROPERTY_MULTILANE 2 A Bridge highway. #define ROUTINO_PROPERTY_BRIDGE 3 A Tunnel highway. #define ROUTINO_PROPERTY_TUNNEL 4 A Footroute highway. #define ROUTINO_PROPERTY_FOOTROUTE 5 A Bicycleroute highway. #define ROUTINO_PROPERTY_BICYCLEROUTE 6 Type Definitions - - - - - - - - Typedef Routino_Database A data structure to hold a Routino database loaded from a file (the contents are private). typedef struct _Routino_Database Routino_Database Typedef Routino_Waypoint A data structure to hold a Routino waypoint found within the database (the contents are private). typedef struct _Routino_Waypoint Routino_Waypoint Typedef Routino_Profile A data structure to hold a Routino routing profile (the contents are private). typedef struct _Routino_Profile Routino_Profile Typedef Routino_Translation A data structure to hold a Routino translation (the contents are private). typedef struct _Routino_Translation Routino_Translation Typedef Routino_UserProfile A data structure to hold a routing profile that can be defined by the user. typedef struct _Routino_UserProfile Routino_UserProfile struct _Routino_UserProfile { int transport; The type of transport. float highway[14]; A floating point preference for travel on the highway (range 0 to 1). float speed[14]; The maximum speed on each type of highway (km/hour). float props[7]; A floating point preference for ways with this attribute (range 0 to 1). int oneway; A flag to indicate if one-way restrictions apply. int turns; A flag to indicate if turn restrictions apply. float weight; The weight of the vehicle (in tonnes). float height; The height of the vehicle (in metres). float width; The width of vehicle (in metres). float length; The length of vehicle (in metres). } Typedef Routino_Output Forward declaration of the Routino_Output data type. typedef struct _Routino_Output Routino_Output Type struct _Routino_Output A linked list output of the calculated route whose contents depend on the ROUTINO_ROUTE_LIST_* options selected. struct _Routino_Output { Routino_Output* next; A pointer to the next route section. float lon; The longitude of the point (radians). float lat; The latitude of the point (radians). float dist; The total distance travelled (kilometres) up to the point. float time; The total journey time (seconds) up to the point. float speed; The speed (km/hr) for this section of the route (ROUTINO_ROUTE_LIST_TEXT_ALL format only). int type; The type of point (one of the ROUTINO_POINT_* values). int turn; The amount to turn (degrees) for the next section of the route (ROUTINO_ROUTE_LIST_TEXT or ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML_ALL format). int bearing; The compass direction (degrees) for the next section of the route. char* name; The name of the next section of the route (ROUTINO_ROUTE_LIST_TEXT or ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML_ALL format) or previous section of the route (ROUTINO_ROUTE_LIST_TEXT_ALL format). char* desc1; The first part of the description of the next section of route (ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML format). char* desc2; The second part of the description of the next section of route (ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML format). char* desc3; The third part of the description, the total distance and time at the end of the next section of route (ROUTINO_ROUTE_LIST_HTML or ROUTINO_ROUTE_LIST_HTML format). } Typedef Routino_ProgressFunc A type of function that can be used as a callback to indicate routing progress, if it returns false the router stops. typedef int (*Routino_ProgressFunc)(double complete) Variable Definitions - - - - - - - - - - Global Variable Routino_APIVersion Contains the libroutino API version number. const int Routino_APIVersion Global Variable Routino_Version Contains the Routino version number. const char* Routino_Version Global Variable Routino_errno Contains the error number of the most recent Routino function (one of the ROUTINO_ERROR_* values). int Routino_errno Function Definitions - - - - - - - - - - Global Function Routino_CalculateRoute() Calculate a route using a loaded database, chosen profile, chosen translation and set of waypoints. Routino_Output* Routino_CalculateRoute ( Routino_Database* database, Routino_Profile* profile, Routino_Translation* translation, Routino_Waypoint** waypoints, int nwaypoints, int options, Routino_ProgressFunc progress ) Routino_Output* Routino_CalculateRoute Returns the head of a linked list of route data (if requested) or NULL. Routino_Database* database The loaded database to use. Routino_Profile* profile The chosen routing profile to use. Routino_Translation* translation The chosen translation information to use. Routino_Waypoint** waypoints The set of waypoints. int nwaypoints The number of waypoints. int options The set of routing options (ROUTINO_ROUTE_*) ORed together. Routino_ProgressFunc progress A function to be called occasionally to report progress or NULL. Global Function Routino_Check_API_Version() Check the version of the library used by the caller against the library version int Routino_Check_API_Version ( int caller_version ) int Routino_Check_API_Version Returns ROUTINO_ERROR_NONE if OK or ROUTINO_ERROR_WRONG_VERSION if there is an error. int caller_version The version of the API used in the caller. This function should not be called directly, use the macro Routino_CheckAPIVersion() which takes no arguments. A wrapper function to simplify the API version check. #define Routino_CheckAPIVersion() Global Function Routino_CreateProfileFromUserProfile() Create a fully formed Routino Profile from a Routino User Profile. Routino_Profile* Routino_CreateProfileFromUserProfile ( Routino_UserProfile* profile ) Routino_Profile* Routino_CreateProfileFromUserProfile Returns an allocated Routino Profile. Routino_UserProfile* profile The user specified profile to convert (not modified by this). Global Function Routino_CreateUserProfileFromProfile() Create a Routino User Profile from a Routino Profile loaded from an XML file. Routino_UserProfile* Routino_CreateUserProfileFromProfile ( Routino_Profile* profile ) Routino_UserProfile* Routino_CreateUserProfileFromProfile Returns an allocated Routino User Profile. Routino_Profile* profile The Routino Profile to convert (not modified by this). Global Function Routino_DeleteRoute() Delete the linked list created by Routino_CalculateRoute. void Routino_DeleteRoute ( Routino_Output* output ) Routino_Output* output The output to be deleted. Global Function Routino_FindWaypoint() Finds the nearest point in the database to the specified latitude and longitude. Routino_Waypoint* Routino_FindWaypoint ( Routino_Database* database, Routino_Profile* profile, double latitude, double longitude ) Routino_Waypoint* Routino_FindWaypoint Returns a pointer to a newly allocated Routino waypoint or NULL if none could be found. Routino_Database* database The Routino database to use. Routino_Profile* profile The Routino profile to use. double latitude The latitude in degrees of the point. double longitude The longitude in degrees of the point. Global Function Routino_FreeXMLProfiles() Free the internal memory that was allocated for the Routino profiles loaded from the XML file. void Routino_FreeXMLProfiles ( void ) Global Function Routino_FreeXMLTranslations() Free the internal memory that was allocated for the Routino translations loaded from the XML file. void Routino_FreeXMLTranslations ( void ) Global Function Routino_GetProfile() Select a specific routing profile from the set of Routino profiles that have been loaded from the XML file or NULL in case of an error. Routino_Profile* Routino_GetProfile ( const char* name ) Routino_Profile* Routino_GetProfile Returns a pointer to an internal data structure - do not free. const char* name The name of the profile to select. Global Function Routino_GetProfileNames() Return a list of the profile names that have been loaded from the XML file. char** Routino_GetProfileNames ( void ) char** Routino_GetProfileNames Returns a NULL terminated list of strings - all allocated. Global Function Routino_GetTranslation() Select a specific translation from the set of Routino translations that have been loaded from the XML file or NULL in case of an error. Routino_Translation* Routino_GetTranslation ( const char* language ) Routino_Translation* Routino_GetTranslation Returns a pointer to an internal data structure - do not free. const char* language The language to select (as a country code, e.g. 'en', 'de') or an empty string for the first in the file or NULL for the built-in English version. Global Function Routino_GetTranslationLanguageFullNames() Return a list of the full names of the translation languages that have been loaded from the XML file. char** Routino_GetTranslationLanguageFullNames ( void ) char** Routino_GetTranslationLanguageFullNames Returns a NULL terminated list of strings - all allocated. Global Function Routino_GetTranslationLanguages() Return a list of the translation languages that have been loaded from the XML file. char** Routino_GetTranslationLanguages ( void ) char** Routino_GetTranslationLanguages Returns a NULL terminated list of strings - all allocated. Global Function Routino_LoadDatabase() Load a database of files for Routino to use for routing. Routino_Database* Routino_LoadDatabase ( const char* dirname, const char* prefix ) Routino_Database* Routino_LoadDatabase Returns a pointer to the database. const char* dirname The pathname of the directory containing the database files. const char* prefix The prefix of the database files. Global Function Routino_ParseXMLProfiles() Parse a Routino XML file containing profiles, must be called before selecting a profile. int Routino_ParseXMLProfiles ( const char* filename ) int Routino_ParseXMLProfiles Returns non-zero in case of an error or zero if there was no error. const char* filename The full pathname of the file to read. Global Function Routino_ParseXMLTranslations() Parse a Routino XML file containing translations, must be called before selecting a translation. int Routino_ParseXMLTranslations ( const char* filename ) int Routino_ParseXMLTranslations Returns non-zero in case of an error or zero if there was no error. const char* filename The full pathname of the file to read. Global Function Routino_UnloadDatabase() Close the database files that were opened by a call to Routino_LoadDatabase(). void Routino_UnloadDatabase ( Routino_Database* database ) Routino_Database* database The database to close. Global Function Routino_ValidateProfile() Validates that a selected routing profile is valid for use with the selected routing database. int Routino_ValidateProfile ( Routino_Database* database, Routino_Profile* profile ) int Routino_ValidateProfile Returns zero if OK or something else in case of an error. Routino_Database* database The Routino database to use. Routino_Profile* profile The Routino profile to validate. -------- Copyright 2015 Andrew M. Bishop. routino-3.4.3/doc/TAGGING.txt 644 233 144 50226 13765372430 11015 0 Routino : Tagging Rules ======================= The different tags and attributes in the OSM format XML that are used by Routino are described below. Routino handles the tags in the input file after they have been processed according to a set of rules defined in a configuration file. The first half of this file describes the tags that are recognised by Routino after being processed; the second half of the file describes the transformations that are in the default tagging configuration file. Tags Recognised After Processing -------------------------------- This section describes the tags that are recognised by Routino after the tag transformations have been applied. This is therefore a much reduced set of tags compared to the original OSM data and also includes tags which are specific to Routino. In all cases of tag processing values of true, yes, 1 are recognised as being affirmative and any other value is negative. Node Tags And Attributes ------------------------ The node attributes id, latitude and longitude are used. The id attribute is required to associate the node with the ways and the position attributes are required to locate the node. Transport Specific Tags - - - - - - - - - - - - One tag is recognised for each of the different modes of transport: foot, horse, bicycle, wheelchair, moped, motorcycle, motorcar, goods, hgv and psv. These indicate whether the specific type of transport is allowed to pass through the node or not. By default for nodes all types of transport are allowed to pass through a node and specific tags must be used to remove the permissions for the transport. The roundabout Tag - - - - - - - - - The roundabout tag for mini-roundabouts is recognised and used to improve the description of the route. Way Tags And Attributes ----------------------- The tags from the ways in the data are the ones that provide most of the information for routing. The id attribute is used only so that the many segments associated with a way can share a set of tags taken from the way. The nd information is used to identify the nodes that make up the way. The highway Tag - - - - - - - - The most important tag that is used from a way is the highway tag. This defines the type of highway that the way represents. Any way that does not have a highway tag is discarded. There are more highway types defined than are used by the router. The subset that the router uses are: * motorway * trunk * primary * secondary * tertiary * unclassified * residential * service * track * cycleway * path (1) * steps (2) Note 1: This changed in version 1.3 of Routino - the bridleway and footway types were included within the path highway type. Note 2: This changed in version 1.3 of Routino - the steps type was separated from the footway type. Transport Specific Tags - - - - - - - - - - - - One tag is recognised for each of the different modes of transport: foot, horse, bicycle, wheelchair, moped, motorcycle, motorcar, goods, hgv and psv. These indicate whether the specific type of transport is allowed on the highway or not. By default for ways no types of transport are allowed to pass along a highway and specific tags must be used to add the permissions for the transport. The name Tag - - - - - - The name tag is used to provide the label for the highway when printing the results. The ref Tag - - - - - - The ref tag is used to provide the label for the highway when printing the results. The lanes Tag - - - - - - - The lanes tag is used to identify whether a highway has multiple lanes for traffic and this is used to derive the multilane highway properties. The paved Tag - - - - - - - The paved tag is used to identify whether a highway is paved or not, this is one of the available highway properties. A paved tag may exist in the original data but normally the surface tag needs to be transformed into the paved tag. The multilane Tag - - - - - - - - - The multilane tag is used to indicate that a highway has multiple lanes for traffic. The bridge Tag - - - - - - - The bridge tag is used to identify whether a highway is a bridge and therefore set one of the available properties. The tunnel Tag - - - - - - - The tunnel tag is used to identify whether a highway is a tunnel and therefore set one of the available properties. The footroute Tag - - - - - - - - - The footroute tag is used to identify whether a highway is part of a walking route and therefore set one of the available properties. This is not a standard OSM tag and is normally added to the individual highways by looking for route relations that are designated for foot access. The bicycleroute Tag - - - - - - - - - - The bicycleroute tag is used to identify whether a highway is part of a bicycle route and therefore set one of the available properties. This is not a standard OSM tag and is normally added to the individual highways by looking for route relations that are designated for bicycle access. The cyclebothways Tag - - - - - - - - - - - The cyclebothways tag is used to identify whether a highway allows cycling in the opposite direction to a signposted oneway restriction. The oneway Tag - - - - - - - The oneway tag is used to specify that traffic is only allowed to travel in one direction. The roundabout Tag - - - - - - - - - The roundabout tag is used to specify that a highway is part of a roundabout to improve the description of the calculated route. The maxspeed Tag - - - - - - - - The maxspeed tag is used to specify the maximum speed limit on the highway; this is always measured in km/hr in OpenStreetMap data. If the tag value contains "mph" then it is assumed to be a value in those units and converted to km/hr. The maxweight Tag - - - - - - - - - The maxweight tag is used to specify the maximum weight of any traffic on the highway. In other words this must be set to the heaviest weight allowed on the highway (for example a bridge) in tonnes. If the tag value contains "kg" then it is assumed that the value is in these units and converted to tonnes. The maxheight Tag - - - - - - - - - The maxheight tag is used to specify the maximum height of any traffic on the highway. In other words this must be set to the lowest height of anything above the highway (like a bridge) in metres. If the tag value contains a measurement in feet or feet and inches then attempts are made to convert this to metres. The maxwidth Tag - - - - - - - - The maxwidth tag is used to specify the maximum width of any traffic on the highway. This must be set to the minimum width of the constraints at the wayside in metres. If the tag value contains a measurement in feet or feet and inches then attempts are made to convert this to metres. The maxlength Tag - - - - - - - - - The maxlength tag is used to specify the maximum length of any traffic on the highway (usually from a traffic sign) in metres. If the tag value contains a measurement in feet or feet and inches then attempts are made to convert this to metres. The area Tag - - - - - - The area tag is used to specify that a way defines an area. This is used only so that in the case of duplicated segments those belonging to an area can be discarded in preference to those that are not. Relation Tags And Attributes ---------------------------- The tags from the relations are used to associate more properties with the highways that are part of that relation. The id attribute is used so that relations that are members of other relations can be identified. The member information is used to identify the nodes and ways that make up the relation. The footroute Tag - - - - - - - - - The footroute tag is used to identify whether a relation defines a walking route and therefore should be applied to the individual member highways. The bicycleroute Tag - - - - - - - - - - The bicycleroute tag is used to identify whether a relation defines a bicycle route and therefore should be applied to the individual member highways. The type, restriction & except Tags - - - - - - - - - - - - - - - - - - For turn relations the information about the allowed or disallowed turns are stored in the type, restriction and except tags. For a turn restriction the type must be equal to "restriction", the restriction must define the type of turn relation and except defines transport types which are exempt from the restriction. Tag Transformations ------------------- This section describes the set of tag transformations that are contained in the default configuration file. The configuration file tagging rules are applied in sequence and this section of the document is arranged in the same order. Node Tag Transformations ------------------------ Barrier Defaults - - - - - - - - The first part of the tag transformations is to decide on defaults for each type of node. This uses the barrier tag in the OSM file and converts it into a default set of disallowed transport types. Barrier foot horse wheelchair bicycle moped motorcycle motorcar goods hgv psv ------- ---- ----- ---------- ------- ----- ---------- -------- ----- --- --- kissing_gate, footgate, stile, v_stile, turnstile, squeeze, squeeze_stile, cycle_barrier, bicycle_barrier yes no no no no no no no no no horse_stile, horse_jump, step_over yes yes no no no no no no no no horse_barrier, cattle_grid yes no yes yes yes yes yes yes yes yes motorcyle_barrier yes yes yes yes no no no no no no bollard, car_barrier, car_trap yes yes yes yes yes yes no no no no Generic Access Permissions - - - - - - - - - - - - - The access tag is used to specify the default access restrictions through the node. If the tag value is no or private or a selection of other values then all transport types are denied access (later tag transformation rules may add specific transport types back again). Other Access Permissions - - - - - - - - - - - - A tag named vehicle means any of the bicycle, moped, motorcycle, motorcar, goods, hgv and psv transport types. A tag named motor_vehicle is transformed to mean any vehicle except a bicycle. Specific Access Permissions - - - - - - - - - - - - - - The final part of the access permissions is to use the specific transport type tags. One tag is recognised for each of the different modes of transport: foot, horse, bicycle, wheelchair, moped, motorcycle, motorcar, goods, hgv and psv. These indicate whether the specific type of transport is allowed through the node or not; the values listed for the access tag are also accepted here. Mini-roundabouts - - - - - - - - If the highway tag has the value mini_roundabout or the junction tag has the value roundabout then a junction tag with value roundaboutis passed through. Way Tag Transformations ----------------------- Highway Defaults - - - - - - - - The first part of the tag transformations is to decide on defaults for each type of highway. This uses the highway tag in the OSM file and maps it into one of the highway tags that are recognised by Routino, defining the default allowed transport types and adding a number of properties. The first part of the highway tag checking is to ignore the highway tag if it has a value that indicates a non-highway. These are the proposed and construction values for future highways, the no, abandoned and disused values for previous highways and a small number of other values. The second part of the highway transformation is to convert the highway tag into one that is recognised by Routino. Original tag Transformed tag ------------ --------------- motorway_link motorway trunk_link trunk primary_link primary secondary_link secondary tertiary_link tertiary minor, road unclassified living_street residential access, services, layby service byway, unsurfaced, unpaved track footway, bridleway, pedestrian, walkway path route=ferry ferry (1) Note 1: A ferry route is converted into a highway of type "ferry" so that routes using a ferry can be calculated. The type of highway also determines the defaults for the types of transport allowed on the highway. The default assumptions are as shown in the table below. Highway foot horse wheelchair bicycle moped motorcycle motorcar goods hgv psv ------- ---- ----- ---------- ------- ----- --------- -------- ----- --- --- motorway no no no no no yes yes yes yes yes trunk no(1) no(1) no(1) yes yes yes yes yes yes yes primary yes yes yes yes yes yes yes yes yes yes secondary yes yes yes yes yes yes yes yes yes yes tertiary yes yes yes yes yes yes yes yes yes yes unclassified yes yes yes yes yes yes yes yes yes yes residential yes yes yes yes yes yes yes yes yes yes service yes yes yes yes yes yes yes yes yes yes track yes yes yes yes no no no no no no cycleway yes no yes yes no no no no no no path yes yes(2) yes yes(2) no no no no no no steps yes no no no no no no no no no ferry (3) ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? Note 1: A trunk road may legally allow foot, horse or wheelchair access but in the absence of other tags is considered to be too dangerous. Note 2: A path allows bicycle or horse access by default only if actually labelled as a highway of type "bridleway". Note 3: Ferry routes use a set of heuristics to guess the the allowed transport types starting with nothing allowed and then using the tags given. Finally for the highway tag a number of default properties are added depending on the highway type. Highway Properties ------- ---------- motorway paved, oneway, multilane trunk paved, multilane (1) primary paved, multilane (1) secondary paved tertiary paved unclassified paved residential paved service paved track paved (2) cycleway paved path paved (3) steps ferry Note 1: A highway of this type has the multilane property by default if it is oneway. Note 2: A track is paved only if it is tagged as tracktype=grade1. Note 3: A path is paved only if it was originally tagged as highway=walkway or highway=pedestrian. Generic Access Permissions - - - - - - - - - - - - - The access tag is used to specify the default access restrictions on the highway. If the tag value is no or private or a selection of other values then all transport types are denied access (later tag transformation rules may add specific transport types back again). Other Access Permissions - - - - - - - - - - - - A tag named vehicle means any of the bicycle, moped, motorcycle, motorcar, goods, hgv and psv transport types. A tag named motor_vehicle is transformed to mean any vehicle except a bicycle. The designation tag is used as an alternative method of identifying the legal right of way on a path (in the UK at least). The tag transformations convert these tags into a set of allowed transport types as shown below. Designation tag Equivalent access permissions --------------- ----------------------------- restricted_byway foot=yes, wheelchair=yes, horse=yes, bicycle=yes public_byway, byway, byway_open_to_all_traffic foot=yes, wheelchair=yes, horse=yes, bicycle=yes, moped=yes, motorcycle=yes, motorcar=yes permissive_bridleway, public_bridleway, bridleway foot=yes, wheelchair=yes, horse=yes, bicycle=yes public_cycleway foot=yes, wheelchair=yes, bicycle=yes permissive_footpath, public_footpath, footpath foot=yes, wheelchair=yes In addition to these there are some other tags and values that will modify the transport permissions on the highway. A highway that is tagged as motorroad with a value of yes will deny access to foot, horse, wheelchair, bicycle and moped transport. A highway that is tagged with footway or sidewalk and one of a set of popular values will allow foot and wheelchair access even if the road type would not normally do so. A highway that is tagged as cycleway with one of several values will allow bicycle access. If the value of the cycleway tag is opposite_lane, opposite_track or opposite then the cyclebothways tag is set. A highway that is tagged as oneway:bicycle with the value no will also cause the cyclebothways tag to be set. Specific Access Permissions - - - - - - - - - - - - - - The final part of the access permissions is to use the specific transport type tags. One tag is recognised for each of the different modes of transport: foot, horse, bicycle, wheelchair, moped, motorcycle, motorcar, goods, hgv and psv. These indicate whether the specific type of transport is allowed on the highway or not. Highway Properties - - - - - - - - - By default the properties for all highways are not set; highways are not paved, not a bridge, not a tunnel etc. If there is a surface tag then the highway is assumed to be unpaved unless the tag value matches one of the following: paved, asphalt, concrete or many other values listed in the configuration file. Support for the obsolete paved tag is also provided and the highway is paved if this is set to a true value. The lanes tag is passed through to be used to set the multilane highway property. The bridge and tunnel tags are copied directly from the input to the output. Highway Restrictions - - - - - - - - - - The oneway, maxspeed, maxweight, maxheight, maxwidth and maxlength are copied directly from the input to the output without modification. Roundabouts - - - - - - If a highway is tagged as junction=roundabout then a roundabout=yes tag created on the output. Highway Names and References - - - - - - - - - - - - - - The name and ref tags are copied directly from the input to the output. Highway Areas - - - - - - - The area tag is copied directly from the input to the output. Relation Tag Transformations ---------------------------- The type tag is passed through without change. Routes - - - The route tag can be used to determine whether a relation is part of a walking or bicycle route so that the footroute or bicycleroute properties can be applied to the highways that make up that relation. The tag transformations that are applied for route relations are defined in the table below. Relation Tag footroute Property bicycleroute Property ------------ ------------------ --------------------- foot, walking, hiking yes no bicycle no yes bicycle;foot, foot;bicycle yes yes Turn Restrictions - - - - - - - - - No tag transformations are defined for turn restriction relations but the restriction and except tags are passed through without change. -------- Copyright 2008-2020 Andrew M. Bishop. routino-3.4.3/doc/OUTPUT.txt 644 233 144 30700 12561371522 10762 0 Routino : Output ================ There are three different formats of output from the router, HTML, GPX (GPS eXchange) XML format and plain text with a total of five possible output files: * HTML route instructions for each interesting junction. * GPX track file containing every node. * GPX route file with waypoints at interesting junctions. * Plain text description with the interesting junctions. * Plain text file with every node. The "interesting junctions" referred to above are junctions where the route changes to a different type of highway, more than two highways of the same type meet, or where the route meets but does not take a more major highway. When the route follows a major road this definition eliminates all junctions with minor roads. The output files are written to the current directory and are named depending on the selection of shortest or quickest route. For the shortest route the file names are "shortest.html", "shortest-track.gpx", "shortest-route.gpx", "shortest.txt" and "shortest-all.txt", for the quickest route the names are "quickest.html", "quickest-track.gpx", "quickest-route.gpx", "quickest.txt" and "quickest-all.txt". The HTML file and GPX files are written out according to the selected language using the translations contained in the translations.xml configuration file. The text files contains untranslated header lines (in English) but the data is translated. HTML Route Instructions ----------------------- The HTML route instructions file contains one line for the description of each of the interesting junctions in the route and one line for each of the highways that connect them. The coordinates are also included in the file but are not visible because of the style definitions. An example HTML file output is below (some parts are missing, for example the style definitions): Shortest Route ...

Shortest Route

1:51.524658 -0.127877
Start:At Waypoint, head South-East
Follow:Woburn Place (A4200) for 0.251 km, 0.3 min [0.3 km, 0 minutes]
2:51.522811 -0.125781
At:Junction, go Straight on heading South-East
Follow:Russell Square (A4200) for 0.186 km, 0.2 min [0.4 km, 1 minutes]
3:51.521482 -0.124123
At:Junction, go Straight on heading South-East
Follow:Southampton Row (A4200) for 0.351 km, 0.4 min [0.8 km, 1 minutes] ...
21:51.477678 -0.106792
At:Junction, go Slight left heading South-East
Follow:Vassall Road for 0.138 km, 0.2 min [6.3 km, 6 minutes]
22:51.478015 -0.104870
At:Junction, go Straight on heading East
Follow:Vassall Road for 0.087 km, 0.1 min [6.4 km, 6 minutes]
23:51.478244 -0.103651
Stop:At Waypoint
Total:6.4 km, 6 minutes
GPX Track File -------------- The GPX track file contains a track with all of the individual nodes that the route passes through. An example GPX track file output is below: Creator : Routino - http://www.routino.org/ http://www.openstreetmap.org/copyright Shortest route Shortest route between 'start' and 'finish' waypoints ... GPX Route File -------------- The GPX route file contains a route (ordered set of waypoints) with all of the interesting junctions that the route passes through and a description of the route to take from that point. An example GPX route file output is below: Creator : Routino - http://www.routino.org/ http://www.openstreetmap.org/copyright Shortest route Shortest route between 'start' and 'finish' waypoints START South-East on 'Woburn Place (A4200)' for 0.251 km, 0.3 min TRIP001 South-East on 'Russell Square (A4200)' for 0.186 km, 0.2 min TRIP002 South-East on 'Southampton Row (A4200)' for 0.351 km, 0.4 min ... TRIP020 South-East on 'Vassall Road' for 0.138 km, 0.2 min TRIP021 East on 'Vassall Road' for 0.087 km, 0.1 min FINISH Total Journey 6.4 km, 6 minutes Text File --------- The text file format contains one entry for all of the interesting junctions in the route and is intended to be easy to interpret, for example for creating other output formats. An example text file output is below: # Creator : Routino - http://www.routino.org/ # Source : Based on OpenStreetMap data from http://www.openstreetmap.org/ # License : http://www.openstreetmap.org/copyright # #Latitude Longitude Section Section Total Total Point Turn Bearing Highway # Distance Duration Distance Duration Type 51.524658 -0.127877 0.000 km 0.0 min 0.0 km 0 min Waypt +3 Woburn Place (A4200) 51.522811 -0.125781 0.251 km 0.3 min 0.3 km 0 min Junct +0 +3 Russell Square (A4200) 51.521482 -0.124123 0.186 km 0.2 min 0.4 km 1 min Junct +0 +3 Southampton Row (A4200) ... 51.477678 -0.106792 0.204 km 0.2 min 6.1 km 5 min Junct +0 +3 Vassall Road 51.478015 -0.104870 0.138 km 0.2 min 6.3 km 6 min Junct +0 +2 Vassall Road 51.478244 -0.103651 0.087 km 0.1 min 6.4 km 6 min Waypt The text file output contains a header (indicated by the lines starting with '#') and then one line for each waypoint or junction. Each line contains the information for the current node and the next segment to be followed. For each of the lines the individual fields contain the following: Latitude - Location of the node (degrees) Longitude - Location of the node (degrees) Section Distance - The distance travelled on the section of the journey that ends at this node. Section Duration - The duration of travel on the section of the journey that ends at this node. Total Distance - The total distance travelled up to this point. Total Duration - The total duration of travel up to this point. Point Type - The type of point; either a waypoint Waypt or junction Junct. Turn - The direction to turn at this point (missing for the first line since the journey has not started yet and for the last line because it has finished). This can take one of nine values between -4 and +4 defined by: 0 = Straight, +2 = Right, -2 = Left and +/-4 = Reverse. Bearing - The direction to head from this point (missing for the last line since the journey has finished). This can take one of nine values between -4 and +4 defined by: 0 = North, +2 = East, -2 = West and +/-4 = South. Highway - The name (or description) of the highway to follow from this point (missing on the last line since the journey has finished). The individual items are separated by tabs but some of the items contain spaces as well. All Nodes Text File ------------------- The all nodes text file format contains one entry for each of the nodes on the route. An example all nodes text file output is below: # Creator : Routino - http://www.routino.org/ # Source : Based on OpenStreetMap data from http://www.openstreetmap.org/ # License : http://www.openstreetmap.org/copyright # #Latitude Longitude Node Type Segment Segment Total Total Speed Bearing Highway # Dist Durat'n Dist Durat'n 51.524658 -0.127877 8439703* Waypt 0.000 0.00 0.00 0.0 51.523768 -0.126918 8439948* Junct- 0.119 0.15 0.12 0.1 96 146 Woburn Place (A4200) 51.522811 -0.125781 8440207* Junct 0.132 0.17 0.25 0.3 96 143 Woburn Place (A4200) ... 51.478015 -0.104870 8529638* Change 0.138 0.17 6.26 5.6 48 74 Vassall Road 51.478127 -0.104174 8529849* Junct- 0.049 0.04 6.31 5.7 64 75 Vassall Road 51.478244 -0.103651 8530008 Waypt 0.038 0.04 6.35 5.7 64 70 Vassall Road The all nodes text file output contains a header (indicated by the lines starting with '#') and then one line for each node and the segment that was used to reach it. This file therefore contains exactly the same model as is used internally to define a route (a series of results each of which is a node and the segment leading to it). For each of the lines the individual fields contain the following: Latitude - Location of the node in degrees. Longitude - Location of the node in degrees. Node - The internal node number and an indicator "*" if the node is a super-node. Type - The type of point; a waypoint Waypt, important junction Junct, unimportant junction Junct-, change of highway Change or intermediate node Inter. Segment Distance - The distance travelled on the segment defined on this line. Segment Duration - The duration of travel on the segment defined on this line. Total Distance - The total distance travelled up to this point. Total Duration - The total duration of travel up to this point. Speed - The speed of travel on the segment defined on this line (missing on the first line). Bearing - The direction that the segment defined on this line travels in degrees (missing on the first line). Highway - The name (or description) of the highway segment (missing on the first line). -------- Copyright 2008-2011 Andrew M. Bishop. routino-3.4.3/doc/Makefile 644 233 144 3410 12313271732 10574 0# Documentation directory Makefile # # Part of the Routino routing software. # # This file Copyright 2010-2014 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../Makefile.conf # Files to install HTML_FILES=$(notdir $(wildcard html/*.html)) $(notdir $(wildcard html/*.css)) TXT_FILES=*.txt TOP_FILES=../agpl-3.0.txt ######## all: ######## test: ######## install: install-txt install-html install-txt: @[ -d $(DESTDIR)$(docdir) ] || mkdir -p $(DESTDIR)$(docdir) @for file in $(TOP_FILES); do \ echo cp $$file $(DESTDIR)$(docdir) ;\ cp -f $$file $(DESTDIR)$(docdir) ;\ done @for file in $(TXT_FILES); do \ echo cp $$file $(DESTDIR)$(docdir) ;\ cp -f $$file $(DESTDIR)$(docdir) ;\ done install-html: @[ -d $(DESTDIR)$(docdir)/html ] || mkdir -p $(DESTDIR)$(docdir)/html @for file in $(HTML_FILES); do \ echo cp html/$$file $(DESTDIR)$(docdir)/html ;\ cp -f html/$$file $(DESTDIR)$(docdir)/html ;\ done ######## clean: rm -f *~ rm -f html/*~ ######## distclean: clean ######## .PHONY:: all test install clean distclean .PHONY:: install-txt install-html routino-3.4.3/doc/USAGE.txt 644 233 144 64442 14437672226 10611 0 Routino : Usage =============== There are five programs that make up this software. The first one takes the planet.osm datafile from OpenStreetMap (or other source of data using the same formats) and converts it into a local database. The second program uses the database to determine an optimum route between two points. The third program allows visualisation of the data and statistics to be extracted. The fourth program allows dumping the raw parsed data for test purposes and the fifth is a test program for the tag transformations. planetsplitter -------------- This program reads in the OSM format XML file and splits it up to create the database that is used for routing. Usage: planetsplitter [--version] [--help] [--dir=] [--prefix=] [--sort-ram-size=] [--sort-threads=] [--tmpdir=] [--tagging=] [--loggable] [--logtime] [--logmemory] [--errorlog[=]] [--parse-only | --process-only] [--append] [--keep] [--changes] [--max-iterations=] [--prune-none] [--prune-isolated=] [--prune-short=] [--prune-straight=] [ ... | ... | ... | ... | ... | ... | ... | ...] --version Print the version of Routino. --help Prints out the help information. --dir= Sets the directory name in which to save the results. Defaults to the current directory. --prefix= Sets the filename prefix for the files that are created. Defaults to no prefix. --sort-ram-size= Specifies the amount of RAM (in MB) to use for sorting the data. If not specified then 256 MB will be used in slim mode or 1024 MB otherwise. --sort-threads= The number of threads to use for data sorting (the sorting memory is shared between the threads - too many threads and not enough memory will reduce the performance). --tmpdir= Specifies the name of the directory to store the temporary disk files. If not specified then it defaults to either the value of the --dir option or the current directory. --tagging= Sets the filename containing the list of tagging rules in XML format for the parsing the input files. If the file doesn't exist then dirname, prefix and "tagging.xml" will be combined and used, if that doesn't exist then the file '/usr/local/share/routino/tagging.xml' (or custom installation location) will be used. --loggable Print progress messages that are suitable for logging to a file; normally an incrementing counter is printed which is more suitable for real-time display than logging. --logtime Print the elapsed time for each processing step (minutes, seconds and milliseconds). --logmemory Print the maximum allocated and mapped memory for each processing step (MBytes). --errorlog[=] Log OSM parsing and processing errors to 'error.log' or the specified file name (the '--dir' and '--prefix' options are applied). If the --append option is used then the existing log file will be appended, otherwise a new one will be created. If the --keep option is also used a geographically searchable database of error logs is created for use in the visualiser. --parse-only Parse the input files and store the data in intermediate files but don't process the data into a routing database. This option must be used with the --append option for all except the first file. --process-only Don't read in any files but process the existing intermediate files created by using the --parse-only option. --append Parse the input file and append the result to the existing intermediate files; the appended file can be either an OSM file or an OSC change file. --keep Store a set of intermediate files after parsing the OSM files, sorting and removing duplicates; this allows appending an OSC file and re-processing later. --changes This option indicates that the data being processed contains one or more OSC (OSM changes) files, they must be applied in time sequence if more than one is used. This option implies --append when parsing data files and --keep when processing data. --max-iterations= The maximum number of iterations to use when generating super-nodes and super-segments. Defaults to 5 which is normally enough. --prune-none Disable the prune options below, they can be re-enabled by adding them to the command line after this option. --prune-isolated= Remove the access permissions for a transport type from small disconnected groups of segments and remove the segments if they end up with no access permission (defaults to removing groups under 500m). --prune-short= Remove short segments (defaults to removing segments up to a maximum length of 5m). --prune-straight= Remove nodes in almost straight highways (defaults to removing nodes up to 3m offset from a straight line). , , , , Specifies the filename(s) to read data from. Filenames ending '.pbf' will be read as PBF, filenames ending in '.o5m' or '.o5c' will be read as O5M/O5C, otherwise as XML. Filenames ending '.bz2' will be bzip2 uncompressed (if bzip2 support compiled in). Filenames ending '.gz' will be gzip uncompressed (if gzip support compiled in). Filenames ending '.xz' will be xz uncompressed (if xz support compiled in). Note: It is recommended use the --sort-ram-size and --sort-threads options because they can make a significant reduction in the amount of time that it takes to create the database. Selection of the values to use will depend on the computer being used and the size of the dataset being processed. Selecting half the number of CPU cores and half the amount of available RAM is a reasonable starting point. Example usage 1: planetsplitter --dir=data --prefix=gb great_britain.osm This will generate the output files 'data/gb-nodes.mem', 'data/gb-segments.mem' and 'data/gb-ways.mem'. Multiple filenames can be specified on the command line and they will all be read in, combined and processed together. Example usage 2: planetsplitter --dir=data --prefix=gb --parse-only great_britain_part1.osm planetsplitter --dir=data --prefix=gb --parse-only --append great_britain_part2.osm planetsplitter --dir=data --prefix=gb --parse-only --append ... planetsplitter --dir=data --prefix=gb --process-only This will generate the same output files as the first example but parsing the input files is performed separately from the data processing. The first file read in must not use the --append option but the later ones must. Example usage 3: planetsplitter --dir=data --prefix=gb --keep great_britain.osm planetsplitter --dir=data --prefix=gb --changes great_britain.osc This will generate the same output files as the first example. The first command will process the complete file and keep some intermediate data for later. The second command will apply a set of changes to the stored intermediate data and keep the updated intermediate files for repeating this step later with more change data. The parsing and processing can be split into multiple commands as it was in example 2 with the --keep option used with --process-only for the initial OSM file(s) and the --changes option used with --parse-only or --process-only for every OSC file. router ------ This program performs the calculation of the optimum routes using the database generated by the planetsplitter program. Usage: router [--version] [--help | --help-profile | --help-profile-xml | --help-profile-json | --help-profile-perl ] [--dir=] [--prefix=] [--profiles=] [--translations=] [--exact-nodes-only] [--quiet | [--loggable] [--logtime] [--logmemory]] [--output-html] [--output-gpx-track] [--output-gpx-route] [--output-text] [--output-text-all] [--output-none] [--output-stdout] [--profile=] [--transport=] [--shortest | --quickest] --lon1= --lat1= --lon2= --lon2= [ ... --lon99= --lon99=] [--reverse] [--loop] [--heading=] [--highway-= ...] [--speed-= ...] [--property-= ...] [--oneway=(0|1)] [--turns=(0|1)] [--weight=] [--height=] [--width=] [--length=] --version Print the version of Routino. --help Prints out the help information. --help-profile Prints out the selected transport profile (type, speed limits, highway preferences etc.) --help-profile-xml Prints out all the loaded profiles as an XML file in the same format that can be loaded in. --help-profile-json Prints out all the loaded profiles in JavaScript Object Notation (JSON) format for use in the interactive webpage. --help-profile-perl Prints out all the loaded profiles as a Perl object for use in the router CGI. --dir= Sets the directory name in which to read the local database. Defaults to the current directory. --prefix= Sets the filename prefix for the files in the local database. Defaults to no prefix. --profiles= Sets the filename containing the list of routing profiles in XML format. If the file doesn't exist then dirname, prefix and "profiles.xml" will be combined and used, if that doesn't exist then the file '/usr/local/share/routino/profiles.xml' (or custom installation location) will be used. --translations= Sets the filename containing the list of translations in XML format for the output files. If the file doesn't exist then dirname, prefix and "translations.xml" will be combined and used, if that doesn't exist then the file '/usr/local/share/routino/translations.xml' (or custom installation location) will be used. --exact-nodes-only When processing the specified latitude and longitude points only select the nearest node instead of finding the nearest point within a segment (quicker but less accurate unless the points are already near nodes). --quiet Don't generate any screen output while running (useful for running in a script). --loggable Print progress messages that are suitable for logging to a file; normally an incrementing counter is printed which is more suitable for real-time display than logging. --logtime Print the elapsed time for each processing step (minutes, seconds and milliseconds). --logmemory Print the maximum allocated and mapped memory for each processing step (MBytes). --language= Select the language specified from the file of translations. If this option is not given and the file exists then the first language in the file will be used. If this option is not given and no file exists the compiled-in default language (English) will be used. --output-html --output-gpx-track --output-gpx-route --output-text --output-text-all Generate the selected output file formats (HTML, GPX track file, GPX route file, plain text route and/or plain text with all nodes). If no output is specified then all are generated, specifying any automatically disables those not specified. --output-none Do not generate any output or read in any translations files. --output-stdout Write to stdout instead of a file (requires exactly one output format option, implies '--quiet'). --profile= Specifies the name of the profile to use. --transport= Select the type of transport to use, can be set to: + foot = Foot + horse = Horse + wheelchair = Wheelchair + bicycle = Bicycle + moped = Moped (Small motorcycle, limited speed) + motorcycle = Motorcycle + motorcar = Motorcar + goods = Goods (Small lorry, van) + hgv = HGV (Heavy Goods Vehicle - large lorry) + psv = PSV (Public Service Vehicle - bus, coach) Defaults to 'motorcar', this option also selects the default profile information if the '--profile' option is not given and a profile matching the transport name is found. --shortest Find the shortest route between the waypoints. --quickest Find the quickest route between the waypoints. --lon1=, --lat1= --lon2=, --lat2= ... --lon99=, --lat99= The location of the waypoints that make up the start, middle and end points of the route. Up to 99 waypoints can be specified and the route will pass through each of the specified ones in sequence. The algorithm will use the closest node or point within a segment that allows the specified traffic type. --reverse Find a route between the waypoints in reverse order. --loop Find a route that returns to the first waypoint after the last one. --heading= Specifies the initial direction of travel at the start of the route (from the lowest numbered waypoint) as a compass bearing from 0 to 360 degrees. --highway-= Selects the percentage preference for using each particular type of highway. The value of can be selected from: + motorway = Motorway + trunk = Trunk + primary = Primary + secondary = Secondary + tertiary = Tertiary + unclassified = Unclassified + residential = Residential + service = Service + track = Track + cycleway = Cycleway + path = Path + steps = Steps + ferry = Ferry Default value depends on the profile selected by the --transport option. --speed-= Selects the speed limit in km/hour for each type of highway. Default value depends on the profile selected by the --transport option. --property-= Selects the percentage preference for using each particular highway property The value of can be selected from: + paved = Paved (suitable for normal wheels) + multilane = Multiple lanes + bridge = Bridge + tunnel = Tunnel + footroute = A route marked for foot travel + bicycleroute = A route marked for bicycle travel Default value depends on the profile selected by the --transport option. --oneway=[0|1] Selects if the direction of oneway streets are to be obeyed (useful to not obey them when walking). Default value depends on the profile selected by the --transport option. --turns=[0|1] Selects if turn restrictions are to be obeyed (useful to not obey them when walking). Default value depends on the profile selected by the --transport option. --weight= Specifies the weight of the mode of transport in tonnes; ensures that the weight limit on the highway is not exceeded. Default value depends on the profile selected by the --transport option. --height= Specifies the height of the mode of transport in metres; ensures that the height limit on the highway is not exceeded. Default value depends on the profile selected by the --transport option. --width= Specifies the width of the mode of transport in metres; ensures that the width limit on the highway is not exceeded. Default value depends on the profile selected by the --transport option. --length= Specifies the length of the mode of transport in metres; ensures that the length limit on the highway is not exceeded. Default value depends on the profile selected by the --transport option. The meaning of the parameter in the command line options is slightly different for the highway preferences and the property preferences. For the highway preference consider the choice between two possible highways between the start and finish when looking for the shortest route. If highway A has a preference of 100% and highway B has a preference of 90% then highway A will be chosen even if it is up to 11% longer (100/90 = 111%). For the highway properties each highway either has a particular property or not. If the preference for the property is 60% then a highway with the property has a preference of 77% (sqrt(60%)) and one without has a preference of 63% (sqrt(100-60%)). A highway with the property will be chosen even if it is up to 22% longer than one without the property (77/63 = 122%). The overall preference for each highway segment is the product of the preference for the highway type and all of the preferences for the highway properties. Example usage (motorcycle journey, scenic route, not very fast): router --dir=data --prefix=gb --transport=motorcycle --highway-motorway=0 \ --highway-trunk=0 --speed-primary=80 --speed-secondary=80 --quickest This will use the files 'data/gb-nodes.mem', 'data/gb-segments.mem' and 'data/gb-ways.mem' to find the quickest route by motorcycle not using motorways or trunk roads and not exceeding 80 km/hr. filedumper ---------- This program is used to extract statistics from the database, extract particular information for visualisation purposes or for dumping the database contents. Usage: filedumper [--version] [--help] [--dir=] [--prefix=] [--statistics] [--visualiser --latmin= --latmax= --lonmin= --lonmax= --data=] [--dump [--node= ...] [--segment= ...] [--way= ...] [--turn-relation= ...] [--errorlog= ...]] [--dump-osm [--no-super] [--latmin= --latmax= --lonmin= --lonmax=]] [--dump-visualiser [--data=node] [--data=segment] [--data=turn-relation] [--data=errorlog]] --version Print the version of Routino. --help Prints out the help information. --dir= Sets the directory name in which to read the local database. Defaults to the current directory. --prefix= Sets the filename prefix for the files in the local database. --statistics Prints out statistics about the database files. --visualiser Selects a data visualiser mode which will output a set of data according to the other parameters below. --latmin= --latmax= The range of latitudes to print the data for. --lonmin= --lonmax= The range of longitudes to print the data for. --data= The type of data to output, can be selected from: o junctions = segment count at each junction. o super = super-node and super-segments. o waytype-* = segments of oneway, cyclebothways or roundabout type. o highway-* = segments of the specified highway type (e.g. highway-primary to display segments ofprimary roads). o transport-* = segments allowing the specified transport type (e.g. transport-foot to display segments accessible on foot). o turns = turn restrictions. o speed = speed limits. o weight = weight limits. o height = height limits. o width = width limits. o length = length limits. o property-* = segments having the specified property (e.g. property-paved to display segments of paved highway). o errorlogs = errors logged during parsing. --dump Selects a data dumping mode which allows looking at individual items in the databases (specifying 'all' instead of a number dumps all of them). More than one of the following parameters can be specified on the command line. --node= Prints the information about the selected node number (internal number, not the node id number in the original source file). --segment= Prints the information about the selected segment number. --way= Prints the information about the selected way number (internal number, not the way id number in the original source file). --turn-relation= Prints the information about the selected turn relation number (internal number, not the relation id number in the original source file). --errorlog= Prints the information about the selected error log that was stored when the data was parsed. --osm-dump Dumps the contents of the database as an OSM format XML file, the whole database will be dumped unless the latitude and longitude ranges are specified. --no-super The super segments will not be output. --latmin= --latmax= The range of latitudes to dump the data for. --lonmin= --lonmax= The range of longitudes to dump the data for. --dump-visualiser Dumps the contents of the database as HTML formatted items for display in the visualiser web page. --data=node Prints the information about the selected node number (internal node number, not from the original source file). --data=segment Prints the information about the selected segment number as if it was a way (internal segment number, unrelated to original source file). --data=turn-relation Prints the information about the selected turn relation number (internal turn relation number, not from the original source file). --data=errorlog Prints the information about the selected error log that was stored when the data was parsed. filedumperx ----------- This program is a modified version of filedumper that will dump out the contents of the intermediate data that is saved by planetsplitter after processing using the --keep or --changes option. This is intended for test purposes only and gives no useful information about the routing database. Usage: filedumperx [--version] [--help] [--dir=] [--prefix=] [--dump [--nodes] [--ways] [--route-relations] [--turn-relations]] --version Print the version of Routino. --help Prints out the help information. --dir= Sets the directory name in which to read the local database. Defaults to the current directory. --prefix= Sets the filename prefix for the files in the local database. --dump Dumps the complete set of data in the intermediate files that are written by planetsplitter using the --keep or --changes options. --nodes Dumps the node data. --ways Dumps the way data. --route-relations Dumps the route relation data. --turn-relations Dumps the turn relation data. -------- Copyright 2008-2023 Andrew M. Bishop. routino-3.4.3/doc/README.txt 644 233 144 15707 15002742435 10667 0 Routino : OpenStreetMap Routing Software ======================================== Routino is an application for finding a route between two points using the dataset of topographical information collected by http://www.OpenStreetMap.org. Starting from the raw OpenStreetMap data (in the form of the '.osm' XML files available on the internet) a custom database is generated that contains the information useful for routing. With this database and two points specified by latitude and longitude an optimum route (either shortest or quickest) is determined. The route is calculated for OpenStreetMap highways (roads, paths etc) using one of the common forms of transport defined in OpenStreetMap (foot, bicycle, horse, motorcar, motorcycle etc). When processing the OpenStreetMap data the types of highways are recorded and these set default limits on the types of traffic allowed. More specific information about permissions for different types of transport are also recorded as are maximum speed limits. Further restrictions like one-way streets, weight, height, width and length limits are also included where specified. Additionally a set of properties of each highway are also recorded. The processing of the input file is controlled by a configuration file which determines the information that is used. When calculating a route the type of transport to be used is taken into account to ensure that the known restrictions are followed. Each of the different highway types can further be allowed or disallowed depending on preferences. For each type of highway a default speed limit is defined (although the actual speed used will be the lowest of the default and any specified in the original data). To make use of the information about restrictions the weight, height, width and length of the transport can also be specified. Further preferences about road properties (e.g. paved or not) can also be selected. The simplest type of turn restrictions (those formed from an initial way, a node and a second way) are also obeyed. The result of calculating the route can be presented in several different ways. An HTML file can be produced that contains a description of the route to take with instructions for each of the important junctions. The contents of the file are created based on a set of translations specified in a configuration file. The route is also available in a GPX (GPS eXchange) XML format. format file containing either every point and highway segment (a track file) or just a waypoint and translated instructions for the important junctions (a route file). Additionally there are two plain text files that contain all data points or just the important ones (intended for debugging and further processing). One of the design aims of Routino was to make the software are flexible as possible in selecting routing preferences but also have a sensible set of default values. Another design aim was that finding the optimum route should be very fast and most of the speed increases come from the carefully chosen and optimised data format. Disclaimer ---------- The route that is calculated by this software is only as good as the input data. Routino comes with ABSOLUTELY NO WARRANTY for the software itself or the route that is calculated by it. Demonstration ------------- A live demonstration of the router for the UK is available on the internet in both OpenLayers and Leaflet versions: http://www.routino.org/uk-leaflet/ http://www.routino.org/uk-openlayers2/ http://www.routino.org/uk-openlayers/ The source code download available below also includes a set of files that can be used to create your own interactive map. The interactive map is made possible by use of the OpenLayers or Leaflet Javascript library from http://www.openlayers.org/ or http://www.openlayers.org/two/ or http://leafletjs.com/. Documentation ------------- The algorithm used is described in the file ALGORITHM.txt with some notes about the input data in DATA.txt and numerical limitations in LIMITS.txt. The configuration files and in particular the default set of rules for processing the OpenStreetMap data tags are described in detail in CONFIGURATION.txt and TAGGING.txt. The format of the output files generated are described in OUTPUT.txt. Detailed information about how to use the programs is available in the file USAGE.txt and how to install it is in INSTALL.txt. Status ------ Version 1.0 of Routino was released on 8th April 2009. Version 2.0 of Routino was released on 30th May 2011. Version 3.0 of Routino was released on 12th September 2015. Version 3.1 of Routino was released on 5th March 2016. Version 3.1.1 of Routino was released on 6th March 2016. Version 3.2 of Routino was released on 12th March 2017. Version 3.3 of Routino was released on 7th September 2019. Version 3.3.1 of Routino was released on 8th September 2019. Version 3.3.2 of Routino was released on 18th September 2019. Version 3.3.3 of Routino was released on 30th December 2020. Version 3.4 of Routino was released on 11th June 2023. Version 3.4.1 of Routino was released on 1st July 2023. Version 3.4.2 of Routino was released on 29th March 2025. Version 3.4.3 of Routino was released on 26th April 2025. The full version history is available in the NEWS.txt file. Other Versions - - - - - - - There is a version of Routino (in subversion, on the branch called "destination-access") that allows the first and last waypoint of a route to be on highways with access="destination" or access="private". The database is not compatible with this version of Routino. License ------- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. It is important to note that for this program I have decided to use the Affero GPLv3 instead of just using the GPL. This license adds additional requirements to anybody who provides a networked service using this software. Copyright --------- Routino is copyright Andrew M. Bishop 2008-2025. Homepage -------- The Routino homepage has the latest news about the program: http://www.routino.org/ Download -------- The program can be downloaded from: http://www.routino.org/download/ Subversion - - - - - The source code can also be downloaded from the Subversion repository with a command like the following: svn co http://routino.org/svn/trunk routino The source code can also be browsed in the Subversion viewer which also has a list of the latest changes: http://www.routino.org/viewvc/trunk/ http://www.routino.org/viewvc/trunk/?view=log -------- Copyright 2008-2023 Andrew M. Bishop. routino-3.4.3/doc/DATALIFE.txt 644 233 144 31412 14426215445 11077 0 Planetsplitter Data Lifetime ============================ Key (memory mapping): nswr = Mapped into memory read-only NSWR = Mapped into memory read/write Key (file access): nswr = Accessed sequentially read-only NSWR = Accessed sequentially read/write Key (structure parameter usage - memory mapped) c = Created (file created and written) m = Modified (file read (mapped read-only) then written) u = Used (file mapped read-only) d = Destroyed (file deleted) Key (structure parameter usage - allocated) C = Created (allocated then written; write-only) D = Destroyed (read then de-allocated; read-only) U = Used (read; read-only) W = Written (written; write-only) M = Modified (read then written; read/write) T = Temporary (written then read; read/write) | = Preserved unmodified for later * = In this loop the current iteration of (super-)segments are in uppercase, the next iteration are in lowercase. ............................. : Nodes \ : |Segments | Mapped into memory : ||Ways | (not in slim mode) : |||Relations / : |||| .................................. : vvvv : Nodes \ : : |Segments | Accessed : : ||Ways | as files : : |||Relations / : : |||| ........................... : : vvvv : nodesx->idata : : : | . nodesx->gdata : : : | . | . nodesx->pdata : : : | . | . | . nodesx->super : : : | . | . | . | ........... : : : | . | . | . | : nodex->id : : : | . | . | . | : | ............................ : : : v . v . v . v : v : segmentsx->firstnode : : : . . . : : | . segmentsx->next1 : : : . . . : : | . | . segmentsx->usedway : : : . . . : : | . | . | ....................... : : : . . . : : | . | . | : segmentx->node1,2 : : : . . . : : | . | . | : | . segmentx->next2 : : : . . . : : | . | . | : | . | . segmentx->way : : : . . . : : | . | . | : | . | . | ...................... : : : . . . : : v . v . v : v . v . v : waysx->idata : : : . . . : : . . : . . : | . waysx->odata : : : . . . : : . . : . . : | . | . waysx->cdata : : : . . . : : . . : . . : | . | . | .......... : : : . . . : : . . : . . : | . | . | : wayx->id : : : . . . : : . . : . . : | . | . | : | ............................. : : : . . . : : . . : . . : v . v . v : v : relationsx->rridata : : : . . . : : . . : . . : . . : : | . relationsx->rridata : : : . . . : : . . : . . : . . : : | . | . relationsx->rridata : : : . . . : : . . : . . : . . : : | . | . | ............... Function name (in order) : : : . . . : : . . : . . : . . : : | . | . | : relationx->id | : : : . . . : : . . : . . : . . : : | . | . | : | ........... v : : : . . . : : . . : . . : . . : : v . v . v : v : :......:......:...............:...:...........:...........:...........:...............:...: (Parse XML etc) : : N WR : . . . : W : . . : . . : . . : W : . . : W : :......:......:...............:...:...........:...........:...........:...............:...: SortNodeList : : N : c . . . : U : . . : . . : . . : | : . . : | : SortWayList : : W : | . . . : | : . . : . . : c . . : U : . . : | : SortRelationList : : R : | . . . : | : . . : . . : | . . : : . . : U : RemoveNonHighwayNodes : : N w : m . . . : U : . . : . . : | . . : : . . : | : SplitWays : : SW : u . . . : : . . : W . . W : u . . : : . . : | : SortWayNames : W : : | . . . : : . . : | . . | : | . . : : . . : | : SortSegmentList : n : S : u . . . : : . . C : U . . U : u . . : : . . : | : IndexSegments : S : : | . . . : : C . . | : U . W . | : | . . : : . . : | : ProcessRouteRelations : W : r : | . . . : : | . . | : | . | . | : u . . : : . . : U : ProcessTurnRelations : Nsw : R : u . . . : : D . . | : U . U . | : u . . : : . . : U : CompactWayList : : W : . . . : : . . D : | . . | : . . C : T : . . : : :......:......:...............:...:...........:...........:...........:...............:...: SortNodeListGeographically : : N : . C . . : T : . . : | . . | : . . | : : . . : : SortSegmentListGeographically : : S : . U . . : : . . : M . . | : . . | : : . . : : IndexSegments : S : : . | . . : : C . . : U . W . | : . . D : : . . : : SortTurnRelationListGeogra... : s : R : . D . . : : U . . : U . U . | : . . : : . . : : :......:......:...............:...:...........:...........:...........:...............:...: StartPruning : : : . . . : : | . C . : U . U . | : . . : : . . : : <---+ PruneStraightHighwayNodes : nSw : : . . . : : U . U . : U . U . | : . . : : . . : : \ o | PruneIsolatedRegions : nSw : : . . . : : U . U . : U . U . | : . . : : . . : : | n | PruneShortSegments : NSw : : . . . : : U . U . : U . U . | : . . : : . . : : / e | L FinishPruning : : : . . . : : | . D . : | . . | : . . : : . . : : | o RemovePrunedNodes : : N : . . C . : : D . . : | . . | : . . : : . . : : | o RemovePrunedSegments : : S : . . | . : : . . C : U . . | : . . : : . . : : | p CompactWayList : : W : . . | . : : . . D : | . . | : . . C : T : . . : : | RemovePrunedTurnRelations : : R : . . U . : : . . : | . . | : . . | : : . . : : | IndexSegments : S : : . . D . : : C . . : M . W . | : . . D : : . . : : | :......:......:...............:...:...........:...........:...........:...............:...: ----+ ChooseSuperNodes : sw : n : . . . M : : U . . : | . U . | : . . : : . . : : CreateSuperSegments : nsw : : . . . U : : D . . :*Uw. U . | : . . : : . . : : DeduplicateSuperSegments : w : S : . . . | : : . . :*Uu. . | : . . : : . . : : :......:......:...............:...:...........:...........:...........:...............:...: IndexSegments : S : : . . . | : : C . . : U . W . | : . . : : . . : : <-+ ChooseSuperNodes : sw : n : . . . M : : U . . : | . U . | : . . : : . . : : | L CreateSuperSegments : nsw : : . . . U : : D . . :*Uw. U . | : . . : : . . : : | o DeduplicateSuperSegments : w : : . . . | : : . . :*Uu. . | : . . : : . . : : | o :......:......:...............:...:...........:...........:...........:...............:...: --+ p MergeSuperSegments : : s : . . . | : : . . : U . . | : . . : : . . : : :......:......:...............:...:...........:...........:...........:...............:...: SortNodeListGeographically : : N : . C . . D : T : . . : | . . | : . . : : . . : : SortSegmentListGeographically : : S : . U . . : : . . : M . . | : . . : : . . : : IndexSegments : S : : . | . . : : C . . : U . W . | : . . : : . . : : SortTurnRelationListGeogra... : s : R : . D . . : : U . . : U . U . | : . . : : . . : : :......:......:...............:...:...........:...........:...........:...............:...: SaveNodeList : : n : . . . : : D . . : | . | . | : . . : : . . : : SaveSegmentList : : s : . . . : : . . : U . U . U : . . : : . . : : SaveWayList : : w : . . . : : . . : . . : . . : : . . : : SaveRelationList : : r : . . . : : . . : . . : . . : : . . : : FreeSegmentList : : : . . . : : . . : . . : . . : : . . : : :......:......:...............:...:...........:...........:...........:...............:...: ProcessErrorLogs (part 1) : : : c . . . : : . . : . . : c . c . : : c . c . c : : ProcessErrorLogs (part 2) : : : u . . . : : . . : . . : u . u . : : u . u . u : : SortErrorLogsGeographically : : : | . . . : : . . : . . : | . | . : : | . | . | : : SaveErrorLogs : : : | . . . : : . . : . . : | . | . : : | . | . | : : FreeErrorLogList : : : | . . . : : . . : . . : | . | . : : | . | . | : : :......:......:...............:...:...........:...........:...........:...............:...: FreeNodeList : : : d . . . : : . . : . . : | . | . : : | . | . | : : FreeWayList : : : . . . : : . . : . . : d . d . : : | . | . | : : FreeRelationList : : : . . . : : . . : . . : . . : : d . d . d : : :......:......:...............:...:...........:...........:...........:...............:...: : m . m . m . m : m : m . m . m : m . m . m : m . m . m : m : m . m . m : m : : m . a . a . a : m : a . a . a : m . m . m : m . m . a : m : m . m . m : m : : a . l . l . l : a : l . l . l : a . a . a : a . a . l : a : a . a . a : a : : p . l . l . l : p : l . l . l : p . p . p : p . p . l : p : p . p . p : p : : . o . o . o : : o . o . o : . . : . . o : : . . : : : . c . c . c : : c . c . c : . . : . . c : : . . : : routino-3.4.3/doc/CONFIGURATION.txt 644 233 144 20035 13755526336 11744 0 Routino : Configuration ======================= New in version 1.4 of Routino is the use of configuration files to allow more information to be provided to the programs at run-time. The configuration files that are used are: * Tagging transformation rules for the planetsplitter program. * Routing profiles for the router program. * Output translations for the router program. In keeping with the nature of the input and output files the configuration files are also XML files. Each of the files uses a custom defined XML schema and an XSD file is provided for each of them. Tag Transformation Rules ------------------------ The default name of the tagging transformation rules XML configuration file is tagging.xml in the same directory as the generated database files. Other filenames can be specified on the command line using the --tagging option. When processing the input it is possible to have a different set of tagging rules for each file; for example different rules for different countries. The tagging rules allow modifying the highway tags in the source file so that the routing can be performed on a simpler set of tags. This removes the special case tagging rules from the source code into the configuration file where they can be easily modified. Part of the provided tagging.xml file showing the rules for motorway_link and motorway highway types. ... The rules all have the same format; an if or ifnot element at the top level for matching the input and some other elements inside to be used if there was a match. Within the if and ifnot rules any of the rules can be used. These are if, ifnot, set, unset, output or logerror elements. The rules for matching the if or ifnot elements are the following: * An if rule that has both k and v specified is only matched if a tag exists in the input that matches both. * An if rule that has only the k attribute is matched if a tag with that key exists. * An if rule that has only the v attribute is matched for each tag with that value (i.e. the contents may be used more than once). * An if rule that has neither attribute specified always matches. * An ifnot rule that has both k and v specified is only matched if no tag exists in the input that matches both. * An ifnot rule that has only the k attribute is matched only if no tag with that key exists. * An ifnot rule that has only the v attribute is only matched if no tag with that value exists. * An ifnot rule that has neither attribute specified never matches. For set, unset, output or logerror elements inside of an if rule an unspecified value for the k or v attribute is replaced by the values from the tag that matched the outer if rule. This makes it simple to delete tags that match a particular rule without having to specify the parameters more than once. For elements inside of an ifnot element an unspecified value for the k or v attribute is replaced by the values from the outer ifnot rule. This means that either the outer ifnot element or the inner element must specify both k and v attributes between them. For nested if or ifnot elements the outer k and v attributes are not inherited by the inner elements. The set and unset elements either create or delete a tag from the input data that was read from the file. If the set element is used and the tag already exists then it is modified. The output element adds a tag to the set that will be used by Routino to determine the data properties. If the output element is used and the tag already exists then it is modified. The logerror element will cause an error message to be added to the error log file that reports that the key and attribute combination are not recognised. If the k attribute is specified but not the v attribute then the tag value that matches the specified key is looked up and used. An additional message attribute can be specified to be printed at the end of the logged error. The default logged error message is: Node XXX has an unrecognised tag 'key' = 'value' (in tagging rules); ignoring it. The specified message attribute will replace the final part of the logged error. Routing Profiles ---------------- The default name of the routing profiles XML configuration file is profiles.xml in the same directory as the database files. Other filenames can be specified on the command line using the --tagging option. The purpose of this configuration file is to allow easy modification of the routing parameters so that they do not all need to be specified on the command line. In versions of Routino before version 1.4 the default routing parameters (preferred highways, preferred speeds etc) were contained in the source code, now they are in a configuration file. When calculating a route the --profile option selects the named profile from the configuration file. Part of the provided profiles.xml file showing the parameters for transport on foot is shown below: ... ... ... ... ... Output Translations ------------------- The default name of the output translations XML configuration file is translations.xml in the same directory as the database files. Other filenames can be specified on the command line using the --translations option. The generated HTML and GPX output files (described in the next section) are created using the fragments of text that are defined in this file. Additional languages can be added to the file and are selected using the --language option to the router. If no language is specified the first one in the file is used. Part of the provided translations.xml file showing some of the English language (en) translations is shown below: ... ... ... ... ... -------- Copyright 2010-2013,2020 Andrew M. Bishop. routino-3.4.3/web/ 40755 233 144 0 12605264262 7136 5routino-3.4.3/web/INSTALL.txt 777 233 144 0 12031126065 13554 2../doc/INSTALL.txtroutino-3.4.3/web/results/ 40755 233 144 0 12216114770 10633 5routino-3.4.3/web/bin/ 40755 233 144 0 15003125373 7700 5routino-3.4.3/web/translations/ 40755 233 144 0 14575620513 11662 5routino-3.4.3/web/translations/translation.fi.txt 644 233 144 7147 13741352406 15400 0# # Finnish language translation phrases # # # Router output XML definition # %%copyright_source_string%% Lähde %%copyright_license_string%% Lisenssi %%turn_-2%% vasemmalle %%turn_0%% suoraan %%turn_2%% oikealle %%heading_-4%% etelä %%heading_-3%% lounas %%heading_-2%% länsi %%heading_-1%% luode %%heading_0%% pohjoinen %%heading_1%% koillinen %%heading_2%% itä %%heading_3%% kaakko %%heading_4%% etelä %%ordinal_1%% Ensimmäinen %%ordinal_2%% Toinen %%ordinal_3%% Kolmas %%ordinal_4%% Neljäs %%ordinal_5%% Viides %%ordinal_6%% Kuudes %%ordinal_7%% Seitsemäs %%ordinal_8%% Kahdeksas %%ordinal_9%% Yhdeksäs %%ordinal_10%% Kymmenes %%highway_motorway%% moottoritie %%highway_trunk%% valtatie %%highway_primary%% kantatie %%highway_secondary%% seututie %%highway_tertiary%% yhdystie %%highway_unclassified%% tie %%highway_residential%% asuinkatu %%highway_cycleway%% pyörätie %%highway_path%% polku %%highway_steps%% portaat %%highway_ferry%% lautta %%route_shortest%% Lyhyin %%route_quickest%% Nopein %%output-html_waypoint_waypoint%% Reittipiste %%output-html_waypoint_junction%% Liittymä %%output-html_waypoint_roundabout%% Kiertoliittymä %%output-html_title%% %s reitti %%output-html_total%% Yhteensä %.1f km, %.0f minuuttia %%output-html_subtotal%% %.1f km, %.0f minuuttia %%output-gpx_name%% %s reitti # # Router (and some shared) translations # @@LANGUAGE@@ Suomi @@LANGUAGE-WEBPAGE@@ Suomi webpage @@OPTION-TAB@@ Asetukset @@RESULTS-TAB@@ Tulokset @@DATA-TAB@@ Tiedot @@ROUTINO-WEBSITE@@ Routino verkkosivusto @@DOCUMENTATION@@ Dokumentointi @@LANGUAGE-BOX@@ Kieli @@WAYPOINTS-BOX@@ Reittipisteet @@TRANSPORT-TYPE-BOX@@ Kuljetusmuoto @@SPEED-LIMITS-BOX@@ Nopeusrajoitukset @@OTHER-RESTRICTIONS-BOX@@ Muut rajoitukset @@FIND-BOX@@ Etsi @@LINKS-BOX@@ Linkit @@HELP-BOX@@ Ohje @@SHORTEST-ROUTE@@ Lyhyin reitti @@QUICKEST-ROUTE@@ Nopein reitti @@STATISTICS-BOX@@ Routino tilastot @@WAYPOINT-LONGITUDE@@ Reittipisteen XXX pituusaste @@WAYPOINT-LATITUDE@@ Reittipisteen XXX leveysaste @@WAYPOINT-GET@@ Hae nykyinen sijainti @@WAYPOINT-UP@@ Siirrä tämä reittipiste ylöspäin @@WAYPOINT-DOWN@@ Siirrä tämä reittipiste alaspäin @@WAYPOINT-REMOVE@@ Poista tämä reittipiste @@TRANSPORT-FOOT@@ Jalankulku @@TRANSPORT-HORSE@@ Hevonen @@TRANSPORT-WHEELCHAIR@@ Pyörätuoli @@TRANSPORT-BICYCLE@@ Polkupyörä @@TRANSPORT-MOPED@@ Mopo @@TRANSPORT-MOTORCYCLE@@ Moottoripyörä @@TRANSPORT-MOTORCAR@@ Auto @@TRANSPORT-GOODS@@ Pakettiauto @@TRANSPORT-HGV@@ Raskaat ajoneuvot @@TRANSPORT-PSV@@ Julkinen liikenne @@HIGHWAY-MOTORWAY@@ Moottoritie @@HIGHWAY-TRUNK@@ Valtatie @@HIGHWAY-PRIMARY@@ Kantatie @@HIGHWAY-SECONDARY@@ Seututie @@HIGHWAY-TERTIARY@@ Yhdystie @@HIGHWAY-UNCLASSIFIED@@ Tie @@HIGHWAY-RESIDENTIAL@@ Asuinkatu @@HIGHWAY-CYCLEWAY@@ Pyörätie @@HIGHWAY-PATH@@ Polku @@HIGHWAY-STEPS@@ Portaat @@HIGHWAY-FERRY@@ Lautta @@PROPERTY-PAVED@@ Päällystetty @@PROPERTY-BRIDGE@@ Silta @@PROPERTY-TUNNEL@@ Tunneli @@PROPERTY-WALKINGROUTE@@ Kävelyreitti @@PROPERTY-BICYCLEROUTE@@ Polkupyöräreitti @@RESTRICT-WEIGHT@@ Paino @@RESTRICT-HEIGHT@@ Korkeus @@RESTRICT-WIDTH@@ Leveys @@RESTRICT-LENGTH@@ Pituus @@FIND-SHORTEST-ROUTE@@ Etsi lyhin reitti @@FIND-QUICKEST-ROUTE@@ Etsi nopein reitti @@NO-INFORMATION@@ Ei tietoja @@GPX-TRACK-ROUTE@@ GPX-jälkitiedosto @@GPX-ROUTE@@ GPX-reittitiedosto @@TEXT-ROUTE@@ Tekstitiedosto @@ROUTER@@ Reititin @@GEO-DATA@@ Paikkatieto @@TILES@@ Tiilit # # Visualiser specific translations # @@ROUTER-BOX@@ Routino reititin @@ERROR-LOG-BUTTON@@ Näytä virheloki @@CLEAR-DATA-BUTTON@@ Tyhjennä tiedot # # Multi-line descriptive translations (router) # # # Multi-line descriptive translations (visualiser) # routino-3.4.3/web/translations/translation.fr.txt 644 233 144 33306 14204455134 15422 0# # French language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Créateur %%copyright_source_string%% Source %%copyright_source_text%% Basé sur les données OpenStreetMap de http://www.openstreetmap.org/ %%copyright_license_string%% Licence %%turn_-4%% demi-tour à gauche %%turn_-3%% Très à gauche %%turn_-2%% à gauche %%turn_-1%% Légèrement à gauche %%turn_0%% Tout droit %%turn_1%% légèrement à droite %%turn_2%% à droite %%turn_3%% très à droite %%turn_4%% demi-tour à droite %%heading_-4%% Sud %%heading_-3%% Sud-Ouest %%heading_-2%% Ouest %%heading_-1%% Nord-Ouest %%heading_0%% Nord %%heading_1%% Nord-Est %%heading_2%% Est %%heading_3%% Sud-Est %%heading_4%% Sud %%ordinal_1%% Premier %%ordinal_2%% Second %%ordinal_3%% Troisième %%ordinal_4%% Quatrième %%ordinal_5%% Cinquième %%ordinal_6%% Sixième %%ordinal_7%% Septième %%ordinal_8%% Huitième %%ordinal_9%% Neuvième %%ordinal_10%% Dixième %%highway_motorway%% autoroute %%highway_trunk%% route de jonction %%highway_primary%% route nationale %%highway_secondary%% route départementale %%highway_tertiary%% route locale %%highway_unclassified%% route non classifiée %%highway_residential%% rue résidentielle %%highway_service%% rue de service %%highway_track%% piste %%highway_cycleway%% piste cyclable %%highway_path%% sentier %%highway_steps%% escalier %%highway_ferry%% ferry %%route_shortest%% le plus court %%route_quickest%% le plus rapide %%output-html_waypoint_waypoint%% Étape %%output-html_waypoint_junction%% Intersection %%output-html_waypoint_roundabout%% rond-point %%output-html_title%% Itinéraire %s %%output-html_start%% Débute à %s, direction %s %%output-html_node%% à %s, aller %s direction %s %%output-html_rbnode%% Quitter %s, prendre la sortie %s direction %s %%output-html_segment%% Suivre %s pendant %.3f km, %.1f min %%output-html_stop%% S'arrêter à %s %%output-html_total%% Total %.1f km, %.0f minutes %%output-html_subtotal%% %.1f km, %.0f minutes %%output-gpx_waypoint_waypt%% ETAPE %%output-gpx_waypoint_trip%% POINT %%output-gpx_desc%% Itinéraire %s entre les étapes 'début' et 'fin' %%output-gpx_name%% Itinéraire %s %%output-gpx_step%% %s sur '%s' pendant %.3f km, %.1f min %%output-gpx_final%% Trajet total %.1f km, %.0f minutes # # Router (and some shared) translations # @@LANGUAGE@@ Français @@LANGUAGE-WEBPAGE@@ Page web en français @@ROUTER-TITLE@@ Calculateur d'itinéraire pour OpenStreetMap @@OPTION-TAB@@ Options @@OPTION-TAB-HELP@@ définir les options @@RESULTS-TAB@@ Résultats @@RESULTS-TAB-HELP@@ Voir les résultats @@DATA-TAB@@ Données @@DATA-TAB-HELP@@ Voir les informations de la base de données @@ROUTINO-ROUTER@@ Calculateur d'itinéraires Routino pour Openstreetmap @@ROUTINO-WEBSITE@@ site web Routino @@DOCUMENTATION@@ Documentation @@LANGUAGE-BOX@@ Langue @@WAYPOINTS-BOX@@ Étapes de l'itinéraire @@TRANSPORT-TYPE-BOX@@ Mode de déplacement @@HIGHWAY-PREFERENCES-BOX@@ Préférences routières @@SPEED-LIMITS-BOX@@ Limitations de vitesse @@PROPERTY-PREFERENCES-BOX@@ Préférences des propriétés @@OTHER-RESTRICTIONS-BOX@@ Autres Restrictions @@FIND-BOX@@ Rechercher @@LINKS-BOX@@ Liens @@HELP-BOX@@ Aide @@STATUS-BOX@@ État @@SHORTEST-ROUTE@@ Itinéraire le plus court @@QUICKEST-ROUTE@@ Itinéraire le plus rapide @@STATISTICS-BOX@@ Statistiques de Routino @@VISUALISER-BOX@@ Afficheur de Routino @@WAYPOINT-POSITION@@ Étape XXX de l'itinéraire @@WAYPOINT-LONGITUDE@@ Étape XXX Longitude @@WAYPOINT-LATITUDE@@ Étape XXX Latitude @@WAYPOINT-LOCATION@@ position de l'étape XXX @@WAYPOINT-SEARCH@@ Rechercher la position @@WAYPOINT-GET@@ obtenir la position actuelle @@WAYPOINT-CENTRE1@@ Centrer la carte sur cette étape @@WAYPOINT-UP@@ Placer cette étape avant @@WAYPOINT-ADD@@ Ajouter une étape après celle-ci @@WAYPOINT-COORDS@@ Coordonnées de position @@WAYPOINT-HOME@@ Changer en position de départ @@WAYPOINT-CENTRE2@@ Centrer cette étape sur la carte @@WAYPOINT-DOWN@@ Placer cette étape après @@WAYPOINT-REMOVE@@ supprimer cette étape @@WAYPOINT-REVERSE@@ Inverser l'ordre des étapes @@WAYPOINT-REVERSE-BUTTON@@ Inverser l'ordre @@WAYPOINT-LOOP@@ Ajouter une nouvelle étape pour faire une boucle @@WAYPOINT-LOOP-BUTTON@@ Faire une boucle @@TRANSPORT-FOOT@@ À pied @@TRANSPORT-HORSE@@ À cheval @@TRANSPORT-WHEELCHAIR@@ Fauteuil roulant @@TRANSPORT-BICYCLE@@ Bicyclette @@TRANSPORT-MOPED@@ Cyclomoteur @@TRANSPORT-MOTORCYCLE@@ Moto @@TRANSPORT-MOTORCAR@@ Voiture @@TRANSPORT-GOODS@@ Camionette @@TRANSPORT-HGV@@ Camion(15t) @@TRANSPORT-PSV@@ Camion(10t) @@HIGHWAY-MOTORWAY@@ Autoroute @@HIGHWAY-TRUNK@@ Voie rapide @@HIGHWAY-PRIMARY@@ Primaire @@HIGHWAY-SECONDARY@@ Secondaire @@HIGHWAY-TERTIARY@@ Tertiaire @@HIGHWAY-UNCLASSIFIED@@ Non classée @@HIGHWAY-RESIDENTIAL@@ Résidentiel @@HIGHWAY-SERVICE@@ Service @@HIGHWAY-TRACK@@ Piste @@HIGHWAY-CYCLEWAY@@ Piste cyclable @@HIGHWAY-PATH@@ Sentier @@HIGHWAY-STEPS@@ Escaliers @@HIGHWAY-FERRY@@ Ferry @@PROPERTY-PAVED@@ Pavée @@PROPERTY-MULTILANE@@ Voies multiples @@PROPERTY-BRIDGE@@ Pont @@PROPERTY-TUNNEL@@ Tunnel @@PROPERTY-WALKINGROUTE@@ Itinér. piéton @@PROPERTY-BICYCLEROUTE@@ Itinér. cycle @@RESTRICT-ONEWAY@@ Respecter les sens uniques @@RESTRICT-TURNS@@ Respecter les interdictions de tourner @@RESTRICT-WEIGHT@@ Poids @@RESTRICT-HEIGHT@@ Hauteur @@RESTRICT-WIDTH@@ Largeur @@RESTRICT-LENGTH@@ Longueur @@FIND-SHORTEST-ROUTE@@ Chercher l'itinéraire le plus court @@FIND-QUICKEST-ROUTE@@ Chercher l'itinéraire le plus rapide @@MAP-VIEW-LINK@@ Lien vers cet outil de visualisation @@EDIT-OSM-DATA@@ Editer cette donnée OSM @@ROUTER-NOT-RUN@@ Routage non lancé @@ROUTER-RUNNING@@ Routage en cours... @@ROUTER-COMPLETED@@ Routage terminé @@ROUTER-ERROR@@ Erreur de Routage @@ROUTER-FAILED@@ Le routage n'a pas été lancé correctement @@VIEW-DETAILS@@ Voir les détails @@NO-INFORMATION@@ Pas d'information @@HTML-ROUTE@@ Itinéraire HTML @@GPX-TRACK-ROUTE@@ Fichier trace GPX @@GPX-ROUTE@@ Fichier itinéraire GPX @@FULL-TEXT-ROUTE@@ Fichier texte complet @@TEXT-ROUTE@@ Fichier texte @@OPEN-POPUP@@ Ouvrir Popup @@DISPLAY-STATISTICS@@ Afficher les données statistiques @@JAVASCRIPT-REQUIRED@@ Javascript est nécessaire pour afficher la carte interactive. @@ROUTER@@ Routeur @@GEO-DATA@@ Geo Data @@TILES@@ Dalles # # Visualiser specific translations # @@VISUALISER-TITLE@@ Afficheur d'itinéraire @@INSTRUCTIONS-BOX@@ Instructions @@ROUTER-BOX@@ Planificateur de Routino @@NO-DATA-DISPLAYED@@ Aucune donnée affichée @@VISUALISER-FAILED@@ Échec de récupération des données d'affichage! @@VISUALISER-NUM-JUNCTIONS@@ # intersections traitées @@VISUALISER-NUM-SUPER@@ # segments/super-nœuds traités @@VISUALISER-NUM-WAYTYPE@@ # segments de type "way" traités @@VISUALISER-NUM-SEGMENTS@@ # segments traités @@VISUALISER-NUM-NODES@@ # nœuds traités @@VISUALISER-NUM-LIMITS@@ # changements de limites traités @@VISUALISER-NUM-ERRORS@@ # erreurs de log traitées @@JUNCTIONS-BUTTON@@ Afficher les intersections $$JUNCTIONS-INFO$$ Chaque nœud qui est une impasse, une jonction de deux autoroutes de différents types (ou propriétés différentes) ou une jonction où plus de deux segments joins sont affichés avec un code couleur. $$JUNCTIONS-INFO$$ @@JUNCTIONS-1@@ Chaussée simple - Sans issue @@JUNCTIONS-2@@ Carrefour de deux routes de différents types @@JUNCTIONS-3@@ Carrefour à trois intersections @@JUNCTIONS-4@@ Carrefour à quatre intersections @@JUNCTIONS-5@@ Carrefour à cinq intersections @@JUNCTIONS-6@@ Carrefour à six intersections @@JUNCTIONS-MORE@@ Carrefour en étoile @@SUPER-BUTTON@@ Afficher les Super Segments @@WAYTYPE-BUTTON@@ Afficher type de route du Segments @@WAYTYPE-ONEWAY@@ Segments à sens unique @@WAYTYPE-ROUNDABOUT@@ Tronçons de rond-point @@HIGHWAY-BUTTON@@ Afficher les tronçons d'autoroute $$HIGHWAY-INFO$$ Chaque segment du type d'autoroute choisi est dessiné. $$HIGHWAY-INFO$$ @@TRANSPORT-BUTTON@@ Afficher les segments de transport @@SPEED-BUTTON@@ Afficher les limites de vitesse @@LIMIT-CHANGE@@ Changement de limite @@LIMIT-NONE@@ Pas de limite spécifiée @@SPEED-LIMIT-80@@ Vitesse limitée à 80 km/h @@WEIGHT-BUTTON@@ Afficher les limites de poids @@WEIGHT-LIMIT-8@@ Interdit au plus de 8 tonnes @@HEIGHT-BUTTON@@ Afficher les limites de hauteur @@HEIGHT-LIMIT-4@@ Hauteur limitée à 4,0 m @@WIDTH-BUTTON@@ Afficher les limites de largeur @@WIDTH-LIMIT-3@@ Largeur limitée à 3,0 m @@LENGTH-BUTTON@@ Afficher les limites de longueur @@LENGTH-LIMIT-9@@ Longueur limitée à 9,0 m @@PROPERTY-BUTTON@@ Afficher propriétés route @@ERROR-LOG-BUTTON@@ Afficher le journal des erreurs $$ERROR-LOG-INFO$$ Problèmes potentiels rencontrés par Routino lors du traitement des données d'entrée. $$ERROR-LOG-INFO$$ @@CLEAR-DATA-BUTTON@@ Effacer données # # Multi-line descriptive translations (router) # $$ROUTER-INFO$$ Cette page web permet de calculer des itinéraires à l'aide des données collectées par OpenStreetMap. Sélectionner les points de départ et d'arrivée (cliquer sur les icones ci-dessous), sélectionner les préférences, puis rechercher un itinéraire. $$ROUTER-INFO$$ $$ROUTER-OPTIONS-HELP$$ Aide simplifiée
Cliquer sur les icones de balises (ci-dessus) pour les placer sur la carte (droite). Puis les déplacer à la position choisie. Il sera sûrement plus facile de zoomer sur la carte avant de placer les balises. Autre solution, taper la latitude et la longitude dans les cases ci-dessus.

Selectionner le mode de déplacement, les types de voies autorisées, les limitations de vitesse, les propriétés des voies et les autres restrictions dans les options ci-dessus. Selectionner "Le plus court" ou "Le plus rapide" pour calculer l'itinéraire et le visualiser sur la carte.

Etapes
Cliquer sur les balises affichera ou supprimera leur apparition sur la carte. Quand un itinéraire est calculé, il affichera (le plus près possible pour le mode de déplacement sélectionné) chacune des étapes qui ont une balise sur la carte dans l'ordre défini.

Mode de déplacement
Selectionner un mode de déplacement restreindra l'itinéraire choisi aux voies sur lesquelles il est autorisé et définira les valeurs par défaut pour les autres paramètres.

Préferences des voies
La préférence de voies est définie par un pourcentage et des itinéraires sont choisis qui essaient de suivre les voies préferrées. Par exemple, si une voie "Primaire" a une préférence de "110%" et une voie "Secondaire" une préférence de "100%", alors cela signifie qu'un itinéraire sur une voie primaire peut être jusqu'à 10% plus long que sur une voie secondaire et être sélectionné.

Limites de vitesse
Les limites de vitesse choisies ici pour les differents types de voies s'appliquent si la voie n'a pas d'autre limite de vitesse définie ou si celle-ci est supérieure à celle choisie.

Préférences de propriétés
La préférence de propriété est définie par un pourcentage et des itinéraires sont choisis qui essaient de suivre les voies ayant cette propriété préférée. Par exemple, si une voie goudronnée a une préférence de "75%", alors cela signifie que une voie non goudronnée obtient automatiquement une préférence de "25%" ce qui fait que un itinéraire sur une voie goudronnée peut avoir 3 fois la longueur d'une non goudronnée et être sélectionnée.

Autres restrictions
Celles-ci permettent de touver un itinéraire qui respecte les limites définies pour le poids, la hauteur, la largeur ou la longueur. Il est également possible d'ignorer les restrictions de sens unique (e. pour la marche). $$ROUTER-OPTIONS-HELP$$ $$ROUTER-RESULTS-HELP$$ Aide rapide
Après le calcul de l'itinéraire, vous pouvez télécharger le fichier GPX ou la description au format texte (résumé ou version détaillée). Vous pouvez également visualiser la description de l'itinéraire et zoomer sur des tronçons sélectionnés.

Résoudre un problème
Si le calculateur aboutie à une erreur, la cause la plus probable est que il n'est pas possible de trouver un itinéraire entre les points sélectionnés. Por permettre de trouver un itinéraire, déplacer une ou des balises ou changer les options de recherche.

Formats d'affichage

Instructions HTML
une description de l'itinéraire à prendre à chaque intersection importante.
Fichier chemin GPX
La même information qui est affichée sur la carte avec des points pour chaque noeud et des lignes pour tous les sègments.
Fichier route GPX
La même information qui est affichée en texte pour l'itinéraire avec une étape pour chaque intersection importante.
Fichier texte complet
Une liste de tous les noeuds traversés ainsi que la distance entre eux et la distance cumulée pour chaque étape de l'itinéraire.
Fichier texte
La même information qui est affichée en texte pour l'itinéraire.
$$ROUTER-RESULTS-HELP$$ $$ROUTER-VISUALISER-INFO$$ Pour comprendre comment Routino voit les données, il y a un outil de visualisation qui permet d'afficher les données soujacentes de multiples manières. $$ROUTER-VISUALISER-INFO$$ # # Multi-line descriptive translations (visualiser) # $$VISUALISER-INFO$$ Cette page Web permet de visualiser les données que Routino utilise pour le routage. Seules les données pertinentes pour le routage sont affichées et certaines seront donc exclues. $$VISUALISER-INFO$$ $$VISUALISER-INSTRUCTIONS$$ Zoomez puis utilisez les boutons ci-dessous pour télécharger les données. le Le serveur ne renverra des données que si la zone sélectionnée est suffisamment petite. $$VISUALISER-INSTRUCTIONS$$ $$VISUALISER-ROUTER-INFO$$ Pour effectuer le routage sur la carte utilisez le lien ci-dessous. $$VISUALISER-ROUTER-INFO$$ routino-3.4.3/web/translations/translation.cs.txt 644 233 144 10504 13741351732 15417 0# # Czech language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Vyvíjí %%copyright_source_string%% Zdroj %%copyright_source_text%% Postaveno na datech OpenStreetMap na %%copyright_license_string%% Licence %%turn_-4%% Velmi ostÅ™e vlevo %%turn_-3%% OstÅ™e vlevo %%turn_-2%% Vlevo %%turn_-1%% Lehce vlevo %%turn_0%% Přímo %%turn_1%% Lehce vpravo %%turn_2%% Vpravo %%turn_3%% OstÅ™e vpravo %%turn_4%% Velmi ostÅ™e vpravo %%heading_-4%% Jih %%heading_-3%% Jihozápad %%heading_-2%% Západ %%heading_-1%% Severozápad %%heading_0%% Sever %%heading_1%% Severovýchod %%heading_2%% Východ %%heading_3%% Jihovýchod %%heading_4%% Jih %%ordinal_1%% První %%ordinal_2%% Druhá %%ordinal_3%% TÅ™etí %%ordinal_4%% ÄŒtvrtá %%ordinal_5%% Pátá %%ordinal_6%% Å está %%ordinal_7%% Sedmá %%ordinal_8%% Osmá %%ordinal_9%% Devátá %%ordinal_10%% Desátá %%highway_motorway%% dálnice %%highway_trunk%% hlavní silnice %%highway_primary%% silnice I. třídy %%highway_secondary%% silnice II. třídy %%highway_tertiary%% silnice III. třídy %%highway_unclassified%% nekategorizovaná silnice %%highway_residential%% silnice v obytné Ätvrti %%highway_service%% obslužná silnice %%highway_cycleway%% cyklostezka %%highway_steps%% schody %%highway_ferry%% pÅ™evoz %%route_shortest%% Nejkratší %%route_quickest%% Nejrychlejší %%output-html_waypoint_junction%% KÅ™ižovatka %%output-html_waypoint_roundabout%% Kruhový objezd # # Router (and some shared) translations # @@LANGUAGE@@ ÄŒesky @@LANGUAGE-WEBPAGE@@ Stránka v ÄeÅ¡tinÄ› @@ROUTER-TITLE@@ PlánovaÄ tras pro OpenStreetMap Data @@OPTION-TAB@@ Možnosti @@OPTION-TAB-HELP@@ Nastavit možnosti plánování @@RESULTS-TAB@@ Výsledky @@RESULTS-TAB-HELP@@ Zobrazit výsledky plánování @@DATA-TAB@@ Data @@DATA-TAB-HELP@@ Zobrazit informaci databáze @@ROUTINO-ROUTER@@ Routino OpenStreetMap PlánovaÄ @@ROUTINO-WEBSITE@@ Webová stránka Routino @@DOCUMENTATION@@ Dokumentace @@LANGUAGE-BOX@@ Jazyk @@TRANSPORT-TYPE-BOX@@ Typ pÅ™epravy @@HIGHWAY-PREFERENCES-BOX@@ PÅ™edvolby pro dálnice @@SPEED-LIMITS-BOX@@ Rychlostní limity @@OTHER-RESTRICTIONS-BOX@@ Jiná omezení @@FIND-BOX@@ Hledat @@LINKS-BOX@@ Odkazy @@HELP-BOX@@ Pomoc @@STATUS-BOX@@ Stav @@SHORTEST-ROUTE@@ Nejkratší trasa @@QUICKEST-ROUTE@@ Nejrychlejší trasa @@STATISTICS-BOX@@ Routino statistiky @@VISUALISER-BOX@@ Routino vizualizér @@WAYPOINT-SEARCH@@ Hledat umístÄ›ní @@WAYPOINT-GET@@ Nalézt aktuální umístÄ›ní @@WAYPOINT-CENTRE1@@ VystÅ™edit mapu na tomto bodu @@WAYPOINT-UP@@ Posunout tento bod výše @@WAYPOINT-ADD@@ Po tomto bodu pÅ™idat další @@WAYPOINT-HOME@@ PÅ™epnout jako domovské umístÄ›ní @@WAYPOINT-CENTRE2@@ Vycentrovat tento bod na mapÄ› @@WAYPOINT-DOWN@@ Posunout tento bod níže @@WAYPOINT-REMOVE@@ Odstranit tento bod @@WAYPOINT-REVERSE@@ OpaÄné poÅ™adí bodů @@WAYPOINT-REVERSE-BUTTON@@ OpaÄné poÅ™adí @@WAYPOINT-LOOP@@ PÅ™idat bod pro vytvoÅ™ení okruhu @@WAYPOINT-LOOP-BUTTON@@ Uzavřít okruh @@TRANSPORT-FOOT@@ Pěší @@TRANSPORT-HORSE@@ Koňmo @@TRANSPORT-WHEELCHAIR@@ Vozík @@TRANSPORT-BICYCLE@@ Kolo @@TRANSPORT-MOPED@@ Moped @@TRANSPORT-MOTORCYCLE@@ Motocykl @@TRANSPORT-GOODS@@ Zboží @@HIGHWAY-PRIMARY@@ První třída @@HIGHWAY-SECONDARY@@ Druhá třída @@HIGHWAY-TERTIARY@@ TÅ™etí třída @@HIGHWAY-UNCLASSIFIED@@ NeoznaÄená @@HIGHWAY-STEPS@@ Schody @@HIGHWAY-FERRY@@ PÅ™evoz @@PROPERTY-BRIDGE@@ Most @@PROPERTY-TUNNEL@@ Tunel @@PROPERTY-WALKINGROUTE@@ Pěší trasa @@PROPERTY-BICYCLEROUTE@@ Cyklotrasa @@RESTRICT-ONEWAY@@ Dodržovat jednosmÄ›rky @@RESTRICT-WEIGHT@@ Hmotnost @@RESTRICT-HEIGHT@@ Výška @@RESTRICT-WIDTH@@ Šířka @@RESTRICT-LENGTH@@ Délka @@FIND-SHORTEST-ROUTE@@ Nalézt nejkratší cestu @@FIND-QUICKEST-ROUTE@@ Nalézt nejrychlejší cestu @@MAP-VIEW-LINK@@ Odkaz na tuto mapu @@EDIT-OSM-DATA@@ Upravit tato OSM data @@ROUTER-NOT-RUN@@ TrasovaÄ neběží @@ROUTER-RUNNING@@ TrasovaÄ běží... @@ROUTER-COMPLETED@@ Trasování ukonÄeno @@ROUTER-ERROR@@ Chyba trasování @@VIEW-DETAILS@@ Zobrazit detaily @@NO-INFORMATION@@ Žádné informace @@TEXT-ROUTE@@ Textový soubor @@OPEN-POPUP@@ Otevřít popup @@DISPLAY-STATISTICS@@ Zobrazit statistická data # # Visualiser specific translations # @@INSTRUCTIONS-BOX@@ Instrukce # # Multi-line descriptive translations (router) # # # Multi-line descriptive translations (visualiser) # routino-3.4.3/web/translations/translations-head.xml 644 233 144 1527 13157503575 16050 0 routino-3.4.3/web/translations/translation.ru.txt 644 233 144 22373 13643141523 15443 0# # Russian language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Ðвтор %%copyright_source_string%% ИÑточник %%copyright_source_text%% ИÑпользованы данные OpenStreetMap http://www.openstreetmap.org/ %%copyright_license_string%% Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ %%turn_-4%% очень крутой поворот налево %%turn_-3%% крутой поворот налево %%turn_-2%% налево %%turn_-1%% плавно налево %%turn_0%% прÑмо %%turn_1%% плавно направо %%turn_2%% направо %%turn_3%% крутой поворот направо %%turn_4%% очень крутой поворот направо %%heading_-4%% юг %%heading_-3%% юго-запад %%heading_-2%% запад %%heading_-1%% Ñеверо-запад %%heading_0%% Ñевер %%heading_1%% Ñеверо-воÑток %%heading_2%% воÑток %%heading_3%% юго-воÑток %%heading_4%% юг %%ordinal_1%% Первый %%ordinal_2%% Второй %%ordinal_3%% Третий %%ordinal_4%% Четвертый %%ordinal_5%% ПÑтый %%ordinal_6%% ШеÑтой %%ordinal_7%% Седьмой %%ordinal_8%% ВоÑьмой %%ordinal_9%% ДевÑтый %%ordinal_10%% ДеÑÑтый %%highway_motorway%% автомагиÑтраль %%highway_trunk%% Ð¼ÐµÐ¶Ð´ÑƒÐ½Ð°Ñ€Ð¾Ð´Ð½Ð°Ñ Ñ‚Ñ€Ð°ÑÑа %%highway_primary%% дорога регионального Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %%highway_secondary%% дорога облаÑтного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %%highway_tertiary%% дорога районного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %%highway_unclassified%% дорога меÑтного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %%highway_residential%% улица %%highway_service%% проезд %%highway_track%% дорога Ñ/Ñ… Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %%highway_cycleway%% велодорожка %%highway_path%% тропинка %%highway_steps%% леÑтница %%highway_ferry%% паром %%route_shortest%% Кратчайший %%route_quickest%% БыÑтрый %%output-html_waypoint_waypoint%% Точка %%output-html_waypoint_junction%% перекреÑтке %%output-html_waypoint_roundabout%% круговое движение %%output-html_title%% %s маршрут %%output-html_start%% Старт %s, на %s %%output-html_node%% на %s, %s, на %s %%output-html_segment%% Следуйте по %s %.3f км, %.1f мин %%output-html_stop%% Стоп %s %%output-html_total%% Ð’Ñего %.1f км, %.0f минут %%output-html_subtotal%% %.1f км, %.0f минут %%output-gpx_waypoint_waypt%% ТОЧКР%%output-gpx_waypoint_trip%% ПОЕЗДКР%%output-gpx_desc%% %s маршрут от 'Старта' до 'Финиша' %%output-gpx_name%% %s маршрут %%output-gpx_step%% на %s по '%s' %.3f км, %.1f мин %%output-gpx_final%% Ð’Ñего - %.1f км, продолжительноÑть - %.0f минут # # Router (and some shared) translations # @@LANGUAGE@@ РуÑÑкий @@LANGUAGE-WEBPAGE@@ Страница на руÑÑком Ñзыке @@OPTION-TAB@@ ÐаÑтройки @@OPTION-TAB-HELP@@ Задать наÑтройки маршрутизации @@RESULTS-TAB@@ Результаты @@RESULTS-TAB-HELP@@ Смотрите результат прокладки маршрута @@DATA-TAB@@ Данные @@ROUTINO-WEBSITE@@ Сайт Routino @@DOCUMENTATION@@ Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ @@LANGUAGE-BOX@@ Язык @@WAYPOINTS-BOX@@ Точки @@TRANSPORT-TYPE-BOX@@ Тип транÑпорта @@HIGHWAY-PREFERENCES-BOX@@ ÐаÑтройки типа дорог @@SPEED-LIMITS-BOX@@ ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти @@PROPERTY-PREFERENCES-BOX@@ ÐаÑтройки качеÑтва дорог @@OTHER-RESTRICTIONS-BOX@@ Другие Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ @@FIND-BOX@@ Ðайти @@LINKS-BOX@@ СÑылки @@HELP-BOX@@ Помощь @@STATUS-BOX@@ Ð¡Ñ‚Ð°Ñ‚ÑƒÑ @@SHORTEST-ROUTE@@ Кратчайший маршрут @@QUICKEST-ROUTE@@ БыÑтрейший маршрут @@STATISTICS-BOX@@ Routino СтатиÑтика @@WAYPOINT-SEARCH@@ ПоиÑк по адреÑу @@WAYPOINT-GET@@ Текущее меÑтоположение @@WAYPOINT-CENTRE1@@ Центрировать карту на Ñтой точке @@WAYPOINT-UP@@ ПомеÑтить точку выше @@WAYPOINT-ADD@@ Добавить Ñледующую точку @@WAYPOINT-COORDS@@ По координатам @@WAYPOINT-HOME@@ Переключение домашней локации @@WAYPOINT-CENTRE2@@ ПеремеÑтить точку в центр карты @@WAYPOINT-DOWN@@ ПомеÑтить точку ниже @@WAYPOINT-REMOVE@@ Удалить Ñту путевую точку @@WAYPOINT-REVERSE@@ ПереÑтроить в обратном порÑдке @@WAYPOINT-REVERSE-BUTTON@@ Обратный порÑдок @@WAYPOINT-LOOP@@ Добавить точку Ð´Ð»Ñ Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ @@WAYPOINT-LOOP-BUTTON@@ Зациклить @@TRANSPORT-FOOT@@ Пешком @@TRANSPORT-HORSE@@ Лошадь @@TRANSPORT-WHEELCHAIR@@ Инвалидное креÑло @@TRANSPORT-BICYCLE@@ ВелоÑипед @@TRANSPORT-MOPED@@ Мопед @@TRANSPORT-MOTORCYCLE@@ Мотоцикл @@TRANSPORT-MOTORCAR@@ Машина @@TRANSPORT-GOODS@@ Фургон @@TRANSPORT-HGV@@ Грузовой автомобиль @@TRANSPORT-PSV@@ ÐÐ²Ñ‚Ð¾Ð±ÑƒÑ @@HIGHWAY-MOTORWAY@@ ÐвтомагиÑтраль @@HIGHWAY-TRUNK@@ ÐœÐµÐ¶Ð´ÑƒÐ½Ð°Ñ€Ð¾Ð´Ð½Ð°Ñ Ñ‚Ñ€Ð°ÑÑа @@HIGHWAY-PRIMARY@@ Дорога регионального Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ @@HIGHWAY-SECONDARY@@ Дорога облаÑтного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ @@HIGHWAY-TERTIARY@@ Дорога районного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ @@HIGHWAY-UNCLASSIFIED@@ Дорога меÑтного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ @@HIGHWAY-RESIDENTIAL@@ Улица @@HIGHWAY-SERVICE@@ Проезд @@HIGHWAY-TRACK@@ Дорога Ñ/Ñ… Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ @@HIGHWAY-CYCLEWAY@@ Велодорожка @@HIGHWAY-PATH@@ Тропинка @@HIGHWAY-STEPS@@ ЛеÑтница @@HIGHWAY-FERRY@@ Паром @@PROPERTY-PAVED@@ ÐœÐ¾Ñ‰ÐµÐ½Ð°Ñ @@PROPERTY-MULTILANE@@ МногополоÑÐ½Ð°Ñ @@PROPERTY-BRIDGE@@ МоÑÑ‚ @@PROPERTY-TUNNEL@@ Туннель @@PROPERTY-WALKINGROUTE@@ Пеший маршрут @@PROPERTY-BICYCLEROUTE@@ Велодорожка @@RESTRICT-ONEWAY@@ ОдноÑтороннÑÑ ÑƒÐ»Ð¸Ñ†Ð° @@RESTRICT-TURNS@@ ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²Ð¾Ñ€Ð¾Ñ‚Ð° @@RESTRICT-WEIGHT@@ Ð’ÐµÑ @@RESTRICT-HEIGHT@@ Ð’Ñ‹Ñота @@RESTRICT-WIDTH@@ Ширина @@RESTRICT-LENGTH@@ Длина @@FIND-SHORTEST-ROUTE@@ Ðайти кратчайший маршрут @@FIND-QUICKEST-ROUTE@@ Ðайти быÑтрейший маршут @@EDIT-OSM-DATA@@ Редактировать данные OSM @@ROUTER-NOT-RUN@@ Маршрутизатор не запущен @@ROUTER-RUNNING@@ Прокладка маршрута... @@ROUTER-COMPLETED@@ Прокладка маршрута завершена @@ROUTER-ERROR@@ Ошибка прокладки маршрута @@ROUTER-FAILED@@ Ошибка при запуÑке @@VIEW-DETAILS@@ Подробнее @@NO-INFORMATION@@ ПуÑто @@HTML-ROUTE@@ HTML навигатор @@GPX-TRACK-ROUTE@@ Трек в формате GPX @@GPX-ROUTE@@ Маршрут в формате GPX @@FULL-TEXT-ROUTE@@ Подробный текÑтовый файл @@TEXT-ROUTE@@ ТекÑтовый файл @@OPEN-POPUP@@ Открыть @@DISPLAY-STATISTICS@@ Показать ÑтатиÑтику данных @@JAVASCRIPT-REQUIRED@@ Javascript обÑзателен Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра данной Ñтраницы, так как на ней иÑпользуетÑÑ Ð¸Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°. @@ROUTER@@ Маршрутизатор @@GEO-DATA@@ Гео данные @@TILES@@ Тайлы # # Visualiser specific translations # @@INSTRUCTIONS-BOX@@ ИнÑтрукции @@NO-DATA-DISPLAYED@@ Ðет данных Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ @@VISUALISER-NUM-SEGMENTS@@ Обработано # Ñегментов @@VISUALISER-NUM-NODES@@ Обработано # нод @@VISUALISER-NUM-TURNS@@ Обработано # ограничений поворотов @@WAYTYPE-ONEWAY@@ Ñегмент одноÑторонней дороги @@TURNS-BUTTON@@ Показывать Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²Ð¾Ñ€Ð¾Ñ‚Ð¾Ð² @@SPEED-BUTTON@@ Показывать Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти @@LIMIT-CHANGE@@ Изменить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ @@LIMIT-NONE@@ Ðет отграничений @@SPEED-LIMIT-80@@ Ограничение ÑкороÑти 80 км/ч @@WEIGHT-BUTTON@@ Показывать Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ веÑу @@WEIGHT-LIMIT-8@@ Ограничение веÑа 8 тонн @@HEIGHT-BUTTON@@ Показывать ограничение по выÑоте @@HEIGHT-LIMIT-4@@ Ограничение выÑоты 4.0 метра @@WIDTH-BUTTON@@ Показывать ограничение ширины @@WIDTH-LIMIT-3@@ Ограничение ширины 3.0 метра @@LENGTH-BUTTON@@ Показать Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ð¸Ð½Ð½Ñ‹ @@LENGTH-LIMIT-9@@ Ограничение длинны 9.0 метров @@ERROR-LOG-BUTTON@@ Показать лог ошибок @@CLEAR-DATA-BUTTON@@ ОчиÑтить данные # # Multi-line descriptive translations (router) # # # Multi-line descriptive translations (visualiser) # $$VISUALISER-ROUTER-INFO$$ Ð”Ð»Ñ Ð¿Ñ€Ð¾ÐºÐ»Ð°Ð´ÐºÐ¸ маршрута на карте иÑпользуйте ÑÑылку ниже. $$VISUALISER-ROUTER-INFO$$ routino-3.4.3/web/translations/translation.pl.txt 644 233 144 15165 14130256707 15434 0# # Polish language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Twórca %%copyright_source_string%% ŹródÅ‚o %%copyright_source_text%% Oparte na danych OpenStreetMap ze strony http://www.openstreetmap.org/ %%copyright_license_string%% Licencja %%turn_-4%% Bardzo ostro w lewo %%turn_-3%% Ostro w lewo %%turn_-2%% W lewo %%turn_-1%% Lekko w lewo %%turn_0%% Prosto %%turn_1%% Lekko w prawo %%turn_2%% W prawo %%turn_3%% Ostro w prawo %%turn_4%% Bardzo ostro w prawo %%heading_-4%% Na poÅ‚udnie %%heading_-3%% Na poÅ‚udniowy zachód %%heading_-2%% Na zachód %%heading_-1%% Na północny zachód %%heading_0%% Na północ %%heading_1%% Na północny wschód %%heading_2%% Na wschód %%heading_3%% Na poÅ‚udniowy wschód %%heading_4%% Na poÅ‚udnie %%ordinal_1%% Pierwszy %%ordinal_2%% Drugi %%ordinal_3%% Trzeci %%ordinal_4%% Czwarty %%ordinal_5%% PiÄ…ty %%ordinal_6%% Szósty %%ordinal_7%% Siódmy %%ordinal_8%% Ósmy %%ordinal_9%% DziewiÄ…ty %%ordinal_10%% DziesiÄ…ty %%highway_motorway%% Autostrada %%highway_trunk%% Droga ekspresowa %%highway_primary%% Droga krajowa %%highway_secondary%% Droga powiatowa %%highway_tertiary%% Droga lokalna %%highway_unclassified%% Droga nieznanego typu %%highway_residential%% Droga osiedlowa %%highway_service%% Droga dojazdowa %%highway_track%% Droga polna %%highway_cycleway%% Droga rowerowa %%highway_path%% Åšcieżka %%highway_steps%% Pieszo %%highway_ferry%% Prom %%route_shortest%% Najkrótsza %%route_quickest%% Najszybsza %%output-html_waypoint_waypoint%% Punkt %%output-html_waypoint_junction%% Połączenie %%output-html_waypoint_roundabout%% Rondo %%output-html_title%% %s Trasa %%output-html_start%% Start %s kieruj siÄ™ na %s %%output-html_node%% Jedź %s, dalej %s przez %s %%output-html_rbnode%% Zjedź %s, skręć w %s, nastÄ™pnie %s %%output-html_segment%% Podążaj %s przez %.3f km, %.1f min. %%output-html_stop%% Stop Na %s %%output-html_total%% CaÅ‚kowity %.1f km, %.0f min. %%output-html_subtotal%% %.1f km, %.0f min. %%output-gpx_waypoint_waypt%% Punkt %%output-gpx_waypoint_trip%% Podróż %%output-gpx_desc%% %s trasa pomiÄ™dzy 'start' a 'koniec' %%output-gpx_name%% %s trasa %%output-gpx_step%% %s na %s przez %.3f km, %.1f min. %%output-gpx_final%% CaÅ‚kowita podróż %.1f km, %.0f min. # # Router (and some shared) translations # @@LANGUAGE@@ Polski @@LANGUAGE-WEBPAGE@@ Polski webpage @@ROUTER-TITLE@@ Planowanie trasy dla Danych OpenStreetMap @@OPTION-TAB@@ Opcje @@OPTION-TAB-HELP@@ Ustaw punkty trasy @@RESULTS-TAB@@ Wyniki @@RESULTS-TAB-HELP@@ Zobacz wyniki @@DATA-TAB@@ Dane @@DATA-TAB-HELP@@ Zobacz informacje bazy danych @@ROUTINO-ROUTER@@ Routino OpenStreetMap Planowanie Trasy @@ROUTINO-WEBSITE@@ Strona Routino @@DOCUMENTATION@@ Dokumentacja @@LANGUAGE-BOX@@ JÄ™zyk @@WAYPOINTS-BOX@@ Punkty @@TRANSPORT-TYPE-BOX@@ Typ transportu @@HIGHWAY-PREFERENCES-BOX@@ Preferowanie autostrad @@SPEED-LIMITS-BOX@@ Ograniczenia prÄ™dkoÅ›ci @@PROPERTY-PREFERENCES-BOX@@ Ustawienia zmiennych @@OTHER-RESTRICTIONS-BOX@@ Inne ograniczenia @@FIND-BOX@@ Znajdź @@LINKS-BOX@@ Połączenia @@HELP-BOX@@ Pomoc @@STATUS-BOX@@ Status @@SHORTEST-ROUTE@@ Najkrótsza trasa @@QUICKEST-ROUTE@@ Najszybsza trasa @@STATISTICS-BOX@@ Statystyki Routino @@VISUALISER-BOX@@ Wizualizer Routino @@WAYPOINT-POSITION@@ Punkt XXX trasy @@WAYPOINT-LONGITUDE@@ Punkt XXX dÅ‚ugoÅ›ci geograficznej @@WAYPOINT-LATITUDE@@ Punkt XXX szerokoÅ›ci geograficznej @@WAYPOINT-LOCATION@@ Punkt orientacyjny XXX @@WAYPOINT-SEARCH@@ Znajdź miejsce @@WAYPOINT-GET@@ Pobierz aktualna lokalizacjÄ™ @@WAYPOINT-CENTRE1@@ Wycentruj mapÄ™ na tym punkcie @@WAYPOINT-UP@@ PrzenieÅ› ten punkt wyżej @@WAYPOINT-ADD@@ Dodaj punkt po tym @@WAYPOINT-COORDS@@ WspółrzÄ™dne dla lokalizacji @@WAYPOINT-HOME@@ WspółrzÄ™dne lokalizacji @@WAYPOINT-CENTRE2@@ WyÅ›rodkuj ten punkt na mapie @@WAYPOINT-DOWN@@ PrzesuÅ„ punkt na dół @@WAYPOINT-REMOVE@@ UsuÅ„ punkt @@WAYPOINT-REVERSE@@ Odwrotna kolejność punktów trasy @@WAYPOINT-REVERSE-BUTTON@@ Odwrotna kolejność @@WAYPOINT-LOOP@@ Dodaj nowy punkt, aby zrobić pÄ™tlÄ™ @@WAYPOINT-LOOP-BUTTON@@ Zamknij pÄ™tlÄ™ @@TRANSPORT-FOOT@@ Pieszo @@TRANSPORT-HORSE@@ Konno @@TRANSPORT-WHEELCHAIR@@ Wózek inwalidzki @@TRANSPORT-BICYCLE@@ Rower @@TRANSPORT-MOPED@@ Moped @@TRANSPORT-MOTORCYCLE@@ Motocykl @@TRANSPORT-MOTORCAR@@ Samochód @@TRANSPORT-GOODS@@ Dobra @@TRANSPORT-HGV@@ Pojazd ciężarowy @@TRANSPORT-PSV@@ Pojazd użytecznoÅ›ci publicznej @@HIGHWAY-MOTORWAY@@ Autostrada @@HIGHWAY-PRIMARY@@ Droga krajowa @@HIGHWAY-SECONDARY@@ Droga wojewódzka @@HIGHWAY-TERTIARY@@ Droga powiatowa @@HIGHWAY-UNCLASSIFIED@@ Niesklasyfikowana @@HIGHWAY-RESIDENTIAL@@ W obszarze zamieszkania @@HIGHWAY-SERVICE@@ Dojazdowa @@HIGHWAY-TRACK@@ Åšcieżka @@HIGHWAY-CYCLEWAY@@ Rowerowa @@HIGHWAY-PATH@@ Åšcieżka @@HIGHWAY-STEPS@@ Kroki @@HIGHWAY-FERRY@@ Przeprawa @@PROPERTY-MULTILANE@@ Wiele pasów @@PROPERTY-BRIDGE@@ Most @@PROPERTY-TUNNEL@@ Tunel @@PROPERTY-WALKINGROUTE@@ Trasa piesza @@PROPERTY-BICYCLEROUTE@@ Trasa rowerowa @@RESTRICT-ONEWAY@@ Respektuj ulice jednokierunkowe @@RESTRICT-TURNS@@ Respektuj ograniczenia skrÄ™tu @@RESTRICT-WEIGHT@@ Waga @@RESTRICT-HEIGHT@@ Wysokość @@RESTRICT-WIDTH@@ Szerokość @@RESTRICT-LENGTH@@ DÅ‚ugość @@FIND-SHORTEST-ROUTE@@ Znajdź najkrótsza trasÄ™ @@FIND-QUICKEST-ROUTE@@ Znajdź najdÅ‚uższÄ… trasÄ™ @@ROUTER-NOT-RUN@@ Nie uruchomiono wyznaczania trasy @@ROUTER-RUNNING@@ Wyznaczanie trasy w trakcie... @@ROUTER-COMPLETED@@ Trasa wyznaczona @@ROUTER-ERROR@@ Błąd wyznaczania trasy @@ROUTER-FAILED@@ Błąd uruchomienia wyznaczania trasy @@VIEW-DETAILS@@ Zobacz szczegóły @@NO-INFORMATION@@ Brak informacji @@GPX-TRACK-ROUTE@@ Plik trasy w formacie GPX @@GPX-ROUTE@@ Plik nawigacji w formacie GPX @@TEXT-ROUTE@@ Plik tekstowy @@TILES@@ Kafelki # # Visualiser specific translations # @@INSTRUCTIONS-BOX@@ Instrukcje @@NO-DATA-DISPLAYED@@ Brak danych do wyÅ›wietlenia @@TURNS-BUTTON@@ WyÅ›wietlaj zakazy skrÄ™tu @@SPEED-BUTTON@@ WyÅ›wietlaj ograniczenia prÄ™dkoÅ›ci @@SPEED-LIMIT-80@@ Ograniczenie prÄ™dkoÅ›ci do 80 km/h @@WEIGHT-BUTTON@@ WyÅ›wietlaj ograniczenia ciężaru @@WEIGHT-LIMIT-8@@ Ograniczenie ciężaru do 8.0 ton @@HEIGHT-BUTTON@@ WyÅ›wietlaj ograniczenia wysokoÅ›ci @@HEIGHT-LIMIT-4@@ Ograniczenie wysokoÅ›ci do 4.0 m @@WIDTH-BUTTON@@ WyÅ›wietlaj ograniczenia szerokoÅ›ci @@WIDTH-LIMIT-3@@ Ograniczenie szerokoÅ›ci do 3.0 m @@LENGTH-BUTTON@@ WyÅ›wietlaj ograniczenia dÅ‚ugoÅ›ci @@LENGTH-LIMIT-9@@ Ograniczenie dÅ‚ugoÅ›ci do 9.0 m @@CLEAR-DATA-BUTTON@@ Wyczyść # # Multi-line descriptive translations (router) # # # Multi-line descriptive translations (visualiser) # $$VISUALISER-ROUTER-INFO$$ Aby wyznaczyć trasÄ™ na mapie użyj linku poniżej $$VISUALISER-ROUTER-INFO$$ routino-3.4.3/web/translations/translation.de.txt 644 233 144 35060 14575620513 15410 0# # German language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Urheber %%copyright_source_string%% Quelle %%copyright_source_text%% Basierend auf OpenStreetMap-Daten, erhältlich via http://www.openstreetmap.org/ %%copyright_license_string%% Lizenz %%turn_-4%% Sehr scharf links %%turn_-3%% Scharf links %%turn_-2%% Links %%turn_-1%% Halb links %%turn_0%% Geradeaus %%turn_1%% Halb rechts %%turn_2%% Rechts %%turn_3%% Scharf rechts %%turn_4%% Sehr scharf rechts %%heading_-4%% Süd %%heading_-3%% Süd-West %%heading_-2%% West %%heading_-1%% Nord-West %%heading_0%% Nord %%heading_1%% Nord-Ost %%heading_2%% Ost %%heading_3%% Süd-Ost %%heading_4%% Süd %%ordinal_1%% Erste %%ordinal_2%% Zweite %%ordinal_3%% Dritte %%ordinal_4%% Vierte %%ordinal_5%% Fünfte %%ordinal_6%% Sechste %%ordinal_7%% Siebte %%ordinal_8%% Achte %%ordinal_9%% Neunte %%ordinal_10%% Zehnte %%highway_motorway%% Autobahn %%highway_trunk%% Schnellstraße %%highway_primary%% Bundesstraße %%highway_secondary%% Landesstraße %%highway_tertiary%% Kreisstraße %%highway_unclassified%% Nebenstraße %%highway_residential%% Wohngebietsstraße %%highway_service%% Erschließungsweg %%highway_track%% Feld-/Waldweg %%highway_cycleway%% Radweg %%highway_path%% Weg/Pfad %%highway_steps%% Treppe %%highway_ferry%% Fähre %%route_shortest%% Kürzeste %%route_quickest%% Schnellste %%output-html_waypoint_waypoint%% Wegpunkt %%output-html_waypoint_junction%% Anschlussstelle %%output-html_waypoint_roundabout%% Kreisverkehr %%output-html_title%% %s Route %%output-html_start%% Start bei %s halten Sie sich Richtung %s %%output-html_node%% Bei %s wenden Sie sich nach %s Richtung %s %%output-html_rbnode%% Verlassen Sie %s, nehmen Sie die %s Ausfahrt Richtung %s %%output-html_segment%% Folgen Sie der %s für %.3f km bzw. %.1f min %%output-html_stop%% Stop Sie sind bei %s angekommen %%output-html_total%% Gesamt %.1f km, %.0f minuten %%output-html_subtotal%% %.1f km, %.0f minuten %%output-gpx_waypoint_waypt%% Wegpunkt %%output-gpx_waypoint_trip%% Reiseroute %%output-gpx_desc%% %s Strecke zwischen 'Start' und 'Ziel' %%output-gpx_name%% %s Strecke %%output-gpx_step%% %s auf '%s' für %.3f km, %.1f min %%output-gpx_final%% Gesamtstrecke %.1f km, %.0f minuten # # Router (and some shared) translations # @@LANGUAGE@@ Deutsch @@LANGUAGE-WEBPAGE@@ Deutsche Webseite @@ROUTER-TITLE@@ Routen Planer für OpenStreetMap Daten @@OPTION-TAB@@ Optionen @@OPTION-TAB-HELP@@ Setze Routing-Optionen @@RESULTS-TAB@@ Ergebnisse @@RESULTS-TAB-HELP@@ Sieh die Ergebnisse @@DATA-TAB@@ Daten @@DATA-TAB-HELP@@ Sieh die Datenbankinformationen @@ROUTINO-ROUTER@@ Routino OpenStreetMap Router @@ROUTINO-WEBSITE@@ Routino Website @@DOCUMENTATION@@ Dokumentation @@LANGUAGE-BOX@@ Sprache @@WAYPOINTS-BOX@@ Wegpunkte @@TRANSPORT-TYPE-BOX@@ Fortbewegungsart @@HIGHWAY-PREFERENCES-BOX@@ Vorgaben zur Wegnutzung @@SPEED-LIMITS-BOX@@ Geschwindigkeitsbegrenzung @@PROPERTY-PREFERENCES-BOX@@ Vorgaben zur Wegbeschaffenheit @@OTHER-RESTRICTIONS-BOX@@ andere Vorgaben @@FIND-BOX@@ Suche @@LINKS-BOX@@ Verbindungen @@HELP-BOX@@ Hilfe @@STATUS-BOX@@ Status @@SHORTEST-ROUTE@@ kürzester Weg @@QUICKEST-ROUTE@@ schnellste Route @@STATISTICS-BOX@@ Routino Statistik @@VISUALISER-BOX@@ Routino Ansichten @@WAYPOINT-POSITION@@ Wegpunkt XXX Position @@WAYPOINT-LONGITUDE@@ Wegpunkt XXX geografische Länge @@WAYPOINT-LATITUDE@@ Wegpunkt XXX geografische Breite @@WAYPOINT-LOCATION@@ Wegpunkt XXX Ort @@WAYPOINT-SEARCH@@ Nach Ort suchen @@WAYPOINT-GET@@ Aktuellen Ort bestimmen @@WAYPOINT-CENTRE1@@ Karte auf Wegpunkt zentrieren @@WAYPOINT-UP@@ Wegpunkt nach oben verschieben @@WAYPOINT-ADD@@ Neuer Wegpunkt nach diesem @@WAYPOINT-COORDS@@ Koordinaten des Orts @@WAYPOINT-HOME@@ Umschalten auf den Standort des Zuhauses @@WAYPOINT-CENTRE2@@ Wegpunkt auf Karte zentrieren @@WAYPOINT-DOWN@@ Wegpunkt nach unten verschieben @@WAYPOINT-REMOVE@@ Wegpunkt entfernen @@WAYPOINT-REVERSE@@ Rückwärts @@WAYPOINT-REVERSE-BUTTON@@ Rückwärts @@WAYPOINT-LOOP@@ Einen Wegpunkt hinzufügen um eine Schleife zu machen @@WAYPOINT-LOOP-BUTTON@@ Schleife schließen @@TRANSPORT-FOOT@@ Fußgänger @@TRANSPORT-HORSE@@ Pferd @@TRANSPORT-WHEELCHAIR@@ Rollstuhl @@TRANSPORT-BICYCLE@@ Fahrrad @@TRANSPORT-MOPED@@ Moped @@TRANSPORT-MOTORCYCLE@@ Motorrad @@TRANSPORT-MOTORCAR@@ Auto @@TRANSPORT-GOODS@@ LKW @@TRANSPORT-HGV@@ Schwertransport/LKW @@TRANSPORT-PSV@@ Öffentlicher Personenverkehr @@HIGHWAY-MOTORWAY@@ Autobahn @@HIGHWAY-TRUNK@@ Schnellstraße @@HIGHWAY-PRIMARY@@ Bundesstraße @@HIGHWAY-SECONDARY@@ Landesstraße @@HIGHWAY-TERTIARY@@ Hauptstraße @@HIGHWAY-UNCLASSIFIED@@ Straße @@HIGHWAY-RESIDENTIAL@@ Wohnstraße @@HIGHWAY-SERVICE@@ Zufahrtsweg @@HIGHWAY-TRACK@@ Feld-(Wald-)weg @@HIGHWAY-CYCLEWAY@@ Fahrradweg @@HIGHWAY-PATH@@ Fußweg @@HIGHWAY-STEPS@@ Treppe @@HIGHWAY-FERRY@@ Fähre @@PROPERTY-PAVED@@ befestigt @@PROPERTY-MULTILANE@@ mehrspurig @@PROPERTY-BRIDGE@@ Brücken @@PROPERTY-TUNNEL@@ Tunnel @@PROPERTY-WALKINGROUTE@@ Wanderweg @@PROPERTY-BICYCLEROUTE@@ Radweg @@RESTRICT-ONEWAY@@ beachte Einbahnstraßen @@RESTRICT-TURNS@@ beachte Abbiegeverbot @@RESTRICT-WEIGHT@@ Gewicht @@RESTRICT-HEIGHT@@ Höhe @@RESTRICT-WIDTH@@ Breite @@RESTRICT-LENGTH@@ Länge @@FIND-SHORTEST-ROUTE@@ Kürzeste Route finden @@FIND-QUICKEST-ROUTE@@ Schnellste Route finden @@MAP-VIEW-LINK@@ anpassen dieser Kartenansicht @@EDIT-OSM-DATA@@ Bearbeitet die OSM-Daten @@ROUTER-NOT-RUN@@ Router läuft nicht @@ROUTER-RUNNING@@ Router läuft... @@ROUTER-COMPLETED@@ Routing fertig @@ROUTER-ERROR@@ Router Fehler @@ROUTER-FAILED@@ Router funktioniert nicht @@VIEW-DETAILS@@ zeige Details @@NO-INFORMATION@@ keine Information @@HTML-ROUTE@@ HTML @@GPX-TRACK-ROUTE@@ GPX Track-Datei @@GPX-ROUTE@@ GPX Routen-Datei @@FULL-TEXT-ROUTE@@ Volltext-Datei @@TEXT-ROUTE@@ Text-Datei @@OPEN-POPUP@@ öffne Popup @@DISPLAY-STATISTICS@@ zeige die Statistik @@JAVASCRIPT-REQUIRED@@ Um die interaktive Karte zu nutzen iWork Javascript benötigt. @@ROUTER@@ Router @@GEO-DATA@@ Geodaten @@TILES@@ Kacheln # # Visualiser specific translations # @@VISUALISER-TITLE@@ Visualisierung der Routing-Daten @@INSTRUCTIONS-BOX@@ Anweisungen @@ROUTER-BOX@@ Routino Router @@NO-DATA-DISPLAYED@@ Keine Daten angezeigt @@VISUALISER-FAILED@@ Fehler bei der Erstellung der visuellen Daten! @@VISUALISER-NUM-JUNCTIONS@@ # Kreuzungen verarbeitet @@VISUALISER-NUM-SUPER@@ # Super-Knoten/Segmente verarbeitet @@VISUALISER-NUM-WAYTYPE@@ # Wegtypen Segmente verarbeitet @@VISUALISER-NUM-SEGMENTS@@ # Segmente verarbeitet @@VISUALISER-NUM-NODES@@ # Knoten verarbeitet @@VISUALISER-NUM-TURNS@@ # Abbiegebeschrängkungen verarbeitet @@VISUALISER-NUM-LIMITS@@ # Limit-Änderungen verarbeitet @@VISUALISER-NUM-ERRORS@@ # Error Logs erstellt @@JUNCTIONS-BUTTON@@ Kreuzungen anzeigen $$JUNCTIONS-INFO$$ Jeder Knoten der eine Sackgasse, eine Kreuzung zwischen zwei Autobahnen mit unterschiedlichen Typ (oder unterschiedlichen Eigenschaften), oder eine Kreuzung zwischen mehr als zwei Segmenten ist, wird rot dargestellt. $$JUNCTIONS-INFO$$ @@JUNCTIONS-1@@ ein Weg - Sackgasse @@JUNCTIONS-2@@ Aufeinandertreffen zweier Wege unterschiedlichen Typs. @@JUNCTIONS-3@@ Aufeinandertreffen von drei Wegen. @@JUNCTIONS-4@@ Aufeinandertreffen von vier Wegen. @@JUNCTIONS-5@@ Aufeinandertreffen von fünf Wegen. @@JUNCTIONS-6@@ Aufeinandertreffen von sechs Wegen. @@JUNCTIONS-MORE@@ Aufeinandertreffen von sieben oder mehr Wegen. @@SUPER-BUTTON@@ Super-Segments anzeigen $$SUPER-INFO$$ Jeder Superknoten und die zugehörigen Supersegmente werden angezeigt (siehe Algorithmus-Seite zur Beschreibung). $$SUPER-INFO$$ @@WAYTYPE-BUTTON@@ Wegart des Abschnittes anzeigen $$WAYTYPE-INFO$$ Spezial-Arten der Abschnitte (Einbahnstraße, beidseitige Fahrradwege und Kreisverkehre) werden angezeigt. Ein koloriertes Dreieck zeigt die erlaubte Fahrtrichtung an. Die Farben der Dreiecke hängen von der jeweiligen Art des Abschnittes ab. $$WAYTYPE-INFO$$ @@WAYTYPE-ONEWAY@@ Einbahnstraßen Segmente @@WAYTYPE-CYCLE-BOTH-WAYS@@ Fahrradweg auf beiden Seiten des Abschnittes @@WAYTYPE-ROUNDABOUT@@ Kreisverkehr Segmente @@HIGHWAY-BUTTON@@ Wegabschnitte anzeigen $$HIGHWAY-INFO$$ Jeder Abschnitt der ausgewählten Wegart ist gezeichnet. $$HIGHWAY-INFO$$ @@TRANSPORT-BUTTON@@ Transport-Segmente anzeigen $$TRANSPORT-INFO$$ Jedes für die gewählte Transportart erlaubte Segment wird gezeichnet. $$TRANSPORT-INFO$$ $$BARRIER-INFO$$ Jedes Hindernis welches den gewählten Transporttyp blockiert ist dargestellt. $$BARRIER-INFO$$ @@TURNS-BUTTON@@ Zeige Abbiegebeschränkungen $$TURNS-INFO$$ Jede Abbiegebeschränkung wird mit einer Linie angezeigt $$TURNS-INFO$$ @@SPEED-BUTTON@@ Zeige Geschwindigkeitsbeschränkungen @@LIMIT-CHANGE@@ Änderung der Beschränkung @@LIMIT-NONE@@ Keine Beschränkung @@SPEED-LIMIT-80@@ 80 km/Stunde Geschwindigkeitsbegrenzung @@WEIGHT-BUTTON@@ Gewichtswegbeschränkungen anzeigen @@WEIGHT-LIMIT-8@@ 8 Tonnen Wegbeschränkung @@HEIGHT-BUTTON@@ Maximale Höhe anzeigen @@HEIGHT-LIMIT-4@@ 4.0 m Höhenbeschränkung @@WIDTH-BUTTON@@ Maximale Breite anzeigen @@WIDTH-LIMIT-3@@ max. 3,0 m Breite @@LENGTH-BUTTON@@ Längenbeschränkung anzeigen $$LENGTH-INFO$$ Jeder Knoten an dem Segmente mit unterschiedlichen Längenbeschränkungen verknüpft werden, wird zusammen mit den Längenbeschränkungen auf den relevanten Segmenten angezeigt $$LENGTH-INFO$$ @@LENGTH-LIMIT-9@@ 9.0 m Längenbeschränkung @@PROPERTY-BUTTON@@ Anzeigen der Wegeigenschaften $$PROPERTY-INFO$$ Jedes Segment der Autobahn / Schnellstraße mit speziellen Eigenschaften wurden dargestellt. $$PROPERTY-INFO$$ @@ERROR-LOG-BUTTON@@ Anzeige Fehlerprotokoll $$ERROR-LOG-INFO$$ Routino hat potentielle Problem beim verarbeiten der Eingabedaten gefunden. $$ERROR-LOG-INFO$$ @@CLEAR-DATA-BUTTON@@ Daten zurücksetzen # # Multi-line descriptive translations (router) # $$ROUTER-INFO$$ Diese Website erlaubt Routing mit den Daten, die OpenStreetMap gesammelt hat. Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle die Routing-Vorgaben und dann finde den Weg. $$ROUTER-INFO$$ $$ROUTER-OPTIONS-HELP$$ Schnellanleitung
Klicke auf die Marker-Bildchen (oben), um sie in der Mitte der Karte (rechts) zu positionieren. Dann ziehe das Bildchen auf die genaue Position. Das Zoomen der Karte vor der Patzierung ist vermutlich am einfachsten. Alternativ kann man die geografische Breite und Länge in den Kästchen eintragen.

Wähle die Fortbewegungsart, die Vorgaben zur Wegnutzung, die Geschwindigkeitsvorgaben, die Vorgaben zur Wegbeschaffenheit und die anderen Vorgaben von den obigen Auswahlfeldern. Ein Klick auf "kürzeste" oder "schnellste" ermittelt die entsprechende Verbindung und zeigt sie in der Karte an.

Wegpunkte
Ein Klick auf das Marker-Bildchen (oben) schaltet die Sichbarkeit in der Karte ein bzw. aus. Die Berechnung Route erfolgt in der Reihenfolge der Wegpunkte (so gut, wie es für die gewählte Fortbewegungsart möglich ist).

Fortbewegungsart
Die Auswahl der Fortbewegungsart bestimmt die bei der Routenberechnung erlaubten Wegtypen und die Vorgabeeinstellungen aller anderen Parameter.

Vorgaben zur Wegnutzung
Die Vorgaben zur Wegnutzung bestimmen die Priorisierung von Wegarten. Wenn z. B. Schnellstraßen mit 110% und Bundesstraßen mit 100% angegeben werden, wird bei zwei möglichen Wegwahlen die Schnellstraße solange bevorzugt wird, wie der Längen(oder Zeit-)unterschied 10% nicht überschreitet.

Geschwindigkeitsvorgaben
Die hier geannten Geschwindigkeiten werden für den jeweiligen Wegtyp finden Anwendung wenn keine andere Geschwindkeitsbegrenzung mit geringerem Wert bekannt ist.

Vorgaben zur Wegbeschaffenheit
Die Vorgaben zur Wegbeschaffenheit werden als Prozentangaben verwendet, um die Verhältnisse der Wegbenutzung zu steuern. Wenn z. B. befestigte Wege mit 75% angegeben sind, werden unbefestigte automatisch mit 25% angenommen, so werden Wege ausgewählt, die mindestens drei mal länger auf befestigten Wegen verlaufen.

andere Vorgaben
Die Berücksichtigung von Benutzungs-Begrenzungen durch Gewicht, Höhe, Länge und Breite ist möglich. Genauso können Einbahnstraßenbeschräkungen ignoriert werden (z. B. als Fußgänger). $$ROUTER-OPTIONS-HELP$$ $$ROUTER-RESULTS-HELP$$ Schnellanleitung
Nach der Routenberechnung kann man eine GPX oder eine einfache Textdatei (Kurz- oder Langfassung) herunterladen. Ebenso kann man die Routenbeschreibung ansehen und in ausgewälte Bereiche zoomen.

Problemlösung
Wenn der Router einen Fehler meldet liegt es meistens daran, dass kein Weg zwischen den gewälten Punkten unter Beachtung der Vorgaben gefunden werden kann. Das Bewegen eines oder mehrere Punkte oder das verändern von Vorgaben sollte es erlauben eine Route zu finden.

Ausgabe-Formate

HTMLs
Eine Beschreibung der Route mit Anweisungen für jede wichtige Abzweigung.
GPX Track-Datei
Die gleichen Informationen, die in der Karte angezeigt werden mit Punkten für jeden Abzweig und Linien für jedes Teilstück.
GPX Routen-Datei
Die gleichen Informationen, die im Text angezeigt werden mit einem Wegpunkt für jede wichtige Richtungsänderung.
Volltext-Datei
Eine aller Knoten und die Abstände zwischen ihnen, sowie die Gesamtentfernung vom i Startpunkt zum jeweiligen Konten.
Text-Datei
Die gleiche Information, die als Text angezeigt wird.
$$ROUTER-RESULTS-HELP$$ $$ROUTER-VISUALISER-INFO$$ Die Anzeige der Daten kann auf verschiedene Weise angepasst werden. $$ROUTER-VISUALISER-INFO$$ # # Multi-line descriptive translations (visualiser) # $$VISUALISER-INFO$$ Diese Webseite erlaubt die Visualisierung der Daten, die Routine für das Berechnen der Route nutzt. Nur die relevanten Daten für die Berechnung der Routen werden dargestellt, daher werden einige ausgeschlossen. $$VISUALISER-INFO$$ $$VISUALISER-INSTRUCTIONS$$ Zoomen Sie in die Karte und nutzen Sie den Knöpfe unten um die Daten herunter zu laden. Der Server liefert nur ein Ergebnis, wenn das ausgewählte Feld klein genug ist. $$VISUALISER-INSTRUCTIONS$$ $$VISUALISER-HELP$$ Schnellstart
Vergrößer ein Gebiet und nutze einen der Schaltknöpfe, um die entsprechenden Daten anzuzeigen.
Durch aufklappen der Details unter jedem Schaltknopf können mehr Datenoptionen angezeigt werden.

Data Failure
Wenn das ausgewählte Gebiet zu groß ist (hängt vom Datentyp ab), dann zeigt der Status "Failed to get visualiser data" (Visualiserungsdaten unmöglich zu bekommen) - vergrößer und versuch es noch einmal. $$VISUALISER-HELP$$ $$VISUALISER-ROUTER-INFO$$ Um die Routenplanung auf der Karte durchzuführen, verwenden sie den untenstehenden Link. $$VISUALISER-ROUTER-INFO$$ routino-3.4.3/web/translations/translate.pl 755 233 144 25623 12564147067 14267 0#!/usr/bin/perl # # Routino translation replacement Perl script # # Part of the Routino routing software. # # This file Copyright 2014-2015 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Constants my @translation_files=(); my $xml_output_file="../../xml/routino-translations.xml"; my $html_output_dir="../www/routino"; my @html_template_files=(<*.html>); my %languages=(); my %translations=(); # Sort so that English is first @translation_files=sort {if($a eq "translation.en.txt"){return -1;} if($b eq "translation.en.txt"){return 1;} return $a <=> $b;} @translation_files; # Read in the translations foreach my $translation_file (@translation_files) { $translation_file =~ m%translation.([^.]+).txt%; # Add to list of languages my $language=$1; if(! defined $languages{$language}) { $languages{$language}=1; $translations{$language}={}; $translations{$language}->{codes}={}; $translations{$language}->{html}=0; $translations{$language}->{xml}=0; } # Process the file open(FILE,"<$translation_file"); while() { s%\r*\n%%; next if(m%^#%); next if(m%^$%); # Single line HTML entries if(m%\@\@%) { my($code,$text)=split("\t"); if(defined $translations{$language}->{codes}->{$code}) { print STDERR "Language: $language DUPLICATED codeword '$code'\n"; } else { $translations{$language}->{html}++; $translations{$language}->{codes}->{$code}={}; $translations{$language}->{codes}->{$code}->{text}=$text; $translations{$language}->{codes}->{$code}->{usedX}=0; $translations{$language}->{codes}->{$code}->{usedR}=0; $translations{$language}->{codes}->{$code}->{usedV}=0; } } # Multi-line HTML entries if(m%(\$\$[^\$]+\$\$)%) { my($code,$text)=($1,""); while() { last if(m%\$\$%); $text=$text.$_; } $text =~ s%\r*\n$%%; if(defined $translations{$language}->{codes}->{$code}) { print STDERR "Language: $language DUPLICATED codeword '$code'\n"; } else { $translations{$language}->{html}++; $translations{$language}->{codes}->{$code}={}; $translations{$language}->{codes}->{$code}->{text}=$text; $translations{$language}->{codes}->{$code}->{usedX}=0; $translations{$language}->{codes}->{$code}->{usedR}=0; $translations{$language}->{codes}->{$code}->{usedV}=0; } } # Single line XML entries if(m%\%\%%) { my($code,$text)=split("\t"); if(defined $translations{$language}->{codes}->{$code}) { print STDERR "Language: $language DUPLICATED codeword '$code'\n"; } else { $translations{$language}->{xml}++; $translations{$language}->{codes}->{$code}={}; $translations{$language}->{codes}->{$code}->{text}=$text; $translations{$language}->{codes}->{$code}->{usedX}=0; $translations{$language}->{codes}->{$code}->{usedR}=0; $translations{$language}->{codes}->{$code}->{usedV}=0; } my($n_strings_en)=$translations{en}->{codes}->{$code}->{text} =~ s/%s/%s/g; my($n_strings) =$text =~ s/%s/%s/g; if($n_strings != $n_strings_en) { print STDERR "Language: $language WRONG number of '%s' in text '$text' ($translations{en}->{codes}->{$code}->{text})\n"; } } } close(FILE); } # Sort out the languages my @languages=(); push(@languages,"en"); foreach my $language (sort (keys %languages)) { push(@languages,$language) if($language ne "en"); } # Create the HTML files foreach my $html_template_file (@html_template_files) { my $usedtype=""; $usedtype="R" if($html_template_file =~ m%router%); $usedtype="V" if($html_template_file =~ m%visualiser%); foreach my $language (@languages) { next if(!$translations{$language}->{html}); print "Language: $language File: $html_template_file\n"; my $language_meta=0; my $language_meta_string=""; open(HTML_IN ,"<$html_template_file"); open(HTML_OUT,">$html_output_dir/$html_template_file.$language"); while() { my $line=$_; # Language selection - special handling if($line =~ m%\*\*LANGUAGES-META\*\*%) { $language_meta=1-$language_meta; if($language_meta==0) { foreach my $language2 (@languages) { my $LANGUAGE2=$language2; $LANGUAGE2 =~ tr%a-z%A-Z%; $line=$language_meta_string; if($language eq $language2) { $line =~ s%~~CHECKED~~%checked%g; } else { $line =~ s%~~CHECKED~~%%g; } $line =~ s%~~lang~~%$language2%g; $line =~ s%~~LANG~~%$LANGUAGE2%g; if(!$translations{$language2}->{html}) { $line =~ s%%%; } if(!$translations{$language2}->{xml}) { $line =~ s%%%; } foreach my $code (keys %{$translations{$language2}->{codes}}) { if($line =~ s%$code%$translations{$language2}->{codes}->{$code}->{text}%g) {$translations{$language2}->{codes}->{$code}->{"used$usedtype"} = 1;} } if($line =~ m%((\@\@|\$\$|\*\*|\~\~)[^\@\$*~]+(\@\@|\$\$|\*\*|\~\~))%) { print STDERR " Unmatched codeword '$1' in line: $line"; } # Remove un-needed spaces $line =~ s%[\t ]+% %g; $line =~ s%\n %\n%g; $line =~ s%^ %%g; print HTML_OUT $line; } } next; } if($language_meta) { $language_meta_string.=$line; next; } # Replace with translated phrases foreach my $code (keys %{$translations{$language}->{codes}}) { if($line =~ s%\Q$code\E%$translations{$language}->{codes}->{$code}->{text}%g) {$translations{$language}->{codes}->{$code}->{"used$usedtype"} = 1;} } # Replace what is left with English phrases foreach my $code (keys %{$translations{$languages[0]}->{codes}}) { $line =~ s%\Q$code\E%$translations{$languages[0]}->{codes}->{$code}->{text}%g; } if($line =~ m%((\@\@|\$\$|\*\*|\~\~)[^\@\$*~]+(\@\@|\$\$|\*\*|\~\~))%) { print STDERR " Unmatched codeword '$1' in line: $line"; } # Remove un-needed spaces $line =~ s%[\t ]+% %g; $line =~ s%\n %\n%g; $line =~ s%^ %%g; print HTML_OUT $line; } close(HTML_IN); close(HTML_OUT); } } # Create the XML file open(XML_OUT,">$xml_output_file"); open(XML_IN ,") { print XML_OUT; } close(XML_IN); foreach my $language (@languages) { next if(!$translations{$language}->{xml}); print "Language: $language File: translations.xml\n"; open(XML_IN ,") { my $line=$_; $line =~ s%~~lang~~%$language%g; $line =~ s%~~language~~%$translations{$language}->{codes}->{'@@LANGUAGE@@'}->{text}%g; # Replace with translated phrases foreach my $code (keys %{$translations{$language}->{codes}}) { if($line =~ s%$code%$translations{$language}->{codes}->{$code}->{text}%g) {$translations{$language}->{codes}->{$code}->{usedX} = 1;} } # Replace what is left with a note about missing translations if($line =~ m%\%\%%) { foreach my $code (keys %{$translations{$languages[0]}->{codes}}) { $line =~ s%$code%$translations{$languages[0]}->{codes}->{$code}->{text}%g; } $line =~ s%<%%; if($line =~ m%((\%\%|\~\~)[^\%~]+(\%\%|\~\~))%) { print STDERR " Unmatched codeword '$1' in line: $line"; } } print XML_OUT $line; } close(XML_IN); } open(XML_IN ,") { print XML_OUT; } close(XML_IN); close(XML_OUT); # Check the languages and usage my %usedX=(); my %usedR=(); my %usedV=(); foreach my $language (@languages) { $usedX{$language}=0; $usedR{$language}=0; $usedV{$language}=0; foreach my $code (keys %{$translations{$language}->{codes}}) { $usedX{$language}+=$translations{$language}->{codes}->{$code}->{usedX}; $usedR{$language}+=$translations{$language}->{codes}->{$code}->{usedR}; $usedV{$language}+=$translations{$language}->{codes}->{$code}->{usedV}; if(! $translations{$language}->{codes}->{$code}->{usedX} && ! $translations{$language}->{codes}->{$code}->{usedR} && ! $translations{$language}->{codes}->{$code}->{usedV}) { print STDERR "Language: $language UNUSED codeword: $code\n"; } } } # Print the translation coverage print "\n"; print "Translation Coverage\n"; print "====================\n"; print "\n"; print " Number Percentage Complete\n"; print "Language XML HTML XML router visualiser\n"; print "-------- --- ---- --- ------ ----------\n"; foreach my $language (@languages) { printf("%-6s %3d %3d %4.0f%% %4.0f%% %4.0f%%\n", $language, $translations{$language}->{xml}, $translations{$language}->{html}, 100.0*$usedX{$language}/$usedX{$languages[0]}, 100.0*$usedR{$language}/$usedR{$languages[0]}, 100.0*$usedV{$language}/$usedV{$languages[0]}) } routino-3.4.3/web/translations/translation.nl.txt 644 233 144 36203 13725172421 15425 0# # Dutch language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Maker %%copyright_source_string%% Bron %%copyright_source_text%% Gebouwd op OpenStreetMap data van http://www.openstreetmap.org/ %%copyright_license_string%% License %%turn_-4%% Haarspeld naar links %%turn_-3%% Scherp links %%turn_-2%% Links %%turn_-1%% Half links %%turn_0%% Rechtdoor %%turn_1%% Half rechts %%turn_2%% Rechts %%turn_3%% Scherp rechts %%turn_4%% Haarspeld naar rechts %%heading_-4%% Zuid %%heading_-3%% Zuid-West %%heading_-2%% West %%heading_-1%% Noord-West %%heading_0%% Noord %%heading_1%% Noord-Oost %%heading_2%% Oost %%heading_3%% Zuid-Oost %%heading_4%% Zuid %%ordinal_1%% Eerste %%ordinal_2%% Tweede %%ordinal_3%% Derde %%ordinal_4%% Vierde %%ordinal_5%% Vijfde %%ordinal_6%% Zesde %%ordinal_7%% Zevende %%ordinal_8%% Achtste %%ordinal_9%% Negende %%ordinal_10%% Tiende %%highway_motorway%% Autosnelweg %%highway_trunk%% Autoweg %%highway_primary%% Primaire weg %%highway_secondary%% Secundaire weg %%highway_tertiary%% Tertiaire weg %%highway_unclassified%% Niet geclassificeerde weg %%highway_residential%% Woonstraat %%highway_service%% Toegangsweg %%highway_track%% Veldweg %%highway_cycleway%% Fietspad %%highway_path%% Pad %%highway_steps%% Trap %%highway_ferry%% Veerboot %%route_shortest%% Kortste %%route_quickest%% Snelste %%output-html_waypoint_waypoint%% Routepunt %%output-html_waypoint_junction%% Splitsing %%output-html_waypoint_roundabout%% Rotonde %%output-html_title%% %s Route %%output-html_start%% Start bij %s neem de richting %s %%output-html_node%% Bij %s, ga %s richting %s %%output-html_rbnode%% Verlaat %s, neem de %s afslag richting %s %%output-html_segment%% Volg de %s voor %.3f km %.1f min %%output-html_stop%% Stop bij %s %%output-html_total%% Totaal %.1f km, %.0f minuten %%output-html_subtotal%% %.1f km, %.0f minuten %%output-gpx_waypoint_waypt%% WAYPT %%output-gpx_waypoint_trip%% TRIP %%output-gpx_desc%% %s route tussen 'start' and 'eind' routepunten %%output-gpx_name%% %s route %%output-gpx_step%% %s op '%s' voor %.3f km, %.1f min %%output-gpx_final%% Totaal trip %.1f km, %.0f minuten # # Router (and some shared) translations # @@LANGUAGE@@ Nederlands @@LANGUAGE-WEBPAGE@@ Nederlandse web pagina @@ROUTER-TITLE@@ Routeplanner voor OpenStreetMap gegevens @@OPTION-TAB@@ Opties @@OPTION-TAB-HELP@@ Kies opties voor routering @@RESULTS-TAB@@ Resultaten @@RESULTS-TAB-HELP@@ Bekijk routeringsresultaten @@DATA-TAB@@ Gegevens @@DATA-TAB-HELP@@ Bekijk de informatie in de database @@ROUTINO-ROUTER@@ Routino OpenStreetMap routering @@ROUTINO-WEBSITE@@ Routino Website @@DOCUMENTATION@@ Documentatie @@LANGUAGE-BOX@@ Taal @@WAYPOINTS-BOX@@ Routepunten @@TRANSPORT-TYPE-BOX@@ Transporttype @@HIGHWAY-PREFERENCES-BOX@@ Voorkeur Wegtype @@SPEED-LIMITS-BOX@@ Snelheidslimieten @@PROPERTY-PREFERENCES-BOX@@ Voorkeur Eigenschappen @@OTHER-RESTRICTIONS-BOX@@ Andere Beperkingen @@FIND-BOX@@ Vind @@LINKS-BOX@@ Links @@HELP-BOX@@ Help @@STATUS-BOX@@ Status @@SHORTEST-ROUTE@@ Kortste Route @@QUICKEST-ROUTE@@ Snelste Route @@STATISTICS-BOX@@ Routino statistieken @@VISUALISER-BOX@@ Routino Visualisering @@WAYPOINT-POSITION@@ Routepunt XXX Positie @@WAYPOINT-LONGITUDE@@ Routepunt XXX Lengtegraad @@WAYPOINT-LATITUDE@@ Routepunt XXX Breedtegraad @@WAYPOINT-LOCATION@@ Routepunt XXX Plaats @@WAYPOINT-SEARCH@@ Zoek plaats @@WAYPOINT-GET@@ Vind huidige plaats @@WAYPOINT-CENTRE1@@ Centreer kaart op dit routepunt @@WAYPOINT-UP@@ Beweeg dit routepunt naar boven @@WAYPOINT-ADD@@ Voeg hierna routepunt toe @@WAYPOINT-COORDS@@ Coördinaten van de plaats @@WAYPOINT-HOME@@ Toggle als basisplaats ('thuis') @@WAYPOINT-CENTRE2@@ Centreer dit routepunt op de kaart @@WAYPOINT-DOWN@@ Beweeg dit routepunt naar beneden @@WAYPOINT-REMOVE@@ Verwijder dit routepunt @@WAYPOINT-REVERSE@@ Keer volgorde van de routepunten om @@WAYPOINT-REVERSE-BUTTON@@ Keer volgorde om @@WAYPOINT-LOOP@@ Voeg routepunt toe om lus te maken @@WAYPOINT-LOOP-BUTTON@@ Sluit de lus @@TRANSPORT-FOOT@@ Te voet @@TRANSPORT-HORSE@@ Paard @@TRANSPORT-WHEELCHAIR@@ Rolstoel @@TRANSPORT-BICYCLE@@ Fiets @@TRANSPORT-MOPED@@ Brommer @@TRANSPORT-MOTORCYCLE@@ Motorfiets @@TRANSPORT-MOTORCAR@@ Auto @@TRANSPORT-GOODS@@ Goederen @@TRANSPORT-HGV@@ Zwaar transport @@TRANSPORT-PSV@@ Publiek transport @@HIGHWAY-MOTORWAY@@ Autosnelweg @@HIGHWAY-TRUNK@@ Autoweg @@HIGHWAY-PRIMARY@@ Primair @@HIGHWAY-SECONDARY@@ Secundair @@HIGHWAY-TERTIARY@@ Tertiair @@HIGHWAY-UNCLASSIFIED@@ Niet geclassificeerd @@HIGHWAY-RESIDENTIAL@@ Woongebied @@HIGHWAY-SERVICE@@ Toegangsweg @@HIGHWAY-TRACK@@ Veldweg @@HIGHWAY-CYCLEWAY@@ Fietspad @@HIGHWAY-PATH@@ Pad @@HIGHWAY-STEPS@@ Trap @@HIGHWAY-FERRY@@ Ferry @@PROPERTY-PAVED@@ Verhard @@PROPERTY-MULTILANE@@ Meerdere Rijstroken @@PROPERTY-BRIDGE@@ Brug @@PROPERTY-TUNNEL@@ Tunnel @@PROPERTY-WALKINGROUTE@@ Wandelroute @@PROPERTY-BICYCLEROUTE@@ Fietsroute @@RESTRICT-ONEWAY@@ Volg Eenrichtingsverkeer @@RESTRICT-TURNS@@ Respecteer verboden afslagen @@RESTRICT-WEIGHT@@ Gewicht @@RESTRICT-HEIGHT@@ Hoogte @@RESTRICT-WIDTH@@ Breedte @@RESTRICT-LENGTH@@ Lengte @@FIND-SHORTEST-ROUTE@@ Zoek de kortste route @@FIND-QUICKEST-ROUTE@@ Zoek de snelste route @@MAP-VIEW-LINK@@ Link naar dit kaartbeeld @@EDIT-OSM-DATA@@ Bewerk deze OSM gegevens @@ROUTER-NOT-RUN@@ Router niet in gebruik @@ROUTER-RUNNING@@ Router werkt... @@ROUTER-COMPLETED@@ Routering voltooid @@ROUTER-ERROR@@ Routeringsfout @@ROUTER-FAILED@@ Router werkt niet @@VIEW-DETAILS@@ Bekijk Details @@NO-INFORMATION@@ Geen Informatie @@HTML-ROUTE@@ HTML aanwijzingen @@GPX-TRACK-ROUTE@@ GPX trackbestand @@GPX-ROUTE@@ GPX routebestand @@FULL-TEXT-ROUTE@@ Volledig tekstbestand @@TEXT-ROUTE@@ Tekstbestand @@OPEN-POPUP@@ Open Popup @@DISPLAY-STATISTICS@@ Toon statistieken @@JAVASCRIPT-REQUIRED@@ Javascript is noodzakelijk om deze webpagina te gebruiken omwille van de interactieve kaart @@ROUTER@@ Router @@GEO-DATA@@ Geo Data @@TILES@@ Tiles # # Visualiser specific translations # @@VISUALISER-TITLE@@ Visualisering van routeringsgegevens @@INSTRUCTIONS-BOX@@ Instructies @@ROUTER-BOX@@ Routino Router @@NO-DATA-DISPLAYED@@ Geen data getoond @@VISUALISER-FAILED@@ Geen data gevonden om te tonen @@VISUALISER-NUM-JUNCTIONS@@ # splitsingen behandeld @@VISUALISER-NUM-SUPER@@ # super-nodes/segmenten behandeld @@VISUALISER-NUM-WAYTYPE@@ # wegtype segmenten behandeld @@VISUALISER-NUM-SEGMENTS@@ # segmenten behandeld @@VISUALISER-NUM-NODES@@ # knooppunten behandeld @@VISUALISER-NUM-TURNS@@ # afslagbeperkingen behandeld @@VISUALISER-NUM-ERRORS@@ # foutmeldingen behandeld @@JUNCTIONS-BUTTON@@ Toon Splitsingen $$JUNCTIONS-INFO$$ Ieder knooppunt dat doodloopt, een kruispunt vormt van wegen van een verschillend type (of met verschillende eigenschappen) of kruispunten waar meer dan twee segmenten samenkomen worden met kleur gecodeerd. $$JUNCTIONS-INFO$$ @@JUNCTIONS-1@@ Slechts één weg - een doodlopend punt @@JUNCTIONS-2@@ kruispunt van twee wegen van een verschillend type @@JUNCTIONS-3@@ kruispunt van drie wegen @@JUNCTIONS-4@@ kruispunt van vier wegen @@JUNCTIONS-5@@ kruispunt van vijf wegen @@JUNCTIONS-6@@ kruispunt van zes wegen @@JUNCTIONS-MORE@@ kruispunt van zeven (of meer) wegen @@SUPER-BUTTON@@ Toon Super Segmenten $$SUPER-INFO$$ Ieder super-knooppunt en de daarmee verbonden supersegmenten worden getoond (zie de pagina met beschrijving van het algoritme) $$SUPER-INFO$$ @@WAYTYPE-BUTTON@@ Toon wegtype Segmenten $$WAYTYPE-INFO$$ Elk wegsegment van een speciaal type (enkele richting, fiets-beide-richtingen en rotonde) wordt getoond. Voor segmenten met enkele richting toont een gekleurde driehoek de toegestane richting. De kleur van de driehoek hangt af van de 'bearing' van het wegsegment $$WAYTYPE-INFO$$ @@WAYTYPE-ONEWAY@@ Segment met enkele richting @@WAYTYPE-CYCLE-BOTH-WAYS@@ Fiets-in-beide-richtingen segment @@WAYTYPE-ROUNDABOUT@@ Rotondesegment @@HIGHWAY-BUTTON@@ Toon Wegsegmenten $$HIGHWAY-INFO$$ Ieder segment van het gekozen type weg wordt getekend $$HIGHWAY-INFO$$ @@TRANSPORT-BUTTON@@ Toon Transportsegmenten $$TRANSPORT-INFO$$ Ieder segment waar het gekozen type van transport is toegelaten, wordt getekend $$TRANSPORT-INFO$$ @@BARRIER-BUTTON@@ Toon barrière-knooppunten $$BARRIER-INFO$$ Ieder barrière die het gekozen type van transport blokkeert wordt getekend $$BARRIER-INFO$$ @@TURNS-BUTTON@@ Toon afslagbeperkingen $$TURNS-INFO$$ Iedere afslagbeperking wordt getoond met een lijn die aanduidt welke afslag verboden is $$TURNS-INFO$$ @@SPEED-BUTTON@@ Toon snelheidslimieten $$SPEED-INFO$$ Ieder knooppunt dat segmenten verbindt met verschillende snelheidslimieten wordt getoond, samen met de snelheidslimiet op de relevante segmenten $$SPEED-INFO$$ @@LIMIT-CHANGE@@ Verandering van de snelheidslimiet @@LIMIT-NONE@@ Geen snelheidslimiet bekend @@SPEED-LIMIT-80@@ Snelheidslimiet 80 km/h @@WEIGHT-BUTTON@@ Toon gewichtslimieten $$WEIGHT-INFO$$ Ieder knooppunt dat segmenten verbindt met verschillende gewichtslimieten wordt getoond, samen met de gewichtslimieten van de relevante segmenten $$WEIGHT-INFO$$ @@WEIGHT-LIMIT-8@@ 8.0 ton gewichtslimiet @@HEIGHT-BUTTON@@ Toon hoogtelimieten $$HEIGHT-INFO$$ Ieder knooppunt dat segmenten verbindt met verschillende hoogtelimieten wordt getoond, samen met de hoogtelimieten van de relevante segmenten $$HEIGHT-INFO$$ @@HEIGHT-LIMIT-4@@ 4.0 m hoogtelimiet @@WIDTH-BUTTON@@ Toon breedtelimieten $$WIDTH-INFO$$ Ieder knooppunt dat segmenten verbindt met verschillende breedtelimieten wordt getoond, samen met de breedtelimieten van de relevante segmenten $$WIDTH-INFO$$ @@WIDTH-LIMIT-3@@ 3.0 m breedtelimiet @@LENGTH-BUTTON@@ Toon Lengtelimieten $$LENGTH-INFO$$ Ieder knooppunt dat segmenten verbindt met verschillende lengtelimieten wordt getoond, samen met de lengtelimieten van de relevante segmenten $$LENGTH-INFO$$ @@LENGTH-LIMIT-9@@ 9.0 m lengtelimiet @@PROPERTY-BUTTON@@ Toon Wegeigenschappen $$PROPERTY-INFO$$ Ieder segment van de wegen met een bepaalde eigenschap wordt getekend $$PROPERTY-INFO$$ @@ERROR-LOG-BUTTON@@ Toon Foutmeldingen $$ERROR-LOG-INFO$$ Routino ontdekte mogelijke problemen bij het verwerken van de invoergegevens $$ERROR-LOG-INFO$$ @@CLEAR-DATA-BUTTON@@ Wis gegevens # # Multi-line descriptive translations (router) # $$ROUTER-INFO$$ Deze webpagina laat je een route plannen op basis van gegevens van OpenStreetMap. Selecteer start- and eindpunten (klik op het markericoon hieronder), kies routevoorkeuren en vind een route $$ROUTER-INFO$$ $$ROUTER-OPTIONS-HELP$$ Snelle Start
Klik op markericoontje (boven) om ze op de kaart te plaatsen (rechts). Sleep ze vervolgens naar de gewenste positie. Het is best om eerst naar straat niveau te zoomen op de kaart. Een atlternatief is om lengte- en breedtegraad in te voeren in de invoervelden hierboven.

Selecteer het transport type, toegestane wegtypes, snelheidslimieten, wegeigenschappen en andere restricties uit de opties. Selecteer "Kortste" of "Snelste" om de route te berekenen en te tekenen op de kaar.

Routepunten (Waypoints)
Klik op het marker icoontje, nog eens klikken voor aan/uit. Wanneer de route berekend wordt, zal ze zo nauwkeurig mogelijk (voor het gegeven transporttype) aansluiten bij deze punten, in de gegeven volgorde.

Transporttype
Bij selectie van een transporttype wordt de berekende route beperkt tot segmenten waar dit transport toegelaten is, terwijl standaardwaarden worden gebruikt voor de andere parameters.

Voorkeur Wegtype
De voorkeur voor een bepaald type weg wordt uitgedrukt in een percentage. De gekozen routes proberen de voorkeurswegen te volgen. Bijvoorbeeld wanneer u het Transport Type "Fiets" kiest, dan zal er voor Autosnelweg 0% staan, en voor Fietspad 100%. Wanneer u Autowegen, Nationale wegen wil vermijden of beperken bij het maken van een fietsroute, kan u percentage naar beneden aanpassen.

Snelheidslimieten
De snelheidslimieten worden afgeleid van het type weg. Het is mogelijk dat er voor een bepaalde weg andere beperkingen gelden. In dat geval worden die gekozen, tenminste als ze lager zijn dan de standaardwaarden.

Wegeigenschappen
De voorkeur voor een eigenschap wordt gegeven als een percentage. De berekende route volgt bij voorkeur wegen met de gekozen eigenschap. Wanneer u bijvoorbeeld verharde wegen een voorkeur van 75% geeft, dan zal een onverharde weg automatisch een voorkeur van 25 % krijgen. Een route over verharde weg die driemaal langer is dan een route over onverharde weg, zal toch nog de voorkeur krijgen bij de berekening.

Andere Beperkingen
Deze zullen toelaten dat er een route berekend wordt die rekening houdt met gewicht, hoogte, breedte of lengte. Het is ook mogelijk geen rekening te houden met eenrichtingsverkeer (bijvoorbeeld als voetganger) $$ROUTER-OPTIONS-HELP$$ $$ROUTER-RESULTS-HELP$$ Quick Start
Na het berekenen van een route, kan u de route downloaden als GPX bestand, of als tekstbestand met routebeschrijving (samenvatting of gedetailleerde versie). Door met de muis over de beschrijving te bewegen, ziet u die ook op de kaart gesitueerd.

Problemen oplossen
Als de router eindigt met een fout, dan is de meest waarschijnlijke oorzaak, dat er geen route mogelijk is tussen de gekozen punten. Het verplaatsen van de punten, of het aanpassen van weg-eigenschappen of voertuigtype kan een oplossing bieden.

Types Uitvoer

HTML instructies
Een beschrijving van de route, met de te nemen afslag aan iedere splitsing.
GPX track bestand
Dezelfde informatie die op de kaart wordt weergegeven. Met coordinaten voor ieder knooppunt, en een lijn voor ieder segment.
GPX route bestand
Dezelfde informatie die is opgenomen in de tekst van de route, met een knooppunt voor iedere belangrijke splitsing.
Volledig tekstbestand
Een lijst met alle knooppunten die de route aandoet, de afstand tussen deze knooppunten en de cumulatieve afstand voor iedere stap op de route.
Tekstbestand
Dezelfde informatie als wordt weergegeven in de tekst voor de route.
$$ROUTER-RESULTS-HELP$$ $$ROUTER-VISUALISER-INFO$$ Om te kijken hoe Routino omgaat met de basisdata, is er een tooltje dat de onderliggende data toont op verschillende manieren. $$ROUTER-VISUALISER-INFO$$ # # Multi-line descriptive translations (visualiser) # $$VISUALISER-INFO$$ Op deze webpagina kunnen de gegevens gevisualiseerd worden, die door Routino worden gebruikt bij de routeplanning. Alleen de gegevens die relevant zijn voor de routeberekening worden getoond, en sommige informatie wordt dus uitgesloten $$VISUALISER-INFO$$ $$VISUALISER-INSTRUCTIONS$$ Zoom in en gebruik dan de knoppen om de gegevens te downloaden. De server zal alleen gegevens aanleveren als het geselecteerde gebied klein genoeg is $$VISUALISER-INSTRUCTIONS$$ $$VISUALISER-HELP$$ Snelle Start
Zoom in op een gebied en kies één van de knoppen om dat type gegevens weer te geven
Meer gegevensopties kunnen getoond worden door de details achter iedere knop op te vragen

Mislukte Visualisatie
Als het gekozen gebied te groot is (hangt af van het type gegevens) dan volgt er een bericht "Failed to get visualiser data" - zoom in en probeer opnieuw. $$VISUALISER-HELP$$ $$VISUALISER-ROUTER-INFO$$ Om een route te berekenen op de kaart, volg de link hieronder $$VISUALISER-ROUTER-INFO$$ routino-3.4.3/web/translations/translation.sk.txt 644 233 144 36311 14263050511 15422 0# # Slovak language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Vyvíja %%copyright_source_string%% Zdroj %%copyright_source_text%% Postavené na dátach OpenStreetMap z http://www.openstreetmap.org/ %%copyright_license_string%% Licencia %%turn_-4%% veľmi ostro vľavo %%turn_-3%% ostro vľavo %%turn_-2%% vľavo %%turn_-1%% mierne vľavo %%turn_0%% priamo %%turn_1%% mierne vpravo %%turn_2%% vpravo %%turn_3%% ostro vpravo %%turn_4%% veľmi ostro vpravo %%heading_-4%% Južne %%heading_-3%% Juhozápadne %%heading_-2%% Západne %%heading_-1%% Severozápadne %%heading_0%% Severne %%heading_1%% Severovýchodne %%heading_2%% Východne %%heading_3%% Juhovýchodne %%heading_4%% Južne %%ordinal_1%% Prvý %%ordinal_2%% Druhý %%ordinal_3%% Tretí %%ordinal_4%% Å tvrtý %%ordinal_5%% Piaty %%ordinal_6%% Å iesty %%ordinal_7%% Siedmy %%ordinal_8%% Ôsmy %%ordinal_9%% Deviaty %%ordinal_10%% Desiaty %%highway_motorway%% diaľnici %%highway_trunk%% hlavnej ceste %%highway_primary%% ceste I. triedy %%highway_secondary%% ceste II. triedy %%highway_tertiary%% ceste III. triedy %%highway_unclassified%% neoznaÄenej ceste %%highway_residential%% miestnej komunikácii %%highway_service%% úÄelovej komunikácii %%highway_track%% ceste %%highway_cycleway%% cykloceste %%highway_path%% chodníku %%highway_steps%% schodoch %%highway_ferry%% prievoze %%route_shortest%% NajkratÅ¡ia %%route_quickest%% NajrýchlejÅ¡ia %%output-html_waypoint_waypoint%% bode %%output-html_waypoint_junction%% križovatke %%output-html_waypoint_roundabout%% kruhový objazd %%output-html_title%% %s Trasa %%output-html_start%% ZaÄiatok v %s, %s %%output-html_node%% V %s odboÄte %s, %s %%output-html_rbnode%% Opustite %s, %s výjazd %s %%output-html_segment%% PokraÄujte po %s Äalších %.3f km, %.1f min %%output-html_stop%% Zastavte v %s %%output-html_total%% Celkovo %.1f km, %.0f minút %%output-html_subtotal%% %.1f km, %.0f minút %%output-gpx_waypoint_waypt%% BOD %%output-gpx_waypoint_trip%% CESTA %%output-gpx_desc%% %s trasa medzi 'Å¡tartom' a 'cieľom' cez %%output-gpx_name%% %s trasa %%output-gpx_step%% %s po '%s' Äaľších %.3f km, %.1f min %%output-gpx_final%% Celková trasa %.1f km, %.0f minút # # Router (and some shared) translations # @@LANGUAGE@@ SlovenÄina @@LANGUAGE-WEBPAGE@@ Stránka v slovenÄine @@ROUTER-TITLE@@ PlánovaÄ trás pre OpenStreetMap dáta @@OPTION-TAB@@ Možnosti @@OPTION-TAB-HELP@@ NastaviÅ¥ možnosti plánovania @@RESULTS-TAB@@ Výsledky @@RESULTS-TAB-HELP@@ ZobraziÅ¥ výsledky plánovania @@DATA-TAB@@ Dáta @@DATA-TAB-HELP@@ ZobraziÅ¥ informácie o databáze @@ROUTINO-ROUTER@@ Routino OpenStreetMap PlánovaÄ @@ROUTINO-WEBSITE@@ Webová stránka Routino @@DOCUMENTATION@@ Dokumentácia @@LANGUAGE-BOX@@ Jazyk @@WAYPOINTS-BOX@@ Body @@TRANSPORT-TYPE-BOX@@ Typ prepravy @@HIGHWAY-PREFERENCES-BOX@@ Nastavenia ciest @@SPEED-LIMITS-BOX@@ Rychlostné limity @@PROPERTY-PREFERENCES-BOX@@ Rozšírené nastavenia ciest @@OTHER-RESTRICTIONS-BOX@@ Iné obmedzenia @@FIND-BOX@@ HľadaÅ¥ @@LINKS-BOX@@ Odkazy @@HELP-BOX@@ Pomoc @@STATUS-BOX@@ Stav @@SHORTEST-ROUTE@@ NajkratÅ¡ia trasa @@QUICKEST-ROUTE@@ NajrýchlejÅ¡ia trasa @@STATISTICS-BOX@@ Routino Å¡tatistiky @@VISUALISER-BOX@@ Routino vizualizér @@WAYPOINT-POSITION@@ Bod XXX Pozícia @@WAYPOINT-LONGITUDE@@ Bod XXX Zemepisná dĺžka @@WAYPOINT-LATITUDE@@ Bod XXX Zemepisná šírka @@WAYPOINT-LOCATION@@ Bod XXX Poloha @@WAYPOINT-SEARCH@@ Hľadaj polohu @@WAYPOINT-GET@@ Nájdi aktuálnu polohu @@WAYPOINT-CENTRE1@@ Vycentruj mapu v tomto bode @@WAYPOINT-UP@@ Posunúť tento bod vyššie @@WAYPOINT-ADD@@ Pridaj bod za tento @@WAYPOINT-COORDS@@ Súradnice pre polohu @@WAYPOINT-HOME@@ Prepnúť ako domovskú polohu @@WAYPOINT-CENTRE2@@ VycentrovaÅ¥ tento bod na mape @@WAYPOINT-DOWN@@ Posunúť tento bod nižšie @@WAYPOINT-REMOVE@@ Odstraň tento bod @@WAYPOINT-REVERSE@@ OpaÄné poradie bodov @@WAYPOINT-REVERSE-BUTTON@@ OpaÄné poradie @@WAYPOINT-LOOP@@ PridaÅ¥ bod pre vytvorenie okruhu @@WAYPOINT-LOOP-BUTTON@@ UzavrieÅ¥ okruh @@TRANSPORT-FOOT@@ PeÅ¡o @@TRANSPORT-HORSE@@ Kôň @@TRANSPORT-WHEELCHAIR@@ Invalidný vozík @@TRANSPORT-BICYCLE@@ Bicykel @@TRANSPORT-MOPED@@ Moped @@TRANSPORT-MOTORCYCLE@@ Motorka @@TRANSPORT-MOTORCAR@@ Motorové vozidlo @@TRANSPORT-GOODS@@ Nákladné vozidlo @@TRANSPORT-HGV@@ Ťažké nákladné auto @@TRANSPORT-PSV@@ Verejná doprava @@HIGHWAY-MOTORWAY@@ Diaľnica @@HIGHWAY-TRUNK@@ Hlavná cesta @@HIGHWAY-PRIMARY@@ Cesta I. triedy @@HIGHWAY-SECONDARY@@ Cesta II. triedy @@HIGHWAY-TERTIARY@@ Cesta III. triedy @@HIGHWAY-UNCLASSIFIED@@ NeoznaÄená cesta @@HIGHWAY-RESIDENTIAL@@ Miestna komunikácia @@HIGHWAY-SERVICE@@ ÚÄelová komunikácia @@HIGHWAY-TRACK@@ Cesta @@HIGHWAY-CYCLEWAY@@ Cyklocesta @@HIGHWAY-PATH@@ Chodník @@HIGHWAY-STEPS@@ Schody @@HIGHWAY-FERRY@@ Prievoz @@PROPERTY-PAVED@@ Spevnená @@PROPERTY-MULTILANE@@ Viac pruhov @@PROPERTY-BRIDGE@@ Most @@PROPERTY-TUNNEL@@ Tunel @@PROPERTY-WALKINGROUTE@@ PeÅ¡ia trasa @@PROPERTY-BICYCLEROUTE@@ Cyklotrasa @@RESTRICT-ONEWAY@@ ReÅ¡pektuj jednosmerky @@RESTRICT-TURNS@@ ReÅ¡pektuj obmedzenia odboÄenia @@RESTRICT-WEIGHT@@ HmotnosÅ¥ @@RESTRICT-HEIGHT@@ Výška @@RESTRICT-WIDTH@@ Šírka @@RESTRICT-LENGTH@@ Dĺžka @@FIND-SHORTEST-ROUTE@@ Nájdi najkratÅ¡iu trasu @@FIND-QUICKEST-ROUTE@@ Nájdi najrýchlejÅ¡iu trasu @@MAP-VIEW-LINK@@ Odkaz na túto mapu @@EDIT-OSM-DATA@@ UpraviÅ¥ tieto OSM dáta @@ROUTER-NOT-RUN@@ PlánovaÄ nebeží @@ROUTER-RUNNING@@ PlánovaÄ beží... @@ROUTER-COMPLETED@@ Plánovanie ukonÄené @@ROUTER-ERROR@@ Chyba plánovaÄa @@ROUTER-FAILED@@ Zlyhalo spustenie plánovaÄa @@VIEW-DETAILS@@ ZobraziÅ¥ detaily @@NO-INFORMATION@@ Žiadne informácie @@HTML-ROUTE@@ HTML trasa @@GPX-TRACK-ROUTE@@ GPX súbor s bodmi @@GPX-ROUTE@@ GPX súbor s trasou @@FULL-TEXT-ROUTE@@ Podrobný textový súbor @@TEXT-ROUTE@@ Textový súbor @@OPEN-POPUP@@ Otvor popup @@DISPLAY-STATISTICS@@ Zobraz Å¡tatistiky @@JAVASCRIPT-REQUIRED@@ Je potrebné zapnúť Javascript na prezeranie tejto webovej stránky pre potreby interaktívnej mapy. @@ROUTER@@ SmerovaÄ @@GEO-DATA@@ Geo dáta @@TILES@@ Dlaždice # # Visualiser specific translations # @@VISUALISER-TITLE@@ Vizualizér údajov pre smerovanie údajov @@INSTRUCTIONS-BOX@@ InÅ¡trukcie @@ROUTER-BOX@@ Routino smerovaÄ @@NO-DATA-DISPLAYED@@ Nezobrazujú sa žiadne dáta @@VISUALISER-FAILED@@ Nepodarilo sa získaÅ¥ údaje vizualizéra! @@VISUALISER-NUM-JUNCTIONS@@ Spracované # križovatky @@VISUALISER-NUM-SUPER@@ Spracované # superuzly/segmenty @@VISUALISER-NUM-WAYTYPE@@ Spracované # cestné segmenty @@VISUALISER-NUM-SEGMENTS@@ Spracované # segmenty @@VISUALISER-NUM-NODES@@ Spracované # uzly @@VISUALISER-NUM-TURNS@@ Spracované # obmedzenia odboÄení @@VISUALISER-NUM-LIMITS@@ Spracované # zmeny rýchlostných obmedzení @@VISUALISER-NUM-ERRORS@@ Spracované # chyby @@JUNCTIONS-BUTTON@@ Zobraz križovatky $$JUNCTIONS-INFO$$ Každý uzol, ktorý je slepou uliÄkou, križovatkou dvoch typov rôznych ciest (alebo rôznych vlastností), alebo križovatka, kde sa stretávajú viac ako dva segmenty, sú zobrazené farebne. $$JUNCTIONS-INFO$$ @@JUNCTIONS-1@@ len jedna cesta - slepá uliÄka. @@JUNCTIONS-2@@ stret dvoch rôznych typov ciest. @@JUNCTIONS-3@@ stret troch ciest. @@JUNCTIONS-4@@ stret Å¡tyroch ciest. @@JUNCTIONS-5@@ stret piatich ciest. @@JUNCTIONS-6@@ stret Å¡iestich ciest. @@JUNCTIONS-MORE@@ stret siedmych (alebo viac) ciest. @@SUPER-BUTTON@@ Zobraz Supersegmenty $$SUPER-INFO$$ Zobrazuje sa každý superuzol a súvisiace supersegmenty (pozri stránku algoritmu pre podrobnejší popis). $$SUPER-INFO$$ @@WAYTYPE-BUTTON@@ Zobraz cestné typy segmentov $$WAYTYPE-INFO$$ Zobrazujeme každý diaľniÄný úsek Å¡peciálneho typu (jednosmerný, obojsmerný pre cyklistov a kruhový objazd). Pre jednosmerné segmenty, farebný trojuholník oznaÄuje povolený smer. Farby trojuholníkov závisia od smeru cestného segmentu. $$WAYTYPE-INFO$$ @@WAYTYPE-ONEWAY@@ Jednosmerné segmenty @@WAYTYPE-CYCLE-BOTH-WAYS@@ Cyklistické obojsmerné segmenty @@WAYTYPE-ROUNDABOUT@@ Segmenty kruhových objazdov @@HIGHWAY-BUTTON@@ Zobraz cestné segmenty $$HIGHWAY-INFO$$ Zakreslí sa každý segment zvoleného typu cesty. $$HIGHWAY-INFO$$ @@TRANSPORT-BUTTON@@ ZobraziÅ¥ dopravné segmenty $$TRANSPORT-INFO$$ Vykreslí sa každý povolený segment pre zvolený typ dopravy. $$TRANSPORT-INFO$$ @@BARRIER-BUTTON@@ ZobraziÅ¥ uzly bariéry $$BARRIER-INFO$$ Vykreslí každú bariéru blokujúcu zvolený druh dopravy. $$BARRIER-INFO$$ @@TURNS-BUTTON@@ Zobraz obmedzenia odboÄenia $$TURNS-INFO$$ Každé obmedzenie odboÄenia je znázornené Äiarou oznaÄujúcou nepovolenú odboÄku. $$TURNS-INFO$$ @@SPEED-BUTTON@@ Zobraz rýchlostné obmedzenia $$SPEED-INFO$$ Je zobrazený každý uzol, ktorý spája segmenty s rôznymi rýchlostnými obmedzeniami spolu s rýchlostným obmedzením na prísluÅ¡ných úsekoch. $$SPEED-INFO$$ @@LIMIT-CHANGE@@ Zmena rýchlostného obmedzenia @@LIMIT-NONE@@ NeÅ¡pecifikované rýchlostné obmedzenie @@SPEED-LIMIT-80@@ Rýchlostné obmedzenie na 80 km/h @@WEIGHT-BUTTON@@ Zobraz hmotnostné obmedzenia $$WEIGHT-INFO$$ Je zobrazený každý uzol, ktorý spája segmenty s rôznymi hmotnostnými obmedzeniami spolu s hmotnostným obmedzením pre prísluÅ¡né segmenty. $$WEIGHT-INFO$$ @@WEIGHT-LIMIT-8@@ Hmotnostné obmedzenia do 8 ton. @@HEIGHT-BUTTON@@ Zobrazenie výškových obmedzení $$HEIGHT-INFO$$ Je zobrazený každý uzol, ktorý spája segmenty s rôznymi výškovými obmedzeniami spolu s výškovým obmedzením pre prísluÅ¡né segmenty. $$HEIGHT-INFO$$ @@HEIGHT-LIMIT-4@@ Obmedzenie výšky do 4.0 m. @@WIDTH-BUTTON@@ Zobrazenie obmedzení šírky $$WIDTH-INFO$$ Je zobrazený každý uzol, ktorý spája segmenty s rôznymi šírkovými obmedzeniami spolu so šírkovým obmedzením pre prísluÅ¡né segmenty. $$WIDTH-INFO$$ @@WIDTH-LIMIT-3@@ Obmedzenie šírky do 3.0 m. @@LENGTH-BUTTON@@ Zobrazenie obmedzení dĺžky $$LENGTH-INFO$$ Je zobrazený každý uzol, ktorý spája segmenty s rôznymi obmedzeniami dĺžky spolu s obmedzením dĺžky pre prísluÅ¡né segmenty. $$LENGTH-INFO$$ @@LENGTH-LIMIT-9@@ Obmedzenie dlžky do 9.0 m. @@PROPERTY-BUTTON@@ Zobraz vlastnosti cesty $$PROPERTY-INFO$$ Je vykreslený každý segment ciest s konkrétnou vlastnosÅ¥ou. $$PROPERTY-INFO$$ @@ERROR-LOG-BUTTON@@ Zobraz chyby $$ERROR-LOG-INFO$$ Potenciálne problémy nájdené Routinom pri spracovaní vstupných údajov. $$ERROR-LOG-INFO$$ @@CLEAR-DATA-BUTTON@@ Vymaž údaje # # Multi-line descriptive translations (router) # $$ROUTER-INFO$$ Táto webová stránka umožňuje smerovanie v rámci údajov zhromaždených z OpenStreetMap. Vyberte poÄiatoÄný a koncový bod (kliknite na ikony znaÄiek nižšie), vyberte preferencie trasy a dajte vyhľadaÅ¥ trasu. $$ROUTER-INFO$$ $$ROUTER-OPTIONS-HELP$$ struÄný návod
Kliknite na ikony znaÄiek (vyššie) a umiestnite ich na mapu (vpravo). Potom ich presuňte do správnej polohy. Priblíženie mapy pred umiestnením znaÄiek je asi najjednoduchÅ¡ie. Prípadne zadajte zemepisnú šírku a zemepisnú dĺžku do polí vyššie.

Vyberte typ dopravy, povolené typy ciest, rýchlostné obmedzenia, vlastnosti ciest a ÄalÅ¡ie obmedzenia z vyššie uvedených možností. Zvoľte "NajkratÅ¡ia" alebo "NajrýchlejÅ¡ia" trasa pre jej výpoÄet a zobrazenie na mape.

Trasové body
Kliknutím na ikony znaÄiek prepnete ich zobrazenie na mape. VypoÄítaná trasa prejde (Äo najbližšie pre vybraný typ dopravy) každý z trasových bodov, ktoré majú znaÄky na mape v uvedenom poradí.

Typ dopravy
Výber typu dopravy obmedzí zvolenú trasu na tie, na ktorých je to povolené a nastaví predvolené hodnoty pre ostatné parametre.

Predvoľby ciest
Preferencie ciest sa urÄujú na základe percent a výsledná trasa sa snaží dodržiavaÅ¥ zvolené preferencie. Napríklad, ak má "cesta I. triedy" hodnotu "110 %" a "cesta II. triedy" má hodnotu "100 %", trasa na ceste I. triedy môže byÅ¥ až o 10 % dlhÅ¡ia ako na ceste II. triedy a stále sa použije.

Obmedzenia rýchlosti
Zvolené rýchlostné limity pre rôzne typy ciest sa aplikujú, ak cesta nemá iný rýchlostný limit alebo je vyšší ako zadaný.

Rozšírené nastavenia ciest
Nastavenie vlastnosti sa vyberá v percentách a podľa toho sa vyberajú trasy, ktoré majú preferované atribúty. Napríklad, ak je "spevnená" cesta nastavená na "75 %", tak nespevnená cesta má automaticky preferenciu "25%", takže trasa na spevnenej ceste môže byť 3x dlhšia ako nespevnená a stále bude vybraná.

Iné obmedzenia
Tieto obmedzenia umožňujú nájsÅ¥ trasu, ktorá sa vyhýba vyznaÄeným obmedzeniam na hmotnosÅ¥, výšku, šírku alebo dĺžku. Je tiež možné ignorovaÅ¥ jednosmerné obmedzenia (napríklad pri chôdzi). $$ROUTER-OPTIONS-HELP$$ $$ROUTER-RESULTS-HELP$$ StruÄný návod
Po vypoÄítaní trasy si môžete stiahnuÅ¥ GPX súbor alebo obyÄajný textový popis trasy (súhrnná alebo podrobná verzia). Takisto si môžete prezeraÅ¥ podrobný popis trasy a priblížiÅ¥ sa na vybrané Äasti.

Riešenie problémov
Ak smerovaÄ skonÄí s chybou, najpravdepodobnejÅ¡ou príÄinou je, že medzi vybranými bodmi nie je možné nájsÅ¥ trasu. Presunutie jednej alebo viac znaÄiek alebo zmena možností smerovania umožní nájdenie trasy.

Výstupné formáty

HTML inštrukcie
Popis trasy s pokynmi na zmenu smeru na každej dôležitej križovatke.
Trasa v súbore GPX
Rovnaké informácie, ktoré sú zobrazené na mape s bodmi pre každý uzol a Äiarami pre každý segment.
Smerovanie v súbore GPX
Rovnaké informácie, ktoré sa zobrazujú v texte pre trasu s trasovým bodom pre každú dôležitú križovatku na trase.
Úplný textový súbor
Zoznam vÅ¡etkých navÅ¡tívených uzlov, ako aj vzdialenosÅ¥ medzi nimi a kumulatívnou vzdialenosÅ¥ou pre každú ÄasÅ¥ trasy.
Textový súbor
Rovnaké informácie, ktoré sa zobrazujú v texte pre trasu.
$$ROUTER-RESULTS-HELP$$ $$ROUTER-VISUALISER-INFO$$ Na zobrazenie Routino pohľadu na dáta, existuje vizualizér údajov, ktorý umožňuje zobrazenie údajov rôznymi spôsobmi. $$ROUTER-VISUALISER-INFO$$ # # Multi-line descriptive translations (visualiser) # $$VISUALISER-INFO$$ Táto webová stránka umožňuje vizualizáciu údajov, ktoré Routino používa na smerovanie. Zobrazujú sa iba tie údaje, ktoré sú relevantné pre smerovanie a preto niektoré údaje sú vylúÄené. $$VISUALISER-INFO$$ $$VISUALISER-INSTRUCTIONS$$ Priblížte a potom pomocou tlaÄidiel nižšie stiahnite údaje. Server vráti údaje iba vtedy, ak je oznaÄená oblasÅ¥ dostatoÄne malá. $$VISUALISER-INSTRUCTIONS$$ $$VISUALISER-HELP$$ StruÄný návod
Priblížte sa do oblasti a vyberte jedno z tlaÄidiel na zobrazenie daného typu údajov.
ÄŽalÅ¡ie možnosti údajov nájdete po rozbalení podrobností pod každým tlaÄidlom.

Zlyhanie údajov
Ak je vybratá oblasť príliš veľká (závisí od typu údajov), výsledný stav bude "Nepodarilo sa získať údaje vizualizéra" - priblížte sa viac a skúste znova. $$VISUALISER-HELP$$ $$VISUALISER-ROUTER-INFO$$ Ak chcete vykonať trasovanie na mape, použite odkaz nižšie. $$VISUALISER-ROUTER-INFO$$ routino-3.4.3/web/translations/translation.es.txt 644 233 144 13535 14567425110 15427 0# # Spanish language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Autor %%copyright_source_string%% Fuente %%copyright_source_text%% Basado en datos OpenStreetMap de http://www.openstreetmap.org/ %%copyright_license_string%% Licencia %%turn_-4%% Media vuelta hacia la izquierda %%turn_-3%% Muy a la izquierda %%turn_-2%% A la izaquierda %%turn_-1%% Ligeramente a la izquierda %%turn_0%% Todo recto %%turn_1%% Ligeramente a la derecha %%turn_2%% A la derecha %%turn_3%% Muy a la derecha %%turn_4%% Media vuelta hacia la derecha %%heading_-4%% Sur %%heading_-3%% Sur-Oeste %%heading_-2%% Oeste %%heading_-1%% Nor-Oeste %%heading_0%% Norte %%heading_1%% Nor-Este %%heading_2%% Este %%heading_3%% Sur-Este %%heading_4%% Sur %%ordinal_1%% Primera %%ordinal_2%% Segunda %%ordinal_3%% Tercera %%ordinal_4%% Cuarta %%ordinal_5%% Quinta %%ordinal_6%% Sexta %%ordinal_7%% Septima %%ordinal_8%% Octava %%ordinal_9%% Novena %%ordinal_10%% Décima %%highway_motorway%% autopista %%highway_trunk%% enlace %%highway_primary%% carretera nacional %%highway_secondary%% carretera regional %%highway_tertiary%% carretera local %%highway_unclassified%% carretera sin clasificar %%highway_residential%% calle %%highway_service%% vía de servicio %%highway_track%% pista %%highway_cycleway%% via ciclable %%highway_path%% sendero %%highway_steps%% escaleras %%highway_ferry%% ferry %%route_shortest%% Más corto %%route_quickest%% Más rápido %%output-html_waypoint_waypoint%% Punto %%output-html_waypoint_junction%% Cruce %%output-html_waypoint_roundabout%% Rotonda %%output-html_title%% Itinéraire %s %%output-html_start%% Inicio en el %s, dirección %s %%output-html_node%% En el %s, ir %s dirección %s %%output-html_rbnode%% Dejar la %s por la %s salida, dirección %s %%output-html_segment%% Seguir %s durante %.3f km, %.1f min %%output-html_stop%% Parar en %s %%output-html_total%% Total %.1f km, %.0f minutos %%output-html_subtotal%% %.1f km, %.0f minutos %%output-gpx_waypoint_waypt%% WayPoint %%output-gpx_waypoint_trip%% Punto %%output-gpx_desc%% Itinerario %s entre los puntos 'inicio' y 'final' %%output-gpx_name%% Itinerario %s %%output-gpx_step%% %s en '%s' durante %.3f km, %.1f min %%output-gpx_final%% Trayecto total %.1f km, %.0f minutes # # Router (and some shared) translations # @@LANGUAGE@@ Español @@LANGUAGE-WEBPAGE@@ Español webpage @@ROUTER-TITLE@@ Planificador de Rutas para Datos OpenStreetMap @@OPTION-TAB@@ Opciones @@OPTION-TAB-HELP@@ Configurar opciones de enrutado @@RESULTS-TAB@@ Resultados @@RESULTS-TAB-HELP@@ Mostrar Ruta Resultante @@DATA-TAB@@ Datos @@DATA-TAB-HELP@@ Ver información de la base de datos @@ROUTINO-ROUTER@@ Enrutador de OpenStreetMap Routino @@ROUTINO-WEBSITE@@ Sitio Web de Routino @@DOCUMENTATION@@ Documentación @@LANGUAGE-BOX@@ Idioma @@WAYPOINTS-BOX@@ Waypoints @@TRANSPORT-TYPE-BOX@@ Medio de locomoción @@HIGHWAY-PREFERENCES-BOX@@ Preferencias de autovía @@SPEED-LIMITS-BOX@@ Limites de Velocidad @@PROPERTY-PREFERENCES-BOX@@ Preferencias de propiedad @@OTHER-RESTRICTIONS-BOX@@ Otras restricciones @@FIND-BOX@@ Buscar @@LINKS-BOX@@ Enlaces @@HELP-BOX@@ Ayuda @@STATUS-BOX@@ Estado @@SHORTEST-ROUTE@@ Ruta más corta @@QUICKEST-ROUTE@@ Ruta mas rápida @@STATISTICS-BOX@@ Estadísticas Routino @@VISUALISER-BOX@@ Visualizador Routino @@WAYPOINT-POSITION@@ Posición Punto de Trayecto XXX @@WAYPOINT-LONGITUDE@@ Longitud Punto de Trayecto XXX @@WAYPOINT-LATITUDE@@ Latitud Punto de Trayecto XXX @@WAYPOINT-LOCATION@@ Localización Punto de Trayecto XXX @@WAYPOINT-SEARCH@@ Buscar ubicación @@WAYPOINT-GET@@ Obtener ubicación actual @@WAYPOINT-CENTRE1@@ Centrar mapa en este Waypoint @@WAYPOINT-UP@@ Mover este punto de ruta arriba @@WAYPOINT-ADD@@ Añadir punto de ruta después de este @@WAYPOINT-COORDS@@ Coordenadas de la ubicación @@WAYPOINT-HOME@@ Fijar como casa @@WAYPOINT-CENTRE2@@ Centrar este punto de ruta en el mapa @@WAYPOINT-DOWN@@ Mover este punto de ruta abajo @@WAYPOINT-REMOVE@@ Quitar este punto de ruta @@WAYPOINT-REVERSE@@ Invertir el orden de los puntos de ruta @@WAYPOINT-REVERSE-BUTTON@@ Invertir el orden @@WAYPOINT-LOOP@@ Añadir nuevo punto de ruta para crear un bucle @@WAYPOINT-LOOP-BUTTON@@ Cerrar bucle @@TRANSPORT-FOOT@@ Pie @@TRANSPORT-HORSE@@ Caballo @@TRANSPORT-WHEELCHAIR@@ Silla de ruedas @@TRANSPORT-BICYCLE@@ Bicicleta @@TRANSPORT-MOTORCYCLE@@ Ciclomotor @@HIGHWAY-MOTORWAY@@ Autovía @@HIGHWAY-PRIMARY@@ Primaria @@HIGHWAY-SECONDARY@@ Secundaria @@HIGHWAY-TERTIARY@@ Terciaria @@HIGHWAY-UNCLASSIFIED@@ Sin clasificar @@HIGHWAY-RESIDENTIAL@@ Residencial @@HIGHWAY-SERVICE@@ Servicio @@HIGHWAY-PATH@@ Ruta @@HIGHWAY-STEPS@@ Pasos @@HIGHWAY-FERRY@@ Ferry @@PROPERTY-PAVED@@ Pavimentado @@PROPERTY-MULTILANE@@ Varios carriles @@PROPERTY-BRIDGE@@ Puente @@PROPERTY-TUNNEL@@ Túnel @@PROPERTY-WALKINGROUTE@@ Ruta de senderismo @@PROPERTY-BICYCLEROUTE@@ Ruta ciclista @@RESTRICT-ONEWAY@@ Obedcer calles de un sentido @@RESTRICT-TURNS@@ Obedecer restricciones de giro @@RESTRICT-WEIGHT@@ Peso @@RESTRICT-HEIGHT@@ Altura @@RESTRICT-WIDTH@@ Ancho @@RESTRICT-LENGTH@@ Longitud @@FIND-SHORTEST-ROUTE@@ Buscar ruta más corta @@FIND-QUICKEST-ROUTE@@ Buscar ruta más rápida @@MAP-VIEW-LINK@@ Enlace a esta vista de mapa @@EDIT-OSM-DATA@@ Edita estos datos OSM @@ROUTER-NOT-RUN@@ Ruta no trazada @@ROUTER-RUNNING@@ Trazando ruta... @@ROUTER-COMPLETED@@ Ruta completada @@ROUTER-ERROR@@ Error de ruta @@ROUTER-FAILED@@ Fallo al trazar la ruta @@VIEW-DETAILS@@ Ver detalles @@NO-INFORMATION@@ Sin información @@HTML-ROUTE@@ Direcciones HTML @@GPX-ROUTE@@ Archivo de ruta GPX @@FULL-TEXT-ROUTE@@ Archivo de texto completo @@TEXT-ROUTE@@ Archivo de texto @@OPEN-POPUP@@ Abrir pop-up @@DISPLAY-STATISTICS@@ Mostrar estadísticas @@ROUTER@@ Enrutador # # Visualiser specific translations # @@INSTRUCTIONS-BOX@@ Instrucciones # # Multi-line descriptive translations (router) # # # Multi-line descriptive translations (visualiser) # routino-3.4.3/web/translations/visualiser.html 644 233 144 53565 13157503637 15012 0 Routino : @@VISUALISER-TITLE@@

Visualiser Router Data
+ - @@LANGUAGE-BOX@@
@@INSTRUCTIONS-BOX@@ $$VISUALISER-INSTRUCTIONS$$
@@STATUS-BOX@@
@@NO-DATA-DISPLAYED@@
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - @@HELP-BOX@@
$$VISUALISER-HELP$$
@@ROUTER@@: Routino | @@GEO-DATA@@: | @@TILES@@:
routino-3.4.3/web/translations/translations-tail.xml 644 233 144 30 12314102416 16003 0 routino-3.4.3/web/translations/translations-body.xml 644 233 144 11416 12601526231 16105 0 <!-- %s = [shortest|quickest] --> <start text="%%output-html_start%%" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="%%output-html_node%%" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <rbnode text="%%output-html_rbnode%%" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="%%output-html_segment%%" /> <!-- 1st %s = street name --> <stop text="%%output-html_stop%%" /> <!-- 1st %s = [waypoint|junction] --> <total text="%%output-html_total%%" /> <subtotal text="%%output-html_subtotal%%" /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="%%output-gpx_waypoint_waypt%%" /> <!-- For the route waypoints --> <waypoint type="trip" string="%%output-gpx_waypoint_trip%%" /> <!-- For the other route points --> <desc text="%%output-gpx_desc%%" /> <!-- %s = [shortest|quickest] --> <name text="%%output-gpx_name%%" /> <!-- %s = [shortest|quickest] --> <step text="%%output-gpx_step%%" /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="%%output-gpx_final%%" /> </output-gpx> </language> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/web/translations/translation.it.txt��������������������������������������������������� 644 � 233 � 144 � 36275 13236635625 15450� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Italian language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Autore %%copyright_source_string%% Sorgente %%copyright_source_text%% Basato sui dati di OpenStreetMap (http://www.openstreetmap.org/) %%copyright_license_string%% Licenza %%turn_-4%% Immediatamente a sinistra %%turn_-3%% Subito a sinistra %%turn_-2%% Sinistra %%turn_-1%% Leggermente a sinistra %%turn_0%% Dritto %%turn_1%% Leggermente a destra %%turn_2%% Destra %%turn_3%% Subito a destra %%turn_4%% Immediatamente a destra %%heading_-4%% Sud %%heading_-3%% Sud-Ovest %%heading_-2%% Ovest %%heading_-1%% Nord-Ovest %%heading_0%% Nord %%heading_1%% Nord-Est %%heading_2%% Est %%heading_3%% Sud-Est %%heading_4%% Sud %%ordinal_1%% Prima %%ordinal_2%% Seconda %%ordinal_3%% Terza %%ordinal_4%% Quarta %%ordinal_5%% Quinta %%ordinal_6%% Sesta %%ordinal_7%% Settima %%ordinal_8%% Ottava %%ordinal_9%% Nona %%ordinal_10%% Decima %%highway_motorway%% autostrada %%highway_trunk%% superstrada %%highway_primary%% strada statale %%highway_secondary%% strada regionale %%highway_tertiary%% strada provinciale %%highway_unclassified%% strada non classificata %%highway_residential%% strada residenziale %%highway_service%% strada di servizio %%highway_track%% traccia %%highway_cycleway%% pista ciclabile %%highway_path%% sentiero %%highway_steps%% scalinata %%highway_ferry%% traghetto %%route_shortest%% Il piu' corto %%route_quickest%% Il piu' veloce %%output-html_waypoint_waypoint%% Punto sul tragitto %%output-html_waypoint_junction%% Raccordo %%output-html_waypoint_roundabout%% Rotatoria %%output-html_title%% %s Itinerario %%output-html_start%% Inizia a %s, su %s %%output-html_node%% A %s, vai a %s su %s %%output-html_rbnode%% Lascia %s, prendi la %s uscita su %s %%output-html_segment%% Segui %s per %.3f km, %.1f min %%output-html_stop%% Stop fra %s %%output-html_total%% Totale %.1f km, %.0f minuti %%output-html_subtotal%% %.1f km, %.0f minuti %%output-gpx_waypoint_waypt%% WAYPT %%output-gpx_waypoint_trip%% TRIP %%output-gpx_desc%% %s punti sul percorso fra 'start' e 'finish' %%output-gpx_name%% %s percorso %%output-gpx_step%% %s su '%s' per %.3f km, %.1f min %%output-gpx_final%% Viaggio completo %.1f km, %.0f minuti # # Router (and some shared) translations # @@LANGUAGE@@ Italiano @@LANGUAGE-WEBPAGE@@ Italiano webpage @@ROUTER-TITLE@@ Pianificazione percorso per i dati di OpenStreetMap @@OPTION-TAB@@ Opzioni @@OPTION-TAB-HELP@@ Imposta le opzioni del percorso @@RESULTS-TAB@@ Risultati @@RESULTS-TAB-HELP@@ Vedi i risultati del percorso @@DATA-TAB@@ Dati @@DATA-TAB-HELP@@ Informazioni sulla base dati @@ROUTINO-ROUTER@@ Routino OpenStreetMap Router @@ROUTINO-WEBSITE@@ Pagina web di Routino @@DOCUMENTATION@@ Documentazione @@LANGUAGE-BOX@@ Lingua @@WAYPOINTS-BOX@@ Punti sul percorso @@TRANSPORT-TYPE-BOX@@ Tipo di trasporto @@HIGHWAY-PREFERENCES-BOX@@ Preferenze per autostrada @@SPEED-LIMITS-BOX@@ Limiti di velocita' @@PROPERTY-PREFERENCES-BOX@@ Impostazione proprieta' @@OTHER-RESTRICTIONS-BOX@@ Altri limitazioni @@FIND-BOX@@ Trova @@LINKS-BOX@@ Collegamenti @@HELP-BOX@@ Aiuto @@STATUS-BOX@@ Stato @@SHORTEST-ROUTE@@ Percorso piu' breve @@QUICKEST-ROUTE@@ Percorso piu' veloce @@STATISTICS-BOX@@ Statistiche Routio @@VISUALISER-BOX@@ Visualizzatore Routino @@WAYPOINT-POSITION@@ Posizione del punto XXX @@WAYPOINT-LONGITUDE@@ Longitudine del punto XXX @@WAYPOINT-LATITUDE@@ Latitudine del punto XXX @@WAYPOINT-LOCATION@@ Luogo del punto XXX @@WAYPOINT-SEARCH@@ Ricerca del luogo @@WAYPOINT-GET@@ Ottieni luogo attuale @@WAYPOINT-CENTRE1@@ Centra la mappa su questo punto @@WAYPOINT-UP@@ Muovi in alto questo punto @@WAYPOINT-ADD@@ Aggiungi un punto dopo questo @@WAYPOINT-COORDS@@ Coordinate per la posizione @@WAYPOINT-HOME@@ Imposta come casa @@WAYPOINT-CENTRE2@@ Centra questo punto sulla mappa @@WAYPOINT-DOWN@@ Muovi in basso questo punto @@WAYPOINT-REMOVE@@ Rimuovi questo punto dal percorso @@WAYPOINT-REVERSE@@ Ordine inverso dei punti sul percorso @@WAYPOINT-REVERSE-BUTTON@@ Ordine inverso @@WAYPOINT-LOOP@@ Aggiungi un nuovo punto per chiudere il ciclo @@WAYPOINT-LOOP-BUTTON@@ Chiudi il ciclo @@TRANSPORT-FOOT@@ A piedi @@TRANSPORT-HORSE@@ Cavallo @@TRANSPORT-WHEELCHAIR@@ Carrozzella @@TRANSPORT-BICYCLE@@ Bicicletta @@TRANSPORT-MOPED@@ Ciclomotore @@TRANSPORT-MOTORCYCLE@@ Motociclo @@TRANSPORT-MOTORCAR@@ Autovettura @@TRANSPORT-GOODS@@ Merce @@TRANSPORT-HGV@@ Trasporto Merci Pesante @@TRANSPORT-PSV@@ Mezzi Pubblici @@HIGHWAY-MOTORWAY@@ Autostrada @@HIGHWAY-TRUNK@@ Superstrada @@HIGHWAY-PRIMARY@@ Statale @@HIGHWAY-SECONDARY@@ Regionale @@HIGHWAY-TERTIARY@@ Provinciale @@HIGHWAY-UNCLASSIFIED@@ Non classificata @@HIGHWAY-RESIDENTIAL@@ Residenziale @@HIGHWAY-SERVICE@@ Servizio @@HIGHWAY-TRACK@@ Traccia @@HIGHWAY-CYCLEWAY@@ Pista ciclabile @@HIGHWAY-PATH@@ Sentiero @@HIGHWAY-STEPS@@ Passaggi @@HIGHWAY-FERRY@@ Traghetto @@PROPERTY-PAVED@@ Asfaltata @@PROPERTY-MULTILANE@@ Corsie multiple @@PROPERTY-BRIDGE@@ Ponte @@PROPERTY-TUNNEL@@ Tunnel @@PROPERTY-WALKINGROUTE@@ Percorso pedonale @@PROPERTY-BICYCLEROUTE@@ Percorso ciclabile @@RESTRICT-ONEWAY@@ Strade a senso unico @@RESTRICT-TURNS@@ Divieto di svolta @@RESTRICT-WEIGHT@@ Peso @@RESTRICT-HEIGHT@@ Altezza @@RESTRICT-WIDTH@@ Larghezza @@RESTRICT-LENGTH@@ Lunghezza @@FIND-SHORTEST-ROUTE@@ Trova il percorso più breve @@FIND-QUICKEST-ROUTE@@ Trova il percorso più veloce @@MAP-VIEW-LINK@@ Collegamento a questa vista della mappa @@EDIT-OSM-DATA@@ Modifica questi dati OSM @@ROUTER-NOT-RUN@@ Percorso bloccato @@ROUTER-RUNNING@@ Percorso in esecuzione @@ROUTER-COMPLETED@@ Percorso completo @@ROUTER-ERROR@@ Errore di percorso @@ROUTER-FAILED@@ Errore di esecuzione del percorso @@VIEW-DETAILS@@ Vedi dettagli @@NO-INFORMATION@@ Nessuna informazione @@HTML-ROUTE@@ Direzioni in formato HTML @@GPX-TRACK-ROUTE@@ File con tracciato GPX @@GPX-ROUTE@@ File con percorso GPX @@FULL-TEXT-ROUTE@@ File di testo con piu' informazioni @@TEXT-ROUTE@@ File di testo @@OPEN-POPUP@@ Nuova pagine @@DISPLAY-STATISTICS@@ Mostra statistiche dei dati @@JAVASCRIPT-REQUIRED@@ E' <em>necessario</em> Javascript per questa pagina web in quanto la mappa è interattiva. @@ROUTER@@ Percorso @@GEO-DATA@@ Dati Geografici @@TILES@@ Tiles # # Visualiser specific translations # @@VISUALISER-TITLE@@ Visualizzatore dati percorso @@INSTRUCTIONS-BOX@@ Istruzioni @@ROUTER-BOX@@ Percorso Routino @@NO-DATA-DISPLAYED@@ Nessun dato mostrato @@VISUALISER-FAILED@@ Errore nella visualizzazione dei dati! @@VISUALISER-NUM-JUNCTIONS@@ Elaborati # raccordi @@VISUALISER-NUM-SUPER@@ Elaborati # super-nodi/segmanti @@VISUALISER-NUM-WAYTYPE@@ Elaborati # segmenti di tipo via @@VISUALISER-NUM-SEGMENTS@@ Elaborati # segmanti @@VISUALISER-NUM-NODES@@ Elaborati # nodi @@VISUALISER-NUM-TURNS@@ Elaborati # vincoli di svolta @@VISUALISER-NUM-LIMITS@@ Elaborati # cambio di limiti @@VISUALISER-NUM-ERRORS@@ Elaborati # raccolta degli errori @@JUNCTIONS-BUTTON@@ Mostra Raccordi $$JUNCTIONS-INFO$$ Ogni nodo che sia finale, oppure un raccordo fra due strade di diverso tipo o con diverse proprietà, o un raccordo dove confluiscono due o più segmenti, viene mostrato con un colore codificato. $$JUNCTIONS-INFO$$ @@JUNCTIONS-1@@ strada chiusa a senso unico. @@JUNCTIONS-2@@ Trovate due superstrade di tipo diverso. @@JUNCTIONS-3@@ Trovate tre superstrade. @@JUNCTIONS-4@@ Trovate quattro superstrade. @@JUNCTIONS-5@@ Trovate cinque superstrade. @@JUNCTIONS-6@@ Trovate sei superstrade. @@JUNCTIONS-MORE@@ Trovate sette (o più) superstrade. @@SUPER-BUTTON@@ Mostra Super Segmenti $$SUPER-INFO$$ Sono mostrati ogni super-nodo con i super-segmenti associati (per dettagli vedi la pagina dell'algoritmo). $$SUPER-INFO$$ @@WAYTYPE-BUTTON@@ Mostra Segmenti Di Tipo Via $$WAYTYPE-INFO$$ Viene mostrato ogni tratto speciali (a senso unico, ciclabile in entrambi i sensi e rotatoria). Per segmenti a senso unico un triangolo colorato indica la direzione consentita. I colori dei triangoli dipendono dall'orientamento del segmento stesso. $$WAYTYPE-INFO$$ @@WAYTYPE-ONEWAY@@ Segmenti senso unico @@WAYTYPE-CYCLE-BOTH-WAYS@@ Segmenti doppio senso @@WAYTYPE-ROUNDABOUT@@ Segmenti rotatoria @@HIGHWAY-BUTTON@@ Mostra Segmenti Autostrada $$HIGHWAY-INFO$$ Viene mostrato ogni segmento delle superstrade selezionate. $$HIGHWAY-INFO$$ @@TRANSPORT-BUTTON@@ Mostra Segmenti Trasporto. $$TRANSPORT-INFO$$ Viene mostrato ogni segmento consentito per il trasporto selezionato. $$TRANSPORT-INFO$$ @@BARRIER-BUTTON@@ Mostra Nodi Barriera $$BARRIER-INFO$$ Viene mostrata ogni barriera che blocca il tipo di trasporto selezionato. $$BARRIER-INFO$$ @@TURNS-BUTTON@@ Mostra i limiti sulle svolte $$TURNS-INFO$$ Le svolte non consentite vengono indicate da una linea. $$TURNS-INFO$$ @@SPEED-BUTTON@@ Mostra i limiti di velocità $$SPEED-INFO$$ Ogni nodo che unisce segmenti con limiti di velocità diversi viene mostrato con tale limite sui relativi segmenti. $$SPEED-INFO$$ @@LIMIT-CHANGE@@ Cambio di limite @@LIMIT-NONE@@ Nessun limite specificato @@SPEED-LIMIT-80@@ velocità massima 80 km/ora @@WEIGHT-BUTTON@@ Mostra i limiti di peso $$WEIGHT-INFO$$ Viene visualizzato ogni nodo che unisce segmenti con diversi limiti di peso insieme al limite di peso per i relativi segmenti. $$WEIGHT-INFO$$ @@WEIGHT-LIMIT-8@@ peso massimo 8 tonnellate @@HEIGHT-BUTTON@@ Mostra i limiti di altezza $$HEIGHT-INFO$$ Viene visualizzato ogni nodo che unisce segmenti con diversi limiti di altezza insieme al limite di altezza per i relativi segmenti. $$HEIGHT-INFO$$ @@HEIGHT-LIMIT-4@@ altezza massima 4 metri @@WIDTH-BUTTON@@ Mostra i limiti di larghezza $$WIDTH-INFO$$ Viene visualizzato ogni nodo che unisce segmenti con diversi limiti di larghezza insieme al limite di larghezza per i relativi segmenti. $$WIDTH-INFO$$ @@WIDTH-LIMIT-3@@ larghezza massima 3 metri @@LENGTH-BUTTON@@ Mostra i limiti di lunghezza $$LENGTH-INFO$$ Viene visualizzato ogni nodo che unisce segmenti con diversi limiti di lunghezza insieme al limite di lunghezza per i relativi segmenti. $$LENGTH-INFO$$ @@LENGTH-LIMIT-9@@ lunghezza massima 9 metri @@PROPERTY-BUTTON@@ Mostra le proprietà delle autostrade. $$PROPERTY-INFO$$ Viene disegnato ogni segmento delle autostrade con una specifica proprietà. $$PROPERTY-INFO$$ @@ERROR-LOG-BUTTON@@ Mostra gli errori registrati. $$ERROR-LOG-INFO$$ Potenziali problemi riscontrati da Routino durante l'elaborazione dei dati in ingresso. $$ERROR-LOG-INFO$$ @@CLEAR-DATA-BUTTON@@ Cancella i dati # # Multi-line descriptive translations (router) # $$ROUTER-INFO$$ Questa pagina consente il calcolo del percorso con i dati raccolti da OpenStreetMap. Seleziona i punti di partenza e di arrivo (clicca sulle icone dei marcatori qui sotto), seleziona le preferenze e trova un percorso. $$ROUTER-INFO$$ $$ROUTER-OPTIONS-HELP$$ <B> Avvio rapido </ b> <br> Seleziona le icone dei marcatori (sopra) per posizionarli sulla mappa (a destra). Poi Trascinarli nella posizione desiderata. Eventualmente ingrandire la mappa per posizionarli con maggiore precisione. In alternativa digitare la latitudine e longitudine nelle apposite caselle. <P> Selezionare il tipo di trasporto, i tipi di strade e le loro proprietà, i limiti di velocità e altre impstazioni dalle opzioni sopra riportate. Selezionare il tipo di percorso "più breve" o "più veloce" per calcolarlo e visualizzarlo sulla mappa. <P> <B> Punti sul percorso </ b> <br> Selezionando le icone dei marcatori, questi saranno visualizzati sulla mappa. Quando viene calcolato un percorso, ogni punto viene visualizzato nel modo più coerente possibile al tipo di trasporto selezionato, ciascuno nell'ordine indicato. <P> <B> Tipo di trasporto </ b> <br> La selezione di un tipo di trasporto vincola il tipo di tragitto ed imposta i valori predefiniti per gli altri parametri relativi. <P> <B> Preferenze per tipi di strade </ b> <br> La percorrenza sulle strade principali sono impostate come percentuale di preferenza. Ad esempio, se ad una strada primaria viene data una preferenza del 100%, mentre ad una secondaria una preferenza del 90%, significa che il percorso sulla strada primaria può essere fino al 10% più lungo di quello sulla strada secondaria. <P> <B> Limiti di velocità </ b> <br> I limiti di velocità per i vari tipi di strade si applicano se la strada stessa non ha altri limiti di velocità contrassegnati o è superiore a quello scelto. <P> <B> Preferenze sulla proprietà </ b> <br> La preferenza sulla proprietà viene impostata come percentuale e vengono scelti i tragitti cercando di rispettare tali preferenze. Ad esempio, se ad una strada asfaltata viene data una preferenza del 75% allora automaticamente ad una non asfaltata viene data una preferenza del 25%. In questo modo un percorso su una strada asfaltata può risultare filo a 3 volte più lungo rispetto a quella non asfaltata. <P> <B> Altre restrizioni </ b> <br> Si può decidere di ignorare i limiti imposti come peso, altezza, larghezza o lunghezza. È anche possibile ignorare restrizioni di senso unico se per esempio si desidera un percorso da fare a piedi. $$ROUTER-OPTIONS-HELP$$ $$ROUTER-RESULTS-HELP$$ <B> Avvio rapido </ b> <br> Dopo aver calcolato un percorso è possibile scaricare il file GPX o la descrizione del percorso in formato testo (riassuntivo o versione dettagliata). Inoltre si può visualizzare la descrizione del percorso e ingrandire le parti selezionate. <P> <B> Risoluzione dei problemi </ b> <br> Se il calcolo termina con un errore, la causa più probabile è che non sia possibile trovare un percorso tra i punti selezionati. Spostare uno o più marcatori o cambiare le opzioni di routing dovrebbe consente di risolvere il problema. <P> <B> Formati generati </ b> <br> <Dl> <Dt> istruzioni HTML <Dd> Una descrizione del percorso con indicazioni per ciascun punto importante. <Dt> file di traccia GPX <Dd> Le stesse informazioni visualizzate sulla mappa con i punti per ogni nodo e linee per ogni segmento. <Dt> file di percorso GPX <Dd> Le stesse informazioni visualizzate nel testo per ogni punto importante sul percorso. <Dt> File di testo completo <Dd> Un elenco di tutti i nodi visitati con la distanza tra loro e la distanza cumulativa per ogni passo del percorso. <Dt> File di testo <Dd> Le stesse informazioni sul percorso visualizzate nel testo. </ Dl> $$ROUTER-RESULTS-HELP$$ $$ROUTER-VISUALISER-INFO$$ Per visualizzare i dati di Routino esiste un visualizzatore che consente di mostrarli in vari modi. $$ROUTER-VISUALISER-INFO$$ # # Multi-line descriptive translations (visualiser) # $$VISUALISER-INFO$$ Questa pagina web consente la visualizzazione dei dati utilizzati da Routino per il calcolo del percorso. Vengono visualizzati solo i dati relativi al percorso e pertanto alcuni potranno essere esclusi. $$VISUALISER-INFO$$ $$VISUALISER-INSTRUCTIONS$$ Ingrandisci e usa il pulsante sotto per scaricare i dati. Il server fornirà i dati se l'area selezionata non è troppo grande. $$VISUALISER-INSTRUCTIONS$$ $$VISUALISER-HELP$$ <b>Quick Start</b> <br> Ingrandisci un'area e seleziona uno dei pulsanti per mostrare il tipo di dati. <br> Più opzioni per i dati si possono ottenere espandendo i dettagli sotto ogni pulsante. <p> <b>Dati non validi</b> <br> Se l'area selezionata è troppo grande (dipende dal tipo dei dati) l'indicazione dello stato sarà: "Impossibile visualizzare i dati." - ingrandisci e riprova. $$VISUALISER-HELP$$ $$VISUALISER-ROUTER-INFO$$ Per eseguire il percorso sulla mappa usa il collegamento sottostante. $$VISUALISER-ROUTER-INFO$$ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/web/translations/translation.hu.txt��������������������������������������������������� 644 � 233 � 144 � 40440 13236635625 15435� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Hungarian language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Alkotó %%copyright_source_string%% Forrás %%copyright_source_text%% Openstreetmap adatok alapján http://www.openstreetmap.org/ %%copyright_license_string%% Licenc %%turn_-4%% Nagyon élesen balra %%turn_-3%% Élesen balra %%turn_-2%% Balra %%turn_-1%% Enyhén balra %%turn_0%% Egyenesen %%turn_1%% Enyhén jobbra %%turn_2%% Jobbra %%turn_3%% Élesen jobbra %%turn_4%% Nagyon élesen jobbra %%heading_-4%% Dél %%heading_-3%% Délnyugat %%heading_-2%% Nyugat %%heading_-1%% Északnyugat %%heading_0%% Észak %%heading_1%% Északkelet %%heading_2%% Kelet %%heading_3%% Délkelet %%heading_4%% Dél %%ordinal_1%% elsÅ‘ %%ordinal_2%% második %%ordinal_3%% harmadik %%ordinal_4%% negyedik %%ordinal_5%% ötödik %%ordinal_6%% hatodik %%ordinal_7%% hetedik %%ordinal_8%% nyolcadik %%ordinal_9%% kilencedik %%ordinal_10%% tizedik %%highway_motorway%% autópálya %%highway_trunk%% autóút %%highway_primary%% főút %%highway_secondary%% összekötőút %%highway_tertiary%% bekötőút %%highway_unclassified%% egyéb közút %%highway_residential%% lakóút %%highway_service%% szervizút %%highway_track%% földút %%highway_cycleway%% kerékpárút %%highway_path%% ösvény %%highway_steps%% lépcsÅ‘ %%highway_ferry%% komp %%route_shortest%% Legrövidebb %%route_quickest%% Leggyorsabb %%output-html_waypoint_waypoint%% Útpont %%output-html_waypoint_junction%% KeresztezÅ‘dés %%output-html_waypoint_roundabout%% Körforgalom %%output-html_title%% %s útvonal %%output-html_start%% %s, indulás %s felé %%output-html_node%% %s, menj %s, %s felé %%output-html_rbnode%% %s, hagyd el %s kijáraton %s felé %%output-html_segment%% Haladj ezen: %s, %.3f km-t, %.1f percig %%output-html_stop%% Ãllj meg itt: %s %%output-html_total%% Összesen %.1f km, %.0f perc %%output-html_subtotal%% %.1f km, %.0f perc %%output-gpx_waypoint_waypt%% ÚTPONT %%output-gpx_waypoint_trip%% ÚT %%output-gpx_desc%% A kiindulási és a célpont közötti %s útvonal %%output-gpx_name%% %s útvonal %%output-gpx_step%% %s felé itt: %s, %.3f km, %.1f min %%output-gpx_final%% Az egész út %.1f km, %.0f perc # # Router (and some shared) translations # @@LANGUAGE@@ Magyar @@LANGUAGE-WEBPAGE@@ Magyar weboldal @@ROUTER-TITLE@@ OpenStreetMap-alapú útvonaltervezÅ‘ @@OPTION-TAB@@ Beállítások @@OPTION-TAB-HELP@@ ÚtvonaltervezÅ‘-beállítások @@RESULTS-TAB@@ Eredmény @@RESULTS-TAB-HELP@@ Az útvonaltervezés eredményei @@DATA-TAB@@ Adatok @@DATA-TAB-HELP@@ Adatbázis-információk megtekintése @@ROUTINO-ROUTER@@ Routino OpenStreetMap-útvonaltervezÅ‘ @@ROUTINO-WEBSITE@@ Routino weboldal @@DOCUMENTATION@@ Dokumentáció @@LANGUAGE-BOX@@ Nyelv @@WAYPOINTS-BOX@@ Útpontok @@TRANSPORT-TYPE-BOX@@ Közlekedési mód @@HIGHWAY-PREFERENCES-BOX@@ Útvonal-beállítások @@SPEED-LIMITS-BOX@@ Sebességkorlátozás @@PROPERTY-PREFERENCES-BOX@@ Útjelleg-beállítások @@OTHER-RESTRICTIONS-BOX@@ További korlátozások @@FIND-BOX@@ Keresés @@LINKS-BOX@@ Linkek @@HELP-BOX@@ Súgó @@STATUS-BOX@@ Ãllapot @@SHORTEST-ROUTE@@ Legrövidebb út @@QUICKEST-ROUTE@@ Leggyorsabb út @@STATISTICS-BOX@@ Routino statisztika @@VISUALISER-BOX@@ Routino megjelenítÅ‘ @@WAYPOINT-POSITION@@ XXX útpont pozíciója @@WAYPOINT-LONGITUDE@@ XXX útpont: szélesség @@WAYPOINT-LATITUDE@@ XXX útpont: hosszúság @@WAYPOINT-LOCATION@@ XXX útpont helye @@WAYPOINT-SEARCH@@ Hely keresése @@WAYPOINT-GET@@ Jelenlegi helyzet megjelenítése @@WAYPOINT-CENTRE1@@ Legyen ez az útpont a térkép közepe @@WAYPOINT-UP@@ Útpont feljebb mozgatása @@WAYPOINT-ADD@@ Útpont hozzáadása ezen útpont után @@WAYPOINT-COORDS@@ Hely koordinátái @@WAYPOINT-HOME@@ Beállítás otthonnak @@WAYPOINT-CENTRE2@@ A térkép mostani közepe legyen az útpont @@WAYPOINT-DOWN@@ Útpont lejjebb mozgatása @@WAYPOINT-REMOVE@@ Útpont eltávolítása @@WAYPOINT-REVERSE@@ Útpontok sorrendjének megfordítása @@WAYPOINT-REVERSE-BUTTON@@ Sorrend megfordítása @@WAYPOINT-LOOP@@ Új utolsó útpont hozzáadása a kezdÅ‘pontban (körútvonal) @@WAYPOINT-LOOP-BUTTON@@ Kör bezárása @@TRANSPORT-FOOT@@ Gyalogos @@TRANSPORT-HORSE@@ Ló @@TRANSPORT-WHEELCHAIR@@ Kerekesszék @@TRANSPORT-BICYCLE@@ Kerékpár @@TRANSPORT-MOPED@@ Robogó @@TRANSPORT-MOTORCYCLE@@ Motor @@TRANSPORT-MOTORCAR@@ Autó @@TRANSPORT-GOODS@@ Kisteherautó @@TRANSPORT-HGV@@ Nehéz tehergépkocsi @@TRANSPORT-PSV@@ Busz @@HIGHWAY-MOTORWAY@@ Autópálya @@HIGHWAY-TRUNK@@ Autóút @@HIGHWAY-PRIMARY@@ Főút @@HIGHWAY-SECONDARY@@ Összekötőút @@HIGHWAY-TERTIARY@@ Bekötőút @@HIGHWAY-UNCLASSIFIED@@ Egyéb közút @@HIGHWAY-RESIDENTIAL@@ Lakóút @@HIGHWAY-SERVICE@@ Szervizút @@HIGHWAY-TRACK@@ Földút @@HIGHWAY-CYCLEWAY@@ Kerékpárút @@HIGHWAY-PATH@@ Ösvény @@HIGHWAY-STEPS@@ LépcsÅ‘ @@HIGHWAY-FERRY@@ Komp @@PROPERTY-PAVED@@ Burkolt @@PROPERTY-MULTILANE@@ Többsávos @@PROPERTY-BRIDGE@@ Híd @@PROPERTY-TUNNEL@@ Alagút @@PROPERTY-WALKINGROUTE@@ Gyalogút @@PROPERTY-BICYCLEROUTE@@ Kerékpárút @@RESTRICT-ONEWAY@@ Egyirányú utcák tiszteletben tartása @@RESTRICT-TURNS@@ Bekanyarodási tilalmak tiszteletben tartása @@RESTRICT-WEIGHT@@ Tömeg @@RESTRICT-HEIGHT@@ Magasság @@RESTRICT-WIDTH@@ Szélesség @@RESTRICT-LENGTH@@ Hosszúság @@FIND-SHORTEST-ROUTE@@ A legrövidebb út megkeresése @@FIND-QUICKEST-ROUTE@@ A leggyorsabb út megkeresése @@MAP-VIEW-LINK@@ Link ehhez a térképnézethez @@EDIT-OSM-DATA@@ Ezen OSM-adatok szerkesztése @@ROUTER-NOT-RUN@@ Az útvonaltervezÅ‘ nem működik @@ROUTER-RUNNING@@ Az útvonaltervezÅ‘ számol… @@ROUTER-COMPLETED@@ Az útvonaltervezés kész @@ROUTER-ERROR@@ Útvonaltervezési hiba @@ROUTER-FAILED@@ Az útvonaltervezÅ‘t nem sikerült lefuttatni @@VIEW-DETAILS@@ Részletek megtekintése @@NO-INFORMATION@@ Nincs információ @@HTML-ROUTE@@ HTML-irányok @@GPX-TRACK-ROUTE@@ GPX-nyomvonalfájl @@GPX-ROUTE@@ GPX útvonalfájl @@FULL-TEXT-ROUTE@@ Teljes szöveges fájl @@TEXT-ROUTE@@ Szöveges fájl @@OPEN-POPUP@@ Megnyitás új ablakban @@DISPLAY-STATISTICS@@ Adatstatisztika megjelenítése @@JAVASCRIPT-REQUIRED@@ Az interaktív térkép miatt Javascript <em>szükséges</em> a weboldal használatához @@ROUTER@@ ÚtvonaltervezÅ‘ @@GEO-DATA@@ Geo Data @@TILES@@ Mozaikok # # Visualiser specific translations # @@VISUALISER-TITLE@@ Az útvonal-tervezési adatok megjelenítÅ‘je @@INSTRUCTIONS-BOX@@ Használati utasítás @@ROUTER-BOX@@ Routino útvonaltervezÅ‘ @@NO-DATA-DISPLAYED@@ Nincs megjelenített adat @@VISUALISER-FAILED@@ A megjelenítÅ‘ adatait nem sikerült betölteni @@VISUALISER-NUM-JUNCTIONS@@ # keresztezÅ‘dés feldolgozva @@VISUALISER-NUM-SUPER@@ # fÅ‘pont/fÅ‘szakasz feldolgozva @@VISUALISER-NUM-WAYTYPE@@ # úttípusszakasz feldolgozva @@VISUALISER-NUM-SEGMENTS@@ # szakasz feldolgozva @@VISUALISER-NUM-NODES@@ # pont feldolgozva @@VISUALISER-NUM-TURNS@@ # bekanyarodási korlátozás feldolgozva @@VISUALISER-NUM-LIMITS@@ # sebességkorlátozás-változás feldolgozva @@VISUALISER-NUM-ERRORS@@ # hibanapló feldolgozva @@JUNCTIONS-BUTTON@@ KeresztezÅ‘dések megjelenítése $$JUNCTIONS-INFO$$ Színkóddal jelenik meg minden zsákutca végét jelentÅ‘ pont, a két különbözÅ‘ típusú (vagy különbözÅ‘ tulajdonságú) utat összekapcsoló keresztezÅ‘dés, valamint az a keresztezÅ‘dés, amelyben legalább három szakasz kapcsolódik össze. $$JUNCTIONS-INFO$$ @@JUNCTIONS-1@@ csak egy út – zsákutca. @@JUNCTIONS-2@@ két különbözÅ‘ típusú út találkozása. @@JUNCTIONS-3@@ három út találkozása. @@JUNCTIONS-4@@ négy út találkozása. @@JUNCTIONS-5@@ öt út találkozása. @@JUNCTIONS-6@@ hat út találkozása. @@JUNCTIONS-MORE@@ legalább hét út találkozása. @@SUPER-BUTTON@@ FÅ‘szakaszok megjelenítése $$SUPER-INFO$$ Minden fÅ‘pont és hozzá kapcsolódó fÅ‘szakasz látható (a leírást lásd az algoritmust bemutató oldalon). $$SUPER-INFO$$ @@WAYTYPE-BUTTON@@ Úttípusszakaszok megjelenítése $$WAYTYPE-INFO$$ Minden különleges (egyirányú, kerékpárral mindkét irányba járható és körforgalmi) útszakasz látható. Az egyirányú szakaszoknál színes háromszög mutatja a megengedett irányt. A háromszögek színe az útszakasz irányától függ. $$WAYTYPE-INFO$$ @@WAYTYPE-ONEWAY@@ Egyirányú szakaszok @@WAYTYPE-CYCLE-BOTH-WAYS@@ Kerékpárral mindkét irányba járható szakaszok @@WAYTYPE-ROUNDABOUT@@ Körforgalmi szakaszok @@HIGHWAY-BUTTON@@ Útszakaszok megjelenítése $$HIGHWAY-INFO$$ A kiválasztott úttípushoz tartozó összes szakasz látható. $$HIGHWAY-INFO$$ @@TRANSPORT-BUTTON@@ Közlekedésimód-szakaszok megjelenítése $$TRANSPORT-INFO$$ A kiválasztott közlekedési móddal járható összes szakasz látható. $$TRANSPORT-INFO$$ @@BARRIER-BUTTON@@ Akadálypontok megjelenítése $$BARRIER-INFO$$ A kiválasztott közlekedési módot elzáró összes akadály látható. $$BARRIER-INFO$$ @@TURNS-BUTTON@@ Bekanyarodási korlátozások megjelenítése $$TURNS-INFO$$ Minden bekanyarodási korlátozás megjelenik egy vonal formájában, amely a tiltott bekanyarodást jelzi. $$TURNS-INFO$$ @@SPEED-BUTTON@@ Sebességkorlátozások megjelenítése $$SPEED-INFO$$ Megjelennek a különbözÅ‘ sebességkorlátozásokat összekapcsoló pontok és az adott szakaszokra vonatkozó sebességkorlátozás. $$SPEED-INFO$$ @@LIMIT-CHANGE@@ Korlátozás változása @@LIMIT-NONE@@ Nincs meghatározott korlátozás @@SPEED-LIMIT-80@@ 80 km/h sebességkorlátozás @@WEIGHT-BUTTON@@ Súlykorlátozások megjelenítése $$WEIGHT-INFO$$ Megjelennek a különbözÅ‘ súlykorlátozásokat összekapcsoló pontok és az adott szakaszokra vonatkozó súlykorlátozás. $$WEIGHT-INFO$$ @@WEIGHT-LIMIT-8@@ 8 t súlykorlátozás @@HEIGHT-BUTTON@@ Magasságkorlátozások megjelenítése $$HEIGHT-INFO$$ Megjelennek a különbözÅ‘ magasságkorlátozásokat összekapcsoló pontok és az adott szakaszokra vonatkozó magasságkorlátozás. $$HEIGHT-INFO$$ @@HEIGHT-LIMIT-4@@ 4 m magasságkorlátozás @@WIDTH-BUTTON@@ Szélességkorlátozások megjelenítése $$WIDTH-INFO$$ Megjelennek a különbözÅ‘ szélességkorlátozásokat összekapcsoló pontok és az adott szakaszokra vonatkozó szélességkorlátozás. $$WIDTH-INFO$$ @@WIDTH-LIMIT-3@@ 3 m szélességkorlátozás @@LENGTH-BUTTON@@ Hosszúságkorlátozások megjelenítése $$LENGTH-INFO$$ Megjelennek a különbözÅ‘ hosszúságkorlátozásokat összekapcsoló pontok és az adott szakaszokra vonatkozó hosszúság korlátozás. $$LENGTH-INFO$$ @@LENGTH-LIMIT-9@@ 9 m hosszúságkorlátozás @@PROPERTY-BUTTON@@ Úttulajdonságok megjelenítése $$PROPERTY-INFO$$ Megjelennek az utak különleges tulajdonságú szakaszai. $$PROPERTY-INFO$$ @@ERROR-LOG-BUTTON@@ Hibanaplók megjelenítése $$ERROR-LOG-INFO$$ Lehetséges hibák fordultak elÅ‘ az adatok feldolgozása során $$ERROR-LOG-INFO$$ @@CLEAR-DATA-BUTTON@@ Adatok törlése # # Multi-line descriptive translations (router) # $$ROUTER-INFO$$ Ezzel a honlappal útvonalakat lehet tervezni az OpenStreetMaprÅ‘l gyűjtott adatok segítségével. Válaszd ki a kiindulási és a célpontot (kattints az alábbi jelzÅ‘kre), jelöld ki az útvonaltervezési beállításokat, és találd meg az utat. $$ROUTER-INFO$$ $$ROUTER-OPTIONS-HELP$$ <b>Rövid útmutató</b> <br> Kattintsunk a jelzÅ‘ikonokra (fent) és helyezzük el Å‘ket a térképen (jobbra), majd húzzuk Å‘ket a megfelelÅ‘ helyre. Valószínűleg az a legegyszerűbb, ha elÅ‘ször ránagyítunk a térkép megfelelÅ‘ részére, és ez után helyezzük el a jelzÅ‘ket. Másik lehetÅ‘ségként beírhatjuk a fenti mezÅ‘kbe a megfelelÅ‘ szélességi és hosszúsági adatokat. <p> A fenti beállításoknál jelöljük ki a közlekedés módját, a megengedett úttípusokat, sebességkorlátozásokat, úttulajdonságokat és más korlátozásokat. Az út kiszámításához és térképen való megjelenítéséhez jelöljük ki a „Legrövidebb†vagy a „Leggyorsabb†lehetÅ‘séget. <p> <b>Útpontok</b> <br> A jelzÅ‘ikonra történÅ‘ kattintás elrejti/megjeleníti az ikont a térképen. Az út úgy számíttatik ki, hogy (a kijelölt közlekedési mód szerint a lehetÅ‘ legközelebb) érintse a megadott sorrendben az összes útpontot, amelyek jelzÅ‘ikonja látható a térképen. <p> <b>Közlekedési mód</b> <br> A közlekedési mód kijelölése a kiválasztott útvonalat azokra korlátozza, amelyek így lehetséges közlekedni, a többi paraméter értékét pedig az alapértelmezettre állítja. <p> <b>Úttulajdonságok</b> <br> Az úttulajdonságokat százalékként lehet kijelölni, a kiválasztott útvonalak pedig igyekeznek az elÅ‘nyben részesített úttípusokat követni. Ha például a „Főút†110%-os értéket kap, az „ÖsszekötÅ‘ út†pedig 100%-ot, az azt jelenti, hogy még akkor is főúton vezetÅ‘ útvonal fog megjelenni, ha az akár 10%-kal is hosszabb, mint az összekötÅ‘ utakon vezetÅ‘. <p> <b>Sebességkorlátozások</b> <br> A különbözÅ‘ úttípusokhoz itt kiválasztott sebességkorlátozások akkor érvényesek, ha az úton nincs más sebességkorlátozás-jelzés vagy az magasabb, mint a kiválasztott. <p> <b>Útjelleg-beállítások</b> <br> Az útjelleg-beállítást százalékként lehet kijelölni, és az útvonal oly módon terveztetik meg, hogy lehetÅ‘leg a kívánt tulajdonságú utakon vezessen. Ha például a „burkolt†út 75%-ot kap, akkor a „burkolatlan†automatikusan 25%-ot. Ez azt jelenti, hogy még akkor is a burkolt úton vezetÅ‘ útvonal fog megjelenni, ha az akár 3× hosszabb, mint a burkolatlan úton vezetÅ‘. <p> <b>Más korlátozások</b> <br> Ezekkel olyan utak is megtalálhatók, amelyek elkerülik a jelzett súly-, magasság-, szélesség- és hosszúságkorlátozásokat. Az egyirányú utcák is figyelmen kívül hagyhatók (pl. gyaloglásnál). $$ROUTER-OPTIONS-HELP$$ $$ROUTER-RESULTS-HELP$$ <b>Rövid útmutató</b> <br> Az útvonal kiszámítását követÅ‘en letölthetjük a GPX-fájlt vagy az út (összefoglaló vagy részletes) leírását egyszerű szöveges (txt) fájlban. Az út leírását meg is nézhetjük, és ránagyíthatunk a kijelölt részekre. <p> <b>Problémamegoldás</b> <br> Ha az útvonaltervezÅ‘ hibajelzéssel fejezi be a számítást, annak legvalószínűbb oka az, hogy a kijelölt pontok között lehetetlen utat találni. Valamelyik (vagy mindkét) jelzÅ‘ elmozdításával vagy az útvonal-tervezési beállítások módosításával minden bizonnyal sikerül utat találni. <p> <b>Kimeneti formátumok</b> <br> <dl> <dt>HTML utasítások <dd>Az út leírása a megfelelÅ‘ irányokkal minden fontosabb csomópontban. <dt>GPX-nyomvonalfájl <dd>A térképen láthatóval megegyezÅ‘ információ; minden pont és szakasz. <dt>GPX-útvonalfájl <dd>Az út szöveges leírásában szereplÅ‘ információ egy útponttal az útvonal minden fontos csomópontjánál. <dt>Teljes szöveges fájl <dd>Minden érintett pont felsorolása a köztük lévÅ‘ távolsággal, és az út össze fontos lépésének halmozott távolsága. <dt>Szövegfájl <dd>Az útvonal esetében megjelentÅ‘ szövegben megtalálható információ. </dl> $$ROUTER-RESULTS-HELP$$ $$ROUTER-VISUALISER-INFO$$ Hogy megnézhessük, a Routino hogyan látja az adatokat, létezik egy adatmegjelenítÅ‘, amellyel különféle módokon jeleníthetÅ‘k meg a számítás alapját jelentÅ‘ adatok. $$ROUTER-VISUALISER-INFO$$ # # Multi-line descriptive translations (visualiser) # $$VISUALISER-INFO$$ Ezen a weboldalon vizuálisan is megjeleníthetÅ‘k azok az adatok, amelyeket a Routino használ az útvonaltervezéshez. Csak az út szempontjából fontos adatok jelennek meg, így az adatok egy része ki van zárva. $$VISUALISER-INFO$$ $$VISUALISER-INSTRUCTIONS$$ Nagyíts, majd használd az alábbi gombokat az adatok letöltéséhez. A kiszolgáló csak akkor küld adatokat, ha a kijelölt terület elég kicsi. $$VISUALISER-INSTRUCTIONS$$ $$VISUALISER-HELP$$ <b>Rövid útmutató</b> <br> Az adatok típusának megjelenítéséhez nagyíts egy területre, és jelöld ki az egyik gombot. <br> További adatbeállításokat találhatunk, ha kinyitjuk az egyes gombok alatti részleteket. <p> <b>Adatkudarc</b> <br> Ha a kijelölt terület túl nagy (adattípusfüggÅ‘), akkor a státusz azt fogja kiírni, hogy „A megjelenítÅ‘ adatait nem sikerült betölteniâ€. Ilyenkor nagyítsunk rá jobban a területre, és próbáljuk meg újra. $$VISUALISER-HELP$$ $$VISUALISER-ROUTER-INFO$$ A térképen való útvonaltervezés végrehajtásához használd az alábbi linket. $$VISUALISER-ROUTER-INFO$$ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/web/translations/translation.en.txt��������������������������������������������������� 644 � 233 � 144 � 34145 13236635625 15430� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # English language translation phrases # # # Router output XML definition # %%copyright_creator_string%% Creator %%copyright_source_string%% Source %%copyright_source_text%% Based on OpenStreetMap data from http://www.openstreetmap.org/ %%copyright_license_string%% License %%turn_-4%% Very sharp left %%turn_-3%% Sharp left %%turn_-2%% Left %%turn_-1%% Slight left %%turn_0%% Straight on %%turn_1%% Slight right %%turn_2%% Right %%turn_3%% Sharp right %%turn_4%% Very sharp right %%heading_-4%% South %%heading_-3%% South-West %%heading_-2%% West %%heading_-1%% North-West %%heading_0%% North %%heading_1%% North-East %%heading_2%% East %%heading_3%% South-East %%heading_4%% South %%ordinal_1%% First %%ordinal_2%% Second %%ordinal_3%% Third %%ordinal_4%% Fourth %%ordinal_5%% Fifth %%ordinal_6%% Sixth %%ordinal_7%% Seventh %%ordinal_8%% Eighth %%ordinal_9%% Ninth %%ordinal_10%% Tenth %%highway_motorway%% motorway %%highway_trunk%% trunk road %%highway_primary%% primary road %%highway_secondary%% secondary road %%highway_tertiary%% tertiary road %%highway_unclassified%% unclassified road %%highway_residential%% residential road %%highway_service%% service road %%highway_track%% track %%highway_cycleway%% cycleway %%highway_path%% path %%highway_steps%% steps %%highway_ferry%% ferry %%route_shortest%% Shortest %%route_quickest%% Quickest %%output-html_waypoint_waypoint%% Waypoint %%output-html_waypoint_junction%% Junction %%output-html_waypoint_roundabout%% Roundabout %%output-html_title%% %s Route %%output-html_start%% Start at %s, head %s %%output-html_node%% At %s, go %s heading %s %%output-html_rbnode%% Leave %s, take the %s exit heading %s %%output-html_segment%% Follow %s for %.3f km, %.1f min %%output-html_stop%% Stop at %s %%output-html_total%% Total %.1f km, %.0f minutes %%output-html_subtotal%% %.1f km, %.0f minutes %%output-gpx_waypoint_waypt%% WAYPT %%output-gpx_waypoint_trip%% TRIP %%output-gpx_desc%% %s route between 'start' and 'finish' waypoints %%output-gpx_name%% %s route %%output-gpx_step%% %s on '%s' for %.3f km, %.1f min %%output-gpx_final%% Total Journey %.1f km, %.0f minutes # # Router (and some shared) translations # @@LANGUAGE@@ English @@LANGUAGE-WEBPAGE@@ English language webpage @@ROUTER-TITLE@@ Route Planner for OpenStreetMap Data @@OPTION-TAB@@ Options @@OPTION-TAB-HELP@@ Set routing options @@RESULTS-TAB@@ Results @@RESULTS-TAB-HELP@@ See routing results @@DATA-TAB@@ Data @@DATA-TAB-HELP@@ View database information @@ROUTINO-ROUTER@@ Routino OpenStreetMap Router @@ROUTINO-WEBSITE@@ Routino Website @@DOCUMENTATION@@ Documentation @@LANGUAGE-BOX@@ Language @@WAYPOINTS-BOX@@ Waypoints @@TRANSPORT-TYPE-BOX@@ Transport Type @@HIGHWAY-PREFERENCES-BOX@@ Highway Preferences @@SPEED-LIMITS-BOX@@ Speed Limits @@PROPERTY-PREFERENCES-BOX@@ Property Preferences @@OTHER-RESTRICTIONS-BOX@@ Other Restrictions @@FIND-BOX@@ Find @@LINKS-BOX@@ Links @@HELP-BOX@@ Help @@STATUS-BOX@@ Status @@SHORTEST-ROUTE@@ Shortest Route @@QUICKEST-ROUTE@@ Quickest Route @@STATISTICS-BOX@@ Routino Statistics @@VISUALISER-BOX@@ Routino Visualiser @@WAYPOINT-POSITION@@ Waypoint XXX Position @@WAYPOINT-LONGITUDE@@ Waypoint XXX Longitude @@WAYPOINT-LATITUDE@@ Waypoint XXX Latitude @@WAYPOINT-LOCATION@@ Waypoint XXX Location @@WAYPOINT-SEARCH@@ Search for location @@WAYPOINT-GET@@ Get current location @@WAYPOINT-CENTRE1@@ Centre map on this waypoint @@WAYPOINT-UP@@ Move this waypoint up @@WAYPOINT-ADD@@ Add waypoint after this one @@WAYPOINT-COORDS@@ Coordinates for location @@WAYPOINT-HOME@@ Toggle as home location @@WAYPOINT-CENTRE2@@ Centre this waypoint on map @@WAYPOINT-DOWN@@ Move this waypoint down @@WAYPOINT-REMOVE@@ Remove this waypoint @@WAYPOINT-REVERSE@@ Reverse order of waypoints @@WAYPOINT-REVERSE-BUTTON@@ Reverse order @@WAYPOINT-LOOP@@ Add a new waypoint to make a loop @@WAYPOINT-LOOP-BUTTON@@ Close loop @@TRANSPORT-FOOT@@ Foot @@TRANSPORT-HORSE@@ Horse @@TRANSPORT-WHEELCHAIR@@ Wheelchair @@TRANSPORT-BICYCLE@@ Bicycle @@TRANSPORT-MOPED@@ Moped @@TRANSPORT-MOTORCYCLE@@ Motorcycle @@TRANSPORT-MOTORCAR@@ Motorcar @@TRANSPORT-GOODS@@ Goods @@TRANSPORT-HGV@@ HGV @@TRANSPORT-PSV@@ PSV @@HIGHWAY-MOTORWAY@@ Motorway @@HIGHWAY-TRUNK@@ Trunk @@HIGHWAY-PRIMARY@@ Primary @@HIGHWAY-SECONDARY@@ Secondary @@HIGHWAY-TERTIARY@@ Tertiary @@HIGHWAY-UNCLASSIFIED@@ Unclassified @@HIGHWAY-RESIDENTIAL@@ Residential @@HIGHWAY-SERVICE@@ Service @@HIGHWAY-TRACK@@ Track @@HIGHWAY-CYCLEWAY@@ Cycleway @@HIGHWAY-PATH@@ Path @@HIGHWAY-STEPS@@ Steps @@HIGHWAY-FERRY@@ Ferry @@PROPERTY-PAVED@@ Paved @@PROPERTY-MULTILANE@@ Multiple Lanes @@PROPERTY-BRIDGE@@ Bridge @@PROPERTY-TUNNEL@@ Tunnel @@PROPERTY-WALKINGROUTE@@ Walking Route @@PROPERTY-BICYCLEROUTE@@ Bicycle Route @@RESTRICT-ONEWAY@@ Obey oneway streets @@RESTRICT-TURNS@@ Obey turn restrictions @@RESTRICT-WEIGHT@@ Weight @@RESTRICT-HEIGHT@@ Height @@RESTRICT-WIDTH@@ Width @@RESTRICT-LENGTH@@ Length @@FIND-SHORTEST-ROUTE@@ Find shortest route @@FIND-QUICKEST-ROUTE@@ Find quickest route @@MAP-VIEW-LINK@@ Link to this map view @@EDIT-OSM-DATA@@ Edit this OSM data @@ROUTER-NOT-RUN@@ Router not run @@ROUTER-RUNNING@@ Router running... @@ROUTER-COMPLETED@@ Routing completed @@ROUTER-ERROR@@ Router error @@ROUTER-FAILED@@ Router failed to run @@VIEW-DETAILS@@ View Details @@NO-INFORMATION@@ No Information @@HTML-ROUTE@@ HTML directions @@GPX-TRACK-ROUTE@@ GPX track file @@GPX-ROUTE@@ GPX route file @@FULL-TEXT-ROUTE@@ Full text file @@TEXT-ROUTE@@ Text file @@OPEN-POPUP@@ Open Popup @@DISPLAY-STATISTICS@@ Display data statistics @@JAVASCRIPT-REQUIRED@@ Javascript is <em>required</em> to use this web page because of the interactive map. @@ROUTER@@ Router @@GEO-DATA@@ Geo Data @@TILES@@ Tiles # # Visualiser specific translations # @@VISUALISER-TITLE@@ Data Visualiser for Routing Data @@INSTRUCTIONS-BOX@@ Instructions @@ROUTER-BOX@@ Routino Router @@NO-DATA-DISPLAYED@@ No data displayed @@VISUALISER-FAILED@@ Failed to get visualiser data! @@VISUALISER-NUM-JUNCTIONS@@ Processed # junctions @@VISUALISER-NUM-SUPER@@ Processed # super-nodes/segments @@VISUALISER-NUM-WAYTYPE@@ Processed # way type segments @@VISUALISER-NUM-SEGMENTS@@ Processed # segments @@VISUALISER-NUM-NODES@@ Processed # nodes @@VISUALISER-NUM-TURNS@@ Processed # turn restrictions @@VISUALISER-NUM-LIMITS@@ Processed # limit changes @@VISUALISER-NUM-ERRORS@@ Processed # error logs @@JUNCTIONS-BUTTON@@ Display Junctions $$JUNCTIONS-INFO$$ Each node that is a dead-end, a junction of two highways of different types (or different properties) or a junction where more than two segments join are shown colour-coded. $$JUNCTIONS-INFO$$ @@JUNCTIONS-1@@ only one highway - a dead-end. @@JUNCTIONS-2@@ two highways of different types meet. @@JUNCTIONS-3@@ three highways meet. @@JUNCTIONS-4@@ four highways meet. @@JUNCTIONS-5@@ five highways meet. @@JUNCTIONS-6@@ six highways meet. @@JUNCTIONS-MORE@@ seven (or more) highways meet. @@SUPER-BUTTON@@ Display Super Segments $$SUPER-INFO$$ Each super-node and the associated super-segments are shown (see algorithm page for description). $$SUPER-INFO$$ @@WAYTYPE-BUTTON@@ Display Way Type Segments $$WAYTYPE-INFO$$ Each highway segment of special types (one-way, cycle-both-ways and roundabout) are shown. For one-way segments a coloured triangle indicates the allowed direction. The colours of the triangles depend on the bearing of the highway segment. $$WAYTYPE-INFO$$ @@WAYTYPE-ONEWAY@@ One-way segments @@WAYTYPE-CYCLE-BOTH-WAYS@@ Cycle-both-way segments @@WAYTYPE-ROUNDABOUT@@ Roundabout segments @@HIGHWAY-BUTTON@@ Display Highway Segments $$HIGHWAY-INFO$$ Each segment of the chosen type of highway is drawn. $$HIGHWAY-INFO$$ @@TRANSPORT-BUTTON@@ Display Transport Segments $$TRANSPORT-INFO$$ Each segment allowed for the chosen type of transport is drawn. $$TRANSPORT-INFO$$ @@BARRIER-BUTTON@@ Display Barrier Nodes $$BARRIER-INFO$$ Each barrier blocking the chosen type of transport is drawn. $$BARRIER-INFO$$ @@TURNS-BUTTON@@ Display Turn Restrictions $$TURNS-INFO$$ Each turn restrictions is shown with a line indicating the disallowed turn. $$TURNS-INFO$$ @@SPEED-BUTTON@@ Display Speed Limits $$SPEED-INFO$$ Each node that joins segments with different speed limits is shown along with the speed limit on relevant segments. $$SPEED-INFO$$ @@LIMIT-CHANGE@@ Change of limit @@LIMIT-NONE@@ No specified limit @@SPEED-LIMIT-80@@ 80 km/hour speed limit @@WEIGHT-BUTTON@@ Display Weight Limits $$WEIGHT-INFO$$ Each node that joins segments with different weight limits is shown along with the weight limit on relevant segments. $$WEIGHT-INFO$$ @@WEIGHT-LIMIT-8@@ 8.0 tonnes weight limit @@HEIGHT-BUTTON@@ Display Height Limits $$HEIGHT-INFO$$ Each node that joins segments with different height limits is shown along with the height limit on relevant segments. $$HEIGHT-INFO$$ @@HEIGHT-LIMIT-4@@ 4.0 m height limit @@WIDTH-BUTTON@@ Display Width Limits $$WIDTH-INFO$$ Each node that joins segments with different width limits is shown along with the width limit on relevant segments. $$WIDTH-INFO$$ @@WIDTH-LIMIT-3@@ 3.0 m width limit @@LENGTH-BUTTON@@ Display Length Limits $$LENGTH-INFO$$ Each node that joins segments with different length limits is shown along with the length limit on relevant segments. $$LENGTH-INFO$$ @@LENGTH-LIMIT-9@@ 9.0 m length limit @@PROPERTY-BUTTON@@ Display Highway Properties $$PROPERTY-INFO$$ Each segment of the highways with a particular property is drawn. $$PROPERTY-INFO$$ @@ERROR-LOG-BUTTON@@ Display Error Logs $$ERROR-LOG-INFO$$ Potential problems found by Routino when processing the input data. $$ERROR-LOG-INFO$$ @@CLEAR-DATA-BUTTON@@ Clear data # # Multi-line descriptive translations (router) # $$ROUTER-INFO$$ This web page allows routing within the data collected by OpenStreetMap. Select start and end points (click on the marker icons below), select routing preferences then find a route. $$ROUTER-INFO$$ $$ROUTER-OPTIONS-HELP$$ <b>Quick Start</b> <br> Click on marker icons (above) to place them on the map (right). Then drag them to the correct position. Zooming the map before placing the markers is probably easiest. Alternatively type the latitude and longitude into the boxes above. <p> Select the transport type, allowed highway types, speed limits, highway properties and other restrictions from the options above. Select "Shortest" or "Quickest" to calculate the route and display it on the map. <p> <b>Waypoints</b> <br> Clicking on the marker icons will toggle the display of them on the map. When a route is calculated it will visit (as close as possible for the selected transport type) each of the waypoints that have markers on the map in the order given. <p> <b>Transport Type</b> <br> Selecting a transport type will restrict the chosen route to those on which it is allowed and set default values for the other parameters. <p> <b>Highway Preferences</b> <br> The highway preference is selected as a percentage and routes are chosen that try to follow the preferred highways. For example if a "Primary" road is given a "110%" preference and a "Secondary" road is given a "100%" preference then it means that a route on a Primary road can be up to 10% longer than on a secondary road and still be selected. <p> <b>Speed Limits</b> <br> The speed limits chosen here for the different types of highway apply if the highway has no other speed limit marked or it is higher than the chosen one. <p> <b>Property Preferences</b> <br> The property preference is selected as a percentage and routes are chosen that try to follow highways with the preferred property. For example if a "Paved" highway is given a "75%" preference then it means that an unpaved highway is automatically given a "25%" preference so that a route on a paved highway can be 3 times the length of an unpaved one and still be selected. <p> <b>Other Restrictions</b> <br> These allow a route to be found that avoids marked limits on weight, height, width or length. It is also possible to ignore one-way restrictions (e.g. if walking). $$ROUTER-OPTIONS-HELP$$ $$ROUTER-RESULTS-HELP$$ <b>Quick Start</b> <br> After calculating a route you can download the GPX file or plain text route description (summary or detailed version). Also you can view the route description and zoom in to selected parts. <p> <b>Problem Solving</b> <br> If the router completes with an error then the most likely cause is that it is not possible to find a route between the selected points. Moving one or more markers or changing the routing options should allow a route to be found. <p> <b>Output Formats</b> <br> <dl> <dt>HTML instructions <dd>A description of the route to take with directions at each important junction. <dt>GPX track file <dd>The same information that is displayed on the map with points for every node and lines for every segment. <dt>GPX route file <dd>The same information that is displayed in text for the route with a waypoint for each important junction in the route. <dt>Full text file <dd>A list of all of the nodes visited as well as the distance between them and the cumulative distance for each step of the route. <dt>Text file <dd>The same information that is displayed in text for the route. </dl> $$ROUTER-RESULTS-HELP$$ $$ROUTER-VISUALISER-INFO$$ To see Routino's view of the data there is a data visualiser that allows displaying of the underlying data in various ways. $$ROUTER-VISUALISER-INFO$$ # # Multi-line descriptive translations (visualiser) # $$VISUALISER-INFO$$ This web page allows visualisation of the data that Routino uses for routing. Only data relevant for routing is displayed and some will therefore be excluded. $$VISUALISER-INFO$$ $$VISUALISER-INSTRUCTIONS$$ Zoom in and then use the buttons below to download the data. The server will only return data if the selected area is small enough. $$VISUALISER-INSTRUCTIONS$$ $$VISUALISER-HELP$$ <b>Quick Start</b> <br> Zoom to an area and select one of the buttons to display that type of data. <br> More data options can be found by expanding the details below each button. <p> <b>Data Failure</b> <br> If the area selected is too large (depends on the data type) then the status will say "Failed to get visualiser data" - zoom in and try again. $$VISUALISER-HELP$$ $$VISUALISER-ROUTER-INFO$$ To perform routing on the map use the link below. $$VISUALISER-ROUTER-INFO$$ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/web/translations/router.html���������������������������������������������������������� 644 � 233 � 144 � 75617 13311001776 14133� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="keywords" content="openstreetmap routing route planner"> <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=no"> <title>Routino : @@ROUTER-TITLE@@
@@OPTION-TAB@@ @@RESULTS-TAB@@ @@DATA-TAB@@
@@ROUTINO-ROUTER@@ $$ROUTER-INFO$$
+ - @@LANGUAGE-BOX@@
+ - @@WAYPOINTS-BOX@@
@@WAYPOINT-LOOP-BUTTON@@:
@@WAYPOINT-REVERSE-BUTTON@@:
@@FIND-BOX@@
+ - @@TRANSPORT-TYPE-BOX@@
@@TRANSPORT-FOOT@@:
@@TRANSPORT-HORSE@@:
@@TRANSPORT-WHEELCHAIR@@:
@@TRANSPORT-BICYCLE@@:
@@TRANSPORT-MOPED@@:
@@TRANSPORT-MOTORCYCLE@@:
@@TRANSPORT-MOTORCAR@@:
@@TRANSPORT-GOODS@@:
@@TRANSPORT-HGV@@:
@@TRANSPORT-PSV@@:
+ - @@HIGHWAY-PREFERENCES-BOX@@
+ - @@SPEED-LIMITS-BOX@@
+ - @@PROPERTY-PREFERENCES-BOX@@
+ - @@OTHER-RESTRICTIONS-BOX@@
+ - @@HELP-BOX@@
$$ROUTER-OPTIONS-HELP$$
@@ROUTER@@: Routino | @@GEO-DATA@@: | @@TILES@@:
routino-3.4.3/web/data/ 40755 233 144 0 15003125373 10041 5routino-3.4.3/web/data/create.sh 755 233 144 637 12764327167 11665 0#!/bin/sh -x # This script can download from the GeoFabrik server. # EDIT THIS to set the names of the files to download from GeoFabrik. files="europe/great-britain-latest.osm.bz2 europe/ireland-and-northern-ireland-latest.osm.bz2" server="download.geofabrik.de" # Download the files for file in $files; do wget -N http://$server/$file done # Process the data ../bin/planetsplitter --errorlog *.osm.bz2 routino-3.4.3/web/Makefile 644 233 144 14607 12603024144 10631 0# web directory Makefile # # Part of the Routino routing software. # # This file Copyright 2010-2015 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../Makefile.conf # Web file paths and other paths WEBBINDIR=bin WEBDATADIR=data WEBTRANSDIR=translations WEBWWWDIR=www/routino WEBICONDIR=www/routino/icons WEBDOCDIR=www/routino/documentation XMLDIR=../xml DOCDIR=../doc SRCDIR=../src # Files to install STANDARD_XML_FILES=profiles.xml \ translations.xml \ tagging.xml SPECIAL_XML_FILES=tagging-drive.xml \ tagging-ride.xml \ tagging-walk.xml PROFILE_FILES=profiles.pl \ profiles.js TRANS_FILES=$(wildcard $(WEBTRANSDIR)/translation.*.txt) DOC_FILES=$(notdir $(wildcard $(DOCDIR)/html/*.html)) $(notdir $(wildcard $(DOCDIR)/html/*.css)) EXE_FILES=planetsplitter$(.EXE) planetsplitter-slim$(.EXE) router$(.EXE) router-slim$(.EXE) filedumperx$(.EXE) filedumper$(.EXE) filedumper-slim$(.EXE) ######## all: all-bin all-data all-doc all-profiles all-translations all-icons #### all-bin: all-exe @[ -d $(WEBBINDIR) ] || mkdir -p $(WEBBINDIR) @for file in $(EXE_FILES); do \ if [ -f $(SRCDIR)/$$file -a ! -f $(WEBBINDIR)/$$file ] || [ $(SRCDIR)/$$file -nt $(WEBBINDIR)/$$file ]; then \ echo cp $(SRCDIR)/$$file $(WEBBINDIR) ;\ cp -f $(SRCDIR)/$$file $(WEBBINDIR) ;\ fi ;\ done #### all-data: all-xml @[ -d $(WEBDATADIR) ] || mkdir -p $(WEBDATADIR) @for file in $(STANDARD_XML_FILES); do \ if [ ! -f $(WEBDATADIR)/$$file ] || [ $(XMLDIR)/routino-$$file -nt $(WEBDATADIR)/$$file ]; then \ echo cp $(XMLDIR)/routino-$$file $(WEBDATADIR)/$$file ;\ cp -f $(XMLDIR)/routino-$$file $(WEBDATADIR)/$$file ;\ fi ;\ done @for file in $(SPECIAL_XML_FILES); do \ if [ ! -f $(WEBDATADIR)/$$file ] || [ $(XMLDIR)/$$file -nt $(WEBDATADIR)/$$file ]; then \ echo cp $(XMLDIR)/$$file $(WEBDATADIR)/$$file ;\ cp -f $(XMLDIR)/$$file $(WEBDATADIR)/$$file ;\ fi ;\ done #### all-doc: @[ -d $(WEBDOCDIR) ] || mkdir -p $(WEBDOCDIR) @for file in $(DOC_FILES); do \ if [ ! -f $(WEBDOCDIR)/$$file ] || [ $(DOCDIR)/html/$$file -nt $(WEBDOCDIR)/$$file ]; then \ echo cp $(DOCDIR)/html/$$file $(WEBDOCDIR) ;\ cp -f $(DOCDIR)/html/$$file $(WEBDOCDIR) ;\ fi ;\ done #### all-profiles: all-bin all-data @if [ ! -f $(WEBWWWDIR)/profiles.js ] || [ ! -f $(WEBWWWDIR)/profiles.pl ] || \ [ $(WEBDATADIR)/profiles.xml -nt $(WEBWWWDIR)/profiles.pl ] || \ [ $(WEBDATADIR)/profiles.xml -nt $(WEBWWWDIR)/profiles.js ]; then \ echo update-profiles.pl ;\ ( cd $(WEBWWWDIR) ; perl update-profiles.pl ) ;\ fi #### all-translations: $(WEBWWWDIR)/router.html $(WEBWWWDIR)/visualiser.html \ $(WEBWWWDIR)/router.html.en $(WEBWWWDIR)/visualiser.html.en \ $(XMLDIR)/routino-translations.xml ifeq ($(HOST),MINGW) $(WEBWWWDIR)/router.html: $(WEBWWWDIR)/router.html.en @echo cp $< $@ @cp -f $< $@ $(WEBWWWDIR)/visualiser.html: $(WEBWWWDIR)/visualiser.html.en @echo cp $< $@ @cp -f $< $@ else $(WEBWWWDIR)/router.html: $(WEBWWWDIR)/router.html.en @echo ln -s `basename $<` $@ @ln -s -f `basename $<` $@ $(WEBWWWDIR)/visualiser.html: $(WEBWWWDIR)/visualiser.html.en @echo ln -s `basename $<` $@ @ln -s -f `basename $<` $@ endif $(WEBWWWDIR)/router.html.en: $(WEBTRANSDIR)/router.html $(TRANS_FILES) $(WEBTRANSDIR)/translate.pl @echo translate.pl @cd $(WEBTRANSDIR) && perl translate.pl $(WEBWWWDIR)/visualiser.html.en: $(WEBTRANSDIR)/visualiser.html $(TRANS_FILES) $(WEBTRANSDIR)/translate.pl @echo translate.pl @cd $(WEBTRANSDIR) && perl translate.pl $(XMLDIR)/routino-translations.xml: $(WEBTRANSDIR)/translations-head.xml $(WEBTRANSDIR)/translations-body.xml $(WEBTRANSDIR)/translations-tail.xml $(TRANS_FILES) $(WEBTRANSDIR)/translate.pl @echo translate.pl @cd $(WEBTRANSDIR) && perl translate.pl #### all-icons: $(WEBICONDIR)/ball-0.png $(WEBICONDIR)/ball-0.png: $(WEBICONDIR)/create-icons.pl @echo create-icons.pl @cd $(WEBICONDIR) && perl create-icons.pl #### all-exe: cd $(SRCDIR) && $(MAKE) all-exe #### all-xml: $(XMLDIR)/routino-translations.xml cd $(XMLDIR) && $(MAKE) all ######## test: ######## install: all @echo "******************************************************" @echo "* Note: web directory is not installed automatically *" @echo "******************************************************" ######## clean: clean clean-all-bin clean-all-data clean-all-doc clean-all-profiles clean-all-translations clean-all-icons rm -f *~ clean-all-bin: -cd $(WEBBINDIR) && rm -f $(EXE_FILES) clean-all-data: -cd $(WEBDATADIR) && rm -f $(STANDARD_XML_FILES) -cd $(WEBDATADIR) && rm -f $(SPECIAL_XML_FILES) clean-all-doc: -cd $(WEBDOCDIR) && rm -f $(DOC_FILES) clean-all-profiles: clean-all-translations: clean-all-icons: ######## distclean: distclean-all-bin distclean-all-data distclean-all-doc distclean-all-profiles distclean-all-translations distclean-all-icons distclean-all-bin: clean-all-bin distclean-all-data: clean-all-data distclean-all-doc: clean-all-doc distclean-all-profiles: clean-all-profiles -cd $(WEBWWWDIR) && rm -f $(PROFILE_FILES) distclean-all-translations: clean-all-translations -cd $(WEBWWWDIR) && rm -f router.html* -cd $(WEBWWWDIR) && rm -f visualiser.html* distclean-all-icons: clean-all-icons -cd $(WEBICONDIR) && rm -f ball-*.png limit-*.png marker-*.png ######## .PHONY:: all test install clean distclean .PHONY:: all-bin all-data all-doc all-profiles all-icons all-translations all-exe all-xml .PHONY:: clean-all-bin clean-all-data clean-all-doc clean-all-profiles clean-all-translations clean-all-icons .PHONY:: distclean-all-bin distclean-all-data distclean-all-doc distclean-all-profiles distclean-all-translations distclean-all-icons .NOTPARALLEL: routino-3.4.3/web/www/ 40755 233 144 0 13532473475 7772 5routino-3.4.3/web/www/openlayers2/ 40755 233 144 0 13521272362 12223 5routino-3.4.3/web/www/openlayers2/routino.cfg 644 233 144 2230 12260565540 14416 0# This is a configuration file to allow building an optimised OpenLayers # Javascript file that contains all of the features required for Routino. [first] OpenLayers/SingleFile.js OpenLayers.js OpenLayers/BaseTypes.js OpenLayers/BaseTypes/Class.js OpenLayers/Util.js [last] [include] OpenLayers/BaseTypes/LonLat.js OpenLayers/BaseTypes/Bounds.js OpenLayers/Control/DragFeature.js OpenLayers/Control/LayerSwitcher.js OpenLayers/Control/Navigation.js OpenLayers/Control/PanZoomBar.js OpenLayers/Control/PinchZoom.js OpenLayers/Control/SelectFeature.js OpenLayers/Control/ScaleLine.js OpenLayers/Feature/Vector.js OpenLayers/Format/GPX.js OpenLayers/Geometry/LineString.js OpenLayers/Geometry/Point.js OpenLayers/Geometry/Polygon.js OpenLayers/Layer/Boxes.js OpenLayers/Layer/SphericalMercator.js OpenLayers/Layer/TMS.js OpenLayers/Layer/Vector.js OpenLayers/Map.js OpenLayers/Marker/Box.js OpenLayers/Projection.js OpenLayers/Protocol/HTTP.js OpenLayers/Renderer/Elements.js OpenLayers/Renderer/Canvas.js OpenLayers/Renderer/SVG.js OpenLayers/Renderer/VML.js OpenLayers/Request/XMLHttpRequest.js OpenLayers/Strategy/Fixed.js OpenLayers/Rule.js OpenLayers/Style.js [exclude] routino-3.4.3/web/www/openlayers2/install.sh 755 233 144 740 13521272362 14225 0#!/bin/sh -x version=2.13.1 # Download the file. wget http://openlayers.org/download/OpenLayers-$version.tar.gz # Uncompress it. tar -xzf OpenLayers-$version.tar.gz # Create a custom OpenLayers file (cd OpenLayers-$version/build && python build.py ../../routino.cfg && cp OpenLayers.js ..) # Copy the files. cp -p OpenLayers-$version/OpenLayers.js . cp -pr OpenLayers-$version/img . cp -pr OpenLayers-$version/theme . # Delete the remainder rm -rf OpenLayers-$version routino-3.4.3/web/www/openlayers/ 40755 233 144 0 14441353720 12141 5routino-3.4.3/web/www/openlayers/install.sh 755 233 144 1524 14441353720 14164 0#!/bin/sh -x # Openlayers version (https://openlayers.org/) version=7.4.0 # Layer switcher version (https://github.com/walkermatt/ol-layerswitcher/) layer_switcher_version=4.1.1 # Download the file. wget https://github.com/openlayers/openlayers/releases/download/v$version/v$version-package.zip # Uncompress it. unzip v$version-package.zip -d v$version-package # Move the files mv v$version-package/dist/* . mv v$version-package/ol.css . rm -rf v$version-package # Download the file wget https://github.com/walkermatt/ol-layerswitcher/archive/v$layer_switcher_version.zip # Uncompress it. unzip v$layer_switcher_version.zip # Move the files mv ol-layerswitcher-$layer_switcher_version/dist/ol-layerswitcher.js . mv ol-layerswitcher-$layer_switcher_version/src/ol-layerswitcher.css . rm -rf ol-layerswitcher-$layer_switcher_version routino-3.4.3/web/www/leaflet/ 40755 233 144 0 14441353677 11407 5routino-3.4.3/web/www/leaflet/install.sh 755 233 144 224 14441353677 13406 0#!/bin/sh -x version=1.9.4 # Download the file. wget http://cdn.leafletjs.com/leaflet/v$version/leaflet.zip # Uncompress it. unzip leaflet.zip routino-3.4.3/web/www/routino/ 40755 233 144 0 14774263775 11502 5routino-3.4.3/web/www/routino/visualiser.html.it 644 233 144 54252 14774263774 15234 0 Routino : Visualizzatore dati percorso
Visualiser Router Data
Visualizzatore Routino Questa pagina web consente la visualizzazione dei dati utilizzati da Routino per il calcolo del percorso. Vengono visualizzati solo i dati relativi al percorso e pertanto alcuni potranno essere esclusi.
Istruzioni Ingrandisci e usa il pulsante sotto per scaricare i dati. Il server fornirà i dati se l'area selezionata non è troppo grande.
Stato
Nessun dato mostrato
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Aiuto
Quick Start
Ingrandisci un'area e seleziona uno dei pulsanti per mostrare il tipo di dati.
Più opzioni per i dati si possono ottenere espandendo i dettagli sotto ogni pulsante.

Dati non validi
Se l'area selezionata è troppo grande (dipende dal tipo dei dati) l'indicazione dello stato sarà: "Impossibile visualizzare i dati." - ingrandisci e riprova.

Percorso: Routino | Dati Geografici: | Tiles:
routino-3.4.3/web/www/routino/documentation/ 40755 233 144 0 15003125373 14324 5routino-3.4.3/web/www/routino/page-elements.js 644 233 144 4426 12271221644 14563 0// // Javascript for page elements. // // Part of the Routino routing software. // // This file Copyright 2008-2014 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // // // Display one of the tabs and associated DIV and hide the others // function tab_select(name) { var tab=document.getElementById("tab_" + name); if(tab.className=="tab_selected") return; // Hide the deslected tabs and DIVs var parent=tab.parentNode; var child=parent.firstChild; do { if(String(child.id).substr(0,4)=="tab_") { var div=document.getElementById(child.id + "_div"); child.className="tab_unselected"; div.style.display="none"; } child=child.nextSibling; } while(child!==null); // Display the newly selected tab and DIV tab.className="tab_selected"; document.getElementById(tab.id + "_div").style.display=""; } // // Show the associated DIV // function hideshow_show(name) { document.getElementById("hideshow_" + name + "_show").className="hideshow_hide"; document.getElementById("hideshow_" + name + "_hide").className="hideshow_show"; document.getElementById("hideshow_" + name + "_div").style.display=""; } // // Hide the associated DIV // function hideshow_hide(name) { document.getElementById("hideshow_" + name + "_show").className="hideshow_show"; document.getElementById("hideshow_" + name + "_hide").className="hideshow_hide"; document.getElementById("hideshow_" + name + "_div").style.display="none"; } // // Toggle the associated DIV // function hideshow_toggle(name) { if(document.getElementById("hideshow_" + name + "_div").style.display=="none") hideshow_show(name); else hideshow_hide(name); } routino-3.4.3/web/www/routino/visualiser.leaflet.js 644 233 144 74241 13755535065 15675 0// // Routino data visualiser web page Javascript // // Part of the Routino routing software. // // This file Copyright 2008-2014, 2019, 2020 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // // // Data types // var data_types=[ "junctions", "super", "waytype", "highway", "transport", "barrier", "turns", "speed", "weight", "height", "width", "length", "property", "errorlogs" ]; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Initialisation ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Process the URL query string and extract the arguments var legal={"^lon" : "^[-0-9.]+$", "^lat" : "^[-0-9.]+$", "^zoom" : "^[-0-9.]+$", "^data" : "^.+$", "^subdata" : "^.+$"}; var args={}; if(location.search.length>1) { var query,queries; query=location.search.replace(/^\?/,""); query=query.replace(/;/g,"&"); queries=query.split("&"); for(var i=0;i" + data_text + ""; document.getElementById("attribution_tile").innerHTML="" + tile_text + ""; } change_attribution(0); // Add two vectors layers (one for highlights that display behind the vectors) layerVectors = L.layerGroup(); map.addLayer(layerVectors); layerHighlights = L.layerGroup(); map.addLayer(layerHighlights); // Handle popup createPopup(); // Move the map map.on("moveend", (function() { displayMoreData(); updateURLs(false);})); var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon !== undefined && lat !== undefined && zoom !== undefined) { lat = Number(lat); lon = Number(lon); zoom = Number.parseInt(Number(zoom)+0.5); if(lonmapprops.eastedge) lon=mapprops.eastedge; if(latmapprops.northedge) lat=mapprops.northedge; if(zoommapprops.zoomin) zoom=mapprops.zoomin; map.setView(L.latLng(lat,lon),zoom); } else map.fitBounds(map.options.maxBounds); // Unhide editing URL if variable set if(mapprops.editurl !== undefined && mapprops.editurl !== "") { var edit_url=document.getElementById("edit_url"); edit_url.style.display=""; edit_url.href=mapprops.editurl; } // Select the data view if selected var datatype=args["data"]; var datasubtype=args["subdata"]; if(datatype !== undefined) displayData(datatype, datasubtype); // Update the URL updateURLs(false); } // // Format a number in printf("%.5f") format. // function format5f(number) { var newnumber=Math.floor(number*100000+0.5); var delta=0; if(newnumber>=0 && newnumber<100000) delta= 100000; if(newnumber<0 && newnumber>-100000) delta=-100000; var string=String(newnumber+delta); var intpart =string.substring(0,string.length-5); var fracpart=string.substring(string.length-5,string.length); if(delta>0) intpart="0"; if(delta<0) intpart="-0"; return(intpart + "." + fracpart); } // // Build a set of URL arguments for the map location // function buildMapArguments() { var lonlat = map.getCenter(); var zoom = map.getZoom(); return "lat=" + format5f(lonlat.lat) + ";lon=" + format5f(lonlat.lng) + ";zoom=" + zoom; } // // Update the URLs // function updateURLs(addhistory) { var mapargs=buildMapArguments(); var dataargs=";data=" + displaytype; var libargs=";library=" + mapprops.library; if(displaytype === "") dataargs=""; else if(displaysubtype !== "") dataargs+=";subdata=" + displaysubtype; if(!mapprops.libraries) libargs=""; var links=document.getElementsByTagName("a"); for(var i=0; i" + id + ""); } } } drawPopup(string.split("\n").join("
")); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Server handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Define an AJAX request object // function ajaxGET(url,success,failure,state) { var ajaxRequest=new XMLHttpRequest(); function ajaxGOT(options) { if(this.readyState==4) if(this.status==200) { if(typeof(options.success)=="function") options.success(this,options.state); } else { if(typeof(options.failure)=="function") options.failure(this,options.state); } } ajaxRequest.onreadystatechange = function(){ ajaxGOT.call(ajaxRequest,{success: success, failure: failure, state: state}); }; ajaxRequest.open("GET", url, true); ajaxRequest.send(null); } // // Display the status // function displayStatus(type,subtype,content) { var child=document.getElementById("result_status").firstChild; do { if(child.id !== undefined) child.style.display="none"; child=child.nextSibling; } while(child !== null); var chosen_status=document.getElementById("result_status_" + type); chosen_status.style.display=""; if(subtype !== undefined) { var format_status=document.getElementById("result_status_" + subtype).innerHTML; chosen_status.innerHTML=format_status.replace("#",String(content)); } } // // Display data statistics // function displayStatistics() { // Use AJAX to get the statistics ajaxGET("statistics.cgi", runStatisticsSuccess); } // // Success in running data statistics generation. // function runStatisticsSuccess(response) { document.getElementById("statistics_data").innerHTML="
" + response.responseText + "
"; document.getElementById("statistics_link").style.display="none"; } // // Get the requested data // function displayData(datatype, datasubtype) // called from visualiser.html { // Display the form entry for(var data in data_types) hideshow_hide(data_types[data]); if(datatype !== "") hideshow_show(datatype); if(datasubtype === undefined) datasubtype=""; // Delete the old data vectorData=[]; unselectFeature(); layerVectors.clearLayers(); // Print the status displayStatus("no_data"); // Return if just here to clear the data if(datatype === "") { displaytype = ""; displaysubtype = ""; updateURLs(true); return; } // Determine the type of data switch(datatype) { case "junctions": break; case "super": break; case "waytype": var waytypes=document.forms["waytypes"].elements["waytype"]; for(var w in waytypes) if(datasubtype == waytypes[w].value) waytypes[w].checked=true; else if(waytypes[w].checked) datasubtype=waytypes[w].value; break; case "highway": var highways=document.forms["highways"].elements["highway"]; for(var h in highways) if(datasubtype == highways[h].value) highways[h].checked=true; else if(highways[h].checked) datasubtype=highways[h].value; break; case "transport": var transports=document.forms["transports"].elements["transport"]; for(var t in transports) if(datasubtype == transports[t].value) transports[t].checked=true; else if(transports[t].checked) datasubtype=transports[t].value; break; case "barrier": var transports=document.forms["barriers"].elements["barrier"]; for(var t in transports) if(datasubtype == transports[t].value) transports[t].checked=true; else if(transports[t].checked) datasubtype=transports[t].value; break; case "turns": break; case "speed": case "weight": case "height": case "width": case "length": break; case "property": var properties=document.forms["properties"].elements["property"]; for(var p in properties) if(datasubtype == properties[p].value) properties[p].checked=true; else if(properties[p].checked) datasubtype=properties[p].value; break; case "errorlogs": break; } // Update the URLs displaytype = datatype; displaysubtype = datasubtype; displayMoreData(); } function displayMoreData() { // Get the new data var mapbounds=map.getBounds(); var url="visualiser.cgi"; url=url + "?lonmin=" + format5f(mapbounds.getWest()); url=url + ";latmin=" + format5f(mapbounds.getSouth()); url=url + ";lonmax=" + format5f(mapbounds.getEast()); url=url + ";latmax=" + format5f(mapbounds.getNorth()); url=url + ";data=" + displaytype; // Use AJAX to get the data switch(displaytype) { case "junctions": ajaxGET(url, runJunctionsSuccess, runFailure); break; case "super": ajaxGET(url, runSuperSuccess, runFailure); break; case "waytype": url+="-" + displaysubtype; ajaxGET(url, runWaytypeSuccess, runFailure); break; case "highway": url+="-" + displaysubtype; ajaxGET(url, runHighwaySuccess, runFailure); break; case "transport": url+="-" + displaysubtype; ajaxGET(url, runTransportSuccess, runFailure); break; case "barrier": url+="-" + displaysubtype; ajaxGET(url, runBarrierSuccess, runFailure); break; case "turns": ajaxGET(url, runTurnsSuccess, runFailure); break; case "speed": case "weight": case "height": case "width": case "length": ajaxGET(url, runLimitSuccess, runFailure); break; case "property": url+="-" + displaysubtype; ajaxGET(url, runPropertySuccess, runFailure); break; case "errorlogs": ajaxGET(url, runErrorlogSuccess, runFailure); break; } updateURLs(true); } // // Success in getting the junctions. // function runJunctionsSuccess(response) { var lines=response.responseText.split("\n"); var junction_colours={ 0: "#FFFFFF", 1: "#FF0000", 2: "#FFFF00", 3: "#00FF00", 4: "#8B4513", 5: "#00BFFF", 6: "#FF69B4", 7: "#000000", 8: "#000000", 9: "#000000" }; for(var line=0;line Routino : Data Visualiser for Routing Data
Visualiser Router Data
Routino Visualiser This web page allows visualisation of the data that Routino uses for routing. Only data relevant for routing is displayed and some will therefore be excluded.
+ - Язык
ИнÑтрукции Zoom in and then use the buttons below to download the data. The server will only return data if the selected area is small enough.
СтатуÑ
Ðет данных Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Помощь
Quick Start
Zoom to an area and select one of the buttons to display that type of data.
More data options can be found by expanding the details below each button.

Data Failure
If the area selected is too large (depends on the data type) then the status will say "Failed to get visualiser data" - zoom in and try again.

Маршрутизатор: Routino | Гео данные: | Тайлы:
routino-3.4.3/web/www/routino/router.html.hu 644 233 144 102542 14774263771 14377 0 Routino : OpenStreetMap-alapú útvonaltervező
Beállítások Eredmény Adatok
Routino OpenStreetMap-útvonaltervező Ezzel a honlappal útvonalakat lehet tervezni az OpenStreetMapről gyűjtott adatok segítségével. Válaszd ki a kiindulási és a célpontot (kattints az alábbi jelzőkre), jelöld ki az útvonaltervezési beállításokat, és találd meg az utat.
+ - Útpontok
Kör bezárása:
Sorrend megfordítása:
Keresés
+ - Közlekedési mód
Gyalogos:
Ló:
Kerekesszék:
Kerékpár:
Robogó:
Motor:
Autó:
Kisteherautó:
Nehéz tehergépkocsi:
Busz:
+ - Útvonal-beállítások
+ - Sebességkorlátozás
+ - Útjelleg-beállítások
+ - További korlátozások
+ - Súgó
Rövid útmutató
Kattintsunk a jelzőikonokra (fent) és helyezzük el őket a térképen (jobbra), majd húzzuk őket a megfelelő helyre. Valószínűleg az a legegyszerűbb, ha először ránagyítunk a térkép megfelelő részére, és ez után helyezzük el a jelzőket. Másik lehetőségként beírhatjuk a fenti mezőkbe a megfelelő szélességi és hosszúsági adatokat.

A fenti beállításoknál jelöljük ki a közlekedés módját, a megengedett úttípusokat, sebességkorlátozásokat, úttulajdonságokat és más korlátozásokat. Az út kiszámításához és térképen való megjelenítéséhez jelöljük ki a „Legrövidebb†vagy a „Leggyorsabb†lehetőséget.

Útpontok
A jelzőikonra történő kattintás elrejti/megjeleníti az ikont a térképen. Az út úgy számíttatik ki, hogy (a kijelölt közlekedési mód szerint a lehető legközelebb) érintse a megadott sorrendben az összes útpontot, amelyek jelzőikonja látható a térképen.

Közlekedési mód
A közlekedési mód kijelölése a kiválasztott útvonalat azokra korlátozza, amelyek így lehetséges közlekedni, a többi paraméter értékét pedig az alapértelmezettre állítja.

Úttulajdonságok
Az úttulajdonságokat százalékként lehet kijelölni, a kiválasztott útvonalak pedig igyekeznek az előnyben részesített úttípusokat követni. Ha például a „Főút†110%-os értéket kap, az „Összekötő út†pedig 100%-ot, az azt jelenti, hogy még akkor is főúton vezető útvonal fog megjelenni, ha az akár 10%-kal is hosszabb, mint az összekötő utakon vezető.

Sebességkorlátozások
A különböző úttípusokhoz itt kiválasztott sebességkorlátozások akkor érvényesek, ha az úton nincs más sebességkorlátozás-jelzés vagy az magasabb, mint a kiválasztott.

Útjelleg-beállítások
Az útjelleg-beállítást százalékként lehet kijelölni, és az útvonal oly módon terveztetik meg, hogy lehetőleg a kívánt tulajdonságú utakon vezessen. Ha például a „burkolt†út 75%-ot kap, akkor a „burkolatlan†automatikusan 25%-ot. Ez azt jelenti, hogy még akkor is a burkolt úton vezető útvonal fog megjelenni, ha az akár 3× hosszabb, mint a burkolatlan úton vezető.

Más korlátozások
Ezekkel olyan utak is megtalálhatók, amelyek elkerülik a jelzett súly-, magasság-, szélesség- és hosszúságkorlátozásokat. Az egyirányú utcák is figyelmen kívül hagyhatók (pl. gyaloglásnál).

Útvonaltervező: Routino | Geo Data: | Mozaikok:
routino-3.4.3/web/www/routino/router.html.de 644 233 144 100342 14774263771 14347 0 Routino : Routen Planer für OpenStreetMap Daten
Optionen Ergebnisse Daten
Routino OpenStreetMap Router Diese Website erlaubt Routing mit den Daten, die OpenStreetMap gesammelt hat. Wähle Start- und Endpunkt (klicke auf die Marker-Symbole unten), wähle die Routing-Vorgaben und dann finde den Weg.
+ - Wegpunkte
Schleife schließen:
Rückwärts:
Suche
+ - Fortbewegungsart
Fußgänger:
Pferd:
Rollstuhl:
Fahrrad:
Moped:
Motorrad:
Auto:
LKW:
Schwertransport/LKW:
Öffentlicher Personenverkehr:
+ - Vorgaben zur Wegnutzung
+ - Geschwindigkeitsbegrenzung
+ - Vorgaben zur Wegbeschaffenheit
+ - andere Vorgaben
+ - Hilfe
Schnellanleitung
Klicke auf die Marker-Bildchen (oben), um sie in der Mitte der Karte (rechts) zu positionieren. Dann ziehe das Bildchen auf die genaue Position. Das Zoomen der Karte vor der Patzierung ist vermutlich am einfachsten. Alternativ kann man die geografische Breite und Länge in den Kästchen eintragen.

Wähle die Fortbewegungsart, die Vorgaben zur Wegnutzung, die Geschwindigkeitsvorgaben, die Vorgaben zur Wegbeschaffenheit und die anderen Vorgaben von den obigen Auswahlfeldern. Ein Klick auf "kürzeste" oder "schnellste" ermittelt die entsprechende Verbindung und zeigt sie in der Karte an.

Wegpunkte
Ein Klick auf das Marker-Bildchen (oben) schaltet die Sichbarkeit in der Karte ein bzw. aus. Die Berechnung Route erfolgt in der Reihenfolge der Wegpunkte (so gut, wie es für die gewählte Fortbewegungsart möglich ist).

Fortbewegungsart
Die Auswahl der Fortbewegungsart bestimmt die bei der Routenberechnung erlaubten Wegtypen und die Vorgabeeinstellungen aller anderen Parameter.

Vorgaben zur Wegnutzung
Die Vorgaben zur Wegnutzung bestimmen die Priorisierung von Wegarten. Wenn z. B. Schnellstraßen mit 110% und Bundesstraßen mit 100% angegeben werden, wird bei zwei möglichen Wegwahlen die Schnellstraße solange bevorzugt wird, wie der Längen(oder Zeit-)unterschied 10% nicht überschreitet.

Geschwindigkeitsvorgaben
Die hier geannten Geschwindigkeiten werden für den jeweiligen Wegtyp finden Anwendung wenn keine andere Geschwindkeitsbegrenzung mit geringerem Wert bekannt ist.

Vorgaben zur Wegbeschaffenheit
Die Vorgaben zur Wegbeschaffenheit werden als Prozentangaben verwendet, um die Verhältnisse der Wegbenutzung zu steuern. Wenn z. B. befestigte Wege mit 75% angegeben sind, werden unbefestigte automatisch mit 25% angenommen, so werden Wege ausgewählt, die mindestens drei mal länger auf befestigten Wegen verlaufen.

andere Vorgaben
Die Berücksichtigung von Benutzungs-Begrenzungen durch Gewicht, Höhe, Länge und Breite ist möglich. Genauso können Einbahnstraßenbeschräkungen ignoriert werden (z. B. als Fußgänger).

Router: Routino | Geodaten: | Kacheln:
routino-3.4.3/web/www/routino/update-profiles.pl 755 233 144 4536 12767517273 15164 0#!/usr/bin/perl # # Update the Routino profile files # # Part of the Routino routing software. # # This file Copyright 2011-2014, 2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Use the directory paths script require "./paths.pl"; # The parameters for the execution my $params=""; $params.=" --dir=$main::data_dir" if($main::data_dir); $params.=" --prefix=$main::data_prefix" if($main::data_prefix); # Generate the Perl profiles. open(PROFILE,">profiles.pl") || die "Cannot open 'profiles.pl' to write.\n"; print PROFILE "################################################################################\n"; print PROFILE "########################### Routino default profile ############################\n"; print PROFILE "################################################################################\n"; print PROFILE "\n"; open(EXECUTE,"$main::bin_dir/$main::router_exe $params --help-profile-perl |") || die "Failed to execute router to generate profiles.\n"; while() { print PROFILE; } close(EXECUTE); print PROFILE "\n"; print PROFILE "1;\n"; close(PROFILE); # Generate the Javascript profiles. open(PROFILE,">profiles.js") || die "Cannot open 'profiles.js' to write.\n"; print PROFILE "////////////////////////////////////////////////////////////////////////////////\n"; print PROFILE "/////////////////////////// Routino default profile ////////////////////////////\n"; print PROFILE "////////////////////////////////////////////////////////////////////////////////\n"; print PROFILE "\n"; open(EXECUTE,"$main::bin_dir/$main::router_exe $params --help-profile-json |") || die "Failed to execute router to generate profiles.\n"; while() { print PROFILE; } close(EXECUTE); close(PROFILE); routino-3.4.3/web/www/routino/visualiser.css 644 233 144 3165 12260522707 14400 0/* // Routino visualiser web page style sheet. // // Part of the Routino routing software. // // This file Copyright 2008-2013 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . */ /*--------------------------------*/ /* Left panel - override defaults */ /*--------------------------------*/ DIV.hideshow_box { overflow-x: auto; } /*-----------------------------------*/ /* Left panel - specific tab options */ /*-----------------------------------*/ DIV#tab_visualiser_div INPUT { padding: 0; border: 1px solid; margin: 0; text-align: center; } DIV#tab_visualiser_div INPUT:hover { background: #F0F0C0; } DIV#tab_visualiser_div TABLE { padding: 0; border: 0 hidden; margin: 0; } DIV#tab_visualiser_div DIV.center { text-align: center; } DIV#tab_visualiser_div TABLE TD { padding: 0; border: 0; margin: 0; } DIV#tab_visualiser_div INPUT { padding: 0; border: 1px solid; margin: 0; } /*-------*/ /* Popup */ /*-------*/ DIV.popup { font-family: monospace; font-size: 10px; } routino-3.4.3/web/www/routino/page-elements.css 644 233 144 4616 12261523234 14737 0/* // Style sheet for page elements. // // Part of the Routino routing software. // // This file Copyright 2008-2014 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . */ /*-------------*/ /* Tabbed DIVs */ /*-------------*/ DIV.tab_box { padding: 3px; margin-top: 3px; width: 100%; } DIV.tab_box SPAN.tab_selected { border-top: 2px solid; border-left: 2px solid; border-right: 2px solid; border-bottom: 1px solid white; z-index: 5; padding-top: 3px; padding-bottom: 3px; padding-right: 5px; padding-left: 5px; font-weight: bold; font-variant: small-caps; background: #FFF; } DIV.tab_box SPAN.tab_unselected { border-top: 1px solid; border-left: 1px solid; border-right: 1px solid; padding-top: 3px; padding-bottom: 3px; padding-right: 5px; padding-left: 5px; cursor: pointer; font-variant: small-caps; background: #CCC; } DIV.tab_box SPAN.tab_unselected:hover { background: #DDD; } DIV.tab_content { width: auto; padding: 3px; border: thin solid; } /*----------------*/ /* Show/Hide DIVs */ /*----------------*/ DIV.hideshow_box { min-height: 1em; border-top: 2px solid; border-color: #AAA; padding-bottom: 2px; overflow: hidden; } DIV.hideshow_box:first-child { border-top: none; } DIV.hideshow_box SPAN.hideshow_show { float: right; display: block; font-weight: bold; text-align: center; width: 1em; padding-right: 5px; padding-left: 5px; padding-top: 1px; padding-bottom: 1px; cursor: pointer; background: #CCC; } DIV.hideshow_box SPAN.hideshow_show:hover { background: #DDD; } DIV.hideshow_box SPAN.hideshow_hide { display: none; } SPAN.hideshow_title { display: block; font-weight: bold; text-decoration: underline; padding-top: 1px; padding-bottom: 1px; background: #EEE; } routino-3.4.3/web/www/routino/router.html.nl 644 233 144 100753 14774263772 14377 0 Routino : Routeplanner voor OpenStreetMap gegevens
Opties Resultaten Gegevens
Routino OpenStreetMap routering Deze webpagina laat je een route plannen op basis van gegevens van OpenStreetMap. Selecteer start- and eindpunten (klik op het markericoon hieronder), kies routevoorkeuren en vind een route
+ - Routepunten
Sluit de lus:
Keer volgorde om:
Vind
+ - Transporttype
Te voet:
Paard:
Rolstoel:
Fiets:
Brommer:
Motorfiets:
Auto:
Goederen:
Zwaar transport:
Publiek transport:
+ - Voorkeur Wegtype
+ - Snelheidslimieten
+ - Voorkeur Eigenschappen
+ - Andere Beperkingen
+ - Help
Snelle Start
Klik op markericoontje (boven) om ze op de kaart te plaatsen (rechts). Sleep ze vervolgens naar de gewenste positie. Het is best om eerst naar straat niveau te zoomen op de kaart. Een atlternatief is om lengte- en breedtegraad in te voeren in de invoervelden hierboven.

Selecteer het transport type, toegestane wegtypes, snelheidslimieten, wegeigenschappen en andere restricties uit de opties. Selecteer "Kortste" of "Snelste" om de route te berekenen en te tekenen op de kaar.

Routepunten (Waypoints)
Klik op het marker icoontje, nog eens klikken voor aan/uit. Wanneer de route berekend wordt, zal ze zo nauwkeurig mogelijk (voor het gegeven transporttype) aansluiten bij deze punten, in de gegeven volgorde.

Transporttype
Bij selectie van een transporttype wordt de berekende route beperkt tot segmenten waar dit transport toegelaten is, terwijl standaardwaarden worden gebruikt voor de andere parameters.

Voorkeur Wegtype
De voorkeur voor een bepaald type weg wordt uitgedrukt in een percentage. De gekozen routes proberen de voorkeurswegen te volgen. Bijvoorbeeld wanneer u het Transport Type "Fiets" kiest, dan zal er voor Autosnelweg 0% staan, en voor Fietspad 100%. Wanneer u Autowegen, Nationale wegen wil vermijden of beperken bij het maken van een fietsroute, kan u percentage naar beneden aanpassen.

Snelheidslimieten
De snelheidslimieten worden afgeleid van het type weg. Het is mogelijk dat er voor een bepaalde weg andere beperkingen gelden. In dat geval worden die gekozen, tenminste als ze lager zijn dan de standaardwaarden.

Wegeigenschappen
De voorkeur voor een eigenschap wordt gegeven als een percentage. De berekende route volgt bij voorkeur wegen met de gekozen eigenschap. Wanneer u bijvoorbeeld verharde wegen een voorkeur van 75% geeft, dan zal een onverharde weg automatisch een voorkeur van 25 % krijgen. Een route over verharde weg die driemaal langer is dan een route over onverharde weg, zal toch nog de voorkeur krijgen bij de berekening.

Andere Beperkingen
Deze zullen toelaten dat er een route berekend wordt die rekening houdt met gewicht, hoogte, breedte of lengte. Het is ook mogelijk geen rekening te houden met eenrichtingsverkeer (bijvoorbeeld als voetganger)

Router: Routino | Geo Data: | Tiles:
routino-3.4.3/web/www/routino/visualiser.html.fi 644 233 144 53247 14774263773 15220 0 Routino : Data Visualiser for Routing Data
Visualiser Router Data
Routino Visualiser This web page allows visualisation of the data that Routino uses for routing. Only data relevant for routing is displayed and some will therefore be excluded.
Instructions Zoom in and then use the buttons below to download the data. The server will only return data if the selected area is small enough.
Status
No data displayed
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Ohje
Quick Start
Zoom to an area and select one of the buttons to display that type of data.
More data options can be found by expanding the details below each button.

Data Failure
If the area selected is too large (depends on the data type) then the status will say "Failed to get visualiser data" - zoom in and try again.

Reititin: Routino | Paikkatieto: | Tiilit:
routino-3.4.3/web/www/routino/router.css 644 233 144 11366 13033250176 13551 0/* // Routino router web page style sheet. // // Part of the Routino routing software. // // This file Copyright 2008-2017 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . */ /*--------------------------------*/ /* Left panel - override defaults */ /*--------------------------------*/ DIV.hideshow_box { overflow-x: auto; } /*------------------------------*/ /* Left panel - generic options */ /*------------------------------*/ DIV.scrollable { overflow: auto; height: 20em; } /*-----------------------------------*/ /* Left panel - specific tab options */ /*-----------------------------------*/ DIV#tab_options_div DIV.waypoint { clear: both; } DIV#tab_options_div DIV.waypoint SPAN { vertical-align: 50%; } DIV#tab_options_div DIV.waypoint DIV.waypoint-buttons { float: right; } DIV#tab_options_div DIV.waypoint IMG { cursor: pointer; } DIV#tab_options_div DIV.waypoint IMG.waypoint-icon { cursor: move; } DIV#tab_options_div DIV.waypoint IMG:hover { background: #F0F000; } DIV#tab_options_div DIV#waypoints-buttons { clear: both; } DIV#tab_options_div DIV#waypoints-buttons TABLE { float: left; } DIV#tab_options_div DIV#waypoints-buttons DIV.waypoint-buttons { float: right; text-align: center; vertical-align: 50%; } DIV#tab_options_div DIV#waypoints-buttons IMG { cursor: pointer; } DIV#tab_options_div DIV#waypoints-buttons IMG:hover { background: #F0F000; } DIV#tab_options_div TABLE { padding: 0; border: 0 hidden; margin: 0; } DIV#tab_options_div TABLE TD { padding: 0; border: 0; margin: 0; } DIV#tab_options_div DIV.center { text-align: center; } DIV#tab_options_div A:hover { background: #F0F000; } DIV#tab_options_div INPUT, DIV#tab_results_div INPUT { padding: 0; border: 1px solid; margin: 0; } DIV#tab_options_div INPUT[type="text"] { text-align: right; } DIV#tab_options_div INPUT[size="18"] { text-align: left; } DIV#tab_options_div INPUT:hover { background: #F0F0C0; } DIV#tab_options_div INPUT#shortest1, DIV#tab_results_div INPUT#shortest2 { margin: 3px; border: 3px solid; border-color: #00FF00; background: #C0F0C0; text-align: center; } DIV#tab_options_div INPUT#shortest1:hover, DIV#tab_results_div INPUT#shortest2:hover { background: #F0F000; } DIV#tab_options_div INPUT[disabled]#shortest1, DIV#tab_results_div INPUT[disabled]#shortest2 { border-color: #004000; background: #E0F0E0; } DIV#tab_options_div INPUT#quickest1, DIV#tab_results_div INPUT#quickest2 { margin: 3px; border: 3px solid; border-color: #0000FF; background: #C0C0F0; text-align: center; } DIV#tab_options_div INPUT#quickest1:hover, DIV#tab_results_div INPUT#quickest2:hover { background: #F0F000; } DIV#tab_options_div INPUT[disabled]#quickest1, DIV#tab_results_div INPUT[disabled]#quickest2 { border-color: #000040; background: #E0E0F0; } DIV#tab_results_div TABLE { border-collapse: collapse; border: hidden; } DIV#tab_results_div TD.distance { text-align: left; } DIV#tab_results_div TD.highway { text-align: left; padding-left: 10px; } DIV#tab_results_div DIV#shortest_links A:hover { background: #C0F0C0; } DIV#tab_results_div DIV#shortest_route TR:hover { cursor: pointer; background: #C0F0C0; } DIV#tab_results_div DIV#quickest_links A:hover { background: #C0C0F0; } DIV#tab_results_div DIV#quickest_route TR:hover { cursor: pointer; background: #C0C0F0; } /*-------------------------------------------------*/ /* Popup - using the styles defined in HTML output */ /*-------------------------------------------------*/ DIV.popup table {table-layout: fixed; border: none; border-collapse: collapse;} DIV.popup tr {border: 0px;} DIV.popup tr.c {display: none;} /* coords */ DIV.popup tr.n {} /* node */ DIV.popup tr.s {} /* segment */ DIV.popup tr.t {font-weight: bold;} /* total */ DIV.popup td.l {font-weight: bold;} DIV.popup td.r {} DIV.popup span.w {font-weight: bold;} /* waypoint */ DIV.popup span.h {text-decoration: underline;} /* highway */ DIV.popup span.d {} /* segment distance */ DIV.popup span.j {font-style: italic;} /* total journey distance */ DIV.popup span.t {font-variant: small-caps;} /* turn */ DIV.popup span.b {font-variant: small-caps;} /* bearing */ routino-3.4.3/web/www/routino/.htaccess 644 233 144 3472 12640556437 13310 0## ## Options for Apache web server for language specific web pages and to run ## Routino CGI scripts. ## # For some of the configuration options in this file to be accepted the # 'AllowOverride' option in the main Apache configuration file must be set to a # particular value. A suitable value for the 'AllowOverride' option is # 'Options=MultiViews,ExecCGI FileInfo Limit' which will allow this file to be # used unmodified. Alternatively the specific option can be commented out from # this file and set in the main Apache configuration file. # The translated router pages use the MultiViews option to serve up a version of # the web page depending on the client language preference. Options +MultiViews # The English language option will be served if there is no other version # present and no errors will be returned to the user in case of problems. LanguagePriority en ForceLanguagePriority Prefer Fallback # The Routino CGI scripts are stored in this directory and use the filename # extension ".cgi". This filename extension needs to be registered with Apache # for the scripts to be executed. AddHandler cgi-script .cgi # The ExecCGI option must be set for the CGIs in this directory to be executed # by Apache. Options +ExecCGI # The CGI scripts that are used by Routino also call some other Perl scripts, to # stop these scripts from being seen by web users they can be denied by the # following entry. Order Deny,Allow Deny from all # The Polish language web page translations will have a '.html.pl' extension for # the MultiViews option so they must be allowed specifically and not blocked by # the above prohibition on serving Perl scripts. They must also be served with # the HTML mime type. AddType text/html .pl Allow from all routino-3.4.3/web/www/routino/statistics.cgi 755 233 144 2271 12767517356 14376 0#!/usr/bin/perl # # Routino data statistics # # Part of the Routino routing software. # # This file Copyright 2008-2014, 2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Use the directory paths script require "./paths.pl"; # Use the perl CGI module use CGI ':cgi'; # Print the output print header('text/plain'); # Run the filedumper my $params=""; $params.=" --dir=$main::data_dir" if($main::data_dir); $params.=" --prefix=$main::data_prefix" if($main::data_prefix); $params.=" --statistics"; system "$main::bin_dir/$main::filedumper_exe $params 2>&1"; routino-3.4.3/web/www/routino/paths.pl 644 233 144 2701 11763176234 13156 0# # Routino CGI paths Perl script # # Part of the Routino routing software. # # This file Copyright 2008-2012 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # Directory path parameters # EDIT THIS to set the root directory for the non-web data files. $root_dir="../.."; # EDIT THIS to change the location of the individual directories. $bin_dir="$root_dir/bin"; $data_dir="$root_dir/data"; $results_dir="$root_dir/results"; # EDIT THIS to set the filename prefix for the routing database files. $data_prefix=""; # EDIT THIS to change the names of the executables (enables easy selection of slim mode). $router_exe="router"; $filedumper_exe="filedumper"; # EDIT THIS to change the search type and base URL (must be a type recognised by search.pl). $search_type="nominatim"; $search_baseurl="http://nominatim.openstreetmap.org/search"; 1; routino-3.4.3/web/www/routino/visualiser.html.cs 644 233 144 53063 14774263773 15223 0 Routino : Data Visualiser for Routing Data
Visualiser Router Data
Routino vizualizér This web page allows visualisation of the data that Routino uses for routing. Only data relevant for routing is displayed and some will therefore be excluded.
Instrukce Zoom in and then use the buttons below to download the data. The server will only return data if the selected area is small enough.
Stav
No data displayed
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Pomoc
Quick Start
Zoom to an area and select one of the buttons to display that type of data.
More data options can be found by expanding the details below each button.

Data Failure
If the area selected is too large (depends on the data type) then the status will say "Failed to get visualiser data" - zoom in and try again.

Router: Routino | Geo Data: | Tiles:
routino-3.4.3/web/www/routino/router.html.es 644 233 144 100371 14774263771 14370 0 Routino : Planificador de Rutas para Datos OpenStreetMap
Opciones Resultados Datos
Enrutador de OpenStreetMap Routino This web page allows routing within the data collected by OpenStreetMap. Select start and end points (click on the marker icons below), select routing preferences then find a route.
+ - Waypoints
Cerrar bucle:
Invertir el orden:
Buscar
+ - Medio de locomoción
Pie:
Caballo:
Silla de ruedas:
Bicicleta:
Moped:
Ciclomotor:
Motorcar:
Goods:
HGV:
PSV:
+ - Preferencias de autovía
+ - Limites de Velocidad
+ - Preferencias de propiedad
+ - Otras restricciones
+ - Ayuda
Quick Start
Click on marker icons (above) to place them on the map (right). Then drag them to the correct position. Zooming the map before placing the markers is probably easiest. Alternatively type the latitude and longitude into the boxes above.

Select the transport type, allowed highway types, speed limits, highway properties and other restrictions from the options above. Select "Shortest" or "Quickest" to calculate the route and display it on the map.

Waypoints
Clicking on the marker icons will toggle the display of them on the map. When a route is calculated it will visit (as close as possible for the selected transport type) each of the waypoints that have markers on the map in the order given.

Transport Type
Selecting a transport type will restrict the chosen route to those on which it is allowed and set default values for the other parameters.

Highway Preferences
The highway preference is selected as a percentage and routes are chosen that try to follow the preferred highways. For example if a "Primary" road is given a "110%" preference and a "Secondary" road is given a "100%" preference then it means that a route on a Primary road can be up to 10% longer than on a secondary road and still be selected.

Speed Limits
The speed limits chosen here for the different types of highway apply if the highway has no other speed limit marked or it is higher than the chosen one.

Property Preferences
The property preference is selected as a percentage and routes are chosen that try to follow highways with the preferred property. For example if a "Paved" highway is given a "75%" preference then it means that an unpaved highway is automatically given a "25%" preference so that a route on a paved highway can be 3 times the length of an unpaved one and still be selected.

Other Restrictions
These allow a route to be found that avoids marked limits on weight, height, width or length. It is also possible to ignore one-way restrictions (e.g. if walking).

Enrutador: Routino | Geo Data: | Tiles:
routino-3.4.3/web/www/routino/visualiser.html.sk 644 233 144 55003 14774263775 15231 0 Routino : Vizualizér údajov pre smerovanie údajov
Visualiser Router Data
Routino vizualizér Táto webová stránka umožňuje vizualizáciu údajov, ktoré Routino používa na smerovanie. Zobrazujú sa iba tie údaje, ktoré sú relevantné pre smerovanie a preto niektoré údaje sú vylúÄené.
InÅ¡trukcie Priblížte a potom pomocou tlaÄidiel nižšie stiahnite údaje. Server vráti údaje iba vtedy, ak je oznaÄená oblasÅ¥ dostatoÄne malá.
Stav
Nezobrazujú sa žiadne dáta
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Pomoc
StruÄný návod
Priblížte sa do oblasti a vyberte jedno z tlaÄidiel na zobrazenie daného typu údajov.
ÄŽalÅ¡ie možnosti údajov nájdete po rozbalení podrobností pod každým tlaÄidlom.

Zlyhanie údajov
Ak je vybratá oblasť príliš veľká (závisí od typu údajov), výsledný stav bude "Nepodarilo sa získať údaje vizualizéra" - priblížte sa viac a skúste znova.

SmerovaÄ: Routino | Geo dáta: | Dlaždice:
routino-3.4.3/web/www/routino/router.openlayers.js 644 233 144 155425 14441354202 15601 0// // Routino router web page Javascript // // Part of the Routino routing software. // // This file Copyright 2008-2020, 2023 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // var vismarkers, markers, markersmoved, paramschanged; var homelat=null, homelon=null; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Initialisation ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Make a deep copy of the routino profile. var routino_default={}; for(var l1 in routino) if(typeof(routino[l1])!="object") routino_default[l1]=routino[l1]; else { routino_default[l1]={}; for(var l2 in routino[l1]) if(typeof(routino[l1][l2])!="object") routino_default[l1][l2]=Number(routino[l1][l2]); else { routino_default[l1][l2]={}; for(var l3 in routino[l1][l2]) routino_default[l1][l2][l3]=Number(routino[l1][l2][l3]); } } // Store the latitude and longitude in the routino variable routino.point=[]; for(var marker=1;marker<=mapprops.maxmarkers;marker++) { routino.point[marker]={}; routino.point[marker].lon=""; routino.point[marker].lat=""; routino.point[marker].search=""; routino.point[marker].active=false; routino.point[marker].used=false; routino.point[marker].home=false; } // Process the URL query string and extract the arguments var legal={"^lon" : "^[-0-9.]+$", "^lat" : "^[-0-9.]+$", "^zoom" : "^[-0-9.]+$", "^lon[1-9]" : "^[-0-9.]+$", "^lat[1-9]" : "^[-0-9.]+$", "^search[1-9]" : "^.+$", "^transport" : "^[a-z]+$", "^highway-[a-z]+" : "^[0-9.]+$", "^speed-[a-z]+" : "^[0-9.]+$", "^property-[a-z]+" : "^[0-9.]+$", "^oneway" : "^(1|0|true|false|on|off)$", "^turns" : "^(1|0|true|false|on|off)$", "^weight" : "^[0-9.]+$", "^height" : "^[0-9.]+$", "^width" : "^[0-9.]+$", "^length" : "^[0-9.]+$", "^language" : "^[-a-zA-Z]+$", "^reverse" : "(1|0|true|false|on|off)", "^loop" : "(1|0|true|false|on|off)"}; var args={}; if(location.search.length>1) { var query,queries; query=location.search.replace(/^\?/,""); query=query.replace(/;/g,"&"); queries=query.split("&"); for(var i=0;i=1;marker--) { var lon=args["lon" + marker]; var lat=args["lat" + marker]; var search=args["search" + marker]; if(lon !== undefined && lat !== undefined && search !== undefined && lon !== "" && lat !== "" && search !== "") { markerAddForm(marker); formSetSearch(marker,search); formSetCoords(marker,lon,lat); lat=Number(lat); lon=Number(lon); if(latmaxlat) maxlat=lat; if(lonmaxlon) maxlon=lon; markerAddMap(marker); markerSearch(marker); vismarkers++; urlmarkers++; } else if(lon !== undefined && lat !== undefined && lon !== "" && lat !== "") { markerAddForm(marker); formSetCoords(marker,lon,lat); lat=Number(lat); lon=Number(lon); if(latmaxlat) maxlat=lat; if(lonmaxlon) maxlon=lon; markerAddMap(marker); markerCoords(marker); vismarkers++; urlmarkers++; } else if(search !== undefined && search !== "") { markerAddForm(marker); formSetSearch(marker,search); markerSearch(marker); DoSearch(marker); vismarkers++; } else if(vismarkers || marker<=2) { markerAddForm(marker); vismarkers++; } var searchfield=document.forms["form"].elements["search" + marker]; if(searchfield.addEventListener) searchfield.addEventListener("keyup", searchOnReturnKey, false); else if(searchfield.attachEvent) searchfield.attachEvent("keyup", searchOnReturnKey); // Internet Explorer } if(args["loop"] !== undefined) formSetLoopReverse("loop",args["loop"]); else formSetLoopReverse("loop",false); if(args["reverse"] !== undefined) formSetLoopReverse("reverse",args["reverse"]); else formSetLoopReverse("reverse",false); // Zoom the map if(urlmarkers>1) { var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon === undefined || lat === undefined || zoom === undefined) { var deltalon = 0.025 * ( maxlon - minlon ); var deltalat = 0.025 * ( maxlat - minlat ); var markerextent=ol.extent.boundingExtent([ol.proj.fromLonLat([minlon-deltalon,minlat-deltalat]), ol.proj.fromLonLat([maxlon+deltalon,maxlat+deltalat])]); map.getView().fit(markerextent,map.getSize()); } } // Update the transport type with the URL settings which updates all HTML forms to defaults. var transport=routino.transport; if(args["transport"] !== undefined) transport=args["transport"]; formSetTransport(transport); // Update the HTML with the URL settings if(args["language"] !== undefined) formSetLanguage(args["language"]); else formSetLanguage(); for(var key in routino.profile_highway) if(args["highway-" + key] !== undefined) formSetHighway(key,args["highway-" + key]); for(var key in routino.profile_speed) if(args["speed-" + key] !== undefined) formSetSpeed(key,args["speed-" + key]); for(var key in routino.profile_property) if(args["property-" + key] !== undefined) formSetProperty(key,args["property-" + key]); for(var key in routino.restrictions) { if(key=="oneway" || key=="turns") { if(args[key] !== undefined) formSetRestriction(key,args[key]); } else { if(args["restrict-" + key] !== undefined) formSetRestriction(key,args["restrict-" + key]); } } // Get the home location cookie and compare to each waypoint var cookies=document.cookie.split("; "); for(var cookie=0;cookie100) value=100; if(value< 0) value= 0; document.forms["form"].elements["highway-" + type].value=value; routino.profile_highway[type][routino.transport]=value; paramschanged=true; updateURLs(true); } // // Change of Speed in the form // function formSetSpeed(type,value) // called from router.html (with one argument) { if(value == "+") { value=routino.profile_speed[type][routino.transport]; if(value<10) value=2*Math.floor(value/2)+2; else if(value<30) value=5*Math.floor(value/5)+5; else value=10*Math.floor(value/10)+10; } else if(value == "-") { value=routino.profile_speed[type][routino.transport]; if(value<=10) value=2*Math.ceil(value/2)-2; else if(value<=30) value=5*Math.ceil(value/5)-5; else value=10*Math.ceil(value/10)-10; } else if(value == "=") value=document.forms["form"].elements["speed-" + type].value; value=Number(value); if(isNaN(value)) value= 60; if(value>150) value=150; if(value< 0) value= 0; document.forms["form"].elements["speed-" + type].value=value; routino.profile_speed[type][routino.transport]=value; paramschanged=true; updateURLs(true); } // // Change of Property in the form // function formSetProperty(type,value) // called from router.html (with one argument) { if(value == "+") { value=routino.profile_property[type][routino.transport]; if(value>=40 && value<60) value=2*Math.floor(value/2)+2; else value=5*Math.floor(value/5)+5; } else if(value == "-") { value=routino.profile_property[type][routino.transport]; if(value>40 && value<=60) value=2*Math.ceil(value/2)-2; else value=5*Math.ceil(value/5)-5; } else if(value == "=") value=document.forms["form"].elements["property-" + type].value; value=Number(value); if(isNaN(value)) value= 50; if(value>100) value=100; if(value< 0) value= 0; document.forms["form"].elements["property-" + type].value=value; routino.profile_property[type][routino.transport]=value; paramschanged=true; updateURLs(true); } // // Change of Restriction rule in the form // function formSetRestriction(type,value) // called from router.html (with one argument) { if(type=="oneway" || type=="turns") { if(value === undefined) value=document.forms["form"].elements["restrict-" + type].checked; document.forms["form"].elements["restrict-" + type].checked=value; routino.profile_restrictions[type][routino.transport]=value; } else if(type=="weight") { if(value == "+") value=routino.profile_restrictions[type][routino.transport]+5; else if(value == "-") value=routino.profile_restrictions[type][routino.transport]-5; else if(value == "=") value=document.forms["form"].elements["restrict-" + type].value; value=Number(value); if(isNaN(value)) value= 0; if(value>50) value=50; if(value< 0) value= 0; document.forms["form"].elements["restrict-" + type].value=value; routino.profile_restrictions[type][routino.transport]=value; } else /* if(type=="height" || type=="width" || type=="length") */ { if(value == "+") value=routino.profile_restrictions[type][routino.transport]+1; else if(value == "-") value=routino.profile_restrictions[type][routino.transport]-1; else if(value == "=") value=document.forms["form"].elements["restrict-" + type].value; value=Number(value); if(isNaN(value)) value= 0; if(value>25) value=25; if(value< 0) value= 0; document.forms["form"].elements["restrict-" + type].value=value; routino.profile_restrictions[type][routino.transport]=value; } paramschanged=true; updateURLs(true); } // // Set the feature coordinates from the form when the form changes. // function formSetCoords(marker,lon,lat) // called from router.html (with one argument) { clearSearchResult(marker); if(lon === undefined && lat === undefined) { lon=document.forms["form"].elements["lon" + marker].value; lat=document.forms["form"].elements["lat" + marker].value; } if(lon === "" && lat === "") { document.forms["form"].elements["lon" + marker].value=""; document.forms["form"].elements["lat" + marker].value=""; routino.point[marker].lon=""; routino.point[marker].lat=""; updateURLs(true); } else { var lonlat; if(lon==="") { lonlat=ol.proj.toLonLat(map.getView().getCenter()); lon=lonlat[0]; } else lon=Number(lon); if(lon<-180) lon=-180; if(lon>+180) lon=+180; if(lat==="") { lonlat=ol.proj.toLonLat(map.getView().getCenter()); lat=lonlat[1]; } else lat=Number(lat); if(lat<-90 ) lat=-90 ; if(lat>+90 ) lat=+90 ; lonlat = ol.proj.fromLonLat([lon,lat]); markers[marker].setGeometry(new ol.geom.Point(lonlat)); markersmoved=true; document.forms["form"].elements["lon" + marker].value=format5f(lon); document.forms["form"].elements["lat" + marker].value=format5f(lat); routino.point[marker].lon=format5f(lon); routino.point[marker].lat=format5f(lat); routino.point[marker].used=true; markerCheckHome(marker); } } // // Set the search field from the form when the form changes. // function formSetSearch(marker,search) // called from event handler linked to router.html (with one argument) { clearSearchResult(marker); if(search === undefined) { routino.point[marker].search=document.forms["form"].elements["search" + marker].value; DoSearch(marker); } else { document.forms["form"].elements["search" + marker].value=search; routino.point[marker].search=search; } } // // Change of loop or reverse option in the form // function formSetLoopReverse(type,value) // called from router.html (with one argument) { if(value === undefined) value=document.forms["form"].elements[type].checked; document.forms["form"].elements[type].checked=value; if(type == "loop") routino.loop=value; else routino.reverse=value; updateURLs(true); } // // Format a number in printf("%.5f") format. // function format5f(number) { var newnumber=Math.floor(number*100000+0.5); var delta=0; if(newnumber>=0 && newnumber<100000) delta= 100000; if(newnumber<0 && newnumber>-100000) delta=-100000; var string=String(newnumber+delta); var intpart =string.substring(0,string.length-5); var fracpart=string.substring(string.length-5,string.length); if(delta>0) intpart="0"; if(delta<0) intpart="-0"; return(intpart + "." + fracpart); } // // Build a set of URL arguments // function buildURLArguments(lang) { var url= "transport=" + routino.transport; for(var marker=1;marker<=vismarkers;marker++) if(routino.point[marker].active) { url=url + ";lon" + marker + "=" + format5f(routino.point[marker].lon); url=url + ";lat" + marker + "=" + format5f(routino.point[marker].lat); if(routino.point[marker].search !== "") url=url + ";search" + marker + "=" + encodeURIComponent(routino.point[marker].search); } for(var key in routino.profile_highway) if(routino.profile_highway[key][routino.transport]!=routino_default.profile_highway[key][routino.transport]) url=url + ";highway-" + key + "=" + routino.profile_highway[key][routino.transport]; for(var key in routino.profile_speed) if(routino.profile_speed[key][routino.transport]!=routino_default.profile_speed[key][routino.transport]) url=url + ";speed-" + key + "=" + routino.profile_speed[key][routino.transport]; for(var key in routino.profile_property) if(routino.profile_property[key][routino.transport]!=routino_default.profile_property[key][routino.transport]) url=url + ";property-" + key + "=" + routino.profile_property[key][routino.transport]; for(var key in routino.restrictions) if(routino.profile_restrictions[key][routino.transport]!=routino_default.profile_restrictions[key][routino.transport]) url=url + ";" + key + "=" + routino.profile_restrictions[key][routino.transport]; if(routino.loop) url=url + ";loop=true"; if(routino.reverse) url=url + ";reverse=true"; if(lang && routino.language) url=url + ";language=" + routino.language; return(url); } // // Build a set of URL arguments for the map location // function buildMapArguments() { var lonlat = ol.proj.toLonLat(map.getView().getCenter()); var zoom = map.getView().getZoom(); if( ! Number.isInteger(zoom) ) zoom = format5f(zoom); return "lat=" + format5f(lonlat[1]) + ";lon=" + format5f(lonlat[0]) + ";zoom=" + zoom; } // // Update the URLs // function updateURLs(addhistory) { var urlargs =buildURLArguments(false); var mapargs =buildMapArguments(); var langargs="language=" + routino.language; var libargs =";library=" + mapprops.library; if(!mapprops.libraries) libargs=""; var links=document.getElementsByTagName("a"); for(var i=0; i=0; l--) { mapprops.mapdata[l].tiles.url=mapprops.mapdata[l].tiles.url.replace(/\$\{/g,"{"); var urls; if(mapprops.mapdata[l].tiles.subdomains===undefined) urls=[mapprops.mapdata[l].tiles.url]; else { urls=[]; for(var s=0; s" + data_text + ""; document.getElementById("attribution_tile").innerHTML="" + tile_text + ""; } change_attribution(0); // Define a GPX layer but don't add it yet layerGPX={shortest: null, quickest: null}; gpx_style={shortest: new ol.style.Style({stroke: new ol.style.Stroke({width: 3, color: "#00FF00"})}), quickest: new ol.style.Style({stroke: new ol.style.Stroke({width: 3, color: "#0000FF"})})}; // Add a markers vectors layer layerVectors = new ol.layer.Vector({source: new ol.source.Vector()}); map.addLayer(layerVectors); // A set of markers markers={}; markersmoved=false; paramschanged=false; for(var marker=1;marker<=mapprops.maxmarkers;marker++) { markers[marker] = new ol.Feature(); var style = new ol.style.Style({image: new ol.style.Icon({src: "icons/marker-" + marker + "-red.png", anchor: [0.5,1.0]})}); markers[marker].setStyle(style); } // A function to drag the markers var modify = new ol.interaction.Modify({source: layerVectors.getSource()}); map.addInteraction(modify); modify.on('modifyend', function(evt) { dragMarkerComplete(layerVectors.getSource().getClosestFeatureToCoordinate(evt.mapBrowserEvent.coordinate)); }); // Markers to highlight a selected point for(var highlight in highlights) { highlights[highlight] = new ol.Feature(); var style = new ol.style.Style({image: new ol.style.Circle({stroke: new ol.style.Stroke({width: 4, color: route_dark_colours[highlight]}), radius: 10})}); highlights[highlight].setStyle(style); layerVectors.getSource().addFeature(highlights[highlight]); } // A popup for routing results for(var popup in popups) popups[popup] = createPopup(popup); // Move the map map.on("moveend", (function() { updateURLs(false);}), map); var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon !== undefined && lat !== undefined && zoom !== undefined) { lat = Number(lat); lon = Number(lon); zoom = Number(zoom); if(lonmapprops.eastedge) lon=mapprops.eastedge; if(latmapprops.northedge) lat=mapprops.northedge; if(zoommapprops.zoomin) zoom=mapprops.zoomin; map.getView().setCenter(ol.proj.fromLonLat([lon,lat])); map.getView().setZoom(zoom); } else map.getView().fit(extent,map.getSize()); // Unhide editing URL if variable set if(mapprops.editurl !== undefined && mapprops.editurl !== "") { var edit_url=document.getElementById("edit_url"); edit_url.style.display=""; edit_url.href=mapprops.editurl; } updateURLs(false); } // // Callback for a marker drag occuring on the map. // function dragMarkerMove(feature) { for(var marker=1;marker<=mapprops.maxmarkers;marker++) if(feature==markers[marker]) dragMarkerSetForm(marker); } // // Callback for completing a marker drag on the map. // function dragMarkerComplete(feature) { for(var marker=1;marker<=mapprops.maxmarkers;marker++) if(feature==markers[marker]) dragMarkerSetForm(marker); updateURLs(true); } // // Set the feature coordinates in the form after dragging it on the map. // function dragMarkerSetForm(marker) { var lonlat = ol.proj.toLonLat(markers[marker].getGeometry().getFlatCoordinates()); formSetCoords(marker,lonlat[0],lonlat[1]); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Marker dragging //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// var dragged_waypoint=null,dragged_marker=null; var dragged_waypoint_over=null,dragged_marker_over=null; var dragged_icon_x,dragged_icon_y; // // Drag a waypoint up or down the list. // function dragWaypointStart(e) { var w=e.target; while(w!=null && w.className != "waypoint") w=w.parentElement; if(w===null) return; w.style.opacity = "0.5"; dragged_waypoint=w; dragged_marker=Number.parseInt(dragged_waypoint.id.substring(8)); dragged_icon_x=e.clientX-e.target.offsetLeft; dragged_icon_y=e.clientY-e.target.offsetTop; } function dragWaypointEnd(e) { e.preventDefault(); if(dragged_waypoint===null) return; dragged_waypoint.style.opacity = ""; dragged_waypoint=null; dragged_marker=null; if(dragged_waypoint_over===null) return; dragged_waypoint_over.style.border = ""; dragged_waypoint_over=null; dragged_marker_over=null; } // // Drag a waypoint over another one up or down the list. // function dragWaypointEnter(e) { var w=e.target; while(w!=null && w.className != "waypoint") w=w.parentElement; if(w===null) return; if(dragged_waypoint_over!==null) dragged_waypoint_over.style.border = ""; if(w==dragged_waypoint) return; dragged_waypoint_over=w; dragged_marker_over=Number.parseInt(dragged_waypoint_over.id.substring(8)); if(dragged_marker>dragged_marker_over) w.style.borderTop = "3px solid black"; else w.style.borderBottom = "3px solid black"; } function dragWaypointOver(e) { e.preventDefault(); } function dragWaypointLeave(e) { var w=e.target; while(w!=null && w.className != "waypoint") w=w.parentElement; if(w===null) return; if(w==dragged_waypoint_over) return; w.style.border = ""; } // // Drop the waypoint after dragging up or down the list. // function dragWaypointDrop(e) { e.preventDefault(); if(dragged_marker_over===null) return; if(dragged_marker_over>dragged_marker) for(var m=dragged_marker;mdragged_marker_over;m--) markerSwap(m,m-1); } // // Drag a waypoint over the map. // function dragWaypointMapEnter(e) { e.preventDefault(); if(dragged_waypoint_over!==null) dragged_waypoint_over.style.border = ""; } function dragWaypointMapOver(e) { e.preventDefault(); } function dragWaypointMapLeave(e) { e.preventDefault(); } // // Drop the waypoint after dragging it over the map. // function dragWaypointMapDrop(e) { e.preventDefault(); var rect = document.getElementById("map").getBoundingClientRect(); var coord = map.getCoordinateFromPixel([e.clientX-rect.left-window.scrollX-dragged_icon_x+8, e.clientY-rect.top -window.scrollY-dragged_icon_y+21]); var lonlat = ol.proj.toLonLat(coord); formSetCoords(dragged_marker,lonlat[0],lonlat[1]); if(!routino.point[dragged_marker].active) markerToggleMap(dragged_marker); if(routino.point[dragged_marker].search=="") markerCoords(dragged_marker); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Marker handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Toggle a marker on the map. // function markerToggleMap(marker) // called from router.html { if(!routino.point[marker].used) { routino.point[marker].used=true; markerCentre(marker); markerCoords(marker); } markerAddRemoveMap(marker,!routino.point[marker].active); } // // Show or hide a marker on the map. // function markerAddRemoveMap(marker,active) { if(active) markerAddMap(marker); else markerRemoveMap(marker); } // // Show a marker on the map. // function markerAddMap(marker) { clearSearchResult(marker); if(!layerVectors.getSource().hasFeature(markers[marker])) layerVectors.getSource().addFeature(markers[marker]); routino.point[marker].active=true; routino.point[marker].used=true; updateIcon(marker); markersmoved=true; updateURLs(true); updateSearchButtons(); } // // Remove a marker from the map. // function markerRemoveMap(marker) { clearSearchResult(marker); if(layerVectors.getSource().hasFeature(markers[marker])) layerVectors.getSource().removeFeature(markers[marker]); routino.point[marker].active=false; updateIcon(marker); markersmoved=true; updateURLs(true); updateSearchButtons(); } // // Display search string for the marker // function markerSearch(marker) // called from router.html { clearSearchResult(marker); document.getElementById("coords" + marker).style.display="none"; document.getElementById("search" + marker).style.display=""; } // // Display coordinates for the marker // function markerCoords(marker) // called from router.html { clearSearchResult(marker); document.getElementById("search" + marker).style.display="none"; document.getElementById("coords" + marker).style.display=""; } // // Centre the marker on the map // function markerCentre(marker) // called from router.html { if(!routino.point[marker].used) return; clearSearchResult(marker); var lonlat = ol.proj.toLonLat(map.getView().getCenter()); formSetCoords(marker,lonlat[0],lonlat[1]); } // // Centre the map on the marker // function markerRecentre(marker) // called from router.html { if(!routino.point[marker].used) return; clearSearchResult(marker); var lon=Number(routino.point[marker].lon); var lat=Number(routino.point[marker].lat); var lonlat = ol.proj.fromLonLat([lon,lat]); map.getView().setCenter(lonlat); } // // Clear the current marker. // function markerRemove(marker) // called from router.html { clearSearchResult(marker); for(var m=marker;mmarker;m--) markerCopy(m,m-1); markerClearForm(marker-1); } // // Add a marker after the current one. // function markerAddAfter(marker) // called from router.html { if(vismarkers==mapprops.maxmarkers) return false; clearSearchResult(marker); markerAddForm(++vismarkers); for(var m=vismarkers;m>(marker+1);m--) markerCopy(m,m-1); markerClearForm(marker+1); } // // Set this marker as the home location. // function markerHome(marker) // called from router.html { if(!routino.point[marker].used) { markerMoveHome(marker); } else { clearSearchResult(marker); markerSetClearHome(marker,!routino.point[marker].home); } } // // Set this marker as the current location. // function markerLocate(marker) // called from router.html { clearSearchResult(marker); function success(position) { formSetCoords(marker,position.coords.longitude,position.coords.latitude); markerAddMap(marker); } function failure(error) { alert("Error: " + error.message); } if(navigator.geolocation) navigator.geolocation.getCurrentPosition(success,failure); else alert("Error: Geolocation unavailable"); } // // Update the search buttons enable/disable. // function updateSearchButtons() { var markersactive=0; for(var m=1;m<=vismarkers;m++) if(routino.point[m].active) markersactive++; if(markersactive<2) { document.getElementById("shortest1").disabled="disabled"; document.getElementById("quickest1").disabled="disabled"; document.getElementById("shortest2").disabled="disabled"; document.getElementById("quickest2").disabled="disabled"; } else { document.getElementById("shortest1").disabled=""; document.getElementById("quickest1").disabled=""; document.getElementById("shortest2").disabled=""; document.getElementById("quickest2").disabled=""; } } // // Update an icon to set colours and home or normal marker. // function updateIcon(marker) { if(routino.point[marker].home) { if(routino.point[marker].active) document.getElementById("icon" + marker).src="icons/marker-home-red.png"; else document.getElementById("icon" + marker).src="icons/marker-home-grey.png"; var style = new ol.style.Style({image: new ol.style.Icon({src: "icons/marker-home-red.png", anchor: [0.5,1.0]})}); markers[marker].setStyle(style); } else { if(routino.point[marker].active) document.getElementById("icon" + marker).src="icons/marker-" + marker + "-red.png"; else document.getElementById("icon" + marker).src="icons/marker-" + marker + "-grey.png"; var style = new ol.style.Style({image: new ol.style.Icon({src: "icons/marker-" + marker + "-red.png", anchor: [0.5,1.0]})}); markers[marker].setStyle(style); } } // // Move the marker to the home location // function markerMoveHome(marker) { if(homelon===null || homelat===null) return; routino.point[marker].home=true; routino.point[marker].used=true; formSetCoords(marker,homelon,homelat); markerAddMap(marker); } // // Set or clear the home marker icon // function markerSetClearHome(marker,home) { var cookie; var date = new Date(); if(home) { homelat=format5f(routino.point[marker].lat); homelon=format5f(routino.point[marker].lon); cookie="Routino-home=lon:" + homelon + ":lat:" + homelat; date.setUTCFullYear(date.getUTCFullYear()+5); routino.point[marker].home=true; } else { homelat=null; homelon=null; cookie="Routino-home="; date.setUTCFullYear(date.getUTCFullYear()-1); routino.point[marker].home=false; } document.cookie=cookie + ";Expires=" + date.toGMTString() + ";SameSite=Strict"; updateIcon(marker); for(var m=1;m<=mapprops.maxmarkers;m++) markerCheckHome(m); } // // Check if a marker is the home marker // function markerCheckHome(marker) { var home=routino.point[marker].home; if(routino.point[marker].lon==homelon && routino.point[marker].lat==homelat) routino.point[marker].home=true; else routino.point[marker].home=false; if(home!=routino.point[marker].home) updateIcon(marker); } // // Move this marker up. // function markerMoveUp(marker) // called from router.html { if(marker==1) { for(var m=1;m1;m--) markerSwap(m,m-1); } else markerSwap(marker,marker+1); } // // Copy a marker from one place to another. // function markerCopy(marker1,marker2) { for(var element in routino.point[marker2]) routino.point[marker1][element]=routino.point[marker2][element]; document.getElementById("search" + marker1).style.display=document.getElementById("search" + marker2).style.display; document.getElementById("coords" + marker1).style.display=document.getElementById("coords" + marker2).style.display; document.forms["form"].elements["search" + marker1].value=document.forms["form"].elements["search" + marker2].value; formSetCoords(marker1,routino.point[marker1].lon,routino.point[marker1].lat); markerAddRemoveMap(marker1,routino.point[marker1].active); } // // Swap a pair of markers. // function markerSwap(marker1,marker2) { for(var element in routino.point[marker2]) { var temp=routino.point[marker1][element]; routino.point[marker1][element]=routino.point[marker2][element]; routino.point[marker2][element]=temp; } var search_display=document.getElementById("search" + marker1).style.display; document.getElementById("search" + marker1).style.display=document.getElementById("search" + marker2).style.display; document.getElementById("search" + marker2).style.display=search_display; var coords_display=document.getElementById("coords" + marker1).style.display; document.getElementById("coords" + marker1).style.display=document.getElementById("coords" + marker2).style.display; document.getElementById("coords" + marker2).style.display=coords_display; var search_value=document.forms["form"].elements["search" + marker1].value; document.forms["form"].elements["search" + marker1].value=document.forms["form"].elements["search" + marker2].value; document.forms["form"].elements["search" + marker2].value=search_value; formSetCoords(marker1,routino.point[marker1].lon,routino.point[marker1].lat); formSetCoords(marker2,routino.point[marker2].lon,routino.point[marker2].lat); markerAddRemoveMap(marker1,routino.point[marker1].active); markerAddRemoveMap(marker2,routino.point[marker2].active); } // // Reverse the markers. // function markersReverse() // called from router.html { for(var marker=1;marker<=vismarkers/2;marker++) markerSwap(marker,vismarkers+1-marker); markersmoved=true; updateURLs(true); } // // Close the loop. // function markersLoop() // called from router.html { if(vismarkers==mapprops.maxmarkers) return false; if(routino.point[vismarkers].lon==routino.point[1].lon && routino.point[vismarkers].lat==routino.point[1].lat) { if(routino.point[vismarkers].active) return false; else { markerToggleMap(vismarkers); return true; } } if(routino.point[vismarkers].used) markerAddForm(++vismarkers); markerCopy(vismarkers,1); markersmoved=true; updateURLs(true); updateSearchButtons(); } // // Display the form for a marker // function markerAddForm(marker) { document.getElementById("waypoint" + marker).style.display=""; } // // Hide the form for a marker // function markerRemoveForm(marker) { document.getElementById("waypoint" + marker).style.display="none"; markerClearForm(marker); } // // Clear the form for a marker // function markerClearForm(marker) { markerRemoveMap(marker); markerSearch(marker); formSetCoords(marker,"",""); formSetSearch(marker,""); updateIcon(marker); routino.point[marker].used=false; routino.point[marker].home=false; routino.point[marker].active=false; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////// Route results handling //////////////////////////// //////////////////////////////////////////////////////////////////////////////// var route_light_colours={shortest: "#60C060", quickest: "#6060C0"}; var route_dark_colours ={shortest: "#408040", quickest: "#404080"}; var highlights={shortest: null, quickest: null}; var popups={shortest: null, quickest: null}; var routepoints={shortest: {}, quickest: {}}; var gpx_style={shortest: null, quickest: null}; // // Highlight a specific item in the route // function highlight(type,line,action) { if(action == "clear") { if(layerVectors.getSource().hasFeature(highlights[type])) layerVectors.getSource().removeFeature(highlights[type]); drawPopup(type,null); } else if(action == "zoom") { var lonlat = ol.proj.fromLonLat([routepoints[type][line].lon,routepoints[type][line].lat]); map.getView().setCenter(lonlat); map.getView().setZoom(mapprops.zoomin-2); } else { // Marker var lonlat = ol.proj.fromLonLat([routepoints[type][line].lon,routepoints[type][line].lat]); highlights[type].setGeometry(new ol.geom.Point(lonlat)); if(!layerVectors.getSource().hasFeature(highlights[type])) layerVectors.getSource().addFeature(highlights[type]); // Popup drawPopup(type,"" + routepoints[type][line].html + "
"); } } // // Create a popup - independent of map because want it fixed on screen not fixed on map. // function createPopup(type) { var popup=document.createElement("div"); popup.className = "popup"; popup.innerHTML = ""; popup.style.display = "none"; popup.style.position = "fixed"; popup.style.top = "-4000px"; popup.style.left = "-4000px"; popup.style.zIndex = "100"; popup.style.padding = "5px"; popup.style.opacity=0.85; popup.style.backgroundColor=route_light_colours[type]; popup.style.border="4px solid " + route_dark_colours[type]; document.body.appendChild(popup); return(popup); } // // Draw a popup - independent of map because want it fixed on screen not fixed on map. // function drawPopup(type,html) { var popup=popups[type]; if(html===null) { popup.style.display="none"; return; } if(popup.style.display=="none") { var map_div=document.getElementById("map"); popup.style.left =map_div.offsetParent.offsetLeft+map_div.offsetLeft+60 + "px"; popup.style.top = map_div.offsetTop +30 + "px"; popup.style.width =map_div.clientWidth-120 + "px"; popup.style.display=""; } var close="X"; popup.innerHTML=close+html; } // // Remove a GPX trace // function removeGPXTrace(type) { map.removeLayer(layerGPX[type]); layerGPX[type]=null; displayStatus(type,"no_info"); document.getElementById(type + "_links").style.display = "none"; document.getElementById(type + "_route").innerHTML = ""; hideshow_hide(type); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Server handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Define an AJAX request object // function ajaxGET(url,success,failure,state) { var ajaxRequest=new XMLHttpRequest(); function ajaxGOT(options) { if(this.readyState==4) if(this.status==200) { if(typeof(options.success)=="function") options.success(this,options.state); } else { if(typeof(options.failure)=="function") options.failure(this,options.state); } } ajaxRequest.onreadystatechange = function(){ ajaxGOT.call(ajaxRequest,{success: success, failure: failure, state: state}); }; ajaxRequest.open("GET", url, true); ajaxRequest.send(null); } // // Display data statistics // function displayStatistics() // called from router.html { // Use AJAX to get the statistics ajaxGET("statistics.cgi", runStatisticsSuccess); } // // Success in running data statistics generation. // function runStatisticsSuccess(response) { document.getElementById("statistics_data").innerHTML="
" + response.responseText + "
"; document.getElementById("statistics_link").style.display="none"; } // // Submit form - perform the routing // function findRoute(type) // called from router.html { tab_select("results"); hideshow_hide("help_options"); hideshow_hide("shortest"); hideshow_hide("quickest"); displayStatus("result","running"); var url="router.cgi" + "?" + buildURLArguments(true) + ";type=" + type; // Destroy the existing layer(s) highlight("shortest",-1,"clear"); highlight("quickest",-1,"clear"); if(markersmoved || paramschanged) { if(layerGPX.shortest!==null) removeGPXTrace("shortest"); if(layerGPX.quickest!==null) removeGPXTrace("quickest"); markersmoved=false; paramschanged=false; } else if(layerGPX[type]!==null) removeGPXTrace(type); // Use AJAX to run the router routing_type=type; ajaxGET(url, runRouterSuccess, runRouterFailure); } // // Success in running router. // function runRouterSuccess(response) { var lines=response.responseText.split("\n"); var uuid=lines[0]; var success=lines[1]; var link; // Update the status message if(success=="ERROR") { displayStatus("result","error"); hideshow_show("help_route"); link=document.getElementById("router_log_error"); link.href="results.cgi?uuid=" + uuid + ";type=router;format=log"; return; } else { displayStatus("result","complete"); hideshow_hide("help_route"); link=document.getElementById("router_log_complete"); link.href="results.cgi?uuid=" + uuid + ";type=router;format=log"; } // Update the routing result message link=document.getElementById(routing_type + "_html"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=html"; link=document.getElementById(routing_type + "_gpx_track"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=gpx-track"; link=document.getElementById(routing_type + "_gpx_route"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=gpx-route"; link=document.getElementById(routing_type + "_text_all"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=text-all"; link=document.getElementById(routing_type + "_text"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=text"; document.getElementById(routing_type + "_links").style.display = ""; // Add a GPX layer var url="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=gpx-track"; layerGPX[routing_type] = new ol.layer.Vector({source: new ol.source.Vector({url: url, format: new ol.format.GPX()}), style: gpx_style[routing_type]}); map.addLayer(layerGPX[routing_type]); hideshow_show(routing_type); displayResult(routing_type,uuid); } // // Failure in running router. // function runRouterFailure(response) { displayStatus("result","failed"); } // // Display the status // function displayStatus(type,subtype,content) { var child=document.getElementById(type + "_status").firstChild; do { if(child.id !== undefined) child.style.display="none"; child=child.nextSibling; } while(child !== null); var chosen_status=document.getElementById(type + "_status_" + subtype); chosen_status.style.display=""; if(content !== undefined) chosen_status.innerHTML=content; } // // Display the route // function displayResult(type,uuid) { routing_type = type; // Add the route var url="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=html"; // Use AJAX to get the route ajaxGET(url, getRouteSuccess, getRouteFailure); } // // Success in getting route. // function getRouteSuccess(response) { var lines=response.responseText.split("\n"); routepoints[routing_type]=[]; var points=routepoints[routing_type]; var table=0; var point=0; var total_table,total_word; for(var line=0;line")) table=1; else continue; } if(thisline.match("
")) break; if(thisline.match("")) { var rowtype=RegExp.$1; if(rowtype=="c") { thisline.match(": *([-0-9.]+) *([-0-9.]+)"); points[point]={lat: Number(RegExp.$1), lon: Number(RegExp.$2), html: "", highway: "", distance: "", total: ""}; point++; } else if(rowtype=="n") { points[point-1].html += thisline; } else if(rowtype=="s") { thisline.match("([^<]+)"); points[point-1].highway = RegExp.$1; thisline.match("([^<]+)"); points[point-1].distance = RegExp.$1; thisline.match("([^<]+)"); points[point-1].total = RegExp.$1; thisline.match("^(.*)."); points[point-1].html += RegExp.$1; } else if(rowtype=="t") { points[point-1].html += thisline; thisline.match("([^<]+)"); points[point-1].total = RegExp.$1; thisline.match("(.*)"); points[point-1].highway = RegExp.$1; } } } displayStatus(routing_type,"info",points[point-1].total.bold()); var result=""; for(var p=0;p" + "
#" + (p+1) + "" + points[p].highway; } result=result + "
"; document.getElementById(routing_type + "_route").innerHTML=result; } // // Failure in getting route. // function getRouteFailure(response) { document.getElementById(routing_type + "_route").innerHTML = ""; } // // Perform a search // function DoSearch(marker) { // Use AJAX to get the search result var search=routino.point[marker].search; var mapbounds=map.calculateExtent(); var url="search.cgi"; url=url + "?marker=" + marker; url=url + ";lonmin=" + format5f(ol.proj.toLonLat([mapbounds[0],mapbounds[1]])[0]); url=url + ";latmin=" + format5f(ol.proj.toLonLat([mapbounds[0],mapbounds[1]])[1]); url=url + ";lonmax=" + format5f(ol.proj.toLonLat([mapbounds[2],mapbounds[3]])[0]); url=url + ";latmax=" + format5f(ol.proj.toLonLat([mapbounds[2],mapbounds[3]])[1]); url=url + ";search=" + encodeURIComponent(search); ajaxGET(url,runSearchSuccess); } var searchresults=[]; // // Success in running search. // function runSearchSuccess(response) { var lines=response.responseText.split("\n"); var marker=lines[0]; var cpuinfo=lines[1]; // not used var message=lines[2]; if(message !== "") { alert(message); return; } searchresults[marker]=[]; for(var line=3;line"; for(var n=0;n0) innerHTML+="
"; innerHTML+="" + searchresults[marker][n].name + ""; } results.innerHTML=innerHTML; results.style.display=""; } } // // Display search results. // function choseSearchResult(marker,n) { if(n>=0) { formSetSearch(marker,searchresults[marker][n].name); formSetCoords(marker,searchresults[marker][n].lon,searchresults[marker][n].lat); markerAddMap(marker); } } // // Clear search results. // function clearSearchResult(marker) { document.getElementById("searchresults" + marker).style.display="none"; } routino-3.4.3/web/www/routino/visualiser.html.de 644 233 144 54603 14774263773 15207 0 Routino : Visualisierung der Routing-Daten
Visualiser Router Data
Routino Ansichten Diese Webseite erlaubt die Visualisierung der Daten, die Routine für das Berechnen der Route nutzt. Nur die relevanten Daten für die Berechnung der Routen werden dargestellt, daher werden einige ausgeschlossen.
Anweisungen Zoomen Sie in die Karte und nutzen Sie den Knöpfe unten um die Daten herunter zu laden. Der Server liefert nur ein Ergebnis, wenn das ausgewählte Feld klein genug ist.
Status
Keine Daten angezeigt
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Hilfe
Schnellstart
Vergrößer ein Gebiet und nutze einen der Schaltknöpfe, um die entsprechenden Daten anzuzeigen.
Durch aufklappen der Details unter jedem Schaltknopf können mehr Datenoptionen angezeigt werden.

Data Failure
Wenn das ausgewählte Gebiet zu groß ist (hängt vom Datentyp ab), dann zeigt der Status "Failed to get visualiser data" (Visualiserungsdaten unmöglich zu bekommen) - vergrößer und versuch es noch einmal.

Router: Routino | Geodaten: | Kacheln:
routino-3.4.3/web/www/routino/router.pl 644 233 144 12263 13143556741 13402 0# # Routino generic router Perl script # # Part of the Routino routing software. # # This file Copyright 2008-2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Use the directory paths script require "./paths.pl"; # Load the profiles variables require "./profiles.pl"; # Use the perl Time::HiRes module use Time::HiRes qw(gettimeofday tv_interval); my $t0 = [gettimeofday]; # # Fill in the default parameters using the ones above (don't use executable compiled in defaults) # sub FillInDefaults { my(%params)=@_; $params{transport}=$main::routino->{transport} if(!defined $params{transport}); my $transport=$params{transport}; foreach my $highway (keys %{$main::routino->{highways}}) { my $key="highway-$highway"; my $value=$main::routino->{profile_highway}->{$highway}->{$transport}; $params{$key}=$value if(!defined $params{$key}); $key="speed-$highway"; $value=$main::routino->{profile_speed}->{$highway}->{$transport}; $params{$key}=$value if(!defined $params{$key}); } foreach my $property (keys %{$main::routino->{properties}}) { my $key="property-$property"; my $value=$main::routino->{profile_property}->{$property}->{$transport}; $params{$key}=$value if(!defined $params{$key}); } $params{oneway} =~ s/(true|on)/1/; $params{oneway} =~ s/(false|off)/0/; $params{turns} =~ s/(true|on)/1/; $params{turns} =~ s/(false|off)/0/; $params{loop} =~ s/(true|on)/1/; $params{loop} =~ s/(false|off)/0/; $params{reverse} =~ s/(true|on)/1/; $params{reverse} =~ s/(false|off)/0/; foreach my $restriction (keys %{$main::routino->{restrictions}}) { my $key="$restriction"; my $value=$main::routino->{profile_restrictions}->{$restriction}->{$transport}; $params{$key}=$value if(!defined $params{$key}); } return %params; } # # Run the router # sub RunRouter { my($optimise,%params)=@_; # Combine all of the parameters together my $params="--$optimise"; foreach my $key (keys %params) { $params.=" --$key=$params{$key}"; } # Change directory mkdir $main::results_dir,0755 if(! -d $main::results_dir); chdir $main::results_dir; # Create a unique output directory my $uuid; if($^O eq "darwin") { chomp($uuid=`echo '$params' $$ | md5 | cut -f1 '-d '`); } else { chomp($uuid=`echo '$params' $$ | md5sum | cut -f1 '-d '`); } mkdir $uuid; chmod 0775, $uuid; chdir $uuid; # Run the router my $safe_params =""; if($main::data_dir) { my @pathparts=split('/',$main::data_dir); $safe_params.=" --dir=".pop(@pathparts); } # This works in newer Perl versions, but not older ones. #$safe_params.=" --dir=".pop([split('/',$main::data_dir)]) if($main::data_dir); $safe_params.=" --prefix=$main::data_prefix" if($main::data_prefix); open(LOG,">router.log"); print LOG "$main::router_exe $params$safe_params\n\n"; # Don't put the full pathnames in the logfile. close(LOG); $params.=" --dir=$main::data_dir" if($main::data_dir); $params.=" --prefix=$main::data_prefix" if($main::data_prefix); $params.=" --loggable"; system "$main::bin_dir/$main::router_exe $params >> router.log 2>&1"; my $status="OK"; $status="ERROR" if($? != 0); my(undef,undef,$cuser,$csystem) = times; open(LOG,">>router.log"); printf LOG "\nTime: %.3f CPU / %.3f elapsed\n",$cuser+$csystem,tv_interval($t0); close(LOG); # Return the results return($uuid,$status); } # # Return the output file # # Possible file formats my %suffixes=( "html" => ".html", "gpx-route" => "-route.gpx", "gpx-track" => "-track.gpx", "text" => ".txt", "text-all" => "-all.txt", "log" => ".log" ); # Possible MIME types my %mimetypes=( "html" => "text/html", "gpx-route" => "text/xml", "gpx-track" => "text/xml", "text" => "text/plain", "text-all" => "text/plain", "log" => "text/plain" ); sub ReturnOutput { my($uuid,$type,$format)=@_; if($type eq "router") { $format="log" } my $suffix=$suffixes{$format}; my $mime =$mimetypes{$format}; my $file="$main::results_dir/$uuid/$type$suffix"; # Return the output if(!$type || !$uuid || !$format || ! -f $file) { print header('text/plain','404 Not found'); print "Not Found!\n"; } else { print header($mime); system "cat $file"; } } 1; routino-3.4.3/web/www/routino/search.pl 644 233 144 5070 12767517266 13317 0# # Routino generic Search Perl script # # Part of the Routino routing software. # # This file Copyright 2012-2014, 2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Use the directory paths script require "./paths.pl"; # Use the perl encoding/decoding functions use Encode qw(decode encode); # Use the perl URI module use URI::Escape; # Use the perl LWP module use LWP::UserAgent; # Use the perl JSON module use JSON::PP; # Use the perl Time::HiRes module use Time::HiRes qw(gettimeofday tv_interval); my $t0 = [gettimeofday]; # # Run the search # sub RunSearch { my($search,$lonmin,$lonmax,$latmax,$latmin)=@_; # Perform the search based on the type my $message=""; my @places=[]; if($main::search_type eq "nominatim") { ($message,@places)=DoNominatimSearch($search,$lonmin,$lonmax,$latmax,$latmin); } else { $message="Unknown search type '$main::search_type'"; } my(undef,undef,$cuser,$csystem) = times; my $time=sprintf "time: %.3f CPU / %.3f elapsed",$cuser+$csystem,tv_interval($t0); # Return the results return($time,$message,@places); } # # Fetch the search URL from Nominatim # sub DoNominatimSearch { my($search,$lonmin,$lonmax,$latmax,$latmin)=@_; $search = uri_escape($search); my $url; if($lonmin && $lonmax && $latmax && $latmin) { $url="$main::search_baseurl?format=json&viewbox=$lonmin,$latmax,$lonmax,$latmin&q=$search"; } else { $url="$main::search_baseurl?format=json&q=$search"; } my $ua=LWP::UserAgent->new; my $res=$ua->get($url); if(!$res->is_success) { return($res->status_line); } my $result=decode_json($res->content); my @places=(); foreach my $place (@$result) { my $lat=$place->{"lat"}; my $lon=$place->{"lon"}; my $name=encode('utf8',$place->{"display_name"}); push(@places,"$lat $lon $name"); } return("",@places); } 1; routino-3.4.3/web/www/routino/visualiser.cgi 755 233 144 7743 12767517352 14377 0#!/usr/bin/perl # # Routino data visualiser CGI # # Part of the Routino routing software. # # This file Copyright 2008-2014, 2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Use the directory paths script require "./paths.pl"; # Use the perl CGI module use CGI ':cgi'; # Create the query and get the parameters my $query=new CGI; my @rawparams=$query->param; # Legal CGI parameters with regexp validity check my %legalparams=( "latmin" => "[-0-9.]+", "latmax" => "[-0-9.]+", "lonmin" => "[-0-9.]+", "lonmax" => "[-0-9.]+", "data" => "(junctions|super|waytype-.*|highway-.*|transport-.*|barrier-.*|turns|speed|weight|height|width|length|property-.*|errorlogs)", "dump" => "(node|segment|turn-relation|errorlog)[0-9]+" ); # Validate the CGI parameters, ignore invalid ones my %cgiparams=(); foreach my $key (@rawparams) { foreach my $test (keys (%legalparams)) { if($key =~ m%^$test$%) { my $value=$query->param($key); if($value =~ m%^$legalparams{$test}$%) { $cgiparams{$key}=$value; last; } } } } # Data or dump? my $params=""; my $data=$cgiparams{"data"}; my $dump=$cgiparams{"dump"}; if(!defined $data && !defined $dump) { print header(-status => '500 Invalid CGI parameters'); exit; } if(defined $data) { # Parameters to limit range selected my %limits=( "junctions" => 0.2, "super" => 0.2, "waytype" => 0.2, "highway" => 0.2, "transport" => 0.2, "barrier" => 0.3, "turns" => 0.3, "speed" => 0.3, "weight" => 0.3, "height" => 0.3, "width" => 0.3, "length" => 0.3, "property" => 0.3, "errorlogs" => 0.5 ); # Check the parameters my $latmin=$cgiparams{"latmin"}; my $latmax=$cgiparams{"latmax"}; my $lonmin=$cgiparams{"lonmin"}; my $lonmax=$cgiparams{"lonmax"}; if($latmin eq "" || $latmax eq "" || $lonmin eq "" || $lonmax eq "" || $data eq "") { print header(-status => '500 Invalid CGI parameters'); exit; } my $subdata=$data; $subdata="waytype" if($data =~ m%waytype-%); $subdata="highway" if($data =~ m%highway-%); $subdata="transport" if($data =~ m%transport-%); $subdata="barrier" if($data =~ m%barrier-%); $subdata="property" if($data =~ m%property-%); if(($latmax-$latmin)>$limits{$subdata} || ($lonmax-$lonmin)>$limits{$subdata}) { print header(-status => '500 Selected area too large'); exit; } # Print the output print header('text/plain'); print "$latmin $lonmin $latmax $lonmax\n"; # Set the parameters $params.=" --visualiser --data=$data"; $params.=" --latmin=$latmin --latmax=$latmax --lonmin=$lonmin --lonmax=$lonmax"; } else { # Print the output print header('text/plain'); # Set the parameters $params.=" --dump-visualiser --data=$dump"; } # Run the filedumper $params.=" --dir=$main::data_dir" if($main::data_dir); $params.=" --prefix=$main::data_prefix" if($main::data_prefix); system "$main::bin_dir/$main::filedumper_exe $params 2>&1"; routino-3.4.3/web/www/routino/search.cgi 755 233 144 4305 13143557265 13441 0#!/usr/bin/perl # # Routino search results retrieval CGI # # Part of the Routino routing software. # # This file Copyright 2012-2014, 2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Use the generic search script require "./search.pl"; # Use the perl CGI module use CGI ':cgi'; # Create the query and get the parameters my $query=new CGI; my @rawparams=$query->param; # Legal CGI parameters with regexp validity check my %legalparams=( "marker" => "[0-9]+", "lonmin" => "[-0-9.]+", "lonmax" => "[-0-9.]+", "latmax" => "[-0-9.]+", "latmin" => "[-0-9.]+", "search" => ".+" ); # Validate the CGI parameters, ignore invalid ones my %cgiparams=(); foreach my $key (@rawparams) { foreach my $test (keys (%legalparams)) { if($key =~ m%^$test$%) { my $value=$query->param($key); if($value =~ m%^$legalparams{$test}$%) { $cgiparams{$key}=$value; last; } } } } # Parse the parameters my $marker=$cgiparams{marker}; my $search=$cgiparams{search}; my $lonmin=$cgiparams{lonmin}; my $lonmax=$cgiparams{lonmax}; my $latmax=$cgiparams{latmax}; my $latmin=$cgiparams{latmin}; # Run the search my($search_time,$search_message,@places)=RunSearch($search,$lonmin,$lonmax,$latmax,$latmin); # Return the output print header(-type=>'text/plain',-charset=>'utf-8'); print "$marker\n"; print "$search_time\n"; print "$search_message\n"; foreach my $place (@places) { print "$place\n"; } routino-3.4.3/web/www/routino/visualiser.html.hu 644 233 144 55261 14774263774 15235 0 Routino : Az útvonal-tervezési adatok megjelenítője
Visualiser Router Data
Routino megjelenítő Ezen a weboldalon vizuálisan is megjeleníthetők azok az adatok, amelyeket a Routino használ az útvonaltervezéshez. Csak az út szempontjából fontos adatok jelennek meg, így az adatok egy része ki van zárva.
Használati utasítás Nagyíts, majd használd az alábbi gombokat az adatok letöltéséhez. A kiszolgáló csak akkor küld adatokat, ha a kijelölt terület elég kicsi.
Ãllapot
Nincs megjelenített adat
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Súgó
Rövid útmutató
Az adatok típusának megjelenítéséhez nagyíts egy területre, és jelöld ki az egyik gombot.
További adatbeállításokat találhatunk, ha kinyitjuk az egyes gombok alatti részleteket.

Adatkudarc
Ha a kijelölt terület túl nagy (adattípusfüggÅ‘), akkor a státusz azt fogja kiírni, hogy „A megjelenítÅ‘ adatait nem sikerült betölteniâ€. Ilyenkor nagyítsunk rá jobban a területre, és próbáljuk meg újra.

Útvonaltervező: Routino | Geo Data: | Mozaikok:
routino-3.4.3/web/www/routino/router.leaflet.js 644 233 144 152305 13756466616 15053 0// // Routino router web page Javascript // // Part of the Routino routing software. // // This file Copyright 2008-2020 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // var vismarkers, markers, icons, markersmoved, paramschanged; var homelat=null, homelon=null; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Initialisation ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Make a deep copy of the routino profile. var routino_default={}; for(var l1 in routino) if(typeof(routino[l1])!="object") routino_default[l1]=routino[l1]; else { routino_default[l1]={}; for(var l2 in routino[l1]) if(typeof(routino[l1][l2])!="object") routino_default[l1][l2]=Number(routino[l1][l2]); else { routino_default[l1][l2]={}; for(var l3 in routino[l1][l2]) routino_default[l1][l2][l3]=Number(routino[l1][l2][l3]); } } // Store the latitude and longitude in the routino variable routino.point=[]; for(var marker=1;marker<=mapprops.maxmarkers;marker++) { routino.point[marker]={}; routino.point[marker].lon=""; routino.point[marker].lat=""; routino.point[marker].search=""; routino.point[marker].active=false; routino.point[marker].used=false; routino.point[marker].home=false; } // Process the URL query string and extract the arguments var legal={"^lon" : "^[-0-9.]+$", "^lat" : "^[-0-9.]+$", "^zoom" : "^[-0-9.]+$", "^lon[1-9]" : "^[-0-9.]+$", "^lat[1-9]" : "^[-0-9.]+$", "^search[1-9]" : "^.+$", "^transport" : "^[a-z]+$", "^highway-[a-z]+" : "^[0-9.]+$", "^speed-[a-z]+" : "^[0-9.]+$", "^property-[a-z]+" : "^[0-9.]+$", "^oneway" : "^(1|0|true|false|on|off)$", "^turns" : "^(1|0|true|false|on|off)$", "^weight" : "^[0-9.]+$", "^height" : "^[0-9.]+$", "^width" : "^[0-9.]+$", "^length" : "^[0-9.]+$", "^language" : "^[-a-zA-Z]+$", "^reverse" : "(1|0|true|false|on|off)", "^loop" : "(1|0|true|false|on|off)"}; var args={}; if(location.search.length>1) { var query,queries; query=location.search.replace(/^\?/,""); query=query.replace(/;/g,"&"); queries=query.split("&"); for(var i=0;i=1;marker--) { var lon=args["lon" + marker]; var lat=args["lat" + marker]; var search=args["search" + marker]; if(lon !== undefined && lat !== undefined && search !== undefined && lon !== "" && lat !== "" && search !== "") { markerAddForm(marker); formSetSearch(marker,search); formSetCoords(marker,lon,lat); lat=Number(lat); lon=Number(lon); if(latmaxlat) maxlat=lat; if(lonmaxlon) maxlon=lon; markerAddMap(marker); markerSearch(marker); vismarkers++; urlmarkers++; } else if(lon !== undefined && lat !== undefined && lon !== "" && lat !== "") { markerAddForm(marker); formSetCoords(marker,lon,lat); lat=Number(lat); lon=Number(lon); if(latmaxlat) maxlat=lat; if(lonmaxlon) maxlon=lon; markerAddMap(marker); markerCoords(marker); vismarkers++; urlmarkers++; } else if(search !== undefined && search !== "") { markerAddForm(marker); formSetSearch(marker,search); markerSearch(marker); DoSearch(marker); vismarkers++; } else if(vismarkers || marker<=2) { markerAddForm(marker); vismarkers++; } var searchfield=document.forms["form"].elements["search" + marker]; if(searchfield.addEventListener) searchfield.addEventListener("keyup", searchOnReturnKey, false); else if(searchfield.attachEvent) searchfield.attachEvent("keyup", searchOnReturnKey); // Internet Explorer } if(args["loop"] !== undefined) formSetLoopReverse("loop",args["loop"]); else formSetLoopReverse("loop",false); if(args["reverse"] !== undefined) formSetLoopReverse("reverse",args["reverse"]); else formSetLoopReverse("reverse",false); // Zoom the map if(urlmarkers>1) { var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon === undefined || lat === undefined || zoom === undefined) { var deltalon = 0.025 * ( maxlon - minlon ); var deltalat = 0.025 * ( maxlat - minlat ); var markerextent=L.latLngBounds(L.latLng(minlat-deltalat,minlon-deltalon),L.latLng(maxlat+deltalat,maxlon+deltalon)); map.fitBounds(markerextent); } } // Update the transport type with the URL settings which updates all HTML forms to defaults. var transport=routino.transport; if(args["transport"] !== undefined) transport=args["transport"]; formSetTransport(transport); // Update the HTML with the URL settings if(args["language"] !== undefined) formSetLanguage(args["language"]); else formSetLanguage(); for(var key in routino.profile_highway) if(args["highway-" + key] !== undefined) formSetHighway(key,args["highway-" + key]); for(var key in routino.profile_speed) if(args["speed-" + key] !== undefined) formSetSpeed(key,args["speed-" + key]); for(var key in routino.profile_property) if(args["property-" + key] !== undefined) formSetProperty(key,args["property-" + key]); for(var key in routino.restrictions) { if(key=="oneway" || key=="turns") { if(args[key] !== undefined) formSetRestriction(key,args[key]); } else { if(args["restrict-" + key] !== undefined) formSetRestriction(key,args["restrict-" + key]); } } // Get the home location cookie and compare to each waypoint var cookies=document.cookie.split("; "); for(var cookie=0;cookie100) value=100; if(value< 0) value= 0; document.forms["form"].elements["highway-" + type].value=value; routino.profile_highway[type][routino.transport]=value; paramschanged=true; updateURLs(true); } // // Change of Speed in the form // function formSetSpeed(type,value) // called from router.html (with one argument) { if(value == "+") { value=routino.profile_speed[type][routino.transport]; if(value<10) value=2*Math.floor(value/2)+2; else if(value<30) value=5*Math.floor(value/5)+5; else value=10*Math.floor(value/10)+10; } else if(value == "-") { value=routino.profile_speed[type][routino.transport]; if(value<=10) value=2*Math.ceil(value/2)-2; else if(value<=30) value=5*Math.ceil(value/5)-5; else value=10*Math.ceil(value/10)-10; } else if(value == "=") value=document.forms["form"].elements["speed-" + type].value; value=Number(value); if(isNaN(value)) value= 60; if(value>150) value=150; if(value< 0) value= 0; document.forms["form"].elements["speed-" + type].value=value; routino.profile_speed[type][routino.transport]=value; paramschanged=true; updateURLs(true); } // // Change of Property in the form // function formSetProperty(type,value) // called from router.html (with one argument) { if(value == "+") { value=routino.profile_property[type][routino.transport]; if(value>=40 && value<60) value=2*Math.floor(value/2)+2; else value=5*Math.floor(value/5)+5; } else if(value == "-") { value=routino.profile_property[type][routino.transport]; if(value>40 && value<=60) value=2*Math.ceil(value/2)-2; else value=5*Math.ceil(value/5)-5; } else if(value == "=") value=document.forms["form"].elements["property-" + type].value; value=Number(value); if(isNaN(value)) value= 50; if(value>100) value=100; if(value< 0) value= 0; document.forms["form"].elements["property-" + type].value=value; routino.profile_property[type][routino.transport]=value; paramschanged=true; updateURLs(true); } // // Change of Restriction rule in the form // function formSetRestriction(type,value) // called from router.html (with one argument) { if(type=="oneway" || type=="turns") { if(value === undefined) value=document.forms["form"].elements["restrict-" + type].checked; document.forms["form"].elements["restrict-" + type].checked=value; routino.profile_restrictions[type][routino.transport]=value; } else if(type=="weight") { if(value == "+") value=routino.profile_restrictions[type][routino.transport]+5; else if(value == "-") value=routino.profile_restrictions[type][routino.transport]-5; else if(value == "=") value=document.forms["form"].elements["restrict-" + type].value; value=Number(value); if(isNaN(value)) value= 0; if(value>50) value=50; if(value< 0) value= 0; document.forms["form"].elements["restrict-" + type].value=value; routino.profile_restrictions[type][routino.transport]=value; } else /* if(type=="height" || type=="width" || type=="length") */ { if(value == "+") value=routino.profile_restrictions[type][routino.transport]+1; else if(value == "-") value=routino.profile_restrictions[type][routino.transport]-1; else if(value == "=") value=document.forms["form"].elements["restrict-" + type].value; value=Number(value); if(isNaN(value)) value= 0; if(value>25) value=25; if(value< 0) value= 0; document.forms["form"].elements["restrict-" + type].value=value; routino.profile_restrictions[type][routino.transport]=value; } paramschanged=true; updateURLs(true); } // // Set the feature coordinates from the form when the form changes. // function formSetCoords(marker,lon,lat) // called from router.html (with one argument) { clearSearchResult(marker); if(lon === undefined && lat === undefined) { lon=document.forms["form"].elements["lon" + marker].value; lat=document.forms["form"].elements["lat" + marker].value; } if(lon === "" && lat === "") { document.forms["form"].elements["lon" + marker].value=""; document.forms["form"].elements["lat" + marker].value=""; routino.point[marker].lon=""; routino.point[marker].lat=""; updateURLs(true); } else { var lonlat; if(lon==="") { lonlat=map.getCenter(); lon=lonlat.lon; } else lon=Number(lon); if(lon<-180) lon=-180; if(lon>+180) lon=+180; if(lat==="") { lonlat=map.getCenter(); lat=lonlat.lat; } else lat=Number(lat); if(lat<-90 ) lat=-90 ; if(lat>+90 ) lat=+90 ; lonlat = L.latLng(lat,lon); markers[marker].setLatLng(lonlat); markersmoved=true; document.forms["form"].elements["lon" + marker].value=format5f(lon); document.forms["form"].elements["lat" + marker].value=format5f(lat); routino.point[marker].lon=format5f(lon); routino.point[marker].lat=format5f(lat); routino.point[marker].used=true; markerCheckHome(marker); } } // // Set the search field from the form when the form changes. // function formSetSearch(marker,search) // called from event handler linked to router.html (with one argument) { clearSearchResult(marker); if(search === undefined) { routino.point[marker].search=document.forms["form"].elements["search" + marker].value; DoSearch(marker); } else { document.forms["form"].elements["search" + marker].value=search; routino.point[marker].search=search; } } // // Change of loop or reverse option in the form // function formSetLoopReverse(type,value) // called from router.html (with one argument) { if(value === undefined) value=document.forms["form"].elements[type].checked; document.forms["form"].elements[type].checked=value; if(type == "loop") routino.loop=value; else routino.reverse=value; updateURLs(true); } // // Format a number in printf("%.5f") format. // function format5f(number) { var newnumber=Math.floor(number*100000+0.5); var delta=0; if(newnumber>=0 && newnumber<100000) delta= 100000; if(newnumber<0 && newnumber>-100000) delta=-100000; var string=String(newnumber+delta); var intpart =string.substring(0,string.length-5); var fracpart=string.substring(string.length-5,string.length); if(delta>0) intpart="0"; if(delta<0) intpart="-0"; return(intpart + "." + fracpart); } // // Build a set of URL arguments // function buildURLArguments(lang) { var url= "transport=" + routino.transport; for(var marker=1;marker<=vismarkers;marker++) if(routino.point[marker].active) { url=url + ";lon" + marker + "=" + format5f(routino.point[marker].lon); url=url + ";lat" + marker + "=" + format5f(routino.point[marker].lat); if(routino.point[marker].search !== "") url=url + ";search" + marker + "=" + encodeURIComponent(routino.point[marker].search); } for(var key in routino.profile_highway) if(routino.profile_highway[key][routino.transport]!=routino_default.profile_highway[key][routino.transport]) url=url + ";highway-" + key + "=" + routino.profile_highway[key][routino.transport]; for(var key in routino.profile_speed) if(routino.profile_speed[key][routino.transport]!=routino_default.profile_speed[key][routino.transport]) url=url + ";speed-" + key + "=" + routino.profile_speed[key][routino.transport]; for(var key in routino.profile_property) if(routino.profile_property[key][routino.transport]!=routino_default.profile_property[key][routino.transport]) url=url + ";property-" + key + "=" + routino.profile_property[key][routino.transport]; for(var key in routino.restrictions) if(routino.profile_restrictions[key][routino.transport]!=routino_default.profile_restrictions[key][routino.transport]) url=url + ";" + key + "=" + routino.profile_restrictions[key][routino.transport]; if(routino.loop) url=url + ";loop=true"; if(routino.reverse) url=url + ";reverse=true"; if(lang && routino.language) url=url + ";language=" + routino.language; return(url); } // // Build a set of URL arguments for the map location // function buildMapArguments() { var lonlat = map.getCenter(); var zoom = map.getZoom(); return "lat=" + format5f(lonlat.lat) + ";lon=" + format5f(lonlat.lng) + ";zoom=" + zoom; } // // Update the URLs // function updateURLs(addhistory) { var urlargs =buildURLArguments(false); var mapargs =buildMapArguments(); var langargs="language=" + routino.language; var libargs =";library=" + mapprops.library; if(!mapprops.libraries) libargs=""; var links=document.getElementsByTagName("a"); for(var i=0; i" + data_text + ""; document.getElementById("attribution_tile").innerHTML="" + tile_text + ""; } change_attribution(0); // Define a GPX layer but don't add it yet layerGPX={shortest: null, quickest: null}; // Add a markers vectors layer layerVectors = L.layerGroup(); map.addLayer(layerVectors); // A set of markers markers={}; icons={}; markersmoved=false; paramschanged=false; for(var marker=1;marker<=mapprops.maxmarkers;marker++) { icons[marker]=L.icon({iconUrl: "icons/marker-" + marker + "-red.png", iconSize: L.point(21,25), iconAnchor: L.point(10,25)}); markers[marker]=L.marker(L.point(0,0), {clickable: true, draggable: true, icon: icons[marker]}); markers[marker].on("drag" , (function(m) { return function(evt) { dragMarkerMove (m,evt); }; }(marker))); markers[marker].on("dragend", (function(m) { return function(evt) { dragMarkerComplete(m,evt); }; }(marker))); } icons.home=L.icon({iconUrl: "icons/marker-home-red.png", iconSize: L.point(21,25), iconAnchor: L.point(10,25)}); // Markers to highlight a selected point for(var highlight in highlights) { highlights[highlight]=L.circleMarker(L.latLng(0,0), {radius: 10, stroke: true, weight: 4, color: route_dark_colours[highlight], opacity: 1.0, fill: false}); } // A popup for routing results for(var popup in popups) popups[popup] = createPopup(popup); // Move the map map.on("moveend", (function() { updateURLs(false);})); var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon !== undefined && lat !== undefined && zoom !== undefined) { lat = Number(lat); lon = Number(lon); zoom = Number.parseInt(Number(zoom)+0.5); if(lonmapprops.eastedge) lon=mapprops.eastedge; if(latmapprops.northedge) lat=mapprops.northedge; if(zoommapprops.zoomin) zoom=mapprops.zoomin; map.setView(L.latLng(lat,lon),zoom); } else map.fitBounds(map.options.maxBounds); // Unhide editing URL if variable set if(mapprops.editurl !== undefined && mapprops.editurl !== "") { var edit_url=document.getElementById("edit_url"); edit_url.style.display=""; edit_url.href=mapprops.editurl; } updateURLs(false); } // // Callback for a marker drag occuring on the map. // function dragMarkerMove(marker,event) { dragMarkerSetForm(marker); } // // Callback for completing a marker drag on the map. // function dragMarkerComplete(marker,event) { dragMarkerSetForm(marker); updateURLs(true); } // // Set the feature coordinates in the form after dragging it on the map. // function dragMarkerSetForm(marker) { var lonlat = markers[marker].getLatLng(); formSetCoords(marker,lonlat.lng,lonlat.lat); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Marker dragging //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// var dragged_waypoint=null,dragged_marker=null; var dragged_waypoint_over=null,dragged_marker_over=null; var dragged_icon_x,dragged_icon_y; // // Drag a waypoint up or down the list. // function dragWaypointStart(e) { var w=e.target; while(w!=null && w.className != "waypoint") w=w.parentElement; if(w===null) return; w.style.opacity = "0.5"; dragged_waypoint=w; dragged_marker=Number.parseInt(dragged_waypoint.id.substring(8)); dragged_icon_x=e.clientX-e.target.offsetLeft; dragged_icon_y=e.clientY-e.target.offsetTop; } function dragWaypointEnd(e) { e.preventDefault(); if(dragged_waypoint===null) return; dragged_waypoint.style.opacity = ""; dragged_waypoint=null; dragged_marker=null; if(dragged_waypoint_over===null) return; dragged_waypoint_over.style.border = ""; dragged_waypoint_over=null; dragged_marker_over=null; } // // Drag a waypoint over another one up or down the list. // function dragWaypointEnter(e) { var w=e.target; while(w!=null && w.className != "waypoint") w=w.parentElement; if(w===null) return; if(dragged_waypoint_over!==null) dragged_waypoint_over.style.border = ""; if(w==dragged_waypoint) return; dragged_waypoint_over=w; dragged_marker_over=Number.parseInt(dragged_waypoint_over.id.substring(8)); if(dragged_marker>dragged_marker_over) w.style.borderTop = "3px solid black"; else w.style.borderBottom = "3px solid black"; } function dragWaypointOver(e) { e.preventDefault(); } function dragWaypointLeave(e) { var w=e.target; while(w!=null && w.className != "waypoint") w=w.parentElement; if(w===null) return; if(w==dragged_waypoint_over) return; w.style.border = ""; } // // Drop the waypoint after dragging up or down the list. // function dragWaypointDrop(e) { e.preventDefault(); if(dragged_marker_over===null) return; if(dragged_marker_over>dragged_marker) for(var m=dragged_marker;mdragged_marker_over;m--) markerSwap(m,m-1); } // // Drag a waypoint over the map. // function dragWaypointMapEnter(e) { e.preventDefault(); if(dragged_waypoint_over!==null) dragged_waypoint_over.style.border = ""; } function dragWaypointMapOver(e) { e.preventDefault(); } function dragWaypointMapLeave(e) { e.preventDefault(); } // // Drop the waypoint after dragging it over the map. // function dragWaypointMapDrop(e) { e.preventDefault(); var rect = document.getElementById("map").getBoundingClientRect(); var lonlat=map.containerPointToLatLng(L.point(e.clientX-rect.left-window.scrollX-dragged_icon_x+8, e.clientY-rect.top -window.scrollY-dragged_icon_y+21)); formSetCoords(dragged_marker,lonlat.lng,lonlat.lat); if(!routino.point[dragged_marker].active) markerToggleMap(dragged_marker); if(routino.point[dragged_marker].search=="") markerCoords(dragged_marker); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Marker handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Toggle a marker on the map. // function markerToggleMap(marker) // called from router.html { if(!routino.point[marker].used) { routino.point[marker].used=true; markerCentre(marker); markerCoords(marker); } markerAddRemoveMap(marker,!routino.point[marker].active); } // // Show or hide a marker on the map. // function markerAddRemoveMap(marker,active) { if(active) markerAddMap(marker); else markerRemoveMap(marker); } // // Show a marker on the map. // function markerAddMap(marker) { clearSearchResult(marker); layerVectors.addLayer(markers[marker]); routino.point[marker].active=true; routino.point[marker].used=true; updateIcon(marker); markersmoved=true; updateURLs(true); updateSearchButtons(); } // // Remove a marker from the map. // function markerRemoveMap(marker) { clearSearchResult(marker); layerVectors.removeLayer(markers[marker]); routino.point[marker].active=false; updateIcon(marker); markersmoved=true; updateURLs(true); updateSearchButtons(); } // // Display search string for the marker // function markerSearch(marker) // called from router.html { clearSearchResult(marker); document.getElementById("coords" + marker).style.display="none"; document.getElementById("search" + marker).style.display=""; } // // Display coordinates for the marker // function markerCoords(marker) // called from router.html { clearSearchResult(marker); document.getElementById("search" + marker).style.display="none"; document.getElementById("coords" + marker).style.display=""; } // // Centre the marker on the map // function markerCentre(marker) // called from router.html { if(!routino.point[marker].used) return; clearSearchResult(marker); var lonlat=map.getCenter(); formSetCoords(marker,lonlat.lng,lonlat.lat); } // // Centre the map on the marker // function markerRecentre(marker) // called from router.html { if(!routino.point[marker].used) return; clearSearchResult(marker); var lon=Number(routino.point[marker].lon); var lat=Number(routino.point[marker].lat); var lonlat = L.latLng(lat,lon); map.panTo(lonlat); } // // Clear the current marker. // function markerRemove(marker) // called from router.html { clearSearchResult(marker); for(var m=marker;mmarker;m--) markerCopy(m,m-1); markerClearForm(marker-1); } // // Add a marker after the current one. // function markerAddAfter(marker) // called from router.html { if(vismarkers==mapprops.maxmarkers) return false; clearSearchResult(marker); markerAddForm(++vismarkers); for(var m=vismarkers;m>(marker+1);m--) markerCopy(m,m-1); markerClearForm(marker+1); } // // Set this marker as the home location. // function markerHome(marker) // called from router.html { if(!routino.point[marker].used) { markerMoveHome(marker); } else { clearSearchResult(marker); markerSetClearHome(marker,!routino.point[marker].home); } } // // Set this marker as the current location. // function markerLocate(marker) // called from router.html { clearSearchResult(marker); function success(position) { formSetCoords(marker,position.coords.longitude,position.coords.latitude); markerAddMap(marker); } function failure(error) { alert("Error: " + error.message); } if(navigator.geolocation) navigator.geolocation.getCurrentPosition(success,failure); else alert("Error: Geolocation unavailable"); } // // Update the search buttons enable/disable. // function updateSearchButtons() { var markersactive=0; for(var m=1;m<=vismarkers;m++) if(routino.point[m].active) markersactive++; if(markersactive<2) { document.getElementById("shortest1").disabled="disabled"; document.getElementById("quickest1").disabled="disabled"; document.getElementById("shortest2").disabled="disabled"; document.getElementById("quickest2").disabled="disabled"; } else { document.getElementById("shortest1").disabled=""; document.getElementById("quickest1").disabled=""; document.getElementById("shortest2").disabled=""; document.getElementById("quickest2").disabled=""; } } // // Update an icon to set colours and home or normal marker. // function updateIcon(marker) { if(routino.point[marker].home) { if(routino.point[marker].active) document.getElementById("icon" + marker).src="icons/marker-home-red.png"; else document.getElementById("icon" + marker).src="icons/marker-home-grey.png"; markers[marker].setIcon(icons.home); } else { if(routino.point[marker].active) document.getElementById("icon" + marker).src="icons/marker-" + marker + "-red.png"; else document.getElementById("icon" + marker).src="icons/marker-" + marker + "-grey.png"; markers[marker].setIcon(icons[marker]); } markers[marker].update(); } // // Move the marker to the home location // function markerMoveHome(marker) { if(homelon===null || homelat===null) return; routino.point[marker].home=true; routino.point[marker].used=true; formSetCoords(marker,homelon,homelat); markerAddMap(marker); } // // Set or clear the home marker icon // function markerSetClearHome(marker,home) { var cookie; var date = new Date(); if(home) { homelat=format5f(routino.point[marker].lat); homelon=format5f(routino.point[marker].lon); cookie="Routino-home=lon:" + homelon + ":lat:" + homelat; date.setUTCFullYear(date.getUTCFullYear()+5); routino.point[marker].home=true; } else { homelat=null; homelon=null; cookie="Routino-home="; date.setUTCFullYear(date.getUTCFullYear()-1); routino.point[marker].home=false; } document.cookie=cookie + ";Expires=" + date.toGMTString() + ";SameSite=Strict"; updateIcon(marker); for(var m=1;m<=mapprops.maxmarkers;m++) markerCheckHome(m); } // // Check if a marker is the home marker // function markerCheckHome(marker) { var home=routino.point[marker].home; if(routino.point[marker].lon==homelon && routino.point[marker].lat==homelat) routino.point[marker].home=true; else routino.point[marker].home=false; if(home!=routino.point[marker].home) updateIcon(marker); } // // Move this marker up. // function markerMoveUp(marker) // called from router.html { if(marker==1) { for(var m=1;m1;m--) markerSwap(m,m-1); } else markerSwap(marker,marker+1); } // // Copy a marker from one place to another. // function markerCopy(marker1,marker2) { for(var element in routino.point[marker2]) routino.point[marker1][element]=routino.point[marker2][element]; document.getElementById("search" + marker1).style.display=document.getElementById("search" + marker2).style.display; document.getElementById("coords" + marker1).style.display=document.getElementById("coords" + marker2).style.display; document.forms["form"].elements["search" + marker1].value=document.forms["form"].elements["search" + marker2].value; formSetCoords(marker1,routino.point[marker1].lon,routino.point[marker1].lat); markerAddRemoveMap(marker1,routino.point[marker1].active); } // // Swap a pair of markers. // function markerSwap(marker1,marker2) { for(var element in routino.point[marker2]) { var temp=routino.point[marker1][element]; routino.point[marker1][element]=routino.point[marker2][element]; routino.point[marker2][element]=temp; } var search_display=document.getElementById("search" + marker1).style.display; document.getElementById("search" + marker1).style.display=document.getElementById("search" + marker2).style.display; document.getElementById("search" + marker2).style.display=search_display; var coords_display=document.getElementById("coords" + marker1).style.display; document.getElementById("coords" + marker1).style.display=document.getElementById("coords" + marker2).style.display; document.getElementById("coords" + marker2).style.display=coords_display; var search_value=document.forms["form"].elements["search" + marker1].value; document.forms["form"].elements["search" + marker1].value=document.forms["form"].elements["search" + marker2].value; document.forms["form"].elements["search" + marker2].value=search_value; formSetCoords(marker1,routino.point[marker1].lon,routino.point[marker1].lat); formSetCoords(marker2,routino.point[marker2].lon,routino.point[marker2].lat); markerAddRemoveMap(marker1,routino.point[marker1].active); markerAddRemoveMap(marker2,routino.point[marker2].active); } // // Reverse the markers. // function markersReverse() // called from router.html { for(var marker=1;marker<=vismarkers/2;marker++) markerSwap(marker,vismarkers+1-marker); markersmoved=true; updateURLs(true); } // // Close the loop. // function markersLoop() // called from router.html { if(vismarkers==mapprops.maxmarkers) return false; if(routino.point[vismarkers].lon==routino.point[1].lon && routino.point[vismarkers].lat==routino.point[1].lat) { if(routino.point[vismarkers].active) return false; else { markerToggleMap(vismarkers); return true; } } if(routino.point[vismarkers].used) markerAddForm(++vismarkers); markerCopy(vismarkers,1); markersmoved=true; updateURLs(true); updateSearchButtons(); } // // Display the form for a marker // function markerAddForm(marker) { document.getElementById("waypoint" + marker).style.display=""; } // // Hide the form for a marker // function markerRemoveForm(marker) { document.getElementById("waypoint" + marker).style.display="none"; markerClearForm(marker); } // // Clear the form for a marker // function markerClearForm(marker) { markerRemoveMap(marker); markerSearch(marker); formSetCoords(marker,"",""); formSetSearch(marker,""); updateIcon(marker); routino.point[marker].used=false; routino.point[marker].home=false; routino.point[marker].active=false; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////// Route results handling //////////////////////////// //////////////////////////////////////////////////////////////////////////////// var route_light_colours={shortest: "#60C060", quickest: "#6060C0"}; var route_dark_colours ={shortest: "#408040", quickest: "#404080"}; var highlights={shortest: null, quickest: null}; var popups={shortest: null, quickest: null}; var routepoints={shortest: {}, quickest: {}}; // // Highlight a specific item in the route // function highlight(type,line,action) { if(action == "clear") { layerVectors.removeLayer(highlights[type]); drawPopup(type,null); } else if(action == "zoom") { var lonlat = L.latLng(routepoints[type][line].lat,routepoints[type][line].lon); map.setView(lonlat,mapprops.zoomin-2); } else { // Marker var lonlat = L.latLng(routepoints[type][line].lat,routepoints[type][line].lon); highlights[type].setLatLng(lonlat); layerVectors.addLayer(highlights[type]); // Popup drawPopup(type,"" + routepoints[type][line].html + "
"); } highlights[type].redraw(); } // // Create a popup - independent of map because want it fixed on screen not fixed on map. // function createPopup(type) { var popup=document.createElement("div"); popup.className = "popup"; popup.innerHTML = ""; popup.style.display = "none"; popup.style.position = "fixed"; popup.style.top = "-4000px"; popup.style.left = "-4000px"; popup.style.zIndex = "100"; popup.style.padding = "5px"; popup.style.opacity=0.85; popup.style.backgroundColor=route_light_colours[type]; popup.style.border="4px solid " + route_dark_colours[type]; document.body.appendChild(popup); return(popup); } // // Draw a popup - independent of map because want it fixed on screen not fixed on map. // function drawPopup(type,html) { var popup=popups[type]; if(html===null) { popup.style.display="none"; return; } if(popup.style.display=="none") { var map_div=document.getElementById("map"); popup.style.left =map_div.offsetParent.offsetLeft+map_div.offsetLeft+60 + "px"; popup.style.top = map_div.offsetTop +30 + "px"; popup.style.width =map_div.clientWidth-120 + "px"; popup.style.display=""; } var close="X"; popup.innerHTML=close+html; } // // Remove a GPX trace // function removeGPXTrace(type) { map.removeLayer(layerGPX[type]); layerGPX[type]=null; displayStatus(type,"no_info"); document.getElementById(type + "_links").style.display = "none"; document.getElementById(type + "_route").innerHTML = ""; hideshow_hide(type); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Server handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Define an AJAX request object // function ajaxGET(url,success,failure,state) { var ajaxRequest=new XMLHttpRequest(); function ajaxGOT(options) { if(this.readyState==4) if(this.status==200) { if(typeof(options.success)=="function") options.success(this,options.state); } else { if(typeof(options.failure)=="function") options.failure(this,options.state); } } ajaxRequest.onreadystatechange = function(){ ajaxGOT.call(ajaxRequest,{success: success, failure: failure, state: state}); }; ajaxRequest.open("GET", url, true); ajaxRequest.send(null); } // // Display data statistics // function displayStatistics() // called from router.html { // Use AJAX to get the statistics ajaxGET("statistics.cgi", runStatisticsSuccess); } // // Success in running data statistics generation. // function runStatisticsSuccess(response) { document.getElementById("statistics_data").innerHTML="
" + response.responseText + "
"; document.getElementById("statistics_link").style.display="none"; } // // Submit form - perform the routing // function findRoute(type) // called from router.html { tab_select("results"); hideshow_hide("help_options"); hideshow_hide("shortest"); hideshow_hide("quickest"); displayStatus("result","running"); var url="router.cgi" + "?" + buildURLArguments(true) + ";type=" + type; // Destroy the existing layer(s) highlight("shortest",-1,"clear"); highlight("quickest",-1,"clear"); if(markersmoved || paramschanged) { if(layerGPX.shortest!==null) removeGPXTrace("shortest"); if(layerGPX.quickest!==null) removeGPXTrace("quickest"); markersmoved=false; paramschanged=false; } else if(layerGPX[type]!==null) removeGPXTrace(type); // Use AJAX to run the router routing_type=type; ajaxGET(url, runRouterSuccess, runRouterFailure); } // // Success in running router. // function runRouterSuccess(response) { var lines=response.responseText.split("\n"); var uuid=lines[0]; var success=lines[1]; var link; // Update the status message if(success=="ERROR") { displayStatus("result","error"); hideshow_show("help_route"); link=document.getElementById("router_log_error"); link.href="results.cgi?uuid=" + uuid + ";type=router;format=log"; return; } else { displayStatus("result","complete"); hideshow_hide("help_route"); link=document.getElementById("router_log_complete"); link.href="results.cgi?uuid=" + uuid + ";type=router;format=log"; } // Update the routing result message link=document.getElementById(routing_type + "_html"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=html"; link=document.getElementById(routing_type + "_gpx_track"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=gpx-track"; link=document.getElementById(routing_type + "_gpx_route"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=gpx-route"; link=document.getElementById(routing_type + "_text_all"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=text-all"; link=document.getElementById(routing_type + "_text"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=text"; document.getElementById(routing_type + "_links").style.display = ""; // Add a GPX layer var url="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=gpx-track"; ajaxGET(url, runGPXSuccess); hideshow_show(routing_type); displayResult(routing_type,uuid); } // // Success in getting GPX. // function runGPXSuccess(response) { var lines=response.responseText.split("\n"); var coords=[]; var segment=-1; for(var line=0;line/)) { segment++; coords[segment]=[]; } if(lines[line].match(/^")) table=1; else continue; } if(thisline.match("")) break; if(thisline.match("")) { var rowtype=RegExp.$1; if(rowtype=="c") { thisline.match(": *([-0-9.]+) *([-0-9.]+)"); points[point]={lat: Number(RegExp.$1), lon: Number(RegExp.$2), html: "", highway: "", distance: "", total: ""}; point++; } else if(rowtype=="n") { points[point-1].html += thisline; } else if(rowtype=="s") { thisline.match("([^<]+)"); points[point-1].highway = RegExp.$1; thisline.match("([^<]+)"); points[point-1].distance = RegExp.$1; thisline.match("([^<]+)"); points[point-1].total = RegExp.$1; thisline.match("^(.*)."); points[point-1].html += RegExp.$1; } else if(rowtype=="t") { points[point-1].html += thisline; thisline.match("([^<]+)"); points[point-1].total = RegExp.$1; thisline.match("(.*)"); points[point-1].highway = RegExp.$1; } } } displayStatus(routing_type,"info",points[point-1].total.bold()); var result=""; for(var p=0;p" + "
#" + (p+1) + "" + points[p].highway; } result=result + "
"; document.getElementById(routing_type + "_route").innerHTML=result; } // // Failure in getting route. // function getRouteFailure(response) { document.getElementById(routing_type + "_route").innerHTML = ""; } // // Perform a search // function DoSearch(marker) { // Use AJAX to get the search result var search=routino.point[marker].search; var mapbounds=map.getBounds(); var url="search.cgi"; url=url + "?marker=" + marker; url=url + ";lonmin=" + format5f(mapbounds.getWest()); url=url + ";latmin=" + format5f(mapbounds.getSouth()); url=url + ";lonmax=" + format5f(mapbounds.getEast()); url=url + ";latmax=" + format5f(mapbounds.getNorth()); url=url + ";search=" + encodeURIComponent(search); ajaxGET(url,runSearchSuccess); } var searchresults=[]; // // Success in running search. // function runSearchSuccess(response) { var lines=response.responseText.split("\n"); var marker=lines[0]; var cpuinfo=lines[1]; // not used var message=lines[2]; if(message !== "") { alert(message); return; } searchresults[marker]=[]; for(var line=3;line"; for(var n=0;n0) innerHTML+="
"; innerHTML+="" + searchresults[marker][n].name + ""; } results.innerHTML=innerHTML; results.style.display=""; } } // // Display search results. // function choseSearchResult(marker,n) { if(n>=0) { formSetSearch(marker,searchresults[marker][n].name); formSetCoords(marker,searchresults[marker][n].lon,searchresults[marker][n].lat); markerAddMap(marker); } } // // Clear search results. // function clearSearchResult(marker) { document.getElementById("searchresults" + marker).style.display="none"; } routino-3.4.3/web/www/routino/router.html.fr 644 233 144 102274 14774263771 14374 0 Routino : Calculateur d'itinéraire pour OpenStreetMap
Options Résultats Données
Calculateur d'itinéraires Routino pour Openstreetmap Cette page web permet de calculer des itinéraires à l'aide des données collectées par OpenStreetMap. Sélectionner les points de départ et d'arrivée (cliquer sur les icones ci-dessous), sélectionner les préférences, puis rechercher un itinéraire.
+ - Étapes de l'itinéraire
Faire une boucle:
Inverser l'ordre:
Rechercher
+ - Mode de déplacement
À pied:
À cheval:
Fauteuil roulant:
Bicyclette:
Cyclomoteur:
Moto:
Voiture:
Camionette:
Camion(15t):
Camion(10t):
+ - Préférences routières
+ - Limitations de vitesse
+ - Préférences des propriétés
+ - Autres Restrictions
+ - Aide
Aide simplifiée
Cliquer sur les icones de balises (ci-dessus) pour les placer sur la carte (droite). Puis les déplacer à la position choisie. Il sera sûrement plus facile de zoomer sur la carte avant de placer les balises. Autre solution, taper la latitude et la longitude dans les cases ci-dessus.

Selectionner le mode de déplacement, les types de voies autorisées, les limitations de vitesse, les propriétés des voies et les autres restrictions dans les options ci-dessus. Selectionner "Le plus court" ou "Le plus rapide" pour calculer l'itinéraire et le visualiser sur la carte.

Etapes
Cliquer sur les balises affichera ou supprimera leur apparition sur la carte. Quand un itinéraire est calculé, il affichera (le plus près possible pour le mode de déplacement sélectionné) chacune des étapes qui ont une balise sur la carte dans l'ordre défini.

Mode de déplacement
Selectionner un mode de déplacement restreindra l'itinéraire choisi aux voies sur lesquelles il est autorisé et définira les valeurs par défaut pour les autres paramètres.

Préferences des voies
La préférence de voies est définie par un pourcentage et des itinéraires sont choisis qui essaient de suivre les voies préferrées. Par exemple, si une voie "Primaire" a une préférence de "110%" et une voie "Secondaire" une préférence de "100%", alors cela signifie qu'un itinéraire sur une voie primaire peut être jusqu'à 10% plus long que sur une voie secondaire et être sélectionné.

Limites de vitesse
Les limites de vitesse choisies ici pour les differents types de voies s'appliquent si la voie n'a pas d'autre limite de vitesse définie ou si celle-ci est supérieure à celle choisie.

Préférences de propriétés
La préférence de propriété est définie par un pourcentage et des itinéraires sont choisis qui essaient de suivre les voies ayant cette propriété préférée. Par exemple, si une voie goudronnée a une préférence de "75%", alors cela signifie que une voie non goudronnée obtient automatiquement une préférence de "25%" ce qui fait que un itinéraire sur une voie goudronnée peut avoir 3 fois la longueur d'une non goudronnée et être sélectionnée.

Autres restrictions
Celles-ci permettent de touver un itinéraire qui respecte les limites définies pour le poids, la hauteur, la largeur ou la longueur. Il est également possible d'ignorer les restrictions de sens unique (e. pour la marche).

Routeur: Routino | Geo Data: | Dalles:
routino-3.4.3/web/www/routino/icons/ 40755 233 144 0 14774263776 12616 5routino-3.4.3/web/www/routino/icons/limit-125.png 644 233 144 3000 14774263775 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܵIDATHÇÍ–_LÔWÇï &"ˆB¦¶$b¶Å†A“J´Â¨Ä`#‘íTKêÓF2›–}0Ã"þé$[“Z05­M‡F3v$šbƒMÕ’ŠÐ!i]ئ5]«¦èÒ~¿û»Ÿ>0¿ùͮه}ó¾ürιçûýæÜsÏï B±8õõ\ÖsYysvÖNËŸ³)gSé§s¶_‚­ÉÖÙùæPðIÁ'ÆuË6ãæþÌ|!,üL>Ó/ Ë‘}:û´Í•²}°­|[yNÑœýþ Ø{í½3:´|Þò9ÀgÇ?;ÎÛ0><> 0åšre›qs¿™oâeâ ßñ Ï|ñ̶Aö‚ìB@I}Iýò¿Îm¸¹_m|àî¼»óTÈI —\妙Æ\÷2l3žÚoæ›x&¾ÉgòÏéPXWX'l}cëöëAô¶gÛž5ù´^Öòo‘ËqýKýKÙ!;HrX¹•Ô°1l W›Ô&¹]n'©’Úcí1¨1|øÈUc)¼ï¼oÄx=ÈW[—n]jï6õXGi!DçFp ·H «v½Cïõ£ü^~– ( ˜Çâ¡_B¿˜ÂF½òòÔiŽ¿0þp=%­Õ¨2ª@þAËb¨vU»ª]p®é\Ó¹&HN$'’pûòíË·/ÃùÀùÀùT¨:QuöåïËß—•=•=•=°fÇškvÀ ߊwV¼·œ7åM™Ñ›ucÞ1/˜z,*Xd\ƒ{c÷Æ€Ós×^)ãWãW+±ÆQã¨q@o¨7Ô²üÞ„7áM@¥³ÒYé„‘%#KF–ÀÇÇ – – –Yûk‹j‹j‹ «¤ÓÞi·ÆŒüSìåØË`êÉÂè3úl×z£Þ(„ЄBÚž³bV¤×£=ö<Ú#Dnnn¿áááBt-ìZصPˆæ£ÍG› ‹ÇⱸAwÐt á9à9à9 Dw{w{w»±Š˜#æ¢üçòþòþ4|¡MÓô!,=fЇâ@8uæ[ôßôßH¦+Óïí÷öÃÕ W7\ÝCbH ¨_[¿¶~-4ô5ô5ôA…ªP .//áȺ#뎬g­³ÖY '—Ÿ,>Yœ®T’-)¾†BÿÑc©[‰g¯g¯uK@ŸÖ­¦V@Ò’ù,#ÃþšŸø E£îÒ]|š§ÃÓñÄ­|ñ0ØÇíãÓóQQ-ªA l3mF c›á3|À)¡Ô¬šU³ ÷Ëýr?ȈŒÈÈ€ ȨVÕªZAFäˆùù‘üŒͯùIðczŽ-¸±ö»ö»OÌ1sÐvnwŽ;'s2˰ ××Ñ© j$Hÿæ>÷)¦˜Ê°5f˜É¨øc£ÙhFùü&ßä{bòÿ%mËÚÒsMëÞå]r­#–oÊ7I‚TƒØ°e›ñtK¤òM<ßä3ùÓÿʧöuñԾǞÎìïr›C2´‹²IEND®B`‚routino-3.4.3/web/www/routino/icons/home.png 644 233 144 351 12610450011 14206 0‰PNG  IHDR Ùs²sRGB®Îé pHYs  šœtIMEÚ&Aµ•{IDATHÇÕÔË€ Dѹ†ÿÿeÜã°-D” ›9„¶ÔZyÛ©G0ðfo$1òj3¯¤qðb/œüfpó‹"ÀOŽ?H‚|·„ù¦éà’]\ҢΕÏ»8¯ÔÕ”0¼OUóÒ ²}*i"_.aþóÿƒ­;¿Ü*IEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-up.png 644 233 144 361 12610450011 15553 0‰PNG  IHDR Vu\çsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ 'ôÞpqIDAT(Ï’Ñ € Dß1¹ßnÀle¢;˜úC“Š@Ô&—+×k)ð'Ìì k‡G.ˆ!É*¯†'µn’–pÎ|ëàÕC»:Äê3—8”u°Å¡ -`ˆrO`3¸ Õ> pçhWõþörÇúü+.Z‹‚¿£IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-121.png 644 233 144 2712 14774263775 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍV]LSg~J­¥¡ D4 DŒ8%F¡˜˜@¢Å¢‰"H¬FCÂÅ1qš]HÑ QcâÏâÐ`²HȽРþáÅÌfd,ûÉ2W1AÂBKµœóïÙE{zêœW»ñ»iß÷ûžŸ~ïéû€äÈ'ȸ̸̸¤pWmäã·Åo[q%· ÒTaªøÅC.jYÔB’)m)mÚ#Ö÷õó±xÀàÕÓóH†‘°^³^39#q3¹wíÞµñKÂñé¤í†íÆœJÖܬ¹I’ííüœ$Éiç´“4b}_?¯ãu¾X~4ÿK -w-wM’Ö…Ö…™U’U’}8|à÷l²lGÙ’|a~a–q$IŠI’vÚ¥“¤Ÿ~ê믘Xßœ×ñ:ŸÎ¯ëéúa? S7§nÈ]ûví³]ž|Kµ6£6C×Sn°ˆyv¶«÷Ô{$)êE=C9OÚ&lþäh`4@ò{’ävR>’œ› &Iåk¥Ui5Œ(k”5Êr2w2w2—Tš•f¥™ï¬¹™`F0ƒTþ† Œ¤·sxôñèc’´ÛÆý t?qa{_äa¢ª¡ª!Qrì9v™Ç:5OÍC׫s3ÏfžÁVÒîò¸<@Ÿ½/¹/ÑU~±übùE`冕Vn¶Ø·Ø·Ø©ô©ô©t p%p%p(©vå»òž/{K{Ka‹À»daŽ#Ç!ó€ªÖªÖD5ê'ìpès¯.»º,ZOç¦fÏÍžchcÝÆCÿÝ¡â¡â¡b²ózçõÎëä ÿ ÿ ãágQSQSQy¼ãxÇñ²ôXé±Òc¾»¼{k÷Öèñø1¬G^¹:£—tèÈ$o’W^c`|Õø*’O"ÖiÍAŠDšH# œÎ'y§âNÅ 2ô2ô2ô’ôõûú}ýd÷Ñî£ÝGÉœ„œ„œÒ»Û»Û»Û0œïÉ÷ä{ÈÎ%©©F^øôoãŽq©ûY˜ËÌeÌ…Ý2b1¿¦ðîáRÍ-æ¥æ¥€eee Ö¨5j `M³¦YÓ€–¤–¤–$À;èôm]m]m]@á¦ÂM…›Œ’[Ö€5À‰byÄGô`¹e¹…TÀ¼Ú¼š¹q€v[»mú TËÔ2 Õ´ó˜7ð¯=¯=¯=€½ÇÞc着ª³ gÎ&•û+÷Wî|—|—|—€‘º‘º‘:²†¬!+ ÆÄsñ<ÆXø"Rµ\-t?q€ßéwÿS_€€Ÿ!O&ÊDÚ+Å•âJÒÇÒÇÒÇ^æe^JŠJŠJŠ€^G¯£×œ>yúäé“€¯ÚWí«6ô‹³‹³‹³Ì%™öL{4=oZÑCo/õ™eß‘4èõÖÖ“ª_5jI2ÄÿÏŠÅË·ùµõ†~ØOl ÷9ªŒ*$5½iµZ-ƒÚ^­Yk&™Ã,f‘r^ÎËyR4ŠFÑHЧâ©xJŠSâ”8EÊûò¾¼o¸Òñò•Ø)vÆô±àèìèì»} oOõ3.ÒïŽ7:?)ÄÉ€¶GÛC…"ò‹$ù7§8EršÓœŽ‰ç9ǹ˜ÒñŠð o,¿Ûê¶þgçϬÔgY˜à™uшJQÉ)È$IM¤ëûÑ’Eð:ŸÎÿÞYùÁ¾]|°ïcæì?ô‡…|.ÉfIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-10.5.png 644 233 144 3144 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïO”WÇÏÀPa…RÀ.+;¢5±á‡F‡è’€¶µÕµbKÕ ¦V¬Ä5Äl5¾ZHy$»…FkâtXc·MŠHÊBkh„  ±uÝ]© .¤©˜G2á™ç¹Ÿ}1óÌý¼ožœsîý~¿Ï9÷ž{DD$)ôˆÊˆÊˆš´£öDüqëãÖ/iÚ't°l±lùÏ_ ñóÄÏ^lz±ÉŒØfÜœ?w½H.Ÿé—$‰8b¿ŽýÚR²ka«c«#.5hÿ­l­¶ÖÇø¨í£6€oÎ|s†ýpÿÊý+“œű͸9ß\oâÍÅ—Ú§øE æÛ˜o-£ûBì "`Ýþúâªà„áÅðöÆ·7üýk´Š}H A~ü˜ãÁÛŒ‡æ›ëM<ßä3ùƒzRŠRŠD d{Év› MDdðK8´ðÐB @kåïÔRKè1z p2ð$ð„õ/ã¨qhSÕEuSÝзëÛ™a20˜¥q’“$¨‘ žÒ¦LzL¾’¾’>› R“S“#5 }?} Þzw T€Ö§nsˆCê–º…ÆnÞá”qßxh< g ­¢U4°—½ìøñãÇ"ÀqŽ£ Yhµ>xïã÷>63øéksJ)"²ì(Øü6¿ßʵ¡Æ¡Æ0ì†ÇÞ©Ä©D¦µf­YkŽðÍxg¼3^ðÚ½v¯”C9”ƒg†ÒÔ”š‚GëÕ=ªÏwcŸ}ÆôÄÞ©Ì©L6è‰Cû†öÌK›—æ·ªÖ ᖈȉ^¨¬©¬å0ò&&>™øV/^]¸ºÕ±¥cCdžá.c—±ËÛyÛyÛy(ï.ï.ï~V˜¯ÌWæ+ûÿìƒöAȪÎ:•u •ãÌz5ëUøïŸî¹ï¹<8Ðv  ô’ QwDD~<_ 5 o¨Ý^™¼2™3¯×åº\¸|ãòË7`™e™e™ÆãÎq',­_Z¿´Ú«Û«Û«#ÂFîŽÜ¹ ™Ç2eƒºu u 0Ô?¸op3¡¼î¦¼eSË&àAPO”%}~ûüö|§Ü)Ì-Ì™÷…ˆˆÅÕ÷+?]ùIbów俟ÿ¾Èlélél©Èص±kc×DÒ¥-J[$’666 ’‘‘‘-â^ë^ë^+ááÞãÞãÞ#bM²&Y“Dº¶v}ÐõÈÆï7n•Ø‘¤{é÷Ò-.ùr½o½OG„;ùÎ(ùMtYtÙr;¦>¦^Dމˆˆ7ú~Œ=Æ.bÝm­°VˆHHˆõˆõˆõˆH $P(‰ÐZ@ ˆÄ—Æ—Æ—Füû3ögìq­p­p­éMî}©÷%‘ßOïLï¹ð× “&Å+’|*ù”ˆñ‹%×’Kv”`\4.Zn‹¦½¥½%bù½ˆˆ¤˜ÀúN½\/ñåûò}ù"EçŠÎ­­­©-®-®-ñz¼¯GdyÞò¼åy"-…-…-…"ýëú×õ¯©è¬è¬èiÊir49D<¹ãñãñ"9¿ÍéÈé‘©W¦^‰JUýªßr;t*¨àh±º(“¢"¨«¶Ê4T¥Va­-í§ÕfêÐj„&Zµ¦¹÷œß>ÜÜÜëF·}ô|Iž·ÿÿ^îsŽ€ˆˆŒÏþ x§y§yÇY¶÷[Çï[è[øÉË>j‚g¹gùï;¡ ¹ `ÂÉ 'U¿cÛq;ß]/âà»ùl¿ŒÇ‘w>ï¼gAÖÞ+g­œå›dÙ?Þÿÿ…7Ô]ª»ÐÞÒÞÂwëŽu$$€cÛq;ß®·ñÜø²çoü"0¦sL§ç ä}”÷‘L¯œ^Y²ÉJxTK/Y ðtÔÓQÚ fÈ'_/Ä —mdzùv½gãÛ|6¿¥G (Pe5Ëjü'¬‚þVŒúâúb›/sÓÔSO¾þ#3=hT•¤uŸ:¢Žûô~½8©WëÕ {Œ£„4'CÆ!s˜|Œ,õSë§Úû[~K¼¿·¡/a…o…/'è˜WÍ«ª]µ“É4C¼àÎ( €Ð_éJ]é¸õÇ: h¾0ÏšgÉ€9`ißæ³ùÅ-èÓCàùcƒ£áùÀ:Xº]·óvøëá­Ã[!~)~.~͉æD3$Û’mÉ6H‡ÓátŒmÆ6cÄóãùñ|0ÝÆn×~S¥ª”·YkQŽ/ÇoéñZò¾/  kˆ”Ž*¥ËÕèáðpX®ˆxª‘Ò_J/–^™ß;¿w~¯HqGqGq‡Hèaèaè¡HUSUSU“ÈŒŠ3*DjÆÖÕ‰d.eÎeΉÈçÞÞâ—…æ\s®\±ùþ¬Kaï8ûòìËܬ¥Ó¬6«­x7ïݼwóàMäMäMnôÜè¹ÑåéòtyN7œn8 Â@a ¶ lØS&O™ö¹ðL#i$Ý|6¿¥gä>f÷™×j¹Zžë;¨VaÐAÔA—€à˜;Ìæ0ÍF³T±*REÀ¯<ç9€Ú¤6ñÖºFîcÿ§ów™]jZG†×Ù§yýÿþÐÙ{Ç+^¹¼¨5j ÏÆ±ópWæî2°î6i$ßÙb³Ö¬% ú–¾€8¶Ï‰l½÷Ÿwåûºø`ßcæ ö/£ÐA\?‚rIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-149.png 644 233 144 2770 14774263775 14776 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü­IDATHÇÍ–]LTgÇŸD˜é@Ëjl‰%Q¶M7k‰n5– ˆ4ÁJÊÒ¬L¬Ô¤)’šH:Ö´‰´Ö p ‰±­„jI˜ÖJ 4qc»ÝNÑG‰H‘2ÈÇf8ïo/fΜɒÞûÞœy¾þÿÿ™ó¼Ïû ˆˆÈɧ€ó)çSÎÜ„íü§íÏ.Ë.+ &ì“8^u¼úïCðø'מ×nþjÛVÜÊO¯±ñÓù,¿óV"áæ3Pî-÷ŒdŒd('ã€Ú L3µ¤ÙV<™oÕ[x¾Ågñ'ô,Ý´t“TTUT¹Ú¿v 7ä7ä[|Úy6ð&oâá3½Oï0jZâ "*|¤šU3à0¯˜WŒ&£‰8­ú ý¨QK->Oâ‘Äד|)þ„ûSš""-/C¥TJJЀjÔßÕßuÈ´d@a#DˆU«jU-öÊÁƒÔ_Ô³êYÐJ+šÊ0ÆŒ1À›À‡Ê¼Ê<`Öâ—ôf+:®1רô"žžxÔêGæf§ærær@ûE»®]O0ÄCßßß±;±;±;vx¾c>0€ =ó†Þ£÷0— ¿ÂíápM¸&¦Yz’ÂN~Ï}ßß Î\­þ¡­ÖVÃä±É³“gQ%–¼Wòô¶ô¶ô¶°`\upÕÁU°mö Û6ØþÒ#¥GJ€ûS÷q÷q¨:PÕZÕŠâ†~M¿fóq¸NÕ)«÷N~Ÿvíž --·Õ³?~ø1ñõëë××Û{÷bÝź‹u6ñ¥®K]—ºìx·Æ[ã…ÀîÀîÀnX§Ö©uÊÎ/Žß+¾gß ‰[|F´ã§ŽŸ,a×ÞqŠä~›ûíß_ÁMmzLD"""Ž6·ßô%k cà‹/DÖæ¯Í_›/¢—ëåz¹ˆœ–ÓrZ¤yeóÊæ•"»í:´ëˆQlÅ"…w ïÞ+++ ùB¾O$úß(QDþ¨Žùc~ÉJ¼£MÞ~©ç¥KS$£<£œçēٟÙ/"¿ˆˆÈ„œ¯åk‘ŒÑŒû÷EgggDrsrsrsDÚÆÛÆÛÆEúƒýÁþ H4 D"[;·vn­­­ÙwußÕ}WEºµn­[qÞvFQwµÛïö‹µ&ij¸q¿ˆ¥Ç)bv›ÝŽÿÉB‘¥Ž§e^æS…bÜ2n·D¦J¦J¦JDÊFÊFÊFD‚7ƒ7ƒ7EV„W„W„E Âá‚°ÈÌ©™S3§D:k:k:kD¶¸·¸·¸E–ü±dbÉ„ÈÆ¿nÌܘ™‚_ê7^4^±õX=Fh*4 $¾9Ûõ˜³z÷6îmÜ ƒÛ·n_Øü}þ>ŸšòšòšòlÿÑGwÝkê×Ô¯©‡Þ½Þ^o*W§’|c¡ßB¿Ù=fïJ|M¾¦´]‚>­Û]ñqÆmBåU^å=¬‡õ0˜]f—Ù´ÓN;¨ej™Z¶ðhç¾A±Z/Ô Óøâ¾¾ veÑqpºF§¡†µa 0­9f6˜ Ì™o˜ÇÌc bêwõûB>uA]PÀô›~ÓoûˆqݸÆßŒ××ÁlÐ~Ö~N›cúp|8(×=×½sÌ´-/Ceve¶=ùÁ0€Ys§¹-9û¤~'')óÌ3©³RGOf‚"nV›Õh`\1®¤ã[| &ÿŸœ•4,oHÍ5í<ðà±?±QmTuY]ÀlÛŠ§Z"YoáYøzV>²·‹Gö>öhÞ`ÿÍÇàŸÓA ¬IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-6-grey.png 644 233 144 5777 14774263775 15747 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ´IDATXÃ…—{PUÕÇ¿kíó>F€$‡bJB¤^TÄr‚u³káK†iF’KäòA$•‘¢Ár.gÃÈÔ„!AMñštM$åq@q PÞ¯ç°ÏúÝ?8šî4­ö¬³÷ú~?û·¾k¯uXZZZZZœ1Ó†g.|µêŽêŽêU§M;šv”L÷3îgÜ $r!—·Ë²‡ìü†µÂZa­ ,¡E,þð‡?€V´¢ÀxoP–ö%íKÚ—X²êWÕ¯ª_ÿ[ĆØÚ[˜îžîžî^w+3&3&3†õÊ^²—ìÅ6ÌpˆË.g> ŠP„òc"Cdˆ qÙ6a›°M,X–Q™Q™Qy¬ËÖkëµõÖ^³,µ,µ, ÞcÌ3æóP¼&xMð–¼\½\½\ ,s]æºÌPúÊ}åye¼¢7«ïðSü…Oå¨à3äDNä$¶²mlÛæ•'yI^’×ù#¥¥¥ ]ç×ί_kßµ¦uMëšV>ÔÔÔÌ^Ð&k“µÉ°à]¼‹wa€X¼Ž×ñ:€Gñ(…Åêiõ´zâ…æúæúæzš>çÎÿœ¿Ø5°v`íÀÚ×>1x¼ ^«tömömömyK±{g+†‹‘"RÄh’&iÒó!iž4OšwÞÇ6b±,üÉïy¿çýž—Cã¬qÖ8«´c¦blB»I»I» 2]¤‹tû×ö¯í_öP{¨=°{Û½íÞ€}»}»}; Úhm´6²2>n*n*nJÚ¡è+~Š¿Â£ðq}£¾QߨMj“Útà¢åŒåŒåÌÂç½£¼£¼£äbcbcbcTW ÎgÜÄqE\ð6ÞÆÛP¡ e(¤@)P ¤©Ej¤n©[ê¤N©Sꨜʩ*qWÜwg­³ÖY 7E_ñSü…Ëãò¸<¾a™­ÜVn+ùËü¨ùQó£È'ꫨ¯¢¾R)%?ò#?8ñ§ùÓüi_à |°l[t\ë¸Öq (¹Sr§äp¬ñXã±F kG׎® fÁ,àu¼Ž×´ÒB8)úŠŸâ¯ð(|œüÉŸü÷¿<66„_¿~kœ‹‹‹¡ ¢A4À‰]b—Ø%€²)›²t¢ÀMÍMÍM PTTX#­‘ÖH oKß–¾-ÀçŸ|>ôD÷D÷D+_…(D! è+~Š¿Â£ðqÙGö‘}Bâ\ú]ú]ú‘õTØSaO…±|Ç›jx=¯çõjPƒ€Å²X‹Ùv~óùÍç7Áëƒ×¯¶wlïØÞ$†&†&†žû=÷{î~¬ý±öÇÚ¹qX‹µX Ìê;ü…GáCÒHÒHÒˆÈ:¶êتc«HiâMñ¦x“ˆÆiœÆ‰(‚"(bö>YÆ,c¢}—ö]Úw‰èªÓU§«NDí/¶¿Øþ"ÑÏq?ÇýGd9g9g9G$çÈ9rUS5UÏé(ú³~…GáãøâCæÏóãüøì›iQŽr”0Â#@Gé(+ˆ¥ÀR`)¤·¤·¤·€ªàªàª` ø@ñâ@‰G‰G‰pxêðÔá)`L7¦ÓXõXÀ np †j?á'ü4çÏ£y4P€0.yH’}3ºbtÅè tÈ»åÝònHì,;Ë΂f{Ѓž9P2‘‰L€-À` L¦°/b_ľ`oÆÞŒ½ÀسcÏŽ= Ô|_ó}Í÷¿¿”–ÒR÷p÷ÖÎÚY;Èq[š¸>q}â::¸7÷æÞô ×ÔÔ”s;Ü;Ü;Ü雦¦¦BOâI<‰I)"E$Àö°=lÏœ‘þý+úW£1BBBMŸ¦OÓ¸ ¹à«õÕúj1"FÄÜx–ÂRX @!B!úЇ>LvnìÜØ¹0÷˜{Ì=ø—®Cסës9¢…¨ô"Uš*M•Æ’ë\ë\ë\íÞÃK†— /¹‘1JETDE1ˆAÀIí¤vR¦U¦U¦UÀg~8óÃ@ÖÉ:Y³c¨ö³<–Çò.$ðpÎÃwU ±ˆåŸU²JVÉäøá÷‡ß~VÉ*Y%F1‰IL3çQ€ô¤'=@›hm0Œa ì8;ΎêD©*©*©*ɾsè¡w†ÞQÒúj}µ¾e™~Y~Y~YŸœG:ґξF;ÚÑ.G(çQ#ºÐ….ù‘ˆDVømà·ßæþM§‹ÓÅ•e¹ ¹ ¹¨†Oºt;é6—]ЧxЇq6ÈÙ ÀN³Óì4@‡è¡ýè‡öŠùŠùŠ™žk¨i¨i¨‘rîFw£{÷”­ÔVj+MúèVú­ô[é™ÉLf<ìð)Q@-Žëq1OÌóðð_nürãÀ–hK´%&}dt1º]îo­l­l­”r«7Wo®ÞLϱ–À _Š/Å— 衇 ¡€ÉLf2&ûÌ}æ>3Êj×.®]Œ‡½Æ^c/ VˆbEÒG3ÑëžrDñcÉmP6¦¬BÇ_­£ë˜")µ¨E­}' e¡,ô¹¿ÍLñùÓÓñÓñÓñbÇkâ5ñšà«ƒ²ƒ²ƒ²ñ’h-¢¾ˆ/â‹`•“åd9Úþ‡}ûÚýzWö®ì])µéëë箚Y4»®Š|‘/òU‡3ûOeÆ2333331ªTŽf3äÈîNGv9²[þÙ®œ®œ–㇠‡ ‡ aàœsÎ1¢T¢n²n²nRXºó»ó»ó¥6]ª.U—z«ÊÚcí±ö¤~Ò¶®m]Û:ÀèígP¾YÐß+ÿqd÷ôÿe×cÈcÈC5|"íDÚ‰4ûNøÁ~x¸ÙµÙµÙÅõõõl«¡ÅÐbh„·ðÞ;.«^U½ªzuòiŸå>Ë}–óA‡ß_×ÉßsIøƒÙÑm& iHÃÞì è è ÀöÇíÛ¿&k}´>ZŸW>{ñ âA„ë·Ã·‡oߦœ%7Jn”ØŸŸŸŸ–Õ«Õ«Õ«w{R!RáWUÐB ­Ô9³Ó‰G•pJþ=ß´?ÈnªQj{:UPU„µóSü?õ½ÏÔÆ©SE€:_¯Îç·¥X)VŠ=wÉ÷”ï)ßS‘aævs»¹ÕˆbX@Gº•@ËqpüIû]vŸ {:€ÕY ‹a1}gΙ{_×?¡Bÿ¿-uI]RWÏâcñ±ø8þ—–--[Z¶3€ðqè)ËÉ?ãøH -àÊ.èIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-39.5.png 644 233 144 3222 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜGIDATHÇÍ–ûO”gÇÏ P.CåR4‹+! âÃ%jp]4[@RÁ”K*vQ,DÔšÔÆ_\’º»ü V‰ÔY…°.`K"R(ËÅ5×*IÝlkuÊ¥jŒ¥¥Ž23 fÞ÷ùì3¯3ÙîàóË›sûžóžçy¾ç‘HïWÀgŽ3/ñÈæ=>}È›!o®l÷ȘJL%ßþ">Žø ª%ªE·údÃnøûÇ‹øðýóz‰Ÿ"¸3¸Ó”í•BYjYjÈR|bB»B»ž»áÝîw».µ^jeüøå_LgOgƒO6솿oàùãËÑÿÉ/A_}azÁ¯¿"ñyñy‰<‰P¸­pÀã€ÇÊ Ú œp• Ì0ƒ±l~²a÷úñžoä3ò{êˆy#æ >)²ÙC›=Ö¿súPÓ¡&PÿpuñWi$4“fêÝv·õý´~¸¤ºT€úZ}  •kå,0ížvOƒrq–³„«<å:s(öæ£øFñÐfX½4Ú·§ÞïG[XþvÆÛ 6¸nßó=¨|=LÃ¥JÕµ¥6©-jË‹N¡T€ )¤Ð§Ç‰' 7g8ƒ XÁ Ã躥otð£-~[)"ò›Óü3´-´m&&â&âÀõg žäüÔúS+sî÷÷_¾ÅŽÅŽÅ° Ù†lC ëãú8¿XÊ­ž«çàÌuÖ9ë`jp²~²ž¹'U³ ³ hc{Çö„- [6¨º<õˆ2‰ˆ4^‡­F{-Ïx¦gü~cÖš¬5y2òÓÈOQe÷ˬeV°ÕÚjmµ,ÿXþ1   €òÃå‡ËƒU£jÔW˜#בëÈ…øûñÖx+¤Ô¦4¥4¡Ò6¤¼žò:Ü­ùaü‡q=vì­ØS¸óDDþ}œNh5þÍçߨݿ[’ÙÙÍ‚mƒ-Õ– iÑiÑiÑP~¤üHùțϛϛ÷nO·§Ûá¢ù¢ù¢Ù§Ðø ñA#$4$4$4@]cÝɺ“0v˺׺—o_w󇎷:ÞlžzÇ’î%ݪ“’ɺÉ:àL³³ÒY YUY{²ö@bRbRbœ»vîÚ¹k¼?yò~h‹i‹i‹¡"4Ô7Ô7Ôûp²²²aÕ…UV]€ÍÏ6?Ýü’Ž®Üºr+Üxû8àÙæg›Aý*|4|Tušù›Én²³Fº^Í}5Wä[m¬f¬FžÞ™»{'V¤wmïúÞõ"Ý¢[t=IOÒ“Dö•í+ÛW&ÒSÒSÒS"b¾i¾i¾)b©°TX*äÅŠ«Ž«Ž«i^×¼®yÈõèë¯]Mä×g–÷/ï¹|üòôåiy*ÝÝ$¢?2¥›ÒYcV—µ]Ú.Ó=‘ Þ ^‘Ûù·'oOJÌNûίv~%248(²`]°.XE& & & Dz*{*{*ErssE–E-‹Z%’>’>’>"ÒÞÞÞÞÞ.2R5R5R%RÙ_Ù_Ù/Ò’Ö’Ú’*2•þ³åg‹HZlZ_ZŸÄˆÌ&Í&‰˜—ª[ê–éžpÂ{Æ;>ëøìÅ]Úý—;?ìdaý½õ·×߆ó³çgÏÏú¶èDщ¢E°võÚÕkWÃPöPöP68ï:ï:ïB‘¥ÈRd)}JŸÒáÔŽS;Ní€ÌG™ße~mñ­Ã­Ã~glGÇÖŽ­ÀãŒaÜÊêÝÕ»>=¥½§½ç»õ<â!RJ)8pøñB -´dá§a„@g‘E?¼«n—Ûlóæ£údõI`Î{+õò¡£¡£3œß8¾´ÃÓþ´ØµØÅœ¾R¯Ð+€O¨§4‡æÐ %kÉZ2èÇõãúq >ú@Ô#õH`™d‚ömJ›í ï·|Œ§„N„NÌòÄËc¿`~¶‡l”—™çµ«ÚU}—¾ ׋?VÞ,0m ÐÐ6l åŸ×®hWü™{ðöàÿËüÞYIqyq¹ß¬äƒøFGPGáàžqÏhïhï°jX `Â>Ù°þF¼g࿘•Þüžz^æ×ÅKû{9_°ÿD 8wIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-108.png 644 233 144 3052 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜßIDATHÇÍ–aLTWÇÏÀŒP¡‚)-¦@Ó˜@ aD³Ó6+dHhK0JJiºØ~(KÝ 5áCMlÖîºY±®Y¬Å5jªíÔX5¸tC7‘J3c]Y #lfæ½{ûaæÍ›¬éwß—÷Î=çüÿÿwï¹ç^Y ¤<•òTJVÌNyÓÏØ‘±£h f5ÁQ稻ÝÙG²¬ë_ׯ¾³mËoÅ'ç‹ØøÉ|Ö¸¬{ }(}ȱ=nwÃk›_ÛœñDÌ>|\§\§– h=Ýz`øøðq~ Áo‚ß,l_ضmù­x+ßÂKÆ—îÿãUgVqÌBzZzš¾\øò3ûbÿzj_©}àÇÔSu ˜ÿ2ÉÔÛ!¬çA’mùãñV¾…gá[|L@®'×#Þoƒ«/–ðÝ_1:žìxÒ⋞bïð™7ÆŒ1s¿¹Ÿ0Ö{ôзÔ-u ø›~O¿`~`~@˜#ƧƧ ¯ñoÉ_âxÄñ8_‚?¦Ç^J%"ÒóÔK½$ùu§±ßØzÚœ2§ˆÆšê©TAL̺BWè Ðݺ[wƒöè]ƒÆ#ªsU›jJbøPŸ[Ÿ „,~I.¶Ò^pýäú)ä„™‡3kì=¡'XYž_Y½²¢ÑÏ¢ŸÙBÂóáùð<ÌÎ΂ ¨€ Øþˆ/â‹øà~Íýšû5`lŽx#^Vâî]øgÍp…\¡ÓÒvô+îµµ¶µZpªLÿ*Z-ƒ…ß/|¾ð9ºº¨º ºÎÖ­;[g7«fÕ¬ ãpÆáŒÃÐÜßÜßÜKÕKÕKÕ°{x÷ðîaÈ;›÷EÞà-ñ¾è}ýß7C¯‡^·ù¨xkä­«öŽ~öíû<7X0XX–åù¥O–>!ìît·»Ûí½;!2!pùúåë—¯C©£ÔQê€`Z0-˜•{+÷Vî…ÖâÖâÖb¨H¯H¯H‡›M7›n6AÑ‹zŠzàï›ÏÜ8sƒ°Å§ž?Yt²ÈöíûN‘¬/³¾,¯’kž·=o‹È?ED}«ÿ”99 âöü‘ÊÆÊÆÊF‘H4DEãñÀ¸È†M6mØ$²ñÎÆ;Ï^Ÿ½>[$?'?'?GdMßš¾5}"ÛŠ·o+)9TòqÉÇ"ÏÏVì¨Ø!é±vô9~ë¹è¹("’õCÖåU)"©µ©µ<'™«.­º$"ÿ‘yùƒŒÉ˜Hj0õ^ê=g‹³ÅÙ""nq‹[ÄyÐyÐyPÄð^Ã+‰ÇµÓµÓµSdäÂÈ…‘ "9í9í9í"ËUËUËU"z­^§×‰øžr¹ióú’ó]ç»"–ž5¢FÓ‚QkÔŠHTDDrOKD"6¡Ùd6™M"‹å‹å‹å"ž“ž“ž“"³ûf÷Íî90~`üÀ¸Hàvàvà¶Hƒ4HƒˆLo™Þ2½EdèîÐÝ¡»"®?˜|0)’·;ïÙ¼gð¹òÃoøEl=V1¸8¸øckNñ³ñ³UÐéíôvzá깫箞³‹ q q ¶NmÚ:£e£e£e¶¿w®w®wªò«ò«òá˜:öðØCý‚~07â|‡‡í³w%m¶}˜´K0B†ÝÑ5a–X² ñàÁœà'’Æ}øð>¯Ïëó€B¡b (`1Ž7dô}I|º­«­ë‘]YÚ ® +r¢g¢3QˆƒíÕ¡:XQͪGõ€þ꤆ªòTžÊÓmºM7¨Q5ªFI&™ó´é3}`þÎ0@=íŠv±‚ÏÂÿ>ûûl êšsÍ=ÒǬFÛóÔgÔgØL¿é–Õ«êU¢ñÞ¯#þ­"I6‰ØøŒ«FÕH̯ͯ“ñ-¾G:ÿ/œ•tt$úZôð‘i/±¹ÇÜCô}°mËŸ(‰x~⬌ãÿâYùØÞ.ÛûØãyƒýBlµ2?ÚeVIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.4.png 644 233 144 3107 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜüIDATHÇÍ–mH\WÇŸÑi)Vkp v‹Ü4Ò„ Q’´UIL_D‘€acR)¥¥‰¥%é‹ÚÅvÓøBè‚Â4B³u;1Uª˜¸ß ˆ˜7W…F´*5jëŒ/ã{Ïo?Ì\ïÐ,û9çÃ=Ä«2>Ìñ0B6ías½‰gâ›ñÌø!>‰¯&¾*o~ó°Ó&"rÿ[ø éƒ$ @óp‰J*‰Ý®Û Á¥àõ“ñ¥ñ%P¡*T€º£îAý°~˜Áàbp7nbù{/¾ìŲM‚÷¿åòÆ†Ó ‰Å‰ÅÖž†çêl(ðøA½  õ«Ûœâ€z  ‘@Q(µ[íU{72…*WåªÔÝ0± Cø;bì5ö¢©·ƒ©ÁTÓ¨õ£n.Ül¬ÎŽØJ‘­Àésú|vnŽÖŽÖnÀ\þͿɿ‰í¢vQ»hÅÓ¶iÛ´m0·}nûÜvÐ*µJ­2‚P;í´sL1¬‡Ô÷VZWZYùýÙUߪƒ0þÕøW@¯³ÞYï³ó[ˆ0,"Rß ¥Ÿ•~j€ñÒbÍ\Å\dÔe´d´ :¿ëlèl°âðððBü™ø3ñg`ÿùýç÷Ÿ‡ùÛó·çoGüÀˆ6¢XòÙígsÏæ¢rÖ2ÍüÕÔ/'SN¦Ý!>¢þ#"2XMãMã°< Ž§Ÿrmrm"`æu0k0k0 ®´\i¹Ò)¾_ŠuèÉ8q:ã4Ôyë¼u^×F¯^µN^^îBîð~7º/{.{€ë!>‚/T3#3OÍ<êp=«Mh°;s÷+»_¶ü¶ü¶|Ìf³0qcâÆÄ èªèªèª€ÔC©‡R÷œ÷œ÷œEh>z>z>rãsãsãáÈߎ|~äs8´ã ÿ ßòÓ™Ú<µ˜‹kŽkVÍ O' áÃØËc/kÎ1ç˜ÏNÐìctþ˜˜ˆÎì×;ô@7Šb4´p˜eXd`!<Xc XbžyÀ03n7Ž£±®÷é}€?ŒO¡£Ðÿ£óÿá®4ï.ó® ôUTkm±~T?JTêÀ† ,Ù´o‰ðzÏÄ7ã™ñC|ç×Åcû{<_°ÿN4&ÚLr³IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.2.png 644 233 144 3154 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü!IDATHÇÍ–ýOTWÇÏ ÈL4´€‰-iqqm¶L(šb%j#–Ȩ£ãV±1F,1Ôc¦âR%µ¬ U•]×4¼•B‚B_`×( šm‰,/1›”XÀ:Î˽÷|ö‡™ëŒëþž_n¾ÏË÷ùÞçœûÜ#@!D|ø) &%&%fqÇ|±ß3¾÷‡¦¾¨‚a›aÛÐq0_0_H¨M¨Õ†#X÷ëñÑùBDø£ëév/"†¸–¸Ãú0þÞÏx?ØÂ_ô‚éªéêï µµ´Õ·Õs~ømÀµÞµ"X÷ëñz¾ÎÍ/>ÿŸúB@lWl—á?· nðZîk¹Ë>Œ/ƒ-ù[ò&æMÌ“1 N‹X$×<èk: ëþp¼ž¯óéüz=½~H€Äu‰ë„àï[Ý[ݦšPÂp#ç——@ö¯RËW|Å"P¦”)Õ¡:ðS)­Ò ÄÊX ïËû€OÝ¥îŠKqÕ¡|y=ÌçtœqœÑ7riëÜÖ9S $nHÜÙÓðóÌ–Ú-v È5Á›ÀC‚LR‡Õa‚lÆ‚©·Hî—ûä>"ë÷g:)2(ƒH™¥%j‰ äÑ¿üu»o»OxfCÔV !Äçø—éÓ7žù0ž2žÁ¿°iêÝÉúÉz¼Ê1å[åÛ¨‚}ôÑþ‰¿/¼üñò(TD`° è :aêO“§&Oá –‡øaüõñךMžùº! Bq±>R?RÁ]Î#i–µÙï¼ùΛP™Ð”Є´wÚ[í­àíóöyû"ËeŽ2äÎæÎæÎòÜò=F¬W¬_[¿ó_ÌÕæjdÎùì“Ù'a¦JûRûR³ÀÁ‚ƒ Ý éJ®BÜqÀ³?ÎB}LÇÏ?ËÂÕ‹Wµ¯jÇïòº¦]Ó°$cIÆ’ ¸»é›`ðÈà‘Á#‘ƒoË·åÛžÖ`m°6XaÅÒKW,س?^e^eÆ_UU¿§~,„ž—z^eAHàñâöÅí²…mQoZ3»v?ä|šS–Sɥɥɥ0zcôÆè °Æ[ã­ñPVVÖÖÖ‘|­IkÒš`òÞä½É{0á›ðMø çDÏg=ŸÁßJ ¦áFÃO­?µx–y–ööBÿB¿lòœ¹Î\§ÝÏ g~QFŠGŠ™¾y¾ÿxÿq˜®œ®œ®„5½kz×ôBfjfjf*$u%u%uA–-Ë–e£Ïè3ú #®#®#îùÎ555A¦3Ó™é„Ä~ú#îi¹{jíÔZ`.Á`ÐîÔu ÅB![æ]Ÿ96sÌðçºÜ¶¡¶!!Nä”ÊBœÏ¹Pz¡TˆC7 ¢èAу¢Bdy²¤ ²v‚-ŠÊ´¥iš MRË"BÑ]ч<”·‚»±iˆÆ4+k¤ZÑX‚[6vÝnBÒnÙnb&hR¢!ŽI ÁØÌ½÷ÜÏ>̽3³kûîy¾¿?ßï÷νçwŽ@’ô”÷+–KƒËÒ8ؘ‡7‡7ÿò/iü±W¯þû <Ùòd Àò“ËOšá,öó~}n¿”åÏÕóãzJÙ@þ§ùŸj<Ü oT¾Q^™Æ¸ ‘ó‘ólxçÂ;>ûä³OØ SýSý?ÔüPYìçýz¿ßçËåWóÿéK°äó%ŸÆ!ÿ‰ü'$({©ì¥gö¤ Æžø¶ø6€ÉÐdÈ €“¢DÝ`žyüu/ûy¯Þï÷ù|~_Ï×OûÆ c¼²ã•‘ŽtÃð)ì¦â¦b_Ï:Ïqö³Ÿ¨û/ëŽu¸àä9y,‚û­û-°è¦Ü€ûûpÚNÙ)ÝkÌ~Ïû¼O4×á÷ô2úi?úßwûá‹Xµ¡ÚPÆÐ?Ùã<ë< fÊn±[°¼„ë†Ì‚Yê©§žìj¢‰&0Í)s*uÝÎRg)Ëì~»?‡ÿÇ×x ßà‡/æ¼JIªø#D¦"Sóy8£‹£‹À[Á­ukYH•¤6§6ÃLÙ̪™UàVº•neŽ¡!†ÊB»Ø.¶‹!¹7¹;¹¬Jk‡µÀmq[Xào>ÿ¨3ê@Fßóãûøðî¡w0ë™´‡íáì7L5Œ7ŒC¤;Ò醺¾º¾º¾¬7é&ÝdïLìLìL@tWtWtlüÝÆ½÷Âlçì³_à àyz¾¾ç'˜þߪ/J/ì{aŸdj%)ð+•ä=—÷œR—:/}té#7 nÜ*M8:qTºvýÚõk×¥žpO¸',VVVJ½Gzô‘®Ü¼róÊMi q q QªX^±ªb•4²zäÁÈ$•«\)nzzž¾ï'(-ûrÙ—UÏK±M±M’ê$)ÐáUäOî™Ü?¹_*ZQ´¢h…T4X4X4(•®-][ºVJL'¦Óʬd^2/™'Ý»;vwLŠŽŽ–¦nMÝšº%­ë_÷õº¯3åù×}=Oßó”BñPœµÒ’‹K.J²$I3~gèX¨5Ô*Ù[ì-ö–¬˶lË–"½‘ÞHo6þ°üaùÃr©*Tª IãgÇÏŽŸ•fGfGfG¤ÛNl?±=[ïþÆ×óô=?AÉô˜žÀ$ûeûe)˜”$ú±ÉØ÷±ï¥‰ö‰ö‰v©¹¦¹¦¹Fš™ž™ž™–ªV¬>(uë:ÖuLZÓ¾¦}M»tïܽs÷ÎI7:ntÜn'n'n'¤²’²â²â¬1uûziýŒŸôÇ6´NÏžî¸õîoí¥öRý¹û@÷î°!¼!¼! —Ç/_‡¹†¹†¹ˆÄ âp¿ê~Õý*8==…êáêáêaè,è,è,ÈÙÅ'˜c‘¿§õ2úžŸGw墿KœB§ˆQG.æ8ÇsˆÛi§(§œòœøjV³h¥•Öœø0ßð pˆ6ÚpÁ‘#Àùé]ùè3£Ö¨å7°Ì{æ=Ì/Ìv³œçõÎz0}¦Ïô]tÑ&h‚&´ÑF˜ Sa*ÀitÞrÞókÓ`€¿š§ÍÓ,xv·b{só§çXÎä§6\ΙÌ8_9_˜zSE*=¶ p1`Ž9ær°Ÿÿѯ7o›·±²|>¿¯÷Èäÿ™³’¦’¦’œ³>à¢`ÏÛóΛΛ,‚{Õ½ @€d±Ÿ÷ëý~ŸÏçÿÙ³ò±½]<¶÷±Çóû_Á™†'Xê¦IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-28.5.png 644 233 144 3257 14774263776 15057 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜdIDATHÇÍ–ûO”WÇŸma,¨­@Ö­†´J–Ž ^è&%ÚˆpÜ*˜õRQYS\㦶Ù&»›h ±[­UÛ­5«#Z¶‰³êÒ"â%×J²ÍBP†RFw³Ua†Ë ¢Ì¼ï{>ûÃÌëL¶ûx~9ynßïó>'ï÷™Û¬3­3­“£¶u{ÜŸ¼,yÙ¬¿Díã:XÖXÖÜþ=LùhÊGÏ;Ÿw]qÛŒ›ù‰õ"qüD>Ó/S%îHr%¹,Å1{”ç”ç$§Gíƒ-`«·Õ?Ô ê|Õyw­»–ÐûMï7â@1Äm3næ›õ&^"¾ìû~xæëg¾¶ü’žMzV2_Ë|íå]ÑïËP¶²l%À½ ÷&(+èý@ )ªÂ\ ¶å›õ&ž‰oò™üÑ~Ò§-á“ÕÁÕAÛ©hA×gœØS»§Ô5€H=¿ã8ÇI]tŽi£Ú(ãêÆAã pJ9•@ÝR·ôõúzÆ h-*§|JŠúWOEö¤íIZb|8n8nØNAú é/ÄÏ4¶ZÊÏ^/z½” rc Ôyãˆq„ˆ0¾5¾E©_ª­jë“I¡¦©ij0‡9̉û $ˆBãc>&Ì`†ŒÜ€uo­{˜ࡥ G)"’}”fÛÛ™ÐDðfy³ ²€ýö¾÷úÞc,òjd{d{œ/¼7¼7¼üeþ2h9ZŽ–Ã–ÒÔCõF–ŒÔŒÔ€¯ùÁ‡>d¬ÿW£/¾Ä }Ê÷o~ÿ&À¤ŒI¡‰ª>Ú¨‘ãסúýê÷a䀑·êË’³%gaòÆÉïN~Uüëâªâ*ð:½N¯ÖØÖØÖØ ×áËð#Û‘íȆ±Ê±Ê±Ê„…‚¡`2ïfvevýöö¨Üû+öW ³ú~Ïý#vŸß}tG´«q_DdáßDVï_½_äË_•~UjÉ÷Vy§y§Ix䳑#Ä’|7ù~ò}‘ª¥UK«–Šô¹ú\}.‘‹.^¸xAäö®Û»nïiYÕ²ªe•¯ýq÷ån#Ùß>ÿ\ÞŸïÏû¾Ïó|>€ˆˆ,Nü ˜íf»9+ŽÍ¿MÚ3ÏxüÁ¶8~WÓ^ÓÞÁ?@öÛÙoäœÍ9«_KbÃoħæ‹$ùSëvY,IÃB×B—ig¿O?]œñ“8nìk—µk:Ïyžót¶v¶òÜúò֗Ć߈7ò ¾T~yíê‹@Ú…´ ¦ÁÂô…é"péý¥ü.0úìÙµgÀ–,Ê šÈ$SíB„0–?þD¼‘oðüF=£~\@Þ#yˆðNÅTÅ”µ%žpícÞª{¯î=PýÑ.ÎÒL3™óÅ|Ú‹Ú‹DØ®£œSmª @ ©! ¢íÓöX Þá}Þ'sŽï£ºöºvCàµù°"R±¶zä¿÷öÔc,snpnõs€è߀qÆA-ÕF´¢T²‰M(õ¡úD}jH ªAHùf>|)x™º«î¢”]Ó4(0à (k‚‹s—sî žz,e+ED~ú±ž³ž -€Qû¨¢àW¾_þØúc+3±†˜7æeÞšN§ƒ½½½‘â8Á N$álßìíÙÛ0±ç–û–›™ØÏâü0jµ}Övk{h¡G”IDäÝ¿Â!íS¯r›Ûú†_”<\ôpäü>çLΔóŒó ç„á———@ÉpÉpÉ0ôî9Üsx¾ð@ ?Ðå¡r¹òWçoÏߎª\W¾ª|ÜÝ o€çß|þMP¯ÆõH¬TDäj|~çó;Ðjö~ãýFUmËrx"¥¬@Ø í…öBèu÷º{ÝPj+µ•Ú’áRÅ¥ŠKó…yW{W{WÚî5Ýkºaà×O< ž^µqÕF"½/|µí«mª .x.x@[×#³ž}6íݸtãR˜˜žRS À7ìujQù¢rå2ó‘iÊ4E‘t-ztÑ£"ƒÚ·‡¾=$“3"Þï½cÞ1‘g³À)r±ñbãÅF™[æJs¥¹RDÖÊZY›b·™mf›ˆk«k«k«ˆm¹m¹m¹Hðx°>X/¢«‡ÔC"]¹¹2)’gɳˆ¨”AŠÌª[;¨4 ‹¤}–ö™È•'®Ü¼rSòL¸|à²Hÿåþ¯û¿ TªÕ"ÙcÙcÙcIѕѕѕ"¤‘FZÒÞ\Ö\Ö\&b YCÖÈxÍxÍxˆ[¹u·.â¿âk÷µ‹äÉ¿/ÿ>É ÃAy]9”Ã4,4&ÎØŸÏwœï06BU½žQïªwÙbÛbÝb…–ž–ž–žùgè¨ý¨ý¨®–\-¹Záõáõáõ°»mwÛî6˜tL:&Ðt¬éXÓ1pd:Ì34Çš>hú€ˆQœï;ßüÉ8c·²¶ª¶ èIܥюÌÕWü“!†€ÓœætŠ2 íÿà“œä$0’È7ø‚Ú:mÐaÜÊÚWj_ôÄ­d$ÑǰŽXGB hº^r½´—ã}Fk˜ýtöSfô½B¯zñàI9äûõýú~ tÒFÝ¢[t ðžáÐþ®išÚ˳îY73úŠDë¸^x½Àúõ»Ð¾Oô±yŸ§2žÊT¢3‡µ/´/ôƒúA¢sÿbÄ€'fc,!>£‚øñ<¨¹üˆÁgL–D½ù?1+©ÜW¹/eVòÒŠ—VÌt 4 ±P, =«=KTŸêÀ„ ’ØðñF¾ÁgðõŒús³òž}]ܳï±{óûlý½¿Î¿ŸIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-6.png 644 233 144 2245 14774263775 14623 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜZIDATHÇÍ–OHVYÆŸû™¾¯„fYRS$LJѸ)•&¤¾ "ŠPh0+†‘(7¸h èf ©>«ÁAšQ a(œ&Ñ,$Ʋ(ƒ#El2ç»~³¸÷Ü{›•ͪ»¹¼ïyßç÷pιç$iyð$V'V'R~œhŠòµµŸ÷øñ9¬=ÖžG?À²3ËÎeŠ2îH›qSï—"ý8Ïäµ\Q"ÿZþ5«&ˆOÁ¾²}eŸùqÇ ${“½ÛpøÆá×/]¿Äw0qâ>ÀLÍL D±7õ¦ßèÅõuê?| roåÞ²Æ ?/?O‚’%;×}ï<[éºtÀ«œW9^œI B¯˜cóLÅb3Ô›~£gô Ïð}?‚Õ+ª%¨ß_¿?yÑoùZ‹[‹ /Û œæ4…ØöŒ=à´8-,pÕ;êoÈr‡€½]Þ®ØxXô‡zFßð ß÷£×¶ókØ[°· 4ô8÷œ{@ÖmpÈm´Ò n¿Ûçö…3†×è5x @Š$É(ͼ{À=@6Ô õ Ïð7Tú$'’sK`ÔuBÁoÀmpxÇBù“¼ˆŒØ«ìUö*˜<1ybòd˲eÙ²hœ_¸ÍíXlôB}Ã3|ßO`ìܯp¤ýH{ؼì9;Ú;—è¢ (§œòÓø´ñiãS(l.l.l†ímÛÛ¶·Át÷t÷twl&‡½Þƒ˜ÞúîæˆïûIøó¶µ_ª:Yu2˜FY_JVŸÕ§$Ík^–wÄkñZ$ kXÃÒ@ç@ç@§tçùçwžKCMCMCMRiQiQi‘ôxåã•W*|c‚ ÉèÅô^œ¿µ‰”º›º[ñ•T½£z‡$é¡Z¥ÄúÄzIRRI‰*ª¨Š@SÛ¦¶Mm“Þô¾é}Ó+¥ÇÓãéqiSjSjSJ*[þ¶ü­¤ZÕªVJÔ'êõ’'O ôóc#¾ï'!å¤sÒ|!åöçö‡Ü¿$mпK–$[¶ìÈØüùùóó祊5k*ÖHc=c=c=Òô“é'ÓO¤ uê.ÔEõn[ãÖÄô"ý€gø¾Ÿ„äÞtoZHön{wX¸BÒ3=óWAHV‡ÕauD -·lܲQzzz’2]™®L—4>:>:>*•——GõêQz"½˜~À3üÀ¿Ù~? Wg¯Î†{ó[p.;—YÞñxÉK^‚wÜ;î6õ•æ+ÍWš¡2¯2¯2º—v/í^û3dȃ 2¡^¤ð ß÷³ø¯ò=³ÌÆ€kYËZà,g9Ë0ÂÐN;í±¼c -î«\ü9æÆ,¾J)7å¦À9æsŽ[éVº•À ÄŒÙÿë[ÄÉ{È=;ù!D..ð>4ìáùÍa5xQÿ¢OþüW†Kàt²Þ çï ¢ØŒ‡Kö±ÿÊOövñÉÞÇüã§vƒýñÔ”~£é ÇIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-27.3.png 644 233 144 3204 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü9IDATHÇÍ–íoSçÆïh0Äà” ÄV„Z7yŠAS™Åë %¥¤$„¶¡I­Bƒ­L‚ í- ¡D¼© j:Ä‹YJ‡29Š ’@$’°|€!P ENKQ@ìÄFÏŽÏ9Ïoì{c÷—£ë~¹îë<ç9÷󈈈-ñHŸ•>+}J§ÿ*韸jâ*ûÉ8nÔ!­$­¤ÿ÷0µaj@Ö±¬cÆ­$6ãf~j½H’?µŸé›$ÍÍi˸ÞÉ{'oââxï%°´XZžjða뇭n—Ûżybðýò¡ë¡‹°ö—8?xCÞðO‹Ûâ7õ¤³PDdë|yýƒ¡†¬Z(òª÷U¯š¿nÃMo4I›}]Ž-Ç&–’Ê’¼’<‘SNežÊqˆC"²¨eQË¢‘g\œqQäˆýˆýˆ]ÆldûÈö‘í"ÿ(ø¤à‘Üb‡ÕaKÙôâ}Åû¤-Ö˜cͱªùò‹Ê•+¬gz´Ÿˆˆük´[Û­àúƒggªÊͶ·ÙÛˆšoììvv;»a·¶[Û­%W¢«±«±«fÛgÛgÛáî”»SîNIÆ×¯9^ÎiÎiÎiü?ü8kúé駉vOïÐÿ@UGyè{ãz„YÖï¬ß©fð½ç{­ŠàÞÀ'~8»;j;jaNÖœ¬9Yе§kOמdã‹7.Þ¸î:¸ëத?z=z=z=‰C¡ŽP,ùÍ’-K¶À‹ßdÍ: ¾C=>àwú j­ÖÕ,¸m¶Nã&ëü¯ù_Kþö;,?ùø äWçWçWCÏäžÉ=““®æ_Í¿šö {…½‚µÁÚ`í³{«?·?·?zë{ë{ë!X, ÂOßv,s,×ÏO6lÂÆ9ãèK­EÖ"ãfºqC«ÑjÒnŠ{Òà¤AÏóç$».²×º×*R^Q¾±|£ÈÈȈÈpÉpÉp‰ˆ»Ì]æ.™wmÞµy×Dl;m;m;EFªGªGªE\\\D.8.8.8D*öWì¯Ø/Ò=©ÛÒm ü:P(™:`ÛaÛ!Ù"Ñp4,"åʪ¬i7Eÿ¹Ç<•žJh»Ù÷eß—ªjÕ»+¢+¢DW[W[=òúòúòú weïÊÞ•P—]—]— ­–VK«%¹BC›‡6m†bg±³Ø ¾¥¾¥¾¥Pç©óÔy`ÁýÞ^8:|øÀáæVUüý«/¾ú8eî±øYÖ › 7šôÆÏ@?§Ÿ H0enñ¹6fW¸Â`ASü …Îr–³€"F,%úž­gÌ~›j6Õ£q=‚;1ǰx-ÞÐxÕãÍ÷æƒþi|Îè·GŸŽ>%¬ÿQ?«Ÿ¥«° ƒñÈxd<UªJUiŠ Câ3™ÆL`./ó2èõúeý2è=?zž°131Ç:¼s½s,ßZ¾ çA\ϳ“t}Úú4`81™ƒz»ÞŒEF1´Ä?%@ˆ!’"Ì@GãljµV(ã}ã}bDôN½slìöÂúŒõÿwò'ÎJŠËŠËRÎJ¶¿´ý¥1‚ –Z2A i!½\/' ê’º@iÄfÜÌ7ëM>“ßìgö;+ŸÛÛÅs{{>o°ÿ°5%8ŠIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-9.5.png 644 233 144 2635 14774263776 14775 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜRIDATHÇÍ–]lTEÇÏ.Õ~!Ý"ðRHCyQ’v+‰ ”‚Z,%}„VáA / ñ¡/@I„>u#²¢R T”€U7J¢¬a«- ¹tØm(m÷ÎÌχ½Ó]¾Þ™—›sæœÿÿÏÌœ x_ÿÿÿ´´íÿ0ãÏ[·z^gÚnWà{×÷CÑÁ¢ƒÅ¡âþ+cÛyŸ/’ÁÏæ³~ HƑΠûª<ûK¨/¯/Ï›™¶÷^‚üSù§º°å›-ßœüúä×|w¾û3ÀýªûU±í¼·ù/_¾|‚_^ê~©Ûwr_Î}YJW•®*û4ðwÔÖÔÖü;åß)Æj˜ÊTSŒ0‚ñ,ÛÎ{ñ6ßâY|ËgùÓzf,Ÿ±\Þix§!¿#ð×Üí%ÛK,_êi¡…©æjêNêpR‰ÆÁ\5Wðãî›oÍ·`”ûžûãæNê^ê˜{é|~ñððð•Ç7ÉŸÖ#¯í¾•Œ­cÝdR}»¿º¿‚™î^t/’ò&Œ™¢Gõ(PK-µdF’$IÀ%5 h¢‰è„Ndá³~úúé¶‚ûVf-¥ˆÈk_AþÝü»#9S1|À0ÛÌ6F'Sy©<ˆ÷ÆOÇOƒÐz€§†qk\HV'«“Õàô:§Ó0¼cøððaP…M|Ĩ¾†þØo±ß ßÖã k¿ M_4}怮–²’ýI'é`Þ–Õ«' àBÁ…‚ а£aGÃ0×Íus=#,Q¨NTCé`é`é Ìß5×ü]PQYñzÅë}5Z­ÀØx=lùÒüV'¬ÿ3èJt%@-0›¼¼ñC?ê>Ô ‹7.nÌ>>>€cþcþcþŒ¨}¨}¨æ˜{`îhmomom‡X$‰E²Jû¾ûÈ}Ä8 Ë—æ·zü"Ó.N»øÆ"‘åÕË«E䜈ˆ¯Ã[éÜ’#%'JNˆ8‡ÎC‘®–®–®‘›E7‹n‰ÄÛâmñ6™áð@X$'È ˆœ«?W®^¤æ|Íùšó"C ‡ÞzSDÂ9ù9ù’Ë[–Ïã·z ø•âWtâÿÅÿo#ÇííÛ9¶v‡v‡v‡`ãí·7Þ†â¾â¾â>èp:œ'Sˆèñèñèq¸½½Íø—Í\6sÙLh+m+m+ÍøÕRËçñ{zü"ú;ý/*âÖ¹u"f‘ˆˆÌ°¸R{e핵"ÝýÝýÝý"+šV4­h™˜˜ F‚‘`D¤³«³«³K$²5²5²UdóÙÍg7Ÿ U„*B"NÐ :A‘ò¡òÁòÁL…}>Ë—æŸÔóäã’·æSÜN·“qûg{Ã{Ã{ð yAó‚fè­ê­ê­‚äµäµä5¨+¬+¬+G;ÚѰÃþ û7ÀÂ[ o-¼GËŽ–-ËÚcunÒM2ÎïÏÞcOJ´=%®rÐÇ n`¸IŒXpˆ! ’J*³ü"DNcyãzèjù˜1  U!¤{ÝsOeVS±ñØdXÃ?z‰^¨º¡ t¨ùjžšzÞ£÷g8ÃÐЯÉ,Õ£zT¨mªY5ƒ^¢·è-ÀºRWfõ±I¾gö±¬ÎÏú¼õyÙYõ©>Àèô¤¼Å5àuvƒB $ãUÊ0Á0fãõ&½‰¨ŸÔOu~ï©Îÿœ»’í³·Ïž8´ÒÊTpGÜÕ¨sÉ\À‡2¶·ñ6ßâYüçÞ•/ìëâ…}½˜/ØÿãY °§sQ^IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-30.0.png 644 233 144 3212 14774263776 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü?IDATHÇÍ–ûOTgÆ¿C™)%a)ìŠc4ê²*ÂM“–¶¤ÝíèB(f .ae³†ˆºmâš’µñ‡6ÙXÈâm·-¦6ŒxÁ*ÙØ ²©›º5\ÖxA¨Ê Ñ83çœ÷³?Ìgvûx~™<ßËóâv,oXÞøf/,k]Ö x<ñ¸q=ŒÍ¼YÙ/æÔ3ã²\ÂØS±§,E!Ü••¶Ÿñ{—Áî¶»hPï©÷twvwò˜œX(Z(‚06óf½ÙoòEòKËÿé‹@Ì™˜3–›ûTìS"à(v¯þc°`r5”¼VòÀTôT´Šý{ žxU,±„ùÌE`3ª7ûM>“ßÔ3õƒ~’^HzA„¿•zK½vW°áú‡l>Ü|Ô7Gh§xÐ-º8¤=ÒáS_ƒ€Gõ¨õ•ú ðéUz>дà(‡9L¼úgˆïLóÅæ‹¦Áëòi™µÌjw™~ä×öý—ùiyfy&¨M+À-nÊ×ýºŸ€êUmª ¥–«gÕ³ÿ)T´ŠVÑ@-oòf8Îï)¦eÌèCúà.wÁð…øw”ï/ßo|ÿ別ùùA.Ù?²´d…É´É4ü€_}ÿüw®ï\<Ô~­½¥½ÖóMû¦}Ó0ï˜wÌ;@e¨ •aÈwúWø_õ¿ ó+gßž}›‡Ê䇉]»€û°}xÉŠ/èG”ED¤ýshÔuðþ™øÁÈ|¾`£s£×'¾˜ø"ªüOåMåM UhZÔ7Õ7Õ7mÁ¶`[€šššctІÛf¶ÝÙvì]v·Ýªù¢:¦:ÆÌ™ü£ÁÑà6ýˆV,"ò¯fè¿ß:£zFzFT]aB®'׃onznrnÒ‡Ó‡Ó‡a÷ÖÝ[wo…¼¡¼¡¼!˜q͸f\°öÀÚk€Çëñz¼aC§;Nwœîgº3Ý™³y³³°¶eõšÕkðõe]á ªÎ={tkÐO”õÓO‚'+O~“Ñ–Ñ&ò[£ä¹’ç,®þ¿^ì»Ø'±¥ÿ.½QzCD•¨U"'²¬uYë²V‘ÔºÔºÔ:‘4gš3Í)2)“2)áçvÎíœÛ9"əəə"ÉÃɣɣ"i)ŽMŽMûŸÚ׈Ëâ)þ¬ø3|O_zúRV^',^‹§¸Ÿyé™—D¾ÑÇÇe~ôáhêhªHÏHÏhϨHÊž”=){D.l¹°åÂ[™­ÌV6ÐZ@±Ÿ³Ÿ³Ÿ Ç­+­+­+E4§æÔœõI‚@ˆ­ÊvÉvIæEbîÄܱ$D×D×àŒR§õZ½Öò­HL_LŸÈµ_^›¾6-I›½›¿Üü¥È`ß`ï`¯ÈÔù©óSçEJÛJÛJÛDnl¸±áÆ‘}Éû’÷%‹Ìß›¿7O$wéúäñæ¯Ûo{çÔ;§ðårsáXõ±êcÕáoç¤ã¤ã¤ ¯^-¼ ý7ûoöß„Åí‹Û·CItItI4x‹½ÅÞbè^Õ½ª{Þ-œ(œ€¾ûž<à3õøYW|W<ðuÐOh\´ u uÀÙÐ.Qú}GxLáç@¨5ôÒKoÄ.<ÂŽëXǺˆx>ùäç8Ç#øŽhcÚð‹ ‡÷C»’±ÐÃ>f[²rh¢`¢ô=Á9£ï÷{ü)ÆëÆëÀ5#ËÈ2²@ÏÖ³õl0Œc8Á N€!†œ66F#è¹þ Cs̘pN8ì“öÉ%+BsìG“Ÿ [… P¡ÉüHÐŒZ£–Àã7†ÀÏ\PÆÀ™cÎäAQgÔÀoò™'KHïÇ“?tVRVUVqV²kÅ® ÜÀ»¼KS/JB‘Ö“ÖcñÄd¼\ør¡ýçQ¹e}޾żÖÿZ?@ogo'¯ÃÌW3_Ìzf=M»éoÆ›xÉøâûQ~°]´]´üÒI{DòŸÎzãQ‡[Áû‚÷€©Ô©T•ú] ƒ åB„0×½$Ù´ÇüÍxÏÄ7ó™ù£|rŸÌ}RÊ+Ê+gÐDDntAýÚúµ@ €ÖÇŸñá#t«nÚ" ‘ÂêšÑb´gT‡êPcj XÖ+ô ™Ìíœæ4êÛÞźÏê>3 Þèâ/åÖr«ãŒÉGþ÷lO<,€z@UcယT“hd*¥J­S©Çâ;…ÊQ9*ØÌ&6%ôü–½ìE3ú×ú×hÀâó»ïxÇ$x⩤£)ø#8BŽPÈÊ·7ß½ùnvßbp!{!›%ͯù5"ßJëJëJ+¼oÀ ‘ÂHa¤0‰P -´$ù¯]ynå9¸Ÿx3ð&KÊ҉ú‰z`Æñ㛕p”ðw‘S_@MCM¨b£hö÷wß¾û6”)=Qzuiÿ¥g.=ʪ¬Ê ûìûìûì°ÚµÚµÚååå°^ /…ùÉ:ðD”¨q‘ïêà£[݂ſ¨ê’#g?žå/×6_Û|m3\ö^ö^ö†¦ Mš`¬j¬j¬ \~—ß凡¼¡¼¡¼¡ ýú/ôƒ{«{«{+Š…BØäÛèÚè"<¸}”QT5 µµƒnòB™™ª‡ΤϤƒz=VGk´Imvþkç÷;¿‡ÁæÁæÁfÐûô>½ ² ² ²Àésúœ>ØQ»£vG-L§ƒÓÁ±¶â¶â¶bðTz*=• ýÞÓžW=¯ÂZýïûßÐ^Ò^‚ˆž>œ>¬zRäg©‡Rá–ë¶&[“ˆ´ŠˆÈýÔ[¾-_$å?)?¤ü â¬wÖ;ëEzú{ú{úErÊrÊrÊDæææDÔ²ZVË"=u=u=u_–+–+–+"wÄq'ôZ®Vª•ŠØ+ìÃöa¹/b»m»-bÉL­J­Â"[®‹¦=¯=/bÉ‘Ü8@ºf×ì"áùð|x^dssSd²}²}²]äüªó«Î¯™ Îgƒ"þ †_äܶsÛÎmÙ.Ûe»ˆL•L•L•ˆø¶ú¶ø¶ˆFNϤç¸ç¸äŠÃÁ°ˆe‘nº-×cUù]W»?íþøUôŽÅv<|´àhÞÑ<¸ÚrµåjR•89prví.Ú]Î@g4>h|ÐÞïˆw‚® +è‚Þõ½ë{×Þ;{&öLÀà|k+±2QÕü¢;£;ø›yLjWå[5o%U ‘P$èÑÈ8£fšiÆg<©ìæ˜c袋®$}e”ÐAG¢íñ§Èxdø¥™¯æ½š÷€ùXUÆû˜rL;¦CVŒ›ÚM-ÑÇŒ_kÃÚ0KJg [¢¬1@?«ŸÕÏ‚~L?¦c—±ËØìg?ûÁÈ6²l ƒSœã £Ö¨}÷ŠoÅÇ’ña¬î 7€ã–ãVÈÊ¢ÙÇ~Òù¦L3yi£,êŸèŸšñŠñ Züa… Ì2ËI;¤¢Ä™ã÷â{­À¨6ªÑXÑ?×?OÂç ý ýÿvþÍJsv™³’ØlƒFɈ1ú!ýaP#j HȦÝô7ãM<ßÌgæÏʇöuñоÇÎìeÑîè»ÿ|UIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-76-red.png 644 233 144 4203 14774263775 15621 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü8IDATXí—lTUÇïû1…jq¤„PéÔ†tEVšÖºŠDm‘‚Æj"š) ÔÐ#¬?jÕÑ[ÇE~4¬€[%«†”:£ÄTJXˉ²²])‰Yf&PLa€Ò˜vÊ{ó>ûGç½y3q%›ÝóOçÜ{Ï9Ÿ¹ç{ï 1f7‹4“ççç—®&r²:³:³:çÏRuUWõ㥢T”ÂØ´±V¨BªéCºo¬5×›ñf>3z=ùt;_£h²/}~Êíj§Ú©vú.I/I/I/Y ÎܡܡÜ!þ¶àç?/øªÏTŸ©>îrw¹»<å›óæz3ÞÌgæ7ëý6ïO÷§m”£rTކJÍʯϯϯ×_Ùzxëá­‡"##…W¸Â DˆX~rÞ\oÆ›ùÌüéõ¦müm>áš ÷Ëgä3¡=f‚òžòË?Ôî \ <x’I3Š<#M÷j^Í z™¦j*èUšOó^¦?¬? ºW^Œbã6ã643>p-0%PÞSÞSÞ£Ýk÷Ëýr¿Yß5ÁB“|’Oò ¡®QרkÚ¿7*×Vn®Ü¬UY`¯q€D´vÞà 0BɉQsqâ@ÂòݸQý²~9µ^k7¦SÁx-ñyâs"æâʵ•++WjUf}“ÇäŽÓŽÓŽÓüÁ\àZåzÁõ‚Q¼z:ô4—“y"ú;ƒ¡ÁÀÕš«5@äjÖÕ,€è†è€Á÷߈yc^ìVC ‰öD{†«‡«AÇxÂxÂZ ^žžç²k•k…k…QdòX|jƒÚ 6]cN´ÕmòlòË“ bš/"" ÿÖü[øØ:ëÄ:€ìÙ+Ôê €¦o›¾µs.Ë[–cLj«{Ô=On< š/íKÅÚêÚîk»ÏXnílŸ0¹3sgæÎdí¥ù—&]šdjPFÙëÜëضmÛ6€];»¼«½«m œØwbÀæÂÍ…öñ/s¾ÌhÝÔº ˆ$Ç ŽÝ~ìöT½Kóýá^0yL>ôϯ{|ÝãëRßLè=„  ƒÃ0 û&TüTñÀs?>÷£}|vÕì*€å…Ë âj\8{äì€Ýw_§¥Óè{,1“ÇäK‚ò…û¸û¸û¸µP×çêóõù¶CÂhïh¯=W[i[)ÀÍ7Þ|#ÀБ¡#WÞ½ò.À¤ƒ“LÞ?y?ÀM‹nZdßᆆ† š,ø–^¤¥ê»ïrßå¾Ëº·¿0w´vVë¬ÖY­œ‘F¤ ØÁv`ð´á7ü:Ÿ‰æD3À”Д@sws·ý Nœ½0{!ÀÌ®™]g¿>û5Àî®Ý]6­ï<ÚyŒ¬^•O,ŸX>‘S&Ÿ«ä*¹êÚyó©û¨ñ£Æm?êuØ8â_UU ÓžÓXXįØãïÐx®ñœmXzkè-¹Mný³ onx3UïÀú}Çö³vòR‰T"•\;/”»•»•»›ZÌSVPXPXP¨O . . .´DŒÍK–,Ye#e#v0­[KÛY¯×ëÈú8ëc€÷︈5Mkš<*õH=ß¹¿s%£f6ÍøeÆ/ ëP¦(S”)ï_9óræåÌB=¤Ruô[¾{î…¹ô—­†{’zõ—•–•±e—L=©´ûq).,ö-ö‘:å—'wLî€ÄûÛÛ©V×Wç¯ó'bà3Ê3Ê3ÿ¬ó³ÍSoZþ&G‰£ÄQúÐ ðx=aO8µŸÚÄÜ\ ˆ÷Æ{íÚå¾à猘âlg;@Tª × >œjõ'ÑO?iäQë m‘[ä–‘ùÒ-Ò-Ò-¿ßš¨üÃzRŸ’ž’žš»Eê:¤S+‰üÝþÕþÕø-í¾œ(N±£qF°KÁ`{{ÀxÐøÀø %¥þŽ~G¿ Æ»¹i ÖN¾­4+ÍžJ ­JT‰*Õ•b­¢B}[ø„Oø„PÂÊ€2ðJ—õ´nq5»š5gðõÀìÚ5*ŒŠ4À1pSt~žåY0j$»èÿ}ñþÅûõ—­èŠU£þ•y/潘÷¢r¥\)WJŸ%éêLÌ“k”SÊ)å”´«èÕ¢W‹^ÂQï¨wÔûWZÚ­¨¬¨¬°k7áIxˆãÇdÁ·>]Ÿ®OOi±õžÖ{Zï1´Þr§Ãépö$-Oï´´7£õBÊp{Ó}×ø1í?³i×ëñÚ´ëÔœšíp$‰”ûè£üÙ}Ù}Ù}ÆK“9rŽœ³èORÜ”Á7Nüö€Òš¡Ý¿¢ÝnwJ»ZwÚ5ÎÎ΃;†îºcH¿ÍÒâ§Ê§Ê§™mJ-)½LÀ›Äu,µÀLÒnX Û´»ÞµÞµ^s;‚ÁÆÜ8C&©g—g—gWêÚQ·¨[Ô-}ÉI²¿É¨›7\0ÓÌ€EIíîüOÚóØœÇæ<–Ò®¶¶6ÛÆæ «R­T+ÕÎmJ/#fÔ•Äi×ÓîJ‹Ò¢´„ÊLàÚUµ«jWŠG‹G‹Gµ­V‡•°öä‹vÑ.ÚEòÚQ‚õƉÿÑ2µ»2ÝŸó/i©´TZ â!ñx(1Cž*O•§‚$$!‰ý½±‚XALå¨rT9*íKÖdtîÿfNëÓ<1OÌS¿OŸ~½N6dC6@Ú+í•öž½ulüwþŒÎ2ò^·ÕÿÒµáó4'pxIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-9.7.png 644 233 144 2562 14774263776 14776 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü'IDATHÇÍ–]hTGÇgc£IˆfSÔ• ‹` !‹"ñÁˆbýJüf%`µV£ÄâC׊" A‰©1‚«E4¢„¸}ICE]±,j¤±­J¢‹d!›¬“½wf~}Ø;Ùë×»ór9gÎùÿÿwÎÌ™ „Âë|äÌÊ™•3%cç|Ÿõç­Ì[ékÎØ%x6x6üu Š‹ŠCÅ!õ$k›yïÎ"‹ïæ3~áYǤÖI­ž Ç> [K·–æMËØgïAþíüÛ)v·ín¸uõÖUj!ö0ö`°b°²¶™7ñ&ßà¹ñÅÉ÷ø…€ÜpnØó&Mœ4Q(YQ²bΙ€æ@åšÊ5ýú'è@!…ºH’ÄŒ¸Ë6óN¼É7xßðþŒS—N]*¬¬ä_Î$<¹†œœaø¬Û4rƒê?­WÖ+à–R0:ª£Q\Ó{ôÐÛevc:i [àŸ$H!AßrøÆù3zÄ»µmXÎè&6/€¡Ø~d?ý¥}×¾‹åLh=A¨ ’J*ÉŽ4iÒ¼?4pšÓXÀW|åÂgó´ÍÓÌ 6,w•R!æý ù±üXò 蕽ø €Õ èŒ¤ÿ³ò¬<ˆwÄïÄï€zªžª§ ½*½*½ ÚÚÚ Þoˆ7ÀàË„7á…Ñ3©X*ƈ¾š?z#½Èògô8Â.Þ‡šã5ÇA¿P~` K`8:üzø5ú±2½2 888²Q6ÊÆ¬°°ë°oÀð`Þ±yÇæƒÜ_r/å^‚ .ô]èC›xyÝðeøGXôGhj¹@çä5ýÞn CyuyuyuV@Y¢,Q–€ëå×˯—gýoÞ¾yûæ-¤:S©N¸¿åþ–û[ ÄWâ+ñAÿåþÆþìŒéŸ _†ßè0åî”»ºb b @&Þ-MÛζm;`vÕìªÙUÐl6¡Hé" MGšŽ4q•²6]›®ÍÚÛo¼ý1œÛnÿ¹ýY¿´ÃvØÍ”á7zO.ž¬z þ2þœ7ᣇG†¡¡!ØÖ·­o[GŠ#Ÿ²ðÊÂ+ ?ÜkÑgÑgÑgàÛçÛçÛ‰ºD]¢ÎàU–²€QÃçð;zr„PíªÝÓ#„]eW ¡ !„˜êœ Ñ]Ù½®{áh8Ž ±¬fYͲ!¦{§{§{…ð7øü Bœo9ßr¾EŒõ7êoÔ áŸëŸëŸ+„÷¨÷¨÷¨êª ©âµç¡ç¡"ÏðeøÇõ¼¿Ç¸çÔ|‚Ýl73f~ðlëÙÖ³­0ïü½ó÷BGEGEG$Ë’eÉ2XÛ³¶gm¤Î¤Î¤ÎÀ©ÒS¥§J¡=Ünw•Lýªnª›€-/ËËÿ£{ìÝS‰2§Ä–¶"<ç9šôÒë*Eˆ!À¿Ë?ÂÈx3袋. Æ ^¸úš¶‡íáq¹Ÿ:•®>&{ÇzÇ׉Õü««ÅŒÈçª@€üZú¤T½ªWõ@t€LʤLÝtÓ ªKu©.Ðßꀸ„¦ÔFµÑÕÇLßüxsu~6çmÎ3(VdDF­vªXÎâkÀÂ4 1ÄY à ƒ B6^íR»°@>Üø†ïƒÎÿ‰»’àÌàÌq€Û@u‚´“²ZV3úž¾€dm3oâM¾Á3øŸ¼+?Û×Ågûû<_°ÿSévLö'ìIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-30-grey.png 644 233 144 6221 14774263775 16005 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü FIDATXÃ…—kPT×–Çÿû<è—ƒ‚F¤mÒ>ZDÄ(¨ájÔQŒ ¢)qðQZB’” voc¤†#˜L¢ W¤C$i’x¹Šv J#ƒ Aƒiºc¿OŸ=ìƒUN¥²¾œÚ¯ÿþí½×YkoRTTTTT„<±á'f!×Ëõr½´±èË¢/‹¾¤ãõôôþ6†ÒPúÞ¿ B„¿Ícô=Fú.*P R-´Ð¸…[¸`¶a}W–.K—¥“BîWîWî×U+±ëþòâqÅãŠÇ5ß4d² YdPˆ¢…h²ì ‡Øà aFçc>æ3•¢^Ô‹z±Õëð:¼Žð9úz}½¾¾²Ï;èô6ýÓçŒsÆÅïS•ªJU¥hˆO‹O‹O#… |ŸÀsÆÌ3g •¥v©¿4^ÒÑÌ'Í/ñH|\`ÐÑt4-¾N¶’­dkt)ÍF³Ñß}ê8ë8ë8;yLXSXSX“ÿÍ´[i·Òn1>YgÖ™É Y¡¬PV'ÞÂ[x J8á„ÀlÁ‘ˆD$œž‰ž‰ž‰Xa6™Mfõ}«ýVû­V|óÑ’GK-Ùp\­ŒVF'Êý[ý[ý[SKi6ͦٽ¯0 ÈA÷A÷A7L0M|Ž3rFÎhú‡×åuy]“—«_V¿¬~Y˜Ÿ±+cWÆ.®2ä?Bþ€)¼~çû;ßßùž»¤R)þ÷’.¤ é‹2±‹°èþŒ¢]Ñ®høñüx~üß[œ—œ—œ—&/W¯T¯T¯VdgegegqW‚ã‚ã‚ã0VÜ n7ðÁ8æsƒ¹ ¥(È]r—ÜȲ‡ìPzÔ ]N—Óå@pfpfp&ÆJúêUêUêU i~‰Gâc„ÇÂcáñ²9Þ:o·.kvØÚ°µak©&£.£.£Ž“|Ä8ÚÑÄE\Äx”¥G rA.Ȳ‰l"›œÂ)œ°;± ŸÑÏèg€ûžûžû@•TI•v`v`´¤Ÿq)ãRÆ%®2ìÕ°WÃ^¥‰Gâ㨖j©öðŸÊ§ò©€”#)GRŽ -ä›oB¾AP@H9¬ÖkªíUÛ«¶ƒƒƒ@PZPZP°bÊŠ)+¦³{f÷Ìî„{Â=áP__t„w„w„ÁÁÁÀšÜ5¹krM«¦UÓŠÑ!‡|ò1œ)¯¤¼’ò ÒªUª>ðù‰üÄÃkA#hÍK9¡C¡C¡CxwfüÌø™ñ¤ gpgF@Qs¸æpÍaÀ¾É¾É¾ عi禛€Yûgퟵ¨n©n©n0³1híníníndÞȼ‘ äœÊ9•s P‡©ÃÔa@åýÊû•÷ïá=¼4 ‚tŸë>×}NÊ$‰¶[M|·2±2±2‘Jæ3ÅL1s¤Lëdu²:¥×O_?}ýôÓú®]3ºfPªgõ¬ž¥ÔÖeë²uQZ®+וë(­]Z»´véÓþ¶"[‘­ˆÒíÚ´Sj¾g¾g¾GŸ5‡Ä#ñ18Š£8J´Ì9æsnde2ü€ð€·ñ6ÞÒÝéît7 µimZPá­ðVxŠóç+ÎÚ}Ú}Ú}€Ïãóö+ö+ö+Àép:œ«JÙ:Ù:Ù:؇ŒCÆ!#`€P„"@r¸O¸O¸OìKìKìK¿’_ɯ„ózòõäëÉXwöÚÙkg¯ákE·¢[Ñí^BYÊR6~¦b*¦vng˜ ¦‚©`Û™cÌ1æXÿ±[ì»·z•ÍÊfe3`zÃô†é :Ã<Æ<Æ<U¬Œ•±2¸¤@ÏœdN2'ú3ý™þ à|€(¡„ ê @~U~U~uÐnwÛÝv7” ÆcƒQPó|'ß ;±û‘Ì#óȼÎí(A J¸‰lrrrrr2ý©HE*w˜9ÈdÞ)`–0K˜%öx¿À_°,¯Ïßçïó u-º] sHQ¨(TÂN[h mŒ¤‘4’6’Ó$$! &b"&€‚‚²˜,&‹¡ºh¸h¸hðçõ6ö6ö6rÿ©Ü¬Ü¬Ü\eˆ±ÇØcìû>{´åÑ–G[È?`Qî£*ô¡}ÂMìÅ^ì%ÆéµÓk§×–¬–çÈsä9UëXëXëXn¸ú…êª_ðçÆF?úÑÌ0à À÷OòOòOú§ ÓÈ42ÍÚS¦>LS;Ü9Ü9ÜI?èø¢ã‹Ž/ü ûûûؽüB~!¿0"-§å´ü¿ ƒ 2ö~Çïø]Œ”N °Q³<aâ»z4¢þbj¤FjLîfj˜¦æ4îUîUîUâ4¾Œ/ã˘N6›Íf³¿ý>¦&¦&¦æoÉ–nK·¥›|#†‹áb8ý4 [tþƒ¿°g|7.üÅØ…]ØÅý‹d‘,’ÕCi#mÜ¿E¥ˆRD1lÛÇöõG‰ï‰ï‰ïíèÊìÊìÊžBГ.–®¿âø?…l4#ÑßIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.9.png 644 233 144 2652 14774263776 14776 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü_IDATHÇÍ–oHÕWÇŸû3—W,½³ðÅ6¤.Hc„†½H×nÚ@G)(´Eô ŒÅÚˆCdADÅ}a©£,‰Í\%ÄH[Í^ ‰Ø3Ó5»Q—ôΕ×{ï9ç³÷ž{ïr{ßyóû=Î÷ûåy~¿çÉK<œ7œ7œÅqÛù$åϪ̪ôvÅm¿ׇ®ýrçð´{ÚõÝ”mã6?}¿H ?Ïú%ORŽ…^pU$ì/ᣕ­ÌZ·¿¾îwϳlëÝÖ ð]çwì‚À­À-€©Š© HÙ6nóí~‹—Ž/_¾À/™W2¯¸Æaá+ _Â÷ ß[¾'ž0ºª6Vmø3ãÏ ã€zäc*€f°+˜fÛx"ßî·xßòYþ¸%ë–¬M›7mvŸ&*"r÷ 4½ÖôÐ í1wi¢‰3ý+ú˜ßbűbæøÔ”›rrÉ0wÌàxìqì1sæNt4: |ËA’íA%ð±| þ„ùwo¼ 5Kk–ÚDÁ”šRZh!š˜df™e–ÔòàÁæU³À,HzɈõÆz‰R¥2Uf~¤Æ©q¬À#例RDdÅ1pÜ™\ù~äû$à†È³çgÏóüIï“{OîAðxðHðLMNMNMB¸5ÜneÞŠŒEÆ"cü!x9xôï&Ódè!=ÄsîÇñaD(Hò'ô8qy{W‰4øü‹b:\TUTeV%t÷]{ûúÜõ9qu(: â{ì ùB""§ÊO•Ÿ*—äšnžnžn©öV{«½"…N¡»Ð-RªngÝNuÞrÞ·,Ó«õj铃EE&ÉŸÔWx{?œ —ÌVÐ!b.üvxUx<»öìÚ³kp³öfíÍZ(ôz ½0>>>>>žªÔ‰µ'ÖžX eõeõeõ)ñtñtñ4t7wÖýYÒ=§.Y¾BÀâ닯› ( ”¦õâž9c΀þFwêΔ»a¸a¸aŽ6m>Ú<¿…]|tñ,Ûµlײ]е¿k×~È}˜û0÷!œ;9zr4•¯Þ±o–?®GÀ³È³HCp28 Ä⿽žU¨?R·ïß¾û>xwxwxw@¼eó……÷†÷†÷ÂáÓ‡O> [ly°åx=ƒžAèXÓ±¦cMš°÷í˜Ið'ô8"ú’¾ä‰UǪEdˆˆ,a «Yúvº‚]Á® H‰¯ÄWâÉ;”w(ïÈTëTëT«H›Óæ´9"ý‘þHDäêî«»¯îY_½¾z}µHþÓü§ùOE|oúVøV¤pÙ8_’?¡Ç™©˜©øåg‘û쑘ˆ»)§\" { { {@¤±´±´±4¬”RJ‰ôµôµôµˆ”M”M”MˆÔUÖUÖUŠøóýùþ|‘cg=vVÄÛîíðvˆÐ®Ö©uquÇù’üVOâ,» Û¿Øþ…-°.ØLlÐ/Ì­!†Ìo%ƒ 2L0ÁDš¿?~ „lÄ€*P@ØòYþ¸žùsÌΕ¿íœÑmºçú’Óc`Íf³9Ð'ÔÙ:[g{ØÃPQPoªåj9è&Ý¡;ô>½ç‰oyf$:?ÇþkògÕd¥MfÔ-u ø[×êZ¢Ì%+#h "40Dˆ@*_oÕ[‰‚úIý”ŽoùæMþÎÊäÙÕôzÓëI€à+¾"'ÙbT½ªgÌ s.HÙ6nóí~‹gñÿ÷¬|io/í}ìå¼Áþ_KùêS±ËÞIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.0.png 644 233 144 3231 14774263776 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜNIDATHÇÍ–ûO•÷Ç?‡KáXL ÃH¹èÑÀé:O@…•" ÖÒÔÑ Ö¸nÙ‚Ì.Sã…&"5Rf¸H[HœÀ rZj Êš,¶¬S8XÁh¹ì0N ;—çy^ûáœÇƒs€ß_žçs{ÞÏ÷û|ß߯€ˆˆDûŸA A A‘>;èøîðÝIùì ¯^ùûï!꽨÷Ö4¯iVol=®ç¯¬ à¯ì§û%ZްKa— ¿]û¶ìÛþŸ]{ Œ]Æ®%/¼e}Ë ÐÙÚÙÊ/áÁȃ‡Åa€­Çõ|½^Ç[‰/5ÿÓ_B{C{ ÿ„°gžĉ;7üÊ—0¹Š^*z `:x:X eˆ B³Nœècn…­Çýùz½Ž§ãëýôþ>>1;bvˆp~Ïžc“¯àÖ4VµVµ‚6àéâw4Ð@(¢pÒû÷;\Ú—j­Z 4k-Z €6¦ÿQJ•R\àuxÀi$Bû«¯·j°jP'xëþ\RblÒùÈãkûn©%9%9 mð K,Ö£Ö«õxÔûêgêghÚ1­V«}4Sh±Z¬ ü˜r~*É%M} \W®ãîsT—ÿ×%£|7oÅRŠˆ¤eÀxÑxѓɓÉày€ŸÌnzxòáI–=ÏÛž·ý<»<»<»`6w6w6¼Ç½Ç½ÇW:ÃÎLw¼;ßó?œ92s„eÍäÃûAûAàqÔ8ê Áåã#Z¦ˆHÃçpàôÓ°ø=€šQØß–ß‘?¬Ž¬F³ì°lµl…; wî4@nAnAnD—F—F—BI}I}I=¸óÜyî<ž*¦*¦ÀØnì2v¡íÿâõÐ×Cõ¨šÁPebe"°ÝÇG¼Ï‰ˆü­ V¬†Ö?ôöjå©1I}I}¸ôÒÂüÂüÂ|ÈÉÉ¢¸¢¸¢8˜ËœËœË„uk×­]·†.]º d µ†ZCÁ´Ñ´Ñ´f2g¶Ìläš I’p}lf­ú.ô]%ÄÇ'($hõ·«¿5gŠ˜‹ÍÅ"ù׳ ÙC“íÆÐüм„ ¬¬™Ø>±}b»È¹Ês•ç*E¬Ök‡HqKqKq‹ˆkÜ5îI½—z/õž<Ó›§7Oo‰ÍˆÍˆÍ‰‹IˆKÌNÌ–°;?ÿºéë&C“ÈΫ;¯ŠàZe[e3g†H]ðÝ໘¤Ä`7Ø ²Ö¶ftͨÌW¯:±tbIb®¦Ùêlu";v<‰ž‹ž‹žNNNé-í-í-ÉŽËŽËŽé?Û¶ÿ¬H…TH…ˆ---ŠxM^“× ì‰ñlõl Ï ·…Ûd^$t*tJb ‘Áûƒ÷cåϾøì‹Ú%XNXN€¿|uÅ~ÅØ«§vºìtôçõçõçÁá°Ãa‡Ã Ù’lI¶@÷b÷b÷"ÄOÅOÅOA«³ÕÙê„öÈöÈöHñŽxG¼hK´%ÚàhÚÑ”£)üÛ糞ςñ/ï~s÷Gº#T-âÓˆOµK¢üFÿÇzÞìyúþqãÃjå»_Ëuåºp\-°X!ýfúÍô›0xlðØà1¨k¬k¬ks–9Ëœm“m“m“àHs¤9Ò è|Ñù¢ó°¶¶ë;×w®‡m÷·Ù·ÙáãEk½µ^ÿ‡µržkh¾òññËEÃçP™_™¿b— \Q®°ÀÚÛLC{Ì{›ÛÜNqŠS+ü9~]k£™æÕòŽ{ÇMz¿Ê÷+ßý»’N¿Ža´íÎí û ö@9áÓeÌíp;XV.*Êhû´=ÚPº•n¥”CÊ!å¨fÕ¬š2Ê(5JR£€fhu»z@=ÊÜ5î–Õü:¦ÚMv€qÒ8é aɯcO(¿{¯a¯˜÷+ó‚2  ÿR_V_ƃÇÿÅøß¿g™åÇfRAþÍsþLÐ@-WËñàV>Q>y$Óð7|oøÿU~ÿYIqiq銳’ƒñãtÇ9Nx^'€ò†ò.Юi×0`€€­Çõ|½^ÇÓñõ~zÿGgåS{»xjïcOç ö¿HXÖFÓ$IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-2.3.png 644 233 144 2563 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü(IDATHÇÍ–}HUwÇÏ5ó,³ÜÄ2,çjàÑ )•I¥V’½Ü¢‘óX8XCJ¡·åºÁ¥š ÛuÐ?3,›1WšVÂdZù²F4lš¬PL®t­»‰÷žó;¿Ïþ¸÷Üs]¸ýÛóÏ9Ïó{žï÷{~/Ïù) (Š¢,ò?Y²UŸ§µmÈÇò10#½Ò ¿Z{¦=Ã#¨#êpÑWÀ àûùü>=Êìµ­ÞÄŒU±*A½,×´iϵç¨þ)¿’‡åaý²_öcZ(¡„‚Ì“käš@TÊwµ­•Mšª©Aø^«Åj1Vo ZJEQ”¾…ÈñÈqw( ‹aüÀVçä9¦ÕU»jgŠ3Ù™ ªMµ©¶ A•TRiºêYõ¬zœkkA³k­Z+€´J+Óüfàûùü>=~aº¡ôTé):€ž¤’ îÝîdá…— /Cô‰èÑ'`]ÕºªuU0Ù5Ù5Ùe rqqœôœôœtˆ©©©…ÝŽÝU»«ÀÛâ}à}€ý¤~Øhðùø =~aË¡ñUã+ùò€ŸÇs©òRÅ¥ X¿:~u¼) ëHÖ‘¬#PVVfÆëòêòêò {Iö’ì%àšvM»¦aiÜÒ¸¥qÐÝÙ}³ûf Ý£—|>~C ï,¼#›`$‘¤J?~ÌዲÍx8ßœoâ™ø&ŸÉªG íÅ´E ¢ª¢ÊÞ‚&"âiƒ·}¸ (Мüsœ# ô8=økp!¸@@}c4@—r*'€úV}  WéU˜ÎçAi|Îç$©™žÒN¥J†M¾ W…ËÞé©é©‘= /¾¯.¿º ê=Í¥¾ã}ÞP÷Ô=4âÔÏêg”JU[Ô–õN¡bTŒŠÊ(£,âg‰%–PùŒÏЀml3ƒš ^ÿàõÌ^|)j+ED~Õv¿Ýïåß“ “ ë°ûW–S—SYÕ.k—µË¾µ®µ®µ.ð ú}ƒ`LSÆO T+j–ö.Õ.Õ‚÷«‡Ÿ<ü„Õ¹cËÙËÙìד'OLžHÈHÈðÇ*g¨á?""Í#PýQõG vóõsÏ} »þ²ëÚ®k¨þîîaiFiFi$ % % AUMUMU ¨ 5¡&"y‹{÷.î…¬ÿey²áü…ó ðxáñÂã0X2X2XKw–î,ÝòÄòÄòDð^Ãk@Ãá†Ã ‡¡è^Ñ÷Eßõ¬+ÃW†£þ±Ã/w¼ Ü Õ.¬yªÏVŸ5iúƒ~ ´µj½".\À,³ÌFéB+­´PåcŒ1À`µˆŠð¯ Ô€&_u}u=°>•ë:¦ìíý±“Ú¤Ñ1ã÷Ú6Ī °í>Ý­»u7è9zŽžFQgÔ}ôÑFŠ‘b¤¿¦ˆ"Ðÿ©{u/è'לkNVâ>ßMåL娧íÓþXæL{Bù_³½f‹Ræ½_ï4ãMãM´õ«p<âQ´¢¢£‹øð­÷Z¡Œ··Ñx¤ßÔoF+¿É÷„ò?vWòØ]pµÔ’´¾Åèoèo5¬†°`ˆmÆÍ|s¾‰gâ¯ß•aþP=Oóëâ©}=/ØÿÀ sÏ6C+IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-41-red.png 644 233 144 4151 14774263775 15613 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXíW{L”W?ßcx Å%µ »µ¬„ØU׸òp²£­ÐøH„‰Ñ¨ÉúêдÁ£Š•méC ¶šZ‚ Ô„X­†µZb¬nÝmhcëÌTfÂè ~ßÜßþÁÜïûf²ÕlvÏ?3çžsÏï7çþî¹¢)›N&®ŒuÄ:bÂÃðBbLwLwL÷êe²*«²úÏ)‡r(˜ ³’I&™û@¤Ïx>ßÏëñú‘xâÊH>F~»i7í;"ã©óån¹[îîð {„=ÂHrÊHÊHÊΖÜ)¹SrØÐ¿¡C?°>w}îú\ÝçqžÏ÷óz¼>Ç{<ÿéÏy_GÅQwïÐlÛlÛl›úÊÑÞ£½G{Y‚ÿÿÿ $0†1Œpà 7 ùá8Ïçûy=^?oÎûçGæ$Ñ#zDû/{9÷rîeåOÎGÎGÎGp"l,‹å³|(jrJ9¨‹ÃŸVÕ¦Úu±ºH]¨5jZ°,–Ų ðý¼¯¯ŽÀ7'iÔ„¡Cè ’ëä:¹®í[¾ÁÒ`i°4(VØ«l;Û¿Ò¦ *ƒs‡v„v˜dæ€n! cØàOâS| 07Ke©€ÒÆV°{•­akàçi–Ë!Ë!ÅÊñ9ÎL÷L÷L÷þòGž`®5ךkY†ë¾ë¾ë¾éWßR?S?Ô£€¥(€‡€`B0Á@,%«a5üãËÆ—€o•o ¾Å¬Lkü®û®A× †9>ç£ñ“wÊ;å×êxàHå‘Ê#•l[¸@@éPº”.`o°7yí_¦ÿ2ž1?c€Ö/[¿4¬˜¬0úûæî› Xt¡è‚¾ªtÁ€æ8¾ÖÙ~ļ)™)™)™hð­ö­ö­Öë ±!þP]¨Î\ñ|ÅóÀÔ€æ²æ2cü›Œo2`…m…͘÷²–Ú¡§«Õ:Çç|8?NôкÃë¯;¬ÿ2Õ©úT¯úƒúƒ‘@Ë–0£gF‘À{ñïÅó®—_/€ßíøf:g: ¸ª¸Êæ =zPêEõ¢ŽÏùp~bøJÍ7š M…Ú‹¥­lÛ@D3¤Ò"¢[§o&"Ú_º¿”ˆè݉w'ˆˆ¦9¦9ˆˆÐŒfãÉÉËÉ#"jÍjÍ""ÊJËJ#"ÿ~ü{CZÅP  OèßÔiê4ujW~¾ÖÂ)O¯§×Ó+, .™¸0q2âºâ â ´e*“š¶ÍÚ6‹ˆž²¶[Û‰ˆ^Ì|1“ˆ(0#0ƒˆh¼¼?bÖ•R©ÑÅMÜ$"¢|Ê'¢ÉðòOô#ýH$~.ˆª%""Éëöº½nrr~$ZE«h}4nqÃñÝÇÄc¢Aqž^O/$4&4&X,Ô”ÔR‰Tb”À¾7÷½‰ÿ`ŽŽ”ܤÜ$}UíšüyògïbãÅÆ‹Ú ¸]Ȳ…ìGƒ$-‘–HKªëù-Kÿù¶ù¶:ǵѽ߽P‚øYÁ×}_÷À•Ä+‰Øý_ôUQìº²ë ønùn€zU½j$Z¤©+ÓW¦XÃ×Ce¡28N ³:³:³:¤=Rª”*¥¶Sbabab!‘|I¾$_j÷h½e©e©ºW+gg7Ø Á‡{`âòÄexzàéø0ðaÀH,  ®ÿ¥w^zÀpñÝâ»@¨ÀxØöÛ)Û©P@#¸UÚ*m½½iÊ÷R¤ÍþÀ”mZdZä>Æ7ØkìÍöfV Íßc‚1`;ÎŽð4üææ„GÚÔCÙŠVæîèÛ£oj¥/Å—¢õÉÑ“gOžÅí ­ëÅú‰ÕÂLa¦0óG£J7´ûU!T«Z„v¡]hçZ ýÕÑãèqôèýT÷ª{õ~"c"Œ°-l‹Þ_O»§ÅӤǥOKŸ¦ìÔ:y@: °[4jV²’U6ë\ó(òäÔAÔA$y%¯ä}åsíim17››•d×k®×]¯ë€¬ ô\è9@5ª ðÁÀs8°M¡¡úO)»^v³ì¦ºW{Æä1yÌq0mWÚ®´]D¢E´ˆ¡+Ì®’ÓœþÜ$Ý•îJw…3UUUD&›Éf²9jÚͳäYòŒÚ ÙCvá€CÂáVÏSç©óôþ6-mZÚ´”ðz¦dS²)Ù31å›ã"OZ8uô$D¹_Eúæ8S¶)Û”íê2h·Æ^cÐn²’¬$ë„B¡Ð€®Å>ô¡pÄ÷Å÷Å÷±M“‰b¢˜øòþ()~Å/–¿ 5Ei·äIÚUz”¥GWîxÚxÚx°pdáÈÂu®¦ÅN©Sê|g9—ZXzÑŸ¢'˜žÀ üšvÍæF%ÙÕîjwµk—j„3µŸ±Ÿ±ŸÑÇŽÜ"·È-}á¿$ñW£pÃë”ð$‚ÑÆ7¼Öîé_ÓnþÚüµùkuí:–;–;–ãÄTœi'!” åBùªêHq( W ÿÒž¤Ý•R½T/Õ»sÂåµåµåµìoY“Y“Y“Ê-í¨½’WòÚgSµQ…ÇŽäŠÂ‹¥ÿÑ¢µ{0ÒÏÿIØ,l6TDETZ Îg‰³èï_¥Òé"éštMº&\oÜurÿ7KÖ¾R!ÊßF†_«™ÈDç…óÂùývjý÷ލ“qFÕ}âQÿÎM 5ó˜UIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-home-grey.png 644 233 144 6235 14774263775 16520 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü RIDATXÃ…—{PWÆ¿{»ç Ãh‚,>Œ¢F‰‚à²Þ^m¯¶W³ý(BŠÈN":щNë±ëÙ~Õ*Õ*Õ*²“ÿ•ÿ•ÿõj± ±ì(ÌôÎôÎô®¿žmÌ6fÉ€à'ø ~dù8‡ÔàâÒÑ'€‘ˆD$­²¤,)KjpŒ9ÆcφfÕdÕdÕTô:ŽºÿZçYçYç…lwËuËuËÅéÄÄD²3tqèâÐÅ@°,K@¨)ÔjB^ y-ä5²ÓíÛ!·C8m}Áú‚õ…í²Þ}W>9¿Ì#óñ® ¾È<˜óÖ’D’Hýs~œçw¾x싱/ƾxN?¡nBÝ„:qÛ’Î%K:©sNÛœ¶9md…jjj ¬X‹µX -¬°Â iHƒäÀjŸjŸjŸŠm m m Ìy.ð\à¹@iÛÐÒ¡¥CK×|¤õÓúiý¨ÅD1QLŒ9Ì’XKºµ–€€€¾H¥]Ò.i—ôfc6f›üÎsçÜÏžkžñòŒ—g¼,D&Û’mÉ6nS¨>Tª'cŠ)Š)Š)‰LdB;´ihÓÐ& |^ù¼òy@KGKGK ÿ®Ü®Ü®ÜA¾?Ù™ìLvr›d}9Ÿœ_æ‘ù¨¦IÓ¤i“““>¸d=c=c=óÜËþqþqþqŠ$c’1ÉÈÿ  ×…ëÂ1QäDNäêGý¨ø‘ž‘ž‘ äƒ’J>šÍŽfP™[™[™ ´V´V´VäGò#ù¼°NX'¬tœŽÓq˜(ëËùäü2ÌG…QaT]êøÆñãcð„¸ qâ˜!®$®$®„—{䡸X\,.†'r"'#–ˈ("E¤ˆ÷ýîûÝ÷t•ºJ]% ¨TT**/ï}yïË{@knknk.ÀÆÆfÁ,˜á!ëÇUÄUÄUð^Ÿðú„×™Aæ‘ù( d,pÏ?œQÎ(g}-úZô5,Ñ™t& JÑ!:D<¸,.‹ËFªFªFª€âÃŇ‹–KŠ%Ð^Ò^Ò^Ä1BŒ¸õÜzn= >¢>¢>˜V™V™V­ï´¾ÓúÀ‡óá|8 –Š¥b)j¶Û‡ñïi¦˜v;5»4»4»`ÓÅt1¼¬p±ïbßÅ> ïlßÙ¾³€ïißÓ¾§°ª°ª°* ˜ æ‚9 ¤>¤>¤·„[Â-À‚­ ¶.Ø 666LÉ”L ˜KÌ%æÀ™îLw¦°ÁxÍ>Í>Í>Xe™Ç>ìÃ>HÑcôØ“'S%Qå“c,ûiÙOË~®ù\ó¹æxÇ{Ç{Çñ©ñ©ñ©óe¾Ì ý¤Ÿô,†Å°˜ßÛ Ú Ú €Öy­óZçk﬽³ö Ø§Ø§ØˆUb•Xpñ\<}“¾Ißð)>ŧ$r>œçþzþ0üa8º…4!MHGi#m“Aù¾o|äÔ›zSoÀëˆuÄW2¯d^É©ŽTG*`ò5ùš|½›÷nÞ»°7ÚíÙ@6 _Ê—ò¥¿‚ì%{ÉÞ'ù¸±kcׯ®¡›úSêϾ¢êêêB^·w·w·7ûªµ°µ°µ€f˜a“…v—ÝewÕIÕIÕIàÎØ±;cÀ'âÜö¾í}Û  fuvÖY€¦ÓtšÀ 'œ[Ζ³å¿ƒÒfÚL›aëy¥ç•žW€®þ®þ®~䪻ÕÝên!"qˆË,â3ø >ƒì¬××ëëõ¢¿¥ÔRj)…V¶衇ò¥|)ü%Éàʹr®ОўўÄ`1X "º#º#º¸Ž¸Ž¸@­ˆVD a…°ÀR,ÅÒ'œvÇfÇfÇfhk{j{j{¤HÒEºH>!"‰X¬¤“.Lº0éBNº2Z­Œþ¢o(t(t(”ë9n:n:n·º„<šÍÆf#ìÊTeª2¸Wv¯ì^ШmÔ6jgzžéy¦¸šp5ájpj墳§öÕƒÕƒÕƒÀUþ*•&câ õbëÅÖ‹O¶ZU;¥vJíÉڗЗЗ@PRRúù g¯³×Ù»ÍIvÿ²û—Ý¿¸‚+¸â›¯T *4£{F÷Œîy.iIÐ’ %Aì¥Øý±ûc÷“ Öo­ßZ¿#GÈrDx_x_xP«‹ÕÅ€v؈½b¯Ø @„àÖqë¸u¯çõ¼àßåßåß…õºöºöº ¡¡¡¨ÕÔjj5µ—2wæÎÜC031³ýŸ<-¢E´ˆkBêP×&EJ‘RdâQ­MkÓÚÎ㻈ï"¾‹`ÏOîŸÜ?¹Ÿ˜žßõü®çwaÕø¸-I!)$@ R(¡Äÿ™Åï± ±Àe\Æe<   €‡Ùh6š‚¿¢@Q (àADAéæc>æ·ÿ“å±<–ÇOvù¤6>7ò{H2I&É6’XKb·ùŽ|ôñ©ÀS§ïdßɾ“ùÕºººxÈrXËyD‘Gø¿’ŽW?ãgü °–À`Ÿ†àQÓRÓRÓ"nNNNãóÝ—¹/s_fÊ6tº ÝïÌìÌìÌ$•¸‰›¸)Ôʆî†^ô¢W¸Ž-Ø‚-¤zöÙfÈ[ÕÓÓ‘eÙmÙmÙ½zä¸×q¯ã^âÖ$$! \<á Oر+±* 4Ð@0žñŒ#çÈ9rªË]—».w±—šŒMÆ&#wÁãUW=^í{ì(s”9ÊÞ˹î¸î¸îhí¢]ðtñ•Ƀ³Õµ“Ü%wÉž-w[î¶Ü[[[ÞËqóróróºu¬³¦³¦³†Ë3Ç›ãÍñì%²‘l$¡’>—>—>{ø€=`"°ýÖõ[×o]0ÕÕÕÁÓmÀmÀmÂ¥p)ü½z¤û»Z1ßeв©ˆÜB®O•l.ßÍï]q+‰$‘$ò¥¿rœ?éLq¦8S¤Mk¤5Ò‰.šspÎÁ9±Jê:¤héL:“΄]Ø)ìvButúÑéG§‹3æÌ˜ÏÝP©ƒÔAy Ç8ÆmûA* ¤>ßµ³©²Ûdgggggã¡\Q¸NØå \½»ÕÕ»ùä09L_ø†FÓh½­IHBý¸ÆYã¬q )#…#…#…ÐRJ)¥x W¢ÞVo«·IÖ¾‚¾‚¾î†:]®N¿~ÚÞoï·÷§t#öFìXÀèïºO+>y!<ýç|ê­Kà?®Þ=9ûëÙ_Ïþ:ïïêdu²:Ù”mñ±øX|ø‘ªŒªŒª q+f`fÀ³MߦoÓ£ôû¦ï›¾o"kµÚm‡ü¢ØÔÀ¯æWó«m a†0Cvå{ŵڞæâðÁuØ6>õwf ̘…qª8Uœú_AePT†×?¾s/æ^Œþë‘ö‘ö‘vö¯–²–²–2ñÅQç¨sÔÉmQ,R,R,J›Ì Y!+üò4TPAÅõ`Öþ*PÂÓ<лYã³€˜ÉªY5«ŽºIOÐôÄEÃã•W>^)Í÷EÚÎ%qI\ҹ烈˜~bú‰¿EuÝìºÙu“|+=+=+=ËŠ]º5.@ëqPüI<Õ».»3±±‘¿JŒÄHŒ—¦3333óŽ·5Ó4Ó4Óh;×Ëõr½ýÓ¤¥¥Sîv¼ÑñFÇÀ8 .=y°´ýÇÿ”.þ K€ÝIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-14.5.png 644 233 144 3062 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜçIDATHÇÍ–ïO”WÇÏ Â0¥hPì’I¶¬²¦QhHÈj-b m5B«Û¥nƒ&…˜ÔÕ¦1fWéjÙ¨©BÕ®˜ÀRk€XоXføQÝÔÈXéü€eæ™ç¹Ÿ}1ó0Ù?ÀûæÉ¹çÜï÷Ü{žó½W@DD^Ž|¬¯Z_µ. ÛÖßGç‹‹³.…í3:XÞ³¼÷ïƒüMò7)Í)͆3j›~3>v½H?–Ïœ——%:a»b»bÙ±Çk>\“˜¶ÿÒö6{ÛL>iÿ¤àZ˵>ƒÇ?<þ`zãôFˆÚ¦ßŒ7×›x±ørø9~ˆïŒï´ül ¶È,Ê,z½60ñ:”•”•LÆMÆ)+èn ‰$µðáÃOclÓ‰7×›x&¾Égò‡óHݺAÊw”ï°_@q~õ+ëWohm|G $Ah:4  ×éuø³*U¥@¼ŠWñjDè;ô˜Ç+³œ%IÝã)­.µ.è7ùÊo–ß´_€´eiË¢5|O¼þ ?¨Zí¦ç ¾P×Ô54 ¦™Fáâ>÷AíQŸªO‰Ž!B1ösÌ¡ÑD°’•¦S» |þÁçæ žx'¦”""¿>vŸÝç[Äí±Æ±ÆyØ­3¿ø—ù—1« kÃÚp ámns{{{Á“íÉöd³`¨ ò)x7y¼ ðäú£¯}ͬûþ×ü¯±UOÛ3¶`ñ+‹_ñ-Rmá|„‰ˆœ€š/k¾•`¬>éþÊý4´´ ºNt5t5,$>°úÀê«¡È[ä-ò.ô{.z.z.Bæ½Lg¦råœË9‡ÊÍÏy#ç þãÃñ‡ãÆZØ×¾¯ôòp>Vl""y"oW½]%òß³""–7·>,9]rZ‚ƒühð#±XÇ­¬d~\w\w\wˆ>6|lX$¡:¡:¡Z o¼7Þ/bí²öZ{E*WTÎTΈåコáê þæoÙÙ–7¥*ÿBþ‘¸o#ùà[êXêPWp=^üx1¨Ï"}´\ûIû Öe¬[±n8:ŽN ™fša“k“k“ vÝytçQ(Ý\º¹tóÂëq÷¸{ÜÝšÝšÝ …Ï .üVÎÚ’µî%O.Ÿ\ð¬ðY!¨ô¤Ñ¤QuE eIÊc„«OO==ʘo{Ö÷®ï]ß }ý}ý}ýpþøùã烔ƒròïäßÉ¿‰s‰s‰sÐ××MÌ9êuŽÂÀÈÀÈÀHtþwi…'ζ¶ñpâ„Pp‰m‰Í± F‡ÑaM{W{WÄò+I5K¡ßÓÔñx <"œœœ"—&.M\šɚȚȚI¯O¯O¯Iw¤;Ò"­Ò*­"2T;T;T+²»{w÷în‘æÜæ5ÍkDžüvꥩ—Dr—çvåvIªˆ••ˆ5M ©!ËH¤+ïÔ1tùûËߥjWdcý{öW﯆[Ûnm»µma©Âÿ   BÀp\P–R–R–SÉSÉSÉи½q{ãvÈ{çÊsÁÅÌ–þ–~‘ÞÝÅöË[.ozÂùD;35‡j™tÆZùB> Üij¾ýKT‰*ÐÐÐ 0:N£h¢‰&PªBUÄd>È ƒ€A`TEøgH i@‰ÉWs²æ$0Î'ªcÊþÈþÈ·cLÓ¢:fìÒú´>fÕ/dñtªCu¨0F£¸Ë]î‚‘d$I@!yäþý‰þô}Á¶`³Æ[a|îŽçŒçØ'ì¾E¸M[ üïÛÞ·Å(óŒÞ­wšQeT¡Í üøñG| ðàÆ=Ö e|l|ŒÆœÞ£÷Ä*¿É·@ùŸ»+yî® ´Áü].1z¥^IT¿êÀ‚¢¶é7ãÍõ&ž‰?WFøÃù¼È¯‹ö=öb¾`ÿÉÌêJÔIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-2-red.png 644 233 144 4006 14774263775 15527 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü»IDATXíWmLSY>÷£.³UþˆÒ®1` ~;Y‹Xt²€ÑLªqBGãì&#"ÔѤ‰î Ae#ÉŒ‘]™Ú*3aÈ4¨?Œ™d7ÃgidgZù(l¥ôž{žýÑž{o›Qw³ûþißsÞ÷}žóžçœÓ·$ÉÄMó|ó|ó|¿™iÝiÝiÝ[×ËT¦2ü3) ¤ˆO³f"™ÈÜ’}ÖÌãy>¯Çë'㉛’ùùÕR#z“çýJî–»ånï¸pX8,Öˆ˜³¦²¦²¦ðõÎ';Ÿì|ìzºëé®§€Ãæ°9lºÏçy<Ïçõx}Ž÷j>Düm²¿ìqZœ§G x‡rœ9Î'­k¿×~¯ý›~~~@‚ Ì`3F0‚@óó<žçóz¼~2Þ²O^ÍXÞÇÄ1qlä/`»c»c»£lðÇü1 ~$Œ­dÛÙv(ô¸2¦ŒtU´1ÚÐ’èÙèY€®Š–FKz|®u®`+Ù¶ Ï÷ÇüQ~^_#œ„oyC£&x¯à%Dn”åÆÎox‚½ÙÞloVJ4b2s!¬t*=JÀFØvÀÛÏöC7/ðÂàÏá6nlD­Së¥SéSúö!«eµó0ŽÇñ9ΘFM£¦Ñß­á–Kƒ¥-„¡@“‰:azšž¢§ ¬CÄÆcãpºÿt?º ݰctÇ(ܨ¸QaŒG)JzšÖÑ:m,Ìñ8>ç£ñ“«åj¹úA#Ÿ8Wu®ê\û}¢@Dñ*^ÅkèPT­R« >UªâÇ ŠúŠú 7”2Ž_}xõ!€¨ÖúµH©áøZg“øÌÊËÊËÊCóøÖñ­ã[µDVXaf}¬ÏHpòØä1 GÉQp¿ç~?aii`ûÖö­a8¬Îª³¬ì{ö½ŽÇñ9Î=µãÌŽ3;Îè+£~ê§~Ab!#‰&~€íõÛë` 6û)¢«ÒVʼn¶ÛÚã,‹eâ |hx |·óKÅ—ŽAÇ cP ¤t ÝB·à?±2”ÝÙwg߀òÊ?0nýçŸãÔ\5À4¦1 Ðô=¡ã;V;V;Vk÷ö—¼£•ë[×·®oÅð¬0+Ì ºÐ….0ìÇ~ìFñŽRPP{Ô#°÷ï;`¾h¾æsxr>r>R#ÁÒéÀßËã~?õÜr>5å›òMù#x‚ë¸ë¸ë8+â•…ñ~£÷Gï_ ] @çÅ΋pùèå£ð™û37€è…á ÃpëÜ­sMºƒ¹2}%p%€Rí m›Ä¦Ù­Âba±°ø7í)¥ÇÚ“ºWØ+ìÝr^ðÁõ¢ôõûú}ýz?i-­Õû Ѝ~™``z¿VÄŠôå"<æóŒykº5Ýš®Tk¬—ê¥z—]£VBJH‰lѹ’BR(×/ñ/!RP JÁº¯´§õ¼å”å”b ôzÚÇŠ€VÐ ŒÑ"ZL‹ø”^¥`åÊeå²¾”=÷ÜÝs—Öj/ÐŒ<#ÏøNfÊ>”}ˆÑ.ÚE»p-Á®ŠÓüYâ³\–†¥aáúò#Ë,?BˆÉiršœ¾“šv í…öB£vU—êB>øà0 LNõ º‚®Ð{Ûº®u]ë:V¤½åf“Ùd›MüZJOÞiáfÊÖ!Ž›ì[ÒãÚ \{©vÍŠY1ë„Ôgê3õ™®Å! aðe e e ±š&3ÅL1³â)Rü4…ß<òê©5E»;_§]¥_éWúuå¾È~‘ý"ÈÊÊ¢ojZ¼*]•®žÝÈ¥–^*ÁŸ“טÀ ¼L»-–K‹bxž€G;TSœ©ëºëºëº~íÈçåóòù¡Ä_’Œû)¸‰q2ÿuS'T$´Ûó2ín.Û\¶¹L×®o£o£o#þŸgÚN•B¥P¹Å #N¤à ä¿´×iw“Ô$5IM#«8áʆʆÊö§•s+çVÎ)Ó¶:(¥ +‡t’NÒI׎HÁ›GþGKÕîÉdó?„}Â>a@¶‘md›úkq‰¸D\D ¹u×±F¬B¤Òéð×DbyÊÎýß̬}+&ŤXþ&yúX•ÈD&2@¸)Ünþóññ_úRvÆŸR÷µ[ýosØÖ%)èIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-33.4.png 644 233 144 3166 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü+IDATHÇÍ–ýO”WÇïðRƒ%踦¦IIˆÉ`â[$êÊ‚Š“Ê1h奩 ‹ÖntÓPKJtÛòR±âéfi7¢¬Å@-©[ªRÀÆfÑ4u+ÂÐĤ,´0 ÈÃÌ<Ïs?ûÃÌãÌÖÀç—'çÜs¾ç›{ÎýÞ+@!DBð/ bEÄŠSÀŽøCÈkµ&ÿ3`7ª`ØmØýŸÿaü‡Ï^xö‚6²õu=><_ˆ~x=Ý/DÈÓÓfÈ ÚïÁË«^^»$`Ÿéc»±}NR{©à³æÏšù#Œ3þ Àtæt&„l}]×óu¼p|ñÞ¯ê Ñ×¢¯@Ì31ÏÏg=ŸõÂÑ@ÀÈ ““ 09)#@∓™€7úç ³õõ`¼ž¯ãéøz=½~€€¤Œ¤ !øÛ®™]3Ʀ@Âà'œ+û¸ìcýþvþN#Ä*TÔ*¿(¿à•ÿÖÎhg€ ò¢¼ ïÊ»€¢æ«ùxQ”ie€&šˆ£6ˆ_–Z–ªüÛ.m—fl‚¤W“^ õ4ø¯ÛÎò¼Õy«AþÀø‘A¾¨-Òá—yrƒÜ€”’å²üñN!—Ê¥r)°­låן侶YÛŒ_QR”Ýí¿‰ºÇ¼Ç¬¬ÛÖJ!„XyޝŒ6£Í#+FV€¿ €“[nþ¹™y%KyCy#TÉŸëÏõçÂä¶Ém“Û@©Qj”š0*=ôÐL2Ê(à ¸½ÇæíóvæþÆãö¸Ù #Œ|ôî(f|„4!Dc¼®¾®ÂÌI\¸´Õ¿Û¸Ù²Ù o%4$4 ÷Y÷eìË€‰£G'ŽBFWFWF$8 ÈkÈkÈkßeßeßå?¥@)P Bv…¥ÂZaEf-dNdNè^mµÖRš\š tø%K!î”Á—³_ÎBsDÇ÷ßËâM¦ ö v¼ÎCÎWœ¯@ª+Õ•ê‚’ñ’ñ’qØaßaßa‡©¢©¢©"Xn^n^n†¾î¾î¾î'ZI×p×p×php²³­.« o°ÓÅZ·­ÝÖ|à#xh²›ì²Ýc5ca­p7Í–Ì–@zizIz $¦$¦$¦À”eÊ2e… 7nÀ–Å[oY ‰3‰3‰30‘3‘3‘Âqmrmrmk¼5Þ…U…•…•ðûU;í|ŠSÿ;j5“¦6S›lò\üÅø‹Ú=pëþî*CG†Žà¼ÙТÿ¸æ\s®9X[¸¶pm!”Ÿ*?U~ ;;;Á9àp€e¯e¯e/œ??~~8ÒéÀ‚Ñat¸£P‚:ö„ò³'vO, ƒÊ¼ v«ÝÚAí þÇ;(ñâðàù?WQ‡8qZЋV¬ãǧö«ýÀ#ýf Ö{Rùƒw%¹ù¹ùaw%o>÷æsu¾¨¡†8PÜŠ@-R‹ð‚약0@ÈÖ×õx=_ÇÓñõzzýŸ§ùuñԾǞÎìÿ u5 ¯û§"IEND®B`‚routino-3.4.3/web/www/routino/icons/ball-9.png 644 233 144 213 14774263775 14373 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷Ü@IDAT(Ï­’A ìÿÿó<N Qãz…5@’¤a€Wv?X‰ºà‰Ï×`åýÅ&ʉº+Ü’_vêëß7óU/?£IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-19.png 644 233 144 2403 14774263775 14703 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܸIDATHÇÍ–_HTYÇÏŒë8†e³µAP†-ÄŠ…Ñ@NKÊJ`˜J$=¬õb ö dn°‹D¤‰!(FáFÿœh‰¶`E)—v£ÒMtdgæžs>ûpç̽-[ícçåòûýÎ÷Ϲ÷œß=„B,M=xW{W{—ر÷{'ïßîßþuŸ—à©öT4Cn{n;@ #СƜØÔÍ|7^‡ß­gòb©pY½Y½žÒTÜû6ìÛàÿÊŽÛîCvvÌ‚Ã×_è»Üw™`òáäC€™Ò™RpbS7ó Þð¹ùEË¿ô…€ÌÁÌAÏ_åËò kÊ×”¯=jOøc-ìܱsÀ›Œ7Ú r È!G—sÌaFÔ›zj¾Á>ÃoôŒ¾íGÀòmË· »jvÕd_²cÝp|ÕñUF/ÙE -ä€ôIPb]°.ç²®×õ¬cð“Þ­wƒ~fZ…Äé³:­NÚi'™âKó=£oûïÛ¿ƒ=þ=~@$# #2 Ž©c$uXwêN´þ]?ÑOpF&™d‚þRtÀIë ½^¯G³SÈ’ £2 $ J/­/܆¾ù²'³'ç¾€ò…LóV€: °À¯Äˆ9‚±ÙØll’““|¢/Ñ—èƒèPt(:j\¨×þT[ÕV~£gôm?)cçÀ‘GN´ÚÈ„õÜzî,\«‹u1Ìœ9;s¶´niÝÒ ·nÞºy릣[¾¢|Eù Xt{ÑíE·¡&\® ãŒàÔ4Y VƒK/­oûIû­®Ì^™MãêÉ·†­aâé74›ŽMC( ‡ÂÎxZñ´âitG»£ÝQØÜÜtŒ½+zWô®ž¼zòêI'/IÔ%ê ¿®wôm?–Ü]rW÷ÂdpÒEȼÒCÀ£Œ‚nÐ ºäJ¹R®„M¾M¾M>¸S§þN=܋ދދB^0/˜„ž¦ž¦ž&ÈÈÈ€s/Ͻ<÷Òe¬Ìò[~—^Zßö# °8°XBômô­ûØë)=ôÒK/h­µÖMèqèqè1 äää;ùæ3ÍgšÏ@íëÚ×µ¯! Dè u†:C.c•V±UìÖ3ú¶¯꺺ª„Ëb\Œ !,‘ !ó>sé¥õS~>¸Ç]²‹8†*©¤ÒYq¸0\.„GÕªU;ùÖ¶Ö¶Ö66ƒpcï½7öºÚÇ%Ý®ÛIyZžþèûÀ©Äš³œŽ®¸s…B¹â"À+^ñʕ`#¸øþ¶¦¬©OžÊô1­êT ï™ÔAuP×qí2,Gå¨Y$‹d¨ãê¨:êZªVÕ²`7ðOö±ÿèü@ªóËauH"™^qŒf€$ »‹§+ö›Œ3ϼû¼á3üìüÿó_ §8EŽó‰å~¹Ÿ8èûú><àĦžÞ)¼áûä¿ò³½]|¶÷±Ïóû–Âtùã<¨|IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-137.png 644 233 144 2725 14774263775 14773 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŠIDATHÇÍ–hUeÇßíº¶Kóޮ̑Ìs‰„2NÑ›IÎj°41AƦ &²a¢¬-‡6 # k‰¥ÄµvE×`l8§[j±AåVA³ÙmÛ½Üksc×sÎû~úcç½çVô¿çŸsž_ßï—ç}ß缄BÉN÷‡ûbþ˜[Çu¾®×x©ø¢ñ_üB@F{F{ÚoùHæ#B@þóùÏ?ùÆLÂ/OÂKë^Z0âq©t°Æl²•˜`ýDRl·óu½ÆÓøšOóÏèólγBÀ+¯½òšûÓ™‚[ŸcÖåÕåi>£Õì`Ùœ4;Ìk¯µ—ï¨uj¨oåUy8§jU-pÁzÔz”„ºaÜ0n€ºG -d«l¼µ‡ji·>ç×ã/ÇÝŸj=ÎRJ!„8€ Q!’‚úT½¹×Ü êGkÐİ —šRS Ö¨5jM²c¨\•«rŽ›oñPK­ƒs+æjG)K)„O¿îQ÷èÄ,º?t¸À‹ ¾Sß15yojöÔl0Z!ÆFc£±Æc‰±X7­›ÖM0ü†ßðÃø›ã5ã59¹¹±»Ñç¢Ï15ý¶¼$/ñ"ü<öóÐïþÊýÕÄ,­Çvü2n¯Þ^­éäRUj,5–BìÝØ—±/Q«jVí\µ:t.è\J)¥¬^»zíêµà)ó”yÊ reåÊÊ•ZZZ¾;¾;¾;Px¥°»°2Nftgt£>øþ½‹ï]tø¬?ª*«*uçŽ_¶… Ô²øÌü3󓯜ŒþÕòW ‰’ú’]%»œ³;P0P0P¡¢PQ¨VDVDVD ŒcAÈÛ–·-ot>è|ÐùÀélOWOWOä?•?/Œ|2\:\JBó©–Ó §´°ZžO r?\.nÙ©»ä2¹ ¬yÖãÖãPœQœQœmUmUmUa¼)Þo‚ÒšÒšÒ˜Ó>§}N;Œ®]?ºÞÉÛ²o˾-ûà讣;ŽîpüÖ¸þ / /­G€o¶o¶¼ ‘»‘»@pæØ+%Çä˜P²°daÉBèØÔ±©cŒœ9;rzzz ˆâXT¶¨lQ †]îaäGó£ùQˆ7Ç›ãÍ.^{ÌLG~ü ZÓ1. _Øóåïòw§~Éž%{–ìîëÝ×»¯C(Š„"çÏóçùá|Îùœó9ëÉõäzàÊÖ+[¯l…¦ƒM›ByAyAyAJ§>3«ÍjЋ 6¿Ó1{qæÞ™{@ßÌš³ÞŒ›q§¬ÞWï«÷Á5×5×5—CÐmŒ6F¡Ø[ì-ö‰Ö­'ZøþÅûï_ N]8uá”ã—ߌ $0m>Íïì1ûT²ýÀöÎ)sÂt&ºŽL ƒ:…B¥øos›Û@ -´¤ø¯r‰K@Xã™ 3a##—:üÿ8•O¿î°;<1 5d €ÔsLÖÉ:¦äëò<d"À ƒ ‚µÛÚmí«Ùj¶šAz¥Wzi¦™yYvÉ.P[Õau@~$?bŠI?d YäÿçÓƒöH*²*²’㳬>«˜”¯ÊW1ìÙ¯PXXŽ»‡$ã÷m_Bn–›1Àê·úSñ5ß&ÿÿü+©›_—œkFÐL3ÙÎ[›­Í$@õª^ÒHÇÖñä–°ë5žÆ×|š?ù¯|hoí}ìá¼Áþ X-†$ŠÚ+IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-33-red.png 644 233 144 4227 14774263775 15620 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜLIDATXí–mLTWÇϽç‚àX´eØÕø²*Ä¥Qf°H±b:jÀJµV|é`›ÒàQâVš%E‚’uMKÇÍVºj$šÙõ…4v»`Ý–¤g¨Î¦ÖÁ—™ÁaæÞûß̹sgâj6»Ï—™çžçå7çüïy† ›JÂŒ_c‰±ÄX¸§ÁñÑÑÑ…ËQ±÷÷$“d’L`bY>J"ù@¸/eñ,ŸÕcõÃûñ+ÃyÔ|{É^²—7‡¯'ýJè:…Nó#n·Û§€h]‰®D.—””îm¸·á`È5ärC>[gñ,ŸÕcõY¿çó~E¸?»…÷ðÞ3”Év(¥"¥"¥B|¯½»½»½[Žs?t?t?@AAáÅF0`C?¸ÎâY>«Çê‡÷›Ýò|>¢M༃w u±¹7roäÞ,·ùm>›6MN—§ÈSë].@Ì3ÅL@,‹Ä"@ÌóÄ<@¬__ät9VŽE€å³z¬¾Ö_›  qfÎÌ™ ŽG„#},AwTW«« +`Än±î@‡ÿ¦ÿ& Æñ&Þ©D* )³äYÆ¥Qi4èÖJkù€”%eÁÍ¢uGuuŬ?ãa|$ênÔݨ»k~Í´ ÚCÚCòû°ÝmwãI°Ž[üXª‘j@<+žàvé]zûpìC¨m©]q³¸€ÛµÖµÆNŒÄåN¹S rÛ‡í6» O´ Úmƒ<‡ñ(|BµP-T÷a ­å­å­åòŽ`oÀÌjÙ'Û'ð-.X\L¼VP™P §êOÕ«ýƒ~Xœ¹8SïKØ’°No<½ÕŸè×ZÞZØZ(ïPv6ŒÈÎÄ´Ä´Ä4}Tøhᣅ€K¸„RÙo~-éµ$Ðöiû —ïåàÝÑwG º%ºü_ú¿€’ý%û åí”·Õñ»§îž À[[ Õ9Í9M <*ãc ¿]wlݱuÇB¿L´‰WÅ«œìÑöŸ¶ÿæ7Ìo¨7áÂÊ + zyôr°Ý²Ý€êÚêZ0˜ Ââ[.´@ôÖè­œç΢M/ãa|AP|eè5ôzC D½¨Ä!N]cdãÈFxõçWVK`ýçë?Ç3Ì3àxfüéõ§x‚ ŠMbS¨¿a‰a‰a‰roÅ¿üÑÑíèvt›÷ñ>žPº‹î¤; Èvü€!vOÐut!„ìðìðBHe]e!„Xc¬1„òíåo/‡Ý‡ùÃψ·R+%„ Þ¦·)!üz€ `MœCÎ!ç±1>ÂóÅ|±ÿuØ{êä©“* Lrwý ý ¾kƒ×Õ;æªrUEgÀ§ÞO½°Á¾ÁÖ¹Ö¹ªð€;ÛÚYñ\ûôöé¡~iºÚsµGÙÉ\—Áeøº”.¥KkÙ[–úKm»¶]œmßh¯´W†®9Á ~€¬Á¬ArWQWMFÁ}û@vuv5d–f–@ך®5¼5©5©^§­´¾9ùÍIø¼ÁFiµ † KÊ I4‰&xBâõñúx=!ÂuáºpÝäP.|Cþ[ùo‰û©düÎõ >XÒÄ4€—imzòôdè¸ÕqK½ÓßW}_éeéeÜÁø'ӜӜ€t¢ã|ÇyÈ,ºâïå‡ËK^°ŠVѪnšðc$ÜRŽGeDeDe b Æ:cœ1NÎWNî%ÿËþ—!®~W?·ÿ ÿj@ù}ù}ÀS<à“Š¤"pÝuÝÄò±Kc—BG}Æs¦áL^WFh#ßÈ7Žr3¸ÜŒ…í€ôÊHÝÊmå¶´q&î w†iEÚm±šÇÍã°(ÚÝ/-“–ºÑ À'µImj^Y#k@~G~óe“l IÉarh u’ökí×je'ëéGô#£NA+&ŤXІXóHÉꉙ˜‰™ê¤èƒ÷.(£µMÛ¬mhìØ«ìUjíJ»¤]j@øáÀDgÁ<ÌäMRŽ” Ûò·-×¶\÷+hDðË¡ä=É{’÷Âëx¯ãÎéÊæäàç&z‡Þ¡w¸‹sjæÔÌ©!$ª"ª"ªÂrHÑnž.O—§Ö®d”ŒðÁ ,ã1‡¸Åùâ|q~H‹ÍÙÍÙÍÙr¾2Ë5Qš(c,øoiRøIsW"ŽžpîÍp_;iB»ös*íÖëTÚÕ4MHº/ݗØ~ô–ØþØþØ~¹TÑd<ÏÇoþM„GðÅç? ÍÚ-åLœ‰3©µk±Z¬!í¬kÀªúF“G“G“E®E®E.qž¢Å³ô,=û»&µ ô"§X(€i×I*í6i›´MÝd7ÙM|ðÁ#5^4^4^ ];B›Ð&´õgWì_#ú²™÷"ÀHc ›ƒÚýÓÒU%«JBÚµäXr,9ølb]VN‚+ãʸ²‚Úð6ü㈾ù/íEÚ]Ii#mÊbÀe e e ò'éãéãéãÛÊQ;©“:)¤ƒt¼v¨=¢_ ù-R»‡ÂýUƒÜ6n· «Éj²ZZÀÏägò3Žp„#¾™êMõ¦z ¡=´‡öpWƒ‰›"Nîÿf回è‰^è _þ œ—y™—î w…»ò¯_L<Ÿk‰8[DÝõ¿‹±”®dIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-104.png 644 233 144 2760 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¥IDATHÇÍ–ohTWÆßIÓ&ÓF[WC*I &« l‡*F !Ò8…Ʀœ„’(H©²ÖÒD¶b ¡Ëîli©â6ÕºN¬ÒÚ´jSDH4Q–İÒ˰f;uœŽù³Nî½çüöÃÌ;nÙïÞ/sßó¾çyžyÏ9Ï=""ò\êW ë…¬²–&㬷œñÜWr_) &ãc¸ê]õßÿžýøÙ–}²ìuˉí¼]Ÿ9_ÄÁÏä³Çå9qrÎæœumKÅÝи®q]n~2þÓpŸsŸ›7aïÀÞ€/N|q‚ßBøZø@l[l8±·ëíù6^&¾tÿ¿ QÑQ±¯bŸsvÇdLƆo ß¾å®rW¹ "›"›"› ¤¯¤¯¤†wïÞ ãžqϸǙ_ë«õÖz†«¿&ùøGÿPÿ-lâ€ÀÒ¡¥Cú,sá²pp+%mŸzI½ÖJëyëyð4yšÌ}_ùªª›Qˆ´EÚÀÖ“%¢¾V_»&³Î¬CDDV¸VÉ¢,Jú±v[»­Ý"qOÜ÷ˆTŸª>U}JävÛí¶Ûm"‡>røˆÈTÑTÑT‘HÏDÏDÏ„HoWoWo—Èš†5 kDò}ù¯ç¿.Rö«²XY, ¿Âµ`Ö˜5"Ž{Ñ5ÍüÙü™„ý—:|¾\¼>x}ÐéP°)Øl‚Êå•Ë+—Ãù¹ósççøÅs©÷Rï¥^8´äPö¡ìŒ=Ö—âKôGú#ì±Ô©¤åÝ–wS æ¬é8º&Ád0USM5p’“œÌ%íATÕA0§ÍisÔç*¨‚À¾äK´Þix oßZ´øÅ©,ÿÜawx62B lSíªµGTô}Ö†ª T*«Òª´*AV§Õi Nœx†ñ^ÐwôPï“Æd†= ͇æâÔÇl£ Ô€?ןkã`Z£À¼jP )ï×€‰™z×À"‹,fĤã䨢jVÍÌYƒÖ`&¾?ÇŸcwêçÿ?ßJÚ‹ÚÓ¾fœzè!ÏYb«Ùj&úо€ 8±Oo‰Ô|ÏÆ·ùlþô·ò±½]<¶÷±Çóû_™ER²ÁIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-164.png 644 233 144 2776 14774263775 15001 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܳIDATHÇÍ–ohTWÆÏLÒ$ccZC”Ú ©B+A– §$qíÔ†šYE׆`ýóACš[¥Ò¢nmí¢R7q¤4ÔHÔH´"¢1ÄQ‚eIŠb°T†J’1ídš?ɽ÷œß~˜{æŽ[ö»÷Ë÷¼ïyžgÞsÎs!„/ÛoîWݯº R±û]g<ï¼7ŠOXàzËõÖ÷ÿ€—¾xé €yíóÚå'Öy]Ÿ9_?“O‹—…3Û™ÛéZkÇBÝòºåy…©øð-ðœ÷œŸ6¡ábÃE€®PWˆ]0r{ä6@lml-8±Îëz=_ãeâ‹ÿ‡_x¡ç…×cÈÍÉ͊ׯmOªàÑk°±vc-ÀOY?e)7XO|òÕZ`’Iô3žë¼]¯çk<¯ù4J€ùkæ¯üïøßñ´¥&<ø ³é•¦W4Ÿqž?óï‘Oȼb^°Z¬’|¥T¨° Ë0ð‰ªVÕÖ^k/I0cf 8ÄÇ|L¾Òx45¦æóüO›Öã,¥Bˆ#U‘Ô¯šÍ³ÔkȰнlcÈnÙ-»ÓCýMUX@ %Œ2ŠRÛä¹øŒÏ+…Â@¡îà‘ªŒ¥Bˆ¥ŸƒgÌ36™ ÃSÃSÀ]j@ ¨f¦£3¹3¹`ô½F¯#Ä7Æqxºïé¾§ûÀXl,6;y®p Ü›ü2ù%Ä—üÒúK+3v¶†ÛÃ}Ã}€åyây2™­õØÂNô1ÚØÐØ Ñd™ª4ÊŒ2ˆý3öMìÔê?­^ºz)ôœê9ÕsÊá Æƒñ`ò·äoÉß•'+OVž„èåèåèe§®Eµ$Z°>î{Ñ÷"*ÍÔ’âã‡ÆúÆzݹ}¶°ïö³¬cQÇ¢ô‚ü}úç_?ýõS’ÞfïnïnçìÞ¸;qwÂWÃWÃWaáÑ…G…¡¡¡ØÚÚ‚Aÿ ÐwÎÜ9sçŒ3¿Ö_ë«õ¥õ&å¿S|ü§ãfÇM-ì»ý nÜTL”Ž”li»e¹,k¡µÀZ+êWÔ¯¨‡Þ²Þ²Þ2èÙÔ³©g¸ëÝõîz(Þ^¼½x;øsü9þˆ‹‹ƒêHu¤:›m>´ùlX¾áõ ¯;´¾·ü>ûÊ[Ë[Ë[ºšs5çjÎAé®Ò]¥» ¨½¨½¨V¬*XUy‰¼D^º+/V:6#?‰î‰î­Ç-„¼$/¹î ÌæF!„!„b¾ëbVÌŠôc S˜Bˆ©¬©¬©,!*Æ*Æ*Æ„ŒFF#B´­k[×¶Nˆ‡+®|¸Rˆ­%[K¶–ª Õ…ê„X²lɲ%Ë„(ô¾Yø¦¥(•ÆÒðó]3f•Y%„£Gï1:âq ß^ó¿˜æIý—škškšk |#|#|ÃéPÈò…|àÍñæxsàôœÓsNÏdЩ»vðÚÁkáÀÜÙ²3öX›Í—ìˆvDŸÙcö©¤ñƒÆœS æ¤é8º"Aœx† ”Ø>uœãçw4¥)M0ï™÷Ì{ »e§ìþÅ. Ô_ ŸáËàû­qãþßÊ¥ŸƒgÄ32™6† @j“M²‰¹M–‡AM¨15–! [fËl°vZ;­ ½Ò+½@]teï%õ£úäûÆ}ã~†%†§‡§eó?ëcÚhTA /—¶Ï~°ú­~`Z¾-߯°½_&& H A‚„K¹Ô,³Ÿ•AÄ`ÊúÖú6?ÈÕzÆùÿÏ·’¦EMi_3ÎñùÎ[A+HÔ-u .pbOo {¾ÆÓøšOó§¿•Ïííâ¹½=Ÿ7ØÿøD6Èw IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-77-grey.png 644 233 144 6146 14774263775 16026 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÕ—PUÕÚÇ¿kí}~pŽ—Ÿ&Ž\˜ÃALô˜f¡À(–PÒ5_Fe´×Ät ˜œ (s4Dòfa^“"Ñ10ºa£`¤çè%Á°ð(ÎÞûìuÿðeš·iÞçŸ5{ïg?Ïg=ëû¬½6)(((((€;ÚøÃÆó7ù›üMf,ø´àÓ‚OÙ“EwŠîÝYÂ<˜ó(ý‡ä#ùH>‘¯Úl ¶V‚£8Š£$AB€^ô¢À«x¯²ÕóªçUÏ“|þWþWþ×’12FÆvUzzz·\-ÞP¼¡x–ü%ÉŸ$?ä/8¸Üé#ÀÄ †ž‹ä"¹H¾ LÂĬ¨¢Æ¢Æ¢Æ°0, 7wX#¬ÖˆÈÿÕÐÐ@SdRdRdÉVD+¢@”g”g”'à¼v>wú;ßwÆ{ߑϙßÉãäãŒc®Ì•¹ÊëÉF²‘lô?Àùsþœÿ7UÕÕÕ÷ôjöjöj¶ïHêMêMê¥bXOXOXIQå«òUù°b7vc74°Â +€ld#ÀSx OÁj›m›m›”ž¶ž¶ž6&ž:t>HÞq÷™»ÏÜ}&ó¿Æ_ã«¶o´o´oL<ÀrX˹¹ž€€€Æ‘½S{§öNhCÚfÿoàø†¶ ¢ âߟ –bÖ­ ZÄŸðHöHöHF4Ð@I®‘kä𸈋¸`V`€nt£€/|á ÐLšI3!9&Â;1v7jÕ«=&­¿z#ôF(ÿƒRRJJé?_I©Rª”ºx-c1Þ'û.ì»°ï ¹In’Ûñ'VO¬žX½a¾þˆþˆþˆ”’“““À7¡­h…vØa‡+–a–áÿo-hA 8X€$ÀµªµªµªUJéÛÔ·©oߤ­ÓÖië>íäïñ÷ø{Y‘Tz =$G g„3™ ó½Vx­ðZÁti¦4Sš‰wjÄ2uxêðÔa¸ŠYb–˜Á"X!H‚€©Ü©Ü©\@è:„@8+œÎB—Ð%tM󯪄*ÀZg­³ÖÁÕg³ÇÁ’ŸŸÏŸðšç5ÏkÓ9yœ|< bA,è­Õ¢VÔŠZÀ 5h Z$¹ÏwŸï>J[ž-Ï–ÍÁƒ<ŒëÆuã:€óà<8€×óz^ïìn º+º+º 0—šKÍ¥Àíå·—ß^())üGüGüG»Ä.±K@LiLiL)\—+–+–+`]’²$eI ’êôuú:= ˜­˜­˜ýÖj*é$¤{z“LjLjÇJÂ?ÿ8ücRᨤR5W5W5HmHmHmÒϤŸI?dZ2-™ îNܸ;€Íh3ÚŒ@¨w¨w¨7°ª|Uùªr C—¡ËÐMóß·?n? h­ ‚wï ÞùHÊðsáçÂÏ‘ '“·ÚFm£ø8$9$9$ù.í.í.í°²\–Ër¡!ï‘÷È{€Î¬3ëÌ>Á'øph í†vC»ˆŠŠæ¼9çÍ9oì0;Ì~]~]~]´ÐB ´ëÛõíz Vˆb`ÎÅ9ç\ä9BޝéÒtiº`õ[ä·Èoò;G;G;GQJ±û°ÑSô=õhf*œÅYœ †jÀ.ÚE»à}¼÷ŽØŽØŽXàÖž[{ní&.L\ø¸gä#òù€c8†cÓü÷ÞÚ{k/øtâÓ‰OOk²m؆móÓé‹ôEGpGHå|8·}aY`Y`Y³ôºôºô:8b$FbC2pQ\°¯Ù×ìk µ¯µ¯µXœ±8cqà’å’å’ȵr­\ p\'× °sì;7Í?}qúâtÀ%Û%Û%ïË÷åû- ´ÌÊMtNtNtÂLh `_Põ»êwÕïJåfo³·Ù›}q¥òJå•J¡E(&íOØŸ°?ñxâfW³«ÙÏ‹çÅó@äÈ;‘w¦Uæü‚_¦ù{š=Íž€Ø"¶ˆ-@äpäpäð4ÿØ1ˆALÞXucÕU€iÈ4dÂ{j³Ú¬6KåiHCZáQ¾€/à H~‹g‹g‹§=`|Þø¼ñyÐp\W‹3nWyWyW90ó§™?Íü p·º[Ý­>ÇçøÀ,Á’Ç]%]%]%ÀÌŸgþ<ógÀ}Ò}Ò}ÀsxÏôeú2}6i½´^ZÍ—¦/M_šäb"&bÂGÄNìÄ^¥¤O¶>Ùúdë;{”K•K•K«ïFݺÅݨYR³¤f‰}»#Ÿ«c´hF4#À7Ý7Ý7ý1Ûʶ²­¦ÃtZÅF,Yø®ö]í»zš†›åf¹ qˆCT o7¼Ýð¶l<9xrð$ýA¹_¹_¹ÿ§µâ€8 ìéàWƒ_ ~ˆßŠßŠßîª×.Ó.Ó.ûOUowowo7Wn,3–ËX‚Sä/ / / `+³Wf¯Ì~œ˜|G¾#ßHA R¤"©@Öš¬5Yk€•™+3Wf¬žÕ³z€Ú¨Ú0yeו]WvaeGXGXGÕ¸ø¸ø¸øL=#ÇÈ1rÌÚ$î4wš;=9‹Ò£ô(=Ê]¦e´Œ– m•ûå~¹£àØ&Ð6Ö6Ö6ÆB{Öõ¬ëY‡“3ªgTϨÆ$§ñ4€ 2€„ dšöêP‡:àáaà.s—¹ËI%©$–ûž÷=ï{BÓTÔTÔT$(ú}Š>€Xˆ…XöÈd!YH^{ å(G9?Ûq̳G?ü²ðo‘ä9КK Ô@ ;ð ^Á+ô`£[£[£›´yT‡ ´ë‡/^Èõ©ÃÕáêðòXÆ1Žq;~+ä ¹‚ÿб²[+V\\\\\ ‹³¢pÜx¤!‡v·;´û¡C»gèRº”.ÝÑ€ä ‡lÅFQÚ<^9^9^ ¥”RŠ{ÎJ´L¶L¶LÊÖÁŠÁŠÁ ®O½G½G½çj“mÈ6dÚóAßò¾å}Ë`€ã=ÐÉ÷ôÀN#À÷íÖ‡Ô…Ô…Ô•¿ Þ¤Þ¤Þt²xÌgÌġ?]pºàt};ôÐC·ÏÏO|Òv¹írÛe²^s]s]sä9`Ë~¿Ž_7¹H­‹ÖEÓQG¾•Žqò\þÄ ƒÁ`€ä¸ìaJ¦dJò?Ãs‡çÏÅ?ísìsìs:$•N¥SéÖü-ñ·Äß=ëÆ¯_¿ÆÞï>Þ}¼û¸=îø@| ryŠxE¼"þõÙ¬’U²ÊÏ› ‚ *îF1ŠQù)ç 8 %ý‘‡à/ìO´[#Œ0Ú Yk` †~ZKkií·º©US«¦VÉsŠ E½Æåp9\Îùïkkk—Lý¦~S?9'Ï’gɳX•#n£ÐúgaЮc»°"¹Èå$ȲáßÌȌ̸+ÛÅÏÅÏÅ^ã¸n`ÈO.•KåÒÍ·¯¯½¾öúZà! tŽx΃åä_qü!¿Å‹1›ŒIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-110.png 644 233 144 2641 14774263775 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜVIDATHÇÍ–ohUuÇŸ³]½»°lºÍŠ,S‘!8b8ÆW)‚¢ËÜJ¦ƒ5“«åöfÛ¥S˜½(% Ñ„jèî ¡!Ù„‘ºec˜/²®ZBÑæÚu­yWwçœßïÓ‹{~;·Vï}ÞÜûüû~¿œßó{ΑïW à±‚Ç –åü‚×üxÑsEÏ­Kæüc.XõVýõNxðƒ?Xþñò՘©ÏïññóùL\JÄOO[[<¿ ^Þðò†¢òœÿÎ%õ…ú2ì:³ë ÀçÝŸwóŒ=þ5Àô–é-àû&oêM¿ÁËÇ—®ñ‹À’/—|i݆àÒàRXýìêg×¶ä n®…È ‘~)ü¥P€ûPL±ÞÌ2‹±©<ßä½zÓoð ¾á3ü9=eá²°D·E·…>Ê5ŒÂi´ýQÃg÷QËë¼N1=Îç€Ûì6“}]_6ë:]tëz'€Ûév’å¸sÂ9ú¯ò*ÅôyxxøŽÇ·ÀŸÓã¥y÷ˆIL é„ó¦ó&è”;êŽb{ mžŒNè„N€Õ£zßši¢ Ô¸Båê÷³[ºÃî0°3‡±’X ð§á—üa«8¡;¡;³HÝK݆xôˆa.33÷ÀÜ`ÿdß°o°È2éL:“;i'í¤Ϧ³w²w ½:½9½ôgÌcÎK?ÏDêfê& Cã¡ñÙ€Ñã ;v™‰ø®ø.§6ê:{£½¦M6ýº¦½¦µ¦ú[û[û[}â©SS§¦NAͺšu5ë ¿¾¿¾¿ÞÏ7©&Õ¤ ôi¨;Ô ;vü°ã4èÝz7p!ÇÇñøÊøJ3{Ç.{¾mã©ÞU½« œnΤÿ8üÇa²Õ‰ê½Õ{ý»;Ð8Ð8ÐèWEª"U??"#2"pñêÅ«¯B…UaUX0¹irÓä&Xÿöú}ë÷ÁYuæ“3Ÿ5|jmOiO©öm›À²¯–}¥OsoüÉñ'1¯t¯zZ= î#îÃîÃP¬ V¡/Ý—îKç•ÎꬆʆʆÊŒ Æc<š<š< ukêÖÔ­ñë·~¸õøÖãð^ñáïçÇÝèÏ~>FOHa¤0ÂSR¼d`É€ˆ|/""iy_ÎÉ9‘Âñ‰ ‘@[ -Ð&b•[åV¹,XÐ ZAK$Ðh4‹HµTKµHà`à`à ˆu¢NÔ¯·Ëìr»\¤è•Pg¨s!œ–åK//½,bôˆ¨/ÔÖ¨àDœˆˆØ""Rf=.ó2ïÎwÌwÌwˆ8·œ[Î-Ydn£Ûè6ŠÌTÎTÎTŠ„{Â=á‘Û-·[n·ˆtMuMuM‰LMNŠ„„[Â- íe߸+Ý•"¾3côÎôÎC¹3çEçwçw3ؓؓØÃ+†W ¯X|+ÑD4…+篜¿rÞ'’ ɨ-­-­-…³÷ÎNžô'eß½×z¯ýcƼ[I|_|Ÿ+Á™uü®¬/ó?,û¯|˜0aà$'9™?Á9ΡÙà<á<‘Ç÷W¼#Þ±èVVo蔲eö˜jWíÌ©fuH=­'ôÄb]ªI5©&Ðwõ]}7/þ*Q%àÖºq7êS'à˜óñS*¥ú5ôë¢=fí»Ï@¬(Vd`í!p‡Ü! £^R/a{»_ÃÂoÃ’!ØÌ3€ƒ“÷ÄçÕvµÜAw0ßð-Úüÿó®¤}UûÂ^³û€·x‹bÿˆÝíîv² /éKXXàû&¿0^¿Á3øÿû®¼o¿.îÛï±ûó öoy {„PIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.8.png 644 233 144 3262 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜgIDATHÇÍ–ÿOTWÆßahe„Y@Åòƒ_bWt#(6KM‰n+"Å©-V›VY4q»_ë²ÍnÔÊ¢nÄRSÑõØm¨´VSÅÁÒ°1¶*H‰ÙŠ(Ã:fæÜóÙf.C»ûx~¹÷yÏû>ïsÏÉ}Α¸ÐS bzÄôˆŸqįÂñ¨¬¨¬Ÿþ=ˆ)°¬¶¬¾ýgˆý(ö#€øãñÇö06çÍüñõ"aþñý̸ÄI80áô„Ó–%!ü¬¿v~TB—5­ÞV?€¢³EgêNÖä×ÐóuÏמ%ž%Ææ¼™oÖ›|ãùåƒõgÎ?sÞr&<;áY˜ùÊÌWžÿM0Áõ<¬ÊY•ðÀúÀª#@¹bô`AÌÑ7›ó¡|³Þä3ùÍ~fÿ )/OyY„^§×v,XÐ~ŠÃÛNn; ú*€¿ž?qˆCÄ€%À¾ÀãÀcFõu£Ì(Žëú€¾¥o#ª@0 OÀ|ÌŽ£¿ ñUm«ÙVc l?Å ç¨sÔvÌÔ#?ÜÛý˘›·(oèyþf`ˆ!ÐçŒ £¿Ñm4h½[—é²±•BOÕSõT ƒ—x)g²î×ýh=])¥ðà ƒ¶…ø‘—“7¶‚û—ÛJ‘Ÿ}È%[•­j0\I®$ð¯`¥{Þ£}ö1ì_â×ÿn¸Ÿ¹¹9¸3Ý™îL”J¥ãíb»ÂÐ×ä{â{½«zj{jÌ òƒËê²M¶[Í`¤©'‚…""¿sÈò½{íÁ‘Ù³;µãõ7³OeŸ’ ³>·n¿Ø²Èº™uS¤«²«²«R$ÛšmͶŠÌI˜“0'A¤À^`/°‹øúúŠÈNÙ);E¼ÑÞho´Hž#Oçi‘ÔÛiib[™;+w–\ùål5[i‡,~çÑ;ìvõDÝ""韋8Kœ%"gö~‘ûE®%ÍUäšìš,¾ê½{Å+’¿ Aþ‘èÖèÖèV×}×}×}‘–Ò–Ò–R‘_‹¯Å'c£qGãŽÆ"W:š;šE2Är{Óø;ñâkš=ãz†%M$gVÎ,},¤‡éö.{—> î·ÜoÁãLO®'¸¾«ú® þØPÜP I%I%I%МҜҜúª¾ª¯BF{F{F;LòNòNòBo\o\o\x Ý+Ý+Ý+!yEòŠä»+vgìNH[íxÎñôyµW¸ÛÜm ÷Û_µ¿ªO uq—ã.m¼Þ÷bß‹á߾ضýûí߃Ãáp8p#ñFâD¸g½g½g…k¯=¼ö¼‹¼‹¼‹ yMòšä5pÔsÔsÔVQTQTQ‹ .. Ç_ؘš“šÕ•q•qôîРâí3í3¶ã›@I ÄÒ&u{&öˆœûæ¢ë¢K¦üu¤Ì^fY—ºnþºù"îwŠ;EäHä‘È#‘"… 7ni<ßx¾ñ¼È@ù@ù@¹ˆõ¢õ¢õ¢HýÒú¥õKElËlËlËDº7woîÞ,R«kZC¤ï†»Æ]#’øÛĉ‰eŠÈHÿH¿ˆüE§ëtK›¨ß‹ˆÜÜçÞ>÷6\hkù¤å½)ëÌÑÌQF³²ÏfŸ…ÔÖÔÖÔV¸¼ûòîË»áÀá‡ÇBÇBÇB¨vU»ª]àxœ[[[¡o¨o¨o*‹+‹+‹!=&="=þ¨gÎsŽ!„9±·ërërkv4¶~›È§mJÛôùoÑø¬Ë6˶¿~†gœÈ=Ÿ{ÞJÄz\ã“ç ‘àOÖÓy‘#‰ÔîÔnKU,n…Å;ŠÓGã“÷ ÝîþÏ€† 7®_¼~‘ï`ôáèC•¿ ±×x=_ó%ó‹Öô…€”Û)·-ÿ@êüÔùB€­ÆVSð}ðwÔn®Ý ðzÞëyÊ rÈ$SUÓL£Ÿ‰¤XÇðz¾æÓüZOëGýÈÛ·A¨ÛU·+½ %„C¿Bó²æeÀ$@Ä­"4ÓL¦z™ŒL‚76óHP'È%˜Pnå%íÆvÂêMd,2jŒÃ&“GQ¾8¿Ôz1ý˜1{mÛ«¡>£>C ò€Yd餉 (ÀÀ`î"D0ˆÄÑQ|#DÀ ˜$~êÖ/Ôl¯NZJ!„Xù ¤¦NƤwÌ;'üFr·ÜÍ»àÆà¡à!ðõúnùnÁxËxËx a#l„¾ÔõD=àÆàÆàÆYøKã—@f̘9À;ÍÏSï wâú1?1cg ñHãPa³T F#(Û°mÈ6ޣޣޣPRZRZR /r^ä¼ÈIó÷ùûü}`¶ Û†gáW•¬Ï"O‰§¥ñæ¸Ö‹êk?ÖhÝÊn QÙTÙ$„hB˱‚Îó‚þ _X¬=Ö~k¿ΥΥΥB¸:\®!VO­žZ=%âÏÛœ·9os„°Þ±Þ±Þ¹ĹĹDW‡ë‚낎ÏÏ…Eì!3ÖùZ/¦¯ý@öÝ컪F׌®sÑì¿LßO}-}-`o³·ÙÛ Â_á¯ðCá¹Âs…çÀëóú¼¾¾·¼·¼·ì—í—í—¡b²b²b [ [ [aøËáµÃk“–¾LÿŠêk?r³r³LLŒLŒ€ºßöx÷x÷x÷ÀÀÐÀÐÀP‚°2¯2¯2N>;ùìä³DÞÓééôt€gÀ3àIÂ/®\\¹NÙNÙNÙyùµÖ‹êk?s*&ÇgW̽ʽҽVøWøWø¡«¦«¦«ŽFG#¸¶¸¶¸¶@w~w~w>tfwfwfƒ½ÝÞno‡®â®â®b(ª.ª.ª†^³WöÊ¿YñÑŠ !ÄÓ&¸¸.¨}ŒÈ6ÙF|¿¿yüæñ›PžRžRžײ®e]Ë‚©uSë¦ÖÁÖþ­ý[ûÁ÷Ê÷Ê÷ Nï<½óôN({Yö²ì%\)¸Rp¥ é‹·A#H˜ßczZ?ægήŒ}G)ÓÆ4ðL 0yÏû$â~úéj©¥6)?È ƒ€‰‰9 ßCPËA¢@fÈ ˆöº¹»rn‹xCÞP¢qÝÌ03x';åcùäò€<fYgÖM4Ѧʹ™6`=ëY²GöÈ?Èýr?˜_™ fð§Yj–&õ1é {Ãíc³:Z}Zrg–ä@™{ͽDˆšVëì ‰*V)Å 3À›ûÌ}D@Þ—÷“ùµÞœÎÿÁYIü¬Ìoθc#3¾ÄH§tuOÝÀ‚±×x=_óiþž•Ÿìí⓽}š7ØÿÀËQBª–¿ÆIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-42-grey.png 644 233 144 6162 14774263775 16014 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü 'IDATXÃ…—}TTÕúÇ¿{Ï™fa€+oÊ,42ã]2™ÐZÞÊ×ñ†™ 0Èn åV—ÔJÒE¹~„™F×+(8 æïBb×–ÊŠW1@Þ$`@˜afΜ}ÿ`¶º«ÕóÏ^ûœ½Ÿç³öó=ûyÉÊÊÊÊÊ‚óf˜èîw‡»Ãj²¾Ìú2ëKæ™3š3š3º~sa.ÌåÈnÞ‹÷â½BRÌUæ*s;Œã8Žã$D €Nt¢@ RÂË7É7É7‘Ln˜æ†[Ž“I2I&ÿ^’í‘í‘íQÿSn|n|n<áýx?Þl˜ç¾·s©é`¢E¿r„!GøÞ2k™µÌº‡æèsô9ú¯ú,#–ËHÝŒ«Œ«Œ«BÞPª U…¸².d]È:’& “†IP×P×PW@œ‹ïÅõâ~Ñß‚{<1¾È#òqö|‚91'æ$ì$I$‰$ùJü$~¿ï>›=={zöôRW·:·:·:[ƺÎuë:©5¸-¸-¸<+Ï”gÊ3aÄÛxoC #Œ0x/ãeÞð†7Œf³Ù϶5¶5¶52ë¥ÀK—…Œñ§ÇŸúÅ•~J?¥ßj[’-É–[È’Y2K¾³“€€€>AΜ;8 hôYÄUqU\Uã?-&‹ÉbZúgÍZÍZÍZ>J÷šî5ÝkÜWêiõ´zøÂ¾à…*¡J¨d'Ù `“˜p÷q &b"&ð @gXdXdX„ÞòcåÇÊñ;{zz¸d ™B¦ø¹šßÄoâ7=‡'ñ$ž¼{Ÿ*šÍŠf@ê)õ”zæýÛXm¬6V/ý³F§Ñitü³ÉñÉñÉñÜjNÍ©9üI˜&…I€±"VŽæÒ\š ÐÇéãôq€´“vÒoâM¼\ÅU\D@Ìœ¿qþÆùüIô¯ÙªÙªÙÊ?+ÆyD>ÊÏð3ü̆PK¥¥ÒRÿ¸›ÎMç¦cþº2]™®Œ52ÍbX ‹½EoÑ[1#1ÖÛÖÛÖÛ€Ú¨MT<´ -û™ýÌ~æææ>Ïãó’GòHœDÿº“º“º“ÜWb|‘Gä£,²ÀlµÆXc¬1€¶UÛªmÅ:õ)õ)õ)È„f¡Yh†#cd ÀZ¬ÅZà~íýÚûµ@AvAvA6в¯e_˾œ†1Øa 8ñú‰×O¼:Êûóþ¼Ä+.¿¸üâò ?óhÌ£1¤Øî@FÏÐ3ô ÀRY*K}RVVô÷÷,Œ…±°ïkoÕÞª½ŒÕŽÕŽÕÉ«“W'¯´îZw­;P¥¯ÒWéîöîöîö…m²GÚi{¤‹<"5O˜'Ì8±äý%ï/y™ŠýŠýŠý0² –Á2À±!6ĆOâIŠC8„C$P<9»ÉY+ce)%¥¤uuuêÍõæz3°å– [.²aÙ°l`kضæè®çv=·ë9@{Q{Q{˜¿v€××W@ö¼ìyÙó€ß5¿k~×ð[“Ó—èKô%ŸâS|J©ÄKâ%ñbÿšŸŸÇm>œçÃ!¡…´‚‰;ÏÎ΀ÀW_ |ܸ5p+`¹l¹l¹ X¬NV§‘———€¾Ù¾Ù¾Yàƒ£ýà(p¥òJå•J`ÛCÛÚöàåìåìå °–ÂRâIf[g[g[q›j¨†jØ¿$ëo®¿¹þæú{÷<îyÐÓn^n^n^d÷!ïCÞ‡`šÚ=µ{j7¤uÁuÁuÁÀDÀDÀDpõó«Ÿ_ý`f` ‹u±.HÕRµT X2,–  Ä½Ä½Äˆ^½8z1(M”&J888@Æ…q€î ;è˜z7önìÝiýTýTýöËÕrµ\Í¡ÐA]öq.‹Ëâ²Hf}E}E}…Mc¸b¸b¸¥s„s„s¦SBSBSB.Kà€ê^¨{¡à^à zôþèý@Ä`Ä`Ä PXXøºøºøº~ðƒ€®®®®®. Õ³Õ³Õ˜*š*š*‚™mf›Ùf(õ«ô«ô«„(ÒCzHþ؈Ø>“QÏËž—=/¿w@¦•ieÚÓw'vMìšØ%é-o)o)o±íÃnìÆn8ù\ð¹àsfßßß`iÓÒ¦¥M€c‚c‚càëë ÈUr•\˜̓æA`k_†•ì?ذÀø?>T$•ŽJG¿WÌTÎTÎT.MŽõŒõŒõdOm8¹á䆓ä2?ÁOð`\—À%€Ì%Î%Î%ƒÄ 1R"%R˜BM¡¦P€Y˜…Yª¦jª„t!]H”+?V~ ãÍoo~{ó[ü¥4®4®4ß(™’)ÙÜÓLÂ$Lò!Aí©=NÓã’fÔ¡uƒaB”%D%S6)›”Mß¡1­1­1=âó†Ï>o¯ƒóƒóƒó±‰ ³a6 ¥Ãv‡íÛðàÁàÀP@ñëïx5VcõBIžY4³hfœj¼k¼k¼yÌWæ+óå@´DK´„ !í©¬€°ÎÇ^ôlaó}#÷RH Iáå=TKµT›Q…d$#™Õ=Ñ>Íð®á]ûP’ëä:¹Ži–ÏòY¾ØÔü , IH°+°`ëÙz¶f±éëõõúzÛ¾qÇqÇqG®Hž*O•§~”””óáwÈF6²É?Ñntó±buV¡}èãB:Ò‘NªVœ[qnŹ‚Í¯8¼âðÊ×¹“.“.“.œ¡Ü­Ü­ÜÍ&K'(¡„f,Æb,`‚ &'p'ÖźXy‡¼CÞ¼©§©§©‡=Õ¼·yoó^Ij›j›jÛÝ9Ë'–O,Ÿ¼ù^ÛÞ¶½m{ÖÃzXœíq¾AöñŒà(8 Žp¾1tcèÆ`I·¤[Òß|Oå¢rQ¹Ü9Ó©ïÔwê%5Ûk¶×lgO‘=dÙ¹P*” ¥`bÎÙ›bSá Ox˜ÆzÆzÆzðuÝʺ•u+á¬Q¨F!\Âß|æÓ|šwÎ.Å¢y¶A,DÌ”ý—DnŸÚS$)˜×®m‰"Q$ê©Íó¿ß·¦YÓ¬iÂ__^^èQ»B‡Ð!t@Iƒh ‚™Ïä3ùLÈ 8`[699)érXé°ÒaeÁêù&ã¡X(й"{f_3–›››››‹é…ÆÌþ`ACvíî³k·È®ÝÊÿÑ®UoÕ[ù4C‰¡ÄP%¥”RŠ)ñ$êMõ¦z“`¼[|·øn±¤Ëá€Ã‡?]œ¿¾|ØõL×3]Ïv@}ŸRù~ÝAþX\ ´;¸b×îùÿѮפפg8›u6ël–m–a–Á¹ÍµÍµÍ§›››ÉNe‡²CÙA#hþú=·ƒÛÁí0Eû‡ù‡ù‡Ñ {¼çì£é·\üŽÅÄÄÄÄÄ€·OÛ˜ŒÉ˜Œ¼:²|dùÈrœ´ùÚ|m¾ÿáåþr¹ÿ¶£÷bïÅÞ‹u=gh7´ÚÙ7¾¸ñÅ/lOÌXg¬3VIºtttÍß|X +a%e!‡rI/&0 Á[Ì€ý øßòüýŽvsPƒÔزY«bU1Ý´‚VЊÿ÷ŸÛ8·qn£°\Z,-–ÓvI²$Y’|©! " " b}LOwOwO7©ÜwÁ}f÷«·ƒâì7Úµ_¶lìÁìáZæûÔ°VÃjþþ²b‰b‰b m—ôIú$}ƒK„#ÂáHÚPG\G\G0»?±±4ýÇ8ôì¤å®êêIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-10-red.png 644 233 144 4141 14774263775 15606 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXíV{L”W?ßc,Ŭ k *®¬YeM—‡Ù©­Ä€V¡2±k]7«¨cÓÄjN$lu»ÄGPê£ E£¡[Z·Xv«ÔÈÆGÝ„6g&2&Ö)ptf¾ï»¿ýƒ¹ß<â#›ÝóœsïùßwÏïÜ;Dã6‰bLÌO°'ØìÂÃp yBû„ö í%y²*«²zý-¤…´_fõ$“L2÷XŸÕóý<ŸãqüØzb~,Ÿh~µTKµbkìzz¶Ü.·Ëí­CÂVa«°U'’šæMó¦yq¡üvùíòÛ@å@å@åPQPQPQñù:ßÏó9ÇçõžÍ‡Ä߯ú³‹£â¨8êZÈOh†e†e†EÝÞÔÓÔÓÔÃ&ú}ƒ¾A$Hðc cà‚ .@÷Ãë|?Ïçx?¶Þ¬ÃÏæGÆE·èÝ®¿s€‚Ë— .+¿q„G„åhLcPÔÝÊaå0 .R‹Ô"@5«Åjq”¿[ÍQs–Ã’XžÏñ8¾N8¦¾ñEšÐ*´ ­Dò~y¿¼¿ùO0Õ›êMõŠY'ö³1|J³²QÙ0—ö©ö)€ ß! Ðt&j‡´Cs•fõ„z`ïh)Z ||³©Þ´Ë´K1óúœçG†»†»†»¿û5ß`´mFËrþìt8 ãøÔB·B·€õ²^¾Gyò`ðáàCDÛvl\Çuõ‡úøFü#~]]Ô´µõŸóg'œÀˆÑf|ßø>Ëâ|t~òfy³¼ùê~¾p´æhÍѶ1 àWZ•&¥ TEU8ö{³ß› ¥ß”~Í“U³jžž€7Ö½±C©¡©!øªò«J@iùH?¯¯Ÿl ?bž´i Ò ~¨d¨d¨DOTÉ¿ùFï^xÙò²%ª0^Ë{-O°=_îùRL)&èîîîËTËT¾”))SdŽddEê • Nœp>œ'úçVXq òeª#Ôêàá¡k®=€M?lú¦9¦9 lnÙÜ'ÍËÎË€·®½u-:>pwànÔ‡zÎ=>÷P1É~·óÃ#•m(6ŠõK  bƒØ@D¿à¡—Ö¼´†ˆèؼcóˆˆr2r2ˆˆü)þ”è›Ãû£÷G"¢›‹n.""Z\¾¸âúSµ§jOÕFI QMT@ݦn‹¦²ž²Èÿ>ÿû'¶~8oÞ ½Š +Ë–€ü™ü ž=ÿÅù/"õþyðë9_ÏÑ_À?¹B®z@Òbi±´xgŸ²Ì™™33gª³œ«œ«œ«"×[²…lÑÃ]* @~v~ö“ˆîËÜ— òdy2ôîêÝÀ¿òÞÊ{^|ò}[5¶ ?‚'ƒ';çWίÔô@J—Ò¥ôc#”\œ\œ\L$_’/É—ZÜú…_aª0U¨ÛxYÍü)ø°óo_ydå(ó”y¢ ²NÖ {Àkϯ=ÀGŒ€‘ysæÍ´cÓ.¦ñ,Ë¿Ö}¸îCͯÜ m6ü{õ¸Ÿä¡X›qÄkÈ5äºNòënënën¶LïÜdõ¬z =5z €Ï{Æ{&æ(;ÐÌÍÜèG?ŒäŽäjÿ¸ÿx¤ÕgFÏì=³¯êOhX'Ö=.¦ Ó„i¿jŠ#(]Ó¥^-T Õ¯4 -B‹Ðµ¢ýÉÞeï²wEÎSÝÖ,·¼ðF,¦` hW´+[ÆN³Ó)¹[ÜV·ÈL4Ae³~’{¥=Ò«I§f&3™ec„k!R¡¼—Z©•Z‰$ä‘<Û?çÆFã!ã!%Õù®³ÁÙ­]íuíõ‚øÃ¾oãm€­ÖJ´’È(®í]ûíÚoÕmú 4&Ê£ö}[2¶dl!M¢I4 gÃìjôË-üwµtGº#Ý:²vdíÈÚAd°,‹}Ÿ®ÝBS¡©0Z»šU³";ì°Æ0†#¼Õ¹ê\unD‹ K–4,aË8ž!ÕjHu?÷‰±:ãZOBœÛëǵë<ûTí¦*©Jj„v_»¯Ýh±}èìI}I}I}¬\×d²˜,&¯Ù'Å#qüèÙ©!N»åÏÓ®Ò¥t)]å>Êx”ñ(˜ïïïUçèZl“Ú¤¶¿.åR K/ž` =Ç"8ÀÓ´{ÐxÐxPIu¶8[œ- +k‡µÃÚ¹väF¹Qnì ¿UIWâêò7lâóÆOXÖîßž¦Ý¢åEË‹–G´k_j_j_ŠOÆ×™Þ ¡J¨ª^Ù[FŽ«+ÐiÏÓn¾T'ÕIu®Eœp•­ÊVecÉ æs‚Ê-½ÕÉ#y¬3¨9üÛÁLf2Kθz ô?Z¼v÷ÅúEýÂza½° R*¥Rmž8]œ.NH tgú3ý™~"éªtUº*\ '®ŽëÜÿÍRõÿŠ©˜Šå±ËïÖˆLd"„N¡Sè¼÷Ëñøl{\gq¸Ïmõ;5JÝXÈÂIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-25.2.png 644 233 144 3121 14774263776 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýOTWÆÏL­:p”…Ô¸NJ„.B,:ºÆÈ‹R…- µn©KLS£!Q×Pe›líâvbÊ¢K%3ÎnÃKÔ.¡KÀ¸]ÖÚÒi“¡Z˜L6,ê@yîÜ{>ûÃÌe¦ë?àùåæûö<Ï=/ßs!„Xþ 0ZVã²m<ñ/ݵtWÒßBv½ †× ¯¹ÿ–O,Ÿ¬h\Ñ¨ÝØz\Ï®"‚ͧûÅrq,iYÒbÈ ÛÕðÆËo¼¼4!dÿ¥L7L7¦ƒpèóCŸ\w\wpFîŽÜÏσˆ­Çõ|½^Ç‹ÆÕÿÇ/<ßþ|»á?°dñ’ÅBÀ‹¯¼øÊšwB ž5PòjÉ«ÃÏ ?' ú€bd0É$ú²õx8_¯×ñt|Oç韟+Ÿîöïö›®† Té¨t€ü'€rƒ?ãÀA ½A/È@°,XF@þWûLû ¤OÕFoäGò#µB­ ÁÑà(PG ÄÈ/ÃxöÊÚÊZ]à}—vOíž2]…øüøüÈš†¿µù¤¼¾íõm Ó”¯ dµö¶ö6Šì•M² ¹0G3L3MdÌ1Ël”m•ŠTr£¯Å£,àU…ðåО¹=sºÀÚü¨¥Bˆµçé49MÎÉEàyÉó(¿à7¾žxx‚å+ůø#|Æ ã„u=êzÔ¾“¾“¾“ šU³jæ©¡ìSìŠ|iÏ<<ÃŒò~<‰žDà–ÉerM.Òõ¹Y!êÿ ‡k×ÀÄ,€–Qt³àZÁ5XvrÙùeç‘y—ò.ä]¯Ëëòº i:i:iRóSóSó!=#=#=úúú"‚ž$>I|’EÍE׊®å–:KrÛ…-nùÆÎikkpdß‘} }Ò#‚¿Bˆ¾JèŒíŒÇûmEmEò@J|ÒI_Ð rkrkrkàø•ãWŽ_[½­ÞVÕÕÕ0Ð3Ð3в^ÖËúˆ0ç1ç1ç1HY•²*eUÄ¿åM–MçÎ9ö;öËÐ×ÁÅ!=k¬7Ö+[À·ß·í//†aÏsÈ W;:`ƒsƒsƒNYNYNY ³)³)³ ¶–m-ÛZÉ—“/'_•\÷1Lƒ¦ÁÉEòÎ`Ö`¨gB}FuÏûçý̨WÔ~µäQyHÕ­ºU7¨ÕƒêAÐJµR­8ÊQŽ‚¶]Û®mY* e!¨.Õ£z@uÏÏ3£ãË/C|:¿®çéÎ?¿×°×Œ…;¿_íT;Ÿ´b­xáïex.`Žf~6“**0Ácn8’Ÿ´­…ñ0žŽ¯ó=ÝùÃw%¥o–¾uWòîêwW/¬Ç ÀŽN'ÔrµœÈnÙ €Dl=®çëõ:žŽ¯óéü!=Ïòëâ™}=›/Øÿõ¼L.žæÔ¦IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-27.7.png 644 233 144 3121 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mLTgLjŠ`‹Õ„R’N¥®A£4i7)umµ¶¼¨m¬Ò·¨Y7| º5u݈kXÐU’¥K·b61DÛ–šQ˜êmŠ’vWkƒ&ÅLafwf;Ì8/÷Þç·f.wv·É~õùrç^þçÜóÌý?€ˆˆØSO̢̢ÌÅIœù¶e_´iÑ&Ç_’¸C‡ŒšŒšë‡àÁöÛò?ÎÿظiaÓoƧç‹XüéõL»ØÅ2d÷d÷dT¦pìX½cõ¢¥IüûË`ë³õ…5x§ÿ~€Þ®Þ.~ Þï@ 2P 6ýf¼™oò¥óKÓÕ…Ÿ-ü,ãd?ý€o,ÞøØ¯’·ƒ—¶¼´`zÁô• ºÈ%WU!B˜ËŸ†M*ÞÌ7ùL~³žY?Ù@Á†‚ "üñåàËAÛGÉ„›gøScWc¨‹‰>NÒK/¹ h§´S nhOjOS!ãSãSPãÆ¸14ª§ÔSúûúûÄ8­ÖNƒºÉ~ö“«üI>5ÛøPãCÀÛ©zTWÛ>‚¥K–.±ö4õl}Ž'ê*ê*@­H ¨ßõF= uCõ«~ÔüŒÂÌ1Çÿ[ ø€Hó°iN Ã×—9ÁÖçÒ¶RDdåI\¶n[w( n­¸µÛØ<{ç‡òʉhÓtM‡ÄÎD]¢| ¾_øÛýíþvÜ Ü Ü…hE´"Zau_ω瀯ßõEÁjfãÌF"ñØ£±GÙ=91:1 `Ómz(KKö“ÉÏEDÖÉ/Þ˜}c6O EŸ||R­«Ýù™ÎÈ€£v…}…]l5õ5«kV‹œ]x6÷l®È*Y%«D¤¼¯¼¯¼OdÙв¡eC"UUU2¿\?s­u­)9[²³d§HÅ솚 5b[öwÛaÛaøóF¿ýJ­Ù÷Þ¾÷ò4ýxª­PDd¬\y®<èúÍ'/~ò¢zó‰Ç€c€˜ùæë=ë=ë=pT;ªÕ¬‰¸;Üî(v;Š0];];]kù#®ˆ+â‚ð`x0<žíž-ž-P\Tè.t›®ŽGŠÕ›pîܹs`¨d?BQÞTÞ”êßë¾×a¦*°5°¦o}ßý}7\8z¡ùB3”ä—ä—äƒû˜û˜û˜UxWÅ®Š]pâȉ#'ޤm¡3îŒ;ÁXi¬4VZvç çuçu8±ïxÙñ2Ë®'¦×L¯XüÅâ/TÐk¿h¿h|G­ÿiÿÓÖgÿkÛþ¹ýsPÖTÖTÖWr®ä\ɱˆ®•]+»V§ÃépB°9Øl¶üF¶‘md[xìöØí±ÛàØëØëØ Áæ@C !Mf |q_¸—Ÿ•Ÿe|'úáœgržQ=)ŠÁ_¿=?y~ÒúVÛî´MµMAwfwfw&ø«ýÕþj8Ør°å` Ô–Ö–Ö–Z  Z–·,oYnÙì9°çÀ¨;^×V×–6©S?bÞRo©5±L E<Ï7_‹ =;ô¬HÖBû¨}”·6½R«ŠI|hÍPÉP‰HëHëHëˆÈDx"<±·Ø[ì-"Î)ç”sÊú³'Ü wÂ-2\8\8\(éŽtGºErGrGrGDêKê‹ê‹æÃã""¼% .]ºtID$Tªüæë”\tx`÷󻟟߈µ Ÿ×ÏÏÁÒ-#©kóë*W¹ xñâýåR¨ŸŒ÷âEáÕ&´‰´zj÷¡Ý‡L=ëð½)Ã6i› e©+“e“e ÿ.©cúx<ÑëŸëŸƒÒUDEÀ˜1fŒPuªNÕ¥NÐïé÷ô{À_ò%W¨åÔµA"©èÍ„'~œøÀæµyCY¦®þ¯òÇ·elËþ‘Ræ îÒ]À?­ÆVh©y„ bD‰¦5f £ÿ‡/m~sÆvc; bú >˜®üÛ²·eÿ¤ò§ÎJª_­~5í¬äÝGÞ}dž h¦™\ÐBZ@M¨Ëê2d€…M¿oæ›|&ÿüY™ªŸìç~¾]Ü·÷±ûóûo|š&œ‡ü©ãIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-19-red.png 644 233 144 4123 14774263775 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXí—mlS×ÇÏ}qHXºl¡lh`[ÁCÅyÁ‰Q]¨5¡%‰Ð t„ÔTUy-X¤…D¡Ñ@E©‰Ua4Äš!BЦ0TQ…Ší‚©&;™‰ã{îùïC|®_@Óö|±Ÿsž—ß=çϱ ™°_8SœSœSœÂ¿#©III¥Kd*S™Þø3Y@ÀÄ4«'2‘‰Ì} Þgõ<žçóz¼~|?ÑÏËWCjHØ??ýWr§Ü)wv<¶ Û…íHZº?ÝŸîÇßÖÜYsgÍ`íýµ÷×Þ¬ÖkAÔçó<žçóz¼>ï÷b".‹÷3‰#âˆ8âYÀWhVÕ¬ªYUôƒ¶Þ¶Þ¶^650  AB£Å(<ðš™çñ<Ÿ×ãõãûe{1Ñ¿"zE¯èõ\à z z z”߹®+"ÆrU¦2(trL9Ð…´ˆÔBKhIŒ¿‡fÒL€å²–…çóz¼¾×_ÿІ&tB!òAù |°ý&O0Õ›êMõŠEûÙ™¥]©VªæQ¿P¿0Î#0ˆAª–‘ŲŒ«Õ0ÏĨÒNÛi;À>TÓÕtx´©Þ´Û´[±ðþœ‡óÝ=Ý=ݽ7Ëôv½]ogYîÇn—Û…áH=¾¾ì» ðlɳ%0äò#Ö’èCÐ%t €€¿Õß áãáã=¤>Ph9÷c·êV1¬·ë÷ê÷²,ΣñÉ[å­òÖ¾ƒ|¢¥²¥²¥’UG •¥MiªP@ˆ×Þ5w×\0÷˜{0‰ÝýéîO°¨tQ)0ñMÛ=m7tÞê¼(qIÁ–Ê–w[ÞeÕÚÊÆñæKÏIÏIÏAý“Ò'¥OJµDþÌ7¯Ý¼oT½QÓ+¿[ùÝd FÑ(@æ`æ |SöMlvmvLÝ5uÃ|í÷¤ôñ—¿8çã Z}xõáÕ‡£OF]á®pêÔÿÞÿþýï`†k† ÌÌb‡¯_9(àĪ«bçýcþ1r…\¾S¦S&€ºbcä<œ/ŠóÖÖÖZ ¥Ëérº<67Ñ7ÍAXv}ÙõÉV4gsÎfXv`Ùð÷ùû ivÓì˜ù,é³$€îK¦ÖEÖEÖEÚ¹}^Œ|ù‹·×Ûëí%®C"‘¤?HRù=i'í„\Á•Ø£ ßâ[B. —È$vnÿ¹ý„rß|ßL!¯¾VH!‡jÕBÆ#a?À 3!âWE#£’Ïãóø<ÄÅùˆh-¢%ü(²Äõ'kNÖœ¬‰‘@2M¦É@kimìË´¢wE/G£q«1ó '¯'úö?€±’±ÊíâÛÅÑ¥gÏ¿~þõh¿K _篭ä!OÈòˆ´XZ,-ÞYÇß2ÃÃÚé.s—¹Ë´V¶‡í18Ì6‡À8Í8m²­gôQ˜¹eæ¸Úvµ @Ðò¹åsoeWgWÀ¸~\P¡m¡m@ÎÎì#ÙGTí¦KÓ¥éLJIjIjIj !òeù²|ÙáÕ|«Éj²ÒZÞVµ?ˆœüÙßn~»V ­š Ô·Ï·Š„"@ ¢Éáì Ùõxs3®ú׆£ŽªA p“´IÚt{Ý„ŸÂßzn³šuyº<]žçO°í±í±íaż òKz–žFNŽœð;üŽ8Â&4Åx!5  °0° •¡C?F·úôÈé†Ó xK»BëÄ:±n¬T˜!Ìfü¦-Pê×®Ô ¡B¨XÞ*8‡ààZQÿèìvv;»£ëIk#šÕ€0„Ø•e¬ŽÕ{•½ °bvŽ‹JÉëð~êý0$$ƒ¤lÕVr¿ô‰ô‰Í¤¡Yˆ…Xd}”µ’By?é ¤ƒÉ'ù$ß_iWk«¾Iߤ¤¹?r7ºcµ«®RcÏI†1ŒF|'Œ0lš¯æG_Åõ×Ö__Öj7Ш<*:dlËØ–±Ñ$šD“p6BWÉ1ù\'Ý•îJw…®¬Y;²v¢«ÒU骜4íš M…±ÚUmª !8á„ÀS<ÅÓ˜q>OçGµØ˜ß˜ß˜Ïе»Mè+ÿÒ^¦]£T'ÕIuž…¸Ü^n/·³#¹ã¹ã¹ãÊ-m«}’OòÙf‘öÈo ±‹äNè7…ü–¨Ýñ~ÑÂFa£° fb&fõ×âLq¦8ˆ@ò+† !h"õI}RŸð÷H⺄û¿Yšö­„”ùfüôG•"™Èá¢pQ¸ø`öÄø\gÂθê¾t«ÿ®û„kæIEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-home.png 644 233 144 271 12610450011 16057 0‰PNG  IHDR ü|”lsRGB®ÎébKGDª#2eIDATÓu޹ €@ gM’ºÿ®O"¢†%àóÄl`ÉZ "¨TÑŒ)D^/T|§²d‰Sná#É)]û½’‘Ý}"[? OGÎƶ÷IU£VÐÁƬƒ€ ´ždV9åýzËÿIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-157.png 644 233 144 2760 14774263775 14774 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¥IDATHÇÍ–oLTWÆ_¦P¥ cIQ²ÔHC­1ð1+¦6Ö&–µm2&Æ--¸ñ„4ƒ¦ÁÍ(QVÁn>Ñ4£­!•’˜¢S&bL7$š £`M»ÀÎB‡ðwÃÜ{îo?Ì=Üq7›ýêùrïûç<ÏsÏ9ï{€ˆˆdÙO×F×Fך„í:ìø3ÞËxïõ+ »Ý„”R>úûqXûÕÚ¯²»²»Tȱu\ç'Ïqð“ù´_²Äq¤_O¿ž²Û¶› ò­Ê·2Ö'ì³ýà¾é¾5àH÷‘n€o/}{‰Z„¦wOïÇÖq¯çk¼d|iú~HëIëIùÒ_NYòßÍ·à‰„§°ÿýý4ö’åó7 “Lk70ÏëÜ•/¯|©… Ö ¬ ¬ X×Y† zT•¨0sÍWÍW¡¸¨¸¨¸úNöì; ƒ®A×  j j j¡l¡l¡l6Wm®Ú\#OFžŒÝ:ºut+äßÈ¿‘fü3þRY¬µÛÌRäçÈÏ õ¸DÔwê»”!ÁØo쑸ˆˆä¤l’eY–•±Ô³Ô³Ô#’Z’Z’Z"j µ†ZEª¦ª¦ª¦Dºf»f»fEÂÍáæp³Hicici£HçÅ΋EŠÃÅáâ°H–/Ë—åQ—ÌOÍOEd2Á'F¥Q)âèÑgŒ«³Wg{‰=çÆŒ1£Ï4¬jXÕ° ?(~Pì|ð©¶Sm§ÚÀ³Ú³Ú³.?ºüèò#'Þø¸ñqãc¸Õ}«ûV·ãWßÇ+ã•Ä­Æ:´Âïœ1»*©>Q}©0æ §£[@Ì‘ <ä!…B%ùïp‡;@9å”'ù¸Ë] ¬ñŒ˜³‘QÛþçªò6p‡ÝáùT¬áøpl²} êU=‹ê jVÍ€Ë2,gœq0/˜Ì `Ö›õf=¨mj›Ú–´2wT¯êë«ÅjPªƒE¢Ø6a…ÿù>¦mËðfx3’;³yϼDU…ª n÷~ ìŽoÙ+¶ÄKvÌ‚•ø‚í‹©êq0Ìç:¿Í÷_ÿü+©Ï«_ékñ›€?™Î›ÌÄÀê·úH![ÇWŽ„=_ãi|ͧùWþ•/ìíâ…½½˜7ؼW ×nöEIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-88-grey.png 644 233 144 6234 14774263775 16026 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü QIDATXÃ…—}PWÖÆŸÛÓó „%¡4Œƒ€ ! ®DÖ„åUÖdbTeƒ†ì†ÒM"(BÀòUŒ‘Š&VøÈÖ”àHȈ¼5$«²˜^XÆ@40àÌÀÌôôÝ?˜f­l¥rÿéºÝ§ŸóësŸî{šÀ3ç|Nù§ÉÖdk²ÙjïGÞ¼A 1ăãààKâI<‰à OxàÀ`€Xˆ…XÀ¬ù óæ'Ð_{ªöTí).­¿¥¿¥¿…½.‘Käùÿ_áR¹T.5~âøáGŒ¼CÞ!ïÄóÄóÄóþ÷šíŠíŠíÊÓT®S®S®ãR232323Øë^Q^Q^QøÈòœp –écú˜>à|!2D†HI €‹¸ˆ‹€Hkh ­¼ÞôzÓëMüNÐW¦*S•©\Š_àøÎÂY8KòrÇŽ/_d<ë«ñÕøj¨JS§©ÓÔ±‚G&¡‚ *Ì &˜û|û|û|€óâ¼8/€l#ÛÈ6ÇqÇt  ¢A4°/´/´/\!®W@î;äæúšM¦†­ö}É÷%ß—¨JàøD«®>¸úà™7í>v»OÐs)çRÎ¥œÃ…µ kÖ’ÿq y>rKŸ¥Ï"ëÅJ±R¬ yÀp*NÅ©b³æ>œûpîCY¿$~I<)ÃNìÄNHÜ Ðyè[­Îê×ׯ¯_Lî›Ü7¹OÈIdndnd.)x>Æ>f³áo Ž.8ºà(råùò|y>l®WŠ+¬ `©²TYªïHïHïH H$ ’Ê-Ê-Ê-¹In’›€Ub•X%€µÜZn-¼ozßô¾ùXüVåVåV€ù˜ù˜ù°™mf›y”UlPlPl€MàøÂ!"¡Ìyæ@ÒÁ¤ƒIAÕ:µN­©‹®‹®‹æm7ß8|ã0£P8…ãö&§Ö©ujÕ‘ü¡ü¡ü!íhGûS'Å£âQñè7r‹Î¢³èžÎ\Ó½¦{M7MLîIîIî!ÿ ¯Ó×éë N?§ŸÓD´\´\´iD‘æ±=~¶a€ÕXÕ€ã=Ç{Ž÷æs¹°wØ;ìغ–t-éZ‚g‡ÎÂe¹An¦×RQѲCÂîîd˜J¦’©u0ǘcÌ1Ó_xoà ÛŠfE³¢hÝк¡uÐ'êõ‰¨!¤‚T`JÌ‹y1ˆbE±¢X€–ÐZà4Nãô€é ¤ƒ€ä¶ä¶äö,àää—“_N~ Ececec%§ˆÄÀLû·Ÿ'j¢&ê»;QŠR”²Aî6Ï=Ó7²ï‘ä9ñlf5³šY½§a¦2ÌGÚeÚeÚeÜ.ó!ó!ó!(Èr„Á$m£m´ {É^²wvO1ˆA€\'×Éu€FÑ(5ëÅ9W¾½òí•o]»Ç?ÿ|üsö¤4P( ¬)^ôþ¢÷½ük¢…ä 0ÀÀ­úQa®9ÈAiX|iñ¥Å—Jÿ$Ë’eɲjŠÇ}Ç}Ç}Ys­O­O­k·ña‡zèØaŸÅ@Ói:M%ÈrÒïŒß¿3ÒÄökí×Ú¯‰J=ü<ü<ü†§ÕŽjGõ;‡» » » j¤Fj„—[æ3Ôæ>žç=yOÞ^÷;ïwÞ9ŽGÎ;‡=æzÌõ˜;p¾WÛ«íÕŠJ›^nz¹éešH²I6Ɇ”?ßáÏ€B9ä t á‡©ÆÆFÔè–ê–ê–ÂKè ø>†yçðŒõ†§ÝV<é~Ìda “»I¤î©»&¢R蠃ε›Ä‘8—ø§™_Ž¯ë»œ»œ»ø?oá·ð[xfUä±Èc‘ÇÊ÷ð=|LÆ„ÁÎår¹\.¤§BN…œ q-Q¨GÔ¢>ÙRÙRÙÒÒ3/Ížë|_Æ—±'Ý+ûaÅŠ‹‹‹‹‹1)Tî³r{w·Û»'ÝÞýbÖ»™ÈD&ó‘Ö©ujÜ.s…¹Â\Ã0 Ã`B¨DóTóTóo...õÉöËöËöw7ÚMv“Ý´ÿxßó}Ï÷=/xšS ßSPà›ý° p |ëönýy7`<`<€5_,¸Xp±Àµ‹°‹à¥÷Ñûè}pºµ£µ£µƒ¤)z=Š€WòJ^ùçoØÍìfvóÔïUѪhU43æÎ'´•S¿äáWFBBBBB8÷TO%TB%ä‘ð‘ð‘püÝ5ß5ß5ÿ'UIURÕKý´æ§5?­ñ¹d¾k¾k¾K?èü¬ó³ÎÏ\+-N‹ÓâåˆW‰W‰Wý5ˆVÐ Zñy#¤B*êÇÆ0Æ +à.÷K‚ß¿âÝ"4¡ M®BÚ@hC‚©c꘺«ªéõÓë§×óáâ2q™¸Œ¹+ÊeŠ2¿j © © ©ûC‚Ñ`4 äÿø'ù'ù'é§n]­Ðök ~cü»îÏ…«ÙÈF6ûO’A2HƵÚD›hÓÞ­òòòÌ]Ñ hP4hZÀ—ð%|É®û=›z6õlf¡rë åÔoqüêÕï î|}ÛIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-36.3.png 644 233 144 3250 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü]IDATHÇÍ–íO”WÆï‡‚0¼(CØÔ"IÝ Am3–E¶Yk˜"F«&d«îö6[MdC—%.R%­›bQ\ •Ý’ òæF|Y¢•ª[7a±P:J¶V^êˆLyyžóÛ33ûòx¾<¹îsß×}çä\爈H|à+––¶ØÃ~ŒG½õÚòó~\­ƒ–«åÞ; KN-9`=g=gô±9oæ‡Ö‹ùCû™q‰—` ²)²IË à÷aGÆŽŒ¨Ÿøqåu°4[š§|ðVË[-Ž:Ga¤{¤Àé΄ 6çÍ|³Þä å—÷ÿ«¿DtDthÿ‚ÈE‘‹D %;%ûÅ_ûî¿9¯ç¼ðè¹GÏ©0Ð]@,±*ðàÁOB°9È7ëM>“ßìgö÷ëH|5ñU>¶ÛÇ-µþ‚þ><ôÉ¡O@}àm¦†jª‰]têõ0=Œ9õ¥qÌ8üAU¨ uOÝfõúNæÀçö¹Jj¨!v¯þPÓ¡&S`²ÏÙç,µ¦ùϽý`3Ïç­Î[ êïMà;¾µ^ŸÕgñª¿©:U‡2œÆ÷Æ÷  •¯òU>°ˆpƒq©GêJýÜxÉx /ð#?‚Š ðoÍÛ›·×øÁæ­Iû«–Ï,ŸyÂá~òýdð–°ÅõÊhÍh Ó¾ƒ¾j_u°ŸwÈ;äW±«ØU Þ o†7#DÐQŽr4$ÿ˜·ÍÛ®ŸÖÖ1íûŸœ§øÒâ°8<á¦QšˆHõ 8 Ða¼„§<5VoÚðrúËé`]kͱ栶]ßveÛP‡Õau Š Š Š Æãˆq€íˆíˆíŒ•••¹«ÜUî*Ø´fSú¦t°~duX¨¼ÓöJ{%Ì `¬†·'ÞžÕî×flYß*’33-ÒZÞ6Ô6¤­ñõùÊ}å2ïü»ó¼ó¼hý3ýz¿.R2U2U2%rgòÎäI‘î²î²î2‘4kš5Í*Òרר×( £%µ%µ%UÄ÷Ð÷ƒï‘Á¢AÛ M´[Gn¥ÝJ“ù;¥_|=¢­Ù²xËb5ÐÃÄâ–Å-ª‰ÜáòáòàJ=µ“E“E°±s㥗`¹g¹g¹ªªª úTô©èS°ljÙÔ²)ØZºµtk)xb<1žP=ªGõ„ð]ö\ö\Û¯lm!ák­µ\œ87qàÉÆ'A•ÇeÇe«¦0>ÕÆµqÒ¥9.+.KäžþíoÈXïtoRo’Hë?[{[{E–>^úxécÇJÇJÇJ[ª-Õ–*ò0æaÌѧ]O»žv‰œÙfÿ™ý"Ú*m•¶J¤§¸§¸§X¤w w w@¤õAë`ë HÒo“’Dþúéň‹2&’P’P"¢.K”D‘¦.è…z¡Ö'ÑÑ.r÷w‡ïKâîñÝ_íþJäæÎ›;nî9>r|ä¸HfVfVf–ÈpÃpÃpƒHMwMwM·È¨U£J$>7>7>WäB×…® ]"×n_»}í¶Hþ‰üù'DnD߰ܰˆ¸÷»³ÝÙ"KîÇ¿ÿž$ŠÌMÏM‹È§â´>¡RDä‡èlü¼ñó…ÿ÷÷Q¥M¥MÌ­›ZçZ炳g η¦>º>º>Öw®ï\ß 3 3 3àNt'ºÁ>h´‚Ksi. *Ú*Ú*Ú`íÐZçZ'ÔŽÕœ¬9ÉœÙ?7žn< üů'`Õ7`ßÞ}{‹S¢ôwôw‚6…BGÕ¡:TÐH#!öÐO?ý@ %”„ÄÛi§Pxñ†ð}£'ê‰ÀIóTî+ÛWÌûõÃ2`ð„sÚ¹Á¹ôßø}F/›o™oaÚxÞ°và ®rŒ#ÅH½P/Ô ÁÈ1rŒ`»ØÆ c…±ø)É$ƒþ‘Þ­wƒ^:iþÓFRÀÇ.;Óœi––žp†>ö?ÎÏö¨íQ€ 8ó¬~M¿`… kVÀ<óÀ,3Ì„ü!…Lð„'& ex™Õ¯èWl÷&lÜù?pWòÆ›o¼rWòî ï¾°@Ð ”SN,ø<>€¾Gßèëê:±9oæ›õ&ŸÉoö3û/Ü•Ïìëâ™}=›/ضèÌÖUIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-14.1.png 644 233 144 2717 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü„IDATHÇÍ–íKÕgǯã2=ÃlEƒ²=À,Ø‹ÁÒì¼™Q&ëhŠD[DÒz`ÔXš0qc ØJƒ”® cºÃ1MÌ4t«2Æ2˳eLV¡ì¨Ç#ó{¸?{qÎ}~gùt¿ùq=Üßëû»¯ûº®[@DD^I|Ò^O{=-;.§pô™Å™Å¹Wâò \»\»þ¨‡¥ÍK›–µ,k±ï9²¶kÿÔý"~j<­—WÄQd\͸êÚ’¿‚Êw*ßÉ|5.3îwGÄ„~þèg€öËí—ù=m mGÖví¯÷k¼T|ùê¹ø"H¸Æ!cqÆbx³èÍ¢·ŽÆ‚oÁNïN/ÀÄK/©4°&,²Ô L½¦RdmOøëýOãëx:~œÀŠÂ…"P¶»l·û†ˆÈ½V¨y­æ5 Àè •FÉ3d†¬j«š(_«U¤«t• FÔ`Y»­ÝD1µ?ßò-YlNàýP=X=¨ Þk¥­,­,Í}Ió‘ÿçöÌ6(Ÿ+ŸuÀTc|Ægª]µc`"„b”‡<uDV‡q–IŒFR«T­yß¼¡Æ¬qk\«A"åv¹­ žÙ–’J‘·Ï;ì‡qçAÓƒ¦$àŽÈôÜò¹åÌw»ÆÝw¸Ãˆ‹‹ƒ™µ3kg֦؇bø…›ÜtÔ‘épi¸”yc,ŽAwÐ »;ÝáEšð»ˆÈ…[pè‹C_€Ú`oüròKð4z.{.£:Ït6v6²`Õ­«[W·Šf‹f‹f½Ý`7Ø  V©Uj„ΆN…N笧ÍÓ†êüÄ·ß·?é½Á~ïÀ7ôÉ]¸%꾈Èp5´Û‚ù @U|š·ç"x˼eÞ²…Ä#=‘žHÔÔÔ:þ=;¯M_›&šÈt•e¶NµNibÃÕB8ÛŸíWW}üòã—A}œ¨£UÆ#ãl\½1gcøþ€?´ÐB lÝ:ºuö4ìiØÓ%ÛK¶—lwÅ c…±B°Çíq{¬|+ßʇ¼%yYyYðÓ«íÁö ãoÍN¬™X}3û¦º*°lɲ%ö?N›:ÊN–=y½y½y½Ð?Ð?Ð?O_<}ñ4H½ÔK=lÞ4¼i2Ÿe>Ë|¾ _…¯"%`½UoÕ;òæºÍu›ëà§ÊŽÂŽB§ÍX±§Ÿ>Í'M°}¶Ï5"†ñ¾ñ¾ˆë Y‘¨ ±þ²þ´þ™ñÌxf<"ÅÅÅ"W‚W‚W‚"¹ÁÜ`nPdeÍÊš•5"9ÇsŽçi®l®l® ÷†{ý’\±@Ìó‹X›}f_R½Bîš¹f®ˆˆí·ý®Ñ9å×ïJâ9OüI´öHí¾Ú}p»ôvéíÒ…wèºÿºÿºNÆNÆNÆ –ËåCélélé,Ï<óñŸÔ4âx üd<?Q•É>¦Üÿ¸ÿ /Â~`åS>°›ì&» e”Q°¢VÔŠg9Å©”6ò¡Ñcô0¯¦u{wì] ⺃©}lAç¯È¨ÈÐ0Æ «Ëê {¯½7ÙË`b±ÄIÌ1Ç\¦€&™líoWÙUD¬Ö ˆ#ƒP‘Y‘©Oêÿ¹Y©g—ž•q‚œ•‰XX5 páGÖödÊû5žÆ×ñtüä¬|a_/ì{ìÅ|Áþ?Ølóö€‹IIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-39.7.png 644 233 144 3173 14774263776 15060 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü0IDATHÇÍ–íO”WÆï™aòb‘Ķ”,eÑÄ jjXÚl¡’4"©jã[5íÔ˜U“Ö]….Q°+6¸D‰RŠlRè´VüPÐMu!"Ý+í2Öœæ<ç·ff²Ý?ÀóåÉu¿\÷•sf®sDD$)ô°¦YÓ¬ AlݎǾûîk â&–2KÙýcØØÜ’ÜbŒ†±™7ë#ûEÂü‘ó̸$I8ÓÓa)áO "»";vy×öƒ½ÓÞ9€»>ì¸Þz½•*˜œxZð´ÂØÌ›õf¿ÉÉ/ŸüÏ|ˆî‰î±L@Ì’˜%"^”^”q X0ž›6lÚðÈöȦ­ ¦€xâuàÁƒ¹\ØÌ‡êÍ~“Ïä7ç™óƒzRÞNy[„ÆRw©Û~)Ø0ÚF}õçÕŸƒþÀB'¢‰&âAY”8pÜøôßz£¸®;u'€¾£ï¨=j>Úm6УâñÚäÓÿ©~±úE`wh›om¾e¿Ë—-_>ÓÐ÷Óõ¼ôžã=è7n?ðèb#ΈcA—ëuzZ¿©×ëõ‹;…¶i›¶›ØÄ¦p?~ühàXRI5“ · ¢·¢×ÜÁO×G¥ˆÈªzœöËöËž(OOƒ…ßP2Uøcë­Ì "æµûÛýíàêsõ¹úÀxh<4ò‹å/öú aªkÊ;å×ÙŸŠ~*bþéß«¾W)ñÖ}7ö€]Ù•'JŸ êmi€}jŸ÷q~ægÃñÛ¼üÕù«!éIW’® +þY1Z1 ®ã®ã®ãP|ºøtñiˆ³ÅÙâlPy¸òpåaP ªA5„…õèÝ£!©2©,© V]Õ¸ªÝai¶4CïÚêÛê :xè ,¤õH HDäN5|5óÕ ´Z¿üþËïõÎß$¼ÑõF>×:W¶+Ö,[³lÍ2¨›}sÎ9çœÊ6 l€ô´—¿}ù[|6ϧϧëpíÚµk`è a:¡+¡KwPöøäã“aBÏ¥™]3» OþîüÝ‘™‘™‘ o^¼yñ&díÏÚŸµ.§\N¹œ‰:Q'j8äü‘óG"޲Ê_å¯ ãmÿØvÛ}8³¿.·.7W Ö‘}"º{º;º;i|ÆÁyÚŸ´?1mãNuÈ.š`ïν;¿´úH}¶)þÅ@9å”ÓL3á -´Ð8pàˆˆÏ3Ï|b’I4“±À˜4è½Çö3…5 B>†ýý'Š óæ:ô1uÂßéïdÞxÍxßxhä g@M«i5 *Ke©,0jŒ£è£>PåQ`˜AÁ2¼†ô¶€3à\”ZÂÜØÌØ €}Ò>é‰2}õ—ÎÏ–Ø-±€9³W}£¾0v;XXÜA?àÃK„m Q(`š)¦"¢³F¹QÎ>åTÎHçß³%æÿ:è®dsåæÊˆ»’ƒ¯|e‘ 8ÉIâ!à xÔê| ûu?,ÆfÞ¬7ûM>“ñ® Íêyž_Ïí{ìù|Áþ̇þ` údIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-6-red.png 644 233 144 4056 14774263775 15540 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜãIDATXí—mLTgÇÏ}ÄJwvù" £µøŽ@t}!¬€ &¢­|4Š)£ukD´ƒ­5Õ  VŒ6­ÁbW«€ŒÆ„ ‰[ •Švi¢ ŒÎL•­–Q,;:Ã}îóßÌsçÎÄ—lvÏ—¹ÏË9ç7ÏùßóÌØ)Êä…£\£\£\Ò¿Ã q­q­q­…óU¦2•uK™”I™ÀÈ2¯%•TRňóZ±_ø‹x"~t>ya4™¯‚*¨Bn‰^;MmU[ÕÖ–~i«´UÚj€Xp¾ønñÝâ»@ÉÃ’‡%{Ž=Çž‹u±_ø‹x"¾È÷z’ÿ=žô•<(ʃÞLqBÉŽdG²ƒ}ÜÐÙÐÙÐÉßò?õ?õ? @‚†0„!^xáŒqx]ìþ"žˆoÒW¯ç£”·å^¹WîõþCȹšs5窶À=ìvðñY|ŸíbÙA€Í•†JVÜܰÙÁâ`1Àv…â¾Ä´Ä´Ä4ÔöööŽl°ÁÀJTâ%–žžž%“J&™çùi~¦–L-€§|8Å\–Ãr#~8ŸÈ/xŸÝ·bÿŠý+öG¾s37sðÁð£ü¨ÄWè+y@€/¿ûò;øáøÇàìg€þöþve†2N8ÍaЇ>ÀÈÎ/x_ßÛ»íÝönc#cù,Ÿå›ÁôÛúmóøçã?%[É€¸ª¸*§ÈSÌ%wù»ËÀ³Â³"êÄÓy:€A b`»Ùn¶;’ß>Ç>Ç>ÇèÛßËᇳ½½½äÊA9(“¢lR6)›´žÖÓz"¤[tËÜÊx.Ï%"Ò¯ë׉ˆ–å/Ë'"øhà#"¢{¶{6"¢¾M}›ˆˆ>Ÿüùd“{ˆ7ñ&"ºG7è‘Ü&·Ém#Åçõy}^r >’‹ä"¹h¸O\uÇ*ŽU«0I žÅ³xà‡ùaóËðhõ£Õæ“;Yq²/±÷ßK€ycæ"»±`gØ"¶(’ïrÝåºËuÆIþUÊ2¤Œá>Ræ*s•¹;kÄ[f›h›h›È&yVzVzVF¤Ïé—ôKæÊ‰‡´¶´6˜ÿÙüÏ ` ØàÎŽ;;@½¢^Ç/Ž_ÂnËXK3¢ mgÚδºq(c•±ÊØ#¿SÂâ„Å ‹‰Ô+êõJs¯Ñðíö;Ûf(Ô©oÓ·!—¾OßgJˆ®“]'À²†Ì',>L[0 €ÿQö£l@tfýKd‰‘¯ë¸å¸å¸¥ À ÊeÃU#ãÑ>жä¯-– K†÷ïÂÁ¹Ë¹Ë¹‹ÅÑþ¤¥kéà÷s?Lü·u¿­€ÆÔÆT8w>@ðÅŽ;"…`eÚm-òRN žòŸòc™q…ÖÈ5rÍ‹Biœ4N7£!Pù§q¥®•ÖJkóë¥f©YjZÑ7»:\®¸ ínc'Ø à•¼@àƒ—I*T€/Šj?þÞæÞoz¿lñ¶x[¼Vnœd•R¥T9 ´"*¢"5%šK¹”«VQ µP ‘âS|Šïã6ãj­O©O©×¬žO=Ÿx>1k—;¸ø~gØv†àâ¿ò_¾Š—óòÈ«¸ææš›kn²mÆ 4¤©C®=I[’¶$m!’ ä¹@:¦+˜cŸ«”ûÊ}å¾ÔžZ™Z™ZIdqX‡k¡Ý܂܂Ü(í:u'‚pÁ€gx†g¦ROeSÙÔÈùšwhÞ¡y|‘q—[-V‹µ÷Eø×R|t¥¥ 1¥')fx-zœ?¢]Ï™WjתY5kH¬?ÖG´Øƒô®Ñ=£{F÷ðbC“ r‚œ°úo1Rü:†o½~B9£Ýâ7iWëÐ:´ŽHÛyžô<éy0s`æÀÌ6ÅÐâiå´rú`–ZXz±€ 7Xdƒð*íÖ¥Ô¥ÔiVO³§ÙÓ ˆ ‚¤Îvg»³=ÒvÔzµ^­ï ÿ%}=&oxžÞz`¬ ‡Õaíž{•vó–ç-Ï[Ñ®+Ë•åʉ‘unTB*•J¥ÒüÑiäg1y%ú/íMÚ]¨Ô(5Jw¶.­.­.­æf…f…f…´ÛF©}ŠOñ9“©‘©‘ÂmGñÄäEÿ£ÅjwOô8ïž´NZ'­h -¡%úty¼<^H$‘D—®Ù¶€-@¤t)]J—t1ì¸*¦rÿ7³O‹i1-VŠ^þ´Læ2—9 ].Hþ5ad~²+¦2o,õ^/±k)w‹(IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-60.png 644 233 144 2532 14774263775 14702 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mH•gǯsœž#Ng”M“6´ ì…5¥IadÑ Ù¢TÑ`R,zY1éƒûâ„\/†Ë(ËÂb”4m´"µØ@¦çíͬŽçyîû·ç<ç9µ¾vy¸Þþÿÿýò\÷- ""ñ¯€3Ç™ãôÆlç6Ûï^æ^öÉO1»ÁÇÇš?ö¤úIõ™'3Oªû¶mÅ­üäz?™ÏòK†Ø×Y×YGqÜ>ëæ®›ëþ0f×Þ€ôÖôÖ1¶·mo8ßt¾‰/aðæàM€'ÅOŠÁ¶­¸•oÕ[xÉørð?ü"z)õ’ãOp¥¹ÒD ·$·ä㱄þ¡lEÙ €”í3 xðèb`”Q¬1œd[ñx¾UoáYøŸÅÓ#à+ò‰Àê «7¤7Æ îŸ‚êìêlÀˆ¶ 4àá´qÔ8 úWc†1ƒßé]@yÀz£Þúwc¶1›mÆ)ãõÔãÁ´ðâø >‹?¦Gþ½·ßkÝkÝ@ Ú æ€9|c>4UTŸêC[K¤¿ÕôÐ{õ^½ô4=UOM¬ :EÏÑsÐT˜·Ì[DÁ2‡’ñã| ~I4«ÒÓG?€^³×"”ò·Zª–òÒ"2>2|†Â;Ã;Ã;a|l|l|ÌéôFza$w$w$ô\¯óí8CªD•ð2>µÒ_‚?¦'.¬á¨ÜW¹ÏªVŸÑdÔõÀ§”Rj¯P /Ðèƒ Ñ Ñ QX²yÉæ%›áéò§ËŸ.‡Ê;•w*ï€{{{”_+¿V~-IØÏÜç>šŒ£&‰/ÁÓöÛ×púÙég‰ ت\ãgÆÏÄ× ¸R{¥öJ-dwdwdw@ÏÕž«=Wa———vûwûwûaþóùÏç?‡Áà`p0y‡óç†vÚiOÒ§d¼y¼ÙÂ×[mþ˜§ˆ·ÓÛY°@¤hiÑÒøþŠ£‘ÏÛœÛÄey†/^,ê u†:EVWWEÂ;Â;Â;D2/g^μ,âõ{ý^¿HÖ”¬)YSDr&çLΙ,òh⣉&JbPìÜîÜná;mþ˜§HJYJ³ER/¤^HÔˆ!¹’k½:þêø«ã"Ó ¦L "{÷<îiÒMºI‹xª÷z÷z÷zÛ/R(…I| þ˜§ˆº¨.:ŒU‰DŸ£ÖQ騴q gÎ,œ)2äòyENtè:Ñ%ò`ÖƒYf‰:‘þ`°?(²ÿîþ»ûºCÝ¡n‘¢º¢º¢:ÏÙã8ç8góÙüq=o;cüe2Ñ_é ]aŸæŠæŠæ X0²`dÁ4V7V7VÛñ–¬–¬–,XtoѽE÷ ýEû‹öI‡+ƒ4Ò€~sŸ¹ïígìíåk#d„ìvÄ ¦1 8ÂŽ$Eˆ}]_××6ÚhKŠãÇ€¹ä“Ÿ„÷Úáwþ•oèc*Þg´*WåvS^åR.0«Ì*³ Ô<5OÍns›Û  T*s¡¹Ð\ªE5©¦ *ÀËþÿ÷±7t~¿ËìP[ÕÖX¿ŽÍ8q'j»Ë%ÙãŒ1–äCmQ[ˆÚxïìüï¸+c­@ 5xÀ5FÌMæ&" oè8p€m[q+ߪ·ðÞyW¾·¯‹÷ö=ö~¾`ÿnàÇeµ4ÐöIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-31.9.png 644 233 144 3105 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜúIDATHÇÍ–íO›çÆM Q$K *©Ò}èBŠ1‰vcMJ¶ŠàÈ$%‰)°‚–8¤ É´v›Ôjó'¨k6È"h¦B»²ò–BH³Z U:_ ¼”tƒP)Æöbaûyùíƒý`oìÈýåÑu^®sÝ÷­çœ[@DD¶F¿æsŽ9-‚Í?Ù“$ø~G7«`:d:tÿ7þ^ú{mmÚd ~#>>_$Æ_ϰËV‰’:“:Mû¢ø8’$?ù{\?Önk÷c^ï}½ ëJ×N÷_|û€gŸgİá7â|ƒ/ž_ÞùŸú"`é·ô›¾¤Ä¤Dxö•g_yîL$`ö98øêÁWt3¨+@*©ú>Àc=ŠÃ†?oä|¿QϨÑ#°ý¥í/‰ð§²µ²5kk$aòšê.Õ]ý6@¸›6.s™TPV”õ¬z– ?ÖÐÚõ½@×Ç Z¡VÅ£x€?p‰K¤êÿˆòõÖ Ö '?àoö{‚µÕÐ#ÿ}· Å<íØãØúÂÃÀC‚¾SR§cdž ]_ÿHÿôqý¾~âÎl…•8œ¡¯ê«èz¦êWý„Õ‚Qþ#Ž3Ž3†À†â¸«ùAŸ[Û­íþ-0›3›áßð³•ýKW–®P\JŸÒǦõØûØûØ áááqŽhˆÁÐ\89œ >[Þ¹¼“€6á‡׌ ˜³[‡ý[ =¢›DDšoÁ)õ” k¿e•UmÏO _Ì{12~•q1ã"ºã¢ã]Ç»°îY÷¬{À»Ã»Ã» ' ' '`À9àpnîóùÆ D„„ åï)“)“è¿.¯-¯f´=Ps£æÑcÖŠED~Ø'r0p0 ÒçºúðêC“M™P\ŠKBsïϽ5÷–˜FšFZFZDnºoºoºEk‡µÃšÈ¼;ywòD, –Ë‚lZíÞvo»WÄwÜ_é¯ r¹búªv*g*GBýüFõj“MÄ>dQÿÕƒ7­7­WïäТkÑÛ©¿ÕWå«‚¢š¢ê¢jÈìÎìÎì†å¬å¬å¬XÜÞ®½]{» '¿'¿'ó‰õ,õ,õ,ÁîÓ»Oï> uç:ÎAúbÚ'iŸÀq¹îr@0+˜Š–âNqëfþbZ3­‘'ÝO½üÔË"÷ÕéSÓ§ä»{{Ù÷²EúþÕ7ß7/’íÈvd;D®Õ_«¿V;³Ýl7ÛE$Wr%7fgAEJKKENØNØNØDúÏö¿Ñÿ†ˆùs‚9AÄzÂzËzK¾±ä[òELÖ„×^#Ϭ÷¨'Õ“¦ ˧–OEF:º8º(Û­»{ì®Èí»·Gnˆxª€ İá7â|ƒÏà7êõ7fåûºxbßcOæ ö?¿Ðß>€ŽA‚IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-13.png 644 233 144 2447 14774263775 14705 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÜIDATHÇÍ–]HUYÇ×õŒÞ+HvË™°é’¡ˆÂJhDq¬0²š¢¢ŒH”ˆ) '|šab&˜”´"F¢ÍA¡‰ô2\{pF­æaªûàÇÕœ{Ñ{Ï>û7çž{nCóØz9¬µ÷úÿÿ{í}ÖÞ""²0ñH[ž¶`”F@ŸÔ'õIP¹*WåBAzAzA:tVwVwV»iÓç¦ÏMŸƒ¢º¢º¢:X4¶hlь߿5~+åì]±j¬š¾$¿­'MĨ0*øJ$½;½[›”,Y'ëDäO‘i–fi1BFȉyFž‘'â‹ú¢¾¨ÈËÛ/o¿¼-2l [ÖH÷h÷h÷¨HnCnCnƒHO¬'ÖKâ‹~¡½Ú›Â—ä·õ¤‰X÷¬{žs—¹+91Gçò\DL‰ILij³³Âž+Ÿ+Ÿ+É8q:ã´H°8X,9Ô¨ÿP¿È@p 8 ŸŸŸÉd²n¾|+kem _’?¡çg uM]cž}ô;ÙÉN·ðõþz½AcÐpã“““P°¸`qÁbh›n›n›NÙ±ë´Ò ü¦Žª£ï=cïø+1gM·£k`ÞýÞb=ôÐh´Ý6ÆcÀ/œç| ž2Ãføƒå{ú˜¶*­J¢Xoê°*­J«ðâÅ <á O@ÕªZU ªI5©&°>·r¬ —W¼°NY§ˆÚ7ÀûØ[:¿Ý. Ô€uÌ:F<¹âaÂ@œ±Å…æxÍëÔŠ;ùžƒÿÎÎÿ?ïJh¢‰,w‹Õau˜yÐô#n‚Ãïðÿð7x¶ãÙ€ç>{î3uÓ¶-ÜZŸ/bógëY~ÉÛ±üÜòsŽíiû#xsÓ››r Rö߇ÀÝçî›7`ï—{¿øâÔ§ø D¿‰~0³}f;ض…[ë­x‹/›_>ú?}X6°lÀq–?³ü(~½øõS î¼U;«vLæLæh'˜<òôv NëùO–máéõV¼Ågñ[z–~*5åkÊEÀ÷–ï-÷§©€›g0šŸo~ÞÒKöñ'Þã=ò8e\2.˜­f+ þ¥ƒ:ú†º¡nÿÖè̳…gŒ3ÆÐaÞæmò8”æ#ÍŸLëeôSùØ[©DDŽV@@’I(¬÷­F+èŸÌïÍïI¦M= ¢*ª¢™Š¡Kt‰.}_ß×÷Aý¨ÆÕ8¸À’ºV}§¾Ü)~ €YK_²›mã?ÁýÐý0î‚È“Èà• ¿Õß²0?½°ba${’ÝÉn;‘Ätb:1 Ó…Ó…Ó… WëÕzµNÃi8áñ¾Çûïƒä¦„/ác! Wr5òqäcwÜ»¬|Ò‰æAhoh¯E§6ë²äæäf˜ùÇÌç3Ÿ£½%Þ"o\ô_ô_ôÛÂuªNÕ)pïpïpï€`, Æl¼¶³¶³¶V&VÆWÆ¡¬µ¬£¬;ùèØ£cYzïÔ½SgõÞñagªn¯^Š×_L—Q/ÿ·o±v±V–*U†+Ãâ½;:5:%Rp¾à|Áy‘¡±¡±¡1‘k®k®k.‘»‹wï.ŠD¼oÄ+Òx¤ñHã‘ëm×Û®·‰„G‘ØÛÇÏ…·FoÊ’¥Çò`YÐÒõ‚Àª¯W}­Ïñ$úRô%àfºWþª^Q¯€¹Î,4 ÁSã©ñÔÀH`$0€žÎžÎžN(ÛP¶¡lƒ]¡Ý»vÀÖü­ù[óa]l]l] ŠN(:»ÞÝÚ‚ø¹Š¹ ;×/¥¿”‚•S$§*§Š?JÞ²«Ë®ŠÈ""2-Çä’\ɉæ<Èy âªwÕ»êE¤TJ¥TÄuØuØuXÄð>Ã'™Gµ«vÕ.¢Ö«õj½ˆ§ÚSí©™l˜l˜l‰ý»»%Òµ³ëý®÷3aÓª*‡D¬|œ"ª_õ;~Œ*£JD’""²Æ±^–¬B‹ˆ˜{Ì=æ‘YϬgÖ#R~¶ülùY‘{÷ï5Š<8xpPd<:Š4ù›üM~‘;íwÚï´‹t]îºÜuYdêöTd*"R\Tœ(Ndè×H·1kÌŠØù "2ö!ôÎöÎa]ÏŸ__IX•ÞïÛïÛïƒÑÁÑÁÑA{zjzjzj`Ûü¶ùmóÐßÐßÐß`ãÝ-Ý-Ý-°ebËÄ– 8¹â¤œL#|šÖ ÷ôXÍ?ö¡}* °O qÞèšsÌeõD9å”§9Íé,ÿ0à ƒök¿öW¸Â•,ü&sÌ¡9`4MYzf¨-ÔfŸÊì9uGã.t$IÊšcªY5³ êÔQutLGuÖ@UkÕZµL¯é5½ zU¯êÍÂó•[¹Á ™f¨Òä'ÉOXà+‹ÿvÞí<ÀpO¸'~3ǬA{´¹\{òƒ6ÃÀ¼ªVÕ$Ó³_Fú[K,±”e“Y›ò-ªUCÌs$›ßÒûÍäÿ%ÍEÍE‚>à‡È³·Ø šA ‡ôP¦g°m Ï´D:Þâ³ø÷_ùÔÞ.žÚûØÓyƒýAÜâOì§IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-39.png 644 233 144 2524 14774263775 14711 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–[LWÇ?‘‹D색Æ)A…,&&¢Q°TAM\‚‹RõAŒÕªicñL5›†(IÔÔR£ñÂzKhB­/5‰ ‰JŒ‘¶ºEvwÎ9¿>ìÎζÑòêy™ùnÿÿ¾9óÍ‘ôÈUÀ5Ë5Ë55l»>süIË“–gÿ¶[Ä­[ûèkHkIk˜Ö>­]÷9¶·ócëEüX>Û/éâ8/%^Š+‰Ø‡ znõܤÂvs$_M¾ú·›¯o¾påÜ•slƒÁ{ƒ÷^—¼.Ƕãv¾]oãÅâË¡ÿð‹@ÂÍ„›q89q²Ì.›]–µ=œð, *WV®xÿ"Þ¸@ ©¤š`„ì勱íx$ß®·ñl|›Ïæë˜¾túRXS³¦&¹-\Ð÷ìž¹{&`„®­´’Êqk¿µÌïV®•K€ïM© ›là[³Ö¬óÀÊ·ò pÅ:k …RQ6^?Êgó‡õÈ¿ßíñO`]Òº$à-@è7PoÕ[ MíT; ™Oͳc·È”›fñ˜E¦ØG;ˆ‰7sÌ •ªSuåS> hãGø¢ü+èãï y0ypdèÝz»Þ#ÔÒëõzÆ"7Ñ{ÇäÇžÌꮺ  7éM„"€†qÞð&rÛAƒFFñ¢7ê„<ÿ½“‚eà*p„#¤:¯XÕªZ`zLqÄcÛñè–ˆÔÛxþ+?ØÓÅ{û0O°ÿV}Å0IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-11.0.png 644 233 144 2745 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜšIDATHÇÍ–LÔeÇ?_¸ã8G—1`Í4œ®Ý\ðÇ%\¹Á–«Ì¡MÇpŠ-¬Ý,¬5NW›¶ØjüQÁ2§Á\$ËH(«‘,`Ñ&•”NÀQcCŒÇ1ï¾÷ý>¯þ¸ûò½¼Öß>ÿÜÞÏçó¼ßïï=Ïóù<""²4ñ+¶"mEš'ŽÓ^°ç3ŸÌ|rõ±8>b€ö¬öìoûáîïþàž–{ZÌ+6¶âV~òz›?YÏš—¥bO¸¾t}©•%pT¬©X“™Çïžw‡»#ƒ;_ìh?Ú~”—aâÂÄ€é²é2°±·ò­õ_2¿Ôݦ/ÎSÎSÚàÊpeˆ@þúüõ«öÄFVAù3åÏŒ§§«40nYd©2 DkL%a+žÈ·Ö[|¿¥géÇý䔿”ŠÀæÊÍ•îft‘+­\\è´òï±éØ4€ñªñ*Ö™˜Ÿ«cê€ú]ýDŒJ£’Èb~ó1Yê§ß©Úïj¿³ ^iå«ÍŽÍw³åGþ½·ï=[æ·ÌƒÚ ÷©!^çuuB@f™E©}ê€:jX ©!ì1Ãßü„÷° (sÂøÁø¸Îu0#q~^Ùòö–·-ƒï=‘´•""}î;rðÓPÃPÃ"í†ðÌ|ö|6 ú¨>ª’2³áÙð,¤Äs˜Ã6Œ.>} nÞ?ùÆä,(oœ†ƒÃA`ÂÝïî9ˆÄý—DDŽœƒÀ›7A­0 §ß¿ñÖ·Àô7úQݯtº¶ÐTëTëT+øü þè®é®é®±ã†nè†nã]»Æv»ÍÝáî@í8¿Í¹ÍiEÍB¾äòÇâ~D]¨…ã#ÇG ü €ª.~Í—íËŽûÞªÞªÞ*[ÈWî+÷•Û¡gSϦžM©ÿhWKWKW x ¼Þ˜\;¹fr çžçIŠÌ1Kc–Æ$†í˜JË__òû†í3:ضڶÞ=/¶¼ØÜšÜjÜ·l3næG¯±ð£ùL¿$‰åpv8;lë#vlÏÞž¿8lŸ¸ ®.W—/û¯ì¿ðå_~Á{0>8>0µ~j=X¶7óÍõ&^4¾Ô=Ã/±½±½¶GàŒsƉ@FqFqfu8Á“ omyk À˜}Ì®b@÷ $¨õÀ,³˜c"Ê6ã‘|s½‰gâ›|&XÀ¢ÂE…"P¶³l§ës4‘ûmpø•ïùZç©£ŽÐºø$ô$ô„ ºaœ0N­ê¼: n«Ûú~}?AÚBm¡6P÷9ÂÔDOý§ö¥Ú—€J“¯ìZÙ5×ç°8eqе§‘ùÓ"(Ÿ+ŸU  ]Sw¨¡@ý¢~Aî|ʇRT¥ªt¡R¨T•ªR"Š(²ü DŸñJªÔ®Áöþíýf?-ŠÚJ‘¬SàšuÍÎ:øqôäèÉØÍ¾é¹”¹üZ«ÖªµZ|Úm‡¶¼¼¼ Ôj5ð›ñtÓÓ7Ÿ¾ Þ+Þ€7ÍOŠŸãŸú)¸,¸ŒÍS£7Fo¸t—>ëPŸ„õÿ9ㆪ«>õ#gªÑû‘÷#XóþšÆ5¨þåýéýé ”RJÁÚk7®ÝÉ-É-É-PÞ\Þ\Þ óUóUóU–°ÞáÞáÞaHÚ™´5i+dý-ëtÖiTl‡íœí´,o;ÕvÊÈ#‡-5¬GÔO""#µÐîi÷€ï6€z7ÿý¼”¼‚f]GVŒ¬Y—s/ç^Î…Õ«'VOÀ”Ê?å‡ô%éKÒ—€ûûû%ÌwÁwÁw|¾߸·¹·¸·@ÆÒ—¿{ù;‚ceþ †z:;;;ÁPa=ÂlbObêàÁø ã/€z/rŽÒ´ŸµŸ!/6ϑ瀮ʮʮJ‹pº~º~ºÖU¯«^W )Ó)Ó)Óà-ñ–xK¬¼ÐõÐõÐuËÞûï½w÷Þ…¿ÿådîÉ\˯kc¯½ø}â÷ª#F~gßcßÃkr/öãØE¤YDD&íã±±"öåöL{¦H¼?ÞïyÜù¸óq§ÈãŽqÇéöt{º="iÒ¤éÛÕ·«o—, G¾#ß‘/rëÑ­G·‰ þcðôài‘}iû ö,¤MÚÓÃÎa Ø‹íż#ÝF·ížhÚ&m“ˆm™ˆˆ,2W666‰ÄÕÄÕÄÕˆÜ,¼Yx³Pd·{·{·[ÄéÎtgŠÌ4Î4Î4ŠÄdÅdÅd‰œ}xöáÙ‡–ÀöãíÇÛ‹ä¬Èy5çU‘¤¿&7%7‰ç"|õ7ô7DÄe|k|k»9•#µ\¿ôõ¥¯?…ÿ1ó°M>ê<ê„!û}Èn•¾n²n²nVůŠ_===0U0U0U¥žRO©|¾ _Ôg×g×gCOoOGO‡ÕLŒË¾Ð¥ÉK“fÛ©;ㆪª>0ó͆¬Ž®" úè£P(TT_xÀM4Ñå×ÐТìaÆG1 Fñ©ªcUÇLagÜVS®_]¿Î:0FµQ h³ñgííü8É%¸ÅC ÔêA¯Óëô:0V+•@T€gÄqÀüÀ` #joh 4€ßÄÇ7:3:àwÏ:L=ÿ§ó¿í|ÛÕ™}úWúW€f¼c¼³ðí ©`€yæ£*¢ÐÑÿâÅå3¶ÛÐêú@tç7ù~ÓùŸ¹+yæ® t 4`m±¾GßCÔUu6°l3¾ðKDÖ›x&þÂ]áëyž_Ïí{ìù|Áþ¦|SÙ¯IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-13.8.png 644 233 144 3141 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýO”WÇ< 3åEV|¥’l–Ôlu­A¥[D*ZL5ÒþPc!Õ`hl4MÖʘŚí®$[ÒìÚ¬±ƒT£Ø¤1Ð6Åì ­Æí¶””:à8#Ã3Ïs?ûÃÌ33ÛÝ?Àç—É9÷Üï÷Ì9÷~Ï‘ŒÈ¯@âÒÄ¥‰ ÂvâÞ˜ßö”í©Gþ¶ß2 a{Âö›¿ƒôŽô€Ì®Ì.óV̶֭øøý"1üx>Ë/s¤œK9—°!b;àÙGŸ}Ôö‹°}rìN»Ó‚/¼xàÃ÷?|Ÿý0ñùÄçÞ Þ ³­u+ÞÚoáÅã‹ãgü"|)ùR¿ e^Ê<Xþäò' šÂ®غeë€ïµï5•†H#Mm|ø°>Oœm­Gâ­ýž…oñYüá|²+²+D`Û®m»ìï¡‹ˆÜú^YòÊàqÝÉi8H#ÉHN„~ ýHPýջϗÄõ;oÜy# [퟾Ÿu?‹€Þ¥wé]1>}§¾Sß îMîMîMj µ†Zãj¡…–˜978÷ÓÜO0¹u¢w¢—@èWa|pi. ´wÛ»}IV>Â?EDÞ‚Æ×_õkó1o»»ÅÝk^^Ó¾¦uuåÕ¼«y ”RJÁºªuUëª ³#³#³êNÕª;ÁŽ`G°#–7Õ›êM…_§Æ¹+sŸÈ}µmuÍŠšð`}˜^zó¥7A ç#ê+‘‘ƒÐãêqÿïjÏã/—e•e´ê:R8R8R}%}%}%Pî)÷”{Àð¼ÈËÉËÉËkm×Ú®µÅsžpžpž€U}«úVõÁès£ÏŒ>üaEñŠb‚Wö__{}­Ú—.\ºF^8Á·à£©sÜžHHµ?rëßêßBYrYRY8÷:÷:÷ƧM›>ë›Ö7­o‚¬é¬é¬i˜Ì˜Ì˜ÌˆÅ¹«ÝÕîj(ª*ª*ª‚ô–ô£éG¡d{qNqLú§Õ´p¹Ç@µÍ¯™_£Î%Ê|­^«§HÆ’_O~]DN‰ˆÈ”6‘¼çw¾}úwHAAAAAܰØô‹&†»ËÝåîÒÖ‚ê‚ê‚jº\¥UiUÚM«©;u§îŸþ•÷á}xŸð}æ&s“¹‰~‚*T¡Šä!A0‚ŒØ‡}ØG?§ˆSÄ)${Ä=âõVÑÝ?* ½ ½ ½Ûïí.Ú]´›hx?Þ÷#‰‹B·ËYŒF4¢™ ‚JP *¡Ûb´-F¯uªfU³ªùÂ}‹Æ¢±hÚnšÖšÖšÖ†¿//•—ÊKq%|cøÆð$/B!Šë<Öy¬ó÷Ž÷ŽþŽñ½%}{Ñ}¢à]yWÞõ|¯1Õ˜jLÝXXXÁ'eÇgÇgÇsWЉNtÂl°Á›° ›ð¼™a†€bˆ8ÃÎ}JŸÒ§1ô<=OÏø¿àÈ)rŠœ‚˹Ëç.Ÿ»Ì'æŽæŽærWäòFycu7ÃÍp3 gø9~ŽŸK\gùÆòå›Ýažižiži4 ­(­(­ˆsxÄÀWóÕ|5\Ìï›ß7¿X‹`Ë-Ë-Ë-ÀºÂºÂº€7¼á `³˜ „JÀìjv5»¶—m/Û^È=r܃‹C?­&­&­†»àˆïàqðq4ˆÑ R­r«Ü*âŽÇ;Žnnnp² ÉÆ¯Ž_¿ T¿]ývõÛ»™ÝÌnø/ø/ø/1S1rÓsÓsÓº™n¦›ê«¬þÐnÐnÐnœÖ:­uZ $Å'Å'ÅaCàâVëVëV SÜú¸õqë±±þTý©úS€H!Rˆ¥2|Àüë~÷§îOÝŸâ“ÐØÐØÐXRŽ#8‚#K 0¾e|ËøàææìØ;±wȊΊΊÒ2Ò2Ò2€eŸ/û|Ùç@]~]~]>`øÕð«áWàà»ß=ø.ðêÑW¾zh m m L©¦TSê’œBÊBÊBÊH¹ƒÇÁǘ§ÍÓæiü§o±o±o1ò¤G¥G¥Ga²/çPxpèÁ¡‡i¿´_Ú<9ûä쓳À\ï\ï\/t#èFÐç–õœóœóœ¶ŒnÝ2 ,?¾üøòã€R«Ô*µ7ËÍr³À|ò|ò|òÒ0N& “…Áäàqðq88A‚˜KÌ%æÒÒ1nàþOàg™Ï2ŸeÀxH<$îÅß‹¿\ûòÚ—×¾r¼r¼r¼€m·=Þö0ϘgÌ3@•¥ÊReF=F=F=€°¼°¼°<ÀsÀsÀs Q4ŠFä&¹InB̼üü ¨ AëÃú°>´Îiˆ4D’P~¿‹ß…W¸'Üî ¨“$Êå‰r@èz…^à¥ø—â_ŠtºF]#P\Z\Z\ ùùù/yä9FŽ333À 3/̼0Ü^w{Ýíu€æªæªæ*°üæò›Ëo.Åc}Æ>cÆ™$&‰I¢uŒ¤XR,)æKƽǽǽi]ÿžþ=ý{t ˜·n·n·nž¦>M}š ¸ ®‚«ð<Ó²VY«¬h%Z‰˜­œ­œ­.¹]r»äLLLk«×V¯­’´IÚ$-`J6%›’»Awƒî-ÉÍ«#Õ‘êH@ýPýPý§$ã’qÉ8_ iH+¬â ¸®€äµ»¶»¶»Úüu½º^]/d¢:Q¨†¶–¶–¶ jGÕŽªÀDÕDÕDð½þ{ý÷z€#á|&øLð@»C»C»¸ìwÙï² Ö«õj=й¥sKç€}À>`¾'}Oúž„Ù1ï–‹-[. ÑDMÔD/ˆØˆíœ›iÌ4f»;T ª•rŸá=Ã{†÷^ýw­R«Ô*mG•áÊp%³-ðYà³Àg0OOOƒëœêœêœL*“ʤ’_I~%ù`å¡•‡VüBýBýBá­Ã[‡·]«»Vw­tÎ:g3²3egÊNPå~å~å~p ëÖ7¬LÃQÃQÃQÌAI‚$A’ðK†µÇÚcíÙžHòä?È =èùÓY‘V¤i»¥smsmsm+³n%ÜJ¸Eã'''H§Ð-t Ý ÖŸ¬?Yá$œ„“l›ÃæABô¡}­¡5´°|gùÎòÝó~\ ÃÅÀ477‡í5}5}5}h‘ŽIǤc oP–²” ߎ`#xèo SÅT1UìÏÌiæ4súá!aLƲ,²vY»¬èÊèÊèÊ ÿ2è;è;è‹Z&†‰ab0ïdr29™6M`:I'é$€A b€RHRJJI) 6‰MbÓ ÁpÝpÝp²+eWÊ®”ñþ¢qѸh z¢'úc‰"Q$jèo(A J8…½Ì³E,ÖÜG‹Â9LÇÄå6a/öb/óYszszs:@¯Ò«ô*ÈH>É'ù0Ð;ô½Q`¯σ¸LY¦,SÚ5Qš(M;*Y#Y#YS²~ñ£É½!” åB9wÖ¾²‡+VTTTTTƒ#£°?XòÝ»GìÞ=k÷î7KÞÍF6²™Ïš­ÍÖf+@_©¯ÔWBÆ0 Ã0˜qd¢}¾}¾}^0M–O–O–³£’c’c’cw®˜šš;3úæè›£ov@Ç~êtð-þØÑAføÑîÝþ?ïúè|t>œþ낯 ¾.°A ×AAAüW×Ï]?wýLvɆeòa@ðüÿ¿ws™\&—9ÿ瀈€ˆ€fÚo‹ãõ[.¿ÓbcccccÁÛo©u¢Nä f•f•f¾\¬®nòâq€8àíÏ'>>=05œ1œ1œ,"À®ç(,çÿˆã¼šÿÖÂ+}IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-133.png 644 233 144 3035 14774263775 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÒIDATHÇÍ–mL”WÇ o“ À„M«µTºÑ6Á&Ðh¢fŒŠY- šØ*Э/k·„L›­дÆnÙ¶L7 ¾¬Æ•6Í$HÒ„ZáîBq?˜´t,0vt2Ìórûaæ™™]ÓïÞ/OÎ=çüÿÿ<çÜs¯€ˆˆdG¿ÉÏ&?›¼ÍÍÞà 2¹ {t€á2\,ñÚ£ö€ºi~g~üMíWûŒ··YâýŒ~Ô·¼Ê«dò÷(Q|=Êã艗Òùp'ÔHĪVÝ¥»@MÆZÔ¡°©  ‚*U¥ª4öÇP»ÕnµTµªVÕ þ¨N¨(ÀM=eV˜€3‚5¹5¹ÀC‹_›íÅÁþ³ýç@ Ì<œyŒPꦺIðуà²à2кµÏ´ÏâB´Z­V«…ùó;æw€^¢—è% þJ­R«„ùó;çw‚~:Üî!u—36Ó9Ó `ØKOTعî5767ZpæzµM[¯­ÿ_üŸû?GmþÓæÃ›Ã`þ`þ`>(¥”R°e×–][vA¶+Û•í‚Ú²Ú²Ú2˜;:wtî(8‡œCÎ!Ⱦ“};û6TRÝW݇ ÷//Åù¨lšhš°zïÜHTØø[ô®ê]+Èk|¿|ôËG,mjÝtdÓ‘øÙ_3¾f| ôööÂÆ… `¡i¡i¡ ÖÝ_wÝ}8è=è=è…ÒÒÒð5ø| °ò©•ËV.ƒ‘¡ëû¯ïgÉâ3;.·\n±„¿%°üúòëê ½/x_¦¢¡GÌ"³ŒÆÓÆÓ°!uCê†TprrŠ—j±}±}±¶5nkÜÖ޵޵޵à+ðø t-t-t ¶:¶:¶:À1í˜rLÁü?çÞœ{3¡7/Ï~?û=Xz’El¶ $3õëÔ¯Eä_""â“OÄ#›×vÏvOÄ–oË·å‹d3‚A‘Ù«³Wg¯ŠL𓿤)ÒßÙßÙß)²ºhuÑê"‘³ûÎî;»Oä®y×¼kЏ݃îA‘'V¼·â=OØ“çÉkù”?å|ÊyKO²ˆù¥ùeÒ¿½B¯MDDr“ò$,áX¢„ÊCå¡r‘´ãiÇÓŽ‹ÜrÞrÞrŠìÙ;²wDdøâðÅá‹"áP8‰ÌÔÏÔÏÔ‹Ôª;UwJäFÞ¼y"þ?ø_÷¿.’5šu>ë| >W~¯wëÝ"q=VÑû ÷0©9¿ÓõE« 5§5§5Ælc¶1[¼m¾6_›ЇЇЇ «§«§«'îïèè€âÉâÉâIèZìú©ë'5¥¦XâR”o¸÷‹Þ/þ§Ç¢§’æw›ßM8%è=>Ѱ— xðà •°?Í4ÓÀp€Ç×4(þªwè |Fó;Íï£Ì•šKsdп“y'Ðí?ØxlŽYƒöÃP“Q“Ÿü`Œ£À#óeóe´èìW€Ž( DˆPÔùƒ‘XÝ ™õf=Z /†oñ=6ù室eUKl®inà4§ÉŒ—Øh0X5¬†H" â¶åµD4ß³ðõ®|b_Oì{ìÉ|Áþp´Ë”Óø†IEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-down.png 644 233 144 310 12610450011 16070 0‰PNG  IHDR Vu\çsRGB®ÎébKGDÿÿÿ ½§“pIDAT(Ï­‘Á €0 E_ŠwgîÙ œBp'ÝAâ¥Ø6¢` $ПÿÒ>†Ô¬oõ©ÛƒèÊM£ªF OÕœÓJ7ªåˆÜG€}@ÈÝ–¬@D´¡‹»ëí[òð<ÁS¼»¦`3 0óG\ÆW7;ƒ½©íIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-1.3.png 644 233 144 2527 14774263775 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–_H”iÆÏèø/dÌj׬4Pc$ TZMÊ‚bµpBÖ‹ÚŠhöjMжØ.*¢¬]½ˆ £h· ·4­„•$ÒŠˆiÝQ·h[lšÝÅg¾?ïo/æûæ›Ím»íÜÌœóžó<ïyßó½""2ßúHÈIÈIðDý„/œxêÆÔù?Dýs¸¶º¶þü5d´f´d^̼húß^·óãëEüx>;.óÅ ¤´§´»*-ÿ(ÔÖ¦~õO݃´Ž´ŽivÝØuàú¥ë—Ø¡ÊP%8¾½nçÛõ6^<¾}‹_’n%Ýrý)É)É"°¼jyUÞ—Ñ„gyP½¹z3Àxâx¢J#¤“®*)¦°íÏ8ß^·òízÏÆ·ùlþ¨Ek­-Û¶lKk‹ø¯@ã²Æe€ uç9O:ŸêEzð½!†5¬†°Š¨ÄüÓúKý%aõX{¦=.r€¤G…jèK—ÚýWþ¨ùwoO¯Gy“½Éöh÷Á2†@5é£ú(šú7nTÜ âXd€Ú JTI,ªÔÇú€>€Æz]Óµ8üˆ×åuÙO¯k¥ˆHÁwH L¹aÌ3b€›xd®0W0c¦'§_O¿í…öB{'è,g9ë¸Ú í„v‚ë‚k‚k@?¦wé]Ê«¼ÌðÈÂñÙüQ=–°sý°çðžÃÀfèoô7 ÊÕvµj‡²3egÊÎÀmßmßmsl¢o¢o¢*VU¬ªX™­™­™­PÛR{ªöD:##Q`2ël>‹ßÒc ü ®N^–¨@'„§ÿžŸ‡’¦’¦’&§ñ½5½5½5s…]v_v_vCÙ²…e !4š ÍÀ’¬%YK² ¿¯ÿfÿÍXzØl°ù,~K€ç®ç®j‡@q xc•øÕu”OíSûÀÈ6²lXíYíYíÎÂÎÂÎBGPøaøaø¡ãOõNõNõB¹¯ÜWîƒ# FŒ@ðÇ`{°ÝÉSmö?‹ßÒ“ ’XXÍ'"I]I]"’.""ɰD$""-Ò*­"‰Ä@b@ÄísûÜ>Y)+e¥Ä,¥4¥4¥Td¸h¸h¸HäéèÓѧ£"]Ï»žw=É>’}$ûˆHO¤GëÑœ:õ»Ågó[zDÌn³Ûõ‹ˆ^£×ˆH´Y‹D¿øE\¹®WŽyyy"BI$9ñ¶¼¶¼¶<‘;ùwòïä‹447474‹ôÏëŸ×?O$´7´7´W$ã~Æ@Æ€S'µŸÍoë™sưz~ߨmì&Ìg¬‹ШíoØß°¿KKKavñìâÙÅP[[ ÁŠ`E°NvŸì>٠ůŠ_¿‚¶‰¶‰¶‰¸ÃxŨ2ªÓ÷Î3öÖ­$v+§tg¢+ L˜÷[=ô 7í`„!†€o¹Æ5.Ãÿ{+ÿcŽ)kΘf½YïÌ1ós³Î¬’I&ðãǦÇô˜ € Àh1ZŒ0¾1Á\jn07?™YfV oúXx,üÎ97ùñ¦zSã&3Æ€1`î4w¢Y·V¡3cÁ›˜À$“LÊò"À¬½ãæsšƒgãÛ|s&ÿ{¾•Q€àÇHwZlÔõ„AÝS÷páÇ·×cGª·ñlüw~+?Ø×Åûû0_°ÿ ÁDÅ™IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-71-grey.png 644 233 144 6103 14774263775 16011 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü øIDATXÃ…—P”ÕþÇßçyže?KÚDfeQˆt‘ë0@,±oBŽ‚£N`\cTF‹¹8"3–E)Õ&-MPˆ¸ ·ðrsjB”¹»‹ƒåDzÁÂîóãÜ?ØÇ;MçŸ3çœç|Îë|Îûó9ç!¹¹¹¹¹¹pÇl1ÏVLw—»ËÝ¥¹_æ~™û%}688xÃ2êA=¨Ç‰7 4ú=¶:[­ŽG9ÊQN²¡ƒ:=èA€=؃=ô¸wÿ—r2NÆÉøßÊò¼ó¼ó¼›ÿ]°³`gÁN2$ø ~‚‰å®;¸Ü™G€«±«™sR¾”/åK×íSö)ûÔüÐüúüúüúsýö!û}¨é†u¹u¹u¹þmõIõIõI4ècô1ú’½R¶R¶R„z†z†zζsÜù½s¾ÓÞ#ûŽõœë;yœ|œÃƒáÔ•ºRW)…¤’T’êw’õcýX¿kS•S•S•‹=½š¼š¼šÄC1=1=1= ÜÜÜE^‘g˳åÙ°â0ã0T°Â +€ÝØÝžÃsxV›ÍÇæƒWºÚºÚºÚ(ߢkѵè¤C£/¾4úRò‡*?•ŸÊoBLSÅÔõ'iM£iwS˜p’3“3“3  mhóyŠ«ã긺¶ vÞÎÛùÅ›üýý…Õ º]‚Ž;çëë ¨ ‚ ‚T#ÕH5àfçH@OâI<€X€11AÀF0Îìjv5»¢¯ú“êOª?Rú~èû¡ïîG¥‹ÒEùŸ¿ qBœ·nÖaÖ üNŽ]?výØu@pÜ·³¿Lm™Ú2µe犀Ó§N ¯¤E§E§Es hE+Za"\±°ÿ[(((€YWèD'0{”<á OCÂМ½Š«W+® ¯ôîëÝ×»kP_V_V_þ²ƒ›à&¸‰]zF˜&…ÉØP{­½Ö^»s…×F¯^©6јhL4rNXf>›ùlæ3¸ò»ø]ü.Àn±[ìÀ®·ëíz`F7£›Ñ|/ßË÷¸†k¸ ±ˆNà˜~súÍé7øÂ¾puÚO¬L¬L¬äÎy%z%z%R­“ÇÉÇQÕQÝ;[x5¯æÕ@¤:R©FŒû ÷î+àbË´eÚ2¡*)))))ÌZ³Ö¬XÖƒõ¸r®œ+h-­¥µÀZÍZÍZ °A·A·Aà>îã>ðý¦ï7}¿ ŒŒŒvåìÊÙ•ˆÄ⸺Ÿu?ë~Ö¨Q£6"¦úhõÑꣀÌGæ#óyg #h­ ýKºÇˆÇˆÇއ|òyÈç¤Ô±SùRùRùRൺ×ê^«’j“j“jdK²%Ù„……6j£6 ]ºt   Ê”=({\ ¹r5`´Œ–ÑÎ)…©ej™ÚGM—ç#Ÿ|>’”:yœ|œmÌ6fÃçËb—Å.‹E¶²]Ù®l‡•fÐ šyŸ¼OÞ´&­Ikpgp@4¢ ´´´kȲ†š74ohÞM¡¦PSL,œX8± á4œ†0Á€ýØýM¡)4œòœòœò¬¾k}×ú®EvÇXÇXÇN08†c8FtÌEæ"sñÑÎäøßà ( D^äEÀø7ÖÜXsc ðkί9¿æ1ñ1ñ1ñsžÒœÒœÒœ^=ñê‰WOóãçÇÏì»Ánx,øX°`t së3;˜Ì§q§‰Ža5¬†ÕЯ-a–0KLÂ[Â[Â[`I#i$ ØŠ­Ø °¡l( Ðïèwô; µ·µ·µX—´.i] Ü­Ü­Ü Ð`Lƒ(¡„ò1 t¤# ‹Éb²ø±þQŒb b P'þTÇTÇTLŒ?ãÏøÓ¯E¡¢PQ(›¼MÞ&oúõ­²[e·Ê!A˜ŸŸŸ™³kr5¹š\¾…oá[ý°~X?<7N,ÄB,ù˜|L>~¬Ÿ! a€'Óš”*¥J©0Ý·¹osßfÀ8h4â}…IaR˜„b‰HDb^9—Ëår¹$»Ù³Ù³ÙSô7¿`~ÁüTl)[Ê–Ââ4|³øfñÍbàéÛOß~ú6ànu·º[œÇyœp —p €vØr—Ü%w@ò—ü%ÿÇ‚©š©fªa6 ›„MP}küÖø­QZMŒÄHŒø"‘ˆ.̳­Ï¶>ÛúÞ—(—(—¨ÊÙheûª_¬~±úEñ Ãž3ßÙFT#ª° iAÒ‚¤Çòüz†ž ‡z~ðƒßܸ<]ž.Oä·å·å·ç¦‘,’E² ¯{·îݺw%ë@Õ@Õ@ó£ËG.¹|t{ßÏ÷óý‡x’s/ç^Î=?á'ü´à”lX6,¾®œ]" ­Z5´ŠíU„(B!ÅkfƒæÐR©T*•r§Ð~ô û)(((((€ÅéQ8:iȡ݃ížrh·–‰b¢˜¨CuHCÒ˜’z¾ž¯ç…½æ2s™¹ *†a†Á„ÓÍÓÍÓÍÓ’u t t ”íUQQùwƒmÐ6h<òaï˽/÷¾ 8Vå|”oñDyâ•ÃÀ?‘‰Ld’+Ë./»¼ìrq¼"]‘®H¯*׌kÆ5œùRî¥ÜK¹âAG´»uyvyvyâLÛÏm?·ýLRTݪnU·3áï»Îmç¶sÛ§×jWjWjW2cŽõþÏQO?ÉÅâŠ#ÈG³‹ºPêBÞZ:´th)¾‰‹ÄE7„ÙhM(y°þÁúë=/›ï˜ï˜ïÐ:Ïvží<+†Oò“ü$ÏfÊ"d²ˆ·|h-£eç ‡r¶cØôœóŽžä!ø“òÚÍG#Ñ(æÑ:ZGë" L SÃÔüC;³yfóÌfi©¬TV*+eî°il›ÖòÃ’š%5Kj6D FƒÑ@®Jó¥ùÒ|Zá°[ï´þƒ?)Oh×Í¡Ý_õ¹q±3îÌ÷拸ü^='.+Å ,ï\ÞiÔdp3ìx~Çó¹JãèeðÇü±û4t5t|ÓþM;û OÄ’5Ép±3îÌwò>/¿4ÿ—¾,;»ì¬ñoXþäò'E øµâמ¤'üëYx³öÍZ€›97s´ìi <],²ˆóÍx°3ž™ïä;|¿£çè§ýTT‹@]¸.ìÿ{:a¤ÝôLÓ3Žž#IMäiÛLšIГVUÃ’N¨/Õ—À¨Óc@»®×õ ¯XÅV1K|b5ZœàyX>šÖ5­s Žt¸úi?òðÞþíUx;÷íܬ¡«`Çí8ð@½£ÞÁL£Yâ÷p¿"Š(ý¢ê ÖÕ_é¯Ðúg;d‡0A‰à¾Ãïè9úâ5´á3ð'ü‰Å'`ÔµYÞÕ®ÚùU[”R Yxiá%¸Ó{§÷N/L§ƒÓAP!R!°Ê­r«¦RS©©˜ÍæÇæÇž|¯Ö©uüšAodõ²úi?c'`÷¡Ý‡œlU©mó®y×]øüóóP|£øFñ (k.k.k†û6îÛ¸«««a{x{x{ò#ù‘üTE«¢UQ˜›žvùôU³Çìqõ\ý´_ºn¡n‘—÷¿¼?SF1^f£Ò¨””X(XX»°VÄwÎwÎwN$¼7¼7¼WäBÝ…º u"ã‡Ç¹Vx­ðZ¡ÈbËbËb‹ˆ}Û¾mßé˜ì˜í˜•¬€>¤Ëu¹Ão¼ð°~¨[`EÿŠ~Ý ‰`ÂóßP«­qkÜÅ\Ö ›ê7Õoª‡®Â®Â®Bèëëƒ-§·œÞr¶NlØ:•k*×T®žã=Ç{Ž{¶òÏ©¡ÔKY½¬~ÚÏ#O%X‹–ÛÑ5CüÈ€B¡< í£> ‘F=qÓ[–€~˜ÿO¥‘íâOøÿØ/2´zhu¾%ViNiŽÔÊ2ý‘þH¾–˜oo<¥îª>Õ'"ÿ”a1r\#WÄ# ¢E‹©–j©‘ï$&1ß‹¾|ˆ5tÒ)ÿ‘û¾}ÊvÉScJ¾©œ®œ¾·LäÁÚkCŸþ?ÿŠ}@Õ«zLtfÅX`ÁS)RÀ³ÌI¦˜æ2óSê=õ&ØWí«^þGvþGܕٻ ÒwG8Bž»ö»ö»,¾¬/``€‹ñì–eò¾?¼+Û×Åcû{<_°¿G\›i8IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-17.7.png 644 233 144 3024 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÉIDATHÇÍ–ýOTgÇÏ -NAdk6ÈvºÄý¡ËÒÔ˜I¤BšÖØ -ڴ͸mŒ)-1Rc©mB"ÉÆUÔÅ”†´¥î®q1@í‹Û·@Õ!Ĥ..S+Û:)3åÊ83wî}>ýaærg­€ç—›óò|¿'çœ{žG@DDr’_´‚´‚´ì„žö†m_ùÜÊçÜgz›ŽíŽí×ÁêÖÕ­®Ï\Ÿ™×mÝò[ñ©çElüT>Ë.9b2ÎeœsT$õ&ØùäÎ'W®Mèg³g)ožó<@÷çÝŸóÆc  `ë–ߊ·Î[x©øÒt¿<ôÍCß8þg<,EUEU¿¸ñ8¼¸õÅ­3+fV¨40‚@YªÐа$”¢[þd¼uÞ³ð->‹?‘@Þæ¼Í"PýJõ+ÎOÑED®ÿkx ø€ÞÃÚh#‹Ç?Šj2^/#ª4ókókPSæ”9ìWO«§Œ÷÷‰Òïˆw€ºÎ»¼K– %ðÔÜþ5û×oX|Õ£Õ£ÎOamîÚ\»§ÉïÑJxéÎKw@½  ªx÷Ôê tî0Ë, [Ôÿi÷|ÌÇèÀ£ F ô·_ª~©"¼0-ŒòBä¤ßç÷8 §¡¥«¿$òI“ïEDê7ˆxz®ŠóNñ¾â}jí–PS¨I.lù{U{U»8/Ï\þñò"¾z_½¯^Ä=ïžwÏ‹xæ~8¥…Þ˜7æs½¹Þ\Ÿÿï5ï58^×òTËS¶ÝÐgJfJ²³Õ9×*×*s’®ÐÉÐIPæòoÀÆl<ÝÛº·uo³|ã¾qß8¸÷º÷º÷­æ[Í·šm¿™af˜¶>1=1=1¿P¿PŸ²fò‚±` ¸ëJw¥›“i‚ù¥ù¥cRtýyýyG¡ˆˆäY3kŒŒÑ7é›ôMöìœ<3xfP¤ÔSê)õˆä4æ4æ4ŠÜ–Ûr[D޹޹޹ìøÎ#G:ˆ”þ¡ô‰Ò'Dr]'\'DÌO’|³F™Q&"N³ÏìsL¦‰C{V{öêùýðôð´ˆláÏV^• •u•u"… … … 6QæÍÌ›™7EjËjËjËl»> è"£ù£ù£ù"áÓáÓáÓ"YcYcYc"µÅµµËá1G^’oÅÐÐЈˆV¡U\½’\m#°çƒ=,7¢âZÜž)D‰&&fÊ3Î8 @àží¦î €"÷Çý)|jÏ¡=‡¬}Ö6bï1åüÙù³–Žé×ýº½ÇÌÝú>DXͲšÕ)3tÖ. # use Graphics::Magick; # Markers for routing @names=("red","grey"); @borders=("black","grey"); @letters=("red","grey"); foreach $character (1..99,'home','XXX') { foreach $colour (0..$#names) { $image=Graphics::Magick->new; $image->Set(size => "63x75"); $image->ReadImage('xc:white'); $image->Transparent('white'); $image->Draw(primitive => polygon, points => '1,32 32,73 61,32 32,10', stroke => $borders[$colour], fill => 'white', strokewidth => 6, antialias => 'false'); $image->Draw(primitive => arc, points => '1,1 61,61 -180,0', stroke => $borders[$colour], fill => 'white', strokewidth => 6, antialias => 'false'); if($character eq 'home') { $home=Graphics::Magick->new; $home->ReadImage("home.png"); $home->Opaque(fill => $names[$colour], color => 'black'); $image->Composite(image => $home, compose => Over, x => 32-$home->Get('width')/2, y => 26-$home->Get('height')/2); } elsif($character eq 'XXX') { ($x_ppem, $y_ppem, $ascender, $descender, $width, $height, $max_advance) = $image->QueryFontMetrics(text => $character, font => 'Helvetica', pointsize => '36'); $image->Annotate(text => "X", font => 'Helvetica', pointsize => '36', stroke => $letters[$colour], fill => $letters[$colour], x => 32, y => 32-$descender, align => Center, antialias => 'false'); } elsif($character>=0 && $character<=9) { ($x_ppem, $y_ppem, $ascender, $descender, $width, $height, $max_advance) = $image->QueryFontMetrics(text => $character, font => 'Helvetica', pointsize => '36'); $image->Annotate(text => $character, font => 'Helvetica', pointsize => '36', stroke => $letters[$colour], fill => $letters[$colour], x => 32, y => 32-$descender, align => Center, antialias => 'false'); } else { ($x_ppem, $y_ppem, $ascender, $descender, $width, $height, $max_advance) = $image->QueryFontMetrics(text => $character, font => 'Helvetica', pointsize => '32'); $image->Annotate(text => $character, font => 'Helvetica', pointsize => '32', stroke => $letters[$colour], fill => $letters[$colour], x => 32, y => 32-$descender, align => Center, antialias => 'false'); } $image->Resize(width => 21, height => 25); $image->Write("marker-$character-$names[$colour].png"); undef $image; } } # Balls for visualiser descriptions @colours=("#FFFFFF", "#FF0000", "#FFFF00", "#00FF00", "#8B4513", "#00BFFF", "#FF69B4", "#000000", "#000000", "#000000"); foreach $colour (0..9) { $image=Graphics::Magick->new; $image->Set(size => "9x9"); $image->ReadImage('xc:white'); $image->Transparent('white'); $image->Draw(primitive => circle, points => '4,4 4,8', fill => $colours[$colour], stroke => $colours[$colour], antialias => 'false'); $image->Write("ball-$colour.png"); undef $image; } # Limit signs foreach $limit (1..200) { &draw_limit($limit); } foreach $limit (1..400) { &draw_limit(sprintf "%.1f",$limit/10); } &draw_limit("no"); unlink "limit-0.png"; link "limit-no.png","limit-0.png"; unlink "limit-0.0.png"; link "limit-no.png","limit-0.0.png"; sub draw_limit { ($limit)=@_; $image=Graphics::Magick->new; $image->Set(size => "57x57"); $image->ReadImage('xc:white'); $image->Transparent('white'); $image->Draw(primitive => circle, points => '28,28 28,55', stroke => 'red', fill => 'white', strokewidth => 3, antialias => 'false'); if($limit ne "no") { ($x_ppem, $y_ppem, $ascender, $descender, $width, $height, $max_advance) = $image->QueryFontMetrics(text => "$limit", font => 'Helvetica', pointsize => '22'); $image->Annotate(text => "$limit", font => 'Helvetica', pointsize => '22', stroke => 'black', fill => 'black', x => 28, y => 28-$descender, align => Center, antialias => 'false'); } $image->Resize(width => 19, height => 19); $image->Write("limit-$limit.png"); undef $image; } routino-3.4.3/web/www/routino/icons/limit-85.png 644 233 144 2534 14774263775 14713 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[hTW†×ŒÚ$t4†fë%f’‡jˆQ¨©&Ø$m#Q!U! j**E3Ðà“ŠmëƒZ0,^H„L£‹ƒV•¦‹¶$ )/1ʘI:8™³Ïùú0³çŒ­Á>º_ÎYkíõÿÿ¾­½DDdjü+àœåœåœ³_ØþÔŠÔŠœ31»Ac¥cåŸ; ýhúQ€Œ¦Œ&³Ç¶u\÷Oαñ“ù´_¦ŠíH9—rÎQ·÷ÀªüUù©î˜ýM¤ùÓü°±mc@ëÉÖ“| o<¾, –‚më¸î¯ó5^2¾ìù¿LjŸÔîø RÞIyG²Ê²Ê<[cîy ª²ª``ÂÀË jpá²JFÐíY’­ãñþ:_ãi|ͧùcz2K2KD`ÅškÒNÄzNAýÌú™€õ 4àâ{ã q¬_\#—?XµV-`!X3`ÀzdÅD¬¡è‹è àê©Çõ£êgÔÏÐ{NÙü1=òêÚ~û1T§V§/¢×A…Ux_íP;ˆZ³¬r«KO‘å¶2­L ‡r°[„!†–f«ÙJÔEuQ»£×| ~IôÁaH{œöxd"ôª^•üŒŸL·é&¬cc±<-~Zü´ Ÿá3|¶žPj(5” ƒÁÀ`†¶Õ ÕzWy•À*° s+ŽŸàÓü1=qa °iç¦Þ\` D»£Ýöˆƒ×‚—ƒ—aYhYhY¦Í™6gÚ¨öV{«½ð$ÿIþ“|ð¤{Ò=é0·ynóÜf˜¿`þ‚ù  û½nW·ËÆ3GÇ=²ùlþ˜ž¸°[_ÁÙá³Ã‰¼ ê÷1ߘˆöœÏ>Ÿ}>rý¹þ\?ܾwûÞí{0¯u^ë¼V8î9î9î‚pA¸ {[ö¶ìmÞ®Þ®Þ®¤%þœJ*auXÖøÖ›?¦Ç)2åꔫ ‹DJ––,¯¯8N8‰Y³$E{999ERv¥ìJÙ%RÜYÜYÜ)âÎpg¸3D\µ®ZW­ˆQn”å"P ‰T^ª¼TyI¤ßÛïí÷ŠÈ9i—v>‘m²Mã;NØüq=19c²Ù Ï>{h{õ©QhÚ=öàØƒc`qíâÚŵ¶¿hmÑÚ¢µP'uR'ГݓݓmÇ—¸—¸—¸áPÖ¡¬CY¶_•yF^r™Ñü1=Nó‚yÁÑ-b,7–ëù‘LùN|âKØ2½jzÕô*‘û]÷»îw‰´ø[ü-~‘ÑÙ£³Gg‹ó‚yÁ<‘š35gjΈ4v4v4vˆ   ˆä÷ç÷ç÷Ûx}޾$¾\Ïx{ŒŸÕ:µŽQHÒ̹säΑ;àíóöyû q q qÀŽØ}`÷ÝPt³èfÑM8í9í9íIÚcË)£ øMmU[ÇßcãžJ”4‚Iuèkö±¸Ë]î& 3Ì0ÐDMü·]á W€**¨H‹Ïço<•¯©c†®3æs an!êGÕ¬šAmWÛÕv0š Í…ÀjV³T›jSm |ʧ|`~hš…ÀX±²ln67Fý¯:öšÊŸ¨Ìꚺ`®7×MŒ8Â(£ñ+i†,LLàå+w¨eçkdÒæ‚3g ÎÐEæ"s‘yͫԇúPŸÏþƒóçü9ÿèíŽFG££‘~Š*T¡Šä#!Ћ^ôØŽíØN?•j¥Z©–䳿°¿°¿ü³ŠXˆ…XöŸ*œ_8¿p~ëƒâ¬â¬â,b₸ .ˆ¬›æàoz¸¼™ÀåXŽåL _ÄñEüMç¤sÒ9ù²"}‘¾H_óÈiršœ¦–;¶H[¤-2ú?•åÊre9.G§D§D§üqŒ8F ,ó]æ»ÌúÂïB¼0^ЛÑ÷äò <ëYÁ•tCçðo“mdÙT. ‰‚®}=Y=Y=Yý²¯_‹_‹_‹{oJoJoJ/ã ë ë ë"i¾4_š>ÂGø Ø`ƒ À»xïx/âEØŽG4]†.C—º®†\ ¹Âïýíõß^ÿíõŒ/AŠ EP¼Ì½Í½Í½-¹œê¨Žê¾M@@À¬$‡¦Mš`€†€Ùl#ÛÈ6Î9íN»Óþrªê5Õkª×¸åéyéyéyl÷„÷„÷TC 18þ¿–$’`fa8ñâ&nâOðixtxtx4©ÄYœÅÙPÔ®;\wÏÏÏr3s3s3ˆÜˆÜˆ\ þýú÷ëßè]z—ÞBBB§õOëŸÖÿ.þ@Ĉ@}x}x}8`Û`Û`Û d$¬"¬"¬‚T <ãsŒ9Æð?GE¾¼D^"/꩞êÁ ó.Ì»0ï )Õ”jJGYpP·«ÛÕí€øKñ—â/ë¨uÔ: Ì×Í×ÍךxM¼&þwñfµYmØ v‚ìiö4{Ú («ˆRD)¢`x>Ÿà|BB˜óÌyæüÌ)~ÄøÀÇøÚ)í”v pssªœUÎ*'ЗЗЗD•F•F•>÷|îùÜ4ë5ë5ëççç j{Õöªí@ŸoŸoŸ/•••øÝ÷»ïw q4ŽÆä¹Cî@Êle¶2[œÄIœ$!ŒÈ_ä/ò§ÆcÇcÇc1Àíãöqû "ͤ™4ƒâ žàÉÌÀè=£bt1º°Â¼Â¼Â ÆÆÆ¦rS¹©ü_ñ¤ƒtŽÿ'~Ùà²Áe€éŠéŠéÊ õ MÞ¼;yŒŠQ1*z‘••åÊæÌ˜O/tFtFtFE(Baw¬t¬t¬¾)þ¦ø›b`øöðíáÛ@ä™È3‘g€ÔÂÔÂÔB`Ê9åœrƫƫƫÀ…÷.¼wá=`È8d2þ+^cÖ˜5fÀ–fK³¥C†< ™™—ÝkŒ5ÆÆãˆqŸËd²®ŒA:Ò‘^XŰlÉo]Ѻ¢u…[eqY\ÒMÒMÒMÒø¤ñI#Ðx¢ñDã Àh1ZŒàûýßïÿ~?@6“Íd3 öWû«ýS˜)Ìè3õ™úLÀh5ZVàúúë믯DC¢!ÑXXX‡pº\:wéÜ¥sürb$FbÄWÓÅ×Ñ–É-“[&o^›*š*š*Roÿ`üƒñ"þËÌ›y3ïÞμLƒi0…£{a÷Âî…` ©†TC*`I²$Y’íFíFíFà•ŒW2^ɂƒƒžµ=k{Ö†PC¨!°Ì¶Ì¶Ì´Ú m¨z‡z‡zغøºøºxÞÖ××ÇäÊ’eɲäŸ6»Ú]í®öMëÈ¡¡CC‡†´£íÿv\l›Åæ›òg-ÏZžµ¼¬KnKnKn£IëF×®%×Ý·Ãíå¶r[¹­ âIñ¤x`š˜&¦ @<âànà@kh ­œß9¿s~ˆòDy¢<€]Å®bWÁv?ñ~âýDlª¾[}·ú..Éûåýòþ©×©ˆŠ¨(zc1wïd˜*¦Š©u0¥L)S:ò¾Ÿïçû·9­ŠVE+`È6d²ih—o—o—/jER‘T$…]’"I‘¤ÌWÌWÌWm£m´ ÀmÜÆmJ(¡H9)'å€Ô&µIm3€ãã·Æoß‚ârÅåŠËœJ< ÄJ¬Äz'q$ŽÄuïDÊPÆxÊ(|PP#5R#¼<2§P›çyžŸÅÏâgÁ«s´s´spîvîvîþ°Dé£ôQú<<ß«ïÕ÷êEeÍ›76o¤I$ä‘—ÏåCZ¡®PW¨Ý‹Lq¦8Sœ¨O¶T¶T¶´,~úO³·¯ä+ùJö¸ggÿ"ìXqqqqq1Æ……çÅŒ‡<ÞÝãñîqwf¼«ƒ:æ„Þ¥wé]\Žõ”õ”õ Ã0 ƒ§ÂJ´Ú[í­vÞ6\9\9\)ê“””|pÙ1âqŒü¢omßÚ¾µ€P%œ§à̈çÚs Àïþãÿx×ßâoñg­ß|[ðm{aÁËsJ|cè0t:ÈÛŠE¢àU¼ŠWíºÉna·°[ì+‚c‚c‚c˜1O¾õ õ<—ÐV¯^½zõjpžn•P •\ÓÓÓümº¾ÃIƒ¥ÁÒà·Nüšükò¯É¾õÖnk·µ›þwçéÎÓ§Ý+Ÿ¹ž¹ž¹D»Å«Ä«Ä«öÐSô=õ÷ËB ©hcÃÿ¢°ž…âžç!ø“öÞ-B3šÑì.¤´‘6®îgê˜:¦îûà©7¦Þ˜zƒ_"®WŠ+™n‘N¤é®þ ®SשëÖ¬6öûýä ÿÿÿýÚ£«÷ÚþˆƒÁŸ´ç¼ë9.Ü…ÈCòØ’,’E²n¨i3m¦Íûß•ÊåL·è‘è‘èÑH ÿÿÿYÎhÏæžÍ=›i@{ô„ÂÒþgÿ ûéøP#90IEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-locate.png 644 233 144 1035 12610450011 16415 0‰PNG  IHDR Vu\çsRGB®ÎébKGDÿÿÿ ½§“ÅIDAT(Ï]’=hS…¿û^^^“Ö&Ú$lÔDÒ!´øG¨‹¨P;I,q°`+èè&"'Ç8)¤êP(Šƒµ¦ƒ¥PÔ”ŠŠI“†¼ŸÛ¡â;Ýsî ;ê ÉuŽò–FpƒùøóÎdßE`ÿ)—é¿6m=Œ¶˜Byµ1½Oè™ÛóN¶ÿÖ0ŽÔ‰KOz‡ÇOš‘°ýÓšQ\$àFÈýº«Ñ¶#æ»Áóûô¯{Œ2/öxfôÐÀØi±Œ¶tí*«WîÆ0‘VŸ¬Ø¯ñƒÍC p€sp,]ˆ¤[n³¦‚!ÙÚM¢Îqö® òÇ~ÏRç8(J†I.‰ìÙ¼z¢âc{ ºë‚~•Ð VBÓ >ÐÃñiÏ@Õ*©¨  >®4¨Z HdŽÞúâ‡Äeñ¥¥Šno/‚?èÇIÇÉëPÑRÑpâãó<êzÔ0ž;ž 1lù­x+ßâ›É/ïýO}H8pZ» ‰O%>%ùùÏíŒÜ~ܯº_x÷ NÙÀø˜Íl• øñc­‘ØòGã­|‹Ïâ·êYõ#zR_N}Y„¿NN8¼‘„¾fêjkAý |’4ÐÀl04C>Ò§ô)‚êfY´(Ÿò¨¯ÔW@Ð(5J ‚>®¦‘Ff««Q¾–š35g,}Í|VWçðZzä¿÷öÃu,*^Q¼ÔO—{Üõ#d„«VU¯êQ*Y-P ¦¿*NÅ©8à ^çõ˜§VÃ(õÃoø [_Ô FùKŠwï´~¸nÆVŠˆü¨Ž ŽOŸøãávúítÿ€_|÷Ò7Þo¼ô_êoëoÇêÂhÆhÆh¨L•©2gj¦™æ …ía;ŒœývÁ· ˜·"ü0P;P 9.;.ûã-=¢4‘†KPeT0ñÆ3W¼´æE׋.HYš’—’‡*þmñ®â] {tîŠ]»*v}Ü>n‡Í›;6wð½õxëã­·ÂϤ T‚YçgõÍêC•þÎSí©ÌPy®òÑc3׉ˆüØ'â¸"¾ÚÖ¯[¿Ö²ô^½V¯•ÐÀßEëÛÐWÚW*²×±×±×!r³äfÉÍ‘;§îœºsJä굫׮^ñåùò|y2½o9¼åð‘Ç›üåþr‘ÀºÀ²À2ÑþUÝŸÞŸ.¡¿^8÷æ¹7µ,‘¢Î¢Nã@D-þ³¤–¤–•Ùò«ÌúÌz‘-¦ûy÷óš·ýOçÛηIbá? ‡ ‡D”[¹•[Äét:N‘9ûç쟳_$­<­<­\$Ý•îJw‰ – – –Å„-ªZTµ¨Jd8y8y8Yäèî£5GkDî÷Ÿ½ÿ¬$Ž÷ÜOºŸ¤yEr½¹^ùõ¬ŽY+³ã9¬Mh¸´“O¿òô+šô·ªnUɨ?0’6’&©¾¾›¾›"ž=ž=ž="g³ÏfŸÍ™÷hÞ£ybÂzXë"Î…Î…Î…1{ASASA“HOoOoO¯ÈéüÓù§óElwm×m×Eo8.9.ɨHBfB¦¤jޏ×â^ÃeS§ŒmÆ6­W$¡-¡M¤ûçÝ»JjÙDÙ—e_ŠtµuµvµŠ<8óà̃3"…õ…õ…õ"Cˇ–-Ù7ßü}óEF‡G‡G‡E²\Y®,—Hó’æ%ÍKD.v^ì¼Ø)Ò¾£}Gû‘¼Â¼õyëEæŽÍýbî"kw¯M^›,©"“žIˆmÝtk½Â""×k8{ôÓ£ŸNþò÷íï÷8ÁÕáÕ“«'áàÆƒnŒýÔÇ2ŽeË€œ+9Wr®@ûÝö»íwa222Ü^·×í…±Åc‹ÇC]Q]Q]d­ËÊÉÊÏ‹}_€ UO8rèÈ!àNDO´]4\‚ÊòÊràóè)QFµQkS„˜b Ô uCÝZi¥uÆñ;À.\¸fØ/p À=œÁwH¿­ß2§OeCeð8¢Gèö1ýŽ~< ¬XÆžHŸ1Þµ„Z˜ Íõæz ›.ºÀ\i®4W‚±ÊXe¬³Ãì0;€&šhÓi:M'ðÛÙFÈ\j.cYèÐ;ÌßL÷±^tÇ-Ç-ö½ÎÇî±*Ú™§Œ£ÀÜfn#<ýÆ& „Zõ˜˜À$#ŒX<(T4?hñY“Å“èIü¿?:+)*-*1+ÙýÌîg¦ NµÔ2t¿î06›‚êThhÖߊ·ò->‹ßªgÕŸž•Oìí≽=™7ØÿPÜ­©LöIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-70-grey.png 644 233 144 6264 14774263775 16020 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü iIDATXÃ…—{PS׾ǿkï‰Åâ‹C@„ArA¥FD«­-•‚ƒÚª­x-—9§½Æ±Æ‚c}¤c}mÕP#¹J¯Pní8E„^AeJ!¤’ì½î$xÆ™NÿìY{íõ[Ÿµö÷÷û­E ƒÁ`€/&Í2ù`¹ûÜ}î>5¾2|eøŠ¾÷{Þïy¿¯ZHUTEUGþS…@í‡Ñatéa”¢¥D0„! @ºÐ`v`=,K‘¥ÈRˆžûûûí—R2JFÉèG%ûgퟵVÝ¿ò·äoÉßB†„`!X&k'9Ä&7—/3˜€$0Å<1OÌ›œãÎqçx@l^U^U^ÕÅ>çsÈ9T{Ëm‹¶Ekÿ[y\y\yÕÚdm²6™èKKK€X¿X¿X?ÀÓöô{¾÷Œ÷ø›òïžÏ3¿‡ÇÃǹwpõ¦ÞÔ[ÜL¶“íd{ðq6˜ fƒ¿/¿0~aüÂßüükýkýk]»’»’»’»>²=²=²¼*ÓËô2=l؃=Øl°Á`¶a€Ù˜Ù°9æ:æ:æâÕöÆöÆöFÊׇՇՇ‰»ž¬~²úÉêMÇÁŠ`Eð¹k»k»kûÊã4“fÒÌû› ˜eäcûÇöíшƹÓ9#gäŒÿtòNÞÉÿíõõõ!áͰ7ÃÞ ã.ªÖªÖªÖB P@+Ä ±Üäx©HE*@2HÉ0Œa äòùDˆÁY¦[¦[¦ãÞµS×N];%l¾wóÞÍ{7¹Ÿ¤^R/©×ƒ!EHR^ÊÀKx /õÿA6l:Ø>‚àsþ—ñÔñÔñÔ-1¡gBÏ„ž^ÍLÊLÊLâªÑ€4À \pÁ«° «ðÌpàÀ8„C8Ðåt9]edYÐWè+ôs0s`%¥¤””»ÌXf,3 ¯vïîÞݽ›«VV*+••_µpcÜ7¶UËO…§ÂÓµ±ÎëÎëÎë[bü×ø¯ñ_C5iæ4sš™óhÄj?m?m? o~+¿•ß 8­N«Ó 8µN­S صv­] ð§øSü)À-P5P`hhPUP€,d! Þÿi5i5i5ÜEÿõþëý×S‡ÇÃÇÑ0FÃ>I啼’W:¥N©S"Ù7Æ7Æ7RGŽ#Ç‘ʼn'Nœ8X4E°*VŪ®„+áJqƒ¸AÜ$K<–x HF2’\©½R{¥hãÛø6ðiõiõiR?Hý õ@Ó¤iÒ4ÁÛ÷´ïißÓ°­X³bÍŠ5H¾¶ïÚ¾kûÉ\É\ÉÜORA#hÍìT «†UÃ8u6êlÔYRì^©T. —…ëëë@úõôëé×MÖMÖMV`Yá²Âe…€£ÜQî(^tzÑi qiãÒÆ¥À¯ú_õ¿ê_îürç—€Ú_í¯ö.ö_ì¿Ø8$‰C2% idydyd9)öðxø8LjcÄ1‚³ ×.\»p-ô^Í^Í^ͰÑlšM³¡ Ÿ‘ÏÈg€¦WÓ«épçp@’4ÓfÚL¥¡KC—†3†f ÍÚJÛJÛJØó±çcÏóoο9ÿ&à;â;â;´¤´¤´¤æYæYæY@"pŠ@E "¶ £AGƒŽBß2Ò2Ò2‚# â ’0æ2s™¹<µ2nànC9àâ]¼‹PˆB·–ÜZrk ðpæÃ™g«cVǬŽøøø€Ç'Ÿ||˜<;yvò³˜“äJr%¹{ƒ½ÁÞlã¶qÛ8ž7óóó€38ƒ3$ŒaÙ@6^±ÆYã¬qèv »…Ý`‰‰˜ˆ °6–ecúýŽ~4t7t7t‰ï%¾—ø Èú€> n ·†[¸ê]õ®úg$œ„“p€ŽÒQ: ààÀT7u?Ùñ–ñ–ñô2jFͨéN~T~T~T(êÕ;«wwönÉÝ’»%D¯-Ôj 1ášéšéš  ,€^ï^ï^o€¯çëùz@;O;O;ïˆôé;Òw­¿Ö_ F F F<ëwÜwÜwÜØAv”6¥Mi›êž0Ÿ4Ÿ4Ÿ„Â<`0à3y¯¼WÞ+1HCÒö—rÎÀˆ¾Î¯Î¯ÎÏ¥¶,²,²,‚‚-f‹ÙbX=žîÝ)ºSÌh›Ñ6£ Pù«üUþ€ø£ø£øã3 °a·Ëo—ß.CCC€ê}Õûª÷’­’­’­€f\3®‡C ƒÅ`(ªQjˆ ÄLÌÄŒ/‰‹¸ˆ«LʼÐðBà ‡öJWHWHW\èû$öI,{ïÚòk˯-wåºçõä;ǰbX1¬æ¤ÏIŸ“þoªÒ@ͳæòKË/-¿hÛµíÚv ø\ñ¹âsÀpôpôp4ñ ãAÆPi¼4^YeIeIe‰hÐ ètÌOÒÏ¥ŸK?oËàûø>¾oÏô×ô×ô×x‚à£o•«”«”«”uµvµvµ²E¦S©€&yDþ¶ómçÛNÐuÛÖm[·íãdœŒÀ&0°l¤ÏKŸ—>ØcÚcÚc²|²|²|€û_ì±wuwuwuX÷sÚÏi?§1 ¯¯¯ûj1AL2’Ù«ìUöêDÔ2¥L){›)` ˜‚ˆ=bسݩ¸£¸£¸4Ž6Ž6ŽÒˆöíÛ7â›i¦]˜vL"“È$îÚ "¼à/@@­ÔJ­€¼EÞ"o$¯I^“¼«Õnµ[íPT«ÕFA-étH:b%VbÝ+’xOâ;ÞCŠPÄÍuó\‹'ÏÜ'ä89NŽ7d3:FÇèvñ.ÞŻ̉*Ÿ*Ÿ*!Ëm‰¶DCAÞ'ï“÷aE‚ôo5Þ®‡z€Ü%wÉ]€j©–jáðH©æÓšOk>uåŽF £î ™Z¦–©¿É=z8ôð±ï±û±Ÿü=èA°’Õét:JŒa c¢Šh‰–hÉ¡ˆ²ˆ²ˆ²ÿ{Ã’fI³¤-`¬±ÖXklTÍ£ÄG‰]¹Ú8mœ6ŽyƒÊ©œÊá ^Ä‹xƒ7¼á @ $ 4”4Ò®ÙÜln6Ó¤ú‚ú‚úæÒô˜é1Ócúí|ŸÅge¼öxóãÍ7[RGêHÙá^؇žƒ³'A\§‰ÓÄiðillœ9Îg·‡”*¥J©º¹«ª«ª«Š-2¥›ÒMé4‰d“l’ ™øµøµø5¨ç×Ó1:FÇ"˜xl~l~lÆ7µQµQµQðQ)‡”C€'Ɖqš”^¿Ý-Å/Üiu­'6ˆ'ÜW™'ºÝy·µ¨E­+—$’ôÆä•ãûo'w@üû&q“¸Id# " " "vŠb'Ìf³A/è=d§BN…œ q…ÅÅųÝò(y”<ªh e)KÙ]?‰Åb±XÌ}>ô¡Oø‡G"ùùùùùù°zvîSrk7×­Ý/Üڽά`V0+v‘‰Ld2'ªø*¾Š²,%–K  Ã0 ƒ1ÏNÔMÔMÔMˆ¶þâþâþb¶[¾W¾W¾÷_ÕŽÇ€c`ï±î—»_î~pªÝãÀ©¬ò|‘}î…ÛÁÈArÈ· +V.¬,zC¾S¾S¾ó›üÑÀÑÀÑ@ÎrÕpÕpÕàÊE(B Ÿv¿v¿v?œk¼Ýx»ñ6Ù¬èTt*:Q-ªEõß›¸ÜFnãÄRÍbÍbÍbfÄ=ß:O…zž‹ÅŸ˜;Èw³J©”JÉ ………£Ü5ß5ß5ÿ– ÓÈ42Í›'­|´òÑJ¿JK‡¥ÃÒA [Ï·žo=ïZö”Ê?åÙI¢$Q’¸{.-¡%´äR5dAÆÞÃF0"Îöü÷F Ïóü…ý‰vó`‚ &×~j¤FjÔõ0LSñƒÆþºýuûëb¸¤XR,)f:ØL6“ͬ¿RRR±Jgî1÷˜{Èÿˆb€@ËÜ~«Ü€¶?ã`ðöœv}ÜÚÝld#›û…l![È–ÿ ¡&j¢¦¶yyy1lÛÇö ‰GÄ#⑬ÁΌΌΠ`pªØz–Åñÿ À9Á_IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-29.0.png 644 233 144 3226 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜKIDATHÇÍ–ûOTgÇŸ¡p(j5ˆ«E1RkqbûÃB©H5ÂÂTÝ.µ&¤¸ãÆu7³º—@ÒÆ›xi]AÄ bÜ€¬—p›Öh)°¤Ûc[©Kµ32:í\Î9Ÿýaæ0³Ûý|9ç¹}¿ßóž÷}ÞW@DDž ?b–Æ,™²c~ñ'lIØ’Þ²Oj`yÃòÆßÿó>š÷Àü3óÏèw"¶7ó£ëE"øÑ|¦_ž“ˆ#þBüK^Ø®7×¼¹&aaÈ>|”v¥}:ïv¼ÛÐÖÔÖį`ò‹É/¦ò¦ò b›q3߬7ñ¢ñ¥æøE îJÜË?!þ™øgD msÚæ{C £+àõÂ× ¾ý6Öˆí{ ‰$#ðâÅ®(ÛŒ‡óÍzÏÄ7ùLþäÜä\þ¼Õ³Õ£4† î4S_ÙTÙÆ5€@;¿ç$'IÍ¢Y€#AOЃÏÖéÇ€6£Ýh0n·ŸV¢•àƒàTp h žz’Œ¿…ñ®TöVöšï4ó—bk±Ui4õÈÿÛ7±jÛúmëÁX 覙ã’~\?N@ÿ—~C¿al5JŒ’ٙˆ5bX €|ò#~*ØÄ& }Rë×ú ÷¹º/Œÿëmïm{Ïøá¦¨_)"òÒ1º•³ÊY¯FWŽ®„ÀÏøÙ÷«¿û໘ ¬ììŽðùOûOûOƒ«ÇÕãê]ÕU]ÔJ+­Qù©þ|>¸—=<ðð3†-„j•ZL*ƒÊ ×Š/¤GŒ,‘“7`OížZxòo=³èbþ¹üs0·jG0rïäçÃØù±ócç¡hQÑ¢¢E Ô(5J ”ì/Ù_²ØÇ>öñ£±kr×Ä® PZ•v¥cççoŽgFõL®U¤U¤¯†ôHðy‘›•Ð=§{4ýñRÑ¥"£lUrúÕô«øÌRÇ^Ç^Ç^°]¶]¶]G©£ÔQ!¶{ì»ZªZªZª"þ‹;.l¶ [<Ìz¸æáXY³"}E:¾ËkûèÃ(ƒ« W@³†ôÄXcæ|3盵Y"k‹×‹ä÷¯³¬³X×Ü×Üßu°ë@בɒ$‹l(ØP°Ad|Áø‚ñ"ÍcÍcÍc"ãóÆçÏqº Ý…2;î¼wðÞA‘”̔̔L‘”Á”¯S¾Yú“´uië$þï|ÕøU£¥QdsÏæ|‰ÎDçÚ,«‹Ã&Û,ªEµÈ"çüÁùƒâþ]â¡éCÓ’Üó¥sÂ9!r"ñDâ‰D‘ìÚìÚìZ¥Z©VªE:';';'EbúcúcúE{{{E$Wr%WĺغغX$h Ú‚¶ˆà@rà•À+" ëœ Nq‹ÄMÄMH²enìÎØØDûÓ³žÝ`\€™¥3K᯷:ÕN5²Wï>\~¸:\®4llØØ°rl9¶Ô××ê‘U#«Fà¦ë¦ë¦ ÕFµQ…òòrHs¦9ÓœPýRõ‹Õ/ÂÊß¾ýB6Ü»=v`Ê>eÝHú,é3ã‚h¿1ר¥ÒK¥pudà“OŒ²-¿xÍ÷š_Áí‚¡‚!°§ÚSí©àt;ÝN7ÔeÕeÕe½Î^g¯ƒž¼ž¼ž<ð.ñ.ñ.ÇQÇQÇQð{Š=Åж¼myÛrȹŸ£æ¨pùIÇñŽãæ6Êx¾5©5 ¸Òn'o@E~E~Ô.AëÔ:G<˜]Í}ôÑŒ3ÎxÔ¶;ÃÎdåÏ&›là\8V©àÝà]`µÉWQWQ< ïJÚÂ} EUT¯Õø\}Y}´C¡>£øû3£׆´!0ŒA_¨/Ô‚¶L[¦-½V¯Õk.ºè- ´p–SœýU}¾´Ÿúkü5Ìè-á>¦«6Õ Œ*£^+Óá>ö£ÎïßnÙnÜáÎìѺµnà‘îЄ¿˜ð»ø!j† 44à1.\áL0@/ÓËà×>Õ>5“}°=a{Âÿíüá³’â’â’¨³’ªÔªÔY€và}Þ' ‚Þ @{[{×ëX°@Ä6ãf¾Yoâ™ø&ŸÉ?{V>µ·‹§ö>ötÞ`ÿÝ>ÜÙS¸ê"IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-185.png 644 233 144 2777 14774263775 15005 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü´IDATHÇÍ–oHUiÇŸë8yoX&ã¥brË[4榒ʚÐ0ŒƒâìÞ±„‚eE˜ÚˆÕ_ì€RcNô‡Eð¢c— ¼„ Í°ŠŽC“KÑŒ$jµÛ èuZüÛ¥ë9Ïy>ûâžçž;û¾çÍ9¿ßï÷<~ç „b“ý”™”™´1f'ýÉñ»ßs¿·ózÌîàúÐõáØß íJÚ€ôîônkܱu\ç'Ö áà'òi¿Ø$GÊÍ”›®2ÛnêÜê\·7fŸOÈzaBí­Ú[}Wû®rf¿Ÿý`¡l¡ [Çu¾®×x‰ø¢åø…€7¿zó+׿!e]Ê:!`û»Ûßõý9–ðØ•T~0ýÆô* ä/@*©ª Xa=ž'Ø:nçëz§ñ5Ÿæéq8ã°PõqÕÇž®XÁø—˜ o7¼­ùŒ%|ʧ¤rÕüÚü@6É&¢\QÕªÔ=ëžu¸¦jU- dµ¬&ª¢ÆKã%¨Zh!UÍØx÷êÇêÇ´Àñ/ù¦ê­ª·<]Z³”–B´¿ð‹¸ Õh6™M ~’ä ; Øˆ@€ÊT™*3>c(¯ò*/°“ìtÜDi¦¨§ÞÁ¿×ïÕÛ$,¥Bd_OØ^I†ÉÕÉUàÊAªQ"/–""Àø»qɸäY»¼vyí2Ì—Ì—Ì—€yÚõ;cŸ±¾X¸±puè/‡N:w*îTÜ©•¬’U2”»ËÝånؼcóŽÍ;À_è/ôÂ\î\î\.øÒ|i¾4Øscϵ=× /?¯<¯õ(ãÇ”Sø6Õ^¨½ g®cØv¿žß··Ågþ/þ³|aùуO<éœÝÑÝ£»GwÃ`å`å`%dÍ:›uN=œz89}9}9}Ðéëôuú ?’ÉÀ™Þ3½gzaò‡ÉÉ5§æˆò‡KÁŸƒ?ka÷ëlÜ8¨n²:ûÎì;À¸-í¤U`€Ü*·È-Pð´àiÁS¸Ýv»ívÈ Éd§g§g§CjWjWj”””@°5Øl…œâœâœb(é,é,é„]-»šw5ÃÓåc™°7ÏÔÏÔƒÖ# }Cúë<Ÿy>ÜŒ{¥¬ykÞ)<0r`äÀ «a5¬ x,x,x ЫЫЫœ¼¢ãEÇ‹ŽÃ)Nq ÏÏÏrâ¥ÞRo©¾ØÞîi÷8mFþ>\.­'I«ßêw=˜•f¥ÂB‘áúXk">ŒõÆzc½ÑåèrtYˆ­i[Ó¶¦ ñ,ð,ð, Do¨7Ôb5s5s5SˆÅ½‹{÷ Qs½æzÍu!C¡Àáüp^8OˆÜå~›ûm>Ãe˜ï›ï áèÑ{ŒàRp ±×¼Â\4‰êOjÌnÌn̆»çïž¿{Þ™‹ýû/öCá“Â'…O 0˜L;ñsÍçšÏ5CÑhÑhÑ(ôøz¶ôl‰‡£TØ|‚ƒÁÁ_í1ûTR÷YÝgÎ)sÅt:ºB!âÒFmÀL$ø—Xb 覛n^ÿ`‚ •f™Y–ÀgÔ5Õ5½r*³/gÖ3»’Œš4& ÀÒ}Æj°ˆXǬϭÏAIQ eì‘= e£lk¿µßÚå(GAÞ’½²äi°F~Š÷±uSëé™öL¿ÒÇt£m?~·ßØ™åˆ^XYaؽ_&¦ý®€(Q{ác6v®²}/­O¬O0@~'¿ûUç·ù^éüÿç_Iö†x_3B@+­¤:K,kd QPCj.plo »^ãi|ͧùãÿÊ×övñÚÞÇ^Ïì~¬9ÿæÒ>­IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-44-red.png 644 233 144 4140 14774263775 15614 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXíWkLTg~Ïe¸ …%¢¨Ãn¬»ê Bue—fË¥&;µ‚‰¬©@¬FkV‘ŽM)!J le³4UéjÒPvjB¬Éz)k´´YѸ$š’ÆèÌDÇÆ2Èe”Î9ß³?8ß™K¬f³ûþ9óž÷ò<çýžïû2Dó–FQ&¾ïŒwÆ;…iýEr\\\ÙoeUVeõߣ<Ê£<`>ÌZI&™dîÑ>kåù¼ž÷ãý£ñÄ×¢ùDò«£:ªÑñÅ«ä~¹_îwŒ „ƒHjúTúTúþQq§âNÅ òAåƒÊÀÖ­…[ Ã>ó|^Ïûñþïù|Hü}´¿üñ‰øD|âÉãZV»¬vY­ún×`×`× Kò?ö?ö? A‚„žâ)žðÀ`øzœçózÞ÷Æ[þÉóù‘9EôŠ^Ñë9Ï^-¼ZxUùkÎ5皃 º±VÌŠ¡¨ Êå  ®ÓŸVµV­ÔuêZu- 6¨ jÀrXËÂë]s®û®ûpñþá(|sŠAMpÁA$7ËÍrs÷0/°´ZZ-­ŠÕ öÛÃöÀ¯t+£Ê(À<Ú;Ú;BÌÉœ›†)LúL^ïÑÌšPºµ-`ïü¼ÌÒjé°t(VŽÏùp~dºoºoºÿ‡ßðs“¹ÉÜÄV¸ÇÜcî1Lê}üêGêꀴðc ¶ÀôÑé£Ì f"Ò¼ð P•?<= ¨MwOw¹~÷˜»ßÝIŽÏùüä}ò>yßP3œ¨9Qs¢†íÖ‡Ò§ôû€} È{ÿöC,2/2@çåÎË‘<çîÎÝôõüࢌEÐéëôŠ#êãߘl?b¾ôìôìôl´Ž———… ²Ø›àךµæÈžÕë«×óçt~Úùid<ä yž“ïï´wÚdâR™ …ãs>œ'úçòcåÇÊ…¿Lu©ãê8Ÿú½ú}$ ý¦ý&d d D=^v¼ Ï0û}è™ùùÇóøæ³TW¨¹8?­¢U´Îê#n=]wJ<%FH Á;耤¶¤6Á$K’RÚSÚ@x(<±K쀷KÞ.€Ìc™Ç >->-"_‘6I›ÂPû­;´.Œw¹í«ò¯Êp+ä ¹s£$m6H·ð]–õ ómómu¹ûžFO# ð³’k#×FàÛäo“° .<ZE« n¼n~týè€Kn,€oJ¿)€ Þ ^ÚK{¼±?mŒOO#ÀLóL3}xÍù5ç5ãK‹¥Å“”\š\š\J$_‘¯ÈWz¼Æ¿Õ’oÉWëù§j6v“ÝDüpÌ^½ -|''‘›HéRº"\¿ž?¹°ma užL:™ÆÃµ7ªçªç´€Ap—´KÚu{Û¼Ÿè£h[vÜ”kZkZë9Å l ¶[+1àŒ Æì4; À?Ù9Ù W¯0Ú›Ú›‚Zœ¬µjÍØwcß…—úïOn‡oWh‹Ø"¶Ì– K„%Â’_wÅ”nû«Z¨ª_· =BÐõ¢ýÉ9àp„ç©Ö«õáy"¾ €ð¬t·„íd;Ãóõöxí^;•µ k²Ï˜äéˆtÄf1¨YÉJVÙæZDET$!9ÈA$ù$Ÿä{÷Kãjµ›;ÌJªû}÷!÷¡0 +Ñ^Ö^Æá‚ýÎwâs|°m¬žÕ‡?eûõíyÛóÔzãz*?–;fîÏÜŸ¹ŸH´ˆÑ"ôéìj8Íús›tOº'Ýέ8¸âàŠƒD¦ZS­©ÖyÔÐn‘¥ÈR©]ͦÙ„N8L`áIª+Õ•êÊð|ÛóÛóÛóY ïgJ5¥šR½³ó¾9¢L¸³ô$ĸ_GûæS®)×”ëî‹Ðnƒ­!B»©Jª’&¤=ÒiÂZÁFgâHâHâ«04™,&‹Éo5ÆHñx ¿xzþ ©=F»/Ò®2  (aåÎdÎdÎdk¦ÖL­™Reh±Wê•zÿZÀ¥¦K/–àKô 'ð?¥Ý6s›¹MIu÷¸{Ü=ƦšâLmçlçlçÂÇŽl—í²}DÿK’ø¯\ý=%½ˆ`¬ñ‚·tížý)ío*ÞT¼)¬]g³ÀY€ÏæãÌX ¡J¨ª^? #NÄà ô_Ú‹´ûšÔ"µH-žuœpUSUSUûKN('”RnKí“|’϶Œº©›ºI?v$w ^<ý«Ý£Ñ~ñ]a‡°CØÐFÚHµÕâRq©¸H þùuV + ’†¤!iH¸¤n‹Y¹ÿ›¥¿J©”Jåáèðû5"™Èá¢pQ¸øðçóïéŒYWLß.õµ‰HaœLâ%IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-25.7.png 644 233 144 3137 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–kL”WÇÏŒXœa¤`?Ð)±Ø-hK@%~0­LÅh¼P\TLšbh1[m K¢«Á Ý [4hâÁf(YBˆ¢[© rË%]‚5;n)e‡]fg:—÷òÛ3/3Y7Ù¯ž/ç}.çÿÞçäüÏ „šèMz“>6hë‹ÃþU»VíJùsжʠ; ;0qâ®Ä]XóÕš¯”Ça[‹kù‘ë…ãGòi~aaGt[t›Î²«àð;‡ßY•´ÿÔ†vC»[‚c·Ý¸i»iã70747°h^4CØÖâZ¾¶^ËÄUÿÅ/¬ìXÙ¡û;D¿ý’¼3yç'‚ Oހܽ¹{fWÌ®Põ ;€bT3àÂ…6"l-Ê×Ökx¾Æ§ñë-W?p~à4\.xÜL}¹­Üê}€@;¿Ç†¦¥iP}RT€OýIiQZ@u( Êð@ý\ý@¶È|Ø$›dõ1,Ĩ A<õ寔¿‡øÈÌ4\‡ÄøÄøðž†æ/rx+ÿÝüwAÝP«”"¥ˆ€:ª¶ª­¨Ë=òàÆÍÿ*ð%_Ö²Vsáp×á.­ƒ_äDl¥B¤ÖÑeh24¹¢àÉ›OÞ„À!ö8^ýÙò³O`0à 8ÃLKú%ý’æïÍß›¿Ž G…£¤>©Oê çù_õýFpÜvx^X¸<¿s~'žÅ¿ù^÷½Îo}Ø> ` ²+Jýc°¡nBë”Õ”ÕÀÒ/Jƾ[»¿Þý5ÄVÄÖÅÖ¡šëÍ—Í—aºyºyºRÜ)î7¤å¤å¤å@zFzFzŒŒŒ„ »Sy§òN%@ê™Ô«©WQW¶éupe]s]s’–Ó–ÓX¬GHIB1V]«»VƒíwßìûfŸúñ[ )ߦ|‹O#ȮɮɮS§O5B–5Ëše…*{•½Êö‡ö‡ö‡Ïï¡w£w£w#¸»ÝÝîn84°w`/$›’î'ÝÇ7›çIö$«Ã7n€¢ë˜VO¯žVÛÀñ‘ã#˜ß±¸q?Ì>™iši‚Îë °¹isÓæ&8w.î\d¶f¶f¶Â¶‚mÛ `ýµõ×Ö_ƒ©ñ©ñ©ñpaR‘T$…íÂG……péÓ‹›.n ûåÀlúl:@lol¯Ú&¸iüÎøò#¿^غ°5|ìk°<³<ƒÌ¬Ì¬Ì,‡™ô™ô™tèOëOëO oOÜž¸=j“j“j“žïÜØÓ±§cO!¥4¥4¥œÕ‹Ÿ-~!3 ¿Ãü²&jM”ò£Ï½üÞËï©mà1yLð—¿vNvN†ÏjÍXÍhÍ(tè;ôz¨¾P}¡ú¤ÞJ½•z FFF`CɆ’ %Ð^Ø^Ø^V“Õd5… «8^q¼â8ä_̯ͯèTCèÃ7÷öÜÛáŽé…Ë3àøá{!zÞïy_ˆ¨•Æaã0Ÿì*ØáÛáþÞŸz§z§„8#Ÿ‘ÏÈBlY·eÝ–uBœ¸tâÒ‰KBÔ—Õ—Õ— q¾å|Ëù!ÌYæ,s–wKï–Þ-ÂsÒsÒsRˆ˜¡˜¡˜!!Žþê¨é¨IhïKB>+úúúú„Âev™ø>$Ö(Ù]²[û%äN¹'ÎÝZN êÛò衇 —\r#ü>|á#Œ0Ç*s’]²Gð©%gKÎjzfÜ é†Iä+J}0¹irÈê˜<áwúxäFù‘üÔOÕcê1'ä yäb¹X.%OÉSò€J*©E§è0Ì€2¢x/¨…R·Ô'TÑÜö%û€aÎ0çŠÒtõyå÷ÔÔÿ )³Sî’»€)û•ý,+yðÛ‹g™&‘‘ãÀá}¦RÀ'wËÝ‘Ê0ú`ôÿTþÐ]IÞ‘¼#w%§_;ýÚ2@;PM51 ¹$€ü¡ü!>PûÕ~tè lkq-_[¯áiøËweˆ?XÏ‹üºxaßc/æ ö?œT>º€›£ˆIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-61-red.png 644 233 144 4167 14774263775 15624 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü,IDATXí—LTWÇÏû?±ìR- ÌZãêî Á믲€Bv´‘6¨4£Q7"Ú±˜`Ø  VT$4f×Ôd´6 D©†¥*M7®?J×Й©Ž­ua†:ðî»ßýƒ¹o~Äj6»çŸyçÜ{Ïù̹ßûî јý‚BLNooo•þíDŽk×<®yÕR•©LewþJói>ÍƆy©¤’*| ÔçUb¾X/ò‰ü¡õä”Pž`¾b*¦b¹)t<æ7j³Ú¬67õK{¤=Ò$*z0z0z—rzszszuÖ=Z÷ÈMÍMÍM øb\ÌëE>‘_Ô{5ÉõgÕÊÙ#{óE‡fÎ(œQÈ>8Ùu²ëdŸä~î~î~@^ aCpÀ¾\ÌëE>‘?´Þ¬ÚWóQüÙ);e§£]$H½–z-õš¶Ì6jóÙ|°Áo<‘¿Éß„ÆÊ´SÚ)€-d3ÙL€™ÙZ¶` Ù¶`e¬Œ•<‘'òDhb½mÔ6j…Mä7€CêÇO1Ф&©Ij"R©‡ÔC _‹UååšÙûPïÒ»àÖ||îÀ·øÀºÑ úN}'÷qÁ'øàÃc­'ód€ÈWóÕp‹iU‡3kfQ_ð>Šxñ0âá/&ÄWÄWÄWðÙögögögðçq³´½Ú^Àø€ÛÓîi€á¥ÃKl%(¾o^ÂK¸Å¼þôþt€}ÄÍÜhÜögö§ö§õÁ§©EjÑCb ® nsÝf¾ÝŸÀ«5i½Z/èNÝ À·ó½ïcÇ ÔNµjÏמæÕ&i“‚ýsÌà˺’u%hV“Ïëó®·® ® ®€o7:ÂGÜ€ªþUý«úWâ &ñ°#,ðóÈÏ# æD͉àxÏížÛÐ'÷ɰ̱Ì<þîÒw—Ʀ›Øz¶>À-ê Á'@¯=²öÈÚ#oÆlÚTm*—%·$·ÀöÌí™àS| <þêñWÐv­í¸î¹îÀÝ[woÀŽš5g‹³@ö¾ì}AvéoëoÌÆ:Yg ¾à|~P´äÞɽ“{ǘÈXºxð x`ªgª¦}9íKxcãƒ;UTTT²õ?h?ûYÞ,/¤˜SÌAa>WŸ °?³Íls ~î¢ÜE¹‹Œ÷v‹ì8ïìrv9»È擇Ÿ?'EùÓØm•-²…ˆ<Þlo6Ñ[o ÝÛuoÑÅÖ‹­DDuuuuDD’/$©qj\ð«Ýè&"¢´‚ˆFüáûÔG}Dr«Ü*·’Œ—Ãåp9È&øH6ËfÙ<úÔßâªSŧ& /› $/Hà+v;‚;5xpð ÈûåýPóMÍ7x‰ewewÐR§¤N DÙ¹‘ïF¾ Ôë¬î¬î¬6:¹CJ’’¤¤Ñ§¤,V+‹K+Å)3Í4Í4Íd³ìëûšûšn¾òÀ¾€qMãšðOßùô(M(M¹D.€›‹n.zhËb¼)¦€Õ"®çéyðyáµym@BiBiB©n\JŒ£Ä|<@‘™‘™‘™DêUõªzµÑi¼ðsÓ¥c{t–á‹Ãáƒ5/'/€WhsÚÝiw ‘7òVhA®ûýãï0ý û  0VÞ,<_x^÷€Û”mʶ»Æü‰. µ'"’"’"’ ,e–Y–Y|¥Qþ—ì(; ¸݃Ü#í#íÁ€ü{þ= ½|Æ©9æ9°‚þèþèÀVŸñœ¹tæVWh¥\)Wþ´JŠ“â¤¸ß TnWê&i“´)½^j”¥F¡}—µÃÚbmÕÐî^v]k6t>ý3ý3À-Ü îÀWò­|k ¿ÎFg½³0M0M6MÖŠŒN–+åJ¹%Ã@3“™Ìj|€5Ò(M-§&j¢&"Å¥¸×­ÆÕZ__«EÙ÷Û+í•ÁÚÕ õÂà†‚ƒð 7+ÚÑð úiýt ¿yÿÌëÎëf{hHR‡¬cwÇîŽÝM$gÈr†tÎOW 0'û?7(”Ê©mö¾Ùûfï#Š(Œ(Œ(´4´›–‘–‘¬]Ý¢[àƒVX¼À ¼:ÕsÙ\67Ðßš%5Kj–ð•Æ]åüÉÿkiBèNK—öž¤0÷z¨?aL»ösAÚ-³”i7J‹Ò¢@úý‰þ$ Åô °Nì™Ø3±‡çšŒ”#åÈ “â‰0¾ñôê€R¦Ýœ—h·ÃÚЮ֡uh o8v8v8˜78opÞ ›chñ¬rV9{|¹š_zá€oÐk,0A$ø9íVÇWÇWkQöF{£½€>ø0(H-m–6K[ൣ֫õj}ÿ/ÉÄ„ÕõÇiÒëÃM,Øè×î…ŸÓîŠ5+Ö¬XЮu¹u¹u9Nsc'¤|)_ÊO/ -#¿«+Ñi¯ÓnŠR©T*•Ž…8¿"¿"¿‚MIIÑþelµKq).Ë j j ÿkG±‡ÕOÿ£…k÷`¨¿â¾´EÚ"m(‹²(Kÿ­<]ž.O$’H¢¿_7yM^“—H¹¡ÜPnHWü 7„íÜÿÍ¢Œ§LʤLõëÐáý2—¹Ìé²tYºüøWcñ_[ÃvÆ–÷µ[ýÞ®')]³IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-30-red.png 644 233 144 4274 14774263775 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜqIDATXí—kL”WÇŸ÷2r•AZuèÖ°^!P²êš*ˆ V©QjE[0e´R­ñÚ¡iB´F „õVšj¬DlŠ3[ê%Z”Ý*¤Ýêf5ݵÔ*ÎP[ˆ2;23ï忘óÎ%YÍf÷ù2óœó\~sÎÿœ“!±D 3~n”5ÊeåþˆÕ2ªeTKá,QeQ¾~Œ²)›²‘iµ–DId>,žå³z¬~x?~n8O(ßÚB[xKø|ʱEl[,¹­ÜVn«¢Or%¹’\8_|»øvñm ¤§¤§¤Xž»ë÷dâç„û?âùA~°;›­ÐÓÓ“üN}G}G}‡ëîw÷»û Àƒ! a@7ºÑ h~`žÅ³|VÕï7ñ£'ó‘a4ï༣û+{%÷Jîé6¿Ík󆀩™j‚šIÞ!].rŽœ-gr‘¼P^È9ržœÈ;äL9P3Õ5ËgõX} 8¬¿a´†ÆY8 g!«Åj±ºñK(¨-¨*¨’Š4°wå¹n©ÑßîoÔîÀ„¯âUP–)Ë(,zèø”•ƒñR£|L>¨ï* JÜ,¸ ¶`{Áv©ˆõg<Œt÷t÷t÷ýövv«éöv·Ý@·¼W©T*@n–›¸]F—†«†«j9È"à¿å¿À=àð€ÿ¼ÿ< ïU>U>ÕrÜövØÃÃû†÷ÕtÆ£ñ‰›ÄM⦫ÕlâpùáòÃåêº@daµìqö8Þæ¿09V0Ú4ÚÇÍÇÍ¡¼Ã·†oÀk…¯†Ä{“ýÉ~øºäë X¤믭l©Î¤Œ¤Œ¤ Ô>,|8íá4À9œƒ„4ö›_Jy) 7 7à:€‰@׫ëÙ&Û úùêç þNühoooS²)€;ᙄg¤ ¤¤k ÒÃÂþØþX€ñ0>ú§¥û–î[º/øËd›|Q¾ÀɆÖþ¶ö7°,±, ]„3 Î,§ãÀñ«ãWÈ»“wV_Y}%4¾ç^Ͻvž>5 ȶÐxããGjŠÎ¨3êŒÚ‹¢ ÚGûˆh,ÅQQø†qDDK¢—D½Ø÷bQq[qÑ+Q¯D%Æ$Æ}ÿå÷_Í´Ï´‡Þ,q†8½MoQtÿý?Ñga×O”®Y׬kÖŽü”(N9:޲yy/ïåI6ë…õZ‹Ÿñ3 ²$a©°”ˆhÝàºA""Ó^Ó^"¢KÞK^"¢k¬%"Jü)ñ'""ïïƒP.…K!"¥£DÔE­ÔJÄŸaMœÝÎng7ÙñE|_äï ,qíñ- GކH Ú}È}ŒsŒsx¿éú¦+t—\ªK =\'Ÿ<‹l‹lP:·tnH¸Ô³¸g1ˆ_‰_òÉ/Î}q.Øï/û/Mº4I{×sY\—åï#a†0C˜QUÃNYÚï õ†zy¢}…}µ}uðúPó§þ2õÈéÊé ^Xxa!TN©œÔHp××âÄw;×¶_ÛÀ³ìþ²û^Ó;¦†V ­€×_ƒ¯Ȩš^2½DÑ!EHR> xc¼1ÞH$^/‹—›Ú…¿<ÿÍü7åmŒT1ßtÝtÁ k†œ!ð°|6ùÙdøÜþ¹=ìz:=|J«K«¸I%ÀÀÔIS'ÊÇ“.&AeѦ¿½qðƒŠG¬*„Š®ñcœné²tYº¬î–`ÞaŽ5ǪùÚÎñõ… ¸:]Ü~‹?ì.TûÔ>@,bxq7` k Ë=G=!Ò:1xb׉]xY{Bkø¾f¸ÇãÆM«þ®I}·Š[5ÿ×ÄàN0­(­mŸÅ«¦ÝmÊ,e ¼Ê1åX(/žÃs |«| ¨ùê'ê'A)9šf‡H‹6ø >i“¶’»„ÂNs†VDET$‚¬y”Gyâ.²…,D‚SèúÞ9£=­G u†:IoÏ^a¯Õ®²AÙ(Aà øV¼…·u¥R¨ÂËÂJ¯•~Wú¼M{†ÄAqк;usêæÔÍD|_Àp'tåÚåø\)Üî w¹³é•é•é•D:“Τ3YwkÚÍ+È+È Õ®bVÌð +¬á¹åÉòdyrP‹u3ëfÖÍTóY=^§×éÃ#¾!:|§¹Öˆ­'.Âm÷ Ñ#ÚµŸ ÑîóŽíê%½¤)½J¯ÒÔb':Ñ Xc:c:c:ÕbM“ñ|<ÿúÎ)Šà‹¢'uÚ-暸&®)T»Ö6k[P»R›Ô&µi€ÞÇ©S§Ó]Ó]Ó]ò$M‹ÍB³ÐüÁl&µ€ô"è) `‚Úu Îíî7ì7ì—ôö&{“½ €^xáb¤æ³æ³æ³ÁkG<"tþ’Äü5¢o`œbŸi,áõ€vOÿ'íÎ[u«ÿ 49.…ñÓ–IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-81-red.png 644 233 144 4162 14774263775 15621 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü'IDATXí—LTWÇÏûˆBÙ%i@vkU\…@ü…¤òK`HÁFCA ØBˆÖ]+ »Q„`eÕD-Öè&–"£1…ÕV a­J£Dj–„4Zf¦:›§‚ ìÀ ï¾÷Ý?˜ûæÍÄj6»çŸ™sî½ç|Þ¹ßwï Ñ´ý†L̳„YÂ,¿}ˆÐŽÐŽÐŽü4™ÉLfý§(•R)˜ÖšH&™dî¾ÖÄçóõ<ÏXOÌä1òm§í´]lY wÈrGû°°CØ!ìÐA¢¢G£G£Gqyí½µ÷ÖÞJ–>,}”d–d–dú}>Îçóõ<ÏÏë=Ÿ‡Ä•þœ£â˜8&ŽÙSy‡â«â«â«Øû'{OöžìÕfºž¸ž¸ž A‚ãÇ8;ì°ºïçóùzžç¬7çèóùÈ):D‡è°_á 2¯g^ϼ®¬°NY=V¬ð™–¬½¤½…Õ)—•Ë[ÌRY*À Y+Øb¶˜-X«cu€–¬%kÉPøzë”uÊ:+ϯÔ7EêhB»Ð.´É rƒÜÐú=_Û”[›[«ê`°^Ö —Ò:ež2šÝ7àE%*@-UK¨P¡Âo^œÁ@³k1Z  ´j¯i¯ÚZ‘VŸ–Û”{ ÷€RÈësÎG!B„f}¬X8 à}oô=˜üdòíN€öŽöhjpM¤M¤ÀðªáUûX+Ôô6ÀeûÅöØöOy}ΣóÉ[å­òÖ[ |àxåñÊã•Úf_·ÒÎs9>u| À³b÷ŠÝÀôk3ÇfŽÀéòÓåFÞ©©©)£ÿÑüæð˜»ÍÝþ¨Òîq{ܺëæõõÎð‘æŒNŠNŠNBÓpþôG8$ðg®~·ú]ˆï‹ï€›7`OÒž$++€á9Ãs`pÿà~HïNï6>Øio¤ú¦'°ulŸ{888à<œƒXspÍÁ5ýOƬÞÞœ<”ÿmþ·–’–bìTww¿äÞÊ{+à‡²Ê`óÎÍ;`¶u¶ vì2,wª¯¨¯ÌÊ®²«þúœ‡óù@ÑYÒ_Ò_Ò¯Odl•·ÓÛiú®ú»j#ÐË=/÷ýâ±â1ã|å å £ov›ÝQ˜Qh©‰j"ÀþÌÞfoûë—,)YR²D?·;Eß— Ž^G¯£—¬qò³ÉÏH’¶„î ÝG ¾g;~*œˆha×Â."¢ý ûˆˆ6^Ûxˆè›Èo"‰ˆ¾øšˆH~S~Óxôá.îQ6e‘×þ‘îÓ}"ñ¢xQ¼H>0’œv§Ýi'+ç#±P, §ûZÜô·í§ËN—$0cdbd¤¥ÒRžçOœ7vjÔ9ê*¢"8´åÐ<à z z(™‘™‘þ(;ïýÉû“¿ÞÕæ«ÍW›õNþQHR„”©Ç$-“–IËjù[–ð{Ó€i€Í±­º=t[OàÒrÌqæ8H\¸€öeè—¡°§sO'0}‹Àû7î? ÔÌÌ €;#!#@«åj9Ï´3Ö ¼/Üêÿ?>£™vÌ-IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-28.6.png 644 233 144 3267 14774263776 15061 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜlIDATHÇÍ–ÿOTWÆßGfšÖ8²Ùl¤R¤AI“n$Òªk XÖ¨¥ÖȲʚݕš´é&b‰±[܆W²ÁAÀ¶‘Y†ZZ(l¬Æn‹fÛmcQJ¬›ŽÌQ¾Ì̽÷³?Ì\†l÷ðüró¾ç}Ÿç¹çœûÜ# ""EŸq+ãVÆ%Eâ¸ý±¼i‹iËÏß‹Ä Š Å„GmXÖ¼¬YŒÅú¼^¿¸_$†¿˜OÏËcK$8†¼h| J3J3L+"qí0wš;„¡üBùg‹³…J¸óÅ/|y¾<ˆÅú¼^¯÷ëx‹ñåØÿð‹€ñcãdž۰4a©¬zvÕ³OЏžÛvÛv€ÑøÑx-” À‚E˦™F“‹b}>Z¯÷ëx:¾Î§óGôX7Y7‰pºÐ_è7Û# ƒçø[UKU h—B¼A#X@E€úðýð}浩µj-`ךµfí[í[`NÙ©ìd¾°x&š°,àý¹êTÕ)]àà9 …³¬yּ؞FŸ'óy²ä™’g@K}Ì0ÚµN­#¤úÔ/Õ/Ñ´]Ú>mßÂJ¡-×–kË'I%5–ç0…¢©*uJ!À‹´£ø?-É,ÉÔžÌ_´•""i¡ÏÜjn^®TW*„^à—éî·Üo1Ê ííñ«ƒÕÁjðØ<6 ÂáŒpÆ"A8baøgáçÂÏÁÄÜ߸¿a&´:‚®µ®µÀ?tþˆÑ6Šˆ4~ß>ø6Ü›P×>ÿÁÖ¶­m´'鵤×Ðò~›WžW®fW³«ŠÍÅæb3$ßM¾›|ŠÒŠÒŠÒ`Ö8kœ5ò£Q6\6P6–ý–jK5Ú/Ž>}øéÃà-UûÕ~u-TfTf€úŸˆž8uLD$çC‘šÂ‘N|TðQ!ÛUîZîZ.Á{çî¸wB ¦[¦1Ó˜Hy~y~y¾ˆÛáv¸"½=½=½="‡ ¹œu9ër–,Œ{½Ç.réÖ¥±Kc"ý¿îßÔ¿I i «»WwKð»+C)C)†l‘-K·,!)ª‡•‰·oi˜xiâ%¸»ÙWà+€Q×­?´B_aŸ­ÏéíéíéíÐiê4uš`£m£m£ ,‹ÇâìƒÙ³¸Ü?î­TëLëLë ëõÆzHÙ‘R’RÏÿfûšík`úwó¯Ï¿àYáYš7Ñ™èÔqRÿ}ü÷<%%†aðÈO..ëZÖ%S§Ö4¼Ðð‚È‘ê#ÇŽé´vZ;­"gÀpŠˆÜO¾Ÿ|?YD›Óæ´9G•£ÊQ[±ýúô‹dÅgÅgÅ‹ÜþûíŽÛ"Þ*W9s£)·)W¦D’k’kDT‹ì’]<§^ׄk 7ÅùÈGîˆt]ïuõºÄú§¹ÚÄÚD‘=¾=Þ=^‘çˆsÄ)â¾á¾á¾!âÙàÙàÙ â8ã8ã8#âóûü>¿ˆ%×’kÉi·µÛÚm"©ù©ù©ù"“““"ö!û }Pdlx´{´[dÕÖ”±”1±ŠÌöÎöŠºµ ­ÂpS”ß‹ˆü» º^îzºo^}÷ê»Ú¾-¿Ú<¿yžùm×·]Ýv2K3K3Ká¢ó¢ó¢Ζ-;[ëö®Û»n/´xZ<-ðõõÛ5Û5Û5ð'ù“üIpÞrÞrÞ9ƒ9_å|gšÚ›Ú™šÍ>ÚÞox¿èˆè‰ÚEãgP±µb«~2Ôµ |¢|(L1…¶phœ8qC 1´è³  ´ÑFÛ¢| )¤§©§>f{ *VÅ ¼¡óU¼Yñ&ŒèœQÃU>Õ‹CŸÃÓÓÿuþè¿’¢E;ý+yõñW_èŽs „§ÃÓÊne7ó ]Ñ®`À±XŸ×ëõ~OÇ×ùtþˆž‡ùvñÐÞÇÎì«ûÑœÿü”~IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-37-red.png 644 233 144 4240 14774263775 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜUIDATXí—kp”ÕÇÏ{IB ˜†Q`ÓÊЂ #a¹$x‰Žàd$Ì$( ƒ"jâ…hÚH†fD¢t(ì?pS¤QÈ8h|ˆ]$•\ »1d³ïå×ÙóîeZ™Nû|Ù}Þçœçù½ÏùŸsv…¶_ˆ8Sg¥xS¼)^å§Èƒ´äƒÉ“Ο®›º©›­ï‹©bª˜ Ãa{“Ð….téC¼oo’ãå|™O毧Ίç‰å[+ÖŠµª'>ž9Y?¨Ôzz•••ô1}cúÆôññÂö…í ÛaÑåE—]†w‰»Äõe\Ž—óe>™_Öûy¡ÎŒ÷'lSƒjP ú§Ê/_>¾Ü|¹¾¥¾¥¾Åè ôz úé§ðãÇŽ‰Ëñr¾Ì'óÇ×›°íçù„k´Ú©vªþc2û”û”û”q_G¸#Ô¢ƒˆÙSì›ì›0Ìjãcãc0óÌ|3Ìbó~ó~0óŒÉÆd0«J£ì)v–…!çw„;î긋÷)wŠ;ŸÏîTýª_ÖwvÐâQ@pep%ÀOÉ?%È'Áö`;˜›»Çuí í"àë¾tÛ¥Û¸æªqÍrͲ'J‡O_£¯ÑלÙ(;Êv”í(³ŸT0<À7Ê7 Ý=ïîy0¼­Ò^O{`¬EÖ"€±£ÇŽŽ'¶ˆ-@(õÔ7’ª“ªÁð¼:óÕ™Î[ì({ûÖ·oµŸu:Ç'ì®19crÆä°©w~ï½wð!b-{ú`惙®³®³­j« ðœÿ9?@êÔݩݩͫ›Wì)ØSpøðáÃÕoU¿”¥Ènéjér@Þù]½]½ y$Ÿýý‚- ¶,Ø}3³Ã»ðÙ…XÀŒÀŒØÎÖ¯ª_?¶ûØn€´½i{£ãxÇñaw‡»£õš·6omÞêtr•’«ä*¹á+BË×òµüªZ¹Ë²åªwÕ›|Oú–ù–Eiì¹·_ºý@Þ…¼ €}ì¡cTN®œ  ?¬? ðå‰/OÄ‚–ž/=Ê ‘ÇØ‡ìC|Â'„°lȩʩʩ²œ @ËÔ2µÌw¯‰´¢´¢´"!ôÏõÏõÏ:¿dî3sŸ1_’嬊oú¾é#„7ÇÌ1ÙÁ›³nÎhÈoÈçßX^Y^XùéÊOAžÌÖ»áiáiÑ¥.ÿºüëò¯­p…¶B[ñÅÃ~ªÜõÒÆoOÊMÊMÊõï–*ª+FVŒ´ç:ŠËß¾úÚúÚ€@ØöÄ‘­b€ý•ýêvBGBGÀ,³ÖY1»»1Øx­ñ8Wh­Z«ÖÎWÆ*c•±wÔ'js®Ô¥ÊReé¼JƒÒ¨4J­XÏ{Oz†IZq´âhÅÑè±£ïÔwê;Û"IRÿšP7ò\Œ¼`¢É OE´{ø?iwΣsóhT»Þo·€?Çmg%”R¥T)W_F½šPWÿ¥ÝH»³´Z­V«õçIàÒšÒšÒûS†¦ M2þî,u—Ö¥uUŒûÄ>±ODŽÍ—P/Eü–¨Ý ñþœ ÊÓÊÓÊÓ ˆ¬ÛÕqê8u(BŠøËéììì!´3ÚíŒr"2qqÂÊýß,ÝùV$ŠD‘~6>üZ™j«¶jƒr\9®ÿç/‡ŸÿÚ›°2 yo¸Ôÿ éÃ"M·1IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-84-grey.png 644 233 144 6166 14774263775 16026 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü +IDATXÃ…—}TTÕÞÇ¿ûœy=ty½…iLÃ@ ,.¢`I#/¶J¹¢KÅX­D„ÈéóÔE%¸Ðâ†>¦¬V¶B­G ‰X„è`7ÁR ’³xq„d€a†™9söýÃ9xWwµÚÿìµÏÙû÷ý¬ßþž½‡Á›ùaǬܒܒܢ­EÇŠŽ£ JÆJÆJÆ’Ÿ£>Ô‡úìËæø> z›½ÉÞdo¢å¨E-jIBŠPÀ€m؆m´\¾F¾F¾†HîIîIî]­%“d’Lþ½¦Ø¿Ø¿Ø¿­·4³4³4“˜ø`>˜&)9„‹n.of0qˆc¾J„¡D¸è˜uÌ:fŸXRÒ\Ò\ÒüÕ°Ãä09Lº+Ö(k”5*ú=zô8ˆ–è¤è¤è$R#‘ÆH%¾K|—øâX|/Î׋ñæã»õD}‘G䓸3øõ¤žÔSÈ [ÉV²5ø ̳Áß™ýröËÙ/ŸöõÓùéüt®]IIIŒ3\®דTy¼@^+vc7vƒƒVX¼Ž×ñ:€@"V{=È„T}‡¾CßAçCχžvýºê×U¿®Úü1ÌsÁË®­®­®­‰iÍ¢Y·2˜Há\á\á€t #èO’&I“¤©ã¤Ãæ°9lO¯V½¨zQõ"—ž—ž—ž'ùÊ{Æ{Æ{*H!…¼p]¸.\‡„Ä“xÀžð0ƒÌÐ@ @ Ä@ à1 L@b&fb&:}ôôÑÓGùŒ¡ö¡ö¡vÉe™R¦”)oŸá×ðkø5ñxÄÌ0Ê.e—² ...øçëëë™§W«^Q½¢z…OÍÊÌÊÌÊ”\öŠòŠòŠÂŸ…@!Pà„NH˜›ÌMæ&€*T¡ ·Émr &b"&€\"—È%€¾GߣïAB? Ðo§·ÓÛ‰?‹ñUª UŸ*ê‹<"Ã[x oIYâøÖñ­ãÛÌ¿ø¥û¥û¥SuzCzCzƒDôÈ4ÔPC OŒb£€}¡}¡}!À{ñ^¼@2HÉp'ppg¨F5ªòyŠ<ð7øü À™ìLv&ÃSŒŸ^’^’^"ùJÔyD>††ÒPú¿:µN­S ¬¼¶òÚÊkHò®ó®ó®ƒÌÈsfõÌê™ÕÀ‘·¼}äm ¬¤¬¤¬(·–[Ë­ÀÕª«UW«lÂ&lh£qrƒ`æìÌÙ™³@å†Ê •€ž= z@lžÞ?xÿàýd¢¾È#ò1¼šWóêeÛ}&|&|&POªÝ"(t:094949lß²}Ëö-@lNlNlИݘݘ Lë§õÓz€\&—ÉåyœÉ=“{&¸c¾c¾cD_´ÑþEûQ ,T* au¥ºR]©ˆq,Ç,Ç,Çïpïpïp H$ ’ª×T¯©^˜¦†©, ‹Â¢x¤%õJê•T` o o ðSø)ü€k£k£kã£y®g\ϸžD¹G¹G¹V‘GäcP†2”‘PæsŠ95¿NŽ àQ „O>Iøöì Ø^{xíáµ€æªæªæ*¨TªÓYÓYÓYà¼ã¼ã¼HkJkJkdddÚI;içd´èx¤Ïla¶0[Æa&¡ À°ôëé¥ÓK§—bOäùD°l7ÛÍvƒŠ+» ݆n¤ Òi¤·’ÞJz x~êù©ç§€aßaßa_`|x|x|øî—ï~ùî@S¦)Ó”¡ëB×…®ççç§¿Óßéÿˆ“|N>'ŸÏë±³×f¯Í^à £bTŒŠ~Í(ö+ö+öó•ƒþƒþƒþôëže=Ëz–xoâMØl©¶T[*й»swçn Îgˆ31…1…1…@Êæ”Í)›{ˆ=Äteweweš Í„èUô*z@EcEcE#À(£ÎE‹:èÚuíºv€a†a`3ž2ž2žŒ£ÆQã(þO1¨T ò•¤#éŵ’I‚$áŸ{Ú^n{¹íe—JµJµJµŠòÑùè|t˜V_W_W_‡g{w{w{7àìì ÜÖÜÖÜÖ.?—ŸË‹ ‹ ‹bĈ9X=­žVOÀÙæls¶uëêÖÕ­–·,oYÞ¬[¶" v¾–¯åkÁµ,nYܲXˆ#Fb$Fæ2Ñ-Ñ1“϶ø³ÅÀXûXûXûñ_fsfsfs¶…ì ٲ˵sÛòmË·-g+Íõæzs=ì¹¹¹ëŒuÆ:€SsjN $ç'ç'çËZ—µ.kè£sQQ¼ž×ózà#¯¼>ò’ÞOz?é}И/b¾ˆù¤~ª~ª~J°vÞë¼×yá¸An¼±ÑÙìlv6ÇV‘Â;…w ïèD':Ÿ<$“ŽIÇ.*-:‹Î¢{:+±7±7±—&¤ô§ô§ô“ÑlšM³A;w>ÂF³Ñl4À®g׳ëìÀìhM£i.â".äGò#ù°Y‹¬EÏÅsñ°þ<ùóäÏ“ØpÜrÜrÜ‚ï89'çäs«(KYÊFo@ÂÖ—Ã0µL-SËv1LS1ú7Á ÃVׯµqm@GZGZG]¬OÐ'èp‚ÔR›T R`cÙX6 èzp' É$™$¤ˆ‘"ãÇø<àô 7ÃÍpàZ¸®…ãU2"#2i2M¦÷ $–ĒؾT¢•’ w™çŠyX7JþA’ƒäà¿ò˜•ÌJfå®&¼7ðSÕÝÝÍçšËÌeæ2p¤œ”“rLÓKô½wÈ;äOâI<9_ 7p7ÜÅ]Ü…]¼‰ZÂZÂZÂ\;'K'K'K%‡äÁò`yð‰RM¹¦\Sþñ÷(F1ŠÉI`€OëQ cÃ|/ò‘|ÒôÜ7Ï}óÜ7•kÛÛÛO”NúMúMúI̧}OûžöuíÝÕzè¡`ƒ ¶Gw=]B—Ð% ¸û¸ùOÆŸŒ?iB§¼SÞ)g+=8΃™sœtœtœ|÷ÃÞâÞâÞb€©‘áåÖ9*‚ZÝý)á1á1á1xõÜí¹Ûspä;òùï~èáãáãásëÔ@ó@ó@3[Ùº¾u}ëzš@òHɃ\8.ŽƒB %”¢St <á Û¸qÜ8nÄ ]¤.R /“‡ÉÃK…¥ÂÒw?|h½‘9·=Ä¡)â@Ä×ýK"wÝ[ÄVBt®$ŽÄ‘¸„µ9¾otæ:s¹ÂŽÍÂfa³À¬¯¯¯À¡_èúÁ1aL;_Àðòiȧ!.)ÖkŠeo*"‘ŠÈÊå?š]—…j¡Z¨–rïìßÄ+-----Å´˜Q¸Ì{ÈíÝnïr{÷Ûyïf! YLU³³ÙÙìäsÍ5æs 8÷Á=%f¢ÍÖfk³ Ö‘ê‘ê‘jö¦b¯b¯boo‹}Ô>jÝûñÍ—n¾tó%À ¨r¯ãD@‘oô7ÀâÎàG·wÿË»““s}Q}Q}‘k§»¢÷Òûê}õ¾¨ëèêèêè"\?×Ïõ‚JP ª%›$›$›lÏ«cÔ1êæ[ïewoû-‹ßiZ­V«Õ‚wõTFeTFÞ4=kzÖô,¾p-t-t-¼ÂËÕrµ\½®ê~âýÄû‰¾ß˜ûÌ}æ>úQÏÑž£=G]/Xœ§ÅÉæKWHWHWüO­¡5´æÿ[ ‡rvð„@q܉âËCðíw¼[‚V´¢ÕUL›hmÒ˜¦iøA=÷êÜ«s¯ ÏJ«¥ÕÒj¦Íb³Ø¬óí! ! ! ÉZ£Áh0ÈYá á á zÄ·Ù hý=Ð~ã]÷qá*Fò'¹J2I&ɼB[i+mýûëÊEÊEÊEL;̳ã‹„}Â>a_îÝþýû7¡vÇ KÛqü®õÔ|ãA §IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.0.png 644 233 144 2534 14774263776 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]H”YÇãG#I(Å6îD20!Q!l`lhQ‘%ik(}lÛF,BµÂvaP ÌÅ)…Ûn¹Æj´h~T7ë}x!±-…ƒ…A2‹)“ù‘ú¾ï9¿½˜÷Ì;åº×›™çžóÿÿ9ÏyŸs!„Ȱ¸²]Ù®%ÑØõƒ»·¹·åü/YPœPüw5¤7¦7,½²ôŠ|îÄz^çǯÂá×Ó¸È°èÆ¢ …v|ö­Ù·Æ¼©©S&í<Ú ÐÞÜÞÌwî ÷D #…àÄz^çëõš/ž_œûH_H¾•|+a¥,J¼[½[WUFWAÑ΢¯_'*Xo€4ÒT!0ÁzŒÆÅzÞÎ×ë5Ÿæ×zZ?êG@fAf°§lOYê/BñüT­¨Z4ê9UT‘¦&ŒwÆ;PæZs-³ü òU>館'ê ð³ùÎ|Ǭzb ƒ@'§9MZÔ¨Ñeó£õl}Ûø°¶u[ $«$Ko€ñTžÊ @ÞP±=20b(@%•T‚ Ë9C•J4;ÍN ¾µ²­ì8~£$±$Q¬ÛWJ!„ð7@j85<‘Ä­PW¨+F¸cnûû¶÷mL¿é|óâÍ m­­ƒÈpd82 3µ3µ3µÌsž9ÏœƼcËÇ–ƒZ£ÊT€¼)o2Í?Q~TÈ ™Ó·ýØÆ.݇cgŽëw¹N Ü®¹}õöUTFYFqF1ø«ýÕþjHnInIn`E°"XáRåª\•Ñð‘ð‘0¤¶¥¶¥¶AÅŸw*î8iüa¶›í@½Ö‹êk?¶±¿¾‡ÖñÖq @} r\Ž3;³qfýÌz˜êêê…û¥÷Kï—‚7Ç›ãÍWç_uÞ1Öåéòty wuîêÜÕ0²adÃÈð|_zè™î™Ž¥ÏZ³ZÏÖ·ýXrwÉ]uÂyἸZ¼P×Ô5¿ÊfÙìÀžxvà\¨¹Ps¡f~ ƒ Á†`î/Ü_¸ßÁ77mnÚÜõiõ‹ë;¸õ¥þ§õ£~\B$%‘+DrWr—ÂB1¦>S›Ô&!\\]…x<ôxèñ}Á¾`_PˆCâ8$„'Ä qBÄFRJRJRŠf®™kæ:¸‘id™B¸¿r—¹Ë\¤GõbúÚÏB;fí6³Ì,'>ÕªÿT?ìmÝÛº·ÕÁ#þˆ?⇋». ú}ý¾~x{½½Þ^8ë?ë?ëßIßIßI˜˜˜Œ;“Ÿÿ÷ŽÍ?cF´æ²ÃØmìfV/«TªÐêu‡â‘ë#×G®CQ¤(R·Çß{ÚW¶¯l_ ùÃùÃùÃÐ3Ù3Ùgˆ ³Ûìf–ÁÏØ‡_etÈu`N˜€ü¨o=â€0a€BÅÍB-´Ð‡ÿD#À¶³Ö2k0ó¿_e\#d…,`Òî3ÈËò2Ó²[¾”/AÔýÈM4Ñ–²”¥Cr£Ü(7‚õ…µÎZ²M>•O)Ëe9ú»Ü !cÁ>öAçw—¸µªñ¬>«˜”¥²Ã.®LL@baãŒ3(;ƾæt¾<,c€õÀzϯõæuþîÊØÝUå©òÄ:€ZjI‹•«Ü*gÔ=u€À‰õ¼Î×ë5Ÿæ_ð®üd_Ÿì{ìÓ|Áþ .ò^ŒÇFÃIEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-recentre.png 644 233 144 222 12610450011 16732 0‰PNG  IHDR Vu\çsRGB®ÎébKGDÿÿÿ ½§“:IDAT(Ïcd üg````b 5`$ätuLd†×†ÿ¤(ÆjíRóŸXÓÉŠ’5° ÎØ [ÚÇIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-15.8.png 644 233 144 3127 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ýO”WÇÏ ¯ƒ òbŠß(M¶ b…µ ›’´Ö.D 4a©ÙJ*éÆ ãº"5bÓÖmÕ& ÁÂv·YÂHŠÐ­V~ÀmSL×åm‹h¶%23…aÊËðÌóÜÏþ0ó0¬íàýåÉ9÷Üï÷ûÜsï9W@DDÖ¾ÖõÖõÖÕ~ÛúÛ ?ò•ÈWžù»ßnÔÁ²Ç²gèûQìGq­q­ÆhÐ6çÍø•ëE‚ø+ùL¿¬‘ #âbÄEK~À~ʶ”m‰\ë·ßï[§­sÎot½ÑðÙ'Ÿ}BL~3ù Àtþt>msÞŒ7×›x+ñåíÇøE ¬'¬Çò_ˆ/o|9õ-Àx*ì.Ø]02¢¬ ;€h¢U>àÁƒ9œ+ls>o®7ñL|“Ïä÷ëH|1ñE(~­ø5[ šˆÈè§P“R“äh´óï ¾û¾û ¼¾r_9^õÐh3Ú@9 §á¾UïªwôJ½/ø\>ðgši&Zý#€÷×êöêvSàè§ü¥È[äµµ˜zäÿs{æ%ØûãÞA½ }­îp”£ªKu¡áä.wQøøù±È +ì§Õ‚Z@©õº®ëhÀ<ó l~|¶ï-Ø»¼ƒg^Z‘J‘_œ›Çæñ„rs샱–a=wσæ}›}›}›ƒ|³ ³ ³ ðèÚ£k®£ÖQë¨}•¾J_õS½K}K?,ýS»';&;˜÷¥ûña–|L¤óVç­Î[²<ìùö|{¾HBrBrB²ˆû„»Þ]/¢Ö¨çÕó"öN{¼=^\"‰!‰!"ªA†dˆ «`tÝ–Ñ´WµWE,DD$Ñ^ìYübñ ‘Ðm¡ÛB·‰Œž=;zVd¿k¿k¿K¤ugëÎÖ"Îg‰³D$u(u(uH¤£¡£¡£A$j6j6jVäÁÁéPF‡!âü§£ÝÑ.’ô»¤¨¤(IYt/ºEä”ÊQ9–‘À­¨æÛ¶/Û¾ ýg, omT­Ô ôg÷g÷gStúÜés§ÏAnXnXnØcì1ö˜)›)›)ƒ¢µEk‹Ö‚Ë겺¬Ðt¤éHÓȉαæXႯéã¦ñúÑÔn·õµõ3ÏË·òxåq“ÖȟǬè ðâns›Û€±¢ôÒK/P@+ü§8Å)à;†^çÖ3õLÀnòU­< [¹\Ç”í¡í¡'cLÓ‚uÌØ§}¥}Åõ&ž‰oò™ü˽ò‰}]<±ï±'óû?0ù#:2‘wIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-30.png 644 233 144 2514 14774263775 14677 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–oHUwÇŸëß+\RË…/¡ÈŒ’¬›½HcýS#©L ’¹‚1²–µÓ _¬9—dX±„$§÷¶Ä ©¦F­Æ¦+!"z!ÞHE˲¼çÏï³÷ž{îFÍ·7ç<ÿ¾ßïy~¿óœŸ€ˆˆÄîaIaIaóüvØç¶ß¹É¹iÉ~»ÉÇÇŽ¿¿…ØÆØF€ø ñÌaÛ¶âV~h½ˆÊgù%NlGôÕ諎œ€} v¥íJs~â·¿» 11ot(ï,ï¸Öz­•/Á;à˜Ì™ÌÛ¶âV¾Uoá…âË©ÿð‹@äõÈëŽg%ɹɹ‹¿ò'›ß¯' ì¯áÊË+/ƒ:ÊŒ ß|ß|f-Ïň‹# kAÖ‚¬0>:>:> Ëï.¿»ü.Tî«ÜW¹2ïdÞɼÞo‹·–Ö/­_Z+D"»"»Äº&ø…g<‘.q‹[äaúÃô‡é"C3C3C3"]ƒ]ƒ]ƒ"‰Ç'é)é)é)q: …AÑ´-AĹ۹۹ÛöKœdH†Ígóûõ„‰˜nÓíx$¢èÁÄõHuªNçþÉû'ïŸÙ;µwjï”È€gÀ3àééé)8[p¶à¬ÈÓUOW=]%R}«úVõ-‘ý/ú_ô‹d7d7d7Øxa:Úí6ŸÍÐó¡=F›±ÙØÌ,?ÓN»ÝðZW­«ÖZ†–¡ÁùâóÅçC–®-¹-¹-Ö­Z?ž×ž×ž×!+GQÀ£Ê¨úß=öþ¯ôiÝžèŠüÄO€BÙS ðáÃjP ªAÀwH¼™fš4RH Á{§écs~•ï™c>kΘ•f%34ÑGßG£`ÔµF-˜‰f¢™<àÀ\m®6Wƒ±ÎXg¬³Íl5[3(b¿¹Ÿ™€=×{ÏäÇšÌFŸÑ`–™ehn)ÞñŠWçÐZ¶7¼ ña0 Ùxþ'ÿÿJ?@PG.{‰£„YP·Õm8À¶­xpKê-¼9ÿ•íéâ£=}œ'Ø>ìY‘)IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-15.9.png 644 233 144 3161 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü&IDATHÇÍ–íOTWÇ¿w†•B‘4\b÷EW¬Ó%6ÑãöX;UVŒDMí¶$»êšE‰¬[ӾЦÛ}Ý,¤Iã5­lD,>6é6.EV¶­­†ò(SF™;÷ÞϾ˜¹ [÷ð¼¹ùžó;ßï÷<Üßï$IY‰¯À3Ç3ǓǞß%ûÓW¦¯üå¡8n°ÀxÅxåë¿À#=ò@vSv“ÝÄî¸?}¾”䟮çö+KÉŽ´#iGŒÒ~Ö¯+NÏã÷/‚ÿ¸ÿøD ^?ñú €cŸû„?ÀËw.Œ–Ž–B»ãn¼;ßå›Î¯·¦/¯Å×b|i©i©./\þĶx@ï°ºluÀ÷Þn¬A`&3R L· MÃîx"Þïò¹ü®ž«÷#˜ýüìç%®®÷7bJR÷§°³`gP`§™÷x™û.ö8“±ŠX“Îm;d‡À´‡ì!àŠó®ó.€UeU1 ±áØ0PÏÇ|ÌLç‹߉êÓÕ§]ƒÝŸr4è zý®ýïÙ~° Öþ´ö'p¶˜—œ›ÔR àœpN`2D}8Äøÿí"Óp¶3âŒà8Za+Œéî¨=çgÝÚmk·¹?X6í(%éWuàûÃá¾èù°çÃ)Ú'úÄ!››››ÔÏÏ϶¶6¬¬¬k†5Úñ ßh¿™n¦ÃЙûñ1"vOœnè÷_ò_ §¸~Ä¿$©¡ªöVí§À^0ú×Á·ß‚Eï/ - áœùó™ê3ÕI¡‚‰‚‰‚ (Ú[´·h/Ì_0ÁüЕٕٕ™Œ»0vaìüF+£+£q6£;£gýžòíåÛ›q=¨j«j2ã~<¤IÒ¯OJK7.Ý(Ý;(IFàÅÊêËê½²ëʆ+d¤¤O¤OHããã’§ÆSã©‘*ó*ó*ó¤£ mÞ<¼yXjZÑ´¢i…4´fhÍЩpwáîÂÝRsjsjsªt.|.|.,µnmÝÚºUZúòÒ—–¾$åŒä\͹*-Ù¹$kI–fKwËï–KžÇù’/뉿òŸÕ\ µ†ZUΖÄݬɨQàjàjàj y©÷×í¯Û_%¾_‰Ï:<ëð,Û0¶al¬î[Ý·ºFrGrGr¡.X¬ B`Yà¹Àsðµ'#'#LÆÙœ-αCM‡š€ÿÄý$Œ5t@Õ›Uoº²öˆ…cÉŒî“L׸Æ5ÀÆÆž–Úi§XŪøâí<ç9|K}Óøšb½±^ xê¯l¨jÆã~’yÌñßöß§`÷˜=f2ÙͳæY"x(¦ø~úÁª·ê­z°vX;¬`í v±‹]`çÚ¹v.ð{^ã5°¢ö“ö“`Í‹ÖFk‰ØšÊcÏÞ|ˆù{ü=áî»yìÌ_žVžæú2/1a¶N¦½ÑÞˆ9µb'±ƒ÷¹Ç½i;ä`awb(±×ààØ¯Ú¯b2iµ[íÓø§ôÈü?«•nírk%‰ÚûØÇÌä[•V%“à\t.``@»ãSW"1ßåsù]=WªV>´¯‹‡ö=öp¾`ÿ á•K«š%ÂIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-22-grey.png 644 233 144 6225 14774263775 16012 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü JIDATXÃ…—{PSçºÆŸo­BîìR QšÈµQ†ƒ(bUBð¶{ºÅÒRg[-c‡ÑGZ:u[ë¥EÊ”‚{<ÖbeWª™T±€–‹mm™íÐQZ(^ „\WÖwþ ‹ãt¦Ó÷Ÿ5_ò®çûÍû=ïZï"¥¥¥¥¥¥ÀlLÎ^˜Ü=îw6•~VúYég4´|¼|¼||õ 4ÒÀ÷ÿ·ña|XbÃà08 ôêP‡:RŒÄ ÀÜÁ(@=$ÍfH3H1÷+÷+÷ë¿ëÈò„<ÙW[ölÙ³e϶ܮȫȫÈ#c¼ŠWñ*²~–Cèôp0s€Ë° ˘z¡\(Ê…NçŒsÆ9²¸ÜXn,7Ö9ÇœcαæÖk‚5!ñ•ŠJE%.%¦'¦'¦“â$I’$I,Z´8×âÿb¾x¿¨7§ïÙOÜ_äù8O_¤~Ôú ¹$Ÿä“|U%«bU¬êêÉ™Ïg>Ÿùüù àæàæàf÷žô;éwÒï0®…¦…¦…&ò’´XZ,-†oãm¼ 9¬°Â `¶a€p„#V‡Ò¡t(ñ’©ÃÔaê ®Ö˜Ö˜ÖaÏ£5Ö_}¾šÏlllç~ð’yɼd÷/ó|Ÿ±2+±+G¦Y—¬KÖHB%¡’ЃmÖËÖËÖËÏÿU½A½A½IŸ§ÏÓçq?ø'ø'ø'à/B‚ $ÌpÌ3Ì3Ì3*Q‰J€ô“~ÒdYà:®ã: b¶DðÿÚÿkÿ¯ñQ_½Y½Y½™IÜ_äùÞÂ[xËúÅ΋΋΋yÿœœœE#³/d_ȾÀ‰1# Qˆ‚ÎáÎöAû }àkùZ¾ ÛÉv²À!Â!èD'@‡èìììþ ?ƒä 9?Q?ûTö©ìS\}pvpvp6yD>ŽÆÐs`³KáR¸€ö]í»Úw‘p%àJÀxy„äÓÛ¦·Mot º0Ò8Ò8Ò0)L “¤®O]ŸºHmJmJmÌIæ$spîÆ¹çn£]£]£]ÍD3Ñ€¶^[¯­VaV~   °j#µ‘ÚH¤Ÿ?uþÔùS€D)QJ”63|$ÉG.Ýø0ðaàCZ´|ÑòEËI öaöÍâJÏ•ž+=ÀDëDëD+ OѧèS­ÖGëZ -†`ôþèýÑûÀ·ß|[LdLdLd<•¢ ц£Áh0ý=ý=ý=â.ðÒ˜4&‰Ôˆ<"ãxìxìxŒFŽ8qŲ2Y™¬ Vúý€~NT0/2/2/’5Éšd 0O˜'Ì€ä‘ä‘ä@Þ)ï”w£±£±£±ÀÌÙ™³3g¥ÍK›—6?•¯HV$+y¦F€ö”ö”ö@Ú*m•¶ó¦æMÍ›rì9ö;v í@Ú§òƒÚƒÚƒ¯ ^¼6ªU?ª~ÄïCʼʼʼ àS|ŠOI Ʊalý—y‰y‰y îòoñoño%çÉyr”ŽÐ:HHHCáCáCáÀѪ£UG«€ë—®_º~ È Ê Ê ¤aÒ0)ÀÜ`n07€áåÃˇ—?•ñúÅë¬ç²žËzóóóh-  PvææÌÍ™›¸Ë¨5£¦ÿ"„sŽÛBl!¶îŸ[· n$ʼnæDs¢V±™L:“Τê§ë§ë§´ú´ú´z@7¬Ö ì›ì›ì›nã6n¦…¦…¦…@½o½o½/v:ítÚi@w_w_w`×°kØ5€ðHx$<˜`&˜ †upãàÆÁ×ñu|^:/—ÎUÁ ÙÈ.«ãJ¹R®”7w7w7w»Õ“ÊIå¤rÑ¢­›Z7µnæõÎë× ¨¨Šª(Ðw²ïdßIàæÒ›Ko.¦ò§ò§ò¶•m+ÛVÊhe´2PA€¾¾¾¾¾>àfèÍЛ¡ÀÔ‰©S'à ™4“fBnL0&„ed€ |BÜÄMÜ'½È'šO4Ÿh€ñöñöñö3,w-w-w_UÆÅÇÅÇÅ»wçää°Ç+«*«*«à°·ÙÛìm:¯9¯9¯DB$D8v9v9v?ÜøáÆîwºßé~xèýÐû¡7À—ð%| @Ž’£ä(`ÝbÝbÝúúÝ×ï¾~d4s4s4S°^Ý{uïÕ½ŒÜ§Ý§Ý§ý?9.£Ëè2&W‘ýÃû‡÷ø ?á§çNHÆ%ã’ñN™å˜å˜åØóúô{é÷ÒïÑ´uü:~O®MOOƒJl›Ä‚qŒc@ JPHâ%ñ’xÀ%¸—k…µÂZ€Ñ0FEB‘PÈ?’$ÿÖŸ¿ùù›Ÿ¿ÁßÎäœÉ9“ƒ¯åTNåÔ¾†²”¥lâß‹XÄöìà˜:¦Ž©c»ÐŒf4& éBºž_-»%»%»uí·Úoµß¢å°rX9L¾ÐÌ×Ì×ÌG=IOÒ“=ѽ8+üÛ²`Á>ÝÇ)HA €ïñ=¾‡ÙâkñµøÂ¯)¼)¼)œW{Í÷šï5ŸÃìÌP" ‰HìÙAÓãô8§ôŒyî¤Ù¹‘;@>&“¯²¹l.›»Ç ¦Ê0a˜0Lð;'#&#&#æÍt7ÝMwÈCò\Æe\P„"â|JWÓÕt5l?c‹±ÅØâÞýÈç‘Ï#î„t‡t‡tDZå±å±åÇ®¢ e(#çÐ~ôó:âœÿf,Œ…±×4‡5‡5‡iF®G×£;[nYgYgY·µ4:0:0:н[ÿ†þ ýìqZM«i5dYEVAŠX€dAPŽr”%<á òÝÀwß Ð´Æ¼Æ¼Æ¸ëð]‡–~¼ôc뚣Û~;¾4_ÄÁ/å³íR)ŽÁ7àК‹ú°µ~ký’ê‚þÎ(øýƒiž=õì)€Ï>ù잇øx|`®y®ÝöÛñv¾WŠ/oÜÂ/Þ/½_j7ÁWæ+@k õ 7€¶m¦ÝÓnås(§\5I’Ø’(Ñm1Þηñl|›Ïæ/Ô#°ì‰eOˆ@û¶ömþÐED®E |_ø> @$›¼I9sÆ€ù¢ù"9ÖZXŸªê€º¬.˜Ï™Ï‘#bDŒ¨ktÓM¹JðÔo{ïÞ{7ðŒÍ×~¶ý¬ÿ#¨®ª®rzZ|ö´ÀÓ©§S ^ÐϪ/ó2€RCèÀ<ó(õ’Ú¯öƒú¿Š©ޤH‘âVQÀ‡|ˆ,g¹mÖÏÂÖ¯·~mŸ`OKI+EDê?éO&=œ‹õÆzŸJÿžªJU‘ѧô)}j!éùô|zþΟß_—_3§f²3YH¼ÿk믭dæ~ÌÕæjy*{(ö}ì{¿é7“õv¡ᲈÈÑ1èz­ë5PX sïμ>ó:4…›úšúPÑÿF»¢]a"’ˆ$"ÐÔÛÔÛÔ ÑP4 -.,z z z*·Un®Ü u¯Ö©;‚òhÇ´cpøþÈ¡È!«ºÃÝaЗêõ£ˆÈ{¡ÿFÿ H_P»÷«‚Uäìs=Óy¦óL§Cl ¶Ûœáô¦Ó›No*éÝ*µJ­‚ìšìšìH§‡ÓÃ0¶elãØFÔÜûí½ß’›nÏ2µNžÍ§ù4OÈò„Ddµ¬–ÕŽ_ëÓú´>×u×u×u‘‹7/Þ¼xSdüƒñ#ãGDvݳkí®µ á³î•¾ó¾ó"’u·º[yÈ%XŸ[ŸkWE×7èD´ZYfgä»óá|XĘ4&IY$ù ù ù "xñâuì=fÙc:zÿÁþƒýEþÝð`Ã"•¯,}oé{"Ö±"ßÏæcæc"â·¾±¾Ñ®ºDK®K®»tNî‘GDDøÍÛòJËž–="µÁÚ`mpqaëW¬_±~…H`*0˜É…r¡\Hd¢q¢q¢Q$sŸVHéuéõ¯ÛÉç?~þc’\{víY5hÄúºžŸ^øé|ú<^€1a¾h¾(y´ø}ò’7J,ëSññ1ÒÚoí_‘Éææ’ü¬û³nþ‘ M„&Hò±ç±‡4b}]Ï×ëu¼t|¼ÿ_ü™5˜5(Ý'ÍkÌkrCå†Ê‚ƒ©„ÙÒ»Û»›$¿Íø6C˜H’T’´Ó.<$£ŒR‹i±¾®åëõ:žŽ¯óéü)= Ž €ÜS»§ÖÚ•*öPnÍkÍÓù’ýü ßæÛ´³W•GIRñ)>ÆE\QGHño5¤†HR{Õ^’3ŠSq2În¹[î&Å8ÙH;Û5<¶¾Øú"ɤÆ'tþ”ã(Uøh郫‚ü¢M~W~—ÿT‚JImAp‘sœ#)S¦L2Î8ã4F>ó™OŠ_ ðPã“âÏB)n¥ðIßzßz’t~¤l¿ì$­ Ö…h&9³<³Lr’$YMŠ)1ÅVæVä™”!çËùÿÒº¥uKëÈ…á…á…aò¡ë¡ë¡‹TËÕrµœ”‹åb¹˜ '‰p‚L¾ï‰÷𭼚7f:f:HÒµF£™ºSJÞŸœXh8Òp$[ í…vád›ì”¸üäoOçŸÎÃZùy凕7ênÔߨÇê(~Pü øà xžPå®rW¹)Û”mÊì/Ù_²¿ØØºñàÆƒÀïl••°Fî…¿ …Ëð.<,œ¼[ßTß”-ëz4aå_`Çö¡íC:Töc¬!Ö€Du¸Ú_í‡h ,KÄ–lK¶%`j3µ™Ú€Úµj#5#5#5À½Ž{÷:€;¹wrïäÑ“ÑO¢ŸÊ‚2®ŒCêyp®ó\':Ÿøûk–×,:ù& g4gÔùkLV2 ÃArt|t|tÜÈÛÖ¼­y[3y²ýdûÉvòø¾ãûŽï#766È Ç„cÂaä‹=šÍ¬,Î,κ ~©~)}Ê^Ù pH?GBßhˆ Æcƒ@¦+Ó•é‚'‚'‚'€ÆGg.¹tæ·Ä-q 0{aöÂìà¨÷¨÷¨¨¯«¯«¯ßu¿ øGÝÝ w7Òç)>žN„!ÀÐC¸ÕB~úôÓ§$ý$)šø{ù‰üÄ0€6[›­ÍFN–M–M–o|¬óXç±NrKÓ–¦-Mä@î@î@.9Ž GÈ};ûvö‘»æwÍïš'KVšSšCýe°h°HÇMª÷ÜösÛuã½Õ¢ ;=N¾uä­#:ZJÊQÙpt¡9•1¦9Íi’*Uªió×y×Iâ!J›Or™Ëéxéøj©ÁŸÒ#é¾XCÖÐT 8í˜vdË`aVavÃ$Þïà’h€ØL祩À¿¤°Ô~µ_íDA@²HÉH›¤MÒ&@@$D@…VwYù^ù?š\kr×äb¯ôÛY׬ —±üj﫽ËYÈŽÆ ËÿŠŸvõv>‹Ïb8?©ø?Éu¯º—IÍû…æù¤Ðv,Æci;”à WHF´üÇjZÃ$#Ê2D2±êüfŸYß©Ÿ8ÿÿé•l}©õ¥´^I~Àh7Ž@ySy“qRŒ‰1’¤D‰4b}}õÈ´úÕ^©áë|ÿÓ+ŸÙÛÅ3{{6o°ÿüïjÝò?Û™IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-31.6.png 644 233 144 3101 14774263776 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜöIDATHÇÍ–ÿOÔ÷Ç_wxÀ%'=Q6N± i¡Å±g7WÖÒnÓô0Ljbb"XiÔÖ¬Ôef[fëØ/Ô„Áuì,µŠ€`{BÍšÕÚöÁ4å[ùÒh‡ ÊÝyî¸û|>ýp÷á.ãðýË'Ï÷ëõz>Ÿwï÷ûõ~ ˆˆÈcѯ€Ñf´S"ظ?6ŸüròË?9Á§0ì4ììÿ#¤Ö¥Ö¤N;­Ű×óãëEbüñzú¼<&±‰¤–¤CA¿ %9%9É«"¸ú:˜ÛÍíÃðjÇ«mMmM‚{_ÞûÀSà)€Öãz¾^¯óÅóËÛÿ§/¦Mî@RbR¢¬+\Wøøë‘„±Çá•í¯l¸›p7A3€2 X°h€?ú˜‰Ãz<š¯×ë|:¿®§ëGüXŸ·>/BƒÃëðš]‘‚¡fÞ«|¿ò}Ðn„Ú9M#X <žPŽ(Gò3à¬vN;  h@PÙ¥ì"aOØœ‹ÔkÿŽò¬¬¯¬× 5sÊásøÌ.°X bký¾û"?ræ:sAû)@è `‚ ÐV+ÃÊ0!Šx†gд´µAÐúµ~bËO>F %hj§R£Ôf™í7Qþ çÓΧuƒï¾·”""O¾Ç¿ÌgÍgýË`Ì6fƒÐ ~=ý‹ûM÷›˜ W…;Ã,}}}ºººpãÆƒá‡_ ¿Ó¿½ÿõý¯™ mˆðÃXîX.pÍ|Æ|Æ¿L÷#šADäÔçpP9¨€÷OÌ2«æþÜþÜÆç6BÚïÓêÓêÑœõΓΓð<øÒ}é¾t°Úíƒà>ì>ì>3¢*…Ja ïÝÛ¿·,û-Ç-ÇѶýyë›[ß„Ùõ+õ+5åÊõûˆ ŠˆÜª„îÝ ÉØùMç7ZÙÖ”üŽü‚žÕžO زmÙ¶lèºÔu©ë®,\Y¸2¶®9®9®9–þ£ÝÕÝÕÝÕٕٕÙ}7û>ëû üµü‰ò'~±zðÞà=­ ®ä]ÉÅñ#øR:R:´vNVMVÅý®åÊa[ŶÛÀŠöí+ÚajÍÔš©5±¼¼¶¼¶¼6¸œs9çrÎRcÍŽfG³Lµ¦ZS-dg9³œ°ãµíOm üG‚ǂǦVM­mvyÛò6­Åȃ×àe£´/aù "ýÊÈÁ‘ƒòCß\_F_†Hç:Ç;ÇE2œÎ §ÈÕê«ÕW«eq‹ŒEÆ"Ù dƒ,óÖyë¼UdS¦„M "w.Ýi½Ó*2ûí¬2«ˆüc ñÙÆgå‘ôé'DT‹”J)ÚeeŸ²Ï0(búÈô‘Hï¯z'{'ÅZê-í)í¹Ñsãæ›"žrO¹§\$uf˜ÑyÐëù¢üºÞÒν+)ÚU´+î®ä­Ì·2 Ú*ª°@Øö({”=A»®]À€bXëùz½Î§óëzº~ÄÏ£üºxdßcæ öOÄH‘«IžIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-14.png 644 233 144 2367 14774263775 14707 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܬIDATHÇÍ–]hTGÇgcM6#æAÔHÕ¢ *‘@‹Á†@7Ñ•F¿À¨ÑP» •¥HRˆhŠ‚F4jm|(fY?XüJ!BóTw£ Ò‡ØE ®›dC6{gæ×‡»÷£MÕöÍy¹œ9sþÿÿ9wæÌB1;û³0gaÎ,ÓÎÙãÌ{«½ÕK:LûŒÏFÏÆß› èTÑ)€âöâvslËo­wÇ áà»ù¬y1[8yyžÊ¬Ý ›Ë6—yKLûÇnÈ¿ž=eÀÞ{o\»tí_CüQü@¢2Q Žmù­õV¼…çÆÍÿàf†g†=@^n^®°¨jQÕâoÌC‹a½o½`xÆð òP@®ÆÃ#.Ûòg×[ñž…oñYü¦s×Î]+ø·ø·ä_0bWàЂC ,¾Ìu ši¦d®Ì>3ÚŒ6Òü¢tE蘎?q#Nš™™ÉÌ$m´Q€‘ųñ->‹ßÔ#þþo[¿€:oЙ^½²@T€Œê‹ú"Zê¨Žâ …BĈnÔ{ôÛ«‘j§ÚIdì±îµùl~á´ü'ÈçÇÇ>‚gò™´¿µCí`‚>R¤©d*™JBæIæIæ‰KàcóÒt €ä'ÉÒd©ËÿH-QK˜@YøŸÅoêÉ ;ó+ì;²ïˆþ§üi<5ž:ëÏu¹.‡ÄÉÄÉÄI¨8Vq¬âÜl½Ùz³•iãðŠÃ+¯€ªÑªÑªQWa¿WÔ4ƒF¿Ñïâ³ùM=YaýßÂÕäÕ¤­£ž£‡´]¡×©×©×°&¸&¸&èl€Û ·n78ÄwºîtÝérü>¿Ïïó»„ý¬Îª³Ào2 ¾®wøM=f=˜õ@wB|e|¥+åqÑ F”(èú€>ržœ'çÁªù«æ¯š¡p( í´ÓëÖ ¬€­'¶žØzjÊjÊjÊX“QFtH‡Ü5¶øM=Š ‹ UF^Œ¼p{ýJ¿:餴ÖZkfõÝÕwWß…‡Ý»vÃùãçŸ?¢I4‰&(ï/ï/ïï¤wÒ; ]u]u]u®Ê‘ûå~7ŸÅoêÉB…TÈÂØ`lÖ˜+ƒbPaˆ)1%„§ÔSê)µýB>—Ïås!’ÉŠd…ÕÃÕÃÕÃBt u u ±´eiËÒ!Jü%þ¿Ëæ,›³lŽïÉx¢ž¨‹ÏæÏêyëC^–—IÓK„PK-µNÆÁÆ`c°újûjûj™6"÷"÷"÷àháÑ£…®J]Qmª HËsòÜ;÷Ø[N%Ƙátt ¤£Œ2Šë´iŸöi÷ûÆ}PaVaà4§9 ú+]£k\xÆKãå{Oå;ú˜VÛÕv»ï8™×«zUú~£ßL¯˜¾¥oé[ ¾SÕA—cRmR›˜0ø{ûØ¿t~ Ûù³ZíR»ÈاH2L15]SŒ3Œ[W»ÕîÿÕùÿã] -´Pàüb¹Mn# º[wàÁŽmùí-‘·ðÞ{W~°¯‹ö=öa¾`ÿð¡‰pej"IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-28.3.png 644 233 144 3237 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜTIDATHÇÍ–ýo“×Çib!™'¶¢ªP£ Œ*ñ"’Ñ,ñ yiX†MQ¢NšDQ+mLµ4€”—E‰q ëÀÂYp’•PÐ-CZ5Ä{#;tçÅñœ™øåyîg?ØOì½üÜ_sÏù~¿Ï½çž{DDdnâ+¶ mAÚ츶%éÏ,Ï,ÏûCÜ>¡©ÆTs÷70ç蜣Ùöl»þ ióF|j¾H?•ÏðË\I:2œNSiÂÞu…u…™ß‹Û-WÁÜiîüW ¶vmíp9\aèúÐu©¿’¶1oÄù^*¾ìù/~HïIï1ý2^ÈxA^*{©ì•_Ƽ¯@囕o<žñx†JmÈ"K•A‚c4Å6æñF¾gà|\@nIn‰Ç«&ª&Ìíñ„gøýNÇN¨¿D;ù5'8Ah¢ p$6›$¬þ¦·è-@»²+;€º£îSÚmaˆùc~ …VZÉR_%ðNïtîtœáTU¸*ln7ôÈîí7xµöõÚ×AD¿B„@ué‡õÃDu¿þþ JýB5¨†é•B娕äñ2/'ýd¨'ê JýD_¨/$ L2 *+¿¶¶¡¶Áxà”­Éÿ}æsGp&xzBôgüt¤`øãá E—G·D·$ù"M‘¦Hø*}•¾JˆÆ c…)‚ši¦9iF?Šº£nùñ°cØA(¶7Žž 'üÕì2»‚3 =¢–‰ˆœ¸;>Ùñ üó€þÚÚ?Uœ®8 ³7Íþpö‡¨Ò÷J·–n¯Ýk÷Ú¡Æ\c®1ƒõ©õ©õ)TçWçWçC¨"TªH òù‡üC°ºhõ¢Õ‹ ûH¶+Û…ª=YÕRÕ‘ãq>x7ðnTw\Ä~("ò÷Ðgé³€c·{­{­jx57¯7¯—°A`³Ùl6”<*yTò–w/ï^Þ 7í7í7íw,ïXÞ1èqô8zIav«Ýj·ÂÊœ•9+sÀòúGáÙÖnk7ákÖ»ƒwU¸•[Ö×#,°<´K™¥L9ÓäðŒïf|Ç"©5yL‘ï_Îvg»eìÓ}ëè["»švíÙµG¤3·3·3W$à ¸.‘ôíéÛÓ·‹LZ'­“V5¥¦Ô”ÈÙâ³Åg‹ezÜòÞòÞòŠÜé¿Ó§_äÂÀ…‡ŠÌÿíü3óψü¹£7½7]ÆDæíž·[D]’LÉdQš~;Ök6Ý׬¡YC"îÛ½½’»ªÅÒbÙäß4¾i\dÀ5àp‰ ß¾7|OÄ·Ô·Ô·TÄÙæls¶‰ø'üþ ó^ó^ó^‘®]+ºVˆ\i»Òv¥M¤þ`ýÁúƒ"×f]3_3‹ø·ûËüe"s¼s?˜û䊄CáˆlTe1ÝíWF¹ßq¿½÷o|vã3ÕPþó5á5a¶۶¶°¸nqÝâ:¸ìºìºì‚Sõ§êOÕCñæâÍÅ›Áásø>///‡jKµ¥Ú¾ˆ/â‹À~÷~÷~7?)ö{ }¬õPë!£†Uüüäç'³FaœÊmÛ¦O“þh_h_cŒ¡¦kÆ… ÐO?ý)µ @pâÄ™â綾^@%šl{|«åj¹À!ƒo[ó¶f ’8•¸} ³Çì ÎT_yŠÐµAm´F­Qk}‰¾D_ذa½P/Ô <°´#Úuí:hM‘‹‘‹„ôù‰>vÉ“ïÉ0˜‚3Lô±ÿéü‘õ¦õ&`,Ñ™'´>­××éëˆIü1Ĉažñ,e…::`”ÑD$(”¾YßL”)íKíËé¶û5¬ÏXŸñ;⮤zCõ†”»’÷_|ÿÅi€N`ûÈ‚X0Ð6j ƒºª®`ÂIÛ˜7â|ÏÀ7ø þé»ò¹}]<·ï±çóûo“þ‚¸\œ:IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-24.6.png 644 233 144 3176 14774263776 15054 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü3IDATHÇÍ–ýOU÷Ç?‡J/·¡ Kil hG¢Å6Ღl%–Šò HLijíHª3]Ôe¥Ôn•tåÁ6z™ÕJ¬ +¼@W&’,¤ê% ”MÀ¡‚<ëå>œó}í‡{÷fîðûËÉûóð~Î9ßó>_Y¸ „=öDØü8lG0±!bCâ ?>¤ƒö²öòÕßAtMt À²†e Æ@›y³>´_$ȪgÆe©–S–SZF¿k ÖD,÷ãýÝ`m¶6ßõÁ›_½ù@ÓѦ£ì„ñÞñ^€éŒé b3oÖ›ý&_(¿¼ÿ?ú"ÞÞ¦ý,Z•™+3~å/J€¼ì¼l€±GÆQa O‘Dª `žyÌ5‚Í| Þì7ùL~SÏÔ÷Ï#óBÌ "ÔožÙ€J?•~<ý8Üš½5{k6(¸gnÏÜž9Ȝ˜˜ Æõ½Eo ââÁâ«ÅW!rGdEdêgï=÷ÎsïÀTqɸd¤ÀÎ5;×€qÝ?øùg)tFuFÁÑß·æ´æ¨í«cÛÛq›Ä©ûR÷¥îƒ#ÉG’$Cÿpÿpÿpp#dçgçgçóÀê(ê(ê(‚xG¼#ÞWþqå• ðË?¾±úÕ¸/Æ:Çãj;´>Ûú,èÓþy–„E G ¯³‰¬Ë_—/’uéyíyM³ÿ­ïüówÄÒUÝu°ë ÈÂÆ… EVØVØVØDö¦íMÛ›&R8U8U8%¢¹4—æ’ÖäØäØä˜Èí¡ÛC·‡DòªòjòjDÆGoYnYIJ¶(±&±F³‹ØFm£"aD5E5­³ MK¿^úµáä“¶I[ð³×Z¾P¾kûÖö­íƒŠŠ ¨½^{½ö:h£Ú¨6 ¶[­"##¡©®©®©.øÄêGêGêG µ.µ.5$þÓŸ§%§%Cõúš–š&Où|ž(K”Åp†ßù>ð} 9¥é±ñÇÆEZ¿ëê’˜}‹û£öG‰w_(¾ rÍuÍuÍ%²¼qyãòF‘æòæòær‘„] »v‰Ä•ŕŕ‰Ä«x¯D   EVõ®ê]Õ+2yfòÌäû÷öû€ÈÁ±ö±v‘•YOÞxò†Äˆ¸:\"Z»*Q%šSô·Í=ÖúZëkÐîìû¢ï µ}Cáz÷z7îMË6Y6Y %.%.%=ŽGOðÎÏŽž=; •žJO¥<±žXO,äØsì9v˜ÉÉÉ…“‘'#OFBê@ê·©ßÂ_,‡¿<ü¥¹‡ÕvŽ5Ö4ÖgüóìâP”d•d™rF èÝÌ1ÂHˆo]V—Õeðóó£Íh3Ú€Zj©•­²UvÈî%–X žOøä~T1 Çè1ÀoM½’Ê’JÀø*i øÖAëàüõ÷ÁgŸýO~ŸÑ¿÷ÜõÜåž^¥wëÝ ZÕiâOê„:¡N€QmTÕ€'NÐݺ[wŸù2ž2¶Û@ßá±{ìÜ3R>Ö9˜4˜`ýÁúÃüþð±œß³UÛªwÎ<£wêÀ”‘käâŸcÐÑ7‹, ,°È)`– &• ÀxÝx/‹ú7ú7æmy/ÂÖˆ­ÿ×ùÿJò‹ò‹Bþ•”Å—Åß'h>äC"Á7ï›зéÛpƒêVÝhhÄfÞ¬7ûM>“ßÔ3õýó<̧‹‡ö<öpž`ÿ þ ÿD>kðIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-13.9.png 644 233 144 3124 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ÿOÔ÷Ç_÷îŽ0dRI;Ó´KK†q…‚_˜ÚÎJ"–¤D% Â(“Ƶ)F ‰Í4M±±¡]¢4TÀEÐft-c‡×®¦U¨€‡œ\9>÷ù¼ûáîswkÿß¿|òz½ßïçóõy}} ˆˆÈÚðWÀú”õ)kRH¶‰ê{œ{~Þ’Ïé`yÙòò¿k:Öt$w&wSQÙÜ7ÏÇÞ‰âÇò™zY+Q…£ÛÑmÙ–á`ÖÁ,çOCr˸z]½ËA8zùèe€‹\ü€j˜ù|æsïïˆÊæ¾yÞ¼oâÅâKãøE ®?®ßò58âñ"°±pcafMè€'^zñ¥¾µ}kSVÐç€DÕÀ‡sÍÇÈæ~ø¼yßÄ3ñM>“?d@jAj••¹ÞG™úN݇fzÔ„ð9X\S\cøÎî˜PŠˆ—Ïgç‹é¶é¶ì Ë‹R¥à×:µN­3ʧ•j¥Z)ÌíšÛ5· ‚MÁ¦`SŒAg8Ù¨¸ú•æÔœ0?t?í~~c:„·›n7_¹n¸nøì¦=¿DDÎBÕ[Uoú€‘ím{{îmÈ}=·5·5”1”>”J)¥lß»}ïö½Ü‘Ü‘ÜÅíÅíÅíètº£-¥.¥.¥Â^Ù³ºgþš0•0…*;UR[R ÜñAÕÕª«@RÈQÿ™h€O<Ÿx`ùŸªòù×sRrR˜~Ø<±yb3\r_r_röùmóÛæÁë÷ú½~HOKOKOƒa†Žq\ǦŽM› ·<·<·<ªÿåýçZžk!ðñŸ†ŽU•0pjàÿ²Gð%}šô©êæÖLÂL¨êpmÐîhw '.Çžc‡Þ#½GzDO/ž^< ù5ù5ù5²˜²˜²³y³y³19ÖÛÜÛÜÛ ÕÕÕÐÕÐUßUkî%õ$õÀ_{¯á½€À' h$\K¸¦º­ò[¹­œgåf\s\³ˆ´‹ˆÈ‚m&ncÜF[†-Ó–)âô;ýN¿ÈÝž»=w{D&IcÒéóôyú<"Žm8¶á˜ÈàÐàÐàDVa}a}a½H…»Â]áéÿ]]ˆõk«ÍjqU¸F]£² ——%bqÙJm¥£ÏrS4mŸ¶OÄò3I5W^XÙ·²O$¾.¾.¾Nd¼`¼`¼@äÐè¡ÑC£"£™£™£™"K­K­K­"– K…¥B¤ûz÷õîë"Ã…Ã…Ã…"ƒÇÙy`çþûEÖ=X7¶nL$ÿDþÚüµ’*ò°äa‰ˆ5qÆ-7ÃU9ÑÀß>ühøm(Ç‘œL>é8é€1Û˜mÌ QãBãBãlununuÂÏÏxí^»×²dȆŽŽ8[t¶èl¸w»óÜyðYqŸ¿ÏO Ül*ÕŮήNà¿fŽ©Ê7«Þ4ilú‚ÑŽ®€à W¸(*&Ëoq‹[@m´ÅèGa¸Ã—|ƒ×ô=@V¤*ÏU–ÂUécÊuÏuÏgǘ֦µh3kWµ«øqàÆ üƒ1Æ@¯ÕkõZÐõF½Œ-Æc p˜Ã#ÝH7Òר¤ôUãiãiбúÆêøúH˹]Ó®iŸ³ý¨ó—8J‘6zƒe}@4ãã´È«°Wøžïc<¤ÐчÌ3ö5(”ñªñ*ýš~-?Â÷£ÎÿƒYiÎ.sVžmÐD‰Ñëåz9P#j ˆÊæ~$%Â÷M<ßä3ù#³ò±}]<¶ï±Çóû?ž8íÃ_´™IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-3-red.png 644 233 144 4047 14774263775 15535 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜÜIDATXíWLTW>ïÇ(TX¶´©¨ÌëjwÅbU\Iä‡Ð,ØhÚQR1XÍnì*ÒA›Úà©+fiÕ¢dW³%ÈÓéb²[ ‘? ˜¥e7ÆÔ™‰²)0Š2ÃŽ¼;÷Û?˜ûÞ›IÕlvÏ?3ç{Î÷½{¾{î Ñ´ý”¢LΚ©ÍÔfjÒ¿#f´Íh›Ñ–ÿ+•©Le}¤e´Œ–Óa^G*©¤ ˆöyX/òE=Q?OΊæcåWNåT.·FÇg¿¢¶©mj[똴GÚ#í1ˆ$%''ã¯om¼µñ°é›îÎlg¶3ÛôE\¬ù¢ž¨/ðžÎ‡ä5Ñþ‚cr@Èï2±CóÊæ•Í+cï5u7u7uóçü÷ý÷ý÷(P  ˆ L`€^xÃÄÅz‘/ê‰úÑx Ž=¥&ÊCò<äý›(ݕݕݥ¯vO¹§ÜSp#b|)‹¿Ué­z+À–‡\!À CŸ‡>ØòPn(`USùSù_ÊßäoBùî)÷¤{nQß …ŸšhP“Z¥V©•H=¤R5#uŽ:G^hÛË+xüz³Þ¥wÜËwð&ùa~¦…ñ-þ$>ÂG÷†{ý€Þ¬÷ëýßËßåïÂ/– qq0Ø>Ø džÅg–úøÆÎFñ#îKNKNKNCÝXþXþX¾‘¨Ã;ìü¼ŠWY ŽúF}Àô€O?øôk|¸{¸ÛoÈjȲ„ý¬ˆFýžÀ|?Aôð†#Žl8b¾s37sðÁ V"ïL¼MEMEpëÛ[ßû}gg _”/À—Ǿ[àÙìÙìÙlJŸ¯e‰,ÑÚ¹Á´Á4k‹]e®2+ÁnO·Çß;²w@0.bÌÔ|(ˆ ‚Òö§íOÛ6.e¶2[™}ò!%ä%ä%ä©×Ôkêµ–!cà;N‡“Uïï …‹‚¾¾jÄÇÃ[ É«åÕV?3'3€ÿ‡—x“9|’½È^UÊn–Ý,»w(;”ÿ,žöã}móŽÛÒmé¶tïŸD‚«ÊUåªâkEAýyý%ý%pñˆ‡e÷ßè¿§é4@ÇýŽûB¡®P—嬗ê#úˆÙê³³þ³~Wh­\+×>ΗæHs¤9¿lŠ!¨üÝ8"[¥­ÒÖuR‹Ô"µ­„§uj—µËÐ íV°WÙ«ÀßàoXµ;}ŠÍ½âøZv‡Ý1¥4Ô2tjè`³ÇÙãô]ÆNV+ÕJµËaP+¤B*TSM®9”C9j5µR+µ)>ŧøÞk7®ÖÆÔÆÔF=Éó¾§ÒSiÕ.¿ásás8#F‚¬‡õÐø$Ÿx1ßÉw𝳥wKï–^VaÜ@ê„:¡LÙ²;e7‘ì²C:aW*hΊ|+·•ÛÊméÒÂÊ…• +‰le¶2[™vÐÐnŽ#Ç‘¥]WØ…4hÐ<À<°´z1[Ì›ûÛ°ªaUÃ*¾Ö¸Ë“lI¶¤¡Ç‘_KqÑ–:bZORŒ{=ÚO›Ö®çüµ›¤'éI&¡ðpx8Ïsßóž÷EQ”%ñ¯Ž5Ž5Ž4Ãv|gùSªRªr~3ìvIµIµC?Azkz+@ÆåŒËúË6çÍõöxE±ðí|¦_Y¢XŽä›É7“ÜqÛ {7îݘ’iØ¿ôƒ³ÛÙÕàÈí#·º®t]á{4þàµûµ,Ûœ7×›ñ&ž_ñþ_Q`aïÂÞ¤ yQò"E¬Ê¬ÊìãÆ‚‘lØY½³`lÁØéRI•n Bs¼²Ùæ||½oâ™ø&ŸÉoèQ`Yù²rE]ûvísvOüP¿º~5 ¨Ý@;í¤Ò¦×΃|¤­ÕÖãgY)+H" dLèϵ-Úb2¬¾QßRO=©†PµQ¿ª~•)ð‰ßâ7ô(ÿÝÛ_+`OÊžà€Q`hM¨òKyPDš)’^Ù$›@È9€5fyÁ‹„%AïÒ»PAô‰>Ó­| ~Å.(ÿ"8Çã‘Ï $B"¸?ô•úJfPߪ»ÕÝ^^^jP ªAKÏ´cÚ1퀉ÀD`"áÃ'Â'@|.6‰M²H1Ë`?ÁgòzâÂÚÀÑÓGO›ðz1IjTZÙÉäÂŽ;nì¸i i i à¾ä¾ä¾£þQÿ¨r¢9Ñœ(TTT@aqaqa1 1œ:œjáé3sÏçžÛøü†ž¸°ÁàÚÛkoq‡Em,‹3=·"oEÞ +Cå-å-å-pÒwÒwÒ®vW»«¼!oÈ‚ÐãÐãÐcÛC5ÕÀ[qQ\4ñåa‹ßУ@Úý´ûò&Œ—Ž—Ú6è3úŒeN˜80qÆFÆFÆFàNÇŽ;PÚYÚYÚ éééPr½äzÉuØìÙìÙìuÞuÞu^uºF]žüJ °“ßУ@ÆâŒÅú0¼zöê™íØÿ.;dPC 5Vxƒ³ÁÙà„W‰«ÄK–,…§…O ŸBAAµ¾,³,³,.d]Ⱥeù…[[¯­··“ßÐ3oÆD@;£±ìžÜžÜž\ë · ¶ ¶ B¯£×Ñë€æ³Íg›ÏBþ­ü[ù·ÀwÊwÊw ò*ò*ò*  ô€náéå"Y$0cï¯1½vnfnƪ±>_Ÿ¯ÏUž*O•¶õlëÙÖE²HI¸ë¿ë¿ë‡¶­m[Û¶‚«ÌUæ*ƒ«ÙW³¯fÛøk¨¤øKÇ?XcóœJ´ˆfut Ä,™::¶Ìp{ÜvRE• OÕ&µÉžÊ÷ô1£ð·ƒÞª·2+È)9¢Eœç@ ‰!1Â'|Âò˜<&Ùüu¢NÔþµ^ª—#¶¬×éuÌÆ+ÿc}ì=ˆwþ sºG÷ 2ÿã×¼ä%0Å$“€ŠŠŸ“À;¦™¶g\?¤BñP<´ãÏÛù?rWÝ@3ͤZ[,ö‹ýÄ@öË~ ~WZ¶9Ÿ(‰x¼‰gâÏ{W~²¯‹Oö=öi¾`ÿÛBœ¤h€‰[IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-29-grey.png 644 233 144 6336 14774263775 16024 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü “IDATXÃ…—iTT×–ÇÿçÖ-j Ì1ÔA& Cã å¥BÀÅŠÐÆÇzÆ<#DdJŒ‘¨¬&,WP’¼§!OP@‘ Ñj˜‚™Jª!H@”¡€‚ªºuO Š×Ë^YÙ_öÝ÷ž»÷ïî»Ï>猌ŒŒŒ XbQ¦³‰U²JVIk2.e\ʸD—geemq§VÔŠZúOΞ³çì}“4•šJM%ý E(BI…+\á  ½è„$$ÑÏDQ¢(QIecck+"“d’L½¹,sYæ²ÛsâsâsâÉ(çÄ9qN$|‘ƒo4pY2K€ë°ë˜ïøl>›ÏæµsÚ9íœ_vUvUvÕwƒÚQí¨v´ö¡ÚGí£öñý›i¾i¾i>ª}C}C}CIª¿Ð_è/ü¬ý¬ý¬£m|no|ßèoÉ¿!ž1¾‘ÇÈÇ2¸‘šSsjÎï!ûÉ~²ß)_à$p8Ýùj®x®x®øUk›Z›Z›Zýû¡½¡½¡½ŒÎ³Ó³Ó³“¼!J¥ŠR¡FÒ)ÔPC  H°+°jƒÆAã€7:::¨®ÎµÎµÎ•ÿEØ‹°a»ÏJ¤NR§õbý~ý~ýþ|šHi¢r³‘¤/¤/¤/h@ÌØJ¶’­l(ÑÎkçµó¯þYöºìuÙëܺèäèäèdö;ËËËÈ ‚"pü=þ,‘9‘XŽåX@ 4TPAy2OæÁì”Ù”Ù”ÊΕ+;Çí¨¨¨g˜HL$&’ÿ¹ÉEqQ\ÔæXlÆflža$-’I \.\.\þé=õMõMõÍWÿ,‹EÈ"¸7ãããÙ>>>øïÃûð>K ,cËØ2¶ò‘|€ô“~Ò,f@=êQi €EœEœEþdô/‹”EÊ"¹7Œñ†›åf¹Ùp?íuíuíõø×lvÙì²ÙE£¯E_‹¾ÆkD¸Àæ(A J€………€+ä ¹B€ ȱˆE,€Gx„GÂŽp@  Ðt.йÈE.Ìþ£«£«£«ÙïlvØì°ÙA–ºRWêšµSgª3Õ™òåË?F¨å-Ë[–·`bp$I˜I˜IJCJCJC€áòáòár€ÙÈld6AÁAÁAÁ@ÐÝ »Aw‰¾‰¾‰> ´´´´´¹?rä>`ZkZkZ D±Ql ¬Á¬Ì-¿´üÒòK¨å¡òPy(B˲˲˲¡ƒÐA赓áœ9gÎùßX=·znõŸymðÚàµâ(Žâè(nußê¾Õ Œ××׉ë×'®äJ¹R®n¸ßp¿á(Ç•ãÊq ênÕݪ»ÀÜæ¹Ís›¤I;“vn%n%n%@‰_‰_‰0“>“>“nŒÏ#žG×>׎'ŒŒ‘12zYöYöYöÚ±£k®=º–?ÙjÖjÖjF2g¼ø%ø—à_‚)MóOóOó§ô‡¾ú~裔+ãʸ2úÿDy_y_yŸÒ××WJuº]¥£ý£ý£ý”çŽsÇ9J»ÍºÍºÿO¼þ¢þ¢þ"JÓÂÓÂÓÂé;™¹™¹™¹Ú1шFtf›Áf°$µ¶£¶£¶C/›r˜r˜r€ÔØ>êvÔí¨Û¬ìYÙ³²p¢NÔ‰}C}C}C@ë7­ß´~hì5ö{ é½¦÷šÞŠN,: Œ5Ž5Ž5ß;~ïø½#`]`]`]¬ŽX±:ý!ý!ý!H«m«m«mùuDAD/‰žè‰þ+AÜ\Ü\Ü\ã…ì…ì…l—¤é§ÓO§Ÿ®=þüÓçŸ>ÿTŸâþ¶ûÛîo3Û›>jú¨é#hT~*?•ض+mWÚ®]Ÿt}Òõ ÐVÐVÐVØ«ìUö*`Ë»[ÞÝò.ð¤âIÅ“ à¦â¦â¦¨%j‰ˆÉˆÉˆÉ5o1o1o[!ªUˆxuSSóq 8PøK¬®Y׬kŽ 'éCéCéCšÑŒæûB8&Ž5JfÏΞ=ûjb¨2Tª¤ÁÛ¸mÜ6ŽÜššÎ ç…ó Æ%»±»až0O˜"‘‚H€vÓnÚ h¯j¯j¯lÛÇö‚K‚K‚KP?ÚòhË£-ˆ)n.n.nÆ÷’~I¿¤!Œ ¨€ |cà7¸u¿Ã0ELS$haN3§™ÓOñ#ü?²_+é’tIº€úæúæúfêÑ5Ô5Ô5„ËfŽfŽfŽ˜5ŠE€8@ ÄÅÅÿˆ`# >ćø¢ŸE?‹~^TÍ03Ì iõõêëÕ×9™ð±ð±ð1@TDETÇxHI`÷;ÈCòXAPPPPP=„ „ÍbN0'˜G˜6¦iSùêåz¹^ž¢œUÎ*g¹M^ë½Ö{­gŽK.J.J.BESh Mˆ“bR ÀÖ°…,dýk“BAA #a$ ¦×p × OQÞPÞPÞ`ÿKš M&\ÎqQ¹¨\TûæE‹„ ¤ ( à9(L1iLóVăxrÒã¼Çyó÷·OÅMÅMŹ1‹Øûæ³°gaÏÂô)¾¾¾Ìv `Ð}dÙÞð†7!„4Ò@PÒ@HØ&E“¢IAƒë>¯û¼îsæŸf¾f¾f¾Ã ºƒºƒºƒ±ã{Æ÷ŒïQqä6¹Mn“$Ãd>bÜ8« º”……###€ö°ö°ö𑓦V¦V¦VÊÒÞªÞªÞ*A^Í›5oÖ¼IƒI2I&Éñßòßòß‚B $¦Ót á‡ùqŸb\˵޵޵ް055ø>€8rr±ô† ¥ø…¡­†bì´†#‰È`j }7µ¨E­>…¬#ëȺàí‹GŽ;×3Àÿu7¿›ßÍ3›ñ1ñ1ñ±ÇÕš§š§š§ÇÎömíÛÚ·0m©ÐÈ·ú°q€ÔààGÆa&×Ü+Ü+Ü+ò¶‹ˆˆ\Ι´Ÿ´Ÿ´g§®f\͸š¡OÁj¬ÆjXtZwZwZã - - -d´GÚ#íx/ãemdãØ86n~ƒ³¿³¿³?3aˆ÷=ÿ2—¿#†IÆÌNjBM¨ ùËèšÑ5£kðw½£ÞQïø9‹œEλ ž…< yb]1Õ=Õ=ÕMÏt\ì¸ØqQ¿qV7«›Õ  7 7 7}à@/Ð ôÂ?«2‚L`ü ã0$Š{™‡àäwj75¨A>“VÒJZÔÏ”3åLù;/D.D.Dòk„…ÂBa!Ó-H$ ëê]Ê]Ê]Ê·)úýŠ~r‹·ãíx;ú•Áo•Pý{ þ@^ª] Cíf"ÉHfÛH<‰'ñ÷\h ­¡5G$«$«$«˜nÁ `P0øtŠ?ÅŸ:8ÒÛÛ ,ÂÙàϸ±œÿ#ŽÿÿªFÝ©É,IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-18.5.png 644 233 144 3144 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïOTWÇŸi‡¡([•´€b` *J”¨ÝþaK†ÔV‚ u»¤6±4úfmÊ ß¢`#K\–Dˆb]*Ú˜!Tv·Yî?´î²±~ÎÈ Ü¹÷|öÅÌe&úxßÜįv˜ßD”mÆÃùæzÏÄ7ùLþĉ;DÀ½×½×~MD¤ÿOðÕê¯V[´þH5Õă£Ç§‚3ÁÔßZ£¸ šT€º¯îè{õ½,à ú‚>Pg9K¼úwOiU‰U‰€Çäs÷º{í ieÒÊÈ™†ÿuïÀ‡3΀ú@ëU÷9Ä!5¬†ÑX¡”R(µFe¨Œ¥J¡V©Uj°žõ¬øñãÇ"È·|‹¬fµÔzá£/?úÒ¬`Ý;QG)"âl{ÀÄð·¡ú¡ú%X׬fåÌJæ´ÓÚiít„o±q±q±ÆJÆJÆJ ˜Ìfóܧ‚jVÍÂôo¦MƒÑëON<9ÁÜøïg^Ÿy—ž0ôÙÐgqÉqÉÕÒ#Ü9Ó•_W~ j3€‘ë;>þÍø7Pp¨ ® uýƒëï]TŒŠQ1àŠuźb!%=%=%ÜN·Óí„¹Š¹Š¹Š¨‚üÒ¥õ§õCÖѬsYçP9›³ÞÊz þuà—¿<0ráà僗Aw‡ôÄ`É¿b‘·Ëß.—Âÿ±ä¹.77Êâ_OüäûÉ'6Ç:Ç:Ç:Ëãò¸D   Dº½ÝÞn¯HiAiAiˆ'Å“âI)’")ÐôE¬×¬7­7EÊ~U, Še÷ÉÒ¥;dqÝ–×2_Ë´äIùæªÍU"Ë·ô+:U#q#q >÷Qª6¬ ÆG~Þð3\­¹Zsµô½Cï§Ãép: ¡:¡:¡òäÈ;#·FnÜŠT¬»¥»¥»2/f^̼…S…“…“Q¾+} olá°óðÚÃk¡¯¶¯¶¯6²ã“';OvB~n~n~.455ÁÔö©íSÛÁ½Í½Í½ FïŽÞ½ õ{ê÷Ôïüÿæä@KZ³§ÙÃB¸w?aOë®Ö]Àž°°3=Py´ò¨IkäB0 zhå’¢j¨d0j.<å)O6Úh‹òßáwƒE#S„‚ZPŠM¾Êã•ǹžÈSö'ö'Œ!mH‹Ì1cŸvS»ÉœÒy“7Cª1@oÑ[ôÐèGô#`l46.\`8 §á È#ô¿è£ú(è;;˜3¶„ð¹ÿ ëA€ý¡ýa †qsŽ=7ùwÛvÛ¢&ó¬Þ¥wšQn”£-í˜p˜g>z¢†„ó” &–j­PF…QƼ~C¿=ùM¾ç&ÿ3w%ÏÜ•!€àLj_:bô2½ŒPåÀ‚"¶7óÍõ&ž‰¿tW†ùCz^ä×Å û{1_°ÿÍÌ Š=ÅÖIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.2.png 644 233 144 2564 14774263775 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü)IDATHÇÍ–[HUYÇ—Ç©s$Ë #)¥‹e£pÈF¨H“<•7ÂËKLS6DÓ•Œd¢ÐEr¦ê%IÅ ™¤Äв›ó A—ÑñAHÇÄ.Þ²sÙk­ß<œ½Ï>]d^[/g·ÿÿÖÚß·—!„óÍ_ŽDG¢c^Ðvü`û]›\›’Z‚öY yyO~…˜Ó1§bbÔsÛ¶âV~x½6~8Ÿåó…íp¶:[#Ö›öØžº=Õµ0hŸ¸ QmQmï Øue×€Ë._`/ ww¼]ÿv=ض·ò­z /_ùˆ_˜Õ1«#bœ³³…€¥™K3Wì &ô¯€­9[s##µä(M´^L2‰µ^…ÙVÜÌ·ê-< ßâ³øƒzÄ­‹['äåE<ÛºPè*t ðdìþVé*€þQŸÒ§‚QÞ}°cH"‰ ¿ÕÉ:9äÕú°L‘)ôSã„qÂr0]  ”%°ncØQ !Ä׿CÔpÔðäWÐ'û$0 ÀfFU¶ÊfÊ÷“ooŒ¯_5¾*LP5ÕTÛf 8P(†ÑoFWŽ®„À‘ÀŸ?ô>½in›ø_ˆ?¨Çvö”U–U^å+cA.©2ÕÞ¡Š”Š”ŠȜȜȜà“5éštMºÀsÉsÉs bÅŠ9'2j2jàõ?¯§_OÛxºËâ3ùM=¦°ž_àâøÅñPú÷j¡¿Ó߉ÏòÜì½Ù{³×>øœÜœÜœÜO…5z=X½xõâÕ‹múþôýéû¡¾«þZýµÛ'×ùlþ óºæuéVNNf}H47¶`ldMeMeMAIMIMI x2=™žL;Oµ¨Õ/¿|üò1 z½ƒ^¸Qu£êF$§%§%§Áï Ý «Ûe=™ü¦±scçªgðjèÕÈïBm@Ýœº9us ²>²>²Öö¬íYÛ.¯ËëòÂUçUçUç§;w ê@Ô(XS»¦vM-tÇuÇuÇÙq¯2TðÎâ ò[zB¨vÕñLc›±MÇ^!„qfoˆ¬Y˲– Ñâlq¶8…HêOêOê"¾<¾<¾\ˆE‹*UÑÔ×Ô×Ô'DÓ†¦ M„8–q,ãX†¥çJÏ•žb a a AˆÞâÞ¢Þ"!".;î9î Áo_?¤g¦w d£lħ~VeªÌþ§×Û¯·_o‡jµ¿Úï¾?úþ(”,/Y^²***a‹c‹c‹²_d¿È~îxw¼;:wVuVÙï˜Z=ã;öQWN„ºÒ-Ý sôn½mÜ6:NPªCug8Ãк@„á4Óæ¨ùxùìVBƒ1i„æßŒ]ù™9†9g¦TžÊ³©ôUݪ[AT'ÕIà!yÊ­ÜÊ :_çë|ͲY6ƒ|"ÉG ËkòèÛ2A&„ð63Õ7Ö76ãûÌäÌÉ_ÞP;ÕNæ ÕLñ–·æ³&˜`ðáÅ ¼a„å¼QÛÔ6øå-y+¿ÐYè´vêƒÉÿ?ßÊ @PK-ÑöÈRYŠô]}€"À¶­xèÈÌz ÏŸñ[ùÅÞ.¾ØûØ—yƒýö cI¼¸ZIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-102.png 644 233 144 3113 14774263775 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍVmlS×~ü‘Ú¦–“Š$L)]P#$HUá@Ô‰hŽD©H™›¨nÄ JŠÔ*êF¡–µ(ESË~$hbB Pb£*¢ÐV€P¹Q@Šu+©‰B”¶xžg»®‰‡ïÇ9Ï~Ø7×]µÿÜ?÷¾_Ïóè=ç¾ç€Tß ­ÏXŸ±z ¶µ×ô;_r¾T*اuÒÒniÿû;dù©òS$ùÔ٧Ί»¦mÄüÒzÀÄ/å3ü¨€épŒ;Æ--Eû}²ãùŽçUû£IÒuÙuyE#û>ëûŒ$?=ÿéy¾IƾŠ}E’é–t iÚFÜÈ7ê ¼R|¼ÿ?üYvµìªe‰t<áx k_¬}ñÙþB³¤ÿeÿË$ù½í{›´’$©'Hºé–-$³ÌÒxþ]bñb¾QoàøŸÁ_вÒWéȶ½m{]£…‚»cÔžxÚàS/ó·|ƒoÐÍóÚuí:IêGô#Ìó¯²Kv‘rN̉9’—ä[ò-’ÔõAæ9¢ k䌰‡=tó"jjHªE>iðô˜K)àäN2€VEäaíˆv„”ßè_ë_S-${`€1±ÕŽQ6ÊFÙHÊ!9$‡H¹WöÊ^J’_òKªòÒ"-¤œ-à“ª@ɤÁÒͶi˜tÅ]ñ¬Œ>Œ>$9C’l%åy‡¹•dnMn ©†ÔÕM!ùd>™O’ÉÚdm²– ‘ 3®¶¨-j ™¨OÔ'êIõ½üX~Œ¹b¸•‹E‡HÒ•ue³vCOQØé)þóPß¡>NxåïT¯ê%ÓN’þ„²©®i}ÓzòZûµökí&ñq@¤sÜ9î'÷ç÷ç÷çÉ•±•±•1rOïžÞ=½d¹»¼¬¼Œlþ°ùbóEÊäB|6>[Âw÷õÀëcïž²úöÂçØ¹#¼#\l#,[ÿsùQ÷£n(­ÿj´F`™^œþaú êJÕ•ª+Àäìäìä,0cŸ±ÏØÅû‹÷ïÑãÑãÑãÀÁ…ƒ €„'áIx€ÌÃŒšQ=®OéS°Œ-‡ƒÃP >ù—fg³Óàás+à™ðL4ü3¾'}O˜Ëèš÷Ü!wŽÈXäRäÐÐÙÐÙÐ (% €·Ü~p¨ÞP½¡zP3X3X3xº<]ž. .Y—¬KSËSËSË@x&<žR“©;©;@Ãæmþm~8ŠÂF-_«¯0ôØ›ßæçsp—Í—Í[€’Áu\G¥í”­ÚV ØoÚoÚo˜Ãæû û û @ëÐ:´¬>¹M¹M¹MÀÆŽ;€‘ÜHn$+‚Á àÜò¹ïÎ}4Õ4½Úô*ÀöŸ5èܿ܆JÀÖhkäsV@|!¾°|j~Í@TZ~ Åh4èûô}ú> ÓiÈ4¾ /è KýKýKýÀ±Ð±Ð± Œ*£Ê(N¥Sép´âhÅÑ  {s÷æîÍÀÒ٥ѥQàÛ?Ì×Î×–+>žVbJ 0õfß&/f.fHFHRöð÷ÚÚÌÛópÛá¶Ãmätx:<67¨3Ôê$·÷mïÛÞGNÄ'âqòÆÚko¬%wõïêßÕOîNïNïN“Þ_y=^þÓÕú«õ¾ìþàŽàcóϾmþ•<ôî¡wÍ¿„Ô²š9Ñ%óü‰?™‚è£>’xJügx†gHnán)ñ?b†™¼Ÿá ¯É_ÐS:Çb®XÖNU£*IaÌ11 ˜ÄIq’”)“%U¬ëÄ:R÷ê^ÝKŠE±(IyKÞ’·Hý#}H"õyaVRÿP‰+qæäMÿÞÖ{[If]÷\÷~1ÇŒA{r'pœæä'õˆ!¹"^¯Q-Î~IR£Vü–$*TJ:¤p…+$SÅœ´xE¼B•)=¬‡ÉB®!Ž€ÃèÔÏ&ÿÿ9+9°~`}ÉYI~Àè6—@ïÒ»˜'夜$IZh!MÛˆ¯.Y±~õ¬,â|¿8+ÛÛÅc{{Éü¹¶nÚº `40°ý`%”ØQ`Š)ôxä‰õ¼S¯×k<¯ù4^@iuiµ¼SÿN}èT~ÁÐYÌæEÍ‹4Ÿq‰“à%ö¯Æ}ã>ÐkͰf{Ð`s€³v“Ýöæædí)ã‰ñì!ši¦„fßpø üy=ò|omÀ¨ Ô ‚nó‰µÌZ*mÆÌ†3aÛ5­¦&šhÂF¡Ê6ÐN;PA…ŸºyuóôÛài¥ˆÈò/!”¥§f` g‡³Àl»Î®c:·8W“«ñ²ñã ÀŽØ;òäjsµ¹Zëëë…G±Gǃ‰¿‡‡áÙç™t&Í´S¾‘Ÿ‡o߆¿£ÇvâìiÝÓ | *5‡Ì!÷7¦S)õ„zB=ÐÐ×Ð×Ьd%+]aWæ_™e>„ëÃõázX~pùÁå¡è뢮¢.èü©ó¯Î¿°u½uÎáÓüŽGØ/ŸÂ·“ßN‚•°w9벉îDg¢VT¬¨XQ×<\óp ”·—·—·Ãåäåäå¤+,S•©ÊTAæzæzæ:ÜÚvkÛ­mP¶´liÙR=5ʳögš/ϯõ̾1û†}Ò«Ò«ÀZÿ|kâ³â¡x¢UѪh•›_ŸXŸXŸ€Žsç:ÎyZ¹7·7·×wÜÝqwÇ]èØ×±¯cŸ›·&̤™ô2åùµ¿H`k`++Dо/ú^D wŽ :ÇÇEÌZ³Ö¬•Â0LÃ4L‘ÐÕÐÕÐU7_/ŽÇEî¤î¤î¤Dúãýñþ¸ÈÎ…;î\èÖ–øßò¿%"YÍçð;zü"*¡¾ßEÌ·Í·Eüc""RªªG«ïUßéééi‹¶EÛ¢"ãÆŒ?YýtõÓÕOEbëbëbë\âóGÏ=T¤²¼²¼²\$Ün ·ˆ¨Óª[u‹È_¿¯_D‚š/Ï_Ðóâã~¾çöGæ,sY½Ñ=-=-=-°6¸6¸6×R×R×R0yhòÐä!ØR³¥fK dZ3­™V899D2‘LxZ¦®¨‹ê"`Z§¬SÿÏØ ·2«o‰Uj•Õ4ЀÍNrÒs$ºè¢ ˆÁkÓLÌ`€€4#Œx|Í6Ÿ˜O r_v+=>¦†a°´©ýj?ÓêuµYmkUiU‚êS}ª8Ã΀õÌzf=dÔ€P``×Ûõ¡õžzÏãc [ÃÖK}ÌãüÔë‚^g¶~°~P»Ô. r'Ï;¼B“L2©wø‡ &t°A5ªF Oãk¾ÿ8ÿK¾•4/n^\¸á%`N™SÖvk;Y°oÚ7ðá7Öóº^¯×xÿ¥ßÊWöuñʾÇ^Íì¿Ð»bvQIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-10.4.png 644 233 144 3030 14774263776 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÍIDATHÇÍ–ïOTWǘf ?úà 556$–¤¼ I hé$Ð-ؒƶ1X–lšn²Ñø‚n °-lº]²n—¸jdëhJ)@F±´n–ذfS[@°© HQ¼÷žóÙ3—;k÷ð¼¹y~}Ÿï=ÏyžsDD䉨W qsâæÄô¨œø–£÷ø=þmÁ¨|Ì‚„= {þý;Èø8ãc€'ÛŸlW7Ù¶Ûþññ"~|>[/Oˆ£HéHéH(‰ÉðZÎk9ž_Då?^o—·ëž µ¡ÚÀŸ|ñ oÃÌ73ß,–,–€#ÛvÛߎ·ñâñ¥ñ‘ü"t>é|Â-HINI_©¯të;Q‡‰­ðrùËå·]·]:¬9 •T]Dˆ`¯;q²mùÛñ6žoç³óGù¬/^_,•{+÷zOaˆˆÜøm:´ (0ºø;4’ V’•üÍ|`>`UÿKUGîÖÝzT–µ×ÚË*¦¹h.pŠS¤ò‡^ÆÁg>k¼ñ)g*T…òž‚õo®Ó©iìûÑ ðêò«Ë ß0¾ÖßqˆCúº¾ŽA ¯ð Zͨµ°¶Sh—við+j©åÑ¥ù^ªB ýkóó[m|U•Y•iüè…¸RŠˆdoĉ¸ùçXëXë`Ù½ùåŒå VŒ 4‚N¦ÕùÕùÕy˜÷Íûæ} stŽÎ‰£2É$“À,?ñð0÷›•ÐJˆ•¥ ÷#÷#”Áć_yyEÜÜò®‹ˆû êŽÔ ž[üÓ\Ã\ìܺóùÏ£/ì¹Pv¡ÌÉ»_íWûxÏyÏyÏÁ¾ð¾ð¾p±qÆ3h͸ªßQï¯÷£K”Ì–ÌÚZõœ:[»­vŽòýƒˆÈ·᳉Ï&àÞ(€®)ømÞSyO±jï눌ȈÀе¡kC× ;!;!;fógógóa{Ëö–í-ÐK/½ü|]»4viÌ98ååþÿ«±Jרð™®3]À@”IïIïÑ|?³nfè·c}´ÁøÑør¹¯ç¾ÃUÃUÃUl ¶Û hKÑ–¢-Nâ]=»zvõ@k¨5Ôrôs7çnÎ݆?ßßšMðRNÙrÙ²ãgýçvæíL`.½#½Cw$Jš«ÚUÍù.©%©EDþ"""ó®™$_’OÄ]ã>à> "R "îfw³»YĬ4+ÍJY[†i˜†)’¼’¼’¼âèÛÛÛED&Ë&Ë'ËEFÂwÃwEºöÕõÕɼkãÓ O/ˆèÒ-Ýìtú`ú îàìôøô8°ñK»!7+7 zýáÞ0Ì^ž½<{²¦²¦²¦ ¡¸¡¸¡²Û²Û²Û`Dè 'C'C'C0Š E 3¯3¯3´Za³SÚ¦4ø¡pªtª`Ž9@W§mLÛ¨;b]ùíAþq¶ÿl?ðR´ævó®<üâáájßÕ¾«}á`  ÐSè)ô@ÿ­þ[ý·`©i©i© *ŽW¯8ÓyÓyÓyNÜÅÖ‹ï_|ެ«ï¬ïŒ;cƒg¾<ó%pß>c¬uå{uï9]fÄŒ@,T¯!SL1pšÓœŽÛÚœààÇ/n€íÖ»õn0Í>³Ôy5ªFÑüÕl6›AÿÒÎW÷yÝçÀB¬+׿˜öN{§#nÔ˜1f8sLí7AVôYd9 U¦ÊT™`å[ùV>¨° «°CX¹”K¹€&ÞåÝ8¢Ý–Çò°¢Gña¼h¼xà÷ŽGܘöûÙä¯J©J‰›Ì÷¬>«0Ôê lÊ00€‡¬Ú‰Y Xâweû«UƒÁCkØ–cøTyª<ð&ÿ#w¥}wÙwe”`ðºVb¬j«šUÐWôHG¶í¶¿oãÙøv>;”Ïãüºxlßcç ö¿¼>‰~§ IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-37.2.png 644 233 144 3130 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ïOTWÇÏ€(éLÁY_¨,6²ŠM* vWejZ@¬¶©EJ·˜jjÒP—%ÐTÝ™S…(dÕ €À6q”Žì¶` +£õG²/ºU™@µ£Œ ÃŒŒkg˜¹÷|öÅÌåN¶ý©€a›aÛ÷ `n67¤¶¥¶©wu¬ùµøø|!tþøzš]¼(tÃ<û<»¡ †Â[¯¼õJò¯¢ø³+`¼`¼ðß¼ßû~/@OGO{aüÚø5_¯t¬ùµx-_ã‹çÿ¯¾Ô—Ôg¸óæÎ›+de-ý00¶J_/}ÀèN”  L)¤È @mLÆaÍ‹×ò5>_«§Õê`ÙhÙ(Ýêßê7ž&ÜíâxÍéšÓ ‡Â襇R¸99òvdud5!P/©—@ºT—êježÌPö)ûAd"2´ÐJ+)³|¶š£5G5w»8½õé֧Ƴ`)´ê{›²h{ööl¿_ñäBeD!L!ËYŽœýF!‚ÑGŸø)§Ë° #åÕ¢Z**ÈÚ(¿üñàAMàѸ­Bˆßçc·±;0ÆÒÇÒ!ü^ûOÐó¦çMž)wTƒj€pAx]xLÔMÔMÔÁdódód3øúúBðHðHð?áa[Ø+=‡=‡yþ$Êc/½\6v»s4=B„âä0ìQö(àÿ„)¦Ôì ù¯f½š¦×LÕ¦jdÕo«²«²áâš‹k.®Ô©R@¦3ә鄤sIç’ÎAó­æ[Í·tA>·ÏísCñùâÎâN0ÿÙÜbnAþþD¾5ß ÞFµImR³aïν;A½Õ#"EBñ¯øzúëièHøò»/¿“UëL¹½¹½„|v_‡¯W/®^\ ý3ý3ý3zá¡ËC—‡.CƲŒeËàžÿžÿž_÷·+íJ»™‹2e.ÒíùæšsÍ„;*:*d ¤ ¤AdnTà‰©×Ô+íl{d{dÓg§ß›~Ö׬ÿhýGÖ—Ö—ÖK—<.Ñã*öWì¯ØMÖ&k“U·«ƒê :·Çíqƒ;躃0p`àÓOaùê—Ã/‡áŸç¾ýâÛ/KKAÍ›š’v!›ÛÍíêÜÜ€G\¸>`òê gƒ³ü…þB!¬(YQ²¢ìر÷ï'ÞO„ o†7à ~›ßæ[˜¬”•²RǵÆZc­rl9¶\³8qêîIùÎƉ ÀÓTCªA½#”óÅ|!í¬ÖC[awiw)üú`úæôÍà°88ÀBÓBÓB8+•ÎJ8d=d=d…²ú²ú²z½‚wÀ;à€3Óg¦ÏLCçÍΛ7Al›Ä&8–~lɱ%Ðíèªëªƒ‘U?äþ àñŽ€ÜóÂÊVJ»à³Øëÿüüççg×[eM>`?`'´Ö¼6im´¶µ¶µ¶é²²²ÀqÊqÊqJ·{,‹Ç»êvÕíªƒ6k›µÍ % % % °åÇ-®-.È^°ªoU¡\»Ñr£EVÃïðƒò팡ý•»«vWP³‘Ê>eŸ¾3Œp›Û@#4Æõë\ç:0Î8ãqv‰Œëvñà ÊWÊW³'2voÙ½Eëg'‡®XÃè2ºs85š?šÊŸ¢}F±Í8fž)‡£ürh4g4À8j Ì¡'ÖÇ~ÖùÙ‘¼#¢« _%¨ *ƒê»ê»„g¿ÇS¦˜ú…ί¢ Óxñ¡Xü”Zª–Ƨô+ý€7Æ?³Ã°Ãð‹?vWRövÙÛqw%/ùxÉl߾ذ‘‘@$ ”+å„@^‘W0`k~-^Ë×ø4~­žV?ªçy~]<·ï±çóû?ùÙfH¥Þ@IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-0.0.png 644 233 144 1367 14774263776 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܬIDATHÇÍ–?hAÆ¿=5wòǃØ)ØØbÀ69P<D’"¨XˆURš"…•¦V†€ØLLH+zêZh!BÊ9°84&¹ÛýYì¼ÝM1&Žfy3ïý¾™ÙÝH’Žº§ u"u"Õæ©ñxf 3pòi˜?j€WôŠŸîBçTç@n:7í/ǹÍ[}²_ŠùI=×QÅéÙô¬—wù\=}õtæX˜ß/Av.;÷£7Ÿß|ðlæÙ ·¡R®”¾ç¿ç!ÎmÞê­ßxI¾&véKpdéÈ’÷Ò-é º/t_蹬öÀ¥ÁKƒ_}=¤ ±´Ñä5,ª‰Üæ]½õÏø¦gú¡AWW¿—‡.e‡ ËO`ìøØqÓÛžîq6¨×ê5€ÆµÆ56!(%<<ˆs›·zë7žñMÏôC?Ú¹·ÎÕ̕Ldè-4Þ4Þø#þÛn"¶] Ë·£jâ~ãßôL_IC§B¶’­ÔÃJc¥/‚?ìó3!¼É&{‰]õ;xc=Óý8c^íñ[ãQó™ÄØ íÕÐß ;ùþ™X?ô“ ×íÜ‚Ô7Ú7ê–QÞYÉ›÷æµ%iCò$¥•Ö~Âú/â;½¤þ¹AÇËŽ—Á,Tz+½;ŽJ9(ÿñ í7/â»0ýРמk÷?Cõ[õ[TU…`=X?PC»ý%ùÕX?ô“’üEÑû,Õ õB´ì]’Vµ¾âß÷ëÂxÆwz¦úIIµ|-ÿñôêÅ«Qïu)X Ö´%é—~¨1Ç‹øNÏôC?îð¿/H¥ÉÒddìƒD‘¢Ò’ZÕ*$mæ?Ãú/â;½¤þûB³ÇšòËß´ÿʦ½]ØÊ5Ý}LRÞ`Ñ¡•yWàÅIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-25.9.png 644 233 144 3221 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜFIDATHÇÍ–ýO”WÇÏŒ(o*!&%Ý–6 ‰¼E–¤[´¤q}›.TQhj¥$îJ6;¢!»Ñ¨!,¿`e•Eí(*KËe•.]²‘&Q·2°k¦»–‚0ËÀ´óò<÷³?Ì< Ûîàùå™sî9ßó{s¿ç ˆˆH|è+`N1§˜ã‚¾ù`8¾zËê-©—ƒþy Lo™Þû<÷ás$´$´èþ±nä/¯ ã/ïgÄ%^ÂÈöÈvSAÈ? »7ìÞ°:)èÿ~,×-×P~£ü@gkg+¿„'_<ù`®`®Â¾±näõÞr|9ùƒþ"°²ge韹*r•¼XôbÑˇƒ Ž—aç¶Û¾^ñõ emˆ!FnÜ6³Ì7ÖCùF½gàýŒþA>kÞXó†ØåÚå²4 Úi´µÚZAý ÀÓ´ÒJ &“ ¼==xÕ¿õ6½ Ô´>£Ï#êŒ: Uhx!ð4ð8K#Ĩ¿†ðnØzm½Á‡v:¬+¬+,Íùß³­+d]I~I>¨tÿ0 £ƒ:©¿«¿‹_ª«ê*ji<,²HؾÃg™Ÿ fÕ,J%jnÍߨQÝÂß]r¸ä°A°®pÙQŠˆ¬¯§ßò‘å#w8^u¼ þ·øùtò7UßTáñû]~W¸ß¼yÞ:}tú(hÑZ´ÍÌ7é_í_ 3ýß&›ŒGćñšñ`Ò2lvG|D剈œÿÕª…ùïô¬í]Å qGãêãêQg Τ}Ò>i‡ÔÅÔÅÔEH+L+L+„Œ¬Œ¬Œ,¸w?î~\˜ëŽëŽëËßDÝŠzõUöÛÒÊÒJ`<Ø**€¸ ³þ/‘Ÿv‹ì:½ë´Hןìød‡)ÇQîxÞñ¼øæÏÌWÎWЉy¼xEÎùÎùÎùDí‰öD»HYCYCYƒHÇ…Ž DÒ«Ó«Ó«eÉÚæÚæÚæDæ÷»¸ˆx =iž41ý½ò«”¯RÄwõ³÷Þ7åˆX‡¬C"Úƒ|ÌæØÉØÉì<‘lk¶U¤ø/¯›^7™š?¹ýôöS‰ìk黨wQd!y!y!Y$Ök‹µ‰h Z‚– 2p|àøÀq‘m÷¶ÝÛvOÄ‘ïÈw䇉­µ­µ­µ‰LÅOÅOÅ‹´i³µÙDkΗœ/Iäܘ3Îgj)h.h‘·££³ó„Îø[ñ·ôüb&o&/|íYªª ;7;7;FGGÁ™áÌpfÀPÚPÚPZøÈ6'mNÚœu•u•u•áøBßBßBœh>Ñ|¢ö:÷:÷:!a8¾+¾ ZF.å^Êeô"½´U±kb×èD;½)z“jOŠ'ºÿÖ;Þ;¾«µ_ÖŽÖŽB¹ÇÜc†šS5§jNÁú®õ]ë» énÓݦ»^‘^‘^O:žt<++¯¬¼²ºÛ»Û»Û!Ï’gɳ@SvSfS&¼Òz,õLüÌYä,˜mœmõ“˜Ç1U»h¿ùÒ7ß¹ù|ú`äÒÈ%u`Ëž7½ozñn½¹õêÖ«©2U¦‚~{¿½ß ›65l‚¹s7æÂµØk±×bÁµÏµÏµvNìœØ9³I³I³IPo­·Ö[!§0絜×àÓ’nO·op_ÕÕy¹år ð Ÿ\œÿ*Š+Šг@ëÕzƒ ×2ÝZJ êÛ’ 2È °íl_¿Ímn™`b)ªh 8`ÃÒ­<_q˜ò:C:†eÜ2îŽPÏÏ탠Îhc>—Ï…G»¨Ý×îƒú•*Wå icÚhµƒÚAЭºU·UTQz’ž¤'‡x÷@óéëôu ¥ùª}Õxôß,éXîx.°<²×¾¿9µsjæÞš{Kõ8¶·ç§æ‹8ø©|¶_rÅqdÞ˼ç*NØàÀª«Ü_ÅíK!«)«iÂ„ŠæŠf€û ÷ø "ÁH Z-Ƕãö|;߯KÅ— ÿáô@zÀÕ™™"PPRP²´2>¡w)ìÙ½g7ÀË´—iÚkÈ&[ïy=†Sl;ž˜oçÛx6¾ÍgóÇõx¶{¶‹@YyYyV}<¡çÚŸçϳùbMDñã'[[±h, zÐ,6‹™ÖuWÝžë^Ý ÜÕ'õIÐOMŸécšfóŽy€ZjÉÆJàáÏ÷çÛ{î8üq=òñ¿­ÙûÝûÝIA€´‚À”:¤Ã@cò8£’J*AEÔ tÜ:MêB4?Z!+D ¬WÖ+ fãÛ|6¿¤ úöWÈŠdEÞÏ‚gÖ3 x À÷ T“Úd9ËalçØ–±-ðúá뇯ÂÐÖ¡­C[AÊPÌDg¢3Q½J/×ËSðJ•¨&Ñ6~‚/Éדví œ8w✭Öj+ö.öÎYøèŸ£OFŸ@A_A_A¬˜¿bþŠù°Ú³Ú³Ú=]=]=]pêê©«§®BæÍÌ›™7áHû‘ö#í)ÂÚè¡ÍofµYíð9üq=F|ß6¶ˆl«ÚV•ØFq­“ ®µ®µ2c;Æj}Ô*²·toéÞR‘ΒΒΑőőÅ‘ááaï<ï<ï<‘¾Ù}³ûfKrPlT6¾«Þáë1DÒö¤ía¥HzKzK2ï­ëºÑat8@Þï€w@¤¾¬¾¬¾L$ ƒA‘¼Ky—ò.‰ÎÎΊ¸+Ý•îJ'/æ‰yb÷A÷A÷AÇ/¹²A68|Bätætê{YYïkÄ ˜Çnò5ùš|°$º$º$ u ëÖ-„5¡5¡5!¨m®m®m_¾/ß—çWž_y~%,;³ì̲3žO„'Rnë×VÄŠ¤œ½$\Oâð?­‚ÆÑÆÑdÚq¬Ö¦ù‡çaÂ`ÕYW¬+`UYUV¨"U¤Š€AU¨ U!X›¬MÖ&PwUƒjg1ê¨:ÊdÂþ\ûßÊßeu¨ãê8±DaÔL%{¢NøœÝÐÀ L¤øPÇÔ1bÞg+ÿ'ze²—A¼·QM5ÙÎ/¶[‡™ýX?À… ÛŽ'D"߯ûl¯üb__ì{ìË|Áþ ²!Ì1GÛÙ9IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-36.1.png 644 233 144 3143 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–íOÔWÇÏ P@ j_´VIJM „T%‘6X‚M³J ¶Q4kÝDj£‰$4,íÖ¶˜†dY 4®((PL E í`ÊV_,¬:¼°*aÉ 3÷w?ûbøÍ̶ÿ€÷Í/çÜs¾ßsïùÝï½""’´ò°n°n°&më‘°?öíØ·S¯í:–}–}#çáùÚçk’¿IþÆp†msÞŒÌ ãGò™~I’°cUëªVKΊý ¤¤Å¾´¿[»­Ý€£G;Ú.·]昜pç¸s l›óf¼™oâEâË'à˜î˜nË}XõܪçD å­”·^ù00ö Ø÷Ø÷<Šz¥­ ¦tàÁƒ9žDØæüJ¼™oâ™ø&ŸÉ¬G`Ý›ëÞáùsùs¶Æ`‚³‰¯Ë/•_ý€¿zê¨#”(®(«²²¤oŸŸןëÏôˆªP²D ุÄ%ر‚w½ÜQî0 t6Ѳ׺×jk4ë‘ÿïí—»xé@Æ ÐoøÀoü:S-ªEüú–¾¬/£ —ñÐxÚ)ô!}HV“@Z Œâ×.u_Ý7Ý~ÞÆÃ,ðË]­Ùü5}¶«¶«žhÛ0¶üUìž~cª~ª_àƒ@] .Ìä÷ûÇaúôôééÓàOó§ùÓ"Jé£>àg»½sžw<ïàó»‚ø0f³wm7l7<Ñf=¢-""u? uBÁ\³Ì;w¼¾åõ-¼5ÙžlGïØÿÃþ@ŸÕgõY(.+.+.ƒø¶ø¶ø6È>—}.ûÌVÏVÏV‡ 1’Œ$# Ü_¹?u Y_eµdµ oüµ³¤³$•aì»O¤³ºk¼kÜòZà^ :P-Ë®»®¹®‰Å¹àTN%Rá­ðVxE†æ‡æ‡æE«««D6'oNÞœ,â,p8 $4|5¾_ÈîÇ»Ÿî~*r»üváíB±ÄÜ©‰©‘å`”å5úv¦ïL7³2;…§‰‰º•}Õ+õ4Η͗AVOÖ÷YßCª'Õ“ê‹k.®¹¸âjãjãja£w£w£ò*ó*ó*Á“èIô$EQÊ«¼Ê *SeªLؾz{Âöøö…¶±¶±0Ÿšôê£Wûûu«•Yæ,sl‘öÕ¹«sEFÔ¯'~=!3þá‡_éüOçpç°ÈúÇë¯,Ò–Þ–Þ–.’½){Sö&‘ñâÄ‹ÌöÏöÏö‹4ô6ô6ôŠÈu¹.×EÈ#<‘¨¡¨¡¨!‘è£OEŸ‘ËQËÑÐÆÎHlLoL¯ˆH”=ÊΫþV•¨Ë=‘˜ïb¾¹ó—;w&dÝÁ¹ƒ¿üEÄQè(pˆL^˜¼0yA$'7'7'Wd¢i¢i¢I¤~°~°~PdJOé)-²öüÚókÏ‹4Ž4Ž4ŽˆÌŸ?><ÜÚåîå®å.õ0p+p+ä^'ÿ ¤REDŒ.£ËrOøBDän9=Í-Í-¡Ó]ú·ØÊÖÊV–¶y·Mo›††â†â†âðÖ_‰»w%2{2{2{ i¡i¡iÜ'Ý'Ý'!&&&&&Âyg²ÎdœÉ€Ÿ÷8f³,™|ÆâÕ߯þnþüwËÅ<p¬ôX)p#xJÐê”:Ö!4 º[wën ™fš#äÁ‰'PA~Ì–Ì2 O tcp¬âXEøT £+:†mÔ6ê‰æŸ®® >ꌪZîXîÀg¼däùÀOA}2RŒ#T‰*Q%`Ø »as˜Ãa™àUTEÈÇûþ^/>=gê˜k«k+àµÙÆ"tìOÊÏ»±ïÆ×~‹ê¦º `”%øÃ+f™e`‘"Z…ÆÀžò„'€aÆ¥F)~¼+x~ófYáû³ò¯Ü•ì-Ú[qWòÑ˽Òùv šjÂ-Pï©÷X= ƒÊnÁaÛœµl%ßÄ3ñM>“?tW>³¯‹gö=öl¾`ÿvÀì&¢'#IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-21.6.png 644 233 144 3172 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü/IDATHÇÍ–]LTwÆß>ºC)él×ͶQkÈJ] h¥† ÄRˆU>Ê”e!jÛè’T7݅Ƹ²I±ÄÖ­ÔXGQËK-6¶;Ø–vD¤jéR¸°¶Û¨ CERX ³S`˜™sÎo/fŽCÖ½ØKß›“çýxžç䜼ÿ¿€ˆˆ<~ 1>b¼?„["ù¸ü¸üe'Bøˆ†CÉå?C¢-ÑԜԬöG°^×û΋Døêéyy@" Ó‡¦ ¹a¼ÊV–­Œûiïë†øSñ§f‚°õã­´µ´µ° n~uó+€©Ü©\ˆ`½®÷ëó:ßB~Ùý_ú"óYÌg†`Š5ÅŠÀâ¼Åyþ>Ô0ô(>Sø ÀhÔh”fe0cÖr/^ôp/Àz=ܯÏë|:¿®§ë‡üXr,9"4MMÇÛCýïq¬¦¥¦´ S¼JM˜!8P^V^fžl U;¡Ð®hW€y¥\)g‚SÁ)àDhþß[5‡jéûßãH‘§ÈoK®%7òMÃφ§øeivi6hz´:õyõyÚˆvN;‡¦µk]ZhÿԾѾ!ÓL1µÿ‰2ÊÐÔO”ÊÀ$“ =æÿyijiªn°á©ŸRDdùÛtÆ¿ÿ®7†’‡’!ðëÆ»µ÷Ö^f»Ž€ƒ»bÆ3ã™ñ@`80^PpâÄÁ_Ÿ> ã¼õí­o™ ¤„øa(m( 8«ë‡üˆ–)"räKxé͗ބϨië?*8^p7'îJÜ…–ýVöëÙ¯ƒ{‘{‘{x[½­ÞVȲfY³¬àÜîÜîÜ1¢ä)yJ^ormº¼é2˜·˜ëÌuh¿~õÉê'«a²LíU{Õ4ضrÛJPGB~Œê˜ˆHÆ'"EõEõ"½ñé†O7V mzpèAñ{Z<{<{ÄÀˆ;|ìð±Ã""}Ž>GŸC$f4f4fTîDÔÙ¨³QgE:::DÎ_??v~L¤÷w½9½9bXnJq¦8Å?Ð}mɵ%†U"ù±ù±"ÜòmL¸žp==S$½.½N¤ 7Úí1Ø×ö]˜¸0!ÒUÛµ«k—ÈøÛãÇЬ)XS°¦@¤ÖQë¨uˆ¬®®ŠÌvÌvÌvÈ]áîq÷¸{Dn›n›n›D í…Ý…Ý"¿²¬0­0‰éñòe¶e6ƒ]Äòƒå# m mé™F955Ì )5¸ .‘Ÿ}žÔžÔ.‡·=k{VdçOvšwšEšÍÎf§HŽ#Ǒ㈛ü&¿É/")’")w›³ÌYæ,"éQéQéQ"7þ~ÃqÃ!290©L*"½ÒôDÓ2!òPýCõ"ªY*¤‚Fõ»`}°ÞpUÚî»yßM‘öïÎ Ë_|ûö%ˆTþ¶²¼²\däèÈÑ‘£";v ìˆû6ú6ú6ŠC 1‘|cfcfc¦HòÅä‹ÉEÜ·Ãí±_³÷ÛûEÆ\£ÎQ§Èâ‚%cKÆÄ"2wfÁ©UiU†«¢üADäR ´onß Î«}­}­Ú‹ù¿Y;¿vžùuIëLëL:œ:œ: §OžŒüÔÕû«÷Wï‡KY—².e¯ØWì+†õƒë×´uÚ:m…“æ“æ“fÈèÏø:ãkø›©éƒ¦˜±h/rü}Ûû6Àò^G¾„ª‚ª]NM¥Céo¦i4þßðá÷/e)KFrðNV£_±( V׫z­ê5Àò#´…÷ñ®x—7Zû‡k•k(o„öŒrÍ?ãŸaVÙ«|¡|ÚçšS[°ŸÔµD-b‰%páÂÊœ2§Ìï`ÃêrµR­e‹ßî·3«f„÷X§+Ù• ÿ}ü÷ÞhþÞcwm~¿Õ`5áÍ<­t*À¤ºAÝ@øÃ'?†ÏÆ A‚!¯¨€7îp'h ¾ ¾@ŸrN9§¿V ¬qÖ¸ÿ¹ùÃg%ÅåÅå ÎJ^yø•‡ïœö°3½A/€R©T2Z·Ö €D°^×ûõyOç×õtýŸ{ùvqÏÞÇîÍì¡ó¨ê¢÷”èIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-13.3.png 644 233 144 3133 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýO”WÇÌ3ÔAÁ5e—Dcj*Š[Xƒ¸–Ví mhê [Ó+ݰ«ýe5bCÔPˆ ›­1a´še["ÈK±JcŒÓºËnd×Å(ÊØlC…Öp`ÊðÌóÜÏþ0óÌ̶ÿ€Ï/“sî¹ßïwι÷œ+ ""‹#¿‰K—&. Û‰»c~Û ¶~ñ—°ý‘ ¯%¼vë°¨uQ+€Ãépwb¶¹nÆÇï‰áÇó™~Y,1GJGJGÂÆˆ]o<ýÆÓ¶Ÿ…íÆk`ï²w͆àíî·»:Ïtž¡&®O\ðmôm„˜m®›ñæ~/_êÄ/IŸ%}–ð_HINIeeËÊòjÃîøÔý©fÿ  ªž}·0½0 ™×¡ü¡ü¡|¸Pp¡àB¬ó®ó®ó‚/à ø“•“•“WW]]uuUL˜³ÆYã¬â%ÅKŠ—€/àóú¼ãÈìËì#èʼ5~k\UA¯êU 7†õþ…½ {U# &€ª‰Ü£líí(L*´Z¡kw×î®Ýq™82udê”Ô–Ô–ÔBúTúTúxŠ—}NäâÇýIýI2)’~0ý ˆ›ØX™(=FOÂmÑ´-Ú‘„Ÿ‹ˆH† <·unËÜ‘äºäºä:‘¥7Jo”Šìtítít‰¸ò\y®<‘ÇM›7‰È¼Ì˼Hwnwnw®È•ýWö_Ù/²«iWÓ®&×—ÝeñýÎWæ+Yä^üþâ÷%C$D¤R¥©´„Û‘[9´¿·_j¿¼>c‘B8¤HAË eЫPýdýdý$¬µ­µ­µÁY÷Y÷Y7<ò<ò<ò@ùXùXù“?:+ŸØ×Åû{2_°ÿä„3,ÞÕIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-37-grey.png 644 233 144 6314 14774263775 16017 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—kPT×–Çÿ{ŸÓôËAc$"†nŒAÑ#W ‰b XˆÊ `ðQ&Æ%Q/ ‰•˜8KƒâÌÄGÂhˆhaAdDc°T"BZ”Hû¢¡±»éÓçì=èÖ[¹•Êú²kŸsöZ¿³Ö¿H^^^^^†aÐz:]¼'Þïñê¼ãyÇóŽó—òä?Èð·ñÜûq¿ÝïÊ#å‘òHÓJW¥«ÒUÉ?E JPBrŠP„hE+Z¬ÄJ¬äŸª“ÔIê$’+þ.þ.þ~£„X‰•X·Ù1bLj#jo¤¤¤‹,ËÁ$aƒ]öp £Ï#‰HúËgù,Ÿ]–ì’]²¿8%¿*¿*¿ê«É"Y$KÍ5Ç$Ç$Ç$Ófý~ý~ý~œ7Å›âMñ$7B¡ŠPSü§øOñ¼}ï{ï÷Þñ^Ïü{âyã{y¼|¢'ƒ1Ü—ûr_¶„d’L’¼_‚…à‹Gí'í'í'ÇøÔÔÔ(ã[ã[ã[©;¬9¬9¬™$ªsÕ¹ê\8ð!>ćÐÁ2 /ãe¼ ‡+Ðè Dbs}s}s=wú]èw¡lã“ÙOf?™ö]°.X¥Q2•L%3n?ÏâY<ëÞCÙV¶•me ÜÉÜøoÂaˆ0äbˆÔ'õI}cnçççÊ‘ÙÙÙºÁŒ»:^¯Ž‡ÌRX KŽâ£ø(€‡òP °"VÄŠfb&f‚N NP'@öŽwß»ûÞÝ'¬3>2>2>’#%Y’%yÌ-A'èÝÅ/—캼ëò®Ë€šõѬ?ì° Ã.ÀǪë í í JW•®*]Xš,M–&À§Õ§Õ§x‹½ÅÞb@xgxgx'°¯n_ݾ: Ï¿Ï¿Ï¸Àˆ_ˆ_ˆ_¼‘7òF rwäîÈÝ𣚣š£‚ãÍÄ7ßLD|¹±ÜXnTª@UàÎ…T‘Cä7²ýû=ö{ŒO'˜&˜&˜H1NàN<EÙβe;Û2Û2Û2`Ͳ5ËÖ, ÿ)ü' ¬­¬­¬ pŽqŽqŽRÒSÒSÒ1EL4[š-ÍÄìÙ³ô’^ÒãrÆåŒËy&Ÿ‰&^˜x{y¼|¢«ÇÕãêÁŽOŸ0>¹Ú+Ú+Ú+pðÅ|1_ YF–‘eÀ §_8ýÂiàCozãðÒŠ—V¼´0$’ ÉÀöí7Ú§ÍisÚ€à†à†à€¯åkùZ€è‰žè+Æ+Æ+F JŠ’¢$`ôÕÑWG_Ø$6‰M‚¨»¥»¥»GPtPtP4roöÜì¹ÙƒÝ"vav‘PzŠž¢§žý™ h@€ñ1>’’’i¯´WÚ ”H%R‰´ùµùµù“·NÞ:y+p+àVÀ-@¹¦\S®ÂAá p¸u-êZðÛßüvHkNkNkþ§I÷>ÞÇûÏãÓ¥t)] à0ã0 ¥ÂHa¤0’Ÿ¶MµMµMÅ]y“¼IÞT“jR ŽÇxŒÇÏýÑ*ZE«€ˆ¬ˆ¬ˆ, úaôÃè‡@ûÔö©íSËfËfËf@˜&L¦=_¦êÚêÚêÚ€)3Rf¤Ú m†6`ý¬Ÿõ4æÑéø¤ã@â£ÄG‰G”#ÊÜ?tÿÐýCÏÌüªùUó«€»Ö]ë®L“Ådù§LnÄFlЉNtÂÙ>¿}~û|ÀÜeî2wásÍ]Í]Í]¹"ÉHÞQ"æ‰ybÉ­®®VÆZÝV·Õ z‘z‘zl+W>®*T¨<˜­f«Ù Ô%Õ%Õ%Âæc> ƒ:¸Žë¸ •¨„­ß¿ß¿ß¾ç»ÏwŸï–ǪÞS½§zO±±mcH@ZVñB^È Å@aæÌ™3gÎ䇇8ĉ;évºnoÏ¡³él:ÛfRr”%'aC‡Ò¡t(òô°Ka—Â.Ñ¿ksµ¹Ú\Øø%~‰_‚šÄ’X @=ô$H€A¿ÿœÎ?‡‹ˆ ¯°WØ+ìʆ{gï½wVܧ[®[®[^Z`°lÛæÿz’ñ$ãIù˜a†™ÉÞó¨è@‡|ë±ëIåøòñåãË h²5ÙšìÒëpëpëp±÷ÛW¾}åÛW” žq¾èBºàB3šÑ À 'œ|à€7ðÞNæ’¹d.ÔWÌWÌWÌ<¶±¦±¦±F(ÔÐÐèNJ'¥“9ŸÜÞq{Çí7s37c¨'Î1/¨ÃÓžbCØ6C›º›º›ºi½´^ZŸó‰ÞOï§÷»wªµªµªµJ(¬N©N©Ná±d-YKÖBÍN°ì8´ÐB ð>ÞÇû"™Èp>2?2?2£´fbÍÄš‰ª·è-z À¦²©ljÎ'tÝC÷tx¤Xä9z%x7âž+‰ÚÓuyÖÝÂAí*µ»`ðÊq±Â½Ú½Ú½š­Kci,Ñéa{Âö„íA»Ãî°;ÐÑqt—œ+çʹP444(FË4Ë4Ë4¡M3Q3Q3±0jpÒlüž³bV,y*ûž·b°y3 Ï׳’” ƒw±ˆì'ûÉþº3tEgm¬D²ET¹«ÜUnyuï‘Þ#½G £”RJÑçÍD­³ÖYëdŽÎâÎâÎb¡M³M³M³íöyW—«ËÕµímsÚæ´Í<€c½§5/à³°?| ó8hðh·â_´;Ò:Ò:Rìý&oò” 0Â#†6û7û7ûãËúëõ×믓%º;º;º;ËÆ²±ë.‹‹ÅÅâbgtHDHDHíñÄ{ËÓ:ÿÈ%àOlp5€ìé6sîÃ}ÈËk–×,¯á¿•ÑÊheô5Y¢Q‡¼sàaÜø‡qþå½-½-½-ü?šŽ5k:¦Ä£‚¥ÐR8V $|x.ñœvÏÄÆºž/bò‡×3ü²NLGLGL‡eo¿ řř±ëƒø½›`í²vyx½çõ€ÎÖÎVŽÁì׳_¸öºö‚‰u#ÞÈ7øÂùåÝßÔ¨«QW-ÿ†˜è˜hH·§ÛŸ~#pÿixùÀ˦›~LÕ Ä§ï ë¡x#ßà3øzFý`?){RöˆðÏ|w¾ÛÚL¸×Æéšk>} ÐÅ9>â#â@q*NµZ­ÆÏóÀyý‚~@¿­ßPªGñÓ¦´)m ß£–Zâôù Ÿ>W“\“ ¼ªGÁPÁµÖ'­O2÷4ômxß¿’õJè»CÀC‚žªŽ«ã(`;ÛÑõýýÐïècú¦-±Ä¿58ËYÀcŸ±Ïˆô7ö7ö7Êsìtä9òD2>Í(Í(y~nOážB±¦þ`=a=!}7 ;ü­¾MäøÛÇß~\QCý(v‘Ñø|ñóEh¸rûÊm½üñ;zvôàw¥ºâ]ñ`ÛlÛlÛ ×.]»tíØ“íÉödó ÜÈ¿‘#?lï2ô =|;};};Áëð:¼84p`à¤ÛžüòÉ/ñO,§/§ëåpùòåË éÁ~„…øžø½ƒÂ™ú™z“ØÓ¼X±X»+wÝ}’º’º’º`nÃ܆¹ f\vgvgv'tgvgvg†maÑJÑJh[´-ÚÓäΑ±#cðãÛ·›~50ýÜôsñ_Å¥wˆ~:¡%¡E» žï<ßÁÊxÕxóCïÖ Ö{Ÿ{Ÿ{lµlµlµ@K[K[K›I˜£åh9tww›þÀt`:0mâѩѩÑ)ØXµ±jc¸ë]Õ®ê0™Iq®8W€ÿ$F&Fjw#ônµL-³Ü‰ú,ê3‘[/Ýš¹5#)¥îÒ‘Ò‘Á‘ÁáÁaW…«ÂU!’ð áAÂó Òi4¢ˆ"Êô7¨ jƒjâöSí§ÚO‰dmÎÚ”µIdÝ_››D´ED$EªÙj¶ˆXµ~­ßrWx/tÆ®_l¿Ø¾zBÊÿûNÇ;øs’s¬9Vhîkîkî[û×ÕÚjmµ6ÍÍÍß1ß1ß18˜z0õ`*x[½­ÞV8™y2ód&ô^ííèíXM÷kÝÁz(½ø«!£5!¹83•å•å@€–…®¾©¾¦C?r‡;@M4…u¦¢¢òÿM#¤À!a–Ytf• eb5( ½²®²ÎhìÌ€0Ò1¬ãÖqO$gÊý)Ô?uL­_é]éeYû–¯å×è¡'¬îaí°vˆ&šh`’I&AWçÕy`”oø´ͧù@?¢8Ë¡ôýx''¬³ÖYO¤¡«k•Ÿ¢Ø¢ØV§~¡~ •ieV' °º•&4¡œ8Ã&¾¤ÒÀ¯:TÇê/2E1E1ƤþGùCw%%%aw%o=õÖS«]@=õÄâQ<ê«ê«øA¿©ßÀ‚Ll¬ñF¾Ágð¯Þ•¡úÁ~å×Å#û{4_°ÿs"GEÁÏEIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.0.png 644 233 144 2570 14774263775 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü-IDATHÇÍ–]HUY†¿s= N?f&è!I„ô¢ìçF)KSJAf$»¨œ´¡Æ‹ˆ 2Š`’¨ ƒAû¥‚@³£$QM4t M6ŠÈ@†ƒÔQG=gï½Ö3ûì³ÏLÆÜ¶nöþþÞ÷]{­õí% ""K"O¯ßë÷.²mï×®?qkâÖìë¶}ÁOµ§ú·`qÛâ6€¥—^T¯\Û‰;ù±õ".~,Ÿã—%â:|·|·<%»¾Ìÿ2?q¹mŸz IÝIÝ›°¯g_@×å®Ë€ñ§ãOÞ•¼+×vâN¾SïàÅâKËøE ¾/¾Ïóø| "°²teéª&;adl¯Ø^07§½`½’IÖ%À4Ó8ã¯Û‰GòzÏÁwø~[@jqj±TÕVÕ&uÚ¯®Asfs&`Ý@'$ó£yÄ<Ä›»ÍÝ„@êA`^‡u@¿Ô/sÊœ"¤5FŒ ‡C"Ùjtc5g4g8_]sùm=òïµmÝ 5‰5‰€0Àzn=~WëÕz ý>§ÏÙQæ™cw4ÑD¨q5¤†¢^­ã̳ƒËoù·1€QWçlݳ”""_œ…¤ñ¤ñéÏ`ض€Y¶ñV•©2f ÛP¡oCûCû!˜Ì æÄj¥•V× g†3Ù0¹r2}2t¾®Õµê¶ºÍ,Fðõ°9l‚Ëo뉻ð 4i<̨°–ZKÁJ±ò­|÷ ^}xõáÕP:U:U:å Q ªA5¸výxýxý8$ÝLº™tv=Üuw×]÷ rßì2»€3_„?¢'"ìù÷p#x#­Û«–‡ûÃý„Ïý¡ûC÷‡Ü…¯¨ª¨ª¨âƒ888y¹y¹y¹0Q4Q4Q9'sN朄^zg{g£é!+dó¹ü¶¯È¢G‹‰o*Þ$" ""žNïÛ„²„2ñ———‰œÊ8•q*CdçñÇwñÌzf=³òÁxò:åuŠHZAZAZHÚ³´giÏDü)þŠÈèç£i£iÑtŸ”Ú|Qþˆ¯HÜö¸íä‰Ä߉¿#¢ŠDDdÒ©ìœï w†Ev<ìxØ!2Z>Z>Z.ò ð ð ÒÝÞÝÞÝî ó^ò^ò^1óÌ<3Ïõ©Fª‘*’øUbmbmÌL;|6¿£Ç+¢*à1w˜;D¼DD$Õ©Û²jKÖ–,‘ë¾ë¾ë>‘ì‘ì‘ì‘ôæôæôf‘̺̺Ì:‘Ž5k:Öˆ-¶@çw:3Öë €ªWõ‘F«™áï"ï$h,ì‰ÍGíQ{0\<ßáû óÿÏ¿ÒèNp‚d0§Íi«Îª#ú±~ €¸¶wòzÏÁÿè¿ò“½]|²÷±Oóû±³š™ÅíIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-26.png 644 233 144 2574 14774263775 14712 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü1IDATHÇÍ–mH”YÇÏŒkjY&´V­L·¡"Û 2• é­ˆ2Ò> …– )’"*µ]„ŶH–‚¢Ì2Œ éÅt“ `Yr2)‘&AËÔÑvô™ûÜß~˜yæ™b£¯Ý/çœ{þÿÿ=Ͻç^™ú 8Sœ)ÎAÛ¹ÝöÇÆν´O+p¬w¬ÿç $Ô&Ô$Ö'Ö›]¶mÅ­ù‘ù"6~$Ÿå—™b;b®Ä\qä‡ì#°iþ¦ù±ßí_@\c\ãxv4íh¸vþÚy~‚þŽþ€÷ùïóÁ¶­¸5ßÊ·ð"ñåÈ'ü"}+ú–£b¦ÄLÔ•©+çì Nè™EkŠÖ¼Žz¥ xâu>àÇ5ÞFØV<4ßÊ·ð,|‹Ïâꘕ7+OÖ•¬+‰« &týÉÉ@ÀhNsšx~Tª@ÿ˜˜ÍuŽÎ tà‚Þ®·GÄT*!œÆ á‡ù,þ ùøßþZc7Æ~£Ô¸RÔauC/ÖÛô6´U"Ý ëu=è"]¤‹À2ß™ïÂDoÓUº Í µ[íÆåW~à_ ?Äæ—HA™¿A\\¿ïèVÝ*Œ»šV3ÉLâƒå0¶Œ 0˜>˜>˜F¹Qn”ÛBŒn£Ûè†Á=ƒ{÷€1ßÈ02ìø'x«m>‹?¨'$ìt”*?de› pãÆ¸½pß÷¾y¾y°öòÚËk/CBRBRB,»³ìβ;0zuôêèUpºGÝ£0-kZÖ´,X~`ùå`¨aèÌÐOÿm´í|aþ g°nKnˆäîÍÝ*£8™ë´ÖZ&-Çõ ×·\ß"Ò³«gWÏ.‘‘7#oFވėėėˆl^°yÁæ"O?}üô±H{_{_{ŸHfbfbf¢ˆç;Oš'MÂôJÔXøŽEó/¹á™qoƽ…?ˆä­È[Ϋ‹ê‰vD;$ÆòöööŠ´¶µ¶µ¶‰Ü~rûÉí'"Ã9Ã9Ã9")å)å)å"}/û^ö½)j)j)jéÕÿªÿ•ˆ«ÃÕáê çº¨Š¨ ßQgó‡ô@âôÄéæ3xë}ë8öͺN×ÅSlo‘ýqûãöÇë‘ë‘ëè6=¤‡@PÇÔ1PåQPÕªZUƒîԺ̳À,U¦ÊT˜?š Í…ÀŸxñ˜;Í|Þ_ìcÿÓù wþvÕLš¥f)C¡¿g€`ˆw¼&™d2Ó€ÿ£;Tƒé6Ý ª‡‘øŸíü_¸+ƒÀqŽoÿbµUmeôý°m+Þ¡| ï‹wåWûºøjßc_ç ö?ðÙ¾(‰hIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-117.png 644 233 144 2643 14774263775 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜXIDATHÇÍ–mh›UÇOšÄ4¬™-[ec³E,ˆcc„ÍN†•HaBTh7¡ì…ì æì—¤Eƒc ‘}pkÕçu…®¾ "nœm·’µ‘½@㦃ÍÔµ¥Ú4Åäy¹??ä¹y¢SðãΗç9çÜûÿÿ¹÷žs¯€ˆˆÔ:_ªû«î¯Z\ò«v¹ñêÖêÖ‡Kþq <Ï{ž¿ô*Ü{ìÞcuÔ}`_u}×ã+狸ø•|:.µâ§§<-Ž6?¶ù±êú’ÿÆy¦‚©¼ »?ßý9ÀgýŸõó"dDzc³-³-àú:¯Çëù¯_ýƒ_ü_ú¿ôü{÷ˆ@ãÓO?øRiÀOBô™è37½7½ª ¬) †ÕäÈ¡mºÂ×yg¼ž¯ñ4¾æÓü%=KŸ\ú¤<÷Âs/ß/M¸:€™X‘X¡ùŒO°}ÔpÒüÊü ÀŠY1  .©KÀãªY5gÔ+êàŒ²BÔã²qÔôÐCúÑÁ;??¬^àgö÷àûZ»•¶ˆÈ‘´I›”¥U·ù²ù2¨ ëŠuÃI(½2ª[u«nP•Q\›gžù²§€ÃÆâÄ]|h«o«×D*¶RD¤é-þü-烉ù‰yà6úN}ÇBþ…ÐBŒŸŒQ)À±üÉüÉüI°VY«¬U`l1¶[`êÐTr* ÓǦ‡§‡aöÖÌS3O±ðçkö9û› s;s ~ü4çÓzaÇG™Ü»{ïnMc¯VÕÆj˜=:ûñìǨæDsgs'œî<ÝyºÓ4=0=0=ëZ×µ®k…t]º.]é é é ê u†:¡éÕ¦®¦.ð÷û¿öêsøÍa—ÏúuWlWL¯ÜñQGØ÷qýpå‡+Ë+ËÏÌõÌõPXß½~ÿúýnímÚ:´Õކ£á¨›?{â쉳'Üü\ß\ß\Œ¶¶¶CãCË—ÃÍ÷nl¼±‘‚æS=ƒjaßÇ,Q§˜Ï>’}¸ê Ýo¯µ×‚µÜZf-ƒp  5“šI͸ÄUPá%á%á%Ê¥r)·J˶-³-³-½û{÷õîsãÖ”þˮͮ­§JÄõFyTjüCþ!¹,""3ò¶œ‘3"Þ¬wÒ;)â‹û⾸ˆ§ÞSï©—²<OÀ#âÛéÛéÛ)Bt¸ùñ‹ãÇ/ŠŒõŽõŽõŠìX¾cÅŽnÞû°ÃWðâÿDD멱¿°¿ð\̨CDD–z¤(E ØUì*v‰˜×Ìkæ5¹ÃŠÉb²˜16Œ n|pdpdpDdÍäšÉ5“"µÉÚdmRÄî·öX{Däv‰OªÍÍæf­§J$×’kùá[ñœ>7,"ˆˆ°SÖ¨ ¹Ò"ÉH2’i7„Âw ‹$"‰HB¤!ÑhH¸ñE×]_t]d{ßö¾í}nÜssÌIQ¼Ÿ8üZO¹*Ù{`ï·JÀÌ™îYQ@AÕÿe66v…?Nš4ÕxfÁ,8ÈØ«]þ¿UeÓ[̳9j˜0ÀÝvÂN°`Çì£öQP³jRMþ‹Ž˜³c n©[êVEü#»ßîµKõª^û]û]Èkü k‚2ÿßû˜n´G"ÐVÝV]Ù™­´•òv»ÝŽáô~å§Ã’')–  œ{SQ°;ì °Æ¬±J|ÍwGçÿ»’ÄÊD¹¯)àu^§ÆÝb«Ãê ê¼:€¸¾Î—„3_ãi|ͧùËwå]ûº¸kßc¥ãÝö‚ý †É0 S_IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-95.png 644 233 144 2533 14774263775 14713 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–_H”YÆß™YW‡•þl„–Elnf%9›H(l8•hÿY‹‘½i»°(!÷¢¨¨%Ê-’)ÌÂ¥B˶Ø\b—$Ù,)5ÿ´æÌ|ç;¿½˜ùæ›v­½íÜ|ßsÎû>Ïóó÷™{ 8=NsZ;wÙý)%)% ~Žâ³ ÿü¦Ÿš~ `fÃÌ³ÛÆÖ¸Ÿ˜/bó'êYý2CìŽä¦ä&Gq ×ÀÖœ­9)³£¸®ÜÍîæ¿ ØØ¸rþÊy¾‡þÎþN€7ÅoŠÁÆÖ¸oå[|‰üRó/}HjIjq¼€äÏ“?Ì5™k²DþÊ‚Òõ¥ë^¹^¹´TH%UãŒcµÁlÇâ­|‹Ïâ·ô,ý¨´¢´"ذmÃ6w}4¡û"TgTg@¤8ËYR9e3ŽþÝÈ6² qUûµPZk :d¶™m _…F!!ŒŒDF€_©¦šÔ¨ÑH3ª:½:Ý2Ø}ÑÖú‘÷×ö§oasÊæà@ä¨wê0Sù•ŸˆþRêB´5E:I»´ XËZÖb·C Å‘óŠy…¨VÕº׋ëK¢¡¯N‚»ßÝ?þô¨'üŽ_̹æ\&¬Žpo¸;Ü ƒ—/^íÑíö³Ÿý0¶`lÁØhhhƒàÁª`¨/T¾Êй:— ºbüq=K?ê'fìlì=´÷%o.Ó‘ÈpdØþâ±®±ûc÷a¬“uî6w›» ¶Ù~dûmmm„y™ó2çeÂâðâðâ0,]¶tÙÒeðdÖ“Ô'©6Ÿù6ü:üÚÖ³õ£~bƺüpiôÒh<¯R‡^†^²zÎÜ>sûÌmXU¾ª|U¹½bÞdo²7Žï:¾ëø.XÑ·¢oE.;\v¸ zô<èy°Ä[XÏz`TT'-~]iëGýL»3íŽn‚þ¼þ<;_7›6T*0ß7ß7ßN\8qáxÊ,¬YX³°zWö®ì]ióéoŠÄféGý8E\¥®R¾IºštU¬6äÚîªqÕı”Ì)™S2Gd‡o‡o‡O¤ÕÙêluŠUF•Q%²ÈµÈµÈ%Rÿ¸þqýc‘·;ФŸN?~Z$ A›O»YÂ[ÏÖúqŠ˜×ÌkŽ'"†ÏðÅÓtž­gÛDJ•>*iéjéjé)òùŠ|"«3Vg¬™upÖÁYE¶ oÞ2,R¿¼~yýr‘ÜÜ\‘œç9ÏsžÛ|ÏÏl=[?æçCÿíj§ÚI—ë°=áuMuMuM—–—–—× ®\/°Çk}µ¾Zx'½“ÞIhÌjÌjÌJX1kXü¦¨ýǦޕ˜Æˆ1’P‡îq‹[@}ô%5Ð@àĉ“ÿ¶[±¼RJ(Ià‹CÆP‚ÞÔ»rŠ:¦¬:cî1÷0Á³Ø¦x¡žª§ ²U¶Ê³Ö¬5k:èuNSç@ù•_ùÁ,0óÌ<àt´,›ûÌ}LØü­cSTþxeVwÕ]³Ò¬$«ùšoy{× 3¤11É÷ÎP f…YAÄæ³ø?Xùÿ笌4G9J*ãÆ8€*Wå„@·ëv8ÀÆÖ¸oå[|ÿÏÊOövñÉÞÇ>Íì?$|;¯/ùbIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-196.png 644 233 144 3042 14774263775 14771 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü×IDATHÇÍ–oL”WÆÏƒ(h”˜ K¬š˜º& Í %(õÛ)65jkÖbZš4@”4Ò¤&~ëf·$˜¬Z…tM "¤¸1›J;Ŷ6»:STaøS@†÷}ïý퇙—w²M¿;_&ç<ç<ÏyϽ÷Ü+ ""Éᨴ¨´¨¥!;ê/Ž?¾0¾pmSÈ>o«ØUüß“T›T °ìóeŸ«~Ƕq;>2_ÄáÔ³ý’,Ž#îZÜ5W~ØþJ2J2âW†ì³]ànu·>7áèõ£×Zê[êyžt?é˜ÌŸÌǶq;Þηù"ùå“ÿÓE‹:\?C\l\¬¤¤¼ôA(àáK°çµ=¯ EEë(°ü@"‰:˜aû7aÛx8Þηùl~[ÏÖÕ#°b늭"°ïÍ}oº/…ú¯`V¦V¦ÚzF+â=Þ#‘zóKóK«Êª"ÈßôëúuÐ÷ÕêGàŸºL—X'¬¹b^1¯€öòïÈé0a~#¬· ªÇYJ%"òévðˆG òêãf•Yú?ÖÖa@³HÏé9ÐËõr½|¡cèµz­^ ú®¾«ï‚z †Õ0¸Îu }H}§¾Ü!~ð¬ô¬¦l}‰Ülþî÷ÈL øžùžw(Ý«{ <Ÿ , ,ãFQç2ß2ß2ßcícící n«Û궃†aøËýåþr02‚û‚û„á"þí;å;àžqÏÌÄØõ„ ;ÿ5OK–µéT¦Î52L˜<7ùÅäèœ39§rNÁÍΛ7;á‚”‚”‚H8˜p0á ìoÚß´¿ÉÁ§N=œ ‹/ö-öAnUnmn-zâòèg£ŸEè ¾ûö»oÛ{ïü×Q¡¾eµÉö¼Î¼ÎpÅõÇÙÖ¹Cs‡d¾h´È[äWωž{>I©M©M©¹:~uüê¸ÈtÚtÚtšH 1Ðhyêêê9’|$ùH²È}ÿ}ÿ}¿ˆ·ÙÛâmÙ°|ÃĆ qý´êÁ·¾•y[‘ܹlý¬¶‘¥_-ýê•l¹³õØÖc"ò“ˆˆëRB]bSb“ˆ·Åû‹÷‘¬Ø¬Ø¬X‘©US«¦V‰¤Iš¤‰ÈˆŒÈˆˆ4v5v5v‰ •••‹ÈCy(EFïÞ½'²{v÷ìîY‘Ì{™½™½"/?ËÏ—8ÙÒ‹z5¿:¿ZDÌp=°lɲ%ªƆdžk¡c¯µU£Î’lîÝÜ»¹ÚÖ´­i[ãøOÖœ¬9Y%ëJÖ•¬ƒõ;×ï\¿¶Ôo©ßR; wî(tâsòròròà¯wÎÝ8wÃ3ÖŸG²G²Á®'JDÝP7\}‚¹ÇÜ#"†ˆˆ¬pýAæíF‹ˆ[ƒ­ÁV‘ؽ±{c÷ŠôG÷G÷G‹t4t4t4ˆl»°í¶ " I I I"e»Êv•íy4øhðÑ ÈÅ‹D††}Ã>‘ôÕéÁôàý i0§Ì)§DD¾¯€æ©æ)À  °ÛüÕü• ýIÇ7ßx|#ô÷÷;8söÌÙ3ga“g“g“Ú{Ú{Ú{¼!¦!¦!²'²'²'àrÂe¹G.\¹Öó6w4wØ›ÿû çTRZ]Zíœ0gLg¢k³Ì:‚xñâó˜ÇþnºéíÑínq‹[x?ÓL£©6?4?ŒÐ³J?*ýÈ9•‘sì‰ûÉL Úgø @ÙsLUªJêªQ5 ƒzZO;:VŸÕgõ•aeX *T…ªpp• ¢U4XǬZ«Ôf£Î¨#À¿lþÄDÀtº3ÇìAûévðÄ{âÉ–×òÏÕê Œðì×€‰î¥‚à ¯Ñ¡ä…{4sê-õXßXßDòÛz¿™ü¿sWR¹ºrõA+pšÓ$:Kl°Ý¥»ö Žmã ["œoóÙü¿{W¾°¯‹ö=öb¾`ÿ¾kä*›Ñ¼8IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-123.png 644 233 144 3040 14774263775 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÕIDATHÇÍ–oL”WÆ ­Lœ14¥Ö®IUº*ލQG@¤u±$@¤•&]ml»n¶ IJ-Æ(1Ùfë¿m ꮊ«LLÑbÛd™D„ ¦ÛHHª¥¥b×T@,Ða‡÷Ïý퇙wÞénúa¿y¿¼yî¹çyžÜ{Þs¯€ˆˆÌ}’ŸJ~*yN'ï°çS‹S‹5Gq£IeIe7ê!íôÒO§Ÿ6ûllÅ­õ‰ù"6¢ž5/sÅž˜Õ2«%ÉÃû òÙÊgS‹â?w‚³ÕÙ:¥Ãk—^»ðqÓÇMü†»‡»Ƽc^°±·Ö[ù_"¿ìû/}xäÓG>MúÌztÖ£"°°haÑÓ¿.¸õ4”¾PúÀ]Ç]‡J#¸p)/"„5F°­·ò->‹ßÒ³ô£~2Ög¬·¾¸Õy*šÐw½öÉÚ'-=­•µ¼É›¸hÒ?×?0êŒ:"UåªÔ5óšy ¨WÏ©çŒ÷Œ÷ˆð'ý}ý}PÿäU^ÅÅßb|Äøõ˜^\?êÇ>JSDäƒB(—r‰ ¨Ýz^ê+£×èE‹é8p€ÊWù*?¾c¨6Õ¦ÚÀ4ïšwAíWGÕQÐB šzÜ,5KõQ~(Ï(Ï&-}I,¶_çˆs$”ý“ý“À<êKõ%ᩉ°;ìí¯Z£ÖhÑ–jKµ¥Ìf³Aój^Í›ߨmÔ6B° X,ýÀLóL3áXøy¾è?ÜÀr†B)–Ÿä¨½?xdä•=¯ìqë"Y®,—ò°[÷èùlüÐÄ÷ß‹³¨©°¾°^äŠëÊÜ+s%>¶ÛrlË1‘Åy‹óç‰SL1"·ß>~û¸H‰£ÄQâÉz,ËåÙê~)õ¥Tqj—¦ÏMŸ“ÏdeÖ[Yo)”UT¸õ¸Ÿ¨Ãž²} | âòÛ©?úé‘U»WíZµËþw{6ôlèÙ/\¼pñ, - -²‹ŸÍ›6oÚ¼ –w/ï^Þ ¥™¥™¥™0ºrtåèJ˜ÿø|÷|7tù;ª;ª‰XzfÃùÚóµÖOÑS#0§cN‡jarø™ág€¾ØÒ]fž™ÆF¦‘ ùÞ|o¾.—].»\‘{‘{‘{pçê«w®B{]{]{,iXÒ°¤9œ@¨Õ¡:`Í­5·ÖÜ‚yßÌë›×Á ÷ß¾ÿvBmžüvð[°ü¤»ÓÝæ×0:8:´D{¥Ìûæ};qõ²ÕËV/ƒV_«¯ÕgÏׄkÂ5aðx<®g^ϼž ŽÇ€º†º†º†`|Ýøºñu]‘]‘]MçÏ>sØn3Æ_FÞy,?É"f›Ù–ôµ —ê¥"¢‰ˆHFÒ¯dFfìZš®Ÿ®Ÿ®qù]~—_$°#°#°Cäà샳Î©Ê­Ê­Ê æs‚9"'SN¦œLÙ¾mû¶íÛD:«;«;«EÆÞ{}ìu‘´@Ú™´3qú Ù¢ŸÖO‹Ø~¬Ã7á›Ñ3ç7ú¸>nÕÔøkü5~¸Yp³àftI—t ­-Z[´JÚKÚKÚ!·7·7·üûýûýûáȉ#'Žœ€+ VÀ©ñSC§†TŸê#Âßcz¾O|Ÿü¬ÆDD»`çž{,ærÐCº]Ô ˆØ6ÿ¡P¨ü !B(Žè zC‚ž±óÝïZÆ»ûذs8”‚ê×ú5À´ú˜YkÖ6+Í}æ> ‹…,5£fÔ {½Æ^0n7Œ`œ5ÎgAUªJU ÆEã#ã#0þh4Í`Î×ê´:ÂüÃâÿÎõ Ð?8°û˜üüVÿ ÊSËSíÎFÀ“f…Y†Û0aàGðcŒ±¬1ÅT¾ýÛ¬2«Ðâ|q~Kï:ÿ/Ü•Ô.¨÷5­8À\ö//Õ©:H" llÅã%Ë·ø,þ_¼+Ú×ÅCû{8_°ÿpÉP.ˆIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-37.6.png 644 233 144 3207 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü·GNf˜Á7\Ì2ëç“N:ºÖ¬~ª~Š °a}¿?*uCêCà';üŽRDdígüÍü¥ùKG<\ñp¸.ðÎè̳ýÏö3¥>ÐMW’+Ñ•cùcùcù0^:^:^ öaû°}f g g ™7Ü?q¿å~ ÆN=»ûì.S®u|x÷0ø«¹Æ\ã2ôˆ®ˆˆ\¶Âqõ¸ ¿Ã†M‹ûÅ–7b߈…°wÂŽ†EÏþYv\vÜØxcã111kºÖt­éS©ÆTeÇÊŽ•›/ìÐà¡ÞC½`9b9o9¾í÷‰&~¶t­[ëÖâàÄúëA{ìÑ íIhIžJži.jnV^s?p¹‹döñáljE¹¹áfÂÍ‘ÐÛ¡·Co‹ØWÚWÚWŠ”;ËåN‘å…Ë —ŠìÙºgëž­27:B;B;BEnýûÖð­a‘î£ÝÛ»·‹²6x]ûºv™íV^Ùµ`×¼z˜ k kÒëØ7R4Rä[¡£êÇ÷|¶åm;µí,n[ܶ¸ žï}¾÷ù^_ÝÁÓO< Å‹/_œ¿Sµ)µ)µ)`*1•˜J :-:5:öÛýêîWÁñkg¾3`tÉèÐm 6èuÔ(ʱҸðÍ…oŠôªßÿî¸üpoê^Ô½(‘æ5÷6÷Š,«XV±¬BÄÚbm±¶ˆ   ‰XÏXÏXψV+‡É•\ÉõíØ´eÚ2m‰ŒŒyô—GõêElý6Õ¦Šüé~åæÊÍòƒÈÒ K/ˆhÉ bôj–š¥<1µšZEz~Ù3Ò3"‘ßf|+ÒõÏ®»]wEl¶N[§HTVTVT–È•‚+W Dâ‹ã‹ã‹EÂφŸ ?+b?`?`? R‘[‘[‘+ÓÓÓ+2^?^?^/R5PÕWÕ'2<ø¤ýI»Èª·£‡£‡%RdºcºCDi×sôåð±ˆÈ?ò¸yõúÕëÆèÙCÎׯùiÑ&Ó&TVWVWVûŽè\ì¹Øs±ÐRÞRÞRî›­­­…ä©ä©ä)˜H›H›Hƒk–k–kHèKèIè?W^¯¼ŽÓàãÊÕÒ«¥@½G×..[!';'hÐâÐÕ“êÉ9>~îs¸Ä%.ùýDw¸Ãà)Oy hhh~ùÕ¬f5ð9%”øáõ©‘j$ð[/9…9…À¬G0àõ1ÌæGåƒ[·€úϨE³-³-Li‹´ÚN`†I&A³jVÍ z¦ž©gú )§œrÐDM€?RJ)hkµL-Ô#³U³ULi ^»93`þÞü½#ˆ¯Ís~ÒBÒBÀãí®o˜Q¿V¿в´,\s+þÇÁç9¿†Š L2θƒ>×?‡gÜ,^¾ùÎï½+y÷½wßó»+ùè¥^šhŠ(Ân‡Û fª™8AïÔ;PPÀy£Þè7ð |ƒÏà÷èy‘_/ì{ìÅ|ÁþèÙWà¶A]IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-33.8.png 644 233 144 3223 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜHIDATHÇÍ–íO”WÆï_:"Z\Ôj75›%Q–IJ¸¨­^2MEñƒ/+¶ltÓX5šE!2f £$…ºEÑv /uÄÒM\\SmØX7Ù (2D³©Ú2èÌ8q`†yžóÛ33»þž/OîûÜ÷u]Ï99×9""b‰|âæÅÍ‹›Žã~Í'¬KX÷Ë¿†ãF L¥¦Ò»‚é ÓfœqV¿y£>¶_$ŠËgäÅ"ÑÄÔŽ©¦U‘¸>\üáâ„Yá¸Îf»Ùþ*;»vv\l¹ØÂàÙ÷Ͼp¯r¯‚hlÌõF¿‹/5ÿÇ/“¿ü­é1L2uм½öíµïì8ߢ‚¢€ãŒWq ¹€$’Ô*À‡cŒÄÄÆ|¤Þè7ð |ƒÏàëHÍKÍá³bO±ÇÜn¸ÿ%§ö~¾÷sP7Æíœ¡‘F’@M€?‡~ýL@ÝÖëô:à¬:§Î¨>ÕŒieZ¹Cnà3Îp†¤ ¼ó{Ûö¶ïɹâ@qÀÜlè‘ÿÝÛùüºԺÔoÆoC z_OÔWV•­²Qêê€:0±R¨Ùj¶š äðïEóÌT^åE©yš¦iŒ~ü ÌüßX ¬+x"?f+ED~uŠ˜¿2å›ÎyÎy0~€ ®Õ?µüÔ‚?´6ôIè“(ßxÉxÉx ¸Ö¸Ö¸Ö@Ȳ…l1‚ª©¦:ÁÁ0\ô¬óY'þÐ¯ÃøàŒwÆs›¹Í7ÉÐ#Ê$"ÒøTj•xªxÁ }éïVädäd€e¿å´å4jãºyó`x÷ðîáÝw5ïjÞU° Z-ƒ`=m=m= †@C !*ÈèNt'B¡¯p¤pÒ¦å¦å¢J–.(\£+ô¥ðñÉO‚ª ë‰ÓóED²/‹ù‹ü"—mß<ùæ‰iY¨?d Ù$èô:o;o‹©¿µÿbÿE‘Cµ=Ù _óË/wÀÊ+w¬Ü)‹R¥,‚çÏ3žgÀXÏXÏXä&ç&ç&CŠ'Å“âa˰eØÅqmpmpm€Œõë3ÖÃôêéG¦e¥™oe¾ï<Ê£\ý®~P'’ “ UGçM“‡ ±'¯I^#rW{Xù°Rž÷ùûæô͹tòÒ©K§Dd-ÈZ%R·¥nKÝ‘Çúcý±.b¿n¿n¿.2§bNÅœ ‘îGݺEW¬-½-½-]dfúÌô™é"Þ#Þjoµˆ²¨,•%ÒnoOiO‘ç"©ñ©ñ"Ê&wå.qê’¶MÛfê™Ü=¹[äÎûwžÞy*©›=›Øüƒˆã¼£ÅÑ" ŽGEnz¸éá&‘²Ú²Ú²Z‘›ûnOäeýËú—õ"ñWâ¯Ä_±¯¶¯¶¯1ç›óÍù"O*žT<©éTz§.2rÇÕæjIÛ“–˜–(©"cÞ1¯ˆÔªl•mêêDDþµ—¿·¶·¶Oþíµ ÕÕ²®f]κ Í­Í­Í­Ñ-:Úu´ëh,ï]Þ»¼.8/8/8Á-nq WWWÂÈ«‘W#¯ é@Ó¦”— 5}Ñôƒ·:ZÀ…°žˆ]4~»¶ïÚü-rJ”¶GÛµ)p{ÀV¶²•×Ç𨧞ú˜ü1Žq ˆôx^m‰¶h7N它»zX0ñ1Ìæß$šW ®mØg´#Á¯ƒ_ã×—éé¥PÚqí¸v´*­J«=SÏÔ3rÊ)}¾>_ŸlÆŠ´jš¦¶?ØìÄ¯ÏøXûໃÌC¾Iü'âc¯9?$|¨ˆ3i×´kú6}ã¬Æe4f…àe„5Ñ0ðŒ›%Â÷ºóGîJJÊJÊbîJ>ûéÜ ;`ÃF„|!€V®•åPL˜ óF½ÑoàøŸÁ?qW¾±¯‹7ö=öf¾`ÿ {רnsËIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-147.png 644 233 144 2733 14774263775 14773 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–_LUWÆTk@0j¦;0)‰!ño4dbjµ!)h%¡´ÑDSG08LúÞ4(1Í„"IuìƒCHKñÞP `¤“&mª^‘’!Á† é圳÷oîÝ÷ÜŽ™w×Ë9k¯½¿ïËÞk­½DD$%üˆ}+ö­Ø•!?ö¸;ž““Ñò/;““ÿóHþ2ùK€U«Õ×7q3?z½ˆ‹ÍgÆ%EÜå­Ë[cö„ýÏ¡0«0+amÈÿ{/xÚx¾6zÜ£T""µû @ $"¨_{íÏìÏ@?süŽ+Ð(?~ü Kt‰.Á5'âi šj, Œ2 Ö¬5k÷E¥ˆHfx~õü:¿ †^½ð>èïõ÷,.Ì.&-&õÈúÑú1JÀ ƒ B0#˜Ì€¹Ss§æNÕ`5X 0åútêS˜¾0í›öÁÌø‹w_¼ËâoS=ª‡÷áÙä³I`Àóç›ùeFOXØå>žŸ(:QdØÔf½ÛÚlm†™ó3-3-èì/²ÏfŸ…[µ·joÕòŠyǽãÞq(¸Tp©àôõõAÒpÒpÒ0d~”y0ó Ä]óÅùÐÿu¡ûB·Ëçüçø±ãÇÌÎ]î û¡ŒM××__Ùùc /æêæêîòî*ÝUêÖîâ;ÅwŠ]Awoܽq÷†ÏkÊkÊkrãóGçÎ…¾ô¾ô¾tHËH[—¶Æ®ŒîÝMÐðéºæ³Íg°ÊV~·ò;ÝÊˉ·'Þž„§–ªmj8ëœ77a{êöÔí©ÐÑÙÑÙÑ 4ÒH#ìõïõïõášC5‡j oEÞŠ¼¯îè‘Gyõ¥õ'ëOF¥â”ù›Ø6± ŒUI«’Ôc˜ŸZCe¯µšT“.Àßßôôöôöô•sWÎ]9rFÎÈØ9¸spç Äâñ¸ßv¿í~<Ízšõ4 6<ßð|ÃsTªUQŠ“Ãmæ·é_¦£'VDu¨Ž˜Ç‚}À> "–ˆˆ¬‰ù£,É’DÌqFœ‘ÙìÙìÙl‘œ±œ±œ1‘æáæáæa‘5k6Öˆ¬nYݲºEdKû–ö-í"M•M•M•"[G·ŽnI©H©H©QWb§XD&C|’`Ú…"®“c\Ÿ½> ô‡ÎœývÀ˜o‰·Ä[÷?Üÿpÿ«GÕu¯ë^×=8í;í;ísÇ+6UlªØ7GnŽÜqÇÕ-«Ð*$ˆæ3ünŽ…«’•'*Ý*{Þv;ºfŽ)¦\`«su.ØÝv·Ý ªSuªNà"¹:_çëü(å½tÑL˜¾fí`¸Ã¡6»ü¿«ÊÌðLx&æ—¡‡¬! P¦©rU΢:¦Î«ó zRGå^Dèm}[ßUªJUiÔδªkêè?ëz] ¾R_±È‚Ár†ˆðÿ¾™F[»   ¬ÕN¿Ó,¨Õ‡XáÞ¯!ò²%–X^2Ç\¨àp |oj‚ê°:Œ΀3oø^éüÿ箤|}y¤¯Ym@U$ºGìvÝ«{ˆ!\ßÄ#)^oð ¾á3ü‘»òµ}]¼¶ï±×óû_O—iüÑt³IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-87-grey.png 644 233 144 6271 14774263775 16026 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü nIDATXÃ…—PSW›Ç¿çÞB—¡-Âf´qCK•‘‹€8@ýYpZ±®(Z§¯Ž¬V¬,_Kq_D:Ùn¥v[k‰ZÊÀkW¾X¡Ë „R~4TäG ‰¹¹¹gÿ ‘Nw:}þyæäÞó<Ÿû=Ïsr)(((((€æmzÞ1qÜ 7È Ò†‚š‚š‚º¸h¼h¼h|ý êK}©oÉ>!@Â÷ÚoÚoÚoÒp —p‰ä!ÁЋ^ôØ‹½ØK?n–n–n&yÜ/Ü/Ü/?^"SdŠL¯*ô/ô/ôoê.ÞU¼«x1 jA-¨IÊ<‡ØìâòažF#ÑÌçb‘X$‰Í¼…·ð–VÕÕÕ}>Ä›xoÒß³†YìaáGçççQžžžDò"$’ °Z¹Z¹Z ¸Çîçî÷ÝóÝñžÅwåsçwó¸ù8—‚±Ô‹zQ/1“d‘,’¥>ϪY5«þ®ÚrÅrÅråE¥ŸÞOï§wæ&õ&õ&õ2ŽÐ®Ð®Ð.’&Í“æIó`Å œÀ Èa…V»±»"°ÚUv•]…´®»]w»îRÇ­à[Á·‚ÅÜ'ÉO’Ÿ$ïø»\-WËÕ1žÎ,g–3+ñ<ͦÙ4{0“€€€‰eÄ÷Ä÷Ä÷Äj£6jSý»ˆ]Ä.úNÃÏð3üÌ‹ÚTmª6UˆÎyšó4ç)ûμbÄ"M’&I“ ˆébº˜9 ¤4 Á4˜b…X!Vb¸.†C.M‘¦HS ¸çï+ßW¾¯œ}GûXûXûXˆæ^à…;X9+gåßiÜrºùtóéf@ð¼ïË?Z¶Y¶Y¶íú‹ö¬ö¬ö¬–½%{Kö®ž®¥kéZ˜i?í§ýðbƘ1f €:è€ùÀÉ$™$ FAAÌK4¡ MX°`aF¯êÛÕ·«o i†CŽ!‡«Wè:…®æ7ÃÍp3ÿÎsœ0—²š¿Áßàoìú‹_º_º_:դצצ×rî1C 4ðÂ(F1 ؗؗؗ'p·HoÑ[ôÀ«y5¯x3oæÍ¿ñÕ|5_ XuVU/g¬3Ö sz\z\z÷¹ß*¿U~«¨ÆÍãæãæ—êým…CáPëN­;µî’|}}áá•ϦΦΦ_úòЗ‡€á¢á¢á"À£Ô£Ô£ظgãž{€UgVYu(o-o-of”3Ê¥[@€»À]à.´¶Ñ6 º$º$º^$$$°¾šöjÚ«iHÒiuZ¨$*‰êýmŒ 4‚&2ÇwÂwÂw¼¼öåµ/¯%•ØýØÿ z…^¡WSSS@ÎΜ9;¨–¨–¨@g×Ùuv`ö­Ù·fß2<2<2<€ô±ô±ô1`‡y‡y‡ˆ={.öÀ+x¯–[~lù±g…â±²qeãÊFRéæqóqöIû¤}ÿ¹"eEÊŠäÉZe­²VX7œ7œ7 w+1W3W3Wø„ú„ú„*•‡Ê°··Z”-Ê%`-´Z u©ºT] Ð8GãÒLšI3ЪmÕ¶j>†á%?,ùaÉ€&†‰aàäòy¬K_YúÊÒW÷`òÁäƒI”08Ó8M‚™«ÌUæê³/“"X艄ò„ò„r``d`d`( ( ( .¦]L»˜÷÷÷‹K—..œGGGïÅÜ‹¹ çç牑‰‘‰‘¿iºC8„C ù™ÌNf'€‹¸ˆ‹$˜cØ6€~e^c^c^C^B„!ÿÂmç¶sÛA‰HD‚Üï»ßw¿PÅ«âUñ@tHtHt066tº Ý`|ñøâñÅ€¿ÉßäoÄOÄOÄO€Û†Û†Û`mÆÚŒµ€lP6(ÄYqVœ˜¦€)E²ÖòÀòÀòýL“ƤѯÏ=?ôüP(ë÷ï÷ï÷§_uFvFvFxoãmØli¶4[Ðv¢íDÛ º/º/ºˆÈÈÈRRRkƒµÁÚ a†°¡Œ«««G“£ÉÑ„›ÂMá¦ß(™‹\äÁF`Ø4°i``5ŽGQêÙïÙïÙ/”qHG:Ò /q \—ð·÷š^kz­é5ç²eÉË’—%³¾z_½¯fM‡¦CÓ¯;÷ïÜ¿sðV{«½ÕÀ£ØG±b|ïñ= V «†8:Tªð\ýsõÏÕ>6› ÀFlÄF€9Áœ`NÀ.d ™B&äß¿5~k£‰@"0ÿ ñ$žÄWO“ /]xéÂKÀøñ;ãw>¶ì·ì·ìß© Ê Ê ÊuÙ³7fo [6}múÚô5د¸~àúHŸ?5~ È5r\¬]»>ˆœˆœˆœX½{!÷B.x*ðTà)`³b³b³¥¢T”‚2vÆÎØAjjjDë½Ù{³÷f¹|D>"ùß7uŽ:G]ÔG$ÿçüŸóІ6´ýs…d\2.o–Íéçôsú³»»»iBJOJOJ¹M÷Ñ}t¨ãyÇóŽçAØ6‚Ø×Ù×Ù×4£Í*Q‰Ê…]@š+Í•æL“Ådd+ÙJ¶ÂúÓñŸŽÿtÛ¯T\©¸Roeddž&S–²” ߎåXŽå÷3Ì%æs‰mgÎ2g™³£ûÄ>±/‹—7É›äMÀÝ­w·ÞÝJ_êJèJèJÀ¤ŠT‘*Ø$¢D”ˆ»†]îè9zŽž †j5¨AÍ‚âl;Ûζ?4Ï*g•³JÈë‹ê‹ê‹„eƒÄ 1ÄLÌÄ|R$Q$ŠD=Ü2”¡ŒS±ññññññô"‘ˆDî}&ŸÉgòŽ1ÉL2“lw¾ë|×ùnÊ‘¡±¡±¡1!.´=´=´ùwY±¬XV 3m¤´R’M²I6/xÁ <0 ¥´”–ÂN‚H ‚âºåºåºÅydð›Áo¿áÊå{ä{ä{¾(2™ƒÌG?y²ûÉî'»É—0£(¸Ï£ aCB7ã0“›+t+t+te[ú8È©5E™¢LQ¬Ás¥çJÏ•e1óM“û±R¬+¹ ×ÊþÕ½bÅÅÅÅÅÅ0»…ëû³%8Ìßy¸ ržœ'çoß`Ö1ë˜u¹7‘ld3Õ9êuáÀtÕtÕtä Ã0 ƒ·M¶&[“M´ŽTŽTŽT²Ï“ž'=Ov×ÛGí£öÑ“7l0l0l\€Ëܧ57 ›ïèï€Ý/È]Z\µ{ýÿÕnÀTÀT7}­àZÁµçh¡…Þ]Ê.e—ŸÞm¿Û~·dÊ{ä=ò@\&.—½Ó̽ɽɽi{E¡‰ÐD0“®|¯¹¼í÷\,þÀæw®aõ Ôƒ¼m 1…˜Bð_Î%Î%Î%÷©Fª‘j^ÿè×Ä_MTê¦N?œ~Hÿ£órçåÎËÎØ9ÇœcÎÁ–ÄIâ$qÿ¦¢U´ŠVýw=¤BÊ`“˜Ý+àJø=ÁŸØÔnЀg!½IoÒ›ñ}L-SËÔ~¯yºé馧›ÄI¥¤RRÉcŸ±4Š/ˆ/ˆ/ÐjWÜ: õ8ü‰ý®v]Û…³q¹É.²‹ìúŸ Ú@hÃñݲ¥²¥²¥ÌCvˆb‡F—Š%b‰Xr`¬çž7zÞæ¡qÅs,mÆñ‘f‘‡„¬íIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-22.9.png 644 233 144 3165 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü*IDATHÇÍ–]L›×ÇÆ˜—LLM4’޲Юi”ÚA4@@ ­(5…f|IM²Y¤RmqH(l#\D©À%•BQrK¦L䈰ҙÀº­š“„ˆH-p‚[c¿ïùíÂ~1[w±Ëœ›£ç9ÏóþçëŽ!„Iá^@Ô–¨-QÆõëˆ?¶0¶0íbÈnS@W¢+¹û;xþÓç?ØØ¹±SŠØÚ¸¿>_ˆþúzš_$‰ˆCYY—¶›`ÿöýÛc²[nƒáŠáÊ÷A°^³^èqô88ߌ}3àÉ÷äCÄÖÆµx-_Ã[/šþ«¾ð\ÿsýºÐoÐo^,x±à¥£¡€é—`ß[ûÞxý8ZF€âHù€/Z[Xgkãáx-_ÃÓðµzZýÉyÉyBpîí'o?1t„¦ºh·9l#+4ÐF  E­Áåà2~yG=£žNÉSò€¼+ï+J¹RŽ‚ž 8K;í$È¿†ñ®ÙlÁ©.þd‰¶D:4>â?÷Ö¾‡ôҜүœ€Èkê'ê'T¯úµú5RþVÖËúµ•B6ÊFÙòoò+ùUÄÏùX>FÊ)^ÅK@[QÕÆß_z´ô¨FоgÝV !Ä+­ >7|îé—§_†À»üÂýê·û1¾@nàýÀû‘zMMMàÞæÞæÞ¦@S i¡zêYG|õA 6 ƒó/Ì¿€O½Â×i×iàÁipzc4>Bf !DÛ—ðAóͰü/õõâ«E_}Æã9ã9dÞ¼‘¼˜ÑÏègô`µŒZFÁ¸Û¸Û¸rZrZrZ`arara2BèéÙ§gŸž…"Q¸Z¸ qÃqSqSÈò†²Ë>\¡zP3T3C|Dð'Bñ &&‚ã÷½Å½ÅòPzrÚ´øµÅÖbk±L¹¦\S.ìÚºkë®­YDzŽe»Î®³ë"þVZi²ª²ª²ª"þ󯵼ւ¿ûÜ uÐ*Á@Ã@ÿâ•ø ñ)S“Åd¢èN¶.[§ëøóøÈâÈ¢Ðõõ õ ñ0þaüÃx!êRëRëR…èŸéŸéŸâ¦û¦û¦[ˆ%×’kÉ%„Éf²™lb­¥”¤”¤”1—4—4—$Ä¥ã—l—lB|ž±‡yæK,KáÞÏ +À2‹,Bx­%R=¨$€_¹¥ÜZ“i'”éËôÿSùÃo%–rKùº·’ã)ÇSÖ®§9M½A/€R¥Táy[Þ@‡"¶6®Åkùž†¯ÕÓ꯽•Ïìïâ™ý=›?ØÅÖi, “IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-1.1.png 644 233 144 2415 14774263775 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÂIDATHÇÍ–[hTW†×\’LpŒ IUbšbÁ 5" QD…D!Š’ú iPIBc@¨>èKÍ@A[&Q’Á[Œ€%‚6U+)3`k¦¹Œ23gïýõaÎÍZúä~9¬µ×úÿÿì}ö¶€ˆˆ,´ŸÁ²`Y°(¿öò‘­‘­Ÿÿœ‹Ï)ì ìzø-,è\Ð °¨kQ—óbgÞ©÷÷‹xø~>'/ ÅKttbv|öT쩈”äâïî@aOaOÊ‚¦¾¦>€+¯\¤÷÷’±d ¼Ø™wê~Ï/'ÿÅ/yýyý?  ¿ _Ê·”oYÞš+ø}9Ôî¨Ý0š™ ¨?(Qf™ÅùbgÞ®wú<ßásøszŠ7o{wî-ü1×0v Ú–µ-,€lpžóDÙhUZ•ÀOJ”óÈ<”ÑF–¹in¨#êi6ZÛ­íÀ%p€hNh¶ÕVÚVê»äñçôÈÛ{{f3¦>¿>ßY€ì¨ê˜vë±õ˜¬yJ˜0Æ]£Yf˜áaÚÍasÌSV²ú…~A–9Õ­ºýøõ‘úˆ#ðÌfßVŠˆ¬ú …‰Ù0a/¬n«Û÷b¿­'(ª Õò…HÞÕ¼«"‘WòH2’‘¤S:EB‰P"” ·„[Â-"²ZVËjqGh[h[h›H`^`^`žHh$4 ·†[í"“˜Ä¼z‰ÈYãF¯\~[OPD_Ó׿ŠXuVˆä¿X,“1‘À§²@™‡—¹Ÿ¹Ÿ¹/ByäyùxW¼+Þ%238383è«ïÏôgúEÔsõ\=÷ {(}ÒçFÅ.¿­'(2›ŽˆÜ¾qû†ˆDDh”rcK2ò¥¬’U^Í’š%5KDÊÇËÇËÇEÒGÓGÓGE†ÒCé¡´HúXúXú˜¯>Z­‰Š”•”•”•xùÀgXX’±¿ÁF—ßÑóΩtO‰5kyŽn€´ó©þÏáï7oã¿÷Tþ‡Ûg´nÐ žéýzÞä“O>ðŒg<õF½Qo€8qâ>ùJïÖ»ÁüM)¥ú¬>ËkñC>æs~׉gVwÕ]ݨÉÚ§Ö`¹à L3Í4 Qä ÚÂrO¹!«÷ëýdA ©!?þ{ÿÿÊ@pŠSD½-P ª4˜;æàÅμ»ev¿ƒçà¿÷_ùÑÞ.>ÚûXîÆø±Ý`ÿÛ…ÚOA©ZIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-57-grey.png 644 233 144 6235 14774263775 16023 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü RIDATXÕ—PSW›Ç¿çÞ›\’¸€XE JaI ]ë⊫–þ`ÕWüQÅŽ ,²N­£ÕJÕ ëT©+œZÞwå­Õ*.¢‹“TÜŠ?¨H¥› b¡ˆQ$„$7çì$êôNgŸΜ{ïyžÏ}žïùEt:N§ƒ?ÆìùXÃÍ:…N¡“ÕêNèNèN°ÉyOòžä=YôÏÆ³ñß—¦HS¤)ÑÕŽjG5;€2”¡Œä ˆp÷qÀFlÄFv@\..—“á±ðXxÜTFÉ Üu<70707Ðp/Cþ†ü Ä,…J¡R(Iã õ.î`,bËý•æÑ<šGëV§Õi4+¯&¯&¯æ¯]N³Óì4ël3m3m3£w¨ŠTEª"\Š^½0z!ɉ‘ÅÈbdÀ¬€Y³oßûÞû½w¼×ß ÿžxÞø^/ŸàÉà<æË|™/]O´DK´¡E|(ʇ^)·VZ+­•oLÐOÐOл·/¼¿ðþÂûœkºqºqº‘¤ˆ9bŽ˜>Á'øJØ`ƒ @:Ò‘àu¼Ž×as;‚ÁH1^3^3^c®ï#¾ø>‚nï_Ü¿¸qÚae¨2T:×Ç­ukÝÚÄ"–É2YfçznGwÓÝt7½ÎìÌÎìÁÇãÇñ㮄;‡œCΡ7îj’5Éšd)6k4k4k”ÿ`,cÄ*¦ˆ)b $:‹Î¢³ ¤E´ˆ,²@€£Çè1€FÑ(¥˜$&‰I¼ãßÿòý/ßÿ’ÿ@Ó§éÓôI±NÉ)9¥7îòJ^É+¯„{y¼|dýþúýõ€ä'ùI~MÖTkª5uC”¦TSª)•R222„K¨Cê`n¸á‹EX„Eøÿ›ðàÁÂ$ ¾åuåuåuRJ[V[V[–pIU¥ªRUøI†„¡‰&yµyµyµI³œÎFgã7úûû³ð¬†¬†¬Òè_ç_ç_NÒJZI _w“»ÉÝ&ÒDšÜÄMÜÈr€"®׈kÀ7øßP@€MØ„M€4Qš(MÄ;âñ,ÃW‡¯_-M+M+Mc1–(K”%Š˜ä1òyLrŒÀ"X‹ø4Õ¥r©\* ~_ü¾ø}Xè”{ò l¿Ü~¹ý2pb剕'V|2ŸÌ'R˜&…Š E"ȮȮȮN.;¹ìä2 /µ/µ/„¡¾¾¾Ømv›ÝbÆŒ=ß%²%²%2ØÞIy'å,¬ÒTiª4€,X, þ4•“Â¥p)ü³Æ?ÿlü3x;îí¸·ãH ¶a¶½…u…u…uàåådtdtdtÚ m…¶XucÕU7ß^ß^ß^`ùÙåg—ŸÖÌY3gÍ Í’fI³óŽÌ;2ïàT9UN¹3rgäÎÂϸ<ãòŒË¤ÄËãåãŽÇþRRR€ÅnÅnÅnØÜÓÜÓÜÓ x=toéÞÒ½P4+šÍ@_q_q_1`•YeV ž¨ž¨žÈýåþr ,7,7,˜ÉÍäfr@¤*R©jjj€¹Î¹Î¹N`ÚÍi7§ÝèL:“΄ üVù­ò[ؼ<^>û±ûIwš;Í~ñg"nán½œýëú×õ¯?~ ´ˆ-b‹<œøpâÉ€aŸaŸa°ùðæÃ›b¼/ÆdY@ sæ6Ì~=úëÑ_iÆ4cšñ•Iö!>ć/ãsïqïqï(E)JI„ÀOá§ðSØËlËlËlò¶´^Z/­Çß }BŸÐæH’TIª$@›hm¦&LM˜š ží>í>íR!‡UX…U¹e‚NÐ :’cð3øüÜaƒMƒMƒMPÊÎÈÎÈÎÀ¢¿¨¿¨¿”½[önÙ»@GYGYGpõÆÕWoòQù¨|i i i{ÉÑ<µyjóTàµ_^ûåµ_»¿Ýß`)–b)Àep\žJ*/š.š.šh,11ákâ&nâ.—s“ë&×M®û|<^/¯ìØ1°c`ßqÖ|Ö|ÖìÞæ‰ç›±4ciÆR8ƹǹǹò;åwÊï-³[f·ÌVެY9 :tìmoìߨ¿J J J}ùœê©žêÁ0ó0bõgÕŸUFm=§zNõœânÉÈÈüïZW—«ËÕµÝEövïíÞÛ à6nãvP±ì‰ì‰ìI½bD?¢Ñ¿‘™x7ñnâ]–Ô‘Ô‘ÔAêh=­§õ`®]?º~”‚RP|6ŸÍg¿²À{v [Ž-Ç–ˆ‰‰œ–ÓrZ€¬ +È Ø~Þõó®ŸwaMeqeqe1.***Ž.f<㽑ˆDdË&Ž+ãʸ2¾‘;Äâ=ÚBÐôÖ©4( Jpmíµµ×Ö²0†CŒ!8ÅÍçæsóa—Ûä6¹ àãùx>`OÙSö@’ å(”j¥Z©øF¾‘o|h€òRÞ¥¼KyR˜¬MÖ&kˆ…Xˆe%sÈ2§e QˆB!˜‹‹‹‹‹c¥HD"…O¹½Ü^noÇNn1·˜[l‰vìþØýqÒ¶.{—½Ë.ÍŸ~kú­é·¸Sè:…öûý‘ÄóÊVé„N`Ì/À¾`_°/à j¢&j¨Î[Ï[Ï[ÝÛ:/t^è¼ |©ÌPf(3Nå«-j‹Ú²ã/ýéýéýéä[˜`‚‰JÞó¨ ]èB—t[±[Iõ[UoU½UUø'Ÿ,Ÿ,Ÿ¬Sùƒ' NžŸtvÒÙI/µ 3Ì0Ã#Œ0°Ã;9äì:»Î®ƒ‘d’L’!Þ0Ý0Ý0±„ÛúÛúÛz¾P¨ TöŒ:+•ÎÊŸß˽—{/`&fb&øyâTxAmžö4GÇÑqðkîmîmîœ[[[w~®¯¯ßyú~Íýšû5|aíêÚÕµ«YÙL6“ÍéIz’žóf” ±!6‰HD‚½ÏÔgê3á”~†~†~üTf•Yeèl:›ÎÞùù˜ôzF=R,ÃaIÞ €xg¡çJ"zºŽ±†/„zèÝÛH,‰%± »r\9ïÊve»²éi4¦QnþôCÓM?„å´•¶ÒV(¹H.’‹„CÊ‘r¤ˆ_©¿R¥vkÌsÌsÌsø6Ÿ>3|fΛ4ÛoÑZBK„bOe·x+–ŸŸŸŸŸ‹7£ð{|öøì¹wÉñÈñÈñhÏá¶%mKÚ–À0ï>âôò½ý °÷¥ÇÁuvÏÿv§ Nœ"<ÿN÷î;{4Ð@?c€1À€ÿ¼Öx­ñZ#Y¯lU¶*[FÃhØõÂ:a°ÎþOá1á1á1Ü€'Þ?{Zûo¹xüŽ­<]#“39““5¿i~Óü&þcìtÕ ‰áb¸¾òèÓħ‰Oªž·ÏgpßûÞ­éÿ¾ÿÜû=ç9ßïyÎ{žó>""òtâWÀ™ãÌq®_ÅΟØö´WÓ^}>´ŠOšà¨pT\û<ÕüT3@FkF«š°±å·Ö§Æ‹Øü©z–]žÛ°öÜÚsŽÒþÞxñÓ2Wño‡ÀÓîihÀÁ΃çÏœ?ÃÏ!òEä €…Ò…R°±å·Ö[ñ_*¿|ðú"°¦gMã_°ö‰µOˆ@î+¹¯<÷ËÕÿ|Ê_+ à¶ë¶K;ÀœÒI×¥@ŒÖs/[þÄz+Þâ³ø-=K5%KDÀ÷¦ïMÏéÕ€‰?cÔ=S÷Œ¥oç‡ÔPC:gŒ^£À šA–ù£Þ¯÷ƒ¾ª®ª«À_u­®0˜GXæ„qÂ8zŒwx‡tþ”à#Áo$ô’ú«ùدR‰ˆ4í¿ø%™Ð°®7‚Fô?̯̯ˆ'š*üøAETDE’Cè]º^×ëzÐ?ÓGô4ÐAq½I•«r d•üý–¾¤6Û÷ÿžYÏlÌ S¦£”¾¢¯°ô0ºôäÒ“Å?‰b'²]Ž.G!šÍ悺¯î«û¶?^¯×Âüæ_žŒc+¡•K w£SN}à‰yb1·•O"±“Ÿs·ú`õA‹NmÕEñ­ñ­°ð»…Ï>C>_˜]˜ *.T\¨°…+U¥ªTÖ”Ö”Ö•‡*U‚X~,?–E E E ±%#7#ö}´ïü¾ó蕎¥¶¥6[ß»_¾û¥Õ{'?w®Ö­ Kö÷÷%Ê(Žmÿiôö£·e¥l®l¸lX#7FîŒÜÉìÈìÈìuºGÝ"7²odßÈ™¼7yoòžÈk®¸&²®a]ú‘é«Ó×§¯‹\>v¹òr¥8ÆÒ¯ô_é—KOo/ …-ý‚.õƒëõ9D^ˆ¼L$zåj»Ú¦×Ì2³ /È À%ÿ%ÿ%?„ZB-¡(Ú\´¹h³]ÁÒÙÒÙÒYhÞÛ¼·y¯m/ì)ì)ì ×7Ll˜€ù¿Ì½7÷^Jo~zgòÎ$Xù8E\å®r~ ékÖ ˆÈßED$*I¯ôЏ"®»®»"î*w•»JDvÉ.Ù%â>î>î>.bø Ÿá“äãsŽ9ÇD&ÓáɰÈTñTñT±H×L×L׌ˆ÷×Þ÷½ï‹ô®ô>Ûûl2,ªÜ»?I擬˜Žl‹l>Ml![ÝR·ìåyó¼y^èè耹Á¹Á¹AȺ™u3ë&4Ô4Ô4ÔÀN×N×NÁ@0[Z·´ni…Î;:w€÷¢wÀ;?m©ý%›ßü÷íÌÛ™vÅÍ?~Â_‡¿†t?6E–­Àz_½¯Þ#}#}#}6a( „°»wÿî~è>Û}¶û¬íoÌiÌiÌüÅüÅüE8½xzæô €žÐ,Ó–Ð w…»¬æ?lŸJªªRN F̰'ºf™oøÆ¤„J€6ÚhK±Ÿâ§@GtD§Ì7 N¸NŒšßFcŠžY}´ú¨}*SçXĉ¹ÑSñ©8 ¬9¦êTKªR5©&Ð÷ÿWPmR›Ô&0 ̳ÔEuQ]Zh¡Ì£æaó0˜¿1;ÌPß‹ãA–ø›Å?>ž[ž[ßšcÖ mÚþ4š=ùÁ6‡‡êuõzb× #ñ_+¬°’‚­ é„í‘zK½E<É—ä·ô¾5ù¿ã[I]v]v’ 8Æ1ÒíWlî7÷³ zHàÀ6¶üÉ–HÄ[|ÿw~+ÛÛÅc{{\ ¥MiK”D1Š– šx ‘`šÐ˜ËÍȉ6JlÅ*ÅäN„´1A«%R¡B•JmÚ´±>4b„¹´SŠ^J§Naìôœ³Ïç>Ìì9£Þ?€ýr²Ö^뻾{­³ÖÞ""ò`â+à~Øý°;7.»w;úÌÇ3_þq\ö[àzÆõ̯Âï?ð>ÀâŽÅ*àÈz_Û§ú‹8ø©ñ´^G‘q"ã„kcB~¶¯Ü¾23/.O·§;j‹§^<pòÓÒ7FnŒ„7†7‚#ë}m¯ý5^*¾¼ñ§ø"~&ýŒë*dÜŸq¿Ï;<L±»s­øZ1@î@î€}B`qÎâu‰ÏBm¡6°U²í¨*©*©*ÞúÞúÞz¸¸¸€¡¡!xCÞ†¼ yÐZÐZÐZàèͳƬqäêÕªÀçÛ»kº}ÈZ˜žšžÍÇ-¨Óê´ë’ÆÆ"®e""²4Ñ2fþ‹ù/DÒÊÓÊÓÊE‡‡‡EvÎîœÝ9+Ò±©cSÇ&‘ÐÖÐÖÐV‘Âõ…ë ׋óóóŠD†"C‘!I®…3 = ="ÖÍoÌo’ê¥rÑ\n.Q=ªÇuItMù¶ó«Î¯€§â5Oœ$æ[äŸÀhÙhÙh™sò–¶–¶–6¨L¯L¯L‡®œ®œ®˜óÏùçü°¥}Kû–v¸éºéºérüö­ÝWº¯F7ÿ:ü«ó©ù¦?šNýÇHvåk ¯9]fÄt&º Ĉ¸À@%çU|õÓO?PK-µ)z#9ÏbšF/_•:ñ]™œc¶çºçz$ 5nŒ;ƒñIµÃøÚøš»¸YÉJà®p¬#ÖëX{­½Ö^PuªNÕûÙÏ~PY*Ke‡x“7žêFŸÑÇ]{Nϱ‰ò‰r ê z‚©sì/“¿>£>#yÜa¢Ö—Ö—€¡v¨ÉYnc'20Ïïüž’! ¸Mˆ$²jƒÚ¥vaµú­~ˆ#ÃPŸYŸ©3õ‡Éÿ§»Rß]ú®Œìši&Û)õ¼õ<1°íA\¸À‘õ~²d §ñu<?yWÞ³¯‹{ö=vo¾`ÿâXWà ±IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-165.png 644 233 144 3061 14774263775 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜæIDATHÇÍ–mLTWÇŸ^Ç ­)“¸¡¬Áµ­Y¥+J6ÑÀ$€RJí´‘¡AÜŒAq_B˜¥|XÓbÒ„Dv“M£dC‹$º“¨‘CÛH-"…Ñ­±I!Œ"]Ñ8¦°¼8xß~ûaæÎn³ß=_nžó<Ïÿÿ¿÷œû?G@DDž=ìÙölûºhl÷Zóé»ÓwÿêŸÑ¸CÛ[¶·ÆþÏ}üÜÇë»ÖwéA+6óf}b¿ˆ…ŸÈgÎËóbM¤K;gsÅâVx7÷ÝÜtg4>~=Žže~vð3€ ݺ9Ó#Ó#?º~t›y³Þì7ññ¥õøE ¥/¥Ï6i©i©"°±tcé¦?D &7AeEeÀƒ¤I†´Y ƒ Ã,²ˆ9æb3«7ûM<ßä3ù£z2‹3‹E j_Õ>ǧцàiT_–/ËäSzØI dЭ~¡~ µh-¬rÚ8hcDÑG€vãMãMmŸ¶UcU‰(0B´ÒJ†Šáý«i¬iÌ5õXK©‹ˆ´—€[Ü4l4«-j AmTE‰% þHu ÷ê½zoü‹aì7öûTRIµ¦‰ð M4Yøàvº¦Àö’„¥Ùòwp„áÅd˜XšX®PÆ·Æ·¬,?ZI[IeXT-!Êœ2§ÌÁlÝlÝl(J£Òhåÿ# Ê‚áþðtxfÿ<363ÆŠ–nâß¹yç&pÃqÑqq1ÙÔcÊûSž„kÖ]«Š¼œñr†‘G³š§æÉçó[¸»pWee¥9¥9"ý·ú'û'%>¤H9"’“”“”“$²Ç¹Ç¹Ç)2uxêðÔa‘#ù7òoˆ¸:\^—W¤¤÷û»ßÇDÆhúhº|.òÒŽ—vy”¾÷Ã{?¬UM=1a¯õJIÑ—E_št¶Oz"µ‘ZyZþ¨|¸|Xlï··E2Ý™îL·ÈµK×.]»$2pjàÔÀ)‘ÀÃÀÃÀC‘­Y[³¶f‰\w]w]w‰¬9±æÄš"žUDÎÿã¼ï¼Ol¿žË½—{OžŠ;Êg»çzÛõ¶ÉÿZ¯Àº+ë®çXš~eú Û¿×óõ|Ð~¡mÐ6@ž'Ï“çÁíƒÛ·CßÞ¾½}{Áî±{ìÈnÌnÌn„êñêñêqèyÒó¤ç lñmñmñÁÎåË;—asëæ7ÿ.˜Ô&µ„½Yj 5©G`ýÚõkõq˜ Í…€sÑßÞ0ôGú#«±àrÁå‚Ë049494 g§ÎN‚ücùÇòYuÅ»ŠwچچZ†‚¡`ÈÊ9‹œENøëÆvG»Ã²mo¸0\¦»ˆ~Q¿hÔJµRDÉ´ýRžÊSk/©¢Š*"KIKIKI"á‚pAXdæþÌý™û"mmm"·=Þöx›ÈŠwÅ»â©9Ts¨æHç­Î[·D¿ ¿~U$÷nîW¹_Åá3mŠúºúºˆ¥‘›Mà_ð/ÃÆïxCWçY5_©¹¼¹¼¹À€õºËºËºË Ð_è/ôC×|×|×¼•o«j«j«‚ÂÑÂÑÂQ8³é̆3âéUÞˆñ}ç¿â¿bÚÆÍ¦˜°Ž!¨?ZԬ׷ƒº¨ZŽna‹rÈNr’“ óA‚#á?_s›ÛTª.Õ•À§Ô·Ô·˜Â:†}lÚ1½˜Œ1¡L(€núŒîÓ}¬èuúqý8óFØ[–z'Ð,“Ÿžêí%àNw§':³6¬ Ëú;ú;(1ï70ÐÑ"±œmF‰U‚AD¯Ö«Q@ûFûæ'Îãû™óÿŸ³ß‹¾ã=ÀG|D†µÄZVÃ*W«Ø°›ùø–ˆõ›x&¾ÉgòÇÏÊgövñÌÞÇžÍìãSäÅž<€XIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-67-red.png 644 233 144 4234 14774263775 15625 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜQIDATXí—{lTUÇϽw¦¥lµ[äÑÂÌé®îZ,–U¬È´Ðbb%¡Æº„VC£A$y´b(v7PiX n#ò×ÇÚ”ŽÓÒ-¬, E ¢UWíu™ŽXµÚ˜:í}|öιóˆJ6»¿zçwÎï÷¹¿ó=÷L…˜°_Š8S'{“½É^åjd 5©%©%©eÙB‡á0F×_Å|1_̇‰°µK8„C8¤ñ¾µKΗëe>™?¾žº8ž'–oƒØ 6¨Íññ79Z-Ž–æ!e£²QÙhƒ¤M™22e„¿—ô”ô”ôÀß<ðÍß@©§ÔSê‰ú2.çËõ2ŸÌ/ëýµÏß!xN{N{NëwøÆ}a_³æY7X7 5úKúK`äYFÅF¾‘F®~“~5z•^Ö<+ÃÊ@—ë}ã¾[|·àóœö${’õ;là>Õ¯úe}×u6šÒ¬4+ÍB8v:v:v6~"î*Ü^¸]/¶Áž4;ÍNzc¸-Ü–Ÿ/øãS>0×™ë_ôu€1LL°ü®ÞÈV¶‚õ$§8E@N+ÜUx ð€^,ëKÉ'œïù½œàªuÕºj­¬ÞÞÞ†#yÆn}“¾ €ïø;‚£sFçÄ€a–›åÁÍÁÍWµ«¸št5 Øìc÷ÀÌ™áÂ/èøzÎ×svÕº»[Y’Çæs¬w¬w¬?·Sö¯ÞÿÐþ‡¬µ‘ª!½YïÑ{Ì>³¯»oÝ}0q¬´/µ/4h0ï1ïÈÌÉ̉'êE=NÙ–² ÀY㬽yË][î²ß2´õsÓŸ›n­µ;Ç'¬þ)ÙS²§d³khÙв¡ed’‰Ž[ö´Þ¨7b O=ž ÐðHÃ#±ã»?vœ->[ ðÊœWæ´µµµÔ úçõ+êWÔGßÌðéSõ©€dQë¢V€µEk‹ÂZX¸ôþ¥÷ÚÛ.N¿8=N fG¬_^ðø‹¿ÍoøÆ·ŽoÖ—<’/JkiWiWi—=Ñ0–ÊÇáàp`jpj`ÚÙig®_uýªØN®ß¸~c,ÐØccÅúûçïŸîNw îÜ #ÿ¨G.Fé‚Ò¥ ìïv«ìhù†… ¸ðƒ oNv ¬ ¬)y)yÙDz\:{é,@ûÑö£±À--±€ãyãy3ü3üOöôg@8îÒƒz¬Ëcy°ä*Oº'Ý“ÎÉ'ÔbµX-ÿ^^u/oxyòË“c$0I>ÞºèÖE@xƒƒ?ddÇÈu‹º`o×Þ®ØxÇ«¯¤¾–ú ûNøND£ÆããÑz§öœÚsjÝÉÇ”%GÉÿ^h·i·i·U×ÉSæžížížmÌíýÃW-_µØ Ö’mïl{ ©9©°Þ¼óÍ;ª³«³cA?¨ú *´ü|ùy€ÜpnE†ïµZ­VŽsœpˆ² »:»:»Ú´/m†6C›qhX¤¥¥ áx×ñ®ãݦ>ûƒ_ºô٥ϛì#Q9Ú>ÚNoYIY ’[=íóiŸ4j:ÄXnYnxôíGßùe6/_ÝêŠóç+Λ!p¶F[óùÊ ?Ežzi³žwæ8sœ9þ—ä‚ʚʹ•s­%2¡žnì5öbA`$0Æ:ÆâN5÷s?€õ¡õ!ÂGÃGÁXmn5cN÷‘à‘á#ÃÜk_¡ujZ÷Ã2%SÉT2w8PûؾRTT\zPiRš”&©óqïIo«·¯­ÝMÆãÌDs0°ù–ùñD{5aÖ+ÏÊ‹J©¯©ïHßpOrOrOÒ×ÛÜ®m×¶WÚhÅ¢X;\QÖ|‘/òÛE³hÍBhýZ¿Ö¿ù¨}µtísíÓÓzŸê­ë­‹Õ®YaVÄÉW!HðZµV-X+Ív³Ý>ë”}Xö^Ù{Æ&ûºâ¸â¸âÝ‘ñDÆO¡ª…j¡òF„nµÄüEäïJí‚vA» ˪ʪʪÂYá¬pVxwØÚÍ/Ì/ÌÕ®YiVÆ‹/p™Ë\Ž9Õ777FûÛp{Ãí ·[Kì»<Í™æLëû!òkiRüN+'¶^( î™xß5iB»½oÄh·¦²&F»izšž2¿5¿5¿j±›nºÁ›ÒÒÒm•ØšLUSÕÔUJâó |Éâç´†í–üˆvOzOFµ«ŸÔOê'mÀðhÆhÆhÜ­Àñšãµ¼Y'³NxÎ{Λ·mÛò[ñ©ù"6~*Ÿµ.O‹½q5ãªc[Ò~v¾¸óE犄}¬\®Î…8ìúr×—Ÿ_øü{`|p|`zÛô6°mËoÅ[ù^*¾¼ÿ?ü"ðäµ'¯9îCÆSO‰Àš—×¼üüïß=¾W|¯„Ÿ?¡Ó@M™dêmÀsX¿©Ûò'ã­| Ï·ø,þ„ì—²_ª×«^wK$Ün#ÞôlÓ³ŸÑɯy‹·ÈäBü«øWê€:@”“z§Þ ú†9lÖµº@½«Þ%J ˆ@©§žLÞKâÑôLÓ3€‘äÓB½•¦ˆÈGåP-Õ²$(¨÷ÇÄ€¾¥¾Qß`$7‚€ÎÕ¹:w©bèr]®ËAWêJ] º^7êF4ð5_cèÃÚ¡ GøP½¢zðƒÅ/©‡-?®ˆ+2—¡ùÐ<ðw¼ oè,.Ì,._\Æ)#`l!±±±0á›ðMøÀ˜4&IÛo¬6V«a²p²p²Œ?DÛ¢m,&Ý^þú ô€kÎ57—néI ;=ÀÃÝ»vï²àÌ"ý£È(‚éÖéO§?Eo~{óžÍ{ o{ßö¾í ÓuºN¯Óëô:!'/'/'v4ìhØÑ‘@$ €oÌ7æw›û÷'Pæ/ë(ë@ÿð]d$2’ÂwûÍê7«­³wz -Q·Ò.)ßÚ»µ7YFqÿ§óQÝ£:‰y'¼AoPC:5tJÄò„Þ}¼ûx7llÝØº±.Ï_ž¿<}Í}Í}ÍPQXQXQ•ÕÕÃP´²È]ä†Þ?^+¸V`áëzÓ×¾µ}«uøGÞ±»’ÝÍ»›í.ø\ÜžèÅâR“øñãîp‡;)ë3Ì0„ NY×<âQŠõ3|³ÈæOèIcã®ñ¹ttÈ€iÍ1³ÉlbѬ3[ÌÐJ/êª]µ«vPªQ5‚YcÖ˜5 ÷ê½z/¨sêcõ1¨* ü±H,¢þ‹…?Vù0óaæC #)#)#Éï³y¶žÅ³|,?«÷bâWûÓóü?йíPLnLnL®ôÁ±Öc­ÇZ•1ýOûŸö? @€€A<Çs<ЉNtªï›gëY<ËÇò×›vøÅ|¤ËÛxoë¼Ì$µ$µ$µx~o±¸,.Xà3e2A™´×sÂsK1R ¥Ië¥õ€´XzUzöJFÉ( ”YÊ,xX¼eÄⶸaaùUà úú±*WÇÕquDb©X*–Ö´³C…¡ÀPàISÁ>”Z¥Vô{jFòGò¥Ó7áF3š@6È2ÚÑ؆mÜR¯Ôë_ï©Q¢•h@ùPþ^þý,¿¡ÂPl(ö¤±úŒ‡ñ‘¦KÓ¥éZ»„-Зè‹õÅÊ k¯ÕauÀáËÓ/}*Ý•î€çšç€~G¯£†Ç A `¥_ñbT£@ÿ@Ë@ eeÒ§ÊÛÊÛjL¿µ×ÚcíC_¢ß§ß§Ì`<*Ÿ¸]Ü.no+eU9U9U9Êû¾ƒž:–ËÖnkàJø.á;àÛø6;v>™÷ɼ@^öaÛ&l›x!—xY¼ ‡9ü àÏï­W•Sµ¢j…ò¾º³A|¤Ø£â¢â¢âPñlõ³×ž½HA <ˆeßœ[ž[º]´žj=å÷ËmEÛ ¨þ¹úçÀñƈƨ½ø€½‹ëâɘƒŒ‡ññ¾#5G“ªIÕ¤ªg,œòÈ@"šÈ†.}~és"¢¢î¢n""÷¯î_‰ˆÊóÊóˆˆÆéÆéˆˆ¦ÇN%"ú©ô§R"¢óÏ?$"z%ó•L""}¢>‘ˆ¨©¨©ˆˆFMQ¦(DtRž)Ïô××Ôkê5õê‘g÷«’½¼ryåòJ<æ†i˜œE j `‹Ü.·þóy-òZ$è u…  Ó„À¹Äs‰0Ü<Ü áÝáÝ÷EÜðè‡G?ÀÅóÏpù:ðcC[C Ä{/V%)2)2)ñi|Ÿ6Òã¨8a¡e|_6¼š›ÌMæ&Ï;(ÜUÏ×&.ŸËý(WËr…L+òÍÍg?;û̪vó}O¦hC¾‚± òeù2 ¤(ÕJµ_J¶Z›Æ¦bGé¯ë¯{¶«;Y$|,|l2¨hi”Fi¢ÞÏšLÉ”,QÕQ‘`:…ÎΫOëQ½V¯õh­YNZNj×û–J£Ò@Á>ìÀDgÆ{xP²äµòZ¸XàÆ¿n¼ºñª”¯¾@ÏÅqÀ\¬Û¡Û¡ÛAÄxoàÎøèræï|³„ÂáwaÆ®»fì"Òäjr5¹æbU»É†dC²”Ï Ê&Ù$›à‚f˜ô¡}þ•fK³¥Ù~-V.«\V¹LIQßr­F«ÑÚ†½¾~Tp§¹¦ÖâÞöõ£¼Úµžñk×´×´7@»ZÖp8än¹[îök±èÌ£;FwŒîPÒUMFð|Ä» ‘⑾pzñ€P ÝMܦ×Ó¹Z®–« Ô®¹ÙÜì×®§ÙÓìiö+wH7¤ÒóóóÒ,U‹õB½P(IÍ'½PÀqôó/` üÚµ öíÐÐðh­µÖZk-\pÁÉHMLLü׎xT<*íðýK2úVH]ß8y`¨±€w}Ú=÷Ÿ´»jݪu«ÖùµkN0'˜pÒ;¯¨à²¹l.ûõ‚à2|_H]ŽþK{™v…2¡L(ë\Ì€³K²K²K”ƒ Ü Ü Üž¿©­¶ vÁnŠ¡ª¡ò];‚5¤^8ýªÝâ`Õ?¸ÍÜfn3@kh ­‘çòÑ|4 pÄGWoÄÆÆ mB›ÐÆ]ñf…tîÿfZõW*¥RªØ<ýQ¯ð ¯\×Ä5=šâŸiéŒ%$ïK[ý/¯¶q9«Ã&ÂIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-14.3.png 644 233 144 3052 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜßIDATHÇÍ–ïOTWÇŸ§Ã@YJצ†¬‰6iV›%óB«* Mc$µ iEãÖ¤ØÔ¬ÆZ‰qQ’µfKL`©dì–錰ü¨˜ÊÖV_4 (¢ °š dI/wî=Ÿ}1sg¦åð¾™|Ïóœï÷;çœç9G@DDVÇ~RžMy6%3ŠSÞMŒ§§oôDñgØ^·½~÷o°êÓUŸ¸Z\-æý¶âV~ò|‘²ž5.«%1àhw´ÛvÆðÇðæ o¾ö‡(n¸ ÎNg瓼÷Õ{_t´v´rfnÍÜî î„¶âV¾5ßâKæ—§/ö.{—íàxÆñŒl(ÜPøüûÑÿóðZék¥S©S©*ŒNºÚ „ c}³IØŠÇò­ùŸÅoéYúQ?Ù/g¿,{+ö:›ÑEDî·A]^]P wÒF=õ¤C$ µF-Weª °+»²¨5üjì5ö¢Åó¸Ä%ÒÕc|—kÛkÛ-ƒ÷Ûø×mæl¶üÈo÷öÜ+P¹P¹ê}ý[5ÆG| :T:&A‚(F™dÔ!uP$ñ-üfa•šSs(Udæ›ùèÀ  Ò£ü”UVWV[Ͻ’´•""›þΰ3^Á‡ã´¯>™_ÈZÈbQ¿§ßÓï% Þáw@;¢ÑŽ@(?”ÊOŠ×SO}êgtŸîƒÀ®_Zie1r*Êcá±0ð³ÃÙ^aù†DD>„š5'@ýÀ|1x>p2pÜõîVw+ªû\w}w’õÛrl˱-Pø¸ðqáãåñù¦ù¦ù&Øñç›wl×W‡«UÙ´§aO,ý3ªCC ®Eýˆz "òC-|éÿÒO~PÕ¼”õRšµ®=zôHöz{½½ÞÄA(­(­(­Xn¬u¸u¸uÜkÜkÜk ¸œ ÎÂ:×Úkk¯¡ ®½;}wZUƒOù Q?B8Ó—éSíŒÎ¬œY êp¬ŽrõŸôŸ`Ûúmë¶­_—¯Ë×´ÐB ìÝ=º{öÞwzßi(+*+*+JÒú´>­/Ãýáþp?lÿëöÃÛCÖ¨«ÙÕ ‹¡–P À¬{Ö ª>£0£Pµ§HFjUj›eÄ~Æ~FD.ˆˆÈ\êŒ}ƒ}ƒˆísÛeÛe‘ÌŒÌŒÌ ‘æ@s 9 2àð xD&J&J&JD®{¯{¯{E¼6¯Íkq9ŠE"CCC"Æ ?ñŽ{'¼"¹'rÛrÛDþóy·½Û.s"YÇ³Ž‹¨~I“46§¦×ôÚFD×KôÛED$;VbLãÆ¸HÈr‡Ü"ÅSÅSÅS"¿Çïñ‹lôoôoô‹äÔåÔåÔ‰äçç‹xvyvyv‰ ä ä ä‰ì?¿ÿüþó"ƒ+ƒN‘à¡`a°Pd•õ‡«?”lmQ[‘*•¡2l#±ªü¡–ï¯ô^éÊ¢gÌÚ‘£‡Ž¾}ôm¸]~»üvùò3ÔçëóõùàÔÒ©¥SK Mj“Ú$”?*Tþ‚@œõõõÁÖŸ·Žmƒæ¹K—Ñ¢,ªš/®4]iþm1âUy¼æ¸%g¾‘p$ D+MYUªJU)DnDnDn€Ùev™]ÀE.rT¥ªT•Iίr•«€BG*Fl#h´ôj>©ùXŠUe¼)ç´s:¼ó¡þ0AðªY­£âšg=ë—¯˜ò*¯ò‚Ùh6šÀC é2]¦ øÏñŒ[Æ-0N.õ.õ²hæÆúXÿئ±MÎqçxxÓV[Öùßp¼áˆ·Åoybô=€n¾e¾ÿÏ ˆ–ÐÐbý|!S@ˆøZ+”ùŽù:¿__'ñÇõ–uþßÝ•ÖÝeÝ•Q‚ÎX/Oo1F•Q…ꦺ € $°·ò­ùŸÅoéYúñ»ò©}]<µï±§óûi¬#|Š‘IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-90-grey.png 644 233 144 6234 14774263775 16017 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü QIDATXÃ…—{TÕÕ¶Ç¿ë÷`? .d ]2x³xxh ¡ET‚Žæƒ<1(‡†¸ ÌSxAÆU³õfå¶#hK"y› C"÷á![g`ñڱ߿ý[÷öÆðŽFóŸ5~¿õ›s~~kÍ5ç\D­V«Õj,¼ÌÌÌZn€àh£úSõ§êOéÃÅÅÅyŒzSoê]úš 1Ûmõ¶z[=}§q§I!–a–èE/zlÇvl§ïË6Ê6Ê6’Bîgîgîç[§É4™&Ó«:èÐÿ ÿµ®’ì’ì’l2.„ ¡B(I™ç[]\‹˜À8Ä!ŽÑˆÅb±X,¶ÚMv“Ý´$¶¸¡¸¡¸A3h·ÛÇ›n˜£ÍÑæè˜½îÇܹƒ6f]̺˜u¤p¿‚_Á±>±>±>€ô,ÍKßKú’½û.’‰Gâã\+øõ¤žÔSÌ$9$‡ä„cCÙP6ô›3¦ó¦ó¦óK}|›|›|›œo®ë]×»®—qDé£ôQz’*+”Ê aÆÛxoC 3Ì0؆mØ „Ùd ²!U¯Óëô:êh^Ö¼¬y™øædòdòdò«G•¡ÊPeè¹3Ç™ãÌI:Fsi.ÍÈ$ `ž"EÖ"k‘€:è‚<¸z®ž«×ýÃn±[ì–¥ëUϨžQ=#ÄeäeäeäqšE¿-úmÑoP‚xO¼'ÞG¢I4‰ „J,°ÀY2Kf!@„܌njnjúkOÖž¬=)dö·ô·ô·p?¸)ÜnŠ{W„ÂFaãÓ›ð4žÆÓ#¿1ŠvE»¢àææþû¿ÌWÌWÌW–®W¥©ÒTiBjnvnvn6÷ƒW´W´W4‹OˆOˆO,€pŒ†Ñ0U¨B@†ÈHÉ#yЀ@¤ëézºðÚäµÉkKöUTT„TÉ¿Ä#ñ1œ0'Ì¥ÄÚ¿°aÿ"ûIß|_ð}†e4g4g4sRŒáøÃ“xOâ Øbl1¶@<+žÏ$¤“tùÈG>€½Ø‹½=KÏÒ³€uØ:l¨’*©À.ìÂ.xJö3®d\ɸÂi$ÿÄÇ&J8”pè³×m>6›OÐ3©Õ©Õ©Õø÷#šG4hÈs.CÍ4Ï4Ï4çÊΕ+´¢VÔŠ@ÛdÛdÛ$àÛïÛïÛø•ú•ú•Â×Â×Â×@ÝâºÅu‹ê¸ê¸ê8à–ú–ú–ðoõoõo|r|r|r “§ÉÓäiùr¾œ/ÇýVýVýV²Wñ*^þ #„ aBتÞ¿zÿêý+ÞÜãqÇ=H¥ ÐÍ5¢&¦&¦&°T[ª-ÕÀöôíéÛÓM„&B\øþÂ÷¾œYÎ,gðíáo{¸½êöªÛ«€íøhÇG€ÊWå«ò4#šÍ`ãm¼—¼À-ê㨣>&•ÄÇØ¦lS¶)œ 9r$ä 5ŠE Ì.EÎêiõ´zƒöAû HèJèJè‚#ƒ#ƒ#”S>Lù@šÐt«»ÕÝjà^ï½Þ{½À“åO–?YçççÉ)É)É)€½Ö^k¯ †ÃÀ(§ P(`–x$>‡q‡É2æ"s‘¹¸  ÇÄ1q åF¹ðÓøiü4ÀÍë7¯ß¼Øcí±öX ãRÇ¥ŽK€µßÚoífOÍžš=LxLxLx©©© vÁð|À~É~É~ ˜Mf“Ù„EÆla¶0[œÂ)œ"Ë6€ `hµq¥q¥q%î o o o%b!PI3ójæÕÌ«À\Ò\Ò\P®/×—ë]©®TW ð;ùüN€©d*™J€sãÜ87ÀyÁyÁyáwI"I$@§é4p‡phaZòÇš:L¦ÜeTŒŠQÑjN~D~D~D¨¸ë×ÿ®?w¶³¬³¬³ŒÆ’XK`¡3t†Î@iš2M™¦€ÌÖÌÖÌVÀï¨ßQ¿£À¤lR6)Nœ;qîÄ9 àLÀ™€3€w¾w¾w>0vuìêØÕßAm¶ÛÀޱcìànv7»›¦-† >€Ò0j5Œâ¿åwåwåw… È@ÆÁÓœšSsjRØìßìßìïTMm™Ú2µJ²ˆ,"‹`ly·åÝ–w3kά9³˜ÐMè&tÀWñ_Åø¨|T>*`éþ¥û—îBõ¡úP=p«÷Vï­^`,|,|,ÐÐÐø­üV~+f 3…™`CÅP1J-´ÐBŒ#b |DœÄIœgÜØÍ¦Í¦Í¦Öo¬ÅÖbkqøöÙÛ³·go?qàþ‘ûGîqÄxÅxÅx1χŇŇÅÃ6¼sxçðNpZ¥V©U •B¥P¯´½ÒöJà±Ûc·Çn è w‚Þf³f³f³ísÚç´ÏC9^“^“^êÚ®.ª.ª.J4÷DõDõD1»åkäkäknor´9Úm/§¢¡¢¡¢!mhCÛç'ø ~¢U1×4×4×´47©=©=©&¦ ¥ ¥ ‘ëb¦˜)f‚:‚ÁŽ`þ þ þ € d™Àß+F1ŠQ¯ãu¼X[[ì*v» àÓø4> æŸâŠÿ)/ŸÿñüçÄWŠ>EŸ¢ÏšLYÊR6æeD Ý;æ4sš9Ͷ3eLS6úW±OìûrìÊkÊkÊk€.K—¥Ë¢ÿ©_¯_¯_Ï]%Óâ¶Üm¹Ûr€ÙËìeöt˜Óa¯á5¼€  &j¢&@Þ!ïw,V£Õh…R[¯­×Ö *¾›ïæ»b$FbÜ/’Õd5Yݽ¨@ÄÆÇÇÇÇÇÓSHB’¸w˜"¦ˆ)êßÇ$3ÉL²1ƹϹϹ/¥`phphpHXu#êFÔ æ€bbbŒ4„†ÐȤӼЌ$"‰i!-¤   €$’D’÷Ë%—K.—8 ¹ÿQnUnUný¼$Ün 7îýßÉm“Û&·‘À ¢ õ£îÄ …®ùZMê»ôØ¥Ç.UoZÞ´¼i9¼ÜÇÝÇÝÇq¥¸R\¹ï½ùбºBñ¸ë7S¤@¤?w]IdRºsåÝŠùÒè, q$ŽÄ%>?åøæ²c—c—c—¸çUñUñU‘YUUU†bØ#ö@ÉD0LlB¡P(Bv2üdøÉpç£ã«ÇW¯fïÈ—Ë—Ë—W¬™?4oþ VŠ•b%wܵ³•v¬¤¤¤¤¤FiEáza[ØR€³`þÎÃ'ÇÈ1rìúL“À$¼Y\ä"—9Ñàhp48„]3U3U3UP2 Ã0 f¥•¸f¹f¹fÍ#•#•#•ìù~ù~ùþ.­mÔ6jÝôγwž½ó,àT¹ô” Ä·ú°ôÒeà[Wì^þ±00ÀÍÔ¨kÔ5jgÅ£x^z½Þçtíºv];ÉTö({”=€¨U¢jO+·™ÛÌm¶üWØŠ°a+˜)—?©­´<ÈÅâd>@p=ê©u£nd÷xäxäx$>v;ƒÁ7Y˜,Löâ‰ûI÷“î'ù\šéžéžé¦åŸt~Òù‰ó©9ÇœcÎÁæókùµüÚ·‚h­¢U´AÛ)LaJ ”vÀµPƒ<"»ÅhD#i=­§õñ}LSÇÔý3̺ÁºÁºAŒä+ùJ¾’éfsÙ\6·¹%¼.¼.¼î/ñ†>CŸ¡|-.—ˆKè—Ý ù8ü‰<»®tá<ˆ<ä!»E²I6ÉþW8m¤´ñoÛ!ŠEÓͲƒìàhˆX*–Š¥»Æz6õlêÙÌ"ÌeOj,-ÆñÏô'ssåŸIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-12-red.png 644 233 144 4144 14774263775 15613 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXí—LTWÇÏû1üèÒe!Ý:ȰQë‚%«HD~t`ÌRA bqc\ÚUı±±µAT6‹ ÁJÚ"Π&d%Ѻa­–44ÖÔM°Úu†([)ƒ óÞ»ßýƒ¹o~ÄÙìžàÜ{Ï9Ÿwï÷Ü›!š±_Q˜‰«¢ÑŽh‡ð,0ÕÕÕY”%«²*«ß}FKi)-f¦YÉ$“Ì} Ügu|=çùxþðzâªpžP¾*ª¢*Ñ>?ë-¹Sî”;í£Â.a—°K‰OOOÇ¥u÷×Ý_wØðhã €’Ü’Ü’Ü ÏçùzÏóñü¼ÞËyHÌ ÷SOŠâ„8Ñ¿”ïPrErEr…º»¥§¥§¥‡½æñŒxFH Á‹§xЧúÑ~@÷ó|=çùxþðz©'_ÎG¦×Åq@è¿Ìä^Ͻž{]Yáô;}NœKטƠ¨û•“ÊI@ÍTóÕ|@-V Õ¿šª¦,ŲX(<žçãùuà°ú¦×u4Á.Ø;‘\#×È5m·y€¹Î\g®SŠu°™ÙàQÚ”íÊv€õkg´3¦ù b€¦GT²JÓÚíÀúgF•6Í¢ö¡vS» _m®3ÛÌ6¥˜×ç<œ   ÷[¾Àd3ÙL6–æv9]NŒòxÔ£þ;þ;Àn°<“Y“Y0òläB­•¡®²[Ù À3æóÀÔ©…€z”5²F}‘Ç5ìºçº‡1“ÍtÈtˆ¥qOÞ!ïwôÖð‰¦ò¦ò¦r¶=À«Ø•¥TEUøxîç}<,×-×ñ¨¨€ì‹Ù@ì{ø¢ŽF€CwÝ{X·©¼)©)‰m×w6Œ˜;qIâ’Ä%¨--- nRø7ß¾qû¬¬XYÌô?¼—þ^úó@+¬V0‡ çLÏ8|ÿð}ž@|Êå.¬7Zä^î^pÎÇA¬=¶öØÚcÁ/Sþ.7º5tk*¨ü’œINXmZmzhÎåœËðIÓ'M¡ãž4OÐ\š À}üÄñ€ê örÎ'Zê-C¡¡ÐP¨÷X4mÄ"ú5z»ôíR"¢S O-$"J7¦‰ˆ&çNÎ ½9XË""ºtüÒq"¢ƒ‰ˆ¦œþ‘ˆèðŠÃ+ˆˆb»c»‰(&ïqÞc"ú"ìú‰6t: zËóû••e5d5d5àÁ”0%L Îã4Nƒá÷ø_ð(¢"†~tÑ·EßÀªºUuaÍó¹òy¨ÿuÂ× `üÔø)D%G%ð]¾0 à»™U,Cý^ýŒGå&ä&ä&àç#±X,‹ýCºÖªÖªÖª Ĩ1j ¨Õjuh3­îYÝÃS>ï莂P-´þ£õ”é#ÓG‚«ÔsÊ”2¬wµþjýÕzýüƒ!dþ!’–Iˤeûjy—¥ÌI™“2GMumtmtm ‹øm~[³ø-~ÈéÈé#Âd¶g¶@æ›™oÀWî¯Ü¼YYÞm-m-g£³>/”»Ê]`ɾÅóÏ×ô@š%Í’f£¸Â¸Â¸B"ùš|M¾Ö> _ø%æs‰ZÍ«kÖ韧†þíë×7€å®ån(çHÎH$&@Ìû1ïðÐY: `Lª”*íp¶òl%Pq³zsõfÍ«n“¶IÛþ¹iÆuS¸%72 †ŒþÓ<ÀºßºßºŸè LPÏ©çÀ€‰Ö‰VžñÆñư• ÀèØèßð½á{0606¨åîGîG€•X ïÙ û"û"¼«?¡µb­X;U$$ IBÒ¢–@é–Þ_[„-–wš…v¡]hçZÑþèèvt;ºƒû©V4ËÍ_P¿@°-nÛËö¥4ÐþSóOÍ@JÌœ7漡ìÐwò€t^:o5ëhÅTLŲ)ÈšGy”' ;ÙÉN$¹%·äÞ}QZ›M'L'”x×^Wƒ«!T»ÚmMàc<àe7ÙMVÊJ¶I³h–à§l¾Qú°ô¡Z­¿@OåyÄqиӸӸ“H4‹fÑ,œ ЕsÌ_þn’H¤BWÚž´=i{ˆ † C…㠮݇ÏJ¦’©dÆP¹Ä%.3L0¬„ÝË?_êZêbiþÁ…à…à=á=|aj65/$0æ#¤U!š¿€Úµ'à?A-{Ïù]ïïzR¤I9‚´ýÔVc«¯Óëô:¡ÔTj*5ÁºéuÓ릡$½$½$‚ÁŠ`E”Ÿ’«ä*¹Q»acƒ½ÁŽÜùÀæ³ùt¯–­«±ÔX€0¡üP!®Õƒ'Ù“ m¿íÞÓ½GV=—fé±ô°¬§@þxþxþ8l»°í¶ 0är9ÁrÚrÚrú²ú²ú²¾w”ôßê¿Õ+Ú8»wÛýv¿Ž/«´W§«¸æ#Øümò·²f^žy¦wŠE0á?;~<ŇÇíííÐiì4vÁê°:¬Hò%ù’|S›S›S Ó]Ó]Ó]QB~›ßæ·=ÕžjO…ýÇö¿¹ÿMØ“Y¸X¸Sÿ=±~b=0“Ò‘Ò!;îÕý«ûµ~4kµFÇþW¦×__„MÛ†7 ÃèÀèÀè8{œ=ÎØÞ»½w{o8ûPö¡ìCÐTÕTÕ3ÕÕÕßßßÖkÖkÖk`|8ž8]ËŸ¼úÉ«ÌB0!˜ZQJEJ…6§]WŽ)Ç #½êBt_ïóöyEÚœL>™,ÄÀÿ¿·Ý·Ý·ÝBLݘº1uCßVßVßV!:Z:Z:Z„ÌæsB$›“ÍÉf!\u®:WÖUz•^Ð.jÃÚ0’¿*o+oƒ,Òëþðð‡€?2•¸#:†iÌ4¶ ¯ŒåŒå€ú‡°Ž©7VæWæYRßS‡Ô!§äqyÔIuRµN­Së@Û¢mѶÅS šY3kfà÷áH ÑU£jdIûeÆòÆò€áú(ûžò¯”Ê À½ˆ2Ï©Õøµ"­ˆPD(%  Ë þÆkhÀ<³Ìš¯UiU„XQ¯¨W€Eýf)3–ÿ¯òGîJJö•싹+yíÉמ|xutÇ9N( Ê€Z¡V° rP`ÀQ[_×ãõ|OÇ×ëéõÃ|å×Å#û{4_°ÿ§A0ëLÏ;IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-1-red.png 644 233 144 3725 14774263775 15535 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜŠIDATXíWmLTÙ~ï¹wd ÊT6FÔÁdW«­ˆ6Z“ È€Ù"~üÐ¥‚ˆqlW‹¨£kÚÔ´ÈJ¦JS“]C•]CÆŒ )˜64Ôè²Iƒ±ÝÄ4³£3œUà†ò1Ü{ÏÓÜsçÎøA6éûÞóñ<Ïyß眛!šïSJ°ÍŒ@F@ú¯10^×¼®y]åMÑí_—© ©˜æ^RH!Eä@jνb½Ø/ð~*ÛœªÇª¯¨ùSç¯Vº”.¥ËÿB:*•ŽšB9£9£9£øË®»ìzìy¼çñžÇÀî¢ÝE»‹’¹˜ëÅ~'ðß›õûijþöÇ,Îâ,)ZV·¬nYv¼­¿­¿­Ÿg={>ö€ 2&0ŽqŒˆ ‚`æÆ¼X/ö <ŸÊ÷öÇoÖGÎ,Ê¢,ù«(ºSt§èŽú“ÐLh&4ƒŒàù<ŸçCÕNkÇ´c€¶N;®´Š™+3Wm]â›Ä7€vZûHûàù¼BûžÀ7§ð;˜Ò$¿ä—üDÊYå¬r¶ã+±Áåuy]^µÂv’Ÿä'1¦v¨íj;À#<Æc¸  @ç—ø%$#a <Â#<¨j‡Ú‘ÄËŸàz„>² Úmƒ?û±Xàlr69›øŠðpx8<Œÿ8cÚ9íœvÎ"` c³4úIý¤e½Ûz·€g±gqÊzOñHÃ|‚_è1õ)õJ½R?pVL\¬½X{±–ÿ˜Pýª_õ[§áƒÏ*,±1±¾ÞþõvX3°fÊÛÊÛðrL£ÕÉ4 Bð›•MÑG<–³6gmÎZx_”¿(QžÄAòg­ Ö­u[™/y/y Ûžmfßxïó÷>” $Ej=ê-xßàüBÐ'„þaçùçwžOžL i!- †b)D۱ݚ> = À÷7”®,] å7ÊoàUq‡,™oòüBÐÇŒ+µÚVf+³•™w,ƒÜä&7-¢E´(åi¸I7SÞZ÷b7ÑÒËK/e½•õò Ív²“ˆ®ÒUºšä·uÚ:mæ•_mÅh´?ÚO¡i6ͦÉò!ù|ˆ@è ¢8Å)NDDÓ4me‚%%ïÑ;ôÎ&(A "zHé!ëfݬ›Œ ’‹Ä"±…„>b¬‚UÌ %ö¶7´7´7X,`×ìš=å2LcÚÚI­T+µæ•®J¸ª]Õx9TÄAËîëÚuíz’ïVË­–[-æð—RT Ì 1iX–†Å(ñ¯»»»õw"U‘ªHeÉSò”e:2™ïo•ÛÊmåöµo£ƒÑÁè vs7wsÝøÄQ6Öc=ÖS‚:©“:‰hЦhŠÈ0…%ør¾œˆ(þ4þÔ27…ŽÐßÁwðf«3ß;|ïð=>ô½A/ݲ[vÿûçú>¤yÔ´ã.ûÄV`+°DŒ žÓžÓžÓ|‹Ù¹…êBu!¸Ù¬1þÿÌÚÛ/~yn.¸¹Hµ  ÕjkµµÉV_‹_‹_‹c›àcͬ™5O•KK¤%Ò’µ¥ ”ÿiÞ¯}Ò>i_i«ä“|’OxEÿU /ÐèCÀôî±Ùoük½ËÁ-Çß·$‹±¨/ê‹ú€<{ž=쨅 ¡r£Ü(7z\¦´ ª  Å™ÔZLÅT¬4’Ÿüä'’crLŽïÎVg«³Uu„O…O…OYê¹…¯çë­õõLh÷µûèAÀ«ø^¾7y”ê»Õw«ïjǾ2®Œ+ã3¹Grä!b.æb.麡®VÈüžñ·J~$?’I=+N¬8±â‘­ÎVg« œ€®bW±«8YKÝ£{t¦@#Áˆ¥Õ«´UÚªdm/l¸°á¾EàÙ6‡Íu;9í©–zÓ–~‘š;í³Þ _­wªCu$éÏôgú³¤ƒ"2ƒ™ÁÌ ßezr>›Ïæïý]š?IÓ÷Òû‘6 _Hó¼«ö©}j_Ò¹“¹“¹“¹ÀšÑ5£kFµ˜^ì”;åÎ?mV3¬—.0›æˆäð:ï¶8[œ-ª#ì ûÂ>óR ¥žO§GŸ0½Øª´*­Aã'Iæ?ÒxqÊšK`zˆ { ïþùuÞ-©,©,©Lz7°)°)° Wgç¹Ù ©Fª‘jJ“JÃFÒx%úŽ1—w7ËÍr³ÜY'×4Õ4Õ4ñ?æ'òù õ¾ÙꘓcžeÔAÔAƳ#‡Óø^õ-ûN‘îÝ3©yÉCi¿´_ÚÐVÚJ[õ²¥l)[ H$‘Dÿ"o"o"o‚HäéoÆÆª´ÎýßÂaþWFeT¦|•:}ª–qƤ^©WêývùìøÊ@ZgBi¸s¶úIÍë|¥V›íIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-27.9.png 644 233 144 3176 14774263776 15062 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü3IDATHÇÍ–ÿOÔ÷Ç_w‚ppØscé–@{k™ N¡1€£MiK +-T¨SI ´³˜.Š6†¸iˆ¡‰bzQÚ±EÒJ‘a#«K·´%598Öó®ÜÝçËc?Ü}86÷øúå“×—÷óõ|¿ßŸ÷óý[è+`N0'˜7}óïÂñèÜè\ûŸƒ¾CÓë¦×¿þ#<ÖüX3ÀÆÖ­ÚXØ7òFýÚñ"aüµýŒ¸Ø$ˆºuÉ”òk`×–][¢ôO_K·¥Û£À¾ž}=]m]müæFçF\Ù®lûFÞ¨7Æxkñ¥æú‹@dod¯i¢ÖG­ĜĜ§ &Ÿ‚×^yí€ïÖ}·N7€ºX±êÙ€7†9×øF>ToŒ7ð |£ŸÑ?ÈG þ…øDx¿`¹`ÙÒ0öç«ÚªÚ@ts†.º°Ò§œU΂þò¬ò,>Ý­}¢}úíŽv8¢gèêAõ >P”à,ç9U¿Âë©ê¯ê7Ž}ÀåÂu…ë,-ùï½m|™ä¢çŠžý—@Cý¸V¦•пÑ{ôôÕ5òð€„íG¼x×øõ%} ]ÿ‰êVÝŒÕ|!ü]EŠ_^³•""¿8À¥ÝÒɧ'Ÿ†Àüæþô÷YßgáUþ¥¨Š ½¢@,T.T.T‚³ÙÙìl×=×=×=X9µrjå™*ˆçÀýÇï?ŽWâÃDíD-0e±Œ¸# >¢§‹ˆ8†á†wà‡´mùWò:ò:ÀšjÍ·æ£çoËßœ¿:Ê:Ê:Ê ¾2¾2¾’³“³“³!²=²=²š‡›‡›‡Ã„\'\'\' Orý¹~ˆŒ‹Cß}´ø`ñA`"Ø*®V\6ùˆ²IDäU07mú8ÿã|ýÍäx{Ÿ½ŸÑ`ÇðŽáÃP§Ô)uJ¸ñ5Ç5Ç5$Úí‰v˜žžžžžçÏeË:—™%™%™%áøÖû)§SNãûËûûöéoBÿÑþ£ ü5ÈÇaޛЛJMI-L-Éû{–)ËdjùÛŸ/~¾(Qƒõƒuƒu"‹‹‹"MMM²j­­­"‡Ê•*IJJJJJ ç7]ÞtyÓe‘yÛ¼mÞ&Òy¸³ª³JdF}röI‰r}=»avƒ©E$»%»EDÞˆŠJMºlƒ¶Aí[v:ÓéácÄòîƒw@ZMZMZ ܈½{#6<ãÛi·Ón§½Ô^j/…åÚåÚåÚ‡ÿ­•ʕʕJ8Þr¼åx ì™Ý3»g6ŽØ®Ø®@ënÿp;NÐr´P×ÇÅÇÅkߊz,öùØçõKàMð&ÀGÿìŸèŸŸÕ¦é¦©¦)h7·›ÛÍà,t: ¡º¡º¡ºv¦ìLÙ™&²tréäÒI¸`º`º`‚Þý½û{÷Cº%Ý’n‹©·^Ü ?ÿÈ~Ä~îþz6g6`éüÒyГ¬3Öý’YÜÞaïðW7E†^zQ$"Òö¥íKÞÊýíK¾—|âúÕÐ3Cψ4Ž6Ž6ŽŠŒ{Æ=ã[ƒ­ÁÖ R:U:U:Þ:UUUUé«ï«ï«ɜɜɜÙ›»7wo®ˆã§ŽXG¬È™Ž÷޽wLüö‘„« Wy‹îÏ"?‹1]ó$y’¾º’ Ç0TäUäóÖ¶Ú¯ö°ÌòÝÒ‚º¶j·¸Å-`Ž9æÞJFa˜á.wW£:­Ê¤2 lY=•Ž ðCèTÒÒ1,– w„~c"m" Ôú Î¨wü¿¯zLýTýtU÷ê^Ðæµymô"½H/ZCÄh1ZŒàmÞÕ¯%kÉ nöWû«ñjXÕ±íÛÅ2nwG°Ò±‡”ß_l*6‹!e^VÔ`I{U{•JhÆ\¸+¬¬!¦¡¢ÿƉBk­£kåZ9|ê:dF 8ª8êÿ*认pwáî5w%‡Ÿ8üÄ*@7PK-VPÜŠ@-QKð~]¿€ „}#oÔã <ßègô_½+Ù×Å#û{4_°ÿ¬¢Q IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-21.1.png 644 233 144 3050 14774263776 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÝIDATHÇÍ–mlSçÇã¼¹qh©@¢(RÓÒ‘* ‚",/­€5/¤ÉºTi´–!u´ ¥X†* ¬)hÓUBM „´n·n/•–J4«FÙ4DDÀ”@LŒö}y~û`ß\oÝ·}áùruþçþçÜûÜçœG@DD榞‹2eÌIÚm6ž».w]ñé¤}ÔGƒ£áŸ¿ƒ‚#GæuÍë2/Ù¶å·øéñ"¶~z> —¹b9gsÎ:*Sö>x¡ô…ÒÜG“vç ¸Î¹ÎÅtØüÑæz»{»ù-Üüúæ×S•S•`Û–ßâ[ñ–^º¾ìû¯ü"u>ë¼ãädçd‹@ѳEÏ>þz’~êž«{`Ü9îT`LnܪˆÅZ“i¶åOñ­xKÏÒ·òYù“õVVˆð—úH}ÄõA2àÒIŽ·w·wƒÐÎñ{Þç}Ü OèÆ6cqÊML€Sê´:  .ª‹€a4ÍÄÑõ)} €ãÇͪ”Þ_Û‡Ú‡¬/äÌÆŒ®¬zä?÷ö½gxª±¼±T €6 öš/›/£©1P”òªÏÕç þ¡¾Ußb¯(ÓL ¡Í¢Jyô+ú42®×,X"Öh6šVï=“¶•""?ýý®®ÑL?~´_ðˉ’[odFÛ§õh=ühÅîÆîÆî‚6ªj£iŽFþÎ ƒiüH´6ZËŒJêCØv\>—/šiÕ#êç""GƒðÚ»¯½ Ó÷Ì¥5}ë?\ÿ!ü¦`WÁ.Tù¡òŽò˜\0¹`rDOEOEOÁª¦UM«šÀ·Õ·Õ·Õ.ÀœoÎ7çƒZ«Öªµ0uhªcªVZ}fõ”oÛǯ|üÊ,{©ù‹¶@[ÀúrGƒ¢/¹ÐýùýùнÇ[ã­Q›ž*,öûˆ[¡kö®Ù»f/ìïÝß»¿jv×ì®Ùmÿþz½¿>í‹Ýà7 v'v'vVzVzVzÒøuŸD>‰Xúj“¡Ÿœ<9iv¡]X”ÿCþê,L´N´Â¿ª§j§ja<|ýÄõàßåËÿ,Î[œ·8íüež2O™úJûJûJm‘ŠžŠžŠ™]9‰œDNBD–ÈYbãÎ Î Î "Žc\IÄ1fŒƒÆWÆW ¾P>åKk fƒÙd“M6p•«\ã¾q߸æÒø/i~ÍÏŒŠX},´,´ ˆ¹Â®pZûQçO49šÀíTgŽýF?pǬ5kÑHXoœœÜKÍF=™¸Ë$“œW(07™›Ðˆ#É©  ASnSîÿìü©YÉÆæÍi³’7{ó±ÙÑqx‡wpÛ[`´-ÄA ªdgwàÛ¶ü³[–Š·ô,}+Ÿ•vV>´·‹‡ö>öpÞ`ÿ Cßp…ÃÛIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-26.7.png 644 233 144 3174 14774263776 15055 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü1IDATHÇÍ–ýOTWÇÏŠSyMŒP²¥¦(KCL¬Ö‚qTÞÜ*’4 ɤHì®éFÄVR´1Ö±a«&€†vºM$@ E[DÄiit‰m\PĺIiŠ2 ÃpçÞóÙf.3Y÷ðürò¼}Ÿožsï÷B!¢|»€ „ „ ¯ôžß¿lÛ²mIÿðÚµ*vvÝ;‘ç#ÏDý…6ä·õ¸žX/„?°ŸîQÂïmm6lñÙÇ¡0µ0uÙ ¯}æ&ÛŒmN”^)½ÐÚÐÚÀŸ`ìû±ï¦·Lo¿­Çõ|½^Ç ÄÇÿ§¿°¤cI‡á?º4t©¸5që+¼ #¯@Þμ£Á£Á2T;F˜Ü8p ¯É[ûòõzOÇ×ûéý½|Ľ÷–Ôä?ÍjüÜ[0ÔÄ…ò†ò7”6>¤–ZÂ@ªÕ 5·üA;¥>‘§åiù“ü @-UKqÓäiò4¢‚ Âä¤O>)-Þóõ£ÀV`3~+bVÄøÏÔ·šÍkï¼ùΛ ×(6Àäßµ´PdžL‘)HíwÍ¥¹'…4K³4Dá÷ãÂ… ÔQ‡¬d¥TlPØYØ©OðÓ쀣Bˆä³t//9B`dÍÈPö°Ãž4~|ü8sJ™rN9çï§ +ÃÊ0ØÚÚ‚’ª¤*©<·¶/¼½ð6دØçíó0ynbëÄV榸_v¿ÌŽù³Ã·‡oU£ê‘Ÿxù™)„µ}ð¾õ}+̸´ôœ¯M¦Fˆ\ùFäÈÿÜøÍÆo`¦e¦e¦,3–Ë ,OYž²<6ÙtdÓ°ïµïµïõë(ì(ì(„¨¢¨]Q» ùÃäšää’fC½¡Îÿ¡élÓY-*Ue¥—ð¬Bˆrè ï ‡†Êöœöiy-.éjÒUÜzSŒ)ƦG¦G¦GÞ•Þ•ÞwÃî†Ý ƒ}Ö}Ö}V°°°ðsN9§œSàìvv;»¡oOßξ˜°ºguîÑ‚¹Ä¹Di–––Ф— !ü—ð_d3Ø‹íÅ0‘5; £#¿^úõ\û×µ;×î@f~f~f>”f•f•fAt]t]t$\O¸žprªrªrªÀ±Ê±Ê± 0cÆ êZu­ºÖOÔüoó=ó=øÛŸ«×W¯÷ûUe4m4 âFÄ Ù,hêŠêÒùãdæd¦ÿ·ÿ«±b¶bÒúÓúÓúáÁ…\€ÆøÆøÆxÈx’ñ$ã‰xÃæ ›7l†j[µ­Úöü·6ðxàñÀcHÚŸ´?i?<=9ýÁô2g_°/®èèm0HûÙó±çcàh}iì¥1!Úþnä»wzþLø™p!Š+-â~ïýÞû½B''' ñì賣ώ Q¸þpýa!Æå¸—BÄVÅVÅV q±òbåÅJ±¸.[/[/[…H_“þjú«BDþ,ú3!´z!„qâ7õuõu!„QëÒº ƒBý‹þµ—´—ÀÕÁþ/û¿”–m{³ÜYnÜÛÛ'¶O@š5Íšf…w»Ç m³m³m³±.c]Æ:hr5¹š\0]6]6]¹ƒ¹ƒ¹ƒà´8-N œH=‘z"Ú;Ú›Û›'åÖ¾<_M}5¥ËÆ@¹O.jû ÌTfÒóµtP¿U¿æg¹•DI@ 5ÔœÕC •TRàWPPì;Œ1†dÌ3ìè'ËŽ•Ó‰Õö Z}:†ñ¡ñ¡#DÞz¸þázPOyuLZp,8˜SO«½j/ÈåMy´l-[˵H-R‹@ËÓò´< „J@[ª-Õ–·¹Å-ÐîhóÚž?ºž˜ÍÉWI•T)¶GÏÏX wÉ]rWû°°[Ø-ìÖA’SFSFSFñ×õ·×ß^ØpÃý ÷Ò¼Ò¼Ò¼°ÏçùzÏóñü¼ÞÓyH\íÏùDô‰>ÑçZÌwh–e–e–E}·©¿©¿©ŸMóy‡¼C$H01Œa € .¸ÝÍóõ<žçãù£ëÍùäé|d|Nt‹nÑíúOw!ïBÞåeGÐáwøá@ÈX¦Æ4E­Q>V>ÔlµH-T³ºB]¨ÙÊBe! Ö(UJÀ2Y*K…ÂãAÇKŽ—àÈ»Ÿ¯¼¬»E—èâõÏéhB»Ð.´ɵr­\Ûr˜êMõ¦zŬƒ½Çl̯ҢlW¶Ì¥}¡} ÀW`4D[hž¹¦>•T£`ïáÎÁË—™êMÇMÇ3¯Ïy8îîîýê—|Ñf´ml®sÐép:0ÊãU? ÞÞv™]à\1¹†œCÎH2íŽv|oøÞ€ñiãÓxÇãÆãÀwÛwP?LLÿ§þOáu~ÿâ÷/bÄh3æsÙ\ΣóÉ;åòÎKµ|âXűŠcl;ß%¥]iRš@UT€ŸퟷÝ*º êëôu@Ú@Ú0Õ~@‡é0âþÄý`¨1ÔJûû+ß_>•cG^8òÛ®ïl1OJFJFJꇋ†‹†‹ô@é|O¯_¾~^±¼b‰XkXkˆÚÑ5Ú8£žQ ¹¹¹º»»» æPÍ!^aHÞïé÷„ë y†=Ãçá|ô÷ë¯;¼îpøÉTG°'Ø@OrõáÕ‡ðö­·oÀLÇL”T•TE.×–jQ Œ19_0½`:ìølÇgáüª#X¬×ç<œO µÔC¡¡ÐP¨÷X 8z½áYµ38 ×;×p®á\ƒþü%d YÁ‡$-“–IËöÕñ.KŸ>;}¶:ǹѹѹQOàe«‚¶ -¢>+ wAî‚H°@u :ÒsÛ ÛŸí0~•}ɾœÁø'0Á&±/c_Æ>MH3¤ÒŒ“#”T˜T˜TH$Ÿ—ÏËç[Ýú…_j*5•ª{ô±~ü?ìüÙ_?úúQ(*ŠS¯©×"ýì³?à}ëì[g~3k'ƒKƒK¡·™åŠåŠåŠ6¡n“¶IÛnnšò=m³Ž² Y†,ןy€µÆZc­a«ôûcºÚ©v‚¾S¾S¼£m£møÆZX ÿ``0þÓþÓ€Z¡UkÝÝækiÁ«ú+´N¬ë 3…™ÂÌ_4ÅJWõþ*Ê…òÕ'„V¡UhåZÑvØûì}ö¾ð~ª{Bšåæ‡?¬_ ×[ÅrXNXJîVw›» HOHOHOPvê;y@: °št43™É,ìù”Oùòj§vj'’<’Gò¼{Zµž01Q’{ÎÆHíj¯i¯EªPÐï)ÀÎl̰MÚ×Ú×áGÙryË7[¾Q÷èo 1yL³LÝ•º+u‘hM¢Iè ÑUpÌ…>7Iw¥»Ò]¡gnÕܪ¹UD‹Áb°ØêÚÍ7å›ò#µ«Y5+ü°Ã;€Gx„GНÎWç‡÷¶qyãòÆålÏgH6$’ݧ|cE™Ðsô$ĸ£}c”vOÔn²’¬$‡´ÚíAX‹À`OHH`ëuM&‰IbÒæßÅHñh _<=}@jŒÑîúgiWéSú”¾°r'S'S'SE£‹Fª?×µØ!uHÌáR I/ðÇô /à ž¤Ýcƒ±AIv¶:[­zSrRkµÇÚ¾väò ùÄ@è/Iâ?cê†ÆiÚ³cli·ûIÚ-XS°¦`MX»ö{Ž=ÍSóL? ¡L(ÊVï‹.#>Š©+ÐiÏÒn®T'ÕIu®l\f+³•ÙØ2™Ì€rC?jä‘<ÖYÔúí`&3™%gL½xú-V»£ý‚;ÂVa«° b*¦bm¡˜&¦‰i€@ ô‹éééDÒ%é’tIø{(pSÌÉýß,YÿVH…T(_žÞ[!2‘‰ z…^¡÷_?›Ÿg9GLÞgõ¿|¥bs~⥬IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-39.0.png 644 233 144 3213 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü@IDATHÇÍ–ûOTgÆ¿3 …A*— Y\YŒº²t"5ÙrKE¢ÂZÉHM6À6$54ñ–”]ûƒÒÚ6õ ¡Û2im)h‚`ÓÐZã¦lVi$tÆ"–†up„0—sÎg˜9Ììúøþ2ùÞžç9sÎû¼¯€ˆˆ$†~ŒéÆtãâ`lüK8ûFì+»‚ñ9 Õ†êŽA $u$u¨£áX¯ëý‘ó"aüH>=/‰NÄ\‰¹b(Å­P“]“»$· Ùn¶Ïàíž·{º;»;Ù“ßM~ð´øi1„c½®÷ëó:^$¾´þ¿D_‹¾fx1¯Ä¼"åå+öœ+`[å¶J€‰¨‰(ÍÊ/@<ñZ1àÁƒ¾\±^õëó:žŽ¯óéüA=)¯§¼.ÂGÛÝÛÝæöàÀè'œm¾Ð|´oüv.rŽsăbP Àé€;àÆ«ý[=«žº5»fÐîjw¯bU¬x!ð4ð¸Ä.¯ý3„w­y°yP8ú _T™ªLæv]üï»}¯Œ¥;rwä‚¶ À xÀÐ*Ô85¿¶S+РдMZ™V¶ðO¡EiQZPÁf6‡ó4RFš:©ÜVnãžðToߎ;Nèß+‹x•""8ËMó§æO=&p¦;ÓÁÿ7¶üRòsçÏÌJ{{Ã|>›Ïæ³kÀ5àÕ¡:TG„ 6lýË|›}›aúwS‡§3§Y‚øàhq´“æ;æ;Þ Ñ ""ç¾&¥I÷q~åW5÷E--ø÷ÄÏ?C«ùOÍhÍ(¸Ž»Ž»ŽCÅÉŠ“'!.*.*. ¬‡¬‡¬‡€ýìg?/¬†É†Ç Ál3ÛÍv´ÝßîŠÞ­WÕ\¾nÌhÌ6õH \Dä_ÍÐÿ¬ÿt¿¼÷å=­~Ãâõ=ë{ðº \Ù®lÈIÎIÎIëQëQëQ(Ÿ/Ÿ/Ÿ¯q¯q¯qCWKWKWK8µöjíÕZ°dY²,Y0U0•=• ¿o]±rÅJ¼}koq ­®_º~ SPÑôÅâžÅ=k äOÙf(ògu[ζC{ÿéÁ¾Á>‰©ZSUPU 2›<›<›,RZVZVZ&2~püàøA‘®%]Kº–ˆÏ7žž…v%c!Ãö}ìƒå¨ê‚ßç§å§…õ‹À@Í@Í@\¡Aï wÐ;¥¥¥«…÷ê=Ô{œ[[[af×Ìö™í°¹qSΦŸæ0‚ª†þöþv0ÃzlÚúÔÞÔÞ¼]rëù§ŸZdÍ9Í=òѵo®}#I;6ìX¿c½H¨+úL„Àš¡5Cy»l²6¡*¡ §ŒÛß³¿'"§EDä~´=Ûž-¢ýE» ]I]›º6u­ˆ{Ö=ëžîîî¹[r·än‰ÈwÈ;äñ´yÚœóxÈܧ}òúrçzû_ÿûzîçºo‰ô¯Ak‚ÖEøô _ìÁ™Á™ëÿâÓët°ìµì½ÿXqqÅE€çžo0úºé7ã—ç‹ð—×3í)ƒíÛ'–T¿~ 6l ^éÓÏu½ÙÞüÐ e×Ê®\u^uòk½=z`:u:ºé7ãÍ|o9¾œþ¯ú"ðl˳-–a°=g{NÖ¥¯Kù7¾€Á—a÷ÎÝ;¾yæ›gTè@a*˜cS&—é¦ßoæ›x&¾YϬïã#àxÍñšïï™Ù3c¿äKèkäà g…ÔM­™ßSGa ‹.À»ÞYï,‹êsãŒq8¥N©S꾺 éE,2íöNƒÒø€SC><¥U8*@—¿y®<—ý¬|aå oê_Ïï f_ʾP4°À¨kÆ;Æ;hÆœñ…ñJU'Ô‰ÇBT'ÕI-1¿xðàAáå=ÞCV³Útj.Ølÿ1³ƒçw,û”""¯¾K‡ý#ûGsV|eðÐö3±áû³ßŸeAÛ®•kåzÚ*m•¶ &b'b'bA;­ÖNó„(¯z¨ÂlÚlõl5Œu|÷öwo³0ñ«ù¨ù(rôåå!/†¼8gUÍ>>Aly#^2Ž÷Î=ŠvG»Uüë?ÏnÌn”Öè½11bÏ8›QQ 2<<,RÐTÐTÐ$íˆvD;DÒBÒBÒBD<ýž~O¿<–Ù‹³õ³õ"qõq{ãöŠüÌ•’"ö÷’‚“‚¥µ¿8ôhèQ/RV_VîUöóñþXDäŸÐÞÎ?^Ͻž«Å8Ö·®oeÑÜynYnYnÄoß¿¶®ÝºvëÚ@g’%K>µ)µ)µ)ûК¡5Ck êBÔ…¨ P]W]S]=}å}å&¾:DÉ•]Wv“>>AÖ ð¯Ã¿ŽO‰Ï‹ÏÉú|›e›Åréo=7=7=b»ÑrãÓŸŠ ………Š:u«þ2ÿË|u(³0m1m‘ÅÌÙ2À¶ˆmÛ" *¦*¦*öïß7‰‰‰°ÙºÙºÙ [·4n­D+Ñ`4}4}4j k k !ñ߉_%~—×9»œ]ËÎXᕬ+Y@§\ÔuѬ#Yf£Ÿ€Þ¦·0à ŠÿWîr—»€ÁK)Âg^Í«;ÍzGjŽÔ >>ÂUÿÃî¶»ç¬êïîwèg|sLÿÇÒØÒ ú-}Q_ãcÃi8A¿¥ßÒoÞ£÷è= ;u§îUªJU)9FŽ‘$K,èÕÇô1ÐßXj^jfÁØâÃç_î î öAûàœ• Ÿ''ÿR¾%ßxü“yZïÐ;€ic·±‡þO3Î80ÍSÀ”]ä€Y¡µEç‹Î§§í×ökû“#©/õ¥¾_ü3ÀpÑ;íÕöj{5ý¨@)@" è°;±“~.^'^'^G Ø—ìKö¥¾‚Œ’Q2úçòóÏ><»þQqfqfq&éãTœŠS‘”i¾ÉÍåÃÌÆ!qÌ%^Ëky-ßä˜tL:&ý—iuZVw©ÇÑçèsôÕݱ.±.±.‰þWùIùIùIÔD¯Ž^½šÄc„1B`™ß2¿e~€çÚóÜó¾Çßo&¾;Ÿ'¿‡ÇÃǺ+¸’*¨‚*øm$‹d‘,ÕIJ ¨nœ™¼8yqòâ<¿Yu³êfÕ¹ö¯îXݱºƒq.2,2,2Tq¸@\+>ÂGø2Xa…ÀvlÇvD ¬ö {=©†FC£¡‘:Œø1âÇ~ÿð›Ão¿ùΗ2•L%S­¸²\Y®¬¤“4›fÓì'Û˜•¤ÐVh+´hD#ƒ¼Ùj¶š­nü‹cÊ1嘚·F¯ŽWÇsqé¹é¹é¹ì%ŸqŸqŸq¨á/xã+ùJ¾,â!äSò)ù€/|á `CˆØˆ xðàÁš½ÍÞfotWª:UuŠÛÖ}«ûV÷-¶Y$IEÒÿû+·Ž[Ç­{c ÞÀxãù89Út´éhÀ)9%§<§ŸÜ0¹arCæÒðÓá§ÃOs©Ù‰Ù‰Ù‰l ЀXà‚ .(Œd$ã7³Ã;1ĈF4¢z–ž¥gE¢H€éÞ¤7éMXH<‰'ñPœ©9Ss¦†KíÌëÌëÌckä×ä×ä×η²cì;ö^4ÑÖjkµµ)Ë-ŽGË_[ãŠqÅ8 ͹“s'çiñiðiðiÃeqY\.½KïÒDOôDàà@’HI„¬²0€À]q8V:V:Vìö{`o²7Ù›jQ‹ZX̛͛͛ÁŸVŸVŸVÓ‹·ÅÛâMŒ¢QŒ(fM K#hødƒSî”;倿ˆæˆæV»EîzÉLß›¾7}œßx~ãù€``` À}Ã}Ã}ˆ%b‰Xìß¿?`3‹™ÅÀÅÀ‹^U¯ªW0áL8h.i.i.ñˆG< ð¹ìsÙç2¬šPM¨&««ÎV­: ƒ„A O60\(Ê…þcŽïïï>_œ°8aq)C>ò‘?ŠÉ´É´É4@±T±T±ØÑ½£{G7¥ÉÒdi€tuº:] xUzUzU5¿ÖüZó+0”<”<” d¯È^‘½Ðøkü5þ@µ®ZW­ºÚ»Ú»Úg$ZhXhXh ec±ØGðŸ!ÇBŽ…Cô ô ô ¬®¹®¹®¹`=žî}º÷é^@Ú&m“¶ƒ¥ƒ¥ƒ¥ÀÄÏ?Oü „þmø·¿IvìÀرÀò‚åË €`>˜æåòåòår@¶^¶^¶LLL›qcå¹D.ÕÃãácpGq”D0—™ËÌå1šÑŒæßoÞ:¼xiziziÚÅíâv1p}ÕõU×W¥–RK©°•ÚJm¥À{gÞ;óÞ@óšæ5ÍkÀô²Üò»åw˽-z[ô6 º«º«º‹WM̼˼˼ à4Nã4‰`‚A½b‰µÄZbÉbn·Û†¿gÙAvÔíHRä)ò9Àëy=¯‚ƒƒQݨnT+9Vr¬x”ú(õQ*===˜&‡ÉTqU\XË­åÖr`óœÍs6Ï”Ê%@wÒt'(© ¤‚ÉÖÉÖÉV˜˜T&•I¥WÉ1É1É1®Ä4Û4Û4›^iÛÞ¶½m;€¸˜rnrnrn†6 mÚ(y%¯äûtY˜,L„ †?ïïïå{Ë÷–ï–ö.í]Ú |ùqäÇ‘@äžÈ=‘{~˜æ‡7àT÷ÚîµÝkc¯±×Ø‹—˜$&‰‰+a‘Žt¤®`ÙD6ñßÖ+ë•õJ—Z­WëÕzA·ïß+¾W`©K¬K¬K„‚ÙÌlf6iii@׳®g]Ïqš8Mœ̹?çþœûÀÕ‰«W'€àœàœà@T:;;;;;[¦-Ó– ÌÛ=o÷¼Ý°û´ú´ú´B¦[¢[¢[ÂÇ‘JRI*™f’@H³`ëäÖÉ­“M7lZ›Ö¦ ÛiùÀòåƒø¸?¬?¬?Ì•Ƭ†Ý4b1€mxÑð¢á`µX-V °þÄúëO!!!@“«ÉÕäÆÅãâq1 ¯ÐWè+ÃAÃAÃA@߬oÖ7ƒªn«n«nƒmMhMhMà­m¶}Øö!³Gº@º@ºà×-Î{Î{Î{›RHáÓ§…OÜÃ=Ü›S*ìö û›¤uuuó²“î'ÝOºOSºSºSºIßÄ7ñM Î»Î»Î» ,a KA¾ _@ÀÔ³©gSÏÚA;hÀø0>ŒÀçñy| ;!;!;ëƒüðàlº°å– [ð¿2*£2j{“ ¨€ ¢7a>æc~û.–©`*˜ A êP‡ºÞ>Žãã²NÉêeõ²úh|¿ñýÆ÷é   R¹¨gQÏ¢¬ý$úIôd$ƒd €Ð:ÒCz©Rª”*Ä"±^ÇëxÀ/ø¿À2á=á=á Em`m`m §ÍÍÍeA4DC4‡øé-¸}-¡%´„ r·y®˜é¾‘ý„œ$'ÉɆ\FÃhÍþjìÀì`¾Òeè2tÜn³Ö¬5k!#…¤ÂBÒ‡ô!@ü‰?ñ ‚"O `!b!@“i2M†Ýý*tõºz]½+ØkØkØ‹-ïïïª,ž¯¯¯ýòã0“¿  ]èâ’<ý¨=èA÷yÈC©Ž¼y-òZÉzIŽ$G’SY<:ktÖè,Ö\å_å_åïÊ÷$D?úÑ; 0À€˜n¤ÚI;i'(9BŽ#ß6Þ6Þ6ÒÄ–}-ûZö JäååŸÛ_;¾v|}à3Ã>Ã>Ã>€©‘¡tç9絺Ç˼ïÅ{AÙö¢íEÛ À‘çÈsäøLî+÷•û>¹Ü¡ëÐuè%µµµ4‘ä’\’ 1¿À_…RH:FÇè@8ÂSƒÆAã •uQuQuQPÊûä}ò>€åcùØŸ1Ç™ãÌñç6·K§qhŠg žõÐ}$Ï4mAÉ´v]ù$ŽÄ‘¸ÄõÓ•ºqݹ۹۹›ÿÓ;ü;ü;<³jÑñEÇÇ:þ1ÿ˜ 3Ÿ™Ï̇+à ¸ˆO… ;æ ï[Þ·¼o¹ S%‰’D•¬˜þiö7óe|_Æ–ºgv¯gÆŠ‹‹‹‹‹añTî3rk7ß­ÝR·vÿgF»ÙÈF6ó•ΩsêœÜns¹¹Ü\Ã0 Ã`ÌS‰ú©ú©ú)Þú¼ìyÙó2A§äääУ{¯½×Þ{èËη:ßê| pª=ûˆÐÃ7ú °ç™;ÀÏní^ÿ파°æïо+ú®È•p„#JƒŸÁÏà‡ÿjlilil!Ûdee^Í«yõŸšØ­ìVvëÔë¡1¡1¡1̈;ß?¹Ç©W¹øKHHHHHç¾4PQÙÓ· oAßœî®îpâPq¨8tãWIII~×Ìíævs;ý¶smçÚιVN8'œNAžp•p•pÕ¿ÑrZNËÿ»fú$ èÆF0ÂzfÀ](îU‚?°ßÑ®vº3w¦Õ´šV't1W™«ÌÕŸBmkmkmkùÂ2a™°Œid ²Ù?Þ »v5ìjr‚±ËØeì"ßóþ¼?ïOϸãêÜ€Ößã`ðöŠvÝË…ë0r‘‹\VO2I&ɼFki-­ýóviˆ4D´ z=‚žÞþ þ þ‹Ý/oy¼åñ`¡îxžÆrê8þYæœé}J_IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-16.2.png 644 233 144 3113 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïO”WÇï £8HBg_HèÝfmšÒŒ¸°b¢èÆÂ´ElAiù!Ù /ˆ›¬]uiÑ@X\…¸¥²BÉ6Á.¦šIK©¥B‘¥&©DªÎ ´X03,?f†gž{?ûbæa¦í?àóææü¸ßó½ç<çÜ+@!ÄÓáU€ùYó³æU!Ù¼/¢_‘³"ç7ÿÉÍ:˜Þ4½9üW°½o{ ¡5¡UŽDdÃnøGï"‚ÏЋ§ED{1ö¢i[X>…©…©+~’ÿÞÖKÖKsAxç“w>èjëj£Ư_˜Ú6µ "²a7üý^4¾8ñ³øBÀ2×2—ib—Ç.ž{å¹WÖî9¸×BÞëy¯ŒÅŒÅ(3è žxµ ðáÃø¼Q²aûû <߈gÄñ`ßjß*¼ñöo[[Єb¤%J6h—¸À NºE·ºY7Pƒ²NÖSõª@ «a`AK‹§‚S@ç9O¼ú*ŒW{ðôÁÓÁ‘þµÓ¿ÓomûvûöHMÃëéíPà/ðƒÚ  ¨q@ÝT7Ñøe”¡äeÙ-»—2…*Seª XÎ2–EôØÕ¬šE©ßI»´£ êHÿ‡ü…üƒàéíQ¥Bˆ΂Õgõù,|s·ánÃìksü+ý+y¬ hÚ@$žæÕ¼š<<<@KÕRµÔ(BÇ8Ʊ(ÿ"­V«Ï‹uu<ÖªBøàNq§_X;¬>‹ÁGðB4÷CÅ»ï‚ú=€tLñT{ªaÓË›^Ýô*ÊuÞõëƒH ’™’™’ˆ///‡-G·Ýr&Û'Û'Û#~3Ì0ävæ~˜û!Øþbk²5¡6ÿ#³&³&d£l”¨,ª,ùMˆPw„âÛƒÐéîtÃÜMµwãŸÓÓ yššš†ÁîÁîÁnXݸºqu#ܺqëÆ­P~ªüTù)è‹ë‹ë‹‹»à¸à¸à€uIë’Ö%Eô™û3l6 m{Úö¨½Ð“Ø“Áå!>ߪ+«®¨‹|?7ª2ÜG«µûÚ}X_¼¾h}\s\s\s€+ß•ïÊs±¹Ø\ )»Sv§ì†ÜêÜêÜj˜Í™Í™Í‰8þpü!Œ-Œ-Œ-@OuÏ{=ïÁo7<¯=¯ÁµöÁ?ð­õ­¹qe`e@]ðTÂSò6ÿñžõž%—Ú€ô«éWÓ¯B¿»ßÝï†ÎÑÎÑÎQØprÃÉ '£2•™•™ ÇŽ7çßëë+¤Õ¦Õ¦ÕÂuû×|1{U±'Ë“øL &yÛ"—åeÓm¡iÉZ²xÑôk!„vñ0TÄ DŒ?Æ#Dú£ôG鄘x0ñ`â-3-3-3BL¨ 5¡„°ÕØjl5Btvv á/õ—úK…¨ß\¿¹~³gþy¦ùL³£­÷çîÏ ‘˜šôeÒ—Âþ°­ÝÖ.•z^`ºîÊoòߺ?êrCÿXø$ïÞzx+ öööFŽØ–Ý–Ý– ÁŒ`F:æ;æ;æÁÛëíõöBiriri2´f·f·fÃóó38pÞqÞÇ3/¹^røôúPÓP“Ú W¦¯Lƒþãc©+«*ªŒ°ÒA_Ð,„ÆÔ£5¬a pŽsœ‹ªÕ#ŒUTQ¥×ÑÑRÕi¦Q ¦¯ÂYá4æYsdŽ)ëÖ}ä]í®™còZ¯ÖËc5MQ]%-Ò"- ïÓ÷éû@æÉ<™P@H§tJ'¨Ê©œ wènÝ úðâÔâõº¾úê^Ú½4ë=ë=Ÿ….cŽýbòïŠÝ»4˜ ŸL“{ä Ê Å"‹ÀóÌGåC†34Ë$“@ ìÿ?™'óИÒ?×?&Ãø‹»L»LF¦~2ùvWw—qW†^j©%~©Äè%z P}ª&ˆÈ†Ýð7öx¾ψâó$¿.žØ÷Ø“ù‚ý?ÌÍCzJžÿIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-28.1.png 644 233 144 3127 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ñOTWÇÏP¬ (Fê/Ö4šZ ¡"HlJÅÊ0¬®š-5bHp7›Hë6¸&–Æn 6é.±„'Z³Ù0qЂ”bC *ÉÖF.ÂØš@FpF`™yïÝÏþÀ<Þ´»€÷——sî9ßó}÷Þó½W@DDR¢_¸ qâ’—í¸*ËŸ°#aGÚ?–ífle¶²ÿžmz¶ `{Û¸cÙæ¼›/báÇÖ3ý’"–cµgµÇVµ?„}™û2ž[¶ûÁÞnoŸ×àÐ¥C—¼g½g9   …`Ùæ¼oæ›x±øòá¯ê‹ÀªË«.ÛîÁê§W?-/¼ù›/þq9À÷"8ßr¾0ñÔÄS*ô‡€‡*B„0ÇtŒmÎGãÍ|ÏÄ7ë™õ—ù¤¤ˆðEi°4h?³œpç<-µgkςꈴsŒfšq€.º×kYR7ŒF£8£ÜÊ  ~T?š~@?ÀšÐ´Ð‚ƒmQ¼Ö^¯½n¼sž6Wœ+Î~Æä#¿ÜÛSoðòž×ö¼* rX`Ô%ãsãs"FÀøÁø¥~¯*UåÊJ¡Öªµj-Á+¼Â¯‡RGµQm”ˆÓïé÷Lwä:ó{Œ=†IðÔ1[)"²éoôØÏÙÏ…âÁ÷’ï%ˆü€]3&?™ü„…H^¤*ReU ŸŸŸ¿Óïô;AËÔ2µÌ*׸Æ5à_ôÓo¹çƒ¡’P ‘±e|ðÙ}vঽËÞŠ7ùˆÊi¾ 5 5 0·`dí¾¸óË_BryòÉ  ÿPx¨ðøÜ>·Ï eö2{™ÖM­›Z7®M®M®M°¸kq×â.‹ˆQmTÕø,ðqàcÈÿ,¿-¿ Õõ§¯*¾ªX‰Ê2~SÕ[Õk®\óUÑÖ‹ˆÜ¬…ž¤ž$8{¼cwÇnUùrjZWZKfjqqqqq1ŒŒŒC^g^g^' º݃nH;v:í4t—u—u—YÄæÔœšSw4ïhÞQëà\q~ü:hâ«J];?}~Ú$v³VØôSÒOÊßyøLJ%0á?7~zJ{œ=NÈhËhËhƒö„ö„öÈuæ:sàð;ü?d×d×d×€¿Õßêoµˆé-z‹ÞúV}«¾r’r9¸øœ×çõÅÄÍM¤O¤$÷%÷)àMù6å[ã6¿ÎεÚþÏö÷¿ÿ6mÚ<£½£½£½àîrw¹»`{÷öîíÝpVEVEV4mlÚØ´ÑòkûµýÚ~ËÞV·­n[\Ü×^Ð^`ÕÓÃS?Oý °&iM’q;ÎÖ>Ò>²ÝoâƒÄ"Ãßø¾ñIê§ÿiLjL)”?*$r×{×{×+292929"âÏñçøsD<­žVO«H ‚"‰/$^q—¸KÜ%"sùsùsù²2—Ãá}\ûNûnÅ*#Zš–&"bt¶ÛqZ¸ºpuè{‘Þ×{_‰_•r#åïîØ_´T´$á¾Ô¾gúž96slæØŒHnznznºHÝ‘º#uGDDê[ê[ê[D\îa×°Hç­Î[·D"##-bEŽ¢ø¢x‘ k××%=sïÚ2ú'û'EDB…¡Â¡ïÅì¨ÞY½Óêлõn@g†ÔÊ¢{ñâFe4Ff™eðàÁ«`¨hö’ÕJ(ÐBZ(¶^õñêã1]‰7ªcØÇìc¡xum,{,ô¿.ëŒ>ž ϲ ¡ꃠN©“ê$è÷õûú}Ðë‡õÃ`l1¶[€RJ)#ÕH5RO©§>F>Ê#W"WXPASÇÆ^{˜·ûì¾ûåïµíµ3Qeê=zðÈ(1Jˆ6ÿ Xb‘Å_¬Ì2Í4`˜ñF¥QI„y½Wï"Q|ö&ìMø¿Ê½+qpˆ¹+yïù÷ž_¹:Ú“œÄamþ¶þ6K úÕ²²Û°e›ó+[Í7ñL|³žYå®|b_Oì{ìÉ|ÁþE§Š„ÐxäIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.5.png 644 233 144 3172 14774263776 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü/IDATHÇÍ–ïO”WÇÏŒLa* tAq׆ h¶4¸Ä*»n[³EYA;Š­?ºo­D7ÖØQ76©Fš†*‰”¬’JI¤N©®u‰‰($ÕÝeDLwc(F˜Î efžç¹Ÿ}1ó0ìúxßÜ|Ïï9÷<ç9÷ ˆˆHrt°¾l}Ù:?‚­ŽÉ6$lȺÁgu°l±lùç1Hú<és€”ú”zÃæ޴Ÿí/ãŸÏ”K²Äñ-ñ-–uQ|ÞÍ}77!-‚?ó€½ÍÞöTƒ÷Ýï»ZZø <ºñèÀøºñuæ޴7ýM¾Ùürüÿâ‹€í’í’å?ÿBü "QQ°dÄàÁØ\´¹`hÎÐe}H$Q­0—o6õQ{Óßä3ùÍxfüH>©o¦¾)ÂßÞžx{Â^qðžçŒ«ÖU ª ÜF=_ð‰ j£ºKw¤R«bÀ¦lÊ úU?€¾CßAqm\æçHTÿŽð©°+Õ• x¢ñpv;»íuöRÚK±oÝO½Å/KòJò@­wà ƒJÓ½º—0›È#e–H•©RUJlihh³ð4ÓL£Ð¨¡†0°˜Å¦2Ü ï|øÎ‡fO½eæcl¿>#×ìMö¦=×eøÓ±OÇDô ""¶O|xÜñ¸C~6öp‡;b“vé“>±H—tI—Hxnx^xžˆ™™™ˆÄIœÄÉÌŠ†&–@aÀð‹mä\\ò³¯üé’§KlŸÉ'§ON‹ˆ¼¸àÅ{®óu4e9Û ûô}:L|ÄcFÞ«_õõW!¥2åBÊTI{ÉW%_ÁTçTçTg¬ G]G]G]Pà/ðøyf=izÒô¤ 2~Èðfx!磜ڜZÔòßæ¼’ó ük߃?ypÀ}À º3’h""·]ðÿ;?4X¿¹ó͵û÷óóÝùn‚ãSã¾q,Ì]˜»0ú6ömìÛ½‡{÷Ž5B‘³ÈYä|6±‡^|x2«3«3«¡âlÅéŠÓp¿Ç»×»—`´!vó§æMÍ›_$áÉ|÷|·jaËpÅpEŒ0Pç/ó—㯎£Ž£°àÈ‚# ŽÀýë÷¯ß¿ÅÉÅÉÅɰ3{göÎl(^_¼¾xý³‰uŒvŒvŒÂÒÆ¥KÁ1æøÉñdÏ*Ì*„’† -sŒ9@¥'$¨Qg’¾LúÒè‡@o îj{öâë®î:Öu |•¾J_%¬ñ¬ñ¬ñÀŠÌ™+2!íRÚ¥´K°Ò¹Ò¹Ò Ó Ó ÓàžãžãžKÌ;àð@gggLþFšpª¶:¾:àÅ Zh^ü¼x£ßª¾ÖKõRK¿ˆí[Û·"·þxkøÖ°¤îšØõý®ïEn¬¼ñÚ×D†·>WäñoFæŽÌY¾hùåå—%Ud2{2[Äš¦zT¥_ø,ÚcW›/6_œ»O&|Üòq ÁU¿Xe_e‡º‰º‰º  ™fšc'¿zðêÁ«áDèDèD‚÷‚÷‚÷`sÊæ”Í)0’4’4’UÛ«¶Wm‡ü‡ù÷òïASFƒ§Á3«Ç¶76faþ•å»Ëw—Œ<”þþ ¡£Çæ–1eLS ÝÖnk·Ápnà ÔPC ¨U¢Jf5ÙMnr0š‘*®ia- EãQ~ºü40ý+ˆÌ °Øqœ\=¸ô#lÔ+Bí¡v¦Œ_Nà ´þoÅT«jU­`TUFp—»Ü#ÑH4ùäƒþwý±þô¡¶PSÆï"üÜḬ̀?°?Ä1cÏL~¶%lK€HÂÝLë×ôkF©QJxæÄD'|ˆ A`’I&£:Ïóëâ¹}=Ÿ/ØÿÏ«6ýŽwDIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-5.3.png 644 233 144 2723 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷܈IDATHÇÍ–[lTU†×™¡…2Zš† b0’B!„Ë &’´5­FcB Ñ"øBÓ JZîDíÓZc4¡ÒÒ)Ú„0ƒ±!k‘K¥FÐZÊÔNKµ´s.ûóafÏ ·wöË9ëöÿÎÚgí- ""ÓOWž+Ï5-n»ÞMù=¯x^y}Äã5ãµËŸ@V}V=€¯Ñ×è\MÙ:®óÓëERøé|Ú/Ó%å˜Ü<¹ÙX›°wÃ/½ñ’癸}àx[½­ÿYð^Û{m-M-M|ý?öÿ]] )[Çu¾®×xéø²û~pïþÞø&?=ùiÈß¿¡`[<áF”l,Ùðפ¿&)Ø “Lµe½ÓlOäëz§ñ5Ÿæë˜éŸé²7ËÞô6 DD®~ U¹U¹À€ÙªLª¨"Sým™C "–ßò3ÁOj¿Ú€€êVÝÀAë¦u“ uÁ¼aÞÙÁ2ãBÍV¬>š/ÁŸÐ#÷÷öàz¨È¨ÈÐÀ<ϸ³ÐYXxñb& °°€{Üã©•EY ŠÕrµ<éUêY+l…1Yo™–™†«0* -ðàú´VŠˆ¼ðxû½ý£O1Ôs§çNðUeÙoÙo1vwÝÝï~§N œ‚Hu¤:R v†agðÐ2÷˜{Ì=YYY V­°ªBU0Fgzì’ü = aGBðþ®÷wšp 5ÁHçHßH*ÿ÷ü«ùWaQÍ¢šE5°¸pqáâB¸<~yüòxJÐPÛPÛP¬Yºf隥à«÷Õûê¡üóòå v2v!vÎÇÎÇÀ:Íç×zÂ.n‡oG¾õ€Úœà™¸Õ{«ûV7Ì«ŸW?¯jÖ­= === :T‡êH kkkƒÙ+²WdCt,:ƒœY9³rfA(::•LŸp6i¾8¿Ö#0íì´³ªú‹ú‹Àɾ¿%gvœ©>S êÔ-¨ƒUÑUÑUQ˜lþ±ùÇ 7Üî §øñã‡ÑÓ£§GOÃê­«·®Þ 3®Í¸6ãD¾‹4GšSéªA¿Åùµ—Ȥ’I%¼(â¸"Æ1ù'±%ïϼ¾¼>‘†²†²†2‘/ä ùDrwæîÌÝ)rÒsÒsÒ#ÉÕµ¤kIבîëÝ×»¯‹z½^‘95sjæÔˆtÄ:Ì3•¯ni¾8¿ÖãqÚv㊈Uj•ЍU""2S^ùùÊ¥+—D*gWήœ-ÒXÜXÜX,2X>X>X.’ŸŸŸ-ÒRÙRÙR), D6ÚthÓ!‘ДДБè–è–葬óYá¬pJ˜”k¾8Rσ{Œ/=ï³ëì:&ô‡ÞØØ€eîeîen8>õøÔãSaØ?ìöCéáÒÃ¥‡!’ɈdÀ¾ö}íûÚ¡¨¯¨¯¨†††ÓZþµ½ÁÞÀÁÇî±ûÿÊør ÁµF.Dá<0¯‚ %”P’æ (*Í.º€O9Á ؆mö£ÿJ#97ÄÛïí¿°]¬._—oª%îç=Ï{d£´ªL•)ß9à ÊùU¾’¯DŒ›Æm㶈«ÀUà*Qíª]µ‹¸ —á2DœmÎ6g›ˆDå¶Ü1¾0.E\ò‹ü"÷¤Ø5à×Åþ-ö[L~§ £…ÑÝ"ã9ã9/zÔä÷TxÒ&3öyû< œwœw0ON~PØØÀ#Œ PĈA*ßÙìlÆ;l‡Óñ5ßC“ÿ³2yvUÍ­š›hj©%3Ùbì·í·™uNÀÀ€”­ã:_×k<ÿسò‰½]<±÷±'óû?ÎÝE ë¼IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-25.1.png 644 233 144 3114 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ñO”gÇg·XØÀRð4þ` ±¤©`KX*AH[w äPJOO›ôüA‹!áÎ\”Ê=5x¥—Òb›” hhI¹âE¨ T¡Ç!U[!½5eéb¢i%,²ç²[ÙÝç}?÷ÃîË»½Þàü²™yf¾3ïÌÎ÷yDD$-ö+`ͰfXS£ºµÊ´'mJÚ”õqToQ`yÅòÊøŸá±÷{ ýLúí¦©ç†|¼ˆ‰ŸÏ°Kš˜†Ä³‰g-®˜^ÛŸÙþLÒʨþÎ0غmÝìùtϧçÚϵó{øñË¿˜wÍ»ÀÔsÃ߈7ðâñ¥þò‹À²Þe½–[øhâ£"ùRæKOì:L=ååw¹óˆn5 ¤¢»?~ ñÆéÆyÌ߈7ð |#Ÿ‘?ZÀ ç §¼ì{Ùg; ¸ÙAkm{m;èÿwóÚi'"žˆôÅÈŽÈõ´N­ôYÍ«y«úÛúÛªZU³H(2™ •VR(Šáý­v¤vÄ(ðf]•ÖJ«í´Qü|¶ï–òÔÖç·>z@xÐÐ@¯×vi»ë£ú'ú'èK=  €)zÔ6­z]ä»Èw„u·º¥næð­ÚVÍ(ðÝÒ¸QŠˆ¬=A¿íCÛ‡þ˜zrêIÿ€_Ï®º{àî‚á‘°/ì3óß·Þ·Þ·ÂÌÀÌÀÌÌÖÍÖÍÖJVÉ*9®Ðh¦ÙT>ÿÿ‚aw¦lS6`ÌÖgëó'õˆ^("ÒrjkáþOZÞæž²Ê>‚ÔºÔ©'Ð]­®÷\ï§ÃÓá逬@V +٥٥٥›—›—›¡‰ÐDÈ,D9”C9`¾iþ­ù· ¸©¸«¸ ½ïçwßexiyÚÆªÁªA£s-—%²ZDd¬úíývh?òÙæÏ6뻟Z‘Õ—ÕÇ¢êlt6:a_Û¾¶}mPÐRÐRÐõ“õ“õ“0ymòÚä5~!éÀt`6Ôm¨ÛPgþq*>÷}î3ðõÝ*Òáíð…ÕZ¬vÝã(qT:*EÊ® € ˜ºq¾4²X¼gàùŒüKwåCûºxhßcç ö¿d'©‚˜XßIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-29.4.png 644 233 144 3204 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü9IDATHÇÍ–ýOTgÇÏÆð"fЬkm©šÒ.¥$N´•¡¨ŒÐ-m“šµÖnÜl¢uSX7Qi—E²5 ØB Ú‚,jåÍZpª‰‰¡uw4B D£µ ˆŒÃÜûÜÏþ0sÙvÿŸ_î=ç9ç{¾y^¾ç‘EÁ¯@ÄÓOGÄìˆß…ü1919)Ÿì:,oXÞø÷Ÿ!ápÂa€Ä¦Ä&u=d›óf|x¾H?¼žé—ErDŸŒ>iÉ ÚûàíÞ~!&)`ìk»µý‘Û:¶u´k;Æïáî·w¿¸Ÿu? B¶9oÆ›ù&^8¾ìûY}xêÌSg,£½ z<³á™ É;Ãɰi㦷#oG ±ÄY€/æð„Ùæ|0ÞÌ7ñL|³žY?ÀGÀæ°9DøGÁTÁ”µ1p½™î:¶ëüí”SG± [t P£MiSøŒAU«j6£Ýh0¾3¾t½X/Ƈ¦Ý×îÐH#±Tñv=¿ëy“àõfZ T²6‚í]Û»¡= ~«_cÕ›ëß\Æs~ðˆG`tªCê~uG ¨ £À(6НF¤iD›pâäçÃà†zY½ŒßØ¡­ÔVšn¿ ½hiÑR“`õka[)"²º–në§ÖO½Q0üìð³à €×ÇŸû±òÇJfüëýïûßUšo˜o˜oO§ÇÓjH ©¡0*nܸqns˜¸}˜é˜é`æÁ¯f½³^^‡áªá*`ÀZg­óF1à#†]D¤n>¨ú  ¦gÔ‹ù§r?Ëý âwÇ×Ä×`8®;ƒ0Ò:Ò:Ò ùKó—æ/ë>ë>ë>(ÞS¼§xpk\ ñÓªµj­:d—¥–å”å`l˜Ëú)ë'Ó«^TÇ·¥lKÎøˆök‘«» ;®;ŽííÌïÌ7JWÙRΦœÅg¦:w:w:wBêéÔÓ©§Á¹Õ¹Õ¹5T0m*m*m Z+Z+Z+~±•ôÞì½Ù{3tp6n̙̙4ñRu¾¥½¥è ð‰ˆŠˆû!î‡t»Hzaz¡Hî¥W,¯X,}—/L\˜è®²®º>¹g»g»gÉËÌËÌË[<¶xl±HóHóHóˆÈXÂXÂX‚È„>¡OèòxxF<#ž‘ê5Õkª×ˆ”(Ù_²_Är+rAä‰DYYõêŽWwˆÈoâOÆŸL· m‹zõ*7¿õØ=öеÿ“õÇ>„twº;Ý —F/^£Ü(7ÊaïôÞé½Ó°ùÆæ›o@¢+ѕ肣eGËŽ–…Vª²¤²¤²"k"k"kÀ~Õ~Õ~bæ¢oEß‚ßWï}õ˜šåŒß¿E¹#Ô÷Úí€Å-m ï.¼+Òù}×p×°Øþ6w0î`œHÉá’Ú’Z‘ñØñØñX‘FW£«Ñ%r~Ýùuç׉8|ŸÃ'²$qIâ’D‘ŒéŒéŒi‘†e Ë–‰¬íZÛµ¶KäÄñÇOI¹˜ÒŸÒ/’T˜”š”*²:{õèêQ±‰<Òi"–x¾á‹[ô?šg¬skçV8ë¾Ür¹Å(Íy'Û—í×÷Ÿ¼+yW myÚò´åÐ7Ñ7Ñ7õöz{½ÒêÓêÓê¡'«'«' ¼Þ o¬,XY°î8î8î8B+Øý÷îŠî øË²/˾ ;c_·œj9Ìøå¢n¶çnÏ ÝÐÏéçÅ$“‘]¸pcŒ1vº›h¢ H&™ä0Ë6²lоÖÎiç@Qƒjƒ#Ú'Ú'`8ÍzÛ¿Øþ0¼•´u ëuÈe\ziè%ÐÿÐ1Ý=ÿ`þ3ú!ýŠ~Œ£Æã¨$•¤’@_¡¯ÐW€ªRUª 衇Е®tì§œò0¢ÿÒcôfÔž> eesúhAû…òÏYŠ,ÀDP™§ôn½˜TNåÄ?¨äÿ}Ì1÷?¯£ðà”¯JU)~æõ‹úEà¡ÙYŠbŠbþ¯ò{%…Å…Åa½’ÝËw/Ü:Úù˜Xмš@ߢoÁF¿Ñ€ „lsÞŒ7óM<߬gÖðy’_Oì{ìÉ|ÁþKã匄½‹IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-13.6.png 644 233 144 3153 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ïO”WÇÌ3Íh "„ÎÛMc TXm ±µZ[JëXLj©lbp±4&Ín»BÃÖÄÒv¡©/è`±©¡˜jÒX‰tÙFÖ,.P&šŠÓ–ƒŒ Ã3Ïs?ûbæa&íþÞ7Oιç~¿ç9çžs®€ˆˆ<ú D§E§E/ÊÑ•a½íYÛ³¿þ,(Õ!ꥨ—®þl~° ¾5¾Õ Ëæ¾iy^$ŒÉgêå! +âNÅŠ* Éu°}íöµ¶•AùÈE°wÚ;çðêç¯~pú“ÓŸ°<žo¡·²¹oÚ›çM¼H|©û¿Ä|óEÔ ˆ‹‹ôgÒŸqV ÜN(ÚV´ à–å–EE€>8p¨BÀ‡sMFÈæ~ÈÞŸ•]{ïÚ{K°ÏÍÍÜM¸›À¼Öªµj­a>m‡¶CÛ›&6Ml‚@C !ÐáP't†ÅÀ¯››aâÀW~¸Â¼ö› >¸³ÜYÀy{›½Íg5ýþ#"r´ªÞªz ÔoŒ,oãÄ¡‰C°áÀ†Æ ¨sŸK9—J)¥lܲqËÆ-ßßß %M%M%M°X¼X¼XÌ/Öîë»¯î¾ ŽJÇ!Ç!Tþ_Ÿzí©×`z»ñµñµ‘ûÖî[ ÆÍ ?¢¾ª…vw»殨=ëä&ä&à7ã:”9”9” ]9]9]97™7™7 Þyï¼wRV¥¬JY. \;Ô3Û3Û3 ©}©}©}0üÍðWÃ_ÁÞ¿½òÈ+à¿´jÄ3âQ{àÌ“gžÝôGð-?³üŒ:ŘçÏ ö…ê(Y»©Ý„ܘ\k®:+;+;+Ä3õ3õ3õ___ 3 3 3àiô4zÃvmÞ6o›bšbšbš £4£$£žÿã¶Ç·=¾?ùßð¿ðÓÊŸV‚š^vzÙiu*Z–YÊ-å<ïļ#"M""2eñĤǤ‹X¶8-NÛ¼mÞ6/2Þ1Þ1Þ!2l ÆH·»ÛÝíIÞ›¼7y¯Hï®Þ]½»diÍùçüs~‘lK¶%Û"rã7:ntˆLMëÓºÈÇÿmYß²^¦D’ÞNz[ÄpH™”ñX´`tÝQ#¢i[µ­"Q«ED$Ñ^xnaëÂV‘ؚؚؑ˗ .ˆ”õ—õ—õ‹ô;ûýN‘ÙÆÙÆÙFk—µËÚ%Ҟݞݞ-²&mMÚš4‘ÉŽÉŽÉ×·®Q×¨Èøõ[=·zDÒ·dŒgŒK¢È½³÷ΊDõ¨*U5ªÊ¡Zþyâ쉳ÀóÁ;Ê„ÿ`üÁ¸ƒq0h´ ZÂ)ª›ª›ª›‚u¶u¶u68î>î>î¯Óëô:¡ÈUä*rÁÌŠ™3+à¤ã¤ã¤òFó.ç]†cq-í-íøCÍfÇO4Ÿh:Ì;ÆRU¾Yõ¦IkdAÀwtøñ½ôÒ (*¢ìÆc 8ÌaGèW³šÕÀG4Ñ7ª'ê‰ÀŸM¾ªúªz`1T•K}LÙoÛoû¬×´kZ¸ÐÎkç™'Žr€3È èûõýú~Ðëô:½Œl#ÛÈ*¨ Œx#Þˆ>â}ÞãQ£Ü(½rѵèbÞÈ õ±s×3¯gØ¿³ç³rÛìc¿èü¥q¥qKmôszŸÞhF…Q¶ôÇ*Áîq/"B ¸Ã$“¡Xƒãeãe4ô/õ/#ð)µ•ÚþoçÿÙ¬4g—9+ Í6h G8Åz¹^ŽÔEu€(¢ ,›ûKW"tÞÄ3ñM>“?èÏýüº¸oßc÷ç öwìû@5¨:¬IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-176.png 644 233 144 2757 14774263775 15003 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܤIDATHÇÍ–LUçÇŸ{¡ÀYÀöNIX*C»D°™ÆŒP 7LèšP5v¡µÔ4½[6MM Q2ÿ ‰1ËÀ8l@‹Ì l4úƒê–.(½D›h6µ¸4Kí•ñ#RîårÎyßÏþ¸÷Üs2Óÿ}ÿ9yžç}¾ßïyÎó>ç‘—’O¾?ß¿*aû]ÖYoü¬/awÙà{Ë÷Ö?/žxñ@ 'Уwö{óE\|/Ÿã——ÄudžË<çÛš´[áMïlÊÊMؼƠ1¸dÁžÏö|0Ð;ÐËoajtj`~ëüVpm'îìwòÞ}¼û8ìëÛ×·¯ŒµF®‘ +NTœ@?>=Ó1Óáá{¸÷ý½ï;½×5âOÔíµ R]y¥òJ²ŒâûÅÓÁåÝË»e¥f¦&\߿߸vãšÈò±åcËÇD‚åÁò`¹HdCdCdƒHWUWUW•ÈÆèÆèƨHZ$-’ †"ã?//)úqÑã¢Ç⻟÷õØ×c²âð1]Q_Qïð¿vA`Õðªa}ŽÅ©Â©Bà^²‰~§ŠU1Ø?±óì<(Y]²ºd5 Æcƒ1žYõëë×ׯ‡Þ£½G{ÂPÞPÞPøýþFXW·®n]lûõ¶Ð¶ÄG«£Õ€ôGeÊÀÑ#È ä¨»0™‹çÇ^k5£fܼòæòæòfØ>°}`»ëŸ¸9qsâ&œ/8_pÞõŸê8ÕqªJúKúKú=8•å•å•pl¼ýbûEwÌØ¿š..G_D]T}wk‡µCDLYãû©¬8…YiYiYi1ƒfÐ ºþ¾á¾á¾a‘âÅŠ¸þÍ'7ŸÜ|RdúéôÓé§"=Ý=Ý=Ý"‘‘ÉȤHÁÚ‚xA<µ}üÙZ°D\=ˆˆ|õ!ô/ô/aÝÀvë{ë{âÎ+576767¨=jÚnZB-¡–\½4ziôÙO|¦áLÙ(Ë(Ë(Ë€Ó?:-§ãȇ8Ÿ$ùÂý—û/;ÍÿÕ‡î©$t8tØ=%`Å,·—4we …òØ#Œ0â± )¤褓NÿQ¢h[XxøìPK¨Å=•Þ96eLÅÒÑ“æ¤ IÒPMª‰'ªAµ«vÐýþÆ£ï¬:«Î‚nÐ ºÁ#@£Ñ V©L• öoìíA•™f'Oø›ƒÿ ûA6`‡ÏÌ1gжUCmVmVjœ‡ÁÛa`I½­ÞNMw ØØ@Œ(Ñd=½…V<2—UªÃûKûK/¾Ã÷Ìäÿ%Mk›Ö¦#!ÛýÄv½]Oôu}=Õ3¸¶OµD2ßÁsðð_ùÜÞ.žÛûØóyƒý€ 3kIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-33.5.png 644 233 144 3214 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜAIDATHÇÍ–ëOÔWÇT;ŒEêj4ÄŠ¦eñv-‹E©—–´MÔYkqcMK-o4[£×(V§Í"›pYÖ’”;¦uia}1Ҭ싺ÌCY³Zä2 —‘Ë0óûϾ˜ù9“uÿÏ›“çö}žsû>G€BCp¹:ruä’€ùÛ>jOÔžµ_är"öEìû×iˆù"æ €ØªØ*Õ’5»æ/D?<Ÿ¦Rèêuõ;‚òYxoã{£–äK6Ð7雦ýpÔzÔ ÐXÓXÃïàqÇã€ñã; $kvÍ_‹×ðÂñÅÙÿÉ/,üvá·@÷¢îE! aW®—Oú_†w²ßÉxô£d$(£@4ÑràÁƒ6\a²fúkñž†¯åÓò꟟)|wâÝ }e Àñ®•T”T€lð5ñ'Ê)'¡àþaÿ0^ùõ’z ¨’Õ²@Þ—÷”¥/ãþqÿ8H×¹N´üwOúJâKâ[0Ævc»¾–Æ- ip¾ü+sRsRAþÀ×üÄO ßT©‹ðÉ™&Óò¤,•¥Ow ¹L.“Ë€,²È é™d’I$~¾äK|À*ViF_;ä}œ÷±¶ƒ—ß;J!„xå×ßÐßð,€þÕý«Áw€·FwÕ Õ0ãßåÿÈÿQ(ŸÏè3úŒ0š5š5š~³ßì7óÌ~9-§a*kÊ|˜kΗœ/‰@Á΂¶&4‘Ï <¥<ÈÐÚù”J*±ƒ«ÇõéÀ4~ÕkÔ5@“:©N¨>ÕÌë;õø!0˜>§‘Fìêrïã²OÊ>1 |ÆñíSÛ§lMàÌsæ…sÚæCátá4¨w´«ªRJÔ°F#^)¥Pj¥zZ=½xS¨D•¨L2Èë9Àv¶£Œóz­^‹xñ‚ú}ŸäÂç Ÿ7 ÍH¥ˆHÖßÀæ³ù|±üëÖ±[Ça·ÌLN/›^Ƭ֠5h áx u u u0æs¹!ÈdGòàÁ¿ll†‡¥n<¸Á¬öL†r†r€ÚZl-¾X“ðo‘ãß@IEI¨ß9?<òðl,ÝxtãQÔ¥m—6_Ú *VŪXØbÝbÝb…é+ÒW¤CAVAVAÌYæ,s~±vßÞ}s÷M°ïµ±Aýöð‹^<ÞFÑcäÀþìýÙ` ùˆù¾ Z‡Z‡`æ€Ú“[ú²–á7ïµwMïšÞ5pÙ}Ù}Ù ««VW­®‚¾]}»úvAzCzCzt¹º\]®0¡®]'ºN@JwJwJ7ôõö}Ý÷5üá¯og¾‰ÿê¯úGûGÕè\ß¹ô‰ Áßß©<ü0ºdt ¨ý¡:JÖ†µaXÿßõwÖß Õª/TƒÞ®·ëí•••ŽJG¥£Öí[·oÝ>™™™ k™m™m™K¥ÎRiEi…i…ðÚ·>·õ9ðýÉÿžÿ=€±åcËAy—ž[zNy¢eiLqL1ÏJ¿¥ÊR%"u""òS̨%Õ’*ý úÇèEåŽrG¹ˆ§ÃÓáéIÜ”¸)q“ÈTÅTÅT…ˆšWój^ÄSæ)ó”Éâšé™é™éY³6fmŒÈÝÜm»Û&âýÁ«{u‘ÿiÌmÌ•ŸD’>LúPİËòÏF Æyã|T¿hÚ«Ú«"Q«DDÄikK4«fñ?ò?ò?Iv$;’"ÃÃÃ"mImImI"“““"ö\{®=W¤ÕÝênu‹dägäg䋌···‰4 6 4 ˆÜ¿}¯ë^—HêïÒî§Ý§ÈÜŹ‹"Q]ªD•Dõ‡ªòû2®¹xæ"ðZð eÂ0ëઃ«àZ͵šk5áÕvÖvÖv‚+Ç•ãÊæ±æ±æ1ðöö÷u÷u÷u˜ŒŸŒŸŒ‡³ö³ö³vp ¸¾s}ŸÆ5¶6¶â5›=œ:S¦h3ÿ1«òý’÷ͰF| =USM50È ƒe7ÅSÀ)Nq*BŸFiÀß©£.Üöкø³¯äƒ’€…PU.ö1e±øb1ni·´p3vk_j_2«t2É ²Æý´~Z? ú!ý~Œ Æc°mlÃi8 'ÐÀ1Ž‘eÅ ï]hZhbÖp…úØ¥Û·3lwlw|±Œ˜}ì¿(®(Îä¥]eFïÖ»ÍxÓxmñ‹aÀÏ<ó7¤‚Ä™bœñÅ»V`¼e¼…Ƽþ•þU>EÖ"ëÿíü?›•æì2g%¡ÙñöÅ£ëÅøA]QWˆ" ²ynÚ›þ&ž‰oÆ3ãù<ί‹Çö=öx¾`ÿ8Ýôv*ZIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-62-grey.png 644 233 144 6303 14774263775 16013 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü xIDATXÃ…—kPTW¶ÇÿûœÓoF,.F@Ñ€b¤‰Ž·P”LaR¢Uâ/WE½1ƒÑB U&1D‚33bÍ`¡Ú„ËC:5dŒ¦òAÄÐ`ÓMwŸ>û~ Û©r*5ëË®}ÎÙkýj­ÿÙ{m’“““““%fÌ030«¸~®Ÿë§u9r.ä\ ^yOòžä=Y³ºSwêþñŸyoÞ›÷^ºÓRk©µÔÒpgq–d#!ЉNt؉ØI?’lll ÙÜcî1÷øŸgÉ8'ã)9:÷èÜ£sÛóÓòÓòÓÈÈòdÝ ‡ðƒƒKɼŒF4¢™‹Bž'ä ?X§¬SÖ)ÏÈ\®'ë%Ù’lI6L8„C89L0Á`;¶c;øÀ&‹¯Å×â‹õz^§×Q[SHSHSˆp`4q4q4ñ­ò@y 2}d€:è|]¸Z®–«ÕýÝj¶š­æ€?ªV«V«VóÑ)™)™)™ÜEå å å ¨ ðB³Ð,4ƒ#q$ŽÄð„'<X`À$&1 313x €3¸\ .è«=-=-=»éVëVëV‹9ö${’= À 1Žñgüçpçò€< âGüˆ€V´¢pb&Ep»êvÕí*æ8ý«6©6©6ñëñ†7òFÞ¸.ÒZc­±Ö¤ýÁ#Å#Å#…¥T¤T¤TpNLÒI:I'áÊ^b/±—ë6ë6ë6€æƒù`€¤’T’ àà€Û¸Ûí£}´˜œœøcü1þ@Ž‘cä\þSJSJSJ¹‹ÎøN'GCh ÉÝdSØ6 É×äkò‘ ¬WÖ+ë!…Aar²–¬%kmˆ6DÜ^t{ÑíE{ˆ=ÄÖö¯í_ÛDŸˆ>}˜hhh.o»¼íò6`¨q¨q¨`0 ˜€æ¢æ¢æ"°«±pUV(+”0i‚4Aš $T–V–V–"_‘¯È7wÃñA|Ðkï¸?wîþEh"4RŒ£8Š£3~Œã´$·$·$-¯µ¼Öò°ýööÛÛo‰‰‰@ùå_” †àFÑ¢EÀÓܧ¹Osôé+ÒWO§Æ¨ÕÖjkµ@wGwGwœ&Ó‡éÃô¤ØÉãäc,c–1ËþæÜÿ¸ÿqdËÞ—½/{& T àœ~Ëÿ-ÿ·|`ÅùçWœ †QQQìQïQïQ¢9¢9¢9ÀxÆxÆxõKÔ/Q¿~‚Ÿà'QŠ(E”o”o”ož%?K~–ü”SHR…&'“b„!÷æÌ+˜Wu¸k¸k¸+Ç_ÌLLLÍñÍñÍñÀsãsãs# +Õ•êJæÍ/š_òy¼ëëëÔ.jµ ô0èaÐC@8'œÎ7ÖÝXwc0b1ŽøÒøÒøRÀEê"u‘¾fÚ§Û§Û§Á<¾õøÖã[ä9Ãz³Þ¬7½<¹|rùärôÚ†möa°Ž”ÔRXmV›Õ(ü~ ?`Ïî=»÷ì¶ÆlÙ4©šTM* =¦=¦=ΑΑÎ|ùàË_Ÿžþôô§§–š–š–`ó¼Íó6ϼݼݼݺ“î¤;AqÙ©;Sw¦î —Q1*FE/sÒãÒãÒã|aïÜÞ¹½s¹¿Ý›º7uoŠdG"‘€Y²W²W²reœ2N¨JT%ªÀEë¢uÑâ5â5â5€âŠâŠâ `¾f¾f¾ô&÷&÷&%á%á%á@£„G €ø…ñ ãl"›È&¨0*ŒÌYæ,s澤¾¤¾$È{ø¾‡Ç'Ò^i¯´—/d‚¤=Ëåp9\ÉnJlJlJ´«ÆÖ­[¹sûP§¨SÔ)@ëÕÖ«­WöÐöÐöP@ª Õ…ÔHÔøˆ}Ä>b þJý•ú+€ß»~ïú½ "ºººººº€;^w¼îx§&NMœ‚…n¤éFȵK´K´K„hÒCzHþJìÄNì_‰¯ë^×½®xX¬kÄšò¡ÑÈÑÈÑH¶¯ÚXm¬6Ú÷;@]5bX#†eqÑâ¢ÅE@™w™w™7ðsìϱ?Ç[r·änÉ<zô8L M M cÒ1é˜8úüéó§K—2.eå+ËW–¯¬¬¬†¤nqÝâºÅ‚ið½Á÷ßcnŠ?&þì×TÛ€mÀ6pÀFŽ<<òðÈC?á'ü4ï”è‰è‰èÉ2cƒ±Áد×Çëiܺ®u]ëºÈuM£i4¨õ²õ²õ27Ì sÃÅF±Q”PB ˜Ìæ€vÒNÚ 0JFÉ(!KȲy‘¼H^Ó½ú{õ÷êñ§²Ô²Ô²T\•S9•ÓéDÊR–²Kÿ5ÔPwdp3Ú`ÛЀ41|9)#e¤ “´’VÒJ€Dñ¯ŒÎø†0„t ]C×Àâ”’¶QÛ¨m´ï5:ktwJ’!Éd|“¯ÎSç©óN\›9pÈßÑntóñÎ~T `€oG²EjV/¬^X]¸QúŽôé;ßä{Œ{Œ{p†ÊY•³*gýK»xЧx ôÐC8›Ž™F ]´‹v’ÈäHZ{Z{Z{h\Û¾¶}mûØBÅfÅfÅæ¡iëçÖÏ­ŸüP¿O¿O¿ =´‡öÀÍçk'¨É1V³„YÂ,¸Ý¾;|w°fY³¬Y?T¸+ÜîýÚNm§–-¬{³îͺ7iÉ$™$¡L(Ê@!ƒ 2€NÐ :žð„‡ùYϳžg=ø¦aQâ†EpSŒ(F#€°\X.,?ø!SÀ0CÓ)žrlãŽNâ< W‰cê([8£]û~M¢ItÜÆ™L]»bÛeÛeÛ%ì~KxKxK`V…„„`ƒp_¸/܇œQ3jF ŸÍgóÙœ >|&ؾ`$j$j$Ší’.’.’.*\1óÓ¸) ÅB1wÊQÙ=ΊåçççççcÒ™Q8¼ÔC»ûÚ=åÐnÍ¿iצµimü.C‰¡ÄP9Ã0 Ã`™‰Fs£¹Ñ,˜†Š‡Š‡ŠÙ.éaéaéáöï,,,Ÿèz£ë®7 Ê±Nî|y¦â{å¹ÃA‹C»WþM»ÞãÞãÞœáÛœos¾Í±ïÇ,À¸égëgëgã¼®Mצk#oËïËïËï‚JP ªÝ?p[¸-ÜóÊ eAË‚–1cŽxÿåͯr±ø‹ï˜ê©˜Š©˜ü÷HèHèH(Jíóíóíóoñ’ I$hóé§ñOãŸÆÏ®6t: ôÓ»_ßýúî×ö£Íh3ÚØ,Ñ*Ñ*Ѫÿõ¥%´„–\únæ*Ãöa c|œp$Š•‡à?Øïh7u¨Cý(­¥µ´6¶›©bª˜ªAÓIÓIÓIB¨¨XT,*f:Øt6Moj® ® ®ZÛÓÝÓÝÓMþOð<Oú•ïÖhú=ÿÁ^Ñ®c»°E&2‘Éý“¤‘4’ö`ZGëhÝ_¶Ëüeþ2¦ƒ`ØGþÂÇÂÇÂÇ»†ï§ÞO½Ÿ Ì"Èá¯â÷Jýªý?dÛôsÂf]IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-31.1.png 644 233 144 3010 14774263776 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–_LTwÇÏÌ0ÈD„¢VdÓ±I­ÉCBJ†8t—–mI㚘iµûhI\+Ò‡š´éÒ>PMͺ¦e#Ö€áÏP»dm#Ò¤V‰©‚K£)–R¥Ì0ã pÿ}öaæÎ½»¾ì£çåæœóý}ÏùÝóûó‘'Ò_§×éuæ¥tç>ËžóJÎ+›O§ô8v9vÝxò?Íÿ  £ C¿ié¦ßÄÛ׋Xüöx¦]ž˰ªgU£2­¿¯¿^œódJo»ž>O_R…ýûz;{;ù3üüÍÏßD+£•`é¦ßÄ›ëM>;¿¼ÿ?ñEÀ}Î}ÎqVe¯Ê§«ž®zæ­ ò vvÜuÝuNÐî¹ä•@‚¦ÌÙtÓŸÆ›ëM>“ߌgÆOå#°þÅõ/Šð×êXuÌÓžZpóŸ4l: Æ%¥>ã3rA½¯ÞеF–ù½ŽÐeœ6NãÆ8 i»µÝ,£ªQ5 ÀIN’‹?Íw¦i´iÔLðæ)ºkœ5NO»™üwm?~™ßK‚%`ü@~â'0 µIm…žã9 ãïÆã ãÆ ã–$ˆ@AÉX £ET'QŒ)íŽvÇ4+£$ƒzP7üøe[)ED~û ÿòtyºYñF¼ |Àïÿa¶s¶“EµU ©!‘äBr!¹Êmå¶rÛæ¸Æ5®ßr‘‹6|,ñjâU•©?D<0æ {‰,31""'Fà€v@ƒØaæ™×K^ð?¿íùmPðNÁñ‚ãÁãÁ#Á#°]Š.EaaÆ… àŸðOø' |0|0|ÐJ@/Ô õB0*Œ £¢G¢F?„ò#åÝåÝáÆPm¨6ƒ.Ñ_ØwaßóϵJDd¬ ¾Œ‡NgèûÐ÷F]y^Ù@ÙËÑÂh^4¼[¼[¼[àüÙógÏŸ…ªuUëªÖYa¸z¸z¸ÚöÇf˜a’óÉùä ÷uÞ×F“8bŽÛ¤oÍKk^¹¡ýpà‡òëõÅëE׋DB?†¦CÓ"EÁ¢`QPd¨m¨m¨M2â¬qÖ8kDd«l•­–ݵõõCıڱڱZÄuÙuÙuY$ë­¬CY‡D¤Ò±ß±?ÿUrÜÃîaWÀ`›Óè×jµZÇ„ˆû ÷"Ww\¹:#ë÷Æö^Ù{EäÒ•Kß]úN$Z­Ö‹äOçOçO[ (›”MÊ&ܸq[ö£G;ŽvˆÄGâ#ñ˾rnepePD›V¿R¿Ê˜×˸ºYÝ,"¢ꃎ ¡-}Æþùy÷çÝ™Û]÷—œ÷zÞëaÙ·Îçñy =Ün?z+›½ÍÞf/ŒùÇüc~Xj\j\j„@q 8P ³¾Y߬φ/o.i.owŽÎÎ[gL_êú¥ëûü• u u@8uK0´CÚ!«ñoÆŽqŒc¶Ì444þY6Ó Pjfbè%Ðp¸á°íV2™îcx&=“‰,þ6åŸòƒÖ’ê3ZëÊàÊ ‹z‘^­Wç`ÀÖöè{ô=@6Ùd·¸Å-Ðjµ‡ÀQ>â#þOʰ2Ì¢3ûØTéT)ôD<[{¤óóZÎk9©=2Ê’vA» ×êµ™^n**ð =Õ´©µÀsšW ×éu($Ó|JšßŒ÷hçOÏJjv×ì¶ÍJÞ~êí§Ì}*}@+­äZ%ÐÞÐÞ`Œ‹Fª³;p€¥›þLÉÒëM>“ߌgÆÏÌÊÇöuñؾÇÏìá£zjÒÑ1IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-40-grey.png 644 233 144 6162 14774263775 16012 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü 'IDATXÃ…—P•UÇ¿çýq¦üÚá‡1wÀ«FŽ nè%Ì+YŠŒ"¡Iü¶éæH£]4SV£Á#lR±Õ@½°\HÝ j!ˆ †‚轂ËýñÞ÷ìÞfÜizþyç}Ï9Ïó™ç|Ïsž—èõz½^o<4ëÃÇÝânq·hþ”þ”þ ÌÍÍ}v1õ¡>Ôçð!H‚¢6; ƒÃ@á$Nâ$ÉZhô =6c36ÓCò$y’<‰äpw¹»ÜÝÖ“ÄB,IJ§47 7 7 áF~z~z~:„0!Œ$>ä›<\ÞÌ à ¬À ¦BÌóÄ<±É9åœrNùGçÕäÕäÕT 8Gœ#ΑúÿÚ–Ú–Ú–F½§.R©‹Pµ&jMÔ’³Œ_Æ/ãhßhßh_@z—Æ¥ùÒzÉߌO<)¾Ä#ñqž >MçÒ¹t®˜F6‘MdSXƆ±a—?Ÿ:3ufêL¨¯_½_½_½{ךž5=kzWdgdgd'y^ž#Ï‘çÀ†÷ñ>Þ‡ 6Ø`ð&ÞÄ›æaæÁæv;‚ñ|gcgcg#u}£ýFûVÜõ`탵Ö¾þ±*L¦ [©pororoJ(¢™4“fÞJ# `ž&ûìûìûìшÆà9œ3p†Æ9§ÓÎéÐušÕšÕšÕŠ”·SÞNy›«ðžðžðž€!AÑ D8PPP€¤‘4’À ,pÀq2NÆ!@„œuŽuŽuú+‹+‹+‹…´þoû¿íÿ–ûA¦”)eÊ_ŒB’$$­JÅ*¬ÂªÁ_e‹²EÙð| xð?6£Íh3†®Ó¤hR4)Âó™é™é™éÜÞœ7çÍá¢E´ˆ€£Çè1pL>“ÏäÌSÌSÌSé"]¤ Ù$›d¨A j ®£ëè:À+Õ+Õ+ükÖkÖkÖ ÏKñ%‰&…Ia21ÚyÉyÉy)ý)¿¿¿žr6ålÊYNÒÈÕQÕa.ó3ó3ó3@lÄFl€«ßÕïêÜÄMܳ–€$´œ–ÓrÀ~Ç~Ç~ *ª¢*YÈBæJþSŒ)Æ#Wá—ì—ì—LÃ%‰¡Zª¥Ú¿½äÒ¹t.ßß߆5ÞåÞåÞå‰-b‹Ø‚¹dŒŒ‘1«±«_¿þõë_¿ õ…úB=Ð:Ô:Ô:4Ë)$ ÉB2P¹ªrUå*à€ÿÿþÀÑö£íGÛ¾wûÞí{wfú\ïÞ'¼O@ßßß5ÄÇáB¸»Õç¾Ï}Ÿû8ô¤îIÝ“:Râq cÎ1ç˜sÝF·Ñm³ Æ,c–1 ¸ýàöƒÛz•^¥WgǯF^¼ t¢¶~ºõÓ­Ÿ?ŸÆ¨¬¬¼ƒwð3Ëd‘e‘e‘e¤Dâ‘ø8‡Ùav˜ñÏʼn‹'"GÙ¬lV6ÃFwÑ]tT¸‡{¸R@ €ó~Ìû1è é é üüüZI+i%€4¤! ¸Ùt³éf¥ŒRF)Cˆ!Äx›½ÍÞf -©-©- 0˜LÀxOœ*H¤ ‚m~Áü‚ùÈi3·™ÛÌ8ÌàC|ˆ‰VÊœÇäô,=KÏä49MN£>£>£>@ƒ£ÁÑà’«“«“«>OãÓò=ùž|?›ÑÑÑÑÑÑQ`^ì¼Øy±³ßùüN~'ÀV³Õl5`›²MÙ¦ð¨É™7˜7˜7|†ÏðÑ2lÄÑó111èb„!,SÄ1E Òʋ֋֋V@»]»]»о¤}Iûà¼î¼î¼¸ö»ö»öž¿ßÆoÜ'Ü'Ü'f È"²ˆ,¨…Z¨À~ìÇþ™a);Õ6Õ6Õ†>FÃh =Ï) Š¡°/ / /€ûg»»»?ɉÞ½!z¦Ç·ŒoßÕÝŒ»w3€±;cwÆî={.ö\X#kd€±ÕØjlè[ô-úð¸öqíãZ`°l°l°lÔqËqËq `‡ÙavPÛÔ6µmfxÚtÜtÜt*ÓiÈ4„¿+ú}Š>¡A R’{’ÓszNOrªªªÜëwÖï¬ßAåë닉ÍÑ›£7G\—Á¯Ö¿Zÿj= l6 •kW®]¹ˆ»w9î2ZZZ ´´´ÃÃÃ@íµÔ~ð|Ÿ„O…O…OÁ!†‰abTµ¨E-ÄÄDLÄ„O‰›¸‰ûsx%ðJà•öÊâeñ²ø3ƒææælekeke«{'¶` ¶`npupup5!±!±!±@hshsh30çüœósΙ™™”PB ÄŠ;w ˆŠ‰Š‰ŠJÊKÊKÊûKï/½¿Hý%õ—Ô_@eËeËeË!¿Pz¡ôB©hÒ é†t̲OdŸÈ>ù9Õ5àp ìr‘}·÷ÝÞwÀ5\õÇñ£ü(?Ú¤œ¼4yiòRhfB`B`B }&±,±,±Œ\Ì‚Y0ƒr\—bßnßn߰רkì5€ßÍïæwxïàqûqûqûq€ecÙX€‘‘¶]‡®C‡ g~:óÓ™Ÿðoe¯²WÙk_KYÊR6jb!vmc˜“ÌIæ$ÛÂaŽ0G†þ"öнbï&§ªYÕ¬jýýýéïu¾×ù¾ä|9_ÎÓô.½KïŠ/(^ø>‡Ï †jˆ@@§é4mŠ6EÛ àÄ„}Â>a‡ªÖPk¨5¾‹ïâ»2A&ÈÄ^‘,'ËÉò®m(D! ¹`O›ç^ö°oäþFŠH)º²ƒ‰gâ™ø]d"™Ì?jH ©!B–õ€õ€õTä:¹N®c‚¥GéQMhBÓì¡ÁìÁ€tÒÐ(E£àn"ãAãAãA÷N‹Þ¢·è¹cr\#×|™¿àЂC }|¹ÈE.ùzÑ‹^!AêGÕÀ„ÈF6²‰añ…Å_(ü“b«b«bë—ù‹Å‡³VúUúUú¹wJ=št 0iLxØŸ¾L_¦/ƒ’<’Gò o65›šMô™kõ×ê¯Õ³…jµ¿ÚÐî¬pV8+vt#÷Fî\€š¨‰šàå‰ó…*ˆsâcâcâcðjnnœÙÎlgöîÔ>jµÏ­s=5=5=5laÝ+u¯Ô½BŸ!;Ȳrñ´xZ< *&:NÇé8@"Óc¦1Ó˜ _Ö/©_R¿^êõˆzcÄ1f÷G¥7h÷Hñ˜§¬&JÀL¿ãù%‘KåÎSw QzÔ»w’dYñÌŸþr\¾èÊre¹²Ä?¿.¾.¾.2q‘G"DA’Ø-v‹ÝP1 ™…ÌB8„!Gȼ8¢8¢8½`dùÈò‘åìMÅÅΥͮıD,áŽyvö/ÒŽåçççççcBÊ(<f4äÑîNvy´{éÿ´ëªqÕ¸„,k©µÔZ Ã0 Ã`\ÊDÃtÃtôh,,,ao*ö*ö*öÞ¨u 9†C{?¾ùÜÍçn>x5žu* Pâ›}Xš ò8øÎ£Ý‹ÿ§Ý K%ˆ³~¥ÿJÿ•Þ½ ° àÕéÛéÛé‹òÆ–Æ–Æ’¦êVu«ºQ#jDÍŸ›¸×¸×¸×¦ÿ¾,|Yø2Æì‰÷‚tC=ÊÅâ7L§Óét:ž×N*£2*#ÛG,Y„2wˆ;Äò_A.—‡¿ü{ ÷î%ø^°vY»¬]ôhûí_´á~zÒ5éšt±Ù|ÇÇý5˜–ÒRZz¶rÈ!gûa†fqž´žD òüŽý†vóP‡:Ô¹s©¨A×ËT1ULÕÕpûzûzûzq_—ð%L›Éf²™ß|QQQõ¬ÎÔkê5õ’¯EÑ_ô§Ÿ{üÖxm¿ÅÁàwìízÊ…;;°;¸V’NÒIú"h­£u{ÞTÎWÎWÎgºØv€š/‹‡³†»S»S»S‡€÷ø“Ëéßãøûæ.­‰o$IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-129.png 644 233 144 3020 14774263775 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÅIDATHÇÍ–_LÔWÇÏ€f¡#6>”®I'Ù´’ &$ŠÊ`I3"l› AÌÆt£%éÖ‡ ccøe“>4[» h\X#‰¶Ø 6t‘Pé”4M±© Xº‰L‚°SA1ÃïÏýìÃÌo~“uûî}ùåœsï÷ûýÝ{ιW@DDžR^Jy)%3f§µýéo¦¿ééŽÙí8Þv¼ý¯&ÈjËjpwº;Í)Û¶âÖüäõ"6~2Ÿå—çÅv¤]M»êðÆí8øÚÁ×Ò_ˆÙ½ Î>gßšÇ>?ö9Àg—>»ÄŸ`þ›ùo–¼K^°m+nÍ·Ö[xÉøÒò?ü"°q`ã€cÒžK{N¶•o+ùxl¿_†ªŠª €ÙÔÙT•ÆàÂ¥¼À*«Xc1ɶâñùÖz Ï·ø,þ˜-¥[JEà­š·jœ±S]èþý/Z|ZE¼Ç{¸¸¤¡`œ4N圪VÕ ÆÌ1s hR%ªÀh4‰ò7½Uou‡wx×âxÄñõ8_‚?¦Ç>JSDäã7 Zª%!( >ÐOê'AÝ5~0~@‹nRIU  TAbÇPýª_õƒ9g>0€ú½ªSu(àC>DS©FÈ1|¨vW»5‹_’“í•sà 9C«`úñôcà[öúN}GdíQdSdhµv­Ý¢m×¶kÛa!w!w!´b­X+¶ãë_¿°~ÿ¹øýâ÷`þ¬èDâá}ÌL5ý€3ì ¯n°ôÄ…µòŸºcuÇ,83_•hùZ>,Yê]êEž-ü¨ð#¼2xeðŠMìñøF ÓŸéÏôCéTéTéÜï½ß{¿öoÝ¿uÿVp¶8œ Ps¢ælÍY?ëãú¸ÍGË»ê]eå^ûh\Øx=¹=9=9‰ùãZxå“•Oˆîþ`÷û»ß·kw¼l¼l¼ ®_»~íú5ð¬zV=vòSy¼òxåqȽ‘{#÷T©¦OG§£€rÎ9çžêcV£ýø ¨N¯N·;?#<6˜Ð0â;¨!<$LXb‰¥$[cµ¤šµf-__'ã[|Ouþ_¹+ñçø}Më‹_).ûˆÃÆa¢ n«Û8p€m[ñDJÄ×[xþ¯Þ•Ïìëâ™}=›/Øÿ( /}\iIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-5.2.png 644 233 144 2701 14774263775 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜvIDATHÇÍ–_hTwÇÏ›ffóÏÐBš!ÚQ§*ƒ)õ)İ•U“t“Vc^J©ä¡XCTXmDãÃR–Š`6E·0¦ÆþÄY£˜¶,R³#q(-&ŽÉ$™ÉšL¼sïïÓ‡¹wfR·ïþ^†ó;ç|¿ß{ÎüÎï' ""Ë­_‡Çáq§mLJÙ}çÛηÿøÏ´ý™Ú;Ú;÷ÿ %Ÿ–| PÚ_Úo†²¶í·ãsóE²ø¹|ö¾,—ìFþ¥üKZ½eƒ÷6¼·Á¹"mŸ¾®€+ð4{¯ì½pyàòAd$2«ÕCÖ¶ýv¼oãåâ˱ßð‹@Þ×y_k?CþËù/‹@eCeÃkûÒá× q{ãv€ñeãË”Œ(PH¡ªæ˜Ã^Ó9¶í·âí|ÏÆ·ùlþ´÷÷hÞݼÛu%"º¯v¾ Ìè¥ÓI'…ê±>«Ï‚Ц¶¤¶°È÷ê”:€'€úQýü=5™šdQ}§‡õ0ð ‡8DaZ¨ eácóYü–YÚÛ¾· µ µÀ.€~‡¤¹Æ\¤páB· H‘’$I’]N| “×'¿šü ¢]Ñ®hFQÀsKoÓÛô6ˆ¾­ŠV~LÿRÿ@íSû˜ç_i|3Æ Èð[z,aŸÝ†Ž#G@-˜>› þC|">ªü©2TïQïQïQØèÛèÛèƒÑ£+FWdÅWÆWÆWÂÿÿ?”.9\rjOמ¨=3gægæQ™RÞ´ùÒü¶Gºno‰Ô¨; "ÇDD´MVAŸ%܉X"&šã[GÐi/o/o/<;xvð¬ˆ÷¸÷¸÷¸dÖPÓPÓP“Hxxx¿H¼7Þï1ž1#&ráñ…á Ã¢ÙøêÍgñÛz øfñMu "5‘0_YÚ’‡ntÝè‚Õ½«{W÷Bm¬6VƒªsUçªÎA˜0áœøˆ'â‰x`<9žOÂõîëÝ×»¡º¦º¦º†O Odãͽ™ÌšH ØzJ‹J‹ÌÿÀôÄô¨Ë™cÀØž±=c{àvèvèv( Xç®s×¹¡ï~ßý¾ûÏÿǺºº`SϦžM=0âq¸³~õ³Ö¬žÚ|i~[Ïs3¢K ëkkaUlUlU Î7œo8ßÞo‡·ËËËÀ¿à_ð/À@Á@Á@ÈVÙ*[áŒçŒçŒ.^½xõâUx°ûÁ®»ržøÝЉˆÜ=_Ä¿ˆÿP0aô½,Úi'‡N‚Íy›ó6ç¿È_ä/‚™©™©™)h¿Û~·ý.ô7÷7÷7ÃNÇNÇNl{´íѶGà+ó•ùÊàÚ©kÝ׺3ºÍ5ŸÍoéyîTZ÷Aj.5Ücši& ,ä”2H ÐH#¹s=3í–®Åìg¢2ø¾¥§RËÌ qE\‘Ô½Ò{¥E)É«vV;e»T¡*”Aó¿ ÊdT>—ÏE´_´'ÚG…£ÂQ!¢B*¤B"Z±V¬‹¨Õ¢ZDÄ'ëdˆ\“)™q¼!Ò! Zý²ñeãò®<}—o¤Ð—ô%ÿ—'’,O–¿yæÿM~g«3óùwÀ¸cÜ”ù¾ù>º5å•U010€ À¢uÌ2É$³âgÍ&³ gFÐæâ·æ·æÛ•Z2ùsWfî®ÎŠÎŠ @衇Âl Œv£EP·Ô-44ÈÚ¶?Ó2+߯³ñ÷®|a_/ì{ìÅ|Áþ ø÷¶ìvDIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-124.png 644 233 144 2773 14774263775 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܰIDATHÇÍ–mL”WÇÏ -L)ÇÒÔ. n–Š•”¨$JŠàZˆSmjbâFCÒ•M Xùàk“¦‹+¦&$]mL6;6ES4$"ÔM$±@$­»ÄšP¦ÃÀàð¼Ü_?ÌÜyÆ}ùîóå™sÏ9ÿÿνç½.¯‰³Ñ™ÑéªLØ'`Çšk2=qû¯àö»ýó&컼ï2À¥ —.ð'ÞÞU†*Á±µ_Çë|—Š/'þƒ_^¹öÊ5׿!ãÕŒWE  º º°)ðc!l«ÛVðó’Ÿ—¨4°¦l²U%!‚~ž¦ØÚŸˆ×ùOãk>Í×#°ì½eï‰@ýGõ¹ÏÇÆþŽÙòfË›šÏð³Oø„l.˜ß™ßX­V+1Î(¯ò‚ºcß±ïÇUe\ŽÕd53d†€“|Ád+GËë-¯¦æ«÷Ö{Ýçµg+m‘SUà¯$ ªOÍV³Ô}kØÆH8y,a ¨2U¦Ê’CUGÔPÿRA L¥vÛvpšÓ€Ç¯ÇëÑW Ç?tòëêëjêj’á1û\œa_¿¯_ jXÚ¿´_u2, c iûíwíwÁzÃÊ·ò¡¬²¬²¬®6\m¸Ú±'±'±'0qkâÖÄ-¸Ñ~£ýF;¬º¿êþªûг§gOÏØîÙîÙî‘‘غfë;[ßqþˆõCâdz`A°´¼œ¼{ž>~ú茷½Rö”=å”—”—”—€ßç÷ù}Îzs´9Ú…’»%wKîÂØñ±ãcÇáìÄÙ‰³àzäzäzëëëù<óyæs¸â½\q¹Â3ö_¦š¦š@ëI±{ìר`n3·‰ˆ!""Ë\¿•EY”ä³pxáðÂa‘ì¾ì¾ì>‘Á½ƒ{÷Š´gµgµg‰ìØ=°{@ddadadAÄãóø<>ÿAÿAÿA‘Âå…Ë —‹xê=x>)úMQ¨(”„_抚Uf•ˆ£GŸ1|a_LìùÌ_Ì_ˆ%+Ó×Ü×Ü#›G6l†€$ P½¡zCõ¨Í«Í«ÍƒÒüÒüÒ|è ôz)Í9Ó;Ó;GsަMO9cç|1ß”oê…3–èJ4qº̈éjÄ™ÿã™e–Ù”yvOÝS÷À¼iÞ4o‚};d_ÎÒM7Jm7jŒš¾…ÆæÆæÿêÊ·Ï€;èFÒQãÆ¸ØzŽÙ-v Q{‡}Â>üž @-ªEµÖ1ë˜u ¬ÖëX'­“ÖIP=ªGõ¤íT£jìCƨ1š2ÇžÏÏ*ÁÿâÓƒöTx3½™Éñ9Ö 5ÌÙÚbÄ'6 ƒ(Q`†g<B„¥Ø‹Ì3ŸRñE{—½ ƒ9«×êMÅ÷fx3t¥^˜üÿç[IËŠ–ä\3üÀç|N¶³ÅÖ.k1Pj.plíO‰D¾ÆÓøšOó'¿•/íí⥽½œ7Ø_€pNÝ»ùÊIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-5.9.png 644 233 144 2652 14774263775 14773 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü_IDATHÇÍ–[lTU†W‡N/ôbGÚAÓ€"‰PñxhZ "±¤­¡4½< DcD,F¬F!&ö…4blk¢6ÅHÃE’‰Ê¥Ä&ÆK*m2hÚ”N†)­ söÙŸ3{fñ™õr².ûÿÿ}9ko)ˆ\OºžtåÇ|×kÉxÖ‹Y/>õuÌ?¬ íå´—ûk¬ÀÓéét†“¾É›úÔñ"IüT>—I2¿Éü&muÜÿêž­{6«(æz²{³{ÿ¶áõã¯8öű/x Æ.]¸½úöjHú&oêÍxƒ—Š/ßÇ/îïÜߥý ™™"PüBñ ‹ÞŽAUeU%ÀÍY7gi¨ —\½˜b cÁßäãõf¼Á3ø†ÏðÇô––‹@M}M}vZDdøKð.ð.BV¯¶ðâ%Wÿe…¬è »Ü.g†ô}€,²ô Úí[ö-fô¯VÀ ßÒB ¹1¡V/*Žá‹óÇõÈ¿÷¶­jsjsÌXýÜsžvžl²ÉÆŠ'4`c"DHšÐëtžˆj=Ë>nÇ¢J¹•;?Zëªum)[)"²ø deM¥òßòßJ¾¤mÕ ¸{gíæ;Í0þýø©ñS0±kb×Ä.P9*Gåð€E¯E¯E¯Aðûà©à)p~×níp~t~ä.ÄðÁ¯ü üq=qa‡/½ñè§ÄLLŽNŽ¢‹¯Ã’ÝKv/Ù KK––,-+ùWò¯ä'…χχÏÃzY/ëfŸ™}fö¨ßU¿½~;ð;"hPÏ«ç÷ _Œßè‰ ûitOvO‚~@o‰óÌ\¿z}ðú ,l_ؾ°Z´i=þÿ€ô>½OïK ;Ô{¨÷P/¬jZÕ´ª)_^^†žOz>èù žQ' _Œßèq‰ä÷å÷=·B¤|mùZ>IëˆïtfàóÀW¯DÒ§Ó§Ó§E|u¾:_Hå`å`å H 4P(•„Íß1Çü"ããã"ÝÞno·Wd$2‰ˆ„B¯†^M”gJ›á‹ñ'ô€'Ï“ç Ap48 úXâ·Àßèoô7ÂÅá‹Ã‡“+PVXVXVmÍmÍmÍÉø´oÚ7íƒ={:öt@Æ 7ÀÓïé÷ôC×Ê®•]+“õj½á‹ñ=.ç¤s2mHÄ®¶«Etlö…fJC¿ ý<ô³Èæy›çmž'Ò¹®s]ç:‘àÆàÆàF‘â–â–⑞ŒžŒž ‘sSç¦ÎM‰ø¶ù¶ù¶‰¬©^S½¦ZdNhNhNH¤ô™ÒÅ¥‹“+슾BÏýgŒ®øžª½j/3ffûOì?±ÿ¬p¯p¯pÃѼ£yGó Ün 7BÕÕª«UW!T* ÁÁšƒ5k`yÅòŠåpzÓéM§7%WJwØev3Œý÷{ௌ™Sö”=üJ ç¾~u–³œ6° )ñ>úèFa$%ÞÉa%TR‰5WÍîýï_™ÒÇ,ÿ=ÿ½d㘓ãäpW}®Ô¨wÔ›êMpjœ§ØÉNv‚Sä9EÀV¶²TTEUÔ3j‘ZŽ×érºœww¹‹Ç×~Ëo=´ý«ógÕf¥tfT¿ê´óŠó Vl†hÀÂ4 L2É$ qpM”(ăg‹³ Ô%u)ßð=Ðùï»+w—÷ ï €^ •Vr[ŒjRMÌ€¾ /F$}“7õf¼Á3ø½+Ù×Å#û{4_°ÿ„í¿¤éIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-6.7.png 644 233 144 2637 14774263776 14776 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜTIDATHÇÍ–H•gÇϽMÓЛý’æt7ÿ9 ¡5™ ·Ñfö )º±Ü”¨ØØ$*&d …«d‹C’¢NŒ‚QÚ %-e"´Àvݼq½Ý]½ïû¼Ÿýñ¾Ï½·\ÿ÷üs9ç9çûý>Ï9÷¼€ˆˆd¹¿Þ7¼ox}Žíý"áOû$í“üÓŽ}ÌÏ:Ϻ߾ƒÙ­³[朜sR &l½¯ã“óEøÉ|Ú/Y’pÌÍïè˜_:¿TÖV¯­Nos;0ëÕ/Ò|Æ%ΰ›ÝdØ¿ÃÆ0pÐ6‡™ûWûWf3è°kíZ°7ß1ßaÊŽO§`RO=Ô»x¸ø†ËçwôÈóµ=T†Y9£rF\P/{¬"«ÔOæfs3†»aÛ{­½ðáÃGbM2É$/.8À  €‚$|*T.Ð7x¨,©”""oÿéÁô`ô5¦†&†&€?øÔiuš s‘ù±ù1Œ}3¶}l;…F¡Q8MÏV=[õlŒuŽuŽuB¨5t(tÂdzƳà߃±`,È„þ)w‡z‡z!Îïêñ:ò¾zW$p,p,Ó”3þYþYö»²Êʳò䲈w£w£¤×ܨ9\sX$/–gæ™"eåeåeå"¡êPu¨ZâëZæµÌk™"þ³þ³þ³"%—DJ""¯ÿ¼°ya³HÛíV»%énøeõȿ¿ÂNðk=ŽÂ{ß™șXÎÍouO4uõû«W!çJΕœ+p¿ï~ßý>¨m®m®m†Þ½;{w&n,ö$ö$öb×c×c×áVÕ­ª[U›Ÿ›Ÿ›#m#­#­ñð){æsøµß ß û<——‚õáó¥é¸Ûq§ã¤ìJÙ•² W-®Z\åûÊ÷•ïƒhv4;š «À*° ùв£eGËŽ„ß ›Ýfw2“ïõÌÉœ“© ô8ô¬÷ã{Ž×¯9^ÅG‹MÀ,/]^º¼Žôé9Ò3½×î=¼÷ðÞCÈß–¿-Œ777%d)CÀ¿šÏá×z¼"ªKuyDÌ5æÏa™¯{fÙ[ËüËü"£¾QߨO¤-Òi‹ˆŒªQ5ªDæ5Îkœ×(r¢áDɆD¯k>×|®Y¤hIÑ’¢%"Y{³öfíQíê¤:)"yn{n‹Hšæsøãz^ì195·¿6çšs™Òíúé§òÈ9´;×ló©ù4.·(Îïê™>ÇÔ1d¸#Ñ™cuªŽ åSï©÷Àú XPªBU[ØÂP©*U¥}ôѪ_õ«~°·ØÕvu’ИZ¯Ö'Í1†¬!kú›>ù©L«LKžÌVÕ >WŸc¸Íj»w6 DˆÑ·üC˜0¸Å²AÕ¨ŒžÆ×|Ó&ÿK¾•ÔçÔçÄ.M4‘fÔŒX›¬ML}Ó¾ €$l½¯ãu¾ÆÓø/ýV¾²¯‹Wö=öj¾`ÿç, [ÐzxIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.png 644 233 144 2463 14774263775 14706 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜèIDATHÇÍ–KLTWÇÏ Ê Êkt¡h|Tëbbƒ¸1¾ˆ¥Fu4>¢1X£IS,"Æ¢6’&à¦jDLÆhI1Ñ€8¡š˜4:<SK\ÁÐ.ºÀL $ `G†¹÷œ_÷Þ¹ckKºólf¾×ÿÿ¿ç~ç»G€BˆLóW@J^J^ÊLÃNùÒö;797-þѰuplwlï«YWg]Ⱥ•uKöÛ¶·ò“ë…°ñ“ù,¿È¶#í^Ú=G¡i_„]ž]§Û°‚Þ–Þö§‡Û·´Þn½ÍWî ÷ŒŽ‚m[q+ߪ·ð’ñÅÅ¿ñ Ó;¦w8þ€´i3„€E Š}m$ü¾¶–l-œ68M¥€>¸p©B`œq¬5œd[q3ߪ·ð,|‹Ïâ7ôÈÝ»AðíöíN÷ýÍpbÞ‰y€oiÄÅe­V«õ‹¶T[JŒ[ê :@*¤B@½ÖÂĘŸˆOÐD.ÏÄOðYü†ñþ»½ü9”9ËœÀ;€x7èïôwÀ,½R¯$®¾PÇÔ1”µEÊ­rU.°…-lIìêÚ¯öÛ&º< ½Kï²Üñî_‚_$ úô{H§‡ÇSa@ЀÅ<•y2hê»ø…øÚ8´qh#hgµ³ÚY[tÒ ±ŠXE¬F??:?)Þ#ËÅD‘&~‚Ïâ7ô˜Â;áȹ#ç¬jù™Œ÷Çûí'Žüyyëó×ç¯Ï‡¬†¬†¬( ”JíŒvF;mþÓU§«NWAÑXÑXјí—ßJ¿ô£øMëÕzm>›ßÐc ë­‚–Ñ–Ñ„Žrý›ÉìÉlb–çNêÔ;©°:guÎꉎDG¢0Ç3Ç3Ç/‹_¿,†çÕÏ«ŸWÛ Râ+ñ•ø’„ý oÈÀ¯z…^aá«r›ßÐ#`æÓ™OÕ=¯ ¯LÚò1õX=¶¾ß;ãþqÿ¸ÖžY{fí˜}röÉÙ'aàÙÀ³gàÍôfz3aÏò=Ë÷,¯Çëñzìz½_é!`XT ‰/Áoè•‘•!C0üzøµ}ìÕ}y]^·ËúVô­è[ÝWº¯t_áúáúázX\\„ü…ù ó‚»ÃÝáî€_¯ÀÎ ç„s–=,{X–´sçô£úÑä1cñzR„p„„жiÛ„µrUHµ«ö„-^œqþÅy!öFöFöF„è)è)è)b08 ±cÝŽu;Ö Ñìoö7û…XòjÉ«%¯„pûÜ>·OˆeÙ˲—eÛxޏ#äÙ|6¿©çßzŒ»úf}31~â>÷í'½äºäºä‚U9«rVå€?âø#@ -´ØyOjžÔ<©ÚŒÚŒÚŒ¤j–M² ˆé7õ›ÿÙc>• köDW<â…Bš1,ÍŠ¨ŒÊ(h½Æi“í²]¶׸Æ5P¥Ê«¼IxQíöfÊSù96iÍY-«‰ÒH] ŸÒëÇA¯Óëô:så\9h¥•V[¨ Í-OÉJY™Ôãr§ÜIÔÑSͱL~Àœü椖岜¸ ¨˜`Œ1ó¿âŸk’·¼Þš9ÈCòÐÿšüS|+ €6 Ž:\ö+Ö÷éûˆ ª `ÛV<Ñf½…7å·ò£½]|´÷±óû®e¼¬$û.IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-5.8.png 644 233 144 2625 14774263775 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜJIDATHÇÍ–mHTYǧ55ÇÌšÈÞVtFФV ꓽ°½‘‘J"•A¹e!ËV°ƒloRm_6i“lÝ`wƒ’,+"–"´deiÛEQÜe)]ɳQ6gš{ïù퇙33Õö½óåÞçåüÿÿ{ŸsžsDDdRä)`›m›m›¶m;cþä5Ékœ?…ís&$”$”t}éuéuVOÌÖq?_$†ϧý2Ibޤ+IWVDìcP6¿l~òÔ°ýu+¤4§4ÿk@åõÊëW/^½Èç0Ð>Ð0¼bxÄl×ùz¾Æ‹Ç—coñ‹@â­Ä[ CÒø¤ñ"µ*kUÎá„ÞØP¸¡ o\ß8eÓ Ø±«À(£èዳu<’¯çk<¯ù4X€c¹c¹o*Þ”òJD¤çpÏtÏ^„šU7nìêŸÐ‹Ð P^c¹±œ ¿¨SêÉ$¨NÕ |kø Aõk¨7Ô \à°‡…†š1"øh¾D¼YÛÓ+¡4µ4Uÿ€ÐCÖk`B ¡H@ @€Ø˜Á f€š­ÒUzÔ«Ô£Õh%DžñÌx‡,•RÑO¯Œ+¥ˆÈÜo e e`ô#^x=ƒQÀuÊ07››y5òéÈž‘=ðüçç7Ÿßoµ·Ú[ fª™j¦òÎxÝúºõu+ n\3¸ŒùÆ&c€ªT•¼âA<¦Ç„(DODع6Ø}h÷!PA+_ø;üýþ~TÖ_Y=Y=0ïð¼ÃóÂüù ò¡+ÐèŠûcC·‡n݆õ£ëG×B¦3Ó™é„â¹ÅÙÅÙ0¶sìÈØ(§r¹š/̯õD„ýö%\ò_òƒ: >‹ðŸþù´ói'd×e×e×AM}M}M=x:<žÀGLXËä–É-“ÁuÍuÍu :·vníÜ Î³Î³Î³pç“;¹wr£éA+Eó…ùµ‰÷'ÞWW``ÑÀ"°¦¼Y’»îVß­†ÜÚÜÚÜZ(..×y×y×yèmèmèmˆåö ö öAÞÚ¼µyk!ýhúÑô£°°daÉÂðÚ½©Þ¸Ò«õ[˜_ëÈHËH³ºÁ×ïëu5ºíðlñlñl¶ž¶ž¶žà2Ç2Ç2œ¬:Yu²*æ?ã:ã:ã‚¥;–îXº#æÏ¯È¯È¯€ºìºìºì˜ßܨùÂüZMĺaÝHè1ŠŒ"U ""ŽÈÞîß»w?Ù–¹-s[¦HãêÆÕ«E|}}ErºrºrºDšjšjšjD&ŒL™0"Ò¿«Wÿ.‘&Õ¤š”ˆï‘ï‘ï‘È´õÓ §JlÔ|aþ¨ž·×ßGjÞoÖšµõ—h9Ñr¢–$.I\’—Ó.§]Nƒ—e/Ë^–AÑÔ¢©ESaÈ6d²Aýþúýõûa±}±}±¬«ÁŠ[#Í}æ>‚Üyï{sW†‡•ƨ1 ü ‹1Æâ€ïq{@!…ÆùsœãÀžð$ÎïÇ‹¸B;í(0F Òß¿+ãúXÈðĶÿ:®Z©V*¯Ì f‡Ùæ>³Ê¬«Ø*¶Š7nÜ`M·¦[ÓrÊ)³#’_mî5÷‚õ±µÎZ\¶’¬$^Eñ Í÷¿}ìΟ\š×™1šem·¶Šty„ ðãÇ(,Â% ǃ:ߪ°*ùÀ|¯ùÞéüo•ѳË=Ë=+ Ð ÔPƒ=ZbÌr³œ ¨VÕ @ ³u\çëùOã¿÷¬ü`oì}ìüÁþé[T ñÀ]µIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-21.3.png 644 233 144 3113 14774263776 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–_P”ׯßE`YeÅUj±f£Ñ8T/:0"XCu B$¡Ã ¦Óh'É£µÅª‰†ˆMÌ$Ô ÓÃj\³DV#‰æÊL£º(ubÕÎ.]è eÿ|ßùõb÷c·µW½òÜì<ïyÏó<ßžsÞ÷ˆˆÈœè¯@„… ³#8áç±xʺ”uY'"ø# Lå¦ò«¿†´#iGl­¶V}0†y#?~½HŒ?^ψË‰ÌæNÓš(Þ/d¿ò½n¼–“–“axùÓ—?°·ÙÛØ ÷.Þ»à[ã[1lÌùÆzƒ/ž_öü—¾$}–ô™é¯`N6'‹ÀãÅgþ2’0œ ¥Ï”>pgÆ*4JªZøñc o6æ£ùÆzƒÏà7ô ýˆô¢ô">,+³´D çumum Î„Nò[>æcR!ì {´×´×P £t¨ê€P@@«Òª@Øöå(©êË(ß±ºÎºNÃààqþX( XZ ?òŸ{ûîÓ·>·NeŸÊ>•‹...Űßåwù]°zÛê­«·ÂÜ![‹­<Œ·Ž·xó½ù ö[‹­Åª3A~?cdÆË¥Âä6¹E¾ßksØ2úÁŽŸóù¼ßï眜÷9""2/ü°¤ZR-sC±å‘|LiLéÓÅGtÐ^Ò^ºõ{pvHhJh2†"±9oÖÏî‰àÏæ3ó2O" Û'¶O´’p¼6doÈŽI ÅzÀÞnoÿw¶ßvà쉳'ø%Œ~5ú€»Ä]‘Øœ7ëÍ~o6¾ìù~x¢ó‰Ní>Ø¢mÑ"öbÚ‹Om8Ÿ‚Š5k¾µ~kUÐqÄ©À‹sŒÏŠÍùp½Ùoâ™ø&ŸÉÒ#¸2q¥T>ª|d?jú˜£µ'jO€ê´ó;Žp„8Ð5]ƒÓÁi|êkãq8¯:T€º¡n>}“¾ ÝA7ðÇ8Fœú2Œw²¶µ¶Õ8ô1Í•¾JŸý¸©Gþ{o¾À’uÅëŠAez>P'=Æêg*M¥¡ÔÓêõÌÌJ¡¬Êª¬ÀÏÙ–HžD5©&Q*U×u0Å({Ùº5ëfVðà ³¶RDdé!.ÛOÚOz£À™îL‡ÀzV?Ìønßwû˜ ”jµ>ŸÓçô9Á•æJs¥ÊVÙ*{– fšiŽ„þÿ„þU1Ú6ÚÆT03„N«Ó ôØ[í­Þ(S¨å""G®Á›ï½ùL~`ä–Ÿ+k)kG¼c©c)ªøWů¿î:w»jŒ£Æ€˜í1Ûc¶Ãæ®Í]›»øÁpopopo€roùxù8$/N.N.FUå”?Yþ$|ÿÓ¼ñþïƒúCHÅx "RÐ!RY_Y/r®áÓµŸ®ÕòÛœ œ Äïñzîxîˆ×÷YÜg"Õ»«wWïÎÎι;çsD®÷_ï¿Þ/Òq£ãFÇ ™W®\îîî¹Rt%éJ’h·¶& &ˆ¿'»¿¨¿HËY³xÍbu<¤Çe‰¿7o¹H^U^•HÙ_ŸÓžÓ´ãŸ÷u»º]b»ø‹D&«&«&«D’R’R’RDææÎÍ›+²°aaÑԬԬÔ,‘{§îºw*"lEÿŠþý"¶£¶£¶£"Å?.Î.Îqô$Œ&ŒŠ-ÿ݌ތ^í¸HAzAºˆå7ñåñåyË-òGë=ë=²d6¢ˆüèó„ Äõ§œÃ/~Ydg`§¾SinnY¾:}uºÈÄ®‰]»"Á@0‰.Š.Š.ŠäÛJÛJÛJE¤,HY"â©ó¼ãyGDÍSϪgEδŸ™f¾¸D­‰Vµ_nÉ-²¢Œ›Áú`½vÛz6v4vT2/ܼä¼ä”Äw§dÈ9XrÐvÐ&2ø“ÁÜÁ\G²#Ù‘,2==-R×W×W×'âs¹ÆD–5-kZÖ$rzúôôéi‘Øk±×b¯‰<|0ø`P¤Mµm†ÈøÀÃÖ‡­"Éç’—$/‘DÙ2í™öˆÈ>U  ´Û¢ÿZDäïµpáÕ ¯Â_n÷ê;¥¶–n|Þ÷¼ß*ß*÷*7äÔçÔçÔCw|w|w4îhÜѸ â ,ø0ØøQãGøÂf³•¯O÷œîZBzÂvqäÔ”Õ”™gÉÈý¢~ð1Æj昭d%+Zh™uüŽqŒc@&™dÎÊïe/{aŒØ=GÏΘ|5o×¼ !=ÂÙ°a±x£Ô—#ù#ù 7„|F¿ã÷ú½Lé úú nª~ÕÆFc£±ô,=KÏ£Ëè2º€&šhÃa8 °™õ¬ýoº®ë ÿÖßæocÊXö±3#é#éöoìßx£øgØÇ~àüþj­Z\ag~¤_Ö/ÆZc-üá?† AÀºf­…xg<\ Œ×Œ×àÓ»ô¿ ôBuLuÌÿuþð]IÕ¦ªM³îJÞZôÖ¢€v`?û‰ƒ 7èÐ_Ñ_ÁªGõ ¡A$6çÍz³ßÄ3ñM>“æ®|l_í{ìñ|Áþ<æ‘6æ8KIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-80.png 644 233 144 2531 14774263775 14703 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mHUwÇ÷šÞ«ÜÊÒœ‰d)ƒ¶´YØ@iZ©˜AdaDÅ´‡1Ö«H™„D›oÔ1§PHµ,W.3Ò&.ƒ8g+)z°ˆŒ›"¥WºÞsÎÿ³÷ž{î¶Â·ýßÜûý=|¿ßsÎÿÿ;G@DD¢¿ö{‚}žÛ¿´âÎMÎM+~öãlÛlÛþ>óëç×,8½à´1la3oÖ‡ö‹Xü¡zf\¢Å 8Z­¶ì®‚©;R‹üøû^ˆl‹lóhPz¥ô ÀåæËÍ|£·FoLdOdƒ…ͼYoö›|¡üRõ}¿~Í6ŽG„$æ$æ$}í/x˜…ù…ùÏÞ‡);è¯.• L2‰¹ÆB°™Ô›ý&ŸÉoê™ú~?±Y±Y"P´³hgä)ÃðY8²ìÈ2@ðµ 4àâGí¤vÔZŠ–‚—FU¢JXÁ à'µKíõ—¶J[…—+ÚYí,õÔãB7ùüA=SßïGþýlk¾€íÎíNà-€¯ôi}øH?¦çT®ÊE™·H}¦ÒU:¨FÕ¨AŪ¼ƒ¨0µZ­FQ¦÷ëýø@©¿|&@/¨/¡†>®…ÈÑÈÑÉ9ð@ yóè4‹˜63½3×g®ƒ;ßïΟÇçñy,#Þ§Þ§Þ§0ž8ž8ž*U¥¨+ÏK#ÇÈa:piy–ž©ï÷0Öð;¨8PavŸ¨ç¾{¾{Ö…OÜœèžè†‚7o ÞÀ’Î%K:¡ÈUä*r7Ê傲¥eKË–‚sÈ9ä‚Ý7vߨ}#ÄXà £¨ÓªµjKÏÒ÷û øο>ÿ:èc¿þçLùL9^3Ò¾¼}yûrXÙ¶²me   @ZnZnZ.î?ܸÖ׬¯Y_£›G7n†äÉ'’O@t„ø3dæÌÌ“_í·ôý~ì"ózæõ|š!’µ1kcàùŠí”]›“8'Qf$ÓžiÏ´‹8*•ŽJ‘ Uª6T‰ÄäÅäÅä‰,¾»øîâ»"®2W™«L$®3®3®S$aa„…"ç>žûx®ÙöR{©Éo;eéûýØE à Y%ÞÞìWߪsêœEt±çbÏÅ‘˜Œ˜Œ˜ ÏÏÏåPå¹tçÒKwD¢žD=‰zbõùb}±¾Xg±³ØYlÅ%ZÒ%ÝÒ³ôý~ì"ÆUãªížˆ¶UÛ,Œ•¤\Ê-ž¸Â¸Â¸B‘g·ŸÝ~v[¤ÕÝênu‹ŒÄÄÄ‹¿(~QüBäQò£äGÉ"•]•]•]"î>wŸ»O$«6«6«Öâ³Ú~±ý¢Ôøyßã7}¯¾/Ÿ“Fšµ7ê†ê†ê† #)#)# š6l:hå[¶´liÙ™™™Ð1Õ1Õ1²¹¢‰ x¨Wèïßcï=•èÚ„6aJ¾ã8ÇûÜç>ÿ[jL©1 …ZBM4Ѥ’BJß[í•öjÖSùŽ9¦™sÆ8dbš¼xAÿU¿ _ý¨~T? F¼oÄÝtÓ ÆZc­±ôuú:}-F³Ñ A{Œ=Lðls쓟àä¿©ß0öûüóPx™b*ð_ºüxžX°ßä›uòÏò®ô´ÕTãmR›ÐKô¼ zU/6l`a3oÖ›ý&߬ïÊöëâƒýû0¿`ÿl2»³iå›hIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-81.png 644 233 144 2410 14774263775 14700 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–mH•gÇ/íE3ÉC5”^ ë€%QEÂ2ÖËÑ($ˆ¨l±¢VDDÚ1[³ˆ¢²UHjEQJ(ÎŒ6rã$V2X¤!ivv²#ÓóÜ÷ýÛ‡sžó<[Ú·î/×Ûÿÿî—ë¾DDdbü+œœÛ/Åq¤Ô¦Ô&ÅíƒPæ/ó§úbö7­à©÷ÔG,Ø~uûU€º³ugùúÚûÚBE¡"pl;nçÛõ6ž_þ‹_ÆÝw#é)¤ŒO/Ó–O[>óËXÂï3!°*°  wLï“ jðâ5EÀCØã¥Ë¶ãñ|»ÞƳñm>›?¦G sYæ2(ÝPºÁs:Vð¨vgíÎ,€h=PM5^~°ŽXGÀübåZ¹ŒpÚl6›H# ÀMXb´N2«ڪà'ð¢l¼8~‚Ïæé‘®í·ŸÂúÔõ©À_Ñ» †Õ0ð‰Ú§ö5Ù¦Øcì)2™f’™,d! Á\05¦L§é0‰™4¼ÑeºŒ(¨6Õf»£w| ~q Êû<}ž¾¡±Ð­ºUp%·´Oû¶£­£M£MÐèôÀò[~ËÏ[#Ž„#aˆþ}}ì ü¦ýÚŸÀ[éðÙü1=qaÕ?ÁŽý;öÛÕºÀôF»¢]·ÚBwBw`õëÕ¯W¿†)ž)ž)(Í/Í/͇ÈùÈùÈy7‡›ÃͰèö¢Û‹nÃÍ]7wÝÜåèÒ>=WÏÅ€5d 9|LO\XÇWp1|1œÐQ®~­­`Äö\›qmƵ0«~Vý¬z€ÜšÜšÜ¨ËªËªË‚âîâîângƒ4•4•4•8ÂÔcÕ¡:Ô9uÎÆ7åLÀ„– -¦ú û ó³>ª:ö`Î`Î`Ìž3{Îì9^™^™^ óòæåÍ˃•/*_T:ù………Ðàkð5ø\ž«^Õ `ÚM»{ñmþ˜Œ´Œ4Ý/Ÿ¿|î{õ™Uh¹„ï9Þs¼–n[ºmé6Ç_à-ðx¡jzÕôªéŽ~çüÎùÐPÖPÖPæ6¨Õ €0î6cóÇôŒÑ×õõ¤.«Ä*‘|y $S¾— ©Ä˜˜˜yf=³žY"WZ®´\i¸7poàžÈäÆÉ“üè«è«è+Õ£zTã—Ny(Ed™¤HŠˆˆøÄ'™q~Ièù¯=F³Ú¢¶0 qÍ\U°*X„‹,^°Nµj;ÕÆ[cOΞœ=9pÍý5÷׸6ÿSÝ¥»>h½ûT¢¬r¶_sˆCÀžðÄ¥ L˜0PK-µ.¿Á8Ý€ç(}ð©|G³X z§ÞÉ01`Õ .«Ë öª½j/èl­³K\â’kf6éMz˜?M¿éwÉÖëôºîcïèü@¼óÇ;µÞª·Müñox“˜›·G„!ˆWÐåºüuþ÷Ü•1€zà0‡ñ:K 6ªŒ€i5­$‘ŽmÇK¯·ñÞ{W~´¯‹ö=öq¾`ÿút|Q jSIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-9-red.png 644 233 144 4107 14774263775 15540 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜüIDATXíWmL”W>ïÇ*ˆÒPf4ÆõcÅ`Œk«€š&Ò )ÔH4²ˆv4¶&f‹D:[Y5KK\BÁlJ„f70*6´»ØÝ„F¬3e[Óñ †œ™÷¾÷ÙÌ}çIÕlvÏŸ™sÏ=çyæÜçž›!š´™còúW‚+Á%ý;²4¥kJ×”®MkT¦2•ýý<-§å´˜ s'©¤’*| ÖçN±_ä‹z¢~,ž¼>–™_-ÕR­ÜO_¬v©]jWÇ3é€t@:`IIMMÅŸ· oÞ6 ”<*yTò(Î)Î)Ήú".ö‹|QOÔx¯çCòºXþYÙ/ûe¿w¹èPfefef%û°¥¿¥¿¥ŸO{:ötì) 0ŽqŒð /`ø‘¸Ø/òE=Q?oþÙ×ó#k²<"È#Þ¿ˆ97rnäÜÐ~ã»Ãî0܈_Æ·ò­ÐØ1íŽv`+‚Ÿ?Xa°)ذÁw‚ïìXØv|¯ä•ÐD¾;ì¹Cp‹úá|k²AMê:¤"õ„zB=Ñ6(ìN»ÓîÔ b‡ùA~cZ›vS» p/Ÿ¿ Äóy>¢¦ã)žšüÖ` À½z·Þ hmÚ÷Ú÷?Ì«y5ÆÄ6'ðÁ,-- VŠ Özk½µž/ð<ñ<ñ<Á‹H1ö;ÎŽ1D!B¡p&:`Ýwë¾€2™†“‡“Íûù}~`Ÿ±“ì¤ñsÆžÀ| ~jZ£Ö œsç*ÎUð=‘­CëÐ:ßàA ÀÔ1o,Þê»ê»P4½h:dNÉœ©÷Sï€÷sïç‚á]|`ªot6†q_jVjVjœÏ6=Ûôl“‘¨ÁlÆôôÌssÉ9-i-iæ¸ÿ¢ÿ"¼5øÖ ÔΩc ±•l%`Ôà |ÁGðD¿õäÖ“[£G`næfn>øàÖͺÍD®.ººÈL´çíž·ñ ¶dÆ’7˜7h^×Ûô6>ô¢0ð"ø‚à'G®ÔbK¾%ß’oܱª¢*ª"¢4J£4""å”rʳšoõ,)–KÊÈËIßš{ÒÒ•¸£')νë['µë¹ôJí¦h)ZJ”þX¬?ŽjqC\S‡¦MâÛ M&ÉIrÒ{¿‹“bS¿zý‚r&N»ÛÞ¤]­WëÕz£cg"c"c"X:ºtté([hh±SéT:O¯R‹H/žà zƒE7ˆ¯Òn£µÑÚ¨¥xÚ=ížvAĨ`êèqô8z¢cGmV›Õæ¡È_’©ìӴ7Œ7‘ð^D»—_¥Ý¼-y[ò¶DµëZëZëZ‹ÖÉ87NB*“ʤ²Gcaäçq¸ý—ö&í®W”¥Á»B.«/«/«çXZZÒþaµOñ)>G&µQµQdì(ž8¼ú-^»Çcý¼¤]Ò.i@›i3mÖ—Èsä9ò@"‰$ê»i ض‘2  (ÒÕHbiÜÉýß,Åø–Où”¯ƆTÈ\æ2¤+ÒéÊ¿æN®ÿÊw2o<êÿ~¸O¯S/OIL‘Ø•ØeÙ•ÝPš]šm{:"×]{½g. o|üÆÇÝíÝíTÀÔõ©ë¾¾“M»éoÆ›xñøâþM~xÜû¸×ò$.K\&ϼôÌKé'"ãéà*rL>6ù˜J}H"Ií0Çý8Ù´GýÍxÏÄ7ó™ù#|R_L}QJ”°_@í€7×¾¹Ø  õðwܸIݪ[óá`8HH uFpAy”@¨`A?  a_Ø´ð>¢xÕ§êOÕ›G;øÛ+ÁW‚ö º+uW¬¦Ñ¹~ì î ‚:  ©Nr@M¨ 4V(¥J­SÕÆ¥B­T+ÕJ ƒtÒczžV@©-Fª‘Š *£ø?¾¶ðÚ‚I°~W\)ED²Î=`¬|s§ñNãìž¹Ù`J0…y­UkÕZcù›››aÚ5íšvA8;œÎŽ#äÆ;&jµj­fžû¥æ—æµ3|vüYàŸö{GÀjòþ#"Ò6åo—¿ ê†Ó×0S5Sù'óëóëQ}{û^î{”UY•öØöØöØ`uÆêŒÕP’U’U’óÇæÍ‹ò—úKý¥P|¹øƒâÀñ–£ÅÑ‚ÚÖœÿnþ»ð ÑxÏxÏpBÅÁŠƒ`|á#jLDäÛSpyüò8Ìý@Ýz27%7…¹¯Ã›†7 o‚×€kÀj6Ôl¨‘²‘²‘2ÈhÍhÍho•·Ê[#æiò4yš 3-3-3-¦Ï?‘çÈsjll?Ô~H…þ”þ/‹ð+zWôª.þ;µ|j9¨Šè=Z£Mh°ùûÍßmþ®Ö^­½Z zÞ£÷@VrVrV28Ü·Ã 9ÇsŽç‡{£÷FïÆLÕNÕNÕÂäÂäÂäôWõ¿ÓÿlÚ¼QÛ¨Á¿.~õÑWÒé`l}"ôDHu $?™ü¤q›+÷ÏÝ?ÊXºöäååÁ Tƒ :wî< %%%1Î#Î#Î#Ð|«ùVó-~7*í•öJ;äTçTçTÃõÔ/ù2f¾¯þ4óÂÌ @0Ù’l1n[ããËmÑ´µÚZyβ^DDRå§HµåšM³‰„ü!È/²Æ±Æ±Æ!2Ñ0Ñ0Ñ reÕ•UWV‰ø |¾›×æµyEºõn½[ ‡ƒÃ"g·Ývv›HÃ_ÚÚD~ðLÌM̉¤d§}‘ö…¤fÝt\t\¡Bß§ï³ÜŽÞÊoOq£ó³ÎÏ€âÈ‹®$t:ëôúÓëáFݺu±%6õ6õ6õBž3Ï™ç„öéöéöi˜ñÏøgüPV\V\V žížíží°7aoÂÞ(ü±p¬p œ+Ÿ÷>ï%ôë_·|Ý¢ŽBïlï,è4ÏK·òLù3­á„p ôH›ZbTK-µÀcŒÅÕê!ytÑEWœ^¡â¢f™Eþ©þi|¾òÂòB³Ÿµ Æú˜²ÿlÿ9`Ÿ£ÝÑb}Ì8¬}®}μÒÉ$3‚‚ú%ý’~ ôJ½R¯c‹±ÅØìd';Á(2ŠŒ"P.µ[í½C×ÇA¿¹è[ô1¯×DðÕÀÝœ»9ö»ö»+Ýfû]çߟ¸?q©-1]™f2¡-í,²„X`!n? ttÀÏ¡¨ÿ¯†Ëp¡áÓûô>àAq¿e¿åÿvþß¼•æÛe¾•‚=@5Õ$-•ýuýuB ®©kX°@L6í¦¿oâ™øf>3„Ï£ü»xdÿcæölj8¶êŸWwIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-33.6.png 644 233 144 3224 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIIDATHÇÍ–ñOTWÇÏ T¦,"bpA‰›ÒnÐVBª]),·Ë1XQ£ `4¶±Ô6Í®©-²ÑPbm—Û¡8ŒmQ«[-k­I˦)* ˜°‰‚˜!3Ì{÷³?ÌXùÀlƒØìØìàšž¼ÌÜÂÔÂTP˜ü¸ÍmP¯èOêO2© U†Ê@©×ÕÛêí©/…ŠSq*x‰L2ƒq*) ¥ŸÖ>Ô>dpâõj€?¾ðùÂç ƒ¼²”""Ïâ_æÏÌŸ†Cobo"LVðçÁ?Þ«¿WϘo¹o—oWPo²`²`²sssÀWí«öU‡²cÇ„¾ßør}¹0¸ëÞÏ÷~flòw~~èMíMΛÌ £á†Q&‘£ÿ†íÚv Ü{pâÔS_ZòbÊ‹)ýV´5ÚŠZ»bmÖÚ,¸¿óþÎû;!ëBÖ…¬ ÝÝÝ…ÖBk¡¼ÞoŒ=¯m¼–-–½–½¨Ìw—¾±ô p®ÑÐÐSaÇ¢‹@ÿ¯ßø–‹ˆü§Μú°Ó¿œþE•.‘áÈpà*Z?´:::¡l l lr¹Ž\ — — —ÀÜ9sçÌ—®\ºréJÐPÛHÛHÛ$œM8›p:ìü®ó;(ÿ{Ù3eÏàù~Ϊ¾\üåbÐ\~?ƒŽÕ̪þêþ¥µ””AæÖ̲Ì2ˆIŽIŽI†á”á”á˜8?q~â<,‹Zµ, bÜ1î7 ÔÔÔy\ ®DX#¬VHZT˜TÙ–÷\Þs0úºçÏ;÷gߟ Êu*ê”j£Áä6¹I{TNTŽÈ5­{{÷vîëŒïŒi=Øz¨õHRzRzRºHÍúšõ5ëEúô>½O±_´_´_‰///9S|¦øL±L‡ž‡ž‡‘´iiÓÒ¦‰ô}Ñ×Ò×"â¼éÔœšÈ?¯×½P÷‚ ‹ÄUÅU‰èY'ëH S­Úfm³é†HÄW_‰t¼ÒÑßÑ/±ëÜë~Z÷“H{C{}{½ˆwÜ;îé.î.î.)ÚW´¯hŸÈåÝ—w_Þ-2R;R;R+ÞÞÞ*Ò”Ö”Ö”&’œ˜œ˜œ(2Ô2Ô2Ô"b»eë²u‰Üí¹Óv§MdþŸ’î&Ý•X‘ñsãçDLmªBU˜n5ì›Æ¦Æ¦©Í_º/roóÞf<éÒO§Ÿ[£­ÑÖ\¢*G•£Ê‹¯.¾ºø*œè=Ñ{¢\ \ \ ß–oË·{–{–{œ´œ´œ´@FWFGFŸ^×TׄÇÐãDãáÆÃ@‹ñaìÊŠÒŠR  @OEi¯i¯Û7¹Îu`›Øôè®ã&7¹ ìg?ûCâó˜Ç<àV¬!|]Z¬ ü5 GÅûïÞÀ®äV a¾e¾5ÎÇ=Kz–€ö–¿Ïhïz[¼-Œé¿×·éÛ€Uä‘Úí€v´=Úmèizšžl`@Ÿ©ÏÔgG8ÈAПÕKôжxm^czF }ÓótÏÓæÛæÛ£áôúØ#ŸÕ‘«#èÌÚ·Ú·úf}3“So¬ðà&g<ä )44àC <¨©ú)>ãd è=Úùg%EE!g%o&¼™0E`ª©Æ¾Qß(€V¢•àÕ®Ú0a‚ 6æ|£Þà3ø =Cßïçq¾]<¶÷±Çóû?#”ýàÒVsëIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-2.9.png 644 233 144 2611 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü>IDATHÇÍ–mH•gÇïc¾0_†#$£hŽ6¶(ub-%ãXF)XhúAcÑ‘¦Èš3&Ä´Ú Í´dÖb‹²ìÃ2"Ó!H00Í–½ æÁ—ÜÔsžç~îß>œç9Ïq®}îþòœÿu_×ÿÿ?÷Ëõ<„BÄšO!ëCÖ‡DûqÈv<Òéúà'?>/Á‘ïÈübÎÅœˆ»wѶ±5oå× aóëYq+ì@ĵˆkŽ,×Áá-‡·D¾ïÇ ÀyÝyýoŽÝ8và×¶_Û(‡‰¾‰>€™¬™,°±5oå[õ_0¿¨û—¾v;ì¶ãD„G„ ölسéK“Mp ÷@.ÀËU/W©S@Q* ˜gkx‚°5oæ[õŸÅoéYú~?â3ã3…€¼Â¼Bg‹¿`¸ݽνÎÒÓ®óÕT¥~ׯ´1à[}PÄ ê±z ,)ŸòAŸÓ_ë¯ñª?´'Úà}€OZü¦^@ßïG,ßÛÆl– Dêe½>¨‚úL®?G3'”ªU'ÕIPj@ `p õž U¡¨R«ôú 4È0Äï+)± 6fm¥B|ÔÎ çÄ|(ŒÈ t°Ôu†­H«×êaê“©¤©$Ðê´:­.ÈP 5ÔØÐ÷Ô÷Ô÷<¿ynyn1ªÂT€1` °ÀŸ¿©Ð÷û1ïã§ŽŸeÛ€-lùOçsæsPûÞyÿeˆ©‰©‰© ;v6€gÈ3ä² Í5Ï5Ï5CŽÈ9Vw¯î^Ý …_ž(<Œ²È" dªLª,=¿¾åÇ4ö¨:æ:æ@ºÔQSÇ{é›KîKnØœ°9as‚m £"£"£ŽF‡o¢‰& £8£8£ØŽoÝ:»u®~wµæª½²^Ùiéùõ-?!BDß¾Ÿœ.DæîÌÝB¬z%„Žs§#\Ï\“®I!º{º{º{„¸{úîé»§…˜"¹2¹2¹RFb~b~b¾“±“±“±Bt¸;Ün!ÆÇÇ…˜.š.›. ¤GˆFKϯðqkâÖCàyåytš×þ Ú¡vØÿ¸ÊYå¬rBJ}J}J=ôÅ÷Å÷ųb,•/•/•CmKmKm ½(zQôâzãzãz¡u{ëöÖív¾Ì±ÚŒ©oú}?ú¾º©© ï,êü°3©3ɾ»gÓΦMƒ+ÃW†¯ CVV´õ·õ·õCçLçLç ¤;ÓéN¸|!ùB2$ÝLº™tÆÊÆJÇJm~õ¹õ˯oùYqÆŒ}ËÏØï4ßiW‰«ÄU{Ã÷†ï ‡´Ð´Ð´Ph?Ò~¤ý”$”$”$ÀTõTõT54å5å5åAJvJvJ6tê:Ôu(ÈP‹¾Kß…—‰ÿ>c+n¥Û@Ÿ×펮/Þ•[‡„{é¥gœñ øEÎsØF.¹(kåZ`éoePûkdvd6@·OõÈr# ò{Ù%»@>–ä#m²M¶*U¥ªŒL#ÓÈÊ(£ ¤Oú¤äÇr“܆Ûh5ZŒ £‚t³©mD{k êüDDX¾´^|òž¼Lƒh̘+8Í$“€—%–€7¼á  H@áÃæ*+0ŽGÑ@>”ƒø)ˆ,ˆ´VjYçË»w¢;1@p¨§ž({‹e±,Æ êz€ØØš ³Þâ³øßú®|g¿.ÞÙï±wó öØÍIÙH,0cIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.6.png 644 233 144 2625 14774263775 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜJIDATHÇÍ–_L•eÇç´ðÏpÓh8‰Þ`lmâ$sE\¡Ì–ËP´¹j¹ÅEÌÖ† W æÅAÓ 3†Cf‹,hΉn&„žÍæ 69œHäœó¾Ïóéâ=ÏyO™ëÖßÍ9¿ßï÷}žçý½€ˆˆ<—üð¾à}Á;ßñ½»ÜxÖkY¯-=íøGmðlñlùõ3xöð³‡òÚòÚ԰뛼©OïqñÓùL\ž7àk÷µ{Ö&ýÏaëò­Ë³;þÁ+Ý™ÝùЂÝv_è8Ñq‚}0>0>0¹vr-¸¾É›zÓoðÒñåóñ‹Àœî9ÝžßÁ—éË‚W ^-|ß)BE°"0š1š¡½`O¹äêµÀ4Ó‹¤ù&Ÿ¬7ýÏà>ÃïèXT¶¨L*«+«³CNÃð)¨ Ô Ñ „‘K£UoÕs¬w¬wˆÒCÀ¬Žë8€¾­og¬¸'¦I„aàK>åSr¡‰N¬:ß>åò;zäŸ{ÛTof½™h€D?؃ö ð›*U¥$ô{úkýµ“`–G<µýìg?¨ïÔ)u*Õz‡cç`¾5` ˜p¢ŸÙ7x#°©¬3Ã÷I|×âwôxy®ÙqtÇÑy–ÄŠ2Š2ô*™«¨rQóH¶d:• ?4ô7ô‹T]¯º^u]R¦2U¦Êtýš¾š¾š>‘‡…V¡%R¾±üùòçE&OL½4õ’dË: KX.r#ÉgøGáà'p&z&šZùwÕâxO¼‡˜‰\¹‡ßèñЍ.Õå±6[›E¼ûDDd‘y¤õ…ë_\ÿ¢ÈißißiŸÈÒðÒðÒ°È’º%uKêD: Z¤m[Û¶¶m"EEE"‘ó‘ó‘ó"¡‘ÐHhDdìîØÝ±»"?m‰¿5|JÏ“ÎØ'í“ÄÔGjÚã>aoWoWo4Äâ qˆçÇóãù°1´1´1S›¦6Mm‚³¹gsÏæBÉpÉpÉ0Ÿ{|îñ¹i‡±Í.³Ëˆñ㟱¤°£?Ážú=õÀŸj%Ø+í• ƒºV×¢­¬«T·êVÝÀŽptPu00Ÿ|òVZiM‹s“›@=ßð l±° _’?©çÉsŒäœùKmQ[’S ÐßévݪY5«f`ˆ!†ÀŽÙ1;ãÇ@«bU ö.ûmûmP/«Uôª|•ŸÂ{ëNìNìñ9öäÉo&3öÏöϪFÕHZÍ_L2™ü¯(Q¢€F¡œfÀl²µSí$áâ|Ã÷ØäÿŸo¥Ð |Áä‚5mMØoÙo}E_Àƒ\ßäM½é7xÿ‰ßʧövñÔÞÇžÎìß<Ù®D5ÌIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-198.png 644 233 144 3031 14774263775 14771 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÎIDATHÇÍ–aLTWÇ ŒL¤âèTØÔÒ¤|° 113Š˜¬K•’&tEhi©ÅÔÔ»lýP–š M,I?PÝf‘®&U D$uê† bŒŠ¶C¬í›u„î mP:Ju;3ïÝûÛóovM¿û¾¼œ{Îùÿÿ¹çÜs¯€ˆˆ,·þÙOf?™½,mg¿é¬ç½÷BÉÉ´}Ä„¬º¬ºëíPÐ]Ð àíñö¨¨cÛ~;>3_ÄÁÏä³×e¹8 K‚K‚Y[,ûxuí«kóOÛ.ƒgÐ38oÀî/vê õò'˜›˜Ý2»ÛöÛñv¾—‰/ü¿ä†sÃY7a‰{‰[žªzªêé?§þó4Ô¼Xó"À®]:ÌŸ|òõ Nû‹eضߊ·óm<ßæ³ùÓz|ÏùžÚ×j_óO'DO`´>Ñú„Í—ä÷¼ÍÛäÓkœ1ΘûÌ}$ø»~Y¿ úšú^}œÒ-ºÀ|Ï|ÝÆ'Æ' ¿æ Þ ŸO-<,|Ãâ[äOëqJ©DD>õR/‹‚"ºÍØgìý/sÜ'e94¹úWý+èz…^±¸cèõz½^zÞ£÷€®Ò/é—ÐÀ0ä´O5«f`Mê}õ> nóKf³=ÓžÛžÛñ˜˜›˜¾ ô7úæï-<¶ð¤>MNv„$CÉP2±s±s±s ©CêP†¿/Ù—ìƒ™š™š™0Ö&k“µ,Xîj"ž¸'ϱõXÂŽ|É­æÝÍ»m8µNÿ!µ.µfÿ6ûÙìgèM›:6uÀÙ‘³#gGâªUU«ªV§×Óëé… ;v6ÀlÏlÏll l l @áñÂÃ…‡¡vMmem%úÁ›ñ†xƒÃÇú·†Þ²{ïÈ—–°ïÞ¥t`õÀêł욿sÿãû“(o+o)oqÎîxõxõx5œˆˆˆAY ,Pp„VŒUŒUŒÁŽàŽàŽ lPÔ׊®]+‚’”,9g׆ÇÃã$l>åï/é/±…}÷®À²Ñe£:ÈÜôšé5@Ô mQówf‘Y~·ßíwÃÅ]w]Ü—b—b—bP( ¿²¿²¿|¾F_#tÜí¸Ûq67mnÚÜK¯.½ºô*øëüµþZø9ÿöõÛ×3zóóŸnþtl=Ù"®W ¥’Ÿ{!÷‚ˆü[DDîÈ!9#gD\Ó®[®["îˆ;⎈ÌÎΊTø*|>‘¦†¦†¦‘¡™¡™¡¯×ëõzE†'‡'‡'EVެY9"2_6_6_&¢—k¯öŠœz»ï“¿#"âè±{Œ{÷€Hºæl3~1~±{ÚJÛJÛJáJÝ•º+uN :tè<ÀðC¸;Üîvü]{»öví…%K6–ÀQutîè€è Æ-¾ó¡Ðÿô˜u*i~¿ùýŒS‚7œ‰®Q<àCH„`’I&3ÖOsšÓ Ïëóú< P¨4( ¸gáãÆñ >ÝÜÞÜþЩ|¦ <Óžéxz"5‘ ¬T«jeA5©ÔG ú¾¾ïè0o˜7Ì`–š¥f)¨ýj¿ÚL1ŘŸ›ýf?˜5ÌPÅ©öT; œ²ñ(ø¡Hy¦²¯‹Gö=öh¾`ÿ îhû¤HtÉIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-19.3.png 644 233 144 3120 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ñOTWÇ30ÄA aÓjÛm­‘4°ZùAŠé´6PBSIH±!ÛÀ†­éFBc²ÝƸH%«]·†ª ê–d&‚ÓJ¦ÍþPÛÅ€:Ò”¦Æ 88ux¼w?ûÃÌ›™m÷ðþòrÎ=çûý¾{î=÷ ˆˆÈ†èWÀò¤åIËúˆmù]ÜŸúZêk¿½±?Õ!©:©úÖŸ ó“ÌOÝŽnc:n›óf|b¾H?‘Ïôˉ;RúRú’Ê¢öQxû…·_H͉Øí×Àî¶»®Á{—ß» à:ç:G3ÌOÌOÊe·Íy3ÞÌ7ññåè/øEÀæ±y’¾‡”ä”dØìÜì|æýHÀ½g òõÊ×~´þhUÐtÒU$ˆ9ü ¶97óM<ßä3ù#z²_Î~YÞ¬}³ÖÞ…&"2Ý-O´<¼ ¹ùŒ£%t›nþº¶´¶DX}cœ2N.åVnõ­úëµz-aX ¬€v:é$]ý+Š÷}úLÓ=|V® Û»L=ò¿µýø¨Y©Yõ>€6®&ù€Ôê4lêgõ3Je©<•[)”UY•x'θ»šWó(õªñœñ°Â ¨ô>oÔ4Ô4˜?~%¡”""[O=h×ñï»w;b°—V²V²iZ§Öç[u­ºV]à÷ú½~/>ÃgøuÓMwÜÔŽkÚ,îY8·pŽÐÚŸ#øà ú‚Àu»Ëî ®3õÿùt 7µÀ( œ\<²xvýeWï®^ÔàÕÁ˃—ãDÎ\g®3Ò†Ò†Ò† ¶µ¶µ¶ÔˆQ#ñ¸¥K;—vBiQi~i>8N;\ªælU{U;¬þ=ÂMËMË ®Dôˆº#"òõøüÞç÷àá7ªá¥?¾˜õbas]oVܬ¸Y=þvï(ÞQP°T°T°½¡ÞPo(îïíí…’%K6B ðüðGî•Ü+„ÇroÍÝšS 0 èí=BpýÀúÕÇíù´ù4PÍÑs”§Íj³P”\d+²ÁpÃpÃpŒúGý£~ØT¼©xS1\h¹Ðr¡2U¦ÊTp¦ùL󙿏0£Ü(7Ê!è zƒ^Øý‡ÝÍ»›!ë¶£ËÑ‹[î^îð—øK@Ëpf8UŸE2¬uÖ:òeÊvÜv\DN‹ˆÈ}ë¼m³m³HòxòDò„ÈÊÈÊÈʈHivivi¶HýÞú½õ{E<û=û=ûE,×-×-×ER¦L=(±1¹}rûäv‘É;“w&ïˆôÏô×ÿHÞ἞¼‘/ÏaûÂ&÷E²eQ^I•Tò-‚Ñoô'M‰¦•kå"I›DD$ۻî°K$¹*¹*¹JdÚ:m¶ŠxÎ{Î{΋ìiÜÓ¸§Q$בëÈuˆì+ØW°OäÒÂ¥…K "Ã9Ã9Ã9"õ'ëOÖŸK³ÙE¿8N‘Ì{>Üð¡d‹„CáˆÔ© •‘4=•_àÆÅÁ‹ƒÀ‘=­D¸5¿õéÖ§áFõêÕñµµ·µ·µCQSQSQx˼eÞ2x0ó`æÁ TÎTÎTÎÀâ–Å-‹[ m m mŠ*öû ë~gGgáh³iàÒųÏÿ4÷±Sy¨ñPlgÂZp-‘̘¢qÆf™eöÿ´‡B )Lð»qãZ¼íq[ÏÖ³“¯ñ£Æ€Õ詌õ1eŸ³Ï×aÜÕîÆ*ŒzmH"¤Â<˳q>}JŸÒ§@ߦoÓ·qÂ8aœŸ¯@’´.ýx6{6{ŠR¶ç—YAMAÍÃ=)»+ ÖsÖsÿ¬}gí;ëÏ­?çŒgm7îæçΗ²ø¹|®_ë”uø/ø/X;Óöëp ü@yÁÆ”}z½Þ•¾xø"ÀÇ|üÍpóË›_,ì\Ø YÛ»ùî|/_¯__¿¯ßúüùþ| Êv—í~¨5•0ùÔ>Sû Àwyßå$g5¬1;(QÜ1—c»ñt¾;ßÅsñ]>—?¥GPòdÉ“ì«ßWx[’Æ»¡ýö€'ì^º9Å)Ö@b!±|9ù21~îàœ7=¦À|m¾bÉúd=±Lþۼ˻¬1WÒxÛBm!Wàx7Ý—·//ð¾«Gÿ½·Õ°yÿ2˜V{ÄDx…WLŸéÃYĘߘæ˜ 1ÈY³Yfsìõ掹ƒ1ÅÉh2Ší®¨Kás`ëþVW`GuÎVJÒÞ‚@4z¹éŒtf`Ÿ^ù×rñr1wíi{ÚžfÕXY\Y\Y„Uñ:èÈšñoì»æ.ݾÿöýÜuR?ó4Lœš8| ŒD½®ñ7Iêº M'›N‚ù€óøÂïg_›} *Û+߬|3pd i )gaºçºçº¡²³²³²ZZZV _[[ƒ=ª‰×Ä¡ð³ÂñÂqLýñº#uG€‰4 5 E)=2ÿ”¤±6øpòÃIX¹ `=q4X,&æ®k¸1ÜnÌkƒµÁÚìAÚ;´whïjagÂgÂgÂPÑPÑPÑõÿäöc§;MìϼtøÒasBÇCÇ!ñ—”-ú´èSsÜ,¼Y¦9}~hÏØ3ôóƒùÐ;ß;ß;ŸŽ™˜‰‹‚EÐWÞWÞW¾ZXß­¾[}·`kóÖæ­ÍÐÓÖs¬ç¬½QôQÑGpæWïµ½×+•BÂ) †Í¯~××À£ºî{Ã÷†%½-IšÏûƒ¯ÌW¦ïqo»·]²6Z­’ŒŒŒä·ü–ß’¼-Þo‹¤)MiJ™Aˆ!iÏðžá=ÃÒµm×¶]Û&õïîßÝ¿[ò|ëóŒI_..k^ò•ûÊUbòžÏ{žG=ÂùÄùĺ.Û~Ê~J²¶H’J\‚ø¯ãíñv)1•˜Jägâ£ñÑø¨„¾¬ÿlñÙâ³ÅRx)¼^’[[[¤ª½UÏV=+m¸³á« _I;Úw¬Û±N%ÒbÝbäÙÄ(£Öu¬hU´êêmžž–ôSIâE—·ú·ÕG«J[‚[‚[‚«…í*ÝUº«T*›.›.›–bÛcÛcÛ¥ÐùÐùÐy©b¦b¦bF:Xs°æ`Ôµ¡ë¾®û¤·þÔy²ó¤âlÚ<Ä‹ôú}’õùʃ+^½’.]—¡éDÓ ÷d8C"šÈVtĈñÿ‡Cºâ¦Ç#Œ3L1•ƒw.1™˜Ê3·²«© XJßÊL3Q/NÄŽØÙ:沿°¿à®Y`›þ‡ŽF§ÑiòÉ'ˆ!Ž9Zy‰— wqäã¯Æ_å®s,SÇ‚A ˆ"Q/ÿvëØªÊ_ç¯ó»´ö+ÉP2ØN£ÓˆùcH–Ó½1‘¶I¯Ø"sÌ¥3Á`œœ°‰%ÃÉp~†oUåÿ^¯t{—Û+S½é•é-N6$ˆ6ÃXXµÝxæH¤ç»x.¾Ëçògzå=ûº¸gßc÷æ ö?ÐÓ‚¹tN\IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-32.7.png 644 233 144 3164 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü)IDATHÇÍ–mL”W†ÏL¡Ì‚PP“m).v‰AÚ„­d‹‘ h(¤J $$R(¡»kMv— K»JS¾T¬ÑJBw’!ÖRËšN¡-òaš" t¡Z7‘…âŒÀÎË0sÞsí™—™lwÿ{þœÜÏÇý8_ˆp=Ý."EÀÖÖeÈôãz(L*L2mðáÆ`¾j¾ºä…òîòn€;>îà×0;<; °¹ ¬ûõx=_ç æõÿU_í í1üž {VˆËŠËŠÿ­/à^<äíÏÛ0ýÌô3ÊÒ„®2.ôåºß¯çë|:¿^O¯ïëG@Ì«1¯ Á¹×_[4_ò%Üí¤¥êƒª@ x®rvÚ )¤Z¼N¯·º©½«½ Ô©:U ÆÔ€,—å¸éôvz;AÝ¥†•ÃǧUEWEeþzäå™/Á†ç6<8SÿþÞ^~özÊë) vx†€øT¶fÒLxÔµWíE©õ¦zsmR¨ãê¸:jBM¨‰€%–XBç9ØÈFÝé‚B[¡MŸà{{ƒŽR!¶¶ÐgþÈü‘+îÅÞ‹ÏIrí{~ìø±ƒeïïQïÑ@=O¼'ÞöD{¢=<õžzO=?Y«9«{V÷€½Û¾b_Gë\Ö\Ë “îÝ/’»Ò2õíÔ·fi–®õ_?B„¢}Þ’oIXüóÌk)¿J%ñ•Dˆ<ÙÙ*-¼Yx÷÷÷!/5/5/"ú#ú#ú!£1£1£µ>j}Ôh¬'§'§'"GDÀÖ?n=·õ*´ËpÑpÚ~ÞÙÒÙ¢¥@MuM5x6úúÞ,!„­‚ÏŸ;¡ÃøéwŸ~§Jñr÷ËݸÙŽ G$­KZ—´Êv—í.Û i×Ó®§]4~,ýXú1hªnªnªØŸÔ>©}R K}K}K}0ph`ÿÀ~ˆ‹}þ«ç¿Â=¿·§JáÊ•+W@S¾~ÿŠèŽèV]Ì4Ì4]—œo8߀ŒŽŒË—aSô¦èMÑ0ž0ž0žsî9÷œl›m›m›!á@„Ð_ß_ßt¤žfO³§9€K&JÆKÆ¡é7ï§¾Ÿ°KÏtòt2@Ä×_«.¡ZÖ_^Y»®o\ßÀmïdåd%Ž¡ÖÁÚÁZX rAÂ6Ë6Ë6 X ƒÅ§’O%ŸJ†¦¦&ŽŽŽ *”+sen>}0ú¶Tn©ÜR ‹ o/¼$31öUû*ð﨨íŽQ}"È#†;B„~ú™·rnÍÜš1E‹E#E#Bô÷ßî¿-„ÊT™*SˆÞ¦Þ¦Þ&!Nî<¹óäN!ŠÅÆb£<bÄ6b± qæì™³gΊµe=m=m=-DÊ/R^JyIˆÈ?D5G5 ¡]B#þ)Ódš¬õj½†;‚Fÿ7f³X-ÖµŸ¿ôϦº®º.Ü©å©Å©Å`±ÎXgÀVa«°U@¶ÈÙö ïÞ7 »Bv…ì ζζÎ6(,,ç˜sÌ9'’N$H‚k=׺®u­MÊ­}⫇×òØòX—Ñ*¿\´@EiE)ð7-%Ê€<(þ΀+V‚Î ‰äÿ/ -0Ë,ŠYï”wj-(UQ[Q«7Ö> ˜ôëæIó¤+„óß§Ÿòw>“¿_µ¬ZXÖ ´w´w@ÕªUò‚¼ /€“cr d‡ì ÊT™*m»¶]ÛÜà ¾mD[ÑV@•xû¼},û;ÊeiÊ9å0Ïšg]!º®þTù9h:h”_™Wä—òK­T+Åê‚óÌ1,0Ï<0ïßݬ°8yÌã ‰?Ñi‡ðà–}²/Xù† ûŸÊï¿+É?œ8认ú…êÖ® 4^—× ‹e1nP7Ô  €u¿¯çë|:ÿÚ]é¯ïëçi~]<µï±§óû Ô6­(¬jIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-20.png 644 233 144 2535 14774263775 14701 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–_H”YÆß™6GAÇ’¼È)QªÁ……¥?Ò8m˜©ý!ªm½X"bƒº¨,$†v÷¦•¥ˆ 5¶¥ÂFêb Él£‹m7¶,‘袲4• gæ;çüöbæ›ïÛ¥è¶ïæãyÏyŸç9ÿÞsDDdVê/à-ôzýIìýƉgVeVÿšÄ'xê=õÿ„ÜÖÜV€ÙggŸÕ¶Ûíþî|‡ß­gÇe–8ßEßEOe …MK6-ÉÌOâoBÖå¬ËSìêÞÕ ÐÕÞÕÎw0|{ø6ÀDåD%8Øn·ûÛù6Ÿ›_ŽþO_föÌìñ<_†/CŠV­^¸;Ùah!¬¯Y_ðlƳÆ jÈ&ÛTQ¢Øßk¶ÛSýí|›Ïæ·õlý¤9Á9A¨ÛR·%«-™0pöÍß7°—“œ$›_¬°ó‡µÀZ@Œƒ¦ÂTPB pÊl5[Áüm-²£Û:g •V²Q6_Š?­gë'ýÈ×ö§¯acæÆL` ÑjJM…ªY5“0_šFÓˆ±§Èt˜vÓ&dB&¦Ø,4 Ó3ˆ™a›Å¾UwÕ] ^ª—@ÂæOé¥õÅmèó5œ5ý Õ Jó®åº.м³‰­‰ ‰ 0Z6Z6Z‰5‰5‰5Ž‘ØPl(6cEcEcE`–˜RSê´óR¯Ö«y—ÚZGÏÖOúI;ÙM‡šÙÙºOb*1å <º8Z-uÖ]Xwrý¹þ\?Tì©ØS±&š'š'š¡I7é& ™»3wg 7n¸ŒýÎ~¶ŽYÇ\ziý¤Ÿ”±?¿‡óoοIûØ¡êcÑX”˜é8Üq¸ã0”Í-›[6×Ñ©.®.®.†醕••xqàÅ $\. C„—?-ñÎx§Íov8úI?^¯¿÷‹¯D‚«‚«Rë+ž¶C3=3=â³#UO«žV=¹Þw½ïzŸÈµ{×î]»'ò¶îmÝÛ:‘üyùóòç‰øËýåþr‘‚pA¸ ,R˜W˜W˜'ò$çIΓITzwywÙüž6G?åfçÌÎÑáõó×Ï]Ç>bÚLPK-µÎH÷gíÏÚŸ;;;0X3X3X°ìñ²ÇË;ýWt­èZѧvžÚyj§WõÖrk¹»ÌØúI?^}E_ñ<±j­Úô€æhŸ~¦Ÿ‰H·tK·H¤4R)9>}|úø´Hcecec¥Èƒ±cÆDróróróD^e¼Êx•!rdGöŠŒôôô‹OOO83æýËsÉsÉÑsôS~>´Çt}|2>é챫g®ž¹zªªª :V«ŽA %ÐhޜޜÞèñõøz|°4´4´4‘ÉÈddÒµ¹f‘A0¤©CÞc>•XQË©èˆ96Sȃ tÒ銟æ4§%”Rêâ›¶F­ÑžÊ÷Ô±I»ÎèVÝÊ;ÓgÆÍ8¨T‹jõH=R@…UX…ÁÜ7÷Í}Лõf½T¹*Wå ÓíºÐiº‘w)ü±:öžÊ]™U¿êâºA7`<5â FÆc ˆ'îš©8“Lºf½]o'ê–ºåæÿ`åÿÈ]™$¸ ãÙΫmj107ÍM}øôÑ„÷G!~.~àcøcX[ þö³_G5Ö0k!`›¸›oê žÁ7|†ßÑ#P}ªú”œo=ßZÚï¼ù ºv4|ùÇÀ]Ba©° :U'›ÜÓ-ºôökû50¢;u'€º¡n°‰*,–Á«÷ð ¾á3üŽÙ¾·¿| K.–x‚&@½R¯€Ïöeû2y7 ‰PN9è/uDG¼Ž¡ÃÚÒç g|7[vÒN’÷ð<|Ãgø%(¨öW(Í•æÖ¾€wêòÏ‚Ýf·ñÉóŒ3Ƙ/dëÃÖ‡­°ðláÙÂ3°§íi{Ú3Ë[Þìíxg}>Ãïèq…Ýÿ®ß¾~Û+®‡ÂZÁ?;Zçõº^÷áW³«ÙÕ,4K³4 ”=/{^öZ{Z{Z{€i¦ ü‰›Ü tp¾]ïó;z\aÙ.x´òhÅ«ûÔCõMàŸ@EUTE}žÔ‹Ô‹Ô 8‘<‘<‘ôýuËuËuË0Ô;Ô;ÔëûÕ¸Wã`ðø.ŸáwôT¼¬x©‡!×k¶\OêI÷ßiPkjMùd´}´}´Ž$Ž$Ž$`ðÖà­Á[P™«ÌUæ 5“šIÍ„ÅTLÅ|¼¾» ¿£Ç ÇÃq¾)zRôDÌúGDŽÉ1 IH$|%|%|Å‹KSMSMSÈÕÄÕÄÕ„Hº#Ý‘î±f­YkV¤¬­¬­¬ÍÏ—r)—r/€ïò~G%b?µŸ†þ)$ /±ZDÞË{ç~"ºQ7êFŸg*>ŸŠ‹¤³él:+‹Ä"±ˆHÕbÕbÕ¢ÈÉÚ“µ'ký|kÝZ·Ö}¼¾Ëgø]=;=cdÈ„ ûÐ7Ü7Ü7 ] ] ]0Ö2Ö2Ö8ýº_÷9rävuÆvv+±ùÌçÀ‘˜`‚ `žyæþê©§>àÿ—Vx;»•;˜cŠík†f@Í©95ªNÕ©:°»ín»;W`ƒ GŠ+b7sl“»ÝnL~È“w{i›lºãÞ:7îå›úOþ]~+½-PI•dtFgß6qoËvû­Ü³¯‹=ûÛ›/ØÿÆÍ>&éEµvIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-166.png 644 233 144 3044 14774263775 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÙIDATHÇÍ–]L”gÇÏð=u´eEcR["½!1lq $+8YK7S?è†6ŒR³@SÝMµÄ²˜@Ö CÝÄšàRŠAI1¤‰Ò Ã`*½h7µ ~@‘ŠÓd|ß÷y~{1óòN¶é½s39Ïÿœÿÿ¼ç9Ïyy!ö/ðRÂK «¢vÂßõ´7ÒÞx¥3jŸ±Àõ–ë­ÿþ ž?ýüi€ôÏÒ?S·ÛÆmÿøx‡?^Ï^—ÄYH½”zÉå‹Ù ðNÎ;9ik¢vÓ pw»»L¨ü¢ò €Ëí—Û9“ƒ“ƒs¾98¶Ûþv¼ÍÏ/ ÿ§/ɽɽ®»š’š"™¯g¾žõ¨ÃXìzs×›ã‰ã‰:¬ÀƒGû€0aìßlœmã1;Þæ³ùm=[?š@ƶŒm"PònÉ»îÖhÀíÏ1k^¬yÑÖ3ºù3ðÚÍ/Í/¬Z«–ŸëJ] :¨‚*ü[ëb«Îª#B‡Ùav€ðïááxŒ¿Ó[Öæãl¥ùd;”J©,'ÐGÍZ³ômë댠ù'T€êQ=ªg¹bècú˜>ú„>¡O€šP!BÝtcè}jX î(?”®)]„l}‰o¶ìSàžrO…“`t~t¸ €ô·ú[¦SSÁßß8‰³Æ¬1 3‡fÍcµ±ÚX‡#ÆÌ™92sŒœHI¤„Åìçúhãh#€;쇓ì|b‰éçaueu¥M§ru¡‘käÂÜɹ®¹.tÁ«ÙÙÐÛÒÛÒÛâ—‡ÊCå!ð¤xR<)°µkk×Ö.  „ýúôÊü›Vl‚ÂÚÂÓ…§ÑÚ¦?þ4NïAUEU…Ý{gú¢u{­G¶}UôU¬ŒâúÓ“î¥}Kûä©ÚðÄü>8É(Í(Í(º:tuèªH_[_[_›ÈÀðÀðÀ°H~c~c~£H“«ÉÕä ^^^üË Ð/’ý‡ìGÙÄõÓº‘àHPžÚzL––Ûú¯õ$‰¬úzÕ×›¼rsÛûÛÞ‘ŸDD\­Ï5{:="ËŸ?‹ä•å•啉D|_Ä'²µµ%266&²3}gúÎtßßß‘‚µk ÖŠÜ»uïÖ½["»Ÿì~²û‰HΪœ•9+Eþ8ŸûKî/’*ê%øê}õ"bÆòô•é+Õ0;1;\Š{­Õ´šv¶,ïZÞµ¼kÐ?Ö?Ö?ï^¼{ñ.lnÜܸ¹ÑñÛØØ€‡7Þxüçýçýç|KÑ–¢-EðŸ›'¯œ¼âŒëoSÞ)/Øù$ˆ¨+êŠëGÁÜeîCDD2\/ËS»Ð""¦˜bŠÈ|â|â|¢HÞTÞTÞ”ÈÃûï?¼/r¶êlÕÙ*‘1k̳DJö—ì/Ù/2¾w|ïø^‘–†–†–‘‰;££"™ë3#™‘eú 9g†Ìˆ“""ß}BB@@`§ùØ|LÄþ¤£þ£þ£~öû‚}NÚ‹Û‹Û‹Á;éôNBk]k]kƒw$w$w$ƒwÈ;ä‚¶çÚ¤-:Ž\¸ˆÐÓ \è½Ðk7ÿw9§’êúêz甀6‰®Y"DÈdØ4ÓLsܺB¡@ŸÓçô9 “N:ãðÛüʯhêÍÍãô¬ê«?vNeü›tO†“Уƨ({Ž©UâªPMª ôc=¥§âòHRI* ¬j«ÚªåU^å`ÔËjZV¥uÊ:*ßh6šYäªÍÇsǘîî¿™cö ýd;”¦•¦9“¬€ÔÛêmŒØì×€‰ èh…Xb‰¥¦£ÁË÷h–T™*ÃkÀˆç·õ~3ù箤f}Íúe‚nà8Çñ8[l•[åD@ßÐ7–{Ƕñå–ˆÅÛ|6ÿïÞ•Ïìëâ™}=›/ØÿWìákþq IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.6.png 644 233 144 3203 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü8IDATHÇÍ–ÿOÔ÷Ç_Ǘ™ÓJví©ÅØ¡]ðVˆ“V»8YK;9D &. ‰f$\b;3‹s?´i…à ;†© Ü€Ö‹Í “FV )f¹&.E4Báø²Ã;îóy?öÃ݇»ÍÀ÷/Ÿ<_¯÷ëù|~ÞŸ÷çõ~ ˆˆÈêÐS j}Ôú¨UAu -þµ¤óA|FÓë¦×oþ¯y¼ ¡!¡A c#o̬ óGêqY-á@Ü¥¸K¦Ì~ í…öø'‚øý^0»Ì®ÿàÍŽ7;ÚÛ9wûïöÌdÎdByc¾QoðEòË»ÿ§/±ŸÆ~jº qÅ=&²6d=óËà÷3ëÈuŒGG«(Ð& • Ì31¦"°‘Í7ê >ƒßÐ3ôƒ~¬;¬;D¨ÛíÙí1;ƒ£M|Ty¶ò,¨¿,¹h žz,˜ Lh•Z%>ÞS9*ˆU±*@¨àV¤áƒÀL`8¬W ñý¾²¶²Ö08Úęݳ»gÍN°fZ3Ãß4ôüàÖ¤¤úÀÒ5`‚ POh£Ú(Kì"4”±Dj¿*U¥„ÇYŒÀG)¤¥wjj²L3 êg!þµÏúÀWá«ðUÀlòlòlrD¾•VZÃ0ðTàÕÀ«0yøÞн!¼Kßòƒ;ÍüÕ|Î|n>Æð#Ê$"r¦j5ðcši=íÇ[_J})ÞK8ŸpUÐUÐZÐ Þ>oŸ·/bA*V­„¬¹¬¹¬¹p\ëÔ:µÎ0Þ7¶ïæ¾›`9`9n9ŽÚþ›mom{ ¦ õ/ô/ô48d?dýßA?ȹQ ÝsÝsÐÕùUçWªlÛªŒŽŒ|3Þ™©™)°Ùmv›†²‡²‡²áú‘ëG® oGž#Ï‘ÇC£»¨»¨»¯$^I¼Ãÿþ|øsøÅïö?»ÿY|×l#wGîª2èÚܵ´™ Ÿ˜˜ÖU«:Ò_|{­½Väçúº·×½mræ7ì8½ã´ˆãdÎ@΀;ÙÉN‘Ù+²Wd‹Ë;–w,O¤xcñÆâ" ‹ ‹ ‹òИŸŸ¹ï¾ï¾ïÉuæöæöŠl²¦Æ¥ÆIÜŠ’j’jLNë·ÖoE¢XÙ¾²=ý…(Ι<&©âZùòÊ—Enj_üú |7ì^;¼VĵڕàJIq¤8R"ťťť"ÍÍÍ"îMîMîM"W;¯v^íqÕ¹ê\uac - - -"éÑéÑéÑ"·[o·Ýn™þ×´6­‰üñŸõ/Ö¿(߉C?·Ô´ÔmA?¡vq¦ÊËÊË€ËzJ«Ð*€Z¸oé^Ý«{!p#p#pô½Cïj©¥”C9”#b÷Û°aê8Íéå¨bT³jVàåÕåÕ€?ôWr+ÔÇ0ß2ßšác[Ƕ‚ö«`ŸÑNú»ü]xõ§ô<=hÿßSíª]µƒ~J?¥ŸFa4ŸæÓ|ÀÙ !ý9}¯¾´~§ß‰WÏõ±ž±ä±dó7æoæc˜õ±‡:?oÄ¿Á5ZºÆí3í3½T/eiù!@ðãÃ,°ÀB(§€Y&™4xPËõË|ÆÉÒ{¸ó‡ÎJòŠòŠ"ÎJª«— \ÀINbÀ|`@Û«íŪWõ`ÂaläùF½Ágðz†~ÐÏ£|»xdïcæ ö¿¾íÖ°?YIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-26.1.png 644 233 144 3130 14774263776 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ïOTgÇÏ ¶08*ûb³&%MÄA (¦4Ž«]]Ät•”X1]7»‘ÂFVÒC]±5Ù6‘KÁfc#´P)E”•^Ô˜†‘‘× ?fd€a¸sïýì‹árg»ûø¼¹9ç9ç{¾÷9Ïó}‰Zù Xc­±ÖuÛzÌô‡íÛ÷YÀ®VÁò¦åÍÁ3ùIä'ëëÖ×iæmÌñÁù"&~p=Ã/Qb:B?ýܲkÅ> ù ù a¿Ø{ÁÖlk^ðÃ;_¾ó%@S}S=¿‡ñïÆ¿píríÓ6æx#ßÀ Æ—³?«//Üxá†å„¾ú¢¼ôÆKo¼ü‡@€óeÈÙ›³àIÈ“Ý ê`Ç®ïòß½ý0›WdÈ}3€Òøðþwí}í}=G×ãѵYÍ«yWW ý¨~T? D`ÇÎχ®—ùGü#(ú¨úH}d¸•>h4ƒà‡ÙA­Ùô7:lŸÚ>õ¬ç+ÎW@ù-¿žŠ›8;q–E¥XùXùج¤¡‹l<³ñÌÆ3"µƒµƒµƒ"s'æNÌÕ±|c¹u¹UDý—¿Ëߵꎖúãüq""Z«ÖjõOÆk-l-„¶¡þ«ýWõ¢Ý‡^÷½î÷dzgrÏ$$V%V%VA—¯Ë×åƒæùæùæyHÙœ²9e34z½^ptt„ܙܙÜ´Ø\±Òí¥I¥I0°·o¶oÖÜcÚÒÕÉ«“æã@±£ØažPÛÕv`‰ &ÐW‘ãˆ#¸Ìe.ÉÃ0à TPäWQQÁÐCC×Àïñ{‚ëWWJšVt Û¨mÔ³F¿3úÚèk žèŒ:¼ìYö°¨^P{ÔÐô^½´l-[˵@-P @ËÑr´ B M™ Šsœ ’ß)7•›,ênCÇF“G“›Óæ Ò±ÿQþ僖ƒ`fE™Ýj‡ÚÌjûµý(,Œ‚,á%¨UèhhÀ3¦™4#^+ÒŠPXPo«·eŸƒaÃþ¯ò¯Ü•ääÝ•¼ó^̪Î7•Tb7[ ¾¥¾…+X°€ió«-[É7ð |£žQõ®|n_Ïí{ìù|Áþª¹’Àý¾IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.3.png 644 233 144 3212 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü?IDATHÇÍ–ïO”WÇÏL¥ÌlAXMIi C&AÁ&`Ý–"[ŒFŒ6Té+¸}3„š¸nT–4J5×j‰ÐéÚuéDX@ظºÆ(ºi¶n°˜R þx¡€ãè ŒK˜Ïs?û‚y˜Ù€÷Í“sî9ßó}î½ç{¯€ˆˆ$†¿æ s†9aÎ6ÿ*â·”ZJ³þ8gŸÒÀ´Á´áÎo`ቅ'’Ú“ÚõáˆmÌñÑù"üèz†_%âˆuÆ:MkÂöAØlÛl³ü|În¾Ö.k׿B°³{g7@§£ÓALÜœ¸ àYãYÛ˜7â|/_þW}ˆé‹é3=€Ø—c_×J^+yã×sco@ù{åï<|éáKÊ Ú Ž8µðáÃî(Û˜ÇùžoÔ3êÏñHY²Z„Ï+¼^kÛ\ÂðYŽÛ¿°j ØE+§8Eh¢ p"ô<ô¿ú‡Þ¬7mª]µ¨!5Ìj[´-ø!ä y€fZi%nïv§Ýi>Ë—þ ¿µÍà#ÿ¹·Ÿ½Ã+ó6æz x¸Ç=Pku‹n!¨ªÕjµ¥ÞUåª|~¥PÉ*Y%Y¼Îë?±ê‘z„RïêÙz6Aà9ÏAÅ…ñ×m¬ÙXcü쨭É9Î߬_[¿ö-€±Œ± 6ðË'¿˜tL:˜ ­ ííŽÔ   W¹«ÜU![ȲEj¤‘ƈü4Øì…y¼Csø0êõ·vZ;} >¢L""§®C­V«w?Ïx¦ç®È]‘ ‰ ‰Ç£ªìU{ªöÀcûcûc;”ï+ßW¾ÒjÓjÓj¡2§2§2fÖάY!ä™ðLx& xYqnq.$µ$u&u¢6ž®h®h†Àçz|4õѨ s|$T""òO;\œ¾8 sÏ÷=ß«š¢„7»ßìÆï¾á¾ì¾ KÖ>ŽÈã<ä!O>ùÀ$“LF¥)¦˜œ8qFùûé§P Fáý¨¥h)À1£+w5îjá®d$¬cXG¬#¾œ--­aNg´ƒ®@3úbý}ý}àSp´«ÚUí*hvÍ®ÙA/Ð ô Œ2Ê@·é6Ýd‘Ah-ÚMí&h™ÑÓÃ:vi4g4Àz×z×·€ñ°Žýò³É²É¨°2ÏjW´+ú}Çü?+¯€ŸYf£VH¡£S¸q8(”¾]ßNYí²vy^voÀ¦ØM±ÿWùÃw%•[*·DݕԿZÿê<@ÐDqò…|Ú6m~P×Ô5L˜ bóF¼‘oàøF=£þü]ù¾.^Ø÷Ø‹ù‚ý7ôýaô&"ïIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-no.png 644 233 144 1367 14774263776 15077 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܬIDATHÇÍ–?hAÆ¿=5wòǃØ)ØØbÀ69P<D’"¨XˆURš"…•¦V†€ØLLH+zêZh!BÊ9°84&¹ÛýYì¼ÝM1&Žfy3ïý¾™ÙÝH’Žº§ u"u"Õæ©ñxf 3pòi˜?j€WôŠŸîBçTç@n:7í/ǹÍ[}²_ŠùI=×QÅéÙô¬—wù\=}õtæX˜ß/Av.;÷£7Ÿß|ðlæÙ ·¡R®”¾ç¿ç!ÎmÞê­ßxI¾&véKpdéÈ’÷Ò-é º/t_蹬öÀ¥ÁKƒ_}=¤ ±´Ñä5,ª‰Üæ]½õÏø¦gú¡AWW¿—‡.e‡ ËO`ìøØqÓÛžîq6¨×ê5€ÆµÆ56!(%<<ˆs›·zë7žñMÏôC?Ú¹·ÎÕ̕Ldè-4Þ4Þø#þÛn"¶] Ë·£jâ~ãßôL_IC§B¶’­ÔÃJc¥/‚?ìó3!¼É&{‰]õ;xc=Óý8c^íñ[ãQó™ÄØ íÕÐß ;ùþ™X?ô“ ×íÜ‚Ô7Ú7ê–QÞYÉ›÷æµ%iCò$¥•Ö~Âú/â;½¤þ¹AÇËŽ—Á,Tz+½;ŽJ9(ÿñ í7/â»0ýРמk÷?Cõ[õ[TU…`=X?PC»ý%ùÕX?ô“’üEÑû,Õ õB´ì]’Vµ¾âß÷ëÂxÆwz¦úIIµ|-ÿñôêÅ«Qïu)X Ö´%é—~¨1Ç‹øNÏôC?îð¿/H¥ÉÒddìƒD‘¢Ò’ZÕ*$mæ?Ãú/â;½¤þûB³ÇšòËß´ÿʦ½]ØÊ5Ý}LRÞ`Ñ¡•yWàÅIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-3-grey.png 644 233 144 6055 14774263775 15732 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü âIDATXÃ…—PTåþÇßÏsβìnüXLùBŠìòÓ2KÄÐÒ0•âk£N—LÃÄIªk¨£æ—.]„‰ÒÉbDç‹tUàÊQ€ÞËn¢ƒƒâÝ”+A.„Â" ìîÙç¹°ît§éùç̳Ï9Ÿ÷ë|>ïýÌçÌÌÌÌÌLøbzN_è*ñ®xW¼Ëë2¿Êü*ó+þ?كككëçZ®åÚ£oKR€õ–½Ú^m¯æGPŒb“4D :Ðoá-¼Å(7)7)7‘4ñžxO¼×ZLFÈùËÉ,ÿ,ÿ,ÿ†[9;rväì I'é$‰Ÿæ`F7—/\XAËX6ËfÙÌè°9lÛ¼eÙ5Ù5Ù5e½‹Ãâ°Ô_xzâ鉧£þO“¯É×ä£6j]Ôº¨u$-Z­ˆVËü–ù-óä½|.ß/?/Ç›‰ïÖ“õe™Otgð9îͽ¹7K$»È.²K—/è »xÊVj+µ•ûÍ©ŸS?§ÞõÞºŽuë:¨s±i±i±‰lP¦)Ó”i˜Àø@ L`ÀNìÄND &ìóíóíó±Ád0LîlŒhŒhŒ`ïÝ»w?îõÏÕ:µN­[ééÚåÚåÚµ6Ÿ'ódž|7‘€€€>G2¦2¦2¦`€a¾—X-V‹Õ†¿9&“ŽÉàÿÕ?¯^ÿ¼´"aOž„=b™ï˜ï˜ïôîK¬Œ•±2ˆüMþ&€Zhü„Ÿð@<ˆñ¨õ¢^Ü–G½F½F½Ð]QPQPQ %v7u7u7‰W’Ï™VÛ+¶Wl¯ìX~<üxøqiCr|r|r¼X‹y˜‡ycFfdFxÓ×èkô5~ðƒ€‹¸ˆ‹¦0…)žð„'€K¸„Ká!<àààèRº”.Åîã>îÃûTÝ©ºSuÒ†Î}û:÷‰µš*M•¦ê«ë¢U´ŠÖ¤(*KãÒxü2ÇÇÇ…Kç$ÌI˜“ÀCÊÊÊEÙ#c|_ÄÁ›Z©•ZÜÀ Ü$Q%øî‹ï¾øî àtðéàÓÁÀ¹ sAç‚K´%Ú D‚ZH i! Ç“ãËz²¾Ì#óQÁ#xÄáWœ±ÎXg,°æúšëk®co‰o‰o H3i&Í€_Ö“õe™J¡R¨úÌ;Úaí°vGžŒ}2öÉXRäæð j qˆC€8€ÀxÈxÈxÐ\Þ\Þ\¼¬{Y÷²ؾgûží{€MŠ&E8Ÿq>ã|èŠéŠéŠ™}A>—Ïås™øn=Y_æ‘ùjMµ¦ZÙ‘²•e+ËVryÙØ»ì]ö.ç|œóqÎy /á%3çÜ~Ú~Ú~šókêkêkj·+†+†+8g1,†ÅpÞz¯õ^ë=γڳڳÚ97]1]1]™}ž¥²T–:FÏ­/óÈ|"r‘‹\AÏÒ³ôìÌ›)qp@ P IHšÍˆG½G½G=°Ì¶Ì¶ÌØîÚîÚ|Úòi Ðÿlÿ³ýÏ‘ªHU¤ цhC´Œ0 ± PÌz^Ö§ÛévºÀ—ø_’*B?7¶|lùØrÜ‘I‡¤CÈäòø °vØgA‘ŠT¤În•žJO¥'°Å´Å´Å$…'…'…–;–;–;€±ØXl,þÒ÷ðÞ`CHé"]àîcÁvÝvÝvw¨žê©žŸÖß\sýÍô†!ÿ!ÿ!Zúhã£6’Uyyy˜d ض ¹Í0F€Þz?êý¨:Qu¢ê"†ˆ!"ðRÀK/o¾ø`¶š­f+ðÀþÀþÀD/^½@Â6[)r‡Ü!w0Ù½±{c÷F(¬ Ö+þªôUú*}¥£ H@BV±˜)fŠ™$­Á¯Á¯ÁÏ¥}jô©Ñ§ ¦ª¡Œñ8Çãf3¢> > >Üh¼Ñx£hîmîmî=ï ê ê zV÷¬îY èêtuººÿ¨ÈVlÅV€‰‘a—¥D)êoÍßš¿5³ÄLÌÄŒBâ".â:åA Ÿ(|¢ð `°i°i°éëŸmoÛÞ¶½½}~øæðÍá›]““’“’“„<žÍ³y6ìHD"¡”3ÛTÑTÑTÔšjMµ&À£Ï£Ï£p¥»Ò]é@ðÂà…Á mƒÛ· ^^^s2's‚SUPHewewe7›¸úðêë©ZݯîW÷ÿk«³ÆY㬉9A2ú2ú2ú´ -W *ƒFÕxÍxÍxMpòZÕZÕZ!þ|üùøóäKgé,œª¨Šª@ dƒ  .ZZZÎGo޼Πg…³`l ÑÇèc˜¸™v3íf¶”æ—æ—æã[UªGÕ3Ç.p!j "‰ÈÛ¦´˜Óbá=FÑcûXëb]»jƒÚ 6½AoÐó'L‡L‡L‡ð Í¥¹4“ü3þÿ @(B øÿìÿ³ÿÏ@”w”w”7222zA/è¾—ïå{gÇjjj ®=\{¸ö°¤Wt*:#cd,‘CbnÿyÈCž8ß=æ¹¢§çFñ0É'ù$ÿR ]C×Ð5ïU#ÉH¦'jh ­¡ÒîќќÑ¨§çIŒÁ +¬oãm¼ `„F¾“ïä; ¤œ”“ò™¾á]›Z›Z›ê:8òþÈû#ï‹Ç•aÊ0eØ79áG„ùü"²…,ò7t¡ ]ÒZyÕ ½è•na?öc?©~¼êñªÇ«ò6{¾ãùŽç;ßäŒhG´#Zq´bnÅÜŠ¹®ƒ² ì]"uQu¤„”€åGùQp÷ð¡¼l¾l¾læ/´|ßò}Ë÷BžÆ_ã¯ñïŸr”:J¥©ŸÜʺ•u+ àfnæfø¸uÎÈ îëYö{„=Ÿ¶_Ú~iûpìwìwìOýD£Õh5Ú»g;j:j:j„¼ºWë^­{•¿@RH I’};f_ƒCT·r+·D"‘0ù«ùWó¯f|S¿¤~Iýøh,‹Æ°ål9[žúÉ´õú§ÜV<îî¶ñr›&r·p’(Ý[w‰„<Ô£õ®ƒdYAV¼°yú“ãâß»»»ÙÞ×ÙëìuFW->¶øØâcØÄÚY;k‡šFÒH »”&¥IiP„„„¹Â-1–KŒÐé¹Äs‰ç’¼•Óš÷®°"VÄŠÄãîÊî“+–“““““ƒ19£pÿ0ã!·wº½{ÜíÝ ÿå]g³Æ)í=9zrô$Ô”RJ)¬r&&&&ÙDQQ‘Ðé™î™î™~«Ö>`°¤Þùbç‹/n@½Ü¦e@™oô7Àò jw€ÝÞýûy7`$`$@=Ÿy>ó|¦ë ÂŽpø˜üL~&?”®®®‘Du»º]Ý0=Ó3ý^£¸MÜ&n›|64:4:4š>pë½ì¾Nþ–KÀï¬ØØØØØXHî­‰{pîAÞµ,²,²,Âÿ»‚\A® «’2Tª ýÓ‰¡µCk‡ÖúUÞ½=z›Öv¦íLÛ×sãÎqç¸SدX¥X¥Xuh>?ÉOò“åµPB ¥Ðx€,P®€;QÒoyþ`ýŽw³Q‡:Ô¹²x5¯æÕ±]´’VÒÊ„NmœÚ8µ‘-R)ŠEô¶,$ ÉMa•a•a•ëcÍ]æ.sùžÍcóØ<~Ê·Æ 8ñ{°~ã]w»pe!)H[ɲƒìøg¯ãu¼î/;U U U ém¡Wèz²£ì(;ºû—ö­í[Û·Ó€uÇ“ËÉ?âø7üS®$IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-14.6.png 644 233 144 3110 14774263776 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜýIDATHÇÍ–ýOTWÇŸ N‡Ù ´5lq•.M ´›ê ©CÒMIJY–—Òè"Ô¦ÖJS“b¢»íZ*Û¤ZÒ¢ÙÐÁ·@´éãF\m¤Õ¦­Yu¨2Z7ŽÒ åÅÅ™;÷žÏþ0s™IÙ?ÀóËÍ÷<Ïù~¿÷¼<爈ÈC±¯@Ò£I&¥EqÒ†xJIJIvgï5@{I{éÂ_áÁÖ[îx¸Ã‰c+nå'މó'êYýòÄ;ìŸÙ?ÓŠbø}¨^V½,å×Q¼ó8z½w"ðúç¯г¿g?›`lxl`ªhªâØŠ[ùÖx‹/‘_Þÿ…¾ØúmýÚ5°?`@²Š³Š+šà{*Ë*ËüÉþd•Æ8àĩЀ¬6‘€­x,ßoñYü–ž¥õ#þ\ús"PUSUãp¡‹ˆŒ‚ÆÌÆL`€ÞË!šiÆ ‘©È€Ñ`4â#U®Ê›²)€ò*/pϨ1jÍåwÒN;NõïßÇ m m–Á‘Cì}qæÅ‡ Ò‹Ò‹âkûîzVWA½ ŸV£le+€êQ=è˜L1…â{~àPoª7ÔÄÛ=f™MÀ[©¦eºOŒOÐI&Aý9ÊÏoV/_½Ü2¸ëù„¥yòà8œ½Ür¹eŽöOw¦ƒ ƒ ¹«_Ô/êÏr–³ÚÚÚ 393939 ñ£åhF–D^ˆ¼ãoÿxîÇsÜÕå_ž/ø—ã€ã@`åGøˆÈÞ/ þ½ú÷@˜ySoß…Í…û ÷£v 443¯m[ºmé¶¥P|»øvñíx¿á6܆;Ž×®»°î878·;·£þð·Âw ßÉjóKóK36-Û´ ÌÿFýˆº$"òmññÁsjýª·ŸYøÌBBÖ¼nÜ8¸1.äq{Üw|#”U•U•UÍ7î©ñÔxj s0s0sÎ}þäù“°ñï¯=ñÚ„NgxǼcj=ô=Ý÷4SQ?IÚâ´¾´¾ü¹ôìòg—‹üêSÍuúððwÃ߉}Å’‹W,‰TF*#•"²OöÉ>‘¹;swæŠÔî¨ÝQ»CD›ÕfµY™×&üþ ¿È-ß-ß-ŸHåG•­•­"cײÿdûïk²[³[5—HÁõ‚ë"I¤ö¤öä$Ijr]rO‰×ö¡íCÙ-""?'Ù²lY"Úí vP$-5-5-UÄ5îw‹ uuuŠ\-½ZzµTä¸û¸û¸[¤wOïžÞ=qcÁ®`W°K$?9?9?YäÚÑkÝ׺E&¿Ÿ4& ‘O/¶¯j_%?‹<òÁ#ˆ˜N©•ZžJL·éÖ¼¢ë¥z©ˆö[I·ˆ«ÆãŠÈLáLáL¡H‰¿Ä_âéôuú:}"Ù¾l_¶OdQã¢ÆE"™*Se*‘޵k;ÖŠäçç‹LtOtOt‹¸.¹F\#"7Fýþ‘¬?>vã±’.2ë™õˆhª^ÕkÞØ©ü¶¯º<] <ºÇb[$´åÍ-¯lyÎTœ©8S1ë;Öw¬šÂMá¦0„3Âá (w•»Ê]0]1]1]‡‡‡°rdå7+¿}öö#íGEYÔzvµvµÝQ?1c{¿€úwëßµäÌ<ˆ" zÒ”QeªL•AäDäDä˜ýf¿Ù´ÑF[<>×2È ØÃnvÏõ*FŒt#ø‹¥WßTß„c§r®Ž)ÇMÇÍÀÌËúe=^ÇÌõúIý$wÕ4KX2Æ”[¹•̳Ål¼xñ‚2BFøgÔù¤YgÖ±!ì »¸k®ŒÕ±c£9£9Ž+Ž+Ü´êØ¼Ê¿Æ¾ÆnÉê§¹c ƒ€n¾l¾Œ>÷Ç!„ ‚ Æb ˜aœñ¹¹V`¾j¾ŠÎ=cÈJàgMÊš”ÿ[ùqWZw—uWF za.1FQGÔ)u âØŠ[ùÖx‹Ïâ·ô,ý¨Ÿûùuqß¾ÇîÏìÿ%ìáaY ÔIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.8.png 644 233 144 3212 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü?IDATHÇÍ–ÿOÔ÷Ç_whå*h•ô‰8‚AµLYk‹ãŸ÷þ|^Ï÷[@DDÿæ4sš9~66ÿ:’}!ö…ô÷gã ˜¶™¶Ýø-$œM8 ðÄ¥'.郑ØX7ê£ûE"øÑ|F^%’Xб ÃTŽÁÎìÙ±?™Oö‚Åeqý‚ê®ê.€Z?h¥|þàs€‰¢‰"ˆÄƺQoôxÑørìÿøE`~ÏüÓ]XðØ‚ÇDàéÍOo^þ›Ù‚¡å`/±—Ü‹¹£Ì ¹8âT0ÅÆã‰Šõp½ÑoàøŸÁ?«G ySò&Þ,õ–z--³ ƒïrÚñ–ã-P}3..r Ä&šgC߇¾' þ¡ŸÔO-ê’º Ô0­íÒv€ÐDhx“‹\$nï‡Óá4¾ËŸJ¥K‹¡Gþ÷ÝžzާväìÈõ ÀÌgÀw|ªXÕc™Qj“Ú„RÏ+»²Ïí*I%©$ å,äY¬¼Ê‹Riš¦iÌ~ü ,aüµ;JvÌíà©ç¢^¥ˆHæiþfyÏòÞÔ<JJƒ™ßð ÷϶>lÅ* ˆðOOOÀ¨}Ô>j‡Pv(;”%¨¢ê{ƒãÁqµ?è|Љ?ôÓY|ŠŠz-N‹sjž¡G”IDäÂß¡F«ÑÀûãŒë9×mÈÚ‰õ‰§O£Ê寔¿#ŽLjì ö{¤Ô¤Ô¤Ô@YfYfY&ø‹ýÅþ∠ñ±ñ±ñ1°MÙ<6¤.K-L-D•­¶YmVøÏÏô8ðÆ7@½6«GB›EDþé€'?ž„Vs÷WÝ_©ªõñ]]<Ÿy>ñ|«&VM¬š€:s¹Î ¹¶\[® úûúûúû ý|úùôóУzTŠså¹ò\y°âÊŠ++®ÀÀžíÛ!ýÖ\k.¿Ô~±þ‹õª zºzº@{jVà‹ïŠïRlnnŠNµL¾<ù2>S¸¡p¤lMÙš²ûûû!gKΖœ-o·Æ[aMÍšš550rhäÐÈ¡Ž»Ì]æ.ƒ¬â¬â¬bHhL8špÖlËMÉMѼʫÜ7Ý7AZd[dSfÞ1yM^²ÄµèÙEÏŠÜо©ù¦FÆüO<)âÚé*w•‹¬ì^Ù½²[¤:³:³:SĺѺѺQdòîäÝÉ»"jZM«i‘¶`[°-(sÓít;Ý"IK’–$-ñõ5úET¢ÊWù"í®öÅí‹eL$9&9FD5É ¹A–Y]Ñöj{M7Eæ8ÿC‘ë[®_–äÝÞÝ_îþR¤ïW}•}•"ž#ž#ž#"µµµ"w*îTÜ©qzœ§GdÂ;áðŠ,,ZX´°HÄUéªtUŠXj-µ–Z‘ûûîO¤Su꺈çºÛévФL}<õqI™öMûDäuU  L7…“áo쯗Û/·Ï Õë±òò¯å_ƒ–ì–ì–¨©;S¦þL=¬õ®õ®õBëhëhë(ŒWŒWŒW@é¹Òs¥çÀãóø<>h>Ü|¸ù0Ę ÌðÇPóÛÍo0øø×åÞ˽ÀŸo c*÷Wí¯> O‰Òj#6Å0÷¸ä‘Gð‡<Œ²>|@m´EåsœãÀ-¾æë(<Ÿ¶Z[ ´S¹ÿÕý¯zx*¹ö1,·,·¦æÑ|{Ýíu ÕÏúŒv,è ºðë+õ=úà÷4ÒÚUíªv4‡æÐ çëùz>PB % /Ó—éË€_²í ]Ó4M­>Øìį/ ûXûíŒÛ–o-ßNÍãßaû‘óób싱€ ;ó´ö©ö)€¾WßËÌÜ?†f€ÓLGíBG|xð8¨¹þ€gœ,a¾;ø¬¤lWÙ®¨³’º¥uKç\@MÄAh*4 ½¤½DT¯êÀ„ "±±nÔýžoðüsgå#{»xdïcæ ö¿Aõ‰Â?9sIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.2.png 644 233 144 3054 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜáIDATHÇÍ–_LÔWÇÏL§àPêtØÙ‡%vÛhƒ VcXè:©DQ±°m§ƒÛ´fbˆ&:$®¡HJˆ‘Á¸%a7w,)e…*d¥4¤à¶é’Í.èªH`‘ìñÇïw?û0óã7Û}ÝïËÍùs¿ç{ï9÷Ü+ ""/Ägç‹Î«c²ó7¶~Õ›«Þ\÷yL®7Àt‡>ϧžO¼ç½çÍ[¶lÙ-ÿÄõ"6~bÓ‡˜˜ NÄñÇß]zwÉ"X³+!•""¯ž·æÖ4ßÞ©½S»û«…¹ù´ù4õ½Ao°ãé™z¦ž Ó¦7Lo½R¯Ô+•QFY‚ÿA½J¯‚éÌ©ê©jõS1|yyäeà+w“»IsY|„ˆˆÔ÷AñÇŃú%€¹y6<]1]þ³þ ªóO‘Έ¨°§°§°<'='='!÷Lî™Ü303:3:3jû=Òi4\ |ø <¿õÔyêP¹¿óâÿ¾¯5ÏšgÍÍPr°ä ˜ßÆøˆº-"2‚‹#G`áïêЖc9i9iD­sÜ1¸cp´µ´µ´µÀ:m¶Î.züÇýÇýÇ¡Æ[ã­ñÚúÆÞÆÞÆ^XŸ¾>}}z‚ÿ‘×=¯{ˆÖÖFÞ¼¯AWZW,'ÅøÚê««¯ªKüë~ÊýP%ñ{ô3}Lƒì¼ìmÙÛ =ØlBt*:‚±Þ±Þ±^èªèªèª€Œ@F #=m=m=m6ÉÀd`2KKKÐUÑUÞU¿xEE‡Þ 7Zn´hkµµ`ny.ú\T]ð>ï}޼ɟgÎÍœe®\ûØÎ6ù7ù7Aksksk³0´Z -BVUVUV ø|>Ûn6™Mf“-ŸpŸpŸp'úÍ×¶yFýzzÛô6`Þëð:Ì›.Á¼b^qÜ]_£¯‘LÇÏEDÄ'ÿŽ%ññGË—‰¤^KíLíéïîïîï 7†Ã"áœpN8Gd¼o¼o¼OÄYê,u–ŠŒîÝ=º[DUPENçžÎ=+þ}¸>\/rïüØÂØ‚HÚÆôîônñ½:ä¹à¹ B‰±ÏØç¸¿•ƒ!þÚÜÙÜ b5ßI4ôUèJè ïÞ9¼ú¤Oúò·æoÍß …I…I…IãÊqå¸ ò ò ò§N9œ   °Ç¹Ç¹Ç ã· nÃæŸ¼ÖñZÑ¿ |S÷M:Wç®Î±Ãª1Vnå©âS+‰Ø ËÚ²]Ü ˆåÿ1æ˜Cq͸–¯¸ ¸Àêgõ}vSîI÷¤æÂ¼£ßÑí>fÐÛõvÉ HÔ¥) Œr£Ü(cØ6†Áˆ#ªH©"0šGÍ£ v«íj;Mƈ1ÆÐ“Ù'³,Õ1|Õs7ën€û®û®æâ²ÕÇþ§óïOÞŸ¼Òû™ïÌ0?0?@GŸàC¦˜fyÈCàa|޲Ä ­Èqs¯¹YãKãKàû8þ“ýŽýë¤þ«óÿè­´Þ.ë­Œlª¨"ÕN±ñžñQP×Õu8À–-ûJIÄ×[x¾ÏŠãó4ÿ.žÚÿØÓùƒý¶òD+B—ù˜IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-21-grey.png 644 233 144 6133 14774263775 16007 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—{PÔG¶Ç¿Ý¿æá¹áaFyˆò "\E©b!4܈D2UŒa Ebá£$1Á…*#Yc™ÅÁdCK$*PÄ`ñŠÁ›­X"©AH7Ãc˜™ßüúþÁü0å­TÎ?]ÝÓ¿s>}úœ3§IQQQQQܰ$ÓK—$‰5}Yôeї̧øqñãâÇ[C™;sgî§Þà}y_Þ7z¯¥ÁÒ`i`'Q TB„ !zÑ‹^{±{ÙIÙvÙvÙvR(ùUò«ä×»dŠL‘©#ºcÞǼy·ü§$»$»$›Œð|@R–8„\ntp6a­Š…b¡XøÁ:o·Î{m(n,n,n¬6ZG¬#Ö‘æ/D-D-DEr>ë|Öù,®E'E'E'‘ÂiŒ4F lðØà±Áçâïâ~ñ{Qß²~‡=ѾÈ#òIÜÂ\˜ s²HÉ!9g¹.€ øþâ|Õ|Õ|•¿‡g³g³g³ý@RoRoR/µ…w…w…w‘—d…²BY!ðÞÁ;Pb X +±+±`QYT^êºÕu«ë³µ†´†´†&’'’'’wŸQ(”qr{Ž=Çž“x–i™–i Yt ÞÞÞÚ™™™™Yõ ·‚[Á­ø>È:c±Îøß[“º&uM*¿)w1w1w‘Ë_ò™—%Ë’eÉà…mÂ6a”KX4‹fÑóa>Ì`M¬‰5A)K—¥ËÒÁ‹ßçZr-¹._Ô/Úí‹<"UÜQÜQܤ>R©Ï‰› ß-|·ðjàË/¾Ì¿¤ÍÖfk³%?ºF¹F¹FáOB”%D°À $ôYú,}@9ÊQzROê2I&É$@Γóä<€yÌc<‡çðà6ï6ï6?‰úwî ÜÉ¿$ÚyD>ÊÏñsü\Êk½µÞZŸ½Þ3Ý3Ý3eÔeÔeÔIÄ1!Á† ¾Æ×øXXXx¯ãuÑ ÑXÄ"å¤ÊG>ò^ÂKx `~Óü¦ùM~ðƒ\DýUUU’jÏ Ï Ï $òˆ|”…°ò·ÿ¶%Øl €úžúžú’Ü>wûÜís89¹Ìjf5³à³ÄÏ?KNŽ;9œˆ;w"hónónó‹XÄB»Ð.´hG;Ú›ñ7ãoƵêZu­À0Øß¶¿m.n•n•n•pRw¨;ÔHyD>ÊñA|Ð庻»ãdÄæˆÍ›I9ŽàŽ,ƒâz÷õîëÝÀXëXëX+ ÓÆi㵇ÚCíÔ×Ô×Ôׯ8cœ1˜ Ÿ Ÿ tê>Ô}\¼y= A4ˆaYh=­§õËS§ˆ„ˆ„ˆR.òˆ|ˤeÒ2‰ÏBSBSBSP¨¸­¸­¸FeJrŠœ"§S„)Âl Û¶1 X%¬V €×]¯»^wæÔæÔæT`T1ªU®¥®¥®¥€÷¨÷¨÷(0³jfÕÌ*€ma[ØýèG?€·ðÞXËbY(ªÕŠj,ømöÛì·…“““8EqÇqœ„ÐKô½´|2ˆÀ''ß“¹'sO& nT7ª¥2´y´y´y²7doÈÞT=ªUàöºÛën¯Ûm?´ýàµÃk‡×ÀÚgí³ö=Ñ 8è@Çûô5ú} À\ÀB9_Ηóeµ¦XS¬)ýüAþ ¹L.“Ë`lˆ ±!@öHöHö0®4®4®>:÷ѹÎíõíõíõ@ºOºOºà+÷•ûÊû=û=û½ßå"¹ñ'þÄÿ7ë˜À@úHéñç;æ;æ;ÐOi dµT^*/•—òeýÞýÞýÞ¬ö¾î¾î¾ÀóxÏÃLTDET@WbWbW" Û«Û«Û ¬^?¼~x?üýð÷ÃÐüÐüÐ|Õ¨F5@ÓhM{ÂC(¡„ØŠ­Øúd]Èr„p˜Þ¥wé]S´]mWÛÕ)†9ÜaŽˆ‹ˆ‹ˆ£ï+*•ŠJ˜X+`‘JRI*xžüáÿ'})[ÇÖ±u°PJBá\'Ô u‚½ÀPg¨3ÔIþ®Ô(5JMMI°)Øl:ôù„fB3¡!_C=ôï…3f0ƒÁ„‘0F>»v!ìÂÿî˜ÎœÎœÎ\K—n8ò»ÑäÑäÑd{Atltlt,Ýáø+´=dÙ "RH!]!5¤’ÛúÛúÛzöBkikik)ý×3ÑÏD?=´hÛgÛgÛ·ë屬±¬±,OZH i!{rXlœã%a…°BX×Î_:éü°î·î·î?ü³»³»³»áRococo#WÖ´³igÓNöÉ#y$2á+á+á+0( €`3l†Í„'<áaÓéÇô¨iŽlŽlŽ„«óˆóˆó Ä ±BìáèizšžZt„â'Ž\Ks‘ˆ1äx’ÈS‹£î–-Å®½€l"›È¦v,ÅØ÷uKòw »…Ý?~:ü4¶ =BÐ%]K×Òµ°ð…|!_ÙùàóÁçƒíkF6ŽlÙÈ=”GÊ#å‘eqKIsàG¡\(Ê%ŸÀ#Œü[b3TRRRRR“èQ8,↥Á^°ôæ‘|BÎ’³äìzª¦jª>Ð-´ÐÒs¶F[£ß7­›ÖMë ¤”RJ1#z¢ÅÜbn1 CåCåCåÜCùQùQùÑÿ\³ [†-ÃGÏ<|ñá‹_€b…UŠ€Ëõöéì|jƒÒ¡ û±ûI]èÕЫ¡WËvÈså¹òÜš’)ß)ß)_Éô7Eß}Sd/À¬Á¸vytytyà‹[wnݹu‡d){”=ʱàçÿ É”dJ2Í›ƒb‚b‚bè¤ÃÞŸ£ùi.î÷ʉ#ÉxÇ´‹91'æDÞY7²ndþi_m_m_ýo^$ ’¥ŸMMMô¸:Ý=Ý=ÝÍ>ê¬ì¬ì¬´o™³ÍÙælÜ~i¼4^PÅtLÇtÿºdq˜Ä$&…•â 8Å?ÍCðò;±[Œ&4¡É~Œ5°ÖÐG¯Ð+ôÊÿ-¦-¦-¦ ë¤åÒri9íæ´œ–Ó¶¶_ ¾|ek‚¾Oß§ï#×/ÁKðbz€ ¿ÇAñòTìº:b÷ò‡<É]’M²IöÍà¥GÜÂOá§ð£Ýœ‘3rÆa?á”pJ8µï—ž]=»zvK€[g±±4ÿÇÿPQÖ'åÖ½ÒIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-74-grey.png 644 233 144 6157 14774263775 16025 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü $IDATXÃ…—PTUÿÇßçÞËþ¸Ë\(ˆ@ZYD!LŒZòôL¨üHÍÑŠ-åa,FËy u fœÐHe2'ÓR Ú‡0 ŒÉhR„‘_‹~1ÑUÖvïÝ{ž?Ø•¦gzúüsæÜ{ÎçóºŸó>Ÿs.Ñëõz½s0c晆‰ç®s×¹ë´Qÿ™þ3ýgô‰Â;…w ﬣjª¦êoˆ~¢Ÿèõº­ÞVo«§Å¨D%*I´ÐB  ýèð:^Çë´Xž*O•§’<î6w›»ýk%'ãdüŸ¾¾¾-W‹¶m)ÚBLb$‘”é‚“kóp9–c9ó¹T(J…Òû¤}Ò>é]h(4>¶›ì&»©ù¢5ÒiŒzGuXuXu Q«¢VE­"y1n1n1n@´W´W´àê»Þ»Æ»æ»ü=òïŒçŠïâqñqÎ ÆQêA=¤—IÉ"YA‡Ù 6ˆ úîøäéÉÓ“§ç{y7{7{7;v­ê_Õ¿ªŸ÷,îYÜC^çÉóäy°"ùÈ+¬°x¯àOâI< «-À` À =í=í=íT8¯=¯=¯•vÝîþs÷ŸÛtˆâƒø X…#Ë‘åÈJ>LuTGu×_& `âÈÞé½Ó{§´£íÿÇÕsõ\}ûY»`ìÂü¿‡‡‡ŠËÓ´iÚ4-÷¹:E¢NA0xðà!J5RTnf>€4¤! kÉZ²€?üá!2D† b£g&fb&¸V}²údõIñåkm×Ú®µq?É”2¥Lùÿ߈©bª˜ºrVb%VÞ|Hö_Øaÿ@ô=EÏ“¿N®Ÿ\?¹~Ë’c!ÇBމ/è’tIº$®­hE+,pÀ<°«±ÿm€dô =H°Á@òI>ɇ8pð8Þz¼õx«øÂÀ¶mÛ¸Õ9Õ9Õ¹Ï.q¸܃­QŒ8!Nˆ)Ñö:{½nËï5Þk¼×PMº1ݘnä\±L>:}ÂVa«°°[ì»°GÙ£ìQÀtÄtÄt ƒ`˜Dò¹d.™ ˆÝb·Ø «…ÕÂjx¸ü§¦¦rŸ{§{§{§S‹ÇÅÇQ-ÕRí{ë• T@‚*A• Âª9Kæ,™³2[®-×– ¾¬¬¬¬¬ 0k̳`Õ¬šU\%WÉU´–ÖÒZ`EÊŠ”)˜Mx1ŠQ <|õá«_ŽfÍ<š $W'W'W1ˆA à1çû9ßÏùÖÄ5‰k×`Uõ¾ê}Õû···€÷Ö3¢FÔˆšg¶©GÕ£êQGœˆ8q‚”;¿T&_(_(_¬«_W¿®Ȩ˨˨6Y6Y6Y€¸’¸’¸À®±kì ä“OB>ùoE|“ýMö7ÙÀ ó ó 3€p„#üwÞÅ»x²ð„ð„ðRîâqñq¶1Û˜m 'ÂRÂRÂR§ìPv(;`¥94‡æ€'È€fH3¤ð)>ŧ’„$ CÓ¡éбˆE,€yoÎ{sÞ›³ñÎý9÷ç\ ?²?²?ðVx+¼€cƒcƒcÃì8ÇSާOSê”:¥ÖÀ+W ïÒØ¥±Kc8À`?öc?Ñ2ULSõhž_ãk| @€CpÀ‡øc/Æ^Œ~Óÿ¦ÿM$-JZ”´h6°i·i·i7Ð"o‘·ÈgWDöƒìÙí¤´ówuU g|f3³™Ù àŽáÑ2¬ëÇúÑ/-K-K-K1$¾-¾-¾ –4’FÒŠLd"`£Ùh6 M´‰6­­­@¼o¼o¼/ÀgñY|ÖlÜºŠºŠº @»C»C»ЦiÓ´i€½ÉÞdo_ÁWðON䨳ËN^š¼4y CL0ÌÓ/ÅAÅAÅA±tÈwÈwÈ—~y¥âJÅ• ‹°‹0åxÜñ¸ãñY‡CCC€p^8/œ¢tQº(Ýì{Ë!Ë!Ë!àö3·Ÿ¹ý Ðkê5õš€’Ú’Ú’Z€Q0 F4E6E6EÍmÍmÍmÃ0 Ã`ÊXe¬2VÆãˆq(†CŠ!±”A:Ò‘^PÉé9=§'y-^-^-^Ž`óÓæ§ÍOƒgËÙr¶ÈåÒË¥—KǺë~¬P«þVýí,¨{“{“{ðFøáo„[…­ÂVx©å¥–—Z1NŒã€Ø†Ø†Ø žçãyØÄJ±R¬ß0·anÃ\i91#1ââ â8.cžh}¢õ‰Ö÷÷Èe‰²ÄÓ7ïGß¾Í^«~¶úÙêg;ñ]õÎ6Êò£<àŸáŸáŸñ»:ŸBSh Àcü}ý}ý}yqóâæÅóœÿãü÷"÷"÷"À§Å§Å§T£ŒQÆ@^›Y›Y›)YGÔ#ê5ó“ì#ÙG²º7ð0¼K {oì½±÷€Nt¢ÓÿˆÛ·;nw.('¾˜øbâ‹ùºäÔäÔäTš”òNÊ;)ï։͛'6ƒ*¥ @Ø*¶Š­pwqÀ$&1 Ð.ÚE»t£Ýi#m¤ °ê­z«àWò+ù•°^¿2~e™§&NMœšÀ¿y9/çåÓÏQ–²”ÊD(BÚ»a*™J¦’ý…)aJ˜’‘7¥AiP̲ó—ùËüe }¼}¼}œ.êÙØ³±g#θŸv?í~SL<ÏÄ AàøB‚²Ž¬#ë²ì#ûÜÃ=Ü{hyÈ?äòàø¾ƒeDFd b!–=YF–‘e½ÛQŠR”rÎkž#fæÞȽG“Ãäpk“À$0 »êñ^ÃkL™ÁÓàið³Í‘æHs$xòy‹¼ ˆÀÿqÖw¡ ]nánÁæ’RChChC¨cçxÑxÑxwD$’) )))>ô P€rƒÄ ˜ìºª0Œa ‹W‘‹\ä’ú°Ú°Ú°ÚÒµ B§Ð)äÌÕÛ«·WoŸÕ.ͧù46ô =¦1inpƒ@£i4uJCÞaì0viR§¼SÞ)gKU¼ŠWñ7§ígígígw¿µàjÁÕ€©‘áéŒsÒju¶U’»ä.¹Ã³ëV×­®[€=מkÏÝý¾J­R«Ô׫ú ý†~[ژјјA“HÉ!9K§¤SÒ)P(¡„ èú "‰ˆ©{Æ{Æ{FœiŽhŽhŽ€§Ê¤2©L€´TZ*-ÝýþŒônN;¥xĵE]q­˜ó—DîÚÝκ[Šf4£Ù±“,'ËÉò¤µ3¿ßÕ ÙB¶-íØ$m’6ILüâ’Å%‹K*õI}Rx&” eBaóÄ<1ò|¼àãŽÓ2Ó2Ó2v@¡ˆPD”ÆÎlš]?IåR¹TÎq®¬ëö(*****‚Å•Q8<ÒS»;Ú=âÔn“È$2‰»ê¡ƒ:¦Ì ƒ f›+Ìæ ðÎÂýÀ•‰–©–©–)Éz³üfùÍrv@±G±G±çjƒmÄ6bÙshàùçžœ€ÁÎy¼ ÐÅ÷ôÀ®¼ÓÁNíÖ† ;v®t­b›b›bÛ™¢q¿q¿q?Îü•þ+ýWzÇN„ !ðìñêñêñÂ§í¿´ÿÒþ y™ïãûø>@ –‚¥à¸ÜFnãÔ MŒ&FÃŒ9ãýÝÙNý‘‹ÅŸXBBBBBDg·‡Ê¨ŒÊÈ?L M M ñ/Ç<Ç<Ǽ‹¢\#×È5iew“ï&ßMö:gî5÷š{é‡]'»NvtÄM„ÀæºÅ»Å»Å¿@+h­ø¢rÈ!g¯a c“žt­€3QâyþÂþD»…hD#´žÖÓú„A¦†©aj¾×L¿8ýâô‹ÒB·r·r·r¦—Õ±:Vw¾mAÍ‚š5«ŒƒÆAã ùVò‘|$zÜé×à´þƒ¿°?h×Y.ÈAr¸_ɲ…lùam¤´ñŸ¯(•Ê@¦—f‡Ùá‘@é€t@:}«oC߆¾ À 4N®‹åÔ_qü {¢ômͪIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-31-grey.png 644 233 144 6146 14774263775 16014 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—PUU»Ç¿k}8?(äW"tD~‰xã l€+87d•a¼þ`,´^{)yAè‡éË})³Œ¤îMÅR‚€€h ¼„©ïàˆ# G¸§ÀñãБs眽÷ºp666MÏ?kÖÚ{?ÏgÖóìïz)+++++ƒ+mnq  Ü7Æ±Ž²³egËÎ2ïŠÉŠÉŠÉÔPæÆÜ˜Û±ÿä}xÞ'z—µÅÚbmao¡µ¨%%F0‚ cÃvav±·YŠ,E)á~æ~æ~¾QK Ä@ ;]îUîUîÕu»2¯2¯2èù>€ i‹âe—+]ŒE,béy±B¬+ÄË6“Íd3-_[ÑZÑZÑz^gÓÛô6}ç¿ÌQæ(sTô_O8Ÿp>öè”è”èR#‘ÇȵîkÝ׺Ò\z.½/}/ù[òïˆ'Å—x$>αƒñÌ…¹0q;) ¤ à„,@ øö#S©ÎT·ÒÝ£Ó£Ó£Sx1e8e8e˜ÚÃÂÂH†¢DQ¢(¯à¼5Ì0à ùÈð8Çã0[}­¾V_d ô ô ô0û7Áß,¾8³qfãÌÆÜªÔꀿ(…¡@(H>Á Y!+ÛN@@@ãIéBéBé€ô Ç÷Q®…káZz.Ø,6‹Í²2=ð™ÀgŸác³‹²‹²‹¸ó®÷]ï»ÞG äC^¼)Þo‚#ëÉz²À£x˜Ç<æ<…§ð@FÈiLcܜ˜˜ FÞkx¯á=~ûèw£ß~Ç]sR9©œTÿ÷ŸÅgñYë·b=Öcýø}ªº®º®ºȽåÞrï7»Í_™¿2µ2=pSà¦ÀM|Fa^a^awmYÔ²¨eQðsÅ\1€vØÁÑèô§p §¢#:¢È ™!39EN‘SL0ÁOà <¸š\M®&xJþ·n ÜÂgHñ%‰òóü¤H<å5¼†×üÛn·i·i·i¼Mjpçpn G4Œ;;;};÷íÜ·ˆ|9òåȗƀƀÆÀþ¥ýKû—Àtútút:P[P[P[|ñuÄ×ÕP Õ`Éh3m¦ÍKS§ðÄðÄðDR#ñH|Ô:kµÎâcÿãþÇý£DuTuTufÖÊZY+8ÉÃcõÕ?VdTeTeTÞ¯y¿æý444 p<Çs<`·Œ[Ær•\%W/?/?/?`¹ßr¿å~‹gñ,þ(žÇóx`ÛÙv¶œêUÕ«ªWa–x$>oà ¼A‚éEz‘^\ú\ïñ=¾ð:^Çë@ÖBÖBÖ`{Ûö¶ím ÖVk«µwÜï¸ßqÖ¼³æ5ï.·\n¹Ü˜7ófÞ@¦>SŸ© ?~2üØŠlE¶¢ß€Ê ƒ @úÐ÷ >ÝAwÐ>ćøS™ÌGæÃêëŒëŒëp—‰‰ 2ÒA:H˜CN¤ª•¶ÒV ¦0¦0¦ˆ›Œ›Œ›F£F£F£½QoÔ¢'z¢ÿ ÐnìÆn€¬$+ÉÊ߬Ï`3KòÅ$|SŸ©ÏÔ‡»4Ò@VO•ǕǕÇùê»^w½îz±úþÈþÈþH«±«a±Æ[ã­ñÀ'•ŸT~R Œ_¿:~ˆ:u6ê,1•1•1˜“ÌIæ$@÷©îSݧøJ(¡R‘ŠÔëbX àÁƒ‡e4s4s4ÐNh'´ø‡ò®ò®ò._M‘ld—×re\WFJºâºâºâ„@ƒÝ`7Ø¡Vä(r90N·L·L·-'[N¶œ´­Ak.e]ʺ”È6É6É6~~~¿]EWÑÅ@1ð7j  ´V>OçÓ¡nÓ¶iÛ´b,Ñ-Ñâ"9ɶ™¶™¶™.»P±P±P´ËxÀxÀx òï“â¤8) £Ã£Ã£Ãéf Ó0 ƒupÅàŠÁàzÒ{Ò{Òƒ¿Áßàl~r󓛟4šM ^/ˆFÂH0ä9ä9ä 6ÒFڀȜȜÈ0OâI<¸¦ÕM«›V‹æÁœÁœÁºO§ŒSÆý°ÕÞkïµ÷椑ÒK,ý@/zÑûÄ»òIù¤|ò²j¾s¾s¾seaòµäkÉר†´{i÷Òî‘K‚U° V0~¿ƒß"·È-r @ÛhmPŠR”8€8Àžðlkmkmka°FX¨jUµªZ˜oåÞʽ•‹œº¦º¦º&´©t*J·°‘ɘŒÉ¢s‚„ îáh-­¥µ²ëèD':'bÄX1VŒ-x_Ý¥îRw}‹žý=û{ö³Õ¾î¾î¾î䳰ٰٰYdÑšBS &$ƒdì»Án¤˜“â€```€“à$8 Àb;ã}õ}õ}5\Ú í†v(Ÿ’Oɧ8#1ãaiHCÚàVͪY5ç+KLLLLLd"ÉHæŽÐRZJKGÑt#ÝhŒ ‡„Ciu‚NÐ |BXwXwX7ý»ªDU¢*‘u³nÖ Ù@6 ÔPC ÀlÆ0†1€…°+ %¡$ÎMb“Ø$ ǚƚƚ¸wÔùê|uþg•AÆ cñ¯ÿ=“?“?“O.@ -´"/õ£ÎÐAÅ(F1i ý"ô‹Ð/ª7+w+w+wVið4x<¹¹¿¿?á t´b˜€À€,`€ (¶Š­b«ÀH6É&ÙP\Ñ^Ñ^Ѳ ½í½í½í²jg/g/g¯ñÛyÛyÛùCGo—ß.¿]0-Ó2-–9✑@ÍŽñ¢øˆøˆø–õßë¿×°ÛŠmŇŽ:»9»9»]nnn•UwléØÒ±…m E¤ˆA!žωçÀ ‚ *€ýÊ~e¿„'<áa™ÒNi§´ø¬3¢3¢3ËœõÎzg= ®׉ë¥U´ŠV/8JñÝE–&D’ Ç•Dá˜Zº[½X»ÂAKbIì†Í‹5öm“}¯}¯}¯¸?WÌsEšVVV…,qH‡ ¦!4„†ÀÊ—ð%| ï½ô~ð”þiýÓú§ew”ÊeDõ_š¯‰5bXýëÈìóRÆ*+++++a”vŽëRJÂÁÅ;÷.9AN—šiM¢I/¶ …(¤'[í­öV;¿wîôÜé¹ÓPSJ)¥øUÚ‰.K—¥Ë"šÇkÆkÆkdw”‡•‡•‡o·['¬Ö‰Ãÿ¼óìgï< 8%…UK€Kzû°0?ô‚Úáà{Gí6ý®v} >nîó²ÏË>/::úeîîîø¤çzÏõžëd»zH=¤’ÿen·Ûf‰ÓÄhb41tÖïߣåa.þÀÕ¼c:Àœ˜s"ûô«ô«ô«ð? a…°â_¼B£Ð(4Ïü%ù—ä_’Ý¿˜œœdÿÕ¦ÿLÿ!~Þ>oŸ·ËŠå òyÂK¾ì4;ÍNÚ¾ø³ÉF1‹YÌŠKplÿ0ÁŸØÔn:Сœµ°Ö’8Bi#mü_ÍBæBæB¦¸J^#¯‘×ÐAY¡¬PVøÍwAAA©‰Úíˆv„|-.—‹ËÙG¿­@óqPü‰=T»¹Ê¯Ü ’GòH^wë`¬ãoù*•¿ÊŸÊt2L7á/‰ÇöÞÚ:´uh+°©u–KËŸqü?ÈtÕ“÷`gIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-46.png 644 233 144 2516 14774263775 14710 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]HTiÇŸ™1Gg&s]Ú24—Jèƒm‹ÜnRI ¶°¢¤r#)2"Ȓ° \V1–‚ºñ£]ì¢(+¼hK M­ÁeI±…ІR,×ñsÎyÏo/fΜ1hÛËÎÍáyÞ÷ùÿþïyÏû! ""É‘·€}‘}‘=)ÛXù„Í ›¿mÇWt°í°íø«æ]šw ÀÛàmPýVl¶›ýcëE,ýXž™—d±Îζ¼H\¾•¾• ©á¸¦o'Þ×ààƒwn5ÝjâºÝïóÞç›íf³ÞÔ‹Õ—ªø"0§uN«í%8ãñ"^^y4ÜáïL(ÜR¸àãð€>xðyÀc˜ÏpLl¶Gú›õ¦ž©oòL~Ø@JnJ®l/Ú^”X.èÿÊÓÊÓL^è6UTáÝ¥»€_´€`›êT,cð›qÀ8F¶X[Ì4?k§µÓ\á ´ˆ^Tßä™ü°™=·µù°+aWBÔP†Þ©w¨#ê!0ŒƒÆ>cÖs’“œuWµ¨+müdTÕ$éez!Чô)`2¢å™|‰5”õ+$cq0¨êQÝ™P;ÕN&ŠdfÂS5]:]:] £îQ÷¨Û2zzzCÇ†Ž ƒÐÊÐÒÐÒ˜´©jQý(Ïä‡ýDŒ]é„Cg1«ÕwLiï´wÖÀõ¯t·c ¢·¢·¢ 2 2 2¬üÞâ½Å{‹Á“çÉóäÁ†Š *`¤qäêÈUKÏø3ÔêŠáEùa?öðw[wW$çDΉÈgÛ÷’`»o»/3Æ×†ÇðˆÍ1âwŒ‹´ ¶ ¶ ŠT¯©^S½F$¥/¥/¥O¤ël×Ù®³"íª]µ+‘_¯Ç'’åÍòfyE¾ÈÈ(€—R'u2åÍ⯻kIz”ôhu¶HîÆÜѺzI°­°­§}È>nMMM©YX³°f¡ˆ¯Ï×çë‰+Š+Š+ ÎÎÎy||)l)l)l ¼¼¼YÕ½ª{UwԘط;ÊåâŒò¢üˆðÎõÎUÏ`Ø?ì·–½ž§-×–[STë®u׺ÁqÑqÑqÖ&­MZ›i•i•i•°urëäÖIÈõçús-Öç¬ÏYŸuOëžÖ=µòé[ü°»ˆº§îÙž‰hÛ´mÑ¥ØKíùö|k„›27enÊiv6;›"K’—$/IqwwÙ]»»vw­ÈëÆ×¯Eê½õÞz¯ˆÿ¹ÿ¹ÿ¹HzZzZzš¥'Ír^Î[<‹ñþÙzOÀõÑë£Ñ³ôkú5¦ &@•©2UføAÆ Py®ò\å9+ßäjr5¹ ›l²FW£«Ñ³*¸Ìe C/ÑK˜¶x&?ìçÓ«òͯYSb[Œ|#´v­]kuSÝT7‡<ä!¨Sê”:<á ObŒôÓO?p&¼Ï™zèÚíçWåç÷1T±*f‚ ³£Õh5Zc ™ˆx¯âA?¬ÖƒúA­V«?ðãPGÕQ&Â'Àg÷±ÿØùÑëÔ~µŸPtÄ3 ÁYg%(05+o€*Q%„,=Sÿ“;ÿÿ<+áð€6¦è{ô=LƒÑat`ÃVl¶›ýÍzSï³gå{»øbïc_æ ö_°ðÐ=¤ÅòIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-162.png 644 233 144 3077 14774263775 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜôIDATHÇÍ–oLTWÆß 0¤5ÁÈÚV–®Ò¦ZßLÇm,Y™*M)˜)a©%kºéºnb'Ä(fce³4£«É•ÖDÒj!Óˆ‹H†ÁiÒºEMñOw†EaæÞ{~ûaærÇÝìwï—›÷¼ïû<Ï=çÜçy!þ°¿lÙž‹í¿¶ÆÓÞI{çç‹Ågt°UØ*nÕÃó'Ÿ? °òüÊóƈ›y³>±_ÄÂOä3Çå±RÛSÛmÅñ¸*ߨ|#mU,nºŽËŽËa ö|¹çK€/Z¾há· <,~X VlæÍz³ßÄKÄ—†ÿâoŠ×6©Ï¥>'Ù%Ù%¯ü.V0þ ”½[ö.Àƒ¤IÊzH']sÌa>Ó ±™×›ý&ž‰oò™ü1=™og¾-åUåUŽs±†‘V4Ï‹žM¾èe~ÁÇ|L:-Ú×Ú×úýK´ª=j(¿á7üÀQåR.ý~ˆ%NhÍZ3(µÔ’N}ÏÏ çS&Lµ”†ˆÈg[À-nYäSuÚí¨ý;ý;¢ñ„b»ØF‡Ñat,Ïê¸:®ŽƒÚ¨6ª ~£<ʃºé&ªþ lÊj8†îUîUÀ¿M~IÜl¯GМK†ÑùÑyॠ†Ô á©…Ô…Tˆú¢}Ñ>KHt::†ÐþÐþÐ~ˆ„"¡H(!¿:º:ºBBB úÇ¥Ö¥VâéRzGŽpÌ9ææ’M=ö˜¼ßçKpçá‡Wh"¹é¹é*Ÿ:-_Ë—¯Ÿýaöq¸\%9%9"=·{Æ{ÆeùÙ²;ewŠHΓœ'9OD¶mÚ:$rwøîðÝa‘ʃ•+ЬûÙº5ëÖˆüò'%I%Iâ˜ùçÔ7SßÈWRœ{(÷ÊçvMmMí ÍÔöf‡lÙܵ¹Ë¤³<¹¼¸sq§DJ§J}¥>±ù¿õßñßÉtgº3Ý"ƒÝƒÝƒÝ"½z/ô^ñy}^ŸW¤èFÑ¢"{÷6î¹_q¿â~…ÈcïãžÇ="zPï×ûÅÖz¯íDÛ ‰˜|ê/o¥½•fò¿Ù!q-ãšjg>ðjàU`$¾Wö…F!è?Õ³ô,ȯίί†¾¼¾¼¾<ðn÷n÷n{µ½Ú^ ÙÙÙPÞVÞVÞcKcKcK † ûX÷±îc[˜[[}ÿºöùµÏ­%7ö?¸øà"˜zV®X¹Âø¦œþhýöJSÆ”Õè¼ê¼ê¼ ýãýãýãpiâÒÄ¥ ( l|`|@4îý ÐÐ…,²Èb Efâõ÷÷‰2£wé]@dÙùSÝ©æL=åüÿç¬Äó’祄³>åSÒ­%Ð?Ô?d Ôuu6°b3¿¼dñþå³2ŽoòýÏYùÌÞ.žÙûسyƒý?ó;ŸÕ9IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-154.png 644 233 144 2757 14774263775 14777 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܤIDATHÇÍ–aLTWÇïLia,R¬Ü€â¢œ­Ä€Fטš MÅÂ4;mHMcÒ¬™ªcüà‰ÙK:j¬mÀ6!1…4Y—ªM©Û%Á8јFRMãv;ôCé”AJGg˜ûîûí‡y—7n³ß½_Þ;÷œóÿÿß¹÷žw!„(´žœ+œ+œÛùW{>WVÿ#cwàxÝñú÷ƒ>yá€%]KºT͵_Çgç aãgóéyQ(ì‰Ü‹¹Û,û}xsý›ëóŠ2ö‡ƒàêqõ$$ì¹´çÀWŸõ9û!v#v`zÛô6°mí×ñ:_ãeã‹÷ÿ‡_x¶÷Ù^Çû\îsB@Ùö²íå2ÿ)‡†ú†z€ŸžùéÓ Æ$O¾¹ ˜c=dÙÚoÅë|§ñ5ŸæÏè°ìåe/ Þ&o“«3“ù;2X,Ñ|éþÌ^ö’Ïy–aÃgøH™)5 ÀüYÅT ÌIõ¥ú¸n¬6V“©¤Nðoj<‚ÅÁb@j>¯Ïësuj=öR*!„8] >á ‚†ÍfÙ"[Àü·1"¤-‡É¢D‰Db#˾O/½˜æ^õªz•4ÐFdbÒÃà+òé ž®ÍZJ!„¨lׄkb.FŽ>n°ÌoÍoy”ˆ&dB‚ü£\!Wؼ³Kg—Î.…‰þ‰þ‰~˜ L& ËÇò±—Ú’z7õ.̬ùµõ×VYÓ;¸1:4:®q×ø\ŽÖc ëâÿÿ £6˜[ÓÒ`ú£éóÓç17ÞÚ‚+G®¹rÄ&,M”&Jànv7»›¡ª±ª±ªî®»»îî:;®¥¬eyËrØ>S÷|Ýó˜ L->~ð¿åKW®cÈ6rˆ?u—v—.¬Ç;‰©Ùg?&åiö<ûìúýƒ~˜q͸f\°rßÊ}+÷A¨#Ôê€ÈXd,2f ¨¨¨²óë½õuõuv!Õg>¾ëw‡µ°‘C Âaó"c± bI ¨UÆŒåÆr¨vW»«ÝpµõjëÕVqŽ8GœP¾¿|ù~Ø"·È-*WU®ª\·Þ>xû 4”4”4”@Óõ¦ëM×açú/í|Én|o½LÅÊbe õX²xÉbuŒ?.f޽iª¸ŠÛ·ÇíqÃeßeßeÄ#ñH<á¡ðPxÈŽóóóƒµÖ^X{Š£ÅÑâ(l,ØX°±ò’yɼ$üÓwi륭v›Q'ãâ@ëq ¡¾Qß8î dƒlB¤…B,s¬ób^,Œdo²7Ù+DNMNMN‘¶H[¤MˆÝS»§vO Ñy¶ólçY!¢'¢'¢'„¢«¯«¯«Oˆ5¡5¡5!!мEEBT¼X1]1½¿ÌñHÖÊZ!l=zÑ=Ó= [kþšüMþFJRó¢æEÍ‹àVõ­ê[Õv…Ž·o?ÞžBO¡§ΕŸ+?WÎïFÿ©þSý§àèâ£9Gs²öX§Å—êŽwÇŸØcÖ©Äÿžÿ=ûT‚œ“vG7”-¸Ãî …Êš·úšº¦®©k ïËûò>¨õ…úø”¯ùÓüKº.]—Å÷ØÈèw§²²\1Wl.s4=š‹l¨  òH½­Nª“€Ó”¦ÆgŒ3Æã A#hAmV›Õfà&7¹™ÕwÿeŽ™c §ï¥ïeõ±ähb4˜ÿ“}L7ÚÓµàËóåi¸ô0ÃÆ0Po¨7H[½ß´j¦U±$I’–/Ó¥æ™Ïªø¼Ú¥v‘æ¡Ñgôeãûr}¹ºROtþÿó¯$X\èké Dˆ|{‰]Æ.R`šƒ8p€mkÿ–°ò5žÆ×|šá_ùÔÞ.žÚûØÓyƒý/;´L„a¾a2IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-136.png 644 233 144 3052 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜßIDATHÇÍ–]L”WÇŸaø¤¶LX±ê&iGüˆRˆÔp‰5´4¸5´JiÊ.K m– XM7µ»FIkºRu!;iŒi ÚCKIt·TèE£Fdùgv†÷ãüöbæw²Mï}oÞ<çÿÿç9ÏyΑgb¤g“žMZµ“ŽØþô—Ó_^ÿϨ}ÎÇ+ŽWþõ'xºýév€¬ YÌqÛ¶âV~âz?‘ÏòË3b;Ò.§]v”ÄìVxmãkÓWGíS7ÀÕãê êP{µö*@÷¥îKÔƒØ? 0_2_¶mÅ­|k½…—ˆ/­ÿÇ/)})}ŽŸ -5-Uò^Ê{é¹?F~|*Ê+Ê~vþìTI`Ì™dª @ëûO‚mÅcùÖz Ï·ø,þ¨ìâìbØÿúþ×]ŸGŒw¡7å6åZ|Z;y—wÉä’Þ¯÷ÍF3þ¢ÊU9¨Ûæ·æ·ÀßÕê ã}ã}"têz'(/oò&™œŒáÃ×b|qþ¨{+M‘K¡R*%.È«ŽëÍz3¨»Æ˜1† (œ*¤B ö¨=jO¼b¨BU¨ A]W×Õu0'M¿éGW¹Š¦™£æ(àŠâCåêÊÕÀ¢Å/‰Í¶á ¸¦]Ód˜x<ñ¸@¨Ûê6¡àbè©ÐS ]Ð>Ó>³…hUZ•V3»fvÍì½^¯×ëâ>ͧù`æØÌ±™c mŒìì' —qm¢m¢ ÀpÉ–ž˜°sƒ<¬«­«µàÌͪHÛ¬m†ù¿Î1ÿjû±íõÛëa   ”RJ)عwçÞ{!ËåÎrÃÁƒA5«fÕ 5‡k׆Ý+<+OŸÕüß½gŸJêZêZìSz@·'º"¶L Ÿ~ú…B%øc¶êS}ªðàÁ“g‰%-z£Þ˜ÀgÔ}P÷}*ç˜ßå$£&´ 0­9f6™M„Ìß›šiŒ1Æ FƒÑÆ ã„qÌ5æs 0ÄC`æ™9fµÆã ˜Û´OµO 1`áOfNfºëëÁ/æ˜5h?.…ÊôÊt{òƒá5¼@Ð|Õ|-6û £ &¯ÏúÂfµYÆ1”ˆoñýbòÿÊ]IÓÚ¦µ w%œä$™öƒD@ÝP7â=ƒm[ñxKÄÖÇïÊþ¯Þ•Oìëâ‰}=™/Øÿ Ú6¢çÑIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-146.png 644 233 144 3000 14774263775 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܵIDATHÇÍ–oL”WÆÏL©00RØ`b]L7¿¸aW,+Ùð'‘€»¡„ ˜Ú,E»Ù„X‚2ÈÚÄÕ,°ÉÖ¦~†µ‹i´ÅJ0Fd©Ô)bS’Ý:㮂€FÞ÷½÷·fÞy'kúÝóeæœsïó<ï½çž{DD$-ú+à~Ýýº;5â»ïÄ“J“JÑñÏZàzËõÖ¿|ðÚ™×Τw¦wª»ŽoçíññóEüx>;.iâ/&^tGýPµ¥jKÒºˆß:žOÏS꾬ûà‹®/ºøÌ|3ó ÀBñB18¾·ÇÛóm¼x|9ñü"ðjß«}®ÿBâšÄ5"]’]òÆ#î½ååS¯L½¢Ý`Í^¼ºXb ÛÅùv>:ÞžoãÙø6ŸÍÑ#Q”Q$»«wW{:"î~ŠÙ˜Ù˜ió=ü–÷y/ÿ0ûÍ~k¿µŸ0è Ñ­ºp©[ê€Õl5æ¼yÞ<:À~öãåd(¾å‹ñGô8[©DDÚv@¥TJLP@7™GÌ# '¬ Ĉ&4ŠE A‚ ët®Ã±&šhuE ¨4pkzŸúN}x"øP¹®r²ù%¾Ø6ÿ <³žÙ¥__F(ý­þ–•§¡•µ+kÁø·1fŒÅ ¸Ãî@ø@ø@ø„RB)¡'m<0`¾a¾a¾Œ-áÝáݬDÓeüsüÃñ[ø ÿçü–ü¸Úvµíj/ØÑÑ££GG¡dCɆ’ N|oíÞÚ½µà-öæ{ó¡àHÁ™‚3èÇþ¹æ>Šã›|ï÷Þ±kïì×îȺ½yEv^+¼]FqýúYÏó}Ï÷ÉjÙ\Y , ®ácÃ'†Oˆ¸'Üî ‰ÙõÞë½×{ENm=µõÔV‘Œ±Œ±Œ1‘ÀñÀñÀq‘A5¨•ÈpÕpíp­ÈæŸm~¼ù±¸‚ëþaXVm>f öì±Qß¼âIý*õ«_åÉHQJQŠˆED\Éòv{»%1ðiàóÀç"¹™¹™¹™"f…YaVˆˆ_üâiÝÔº©u“HÕXÕXÕ˜HBuBuBµÈòúåõËëEf—g—g—E*.W\®¸,2󟙇3E~9œócÎ’ÖáÎ/n.n‰éôµékÕ÷ðhúÑ4p1rìµVsjÎÙ’mÛ¶ ÀÍ¡›C7‡àÜés§Ïñ‰O|›š›š› Y¾,_–v>Ûùlç3(š.š.švp¶n/Ü^iïmïuÚŒõ»Ù¼Ù<°õ¸ET¯êu}/DW‘ ×ÏeÕ^hë¾uߺ/Êå‡òEJ§J§J§Dºïußë¾'²1mcÚÆ4‘”C)‡R‰Ô´Õ´Õ´‰Lú'ý“~‘ŽôŽôŽt‘é‰éñéq‘ì¬ìpv8Ÿ!7CfHÄуˆÈèp!t!ô»ì2ÍE±Ó°é`ÓAÙ5²kd׋ÅßßÙßÙß ¾_‹¯Å‰w%w%w%Cyäþd¿ø#íÈ…‹0Q¾À…¾ }vñ~àœJê›ë›Sæ’éttÍæ™wu¹.×å`šƒæ ¨Kê’ºÜà7@V‡Õaà6·¹÷wyÂ4ÍfƒÙÇgÕ«?æœÊø>6ã™YJ@ã ì>¦U#+ê]Õ®ÚA/ê9W{1¡}ºO÷Å ²)×XX€uÐúØúÔoŒOŒOXáº?áð¦gÒ3ùB³mÛ¨LªLr:?X+®©ÒTyýúqêÇé é zÌ6Öøø|‘~<Ÿá—4‰9lŸÛ>7•Díý°1oc^â¯"ö‘.°·Ø[îOÁk­¯µx>õ|Ê0Ò3Ò0^2^1ÛX7â|/_öÿ‚_¬mÖ6Ó¿À–`Kù¥óKŸx30ø”¯+_ð“å'‹2€6 $“¬J€ŒÇgëÑx#ßÀ3ð >ƒ?¢G ³8³XÖW¯¯¶Ÿ","ÒßoÏ}{.ð,@¸…OØÏ~’A³jVà£)ß”ú^?ª<ªEµ¨«ê*ÒªµjB05>5£žz’Õ?¢x§w5íj2ö7òIE¨"d?eè‘ÿÞÛ÷Ÿƒª`UÔ›ánu·x @ÝV· cUÔ”ÊP©Ç¦+…²(‹²ÏSJiÌÏlåW~”ÊÑ4M# L0ÊÁgyÕºªé ¾ÿ\ÜVŠˆüú(Øö@`Wn~póƒiص÷}ÁŒ`áúp}¸>Æ7é™ôLzÀÛáíðv€> èq‚ŽqŒcqñ]“?Oþ ÿ.q¸™˜ZÁ‡AË è²7Ù›3 =Â?EDŽ 5ïÖ¼ j€þôø_F÷^ùÙÊÏPíçÛ[Û[cD¥Y¥Y¥YÔ™Ô™Ô ÕµÕµÕµ .¨ êB,nÜ9îwBY Ì[æ…ì…ÙÎl'jýÒ²e àÁo"|ðú‡¯joD¨""ßí‚æÁæA¸ÿ=€Úúìï–g,Ï dÔµwmïÚÞµÐèmô6zÁ±Ì±Ì±,& ß—ïË÷Á™ª3Ugªb~Ï-Ï-Ï-È=›{6÷,\{ùÚK×^‚'?ZP° €Ðù7®])R[¡­µ­´Ç#z̦ÇS¾Lù²`…Üpæ;óE’NŠˆ˜Nu7õôöôŠ­0¡ÐZhñgû³ýÙ"9’#9"rWîÊ]qívívíJJJñù|>ŸO¦Ÿ¢´¢´¢4Û Û Û g®3Ï™'’Ú•>’>"¶ÂCOu?Õm:%âXäX$bþý¬²Ye+Ì2˲ٲ™%Òg}ÏúžˆüUDDÆ,#ÖùÖù" Ý = ="Á‹Á‹Á‹"«2We®ÊÙ²i˦-›DÚv¶ílÛ)b¾d¾d¾$b+¶ÛŠcÂÜkÜkÜkDfÏ™=göÿýûüûDTšzF=#ÒÜҜќ!c"™–L‹ˆ:(×å:KÌ‚þ…þ…©OÂáÃ/Š˜æ‰ˆH¦j yB‘„ЄЄ ‘~K¿¥ß"ÒvºítÛi‘Õ5«kV׈d¥g¥g¥‹Ì+˜W0OÄ•âJq¥ˆÌž9¦ìÃöáÀ ô›á›áXÓ·„;ÃL¨¹äÆø´>­Oëm±¶X[ úaý°~8Ç9Ξ¤'éIÀËld#hßhš¦V;éžt3¡Ïö±æE‹ì?Ú Ìà¶ÑÇþ§óo°m°ôánîkçµó@XE…ðô+&™B<äa\…àÇ‹wºÖ ôWõW Ò¾Ò¾ŠÃgCâ†ÄÿÛù1+ÙeÌJ¢³ räé-FÛ¬m&ªKu`Â1ÛX7â|ÏÀ7ø þéYùÈÞ.ÙûØ£yƒýî´¹NR±IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-88.png 644 233 144 2505 14774263775 14714 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜúIDATHÇÍ–kHUYÇ×µiô‚Ý’)¤©&ô’\ðF¦p¿DËŒ1ñ—F†Ì$"„¢ÀêCô€f†rt$¢H!{Œ5¡535P>0¤$Ô0µ¹ÞsÎþ͇sÏ=§™qúÚùrXkíõÿÿ÷Ú{¯½DDdQô/·"nEœÇ´ãöØþ„m Û¼M»^W±«¸ë(,¬]X Ô˜ÔhôÚ¶·Æ;óEl|'Ÿå—Eb;â[â[\ÙQû8ìX½cuÂÓþ¦Ü­îÖ?5¨¸Vq àJÓ•&öCè~è>ÀDöD6ض·Æ[ùž_Žÿƒ_æßœÓ5ñÇ,+·®ÜšZièO…‚íÛ†æ ÍSq ‰$ªl`ši¬oÜa[ñèx+ß³ð->‹ßÔ#°xÓâM"PTRTâ>o&ô^€ÃË/4€H+PO=‰ü Ñ΀úMKÓÒ˜áGUªJðâjUPñóZµV @u$ÚxQüŸÅoê‘w×öÛ&€¿"÷@ëaàSý¨~”ˆZ¡rU.Ê*‘Úª¶¨- rU®Êµ]婼XQŸ¨õj=Štý¬~–èSú”?Êã§ ßwà¹CÓÁ3ý™ÃÍã'c‰±„°å˜mŸ½5{ F F F 2‰ŒØBfOÏžž=mǵÕZš–fÇé4RŒ”^žÍgñ›z¢Âê;`ﱽǬl#C Ez"=öÄ':'nO܆ü©ü©ü)HŽOŽOއ ;èºaÄ7âñA¡·Ð[è…äüäüä|(òùŠ|ðvÏÛowÚxø´eÚ2›Ïæ7õÄ™u \Ùxhã¡hÅ•©Æi Af-Gç—"}wúîôÝi[Õ¶ªm•È@ù@ù@¹ÈÉÒ“¥'KE†_¿~-Ò–Ú–Ú–*ÒUÙUÙU)Òñ{ÇÓŽ§#P£ª^Õ[ø®Ìwù×öúçZ–æZ7X7X7Ê7”o(·ý9îwŽ2º3º3º¡øjñÕâ«v<£,£,£ jSjSjSl¿þ…¶YÛìl3¿©'NĸaÜpõˆh…Za¬Ô‹å{9 b¶,-XZ°´@äå×_>inlnln õ‡úCý"þ!ÿHäEðEðEP¤¹º¹º¹ZdüÑø£ñG"æž³ñä+ JÐÁãê17ÛãCpiòÒd¬Ð»ùEߥïb†õdá¨\Í“š'5O  ´€ ëÖ5¬sÄ›jšjš „ah0Œñbp{ÀÏz©^ÊLŒ/Æoê™óT¢kÚ„ã}Í N}ôÑÇ¿¿J(žóœçÿ$“L-\à‚OiSÚÔܧrî>¦Y}ÆØgì#Ìcf˜ýª~Y¿ úýˆ~Œt#ÝHª¨¢ ô½Cï½J¯Ò«ÀøÌH6’fºé0 ÛøÿÛÇþ£óÑÎß©weF‘ØŒgxÃköïÔδí¸éÃØmì&bãYøsvþ÷Ü•&@+pŠS$‚6­MX{Dµ«v\¸À¶­¸5ÞÊ·ðÞ{W~°¯‹ö=öa¾`ÿ0‡Å•´ÕIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-170.png 644 233 144 2774 14774263775 14774 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܱIDATHÇÍ–kLTgÇŸ¹€3:"dÐv-½èÆ$ ±oACiRSb#Ô&C÷jÇxû ¢M0-›e«©­Û¤¥Æ24l:!Pù°Æep»@I«ÅV·fC[A¬¡0ˆçœ÷üöÃÌ™3®éwß/gžËûÿÿç}ž÷" ""™‰¯€óIç“ÎŒ¸íÜiû=/z^üskÜn6ÀñŠã•+‡aÁ‡ >Èú4ëSuÕ¶­¸•Ÿ:_ÄÆOå³ü’)¶cNûœvǦ„]¯¼ZàY·ÿ~¼aoø®»:vu|ùÙ—Ÿ±FûFû&6MlÛ¶âV¾5ßÂKÅ—úÿã´¯Ò¾rüæ¤ÏI§_xú…¥ûã ÿY e[ʶüâúÅe:À¸ øð™›€(Q¬ñ[ŠmÅùÖ| Ï·ø,þ¸ìâìbØúÚÖ×¼ŸÄ'\=ƒ^óDÍŸf oð>ºõA}è6¼†—˜9¬šU3˜Q5­¦Áü^5©&àoúˆ>BŒ°Þ¡w€ÙÏ뼎p¾žàKòÇõØ¥T""ï•@¹”KRPĬÕßÒßóºñƒñZ"`2ÍMnb -ØÏ^ö‚U(0·yÍt__;âøPžYž ܳøãzñ¹'D¼·¼·ú«E¾÷í¼ùºüûYß³>Ù"«`@þ1Óz/v/&s=žÝžÝ"fžY`ˆL.Ÿ\>¹\Ä‘áÈpdˆ¸r\9®‘¹Ãs‡ç‹8 Α©Q¢ˆøK|·à;¹ç¸ìÎsçI…ܺþÓõŸä¬Ã.A]°.X„®þ®þ®þ‡KÜVÛVÛV ëýëýëýÐ5Ý5Þ5ž ÇÈHðÝ …†è±Ä®$x$xÄÞ• Gu»—L fË •b÷ÒKoŠ]J)¥ÀiNs:Åÿ1ÝtcR ?£?“Âw?øfð͇veî ðŽzG£nÌkÚ5 ¤/ªQ5̨*uLóWó†y#E_›jSm`V™UfÕÃ+¦–¨Åj1ë Õ¦»u736þ5uMÊ{Ó{3êNž«Þêï•@¹§ÜcŸü`DŒpWU¨ŠäéneŠ©ÄzÆÐ4ËlʊϪ€  Ñkô¦â[|žü|WR“S“<×´0ð.ïâ³KlŒ10/˜pàÛ¶âÉ–HÌ·ð,ü?¼+Ù×Å#û{4_°ÿ¦"ËFJÖõIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-22-red.png 644 233 144 4260 14774263775 15613 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜeIDATXíW}LTW?ïc€éÒEhÃeµ~¨YEZÄA›ESMƒKSˆÒ5]EŠÆ6 âÇB ¡µ»´†"%Ð]SÅ ‹Z’nYcIÝ­]g(ÌVà £;2øÞ»¿ýƒ¹o>²«ÙìžàÜû;çüÞ½¿sn†hÆfQˆ‰k"•H%Rþé_ˆŽèŽèŽè^Ÿ.k²&k_ÿŽÒ(Ò€™mVK2É$sõY-Çóxžç­'® å̯„J¨DlÝŸó‚Ü-wËÝí÷…=ÂaA$&n2n2nç·ÜÚrkË-`ëèÖÑ­£@®5ךk ø|Ÿãy<ÏÇóózOæCâêPþûâñø`8ŸPbQbQb‘ööÉþ“ý'ûÙ3ž{ž{ž{$HàÅC<ÄCÃÆ0`øþ}Žçñ<ÏZoþûOæG–gE§èÃxëëëu•ý±Ýg÷Á¿±ö{ªV®¶¨-€¶\KÔ-GÛ¤m´åšU³Z¹6_›°fff¨<žçãù Â!õ-ÏÔ„v¡]h'’ˇåíƒ<ÀVk;`; æÄÞÑúµ~xÔÖÇ¥K6ìߘF/z@_£¯ Ã /°rV`ZWt%€W[Y$‹Ø;úUý*<<¿­ÖVi«Tsx}·ó#ÓˆiÄ4òóŸq€¥ÒrÈrˆ%;Æn‡nV§]Ó®€zI½ÀãwÀ”yÊŒ`‹BT°«–¨%ºùèæ£/ÓìÚ,m_Z}sõMx·éݦàC˜¼6y-˜è‡Ö­ðj׫]°ÿÆþÁxO²'h-àjx¯á=@³càå|8?ÑßR/˜²MÙ¦l£Ç"©˜ld#¢Ù|é|Ãù"¢ƒwÞ%"šþnú;"¢ÚªÚ*""ó„y‚ˆ(}cúF"¢®ë]׉ˆ*s*s‚ñ5«jV™{ͽD•y'ó ?‘¦S‡©Ãhy>_YAz}z}z=nO S4E΢­`ø¥>¨þ¼{)â+â+ "!":].üës÷¹Cð‰‰|ãã¾öO•Tíí0eµÆZcq›ó#1GÌsùj[JZJZJ‚$`t°r\9Àǯxÿkû_€éÓ'€½Î^&¨ìPvKÂW§L  ´3ê”:¨×w¬ïXß1ãü•*¤ ©ÇHZ!­V¨æ]–4Ïò‰åm¾ãŽbGq@X,ëň#`ù¼åó°ž±ž1èêïê€-[àû…ß/€U-«Z í«´¯ ÇÕãàíNïN°±%¿%ìöFø¼Po¨7€e–.\ºP7iŽ4Gšó›¢³£³£³‰äËòeùr›Óø¹¯ô¿Ò¯•“y“y€^–P‘P”Hg¤€—NÓi?? >¹ºæºfHù2åK;åN?Þ-í”vúDD`Àé§wEWK·•nÓ½Áb©X*þ[ÞŒovQ¨%6šRM©¦Ôáßó€²ò½7÷ÞdYÆüˆ½³àÎ0À=âàqîþ&º&ºÀçò¹À-»e¾ñÆ?·Óí´Bרkð2^†÷ôƒö%íK°ÑxB«Åj±zj½0W˜+Ì]r2Œ tÍè¯íB©Pº®Yh*„ ®ý×JïÙgO@1´[ªÛt[$}a=ÄÂÜ,¶í HÉÙöCóÍ@RÔ¼çç=¯î2Nò tV:[f3¨åPåÈ–×LʤLù µS;µI.iX~ûÆÓÚl‰±Ä¨1Ž}öSöSÁÚÕ\š XëÀP‚^6̆(,—å,Oß o|ζ¿æäh¥Æ ôP¾'ßSÅïŽß¿›H´‰6Ñ&œñ³+ä4äÿ›'Ý–nK·…sÉ{“÷&ï%2™ŠLEÊ!C»™¶L[¦VÊ êez™^(PL`A]½H[¤- œoýÊú•õ+Y–ñ–ǘbL1ΩßzÓÂŰ«'!Ìý"Ô·DÍh×q& Ý²ò²ò íÆ¨1jL€~W¿«ß Œ! aPÌCæ!óÛbh2ZŒ£ó&ÅÆ0~‘ôä©>H»Û…íë¶mB›Ð¬]¥Wé hWíU{ÕÞ€rÅ?Š,\:¹tR[hh±Cê:~›Á¥æ—^8ÁÓS,à ÚuI® í³³ScmŽ6G|ða’3-;Wv®ì\`ìÈÍr³Ü<äÿIbþKX]ÿ:=ó4‚áÆòýÚýÃÒîÚMk7­ÝЮ’¡d(85³ÏŒ› „¡`ÝÐ2âDX]þK{šv×HÕRµT=¼œ.¨,¨,¨dÇS¦S¦S¦ÕëÆU»$—ä*K¤Vj¥VòÉV/’þG ×î¡Píß…Âa@hmЋ b‚˜$@þ"É›äMòIÒ€4 üɘvsÿ7‹1þ˦lÊ–C·÷ŠLd"„‹ÂEáâ?~2³þS%ìfìayŸzÕÿöSwµê´©NIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-46-grey.png 644 233 144 6153 14774263775 16020 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—{LçúÇ¿ï;³ìMîGX-A@.–RkU­a ”Xñ‡ô&`¨h4Fj#­-‘Ó*¶ÛàIê%• ¶¨T…¼ý¸´*…Ò²²h°ÊEÚe¡°ËîÎÎ{þ`OzÒôùg23ïû}>yžïÌ)¿Ä#ññÎ ¾Äܘsß"™$“d–r\ xíÄTÅTÅTE€—wƒwƒwƒ#w~~žÚ#º"º"ºÈ+òæÃlõ³úYýðJWSWSW³_ »v5LÌý}íïk_ûæ'ª@U *p¥Â‘éÈtdÆ—²,–Ų¼E@@@_¢â{â{â{b ³0 ³ø¹rs¸9ÜœkÁ¶qÛ¸m<à§ÐÄÐÄÐD!z«u«u«•Û9S12%O“§ÉÓ ˆëÅõâz¨Än±[ìØ*¶Š­˜†i˜`5¬†Õ@5ÓzÒ~IOÒ—òIù%‰*Û”mÊ6@¦‘idšÝ4×™ëÌu‰A)A)A)Â+YéYéYéü¼ïÁãâ˜8&Žì(;ÊŽ‚§E´ˆôEú"} =¤‡ôäsò9ù@âÀLà¡‚ *À½Â½Â½ÿôƒ’ƒ’ƒ’…W¤üÄG…IaR˜LXf«±ÕØjÒ_ôNñNñNaÁ)gRΤœá%L0-Ó2-Üè/ôú @ÌÄLÌ€ý¾ý¾ý> @€€ÿŠ*T¡ ›È&² °­³­³­/ÁKðÈÛämò6Ü$ý”oR¾Iù†¯ôÞà½Á{ –x$>ÊÂX ;°Á®µkíZ ¶#¶#¶kÐ} ûø‰û‰û‰{Ê)vˆbP›Z›Z› ÄAP¼­x[ñ6àÖÉ['oœ]îæQîQîQ—Øk±×b¯aÄ#ñQ!X‚£¶zþæù›çoøèyíóÚ絤Ì)àB«h­Ø6¶m{ R—S—S—<4>4>4â9ñœxîéýæ¤æ¤æ$ eiËÒ–¥ÀæÛ›oo¾ ¬}°öÁÚ@¥®RW©}}}g·¹DÈ"d2R&ñH|¼Õh5Z8žžž€Ý>Ý>ÝÀÜö¹ísÛõ:õ:õºÙm¼ê{Õ÷ªïa^°jÁª«×aì0vqˆ¢Å(&aRåœ!ggØv §Éirñññ­ÖF+|)ùRò%@öšì5Ùk5P5<z‹{‹{‹CúCúCz $ª$ª$ è#}¤îÕîÕîÕS2%S>ÍO7ÑMt€/ð¾ a”›ÇÍãæ±³‘‘‘è"…H!-¥¥´LÚyÁtÁtÁ„mÛ¶Û¶!l`«³ÕÙê{ˆ=Ä7„ ÀÞbo±·j«Úª¶»vîÚ¹k'••\}îêsWŸzŒ=Æ#@,ÄB,³ù¸©Ž©Ž©ôÓ DƒØY^qXqXqXÐõûöûöûò';}:}:}HÞ²Ôe©ËRaß2¾e| TCCCÀ诣¿Žþ è/è/è/´œ–Ór ¾¤¾¤¾ú…~¡Ð j5ƒÀü‘ù#óG×\_p}p‰w‰w‰\#\#\#€±ª±ª±*9ÈA,† C†!*èaÔ0ŠE¿¢_Ñ/èx¤ )Çù8>Žû×{IIIŽ …- [¶p÷=¢<¢<¢0‘mɶd[à&ò"/ò€­ÁÖ`kNí9µçÔ úRô¥èK€vH;¤„D!QH®ï½¾÷ú^ 0<0<0ÌÌÌ€ð€ð€pX•T]οœ9_Œ&‰$‘$Òˆ–h‰ö„‰j®k®k®¸ß%Ö%Ö%¶â‘1͘fLãîŸo?ß~¾Ý±[°[àæwÉï’ß%Xý£ü£ü£€€Ö€Ö€VÀõ¬ëY׳€o¶o¶oöSÆ Ç Ç K.Y¸d!pZsZsZ´ïoßß¾HÝ—º/uØ31ÏÄ<yuRuRu’h|4øhðýÁåS—O]>ýåuû€}À>k'ï?|ÿáûÜÁÜyæ¨lD6"iVNÖLÖLÖdÅkâ5ñ—ðe— _’ë‚Q0 F0>ƒÏà3@¦·OoŸÞpm\×Ère¹²\yÈC€Ld"°X¬—Áep™¿Ì_†ùçÈŸ#ŽDjŽŠ{÷pYÙ§ìSöM¯eã·4‹°‹în£ô8=Nsmô=B<Þ%ö‰}b_¦MÕªjUµM>M>M>ì¹®½]{»öâkÞ‹÷â½`aClˆ Š$E’" í“í“íà W¸Î#`j¦fj@ž.O—§ÏNLÜœ¸9qª+'¯œ¼rR’õËúeýÀÌø·_$+È ²âî6è ƒŽ÷sŽyŽå3s#€”’RRz}¥±46÷"²…,úïZRKj‰c:h:h:ù‘üH~Äû˜}Ì>ÐŒf4?m½sš11,ŠE±¨Y/ºÕÕ×Õ×Õ;öŒ;1v‚?*÷“ûÉý¾. - - -ùä P€ò úЇ>!^šGÕÀ„ìÆnì&ÿ ÿ6ü[ÝzÅVÅVÅÖ¯‹Æ<Ç<ÇCùNô}Dv©[ë4ÿÅßÄŸ¼ë|]8 °;°ƒo'é$¤ß aõ¬žÕïÛ¬\ \ \@ïrÜ7ðxxH<$Êì}½÷õÞ×@;õ¤ÁÒòwÿwï îïUeIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-14-grey.png 644 233 144 6007 14774263775 16011 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ¼IDATXÃ…—}P”UßÇ¿çìµ{í^ëƒ ÌðRÊ›¼eJ øˆ.¡OOiD¦Õ¨“$71÷=ŽZ#¦-7”“úP8zOóPÝjݾ!D<+e°ÄtKE ÈŠÁˆ.¾°+/ »{í9ÏîŽMÓïŸ3ç\çü~Ÿëw¾×9¿‹˜L&“Éî™ã^CÓ„«ÂUá*¯755å!EÃEÃEëæsîÏý÷o‘CåP94ñuW­«ÖUË÷¡¨ ˆCâô¢½^ÇëxïW‹«ÅÕ¤@¸!ÜnüTAìÄNì;Ë ƒ ƒ ƒ›.o(ÞP¼ØäH9RŽ$™÷8X«Ë@§S‚ú+bE¬ˆµº'Ü¤¢º¢º¢º/Ü6·Ímkü·s‘s‘sQâ›úCúCúC0'®L\™¸’$«“ÕÉj ) ) )PúÊse¾²^ñ7íßO‰¯ð(|‚/ƒ©Üûq?ö ÙL6“Í‘‡T‘ªHUä7•ŸO|>ñyD@`c`c`£wûÊÞ•½+{©gAׂ®]ä±@, àÄ.ìÂ.Hp '€MØ„MÂCxN×××<Óeé²tY¸ç븯㾎cÛï*GËÑrôæúßö¿íûI™Ï†¦Ñ4š :üéð§@eHeHeÐÐÐÐA#f@ñ+~ů—¿Ëß>›w6ïl0èt :,ÄB,¼oÝÛxoC£ÄWx>Á5âqà“ù™ó3çg¢@צkÓµÁɲXË‚D«i5­¸¸~-øµà×»Þ®·ëžÂSx €ßð~Ø{ì=ö ¢*ª¢À…¢ EŠ€Þ°Þ°Þ0 P¨ ÔÞuÞuÞu3œÞyÞyÞyt9º]œá‡?þ8 :F:F:F°Ÿb/öb/‰£'éIzrzH. äÂŒ£±±1àÙÏî|v'´&hMÐÀÝïîw÷ÏÌSm°Á ÉÕäjrÏ×>_û|- iÖ4kšÞÎÛyû}µÀËL|ú*}•¾ àc|ŒIU…ªBU¡üÔè’Ñ%£KpEÞ!ïw@E¾"_‘¯Àñ3~ÆÏßÄ7ñM÷9ÎE.r bƒøÕLÕLÕLqoĽ÷÷BÜ q/îsîsîs€'Øì ž™O>!ŸOÀ•÷è˜è˜èÀE£h?Eµ´´äÒ+ÁW‚¯óSË/–_,ˆD$b’ŰÒ@îsL %@3šÑ<3>*ŽŠ£"`K·¥ÛÒîÝ7ºo%5%5%5ÕR-Õç[tnÐØÒØÒØPJ)¥˜´ž´ž´ž¬CÖ!ëþG{E{E{E.¥ÈF6² +“`L¤ ) ) )ÀåxÌñ˜ã1HTOõTQÎ9ç|ˆ˜ÞÂ[xË̸^«×êµÀ–G·<ºåQ`£g£g£x©é¥¦—š9UN•Seæeæef MJ“Ò$¸ä ¹B®€džkžkžËRˆ•X‰ÿK¼ÄK¼•r>ä|Èù÷wkÒ5éšôϯÝIº“t'IÕ_µ£jGÕï6åøàe¼Œ—Á5-¢<1OÌDY”Ey”–Ñ2Z<üpðÃÁ@XjXjX*ñ]Äwß³ŠgÏ*‚š‚š‚šÀuɺd]2Äšµ5kkÖ2çÿÿ?ý^sPsPsð—užÏ€g`»‡ìÜ3¸g@;ÚÑþðaõ°zX=ܪ¯¯¯‹ÈÉÐeè2tü‰ÌÓ™§3O“óüiþ4Ü3î÷Œƒ(™ÛÄ6±mF |„ð]èB@ZH iœ&§Éi¤åÒri9œíííX{lüØø±qüŸ$J¢$N=ÉU\ÅU‰kxÄwÿ…Ò ZA+T?ÐZBK†þÆúXëÛì–,’E²–(K”%Š?Úõf×›]oâ¸O«“ê)õ”zê>@2dFaHÉ"Yy‡¼CÞp ·pkptL“Æ$HfÉ,™%9JC4DC2JFÉènF–’¥di÷_PŠR” s|ež7ù^Ý(ü"‡È¡óù4¦ÓôíµÈArè?êx¯ãržã ã ã $ò#ù‘üˆQ~”åGï»ãØ}w}':Ñ à:®ãú´tüÌñæxs¼w›½Ø^l/‹‘b¤y¼8v_ì¾Ø}~ƒB¢œ@úÐ'g(õ¨À€| [±[IíüêùÕó«K×hsµ¹ÚÜãÅö@{ =PpT‰Ub•8£]Œa cp)[¬ÊÝÏ“xOÇMÜÄMˆmÖ6k›•?Ñ.¶‹í¢ªT/é%½tmÊ}Â}Â}â­÷/^*¼Tp+·r+fûâQ@¾ö$›Åf±Y˜Ýy½ózçuÀ½Õ½Õ½õ­÷õþz½ÿÕ“½u½u½uªÒúë_¬‘?AòI>ɇȎ±cì8tÐAð»ü.¿ ™ÈDÆä-ë-ë-+Ž7&4&4&`¶Þ¦·ém[–°%o½Ozצ|R<ì«2§/ åkõý’ˆ¾®o‹T¥hD#½ÛH I!)O¬¹÷ËñM'Ï“çÉc}™½Ì^f4mAÉ‚’%XÍzXëDãi<‡K. äˆÅ|óQŒ7Ö¶Ô¶Ô¶TuY› MÐ&”.»÷Ñlÿž•±2V&öíìß”+.....ƨ’Qø¦5äÓî6Ÿvû´ûåï´ë©óÔyäki`A,ˆñJŸß: ó8(þÄЮï¸ð"ùÈ~"Ȳ¡9†×óz^¿s“.\® §ÝªÕ€j`(œígûÙþ¼ë=ëzÖõ¬î"ÚçO),'ÿŒãÿÜTµ•¢hªIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-0.9.png 644 233 144 2642 14774263775 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜWIDATHÇÍ–mH•gǯsŽg¾i6“Jb-#9HÍ}ˆ˜§)Æj`áR¢Õ"Ö Ûi²}6ú°¾”Q`˜c2±…3Џ·‚l´ {Ù9!Š–g™LwÎóÜÏýÛ‡óÜ眭mŸ»¿<\oÿÿÿáºïë¾DD¤Àý xK½¥Þ%IÛûzÚŸS—S÷ÜçIû´Ï6϶«À“Ov,=»ô¬s=m›¸ÉϬIãgò¿HÚ‘ýEöžk·ÃŽŠ9O'íOÆ ÷|îù?lØ×¿¯à«O¿ú”ƒ0õÃÔ¿‡~AÚ6q“oê ^&¾´ÿƒ_üƒþAO²ŸÈ~BVÖ®¬]u8™pkÔo­ß 0á›ði/¨{@>ù:Ì3Y÷3lwóM½Á3ø†Ïð'õUU‹@cscsnW²àzvxyx¹á³Îs†#!_ÿlMZ“@¿ÊRYÄAÿ¢â:¡úWý+ÐaÏØ3ÄõÏÖ-ëð%ïó>ù)Ãïêq…ýôôÎõΚÐ{\žøÀÙ“'!X,–ÃLÕLÕL”-;ZvúCý¡þPZ؉Ñ£'FaCˆ– -iÿºë¬{ç>:×v®-厫×ä7z¼"KF—Œ>_%RýRõK"Ò*"âér;=qxâÈÄ‘âÂâÂâB‘âËÅ—‹/‹”Kƒ¥A‘Û;oï¼½SRkÙe–™.˜.˜.é ÷†{Ã"ÑÅèbtQ$öjìµØk©ôl9fø\~WO–ˆ¯ÞWOPÄÃÃ#b‰ˆÈ¬[Xä;é;å;%bOÚ“ödZ€e[¶e‹J%’´¿®»®»®[ä굫׮^¬¬¬ñF¼oD$/œÎ ‹È%¹$—D$Ïðù¿ö-E"¾r_9A¯ˆ3à x®‰Ø vƒˆ÷^R!ªž¨¾[}W$ÚíŒvŠ´‡ÚCí!‘ÙéÙéÙi‘Ê`e°2(Ò³¦gMÏ‘ѱѱÑ1‘¡CC‡†‰lnØÜ°¹A¤0V+Œ‰l*ß´vÓÚôx _’?¥çŸ{ŒÉdÏõvÀ7›¡¯­¯­¯ 6ælÌÙ˜C‘¡ÈPæjçjçj¡¾«¾«¾ be±²Xo<Þx¼*k*k*kàâö‹Û/nOï9Ýe¿h¿Hœ©ßcžÊ¸9%ªHÕ´ÒŠæ3Îp&ãøuÒI'$H0Ã?Ì0Ã@”(Ñ ÿYNsXÏV¶¢A=£žþüßS™1ÇœqkÜ”™3Î[Î[,8Ï:¯8¯€ªRëÕzpFœg覛npNÀ 9ÈAP •P Påj•ZNØévºœ··YÀvñµË÷ïs,còÓ”Ó”“1™Qß©ïœ=Î,ÉN qp€9æ˜Ë°5 ¦èT} Ïà¾G&ÿÜ•„W„WdÜ•ð1“ö¼= ZT qÐcz HÛ&nòM½Á3øÿyW>¶¯‹Çö=öx¾`ÿäi¼„ :IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-160.png 644 233 144 3046 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÛIDATHÇÍ–oL”WÆ3£Ì¬üS4a•µ²1™´±+m[ ¥„FÒ&´Ûˆk%3éâšÆUc“möƒµÆm¢JKÒŠM+AÝDZ…²¤±°ÂBH»1D˜Qäï° ïûÞûÛ3ï¼dM¿û~™œóÜó®ëã èÃú0èßêõ‹hà0´Û궺wüPµ¢jð_[_7[à4ø"¾ÈŒ†f‡fn*@ÿ¨d.KŸK£ÓøÞøÞ1b<2àᾇûØBl!æàñ¡x¼Æ×¿<þ2èMæ€9À\®`lhxhоQßèŒÇö“4vöcÁÚ`­M§6ë"c³±&NN|=ñ5ºà‚´žo=ßzÞ®žªžªž‚eÆ2c™E;‹ví„ÉòÉòÉrö{‚=à=ìÝïÝ;níÜ1ˆÒ!à => ® ®±{ï줱Ÿöó|Óº¦u© ÙŸþdúâ[ë·Öm­sÎn÷d÷d÷$tÝèºÑu²NeÊ:½7{oöÞ„úÂúÂúB8Xp°à`l™Þ2½eF#£‘ÑlüÛÆ£Â5ÕòEËÄm=•óÕ3_=cûi¿G$㻌ïró¥»8T‘‹ˆ¤5üæŒÿ¢ÿ¢Hç•ÎDò¶çmÏÛ./‰—ÄKDb9±œXŽHÔõF½"ÛVm[µm•Hi]i]iH îiÔºQ‹øCþ?$©ÏÈ4V«E¼òñI¥ÇeåÒ;KïˆØ~\"ê[õmZ¿`Vš•"bˆˆHfÚïdABSL1EdÖ=ëžu‹äEò"y‘±ûc÷Çî‹\è¸Ðq¡Cd00 ˆÔ\¯¹^s]d82Žˆë;Öw¬O$ÚíˆvˆŸ.Þ[¼7EŸéú§µÆZ#âø±{Œ¦©¦) 3±çl3'ÍI» ¾¢¾¢¾ºÚ»Ú»Úæo,k,k,ƒüñüñüqh7„Â~)ëRÖ¥,(ì/ì/ì‡k³×¢×¢Î¡%#©÷sSOSÓcΩ$x4xÔ9•`ΘÎD×Ì3Å”#È6°8ÃÎ,ÊljÝ®Ûu;ÐB -‹ðs´Ñ†f“ù¬ùì"½ùàà'Neà4$çˆ2† @ÙsL…U˜9µKP'@Oꈎ8:Ê£<ÊVÈ Y!Py*Oåw¹Ë]P¹ê9õX[­=ÖP—LéaÎáRC P¾¾OÌ1{Ð~\ UÞ*¯3ùÁê´:˜zS½‰‘œý01BóÌ3ŸÄt¢8uO€fAU«j °:¬ŽÅü¶Þ“ÿWîJÂ멹f4ñ~g‹­j«š8èÛú6i¤Ûxª%’õ©»2Éÿ«wåSûºxjßcOç öÉÆÉõ¬UÏWIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-76-grey.png 644 233 144 6256 14774263775 16027 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü cIDATXÃ…—kP×¶Çÿ»»‡yÉc†EH‚¼ a€A/D@Ôp’ ÐÒh 0j, bI kTYñ…&D’s` å0œ˜XÆ¥À "P‘a¯™îé}?0#§¬Je}Ùµ»÷^û×»ÿkíµ‰N§ÓétpÁ¬g&†{À=àÐfÝ7ºotßÐ……#…#…#«©Šª¨êà‚›à&¸i¶˜Ì æzgpgHüà?½èE/€-Ø‚-ô€4Yš,M&yÜÜÜ7Î12FÆö–,(XP° õnQzQzQ:¼/Á‹$ÎrˆWm\.ÌsÀeX†eL¥X(Š…âUˤeÒ2ùrxacacacå€eØ2ln¹6::ªùDY¢,Q–à’&A“ I y’I„W‡«ÃÕ€½oooŸo÷÷Ü¿m=ûúv;gÛÁhêD¨“¸‰d’L’éUÂz±^¬×•òÉŠÉŠÉŠÅj×××kNBoBoB/Ãwww“7¥yÒŧP` S˜ðÞÃ{aaÊìaö0{àÍîÎîÎîNÊ·ùµùµù‰9£«GW®~ç˜ÂKá¥ðZ.³fZ3­™+KhÍ¢Y60Ñdß̾™}3:щNG®kà:«,¼…·ð‹ÿæíïíïí/,KõKõKõã*U‰ªDU"¼¡€ b­X+Ö‚› ©HÈZ²–¬à W¸ä7òù Œ0ÂÎèdt2:áþ…/.|qá aÓýŽû÷;¸Ÿärùo—…d!YH~}^Çëx}ðßdÿÕýW÷_gÁYp>{c2e2e2%=Ì÷´ïißÓ›YñYñYñÜ%´£í0Á +¬pÂ*¬Â*Ì™8U¨B@¦?ÓŸr”%GÛ‚VÑ*ZI"I$ NåMåMåM›}÷}Ü÷1wIY§¬SÖ}ó+7ÎsãF˜&„‰ÄpK½¥ÞRŸæú†ë®oPŸ4Cš!ÍÀÙ5bš95sjæœø >ƒÏ,&‹Éb,‹Æ¢f43š À×ñu|€ Ø€ YF–‘e€%É’dIµ ÔÉ%¹$NvÿiUiUiU\¥kŠkŠk õ±óØù8êGý¨ßg)¼’WòJ V«ŒU"Á%Ì%Ì% æls¶9Š“'Ož«bU¬ àʸ2®  ¹4—æÑYÑYÑY@BJBJB Ðp§áNÃà:®ã:v»Ý$Æ'Æ'ÆQˆBàärÖå¬ËYLÅEÄEÄE áÂñ Ç/$‰Çg)œà#ø>Ú­ªUªBªBªBªH)NàN@H¤ÀÚ†µ k€‰ú‰ú‰z@¦•ieZ`H;¤Ò­‡ZµB‚×2¯e^˺~ìú±ëGàãÆŒÀÈü‘ù#óÊ›•7+o¯¤½’öJ°hdÑÈ¢8K‚%ÁRzåé•§WžâÀdÜdÜdœv+öŒïß3.¨\^¹¼r9µÛ¤ø¡ø¡ø!¥t‚NÐ Jé-z‹Þ¢”æÐšó|-++£ô¢î¢î¢nîù©c§Ž:Fiý`ý`ý ¥‚ƒà 8PjÒš´&-¥}\×ÇQjL1¦Sè‹6iç±ó1ØýØOü˜j¦š©~R\ÄE\ ƒ 2ÀÊ[y+à(Žâ(pmùµå×–UUUÀê5«×¬^XÊ,e–2`|t|t|è)é)é)öì=Ø ÖÖÖz¢'z8×:×:×TNåT>·>³™ÙÌlp§qšø1¬ëƺÑïL‘¦HS$ú…\!WÈKšI3iÅz¬Çz€ gÃÙp€~O¿§ßí}í}í}@LjLjL* –FK£kš5Íšð|_(++»vîÚ¹k'ð®ö]í»Z -¨-¨-¸ûìî³»Ï2M¦É4¨ ”üuò×É_ÑÏx3ÞŒ7ýŽ‘’’Šûô/è_@¿»]v»ìv€ !ÓÖùÖùÖùsY¨ß©ß©ß àÛø6¾Í~ò̽—«åj¹p)u)u)¼õÞzo=àØèØèØx~íùµç×€c°c°c00V=V=6÷'§ † C`xdxdx„ò~Y¿¬_(f†4¤œátœŽÓ‘¼Vu«ºUmõ6.5.5.…‚-eKÙR˜ìžnß,¾Y ¼tç¥;/ÝTþ*•? vˆbÇp@R@R@ÐUÓUÓUÜ ¼x7èÜÚ¹µs+` µ†ZCÅ‹Âl›¦hÒ5éštâ2b bÀ߉•X‰µÜYؾ°}aûçùqqqƒ£á£á£áìý +.¬¸°ÂºÛæÀžïÌOOO€û:÷uîëþ#ῆ×ðÚ\7v4v4vXÚ±´cipná¹…ç7òoäßÈÖï]¿wý^P÷î+ÜW@ZûVí[µo‰SCƒCƒCƒÌOÇŽ;¿³àøžìû}ßïû~ð ~Á/î'$#’ÉÈUùÄù‰óçg­L^™¼2™Æ'~’øIâ'¤}bóÄæ‰Í r^ÎËy¶š­f«<ÄC< †j`6HlÄFlÌîfw³;Àf°lÀ5qM\¦nGÞŽ¼‰õ}}}h’ëåz¹~f5e)KYÍzøÃþ÷¶1Ìæ s†½ÎaŽ0Gíõ¢^ÔgZ777ααÎ1Ô½±{c÷F|;¯b^ż L31L @„€Üà@ %”s-u Ô¦KÓ¥éÏM¦L?˜~€âÒW—¾ºô•à-é—ôKúÙò/_$Q$ŠDÝÛ†b£˜ó°•yÖˆÙº‘ûŒ”RÒ¾ƒ‰eb™Øœ¼÷ñ>s²Ñ¹Ñ¹ÑYØn 5†C¡ ‘ÈG0Ážðü3Þž|ä6­j©–jŸkÑéróåæËÍÖÝcåcåcåÜ ©‡ÔCêñm‘ïaßþ‡]A P@ª ‡za% %Æ1ŽqQE4DC4äó ò ò ò½mL3¦ÓüS¸)ÜrùqÌã˜Ç1ÖÝšHM¤&’y›Ê¨ŒÊ`&r"'rpp‚œH  4‚’+ä ¹®ËÐeè2Ðø¶â¶â¶bæ¼c˜c˜cØà ¿ßÎoßðßO6=Ùôd“I ­¤•´’-¶Ûc/œ§lmµ8Oœ'΃ó­¡[C·†K¶%Û’½çs¥J©RªT÷6ö6ö6²ÅÍëš×5¯£ñdÙAv@*žωç@!‡r€ŽÓq:DÀôÃþm i i ³rX9¬ÄH1RŒÜóù¬ôglR<1‹Cí±G©íJ"µG·-ï£-h±îž­‚âßž½r\ùçìˆ;ßßß™˜à#ÁG‚ Yì{Ä(ÆŸñ‡YÈò„Yˆ,DR¼|6hr~KÅR±”; `@Øe—HQQQQQLö…íÁs Ù´»Û¦Ý6íÖ3qL—Ó€,d!‹9ÙÈ7ò¼°ÝXf,3–AÁ0 Ã0·ïDëtëtë´85X:X:XÊöÉòeù²ü»—ÌÌÌòõ­é[Ó·°zÛó©ÐÎ÷ô`û…ÍÁÈF6²É?ëëëŠß–m•m•mý¶hÌmÌmÌ3Öèjt5:ënøÂ¾pîVw«»ÕøŸÎë×;¯“MŠE¢½EoÑ{çUn#·‘Û8ý_>>>Ì3ÛzoÙO¨¹Xü‰Ù‚L°u»gÓ ùp8`8`8ÿ°¾j}Õúê5Aê#õ‘ú¤ž|¼òñÊÇ+ÕuÆ{Æ{Æ{ôè­³·ÎÞ:kžà'ø žÍ–ÄHb$1¹´Œ–Ñ²ó— …Rö>žáž‰‹ìÀ¶Q‹<a¢ÝB4£ÍÖÚ@hC¬ž©ej™Úÿó™IšIšI$¥’RI)sÍb³Ø¬¶Ž%µKj—Ô®Š5è zƒžü¯ø²ø²ø2-·ùm´Nýƒ¿°´ëlÓnv`vp7H:I'é?,¡Í´™6ï}Oî)÷”{2÷Øv€xä)Š·õlèÙг˜„ÍŸ½™þ+ŽÿWå"2Ó)IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-87-red.png 644 233 144 4232 14774263775 15625 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜOIDATXí—mlTUÇϽw¦eØb-Q)íÔUqa(ˆ2´šlÁ¦,bIÚtMAÅVº+vi€²ÙF@^\Ö,ÙÁ•j-`%›­²$ý@¶í¨³ÑØèôu:÷å·:çÎKT²Ù}¾Ì<÷9çy~÷<ÿsÎŒãv«ˆ3uq²/Ù—ìS†"R’N&L:¹|Ãp£í/b®˜+æÂxØÚ%Â!Ò‡xßÚ%ÇËù2ŸÌ_O]ÏË·Yl›Õúøø”ޓޓޓõ}Êe‹²ÅIÜ?¹r?_umÕµU×`Í·k¾]ó-yŠ·äŠ/¨]P» –ŽQeä‘w€¿q?÷cñ;ÙúÒ¥f6Îl8œ{8àÉóOž¸uÒ­“®4_iŽÔWê+¦ø§ø¶_Ù~EÂmú€>V¶å±håÙwyª3Õ™üZšßi¥1¡õBIp?‹÷ÝƵÛu"F»•ÞÊí¦ê©zjÈüÞüÞü>ªÅvÚiŸ«ÝÕîj·VÙšLQSÔ”uHâþ¾dñó´Úí®úí6ùš¢ÚÕ›ô&½É ¤¤¤Ã}ý÷õß×oüÊÖâûÚûÚû^$¥‘^"à-â& ü”v÷º÷º÷ê©]u]u]u@ˆ!ú%©÷´÷´÷tôØqttlü%q]J¨y.&Þ 0Ñä„uížú)íæ®Ì]™»2ª]ß"ß"ß"Þ[v'”b¥X)^Z_F½žPWÿ¥ÝL»‹µj­Z«öçHàâªâªâ*ëO³ÇfÍÓÿi·º[ëÖº½™â˜8&Ž‰È±£u%ÔKÿ£%j÷µx?÷_J™R¦”(¢Àüµš¡f¨ E(âÓϲ†³†³†…Ð.k—µËÊÇ‘‰k:÷³TûÛ2±L,s|ÞV¢Zª¥Z 4*Jã¿ï~¯/¡3 yoÚêÿieáÁ¶uú”IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-79.png 644 233 144 2632 14774263775 14715 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜOIDATHÇÍ–]LW†¿Õºkpé¢m ‚µ4¥%Á, ¦š(ñ'5MªiJBLhk¸hH/à†Æš˜hlkÓñFA« ‘°uQSbCClH«¦be/ÄP»`ùÙ™sž^ìÎÎôǶ—~7;ßßû¾³çÌwŽ€ˆˆ<ú0r\#ô÷¸ïußë/´%ýCxÊ|Edû¡í‡˜"ùÞ|¯~EÍ™í˜íˆˆç-Ï[âï]Ýëëõ‰äŸÊÿ:ÿk‘5#kFÖŒˆdoÎÞœ½YäÀðáÃ"ÕžjOµG$'žω‹T®:^u\DîÈ ¹!’ä—¬:«N"6ŸÃŸÒ“üÇë¡ý·ößÒ ð.ç¬r«œ;2½zzõôjxÔû¨÷Q/\j¾Ô|©Šs‹s‹s¡±º±º±Ön[»mí6g)CCCáÔžS{NíqâÖ7³Õ³Õ6¾~×áOê|øVŸ†Xq¬ØµgÐýºø…;ÜuLSÇœlÕ`Õ`Õ ´\h¹ÐrúºûºûºaiÉÒ’¥%ÐÖØÖØÖ™÷3ïgÞ‡ƒwÞ=x×%lƒé3}n>›?©G ¸ ¸@Ý„±‘±×go꘎šRSjÊi†¼‹yó.B¼4^/…D¢?ѻ»»ÂP9T9T9Á+Á+Á+кªuUë*—°7Í•æJ÷˜±ù“z uFñÜ1KÍR±m‘Ì‘¨DE¨¤‚Št\ÚÆÚÆÚÆDBËBËBËD]®@—ÈÕÖ«­W[E"=‘žHȆÅoX,²p|áøÂq‘’‚’‚’ǘ4~0~pñ¥ùSz»ÇLë°u˜V'Ô çMwîÛ¹oç>8Û~¶ýl;³ý'÷ŸÜŠë‹ë‹ë!R)”»6Èݤ›€˜õ‰õÉ¿î1‘CßAíǵÛíªÌ Ó™èÅ®%e€€8qâÀ5®q ˆ%êªk¡… ˆ \xÓæ¨9êæ³ù“zÄžcàùcsà¶uÛJ¼Á¤*Seüž†8£:Tè]£k\®së`E­¨+d…¬¨U§ê\u¦ªT•üŽNá§ùlþÔ\ý“ÿ²u@½§Þ#Ádêg˜L=ÿÙ4 ÉkP5ª†„ƒgãÿóäüY™>Ë y¶±—½d8KlUYUÌ€îÓ}xð€ãÛùô–HõÛxÿyV>±·‹'ö>ödÞ`ÿ­û&ŸpÈWIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-138.png 644 233 144 3056 14774263775 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜãIDATHÇÍ–kHœgÇ3ÞŒ‰`°KÓ6©è¬4 ñ6sm.®ðl2¤KDèºn ³³Ì³ÓllÒÚ`¤+è&“"VòaƒNA’¨`v]0Ðo#êhõ½<¿ý0óÎ;Ý¥ßó|y9ÏyÎÿÿç9ç=ç‘-ѯ€ãÇ;Žôˆí8oï§~˜úaöß#ö-N%œzÑ›ol¾q'ãŽ9fÛ–ß:/bãÇóYû²Eì”®”®„Q»jvÕìJݱÿú\~—ÿµõßÖ ðàü¦˜þ`ñÀâ°mËo·â-¼x|iý~HêIêIx )É)É"ðÞ‘÷޼ÿ‡Èÿ¼'+NüäüÉ©`Ìi¤©À +X+g[þèy+Þ³ð->‹?¢G ³,³L*OWžvµGÆî¡{ßö¾mñi~öñ ŸÆ]½Wï0šfÖ¹¬Nª“ žšÏÌgÀ×ê¬: `|f|Æ:7ô/õ/A ò1“Æ×Q<¢øz”/ÆÑc§Ò¹zª¤Jb‚ʧ7ëÍ Fac-êP8UX…AUGÕÑØ¡Ž©cê(ò(¨£ªJU¡€zÐT¦Ù`6î>TeVe+¿ÄÛ¯ÿ®Y×ìJ"Œ¯Ž¯ƒœõT=%üz9¼)¼ ´;ÚWÚW¶­V«ÕjaþÐü¡ùC —ê¥z©í߸²qeã ÌUÌUÌU€¾k£r£’pÔ}‚Àøã_¸V\++‰–GDÞóeÖsÑsq“.’›–›¦òñéùz¾|·tmyryR\G.ööˆôý¥ïrße‰Þ©ÈÁÐÁÐÁHnQnQn‘È™â3ÅgŠEæ¼sÞ9¯Hu¨:TÙ½m÷ÖÝ[EªµÚÕÚUq­Õ¯ž^=-ßÉor}¹>•/{Ï~öûMzLODáЧ|б­c[,!¿{½ººÆz‰¯¤±¤Ñþw‡r†r†ràaÁ‡P,!‚È[Ì[Ì[¯Ãëð: ¿<¿<¿FFF ûföÕì«ðhWÏpÏ0ëŸYðMö7ÙÖO1ô©@z_zŸêbuÚ=íÆ¢GÍB³Œ_ooÁÞ¤½I{“ÀÞÞÞNÕÒ¥¥KK— t_é¾Ò}UžUžUc#c#c#°çøžã{ŽCzNzNzœ*¨,¨„ù´Ù³/âjóS/§^‚¥Ç!â¬pVð¤%=Nz,"ÿ‘¹.½Ò+âœvÎ8gDœ;œ;œ;DRéáÔ°ÈÔý©ûS÷EFÍQsÔñ×økü5"înw·»[¤Þ]ï®w‹lß¿}ÿöý"¡‰ÐDhBDmQ*C¤skWIW‰XkA=NlJl±ô8DÌn³;áß‚^¡Wˆˆ&""™ ïʆlÄeíÄÚ‰µ"É’/$_y^ö¼ìy™H]]]¿ÈÀ¹sçD‚ÍÁæ`³HNcNcN£È¤gÒ3éé¼Ùy³ó¦HðyðYð™HVyV^V^ >Sþ¤ô€ˆ­Çª1:–;–@$çüV_Ò—¬_†/׃ÎAç ÓNAëBëBëBûÎöí;mÿußußukÅZ±·ÍÛ«·WT¡*dá(ß?;t<øY‰ˆÜꇆ‹ -8sè+ºÝѰnËzé¥P(TÜþ+^ñ (¤B`†fâüËQ¼.½]oãS - -–°[ýñ}lÚ5½’ˆׯ5À´ú˜é5½„Í3f›Ù¤ 0Ì0Ã`4MF­F«Ñ ¦Ût›n 6ÚÀè3Àø³qϸæ»Z‹ÖB˜N bóÄf@sýèúÑîcòó©~õ0T¥V¥ÚŒ€^›Õf5Z´÷+@G°ÆkQ_䵨œÅºYgÖ¡1` Äã[|ÿ×ùaVâÝæõ5Í|Îç¤Ù)6>2>bÔõ€À¶-¬$¢ñ±YÅÿÅYùƾ.ÞØ÷Ø›ù‚ý/Ð/ÌòGæIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-89.png 644 233 144 2534 14774263775 14717 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–}HUgÇ÷˜ù2q…E$•XQ³3!¡²´f†Õ­èÅþ¨XDÌ((¢EŤr9k9&#ºË0)וbàjÒZƒŠè…^`¢dîš×;Ë{ÏsžÏþ¸÷Üs7 ÿíüsÎïíûý>ÏyžßóˆˆÈˆÈ[ÀoŒ7Röñ™ãO,I,™Ô¶ë¸V¹VÝß×}\0Ò3Òc=rl;nçÇÖ‹8ø±|¶_FˆãHhJhrEì*X—½.;qtØ®½IÍIÍÿ˜°ùÒæKO_<ÍçÐu³ë&@oQo8¶·óíz/_ªþÇ/ñ—ã/»Ú!axÂpÈ(Î(ž¸-œðl"¸—º—tÄuÄiÔ+ …]ôÓýôÄØv<’o×Ûx6¾Ígó‡õŒ*U(+ËV–% <ú vÛ50BÍ@=õ¤ðƒYcÖ€þÓœbNau…®`“€oõ*½ ô]sº9A.š§ÌSÔQG ÊÆ‹àGùlþ°ùï¿ýæSX“¸&x úÔ€ÒÕ>µ¯ëÅh{Šôb]¬‹Aè]ºH/Ð ¢3ˆŽÓ3ô 4nåU^B zT´ñ#|Q~‰ôÉwÔ•ÔÕ? ž¨'*Š[Ê/Öhk4¶#x=Øl…nw·»Û ¡îPw¨Û<<<=­=­=­`=µî[÷8Yó¬yQ¼R‡Ïæë‰«ÿ¶ì߲߮¶fêŽÐÃÐCgà½7z¯ö^…eþeþe~3aÌ„1`õÎÕ;Wï„—³^Îz9 JsKsKsÃ4I]P¶»lwÙnà)÷qj¾0+ÍJ‡Ïá뉻½Îõë‹ÖmRw‚;‚;´=ÞLo¦7&7OnžÜ wKØ^±WìEDïÐ;ô@ ‰!1 †"°‡a|g|8Žãbfþ¸+îV¾‰'Ó$Ÿä—z¤>rÝwÝwÝ_ÿ[ùÛïö»ýb~èqèqè1ž™8~”åG‚"Áˆ#ŸàÎøÀÀßëïlIÆ”1ð£ücþ±&ù$¿ÔcéÓj´­¦¿Q.¯<^y¼RüÞˆê= ü“¦÷l‰@wCwo;(ÿ¢ü g>ÿ„b‡IøQÉol‚>ᬜ¬œ¬4?-}Zú´ÔÆxD0†1§ ±QltÆ÷÷ðηï|뺥aKCÂÆÚx€â!`á›|’_ê‘ú¤Ð?m:¶éئcöÎø äƒÂ#ŸCp7ÀˆQ§€õ§×Ÿ€Âk…×`…w…J*ý)Aè!~C @ð°øL~©GêSÌ–Zä*q•¸J¬K¡jª¦j"šA3hÅ(FD$>Ÿ)Ó•éDDmçÚÎõî;MDÔåëò¥,JYDD‘pµ„)~>Œ¥R¥Q;µS»Íïêvu»º­–—÷«¨ÈoÍoÍoŽ 6Á&€³8‹³Ø‰Ø bL ÍrwÝÝuÎ7-nZì\÷nôn€5Ö\H8Q•«&Íð{\Á@x…Wx!äW™™™¸'õ‘âS|Šoê‘9Ñ|ªöTí©Z‡Ry*O^Ãk8{ëì-§ÐÔÛ©·€*©Ø¶Æ¹þvÇÛôñM㛲Ïè_é_Ù|—Z.µ\j±^À?0/ó2ïÔ#R—©ËÔeû›d—yæzæzæòy¡-¡-¡-@D¬6Òtg/ŒŒŒ@—¯Ë]»»v@Ï‘ž#° qA#äeæeÀÅ÷/¾ »»à= é&nb2j¶@Îþœý9û ëPgª3Õ™'žQzIzIz ‘vY»¬]î¶.üòâòâr^'ÑŒz£Þ¨Ç$‚"h¶V¼™úÑÆÆÎçßο ëÆÖÁ¾GŸÅ_0ã„qÂ8a—ºêFÕªFÔX­V«Õ·¶Æã´0%Ž9Ÿ¹¼.¯Ë;ô7™P°þ`ýA±Úº?2õ2½ \pýgýgпԿt ýÚÿµÀä%ÿ%¿£Ô•SϦžÙ¥îzÞ5Ú5Š÷¬'´IiRš&JÙ,6‹ÍZ|2I ú/«¿¶³ílûš6ÖÉ:Y§ôŠñÇ`_°/؇ åÝ:^gŸ7€ILÚþ ìóÄj±ÚÞ."ÃÃÀ'Õ“êIÕk¬“<¬V×[Ò|ä#Ÿæ¶µR!j‡)@ ©a5¬†?:g=­mî6w›žÚÚÚçô®(E åV¦ø€ Á_b«híöV¶]ßv}Ûu^g½@ãÚ¸6<’½+{Wö."¥X)VŠÙS]¥”ù óçVõžzO½ÇÎÏß3Ïü=D®*W•«*xÄònaqaqák¼;ŠQŒ:J½/ä í³m]Þº¼u¹Xm½å® WÆðDx«ë­.€ÎæÎfŽÃÃoxr<9´Í¸™oÖ›x+ñ¥úÿøEà™žgz,÷Áf ØWc_}©ÜŸàz Šò‹ò~ ù%DY@ŸV±JåsÌa®©¶ä›õ&ž‰oò™ü~=QÛ£¶‹p~ïÌÞû%Áí6>©h®h5à½Ìi¤‘U [t pÁ·è[DSÿ2Îg.õ…ú@ý¨~4ý ~ |Ÿ8ǧ|ʪe¼ÚŠúŠzSàí6>Ù;¿wÞ~ ¢vFí ö4°×ï$q¿s¿Ôfï7€†ªÅ¨6ªñª*VÅ¢TœÚ¢¶,Ÿ*D…¨à·áHÐÏzµ Pê×F”…00@UúñÕÏû÷-šëw®h¥ˆÈ¦³ôÛ[ì-s¡àŠwŃ÷7ì™LxTó¨†ÇÞ\o…·"ȧ¹4—æw¬;Ö *Y%«ä‚Úi§=hzyk½µ0¹ùQÝ£:{ß÷ãƒëE׋À€½ÍÞ6jê•!"Òø5¼óá;ÂìŒÔ‚¿æ¶æ¶‚#±ɱ åü½ómçÛà©òTyª Ì(3Ê ///‡Ãƒ‡òÄššš‚‚¿´´‚ã„ãœãÊù笚¬p7©püÐñC`üݯG|DDþQýýÐü~wAw:–w%î šI——;ŒÆ¶¥lKÙ–N<8ñàÄ×Å×Å×AWIWIWIPXSUSUS$Æ$Æ$ÆýYå/;^v 544i>¢ŽÁ—k¿\ ¾0¿k¨5b¡(¡ÈrI$323RÄšþœöœ––!tFD£ì›Ê˜Êþö•ö÷æß›‡”á”á”a¸“'ÿN>´8[œ-NØ:¶ulëXð²;³;³;áBô…è ÑO¶´Ò^i¯´Czmzmz-܈ºÎõ`xJ½1¹mr0¿Æ²ÆbŒ†7}'}'-£!Ï>|ö¡lî¾ÙçêsIÔ©ÅÓ §Dêsêmõ6‘‘_¤Ž¤Š8Ö;Ö;Ö‹L„M„M„‰T W W ‹¸'Üî ‘4-MKÓD:¢;¢;¢E|£¾QߨÈ)ç)ç)§È™ gÏ4ŠÜoúiá§‘µÉ1ƒ1ƒµé–£ÅÑ"Âq}¿¾ß2*úÌo¬ûÍî7áÊèpûp»:¶ûÀ+Ú+Zž–çÉó@ÊÉ”“)'a(b(b(zl=¶dfffffBßý¾û}÷azdzdzJJJ éhÓѦ£Ph-´Z!÷çܱÜ1H}~KÏ–´¿ÝøîÜwçÔ1èžéž}‡_O`\4~ e¹e¹æÉ© ÷꽀ƨåCßÎv¶­´Òº¢W¹ÈE ™dVŽEYüŸ®Î0ƒZÆ_æ3ù%9†ý®ýî\¨º~7ýn:èuþ9£ÿ{iniŽÇzþ•þ¨›ê{õ=ŒÆГô$= ŒAcÐÎsžó`dYF¨µGí½Mwé.Ðo-y–<<6ñÕŸÏä7õ<9ù—^³¼fÜÉ?£÷ëýÀ´QhâeÉ?è>`É3,/˜Å1Å´QdáÅÀ3ñM¾''தø`ñÁw%ï¾ðî Ësû2PK-«À7ç›ÐKõR4P×Ô5,X h›q3߬7ñL|“Ïä÷ëyš_Oí{ìé|Áþˆ‚íû˜„(§IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-109.png 644 233 144 3043 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜØIDATHÇÍ–]L”gÇÏ| 38±Y4–.¦ÜàãWtEW;&4)$jB›µ4ÝšfR.¶ñ#©6¬Û&ën¢ÆŽ!Ý• ¤h©Vªê.µ°`šA¨Ã×:ó~<¿½˜yy'kzïs3sžsÎÿÞ÷9çÿ>""’žøp¾â|Ź,n;oï{ <9Á¸}ÖG©£ôß‚—μt`ù…åÌlÛò[ñÉù"6~2Ÿµ/ébo¤~™ú¥cOÂ>åëË×{~·ÿ|¼mÞ¶y¶l¸rñÊEþcߌ}0µgjضå·â­| /_Žý¿¤t¦t:F uIêÈ~=ûõWÅþû*üäúÉ¥œ`ü øð©=@„Öz’d[þD¼•oáYøŸÅ¯G ßá’Š’ ïùx—Ðë^®{ÙâÓÚøð>.ê×ôkFƒÑ@”¿©*UjÀ0€ªÔGÆÇÆÇD9­7ëÍ þÅ;¼ƒ$ðHàë ¾Eþx=öQš""§ò¡LÊd± >U¯7è  Æ´„Cñ.e”9fŽ™c‹o µMmSÛ@5¨zUj›Ú«ö¢€FÑ”Ë7Æ¢8>”-/[Ì[ü’Ül¹Mà÷ŽGÜ0474| À úU? óá…´…4ЂÚÚv!Ñp4 C8;œÎsœ0'l¬/v+v žÜxòÝ“ïÀÖ;õNî7êêð†½áˆÛª'QØÙ[<®9XsЂ37ªÝÚFm#Lýeªuªµ#gGÖŽ,è*í*í*µ‰«Íj³ÚOÀð ÚSí©öÀ|þ|þ|>tttCÚ›i…i…Pq¸âtÅiÃú}ý¾ÍDZ÷Ô{Êê½³·…ݯe]KVKÖâ¼;žý|ös¢Ûë·¸ýC{vû¥_úzïõÞë½¹Ž\G®B ¡†PäÏ;žwŠÒ‹Ò‹Ò¡ðjáÕ«öƒl˜ÞÚ‚ÖãÁœ`Q‹Ï½ôý¥ï­Âî׺E–}µì«M¿•oýïûß‘‡""Žóiõ}A‘¾+}¡¾ÈÖÊ­•[+EbZL‹i"¡»¡»¡»"™k2×d®Y}rõÉÕ'EV=^õxÕc‘ÙâÙâÙb‘¹§sO瞊ºÝn‘Ñߌ®]+2Y5}tú¨¤ÆØq^þøZçk"Ò¯Ç-â*v³N|)S:Dþ#""ai–krM2\g\™®Lw»ÇÝ#"2 "îîî"z¹^®—ËâšlžlžlÙwgß}wD\K]K]KEº&º&º&DœMÎ&g“HZ]ÚÑ´£"rGÞ–·%,¾%=Kz$CÄõ™ë3Ö9E̳Ã1(èÅz±ˆh""’áøµÄ$fŒÆ‘™M3›f6‰ø/û/û/‹Œ94rHäHí‘Ú#µ"s›ç6ÏmñóóiÝݺ»u·Hþ£üGùDVL®¯‹ìZ»+eWÊ"|†óg#Ïȱë±zŒ–™– /~æìÕ§õi« ¾¤¾¤¾n_¿}ýöu»g‚•ÁÊ`%ìÜ9¸s:žu<ëxfû»»»aKÉ–’-%е¿«¨«Èjõ÷ßxË-?Ú=fO%5ŸÔ|’4%èÝVtE”YfmBüøñ’öƒ ‚ЍˆŠðüºÀ n Ø¨çè9I|ÑšÃ5‡Ÿ›ÊÜ&ðŽyÇ"nÔ6¤¦¥cfYÇ‚Ymž2OšTc*IPÍ•æJs%yFž‘f»Ùn¶à 3 ƨ1l ƒ±ÞxËx Ì:íö IÇô¡èPPÞ7ôœŽYB{*ÊÅg±QeTuSÝÀlÛò/¶D"ß³ðñ[ùÂÞ.^ØûØ‹yƒýéÓÑ©¤¬ê5IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-181.png 644 233 144 2622 14774263775 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜGIDATHÇÍ–H•gÇæÒ–“ŒŒt«»4é"%Æ(V oœ1ƒ±Òý³‰„-¢?J²eŒþET³!©›­˜ýÑ%³ØÖh®ènÈl §¶ìj^º¾ïó>Ÿýqßç¾·…ÿ÷þó¾ç<ç|Ï÷=ç9çyDDäM÷-šŸšŸº .§~âé3ÞÏx¿à›¸|RAÊ) ~Y'²NdŸÊ>å<ðd³nì“ýE<üäxF/oЧHïHïHÙàÊû¡¦¨¦(cQ\>| |]¾®iv|·ã;€ÎÓ§©ƒ‘#7&6LlO6ëÆÞø¼d|Ùÿ¿ø"ðÆoüò'¤ÏMŸ+ooz{ÓŠO㬀àæàf€¿çü=G§€2ÉÔ€)¦0Ï“$Ù¬»öÆßà|ÏÄóÈYŸ³^ª¶Vmõ}wxp»aiÃRÏêb»ØE&§íËöeµ[í&Æ ]£k@8wœ;À×z»Þ êU=1°'ì `8@&g\<òòÛ—ˆçã•Ò9²ª¥Z„úu£½ÛÞ úWuWÝÅr4 t¾Î×ù‰Œ¡sôB½XËzÖƒ>§êƒh=èXŽ…ºBWÏãøP½°z¡Éà‘I¥ñߨot* ÂÏÃÏÛT€ÐD§#ÑùÑù`}e·Ž{DfZgZgZa,8 ‚]dÙE¼òLG¢K£KÁŠ•Åʈºê ~ ÿþ À7â™J3|\b'ûøgçŽ; ŒS¬ßµŠ­b˜ørâÛ‰oÑ¥Ÿ•Ö•ÖAoeoeo%è4¦Ó "£"£"r}¹¾\T­ªZUµ ¦ÏLŸ™>‘«‘«‘«Púcé÷¥ßÃ¥úKÍ—šÑ‰Hóâñ`çÞ{MæNö¹Ä~þœwÚóÚóùxúßÉ£“G‰­m\[¿¶ÞëÝÂÂBCÁP–7/o^Þ ÷öÝÛwož-<[x:ó:ó:ó <\.{þW¶\)¿RžHdLÝǃöH{Äûùs¡!ÝÁó‘•#+.µz'à@-Q¹*C¡À\l¹Ør±T—êR]àÏögû³!«)«)« VûWûWûa´i´i´É+e 7Ðè…îEÝ9Ý9ž^ ›¯‘ÀH ìùÙóûðäñ“Ç@G¼íµvÆœ1 ¤¿¤¿¤útŸîÓÐ^Û^Û^ eUeUeUž]qfqfq&´.k]Öº,ɰd°dºkºkºk’ˆš1ãÆwù¤Š8=NOÊ}ÁÚA±DD$'å-™‘I<Öƒxøè"fÄPR¤–q>:t(„ì¦fRfŽH¤s <¡€H4  â©C@6*…nذßk­yÿ`o<Ã3ýþ™c®5×÷÷™¿ù[¿9'ÉÉÉÉÉÉ;¦llª¡+¸~®Ÿëgu9çrÎåœcOæääÄ1æÁ<޼ÊÏáçðsB¶Y«­ÕÖjvE(BÉ‚?üá Ýè° Û°–%Èd $‹û•û•ûõzÑ=Ñÿít®w®w®wÃíü”ü”ü2Ì«y5¯&k¦8Äf—;\‚%XBKÅ<1OÌ›mF›ÑfœšW“W“WS:`¶ Û†ëÿeZlZlZòWÕ Õ Õ Ô†Ä„Ä„Ä¬0i˜4L „z†z†zξó½s¼ó{§Þ´¾ÃŸÓ¿“ÇÉÇ9"¸œ¹2Wæ*¾LÒHISŸ¨%j‰úêãyãyãùùž^õ^õ^õ¾˜î˜î˜njîîî Ï˲dY²,˜ð&ÞÄ›PÂLR‘ŠTOá)<“ÕÇêcõÁóMMMÌþµÿ×þ_û‹ûÄ=ˆ{—|\©Vª•ê¥r!MHÒ¢O°t–ÎÒû_&  ËI¶%Û’mЄ&4ùÌ䪹j®º©Üf¶™mæùk5ÏjžÕ<Ë/IÜ•¸+qWê>á>á> ¤B ^¼)Þo‚#+ÉJ²À ÌÀ R©ÏÁ ”×òZ^û?¯yŒzŒzŒâð‚! BH!JP‚’iP\pùÀeÆ®_/¾þozNÿN'Å;xïz^ ¦g&Ãwøß8„C8$X, ÀÜÜ(²ÙŠl@ñžâ=Å{u®:W øDúDúDñññÀ‡<üãaÀj µ…7fߘ}c6`ºkºkº -B‹Ð‚ÇMF7ÓÍt3€Oñ)>%þT2G2G2‡ýÓn7„£—RGêHF1ŠÑG ´†ÖÐ ,=,=,X¸,pY з¯o_ß>`4c4c4H=›z6õ,0¹erËäàýŽ÷;Þïšßh~£ù @*H©0³1Û´ú ÌÖåÖåÖåP–å—å—å‘?Dþù°Ø¸Ø¸Ø­+ZW´®ú”}Ê>%0pþàüA ¹+¹+¹ ð>î}Üû8ð`õƒÕV«?V¬fzÌô˜éà3|†Ï`ÖÑÑR7¨Ô â=y¯¼WÞËP$"‰¹E\—Ã嬆e Ë– ½]o×Û¡”%É’dI0ŒVVVÕ'«OVŸtz^§®%^K¼–Ð÷è{ô=À/Ã/Ã/¸*^¯Š@1)&Åiii®Ì½2÷Ê\Àó¤çIÏ“€_¼_¼_<¬B†!d@YûDíµOˆKˆŽèˆŸD8ã"ÙdÜdÜdl¾jɳäYò|·ööö,:0"Žˆ#¢°7dAÈ‚t½–i™–ÁÚ9·snç\pMk›Ö6­ôZ½V¯Ö÷¯ï_ßÌÓÏÓÏÓêVu«º¸÷˽_îýԎ׎׎ “¤0I9I9I9`®m®m®mà.É.É.ÉDS—ºKÝ¥¦;åòyÄÏí­öV{kÒ’}7ûnö]­hEë}$‘ŽHGš“õ“õ“õóÓ£[¢[¢[Øsk†Ö ­"׫`¬`üf~3¿Dj–š¥f€^¡Wè•+øÅ(F1À ÌÀ €íCÛ‡¶îw‡»HÎIÎIÎÁt+öVì­X$o=ßz¾W=ŠE%ŽI˜„IB’€tn§´ˆÑ"I=FÑcƒbØ#ö¤Ù” ÊeÐôJÓ+M¯°g:<;<;E4¢Í¤Ù4›f÷eÒ8Gã !B¦)d®Ù; ¿"¸1¸1¸‘Pd)²Y0°FÖÈ!#±$–ÄNïéÀVlÅÖéÓ¦Ê#¬$ŽÄ‘8¨*Q‰J{û/÷_î¿Ì}¨LU¦*SËò} ¾_Ã_?{ú õA*)‡:èDÞyUaàoc7vc7©ºt)èRÁzùkò×䯕åëgégégqcOW<]ñ´°×ñ+1ˆAXÑt°Â ë£rƶ³íl;9BŽ#}¯û^÷½Ž=×Z×Z×Z')Py«¼UÞ÷-¶R[©­4óÝÛ¹·soçLÇtL7‡ÌY'¨ÉÑ^gˆ3Äpkjjl»m»m»3ßUy¨‹Ïâ³ ;å{Ê÷”¯à711!¹#_(_(_X°tê§Ù×"Š…b!÷‘ce3œ+–ŸŸŸŸŸƒ3¢p<°N/)@Ø;uçá>"'È râZ¢Q4j_5Ò‘Žtz²Æ^c¯±ó;ÆN; %¥”RŠqg$Ì æ³hº_x¿ð~¡äŽ|¿|¿|ÿíZë uÐ:¸ÿøUwVÝY85ÎÓšpzG||“}l€Ò!ð#w+ÿ#wçèçèçpc_ä|‘óEް~ðƒÜUâMmMmMmäee—²KÙˆQ#jþÒÌmâ6q›ÌË´aÚ0m}èð÷¿ŽÖü8—`SÕ¼£ÛÁ\˜ s!;‡‡‡ñwa®0W˜û/^¦•ieÚOþý[ôoÑž—Æ:Ç:Ç:ÙûígÛ϶Ÿ–OÚ'í“vÉné é éŠ×}Øivšþ¼2È “ôá!â¡ø”sâç!øûƒÜÍCêP'ä²jVͪ#{èEz‘^üFkYgYgY'J ¥…ÒBÚ)I—¤KÒ¿þÖ÷¢ïEß‹±‘º]®‡|%Îg‹³Ù‡nÐôGb宣\¹Ø…]ØÅ]')$…¤4ú²:VÇêþ–ª˜§˜§˜G;%’ÉÀà<ñˆxD<²c¨kcׯ®À ´=çÁÒügÿ@×RÅtk-œIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.8.png 644 233 144 3161 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü&IDATHÇÍ–ïO”WÇÏ òc T*T$e ˜Í"Š[%Ñ.nÝëʨ#4Fìî p«–fIÌ †Ý%R·¼iݦ†ÒZXº åGëfkbaK"Vã ib6ˆMd†ÑÑæyîg_Ì< ®ÿ€÷Í“sÏ9ßïyνçœ+ ""Iᯀ9Üa^’͈ìǽ÷ZÖÙü±¦=¦=#Ä?HnInÑÇ"²¡7ìû‹Dðóû’$‘ØîØnÓÖ°üìÍÛ›÷lH~¿,‹ãAÞt¾éèmímåm¸;xw`vëìVˆÈ†Þ°7ü ¼ÅøòÎÿñ‹@ô…è ¦Û#Ï=_ôÂC/À®â]Å“Q“QÊ š H Am¼x1Öô"ÙЇí ÏÀ7ø þP<)/§¼,Bãn÷n·¥9ä0ÖÆ‡öO쟀ú7À¼ƒÎp†º‚.Í®Ùñóž²*+­¢U4€U£À#mŸ¶?gƒ³@#Ÿò) xŸÛ;íF€cmü}··ßÒlÄ#ŸíÉWYYš_šêWóßSLzVÓÆ˜g'ù䣌©ª\•YË ¬TÕC”ÊÐ4Mcðáe ão,-.]ÈàÉW¥ˆÈÏ?ä’¥ÝÒî]0ÿWv¸~ócë­ø‚~übá €¿Ê_å¯OŽ'Ç“³H_Gu1и¸?íºÛs·_ð!|˜ˆšˆú-–Nï#Q&‘ R«ÔÀ]Ç=îéù¿ÞôRîK¹ü^òÙ䳨Òó¥=¥=àð ø"„µöZ{­пппxbͶ̶̶€Õk¶NCÚÏÒ Ó Q¶µÖLk&<Ü çÃ[¼õ¨ºP<,¹n‡¯æ¾šƒVsßw}ß©ŠÍË œNü³¾ÙéÙiHÍKÍK̓;n츱®½rôÊÑÈE(¶ÛŠmOæt;ÝN7dŸË>—}†7\2\YË\Ÿ¹ÿ¿ÞÚ<´YUÀç'h+CñžeÎeNÕÍž©†©† ·yîÀÜ(üSama-¬¨YQ³¢Æ/_¿ Ö$k’5 ʲ˲˲ÁºÍºÍº-â¯ßÖoë·aºqºqºr·çnÏ݉õ‰ÇÃ/÷¬O]Ÿ ?=p+·pºFA\j]jUÝf>7¹Mnrűô•¥¯ˆŒhã•ã•23ì~nø9G’#Ù‘,²ºxuñêb‘²ò²ò²r‘¡ö¡ö¡v‘‰5k&Öˆ\ê»Ôw©OÄÑâhq´ˆ˜3Í™æL‘ΫW;¯Š,O_ž¾<]ÄsÜSï©QIjƒÚ Òåèz¦ë™I‰J‰Q 2"#äšÕ9­\+7ŠDý¥Èµß^›º6%)ûÝû¿Ýÿ­Èà†Á_™ìŸìŸì)ÙR²¥d‹H[s[s[³HV^V^VžHZuZuZµHzlzlz¬HÛá¶Ãm‡EâgâgâgDî¼sðÎA‘Õ£÷è"Ó×\®N‘´ª´ø´xIyäyä‘wU*0 ï‡ïØÅޮޮ…&Pñn\}w}7þË7Z6Z ÙÝìnvtÐ9²‹G.¹xNNNÀïóûü>ØY¹³rg%̬›Y7³šŽ5k: æ3œ 6}Öô~ƒÿtôwôÿ0îFUª8Tü3\%J«Òª€ Z¤oé>ݧû x=x=xt§îÔÀiNs”MÙÔâ"¨§žzà&ßóý®£­ÕÖ]FUª=T èáªäf¸a¹i¹é]BÓ­M·6Vê3ZCà|à<>=]·é6 ÷ñŒ©^Õ«zA?¥ŸÒO#Œ0zŒ£Ç¿g/{A»¢išZM 'ЃO_îc]·rnåX~°üà]ÂÃ}ì‰ÎÏëq¯ÇA(GóßðHûZû@/×Ë™_øcøñ÷¹Ïý°N\¸ Ô‚¿ßÀ3&K˜ïÉΞ•ØöÙö-š•T¯ª^µàh ‚Þ @{C{?¨~Õ€ DdCoØþžoðü ³ò©}]<µï±§óû?`Ü)~J”çIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-179.png 644 233 144 3042 14774263775 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü×IDATHÇÍ–oLœUÆÏ Å2u€`ÂV¨„‰¸²V ¤»–`©ÆÄI[›PÓòǤ¦Š‰5ýN„XMúa·¶u#+ÙlÌ’¦† µÂ†4)A¡a1Ên+E jѶ–ZÞ?÷·f^Þ©Æï½_Þ÷ÜsÎó<¹çÞs¯€ˆˆlŒœ¹Î\gZÌv²çSžNyÚˆÙí8ö:öþ÷ H7ý]O‡§Ã¼lۖߊO̱ñù¬yÙ(öÄú3ëÏ8vÄí7á¹-ÏmIy fWм­Ã‹}/öô¾ßû>¯ÀÂèÂ(ÀO;~Ú¶mù­x+ßÂKÄ—7Á/É%䘅õ÷­¿Ozê¡§ò_|•»}»}×’®%)'?nÜj!‚5®'Ø–?oå[x¾ÅgñÇôd=‘õ„<»ÿÙý®Æ.w¡7=Øô Å§)ã%^ÂÍ€þ©þ)0`¸ QuÉl7ÛAEÌesÔÿÌ÷Ì÷€?ëßêß% ŸÖOƒ QO=n>ˆãÇ×ã|kü1=v)M‘·Ÿ„j©–5A#ʯ¿®¿jÚøÒø-îP,3Ï<öXa…•ÛC:é 2T¡*DïðšJ2EÀÇjOµ¸mñÇô8b?¿ÿ«ˆkѵjùüþÏïOÕå?î·øäOŒ3.Ü ¬DW¢²!å/)/§¼,¢U[Ô‘¥Â¥Â¥BG†#Ñ!’”–”–”&²AÛ mÐDœÅÎÇ‹„ÿ‹dìߘ·1OVœ¯ó­óÉ>ùfzxzXú%¯ø±âÇ–“E~Îú9ë'œ1}GJdñù£ÏMÕE ÜnU‚_/ÑK¤ÿÖÉ¥™¥qíü×ÎÖ­"cׯ¾û^$t$t$tDÄ{Ó{Ó{SdûÜö¹ís"›|›|›|"§fNÍœš©sÔ%Õ%‰ä„s¦r¦DjÿQÿuý×â’¯ŒÏŒÏ¤_ò * *U‰¼UŸQŸ‘ª¯é‰­ØD#èÎéαê ^¸}#|2|’h™¿ìpÙaûìžï<ßy¾Ó®X¸-Ünƒ íÚ/´Cinini.4×5×5×AeMeMe_t«h¾hN¿ð¼D->ã›®/º¾°ÅD£@ÚPÚ:ÃòÂ# —㡇ÍR³ŒßÙF6lÍÜš¹5‚‘`$áW£v¢v¢v:;;aøìðÙá³°¹bsÅæ 4šÍ>Ÿ>—>»ÚÖÕÖeç{¿;öÝ1°ôxR=©æ%¸>w}8;öJ™?˜?؉åþr¹zwõîêÝeχÆCã¡qÈÌÌ„ðžðžðÐFµQmZƒ­ÁÖ ˜>0}`<#žÏt–ux;¼v›1ê««ÀÒã1?4?t\ôÝúnÑDD$˱YVeUÖÆjËjËj‹ˆ¶MÛ¦m³çC¡ÀHQ^Q^QžHZ_Z_ZŸÈÅ΋;EúúúDª²«²«²E2ofÞȼ!RñhErEòL–óG£Ü(±õX{Œî¥î%`$Vsvé·ô[Öÿ!ÿ!ÿ!5FQÃ^±–†–†–8×}®û\÷¯K|¼çxÏñ(m,m,m„þ}ý¾~ßš;ªþç[ìžêžºk‰ˆ´ GŽZñf1èÝÞK ˆÚ23ÁcŒ1 L˜0"D˜e–Ù„¸DQ¬{uo_´áµ†×,aí‹ÕÇÀµàZˆ¬C]Ñ®h'}Ì&³‰;æ æ ó¨9uU]MÐ×cö˜= ªƒê`‚€I&™cÖ˜2¦À(2jŒ0›´Im’;ñ¨gЯD¯DåšwÍGÖ­õÕ»oõ·Ÿ„ê”ê»óƒ1bŒ·Í}æ>´xïW€Dâ+ýÅŠUñø¨YkÖ¢ñ‰ñI"¾Åwwçÿí»’¦œ¦µ¾¦cÃm—ب5j‰‚VÃ8p€m[þµ-Ï·ð,üß¼+ïÙ×Å=û»7_°ÿÙwì^¬þMýIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-68-grey.png 644 233 144 6313 14774263775 16022 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü €IDATXÃ…—{PTWžÇ¿çÞÛoäé"Ò‚@Pt#¢j!#ˆé¨!†PŒã‚ÒÝÔ`TÊÑHâƒZ®kD`$ÀHeh¤Q™‚˜ˆ<º}´‚ZB7†î¾}ÏþA7³•©TÎ?·Î}|Ÿó;ß{Îïüüüüü|xb²™&/L÷€{À= ùçòÏ埣¾…Ï Ÿ>[õ*õ¢^ÔëПx?Þ÷[üµÞZo­§Ÿ¡ e(#yE(Bô¡}>Àø€~&I•¤JRI÷3÷3÷ó­22L†Éð_J fÌ*˜Õ|W¡ÎPgA>ˆâƒHÒ$‡Ðæäòd¦cƒ¦B( …B¡Í6f³ÍŒ*Ôj 5FÛ mÐ6ØôË"Ë"Ë¢Åÿ©8¦8¦8†K‹'.N$yÑ¢hQ´ˆòŽòŽò\}×s×û®ï]zSúÎx®ø.çÌàëÔºSwá’E²HVÐ16ˆ bƒ®œ;?v~ìüoŸ&Ÿ&Ÿ&ǞľľÄ>Æ>_7_7_G’%y’„Èf²™l°û°@;ÚÑÐ@ë\ë\ë\Àâq„¤›t“n¸»ôUUª*UWáó¦Ï›>oÒ`‹ÿ$þ“øOÊs­ÞVo«wÀòäªäªä*tÏ­[;·–üQx,<ÃD’H 4„7„7„•þ•þ•þ@[z[z[: õ“úIý€€6æ:s¹(/+/+/4™šLM&pÓ~Ó~Ó¸E¸E¸E~~~HUR•TAt@t@týº­º­º­$E¤)EÊl܉¸q'¾ªr_ç¾Î}9žªHU¤*È!Q³¨YÔ BÖ“õd=˜ë뮯»¾hQ¶([”@Ö¬Y7€YÞ³¼gy7+nVÜb5±šX  }®}®}KŒ%Æàýˆ÷#Þ$k$k$k€ïN~wò»“@TATAT I”$JA¼¦{M÷šNÖwYº,]|f³ÆYãþð'Æ:d²á¿‹‹‹'ûHö‘ì#X*P¹*Ýênu·XvvÙÙeg9¦9¦9&`Áí·Ü¶nÜ>È7È7È7æûæûæû€W—W—W ˆe¦2S™ 0'™“ÌIÀb²˜,&Wpò4yš< ‹Ã§øŸ’Pæs¹0õ„Q3jF L'ŒFÀœbN1§æls¶9Ðõéút}ÀÄçŸO|¼–ôZÒkI@èÚе¡kåÌrf9”¤—¤—¤‡† †j†j†j€EgYtð-õ-õ-£`Œ€óç”0[˜-Ì_á+|EBÖõcýhõÈ’‘%#KpÏ>`°€uSr‘\$›Ýf·ÙÅ+ŠW¯;¶ïؾc;ð®è]Ñ»"àJ•„+ @Ÿ¼OÞ'º_t¿è~ø_õ¿êHÌMÌMÌbÆ.Œ]<\òpÉÃ%À³ŒgÏ2¦©3.;öãØc?â£d”Œ’V3Ò"i‘´ˆ/¾7ëÞ¬{³hu×X×XרTfÇ%;%;%;Ïkž×<¯Êe²˜¦™¦™¦fÇÍŽ›xþäù“çOÀÀéӧΪΪÎ* æ\̹˜s@ôþèýÑû$}’>IX:,– ÿûþïû¿ÿg<ÃÃÃÀðÔðÔð‡¥÷¤÷¤÷øb*¨ *(ãò¹|.Ÿäµ¬nYݲڡJJJ†Üµ|„©ÂTa*àFÆ ÀÝð»áwö޶޶^À¶Ô¶Ô¶˜ÿÃüæÿ(G”#Ê@Û¦mÓ¶z¥^©W­[¶è&º‰nfß™}göXqä ;v6ìbˆˆÿEÄA§ÅŒïUß«¾WîÇ‹ãÅñ矼Œzõ2н_7Z7Z7êØípÇ‹ãŰ.ürá— ¿ÊýÊýÊý€[š[š[`Sü¦øMñÀŒ#3ŽÌ8¬ë_׿®ð1û˜}ÌÀÙ£gž= tävävä)E)E)E žžžÔF×F×F –~€à™vñâ/Ä_ÜÙl7Úvã;Ùÿhÿ£ýt 8.z&z&zÖ&mmmš“ KÐ%èèʤþ¤þ¤~r•ÆÐj«¶UÛªA¸!nˆØ…ìBv!€UX…UÔPC ±ˆlÛ>¶} 0ÕL5S pÝ\7× Kׂ®] °ñü£óÎ?BƒL/ÓËô«)KYÊ.Þˆ0„!¬çÏ SÆ”1el's„9ÂyºCÐ zAŸe“7Ë›åÍ€6M›¦M£ººº¨"í¤´c\¼W¼W¼`#ÙH6 ´“vhF3š¤#é5R#5â;â;â;S€##ߎ|;ò-ä—Ê.•]*ã•¢¢¢Àdù·O KÉR²´çÏ(F1йg™çˆž¬¹É1rŒ»šÃÄ3ñLüžzd#ÙÌ H#Òˆøm¦Ã¦Ã¦Ã“rRNÊ1Bkh ­H4‰&ÑS{:`„FÀ90ÐEt]4åE÷Ë×/_¿|ݱ{¸r¸r¸’;.ñ—øKü«ÔóÏ;<ïðÑ+(@ Èß ‡z>ÁU*&…ù»Ø…]ØEê_­{µîÕºâõÒ­Ò­Ò­UêaŸaŸaÎTãVãVãöOïâ9žã9¬ÐAÝÿ«š\ëÛº…n%Èr’††º²ãZǵŽkl±b†b†bÆ“ […­ÂVñáÁ»w îÔ@ Ô§Ì×.P‹ózApÜ7xܸ=p{°í²í²íúð ÂKá¥ðzp¡OÓ§éÓ°Åo5¾Õø]IrHÉD(Ê…rPÈ ƒ  fj¦f€ð„'<Æ_^^PÕÙÙ Å bP1K„%Â’NZïɄӊÇÃLrm@Ä5rç‘Dâì:s£ Mhrì&1$†Ä¬\?yä¸òwû6û6û6a{º.¤ LÜü#óÌ?‚T¡Wèz!g˜0& V>Ïãó ) ) ) qÌ\:¸tp)Û/”FJ#‹—Mþ4{Ú…SÂ)áwÜ9³;\3¦V«Õj5F\…󯔇œÞÝíôîq§w/þ‹wí»ÆÎo3•šJM¥3 Ã0 Ì®L477 –'§žœzrŠí—î“î“î»{ÉúÔúÔútßÑþ5ýkú׸<Í+]ë© ÐÅ7ú+`× r§Àu§wÿþ/ÞõööãLßä“ÿM¾c7æaæÁCç­óÖy㬶SÛ©í$ïÈ{å½ò^@P JA¹½{›{›{{<68:8:8šrÆû£k‡ú5‹ßh+V¬X±bxgWGÅTLÅäßÃÃÃñ?ŽÙŽÙŽÙÿà%Á’`Ið›'ž'x"e"e"EbzØl6›Íni © © ©]µÂ 7è zò¿ÂLa¦0“žvêjœ€–ßâ`ð;íWÞu.Žä 9Ü-’A2HƵÚHiã_2e²@Y ÓÃY#k|( ‡¶ ônîÝÜ»˜D°SÏUXŽÿÇÿ!êûL¬…<ƒIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-18.9.png 644 233 144 3204 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü9IDATHÇÍVïOTg=sgèÌ%,ŽkµŒ¥F !¥£Õ¥ ZˆÔ-¬8 Ô’QŒ-WܺL4Ín?˜&àvcØ® K¬¢ÂF¤*A1´›n“• 2þØNì-8 ŽÌܹ÷=ûaæÎ̶ÿ€÷ËäyÞç9çÌûÞ{ž$ -ú RÊ”2¥ÔH,íç-[-[³ÏGâ6•4¼cxgâ¤õ”õI¦w¤wh“ñX_×ëû8~"ŸžGâ s¹ÇP’;òväY~‰[FIù¢|ñi˜|¿ïý>’¼Ðy¡“¿!§oNß$ɹ¢¹"2ëëz½Þ¯ã%âãèø2i0iÐð-i~Áü@®,YYòr}¤àîËdyYyI~güÎ($’$ÕG$S˜"ŠHúé§þ}²°da Êiå´r:Îj µ†ZIo¹·Ü[N†óÂyá¼AMlbSBý}Å¢XÈÇ—½/z_d@sGðÉ;Çî#y_“Çü&]øoh»NÖ5Ö5’b#Ijùs|Ôô¨‰,8Xp¼à8Ååm—ߺü)LÂ$Ld©¥ÔRj!—g/Ï^žM:r9Ž2°+°+°+.È÷Ì÷Ì÷Œü%¶†¶†Èä/’'“')ª~_y òÉ;>²n¸n˜djDD3lèŠwïžý öÒÿ–µ–µ"4þ§q縆twº'ÝŒ–Ž–Ž–·Ü>rû0\0\0\LÔOÔOÔ#é#é#éˆ=gÝgÝgÝÀ|µØXX ÃíS™S™u_þ`øƒpŒ:Fõ/=’á¥ÔÔ×6bªðÕÂWä¿€¡}¬ûæ77¿yÝýu÷Öݼ{½{½{ÂÝ…» wæfs³¹(\]¸ºp5`uY]V`ϵçÚsãÂ2F2F2F€™´™´™4 ËÙÕÐÕxÔ«¬‚ynâAêƒTC;PÔ^ÔàÝä«ÉW_Û(ágÆjc5sáJú$é­€ŒÓI+“VÒCiFš¬N«ÓêzúzúzúÛfÛfÛfÀ×èkô5bQ,ŠE ×ÕëêuÅ…•••5ö{üíà‡ƒÒ·’Q2r|]¾Ž€¤¼¤<À ß3¾Ç\ Ôúµ~ƒ Šò¶ò6`È,Õ•dÅ¢X€à|p>8¬°®°®°ž3ž3ž3@ï²Þe½Ë€¹'sOæžòCù¡üèñôxz<Àµ}×ö]Û íÚ?´(Þ^¼­x`›µ}iûØäÜ”¶) K_¥¯^â×üÚàŠ~•ÿjàx×P×É_‘¤Ø}wƒ‡reÊ"Ç[Æ[Æ[â/õ‰'È ùò7ä“ÞNo§—œ­­­%·Wo¯Þ^MÎJ³Ò¬Džtœtœtö-ö7ìoÿ¨èôŒšÍqá|Çù’ÿ‰è‰ k»NÖ}\÷±N«å“aØORtÆ5³™Í$§8Å©{ðÑGÉnv³;!ƒ7xƒ¤‡÷x/n{ìß ß%™û*ÛêÚHÎGôÄ}LÈßËßûMÔÜŠ[‰û˜V£\Q®0 T®ášˆjj¤zN=§ž#ÕÃêaõ0©­×ÖkëI–±Œe¤–¥eiY$ÍZÖ’jH[£­!Õµ¡B1 ý.æc¯ßydXvËn¿‰‹ºýÄù+Í•f]—2Ƨê%õIEÛ©í¤ûÇdˆ!’A.r1a‡DD8}|ÌDZ½Z­VK…Aõªz5?Æ÷çÿѬÔg—>+mä1cJ숩V«Õ ’bTŒ’$ 4ñX_×ëõ~OÇ×ùtþج|noÏí}ìù¼Áþñ¯§ÀIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-17.6.png 644 233 144 3072 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜïIDATHÇÍ–ýO”WÇÏS3(Zì¦Yº`M-»㢤‰Ù´6Yhbu|£;&¦,ÕÆ-®í µÛ¶­]f"FJ-Ëâ»´Ò*í’Æ— ˜]hÌÊh"‰8 LõQ`xæyîg˜y˜ÙêàýåÉ÷žs¿çûÜsî¹W@DD2b_¤Ç’KšÅI•ñù´çÓž_ØÅ Ø^²½Ô·æxæxæ~2÷³?Ž-»åŸ¸^$ΟÏš— ‰O¤O=n+ŠáZ(_\¾8m~ÿõ8Úmw#ðêç¯~pêÓSŸ² ].€PQ¨âز[þÖz‹/‘_j_ì_Ú¿´]ƒÔ‡Rì粟{üµ¨ÃÐãP¼ºx5ÀõäëÉ* Œ1À‰SÖ&`Ëó·Ö[|¿ÏŠÕ#¹2s¥¼øò‹/;šÐEDú[à¬7²€_èmœ¡œœììå,,%¬4ó ó PWÍ«æUàªPUFaˆŒEÆ€ViÄ©ÎÅø>ØáÝáµö·ÐPr«ä–£ 2‹2‹â9}ßJï”Þõ€îSƒÔP >SŸ¡s‡FPćú?¤3Ít®¡œr”yÚøÈøgÔš(?–>]ú´%ðýgR)"’û7phMKá_|8Cû»»ÿÐ.i—˜0òŒ<#ôµúZ}-ŒÕŽÕŽÕBÐô= „F`ªnªnªŽ{Fäç‘U‘U0öú—¸Ì„þË(? ååÿt4;šµK𑆋à~Ûý6¨åf~胱=c{`ùªå›–oBùæúfùf¯Û×íë†ôªôªô*ÈÝ»;w7Ø›íÍöfðnõnõn½WXÅ`E_E8+{œ{P¿ùó3ÛŸÙãåf·ÙmæÃ¶ÅÛƒ9Õ#ꪈȷ;àØÐ±!¸{@m.|½`^Á<ÂÖ¾vê<Ôy(è¶÷¶÷¶.®¹¸æâÈ^˜½0{! ···Æý:ŽdududuÀ•_9å<üþ/[žÜò$aßÏü@m†ö¥íKÁEõÚìöÙíê8ßffÚ;GêÃú0<\0¯`´imZ›vŸðWø+ü°oï¾½ûöÞko)i)i){½½Þ^9e9¥9¥ðÂÖÕy«ó@ûC¸&\0:t>¨ñôSé§Ôñ$IOv%»xJüö÷ìï‰H½ˆˆü˜°gÛ³ER¶¤T¦TŠàÂ…KfFOoOoO¯H—·ËÛåÙhÛhÛh‘j©–ê¸ß¤sÒ9éY’¼$yI²Èµ×N^;)2þݸ1nˆ|üßÆÂÆBùQä‘wyGÄtÊzYÏS)‚yڋߊgÅêy_ì{ìÁ|Áþ~°¿1ñŽIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.9.png 644 233 144 2627 14774263775 14773 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜLIDATHÇÍ–]H”YÇÏLºŽbÙ¤­`EävQHhef«›$¨a™eAĶAɱ}ÒEè^™n›Ò›ˆÕKk¨S+ KöeÒ&}%:ãØØÌûž÷üöbÞwfjñ¾s3ó|ýÿÎ9ÏóB!f›¿ì ì ì³Â¶ýû¨ß±Ù±ù›¶°Ý$Á¶Õ¶uà'Hq¥¸œ——ÇQÛŠ[ù±õBDñcù,¿˜-¢Žw‚Û–oÚç bYÅ2Çܰ}¡;;>è°¿s'ÀõÖë­TÃȽ‘{ãùãùµ­¸•oÕ[x±øâÜgüB@üÍø›¶ðUÂWBÀÂÂ……™‡Ã C™PR\R ðjÆ«Êò=L²Êüø±ÖhŒmÅÍ|«Þ³ð->‹?¬G@ÚÆ´B@YeYebs¸àñ/è5ójæY|Z8Îq’Õ_Ú°6 \ÖýºŸ ¨5|T!PÕCÀ¥¿ÓßTÿhCÚð'8ArOZø&_„?¬G|z¶õ|,§<²š‡ý¾~Ôwú¤>‰f”úZ9”XËZÖ]I$‘jŽŠSq¯R3ôN½/ãcðCÛìÛì–Àú‚˜£Bˆ% 8’8âƒA9(»luV% ×º´.xÿíûuï×^§×éu1‚j©¥6j†ž‡ž‡žÃè£7Fo€ñLÅ«x£ßè'À¿¾Éáë1…5õÂSNz`äí´ƒ÷OïSïSTÞŠ¼¬¼,pºœ.§ ÊËË!躃‰´‰´‰4(E¢H@Ò¤;Iw òÇÊ#•G€gL1…¹R®Ž[|a~K)ìïcÐîk÷ü@í3y‚?ǵj­䦿¦æ¦Âx`<0€ŒôŒôŒt覛î˜s-v-v-†5UkªÖTEýÙÞlo¶®Õ^;yídÄ”]_˜ßÒ#`ÖÝYw•FVެ&Ì’5WÍû›ýÍþfØpxÃá ‡aŽoŽoŽÞæ¾Í}›Íë8ßq¾ã<,ª^T½¨Ú޵k;)oRÞ¤¼KÏ/ ]ŠæË Ö?“ßÔ#À9Ó9Óx£¯G_ƒú5Òö dddƒ§ÑÓèio‘·È[YYYÐò¡åCˇ(Ñdh24‚3ÍgšÏ4ÃΗ;_î| NÓãô@Ëê–Õ-«c„Y|a~K]£Ëè²=B/ÕK…PB!ÒÌÞýgúO÷Ÿb—w—w—WˆÞÌÞÌÞL!&ê'ê'ê…°í±í±íÂÝçîs÷ Ñ]Ø]Ø](ÄíC·Ý>$ĦÒM¥›J…HKKbýÒõKÖ/‘eŸ²øÂü=Ÿß1ÚÍ3¿%wÈ#M—\›\› «««peèÊЕ!ƒÒœÒœÒKKK€†²†²†2XQ°¢`EÜÚ~kû­íÑRÍzžžG‘iïØ§]^Fè~ÝüΠP|äcÌ-ž¹ÈÅ=ôà 3ã¿LM@Å£@¦ËtcNÛ•1s,4858ÛB“ ÈyB^•WAž“'åI0–ËåÀnv³Œ #ÃÈrƒ C2$C —ÊL™ FÑb´G£ÐM|5¨ jÓα˜ÉÏ6Ç6GÌdFz¤PÆ^c/š¹k ÐÐ…D>|ø…(B„À¼ Œ}Æ>4}²/ßâûßäŸæ[IÍüšù€ Ž:’#GŒ¬’UAõ¨lØ j[q+ߪ·ð,üi¿•_ìëâ‹}}™/ØÿBâX¨(¸F–IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-29.png 644 233 144 2552 14774263775 14711 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–oHÕWÇŸ{]Ó Î²”hckbC…3”6ÄòOŽÞ&‹^l¾ZXeCÖ¨¶ÁX—aWW²°±DsE4cäî|7zaÛ@/XÒ®Þþ\-½¿ß9ç³÷þîïnLzÛïÍçyÎóý~ÏsÎyΑɿ€w­w­7'a{ßwýY5Y5…ß'ìž&OÓèaXXÈíÊíÒã®íÄñéù".~:Ÿã—â:2ÈüÁS´Ûá­WÞz%+?ay|}¾¾y>èÿ àÂw¾ãC˜þmú7€{Õ÷ªÁµ¸3ÞÉwðÒñ¥ý?ü"°ì§e?y&!óÙÌgEà…7^xã¥ÖÄ€¿^‚†m Û¦2¦2ŒTÈ&ÛT1b8ßLšíÄ“ã|ÏÁwøþ„¼ª¼*ØÞ¼½ÙL$Œ÷ÀÞ‚½€ `õtÍ·ö1û˜ûEûE9l*M%E_›&Óæ†]b—°È»Ûî @€l”ƒ—ÄOñ9ü =òïµýêuØ‘µ# X°B æÕ<°V}ª>Å2¯šwÌ;§Dæ¢0 ïè;ú˜FÓ`RÄd˜ f†5 °@ͨ îà'ùRü’.èåoÀ7훎=¨?T w+Cúyý<‡å·Þ´Þ„HI¤$RV¥UiUºBâñÎx'Ì\¹:sôŸzTºq&ôkúµÞV—ÏáOèI ë†=m{Úœl]†Çš·æÝ‰Ç6ÄŠbEPw¾î|ÝyÈÙ—³/gTWWÃDïDïD/Ô­®[]·|í¾v_;4ïoÞß¼ø“Q\†OììÒøRü =Ia¿ çœ{Ê{O5-Æc,:ž3GÎ9sÖ¯Y¿fý·õ­õ­õ­P2X2X2õ»ëw×ïvã¥÷Kï—Þ‡Þ£½G{º~õs¼%Þâà›÷\þ„¯HÎ/9¿”WˆTm©Ú’\_ñ3þZæYæ‘LÇS3Y3Y3)24<4<4,råà•ƒWŠÜÍ»›w7O¤vsíæÚÍ"á•á•á•"=S=S=S"áÇáÇáÇ"QÔõ‹ûóþèýÑÁ÷]þ¤È}.÷9=3·gn§ûA4A ‘FÝ™ðððAùXùXùŒLŽLŽL‚9d™CÐö°íaÛCðßòßòß‚ÜPn(7Ý»7voL«X½]aW¤·‡?¡Ç+¢/ꋞ1»ÑnLÍ'Ogê)=%"ýÒ/ý"ƒë× ®9±pbáĂȮÀ®À®€H$;’É †‚¡`HäÚ¦k›®m©>[}¶ú¬Èªèªèª¨Heqeqe±[0ïœ÷†÷†Ëçò'õ,µÇtS|.>çî±Ë—;/wBMKMKM ÔÞ¬½Y{J J J `hvhvhNUœª8Ue=e=e=pi祗v¦µ  ˜0­Ž«ãKï±¥O%vÌv;º]™€F£Óì!B@˜0á4]teSœ†·`GìÈOåÿô±9§Ïè€ðÈ ›¨‰‚úB}¦>5¦ÆÔ¨“ê¤: æ´9mNƒÎ×ù:T¡*T… ÷êVÝš&ÔÖ~íçQ²E?©ýOçÇéÌ*¤B@\·è,¢Éßãoþ¢Ì2 XXXÉX¢¾sÉÉ%+®ßÕïbúUýšŽ¿dçÂ]™è>çs²Ý%Vo«·YsÝ\Àƒ\Û‰§¶D2ßÁ{â]ùÔ¾.žÚ÷ØÓù‚ýžzSRY´WIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.3.png 644 233 144 2565 14774263775 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü*IDATHÇÍ–mHTYÆÏèšZ–Ù*eI´PBä‡,¢²šQ²E‹(¨-“Ú…eýÐ˺l‘D›ÕîÔc¢ìƒ«®M‚X¸‘,`mf"´Q⇠fF]ñÎÜ{Îo?ܹÞéÅݯ/÷þÿçžç¹çå¹G€Bˆ¹Ñ§€¸Eq‹âæ˜qÜ×v>© © »ÁŒ¯à(q”üõ¤Ö¥Ö8o8oÈvlõ[õ±ã…°ñcù¬¼˜+ìDbcb£#?Ÿ=9{r’æ›ñÅGÜ’Üò‡[·4{›½ƒ‘Ç#ù|°c«ßª·Æ[x±øâÌüB@B[B›ãoHœ‘8CXìZìZúY0´ví,xÿ6^Å€áRHQùÀcXí]LlõGë­ñž…oñYü¦é›Ò7 Å{‹÷&×›^Ü‚ª¬ª,@ˆ´õÔ“ÂÏzµ^ $èôh úU?0©Â*  ž«ç@­þZ¦žD†"CÀ Np‚Sh¤½jaÕBKà‹[6¿©G¼¿¶µ[¡,©, P‘0z^`@®•k‰¨JåQ³€ñ÷f RI%”[婼©¬R_êÝz7¶ê=b¥#=„ËeK`íÖ˜¥Bˆ¯~…ä‘䑱/`Ð4€ ¶á—…² Â&”ö­vT; ¡e¡e¡e1‚j¨¡Æ#ç#ç#çÁ¿Å¿Þ¿ôý®~@•©2&ø3ŠoñMñ›z¢Â®uAEuE50 Wá4œ`¤9FŽ=C§VžZyj%¸F]£®Q>jÁëÁëÁë°qõÆÕWƒ³ÎY笃ROéÅÒ‹þ=ü$üò´< l±ø¢üQ=Qa½ßÃÐÐÔÌ”óÃíáv4+óà僗^Ú _T\T\Tü±0ï3ï3ï3X7oݼuó 0˜LÀ‚Œ 2 «³ë^×½©rM–›|6¿©GÀœ‡sªFÉÉ>˜ô`Z0 Üãîq÷8ì;·ïܾs°ÝµÝµÝe×iZ‡ÖaÇc÷Çî݇ Ç7ßpÒÒÒÀÿ›¿Ñßhשzë-ÊÕ#À9Û9[öûáwÃ`¬Ÿ:öÔΪU; â¯Ä_‰¿kz×ô®é…¤É¤É¤Ih­¢UØD}Í}Í}ÍÐãéñôx X, ŠÝ+v¯Ø ÞÛÞÛÞÛv½ñ£Ågò[zâ„>ésô ¡ïÒw wL!Dzôl÷R÷÷!…ÈÊÊ"³*³*³JˆÌ‚Ì‚Ì!67lnØ,DgVgVg–å—Ê/•_¢kf×Ì®™B*•J!R{R»S»…ÝJ->“JÏt{ Œ›ÆM4ù¬övø:|>8>>í•öJ{;Þìx³ã øóüyþ<¸à»à»àƒÜáÜáÜa¨Öëƒ1{ä–á2\htN»Ç>8•£S§r•± T‘:¢Ž ô?ôv½d›l“mÀU®rT©*U¥1„M4Ñ(TŒÛÁ}ô¿ÐD ‡áŒÿ<•Ÿð1¢>3.KdIÔÕuW5ªF—åeyxÊSž‚tJ§tËYÎr0<†Çð€ñ“qÒ8 r¡tK7Ð!3dÆÞ6ôAmP›ÖÇ>áü¦Mö€ÑmtÈCò‘¨Ñ*Æ ˆ¾+ Dˆ H@&lù" äAyˆgá[|9ÿÿü+M€LoO}L0öûÑ@=Rpà;¶ú­zk¼…gáOû¯üloŸí}ìó¼Áþ ‘0`ƒ¯Ë¦IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-57.png 644 233 144 2411 14774263775 14704 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܾIDATHÇÍ–[hTW†Obc2$Ú ¤Qâh¬ RðA2`ÒªP£PñB L‰Ð¡ˆV$ˆµ ‰D¤£Jƒ(¦£Ouìh|¨TJb®”\¤ÓÌä6Ì8gïýõáÌ™sRÛG÷Ë9kíµþÿß·µ·š¦iZqæ«AîªÜU¹K ;÷KË_°³`§ûgÃnSSýÇ·ðaÓ‡MÎëÎë²×²Í~3Þž¯i¾ÏôkÅšåÈ¿•+§"c7À6|dØß?G»£}V‡cÇ:î´ÞiåD‘0@¬"V–mö›ñf¾‰gÇ×þůi×™×™ó'ä/Î_¬iàÚîÚ¾ú+#`p5ìÙµgÀØ¢±E*Ä_@Eª˜f³Em¶ÙŸ‰7óM<ßä3ù =”l+Ù¦i°÷àÞƒŽ€‘Ðûʷ·ÂäK·Ç"%Ò±t ÔˆîÑ=¤”]² 8¡êT¨1Ù&Û@ÅõJ½’”êKO¤'€oŒü,žnâgø²ü†mîÚþð9ì+ØWô+ˆ°IyH"€ôì¿b¾6ÅTö_r(iÄ;¾ÉgòkvAŸ4‚#âˆLý¢_ðÈVÙJBé”QSŸM•O•Ûú7õoê!ú,ú,ú ûûû!z>z>z¢Þ¨7ê…Øxl86 Éï’ÉNU¥ªHðÜÄÏðeù =a-!8~öøYs$òS%ÒñtÜñd÷dh2®a×°kÖmY·eÝ(ï)ï)ïKW/]½t–ç/Ï_žeõeõeõÌ æ¡ùyóãæÇžxº™ºiñYü†žŒ°ß¾†¶É¶Él^­:«»t)Ó324242¥M¥M¥Màßíßíß ƒË— .ƒ· oÞ6À¬sÖ9ë„ÐŽÐŽÐp¹]n—Æc±€µÎsñU­ÅoèÑ`飥Ô-ˆlŽl¶åÇú>dÙO=<õ𬽰öÂÚ à™ñÌxf`ÍÑ5G×…¾¾>+¾¦¤¦¤¦.×]®»\gùELLˆ Vaû–4ù =8—8—ȈŽGÇ­c¯~‘×ä5+­ÿpÿáþÃê õ†z-¿§ÐSè)„–Ó-§[NÃè†Ñ £ÀuÛuÛuâþ¸?î·ñSL1T£jÔ^fL~CÏ‚3&&ôN½Ó²Û×·¯o_¥±ÒXi ñ@<w³»ÙÝ ///p®û\÷¹n¨n¬n¬n´áÝ7Ä E’äÿš±ù÷­¢RT’bœ¬ô‹w/Þ½x¶n-ÜZÁWÁWÁWVÿ™×g^Ÿy ÷:îuÜë°mûò¾¼èfA|ç›ÿT‚>­[]ñ;/xH$Ò6Ð.ºèª¨¢Êæ& DˆÉ`(ÈÔ<5ÁS9OKF;)O’à}ôøQ\W@ø„Oø@n’›ä&ÛÌt7ò*¯òÚ„Îf#jd ‰Œñ_uì•ÿ©x ke-é숓Ù;qnåŸÉ,UŠfl3ŽôJ/i ÏÄ_°ò/pWâ[é[™hüø)²–@GHz¢žCX¶ÙŸ]²L¾‰gâ/xW¾·¯‹÷ö=ö~¾`ÿúȆñ-x[IEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-coords.png 644 233 144 242 12610450011 16416 0‰PNG  IHDR Vu\çbKGDÿÿÿ ½§“ pHYs  šœtIMEÜ!/ ŠŽ/IDAT(Ïí! „Àÿÿ‹ÕpÁ&mÃj•n[ 85,†Œ¿áIÖ?”´H¡IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-5.6.png 644 233 144 2714 14774263775 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]LÔWÆŸ €3Ø’¸)ë@ˆ5µD#Á½Ð½Y‹±¥ai¦4¸Ä†TÛ-µiÌ64jâE»†íÍÆÄbÃG»¬%Ð’šÅ®V\?Rݰ 2M¶,Ø‘±âÿë·3gfZ¶÷ž›Þ÷<ïó<9çÞs’¤g_¿È_ä_ýõ©|Î+9¯¬üs<þÄßë¾×ÿµž>üôa€ü¶ü6w0›yƒO¯—Rüéz&¯g”Jd‘ý…oS">µkk׿ü,ÿñ<ävåvÍÛðn÷»Ý§>;õ;a¼¼àþ¦û› ›yƒ7õ†/_¤/AVoV¯ï.d?•ý”Å/¿üÜï‑ç \®ø.ã» ÏÎ$$èmæ˜ÃŒ©´ØÌ'ð¦Þð~£gôã~ËÊ—•KP½µzkn+ž$ ƒH(bV—g!BÐû³bàMÚåv9 üÃkòšÈ!Àð€û±ý˜ï’5b ‘F‚q£Vv‚£—ÐOøÑ÷öã—`K`KÀ,€u‘Gî î €M.¹X‰ °± +™ØÃö€Ûãs%³ž·Í 8,–Úýv: 5ƒ¿”¶•’Tò'ÈÏŸË$6<1<‘$üµg;o8oðpvóì³À½³÷¾º÷L6L6L6€“éd:™,vÈÙ!˜Ü5¹sr'Xk­­ÖVï°w˜‡ü-ÎÃΰIý„Ÿ„±O.À{ûßÛÞ€[ff.ό͌áÂꫬ>¥e¥e¥ep³÷fïÍÞÅÆ¶E·E·E!¸#¸#¸6îÙ¸kã.ˆµÇÎÆÎâQ¢à}kôâúÆ?¾në{¤w¿¸[ÒAIòý"± g—ÍÞŸ½/Ÿÿ¯þ>ŸT·¼nyÝr©³¹³¹³YZstÍÑ5G•göÙwfŸtnôÜè¹QéRý¥úKõRI~IAI4ôó¡ù¡yù$=¯çõ˜Q£—ÐOøñKK¿^úõº RùæòÍŸJ’¯5Èiù|äs)óAæƒÌÒéÚÓµ§k¥ªªª)z-z-z-el"o"o"Oš™™‘ÂMá¦p“4~güÎø©´¿ôzéõ$<Û÷£×7~üRF8#Ì)«'«Gò}*Iú¯©,úwÑXјÔZÝZÝZ-]È¿!_ í í 핺+»+»+SÆæ‹æ‹æ‹¤uë2ÖeHw;ïvÞí”bC±¡ØÔRÕòjË«)¼÷+£×7~ü’û¥û¥ï–d¿f¿–.3…·nܺ~뺴½`{Áö©­¢­¢­Bšª™ª™ª‘V^Yyeå©#ÒéˆH«®®ººêª4urêäÔI©õvëíÖÛÒXt,:•Š ‹CÅ¡”1ýÅèÅõ“~â?Û·»¡c¦chð~˘ó‘ó æg>Ôs¨çPlÈÚµ! NäÈ;‘ÓÓÓ® W†+azÅôŠép ‚ *Òò…RáGÒòƒÜà°ŸfšñÀ‘#Àùÿ§rq³† ?Jõ1N¹7ÀC§Å¹ì\ç÷ÎûÎûàV»Õn5Ð@ àÜ€HrKÜ·œzçMçMpé¾ã¾œqŸuŸåa’ß^^øÉ>öƒÎŸ³%'­3ã\t.žû–û’?Þñ=`†f7^Œ)¼û¶û68ß8ߤó½EÿGweòîŠF “]À‡|H0¹Å8uN à÷ÎàéØÌ¼©7|†ÿ'ïÊ'öuñľǞÌìÿ/f†eþVIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-30.6.png 644 233 144 3255 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜbIDATHÇÍ–íSTçÆï³ ìÊú6ƒFÚ08qu„*é4’˜Ø4Í¢Å2ŽPËŒN36:6c­51~iâ4dw‚‚›†&ñ-¨°ĦØ1-:+FB– Ž€"ïÃe÷œóüúa÷°;Í?àùræº_®ë:ç9ç~™¹ ØRl)¶alÛÛר×,ø,Œ+ ÐÖiëní…™ž™€ÙÍþÈl‹b+oÕÇö‹Dùcõ¬¸Ì’h áTÂ)-7‚ß‚‚Œ‚ ûœ0~÷8Î8ÎüW‡­µ[kN|úc¶ÃýæûÍùùÅVÞª·ú-¾X~yëÿôE`ÊS¾Ðº ajÂTH})õ¥g~.èxܯº_èŽëŽS60ú'N• Œ1†u Ä`+©·ú->‹ßÒ³ôÃ~’V%­áü‘¼‡/ÜÐö å;ì<ê_¡3TRAN04CëõÇL¨ÿ˜åf9P«êT€º¡nF¡QÈèÃú0ðUTáTÿŒðÚéÝéµ ¶}BEÞhÞ¨ÃI¹I¹Ñ5Üß[Íò³ò³@ý ôoà.wA­0‚Fò+¯ò¢Ô,õ”zjòM¡âTœŠJ)¡$gëX‡2ëŒ÷÷ C úU„?9?3?Ó2øÞ꘥YTÎ?Ÿ:>‹‡Ž”ŽàçýÏ?ð=ð1®ÿBS3ª7Ñ;Ñ;Ñ ƒ©ƒ©ƒ© 2T†Êˆ1të\BýÇúËúËÐÿ»7Ü`<´8ÌYYÀßÕŽê±xË(MD¤â+Øfl3`ä 1df=¿ò¹ôçÒaöÂÙ/Ì~•ÿûüù;@_¯¯××ÃÖ[wlÝöaû°}66mlÚØóûU¿êâMM·6Ýçç~ç~ÔOÿ”óFÎ0T`^6/›Y°=c{˜wÃ~læj‘ì:÷¸{\¤î ¿Çߣ=«ßÖê%¸88"ZÛº¶Â¶B‘=Ž=Ž=‘Ö‚Ö‚Ö‘;gsVä굫׮^ñÛýv¿]D›£ÍÑæˆ4j8ÔpHäbçÅž‹="—syÕåU¢-JX\¿¸^‚ß^jŸß>_{VdÍÔ5SE˜öc‹ÿ|FíŒZ×rùe†7Ã+òkӽĽDó5þåËs_ž“„¼oò:ó:E”[¹•[$11111Qd¦g¦g¦G$¹4¹4¹T$%=%=%]$Ðè ôÉäÕßß/ò°ãaÇÃ÷ŸÝ·Gäþ½¾„¾IXR¸À³À£ùD–ß[~OÄÆôÓÓO»–Û¨ÖF´ÒåÌô§¿(rËønÛwÛd°u¼5¹5Y¤îf]k]«È¼ÝóvÏÛ-r¡øBñ…bûZûZûÚ¨ÒCºˆ£ÁÑàhˆÆ¥=J{”&âŠsŹâDº>ïªéªúvÈ2DŽ~Sµ¢j… ŠÌ=0÷€ˆé”")"ݦÎ%F‰v[dʹ)çDZ^iém镤¢‘¢¯‹¾i>×ìoö‹tŸï>ß}^$Ï›çÍóŠtfvfvfŠì›»oî¾¹"ƒ}ƒ}ƒ}"Ù{³÷fï©öV{«½" +V.¬¨¨¨ñµûÚ|m"=îúîz‘ÔŸÍï™ß#I"5ŠhõªL•i·…wED®ï䱓ÇNN~º¥ïØ÷ŸÚЉe¡e£ËFá膣Žnˆ~ÌÇS§O…œ+9Wr®@cWcWcŒnÝ<ºÜÓÜÓÜÓ`Ä5âqÁ ç ç 'd·e·d·À_ªNVdÂÒãoÇ<Ç<@MØOd\T|e¥e¥@=€™…2^7^þdyÌcP7ÕMuðãÇ3*©¤H#´˜x2É$òÄðµIFð‡ˆeo—½ Ã~„öÈÃÑîh‹çp`e`%»ÃsÆx'X¬eÜœg¾f¾´ÐL3˜.ÓeºÀXj,5–‚Ùd6™M@5ÕTƒi3m¦ 8L9å`.2‹Íb0¶}AãfvdŽ]¤Òß;¾‹§72Ç~0ùYo_oTd2?6šŒ&³Ä,!4ùÄ"™°$’11Q°xP“ý“|ÖÎÑûáä앬-\[³W²ëé]OOœr'ècú€Ql3ê’º€†Qlå­z«ßâ³ø-=K?ìçI>]<±ç±'óû?«î¢\TYÕIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.9.png 644 233 144 2601 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü6IDATHÇÍ–]lTE†¿ÝÒn »"P¦„/ ‰Š-h›€)ôFQc•ˆ5„”àm „«RMCÓlj)á7´^™&&‚ Úi(›…maÛ={fæñâììY,Ä[æf÷û{ß÷ÌÏ7# ""Eé_à‹Áƒ3=;ø¾ïÏ3ÿÍùÇ<ûˆ‚@} þòWðìÁg„†ê«¾mã6?»^ÄÇÏæ³~)ß::¨HÛ-ðöâ·çÏöìÖKPÐSÐóÐ…z?èøá»¾ã#ùuäW€{÷*À·mÜæÛz‹—/-ÿáÜþÜþÀ?Ê å‰ÀKU/U•~ì% •Âúšõ5·rnå˜ ¨»@!…¦g;¢Y¶§óm½Å³ø–Ïò{zf­šµJêê Ú½‚«y!òà¤z€vÚ)äw—» Èußqß! 抹LÇ8æópÐuGIšßSC©!à_ò%…žÐT*R)±¯vúüžytmÛ*aCþ†|À¤@ ªAàO]®ËI™Í·æ[/ ÀƒGf „ ƒyÎL3Ó2^crÜ^·—ëU®ÊµîÔÎ†à† ØV™µ”"" @ÁHÁÈø4¸®®+ À[ÜÕÕºšŽ•ü$¹=¹â â â ²µÐB‹o:7œÎ ˆž‹žŒžý—É5¹ú7ý þNã[¾ ¿§'-ìÈϰm×¶]À$€.VaPÏ©Åj±?CÍ‹š5/‚ª±ª±ª1¦Œ±î±î±n¨–j©˜~aú…é áó† ;€¿˜`ê5õð…åKó§õ¤… ~]ñ®xfæ·èÙÎiç4Ië9íüµó×ü…¯©«©«©›*ìpëáÖíPÞXÞXÞèû—Ü_rÉ}èÞÛÝÜÝœq'UŸÇçó{z‚"3šùÓ«ËDV½±ê É ´ïæUçUK(>;^/i-i-i-Ù¼wóÞÍ{E‰@")cÞÚykç­¹St§èN‘HW¤+Òžžž‰mн{7“’6/Ãoõ@ø™ð3ú DoGoƒz=sìh›Ñ6£mäìÏÙŸ³– .\6ù“ù“ù“ÐÛÙÛÙÛéÏÌÃÄÃÄÃìnßݾ»6ÝÜtsÓM„Âб¼cyÇr?_U[>ßê Šè>ݸ"âÖºµ"ÁDDd–ý¤5¥k^^ó²È±Ð±Ð±Èü¡ùCó‡DæDæDæDD枘{bî ‘ŽÑŽÑŽQ‘‹Ñ‹Ñ‹Q‘3MgšÎ4‰¬®]]»ºV¤8V+މ¬xeÅ ýNX>?£çI{ Ô÷ê{’úS½Moó¿ðlßÙ¾³}°ÇÙãìq é$¤ëÊÖ•­+ƒXE¬"VêÔ¨ƒ¥•K+—V©§6žÚèã˜vw¥»’$#ßcSOåXæT–©205f«ÙŠq/º§ÝÓ ûu¿îqˆC`êM½©ÏÚýç8Ç9`˜a†³üG9 Œj0 žWÏgwÇžÊÇô1Ò}æ®×õ鮘Íqsô>½Oï.s™Ë ƒ:¨ƒ@M4r”£P¯¨RU :¢;t€Þ©w’ðnÞÂ\O]O=±=¦óÛÎŒúEý ßÓï‘J7ZÃîq/ýßqâăFÒ Ç€Þ¢·òñ,¾å›Òùÿç®ôz€¯ùšBpÇÝqÕ¨I‚¹d. ¾mã6ßÖ[<‹ÿÄ»ò©}]<µï±§óû/û¼Ÿ_1¸IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-21.8.png 644 233 144 3156 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü#IDATHÇÍ–mL•çǯs޼…!#™šÖ.Ú)AZÒ1‰aÁØÆ^D «T‚¶fjÚ¹u‘_²E£:tv‹³b©,4p@hi±•–XŠ K3›6‚ §e®ºžƒpv r^žçþíÃ9çlîÃ>z}yò¿®ëþ_ÿû¾Ÿ\×- "" C_ó2ó2ó‚Øü‹°?vcìÆ5ñY LE¦¢ë¿…„Ó §ëëôalÄüÈõ"aþÈz†_JØc±›Ö‡ðx:íé´ØEA|¢¬íÖöéì|{çÛë/ÖóKÿtüS€Éõ“ë!Œ¸‘o¬7ø"ùåÈÕ¨÷¢Þ3ýb¢c¢EàÁ'|òá_æ¼Myc–1‹2€æâˆSë sE`#Ê7Ö|¿QϨÔ#œ“œ#«…S…SÖóÁ7Þä\E}E=¨+þvQK-qpœÚ‹Ú‹xÉÖÑU“jPjðj¥Z)^L&Wy׈S}!¾†ŠæŠfCà7y£Ð[赞7ôÈÞíÉ'x¤8»8ÔjÿU@CuXV¿º¥zTJuªÕ‡ ¾PŸ«Ï!âÌœ8#ðÕ]u¥–iš¦áf˜e ñÿ¤8¯xîO>q•""?þ3—­ ÖÏÈ÷ä»ò]²<%;%µyMþCùÁÝŸëÁó¯<ÿ ¨ßõ˜õÛ""™ïˆ-<*ÒqìÝ‚w LŽŽ$G’øÜõî*w•˜ø?~‘sgÎ9wFdëÐÖ¡­C"ýmýmým"QcQcQcrõmëÛÖ·Md¸gøêðU‘îuÝ‹º‰éúŽÄDñõ¦}¶î³u¦ ‘¼åyËEÔù–Åÿµ²ƒ³ÜYÿÜ0Y0YcŽo¾i€îƒÝºÀÊ+¬\WН_)ŸHFeFeF%t¤u¤u¤…ýú„>¡O€Ëî²»ìjKµ¥Ú áp¡„CQôØâÇÃwÓSjJ8ƒ NÆçÇç+»YþdµŒ’*ŦÓˆÈâ;;eâ/kN?uú)‘ý öÇí©ëªëªëÉiËiËi ŸHŒ/Æã‘U²JV…ýæ$s’9Iľ־־V$iIÒ’¤%"îCîÃîÃ"j¡z\=.ÒÒÞò@Ë2!’lI¶ˆ¨*¹.×I5ë_ŽŽšåâüñùã"_~àøÀ!ɘ="^¤ì™²Ò²R‘[5·jnÕˆ UUU†Ì–Ï–Ï–‹EQa­­ÖVk±z¬«Gäö®Û»nïiU­z«.âú›³ÙÙ,’òë”ù)ó%YdÖ=ë‘ß«L•ií7""×* s{çvèìoìoT;6nÙàÝàÅ››˜“é£é£é£p鿥›—n†¯l墳§öž‚kYײ®eÁlúlúl:444ÁDæDæD&Ôì«ÙW³2ã2Í™f¨ Ô¼^ó:Þ ‹ÚÁoõ¾Õ \ê µ‹³ŸÀnÛnÛÜò(hïkï0ÅŠÿ×´`ß›³jª©†``Ϋpkk´5@‹Qo÷Ý=¨G¸êcXG¬#žyªo$c$´`ÊÕ†}Ó¾if´ãÚÇÚÇ >R]ª+â'/Ò‹ô" šh¢a†Ý¢[t °-lí¯š¦i UúZ}­ÌèKC}¬edÅÈ ëWÖ¯<óøG¨ÝÓù}%¦0êÌSÚeí2pG/Ð ðã í84ø>4µ¢n\¸B™ @N?^­Gë1¶å¿ %±%±ÿ³ó‡f%›K7—FÌJ^ZúÒÒ9‚v Š*â à x´2­ /¨^Õ € „±7òõŸÁoÔ3êÏÍÊûöuqß¾ÇîÏ쿦٩!ÕIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-13-grey.png 644 233 144 6007 14774263775 16010 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ¼IDATXÃ…—kPWÇÿ÷NÏ43#ƒ‹A¦@0‹ˆ<7‰"Ár')I ed]‚»e©IIÔ‚…TBdI°0Eeb"âúÜàð*|¬Á¥b0A ¥< •‰&)¿Ä#ñqî ®c ÙB¶P|d ’X* ”Ê/WNWOWOW/Óø´ú´ú´ºönèÝл¡—:úúúI2ŸÃçð9°â]¼‹w¡‚VXìÀì°K°V»¿Ýßîäî¶î¶î6æ¼r)äRˆ¸wô…ÑF_xícU *P¸ÖÕáÊpe$•²L–É2ï¾N@@@בC3‡fÍhCÚüŸâê¹z®¾íŒÃæ°9lË6éâuñºxa>[Ÿ­ÏæN©'Õ“êIè˜À&@`í¬µƒ#i$¤   Dˆ<Â#<ˆ‹¸ˆ ‚{ž³-ý´ôÓRàÍš4ÀáˆÃ‡#€Îõë;×Ïy-”ò%^M¼šx$‰ ABô§Þ?{ÿìý3>\™°2ae1¸(h£q€ù¸ù¸ù8P©­ÔVj–ð–ð–p€úPêƒ'¬®²®²®˜H›H›HÞzã­7ÞzXu`ÕU€ó+ϯ<¿°nµnµnsS„•…•…•ƒÄ#ñQû˜}Ì>†ÏŠŠŠ£< < <«¸UÜ*n'E`j¦fjÀwïß=À⥋—.^ ˆKÅ¥âÒ'A\trÑI ù£ä’?´ïißÓ¾›ƒÍÁf€›ä&¹IÀ–bK±¥Ì¹qªÕªÕªÕ°J<‡÷ñ>Þ'!ô,=KÏÎ9ðäò ùf>±vR;©Rö§ìOÙŒý8öãØ€SáT8óÏ1?æÇü€-·<ÜòpX‡¨pT8*@Ÿ¦OÓ§Vç¬ÎYøtùtùt,–ŲX€\'×Éuðt;ÝN·8†c8FB¨ÌOæ'ócç&b&b&b0 ìö û #Èr 7q7¶ƒí`;~U²Ø‰YF–‘e¿š_‡uX7?¤Fj¤F :3:3:xÎüœù93055Œ´Œ´Œ´Ì2·›lºsºsºTGuTÇÎQ"""¡dÀwÀwÀ—ë*ï*ï*‰HDÂ&‹Áb0@ZH i™ ”PBÖÇúXßü¼Óî´;íÀÛ¿ØþÅv`¸c¸c¸ˆ¨Š¨Š¨’ÍÉæd3`M±¦XS€»!wCî†Ì¹ÛL1¦S `ºoºoºy x x %zè¡Ï«àr¹\.—ä\Ô\Ô\Ô¸t–U–U–UPQOêI=1ÁcŒÍ‰jQ-ª¶…ma[æç€Ñ³£gGÏõÅõÅõÅ€Éb²˜,À•ÍW6_Ù ÈîÉîÉî………°»ÝU gÎ4œ×1>=(*T{E{E{¥ð "Q‘¨H¬’ Öî«ÝW»ÏµGÚ>˜˜a. ø,>‹Ïx-¯åµO~Lé»Òw¥ïd™²LY&p<ôxèñPàfÏÍž›=€>^¯[bXbXb_·¶nmÝZÑú`øÁðƒaúµâˆâˆâÈ÷ÛœCÎ!çÐ^'9tïнC÷t 8*7ËÍró5å”qÊ8e\–™¤LR&)Ùú5k6Ö+ì%ö{ Ì9åœrNH•æÛùv¾Àgø ŸØ„MذKì»8ŽF@–-Ë–e\ÇÅÁڕؕؕˆW«;«;«;Ñ ìWö+ûg^`2&c²ÈWŠP„Þù¥´‚VÈnÐbZL‹ïÿCìûÅþ ‡ªMÕ¦jÚtmº6ûc÷ÛÝow¿Ón­Úä3òù̯¥f$Ș–i™ %¤„”¼•·òÖ9À‰‰ö‰ö‰v¨ËËË|@> ˆ…Xˆå HbI,‰½ó7” %œ¿»ÍsEÏöÜ?I))%¥W²i"M¤‰{둉LdÒOŒÌÈŒLȲ±±Š|K¾%ßb‚U±*V@TB!d¾‹b+Ø ¶bN: ›šš\{Æ?ÆåýyÞÿtÁò¢åEË‹>¾Œ<ä!œA?úÑ/$Iý¨'†0„!á6vc7v“úgÏ?{þÙó%[Û_ø >ˆúË'?%ý”ôS’æ¼åŽåŽåûèÖ‰['np­›rN9§œ²Ýò8yœ®‡¶½Ö¶Ïö9›û7÷oî‡>ݧû4´µµÁ¶ümùÛò¼ … 7BcEcEc<\÷pÝÃuÖ—Ö—ÖÓUÓUÓUN> á6ó|ò§ÉŸÀ艱;íΨ„`^0OD,IŽú,È‚,>ÖRk©µT$0˜ ÌŠ¤$¤$¤$ˆŒ^½V‹ˆ/Ä'® 7èqô˜5FËLË Ðª9»‚ÓÁi³ <³<³<ëëëœnèlèl脜œœœœ¸Ôv©íR›¯ðVx+¼ÐÕÔÕÔÕäøíX^ËK€`˜Ïð;k,¼+)®,®tv ç‚NG×(üø#JPK-µÀ=îq/Â?à 3@+­´Fø‡øŽï€±0Á@0ú ñþveæ9p¹ÇæbÑ#ÖˆئÙev~»È®±k@+í×ÕUuU]uBP'ÀN²“ì$`œqÆÁ°»ínÐÐuºÀþÜþ?óD(Xä±™F{f'¸ \‘Yõ«~`ÞþÈþ+Üû5 •Í€þ©PüY8'`ï±÷`P/tþ0߯:ÿoœ•”­*[ìkV;PEñN‰Õµ‡è[úQDc›øâ’7xßðþųò¥½]¼´÷±—óû?[ÅL9ÅPIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-120.png 644 233 144 3037 14774263775 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÔIDATHÇÍ–oL”WÆÏ0Â0Ë0£ŒY kc#aSÌJ83–Ô±)ÚlŒIwµÓtk"6‹AcÒlmÖå‹ÚŠMmÑT‚f !âÔ5M q—•NL»Üa*îðþ¹¿ý0óÎ;©ÛïÞ/oÎ9÷>ÏóÞ{ιW@DDV¦¿9¥9¥9Þ”³ßöç¿ÿBùù”Ýc€ãeÇËÿì_·¯`ÕÇ«>6ïØ¶·æg¯±ñ³ù,¿¬ÛáúÜõ¹#¶ÁžÍ{6ç§ì?]w¿»Q‡—\øòÌ—gø#L=ý5@"€m[qk¾µÞÂËÆ—c?ãÜÜÇ¿Á•çʲ†²† Sîn€Æ_øÑù£Så€qðàQ`¬ñŸ,ÛŠ§ç[ë-< ßâ³øSzŠüE~ØýêîWݧS î|‚Þ^Ò^bñiýÔò&oâáŒ>¨#B’“ªI5ºiÞ4oª^Õïï’ä#ý”~ Ô8¯ñúÓx¤ñõ4_†?¥Ç>JSDäƒç¡Iš$#(ªÞÑ#zÔ?ŒooÑÒÅ*œ8AU«jUÙ1ÔYuVT~åU®jU- h£ M9[Æ-à)|hZÙ´xdñKv²=sÜ3î™…{{Ü`'¨oÔ7,->X*\*í¯ZÖc Ñ6i›´Mpãý÷7‚¶CÛ¡í°ãÉ»ÉÉä$ÄËâuñ:P›õ;ú–ÒáÜ‹ÝÝ”{Ú=½°ÂÒ“Ö3ʽðð άRõZ•V‰‰ÏŸ¡jþ\ó~Íûpíµ ×.ØÄ¡‘ÐHh|^Ÿ×ç…ºCu‡êA¢3љ脰6Ã&äÌ=ÿuØ;¼÷»½ß¡@½¡Þþ–âã£ðšð+÷zFÓÂÆÚx¶o}ßúÌü~1>ÿáü‡$·¾³õ­­oÙµ; ŽáÒÅK/]„ò…ò…ò…,¡å¡òP9Í 4a[å¶Êm•0™ŠLE ¢«âHŸb^î½ÜKÒâ37|úÔ§OYÂÆÚrD¼#Þ‘ßþNnù ü"2)"â8ý«£žóžóâŠ~ý"ú…Hu :P™öMû¦}"¡ÚPm¨Vdx|x|x\äêØÕ±«c"ó»æwÍï).).).ñVy«¼U"ëºÖu­ë)]]ZRZ"ò½ï‡ç~xN\©vœ¦²¾µ¾UÄÒ“#âlt6ò¬xr‡s‡EdBDDâò”Aç´óžóžHî\î\ެ7ëÍ"®µ®µ®µ"Ý[º·to‰è=¢‹ôÆzc½1‘;+vVˆÌž;êxÔñ¨CÄ3äò ‰D÷G÷G÷‹œ(8Qp¢@d_`_`_@d">Ÿˆ‹øVûVûV‹ÌäÍäÍä‰m=Úz´Ud6:{cö†ˆÿ¤ÿ ÿ`¾(çïÆcˆ­ÇÊ1úô=¢©3ç%ý'ý'+ m¨m¨m&¶OlŸØ£2*£ µ µ µJ†’¡$T¯<^yF G G aÀ5àpAM°&X„+¯Ì^™µ‹ošïû¾ñ¾q;Çìª$|$|Ä®JÐt;©´eþŸ‘üYÜ?pŽsœËòŸbA›õ§õ§³øþ~;üöcUùÌIH÷Ób`Z}Ìl7ÛY2÷˜ÇÌcÀo(£ Ô²ZVË`tF'“Ƥ1 F—Ñetº­n«Û`¾bî6wƒQe´-`^ÐWè+X²ñcfÌL÷”{ê±>f5Úž‡¦ü¦|»óƒ5¢ÀC³ÙlFÃHï ÆKÀqâ@‚‰,{™E³v|Ùl1[ÐÀ¸aÜÈÆ·øëü¿pWÒ¾¾=Ó×´~à=ÞÃc±Ñb´u]]ÀlÛŠgR"½>sW¦ññ®|b_Oì{ìÉ|Áþx®¿ªXIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-35.5.png 644 233 144 3225 14774263776 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜJIDATHÇÍ–mL”W†Ÿµ€‚Lhj•‚’";10HÔ,MÝš Z(UbRe»D×­c¢$š]WÛUP¡D-(H[]Óš0¥b©“.ƒ|„ݬít¦@  ó~\ûcæe&»Ýÿž?'Ï×ýÜç¼yï爈ˆ%¸ ˜Ì æåÛü»?òÕÈW“? ØU0m7mÿÇ1ˆ}?ö}€gžmÐB¶7òÃëEBøáý ¿X$äˆh‰h1mÚ'àµo¬Œا»!ª=ª}F·;ÞîhklkäðÝWß}0±yb3„l#näõ^8¾œø¯þ"°äÖ’[¦AÄ3ψ@â+‰¯¼üÇ@ÂÈËP°µ`+À“EOéfPÝ@4ÑúfÀ‹cyÂl#Ì7ê <ßègôðˆÛ·I„ Û&·MFÕ ®q®²®²t;€¿«4ÒH4º2ªŒ‚îSJ”|ú˜Ö¤5îÖ<š¸§ŸÒO¨åj9><ŠGñ€î§–Z¢õðte\eÐìGaOaOT=Ä?ÿ\è›÷3ù¼øºõu+èü=€'è/¨ƒê ~ry‰—Ðîh>þÿšcŽ9t>àüÀ*VAWW7x&?ìSŠˆüêQ×£®{ÃHÂHøÿÀknë÷5ß×0«|­Ì(3€˜ŠžŠžŠ—ÍesÙÀ}Ø}Ø}ŸâSˆê_ëvÝS¿™ªžª×çcgÇÎ2ëþýôêéÕ¼¦ÆíÚ°ôù¥Ï{ëí>¢›DD.Úa¿º_…É*Æ׬×ç¦ç¦ƒå¬¥ÕÒŠ^ÒXRWRî#î#î#°º|uùêrXsoͽ5÷ ÚaͰB¿¥ßÒo ›èœèœè„ÄÑÄÄH«J«K«CÏÈN[“¶ú÷;‡Ãšvìµ0ÀǬ勈d}"R0[0+òIõ§ÎO¦uŠC©Vªe~Ô9úÅèbê;Ûw¡ï‚ˆÍj³Ú¬"1÷cîÇÜÙ™³3ggŽHkmkmk­Húdúdú¤,¬iË´eÚ"b¾mî4wŠ”¾X:S:#¦Ö¿|¼éãM2Ÿþו©+SMëdwv}v½È¢ËA>ü´¼cy‡ÞÂö±ê±êÐI½õSeSe{*÷dîIHÊOÊOʇÉ7’o$CÚµ´ki×`C͆š 5r)åRÊ%r ¹†\![¶-Û– ©WS¯¦^…¼ñ¼ó~„”É[’·Àhì“OVŒççþBô`ô Þ"ú¹Øc?Ôà½ï½ß*ƒû÷áé9ÿå±/Á¸oÜ7îƒuEëŠÖÁÑÆ£G¡ßßïï÷‡lŒß¿1N?<ýðôÃßqÅqÅqì»ÃîÏÏ#8Sw>â|`€Pæc"b"4‡Y¿©îQ÷˜"K>[ò™Èƒß>{0&q»&w}³ëû2ûRûR‘9ÛœmÎ&âìuö:{EvßÜ}s÷M‘Ë+/¯¼¼RijóóC$©*©*©J¤5¡5¡5A¤·¢·¢·B¤ìNÙ²;"  kÖŠ¸~ýò–‰d¬È¸q[âD¦S¦SDÌñz¯Þkr§EDþ^ÉçMÍMÍ ÿÒÞ?Go9Þ‚/óVfKf Ô;êõa'>Y|²ød1dõdõdõ@sLsLs LæLæLæÀ¶®m]ÛºÀõØõØõjJjJjJ ëßY²ÁõÄÆîÆnChô½”4miÚÜ ð ÊÅE;”ï-ß ÜЬèê;ê;¡¿žGôÓâ‡~A¯ºè¢ ( €‚0}ôó̇áu)~Ål ö£ü½ò÷€Ùa0¨cD F zS;¼~x=¨‡:¦Ÿo›ocV[«•ie@9oñ¨mj›Úêõ€z´B­P+*©¤´D-QKrÉ$Ô¿©.ÕêÁùöùvfµœ>ß§ §DDxãêØÿ(?E‘E‘Ðvsj—Ú íÑöà_8±¼9~æç°ÒQQŸBœ:z°~N½«Þ Wþ¢ˆ¢ˆ_TþତðÍÂ7Ãf%ï®z74:Újª‰Å«xÔRµèÝz7&L²¸‘oÔxþ¬ öðyš_Oí{ìé|ÁþŒÀ )i…E@IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-148.png 644 233 144 2774 14774263775 15001 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܱIDATHÇÍ–_LTׯ×0X™„?cB¥m ¥4&FI xcjhC%£NÿP M…ØZ,’š išØkz…ÆÖ6&5¡£â«‹uš@kMƒ½NŒIiPÐÀ8ˆ™sÎþ݇™Í™^Òw÷Ë™µ×Zß÷ÍÞk¯½DDÄÿ $­HZ‘”³“Þ±çSJSJs;bö1ÛÛo6BÆÑŒ£KÚ–´Y·l[ûu|b¾ˆŸÈ§çÅ-öÄâîÅÝŽÍqûcx}íëkSžÙ‡¯‚ëœëÜcv÷ìî8{âì Þƒ‰'~˜Þ<½l[ûu¼Î×x‰øòñÿñ‹À¢ÞE½Ž»°ø™ÅψÀ ¯¾ðjÎû±€Ñ¨(¯(wŽ;U˜S@*©j3"„líÇë|§ñ5ŸæéÈ|9óeð¼éyÓÕK¸ÕŽQŸ]Ÿ­ù¢çøïò.©œ6úŒ>³Ú¬& * À¿ÕaupX׬kf“ÙD˜£Æ—Æ— ©¦šT¾ŽãÇ7â|óü1=öVZ""ͯ€W¼2/ȯŒAÝ6f€hÜ¡°˜a ªZU«jì±”¥,µBå«|ÐO?Q•iÕZµÀš>x3½™@HóKb±å}®û®û¡d™™(õ“ú‰¹ÇÁ¹´¹4ˆþý5úk‚€!†‚p]¸.\3c3c3c¶;r(r(r&·NnÜ ÆÚˆ'âa.î.Ã?òéȧ®+JÖzâÂŽýÀ½Úݵ»5œµNmŠ®‹®ƒé–éo§¿Eÿ«ø£âàbóÅæ‹Í,ÜÜܰexËð–a°Ú­v«Êö—í/ÛY*ëϬ?Á³ÆSâ)A=y'ôFè ›‚_O×Þ±âÂ~ù€—:—w.×êíÇ}öè3ÂE E{‹öÚg÷RÍ¥šK5¶ Ë._¸|ÁöW­®Z]µúŸô?é9;rväì€áüáüá|Èý*·9·.¯í½Ñ{ƒ°æ³ÖŸÎ=«…ýò@ú÷éß«nf'ÖL¬nÅC÷Z¬ `.3Ÿ3Ÿƒ‚ì‚ì‚lðõúz}½@m´AI $P€Ê•;+w‚ç”ç”çCÆ1yÎǣ¨‘¨ˆˆd:ž—ˆDæżcÞ1ƒÅÁb‘ÒñÒñÒq‘ŽÑŽÑŽQ‘UËV-[µLĽ˽˽Kdcׯ®]"c•c•c•"g Ïž)ypýÁÏ~ÉÚšõbÖ‹óð™²ßð~[®1:ƒAÀÛs¶3ÆŒ®hØÓ°§a nÜ6¸mañ÷5ö5ö5BSySyS¹=¤áHÑ(,(,(,€ãÖñÙã³jƒÚ@˜q¾ÿtží<û—‹ŸJj›j›N FȰ;ºâSL%ÔD¹*Wå`\1®WÀê±z¬ vÚA9”C9þ¢ÝÀ‚q¼n£ÕhMàSµµ NeÞçàšpM„’Q#Ñ‘(`é>fÕ[õÌYo[-V ¨5©&®˜ò)ŸòuÐ:h´çÍoÌæ 0ÿivš`=mŒ62G—Æ¿q;ˆº~wý¾ éFÛü xS¼)vçÓoúÇÖkÖkDã½_Áüïx'%B˜¿+c+¤Wiv:þç%ðñ‰¥à“³ŸœøîÛï¾åÏ0 < = A6vêN¿3ïàåâ«ù~ ¼ç½ç]#P_/AiMiÍ‚íé†; à½Õï­¸ç¾ç¶óÀ )´C@”(Îz”;õL¿3ïà9øŸÃŸÖ#˜œ” n}ÝzßQ IºÕsçËŒ3ü‹fš)ÓkzéD*AÒþ·Õbµgísö9{È0·™ÛHÒžjOµƒ}‹ì¤Ð~”Ƴc&ð±ÃWw¹î²ï(Ìž1{FöL3ß/߆ž}ð ìíÆeû&4Ø7ìlá}ÞǶF­ÇÖã‰ÂvÛnÛ lcÛ²y là0‡1?þ‰âeX÷úœüò휣”¤²ðE}Ѩ‡Áᯆ¿š€­EžM{6¸qÂ8aœÈò%#ÉH2‘ÒHi¤ìr»Ü.ç7küã¡ñŒKŒ%àÑ×jÔr;9/9ÚDËð•á+>ÓgF=ö?ÒzÄ I:Ô »v°*Ÿìû|ìsX±`EõŠjì®5]µ]µYÂz«Þª·ÀwÒwÒw6önìÝØ TPAE¶¯«¸«¸«ŠÖ­)Ze/;XvÛ{ÊÕæjƒÖ×Ú[Ú[¬JØÙ¸³ ZìÛ’ôÓè¸Óqb×ì-ËÿºlƲ$}½¢+º"èêê‚2W™«Ì°hÏ¢=‹ö@çùÎóç³Âb+c+c+!Öë‰õ@ÿÚþÕý«¡´äÕ‹¯^$y¯.^/µ·ÀéÓ§Oƒe§õx\¯Lý~ê÷UÝ®^R½DšÜ¦¸â®£—Ï„¯…¯IËþø4ð©4nŒ§ÆSÒýÁûƒ÷%ÿ|ÿ|ÿ|É?àðH%%%ÒÝØÝØÝ˜&–·Â[á­òWå¯Ê_%µÍi+n+–þrxÇæ›U0·uò/“qµR%%’Û;õÇ©?Vòô;÷÷ÞÐMïïI_K’"îQo©·Tòlñlõl•´\˵\òìöìöì–Ru©ºT]V€‘2RFJò]ð]ð]ÈæóäÈ? ]¹6rmD  ”ê__]_=Ñq¿Rpµàª¤„»Æ]ÃyÂ:gsÝ”a¼k¼+¹æI’f9æ&s£¹QzZõ´êi•<<<.lÙ>²]j5‡šCRäAäAä´ôùÒçKŸK­Õ­Õ­YbuìíØÛ±Wª\T¹°r¡Tô·éû§ï—¬¶ ßÍ7Í7%ù¬n«Ûu3O®è[Ñ·®êµK?_úYR•$±5ƒ7^¨©¨©f3™†äúƒþ ´¯i_Ó¾&©{ { {@Ú_»¿v­´pñÂÅ KÝSº§tO‘â»â»â»¤Âpa¸0,mþÃæ’Í%zÇ]³2|î¾¾¾>IІ¢¡ëƒ»8Ô Ÿ5|æü²V%¤¢©(LÛÔÄß$H8Æ1ŽåøÂŽp(§œ\Ûˆ'ž_e”QlFSéá>»¡©¡Éñ³CýY³}÷}÷£¬acØÈú˜Uo\4.·3‡9Y|«Ø*¶ŠÁ ˜3V¯Õkõf› 3a&€!„Áºj%¬Ø¥zR=Rk‰ ÿ:ü+€oÔ7õ8zþóXðaAŽ3ÇÌ æÀ°6Y›p$ÛO‡q’™]u*ð”1Ær²Ï¬µÖZ ’fÙ“ëüßoœÿ…»’îJ2w%|ÁN1æsI°/Ù—pá‚lìÔ~gÞÁsð'îÊ ZÏËüºxißc/ç ö`)æ^}EIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-25-red.png 644 233 144 4275 14774263775 15624 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜrIDATXí—mlTUÇϽw¦¬Ö‚J§Kèìº.4Ųò¢8PÔ-&6ZD­¦ƒúAÀÚ‘@  Tk°bÈn”ÒÁò¦š*B‘Œ…ì& 6Û™¦ÌFCÎL¡í´÷Îýí‡Î¹ó’]Éf÷ùÒûœç<Ïó»çüÏ=S!Fí^‘`êc©žTOªG¹HK9–r,åØâÙ6ÃfØŒö?‰b†˜£as›° ›°I}s›œ/óe=Y?±ŸúX"O<ß±F¬Q›ã“~k;f;f;ÖtSySySyÓIäˢ΢΢NXzuéÕ¥W¡ØUì*vÅ|—óe¾¬'ëË~¿Ì#Ôy‰þÔ]j¿Ú¯öwÏ+”U–U–Uf¼µ§mOÛž6s\èFèFè ¡¡1À-nq 覛n°üh\Ηù²ž¬ŸØoê®_掻U¿êWýÝ‘\g\g\gô9ÞoØÆKÔÌ\s‚9ÝØ ×ëõ`䓌I`¯¯€‘¯_Ö/ƒ±AUÌ\Óa:Ðe¾wÄ[è-Äë:ãÚéکϱ€ýjÚ#û;î¶Ð”&¥Ii¶ŶŶ¥á’Lpos¯s¯Ó -°·6£Þ0R>Rfw40L+­‘%‘%@„C"fÃèè±ùzïò.˜oó5_’ÓÜÛÜ»?Ö eÉ#ù„½ÇÞcïùÃïåÇfÇ&Ç&Óé»î ø¢uBÆvããý´~®® Ç¿±‘å#Ë‚®  Ýžr{ ÀíŒÛ`l¶Û­É!ßõnw·›€c³cµcµé”<Ÿm•m•mÕ…-2PWZWZWj¾-0 7ÉZþKþK@xîṇÔ ê€”S>ØèÜèŒ=>†Ñã õh=@XúcÇ ‚ÞÔõe×—VÒ@]é®Ïv}f¾f­lŸ0{ÇO?}üt¶Ý\|ó‘›P@:Ùò˶–mȼ–y  í@Û€­?ný1èâö‹Ûï8¼à¾ý÷íøªõ«V€–Ü–\ ttúÑé@ö­´[i¨~sñæÍ y$ŸýãÓ;žÞñôŽØ›^ã^ã^ WÍ»2ï Àúºõuñ+r†œñ ÄP¹¢r€ó°ó0@ÝçuŸ˜}`6À`Ã`C¬¾á5 cý%ä‹‚r¼¸½¸½8¦ÃXhK»åwÄD(và3Bdôa¢9̳ÙlŽIÉßèÏògAöÇ÷ŽïõUÖJnÔÖkë+ÜZ¡(…6GŒu¾˜/æÛ6Š&Ñ$š„Ðzµn­û­Ï­«u·#Ý‘®§ûÞñîóî‹×®qݸ`ž4O&ïñ EçáQsYd^da™øâÅϼxÆ(·n [¶~[¿gSæêÌÕ™«…Pݪ[u+ŸFéJ%æ]ѿ˴.­KëRN8+•ÎJ!ìeö2{™g“¥ÝùîùîùF¹l©ˆTD*ãÁƒ裾¸âÆÆ1-ÖΪU;Ë,°îòt{º=Ý?ýµ4&q§•SI[/”$÷l¢ï3ª]ß§1íVl¨Ø§Ýt=]OE~Žüù9¦Å:èÏØŽ±c;Ì"K“ijššöÂ{IRü(‰/Uüò€V§Ý—”—)J£Ò¯]O«§5¦]½UoÕ[cÊÌÌÌ„iÁiÁiAã7–i‡´CÌ•R‹J/ðq‹MbÚíÕzã´»Ó±Ó±SO÷5ú}@˜0a‚’´âDʼnŠ±ÏŽm·m·mwGô_’±Mêãî˜l2á…¨v?ûOÚ]ðÔ‚§<Ó®g®g®g.ûF㦵J‰R¢”,\—ØFíK꫈ÿÒî¤ÝÇ´j­Z«îΗÀ%›K6—l6kr‡s‡s‡õ¿Y[Ý«õj½Y¢A4ˆýìh¾¤~©â´dínJôüCY¡¬PV€x\<.<¨NV'«“AŠPÄWg³²²„Ð.h´ JK4qYÒÎýß,ÝzZ$‰E¶K‰áwJUS5U”SÊ)åÔ?5:þkOÒÎx“êÞq«ÿ"Ò-ö/ÎLIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-50-red.png 644 233 144 4265 14774263775 15621 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜjIDATXí—{LÔWÇÏï1ò•«†E]!º²kºŠtÀ*5ÕÑM%*]Ý®¯}©"a‘ªÑZªû È@TZ­ V±jpã6²–4¶2[ã…Ffø=¾ûÇÌýÍ#©f³{þ™9÷ž{ÎgîùÞ{3D^‹¡ ãç…YÂ,anÈ75ªqTã¨Æœ?‰Š¨ˆÊ¿ŽÑlšM³ï´VN"‰$2öµrÏÖ³|,p=~^0O ßVÚJ[ùºàùøb£Ø(6Ö=æ¶qÛ¸m:ˆ1¶?¶?¶ç–Ý[voÙ= Ïžgϳ+毘¿b¾ßgó,ž­gùX~VïÙ<Äÿ%ØŸvˆàøÛl¶C   Ê[G¯½vôšéìuö:{ À…A b€ 6ØÝ÷ͳx¶žåcùƒëM;ôl>’Æð=|ßc;ÏÌ¿:ÿêü«òŸ»FºÜ]ntÁgZª&id¥X~G~PÒå©òT@ÉU¦+Ó%]yYyPŠ•%ÐRµ-2[Ïò±ü:pP}iŒŽÆÕqu\‘¸GÜ#î©ùŽ-0•›>6},çê`oã2.Ã)×à}¼h6ß„‡E`ÃTÝA zP=è—k”cÊ1@{[V£ádÁ¦rÓNÓN9—Õg<Œ ݆nC÷â?²©T*•Jµ$ë¯Ö3Ö3èóåq*OmOmп¯çД¡)0x}ð: ee€ö¢ö"läæÈMÎ>WŸ FΜ” õ3õ3=ÈiýÕ +Ð'•JHhIŒGç7‹›ÅÍí{ØÄᵇ×^«ýÕ—À%×±\M1M1ÜÞ8@èºïñ€ð¸ð8°'ØAW~µò«€8÷„‘ #ðuÞ×y€?¿·«¯ïliŽØ”ؔؔ?ÎyœýØ»3CÚd$²ß|¼ùx3ÄŸŽ? —Z/µ@KjK*4j8X³dÉ~Ó0¦ÚÚÚÚ `BÁÎè¸è8‰}I}Iú"ùqNodo$ÀxýÇÒ½K÷.ÝëÿeJ—'Ý“ÀÁ†Ö}¸îC˜ñæŒ7àpÓá&¨yTó\‹\‹A3Nfœ€õ·×ß·wÛ;á89|rPºcàb<Œ÷©†lC¶![?caTH6²Ñx6ÔÛÞÛNDt¯ê^Ñ)ã)#ÑÆo7~KD”¾<}9‘=ÚMDô}Ç÷DD/Œ{a\àÍ2Z-Ñ&ÚDDá½wzïÑçA×O˜¡ÞPo¨×ü (Nö\ë¹ÖsºÜ¼›wó$3¼gx@|±Å7Šo]ÿùúÏDDW\Y@Dt·ínÑ›~ÜDDt~üùñDDq‘q‘DDî5î5 \<OD:BGˆè'º@ˆø&/ˆ/HpØ6‡ºñ¹|.Ÿ;òÈ·ÅåÇ·VWH |¨k¨ jÒkÒ¸íöŠÀ.ù.~ýPU·V·ÀâäÅÉ¿!C@¸l_b_âñ  4œúòÔ—þz—+[“[“õp#—Æ¥qi#H˜#Ìæì(c§,qŠT#Õ(Ó¬+­S­Sý4ZVJaJ!¤¾šú*­%ª% ŠÎ€ðœð°þbý*¿©ü¸/¸/àÖÎ[;¸–?XþÀ+cŽ}ƒ+WÂí‚§ÚS ¤ì˜•7+OÕ!^ˆâ?飨ì¨ì¨l"ñŠxE¼RÛ£_ø+²J²J”íŒT5ÿpç‡;pÃ’‘‘‘ÀÅv0))) N. Üéá½Ã{ ¿"¿€“4ÒôÍLž™ ¨Ÿ´Ä¶ÄBcÑÿ|}ßëûT—X( …ÿ^åõ#l Ò i†4[5[`.6O2OÒ²ôΕ-²à\ä\Àé1yL€Z‡ÖÑܸ‹»Ð—Ö—(k]G\Gü­>1pb÷‰ÝxEBËø2¾l8‡›ÄMâ&ýáh p[—ún ·æ¥*®–;Á`ZQÿn¹hg‹®ÝíjŒhB·Ú¡vòB‚êuõ: eiŸjŸú¥ÔSÛcî1‰á’GòÈ›õÜ-ìv™M:Z.åR®(ùY3)“2ÅÝTGuTG$8‡àx«IZ«¤ƒÒAÙh}׺ݺÝ_PËR׫ëƒG0Àåó-xoÚ*5GÍ›…åßÊ¿‘CÙ®¿@ƒâ€8`)™¸eâ–‰[ˆxoâM\ƒn­~¹ù>W ÷…ûÂ}®9©(©(©ˆÈP`(0XJtífš2M™ÚUͪnX`À<Á?·2]™®L÷kñ@ÆŒZËg0Œcϰחƒ;Í]i=q!n[°/…{µkmÐn±¹8@»FÙ(ý@êCõ¡úЯÅNt¢°DtFtFtjËtMFñQ|Ôk»B¤øQ_={@8¢Ýe\-WËÕi÷¢å¢_»òEù¢|Qt?øtâÓ‰À¬þYý³ú•d]‹õB½P¿.“šOz¡€Ñôó°¿¥ÝJ©Rª”ÖZk­µ€n¸ÑÏHÍÍæfs³ÿÚ«Ä*±ªÓ÷—$âfH]ß8E>0ÔØ‚×|Ú=û[Ú]°dÁ’Küڵ̵̵ÌÅçÞyMï·š[Í­~iGpþIH]ŽþK{žvç eB™PfKgÀ«KW—®.Õ>Lõ¤zR=r‡Þj‡à檡ª!ßµ#XCê…Ñÿh¡Ú- öüÄ­ãÖqëZH i¡:“ŸÌOæ'qÄÑ¥¶DW¢+ÑE$´ íB;×â[¸*¤sÿ73êß²)›²Åï‚§ß]Ëk¼Ækw»À]xð;ïøï-!é ÉûÜVÿ‚.¹ö5 8IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-61.png 644 233 144 2453 14774263775 14705 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜàIDATHÇÍ–]H”iÇÏŒéÌ€«ãMZšKµ ÂJBl%iÑ×XT.ئȲìÖÆÀÂzQ,¸,,}Œ•»2e…}\D[†…؇‘‰.éêàjió¾ïóÛ‹wÞ݈ºì¹ÎyÎùÿÿsžç=瑹©_ïïo–i{¿rüþõþõŸþnÚ<Û<ÛýÙDz̋΋½Žmí[ñî|ßÍgùe®8ß9ß9OYÊ> ;‹wûsL»á6ÚmÓì¿´ÿÀ…ÓNó5ŒtŽtL”M”c[ûV¼•oá¹ñåðÿøE ýJúÏ ø2|"_‘_Qøð¼B›B›†Ò†Ò”ô1 “LUL2‰µÆ]¶µŸŠ·ò-< ßâ³øM=Á5Á5"°u×Ö]f3¡·åÊ4€d!B&­Z“Öêž¶H[Ä,?© jÙd¨Õ|¡5iMÌò›Ñ"4ÒH&º…—·ù,~Sü÷l.‡þ~ ¼ ú>ü ÷ëý$v£ÏèCY%R_ª½j/K.¹ þP1õPÝW÷íJ*¦ŒÆN’ ßÑïXîä]›Ïæ· Ï~…ÀH`dr<ÓŸéÀ,ùÛXk¬å•¥åjA-cÇŽ„dq²8YÌ[k:1˜N@r ù4ùÔµÑmÅ6ÞF›Ïæ7õxMyß–ˆTEª"Ÿh"KÒ–¤©‰éÇõãrU6x}^ŸRÿCöÝÚwoß=‘¾¾Â>‘òPy¨<$ˆÄD¦ÂSá©°HÅŠDnþróÄÍb/µNæÈ ˆèSú”\µùlþ”Sáƒï¡5Ñš°+_møÞÄÞÄRu®5\k¸ÖyyyÐï‰÷Ä¡®±®±®®·^o½Þ å«ÊW•¯r.ÈÊ•7*‚éOõúýŒ~ÆÂWÕ¿©G ëVÖ-uF–,s¬Ó2µLÇnéjéjé‚ôpz8= ¡‚PA6¯Þ¼zójHŒ'Æã€?~( –Kƒp1çbÎÅîpê΢:U§ûð-~SW$-”¢H$½=½Ý®x\4É—|ç^Ÿz}êõ)‘’…% KŠ ¶¶¶‹ÄÏÇÏÇÏ‹4÷7÷7÷‹ÈŒÌÈŒˆ'æ‰yb"R&eRæàˆ_©‹±X»øl~SWĸl\ö<Ñ*µJ;0èiðÔzj¼Ò¥¥KK—мÌz™õ2K$ÚmŠ6‰ ?~<üX¤`eÁÊ‚•N|27™›ÌÑ_è/ô.aä¡<‘çòÜásøSzÞuÇøK?¢aV}§jTSð³5gkÎÖÀŠŒ+2 ÚíŽv¿ýU†‹ÂEá"èÚÒµ¥k‹ã7'Æ“ºc""‘?¡¶¾¶ÞNÿœmTuõ¡EÌg>p’“œt)襗^ žzê]~Ýl¦öšu>%h“Ú¤‹Ïæ7õ¼»©>£Œ=ƧY†Ïð^§×éu`,7–Ë:èpU¦Ê¨2ª@ý£FÕ¨KÞ+c»±ýý}ìÝHuþT§6ªjsŠ{&*g¸Ö4Lš ('ÿƒ;ÿ{f¥ Ðå(™Îè»õÝÌ‚º­nàÁŽmíÛG–Ê·ðÞ;+?Ú×ÅGûû8_°ÿ¨ ÚQ÷>ò‚IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-167.png 644 233 144 2757 14774263775 15003 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܤIDATHÇÍ–mLTWÇŸá}Š˜hRR H¬Í"„@ÈÆh#šP¥­¡¤`Œ‘]·_ Ĩ”Ô éXhãFËj †`ª¶¦VÚ¨: ¤›~XÜ’LibQQfÊË2½÷žóÛ3‡;ÝÍ~÷~¹÷y9ÿÿÿœçœçI¾â^Ž{9.-bÇsý)ûSö¿Ò±/:àyËóÖý³°áü†ó»7v«)×6q“;^ÄÅå3~Iב|=ùºgOÔþª^­z5esÄnïMïÍ꾬ûà‹ž/zø#ÌŽÍŽ,îYÜ®mâ&ߌ7x±øòÁñ‹@bb¿ç$'%'‰@VYVYΟ" Ó9PñzÅëâÅë8p€TRõ`‰%̈±M<šoÆ<ƒoø DÀ¦Ý›v‹À›ï¼ùŽ÷ÓÈ€©^ìÆ—_2|ÖMþÀ NJýý €sÊ9E˜^]§ë@¨5üM×êZàk'ÕI%¬ÿiÝ·îƒÑA©úQ¼æ†>4§z¹ðFð ÷S£Ç-¥iß •R)ë‚Fu“}Ê>zÊ™t&±¢Í{á¨[ê–ºµ¾bèÃú°> ¤‘Fšëæß¼ÏûX@ .>Tn®Ül¶ï)¥ˆHÞÇàóÎ-%€Ù¿ LPú;ý«+ó«É«É`Z>Ëç ±VÀ ÀBîBîB.ØÍv³Ý V‹ÕbµÀÂ{ õ õ8 Áâ㧯=}Õµ?+ŸòQ?Îÿ8Œy?÷~¾”`ôD…]áI}]}¡Sùz—•oåÃâ_?[ü ]úûÒ¼Ò<è¿Ô©ÿ’+¬&Tª 7Ó›éÍ„ƒ™3fBï¶Þm½Û"…Ù´r+r÷çî‡ÄžÄÁÄAô_ÿþÑÐGC.Ÿó¯cG5+wq$*ìû~wuËÕ-ë+tåé/¿t.i*9YrÒ=»Á‰àDÆïŒß¿0Ù2Ù2Ùõþz½VVVÜ ø’|I¾$Èz%+#+]þy×Ï»>ÝÑ×Ò×b„}ß ömÚ·ú:˳¹³¹ÀT4õ¤*T…àd8/:/ÂÎêÕ;«Á—ïË÷åCÿ¡þCý‡ ®:®:®²«³«³«á@Ù²eÊe‡²]aµÓµÓµÓÐy²óDç ×ï,˜¯ÙÂÙB0z6¾°ñõ×#Ç^k5¯æ]€¢Á¢Á¢A™™™†k®=¸ö Ïž+<çæCWNWNWÌ<›y6ó ²ndÝȺÁÖ`k°ÕÍgC´Í¬~ üFOœˆúJ}åùA°+ì ±DDd“'S~•_eý±Å[D–ã—ã—ãEпппDžÌ<™y2#ÒÝÕÝÕÝ%ò°àaÁѼ{y÷òî‰\)½Rz¥T¤ ½ ½ ]$ýtúéôÓ"ªÇy×yWDæ#|’bWÙU"®³Ç¸ºF#5ç ´ƒf@SySyS9Œ¹îÙ׳¯g”xJ<%¸|÷òÝËwÝøÙíg·ŸÝ·ûn÷Ýîsýêk«Êª"Œå3üJê›ë›ÝSö’ívtÍ!B1%ØÊV¶¸À…ÿSLg8Ùÿà ³Q<ì°Ž|Eø ÿoNeÞÇàõÎ.% ý–ß”écªQ5²ªŽ¨6Õ:¨çô\ÌÌT‚Jç¸sÜ9j‡Ú¡vk¬±jD ¨ÐGt›nPŸ¨OXeÅàû¿ëü¿íc¦Ñ¶ï…ʔʔØÎìŒ:£ÀŠz[½íý°±B¹BÖm_Žæ‡UªÁgÌ‹Å7|ÿÓùÿÏ¿’Æ-ë}ͺ ´ÒJª[b§Æ©! zXàÁ®mâë[":Þà|Ãgø×ÿ•Ïííâ¹½=Ÿ7Øÿ0êLáŸâÈNIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-40-red.png 644 233 144 4267 14774263775 15622 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜlIDATXíW{LTWÿîcäQEÄa²>V£‹»4Ê£&¢©h@[°BìZ5]|tlÚ,a[¶KñZµm2P µ6®(»QˆUܸm5!Õ™‰Œ­q†fæÞ{~ûsï<’j6»ß?w¾ó½~ç|¿ïœ Ñ„L¡ áW†™ÂLa&î™o!jRǤŽIyeQ埤%´„–fVG"‰$ª:¬³:Õ_Wó©ùƒëñ+ƒñâÛM»i7ßl_ vˆbGë ·‡ÛÃíÑ€ÄÄÇÇãbÁ½‚{÷€¢þ¢þ¢~ 0³0³0Ó¯«vÕ_Wó©ùÕzÏÇCüŠ`}Î!~„áG¬KÔšU6«lV™üΉž='zX¤sÀ9à @€F1ŠQVXa4ÝgWýÕx5Ÿš?¸ÞœCÏÇGúɼ·ñ6ëßÕ™×2¯e^“þhöš½f/Ìð KeÙ,’|@:+䥾o¾ü†ü /•WÈ+ù€œ*§,•E°Hj¼Ùkv›Ý0«ù5ÀAõõ“5h\+×ʵ‰5bXÓü`¨3Ôê¤| Ø»lÛ§Ô,=‘žÌªìTvð03Á/Šök ¦ð(J#À¬‹R³|R> °w•h%NÕÙPg¨0THùj}ŠtuuWÿ^uÐWë«õÕ,ÙòÔòÔò_§ü¡ü¥ü% µœXõð¬êY¸gºg"Páxï{ïp:\x/z/ò‡ÊçÊ皯ÓòÔ àÐWë?ÐÀ’U<>±\,Ë{kTÑÒ#¥GJÙv_—Ô*µKíÀ*X·šûç)?O€¸Ä¸D8v,,çØê±ÕðÚ–×¶cÀçóÀ¥¢KE€Ô´9—Z_;Ù |Äì±)±)±)¨ÌÌÌÓ%$±!6À©Ô(597/Û¼,+‡•@{ÅÜŠ¹mˆ6@www7”Å•ÅpFO‹ž É‘ìHö×̈ˆT<*>è_Ö}´î£uùw&›åAy€]þQþ1@Óí¦Û0£kFW ÐÆŸ ô[Ö¹¬Þì}³7p½ÿaÿÀ8ûÙñ³ã€lôKÅ£âã}#µ@—«ËÕåj3FÛX+"¢ÂBa!ÑówÎU®¯\ODôÉø'ãDD‘‘DDâbqqà ò}Â÷ DDé…é…ë/é_ÒÑNÚIDá? ü@D_]?aº6]›®Mù¢ gm=¶[·Ø>~yü2%‡·GäDäèOžÔ°=q{"Eç·ä·½šòj ÑØº±uDD®Õ®ÕDDÊ 2HD~3ü&‘§ÜSˆ‹çâ‰ÈC4@D÷)žâ‰ø¯)ƒ2TMDD‚Ýj·Ú­dVñŸÏçóùÞ'¾#®;½ûŠ @¸­ÇÖ‘õ‘õÜ‘†HLn˜ÜÂtaz ê®Ô]€U/¯zŠ»‹»š*õ¯í_ âWâW€Ü~î›sßøëý³þʼ+ó´p—Æ¥qiÞ'$¤ éBúþZuÊ’fëïêïÊs,­•ÖJ@ àd97ûnöÀõ¨ëQØ¥þKý@ûh¼=ûíÙ€ØU׫®€°AØ·*nUpmx´á€5SO} £G7Âí‚ç”ç²QÑ¢"E{„x!^ˆ?栨ܨܨ\"ñªxU¼ÚbÓ.üBÃrÃry¯ºUÅÈn³ÛpC½Ü]ãׯ¯Àô_¦ÿÇ3ŽgÍÃ×(>W|€“1Ž…óΔc—c/Ç‚©ÞeÿÚòñ–—p›°MØvwÓ„a§`™uX—¦[¬[l=¥²­sSݓܓÀvšàt|êø\s\svØ€Ýb·¸qwÀ‘æHäR×q×qÿnÎŒœ9xæ ÖhOh-_Ë׎çq3¹™ÜÌß(ÜÖ¨¾™ÛÌm~¥‰káZ¸•+ÊŸM]¦.S—ÿ<å½ò^ÿypcÃ:Ã4Lå†r`9ì3ö™fuÚZlF›H ×{ô©\;ɃB¥Pi4hÐò)ŸòE½keQ–xZ©•Z‰»`ìï|­=­Mú£ú£RŒå=Ëû–÷ýYŽ2W™ Øý€ÖLdÈLx ol“’§äùßµâ[Åß+ïÕ^ QqD1U%ìJØ•°‹ˆ7ðÞÀµûЕj—›ï»Ix <p’÷%ïKÞG¤+Ó•éÊLUw³ Y†¬@î*FÅ7L0Á`Cò¬<_ž/Ï÷s±ayÃò†å,Gͧ‹ÑÅèblãº><¸Ó\gHë‰ Q»ƒu}¸.M—¦K³´p÷€ñ@wc¤)ÆHy¬ô¦ˆ¾ˆ¾ˆ>V q2Šâ£^¯ ¡âá|aôü¡!„»/â®Ô%uI]~æŽ%Œ%Œ%‹† /–çi\lÚ„¶¿e¨TóQ/`4½@üj‚_ãn½¾^_/ÅXZ,-–n¸áö•ñ‚ñ‚ñ‚ÿÚ›Ä&±©Ï÷—$âFH]ß:E¾`¨¨¯û¸{þ׸›½6{möZ?wM¦ S¾˜°3­\ W•¼²?¸ ?R—£ÿR^ÄÝ•B­P+ÔZ—ª€KªKªKªÙ_S=©žTtGkµ]° vã,j¦fj&ßµ#XBê…Ñÿ(¡Ü­ Ö³ïs[¹­ÜV€VÑ*Z¥,äùD>àˆ#ŽþÑäJr%¹ˆ„^¡Wèå.û7…tîÿ&1Ú¯\Ê¥\ñ»`ó{¥<ãÏ®“ëä:ýfbý·¦Î˜Cò¾°ÕÿO2M“qÓYIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-191.png 644 233 144 2644 14774263775 14773 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜYIDATHÇÍ–]hTWÇgw“ÍѤf Jü€ö¡-¡³ jµ¨5·¸Ihš¡¶¢Ø4Iˆ>´…R¢Qj• …mPDHl%Q h´$j»-mM‰¥Ô¶†®l¾ëfï=çׇ½gïZë»çewæœùÿÿÌœ™sDD¤Àùð.÷.÷.LÚÞ·]vEvÅsç’öi<Õžê߃ü“ù'žé|¦S¸¶Ù7çÓãE\üt>ã—qY³.z6;ö!¨}©ö¥ìÅIûè-ÈéÉ陵`Ï{¾è>Ó}†w`lhl ¶9¶\Ûì›ó&Þà¥ãË¡ÿð‹@fof¯ç7ÈògùE`eùÊògßMøåY¿~ àOߟ>íûo <½˜f³¢i¶ÙwΛxƒgð ŸáOêl lªúªúœŽdÀHVKqK±áKô°ýì'3Öë €}Ð>HœõëúuÐß©ïÕ÷@·nÔö~{?q°&¬ `ò!y|îàѲ¬e`9|)þ¤·”JD¤}+ÔH¤ êVë uôvÄŽp64™ú¡~z‘^¤¥2†ÎÐ>ívòoîÐèÐú'e)‹è3I|¨)¬)4lßšVJ‘N@ÎxÎøtŒÎŒÎÄ@­¿fnvrnÁÜH|–ø4ñ©+d¾{¾{¾¢ýÑþh?¨{ꞺÇckvr®x®¿Æ_Ž¿ÌœãñÝè7£ßäŒåŒMg=ްÓ_ñ×Þ={÷Uª_I”&J!v,v!v½®mÝáu‡áÚÕkW¯]u ˋʋʋ ·+·+· êÔ¨?z©^ª—B,‹Ä"°>g½w½úú>êûbÊMòÁÞ÷÷¾o2wú+GØ·Í”œ_v~Yª »gLŸ:N|mëÚ†µ nïFB‘P$]Ñ®hWÖ××]¡eªL•)èhêhêh‚íCÛ‡¶¹ñý•ýÛú·¥ŽÇíH’ÎOžŸ4¾mX8°p@_dfìù±çGZƒ ª ØKí%ö(ó—ùËüpc÷Ý7vÃÍèÍèÍ(¬®®¹Æsç!ÿzþõüëp*t*t*ä ^]»ºvu-\Z|)p)àúíûæßXp,FO†ˆ/ì S"y™?gþìùIDDÈ'rE®HÀwÒWä+ñßñßñß™©›©›© Âp@dWÝ®º]u"½õ½õ½õ"ÞcÞcÞc"¹±ÜXnLR+£)£)£I_ÙŸd~™ù¥D|/ú^¤Ä+¢.«Ëž»‚¶Â"’‘€g…Ì˼ï‰÷Ä{Dü•þJ¥ÈˆoÄ7âé=Û{¶÷¬È–‚-[ D Ç Ç ÇE6Vl¬ØXáÆÛûì}ö>ûûwû÷4aÉDD¬J«RÄÕcñ SóÖ„5AÜ$ºµ¤µ¤µnWß®¾]í–¢íhÛѶ£l6›¡¯¸¯¸¯˜ÇVkUkUk ï~uøU÷Ž%;øï˜Ó•©®0]bM[îD×(þáŸ4¦AîsŸûiþN:éJ)¥4ÍÿI&ÓðÁbW¾p"5Gôhb4(3ÇT‹jaNíRGÔÐq=¥§Ò.ï]û®}ìUö*{¨fÕ¬šϘzSµ«vÐö{GÚ›zâ3ƒ¶}+Ôd×d¸Ä ؃ö 0«ÞPopf¿,,'— ˆw ¯)5Ï|Z†Rñö€=Ž_“U“e2õÈäÂ[iÞ²$@8o]ªöN{'qзô-Zø¨T6T6<ýN:!ø4¼ì|Ù °øÈâ#*Œ0° j#†eK9¾Ïä[ó-< ßâ³øÓzÊv—í×a×aÇh""÷¡ã©Ž§€ç´ ÒC@è£Ýh'ÉYÕ¤š€U  Ôœš0ZŒ’ êƒú ¨{œä$ÔROýÚþdû“ÀŸkÖ5ëø6–n,Í®iæ{îh^i^õ€6«þÅû¼ ®«ëh˜Dˆ ˜gPmê-õY300xÐð9Ÿ£›Ød k³phâЄUÁs/ä,¥ˆÈö>pıX>·½Þ5À—â÷WJWJYÕîhw´;9T·¹ÍmHžHžHž€åmËÛ–·­Dª1µ;µÂ7Ép–þúKÃ/ ¬F¾OnMnå¥D_àÛÀ·ÃaÄòÕ™´áŸ""—f õ£Ö@í0k" þê{ê¯Ô_AžííYO|jÇ©§v@C´!Ú]=6zlô.>P|¶°ý³íŸ¡ †mý¶~¸ðÇÁ¾Á>³NvœìmSZ¨ïEDüí0 BüêøóïÕ•Ö•’´ê:Ö2Ö2Ö’%w»ÇÝÙàt9]NWÎÚEUTE!aOØvˆû⾸fÎ8gœP¹¥b²b’ä¢kµrµR‡‘‘‘0UZ+òyÔ0ó¡ÇBz;³Uþ ý¨ý;+v–ï,×ãõx€½ó{ç÷ÎÑÓGN9 Mûšö5íûÝ6¦Á,3Ë̲ìøÑ;GçŽÎÁù?õÖöÖælMmñÙÅgо*úJ ”<^ò¸y—‘¥¾¥>PæÚ± ÎWç«óÁÔôÔôÔ4ôŸé?Ó¤Kº¤ vùwùwùÁž°'ì p»Ü.wNå,ó/øü PÕVÕVÕ÷{"ïFÞÍi3eáT8ü·$¿$ß¼›'˜nÓm»+šö¢ö¢ˆm«ˆˆ”eΆÿ6~0~Y®_®_®i\l\l\¹¼¼© V«‚"›;6wlî)ï,ï,ï9/çå¼dmèìÐÙ¡³"5Ûjž©yF¤øTɧ%ŸŠ˜ý¾ŸŒçŒçDÄa~i~i»›9•þvþ~müÚ8ДÞc™’ìlë|½óu¸µÿÖþ[û×WbÂ3á™ð@wª;Õ‚Tmª6U Π3è Bürürü2tWwWwWƒÇëö ¯MOšËðé×~»ö›Õ6üía—f õÃÖ­|³ô˜¢k}(ýéœÊ ú¤>©O‚é5½¦¸ÈE.‚jVͪ9Gù +¬äøß"„"¤ô@Ÿjíjí²„]šÉö1åøÙñs,3 ´l3kSÚ«ê>T¬¯˜r+·rƒÙköš½À<ó̃1"Fðó ߀ù™0 Žê>ÝǪ…O< D!G(–oéù?ÿ•ÂW -Zm–¸1fŒšùšù–dèè@Š$ÉßUF¡€e„³úY1šÑH>׃¿Æ·®ó?pWòÀ]™¸kwez‰1^5^% jZM`ÃYߊ[ùÖ| ÏÂ_»+3üi=óëâ¡}=œ/Øÿ't[Tu—f(IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-199.png 644 233 144 3030 14774263775 14771 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÍIDATHÇÍ–_LTwÇÏÌÈÀL§¶*5&•mR^Ú`W’©4ë2DHqˆX VÈD²Ý¬%éêCÓ‘ú°$hÒ°ÛX›”ì&eº…4ÍàX²„Ò±i*¶®biMœ¤‘¡ÀðÇsïý}öaær'kúîïåæüÎ9ßï÷Þs~çþDDäÉìSÀ^d/²oÌØö¿Zû/¼\Ü›±»u°ÕÛêÿûwxâÃ'>Øt~ÓycÒ²M¿Ÿ›/báçò™ûò¤Xùçl«ÌÚ'áµ^{¡à©Œ}z \ƒ®Á Ž|zäS€ øLOÌWÎW‚e›~3ÞÌ7ñrñåäÿñ‹@^$/b»ùÎ|§|ÚäKòGÞäM<\Ð.i—ôú RœQ ªÔ5ã;ã; _UGôwôwHqF;«5Á뼎‡gñÈâkY¾uþŒ«”†ˆÈ{UÐ(².(¦Ú´Ú P×õ }‚tÖ¡ÈS¿ª_AmV›Õæõ/†ò*¯ò‚ú³jQ- ^R¯ªWQ@'¤•CŸÑg€Ú >4njܬ˜ü’ÛlÏ}®×ÌÒ˜ZžZ¾Àêõ «+‹«¯>é¥?Jd YXX€Äpb81 F·Ñmtçøÿ³6¼6 ‰áÄ·‰oÁøQ‹hV³n?w¦¾˜úÀ5çš[Ú`êÉ ëþ’{­GZ˜pÆNõ§ôÎôN˜ÿÇ|x>Œ*ï,?U~ .G/G/G-âê­Õ[«·‚+ꊺ¢ ŒÆ N†“a¨©¬©¬©·×]ê.…¦ãMgšÎ øQ»ª]µø8ù†zC™½×ýeVØÕ·)éÛÞ·}½ Y™K¾Ÿ|ŸÔî¶ÝGwµÎî„Â?á‡P"”%À[æ-ó–YB÷ÎîÝ; ¾¸/¿ßßïï·ü¥ ¥wKïBøToqo1)“O‡¾}o »ú¶]dãèÆÑ?¼(_ûó=&"·DDlçÜž^O¯äÇB±ObŸˆìrîrîrŠ,n[ܶ¸M¤HФHDfdFfD$t,t,tLävÍíšÛ5"® W…«Bäþ­û·îßééé‰?ˆGä—ÀBÇB‡äg^ØvNÞªˆTDDL=vG£ŽñääˆÈ ™“³rI.‰8¦÷÷Dœ1gÌY]]©(¬(¬(i9Ôr¨åHt<:Y9¼rxå°ÈþÉý“û'EZ®µ\k¹&2 Eìwìq{\Äpw¸;Ä\sâqŽ8GDL=vã3ã3ÛMA«ÓêD$-""…¶ßÉš¬­'Jj05˜qpp™tL:&"‘‹‘‹‘‹">¿Ïïó‹ŠEwƒ»ÁÝ ÒßÓßÓß#Rå¨rT9D¶ü²en˜Ȟç÷äíÉ[‡/´Ïêåz¹ˆ¥Çì1úûX¦æì×´³ ­¤­¤­®Ô_©¿RoõLçéÎÓ§¡Ì[æ-óB¤9Òi¶ü]ûºöu탲@Y ,C‡j‡j×Ý)õÏ,ßLß}?X=fJZÛ[ÛsN Ú’fMt…ÁX„Ĉâĉçì‡ µªVÕ*¯ó|Îç(vjÅZq_ªõxëñ‡Nås€kÚ5½´5•žJ†9ÇŒ dÕh1ºŒ.P)•TI‹G¿©ßÔo‚¾Cß¡ï£Ýh7Ú$I’ ÿ¤ßÐo€þ{½Yo#˜¾ž¾ž3Ç´©ÔT P®»®»Í1sоWÖä=¦Ç€ã qtvö+@CË~KH‘Ê^¡2ɤ³‘ H#@ô¯ô¯rñM¾‡&ÿoü+ n®Ïµô ð.ïâ±J¬ô)Pcj 6°lÓ¿ÞÙ|ÏÄÿÍå#{»xdïcæ öD ÍéÈ;3âIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-48.png 644 233 144 2432 14774263775 14707 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÏIDATHÇÍ–]H”YÆÏÌT£9å¸k Ñ´áH6(‘”ÐEf¥’cZ›˜„Q´ ÔV é…P»R."AQXCÅÅ0tQ EV-µnµÅ{Q ¨³êèyÏùíÅ;ï¼Ó.å^vn^þ_Ïóœ÷üχ!„ÞäW€s™s™s¡i;÷ÛþŒ-[ò¯šö95Žšß[!»+» çRÎ%õʶ­¸•Ÿ^/„ŸÎgù…WØw¯»×Qš´Ûaת]«2™öO!óVæ­¿%ˆˆÜì¹ÙC3ĞĞ|(ýP ¶mÅ­|«ÞÂKÇíÿâæÞž{Ûñ¸ç¹ç Ë7/ßøÞLø3Û+·W¼s½si'C€.ÆÇÃi¶Oæ[õž…oñYü¦¹s7 ¡Ý¡Ý™Í‚Wa8ê?ê·øfn!i§óùÀ2&c$p¨~ÕÀJV]z§Þ úW¹B® ÁEÙ);è¦2‰—·ø,~Søxm;Ê .£.#%è1Úè7úT³jf†?кIïÑ{°Çb³ô2í×~Û­¿Öô4EÆã 3`ŒcÀT?Ågñ‹tAÁŸ!3–ŸoŒ7F ·‚ U«j™`(é™6—*q(q(qFÞŽ¼yk ™>=}zú4 V V V\% dAÚ©<•ÇD ?Ågñ›z’ÂÎõÃÁ¶ƒmVµ*fJÊA{âÆWF–‘eã·x[¼-^Ø6°m`Û¨° «0T«8Vq |Ú§}BÁP0„Éý““6A¹T.MãKñ›z’žÿ×F¯¦êöqÙ¸LB-RY*MPßë¾×}¯íh(h(h(€¾É¾É¾Iììì€ÂÂBÈïÎïÎï†;«ï¬¾³ÚÆQ9ÓÑé( ›Ïâ7õXø`áÝ ±µ±µi¿Ü­ž«ç¶9’;’;’ åñòxyêkëkëk!t%t%täSùT>… +è º ûHö‘ì#°¦fMÍšò y†µÏÂÿäÉÿ?ïJ8Å)< Çå8€Õ#ú¡~€ض·ò­z oÖ»ò‹}]|±ï±/óû6ÎOä ¡R½IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-48-red.png 644 233 144 4211 14774263775 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü>IDATXí—{lÔUÇïï1-­Å©vºFY@–ˆ¥`´´ ZSµ`Wƒèò²,¡Û´tC£”YHVÒv,FØ…ìJÓ5¢ˆJ}4Æ,‰í*aJ¡Sœvèï÷»Ÿý£óûÍ#«d³{þ™9÷žÇ÷žó½çÎ1&Dœ¨%{“½É^åçÈBZÒѤ£IG—æê¦nêfןÄ<1Õ±mY/t¡ ÝÖ!^—õ¶½íodzãÇçSŠÇ‹oƒØ 6¨­ñû“gêGõ£úÑÖe£²QÙèIŸ48ipÒ +þ¾øûâïá©Þ§zŸê…’¼’¼’¼¨nïÛö¶¿ÏŽoçûuè—ï\¾sùÎèÉÌsÀæwæw±šÎ7¸­ã¶ŽX  þ¬]aNa@îìÜÙ±ëí]í]j†š¾^óõ0{bmÙxl| +é*é*ér M³p´p´0Ö÷›cßÈpg¸ZŽ·¸Å{‹`wÚî´XûÎöÎö؃$ìÉ¡'‡€¡HÂíc—ÔÎ_2¿d~É|gn³+ZšÛÛÛÀÅexÇðàÕT#ù½M÷ÜÏs?méPÿPlâ[vl‰kýŠçVÌÚ8k#Àþüýù/œzáž4! èúvÙ·Ë@f m)yó&rÑÆ'Ô"µH-½l?u‡6Tª1×w¦ï @ê®Ô]@8Õ“êß0¾@}@}@™¥ÌX¿yýf€‰÷O¼ ±²±2¿1øÓàOb­X fÛÎŒÑ|ïj?×~ΩäKJ¶’­d^ZŽ–£ål­³oYÖî î æ]¾ßùßð¿@1ÅeÁgÝŸu|’öI ?êý¨@Ì3Ö-Z·`äí‘·.¸`zÙô2€É'’PeKe ð¨þˆþÀiã´A8A:gë=Þó¡å<Údm²6yß5‘¶$mIÚ!ôSú)ýTsŸ3ðK< < ÌMöQ­ y^ž'Œ=ÜC##—2.ì{yß˱­÷¥ùÒ Îœ‚Š\»5tk¬}ï|úΧÑV—QVYVi…€/j/j/^X9¦§Ø·Þ–Ì=®l×½®{ým‡ŠªŠ½{eÓ¹‰á¤p";xmÿµý¡œPïñó81s÷úÌë3Á,®ŽŽ¹PËPËê–Õ<ê<¡ujZ7²T™ªLU¦Î:P;ï<©«”UʪÂ&¥YiVšm®Xðvx;¼Ñzš›ÌMÑzabt)se.€õ¥õ%ÈÙ&ÛœÝ`_so 7YãÜGÜGŒuN%ßÔ*µÊ ­H‰"ÝźX,‹õ7E«h­Bh- ^ý«ó´6¹÷º÷é¾-¾×}¯GÊënën¶²5æÞ†°°/%”€\i=a=­ï³Ÿ?Ûþl»¹Éy®ëCú·zÊú)맬Bõ¨Õ£´EЕÙ0o‰|®Ô.jµ‹Êñi¯M{mÚkB¸Ê]å®roµÃÝŞŞűܵ*¬ Âxñâ®r•«Ñš3ÌæŒ(4,hX œ·<Ý•îJï‰üZßiådBë…’ žŽ×Ýã\Ù®lW¶¯-†»UU1ÜM7Òô( ë’uɺåb7Ýtƒ7¥;¥;¥[;œLSÓÔ´gÞH âž|Éâ×´†îߌ»F‡ÑatD™;¤ÕiuZÿ>piMiMi|{î¹7æÞ0¾uZÐZ "S‡Åa;š/!_²ø%‘»Õñzþ?•ç•ç•çA,ËÄ2ëõõõP„"ñÓY¡¬PVHíœvN;§´GW&tîÿ&éη%b‰X¢¿½¥L•ªT%('•“ÊÉýflý·Þ„Îô$Ľi«ÿ `­×§5`ñ"IEND®B`‚routino-3.4.3/web/www/routino/icons/ball-1.png 644 233 144 216 14774263775 14366 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷ÜCIDAT(Ï­’A ! ÿÿóxXAÄȪd®mBh*(IriÙF;áŸq½zz†—$3±DI#ßÂ9ùcgþ¨r/õwÔ¦IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-71.png 644 233 144 2355 14774263775 14707 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¢IDATHÇÍ–]H”iÇÏL©cXÔÐEI‹Þx#(!Ad(²™} ³ “±íMM±^Û• ± b¹®A†¡!‘•Ûz±„ …i)9¥1N:ïóüöâwÞ×­vÛ»ÎÍÌùüÿ_žçœóˆˆˆ7ó+à.r¹W™º»Ñ¶{j=µ%¦Þf€«ÞUÿäGX^(¼TxI=µuËoÅ;óEìúN<Ë.^± y]y]®ªŒ~üeþ2ÏÔ[!ÿzþõxŽÜ8r ûr÷e¾‡ÈPd`¶j¶ lÝò[ñV¾UÏY_Îþ_rzsz]/!/7/W6Öl¬)þÁ ˜(†Ý»vï˜Z6µL»À˜ (ÐU@Œ–DºåÏÄ[ùV=«¾…gá›|Ön_»]ööò5žv­­·ðR×ù! ôxê]êèXº&]CB«‹ê"pR‡t@¿Ö¯Êtkº•¿§ÛÒm\à™z„6„6XŸvØø&Yz¶?WÃ~Ï~O–П`Ü2n¨nÕM*ãÐhÞóžD7™õs=ªGm3óʯü¤Àx`±icʘrÔÏŠ…oò(\Y¸RBt::íhû´Žè¨µ ìôáÉáÉáI(9Vr¬ä̕ϕϕÜ•'*OTž€¿Çï öÖxk¼Ð3zÆ9f,|“[DÝT7]£"éºtX²V–ËKy)ÂwdíÒíŒvFE*"‘ŠˆˆwÄ;â1ŒcÀŽK6'›“Í"Æ+ã•ñʶËy,EDdB&xY|“[$V«ùKäþÀýla‹¡Çô˜$] .¿Ëo×]qwÅÝwEZZZm»»Ö]뮵õê3ÕgªÏˆùŠ|E>ÛîúƵεNDD¿Ð/$™ÅËâgø|®+—v ÅŽ#å!yDˆq^M4šOIÂn¥/îÊOÌ1kÎÌ«zUŸ;¨›êšººQ7êFllÉjBUPAÏé7ú#îƒÚ§ö}ñû×ÉŸ™Ôê°:LŠùÌ'˜Ïüÿ´Ä™e2»B›Tÿ×äÿÌ®Ìî20wç8G}ÆAã Ѓz.°uËŸ=²L¾Uï?wåWûºøjßc_ç öoŸ#AÕöÓ¶ñIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-28.9.png 644 233 144 3312 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïOTWÇŸ;@áåÇÂb²QÛÔ5Ô‚ºnš–t,D\E³"u£B6‹/lº/h ¡[}¡mRâ*H±3ëPµVE‰?ªî¶6±Š+ŒZµÊ0†at€™¹÷~öÅÌefüž77ÏsžçûýÞsr¾çˆˆHZä+`™c™cI Ç–MÑ|Òª¤U/Ç-(k•µ7þ ©Ÿ¦~ Þ–Þ¦ßŠÆæ¼YÛ/Åå3ó’&ÑD¢=Ñ®X#ñ‡Pž]žôËp¼ë<¨jç³Ô¯=àhw´³†¾úÀcõX!›óf½ÙoâÅâˇÿÅ/ §N)?Bâ ‰/ˆÀ‹/¼T.p¾kŠÖü÷Sœaíg`3 +àÇ9žÄÄæ|¤Þì7ñL|“ÏäëÈ|;óm>++S[à ·±¯¡½¡Œ>€`'ÐB 3@M€OBOCO™2þ©ïÒw­F›Ñ`ü`üLjëµõLAÈòŸ°}Ì0þÁ;Þp¦áŒ)ðÖ!þf‹³Å©­¦ùϽÝςҷJßãU€à%ÀŒãú}AÝ£«‹aüÞ¨1j¦W #ÃÈ02€—™Ç¼hÕ2†0Œ_h>ÍGÐ\Q}*‚_^ZWZg ܳ•"" ÷Ò­~®~î‹ç+ÎW ø.¿ýùU×G®ðÜÜå 4à^ã^ã^¡ìPv(;FP#4ÆÔß &“àI·{–{~} ŒƒMƒMÀ]õ’zÉoêc…ˆHËØòñ–a|@ýw_vv@ʆ”);0¬Û¬µÖZp¶9Ûœm°V]«®U!k8k8kl m m Á¿Ñ¿Ñ¿1*È;áðN@¡¬ ¬ @òß“o%ßÂXÿAY}Y=0æƒÍ=›{€”°‹þHDä×'DJv–ìù²ù«â¯Š•\g­3Ù!ñCãÍãÍ¢$ÝMz”ôH¤6¿6¿6_ÄewÙ]v‘®Ó]§»N‹Ü¨»Qw£N¤/½/½/]¦GÇ@Ç@Ç€Èx…¯ÆW#âÏ÷/ò/å_õ·çÜž#£½=ïõ¼§äŠØÎÛ΋h ë±Ä[fÞy7g…HŽ-Ç&RxùMåMEií½Ò7Ò7"‰=¶ž’ž‘UªT‰ÔϯŸ_?_„ýìg¿H^Q^Q^‘Hjjj¿HîâÜŹ‹£Âf÷Íî›Ý'2œ6œ6œ&rdû‘†# "÷µ‡óΓDχ)S”Vk«µUDÞM>›|6gE¼ì‰»wÅRª *ƒŠÌêM¿š~UFv$7?k~&™g.w¿ÖýšH§§ÓÓé¹ì¸ì¸ìI°$X,"O³žf=Íə̙̙9Ö¬ÿX¿HÔIˆX ¬V‘ÊÔÊÔÊT‘S§ NˆX~´\³\Q+Õ êIÈNÈ–LE[·ŽÅýzhgh§Ò/Žä¡ä!‘“×»œ]NÉüËä®™»fŠlðlÝ0*rÇqÇqÇ!âºéºéº)â^î^î^.b?`?`? âóŒyÆDT—êR]"öûöûöû"ç¶œÛrn‹H×¶®m]ÛDV–¬,^Y,’1šq5ãªHÞö¼´¼4Éñ–yËD,¿â;¾SúEû£ˆÈµ8¹ñäFøºÿÊW¾0jV­{gê)¦V__}eõXR¾¤|I9ô:z½8Xy°ò`%,­ZZµ´ ÚÝíîv7ŒVVVCIEIEIŒZF-£ØkÛkÛkƒÜüÜ7r߀¯KOøOø™Š˜Má8Üv¸ ¸Ö±‹– °¹ps¡y–ô×A;£4FÁ˜>f8€ÛÜævŒ=xñâŽr”£1ù‹\ä"pŸ;܉Úm!gÈ dOŸÊ–Í-ÀxXàˆøê :è‹7.ææ‚ÖöífÀðâ×>Ó¾×¾c·Ñd4öX{¬=m«¶UÛ ú2}™¾ (¢ˆ"Ðçêsõ¹À¨¦´€¾@_Ú¢Àû÷ñëšö±åƒË: øâ™ŒøØÿ8 L)S€‘ˆ3iÝZ70ªëÅ DþB„€)&˜ˆY!ðò„'‘J00ôj½š SÚYí¬Y¼e‰e‰ÿ×ù#w%¶õ¶õ1w%ÛgoŸ= Ð 4ÑÄ ùB>­B«` ŒóÆyˆÆæ¼Yoö›x&¾ÉgòOß•Ïíëâ¹}=Ÿ/ØŸa ¦1IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-0.1.png 644 233 144 2520 14774263775 14750 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–H•WÇŸëÕ¼—¬%è,ÂV´0A(3¬7Š¢Z`dA5©hB°Šõ‡AôǬhšµc Bff‘E«fý16‰5Ü`öóšíâ®–tïûžs>ûãÞ÷¾omŽýÙùçåyÎó|¿ßsÎó>爈ȔäW mzÚô´É ;ís×XXñÉw û”ßzßú‡_ÁG5dŸÍ>«¹¶3ïÄ{óE\|/Ÿã—)â:2Û3Û}¡¤] 7rö×·!ØìxcCugu'ÀÅsϱÂ÷Â÷†CÃ!pmgÞ‰wò$yyy)²`dÁÈ‚‘æÆæÆæF‘Ñ£'FO¸üñîxw¼[D=UOÕS°‡Ò))+ÇáOéy¿Æx‘8s³ÛžhOtjÚ´h;‹‹‹pmàÚÀµˆŠŠ‚Š­[+¶Â`ö`ö`¶{@µ¥µ¥µ¥píýµ÷׺~=`Õ[õÿYcïý•1ç/Q9*(£Š* ­œæ´§$Zh¡(¤oÛxË[Þòo#æ.ö¨º1Æý+=}L÷[ý œ>£÷꽌é|½F¯U¢ŠTèÝ£{€VZiíÓ>íh Á³3UzƒÞæ/òÈÐMº‰1ÆþWótþT'†DgVwÔ½]oÇ"î¬ 0h4%JШä¢llàu2ÞÒ[ô,PwÕ]/þ¸œ»’}ÓöMKt‡9L–{j³ÚL Ìms>pmg>udÉ|ÏÁ÷®ü`_ì{ìÃ|Áþ ÀÈáwTSIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-17.8.png 644 233 144 3075 14774263776 15056 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜòIDATHÇÍ–ýO”WÇÏÌ@á!¼‰lÊV]ÜbSRƒ[ASæ&íÖ®D´jiŠñm-¤Ñ’llˆV&Ñ4ºnÙ]’¾@Ý® 3)XêÖ&¦±ã‚®Áfwµã‚4Y6¥“0G^fžyžûÙfž™iÝ?ÀûË“sî¹ßï÷¹çÜs¯€ˆˆäƾö%ö%öì¨mß›ð§¿þBÑÙ¨}ÚÛfÛæÛ‡!§%§`AÇ‚óNÂ¶æ­øäõ" üd>Ë/¹’p¤¹Ò\¶u1Û /?õòSé?‰Ú¿ó€Ö£õÌDൠ¯]øøÃ?dø|Së¦ÖA¶æ­xk½…—Œ/Îñ‹@êÅÔ‹¶ÿ@Ú#iˆ@áó…Ï?þF4`äqظaã€oß:” ?I¦Z b@’mÍÇâ­õž…oñYüQ=ùÏæ?+›^ÙôŠöºˆÈàÍÅo.Vè=ü•Óœ&“Ï"m‘6PÞÈÓ‘§ © ù©ù)¨!sÈ©5j €QgÔ‚ˆ?âÚx—wÉT‹á9Ðu Ëxç#:+C•!íKü0·§žƒ-÷·Üõ€Þ¯îÒ@€êU½èÜgŒ1‰¡~`Í3Ç\’ý˜šSs(µÄ0 ˜e”ŧtˆ-ñ<õ\R*ED–ÿ´  ¦pcøáwâ°¿žùKðzð:³Æ c…±ô*½J¯¿Óïô;!Ðh ´ÀÔØÔØÔÌŸ˜?1‚FØž OÂøFŸÛçf6òdF#À£ui]ÁKð/‘ÓW¡ö­Ú·@­0K¦~ïoò7Áê_­Þ½z7ªAFô_ë¿Ö ²ê²ê²ê`ùá凗†Ô3©gRÏ@‹»ÅÝâN 4 P¬T àçåå¨M+*–V,…¹_Fùàõæ×›A‰ê5$"òÕè陨=k~[šWšGÈÚ×Ë—;/w&ïµÞk½× W·]ÝvuÁèþÑý£ûq½½½°¬wYï²^¸µýÖK·^‚¢?,]¹t%¡KûnªBéÂÒ¼Ò<è ö{‚¦h‡w‡w‡š5k>–ð›sæœ9WÀpAñúâõÅë!§)çhÎQøÅæ•®|Æg¾Wß+¿×ïu*«"«B¹ì’å¨vTS,ÞÔ·Sß‘?‰ˆÈ„×Z˜Z(’ò›”½){E¨¦šj‰Á›ƒ7oŠ ´´´Šì²í²í²‰H½ÔK½ˆ]³kvMÄUâ*q•ˆ,\´pÑÂE"ÓG§›¦›DT®Z¥V‰t÷tçuçÉ„H¾#ß!¢ŽËm¹M±]0?1?±yE×_Ô_±ýLDDò-áÆp}¸^D_«¯Õ×&„½röÊÙ+"%å%å%å"¹¹¹"“5“5“5"Îg‡SD ka-,2V3V3V#âVnÓmŠnú»ü]"u’/2?=?-"ÇT™*³yc§ò«\?÷ù¹ÏŠhÅ2:¸÷à«_…cÀ0©j¬m¬m¬…¾á¾á¾á„Ü9îwB¥§ÒS鉲‰²‰2h?Ô~¨ý”e–ÙËìð^¤ýýö÷ Å:ÎþyÎsÎüÙª1â§òHí‘x…”@$IÔ”B„3©ÈdðáÃ÷` r’“œ†øš¯“ð¦£í‡n‹¯¶¡¶0c§2ÞÇ”öö]0sXÖ}ÌÜ£©ɬ#‡œ¤â>ož7σکvªIBÚh£ Ìl3ÛÌvPE7 Ãã`Øv3k.Žõ±î»OÜ}@ûFû&˜Â­>ö@çßš¶5ÍbÑû™1.—ÝÜnnGÿqI&óÌ' 310€ib{ ÌÝæntBÆÆIølMßšþ;ÿîJëî²îÊ(@pœãd&RlTÕ„@y”6HØÖ|¼$bë-< ßâ³øãwåCûºxhßcç öwÿ =ÁËvIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-9.2.png 644 233 144 2603 14774263776 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü8IDATHÇÍ–]HTiÆ_ÇmýÀ4—"• "—ÝZ¿‚P”j²ïÜ¢¯Z6 $‚V³ 2¡¹Ñ"–ˆ.ªCád$&QJKYâ6n7F®a­$V2è˜Në¬ã™÷¼¿½˜sæL[Ý÷ÞÌü¿žç9ïÿý „bžù+À‘éÈt$‡mÇ/¶?~}üú%×Âö 1e1eÏŽAʹ”s©Zªf ض·ò£ë…°ñ£ù,¿˜'lG\K\KL‰i×î»VĶ»!¡-¡m:{oí½póÊÍ+TÁhÏhÀ»’w%`ÛVÜÊ·ê-¼h|Qÿ?~!`Nûœö˜W÷uÜ×BÀ¢u‹Ö->Nx¹¶nÚº àuìëXå9$‘¤J€÷¼ÇãQ¶7ó­z Ï·ø,þ°iÅiÅBÀöòíå —ÃM„ªÓ«Ó->½sÔPC’êÓßêo›RHAÔSõªY5  úU?p>ä y ª?õ—úK Ž#!)‚Á7ù"üa=âÃÞž^ËÌvD&@÷zz ê›PW¨ Ý (kŒàĉ{Ìg>óA­TËÔ²ˆW©:¹\.GWý¡ÆPc~`‡±Ã°ž^ÕJ!„øî7HM}ÿ ÊA Ü`#¨ƒê Ù!=^‡ñ{ãwÆï€ñÂxa¼ˆt‰K\²M½B¯Ð+`쇱¥cKA¯×[õVu@ ÀC ßä‹ð‡õ˜Â.üûŽï;ê_#XÍjð?ñ{ý^T©X?»~;;;¡üpùáòà†Ô²ù¯û¯û¯Ãæ›ol¾)GSަ…¢Æ¢SE§À÷ÂðP‘©ì²øÂü–SØ“_¡yªy ä*õ³Y<ÿð|ûùv(¨,¨,¨´dOfOfO‚{À=à°ýZ¡V¨BÖ¬…Y mÁ¡‚C‡àl×ÙŽ³wÐæ ó[zB$w%w客xMñ!ÄïBsÙìt\zSzkz«Þiï´wZˆæšæšæ!†S†S†S„˜ê›ê›ê‘áô9}NŸCCCBܯ¿_¿^ˆ‰î‰î‰n!r—åfçfGÒãb~´øL~K¤ÎMküãoÆß[#Û€™Ú™Ú™Z¨Óê´: *F*F*F Õ“êIõ€æÓ|šFmBmBmä¹ò\y.èIëIëI³ãê'£È(¦->“ßÔ# ¹+¹KµÀhþh>® õ<ò<ò@~U~U~\ÜpqÃÅ ÕŸÕŸÕ½Çzõ÷ ÷ ÷ ¸šx5ñj"§p 'œÉ<“y&Ü·Ý·Ý·áyùóÝÏwG Zct›= ] ]#h•5¶4¶4¶@Þþ¼ýyûá^ɽ’{%0éštMº 2½2½2´*­J«‚-Ž-Ž-())œ9 rÀ݆»'ט‘õé5öѮİvIH†$àá¯P 3È`ÔTjhh@9äDùg˜a†O ý™(½EnŒÏîʨsLm€üm…ä+#ÑHù½\"—€Ñ`4 @m´±ÒXi¬U¦ÊTÈ&Ù$›@>“½²dƒì Ê ™A ‚ÿÏàäàägϱ¨“Ÿñ;ã#Ǥ¤Gzeì1ö ›_­0HÀ?4gl/^à™?al3¶¡3+ÈÑø;ãvÆY3õÁÉÿ™»’êŒêŒ@àÂE’ÝY)+ ‚êVÝĶmÅ#-3ë-< ÿ³wåûºøbßc_æ ö? Z..EàLIEND®B`‚routino-3.4.3/web/www/routino/icons/ball-7.png 644 233 144 213 14774263775 14371 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷Ü@IDAT(Ï­’A ìÿÿó<N Qãz…5@’¤a€Wv?X‰ºà‰Ï×`åýÅ&ʉº+Ü’_vêëß7óU/?£IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-8.6.png 644 233 144 2650 14774263776 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü]IDATHÇÍ–]H”YÇŸÑÔ´È-[ %‘L( û€¾ÀJ'#‰ Úìƒ" j! /ba·›5².²¬°ÍÉÚŠhYÙÕZWW‚(³U›(‹ÊÅlœYÑtæ}ßóÛ‹™33mÛ}çæçœçùÿþsÎ{Î{DDdrø)7+nV\r(Ž+‹ö'®I\“UŠO™`Û`ÛÐuRN¤œ˜rvÊY«;ëq[/Õåé~™,ÑŽw‚Û¶*WÁ¦ÜM¹‰_†âïïBÒµ¤k#츾ã:ÀÕº«uì…þ¶þ6€¡UC« ëq¯ëµ^¬¾Tý‡/ö[ö[¶>H˜0A2Vg¬ž½/”ðt6¸Ö¹Ö¼Š¯âÀ| 8p¨UÀ0Ãè6ëñp¾®×zZ_ó4?äG ueêJ(Þ\¼9©6TÐ}ã@útÍ ^£†ƒÄ¡î__µ†ßð3ªKuc* ê±z \2F€qÕ|| |Ë!áˆèEôü?äG>\Û㌕H‰D ýÁWÆCã!¨YÆ=ãÁð€RS•]Ù9ÌaÑVN9å`ݰ.Z#½J•š“ÌII6ÚŒ¶ý±lD<^³”""Î ©?©ø xb>1ŸX ª^Õ3¸ð¼0àX3°Œ\#×È1äÆ;éFº‘oËßî}»‚¹ÁÍÁÍê„:Á(¿jý0/Âù ;õ;ìªÜU ªÀš<â µ=zŽ*ü§p°pÒ²Ò²Ò² ØYì,vÂ{û{û{;µRO©§ÔŽŽŽ°ü›ååËËÁ{ÎÛämB< îk^ˆ¯ýÄ…æ-ÿ†ÈŠŠ"êo[žˆäJ®ZK[—´.[ïo½­½­"MK›–6-éÚ×µ¯kŸHK^K^KžDÚíÚÛµ·kEšŸ5?k~&Ò^Ö^Ö^&âœâLs¦‰ôÌè雈dK¶x¦y!~Ä$·$·(7ô/è_êÏÿù»¬w³ß͆œ¹9ssæBJUJUJäíÉÛ“·ÞøÞøÞø¢ùçGÏž{µ½Ú^ ™%™%™%P¸»pwán®><|8š¯"¿B|í'N$Þï"GÄ~Ã~CDUŠˆÈ;í½¡¥áNÑ©‹¦.šºHÄÄÄDD©15&â®pW¸+¢36Ò>Ò>Ò.2?~~üüx‘¾+}Wú®ˆx{¼=Þ‘3ëΞ)Œæ«ešâk?q"ÖMë¦í/c½±^DjDD$UÎpÍ(šQ$ò²ãeÇË‘ÆiÓ§‰ ù†|C>ÇbÇbÇb‘Wƒ«Á%’]]] 2Ø8Ø8Ø(RÛ[Û[Û+òÚóÚóÚ#’13#=#=jL~Ô¼0_û ½l÷+à’ÿ’hP_³ÌxnÛûØçyƒýehÑ<ÿ€IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-27.png 644 233 144 2430 14774263775 14702 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÍIDATHÇÍ–OLTWÆßŒE˜8X&Nþ!$N.$!cW®$BHp¢€ÆP0šµaQRcRG‰…Ö˜v¬lDMšHÔâ,HƒÊŸ°Ð.L)ÁC☠0™Q‡1ŒïÝw]¼yóž Ô­wórιçû¾wï=ç^EQ”’ÜWg©³Ô¹Ú°ßXþ¢º¢:ßï†Ý+ÀÑèhüûGø<üyÀsÙsYŸ´l3nηç+Š…oç3ýJ‰b9 oÞvTçìØ[¹·²è Ãþé1¸ú]ý ß=|àÎÕ;Wùâcñ1€Tuª,ÛŒ›óÍ|ÏŽ¯tü‡_Q ` `À1…+ W* ”Õ–ÕnüΘ0½vîØ¹ ¶"¶B:@ÌnܲH“Æ ›mÆsóÍ|ÏÄ7ùL~CÞmÞmŠ Í Í®>#aò:´ohßhj?ÐK/n~ÓÎhg@k¥Z)Y~•»ån`@Feä„~Q¿2­Õjµd唚T“À´ÓŽÛªö£µ¯o_o œ¼nñz”÷öçØS´§XPGAdD('ÅITù•l•­Hs‰äI’!rBN` qâyK‚tI*ˆ¨ˆšnu4Ï—çW삾ü\qW<ý<ÏE°ž?õuú:Þ塾V›Ô&˜›™›™›í™öL{ê>uŸºæÛæÛæÛ N„aH½J½H½€ÅîÅÅÞ1žÃÏó™ü†žœ°Þa8râÈ “^¯Â¡fÔŒõÇéÍéòt9nnnÛïö»ý¨ TªàÚk®o›·ÍÛÕÕÕP)ˆDàÂø…GYx"š½™½iãËózrÂþún¼¹ñ&ŸwH4fÓÙ4YÓ EB‘T¬­X[±ÖÚ±­Ã[‡·C—Ö¥ui–¨w¨w¨Ê|e¾2Äúb}±>+.OheZ™‰/Yü†V?\ýPÞ†ø–øÛÙ¬/è –9Û2Û2Û±éØtl»»»`“g“g“†Î:kÍnnn‡óGÏ=Ôò‹”HŠ$€“c6¾<¿¡GO±§Xÿ¯¯leÿ‡ì“}À.v±ËJ?æ:æ:懿Ãß#«FV¬²âOýOýOýàkõµúZáuçëÎ×6þJ(åKùÒÞfL~Cϲ+&µSÚ)˾_~¿ü~¹UÃçfÎÍœ›ˆ3âŒ8!ÑhH4Àñžã=Ç{ i²i²iÒ†wE\W€,‹FÅtÅ–>czãû…÷ Ö‹^Š^Š^‚º`]°.õÅõÅõÅP9^9^9£5£5£5Ðííöv{áÞš{kî­±hõúý ñ–·"""ÿ{Æ–©J´´fut d-™K Ýf?á O€x¾ŸId 䇸ËVå}Ì8øõ ‡õ0ïä°LÊ$ˆqZœ1%¦Äˆ‰H!… Ïê³ú,ÈfÙ,›mBó­GoÑ[ò}ñc}l‰Îä:ÿ¨ÞëA=ˆJ2÷Ç)昒$HÉÝ•Y°ªZ‚~P?ˆ bDŒØñ—íü¹+ €~ “NÜÖˆýb?Yåc8À²Íx~Ërù&ž‰¿ì]ùɾ.>Ù÷اù‚ýZŽº†<¢HIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-22.4.png 644 233 144 3173 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü0IDATHÇÍ–mLTWÇŸ©Ã,8ÚS7R!uÖÚn€D^ÂûZ[¨Ð…vU´MX§†nvãJCw‹tk%8YÚ´‘öÍ´°» VDJ‹@)ˆ ‰YkÔ­°`Ò–fý0sɺö£çÃ=yÞþÏÿž{ÎÿYœ"x<°#ö‡üQ¶([Âßv£† /Þø¬ú`Õ~òè'êÍ­Çõüðz‘~x?Ý/«%ä0µšZ yA»^~æåg¢ÖìçÁÜfn»ç{»½à´ó´“ßÁÃ? ÌæÍæAÈÖãz¾^¯ã…ãKíõG:é4L€i…i…<±í‰mñ¿$ŒÅÃÎüùw"ïDj ¸€b´<`žyô1fëñ`¾^¯ãéøz?½€@lnl®' ç çÌM‚›Í|\á¬p‚ÖàkãMi$Qxßïñ{ðjÕãêqà¨vT;  ÝÐn~e—² /~ÿ¬€&šˆ¡.ˆ·ªâ銧u‚7›i)T UsľûJè›gdzX‹³Š³@{ À7,°Z»úžú>u^ýVýMû£V­Uß_)´­F«í_Ab÷Áç-5CÍÀ§•û7ú7êAßJÉc%éφ}J‘_¼O·ùSó§óF{rìIð½Àó®§~¬û±Ž_¶¯ÜWêç[ë[ë[ ®Í®Í®Íà«õÕújÃuÒI'àâw€å€Ûû‡…ö…vþýóÅùÅyž‡±ú±z`ÐÜhnœ72à#ZªˆHã ¼^ÿz=xÔÄ‚3;>ÛñXÞ´œ´œD˽˜ÛŸÛ¦ Ó„ ŠŠŠÀ’cɱä@Ö‰¬Y'`æúÌõ™ëa/pËwËw+dWo®¶UÛж-åMåMé^5Qý»=ÁžôøˆˆÈ• è^Ù½œî(è(Ðʬ± _&|‰W/-°Ø ì””” ë3Ög¬5L?”~(ý4ô7ô7ôóÀèéé mœü|›ÛæÖñµ2µ¯¥­¥ ø:À'±òû•ß'¥Š$%‰ì¸˜iÈ4š¾¾Ô?Ó?#¦žÎž/z¾9²áȆ#D:':':'DιιιDÜ£îQ÷¨HâåÄˉ—åþpÝF·QÄ‘âHq¤ˆìùËž·÷¼-b˜Œ\¹BL,CÖœòœrù¥¥ÕÒš”*œ^Ý»ºWýŽ_O§N§†Ž}•¹ònå]HNONON‡!û}ÈZʽ•{+÷Brurur5 ÇÇÇ>¸RƒÃà0@dCdCd¤^I½’z¢–L“¦Ih÷~õÚW¯1 ‹ÆE#¨/XJ-¥êwå­èìèl­5²Ö5áš0¼Ôqm°o°O¤0ñ¹Ïm©ÿ¸þ£úD6ýjÓÖM[EFÎŽœ9+Ru»êvÕm‘ºâºâºb‘¸uqëâÖ‰Ä;âñ‘kžkžk«Ñj´E¦Ç§Ç§ÇEÚJÛv·í¹Ð5X3X#Ò{o0m0MÄ:ÓÓ#ÂÞ„¸„8N‰rPßc¯v¼ }Ç®–\-ÑÊl¿ÙêÝêÅkû­m·m7dZ2-™8l=l=l…â©â©â)Øž²=e{ l1n1n1Bscscs#ì[³o;50Y7Y7YZÁî¿v¿Óý¼õ³êÏ«?Ûcß´œi9,øå¢qì8°#tJ@éRº˜c.¨FÿÏðàÁ&cùZ¾–þoü]þ.P;Õ«êU4>ô¿ë´ô~N8¸ƒ§’ÓAÖ• ÊànŸ’¨’¨ÿ©üÁ%E»Šv…ý+y#î¸û2Ùã1àŸ÷Ï(¥J)^ÐÎkç0`€­Çõ|½^ÇÓñõ~zÿŸ‡ùvñÐÞÇÎìxôùû ÃIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-25.5.png 644 233 144 3236 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜSIDATHÇÍ–mL”WÇÏŒ´ã(ƒ•šX i ­ŒÁˆ˜l}!ÒˆE^ºU1!ÓF–Twë¦SÝ/»&jH£R»ZY5‚¡×(T´–®€°-,­Y¥u#/­C¨YŠ-2®ãð²ÌËóÜß~˜y˜É¾|÷~yæœó?çüçÞÜÿ¹""b|Ì Ì Ì aÛ¼=ꟹ~æú… Û'40½jzµçw0çƒ9$žI<£÷Gm#nàcóE¢õcû~±KÔa©·Ô›r#ö>زdË’™ÉaûpX­!(¿\~àbÝÅ:vÂ_þø%ÀÃ܇¹µ¸7òz±õeßô'šžh2ÝË“–'E õåÔ—Ÿûu0ðü0ã‡Ê Ú(O¼ÊÆÃXžÛˆGðF¾QϨoô3ú‡ùÌ];w­,ö{­µá„~§œuÎ:P6r€:ꈇÐ`h”?T*ůîéçôs Fuî¾RÕA­B«À'ä y@9ÉIâÕ÷áz*èœëœ tDúQÒUÒe­…ä¤ä¤è™F¾Uy¼ðÚª×Vr»Ô>ýuýu‚ª[WçQÓ{4Éüÿ5ÅS(Bç8A …#ì‚Íoo~ÛØÁª¼˜£Yt”ë‡ÖÇâ` m ‚›xetÞO»ÚÍd°+è z£ý|fŸÙg†‘Ö‘Ö‘VÝ3ºgt„ü!ÈÅ©¿©NÕ ¾u¾J_%Œ´Ü{ÿÞûLŽþrüÙñgyE›sçÍ;oÌzzÖÓcqª1ÌGTŽˆÈ‰NØqhÇ!ðý @ÏÜx)ÿ£ü aOÂÑ„£¨ÜS¹ÇrÁ kÐ5è‚… 'N@z^z^zddfdfdB¯½×Þk{Øö°ía¤¦ö§öƒã÷ŽSŽS¨ŒGº#zw »‡Ýz&캼ë2h%a>f}XDdÅ'"ÅŠˆ\z÷ÓÂO MËÊžxJ¾ƒ¾·|o‰ ~ü"ÇÇÇ"I®$W’KdkõÖê­Õ" 'N6œYì]ì]ì•é5n·ÛEÌŸ™ÛÌm"eóË&Ê&ÄÔð‡×~¼V‹«ŸI{&Í´L~‘S›S+2ãt˜9Îl´ fåˆd•d•ˆäõ’é%“©¶íúç> –æ3Í5Í5"ãóÆçϱ9mN›SDKÔµD‘Ö½­{[÷ŠÜ.¸]p[Ä}ß}ß}?JìÎÎ;;ï쉳ÇÙãì"Í[š·5o)h-¼[xW,ßÛ‡çÏ7ÕŠký£õDXÿ]üwY9ÂEû5û5½Ÿ{r<9Ñkÿ[ëîñÝã••• ÝIÝIÝI0”1”1”éééÑ#[“¼&yM2¾uøÖá[Q_M_M_ töuöuöÅâW± ¨:uÌrÌ‚è§B›ÅfÑûDÛ;{õìÕª&L.€Oþ~Õ}Õ½«‡¾>Ô}¨šÌMæ&3Tî¯Ü_¹]ZtiÑ%8}óôÍÓ7ÁQá¨pT@ÃÆ† ¡>¥>¥>jjj ­*­*­ j—Ô¾Xû"¼÷ü¬çgAë•/Ú¾h ŽAO˜ýÍìoT½h¿ùÚ W¶]ÙŸõ]?{ý¬zc}é:ÿ:?þ W6œßp–ª¥j©‚W‹«ÅÕ««WW¯†åÙ˳—gÃÛÛxWzWzWBq{q{q;Œ Á‘Ò#¥GJaÅ?V|»â[8›Z×Q×Aäþª7(=—.¸æ‘‹P‘_‘ol´ž ÚUí*^¼1º5 ëÛôj§v ˆ"Šbü7¸Á @'@ ª"´‡‚¡ P`ô«x¯â=`2ÌG¸Ñ1¬n«{,Nýս̽ ´wÃ:¦õ¼/“ZÖ«õ‚ú•*Wå õh=ZhÛµíÚvÐKô½pâÄ zªžª§?c9ËAû³6¢€¶+ÐhdR_®Ïm·Ãí°XÆâèØ)`“i“ xQf¯Ö¢µÿÔ õB‚#ÿ˜Èï)&™ŒÙ!…†<ƒ'‚… O¦´kÚµXåßdÙdùŸÊ™•”l-Ù3+y'åèèh*©$Bc¡1­L+êCu`ÂQÛˆx#ߨgÔŸž•‘þa>óëâ±}=ž/Ø?¨õ)¦ç3IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-135.png 644 233 144 3015 14774263775 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÂIDATHÇÍ–oL”WÆï€ü™ˆRHØÔVÇ­6€R ¤BB­Å”Ø Rlý²‘NR]£;,™Ä62$M5KMHc1“ÀŽD#4†XÒ¨¬àÊ$-¨E³m&0AÉŒï{ßû뇙wÞéšýîý29çÜó<Ïœsïy¯!„éÑ_ /'¼œ°:b'µü©o§¾½á_»U‚í=Û{cŸÂ -/´d\̸hܵl3nîÏÂÂç3ý"]XŽ”Ë)—m¥QÛ‡rå¤fE쀽ËÞõD‡Úoj¿¸ê½êåL M ̗Η‚e›qs¿™oâÅã Ïÿð I=I=¶_!%9%YXûÖÚ·Öÿ-²áÁz¨Ø_±`2q2Q%€œÒHS¥ÀK˜k6Î6ãÑýf¾‰gâ›|&D€Ì’Ì!àÀ>°·Eî¶£×½T÷’ɧuQÌ'|B^½Wïné&ÌYµ_í5bÜ2níêcõ1 ä!yˆ° k!-*€i*Åq¹ÆLwÛùöÀ‹^´·™z¬VBÑT•¢RÄÝPõº[wƒúIú¥-P$ªeµ j¯Ú«öÆ*†ÊVÙ*(¢ˆ"ËÍS¶û\w\w\w€RJ)ÅûŠ÷ïƒôæôæôf¨öV{«½0ãžqϸÁát8NØòï-ý[ú!7/·<·u'óÇ”SâøÒkÏמ7+×:6êâußßšXåÿúäáâùÅó„ ë ·îîè¦ÑM£› ;¿;¿;vÍîšÝ5 s®9ל yŽÒ-Ä…¡ C†„æsƒ¹Bäü’ӗӃϴiú;ú;BXzÌ3†ï‘ïp#Úówõ}°ù—ê3ê3ê3`8q8q8Ѫ€ç¡ç¡ç!ìèÙѳ£ÚÆÛÆÛÆ­øÙª³Ug« À_à/ðCÇúŽìŽìX8Ì»Q>¿¯ß×ÿ§3½•8?s~fÝЗtk¢+ lÉzé¥P(Tœÿ÷¸œâ§xv}ÇÏüŒ¢B/ÕKãø4§Ûé~æV¾Ö ö)ûÔÒ Ô„6¡†9gŒ:£Žeã#ã ã üøñƒçsÒ¬Ë凄A ¨lØÀ²ÍxìHDóM<ßä3ùcßÊçöuñܾǞÏì>l¹pªNIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-20-grey.png 644 233 144 6270 14774263775 16010 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü mIDATXÃ…—{PWÚÆŸÓæB¸+BD‘ ÈU"(Ö¨D‰²Jˆh•ãº~Ôn!~±œ”’0*UˆDDMÖ EŒ™°@È®ëF"bpA˜…%Áa€a.=}¾?˜&UV¥òþ3uºÏ<ç×o?ý¾ç¼¼¼¼¼où¼åó N¿’~%ý 'yÄ„„  ¸Xú-ý–~@¨*„ €¨‰š¨œÀ œ…,dô =CÏ–‡–‡–‡UR%UØØwI?½.½.½Ž«ôYï³Þg= –x$>††ÒPú×ßÛí‰öD évÒí¤ÛHñüÜósÏÏáârß2¾e| p:ùtòéd p¤p¤p8p á@Ðò]Ëw-ßÐ@ àxÏñžã= znõÜê¹ÀG¾ù~ä î<Üy¸èÛÙ·³o'¤p÷üÌó3ÏÏà’t'éNÒ¤H<# ÁBðKÛ½~òúÉë'.zyÑË‹^&åØƒ=Ø3Šo»¿íþ¶iiiÔËÔËÔË€$Ÿ$Ÿ$@»Z»Z»ªªªn4ÝhºÑüXöcÙeÀöãÛo?¨|T>* r°r°r°òVÞÊÏ»D}õEÔ¤\â‘ø8ë¨uÔ:ŠÓ«#VG¬†Fq]q]qfÊP†2P’"RDŠÓ"Ó"Ó" >2>2>˜'Î牀o¥o¥o%а¯a_Ã>ÀPe¨2TºX]¬.ˆab˜˜Ÿ3?g~à9ê9ê9 t¤u¤u¤º9º9º9@$" pJ¥¿ÒæÀƒBÓ1Ú1Ú1Š"ãc|LB™‹ÌEæâ̓ɠ‚ ª™16elÊØ”$Õ$Õ$ÕÓeh½Ôz©õ X¥X¥XÌ>5ûÔìSÀPÙPÙP0s1÷ð¹|.Ÿ °ß°ß°ßæIó¤yφŒy—y—yWò< åXÖŸõ§U¦8Sœ)Ž,2…L!/pÕ\5W Jé ‘=”=”=ôúN}'PUZUZU ˜˜˜¶ [†  Ä7Ä7Ä7±Wì{! á$œ„tÝ@7øâCçpç@ÓØÉŽÉŽÉô1©L*“J«8ùAùAùA¡¸oNßœ¾9Üé;w*îTMìáØÃ±‡15]p¡ìJîJîJ*Ç+Ç+Ç•+*WTÉEÉEÉE;ÆŽ±cvb'v³âfÅÍŠ /^4¼ø ¨UoÕ[õk` ¬p5»š]Í3·§tÇtÇtÇ Ô é†tCøTÞ'ï“÷ Å Ò‘Žôý'¹<.Ë#š†Î†Î†N‡Ê` 0@)•¦õMë›ÖózæõÌë‚h ¢À}û}û};ðùü@K•¥ÊRDìŽØ±hŸjŸjŸ !†CPûAíµüf~3¿ž ž ž„U ƒÄ (kQ‹Zˆ DGtD‡ãÄAÄqÊ…<y<xÜú¸õq빇}}}ï„G‡G‡G;r3·enËÜÆ—”–”–”Âji±´XZ ³5ÛšmÍS”0%€9ÆcŽ2®f\͸ ,q_â¾Ä¸øè⣋€»ú»ú»z`–~–~–HÝ“º'uè ƒ/ ¾0RÝXÝXÝ(š¿÷ûÞï{?F©P(~Üh¯±×ØkâKɾûì{à&nâæÜ£ücþ1ÿøšbâÈÄ‘‰# Ô)ú}Šž®X%¬V ¤yüÁøƒñ ü?ÅOÀL6`6üYþ,`—±ËØe:щNÀrÅrÅr`_b_b_øµüZ~-Ìwï$ÞIÄÎß>ûümüCÑ«èUôZVR–²”ý†°î?1ÌIæ$s’mg1‡˜CC ¢A4lµ)î*î*î­7[o¶Þ¤‘wÜ}p÷¾t›ï6ßm>¦d×d×d×yœYùd¥#76.6.6ŽyýèG?¬dÙD6C4¢ € Q4ŠF’fÒLšÁ]×]×]×ÑM‡š5bþîãã3h±ï°ï°ïظv$s$s$Ó$FÒHÉ6çƒí–6ÎR¸(>'>'>NC§¡ÓØrl9¶œÝŸ¸z¹z¹zé/Þ«¹Ws¯†-®»þíú·é ’M²I6dâ9ñœx ( è£cˆ@LèFt#:|ÙÝÝ ×a×a×a@ŒãĸݟL[oÐâ´âÑiºZjD*`Î#‰L*wκ[Œ4 Á‘KHIXñæô‘ãê•é ˆ~G|G|Gd–GŠ:uibØ#ö@É„1aL¬‚FÐÈÊBÊBÊB ‡ã‡ã‡ãÙûòhy´<ºxÙôG³ë†X.–‹åÜQ `Â_$‹À$eÎ 3rz7×éÝ£¤„”’毙$&‰IÚ¥…j¨™Ò{½Æ.ì0V+ŒP2 Ã0 ƤL4N5N5N‰æÁòÁòÁrö¾|¯|¯|ïk­CÖ!ëÐÞ#÷_¿ÿúý×' Ô´• Ä7ú °4Aéørƒr%⫈¯"¾*~S¾]¾]¾ýË‚§þOýŸúsÆKy—ò.å9r± ±]Þ]Þ]Þø[[{[{[;ÉTö({”=€¨U¢êÏ׸ .ƒË˜z9xiðÒà¥Ì¨s½7¤õ,‹_ çG&8‡]Ô…ºPò?ÃáÃáÃáøÂ1ß1ß1ÿ?‚,X, ~«ôIò“ä'ÉÞ_»ÝÆnz¸óLç™Î3ŽW&ìö ;›Ã/ç—óËÿ7€VÐ Zñ÷Úé£ ÛQŒbT|^zÎD ÏòüFüŠwóQzÔ;öS-ÕRmb/s™¹Ì\þg°eeeΗóå|9ÓͪY5«nj ¹r9äòïu½º^]/ùVô}E_zÊ©[ã4ÿƒßˆg¼ëáôî~d#ÙÜ-’E²HVK­§õ´~ÏE "PÈt³ì;0(‰EbÑCÏÆž=i@;õ¤åÔoqü?ðfîü$QÆ|IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-2.1.png 644 233 144 2533 14774263775 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–oHUgÇW-½ ™ ƒ0+Zå YQËR’ £$‹Lڋʨh j–%kÛ}!Ô¬ £ÀW + &”Rú"13Éለ¸åpÅÄ?ˆ•™^3½÷<çùìÅ=çžS#{Õóæðû÷ý~Ïù=Ïï<""2Óz ÄdÄdÄ̈Ø1eŽ?!?!ÿó«»Fg›g[à{H>Ÿ| åbÊE³Ë±í¸ï®qðÝ|¶_fŠãˆ¯‹¯óäY¶ггÒ"võ=ðÞðÞxkÀ¾†} ×k¯×r;;FòFòÀ±í¸o×Ûxn|ñ}À/Ó§5zz ~züt˜»aî†ùßFžÍ‡-›·lèíÕ1 ^‰$ê< H{½rÙvÜÊ·ëm<ßæ³ù#zRצ®­;·îôþ)躂Qž^žnó…opœ Qÿ~~üdŒS Ÿè'€¡Mm†nÕ­ê :ÈkŒMÆ&à »ÙMbOÙø_”?¢GÞïíÙõLI‘DÝ'ÃÐ_½F/a+ õúˆ>: :À¿–>®è ÿ"“L4˜æaÆUªsáS”P”` <»ÞÕJ‘/~ï w0ݪ[-l}ZŸf"üu¸*\/¿\ðr„}a_ØçRÒJ+­@'t:î·£o_¼}á¿ ¯áЇô!&xdã[|QþˆKXM;ì?µÿhÀ\d‘Á/ƒƒÑ¿\.¸ ɕɕɕ°¦zMõšjnnns„˜±f¬ #çFΜƒ\®?×Mß4íkÚç|Pó³PB(!ZµÌæ·õXÂ~×F¯‚ÊÐ{¬Š©K?\*¿T™³2geÎräÍ9šsü½þ^¯ã[:¶tl)¬>¾úøêãÎFi.l.l.tòÔŸ¡“¡“LY:÷Øü¶wgÜÕu0¸bp°øý½2´k¨t¨úŸõ?ë;f_³,*XTmÇÚŽµsò£Ä(•­²U6¬LZ™´2 êÓêÓêÓ\ÂŒ:£ÎÍdñ[zR’R’̧ðjàÕpÓ:ö…:Wç:eÞ o…–W-¯Z^©©©®jS›ô¸×ã®/[™S™S õÅõÅõÅ.aÃF—Ñå3¿¥'FļiÞô<1 B3NDDR¥ÁÓáé¹µèÖÂ[ EÎLž™<3)RÒPÒPÒ Ò×Þ×Þ×.òàöƒÛn‹Ô¬ªYU³JdtûèöÑí]¡ÆPc¨QDõ©>Õçø% ÒµRm~[OŒH0/˜÷è‘¶;mwD<DDØkãÆUÄŽ;,’_š_š_*Òò¸åqËcÿÿÿ‘îžîžî‘ΫW;¯Š¼›ónλ9ÿºÄu‰ëE2Ò2Ò2Ò¿g†„¬=¸×æêùðT:§ÄÎD×À”½Uÿçr×ë÷ñ?z*]sl¼ûM÷›(À&Ý®æ©yL¨ŸU“jõD=TAÕªZU ºL—é20³Íl3ðáÃ5ßÌRs‡¹ôÒI0/˜˜`"‚ÿsÌ5ù)Š/Š·aÃ÷ ©;êðÚ,4 3b½ñk†¦˜dcŒ1ÀD¡"·òÃæ.saP÷Õ}þÇ'ÿGþ•”Ï.Ÿ¸TQE¢ÓU¢J˜}OßÀƒÛŽG[fÕÛx6þGÿ•Ÿìí⓽}š7Øéã:¶+ñ¥3IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-35.1.png 644 233 144 3071 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜîIDATHÇÍ–ïO”WÇïLµ2e@L$Ù¬µ8…«U­#˜`š]S@Eiìš´™Øu»1S ñGb]m0ŒÛ¤,ÚÉªР Õ¦K–6ÒAÙT_twpGÆb²B!L‡)“±ÌÌsŸç³/fžyf×ÀûæÉ9÷œï9Ï=ç~Ï „"'ù`^i^iÎNÈæƒ†>㵌×òÿšÛ$˜všvþë,ýhéGË>Yö‰zßõ}Ý>Ý_?=ž®9ÂP,é]ÒkÚ–”߇½ëö®ËÈMÈço¥ÏÒQàí·Ü.·‹ßÁ#?ŒÌm›Û†¬ïëöº¿Ž—Ž/Þÿ¿øBÀâ‹o˜Á’ç—â”ñ/¡¥Î(F”(ÆÒPQˆ7´Z£âS|ĵqùH>ÒÕq‘ÝênUOðÃÊ´R !į.òwK·¥;¼ü+ý+!þG~3kŸnnå‰ò%¢D€00o·Î[afpfpffggAfÊL™™–èÇ\à‚!FBá×ïó$>žÀ¿ÅoîYnZn†éùÍ$„mÃðŽ|GBè$A‚ª½¼¤ì•²W çBÎg9Ÿ¡Õ¹êÚëÚa¶i¶i¶ l›Ãæ€Õ·Wß^} í…öB;xcÞ˜7f$"×Ëõr=̵Ì}0÷”¶”ö”ö Ýüõúkõº•jWËÒO®mX(Û…âž¾œÿr\ækß]ûNk(Í.( t­ÈVd+‚î«ÝW»¯BaQaQaœÖNk§5x0ú`ôÁ(O­ÈDd"2›77nn4g°ê‹Ð!½ ´©tºzb÷œ‚Ÿ²²´^vN:k†;çÌ€²seÍeͰªrUåªJ¸’%ÿJ>¬éZÓµ¦ ¶´niÝÒ — .\‚‡#GޤØZ¹V®Y,‹e1lÊÚdÝd…þ\·ßíO³›\ð¸ ûë쯵^¡]\úéÒOÕ1†G៊ïïÏŸ¾9ñÍ FƒÑ`6Ôn¨ÝP Ç]Ç]Ç]à{ã^£¹)Ï-Ï-Ï…–¼–¼–à,g±%oÊ7‰‚vK»€ ²¾Ÿ*YÒ_ÇÓñõxzüÔ¬|f_Ïì{ìÙ|Áþ†OG:aWIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-39.4.png 644 233 144 3162 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü'IDATHÇÍ–íOÔWÇÏ P¤(tºl-¾„ñ¸\ùa几îxüƒ&šˆÝ¢[€KšKsáQŒËÆeàºr(€úV} èz‰^‚M{¤= …¢ø‹/¦òåÊ—MãÑVh¶ˆ+þ­À™úçÆl{}ïë{A½ àýø@å‘F$^uTíWûQêUu@Xß)Tˆ Q!À!r_ÅŒt#¯ú£f×ì¦Ûûú‘-G¶˜¥ˆÈÎË ÚÚlmîP˜Ú>µ¼ï?ŸõÓµŸ®±¢eig´3¦µöµöµvp8œ`L“Æd”1Ææ™eXó¹=gWºWºYYÜúÄýÄM>LÕOÕŸÛšlMîP\>=¢,""MŸÃIý¤®X0öþ.-=9=bÿÛÛ*ž./g³ÆYyó.æ]„ÈÈÈ(9Wr®ä0Ê(£}Z£Ö¨5ìªäªÜª\TÎjæÏ™?›^c¯Ñ~"ñD"0äÓ#ZŽˆÈ7•p{éö\³ö|×ó*ûmô+ݯtãqîwîrî‚ÝwoܽJªKªKª!g5g5g5@¸ÇµÇµÇuuuO%w&îLÜ™NAAîBîÿI—CmŽ60èÓ#,FwGw«.Šæ.Ì]¹[–Ê—Ê!ýéÇÓCBRBRB\½{õîÕ»`?m?m? mñmñmñ£bTŒ‚+µWj¯Ôpæ§ç§ç§!7&7&7Jß-=_z~¿+99§ÿovËì`>º+ºKuYù§Åeq‘,Žç³ŸÏù^Ÿ89qR~]Ý:ºU¤o__j_ªÈcƒ±Á1’Œ$#IäTñ©âSÅ"½E½E½E"ÖûÖûÖû"áÞpo¸WÖGkMkMkÈ`í`í`­ÈtþtÁtÈàWC®!—HÏÚ­Š[òKÈo^XxaAD•KôlU7ôcú1˘HX_XŸÈHÞÈÜȜėºJ¿.ýZd8l8t8TÄ3î÷Œ‹LåOåOå‹ô–÷–÷–‹dõgõgõ‹lŽÛ·9N$e)e)eI¤y[ó¶æm"i·Ón§ÝélïlïlI¼—8œ8,²éð¦äMÉ";³wÎ윑x‘ÇÚcMÄÍg|fü5ÖßÞÙÞ¹~»Ëê"j»j»ð¤Ž¥Ž¤Ž@órórsÐÖ766¾ûvìÛ™™™àNq§¸S Ð^h/´Ã\Æ\Æ\F ¯ÿoýuýuðçȪOª> ª±OÛn´Ýž˜5†y++Ê*Ê€ûn J?«Ÿ êCÿe†à(G9 ,²ÈbPu·ÒJ+@ A ,[e«lÐ>Õni·À¸i<0 ¸¢½§½ê ŸŠ+>ü·’‡þ>†í¡í¡;”¿O¦M¦~Î×ÇôókŽ5+F¢ñ†ñð—¸ú¢¾¨/‚n×íºŒz£Þ¨`tC7t8O5ÕAB{ô=‚Ó¯M¾¬Ú&m“îP4{ªós$âH üyUÒ‡ŒcÆ1¼ë;¨Xc ð°JPÛ@¡£‹8q†ß‹Qf”áeM¿§ß–Í—ÅÏ÷tç÷¿•.9\ôVòö‹o¿¸þt8€ \ 4·æÐßÔßÄjX `ÁÛ\7ãÍ|ÏÄ7ùL~ŸžgùwñÌþÇžÍìÿ“˜‰·îüIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-6.2.png 644 233 144 2672 14774263776 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜoIDATHÇÍ–mhTWÇŸ;éd23µÌ‚)Õ®LZÚ,ƒ )IJ›È«ÝŽA‰\×± B±¢64ªiÍ.u·úÁ1´FÜP‰Uc›¶ blPóÁŤ›¤2±Nfö¾œ_?ÌÜ{GÅïž/—çíÿÿŸóÜó" ""Ïæ¾ž¢X}¯ê£À§Æ¨1JÔuuH«ŒÊ€cÿ˸kÜ%ãä’­wðüŸÃŸÕ#÷ö³71¢ÑGÐw´˜a3 ÖŒ÷Œ÷Ðs¥Ö«UjPH!…¸#H ¨*R!Ç«Ô'ækækèêºÑetåá§ÞµÞµlŸ½™×J‘—ÿ þ„?qÿ27S7SÀÏü¬cÖ1RÆ£Þ¨‡Ém“[&·€^¡Wèy‚v±‹]®©¯Õ×êkaòÕÉÅ“‹Ao×Oé§ÔVµ•lü›æMþœžœ°//ÃæÖÍ­@À ó'c‘±Èñú[ë‡×Cq¬8Vƒ¥-K[–¶Àô‘é#ÓG\AI’$Æ'O@ %ÐhHW¤#ÒÓ·¦SÓ)”|1Çgóçôä„ý÷C8ž<ž3›þ·\]æ\×¹ösíP6P6P6×®\»rí ÄöÆöÆöÂàœÁ9ƒs\a‡Ã‡Ã‡ÃP^Z^Z^êúk¶Õl«ÙÝ»ÏvŸuÜóu›/Ëoë(¹XrQ„De¢Ì7xhôþØûCïàÝáÝáÝ W/\½p54¶5¶5¶ÁLÃLÃLƒ›ŸOŒ'Æa,=–KÃù¶ómçÛ Tª UÂ¥Ÿ/_wó­MNee¢l=óæÎ›kýSãSã`þÙÙöÜxpãÁP½¿zõþ¼¨­©­©…}»÷íÞ·›ÇÆNÿNÿN?,é\Ò¹¤†‚CÁ¡ Wµ"Vx`óeùm=«ßê×~1V+E´ÏED$˜ÛRU^ª ‰L”L”L”ˆJJJŠLXÖ„%èt:DúšúšúšDzú{ú{úEöDöDöDDš4h> r;~;~;.rcí57Öˆh}žËžË"üÃæËò;zýÇø_¶çêã9ã92ö ÆŽÆŽÆ Ú¨6ª èíí…© S¦.Àº²ueëÊ ^¯×Ã Ï Ï ,»³ìβ;žžž{ÚÚÜÌ*â?öÈ®œµw‰ù¼ù<°ˆÿ¦›î¼^0ÂÐJ+­y~3·ƒwš(0îÎñø®ÔœsCü âʇ¢®¯ç¢…¼!¯,M½¯Þ—¯T@†eXæÐÄb‹h“ZRKŠx¼¯Ç+¢R*¥R"šOói>UQ‘°¼"¯ˆÈ€ü"¿ˆxªd³l–Y­®`¬`LV˃[É[I9+Åát8ý›W$]š.­þüñ“ŸhQ´È9&¿ó[ó[kƒµ´=cttÀÊ­Ð 3ÌÒ¤_¹Ë]à^.ÿWk¥µÿ›ß˜ßäãG}QŸ½RüO¸+Ù^¶½Ì8 tÒI±Û³Ùl&jP  ¡kÛq§e¹zÏÆâ]ùÔ¾.žÚ÷ØÓù‚ý‚DøŠÈ#îIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-35.8.png 644 233 144 3165 14774263776 15056 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü*IDATHÇÍ–ïO”WÇ/£VAÐ@Š?¨üj²J4.‰bµ&˜º D„FפÀÖ ­kb h£M­ ¤Wš´(¥²Â"0A ¥¶K– ULÝd+àŽÒf³¬Ì0…™3ÌÜç~öÅÌðëþÞ7Oιç|Ï÷ÞûÜ﹄BDø¿ 1†ÃjŸmø}ÀüVð[ ñÙŸK:thø<„þ)Àš/×|©= Øú¼¿4_ˆþÒzº_Dˆ€ceûÊö }~ûcÈßš¿58ÊgÒÆ[Æ[Ͻðn×»]¼O¿{úÀ/û~Ù[Ÿ×ãõ|o)¾øøê +zVôý V¾²ò!`ÓþMûãÿà ‹‡ƒ™3Æ—/SV ”PµpâD¶%¶>ï×óu<_¯§×÷ñùfä›BðYöLöŒ±Á—ð¨‰+¥WK¯‚ðÜâ4Šòþäý ”Û[à-À­&µ­”U³i6àžªVÕÒ$M¸Á;í>ã×Uwüx.m-mÕ >jâz¶;ÛmlÐùˆÿ>ÛK¬?œz8ÔnÏ 0Á¨hi‘<¤ó¯¡÷h7nÃÅ<óKìõj^Í£TŒ”Râæ˜eôãÿúpæáż”±ä(…âWWø›±ÙØì\c1c1àù#¿µ¦þ\ós sÞûÞçÞç€6p„:B¡ð¬÷Yï³^°–[Ë­å WÉUr/Œ…þû‚¦>5?53çÝâDZecË€~c«±Õ¹\ç#TB|>ïÉ÷$Ì|ˆ»–ºwgzRzD\Ž0G˜QW ®‚õ¬õ¬õ,Ä™âLq&Ø|wóÝÍw!95959†]îaW€ÐôíéÛÓ·!Ë™e˲At\ôÑo r’³b³ba~€– %—K.ƒúÐÇGx÷ !ÄßKá[Ç·h4tÿÐýƒ*Úµ:­+­ ·½Ô^b/¸”¸”¸hnmnmn…ä”ä”丨.ª‹ =z<DId€X÷ÚîµÝk!±3±3±þîaîÃ\HøSì¶Øm¸¿yÿþ®û»Tôtõt\ïã#˜]ݵºKµsh²r²2èlp;Š!½:½*½ b3b3b3àfÂÍ„› °¥iKÓ–&Ø]³»fw $^K¼–x ÆêÇêÇê8SãSãSãt é@Ò¿þQøG°ýжW·½ SÏgÔŒ°ŽZGA] Ë ËRíB] ¿~]çsz-%–lƒµwÎß9v·ÝmwÃö¼íyÛóà\ã¹Æs0âñŒxöFíÚÕ%Õ%Õ%mbmbm"ì)ÞS¼§8àO-LÉLÉ„ÚuuØ@Y”äš°Ma›´Qƒê”…²0hTˆ_­øJˆ¿y0ù`RD9úýÑï…X52"„«×ÕëêbâÞĽ‰{Bï<Þy¼Sˆú õê7a˵åÚr…ˆŽŽÂ\i®4W âq„8„˜81qbâ„feÖÌš¶ÖVk«ѧ¢C¢CD¤®Y׬¢B¥©´ QÁ'þì¯-m-múzTQEð…ö í¸wôìhßÑ £ £ £W©:RuÒÓÓ¡-¬-¬- fògògò!;*;*; ¦ Ó†iÔ©;SwÒBÓ i¨÷Ö}Q÷….4ªˆ´ô·ô7ô ýVšŠLEÀ×þ[¢ä)yj‘‡âŸŒ0œæ4§_”úè£È$“Ì%þ *¨,þ|oV&Ëd M¿•¦LšÿVbñëF‹Ñâ\NÝ“Ov‚,÷錼°Ð±ÐÁœ¶U+ÖŠïðÈÙ!;@ž”'åIÐr´-(£Œ2ÐÖië´uÀ1òÈ9$¥” ËÌ fæ´~k{òú“׌?t.çß~{AùÉ Î Ÿ¶{qÉ>Ù j…xW¬X`áÿ(½B"YŸû{„ZÌwëxzgñ×{Qùý½’œ·sÞ^Ò+)ÛX¶qàPI%¡àuzò˜<†T¿ê ˆ Øú¼¯çëx:¾^O¯¿Ø+_Ú×ÅKû{9_°ÿª-û+ŽŒIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-1.4.png 644 233 144 2546 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–oHUgÇ×ÿ‚iJFQNè²Ù‹„FØ?ØÈÊ„yÛT2µ¨È­`%CÖ‹&l–D‹è/1fØ›"«¹+›( V®Û½¨ ÉM ï½çyžÏ^ÜsŽ{„„Feˆ#ÑÏ£»¢» òn$ ˜VÓÊ+B6¾ÇÂ1pùzla§„wþЋÁš°&À|h¶˜-˜±ccGÆŽÀÊã+¯<×ë®×]¯sué]¢K@å©<•çæ5,jXe/ËFËF§ÓF;;Ëæsøm=I"ã¥ã¥¿þ"rçÖ["âa»ËX“÷e¡,tÖÌY3gÍ‘ÂáÂáÂa‘è¾è¾è>‘žüžüž|ÿQÿQÿQ‘ªþªþª~‘mf›ÙfDjûjûjûDŠÎ-:+bZ­uÖ:‰ùm>‡ßÑóÚ©dúTŽ[®£ Jôõ­ã%/y醦ÂT˜ °z¬«t·îÖÝÀwã˜*³×ìÅ€ò+?$Œè§ò?|Ì8>£ktëcúc]­«4ÒHó˜Ç ¦Ô”ši¤Ñ#´Ë´›vÐ_êÝ ›u3¯˜²ñMØ [oô1óO;±ã̪Wõèíz;qûÔ,^Ùr5ˆ!h ƒ¶°€˜]?¡7éMÄA…TÈ‹ÿFçÿŸe 8Ìa²Ü-V5ª†(˜»æ.>|àÆÎüô'a÷;xþÿ•oííâ­½½7Ø¿òÉ0Ï)ñ~âIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-58-red.png 644 233 144 4275 14774263775 15632 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜrIDATXí—{LÔWÇÏï1",œÐ2,P¬®¨Í Œƒ¶¢%ÆŒk+¶)í6]tÔSÜ%ÖUbKiÍÂf3FLų(ÅPƒiª)±º0(l5 ¢3–ŸÕûeâì/ø”çÇùñÁål‡   å÷O]=uõÔU5ÂõÈõÈõ€¦0 LÄ Í÷ͳx¶žåcùƒë-øô—ùÈð?ÌóÃÿ` 2¯d^ɼ"­x:àpc>SÓTƒj€$—I‡¤C€¼Bš/Íä\9ENäòËòË€\&/’jš®†CbëY>–_ªoxNCãš¹f®™H¬+ÅJëwl©Úô¹és)W;ˆK¸—dE)JuÐ7áapÁ@ÑV¼§¾À£”)eþxɪ¼¦¼¨•5ʸX´©ÚtÄtDÊeõã#Ý}Ý}ÝýM¿a† C…¡BM¶ÚÏÙÏá ƒNN€ó¸ó8×dÒdLtOtÀdÎd¨9jL:-àrt€™ 3ù¨Ú 6øÒ>j²ቡÂPn(W“Æ'î÷ˆ{z*ÙDmAmAmúŽ/Á”ÔÌr> Àí„ûÂ}Àûz@XjX*<y0Ž"GdüñC@œ;âQÄ#¨¯¬¯üù½õj jµFõmgƒøHuèSõ©úTTmËóî̤: ‰ì™ÚÚ ölìY¸øÍÅo ciÇRh©m© ¬YœVœ /&¼×n]»¥©¥©\á'ÂOHúpèCÿömmmãã}¤YW¸®p]!•ê;õõiZ±K™R&‰Ô님Ó}·û.Qô¥èKDD?Îü8CDä€DD›Û7·¾˜÷¤{Q‚š ½ôÂK/­·®·ÑÏÇž‰¨wltl”H±‘¨ïŒ)Š)¢iÆÃø|Ÿ8gî5÷š{µ'“åõžhOtàåmÏÛØjããˆèŠè€¤ú¤zð4x çíž·ãŸï|¾3Ðß6¾mÀ¸¯àiDñ×7¯4¯4¯ÔÎís¬õù«kV׬®Aÿ 7ÃÍpΨÕj5T±Ö_¿Ý?uÿøýèG ÀWw¿º %Y%Y’œ’ _f™ o]~ë2wô¬èYzon¼¹PÓ½GËš97snæ\ô3>âsù\>÷éˆo ºa_ýLýŒ_ÜòìÉɰ®°®à::t4Ô¥wé@W§«€ŠC‡ &)& jãkãçç wé]@nù$擽KÇ:z:z´ü=—Î¥séOGHX%¬V®boYb’Áj°Ê 쿳ϷÏ÷Ó¨ÆÔâÔbHËKË vDvDÀâÅñfÄ›p;ñv"lÛ¹m'$·&·À…° a¦J›J›l7‰› Kê’àžòJ=¼äì’³Šv±B¬ûŊ̉̉Ì!/‹—ÅËÃÚo6–ËåFªXnû{¸aËÈÈÈ0ÅZ¼0y!|ÝøucàNß{õÞ«`´­\¾ø's¦æLÊ'¿=ù­¿Õ…ÿ,(-(U¦4Àb¡X(¾µÃë‡;B®Ð„Ïtéºt]ú`=[`)³Ä[âU£Ö¹¹’M²A\¯¸^àò=Æ@@µZ­Çqn6>±xb1 LWNWú[Ý4ÞôFÓج]¡U|_5³‹çâ¹ø¥§B…Ú•º‹ÛÅíZ_Ç5rM\ÓŠò[§-Æ›¦Ý%Zñž çq€[¹¡ÜäU³ÕlP®+×Õ¨¶¨-~) 79†@âlÃÃi¶“ ¥B©Å¤¡åR.åŠ?keQ–ø5S35 Á!8Þ?¯]­u†“†“R”ý{‰½Ä_P5*EJQ žâ)&:Ì0ê%OÉóïïÎë;;vvÈ%Ú 4!Ž‹ã¶ò¸½q{ãöñ&ÞÄ›¸]Ãü•ïs‡Ð/ô ý\[òäɈt…ºB]¡­\Ón–)Ë”¨]Å¢Xà† 6Ø<Æc<ösË)rŠœâ×bMFMFM†jÔîò(]”.jxÆ÷kivp§¹v 1.Äí ö ³½Úµ·h·ÌR Ý()JŠò)•‡ÊC¿ûЇ>ÀÞÞÞ§nÕ4ÉGò‘¯ÿ1DŠŸ…ð…Ñ/5!ÚÝÊ5r\cv;m~íJR§Ô©º§ã¦ã¦ã€eÎeÎeNy‘¦ÅÓÂiáô‰µLj>é…Ρg˜?€%ø9í33“¢ìöF{#7ÜpÃÉH-m–6K›ÿØëÄ:±®Ï÷—$üZH]ß8E< 0ÔØ‚×}ÚýÛÏi7{Kö–ì-~íÚÖÚÖÚÖâ¯ÞyUë—Ïåsùë—á‡Ôåè¿´giwP%T Uƒ+p~E~E~…ú§4Oš'Í#ÝÔZí‚Ã’@V²’•|ÇŽ`©Fÿ£…j·<ØÏþ·›ÛÍíh#m¤Ê~?ŸpÄG»§§§ˆ„¡Gèá:| w„tîÿfQÚ·Ê¡ñ»àé x•WyàÚ¹v®ýß¿öŽ/´…tf $ï3[ýñª{ `¨úâIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-131.png 644 233 144 2650 14774263775 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü]IDATHÇÍ–h•eÇÏîínw±\sknè’£Aâ˜8²9grÅ©l¥XD¤2È%RcˆÔ†‰&Z‚ô‡&E"jwMç !Nƒ‹û!X)+¢frMwsîr¯ïû¼Ï§?îûÜ÷VìŸÞ÷œóœïùrÎsÎóˆˆÈóîWÀWá«ðÍI˾­ž>øzðõ—¾MËGälÈÙðÓÇPøEáEÇ‹Ž;·<ÙØÍþl?;žÑËóâ)òNçÎitånxóÕ7_ ¾–÷_üp~xƆmßoûà»ß`;Ä~ŒýoŒ7‚'»Ùoü ^6¾tÿ'¾úý9@^n^®,l^ؼèƒô†ßAËš–5ùÿòk¨@º˜f³fÉÆîî7þÏà›x&~š@ICIƒ¬ß´~Sþ±´Ã­o°;çwÎ7ñ¬0õ¼ÏûpŽصKí"ŧz^úº3ä Çõ»ú]Õ¡:H·ã@==ôPÀ×. :¶/?ÍÇ+¥#"r`%´I›d]Ó]ö.{è›jTb¹_'tô*½J¯Êd =O—êR`=›Øú+Ý­»ÑúgÇvl,Ð!§ñ¡­¸­ØdðÀʬRŠˆT†ü¿óÿž~Æ=¢„@_××IÌL%žK<ÖqëKëKˆµÑÚhm„Mš4Ýc÷Ø=üoÍL%æ'æƒõ{êµÔk$\uˆcÃcÃù±üØô3†Kìè ÷Ú·µo30Îb½ÜZl-†øgñSñSèºë¶×m‡‹•+/V‚ÖZk õ«ëWׯ†¢ÝE»‹vCë‘Ö#­G OÆ“q˜***…º_ênÔÝ€ ö^Ø‹ÎDz6Ú?iÿÄdîè Klä#^9¹àä‚LAÞ›™xtðÑAR˺–u,ëðzw¤j¤j¤ z—ô.é]K.}¸ô!ÄçÅçÅçAEUEUE œ83pš‹›‹›‹=ÿKë.­ºä•>¥FÓñàäÔÉ)Clä#9—ç\Ö§y{9ö2pË¥ÖáÔ85 ÊU™*ƒÚ@m 6á­á­á­^‰&÷Lî™ÜËÛ—·/o‡¹á¹á¹a¸_v¿ì~™·¯æ|ÍùšóÐûBoIo‰§Wš¿XM¬ Ÿˆ¿ÅßÂ+Rø!ðƒˆü,""ò¹D$"âùïùï‰ø+ý•þJ‘`"˜&Dîž½{öîY‘›ÎMç¦#Ò7Þ7Þ7.RÞZÞZÞ*ÙÙÙ/™å ùB¾ˆ4Ê Yáé%èÆ“@_ OÄðñ‰8çœs9¿v‹Ý""–ˆˆ”ä¼(Oä‰çŸ %CÉHîÎܹ;E†††D6nÜ<(ruèêÐÕ!‘ø–ø–ø‘Â;…w ïxþVÔŠZQuG«ñ,béD”ˆØëìu"sÆL¯¹5_kOÚ“¤L¢»ŠºŠºŠ êú£~¯ÝÝÝP[\[\[ ÇúõëÿWvUwUwUCtm´)Úä1ç×YϘە™®0]bOÛÞD×@Ê£ Dˆ4Úë1à6·¹ ⇲ôŠDfH€þ7þ¬]Y}83Gô˜5fŽ™cN§ÓIÂyÛÙëìòe”QP;ÔµTêQ=à”;åN90À/çgŸ³ô¤Z«ÖfÍ±ÄØ£±G³Î13h¬„¶`[Лü ®©kÀŒó†ó–;û5`c…’$Iº¶tŸð$+CuY]ÎÆoËkË3™ú×äŸå®4wY î]—)zK½E ô}€rÀ“=S2×ßàüYïʧöuñԾǞÎì?¨ï³J LRIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-70.png 644 233 144 2402 14774263775 14677 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü·IDATHÇÍ–_HTYǯ¶þ‹©©¥‡ wZ4£ŒgŠ -¶Àͨ&„tÛ‰\+ƒ5Ùv¡v¥éï†f«4È8 [Hk>Hk/®b¸´Õ 9%¡£ŽsÏ9Ÿ}¸s½w7«×ÎËå÷ïûýž?÷wŽš¦iš3ùÕ uMêšÔå†ú•åÏÜ•¹ë³_ û’€”²”²á:ø¸ùãf€ìÙ7ä¨e›q3ß^¯i¾ÏôkNÍrdø3ü)EIû ,‹ßГ6ô-´¿n½ £’q@ nzæÜsî97ÄîÆîÆîB_q_q_1lÞ4¼i|[}[}[aóúÍë7¯‡Ho¤7Ò yMyMyM"DȦOjó7çošøªÒâ7ôh°¼oyŸòCxKx‹­5 €¿gd«l•­VÔëòº¼.hó·ùÛüÐîm÷¶{aÛ†m¶m°òv\ÙqeǸà¸à¸à°ü¢HÏÐ3ì|&¿¡GƒìeÙËäDŸEŸÙ~{]…U䬜•³VùГ¡'CO 7È Xþk®=ºöÜÝÝ-¿'è z‚p¹êrÕå*›°2Ý­»ímÆä7ô¼wÅÄ—¢T”ZÞšÁšÁšAØwzßé}§-ÿˆkÄ5ₜU9«rVAˆ / ïxÞñ¼ã0‹Ål蟊°¿sÅÞrÆtq]\'.;å-yË*¯kªkªk‚ÐÃÐÃÐCÞ';NvœÏ Ï Ï M‡¦CÓ¶'é¤ã¢^Ô¿óŒ-þW‚>¥[]!™Å¶¥ôÓO¿ÍÞÉNv­´b;‹\å*WBòÉ·áÍéú„oÑ¿r‘>fŒÝLË2YÆÌD· ȨJU©*ß\1é’.éááÙ![d 2*d3Iû}}ì¿_ôÈ*YE‚éäŒãL3ÍbC¡€ybÄl>äay˜„…g⿵ó¿å®\¸ËÀ¸Ûh¤‡µÅÂ+¼ÄAÝW÷H!,ÛŒ/‰d½‰÷Þ»òƒ}]|°ï±óû/”e¾|Cª~IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-11.5.png 644 233 144 2740 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü•IDATHÇÍ–]lTÕÇ×ig: ÖRÇŽ.ÒT ±5-$døhR#¹Ql©ñ(FP›jµÑâƒ5òИÜkKD„¤ ¡ÐD§h¬UKÚPQ¡eZÄ6HC?‡™i:sæœýóaæÌL˜øàëåd}ìÿ½ö^k ˆˆH~â+õHÖ#Yyq=ëõ”}Ñ3‹žYy*®1@{A{á·aÉçK>x ãs$¥[~+>}½H ?ϲK¾¤ ŽÓŽÓÚæ„~^)}¥t‘;®ÿ¿œ^§7ƒ7μqà«ã_çm˜œðoöo†”nù­xk½…—Ž/îâû·öoµ?À‘ãȧ Ÿ~ôxÀø£Pµµj+ÀìÙ* Œ —\µÄ’Ù4Ýò'â­õž…oñYüñ| ž,xRªwTïp¶£‹ˆŒtBÓò¦åÀFÝK'-´ 1Ì`4 D¨01NªSꀺ¬.;ŒDðÇã•Î|A®ºÇSzcAcÐoñUT8ÛÁír»R5M|?} ^ ½õ€> ||Àª[u£(µ_5«fPcʧ|¤$DˆPš¾À (bæ0:°œå–S€—ßù}k?}*­”""}Π3´ñ“¯Í×–„}.üWÈr1¯_ׯë×Ép àŸü*¦Â* wþ{§åN ÜúáæÁ›™Ÿy3T*â9c‰¯ÎW°ø¡ÅmÊÏGøEDäÈy¨ý¨ö#P̵þÖ™g>†ò¦òƒåQ=ïöÔöÔ¦g;g;g;¡¼­¼­¼ zê{ê{ê3 †CPø{áHá”4—-9Š*ÛPR\R —ßúsìÏ1s-4œi8Fu<QWED†áËñ/Ç!ü3€Ú³ñ=Ëã"bí빚s5çjR„ž*O•§*uÎn;»íì¶ÌÄ&Ç'Ç'Ç¡èPÑ¡¢CÐr¤¥µ¥|FêFêˆ$öu»º*»*Ùx>B0oÔiF§O-õvâ-Õ'ô ð8<9žðÎyç¼s)ÂˆŠ¨ˆOž'Ï“ݥݥݥ™‰õ©>Õ§`õ‰Õ'VŸ€ŠÛss°êÀÊ-+·ÀïKn,½±àvÅí Pç^ͽªNgÉýÙ;³wò¸\±bÿDD‰ˆÈ\ö”½Ð^(bk´5ÙšD4·æÖÜ’‡æÐšˆ­ÞVo«‘b)–bÉ»VìZ±K¤}]ûºöu"ç]ç<ÿ È/ë]Ö+Òý¿n·_æD\G]GEÌIm¶†Ç³ókókíŠèú³ú³"Ú )°€£û¢MÑ&‘صصصLâèÅèÅèEìØ±§ìÇ&ŽM›lllÙÛ»·wo¯HGYGiG©È­5Ó÷Mß'R¶´¬§¬G DB«B«D²Üꂺ ]IÜÊáF.t}ßõ=ð|¢æ‰Ší¯ÛÿêþWaÈ5äre–jßî}»÷í†áMÛ†7ÁBþBþB>TUVUVU´{Ú=톶ímÛÛ¶ÃúÉõ£ëGádáñþãýigl{×–®-@ŸuÆHÞÊæÚf‹Î\ ±`,Õѱ`þ•\â—“(Ñ4¼s1=¦[-¾ÚÖÚV`>q+“}L9o:om˜>ݧ§ú˜¹GÿQÿ‘yågË2yͳƬrÈ!e”Q0¦ÓtO° `|gÜ2nÑõF½Ì›ãøü:V2VàwŽmÌX},£ó¿äxÉaÑê„^£Ðͳ=ùÇ#„³1–Ð!>£Ì2›ˆ…2_3_CgÁè3úÒð“|ÿ®YÉ]³2à…ä¬L”ØØiì$ª_õ ¡AJ·üÉ#‘XoáYøÉY™àçs/¿.îÙ÷ؽù‚ý9UÁcn»IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-35.7.png 644 233 144 3153 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–mL”W†ÏP(LqhÁÝ,œÂ&*&Ô¸˜X#¤Y,ˆ±ÑlCèjƒ²²‰eÂÚJKI?h'…E™ŠPq“J¡Õaª¬ÈVp¡Z÷eg ”ÙÁùx?®ý1ó2³µÉþõü9¹Ÿó<÷sçœ÷½Ï „˜„%†%†ÅøqØÁxÔËQ/§üÕOË +ÔÞ­ÕÍ«›b?ŽýX¹ÄÚº–Z/D?´Ÿ DZ"-º­ü.ìNßïÇïÝýeýe—oö¼ÙÐeî2ó{˜ýfö€…­ [!ˆµu-_«×øBùÅ»?é/D\¸ªûD>ù´œ—œ÷Â!Âý Gþ€©§¦žRÃ@¶ÑD«['N´áÁÚz _«×ø4~­ŸÖ߯G@ÜKq/ Á©W_YÔ·ú îµÑTy¦ò ¨Vße>ÅŒ™hTé;é;P=R‰T‚GQ:”PíŠCqƒj½Z WÉUx0KfÉ ê=ª¨"ZuøùÔW>WùðF ¶›¾âŸ6x¦ùý\~ýªéU¨›|6`šiP%OÈøÈ!‰$Ô•=òâÁÃÿ*ÐB >` k´°Ï»¯í¾¦íàû¹!G)„ëšè×·ëÛáp?ñ~"øþÀv»éûÆïY–þ.¹$àÄ–¢—¢—¢a®o®o®ìGíGíGAº.]—®yé5x `ï±»ínp|4—7—Çò„'É“ÄvwÓäíÉÛzY/;ÃÕ¿¡ê„â´Þ’ß’añÌ3¯˜¶lÊIËIÃ†Ï Ÿ¡–˜KΔœ{µ½Ú^ Ærc¹±Öß\sýMÈ0e˜2L0:<:<:Ö[Ý[Ý[ †=†BC!¬;¶îÔºS¨ÝyÝyh6¶5µ5)&¨:Ru|küz„”'„#•ðÅÒK`û|ôóQµì·1Ù=Ù=xæ+ç+æ+À˜iÌ4fBûÅö‹í!#3#3#jÕZµV…ɡɡɡÇÏÐæNs§«ßÕïêk±u‡u$'&|•ðž©‚åäådµ .]ºt Õ¯GðcLOLj¡p¦n¦.Hèl]:°trþ’ÓÓks׿®Í… )R.¤À†¶ mÚ`sãæÆÍz6õlêYx0ú`ôÁhG*•J¥Ò Þ?¶ÿîþ»ðÁÁƬƬ`\öMeLeÄ|óµjjÓêOV¢ŒƒsÈ9ÿ&*&*pØ>¬¬yϼgÞYEYEYEpÌ|Ì|Ì c¾1ߘ/H¼%~Kü–x8™p2ádÂã;7òpäáÈCH©H©H©€Åº…wÞ ±™8»×îņdž+ãaj·\*—êÆ…ˆèèâÎïîÌÜ™q{÷ïÂú ë3Ög„p÷¹ûÜ}BLßš¾5}Kˆ}Ýûº÷u q.á\¹!»»»„0n3n3n¢%©%©%I¬ŒÎ':Oaú)Õ”*„á±Æ~(„r^!Dœ˜–_”_Bè•/•/uã‚÷ߨµŽÎŽÎ•¿»ìÏQÇ-Ç-x6^ÝhÙhÖñÖñÖñà477C¶-Û–mƒÎU«:WÁbóbób3ì¬ßY¿³\‡\‡\‡ 6½6½6®\½b¹bY¡ñ(Ýþ~H?tü ÙÆHeÀ.N[¡¼¬¼ ø€bB•ß–ßñ¡2Æp˜Ãþ§`€ Ÿ|òC➟øÜ0³Ì¢2+MJ“ZP1¡–×”×hÂN[C?¡Ÿp†Óòí¦o7|Ôïcòqo—·‹e%]9 Êy×Aî’»ä.Ê僠(JPM5Õ è¢n3È (Ê[qƒº_ê—úY(ÚŽkrir @?«Ÿu†k¾ú¸óSUðj|6Üò€< ”*¥hŸ»ŠŠ/àæþÇãedàGìØC¢ÿQŠ•b|xä~¹?Ôù‹"‹"Öùw%{ ö„Ü•yþÈó+—:êˆÉ)9ä×ä×ð€zC½€±¶®åkõŸÆ¿rWúûõ<ɯ‹'ö=öd¾`ÿ H?@Ýî’nIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.7.png 644 233 144 3121 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïO”WÇÏP(3 A¨€FK‰“fš j·êê¦HØv5j#ØÖÐÝ¥1$´lÒ²K²¡ –jTR±$T©Ø‘bRRÚʈ ©ÓeE(‰û‚…v‡v`FfçÇó<÷³/ff¬ûxßÜœsÏù~OιùÞ+ ""Yñ] %?%?%3f§¼’ð[K­¥…bö,»-»Ç›`ÅÉ'²ÏgŸ7&¶ynÆ'ç‹$ð“ùL¿dI‘ޛÞkÙ·ßýöývknÌ~wl—m——4xÕýª ¯«¯‹?Âܹ¾¾°Ís3ÞÌ7ñ’ñå_ñ‹@Ú@Ú€å_þxúã"PPRPòôŸcÓOËå/–Ì<6ó˜JÝ d¡v˜k>É6Ïãñf¾‰gâ›|&¬œ9;D8ýÒÂK ¶ÎXÂD7í®W¨ëÑËœçC>$4¯æÐ]º‹0­ªBUi*M¥¨q5 ¿¦¿F˜n­[ë5A=õd¨ùžúk¥k%ðJœçˆsÄÖ ¹Oä>‘˜i|ïÖT:* ¶DG€YfAåêúQþ€Êl‘:ªªT‰¥££ó륀³œ% ä‘gº£#°pÿ ÙÁ÷^H¥ˆÈ†v†lÛ>¤Âtþt>Dÿ @™÷w?výØEP{KûDû$‰Êƒ„kõáZX\¿¸~qýC)ìˆì¯Ûò†`þƒŸJ~*!è› ?~вPûÔwSߨt›HUÕ#Ê""rƯë¯ë°ð~áÃñÛ-Ï?óü3Ýš}!ûª²¿òÓÊO!è z‚žq£«ÑÕ肉¿ÄÿpaW\=rõdÈÚµ6¼µáô†Ó¨´^Ë9Ë98¹®»½»Ýp@}]}DóbõˆV""2æ‚/ü_ø¡+åÊ÷W¾WÕ¿É|Îýœ›°/è›÷ÍÃ*û*û*;Ü.»]v» FëGëGë¡ÜYî,w&ÍίüÊ!kȲÂÒÐÒÐÒxöyÊ=åP¿öëµ_žq ‚ª.]ºt «GXÌtgºU/»g[f[ÀNÿQÿQØöæ¶Æm×××Sצ®M]ƒŠ¬Š¬Š,8Xt°è`TìªØU±ë–FJÁÈ1rŒœ„ÿð?‡j+n+NºšÑ™ggžÈü&óÕ+ª}ÅG+>2î@`40 ÿÐ&k&k˜ùàzÓõ&˜ooo…­Ã[‡·CñºâuÅë w w w697979Á²†¬!¸â¼â¼â|x¤c÷Æî݃ššÂXhñ½á{#Ifr¼oøovjvªq'E}¦WéU–;"iŸ§}.rë÷·foÍJΡ…C7ݹ±éÆÆEf†g†g†Eölß³}Ïv‘îÎîÎîN‘B{¡½Ð.²ºnuÝê:‘5 kÖ4ˆœrBëbëÅÖ‹­"ŽõŽ"G‘HÖ›Ùïg¿/bœ‘ù·¾Qß("6ãKãKËáÝøì¹Øsqù†TÿÍúvïÛ½„7¯ÜlÛlƒÎ…΅Π‡z<>x|ð84Gš#͈GŠ#ÅP>]>]> KKKÐlo¶7Û¡ ¿·¿w9=l|ãCëù¹çgS6Æ\q¹8ãcÕǪ«†¥×êµ€†ŽžÐ-#h hcÚ˜6†Ûpnà§8ªRUªÊ¤Þç>÷“ì›Ì1‡bN›Ò¦–Q¨cMÇšÌÂÎx„ɸŽa›´MR9ûÖ¶€ÞÓ1½%Òé'h¬5œ†è{°cªOõ©>0ÚŒ6£ ¸Ë]î‚îÓ}ºã[¾ã¦2B kCÚÁxzKSþ)?€mÎ6H5uõaåg¯u¯5®ÕDGé_é_UFÑ$%×ЀaÂtF¡€E¼x“”ÿ¾±ÏØG”°>¤%+ÿÞô½éÿWùão%ÎÎIo%uOÖ=¹ ph¡… ÐZ@Y™0¨a5 € $lóÜŒ7óM<ù­ŒóÇêy”ììÑüÁþ;±>ç´`ìåIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-30.5.png 644 233 144 3267 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜlIDATHÇÍ–ýOTWÇŸ;`™éP VP2im³[ÈŠÕjkªbc·® ®ÑqcÄ·³ÕÔÆmÌ–ÔlùeÛêÙU\Ǹ©‹©my­ ®² ®µnºÒJu ÒFh©Òa$0sï=Ÿýaæ:dÝ?ÀóËÉóö}¾÷œ{¾çˆˆHjl°eÛ²m“£¶mSÜo_f_6óoQû ÚJmåW¿ƒ”)ÒŽ¦5{â¶·ò'Ö‹Äñ'ö³ü’*qGÒɤ“Ú☽ÊÜen{FÔ~¿õŽú{:lnÜÜðٱώ± ¾ïü¾ °8°â¶·ò­z o"¾ìùŸþ"0éóIŸk}ôHÒ#"àzÙõòS¿‰&Üx Š—/¸•p+AÙÀ¸ $“¬!BXãÎÛŠÇò­z Ï·úYý£|Ò¥/áÏžaϰÃ-èùˆý;kwÖ‚ú@¤žÃä É`h†ÒÇô1ÆÕÌýæ~ Q5©&õ¥úÀ(7Ê' ô¨‡8D²ºÅS‘é;ÓŽX?JΗœwø cJÆ”øžÆæ–’µª`U¨"çoùÔóFØQͪFÕ TªzB=q¥P *A%[ØÂ–¸Ÿ!B(tj¨!Ì`†Œœ‡×Þ|íMk?X:a+ED~¾Ÿ³ŽãŽã¡D¸‘}#"¿àÕÛ/ýàûÁǨþKýmýíx¿ñññr ¹†\ ÜÊ­Ü<0TD¨¸[t·ún5 žØ7°ÑÛ[Fžy’W”ë¯_àÑ©N %ªú(QšˆÈÁsPiT0ü?ñ“YðÒür_È…´Ÿ¥-I[‚ZõÛU;Ví½T/ÕKaóŽÍ;6ï{À°`]ûºöuí zƒÞ \½®W伓S›S‹Ê›—ólγðue¿¿ßoÀöÆí`”DùØÌ¥""s›DŠG‹GEšª›û›ûµÙúU½Z¯–°ÿŸþZ­h=+{Ê{ÊEv;v;v;DºËºËºËDn6Ül¸Ù rñÒÅK/‰´TµTµTÉýØØØ#b;e;k;+âÍòÞóÞí“?~ºèÓEÎýÓôg¦?£Í–_ÏóÍó‰$ü%ÊÇ–øÉäÆÉ³æÉ¯Ü5î‘õfq^qžækÛw¦åL‹$y¾öôzzET±*VÅ"N§ÓétФH9r@$³"³"³B$;7;7;WĿĿĿ$N̿ɿɿI$15151U¤­¬m}Ûz‘åÿXÑ·¢O’n¦ögõgi>ùhYpYPwòµäk³æÙø«6¬ “+õ=V$ò•q½òz¥ uvgvgŠ4]iênê™¶kÚ®i»DN{O{O{Eì%ö{Iœ@Dè]ÄYê,u–ÆýÙÛ²·eoñú }…"禜{üÜã"Ók²Z³ZEþÐhÈÈ”Ú)µ"æwZ¾–O®M5Œ ÚU‘I-“ZD.ÿâòÀåI_;¼ö‹µ_ˆt¶t6w6‹Üj½Õz«UÄSã©ñÔˆôæ÷æ÷æ‹TM­šZ5UdhphphPdvÁì‚Ù"u ëÖ-é*ê*ê*ÙØº±uc«ÈѼ£î£n‘Áü?:Eò2óNå’t‘‘§Gž±e¨.Õ¥]Þù÷NN×}\÷ñý³TñžýÝ“ïžd|NdNpNެ9²æÈšøO}ÂuÂu ºt-è‚¶¾¶¾¶>Î Î ÎO•§ÊSƒ¡ÁÐ`ö®Þ»zïj˜ûÝÜoæ~Ç]Ç:Žu0nõcuÝ+u¯g¢|brqðl­ØZœ0 PÆÆñSO˜1Æ@]QWÔ ™fš'¿Ãæ0àÆÍDÙ¸À.&aÂðÚõˆ–Çú±õí£Q>µ˜Žá¸æ¸Jä¾>»¢:f¼n 72jN3W˜+€ËtÒ æ,s–9 ŒB£Ð(³Ýl7Û>|`f˜fð"Ïñ7A0¶‡ëÃõŒšÏGñéöçøs77B‰ÜŽéØÊO©½Ô¨˜2íF;€¹ÁÜ@äþC„fÜÚXÄÄ‚ÜᎅƒBÅêÇŒ3Æ™‰Ê_šTšô•?vWRR^R>á®ä­oůŽz šj’Aé!ÃkxÕ¡:ÐÐ n[q+ߪ·ð,üûwe¬”ÏÃüºxhßcç ö¿ v—@¼ 0„IEND®B`‚routino-3.4.3/web/www/routino/icons/ball-0.png 644 233 144 213 14774263775 14362 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷Ü@IDAT(Ïcüÿÿÿÿÿÿp\2ŒŒè",Äi$d##q &Ò\‚Û…ÔvÕ ÂŒÒ-úÑ]F|:\žª6»dIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-1.8.png 644 233 144 2533 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[hTW†×Ìä68$‘xQÒQQBˆ(†(´T ^r JlÀªñÁ…Æh¡}PÁZ¡ V%V/àˆ# ÁIc@J,bmˆ,;L†1š™9gï¯sΜ©iè«ûeæ_{¯ÿÿÙkïu¶€ˆˆä[¿î"w‘;7‰Ý{œxÎÆœþëI|ÞW«î·o ¯=¯`úåé—Õ€ƒíy{}z¾ˆÃŸ®gÇ%_œ@v ;઴ðqØVº­4gfÛÞNoç¸{ïì½pûÊí+ì‡P_¨`¬r¬lÏÛëí|›/_Ž /™÷2ï¹þ„ì¬ì,X¸aá†O¾L.xù To®Þ 0äòh7˜#€Ÿ®¢D±G8 ÛóÖz;ßæ³ùm=[?éG`ÆÚkE v{ívïOÉ„«Ð2¿e>`$:‹\ÄǧÆrc9pÍSˆ~®Ÿ1×qHá°&¦I¼L¼.q„#ø’F-…-…¶Á«Ž~Òü»¶gÖ£ë³ê³ì H<ó©ùt«1h ’ÐA:mFÁó˜Ç<ÐE:O祢Z=F JŒ×Æë4þX½Ô‹mðÌú´RŠˆ,ý¼!o(š/ÌfŠpÕµ„wv`<2><> ‰W‰W‰Wi†NqŠSŒ÷Ä{â=0\=¼qx#¥Ævc;€Þ«÷òŽ^‹?¥gë'ýXÆÎÿ ûŽî; ü –ƒñÖx ú3½Cï@}7vrì$¬9»æìš³p¿ù~óýf&±Þ±Þ±^ØÝÝ…9þ9þ9~¨]Z[\[ ï÷¼o{߆í×~`±­gé[~,cO¾‚‘`!€þ$6þ÷øÐøT´V´V´:…Pó æAÍdc]Å]Å]Ű(¸(¸(Ïv>Ûùl'øÏùÏùÏAwY÷âîÅ©å1åµõ,}Ë@îÃ܇:¡•¡•À[+e@_Ò—@7ëýz?˜s͹æ\X•»*wU.Kƒ¥ÁRÇU£jÂp €’ª’ª’*È;–w,ﬨ[Q·¢F|#ÓF¦9yúšýÏÒ·ü¸E<ÕžjJD2»2»DÄ'""£ò\⑤]ÚE4Æ„Å<õ­ü>¦­>£Tƒjpú˜ú\mSÛ€,²Èr (ò(ÐH#`>6›Ál5˜@-P›Ô&à¦ÊVÙ)¾M/&^LLÙÇÒ:?õ9õ9i³×ìP»ÕnÖ­Õ¼³è ˆ!h C‚X»¬AíR»H8|6¿­7©óÿÏ·2IÐ œà>§ÄfƒÙ@ tîÀ… lÏ§Ž„•oóÙüS~+?Ú×ÅGûû8_°ÿÒ@ (œ sIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-6.9.png 644 233 144 2635 14774263776 14776 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜRIDATHÇÍ–_hTGÆÏnÌ¿5Ä4ZD-XKH¢Q,âßD¥Â&B,)‹ Š®ˆ–ZWëƒP¡‹H ŠmLQ ªø'j(b’Zû`)ˆÚ@ 6ibŒ—Ь»÷Þ¹¿>ì½[«}v^.ß™s¾ïfç+àååÍObï67ž³.gÝ;g“ø¸žž÷¿„)ÍSšÞ:õÖ)Õëb=¯óÓëE\þt=—qÙíÙížU>•~Tšóv7õ@î…Ü ›°ýâö‹ç8ÿ»`èöÐm€±Uc«ÀÅz^çëzÍ—Î/_ÒÌŽÌÏdgeg‰Àœê9Õó>I&ôÏÿÿ€Ç3l/XO<òìUÀ8ãè1š†õ¼“¯ë5Ÿæ×zZ?éG`ÚÊi+E ¶¾¶>·%YÐ{³±¨±Hëhc/{ɳ5ú~àk³ßì'öûðÂŽÛqHáfsÄ!nßuòLÖ§ø,Íïè¥ô“~äß{{¤ ³.£.#eèÂÖBk!¨Kæfs3†3aÛA»Ö®²È" wäCØ…ö${R*jÛæEó"~+ÓÊLãOÔyë¼Úà‘ª´­Yp r‡r‡Æ'ï›è›þàCPgÕY&Ì"s­¹žîyºëé.0JR£4ÍP˜0a&%%ÁèO£WF¯€zhgÚ™ê7õü©ùû¬> RúŽÇØñŸaÇ€Sj!eæ\s®»âàÃàýà}È å…òB°<¼<¼< ÏN>;ùì¤k(Úm¶ÂzY/ë|7|7|7 þóú†úà!1bØ`-¶_8zZßñãûý3h‹¶EÁJúØêèÄ;›:v„âëÅ׋¯Ã½;÷îÜ»¡Ã¡Ã¡ÃÐmt݆k¬¹¡¹¡¹–––ÜxùóòçåÏáÜWçöÛ— Ç­ËZ/©¯ýxEò»ò»½/²rÍÊ5"²FDÄÓâìtöhåèÚѵ"#]#]#]"þ&“¿Id(6Љ”––Jj…‹ÂEa‘'O žˆ´5¶5¶5Š Æcƒ1‘ÈÇ‘-‘-©ôl9¢õ}ÇW$ßá§D$óRæ%1DDä™®Œ}û>ö½È¢Ù‹f/š-2Ð>Ð>Ð.éŽtGºEZ'·Nn쫾[}·ú®H°"X¬éhèhèhñx¼"¾€o³o³›/>­çè;~¼"겺ìùCĬ1kD<߈ˆÈ4]·äÝ%ó—ÌÎÎÎi‰¶D[¢"ÃjX +‘‚k× ®‰´‡ÚCí!‘›'nž¸yB¤swçîÎÝ"«kV׬®™™™©|¯rAå×—7¦õ’ú)?/Ÿ1“{njš…Äõa8::‚¥æRs© gbgbgb0V6V6V5%5%5%ñE|«=V{¬*ª*ª*ªàꦫ›®nrÏœÝb®0WgèÕgì¿eLÿ%Ö k0—J*±ù–£Mk½ôÒ ìg?ûÓâ=ôÐ 2˜\¤3NqœãÀB6°¬éÖtàÅÿþ•i}Lõ}`§úصƒ •¯>P€µÍ ZAP~åW~ @€¨™j¦š ìd';ÁJX +Ö{ÖÏyŸs¾Ï „";ù¶2meš=!§í4õof¼™÷Ï„|TËË–ÿ6AVkV+@N[N›¼eʆÝðOÂÄOÍgèE¶0‹Ý‹Ý–Ò¤Ü Û^ÛöZÆ‹ ù‹~°ylž¹8¼ßý~7@g{g;»aìDZB¥¡R0eÃnøñ^*¾hþ¿üB€µ×Úk¹‹_Xü‚[ž[þò_—aó¦Í›¤?HWi O™dªR BcM¥È†=éoÄx¾‘ÏÈŸ¨GÀ² Ë6Á?Þ¿¶JÜ:Ë¡ºãuÇAù4ÝtÒI&=ñÃñànÆ×Æ×2¯"²Gö€òK¿ôSEª@ߣïažh|2> ÀqŽ“IqïÛº¡º!£À[gé¨L«L³2ê¿íí—eü~«c«ÔŸ´!`”QP¿Óoë·Ñ(ãU^E-ü£y¢D1—B"ÐÐL­jˆûã~45¢ßÑïjmˆ¹­r«4 ü²,¥•Bñ‡CüËvÎv.²++Aû;o=ŠŽ¿;þ.Oôai‘ÐJµ­&÷NîÜ S­S­S­zzzÑÑÑ)…âs>7Źp¤"RÁm$[Àܰ]°]ˆ,2êÊ"„GàCýCÂû”Ž7Š_Ï=ìoÙkíµ(秺Öu­ëZ9÷rîå܃Uƒ«W ‚õ´õ´õ4ñññ˜…hsÚœ6¡¯BŸ†>…’¯J:J:Pþz¾æ|á%ò—w^6þÜÑ/BˆuðýÌ÷3Оvþ—ó¿(g‰½°»°›ù;Ôj‡µ+jWÔÂÅØÅØÅ˜™Ø×çëóõAn^n^nÜ÷Ý÷Ý÷™öÙݳ»gwCQCQCQƒyp.mþ.ü]˜ùd§züìÔÙ)£°u‚i{·½[¹Ù2Ú2ÚbFNͼ7ó¬¯[ÿÑú`iïÒÞ¥½0Q1Q1Qaúí¨ßQ¿£\û]û]ûM}¬*V«9+gå,è…z¡^K 2 2¡ëÅÎ@gÀô×g¼òà»ÏîSn¡e}õµ†ÈÕÈUøOÜÿÿ¦†6 6A¸,\.ƒÕ«+VW€7nànúÝô»éû8÷qîc·„[Â)S}ªOõzªžª§¦¾¸±¸±¸º¶y6x6˜4£Ç&~ø gIÎ9œ¦ºô½Æ2,„µÇÚ#Äõ×G¯ŠeÛÃÛÚþ“ƒÿüyðg!‚ýÁþ`¿Ëk–×,¯âLó™æ3ÍB¬q­q­q ‘ݘݘÝ(Ä4ÓL#„«ÇÕãêbæÚ̵™kbaÅzcÞ˜Wý~ü‡ø êeâfxyy™úG @åÆÊ•a¼`¼`¼À´×—Ô;êpuÓPp(hž1=7qn"õŒaÜÊ]Î]NàBâ– ô=úžvºÍMn9ÈÁ:¸Â®cŒ1ö>S)l—`¼ù+ñH|abHìÚ·k_Ê­ÄŸä1l~›?²ˆc#Å#Å 7$xFo‰yc^žÈ,Y.Ë(ÓLƒrTµªVÕ)éOp‚ …RùŒÏL³ü³vI»Ä6xldíÈZ`ΰRxìæçŒw2{mˆ¨~Y¿ kdÍ—+f äYæ—èèÀ4SLAr (NéDc.‰§%ñ|Ï2rVRYUY•2+ùø¥_Z IÐB ™f ôj½šyPýª 0eþвd¼gàùŒü ³ò¹}]<·ï±çóû?ºÃa·œ\ž­IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.3.png 644 233 144 2653 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü`IDATHÇÍ–_hTgÆŸ3&:#³ÆDmHšRÈB¤Œ”ª%©T-¬´$ýƒ)²µˆnª´Ð6Û‚AÅ®¹èÂ’àZ6i«™¤±‹‚[–ˆ0Y“v„Z+iÖ™8nÌÌùóýz1sf&m½÷»™yß÷yŸçá{ÏùÎ'$-Ïÿ  ,ËÅ¿óÁçƒÏÿùß¹ø#¬­¯¾ÝÝ•½•½Þµbì×}|i¿Tä/ÕóóZ®bbIÿ’~ks>þ^~òå'ƒ«rññ‹::ûÞxcà³ÓŸf/Ì|9ó%@rsr3c¿îãý~Ÿ¯”_þF_‚òÏË?·¾ƒ%‹—,–àñ­o­ßŸÄë¡e{Ëv€ý°ÈÀMaÂf3&¿~.‰ýzï÷û|>¿¯çëçüV>»òY ^xõ…WC=¹†kã|ôࣾž}–ã¼Íۄ͸}þô:i'MÌUs˜7Y“0“fèrn87Șq;nÇ^Þá¾^¯ Ÿó£…³íÚÂ|m… °/Qá|å|f›sϹ‡/óˆ š °‰Ml¢¸‚ ‚Ùfž6O²Æ<âŒ9cØlqlÇ.á϶[í–o°kKÉ(%iõß!4šI—Á7î7.0 À_À|`>`Î>bÚƒx.ñLâp:N§³ÄÐQŽr´ÚGì#ö‘øˆ0í¦9þëóçõ ú9?ycEáÍ÷ß|Ìw^ÐG¤FRÓ©iLóºæ5Ík ²»²»²ÚNµj;™îLw¦»h(U–*K•AóºæuÍëà·‡ì¹ìxvÞ»Þ»Às¾^Nß÷“7vå-è›í›w7€Ù•×Éü«ì´}Ú†+6®Ø¸’sɹäÔV×V×VÃèÚѵ£k‹Æz÷öîíÝû`|t$:*À3ÞN_/§ïû,]6júa¦q¦¸›oi1«Ìª¢`º'Ý“î¦ýMû›öCÕlÕlÕ,$6$6$6”Œ´/·Óé é é д¯i_Ó>¨šªšªš‚Ä'‰þDnzüyý¼Ÿ€´¨eQ k¤òHyDâ?’¤_±VBšl˜l˜l&æ&æ&æ¤H<Ä¥šÝ5»kvKÃÕÃÕÃÕ*¬X8Ž…¥‰é‰é‰i)r=r=r]ªé¨é¨éÎgÏÛçí"Þ|Ÿ×Ëëû~’7è Zÿ“œV§U2W%I+ýÆË»Üq¹CÚ‘Ú‘Ú‘’¢õÑúh½t·ën×Ý.IYe••êêꤑC#‡FI;Oì<±ó„]]]*%÷$÷$÷H—*Æ*ÆŠÆÔæëåô ~~ûŒÑ—Ÿù°ûŠû £‡‡‡a}p}p}ÎÄÏÄÏÄáNâNâNZo¶Þl½ ·ÍmsÛÀ±ÁcƒÇ¡ñVã­Æ[ГêIõ¤JFþ±»ÕÝJ†‘>c ßÊÜòÀI;ià<L`0Ì3_B<ÅSÀINr²$?ÄC€Á`àcÄ€“|ʧp-×Ü?~+­Â¹¡ÐLhfü-Ù±å±år´ø‰Ð!m×?¼ûÞ}}â}¯s:§¥ éš®IÖ€õ…õ…XXX-™˜‰™˜pNÀ‘¼Þ¤~Ô’õOëŠuE ôêk}­ûÚø)ð“^’ûmöÛ¬†UÖlHÞ+—ækçkŸ:ñû“Ÿö`{°ädƽä^Œ÷º÷:v~× `c˜e–YÀàá†,Y(â½]Þ.lpÇܱR~_ïw'ÿ¾•¬;XW 8 tÒI¸0bÜ×Ü×È€¹h.`aA1öë>Þï÷ù|þ~+ÚÛÅC{{8o°¿/ ì*sÌ,IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-21.9.png 644 233 144 3136 14774263776 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–LÔ÷ÇŸ;8ŽCÉRÒØ¥:Ú›Kº…´þ \ì®@¸)“0[3%«h0dº&›1TW™™6˜)Á’ŨAôb±4ؤ46« w•’²É ÇÆýø~?¯ýq÷娨ûÓçŸËûyžÏûyŸOîy>""²:ú+`Î4gšWE°ù1b~bþZ"¸NS‘©èooAÊ»)ï¤6¦6êƒ1lÄü¥çEbüKë~Y-1‡õ’õ’ik‡]Ù»²¿Á§{ÁvÙvy. û¯ì¿ÐÖÔÖÄAxôÉ£O¦·No…6âF¾qÞà[Ê/Çÿ«¾X:,¦¯Áš`M§óžÎ{æP$Áû ¼úÊ«¯ŒÅÅ)3h@2Éj+àÇa“K°æç >ƒß¨gÔèH9ýeþT0S0c{/r`𪚪š@Ý]æ·\àÉžOhojo WGhV-ª@}©¾Z‰VBÂÓáià 4¬>ò]©êªê2~À_ ã ãlïzä?ï¶vŠs‹sA=ê44P¿Ó_Ó_#¤F•[¹Qꚺ©n‚º§>WŸÃ’žM0±§ª)5…Rk4¿æ'dtTDùw*>d¬Ý±ä*ED~x–¶‹¶‹þxð>ë}B?`çÄsã§ÆO1:j µ²Ìæ|s¾9„FB#¡‘%Zj©ÁàÃPb(&o|»öÛµÌëÃ~ðÔxj€‡¶>[Ÿ?ÞÐ#êÇ""uwàwÞxfÿ ¿ð“vÇûŽ÷!eoʱ”c¨Ü?ä¾û6LfLfLf€¿Ùßìo†WŽ+ÇË…ÏÌÌ€CòƒùAHº™4˜4ˆ*ùë°ë0à‰Ôƒòžò`UDYÿ»ˆÈ®Šœ(8!Ò~òCç‡N“ݻߛæM“ ¯ÉWã«ß"$Òp¾á|Ãy‘=C{†ö ‰ô·ö·ö·ŠXÆ,c–1Yf;f_³Od¶Ô¿Ï¿Od~Ç|Ö|–˜†?È|)Á¿Üê9ÐsÀd)ì-ìÑþÕCæÊ‡+ªK0Q6QÿÜ>íœv˜÷›‹ß\„žc=G{ŽÂúëW¬_·‹oß.ŽuÄ^m¯¶WC{v{v{öò޵··Ãºƒë®;-U-•-•òU­«Záü//T]¨d2 ¬'¹“ÜêR¼ü1n$n„ç¥Øä1yL²öVêÝÔ»òø×I'çNÎIúÍ·ÜçÜçD;;;E6mÙ´eÓ–XG¬AkБ,É’¬˜Ÿ.ºèqô:z½"÷ì÷ì÷ì"yyy"æ¯ÍæÛÏmwlw䱈%Û’-é&[Üî¸Ý|}8vU•g*ÏTžœœX°/Øìà¬pV8+`Ê1å˜rÀÙ³…g Á¾Ãþ’ý%è,¾:už@„EíSm--ÀHDOt\ÔÝrG¹Ã(§¿Z—ÖÀ 3(þ_Ó‰NܨõÑG0ÊW|µèU4†½a/½ø¯¬+¯f#z„¶èÃæ±yüñêcÝcíddÎh‚sÁ9æµSÚGÚG n©NÕ¹DG‘^¤ $ 3Ì0袋.À!p´ ¾AßZVðhð(ózåâ{Ñó"¶ Û†ýñ,DçØ²Ét™\&àqt2Ïh7´À”îÔ„F¿8ºø.ºÄ /ö |L2Í…Ò_×_'D@sknã³B}಺¬ÿsòGw%…%…%Kv%Gž:òÔ"Áe †’!ìû´R­”¨^Õ € İ7òóŸÁoÔ3ê/îÊ'öuñľǞÌì¿.‡ßæ3»ÙIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-6.3.png 644 233 144 2720 14774263776 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü…IDATHÇÍ–mhTWÆÿwÒ‰‰ÉæÍìJbjµ[ÜÊ’5‘"m¬[µPÅXR( T¶Óˆ®,V¤R#ŠˆëKÈî¶Ò„bÐi«MÒ"„˜¤Ý†€0MÚøE—ºI™Õë0»‰3÷Ü{~ûaî™™*~÷|¹óü_žç¹s^î‘"ÿ)x6ðl  ‰HÇs^Ïyý×g’øc¬7­7Ç@aKa @q{q»7žÆ&oê3ûEÒü™z&.E’ÌêœÕi­öñaØV¹­2ç—I|rrÏåžûŸ‚÷¾|ïK€/>ýâSvÂä7“ߨ«íÕÆ&oêM¿áËä—Ãè‹@ð«àWÖm˜•=+[ž[ûÜÚçÿ˜,˜x6®ß¸àǬ³tÜO¾^ ĈaÆ2°Éûõ¦ßð~£gô“~J_-}U6½µé­Ü¶dÃxjï¼½óŒžs޳|ȇäë:Îðg5¡&ˆƒþ^<Ôq‡>¥î¨;Äõˆ_ßžìOñ¥ø}½”~Òü|nO­AÕeÕe¥ }Í~·Ê­¯K½£ÞÁñZ×ëMzM6Ù¤‡õ:ý’~)ÕúWjH á°F9ÊÉàOÔYu–1xjMÆTŠˆ¼øWÈÌŒ=Cüúôõiàß¼Þï ÓjžZ§ÖAdOdgd'8•N¥S™aè8†Î1ç˜s "¯E^޼ ê¨êR]ºN×1Ͱá¿î^w!¥ïûñ}<ï7¾ß´xUüN-T Óo\£~¬~ òCù¡üÔì¯Ù_³î¹wäÞ‘´!»Ùn¶›aÕ²UËV-ƒâ–â–âØò·-'·œ„ÄùÄHb ÞGÞGÀk¾žÑ÷ýøÆ®|g£g£à&}l÷uâO^<|ñ0T\¨¸PqFGFGFG t"t"t,Xœ6ÖÞÛÞÛÞ +笜³rØÓö´= åsËç–Ï…Á¾ÁžÁžTyÜ«7zI}ãG  ¿ _wÂdõd5¸¿çg£c¸ãÛŽo!¸/¸/¸l]°uÁVØphá ‡ –Ë‹åë°§ûb—b—b— fWÍ®š]PrµäjÉUˆ|éŒt¦ët›ù•Ô7~"Y³6ò[‘`W°KD¹ç/A™iùdæ‘¥ó—Î_:_ävçíÎÛ"÷/ß¿|ÿ²HkCkCkƒˆµÄZb- ï ï ï½6zmôšH×Í®›]7EÊ–,;(Ò›èuzI ý/£çëû~"^·×mý ¢jU­ˆÕ$""¥¦qùo–/Z¾Hdª`ª`ª@¤-Úm‹ŠLySÞ”'R´¹hsÑf‘óýçûÏ÷‹ô ÷ ÷ ‹Ô7Õ7Õ7‰ Μ=8[ÄÞaï°wˆ~]8T8”6&[Œ^R?åçÑ5Æäœë?©UBÜüѧC§C§C°B­P+tÌtÌtÌ€]j—Ú¥P{«öVí-ˆX+bÁñîãÝÇ»¡únõÝê»Ðö íAÛƒÌ5â®u×§ï‰kì‘]9cv‰[æ– y…WÐüfš3ˆÇgh¤‘ÆŒx=ôΈ_%Lø Ÿó9\˵ðwÛã»ÒJ’;™;9òèpi¸ôJ¬EÁEAY/–nÐ ò™.”1“Ùlã^±"VÔŠŠòy<‘äâ ¨€ (o··ÛÛ-"¶LÉ”ˆÕj]±®ˆÚå;ùNfd]à§ÀO²U܉ ù‡Ü‡ûìøo)@ b^s˜&‡‰£å('yG8´¡ m^Ãkx«ŸU?«~–ä‰wÅ»âÝŸÊÉ ÛWàWàWàw¶¹(³(³(“ôH!RˆBRÆ8Ø·2—7ŒG<âé!VÈ Y!ûÖ9âqŽL-4š ͇:=ÎgOí[´-Úó?ºÝºÝºÝ¨ŽIŽIŽI&yqª8Uœ ˆõõõ”¾ò¹2_Y¯äÏ/ë)ú Â'Ê;ø8ŸÄ'ñI,d‘,’²[B„óûG*F*F*‚}§ÔN©RëޘܖܖÜF]QMQMQM$U§ÎSçÁ†7ñ&Þ„6Ø`ð ^Á+¦a¦Áæ˜î˜î˜ŽÔ¦º¦º¦:î:~.ü\8ÛxñýÅ÷¿ø¾6D¢ ù³§;ËåÎJÚÍÜÈéôqÊÞbo±·Ø%>ÊGùèôG/ÁKð:op9‡œCÁWÞ {*ì))>Û‘íÈv¯íQg©³ÔYØZ¶–­…ֽннp?ã~Æý àv»ƒy\«^©^©^ IYŸm϶gۅוüŠž¢¯ð(|TÓ iÐ4*•¿Êÿïm_Ù¾²}ü”>MŸ¦O“R™ÆLc¦ø½·Æ[ã­Á°ëì:»`faDšL“i2 \®Wá‚pA¸ÝB·Ð Œ À÷óý|?Dv“Ýd7%Ÿ’_ÑSô…JVÉ*YSbUÎ*gUæMI›’6%Ò§N;,*æ<‚G`}„>Bp'p`‰,‘%—¢.E]Š> ú4èÓ àpöáìÃÙ@{G{G{@RI*IèUz•^x 䘤äWô}…Gá£<œ‡óðmϹ\ ® ±1±1±ÉÞŸyæýÍ 4À'øŸpQ„þåðÜá¹ÃsÉ,)]J—ÒñŸâ×â×â×à20Áb,Æbžð„'À[x oHÉ ÀîÝ7º“Ú¤6©,Ã2,^ÝúêÖW·‘îHw¤@ÊPåd9Y }èH;i'íà2¨0Ò8Ò8ÒˆŸi*M¥©üK²-`[À¶gïèÔÑ©£SÅ<ûùÛÏß&y1Ã1Ã1ð±6ÂF ¥:ª£:€7ðÞ8G u ëÖ_ø}á÷…èHt$:€E;íX´P;ÕNµ@ JP`6a ð'ù“üI€œ!gÈØn/½½ôöRhË¥r©\Âj$$$WEÒVP.æ‹ùb>É;ë{Ö÷¬¯[?8gpÎàœqÀažËsyîàèœÑ9£s€Sµ§jOÕ «V-¬žž÷ô¼§çØ‚-ØX_¶¾l}p<æxÌñØ ¶c;¶ä9ENÁ!Ÿ¤ö´å´å´…Å ± þ—¸‰›¸÷{ˆþü/ø_ؾ¥·°·°·ð±—ïÇÞ½›qûø²ãËŽ/sça„Â.6“Íd3á @Ô–+–+–+À@á@á@!и¤qIã ~sýæúÍ2‘‰LÀ^l/¶QÍQÍQÍ/+ fÁ,œzPêµéÓ;¦w˜­ëA׃®ô{m—¶KÛuc¥Ëì2»Ì?$oßyûÎÛwÔ£õîQõªzU½ßj¬f«Ùj6&i’4IþDʱ”c)ÇÈå. UUUƒtœì8Ùq ™$“dXƒ5XQ ‘ŽHGo/o/o/@ÿ¨þQý£ã—Æv}ýõõ××cEEyEyE9Nk~Ñü¢ùž˜ \àBÌ D -%cežÐ€ZÔ¢ÖGâI<‰bïXÙv~kµkµk5{ýEö"{‘ÑQ¥Q¥Q¥x–ÇòX -ù‘üH~ A‚@„0VUD €;¸ƒ;~àóÀç&}t÷£»Ý•ÖYû¬}Ö>qÊ®²«ì›’y Oá)ïŸçÛø6¾Mœ.—yºQÜFv“Ýd÷…šHiâFŒ0ÂH?4;ÍN³SZ=x`ðÀàqÀaÀXÀ#y$ø4>Oø >ƒÏXkbMÛÉv²pÈ;9©zmõÚêµîÜ7ÞxCÜ£U‡ªC…‡‡¿(@ùíhG»”¤Ô£:t¢R36`6Sä‰È‘'v-óÌöÌöÌ>R4à?à?à/···ºsA²•l%[á •¤’Tägò3ù ]¤‹t$šD“hpº‚® + ¾l¹l¹láOÔŸ«?WNØ¥óÓùéüºìÎ g…³bóöæ‚æ‚æ€[¸…[0YÖù\µÉíQæÅ¼˜&_ë¾Ö}­pnpnpnؼ]ç£óÑùtm3·™ÛÌ®šå5Ëk–ó'HÉ!9P³ƒì ; 4Ð|ˆñ!€HD"FïYîYîYp¤vvíìÚÙ˜¬ëÑõèz6—Íes7o§¥´”–vÙi9-§åÂù*¤(Q\-ÿ%QË]ùˆ„]²wseï.“½{ò÷¼ËZY+k…–FЇ”'åIyPï ݺ7ÔÖ3¯g^Ï<á–çlÏÙž³wýyìÒlüž•±2V&î‘OvrbEEEEEEVvòÀ¸‡dïæÊÞÝ#{·êß¼ë2»Ì.iõà¾Á}ƒû ¥”RJ1¤ìÄÙѳ£gG™­«¬«¬«L¸å¹Ås‹ç–æjǯŽ_¿nyÿÖ’[Kn-d@½¼N«Ž× x(š •\’½{òß¼00 Ë?–,ß‹0„! “›|›|›|ñY]C]C]I×¶j[µ­Ó3=Ó¿þ­ø‚ø‚øÂè|Cœ!ÎGûe½§åvôa.¿ än÷à܃¬é™Ù3³g&þétº¯HjƒÚ 6üåÃß’~Kú-É÷Ä`Ë`Ë` ßyíókŸ_ûÜý¸ÕeuY]ÂÕÕÕ‚MÓù>¾ï;\ 5ÔP ·Ñ~ô³iÊ È%=ÌCðñ;Þ-D jPã.à&n⦄vZI+iå7ûRûRûR6SU¦*S•ÑÁ(ã¹ÿ ­ ­ ­\”`i·´[ÚÉ6•MeSù~9¯Y´ýÅÄCÞ•.ÜÈArÄŸÆ^¤‹¡¼†×𚿽¢ Òi‚h‹Ð)t ¿±lÛ±º»ueëÊÖ•À r>¥°ý#Žÿ§²Ön¡OàØNsÔŠB>äC fM[ÓÀ_ãøP½«zð‹Í/©ÅVx¼?yÚH‡ùgóÏ€iÞýþŽÍçë›Y›Y`|o̳)îq{kŒ5Æa-º]‹:éØcK±%ˆæE‹£Å šÌGl&Òoòd~a~ÐÞïÊFº­'!ìòO''m8uH—‡ŒC°zaõËÕ/ÑÅ/þ¨ø#éééb›½söÎÙ;Pþ°üaùC'^×P×P×Þ¿yÛ½íp h`ßÀ>N×?>ýôé§ÄŽ´yïÈ{ÎÞ½yêæ©›§â[×o]¿uÝÉ׺j]µ.•…ÊBeP8S8S8áôpz8 ÎttÀ u­÷Z/1›Oíï¹ÿe[ØÌn‘ìñìñ?½.Ó¥/•¾$"s""®îßó}Aɜꛚ9œ{8÷p®ˆYeV™U"Ò+½Ò+Òy ó@瑚ٚٚY‘ŒÆŒÆŒF‘È`d02(â¯ðWø+Dü¦ßô›"y{òrórEw.½¶ôšdÆ?ÈÕÍKÞ/y_ÄÖãI«J«¢H|¡Œˆ|/""Qù§ŒÊ¨HÚJÚ“´'"®«®«®«"ÙYÙYÙY"Ý‘îHwD$ CA‘¥’¥’¥‘ÐDh"4!Òw¾ï|ßyϸgÜ3.I3rŒ½Æ^Ï_¼íÞöd8*»wL옱õ¸EÔ×êk×C!ñ' ÉqýA¶dË´­EkQd½x½x½X¤b¹b¹bY$¸\.ˆ444‰xz<=ž‘Àr`9°,ò¸èqÑã"‘sõçêÏÕ‹„§Â“áI‘Ò‹¥M¥MIø÷¿-¿åqôØ5ÆÀúÀ:0_sŽ™kæš]ÐÚÐÚÐÚÓǦMÛ^ücýcýcýÐÞÖÞÖÞæÄƒùÁü`>õõõÁg7Â7ÂΦ%;Á·8pà¾Scή$Ðèpv%˜¦ÓÑ5O‰qu¥®Ô•`Þ6o›·A ©!5Œ2Ê(¨Kê’º<àR¾à £Œ¢9h¾b¾’Â÷k %вmW^„DÑóƼ(»©fÕ̦ªWÔÐk:¬Ãl3=¢Gô¨Õ¢Zœ¸ú½Ú£ö€õg+`@ýËL7ÓÙtðçÕ¼”÷GïÛú˜Ýh»Þ€jOµÇéü`MYSÀsõŽz#Ñû5$ßã¶Å[À³äYib¦üñ-U«j1Àš´&Sñm¾mÿ7ÎJš÷5'ûš1 |Â'øœ%¶j­Zb ï껸pãÛùdI$æÛx6þož•/ìíâ…½½˜7ØÿÞÂÒ !|”óIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.png 644 233 144 2407 14774263775 14700 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܼIDATHÇÍ–_HTYǶù,p‰Âˆ’d)²m”j —&”h…È ²u«‡m{Њ WbzX• $ *‹‰,*(Ü™V]vdaÛÊv)ÅÒÐti„ñι¿Ï>Ìܹ·em—}ê¼\~¿s~ßÏïœsçJ)¥–$¿ ÒW¤¯H_œ°Ó¿²ýY;²v\KØÒ*Ó* ¹¹®‹®‹æSÛ¶ú­ñÎx¥l}'Ïò«%Êvdú3ýiÞ¤ÝUë«Ög}š°[AvOvO4ï¼pëò­Ë| ããaoØ ¶mõ[ã­xKÏ©¯ZþÆW Þ_x?m2323”‚•å+ËW“ðçjØU±«àÕ‚W $ô$CŽx¬öÖa[ýÉñV¼¥gé[<‹ŸÈGAÞ¶¼mJÁîêÝÕÙ]‰€§WàXþ±|‹gô§…r@gè  4~>~ž—¥NêXÃàœì•½ ?ÅWÅWã»xC¼€N:É!žÔKé[<‹ŸÈG½¿·me°/k_ F?è~Ý`5bH“\’Kˆü&ƒ2ˆÝ\¸p”H±Ûni–r‘ßõ&½ Le* jé'y)¾r&ôÙ9ÈÏ|ÏõsÒýÌæfù™hB,Ñ¢3Ñ™è Œ ÆÛo¬5ÖkarÝäºÉu`´'ŒŽ ü`æ›ùÌÚúÏâ'òI&Öù#>yø¤m~ÎX|(>dO\¾Í²Âíáöp;xÎzÎzÎÂÃë¯?¼nswww!÷xîñÜãPÚZÚZÚ SL=žzìÐë7¼?‘O2±ÁFèžéžIÅÕ±*Þï#–Z¡éètt¶4miÚÒdÿƒÛ·n‡Û7oß¼} "‘»ð4x< p&x&x&hûµ76µô¥Îæ'òQ°8¸8(~/wü¼“€€§<á È9"G@/ÓËô2(ñ–xK¼p¯ò^å½Jˆ½‰½‰½‘ÐHh$ÓÓÓPX\X\X ¡±ÐXhÌ–7ë"]äà¥ø‰|¸¹™Oàíë·¯e/“2 øñãÇJyŠÈÈÈsÃÙ#{€¨¼”—NžÅOä3ÿЉôK?p+\òÉ'ßîÞàßàßà‡@m 6P }õ}õ}õö···ÃÕ»Wï^½ ϪŸU?«vÈûÌ ³bþKW*âxýE©Po¨WYµZ¯Òä…¼Psj¥Zª–*¥6ªj£Jµ2W™«Ì¥ÔòÑå£ËG•¢‹.º”*ßZ¾µ|«R½î^w¯[©¶Cm‡Ú)5âq¸íxüÚ§}j.ÅKñ“ùÌ[•Ä#qû' f—ÂÿjÎxy_ÞªüÀ9&fYÃ,æû³Ê¬2«€B )™“9™ݬ›u3è!=¤‡@¯OéS ?È„L˜f³¼Kêøû‡“Hžü}ºÀ¬5k1R3~G˜0 10#ùfŠ) ÌÀtrüœYcÖ`Ø7‰¥?ïÉÿïJðá#ÇÞ½_ï'òHFض՟ڲd¼¥÷¯wåGûºøhßcç ö/%h‚6{LIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-175.png 644 233 144 2751 14774263775 14774 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜžIDATHÇÍ–_LTׯ÷ N“hÔšLÕ!5 æ6ÔxeÛ¦ˆí¥µ #ÎC­/Ì%:) XHH.š`mx±`¬b5al´éÃ%±ƒé…bÒK¤ÿô¶q:Lá˜Οý»œ=gnMßÝ/'kïµ¾ïÛ{íµÎ „"ßþ ÈÚµ!kõ²uØ™Ïy#ç—/-Û]&¸Þr½5ö¼øÉ‹Ÿtt[㎭֕f¼~&Ÿšù™Ⱦš}Õå·íx·äÝ’÷²ýAÐÂZxÞ€ú/ë¿è;ßwž >˜öOûÁ±ÕºòWñ /_´ü_x᫾rý²We¯6¾¶ñ5χË_°ÿ"ÇO4X>½IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-29.9.png 644 233 144 3304 14774263776 15055 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜyIDATHÇÍ–ýOTWÇŸ;ƒÂ‡7EIŒØ´MãJ£(Ic*+;°™ªD“mjÖÚt՘Ře»1cìb­ ¾@|)ÄtkÎ!"U×hlãŠe¨tBW¤ò"3œ—{ïg˜¹ÌìËàùåÞïsžçû|ï¹9ßsDD$-ú°dY²,)lùm,žäHr¼ÚÁõ(ï(ïÜû¤K=Þ”Þ¤÷Ű9oæÇ׋ĸãû™qI“X ñ‹Ä/”Â(>—m\–4?‚\µMm{†m·]h=Óz†ßÁð7ÃßLNB ›óf¾YoòÅóËÿê/³.Ϻ¬ü‰³g‹ÀKE/½²3’0ð lx{ÃÛ?Y²ОvìF!àÇ9Fã°9Í7ëM>“ßìgöèÈ(È(á¯eOËžª‘‚¾óœ¨:SuŒn€PSO=vÐMjÃOÃO wõ:½h5ÚŒ6ã[ã[  Uj• <žŽr‚ØDù.VuTu˜ûÎó7§ÕiUM=òŸÿöÓu,)_S¾Œl€P/ðŒg`\ÒêG éô½Ã(3*Ê™•°Và üŠ"ŠbqlÆcã1†1Wók~BæŠê(ÿÆòå;MŸ®‹û•""¿¨ãŠzV=ëO€×^ƒÐ»üúIöãOÂThMèÃЇ±~ÁÓÁÓÁÓ0êuº@÷èÝ'è§8—ÿ0”J‚Ñ+?gþœÉ”ÞáÏ!Ï!à¡Ú«öúL=b䉈Ô÷ÀG5Õ€o@_±þËâsÅç eOJmJ-FA_ÁÝ‚»0xaðÂàXŸ¹>s}&¨Ôê¨Ü[¹·r/}FŸÑäsø>‹#è‚íï¶>[FåÇ»*vžH?ØîÚîR"z,ú¿DD~Ù.Rv°ì È—‡¿*ýªTÉØ60o`ž}G|»}»EI®OnJn)S:§tŽˆR¬+Å"Óû¦÷MïyPý úAµHËdËdˤ̌³¹gsÏæŠø¶ø·ú·ŠL­›Z:µT”»¾Ïú>K‚Ü®\(¹"ΫΫ"ÚɈK‚%ùaòÕy"++"Å×ßTÞT”F÷î±î1IìücgugµÈHÆHÆH†HI~I~I¾ˆw®w®w®ÈùÁóƒçE¼©ÞToªÈDóDóDsLØÂö…í ÛEFÒFÒFÒDZö´TµT‰xµ¡—‡^–ĉ{C)C)J£Haca£ˆ¼kë²u­ÌK¿X­ƒ¼.åŠGñ(’éN¿™~SÆþ`;üìð3ÉpÝv¹‡DŽÛŽÛŽÛDVÕ¬ªYU#¢îW÷«ûE:†;†;†E,×-×-×EìYö,{VL˜ã¤ã¤ã¤È½þ{ý÷úE.].º\$bùÑrÇrGDýÚ£öȘȬe³–I†¢Z7Y7ñºEÿ.|0|P¹/­¶aÛ°È¥ï::$ãÏÏ$IÙ|lsÝæ:‘'ö'ö'v‘ÆÞÆÞÆ^‘®Õ]«»V‹ ‘é Ò¤‹ä\˹–sMä\í¹Úsµ"ݺu?éÜѹ£s‡ÈÚ²µ¥kKEæÏ»9ï¦Hþžü´ü4É™¬˜¬±,ä6·•û¢í¹S—Þ»ô|}ÿÆç7>7¶:6½x+@ äŸ%·JnA΢œE9‹À=æsAC^C^Cä4ä4ä4€«ÐUè*ß´oÚ7 ²7doȆñã+ÆW@³ÎYç„Üu¹«sWÃ×åíSíS¢f³Õhmnjn#z¢vQßÛ‹·›{I_Z‡ÖèŒ3Ž1³Ízé¥ðâÅgM4Ñ,g9Ëãânܸ/?ðCÌöh „€e3»²~{=à‹èZ£>†êQ=þãš'ד ÚáˆÏh÷ƒ“ÁI¦´£Ú-í§ŒÏŒÏ@Ÿ¯Ï×烶X[¬-½F¯Ñk€:è}¶>[Ÿ ì`Û@ êKô% - V«™Ò?ãcoxÞÂj¿ÚïOàyÔÇþÇùƒJ…ŒEù©vE»Œë¥z)!BÑ/&úà9ÏãVÈ@C&e4š †þ¾þ>!Z—Öe&‡z¡"±"ñÿ:ô¬ÄY鬌;+Ù³hÏ¢‚6à‡°CØöh[´-À¸j\@A6çÍ|³Þä3ùÍ~fÿ™³ò…½]¼°÷±óûoö‹”æÛÁ’ØIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-16-grey.png 644 233 144 6037 14774263775 16016 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÔIDATXÃ…—{P×¶Æ¿½g†žêGÄLñ’ zP ÅKMˆ 9z‰JÉAbaYJR„Š711Ò“Ô%ˆzA¸Ff,|Ä€ÄW$˜‘çp  Ä8 óìé}ÿ`¬¤RÙÿtuÏ^ßúõ^ß콚èt:N5&‡yòBã¤÷¥÷¥÷Y£®ZW­«fšâáâáâáÕÌ‹y1¯}ÿäýx?Þ/úMûYûYûYöá‘„! aºÑnoâM¼É>â^á^á^!Ò_¤¿H¹sˆŒ2’_Qä[ä[ä{±£$½$½$ ñA|DR&9„7—šNÆ"±´V(Š…b¡Å1á˜pLÌYR¬/ÖëkûCŽ!ÇPÓ ËbËbËâè·UTTp>zUôªèU¤`©l©l© Xâ½Ä{‰7 Þ‹¿‹óÅxQoJßOÌ/òˆ|R÷ >Çf²™l¦ð:ÙJ¶’­A$A’ IÐåÊ‰š‰š‰š@oŸ&Ÿ&Ÿ&×îUÝ«ºWuSg¤!Òi k¹®€+€ïâ]¼ %,°À ™È0s1û<û<û<¬54š ÍÌy)ìRØ¥0a÷ã5×<^³é3e2H´BîÚêÚêÚš|€e±,–uÿuúÞÞÞ®1+³2ë¼O‰§Äór°cÔ1ê ü!ôÅÐC_äc³mÙ¶l›$wrÅÈ„ÇJ•+Á IB’% d,` ÙB¶`sÙ\6`gØvÊÉÒƒã³íÙöl»$WÔó‰ùE‘*n+n+n2L#Óü÷UKƒ¥ÁÒø¢6M›¦Mã×f¥g¥g¥K¯«½ÕÞjoüM¨ê„:?âGü)§ñ4 }¤ôäy@äsò9ù@’À 3ÌB %”À¬šY5³jð7Q_»N»N»Ž_+æyD>ÊóãüxÊÇÇÇ™ô¿û¤ù¤ù¤±à´£iGÓŽJEŒ ÉB²Œ™´6ÐÀïŠwÅÖ k†5€ (´£í®ã:®d3ÙL6ŽTGª#à½yoÞ y$äa¦¨ŸöUÚWi_Ik}Öû¬÷YÏ‚E‘²0ÆÂö¬w&8œ @b[b[bV©««ÃChZ„Ì$¢!•¨D%p5îjÜÕ8àä['ß:ù¦{ıGÛ¶°-€~ƒ~ƒ~ð>ÀönÛ»mï6àÆá‡ož ›©®RW©«à‘x9ñrâe¬yD>ÊóÁ|ð²l¯ß¼~óú -LX˜°0”»µ}jûˆm‹m‹mBêCêCê¦` ¦ˆ•X‰ÝL7Ó;ėø’„Q‰ŸÄOâÇNŽÅŒÅŒÅ Ïãóø4>4>Ä'ò>yŸ¼/¥HCÒŠIuRTG .z_ô¾èíÒš™™AIUTEUcŒ1Ʀµ Ô€°QØ(lÄFøÚðµákÖºÖºÖ: #¢#¢#hÎnÎnÎ\‹]‹]‹ÀˆÀˆÀØÝaÊsºsºs:!–‰‘ñ?ÄE\ÄUéA5W4W4W>,ôHôHôH¬x¼äñ’ÇK$ÿ9•w*ïTžk—¸}°rVÎʧÁåp9\Àup\ÇS„Û±ÛDS¢)Ñ,úvÑ·‹¾ŽiŽiŽi€;…w ïò7äoÈó÷÷WÿRýKõ/ –ÁÁÁzݣ̣̣ìÇלýÎ~gÿn'yÿç÷~ÿg·p ·üʆeòáŸ~\?®ÌJV$+’,)¥.¥.¥Ž\a/°Ø `Îqç¸s„F¸®…kЉNt¨BªlÂ&lìþv»? ÉdH2é9é9é9XîÆÜ¹ƒ 5=5=5=8§èUô*zmk˜„I˜$zÂŽðÎm”¢‡è!ÉmºŸî§ûîz…^¡w«CÙ¬lV6ÍÚfm³–=kxÛð¶ámw{Õ*³Él2ÛS€6Ø`° °€'<á 0æÁ<.KçÒ§ÇÆ®Ž]» åùÃçŸ?Ìke}²>Y0Ùþ d9YN–wnC)JQ*çnó\K'ûFér€ ®l§‰4‘&î>‹,d!‹þKÏôLÏøs™¹Ì\%ùž|O¾Ç«fÕ¬€rÈðàÁ(D! ·×À–±elÙ”uf646464ºvTŽTŽTJró¸yܼã%¡Ÿ„~úÉg—Q„"‘¯Ð‹^ôòÉb?ªB?úÑÏw`'vb'9q:âtÄéÒȳåÙòìã%#>#>#>Ró)îwŠ›ö.žà žÀ 0p çSGê:¶Ž­#{Ȳ\«±ÕØjdI·¾¹õÍ­o$¥ªÙªÙªÙ6G­£ÖQû·EEE32#3b–[¦Jµ¸¯'OÁSðĬöÁöÁöAÀ±Ó±Ó±óU^*/•×ýÝún}·^RÚøj㫯²$²l'ÛÁ Ç„cÂ10±9a£l”„'<áa}d|d|dÄñ¦¨¦¨¦(ÌR ©†TC€#Ä1ï|8i½›ÛŠݯ™2u‰oîþ$áÜ·îIJÑ„&4¹v‘XKb“þ1ùÉqùßÎgŽ3GÈÝ$l6 4.räþÈýxE躄.(i8 §á°ó|_î‹/B¾q…-Z>´\Ò#’GÉ£JWLþiv_Ê…r¡\zÐ]ÙbÅJJJJJJ0&®(ܦ<äöî.·wº½{æÞuêz'Ÿc®0W˜+ ¤”RJ1*®ÄEëEëE«`(((—ôÈ å…òÂŽóö‡ö‡ö‡…Ÿõ<ßó|Ïó€P+î§" È7ú;`q‚Ò-pÍíÝÿÁ»~#~#~Rs®NW§síB(BŠYoƒ·ÁÿÛ|»ùvómòº²K٥쭠´¹-ÒÒÒÖ•ÁKƒ—/¥&w¾—Äê÷\üÉHHHHHHï¾5Ln3ä­¡C †à¨k¾k¾kþ ž 悹àÿúׯɿ&ÿšì}ÚÜiî4w²OÛ«Ú«Ú«\Ï;ÇãNÉNYœ,N—7U° VñçÁ'ùL0Á$Ì+à^(þ÷<1þÄ»ÅhD#]Eì,;ËÎ&ôÒzZOë¿ ¶¥ÚRm©ÂY¹¬\VN;%Y’,IÖ¥o'»¤Õ Æ^c¯±—\æs„9¬Ò­«wZþŒƒâ/Æï¼ëÞ.\E“G¥ôI'é$ýjkd¬1?S PÐNI¿¤_Òÿ0@Ø'ìöå v½ÖõZ×kÀ$ ‚Ýzb;bý+Žÿi!Å a³Ó,IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.9.png 644 233 144 3220 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜEIDATHÇÍ–ûO”ÙÇ—u—Q4 „b¬Ò®ƒb K‘.×E,×­¤Æl\c#‹t—¶fU¢‘QIW ᦒV\®Y$H”…bLh ÖE ÌÈ :—÷=Ÿþ0ó2ã¶€ç—÷ý>çy¾Ï÷Üžs!„rø®ö]í»Ì…}í±ddD6»ðE|ò}òÿñ;X^½¼`EýŠzu؃µ~Íß;^¿w>Í.‚„Ç kѵø¤¸ñ—°kÓ®M!.\5ú6}ÛK'ìïØßÐÚØÚÈAøþÎ÷wÌ)æð`­_ó×â5>o~ñåò ï|ûη>ÿÝÝ!`Múšôu‡\£ë 烜žú=õ“¾ LÊÀŠ­Íxa­ßí¯Åk|¿–OËïÒ# øýà÷…àë\K®E_ç ¾BMici#È~G\ä" E§Ïϱɿ©UjP/d€|(¯•"¥8ÍN3pj”uóu”ö”öh‡¯p=Ï/ÏO_§éo®íWiÄ$$|À1¼ä%È.õ‚z‡úoõ;õ;¤<.«dÕâL!WÉUr°D=v–ÊI9‰”+«bšͨjsóï*8TpHøUš×R !ÄOÎÓ«oÒ7Yýa4z4…ü|ú½ÉÓ“§Yp¤8>u|êÉçØîØîØÓ©Ó©Ó©à¬tV:+½ä$'=Ð>îpÀLïTèT( ꈋL•¦J`\?¤²úkz|Ù"„‡bû¾©}S§õu”)Ê$þ2óJæÑõ³˜1/„>ƒŒû÷…¿4~iü’™~™~™~B¬Y²>Dˆ"C‘¡È „ýºýºýº¢BTˆ !¬!Ökˆ¹‘ÙsÙsB¬ñ]Û¿¶_è‹/.<,ºÅhôÑ_H£X·÷ÕÞW§XîÖãü‘BÜ/…^C¯ߕՕ%Kb‚#»#»±i#ÎÚ‘µ#kÄ݉»wrÂrÂrÂ`&a&a&ÂCÃCÃCá6·¹í5qÕQÕQÕQ°µxkñÖb=vjcÕÆ*lúºwï~Y==àü³K`µaÜ0.[`ú£éàyª9Ûœ OG'š&šàæoo–ß,‡èÑ'¢OÀÐÆ¡CAöË~ÙÛ†· o†•–•–•˜LœLœôÚcm§ÚNµ‚µ×\{šK›4åÏ–}³ìøã'µ¥µ¥¶0[8Õ¥·–Þ’-‚Ö ¾ >õºF®ûr}Ù|Ù<F£Ñ÷Âî…Ý ƒ1¿1¿1?|6ølðX’,I–$ØP¸¡pC!4Ì7Ì7Ì{„ÍÛçíóv8Vw¬îXìžØ=±{V µµCýÝ«›¯nfÔt5”%†`C°úH(x7ùÝdÙ «VCçß{L=&ÏY=ó«3{Ïì…i7Òn¤ÁQÝQÝQD§D§D§@û\û\ûDLDLDL@c~c~c>\¼6xm:“;“;“!AŸ OÐC­±6¶6¢:#Ë#ËalÛDúD:ÀlÍl È> |"[„òmu}Üõ1t?º{õîUY’ñ‹T[ª [æÍ̎̈}û öôï;ÞwÎÕœ«9WÆ-Æ-Æ-pyôòèåQ0û›ýÍþ——³ºYݬÎçÏ;Ÿñiñ‰ñ‰Ð]йй íaY"[›ë›ëj{Ìu— Âvh  ÆÒ£ô`Á‚ä‡M"ß°>æ1³œå¬—}€€'Œ1æ]ïuŽ›´|.¸̹ôZÝu ½Io²úË¿˜âMñ œrÕå¡Ýl7³ 4)#ÊÈ]2Wæ‚Ò®´+í ”)eJ¨FÕ¨=ìa¨áj¸|B % ØÕ5”ŸÚ?·΂zd±Žm6mœúýˆÕŸ×.=ÿ[ùí;}vúÿqWf‹Ò«ô³j¶š‡{ĸÿ_±ÀÂ3© /˜aÆí ©îS÷áÀ¦ÜRn-–é!ة۩û¿•ß}W’W”WäuWòYÄg‹m@%•‚Óê´(ÅJ16r|Àƒµ~Í_‹×ø4~-Ÿ–ñ®|k_oí{ìí|ÁþSI•kétùIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-24.3.png 644 233 144 3157 14774263776 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü$IDATHÇÍ–íO”WÆÏP)ŒafÃîbÚ`ˆŠ©!šC‚¯Eˆ …îØjb¤•lc·º¦ ý°/VcZI–’–µbG(ì†:,Ñq0ºeŠË§UA¡›¡¸v\_2è0 "ÏÌ<Ïù퇙Ǚ®ûx¾Lîsß纮9Ï}®s!„Ȉý HZ’´$é'Ñ8é×ñùÔÒÔÒ¥]Ñøs oÞ¼ù;Hÿ4ýSóióim<ëy½>q½qüD>}^dˆøDJOJaS,þÞ~íí×R³¢qã {½O"ð^ß{}v›ÝÆ>¸õþUÿ&ÿ&ˆÇz^¯××ëx‰øâ£ÿá’û“û ÿ†”—S^^)y¥$÷·Ñ‚‰\x£ür€»/Ý}I&€êÒH“›€ Aô1•ëùX½¾^ÇÓñu>?ªG@æÆÌBðYåtå´±=º`¼“?×Újm ÿîå|Á¤AÄñ¨µj- Ç¥EZ€d™,“ä˜æÕêNˆø#~ ‘“œ$M~Ãë¨í©íÑŽwòe¥R©Ûu=âÇß¶éu–Y‹­Å óÂC€†òZµVMXÞ–r©o‘¬–»ånâcöG;éò‘|„”[µ<-00Ë,È´¾ÅZc­Ñ6½žð)…bùŸpÏÏÀDÞD„ß`›/ÿÁ'>a.|0ÜîH tâÄ Êå€ry¼@^BþÇ8Çaø6?°=°19ÅOÐþa´íÁº! …âs7|püƒã0ó@+°ü­¬£¬Ò?LoJoB÷wwÂÃÀÃÀÃ@œðÐÌ¡™C3P2S2S2Ãscºmºmº 6¬Þ°rÃJ0·˜íf;ÒÚVÙXÙ¡Ï¢|ð~àýÈsQ="ò !„øg-¸L.Ø~ï°8,²fYæÒóKÏ£èkÖ6¬m€Sù§òOåÃõÉë“×'ãP^U^U^õ¼0Û¨mÔ6 E‹Š-ÿœÊ??7/>·øŠ{ñÍ{7ïÉpH‡µ1ªG°Ä4iš”=àÛíÛ ·ø+üpwÂ{Æ{\'\M®&X1ºbtÅ(8ö8ö8ö€5ËšeÍ‚w<Þñ,[-[-[ã‚—âR\ñ88Àúýë÷­ß?ýÎÜnn_kàtà4ÀTÑTÈc¦S‰ìØ3.e\ÒÆøÕTáTaüØ4ÖÏÖϪáUë†aüðøáñÃÐz§õNë0x ^ƒ Ý…îB7¤Î§Î§ÎCŸè}".è†ý†ý††Z†Z†Z`ºlºlº V¾•¿1#Ø~ÙÕÙÕÉhNÍ êS…©BKÒF"G#G c¾ðþÂûB8F.N\œ™ ó¦F“ÕƒÕßT#Ä­§·žÞz*DVwVwV·½õ½õ½õBäîÏÝŸ»_ˆìºìºì:!²K³K³K…èÚܵ¹k³—s.ç\΢úDõ‰êB¸ºn£þßøKü%B¤OdÌ8(2…Pæ”9!Ä.i’&ØP?Ô{ÌñŽã8?6üÕðW²¦tÇe‹‚²Í¼-e[ dddƒÓít;Ýñ¹à½à½à…#¡#¡#!Pn+·•ÛPá­ðVxÁ·Î·Î· ެùÏÏ´?:Ù|²YïaYÃ_ºÛºÛ€¿ê=†~*÷–í-Óé´Pª˜á~Hð­kòš¼‘+‘+‘+ õkýZ?ÐJ+­ ­Ò*­ Ý–³œ$aÂÏf%ß©™j&Ьóí=º÷(ŠJì1Ãè1z‚ ä·žÕžÕ ~õõ_¡'¡'Ì©ÇÕAu¤C~-¿ŽóÊ.Ù%»@kÖšµf`„F@3kfÍ ,ãU^µE½ª^õpèbè"sÚÏb>6àYîY`üÞø}p÷b>öœó‡¶¶€G1gžV]ª x¬Uh„ Åþ1¨¨€Â<ó1?Ÿå$À‡/V ©½«½K˜yõ’zé™íÁö”í)ÿ×ùcw%U;«v&Ü•ÔåÔå<èyyD‚‘ €ºKÝ…rP`ÀñXÏëõúzOÇ×ùtþgwå ûºxaßc/æ ö¿•ÂA¿ƒ[™ßIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-47.png 644 233 144 2410 14774263775 14702 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–MLTW†Ca~t¨˜.Ô`f\’ª ·’&u¢‰šV‰m¤ SdeÁ‚&X$bX!ƒ!$¢HUŒ ‚Æ…«V;†f2TŒÌHçÞsž.׶Ø.=›¹ßßû¾wÎw¾{!„ð¦~¸¶¸¶¸ÖY¶ë´íÏÙ“³ÇßoÙ]&dTgTÿú#¬¿¼þ2@áÕ«ò¥më¸ÎwÖ aã;ù´_x…ípº3ÊSv3*;T–³Ñ²ÏgèµÃµÃ7zoôr"S‘)€¥ò¥r°m×ùº^ã9ñEóßø…€¬‘¬‘Œ?ÀíΊ+‹+}ß[ Ó>Ø·wß^€Pf(S¹ÀœòÉWå@Œz-8lOåëz§ñ5Ÿæ·ô(Ú]´[8päÀO·UðòÔo®ß¬ù’C4ÓL>˜¹f.ð“1kÌ’à ”AàuGÝõ›ì’] bF¥QIB“‹ÉE zêÉ·ñê7ÕoÒ_^³ù-=âým«€šœšœ´ I”9aNȳò,I~@©ïÔiu{™˜˜8×2ËégÊ£<$Á5Gøi>Í/œ‚J:ÀñDbŸÁ+ó•Mð+ò <È ó)Ï{k«þ„?á‡åóËç—ÏC²#Ù‘ì€ù†ù†ùX¸´piá,…—f–f`µuudu@T€ž¦ðÓ|šßÒ“Ö5gšÎ4i=òKV7ÆûÍÏÍ<3Ïþ; á†0Ô\©¹Rs&k'k'k¡`º`º`J—.9 Y}Y}Y}Ðù´óQç#Þhb 1ààKó[zRžÿ×ß^›®ûÌ>³„Ü(ó¤CÐXp,8´ Ðè ôØñØÉØÉØI˜ðMø&|Pì/öû!ÔêuÛyªÉ(6ŠIØ|šßÒ#`ÝÃuÕ DvFv::Ä-ŸËç¶-ŠE‹ *^¯ŠÃÑ‹G/½Ü@n —¬ON<9ñÚëÚëÚë­¸d.š‹jJM9+4¿¥G@aAa| á…°}ìÍr£Ô(µËÚòÚòÚò ³=³=³v=Ûõl×3ÈŽfG³£064646Á²`Y° ¶ÎmÛ:Ñ–hK´ÅÁïÅ‹XU³jÖ9f4¿¥Ç%„¼)of¼ÂØoìz¹¾uU¸*Ò¶¨òUùª|Bô»ûÝýn!¶µnkÝÖ*Ć „Ø>¼}xû°=M=M=MBìx½ãõŽ×Bx½ÞF!d¯ì•½Bˆ?Åœ˜BäˆÙ|6JÏõ°Â ÈsòœÙûاyƒý r0‡À–¢!IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-1-grey.png 644 233 144 5473 14774263775 15733 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ðIDATXÃ…—}PTåÇ¿Ïsβì."/€)Ä/†d]ÜL««½¬3 £#–^zaÔ²m(Ê+†7*ç"p»Y&šX¤¹ê•²PîNò²@Ì@’¼­›ì²»gŸçþÁ9Àè­~ÿœ9oßïçüžï9ÏsH~~~~~>0U¶© ]!ö‰}boÌÿ8ÿãüyhᯅ¿þšÇy Ü÷¬&…Ia [\µ®ZW-/F%*QILˆE,bt¢¶` ¶ðbõZõZõZb¯‰×Äk?V’q2NÆ_­())iþ©(«(«(‹ I‘R¤IVOq°s2W4Àý”²BVÈι'Üî‰y‰…u…u…uŸö»‡ÜCVÇ}Žû÷%¼¬+Ó•éÊPŸ––FLKUKUKU@bPbPb ì+ç•ë•û½i}ÙOñWx>QîàƒÜŸûs–I6“Ídsd™)D ‘ßTMž8æc>®®®xÌb¶˜-fîi‰m‰m‰e;F}xôáŒw´‘ÚHmä¾ÞÍÞÍÞÍ©e<›góì¾Lú y}òõÉ×'˜a†yÁ±V¬kÍGÝN·Óí¼ëQýCú‡ôIãóÆçÏ‹ŸØìvèqîÀxààÁ<˜¼ŠWñ*€fÐ šNÒI:!aÆhó·ùÛüÑ[óAÍ5H™½g{Ïöž/úh|4>šŸ¤µÒZiíÊõX‰•X9ðÕ\Ò\Ò\T¡ªPUèß¿u48 w=ª7êz£ôXvVvVv–x1@  Ðâv‘]dlÂ&l‚H‘Cä€7ðÞ¨Šª¨  ……ùš|M¾ d@dß±ïØw€¢§è+~Š¿Â£ðQé¦tSº¹:Ñ}Ò}Ò}2ë/ÁÆ`c°‘GˆJFì|_ÄÁŸ¨ìÁìx?ïçýy’‚ûž}Ͼ‡?9CÎ3ÚÑŽvj¨¡X ka-ÀHéHéH)p*îTÜ©8`ðüàùÁó¸½шF@ÑSô?Å_áQø¨%EIQ÷?888‚â{’ïI¾'™”˲>ÔLÍÔ À\/âE¼hÆ÷²á²á²8¨9¨9¨†Uêaàgñ³øY|ˆñá,P 4ÐÌèMëË~Š¿Â£ð‰®1טk ÿŠ[·:n5Lš š š pðžÃs %%¤„”Ìt)>)>)‡FGG…Þš5;kvz·ËòþÜÄMÜ,°À23t¼‹wñ®÷÷÷`¢`¢`¢àÿ€:á„àóù|>\Ψºö­Ú·jßbŽêêjzÑç]Ÿw}ÞýïzO¿§ßÓ¿ÃCÏÏÏ™W¿Ð¥ëÒué?Wuí<ÚyT(m\׸®q_ErHÉš}Â>aŸL€>EŸ¢OÍp¤Þ™zgê@j^j^jÞíœÊP“UdYg»©ÝÔnÂã­ñ­ñ­ñT« Ó„iÂ&ff`†õiÂqá¸pÜ9ÒJZI+…Kt?ÝO÷¾ÈºY7ëÞìÖšµf­0ëÍz³ž/¶¼lyÙò2ªi1-¦ÅpòDžÈ|‰/ñåL‡Ã«Ã«Ã«˜‘˜‘˜‘Y„rtˆ‹¸ˆ öß ü-ÚúÝõ»ëwKzU—ªKÕ;±{#ËÈ2²ìêV”¢¥ây™ç]:µnw“2RFÊNçКBSvÔ"ÙȦïב:RG¤m¶7moÚÞ„–ü@~ ?ÀŽ„ dÖËÑÀxÀŸåÏòg1³.ÁFàR¢TŸ[Ÿ[ŸëÝ>¾k|×ø.ñ=u´:Z]]SSSüÎ7(@ ÈQt£ÝRªœœœœœ nàn°@’@HÙ»¸jqÕâªÿÀ.paÇEVÎÊY¹øúÑ~éE%"EEEEEE°+…|`:Crv·ËÙ}OÎîÉÛ²ë©óÔy¤m¶ […­ZJ)¥7”N4;›ÍNæ(((º|ó|ó|ó~ªw º]ƒyït=ÒõH×#€ ¨—ïÓ*€ ß4è-ÀÊZYàW]466&ÚŽçÏ?žïÝŽÄ s-A– K>2_2_2_"™Úm‡¶`z¦gúΉÄ âçò¨¥QK£–Ò1Ùïñé¯í-%àwJ~É”YÝÂ}¸÷!º{èî¡»ñoo¸7ÜÞ*©£ÔQꨧ߿žz=õzjÐç¶«¶«¶«üW]9tå÷Á›ž›ž›!WµBµBµbç^Á+xÅ‘ú©MèÅÆ0Ææ+# 7Jº•‡àOêw²[8µöðZ^Ëk“»é z‚ž85¹frÍäv·ª\U®*§W…l![Èn9}"úDô‰ôdk·µÛÚM¾bóØ<6Wɺu2 ã÷8(þ¤nÉî\9»ÈArÄIÉ"YßFóFÞÈ_ݨ‰ÐDh"èU¡_èú#Ø>¶íÛöKÇúŽõë)@DÉzÊÂÒùgÿƒLdÁ$æÌIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.7.png 644 233 144 2567 14774263775 14774 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü,IDATHÇÍ–mH”YÇïLi#XŽ•ô‚ †ˆ¶õ)z“µµzÕL 2¶-‰­/­Ð®X[‘´”P«A (cµ²"Ó~j‰¦)·$ÈÞL(É–fÆiÆôy¹¿ý0ÏyzûÞý2œsÏùÿÿsν繄B¸­_ÎÎÎIÛù}ÚïªtUþž´/àØêØ:Ð9m9m¹¹æÓ´­öU¼=_ˆ4¾Où…[¤Ó®M»æ(·ìPSRSâÊKÚgï@Ö¬qöõìëøÓó§‡ x/x \.‡´­öU¼ÊWxv|qâ~! Ûáu¼‚i™Ó2…€ü5ùk %† `Ó†MF¦ŒL‘N0B@6Ù²ˆC­Q›­ö­x•¯ð¾âSüI=f¯ž½ZØR»¥6«#™ðô2zü†yŠO»ÁYŽp„lù¯6¬ zL1ò¡|@9Àe¹_îù\/ÕK™1mLù”ȦÁÂÃÂ×,¾Rx¿·-¼«¢*UÍOŽ~_¿ò[ý­þÍÚò+é’. ‚ *H¯ &˜àÃ%ÓœF±È†Ou^užª`K…­•BQôd³‚±©0h ÀmÖƒ<.“ÐNk½Z/„¾ --½YoÖ›?ÀäºÉu“ë Ôê õÀhÛhËh „ßDÜ7¼û5ŒIXáëùgÐ?è‡4R%ì¢êÖù À,ºé†Èß‘ç‘çÈU_¯*^U ¹m¹m¹mPÕZÕZÕ ãõãõãõiaÞ€7à €»Ö]ë®…¢¦¢¦¢&ÈèÊhÏh‡ }^_xTñÆŠ/ɯôXÂú„îhwŒýò;Õ˜®©Í£Á²YËf-›áD8NÀÜ9sç̾þþÃiañ®xW¼ â·â·â·À·Ý·Ý·ò ó ó a¤c¤m¤-Ýxù³âKò+=fÜžq[^ƒà’à`ÌJÙ$ód^š0ÖëˆuÀÊC+­<3£3£3£ª U†*ÓqzŸÞ§÷¥íÝw?ÞýÎ,øà§°ŸÂ”´ ‚• Ì2‹>Ü+l=Ì×ëu<_çÓùzX²,YBðçBo¡×t9P0äàREsE3¨»þvNPO= 4P»ä]òâSò‚¼´©vÕ Õ àÓŠ´"|°4µ4ÔÑH#Ëx¶Š³guC.ÎΙ.ƒe·ewhOƒóÙÝÄ´ë£] ü}À ^€ê”åEüò?ò¾¼R…ªH-¯*L…©0 ‡=ì ùÙ¨æÔJm—iÁH$¨Ê¾úñàÂÁ]àÙÝ+¶R!~u.S‹©evŒ¾=ú6øÀ¾‰„gß<û†yÿ.ÿaÿáßbÓbÓb¸»ÝÝîn#rDެÔDM!Ó_ì·ùm0‘ðìô³ÓÌû«ø0úæè›@ÉarÌ®Òõ•&„õ÷áHÍ‘˜ù/€LÎÿ[î•Ü+°þèúÚõµ¨¬¡¬¬»6vmìäoÌߘ¿LÕ¦jS5+:Vt ”K¹”+$hæêÌÕ™«ÿ×ü+ùWÀüGs¹µëâίw~ žó²VÖÊd(+.+ùÏ€±´Y!þU]‘]‘Ð\ՙߙ¯Å[¶ÞÚz ŸN`-·–[Ë!ñFâÄ`-µ–ZKC’¼IÞ$/´µµ…üöt{º=â7ÅoŠßòï,ßaÞaÆwþ|ó§ÍŸªCÐÓK«zŒ«Œ‘®HWJš)ûSö ‘Ûÿ¾á}ƒárž»~çOwŽß9.ÄsËsËs‹yyyBŒÇŒÇŒÇásŒ9Æ„7›ÇÍBLNNŠå‘ãÉñäx„èuõºz]BôT÷|Õó•“ýSî)·O}ý‚w —…x/ê½(!Œ©ë|ë|)i‚¶¨ž¨éä ;Í:ö•¦/羜ƒgŠ3Å ýOûŸö?uBP' j¦j¦jЇ‹‡‹‡!º/º/ºì»Çîá¥Qiª4Uš Õ–jKµÁCË„Ânõ»‰Ì‰L`.ÚmN¡Z—±.C]‡ù¸ù8øûàí‘Û#¡³zæð™ÏÏ|îw‡333!=1=1=. \¸4ñÎxg¼žœ|ròÉIh=Õzªõ´¬mYÛ²DŽÈ9p.î\ì¹Xhítw‡ám®®žaÏ0¨#‘ ‘ êºÐþ ÿc¥¥pËù¨õQ«:´÷·ø>ðáËûwÞã¼Ç›› ½ž^O¯ÒÒÒ ©!©!©º³»³»³ÁkóÚ¼6(Ù\²¹d3ØËìeö2°­F«rÌý!÷H~}ÛÍm7ñýãáwußÕ©CÐéíô‚ö뀞`»¨¿_ä~‘«¯¬Lí¶vL2‰Z^ô>úèÆg|Å^Ù±c’I&y…þoW½xQËøË|:ðTÒìc˜FL#³«Ôƒ‘Ô‘TÐNúŒæ\œ^œf^»¨=ÖƒjTuªä¹Anm‹¶EÛ²FÖÈ vÚAn—ÛåvPÔ>µ4‡6ª‚öýâÔâó:¾ºàÓùu=/wþÅ O°ó{µ.­ ˜”ViÅ?Ðè!øíûÅŠH44`6Ť,ø™ âéø:ßË?xW²¿hÑŠ»’£±Gc—ûv;`ÃF,Í.Íh%Z >P÷Ô=  dëq=_¯×ñt|Oçèy•_¯ì{ìÕ|Áþ¹úw,ÞIEND®B`‚routino-3.4.3/web/www/routino/icons/ball-6.png 644 233 144 226 14774263775 14374 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷ÜKIDAT(Ïcüÿÿÿÿÿÿ°€¬¬­[±ÉL›æíÍȈ.ʈ0—FBb0鱯ÿÿ33·l!Ç%¨€j.¢¦AØcx@ýÀ¦N:òÎ-»K€lIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.1.png 644 233 144 2453 14774263775 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜàIDATHÇÍ–]HUYÇ·:ν’V†•E‘Dó!D–2 s-2SÉ.Qô1¦áÌÀ4&$ú`ØËŒ“BOEöp!¿¸!YM½È<„Z#ŒPbTƒ^¿ðž{öÞ¿y¸çÜsúpzm¿Ü»Ö^ëÿÿŸ½÷Z{ B±Òú¿>~}üò¨ÿƒã÷îöîÎìˆÚ—%ĕŕ=­‡m+ÚR¯¦^U#ŽmÏÛñî|!|7Ÿí+…ãð<¸Ën–?Ë›µIIó&TtWtܺvëÕ09890U0UŽmÏÛñv¾çÆïñ ‰ÁÄ`Ü8x¾ô|)lðmðmú)0¶ öí/x™ð2AÇ€|$“¬ €Yf±Ç[—mÏ[ñv¾gãÛ|6T€´ü´|! ôP顤+Ñ„‘P³®f`D:+\!™ß̳H4™ÇƒÖÀÔJ+ÀÔ÷õ}yZž&Ì·æ^s/pƒã'9*4Ò‰¬É¨É°ŽÜpø£zÄ»{Ûü”{˽€ˆ €’CÀ¨ÊU¹Dôi}I_ŠÎ`b`ðÁеºJWþ›-lAƒšPD˜“°£"1¾¿p úúHšLšœýžËçX`/oÔµ‡›<üs¸*\¡Í¡Í¡Í.%ƒ 2<æ1÷|hþõükˆüc&™IºZW³À_¾Íã걄]þ**€E• 2U¦‚\%³d–³Bu[ë¶ÖmߌoÆ7ãPMªI5^£×è50Õ2Õ2Õy­y­y­pûÇÛ·+œU_^ÃËÎŽñ[z,aC¿ÂÍÐÍP,ï„J7úŒ>¶çî³»Ïî>s6¾¨´¨´¨ôÃ-œïŸïŸï‡]µ»jwÕ:ñý%ý%ý%Nœ5Îçl|}Âáê°üÁò:“Û'·‰ïM§M¯š^…s…s…sp¸épÓá&ØçÛçÛçsâŒ|#ßÈ5®ÆÕ8È™#s`GÊŽ”)Еޕޕî6aÌ€›Éâ·ôHMIMQÃðvâíÈobe@ó²æeÍË ábÂÅ„‹°shçÐÎ!ð.z½‹ÐSÞSÞSî"¬—õ²Þ±sërërë Ëßåïò»âþ5GÌw›‰òÛzâ…P½ª7nX³Ä,"¾Z!DšU¢pSáÆÂBtx:<!2Ç2Ç2Ç„X]³ºfukϬ=³öŒmþ6›_ˆÙ{³÷fï‰Ø0‚FÐ !_Èò…ãOE·èŽYi6LÏRg äuy°úEUªJçKïôÞé½Ó çóÆyŒ#ÇÈâ™â™âxµíÕ¶WÛœø³ygóÎæÁ“â'ÅOŠ]Å2iŒ4þï{¯*gbU™-³AéSúÚ¼oö™} ‚*¨‚@;í´ƒ> è®£²À‚ÕjÞa§”Ð`Κ±cɪüHÃê3sªL•9TºGtT«jU­À(£Œ‚ ˰ -´ÐâZ™ïÕAuô4d¨vÕÿ©>ö‘ÎXÿ‘| Nª“D¬F«™cŠ)ë¿B„ IôÃLL`Ί‰¨£ê(rÀ¿dçÿÄ]è.pdg äy„0è‡ú!qÄcÛó±-³òm<É»ò³}]|¶ï±Ïóû»§sW€ÀýÿIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-82-red.png 644 233 144 4257 14774263775 15627 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜdIDATXí—}P•UÇÏó<÷‚¸(ÉÔˆpÙÖ( µkd’µñ"‚.5“S”!N0låš«fÔ ÌØN¡dæ¶”j[37jwm*¶,rcV+*fáÐËtAàB.>Ï}>û÷<÷e¶œÝóüÎù½|žßùžs@ˆ™q…ˆê±®XW¬Kù)8ÓÓÓ’Ÿi3l†Í8ÿW±L,Ë`fÙÜ'lÂ&lÒ†HÛÜ'ýe¼Ì'óGÖSïˆä çÛ.¶‹íjSäúüëm-¶[KÓEå1å1å1 $!q,q,qŒwÖu¯ë^× ÷ Ü7pßeee…l¹.ýe¼Ì'óËz¿Ì#ÔßFÚ ªãê¸:Þ·Lv(¥,¥,¥ÌxühûÑö£íælï°wØ; hhhø˜`‚  >úÀ²ƒëÒ_ÆË|2d½…™O8樃ê :Ø÷®LõaÖ‡Yê·ö^êõ÷úé%8Ì¥æ\s.º±[GŒ c™± ŒBc­±Œ #ÛÈc·±ÐXæR3ÎŒC—ñ2ŸÌoGÔw̱Д&¥Ii¶׶׶÷Ø·/¯*¯J/´Àž4Úv¼ú±K— Àì .LSJ)@`M` °"5¦Íæ¿~ÌŒ5cÁ|2ÐèÀ+½óöåUçUë…²¾ä‘|ÂÞoï·÷ÿn¹tpT;ªÕfš{È=ìf4˜Çkì7:Œ#Έ¼c[ƶL½<õ2ácsÂM}›¾ ðŽúF}S7LÝÆ~óyÈròº‡Ü_»¿fÔQíØãØc¦I‹Ï¶Õ¶Õ¶õÜ^¹PWZWZWjn &ðéM2×à‘Á#€ÿÖÊ[+aæXÌŸ=ðÊéWN‡ö_è¿°²ne€zN=øcöÇìØóùžÏ!”¦^]iÝ‚ºæ&«³|Âô$.I\’¸„}ó/®º¸ €8âÐI•ß\þHù#))g;ÏvìúÍ®ßÄ8cœ?5þÔ°)gSÀüüùùíÇÛ<Ûýl7à ~hê»[ÞÝjÿÅ|Ï Ï <’O‚>w÷ów?÷ó¡/3z§Ÿ›~ðÈ©üó?Ètf:ÛÐZÙZ  ¬UÖ|•øU"Àš5kÖTÝXuc¸¿7Í› ®מ_zñ%0zÃ}ðIÉåDÑù¢óEç-GÃX5}búDxì™ò3åá[~UÛUmáö½Ú½Z¸ÿè£_èóôyþn7ÀÎ’%q½q½Àø…v‚ñT¨QtsÑÍE7[÷ö ÙÑ’ÌÚÌÚÌZz¦”É×'_Þä&nÂä÷²e[ʶ¤ŸJ?p$çHÀC<ôÀö+ìŸ~ûé·á5ÛÚ’žJz &%&ð¿5ôÖlŽé4>3>ÔQYó²æeÍ£Gò µP-T /ý(Ÿº×¶¿Züjq˜fLŽLh˵å€ÿpóáæp1Ϙ'¼³G¿9ú @ëm­·…Ïï¼gç=€””l]³>¥O…ê½àýï°:ùÅ©8祅v‹v‹vKUð|SgMѧèðÏÚÖc­Çü“ü“À|9&TnQ»c?‹ýÌ웿 þêZÛµ_Ëžs[Ïm…¾`_°/iùiùiù°ÅµÅµÅíz»Þ®Gd&d&d&@ù•ò+åWžß*‹d¤Þ 7È1íø°“ÃNÊHÛ+6ÓfŠ˜6—˜KD䌜‘3"ZÖ£õˆØ&Ø&Ø&ˆ¨NÕ©:E´ÑZ”%¢–«=jˆ8ͱæXy(M#âFÄÉ ÛËݳºgÉ×ÚüÔ£©Gï—†ÀÔÀÔô<9ùÉΆðl×[§Óf¡Yøxï Å#ýΤ710€zé…Á[AÑgæ˜9èÜ5N§€ÞAþGùZ¾ö»“ð®$÷õÜׇܕ¼;áÝ ûÑ”RŠBþÀ(0 ‚:«Î ¡A[~+ÞÊ·ø,~«žU?¬çi~]<µï±§óû_ÿãR‹ÃIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-190.png 644 233 144 3023 14774263775 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÈIDATHÇÍ–oH\WÆß™‰ãŒUó§f"1³)Y¤‚¸d#d ±Ñ€R°¬©Ô6¢!Ð]SK7 H­JH -)Kj·l¶Ðì¶¤ÕØL»R%T3 [‚šLQ uËîÎl%´(]Å:Þ{Ïù퇙;wØÐï¹_.ïyÎû<Ͻç=ï9""²)ùpÝAwn"v7;ã¾§}OÿüJ"¾h«ÎU÷ÏÓ°ñÝïlþpó‡*æÄ6nÏOÏqøÓõìqÙ$Î@f_fŸë`2~^(y¡Ä·5w‚À?ðÀ„cW]èïîïæw0ýåô— ‚Û¸=ßηùÒùåõÿÓŒ¡Œ!× Ó›éÕ;«wHL¸³ jŸ©}àÏíë¿@6Ùú °Äö3—Ûxr¾oóÙü¶ž­Ÿð#W™W)Ï6<Ûà¿”Hˆõb¶´ØzÆå¼Â+dÓm†Í0€Õiuçú9ýè¿«oÔ7À_õq}Àê°:ˆóóóмȋd3ä#Éo&õRú ?ÎR*‘·« ^ê%e(¢ÛÍN³ô?¬ k# h2ôš^½EoÑ[R ]¨ u!è›ú ýè\ý¤~ tС=Ö¸5ü6Áõ›ê7«¶¾¤[ÑðÏøg–6Àäòä20@ è¯ôW¬Vù˜ˆü[DÄu)ëlö•ì+’é|ùLdwwWd111_$(A ŠÈŒÌÈŒˆ\½Ï=f¬€ˆãÇ®1B‹¡E ’Xs~mþhþh×´··ÃXÝXÝXSSç»Îwï‚ÒÆÒÆÒFqðP~(?”ûýÆ~—ggMKnRï»ÐDh©1gWÒr¦åŒ³+Á\2Ž®Q¬²ê!B¸Ë]î¦0ÂèVݪ[1ÆKÃß'LM‰ù„ùDšÞZËk-¯=´+‹.@²èIcÒ”ÝÇT›jcEUo©·@Çõ}}ßѱ¢VÔŠ‚Ub•X% ZU«jupTk¿õ’õ¨OÌ æVþI5©åŸòO=ÔÇìFûvÔûê}Nç+bE€êyõmwô¨%uL3 ¡¡åŒæ·ŸýìÕ£Ôp™Ë¤:õúpfð!°6°˜7ù%w³­oç„sbÁ±Ÿc?ü`|k|ËãÅ‘EmQíwÚ:mÅŸXXX ¡‰ÐD¦vMíšÚú}‡¾´YmV›…©Š©Š© H§ªSÕ<Φû¹û8ö1€sÁ¹°à0õd…âQpwp·I§JŒ²tIºæŽÎuÍuaøŽøZ}­pµùjóÕfKXábábá"xŠðÞöÞöÞ†Ó®Ór:ÓŽlØHq*Ë>:27ÿ÷ Ö©$Øl±N h šÕÑ eÉnq‹[€B¡ræÇgŒ½Æ^c/ÐM7Ý9þ( ´hïkïçðéÁæ`³u*sûXÜ_p`ÄÒ±4dÉü U#ÕŸÔ'êÀnh†f ÐÛõv½ô½AoåS>åîq{ ~£V©U ïÑÛô6P›ÓŸ¦?å1WMü;î;n@s>t>üE3í‘-Èä[ô°Õ›êMÒÙÞod{=ÙŠ%I’ÌúŒLòò=Iõ¶z›4è_ë_çâ›|¿èü¿rWÒXØX˜sWB+­¸­%Öwê;Iqݸ¾¼g°lÓ¿¼%²ù&ž‰ÿ«wåûºxbßcOæ öÊ:ìð¨ppåIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-39.3.png 644 233 144 3177 14774263776 15060 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü4IDATHÇÍ–ïOTgÇÏ Pf„A ¡©iC)š…()-ÔiƒÝ@‰J¦šh»vEû†ÆÆ¸ll]²AªÆvýQÖ®,ZfqÐN[Z}S7Ûb¤tc6]4a,3ŒK˜÷>Ÿ}1sv·€÷Íä{žs¾ç;÷¹çû<""’ÿ0/5/5/ŽaóÎDÜòšåµçÿç40Õ›êïü2?ÉüÀÖmëÖÇØX7òÖ‹$øö3â’%‰@j_jŸ©*Ž?€† +,¹1Ü1 V§Õùï(¼=ðö@ÿ¹þs4ÛnLWMWAëF¾Qoð-ä—þ§¿¤\N¹lº©O¥>%ÏÚŸµì%L@í뵯ü”ôS’2€6¤“®ª€ AŒÇ·ëñ|£Þà3ø~Fÿ˜œ—s^ád¿Îo튌çx˧-Ÿ‚ú ⤓Sœ"4“fŽEýQ?!õý¸~èWNåPß©ï€æÐ„ ::褓ôy¾?·ôµôÇÎó§ºP]ÈÚeè‘ÿÞÛÖóôÆÒ¥ ^ˆ|xñ‚ªÑÓô4"j³*Wå(õ’Z¯ÖÏ¿)T’JRIÀ«Ø±'âXÕõ¥^Õ_Ð_ <æ1¨ô8ÿ¯66nl4~´~ÁVŠˆ,?ΗÖkO0&–N,…È!6LU?<÷ð³ÑêèÞèÞD¿po¸7Ü >·ÏísƒîÑ=ºg nºéNÀÈ"®ˆ æù>Œñƒ'è ·¬ýÖþ`²¡G”IDäÔìÖvkàoåg~ÖK×­©,®,†¬#Y³.¢î5Œ5Œ¯Õ×êk…šöšöšvHKJKJKÇ>Ç>Ç>PCjH %ùËýåþrX·j]ñºb°}lë·õ£6ž®ë¨ë€ðI½Þ ¼5Ó#Q»ˆÈß[àêÌÕ8g¾ôý¥ïUcÅâ^ ä+÷­ð­€•Ù+³Wfƒã€ã€ãØçìsö¹„€‰¿Ä=³=³=³‰x×®]7 bIÅ’Š%0=;í›öÁÓ¶¼Á¼AB#yw&ïLªFp)—­#¦G,X< ú¨Ÿl›lK»fšfš òו;+wBAaAaA!œ:3tfŠöí)Ú=9=9=9©2U¦‚Í'šO4'xô½F¯ ;èºaížµÍk›!û[—­ ¦þètø*| Ú2ìvÕgæ3“ßä§Xœ¯d¼"rGûq÷»åÑèìhþh¾ÈàªÁ²Á2‘Eú"}‘.¢ê…z¡HsCsCsƒˆ«ÞUïª1ß2ß2ß±ì·ì·ì—ùg´l´l´Ldt|t|t\ä’÷Ò½K÷Dò—>ÿ¼Èß>»’r%E‰d·f·Š(·XÄB±YýUÛ¡í0ÝIL¹]s{òö¤älñoùvË·"Ã)ÃÉÃÉ"¡±ÐXhLdbÃƉ "®&W“«I¤úZõµêk"y¶<[žM¤d{Éö’í"^xxá¡ÈõÜë¹×sE¶ÙvdÛ‘‘´ëˆUdú7Óöi»HæDÖûYïKŽHh64+"[U†Ê0Ýâ{ʵÞÏ{?ŸþÆß[öì#Tv·ìvÙm8ûøìã³[ÔQ×Q×Q«–­Z¶j¸«ÜUî*˜ñÎxg¼Pë­õÖzaªhªhªÚ]í®v¬þ×jÏjt=ê<Úy”Ñ ½§{Oo c*w5îj®Ä§Diïjï&lŠrŸûÀf6³ ð öPJ)¥ âNœ8E„Ⱦ´-8jLå®C»áøT2÷1¬ãÖñ`2§=kƒßègôŸ?+ŸØÛÅ{{2o°ÿÎeûT³¯IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.png 644 233 144 2575 14774263775 14710 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü2IDATHÇÍ–oHÕgÇ÷Öô‚e…-sEÔì6Ð2sBâêf…–”©QM"VìÅ‚ ÊH‰æ¶E„Ù”ZP‘Ù_˜­‰vc4z!%a±þ¡®©¥‰öû=¿ç³¿û»¿»õ¶çÍå<çœï÷û;ϹçyDDdJøWÀ3Û3Û3Ù¶=_»ûq¸Àç¿Øvµ‚˜ 1ÚA©„SSÏO=o=qmÇïÄG狸øÑ|ξLw#öJ았ì°} .Œ›nÛ?¶€¯Á×ðÖ„²Æ²F€ku×êøzÛzÛ²²Áµ¿ïä;xÑørôü"0ñöÄÛ1ÿ@ì'±ŸˆÀœ•sVÎÛkt΃¼µykº¼]^íâ‰×ÙÀC8«/Êvüáx'ßÁsð>‡ßÖ#¸"q…¬/Z_䫵ž\€}³öÍL£¨¦šxN›ÇÍã ÿ0çšsãÎÒY¤|¯×è5 ÿ2ý¦Ÿ1Λ'Í“œæ4ñ.^?ÂçðÛzä¿gûÓW°1nc0 `A½UoÙêˆ:‚¡¿Ô¥ºí”HßÔ7ô °º­n«t…>ªF*ˆþT¯Ð+Ðä¨Kê¨~ÕŒ9øa¾¿D úâ$øz}½Cà©zª"¸køÍJ¶’q6Œ-FQ¡ÔPj(Œl#ÛÈv…«ŒUÆ*å„rB9`3ËÍr×ÏŸ–ßòGðÖ¸|¿­ÇcËû6C¤´º´z’)â÷ú½:C<æˆ9"w$ÇÓãéßðÂaÿ°_¤`}Áæ‚Í")™)™)™"y~æù™çgDr½¹Þ\¯ˆºººHѤ¢Ä¢D£Ñ¸l\‘¥ž§ž§â“€Z¦–É_„?¬ÇVø÷wpéõ¥×‘Ø¡6Œ Ù¨/¯/¯/‡3Ì\0Ó-ÀºÕëV¯[ ‹Û·-nƒ¼¤¼¤¼$è[Ú·´o)$ÏHž‘<Zï·Þo½ïæYeF¬ëàë.¿­G`róäf}z3{3£Jžf [îù¢äEÉ‹èêìêìꄦMšÀüÊù•ó+!˜L ¦nÖͺ–w.ï\Þ Ó:¦uLë€ÐÕÐÕÐÕ¨ÞûÙ*³Ê¢ø"ü¶©“¦N²C_w_wÔßþ–®Õµ@>ùä»éû}û}û}‘‘‘‘‘“&=L‚gÞgÞg^híiíiíÁ¬Á¬Á,HÝ”º)uÔ]¬»XwÑÅQæsOô˜qøm=ë¦u3汈™o拳­X«Ëê‘Fi”F‘[þ[þ[~‘ªÑªÑªQ‘-é[Ò·¤‹„ÒBi¡4‘³ÎN8;AdgñÎâÅ"-%-%-%"»vìI&‚â®Y$‹\>—?¬g¼³6¼~7ìöØÝswÏÝ=â@q r›r›r› ýQú£ôGp¯â^Ž 8Qs¢æD ,ÉY’³$jkk£Nì5Ô¿«mjÛ{{LD¤ºvÞu8Òš‹Á2݉®1Wæ{–F»Sè ƒàUTEE)sÀˆæsøm=ãϱagÎX§¬SŒèVݯûAý *U%¨vÕ®ÚAÕ«zUºPêBP×ÕuuÔAuPë3+ÑJ~¥‡k¯µ—ûŽ?ùíqTAàUlcÐþâ^òèç¯#R3å o¢+nm·¶c€z Dã;ù?pWÚ À1Žï±Úª¶2ºE·C ¸¶ã´D8ßÁûà]ùѾ.>Ú÷ØÇù‚ýE¨#3(îIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-28.8.png 644 233 144 3242 14774263776 15054 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜWIDATHÇÍ–ýO•çǯZ9 ¢ÂLMU45µ¾¤‰‹Ä6B9Þs+EK| °-‹ÖÙÆ5b:2VMêæëÁvå-çHcIlÖ6®ëF&‚1Ûe¨À9pgXä¼<ÏýÙç<œ³—?Àç—'×u_×÷û}î羿÷- ""‹Âo˜1+b†â˜‘|Ü®¸]iÅ—40™ŠîþÏ%žXܸ¸Q¿‰q£>º_$‚Ígäe‘DóÚçµ›rÂñ)(]_º>î;¡øt/˜ífû·A8Øy°ÀÖdk¢F¾ùÀ“ãÉHlŒõF¿/§þ‹_ævÏí6ýæ=7ï9xþ•ç_Yý“Pc5Xó­ùcƪÐ\@<ñ*˜b ãŠñp½ÑoàøŸÁÒ#¼#y‡ & &Í—C ÷>äwG›Ž6ú#@ÀÎ .q‰xÐDà·Á'Á'øÔ_ôÓúià²jTª_õ3Ú^m/>z‚à"ðñê³0^óÑÖ£­†À{r¥ÀWà3_6ôÈþÛ3/óBÉö’í ÒŸÓLƒêÔÏêg èý+ý+”ú‘ªP³3…JRI* Hc5«#y–¨I5‰R+4MÓÌâ™Ãø›KòKfgðÌËQ¿RDdÝoè17››§æ€c­c-¾À«®ôѺÑ:¦Û"|þ¿œV§Õi…àúàúàú(A'8Á‰¨ú^¿Ûï§u¤c¤ƒé`z±ŽX ×ÜjnšcèµUDäÒŸ ê½ª÷à_Oô-×r¯æ^……e ßZø*çÇ9s‚£ÑÑèh„"s‘¹È )c)c)cP¸®p]á:˜ÎÎÎrO¸'Ü`™²Œ[Æ!uUêöÔí¨Â –•–•ðô{!>¨|¿ò}Pï„ôHp™ˆÈߎBOBO4½Óe鲨Š’Ón¤ÝÀgäåååååÁŽáÃ;†aÛõm×·]‡¾Æ¾Æ¾FH»v!ít«nÕ­"ÂìYö,{¬¹¶æÚškÐ_Ö_Ü_ igWnZ¹ ßÍê/_úò%UÝÝ }7¤GX‘ðuÂת\¯»^‡±žÝžÝðÐ1Ü<Ü ==Ö+¤·¥·¥·=Îgƒ­Ö­Ö­VˆwÆ;ãY•Y•YcGÆŽŒ‰sº ]…‘›‘›‘ ‰5‰'OBfѦ¥›–‚óÛI5©\ƒ®APg, Õ#gc¿‰ý† )1 ™†D–ÞZܵ¸K&Îo8W|®XäXͱSÇN‰Ø“íÉöd¯ÍkóÚDæVέœ[)ò$åIÊ“5£fÔŒH‹¿Åßâ—Ù§ÕÕêju‰$-KZ–´LÄ{Ò[ã­Q‹T¶Êi³·-i[""ɱɱ"ªVîÊ]2bô;ÁwƒïšÅ6dþˆH×OŸ8$ù×3§N'ˆ”yÊÜen‘¶¶6‘ÑÑÑçfçfçf‘ö†ö†öϤgÒ3)² gA΂û>û>û>sµ¹Ú\-òèУC‰t¨½Cÿ««ÕÕ*’úÓÔù©ó%YdÆ;ã‘_ª-j‹iP´Ÿk¬k_×>¸1xû£Û©Š]?ØéÛé×w'ïvÞmØXº±tc)ܲݲݲÁ•ò+åWÊ!kÖþ¬ýÐälr69Á]î.w—CÁù‚óçaÜ;î÷BýñúãõÇaKü–˜-1ðû`}C}ƒ±†Uÿ¸÷ã^઱Æ0våáÜó»I´›ÚM@c‚ "ËÙ† pŸûܲ/^¼@ -´Då먣¸ÏÛëmÐ6mßá·¿ èá]‰-ìc˜‡ÌCSsÔgC™C™ ý*ä3Ú€ßë÷2­]Ôú´>PgT­ªí±öX{ ZµV­Uƒž­gëÙ@>ù䃾J_¥¯~H1Å ýYÓ4 ´Ÿû;üLëËÃ>Ö6´vh-€ùùÁÔþö±ÿq~ÿÓ0væI­GëÜún}7üá/† AÀÇSžFÍBG¼Œ3®úúðiŸjŸÅÏaOÜž¸ÿëü᳒½…{£ÎJÞ\þæòY;PK-ñœ Nh¯i¯áÕ«z0a‚HlŒõF¿gà|ÿìYùÌÞ.žÙûسyƒý7!Zù›æò¦IEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-reverse.png 644 233 144 271 12610450027 16611 0‰PNG  IHDR‰ bKGDÿÿÿ ½§“ pHYs  šœtIMEß  9~ý ÎFIDAT8Ëc`îà?ºµ eÄe€‘Z.Dq)5 d¤–«þÓ4–‡Ib%0Q;L©ÀŒLÔŽ-&j&Jº$Ôa”XqîÇôçIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-14.2.png 644 233 144 3042 14774263776 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü×IDATHÇÍ–ýO”WÇÏLEfZ+….ÖmÕºn7˜VŠ’˜Ö„.ƒ¥b…˜&f+mŒ&ˆl‰´–0wY·$¸© „&ÚÅt&ãò²ÆB[»`BÖME„éZSRIÐpœá™ç¹ŸýaæaÆòx¹9/÷{¾÷Ü{ν""òL|°®¶®¶.ÉÖß'ô¶B[áºÎ˜ÜªƒåuËë߇´Ò>Hw§»› Ù´›þÉëEøÉñL½<# Eê…Ô –mqùxcãm?ÉûEûÅÙ(¼õù[Ÿtµuµqî^½{ °-° ²i7ýÍõ&^2¾|ð“ø"âKñY¾‡Ô¥©KEโç Ö‰9ø×ÂîâÝÅOL<¡¬ OËX¦¶A‚˜ã^’lÚãþæzÏÄ7ã™ñc|¯8^Ò}¥û쟠‰ˆÜì€êg«Ÿ6héÀ…‹e Dz•^E„?)§r)*E¥¨5„õ}ú>" þ-|ÌÇ,S_Äñ\UMUM&Á›üíµÐk!û'àØéØ™8ÓøÜ´ÊBe!PG´¯Õ8ïò.€êR]h å6·A½£ÞVo“³dV+Mi(µÉp4ÀÀUÇÿaOxOØ$Ø´3é(ED~}ìA{0¸„¡±æ±æØßÍN‡2BÌi7´Ú¤€C 1‘£‘£‘£0³~fýÌú${=õÔ'Dm¿æÒ\0õ›É““'™ÓêbøàÞÿ<ðO{‡½#¸Ää#üGD¤õK¨|¯ò=PyFvà/S'¦N@¾+¿-¿ u©é’ë’‹E£6«6«6 <(x°Ø´mA8Ï;ÛíöÇ´–´ÔÖ¿niØÒ÷›l8¼ÿð~0†b|DÝ®‚óþó~˜ý7€:¸ù¹¹D̼vê>Ô}(°ÇÓãéñ$.Bqiqiqébbçœçœçœ°!sCæ†Ì„~Ë‘—Ò^J#ÒÜÜv í€:}}]ã#—{—{ÕFï>y÷IP‡ãuô íŽv6­Ú”¹)¼>¯ÏëܸqÃŽÑ£;F¡¼¡¼¡¼œ»œ»œ»N£Óè„Éë“×'¯ÃDx"<†¾}ï÷½¿úí Ú ôŸûæ³o>® ®cóS‘§"ê‚@úÓéO#üýÞé{§A e@îåÜ˹—¡  Î6žm<Ûr\ŽËqÈÎÎ[ض…Á“êIõ¤.Î\½Æ^c‡WŽ+ÇW_ñUÂ|O•O½<õ2J·¤[Œ«`x eD4íUíUË/EDį Ñÿ«§'2“?“?“/R8Q8Q8!ÒéïôwúEÖù×ù×ùEVV¯¬^Y-²¢vEíŠZ‘ö±ö±ö1‘öííÛÛ·‹œÚzjë©­"g*Z+ZE¾wß©½S+rkãí¼Ûyâ°tZÏXψP£¿¨¿h‰Wåpÿú´çÓÀ»cñD޽sìÍcoÂ`É`É`ÉâLôz{½½^¨Ÿ¯Ÿ¯Ÿ‡‡6Bùšò5åkÀ]ç®s×A‰µÄZb…¢ŠnÝ‚ìŸeù²|Dþqu°e°Eï´wôíæc¡*ë*ënH6DƒÑ «4eZT±*V޽½†Ïð> …Z@•©2U–Ä|Ž9æÙË4Ó(лõîäx•E•Ef?ký2ÑÇ”ýGûÁ%cÚ˜–ècÆA­_ëgNM³ŠU‹3¦<Ê£<`4ÍF3pk\#ÛÈ6²Aí‰mDïÐýºôoçóæô“1|õÅxÎx€}Ü>\B—ÙÇuþ½©{.¯ö5³ñiÆã&eD‰óDˆ!B„â6<à>÷H\÷?c·±€Þ«÷÷ãøó{-{-f¦éü?y+Í·Ë|+c/ÂÂ[;bô ½‚¨5€ $dÓnú›ëM<ߌgÆñyœíìñüÁþÙNüR¤z˜IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.6.png 644 233 144 2653 14774263776 14774 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü`IDATHÇÍ–hÔuǟݹÜÙ¥ ”[L'\RHC¢X¨-¢·¢›L¤i-€D£%Ì?c`‚äD‡9]Sq4Ü2V0\š×º,gçŒ ïòv]Ûîü~¿ŸÏ«?î>w—«ÿýüóåùñy¿ß<ÏÃóù ˆˆHiö+àzÂõ„k~Æv½›÷—¼RòʲžŒ}Ä¢7ŠÞ¸Þ :t<~üñãj4o›¸É/¼/’Ç/ä3~)•¼cgŠÖfíOaÊ +JeìÏ/€§ÏÓ7eÃÖ³[Ï|Ýýu7;!Š„âkãk!o›¸É7÷ ^!¾|ú¿Ÿ+>W4s™ûˆT¾\ùrÕ{™„±*ð¯÷¯øÃý‡[»À‰^¼z-$‰9±Ûijùæ¾Á3ø†Ïðgô,\³p¼Þøz£§ KDd4­å­å@7€Õ§Gi¥¯NZYþÍ~Æ~†4ëçõó,`€þUÿ œ´ïÛ÷I러1k hç>Á›jõagñ1|Yþ¬ùwo÷×B`Q`‘)€u ô*½ €vÚ±²«‘…•óìb»@õ«  æ¼Z79:b1ßÙ¡üÔ›¼‰¸¿¶ •""Ë¿OÄIÎá\¸?ÜŸ|íþ«3§fN1=½½ ±ŽØþØ~ˆOÄ'âÚ“Ú“Úìc—Ûåv9D?ˆîŒîk…Õh5èÝÁ4C|;arüY=®Œ¼÷«EšŽ4yÌV)Ÿßç×ÕYÝß½0œN‹ÇwÚ÷‘ï#‘š»5‰š„HÙù²óeçEº"]‘®ˆÌ:ÍÃÍÃÍÃ"USUv•-R[W»¸v±H¼{òÉÉ'Å#/ɘŒÉ·\õ¹}nãÏéÉ(üùC8™8™¾Ðï€J¨éÔ ©êT5L M M Áņ‹  rYå²Êep§çNÏž|¥=ƒžAT V V µË×._» ÛömÛ·m\úîRߥ¾\zZ1|Yþ¬ùÃó‡õˆ¬Š¬*èÅmÔAP_©nÕw7ÝhºÑtì=°÷ÀÞÙ- ÖëƒõP|°ø`ñAXXX€ºu;êv@rw²-Ù–ÏÏ«áÏèq‰¸ýn?O‹÷÷‹ˆ#""êÅúEý¢ˆ«ÉµÙµYäêøÕñ«ã"¡C¡C¡C"[d‹li‘iÉ·pÆ;ãñŠT»«ÝÕn‘ñÞñÞñ^‘{7ïݼwSäØúcuÇêòùº&×ãÏê™#¢Ô@Ñ »Þ®—§dŽŒÈˆ,$À³<+"g%*Q‘žXO¬'&²²feÍʑҥK7ŠÄGâ#ñ‘Þ–Þ–Þßußußu‘X$‰EDºÖu­ëZ'2qkâÖÄ-‘ÊŠÊòÊò‚a<%"" ³ü’Ó3kƬLÏUŸUoÕ“6…nkokok‡ð@x œoÅÝàÝàÝ ø§ýÓþi˜ L&pÚ{Ú{Ú «GW®…óNÌ;1¯ çÇ5ÎÒüð¿3&"rä"lß½}·¹¥V‚´“€z`®p…+@„@¡²9™³”¥,s˜ÃþQ~á`7t¢ÁGÇðþŒžÙ{Ìì•¿ÍžQ_ª/™Vêwõ;èͺQ7vÒI'(Q¢8ÊQŽ‚Z®–«åà¼ë¼å¼ê9Õ¬šïU™*cÚìIìp:œž½Çþkó—J 7¿rBÀߪA5`e›«P88@‚ @ç*˜yR&_½­ÞÆçGçÇB|Ã7kó?ðVæÞ®ÖŠÖŠ@ðŸá͵g“³‰4è úEAÞ6q“oî<ƒÿ¿oåCûwñÐþ=œ°ÿgºíß­_>IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-111.png 644 233 144 2344 14774263775 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü™IDATHÇÍ–KhTWÇ¿›™8II|‰Xò°Ø…Š–0 ££BÄQa”€¸I6Í&Éà£.\ˆ‹ª`]¸ªHcƒÆÆE &J„V´.¬ÊØ4­FiÂ˜Ç ÌÜÇùuqçÌc…nü6÷~ç¾ÿÿÏ9œïY˜ÿ ”Ô•Ô•Ìwó’/½ñ²-e[>ýÑÍÏÚ`ì4v>úœYp`ѹEçœ'^®q=¿¸^Äã/ÖÓã²P¼À¥À%£1Ÿ…Ý«w¯.«vóooCy_y_Ú‚Ö«­W.Ÿ¿|ž¯ y7y Õ˜j/׸ž¯ë5_1¿ý—¾”Þ(½aüyy"°tÓÒM˾v'ü¶ ¢[£[^ø^øT ØT¨F`šitŒåÏÏ×õšOók=­ïún nÍ;šË¿w žô`uÕtÕh=³õìg?\°¬»Ån! ê‘z|®6¨ ÀµOí°;ì²`½¶^ë9Æ1*ø!ÏGWmW-`åõ ú®o+‘ˆIL †FTÜ:`•°Û1ó€Ò+£â*®â *¡Ì Wͪ¥ž)C˜ šT0ãòC¬*V¥WðD¤h+EDVœ†òW實ý˜IÌ?ÐꞺG&=™©ÌT‚9f>3ŸÍ6žLO¦'Á3Ç̱·á™šL ˜¿g×eבÉ7ñ0q?q S•ªÒ³999$RªÕ‡f ÿ'~0r0rP¤®º®¢®ÂókÔçõdxpxP¤à§p* §BŸkÚò:º²dù?Q\¯ÞäŸóT®8]è#*a&LÀÑ}ÌérºÈ8-ÎIç$¨”z©^ÎVuZœ§TJ¥Tê­¸[ÿÚÞfo+êc™ÄTbjÎ>¦í‰ÄÊbešÎ{ÄÒÎ.gf¾÷+(ü»‘&M0É‘s‹‹påÕÛCöP1, è•z£óÏqWê»Ì%èƒü]WØ{½‡,¨Ûê6x¹Æ [–¯×|šλòƒ}]|°ï1÷Åø¡½`ÿn&Á !©IIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-62.png 644 233 144 2562 14774263775 14707 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü'IDATHÇÍ–_H”YÆß™ÖF³—¤2Û´Ë­,±»Äí?”…ˆ‘u‘›.,µ‹AbìZ[An[‘$+Qmˆ µRh]dmY!I&eQ¡5â”®ÕÌ|ç;¿½øæ›oZ¨n››áý÷<ÏwÞsÞsDDdBø_À=Ù=Ù`Ùîïì’Ø%_ýeÙµ \«]«»+aüáñ‡ëëÍ^Ƕãv~t½ˆƒÍgûe‚8O£§Ñ•¶« pVá¬Ø/,»ú Ä5Ç5°é즳MÇ›Žóø:|/s_æ‚cÛq;ß®·ñ¢ñ¥êü"s.æœë1xÆzÆŠ@Ê¢”EÓ6[ ¦ÁÊ+W Œ£Ý ü@<ñ:aû÷<ʶãá|»ÞƳñm>›ßÒ#´0i¡äåÅýiôž„­Þ­^À5µÔÏi£Î¨}ÝH5R ð›^¤FpH¯Ñk¢â¿åF9Dê#xaüŸÍoé‘w{ûû·P[ „B×@ ¨`»z¨2ÿ6ûÌ>´½Dú½_ï=SÏÔ3A¯KuidÑ¿èÝ€Ö=*[eSLFmü0_„_¢}}â|q¾‘Ïྺ¯€Ëyfæ™y¼¶‰Œ/$# üåþr9ýAÐï M M M†?ß¡ªPE¨Â‰sÉôšÞÞò_„ßÒã¶äý8GdCí†Úq†Hú˜ô1zŽ4¨U#çe™ÛãöH\ø;¤¤½äzÉu‘Ô7©oR߈,í\Ú¹´SäIד®']"………"Ó§NŸ:}ªHÞçy‰y‰"Æ{†{D$×=à8:Œ6£MÎGø"üa=–®Ÿáô«Ó¯" Øhz‚ Á†ðºmÕmÕmÕàmõ¶z[á¶÷¶÷¶¶Wn¯Ü^ ¥9¥9¥90·nÿÜ~g”/(_PÚ´hwü*7Ðè·ñõF‡ßÒ#ОЮÁ—åËŠ*\lÄñŽ}òæÉ›'oB̶˜m1Û eoÊÞ”½*ÿTþ)è ôúàëôuú:áž {.ìô¬ô¬ô,¸üìò³ËÏ<³LeªÌ¨Gø-=‰ãÇ™wáùÓçOc¯r #Ã)«+©+©+ìšìšìÇŸs0ç`ÎA¨I«I«Iƒêäêäêdȼ‘y#ót$u$u$E†5Ö©eT?ҢnjÍoéq‹˜-f‹ë®ˆ±ÊXeï$IrU»Ê\e[æÍ˜7cÞ ‘Á„Á„Á‘cÇ ŽˆŒ¶Œ¶Œ¶ˆÜ¼5xkP¤j¸j¸jX¤˜bŠy\ÿ¸þq½È½µ÷ÖÞ[+âjr5¹šD8Äf6;|XÏûöOÔNµ“€þéÝã¢ôDé‰R˜_4¿h~4ÒH#pqÊÅ)§Àbc±±Ø€eÝ˺—uÃìäÙɳ“¡u_ë¾Ö}Q­ü&x'xçƒ{LD¤ö(ÛQ¶#R6›·Æ1ät€T&1 8ÂŽDm^zéÎp†3Q~…BEï!ÎQBƒ1bŒDñEø-=ïŸcfxÎh³Ø,v昙`zL¨õj½Zæs‹¹t¥®Ô• Žª£ê(¨Õ£z@íS»Ô.Зô0›‡yÍ¿žcïŸüÖ¸¼ꪺ `n47Z÷ yûÎ A‚a^ðxÉCÀp8?h›Å„@]S×¢ñß;ù?rWZÍÀnvï´@­S뀾¢¯àÂŽmÇ#- ×Ûx½+?Ù×Å'ûû4_°ÿLJ)¨Ç~…IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-15.7.png 644 233 144 3030 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÍIDATHÇÍ–oL”WÆÏL¡8(ˆ¸Ù€M,B úÁXcµi] Z´&›6DYR7¡]KZȆV$)ÄXBb–,„ºŒ-:A›e%¤+ÛYÑmC%8CPÆÁÞ?÷·f^Þ‰î—ýæýrsÎ=÷yž÷œ÷ž{DD$)2 8×:×:öó=Û¿âõ¯¯ûkØn3À±Û±ûÖ x©õ¥V€äŽäsÒ¶­u+>z¿ˆÍgù%IlG\O\ckÄþöåíË[‘¶?×y×ù€ï÷½ßðUçWTÀÌ÷3ßÌoß ¶m­[ñÖ~ /_>}Š_b/Ä^püâ^Œ{Q2·gnÏ® ÜɆ’%;¦_˜~A9ÀðñÄ«­€?ÖðEÙÖz$ÞÚoáYøŸÅÖ#°úÕÕ¯Š@éþÒý®/ÑDD&ÏÁñôãé@1€vž¿ÑDñ ÿ¢ÿ*¤¿­¿MHÝ7»Ì.P^Ógú€kªQ5ÕF5!:õN½Ô$ÕT¯|a<õ *¥*xÏâ+½^zÝõ%¤®J]e×42þ¼õø­Ç *´ëêß|ȇªOõ¡ácŠ):ÿÏP@;íhÀÖXní:ìÜ7heðó×¢J)"²¾\~—ßÃ?=§<§–ß Üõã‡E=KÏÒ³l¦…”…”…˜½4{iöxk¼5ÞЯêWõ«vÜÒo–’–’ÀÛç zƒà;=»}v;‹ó?…2B¼lñÜðÜp.ãþÖ#Lˆˆ´@y]y¨b³`þ¤÷ï'°é³M]›ºPƒ V VÙ„éô@zrërërë ¿ ¿ ¿&Æ&Æ&Æì¸ÚÚZHÚŸ´;i7¬ÿÓú/ÖŠíqœuœ…Ö¬s-çZ̨>^}´5a=¢~¯‚î;Ýw ð€zwã_YõÊ*BV^‡Ë‡Ë‡Ëá‘ë‘ë‘ 2ŽfÍ8 m m màõŒzFŸ­apCpCpÜwÀ #{GvŽì„̵iߥ}Ghºt1s1S½ ½½½½`ª°ÁŸØŸØ¯zø×ÌÊ™• *"çè·ÚÏÚÏP˜[øráËà®w×»ëaÜ9îwBvEvEvlžß<¿yrÎäœÉ9SSS¶0ý°~X?lÛ¯>¯>ú/ô÷ô÷,Ä̿Gøô®¹®9«mŒWE„µ@ùÇå[ñfè~Ýîè nr“›€‰‰U«+\á PB %QþPdŸ5ƘaÅŒîÑ=Q|ªüDù KXÛˆÝÇ”ë¾ë¾?Ó£y4»™´ËÚeq’Gð+w¹ Æiã´qŒcÆ1㘥f©Y ÔRK-˜Óa:€\ã˜cfÐ ‚:¨»u7‹>Ï‚gÀ5ãšñÇXzþGç/‹+‹‹êÌãã@3˜°$+T$Ažð$*# x„o”÷±¹×Ü‹FÈpî(üe¾g:ÿSw%OÝ•a€ó@ ÄÛ%6Þ1Þ!jX àÀ¶m­/ÿ‘ýž…¿|WFøÃzžç×Åsû{>_°ÿhIv3ÏyxIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-26.0.png 644 233 144 3247 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü\IDATHÇÍ–ÿOÔ÷Ç_Ÿ §G©†±-•a¼¿œ@;­åL¡OkO,®ÒTl†C—-‹"Î¥!´qb˜ºˆV± -ÑN¢F*ÒRuIgXé&(œœŠÇç>ŸÏc?Ü}¸Ûº?À÷/Ÿ¼¾=_ÏÏûËóý‘B_K²%Ùò|жü&ì[·ÒþiЮÒ@Y§¬»µ $˜vlÚ1½3l›q3?²^$ŒÙÏôË vÄ~û™’²Ëá­Ô·Rã~´÷¶ƒµÁÚð8EEõ5õ5üú¿êÿ `4k4 ¶7óÍz/_Êÿ§¿Äœ‹9§ü bŸ‹}NRV¤¬˜õ»`B÷,p¿î~ /ª/ʰ€6ذY€æxa›ñP¾Yoâ™øf?³@⫉¯Špp­w­×Z,è<Áá’š’0ÚÔþHUØ@M€ãšE³à7®ê»õÝÀŸ=Æã–q xªmÐ6à‡Àh`8Âac3þÂ;WÒRÒbì<Áßr£s£­Õ&ùïµý0‡9yÎ<'óÔÀŒõ÷ô÷P ·á0úˆ>®OÎÆ&c“± °G\ØOYdaèýÚUí**pŸû ûCø¿Ï{?ï}“à‡9K)"2wÍÖZk­/ºgwÏõW¬²””óD-V÷«ûÃýÔ.µKí‚¡mCÛ†¶šª¦ª©„*¨ "lN̘pM¸`øƒeƒe<1A|ðl÷lú­×­×}Ñøƒ|ÄX""Rõl­ÜZ cãzÚš¿»Ž»ŽCÂÏ^Jx #óRæÙ̳0vzìôØi(++ƒ©Ž©Ž©X^¶¼lyŒ,Y4²ˆÍý›{7÷‚µÎÚ`mÀØøåÛ1oǘQ=¶â”âà•  ¼("òM 4Ç7ÇCÍŸšÖ4­1 ç$ÚÏÛÏã7K]Ó]Ó]ÓÁu×u×uÒZÒZÒZà†í†í† ¶Tn©ÜR í'ÛO¶Ÿ jÌmÌmÌÇ<Ç<Ç<\2˜:˜ ³ËgÙgÙñŸMï £Î9´è K´%¾'¾'}‰Hznz®ˆëj¦’©(Õ­×Ú†Û†%öÂ7¾¾ðµˆ×éuz"ÉÅÉÅÉÅ"÷zîõÜëqŸqŸqŸéïïI½˜z1õ¢L޾ì¾ì¾l‘¤´¤´¤4‘¤ëIß&}+’ü³”Ì”L‰½ûë›Õ7«•j‘—V\Á?¥uJkú‹ü%êû¨ïqHžâQ<"?mÖ4­I†ÿºðÀ›ÞÙØ¡íÐDjW×®®]-âìrv9»DìëìëìëDz³{³{³EFÚFÚFÚDªOUŸª>&¦¬UÖ*kEŽ€#àûÕDõeõe‘¸ü¸Ö¸V‰ééQžÚµ‡E¿¨T(·¥~Jÿ”~‘¦›»/vKâž§{ã÷Æ‹Ü/è+è¹såΕ;WD¢æFÍš+òpçÃwŠ-=Zz´TdÀ0 ‘ĢĢÄ"‘º¦º¦º&‘Œ 2ˆô-í[Ú·T¤|^ùœò9"ƒƒ5ƒ5"YÿÎÚ•µKE¼~¯_DyLuÊmÑþ`w›Þ…ó·¯}rí£på†×ü¯ùñ¯ò­úaÕ°°raåÂJ¸ì¿ì¿ì‡†G Áâù‹ç/ž'ÆOŒŸ‡Ñ¼Ñ¼ÑŒ…N%õ!Ãê±z|ÑÆ—ž Oh»ƒ:£uNø&|<ÑöhW´+`\7ÚvÐsô=´|-_ËÝ­»u7P@ 'è zð1‡8ú+úV}+h¿œ(Ÿ(ç‰þiHÇtÃã°v[»}Ñ<騔b½²^†CÊìÕšµf`DC•‰ÐƒŠ àlð|Ú;Ú;ø!8ƒ€‚aÛŒ›ùf½‰gâ›ýÌþ“wå3ûºxfßcÏæ ö?¸d¼:CCrPIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-115.png 644 233 144 2677 14774263775 14775 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜtIDATHÇÍ–HÔgÇ?w^žWs¥Ððjä‚ ‡.ÁbŽ„FÔØÑ˜­Æ &GÚüçìØÆ ŒA¹6üK lÁ¤… j¹Ð9pŽ–%Ójc$w’‡;õ¤óûãyí»ç¾·É`öüs÷ùõ~¿ù<Ïóù>""R˜ùpovov¯OÛî÷Áž‚=/|™¶»-p½åzkâCxæü3çží}¶×žtl×ù¹õ"~.ŸöK¡8ïeïeW]Æn‡wÊß)/(NÛ§‡Á7àHšÐx¥ñ ÀW¾º@3Dˆþ0_7_Ž­ã:_×k¼\|iÿ¿¬\3èú¼ùÞ|xþõç_/ý p¿‚oßx”÷(O¹Àz øñ«:`‘EôšË±u<“¯ë5žÆ×|š?­G hWÑ.Øhÿ!_Oº`²³µ¤µDó¼JMø¹hÞ0oXG¬#¤@M¨ àUU«jKªY5X‡¬C¤ÔŠ‘2R fh§¿šÉàýžOh“}ÜØ¿qÿF_Öãl¥-"Ò¹ê¥^²‚FUÄl3Û@MY÷¬{™€ÒQQPÓjZMCNïæ˜LLLð)ŸbaÂ>Ô×k»s¶RDä¥.ðÍúf=0µ4µŒ°ÔOê'–“‰åuËëÀøÝ˜6rdVòaòaò!˜[Í­æVÇ¿°qÁ¿à‡Ù³ÑÙ(<>›ˆM°lhüéñéqàgßUßÕEÖ“Ö=B,ÔjÔpövõš±ÝØógæ/Í_BílÝÙ²³®µ\k¹Ö’Ó˜¾¹¾¹>ØÑ¹£sG'\?qýÄõN< $I(û¸¬­¬ *^©ØW±u¯èWï¯Þ¾ÂƳguçºG2ÂÆÃ¼ÜèèDu$_8»p–TM¤æXÍ1çî5 5 58ÄÕÁê`uЉ‡†CÃ!Hø¾„¶4miÚÒÝÝÝ056õÝÔw*¦b¤x;ÍG¢ÿÏþ?µ°ñ°Àú[ëo©Ë,E_Œ¾Lf¤³«ì*°ž³6Y› Ú[í­öÂ@| >w„¥TJ¥T–U–U–ÁÍ“7OÞ< ãîq÷¸J›K›K›¡v©v©v ¶µoûdÛ'ð°ú¾ußrpÔ®™ðL´·H^0/ÈËâ_3´fHDH\>“o䑼h^,/&â {ž°ˆ«ØUì*–ìòº¼.¯K$_ò%_DŒ;ÆãŽHànànà®HÏÁžƒ=EFü#þ¿HÉç%_”|!råñ×ë¾^—…‰« žQϨˆÖ㱯ÚW]÷3hEÄ‘"×Y‘GÀÊñ•ã+ÇEÌæó¬ZOŸ >ñTyª2_ˆ0d=Í.’DØÛÛ¡Ë árØ—µ/kiJŸ½ ú.}—']ýè*@gsg3GÁqÇq`:w:ÂXókñZ¾ÆÉ/Êÿ§¾°¤gIîľû’±%cËkÇ‚£¯AÞμÑÑ2 'GœÌÜ¸ÑÆdÖü¡x-_ãÓøµzZý`?’s’s„àÂ.×.—¾1˜ð •¿55ƒ¼à:êˆE§è€sWÀ…WÞS«Õj SvÉ.9$‡”•ñÒh ´‚|@ %ÄÉÉ ŸüOÑ«E¯†ê‘oË·é!å•”WÂ{š¿x—7ÞÛôÞ&oøm€ÈnµF­Á¯þ[Pr—,‹+…Œ–Ñ2È#¼°>|H žzü@*©šÓoƒ}}ûú´üâ݈­BˆUÕôé/é/¹c`tåèJðï`‡óÍ_*~©`οÉÿ‰ÿ“ˆz ¾_LöOöOöƒ:¢Ž¨#<7|Û}ïøÞçUç‚s&kžly²…¹ézÓ½éìX¨Ð+zÅ#+‚ý™-„uðiå§•03 šÌßlkÙÖ Å çÎ!säÜ˹ãíãíãí`^f^f^úr}¹¾ Nœ(8J­R«Ô†ë‘=²GBRAÒî¤Ý°ªlÕ…UK:t º¨ýUkukµj‚’â’bð§ûåB1T}ñ}ñÐ|ªÛÜm–‡ÞHμžy¯VÀrÌrÌr V_[}mõ5°Z -…áŒ.£Ëè‚ö íÚ7„í³ó³ó³óà±z¬+ ìØ9°2V,ÿnùwx'òç2æ2ä!¸råÊPe°ÁŠø±ø1ÙΜÀ“ÍÓ–i LŒþ|éçKÐû‡ÞÒÞRX_¾¾|}9ÏÏÏ@Öñ¬ãYÇ¡e¬e¬e e¢L”p¾ô|éùÒˆ­<ê;ê;Æ:xÿà}8÷ÛªµUkÃvÅ?ñÖÄ[ ·nÉAgÒ¤ª_OfOf‡ûßëKfKfa}}î>ºûèî#e²L–Á©™S3§f`ÿÃý÷?ƒÍ`3Øà⺋ë.®{þ¬ Cæ‘Ì#™GÀufú³éÏ"d&Ùésú€yCŒ!FµG©?>|®³‹Î—/;„èþñÛÑoGEòŸÎÆŸâ@íêÕB8ãœqÎ8!m¶F›77ÞÜxs£9ÞoŽWˆTCª!Õ „©ÊTeª¢¦­¦­¦M,ŽË•—+/W aZizÝôºI4|iøRµA!D²ø—ò¶ò¶B¯ÞPoèìBùvƺ » áºýû¯¿ÿZÚú›ÍÞÍ^¼ÛÚ>¸}ŒiÆ4cX§¬SÖ)¨Ï®Ï®Ïc½±ÞXý¹ý¹ý¹à6ºn#˜íf»Ùž O…§NgÎ:Ý=ÝÝ‹+åU¿‡´MµMi²1T’‹º8¼íð6-^5Ò«ô*OyŠ\¤²aÃ<æ1#öª‰&š&Lö9昋À?àÀÄ GÔ“‡O>©5V7 è éúýˆ;Fþ}díÈZPþÔ1Åî{æ{ÆœR£ *ƒ ÿ*¿’_𢦍) ¤+éJ:¨•j¥Z ôÓO?(nÅ­¸p‡; þ .¨ ¬ëb«;ð Ï Ïèz‡;FÓÕç•ß·G·GL…”Ù¥ô)}ÀSÕ¢Zðã =„¾½,°±"x†g„uVÝ«îÅW±*ÖHåß»'öÿ*è®$¿ ¿ ⮤8­8m‘  8Ãâ ด÷•÷ñ‚¼-o Ca¬ùµx-_ãÓøïÊPý`?/òëâ…}½˜/Øÿø@•-–SIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-150.png 644 233 144 3055 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜâIDATHÇÍ–oLTgÆŸþÍ ñÏ‚$°ÝnšlX4ŠI‰1ZL$&4‹mB+‰nIv%´>4Pl¬ÕíM³²ñ_£›ÝÐ46RÛ´¤"ºD‰ɶ1®;ËT‘Äʈ´ v˜¹÷½¿ý0s¹“múÝ÷ËÍ9ç=Ïóä½ç=çH’–&¿‘¿È¿8aûwyþÀÖÀÖßœIاlð½â{åßû`ɉ%'–}´ì#òl7îîOÍ—<üT>ׯ¥òYŸg}îÛœ´ß‡×V½¶*°—?¡GWžW.ÁË5/×Û ¡O°š š \¾xx“7Éá¬ÕkõØÕv5óμé1=àŒ™ˆ‰€1gÍYà;{­½–y>µ>³>ç_ÔRKI<’øV’o?¡Çû•F’Z·@µªµ ¨ßi±Þ±Þç;;d‡ˆ'a°°°R¾îjd7»ÁD `?û‰;iö =ü)ÕK«—?¹üJ-¶ßƒàxp|6ÂÃA*Ár†x272gÍY`ýÚ*²Š<þ™Ü™Ü™\ïïï†É“'7‚ñ¿ñCl:6›„‡¦M-g•²B;}g}ëúƒëÂŽ÷^Üë +œ+œ+œƒâÜâÜâ\X·:ou„úB}¡>h8Ùp²á$dý#ëìaç¥Ã;‡qÀyÃyøg‚¿Õç×绵wêª?qn/|­-/v¿Ø$úÖu^Å«|*b=ý‘Džx¾b§Ø©w$îÏ{ÐÑéèttv kÏhÏhÏØ ®9#sFæŒðaÙ·eß–} ¿ßøýÆï¡<¿<¿áž©ûu¿îøH%È?•*ÿTdUÿd¨?D?Q³²­;¬;ˆÈúȇ‘AæÉ\™ ²D®—ëAæÉ<™²^ÖËz°²­l+›ˆŠïŸì¿Ü™~•ßN¨ïži£iZ‡Ö!„c¿c¿cÛEà9à©óÔEJl°çåy†@¤m²x²¬èF˜*ªÌæFÀT áhü€é6Ýi3gš3Áz€€:ì9à9ì9)Qõâ)—S.§\þõÃê€{Ÿ{Ÿ{ŸµÀwÝ7äâf4O@¾.{d€L•©@`dÛÈ6€‰Ã‡‰·Gy4Á_Îr  ÖÇ.Ž]ùúXÛX›}&à»îëôurSÕW<6Ÿc»c»cû¹ýjãPÕ¡ªCUÖïTW"*—ÿˆÿZµ{Õn˜z­ÒFÓFÞÚüÖæx>ù’|)Þ¿2ëÊ, t÷ܻ紶B,ÿT=UßîlŸ°ç,³tÎR  ¯^ @*©DÈRÏ\³µf+@fOfÀÙKg/ìYºg)@jsj3€?ÇŸÃXå²Êeqhmim;?–´$‘á¢á¢á"P<ŠO¾VúFé¥oÄžLö‡_ ¿ ª¥¢/оX™³2ä“óŸœÐê ¾zò«'ã÷m=´`n÷ÜîøI4¯h^Ë/ûÃ¥áÒX}Å£ø¢ œ(¿P~¡üBlnrmøDøD|Á/k¾¬‰/”\¸l´l4þü×î¯ÝwvÝÙðn×»]3¼3¼o¾ýæÛ@4Fþ!ôMè›XýòeåËÊ—Ùßíª£+›V6­l¢oBgüào<ÄCXüV¾z[õ6€Å'Ÿ8Rp¤`KÑ–"××€Þݽ» ü~€Êƒ•F¯^{°Ð«×^½D›cåH§tb)ÒüÙù³ógÓ§ø„^¢—è%“×ÔU÷× /EPN¿1~cÀxØxµo=ß¹›/ß|À™áÌxaÁ ܫܫœÎF€™M3›€ˆ±ÁØ–Ç_Ì{1/V–~Zjwò÷ZŽ–£åL^Ærc¹±¼®A½eY÷º/¹/Éû|¿é;ßwÞN° ‹3Š3=¸èAÀzßù¾`Ï–=[œ8øìêgWz7÷n8í9íøØÿ±ЧÄSÀú³vÌ#d|ÿø~XZ·ä£%™ö`Ì3æóZoŠôuéëÒ× áøÜñ¹ãóv¿ýÁ//ÖÛWhƒÞ 7Li÷h÷h÷,>šh|e_©•Z¥V¹¶Ek×Úµv¥óio·÷1ïcxmíî’r€³œBæbs1=ô@¬WH$X…ÖkK¬¿þv‹¿²¦gÍÈšÙnwr¯±×Ø[ë±ÑJD‰(q¸c¬kıƱWtˆÑ!„1h ƒÏþþZ[ÜÝ#.ßn_¯.^»f¥YßPõ(Œ1x9Æ1°6Y»¬]„Ô±ÇÏ?žûx®Üeß@·CŽ!ï+ówÌß1‡ºG÷èíx”®JaΈþÜdô}FŸÖµà¹Ï-xNˆ”ê”ê”jï+¶v×xÖxÖÄk׬5k áÅ‹¸Á nĸå"¹H.Šõ·iEÓŠ¦V¡}—»R\).ÿDô¯¥é‰“ÖN&^hIîéDß=}J»¾ãqÚ­¯­Ó®+⊸b@æææ1-öÒK/xS{S{S{­2[“ézºž¾ùIRlNâ›&~~ÁhJÒnÙh·ÛÛÓn¤;Òé¶CãóÇçχ%#KF–ŒÈl-¾g¼g¼÷çÕJjQé%Þ!nc±*ÁOi·ÑÝènŒ¸|í¾v_;"DˆEZÛUÛUÛûì8Z-Ž–Þè¿$©g“êF×EÚí“MlŽj÷ï?¥Ý‚  6Ä´ë]í]í]Í;Sû–= ­B«Ð*ÖÖ%–Ño$ÕÕÄi·Óî#FƒÑ`4 ä)àŠ}û*öYÊg‡³Ã‘Ù£4ÁÚLÑ&ÚD›ˆ~v _R½iâ´dí¾’è|§Õh5Z ˆbQ,ŠÍ_êz†žšÐ„&>;Ì f…0ÎçŒsÚ'ÑÀMI“û¿™ËþmX'Ö9.&nï®Ò-ÝÒ-ÐNj'µ“ÿþÅÔúBoÒdú“òÞvÔÿÖžÑ9}ö™¸IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.6.png 644 233 144 2631 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜNIDATHÇÍ–[hTW†×äR':¨1Ú IŒ¤ ‚™*RÄ&Jk iJ‚W"mµSA|Q¡¶¨U0T¼<4õÁ1QÛÔ[c#Þ*-©šø ˆÓÜæ!‚2c3“L:9gŸýõaΙ3Zì³ûef­½Öÿýì}Î>[@DD&Û¿Y%Y%YSqÖ&7ï]î]þΩø˜Ï'žOí‚IM“šòO柴zÝØ™wê3ûE\ýLž“—Éâ&ÆwÞ³ÔŽ÷Áªy«æy§¥âC· ¯-¯í¹ _üòÅ/?·üÜÂw…»¢K£KÁy§Þéwô2õeß+|Ƚ’{Å3ãÞ÷–”.+]V¶5U*ƒê•Õ+žd?ÉÖY "€Ÿ^ ĉãŒg±3o×;ýŽž£ïð~ÊÀÔ%S—ˆ@Íšš5yÁTCïÌE;ŠžÑÆ!¾â+|úžñØx œ4ãfœ$èGúðBé1Ý£{€VsÌ#©ï!#|ÇNvâKë¥õm^šŸò#/ïíáyQKmzŒN&™wÍ» ?2ÿ6ÿư'´~[{µ¨¤’Jܱíl«Ý:cIgµÞ &¨ L4»Ì® ý4Ïæ»[)"2ç{È ç…ã90 ÐÀ Ð{õ^ÆwÆeã2D>ˆ,Ž,³Ál02 µÑF›šEf‘Y‘m‘-‘-`Ì3Ökt“n"Áo޾ÍKóS~lcÇn×»¿Ü zÀ*Zi…Øï±þX?ºòÝʹ•s!¿)¿)¿ jkka¬f¬f¬†ÿŒ ƒ7 ‚/à øPñuŶŠm0Ü<|sø&dô‡—â;~lc¶CëH먀þÜÖOžÊi1Z XT°¨`QDÑD43 gÎ(„ޮޮŽ.×ÐÕÑ«£WG¡øzñõâëÐ}¯û^÷=  „ÎmîÊ&­ó/ÅwüLì˜Ø¡ÏCx~x>0j·Tëizš ŒãÁx*¶Vl­Ø SF¦ŒLð‘ð‘ð·îTôTôTrssaVݬºYuPµ¹jsÕfˆïŽïŠïrëuúŸÍ·ýd‰dWgW3W$·=·]„""ò—´{"žˆHOyOyO¹Hw¢;Ñiµ‡ÚC"ÓÓÓ"×Ö^[{m­¤Çóäóäó¤ˆ?ÛŸíϺ0taè‚ÈpßpßpŸÈ‰•'ªNT¹õú}›gó?Y"Öeë²çOócócýHDD¦:÷¿½¿çþ‘u±u±u1‘Ûe·Ën—‰Œ=I·’n%ÝâDèà _øÂ7p7€¥çKÏ—ž|_Æ—DETDàîá€x€ÙGö‘}€)Ñ”hJxgÞ™wÈqrœ‡½è?éFÒ¤\•Ë».ﺼK}D‘¡þÔŸúÿý]³Ò¬4+˜'1Obž α±±6VGöóYóYóY@ylyly,pnúÜô¹iàlÔÙ¨³Q@KKK?€ð>¨Žê¨PG¨#ÔÀ'øŸ8sðÌÁ3‡åË–C4{ÇëŽ×¯Ã&¦)¦)¦ q"ÈÇð>¼ï³%ÛéµÓk§×8¼5xkðVRŠ“8‰“+ ¸×w¯ï^0Ý8Ý8ݨ¢UѪh Æ%Æ%ƨ ¯ ¯ ^F¿Œ~ twwmmm@ÖY?fýÄÄÄUEUEUEÀøšñ5ãkV€m‚$A’ )yD>Î8cœ1Π< ! ! ¹òy‡¼zÊP†2Póä<9è‚uÁº` 20202X'¬Ö €kkk ÐÝÝ LÌOÌOÌý–~K¿ˆ<µžZO-àÚëÚëÚ ¬~¼úñêÇ€m¢m¢mâ (§øAñƒâè=¶zlõØŠÜ®™®™®œçpgp†ø3ÕL5S½²@ oxÃ{eŽô”ô”ô@¢–¨%j`yZZZyº<]ž¸D»D»D¯S_§¾NÆ÷Œïß<x6ðlX*\*\*¢º¢º¢ºßß߀ʩœÊb b€”ÙÇìcö¸‚+¸Bü9ÖucÝèM]„.BA‚ù4>OÃrßqßqßÒô}"ýEú‹ô`¤{¤{¤¸Yr³äf  ·×Ûëí”ã)ÇSŽë¦ÖM­›¶,lYØ8{8{8{™G2d&’'’'’ÒöÒöÒvÀsÆsÆs0  Ö¼°‹]‹]‹]fv1»˜]ô&'ûLö™ì3¾hxÍðšá5\ùÓ²§eOËHnXaXaX! Ë.=±=±=±@Õ|Õ|Õ<°£jGÕŽ* ölìÙØ³ÉF²‘ÿW'³“ÙÉ x×y×y×vj;µ°‰µ‰µ‰ì‚ì‚ì‚€ÙêÙêÙj‡p‡`Ðdj25™Ph¦5Óši|.– ˆù"IHBÒé«\—Çå‘܆î†î†n‹·Ö]ë®u‡BÜ>÷6îmÜ ¬ë_׿®ð¢^Ô‹ƒŽƒŽƒŽÀO…?þT,µ,µ,µÊ@e xÀ>`°À³€gÏ€¶ì¶ì¶lÀj µ„žžž0Zã(êòêòêò„(¢!¢Á—ÄB,Är͆|øeà—ÀTëTëTë׿, / / ïsß²1dcˆ%'í@Ú´lQqIqIq ŒV©©ÙÔlj˜b¦˜)ôÁú`}0úsêÏ©?a–0K˜¨ÖWë«õÀ“ÝOv?Ù 8Ž:Ž:Ž £ £ £ !|ƒԼ]óvÍÛ‚þቇ'ž`ŠEÅ¢bñçd³Ú¬6«#KÈÇc}<àáÑ\’LI¦$Síò…‹ .zªâFâFâFèŽüN~'OšçÇæÇæÇ@%‰Ab:è$#É€¤BR!©X%«d•jQ‹ZÀ¸Í¸Í¸ `3ÙL6àê¸:®ú§O#žFà/•ƒ•ƒ•ƒ¨“ɇäCKñ”¥,eÃþ‚ Ø€ }æ*s•¹Êv2˜ Ì…—Æ…qa|¿IÞ+ï•÷­Zµ>¢½c½c½cøÆn½Ýz»õ0HÛ¥íÒv@!‹E²AÙ lðÿžÁœ¨õ£~€4Cš!ÍXÔéZt-º(î”ß)¿SÎ{K†%Ã’a`¹ý;%HI"û¢E(âÜ­mžeórßÈý\&—ÉåæÃl›Æ¦« SR;];];ÍÒzh=´PXLÍ¡94@&2‘  Íhp §p d€ t ÝB·¬hÑþnýÝú»õ–œÙk³×f¯q—¤îRw©û7~Ÿû}î÷ùÅ&œÆiœ&70„! ñ±¬R©T*•°Åæ0'8‘@HɧW¯^ùa6E›¢MÙÀ,W8äî«øWñ¯â-9aaaÌ<Çs<‡‘¤“t’!A $4ˆÑ PÒDšH¸M‡¦CCw4551ÿ´Ûd·ÉnÓ‹%ó!ó!ó¡äÝÓiÓiÓi:žÜ'÷É}rÀúb'ÄÆYo«…UÂ*aºÇ»Ç»ÇÓQÓQÓÑŸÚ:Ù:Ù:T¨Ôj¶¨þýú÷ëß§;Èar˜†TøZøZørÈ!è£sá Ox¦5Óši ¾iiiƒí¤í¤í$ DBĉO—¥÷bÉ*ÅKË84A<€ˆ¸ïYI¤Ö©µDlЀK‰"Q$jÇžå_ަ[Ëޤ ©BªÀlºt!èÞú…~¡ f³Ù#ŸËçò¹~áû…﾿ÉÈÉÈÉHvP" ‘…E/4Çþ-” ¥B)w £Å(ÿ7Q"Љ…õІ¬Úͱj÷)&Ť¸ù6ÃÄ01Çj¡‚ *¦DmV›Õfþ¶L[¦-ƒ‚a†a0'fâ¾á¾á¾Aп(}Qú¢””’’zvÇøÒøÒøòÔÅÁ7ß|°Ї¶BùV@,> °:x€£8Š£äVÀ÷ß|_´G–-Ë–eS0ë6ë6ëÆi¿Íû6ïÛÒÎ¥p)\Ša«ÏfŸÍ>›™k¼·­£á·\,~ǬoöPjCmÈMnœÜ8¹ÿ°¬·¬·¬ÈK}¤>RŸ÷J^žŠ}ëü½¶OÛ§í£…Ý×»¯w_·l[0/˜ÌìQÉvÉvÉöãî´Œ–ѲÞRHÙç˜Á f„µb¬‰âËCðö;ÚÍG=êQo9Mki-­U15L Só/Ÿ¥Ä¥Ä¥Da£¤TR*)eúX«bU­Ë]ÒŸ•š!ÍfˆÜ\WÁ•^³úU[õ¿ÇÁàì7Úu°j÷4ã0sIÉ -¾´žÖÓú“Yr¹‡ÜƒécGÙQvô¥‡p^8/œ?4ÞŸÜŸÜŸ ,ÂÇêOl, Äñ¿9TFœU®‚IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-177.png 644 233 144 2675 14774263775 15003 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜrIDATHÇÍ–_hTWÇMÍÄD¥¢5ÒZ*]L¨bJj5UÛBª…€A7Qh­ÉJPJTèªÓRÝø°­B7±XŠ”¾¤˜1L¤›¤,KÔ2³ [Pg›ŒÎ$“H'÷Þs>û0÷Ì×Ýe=/÷þþœï÷{Ï9¿ß=""Râ>òžÍ{6oQÆÎkòü¯¼Vѱ»ð½å{kì,þlñg¥_”~¡n{¶‰›üÜù"~.ŸñK‰xŽ—\öÕ¸vì}iïKË2ö®ƒ¿Ïß7kCó7Íßô^ì½È{Š $j5àÙ&nòÍ|ƒ—‹/ÿÆ/ùßæëû,xjÁS"Pþjù«Ï½ŸIøûs°çõ=¯Ü™wgžÎg(¢H×)R˜ϱMÜÍ7ó žÁ7|†?£G l[Ù6xó7ßñž™pûKìÀŠÀ Ãgõ±‰C¢ˆïìQ{øÎñ;~Òú–êR] *©’ 'ÕuXa·Ø-¤õ¤5aM€¾ÏÇ|L‘þ›‹w¼õdëI#ðö—üñäIÿçF·•JDäT-ÔK½d…u›ýýè¨ó“ó–ÐÌp{ü¿C'9‰´ÒêáCý²úeFà©Úœ­yáSðÿêÿ55"3‘àê@ëaÎþyvpvœß9/:/‚µÏÚgíƒÉŽÉŽÉˆïˆïˆï€©ê©ê©j˜››ƒø…øùøyˆ7Ä?Љ»÷_¹ÿ ;¡B*DD'¢ÀÿŠÿJj¾Ñã ë䟇›7›/QëôVkµ§_%¾BoܾqÛÆm. —†K!|#|#|Š-> •Õ•Õ•ÕP¶½l{Ùv¨ÛU·«n”¯)_S¾*_®\[¹ò/æŸÿ=úìÈ'×>¹æñ9÷š64+×5è û±•µ=+{VfWþàìýé3ÓgHojÛtdÓ¯vû/ô_è¿àíÑôÙé³Óga°p°p°V·¬nYÝÑH4€Õoõ[ý …Æ ¼¢|yùr¸ó§_¶þ²•´áÓgº?ìþÐû±U`ÑÀ¢}™™Øó±çÛnêµ^­g¹óŒó lXºa醥ЗêKõyU˜û£û£û£ÜÜÜù?âG‚ïßõüΤy‹­­£G ´¸´XÝ‚øÝø]àr¦ìµVjÂØÜ¶¹msôîîÝÝ»Ûó @EsEsE3<8öàØƒc^|49šMBÅŠ Ù™ìLvæ(^ì¶™ßâ?Ç£'OD]UW}·{½GD,)ó­’9™“ì˜kŸkŸk±¶X[¬-ž¿{ { {@¤*^¯Š‹,9±äÄ’^¼çfÏÍž›"U‰ªDUB¤¤½¤½¤]D]t9‡Dd"Ã'ö^{¯ˆÑ“'’ªIÕüõ/â ] ]‘Õ""ü^ªt±.ö¤Õjµ‘UUUxáøÂñ…ã"ÁÆ`cP…¡ÂPaH¤ñ\ã¹Æsžß÷4ÓLËœÌsùÄå7z²UÉáã‡{UvÊöÎ’Òæ¨fRP¨{„F€1bÿ¡“& nLƒ¶Ó.2jÇÿHU¾ð)øcþXj>:bE,pIë@T€‡ê :­Nƒ¾«Çõx޾Kê’ººI7é¦Çõ¨«êkõ5è&ÔAu^ç!³?âDÈò?ÚÇL£=U õõ¹Ù ;a`V½­ÞÆr{¿ Å4Óîz¦Ñdc3n~Z5¨,p†œ¡\|Ã÷Xçÿ/ÿJ+Ù¾fõtRäm±Óà4}]_À‡<ÛijGÂoð ¾á3üÙå{»xbïcOæ ö_Ý>•÷·4IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-25.3.png 644 233 144 3226 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜKIDATHÇÍ–ÿOTWÆß™ÒâWAP³»µ$ ©hŠ¢Rc¶°â¢@…Öi‰†nw7Y¤ê/»FÖÔ©$ÒX¬A;uª¢É¸8V\¶â—D6¦RÝÅMìªd¦ 3÷žÏþ0s¶Ý?Àó˽ï{Þ÷yž{ϽÏ9""¾ XXXg…bëöH~ƺëRN…â,oXÞèù3Ìþdö'ñ'âO÷"±9oÖOï‰àOç3ó'‘Dô¹ès–œp\ o½òÖ+3æ†âÚ°·ÂŽæÍN»ÓÎïáѵG׆s†s ›óf½ÙoâMÇ—êŸð‹Àó_=ÿ•åßýBô "”—”—üÇPA2üðÜÏ)+èn –X•Œ2Š9<Óbs>\oö›x&¾Égò‡ô$f'f‹ði‘·Èk;j¸çà³*{•Ô?çÙ;±€ò77ãWÓÆiPnÃcx€ªFÕèz~‡€ZŽqŒXõMïdÕ¹ªs¦À{>/òùmÇM=ò¿kûq./—¼Vò¨%.ÀÀUm¼k¼K@u«&Õ„šzG>Æ'2~ćoZ<[ ©!”ú±ÈXDc TlCIyI¹)ðãÜiK)"²ø0­¶/l_ŒFAÿ¢þEx€ßºç?Þõx¾@WÀðFøžZŸZŸZa°m°m° ܻݻݻAÑcô~6\¸ýØþØŽ/ø×>ôö×mN›s4ÊÔ#*SD¤¡Þ?øþAxú#€±|ÃßòO柄Y»gžu•óYN}N= 8HOO‡ÔÜÔÜÔ\H[ž¶šùHÄõmKK¿$ÖLÔjµšÈ–£[¶4ˆ Ž Ž Žˆ8J¥ŽR‘Š*ˆ4v7v7v‹x6y6y6‰$%$%$%ˆ8ËœeÎ2‘öäöäöd‘m‡¶ÚvH¤sf§­Ó&2ü»á¼á<‘Ùýq{âöH¢ˆßç÷‰ÈV¥)ÍrWô?™ß˜«ÌU—îÞøòÆ—ª|Ýæ×ý¯ûñ¯w­oZßËÔ2µLA«£ÕÑê€#k¬=²Ve¬ÊX•gµ³ÚY ¼ÙÞlo6ÕÕÕ;ÆãŽW«Æ+ÿ³²oe:Vw¬Îü†U9gN=}h é ÛEC'TäWä› `,ýŠ~/Þi¾5Uò·©ÑN;í@!…NË_àE€ÀTVñ/=QOêL¾ŠýûÉð_‰3ìcØúl}£Q꛾}+@ÿ(ä3zϤwÒ‹OoÔ¿Ó¿õµCí½GïÑ{@ß®o×·ƒQlÅÀNv²Œ…ÆBc!°ˆ—x ôzýš~ ô}“-“-øŒ_„}¬­oqßbÛ÷¶ïG£xö±Ÿ9ÿd©¥Ô …Ù«·ê­Àc£±qê©„ï'~âô Áƒ'\ e¼c¼C€ ýª~uÊv» 4º4úÿ:x¯¤øíâ·§í•|ðâ/Nœ>äCb!8зê[ñƒêPX°@$6çÍz³ßÄ3ñM>“j¯|fOÏìyìÙ<ÁþiZØdØŸ´IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-65-grey.png 644 233 144 6334 14774263775 16022 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ‘IDATXÃ…—iPT×¶ÇÿûœÓœl°Pmi¡!¢¨´˜.y5Ä‚¤‚& èõª”¹/%„‰¨7&”˜ä9 * ƒÑV¢Òqz-c‹…JÀ‰nÝôpúìûno•·Rw}9µÏ°Öo­ý?{¯M 1ãf¿0 ¹‡ÜCî!m(s|÷ØýÜý¾û{·¿Wþ]ñÜñÝÎUÁ8êE½¨—øÉ!9$'h?ıA-‡ÍÇÍÇÍÇgøø6ú6ú6:?IîJîJîb‘úH}¤ž¤ñ|_ ¶a¶A ,°XÕX €Åh ´"M¯ÕkõZêhmm?y™ò2åeÊû{åAò yЩ3Ç™ãÌIÚOsi.Í}øLjÛÅíâvñ£ct,pëÉz²ž-Áöaû°}xÆÍÍÍ!6Ïšgͳ²Ç+FÌ| ŸÂ§@SÅT1òñDGãh ˆâ FŠ‘b$ä|ŸÆ§Ap¿ö»µß­ýŽÝ¨ySó¦æM!Ön±[ì–wX«`-Án7#ÓÉt2 ™"™"™òÙeËEËEËÅKÔËÕËÕË…´ÜìÜìÜlîºwww&9—:—:—xŒÇx ŽQ1*F Õ¨ÈUr•\Ü÷™w™w™wŒb£àЄ&4J…R¡T`RîÖÜ­¹[¹ëê•ê•ê•Bš¥ÁÒ`i˜±ÄÍãæc„QaTMc?g?g?—í›á›á›Aƒ3NeœÊ8Ź52BGè{’=Éžì«ì«ì«!DB²œ,'Ë(¡„£Åh1°ñ6ÞÆvÑ.ÚEÀg³Ç¶}¶}¶}ðrûÏÐeè2tÜ ßTßTßTìæqóq4”†ÒÐ]+ ‡Â¡JJJ<ñç‰?Oüâcñ±ørò6y›¼ Ô‡Ö‡Ö‡7£nFÝŒØmì6v°x`ñÀâ`ÿÿþ@·±ÛØmŽeË:–°KØ%ì@øJøJø àkùZ¾Ø4kÓ¬M³à¥¼£¼£¼Kü¦øMñ›\__H%’À]+!X‚çå)_(_(_`÷ o$¼‘@*Q„"Áƒ™ÆLc¦×–_[~m9pmÞµy׿«o®¾¹ú&bH1¤€»Oì>±0F£d‚LÌÌÌÀG½õ~Ô ä¤æ¤æ¤+V¬ ÉŠdE2ÜæÕÕÕF*ÝÎ6d² áÛˆÔˆÔˆTÈZe­²VXÄB±P,„œÀý’û%÷K€‘ "D3”3”3”€ß}¿û~÷ß?|ÿðýPÌSÌSÌV?¬~X Ȭ2«Ì <7>7>7Ò,i–4 ˆ˜1'bÀ•så\9@§Ò©t*8Y¿¬_Ö‹ê-Õ[ª·Pp{èöÐí!ìaãÄ81NÜõ·©eS˦–!,Ò+Ò+Ò I$‰$ŒµÏÚgí®$]Iº’¼}1úbÐ~¯ý^û=p¥ëJו.@æ9d ¼<¼<¼ÐNÑNÑNÏ<ÿñ|€fÒLš \o¹Þr½¸óå/ï| DÿýCô€äŒäŒäÌ«Ê2íÖvk»ÌÀ7È ŽõgýYzzdîÈÜ‘¹ä ÇoŽß¿a¦$@ %çÈ9rÄî°;ì@9M9M9 XµqÕÆUÌÌLà›Eß,úf ñÕøj|ÒÒR`4}4}4P%¨T €±ÖXk¬J÷–î-Ý t8;œN ш¨ ”5ß6ß6߯&IcÒèiFZ*-•– &?˜ü`2=}Ï|Ï|Ïü*³1~3¿™ß L¼<ñòÄË€ºCÝ¡î&ÔO¨ŸP¨ÖªÖªÖÞ¿zÿêý+ðôÛ§ß>ýx¹ëå®—»ïVïVïÖWþ WËÕr5àççŒqcÜ÷¯x†í†í†í€¡ßÐoèÇÒÒÒBƒ d £¨Š+ä ¹BRМҜҜâT¥ ¥ ¥Aî^>Â2Â2Â2€Öó­ç[Ïíáíáíá€vvv ¨• 4z^£&5Lj˜9ìÃ>Àa‹°EìNv'»àLœ‰3Ár/æ^̽¬<Þs¼çxÎËzd=²k e)KÙÙ+†0„u¬ã˜*¦Š©buhD#ûcÄX1VŒÍ9(o’7É›Z ]¯]¯]Oÿ+psàæÀͤ:òzäõÈëH÷øÐãC!'GÉQr :ª£:€Ü 7È ,X°8pà~)¿”_ ÀLÑèFtðºpüÂñ ǵÄGâ#ñá0Þþ푆4¤u¬£´‚Vp®6Ï3Þ7r»È~²Ÿì¿´I`˜„Oê‹\ä2ÿ¨—ÔKê%ÂzÓ¦/L_@NŽ‘cäFèz†žH ‰!1Dˆ8á„À×ø_TC5TóJ‹^Ï^<{ñ¬s‹ñ ñ ñ w€ŸÆOã§U—hJ5¥šÒ½-ãù=èAäîGèCú„vä#ù¤.¢6¢6¢¶b™4Oš'Í«.1ú}¾œéŒçÏ3žÎ-î€x†gxôÐCÀÛ+4æÑzüŸV§Õiuäy§¼SÞ ˆjQ-ª7^岸,.kì­à˜à˜àfÈï¿Ý;Ôë\,þÄâããããã!¸†zêA=¨ùë`ø`ø`8¾wNwNwN¿!ðÁ|0üî?ž%=Kz–äSkê0u˜:hùÝ#wÜ=âŒuŒ:Fl¾d¡d¡dáßé!zˆ:y¶íëW‰{Ä=âžõ¿wfvfvfã€vù;õgSýºýÌÞ ;jÒM˜IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-7-grey.png 644 233 144 5675 14774263775 15745 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü rIDATXÃ…—LT×¶Ç¿{Ÿf˜Qth"ŒQ{A~VÀ>À ¶¤€ZC½ÕÛ_‰Eâµ>ž5¢V‹5ÁšÒÖ[Z1ÍC´imñ‰àRDZж,ŇÊAJ ø‹Æ™9g¯÷çé}M×?;ûœ³×úœµ¾{}X^^^^^fbÜãOÒõêzu½T—÷uÞ×y_S`Á`Á`ÁಧÈB²|øŸ²U¶ÊÖØ7ÝÕîjw5á â ËE8 èð&ÞÄ›TdXeXeXÅruýº~]ëA6ĆØÐ;eùùù 7 ×®-\Ëä 9Hbiã¢IåšÉ'‘ˆD~DˆQ š<£žQÏ謸‚š‚š‚š#}žÏ€g þâØÓcO=û¶yŸyŸyjc—Æ.]Êrãõñúx=çççhsí¾ö¼¶^ó7á_§Å×x4>šÁgÉüÈO¬a™,“eí“‚¤ )èÜ¡ÑòÑòÑò¿ø?QÿDýõÊ–¥K;—vroT{T{T;[aÈ5är1†Ø0a c°ë°ÀlÌÆlŒ¹ç¸ç¸ç`E{c{c{#yφŸ ?.¶èßÑ¿£ ›«›«›;±]lÛá§ÅÓâk<ŸN‘Cä¿f[ª,U–*E'G'G'³R•G漑78…S85 :súÌé3§™å™å™åUR%UìKö%ûøÕþ«ýW;0˜>˜>˜¼ùRäK‘Ó3=Ót›nÓm€ò@8áÖG‹îþ¹ûçî£h4e4e4å¯ÙØæÜæÜæEGY|d1i6*Þo‰·ˆè=¢GD$“L2MÚÏô3ýL$Vˆbݤ›t“ÈSæ)ó”-(ZP´€èŒýŒýŒ}r™(E¢ˆˆÜä&7ÐMÄSãk<ÇìÁÎñcüØÄ›ð-¾Å·Ì0à @‚i2£HB’4¡ M"àÂÇ>¾ð1à±z¬+ðœý9ûsöÉeš†'6™zè\ÅU\ŒÏ3xÏpp€…sÉ*Y%+U/^4¼=òVy«¼ûýÀ~M»á†{ èø_ÌÉœÌ ˆÛⶸ œ9?r~HlNlNlL ¦S@Ëi9-P T ÀC<ÄC€u³nÖ R½K£WF¯Œ^AæÁ<˜*¹ñ#ãGÆä➀ž€žª¼Vv­ìZ€X€p‰eb™XÀ “mh¼ô“Ü555€³ÍÙæl¢K£K£K§¼Øgø Ÿð ïd&é zƒÞp÷p®[+o­¼µ°Ý±Ý±ÝÁÇÆc±G.æx¯âÕüƒº<]ž.å6ø7ø7ø+ÁŽ…Ž…Ž…0q37s3†1ó0oJŸ<Ó8=ÉqµòjåÕJ °;°;°ÌÌ̘RòÖÃz¦€—£å«a5¬ny¼F^ÓiÛiÛi›Hd6fc6ü7S˜Â”C><ðÇÀü`§OŠOŠOJ¹ýA܃¸qÒ­ã[o=¾UÙ¬ºõ£\Ê¥\¸‘Žt¤ì!{ÈJ„¡DÔIÌ-œ[8·pJ{†ž¡g¤"©(PšM³i6Hͬ¡úýê÷«ßcö£ö£ö£ü‚ϧ>Ÿú|ú¿«½}Þ>oß/·Ÿ±Ÿ±Ÿ¼?yòþôÎ)ó2ó2ó²_uVtVtVHÅu¯Õ½V÷¥² lۃ轢wBK fj¦fàÇ+ŽW@J`J`Jà”LƲX;¹))’")`©,•¥Âu-÷Zîµ\üíbÔŨ‹QÜäkõµúZ?/E¢H\½Tª’ª¤*×,Îòƒü ÔÂ÷ò½|ïM¢[t‹îL©ÑÔhjƒƒƒiAûÛío·¿£ü¿À/ÀEqGq€Î¢³è,@LkLkL+à_â_â_2eóíÇ~ì4é°^ÖËz1¶ïÇ <…§ð”-ÕÈB²øþVÃj˜¼ÞQà(pÀÄ.³Ëì2†Çû+@ói>Ͱ ±pÊæ»ŒË¸<±Y´¾áW›S›S›£lÚ>´}h»®Äj5„- + + +úäò‘|Vnt£[^¢GÍèCúäÈArXõS'Ÿ:ùÔÉâ¿³ÙÆì£…C–!ËEç8>ëø¬ã³&µ;ÞçàfÕ¬šU¸Žë¸>E£ ”@ ¸à‚ †_l¿Ø~±Qê¥ï/}é{©Ø`0Ø{Ê=åžòmÜÈ¿‘# ÙȆª›Ãè˜:ÓÄ41 3Ú~kû­í7À“ãÉñälûÀl1[Ì–ÞcãmèÿÑî7âñ ¾ð…/@Nr’`2“™ ×=Û=Û=ŽÖÇÔÇÔÇ`†yÀ<`Ä"±H,ÚöÁ¸ôìU)–h' íÀ´7WI êT-‘TŒzÔ£^ÙÌY"KLýûø/ǹSÞõÞõÞõbcºHé‚'EíÚµ«D‡è0ñÁ#à–så\9†ÏC?ýò>ò>òJ9ú$}’>ië*£2*ûŸÚñ® ÝÿÖ‹ÙZÔDÉ¿çaøûí u¨Sò©šª©:¹›Ÿà'ø‰ŸB¯|¼òñJ©/Õ—êKùM)KÊ’²Îþ+ôDè‰ÐË’mݶn[7û^̳Ä,:¤ú­QÇþˆƒãOìwÚUÛ…’ Ø€ ºV¶–­ek¥:ª£ºwÖù>éû¤ï“ü¦Ô'õI}wžŠŇëëXݱºc50ˆÕŸv°týÇÿA $ž’Ê(TIEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-centre.png 644 233 144 216 12610450011 16406 0‰PNG  IHDR Vu\çsRGB®ÎébKGDÿÿÿ ½§“6IDAT(Ïcd üg````b øOŠ¢ÿ¤˜Š¡˜‰ZÎÁ q˜ÀHŠ•x@r<¬…Ô¨ ”q†1IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-79-red.png 644 233 144 4242 14774263775 15627 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜWIDATXí—LTWÇÏ}ï ˆ‹EQŒIJë$P²bIÖáÇ ÍNM4¥ƒDë?T´cÓ(Ð¥Z)VŒ$E!dµÒÉÈ i¨š¬ae­hÉÆ_mÔ–&fÚA‘FÞïþÁ¼÷f&®f³{þaνçÞóy÷|ϽhÒ¦S˜qË¢ÑÎh' ÄFuDuDu,_*H‚$H?ü•2)“2Éi¥ŽHP} ÜWêÔxu½ºŸºx>nY8O(_UP×>Ÿ°@è:„޶glÛÅvi qñCñCñCøÛêû«ï¯¾¬y¼æñšÇ@±¹Ø\lÖ}u^W׫û©û«ù^ÍCÜŸÂýy_rÃÜ07ìÉTO(¹<¹<¹\ú°åZ˵–kÊTßSßSßSÑŽ½Ø (žàĸ|dmEª’ `\vÈ=^´KvÉ(Éñr<|j´¥ÎRe©­j~•Gå#Ã#Ã#ã?ÿQ 00n7nWRÝžMžMx®BH_ z=0Z2ZÀ75džÀ`Ç`Œ>}ˆ}¢€o¨i¨ &š'šé ù‰üDÿH÷€[vËxn<`üÄø‰’ªòh|Âa‡°ãúAuâØ†F[£MÙÜÀ/¶ùÈG<7y.€Àd@‡é0ÄìÙüþ Ô´Õ´À@Í@ d ™0Ù†3«fV@ÇÝŽ»€ØúQðÛpì½cï)[µ“ ã#Å¿8~qübÔ=[þlæ³™úqÀ„,dðuÆuÆ@kkk+œ;î<T§T§Ëd™psÑÍEðNÎ;9Ò˜Ò߯ý~-lqmqðM­œZ Àôdz¾g˾øPyT>ôЪë¯:¬™ä’\’ €^x8@Q%ôÌ’Y€ÝÓvO çÎqçàÄ¢‹BLJƆƀ¥³tÞVK«\¡1ð«<*l©†BC¡¡Pë±hÚLÛhͦ7è "¢ Ó„‰ˆˆ1ƈˆŽ¿uü-"¢Ÿì?Ù‰ˆª?¨þ ôYh_h'":UtªˆˆÈwÃwƒˆèë_/ "ÂÏø™ˆ¦z=DÔvýDÚ í†v­åÕûU)]Ú°´aiŒ±16ÆœÅYœ…‚MŠSqzÊ•r%$x<Pu§ê^b¿Ìþe6˜zL=0=jz$M:¢õšW6¯”ŒÉ«B«Ó ó ó íÂ/.(vk·Mž'œY™Y™ü[¾Ûò](˜X „úÞ“Þ“Çò_°ÔÏÓ.¦]äæÛ·õR—ß,;ZvTök€›ùÍüæ{%“~Œ—Â-¹ÑaÈ0dxN¨ lÕ6¯Í«Ÿ§8£?¾? ¸¸ª]ÜÄMÀ-Ü •Šì“}àËòeÒ†ÀÀþ øOŸ®?]wµ'´–«åjÇ–³9l›³¨%¿­õ×z¶ž­/hbæ`U+òvg—ó3çgpjÚÝ-§Ëé“ì0ŠÑ@E©Uj@™¥Ì”|å¬rV—RŸ£ïó¾ÏÓoâÅÚI~Ê×ð56‹†f%+Y£ÎšK¹”+|JmÔFmD¼—ïçû?<¯=­MÆJc¥çþØuÇ¥w¹OÉWr•ÜP@L`€?è;± Ë¥DΖ³PÃÖÝXwkÝ-i·ö#ˆsâÎĉ;‰8 gá,ìLnƒŠù»àßþÿ€À.¤îIÝ“º‡ÈPn(7”;÷kÚ͵äZrCµ+Ûdp '€A b0¤ÅæKó¥ùº²²²•|í-3ÄâúÆ&}ã”ðJ³ÎˆÒ‹p¯†ûÆ)“ÚuŸ Ñnµ­:D»qbœ§Éýr¿Ü¯k±½èœ1½1½1½ÊjM“±\,ûþ_"¤ØÁM¯à"´»ú%ÚírvéÚ»Ä.±Ko¥‰/_$iCiCiCÒ4-¶óí|ûÑUjAéE¾A¯1=@Ý@×®—÷†h·ÞXo¬ãÜ·Ãí@ ©¤¶ ¶ ¶ úµ#4 MBSoð_’˜Fä ŽÓÔ×Fšºàý vÏý'íæ­Ì[™·R×®3Ç™ãÌAëä¼¢U‚•²RVZ°/< 7‘—Ñi¯Óî2¾–¯åk=Y*péÒ¥”#éãéãéãâ]­Ô^ÞË{mÉd';Ù)xíðîˆ|Ñô?Z¤v÷‡ûyÿbÙF¶ ´‚VÈ ¹$.‰K1bô«&¿Éoòñ×ùëüuö÷àÂ’ˆÊýß,NûUH…T(ü>ýñNáNX'ëdOæNŽÿÞQWľ¯-õ¿î£­]›ÝôIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-68.png 644 233 144 2547 14774263775 14720 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]HTiÇŸ±õ ‡ÉXMÊJìÓb«Á®¢ïí“q©èë¢R/B°b‚(6¼(Ú¶(©A ¥B¡È>.ì"©t‰Ýva«-tÇv œ[Bm5õœ÷ýíÅ™sδltÛÜ Ïû<Ïÿ÷œçœ÷y_ÉNü ¤LM™šâ³ì”=îzÆšŒ53®Xv ž2OÙ³ï`ü¹ñç&4LhP/\ÛöÛñÉù"®~2Ï^—lqÒ[Ò[<Ëö1Ø4oÓ¼Œ\Ë>ù2odÞøÇ€Š›7®_¾~™½ëŒu¼[þn9¸¶í·ãí|[/Y_Žý‡/©wRïxþ‚ô´ô4(X]°zzµðçtllx=îõ8fàÅ«—ƒ bÿÞ&Ù¶?oçÛz¶¾Í³ùV=9Ër–‰@pKpKf½•ð¢ N980ÆnuÔáåªqѸú'£Ð(d„ïõj½€YÌÎêr]úgc¶1›ê3ÆÎs¯«—Ðwx6ߪG>~·§VAyFy00Öækó5pØŒ˜ÆT«êVÝh»Eú}ZŸ=WÏÕsAu©.u:ˆþZ/ÑKЛ§ÍÓŒ9`lýÏáKrAE?Bf,36øt™]&0ÀzzÕJµ’!dä9FôíïÛß·F{G{G{ÝBFŽ= ñ@<€1ϘmÌvý¶_ÀÕþ«ýN£w5›ÇÑ5ºRWº o¬l¬l¬„Å‹;wBÃÚ†µ k]ÿÙš³5gk D•¨aVa•ôÆ~£ƒ ÍÜfnKì}ô.—oÕóé]ùÁˆñ¤]TÈd&¸À…$P/½ôÅS ĈKò÷ÓO?ÐBMIzÚ0>½+?=ÇTbÎhµ]mwç˜ò©t•f…YaV€Z¥V©U@-µÔ‚Ùn¶›í`†Ì5Må©< ™ç<PûÔ>†¬à³sì&?Îäd>P»Ô.ë<4œ3Q»S.Éá=ï“Öœ|[ﳓÿ3g¥%p8Á ¼` ƒö7¢èxð€kÛ~;Þηõ>{V~±·‹/ö>öeÞ`ÿ„LÏÃÌùæIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-77.png 644 233 144 2360 14774263775 14711 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¥IDATHÇÍ–MLTWÇÏ CPCÝ ãHÒIQvn$©Jñ“D Q‚B\Ôn,v¡ea‹¦M&W(´( 1M¿F¬1’.ð£àW"flxaa˜y÷þº˜wߊحw3sÎÿœÿÿsß;ï ˆˆHÀùÈZµ:kY:Ϊ÷ò¹Ûr·…:ÒñY|•¾ÊÁ`ù©å§ ΜSO¼Øà¦>³_ÄãÏÔ3y ˆ—ÈéÊéò•9ñI¨Z_µ>÷³tüÓð÷ø{¦RÐp¥á @w[wß@ô^ô@¬,V^lpSoú _&¿œü¾d÷e÷ù^AÎ’œ%"ÜܲöÛtÁ³µ°kû®í#‹Fé,°G|òu0ÁfY±ÁzÓoø ¿Ñ3úi?…› 7‹Àžê=ÕþÖtÓßH55½d¿ÒH#ùúïäXr t,U–*#¡GÕeu(ÒEºLìâN=ß§û]>—ßÑsõÓ~dîÙþü%ìÍÝ›ëúìkö5Õ­ºI:€ÞñŽ­L\ƒök?IÏð=£/™†>ÿüQtb1 ÙC6Ð@ènÝÍûÙ¯f̓Ñ+£G/‚Un•[å/—ÆK!>Œ‚uÞ:o«Æª±j ö&ö"öf~œé›éÐ;ôÞsßð;z®~Úcìl?n:Üdv¢¾°Ot%º¼_m¾Útµ Õê@5———BáÖ­…[¡bgÅΊ\\\ÅŠ7o€ìöìöìv8}ÿtätÄ㳯%.$.xzž~Úclà;èŒwÆÝ¾ƒôÙûì}$LffÓ̦™M0ucêÆÔ è÷÷ûûý°æèš£kŽÂðÐðÐð$¯'¯'¯Cd02„`( †`¤u¤u¤Õ;gÝ” ¦‚†_ôôÓ~–Ý^v[wAtctcæ#¢ïé{Àsžñ T»jWíz`øÀða—‡ËÃåó0?>>âåí˜=feð»Ëè§ý,-XªƒõÆz“ñÚ§tTGAM«i5íµ¼x9ðB ¡†PŒ;1vÂÃŽ?8¡ºP]¨Æ[Æ[Æ[2ô3úµ~9fŒ~ÚO–ˆêU½¾Ç"©Ý©ÝbV¡,–WòJ„¯©¦ÚÍK‡ÕauX"%V‰Ub‰¬h^Ѽ¢ÙÃ;u>ê|$R+‰•ÄDÇÇÇET›jSm"ò¼•·"’+#2’¡çê§ýd‰L”M”ýõ§Häf䦩ãØú©~*³¾Z_•¯Êλ•w+ï–Hm¸6\–y+/’É‹ˆÔž©=S{ÆËûVúVúVŠÈ"IJRDD?×ÏeÖÕsõ? ½•šHy]£˜&ãHyÀQ¢D?0ÅæãíL@Ðsù|+?0ÇpæÌ¤ªT•¼w)zÕ%u t½®×õóý¨^Õ«z?€O¹ûÕ~—ïÿæØG'ÿ]û.€:¤‘dÒÙq‚IçÿÜ5éLü¹¸U§êHz|†ÁÉ¿À·’ÆU«\‚ …ò½#°kì ïè;øðÜ=2§ßðþ¿•Ÿìí⓽}š7ؘà>ööVUIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-159.png 644 233 144 3073 14774263775 14774 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜðIDATHÇÍ–mL”WÇÿ3¼¢ `wKBºÐƤÙA«FÍ’6Aí†P’M ©v³!¥¤&«Q“ã6íÝ®¸mbºELšhã »)±¬Ëvl©•„ò¾ÌÌóòÛ3ÏìnúÝûåɹçœÿÿÿÜ{î¹W IÊŒ}Þg^™r'R>IùÄS³Á®v½º*jÿ©||æ ¨»Xw ã£ŽØ £½£½?UüT®íøx'ßÁ‹Çסÿá— )ð܇”ä”d žÙüÌæg øîY¨ÜQ¹àaÂÃÛ æ8àÇoW³ÌâŒ'q¶ãÅ;ùžƒïð9üQ=‚•å+Ë%xåµW^óµD†Z1ss¾È~Í›¼‰ŸóÆuã:€YeV²CÖÖ`?¶F­Q°G­óÖyàžYlâ¯ÆÇÆÇ`ÿZjñó·1|#Æ·ÄÕãn¥%Iï¿ UªÒ’ »Éx×xì{æ9D$æ°yÂ0À,²È"îÈ"ƒ °WØ…v!6ÐL3;Á3Ç€Q|¨ÊªÊæ~ÅÛs'À7æ›M„à\pè`;Ø_Ù_±0?ù¬{FÀ°KßÎýàà ß„ob6ÑÑãÊûC±Æ^ßÿúþtC*ðøíbšŒb£X]Sǧ˜þA¾Í›m>&]ûíµšk5ZEŠ=*nTܨ¸!mݶuÛÖmÒíÛ·¤]ÚåÝå•òžËËÈ˪ÿRó}Í÷òé;sÀP—~Q°¡`ƒ]¬Ã5+jV¤Kz¢ ¿~›¢öÜö\gìßÍOÌŸ9N¨¬©ì­²·Ü³Û]ß]ß]Ó¾iß´ÖìY³gÍ8<<„É›“7'oÂéU§W^eË.–]tWxíÔÚÇkÃùÃmùmù„>s¤õ›ÖoœCñõÛ^iùõå׋ש¿|Yù2Iÿ’$OKÚA›¿M)=­=Ÿö|*•––JFŽ‘cäHÃááðpXJô$z=ÒåôËé—Ó¥-˶,Û²LZ8¼pxá°4Ý7Ý7Ý' œ œ H#ÿai²zêàÔA¥DØÓ¢† ÉÑã•**)’?éjÒUIw%I:©Ïõ¹”0šðcÂR²’•,)2Œ J¹wsïæÞ•Zv·ìnÙ-õ®î]Ý»ZJÏJÏJÏ’B·B·B·¤½{÷6J—.5\j¼÷½#Þ)­:í`ÚÁ¥Š˜?ùjòUÉÑ㕬ϬÏ<ÿF¥Q))"IZéY£°Ân--‹)±4±4±Tjjj–j'j'j'¤3ûÎì;³Ošk™k™k‘ÂuáºpÔq ã@ÇiSæ¦ÌM™RödöDö„´þWë“Ö'-Á¯ôŽ›/™/I®§ÆhŸnŸz¢{ÎoŒ)cÊ©hJkJkJƒþ’þ’þ·fŽœ8râÈ X7¸npÝ ´´´¸þcÆ1㘥å¥å¥åе³kG׎%wÈþsŒo¬ýÛöoÝ‹ ;õ%Ôï¯ßïÄ[/‚1k¸ÝB®Làw¸XXXqó}ôÑd“M6&L8ΖË\ÆæE#ßÈã Õ¿SÿŽ#ìÔ—ñ}lÔ7:›ˆŒ##ÛV£ÕÈ‚UcµŽ^Û° àxæIó¤y̳Álk£µÑÚtÒI'˜ãæCó!˜Ï›»ÍÝ`5F#ƒq}̆‚!Àö=ö=vû˜þûVÿe¨J­Ju;?˜=f0oí´v‰õ~;ÖóÁŽ­˜Ûùmìh2‘X$Ø„¬j«š˜7Í›ñøßÿuþŸ¹+iÌm\êk‘ À{¼‡ßÝb³Ú¬&v·Ý €¸¶ã_*‰XþÒ]ÃÿÙ»ò©}]<µï±§óû2tœn®yg#IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.7.png 644 233 144 3145 14774263776 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ÿOÔ÷Çß|)ç¥`• …’Á¥BõÜš˜k¤  ˆE±)¬¦FÌX\¤ ÉœI1dVZGm2 [í]³FDƒROŽJXêÄ'.Iñpw‚G9îóù¼ûáîÃÝæþß¿¼ó|}¿Þï÷óý „bU`žž¾ÒÃ?ÊWXVXRþäÇ*„íÛ÷¼òù+Ÿ¬¾¸ú¢6ĺ^·õ"?4Ÿ.«DP`h7´‡eðGP’Q’±"Îëo‚ñŠñŠGÇ;.[/[ùLN¸2]™ĺ^·×ýõx¡ñÅGÿ“_xéêKWÃþ †(C”¼+y×ë¿ô8^‡‚½{¦"¦"d8¨N šh™ Ì3>fC°®Øëþz<=¾žOÏï¯GÀškv Áï÷¹÷¹_øÆÚh®²VYAöø®ðki$T¡ à¬2£Ìà•ÃZ½V\”_Ê/ä¨P«‡ñÒ¦´)m Ǩ¦šh9ë'W½Zõ*ðA ……Æ/ .6.6¸§ù“l6™‹Ì ßð < »´ Ú|Ú¿´oµo‘²VÖËúåN!ãe¼Œ²É&;(Ç‹/h¢ O¼®ô @IOIÞÁO²C¶R!~ò=ÆcË|$8R©à+`óÎþp–_¦¯ÒWÌçÛíÛíÛ Î,g–3 ”:¥N©ã¹±”»ôöÒÛàìt.:aöÂÌ®™],¸þá}Íû{?³Û‡ŒªQ”gýõ„³]!Ž™Äî÷¿ÿ8F™_Ü0¾a\šÞ9˜Û–Û&º7ütãÓO…Ñ‚eÄ2"ÄDÓDÓD“¹¹¹B¤Å¥Å¥Å QSS#ÄbÅbÅb…X½µ½÷~,DÚŸÓ¦Âüxçþû…qí÷ÆÓÆÓ¢û ÃCÃCÒ$DåÉÊ“1Šz>P²^!Fª '¦'¬¿éÊëÊ“‡6®IéN鯫¯OŸ§lŶ½¶½œ´þ›õßà*\H^H–‡àÒ¥K—@“þzI11²œï9߃™,W¾+¦“-“-pãä7N@ê™Ô3©g` } } d¿ì—ý°clÇØŽ1ˆuǺcÝà´8-NK°0eHR†‚¸ìïewËîÂï*Ïo=¿5(W}SoN½ °²e¿l\^Õ»ªW»Ç;þ•ë×þ„±úYõ30™L&“ î$ÜI¸“"D<ˆÛ#Û#Û#p›Ýf·6o*ÞT V«Õjµ>ÖFŽ<y)GSަwë˜ëXͬq.9—€WG®ŽÔî õôËo½ü–l‡…¤…$øËß®_ÞÕs??Wv® ®e_˾– 5†CR3S3S3¡c®c®c'''¡õvëíÖÛÐlo¶7Ûƒ…ÕTÔTÔT@Ñù¢O‹> éÔôÛ;>Ò1õWúë*ï*‡î{C_ }%Y~–åÍòâͽ‘Û™Û ›G7n…ÞÚÞÚÞZhhnhnhÓvÓvÓvhu´:Zà2»Ì.3ä;òùð”{Ê=åP›Q›Q›]W»Ú»Úƒd¢uÈC(_?ùú‰N#Uºh´Á‘œ#9º½¶Ôëêuܸ‘ÏíDþ—ô>÷¹4Ð@CˆÜ‡_þŽi¦‘L+vÅ’O9uä”^X£Mp9ÀcÇãó‘òÖøÖñ­ þÖÏcê÷K®% j‹jWí Kä>¹ÔµCíµZ­V«A3i&Í”SN9hQZ”ü•[Üí;mQ[Y¦ô)},*ÚƒÇ>gŸ0N§ç#u^}žù—„ž˜Ù­ö¨=À¿µ|-yõ2Ð ø‘…å4~Š <ʼn3DúL+ÖŠñáUûÔ¾Pæ?`8`ø¿Ìx+),-, y+ù0ñÃÄåW€:êˆe^™PßUßÅ ò¦¼ @aĺ^·×ýõxzüå·2ß_Ï‹ü»xaÿc/æö?ØT?0ëfIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-16.png 644 233 144 2514 14774263775 14703 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mHTYÇŸqÌ7ÌMp?lX¦Kô^LYìfÒ–`d‘µ”XKB%B±}Pˆv–"“È1¢ ÁÞÀC›&¡r—´ôƒD®5J*:ê8÷žóÛ3wîuÙh?v¾\žçœçÿ{Î9÷<爈ȜèW n^ܼ¸´ˆWfû“ ’ ¾½±kMpíríúëgøêÂWÒëÓëU—m[ýÖxg¼ˆ­ïäY~™#¶#±1±Ñ•µ«`÷²ÝË’¾ŽØ¿¶AòíäÛAÝ=t ©¡©Ÿ`àéÀS€áüá|°m«ßoÅ[zN}©ú_f5ÏjvõAbBb‚dmÉÚ’s,2 7жmxç~çÖq`©¤ê|`Œ1¬6ä°­þèx+ÞÒ³ô-žÅä#±)c“ìܳsOòÕH@×u¨È¬È´xáÛTQE*˜ fð½QgÔ¢A—êR²¸®Ëth¿‘mdâã´q€ZjIňêÅô-žÅä#3÷ö· 8©8 Ða˜>Ó ÊU9a]©½Ú‹Ö]ú¥~‰ÝÊ)§Ô=uGݱÝúG}NŸC“f7sÊœ&-ý(/ÆgB‹‡ää±xxc¾1cº… ö«ýLÐA  ‚`¾°/ì³ýá¡ðPxO ž<áeáEáEŽ 1Ÿ¨ƒê áØŒƒ 3 „™fÚ‘±F¡€©w¨UªJ Ûz–þ'+ÿÿ¼+á,gIµ·Ø,1KnÓm¸pm[ý±_"oé}ö®üb__ì{ìË|Áþ+9ëùÔˆ“ÙIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-32.8.png 644 233 144 3235 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜRIDATHÇÍ–mLTWÇŸ;¢Ì^²©ëËV¶‘”(ɆEKC»Cðu‰³X v³~¡Ñ˜ØˆAR_clׂn­Xë”—±¶iЪ 1–&TD&»ÛXPa¶”aæÞóÛ3—a×d?{¾ÜüŸó<ÿÿÿž“óœ# ""q¡¯€e±e±%&ˆ- Ç­ùÖüß\ âz´ÚÆþ}ûAìñÇl<csÞÌŸ[/柫gÆ%NÂÈ–È-7„@ñªâUÖEA|´lm¶¶ŸPÑ^Ñðyãçüw?îËË…06çÍ|³Þä›Ë/þG_æ9ÿKí_¹ r,ykÉ[ËÿLp/‡"{‘à§y?ÍSÐG(¢T.0É$æðÌÁæ|(߬7ùL~SÏÔúH|#ñ >\?¾~Üv6Xðà'«OWŸu À߯ê©' tÑ8˜LàS=Æ{Æ{@ªQ5ª_õÓúV}+>ŒÆ€9âfùÎW7U7™\àÜzßzŸí¬éGþ{oåñ«Í›3@ýÀø@åVÊ_•ª<•‡RV•ªrv¥PûÕ~µT¯º«î†ãĪgêJ-Öu]ÇL1Êâ_³Ù¾yvåÍÙJ‘×NòíSÛ§“à^ì^ þZþ8úæ“Æ'LÞ ì ì ëù—û—û—Ãhêhêh*øøøÌ1´›ÝìÙÎïŒFŠ·>ne*°2Èîyîy@§­ÉÖ4aú¥‰ˆÔwÁÛúÛ:Œ¿‹¯‘±îw٩٩÷÷¸ö¸vTñwÅ=Å=àyèyèyE™E™E™ãŒqÆ8!çhÎÑœ£à¹á¹á¹6ä=ä=ä=…“…žB$/KÎIÎAmH+\Z¸~Y `dÀÎ;O€z7èÇb䉈d])š*š¹\÷ÅÐCZf` P¨“÷÷q÷qÑsóóDöîØ»cï‘áƒÃ‡ŠL¬›X7±ND¢?ÑŸˆœï;ßw¾Of‡Óít;Ý"®ë®Û®Û"W³¯.ººH´þ²ûñ÷ãe¦sÕÝì»ÙZ¦ˆ}™}™ˆ:òÃó˜ö˜vÕÂÆáºáºðŸNž(Ÿ(‡œÆœs9ç )!)!)úSúSúSà©ï©ï©:–v,íX )…)…)…pÓ~Ó~ÓæIII€Ô‚Ô‚Ôˆ­‰Ý»27¾žôzŒü<®ÆÀèÀè¨cÑ…Ñ…ªEÔÉØs±çŒ˜¼3yî\;];ñÜ~ÿÖ¾[û`LÓÇtXéXéX釿ÐN;œv8 Ò­éÖt+t'v'v'òÂ85xjðÔ ¬-_[¾¶<Ï(M·§ÛáýOââð€r)èñÑK¢—uI/ÕKµ‘ùWæ_éýCïpï°$nßöí¶oEœýÎ{Î{"*Wåª\‘k'®¸vB¤vuíêÚÕ"%–K‰EäQ×£®G]"wêïÔß©¹Xp±àbˆµÖZk­ªªªiU­F«!âémmIÞ•¼0y¡$ŠL?Ÿ~."U–ÊÒ„£""ßUÓáhv4Ïþ²ƒÖš–š|™™%™%Ð<Ü<Ü< UUU/ù’/PÐ]Ð]Ð k"ÖD¬‰€ ÅŠ/ÃöMÛ7mß###а§aOÃȊʲdYà†>ÂgêÑçèttŸý„ÚE}T•U•_…N‰Òwéáö ä>÷fšiž³W::úÿÁG8ÂÀª7ùžëiz¹Œ ¨Ú[µ0‚~4\¡¾ñ[›Ëæº[-§¿/ý¾4:`üsEÏŠ±Ë<ÿgþϤUsEüñ£,ÔRµqm\DýZ­P+D$K²$KDú¤OúD,N‹Óâaˆ!†D,1–HK¤ˆ±Û¸l\‘6ã’qI~Ñ ¶,Ø"²w§¸Sä+)Nÿ:ýëÏ—GÓ¯N¿šuüÅÎÏë+ ByZ¿®_0ÊŒ2üÌ„þØËSžcxñÞÐ×Ç4ÓÀÏx¡|ŒR£?>“ϼYBz/vþÐ]Ɇ­¶Î¹+yç•w^™%hê¨# “I½D/ÁªSu ¡A›óf¾Yoò™ü¦ž©?{W¾´¯‹—ö=ör¾`ÿ¾ÎÑ~˪©IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-9.9.png 644 233 144 2627 14774263776 15002 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜLIDATHÇÍ–]hÓWÆß$¦¡Øú1»2Ð?ÐvõBÝl×™,íðƒŽ‚C™TX‡àR7Çv1ØnT»ál‘¢b]DqeÅZÛ -l¸uDç–:—Ú“üÏ9¿]$'‰Ûܵç&¼ïûœçyò?ç¼çˆˆHYæWÀ]á®pÏLÇîrù"‘QG:>¡Àõ®ëÝ»ŸCé±Òc³Úgµëá\lëŸ?_$ÇŸ¯góR&¹DaWa—«& Û–o[^ôJ:>xŠ/_|êÀ®K».\øö·|c·ÆnLÔLÔ@.¶u‹·ó-_>¿|ù}ð†¼!׈Àkõ¯Õ/ü( ¸¿››zzŒÔŸ@ %¦˜b ;çŶžÁÛù–Ïò[=«Ÿö#0wýÜõ"ÐØÔØT|:=aø;œ`y°Üê¥.rŒ6Ú(1?¥FS£À%JH€ùÙü $LÒ$Ì/æà˜óÈyDÂü”ºŸºœçS>¥$˧,F/«Ÿö#ϯí¡:žmfsö¤ú™å :ƒ`f;½N/©LÁžÖÓÀ6°ÜðáÃf¶™afd³ÆxœKÎ%R”Wyóø“[Ü[ÜÖࡺ¼¥Y|ŠÇŠÇ¦f@X…ðoƒÙcö0|*JÁãë¿ü=è{úž¾—gè§8• “’’òñÆk¼ú¶¾Í4XþŒ^V?í'cìD´|Ñò˜8€®Ö²bC±ñØ8f£ø“þ$øz|=¾hÚ×´¯i˜a3l†s†bþ˜?懲Q6Êsø=M{€{ĉc@­T+O¬^ZßúÉú:';'A­0;3:‰ã?ÁêæÕÍ«›s*ŸT>©|gΜÈåî?ºÿèþãÏ}uî³sŸeÓ uÙê¥õ­·ÈÌÞ™½¯¯YÿÖú·D䚈ˆëtf¥ Ë¿+?_~^düéøÓñ§"mmm"‘ÒHi¤Td¢c¢c¢C²cA÷‚îÝ"ãeãeãe"ÁÎ`gP$Ä#q‘è{ÑÑYx¡²zýŒŸ"ž€'À2ïoÞß\ây_DDþ’n™ëŸçŸïŸ/²}Ýö7¶¿!ª Õ…êDÜî÷€HIEIEIEΘÿ¤ÿ¤ÿ¤ÈÝðÝðݰH¨>Tªq¸GÜ#"¾ /è ŠÈ  Ê ˆø2zâíövË\ÏÏ–¹Eôe}Ùõ«ˆÓà4ˆ˜UiCVèNàÎ;wÞ …†BC"µ-µ-µ-"óÊæ•Í+©ì«ì«ì9søÌá3‡EzG{G{GE®µ^k½Ö*RÛPÛPÛ 2':':'*²nɺÅëçþˆ;nõÒúY?ÿÜcÜȬ¹Çép:HØÍp°ë`×Á.¨Þ]½»z7\¯¹^s½bñX<‡ÀÒÀÒÀRˆVE«¢Up¤ñHã‘F¨®«®«®ƒ+[¯l½²5·çÌiçMçMŒý÷ûשDÛSâ(GýŒ0‚!B˜p^{h§v`+X‘— B„ÈsøœªØÄ& ¨ùj>ðìOe^SáD8ûx›ßõ½†i5¢}Új©Z¤> èÀU®rt.Ð@+­´‚Jª¤J‚Z¢ª… ƒúý €Þ«÷2“á7áT8õÂ>–×ùÙR´¥(¯3£úU?`ô½ƒTfq " ˜d’IÀ Ñ€!Irx½Sï$ꦺ™ÏoõþÕù_pW|5øjÞ] _ó5%àL9SªY5“sÃÜÀ… r±­[¼où,ÿ ïÊ—öuñÒ¾Ç^Îìß³É1~¯I3IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-35.0.png 644 233 144 3237 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜTIDATHÇÍ–ýOTWÇŸ˜Â¸hm‚“v}A$kËN€ÑаY°%tÕL)ÖÒZÍVØfRÖº5´ñ%âZcÓ¦Ú—TX‚K[J38Mܲ‘¥J£›¬\¶Y#h…‘Î2Á2/÷ÞÏþ0savý<¿Ü|Ïyžïó½çžû}Ž€ˆˆ,Œ>ŒKK "Øø»¹ùÄâÄâ´¯"ø”† /~wÿäñOž8ýÄiõæÖ×õøØ|‘9þØzú¼,”¹‰„ö„vCa×ÂË/g$.Šà÷/¹ÃÜ1†7\o¸œMÎ&~w¿¹û À…?ÂÖ×õx=_ç‹å—Úÿ«/¦s¦s†CÂc ‰@JQJÑŠ·"#+À¾É¾ `4n4N3€2$‘¤~üèÃõõh¼ž¯óéüz=½~D@rArŸ½à{ÁgnŒ$Üü’ªê«êAëuðM4‘„þ>ü=hpY¸Œ€vGmQ[@›P½ª¸¢½§½ 8ßߨ§ž$íÛ(ß¹ª‹Uu7¿äLI|I¼¹Q×#ÿûm?xŽŸo±m±–êÆíIeH"DËX†6»GA˜!‚cð[ld#šzW¹¬\&¤ó©(ÿî-G·Õ~ð\̧yæ#ºÍÍæf<Œ,Y ¡?°qÂöÇ?|ȃð·áéð4àÇ‹¦’¦’¦’àžûžûž&j&j&j@IP”Á%ÁçƒÏÃýeãÃÍáOµ§¸kî7÷ûã Dôˆf9Õ •J¥¾ƒL2©Ú~›gͳ Ï,<ƒVÖTV_Vû&öMìƒTGª#Õé—Ó/§_†L[¦-Ó­­­1Šê¨£*îVÜ®¸ æs‡¹mûß^5½jÒƒTu¤8R€¼ˆ ‰ˆü½ .L]˜‚&ã×׿¾®•¯_ãÊq˜¬š|sòMHÍJÍJÍ‚æÖæÖæVÈÌÊÌÊÌ‚#ÚíˆÃýÃýÃý@6ÙdÏéê<Ñy¢óXÓ­éÖt_;ž1ž¿¨]‘¶"@ת>úÐÊá|ÃùPâ#zŒñg¸¸V­•ÒŒO3>ù­jÏ´g/œ¸Øu±Kì{Š=E„E,b‘HÜþ¸ýqûE”j¥Z©qŸtŸtŸÙtcÓM7D<£žQϨ̎[ù·òoå‹Xl›Å&bé·Ü°ÜYúdJ~J¾$ükçõÆë†F‘"w‘[„À¼îyÝ«ÖÆó¹Ágða5tÌvþ³ùN®®”ûþÞ§¼OIrç:ßî|[¤èjѵ¢k"i/k/k/±š¬&«I¤ÀR`)°ˆ¸6»6»6‹ÔHÔˆˆÑb´-"akضΠ%‡rC¹"‰¿JìNì–û"¦Û¦Û’lX·=n;V£vVÙ©ì4 Š˜ºL]"×~síε;’¼Í·íê¶«"½?ë×;OdÆ=ãžq‹Œ]»2vEdÇÙgwœiXܰ¸a±ˆ·Ô[ê-I[™¶2m¥Hsisis©Èêc«­>&2ºntÝè:‘ÚôÚ§kŸïoo)¼Ux ð€$‹ø¾€ˆašZ ƒÂûÑ3ö—–¶–6ýdhåG·n'°æÜšö5íÐ8Ø8Ø88wvŽo=¾õøVÈéËéË郶ùmóÛæƒïïïØ7Ø7Ø7€/Û—íËçrçrçrX?¶Þ³Þ]S®]ëF£•³¸%©% øGDOÔ.Nõ‚£ÜQœþ%š²[Ù=«C㟠0ìa{¶zè¡(¦˜â˜ù<òȾà4§cøþ ¿ŒÖÃQ稦¢%CQÃfeÈŽ9ñÇÄ$ÿ=d·+ «ÐUÜþ+Äÿ)Àjój³:±µ¸–]/D?šOó‹U"âXn]nÕå…í¨L¯L}6d7]}—¾ëaŽ\+ó”yôgC#|Qk©µ€ü ÐÅ_h§8P„"€Ö /èÃ/o¨MjpVš¥@þ$æ•ÝÊnütÝ@_ò%q‹x¦ÚæÚfMàH'_”ùÊ|ú³`ØaØÙÓð·y)»rvå€Lü˜cäEµEm! ºÕÕ‘ò Y%«;…\+×ʵ@2I$Eü<+½Ò‹”[Tƒj ¨¨ ëBørlçüÎyM`󎨭BˆÔ¿Ñ§ïÐwx—‚ãEÇ‹x€?¸Ò&?žü˜¹@vàpàp„o¡~¡~¡œF§Ñi„`z0=˜%¨"f`OÀ0+mòøäqæï‡ðÁñ¼ãyಾSßé]ªé2K!ÚÿÕÕ0û@Í(ùGáùÂó°rïÊc+!óþ”w$ï8̳à ú }…ÖM­›Z7å©å©å©0wtîèÜш ÙÊÙÊÙJ(¹Pr¾ä<Ä‹o‹oCæ´nýhëG0}JýDýDÍ€š=5{@ýOHþN!þ[ }+úV€åýî’îY•bHîIîÁ¯AîXîXîd_ʾ”} †ÌCæ!3$ŸN>|ìõöz{}D˜¹ÅÜbn”„”„”„ˆë;/Ç¿ÿÔ)Ë>Ë>Yýkú×@pYH`ýŠŸWü,­àÚçÚSùîRw)Œ;Æ:Æ: ¯¬ÏØg„´ iÒ.@WlWlW,d³ŒYFˆsÆ9ãœYYY S#S#S#0>?>?>ýõýô6¿x!ÿìøþëï¿ð&y“@Í~ÆÿŒ_Z¶U—W]V‡Ùù ëAVäÚ×éßó½çƒ77ÞÜxFGGÁÜcî1÷À¶Þm½Ûz#2fÌ8­wZï´Þá±U§¯Ó×é!Ó”iÊ4Á5ÃU®FÂä®W\¯¾ÕºÕ:ux©z+øaðCÝðÛÓOOˆ´î[ß:¾uÉù¦ M„ht74qÏv¯ë^—“‰“‰“‰B899 a=c=c=#„Ûãö¸=BÄÚcí±v!lŠM±)Bønønønq"çDΉ!N~~²ýd»¿˜}øëC!Ö¤' & CêíøŽø!¨Qv)»tÃBù³vƺßê~ z†¯uý+YUðÇ|¾Ñ­¢ëE×aSå¦ÊM•0`° ØàÜþsûÏí‡Í6Ø|,N‹Óâ׬kÖ5 {Kö–ì-óvóvóv())±ÂÑÂQÈXû’ý%;þo®ýÐöC›¬‚nO·”ßkg íV¾]øv¡ÖY5”^¥P˜f¹Øt6lÀ(£ŒFíÕ 3ÌV¬X£üU àÁƒ\Ä_äÓøÃ·[xŽ¡¿«¿ë]*¯Þͼ› ÊñМQî,Ì,Ì0§|¦ )C ›¥Iš@¹¯ÜWîƒR£Ô(5 nQ·¨[€|òɵX-V‹Ae,¥Sq(Pn/¸ÜÌiøò»ŸÆ¯éy|ò/¼¦{ML‡'¿GéSú€ßÔRµ” á>@ àç¢ú¡¢ ³L3 á#ùM5ªF¸Ãx¾Æ÷øäÿ+)ß]¾;ê_ɻϽûÜâÜîL˜ˆƒ 7èPÞTÞÄòм€Dl-®åkõž†¯ñiü!=Oòëâ‰}=™/ØÿOŒ6Àl1î|IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-8.8.png 644 233 144 2575 14774263776 15002 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü2IDATHÇÍ–[H”iÇŸ³qPKÓZsÃf‚ØuKô‚¢ £15ˆ0:Ñ’t!KÁÊÚÒ¦tÄîÞlçh a1³Ã˜!l±5ë¶DØ’v@‹µ#‚ŽÊ¬¬Íáû¾÷·3ïÌTÛ^÷Þ|<Ïóþÿ?ß{‘ìøWÀ^h/´ÏˆÅöÉ|FeF¥»-Ÿ0Á¶Þ¶þþ·à:â:0óì̳֣d¬ëŸÚ/’äOÕÓyÉ–dÂqÁqÁ¶2€Å‹3fÇâïýàô9}ÿP¥þ ÀåÖË­4Àð­á[+'VB2Öu×ýš/•_¼¥/éÝéݶ§à˜î˜.óWÏ_½àËàɨöV{^¦½LSv0G,²ÔJ`’Iô¤ÄºÇë~ͧùµžÖùÈ]‘»Bjëjëœgb ~Æh,h,ÐzQÇi¢‰,u'ú,ú 8c aP÷Õ} ¤"* ¨Àq#`«;Ñ'Ñ'ÀOìe/Y ¾\/¡ó#oÎíŸÚ $aèw>2î÷@wŒ;Dã¥rTºJܸq“³˜Å,P…Ê¥\‰¬R9†ßðe±ñÂx‘ÂÖzqýäTŠˆ,úœÃÎáÉi0hšÀ/¬Õ¦Ú˜Šø#ã‘q©©©£Ø(6ŠS ícû’aÄñGüoàëŒ:U¯ê™¢GóÇõú1?qc'~ƒ]ûwíõÀ*ú釉ž‰¡‰!TÕßUªÌqÏqÏqCí¢ÚEµ‹`jÍÔš©5ICãcãcãcP5Y5Y5ù¾¨¶^ï|ÝòºÊ­ÜÀB­Ó×~âÆî~ç‚ç‚`þ ¾ˆë„»Šºò»òÁãóø<>èßÚ¿µ+¸¹¹A·êVÝ*iÌ·Ô·Ô·<žNO'ôoéßÒ¿%‰¿öéµ…×&àaË©õbúÚ]dÆ7>+Y±jÅ*»MDÄv&>ÓŽ {EfE¦ˆ£ÙÑìhYîYîYîq=t=t=)m,m,m”ÄXV¸¬pY¡ˆã”ã”ãT þºëºëºÈ’¿– /NÀ¶ÓZ/¦¯ýØEÒªÓªY,’Þ•Þ%¢ö‹ˆÈ˜îì¸Ñq³ã¦HNyNyN¹H°9ØlQ!R!‘öH{¤=’4v~ôüèùQ‘œ‚œ‚œ‘`K°%Ø"¢²U¶Êé˜Ý‘ב—Ä«N­Ó×~¦‰XW­«¶‡"FQ#ŸÈqé•^ÉÕs«ç®›»Nä¹ñÜ|nŠ\Ê»”w)Od¢b¢b¢B$Ó›éÍôŠø¶û¶û¶‹8œ ΑWžWžW‘‹ê¢º¨D½Þ@¯H~U¾7ß›4&߈ˆHn\_~Þ^cüŸóåÆ1DX/†Ã}‡û÷AYIYIY ´Ž´Ž´ŽÀø¶ñmãÛ æhÍÑš£‚ œl:Ùt² ʲʲʲà´uÚ:m¥ìâ?Í=æÂ\ûï5öήÄÔ»ÄS€ïh£ Å}ô¥ Úi§=%ˆC`à ü(£Ànq FÈêweÊ9f †ÿ‰µÜµ[‹™2;ÍÇæc0›Ì=æ°J­R«ðâÅ V‘Ud›ØÄ&0o›·ÍÛ`~mî6wƒõ±µÖZ tXËÁT‚ß †Þ{Ž¥œülÈØ‘r2cö˜=ÖkÑøä* JPXX)PǺžÀÇû|š_ë½sò¿ç®¤q^ã¼”»r,0&Is³¹™0(¿ò`ÃÉX×5^÷k>ÍÿÞ»òƒ}]|°ï±óû/pê»Z°‘IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-10.9.png 644 233 144 3123 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–íOTgÆïy+`‘*BÊbÝ`m¦ÄBb¨ c¤lmK±PJyi¨ÕXiÒ…˜4n›òAù`· t³lÍö%h0ƒ]§ˆA V ¡KcƒŽgΜs~ûaæÌ°õðù2¹ß®ëšç9Ï}?""’þ°fX3¬‰!Ûº/ê-Š-úSwÈnÓÀ²Ç²gü¯°æ‹5_<Ùñd‡>µÍ¸™¿º^$Š¿šÏôK’D1߯|kq…í&(Ï.ÏŽ}*dåŒræAö÷îï8ýÕé¯xn_º} `ɵ䂨mÆÍ|³ÞÄ[/M¿ãG¿£ß2 1OÄ“?¤G ¹ ¹@J*J*”vT‘É.h|ºñiàEõ 4ÑDhÍü3ø0ø¿q]oÑ[€^£Ïè0®׿V¡Uà‡àRp håK¾$Á ãõ6¸ܦÀÉ.¾+±•Ø”vSüÿÙ~¶ Jï—Þ£@6&h¤À¸aÜ@e/oð†~[_Ô#;…a3l† x‡j¢~âycÃX«ù4ª¹£º?„Oyi}i½)ð³]«ŽRDdS (>Åç³3:õùÔçØÝ¼÷×Ü_Êڭv«ÝQ>¿×ïõ{Á›éÍôf‚‘mdÙ«uÑEWÔ ü¢Æª±p÷ÜBêB*+úTn¹yøEV†}vSpCD¤í"Ô}R÷ yú K»óéO!Cþöüíg÷œÝ}vw”¨V¯ÕkuPN)§”SPí©öT{xdÝ«½W{¯þ,E¢Äý;n2n£âpÙe7C|P÷CÝ@bH?‹ˆ\m€o¦¿™†׌½/~¸eí–µøÍ}½"WäŠÀ…± cÆ`“e“e“òòò «9«9«z]½®^WTXë`ë`ë l­ÚZµµ*êß¼ðü±çá?õsûÏí7ö‚û°û0¿é±ZÒ¿Oü>'O~Þ¾yûf‘¸‰ˆXÚ‡¿¾ôÓ¥Ÿ$&§2ç휷Ee²@™ÈÜèÜèܨHÊú”õ)ëERFRFRFD2œÎ §ÈLåLåL¥DVúôéDæ“æ“æ“Dz{zD~Õn=së‰Y¿•x+ÑÒ.âjwµ‹È›qž8ONž]þ`«²Uá” G³£Ù"Ò*""^Ûß™ŽLI¶{ìïÙß‘ër]®‹ØÚÚŠ˃åÁò¨5¨Õ H|Z|Z|ZÔ_ÔYÔYÔ)2>1>1>!Ò_Ø_Ø_(bµ^µ^QÞQ.*Å+âÈvdK²E±½e{ §UÐûô>Ë„¨êËêË"–?ŠˆH² ¬ÕhÕZµÈrÎrÎrŽHÁÉ‚“'EfëgëgëEš\M®&—ˆwÞ;ïÉuæ:s"]»6vm88ppà ÈÎ×w¾¶ó5‘u‹ëFÖˆìhÜ‘´#I’E–Ë–ËD¬éŒ1f™ßÊ« ü§g gx5ô™—ïPÉ¡—½—Ý—Ý—ÝÑo¤»²»²»¶Ån‹Ý ³³³°\¸\¸\ÅíÅíÅí°˜µ˜µ˜-%-%-%»+7?7Ζö­ô­à7›½ÆéîŽîà¿!=aam¡îãºMZýú‚>—EPœà'V]¿ãç8àĉs•ÿ<ç9üÊ 3ѶGGp:8 dGne[]p/|+#}ÌPæ”9Ÿ}JR£}L¯UTdÅX$´(Ÿžª§ê© åiyZèÝ£{€N:é=^×ã÷ÙÇ>Ðú³ú³ =ø(ð+ú_"}lËÍ-@P™R¦|vš}ì‘Î_ScÒ«Ã<ÐÜšPõ½5òAEøÍ Gtt`™»Ü쵡¿«¿‹Š_óhžUø¾G:ÿïf¥9»ÌYIx¶ÁŽ9b´*­ ?CÆ,µÍ¸™oÖ›x&¾ÉgòGfåcûºxlßcç ö ‡º sïõKIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.2.png 644 233 144 3155 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü"IDATHÇÍ–íSTçÆŸ#îÈ¥  …IDV$#K:JuHB—ÀÒðb Úm¢IÃ4“™6;Hc›¦‘ÙÑMipªL&ì"ö Q±«à°|À7’LFÇŽ!ae:eA6.R–³ç<¿~Ø=î¦þž/çÜo×uû9ç~B!VEîâ2ã2ã~¶ã~õ¯([Q¶þaû¸ †W ¯|ó'HjKjXݱºCŽÚz\Ï­"Š˧ûÅ*u$t'tŠ#öG°ëÙ]Ï®H Û-—ÁxÖxöaÞ>÷ö9€3®3.~SCSCsÅsŵõ¸ž¯×ëx±øâ£ÿ㞺ðÔÿ!ayÂr!àé—ž~)ë½p‚7 ª^®z`"~"^Æ€êI”Å@€ú5cëñH¾^¯ãéø:ŸÎÖ# åÅ”…àïÕþj¿ñ³pÁpíõ®zÈAå,ä8ÇIU¨8ººGP~­µh-@‡tJ'€¼%o‹ª]µ„Ð\h8Ƨ|Jâ#«Ï !GÈrÄrà ÆV~¥8ørï¼{åƒ0>xŸñ> »Œ]eºž8 …b¯E”¾5ýÖ´)XÌÍ•–š×ʻʻDoös9ßç|/Œe”Ý(»!ÄØ‰±c'„(//bCê†Ô ©BØMv“Ý$Ä’{ɽäBìûÅ~! †@ƒ5;j2k2…0Wm4m4 £5u›c›CôÞÿkÖÞ¬½Ò"JêúêúL!ùuDOè'Bq£úMý&p}à®pWȺœ”õ½ë{ êo\a«°UØ ((ªÒªÒªÒ`fëÌÖ™­¾6}múZLLLŠvªc²c²crÒsÒsÒ£þŸ½·%iKÁ?víqí‘uàIö$ChyX Ó4f“ÝàÛãÛ÷¬s•s•0áïïÏ/»a!s!þù¯‹£G£ÿêá_~ãðÐWÒWÒWûö%ìKs±¹Ø\ =zô<€ŒñŒñŒqp6;›Ípúüéó§ÏƒÓét: JE©(…£™G3ŽfÀ)w×û]ïÃHÞØ–±-³#³# kÊ5åÊn¡þ^ÿÆÜoºß„ÞÛ_žúò”¬+û¥5h ,÷”Ÿ+?›on¾¹ù& 80pZÛ[Û[ÛÁRh)´ÂIïIïI/Ì´Í´Í´Áîu»×í^Ök‡*ã*ã*ãÀ6nûÖö-äÿ8ïBÞ‚}C_û꘬·ßíõçú7ÞË®À;¶wlzgµ|P/ªðãG>¶6ùï#Œ­´ÒãWQQPÁ{„áÓùÃzg"s ã¨q4°L^--õ`xΨ·–æ–æXP;ÕïÔï@î’Õ²ÔµGíµQmTA³hÍÔRK-h6ͦÙ@VK›´Ú¥zU/¨ßDð"ør0̧óëzŸüK¯^5³‘ÉïWûÕ~à¾V©U¢ DúEäù¿,°Ó-Ò¡Ì2 ‘#¹¯UiU(ÌEðt|ïñÉÙ+ÙaßaÙ+iÈhÈx4·ÏFfy"„¡€úºú:A—åe  jëq=_¯×ñt|Oçëy’OOìyìÉ<Áþ¨ï©nN7IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-173.png 644 233 144 3000 14774263775 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܵIDATHÇÍ–]L”WÇŸ¬¼ÉE1ֶؤ›ˆÛM ©±ÖPLmidm¤¨!ª ›Ýš”R$¤!…‹Íý )7+4,`£‘vª¡Ù…†ªƒVù¸)eŠ›Æ´Å±b3Й÷ãüz1ï;ïdÝÞ{n&ÏÇùÿÿóœç<ï‘ûí_Œ‚Œ‚Œœ¤qÄõg?Ÿýüú“v— ž=/~ó&ävæväuçu[3®íÄüôý".~:Ÿã—ûÅu¬>µú”g—m7Cåã•g¯OÚÿ8Ú 6¸dÀÑÏŽ~pæã3óW…Ç"»"»Àµ¸“ïìwðÒñ¥ùøE`Õ¹Uç<×aõ}«ïGž}äÙG_M&ü÷Q(¡ü€Ÿ2ÊT`Î^¼j%гn§ÙNÜÎwö;x¾Ãçð'õä—æ—ŠÀ¾ƒûj'’fþ…QÿPýCŸ>ÈSÔPƒ—!c˜†LÍÔˆ«o­.« TÔŠY1PÓÖGÖGÀߌˆÓmô= ‚¼ÌËxù§‡oØ|)þ¤÷(-‘¶ÝP!’T F£Ñêš2Cèv@ã7p×îp'ÍÎ%‡PÏ© UÎq]m°Ê­r 4‰ùù@Ìá—ôfÛòh?k?G³`66¾  ÔUu•奾¥ KÀÜj>f>úý€~æ›ç›ç›ávçíÎÛé‹ôEú ~:~:~Œã ã ˜÷Î{ç½`´&úý,ÛòËøzö½Ù÷´¨f9zla]¸é?ê?êü]«H•èEzDÚ#ŸD>AíxnGéŽRæó‚y¼¼¼kŽ­9¶æVVVƒV©Uj•ÐÒÚÒÚÒ {Õ^µWANYÎ39ÏÀþ÷ŸÙ•øt¹w¹×åc_ÍTÍ”Ó{]2’u{2 »Ÿþâé/ì2Šç‰;ƒ+¾Ÿ$Ên•Ë‚â¹òŸ+_]ùJd¥c¥c¥C¤xgñÎâ"s›ç6ÏméªéªéªÙÒ»¥wK¯ˆHˆÄÖÇÖÇÖ‹\ÿãõ¢ëE"—[/W_®ÏïÕá«Ã’pøÔ¶’’‡ÿÉ€@ÎhΨ:E,\.fì&ú›µÍÚæFóóؾnûºíë`0:Œr×òMø&|Ð1Ü1Ü1ìúÚÚÚ ¤®¤®¤Ö†ÖάùÓ·^»õš›§úæ¾›û="™å™åüI¼«¾\õ¥ˆL‹ˆÈ/ò¡ ÉHf8ófæM‘¬ÃY‡³‹PEU’Zããã"Á=Á=Á="µ“µ“µ“"!_Èò‰Lo˜Þ0½A$0˜ L‰l|{ã;ßJ mÚ”‚ùEE²z²zD="ÖçÖçžo£Ü(]DDò=›$áZD$Ñ”hJ4‰èÅz±^ìúûGûGûGE¶ŽlÙ:"¢׎kÇEÆÇÇEªBU¡ªÈÅé‹Ó§E"‰ÔFjErƒ¹=¹=)˜|ù³Ñmt‹¸z™| €z…½Æ‚±@Ü)uц# G`Ì3ÇL÷šüMþ&?œm;Ûv¶íî#nÉnÉnÉv[áĉ'n¨5Cœ^›ïü@` à4ÿäëî­Äÿ–ÿ­´[‚5Ü^R@Ü• XXXiö8ãŒa„Fù?y!¢DQ¼o¼k¼›Ægú›üMî­LŸca-ÍBÍê³:Ø`e`Õ[õ,[¯XíV;¨9õ½ú>MßIë¤u”Où”/M@;í´ƒÙhÖ™u`¶š3Öƒz£ÞÈ2ÿvð¯y¯yCûQûñ®9æ Ú¶ÝP‘]‘íN~0ƒfX²^²^B·g¿LL ʯüj×3½¢Ø¹ÊÎ_±Y‡ÐSx)|‡ï®Éÿ;ßJê®80´ÒŠ×=b³Ê¬"ê¼:€¸¶Oµ„½ßÁsð÷[yϾ.îÙ÷ؽù‚ý `Ååbž5¤³IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-5-red.png 644 233 144 4107 14774263775 15534 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜüIDATXíW{L”W?ßcä!ˆ’QfÖv}a V]ñÁ£ƒ‚ÔD’¢¦b ±’µFDI[³U"a•6­¡¡`5Ì&T Z-M6hv›jJ¢3e­qTd`G¿á»ßýí|÷›G|d³{þ™9÷Þs~¿9÷wÎÍMØTŠ2yuœ;Îç–þm.$MêžÔ=©{ÍU¦2•ý³•²)›²‰mÞH*©¤ ˆöy£8/âE>‘?O^Í'’_ ÕPܽ?cžÚ­v«ÝϤ=ÒiE$%u$u$u—JKK6>Øø(Ë-Ë-Ë ûb_œñ"ŸÈ/ðÞ̇äUÑþœ/åQyTõe‹ ¥W¦W¦W²}-}-}-}<1ð4ð4ð€ ‚ÃÆøàƒ°|s_œñ"ŸÈ7çË7ó#{²<$ÉC¾Ë"Aîܹ7ôåžqϸg˜Æñ]|tv`|d|`‹µ%Ú€•hmZÀkiì€ÒB_dŒtï÷¼ð¼€Gä·GáÛ“-jR§Ô)u©‡ÕÃêáöŸD€³ÑÙèlÔK,bµ¼–×" ·ëíz;À}ÜÇ}B!„°àà  ö¸hôvý„~àµüSþ)"Là |ÁGð#Û}Û}ÛýuKÄ{½½Þ^Ï3¼O¼O¼OðÜÌ`GØvŒŸŸ0D_i_)¬Ý±vï.Þ ë¶¯Û+‹V\)¿Rþ=ìHèNèŽåžÀ|,~jµZ­V÷'*NTœ¨à2õN½S˜ÆœÌᣪµª˜h3QÈ»˜wìX°.ö_ì Y¥Ï7ò˜üAoU6Šqjfjfj&Ÿ­y¶æÙ+P‡8˜¨"+ce‘D‹=€uë2"×Yk¼ÄKÀ9œ3sêÅ(`å7ñ¾à#ø ¢ÙptÃÑ GÿŒy˜‡yøá‡°ûð Ëšž5óó 1>1[[àЩC§À¸l\Ž lB?ã1`á™ø‚à'›-5ÏVh+´Z=GUTEUD4¦Ót""ìÅÞÈ ˜˜MDôpÞÃyDDó‹çµf·fm]±uÑçÛ>ßFDô…ë Wd¼‘d$Q<%P¦Ót:Œoë²uÙº¬–ŸgÅ߆ú†ú†úȣɚ¬É¤(;•ÊNm§í´ˆF¥1i,hJË”"¢§O‰ˆn„n„ˆˆÊûËû‰ˆ¾Éü&“ˆh¹º\%"únÚwÓ"ÂC²&kDt—ŽÒQ"ù¼|^>OfIñûü>¿<‚É%r‰\2þØ,qãÉš“5'k"$ÏâY<ðù‘Íà»ê» §nŸº Ãw‡ï¾JÅŸ9—s.áIŠñ!ÀβBVÆ»Öt­éZ“õ,)kü1)K•¥ÊÒºÑeŽÙŽÙŽÙlŽw“w“wSx|ðö{'Ÿ>|Ùí/üxa$ÁK®K®Èýº_ë~4·ßcI,) *oUÞª¼e-‚UJ•Rugó„Ÿà§hKÿÊ–e˲eùÚD€ë€ë€ë/°æÇ4=]O0S1ø‹‹àÛï¿ýz½š~K¿1´*ô€nÅ xfôLàLïYOhƒÜ 7¼\#Í”fJ3´ÄTþaõ×Vi«´õÝf©Cê:„VŒ]î^÷÷¸-íîe¬x2O á7ü6qЀp­øu~àÆdcrXJCC-C-€#Þïˆ×«­JT*]N‹Z •P‰jsÍ£<ÊSR'uR'‘âWüŠßyëim¶7Û›õï'ÞZom¤vù ¾ f0œ%³dAö û€31à›ùN¾3ÜŠ[nn¹¹å&Ûk½@cê˜:æ>”¶;mwÚn"Ù);e§tÖdW!hN6?7+÷”{Ê=éBÆþŒýû‰l•¶J[¥û¥ÝIDATHÇÍ–[HUYÇ¿sšRÁ2‡rè‚A1((²„‰¨ä¤eE†“ÑÃd/õM=ÔC3/£6=DQ I¥E0hêAÇ ˆ†ÁÐÁsâp’ÉÛY{ýæaïµ×vžì­õ²ùnÿÿ}ß^koYé=ÂëÂëÂ+\;\oý™{2÷DZ\û†‚Pu¨zôgÈiÊiȽ{Ûyem7ùÁz‹ä3~Y)֑њѪðìËp¨äPIæw®ýK7d=ÊzôoNµŸjxxçá~‚‰Þ‰^€dE²¬mâ&ßÔ¼ ¾\þ¿,}ºôièÈX–±L6ìÞ°{cƒ›0¾¢û£ûÞ/y¿D‡@Ål²u0Åf%¶‰{ù¦Þà|Ãgø]=y»òv‰@UMUMÖ-·àÕp~íùµ†oþp…+d“N'ÓIuVe–ßu®ý·3à ·ô }@Qg˜µù^½gð ŸáwõÈÂÙþúÌ<˜é ú TLÅ€çˆs„y/ ùž<ò@¯Ókµ¿ÐßêUzPÄ&6Y73ÎQç(ó>žoø ¿þYYSßÀkõZù€ûÀ9îç³ïù“vÚ­¹î¹î¹n˜ŒNF'£.I—¤Klœtì…xû,ŸáwõxÂnôÀéK§/ùÅ¥žJÛwGë÷ú~cᓱd,ƒÊO•Ÿ*?ÁšÈšÈšTVVÂtýtýt}@O!:¸ß)µü®ž°Û·-EvžÛyÎk£„ÊDBm¡6™‘i™–Nè)=%þŠÕÆjcµ"ccc"Ï·=ßö|›ÈhÃhÃhƒHÏ@Ï@Ï€Íד:¥S"/€ïñù·<XñbÅ Ý ›'6[®{u¯·; º_÷ë~ýùù¢â¢â¢bȹšs5ç*”U—U—UC<;žÏ µèÝbñøÞ2ü®Üå¹Ë—øø<ö:®ã¶LíU{Õ^k_wýÝõwP~²üdùIë/­+­+­ƒ¦‚¦‚¦‚@ýauX^°ñ ~Âò»zÂ"ÎçIè¥Hú@ú€ßù<—q÷|"Ò,ÍÒlG“ÍæGEÞö½í{Û'ò ëA׃.‘Ä`b01(²ºruåêJ›/ä‚\àY|Ïð{zÜ—mèÜKÝKù»ùÔ]u—Yà3ŸN:év°ƒvß###°uûÖí[·ÃMç¦sÓ 4f˜a†g<ãøxßã3ü®žEŸJ”ôÖ5®q cŒ±€?EŠÐJ+­ÁÉ1ÃÌâOåâï±4 ×C jSmª ÔEuQ]g½³ÞYÜç>÷ù~ýÝc‹¸ùqꜺÀÍóžåž²Yf½Áx§Î{ù¦~Ñ7ÿ~+ý¨cê³ »u7!B`m÷Gö¥ßʯöïâ«ýû:ÿ`ÿû‹Oj_›ã IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-21.7.png 644 233 144 3111 14774263776 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜþIDATHÇÍ–mL”WÇÏ ˆSÁB‹ÝKIŠN‰ ŽÙT£&e­Š ²®í ­1ˆT¶­nWSq]!¬Ý&+M_aIVbLI §@SÚº®ZÀ²¤l¨.ØyÙy{žûÛ3Ïlù¶Ÿ<_nþçÜsþç¹÷>ÿ{DD$%: ĥǥǭˆà¸JÓ¿lDz™m|NK±¥øÚ1xðßHý0õCý†‰¸1?6_ĬËgø%ELGâ…Ä –œ(>eÙeÙËVFpý°^´^ô†áåK/_èhîhæ×03430—3—&6âÆ|#ߨ[_Nü„_>JøÈòOH\š¸T2ò3òÿMdÂÄãðìîgwL/™^¢â@sI$©ÀÃfc°Î7òzF}ƒÏàô#¶=m»)œ/œ·~I¸ÑÊ»5Í5Í úBù=ïñIv…]ZµVM€m::À_U›jPWÕUíí´†[í np„#$©ÙH=u§æáš‡Ê(EƒEƒÖ`åC+2÷4:6<Í%ÛJ¶Z44PÇõçõç ©)Õ§úPê²êU½ ¾Q_©¯0̓?54ÑDx„G whʺ˺lx:f+ED²Þ¦ÛÚbmqÇÃÄÚ‰µÚ À.׺Nÿp_èD¨=Ô¾ˆï=ï=ï=M†&C“‹ãÁÁÜ`.¸.¹ü.?Ìþùvþí||sß <Æ.ÿÛc#c#Vͪ¹ãÕéH?ql©Þ ¿xáÎ w’Ãnÿšñ5ãjÃsûw¶îl•®µ?Ïrg¹Åš—”7ž7.rwÕÝUwW‰xÚ¹>Y¤üWåûÊ÷‰L5M5M5‰Ü¬½Y{³Ö§Ïùõ"}¹}¹"ñ )#)#¼´ã—y¼€û6ö­ë['RªþTý)‘©Ê©Ê©J“0×™ëÌuŠdLfLfLŠªU*‘áMÛ†7‰øZ|-¾‘¤¡¤¡¤!‘ƒ¶ƒéÓÒƒ–4^’%""îwÎ×_Dåâœ=sèceõõ }¬} À<ó(þ_Ó‰*pÔ¾d†3á±ðX Ÿ:tìÐ1CÏÎ9…ލŽa·Ž»ãÕgãöq;hˆè˜ömÐôâÓNkÚ(‡êR]1¼Åz±^ ,e)K[Üâh³Ú¬6 Œ2Ì0è_ê~Ýê@Øvà‹¦ïÂ;öãØÖëŒ;ÞÐÕÅÊ,µ”Z€»Qež×ºµnàßú}!‚ J®¡žèÝ&Lxaà.\¦zàÑ÷ê{ Кcá„ÒÄÒDc¥þGù£w%EûŠöÅÜ•¼úè«.¸ÔQG„Ýa7€V®•uE]À‚LlÄùF¾QϨ¿pWFù#ýÜϯ‹ûö=v¾`ÿ °›øy|<%lIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-6.1.png 644 233 144 2575 14774263775 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü2IDATHÇÍ–kHUYÇ×õzKAoÚc ì=PÂäÐÓB‡`¦*B“a˜L/IH¨@š2†bú0‘Tp¡'ö¡Ë©Ì> Ã`#˜Lå\ÑQçfÞ;zÎÞç7î=çܦ úØþrXk¯õÿÿ÷Úg¯½DD$-öH˜0;Áµ*\ÒÆ¤Ÿ_ŽÚçx¶z¶v…)g§œH¿~Aw¹¶=oÇÇ狸øñ|¶_ÒÄuLLxrcöq(É*ÉJšµ¿kƒäëÉ×ÇLØus×M€k¯]¤‚O‚OFrGrÁµíy;ÞηñâñåøøEÀ×âkñôÂäI“'‰ÀÜõs×/Ø èY› 6¼ö¾öZ  R¬\`”QìñWœmÏÇâí|ÏÆ·ùlþ¨ék§¯-¥[J“›¢ ]͘‡2eØ|Æu®p„#¤XíFÑ|kö˜=ŒƒõÜz˜–²`Z­V+€Ú£ö0Î*3ÏÌš)§œOÙø1>‡?ªGÞÝÛSë0‹¼E^GÐcjÕµô-s»¹#6aYeÖk J*©¼7¬«Êªë‹X„ºO÷aðVT Ÿ¢¤¢$[à©uq[)"’ù=$“ƒ£‰Œw‡»ÃÀŸä¾¬/63Ì æ<0X=X F–‘edÅ)¹Ï}îtÐáºÇBcc`¼4“Íd«Úª&Ì/6~·êVàðÇôÄ„ÿ v×í®.è%|iÎ7ç»({QÖYÖ )•)•)•°ºvuíêZ®®®w…è4¦Ó`äôÈé‘ÓÓÓÓwöÞÙug—‹§?›HšHr²–8ü1= ѺeßYspÍA]."âY&¿&¾L|)wOÝ=q÷„xZoíkíi¯h¯h¯ÉLÏLÏLé*é*é*g„ á‘¼¼¼‘öíÚˆø^û}ƒN˜‡6Ù/ûe"f.³ù=àà` ¸<¸ÔWïþ+ÍÍO›Ÿ‚¯ÆWã«yÅóŠçCþ±ücùÇ`Ô?êõ¥”R jL©1PÙ*[eÃÊÔ•©+SáÆŒ3nÌpqUŸ0ñLQ~[O‚ˆ·À[À"¾[¾["bˆˆÈ­=òc¤1Ò(²tÎÒ9Kçˆôz½‘á‡Ã‡Š4Þk¼×xOD®ÊU¹*B>ùä‹xŸyŸyŸ‰$îKÜ—¸ODr%WrÝÊJ’,–ÅŽ5äðÇô$ˆèÛú¶ç7³Ð,ñœ‘évÆŠE+®X(Òïï÷÷ûEšBM¡¦H¿î×ýZdÚÑiG§iêlêlêySõ¦êM•Ë?Ñ2Ñ2Ñ"¢^©WêUœ°N¹)7kºÍïè‰þl?„+¡+!àk§õ9՜ʸ]èK•—*/UB¶™mf›ÐiŽ4G`dïÈÞ‘½P8T8T8ÁH0Œ¸t8çpÎáèØÜ±¹csÜ!é5ŽÇm|k§ÃÓóþ©ŒØ§DÍT3ù¬b?p†3q¿D]tuÔQçW(ÿ7ÆÝeb9j:7Æû§òý>¦»n#šëc»õnÂÚ¯st¨ U¦Ê@è]ì`;Ü6ÁINr2®2_ëb] Ößd Ïés„ T‹ëüN'¶;³z¤èr]ŽÁ?öŠ1ˆ.@£!B€v*fbocñ†Þ®·c€z¬TçÿÀ]É¡Y‡f9×zêIq·@mSÛ«ÍjÀƒ\Ûžw¶,–oãÙø¼+?Ù×Å'ûû4_°ÿœ$×þ†Óÿ"IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-39-red.png 644 233 144 4300 14774263775 15616 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜuIDATXí—mPSWÇŸû‚‚(¶JâjÙu50PT\: B¢u©SmEmŰZ»øÒÐvjÁµ8RVq¤- H×m„D»-ZÛe´ìVÅŽƒ[±£ft"SK|K`‘Ü{ÿûœ››Ì¬ÎÎîó%yÎy^~÷œÿ='!µ dü‚±Ö±Ö±Vî_þ¨1­cZÇ´.š'J¢$J]¦TJ¥T`tZ©"‘D™ûJ‹gù¬«Ü_Ì£åÛJ[i+o žû­Ø*¶Š­–ûÜ6n·M‰‰uźb]øÛòë˯/¿¬¼µòÖÊ[@^f^f^fÀgó,žå³z¬>ë÷xâçûÓ?æø~ 7•­PBaBaB¡ôfcGcGc‡é¾ç¾ç¾@€CÄ ô¢½€êûçY<ËgõXýà~Ó?~<é¢yïà½m¬@æÙ̳™g}¿ëñöxz<èß”de¼2>©Ü׿k¤4)UJ¤\i‰´Ò¤,) Ê¥éÒt@IV"”øX>«Çê«ÀAýuÑ*gá,œ…HÜ#î÷4]f Æ*ãã_® ö–Ô!uÀíkòžóž”^ÿÄV`ÈKå¥d5#QI0"‘â}MR“Ô(oɱr,Ü,ÚXe,3–ùrYÆÃø(ìfØÍ°›¿ŸÃt»uº %Ñ~×î¶»ñÐ_Ç-í•KåRŽJG¸]&— †ß~S.(6Ø@š#ÍàvÕ»êÀÛàm¤½òmù¶šä¶ßµËvu»u;u;•DÆ£ò‰%b‰XÒ¹‡MÔÔÔ(ÅþC> «egÀólγ9ÀèkÑEÑEp¨âP…Ø6Õ6ff4ñžIe“Ê õJë P´_]AÝ+u¯(ÅêÊñ‘âŒMŠMŠMBÕýE÷gÝŸø_Ã={æçãžÝeÝeèâ»xxãË7¾€ðóáçÀ½Â½r¶ål€i»¦í€ó«Î¯€×{^ïàŽ|/ò=úÛïÞ~WõÝ_t÷‹»_Œ‡ñ1Ð?-Û·lß²}'“z¤ÓÒiN6´áç ?€åEË‹ÚE8±óÄNˆü1òG¸ôò¥— úXô1ø$ç“m¼kØ5 \2— ÀyØxØH=Ú 1ÆçÅñ¼®¼®¼.5P’r$“dD"R[cpÕà*xî—ç~ÑJà¥Ê—*µqIuIu0_œ/€«ÓÕ Mýhª&oàà˜ƒcig¨”7;ovÞlõÜ>Îû¿üÕÑáèptP‡÷ðža³°IØD  ¸†kD4ÀÎ a™°Œˆ¨x x€ˆ¨¨¼¨œˆètÆé "¢k%×Jˆˆ¾™ðÍ"¢¾²¾2"¢iYÓ²ˆˆönß»ˆFüålXŒÅDüW£ ¬‰³×Ùëì¥ÆG|.ŸËçzûÙU÷—­‡:¨‘@¸»Ö] ¦ù¦ù<ßÙ¾³iÞàNЮì§ùŸæÀUýU=\4\4À°iØÀw5ûjv ^:vü™ãÏúý£úÛôoÓÕ•ÜÄ¥p)\Š·Ÿ„¹Â\aîŽJö–é¥kÔ5JÓí«ìEö¢’=³of¤ÙÒl”¶%mK tRé$àôœl}¶>XwkÝ-ˆsÄ9àûÆï å~–û€ ņbÑèà‚g‹g ´Ã°ß°_V/!NˆâR”)Êe"ψgÄ3ÍõÀÏË~-û5i;#•Í?¹~rÁk’”$b+øTüSñpÄtĤ]éþªþ*Ⱥžu€ÛÿÐÐfhä†Kµ—j¡°è®;°î€<¤n6 ¯®õ#Ø[Ï,¡6,%,%,¥÷K0—›#Í‘J¶z~Lô>í} àêvup{[¼-Z@¥SéÔ¸¹_îwš; <}ž¾ÀV· ´T·Tãõ ­ä+ùÊáEÜdn27yVc pI½R×rk¹µ9õ\3×µ0­È°¶[F,#°ªÚÝ.Ï“ç:ÐÀ#7È Z^åCåCP&*%[ù\ù< %G³ãÇ€>\/è_‰º’ï »„]f£Š–K¹”+ê¬Y”EYâûd! Yˆ§Ð/ô¿ù•zµÖëjt5¾û;ööZíÊ›åÍZ@xá0ä÷­X€€²ZN—Óáaak.®ùaÍÒvõÅAkEü–ø-ñ[ˆx#oäÜ1?]Ãçÿ\-Ün7¸“‰¥‰¥‰¥Da…a…a…Ö U»YÆ,c–V»²Y6Ã+¬°x€x 9gH3¤-֤פפ+Ùê]ãöÿZ ÞiîTÈÖâž öuá£ÚµÓh·Ü\®ÑnŒ/Æ’ïÈwä;-v£Ý€5¢;¢;¢[Y®j2Šâ£^ýcˆkCøÆÒㄚí.çš¹f®Y«]k»µ= ]_»¯Ý×x•Å?Š\—Á%ýFÕâQá¨pô@“š_z¡€ãé `Úu Nv«uÕºj_Œ½ÙÞloษù¤ù¤ùdàØëÅz±¾Ûÿ—$âBH_ÿ8E> 0ÔX«~ížøOÚ]¸táÒ…KÚµfX3¬8<:¯¨;Áåsù\~ÎŽà6üƒ¾ý—ö$í.*…J¡²7çïÎß¿[ÙŸ<’<’<⻢nµSp Ns5Q5‘ÿØì!ýÆÒÿh¡Ú­öÚ¸õÜzn=@‹i1-–gòSø)ü€#Ž8úû9ý~H?D$t B'wÚŸ¸:dçþo£~3‘‰Lâåàéw x…WxàNq§¸S·§ŽŽÿÚ²3=!uŸ¸Õÿ‰éƒÉò´BRIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-55-grey.png 644 233 144 6170 14774263775 16017 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü -IDATXÃ…—TTåºÇ¿ûÇüö2káEA„˜ˆL‹s´Æmá\D )²åÑÆñPIJSëz ¡¬$”Âb‰`Þ+a]-F]D¸†+š'X⇸PÁ1&f˜{Þ÷þÁ ºº·ÕóÏ^ïÞÏû<Ÿý¼ßý¾ÏfJJJJJJ°óf¿°ëø›üMþ&m)©/©/©§ÿ®¿§¿§¿·1ŽÒ@xèe!TBö¸.¸.¸.ÐP‡:Ô1EˆA b aCö`öÐ$é’tI:SÄßåïòw¯Õ1ÆÂXþV[º¤tIé’Öþ²e;Ëv2f!Rˆ"™ÔyÒéãZÌ.&#Éìi¢'z¢'n»Û$ê›ôMú¦Ócn³Ûì6ÿéXåXåX•ð†¢JQ¥¨BsBJBJB S”$J%‰€Ä Ä Ä À?ö?÷ûûçûã-Ä÷åóç÷óøùx_×Ò@È&‡Éar"«¸H.’‹l?ao°7ØVƒÁFïë)C)C)C¬'¾/¾/¾ÑIŠ$E’"8ðÞÂ[ÃvavXŠ¥X ‡+Ìæ ƒ®ïRߥ¾KÔÓÓÓC^ŸÚ4µijÓ‹Gä‘òHyä¤ÞoŽ7gCÍ¥¹4÷æ °kYRLŠI1¹Lçè û7n·ˆ[ÔížqϸgVô¨7«7«7 ÉyÎùòÉ—Or¯ªŸP?¡~BHv;Ü·cE§àœ¢=ÚÏãçcvì<Ø JA)(O]³gØ3ì;W««« º\m®6WË7£è€ ^xáE6b#6â·‚‚˜/ÉkE+ZpàÀÁ-´Ð"àDljŽ‚îFÞ¼y|³Â 0( õ?ò3ü ?ó§V˜f…ÙÔD÷y÷y÷ù«ƒ3ƒ3ƒ3itfYfYfï׈M¨ê…z¸Þp½ázp7qÀÝãîq÷n›Û涸‚+¸­d+Ù 8‰“8ÉCþkÝkÝk×Ç®]#À?³;³;³›?œœœJ£ý<~>žÆÐóv†GáQxÀúwÖ¿³þ¤,îXܱ¸b_ ùÈÅ‘‹#úç꟫à6s›¹Í€pL8&īīī€¢Ð¢Ð¢Pàö–Û[noNÖž¬=Y ð|#ߟ Ÿ ŸƒÄ 1« V¬B@`O`O`šM¦)šFM£…‰ÂDaog°B´-D?™888‰×<®y\ÃÔ`öaß(ìÛìÛìÛ€€Õ«V»Gwîr6ålÊÙlÞ¼=\–\–\~Ñý¢ûE([”-Ê–‡üSsRsR¬¥YK³–ŠEŠ"eAâ•]+»Vv15~?ëšvM»¦ñYDyDyD9ŠdŲbY1ÞåÞåÞåàýnÜ*¸UÈze½²^àþÑûGïì“öIû$ JT%ªHq¬y¬y¬-—-—-ÿüãTqª8@|X|X| Ëè2º ¼ìªìªì*~?‹ƒ8ˆƒL {†=ÞYÈ#ÁU\ÅÕ‰§²§²§²»#wGɀ0,2,2,ªŽU«:öÀßò™å3ËgÀÄ3ÏL< H¤RÀb1„Uú*}•p~èüÐù!ÀŒ3ãÌøƒüìKìKìKŽã8Ž31<Ê…r¡ô¬mmm ó¸°CØ!ìÀ#ü}þ>Ô7‘IU¤*R¹F®‘k@¸6\®,--C}‡úõ×Ï_?ý<Þ›Þ›Þ Ì¦Í¦Í¦mmm€Å`1X @ù‘ò#åG€ï€wÀ ¬Æj¬ÆB>Îþ£ýGûau¬ŽÕѳ¬´\Z.-*G–Œ,YBÏöîêÝÕ» @;ÚÑŽ9O–'Ë“LfLfLfJ¢$Jò rr³Ü,7ÒŸ¤?IlN›Ó榢§¢§¢¥T)UJò’GÉ£ñZñZñZ`ŽŸã熹áâáâáb`x|x|xJG¤#Ò¡’G&2‘YZÇky-¯}¯¸UÙªlUz£¢®E]‹ºÆž <x6£Ö¨5jÀ>Ï>Ï>l«ÛV·­0›ÆM〨^T/ªbh ¡ÀÙ_d‘ xŒ£ÇdÔeÔeÔ¦å¦å¦å€¸B\!®"ŸŒ|2òI¸üïñMá7…ß’df³ŽYÇ^e4Œ†Ñœ°rÙöl{¶½³Ý©wêzÕÛk¶×l¯=ñ÷{ª{ª{*ï¾U‚*AÅnUO©§ÔSpLLLƒï˜è˜è˜¥ŽRG)¶9msÚf`Å»+Þ]ñ.ðȲG–=²    :¾ïø¾ã{À‘îHw¤i±i±i± Qû£öGíߨjT5ªˆcðéÁ§Ÿfÿ"ÕJµRí¿^ðtyº<]Y©Ì[n¸  ]èZvTtOtOt¯S6kœ5ÎWänèÙг¡‡jSGSGSG™ÒI:I'¨çÏžÀðR^ÊK.ŸËçò¬Á¬Ѐ4øá#ÀçŠsÅÜîwà­¼•·Âq=ézÒõ$d5˜L &|#3ÉL2“så(G¹„,Ä"±æÙ:¶Ž­ãºa„Æñ$’L’IrNµ¼UÞ*omÇ¥W.½réúXXDXDXóeüXüXüÒÅ߉¿9£ctŒ ·émz`º˜.¦ë¡£S $€$M’&I`…VØlݶn[7ššš„(Q(HÄc¾ýÛO ƒº?ÓJZI+ù0_›çMšïù·™*¦Š©êÈg׳ëÙõ¯_ÀnìÆnö“¦íMÛ›¶ {­z«Þª‡œ9À`ÀFûi?í˜p&œ |½Àƒ³¾Õ¨¨šª©zA‹ßžûöÜ·ç¼û,Õ–jK5T. —„Y¦.W—«Ë´£¥(eþ&˜`6øûQÆ0†1¡…(D!s!Îgˆ3Tn•æIó¤y_–Y‚-Á–`ÞúuÈ×!_‡x÷ù 3Ìp¡}èà†î‡z“<šGó@™÷˜÷˜÷ ¹2|eøÊ0Õvµuµuµq•ŠEˆ"äŽÓ}Ú}Ú}úÍ÷ûKûKûK:L‡é0”¾0§ü ßõ YD‘EPöNôNôNîBw¡»ðÍ÷Š@EàÍ3CMCMCM\eËö–í-Û©–Égò™|HÈçäsò9(dAÐ:CgF`FÀÜýáûÃ÷‡ñ¥q¥q¥q%” ³Â¬0d YCÖ¼ù>[ÁV°wœ>)õ½fªÿXhÀ|¿$ßзD\å¼v½û˜d&™IÖnÿåh?çÙëÙëÙK^}‘¼H^$ìºøŠøŠø ¤“A2H!gcÙX6.¡H(Š ©VU«ªU^µù)óS槸Ò•Ò•Ò••˜ÿh^¿JjH ©áúV¶À¿beeeeee°ù+ ß ù´»Ï§Ý£>íž_Ðn.r‘Ë~Òäiò4y„½ÖZk­µr–eY–ÅŒ¿­s­s­sÄq§æNÍî†t¿t¿t³kÜ5îß䯳7ž½ñ,àŒòï§~@?ß诀ýr_€Ë>ížû?Ú µ„ZByëW%_•|UâÝ5ÔPCÙÔÔ„ÿºÔ}©ûR7³C>(”$ŠD‘¨W;ùl>›ÏžûctRtRt;íË÷þê×\~Ã4F£àöQ1S1óó£æGÍâ?绫 ’hI´$ú¹O~Þðó†Ÿ7¬Öë=Ü{ª÷Tï)ïÚYϬgÖÊ։։Öý5ŒÖÒZZûEóü¶ÅbÓ˜&Ký+à+”ðk¿c¿¡]=ZЂo)½@/Ð ÛÈ6²ßE;·8·8·GE5¢Q ;Àår¹\nÛÿ¨UªÆšaÓ°iØÄ\$!$„„о¸M>@Çoq°øû•v}Û…·ùÈG>ÙÉìdvþCE[h mùÛ.Y„,BÁpcÜ76A‘CäÐÞ‰Á_|˜D´/ž¿±œû=Žÿ°üeÿ>¤!IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-17-grey.png 644 233 144 6046 14774263775 16017 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÛIDATXÃ…—T”պǿ{¿3ó23^äG  ‚†¼†ˆš$?4B¯¦g•¶ˆ‚âp\žXj&¥AP.±4ÎjEÈ­«Ñõš‚Éé€t  ‡ƒFA( ÌÀ;ïì}ÿ`XžÕêùg¯½ßw?Ïg?ûûîý¼$;;;;;.˜5ãlC#···xmöÉì“Ù'¹gîpîpîð†¥Ü•»r×#/Ë^²—ìúÒLÕLÕLÏÇqÇq’…@"@7ºÑ à%¼„—x¾ø”ø”øÉRüªøUñëÕãdŒŒ‘±ý¥999 yÉyÉyÉdHö“ýd??ËÁší\.t0 a£Ÿ³\–ËrY³4%MISKVæVçVçVÞ/ ICÒPý%sˆ9Äúª¶H[¤-BMèúÐõ¡ëIÖ*å*å*%°Òm¥ÛJ7ÀÑwÔ|¨Ë‹åÅ'®N%L%L%$¯Ðë‹õÅò¦´ø´ø´xE |á _˜Ø1vŒƒ3y˜H÷K÷K÷Ò„4!M’I2I&@*“ʤ2À\i®4WÂÙa‹°EÀ”™™©øÜ}¹ûr÷å\çàqð)x äo%XµV­U D¿ývôÛXïRçRçRkfͬâI<‰'€Ã8ŒÃÀw·¿»ýÝm`ƒð<žÇó¬ÉÖdk2Pt®è\Ñ9Àècô1ú‚I0 &@ñ‘â#ÅGoå­¼;v$ìœã”qÊ8%Ìë6­Û´nÖWê+õ•z@é­ôVz¿•@e¬“u¥»Þq½ãzùF=õh)±gRE#i$†?þdø Ì³Ì³Ì¨ ® ® è›ôMúæüÎ*“”IÊ$`Û•mW¶]’*’*’*€í¦í¦í& ¢0¢0¢´’VÒAû‚öí››® ® ® ®#%Ÿbftftfÿ½4~iüÒxd©[Ô-ê˜YK` ÐÐJZI+îÂ]¸ àñ¢Ç‹/cÚ1í˜àI<‰'èCú浪 Ñ…èBœÇyœìZD‹¾EߢÖJk¥µàó½Ï÷>ß,„…°(4mš6M̾á¾á¾áȺ6zmôÚ(ŽPÂ!"ô4=MOÏ­L$?Èó™òœðœðœ6ïß¼ó~`ÉÖ%[—l¤©GêYð±ØAm’M²IŽáŽ—Ö^Z{i-ðËÁ_þrˆ},ö±ØÇÌ{¯à•ùøô9ú}ÀÇø“@*x ^‚ÿ´ڴڴ}ò^y¯¼ù’|I¾GÚÐðžÂS8NG:ÒâGüˆß‚ñr”£6„ ÿ†ÿ{{{€Ç“Oz< P§¨SÔ)›`l Ù4›fƒÛ½Sצ®M]Cõ§þÔŸAÞuz×é]¹ Ï£Ï£ÏƒÑ^Ú^Ú^ ¡……°:RGêæy%”PqˆCÜü8oçí¼}¾ßçÚçÚç X¬ Ö t(t(thÁÂö`öÀ`¹¹åæ–›[àaÐ0ˆ÷œúœúœúäŠD$"1ç¸"[‘­È&Y n n n6ãrãrãrh¨–j©&Î9ç|Þ?sa.Ìp,dô=þo¾ß–ß–ß–Ü÷ã}?Þ÷#àbq±¸XlÆflè ôúfäòy4_¾2|e`aÄ@ Ä€ˆØˆ­LE===PE«¢UÑåwWÞ]yw¥póìÞ³{Ïîµí¶Çsæ%¼„—`fNDb†˜ˆb§Ø9F¯Ò«ôê|ÿNøð;áÀƒ &<˜°`¡õ¬žÕƒ#ˆ€XõNÕ;Uï0óÀ©S§è?U…ªBU῞±ö[û­ý{¬äàÏ>ø3€V´¢õÁbå°rX9ܬž¬ž¬ž¬~(-V«ŽUó˜ø3ñgâÏFþ$’? n´NZ'A8á„@l›ÅæylÅVlÌ…æBs! fŠ™b&@Si*MÈ6²lƒ¹}ûþöýøSyqyqy1¾Rÿ¤þIýÓô\àBÿ„ !èÆŸ)=NÓãÂez”¥GÿÊzY/ëM•4Mš&MÐäßäßäÏÿ³ãÕŽW;^Å)»V-Êiå´rz  òÐs8‡sÀl±—…ËÂå9@Ó„Û„Û„45¹5¹5¹²¿²G٣숉˜ˆé#kÈ²æÆŸQ€(¼íežmÕlݨx‹‘"RÔ¸“FÓh½§ iHCý[5¯æÕ\Î0 …Ð+ä ¹?ÉOò“P@€ƒƒ/¸û£…(€—ñ2^6'çš]5»jvÙv½6öÚØkŠb1@ Nåéóõùúü÷/ 9È!ÿ‡^ô¢WŽuÔ£Zô£ýr'2‘‰LRµ´riåÒÊ‚­NéNéNé§òÆÜÇÜÇÜƳâYñ¬8¯]L`˜A:Ð`Ó˜ ‚ *€_äùEp²‘l$!¶Z -ÓZßZßZ/h=´Zi©\*—Ê÷îÌéÌé̸¸‹íqN8@Íöö4[ıEX|ýöõÛ×oR¦”)eî;¬uÕºj]oî®î®î® j“j“j“x ÙIv’Ùgì3ö8ÔPC ðq>ÎÇ"™È°ŒF #œª®®ÆbívH;°Õl5[½ïð¬ô¦íR,¶Ÿ!ñsCRö_ÑÞµo‘P€zÔ£Þ¶›„‘0³uö—ãÂ9k†5ÚÁvmgÛÙvF#—]vtÙQ<źX낆Ñ „9KÎ’³ ~ðaÀ‡6ýК¡5Ck„§`§`§à‚µ³Íž²VÂJÅöý«cÇòòòòòò`rdö9 Ùµ»Û®Ýb»vÏÿ›v­ÕÖj«œa,5–K¡¡”RJ1îÈDƒ¥ÁÒ`aæ’’¡Çé€Ó§53ƒ3ƒ3ƒÞï‰ë‰ë‰ì€þöyàܱ‡{ìž4víÚ=÷oÚõóóRÏdŸÉ>“mÛ =ôÐcq‡[‡[‡þ§érÓå¦Ëd‡¦KÓ¥é˜?ógþ»šÏ*žU€ç?yþ€ìÞì^óŽ[uk~j¿ˆŸÊgåe©Ø‰Ì™'U‰¸ Þ)~§Ø•»ÿõ ¸O¹O=Ñ¡ñtãi€/Ž}qŒ?Cx4< 0U5UvlÕ­ùV¿…—Š/mÿÅ/‹ 8@fFf†¼VðÚªÝ î­‚š7kÞx”þ(]¥€1 d‘¥ª€f°ÆRb«ž˜oõ[x¾Ågñ/èÈñäxDÀû®÷]wÏBÃÏЛóšó,>íä}Þ'‹cú9ý€Ñj´çÚ®¶ƒºiÞ4oªUµ†á3|ÄÕ¼×â ÓFYêqï[ÿ˜Ìxç3.x_ð¾àî±ôØ[iŠˆtnŸø$)hDµè­z+¨ÛÆ-ãZ¢ hÀ‡̰6ÃÉC9•S9ìd§F§v4À߯_®/×ع5e+EDŠ>÷„{bÆ ¡ÙÐ,ð Û@U¹'ѹÅs‹A hŸjŸÚBâÑx4…hV4+šjÚ£öÕTS ±u±ÂX!Lüsâljaò/‘±Ès†Ë¿{ãî àšûŒûÌŒÓÒ“Ö=D¤©±©Ñ¢3KÕf­T+…©¿M}>õ9ªò¥ÊüÊ|¬¬¬µ…Õ›õf½ ®€+à @ýµúkõ×`vËì–Ù-Pp¸àpÁaX›½vñÚÅPòJɶ’m¨Û9ßg~Ÿ™Â·´ñ`ãAk庇ÂnøYןߟŸ\ù†'ÑØÁØAâ-»*vÙw7(A \¾~ùúåëPä(r9 2Œ Âú£ë®? ]÷»îw݇ÒÉÒÉÒIh?Ô~¨ý„¾ }ú@ET„8o-ð1ÝÿCÿ–°~%—–\R'˜ ¿~¸“¶Ë|Õ|Œß+ŒPVWVWVþaß°]®@l^¹yåæ•ö z3¼Þ ¨^S½¦z l47šM¨ÜP¹¡r¶~Tøü{Ã=ãž‘r6=ýý`éII¯I¯ad-º¸è¢ˆüKDD¢òw9'çDÒÃé‘ôˆˆ³ÁÙàl‘ © ç>ç>ç>Ý«{u¯$Çl`60YýpõÃÕEz:z:z:DFƒ£ÁÑ HÞ?òºòºDNO~ùÜ—Ï%Û¢êwÎ爈¥'MÄOŸ§OäÁî»ìÙÚÚ‰-‹-‹-É æsƒ"¾¾¾"=Ù=Ù=Ù"¯L”L”ˆß/þªø«$|ŽCÓßÐß±õXgŒþéþi`$±çÕúÏúÏÄ­¥nñ¶x[¼põüÕóWÏÛ[¨ Ôê`ÓÀ¦MpvüìøÙq»¾hÿÐþ!(–GˣзªoEß ûRSàû®ÿRÿ¥ßœ±Ä­¤éæí[úŒn;º"NŒ˜Mˆà8Ç9ž’?ÂŽ€B¡øã"㌣¨Ñ«ôª>­©µ©õ©[Yô1¸ÃîðŒÒB`Z>c6›ÍÌ™õf§Ù ê'V)†j.7—›ËÁ(7Êr0/˜Ì ÀINrŒ^£ÛèÃoô½`nÔºµn渕ô±Œ»€á~ä~ô”YFÛ¹|.Ÿ+Õ™cxb¾m¾–ð~èè‰ÿ ˜gžù”˜Ä\•Èýb¾g¾‡ư1üçOð=åüÿç[Is~sÒ×´S@dÙ[ll7¶uE]ÀìØª'D¢ß³ð->‹?ù­|f_Ïì{ìÙ|Áþ "kþ„HhÕ»IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-77-red.png 644 233 144 4131 14774263775 15622 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXí—LTWÇÏ}ï@wÚYh,(3ZãjW¡Ð©?Jª šHm4­H*‰Vkì¸5HÉFPê*›%­õWWJA›P4uË‚ÖJÍÆ5ÛFMhb×aT6!äÇ€#ü7÷»Ì»o~¤«Ù잘sϹç|æÞï½w Û¯)ƤŠ®W‚‹=ÔÌ“Ú&µMj[¶PÑMѾÿ3eS6eá0?@ )¤ˆõù‘/æ‹z¢~l?iq,O4_9•S¹ÔO}AiSÚ”¶–AVÁ*X…bIIIÁ…Õ·Wß^}(º_t¿è>°Æ±Æ±ÆñE\ä‹ù¢ž¨/ú=ž‡¤E±þŒ¥QiTõd‹J/K/K/ÓÞ;Ñ}¢ûD7Ê÷À÷À÷€ 2üÃÆxà0|=.òÅ|QOÔí7ããÇó‘õi©Oº/Ý÷üEp|ë8é8©¾âºßp¿7tã™<§AÕªÕ*µ Ðìj’šh…ê1õ ÙÕWÕW­Z­P+"ùb¾;è~Ñý"ÜŽo Žõ¸OòHÑßú´ÆZX k!Rö+û•ýM?ˆ ùòäQ °ßá.Á§6¡•÷è ÄZ(Î×ã"ߘ¯×i¢Ÿè/x™î™î™î­˜'¬µÖmÖm|fï€g“g†õ:>íàgÈ‹ð=œôpŒîÝ Ã Ã 0vaìŒ;cWÇ®Æäß½ h¦L€ÀñÀqøzî>÷y [k­‹­‹ùLÁcð)Û•íÊökûEà“ ‡‡üЯ¶øÈG>-}€@8 Ct'€Ä‰+ |¨|æTÌ©ÂÇ/*?T•T¦jS5 ¶¼¿èýEÆúû?ÙðÑs=Çß1V6†¸7%#%#%— >;ø¬1Q… vØø:,hlll€ösíç úÍê7@š,M€ïî~wºçuÏ€Ï^ÿìuhooo€ê}ÕûøØö€­ÛÛíô\æô‚Gð Ð?¬:´êЪC‘o¦¹5·æà…áBÍhÎ9a^r^2lûtÛ§1bÍ åÿ‰ÿô˜|Rs+ƒ•‘þ‚GðIú‘zÁT`*0g,6ÓVÚJD“éz†ˆ(h ÚˆˆcŒˆèÈKG^""º•t+‰ˆ¨f´f4úQW©«ˆˆØ,6+&ß|ËLDT3\3LD‰zz#»ÉnFú›ZM­¦VãÈ‹û•—,lXذ°wÆÙ8gÎâ,΂cwq9Ÿ¡ªP¤zR=ðÁnD¯˜ú®únÌÊV†*!? ‡¿WGÕQ€gqwÀØ+G²#Ù‘Œ;‚¤B©P* þ¬8U~ªüTy”'L¦¨¾Î¢Î"07™›À}Ñ}14WÍö;×w®óçæÏ¨îwG$ª "ý.Õ_ª¿To¼€[YËbYÁŸIž/Ï—çï©§Ì6Ý6Ý6]›Ñ»¶wmïZ£€/KKKKpû¸}<oãmPTŒ.-*-{Ààׇ_ã_ò/_ãküðs?2ödìÉØ29UN•S “¹À\`. R.+—•ËÍ}Æ…¿féÀÒm§±ÎðzÂe϶gðoùfË7Ñ@Ú®)Ü`ÒÆ å´œ–ÓoÝ£îQ÷hÈÜò–ò–ò–}n›Ûæ¶ÿíHt$:“þKU­ªVUã\’>IŸ¤'%É’dI²˜47hnàû¯ûï÷?ï×›Ð÷ÍçŸßÏãç|\ÀX  +I>É'ùÕ|ÁG\:2Ú0Ú0Ú0+(Øl 6z7éoëoëosžø®ø®ø.’-+‘•ÈJàÀlÁ(á€k°k„"¡p¸Â\a®0dwµwµwµ3ÏŘ‹1cè¦ßý¶è·E+ö+#”ʈùro¾7ß›ŸYÍ X+¸·’€€€[ÀÑ­t+ÝJÿÅœÌÉœa“ùIü$~Ò%­{È=äšu3:+:+:KL+++ãßÏ•éez™"]J—Ò¥P²ÂB6ŸÍgój£6jh<§ñPʲeÙ²lˆþç ?.ü¸ðcþè§¢ŸŠ~JLs;Ü·cÖM^Å«xÕ%­ŸÇÏÇ):ŠN@2M2M2m×?çççgeE¾ùBä bvA^A^AžpU¨NT'âo4”†ÒPxàÀõr½\/€Ô  &b"&€›ÁÍàfÜn ·ÀF0mhC¨ Tªð·‚Í› 6 W#—E.‹\&f;Z­ŽÖYY~?'Žˆ#âˆa®»ÙÝìnÎ{:87878—isss¿G†¡…ZÀ +¬€k¦k¦k& ªEµ¨ÈJ²’¬ÄDК@—Ü%wÉ7uS7Ü Ü Ü ×××øõs;s;s;…Á†`C°iý<~>Ű³c±GåQyT@ú;é錄ý” S.L¹©OHù{ÖïY¿gŸ¿ùù›Ÿ¿ ü\þsùÏå€Ô!uH€áºáºá:œ”œ”œô>ì}Øû8¾êøªã«>‹Ïâ³ñññ@Ö$k’57$nHD@àÍÀ›7áÐmÐmÐm€¾QרkÔ’0I˜$lÇbAÔŠZQ›Rx*ðTà)ì~òÙ'Ÿ}òYR‹µX‹µQ‹ZÔF•QeTƒwïÞŠöí+Ú˜"L¦ y¬y¬y HÔ%êu€ë˜ë˜ë09`rÀäàåÕ/¯~y5@ Ô@ Àø.T+U+U+!MèHèHè µ—õ—õ—õØ=š>š>šžR$¸\®üwœ!Îg@‰âŠâŠâ Þfo³·JaŸ°`ÓÙt6‚ª°*¬p„?þLø3(¹1pcàÆöp؉ØIb¸“ÜIîäÄÊdÐ@ÍcÏeÈ8q¸{ÿîý»÷=š=š=àpæáÌÙ@Œ=ÆcÔzµ^­ú/ô_è¿ØîÙîÙî&¹In’M!M!M!@uyuyu90öÞØ{cïÄJ¬Äúx~n·Š[à0ã0‰x ¯á5ì‹áyÃó†ç‘'ÅX1VŒÅla™°LX†¤ äšùšùšÓ…éÂt@ZlZlZ,`M³¦YÓ€î©ÝS»§úõ=êrrsrsr1Û˜mÌ„“pN€Á¦Á¦Á& råþÊý€Ékòš¼ÀÓxOÌÊÞ½1zw¸l.›Ëf_pòJy¥¼R¬º3õÎÔ;SÙ·Rn¥ÜJð:^Çëp:³ÙÎl cKÇ–Ž-@š9Íœf’·'oOÞŽŽŽÎBg¡³ø¡å‡–Z€¡Ð¡Ð¡P@=[=[=ûqe”‘ÊHe$ ] ] ]8§à&.;-[-[-[‹ÕbµXñžüŽüŽüŽX% ¹È-«2„ !c×Ö¶çÛžo{Þ¹(rQä"þn 1Ðhİö¦ö¦ö&¾¹ö͵o®êu„:øÑû£÷G/@kh ­´z­^«ƒƒƒ·àܰ¸~qýâzÀ<Ó<Ó<î•î•î"R"R"Ràò¯ãËâ/‹¿,¦id!YHrW‰Žèˆîˆ›vyÚåi—ßÝ&M—¦KÓî¬X=°š¿{ºâtÅé ïFŸ@ÀËË \A›ƒ6m>=ôé¡OÆc‡Èù*竜¯€é9Ós¦ç+úVô­è&WM®š\¹zäê‘«€i¶i¶i6°¸|qùâr0Í'šO4Ÿ@ÖÕÕEýæ~s¿™»*}_ú¾ôýÿ}ÅÓçéóômòí?mÿiûO:ÐŽé%$$¾UŒGŒ#ÆY™Ý™Ý™Ý,ÃÐcè1ôˬ²B0Ïž'•OX%«d•Nã4NcbwŒ·€ìkÙײ¯'‡‡;‡;‡;¡<×p®á\ƒ)±H, @ìÄNìÛ(I%©$Õ´U¨B•ækó¼Éã}£°ƒT“jR}y=—Î¥sé›ÎâU¼ŠW¹C-I-I-Iâ:ûNûNûN(Én²›ìÆ0ûŽ}ǾÈÛämò6 @„À‡ø,šE³è /œ?sþÌù3Þƒ5ƒ5ƒ5ÂAÙ Ù ÙŒÏ*¢+£+£+÷_BÊPF>‡f˜ÅL?ªBúÐ'v£Å(&gãšâšâšªþ!/’É‹>«   짃Nzì]<Â#<‚ ]èB\8X+bE`dÙEvAvÅrÅrÅÂ2:.v\ì¸ÈW©BT!ªûcîîîo½Û]Ö]Ö]0 ³0 Ô>™£~P‡ïx’N¢“è$¨oõßê¿Õ¸‹ÝÅîâ·ÞUªU÷NÞn¹Ýr»…¯j]Úº´u)Ë ëÉz²2zœ§ÇÁ € € ±!6‘ˆD„ó¡å¡å¡ŸŒ ƨU6•Meè<:Î{ëÝqëÝóYñ o™ÿ€øWîû%‘ù†¾œðU0£w#I#i$-ããž»tÆ³Î³Î³Ž¾±‚® +(·0~oüÞø½x‘öÐÚ%7‡›ÃÍK,KÄÈj¢j¢j¢¼Ñ¶T[ª-•ï•'Èä UóÇ7ͦ«´–ÖÒZá ¯²ü«¨¨¨¨¨À°?£ð˜ðÏ»}Þ=èónó„w P€îP‹§ÅÓâ×Ùëìuö:(9Žã8CþL´9ÛœmNê¸_{¿ö~-ß+ß&ß&ßÖ}ÎeuY]Ömû{Ÿë}®÷9ÀéŸúý| öß ô üËçÝ3ÿÏ»šAÍ F°Ÿ*=UzªÔ»шF4Ô]A]A]Aø´½³½³½“¬Tö({”=¤‘4òo…åÂra¹óm²6Y›Ì øæ{Þÿ…ú#? N§Óé ú†]LʤLJ^·ÅÚbm±øÄ;Ó;Ó;óߢL+ÓÊ´Kýšùk毙AMv“Ýd7±}·ŽÞ:zë¨wÁˆgÄ3âá‹% % % ÿ3ŒÕ±:V÷?ç ƒ 2þ.0€ꯀ/Qâyþ"þÄ»åhE+Z½eì,;ËÎêÌ\#×È5~­ËËË¡±’ZI­¤–3ñ|_pñ›¨Æ¨Æ¨Æ¿ë,f‹Ùb&h ¡!ìˆO·Åèø3ð®ïuá-Ãz¬Çzá:É#y$ïŸQ¬•µ²ÖÍkáŠpE8gâûø>¾ÏN÷Ð=tϺþžWz^éy„Ö§ço,Åñðíéd©*Ä!IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-24.7.png 644 233 144 3133 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïO”WÇÏP(L-¢µd¡¤J!4‘W$‹ÛqñWÒHÕ´5v]Û°f×ݵ4fY¬+ÑšÒ¥’H…ê¤S –Y[’6h*‚E‚kaCÙAGæ×óÜϾ˜yœiÝ?Àûææœ{Î÷{rϽß{DD$%< Ä,‹Y³(dǼñ'”&”fŸ Ù§40m0m<É'’O¤~–ú™>±u#>:_$‚Ígø%E"Žø¶ø6Óê°ýlÎÛœ—²ö¹ÃÜá Â[ߺÐÞÜÞÌ`òÛÉo\«]«!bëF¼‘oàEãË¿á¸Î¸NÓ¿!þéø§E ³$³$ë¡€Ñ,xÕòª`⩉§T hN ‘Dµ˜ecLGÙÆz8ÞÈ7ð |ƒÏàÕ#¶*m•'_{øÚCó§¡„áNW5W5ƒº èào|Â'$BÐthUZ>êT¹*âTœŠPƒj@{[{-Á–` ¨aj¨!QM‡ðÔ«ž«zx3̇õšõšùSH6ýÙHOÃsý+¼TQ\Q * p ÐÑAýU¯Ô+ ¨»êkõ5ÊØ"U©¶©mD†††Æo‡>æcÀbîÀ5Ølßl7v°þ•¨VŠˆ,?ŽÝ|Æ|f6FsFs ° €2gî/‡9Ì|àýÀÙÀÙ(ªnºéß^ß^ß^˜É™É™Éy¬ ü¥þUþUà¼èô:½0ýÏ©’©æ]?ù^ð½@™÷øÈ÷#ߘ5³6«‡êU$"rÊïÔ½Sî½ üËug×…ä÷’ë“ëQÅmÅ-Å-053535!ÞïÞïÞï†w‰»Äýxa]Û»¶wm‡”­)R6Àò?/?¹ü$*®ÍÔdj‚¿k9Þr\/€šêšj,Õ#Á¥""U`O²'Aó_lå¶rµó¥´ì®ì.|ÁÊ#+¬<M¹M¹M¹pcìÆØ±ÈA°X-V‹5ªwnåVnð&x¼ àéñôxzÀ±ÉaqX sÙÒÞ¥½ø&¬ó™ó™j'\¸páè*T°,i,iLµs›sL­q­w­‡‰Ññ3ãgÀþ{½½VÜ\qsÅM°í°í°í€ŠôŠôŠtØò`˃- |mùÚòµ¿ja©¿ô4=MO‹ø+oUV±= … …QG30‘?‘°èꢫªMhO¹’rEâ÷ÓEÓE‘kÿ¾¹f®fòûóûóûaøàðÁáƒÐx¯ñ^ã=0›ÆMãPä(r9 Á›àMðÂ%ë%ë%ëã-¸;pwà.dïÎÞ½r½ëz7JfÒœ~§XHMÕ‡bôƒ?4 Iû3“ÏLŠØ~üjô«QI;â=št4I¤²¯ò›ÊoDn-ÜZ¸µ ’ÞšÞšÞ*ÒQÓQÓQ#’µ'kOÖ‘ŒêŒêŒj‘%û–ì[²O䘓cçëÎׯ)È)x±àE‘”?¥~”ú‘ˆÞ$""iòíeíe1ëWô+¦!ÑÞ3Θí ÛÐ5Ôÿyÿçjgé–5¾5>|e©eñeñPQQÝŽnG·#²—Ç/_‡Z­¿ÖþB¡¿,£–QË(xN{N{NCm^m^mØ:mm¶¶Gé>ýKµ“`ëýÖû†l T…åâ”v­ÛµÎˆ× @ëÖº7?ós”n]W×Õuö{ƒ½ wêz'ÐH# *T…ªˆêásÌEÙ?0É$ŠÉàHp$ŠOí:°ë€QØ)‡ÐÖ1ÌwÌwfcÕ¿îÞ)íï!Ó~ò{üæµ:­OëeS_¨/¢nß9uN½AoЀÛÜæ6h.Í¥¹€¾ã;ÐнºTe°'ØÃ|8½ ψ{Ä `ž4OÎÆºú¸òû7š6š€ûae~¨Ù5;ð@_¯¯'€ÿ‘’‡Þ‡ï¯vF¡€œ8£”Nߤo"€OëÑz¢•cüÆøÿ«üá·ëVëÖ¨·’ê竟Ð≜ Îh¯k¯ãÕ§ú0a‚ˆm¬ñF¾gà?z+Ãü¡zžäßÅû{2°ÿ@Gˆm k IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-90-red.png 644 233 144 4245 14774263775 15623 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜZIDATXí—kL”WÇŸ÷2Ž —# »ê‚µâj²0à€Fj¢! L™šõR³^èØ6A¨Á e­Û5¥F1^CDºÚ¸bÙB[«[m»¶4dFÒ) ;2Ì{ùóÎ%[Íf÷|™yÞçö›óüÏy3D¾õ+ Y|†Þª·ê­Ü¿ü¢&´Mh›Ð–û[QeQ¾{’ÒBZøÜj ‰$’Èl ÔVkX<ËgõXýÐ~|F(O0ßNÚI;ùÆPÂ\±MlÛŸp»¸]Ü. $6n8n8nWÖ>Xû`í °¿°¿°(È,È,È ØÌÏâY>«Çê³~Ïç!þw¡ö¬Z~„áGì ÙÍ0Ï0Ï0Ëoè:Ñu¢Kt º]ƒàÆ(F1 À;ì€fûý,žå³z¬~h¿YµÏç#C4ïà¼ÃþWV óFæÌÒÒ^o¯§×ƒ^ø—šªF«ÑäJé{é{@^$§Ë逜'¯”Wò"Ù(¹RN•S5UP# ±|VÕ×€Cú¢54®‘kä‰ÄƒâAñ`ý7,ÁTc*7•KyØÛr—Ü—TïÝáݨv¿cS1”-Ê Ë@$"Œ+)â¥zù¤|PßVb”¸X°©ÆTaªòXÆÃøH×§ëÓõ­ZÌ û { {ÕdÛÏö{†üu\ò!ù’| äò®áÚáZðš½f-Õî‡òe{ðþÀ5är€÷Š÷ RÎ*gµ$—íglÀa¿á=Ã{j2ãÑøÄíâvqû­ƒÌq´ôhéÑRu‹¿€[jÔ†õrïË<¯d¼’øŽL©šRŸ^| |¤%JHb¿9cjÆT˜50k>/ú¼6÷nî€ }ú`lùØr¨Ž¯Ž€¨Ö¨Vèìììs¼9€+fJÌICÉCÉ~Or##ÆÃøè×|°æƒ5~™ÌŽs¤|¤tñºx8µæÔšàMnnÞá–=-{`ÕÌU3ÀcŽ Žïïëï Šw^»0hýüýããýGj®.G—£ËÑΘž6)ó•ùD45úýè÷‰ˆæ”Í)#":›~6ˆÈuÛu›ˆèÜçÞ¾9e=Ê""ºûíÝo‰ˆo[¼-Ø?É0É@DDoÒ›D4qð»Áïˆè\Èõ£×5éštMÚ‘ŸëÅG—£ËÑE½ÞÃ{x„mÜqî8~ïi±´Xˆˆúsûs‰ˆfg‰ˆÕ ¹õD¨#"Ò¥ÿŠˆÈ{Ò{2ØÏ%p D4NuTGD=ÔNíDü%ˆ?HpÚv§zñy|ŸçýÉ¿Å5§wžÎ?$‰ŠGñÀ=7öðÜé»ãÓbÎXÜ‹¸<úë-×[`eéÊR(n*n ªÔ¿º5ˆŸˆŸrsë§­Ÿúýýðg³?›­½·ri\—æý‰„t!]H/¯f§,é7I“’&ɳlëzRzRׇš¿.L/›^@ý¢î‹:ÈkÎk€¹ïÌ}'Xf.¸ÂIDATHÇÍ–oHUgÇ×›v¯IÎr³´ˆµ *_$%åu™R¡Žd &¾¨Åˆ5–ПUóEHT´i5¸¡Œe¸rz‹ht[#4×*)Ш.u'*6Ù½çœçùìÅ=Ͻ·Z{ÝóæÜß¿ï÷{îóü~ç‘Wܧ@Úü´ùi3ãvÚI¿¯ÒWùÆ·qûK<ïxÞùãSÈnËnÈéÈéP7“¶‰›üÔz‘$~*ŸñË+’tLïšÞå ¸v3¼[ôn‘ïÕ¸}è ø»ýÝÛ°µgkÀÙ¯Î~ÅGþ9ü3ÀX`,IÛÄM¾©7x©øÒü ¿¤ŸO?ï†éÓ3D`AłЅÇî,„ê Õî{ï{u8 ‹,&™Ä¬¿RlwóM½Á3ø†ÏðÇõä–å–‰@í{µïùÛã7¿ÁÞQ°£ÀðYÝœ¤‰&²ôuë¡õèq¦9Óˆ‚þ]ÿDuLÇô }8lØ#Dõ5ëŽuè`';ÉJà%ð]¾\<½·‡×bÕyë¼ A?ñ±ó¦ó&¨°Ýf·a¹­½jJM 4Ð@re’I&èuºD—$¼Z¿fØX¬µ-ÛJÁÕyê`÷Ú½`ðøÕà9C$ø]=®°/ûáýîZÔRîÛ7í›É7ÞÞ2¼eüþN'Ô÷Õ÷Õ÷ñܯ¯¯…5Ë×,_³rÚrÚrÚ`Së¦C›AìûصØ54¨=jð¶Ëgø]=®°ß>S§&À èÍ.O4Ô::…K —.Ç+¯x¼µ,jYÔ===Ia°röÊÙ+gÃØÔØÔØäçåçåçA_ÿ¹þs‰ô¨j0|q~£G`æ3Ô].ƒSþô?p|Æqÿq?J¥Ò¤¿}$²ìê²«Ë®ŠœÞzÿéý"—Ÿ\~rù‰Hц# GDú3û3û3EƶmÛ&’ýSö@ö@R˜l2|qþ„žgÏã{®·Ù3ìDM·»swçnXå[å[僋Ç/ÃDáDáD!ÔÔÔÔÔÔ@¤ R)€ƒ¡ƒ¡ƒ!(~Pü ø´··§œ‘oœ §‚(}/Õ´ÓN;¨|•¯òÅ,f18­N«Ó ÎgÎ.g¨µN­~Py*)Wîzlwnþ÷K™üÔùê|)“gÀP›Õf,bñf,,@£PÀL¤Øš1à“ïÖ'ð ¾á{nò¿à[ÉŽy;æ%º ìI{ÀyßyŸ(è+ú <´MÜä›zƒgð_ø­|io/í}ìå¼Áþ iøh6u:IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-10.8.png 644 233 144 3137 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–íO”WÆïya Š"‹¤Â¥Ò¶4åE&iK¢„¢± K·!MÓ˜­FÓdíŠY%›í¶ë6Y‘Uh- tRÄF_h„¢+ÄbU$ZͦB" d:Ê2<ó<ç·fž¶Ý?Àóer¿]×5ç<ç¾€ˆˆ¬ÿ XÓ¬iÖU!Ûú»¨?®,®ì™Ž}BË6˶[€„O>XÓº¦Õ˜ˆÚfÜÌ_^/Å_ÎgúeµDŽ/_XÜa»jrjrâ~²ÿ2ÎgÏã ¼ÕûV/À—Ÿ~ù)ïÀôåéËóîy7Dm3næ›õ&Þr|iü¿Ä\ˆ¹`¹ŽXG¬¸^q½’ñn(a2*¶VløÑö£MY@Ÿâ‰WnÀsÍ.³Íx8߬7ñL|“ÏäéH*M*Ê•;§ÑDD&>‡ý©ûSB­‡6i$ô=h. ¨ïŒãÆq WWçÔuuè;õ 8œþA -Ä«oÂxŸíëÚ×e œøœ¶×¯œ§M=ò¿gûá˰ãÑŽG ÞІÕmö³@ÝP7Шg;ÛQÆ´1gÌEv eS6e~KuQ?Iê'õJ¥éº®£ ,€r†ðÉÛ±uGd?|yÙQŠˆl<N¿Óï·3r÷£»E`·<ö>Jx”À‚Ö¡uhQ¾€7à xÁëòº¼.P9*Gå,ÔFmQsipiniVL{¦=,³Bø0i›´ƒÎ.g—ßnênˆˆœ‚†>U`¼0ÿ×™Ã3‡¡(£¨¤¨uqÛÅ-·D‰ö{Œ=8Ï:Ï:ÏBí@í@í¿Xó5ó5ó5Pî/Ÿ-Ÿ…”§SJRJP•›ÊÓËÓá?¿ ñÁÛ¿ý1¨C!=¢îˆˆ|»º'»'áñuU_øû¼Ä¼D澎ʨŒ \ºvéÚ¥k°Ñ²Ñ²Ñ <,€Ì¦Ì¦Ì&èëë‹ ëÉèÉèÉ€ ç6œÛpnÖÞÜ~s;<ó·ôÜô\}z¸Ð{¡ô§Bz¬–§V}µê«Ü¹Sò|Éó"+N‰ˆXNw]»<&ŽÜ]¹¯ç¾.²TµTµT%252525"’œžœžœ.’|5ùjòU‘´ì´ì´l‘{í÷ÚïµKdmÝ<ºyTÄqÒqÒqR¤dCINIŽHÂàšé5ÓâxñÏÏ?;l9-’Ÿ™Ÿ)b}oeùÊòÜ«¬´í¶í&[nÇ4Å4‰ÈßEDÄk›ŽqŸDìõö7íoŠH¡J¡ˆý˜ý˜ý˜H°2X¬Œ ЂZP ŠÄÇÇGýž2O™§Ldíúµë×®ñýÑwØwXD­V/©—Dº{º»Å+’dK²‰¨£rKn‘mŒóÆyËmÑ´T-U²,¿‘$yÖëôZ½VÄ×îëðuˆ”¶—¶—¶‹ìuíuíu‰4ºÝnoµ·Ú[-’ךך×*ҹعع(²bhÅЊ!‘ãÆŒ‹x”Çð"³×fºfºDRÎ¥<—òœ$IÝ¢oÑ'"Rù*ßr;|+¿ÝÇ¿:û;ûòÐ7f^¾•^=ð*\é»Òw¥/úítìêØÕ± ŠãŠãŠã ÿ~ÿýþûàsûÜ>7TLTLTL€7Ñ›èM„æƒÍ›B~|¾5ß ÿ 6Ÿj>E Ülêù®s°s8Òvb52i èú!\ª"ŠJ)¥8ÃÎ,»~-´Ðd‘EÖ2ÿŽp¸Ã8ãѶ‡OߤoºM¾†÷ÞŒð­Œô1åœrNùíwµ»Z´{´¯µ¯YPs¤å3ÖëŒu èzÆ€1´ÒJ+ F‚‘ÔRM5èWu]×A?°äYò°`¤†ûX÷÷™ßg8pþà·óo³ý¢óW9ª&½6Ìc½Oï4£Î¨C‹ücÐЀ%æ„#àc–ÙÈ^+0Þ0Þ@# èË𩊫Šû¿ÿg³Òœ]æ¬$<Ûà(G‰1ún}7Pƒj ˆÚfÜÌ7ëM<ßä3ù#³ò‰}]<±ï±'óû_ÔÁ·–ßÿŽIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-11.4.png 644 233 144 2741 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü–IDATHÇÍ–mlTUÇŸéÛtLJÓ¥ÁI\lâ~¸ 5+%éÚb:i¤­‹ÍFTÕ˜Œ/Q6n·Mã&ý@P“I«ÎC%)[–ý4›Üi›b¬Ø¡c™™¶3÷Þs~~˜¹½]»ûóåäy9ÿÿ?çåyŽ€ˆˆ<”›òË{,ÏŸµóþäú‹ƒÅÁÀɬÝcƒçeÏËÿ> ¥Ÿ–~ °ê³UŸ©›®íÄüåëE\üå|Ž_×áí÷ö{jröûÐTÕTU\‘µÿ:¾°/œ²`ßÀ¾€¯¿øú ^ƒ;£wFâ5ñpm'îä;ë¼åøòþoøE ðLáÏ-ðy‹D r[å¶Ç_Ï&L<õuõuÓùÓù:ì „]$HàŒØ2Û‰çòõžƒïð9üY=åÏ—?/;vîØé;Ž)"r³Úm{xÀ ÓËG|D Xq+`¿i¿Išg à„>©Oèïôw€mï´w’Ærò9ÎqJøK¯ôГ‡žtÞìåDƒjP¾ãP¾§|{¦¹¹£“IЯ˜—u”wx@Gt˜c­ßÖGôÐã:ª£¸#™Û1Mšô’Wó½zF=ƒ©ÿl=a=á¸ÍËØ¡5¡5ŽÀŽÚeG)"²¡| _"QÀ•hg´s p{ê—dY²ŒysÊœ2§X1Rs©¹Ô¬ˆ2Ê(0Ã4Ó@&ëN¿1?0?ÀüÜà ‰…ÛaⓉO€‹¾_O¢€_²z„‰ˆô\„Öw[ß½@=ÿÛÌ{3ïAu[uWuzðÁÖÁV—7ÖëõBugugu' îÜ?¸ß+CÊ»Ì.³Ë\ûÆö`{½m±æçšŸ—²ŸR§öö€á¬Ñÿ¹~ú&ú& 5 [ž>h”e¤}nnnv Œz£Þ¨w/ÂPÃPÃPƒÏÌff3³®}.z.z.êæ×Õgƒ³Îaë5|"|" ü#«GHø¿ñ£ûùþÎwýZî=lþ`þ†×(2Š |7|7|×%Jë´Nk0ü†ßðC¤*R©Z¶c«ÕjµâÇâÇâÇ X, –®w}°ëøCÕöäö¤›oÿ4½fz 0ãï÷÷ë~U®zPÝà«Xw¬´ZzölißÒ¾¥"žˆ'âYyÇ–âM‘¦HÓÊxGIGIG äwåwåwÁæë›¯o¾Å‹Þ½?Â@úÛW¿}•,,€zɿۿ[ÝÈÔiuÚsCLóEóEÏ:)Ͻ ɼ•iË´‰X“Ö¤5)+FæZæZæš…Rèú»CÝ¡îȦÑM£›FEúNõê;%¸ ŒˆTì¨ØX±QdÃÖ ·6Ü’r‘”•²D<~.pÁs#O<‰/Œ]‘õ#S#S"ò{^qxkÛkÖYg¬3Ö+…m]»uíÖµ"•S•S•S"ééé"ç+ÎWœ¯   i¼ÚxµñªÈ^½waï‚È/íù|Ïç’ùÝåõCë‡xEÿsh`h@Äs,y;y{ìJ®\ô\„Ö#­GÜWVÂr+º†ÿªKÿÜã÷\S×é:]Öyë¬uÔ5¦ÆÐüÝúØúôK_ë—­_³¹W¹TÇ´ï¶ïv¢5£¦[ÇT‹yÁ¼À¼Žó¬Ô¡šU³jŠ(¢˜d’I°íE{øÃ^&ô´]l3¯ÞÎâÃøsãÏ‹¾qßx¢Ë©c+*Èò:0æeRöYû,`ªfÕŒ#Yn¥·r6d{Ô1bíWhP-ª“Œ}ɾ$sø„ŠCÅð?*ÿoz¥Ó»œ^™†¥^™;b{·½›4è=€¸¶_º¹õžƒïð9üY=÷óïâ¾ýÝŸ?Ø_±!åä¦å@IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-1.5.png 644 233 144 2502 14774263775 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü÷IDATHÇÍ–[LTW†÷Œr™ˆVŒÒ‰TM5™‘D!B JИh5/¤>H/4}àò`ª øR!©Æ%j©$‚WL0¥!VR3è” • „Á@†‹2Ì9g}˜³9£”øê~9g­½×ÿÿg­½×Ù„B$˜Oöd{²=>lÛ¿·ü±;bw|õ{ØnÐÁ¶Ç¶çùO°äü’ó‰‰F¯e«yµ>2^ ?’OùE‚°1Í1ͶÓ®"W‘+6)lÿü-Ž–) Jo–Þ¸qåÆNÀPçP'ÀXÎXX¶šWëU¼Â‹Ä5ñ Qw£îÚþ…˜è˜h!À¹Ý¹=å‡ð‚¾Èß•¿ `pÁài}ˆ#NæL ÆÛ[Í›ëU¼ÂSøŠOñ‡õX¶uÙV!`÷þÝû¿†zƒÊ••+ Ô\ä"qdi©Z*Ф ]ù\>ÀŽ“·ä-º¶WÛKP¾ ùC~~ª¨"Ž?^åŠÊ€®øXø°¶g·! £ £UBO@ïÑ{@Vk/µ—„ä?,d!r6G“d ¦™fКõJ Œ2B`Œ@$~áÒÂ¥*ƒg·E”R!¾þCŽ¡‰…àÕ½ú,àNºŒµÆZÞ)ÇT`Ê?å‡P¨?ÔÏœ!5©I ÆsÇsÇsa¸}øÎð©¹:rôE3ÇfŽÍâí¤ÛûÔû,þ°SXC”*;¼0RA›Ô&AfËòr¬nìÌØȬϬϬ‡{å÷Êï•Ïè tºÀésúœ>Xzýéõ§Áê^ç^ž/XunÕ¹Uç ¶¡¶¡¶¼]Þ.oWÄÂoµ÷Ú{‚ŸÉoêÿ0þ¡l†¡CI3°W^–—A–ËòèËõåúrH‹O‹O‹‡VW««Õ5WØù@>°æÚškk®AÖhÖhÖ(¬®Y]³º|i¾M¾M¥OWo&¿©G@ââÄņÞ¾~û:âØ7Ë òH)¥´¶:'3Nfœ„Ö¢Ö¢Ö¢¹Â¼½½¡ÃÓáéðXþ-I[’¶$A³ÎYç´üú7ªÍ(þ°»Æmã¶Í#„V !ÂÅZ&4Ñ+z…°}iK¶%‹Ù1ólæÙÌ3!ˆ"Š(ËéÕ¥W—^ ÑYÑYÑY!DÉý’û%÷…ht7ºÝB oÞ0¼AW¿ËçòYq6›É§ø•ž9{ ³æOô#ú‚ä‘K®õ…U‡ªU‚îŒîŒî ˜N˜N˜N€ü¼ü¼ü<ð'ù“üIP¿¯~_ý>HHH€¦”¦”¦”ˆÔhãÚ8Aþšw}t*™=•šÕŸ$$ȧG=ôF„ÿÚhò9Îq$è‹ôEîuóžÊÿécÒì3†Ql[}ÌøÎ(2Š€h¢‰^ð‚`8 ‡á²É&ô6½MoýGý¨~ŒL£Ô(þ6RÔˆ>¦{ƒÞ ÌÓÇ":?…±…±JFè èõÇF‰QBÈ<µw&|83iÚ’f€i•qã°q˜…§ðßœÎÿ‰e ¨¥–8«Äz±^Lä#ù6°l5?»%Ìx…§ðçýW~¶·‹Ïö>öyÞ`ÿrÒsr•¼u³IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.5.png 644 233 144 3232 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜOIDATHÇÍ–ýOTéÇ/»8,SEAÑjŒË‹ ºè¬‰’’IQwAˆÊn4µÆt›í®k4iûƒR êRvS_ÑúÉ€!Ð] Bˆ ÆhÔÑTŠà P™™{ŸO˜¹[ûøürïyûžïsîsÏyDDd^ð)¾,|YøOrø/Cú9Ùs²ÿOk¶=lû?s¿™û @ì…Ø z_H6ì†ÿìx‘þì|†^æIHUU–”ÂŽ÷v¼7'> Wu€©ÁÔ0å‡}×ö]°ÕÚjù5<ë~Ö 0–9– !Ù°þF¼7_ŽþO~x«ù­æ°'õvÔÛ"°|óòÍïþ&àà| ¶lˆˆPá ¹€bT&àÁƒ±FfɆ=èoÄx¾‘ÏÈà#÷AÜ"üe›{›Ût>Ðw™³kÖ‚ºàkàwœæ41 ‰&Àqÿ°˜õ½J¯.¨‹ê"€º«îh¥Z)3ŒùÇüc |œá 1êqOùÆŒ:‚ù(ì*ì2‡øùñóCß4ø<±‰•[?¶‚JðuSLjÒkô|ú¿õôPꘪRU¯*…Z¨ª…@Yd…ôŒ3Î8 ?ßò->`)K £¯ Š¿,þÒ¨à‰M³>¥ˆÈÏþL«é’é’'œÉÎdðð¡+uèøÐq¦}™¾Ï|Ÿ…òù¶ø¶ø¶€+Ë•åÊ…¿Â_ÁkKùÕ”š‚‰¬‰Š‰ nüzðk¦]¿š\1¹‚µ¹<<½0z¡'R5ø„“."ò¹E¶ìy¾ç¹Ùïy™äHr(ËG;s/ç^––¤u+ÇWŽ‹)›ì[Ù·DúÏôŸé?#’‘‘!’ŸŸ/Rj.5—šE¼6¯Ík“WËïYêY*’v.m{Úv‘]›£7G‹iÓ s6Ì‘–»Þùâ/”Edß¹}çÌ~Uäãÿ©ˆÈ­ƒÐjn5CíšòšòÔÞ•q‰-‰-Ì;ÏËÉËÉ˵Ýk»×vCABABAŒlÙ0²–,Z²hÉ"èÈèÈèÈUìÉÆ'Ÿl„5+jVÔ@Å銓'áaOß¾¾ÚËî«ùWó‘a™¹ßܯêÁUæ*ƒá¬±ü±|p>½ôô´i;Üv’˓˓ˡku×ê®Õ ®«ëê:dôeôeôÁ|÷|÷|7 • • •…ˆµo;ßv’ë’ë’ëÀ:j}a}IGss îÀâÅ£ÖQ+¨„˜1T½`›×>¯]·óQ`çÆoØthòÐ$X,‹Å½ ½ ½ ð(âQÄ£èìì·Õmu[aUñªâUÅp±èbÑÅ¢1{¿½ßÞöN{§=¤ÿE¼+pâlMTM#@}à÷š£ÌQº=R¿ã/÷—‡Ù#lÑÏ¢ŸIjÓïß;%îO/«RªRD*×T~Rù‰ˆkkkHýúõ7Dw7înÜ-RÙ\Ù\Ù,211111!"v±‹]Äæ°9l÷M÷M÷M‘JW¥«Ò%r¤ôHÉ‘‘á5Ï?,’¶8­%­EâD&“&“DÂãUê ³‹ö[ãŒ5}Úô)´Ø{®ô\Q{³K²f²f˜Ém˽–{ ÖÜ^s{Ímh?Ö~¬ýTŸ­>[},é–tK:Ô9ëœuN}:útô)ÆÆÆÂð½á{Ã÷àTÉ©’S%°þ_ëﯿW–×vÔvÌ:c%Ws®æíÆ ̲NØŸ³?Ç(´¾´ï´ïpãF½ÞP?ÒÞç>÷jª©ž¥ï¥—^@Ç‹wVôßý>¿ØjäÛrÿI`:ÀG°û&‡Éá‰T7ï;Þí>¦ÝõŽyǘÖ.iµ‡ v¨mjhZ£ÖÚ!ívt‹nÑ-ÀNv²ô$=IO~Î:Öö7mXísoƒ·i==€Ï]Gª#Àä49=‘¸|^ïüÞ¢°¢0àE°3»µV­Õóõ||ø‚;&øþ¦™þQ%54`œF‚ž Pú}>^jíZûìÎ_Uõ;pVRXZX:kVòÕÒ¯B££¨ ‚ð{üm—¶‹Pª€0 $vÃ߈7ð üW³2˜?ÀçM¾]¼±÷±7óû_ÿ Ä8 IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-153.png 644 233 144 3117 14774263775 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–aLTg†ß@ Td³‹6 I»¸10³j5±%Ñ,kÖ’iÖUjÜýa´¤¡Ûm«ALÖ¦ÚþÐÄ] ±Šµa©ˆ„H¦âiÀu§°&Ú2 E,v†¹sï³?f.—ÝMÿûý¹9ß9ç}ßœï»ç|IÒSñ¯À½Ä½Ä³Ý¿wö“‹“‹sÏÅìQp½âz埂ŒO2>XX¿°Þô9¶í·ãçæKþ\>{_OÉÙ˜~þy׆¸ý¼ºüÕåÉ?‹Ù¹)M)MÓìú|×ç?½ø){!ðUà+€‰ À±m¿oçÛxsñõÁÿðKÔœÔìòÃüyóçIðìKϾ”óÇXÀ`”l.Ù ðm· –¢c@iÖ H{}?Ƕýñx;߯³ñm>›?¦Gµ>k½[^ÛòZJ],ÁwãÀ3ž±ù"Müš=ì!F£Ã舖EË[a³ÍlkÄ ˜°f£Ù Dó£ù„9aœ4N‚uƒ *Hã¯q<âøFœo–?¦Ç9JS’Žn„2•iVת2Þ6ÞëßQ_ÔG$î°øž!†"„³2H'¬—­2« h¦™ˆõs³Ä,ÖÇð¡,«, ˜²ù5÷²ýò8¤¸úà*Œ¹Ü\n.£Ü(7ÊaláXæX&53çfÎñ8ž¾‰› |L m=qa':¹_¹«r—Mg®°ÖEVDVÀćX«®®Y]­Õ­Õ­ÕްìéìéìiÈÛ™·3o'ää䀷ÏÛçíƒâ»Åw‹ïBFmÆûïCéÇ¥K/bÍ\z|æñ‡-»¿Þýµ}÷Ntºcu+º¬/~ùâ—ñ2ÊUðcShGh‡f6nònòÊÕu ë®w¤ä‡É“J“©“©“©’»Ê]å®’ÊÊʤ¶Ö¶Ö¶VÉßáïðwHÁ#Á#Á#’¿Â¿Û¿[êªéz£ë ¹þ‘ÖÝÖݦ›Ï*\×°®Áæ/º,HïHï°Î3x>ð<à‹_¢?˜…f!D=ѧ£OCÁ²‚eËàÚÁk¯„w»Ç 9{söæì…µµµÈíËíËíƒáÁáÁáA˜¹1sc欹°æÂš ùM¦/ÓcŸîÝçTÞúÛwýßõƒ­Ç-%”$”ð+¥%µ'µKº#I×ÇjQ‹”H¸Ÿp_š§yš')r;r;r[ʾ“}'ûŽT·­n[Ý6©ÓÓééôH¹Å¹Å¹ÅRm¸6\–ü‹ý‹ý‹¥K׆/ Kž?{Þó¼'µÌ´,mYjWHãÖDâéÄÓ’­Ç-™_˜_¸þ%Œ£DRD’”åZª»Ð’j5‡š¥ÄÂÄÂÄBÉwÌwÌwLª¯¯—Ní;µïÔ>)Øl¶Káôpz8]*­/­/­—¼·¼·¼·¤‰=oN¼)ex3Ngœž…ÏÒoz£^rô I=û¡á‡†/€õ;~c<2¶K]•Z•Z• 7 nÜ,pŽàðñÃLJUWV]YuÎöŸí?Ûïøm?´ýÐvXé_é_釺Gu#u#–ÏòæLœïzÃå†ËöåïÙïü•T¾[ù#h8ÝÂŽL —^zsÎ~;í´yä‘ÇÜ‹û† A,އŒCsø¢•Õ•ÕÎ_éšíJ ¤º÷‹Þ¬Þ¬†x.é¹$m–ÛzËzKŸY;”¥,¥ºÏ¹ö»öKºçuJf“Ùd6IÒ†$×=×=×=Éíq{ÜÉô˜™f¦$T ÉuÒ궺õ£ûtRmR­¶êåÁƒ ôwE_ð½à›JRbhihiчúï©~t#”%—%;¢Þ¨˜6·š[‰Ä{¿ïù`Å+át~ +–L$ !³Ü,'2‹7‹oóý_çÿ‰YÉìÙsf%ÔPCšsÄÑ×£¯ëºu.plÛ?{%âù³³2Žÿ“³ò‰}]<±ï±'óûò5¦‡ê]A†IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-30.1.png 644 233 144 3077 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜôIDATHÇÍ–ïO”WÇÏÃ@IJb©]kˆµÆ5†ˆá‡:ÝÄB«Í®+` ˆš@!›º$¶/VCÝR_ÔÆˆT«n $R´‘¶vA4Õt¡­¡L Í~¤àÀL Àóã~öÅÌÃ3mÿï›'çÜs¾çûÜsÏ9W@DDVE¾1ëbÖÅ$„å˜RGï~ÃýƆ‡å´ýÚþïÿÏÖ=[øiâ§Ö#G¶÷mûh?:ž­—Uâ(V´¬hѲ"òûðfÊ›)îçÂòGwÀÓêi3 ¬­¬ àú¥ë—xÆûÆûY,pd{ß¶·ým¼h|yÿ7ñE îFÜ mV<³âHÞ¼û¥wÂþ— goÎ^€QרKÅ€ù O¼ÊB„°×T”lïGìmÏÆ·ãÙñÃ|V¿ºúUÎçÎäÎxšÂ®P[q¡â¨ÿè­\¤âÁÔL øÄX0XTÿµj­Z Mµ«võú0Íæ1Œ€àˆggïZEoE¯MðÑšóbòbïÇÞfo3êæßÚ‹Û‹mc+ÕÚUÚSÚcŸ\Ã7bìyXÁÎ \ŠihP%ބ̶Ì6§Æ¦üS~Ø|oó½Í÷ òpåáÊðýîö»ÛïÂxÓxÓxl<³ñÌÆ3б¾c}Çz‡_0 °£jGÕŽ*çâtç|1óÅ ‹‘L—˜Æ•©+S6±‡ÂlB[B›jaÿXÍXj ¾| ¼]ÞNo'lJÚ”´) ªU«>{ ÷î)tì³}Ù¾lœk<×x®ÑÑëz†žf¦™ifBÆÊŒøŒxøü¹ëþë~ÇÎ Ž¾<ú2@ÂW _©–þ¥Íh3l‘Ö•¯­|Mä{ó§ã?—éÁùÁ_ihlYSµ¦jM•HWQWQW‘ˆ;ÏçΓ奺¡"ž~O¿§ßÑkkµµÚZ×}×}×}‘ØwbOÄž‘,­L+[6›w\w\·ˆˆ+ǕÖõ¹Ylk?ŠÄuÄuˆ<øóƒ±c²úàÌÁo~+Ò×Ñçëó‰ŒÞ½5zK$·>·>·^äñÖÇ[o9•t*éT’Èôäôäô¤Hz0=˜9_w¾î|H¨6Tªuˆ.ÝXò-ùDÌÿ__.«WËÆcƒˆˆå³|ÚÂG‘;ÖõYógÍËÕ]ò»º¥º…Åt=}6}  £Rw-ùZòµdðö{û½ýÐ9Ò9Ò9³§gOÏž†Ü#¹GrÀDâDâD¢ãWé­L­L…{{{Ÿô>qpuòêdôîʣ%GK€›á*A™'ÌNb‰@ ¨5øðዪ‹\ä"B Ñmc!ì,Ú4FÈXžV*=yôdTU2écx†Þ9¼̪pŸ1?Xj[jcÞZcí³ö裬mÖ6k˜ifš™VÕcõ—¹Ìe°4K³4à,5D•uHïÖ»™W3vNNæ<~?ªý®óSà.p‡ÿ ô^̳À*¶ŠÑ?FG–~u °°€Y¦˜,ÛÞ*±JЙ‹àé|;Þï;dV’w ï@Ô¬äÝß}q¹è[jˆwR`™E,‚º£î ¡#ÛûË)‹øÛx6¾ÏŽ¿<+ŸÚ×ÅSû{:_°ÿ&¢ ýaØIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-82-grey.png 644 233 144 6277 14774263775 16027 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü tIDATXÃ…—yP×ÚÆŸÓݳ£ÃbÐ!¸Ì8 êèõc‰¸ ›¤wÐÒÄ¢ÁÉýzor ú¡ƒ%Q£!.± 1·¸Ñx£Qj4½”¸€ŠwJV „ Ã6Ã0=}¾?˜æ«ò«TÞNî>ïó«÷<}úm’•••••OŒ„ud`qϹçÜsZœu6ëlÖY:ÁØiì4v.™I½¨õ:´•×ð^´ÅQä(rу8ƒ38C2€¨G=êlÁl¡e«d«d«H÷ ÷ ÷ËÃ3¤‡ôž¿åï¿wüÞñ¥O³³³I¯åµ¼–,án»¹<™QÀ0„!Œ9/£`núMF“Ñt¾u¸c¸c¸Ã|Ï6×6×67诪ãªãªã¸C2B$!’ ììì ˆsñ¾ø¼¸^Ì7šß­'ê‹<"ç®àB:–Ž¥c…÷II"IÚã¬–Õ²Ú›ß ~7øÝàwS¼}Ì>f³kWL}L}L=ã4X ƒ…ÄÉ2d² Øð>ÃgPÂl>Àø€üà›ÃßáïðGœ¥ÂRa© Î²€²€²aWwlwlwì{_*µJ­R;_îJr%¹’¢ÓdšL“Ÿ¿O@@À,${†ö íP TøáЏ"®¨ââ°}Ø>lŸ²L·X·X·˜KHMHMHåÎ{ö{ö{öC $€ …ÇàH8 'á<àNÔyD>†àø¥ÁÃ׆¯ _Kü/ŸŸŸªO¸’p%á 'z¤zè¡ÇX¼ÄK¼“““^Í«y5@6“Íd3€ä @5ªQ Ðçô9} µ µ µ|ŸÃç$‡äŒó'$$pçE}‘Gäãh  ûÖ:UN•SDîܹ1ž%ž%ž%º)û—õ/ë_\üøâÇ?ÚŒmÆ6# µImR°ìβ;ËîÁ™Á™Á™@oYoYopéÃK^úh/i/i/˜éÌtf:y>ò|äy`1c10ֳгг¶H}¤>R˜Ë— .‰¿ÄßZ†×óz^ÿÎ6¯ß¼~óú g‡ÏŸNò°Û±}f•YeV=Í=Í=ÍÀ¶MÛ6mÛÌKš—4/ ¸ºþêú«ë~?¿Ÿß”Ê e «¿«¿«HžŸééé ™ŠLE& ±¶±¶±VTt–e–e–…ä‰<"ãxíxíx¿O><ùðäÃÈPìQìQìÍçŠsÅ3 œ8;pð4x< €¿Ô_ê/taº0]À*Y%«¬÷¬÷¬÷€Á©ƒS§¡÷Bï…Þ& …‰0O5O5O(W+W+W]kºÖt­åTr•\%‡MäùÀ L!SÈŽ.A 4£sD‹:u hnononiii€Ó»Nï:½ ˆ ˆ ˆƙƙƙ€õÅë‹×Ñ7¢oDßFޠܻܻܮ®®´÷µ÷µ÷ñfȘMÌ&f€Ó8Ó$€a5¬†ÕÐK}¡}¡}¡xÆGóÑ|4X¶š­f«AÅ•ÕÕÕ€„„óQÌG1 B„,Z -†ÐQØQØQÈÉÉ-¡-¡-¡ÀÑ“GO= ܹvçÚk@üÛñoÇ¿ hÔµF Ð-t Ý2ªÇ>|4øÏ£ctô'?,?,?Ìç>ÿlü³ñÜßkÞ©y§æ’¼#xGðØíqö8{”úô?èâÃâÃâÀ/B¾ù˜ýdö“ÙO€ûk¿h[ж m0èt:üÓù§óO1ú}Œˆž=3z&ÀƲ±l, t ÝB7ÀœaÎ0g`o^Ù¼²y%”M|ßÄã ù3ù3ù3>—C°÷ ÅEqQ9™¥ËK——.wét±ºX],Ûìeö2{™Ñ§¬¬Œ±åÕåÕåÕ€Z«Öªµ@‹³ÅÙâ˜WÌ+æ0áñ„Ç×÷]ßw}0qëÄ­·Zh¡ÐÐÐÐÐÐ %%%SR¦¤LIÃó‘ç#ÏGPšæšæšæ aä¹@.0wI‰ ßXÙƒ7Þ¾9d2§méKêKêKúÓÿtfvfvfºvM š4‘Y­½­½­½ Gkzkzk:¸[ù·òoå]m]m]mÀòôåéËÓ©ÝS»§vë*ÖU¬úUýª~ð°àaÁÃÀ’iÉ´dï>¼ûð.¨¶R[©­÷(âQÄ£ÁVóiͧ5Ÿ2;333þ³ÁùÀùÀù`ýR²çÅž{^x€xðö I§¤SÒy[1`0˜§$G?~ý”F-­[Z·´ŽÜ¢[éVºÔù–ó-ç[ ì,v; `7±›ØM 0ÀØoÚoÚo´•¶ÒV€Q3jF iBš())Áöä§'?=ù ëÏm8·áÜ\WR%UÒ¡XÊR–²Aëˆ@ÖnçF¼ÁVÁ 3Ì/C„0!LK:¥,U–*Ko¢"µ"µ"•Îòòò" · · ·°J’!Éd@I“Åd1@¿¢_ѯRBJH  ðUø*|ŒÃ8Œ° ±ÀÏø?£o`ÌÀ˜1[ìWìWìÇ뤓¤“¤“8HI"w B‚j·Ó\šKs9w›ç é¹}ä89NŽßJe"™H&rW6c363'MA¦ SŸb=`=`=%9H’ƒè£•´’V$¤“t^ð‚—Ø‡þ_…麄.ÃýV5•šJM¥®ÝÝÝÜ ÙvÙvÙö ÙÆ@c ñ˛؋½ØK.¢hä£Å~T…V´¢•Š4¤!Íüaæ3È]-ß&ß&ßv!»Ç§Ç§Ç‡³^ö¾ì}ÙÛµSD7ºÑ ,°ÀˆMÇH# ÐÚ@@É~²Ÿì‡¬²©²©²‰FU¥W¥W¥³¹ªxU¼*¾}høëᯇ¿þäsKº%Ý’Ð&ÚD› vë|+‚ÚÜc¡à!xP×¼ªyUó NNNûäs•—ÊKåõ¼°ÞToª7±¹ÅëŠ×¯£Q$•¤’TÈ„sÂ9á(P@Ð^ÚK{žð°w5u5u5á‚yŽyŽyÔªU‡ªB…P!ô“Ï™#ÌæHûÛŠ'FpèRñ@ÄÝýK"sOÝ[ÄæŽx×µ“„‘0µz¤R7¯:Sœ)ÎáÏï ï ï Ì"ÃÃìê„:¡J& dáà3ø >²SÓNM;5Í5½c^ǼŽylƒ|Ž|Ž|Nîü‘—f×]!OÈò¸îýoqDz³³³³³Ñ'Vî £r{w§Û»'ÜÞ½6êÝd$#™9iršœ&'ŸbÍ·æ[ó¡d†aôŠ•(µ—ÚKí‚­=¯=¯=mï–ï–ï~zÃñÒñÒñr÷— ï6¼Ûð.àԉݚ(ò‚¾,> t'¸ãöîÕÿç]M¦GÃY¿Ïú>ëû,×NLÇtL‡Úâmñ¶xãUUUä}e²NY:A'èþ|›ÛÈmä6ÚèCô!úæµ[o¹{´¿ÉÅâw""""""¼{j¡R*¥R²£cFÇŒŽ(pMrMrMºÇËô2½Lò×è_£öþÁZk­µÖÒ£5ßÖ|[ó­ká€sÀ9àdÓ$‹$‹$‹þâOói>Íÿç È ƒŒmÆk¼ÆkÁOÜw¡ø7yþ ~Ç»F£Å®½´ˆÑ¢ˆFæ s…¹ò/ýÐÊ¡•C+…’û0sç^—uÛÇÎËå÷;ç÷ý|ï½çüî‘¢ÌUÀ]æ.s¦c÷v޻û£2”ŽÏ˜àjwµÿö-|4øÑ Àª «.¨);¶æ­õÎz[ßɳòR$v"ÿJþWs&îƒ=µ{j½§ãïîïšïZÜ€îëÝ×®]â+ˆÞÞXh^h;¶æ­õV½¥çÔ—¾ðE ÷fîMןŸ—Ÿ'å-å-¾N/x¶ZwµîxéyéÑn0ç€ t3°È"ÖøË[ó™õV½¥gé[<‹Ÿö#PÜTÜ$mûÚöùΧ ¦‚p¬ôX©ÅK]à> ÀÌ3ó€O³ÆY é€PM5ð£ök?èÇÆFc# ®A#À ƒ`fô²úÏâ§ýÈÒwûýçÐáíð 3bFÔu„”îÑõE´~¢ëÇØ#@€¨¨šQ3vZ{ô&½ Í—æ¤9I ÌWæ+ eégxY¾8 Õü¾¨/º˜OͧfVw'¨êo™ NÜÆcñX<©P*” ÙùD,KÄ V+•ƒ®ÕÕºÚq¯T‹jámúÆÙió,~ÚOÆØ™Ÿápïá^«ZmfƘ6¦íןéz] §N/œ†m•Û*·U­ö[í·Úmn—êR] |#¾ßtŽvŽvŽ:ŒýÄShŒ~£ßÁËòÓ~2Æ~ù.¿¾ü:ë#À'Ƹ1N"û„æãóñyhèièiè±7ÀCy(î>ºûèî#¨qÕ¸j\0[?[?[U§ªNU‚0aÂJ’ÃÉaK_l~Ú[¤p¬p¬®^¤i{ÓöÌû×yùÕóÎóNòå™’)‘ÇW_q\$Œ#A‘:¿Î/’ìHv$;Df&g&g&EJ*J*J*DJ&J&J&DÊV—­.[-ò|åó•ÏWJvÐìîvwK~–—å§ý¸E<­žV6ŠäÞȽ‘­‹Il–Í"ò»<‘'"2 2 â‰z¢ž¨HN '‘i‘œ“9'sNŠmF›ÑfH§ŠSÅ"Þ½Þ½Þ½v^Šd«luð²üŒ(+ÓW º%ºÅñ¬µŽè"H(¥”R{ºn}Ýúºõ †Gavlvlv Ö½X÷bÝ 81wbîÄT­:Zu¦ãÓñiÇáÑfÔŒ:xY~ÚÏò{ ó’y‰îpØÍnvÛ2=m=m=mðàöƒÛnÛù?äù¡qMãšÆ5~~~ãà‘GðÌì5{—ßcËŸJŒEÃîèHØG!9ã&šh†fØ‘?Ç9ε™lé½3挹÷žÊÿècZuªNÞ¢X2T—êR] çõ¼žwäתµj-˜f£ÙjD ©!°ëÕAu0«÷¾>ö/Ètþqs@R‡ÒýÐÄY`H‘$¹Ä³FÉ% YÛõ–ž¥¿lçÿŸßJè§Ÿû›ûÍý$@ßÓ÷pá;¶æ³["Soé½÷[ùÁþ]|°ÿcæìß”Xi¨ÚT9IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-188.png 644 233 144 3010 14774263775 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–mH\gÇÏXkœÔŒp™†Ö–M ™C&q3\Ò†ê–NªŽ0M¥ÁMS—fw¡[7Z°„Bˆé.FÂî‘nVªKL«¥5t¡82Ýd›kj2 ÆàˬVÐdÌ´3÷åù퇙ë6ô{î—{ÏÛÿîóœsžG@DDͽ Ê Ê \Y¹àU[_ü\ñs›ÿž•Ïàhp4LtBioi/€»ÏÝgNÚ²e·üóãElü|>K/Š­X7´nȱ?'¿wÜQü³¬|jœÃÎá{:þèðGú/ôs_%¾XÞ¿¼lÙ²[þV¼…—/ïü¿<üÉß8¦a]Ѻ"xªæ©šM¿Ë:ÜÜuêÌ>4û*ã{ „µH’Äz–òdËžó·â-< ßâ³ø³ù”=SöŒƒÎsـɿ¡·=Þö¸Å§ óK^çuJè×?Õ?0:ŒÒôªƒê ¨Ëæó ðõŠzÀxËx‹4½úûúû ¾¦…Jøk¾žã[ãÏæco¥)"ò^5„$$k EÕQ½Cïõãªq-gP¸T¹*Wåk+†ªQ5ªÔ¯rïªQ5¢€QFÑT™Ùj¶[³ø* •I‹_ò‹Í{œ Î…d!ÄWã«À×@]V—IÝ»“ÚÚÚí´vÚN$Ó“éÉôÀbÝbÝbhóÚ¼6Ÿg?‘9‘9aÛõ™`&H*gŸŒŸp&Éd¡•O.±³þÛz¸õ°gúÔ>ͧù`ùOË.ˆÚû‡½GöKµ—j/Õ‚*T…ªÅâ@1xŠ‘ÄÍÄÍÄM‘ŠÙŠÙŠY‘[¡[¡[!‘ÁîÁîÁn‘¥/]Yº"âyÁ³Í³m ¾Lþ¨Gõ¨ˆ""ß¼ wîQõkjõ}…´õKG½G½G½;;;e¯@÷H÷H÷øu¿î×!\® WÙöžþžþž~ð§ü) Âfx5¼  *U%i®æøþ9paà‚Uüß¼iw%­o·¾×%èIÝžè ƒÔZ“tÑEpƒÜàþ§‘F)¦˜ÊÓßÉá éçôsy|ªµ³µÓîÊü9–p&’…¨¸×Óšcf›ÙFÊl6Oš'A*¥ò4ÎçóÙsÀès»¹ÝÜ´ÓN;ãsãs0ÚŒÀ|RëÔ:I1háWú]) 9gœ3÷Í1kоW ¡âP±=ùÁˆQàžù¢ù"Znö+@GÏ}+ M:·ñY™5߬.m¾l¾ŒÆ—Æ—ùøß}“ÿ'ÎJÚžh{b `x—w)±·Øh2šHƒWã8p€-[öµ’ÈÅ[xþOž•ìíâ½=˜7Øÿ}² LK³çIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-132.png 644 233 144 3020 14774263775 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÅIDATHÇÍ–oLTgÆÏ€üƒ"F·µk¤aÚ`P2¨¶ ­£˜RI¦XÅšh 4êc Ñ„ÆEÛ´vÝbŒi í¤(Ŧ1c&ì®@ 1Ö!fÙÊbMü¥S†‚™0Ü?ïo?Ì\î¸Í~÷~™œ÷œ÷yžyßsž{DD$'ñ+òbÊ‹)Ùñ8¥Á^Ïôdz^ú*_2ÀQë¨i…ç.y¿ˆŸÌg­KŽØ W3®:ªqÔÕe®ˆÇíg³gN‡Æo¿ø¦ã›ÃäÐäÀLÕLر•·ê­ý^2¾´ý¿¤ÝH»áxéé"°æõ5¯çÿ9^ðc>Ôì¬Ù 0ž:žªRÀ˜²ÈRU@„ÖNŠ­|¢ÞÚoáYøŸÅ×#W™W)»ÞÞõ¶ór|ÃýNôæš_°ø´Ê9Ä!²èÐýºÀ8aœ Æ'j§Ú êŽù½ù=ð…zG½`œ4N£]o×ÛA rƒdÑšÀ£ùùæç-Á§,þ¸û*M‘s¯W¼²(hPµè'ô þe Ãh‰„"UEUÔ6µMm[<1”Gy”Ôu@µ_R‡P@/½hê”r(¨`¼+¼+€i‹_’›í•vp†œ¡È{2ö¸ @5¨;êѹÇÑeÑe ]Ñ>×>·…h»µÝÚn˜Ú:µuj+è[ô-ú–¤|¾–¯åÃÔº©uSë@ûK¬3ÖI4‘®æŸcŽ}àŒ8#‘%–ž„°KüÜÔØÔhÁ™ÅêOZ±V 3›ùzækTÙñ²Ãe‡!°6°6°”RJ)(ß^¾½|;ä\̹˜sê‚uÁº „††B»Æ]ã†ì¾ì@v*>­ðUøPÓ?†‚¡`ßýw½ïz­Þ»4|Ÿu¾Õ¾Õ‹rpnú·Ï~ûŒXiKé‘Ò#öì ‚Á¸î¾î¾î†ÍáÍáÍa{ž°Š–--Z å å åPâ/ñ—øí,;^ö^Ù{pþïçöŸÛOÌâ3wîëÜg ¾/}+û–ºÊ“É—'_î'J˜%f 0V«`SÚ¦´MiÐÓÐÓÐÓ`Ížž=={*:*:*:`åò•ËW.‡׈kÄ¡X(ŠA  P(W‰ËírCßO·ºouÛ8æñq߸,=¹Ër—™?@x"<\½Ræ/æ/öÆRW©«Ôþ=þ=þ=0~müÚø5è?ÕªÿÌ3ÆŒ…¾B_¡|ŸÃ瀳ëÏ®?»6dnÈÜ CyCyCyIò+a3sá±ðXzRDÌïÌï?z^#"šˆˆä9þ( ² ‹Ï|õ|õ|µHú±ôcéÇDîVÞ­¼[)²w`ïÀÞ‘¾‘¾‘¾U¥ªT•HïùÞó½çEÎl<³ñÌF‘úîúîún‘GW]~tYä?{F׌®q\óqiaraRÄÖcõ¾Ç¾ÇÀ`üÎyCŸÕg­€–Ü–Ü–\¸z;õvªýÛ¦Û¦Û¦ÁÝènt7B×D×DךM&ðˆG<;îí¸·ã¯*Î.Ά›ŸÜ(¼Qh÷˜Yóå«_¾úT%¦’¦š>°§ôˆn;ºb¶LÀ? P¨¤õQFºè¢+iÝ ºh žÆ7‹mþ§¦ò•vpN:'#KPcÚ˜˜–™Íf3QsŸù±ù1 À0à ƒqÔ8jû¼qÌZ³Ö¬ÕªZU+_Œ `üÛSÀøt!´"ªþaá?p?pççƒßù˜e´ç^o¦7Óv~0A`Î|Ë| -áý ÐÑ…Ì3Ï|Ò -0Çðk¢~Æ|Ó|_›ÆM`aÑù3¼ÖI=åüÿç]IóêæE_Óz€øˆ,û Œz£ž¨~Õ€ر•_¼²Ä~ Ï·ø~÷®|f¿.žÙï±gó ö¿"à3e¥ ¢‘IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-2.png 644 233 144 2055 14774263775 14616 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜâIDATHÇÍ–OH\GÇßš&º`4 –(D)jÁ Šzñ d¡A0³Œ=¤4x(æ`‚4¶ÖÃZ‘J.6Dj ‘°& Kã¿d½5—6ÑèÁƒq‘Õ.a«ÔìΛOoçÍÛžÖž|—Çï÷›ïŸ7ó›yc€a†q&ý6 §4§4§ÀŠs¾Òù¼Æ¼ÆÏ~µâ\~—ÿo¡ð~á}ÏCÏCó­ŽU]wâ Có;õTÞ8cèDîTî”Ë—Ž¡íbÛżO­xx ÜÓîéýÜ~zû)À“GOñ5D#Ñ@Ü÷ŽU]WxÅçä7ÿ£opòÙÉg®MÈ=•{Ê0àüåó—/ôX6.ÀÕ+W¯lØ:!s@Ä€|ò¥H@=»ŽXÕÓã^ñ)~¥§ô-?]*ºdp­ýZ»ûg ðö¸{îî9¥—œÈ'•Чâ⎸Ã!?É6ÙrÅ\1W€ï¥Ï²#zD‡z|oó)~¥§ô-?FæÚþð\Ï»žgzâ¥x ücv˜$ÓI)g9 ²NÖÊZ{ÆßÉ9òOùZ¾ÖiöÍæ ’6ŸÍ¯ô”¾á4ôùàŽº£‰Oàx'lÂ&0»Ì.ìÌo<ç¹6’ìHv$; V«ŒUBr09˜Ôuæ™cÎgò5i=¥oùI{° Ý÷ºïÙàjH%Rºw$.™”IMŸð&¼ /4O6O6OBaaa?4 7 7 ÃÞúÞúÞºc&_Éò…ƒ/ƒß¬Öú–Ÿ´±ß¿Ç°q_‚ã€ð ¿ðk¡ñññ¨(©(©(ÑùúÞúÞú^]]]Ðyá>am…k¾lþ´žÒ·üP°P° § Zuô ȈŒ¤¿N^¼xuu§k§k§ ¶6¶6¶6 < Ay]y]y,n/n/n;°Ûì6»|š?ý(}ËžÓžÓæØ}¿ûÞ¹íeLƸf˜Zh¡E§ûÜ}î>7Ôj5ˆEŠ"EŽÏk•­²ØgŸýŒwòïj}ËOÖ3&Â",º* •…ÊôžÙÙÙ„‰ÐDh"«í«í«í¶€ ÈÀ‘f,»3ý¦ßtôØìØìØì4v6v6vB“§ÉÓäêâêâêb˜ Î炎¥¬2«Ìª#õX–»Íÿ|œølweçØß™*rY.ËeAAkbM¬éXÎËy9ïØø#cYœü˜·Ì[Ž“ÿcº™ÿb= Nœ¸#þ˜ÑìRã³>ùø¯´—@Ü79¹$—p᫺½dGýWÛÛű½Ïì¿ YñWuŽ<½IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.5.png 644 233 144 2531 14774263776 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–_H•wÇ_m¦’5m ,i’ša“Øf%±‚ü“–4¨‰Ùƒf^Y!(^ÌŠ%áEhfÍ ¡”•Öˆ4G%BlœØË²e¹CçØ15óÏûþ~Ÿ]œ÷ç{ªyßïæ=Ïó{žï÷{žç÷OMÓ4-Þúj¹Ûûl/¬8³âÌŠ3P×T×T×ú}ý¾~?¬å%Æ´1M€qÅgñ[z4XtgÑyÜYÄ'ò¢¼â‚h­¶{¿k¿k¿ Nמ®=]ûá»%oÉ[RÛRÛRÛ Ç—ãËñÁÊš•5+k`èó¡õCëÃZŸ­~)þ &,.ŒÐ¶Óæ°9l >|:øR*R*R*àuíëÚ×ÿ#L/Ò‹ô"èuõºz]¶“c“c“N:O:O:m¿ù•:f,~KÏœ3ó ‡á°í#Ž<8òvµïjßÕnû_ù^ù^ù yióÒæ¥Ð2Ø2Ø2© © © Мޜޜ«òVå­ÊƒÑcö˜v¾È™³bï­±`¨ç¢3˜Ì' Òªë«ë«ë¡KïÒ»tØsÐsÐs * * *Àãð8<8µçÔžS{ {8{8{.%_J¾”VÚ|c˜ ÀÀœkìÝ]iýL0&I@„–Â,à nܸÈ$ <â°rCã7ºévr˜ÃH0˜ T!æÜ•a纩›À¶ƒ8'ÎñVt‰!1òY*KÃÏr–³ E¢H6²‘`v›Ýf7˜?˜‡ÌC ¾e¢ øCdŠÌ°sÌÔzæ8ÇÞ9ùcŠckð˜ýf?ðF”ˆ‚Vs%``gœq@Z•’Ì0øU¼8 ³Ïì ÇW|œüïÝ•ÌÞ•Ë*—ÍtuÔ7ÛbÌ}æ> ïÊ»D¶­æU¼ÊWx λò£}]|´ï±óûbO¸¤)|gIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-22.0.png 644 233 144 3214 14774263776 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜAIDATHÇÍ–L”÷Ç?G¼Ö„1µ*µTOSh‚”ߘV +±4¸Nƒ¦)Œ`]fV1Ķ›@RC—Ô¶‰½J«‰dQ~l-\—͵µ#æXÁ€¡=v` 0»çy^ûãîáØº?ö§ßž|~½ßï»çù¾¿_y"ð‰ ‰ ±øã_óáyáyñŸúã ¯^¹ó{xü£Ç?XsnÍ9u$ëu½å¼H%Ÿž—'$˜0]6]6ì Ä5ðêŽWw„ÿÌ×ßs›¹mÁeíeí­öV;¿©/§¾˜Ý5» ‚±^×ûõyo%¾Ôü¿„u†uÆÁô˜é1ˆÛ·{óoý £›aÏK{^˜ ÕB@™"‰ÔvóÌ£¯®ˆõz _Ÿ×ñt|Oç÷ëˆÊ‰ÊáôË^~`nöŒ´ÐXa¯°ƒ6àmãh QøÀ7ç›Ã£ ©µj-P­UkÕÚíðPÙ§ìþYß,p–F‰Ô¾ àuVôVôêGZøc¡±ÐhnÖõȾ[Û‹$ee‚¶ À{ Xd´võ”z ¯:¯ÞVo£iojoko/ÿShUZ•VÚß´ÛÚí`žR²ÉFS§”!e/pŸû zøGŠÞ-zWh{qÅ«yæºÍ›?ž7Âè–Ñ-àý%¿˜ÞöÃ{?¼Ç¢7Ëû†÷ Ÿw­w­w-L[§­ÓVðÖxk¼5+ä$'ƒáÒ†¥ü¥|pǺÞr½Å¢fõãƒó˜ó0ev˜óF<~=¢¥ˆˆ4|‡ë×ÁÜ¿ÔÄ‚«ùò/€åËiËi´œ¡œœ7›ÆMP8X8X8–lK¶%2ë3ë3ëÁ}Ä}Ä}„Ÿ¬Ò©Ò‰Ò 0_4·™ÛÐ|±?l˜^U(+ÒýzÄ÷¤ˆÈ_+ {u÷j°ÿáZÁµ­$!*¾+¾ >ZPVPVPIYIYIY››$N=šz4õ(خڮڮóm÷ÚîµÝëVëVëVp¥¸v¸vÀ–šÍñ›ãñt$ÝâZ tí: ŠÑ¯'IJúûÕß'¥ˆ$&Šäe2 †æ¾á÷€[L==="ccc"Ç7ßt|“Hçxçxç¸ÈéÓ7¦Efœ3ΧHâºÄu‰ëdyM®Ÿ\?¹^$:1:1:Q$Úýmô·"1kã2â2Äô׿iþ¦ÙÐ,²»gwžU}«ú’RŒr*t,t «œ§A~޷ƱÆ!îã«jj$ª7±?·?W¤i{Óö¦í"éöt{º]¤ò`åÁʃ"ý±ý±ý±"ççç"i)i)i)Aa¦&S“©IÄgõY}Ö`ÞåMõ¦Š„g†÷…÷‰[$l"lB¢ –С°Šr""+"K» ‹1‹1𧯯;¯;ƒ{µ®±îLÝèíí›Íf³Ù ôPè¡ÐCPß[ß[ß —F.\Ç„cÂ1ÍQÍQÍQ0|eøÊðˆë‹ë‹ëƒêgªŸ®~¶¼ùÔóO=wÿ<öÝØw³ÏÎ> ªùYägÚeQ~§c×^»ötý}ø“áO´’¼_½àyÁƒ'¯4oÞ~ȰdX2,P™P™P™E®"W‘ rwæîÌÝ ÉÆdc²ZN´œh9ÅUÅUÅUànt7º¡ucëÆÖv?͙愎¹öÛ?Ô¿a­„'/F^Œ¾öë ØEÃçPž_ž¿b— \W®ð€hü¿Ëƒ'¸e€rÈ.pŽsAÛ£Éw×wئó•Ÿ)?Ìv%­Ãì4;çÚÎçœÏRë÷å/K?.ýÈ¢2¨x¨—T»jePTAV†•aPìŠ]±ƒV¢•h% &«Éj2pš÷yÔtõ°z”K5K5,ªŸ|LuZVó¨ytÞÈBÀÇ~âüK{ { €;à̳J·Ò ̪{Ô=xYüâY\¸€Yf˜fOyÌáÆ ¨~Ôµ/KJ¿Ò¿lÓ·`oøÞðÿéü³’Â}…ûVœ•ÛplÃ2@[ÀË#Á7ï›PŠ•b< ÝÔn`ÀÁX¯ëýú¼Ž§ãë|:ÿòYùÈÞ.ÙûØ£yƒý7oÙìfæIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-14.4.png 644 233 144 3010 14774263776 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–íOTׯ×ðRfŒ…j0ÚZÚ¤1éQB“¦‹“:@!%Á´MÈjšš4“jZ U¹cª1&J4" T(±@°Õæêbn®HaÚÚ–bn%Œ8ÃËÌ9gïßý0s˜I½€ûËÉZëÙk=g¯—½DD䙸W %'%'%3&§ü#¡wz^÷¥˜|ÚG™£ì?õõuÖ×kZ×´ª» Ù¶Ûøäý" ÿÉñl½<# EFgF§Ã—?‡w¶¾³Õ¹.&ÿs\Ý®îöõìëè:ßužáþ÷z‚HÈ¶ÝÆÛûmÉþåó¿Åtºßq2žÊxJ^,|±ð¥b€ÀKPâ+ñL§N§ê°«Y­=@ˆöšM’m{oï·ýÙþíxvüì׳_Ò=¥{\ç0DDî^„ÚçkŸòŒn.ÒD«Á šA«Æª!B³.ÒE@ºN×éz\–µÇÚCÓÆsŽs¬æHÜ_VMnM®MðîEÚÞRo)×9È~/û½DNãßcoÀÛá·Ã ?0nè)>áÝ¥»0P ¢™àW~½_ ? ±,LL@!²¢ÕL¨WÕ«z¿ù²ù²­6n`•¯/_o<öFR*ED6ŸWÈ ¥qk²e²eÅáî…‡áµáµ,wŒ;Æ$·¸Å-ˆˆˆ€ùMó›æ7%Ù‡bø/¿ó;©#{{Xœv)´b7šÍÀ®Ó®Ó¡4Æøÿ9ýTª>z€z%øÕƒÏ|Mç Σ¯»Òt¥‰ÇV]n]n].>*|Tø(¡WÔuÌ9sΜKÂo©óÖyÑ…Ëž¿<­ _QíûÜûÜÀ÷1>¢«Ž@GnèÊüóÖæ­%bŸkUUU"À@ï@ï@o¢|¥¾R_iÂn Æ@ÒNMM&á}Þ9ïœl]©¾oënë®Æø¡Ì¾Ì>ÝÉÄýU÷Wþ0^*Ï¿¿Á¶ÛžÛöôùûü}~ •VZaçÄΉPÑXÑXÑE»ŠvíJ:1§r*'ƒ7Ë›åÍ‚Š/** hëîðîpRiþ9½~z=ð ³3³Sw ¬yzÍÓjœË³'fO€V+m@ÞÕ¼«yWadtdtdÎ9{äìz©—zØ1¶clÇ8—ËÎeè:ÕuªëT"àÑæ£ÍG›!õxêñÔãÉøŒ?2þ€žÈwUßU1 KiKi Š3÷fîUã)‚êU½Žq1Œ77E/ˆˆHv¼7ÄúÅúÙúYd¾`¾`¾@Ä;íöN‹\ \ \ ˆ¸î€; ²¡vCí†Z‘œ@N ' r¦öLí™Z‘ükù×ò¯‰t´w´w´‹¸¯»GÝ£"ëJ×mY·EdóÎÍ÷6ß“l‘sÁqd2ˆc<Þ•c5ü«} }(Šå<þуû¾ð}¸Y|³øfñãÅ?Ø7Ø7Ø цhC¢Û£Û£Û¡$·$·$fÊfÊfÊ’ð-ƒƒphUÝåºËI56ÜömÛ·À’]c¬tå§ÕŸ&ºÌÅç=|Ú§}`›Ãæ0(¿ò+?p’“œ]¨ ua‚ˆöhö€9lö›ý ü궺æ¤ù¥ù%èb;^õ7Õßsñ®\™cÚ5ãš ¥¡&I#1ÇT¥1bŒ°¨²‘Ÿ˜îÕ½ºT‹jQ-ÀL€µ¢Vø‚zê“ñ–Ór²¨ÆüÃÔkS¯Ë®)×T( ÓžcMþòŒòŒ•¦¿Á‚Õoõ†zW½‹MYC|ÂGã>L˜pܦyf™”W•ªƒ¨uݺ1¬qÊåNø?“ÿow¥}wÙweŒ`7¬Ü•±cíµö=ªGpà€„lÛm¼½ßögû·ãÙñc|žä×Åû{2_°ÿ%Xgë,rtIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-25.8.png 644 233 144 3240 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜUIDATHÇÍ–ýO”WÇÏŒ¶8È(P‰¸‘X_è."A –ÔFÝA¡Ê*F“ÆWbw×l_Òd×Ä(j“F*uhÑE§k°m×v-Ðe›iqÝ4l²:hH6k]Ê2c‡A^æå>÷³?Ì< »Ý?ÀóËóœsÏùžïsnžï½""’ X³¬YÖY1ߺ/Ÿ±~ÆúÅ¿ùçX^³¼æý Ì~wö»iÓ.÷¾¹næO­IàOígÆ%U¤’>²”Äý°mÙ¶e32bþخۮFaÿ'û?¸Ö|­™ŸÃÀ­[ß—|_ ß\7óÍzo*¾œøŸþ"ðÌgÏ|fù$=›ô¬,xuÁ«‹~Kè[››ßNûvš¶€RHÑ%À#˜æ›â›ëñ|³ÞÄ3ñÍ~fÿ9/ÏyY„÷ÊeÛ…XÁ}ÕÍÕÍ ÿ ¹ÎIši&¢ýÑ~СèöèvBú_Æã è!Ãgø€ÛºNר*UE¢þ¨x÷yŸýuïRuKu‹Ið¾‹ß•…ÊB¶ &ùï½}{?ÞZ´µô‹‘NÀÀ}ÂØmì&¢»t‹nAOÎhŒQFIØãŒOñ¤Çõ8Zg)¥`Œ1ж8~ÁVÇÖÉ ¾½nÊVŠˆüä,m¶K¶K#Ó¡/»/"?à§Cs¿;òÝÆ"‘@$è´­A+ ¶¶¶ÃÐÑ¡£CGAÍT3ÕL~`aOøqø1ü{ó€{ÀÍXôÅ>ôMë›xl-¶–‘é&Ñ«DDÎo¼õÆ[0òJ?ÞpyÃe˜utÖÙYgÑ%%õ%õÐïêwõ»`ñèâÑÅ£³.g]Î:ÈÍËÍËÍï„wÂ;‘ ä¿é¿é¿ ¥#¥¾Rd.Ì,Ê,B—ç–>_ú<ŒÇúÁÁw¾ú·1>V㑈HáDÊN–ù¸öÓMŸn²¬èÛß÷\ßsÖ‰… !B"çÂçÂçÂ"é®tWºK¤²¡²¡²AÄít;ÝN‘¥YK³–fɤÝÚuk×­]"==="íkÚ3Ú3ÄâÝÓÖ&aϲoÖ|³Æ²BıбPD_ˆñ±N·Úûíýù«DòËóËE6üå%ËKË…?ÝþÒÿ¥_’Z/¶6µ6‰<™ûd"öj{µ½ZD¥©4•&Ò~¼ýxûqÇ]Ç]Ç]‘µjÔ&ˆ­¾³úÎê;"III"EKŠ–-™íIH¤u/t¾Ði¹ R˜]˜-býµ½Ô^š¿J¸–úEêÆ=¶øVùV%~ûc¶#OŽ<ü‚ü‚üèJïJïJ‡‡¹sæ‚'Ç“ãÉIlÙÚŒµk3 î`ÝÁºƒ‰xý’ú%õK xoñÞ⽉xÞîåŽå¨¿ìLu¦âÝ£{@¥ÙØ÷¬ÆèÉèIË=¹–<< rãNk_kŸÌ©›8c?cÙáÜq~Çy‘ÁáÁáÁaW…«ÂU!RuºêtÕi‘¦®¦®¦.ßßß‘EÞEÞE^w»Æ]#’L&ExtàÑ·vnCÄ×5Ô2Ô"’y(393YæˆL O ‹È)]¨ -÷DýJDäoÕpãõ¯ÃïÝþðö‡zÏúí¯„^ ÚxccËÆX®—ëåÚ\m®6477ÃÊ‚•+ àªýªýªÛÛÛ ,£,£,üV¿Õoç1ç1ç1(L)´Zშ³ÉÙD(6?½‡¿_ñ\ñ—c|ârqþ+¨ÚPµÁ´‘êsõ9Stk2%¦o“ÖA€Ž)ñSœâÐC7Ý“QͰÊU¹ÀU³_Õ›UoFŒp-®cØzm½#Óõ×½+zW€ªéŒò†ácªIu«nпÐûõ~P^åU^PûÔ>µŒr£Ü(s˜Ã`Ì3æó€TPê¯J)êhØv3fÌëØÕÞìÞlÛÛƒ‘éü3®c?Pþp…¥ÂøãÊPmª xll26!ÿbâï1%Ÿ2 …†ñá‹g‚†ØÉAHu¨39Ò 3*fü_埕”W–WN9+9<ÿðüI€ë@ 5¤@t$: vª„@{´ Høæº™oÖ›x&¾ÙÏì?yV>µ·‹§ö>ötÞ`ÿÏþµé[IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-54-red.png 644 233 144 4246 14774263775 15624 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü[IDATXí—mL”WÇÏó2€L°€ [ ®]a¥+®ÍRÀ¸Ô´6Õ5ˆ–¬1«HÇÖ—”% !¬‹­jV·íˆ n*]hÖ*`| Ùàf5ݤ……™ KŒ(3ÌÀóòß3÷™—´šÍîùçÞsÏù=÷üï½"ŸÅQˆñ¹‘ÖHk¤•sùb":#:#:‹×‹²(‹ò½?PeQà›VH$‘D桾ÚÀâÙz–å­Çç†òóUQUñí¡ó‰/‰b§ØÙ>Íàp4½aÆ0c˜Á_¶mÚ:l¸ýáö‡À¶¼myÛò>›gñl=ËÇò³zÏæ!þ—¡þªùY~–Ÿµg±J©H©H©ß;wçÜswÔ¥Î)ç”s €ܘÃæØa‡Ð|ÿ<‹gëY>–?´ÞªŸÍGÆX~œçÇíWY‚¼[y·ònI¿]õŽz1 ¿©&Õ¨!É5ÒÒ€œ-­”Vr‰¼V^ ÈÙò«ò«€\#(¨&Õ¤š ±õ£‹£c£ceù5àúÆX kçÚ¹v"±N¬ë,÷ق†ÂO ?‘J4°÷q7à”,8‚#€j÷O, Ô¨Pÿžjóª]1*F@²(±J, ¾p²e¬«ÏxéÆtcº±_ýœkµÆZ5Í6iûÊöžúó8åÆyû¼fNÍœàt½èzæúçúÀUè*ô}’‚YÒ8ñÞ×}×}@ntY\-Æi›´uÚ:ñ”Õg<Ÿ¸OÜ'î¨cgËÏ–Ÿ-WãOà–ÚY®®¸®8^_ Œ c€ïx@Ôݨ»0?°‰¸‰8Þ–¿°Z­ ßWÕ×v6„T‡!ÃaÈ@ÃtñtÑt¨.Õ ©ì›/t_è€Ä+‰W ¯§¯®›®›àJÖ•,˜»9wó‡@Ë^){%èÜ­-­-€–ª¬Ê¦‹§‹§‹ÆÃøx?és+r+r+舡×Ðgè£yÅ&åIy$Ò=IJþáþa"¢¸q7ˆˆ¾÷|ï!"rè:"¢’Ú’Z"¢èáèáàÚz¯õQOcOcÐð2ù3ù3"–_±IoKo“hè5ôzižñ0>?(÷’®HW¤+ÒÒDR%ÙÉNDËÙÐÔÀÔÑPËP Ñ—ú/õDD{Nï9MD”~,ýÑ‚nAGD4øõà×DD5Ëk–öœöE[£­DDÊ^e/EùÓŽ“8¨¯ëÐuè:´#ÏîWµt}óúæõÍñpÎÃø“Ú 6@ÅnÖú»Éw“ ¢"¸¥##ÁZ½h¿h€Í6_€RS© f'g'ƒâ¼'Ÿ| àž¿ñ™r„á¿/äÅçÅçÅc„ñ_—ð%‹ý ªÎ{Î{â–£\£®Q°d[²x6>l é›é€ÈˆÈ8\p¸R¥€ˆ®ˆ.ˆmŽm [„-`ùòáìÃÙz7šzÞìyS{÷p™\&—¹ø˜„uÂ:aÝÑzvÊR_4ZŒy•í×¶•¶•ëC-Ȩ̨Ó¦7¨×c®ÇÀÁʃ•kˆ5À@Õ@ߌ3ÀM{i/€×÷Çí€i×´ ^7æëæë€Œ£éWÓ¯*Ú $ ‰BbëSŠ)Š)Š)"oŠ7Å›mãÚ…¿­àDÁ ¹š‘*æï¾ýî[xaÍÉÉÉàf­N[¶:_î|9x§•!e(ÈuznynxšÐ”Ð(­Ÿ.ýti Õ+[,[TÜ`¥P)Tþs‡Ï_â{BSÎè2u™ºLûy¶À\cN6'«,¡/Y%+TÀ¹Ù¹€saãÂÆ`@õ õ PN)§x•H%ÔfµË'L>´úÒl»­Ý†×µ'´ž¯çë=Å\2—Ì%¯=(ü];_e\WöZ ׯ]â.1­(¿µöZ¬ °jÚ­Vâ”8@ºx•ae`ƒ ì(€Z ¾«¾Øßñ¶ñ–ñ 5*5:5ZÚ§íäqá¸pÜ\¨¡•P •ˆÆk>åS¾xœÚ©Ú‰‡àïuiOk‹ñ#ãG’ÞvÈVm«T ”ÝÊîà õÁ 7ܬ¸ˆ‹€ºC­V«áea;ïîÌÚ™%Wk/М8%NYO$íOÚŸ´Ÿˆ/ä ùB®œaFûÿîF„a„ëN;˜v0í ‘®BW¡«°žÐ´›_˜_˜¬]Ŭ˜á…VX<Á< pËkä5òšÀþ6ç4ç4ç¨,ŸN¯ÓëôãŸoŒ¢ã®…µž¸0÷v¨oŒòi×v9H»5æš íê%½¤)”GÊ£€1ˆAÀºdpÉà’Au«¦É>†yçX˜Ï„ñEÒ³„æ0ínåÚ¸6®-D»½ÖÞ€v¥^©WêÕ½óIóIóI@úLúLúŒüSM‹B‡Ðñû Lj~é….£çX €%ø1í6›ŒM’ÞÖfk³µð /f©¹ÛÜmî\;b‹Ø"¶ ú’,ùkX]ÿ8-}`¸±ïøµûçÓîÆ-·lÜЮuƒuƒu>÷Í«Z'¸R®”+}íhhþIX]ŽþK{žvs…z¡^¨·g3àÒÚÒÚÒZõw¦Ó‚iAú‡Öj‡àæ²…,ä¿v[X½Hú-\»'Býÿâvq»¸]m¢M´Iù¿‚_Á¯8∣¾Û©îTwª›H„îºᎰÎýßL¯ýWDET$Þ>TΫ¼Ê«w»Æ]û÷O|ã«­a ËûÜVÿ6ì/9°AáåIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.png 644 233 144 2557 14774263775 14716 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü$IDATHÇÍ–oHUwÇ:îÌ2ñ®?âU KS|JIÓfé-A%J.!“^Èh6+ëP-¢",Œ"jhdy©ÙöbÒ®½Ym‚3¥µ ½Ã¼6Sï9ç÷Ù‹{Ï=w×ÛΛÃó<¿çûýžç÷œç÷‘¤Ð[@K×ҵĠ­}jûã·Åo˸´; ˆªŽªþý+Xvaـ嗖_2GmÛŠ[ë#óElüH>Ë/Ib;âzâz¢JCvÔåÖ寧í¯ïCBoBïß:4Þn¼ póòÍË4Áă‰Ó¥Ó¥`ÛVÜZoå[x‘øÒö~ˆ½{'êÄ}÷¬*[U¶ö³à‚?Ö‚k‡kÀ‹èÑJc pàP¥À,³X/¶â¡õV¾…gá[|PÀÊ-+·ˆÀ®Ý»v'tF¯BKZK zN:qpF?¦õ‹îÔ,ð­ªWõd\P5ª&"Þ¥ŸÓÏÐA/„æ³øƒzäß{{æc¨‰¯‰ÞÁxk¼–ÍF3U®¨(«DêU®ÊA¹•[¹A•«2U® *Y•¨댳ÆY`ø ?0oá‡øÂü)(ûH˜H˜˜'Æ#Œ»3ÝLgÎrÚ''`jëÔÖ©­ —è%z‰-dñôâéÅÓ0éštMº@ÏÕºÓŽã5טkÂxÛm>‹?¨G Ê;/âîtw~¨‹8£Ñ*Ÿ?õ1}LîÊí¹ö\f~šéŸé)»Qæ)óˆ8 …ÎB‘ú¢ú¢ú"‘É–É–É‘Z­¿Ö/²>m}Úú4‘Z½V«ÕDæçÝón)ÖÆµqI#ÍH“»ŸÍÒTøëp}æúLxŒÏW,®`Áò\‰¹s%6%oJÞ” ¾Aß or¦s¦s¦¡EkÑZ4ȯ̯̯„!ïwÈ poý ÷6Ø…3—/z=¾j°ùƒzTLLD”ܯúU?ࢊ*Û=Û5Û5Û%Å%Å%ÅZ•Z•Z£C£C£CW‘W‘W‰™‰™‰™°±zcõÆj˜rL9¦½wÍl2›"øÂüA=šH´+ÚÅ:‘ؾØ>±ž¿ø‘g<‘>ñˆGd$o$o$OdxnxnxN¤·®·®·N$«/«/«O¤1»1»1[dõæÕ›Woñ?õ?õ?QI*I%‰t§t§t§„ñEyÔ˜³ùlþ MÄô˜ž¨Ç"úN}gxáJõXÝV·m ‡Çx\dÏë=¯÷¼ñîóîóîñµúZ}­"™M™M™M"ãîq÷¸[¤»£»£»CÄ÷È÷È÷H$µ2µ2µÒÆ“/¥Fjl>›?¤g©ã;£Â¨`»Üà†]ð“Ž“Ž“(..†®Ü®Ü®\;~þðùÃçCQ (P€‹æEó¢±c¿1È ðƒ±×Øû¿=&"Òù3ì?ºÿh¸5ó@ŸÕ퉮øž[ÜÊžbÀK^ò( €à¯xŸa† ‡«\ÀSº_÷GòYüA=KϱEkΘ‡ÌCÌщ/­ÆAã mF›Ñf–™efí´ÓÆ€1` €qÄ8bó#3ÕLºaÀl6›™ žKϱ¥'?áÉï5¼fƒÙ@ T-Å<~üÖ×Gþ]!{7¼‰ðYùa¼wNþwœ•A€^à§pØ[lõˆº¯îEض·D(ßÂ{çYùÞÞ.ÞÛûØûyƒý3»Ü?YÄ,ìIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-16.6.png 644 233 144 3175 14774263776 15054 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü2IDATHÇÍ–ýOTgÇϼЙiG[ê,]*S˧BÀ«´tm×i]j$­RøÁt£ø’ÝvµM×­[JWZ4¡ÓÒ%5€hªAa7)Bƒ³®iKdV¥ kU—28ܹ÷~ö‡™ËLÚý|~¹9ç9çûýÞçåœG@DD‰}Ì™3/Úæò¸ßþ¼ýùÕ_Díã*˜^1½2ðx¸îá:€äO“?ÕüqÛ˜7âóEâø‰|†_‘¸ÃÖjk5ÆìÃPì.vÛµÿÒŽ3Ž3³xýË׿8Ýxº‘Ý0riäÀTáT!ÄmcÞˆ7ò ¼D|9ü#~HjOj7 ƒíÛ"ö\ÚséoD†ÒÁó¢çE€[–[Ý ê8àÄ©A‚c"Á6æcñF¾gà|T€«ÀU /oy»Ã‹""âo‚ý©ûSõÊ>ã0‡q‚jU­@“jVÍ„uŸvD;üYO@Ѐ{ê«ê«„!2™¾ œúÅ^;ö}dô7qü¥™—f^pº ã{û¾ÿ,l m þ€Ò«ûÙÏ~½OïCáw”Q†®Õ:µÎÅ•B/ÓËô2àAìØã~öâÁƒ®U?T?D@ÿMŸå[×m]g|ÿÙ„­Éø+8‚Ž`ÐÊ¿®pýƒEØfï† =Ĝҫô*½q>eB™P&`¼j¼j¼ ·âVÜ ‚šh¢)nF~)ŠÁøÞѾÑ>æ”_Fña(k( ø‡ãsÇçA«¡Gø·ˆÈñ¯¡ò­Ê·@Ïв¦jÆ‚ü§ò7çoFoohÿ¸ýã8QÉLÉLÉ 8+œÎ ØX½±zc5 ~2Ên” ” €³ÜyÈy}ãó«ò« P¬ù4Ÿ–»Ý»Ý ý7ªGôk""ß¡–!˜íÐw®ß›óhΣ„u½<}yúò4ø:}¾NX^»¼vy-ô_é¿Ò*ŽV­8 =Ý=Ý=ÝqA6\Øpa¤v¤v¤v@ÿ•þîþn¨øÓ®'w=I¸÷çƒ#ƒ#úN8÷ô¹§AŠê±šV,=·ô\vž\{fÝ3ëDüDædÎäí=sé»K߉äìȫΫ † Ã…"³é³é³é"cö1û˜]Äãóø<>‘µ™k3×fЏÝîFÙ$›d“Èä²Ée“ËDƆƆƆD<^O§Gd­+Ó–iÛSÛW×­®3yE\?¸~1³äô’ÓÙyfYb)±”)ƒIG’ŽˆÈ1™´Œ$¥%¥‰XwZwYw‰˜O™O™O‰ÌÕÌÕÌÕˆdgdgdgˆ ···Š...Šx[¼-ÞY¡âPq¨X$Û’mɶˆ Ÿnn ü' T‘O®6¬oX/“")祿#¢9e‡ì Ó,hgµ³¦AQ”ÍÊfÓJqÀ‰A$d YB‘œ»9wsÞ½9zSÄ;ãñΈŒê£ú¨.â²»ì.»HóÕæ«ÍWEÖìY³gÍ‘‰¶‰¶‰6ï5¯ßë¹}ãÖù[çEÒ~õøíÇo‹Kd¾s¾SÄt^¯Ô+Mƒ±[ùí>þy²ód'ðëè‹‘ðÁ,_—¯Ë×?;EEEÉäF i¾i¾i¦¶Lm™Úžžž022ÍÎfg³rý¹ßä~ŸÙZZÇŠÍNþv²îdÐÕvük¨|³òMƒVË‚H0îE3­b«€zê©O¸v~üøà@‚%+Y ÔsŒcñ²‡_u©.à÷_åÛ•o ±[¹XÇtÇÇ íºr]‰×1í·J—ÒÅœ>Í VÄù4«fÕ¬ –«åj9hÍ£y€RJ)-YKÖ’zj©-C+ÑJ@-_ð.x™Órcuìï7ž¸ñ€ã{Ç÷A+wŒ:ö“ʿͶͶXF{™U;Ô@ÑJµR”Å?ÖY`¸Ç<ó +¤£¡3L0±¸Ö:h¯i¯¡pOýJý*Ÿmömöÿ[ùÔ+ÞeôJb½ Þå]œ‹[ŒZ¢–½GïÀ„ â¶1oÄùžoðüQ=÷óëâ¾}ÝŸ/Øÿ¢ÞÐAé6‘™IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-38-red.png 644 233 144 4241 14774263775 15621 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜVIDATXí—{lÔUÇïïÑ––B…©tºí.‹­u‘‡ÚÒˆ•Á*`5-aEa ¦UÜiÓVÜ6hg€D\!Khê‚4jp³ÅøhŒ–N¡lÊk¦Ý¶ÓþŸý£sóHV²Ù=ÿtÎïž{ÎgÎùÞß 1bwˆ(SIð&x¼Ê¿B’ãÆ?:o¦nê¦n¶ýY䈑#Ëv­Ð….téC´o×Êx¹_æ“ù£ë©DóDòmÄÕ½>qŠ~T?ªõÜP^V^V^v@RÆûÇûÇûùë’—ü¸äGx²ûÉî'»¡4¯4¯4/ìËu/÷Ë|2¿¬÷Ë™?ºÞÝïþ2ŸpQ/©—ÔK]'d‚¼Ïò>Ëû̘Õ9Üì ÒIÈìéöX{,†¹Õ8aœ3×Ì1sÀ,1˜ ÀÌ5óÍ|0·š“ÍÉ`O·íD ¹_æ“ùà¨ú®1šâQ<ŠG½Z¯Ö«œ“Šj‹ªŠªŒl‹Ùj¶0 Ÿ>vWhaˆ'xÀZh-,gÇ ö Àõªõj8Þ8`-·–ƒ½ÅšeÍ" £‹j‹^/zÝ(‘õ%äqã.Æ]|ìw2ÀµÝµÍµÍÎô]ó|n…òÌ7­ÍÖfóyø‹ýŃUƒUDÚæDºF³Ñ ü[ü[óM»Ánp‚¾k¾n_7·d}Éãðéëõõúú³ÕrawùîòÝåöÚP‚~Ã#sùFûFÁû ï/„‘c0f嘕õ;êwD^¬½X 0kõ¬ÕñÁ¤ëI×ê«ë«!œ¤ÞîòÝ» ìµNg£ø„Ý3>k|Öø,joÌ»1íÆ4Žsƒ ùøèD×9×9€6µMxqÌ‹câ®Ä]°²X{jí)€I«&­øòÛ/¿¨ÌªÌ‰o'¾ dt¿ÖýZ¸ý7æ]k¸Ö’GòIÐ?.Þ±xÇâpGúÍN³Ùlzä£Õ—W_ð,ò,ŠlÂ'5ŸÔhñZ<Àµžk=‹–/Z0ãž÷DÆ7·5·¨©j*ÐóõگׂÙC¿ä‘|!P>.m+m+msM³Ð,6‹H")2GßS}O̹2çJ¤'/NŽŒû|ãç#×'´Lh‰ô—ö.ízC_7®WÃõK(} ôç½ý±ìhÙ̺™u3ë8?¨ *ƒ p„#Áf•ÝmwCø|8ðáOþ°2}e:ÀèœÑ9ßß÷ý}ëî\w'À”MS6ì»w.ÀêÓ«OÁ;âïˆÚ¾™ÿÍ|°³°e•¼qyãòÆq^ò µD-QK†¯Ê«®aCýÞú½ØØPüpñÃ@ðTÇ©ŽÈÎù3ý™ú(}@ÝŠº©?¤þ°«wWoD¸á¿ì¿ žσyxGêŽÔp½¿íl>Û|Öéäï•l%[ɾ*´Ú mFU hï·÷ðoAçNé›fù@õ@uxÔM½MÏ6=ËãÎZ£Ö¨5ƒó”»”»”»¦í‹Ôþá\©Ï(Ï(ÏîQ•&¥IjÅzÑÛâò áu´»ÑšiÍ •V h½g½ÉkÚ…ÖWÖW`؇íÃa)]jìîéîŒQ®#®#Æz§“oh•Z¥»ÈA+%¢Dw…YóE¾È×ßá!´íªvuÓ'ÎÕºÇUçª3R|¯øÖøÖDj×Zg­‹ÄÀ¤è¼”R ö2k‘µ(Üß§¿zºùéfs£sõé½z¯w[ÚKi/¥½$„Z¤©EÊá]¹Äú»L;¯×Î+Ç27gnÎÜ,D\E\E\…w›£Ýü¢ü¢üHíZnËM/^¼ÀMnr3ÌmN6'›“ÃZ¬{°îÁºíç.O‰K‰K¹4úµ4*zÒÊÉ˜Ñ %Æ=í»Fh×w8B»[Ý[#´›b¤)a ëgëgëç°Ûi§¼‰í‰í‰íöG“Éj²š¼â1RÜ× ~ùV£Ý%J£Ò¨4Fj×Ûâm k×h1ZŒ0866÷úïõßë7ëhñvH;ôöl)µôbÇŠÛX8@&k·Gë‰ÐîN×N×N#Å×èkô5A‚ñKR÷1÷1÷±ðkGߣïÑ÷´‡þ%Iü2¦nè¹Hº`¬É +BÚýËÒîÜ…sÎ]Ö®w¶w¶w6ûGÖmgJ™R¦”VE—QoÆÔUÄi·Óî#ZV£ÕtåJà²íeÛ˶Ûš>4}húñ3ê­Gëq§‹â€8 B¯ÍS/Aü«ÝmÑþÜå9å9å9óÅ|1ßšªNR'©“@ŠPħg2ú3ú3ú…ÐÎjgµ³Jsh㲘Éýß,ÅùT,ŠE±~.zù•rÕVmÕå¤rR9ùÏ_<ÿ7f21yo;êº!Ì1øHIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-56-red.png 644 233 144 4231 14774263775 15620 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜNIDATXí—{lTUÇÏ}TZw´Ð }MÒºÒ”Ôµ, í£…ðH¦KhMÚ`k  5¢¸ÚJ©lT(ɦ–Ž)”°JC)¸A£›TC¶3M)ÄPytJ3Ü;÷³tÎG¢d³{þ™9çüŸs~ßsÎŒãm¢ˆiê“<<<ÊpxÀq_Û}m÷µ-œ­›º©›—>³Ä,1 Ƨ­¡ ]è²±}«AÚKOÆÍ§>ËÍ·AlÔÖØùÔz›Þ¦·µÞT^P^P^°A’SSSùDzËË./» eWÊ®”]w¡»Ð]éËyi/ýe<_æûm¡Î‹íOÝ£©CêPï,¹C™U™U™U拺tè²î÷ßðßðß444F¸Ãî½ôÒ v?±}"·­Oëƒñã¸4q)@_q_1QmMÛš¶(»€þ™þÀž÷ü‘øãùš*›æ6ÍµÖØ;Ã'¬”™)3SfÒpsáÍ’›ã;3l c%×|ðøÁã©GRœþâô¹¹‡[·DçÜÕµ«+z!Ÿ;>w4îmÜ øÃãYg\œa;7œ8 ’GòIÐw–¾»ôÝ¥ïFVfzƒùÁ|`@­Ú¹j'ÀŒµ3Ö4µ7µ4šׇ/GƒÎM™›°¦dM @@èWÏ_=pâÆ‰À@ŸÒ§€éöeDòH¾0(GÝ—Ü—Ü—lCÓ,N NŒö]R¶¤,z‡Š:‹:’Ž%˜¾vúZ_¹¯ m$m`ò;“ßxpåƒ+£ý««««¡pÂ7Ìl3;’ßý¸ûq÷ãö½}TîhÅìÆÙ³éSÆ”1øÄj°°xN–þëô¯ÓÎ_;-z=‹zEìîßÝáÈpä<’óÀÕsWÏœh?Ñ¥õKmÚ.€•€%£N*œT8‰É'ÔRµT-½{]>u7|8öáX”‡½Ã^€æüæ| peû•íÑ þsþs¢NÔìOÝŸ P<­xÀºåë–G™ƒo ¾ 6©M`ÞùúÎ×#ù¾ÜÑq±ã¢½“Qò”<%ïîu¡=¡=¡=±¹^ž²¬GÍÎfsªïϾ)¾)«hæê™«r—ä.¬G‡`Ó±MÇ‹‹|~Ÿ`[h[@ÏÓó>™÷É<`dóÔÍSEJ§Ò ðû7‘p¢™›s®å\ Ù€–ª¥j©ûo G‰£ÄQ"„~F?£Ÿié·/|wQmQ­¹Q’†j~úþ§ï à)(((Fd©³³³³ެ?²>z§G¿ý  üíò·£Nùí‡ZjÐþ’?JŽ”ºê›JO¥'4b®ÖVk«ÿµb¼Ÿ$O½l™{òòòz?”5[jÒkÒ­"»r“ áÁÿÓþ§ÐtEZßZßI&à>Ò‡t0+G»F»"¥>4thá ,²ŸÐzµ^­[¨¤+éJúÄjßÚOê³Ê³Ê³Åû”årHj%´ÎsÊ3Ù3­Ý¡‰¡ñ[¡v ú!ôC4/ó0@èDèXEÖûÖû)õ·ô'ô'@V¢óŒóŒQmïä[ÚkÚk5.­T”ŠRÝa/æ‹ùú[¢U´ŠV!´m@x±Ý~Z÷9w;wɾW|}# ­¢Ðs¡çb @ŠÎÃó<ÖŠÐ3¡gH³ò¯ËO—Ÿ67Ú/Ð}HòÔ¦­O[Ÿ¶^Õ¥ºT—r8LW)1þ\¡õh=Zr<{Sö¦ìMB$T%T%TyjmíÎwÍwÍÖn¨&TC<À-nq+ÂmN7§›Ó#Zl,h,h,°Šì·<9!9!¹,ük)1¶ÒÊÉ¸Ò %®{6¶ïL×®ïp”v·Ôl‰Òn²‘lDŽÐÏ¡ŸC?G´ØM7ÝàIêNêNê¶–Ùšt¨Õ±ò¯qRÜÇ7Aüö€Ö§ÝeJ‹Ò¢´Äh÷”çTD»Æ)ã”qÊ Œ¦¦¦Ácƒ >6hN³µø±ö±öñßæH©…¥ø ¸G‹È¿¦ÝÎÎF²¯Å×âkaüWi€AIZs¼æxÍñȵ£ïÓ÷éûºÃI’þ—7<.î¿`|“+ÃÚ=ökÚ]°xÁâ‹#ÚõÌñÌñÌáïãó–] ¥B©P*Š7ǦQoÅåUÄÙî¥Ý'µz­^«ïÍ—ÀuuuÖÎÜ`n07hü`—z@Ðj2E³hÍ"|íh¾¸|ÄÿØâµ[Û_ðoe•²JYâ)ñ”x*”£f¨j(BŠ8}6k$k$kDí‚vA» t„WÄUîÿÖ’ío%¢D”èßÅN¿R©Zª¥Z œTN*'¯>2>þ{O\e¼qqïYêÿ*‰Ã[ZAé5IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-19.1.png 644 233 144 3047 14774263776 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÜIDATHÇÍVßoTEþînwÛÛÔþ²nÐZ­¦Æ´ÐZ-c•‚H J!}ª‚ôI< ‚Ôˆ i$R%ÕbIÚ@ÝJ³)–5[°!µ6)­F$,Ù-»-ݽ;w>vgïŠþÌËÍ9sæû¾{ÎÌ™ ÈM|AÚŠlE¶ì¸mÛnù3žÍx¶ä›¸Ý.HíEíÅßÞ!sÚrÚH2¯#¯Ã·l5¯âS×~*Ÿò#–#ýdúI­&aï#_zꥧ2ˆÛ{I½Wï‹‘;Ní8E’=_õ|Å×ÉëÃׇI2P¨!-[Í«xµ^á¥âcß]üép;ÜÚ52Ý™îÈâºâºÇvÅ&#žoxž$ÿ´ÿi—6’$ÅM’YÌ’5$C Q Š­æñj½ÂSøŠOñÇõ€,XY° ×5®kÔÑ€ñNòí‡ß~˜dI½ü’û¸Y¤pÉOcÁXyÙ¼>LÊ]$iøä¯|“o’¤œ‘34èwäJ™/”&3Ei—vi'¹†/ðÞ=¤l‰]‰]¡!'Ä5qM¹ çÖ›ëM%ðÐ3)¥€'“zH…Ò8rõ“«Ÿ$ëç‚áüp>ç£ÆQã¨Åí‰öD{H¿Çïñ{Hsœ0'R¤LqŠS$¢—^Ë= ­ ­á¼­''õIä%½_ï¥)=à/Ðþ#Ùô^Ó{¤\F’fy õæû7ß'«?ªþºúkÊ3§NYu®:W‹ÌÌÌ$[[[Hzÿ-Ä0Ì2Ðø ð¹¼uy÷ònÊþ7N¿zúÕdT¹¹bûÙígUæÚ„¼—öݓݓäÜe’”۪ު̯ÌgDåu´~´~´žìôwú;ýäÒŠ¥K+,eÁ²`Y<Ñu¢ëD—å¿Ý}»ûv7YÕRÕRÕbmOÃ÷Á$*½MÄâ¸ñˆK{lÚCÙ}Ù}‹—áÊÓeO—™_€vÌ÷íðèð(Ò—8—8–8€ÙE³‹fE(B€¸ºövííÚ LçLçLç H½UoÕ[ß9ß9ß9 ò¾Ê¬Ê,`þ­…[HGiÇpgeõÊjÈÊZ¼Ì†ûì›í›ù$Æ:>ðà–ýº£ØQ 8}Îaç0 …‡€+ V[6nÙ¸e#ànv7»›ÛyÛyÛy óbæÅÌ‹–0Í¥¹4`±ØG€´]iÍiÍj´ÚŽdØ-d8<Øì |Òš§ÍÓÚ ã9ã9@{P VDz#=‘À¹Ö¹Ö¹·ÛÇí€û¸û¸û8PÛTÛTÛ¸ò\y®< ü@ùòÀqD@¸?Üî·„FÝѾh þˆýû!é.Àï±’X ˜}fŸ6fƒª Õ^Á£Þ)ï€ÅÀ×ÎêïVŸ\}ÈÉÉJÍR³Ô6mÝ´uÓV ½¸½¸½hÛÙ¶³m'P²»dwÉnÀ3ë™õÌÑÂha´Ð¶*kUÚª4 èþÂ`aÑÄž{M+õþíýB5¡šË#P§€lz·é]ë”±P,DÒŒïÎänöÑGÉiNs:¥=t°ƒ$ËYÎòÿ¸@’Œ¨­ÇKà'ùâT&û˜ÔÿÒÿ ¥Ñ¼j\5¬>fn1AÎËçãŸcbŒ¥¢T”’æAó y¤‡zH!„‚ä!îçþ”öñ²á1<œ—AÕÇ&*&*HÎé“údjûOçß¾!=µ3‹3â IÃ|Å|…Fò%£Œ’Œ$3¢fÉYúéO͸¹ÍÜFƒsâ¬8KÆ‘ ¹!cCÆÿvþ»îJuw©»’‰»ÜÏý̲J 6‹ÍŒÒ+ã U£FZ¶šO–,±^á)|ŧø“wå=ûº¸gßc÷æ ö甈{`iIEND®B`‚routino-3.4.3/web/www/routino/icons/ball-2.png 644 233 144 220 14774263775 14362 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷ÜEIDAT(Ï­’Á B£õÿ¿ü:tʹÂMŽ:EÀH!åbm9ÄߦC´ÄÏbž“Úõ e)TÐzì+þè¬òGz »¯]ÆIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.8.png 644 233 144 2564 14774263775 14773 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü)IDATHÇÍ–]HUYÇ·:z5o™‘dMÙML”‚""!?P«+#!}€Žù1ÅL #S#YÔËŒ“eA£ŽÁš#‚F0á”CÎCf£ø ”yE¯šÝsöþÍÃ9Çsûym¿œ³Ö^ëÿÿŸ½÷Zg B±Ü| _¾6|™a‡±ýÑ9Ñ9®þ¦CXaXáÀWWßß$ŸÛ¶5oŇæ aã‡òY~±\ØG«£5,Ó´ÏÂþ´ýiÑ+ ûç^ˆii­AyGy@ÛͶ›ƒñ¾ñ>€©Ì©L°mkÞŠ·ò-¼P|qö~! ²+²+lQŽ(!`]Öº¬ _#`oþÞ|€—/#T8耧Êf™ÅžÛš7ã­| Ï·ø,~C€„] »„w±»8¦ÑHxÞ Õkª×@°h¤'?i5Z ©•h%øA ªAÀ§* ž©g@ƒæÑ<øÕßÁ‘àð+§8…ÓlG«NªN²>o¶ù =âí½­Û EÑEÑ€>½_ïþ•;ä‚ê+uY]6fxýÖŠÁjV³ÔZ§â¼J}ªõj½IÕ^h/,wðþ"Q$,u»C¶R!6ý1ã1㳟À°>¬óä1!se.ó (ÿ7þ*xS¼)Þ”A5ÔPc›Þ@o ^í}•ó*´4­X+P媜yšøß¿¡Çví/¨¬©¬|2ôx=ôzšžf¯Ðéͧ7ŸÞ Y3Y3Y3¼7¦š¦š¦š `¶`¶`]‰®D¸7¹“ÝÉðæÈ›3oΠ@¹” H±øL~S)¬ÿ;¸í½í]Xù/åÊ@w ¿å¹?tèþ½ñùî|w¾û}aÓÓÓ°ñîÆ»ïÂÓCO==®«®«®«Ð“Þ“Òc¯´_Æ|6¿¡GÀ²Ë¨Vß:¾ˆ|›h:azÅô Ȟ˞˞ƒçœ?p ² ² ²ì89*Gå(x< žHÍMÍMÍ…¸Ú¸Ú¸ZØR¸¥pK!L8'b'bí<õ›õfò›zÄ/_*Á3æýó…² .¶.¶.".E\ЏÛû·÷oï‡h_´/Úmmm6Q}I}I} ì,ÛY¶³Ìög”f”f”B}r}r}²í׿°ø ~KO¸²Sv† ¡íÓö ~L!D‚Y"{CöúìõB´8Z-!\#®׈‰Õ‰Õ‰ÕB$9’I!š«š«š«„X2¹drɤcccBÜQwÔ%„ç‰ç‰ç‰« Vå¯ÊöøÁâ3øô,vÆ@¿¥ßÂ/¿••²ÒþÂ{÷:ïu¹À¹À¹øçýóþyØstÏÑ=Ga2}2}2®Ÿ¼~òúIØæÜæÜæ„ò†¼!CÎÈ?ú ý~z=cïTåÌBUfè òU…ª@ijÝZ7È.Ù%»€+\á (·r«Ð"¨¥–Z`ˆ!†Bü^&˜Z飚OóaöËE«ò} ³ÏÌÉBYhv5@ý¡ZU+È‹ò¢¼ 0ÀÈ(%£€Ãæ0èõÇúcп×ëÇA~&ódð»tHÇ^Ú°oØ·hû@çÌÎÿP ËdA³Ñ*æ˜bÊ|W€/^@!1¶,H̆£@–ÊR‚6ž…oñ½×ùÿç_i´¸€´Ym@?¨ÄªWõFض5oÅ[ùž…¿è¿ò£½]|´÷±óûŠëV´fIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-23-grey.png 644 233 144 6312 14774263775 16010 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—}T”վǿûyžy%äͼ A (/BH‘3À±:d¤‘i‹rÌctÎ2½·%¥k¬c i ./o|” ', BA i·áÅfæ™gß?˜‡{WkµÚÿìµgžýû}öo÷oÿ6ÑjµZ­ÎXj†¥Ž‰ã†¸!nˆÖk¿Ó~§ýŽzäŒçŒçŒÿiu¡.Ô%ï]Þ“÷ä=#w™kÌ5æú9JQŠR’…@"À=ÜÃ=»° »èç²dY²,™dq¿r¿r¿Þ.%3d†Ì(ÉvÏvÏv¿z77=7=7èy_Þ—÷%/-q7ì\ÎÌ2àlÀ¦\Èr„á†å‘å‘åÑësjsjsjˇ-z‹Þ¢o¼e 7†Ã#ÿË¡À¡À¡—###IV”$J%Ö»®w]ï ˆcññ{q¾hoپݟè_äù8{Ÿ£+è ºBH%;ÉN²Ó·€õe}Yß¾yTö¨ìQÙ“®nnn¶ý‰÷ï%Þc¬!Ý!Ý!Ý$I–%Ë’eÁˆð>‚Fa dX…UX£ÙËìeöBRwkwkw+µ666 û§6MmšÚôæq¥¯ÒWé+·í´í´íL( ª¡š¡Tæ9rhñÐâ¡E­hE«—#WÃÕp5­g-&‹ÉbzòÏ~ý6úmä7¤d¦d¦dråÎóÎóÎóðƒ 2ÈÀ ×…ëÂupDMÔD Àð`†f“˜Ä$@lÄFlà!@€Îàhp48b°²°²°²Olllá~”*¤ ©â—+|2ŸÌ'?¿Ïãy†_àø…—Ö[.Y.Y.¥G¸½æöšÛkÔ?åbÊÅ”‹œ¨‘9 X³8‹³Àâàâàâ À—ð%| @v“Ýd7€<ä!€zèD €ÙÉìdvl«m«m«ò ù…ü‚¢ý”²”²”2®Ü-Å-Å-…ú‹<"Gi üd«ÕÁê`uÔ‡Õ‡Õ‡‘èÜàÜàÜ©Ýr>c>c>8—p.á\0Z5Z5Z0±L, ¨Ô*µJ ¨®©®©®3[f¶Ìl*>¨ø â@Ÿ§ÏÓçÒpi¸4HŠOŠOŠ_^Ç ç ç ç Õ±êXu,+V­< H¼$^¯O¶2¼?ïÏû?³ÛeÒeÒeŸ‡>úl賤p–AÑÐÓÐÓÐL4M4M4šXM¬&PsjNÍ5³5³5³Àƒm¶=ØÔ9Ö9Ö9†iôax/í½´÷Ò€§?~úã§?ªC«C«CãVãVãVÑ ¤!…!…!…¤Häùó´yÚ<øäûäûä#K‘­ÈVdÃHÒ£ô(8ÑÂ\è\è\( x Þ‚·ÄLÅLÅLSSSÀýñûã÷Ç÷÷÷ É;É;Éð8ìqØã0000póÜ<7˜6›6›6/ƒrÊe„2F‘Gäãð>Ãg$9ÇœcÎ-OÁ~ð[#mGÚŽ´€¤VR+©–ÒТmѶhéÛÒ·¥o>‚à#žZO­§0g˜3Ì@éöÒí¥Û>×>×>W "+"+" përërëh ¡1¹En‘[1o1o1o(F1ŠI Çz²ž¬'=?==MBùT>•OÅS\%WÉU‚ÒQ:JGAd÷e÷e÷¡Î¡Î¡Nàü©ó§ÎŸŒ%Æc ð†÷Þoxžïz¾ëùîÿ-ý™ý™ýˆÒDi¢4ÀÊÙ•³+g;ë﬿³Ð7èô €Ç-[·@Åi:u<êÀ“Ä$1Iô<'Ï—çËóùîîîÜ?ºJºJºJHVä‘_D~ÓRÂ…²;¡;¡;(Ÿ/Ÿ/ŸâËãËãË„k ×®l5[ÍVÖ4kš5 (w.w.wTªÕ~;üvøm`]̺˜u1@[F[F[088¸œ~Mºh]´.JÝJÝJÝJ•Èäü )HAJv)§å´œ–d5v6v6vÚü ^/ƒ”¢D›¶4miÚx÷z÷z÷¾Ô—úR OÖ'듪U‡ 0ù›üMþ€á´á´á4piäÒÈ¥@gÐt ùåæ—›_Øv„|Žøñ9³˜]êÎÖ­;+l :¢#:ü÷ÒEñ”ñhöhöh>rPª–ª¥ê²Ñ©É©É©Iv°z z zÀ¶ÏœnN7§c…%Ã’aÉ€y²l²l² øöëo¿þök âBÅ…Š @Ùûeï—½ VÃjX€}Š}Š} 8t:ètðSïO½?õ)S6¦l]U´ªhUdU±U±U±‚qltltl”ùQú¥ôKé—?o·[‡­Ãû­äÐÈ¡‘C#ÚІ¶ÿ8)—ŒKÆo(Ž/_8þ¤&q(q(qˆÆ¿È¿È¿È“æù‘ù‘ùP‰Ib’˜@0‹YÌÐ@ I“¤IÒö{€=ÐOé§ôSÀr×r×r`3ÙL6àâ¸8.Æ.u—ºKmeee¨Sô+úý‹›(KYÊFnC‚Ôó†)eJ™R¶9ÆcŽ=ø›0&Œ c;-Š;Š;Š;@K[K[K ¾3rgäÎ*W;®v\ “ì†ì†ì FþŒü@Þ.o—·ÿ?@J)¥©&Õ¤eF™qpnîæÜ͹›P^.¼\x¹÷“ H$11H ‰!1=Á œÀ ÎË^æÙ¢–êFîòùŠ|՜ɦ²©lêþ0`À0§j&j&j&ø=ƒÁJ¢!¢ÁÝG÷Ñ}ÞÁ;x@3šÑ B!Ò‘Žt€®¥kéÚe-®¸Rw¥îJmßLñLñL1wRæ%ó’yUä®É_“¿&ÿøÈF6²ÉYô£ý|«R©T*–¶Pp!Á$˜“#ÁÅÁÅÁÅÿ~հðð#ˆYª-®<ÜôpÓÃM¶}‘ёёÑÌ«Ä a&i$¤CÂ@ $£q4”´Òî¦î¦î¦ŽÆ7o:Þtœù§c„c„cÄè¢uuuÏöÍ©©©s<¹J®’«d—}aŠ…³ÑÞŸƒSçXçXç`ÙkÙkÙûá—¡s÷jïÕÞ«eOÔ¿^ÿzýë4žd’L’ ™ð½ð½ð=(P@ÐY:Kgžð0Mè&t:T4†5†5†ÁÉAï wÐB´-DxdIz£‹v)ž\¡/‰³ýI"³í[Äž@#ÑhÛG6 dCü«KOŽ..E@øë›Â›Â›r,äXÈ1$ ½B¯Ð %Ä1A0óY|ŸYa@a@a€m>F£aûäaò0y؉إC³ÿG¡H(Џ“Æ0†ù¿‰ÉÍÍÍÍÍÅœQØXÖ]»ûìÚ=I H)h¾Ä¨5£Þ_³tÊ™SµÖZk­•ßc(1”J d†aÌŠ‘¸jºjºjŒ£E£E£ElŸü ü üàÝËæææ÷½Ð÷Bß €P¼´•" È· ú`ñ¥ÝÀ¿°{±—\\W½®z]õ‰Wå»å»å»+rg ¦‡f‡Ùá>Bž'äíëÝÞ»½w;°»=±°4ýÇÿ·ï|³˜X®IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-42-red.png 644 233 144 4253 14774263775 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü`IDATXí—{LÔWÇÏï1¼ÄEi­(ÃZËj}«+Hª€0•šˆ.Ah!nL¥]86£%ˆ<¤˜BiÌJÒPœAIˆšúذVJ‹Æ>4¥­]gPXkä1èÈÀï÷»ßýƒ¹¿y¤ÕlvÏ?ù÷žs>¿{¿÷Ü@4aSÈÏÄ•ÁÖ`k°Uxäj j jMKUY•Õ¯ÿN‹i1-&¦YÉ$“Ì}Àßg|=çùx~ÿzâJ_¾´ƒvˆÿùé/Ê­r«Üjv ;…:HDäpäpä0ÎeÜʸ•q ØØ³±gc°!iCÒ†$¯ÏçùzÏóñü¼Þ“yH\áïÏ>"Žˆ#âH÷b¾CÑyÑyÑyê®cÇ:Žu°0ççç$Hpá!â!€nt£Ð}Ï<_Ïãy>žß¿Þì#Oæ#ãd±Wì{»ÏóIíIíIíÊrÛ¸mÜ6<Ʊ–Eݯ´(-€ºÄó›®¾©¾ ¨KÔê @ݯÎVgl e¡Px¼mÜæ¶¹aãùu`¿úÆÉ:š`,‚…H.•KåÒÆox€©ÂTaªPÒu°÷ØV¶N¥QéSúÖ­åkùƘ•Yá5MÈgùÆ´­`Ý£J# fÁ{O»¦]ƒ“¯6U˜JL%J:¯Ïy8îîî®ù3_`,1–KX¬½ßÞoïÇ'S­TO©§e(àÄz¬€GÅŠÀmtñ¦ìRvp¹†\0:ot V²ZV«/rÚûí?Ù±ÄxÐxÅrOÞ&o“·u–ò‰ºÜºÜº\ö¶'K±('•“Àö±}Ü<÷½)÷¦ÀsÆçŒP?§~Ž/à¸;qx&ñ ˆb'wPeP%¼qð Xü¾ÊU—[7£n{[ßY?>bŽÈ…‘ #¢b m m Í»ˆaƒl€S+ÕJ}sæ,ÍY Lô¨‹¯‹÷›¿“s¢ú¢ú ãÓŽO üVù-NO\ÌùwÏ¿ë­7æˆwÄœ‡óqÐCë>X÷Áº¼_¦ÚÔu€CýQýÑ þzýu˜Ö6­ÍôÈÖ#[}×%¾–øì«ÙWã;îŒuƽ@/pÔ|Tó Ú|×ÀÅy8Ÿè¹R/R ©†TýŽÓ¶‘m$¢iÒ+ü¬ˆ¨¸¿¸Ÿˆhì籟‰ˆÊ——/'" m m#¢ä_’!¢OüÚO°¡ÙÐlhÖ¯<ï¯,;¡:¡:¡·G…ÇåËœÂÃ_ùF$\M¸ oµ¿Õ#ý#ý¾;Zþkù¯¿u™.u^ꀨ÷£Þ€ è hî–þ–~_{zDœúúJšš45i*ns>ÓÅt1}¼Ï3PѰã¸x\ô‘@HoGo„U…Up‡™ÂL0¹zr5HR†°V®À¹Ãçû޾QøeìÐØ!ïg¨'•QeÔ[ïRÕ¥ªKUú ¸Uˆℸñ>’–Iˤe{Ëø-‹™e¼i¼©Î¶ÿ¥»¨» 8Ùª¯º¾ê€/ÿ À.ô\èñÙþýöï`¸t¸–®]º^Î|9.8.8¸ZZ¼ÞÕ¶Z[-Ü.(?(? ÷.˜³`ަ?Òtiº4ýã! O O O%’/Ë—åËM½zÃß`Š7Å«üS53»Î®Ã ÞÜ]£í£íðÌÍgn@ƒ¹Á øŸ@TMT „¼ò' †¤|)Ð>&"NäŸÈò®l*ؤ¹tÀ-ÒiËÍÌ ?ÔAþ]kˆ3¼dx©û80ï75e«ôþ1ÕäXkપ×&×&À ¬€®.îþoû¿€¡Þ¡^@Íuô8z¯à¸NŒXæ[æãuý -ËIJÑ4a†0C˜1ÿX t]¿_9BŽój½Ð$4 M\+Ú߬mÖ6k›w?ÕµÀ»ßÜp{À{-<î*¶‡íñö¨Þ¦{õ÷ê˜YÏÎzVÙ¦ïd±tJ:e6éhé”Né²ÑËšLÉ”,“…,d!’’Crì:£?­õƣƣJ„}½Ð^è-ÈViÏkÏŠPäèbWØV–Ų–©­ÖV{?eÓÕ¬»YwÕýz(?XDmÚµH4‰&Ñ$œôÐårÌIžßLé¶t[º-œÝ»;v7‘!Ïgȳе›lJ6%ûjW3kf¸a…VƒÄ Ï­ž«ÎUçz÷·:¾:¾:ž­ÒßòC„!¢wtÂ7†øŸ´p1àèIp¿ð÷!†8Cœ!Î~ÒG»ûÍû}´¡D(^ í¾v_»ïm;]èB` í í íbº&ÃÅp1<«(@е|Áôä©:@»OÓ®Ò¦´)m^å>Žzõ8 X0¼`xÁ°:G×b³Ô,5˜È¥æ‘^ àè)æ]Àüžv«ŒUÆ*%ÂÞdo²7é—j˜“šÏšÏšÏzÛŽ\/×Ëõ]žIB¯ÔõŒSØÓdy´{ú÷´›²6emÊZ¯v­‰ÖDk">™˜gúIÙB¶ýê^ÿ2â`@]þK{švWJeR™TÖ½„g—d—d—°Ã‹Æ-SnèGí’ÃMÔHäi;’= ^0ý¨Ýþ~Ê¿„ÍÂfa3@«i5­Öæ‰3Å™âL@ úç1®WŒ‹Hê”:¥NážÀÌ€“û¿Y„þW*¥Rªüÿôž\‘‰Ld€pQ¸(\ü÷'Æÿd 8[@Þ§õi×÷db«IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-13.4.png 644 233 144 3112 14774263776 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÿIDATHÇÍ–ýOÔWÆ /3†…2E¶]Sˆ ˜(­Ö¨º£ÐR°*nkâªdÓ`hlLJ¶.°¥m*˜¬l¢‰Ëb ¤)HÛÔ6²fÙ(‹cS„”÷:0¼|_îg˜ù2³vÿï/7çÜsŸóäœ{Ÿ{DDä©À,þlø³á±~;üPÐowÙ]©ÿðÛg {-ìµÿâêâêâëãëÍ»AÛZ·âC÷‹ñCóY~yJ‚Žèæèæ°œ€] ¯¯}}­}¹ß>Ù ŽVG묇/¾ ðù'ŸÂ[0òíÈ·S9S9´­u+ÞÚoá…âKåcùE òjäÕ°%«v¬Ú‘Rêð¤@~^~ÀmȦÂÀbˆQ9€/Ö±­õ@¼µß³ð­|V~?„ì„l(Ø[°×qMDäî§ðÎ3ï<¼ µrJ*‰#ˆ>ÒÖfAý`ž4Oõꂺ úU? {½, ëSúç9O ð⎥K·Þý”†WÍWMÇyHx3áÍ`OsÍv(œ)œU  }£ú)£ @ý¤~BæfÕ,Jý^½¢^Yªj…Z¡VÛy‰—x|(ÌÍÑÔŸôçõç-·ö FQbQ¢E°f{H+EDÖü ^‡×Á÷ƒ§O-æÎNÏ8gœø´z­^«fÒöh{´=0¶mlÛØ6Ыõj½:„J=ôc 1,úÝ G}—}—ñý’4çó’ ž=nÇÇoÓ~>¿DDθ¡äDÉ P›ÌuSµcc°ùí͵›kQÏu&w&ƒRJ)[wnݹu'Ä×Å×Å×AáéÂÓ…§añÒâ¥ÅKA~ú>}Ÿ¾/h—§•»Ê]¨ó9£9£–×\g6N=œ tûùˆúˆHß1hò4y`ö6€:øÂÛ™ÎL' V]ûV÷­î[ mmm°q|ãøÆq˜òMù¦|œ˜œ˜œînw·»ûW­äúàõÁëƒÁƒ“—çštM²èôA³»¡µ¡èòó¼±_Ä~¡šY6² Ô[{”¤ý¨ý™‘™™Ðz¨õPë¡`¢éªéªé*È*Í*Í*ç´sÚ9 £ù£ù£ùÁ¸É-“[&·€+Î犃â¿WWÁËksgrg‚qÆÃ¡Ä¡D`,¶9¶Y5‡ËolûmûI“;‘F~("§EDdÂ6¹*r•ˆí9[Š-EÄî³ûì>‘‡-[¶ˆô›ýf¿)Òîi÷´{D’Ž$I:"rå앳WÎÊÒ8·ûÜîs»Eº*º*º*DîçÞÏ»Ÿ'ÒõC÷t÷´HûbGIG‰LØ~ûôäÓ“"êÒ.í¤… f»ÙvG4m—¶K$ìw""’`ÏçÎïšß%UUU&r+ûVö­l‘bw±»Ø-âNq§¸SDÕ>ª}T+YYY#Òßß/²i妕›VŠ456565ФÞHíMíY^°¢É ø'7¹ ÆQã¨qŒJ£Ò¨s½¹Þ\àÀtšNÓ ü…wy7„h»a7ìøÌã~|¸—u/ ˜wÜsÜóF [:ö+å/Š.ŠQæY£Ãè4ó ó ´¥ ª@ç™cî4ÞÀ~aœqÀ´*n4¢±hÜ0n3|ŠìEöÿ«ü½•ÖÛe½•~‚­@5ÕÄ[lì7ö³ªWõFmk}éHö[x¾•ÏÊïçó$ÿ.žØÿØ“ùƒý/š9ôòÊâŸIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.1.png 644 233 144 3001 14774263776 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܶIDATHÇÍ–]L”WÇŸhaêÅ¥k«Í–Æl4E× 2V£ ¤¡µF‚1&4Mji¼hšRMÔ¶Àí……éi ]£ ²Ú** dØh 1ÔI1•äå£Ãûq~{1sæÝ»½òܼyžóœÿóŸ¯sDDäåØWÀ»Ì»Ì›•½å®>õÝÔw³NFåz<%ž’›_Bú÷éßdü˜ñ£sÇ•õ¾¶Oòtn¿+„Ò™ÒPŸ˜aõ+ûØ †Ô&xñ¢Ô:õŽz')T¥ªT• nª~ÕϳK©ƒÖ]ë.¦ºgÙCZm†™-uJMð»Â„TŠˆüõø Ÿa$sm n .øÞìÔÌ’™%Ì™ÇÍãæqד¹Ò\i®„±Uc«ÆVYmV›Õ T:餸J7Ý®zvÊøÀø€9ó^}ƒ> ÏwÞwÞHÖ|„~‘úØûõÞ¯A­pÖLÖŽUUAàæ@3êÂO/4ºллл ýPú¡ôC°é覣›ŽÂDh"4ríœ$'ÉI‚ÉÚÉo&¿ µš64¡ÎÿýìÇg?Ž[­q6—_)¿¢#Wß#ꮈH_4 6 Âì µ'o_Î’œ%Dt\û ú ú  ¥¹¥¹¥²Œ,#Ë-zûûû¡îA݃º®~zõôêéÕw0ï`ÞA·p:¶ÿ<õó‘X¦÷ØÖ‰ñãšX_…`¤µ¥µ©ÓüçÑK^õY¬þl›Ã°.Ýæu›¡½¤½¤½"£‘ÑÈ( ‡†CÃ!è¨ê¨ê¨‚ÛVl[± BBB\bV™Uf•kçÚ¹³8ǟ㇖WÎ žtíìé‡o>| ­+­KÈXœ±Ø¹Í¿ÆåÄÛ>‰ì@v ‚§‚§‚§\ Š¹Š¹Š9X[³¶fm ôföföf&¤P9ÊQ fÔŒšIˆìáÀáÀahÙÜÜâŽ{á÷û¿ßÍÇ+8g³žÛbšÅf±ˆg¹ˆˆdÆzC濜?2DÄÉÉI$\.—‹Ô.ª]T»H¤¬µ¬µ¬Ud¤g¤g¤GäúÅë¯_©__¿¾~½È“Ò'¥OJ%¾Î-´-´‰Ø#V§ÕWgÊ-+ËÊqÚœ6Ïm¯xŒ£àÆ5ùK÷ýîû"ò7>Ñ8……©…©"KG–Ž,¡DŠ6m,Ú(r¹ÿrÿå~‘ºìºìºl‘¡¡!‘«'¯ž¼zRd~ùüòùå.±­þ­É[“E–ýéÕ©W§d!VsŸxVvvŠˆùFþk¢»ö~µ÷+·KÀ2,·¸Ñ¥ú®Äóêi|gë?Ö•ñ9¦|¿ù~3’qÌÓcÎ.³ÝlgŽ”PjAʻҮ´+Á¾eß²oÝh7Ú ÊU¹*'×ÉurjŽp$¡ö>4;ÌæÔ”žc÷Þ¾÷60ëô &αÿ™ü;Sv¦ÄÇh˜ûûÀv>r>ÂÄŒýñcF&yÌcàqìáþ¦™`pt„œ=ÎLfí+öˆâ˜aØ™º3UGê©ÉÿÌ]©ï.}WF jð»)°Ëì2" ºUt²{ð€+ëýxÊbç5žÆ×þ´ÿø]ùܾ.žÛ÷Øóù‚ý/†ý,s”†HIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-9.1.png 644 233 144 2633 14774263776 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜPIDATHÇÍ–_hœUÆŸ™É˜™6é’Æ‹1DÌ…ëª ]!FÓ4‘H$Qñ®•ª%J·ˆMS(]/¼B7)H,¹jÚ ¥ØÒš ”lµÉ'RTDCºµ-­)I+Ùd2³ÍÌwÎ÷Û‹™o¾Yݲ^öÜ Ï{Þ÷yžïœ9ï9IReþW¬ Ö׿pðM?i‹´Õý-‡ ^¼ðÝ_ b b`Ýк!ûƒ½y/¿¸^òù‹õ¼¸*åJ—4çñûðÊ£¯<YŸÃ€èÉèÉ”ÛOm?pâã³n|yãK€ÅæÅfð±7ïå{õ_1¿Þÿ…¾áx8¸¥÷”Þ#AíÓµO?°3—ðÏ óÙÎg®‡®‡Ü ˜›@9ån3$‰7nao>ŸïÕ{|¿§çéçüª6Um’àù®ç»¢‡s?ÁÙÛóô²' —^ÊÝo²sÙ9à„‘«à~ë~ ׺pÜÏÝÏÌÛæmVyÒiwÚ#lcå>ãñçõ ú9?úï½íkåö‹¼XX€ì$ëœ)g Üß9çœsdó®²i›:è ƒ_ wû–û¸yqÁþd"ËŠ9nŽñóR䥈g°¯µh+%é÷BôFôF²fͬþ@;¸ï¸ïÎü˜d#pkìÖÈ­°íE{±ÈÉe.s8ÏyÎûáÔRj!µÙËNÔ‰¸;ܤùÚãÏëôs~òÆÿÝïu¿î¿l=ÐH#,_Xž_žÇ}Fm™¶ ”-;[vºötíéÚL0Á„oÄž±gìXì_ì_쇆ƒ ÂèŸG·n÷ÔVg"™H¡ªÞÓ÷üsëöÇÓRSOSä6KRà1I_è eŽ.>:­Àò–äëÉ×¥tKº%Ý"ÍìÙ;³W:6wlîØœ #µœZN-Kí í í RbWbWb—¾¾¾YH 0¡wõ®2yø˜§ïù JkÏ­=·áqiS˦Ig$)p8ŸQ;û$ö‰4ŸšOͧ¤áÞáÞá^éjÅÕŠ«ÒâÔâÔâ”o,ÚíöK“ã“ã“ãÒÆ5×l\#¥éD:áçiMpCpƒJóÆôó~J¤Pg¨“‡¥ðLx& Ðk’¤ŸuZ’TÕVÝvoÛ½ÒÖ'·>µõ))Þo·JÁD0LHeÓeÓeÓ¾^ :P¨–B#¡‘ЈT²¯d_É>I—tI—ŠŒEôˆ) Ÿ¥ðéðiUI¡‡BñpP²ŸÚOßKÎsÎs’ûxÎW1Ý9Ý1Ý!Å/Ä/Ä/H›»7woî–ª+«+«+¥úýõûë÷K‡Ì!sÈH+£+£+£¾~&ž‰gâ’¹f®™kEƾÓ)* *Oßó”’ÍÉæ¯¿’Æ?ÿL 6Jo¨Ä ›aeŸh|Bêjêjêj’kkk¥;vJu=u=u=ÒØÒØÒØ’”‰eb™˜¯ßRÞRÞR.Õ¬¯Y_³¾heïÇÁñþc¼áéüüòTb½SâÇ“\á .W™e¶¨= 1ÄPO=õEñÛÜæ6ÿk¬²êŸJp’NòΧò×}ÌÌ®Îúí\² ¶´¹bËl˜?˜:Sö€=`cŒ1Æc ÐG}EíãOöeû2¸ÿ"F À~d?"Mú7õ±¢Î_èÄ^g6“fpí6»lþ«] Kp1`‰%–›Çàà+ùü¬}Õ¾J¶À÷ÿ;ÿîJvß·û¾¢»>àÊý-0[ÌVÁps 6@|ìͶ,_ïñyüw¼+ïÚ×Å]û“t¾`ÿ©QñNàIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-39.9.png 644 233 144 3251 14774263776 15057 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü^IDATHÇÍ–ûOTgÇŸ3Ãm&QѦDÒ´5ºj@:Ñ%¶FËmYl Ó)Õd7âZ~XÔ„ìš´»ËJ7„mSÖ Dm™XY¹4(B jM7ÅlâL]/-Õv ££3Ì9ïg˜9ÌìåðüròܾÏ÷¼ïy¿Ï+ ""éÑ·€%Ë’eI‹Ø–߯ü)%)%/uDìV´7µ7Gÿ >XðÀÂö…í†;f›q3?¾^$†ßÏôKºÄÉÉZ~Ô~*³+³S–Dì¦a°uÙº…a÷¹ÝçΞ<{’½ðýß0?1ÛŒ›ùf½‰/ïýWHìKìÓnCrRr’<_ü|ñ‹µ‘Ï‹PözÙëßZ¿µ* è?©¤ª|ÀóñÆÙf<šoÖ›x&¾ÙÏìá#ñZÆk"|T>S>ck‹¸?¦¥þhýQPWæº8F+­¤‚®éО ÏTÿ4ZŒà¬êR]êkõ5Ô«ô*‚žOå(GIUÿˆâ«ï¯ï7 º?æ3§Õiµµ™|ä?÷öý"2·æn͵`î*ð ߀*5ì†9µMå©<”Ú¨ŠTÑüJ¡¬Êª¬À/(¦8æÇ®î«û(µH÷ë~æÌ5‚QüÊ­µ[kM‚ïÅm¥ˆÈÏZ´}bûÄŸž,OÌý €-?Ü?yÿ$pA¸6\ër…\!x¼Þ0&Œ c"ŽÐqŽs<.ÿÖ\Ê\ x/üðìÏ0Æ#ø0Ñ8Ñܲ]µ]õ'˜|Di""­—a¾G‡™CL1eänÞðêšW×@ú_ÒϤŸAUÞªtWºÁ{È{È{J—.= v«Ýj·BÕÁªƒUA¹•[¹c„fKfKfKà—R* ý¢Ýmw£ª~_QWQL¹P3P3¤EøXŒ"‘Ÿw‹”Ê"Ý=ßõ|§9Â7ÂáF y:=žFÑÆÖmÛ(R«jU­Ñëô:½N$ ô€.r³áfÃÍ—Ïåsùdþ9å8å8å™Ýá¯öW‹Š««D»Y7–5–%¡3ƒï ¼£9DœÃÎaýX„%á³´siç^Γ_e˜ý¡ÈoŒ²œ²­í|óÅÞ‹½’ì\ëÌsæ‰ôr^§´m†5Z×3…Ïj2ªïß#?ùÞç¼ÏIF¯£wYï2‘Í7m1–Ëå"{+÷Vî­é õ„zB"–k–k–k"©Y©Y©Y1b%ÇJŽ•é+î+î+±Ü¶\·\±ýÚvÙvY~IÌNÌ– Íf}Ëúk,êïúN}§vC$±7±Wd¤tdrdR2¶ÏlÿjûW"Éà à "AwÐt‹x¶x¶x¶ˆôìêÙÕ³K¤àBÁ…‚ "K.]¸t¡ÈÚ+k¯¬½"rºùtóéf‘K“—&/MŠœßw~ßù}"åo¼!²xjñ—‹¿Ù´Sú¦tÉñUø*D,™Œ0¢ÝšDD®×sÁõ©ëÓùÃ_ýç”w;ßí$¸îƺ‘u#pâቇ'Æ~ê¦ò¦ò¦rp¬t¬t¬„üü|˜}<ûxö1”­.[]¶¦r§r§r¡ÅÙâlq‚£ÈñŠãø|kw ;@Ðì§Îv´w´ÿŠð‰ÊEëe¨©®©>ž¥×éu1™â.·¹ lcÛ>|qòÐN;í@9äÄùd¸ÑÃy¼ö°'ì²çOekM+0á#ŒEu Û˜mÌŸÀß&6Llý`Dgô?†ºB]Œ—Œ··h¦tŸîÓ} ¯ÐWè+À8b1ŽýôÓF’‘d$ûØÍnÐCÆJc%è«B ¡ÆïæulýÄz l·ûxÕ±ÿQ~*R*RUæ'ú>`ì4v27ÿÅŠ! ȞĭBG|xñš8(T´>h♓¥"¹"ùÿ*tVâ¬rVÅÍJö/Û¿l  h¤‘TûÃ~}‡¾ƒ ¨a5 €†1ÛŒ›ùf½‰gâ›ýÌþó³ò©½]<µ÷±§óûo'p¢ùcå|cIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-8.4.png 644 233 144 2601 14774263776 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü6IDATHÇÍ–kHÔYÆš¥àd¶M—­ˆmZ T’Šü+Š ¦k’>hFÙ-X£E¶Â ÚJ¶Öú’"ë’šÕ¶ ­k²Bµ;-tOR›Ü5gæüÏù퇙33Õ¶Ÿ;_†÷ržç™÷=çýB!¦…~ÄÎ;5hÇVDü y yŽ– }Æ‚˜u1ënɧ’O¤4¤4¨»ÛÄM~ô~!"øÑ|Æ/¦‰ˆcJÛ”¶˜ì]Ò7¤'؃öw×!Ñ•èúG¶ömí/4R ƒ=ƒ=£Ù£Ù±MÜä›ý/_Ô¼Å/ÄwÆwÆ<€)“§Lä.È]øE0ᯅPTPTð$îIœŽkH"IgcŒaÖH”mâ¡|³ßà|ÃgøƒzÌX=cµàÜäÜ”XÜp· Y5·j®á ¸8Í>ö‘¤{zé•^| oëÛ€ÔJ+@ê.Ý`í´vâã¨l•­À$Ê(#)Œgü_˜?¨G¼ÙÛc9L”ˆô+Ë[òèù²Wö´þHÇëx •TRywýA/½ wj—v¡A¯Ñk`Y7¬Qø”$”$Çr¢Z)„K¾‡ÄÁÄÁ±Ià¶Üð3ù [t ãþë~ßCECyCy ÓeºLr…+\†fðãǾ/};|;Àû©×éuèfÝÌ8=!|åö»ýáê ;ó lß¿}?è*`F»GïÞG¾*)ÙŽÙŽÙp.q.q.×¥¯K_—FôÉUr•\±«ÓªÓªÓ ÷UîpîpØ­Õ·þ½þ½À=Ãä7zBÂú¾‚Vo«‚eÖå!_Ç'³:fÁ"×"×" lØ2°uŽ:G\Zzi饥ïvòªûªûª;rP œÎg$®~ ärðñ»á ò=¦^›zM·ÁàòÁå {“à…ãÅ !5-5-5 ’k’k’k`Ù®e»–í‚çíÏÛŸ·Gò=ÙžlO6ä%ç%ç%ÃæC›m>…é…é…Q­·îÊzYºÇ€á7z¤ØRlêŒ<y VNøÚP÷¸îqÝcÈÚšµ5kk8£,£,£ jËkËkË#þ#G*ŽT@\m\m\-döeöeöAÂDÂDÂt”t”t”DU®ÚðùžX!ÔEu1掲X !N !„˜ºbNÑœµsÖ ñèæ£›n q~æù™çg 1úrôåèK!lv›Ýf¢¹²¹²¹RˆÌ¬Ì¬Ì,!εžk=×*„£ÛÑíèÂî´;íN!O_œ²8E„WŒ4|!~£çí3FW¨çŸÉûò>>óÏNöŸì?Ù+3Vf¬Ì€Æ¡Æ¡Æ!ð4x< àÜèÜèÜϦ?›þlz¤"—O\>qù°°°EUª)ÈÅdøÏ3öæ­Ä2·Ä–ŽÒB š?é§?êðyñâÎr–³·Î×ù:d—ì’] :U§ê~à8ÇA®wëÝh°–ÿß[5ǤÛç׉|úTªJeÜúɺgÝkŸµÇÚj…Z¡VÅS Ê®ìÊä £„vè6ÝêkÕ¤šT­ªeœ‰¾vK·|üáI ÁÉlu[ݪL•5W€F¡¢*¨°‚UG"(ÿoµ^­'VÕÿÞÉÿžo%Uóªæ…\Àa“rLŽX¥V)>Ð×õubˆˆmâ&ßì7xÿ½ßÊöuñÁ¾Ç>Ìì¿^Sð½™ úIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.0.png 644 233 144 3130 14774263776 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–mL”WÇÏ 3 £³R tµÉnW'Lœ ¤¤¶i4¾„fL“E’nj¢øAR LR㱦’¬E$KÊnKx±Ú”‰‘E>@WE£°‰†±4°„uxæyî¯f†µ›ýìùrs^îÿüŸçž{ΑWb«€u½u½uET·ŽÛ“ÞLz3㫨~AËËž»'!¹6¹`eãÊFã~\7ýfüÒý"qü¥ùL»¼"qƒãÇ7–˜î‡[lIZÕÏÜg»³}>v~Ø ÐÖÔÖÄŸ`üæøM€éÂéBˆë¦ßŒ7÷›xKñÅÿB~°_µ_µ<G¢#QÒ‹Ó‹7~ Ýï½óÞ;„@‚²€> ¸p©B DSþ³D7ý±xs¿‰gâ›ùÌüQ>))"°»dw‰³MDä~3_w| µs ?~\ ÛtðEd62KXÝ2N§jU­ªÔ]ux®—è%„!2™ê©£—ˆá]-ï.ï6 Þo¦u·m·ÍÙ`ò‘ÿ>Ûš7`ïÜÞ9Ph}êG9  ©Gh¬ÄŠ¥¶©jÇâŸBU©*UêG5¤†âv±“(c\¿¥ßBžðŒpŸ#{?Ûû™I°æ%G)"ò‡/Àr†B6~þðóEØ·çgæVÍ­â©V¯Õkõñ|Úfm³¶&Ý“îI7h~ͯù—:Å)NÅÕ…u o-¼ÁW'*&*xªÜQ|9>rwö;ûC6ÂQ>Âm‘ ½PVYV *ÀÈš>;Y=Y ¹çr[s[Q]ëjêjŠ'ò^÷^÷^‡äŠäŠä È?“&ÿ ð+94~hìÐ8[œíÎvÔÁ¼oßnz,®—¥—¥;¢|D=,‡¯G¿…ùTiÎQÏ*Ϫ(Ü5¸kpt´v´v´BF(#”/zråË=555q{ûãöÇíÁ½É½É½ &²'¶Llßù7flÌ |ek}¨Rø®þ»zÐmQ>VËÚß®øvk¶<ÈÏÌÏYöKCßßoÝǶÂm;·íOOOñæyó¼y"=C=C=C"Ýþn·_djdjdjD$kMÖš¬5²(µµµ"©Y©Y©Y"©ý©wROKÏKÏÇ¿ÿx»ávƒ¥A¤ø‡âD/»¶ìÚÖl«ü&Á—àÃ-÷ì§í§E伈ˆÆíéötû”}Æ>#ÙÙÙ/âHs¤9ÒDj=µžZÈ û û »È¥þKý—úEв‹²‹²ãÄE"îˆ;âŽÛµ-WËI*Iº–tM‚"ö1û˜ˆeEÂÁ„ƒ¸­‚qÙ¸l¹'šæÕ¼"–WED$ÅxvòÙ'Ï>qu»º]Ý"}‡û÷9»üìò³ËE|¾N_§ÈXïXïX¯È@` 0i\ݸºqµHfZfZfšH 'Èñoò¿æMd¢o¢i¢I¤ðqáÉ“’"2ž ‹Xæi¡År/v+ËùgKWKðn´Æb%.ï.¿\~†‹†‹†‹ Wz¥W 8¯8¯8¼‰ÞDo"xl›Ç͕͕͕à«òUùª X¬ ÖAÛ†¶ m`û“í#ÛGàÊlçùÎó„cͦ”ß¶¸Z\À¿¢|bÄ.ôBÙ§eŸ.¹%DB‘xq+ lÂü_ ¿W@À_i¤q ÞÅȃÈ`³™¯ì˲/ÙØ­\ìcÊù“ó§ ã¡öP‹÷1ã€vE»ÂS~Ïö€ZP!½J¯Ò«@Ö‡õaЛô&½ T©*U¥`x áþÌ9Î±ÃøÈøô×ü ~ž_Åú˜1âq8G£!ófûUçßçØçXl£}ÌéßëߺññZì‹§ø™Ÿi¦˜¦bk˜ç<f  ó¥F) zÞ³Ÿ}Iû’þgçaVš³Ëœ•Äf[´—»âG¬ûtaP7Ô ,X ®›þÅ’ˆí7ñL|3Ÿ™qV¾´¯‹—ö=ör¾`O§¸ *®ÍÌIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-91-red.png 644 233 144 4200 14774263775 15613 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü5IDATXí—{LÔWÇÏï1<*,:åáÌn‰«®B°v‘%ÝD^q´Ñ”TL nqýc)ô,1J¥XÙBb Ö®V%È Mˆ’h5h´ÔÜhÍÚN£‘T65Nå1àÀ0¿ßï~÷æþæ[³Ù=ÿÀ¹÷žs>¿{¾÷Þ ÑŒÍ¦0-Ñöh{´]xˆ‹êŽêŽê.È’UY•Õ[ÿ ¥´”–3Ó¬‰d’Iæ>î³&¾žÇó|<x=ÑÎÊWEUT%v†Ï'.’»ån¹»sXØ!ìvè Æ1ã˜q çÖÝ[woÝ=`ý£õÖ?J¬%ÖkÐçó|=çùx~^ï×yHüs¸Ÿz@ÇÅñÁ¥|‡æUÌ«˜W¡¾s¸ïpßá>ö’ç©ç©ç) $x1 LÄ ÝÌóõ<žçãùÃë¥øu>2Å‹Câ84xž'°^µ^µ^Uþäô;}NœKgñ,ŠZ¯|¯|¨ËÔL5PmªMµê2u™º PëÕzµ`é,¥CáñN¿ÓïôÃÉóëÀaõMñ:šÐ)t Dò^y¯¼·ý;×”W—W§Øt°wÕ>µ¥Ý¿Ý¿`ƒ‰iÌÅ\Ъ´*Âm'p`ƒ,‘%J;{ƒ½°wÙj¶¾,¯)o_Þ>ÅÆësÎG†‡†‡†‡«þȘL»L»Ø|×󱃱 äñ¨Ÿ¨gÕ³ ~¤~À3v`ìø+üah•¨¶•mö{€g2k2 †W¯ÔO˜éÛëg×׌šL ¦6Ÿóè|ò6y›¼­/Ÿ8X~°ü`9ûk WéÔ›õšó5¾×-¯[€™c/7¼ÜÝ'»O†òú[ü-¡þÎ;ð^,¼U:}^ŸWw½¼¾¾³a|ÄÜÆ4cš1 MÃO<}Ì3ÿfË\Ë\H}œú¾-ý¶¶8·8 Æc€Q󨉎DÈîÏîý°7³ÞÌô¦›Õ ê†`½á‚á‚á€óp>ºoíþµû×î~™Ê{¼n¼ ¯^€#k¬ Ý©±©±©PÓ‰§ÀÕçê€-É[’ ٙ쀢ڢÚp·öªö* :ÕËêå`}ÎÃùÄÀ‘ZdÈ7äòõ3M•Úbm1Íÿ8þc"¢…Õ «‰ˆŽeË$"òÜðÜ ":±èDðö#¢uD%"Jµ¦Z‰ˆ¾øé‹ŸˆˆÒ“Ò“ˆˆ&œü1dy EQ§ct,XßÐeè2téGžW`eY­Y­Y­˜¦„)ÀiíŠv á­wø>0_7_€ÙQ³£ ¥%¥%tG]:t ϱ‚k×À²Ï²€/0|K#–ÁâY<_mccƒÎG¢M´‰6ÿ“À@ÓѪ£ÅG‹C$£ù4\Ýyu'ß͇7ÀTþT>Ü)¸S ÚóAÏÏ-ê+ê Xã­ñÁQõÔôƒéà™ð^n¾Ü|¹Y· B†áBR¦”)eÖ5òSfþy–y–šêÚp?í~šžÀÃr‹7o€”ê”jìÚç×>Û)Û)HKIK_—¯ Øv&´P-Tx-f‹Àj>®mÔ6Âç…×éuiuiuiušþH‰R¢”xh”âòãòãò‰ä+òùJÇ~á—äÞͽ«VëéjÜëÝëáƒ=çÜxù¦ÓŒpk×­]¡`þýþý!®§¸¥¸ÀhÑ@Ñ €`«+þYñUÅWšW¬”*¥Ê;¥3~¬›ÂmÞg† C†!c𨩯1ÖY®~Ìñ;ü0Àcò˜x”»Êݰ¯Â*ÀmÜÑ"Æ?ÿPË‡ÃÆ`«OŽŸý~¹ÈD&2@¸ \.üû·3ã¿·GtÆ‘÷…­þ*†‘¢)r]IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-53-red.png 644 233 144 4264 14774263775 15623 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜiIDATXí—kL”WÇŸ÷B@†U‹²®P*.Írs@„б)h*6€–t›xÚFÜ(•ËvI[ª¥«² £¦âJ³FŠÖKÉ·‹a7%Ö Cë 2ÃmßË?Ìœw.I5›Ýóeæ9ç¹üÞóüßsfˆÜ#‚üŸl ¶[¸IÏDØ í/´¿Ðž¿R”EY”{ÿL©”J©€{Y­'‘D™ øÛj=ógñ,Ëï_ÏôçñåÛI;i'ßæ¿ýk±]lÛÛF¹]Ü.n—¢ÓÛõv½[{ýíõ·Òû¥÷Kï%Y%Y%Y^›­3Ïò±ü¬Þ³yˆÿ¿½ð~œçÇSÙÅUÄUÄUÈ{š¯7_o¾®†:;; @À&0 ƒÄ  ÙžuæÏâY>–ß¿ÞÂOžÍG†p~˜æ‡/°YW³®f]•~;ðtÀ5àÂãa|444T¸œ9j µ†Z5Á:b=g=‡1!žœûGö8&çO΀‰ï&¾€ÉÂÉBP—«Ëá3ä5ò{±½œGGù°Ú®¶{Ò:b°`ŒÕg<Ÿ¸]Ü.nï9ĚʛʛÊÕ·< ¦¤6–ë|Äù.· C€ûõ€à…Á àaèÃPxÐÿ RZRZ|ü\á›Â7À‰ '6ÞüîzMåMùMùê[ÚÎúñ‘jÓ'é“ôI¨ÍÍÍuR„„xöÌÇ;Žw@ôÙè³pé›Kß@§¾Sg²ÏdûÖ,´ZÀ°Â°zù^¶El‹à9r@¼-Ò©I£ù#wGññÒ™™™´Wߥ¿¤¿DÓŠUÊ’²H¤^Çœî;Ýwˆˆ".G\&"úÑù£“ˆèÑÍG7‰ˆŠsŠs|_̸mqÛˆˆ>Œý0–ˆh™²L!"*¨-¨%¢9Ê]å.õŽ}1ö‘b%""Qßµ(jM3ÆçùĹ’Þ’Þ’^¯°äU33¾;´®t]©o«s¯æ^€Ðk¡×àÅ´Ó`tÏè߸ñyãóàåŸ_þÙ7þÕ¯ž0î)¸_n¼õK–•,+Y¦ÛçXëËV6®l\Ùˆ{NÎÉ99gÔzµ*¶²Ö߈½ Ý?uÿä 2P9Pé ÐRÙRé»>1gb´Üi¹•5•5\³¿œý%€Þ>¾Ô÷QÁ¢²æfÍÍš‹{Œø"¾ˆ/zúˆ]uÇwsszÅ-Ïš˜sš9 €ëþáû‡}A¯9^Üw ÔEÖE@ibi"t­íZëã.9ÒéÞ“O7G5Gyë]nèìéìÑvò÷\ —Â¥<}D a…°b_{Ëâç̳¼ÐºÁºÀºÀK£æ&U%U@òºäuÔΰÎ0¨~©ú%˜=5{ únõÝ€ôùéó õÍÔ7àBá…BSÕñÕñ^š„&øþóï?‡kÊS(iß’‘%#ŠvÑB´}tŒÂòÂòÂòˆÄ+âñJë°và—äÌ=(ïf¤ŠéVß­>¸`IOOO0ÅZ°(a|UõU•ïNÿýC6$—'—pxüÇ"m‘6@9j>k>ëmuÅ?Ê?(ÿ@™Ò«„*¡êßÝvˆ-à û4(%(%(eð 0Õ˜bM±j®Ö¹¹’E²@kk8frfr|Õ7Ô7“˜àR ”°Ù‡¹Üùµóko«OŽŸ¬=Y‹W´+´Ž¯ãëœù\,ËÅþ¦9Pø§v¥næ6s›WáZ¹“ÜI¦e›¥Ëe‰‚EÓîn%BqŸ çq€KéUz}yÕp5Ô·Õ·5WmU[½RnÖ ë€øY†nC·´]ÛÉÂûÂû&£†VDET$¼¬Ù”MÙâj£6j#l‚M°í9¯]­G >–tÖ÷¬»­»½Õ\e«²ÕOñ‹±P7*J\ÌmÓMßnúVÞ­Ý@â¸8n9³#fGÌ"ÞÈy#wÚCWÎ0g{>7 ÷„{Â=®#¡:¡:¡š(¨"¨"¨ÂrPÓn¶1Û˜í«]Ť˜à‚X<Á<ñrˉr¢œèÕbczczcºš«Ýåº ]nØéùµ4Ë¿ÓÜÅ€Ö`^ó· ³ÜÚµžöÑn©ÆG»:I'é¼@ÊCå¡òЫÅ~ô£°„ô‡ô‡ô«ë5M†ña|Øëâ§|Áôì ¡1@»ë¹V®•kõÓn—¥Ë«]©Kê’º4@×tÌtÌt °Ô¾Ô¾Ô./Ö´xJ8%œúS“šGz€sè9ÃëÀü’v †Igmµ¶Z[¸à‚ vFjê0u˜:¼ÇŽxD<"é÷ü% ù{@]Ï<…>0p°€×=Úýë/i7gmÎÚœµ^íZ2,– üŽ®jàʸ2®lÕ>ÿ2ü“€ºý—ãyÚÍê„:¡n0—Õ–Õ–ÕªLžIžIž‘þ¥µÚ&Ø›)ŽÌd&3yŽÁP/˜þǨ݃þvÎ]n ·…ÛÐjZM«•%ü<~?àˆ#Ž.]‹ŸŠŸŠŸ"z„¡‡ëôn èÜÿmè´oy”GyâMÿå÷Êy•Wyà.r¹‹~åž_d èÌ@@Þç¶ú?F‘r‘2²’¦IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-17.5.png 644 233 144 3040 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÕIDATHÇÍ–ýOTgÇÏPèy)4k¤K(šØIÊ’týavk¶Ýšº6Ô–"­Ñ¨í’Ù¦˜­Í„­%qâ+‹6i}ÙŠ©Y¦B+tC7:HVÒ¬û2È@겊Df:¸ àνÏg˜¹sgñðürs^žï÷Üç<ç<€ˆˆäÄ¿)O¤<‘²2¦§¼iÙW¼°â…’ó1½]Û˶—ÿy²[³[r?ÍýÔ±tÓoÆ'¯±ð“ùL»äˆe°_´_´mŠë ðÚÓ¯=½¢ ¦ÿ¡Ò½éÞûQxëÒ[—:Ïtžám˜œ˜Ù4³ ,Ýô›ñæz/_–ñ‹@ÚWi_Ùþ öGíŠ@ÑóEÏ?ùN,`üIxiËK[n?rû•zÈ$Sm"D0%”¤›þx¼¹ÞÄ3ñM>“?–@þ³ùÏŠ@åöÊí韠‰ˆŒüÞ+|¯ø9€æå2í´“IOô£èG üÑg¢Ï°¨"Æ—Æ— FQcp« j€^§×±H0ŒAiœä$™êf Oiûó÷çý&_¥¯Ò—þ ääY5=¯Ì½2êͧÆxŸ÷Ôê 4æ˜d…%êÿ´å²À (¢´Ñ†Rh:5T½[õ®¹ƒÇžK*¥ˆÈºãIDRùk )Д€}ñþg‘¡Èóz©^ª—‚V­UkÕl6 Ôj µÂÌäÌäÌ$,¸Ü ¿Sߨo`öW³žYÜýóæ;ÍÌ;W¨êÖ¨=P{ ºÝî€eŸÞ;½wz/Tº*]•.˜.˜.˜.€¦ê¦ê¦jXÿŸõ7Ö߀ϊÎôŸéO:cÕ›;6}æ#Ñ•‡j™ðFD#QëL)`‘EÀÀÀHªÕ0à SL1µlº)à:×¹,±”äýKT‹jÀ“¯¶±¶˜webŽ©ô;éw"©- YsÌØ£}«}˼š$›l‹×¸`\0.€Ú¥v©]I à'ÀÈ7ò|àTPz~W¿ ú¾%ï’—ycC ŸŒ9Æéãéã‘T‚æ{`ò¿jÕž4™ïë½z/ ;Œh‰?Ž& ,²ÀBRb::ð_B„â{ eì6v£± ÷é}Iø ¾&ÿ²»’ewe À xði•XCƒEPýª6°tÓŸ8ñõ&ž‰Ÿ¸+ãü±|æ×ÅCû{8_°ÿ'›V+:‘«IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-24.0.png 644 233 144 3170 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü-IDATHÇÍ–ýOTWÇŸK¡0Ö— !),B\!h"C’’–ˆ@[ZÝJÖ¦ØJâRÓHmâî‚¥ÙªÔd[D]ÀP,ü ÖP‚V ¥âþ°ºvb`Ùµƒ¡‚/¼:Ì˽ç³?Ì\fvÝ?ÀóËÍ÷yù>Ï9÷œï9""²ÚÿIIù…‡¼°GlØžÜáÃ'tÐ^Ó^ûÇAXõŪ/Öœ^sÚ `ÓoÆç‹øƒë™vY-CøÙð³Z®×Á›Þر·‚¥ËÒµä…÷οwÀÖfkã·0õÃÔråB›~3ÞÌ7ù‚ù¥îê‹@XOXöo6üYHÌKÌKzß0ž¯¾R0ùÌä3*ô Š(• ,°€9îaÓï7óM>“߬gÖ÷õ#óBÌ "4½:ûꬥ՗0z†SUmUm ®xºøÍ4Þï €^¥Wáâˆ*RE@˜ SaÊ®ìÀ²^¢—àï#ï# ™Sœ"JýÕÏ×Su±ê¢Ùàè·‡ZZÍ~ä¿ÿmÃKlØ™³3T*€g00@ýÞ(3Êð¨©5€2—H•©·Ô[Æ2NœAø} (@SúUý*à.wÁpùù÷ï¬ßYo6ØðRЯùÕŸè·|iùr!ÆSÆSÀók fRþôçOyìùÐÓîi*ØG}àÚïÚïÚs)s)s)Aþh@w¼;ß~9ýÑôG~««¦,×,×Bqùúe91ûŽì;óN#½è/ùíùí°êƒU «P9gsÎäœ{s÷æîÍ ˜?0`òæóæóævc¯±×ØÀ{¦ö8ö8ÀÒié²t¡~óý›ao†­D§s¥"±"ØæëG¼Ï‰ˆü­ ú£û£¡íwÝEÝEª|CLror/.35ópæáÌÃÐ’Ú’Ú’ 7&nLܘl„ÂâÂâÂbžݕݕݕ¶1mcÚF˜¶NošÞ)uIÉIɸ¾ÎfU½Í½Í ‡úú ‰žˆžÈ°Šdg‹ä_ÍÖ²5­õÒÈ•WHøÀ±Ï>Yܱ¸cq‡H¬5Ök©ÏªÏªÏÙýp÷ÃÝE4§æÔœòÄp¬u¬u¬‰MMM‰½ûcì" q‰Ù‰ÙþÏwn¶ÞlÕZEòòDpE^м”al«/®¾hØyý¾õ¾5pì?´Ô,Ö,Âæ‘Í#›G`´v´v´ï4Þi¼šCsh°Y‡¬C±±± ¶ã¶ã¶ãkJhJhJ€ìúìúìú€=Û¶íä¶“pb¦µ¤µ„û€+è‘ÑqÑq†=ĸéýØû±f[äTä”H÷ÍoÆ¿—˜ÃËG£F‹” –}WöÈ-ç-ç-§ÈºÎuë:EºjºjºjD’*“*“*EâªãªãªEâKãKãKEZ¶´liÙ"’Q›Q›Q+2™5™5™%R·±nCÝ‘éáé¶é6‘Ü;¹sJŒÈ¬kÖ%¢-ÑI§fýsu¿Ýý6ôÚG¾ùJ•oßý¢ëE®‚5áá——}C}C}C™_p\p\pÀ!÷!÷!7¸Ü î(j*j*j‚ÙòÙòÙr°­·­·­‡­w·Žmƒ¯çÏ~þss«ržëŒêŒþîëÇ/'† "¿"?è” ÷é}À“߬gÖ_¹+ŸÚ×ÅSû{:_°ÿ*vüH†„,éIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-19.2.png 644 233 144 3150 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïO”WÇÏ ¿K`Y—Ykmj%Q-‚ im„6T¡VÓÀ6m·áštcÕ}¡$%.ìHe1akej êj"],LC°`¢É"»†‰B¨`·­a(à –áá¹÷³/f†µûxß<ùžsî÷|ï9yν""’þ ØÓìiö%!lÿ}ľèÕE¯®<Âõ&ض۶ß:Î:g@¢;Ñ­¼lù­ø…ûE"ü óYvIˆ!îRÜ%Ûæ0®€·Ö¼µfѯCøÏÝàhq´LÏÁ{—ß» Ð|¶ù,åðCï½›'6C[~+ÞÚoñ-ä—ŠGò‹@L[L›í.ÄÅÆÅŠÀòüåùÏì =E¯½ð]ÔwQÚæO¼Þ øñc-ßlùÃñÖ~‹Ïâ·òYùCz’_N~YÞ(y£ÄÑ€!"âm„–}° È0ZøŒ *ˆ3ÆŒNÎMÎMÔ7U­ªšu‹nÐýºš%f A˜›˜›Nñ)Ÿ¯»Â|•\\–@o#ŸŠŽHÞ’¼%ÒÓð×µvv@ï0zô¿yŸ÷ô¨Å Fÿ¬Fë$ý”~j¾Rè(¥£€òÉØùèZoPÉ*P(ЇÃü÷ÞœysÆèÚ² •""ÏׂÃïðû£¹~§æNÍV™P^Z^ êzHèÛ""ÿ<‡.ÁôMýNÎ^Hz!‰ U׾¾¾Bhô5ú}½>{}öúˆ€ŒÉŒÉŒIhò6y›¼»{“{“{¬J]•º*5bÏÝŸíÌv¬©9»ëì.ýt$u$Á\lHÝ–ºäË%_®Û(·ó2ò2DŸ±5ôü­·¯·Oâ²b³b²bD¦R¦R¦RDÒ$MÒDä¾Ü—û"rþàùƒçŠŒ8Gœ#N‘©þ©þ©~™_ããã"žaϰgX¤³¢óXç1‘Ÿ®Mø&|—õ«çŠž+²5ˆä$ä$ˆØ³ž>\·Q ñÉÄ'Õ÷ÕújA«ù߀œ97rn@ëŠÖ­+"'>R}¤úH5”Þ+½Wz{{{À=îwó‹uØqØqØY•Y•Y•Лü ßDÜ>ý»±—Æ^‰¶D›ˆT«jµ ˆa,3–Iºí·""’,ÿ 8Øl6‹ÄÇÇ‹x£¼QÞ(‘¶Õm«ÛV‹”w•w•w‰ô¹ú\}.‘µ'מ\{Räœýœýœ]D¹”K¹DªòªòªòDNüõDý‰z‘»î‘é‘i‘¤5©_§~-ÉÏßr~îü\„rs‡¹Ã6`›ÿÿ+7¯ËŠîo»¿‘u""¼îÄlÁ? .\IMMIWé*]‰”î)ÝSºG¤~yýòúå"uûêöÕíYéXéXéiohohoQ{Õ^µWd›g›g›G¤³·ÓÓéqí­z±êE™½û‰o·o7ïŠ\K¹–"¢o¼ïÍëáqQÊŽ–µ*«2aÎ?çB­ÕóE`„FôÊ7I&™ ì3Ì0ó?]d f»Ù¾0_Ùke¯Yó¬þjdŽiÇ÷ŽïýѨ;Æ#2ÇÔnÃcxx¨ƒ<˳vsÀ0ÀL7ÓÍtPÕªZU-´ÐjƒÚ 6€Þ® u!˜æ9æ­Ù‰Ù šÇCüºk0k0 À1èôGÓlͱ_Lþq;ãæÇbÓá“j—Ú…%Y£™e>R…‰ <`œq ŽÿI©" &̯̯€ñ0ÿìNÛNÛÿüÜ•ÖÝeÝ•!-@%•ÄÏ·ómóm‚ »u76lÁ–ߊ·ö[|¿•ÏÊÒó8¿.Û÷Øãù‚ý/ß°ãö¹ IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-145.png 644 233 144 3010 14774263775 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–mL•çǯsj…'CÑzfrFÒi5«RGæhC€@lZD‰mF€nû3ºHZ>Tã4YjBf„«¦bJÊ ¦“:•B2XÚ1<â$9áÈË<½öhíQçT&ö±mfa ê®~W,»ÏXV#ËÖ»–ÏòšW³j–U¦zU¯ê«ÕjµZûÜç>˜§LŸé³ÑüÄü¬_èíz;Ëü3ÞÇÖN¬L-¨Wõ1»Ñ¶í…òäòäÄÎl™CÀ’UaU Çz¿‚øï¨­°Â °¿+ ŒX&(žZ•V%:˜ƒæà:ŒoUçÿ?w%/5¾è>äCRœ%6«Ì*" Ô.\àøv<¾%bõ6žoóÙüñ»ò™}]<³ï±góû_©ç¥ßëIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-174.png 644 233 144 2676 14774263775 15001 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜsIDATHÇÍ–lSUÇoëæZÜÐ ‹§K”d‹Š!YÈ$ücFc‹˜þ!ÃÆü³¦’EI¦!‘8d¦$‹‰È¥È&Ê‚ ¤YÚ´Ä 3œscÚmÝpÝ{ïÞôݾ‡Æÿ¹ÿ´çÜ{¾ßoÎ=ç¼+@!Äcö¯ï3Þg¼Ës¶·Íñû^ñ½òü™œÝc§ÙÓ|ý]x4òh ôóÒÏå ÇÖûú¼;^ßͧýâ1á8ŠÎól±íNx}õë«}e9û£8øûýý &ì¿°ÿ@_o_/oÃDj"Þ’ÞŽ­÷õy¯ñÜø¢ó_üB@á@á€çW(z¸èa! b[ŶçæÜ~~{è·‡”¬»@1Åj !ƒ^Ó.[ïÛçu¼ÆÓøšOóçôX¹yåf! é¦7ü§r7¾À =zZóý¬ãMÞ¤˜KææÀ%ËoùɪaÙ#{@e伜uK~*?ÚÍëæu²`XÀQ>àŠ•Æ#ôDè ÀÔ|M¦€ÿ”Öã\¥Bˆ®:ˆ€È Jª°yØ< jÔºiÝİ7óüÎïüw),,—}“Pê-ùª|è¦rgŒ$Êe:ƒ]u®«BˆªOÀ?éŸÌÀÈüÈ<ð=ÛA ©!î-|¹XH€õ²õ‚õ»ÝÆn¸Ûy·ón'LG¦#ÓH¦GÓ£°Z -†}Ùšì¾ì>˜]õ×û½Ï=Û½ÔHb$Xþqÿx¦@ë±…õ$ø#¸?¸_ÃÈ5j£±ÆXéãé¯Ò_¡jêk6×l†di²4Y ɫɫɫPr¨äPÉ!¨j¯j¯j‡Âxa¼0Ý£Ý£Ý£Ž°ððíðmØ6[ÿHý#¨<Óá?[ƒ­:s= [Øí¼-–çïcߟsÏ}Lv]xÝuœÞ½rúÊé+§¹“s'çNB¢%Ñ’hòÚòÚòZ˜õÍúf}¿¿¿åÄ745Ô7Ô;‰”Ÿåøø):ÔÂ~l°|pù :ÇüDåD%pÖv@VËj°ž²ž´ž„µ+Ö®X»ú3ý™~§ ókï½wöÞȲȲÈ2`’I&aëØÖ±­cÐz¬õXë1رzÇK;^râ¬ëöŸ?'*&*@ëPZRZ"‡az|z8—k{¥ä”œrjõáÚ0ôíìÛÙ·Óñ]º6t *ÎWœ¯8ïøO¬?±þÄzðöz{½½P“ªIÕ¤À·è[ô-Â7 /ltÆŒüpêàÔAÐz¼BÈoå·žaÙh6 ! !„+=ÏŠ%±$òk©c©c©Ccƒ±ÁØàøÏ ž<3(Ducucu£ãßÙÙ":‰Î±ªkUת.!ÊšÊv•í¢òñÊte:|¥çžYgÖ áèÑ5Ft6: $í;ßiΘ3dóÅÛn ·AÊJY)×8èv;‚pqüâøÅqÇoVš•f¥c_Ž]Ž]ŽÁ‘’#G \5vÊæËF§¢S÷՘ݕß ¾çt%˜Ó©%d™€D"]vŒ1×8kV̘ͪ3c dŸìNò5_£ÔkF½Qïâû;ØlÿOWV}þ ÿD¦5bŒ`“n’!îÉ}ò¸<j\ý¢~qé;+Ïʳ ÚT›js µ‹?/ô’Sc ß1†a×[YY”ÍÿÓƒ¶«¾€OÃI°’VX-²Þý ì ŸaŽ9;ŸîŒÂK®Œ/É=róÖwÖwnü@Q Hgê¾Éÿ?ßJBå¡ü\3ú£¥Ø¹bkµ‡,¨¸ŠàÁŽ­÷ó%aÇk<¯ù4þ[ùÀ¾.Ø÷؃ù‚ýï \¦ŠOE?IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-93-grey.png 644 233 144 6254 14774263775 16024 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü aIDATXÃ…—kPTW¶ÇÿûœÓïc±$t <. ‚^%y()$†‰·31A)R¶7cˆ–Ñ ½0B Ñ)*aÂH ІBdFËcn« ͳ4!`óê¦OŸ>û~ Vy+•õ¥kŸ>û¿~{¯uÖÚ›äæææææÂ‹fYüaâ¸An¤Í¹U¹U¹UÔ'<<|k]N—Óåý·à+ø ¾Ñ{íöF{#ýå(G9ÉA0‚  ½è°{±—~¨HS¤)ÒH÷÷÷Ó¿ËÉò€<øóÉ<ï<ï<ï¶;Ä,BIYä»\\ÌàFlÄF¦FÌóÅ|±‹ŸççùùÇcò›ò›ò›j†y3oæÍ­×¬QÖ(kTôŸ4Ç5Ç5Çq1zKô–è-$gll ˆñŒñŒñ¤±ô¿ô¾4_Ò[Òwù“üK<çÚÁMÔºQ71ì!{Èž€ãlÀ\ª˜¯ž¯ž¯~ÂÓ«Õ«Õ«ÕyxKï–Þ-½Œ#Ün 7’TEŽ"G‘+ÞÁ;xjXa…@&2‘ `%Vb%¬öUöUöUH5v;ÔÑÜÜ,žLžLžL~¥D PÄ*{œ{œ{’ŽS=ÕSý`:³‰]8ºpt@':ѹj×È5ru¼·ñ¶'¶i7k7k7 uYº,]Wã1ë1ë1 -8pà ˆCâ8ŽD‘(@ 5ÔL`q'qB€"8Ë2Ë2Ë2 œ-;[v¶LH¸÷}ø¤¯MÓ¦iÓ„TÉ¿Ä#ñ1œ0'Ì¥Äðßðßðßd¬õzÁë¯h ®]×®k礙7¼á 7âF܈`¶GÛ£±B¬+¢#:¢ðÞÀæ1yˆ@`w·»ÛÝçjçjçj€ ‘!27I_W­«ÖUs5^:/—ŽJ<Gƒi0 ~o‡CãÐ84@±„c ǰţţţr—Úâeñ²xuEuEuEÀXíXíX- ¹¤¹¤¹¤ÉÒdi2 ÔêuSUSUSU@ÝguŸÕ}˜³ÌYæ,@%’G©‰©‰©‰ÀZ¬ÅZÀÍ£Ö£Ö£ք؄؄Xl9ûñÙÏ~ ÈVÉVÉV½·ƒ…@!ð?_[þËò_–ÿ‚#–E,‹XF .@ g¢ÏDŸ‰lõ¶z[=°wÇÞ{w!†CˆøúͯßüúM@à^àÆÛ·oÓ%Ó%Ó%Àë»_ßýún`Í»kÞ]ó.p.â\ĹÀºÃºÃºCòyxYxYx1H<cŸ²OÙ§ð7ÿ"ÿ"ÿ"ä¨Î¨Î¨ÎÀêšÈ-¸-¸-¸Ãü0?Ì wî$ÜV‡®] ¤T¦T¦T> ñí¶Ûm·Û¿ïý¾÷ûØv`ÛmŸc>Ç|ŽAãAãAã7ËÍr³€m»m»mû(§^«^«^ «Ä#ñ1øàÌœfN3§—&(Ä1qL”3Êå °¢fEÍŠàzÇõŽëÃÇð1ÀÍÄ›‰7«ÕjµZ~¿‰ß$·&·&·ÁŠ`E°(çËùr¨ð¬ð¬ð‚r‚r‚r/½—ÞKÐ tÝðÐ?³‹ÙÅìð¾À$˜a}Y_Ö—ÖϬŸY?³ýÂ[Â[Â[`‰Øˆ Tš™þ]úwéßsIsIsIÀ'ÆOŒŸ®·»Þîz‰2Q&HA R–‚©d*™J`~~xzüéñ§Ç˜˜ÀÜbn1·ä¹F®-ùcçoÎßœ¿‰~FËh-­g”EÊ"e‘PÚïÝïÝïMëoß*¾U 'É“äIب…Z¨˜Ÿ˜Ÿ˜ŸÒ»Ò»Ò»€ì’ì’ì csÆæŒÍ€ÂWá«ðTɪdU2PVVŒ*G•£J ª*ª*ª HOO¬Û­Û­ÛÁàÁàÁà¥uÙLëMëMëÓ}Ó}Ó}|¬ìWö+û…R:è Ë+çr¹\.—ä´{·{·{;µS»¦vM킚xâ™Ëï_~ÿòû@ElElE,0Þ9Þ9Þ \H½z!ðPy¨_lrƧçç£ðˆÇ>Ç>qÿ+â+â+"^^^Œ4±Gì{ fB˜&v!GÈr ( * * r>eÞ`Þ`ÞÀÞSF*#•‘¥±‹Íá«¢A4ˆî„+²¤ˆ`FÚQ¸Ø—B pZ¼óp'?ŠŽo˜&I8Ü=ôÐ3mr49šÂ>ËIËIËI¨†aÓÒN´ÙÚlm6Ñ:j5ŒØ{Ê#Ê#Ê#w.ÚïÛïÛï)¹÷ì½gï= ¸µR=•—:±G^P»þåÊÝóÿ/w}ø>ðå,grÏäžÉuÂSx OÁÝèiô4zâïÝÝÝ$]Ý£îQ÷¢VÔŠÚý]ÜËÜËÜ˶§×® \ÇHø9©C=ÊÅâWl±@p TNåTN^7‡šCÍ¡¨\<_Š@Eàýõ礟“~NòQIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-81-grey.png 644 233 144 6124 14774263775 16015 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—PS×¶Ç¿{Ÿ“„$}àVÄ¢H&ä!cùQ¹ ?¤ƒT´ÏxGÁ2Ì@‹J¯:ú®Ÿ/ÌhµÏ^¬¥vì«Zx^- ¥8¡ZÅçxmtÀB+? ˜ääì÷9رÓéúgÏÞ眵>{íµÖY›”–––––Bƒ9™šh"?Àð¬­ô\é¹ÒslaÙXÙXÙØêæË|™ïÑw„@!PŒ~ÛÑìhv4³#¨A jH1†0}èC€·ñ6ÞfGëëëH1ÿÿÿÓ2I&Éä¾êƒ´ß/Ï-Ï-Ï%£Bˆ"„Œ9ñ†‡KCçãxZ'–‰eb™xÃ9ëœuÎ.ˆ)k)k)k©rŽ:G£ÆÙVØVØVDÿM}B}B}­ÑiÑiÑi¤8V+‹•1~1~1~€4—žKïKßKúæõ{ìIö%‰÷x0y3oæ-æ|’OòCNp!\råôlílílíR?£¿ÑßèÞ“Ö—Ö—ÖG]‘=‘=‘=$SQ¬(VÆýØýPÁlò‡<‹°‹`s9‚AÈìéèéèé`®oþ û6LÜ3ž>ž>žžýUˆ*Dòg/w¾;ߟz‚°V0C@@@HÉÓ’§%Ot AÿÆ7óÍ|sÇ?v§Ýi_ºFûšö5íkB¼¡ÈPd(âë4ÓšiÍ4´Añ®xW¼ ž$‘$’ÀÞð0iLx/ãe€˜ˆ‰˜ à1ã1ø)ï)ï)oXê?­ÿ´þS!ÇrÝrÝr¿%WÊ•råà7Â:a°.i’„¤áiªìRv)»ÙBÙBÙÂÃ×lߨ¾±}³tv­v­v­Y[[ËßòYá³Âgþ$.‰‹¸à‚ <}HÒ‡*Q‰J€ 2q2NÆòùŒ|`³˜—ð^4³šYÍ,þ$é×nÔnÔn2%ûÄG…aF˜Éˆq69›œM¹¯øü þ¦34 ¼#Vè ƒÞÁFÇÇÇ@ð|€ä’àîà€HD"@ŠP¼À <`ßnßnß Á†·¤ßPk¨5Ôòu’}‰Gâ£,Œ…±°¿ÿ‡KïÒ»ô@rwrwr7Ò4g4g4g ÷(òž^3½fz pzçé§w‡Ê•*ŽØŽØŽØ€;•w*ïTˆA b1SÌ3ÜÄMÜ®%^K¼–\L¾˜|1€X÷N÷N÷NxkÎjÎjÎB.Ù—x$>*è {µÐ÷±ïcßÇ8²=>=> Ô¤Ö¤Ö¤—£.G]ލŽê¨óB›hmšŸÊ—ë—ë—ëI•Ä#ññŽ Ç„cŸGdDdDd XySySy6w“»ÉÝ€™s3çfΚHM¤&’Ƀä€#Ï‘çÈn|~ãóŸ¶'¶'¶'Q5QšM€˜Z<µxj1ÀXKÐ~ôØØ°–ÃrÀ+ë”uÊ:Ø‚W¯ ^…âî‰î‰î ¥8„C8DÂèz^˜ß™Dà³§|œòqÊÇ€eØ2lŽ <œZ{jí©µ@¸5Ünükükük¿~ý6Y Y Y À‚õ Ö/X8MN“ÓôL/$Ot£ÝÏìÓ-t ÝàNá £\ Ȳ‹Ö8kœ5ýBª*¤‚ãns·¹Û`Ò—·M·M·M@>H¤ÒÞM{7í]`UÔª¨UQÀ`ô`ô`40vrìäØI€&Ñ$šô+ B¢ KÉR²ôWëãÇø|ù’ìq³Ý³Ý³Ýè§Zª¥Zv‘z}èõ¡×‡BE@@»xïÕ{¯Þ{ÀvlÇvØí™öL{&й¿sç~ ÞoŠ7±%±%±%@†%Ã’alWmWmWS²)Ù”Œß¡„ `5Vcõ³u1_Ìó ÀnɲdY²óˆyÄ<‚ÿöê÷ê÷ê*x`€á` ŸÂ§ð)‡ÿ«ýö7ÚßpkµéÚtm:gñ5ú}°êîêîêîÂûúíë·¯ß|B|B|B€Á„Á„Áßá;|,^¼8ø· ¢FÔˆ@ÔŠZQû«dª§õ´áŠpE¸Õ׃_~=(ÆD ·ˆžè‰þô]xuáÕ…W?8 O–'Ë“k‡'Þšxkâ-ÎR_^_^_îÞ-•§ æ æ f8üöùíóÛœ©ûûìï³ñ—ÚÆÚÆÚF|­R)‡ž¦3ŽqŒ‹þ ÂŽð[)­¡5´†ë¢Çè1zld‡hM¢)ß©jWµ«ÚŽ7;Þìx“ý{OJOJO ΓjRMªa—‰2Q&\ÇÅì8;ÎŽØŒÍØü "Dˆ€Ü-wËÝó€ÖiÕ´jZUë­_´~!he&™Ifˆ•X‰õ€HV’•d僭¨@*ø N¯×ëõzv ©HE*ÿwZBKh‰e/M§é4Ýí~Ïýžû½ŒÝC† =#»"»"»èûÊre¹²Vv™]f—¡ ¤€üª)qÀ€A b`á,œ…ÃA"H‰€ºQlE÷îÆÆFþcUž*O•w¾<Ôj µþíÆóÆóÆóÈ?a†fQúQ5†0„!á>vav‘æˆK—".U¬÷*ô*ô*<_>é?é?éÏOÕûÕûÕû=‹]O7ä@zÐÀ;ìP@°el[F Ä@ PÜ4ß4ß4³”ÎÖÎÖÎV®B P ?uÖ9ëœu{?¸ðþÁûffff†ÇÎY Ôæ/ˆ/ˆ/ˆ/ÀçÞ£{î=œ»œ»œ»ö~ öUûª}.ôµôµôµpmÛ6¶md)¤ˆ‘"(Ä/Å/Å/Á „J€=aOØ`.{aÿÅü‹ù3ΣŒQÆ(ø¨GÕ£êQ@Œãĸ½Ì…ÞðSO(~âɵ )‰”~ž+‰Â3uxênŒ0ÂèÞMâI<‰OY?wå¸ÒèÚæÚæÚ&þ5[̳Ešy,òXä1¬{Å^±*NÃi8B±P,Cq2ôdèÉP÷Ë£+GWŽ®äzEyEyEUüy.iöÜ«Ä*±ŠÿÄs²;¤+/////‡Uò(< Žù#¸wÏÝyøOÈ r‚œ¸ÚD“i2MÞÓŒ €V¶¸Z\-.aÛTõTõT5T”RJ)žHžh··ÛÛí¢m¸j¸j¸Š{èuÀë€×û­ŽLjcäÀ?¾þðõ‡¯@©Âª$Àùzû|a~î•GÁÿyb·ñ7±88ÈO}UúUéW¥îÝžŽÞ§Ç¯Ç¯Çg:º:º:ºHŽªWÕ«ê• þ_oð›ùÍüfû*]¬.VK'<öÞðŒöç¹8üŽÌUži“39““í£ËF—.Ãî%î%î%ÿ:…N¡ÛPùsêÏ©?§ú]šz0õ`êûèÞÙ{gïu'̸f\3.n—,Q–(KüÏ VͪYõÿ¶Î%gÁ&0!.’NÀã(áy‚?߉Ý2´¡ m™5³f½‰6ÐÚðîiÖÓ¬§Yâ2Y•¬JVEp\WðíõІІІÕz³Él2›Èeq¸@\ÀN{ô¶xm¿ÇAñò\ìzÊ…ûà܃¿CrI.ɽÊÚXkÛ—§ V+ƒénˆâ†F‚Å£âQñè¶G½›z7õnæ!µÎRciÿ#ŽÿN˶õúc‘kIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-82.png 644 233 144 2601 14774263775 14703 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü6IDATHÇÍ–kHUYÇ×½i*”(ÖE…2$ö¦ù•ÑC,¹=Ì(’¡r"bŠž_’t¦¢ÚôÁš¦†P"é 6YÁ%é£1$i\0ê6™¦â#ï9ûìß|¸÷œs‹‰æc÷Ëe­µ×ÿÿ_kŸ½ö‘±‘oª7Õ›¶½ß¹þøìøìi—ÂöYžµžµÏØÓcNŒ«Wi=wm;n¯Îqñ£ùl¿Œ×w=îºgIÄ>27dÆ'‡íup#áÆ{¶ßÜ~ úBõ¾‡7oz—ô.×¶ãöz;߯‹Æ—#ñ‹@ìØ;ž72n¤L^>yùÔÝáMß*ß*€àˆàíÕŒb”^ 0€ý{eÛñÈz;߯³ñm>›?¬G )+)KÖl\³1¡"œð¼ N<80ŒÀYÎ2Š_ÌR³ôŸfº™Î0¿êÍz3Ó˜”ë<úsŠ9…a~4÷›ûÁÉwð"øŸÍÖ#îíOË`}üúxà£Ô¾R‡Õa ªWèh»Ez™^ª—‚ÎÑ9:ô6½Uou:ˆþA_ÕWѺYÍWó1ÀK€÷6~„Ïá—hA_—C›„71ЪZ•ƒ»¿•l%3d;Bu¡ÚP-tú:}>0ºŒ.£ËbL2&“ +£+£+Œ#F‘QäÆy`M´&:x+]>›?¬'"ììï°£xG±mÍÒA£Åhq ï­ï½×{rûsûsû!%-%-% ò ó ó ámùÛò·åàkóµùÚ ±*±*± žXxbá ènë~ÖýÌÅÓ †ßð»|.X7Ü·ù5"‹,>i£xæèwœç¼„lGý·õÛë·‹îîî‹øKý¥þR‘`Z0-˜&²/u_ê¾T‘Ž‹;.Šôôôˆ¨Õ¡:Dªþ®ê®ê‡@ë aã{æ|È?¿Æ+’ø0ñáìoD²–f-uò*¼fÌä˜Ég{xxxEâJâJâJD²b³b³bE$Vb%VäPë¡ÖC­"·“o'ßN©Í¬Í¬Íé©ë©ë©™>;}vº¸ÊÒcrcrm|O…ËÑãFmµÀ»×ï^»Ç^å˜s͹î§qæÕ™Wg^Á¢ÂE…‹ ]ÿÌš™53kà\ɹ’s%P–_–_–3Úg´Ïh‡Æ¤Æ¤Æ¤¨Ã°N¯Óë€÷º]·G›?¬Ç+bݲnyZDÌÕæj§ $ùYöÊ^·Â ¾ ¾ >‘—^>zùHäZѵ¢kE"æ%ó’yI¤!¥!¥!Eäèô£ÓN)h*h*hyQù¢òE¥H`S`S`“ˆ§ÚSí©¡œÝìŽâsø#zÂÛ“p¹ïrŸS×6¨-j Ã,d.Q;ÕtªéTÌ;9ï伓peðÊà•A¸[|·øn1dgdgdg@ÎãœÇ9aÖøYãg™¿Ì_æâX3COCOvøþ°žOžJ”Ùköº;@Ç8ˆ:þ}ôÑ Œòk´;í¶eÌs Šï£Sùé9fÚsÆÚiídˆ'a`õ›ºª®‚Ú£ö¨=`å[ùV>è]z—ÞªBU¨ PͪY5ƒ*SÇÔ1Ðt§î°N[§bðͱÿ˜ü8“¿^ÕX[­­NÅÃÜ‘"Dè¡›n —N:žÈúU``€jP ÑøŸœüŸ¹+Ã7€ãg”»j³ÚÌ0è:]€¸¶w¶,’oã}ö®üb__ì{ìË|Áþ 8Ø×åš;ûÍIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-37.3.png 644 233 144 3176 14774263776 15055 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü3IDATHÇÍ–ÿOÔ÷Ç_G¹Â-|;dš«5¤5­DÒˆC»z] ¬²fí,lÓ@4@Wìp3i¨#]dHB…TL ´s+„‚áÐùC]ª€JÑf’ êžcwŸÏû±î>Ümíàû—Ož¯/Ï×ëóy}ÞÏ÷[@DD‚Oˆ+"â8â·!{ôÑo¬ük®i³ióÐ^ˆ¯¯°6[›õ›!løøð|‘x=Ã. 2DµEµ™²‚¸Þ}éÝ—¢À5ý`é°tüÛt~Ð ÐÞÒÞ˜¸¢åêõ €¶SÛ‰ü.¿ ¨áGˆQA¾ãememFƒ7Op,Ç›ãµ4ýÈÿÎö“<“—–—ê¾KÀ8ã –j·´[øØÈ‹¼ˆZüF^æ™'´þÃsa8^M©)”ú•þ‚þ>à1AÅù“WœWl4øÉưQŠˆ¤|ÊË–/<‘p{Åíà«à͇ó÷ß¹ÿsÚ Ý¤›À—å³ûìàÚíÚíÚ “õ“õ“õà¾ç¾ç¾óÕóÕóÕü`ùþâsøàúåý–û-Ìùÿà‡QϨø‡¥ÝÒî‰4úeùÜ ¥Z©3û˜fZOËÜðjê«©÷f\I\ ªøçÅiÅipzÝéu§×uÌ:fƒU«V €¹ÕÜjn…úSõ§êO…š*›*›*ƒÌŸe¦f¦‚õµÝÚŽÊkȩɩ…Ïô4øpöÃYPÝ~ÄŸ-"òÏ28÷èÜ#h‰èºÞu]Ûã^î|¹¯»ÍÝânå%ËK–—Àù…ó çB…/ö]ì»ØÉ+“W&¯„»qwãîÆ…üÇ*U«ûûûpϹ'Ý“ðŒui÷Òn¼Î¥CãCãªÊ¡@« ô#ÌÆuÆuª66WW…=MÞô>d”e|”ñ$ö$ö$öÀƒM6=ØŠÛºkë®­» î@ݺ!»÷š÷š÷Z_¯§×Ó ¿ÏØ‘±oY›¬Mà:<Û<Û 0iŸ´ƒªŠÍŽÍVm´šfL3¤JGì뱯‹ iß–~[*Sƒsƒ¶A›H×õ®¡®!‘eË—5Š8N‡Ó!299)â,w–;ËE M…¦B“,®¨5Qk¢Öˆ § § §ˆ Ž Ž ŽˆtÝéú®ë;ÛŸl'l'Dζž1Ÿ1Ë”Hâ¾Ä}"ªW¢%šÔuZ+ÒŠL7DÌÝæn‘«¿¾:~u\’ògò¿ÎÿZdàÚÀ7߈L÷O÷O÷‹ØŠlE¶"‘ãÇ+ŽWˆ¬­[[·¶N$aOž„="ÓÓÓ"-ù-ù-ù"V_X}aµÈ¶ƒÛn;(âü‰Óâ´ˆ¸çÎvg‹ÄßN(O(—$ïœwND T¬Š5Ý‚3åüÉ/O~i|xU| zÛþ6¼ëã×›×›áhóÑæ£Í¡ÑìMÝ›º7 ŽGCÈþ°ôaéÃRȵçÚsíàÊteº2¡ÚQí¨v@ú½ôÑôQhš:R{¤¯Q¿l8ÙüÝøÇ0våöâíÅÀ™à.QÚNmçb=Å-†j©¥6L®p…+ÀL„Ù œå,g…_8Ÿ–¤%A€KOƒí•Û+…à®d$¨cXF,#žHF7ŒníѪ æôx=[Ïæ™et§îÔ  T*kè0‡9 ºM·é6 …çx´CÚeí2hûÎ-œcN·u¬w4e4ÀrÇrÇÉxPÇ~ ül‰Þ m÷]b^ûJû @/Ò‹ßYñ˜i¦Dùu44`–I& J/Ô ñ1¯õi}‹²{ ¶Dm‰úQ垕侗û^ØYÉÇÏ~üì"APE1à÷ø=ZV€T¿êÀ„ BØðñF¾ÁgðõŒú‹gå{»xbïcOæ ö¿p§ ´”ŠCøIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-5.7.png 644 233 144 2561 14774263775 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü&IDATHÇÍ–]hTGÇÏÆF4v¥…hBŒÁ¨D>ø$*~AÅ5JTð£V$T¥ÐRQA!«XEÊ †PSK©4Š“ô¥DÔipÑ6Ö„.µVMºh7]Ízïùõawv¯_ÐGçårΜóÿÿ3# ""ÞÄW mjÚÔ´ñq;íÓ”?cEÆŠ‚âöi¹ûäî”߉حv«›)ÎoôLÈš¥º!Üî}1yìn n n‚öžöžöžÌÂì…Ù ³áDΉœ9o®Üí·Ü~•••0P;P;Pë ð*KYÀˆá‹ó=i"ªY5{ºEìÕöj½@DD²gCºí¾Ó}Gdëä­“·NiXÞ°¼a¹Hx]x]xHþ’ü%ùKDêrërër%95k<&RRXRXR(âÝçÝçÝ'¢ÎªÕ "O<7=7E$ÃðÅù“z^ßc|›¨yŸãs|Ä̽|ôòÑË0?}~úüthÌjÌjÌ‚ÿ€À«|«|«|ÝÝ݇‹.†æÖæÖfWÉÔOꂺØÎçŒÁë{õT&ÒKÀ¶‡ßF£xÁ W)®p…+@)¥”ºü1b©ß!òÐÕ×´=d¹ùÞz*]}Ì ŽGR}Œ‹j¬Ësç§Óéçs§Ò©U¦ÊTPC 5 <Ê£<À-nq T@TôV]¡+\B£j­Zëêc ïèc¯tþŒò ƒbu€ÓátZmSÛ°›U qp€A4«üK„$VOƒÚ¡v`sùáÆ7|otþ×îJ’w唪)I€K@-µŒK–g³³™èëú:<²Í¼‰7ùÏà¿ó®|o_ïí{ìý|ÁþQ7t7fÛ¢ëIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-69-grey.png 644 233 144 6360 14774263775 16025 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ¥IDATXÃ…—iPT×¶Çÿ{ŸÓô$Ðà€æ)Cä%€$Ô«–Ä„¢Ÿz‰B™wQ,¹Mº«ò¤B,+8$/<Ä ‚ˆ$@¼Òhq¥½*¯el5DDœš¦‘†žÎ~èæÞÊ«TÖ—]ûœ³Öúíµ×Ù{-¢R©T*˜Óä@—ðù‡üCÖ :¥:¥:Åf«ŸªŸªŸ.[À|˜óÙ÷Ž9Ž9Ž9Q›­µÖZk-ûÇqÇI!BŠP=èA€ÍØŒÍìKqš8MœF ù'üþÉ?Ž“a2L†w+ö+ö+ökêÔdh24dÈär‘”I¡ÕÅ¥ S€qˆC­Ô‚ZP ­¶1Û˜mlV´ºN]§®«è· Ù†lC·¼ayÃòFÔ_äeò2y꣒¢’¢’HaŒ(F#¢}£}£}÷ÜýÞý½[ßmoʾ˟ۿ›ÇÍÇ»"øób^ÌKØD²I6É*ジ .èçcgÆÎŒ ôÞ8½qz£óÓ¤ž¤ž¤jÐGè#ôd…¸P\(.„{°{ ƒXd"™^Ãkx ë\ë\ë\¬ÐkõZ½–Ù›C›C›C…O_&¿L~™üá!Y,H´XâÌvf;³ËXËa97ÐwHÑDÑDÑ-´ÐÎõäkùZ¾V{Ö6n·~ |Oùžò=GܺÜu¹ërù ŨbT1 %ÄC ‡Ð"´-àII faf°Â +3Ì0dœŒ“q8 @€Þäiò4yâAõ‘ê#ÕG›´Oãp„#ðR|£øFñ ,ñIñIñIHªVW««Õ€h®h®hîgk©#Øì~k‹Ï Ÿ>/ðåÂø…ñ ãI9ŠQŒbxÐyt\_s}Íõ5Àõ·®¿uý- ófæÍÌ›@rUrUrP!ªUˆ€g¯?{ýÙëÀ¥—^\zXò,y–<`óÚÍk7¯ÂΆ ; œ>}6---‚[<" " " H¹›ÇÍÇ[V£Õˆo¤,HY‚Bé é é X• TQPP÷4÷4÷4ÀâˆÅ‹#€@Ÿ@Ÿ@`¦f¦f¦È™ÿ2ÿ% ¬V +~üø«³Vg­ÎüÃýÃýÿJ¿J¿JàÖ¡[‡n Ï Ï Ï7ñ&ÞxYŠ,E–KÀÛo¼ÂÛÆÛÆÛFìãñ9>Çç$”VÑ*Z5µ21ÕP ÕýýýÀHêHêH*0’3’3’è{ô=ú`"u"u"ˆ={:ö4°rÿÊý+÷¾_‰¯¸9psàæ Ü>pûÀ퀥ÛÒméœwwwd! Yÿâÿ#úýÀQÅQJ¹9Ün;g^d^d^„ûöAû }œK‘RCj›Ýf·Ùù<ù<ù<`ÇöÛwl>Þõñ®wÍŸ4Òü Ð{²÷dïI [—­ËÖ£­£­£­@‰¾D_¢Zwµîj݈œ"§È 0³1Û sÜØí±Ûc·qŸ*©’*Ù9*Ù/Ù/Ùï(½ïwßï¾;×1Ö1Ö16¥8.Îç‰óÅ5Å5Å5@Ù¥ìRvžužužu@@Y@Y@à%x ^`¬2V«ËlËlËl`ÓM6 *8dTfTfT¢\Q®(ð¬ö¬ö¬þ§?à à à ÀðØðØð$÷%÷%÷¥ë°ëŠó*^Å«Hasrsrs²Si\a\a\™Ë€9l]غ°uÀË7.߸ t†w†w†Úm}Ú \ö¿ìÙð=ì{Ø÷00ÕüUóWÁêÜáÜáÜYýÌú™õ3…8b bÀ7ÄIœÄyƒKKKkýyB=¡žP‡lÑèFtÿþ×ç¦ç¦ç&çΨ¬¨¬¨,ºÚ¿Ü¿Ü¿VS‰©ÄTþGýúõÀpÛpÛp°:juÔê( °"°"°êêêu>ê|Ô Ô›ëÍõf@j‘Z¤`ƒjƒjƒ ÌKç¥óÒ¿ ¾ ¾ ,ÝAÝAÝAôÏ’XI¬$ö7ÚÛííöö )¤è×¢_‹~ÐŽv´ÿÛ×¢§¢§¢§­ÒW¯_5æ$êõ‰z–Ò›Ò›ÒK®²8ÇâÀlçlçlç@øa~˜¸H.’‹Žt¤¨D%*ffffl_Ù¾²}ð½|/ß p§¸SÜ)X:–u,ëX† gÚÏ´ŸiÇeiŸ´OÚ7‘Ì8Æ1.j†°®­”§ÇéqNGÒƒôàãBŸÐ'ôeÛdM²&Y ]£]£]Ã^×çéóôy¨$m¤´aÜcÇ=·[È-Ø-v‹Ýú' R‚€Ì 3È @|G|G|g Ð$„EÂ"aQÁ“©70áJů]ËLq_ĽrWK"vM]1áJшF4:w’8GâVO¶?_´o³o³o¶(|(|(Ð%#FDšÐ-t ÝÑ0FÃ`u: … 9r$Ä9(v(v(–ë•DJ"%‘¥‹'šOÛ„r¡\(ç¿víì÷Ži4F³;¢p=°Nm)À¹s²çá¿&e¤Œ”]­¡ñ4žÆZ‹ä ‡®³×ÙëìŽm¦c¦c¦cQJ)¥qG¢i¼i¼i\° ”””s½’½’½’½õÖÇÖÇÖÇ{õ¾ßû~ïû€ PéÒ“¹Ý|S ¿v s¸îÊÝ‹ÿ/wç ϞÛ~Pý úAå܉ù˜ùðÖûê}õ¾ø^«Óê´:²IÖ-ë–u‚RP Êí­|:ŸÎ§¿C.+Ý7Ôo¹8üŽLžp¸¦zæÁ<˜ùóPøPøP8þÛéïôwúÿÝ!‹ƒÿtøYâ³Äg‰¾L]¦.S+¹{òîÉ»'ï¼²¿²¿²sù¢%¢%¢%ÿ9—cÇØ±ÿ©Ÿle¸0£ðš{\rü–‡àäwrW4 ÁYÌjY-«]ÚGÏÓóôüß‚'«)!\T.*•Ó..‡Ëárš[B·œ9¿l©¡ÏÐgè#? ³„YÂ,vÂe·Îhù=Š?ßä®ë¸p#¹ÈåÿA2HɸÂXkØ) Hh×Ïõsý„}Â>aß¶ÁîÝ»7“€vÙs–ãÄñ<ÜOŒÒÁzIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-63-grey.png 644 233 144 6222 14774263775 16014 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü GIDATXÃ…—kP×¶Çÿ»»‡f@|/J˜ð‘)Ž ž2Q )'æ(×GibŒ TjŒ¤0E‰Ê *F2#$ˆ^y•DJKî\žƒ†‡a˜a¦§§÷ýÀ4¹å©TÖ—®Ýµ~{íïµ6ÉÌÌÌÌÌ„'fÌ8saÖp¹ÇÜcZy>ó|æyúBöpöpöð_^¦sé\:÷øÁGð|V|h«´UÚ*é1£Å$ÁF0€Nt¢À‡øÒcòdy²<™dp¿q¿q¿Ý/&ãdœŒÿ³(kaÖ¬…7ÛrRsRsRÉà/ø þ$a†Clpry2³€1ˆA S*f‹Ùb¶ØÀ›y3o^‘­ÍÖfkK{ù!~ˆªi¶„[Â-á+>Qå«òUù¸±býŠõ+Ö“ŒHY¤,RDxExExÒXz.½/}/ù›õïŒ'Å—x$>ΙÁ×è:‡Î·íd;ÙîŸÏú³þ¬ÿ­oÍ%æsÉ‹^Þ5Þ5Þ5Žë;×w®ïdì¡úP}¨ž$Ê3äò Xp‡pJX`@Ò`a,6_›¯Í‰úz}½¾žÚkƒkƒkƒÅÏâŸÅ?‹ï”Ò_é¯ô_¥plwlwl˧ª¡šÇ[˜×Èëë+€zÔ£Þ׫ä*¹ÊúËü4?ÍO¿øWõê7Ôo1)é)é)é\©ç¤ç¤ç$ÔC9±N¬ëÀ‘udY``l°Å(Fâ â€"DpFw£»Ñ®\-¸Z lyT÷¨îQw×ÅÕÅÕÅõ×*!YH’_ߌ×ñ:^˜d\[\[\[Ù ²d/ü뎥ÊRe©zñ¯êêêB¢&U“ªIåîzTzTzTbž#É‘äHÐ~ôƒcü?ÆÀwøßäWò+ù 6b#6“˜Ä$ Òsô=xìôØé±ó$ÿêdu²:YH”âK<#L SÂTB_ÁWð©¯z§x§x§Ð€”²”²”2NÒˆ‰š¨‰š0‡½È^d/üûüûüû€ ÙL6“Í>Á'øÀÆ0 al6›àXâXâX2;¡9’ÿ”’”’”®TŠ/ñH|lì籟Ç~~á?m^6/›—/%^Âÿ¾TþRùKådƒØ/ö‹ýp#a$Œ„º]ˆ.¸¸è⢋‹€†- [¶ŠyŠyŠy€ïVß­¾[±¾±¾±>àûÀ↑««»ŸÝýìîg€û”û”ûàåå¹b“b“bDÙQÙQÙQtéwèwèw$™Z¦–©G˜™Œ¬ühîèÜѹ£8¶,vYì²XRˆ,d! .Ìbf1³hÜØ¸±q#и²qeãJ í—´_Ò~âÄ?ˆ”´”´”´ããã€nµnµn5`\b\b\ìÚ¶kÛ®mÀòO—ºüSàÚ²kË®-,o[Þ¶¼ É\B B B H¡Ä#ñáàÄÁ‰ƒâ±ÒU¥«JWQÉÌŽ£Ž£Ž£³cz¦ùLó™fJ+Ìæ 3¥‚‹à"¸PjR™T&¥¦NS§‰RÓ.Ó.Ó.JµDK´„Ò‡¶‡¶‡¶ßýt¼ÓñNÇ;”fë²uÙ:JG‹G‹G‹éóf–x$>_à |A‚™2¦Œ)›™œÉar˜ÀÚkíµöIIIÀ„fB3¡ôúN}'`ýÊú•õ+ f~Ìü˜ù@5Èd6l(ØPði|Ÿ]^]^]^À«¯f¼šx·z·z·4šFÓh€4“fÒ 9³•ÙÊlpgq–3¬ëÃúÐ+¦(S”) =öAû }¬˜’ RA*ÞÎÛy; Z¬Z¬Z ìÙ½g÷žÝÀ¶•ÛVn[ Ô†Ö†Ö†mMmMmMøÝ"‰H R©‰Ô«‡W¯E<Šx ý4ôÓÐO³€Ôùk~`~`~€Fͨ5½Â(N(N(Ny= {ö,¤WZÍ­æVól˜iù^ù^ù^ÀóŽçÏ;€º]Ý®nܵîZw-°$jIÔ’(À£Û£Û£ʾ.ûºìk` o o ?~>ü<8œ8œ8 XÞ²¼ey xü8øqðïñ Q†(C`xbxbx‚/=ŠEÇ )HÉ*æ2¹L.“dÔÆ×Æ×Æ;Ôc‰c‰c‰PJÛÇÒ”¥)KS€&]“®I´…´…´… ù ù ù€½Ä^b/‚j‚j‚j€a¯a¯a/àÇðà  FƒÑ`no¸½áö€ícûØ>À/×/×/6g¥î²î²î²C Ä@ 83S(¾u!g^9óÊ™W€áºáºáº ýæææ[}ƒF‚F‚Fû5uš:M›'„ ¡B(l×]?výä÷OÝ?uÿàiõ´zZ„„„ ¬/¬/¬‘ÈFd@YYY?0>>̉›7'Hø8áã„A—G,XR¾ª|Uù*ÑÒ|¼ùxóqF©œTN*'ÿg³]k×ÚµÑß#}GúŽô¸‡{¸÷§eòaÙpƒëTÍTÍTÍ‹š8}œ>NO×%t%t%t‘Û4†ÆÐPþ …¿Â=ãžqÏ6œ gÃßàÑ‚´´”–ÒR€ÿ™ÿ™ÿ`ÓÙt6àÖpk¸5°´Æ¶Æ¶Æâï%J”<€ÎµÛµÛµÛOYÊRvÅß±K±´ý SÌ3Ål s’9Éœ|²Gì»Åîí¼ò¦ò¦ò&P¿±~cýFúŠ~¯~¯~/.‘»ä.¹‹i—C.‡\ìrv9» -´…¶hE+Z¸Á nÉ'ù$[ä¹eÐdj25™š ¼Qp£àF –õÈzd=1#1I4‰&Ñíÿ@òÇù:ÛÀ ¡!4dV‹sªtUº*cÿøÙñ³ãg¹Ór_¹¯Ü÷RNЉ A'NÝš)8ä2ºÑn!NêGUèE/z…6ìÃ>ì#•/_{ùÚË×òþ¦øHñ‘â£K9ãÞãÞãÞœñªÛU·«nŽýR@<ÅS<… zè¡ÿ]“´¿ èP’KrI.äM†&C“®»wëÞ­{·Ø<Õ|Õ|Õü+_Ê—ò¥sÛ²Ú²Ú²j j€‡ÓÍ9 Ôâ¼–‰n¢›è‡ƒü>~¿ï`®j®j®jîã²Nm§¶SËæUoªÞT½‰®#é$¤C.^/ˆ@á W¸t‚NÐ €D ¦G #†.Õ„Õ„Õ„ÁC5¤R b”%F̑ހÕ)ÅÓÎi&HˆH3wIäΡ3'ljPƒÇ~CbH̺¿Í9n]·ï´ï´ïw¿'¾'¾'2kBO†ž =‰d±Cì; d–2K™¥° B†yA`A`A #h(z(z(šíR„)Âay«f~šwÅB±P,äN;Wv´b9999990I…󯬆œÚÝïÔîi§v+þM»v­]kv‹ŒEÆ"(†aR&nNßœ¾9-Z   Ù.ÅaÅaÅá¶¶'¶'¶'‡Ou½Ùõf×›€P-í§ Ä7 ú°ô‚Òé Ñ©Ýëÿ¦]ŸqŸqÎøCæ™?d:ö#A‚‡ÞKï¥÷Â÷õ-õ-õ-d‹²CÙ¡ìDµ¨Õ»¸w¹w¹w§WDDD2cÎx¤ õ<‹?°µk×®]»‚s¨§.Ô…º]C!C!C!ø¯™¸YÈäï|ó4îiÜÓ8¯kÆvc»±~õðÜÃsÏ9^›²OÙ§ìì>ÙÙÙš}i-¢EoÌeØG3 ¶¸HZg¢„çyþÄþ@»Ù¨F5ªY´’VÒʵÝL9SΔÿw€5ÉšdMCd…²BY!ÓÎjX «©­ ,,,ÿËZC·¡ÛÐM~ˆ Äô[§_­ÐòG þÄžÓ®s»pd!éHçî“T’JRïÒjZM«ÿ™æêçêçêÇ´³½l/ÛûÄO<.ïìØÜ±¹c30ˆ§?©±œþ3ŽÿAHÄ eIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.3.png 644 233 144 3070 14774263776 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜíIDATHÇÍ–mL”WÇt Ž‚8ˆ&ÝØm‚ÖH Qɪ"Z¬´´”Ð5&Òºq¢Ó¤1ma°!Æð²‘n¶Fƒ,ZX(Å)´n Ù삺b©]œ„ÑQžçþöÃÌ33[?í7ï—›sî¹ÿÿ¹÷¼Ü+ ""Ë"³@⋉/&. ˉûbúEo,zcõé°ü• e eŸAÚ—i_8N9N™×b²µnÙÇï‰áÇóYzY&1ErWrWBaD®‡Ý¯ì~eÑŠ°Üx ì½öÞG ðAß}=î7ûáÎØ1€@a b²µnÙ[û-¼x|©ÿ¿7Á…Ãa|˜Ò¦4à{{½G³YþÿùÊ ÕµÕµ ~`æšg]³.ÈûS^w^7j¨sÈ=äŽ_,¾X|Ò¥J;[·4niÿÿÿ…˜]àpàpà0l(È.ÈG«£Çу*?^ÚXÚó óÁ‡>|j 쨋ˆŒ;áÛ›ßÞ„GÿPU¯ÈMÏM'dÝëøöñíãÛáL÷™î3ݰZ[­­Ž%=y󿄦œ¦œ¦œ˜¾mgÛζ¿<yþrþ€~ãX9°r€wåÄÌÄŒª‚~Õ¯Àh û#hKû—ö«.®ßY|g1¨ý‘:zAŸÖ§aSᦂM0P6P6P!_ÈòÁôÈôÈôx\—ÇkKÖ–¬-çˆsÄ—{5ªFÕ€æÑ<š¶þqëþ­û!ýº£Íѳ~pêÁ)¾?TCjQj‘êp¤:RÍ«üÍÌ ”-ûðM¬Ï[Ÿ·z;z;z;b„Π3è †† `,c,c,ƒ§ÆÄš‰5k`´u´u´îﺿëþ.Èþ}Ö¶¬màÎ=Ý~º?˜çÍó`¤¾ú¶y5Q0Ïšg®Š®ëÅ" ¿‘ŒHmÈãÏúøS‘”á”á”a‘Ñ}£ûF÷‰4/i^Ò¼D¤¢¯¢¯¢Oä¶÷¶÷¶WärþåüËù"™™™"žAÏ gP¤²¹²¹²YÄ»Øk÷ÚEŠDÒn.ûdÙ'’! †‚"R¡RUjÂÕHUŽ;ù¡c¨c( çXäÀ!ç°ó¬ó,Lî˜Ü1¹¼â¯@Ñæ¢ÍE›¡8©8©8 rm¹¶\´´´ÀÞ+{¯ì½¾_¯Žöí?Úÿ³qjã´Ý=Ñr¢…P$àUtvï8|cåѪü¼ús+f,h ±äV@È‚ù¿Æ9ÎqPèèqx× #h±øª¿¨þ˜Te´)ûŒ}F³aÞÐoÄÞ4wëúAÖRF¨y¥) Œ:£Î¨cÒ˜4&Ápnà ªRUªJ0KÍR³XÅ V€ÑjŒc`¸æ‡æ‡š/Dú˜gjÝÔ:ûOöŸ43V{ªó¿—ü^r´-Ž2gœ7ΆYiVFO­¸‡à÷€{‘9Äž¹ËÝÈ]ƒB™ï›ï£óÄ6†ãð£|Ouþ_½•ÖÛe½•a€^ Rb!6*Œ B .©K$1ÙZ¦Dd¿…gá[|ô­|fÏììÙüÁþÚ­@+>$«ÌIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-28-grey.png 644 233 144 6316 14774263775 16021 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ƒIDATXÃ…—kPTWº†ßµ{÷• 'JsnŠ" ØhŒÇ#DC&"¡9ŒgbÔ“H"Ád j¤‚h‰S3Q#bD%Åjˆ¡Á Ë” Ã¥¹‰Ò6ÐÐÝ»÷:?èÍœJU*ëϪµ/ï÷ìo½{­o‘üüüüü|¸c®™æ:f-ÛÏö³ý´.ÿtþéüÓÔ«p¬p¬pìK©õ ÅÿÅ)9%§ŒÌ²ÖZk­µôST¢•$ÁF0€.t¡ @²E?•&K“¥É$—}È>dÞ©$d‚Lì­(X\°¸`qý¿ŠÒ‹Ò‹ÒÉ(çÏùsþdýßìärgæcƒæ+¾/ä ùfÛ´mÚ6½he¡®PW¨ûjÀ6jµêoYÂ-á–ðÈÿq)u)u)ÅÕȄȄÈ’%ŽG‰•ž+=WzÂX¸/ç¹P¿P¿PïØÐ•ЕÐÅØ—µ-k[ÖF6Hs¥¹Ò\Xð>ÀPÀ ,2 Þð†7,V•UeUaC[S[S[µ777ó»'>N|œøæQ…¿Â_á¿ZæÈtd:2ãK©–j©¶?•€€€yäÍæÍæÍhBšT®l-[ËÖ6·ÍØfl3ÏýI½N½N½Ž‹IÉIÉIÉa¿rŸtŸtŸ„RH!Ç7ò|#XGâH/xÁ €VXLcÓ™"Sd xðàÁš\M®&Wô]œçÃçAXæYæYæY¥(E)@ŒÄHŒ $$@5ªQ €´ŠVÑ*Àm‡Û·øƒ ¯NV'«“¹ B|Gàc¸)nŠ›Z¿ÒvÅvÅv%=bák _[ø H¹œr9å2+xÄŒ@" pçq˜í›í›í¸ ®‚«H6É&Ù>Ççø€êGý¨`}Þú¼õyÀèt¤´“v,ôSªRªRªØ¯„øÀÇÒ`Lƒ÷o¶»Ø]ì.@ܸqà~ÝýºûuHœBŠÉŒÉŒÉ  :¾:¾:ªªª˜ÕÌjf5›››Äêcõ±zÀìcö1ûç#ÎGœä=È{H†$C’!`Cú†ô é@$" ,p?ë~Öý,,q1q1q1H¸xäâ‘‹G±J¬«öof¸.€ X•íñ‹Ç/¿àÓåk–¯Y¾†”c/öbï<(®w\ï¸ÞŒ7Œ7Œ7ÚÕÚÕÚÕ@œ{œ{œ;p¥æJÍ•`$h$h$0œ4œ4œ¿ûøÝÇïÙiÙiÙi€&G“£É.']Nºœ˜?4hþPˆɲÜe¹ËrI¹À#ð1Ö'Ö'Ö'ø_¿C~‡ü!W^ /ÀBÓÃô0XAÁ¼Ü¼Ü¼ЄjB5¡€ïÃûð€F¢‘h$€âcÅÇŠ±ì±ì±lÀâkñµøîõîõîõ€J¢’¨$€:C¡Î˜ãÌqæ8`1YLÓ<(«Ø¤Ø¤Ø‹À#ð1øŸàÌT3ÕLõü R¨¡†z~Œm[·mݶˆÓÅéâtÀÜ2”¥A HuRTø*}•¾J`]ĺˆu@ÿ¥þKý—€be±²X œÚxjã©@pWpWpàuÂë„× €àøÇgÒ˜4& À)œÂ)̈”"¥HI/˜£ÍÑæhôr{¸=܈ÈEr‘\¥CtˆÒÒÒÀ€÷€÷€7ðYÙgeŸ•7÷ßÜs?™™ ,L[˜¶0 hYÔ²¨eàó–Ï[>o ;v$ìÖ¬X³bÍ àç蟣ŽÆÒÇÒÇÒÆñcü@ ¢éŸ¦šþ ½ŒšQ3jz‘’’âJz÷.î]L/Ü«¸Wq¯À ¬À ÌQÐßßTdUdUdÃÃÃÀG-µ|Ô,=½ôôÒÓÀ¬}Ö>kZ][][]SŒ)ÆDåEåEåëë뀥ÕÒjiº¿ïþ¾ûûùLÎôlîÙܳèîîÆaY¯¬WÖË•0HA R *Ù|6ŸÍ'¹ú»ú»ú»µIeR™TPmØÔ°©aàÓéÓéÓ øSêOî¤î¤î$àNñâ;Å€c•c•c²?dÈ~ ñýÆ÷ߌj£Ú¨   ú}ƒ¾øÞ÷½ï{Vauùöoßùö>†ôÒƒ“ÄAÄñ…„œ =z23ŒÆ gLõNõNõ¦©–„- [æØ•š•š•š%*)-+-+-ƒu¶q¶q¶RÛ Û Û €9ÆcŽÓ-Ó-Ó-@ÚŠ´i+€ÐàÐàÐ`àLÒ™¤3I@_|_|_< ðTx*<„ €jô½FRUUÅ[n¼uðÖAF¡°)l Ûý-v]g×iÊHÞ`Þ`Þ €V´¢õ?މÇÄcâ±fùÔÑ©£SGŸÓ&ô'ô'ôÓ—^á^á^áÈÉÁÉÁÉAPñŒxF<‚§xŠ§ÞÆÛxïïïD™¢LQ&€'x‚'€­ÔVj+˜ ÌæÀ¶³íl;,÷–ß[~o9þ|vðìàÙA|+7Êrãl"QEþ!AHÇ_¦’©d*E·™#ÌæÈðßø~„É´ÉÛåíòvÀÐjh5´ÒÐöÁöÁöAT¹úºúºúbFÚ,m–6²U²U²U€ìŽìŽìÎÿTB %@§é4$÷%÷%÷çÍæoÌߘ¿âjåÕÊ«•œZÜ/î÷såß>žhˆ†h:þ‚” „U9ËôÁJ¶‘mdX„! aÄC ÐA#@Ii `èù¡ç‡úRCICIC sÎ5Â5Â5bh־ݾݾ}ËÆñÔñÔñT3GêI=©'YÎ{O(œ-ξš††nwGîŽÜl;m;m;ß;èâáâáâÑ_Ý¥ëÒuéD%u¯×½^÷:}‰ä’)†?ß…rÈú”>¥OÂŽp˜ïïïA•>L¦ƒ›Ë¨Ë¨Ë(ÀGóÑ|ô{ç¬74ë´â±9º^؈°€9$RçÐ9E¢衇ޱ‹ÄóÒ«sGŽï.Ïe€ÿë›ü›ü›<³vÙ‘eG–A2ßÉwòP0!L+—Ëår¹ž<x"Ð4ªÕŒjDݲ0Y˜,¬dõÜO³ûG¾œ/çËÙcÀ¸¿ )*****‚YÈ(œæ=äôî.§w‘RRJJo\aâ˜8&nw-´ÐBË”éì:»ÎÎm7U˜*LP0 Ã0 ž ™¨Ÿ©Ÿ©Ÿá-CåCåCå¢nÙ>Ù>Ù¾]µ[‡­ÃûŽv¿Üýr÷Ë€PØ´ À7ú+`á…Sà&vb'v’ËK/-½´ôRÉ«²lY¶,»ªhB9¡œP²¦¯ó¿Îÿ:ß± ABÜÚ<Û<Û<ñϦÛM·›n“TE§¢SÑ ðj^Í«ÿÚÌne·²[gÖDDD1OœñþSØ¡~Í%Âo4çOÆ9‡mTB%TBþ{tÉè’Ñ%ø‡Ã×áëð½ÅI¤Ò€×ÊÅ?ŠïyÉÔaê0uÐÏî~y÷Ë»_:^˜²OÙ§ì¢âµâµâµ{T´‚VЊsWçŽ2¢¾¹u–÷fÀ™(î×<¿Ó~û…¨Cê´–ÖÒÚX#SÃÔ05ßÌ&Í&Í&ñKÄåârq9Ó!ÒŠ´"mƒ!°&°&°æ±=Æc‘\çñ‹øEô §®Î hù-¿Ó~å]7§w ƒä°wH:I'é´ŽÖѺ½r?¹ŸÜé ˆDÃ~|1_ÌoéÜÒ¹¥s 0ˆ§žPXÎüÇÿaçBƒ¶¾KIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-171.png 644 233 144 2612 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü?IDATHÇÍ–KL”WÇÏ 30SA!`b£`C ÆHHè( F|dT ‰º¨uã ) Æ…¯X4Ęª)‰øˆšFƒ<2˜VÖ6¤µêh|PgÂ<¾ïþº˜ùæ[Ù{73çœûÿŸÎýιW@DD2ã¿Ö\k®uv̶6˜~G…£âëΘݮe£eãƒïaNÛœ6€¬3YgôG¦mÄýÉx“?9Ÿá—L1iÓ.ZÊãv+lYºe©cnÌ>ÔÎngw0 W¯\:wéß‚oÐ70Q>Q¦mÄýÞàKæ—ÖÿäûuûuËŸ–š–* W/\ÿ]lÃùPµ¶j-Àó”ç)Ê Ú tU`¬·I¶ï7ðŸÁoä3òÇôä”唉À†ê ÕÎc€GD=ó=ó|‘nŠÙÉNÒ¹Ž75§æ$¤êíz;¨€>©O‚z¢ŸÒO{£¢fÓl@1­´’ÎOq>< < €h<_"Ly”ºˆÈa¸Å- A^ÕÝÝê©öX{L$PLò’—˜K¡Püo©&U­ªQꩲ( P•ª˜Œñƒ;ÛmTð°+é(ED ŽƒóµóuÀc“c“À¯T‚º§î1ü98ím±¶"[#[#[áMë›Ö7­ð¶ímÛÛ6˜x1ñbâLošÞ4½Éü%ø<ø"ã¡’P Sqw%£cÃcÃNŸÓ°zâÂÚxµ«qW£A£ªÒHa¤&ŽL\˜¸€*ZSTVTÞ,o–7 ¼w½w½w!cOÆžŒ=PPWPWPö{‡½ÚRÛRÛRAߦoÓ·AÑê¢Ò¢R¸±ûÆÁÍÚê_ÄòÁ®–]-FåÚâÂîïeIׂ®‰¨ ¾óõ%TÜT¼»x·Ù»·ÏÞ>{û¬Y ÿ ÿ ÿ èß׿¯äææ“CO=9¥M¥M¥M&þÖú[kn­IÀCÚH,t}èú`»¿W`vïì^u‘Iß"ß"àQ\Ún}¹¾´/µyÚæŸ±+ Ž'戋ŒE ž´tîaJ¯ÓèG@½Pãj3Ök7C‘áÈ0ðk´>Ž'5~Œ/ÎÕ#þ»·ßeIeIqA¿€ìÀ˜Ú­vÁÀ"D°lŒ1Æ#6ƾ’&¨fÕLä yÃŽ¯ù4¿° Ê: ɃɃ#_ú%ð€/A5ªFFMƒÅ,†WŸ¿*xUÁ+Á+Á+ººº†ÓpNIIIƒ 7è z!ôm¨*Tò¹Z®0³ÍlFy ñc|qþ¨ž˜°³ípðøÁãz&*Ç”±-ˆÍ8Ün·ƒ«×Õëê…%5Kj–ÔÀŠÂ…+ ¡#Ðè@V]V]VdÍ:šu–ç,ÏYž¾O})¾ OýýúùëçŸÅÕö฾Ž×U˜Ç —áb\Gžžž`Aý‚úõp2ýdúÉtèïïïïï‡uëÖÁüàüàü Ôzk½µ^ðwú;ý¶-/§”R ,OËÓ߬°ø£zL½;õ®yóó¬z•nŒ€åß>vûØíc°èÔ¢S‹NÁÚÉk'¯ ¹Ã¹Ã¹Ãp®û\÷¹nXÖ²¬eY ¸ ÜnXèYèYèÞU½«zWYxæg‰Ý4T€Ô)©S”^ ¼°®½ù³:¯Î[eþ=þ=þ=ÐÞÓÞÓÞcÅ7ÍØ4cÓ ¨,«,«,ƒG™2eZùõiëÓÖ§A«ÎUç²â²ÈXj,µ·ÍÕ“ „º¦®9|B[­BÛL³ÐœmÎŽûÂ÷Ð÷Ð÷Pˆ}³öÍÚ7Kˆ }ú.ô ö„=a‰å‰å‰åBììÚÙµ³Kˆ†Ü†Ü†\!‚ÙÁì`¶î>wŸ»ÏÂsà8ŸÅÓ3Ñ£Qn”g€'<±fêmó¶yÛ ¿-¿-¿ šœMÎ&§-ïð:¼ÈäòДєєaÛ±­S ü&ÉCïô;]t …²Ýáw€•¬d%ošÎo¡„^Äxi¼|ï­|K‹ÄûØau˜QšyÌc òŒ<²JVÉ*P›Õfµ8Á N€¼,/ËË È#ò¨5*Oåݘ˜ªRU2;ùïëcïìü÷å}U¡*ˆDÁ1‹wöa|-¢+:öFç߯ö±ð4þ„‚%Õs«çÆZ€ZjI±¶Xî•{óžy°|‰X½ÆÓøþ+?Ø×Åûû0_°ÿ©-f!¤ÎIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-27.4.png 644 233 144 3146 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–íO›×Æy)X¼KLQ” ÔZ…v#UFQ%%*M‘£ Y[Aj´ti´N hW%Ê:Ñ’xNYK4´D´˜f“BÑæ3QLR’(‹Öf¼ˆF išØ‹é ÆÆÏsÎoì'öÖý9_Ý÷¹ïëºtÎs®s!„È}$$$eGã¤_ÄóéÖt«åÏѸSÓK¦—þqr:r:ò>ÎûXÞˆÇÆ¼QŸØ/D?‘ÏÈ‹\O¤õ¦õš*bq ¼¼îåué?ŠÆ¿¿æóÀ’»wôw÷wó+¸3qgÀ_ᯀxlÌõF¿—ˆ/Zþ‡_H=“zÆtÒI{D(¬,¬|ì×Ñ‚ÙÇàŪ«æ“ç“Uè^ “LU` _BlÌÇê~ÏÀ7ø þ¨ùÏå?'ܾ°}ÁÜm¸ñ)jînî5 àCúé'“³ÚGÚG ¾ÒžÖž&¬ò´< jJNÉ)àõŒz@ß«ï%LHój^ºè"“Ã1¼œæ’æCàO9¹]n—æ.È·çÛã{û:_ ØVn+õc€ÈE@"AýN6ÊF"ê+5¨QÖh‰EI („rÿ”›ä&"ê—Z‘Vd¤#ÑëVÕ­2:_HØJ!„xâC†Í.³+³Ï>‘Ÿ°íÞÍïžýîY‚ÚuM×tˆÔGlx›¼MÞ&ðuø:|à¿í¿í¿ ¡#¡#¡# 2OÓG° Ã{ƒƒÁA‚߯^,سŽYà1wš;),DõU&„xÓñ¦þ½ ×WÿukÏÖÈüifuf5ªz}õ“ÕOBOcOcO#ä7å7å7AqEqEq¤ºR]©.8vþØùcçãºÂ———âñþŸì·î·¢*C÷*îY¹^þe·e·pGõmB\m†á¬á,èþíÕ_T«]Åù–³–³ñÍØèÙèÙè6­MkÓâDcccPh)´Z`¾k¾k¾‹ŒÑéÑéÑéøSUe½o½oà«]Ò}ràäð·¨AAÖ\ÖœêïkÞ×àî¿ægo¹n¹`¤m¤u¤ŠòŠòŠò`ìðØá±ÃqÂå;Ëw–CûÁöƒíãyY( e!øOøOøO€5ÇšcÍú÷ëß«ª×m[Ü–ðoê·çWͯ¼Ù½Ù½ªWП;š;*¿f‡¯ÌW?öï˜ß^|{J[J[J[`434_ò£7ÎW’+É•¾Z_­¯ö9ö9ö9`GÉŽ’%q!þSþSþSÐáìpv8ÁsÝsÝsú6ômèÛõ¨ÿ þ(°®ÍZ›S›¾©ü¦À‹P Yk²Ö¨Þ$z‚žk_ á~Þý¼)©¹“¹“¼n}eKxKX¬¸Ÿr¹‹„pN8'œBL/M/M/ ‘ëÈuä:„°ÏÙçìsâÁÐVk«µÕB¸Ãî°;,„ååå¶IÛ¤mRˆFոܸ,ÄÏÇíŸØ?+Åyt„×Õù‘Á‘A!L'¿]üöÚ—1»èôÀž­{¶ÆO èCú ,$ø–ŒúÚƒq™Ë\îp‡;@ˆ¡S«RUª ´1mHyF^“×PÓÚ´6P5ßžÏö|ÜJúc>†yÆ<HQã3¥3¥ Šú˜>µ²´²DPW?§Ÿ¥«  ‚¼+ïÊ» lʦl Bsœã MÒ$MÀûà@‚ÐÏõt= üMf6ÏlBQ~´˜ýÀùWêLu&à_1g^Їõaྫྷ‘5DÐbN¾„?þïB¢£ßãñÕU wÉ]DXÑÇõqˆÞ‘‹P—^—þ?vWRûjí« w%o­}k탫ch¥•LÐZ@oЃº .`Âñؘ7ê~ÏÀ7ø þ¨ž‡ùuñоÇÎì4“DŒ)FÆIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-16.5.png 644 233 144 3133 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýO”WÇÏ ´ã耵v‘ ‰¥Å°š Øm­Š!ÔJi!m¥’nÓ5A£1Y01Ýf…®¶¾ò"‘]]!Úàâ %BèMÜ4[w HºÖøÂpgá™ç¹Ÿýaæa&úx¹9oßï¹çäž{DDä¹ð.`}Éú’5>$[Ë#ú9oÏy{éßCòQ,ïXÞ¹ñ'˜ÿõü¯œMÎ&£?"›vÓ?:^$‚Ígêå9‰(lgmg-ëÂr ¼—þ^úœÄü—n°·ÙÛ&‚ðñùÏ´6·6ó)Üÿþþ÷ÞuÞu‘M»éoÆ›xÑøRó¿<ÓþL»åØžµ=+Io%½õòg!‡¡—!?/?àNÌe}pàPë?~Ì5%›ö°¿oâ™ø&ŸÉÊG !7!W Þ/xßÞˆ&"Òß»ïZ ¼ µq’jp€«Ç-ºU·2­\ÆÆÀŸÕ—êKuCÝЋô"¦ñ½A/(cáþÂSÚ΄ @·ÉWÐ[Ðko„ÄçŸô4¼xÞ ¼õ€Ö«úÙÅ.õƒú?RFʸ`\2.ÍV U¦ÊTO<ñ=^¼xQù†oЀÅ,6Z/VVš<ðfT+ED–»ßî÷Çò¯ÁºÁºYØMžÀ¼À<&µ^­Wëði£Ú¨6 #•#•#• ¥kéZ:O,Tjþîáþ‡ûÁsùÞW÷¾brd{ 9Ì&}þà'ƒŸÌ}aî þXÕÊGøˆÈѨø¼âsP+ŒLoíHõH5¬ÎX½qõFT{}ûáöÃÂ_‰¯ÄŽíŽíŽí°fïš½köÂXÃXÃXCÄo¼~¼~¼’~NêOꇴª´ãiÇQ+Ó^I{þû‡»7ïÞ42aÇùçA/åcÅ&"’}AäÒ7JE¦Ž‰ˆX^Ût7ïPÞ!™qýèêpuˆ%akBqB±Hßå¾Ë}—EºNvì:)â*w•»ÊE–9—9—9EN œ8!³Ëç÷ù}~ëEk§µS¤dQÉDÉ„Xþñ×s¹çreæÕÃ/¦¾˜jyMJW6®l‰©çƒ?þÛøoÕYîϽ?Ô§á{´PûEû–/ÿ`ùp-óZæµLhßÒ¾¥} X‹­ÅÖbXR¸¤pI!l®Þ\½¹Æ3Ç3Ç3#»Â®©§RO¥ž‚œ9c9cR³tÃÒ ðóü; ï,xó ÔÇOŽŸÔYgœ3ÎpsnôàèAPÆìµ «3«3«z†z†z†àÌ­3·ÎÜ‚ûVì[±/’Àªµ«Ö®Z µ{j÷Ôî‰èÝ îwô¸{Ü=îˆ~mb9Àã‡l‡lŒýôCp&Îg3ÜVÁ¸`\°¸EÓ6jE,¿‘³A D$ˆ Ĉdy²‘a5¬†•ˆ³ÓÙéìi­j­j­q-p-p-ÙÖ±­c[‡HSFSzSºˆç·¿ÎûužHÆÂŒ‹%A$H±&ª>Õgq‡oå¿wÒwúÒéKÀfõQø`Ó»7íÎÝ ®.W—«+râæõÍë›×Cv0;˜„–©–©–)ðÆyã¼qPà(p8À3àð @]Q]Q]dßÎÈ€¿%5w7w3¾»QtzÃé ÀÕP>áÄŽö@EUE•IkdBÐôB‘³%“L2p„#‰š ý¡VPEUQúë\ç:`0ÃLdŠð]P j@žÉWQ[Q L†ò‰Ì1e¿g¿çÅÔµÈ3~¯ui]Lªq±(ÂgıF,èåz¹^F¾‘oäÅS FŠ‘b¤«YÁ Ðÿ©{tè;fÚfÚ˜4^áóãÍ´›iö!û?–sŽ=1ù·Ú¶Ú¢&ó„Þ¡wšQj”¢ÍžX…+ðˆ)¦¢'*àc”ÑÙZ+”ñ¡ñ!ô«úÕèÉoò=1ù{+yì­ ´ûÙc¶Åè%z Ó ºU7,‘M»éoÆ›x&þì[æåó4ÿ.žÚÿØÓùƒý?|ˆySÛ­IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.2.png 644 233 144 2673 14774263775 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜpIDATHÇÍ–]lSeÇŸ¡­)”ÁøÈЦ’JXØ¢°ºÈ—¸9ã‚‘ ³¶d’¨Œ°ÅàfÀ-nh*Æ% C Ã%$8X6.$&„! v1dа ×µPZÎÇûó¢çô•{Þ›“çëÿÿŸç9ï{^™n=Ü/»_vOKÛî¿÷ï;¯ü˜¶àÚâÚÒÿ9Úm9¡œyÝ±í¸Ÿ]/âàgóÙ~™.ŽÃsÂsÂUjÙû rqåbהּÝ||'}'é°óÔÎSáŽ0ŸB¤/Ò0^:^ ŽmÇí|»ÞÆËÆ—}ÿâÉ“;]Cà™â™"ó×Í_—_“ṄMë7­ž4ígígU£jHð›oñeøÓz,a‡{`×»¾5`í´Cô|t :€ZµtUpUrÚrÚrÚ ¼µ¼µ¼R§S§S§A±ÚXm¬6ßp|Ãqì ì ì’æ’Æ’FxpëAâA•ie·Í—æ·õXÂþ¨…ö‰ö 0>PYu©ï_ka –Ï\>sùLOŒ'Æ7'oNÞètºŽ°Ð½Ð½Ð=X˜·0oažã_¶{Ùîe»á`÷Á³ÏfÜ)ãM›/Íoë˜Ö=­[€HQ¤ˆY%›Ô,5ËŽ…•5+kVÖÀŒ‰3&`¤n¤n¤ÎÉ‹ììì‡áäpr8 çÎ5œk€‚¢‚¢‚"¸pïÂÝ w|sg¦2ÍoéÈ™š3ÕüÆîŽÝu<³íè_Ò¿¤ ô¶ö¶ö¶B´,Z-ƒ`e°2X áªpU¸Šÿ¬z_½¯ÞK›–6-m‚¾Ü¾Ü¾\'®Þ7KÌà‘Í—æ·õ¸EÌ3æן"úf}³ˆê‘\koÈå½—¿¼ü¥È¶è¶è¶¨HO~O~O¾H¬%Ök!H HGgGgG§H8‡Ã"J”(©>R}¤úˆÈPh(4Ø:P5P%âêp÷¸{D8dó¥ù3zþýÑnÍü¬ñ¡ñ!)û ýþF?{‹½Å^86xlðØ ŒµµµÁöÛl_¡5¡5¡5°Ñ½Ñ½Ñ ewÊî”ݹ…s çB××] ] Î7f.|æ7öô®´&_z\¿r•«(I’Y³ºÁ n‡8Ä¡,¿Áÿ­”óš¨ ~†ïé]éÊœâ‹ø"¿×Šveú•éSu™Rà+ðÉz9b>6ËOæ_ò‹ü"/ŠO®Ëu×)W—«KÄïÎw狨„J¨„ˆËãò¸<"ªBU¨ )”E²HDºdDFDÜŲKvÉcWé¤áIÃò<º5qkBΊ¿0Y˜|8Y$™—Ì{ã›ÿžüTx+¼Y'3F¯Ñ (s‡¹Íêš44À´:#F HYý›ûÜÆ­ü¿ÍÍæf4žçóÙøž Ý©§Nþgü+©{©î¥ ÀIÒg»ßQmT“uQ]À… ÛŽgFfÕÛx6þ3ÿ•Ïííâ¹½=Ÿ7Øcï)å,fèþIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-194.png 644 233 144 2770 14774263775 14776 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü­IDATHÇÍ–LTWÇÏðk[Xce«†&qÅXL6R  dâ@HM6ín ‰[ýÂŽQt!iº"ÛØt­‰®­† iŒPmÆbøÇhÆØ¡vuèNp³$–-Þ{÷~ö™;oºfÿ÷þórî9çûý¾sî=ï ˆˆÈˉ§@Z~Z~Úª¸ö¾»ŸývöÛ›ƒqûœž:OÝÃãðÒ§/} °úóÕŸ«×6~Ÿš/ââ§ò™}yYÜ ïïOYÂn‡†Â†Â켸}ú6øú|} 6¼vð@ï¥ÞKü&îNܘ)›)×6~oò ^*¾´ÿ¿d†2Cž‚7Ë›%¯U¼VñúáxÀèë°¯z_5ÀxúxºNçß@9º ˜g³¦SlãOÄ›|ƒgð ŸáëX[º¶Tjk}ã #ÝØ-¯¶¼jø¬>~Å!‘Ã%ûû'àˆqFï×ûA§¨@¯>¢8‡œCÄÀž±g€N>â#r´Á£å•–WÛðÕúký¾‹FÛJ%"ÒU~ñKRPX·Ú;úoΰ3Œ•ph2õ’^½F¯Ñk’C§iö¼Ç{Œ2ŠÖ¿So©·°€3œœ8>øóüy¦‚]å)­yãðMú&ç3 ú4úø€*ЃzÅ…ÙÅÜÅ\°Î[ŸYŸ¹B–{—{—{az`z`zÔƒDåÌú;ßó=ÄŽÄÎÇÎÃì–;~ì`1á­ânôNôàøžøžÌg= açî脃M šÚ¡÷Z;¬0óç™/g¾Dï9µ§cOÜì¿Ù³ßå­XW±®b¬­­AãÙÆ³gÁž³çì97îhÏÑ/Ž~³•++W¢“L8›ÞizÇTîÜ„°¡f¶õlìÙ˜lÈoþ3÷ñÜÇÄJZK>(ùÀ½»ÃUÃUÃUÐ=Ý=Ý= »‹wï.vfffB(І¢0T0T0TàæW×VWVW&Ãcê¯q>¾ë¹ÕsËjNYukÕ­_¾)ß–®,])"?ˆˆx.®øcN0'(ÞpwøjøªÈάY;³Df×Ï®Ÿ]/’/ù’/"“2)“"ìv;D&NNœœ8)ò0ò0ò0"Ò¥ºT—i¸ßp¿á¾ˆçž Ï„˜ååÍ8Ÿä—¾[ú®HR¬Î]«"0ýdú p%~íµVSjÊ­DÉ`É`É \ßt}ÓõMîþñÎãÇ;¡aKÖ†-°¹hsÑæ"Øþhû£í ¯,¯,¯ vmصa×È^Ê^Ê^‚ëþk{¯íuÇŒúÓÔá©Ã`ô¤‰¨¯Õמˆ`ï³÷‰ˆ%""k=¿eYN¾™Äúb}±>‘¬š¬š¬‘‘ô‘ô‘t‘ÐåÐåÐe‘ò@y < â­ôVz+EÚµk?&raôÂè…Q‘­­­‘¼Ú¼š¼‘‚533IøµžE»Ü.qõ˜3FÏlÏ,Nôü×öOöOÄÌ+µnkÝÖº îÕÝ«»WçVìÔéS§O†âæâæâf¸Q£þF=Ï­à@p 'rOdœÈH9c|±ž©ž)÷Œ¹·’¦¶¦6÷V‚=o»]£xƳ¦0aÂÀcŒ¥ì?æ1Aµ©6Õö¸=nƒºª‚*ü…¯ø ­÷[•Ve ß³¦æ¦æçn埀oÂ71ŸŽZQ PfީբúêT czN§Œ'âDœ8EN‘SV-ÏWLßÐcz Ô¬ˆI™cKÑ…è ü?ŸcfÐv•ƒ?ÛŸmà¬08a' ,¨zU•˜ý°±µT@ŒX¢ñ:1¥–YN©ø²: `ñÔéwúSñý^¿×Têg“ÿÿ|+iÙØ’œkVð!’ã¶Ø9à ú¶¾ €¸¶ñ'D"ßà|Ãgø“ßÊöïâ…ý{1ÿ`ÿ À ‹Þ@<›IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-9.3.png 644 233 144 2632 14774263776 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜOIDATHÇÍ–oLÕUÇŸ{I½0& óßœºi«9¸‘Ì©˜Bꬱ±ÝÒÕP3{¹²rõÂ9E·’1_ÁÚÝH ðÎ-2Q kN6¥Rš6±kãëÖ½¿ß9çÓ‹{ϽWË^{ÞÜû<çû|¿ß?ÏHvüWÀ»Ð»Ð;3{ßHæ}å¾ò¥­±ø„Ï+žW~ú²³rZrZôÍdlç->µ^$ÉŸªgó’-ÉÄŒ¶mžÒxü)¼ºâÕ¾ÜXÜpÒÛÓÛÿtáÍŽ7;Î~qö Þ‚ÑïG¿//…dlç-ÞÖ[¾T~ùô1}˜˜ðÜ…ÓgLE›mZòv 0¼*¶Vl¸Ÿv?Íx@L2M)0ÅvQ¨@Ï×eº øFçë| ~×êýgKéüTûª})Õ¯ú£·ëí8ñÍ5€ƒ ˜`‚ À Ñ€!JøÛâõ½TŸêKå·zÿêüOøVR¿ ~A‚ 8ÈA2Ár§T­ª%æ²¹ €$c;oñ¶ÞòYþ'~+ŸÚ×ÅSû{:_°ÿR^­m~(³IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-151.png 644 233 144 2612 14774263775 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü?IDATHÇÍ–kh“WÇO²nm¤s•VpX;V5Ã" ň&sTZ7‰E‘!Œ•âeŸŒAtû°âelݰVÆÊD”Ù1ª`¬ÄvŠ´› ê…]ìbZ¥×HbÎå·yOÞl£ß=_’ç9çùÿÿçyÞóœ#@!D…ó+À»Ä»Ä;?o{?rýeï–½»ô‡¼}Zç}Ïû·>W¾yå€ :uµí¼]_/„‹_Ìgý¢B¸ŽÒs¥ç<›û3h^Õ¼ªlaÞþ²||ÒZ~jù àÇï~üŽ}¼ž¼0±ib¸¶·ëm¼Å+ÆŸý‡_x±çÅÏïPúRéKBÀko¿övíÇù÷j¡iKÓ€‡/<|Áx@å”›MÀ 3Øñ¸È¶óÎzoñ,¾å³üy=ªÞ¬zSxoÇ{;|ßæ]ÈÈâÈbË—»À:ö°‡rÎʸŒ¨° “5Y}E_ó·Nê$˜q}^Ÿ~QKÕR² 4ÀZÚh£œï<"Õ‘j@:|þ¼·”Z!Ú7CX„EAЀ‰ÊCò˜»*¡äœ ÃcðH$ÅÃ`ŠŒ¨Ùav`Ì]ã1r`L0›Ç‡pe¸Òf°}sQ)…bEøR¾ÔL ŒÌŽÌƒ4€¹anð4ý -Óäër‰\âOWNWNWB*–Š¥b0ŽGAÞ–·åmw]újz,=¹ÙuÙu|ùðåÃ.auº:]‹¿Åßuº@]nm»µíÖ6ȬϬϬ‡P[èHè\ÜñÄÅnNõ¼<´~Úú©ÍÜé~GØðÞ8S}¦ºP€ÓO¦¿žþšl(ÚÚïžÝ¾Ö¾Ö¾V˜òMù¦|P³·foÍ^8;;ƒû‰û‰û È3ÁLÖ ­Z3äÆÇ¶ÆÞ‰½SØWVýšçƒ3Sg¦¬°áæÇçÇÍ9f“˓˄#m¿ê ¨WÕ"µþ€?à‡Þ¶Þ¶Þ6ö{‡½P»¯v_í>ØÚÚ‚e;—í\¶îuÝëº×åf6Øl 6B÷Âîªî*ׯþ°ÿ’Ád¬ ^^ð²¾GçòÇÞ=¦Ç\€?äùáRøRøRÆc‰±Äûãýñ~wÝÆk¯m¼í5í5í5®¿¾·¾·¾º›»›»›‹„¥l›qø=^!ôÏúgÏl’MBˆœBˆ*Ox&ž‰ÂÈôdz2=B”K‚%A!'''…Øýd÷“ÝO„èœìœìœ"µ2µ2µRˆ:U§ê”/ʃò ê/õ§úÓõ‹Ûy>!äV¹UWýÆlœš7ÊI9IÖî,:/:/:ƒÁ€»ããÇ;Žw@¨"Tª€®G]ºñ¿­ÖGëa°qð­Á·ÜoLßósNeáTØS"g¤ÛÑ ue7¹ÉM@£ÑEþ«\å*ÐDMEþ³ùÞeñŠñç<•+: }ÄŒäFrà5€ŽèOõúsý9à5ÒH`”QFAR§Ô)PQÐ!Ò¡"á–z·þBfR5ªÆ¢>ötdzdzÎ>fmûf—…Ë Û5 €´Þ®·“sz¿§ã'c2dœ¹|—zƳ¢ âU\Å‹ñÃ¥áR›©uþ9îJ{—å.Ç8F¹[µKí" ¦ÏôàÁ®mç %sâ-žÅŸó®|n_Ïí{ìù|ÁþØÄ_†ýÞúIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-163.png 644 233 144 3056 14774263775 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜãIDATHÇÍ–mLœUÇϼT˜tR°¡©EÅV?H²! }‘¤‘ZZD3tiiÁ(4-¶ê¾$!¨ëË6.)[MÚlÔ-!EfÅHcD°#hMt·cÑ6MEy«Ò™Î•úÔ#§ãö e޲ÿÒÞK{àÞŽ{;Ì m[~+>9_ÄÆOæ³Ö%]ì…”3)g… û-x&癜ÔUqûÈ(xüÿmj>¬ù ¯«¯‹ßÃÔçSŸ„ C…`ۖߊ·ò-¼d|yëÿøE`ÙÀ²ÇUH¹'åxèɇž|øñ€†Ò’Ò€IפK9À˜¼xU!&Œõ]O²-"ÞÊ·ð,|‹ÏâëÈØš±Uv=»ëYÏÉxBð}ôÆûï·ø4?ó2/ã¥KÔŒf£™EÞW5ªÔ˜9fŽUŪÀxÝxEþ¦·ê­ ¾äyžÇË?x$ðõß\½•¦ˆH[”K¹, ¨&½Yo4¾5¾EK8¢šj0ûÍ~³©b¨cê˜:*Ke©,P¯ª·ÕÛ(à>@S«ÍR³ØLJòŒò bñKr³eÏŒg&솉ÈDø¨ êÑ۳єh hmD±…h×µëÚu˜«Ÿ«Ÿ«‡ØØØ$‘V¤ÁÜö¹¢¹"ÐÇNÇNM¸}|1ñÎÄ;ž°'v[zÂN|Æt]M]gæª-Z®– ¡£¡žPjóo7goΆööv›¸j¾j¾j–û–û–û`[ζœm9peWöÂöÌí™Û3!½&}_ú>Øóîž¾=}¨Ø¿¢§¢§l>vÕ~]ûµÕ{'>sÆëöX¿=1ôÄP¢ŒâXÿ_ÿ¾…}óÍú¾€8ƾ»4vI$£<£<£\düÜø¹ñs"ÃÃÃ"[[["ùëó×ç¯iíiíiíqŽ:G£"— /?}ùi‘ñÃãÕãÕâøÒ{áã KÌâS¶toé¶øëXñéŠOÕ"SN= ½òsƒ¹Œ5Æ}Æ}W™W™W #¹#¹#¹0°{`÷ÀnpV:+•°vÇÚkw@ÉPÉPÉDTDEDÛ¢mÑ6(h(h(h€•ß­ ® Â\ïì+³¯$õæ?ºôÓ%°ô8E\¥®R~#ÞeŸ,ûDDþ#""¿È»2(ƒ"®)×´kZÄ}À}À}@ÄÙëìuöŠDFFŠäeçeçe‹\={õìÕ³"q!"Mû›ö7í™\5¹jr•ˆµµµÈš¿¬ysÍ›"ƒ±Á¬Á,«Bò‹ ¹;Ý"–§ˆù‘ù‘㢠—ê¥"¢‰ˆH†#KbV¡EDtÑE‘ˆ+⊸D6ÍlšÙ4#2}múÚô5‘öÌöÌöL‘P]¨.T'2[6[6[&RQPQPQ r¾þ|ýùz‘ÐK¡C/ФÒ:Ó:—à3d§Þ¡wˆØzùªºç»ç€:Àïô›úM­R7ùš|M>¶· «¸«¸«òýùþ|?tŒtŒt$Ú–Þ–Þ–^ØxqãÅáäÍ“?Ÿü@UEN%øF»û»û­æÿªÁ>•Ô½Q÷FÒ)AëöDW,0ϼMÈ:Ö±8ÎqŽ'­ j©¥–;¿ïFñw½EoIâ3ê^«{Í>•ÉslÊ3v£&´ 0­9f6šDÍjóˆyÔM5£flÓmºM7ƒÆA0wš;Í@e”Ñj2qÈè3úÀÌÔšµf¢œ³ð¿÷~ïtÏžï˜cÖ m+‚òÔòT{òƒ0Àm³Â¬@KÌ~èè€ÂÄX`!áSñd´D$(ÌçÌçЖð–ð-¾;&ÿ¯Ü•4>Ðø@Ò] ‡9Œ×Þb£Ê¨bÔ¨ÀlÛò/µD"é®Làÿê]y×¾.îÚ÷ØÝù‚ýdƒÖù„¶\IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-84.png 644 233 144 2461 14774263775 14711 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜæIDATHÇÍ–mHÕWÇÏ5Ë+¨¥dÔ*Ëîµ& &¾EÂL¶{¹Ý˜ö@Ϲ(c‹ E/j£XÚÌÂc!=¸´``µp4ÑA9_ØR3äz›x½ÿsÎg/îýßÿ£Mö®óæÞßÓ÷û=O¿ÿ „bFìW@Âü„ù iQ;áSËï,s–¹¾Ú kk~;Óë¦×¤ŸO?¯Y¶7óíõBXøv>Ó/fË‘t9é²£$f†µykóœ™QûëNHnMnýÓ€×w^¸váÚ>ƒ¡{C÷FJFJÀ²Í¸™oÖ›xv|qøüBÀÔ›So:!iZÒ4!`Aé‚ÒEŸGÏãó<Ÿò|ŠNùBŠ.B„0ǰÍ6ã±|³ÞÄ3ñM>“?ªGÀÌ•3W þõþõÉMÑ‚Gaï¼½ó Ò 4Ð@ ßÇŒc {ŒÅÆbÂ4é­z+©¤è€Ç!cˆ0S#ã‘qi$Å‹áÇùLþ¨ñ÷½ýæC(w–;q€H7È19¼'ÈDô|½J¯B›K¤3tºN )¤0¾rèz“Þd™HµEm!²Kv™îHwœ/Î/ì‚Þÿ’‡’‡B‰Ð/ûeðc~T™*“1Ó1Ñ9Ñ1ѯ|¯|¯|`¸ —á²q‡;Üpu¸:\ Áœ`V0Ë¿§\ÊÅ*†ç3ù£zbÂ~†]w4«U¾~ DÖŒGºFnÜï¨wÔ; ³çΞ;{.øËüeþ2Õ†jCµÿ¾Š}û* t´t´tÔò«¯T“jBó»ÑgôY|TOLXßp)x)hm„üu¢f¢†°éiËnËnËw«»ÕÝ 7?Üüp3,¼ºðê«Ðý¤ûI÷è)î)î)¶ˆÇïñ{ü6aÍêŒ:ôÊjYmâëT€´»iwõe**°‘_ÔIuÒ²_»^»^» wiîÒÜ¥v"íDÚ (  ƒÐŸÝŸÝŸ žO‹§6äoÈßÞtœ#ó˜Ç€F[Ý ô2½L/£Ëè2º@ÝP7Ô  žzêA¢½ÚkÃ3^/'½•oéc†ÙgT•ªbŒ>„Aþ [d Èýr¿Ü*Ke©, ‰&šlBÛ£‡[}©ö¨=¶3>®*Tc±IMÖÇÞÒùXçujµ]m'Ÿq˜7¼‰ý·­\|LÄâfªRUþ¯Î?É·2 Ð å()`„Œ€Ü(7Ý©;pàË6ãf¾YoâMú­|g_ïì{ìÝ|ÁþÜ«\B¿u=ŠIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-35.3.png 644 233 144 3227 14774263776 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜLIDATHÇÍ–ûO”WÇŸ¡Rf”Ûš¥Ô ЉJ\ ‰`·°Ín7¢¢¥ÑxÃm¨—íi¬‰ËÆêš•PgÓKZÅàNeš‘‹—¸Óå/›º‰µ€˜ý¡PÍ ×©#ÃÌûžÏþ0ó2³ëþž_&ßsžçû|ßóÌùž# "" ¡_¨ÙQ³£fqÔoÂóæ×ͯ/ø[¡iƒiC÷ïaæ§3?H<›xVÆÆº™/æ¬gÌK‚„'bì1vÓÚþÞ\úæRóO‚¸æ:X.Z.> ÀÛÍo78lûà‡?ÜY;²ÂØX7â|ƒ/’_>üŸú"}9ú²éßórÌË"0·hnÑüß·uo¬{àû—¾IE€æâˆSkŒáŽÀÆz(ÞÈ7ø ~£žQ?¨G ¥ ¥@„Ï‹G‹G-uÁ„õ|\yºò4¨vÿEþŠ q¨À£À#P¾@i ŸÔôP.Ý­»[ªZUhåZ9> †€j©%Nu|•öJ»!ðA=)öû,u†ùïÞ~TÈ+%9%9 Vø;@ýTëÑzð“Ïæ ¦öh>Âã^¼x¦RC(õ }¡¾?ð#?‚Š ñÿº¤¬¤ÌøQaD+ED}Ì?,ç,ç<Óàá쇳Á €_¹r[[ñþxx xpã†ñ¸ñ¸ñ8xâ|â|â×A×A×AÐbµX-–ç†ÿOþV+¸~þØö؆7p4È}ž>pÓâ°8<Ó =¢L""_´Ã^m¯£U 3¬ç¬Y™Ÿ™Ÿ Nø*á+T©­ôtéiprr‚ôòôòôrX|sñÍÅ7!+'+'+º'º'º'‚†›‡›‡›aÍÏÖd®É„ÄO‰TÉ©âšâ˜ü@ÏwÆÞu)¨GE""ÿª„kãׯÁÕòmË·ª,oFnsn3¾áÊá=Ã{ =;=;=Î]8wáÜÈÊÎÊÎʆ£ê¨:ª ÷vïíÞÛ ®ª«êjX˜ÍkóÚ¼—œ—œ— #Þ÷ˆ^IœuiÖ%|í³º»U´ªVZMP06£yF³²³aðøàñ0¡§n|÷ønȯÎ?‘æÎ+œWçœ_p~,©_R¿¤VYWYWY!£6£6£ú;ú;ú;"zX@àqzœ'¬Þ¿zßê}ô]b]b¸>;;vÀçÎu<¾(¾HÙ£øÒ4j%S.Æ¿ÿšH·Ö»·w¯ uy»R»REZ×ú^ë{"I I I "÷ªîUÝ«±—ÚKí¥""i‡Ó§i27™›Ì25î.»»ìî2‘®ž®ž®‘–þ–G-DRÿZŸZ/rõË+ÑW¢eH$©*©JD9Å,f2£T“¶KÛeº/})ú’È_Þ¼3()[F·|³å‘öØöéíÓE&œÎ §ÈÀ­[·D¶5mkÚÖ$r&íLÚ™4÷F÷F÷F‘¹És“ç&‹8v8v8vˆ´Ío›ß6_dûÉí'·ŸiŸÞni·ˆŒì))™ù0Ⴤ$EÄçõyEd«ŠWñ¦ûB¨§ü½¡±¡ÑØUöGóû;¾—WØWØ¡î~ÝýºûáØ|bó‰ÍÛ™Û™Û ñññ0Z0Z0ZÅÖbk±\±®XW,T·V·V·Âòå}Ëû n¨ÖZk5ŒF•q¾áTÃ)à‚ñÃ8•åeåeÀ•Ð)QÚ»Ú»S:ßq{@T£™tL:ðêKõÝún œìÍ¡94hûµýÚ~Ð×ëëõõÀpô =CÏ2‡9 }¢ÝÐn€vdòÚä5¼zjÈÇœ}‹úXú-ýži †|ì9çg“y“‚ÞîïdBkÓÚô]ú®©oV(&™&xƳˆRhhÀXЈCw„Bé;õø™Ð¾Ö¾ž²ÝNس)æÿ:è®dý[ëߊ¸+yÿÕ÷_"¸ç8qð<ÚVm+>P×ÕuL˜ Œu#ÞÈ7ø ~£žQê®|a_/ì{ìÅ|Áþôç£9"ñ#IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-27.2.png 644 233 144 3141 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ÿOTgÆÏP'+4•Ø0"†èf7–%Ú¥Ú/‚0´Ý.U´î’&Ý´ü`b²Ö5qPYÁ´ljšbÙM ĵEÃàP…¥ ꦻiE%l:àLœ̽÷ýì3—;YÿÏ/7çœ÷<Ïsß{ïs_ÉH\R²S²S~ÏSþ`ÕïX¼Ãù÷x~Z[¹­ü‡?Á’¦%M™_f~i Y¹Ù7×'Ï‹XøÉ|f]2Ä*¤¶§¶ÛŠùxsý›ë/ç¹öN{ç# ª/T_èhéhá0101, •›}s½9oâ%ãË‘ÿã…ß,üÆ6©‹R‰Àª—V½”ó~|ÁH”¾Vú€ÿ)ÿS*ôFš*„1c*)7û‰õ漉gâ›|&\@Ö‹Y/ŠðٮЮýL|`¨Ï´hÕëä:è .íSíSP?jµÌª°ñµñ5¨;ÆãP« T€þþ³ ´ðW¾à ÒÔ· <Ï“Nš‡Úø|×Ì®ûÈ*Î*¶žiâz²˜¼Š-[@åÄþ  {½ÄÔꂺ€šß£GÌ0ƒQ~æç¤<[ÅT ¥~mdYÄæñjãøê®;ꎚO'=J‘µŸÐmoµ·†ÀHîH.ÄÞàÕûc“›'7Ñþ£éš±ÊXE¬5š@ L5M5M5Ap<8‡è‰è‰è ‹Øïbž˜ù“Ç&‰ŠãÃȳ#Ï=ö6{[x©'…‘š ²ýûïÜO×ÂÑÕë‡Õwå+m¯´I—Ó›‘›!öò½åëË׋œ_x>í|šH¾äK¾ˆlîÜܹ¹Sd™o™o™O¤¹¨¹¨¹Hæ#4‹¸ËÜÙîl‘ÜÒµékÓžmi¡§Ð#]NåÔäÔ¨ R¼ÿÒþK隺žÐ£­ù×èNïN‡–Cw^Ü©öçe9»œ]Ìšw\ØWØWØuZV§Y;Ñ{º÷tïiXå\å\儱ÐXh,dõÏêgõ³:ä-Ï[ž·ÜªÿæýMK6-a¶±±eO˵¼O{ŸmQ\>š>ªÚ!°'°îm –KÀ?r·õn+x뼯Öd®É\“ ½Ç{÷·voÙ½e÷8uôÔÑSG­ºá3|†&ý“þI?ø£þ¨? Þ?{{Ú«c«cpµõ»¯¾û œÎ£À1ë˜UíBGFOFq ÷ÔsSÏYŸ}­ý£™fÀuÄuÄuúýŽ~‡E|ÓuÓuÓÎ*g•³ Bž'ä±újŸÚ§öYy­½Ö^k—Çåqy` «Ÿ~«=¥*/^f2m™6ã–è;žw<¯Ú!’Ɇüûòðåaë[mkm…Ö”Ö”Ö˜*›*›*ƒƒõëÖƒ{{{Å0íöN{¡ùaóÃæ‡pnðÜà¹Aí²]¶CCvÃʆ•ð·‹mÛÂíu£›F7Lßž¾ ê½ôüô|Õ¾@‘¾Hß÷ƒ"¾½¾½®7,\z}éu~¿ã·Ûf·ÍÚ>óýÒçð9$Õ?àðˆ899‰dÔgÔgÔ‹TEª"Uëe×*µJ­RäjõÕê«Õ"[[["%WJ®”\éùoÏPÏȽ ã?ÿ$su›W4¯à½µrë™[ÏØÎ¨;3C3Cß&ìât¼ûò»/Ï¿!¿ý²~€¡$ß2â>47¸Á `‚ &’ê •4• ¼yüŸÉ×#t$| û°}8¼@õ»†] ‹ûŒ~gîÑÜ#"úÇú%ý(]ETŒ{Æ=㨠U¡*’hi¤Œ£À(U¡vª ·é#úè?Ìç‚DL|õmœÏä7õ<îüs¯Û^·Ó çéÝz7ðÀ(1Jˆ¡%öãA‚À,Q¢I ttà!ÓLCÂpŒR£”Áž‰oò=îü‰%eo•½•ô¯äÕ®œ÷íNÀƒ‡4ÐÂZ@[›YP×Ô5lØÀÊ;¹Þœ7ñL|“Ïäëy’OOìyìÉ<Áþ#Ø3ÛOãÛIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-1.2.png 644 233 144 2533 14774263775 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[hTW†×Œæ11‚·4`%*MÀ&•qŠAEðmBH}©UŒ/V¼áŒ`“j‹ˆ ”iƒ&¢æe4æ¢)-¦4 †D!F£F:fÈäœ}öׇ9gÎX+}è‹ûåœí½þÿ?{±×Ù""2Ñ~ x³¼YÞ´(ö~ïÆ“—&/ý¬>Š+ð¬ñ¬¹³ Ò¦Ȩ˨³z\ìÌ;ëãóE\þx='.Å $5$5xŠl¼ÊòÊò’?‰âšvHiLi1aÝ¥u—.ž¹x†0Ø9Ø 0\4\.væõN¾ÃÏ/ûÿ¡/ W®z )1)Q²—d/™¾)ºàÁtXµ|Õr€à¸à8í5¤’ª‹€!œñ<;óöz'ßásø=G?êG saæBX]¾º<åt4¡Ç[¦m™˜F#p’“¤â3ç˜s€_•(!ú®¾ Dô˜ƒ>f>5ŸÑ¿ŒÀ^¶³Ô¨Q£sËÔ-Sƒ=~W?êGÞ­míbtibi¢³Æ-PݪôV³×ìÅÐ÷ÏxtÜ 1„;²È" ô—:GçÄ¢ZïU¹*Cß5kÌš8þp‰Ub9kÇ•RDdÖ/2˜2}ªOÅ—ñ»•cåv#¯Gž<£ßè7úã ÕRK­ £Â¨€¡Ï‡f Íc¿qÁ¸ 7éM„¹aóÇôý¨ÛØñذ{Ãnà1€5Ì·æ[Ð_ë ]þiøàðA˜xþáù‡¡¹ª¹ª¹Š÷F(7”Ê…çWœ_qÒw¤ïHß¾ßßxqÿEøEØÝqÝêèÙú¶ÛØŸ?À¹×ç^Ùú; ‰&"#/G‚#A˜·uÞÖy[ÝŠÅâ÷ÝsvÏÙ=0sÊÌ)3§¸ñÂÍ…› 7ÑÖ#ÍGšcáˆúÊѳõm?i­i­º  €·vJ>¥O®ÒõFP“Õd5æ¦ÍM››MyMyMy®°uźb]'Á'Á'AŽGƒ£ØØØ999Ðö¸íQÛ£¸¼uΛ­oûȘ1ÁºÏ=wžÓ éc µÖZÇ}ùÎÂ…;¡©¬©¬©Ì«jZàâm)ÛR¶¥@~u~u~5tfvfvfºóúËgù€§Í8úQ?^ë²uÙsOÄ,6‹E$Z¬L1¥GzD<Ÿz²f}k•Ye@"‰$ÝtÓ Vž•gå.Ñ%º”_ù•ÔÕ¥º@ý¨šU3èjššã[ÆÛ¾W}¯>ØÇâ:?¥É¥ÉŽ ã¨›ê&€µÖZ‹aŸZI˜0 ±°€7¼á a”Qà%Oy Ûë_ZÅV1cªEµÄó—&•&9;õNçÿe” ¨¦šT·ªRUÝ®Ûðà;ó±’ÙùŸÃÿÁåG{»øhïcç öoÓ(DsšB-IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-37.8.png 644 233 144 3212 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü?IDATHÇÍ–íO”WÆï 2yQ\ðµµ›âf'ºhq¶êÖ­©¦nÑØ·HÜÝbêfMjc£ãÊ­‘´$:ÔÊVÛ50÷ƒfÍfŒ›ÖM»:•&+)P™q€ÎæíyÎo?Ì< »îàùòä¾Ï}_×uÎÉs# ""yɯ€y±y±9'›—Êg¾”ùÒOÿœˆÏh`ÚnÚÞ{r›r›ò[ò[ô;©Ø˜7êgö‹¤ðgòyÉ“Tb–s–Ó´!Ûáµå¯-Ïœ—ˆ?ð€¥ÝÒþcÞêx«àÒ§—>å÷0rcäÀ؆± Šy£Þè7ðfâ‹ýøE ãJÆÓ¿`Ö³ž'7=¹éé?$ ž†­[¶nø.í»4eÍd“­6!B#0#6æ“õF¿gà|B@Á /ˆpºb¼bÜr.Ñpç3>¬m®mõ7€X;\âÙtÅ?Šª/þlüY"*¤wé] |ºO÷uê9õ€¶OÛGâþ¸8ÍÇ|L¶êNâ¯m­m5ÞùŒ?UD*"–s†ùï³=¹‘;Jv”€ú@¬fÔO´»Ú]bl¤˜bÔôE&5ÂL15#^ ¦ÔJ-Ö4M#L2 Ê’Ä_½cËŽé<¹qÆQŠˆüìCþjùÜòy(,†Øxy4üý«ß¿Ê¤Ö¯›tÄ6ÄÖÆÖ‚¿Þ_﯇@S )ÐcCcCcC>>>Î##ꉣAÝ:âq1ÿyÒÒ¥ÕÒJ7ôˆ2‰ˆœñÂ^m¯ãï$¨—üzÍ:ë:+伜S“SƒªþeuIu \.½\z¹òóóaY÷²îeÝq>ã|Æyhr5¹š\)Aú@} ÊBe²--z¾èyÔ¶eO•=Sëôx»ñíFPï'ô˜õ""¶N‘­“['E:ÜCî!Óªx¼!Þ Ñû»ï¯½¿VLWqÕvÕ&’u#ëFÖ ‘±%cKÆ–ˆ8"Žˆ#"²àè‚£ ŽŠ”{Ê=å™=Å=Å=Å"¾ë¾_ȵu׿]›'¦Þê¾ü¾|‰z–±î‹u¦U"[–nY*¢Î%õ0‘Ó‘Ó¡œlnnH­4tî‡7xÖ×®gý;0çÊœ+s®ÀƒòåÊSu»öïÚ¿k?4k<Öx,•×§ô)} ΀3àëfëfëfÈ=’{8÷0¬Ú¾²pe!Œþ8®Æ€¿ßßêäì²ÙeÊiæ¼iÜ4ŽUÚg¿8ûE‘^훽ß앇·'oÏ¿=_¤óŸ½½"…Í…Í…Í"^·×íu‹ ¦¦¦‹xë¼uÞ:‘ݦݦÝ&9 䀈Ùb¶˜-"Îg‰³Ddî¹ ç.™8ùG-W/¶]l3BUË<â<â$²:wuÆê 8Ûr¶ålKê¨YYYÁíp;ÜŽT~Ô>jµC…§ÂSᇶ‡¶‡6pÔ9êu`˶™mf8w|âø„ˆÁÇ×==À…„ž¤]œñžê=ÕÀ_’‰Òöiû¦ùwé£8Å)NÍð›Üä&0Â#Ú'8Á À—ì7ð&´Ú  Íø+÷Ôï©ô„Á—ô1,>‹/”ŽãÞš{k@{/á3ZCÔu3©çê›ôM@˜ &@÷ê^Ý ªRUªÊBNsšÓ çè9zð[^çuÐþ®išÚ{QWÔŤ¾(écm÷ž¹÷ €å[Ë·¡t“>öˆóóJæ+™ðöXaíºv@¯Ò«ˆM¯øß þç×ÑЀ  ÔtÄÀ3n–$ߣΟ¼+Ùöƶ7fÜ•¼»èÝEÓí@ dC<h•Z%PåÀ„ R±1oÔýžoðüÓwåcûºxlßcç ö?ùÞ0>µ‚wIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-66-grey.png 644 233 144 6160 14774263775 16020 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü %IDATXÃ…—kPgÖÇÿOwÏ 3ƒÜÔÃ¥†K’ˆÃÅh…A–ˆZdqÕÜÁŠdÑ×R)ÝX¢$ ¤²¹HêVJ.ê«oV.Ôˆ$H ARЬ¾®C("Œh3Œ0מ~öÓ$åV*çK×ÓsúœßsÎú9M áƒy3Í_˜µÜ(7ÊÒ–Â … /ЀâÅŠü)šúR_êûñ_ù@>Œ{ÛÞdo²7ÑPjT“|D"‘1ˆAoãm¼M?’½${IöÉçîs÷¹û=ÕÄHŒÄx¨ªÈ¿È¿ÈÿZ_IVIVI™äCùP>”¤Ïs7Ü\>Ì`’ÄÔ ÅB±P,ÜpÌ9æsO¬*Ök‹µucŽIǤc²õ–å9Ës–çâÞQžPžPž@s\j\j\*ÉWKÔµXå·Êo• ®ÅßEñy1ÞB|w>1¿È#òqî ®¡^Ô‹z ¯“dÙz‚ eCÙÐoNÏÕÎÕÎÕ†ø-n]ܺ¸Õu u0u0uqÆèbt1:²Q–/Ë—åÂÃ8ŒÃPÀ ,¶c;¶X†eX‹=ÈdÂF]‡®C×Am‘m‘m‘©´©´©´×>S„*B¡«=\;\;\;Ö 94‡æŒ¾N@@À¬a„#ÂáˆÐI­ÔJ­A‹XOÖ“õüFå˜qÌ8fBþ±!bCÄ>)×–k˵±{æ+Fædi²4Yx!]HÒ¡ >Ô‡út%]IWt]F—´‘6ÒF(æ[^|>מkϵ³{Äøb>1¿È#ò1òny·¼H$o·\µ\µ\ Ù–––ÉoÌÉÊÉÊÉânz7y7y7a‰+ÕáÊp÷pÌ3Á.à.d”Œ’Q€T’JR @ 4L0Á ( ¼k½k½k±DŒ/æó‹<")n)n)nI_åèvt;º¯v{=òzäõˆªrïçÞϽOº}Îùœó9Fh…Fx1©L*“ 8¶:¶:¶L'ÓÉtÜ#î÷@9ÊQ¾lÄFlï;Þw¼0½L/Ó p NÁ) aC0›²MÙ¦l•••Tmö6{›½‰^ª–ª¥ê jŽFÒHyt³SéT:•€¦DS¢)AªÏ×>_û| ©pO¸'܃‚¬'ëÉz@©ÔF]±]±]±›Ïæ³ù@z^z^zx<ñxâq@à^àæ¥ÍK›—]k»Öv­ØìNv'ž’ž’ž$"‰€—ÏyŸó>çaѨ5j©õåõåõå€$H$ :º™áU¼ŠW%äúþâû‹ï/øh…f…f…†T E(‚”YÎ,g–™™™@gBgBg°½k{×ö. m$m$m¨ñªñªñŒGŒGŒG€nE·¢[ܰݰݰýÆ4m4m¨+«+«+ þƒ?D“ÆHb$1R!òˆ|88spæàŒðQÝêºÕu«©hs®÷\ï¹Þ[XÓS·NÝ:u‹ÒƹƹÆ9Jy)/奔šýÍþfJ(µ¼eyËò¥UßU}Wõ¥™™™¿ñO0'˜(↸!ŽRÓfÓfÓfú¸Í‰<"‡ð> ‘ÌEæ"sqag2¦„)aJÛ˜mÌ6ÌdÌdÌd393939€nP7¨¬¬•µ²ÀšõkÖ¯Y„L…L…LSª)Õ” ˜¶MÛ¦m¿úÛ>µ}jûHêMêMêÂÂÂ*§r*ˆ•X‰2æ æ æ •¨D%‰dØ@6 ¤—ÌñæxsáËFüGüGü饻swçîÎ-TÖ*Û'Û'Ûø´û´û´aýaýaýÀ"í"í"-ìv;E©¢TQ ð›øMü&ÀoÚoÚo;v6ììoüÏŸ > ,ŠY³(0^4^4þÚI«>[Ÿ­Ïôú ýŽyŒxŒxŒðe¶` ¶Us)\ —ò÷#mimimi®°ÐèÐèÐhöG¿f¿f¿f˜£¶Dm‰Ú¯vW»«Ý···†jCµ¡p-q-q-TDET°6Y›¬MÀW™_e~• ÌÇ …†BC!àšpM¸&€èèhØÝ Š+…W ¯ IdÙ@607I2I&ɧMLÀõ€ë×?,j¤©¦v|jÕÔª©Uì—g/Ï^žuíwðÒH5Rög?{üÙã@M`M`M ÐSÚSÚS ¼|îås/Ÿ|y_Þ—ž7ŸÏçó!û<üóðÏÃ]“‰“‰“‰ìG¬G¬GlÙêù?Í›B…P!Tp'ÝÝ+v¬¤¤¤¤¤f±¢pßXÐ[»ûÝÚ=éÖnãiשujü.S•©ÊTÃ0 Ã`F¬Ä5ë5ë5«`¯¯¯`‡< < < úšíö ûDÁgC/½8ô"à ß§" È·ú°è pètk÷_ÿ¥Ý@c 13}Yøeá—…®ýˆ@"à­óÓùéüp®£»£»£›¼®P (!LÂöÜà^å^å^µ>¯R«Ô*53íηI<¡çbñ;–œœœœœ Þ½ÔQ)•R)ùŸÉ§'Ÿž|ÿëzÊõ”ë©[¼L%SÉTùÇÃu×=\çwÙÔoê7õÓOsþÎyךYç¬sÖÉæIÖJÖJÖþ-ˆVÑ*ZõÍAû#¦1ia™Øw¡øÇyþÀ~G»ÅhA Z\E´‰6Ѧäa¦i`¾UÙ2l¶ áiI…¤BRÁô³9l›ÓöÝü”ô§dý°~X?L¾žžž §Ýqµn@Ëïq0ø{L»î×…«»±»¹’E²HV{8m¡-´åÐvy°ÓCHNJN^.z¹è•ßDS¯@yIy ÀLüL¼ŒÕ¤" %–п¹[Gñz¾^O¯¯óéü=2ÞÈxCþT1_1o¹I¿ÂŸÚÚ@þ ÜÍI¾â+R@ñ)>µAm ˆ]–ÊR Q&ÊD9&ÇUݯî'ˆ¢”—¸D g¢õÒrruãWè¨Ð*4Ë%Ȩ˨3ö4úw¼Éöê‚ê9á;€†ò„V§Õ–ÿ’7åM¤¾D²N”1> >÷J&´×µ× Ë_)Û”mº;|µfcÍF] ã͘­BˆŸþ·¥ÝÒ¾”SYSY~€b_Î÷g¾?ÃJø“ðåðå.\¸ x4x4x²²²bâ 0Ìò˜Ç@(â]éYéaeáÇ«K«KÔ}Êx,,–˜èÒ*„<ðý;,®hy¥×ö^Þ{Ò>Ls¤9΂+W`vavavÁà?¶xlñØ"---~­]k×ÚAñ+~ÅoøÖhk´!‹Ö (üá9:OûËáÌÙÀ­ˆ¡üD!î6€{{´ý®·´·TÖoÏȼžyÝØŒü–ü–ü¸˜s1çbŒNNNPRYRYRißß߈YÀÄàKl~›_¯/ëµ[ÝÝÀß"z[ÖM¯›–Nðô„Ùݲ@ÌLyÛ½íàþƒÛáv@öýìûÙ÷¡÷Pï¡ÞCP½¡zCõØçßçßç‡Ò=¥{J÷Ĭ˜Y3kf4šÍ`K³¥ÙÒàÀ§š4AéŽâåâå˜Öü÷ÌÆ™€/Õ™ê”NAWú@ú€6ÆÏç¬sVãØbùxùãeØ9¼sxç0ŒŸ?5~ Zµ>j}&¯Ékò‚ÕcõX=`^3¯™× ë|×ù®óa‹½ÅÞb‡øsñçâÏõ®õ®õ.˜×’½É^è ö¿ßÿ>s°š°šZYjmj­6fRO¼´ë¥]ÒÚ÷Ð÷Ðôvï=Ï-Ï-!*òÞÚöÖ6!gÍŽf!¶¶Îo‚tÒI"é^Ò½¤{B8'œÎ !† † † „p&:‰BŒÄÄÄ ‘=ž=ž=.ÄÜÓ¹§sO…è®í~·û]!n»<'='…xæyÍóšÛï¤ÜL¹)¿ÈÜœ¹™N¡~¨÷Xï{½ïÁõ±áŽáYoÛ·;¸;H°x}qrq2ämÊÛ”· \—Çå1V¤ßÛïí÷BS¨)Ô‚P~(?”å¹å¹å¹ð¤êIÕ“*ï>ëþÌýœøQã7ßÄôØ`ǵŽkÀªÞcè§òÈÞ#{SªKu‹<æqÌÜ‘#r”AeP­OëÓú€VZiY$‹d‘!DÊBYÊ âR\ õi£Ú(’Vå å e:ß‘Î#€?z*éŠÎ1,“–É¥y{òÕÉWAmŽÌ1õŸ¡g¡g¬¨vuHÙ+;eg ñUyU^í¬vV; L0Á¨!5¤†€O9Îñü_U³jfEûm¤>LîšÜ¬EøQ¢sì&¨ÆTcžF'ó¼êVÝ€_+ÓÊG¥TT ÈkÀ2Ë,GcX`Ž9@ÓñZ½VO˜z[½ løÔ˜kÌÿwòGïJ*÷Wî¹+ùhóG›ŸO¥nàs>'”%e @­Uk ‚’C˜0aëq¯çëõôú:ŸÎÑó"¿.^Ø÷Ø‹ù‚ý%Gn`àŠÔIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-25.6.png 644 233 144 3241 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜVIDATHÇÍ–ïOTgÇÏŒÔaê Š1›µQKdEÃ/#ÐmZ…•‚”¨Z$1±¡%©»ë(ëf[kšìnT…(.u ºØj¡upÕP-¾p6MAØf¦d7híÈ/ef}1s²îàysï9Ï9ßó½Ï“û=€ˆˆ, ?Œ/_0Æ„|cE$ŸÐòO(`xÃðFÿ~x®î¹:€ØÓ±§ÕÁˆ¯¯ëùsëE"øsûéqY(‘€éSÓ§†œ°J“K“£…üÃ=`>g>7„ÊÏ+?èhîhf'Üýæî7?åü”__×óõzo.¾üŸþ"ðLç3†ƒi¾i¾,}mék/þ.”àyŠ ‹ nÏ»=O3€2X°h9Àèæãëëá|½^ÇÓñõ~zÿøìølŽûŠ}æ¦PÁ ƒF[³­´+s¢™f, 6ÜÜÆŒö£Úª¶‚6¦zU/pC«Ñj”*¥Šzƒ^ …“œÄ¢] ãýÅVo«× :8Qü°ø¡¹ âsâs"g~~”Ë/¶¼ºåUÐV®**hÕrµœ€æÒÚ´6´Ù=šfŠ)"ÀŽÿGJ)ESÏ+G”#€<íÍ0þ϶¤nIÕ ~”;ç(EDVÅiþØüñDxVxV@àM^[|oï½½L®|_¤ß¸qÜ8n„‘î‘î‘n«««%J‰R¢x‚?æó`ì÷÷¾½÷-Ó¤>xÒIl‡{GÿŽ~°TXÞ³¼‡¶îÏ/ï~y7<(U{Õ^5 v&ïLõ?!>FõŽˆHæy‘âCŇD>ûð‹M_l2¬ñTzž÷Ð}@¤°¯°¯°OÄ}Ó}Ó}3BlÔ:jµŠŒzF=£‘¢Ú¢º¢:‘»Ã#¦“˜RÊêê M"YÃYÃ"F¬ÖŽô,¡c᥅—Ô6{³¼Y‘ßþ潓{'!=#=#=\q®8W § § §@ORORORä¨Ö/Z¿hý"¨)¯)¯)Äí-ö{ dÚ3í™öHü—ë_ZõÒ*øë†ºóuçñ 4@Ðo5YMê@”ú]ðPða`^dzwŸ½+«.|wÑsÑ#ñ5'N©m¨uÕºDF2F2G2Eœ»œ»œ»DÉŽdG²ˆÍesÙ\"ÞÍÞÍÞÍ" ×®%\iÝÓº§uH¢’¨$*"Þ>oŸ·O¤éWMÙMÙ"wÜ·»nw‰,ݽìËe_J¼È£K.‰º´*­Ê0 Ê.‘ÚàÂ[Þ‚®ŸÜøD{;Û†™ 3Ì\(h+hƒT-UKÕÀép:œ°¯³¯³¯ƒµk3Öf@»µÝÚnß>ß>ß>(*(*(*ßrßrßrh³´YÚ,9˜éÊtÁßL'ÛO¶3Ú?ímδֵÖñ Ëʼn¯¡jcÕF}£Õ4P¾R¾À‡oŽnͦ„ômÖ.s™Ë@yä͉/a K€ããØlTcP‰Wâ?éýªÞ¯zð‡øaÃì6»'¢´kî5î5 |Ò¥ßïóû˜VN)·”[ ýV«Ô*AéWú•~P*” ¥ÔµD-ª©¦Ôêupœ#u¥º]ÝJ…¿ÉßÄ´šÖ1§{…{€ùóQüÖ±'”߿հÕÜ+³Oq*NàºIÝD€@ø‹ ¿?fšé9;¤¡ ñâ g‚¡ÉÁcå²ryvL\‡­Ñ[£ÿ¯ò‡g%%e%esf%{–ìY2 pø€°@p"8 lW¶3ZÖ€D|}]Ï×ëu<_ï§÷ñyšoOí}ìé¼Áþ‚֠ –ÇIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.9.png 644 233 144 3250 14774263776 15055 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü]IDATHÇÍ–ÿOÔ÷ÇŸwHáŒE.¦XmcÀ’kì‰kl7«³›éqU**™uEqÍη»‘%jbÐfÌ&f«¡T™T›R­Å&vÕ„àê—H(…ÃëN8îóù<öÃ݇»}ù|ÿòÉëÛóõü¼ßy?_o$)=ö83™Î´¨íüuÜŸº*uÕ3G£v­Ž×¯uþ¦š~`FýŒzózܶãv~b½ÇOìgû•®¸#¥)¥É‘³÷À:÷:wê£ö¾ àjv5ÿ+›On> p¢áD[áþ—÷¿Éɇ¸mÇí|»ÞÆKÄמÿê/AòéäÓŽÛòXÊc<µò©•OWFzŸïjïj€¾¤¾$Ë ÆwÀ4¦Yù@ öJ°íx,ß®·ñl|»ŸÝ?ÊG0sÙÌe)\uÑ‚ëPã?ì? V;ÀD3ïSK-ÓÀ!àPä‡ÈŒ[ÿ0÷™û€:«Þª°:¬`ÌXo¬g"#‘à ‡9Ì4ë«ÞIÿgþÏl‚×?àc_’/ÉUgóÑžíþ<¹váÚ…`ý`âp“›`½b¦š©LX%Ö2k–õsËky'w +Ãʰ2€g˜Ç¼¸—uߺeýÈA&ì5ÇcøëÖV®­´ î_‘p”’”]î]§@ofo&Lü€_~·¼¿¡¿Päg‘·"oÅû…÷†÷†÷ wÐ;è…ˆ;⎸UQEUBþ͉ԉTú|pÖà,Bfwzª{ª›®K®KÁ)6YIª½F…?0̰¹0oÉK9/å@úÎôšô¬"Ѷ¢m0àðøÁ»Û»Û»fU̪˜U¾l_¶/B¥¡ÒPiœÐèÃч£á­ ¯ ÃÔ³S¯O½Žµ~wáöÂí@€¹¶œÙrH‹òqš+$é'-’7ä I-ÕŸ|ûÉ·O¤+R©V¸×Ûûlï³rtìîx·ã]iÿýöú®õ]ë»&µnhÝкAê¬ì¬ì¬”Úf´Íh›¡Éu¤ûH÷‘néAq°ÿ‚Ö¸ßs¿'•šÞç¼Ï9êZœ=uö”RÖìZSµ¦J)))•ʯ–_-¿*abbJy›ò6åm’¦wMïšÞ%yr<9žœ8±Ùm³Ûf·IéééÒ±ÇüÇüÒãî¼»ó”2Òy7ínš£Nʯ˯“ôúÔsSÏ=ÿ‚“¿9Ž9j~üåÇ_–:îŠî }ßêx¢ã ©y]sQs‘”Õ’Õ’Õ"mÎÞœ½9[š›77onžôàöƒÛnKÖ˜5fIÇ»ŽwïŠ[™¿2e¾Tâ)ñ”x¤Ó¿=ýöé·%çmg’3Ir•¸.º.ê{)Ùì–®¤¢¤"rœÖß2£ÌÑ%%ŸJ>%]ùÅ•{WîiæÆÀƯ7~-µÿª½´½TÚ5´kh—4ëü­ó·J·Jn•Ü*‘‡‡‡¤‘ÀH`$ ¹ú]ý®~©éNÓ¦;ÒùŠóç+¤Öm­ÛZ·IË –¿ºüU)c8ãrÆei鎥éKÓ5S--”œOr…+Ž.±O’®úùüØGÇ>š¼üåJ­jªjb<·#÷rîe¨s×¹ënÝÁwÜ ‹‹‹Ð0Ø0Ø0ÃeÃeÃePP\P\P ÃÎaç°j|5¾xVx^ô¼Ÿ®m µ„·ûY'ŽÖ­nEùÄä¢ö"l)ßR|»%–±ÝØ—)îÑG°ˆE,úé§?AFeh¤‘Æ;í´wø†oðê#½‘^À=y+k·Ô¢|ĘŽáºáºœÂ_{–ô,cgTgŒ=áæp3!3Ë|Ã|øsTŸŒ6£ÍhÃoø ?˜¹f®™ ¬f5«ÁœcÎ1ç¿¡Œ20Âf–™Æ‚ð;áw™¿›Ô±Å=‹ˆ«ÛÕœÂXLÇþGù)L-L¬˜2çŒsf™YÆÄäÃÀ8cŒ%ì…‰ Œ2ă…«·ñìÉR˜R˜ò•?6+ñ­÷­O˜•옽cö$@3PM5Ó ŒŒb£˜q°.Xpà€¸mÇí|»ÞƳñí~vÿÉYùȾ.Ù÷Ø£ù‚ý7¹H óëu8IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-15-grey.png 644 233 144 6034 14774263775 16012 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÑIDATXÃ…—{PTG¾Ç¿}Ι9óðòLñ0 òŒ— "\Ü`…ׯŒl¢Å%VÔ”‚d–%±(MR´ 2&ÅÀj]\]ã5 Æ…¹°–ˆå1ƒ” D”a†™9Ó½0ÜX©üþ9Õ}Nÿ~Ÿþõ·ûׇäçççççófž}p«…{Â=ákÈ?‘"ÿó+--ýãRæÉ<™ççïHþ’¿äý¶í‚í‚íû U¨BÉE" ½èð6ÞÆÛì3q¸N\Gr…ÂáÁÍ*2NÆÉøîÊßßßæ;E[жm!#R°,ý,muqyps€«° «¸S´ÒBÚjŸ¶OÛ§}VÖÖÖŸ°ØGì#Mÿ°,·,·,þ@[¦-Ó–ábtJtJt ÉQÄ(bÀJ¯•^+½¹-¿—¿—ÇËþæü»âÉñe™Ope0ž¹17æF7“ ’A2‚Ëø`>˜¾R=]3]3]³ØË»É»É»É¹+¥7¥7¥—sDvEvEv‘T1WÌsaÁGøA ,°Ø†mØ`!b!,¶[€-©]-]-]-Ìq9ârÄåºëÑ+^yôʦƒš`M°&ø*g†3Ù‘\Æ2Y&˼·™€€€‹çhÍ£yôïÌʬÌðü~¿àJ˜}Â>aŸX|K·V·V·VZe˜1Ìfø÷f3F¦•/)_R¾‰&Ñ$š [ıE‹cq, #t„Ž4’FÒHhÄT1UL…$çè;Gß9Ê¿§[¦[¦[&­²[ì»eñ-^Ëkyí•0™Gæ#ûZ÷µîk$wÉ]r?~s:m:m:mË ]¹®\W.¥fê3õ™zá"‚„ LÒô=7JBI(@VdpP@`6%óÖŒf4àÁƒÇ$’„$¸U_­¾Z}UJí3ôú ÂEm¶N[wâgaB˜&¶FsÒ”4%MéWÚ¿µkÿvË ïtïtït–~,ýXú1AÖÈ$M¦É4nÜ%îw p¾ì|Ùù2`ÝjÝjÝú Ëh ¡!€MmSÛÔ€Ú©öx{¼=°}iûÒö%ÜdÿéíéíéíÂ)o½·Þ[ÏÂd™O`,‚E|œæÐ:´-øIâ'‰Ÿ ţѣѣJÚJ[i+4Äø?û±û†þaÊÊʶb+¶>•¸¾Û}·ûn'óNæÌøµüZ~- –K‡±N¬ë€Ëw,ß±nž· úhã£6úô?èºUݪnPçSçSç”––3_Ì|1ó@†ÈšÏ½Å½Å½à+|…¯H„Àûóþ¼?ûf2v2v2–¼(m–6K›*|'|'|†[¸…[ lÛÆ¶=µ‰ 0ÀÛä6¹ `ƒœÕ{é½ô^½IoÒ›@`b`b`"0^7^7^,>X|èvv;»À ¬À €¹†óÓ?Oÿ<ý3ú¹T.•KeßpªbU±ªX*í÷í÷í÷eßtVvVvVˆF4¢a¥á4œ†¤‘4’ÆyÂŽp4Ð@3ßï°:¬+0;; ¸sîœ;7ÿ^¢ Ñ„Êxe¼2° VÁ:'0XMy¦çûºŠ˜ˆ‰˜ð?ÄIœÄY­äü®ú]õ»º2Q™¨L¬¹ÿh壕VòwϽîýsï;wº¸± VÁ*æB̳Ä,@|N|N|îYnOßž¾=X°fÁšk€êÕ7ªoݡݡݡ@ZaZaZ!˜ÿ1ÿcþÇ Ö†×†×†S˰qØ8län())ýóMÇ€cÀ1°ËAöîÜ;  mh{¾\1ªUŒ¶ª§ê§ê§êg&«“ÕÉj–¤?«?«?K®²WÙ«ìU0Ç”cÊ1"gZ¼.^¯ø_ãkÀUÉ€Ó8Ó€MgÓÙt¿—ßËï³`̰tÆtÆtÆ`C±ÆXcÄ÷j£Ú¨6μÂxÆ3>z–` –tÿ™ãª¸*®ŠoçJ¸®dh5R#5fØ5-šM ÐÒÒÂþ³ëƒ®º>Ài—V­ŠÅŒbæ)@ù2² ›°i¾æ£•¨Äkâ5ñÚàädûdûd;4k.Ö\¬‘B&…Iaˆ™˜‰y%q$ŽÄuÿ¥(E©à’¹3föÞ(|LÊH)»šÍ%r‰\â® ÈD&2¹¿Ö³zVϤ,ó!ó!ó!hÈOä'ò&Ù v‚xjSI „'<áÆa˜Žé˜nN:n—Î_:é¼sçø‘ñ#ãG„r1P OéŠuźâƒWP€ÿƒF¥dy?j1€ Hwƒä Kë–Ö-­+]¯2¨ *Ãé¢qïqïqoÁ|N<'ž絋'x‚'°¡ ]èÂüåD.f`0ò)ù”| ñºéºéº‰%µ]n»Üv™/Õúh}´>÷gì§ì§ì§>ܧàNÁ€™˜‰™àîrs\µ¸žg躀.€{ÇpÇpÇ0`ϱçØs>ܯõÔzj=ïé­ï­ï­çKÞhx£á –D²I6ɆHOÒ“ô$ÔPC ° 6Á&"‰H°>4=4=4átSTSTSܵ#Úí@ci,ýpÿ¬ôîϸ¤X~®É3wý’ˆ®¦k‰øR4¡ MÎdYEV%­Ÿýå¸rÞ‘åÈrdÑ÷6ÑMtåVG–D–D–`í¡=´n ·„[›”+åJ¹„ ?îÔÄÄÄñ}ª(U”*ªô³›f× ZA+h…PîZÙòŠarî(vuÌiÈ¥Ý.í–»´ûí3ÚuÔ;êR–¹Ò\i®„†ã8Žã0!g¢ÙÚlm¶RËýŠû÷+ø>ÕÕÕž;mC¶!ÛОƒ}kúÖô­\€!òy*Ê|OÕŒ–?иüÝ¥ÝóÏh×ÜÜ_0ŸÍ?›6ß¹:è ƒ{—W—W—þÖÒÞÒÞÒN6kz4=šùžú^«°QØ(l´¾Ã=vÅû“\¡~ÍÅã7,!!!!!’«ÙÅ”LÉ”ä/#/Œ¼0òŽ999ýCÃÄ01ì¿ÿúKò/É¿${Õ™»ÍÝænv ãxÇñŽãÎø)Ç”cÊÁç(V+V+V¿À*Y%«üú"Dˆù»xŒÇxLÊ+àJ”ôk‚ß±ßÐn!Ѐg»À.° F®–«åj¯…ͼ>óúÌëôE…¢BQÁuó™|&ŸyùÿÃkÃkÃkÿ˜`2šŒ&#i¤>Ô‡ú°j—ßz å·88üŽýJ»®ãÂY€ld#[¸I¶-dËá¬5°†ÝÛÔAê u×ÍðüÀPýœ~N?Ïîy³çÍž7Y@„¹üÉKëïqü a¿fèþzIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-17.png 644 233 144 2407 14774263775 14705 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܼIDATHÇÍ–]HTiÇŸ±õ‹´©-¢R6o¼)V"L‚%A ¶oè ú"׈X×›†»ð‹e7bqÂ+Ó(+%B ŠÐtªÝdÙ‹E)7YHw\§œ&œ9Ïo/fΜãnÆ^öÞÌ<Ïû>ÿßÿœ÷¼Ï9""âOÿ dmÈÚµ"gÕ¹ù¼]y»J»Rq›¾ƒ¾ƒ¿7Á§­Ÿ¶]-ºj¹±3ï¬÷Ö‹¸ú^ž“¿¸‰ÜîÜn_U:n†#›ŽlÊû,ÿðò{ó{ã&œ½sö@OgO'ß@äqä1@´*ZnìÌ;ëzGÏ«/Íÿâ‹@v_vŸïOÈÍÉÍ’š’šß¦ü±öíÞ·`rÙä2Ík( @«€1œ1ë‰ùôz§ÞÑsôžÃOùXµcÕ8pìÀ±üöTÁØu¬¬wxF/&Í4SVŽ•TšWÌ+$è× zè×{ztÔn³Û@cfYCBŸsÆ$@€W/°.°Î18vÝå§üÈâ½ý±åÊÀƒ¶ÂvƒÝ€¡AíÐTÇuTGqÇ[Þòï˜g>ó_Aó5¬~«?sÁá /Ÿ ?’‰}/¬VFð+°OÚ'yÇÏĉ»Ôøøø °6[›­Í`5ŽGa¦y¦y¦f[g[g[!:ˆNÀÂ÷ } }ºG÷ðŽ§Ž¾Ãsø)?icmCpî⹋Öþ‚¿Ìçæs÷ŠõK­Ð ˆ^Š^Š^‚Š;+vB¸(\.‚ð“ð“ð(l(l(l€²¦²¦²&Ⱦ–}-û„ž†Cƒ®žÕŸ¸¸íáeø)?ic¿~7ßÜ|“©«åssØ&‘¹Csñ¹øl n n ºÀƒŽ:<ûš͇`èðÐá¡ÃPRZRZR “í“í“íî:½h–˜%Ž¾Öºü”+´"["[¼ÏŒÞ×ûÀ£Œ‚Ök½ÖƒµÖZk­…­+·®Üºzc½±Þÿ§ÆOŸ‡Ëõ—ë/×»y+jÍYsúX{+~Ê@QaQ¡= ³S³SÞc¯3:tÓM7¨ªªº2•ÁÊ`ezööìíÙëæŸ<y6¥çKÏ—ž‡×-¯[^·xø~üø}¥¯¼<‡Ÿò“%bßµïúFEÌýæ~qÆ*AÆe\DLIJRÄWì+ögæ%Ù˜lL6ŠÛíÆv7ß5Ð5Ð5 R>]>]>-âoô7úEìN»Óî‘¿eZ¦E$O&eÒÃËðS~²DbU±ªß~|8øÐYÇ×âÓ ¤”ÈY#"åR.å®ê@u : R(Üüò‰åË'DN‡N‡N‡Ü¼oµoµoµˆ,C }©/%™áeøi?KžJ̘é>; $Ü£ðžacc{âF"Dˆ¤54­ºXÉSù>¦ö ûïA»Ö®µkA§tJ§<ù[ö-ûhÖi§ ÓÓ}ÑÑÿp{OçÒØ°ÏØg02w0N”(`$é1KwüÄ¢7ºõŽž£¿dçÿŸïJh¡…w ¬ãÖq ô>|àÆÎ|fËÒõŽž£¿ä»ò£ýºøh¿Ç>Î/Ø‹P?Û#V}¼IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-47-red.png 644 233 144 4232 14774263775 15621 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜOIDATXí—{LÔWÇÏï1¼¡¥ ÛúXëŠbQ¡$:bL–šˆ‰®©ØBÜØÚ|jÕJ¬P­l¤­€ÊjB 2èˆÆU¶¬‘²Uc›jB³ÎL•mŒ3ò˜‘q~¿ßýîÌýÍ#[Íf÷ü3œ{ï9çó;÷{ï DS6ƒÂL\m¶F[…‰À€1ª+ª+ª+/KVeUV¿ÿ -¥¥´˜šfu$“L2÷pŸÕñõ<žçãùÃ뉫ÂyBùvÑ.Ú%v„Ï'¿*wÉ]rWǰ°[Ø-ìÖAâÇÇÇðׂ»w î›lz°é°Ñ¼Ñ¼Ñôù<_Ïãy>žŸ×{6‰+Ãý9_‰Ñ#zKy‡fÏ.ž]¬~p²ÿdÿÉ~ç~ì~ì~ @‚ ^ŒcãpÀè~`ž¯çñ<Ï^oÎWÏæ#ÓtqH‡—ysŸ¹Ïܧ¼nóÛü6?l[ÌrXµB9§œÔ å¼rPóÕµP3”ùÊ|@­PÊ•r€-f), ·ùmKlK`3÷™£ÍÑÊë:ðè¼¾iºŽ&tB‘\-WËÕm?ðK¥ÎR§äë`²lÜJ›òHy0‡ö¾ö>€§Ìʬš7Ü!þÓ@¼cêWiÃ~ì؇¸Š«Á•–:K“¥IÉçõ9ç#Ã}Ã}Ãý?,ç LU¦*S›gwÙ]vFyÜêçê9õ 5ÜØ€ 0Q2Q¾_`/ö€'Å“qqÜQQà¹ë¹ ¨Ÿ»f¹f€ï„ïÜv×ϯüü FMU¦U¦UlçÑùäR¹T.½^Í'‹‹‹Ø{@¯Ò¡œUÎ;Èðñü2ã—´úÙú#ë¬?ü2Õ¦«ÃœêOêO¡Í·šo@RoRo(è±Ìc™¡ëÔ$5 ˜ŸùCÇsr ¤¥¤@Rµù÷û÷ësÎ'ŽÔ«†\C®!W?cÑ´mb›ˆ(IZ(-$"ºÝ}»›ˆèІCˆˆ¾˜üb’ˆhZû´v""­T+ ½Aü’_"" ‚ˆ¨éµ¦×ˆˆî*G+G‰(&°¼U¸-ÜÖ7t: ú‘ç÷++ÌjÈjÈjÀ½IáIí“ZçP‰J0ü‰§¬Y7à¾wúÀãò¸B;Z;V;Ú94£´ -’É8øãÁC´þ½âQ<KgffãÁæs‚9÷8‰ùb¾˜ï¨;½ë”xJ ‘@ÌPÿP?ÄÕÇÕðÅYâ,0½azHRA(ð¾ê}aZ¾2÷Ê\0~mü€bë±õ„ä¬ßåwë]­¿Zµ^wéBºîDÒ i…´â@ ?e©/›î˜î¨sìtr n¶æ»Áï`À8`À®<¸ò¨œÊ`çÀÎp¾à|!ôíÆ· ×áà ¿ÉγóS_‚+ðyáe^¤H;v@Ó)YJ–’’1טkÌ%’¯É×äkíCú…¿Ñ’iÉT÷ðrZ»ÅnÁ~¹{'û&ûàŇ/>€GOŰŒÚŒZîw¿y÷€ßÌÚqÿ2ÿ²àVß,¾Y|Sóê€Û¥íÒö;›§üX'…Ûìc†tÃÃÇ)PVQÖTÖÄÖè÷G‚/ʰÓì4÷hËh xc¼1¡€ì3öŸËír€ï‚ï iûµÓ}ÆsfôÌ(ÞԟбF¬™Ìf 3…™¿?(ÝÒÏ×Va«°õf¡]hÚ¹V´k¯µ×Ú짺GÝì7|ÁÇ ö `kX6ËÖ]÷PûЙ¡3@jLjLjŒRªwò°tX:\fÑÑò)ŸòeSu5­¦Õòaê ê ’œ’Sr~pAZ›MM¦&%Þþ‘}Ÿ}_° [£ÍÕæÀÔ®Ãy1‚VVŪ¶Y»¤] ~Ê–[¶ ¨{ôh\—Ç­•);Sv¦ì$-¢E´gtEsZàw³tOº'Ý.Î+ŸW>¯œÈPl(6[+uí®¶¬¶¬Õ®V¦•Á+¬° òS½@] .ö¶!³!³!“­ÑßòxC¼!~hrÊ7ÅP˜ =[OB„ûm¸oŠ1¤Ò éö³!Ú­(«Ñn¼¯Ä´‡ÚCíaP‹ƒÄ `ŒŒdº&¢Q4¾u(BŠÇ"ø¢éÙRC„v ž§]¥WéUzƒÊ}’ò$åI °hlÑØ¢1õwº;¥N©óh6—Z@z‘€¿¡çXpOðkÚ­7Õ›ê•x{»½ÝÞ®*ý*»Xv±ìbðÚ‘›åf¹y0ð/Iì?"êÆ)îy€‘ÆÞ h·û×´›³.g]κ v­ÙÖlk6Z§æ™¾B¡P(¾q ¼Œ8QW ÿÒž§ÝURT#Õ828paUaUaûóâ§‹Ÿ.~ªÜÖ·Ú)9%gÙlj£6j£Àµ#Ù#êEÓÿh‘Ú­ ÷sþ)l¶ ÛZKki­¶Pœ%Îg $Ðß¿Mõ¦zS½DÒuéºt]ø[ psÄÎýß,^ÿ+—r)Wþ!|ú£"‘‰Ld€Ð#ô=ÿúíÔø|kÄÎØ"ò>w«ÿ ‹Ö”M•Î\ IEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-loop.png 644 233 144 262 12610450027 16107 0‰PNG  IHDR‰ bKGDÿÿÿ ½§“ pHYs  šœtIMEß  6iÚ ?IDAT8Ëc` !øÅécD¤`dŒ^FLÔvÕ½ÌBˆ@Š\ª¹ðÿhކ!éaÈ0²J›ÿTô!&uÜW}x‰IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-1.0.png 644 233 144 2517 14774263775 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[hTW†×\’ÌH:^H¢`¦‹Ò!’›i™E¼4Qi$V°©Š4yj >TJ4B­h#Š¥1­!õÁRÄ!$MÓ¤ÁŒ2mnf&dæÜ¾>Ì9sF£í«ûå°ÖÞëÿÖZ{- ""+̯€Óïô;} Ûù©í÷l÷l燄}IÇ^ÇÞ_¾€å­Ë[V¶­lÓGlÛÚ·Î§Æ‹Øø©|–_Vˆíȸ‘qÃQfÚÍP]P]àÉNØ_Ýo—·+ªÂ¡žC=W;¯ò„†͔̔m[ûÖy+ÞÂKÅ—æ—øE íVÚ-Ç‘ž‘.yÛò¶­oH_»*vLº&]†´¿L22`žy¬õOŠmí›ç­x Ï·ø,þ„¬`VPöÔì©ñ^IŒ´Ccnc. (]Àe.“Éûj¡Z|¯‰&ÄÀ6†˜7â´¿SŸ«Ï‰•qeèá8ÇÉLUºÐ×6®µŽ´Ûü =òbmÏlŨJ¯J· ôƒöX{ F“:ªŽ¢¿ãÆ‘ÌÑ,ÓLc¯h=¤ê£I¯a¸Ôµ…Ú_ó§à+U®*—%ðÌÖ”RŠˆ¼{¼!ohÞ cÚ˜–ÜÉ€¾QßÈ‚åˆÎEÃÑ0(Ê„2‘"è"¹h›ñÜxn<¦ò¦ÖL­£À¨1jôn½›þ2ñ1uL›?¡Çvég8râÈ àO½ÔˆãcŸ±cæë™S3§ ôléÙÒ³p»þvýíz[ˆ¦hЦØv]¨.To‡·ÃÛûÚgÿ;ƒü¨vªÀ9‹Ïä7õ˜Â?‡ës×ç€<ã ›nbÑéèdtJšJšJšìÂß­¼[y·’%«·­·­· òùü„‹ÃÅábØÐ²¡eC ôѷЗÌ?1-fñ™ü¦§ˆïžï^Q±H°‹ßÔãqU¸*ÈI»™vSD2EDdJ†%.qùFZ¥UÄr…\!w½»Þ]/" H`©0·ÏísûDÔ|5_Í·ýJ–’¥d‰x>òÔxjR–›|¿©Ç)¢÷꽎_EÔJµRDÅÊUFdDÄñ¶ÃïðÛ8ñGñGñG"¤‘Fší¿}!ûB¶HQKQKQ‹ÈdÉdÉd‰Hs 9Ð ÷‡ûÃý"ÁóÁsÁsvœsÈä³ø-=Kz ³æýÚaí01>¤œr»‡Ž8vàØÜ<¸yp3,V/V/VÃî¡ÝC»‡`öèìÑ٣й®s]ç:(}Vú¬ôôEú"}‘”f\¡öª½Äu-½•$oå¼jOtˆ[ÚìÄ^ò ®qk)þoi¥(`;0@[­­ÿóV¾bŽæœÑõZ½ÖžcúÇzµ^ ¤“N:0Î8ã Eµ¨µé[ô-úÐÞÓ µBÐ;ô!}^ÂÛ‰>¦Œ)¯c)“Ÿ*O•ç…Éÿ@{ ×éu(DÌ ª,˜ð::0Çs€Fb@+(@Üʸ~P?ˆbãYøß’Éÿ?ÿÊ@p’“dÚ%ÖjµZb`Ü7îàÀ¶mí'[ÂŒ·ð,ü×þ+ߨ×Åû{3_°ÿºÆpÈv»iIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.7.png 644 233 144 2534 14774263775 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]h“WÇŸ´Ó¦³j•êü¤ÃТŪ"N¦`[1¢­Z…NæüB·1„ɼ0X]1Ì âE¥"ŠV,m‰±SÔ ƒš ™ŸœP [ iÚFšä}ÏùíâÍIâºn·ž›—çëÿÿ¿ç9ïó)L=ræ,Ì™æØ9_eüî*w•ç²cŸ³ÁUãªùýG˜Þ4½ `Æ…Ô³Œmâ&?»^$ƒŸÍgüR(G^k^«k]Ê>;Êv”¹g9öÏ÷ ¿-¿-fÁ¾ö}í7Zn´pÂÃ"ë"ë c›¸É7õ/_Nüƒ_&']@Þä¼É"P\Q\±èk'¡olönöôçöçê°€ ô:`„Ì̲M<•oê žÁ7|†ßÑ#P´¶h­Tï¬Þ™ßì<»¾¾€lši¦€ë¸u˜dí±öýX?`:ÓKz¿Þú…µÔZJ\$‡“àŸáÃG>ƒç›ï›$ ŸáwôÈû½m\ÛÝÛÝ€Hö€²CÀsµJ­"©é3úŒu6ËÿŸK§8EXÂãNöÀöYÛg™l\ŸÕJ‘Å¿@~8?<ò¼´_ÚÀ;62 6¨ ¼#á@Å¿‰Œ„hI´$Z2^A¢*Q•¨‚öövlll„È›¡Â¡Bû)Ž…Sè°‘ß^ö¼ì ¿£'Ç‘÷í2‘ºsuç¦Z/Í-ÍÕËäc5SÍ”›j1oy+ù2ÙÉôßñ÷ø{DjÕ>ª}$ãV÷Üî¹ÝsEJ¯–^-½*²æ¯5Ñ5Q‘O~Ý0»A¤ùó»Å–üTúMõºtuéjá7z…¡ïáJôJ4½ó_ªY‰®Dqã¹ýâö‹Û/2÷V{«½ÕY½ÖÃzÆÜcî17ĺcݱn¸_{¿ö~-{Š=ÅèoîoêoJ—Åõ_†ßÑ#0íî´»ºÂ+Â+€Iï·f¨hhæÐL¨­­…]'wÜu6UlªØT1¾…ªH©¢Œ¿îIÝ“º'888’ñÛ+h³™Rü)=3¦Î˜ªžÂà›Á7`–þìhœÒ8¥q är¹XZZ÷˜{Ì=ÕÕÕŒ[¡W¡W¡Wà9ä9ä9CõCõCõY …*©’À˜ásøžÕ©:]OE¬-Ö‘œÃ""RdÎLå¢ÊO+?¹œw9ïržˆ§ÏÓçé™ã›ã›ã™wtÞÑyGE@ÖY»Öp­áZƒHyIyIy‰Há±Âc…ÇDT‹º .ˆÈŸ®‡®‡"â6|ZÏDg ì‹öEâê;u@ȼè­Î[·:ÁŸð'ü H,O,O,oŸ·ÏÛ±ó±ó±óà/ó—ùË 3ØìÌj™º©®«ë€e7ÛÍæ ÿë9w?pPå`—Ûå ½z¿Þ¶îX]V¨  ª p–³œ½MoÓÛ²Z4Ê(£Yv/½ôa^ó:k®ikØNË-Oó§ôL<ÇÌœU5ª&=wкU·‚:­N«ÓÀsžó숱#@ˆ!P½ªWõ‚þBïÔ;³„ÆÔVµ5kŽ¥ùÞŸcO~ 5ùØÔ^µ—djÐjF‰1oD‰ͲM<žò™ú4žÁ7|ã&ÿÿü+€6 žz À±FìÝönâ ïé{¸pAÆ6q“oê žÁŸð_ùÁÞ.>Øû؇yƒýÆé/‹*Dº0IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-36-grey.png 644 233 144 6257 14774263775 16024 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü dIDATXÃ…—kP“׺Çÿk½o –«-)44”‚¥€ +é ­ ¥Ž¢"ñxKÝŒôÈF í©L=›os¨àÞÇ E7¤ÀÅjiÔ*2»Å2\#ZÅ`Ñ„p IÞ¼ë| ¡3žéôù²f½—ÿó[ÏzÖ³Ö"ðļçÇð#ük)ø²àË‚/ÙóEãEãEãkC™ób^%ÿ&,–K"w[, –vå(G9Ƀj¨ `vc7v³ÒTiª4•äñù‡üÕ1ÃÑóÇ}û÷më-Î,Î,Î$z!H‚HÊ<‡xÝÁåIW`VÐ*±H,‹ÄëÖëŒu湨¢Æ¢Æ¢ÆªQ«Þª·ê[oÏFÌFÌFDþÅí”Û)·ShŽLŠLŠL"yÑ’hI´ˆòŽòŽòœ}ç{ç÷Îÿz úNÿN'ïˆàë̹3wqÙEv‘]A§¸ .ˆ ú¶b¦r¦r¦2ÐÛ§Õ§Õ§ÕþAÒ@Ò@Òµ…õ„õ„õõÒï0Uz}z}z=ïÌ“cj݉™˜‰°È-r‹\WÁ ÛÉv²@êP ÝèHÉ €uƒuƒu x Þ‚7@Ž#äÜúé—Ó/§_æ«|6ùlòÙÄTN'ÏÔLÍÔ…›ln67›ÿQüGñ!ÉóªçUÏ«pqÉj£Ú¨ª÷Vï­Þ è»õÝúnÀ%É%É% XŸ°>a}ðÚµ×®½v ãÄ81hmm:c;c;cn/·—Û ¤$¤$¤$±ˆE,àîyÑó¢çEÌÆGÇGÇG#©öóÚÏk?$þ‰á&*¨• ŠÙã5á5á5á‘á‘ᑤ —p —@¡)Ôj ÓÓÓ`ÿŽý;öï^=úêÑWµ5µ5µ5kd¬¸e½e½e®Ÿ¸~âú «3«3«HIIªJ«J«J1ß1ß1_§¸„IÂ$aRæäqò!w2w2wRŠOð >!jz…^¡WF&Å ÜÀ ãc| ¤Î¥Î¥ÎêIõ¤z(·–[Ë­@ùWå_•„”„”„”. …‹˜˜ž˜ž˜RRR’’’೘Ïb>‹†È"€‡ÆC㡘ŒÉ˜ìwÿt;ÝN·ø_à ¢¦Ün ·„ýÓ´Ü´Ü´÷„#Âá8ÒBZH &0‰ÐFÚHèìèìèl`ÕØª±UcÀpüpüp< ¨¨ˆ¿Š¿Š¿òyŒ<8tðÐÁC1;bvÄí¯´¿Òþ Ðû¤÷IïÀ±H™Ã 7óãÌ3?âUR%U²rk﮽»öî±¶G¾|ùÒÊùUGâü’ý’ý’a¶LY¦,STÖVÖVÖÞÕÞÕÞÕ@HWHWHð¢úEõ‹j ÕÔjj5 NÁ)8`Ú2m™¶þ]þ]þ]@XMXMX °(gQ΢ SÕ©êT~S~S~S@@t@t@4̺ºº´ëÛõízü»ÔSê)õJ(Ò‘Žôãå|_À¼¶Um«ÚVÙ•›Áf°A.Ý,Ý,Ý ÓDÃDÃDÐp¦áLÃ@gÐtàZáµÂk…½AoЀ2\® T]ª.Up3ÿfþÍ| 7´7´7ÐîÑîÑîìö{ ‹³º444ˆ+ˆŽèˆÿMìÄNì.ÜÖ™­3[g®;W4W4W¼Ûô¾é}Óû¯þu\ÇE{Ndxdxd8MS1S1XúúúÀk×i×i×…AaPiQiQiQ@`n`n`.°´ziõÒj`2l2l2 ¸úÃÕ®þ4A¤Õ¤Õ¤Õ€WWW€×¼¥yKó–8ÛÞÞN÷»&¹&¹&ý¼ÅvÇvÇvgs Éÿ%ÿ—ü_ÜÁÜYzZ2.—Œ_—M·N·N·f'ÞJ¼•x‹%¤Œ¥Œ¥Œ‘kv‹Ýb·€ Û…íÂv‰Yb–˜ÚD›h€ä ÀR,ÅR‰HD"`QXÀíävr;¾‰oâ›0{wùÝåw—cså`å`å šdC²!ÙÐ\2ãǸÈÍABúöRZNËi9×EOÒ“ôäƒCâ8$í²ÊÛämò6@ûžö=í{ì•ïïoTsRNÊIavzzŽž£çÖÉ:Y'€R”¢û}5K3¥™ÒÌ@“©ÃÔaꀼùBó…æ ‚RrOrOr˜?þI,‰%±}{çõxnÍš5kÖ¬a_Ìœ/¤ù4ŸæçÒdšL“M‘ö\{®=7%gÔ>jµ qaaaô¯²VË º.s]溬tåü¢ùà–X&–‰eüiÇÌrÎXqqqqq1LΈÂñÀ²0¥{Îü‡?MN‘SäÔµzOãiü ÈF6²é™F[£­Ñ&ì3ž7ž7ž‡œRJ)Ť3mæ6s›Yœ½_v¿ì~7èzÌõ˜ë±ÞfËË˃c|sðÍÁ7 ÒYO€ ;"ž²§>;n8r·îÿåîÃÃÞXSPSPS`ÏÁKx /ÁÃQ%þGÛ¥íÒv‘mò~y¿¼•¢RT¼Îoå·ò[Í«TѪhU4}âð÷–£5?ÍÅál¾@pt{˜ sa.d¿þeýËú—ñ{€=Àp[ª¤*©ê3%>JôþÚØgì3ö±ÿì¾Ø}±û¢ýõiÛ´mÚÆ–ÄIâ$qGüÙyvžÿªRH!å†ñOðDôs΀#PÂÓ<b»EhA ZìÇYk` k†¨†j¨æ;Õ܆¹ sÄ—%e’2Iíã²¹l.»ýû`M°&X³vnH7¤"WÅçÄçÄçX…C·Ñ8ûGbO宣\Øãàÿ/’I2IfG0ka-¬åh–L!SÈ´åF¹Ñ ±D,KöõoéßÒ¿˜„Ê¡çÛ’VÛ~ .MC­Í21¦ÔjKM3€m#„?Š,•¶éR´±E»‚;„6PKœê Œ˜îœ{~ûaæ2³Ë§ýæùró¼ž÷¹ç¾÷=G€BˆâOf»ÙnNaó_ö´gÓžýí©n–`ÚaÚq­¬Y?ÈhÉhѯ'°á7â“ó…Hð'×3ìâ‘0,m_ÚnÚÇïB©£Ô‘ö` ¿7–.K×\^ìy± ³­³=ðËÅ_.66C~#ÞÈ7ø’ùÅ»ÿS_H9—rÎô#,M]š*eé–±LmB„0Ö¯IØðÇã|ƒÏà7êõczØž¶=-w]A‹'–pÝËÑÚãµÇA h]´ð1³ ¢þ¨@¾._'BŽpRR§Ôˆ"r—ÜE¢hhŠå«¯ã|îÚÆÚFCàu/Ç]w\w,°m±mI|Óø³q +KrKrAmÐ.?ó3¨‡¤OúÐØNy(Õª>SŸQ×Ô5HÚ3?þ$lWšÒPêºM·¡::¨º¿š|!üBØظ%éS !ÄïŽò¥å¤ådh ŒÛÇí ý €çüÏL·M·q7ꎞ‰žaÑš›™›™›mB›Ð&’4Ò˜€Z™æÖÜàÿýôÁéƒÜÕÞŽñÃø£ã_X¼oh‰¡G(“B4¯ÈW$ßæ6·õÜMΧ²ŸÊ†Œ73š2šP%M%ï—¼á@8ÀÌò™å3ËÁ9êuŽBßÞ¾½}{ å„rB9P|ºø“âOÀú¦µÉÚ„*øÐÙàl€[‡õôô\ØS¶§ ôïbzD´P!®ÔÂ糟ÏB›ùÌg~PUJ_ß³¾‡Hà¡@z ìkìkìk ¿£¿£¿ ³ ³ ³0àp ¸ ;±ÿÄþûaíʵ+×®Lد®·®·9|¸­²­RUÁ@æ@&DScz3é=é=ª7Ü7ÜIoê™­ž­†5_ÚødvevevÁÍ7WÜ\‘ˆ[×¹®s]'t;ºÝŽ„]ïÕ{õ^˜žšžšž‚©ðTx* Þx_÷˜ö˜ÿ<ñmÇ·¡Õ¡Õ ÿñþÈýÕ.ÔQk«µU…Ð¥Ð%øWÔ÷²ïe~½ðáPýP=‹‚EÁ"È6e›²MÐêmõ¶zòõ|=_‡îÒîÒîÒ„]n䆮³ÔYê,çÎsç¹á¢mˆ¡¤_F•û7ù7w2L&}Ô¬ºån¹Û4*DJoJ¯—ÿ|ùÆåÂV,.bhxèû¡ï…TªÕBX'­“ÖI±°´UÚ*m•¤BJÂî©÷Ô{ê…ð{‡½ÃB*8Tp¨@ˆŠcÍÍBüØòÓ[?½%„Ï1ñäÄ“Âf:e>f>&uò ù„iTð^¼ÇÎzúÓÓÆ ¨ª†´íÚ‰ägå[ò-àéóôyú÷Ð>û>û>;\q^q^qÂÜàÜàÜ ”W–W–WBKCKCKl5o5o5CÑd‘¯È¹Y9çrÎùÇÅKM—šTœ ž ‚|Æè1Œ¿²¦ª¦ èÐsQò5ùÚB}Å¿a8ÂŽ$)“H$ÿÏ Dì—ý ™ 5E5EÆ‹/´„ccÎ1'È¿ÆæŒtÏŸ?Ë]ý7ºKwýôГÔäez™^¤’J*p•«\Ý¡;t¨U¬ŠAzå¸ym>0à®<ãW_ååXÆ,c¡%tÆçØ¢ÉÏδi€Ð.–_ɯôÝún´…„(QàNülŒÆ±ŠMvf¹Å- ¿­oÓ·¡çåyàVœ~§i§ÉØ©ÿšüñ³’í»¶ïJ:+yãá7^˜Û]€7Ë Іd…¬ jP ` løx#ßà3øzFý˜ž{ùvqÏÞÇîÍ쥨Bƒ7¼¬%IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.0.png 644 233 144 3162 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü'IDATHÇÍ–ÿOÔ÷Ç_wr…#”Š£hWFÔÎ×@:PÔ¸²–´*Mb²®’0Kb@2—€Ã_ZÂÒ֠È/?¦ÏÚií\ŒÉ´É4ý€‚¹ßþÐþC;~åOÊçÊç+`5š@ <ÜôpÓÃM+âÍ4Ó…ÁÔàÛÁ·áÁ/fëgëñë¶0?LÔMÔ3Öaëðb p?¢›DDN@µZ­‚ïÏüÈZæorwÚvÚ éä IÐK{J/•^ÿ€À?¬¯­¯­¯…ü…ü…ü…¨_;¤ÒEñÁ™ƒS§Àê¶z¬ô_—[Ê-ËÙ™ü³*½*ØîG”|‘[µpuáê´›»ïtßÑ+w$æxs¼æýó÷çïÃZûZûZ;Ü.¸]p»†>Ý…%…%…%û)û)‘ßk{_ÝûªÉuõ¯×{¯÷JlñÉâ–âö°‡="ñÇâÅir69›œ"åË7–o1-™–LKò”M­™Z3µF$%3%3%S$e8e$eD$m]ú®ô]ûoÇ×—É%’ÿeþ—"âûâû²¶™ù»ÉgòaÏóo<ÿ†Èwê÷ÕßW˃ÿÈK#/‰xV{’o>o>/¢Ø›b‹úCÉ¡ÜP®H\Y\_\Ÿ<±LY¦DL‰«¬:€Í¬ÿCu¨Ó¨ˆ¥×Ò+rsÏÍ{7ïIò~ßþo÷+2ôë¡×†^™îŸîŸîÙ·{ßî}»E:\®—H†=ÞaYW·®n]HjEjEj…ȹìsÙç²E²²²D¦·OoŸÞ.Ò¸¥ñ•ÆWDfgÛgÛEòþ›w<ï¸$‹ø¾€ˆé1nܦQá£È»æþÂýÅò¨lŠk¸Øp‘@öϲ­ÙVpù\>—pãÆÝC׎\;r휞žB0-˜Lƒ¢Ö¢Ö¢VðUú*}•е¾k}×zØqwÇÄŽ è]ð~âý„€¡ÇËîwð¯p?‘qqzª*«*+‘¿DWkÔ@AEÎ-ͯù5?(·”[Ê-мšWó§8Å)Ћ"×°rÈ>£¶e¯Îß”qeøUDª3Ug€…È_ÉxdŽa·Ž/Æpf"w"Ôcá9£ž ö{ðk/k%Z ÐõÓÓ»ô.½ ´­EkFeÔ%uI]>É´ZµV jN°1؈_»™cÚ„mÂ`´N.Æð82Çžšü¼÷n„×(4Èõ+õ+Í¡9-¿1((@àx‰éÀCæ˜3xÐA«Ô* 4øŒ“%¢÷ô䜕””•”­8+©K­K]&ð'9I(‹Ê"€Z¡V½_ïÀ„ ¢ØˆùF½Ágðz†þòYùÌÞ.žÙûسyƒý[ÕýOIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-2.2.png 644 233 144 2513 14774263775 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mH•gǯs4íˆu4\˜%QsÇE’¹­@H¨´:•-WIúe,$FJ¡·µb*1Zô! ÍVØJBl–,µ-k Í^F_*äLwì9ç¹ûpžç<lj0Ø—î/ç\oÿÿÿ¹_®û‘8ãWÀžlO¶Ï Úö/,ÿìœÙ9ï´ÏÀ¶Ã¶£û+pžužˆ¿Qï±l3næ‡×‹Xøá|¦_âÄrD_‹¾fË6ìrØ•¶+mö{A»ò8ã~ØwsßM€µ7jù;;Þd¿ÉË6ãf¾Yoâ…ãKù¿øE`Vó¬fÛŸ%‹7,Þ°ô@0¡w)lÛ²m €'¡ìb‰UÙ€/æ ³Í¸‘oÖ›x&¾Égòõ$¬KX'y{òö8j‚=õøK–.4ù´F¾ãGˆU´>­(ówû»™õX=|ê­z !ûœÈ?Ĥz õj½ÀÉ`}/„oð…øƒzdêÚV­Ç—/ùtŸd·¿Ôjÿ ÿ 4# ÔIuPÕ¥ºTÖ˜Ç<æZ­\Êò*u2°"°M=öWú+Ãð'vê;uS`Õú°¥ùð[p :½‘ð,ð,üÀfP§Õi&´­B«€‘å#)#) •kåZy˜ ãç¸ejZV0%ÿºv@P˜ ÍÄ7øBüA=†°ó?Cñ‰â t=H# ¼+¼¹Þ\”»Á}É} œÇœÇœÇ «2«2«FûFûFû,AcÞ1ï˜Ü îw8::BVeÖ©¬Sðêù«‰W¨ÐT¶›|A~S!ì÷¸2ve 9ês£n²îëºÒºRH]º u%`Í¡5‡Ö‚ªøªøªxË_ÓQÓQÓ©I©I©IÓóÏ´Ÿ¹uæVÈ=øØä ò›zæ¶ÏmW×`0c0XΔ1T4T8Tž^O¯§ZË[Ë[ËÁåv¹]nhololo´òÜî7x|ŸÇ­e­e­eàÊpe¸2 c £¿£ßÊ×÷™ÿ ~C@üœø9ú0Ú?Ú4Ç~»Z«ÖZ‡‡‡°ªbUŪ èLèLèL#¨×ëõúÿž¯>Õ³ô,`Ül3¿¡gÚŒ~œ:cM4¥4¥Xg·:³:³:®ö\í¹ÚK–<,ú;õwêï@]^]^]ÈFÙ(¡:¹:¹:.7]nºÜOö<Ùýdw˜ÀS3ÎØÔ=¦ožºÇÚ>i[Ù¶r s s aSÔ¦¨MQ™™ µÃµÃµÃ°?fÌþ¸Ð|¡ùB3lµoµoµCîËÜ—¹/!=1=1=Z¾i)k)³ö˜ž:ã›z*…I¿×outL2Éÿáõj*þôSi õ q :+‘ñGŽGŽ9~‰uŹâd ¿èKô%òƒúUÎÉ9‰‘Í’(‰"Ò%ÝÒ-b¿m¿m¿-Â|æ3_ÄöÔöÔöTD©"U$"é²L–‰H‹ ˰ˆ}µK±ümËŽðDxä3>ö|LnIlº/Ý÷×,_’/é£êéŸüèühóK´û¼ Ü Ü^ëÛõíh¼1¾ø5C “øð¼!½a¶åõ&ž‰â›Öùg¸+)]Tº(ÐTPA¬µ½½L‚º§î`ÖmÆCKfÔ›x&þŒwå;ûºxgßcïæ öú9V3lòÓ¦IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-32.5.png 644 233 144 3230 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜMIDATHÇÍ–mL•çǯs9PZ±ÎE† °T¦«'-V-JªhÄ,‚Ël"ýh£Ä’Æ(©ÒD$ÊN…¥Óª=¡D@@¶ÚEÞêË|)–rx¨Ÿó<÷oÎy»-Ý–¾ü¯½JK–%«÷„~ú)À«5¯Öý>Ýô›ñsóE|øsë™v Ÿ! ! Á’êÕK ;!;Á¶È£mƒÀÆÀÆ'nØÓ´§ à‹Ú/jù<ê|Ô 0‘:‘ >Ýô›ñf¾‰7_Jþ«¾øíÿµåŸ0?`¾D¦E¦EÿÙp+27fnx8ïááo‡¿-Â_6Onž <åIè?ËñâêâjPW´F>£Š*‚A]€ãî)÷³ªËøÄø8¤©CªWõè;ôÌ2ážpO€Ò8ÉI‚Õ]žÒŠÃ‹Ã6o=¶tlé<‹^[ôšïL½ë± üòý•ﯵ@ëîpTºa3lh*WmPPêª@<ß)ÔAuPôÐòóÊcŒ¡ps‚hÀR–šN­¶íß¶ßÜÁc楈ÈoŽóm`]`Ý´ÜŠ¸ÚaÞ}ç§ÚŸjyê~ǽϽÏWO‹Ö¢µh­D+ÑJxA”[=QO`ê÷S¥S¥0â®®àéhÁã¨ÇQ¼«‡ ½ôú´Ÿjôðe©j‡½ú^&?bœqcå[ëÞŒ3ÂN„5…5¡²¿ÏîÊî×m×m×mÈLÎLÎL†ÖÖV°µµ×€kÀ5à#6Y>Y>Y‘w"û#û!ê¸jTâoãÞˆ{nîýñ‡0VÂM4¾ÅÃGÜi""ßÃ7SßLA­õüõó×UÞïBRšRš˜u¥»ì.;$%%Áîõ»×ï^«.®º¸ê¢Àºýëö¯Ûåör{¹Ýg¿q7ânDUFUFUBiUiYi ]í/ê/bÖ»¯yìr¼çxpyøÿ i iR d ——ú§OMåO僽Ö~Ú~/\¼pñBèí텑ّّYp.s.s.ƒØM±›b7AËÉ–“-'}8Îg³bÎÄœ‰9öqû˜} V”,ÏXžwB.y¸`Ü>nõ‹àÁàAÕ êxèéÐÓFLwOwà ÷`Ñ`®ŽÊ+®€ }BŸÐ!Îçˆs€Ãâ°8,p$ñHâ‘DH²%Ù’lÐÞÞþâÚ<´yh3´÷µ÷µ÷ùìo-²cŽUWTàúé÷³ Œ>«úRÏÕs-}"þ_ù%rí׆¯ KøÎÉßíüN¤µ·õFë •ªRUªHsEsEs…ÈáÕ‡W^-’cͱæXE´?hÐ.Ò}®û\÷9‘º{u÷êî‰tøuøuø‰ä_Ê¿”I¤&±&¡&Ad$éçW~~E$qIâ…Ä .òxÅã"ÖEꪺjéŽzï˜ÓQï¨þ/å}l;Ôp¨Ùä=É9É9P?\?\? ÎBg¡³Ò%]Ò2:3:3:aß¿5~pvíÙµg×Â.m—¶KƒGiÒ¥AùöòíåÛ!å~Ê@ÊÔEֶն͹cÛŽ  Ù¼c˜ea^apÀX‰Ò÷é¾ö à&7z꩟sV:::ÿ_zè¡0xƳ9x-nÍ­½õ(,+,žzøXôö_þ£Xª¯ç^Ï]à6îÆtÅtÉF™§}®}.³ úÝó»'A–xˤeRDýJŨI‘I‘é‘ëeëeëe\¸p‰XG¬÷­÷EŒ£EDœF—Ñ%ÿ¶ü}~Öü,ÙfýìVü­x¹ Iç“Î?ö×LÌLLJÙ‹Ÿ­¶­6@y;óŒÞ¢·yFš÷«ãŒ0L0Î80î]g™a˜bŒ1…2r\4fôf½ynçß°5àv~ï¬dËŽ-;æÌJ>\ú¡ot4¥” îi÷4€ž£ç0 ªMµ`Á>Ýô›ñf¾‰gâ?Ÿ•Þú>/óëâ¥}½œ/ØÿÅC÷¦Þ1š€IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-75-grey.png 644 233 144 6252 14774263775 16022 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü _IDATXÃ…—{PTǞǿ}Ι7ŠbdxÊÀÇ‚jˆ»bX*FÀõºÔ5”šÔ%‘‚@••„‡$€æ"Ê&!æš8(• pq³XR r˜C"ˆÎ0á13§÷f *U©üþéêÓÝ¿þôï|»ûפ¨¨¨¨¨+°hæÅ‚‰çîs÷¹û´µèÓ¢O‹>¥kK•<*y´=Œ*©’*ßûÞ‡÷á}ÔGl-¶[ } h@)@0‚ `ƒpGp„¾+I•¤JRI÷{È=ü¾˜ˆ‰˜þV_¼¦xMñšö–f•f•f‘ ÞŸ÷çýIÊ"‡pËŵ‚YÜ‚-ØÂ|.”%B‰pË>gŸ³Ï­Ž.Ñ•èJtŸÚ'ìö‰¶Ûó‘ó‘ó‘ê×ÕŠjE5®«“ÕÉêdR#Šň€hïhïhoÀ]w·»û»Ç»ý-ùwÍçžßÍãæã\Œ£žÔ“z ™$‡äÿjÖŸõgý¿mœkškškzÖ{eÛʶ•mΓɃɃɃŒ#¼?¼?¼Ÿì’H $˜Ç›xoBŽyÌcÀ«x¯X‡uX‡y›¯Í׿‹]ýÝýÝýÝÔÑÜÜ,œœÞ1½czdzr¹¿Ü«Ô™ãÌqæ$UÓ\šKsïg0q¤ÐZh-´èF7º}ŸâZ¸®¥ûv‡Ýaw<ûR@H@H@¿å•àW‚_ æ>W¦(S”)€rÈÁ ZA+hÁá&nâ&€C8„CVaVèBº&›Éf²Ác³˜gÒ™t&F´?iÒþÄgŽŒŽŒŽŒr=bVÌŠÙŸoð{ø=üžmû° Û°íÁoäÌ­3·ÎÜx/Þ‹÷úäû¹´¹´¹´¬¨  A‚.ð»rss¹ëèD':aN8á‰íØŽíøc£  C²líhG;,XXˆD$³±³±³±“ß5ttèèÐQYѬhþôn†›áf©~–ŸågS¢íWíWíW³¢V¾¸òÅ•/RUº1ݘnäܱX?´~hýžŽCŽCŽC€Ýb·Ø-€]mWÛÕ€u…u…uÀ'ò‰|" t ]B`·Ž[Ç»`ì`³ÇÙãÛ¶lÀÓí?½7½7½—û|eÊÊ”•)Tåæqóq4˜Óà·Ó ‡Â¡4 B£@òЍQ+¢ ¶åÛòmù×ÖÖÖÖÖf•YeV¬’U²J€kà¸ÀùØùØùؾcûŽí;ßrßrßrà© §.œDÙ¢lQ6ÀŸãÏñçI³¤YÒ <y<žÊ>eŸ²óšãšãšãHÖj´­ùŠ|E¾o§1¼ŠWñªMG•SÊ)åÞø(⣈Hk¥bI¨$T ¼ÜòrËË-@ÆÕŒ«W–– ®<®<®°svÎÎ!É!É!ÉÀoá¿…ÿx5y5y5‡GrRrRrR€½ëö®Û»P$+’ÉKÂG܉¸q‡Ô¹yÜ|Œí‰í‰í >ò+ó+ó+C¬FV#«Á<Í£y4²…,@µIµIµ ˆÔEê"u@ˆ"D¢~þ9øç``+»•ÝÊ«L«L«L€q­q­q- Ÿ’Oɧ€ÉšÉšÉ`njnjn  Ä•âJq%@×Óõt=8Y¬GÖƒy7›ÁœÁÌ\b.1—–V&Á×ø_B )àt8N€JT¢¸½õöÖÛ[_Oýzê×S@Òî¤ÝI»—÷ÌôÂôÂôðpêáÔÃ)@/ÕKõR yuóêæÕ@uIuIu `-·–[Ë2FÆÈØòüÌAæ sÀ\À̱>¬ëC¿´ÄZb-±ä_øL>“ÏÄs\+×ʵ‚b/öb/«eµ¬ ßÐoè7@çPçPç°-k[Ö¶,@q_q_qô¥k/]{é ô }B°!aC†ÀÔlj65egËΖôN½S(€º†³s?Ìý0÷†™]Ì.fý’‘–Iˤe|Õðšá5Ãkè—÷êïÕß«°± ΧO;Ÿ^öööŽGu9êrÔååv¾ˆ/â‹€©°©°©0À‹õb½Øåvy€<@ˆãÄqâ8`[ลæã[Æ·ŒoÆ1ã˜q åÒaé°t˜¯bŽt¤7pE\WD Ú½Û½Û½æçÍÏ›Ÿ‡œ­cëØ:XÜžúªúªúª€U?®úqÕ€R­T+Õvb'v\)WÊ•íWÚ¯´_RRR‘†‘†‘ «»«»«Wˆ+Ä€?ïÏûó°¹×q-ÿZþµ|a 1#1âïÄIœÄÙ(fÖv®í\ÛùÎiq‚8AœÐô`:z:z:š¹üÂå.¿à<árà>ïlSò)ù”XŸ±>c}Ær¤„P!T]®N;œv8 ðØé±Óc'ÐØÓØÓØèŸÓ?§H+I+I+õùØçcŸ!ÑjµÂü¸aÜ0n`zÄï‹ß¿ÿã>ǨcÔ1zÒA )ü¥ðwpwÖ׈‰‰Ý’Í^œ½8{ñÙܤԤԤTš˜òzÊë)¯“ÎÙƒ³g‚Ê2‡ÌÂ^b/±—<Á< ‡z 0.â".¶ [-` ÙB¶àÌœ™3cþ^̽˜{1ØÛdh24pMfdëÊR–²ê½ABôa˜¦i`{™ ¦‚©;.ƒ`ȱËûä}ò> ÛÔmê6Ñýûû÷÷ïÇMMMX`â™x&€xÀ@âÐMtÝ õ¨$]’.I× ÅÒkéµôB~½ézÓõ&>@dEF€˜‰™˜O d3ÙL6ëÿ‚*T¡Šóu¥yΘż‘{›T“jRÝ™Çh £9Ù‚ld#›©Õyé¼t^ü1s¤9Ò 9y¼F^ƒ~ðƒ1Ä/ƒ–°„pçp A4ˆ-iÑóÆ•Wn\qž077çj$$$¾( * * *;û-ŠQŒbò`€Ob5F£3˜ÁŒ $j¢&jòÎÆÆÿo9ÝœnNa,Ñ–hKtÄÇñãÇ;O¨cÕ±êXf•R)•ÂFdDFdàà OxA@ci,%7ÉMrÜwÆïŒßibGeGeG%sñ©¨§¢žŠz`ussÛ÷ï“™“™“™ž´“vÒNޏö†;qžw•—ÁCð€×Ýñ»ãwÇ{¾=ßžÿÆ; ¥B©PÞ¿4¨Ô êØªÖŒÖŒÖ šHòHɃDøLøLø 2È è ¡3á Ox,L'“F|ÑÑÑ/Å„bB1±B¬ûÆ;‹Ò{`uI±Æ•‚¥¸/€¥Ìõ$‘¸w·ëÜ­BÚÐæòÉ•°æ°æ°æª=Ò£Ò£Ò£_”š|L>&ÎüUÑWE_9O A‚W¿w¿w¿7þ«»·»·»—dÊäò@„€¿Þâösû¹ý ÿªŠQŨb˜'®ùþÍ}Cýž‹Å˜k“ñ®j?S1“ÿœÅÇÎgœÏ8Ÿ¹ÍKT•DõJíã¤ÇI“¼›Íz³Þ¬§•w?¹ûÉÝOœq³ŽYǬƒÍÅ‹âEñ§|i=­§õ¯C $ìÈâù+¬sÿW øßóü‰ývKЊV´:‹i m¡-£e´Œ¶KeÝmÝmÝ-„ŠêDu¢:FÏæ²¹lnÇÿjµÚí£Áh0È «…ÕÂjÚèò«sÎÿƒ?±ßi×Ë¥Ýbä!yÜ÷$‹d‘¬›´•¶ÒÖ¿½*ó“ùÉü=;ÊŽ²£c~Â{Â{Â{ÇÆö ìØ,BåòçN,þŒãÿÄTZž9ŽIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-69.png 644 233 144 2520 14774263775 14710 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]HTiÇŸ×ÔÆ"÷¦Õ,-Z±Ö¢…ÆÖ %KȰFeÓ‹-ÜÚ0’í¢P\ŠJú²hÚ¡‡¬h/¢Í /dƒÜZ-ÓjÜÆ°­ÏyÏo/Μ9g—Ún;7‡çëÿÿŸç¼ïó¾""2#öpgº3Ý^Óvcû“×$¯ÉùÉ´ÛtpU¸*ú€´@Z`fûÌvuß¶­¸•בּñ|–_fˆíHêLêtùbö~Ø´xÓâäÏM»õ6¤\J¹ô·Û®l»pñìų| £wGïD|ض·ò­z ω/ûÿÃ/‰W¯º!iZÒ4È*É*ÉÞa&ü‘ åeåeà à †ô0àÁcø€ &°ž1‡mÅcùV½…gá[|¿©G }eúJØPµ¡*å´Yp?»3vgÀÔ% 6<\ÐŽkÇÁøU›§Íc’f£Ä(` €ÃF…QFŸ–§å1ÉEíŒv€<è^ ?Îgñ›zäßÿöǯacòÆd` `ªôa}Ø«?Ô2¥ºÔ€À°Zd1‡Á˜kÌ5悱:.ÔŒ'‹ŒE”ë]zS éc@ÔÂñÅùÅ)èË#2š2:ñ<ÐèÀ$¥Œ¨Ujo,"í -]K‡ð®ð®ð.ˆ†£áhØ===c7ÇnŽÝ5 úU¿çOU¨ ãx¥q¾8¿©'&¬í¨ßW¿ÏªVK8«´ð¥”ÚÚ:°u`ë¤Ö¤Ö¤Ö€¯Ç×ãëÁƒ;wBÙó²çeÏ!åPÊ¡”CPÕXÕXÕ Ð-Ð`¯¶]Ûîà‹ó›zbÂ~û.¼ºð*^W«’¢ÑŽX߀­7Zo´BÆõŒëסÏÓçéó@SKSKS lÙ³eÏ–=P’S’S’c7(<<:š;š;šm¿þs´:Zmáµ6¿©GÀ{Ë{Ëè„Ñ‚ÑGájÍ£yl;Øì öBbcbcb#d®Ë\—¹üÝþn7ïïïÁü¢ùEó‹à|Óù¦óM6’6’6G}tô‘¿XKÖ’¿8Îoêq‹$”'”“'’Ø•Ø%Öó—h’%Yq[Þž|{òíI‘¥s–ÎY:GäIèIèIHd¨r¨r¨RäiáÓ§…" "¡ÎPg¨SÄ=ètŠL÷O÷O÷Ûx’*ù’ïà‹ó›zÜ"*¤B®ßE´õÚúxbº«ÕU覆q–-\¶pÙB‘gÞgÞg^‘SÙ§²Oe‹DÖFÖFÖŠ„ƒá`8(r9ãrÆå ‘âkÅ׊¯‰Ìz9ë嬗"E¹E¹E¹6žûµ»ÏÝgóÙü1=Zc éôLßuFÝðsuçêÎÕÁŠÞ½+z¡ÝÛîm÷ÚñÖÒÖÒÖR(X^°¼`9tWvWvW:ÆÇi#`€Qý ~ðרvå;í…ö±‹æ1›ÙÀ1Žq̱4ó˜Ç@1Å"DñvÚi–K®ïÖ¾÷ïÊ÷Ì1›3†ªVÕöS^•¤’@¯Óëô:P>åS>[°>®ëã çéyz¨Ýj‡Ú᪩Íj3obècsì=“k2ëwô;ªVÕšçùÅñ3Ѱ§` PÀ$¯yíð¢jT S6ž…ÿÁÉÿ‘³Ò¸´Ð‚´ m@÷ë~&Á¸mÜÀ… lÛŠ[ùV½…÷ѳò“½]|²÷±OóûËs yQkIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-8-grey.png 644 233 144 6113 14774263775 15732 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—}PSWÆŸsïÍ7`  Æ¢å«bZµV"ÚÒ§K;~ ãT\+¸;Žn«éH‰É´«¶´Œ²¥EèVº~!–ALYW,ÅÂ,B)Ÿ ƒ !"HnîÙ?¸vºÓéùçÌIîyŸ_Þ÷9ç¾!YYYYYYÐbzا'f5w—»ËÝ¥–¬o²¾Éú†Î7 šMƒë#¨7õ¦ÞÇÿÌëx¯‹Ù5U6U6UF¡…($„! a:л° »è1E²"Y‘L Üî÷à?…d„Œ‘CF?£ŸÑ¯ªÕœjN5§’>äIâ4‡pKäÒ23€+°+˜o“`LÂ-ç¸sÜ9î»ÜTn*7•Ûëp8*o;–9–9–ż­9©9©9‰Š˜u1ëbÖC¬,V+–û,÷YîHké{éyi¿o&¾¨'éK<'fðEêE½¨—°ì$;ÉÎÀ“l ÈV1^<^<^àóTåS•OUº¬ëX×±®ƒqE¶D¶D¶$…AaPàÀ»xïB pØØ``SþSþSþHj©i©i©¡®ëa×î‡ ½üèåG/oýD¨T®Tºwºwºw&œ¤i4¦ÝÝF@@À¼H2'3'3'Ô 5þž\Wƕ՜sN8'œ‚Ö­ ZïHÙ›²7e/÷­vT;ªE‚Œ`ðÂmá¶pM¢I4 €rÈ´£í‘9‘Œ†Ñ0ðèD':ÁÙ=ížvOô”ä•ä•äñÛznöÜì¹ÉÕÉUr•\õëU>™Oæ“_ÚŒ—ð^ê¨T ª@6_6_6ÿïÿv\u\u\ Ø”””Â'¥¥¦¥¦¥ruZµV­Uc®Ð$4 M¢hpŒžÑ3z€½ÍÞfol5[ÍVì;ÄÌæ s WèzœÐ'ô }€V®•kå˜+Å—ô$}‰Gâ#&‹Éb²$.w68œ W¼žx=ñzBƒw?Øý`÷Ò -Òi‹ÀP=ÕS=¼H!)$…€˜QfÁ,˜ûìÿ±è`:˜ðÈñÈñÈâuñºxàg÷³ûÙd"™½AoйEn‘[µï°ï°ï€pJwJwJGcG=G=G=‰U+•Çnˆeh £aG^sÅ»â]ñ€¾QߨoÄ:P.Ô õB=¼È rƒÜh-£e˜Î g…°µµdf™YfúŒ}Æ>#ðÙüÏæ6°mF›ÀûxïäòùâKz’¾Ä#ñ1|0Ì?¿ÛÛæmó¶áXT|T|T<É9äL SÃÔHG:Òr€ ç~ç~ç~ 6 6 6x¾ñùÆçTßTßT_`ïÙ½g÷ž\Z—Ö¥šw5ïjÞ5û*P3ñE=I_â‘ø¸©á©á©a|‘‘‘ƒªVU«ª…ƒfÐ š5ùˆ|D>P…*TÍ Ésä9ò`Aÿ‚þýÀýWï¿zÿUÀ5Ï5Ï5èêêØ:¶Ž­|š|š|š,ÄB,H:I'鲑l@ÔãTyª‡A Rb,䲸,.‹ª|ª|ª|ÜAöh{´=jñ¢ ì¬ÐÓËŸ^þôr@Ó­éÖt¿ð¿ð¿ð€0, ÃÀ |P>(zý{ý{ýß;¾w|gK ZJKi)@ZI+iÅ”XIõëë«°‚X‰•Xñ9q7q!g·Œoß2~«zÒ4iš4…ìzÜð¸áqCô{ß|øæÃ7Ýûc¢c¢c¢™M°Á¦0s1œò„ò„òà±Ðc¡ÇB z}õúêõÀÍk7¯Ý¼Ôm¯Û^·ððð’£’£’£ååå€&Ódš J´DK´à.?wù¹ËÏ Ž¶ä¶ä¶d&]¹J¹J¹êçÍ®zW½«þD’ٗٗÙ õ¨:W6(” ÞR•••¤%¨T *º6ñbâÅÄ‹ä_‚Q0 FPFÎÈ9ã0Ãúaý°èêê4k4k4k€€'N2¹L.“ÂÏÂÏÂÏÅD1Qp4j>Ô|oçççâŠêWÕ¯ª_'_¦,e)óÂŽð¶·Èt›Ç6 •¨tÇ’dY±6oºm«Nwíqíqíþ²Õ½Õ½ÕͬŽü8òãÈ‘LŸ¡ÏÐg –N+#cd €:èfKŒ/ñ%¾èOô'úÓÌa}âñÄ㉼>µ}jûÔÆÿuÌ6f³q¹²IÙ¤lòoëh"M¤‰ŸTÓ#ô=Âù‹mž;vºo䎓ä$9ù¯Œéwø2¤! iÌ?Ê™r¦œá÷ØÍv³Ý 5é&ݤ£d YB–X„EXP•Q@_£¯ÑפJä¹@.`JÄ÷ªx»â튷ÝûGŽ9Èå*B!гæÐc¡ÇB}R #Œ0’sèBºø©Õ ½èå[±û°”E”F”F”ælRîVîVî>kñññæì%óJæ•Ìsï—©¨ShD#2JFÉ(@JI))h-  x„GxE­µÖZk¥k뿯ÿ¾þ{6Gã§ñÓøõO:‹ÅÎâw޶[­F€Z©•Z1GÔ9-:Äù¼à!x˜Ót¿é~Ó}À¹Ï¹Ï¹ï£o·ÆûîùŽòŽòŽr6ÇòºåuËët-É $ áŒpF8 TPô1}L„'<á11d²Yq¶riåÒÊ¥˜£Ð h!NˆâÞ9Êd3ÙLvÿ$SÈ2…l®x7$J/"YIüK¢—b‰ØÑ»ûEïn½{yÆ»ÂVa«À¬ŽÌŽÌŽÌF²Ð.´ íP3áL8Ž)ÞÀxy!y!y!îÐ^xíT.U.U.ÍY9}hÔ ùB¾Ï劕ý«T1³Ùl6›1*eâ3½»_ôn®èÝïþÏ»®rW¹‹ßc/°Ø  f†a<–2Q5Q5Q5!8úóûóûóÙNåaåaåáÖŠ©{S÷¦îþ¤ó•ÎW:_DÀ qŸZ”øf@,= ü z÷òÿyW7¢Ñqö‹Y³.f¹÷#¡ÅœŸŸÕ4Ô4Ô4mêvu»º‚„ !è/·¸-ÜnËĪàØàØàXfXÔ{Uœ'~ËÅâwF|||||SAØþÞ~åíW_Ù-N°ô[ú¨qÔ8.v_ìæ0ýíô·žODmcÞˆ7Öx±øòѯò‹@Âå„˦)Xõ̪gDà¥/í|¹6à~ЋЋîÇÝÓÍ ÎI$é€?Ƙ±ùp¼±ÞÀ3ð|Fþ´ü´|þVâ-ñZ:C îžçtÝÙº³ _öó:è TQø³òPyÈŠþ­EkºôOõOôq}PÔ2µŒÅ£x8ËY’ØÆûgÝhݨAðîyzKÍ¥fK§ÁGþ¿·Ÿ¼ÎZ»ÍnýwÁQà'~ý íYíY‚º]ÏÑsÐõwõô"•B_­¯ÖW¯Q@¿ºÞ L(u—:¥Nîà( vÍ®?y=¦•""¿9Í¿-,üñà^ç^Á&~?óÚÏÝ?w³¨ìTÞSÞ‹f –Kƒ¥0S8S8SJ³Ò¬4ÇPcŒ1` 'Ψ{ÁëÓÿ&‹AWÜ·¸m¹b¹â7øˆnéøŽ©ÇTð62ϼf{u[^f^&X¬mÖ6ô½»÷æï͇GµjÕBþÕü«ùWÁ겺¬.°·ÙÛìm888%¢5kÍZ3xZ={>†ÜÖÜÞÜ^ô+ïVVF¢lÚ«‡®ºfT®ãQvŠˆÜ®ƒ¯|_ù Û<øýà÷zUnJŽ#ÇÁÊìáÙŠÙ Ø4¿i~Ó{}öúl‘–Š–Š– ‘)mJ›ÒDúGúGúGDÒ§N?,2ttèèÐQ‰ Ò²ðzÏÀ7òù#wåSûºxjßcOç ö4µoIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-20.1.png 644 233 144 3160 14774263776 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü%IDATHÇÍVýOTW~îÌðq`ÔÅl"%Ä"[-…`«ñ#%òѤH§Å­&5&µšnhi Ñ5„´–lµ‰ÈFV+b6›èê(¥L>\º ®KÖºdÆÖd…”q¦32sï=çÙf.wÚÝ?ÀóËÍûõ¼Ï=ç¼ï{@V$¿ mù¶|[NB¶5Yú̚̚Â?'ä^ƒT^W^ÿ×ïIg³‡$W~¾òsqÏ’M»éŸXø©ùL=VÀRd|‘ñ…R™”;É7KÞ,É\“êõÊ‚N6_m¾J’—û.÷ñw䣯}M’¡ÊP%iɦÝô7ãM¼T|tþ"?@¦ÝH»¡< 3Ò3Ò²à•‚WžiM8ž!^mx•$¿·o—6’$Hf1KV’Œ2JsͧȦ=éoÆ›x&¾™ÏÌŸà2·"·àéׯ…Õs‰€{y¦­¯­”£$©]áö²—Y¤¡ É?éKúcòŸ¢[t“¼*¯Ék$)ïÈ;$ c¯±—1êzH‘$Ï𠳸-‰÷—¶‰¶ “ཋ¼ä²¹lê9“~~¶'^æ³åå¤|Ž$µ ’1ÆHyAtŠNj²JÈJY(Ÿ—Ï/ï¥]Ú¥d3›ØÄ_.)é3ú 5é7Lµ6Á…FÑ(L‚'^N9JXßÍ!õ‚z!ê E"Rû-I²î‡ßÌ~<û1µZ­Mk³2ű@,@ ‚ÁR–ÈY’Be–³œ%éãÇ,õB8º+º‹‹š?OÔ€Jò¶: D&È-Ð{“|ïÓ÷>%#?‘¤(«ÿkmm?éÌv®w®§,ÿ üÝòwÉPG¨#ÔA¶ˆÑ"ÈÌÖÌÖÌVrŸwŸwŸ7…Ø0‡9LŠi1-¦ÉÐg¡OBŸÛ?Û~iû%Ê®½}ímÓY”‰MÞ&¯¹s½7¡çÀí6r({(›ì;ê®w×ËÏæ0f†î,ÜY¸³¬U¢J;Jw”î(%¶?lØNuuu‘××^_{}­Å/Š„"!rë¡­‡¶².ާáËð—a_0ô‹óçMb·Ûl[ö·ÙßnÜltmtµIyIQÎ ûFƒ£Ad þcpjp ˆ¸"®ˆ X·:ouS–S–S¬éZÓµ¦ È/Î/Î/î¹äþ,/µF­Qk€‰±‰±‰1`söæ¬ÍYÀ¢o)¸DFÂK9‡Ÿ*¶Ul€œÑœÑ[l8iÿÎþ‹Ñ¨ø?ðëá•î•nÿXÚóFÏ@»Ön´Àù™ó3çg€º¢º¢º"àñáLJ¶hº¦k: úTŸê³ôJž’§äöIû¤}p´:Þw¼ RiVš—Ý‚ÈLó¤yÀÞ`o`±MLëé)ßàòSžz¸§¿ |@î–ŽgÏöWî¯Ø_Ü Þ Þ ÎUÎUÎUÀ\ú\ú\:Ðáëðuø€à\p.8lŠlŠlЧ{N÷œî¢ÝÑîh·E4~#ã?úˆ>²¬ÎÅ]½P/án墋7oÞ™¼UÞ*À‘¶âÖŠ[|§fOu¬:†¸÷Gï¬wè¬ï¬ï¬œ#Îçpjé §6žƒžƒžƒÀɺ“u'ë€u¥ëJוž)Ï”g ÐÊ´2­Ì"VUí¨vù¿Ê ç…OÞ¹w”çÆgÇg Z­¼3 ³ È–Ú–Z«JHcÐ$ãç(—os+XA²ŸýìO©Â³<˳$KXÂÔ¶±Ä%.%:ŒUJ”¤Õ£©ùZ޶M©J^Nö1ª~ÕuÈ¿ù_ð¿@]‰>cü;G¹ht#Æ)§å-y‹{ı‡4Šb£˜^á^‹°P„"’'xŒÇ,žbŸæÑ<\”a³ù_ô¿HrA ¨”>ö??¾[Ù­ &;sØ2†H>»Ä.jŒ›L:ÉøÏv‚”$ä<çI Ó_¨qÁð^’š9YvgîÎü¿?9+éÚëÚ›2+ùáÓ>½<:®<Æc̲ŽÀxËx‹1RŽËq’¤B…´dÓ¾|dÉxÏÄ7ó™ù—gåûºxbßcOæ ö¿f(’‰w3ÍIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-36.9.png 644 233 144 3236 14774263776 15057 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜSIDATHÇÍ–íO”WÆï@˜"¨›¶X4Öjİ–DÚ°E$în- 5’^ZLEÙÌFâšÐ°¤[Ûİd¥ ®SÈ–-,´Ô‚¯ÁBS·l¢Î¶[mAy0ÀÌ<Ïù퇙‡™}ù|¾<¹îsß×}sr®sDD$Ê÷0ÇšcÍ‘^l~ÃÛ¶kc£×j`ÚcÚsç7°²fe @t}t½n÷ccÜȬñóö3â%þ@hsh³)Õ‡ßýñûãÃ~âÅïwƒ¥ÕÒ:ï7ÛÞlh¹Ør‘bxÔû¨`:u:üØ7òzƒ/_Þù¯þ"ÒÒaúBW„®õéëÓ_<æM¸ÿ"d¼–ñÀA?)3h@*pàÀøž`cÜ—oÔ|¿ÑÏèïÕ#°æÕ5¯ŠðÇÌ™ÌËoÝFuÙ¹²s ¾p·RG-µD€&š—4³ffI}¥¿«¿ üN½§ÞPwÔ`Q; ` <Óžià÷œã궯­ì‹²/ vÉ Ê ²\0ôÈîí;‰Ù·ußVP¯¸{€<•¤-j‹¸Õ uQ]DéÃúúË+…ÊU¹*XA0Áþ8ajT¢Ô*Í¡9p+ª/ùø÷ï;¶ï˜!ðƒ[)"²¹šk–,9‚á~ìýXpWðˉWÆêÆêpzŠ=µžZ?÷ˆ{Ä=¥¥¥àŽwÇ»ã•SN¹º¾s‡¹ÃàI×ø³ãÏâÔ‡¼ü0\5\|gé±ô8‚ =¢L""µ·àˆvDƒ™SL1¥oýÙö—ã^ŽƒèŸFgDg övコ÷*¨ê„:y…y…y…ÞÞÞ)å)å)å0Y7Y7Yç4Û0Û0Û?—]®].°^µÚ­vÔÁ“Ù%Ù%À0€¾_9|ˆôê1ë;ED’ÚE2œN‘öªOG>1%zîyª,Xzné9ðèÖëÖëªÙÌŸL3¦â¤õ™´gÒDîhCG†ŽÈä€sàùçEÚÿÑ>Ð> ²v|íøÚq‘–„–„–‘”M)›R6‰< þ0\dêæÔÍ©›" á á áþKïOïOïÉMÌMÌMéøUÇÛo‹˜¿7™ƒD,¹–[–[2)/b²:@œYýUË×òM÷DB> ùL¤ï}£}£²æÐÌ¡o}#Òs gÏ~‘G§~tZ$5-5-5MdÔ6jµ‰ÔõÖõÖõŠŒ©15¦D¢.G]Žº,Ò\Ô\Ô\$rãì³7Ίtí<ÚyTdGæŽ×w¼.²zjõ׫¿I9ž•%kDf³g³EÌ1ôÑgº'¼/"ò÷2ºš>núxùðü6¬¢¹¢™¥móÛ&¶MÀù¼óyçóü[tÉzÉzÉ I]I]I]`[°-Ø`:a:a:2ã2ã2ã`Ê:e²BuVuVu$îLLNL†Ï÷µ;Û,ýTKc}c=ð/¯Ÿ]ÔނÇ €Ï}§Di%Z‰ß¦Phh :T‡êšh¢)ÀìØ±'9ÉÉ€x7Ýtø–oøê=÷=÷øåSY{¸˜óê}>†eÐ2èæìðöáí ýÚë3Z¥«ÍÕ†SÑ3õLàK®q ôõúz}=hùZ¾–z†ž¡g9äzŒ£ÇoQ@h.}“¾ ´-®rW9N½tÙÇ^~ ðX†,CŽ`}>ö?ÎOvXv |μ¨]×®èùz>îåƒ °È +¤ÐÑYžðÄàA¡|õKŸq³d‡f‡þ_ç÷Ý•dÌ:pWrü…ã/,´UT‡Ç åh9,êVݘ0ãF¾QoðüF?£ÿò]ùÔ¾.žÚ÷ØÓù‚ý7‚åÕ ¿¨ ¨IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-15.5.png 644 233 144 3147 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–_L”WÆß‡CAÇ MX¤Û&ëbã`6Fí¶ÚÊ©¥Ò”Òº]Ò5º$Ý,¤½Ð¤E­ÐnÄTˆIwI-–`«‚1Lp±&[]×™ –-4ã‚ ƒÌ|ÿ~{1ó1{³—ž›/ïŸó<ï{ÎwžsDDÄû X³­ÙÖÅQÛú‡¸?ykòÖ_ÿ#jÑÀò²ååÿü–|²ä€¥mKÛt_Ü6ãf~â|‘8~"Ÿé§Äö/í_Z6Çì`gÞμ䌨Ý8ŽNGgH…·ºÞêøêøWÇÙ ?_üù"ÀÔæ©Í·Í¸™oÎ7ññåƒøE étÒiË-°?bDržÏyþ‰w¢ 7Ÿ€’â’b€Ÿý´È°€6 ¤’jl‚1G Á6ã±|s¾‰gâ›|&´ôMé›D ôµÒ×­(""¾Ïáݬw³7€ÒÉ|ÄG¤‚z[½ FX-WË ãz»ÞƤÐÀ?´j­š05 ÀPh¡…TãÇ(ž¡Ô¦×¦&_é`é £2Ëx,¾§±ïçà•ÙWfÁx@4Fx÷Œ.£ …?ð*ÿߘgžy T>åS ‹,3¨ «5¯Ö˜+xไ­ùM8‚Ž`ÐÆ·Ã‡†-Àn  Âœš«æª¹q¾™e3Ëf–ÿ¼ÿ¼ÿðŸÿxücæ&ÿ8›;›Ë6mÉðÛÃo¤<žòxÐftFëþ-"rÄÕ Õ `¸ô‚©ƒ“ïO¾ë×·¯oÇ8÷—sµçjã„Y¡¬PV\ ®WäääÀuçuçugpÕ»ŽºŽbä»]«\«àúŸÆFÆFôØÓµ§ ´Òh=Vì""ëN‰<[ùl¥ÈýKá¶±âæâf‰ ýyèõ¡×Å’üßäPrHd&e&e&EÄZg­³Ö‰T,¯X^±\¤£¥£¥£EdõôêéÕÓ²0f³ÎY§ˆõŒµÏÚ'R±¢"TKÇá“›Nn’Èê¿e>•ù”¥P*Ý­îV‘EŸEë±ZV,þzñ×O»åƆ5Öˆ¤±´~qñ»‹ß‰½ÐU¸ªp•ˆš©fª™"£‘ÑÈhDÄf±Yl‘žòžòžr‘âkÅ׊¯‰ŒLŒLŒLÄ Þ=¼{x·ˆÍisÚœ"=;{ªzªDŠÏ¿të¥[bÿÑ9¶bl…¥U>ßzoë=òRo¤ÞxÚ-°4mišîåd )І¾pì(r¹Š\p¶ìlÙÙ2˜ðMø&|pÁsÁsÁß²36f@ã•Æ+Wâ~ï1ï1ï1ðx=^71€G›íÍv€¨‘4{š]÷Zý”~ÊâEyQyQÄò+I7;ž?=ÿÍü7"¶µ¶µ¶µ"¾Ã¾Ã¾Ã"Uw«îVÝiÛÒ¶¥m‹H`G`G`‡ÈÊú•õ+ëE:²;²;²E†j†j†jDvuïêÞÕ-Ò–ß–×–'â_3ñèÄ£"ùËóÏ䟑t‘Ù'gŸ±fCÆÅ;•ÿªe¨½§½ø=€ñf¬±p]JÔ \*¼Tx©0Þñþ¦ýMû›ÀäNr'Á‰´i'Ò`ºhºhº¶÷oïßÞþ;þ;þ;p¨üPù¡rXw{Ý÷뾇¿ç8>@ìüoRÞþBû @o´žXaG´ê´–^;½/Ïo?Ìܹ£î~ç~™9÷<çÿÿçœçùßG@DDr¿iO§=67§ítÞg¿”ýÒ_ÿ™àzÕõê7áñÿ ïxÞqë¶Ûy{}j½ˆƒŸÊg¿—\q^dÎ:íZŸˆ;a[é¶Òì‚x|d›?®G ¿"¿Bê^«{ÍãÜ>‰ÑZÔZdóéAÖòo‘à £ßè0;Ìbü]Õ¨PW­kÖ5à¸jTf³ÙL Œ¨þÁa“£lŽ} “‹~éú¥ -‘­f0 ‡Ó3æ›J·õ$„ q¯iWÓ.ÍZ®^ЗëË!úÏè§ÑOQkÞY³{Ín8W|®ø\1(¥”R°vÓÚMk7AÞ‘¼#yG`Kß–¾-} …´rôíkÙ×¼¯6NV=Võ*ÉÔç㻦†¦»sÇB aÃ-<XXÈÓ㿾÷ë{ÄV·¯n^ÝìœÝáŎCïŠÞ½+`ÕƒUV=€¨Õ¢–––ÂêÕ7ªa¨m¨m¨Í©¯©«©ªqF³>‰óq#p1pÑ6Ü"0÷âÜ‹ê4#%‘àvBZ³õ¼õ<˜O™OšOBYFYFYwww:˜èšèšè‚uû×í_·æ·Ío›ßáKáKáKàÍõæzs¡~iýÒú¥à-õ.ó.sêÍoÆ# # ÁÖ“&â®u×òœäd|ñµˆ|+""ãò/é—~wÄ}Ï}OÄ]ì.v‹dkÙZ¶&2vfìÌØ‘›ÖMë¦%Ì æsE–x—x—xEêëëE®œºrêÊ)‘»%wKî–ˆ\¸záÚ…k"}[?/ÿ¼\Ľ,Χ>q׺kEl=i"VŸÕçº%µF­ˆè""’ïú‹Ìʬ$Ÿ™ê™ê™j‘̽™{3÷Š\¯¸^q½B¤!Ôj‰ ®\9¸Rdt`t`t@dsùæòÍå"'ý'ý'ý"‹î,º³èŽHA]Á+¯ˆ”Ï÷r"þ>Ò^ô¹8)NŠ“Þt^¡äªäªä*úÑÉ['o¼Å^óúGý£$HÀ3<Ã3^xát;ìçëù~ÇÌ·èó—ó[œ8,>y¯òŽ›ŽSŽSê*÷Œ»Ô] 7ƒ¥²$–•Ö«õj=@3TY•êTUh-¤…­§ûè>€¥²T– •ïwϸgÜ3p;n:n:nª«tàaqXæùmq:šÐ%t ]„Èr£ÜØñßPp¨à‹‚/T§¶}èƒ_íÀ>ì˜7ì˜FäÐ@AMö4¾Æ×ó²D–¨ìMö&Àö²Õl5ü|YÁ¡‚ÇU'ÏÏy8±<´<´<|ëw|­Á¶Ý¶-ö<ñnõnÅÓp?=2î÷ÀóòçåüÏg=Ÿ“Ç&ÀxÃxîîêQl[Àÿ"óE&Œååôs2½ ð{žx{ã©­ÁÖ`k`‹9Î'ïwÈ;î4rGkå × {?  vù‰Ÿ@ò‚ä‚¡u9JŽ@̘`)µ”@í§µŸâgFÝ’º%‚Å׊¯³jW0 èf µ²µ²µ’½¯W6‚0_BJBJB ½>öºvd €¿ÇÚc€öööv¸pñÂE¨?X0Ð2Ð?Žþ8 Ys³æšýog¾ èM·Ó tƒ‘o¬h¬h¬à<œƒ^{tíѵG'£nê¦n>øàt¢cÌ\©ÜøÜxø°æÃóüÝÆ»ðÁå.À<÷<7”ì)ÙcZæÓÞÐÞ¨›öÑ>#?çá|aP|[6P6P6 /¤4ŸÑ"@A˜îŸî7ƒ´¦·¦@¼-Þ£GF˜ýjœg¶‹ÅÈvf;MÓ“ÚRm)@ÿHߥïùË–—-/[®ŸÛßòŠVd¶d¶d¶`hJ˜¦çqçÁ°•)L1µ ZV‰ÞD/|rÿ“ûf ZM«@]¨.4ÏÝ.º Ù‡³¡‡0 ,ű8è½rÄ;âñâ|DtŠNÑ9ó˜_u§kNל6Z s¦-ÓS¾àwë¿[±±à¾î¾nbù,hÍ1Ï—Ü*¹@uÄ9L•¦ç¦šþÉÈ××Ü×Ü׬WòBš&¤Í<&Ò i…´¢¶‰¿eö…ö…ö…t‘gƒgƒÇ¹Ÿåñ¯›7oÞ €eLeL™APê&Ð 4æ™ÝÅ´˜dÛ³íVëÚ¨mD0€€;àRjSjSj5ý¥D)ñ˧$¶0¶0¶ù†|C¾Ñ9¬øeùOòŸÐÝz8WX¯JFzF:€À{ß¿÷}DË¿¢_™5M÷Ò½&·¿ôxéqOK†J†íËPù¹»ênÕ7Ußhp›´MÚöòÃßz>’OXÒ,i–4ï)¾ÁUïò¹|F=Õø‘„‘0 Øì7k·q;ôLЗqÙ¤EL~6ù@+ÇÆŒVŸ™iDùè¢~µ¶ÙêluªÕó±û¾ÛxËý,å°œ@ €ILPpWV®µkíÆãlüëÆ{ïÑÝú ôL~&?S$íLÚ™´“±@, „saºJŽ97üY. ICÒpiñžÅ{ï!ÄRe©²T)tíæä䘵«¹4‚P @0ŽqŒ›”»”.¥Kú¶¬lYÙ²’åéw¹ÕbµX‡§Â¿–æDvZè‰j=¢ÌþHÛ6'¤]Ï9“vë]õ&íZU«j5€´mD1´8ˆA JÌ`Ì`Ì [§k2VŒcßùS”ODñÍ&/ŸZ¢´»îg´Û«ôÚU{Õ^µW ¾Hz‘ô" X6±lbÙ]¢kñ¬tV:{<‹K-,½hÀ_W c`h×'ùLÚm¶5ÛšU«§ÓÓéé NALpR×%×%×%ãØ‘Ûä6¹m0ü—$æ/QyÃóäµWF¾á°v/ü'íæ®É]“»ÆÐ®’¥d)Yhù™Þ ¡B¨*òk#ÓˆãQyò_ŽWi7[j’š¤&o®h¨h¨h`ÇR§S§S§Õ¿ë­öI>ÉçJ&¤ƒtð±#y¢òÍ&ÿãˆÖîH;÷ŸÂa‹° Ť˜k¿ç‹óÅù€@"ëýö€=`"Ý‘îHw„káåQû¿ «þ­’Bù‡H÷Ç•"™È¡Gèzþµ 4ÿ+%ª3¯lõ¿Ìލ…;IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.png 644 233 144 2200 14774263775 14613 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü5IDATHÇÍ–OhTWÅÏÌÄf"Q'`ÉF 8º .ƒb "Vð¨(b‚mD$”.*ta³èBZA\Œ%"‚Bº£Æ†R$¥jÐE¨uft’¼w߯‹÷î{/V¨¥ïæq¾û}çîýÞ½W IÊ_Arerer©“ÝQ<½)½);èãÓ.$v$vÜû–õ/ëh:ÛtÖ<ˆ°·ùñz)âëÙ¸2ŠõWê¯$:Ü»Wï^þÜÇ?Ý‚†k ת:8põüÕóô@a¼0Pê(u@„í¼Í·õ–/ί¾÷ô%X4²h$ñê?«ÿL‚–-W}ë'<^[·lÝ0•šJyIpg€F½ L;Š1lçƒ|[où,¿Õ³ú¾Áò Ë7H°}Ïö= 9¿àÁE8²âÈ «7 ‡>úh·Î­.:80ëýeΘ3à•MÅTÀb~pî9÷˜ óÃú€/ä·zVß÷£…{ûó—°3½3ú ÜÛîmsÀ`>˜ð€ùyxćÅóa6xQ½å³üVÏê+nè‹_ ¡ÐP(×ÁC÷¡~f¿ÙÏ[FxÊÓH}nóÜæ¹Í034343Åþb±JÓ¥éÒ4ÔNÔNÔNÄìþN… „|!¿Õ³ú¾Ÿ¤oï»6©ótçé%ŽÔšjMym’[q+úUJ^H^PƒI™»æ®Â‘oÏ·çÛ¥ÖË­—[/Kë^¬{±î…Ô<Ú<Ú<*åÖçÖçÖGù¦dò&/Y¾ˆßêYýÀïpâ{¸ôúÒëpå¿wÀ`xË[`„F¢¨µ×ÚkíPÍWóÕ<ŒíÛ5¶ Z²-Ù–,Lå¦rS¹Øþöz½^/„| gõ}?‚¥7–Þð®@amaí‚V÷Æ?ÐC“L2 fÀ ˜(Üù¨óQç#8Ùs²çdOwKnÉ-}¨Cþ`X}ß iIÓsŠÓÅéøoïÍx3±:Ì;óμ‹ÂO&žL<ìáìáìaxuìÕ±WÇbu2d€5j üÅù‹‘¾ï')™a3œ¸/9ÛœmaK,—ôXýÿCHªSê$ö²—½Qï ‹ƒE©íYÛ³¶gRæhæhæ¨dΙs朤çz®ç’ÒJ+ã‹ø=«ïûIJåŽrÇŸH7¯ß¼nóøFò&½IÍIª©&É•+WJt%º]‘±Å£‹GJ]§ºNuŠâ‰æDs¢YRJ)¥>_ÄèYýÀOp—Á¡ÞC½veÍpÊNt¢{À¬mU?ƒ‰á;ÜáP @὎ò{4^ï-ä7k"}ßÏÇŸcvTxɢ¿a3l†Áëöº½î˜¡*Uªÿ0ÄÇžcÿçäwp€ oxÈ/0ÀsñúÏ'ÿGÞ•pœã4F[àîs÷1 Þ-ï a;nYPoùþõ®üd_Ÿì{ìÓ|Áþ ¶ÿ%ù>ª¡^IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-21-red.png 644 233 144 4212 14774263775 15607 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü?IDATXíWmLTé>÷c@:¦dÐu©n+5UdW@>RÐh JVL vYû£Šì°ad\1»†¶¬„E%!-‰UCý"»†6.›6a[fXÅhaèÀ ÷Þ÷éæ½ó«iÚó‡9ç¼çœçžóœ÷ D‹²œDL µ†ZC­Â¿¼†ðžžžìY•UYýö÷´žÖÓz`ÑÍH&™d®:kàçy<ÏÇóÖÓñøã+£2*;ýѯË=rÜÓ9)Ž Gu ƨé¨é¨i\Ùý`÷ƒÝ€½ö>Úû(H/H/H÷éÜÏÏóxžççõ^Œ‡Ä­úêÏÄqFœYÏ;WWW¢¾{®ÿ\ÿ¹~¶ÔùÌùÌù € \˜Å,fŒ`#€®{ýü<çùxþÀz«?{1>2Eˆ£â¨8:ògž ývúíôÛÊÛ‚Ímsï°$ö {ŠZ¥´*­€ºQSã5OÝ¥îÔêu V©UjÀ’XK‚Âãm ¶Ûl<¿8 ¾)B‡&t B'‘|\>.oäæs¥¹RÉÓ½§ö«ýp*í å åñ:<èChùZ> è„OfƒÃTkª5Õ²ŽGÇ'–ˇŽsÇÙâ³Åg‹Ù!o—¢wgtpt€;µ;µÄqB΄œ€O:?ñï$”ÇÊcý£5­àιžsÝïT§Ûåv骋××;€ØxTbTbT"&³'ߘ|‰L(ˆçß\R_R1c1cÐÿUÿWPÿ þ°xÀåw–ÀpÛpl)ØRàïß™²3Ї¯îS÷ùpOfOfOfÇÇžØur×É]'}_¦ÚÔåêrãÜ´õþÖûðñÙÏúwÊ™àLðrþÐùC`¿e¿ïľ ±¶XäVäVø…k¯j¯ªM½¡ÞðÕçx8>Ñ»R¯² Y†,}ÇB©”Ìd&¢ŸrÓ•3WÎÕ<­yJDäùÁóQý–ú-DDa¶0Ѧ•›V­Î\IDtþÉù'DDI1I1DDsßÏ}ïwÑ,¡ !¢6º@|õ ]†.C—¾òü~eE)Í)Í)Ížæiž\F;ÚÁðkmPônFÞŒ€˜ê˜j‰ ‰€îÇÝœôôzzýõ쯳¿€´i'¸½æo5Ò`É,‚E€ñÓé‘é‘鑿øHÌóļ…1¯¡¡µ¬µ¬µÌKøOë)ë)n>â÷|¸ËÔïÈ'¯=y p¥ÏÇܹ˜¹˜¹`ÝôºéuÓê‹]R—Ôu:•SÍK½`€?¡—ˆïOàãî¸4îÇÝFS£©Q1Ú;ìön¸áÆ4GjéµôZz}׎Ü"·È-CÞIÂîÕõÚiéË xËËÝ?þ'înÛ±mǶ>îZS­©ÖT´-ú™> ¡H(жW–§‚ê ô_Ê˸›&ÕIuRÝÈF¸¨¶¨¶¨–Jò$y’<ÊßõQKãÒ¸%ŽÚ©ÚÉ{íHö z¡ô?J0wêÛþ) Ê¡ÊÑ~.®Wˆ+è/wâ]ñ®x‘4 HÂuo`aÐäþobÔeQeɃîŠE&2‘Â5ášpíñÊEûϬA“±å}é¨ÿ ‰¾Œ9è6ðßIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-26.3.png 644 233 144 3221 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜFIDATHÇÍ–íO”WÆÏG˜…QÖ¤»&eMy „(†H,è븦,¶b ´!Eºu7Y…jt5Õ%ÆŠféÑE¨Ý l†ŠAb1i7Ø@È&¥Št€aaxžóÛ33ûò8_&÷}îûº®ç¼\çBêùàáá÷wì÷ž7¿~Ïú=‘×Ýñ%t9ºœ¡SòIÈ'Æzc½:âµq­Þ·_/¾/Ÿ–¡Â›llÖíöÄgáí¸·ãÖÿÔWö‚¾Ußú¯U(ú¢è €–†–ÃÓûOïØwÛwƒ7ÖÆµz­_ÃóÅgÿ‹_xéË—¾Ôý×®^Éx%ãÕß» Æ^…ì7²ß˜ôŸô—~ Ø€`‚ånÀí7íkãžz­_ÃÓð5>ß­G@Ø®°]BPcž5ÏêëÜ #M\.i(iyÀÕʹÄ%‚AŠ?ŧüZ=¯žþ,Ëe9€’CÀ²²_ÙVí«v ’+\!X~åÁk,i.iÖŽ4ñ©Ùivêë4=â?×öãt^Ë}=÷u1®~À‰ä§êGêG¸d¶Œ•±HõGuI]Z›)d,À:ðæY''å$RþJÝ¢nÁ,°2؃Ÿ™[˜[¨ ü8Ýg)…"ê/tè¯é¯9`lËØp½À¯m‘Sg§Î²è*vU»ª½|®Ç®Ç®Ç`;j;j; ®8Wœ+ÎGÐ)Nqʧþ¼Ëâ²€í—S S ,®þÉV‡Õ|­oÑ·84=B& !Ä¥>ø âƒ ˜_P2ošMòrÈöíÈ;Ûv¶Áüùó7 p¾p¾p‚bƒbƒb!åDʉ”0S6S6Sæd¿h¿h¿©[ScScÁXml1¶ skÍ•æJX©qóÁûsïÏlsë«?Bˆ”@‡¡Ã §-™–LYøZXä­È[85ÓFÓFÓF0›ÆMãЕЕЃÁƒÁƒÁp¨âPÅ¡ èîîö «o¯o¯o‡äMÉ›’7}Ñ>mŸ†Ÿ7·mnÃÙ·yèÉÐYi‘ Tºõ" † Ù ¶|[>\€øøøxtùÑåG—¡1¼1¼1Ÿ'>O|î%Þ‘º#uG*T•V•V•zóƒG þêþêþj˜5ÍšfMûVÌ®˜]аýzÓõ&¦A½­Þ%ÕeÈR‡ýÔïVËVËtâeÃÓ O…°|wgìΘ+_®4T„Èÿ!2RˆÑžÑžÑ!ü£ü£ü£„˜;9wrî¤W]=võ˜SrJNI!BsBsBs„¸yïæ½›÷„è~Ðý ûUUUBômèÓ÷é…°ÿÖžaÏ"d,ôxèq&„sѹ(„8( Ò Ê´=fyÇòÜølà3Y¸gš3͉s¯cï³½Ï ¾"¾"¾î:ï:ï:¡u¡u¡uccc i©i©i ìaö0{˜'Ìæ °él:›Ê-å–r lûa›u›êf®\¸rAÛò¿}^ûy-ðwm¡ÊbS±I[5”ÛÊm`™)¦kkI$‘@ 5ÔøØÃ#Œ§9ÍiŸ|m´.¯í1ª„)aÀ¯¸¬¸ XñœJZ<>†Þª·:äWÖ­Ö­ œwûŒ2²âXq°¨”+=JȲWö‚𮦫é ä)yJ¨Ùj¶š à@V£ÕhàDJµr_¹Ê™•;+wXT_öøX§5Ê ×;xâñ±ÿqþ•}º}:`Æã̳J‡Òü¨f©Y¸Xñ|1žXf Ÿ‰Š Ì1Í´§$R}W}ËJ—Òµf»ý°/p_àÿu~Ï]É›yoæùÜ•”†—†¯´ç8G0¬:VÊAå NpÏ  CÞX×êµ~ OÃ×ø4þµ»ò…}]¼°ï±óûoà,V•YIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-30.8.png 644 233 144 3211 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü>IDATHÇÍ–ýO•çǯ¾œCPé”P»4.|—LX×B­¸Ay ”€Ú%Ú¡ÖeÆHƒ­Y•:ñ—SR¶kE^R„cÁŒEœÄIY¨ „bÕ.€X8‘”qÎyžçþì‡sÎÙü¼yr½}¯ïsß¹¿×- ""‹|_ ˜ ˜ …^;è÷~¿5Õšúóó^»\K¶%»ïOöqØÇá5á5F¿ß6ãf~`½ˆ?°Ÿé—EâwÌo˜ß`IöÙ@^|^¼u‰×þ°lM¶¦Ÿ4(l.løê³¯>ãð°óa'ÀDòD2øm3næ›õ&^ ¾|ðýE`î×s¿¶<€ùóæÏØ×b_{áÞ„»/@FZFÀPðP° } %T%SLa®ñÛŒûòÍzÏÄ7û™ý½|"_‰|E„O2'3'mÕÞ‚þ/8St¶è,¨xš¨¤œrBA·è B›Ñfp©o3Æ Yµ¨Õ£z—ž¯çãmB›>¡’JBgñ>/ª+ª3 öÁ¹LW¦ËVmò‘ÿ=ÛS[øYÎÚœµ ~à¹üÀ ~©»u7eWeª ¥©¥jéìN¡‚U° ~Ç›¼é÷©ž¨'(£ëºŽ˜f”͇¿)'-gvOm 8J‘_œáo¶/m_NÍ»1wcÀóg~;öòhõh5ÓZºö®ö®¿ŸkÄ5âG¬#Ö *^Å«øBç8Ç9¿éîp?v?†36>ldZ[åŇ»Áwƒ[­njŽÉG”ED¤üì×÷ë0ù>yl¬}ysR\R„¯ O OAåÎ9˜s´\-W˅ƒ… ‚uÂ:a€í;Ûw¶óԚțțȃô©ôñôqˆ^ýRôK¨¬Õéϧ?ÿù5€±Þþèí@½ïådlIhɘΘi)µÛ‡-ëµ;Z©V*îÁ¿ž<+–þìþüþ|‘#¶#¶#6‘Þ¼Þ¼Þ<‘ûï_¼Qäf×Í®›]"-=-=-=2»®v_í¾Ú-2Ð>p}àºÈ•¤+K®,KßîÛá·ÃÅÝߕԕdY/’¶"m…ˆªöñÁ¹°ya³j {¤t¤Ôÿ§SÕOÞzò$¶%¶&¶Âʨ•Q+£ d_ɾ’}°µ`kÁÖ~Š=Åžb‡Ó‡N:}ÈïuŒ:F·-n[Ü6+ ;v Ög¯[ºn)üøÓ¤šTcwÆî€:µ }Aºjâsˤe’8iZðê‚WEúôïö·_½Ó½Ïõ>'Òr«¥·¥W$º8º8ºX¤mGÛŽ¶"Ö,k–5Ë¿3Í£y4‘yIó’æ%ùý©©©"‹—-^¶x™ˆó˜³ÄY"¢©j£H}S}D}„8D"ƒ#ƒET©ôIqAꢾKße¹#2÷ÒÜK"Ý¿éé‘Èí“Û¿ÙþHç¥N{§]dèòÐå¡Ë"™e™e™e"÷ÖÜ[soÈѨ£QG£DD6ÜtrÓI‘ÚóµçkÏ‹„\ ¹rMdxÏðžá="ªÑh4DÆ»ÇêÆêD¢D‡D‡H¤ÈŒsÆ)"'T‚J°Ü>ùWmµõµõ³—÷ kICI®žÎN¨*¨*¨ 8º ±b/ÄBâĉ7 õAëƒÖàLv&;“!£?£?£ŽGT®8\qB‚‚àS­¢ª¢ —Ùok;j;€¿xùøä¢üìݽw7ðWß-Qúý€_¦p3à ¨[ê–ºرc¸~•TR ¬b«üÇ9Îq`€ÛÜÀsê«õÕ@½y+÷¾·÷=Àðò|:†mÀ605‡ŠÁ̓›A/öêŒ~ÂÝìnfÚˆ6^7^ºé¤ŒuÆ:cèô ú0Úv£¨¡†0ÂŒ0# ØÉ¼ú?u]×A/v7º™6–ût¬~ðÅÁlßÛ¾ŸšÃ¿}:ö”ò“k͵ʧÌ3z»Þ`ì2vá™ýcðàܸÌñE ÀÉ8ã&j¶Þe♓Å×ïiå÷ÍJ²ò³òf%ï,gù,@PJ)¡ MiSú}.Pª ðÛfÜÌ7ëM<ßìgöŸ•Ïìëâ™}=›/ØÿlƒÚ8=¯)yIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-16.4.png 644 233 144 3063 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜèIDATHÇÍ–ïO•GÇϽÜ®E¨c0íVJRM,ŒAªMP²U)¥ûRÜ…l°5«Æ²5ÈöÅ®Ät+/ - , ÔR¬¤b´RkBÈj¤‹¼  á×½pÁçyf>ûâÞ‡çÆÝ?Ày39gÎ|ÏwΙsfDDäéÐ,à~Öý¬;&(»8ú¨Ì¨Ì¤å \¯»^¿õ7ˆý<ös€_®øR 8²½nÛ‡ïqðÃýÙzyZEdsd³+#$Ÿ„7“ßLŽZ”Ou·ÅÛ2gÂÁÖƒ­ßÔ}SG ÜÿñþSSàÈöºmoï·ñÂñåä#þEà‰¶'Ú\Ãùdä“"ðÜöç¶?ÿ^Ð`èyÈÙ³`$b$B»À¢‰Ö€ö˜“íõ½½ßƳñm¶ÿ ømñÛD ÷íÜ·½µ""õpì™cÏ/-|ÅIN –Çòõ–Ûr³¨{Õ'ê Rª?зô-À´Þ²ÞbÓœ2§¨¥–h*Cx±G_<ú¢Mp ž†×ÔkÊ[ ñ…ñ…NNCóg¯Àþ7ü ß0zôÇ8 ûu?ïSH!Z]Píª})RèB]¨ –³œG‡æõ²zCÿÅ|Á|ÁV=Xy«òVÙ?{%,•""ë΀×çõù<ü^[þ¸e×–]è¶sm_´}áø-˜)˜)˜è¢è¢è"H/M/M/…ɚɚɚ°Ü3î÷¹l}YfY&zûBÆï¿ÛZ•¢&L~òý‘¾£Ð4Ô4sýzÿKMKcÑŽëõéëÓ×§¡·½·½·ªªªáæ›7nÞ€¢ª¢ª¢*èiïiï K±=® ^¼2è\œÝ»3'3'Y ez¿ú¡¡¥¡¸ä#øb¾‹ùN7óËýe÷—. ÕQ‚ñ«ñ+lÈßðΆw 3¥3¥3Úö´íiÛî|w¾;Öì]³wÍ^È.Ï.Ï.‡ÙÄÙÄÙD‡Ðä¹És“ç 36363òÿž_‘_ÙÉYþ,¿cgÝY5² iŽiÖÍ+–¯X®ns~âÌÄÐj©ìH½šz5õ*tuuAÓpÓpÓ0l¬ØX±±ÂÞ¼uóÖÍ[á”÷”÷”×ÑWæTæTæ@DuDuD5¤õ¥õ¥õAÔBäo‘¿Aëâ÷Eß1OÀêÕ˜‚˜uÛ-¨ ê‚ë¶Æ.c—ˆë""ª 1ÅÄDÄáðGˆ¤>H}ú@dìîØÝ±»"µ3µ3µ3"czLi‘øÑøÑøQ‘úÙúÙúY‘´’´’´‘¦Æ¦Æ¦F‘¤kI]I]"+sW®_¹^dÝŸÖ ¯–x‘9sÎqÅÐI§ëv¨*ûŽòSc{c;ÌyèÀ‹Ç³Žo;¾ z;z;z;œHÔí¨ÛQ·6™›ÌM&Ôêõ˜:4uhêä®Í]›»FW®]íì»|úò‡—?„ËÊΗ»c ß6| ì;ÆRU~PüS%`úL°êCöH$‘Dà,g9v»`8Ìa‡5°z§Þ f‡yɼªMõ«~4ÿ4?6?ýªí¯øëâ¯ÉPU.õ1íõŽú<¨AcÐpú˜ú³Ñat0¯§YMØÉ•Gy”¬Ö먕£r€}ìc¨8§â€rJ) #zÁв¢˜Wǃøp'ýN:°à½ã½ãó`Ú}ì:^d^dXgž³.Y—C½«ÞŦ¬Ñ<ä!°@€@Xä4 Ì0Á ìˆ«ýj?­kÖ5ÀÂ'/*/ þOçä­´ß.û­ l>â#¢—RŒU`°ºKwàÂŽl¯Ûöö~ÏÆ·ýÙþƒ|çßÅcû{<°ÿ™ZHuÁÚ!IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-37.5.png 644 233 144 3123 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mLTWÆ FéP(àv‘PŠ.P7$U|éb% Ñh°£ÕZÚXØbp³š–jb ±ºÌ§"D¨+Ä@ÑeI:‰HGº) ÆòûÅÆvH[T ¼ #ã’afî=¿ý0s½“µûÝûåäÿö<Ï=/ÿs!„x!8 OO7ìð?éþ¨Q;Rÿ°/)¶7lï¿+ ¦.¦ ¶)¶IÒm-®å‡Ö ¡ã‡òi~ñ‚ЛÁ–´ÏÂÛëß^•°?éc›±í?~x¯ý½v€kÍךù3L L ,ä.ä‚nkq-_«×ðBñÅÙÿá";";Â~Ãs†ç„s¾9ÿå¿Æ^†=»÷ìxñ0B†€2 D-s7n´o.ÄÖâÁ|­^ÃÓð5>? G@üöøíBð·7]oºŒ‚¡¿s¡¬¡¬ä-_í\ãÑÜð×úkAÞó¿æeéVo¨7@:T‡êNÉÍr3€r\9Î2³þYÿ,HõÔ- àI_Y|Y<ÐäÃÒoé76BB\Bœ¾¦Á±*_¿•õVÈßøúI&A&*ÃÊ0>òXËZä“9Zƃ‡ÿÿyðàAâçS>ŬaôõÃ| Í`U^ÈR !Äo/Ðml1¶¸WÀXòX2øþ À®ÏÏ~>À’2¨†©aàËõmõm…ÙÓ³§gOÃ\Ý\Ý\,L,L,L€ç”ç”ç”®KöÉnÙ ‹X´.Zaºs²f²†¥Ù’Ç)SإȔޔ¬L\™è^!Ûz„ BˆK½pL9¦€ë#œ8Õ¬7¶¼žùz&˜v™JL%È¢MEYEYp}Ãõ ×7@ìýØû±÷a]ߺ¾u}y%òJ䨨¨Ð…9Ï8Ï8Ï€ùóy2>ÊhÈh@þnSFzF:Ü;61:1ªfÁ‰öí Xz„?_!î”ÁW‹_-Bsøß}ñ,ÚjÊnÏngyÁ¶Ð¼Ð I%I%I%Ðéíôvzuâ[]·ºnu9ÕœjN…I’$éññCã‡ÆAJmJmJ-X/YÏ[ÏÃÈí¡Ò¡R–ƒóZÄ[ Z €¹€Á#S»©]ÚØ;i´ê€îÆÅâÅbØV¶íýmïC\G\G\LLLèy‡O>yø$ÔTÖTÖT>½Åºd—ì’v5íjÚUÈqæÌçÌÃ+gSw¦î„b¾ôð%gŽ3䯢ÑiòBÌg1Ÿ©ƒàþÆý |ïw”:J™ë¯í«è«Wž+Ï•ééé`Æ ó¼yÞ<.«Ëê²>-ldßȾ‘}Ð;Ø;Ø;¨ûßHÈ!¨j¨5Ô˜†¿÷yÃóuP(ÛW‰UBÚÀSî)‡¦¼–=-{à7g“w$ï{¼ýEû‹hJ4%š ïHß‘¾#p®ò\å¹J°”[Ê-å:á¼sÞ9ï„ÆÕ«WCÓ¦;Mw ­*­*­ ×7¾Úø*¬Ë[»ríJø—ýëÜ>·TÓªoW}+m‚O‚{¬³õóÖÏŸœ¥¢Ê¨mÛXÞ³1rc$\nºÜt¹IP‘Y‘Y‘ öz{½½^÷ÏÏσ¥ÔRj)…™„™„™¨>X}°ú dßÏΆssOsOÈ;غ³u'Ð¥í1´Sy´èhð%€š…TŽ+ÇõSÏ0÷¸TSMuÈZÝæ6·)¦˜ ñK$¸Ë]î*^¼!Ñ›~ŸßìòqôüÑóÀRðTâö1Œ£Ã½‚úÑ-£[@ ô¢]ŠÕk÷ÚYRcÔ|5ððˆG öª½j/ÈBY( C]ä"AWãÕx`›ØÊ?•ie”Þ6oKêæ>ßfŒfÇŒcîÌûØSŸýQû£ ÐÛ}ýx”›ÊMõ]õ]|Oþø1Nœ¿ÐùUàsÌi8Hd°Þ£t)]¡¿a¿á;ð®ÄòŽå»’×|¨_m€+ÑàwûÝJ¡RÈ2ÈÙ@a ÛZ\Ë×ê5< ÿÉ]äèy–_Ïì{ìÙ|ÁþÁ»a9W€ÔòIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-116.png 644 233 144 2727 14774263775 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŒIDATHÇÍ–]l”eÇÏ;3t:fD%m‚·à^ØÄÚ55M£U’ŠÉÀ6HFc¦ Ö*t‘ubh™šp%½ØbJØvíB ˜A‚‘ :Äèa©L—,±ôk˜vìôýx~^Ì<óN¶ë=çæ}Ï×ÿrÞóœ÷‘‡ OÏãžÇ=+óºç-×^þRùK>‘ר`¼l¼|u?Ò댸ºöëøÒ|¿”OÛåaq þSþSÆÆ‚þ>¼ºþÕõå•yýË -X°ãóŸ|ÖÿY?»aìû±ïf7ÎnW×~¯ó5^)¾¼ÿ?ü"°"¾"nÜ™¿Lª^¬zñ‰wòÿyš77oøÅû‹WyÀ¾  ª@† Z¦Jtí/Äë|§ñ5ŸæÏ×#PñBÅ "°õµ­¯>Î'Œ `u>Öù˜æ3‡x–·y› ÿ²¾²¾°Ûì6r ®ª«ÀsªQ5ýêMõ&€½ßÞOŽëëP Þà ‚,àQÀ7 |Eþ|=î§tDD5AXÂR,(¡bÖ>k¨”};†Yp(ÝS15¢FÔ®D‰ç´óµó5 8ËYLµÝùÑùäñ!\®Òš_J‡­ú˜Ld|šOÍ—úAý@v!}0û ˜ÿ5GÍQ–ÉÂäÂäÂ$˜ 3a&\»9eN™SpwÏÝ=w÷€¹>·5·•lÁâ|êƒÔL “ñéz …ù–ñöí;4œS£Í³f»f?ýÕÐÙmˆÂ™è™è™¨K<50505 64l€ø±ø±ø1×ß’nI·¤!¸3øzðuhÜ×x¸ñ0j¦o²{²»„ïöÎÖ­zöŽ|ëÉ÷í™ÓÒôüÙçÏÚ(Æ_~Zܾ¸]–B“¡D(!FòP²;Ù-R>W>W>'E †Cƒ"É+É+É+"áŠpEXäÒ¹Kç.îîîI¾•ÜÜ-R½ªz¦zFŒŸW_O^OÊ’æc¢±¥±E£>sZ`å7+¿Q§˜{rìI 0'êïÎÓÎÓ`?j¯¶WC¿Î_燡é¡é¡i·#9•S9µ‘ÚHm.Ô\¨¹Pñmñmñmà‰x"ž¬¬¬À–¿mißÒ™÷šî5•Ì‚ï×ú_ëA×ãñ6{›yJ‚+ί8/"ÿ‘ié–/åKï˜wÜ;.âëðuø:DŒJ£Ò¨t;æ7ü†ßñµùÚ|m"žAÏ gP$Û•íÊv‰ÔV×V×V‹Ü»ý½ö÷ÜSYºÇÆc*e¦LÀÑ{Ìét:É:mN—ÓjV«ñåu9­N«Ó jNÍ©¹»Ïvlì]öGöGàÔ›=fYÎiüÑàh°··—í1½h5A¸<\în~°vXp^q^Á,ì~Å÷†eÀd‰%,¬B$(ˆÁû;û»R|Í·lóÿÁ¿’Î5kŠCÀAt?±Ýb·uQ],Î ®®ýÅ‘(äk<ÿ‡ÿÊûövqßÞÇîÏìïÆ-ß`ˆøôùIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-50-grey.png 644 233 144 6216 14774263775 16013 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü CIDATXÃ…—kPTǶÇÿ½÷æex–xPa€&ÄQQÊC±0'!4¤”EꘑhrHD<ƒP$ÆHQ Šçæjäz”‡!„"¹@Ržðº( 3p1ˆ ï 3ÌcÏîûÙPå­TÖ—]{w÷ýöêÕÝ«Ivvvvv6Ü1gSs&œëçú¹~Z›}%ûJöú'íˆvD;²õêA=¨ÇÇoó>¼ï²×Ze­²VÑP‚”L!AzЃ{±{éGÒ8iœ4Ždr¹‡ÜÖ2I&Éäß._r|Éñ%uwsvçìÎÙM†yÞŸ÷'±sB““˙܀ ØÀ” ZA+h…&›Éf²™¼×h«µÕÚêÒÛ°mØ6¬û·ùyóóæçCŽ(Ï(Ï(Ï &dKÈ–-$s­d­d­Xã¹Æs' ¾‹íbq¼¨7¯ïô'úyD>ÎÁ0êJ]©«ðI!)$Åÿ ëÏú³þ·.™®š®š®>åé¥óÒyéïnéÙÒ³¥‡±www’¥™ÒLi&Ìøà(`†fÉHF2€¥XŠ¥0[—[—[—ãÅÎÆÎÆÎFjÿ.è» ï‚„wÇcÆcÆc^?­ðWø+ü7Ê)ŽGJôšJSijÿLɲdY²,шÆåOpU\WÕø/Û¬mÖ6ûÔvÕfÕfÕf~CBzBzB:Wêþ›ûoî¿A…EX„Eà…kÂ5á8ÜÁÜH.É%¹<àFaˆ‘‰<ÀM=1õÄÔè+/*/*/âßèkèkèkàn»È]ä.òÿý†ããø¸M‰Ø„MØ4øÉkÊkÊkx7Þw»ÜbŠ7Å›âw¯¼x!ðÿbjTjTjWƒzÔ£F8à€®ØŠ­ØŠãÁƒÀ ùÈèfº™nH #aÝN·Óí–a–ÁHJH )륪KU—ªøï¾wøÞa®FY©¬TV^i妹inzOÃÏð3üLìÛ—¶/m_î^í•à•à•@rrr81GŒüþ ®Ö#Ö#Ö#€M° 6°µÙÚlm€}±}±}ñ<œ©zžž§ç˯–_-¿TAT iHƒ«¨ŸðMÂ7 ßp¥^;¼vxí "ÈÇÐ Dƒþo°GØ#€ÈÖÈÖÈVlq¯w¯w¯‡‹SÈÕð­á[÷À‰M'6ØämÏÛž·кj]µ®@þÑü£ùGéŽéŽéŽ…@—iÊ4e ×;×;×ø´ýÓöOÛÃ!Ã!áùn®îçÝÏ»Ÿ‡KdGdGd¶ˆ<"Ãð|@è>111|ô\ÄsÏEbd ó 0í0í0í\W»®v] ¼Õ÷Vß[}@ʶ”m)Û€„ЄЄ ÀÍËÍËÍ ¨Ï¯Ï¯Ïî|rç“;Ÿû>Û÷پϕ—ÊKå”––V‰Ub•Ì»üyðç¤Xäùë„uÂ:úô;éw™òåÊ?„Ùáëðuø‚î¼ðþA@Þ.o—·£…£…£…ÀÌ3?Ìü&&&.D²Ýèb ±…Ø_¯ÆWÄįįĶr[¹­Ð÷ëûõýóÃ8…ÂGá³È#ò1ÈCòHs¹Î\Ÿ ÅmÜÆíÇãIãIãIÀCÃCÃCÐ%í’vIÊÊÊÊÊJ («(«( ˜.ž.ž.ÆÂÆÂÆÂŸs>ç|Î-èH2$’ €ýŠýŠý 0›Ì&³ ›”y“y“yÀ\Àİ>¬ëCo×××ÁÀæó‡Á²£ì(; *ŽŒUÆ*c•À–-Z€ä¨ä¨ä(@Ó iÐ4”””Àܪ”{•{•{þ‚?±@@V’•d%@'é$p'°Ð.úcM­¦VS+ ŒŠQ1*zƒ‘””ä K K Kèöäöäöd·p ·0kßeßeߌÅÅÅn‚›à&,8VhZ…`±‡ØCÛʶ²­€gµgµg50ôôÐÓCO/ô·ö[û­ý«a5¬Pf*3•™óͳúsúsús€þþþ>‘d™/`€$/á²¹l.›dÖ¹Õ¹Õ¹9T“-“-“-PHnHnHnÀ¨ûZ÷µîk äµ’×J^úJúJúJ€ï¿ü~,“,“,T7U7U7õ³êgÕÏ¿„þúK(0¤R©šc5ÇjŽ’=’=’=@€)À`‚Uðü(jPƒˆžè‰ŸqÇ%6É”dJ25ݲh-Z‹V½×øŽñã;>6¢Q¨!êuˆšy%p ®"¸"¸"X0www3deeÿ'ÑÞlo¶7ïŠ%Y÷³îgÝÐŒf4/+”ŒHF$#MòÝŒnF÷Tjt[t[tŠí‹í‹í#õB“Ð$4Ú²ÿdÿ „Sp N°il›`?öc?_øÂÀÛxo–³–³–³ʆ²¡€ä%ÉK’—`îˆèˆèˆÀ®«mWÛ®¶áky¯¼WÞk‰¡,e)² +°+ºö3L S”°?3§˜SÌ©…^¡WèM±)êuŠ: 1±1±1‘>Ûé×é×é‡kL8΄cÖÅìbv1l$ÉFtˆÑ!Å(FñBä¨‰š¨ µÊZe­ó€F£Åh1Z ¨©ª©ª©âU’.I—¤K¬ Ž d=YOÖwíG PÀ-g#"""""èD#ÑÜß™,&‹Éê{‰ab˜cˆã}ÇûŽ÷c3fffùðàÛÁ·ƒo3ÇäÙòly6Œ´6ÐHI( %¡€³è†0€4’FÒPPPÀJ¢H‰‚òfÎÍœ›9ŽŒþÚþÚþZîŠ=Š=Š=×rÔFµQm<òãÉãÉãÉä_ÐC½À‹õ¨Àh !UÏT>SùLeÁ+²}²}²}×r&½&½&½¸©rïrïroG†xôaÆèD'+¬°.¬rú*}•¾ J´DK´þ¨ÿQÿ£žF5ëšuÍ:¶@é­ôVzZl¥¶R[é{ùwß=~÷8@õTOõpsÊ\AÍÎçua‘°HX·ö¡ö¡ö!À¦±ilš÷ò•J¥Gÿõžêžêžj¶ vgíÎÚ4Ф“t’©ð…ð…ð(äCÐi:M§Âžð˜ÕêGõ¸¦[¥[¥[7å°rX9 ë„uº÷òçRoÐâLÅBçoÆŠÿÜy%‘ŠÛsß-€:èdÙ@6D½2wå¸uÓžfO³§ }]x]x]`ƒOŸ >…8¡[躡`V0+˜°ò™|&Ÿ i‘ºH]¤v¯^?¼ž½'[%[%[U°qnѼ{[(Š…b®Ð9³ÅËÉÉÉÉÉQŒ(œ¬óS pdÌÝy¸Br†œ!gê¿d"™H&òÝ*¤"©ÌÙj{µ½ÚΧM]œº8u †a†Á´‰ºÙºÙºYÁcŸ±³I¸$\~x9½H/Ò‹ÿU)¤²}˜À&„¥â 8Å?ÎCðö;¹«E-jQë8N«h­Šèe*˜ ¦âûËË–—-/ +%Å’bI1ÓŦ²©lêw ê u…ºbk„¾Wß«ï%ß Þ‚·àM/9u«€æßã`ðöXî:· Çq¤#é\ ÙMv“Ýÿ­¦µ´–Öþ-Yî'÷“û1]ì;À<ð>>>NêNìNìNæàÔ ËÙ?âø?<ñŸò~0*IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-14.8.png 644 233 144 3073 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜðIDATHÇÍ–ÿOÔ÷Ç_w'Gøb‘¥ÌÓÉŠ$˰Zd I—‹È8,VcŒÎ45+ ¦& D£•I“ÍÑm5–tåf%ˆ9&bÊÖfbÖl‘êií‚%éAóàôøÜçó~쇻ÏݵìðýË'¯÷ëõ~>_Ÿ×ëýz½Þ""²4þ°®´®´æÄd믓û••E]1ù,Û,ÛÆ~ ¹ïç¾ðŒû·q;)›zÓ>õ¼H?•ÏÜ—¥’ܰ_°_°lŒËïÀÎçw>Ÿñƒ˜üûpô9úæ£ðfÿ›ýÏ^<ËA˜úlê3€ÀÆÀFHʦ޴7Ï›x©øòÎ÷øE Í›æµ<{º=]VU¬ªxî­˜ï9ØZ½µ`Ò6iSVÐý@Yj#"„¹¦SdS·7Ï›x&¾ÉgòÇüÈ9ÿe¨ÝU»ËÑ&"r»šV4­^Ðú褕V² ˆôF½‘¿S.åÒTšJPãjx¢ïÒwIØŸáC>$Ký=Ž÷qcwc·éàíNþújäÕˆ£ÃôG¾›ÛS¯Àö¹ís ÞÐ>Uw9ÊQuQ]Dà @Å_ò%¨ýªA5\ó߉ ,WÕc”Z©ëºŽ„ ƒrÄðÙ°½z{"‚§^II¥ˆÈOþŽ#ZÂè¶;m Ø_ÎÏÎåÍåÖni·´[)„£Œ2 ‘C‘C‘C,‹SôÍ4ÓœF¾]ø¾Ù:Õ;ÕK8úÓ>øl>0âèvt‡–˜þÿùàoPÿvýÛ ~`¼øƒ¿Åßå­ågËÏ¢.ŸºÜz¹•EëØšckŽ­ŠG*-ÖÜwÀ ®kÚ5 ?.x©à%TíZW¡«ÿ"ÆûßÛÿ¨æ˜?¢¾ù¼z|=>˜ÿ€Ú÷âo6ämÈ#bÆu°n°n°.I8äò y’¡º¶º¶ºv±cý³ý³ý³°úÒêK«/ÁÍ_Ý|íækPôÇÂõ…ë‰ --WûÀÛïí}yÌ!”33 .01•9• ê`¼Ž~¨}¥}¥ÎÒå¥ËaÀ;àðnܸaÓĦ‰M°ûäî“»O‚k³k³ksÒ!ãñÀxÓg¦ÏLŸ’-%[J¶@nKîñÜãð³mëŸ]ÿ,|3?«f€Ü?êT¶+Û¥.X%۶Ƕ‡O{7í]ù³ˆˆÌئÒV¥­±|l9g9'’“““-ÒáïðwøE†»†»†»DîWݯº_%rÕsÕsÕ#Òçîs÷¹E¬…ÖBk¡H÷îÝ7D–9—9—9E‚ǃ-ÁµT•ªR‘ž¾ž¼ž<™É·åÛDT«ŒÉ%VÁð˸hZ•V%bù‘ˆˆäÇkCôûú=ýžH°¨š±×Ø‹–øcˆˆæ˜c.®S@?þD¬oo чõá|vdìÈø¿ÿ{³Òœ]欌ôAbVÆRŒ¾GßCÔˆÀ‚’²©7íÍó&ž‰oò™ü‰YùÔ¾.žÚ÷ØÓù‚ý×jBw2IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-22.7.png 644 233 144 3216 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜCIDATHÇÍ–oL”WÆÏÀÐa(¶c5Q ªMµvcXb$"…¢´±fM[‰˜íÆ]·AVàƒñE\’b£64d£1jܪ,J:][ݵdR$ÑPêÀ,ÃÌûÞß~˜y™Év?í'ï—û>çœûœsÏÍûÜ+ ""‰¡Y *)*)*!ˆ£v…í±ëc×§þ%ˆ50˜ þY Ï7<ß0çó9Ÿë}aløøÈõ"aþÈ|†]%l°\°\0e‡p ½^ôzìÜ >Þ ÖËÖË“(¾R|àRÓ¥&~ Ã=Ã=cÙcÙƆ߈7Ö|‘üRó_ùE æZÌ5Ó}°úø£ãZ]¨žÀ‘Û¥ÐßMúró—›ÕKl©×S¯ã3v¾¹xsñæb°gÙ³ìY°*yUòªäpg2÷eîËÜ'ÊN”( Û'*'*'*a²m²m² º¶umêÚ)I ¾Zð¾ùÞoŠú.^¼xt¬ÇlŽŠÿ1þG{†ˆ½Ú^-²ákóÏæŸMgszÛŸ´?¹yíæÕ›WEgΜ-Rµ¨jQÕ"‘ÜöÜöÜv‘w‹»Å-2êuºDì+í+í+óØ,6‹M$&'&'&GäÌü3óÎÌùý©Ò¥;Ų°aÖЬ!ÓY=ñFÆ"Ñ1 í íö áR¢#Ñ¡ÿÀÛ3g„û?ZË'Ê' =3=3=º‹»‹»‹Ã(ßQ¾£|¤W¤W¤W@­ÇÖc ûµ<-OË ãÛƒ·oBêžÔ=©{`üÐØÞ±½2csO»§Ï1Ï1ë?ˆvpvÖì,u¼IÞ$øë®®ð¿zì³c§Ž‚«W®@mmmmm-D—D—D—ÀqÇqÇqœë;×w®œ-Îg Ô߯¿_?\Øþ’ý%ûK °®ð“ÂO"6p:ôá^6¼ ¡=¡]]ˆ·ËÛõý7"·ÖÞZ+bŽIt&:ùpý;9¾ŸLßrÞê¼Õ)rtÅÑGWˆ¸O»O»O‹ä×ä×ä׈888ˆÔ-¯[^·\¤  @ÄùÐùÐùPÄs×s×sW$®'®'®GdçâI;“fNzÚdáC‰îèèèñd{²¿ÿ&$]°{Ãî Æ>ô_vC»À8ã(þß¡££GàofÅp ?БOí®Ü]ièYc—p)¤cX]V—ǬþæJw¥ƒv8¨cÚß§M?«uh>Íú9½Io­CëÐ:@ëÕzµ^К´&­ Ô.µKí}™¾L_tr“› «OéS ~h ´á U”ÇdÿÓþ§Öaë°Çlèê/•z«i« xRæ1­UkÆô-úüL…ž1FÆe Í>¦˜žò$ÈŠŸÐ·éÛðãÓÚ´¶HåßjÙjùŸÊº+É7ÿ݈»’²…e g.‡8D<€öžö>Pª&cÃoÄë >ƒæ® åÖó,¿.žÙ÷سù‚ý~uâ)ž›üIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-96-red.png 644 233 144 4257 14774263775 15634 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜdIDATXí—{LÔWÇÏïÅ£Â"4 âà†ø@Å`­èšÊ«ƒ¦R,IÅ¢±ÕDE:6&¨µh¥¬,)R«]µ†"ƒÆ5>PÜ€h ŠmbÌbcQfÆ?ø=¾ûsóÈV³Ù½ÿÀ¹÷žs>¿{¾çÞ ÑØO~ƒO ¶[ƒ­Üž‰° Æ Æ ÆÅ DUTEõ§ÒšCs€±e½’DId6àoë•l?ógñX|ÿ||ª?/_ •P _ï¿>!QlÅÆúçÜfn3·Ù‰ˆrF9£œ¸¸üÁòËùòå?òÒòÒòÒ¼6[gû™?‹Çâ³|¯æ!~‘¿PÍ»y7ïîžÃNhRñ¤âIÅêgGÚŽ´iÓßpõ»ú]ý0ˆ—x‰—ºÑnÀ°=ël?ógñX|ÿ| Õ¯æ#S8ßÇ÷ñ}Ý—X€´Ö´Ö´Våo¶Q›l“aƒgè³õp=ŠºCùUùPçª)j  f«KÕ¥€:W§ÎÔj‰Zè³õiú4(Ìß6j±ÀÆâÀ~ùMáWÏÕsõDâq¸§ögæ`®4—™Ë”lìsµMmƒK©Ý4º л= #ˆF4hë´u4æäQÔï~¥VÓãýsíŒv.¶Ù\iÞeÞ¥d³üŒ‡ñ‘Ô+õJ½Kç± ¦Ý¦¦úû³îÐîP xâ¸Ô½ê9õ¨_©_p9«Õ0Z…ñ|âFq£¸±}[¨)ª)ª)Ò?õTêb½e{ €üvêÛ©ÀX[À›åo–@ãÌÆ™¾¼ÊVe+¬Ï]Ÿë³_/‰— ú·êßoü±|5E5ïÔ¼£jœ¬鎨¤¨¤¨$T>_ÜßÓßã͆xöͩѩÑð$á Ü(¸QŸØ>±@;È Cï ½ß,ûf™ï]»U«pyæã;;½ùž/v\w\ãc ÏÙ—³/gŸ÷ËTÖ6w™» ¤)ŽæÍñ=çç_ 3ãÎŒ€*?¨€5k*@eß||.ô_èàèåz9ÀÈçÉÏxïi©D)KÊ’²Œ ¦µÚLm&E‡þ5ÑôÒé¥DD?¤üBDäºíºMDt"ÿD¾ïÍÑ¥t)DDzôýþì÷DD1ù1ùDD¦TS*QSyS9…LÖ'ëDtB›ªMõæ—¤©Áhyv¿ê… ªT-¨B×07Ì sNk-Z t¬a¥ï”;eˆ¿ Æ€‰eË|OtoùÞrˆKK€ÄÁÄAx|ãñ ¸pîÂ9²gÿOí퀞›Ïæ³GŸz&*•Ë=–ë#MÖdhÝÖº €|·÷n/ g gÀ½ž{=¾ WC®†@ÆÇÀ†o7|ëÛcÎ/œ__Ã×ê©Ûl÷æû×þ+W:Œp—Ì%sÉ£OIHR„”² Öeñ?NM°¯x˜ô0É{}虹+rW@\i\)ýæá›‡ ûTö)H´$Z|e¶óÙÎg ]”.ÀéE§,K(Kð>×ʵÀ¼;y=^Ie3~Ÿñ»f<Âa‚0á» Ë Ë Ë"[ı¥®Ï¸ðó2ïgÞWKYZÍâÈwäC†5}{úvƒì“"“"àîÕ»W}A‡b†b`eýÊzŸ.ˆ®‹®´ï~Œø1Â[êâ;EÖ"«6h®Ö k)³Cä?&”’¥d)¹û(s°ì°DY¢ôL£r‘££Ð—ÉeàRî+÷ý:væ" @Æq·èµh¨m¨Í[ê“î“%'Kð¾ñ„Vð|Åðbn"7‘›8óH p×è¯UÜ*nÕ»‡¸:®Ž«cZÑ6X›­ë¬ë`5´[ªåiy _Ö/µ­ÃW´KÚ%@ÏÔ뇽Rê«ë“ú$ >ÄÔbjQ6'Y.l¶YÌZ6eS¶hò²¦S:¥‹åTOõTO$8‡àøìœñ´2U›ª•ûVûû_íjǵã~€2dLtV¬Çz@/ЖjK!³m+o¯¼¶òšZj¼@/E·è¶îŠÝ»)voæÍ¼™;å¡+b˜ã< „.¡KèâÎOÙ2eË”-DR±T,[wÚM7§›Ó}µ«Y4 dXa…À ¼À /·:]®N÷j±j~Õüªùz¦ñ–GHRDßð˜m ñ¯4×PzâÌëþ¶)dL»öS>ÚÝaÙá£Ý%Bñií‰öD{âÕb':Ñ XC;C;C;õå†&Ãø0>ì£R<ÀL¯žª´»ü?h·ÙÚìÕ®Ò¬4+Í <;; ÌrÎrÎrªÓ -6 BÃ?2©y¤øzÍðn`þL»ûMûMû•{½Î^@† NFj9o9o9ï½vÄCâ!ñP§ç'Iè­€¼žyzãu€ƒ9|äÑîÙ?ÓnƲŒe˼ڵ.´.´.ĉ±uݨWÈr…ï–ù§á_äå迯ÓnªP!TÝspáîÂÝ…»õ³GfÌQî¥vÁa™DµTKµä¹v{@¾`úG vwùÛ¹ÕÜjn5@Kh -Ñfðq|pÄG×®ÇÆÆ íB»ÐÎ]ñ8Tîÿ6"Œÿ²(‹²ÄŸý—·ñ:¯ó:À5qM\ÓãÉcóS­•±Ä}m©ÿ ¥Ôkq¬éizIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-37.4.png 644 233 144 3131 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýOTWÇÏðR˜ ™ƒ5®5“”Ä—PL+nØ’…L–Š©mÄ&L+ÆnŠi¨ÝHØM©Ð¬-J²Z -KÂTa¶-¡–ÂØHR‰ÛVáµpfpf˜{Ïýì3×;»îàùåæy9ßç{ÏyÎ÷B!’#_1kcÖÆXÂvÌ[†?ÑžhOûgØ>©‚i—i×ÏÕ`m´6¤´¦´Ê놭ÇõüèùBøÑõt¿H†#Á™à4åDìx}Óë›W†íO†ÀÜeîz¤À^×^Àù¶ómüf¾ŸùÀ›ãÍÃÖãz¾>_Ç‹Æ5ÿS_ˆï‹ï3Ý‚„gžly¶¼çß 'L>¯¼R0;«Å€:$‘¤å~üèc>ÊÖã‘|}¾Ž§ãëõôúa>R_N}Yþ±Ó·Ógn O¸þ9Ç+?­ü´A€P.Îsž$z•Ê Ð®)/*/Ôü²Wö‚6.Çå8ðí%í%µB­ H@™Sæh¡…$þÁ³V¾Pù‚Nðúç´ï”;¥¹RßH}ÃØÓÈ·>—ß¾šñjh¿]¦™íYõ†zƒ¹¬cÚã5  @ôÐÐ Á(ß ¹Cî ¤íWÖ)ëtwèêîU»Wéës£¶R!6çs»¹Ý“k'×Bè0ù³__ûõ5Õ1i’&儲BY0whîÐÜ!˜oœoœoï]ï]ï]  ‰¢ÙË9ÎË‘ÿ¨Xt-ºX\X½ä_ò““O~ ›OšOúãð…ùÍ$„'‡ámõm|ŃGfü~ûŽôé`É·”[ÊÑÛŽ èÞÒ½¥{ ¤ÜI¹“rÖ»×»×»!þLü™ø3Ð4Ø4Ø4hð ŽG‚#†]•^e¯²£årfsfu¯Ì{Óö¦Ã|„’'„£•ðõƒ¯@[Ì…/ü¨9²,™®LA¯ÓÛæmƒ5åkÊ×”Cÿrÿrÿ²Qhp`p`pli¶4[LµLµLµðĸ9psà¦Ñ8vÝ£o¶æÛ»Ú»€oÂ| —Å¥9Ù5]7]gù[¼ùàMÈ®Ì~7û]XÑ·¢oEÜ+¼Wx¯ÐÈÛspÏÁ=¡¡¶¡¶¡ÖðK›´Ix›½ÍÞf°[íV»J—|Xò!üiSþÃü‡F¾zwjÕÔ*`Îâ´85§ÐŽ[?³~&ÇÀ?⟔ñýãû™¿tÂ]í®_®/×—  7n,'NœÀíØÛ±·cÁvßvßv|u¾:_p€0 ÖÇÕÇÕÇAlClCllÝ6ºm ¿$ü®à—å_–3KqKq -¥–R9£u«ej™iLˆøÞø^!®üñÊô•i‘Zâ+ù¡ä!Üÿv_u_Â3äò ±ºluÙê2!ÎÖœ­9[#Äæ†Í ›„H®J®J®—åËòe Ñt´éhÓQ!2G3G3G…èìèìèì"Í6”6$ÄÊ¢•é+Ó…Øð‡ ·6Ü©BR>­0R}_ìûðDN%ã衦¦J‚R%Š1Ò„u¥‰ˆbĪ«Û”VE¥J¬!QCQD"âꂃр!bc´„ú⟔5-˜?°’°IÝܹ3¿>ì½{W­}v^.gÎ9ß÷Ý™9gF€BˆO¬¯€´¹isÓ| ;m§3ï.w—\MØ-&¸6¸6<ý²ÎfȾ˜}Qõ;¶í·ãSó…pðSùìyñ‰p&f´Íhs­²ìã°±hc‘{fÂnºžvOû?vÝØuàú¥ë—¨…áÞá^€±Uc«À±m¿oçÛx©øâø;üB@FgF§ëO˜1}Æt!`^Ù¼²ß$€¿Â_ð2ýeºN3 xñêUÀØãUŠmû­x;߯³ñm>›?¡G@nin©ØØäiM$ô‡ûçìŸcóí„9Ä!¼ú¡1` r@ýL?¤6µ HÝ­»̽æ^â4ʰ ÓØÎv¼I<ÓÆ·ø’ü =âí½=µY•^•žô€Ãæbs1¨¹UnŰZ×è€>|øxüA} ÷êvÝŽ½Z¯ÆÀ4šSð©rW¹m§Ö¤l¥B|ö3x†=ÃÓˆG&#“À_‚ºª®2)çȵr-D¿ÖFkÁ(2ŠŒ¢!·¸Å- J”(0ÅSÿ6¾'¾bŸÆ±€¾¢¯0I¯…¯"S‘)Hò[z,a-¿ÂÔb>—ù2?I«k^Ô<­y Þ 7è ÂÊÃ+¯< £-£-£-Ž>cÐ4ûÈ¢#‹Ž,‚²ñ²hYÔÁS?M˜:¼°øl~K%ìñŽ…c`&ò¾¶â]M]Ç»ŽCÞí¼Ûy·áIß“¾'}l 6áA׃®]ïïäÝÈÝÈ݈sP*Š€ãW—5Æâünó%øm=|÷|÷t /^æê· B¿……AÆÁŒƒa~õüêùÕPY_Y_YãùãùãÎÊ2zaôÂè(Ï*Ï*Ï‚Í'6ŸØ|*‹*‹*S¶Þì—­²ÕªcÀæ·õÈÎÌÎTÏáÕà«A0¿H–=çwœßq~Ÿ+>W|Î^Vº¬tY)4yšé€gƒgÃoŸ@ðhð(À+¯t¨á 6ySŸÝ/’áÏÖ3qÉ—LÀÑÑSçâVh®j®Ê—ŸB 'Ðó— [{·ö|{öÛ³|ÑkÑk“u“uÁ&oêM¿áËæ—Öé‹ÀÌïg~ïŽ?G¾½ðí²©‚;eа®aÀ˜o̧½à<òÈÓuÀS˜5‘…MÞ­7ý†Ïð=£Ÿò#PX[X+7¾J5 ƒ½»dw‰Ñ³zhg{ÈÓ¿X¬G@¯3ÙAô¯úW ¡“:  ׿'ì {‚„¾nݱî_²}ä¥ùÒü®^Z?åGþ¹·Ÿ½…Õäkò¥ ýȧÜ)µÚG±Ü„Ö>5­¦Mlb™UH!… KuPÓQ­ ìA{‹Jûý ‹?Ñ$Mb ~öVÖVŠˆ¼ö9¢èÔ œ‘ÄHø €µ ›tÓÉÉp2 ±…±âX1è*]¥«² á g209˜LÂxÃxx< v•½ÑÞ ·ê­LsÕð8#¤õ]?®±“W`ûí€/ÔRÆìa{8ó·D·Œn…@W +БÈ@d€çÖdódód3ÔOÕOÕOAq¨8T‚Æ×5.‚§ï=myÚ‚Ò! ÂÕ3ú®רÏBg¼3N@ovu}}ÇúŽAåâÊÅ•‹a¼z¼z¼*ŽT©8½7{oöÞÌë)ë)ë)ƒòKå—Ê/Á­È­È­„އއŽCÿëýýéò„ ½”¾ñã™óÜÞ¨©}³öM‰ˆˆx¾rwÚ?¶clÏØ‘¢‚¢‚¢‘¢¡¢¡¢!‘ÒÊÒÊÒJ‘»çîž»{NÒkåõ•×W^ñŸöŸöŸYU¾ª|U¹Hðrðrð²È²?—E—EÓå~O»Ñsõ]?^_ƒ¯J‘™ßÍüND,‰™Nß1ß ß {½Æ^“1`Ù–mÙ"959595™xw¸;Ü)()()(‰·Ä[â-":_çë|‘ ó.](ÊÔëKFÏÕwýxETŸêóü!b¯·×‹xŸˆˆH¡i¬«½_{_ä^Û½¶{m"­u­u­u"±Ç±Ç±Ç"Ë/?¼ü°HçùÎóçEf]™ueÖ‘‡Ûn{¸M¤[wën-2qcâÆÄ ‘ùõó×Í_—1&½”~ÚÏ¿¿1¥ö\¿o϶g“0C×þ®ý]û¡&·&·&úGûGûG!¾:¾:¾†††!67676Ní=µ÷Ô^X‘·"oE´«vÕ®²NÉMg—³‹ýÿý=*æ”8…N!PK„š¯i§=‹¸6Ú€%,aIVü 9Üæ6·³âqžð¸È5®¡Á~f?ôÿžÊ¬9¦F¬ pÌœQ»Ô.¦Õ"U¯êÁ©v–:KA ¨5tÐA¨  ª !Bœ!gÈç#g§³Ô«j­Z \P~ågÚµ»{äÙȳα¬ÉOSnSnÖdƹê\P›Õf,’©¹XX€F¡€8qâYØä¦^½«ÞÅÊð~£÷ÜäÁ]Éî»dÝ•pˆCä=eO8ï8ï=¨ðà 6ySoú Ÿáá]ùÒ¾.^Ú÷ØËù‚ýTÓ¶iÒ)ÄIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-66-red.png 644 233 144 4206 14774263775 15623 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü;IDATXí—}lTU‡Ïý l¥ ¶¡-Ó%MWemST„Åj¶˜X‰–¤,¡•´©iXk­Å˜q…†¦+àÖ”Z$ØÄàØQbŠ"¦®”b6,ˆkj‚¶Ó`k”ÒÂ̰¦Ügÿèœ;QÈf÷ý§÷œó~<÷¼¿sÏTˆiû­ˆ3õ¡™Þ™Þ™^åß‘‰ä=3zfô¬^¦›º©›çˆÅb±X ÓËv«Ð….t9†ø±Ý*ýe¼Ì'óÇ×SŠç‰å«õ¢^íŽ_Ÿ—Þ£÷è=ÝÊ3Ê3Ê3HÊ<ÿ<ÿáºèºèºøÈéànv7»›íßeßeße®FòÌ—£€Ÿù„–…–kÙd ¢ð¯`_° ´.´Ì—íµöZ'&à»ì»ä»ÄUw³û%÷KvŽäqøô:½N¯;³S.tTulìØhoŠ$˜4º ÆkÄ›×n^ ÓÇ @ïÕ{Ú·/Žå5‚F`ó’ÍKbüÃúqý8@û·íß‚Ñ÷’“Uö&ggãø„=6/w^î¼\Z'VO¬žX @dÉwÞeî2c?Jþ( moÛÞØùÁÐ` siçÒ›ø"óYçî:wWôí&V;’GòIп>¾ëñ]™9d¤©À˜œ*8\p`Sɦ€°ÖF[G[ŽæÍ?;~`Õ««^¨5j €°ÖF?ý àØø±q`ì¢rQÓ9¦Óõ%ä‹€r¸ü|ùùòóŽ£iÉÇ«Á«A€Ô`j ítÚi€9ælˆÝ±oƒ ØìHÝ—º íÉ´'É¿®®®F ¾hæ˜9Ñúå÷•ßW~ŸóÝ>,w´rYÛ²¶em ^W&/O^Mvž Ôj@Òò¤å¹GrŒž= pô£oļi¾i¤¯I_°¨aQC¬ÿ±Ž}„#þç{Îôœ;?R/b…s çÎePò µT-UKo\’W]W}×ì®Ù1˜%ï)¸§××ÇvÉŸåÏPú•~€}5ûjŠ>/ú੼§òbϘÿEÿ‹j‡Úæ»{^ØóB´Þßw|îãsÎNþYÉWò•ü—„v¿v¿vS‹œú0ÐþÊþ €L208Ôƒ:˜U¡þP´Õoß®»žG+´EmQ[®¯V2” %ãûµÏ+õ å 剢NÅ£xÔŠõ”·×{Ø{¯£Ýó”yjz³±€°å±<‘a6dXG­£`¯²_·_JiÄ3âqAÖ,÷I÷I£ÎÙÉíÚVmkc±ƒV*JE©î޲®+Ä }»èÝ¢[mLÓÆžýÀ¹Z;Ýíîv#Å÷¼¯Å׫]«ÚªŽÝPLL@ŠÎËf6ƒ½ÞzÄz„°t«øgÅ'Ÿ˜ Î tMêAïŽô§ÓŸNZµX-V‹•w#tUó7‘¿ëµAmPTŽälÉÙ’³EWµ«ÚUíÝáhwEñŠâ±Úµ­FÂxñâ®p…+QnóNóNóΨÛ–¶-m[j¯rîòWŠ+eäzä×Ò¬øN+'Z/”„á©ø±{Ö´v}ïÆhw[ã¶í¦)FÌá°~²~²~Šjq€À›444`—9šLV“Õä IâÞ¾™âæZ[‚vË~A»½ÞÞ¨v^£×èuáôPz(îößí¿ÛoÞáhñíí¿-—R‹H/pޏ…Ed‚_Óîn÷n÷n#Åçñy| L˜0~IÚx¤ñHã‘ègGïÔ;õÎÈ¿$IÿH¨™³o˜h2`CD»ïÿšvW®Y¹f嚨v½Ë½Ë½ËyszÝv:¡T*•JeQS|õJB]Eü—v+í>¤µh-ZË𽸲¹²¹²ÙÞ“7•7•7e|í´zLÓÆˆƒâ 8("ŸÍ—Po¦ø-Q»;âÇ+¿Wj”¥ÄÃâañ°µHÍT3ÕLP„"ñÉ©¬É¬É¬I!´3ÚíŒòq$p}Bçþo–â<•ˆQ¢¿ü|•j«¶jƒrB9¡œýÝôüï½ JÈ{ËVÿïŒÃ¹+×$IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-41.png 644 233 144 2274 14774263775 14704 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜqIDATHÇÍ–_HÔYÇïŒÖŒi¥2>Eà-„`ÁB‚Xia QhEµE¬ÌC¬P/»‚,ÖÃFáÚCPJXFEµF/C ˜µÁ)šùgÆaÍïÞûÙ‡ßܹ¿V¶Ú·îËsÏ9ßï÷þνç^B!г_ÁUÁUÁežüÞ··…·}ÓãÙ]»»‡‚å–_(¹RrE½°¶ñ›x¾ßÏgæE±°¡¡ê¬ÝÑŠhE¸Ì³y· nÍ»p¸ïpÀÍ«7¯rƒ‰A€éêéj°¶ñ›x“oðüø¢ý_üBÀ¢þEý7ZZ,¬®]][þƒðº¶7lËËÓA“@EºH’ÄŒw>Ûø³ñ&ßà|Ãgø=="[#[…€]{wí-øÍKxÑ ­+[W¾Ì-\Úi§ä¹øÙM¸ ©§ê)%”è!=|ç^v/ãð»Ûåvp‰K!³x9|Ãgø==âãÚvÔÀžðžpNÐhùX>PÇÕq2Œ õQ}HbÁÐ1ݪ[Aÿ©Gôˆ&¥¢*JäùćŸã3üÂ/èÛ_¡ QHæÃ+ùJæëI«&ÕDšÉì̯TÎIç¤sf×ή]»Pàüûù÷óï!óWf43êsÃïé°ìᲇú$6&6ú~yHÅUÜš3‘™ÈLêRu©ºì;»ïì¾³°#GþŽ|çÌ9sÎlb›€Þ²Þ²Þ2Ÿ°q9&Çô ôßð{z”,-YªFàÝø»q{ìeµ»Þ]oÓ: ; ; !¯3¯3¯6Ç7Ç7Ç!ÜîwC_S_S_“¯rªœ*z£½ÑÞ¨OØ”œ’SzROZ>Ëïé ¡n«Û!ÜF·Q˜  Ökr¶¨+¯+¯+¢'Ôê ±æÜšskÎ ©ÔGê…XW¹®r]¥wO¹§ÜSBÈ·ò­|kçŰCB!^‹×–Ïògõ|niÒ N«Óê´]ùÀýû÷¡m¸m¸mxᩌµÄZb-ðlç³Ïvú6ÿ5¢F¾hýÇ©œsÇ][Z­·ë]î÷ûT¿êWýÀE.rt“nÒ¾R’ö䎑_|*?ÑÇPÔÒ¤>þ#ú®¾«ï‚Š©˜Š-ücªY5«fÐ3zBOø¦/æð?ÙÇ>ÑùsZ5«f2¹ E H}tWÚ1Ï4ÓÍРZTËÿêü_xWÂyÎSdK ÷Ëý8 éG€µ?W²l¾Áûì]ùÕ¾.¾Ú÷Ø×ù‚ýþ€…IXZšIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-36.4.png 644 233 144 3217 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜDIDATHÇÍ–ÿOTWÆß@(C”ª¡$…„bL×hÔKÐ઴Dš Ȳêj"ÍFͺ¡Eh«Íš†ÍΤq%‘„ÂÆN ZD6±uÓ¬F´cŒµ0"ØgäëÜ{Ïg˜¹Ìl»€ç—“÷=ïû<Ï97÷9G@DD^ÎÖ%Ö%Öø@lý](Ÿ~>Ûu°l³l»õ'H¨O¨Hü,ñ3c ›ëf}x¿H?œÏÌË JÌo™ßbÉ ÆïÁŽìÙÑ ñÉ^°µÙÚ&4ØÓ¾§ õLëöÁ£þGýc¹c¹ŠÍu³Þì7ñÂñå½_ð‹@dWd—åÌš%Ë6.Ûøò÷^†‚-[ç ÎSVÐG8âT.àÇ9ž„Åæz°Þì7ñL|“ÏäèH~#ù þV8^8nk 4 8ø¤êÓªOAõøÛhÀŽ8ÐEà¬nխ̨ªÔGê–ºhúN}'3hÚ˜6@MÄña/¡êÕªWMÎ…†­ ’K“KCß48¼Åo­xk¨×ü×€ùÔ*}ZŸÆ¯.«3ê Êp??ͪT•ªR ž,à—CqÇXg¬Ã¯~¯½¢½b¦ý×ЋSŠSLoû”""™ŸÐm;g;ç‹€{Kî- ›G_nn`RÛ§Ù5{ˆÉ?äòÁè¡ÑC£‡ÀŸíÏög‡I餓N`”AÙ@zæÀdûd;“OMù¦|l†{'î®Úì6»/‚ñ€QûUØ«ïÕaü<ÆŠõkÖe­Ë‚Äß$$ ¶÷nÿzû× «Ãê0”U”U”U@lklkl+äÉ9’s¦>¦–N,X:[«·Vo­oš7Í›Âñ4z=ŸŸŸ%5%ï—¼[³7?Ûü,T§ ¦ ¦£ñ-ñ-ªÅÊ?,ã–q²¤mAÞ‚<‘[ú{Ø+?ßœ¼¹èæ"‘ŽÿtÜì¸)’:’:’:"Òº¼uyër‘œŒœŒœ ‘‡±cÆŠx®x®x®ˆ4*?¯üðôwƒ>†í®í®/‚¿»Ö¸Ö€þÇ€é5³í³íL‹B£裛n0–ËŒe —ëåz9FQìb»ÀH2’Œ$ š# Ú¡GëÑLA|på¸r€i›ËæòE }ìWÎOqtq4 ‚Î<­÷è=F¹QŽîa–Y`š)¦þÇã à)Oxf½±ÛØŸY½Oïž™7Kï×μ+)z»èí°»’w_z÷¥9›lj©%4ŸæÐßÑßaT¯êÀ‚B±¹nÖ›ý&ž‰oò™ü=Ïóëâ¹}=Ÿ/Øÿ }æ!‰°ÈhIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-155.png 644 233 144 3042 14774263775 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü×IDATHÇÍ–oLTWÆß;@‡!@U˜Ä¦ ,šŠ¬ƒògŒI¬M5%vw¨mš¬Éf Tì—ŽclSŒ’£éc´M“RBÜtR kª%PIÐ *q,ÂøgKa@N;Ó¹÷žß~`.·»ß=_&ïyß÷yž9çžçY–øpä:r™ ±ã/ö|êk©¯­ùr!>g€ö¦öæðqxñ“?XþÙòÏÌ€[y«~i¿ˆ¿”Ïš—ebO8/9/i•‰¸Þò¼åIu/Äí—ßåèPóuÍ×_}þÕçÔÃDÿD?ÀLåL%ر•·ê­~ o)¾4þ¿¤t¥tiÀù‚óXýêêWóß_(͇ª½U{~Hú!I9À˜ÒIW•À<óXãñ’ØÊ'ê­~ Ï·ø,þ=Ù;³wŠÀ¾·÷½íút¡!ðúá—¿lñÅýlá=Þ#½Gï0¼†—˜Š™WÍ« ÆÍÍAÍšf'pÅÈ02ˆáÔºÔ#>â#ÒÕxï¦oØ7l |Á?öeíËr}jé±·ÒiÙ^ñÊ¢ ªA?ªuÏ≄â1A‚€ŽŽÎ¯G”(Ñżši&øðÙøàu{Ý–À–]K¶RD¤à,¸B®Ð|2Œ<y °Ô-u‹Ÿ"ÁˆÑAÿž«çÚüsYsYsYêu„:`º{º{ºôÄJÍ»ç3ç3!Ôê uÁô‘ÉáÉa~2R-ü{ƒ÷º.».Ï'[zÂÎõ1Y[S[cÑ™›Ôöø¦ø&˜ié˜é@mnÙÜ´¹ ºuë>f ˉäDr"°þøúãëCÉö’í%Û¡¬¬ Z Z Z¡àƒ‚ú‚z(ÚX´§hêNöwÎïœKø–Õœ®9m­Ü¹¾„°A¿mÏiϱ ÕŸ#OæNÏ&VÑPq¨â}v{k{k{k!ì »Â.XupÕÁUá¤û¤û¤>xøàáß6¾m|ä…òBy!hjnjnj†‘‘oF¾P“j’\à#Üþ¨ý‘%lÐ'ٓ٣.ñtbÝÄ: vÈ,5KÁxÉXi¬„’Â’Â’B¸vâÚ‰k'`Ð1èt@~}~}~=lIÛ’¶% Šg‹g‹gáüíó·Ï߆ þ þ ~ØêÙêÙêµk?^û17jŒöÊ«ã¾qXz–g,Ï0ïÀãñÇãÀ¥…c¯”9eNÙ………pÅ{Å{Å S©ÀTzúzúzúìºÝ+v¯Ø½ê¼uÞ:/Ü]swÍÝ5v~‡{‡{‡ZW·¸Z\¶Í•‡ÊÁÒã1/›—µ;‚^¥W‰H\DD²µUò‹ü"‹#ÚíŠv‰$—&—&—ŠÎÎΈxràÉ'"î_¸á¾H¸1ÜnIªNªNªÙsÿÍý7E._,¾X,Ú* ‰xî{®z®.Âgkqýuýu[õÑn7{þ†>«Ï³þRCZCZC ” ” ”Ø+pê쩳§ÎBygygy'´9ÛœmN;߬5kÍ”••A[~Ûʶ•‹éo$øþÕÞÓÞóÌ7–8•Ô~Xû¡}J@Ÿ×mGW@Ì– 1Ä`bb.™¿Îu®e”Qö?üí:ßó=Š*½R¯\¯=Z{Ô>•Ú¢oˆkÂ5qË' eegèÂ+)¯¤È^q¨#êˆüMýI²%[Ò_j>Í'"ÿÖ¦´)ÓoúM¿ˆ%(A-¨µ ˆ£ÌQæ(1×™yfžˆÜSLm@ÅU\~vœO©K©“jñŒ:Gòw177Ÿ¦HR47šûûVyöVoÙÞToêRg6n7€ˆYmVOx¿Jx:¨ÄŠYN µÐL‹ñ®|n_Ïí{ìù|Áþ8Vþv 7Q˜IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-73-grey.png 644 233 144 6227 14774263775 16022 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü LIDATXÃ…—kPTGÚÇÿ}Ι;·”P!ðr a€^‘›&!$!"X SŠ›UÊ %‰µ$Zc Ê2Q")¤Èr‹o4x Ê€ ìŠëÆ P²" " (†™ ŒÌœ3§ßÌ@•U©<_Nõíé_?çßÝO­V«Õjá†3,|˜xnŒãÆh»ö„ö„ö]^2U2U2µîEª¦jªþôÏ a…°B³ÝÒli¶4ÓOP‡:Ô‘b!Anã6nØŽíØN?‘¥ËÒe餘û…û…ûåz™!3dæoµû=÷{î÷ìüoi^i^i™|_Á—¤.pˆWì\nÌ"`,bËœKıD¼b³ÎYçž*i)i)i99n´NZ';®™#ÌæÍª U…ªmšµšµšµ¤8Z-‰–QîQîQìhwôwŒwø[ôoŸÏ1¿ƒÇÁÇÙ#¸šºPê"æ’mdÙæ[Áú²¾¬ïwõs s s /¸{txtxtØŠÖÞ^{{ím†  $i²bY±¬f|ˆñ!”0à 3€wðÞà/xÁlñ¶x[¼‘6Ø3Ø3ØCù® ® ® ±èñË_~üò¦#J_¥¯Ò7NnÛfÛfÛ–RAói>ÍË% `V“}óûæ÷ÍèAz¼¹f®™kî9cå­¼•á5¿`¿`¿`!vCІ  AÜIuª:U ?(¡„‚¨u¢ÜÂxÈ@@²I6Épwq ”PB!@„œÁÙàlpÆÆªÆªÆ*!÷Îå;—ï\æ¾—*¤ ©âîE!]HÒ×dc Ö`ÍÄoäÀ•W\WÁUp=~}.c.c.#/2°&°&°FHËOÎOÎOæÚÐntÃl°Áë°ë°dX` ƒ 2Îp†3@§é4ˆŒÈˆ  ÇéqzÀMÜÄM˜Èar˜†Ký…ú õ„´á¢á¢á"®MÕ¤jR5è㌜‘3nÑ0¬0+̦FYÏ[Ï[ÏçEz¼êñªÇ«Ô?SŸ©ÏÔs˜æ¿˜ÿbþ ¸ð[ø-üÀj²š¬&Àª±j¬`>v>v>à+ø ¾Àoø ¿-[\-®WÀö¼íyÛó¹Kî’»pqøÏlÈlÈlàNzdzdzdRƒ£A4ˆ}œÁ«x¯U‰ªDÖºEºEºEBj)´Z ¡¬¬¬¬¬¬ þƒ?ÀªY5«¸:®Ž«ÄaqXv%ìJØÄzÅzÅzÇÜŽ¹s¦TSª) FH#€´ä´ä´d ‘ˆ\ÜN»v; sR\R\RÖ6n<ÜxxK¼%Þg0‚¿à/øÿé]õ´zZ=O¿ ÿ2üKRm_©T" ‘…ë›×7¯o²ÎgÏ:l2m2m2«µ«µ«µ€%Õ’jIÂ.…] »œÛrn˹-€±ÏØgìv¾½óío+?ZùÑÊ€¦—š^jz 0g˜3Ì‹’†U…U…U‘jƒ{Œ{Œ{Œâ''ãNÆŒ£›wŠ;Å”ÒY:Kg)¥t€PJ‹h-ZìGëêê(mÉiÉiÉYªoú±éǦ)½Qv£ìFÙRýІ¡ C(-i-i-i¥tºnºnºŽ>msƒ8€$ˆ9ËœeÎ.®L† ¸€ äCØxoã|†Ïðp-îZܵ8àçS?ŸúùòZÊk)¯-í­õšõšõ,žÿuÖ:k¨w¯w¯wŠŠŠ|||€®¢«èª¥ù™ÍÌff3€Ô †qì v»‚ž3ŘbL1ä%!WÈrñ?\;×εƒb#6b#«cu¬ ßÒoé·@÷p÷p÷0°&kMÖš,@1¦SŒb¯Ø+öL4ÍDLÓÆ´ÑýÑýÑýÀ2ã2ã2#ðSÔOQ?E“—&/M^–_[~mù5P;(;×7×7ׇQ&IcÒè9F~H~H~H(õõõ¤çnÔÞ¨½Q ¡ÅÛ3¶glÏ,EjÔeÔeÔà»ø.¾ ˆÔFj#µKí‚BP à«_íøj0Ñ;Ñ;Ñ Dœˆ8qH›J›J›Ìo˜ß0¿Œ-¢ÑÇècý}ý}ý}–ÊGå£B9ƒLd"s§å´œ–wºwºwºÛü + + +¡d«Ùj¶&‡§þòþòþr`ÙÍe7—ÝÔ[Õ[Õ[¼÷ñ> •†JCǺǺÇ: ¹¬¹¬¹ Ðô½è~½ûõî×ö{½øô9ès»{eë™Ö3­gÄX¢'z¢Ç߉؈­^Ê,ï^Þ½¼ûà^i’4IšÔ0ñ8êqÔã(öNcBcBc‚m·Ýã¼³L+§•ÓJ๬粞ËZФ8-N‹ÓK异¼‚¼€ÍgóÙ|àXð±àcÁ@ÿPÿPÿ™™™êUíUíU ™.N§‹Í&L<˜`¾—~.ý\úùÍl~œçÇ‹x²ïÞ¾{ûîø?à‡çŽJ¦$S’©+ŠÙS³§fO½Ÿ’ž’ž’N“S?Hý õÒ=»yvóìfP¯à<{–=Ëžð+~ů®ã:®CÂÚI;i'`m³¶YÛ¶€-` .ž‹çâa¾‘t#éF66ô5ô5ô¡U1¢QŒÌ¿LYÊRV³ÁFð­¿0LSÇÔ±½LSÆ”Ýÿ«8"Žˆ#Û¬Ê~e¿²è™é™é™¡¡ƒ9ƒ9ƒ98íÔàÔàÔ€'L<ÏÄö»p‚œÇÕJ=©'õH9)'å€Ì,3ËÌ‹€&ÓUÓUÓU(ÛªÚªÚª?ɨdT2 1Ã^‘¬"«Èª[A9ÊQÎyÛÓ<[ôBÞÈ}L*H©è.`™D&±¨[±[™Ê××Wa‡!Âaˆ€’¼GÞ#ïÁøÀ€RH—À !„¥,ІÐ²¨E—‹­[/¶ÚvÏÔÌÔÌÔpGeÞ2o™÷éÒÀC‡ùû±ûÉŒ`#B ›˜˜˜˜˜Œ0Â(ª‰†hˆ† ­­­ÿÏ[†LC¦!3˜1E™¢LQáÆ?ŒoÛ­‰ÑÄhb˜·¨œÊ©¢ ¢¸À€Hºš®¦«AÉer™\wUUUO“»Žté:œrŽtŽtŽœ˜çwð;øÙo<Ê}”û(×$NÒI:ÉvûÂö8g³ý{VtD'¸<x0ð°Z ­…{ªÔ*µJ=vövËí–Û-ly{V{V{M&¤€@&~-~-~ PÔHÔDÀ“GúGúGzœîïjR5©šÄ1FŒÙspAzóv)]À¡©Ž €8v©ýI"[LÚÎÝrt ¶Ý$–Ä’Øä·žßýc!â®Mâ&q“Èć•…•…•!]‡Ä!(™`&˜ †E(Š…bȪªªl“«&WM®b‡åáòpyxyܦ)ú^¬«Åjî(Æ1Žqᯉ”–––––Âäˆ(싲kw·]»GíÚ=Ï$1ILRQ3ò‘|¦²…oá[xa‡¡ÖPk¨…’a†a`tD¢óIç“Î'¢y¢z¢z¢š–ï•ï•ïýo›å¾å¾åþÞ#ï ¿2ü `ôsœ§@ß"èSÀŽJ»ƒ£…($ÿx±éŦ›Êß’¿+WþîéÒ™3+fVp†o´ßh¿ÑÚv#„ë û û ;¾êéíéíé%¹Ê!årýD?Ño×.‡Ëáržü¯´´4ó«}¾×7ÔÓ\,~Çì›L°©”J©”ìœ ™ ™ Áÿ-$À×™¿Ì_æ¿¡òaÊÔ‡)îM†[†[†[ô³ãÇŽÛVÏò³ü,ÏJâ%ñ’ø÷½i-­¥µ§Ú^ì…óWôrü{ „§yþÀ~G»%hG;Úmûi3m¦Í‰#ŒŽÑ1ºúÏ¿9ÿæü›bˆ¤ZR-©fn-ÜL]—tºÝºDýˆ~D?B.‰ÏŠÏŠÏÒz»ß; ù÷8ü=¥]W»v÷£(ஓ<’Gòþ@Ûi;mÿÛ; …‡¹Å޳ãìø}ñSñSñÓ†²‡²‡²@øÛý9Ë'Äñÿ*EáË1‡3IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-88-red.png 644 233 144 4204 14774263775 15625 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü9IDATXí—{P•eÇŸ÷ˆKžtl48¬S¸`é`E‰3A*jŠ)Z5,µ\Æ%Sr(ÛQÇÔ(%/%3 "'IwuÚØoed‹MNüÑ,vlDTìƒïå³pž÷\fÓÙÙ}þ9ç÷<¿Ëçü~ß÷}@ˆÉu·ˆXêãqž8OœGùWp#!öXì±ØcKé¦nêfçÇb¡X(Âä±½]èBº´!Ò¶·K/óÉü‘õÔÇ#yÂùÖ‰ubÚy>+M?¦Óµ\WÞPÞPÞp@\3†g Ïæó¢‹~,ú^ì±ÿÅ~(Î*Î*Î Ùò\úËx™Oæ—õnÏ#Ô_GÚ÷íVGÔu¤w¡ìPRYRYR™¹áÀÙgœµ§ú†|C¾!@CCÃÏ(£Œ½ôÒ Ž<—þ2^æ“ù#ëÝ·ûö|Â}—: ¨½‘ ²NgÎ:mdöÜê ôè!¸ìö4{†¹ÙøÜø̇ͅæB0 Í'Í'Á|ØÌ6³ÁÜl¦š©`/°ãíx /óÉüpD}÷]šÒ¢´(-Bèuz^×tQämϫɫ1 °æYó,>£éVÁ­°{ƒ”R `=a=XND¥] LXoYo…ü&k¹µìV¦•‰OzçmÏ{'ï£PÖ—<’OÄôÅôÅô=•!ܵîZw­â½æòq3˜Çgî0/˜Ìx3ð ¯^ 0þáø‡„¯9Ì 7V£ð oÞ0~rü$˜;ìF»Ñqòy¯yû½ýÜt׺·º·Ú)’ÇáÓ+õJ½²£N4”6”6”Úk‚ üF‹Ì5°`?ÈÜ”¹ &+€©#SG>úâ£/ÂûöõíÈ\•¹*Ì?0uhêÀÁºƒuÊ?Y¯¡´!·!×^ãt6‚O؃3æÏ˜?c>Û¯/½¾äúâ‰Ç Yþæò×Ê_Hºtàü¥ó—ªçUψð7ù›*æTÌHœ›87Â~õ|Àÿ^ü{@rÿÛýo‡Ú}鵯k y$Ÿ}÷¹Ïí|ngè—™=ïN¼ Ê­¥ç–žX”¾(=¼ m§ÛN‡w¸ïPß!€¢Œ¢ €Œ¯3¾ŽðïlëPgª3ÁïÖ|·Ìžpü’GòA9^ÜYÜYÜé8šæ’‰ãÇÃc¿,ÿ²<èžö{ÚÃí¢UE«ÂýÏ]û8ÊC<„ÍoåèËÖ–­x õV€ý9ûsV—®.p5¸º6tm¨¨«¨HÛ‘¶#ÂÿÔêS@àîØ»cÎï ¾/{rJ¶$Íšž5=k:Ý’O¨…j¡Zx몼ê×\qpE˜¦Ü»1 eh@`ß‘}GÂ;wó‡›?èGõ£[–oY0óòÌË{FöŒ„¹ÃW†¯ˆ Qæ‘3wÎ ÕûÛ®¶Ž¶§“¿SÒ•t%ýÖU¡=ª=ª=Z³M>eÉsÜ—Ü—Ìû¼¿éþ¦û'ÏÎ-H,HHMKM쓱'cªWW¯ÐÖkë¾mø¶à…ÆR^IyàdÜÉ8À_}¸ú0ð´þ”þÀãŒAÀ,4¿fÞgó>³œ @›¥ÍÒfí»)òòò…ÐOé§ôSÍÎ ¿8÷Pî!s½$µªzí^›žÜœÜÀ/µæºßu?Àî´Ýiá¾\q¹ ÷ýÜ÷_Ðÿæ4ÿ4?Xû>øêƒ¯B£.»PZ]ZmùÀWµWµW/-›´ãåS/WÒž˜ô˜ô˜ôÞƒ2 jsÕܪ¹v®3¹éæó 6Œ&Ž&¾‰Ê‰Êp@ûŒ}€-lr4m4 ÌÒ±º±ºÐ¨~ùðË<í\¡ÛÔmê¶ñ¥Ê½Ê½Ê½ˆÔþî\©+••ÊÊ%{•f¥Yi–Z±~ïi÷,÷,Çãhw½9nŽpžó@ÀJ²’Âyí|;Àê°:ÀεØ!mûšûû!yŠû¨û¨Qétr‹V­UWå9h…¢Pêîk¶ÈÙúÑ"ZD‹Ú 6¨ nø³sµîuïvï6\ÞMÞoM¸v­•ÖÊp@LL@ŠÎC1Å`/³žµž õ÷¥o^j{©Í\ïÜ@£úˆ>âÙ:ûõÙ¯Ï~]5OÍSó”#AºR‰ù‹àç2­[ëÖº•)o¦¼™ò¦1e1e1ež­Žv³ó²ó²ÃµkUYUðàÁÜà7BÜfª™j¦†´XÿXýcõÙ¹Î]îŠqŸƃ-M‰œ´Ò5z¡D™g"m÷”Iíz„iwsÕæ0íº —á Y?Y?Y?…´ØE]à‰ïŠïŠï²‹M&¨ jŠ?DIqO_œ¸ý†V¥Ý¢ÿ ÝvO{H»F»Ñn´;€±Ùc³ÇfÃÃ?8lþÊÑâ§Ú§Ú§ï-–R J/pš¸Ã 9È?§Ý]î]î]†ËÛìmö6–¤U'ªNT½vô½ú^}oWð_’øóQuƒûb꣗ XÔîŸ~N»9Ïä<“óLH»žÅžÅžÅ|2yn;“PJ”¥dIMdõFT]Eü—ëNÚ}\Û¦mÓ¶õ>,KjKjKjí?.˜X0±`ÂøÞõ 6¨ V%‰&Ñ$šDðµ£y£êʼnÿqEkwk¤ó¥\)WÊAˆQ`ÍSÕD5¡EüõL²?ÙŸìBëÐ:´¥-¸,jrÿ·år¾å‹|‘¯_Œ<ÞTªÚª­Ú ´*­Jë?9¹?×5™ž¨¼wõ¿ª ÈC©MTzIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-36.png 644 233 144 2540 14774263775 14704 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mHUwÇ׿ÓM,£½˜iVB £(³Qš´e³¢¢bˆ%’=P±Û£Ñh­ÆÒ %…¥âŠÆV8¯‹½¨ÕÝ ‘ìBnf^Ôô<ü?{qî9ç6¾í¼9üž¾ßïùýÿç÷ÿ ˆˆÈäð[ *5*5*Ѳ£v»þ¸Õq«ÓoXv…žž~ “Ê'•$]Kºf\ÛŽÛù‘õ".~$Ÿí—Éâ:boÆÞôä†íS°eî–¹q[ö·-;þöE E õ×ë¯S Á¶`ÀëÜ×¹àÚvÜηëm¼H|9õ~ˆnŽnötClLlŒ¤­J[5kŸ•ð×,ÈÏËÏx1áÅF@‚ÊB„°Ÿ¿#l;ηëm<ßæ³ù-=SWL]!¶mØ_ejá`ÊÁ@ÐnTÀý¸~Ôïúl}6£ü vª¤“Ô¨Ýj7¨GúL}&£|£ÓSïà…ñ>›ßÒ#ï®í…ÏasÜæ8`@óƒ1bŒ“ŒýÆ~4õ…*Q%(»Ej±Z¤z ¨`v™f§ÓAÔWêœ:‡"Ѫã­ñ6?ÌçðK¤ Œï!> }F§áà®å¡™j¦2l;´sÚIí$ô-ï[Þ·ôb½X/v…h½Z¯Ö }¥}¥}¥ ÍÕfk³Ý8¿˜Éf²ƒ·Öå³ù-=aa¿Áߟ]mÎW/´€p?|à×»w!'3'3'’²’²’²`S˦–M- Ž¨#êì*ØU° &ÖO¬ŸXÙG³f…þêþ+ýW\<õDók~—Ïå·ôDY}[Ü(’s ç@¸âÉTß±Œe2f;šV7å7å‹è=zÞ#ÒÕÞÕÞÕ. ŒFD|C¾!ßHû`û`û HÛ™¶3mgD2’2’2’D:>é˜Ñ1Cºå¢\´ñ=™ïò/nH|˜øPÝ„àÂàˆ–ª{êÏ—|éºCU¡ªP,½¿ôþÒûJ¥‡àÒ”KS.Mo¹·Ü[ÓǦMƒu{×í]·B¾/ä‹Àó‘ù(Âvø-=Q"ò'äó©Htct£óEÿð3Ýt‹H£4I“ȳùÏæ?›/òtøéðÓa‘Æ'OŸˆL{5íÕ´W"õóêçÕÏÉž“='{ŽHOLOLOŒHGG‡He^e^ežƒ/f®*RE.ŸËoé‰1›Ì&Ïs}½¾ÞIœªž«Õà=>ñøÄã"Û¶lñoõoõo žžžÉ]™»2w¥ÈËÚ—µ/kE®–\-¹Z"ÒÛÕÛÕÛ%’–’–’–ââÉ 9-§]>—?¬ÇÚl€º7uoœ½YÈÆc £üÄ-n¹ /K(K(K€¬¡¬¡¬!¨,¨,¨,pã5Þo–ø—ø—ø¡Ú[í­öF¬Ø5.sh1 BF>‡ßÒóÞ¿ôîNtÅ]îpP(wй¶jVͪ¨£Žºˆx€ÀÇaGTú€>ðþ¿òýslÌž3æ!óÃTÐJ+GŒR£Œ2£Ì(3ÙL6“V+n¦™ifEF‘QægæspŸ^zÌ}æ>†­`Ü9ö?“gò·­f¡Yˆî–â-ƒ :=‹|LLàí;g¨rê¼q'ÿ8g¥p8ËYÜ%6v;Õ¢Zðà×¶ãΖ×Ûxãž•ìí⃽}˜7Ø|Læá™R4¡IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-17.3.png 644 233 144 3105 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜúIDATHÇÍ–ÿOTWÆß¦0ÈwY6­Äš&DSe—%ŒZ ´©ÝTjmœ(ÚЖd‰­Q# 1„ªY‡è¦‰‚ëZ·Dh*mÀÄ‚Á®Š"JS É³xq–áνç³?0—;ÕÀóËÍó¾ç<Ïsï9÷}€ˆˆ¤„ŸQ/E½•4‡£vÚñ¸7âÞXz~Ÿ2ÀñŽãÛû Ù“ìH=“zƼkc+oÍ\/bóGêYqI;ÛÛ䨯UðÞ«ï½÷›9\×®WË“|ôÍGß4767² ÆzÇzüüÀÆVÞšo­·ø"ù¥ê)}p~ëüÖñˆ}!öÈ,È,xù“¹ ^†·ßzû-€Ÿ£ŽVQ`ø€Ô@CÃãØÊ‡ç[ë->‹ßÒ³ôçü¤¿–þšlyËû®Óè""wÏAå‹•/Ð[¸Ä)N‘@{èdè$¨þPN(‡ ÒÌ6³ Ô€9`{ÔjµÀ(7Ê BÈòu|Á$¨†ùþVÑTÑd¼{ކÍÁÍA×iËüzo?χÂéÂiPŸè=jÏø @}­¾FgšFPØCý ýœ¬&ÔJ½n¾b¾‚L3 *aŽŸ?––Z?ÏØJ‘¬¿€KsiZ ×î»lžvÓ“¿k?j?0V+Œ oÓ·éÛÀWå«òUÁ¸gÜ3îÿˆÄ?3µ3µ3µ<3ô#z«Þ ¾¿4þÒH T=ǃڠ\u5»šµËðo‘SÝPv ì¨Uf¶ÿ¨ï ï ¬z}Õ‡«>Dõ¤öÄ÷ÄCÏÕž«=W!±<±<±²öeíËÚγγγà¹è¹è¹hš¨˜¨˜¨€õ¿_¿|ýrH=‘ڜڌ*üëæºÍu0{rN>žúx TÛœQ""ÿª€¯|õžÜP¥«ÿœ›–›FÐú® ¶àãúÇõë¡{k÷Öî­¹4siæRNNN²ç5Ô4Ô4Ô@Þ¼…y ÁðûÇá·©‹Úµì^t{ôö¨*…VÕªÀ¨›ó#hI­I­ª‰{cñcñ v…ÿ£ }X†Ü…¹i¹iТµh-Ú³[TÔ_Ô_ÔÇ?tüÞ Þ Þ´±Ö¡uh°n÷º]ëvAÚ½ÔÓ©§ÁW?ufê ÀxÞx¨Ã‰‰ª)J£ÝÑn–K¿óˆóˆˆœ‘‰è1g¦3S$fGÌΘ"¸qã–ùÑw½ïzßu‘ÞúÞúÞz‘G‰£ÄaçcWÆ®Œ])r'ëNÖ,‘[·n ˆxz‡¼C"2Îeœi?{ÉyÉ)"iûÓö‹¨‰“8–G ¦×ô:úE×ßÔßq,‘tK`vïì§³ŸŠèkô5ú[øü•óWÎ_É^›½6{­HÊÞ”½){E&«&«&«D·7noÜ.ryÙåe——‰-:ZtT¤;¾ÛÕíñÿÉ_à/I~²'e¤‹Á€ˆ¸U¢JtôG‰CÛ¨m¼qM–týÔõ“ˆüND„–¯üÊüÝù»EW.®\\i[0´`hÁHqNqNqŽ7}¦Ïô‰xyy‰¸ýn¿Û/Ræ)ó”yDªOT×V׊ZQíªvÉì–ÿnÝ4Êù‡wÂ;!ø2ðåkárqªÊö—í·N„™ !-dŸ) &&fÄ!ë£>`Œ1Æžªn h§v@¡£GdïéF:pÌÒ+«)«fÃå|S®Qרƒy_¿ol2Kõô¨’I¶uÍ æó¨bU¬Š# ÕSO=˜f†™d±„%`œ0z^0Î~?û=3#\Ç:³³\]µF­:öLå7öÝØù²ØÃã;ã;@7?0?˜g…Æ$“@f"Œ™À㌇¿5(”Yb– 3ctüózÏTþ§z¥Õ»¬^I¸·Áa“`o±á6ÜAu©.8ÀÆV~þH„×[|¿¥géÏ÷ÊçövñÜÞÇžÏìÿÓÙ;îñ†IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-8.2.png 644 233 144 2746 14774263776 14774 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü›IDATHÇÍ–oL”WÆŸ¤ÌlЩ,¤5M¤aé É’b %±Ñ¬ t‹DS³ 몉>MÐì6…¤˜ˆõÃÒhýRBbh" ¶Û°!!qA‘vCº-”XI¤‚òÏÉŒÊÌûÎý퇙wf\·ß=_Þœ{ÎyžçÞûž{¯@’ôbâ+pououoˆûî?¤Æ=»<» zâþ'6¸Þq½3ñgð}ìû`cׯ®ØTÊwâN~z½”ÂOçsÆõ¢RY½Y½®ê„ß%%žMqÿÜuð^õ^}bÁá/ÐßÝßÍ!0V«!å;q'ß©wðÒñÕö?üdd¸f ë…¬$xåíWÞÞÖO˜Þ{÷ìÝ0—1—aÜ`/Ùd›jàpl)Íwâ‰|§ÞÁsð>‡?®GûVî[Ôï¯ßïý4^0uëäK'_rø¢W¹H -d›ñèÑ€O­bÌ„™"fͬ˜I3 \°æ­yVÍWÑéè4ð§8Ev/‰ŸàKòÇõèé½ýh'‘5()è&ùÖ-똭ָ5N40æ—&ÓdP@Ê6±‰M`^7…¦09jÌv±]LÔLZç¬siø+ïÆÞ9?Ú™¶•’Tôð¼Gëà{û{à7`zL+k××®=„…½ »vUb•X%i‚Úh£-åFDDÀâöÅW_…h[´/Ú`šM3+üÃÁOð%ùãzÂ>¹Gß?ú>˜€˜ø–o!8¼¼‡© ×,Õ,A^A^A^ÔÕÕÁÊ‘•#+GR‚ÂáÆp#Ô\©¹Rs|§}§}§¡ò\凕ÂòÝå•åLr)‡¾8¿£Ç_·ò¿Iožxó„d~’$W©¤•hmôw£oŒ¾!×kwFïŒJCCCÒDóDóD³4œ?œ?œ¯¤õWôWôWHÓǧO—BgBgBg$û';h¥Ë?^¹<"W"}ÍœrøâüI=°axðé…@Y  Ì×ö,=XzöÎdÛpaöÂì…Y¨:Tu¨êP Ðßäoò7Açdçdç$ÏX‹·ÅÛâ…ÒöÒöÒvËËËMÅÍoc•±Jà‰Ãçwô¬“b_ƾt}'YuV~­‹úFß(×YÔ-{·Ôn©•î[÷íû¶Ô·¹osßf)¸#¸#¸Cò x<R¿Ýo÷ÛÒãñÇãÇ¥³•g+ÏVJç/¿tþ’4Ó5Ó5Ó%åÈÙŸ³_*ê/ºQtC¢]’”ëú“UgÕII=ñŸí_'à³Ðg!ˆw‹ù=•Ö=ë«Î ;owÞî¼ åþr¹ººº`1¼^ ÃÁšƒ5k «ª«ª« jݵîZ7ìžÝ=»{üyþ< v ¶¶&n5ö«ŸÃŸÐóLWb;]bËÐA=îp›Ûi{"D襗޴qƒIõÜS¶šš&¬GVòÆx¶+]ÉsCÞ€70~Bö­œ[9ë-­+Ì*ÌÒýÛ›bý56Ëç|®_蟺¨‹’ëšë¦ë¦äö¹}nŸd<Æc<’+ÕáÊÌ>³Ïì“ä×kzMÒ ´ ¹_×QÕ\ÕssÚ§'wCwCú»²ýäq¦Éä—Ÿöä§ÁÓàI;™±GíQ€XS¬‰hbÖˆbØØ@˜0a`•à!óÌÁDþÃX]¬Ž(kö5ûZ:~CVCÖÿ=ùæ®ääË'_N\Úi';µö{ö{¬‚¹n®àÂ)߉'·,Qïà9ø?{W>·¯‹çö=ö|¾`ÿ ¶è?§9lÏIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-36.5.png 644 233 144 3255 14774263776 15054 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜbIDATHÇÍ–íO”WÆïµ¼c‡b£¢’ˆ’bpµ…•`ƒ­ÑZi k@¶kj³5f£ÉN¢qI·¶•mpA†° $e;ˆ­®Eq lܲWPLwkD„‡·™ç9¿ý0ó0“íþž/'÷ÛuÝ眜ëyÖ? ˜WšWš£}¶ù—hnhnÂYŸ]­i§içÍßÂâªÅU–zK½Þ°¸‘\/Àæ3üò¬!-!-¦l¿}ö¤ìI ]â³?î„°Ö°V·Þi{§ ÀÞ`oà=éépd;²!`q#ߨ7ð‚ñåèÿð‹À¢ ‹.˜þ!Ï„<#ñ¯Å¿öâ¯} w_„¼myÛî/¸¿@™@"‰TÙ€ Æxdq¾QoàøŸÁïëG vsìfþ´Ã¹Ãfóô7ñYyMy ¨o<­ÔRM5‘ ‰&@£fÖÌ̪ëú‡ú‡ÀïÕGê#uSÝÐ ´fqx^(§8E¤ú·OyÊcËcN?ùÝùÝa6X³$&p¦þù“-,3íÍ4P¯xºøT†6£ÍàQS ª¥ê?ê?Îïj¯Ú«öÑDðãÀ…—“œÄ¬`…ôtÃ[eo•;øÉ– £YóagÂθÂÝ•wW‚çoŒ½ú öA-SÞ÷¼ÕÞêŸgÈ3䂱²±²±2ð¤xR<)üd(¯r+7LæLVLVÀhûpåp%Sc¿zò“xC[|çÝ;ï„?þ¼k¡jõõ#Ê$"RÝ´8­L0¡§ý|ã+k_Y –tKž%µ«sו]W@R‡Ô!(.-.-.…{„=ÂY‡³g†ñºñºñº@cÎÓÎÓÎÓÿ}||?$[“k’kP©’_J~ þu`hphPOƒƒmÛ@Ë÷õcÖ·ˆˆdœɛʛ9_ñåЗC¦—½·¼Þ ™üûàÙÁ³bêŸî×ú5«Û궺EnLÞ˜¼1)Òs¬çXÏ1‘5–5–5‘ÚÚZ™]]]"æ‹æs‡HÑò"w‘[LùÛ¿Ø,skÿ——dzY~±Á¶Á&²à´¿G·E·©vW WVê²M–N–¦öM_oú\ ®TÆTÆTÆ@xUxUx¬r¯r¯rÃö#Ûl?Î4gš3-€s™Ë\’““!s"s š·6o®øúñËEuìß·p@OCiïkïn= ÔuA]ši¦9Húé§°bÅä綾^@g޹ ¼«^×lóó±ÿÓýŸS¾~„Û~#ìvØm×BN nÜÚo|:¦›k›kcJ_®ïÐwßÐAèñz¼Z‰V¢•€ž§çéy@!…‚ž¨'ê‰À&ÒIí¯Ú¨6 ÚÁ¹Ö¹V¦ôŸùðéLL»v×µ1¿ŽýDùÙº;P~ežÑ®jWô½ÏüŠñïÀ ÓL+*::ð˜G<2pP(ýŒvE»¬ü»Cv‡ü_å÷¿•ä¿ÿvÐ[É+><­@D‚×åuhEZ³ :U'&L°¸‘oÔxþü[éç÷õó4ÿ.žÚÿØÓùƒý/…$× ¨üõsIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-43.png 644 233 144 2435 14774263775 14705 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÒIDATHÇÍ–mh“WÇoÒiZM[â§;¬ƒ¢ DEiX[ÑâÛbE-Z N|gú¡Ð æVé|)⇺ŠFÄ¢ R…)VŒ±Ì~ZeàmÀ¨‰¦+¶¹/¿}Hž¦À±Ú±úðñ(=QzBß·mkÞŠÏÏÂÆÏç³ü¢DØ×9×9‡/kaíìµ³ 'gìo@Ñ…¢ K„a€óÝç»Ù±[±[ _¶mÍ[ñV¾…—/‚ÿâÆõŽëuü®ñ®ñB@ymymÅŽLÀŸ°¢~E=À“‚'Æ *¸q"…5žçÙÖ|6ÞÊ·ð,|‹ÏâÏèà­öV «Ö­ZWÔ•I¸ öNÛ;ÍâK_@$ˆÔ5øAÆdŒ:¢#Ìbð½Yf–ù]VÊJF8!ÉCtÒ‰™ÅËá[|Fx»¶í5°¦pMaNP£"* ·ém¤À˜Í¦Ñ4b7nÜ`êL­©µÝæcSmª1|¡Î¨3¤A½T/‘,~ŽÏâù‚>;E±¢Xê#x¨ªî2†µ_û&žõŒfJ5²sdçÈNH&“ƒ¶ôòôòôrˆû⾸d›Ü/÷ç-à7]©+Îáçø,þŒž¬°cØÒº¥ÕÊÖŸóF>“Ïì…«2U¬Šmüæ’æ’æXZZÓeºL,º´èÒ¢KPº«tWé.ðöö†Ñ_FÏŽžµñ¨“ åÂ<¾FOVØoáÌ«3¯ry_:©N2¢'ëb'èꃫ®>°7À¦™›fnš =ºG÷hXpyÁå—!ID˜:eꔩS r-r-rÍÆÑ´+íÊ4Ãgñgô˜t}Òusbscsó~¹KßÑwl3éMz“^¨ªª‚ -Z6´@}K}K}K^ܾä¾ä>XÜ´¸iq” ” ” @¼'ÞïÉÛ{?ë€äñåø3z”N,¨ïÁó§ÏŸÚÇ^ùd•¬²ÓÚ‹Û‹Û‹¡ £ £ æ7Ïožß é‘ CCCp÷ñÝÇwËþý/ú¡ª¡ª¡ªºOwŸî>mã©ïäv¹=¿ÍXü=N!ôE}ÑqO¹R®Öð:¿qÖ8kr¶¨«¨«¨«"ä ¹B.!f¬Ÿ±~Æz!Ê•?*$Dª3Õ™ê¢!Øl íöGû…HlMlMlÂõD=QO|)æˆ96ŸÍŸÕ3Ö†½GïÑ{ì_ \ \ @k´5ÚµýÁp0 Ã<÷<÷<7t%»’]ɼŠâ8Ç>Õ¤šÞ»ÇÞq*_˧Ò.­1õ¦ÆÔ€ì“}²t¯îÕ½ÀQŽrŒßøŸÿŽ~âòN¥’ ™óT¾§¡7ê 3ô6Ÿ ›° ƒîк¸ÍmnƒÚ­v«Ý ÚT›jý‰öj/ð+ƒ èzÙ`Ì>öžÎº©nèÍz3éÜŠGbz뮃BoxÍëÃ/HØaûÜö¹)/d‚ík¶¯‰þYÐ>zìíöö{ ðêéWO¸ÝìѾÑ>€©¼©<ÛÆºoäx‘ørè'ü"`í°v˜n€-Ê%)ù)ù½ ~ Šž/zà–å–E7€:8pèy€?ÆðEØÆz(ÞÈ7ð |ƒÏàêp>ã|F¶”n)µ×£ˆˆx›áͤ7“€µJ;ŸrˆC8@µªVàØÂôÂ4ý²V­Un½]oпӿj©ZJ¦¦€ê¨Ã¡_á}PñQÅG†@o3µÅ3Å3özpæ9óÂ{š«ž…­³[gA @éÕ¯°}úú(Xõ9}]×õÄÅJ¡[t‹n ÙĦ°Ÿ ¶°];£S¡“L‚þBŸÄ­é[Ó UÏFl¥ˆHZ5Øýv¿ ÿ¸þáõa ïMÏÆÏÆs_9¡œPN„ùæÝóîy7øº}ݾnІ´!m(BP}ô…Í…_.<·ðŒ¿þãå/s_ùu†3†3€n{“½É¿ÄÐ#üKD¤ökp½ízô\-cêƒñƒãaÝ_Ö}¶î3tO—ç´çt˜(?!?!?bzbzbz ´²´²´8ÀûŒJGùPùÕò«àØå8è8ˆþÛ?=õÆSoÀäv­_ë×2`Ïš=k@ êýšˆÈ·pjøÔ0Ü»  ï\ûú“ñOÆ0ê:P8P8P;f_³r²s²s²ÃÄéÓéÓéÓÐRÕRÕRöwtt@RWRWR\ù畯®|øó+©¯¤èýùàèਾÎfŸÍu*¨ÇlúŲ³ËÎfæÊµ§ÓŸN‰ùDDÄTß{²o o@lYQYÖ,«ÈÌò™å3ËE’%Y’EdLÆdLDZ÷·îoÝ/2;;+2‘=‘=‘-‹c¼p¼p¼PäîðÝá»Ã"EGŠjŠjDFoŽÙÆlbûMéÊš•5¦z‘Ü›¹7EÌ,u/ugæše©¥ÌRÆj´¾o}_DŽ‹ˆÈ„eÔšbM‰êê‹ê™½0{aö‚Èçç§HùŽòå;D:övìíØ+bî7÷›ûEbÎÅœ‹96·bnÅÜ ‘LK¦%Ó"rã‹m7ÚD&ÿ3©Nª"Ÿü»nmÝZ™Ix7á]Í!/Ê‹¬6 ÚíŒiPe“²IÄô+qÀö€;à‰*Ž*Ž*ñZ¼¯E¤£©£©£Id£k£k£K$!.!.!N$Ë™åÌrŠ4jZ£&’z>õ|êy_›¯Í×&R­Þ[ï¹=t«óV§HÊïVÜ^q[œ"sž9ˆ©Swé.Ó`è¯ü¶‚K­žVðûà ‘@åêÊG+…K%—J.•„ÏÎᣇ> Y»³vgí†î¼î¼î<ð;ýN¿6×n®Ý\ Óë§×O¯‡“ޓޓÈñæ|“ó |j«;UwŠ@¨Ùìäo­5­5@[POHXí×àzËõ–A«eÀ‚ÁhÁÌEE½ôÒ Œ0ÂHD{h  4Ò"ü‰$’|ÌqއÛ^Õ©:Ÿë×;À|è¯\ìcºýŽýŽ ÚuåºîcZ¹Ò£ôp_ð8‡ùÔAuPu•ºJ]ÚíˆvðàÁª¦jªü•jªAKÓÊ´2PwÍ×Ï×s_Ë õ±¿=1ô€ý{û÷þ%Ü1úØÿtþm¶m6ƒ^éåžÚ¥vŠö’öÊâëÌ3xÀƒˆ 騨À >|‹µÖA{Y{…ê—ê—øl‹Þý;ÿOîJãî2îJBw¼Ç{8·µL-#úEý"&L¶u#ÞÈ7ð |ƒÏàêy˜_í{ìá|ÁþfÄöÜÔÞIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-4-grey.png 644 233 144 5664 14774263775 15740 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü iIDATXÃ…—}PTGºÆŸîs†af01“ˆ> (EáÆ ($AwÙ )#I•ãw¹E – $¹jâÆ*VP¬Ä|hâZ$®€Wƒë•ˆ«xÉÂâÕùT˜9ÓïþÁ9`¹7•÷Ÿ®žÓý>¿ÓýtŸwX^^^^^0ý£ Ÿ/ß–oË·©"ï˼/󾤧 º º ºRŸ#3™É¼gµbQ,Š%nÕÈé‘Ó#§i7ŠQŒb–ƒHD"@3šÑ `VaíÖ¿ªUÿ*Ë‘;ä¹ãïŬõ±¾mGò'åOÊŸTõÂÌÂÌÂLÖ©„*¡J(Kå—T®>˜€$ðã¢@ˆqÉ=ètÏ.(+(+(;~ÇÝéîtwVÖºf¹f¹fÅm1í7í7íÇÙ¸”¸”¸–3G7G7GÌœ8;ÐúÚsm¼6_Ë7–_ÕÓô5OVWðò'òl%[ÉV†î—B¥P)ôüÑÁ¯¿üúÙÀ Ê Ê Jï;)Í)Í)ÍÜÓÓÓÀësô9ú¸ð.ÞÅ»0Â\ÞÆÛxÀÓxOÃ52ydòÈd,n¨i¨i¨!Oududu¤xçþK÷_ºÿÒò¡ÆPch¢¯w¥w¥wåÂýd';Ùog000ð¸È¹"Wü†hˆ†&Oü$?Éï¼Õíp;ÜŽgoD,ŠX±HIX3²fd͈´qtÅØ þuýëúסP9•S9Œd! YJ¤DJ¼;¼;¼;ï ï ï õ[ô[ô[ hóµ|Z~MOÓ×x4>n¨3ÔêÝSº§tOýçEW¹«ÜUþì¢0[˜-̦,¶gÚ3í™ò•c€1Àˆ'ÅOâ'ñ€ d 2»È.²‹»Ïî³ûÎáÎ’M²I6@²JVÉ `æadm¾–O˯éiúÆÇ§âTœi³Ý¥îRwiæóA¶ [¬¶¶¶²æ‘Š¢(Š‚?ŸËçò¹ÞÇûx€zèÚFÛhÀBX ªgTϨž\üüâç?pp`ϳçÙó…S8…Ã_˯éiúÆÇ)’")rçŸâª¸*®ÂŸ]`Øn¸áàø”LÉ” °=lÛü¼öçµ?¯JsKsKs»î»î»nŒ‡VXVÃjX  å×ô4}GããŠU±*Ö¹k̽æ^s/vÏHš‘4#‰©i}x ¯á5†1Œa>ðÏ#‚ê 8Ž;Ž;ޱ±±€ße¿Ë~—ý4ý4ý´G@µëË 'œÀX~UOÓ×x4>lululuˆÝÇ'O$-Åz±^¬'"'9ÉIDnr“›ˆ:¨ƒ:ˆD£hcãé³Ï> *>S|¦ø ÑáÚõ‡k‰Ž¥K=–:>N$ŠD‘HD )¤ŒçÓSõ5ã|€X$?ÉOò“co¦G)JQ ÀL(P:Oçé<À¢X‹jÛjÛjÛ€6s›¹Í ¼ýFôÑÀèõЇô!}øÈŠbƒôuÐAànàÆ¸>_ÁWðã0³H.Y$‹d¡¿ÄÄÄãŸÊfe³²;Çαs ˜8qâË`,x°ñÁÆ‚þ!HmJmJmü§úOõŸ:îz@èÁ8]£kt € €{¸‡{ka-¬¤“¯^¼Žò0ÆÃè¯RêÍÔ›©7·WuOêžÔ=‰ýdõ“ÕOV³ù–}–}–}!"D„@0™ÉLšw4ïhÞ\™xe╉@OGOGOP][][] ¸l.›ËôNìØ;¨k¬k¬kæ6ÎmœÛH³¤YÒ,@4‰&Ѱýl?Û¡¶%mKÚ–@Wå¨rT9«Ðè”=6Ø`Ë/–óä<9åTVVzÃúcûcûcaä&nâ& h§Z‹iÁÓ‚§«·¬Þ²z ðÚ®×v½¶ X>}ùôåÓ@{ =Р™d’ÇWê•ů,~e1°0vaìÂØGÏflÆf@º™}3ûf6þPSSËÁb° ¿$D‚HX–"’NI§†‚Ùh™'Õ¡•¨ôÎa ,%,84Z¶_ïYçYçY'6.ËÅrÁçÇìÙ³¯ÒlšM³adר5vmüV€ 2ŒVÀLÁwqw1ðÐüÐüÐ ÿƒ;v(vö:{½òݰnX7¼9…Ò(Ò>>O;i'í”'«ežwÎhÝ(ï5õoàÉ<™'¿svØa矔±2VÆ”uýïõ¿×ÿÞàB‚GµÓK¹” P6eS63Ì0cD}ì6ëlÖÙ,料ì¾ì¾lù€>\®ÿ¦0bwÄîˆÝŸG>ò‘ϾE ZТ,”’’’’’’`‚8„™Å±8ÇvE>}ô–ö§÷§÷§Gñ˜˜˜™åÝAÝAÝAÞMqñqñqñ|)ù’/ùb„˜ c&`ÀÒXK°‹°Ä:Xë€|¹õrëåVZPýQõGÕñâ&ÄMˆkö¬õ¬õ¬]öÇžŒžŒžŒ…U±*VÅV©/¶U+œ]j{Rø ?á‡'êïÕß«¿¸³ÜY»Lf“Ùd¾}²¹¬¹¬¹ìÿñîWâ+ñ`ÈArLa S0ÔÓÚÓÚÓŠo*gVάœ‰'L¦NS' âE¼ˆßº‹ïå{ùÞöa^Ì‹y±t@Ý—4íÀ´­Rÿ’èÕ®ºEÒ>Õ»›Tï.U½ûýoyW½<ŠGñ(Œ(9JŽ’ý¡ðCá‡Â½ó:çuΓnùÎôé;s_"I$‘ôÎQ$ŠD‘|wpw”?k),,,,,Ä€¶¢PóêÝMªw¨Þ-ý7ïzÊKŸ¥Ï"÷ŸÊ;•w*Ï» ˆ@žhllÄ±šºšºš:–al26›&ÂDØÆKò›ò›ò›CÿaccõìÔvèq. ¿ê!SÔnùù°õÓ;§wNÇçÞ)Þ)Þ)µŠÞª·ê­¯Ò½°{a÷ÂÀïúûûé/õ_ÔQÿ…÷§Çéqz¤,Ý|Ý|ÝüÍ“é¡#'ÎŽÜRàˆ§µPJyœ‡áwâ7¼[€ T Â›O§é4Njá%¼„—\°/^2¼DL×éŠtE¼Q²KvÉ^ýcxIxIxIjRkKkKk û/,‚E0Uó–©€®ßâàøxÌ»O¨ÞÍÇlÀùï,“e²Ì‹áTAT±ímÃTÃTÃTÞ(Ý‘îHw~*öˆ=bϺ{MËš–5-FaUói…åÐïqü 5Å•IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.5.png 644 233 144 3067 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜìIDATHÇÍ–_LÔWÇtÊ82J!Ь‰,¡¨Ù‘5F,¤N,ZRA[!mÕSÓj%nÓ™¾˜Ö“>(c¤MƲD]je;bi”e2¬îY·òÇ‘TY­`ùg@‡ßü~÷³3?f¢Oûæyùåœsï÷{~çžsî‘—¢_ÄÌÄÌÄÅ=qO̾à­oåü-¢×!¡<¡üæòuÊש©FL7ýæúøý"1üx>Ó./IÌ`=g=—PÕkaÛÊm+dDôÃ]`óÚ¼3aø¸õãV€š~hâîî˜,š,‚˜núÍõæ~/_jŸâzñ§„»`M²&‰@VqVñ+ŸF ¾ïl~g3Àýî¿ @ìØU$ˆ)cqºé®7÷›x&¾ÉgòGâH#ý (ÛQ¶Ãö-šˆHÿiølégKÍË_©¥;èÝ O…§©__5ªFÕ¨›ê&€¾CßAˆÉðdx”F ØÕžÒ\é®t Ëä+ó—ùmßBFZFZìL£ß#o»ÓïNƒú@ó«_8ÀuWÝE#•DQjz]½>Ÿ)TµªVÕ‘°"EeœqÆQ„ù†oЀ¥,5šÞ¯z¿ÊÌà‘7ãŽRDäOÇÀ´ƒþð<ó°¥3¦Ó¦Ó˜ÕNj'µ“1>Í¡94ŒæŽæŽæ‚V«Õjµ<#*¬fÔ LmœrO¹ááÅGevtïtöt6¥zJ`_`À—¾´(o$á?""Ç}Pùeå— ^0VMÖÖŒÖ@áÑ–ÂTÇwMM1Â’+%WJ®@ÊÁ”ƒ)ÁyØyØyÆÆÆbëyyy ë׬þ¬~prœpœ@彿xÕñ*ôþå·Û¿Ý6VÁþÖý­ —EâuKD¤Çß~?3ÿPÈOËO#dæµgCφž p¾å|ËùÈ æsbEOaUaUaxœ§Ç³ßɼ“y'²ë³ë³ëÁ}Ü]箃Àµþ}ýûEóú;›ßn~‹Ä#ÿ¸øGuŽá…à A}í£%Ú6kŠÖ¬_³ÚÊÛÊÛÊ!4 ÀÐÕ¡«CWáRÍ¥šK5°bËŠ-+¶Àå†Ë —b]Ü{qüÔòSËOsÂ9î‡eµ9›r6Á¯)÷—Ü_0áœp‚úƒý–ý–:'º(u‘ÑÇßÇŽeÌ·}$y…y…yàmö6{›c„®Y׬kV»W»W»¡;½;½;ýÙ l l l_Ÿ¯Ï׳¯Ïp⎜¨·Ö[úé‡ðÜ"ë"«Ñ—(Œ }¢i%Z‰HÂED$=Úòø‹ÇŸ?þ\ÄÞiï´wŠø÷ø÷ø÷ˆÔ%×%×%‹T´V´V´ŠÜóÝóÝó‰\?{ýìõ³"g†Î ñ[ü¿EdwûîöÝí"y+WŠ<üóïÉ¿'‹ä-Éû9ïgI™^6½L$1C]S×ú¢]ÙãâZsGs°%zæ ¹:]\ wcïÆÞàŸøŠ×¯+^%I%I%IoÉ·ä[àtÁé‚Ó°SÛ©íÔ`¸x¸x¸<Û=Û=Ûaí׬€3YM]M]q5¶½ySó& Ó¬1æ»òPå!3ÑÆ*ñâV@È„ù¿ä7¸Ì1‡w9¬…5`³ÉWYWYÌF»r~Ž)ÛÛƒ # ´Ø3¶imZ³¬ œrPs*¨‚ WëÕz5è½z¯Þ z“Þ¤7Ú¥v©]`”¥F)°š\rAÿ‡þPúþ9Y£ ‚Ï/··¶AÛ`Ш9Çž™üïYß³ÆMæi½]otãã4´èO0Â0ÉÀDôâ O€)ÆæÊøÐø'z§Þ‡?Ï÷Ìäê®ä©»2àܸ±ÇŽX¯Ð+êR]$1ÝôÏ—Dt¿‰gâÏß•QþH<Ïóëâ¹}=Ÿ/Øÿñÿ@Œ’)&/IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-51.png 644 233 144 2372 14774263775 14704 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܯIDATHÇÍ–_H”Yƶ¥‚•B.Ñ?©­Øek†Å$Û PûÇu!ÈJÛB°ÓÐÅvQTëÍ"eÄ®³ÛEQVÔÍ T¶‚A¡d3eN¦k“Éh®2ö}çœß^Ì|s>wk×ËÎÍÌóž÷}Ÿç|ç¼ï9„Bä¥~d.Í\š9/‰3¿1öì­Ù[?û-‰%dìÌØÙóÌo˜ßߔߤ";óŽ¿;^“ßÍçØEž0†¬KY—2ÊSøøŠ|EÙIüã]ȹšsu†ºku×®4_iæ[êꈗÇËÁ`gÞñwâ|îüâØ?ø…€Ù7gßÌxYs²æ…[ ·¬ø.éз*·Wn˜50Kg€rÉÕåÀ8ã8ã ;ó)'ÞÉçäwøþ¤ 6-Ø$ìØ»coÎ/É€Hí_ì_ìðYW‰ãÇO®–VÜŠƒþÓ.·Ë™ÒÃ겺 ÜÓº@÷ë~àKû¬}–)~µíFÎqŽ\d*þ%þ%ŽÀHÐð'õˆé{[ÿ5ìÉÞ“ô;ÈÙ$TµªÆÂ@ïx—ú¯Ó_ Ð~íýL‡uؘùKù” ä=yÏßásø…[Ðç?AÎPÎÐø'Ð+{%0À6Pͪ™Im³šÕðö«·¥oK!Š…b! †`?¶ÛÀ‰¶‰¶‰6°þ°žXOŒ.U¤Š˜L¡mi¾4ROJXc;8zਭ¾ÐÒµFÍŠÇ:ÇÚÇÚ¡ðyáóÂç°¶nmÝÚ:(^_¼¾x=ôìêÙÕ³ ¥‰ÒD)x{{탷Þ:ht©µN­Cƒ=n>ßԓöð{¸8vq,­£Vµ íB¦K´?Ú…å Ë–7À‰Ð‰Ð‰D#ÑH4 O“ðÀ†lx`H¨*Tª2ÂäùP>ä'¿®5üI=æÝžw[_‚!Ïǵ²Oí¨5¸õHë‘Ö#°êÔªS«NÁÆØÆØÆ¬¬^Y½²ú‚}Á¾ ñ÷Tx*<ÐRÐRÐRà6(ä€S,Îpø“zäÏÍŸ«ÂðfðÍ ){ݢΫó&¬w_ï¾Þ}Ði´GŒ½ìNÙ²;P¿¬~Yý2c/i-i-i…_‹¯Åç6"Gä€ÖÃî6ãð'õd ¡n¨a!ì*»J8c.Ó‹ô¢4á®pW¸Kˆš…5 k Ñ4Ú4Ú4*DlMlMlŲXKão¶Û‡…/åKùÒØEx$ !„è}†Ïð§ô|èŒÑ,7ËÍL1È3ž™Ÿ¾~úúéëàÍóæyó ø*ø*øŠ@I $P®#òB…UxFgìýU9½jÐtsŸû€B¡\ Úh£ ¨¤’J—Ýš¦uʔҌ«ò=},™t¨Cê“\á)OAþ,ÏÈ3 ýÒ/ý ¼Ê«¼@7Ýt»¾LªQ5 GõkýÚ%oRíV»gÜÇþ³ó§:µªUµX©.¯I¤ïÄi?=&ˆO/P§ãgÞù?pW¦ï2HÞmœä$¹f ä~¹Ÿ)Ðwõ]2ȃùô–¥â|ÿ{W~´¯‹ö=öq¾`ÿʬ´¥ëluIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-37.0.png 644 233 144 3122 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýO”WÇïà δt,ÖÕt…Ž‘¢Ø‰)›ªܸÌVbcÅX ˜Òa ‘M‰]Cpp‡ŸZ5¼Ô2K%ØZbg€I ´ÄÁÖÚd“UY¥tÅ"u@™-™·ç¹Ÿýaæaf×ý<¿<9oßsîsîýÞ+@!ij±¯€¤ô¤ô$sTOúCÜnÜiÜ™ñyTÿXÝnÝî›Ç`Y˲€ÔŽÔõV\×üZ|b¾qüÄzš]<+↥®¥.-¦7ÀÛßÞhüUTÿà2˜zL=¿Dà½Þ÷zº;»;ù#L3ý €Ïæ³A\×üZ¼–¯á%⋆ÿ©/ ºÁÒä¥ÉB€%ß’¿öýhÀÄZ(|£ð €Ÿ–ü´D&€2¤"m€?šÌ&èš?¯åkx¾VO«íGÀмyBpú͹7çLg¢ ·>£©ÆYã9 î¡—nºI¡?Òi9y%ò AéWûÕ~cê˜:•[åV¥Z©&‘™È ÐŽ')òZ o f°fPkðÖgü­H_¤7Ñúÿ=Ûwðë=Ù{²Aþ |¸Ç=+•ÛÊmÂì`ë‹ÿ(H€q "” ¿Ï.v!Õiå[å[ÂÀS cøÕ{{ZƒîH¥Bd51d:g:ç×ÃDúD:„ÿÀ.oàç½?ïeAù§ªSu¶…sù0S;S;S ³-³-³-à›òMù¦ Ðh 4ò˜„ÒB¯‡^‡/xk½µ,HkƦMß™¾óë FûR'„{ J©R`îÏ<䡚ý»œmÖmV0ï2W˜+öWíÙöl¸°é¦ › u2u2uÖ¬Y?†³†³†³ÐZÚZÚZoH–ÈYåÓåwËï‚©ËÔcêA–ŽŠ Z”šÍp¥¥Òl‹ö#"ùBñ÷ørþËyèLê»Þw]ÚsÍ[z·ôô¹|¾NX]±ºbu\ ] ]JÕðàðàð X2,– ¸sâΉ;'âþ¾´¾´¾4°n°n°nï«ÞÞÙ°6cmÁþß\á ÒÛ/¶ƒ¢ö#xdî5÷J»ï5ÞKÿÌ|ù|9l¯Ù~hû!X>°|`ùÜ/¸_p¿ ·ÿÈþ#ûÀ)Ç)Ç)Çã#lmjmjm[±­ØV·ÿÞi{Çöœjþè“>ï ï…ˆòÔÐSCÒ•ÄYÝœn«èyæµg^â¦òCÕUâÁ…Ïßx^ˆ¾ë}7ûn ±Ê¹Ê¹Ê)„Çíq{ÜBLê'õ“z!«~]ý:È<ôâÖ·ÂØ÷?Žþ8 à{Ù÷2¨2å딯¥KðAl]êú¢ë‹Å-kwë]õ.‚›—m6l6@{G{G{G¼cÖcÖcVp·¹ÛÜmq»÷¼÷¼÷<ú }…>˜;0w`ît¯é^Ó½r§rÇsÇ¡¾·¹·™ VÕ])])À?´=†v*+í•vàbì”H¥Z©Ž.n3Ê(p’“œLØDW¹ÊU`ši¦‰L`9È#<àS:èHÀûkd,2¼«Ge[e0;•ŒÅx Ó˜i̯§m3áÿØ ÞÞ1Ô¨¸^{½–Ï Ün..Ç·çíx;߯sãKà%~˜|kò-Ï#H›’6Er7ænœ÷y" wlݼu3@jªJ#d¡ €(Qlrùö¼oçÛx6¾Ígó'ôd¯Ë^'ÛK·—zk =—Ðýoûß¶ù´œã¾!Cý¦ý£ýü wé]ÄA=T˜Îtà’úD}êoý]ý]â*ªj£ zðã'¿…‡…¯Y|Iþ„yqoÏl`¼DJ$)è9z—Þê}ý‰þÍšPê{õ•ú T·êVÝ8#FŒ—M'9‰,b‘ Ÿ’™%3í žÙàÚJ‘w~oØŽN‚2€zŠ@R§x®}¨µ DGæGæƒÐZàLlšØ4± "u‘ºH U:Ã#Y#Y0~*Ž…yn…ñ{èAè8ü =) y_.)?_~~šŽò¥úRÕ2Y/ù’/·Ç–ÆšbMâ-Þ^œSœ#²`Û‚Ý v‹¬Ÿº~êú©"‘êHu¤Z’vOîÉ=ñ]õ]õ]YûïÚgkŸ‰¼Õ0ëô¬Ó"5Ôµ†x­ðÛæcßß•äOêI(ìø.?»ü ŒBõ±µ¢øÅï.ú/úaáì…³Îv*³êȪ#«Ž@¥¿Ò_éwÆÇŽ;±úX}¬ZvµìjÙ¹y¹y¹yÐ_Ó_Ý_ «om¾¿­G ³1³Q]ƒðŠð `ñ‹[3øÑ`Ù`ô÷ö÷ö÷ÂÝÀÝÀÝø¶ø¶ø¶@S )ÐäÚR­J«Òª¿¼»¼»¼*W®<ìŒÃú-ý–›Éâ·ô̘6cšù 7­c¿M­V«´cÞcÞc^X\\„ÖìÖìÖlQ‘Qd9~G_G_GäÊ;”wF‚#Á‘ KG–©™0n·‹ßÒóJÅŒ__¬ØÍ7çßœïœÝ³+Ï®<»®ô\é¹ÒmwÚî´ÝªGUª9yG=xô ì¬ØY±³Âµ€Ÿ£ˆ«FÕøúŠ¥ˆD ¢þ!ÒÔÐÔ â9'"Â>ë眘tlÒ“¾),+,+,©ï¬ï¬ï©È¯È¯È õ†zC½"mmm"ÑÎhg´S$£5£5£Ud¯o¯o¯Ï9žYžLO¦ˆ¤ª>Õ'Ö‚÷ÙüI=Ö]ÖŸžøô„­Þ|ô¨îttĉóÿfbbºüvÚiÂ<æ± Oé£ú¨›ÏæOèyµ…FB#I€"ÕbÌ5æòÜ8mÜ6nƒÑmt`ÔµF-¨ýj¿Úæs‰¹h¦™f0ÛÍv³Ô^UªJ]Bcf±Yìêcvß|©½Úù)I+IKž±L FðÔÜfnCcØZñSâŒ3Œ2ʨ] `Œa†Áª²sŸ¹ ŒûÆ}>%é%év¥^èü¯¹+ñÏñÏIÜ‚Ép¶ØØcì!ªY5àÁŽoÏ' +߯³ñ_{W¾±¯‹7ö=öf¾`ÿ«‘A•póåçIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-65.png 644 233 144 2554 14774263775 14713 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü!IDATHÇÍ–_HUYÆ×µñ_š%£/™Øhe¦Œ¥Ã`¨5Žƒ)DT†Sj*I4—.ÁÀô`PÙÃÐ_‘‘ÈÆ‡J©¨À ¢)aèa¼‘£Î@i¦’eZ·{ö>¿y8÷xn3#½¶_k­½¾ïÛkŸ½ö‘E¯@HbHbHŒe‡T;þˆ¢ˆ¢”Ÿ-û´W™«ì`áñ…Çb[c[µ×±í¸=?8_ÄÁæ³ý²HGø…ð ®‚€Ý[Ò·¤GÄ[öÑ»ÙÙ9mÀîË»/tœí8K=Œtt¼(xQŽmÇíùv¾Œ/ ÿâÐk¡×\AxXx˜$&&ïµ&ü™ %Å%ÅOæ=™g†€¢‰6 €)¦°ÇxmÇóí|ÏÆ·ùl~K@\~\¾”n-Ýù“•àmÏÏÀðw§9M4íF³Ñ f·±ÔXŠ&³Ä,À… LŸîÒ]`¹F.>sÌ?éŸ~чhK¨¿åIð$ؽm¿¥GÞßÛ¦¯`sÄæÀà¿ê‰z|¯Ô~}E÷ë~L»Dæ·f…Y„FÎxËsžÏZ&èÝÔ uÃvûïÏòÍòK° Ô!r$rdêx¬+ÀÀF†õ½ÊH0âŒ8Û9¶sl'øÝ~·ßíèy%¯ä•ÀèÍÑ›£7aìÀؾ±} ¢T¶Ê03Ì fxÀ·ùfù-=a§ÚƒµmxÉYã¸qXÍF6:ªè¯è¯è‡¨ª¨ª¨*Xdý‘õG`¨n¨n¨RºSºSºaEÙŠ²e°:suæêLèû´/º/Ú© ~ýnøÝpß,¿¥'Ī[ö‘¼ýyûe×çf­oÆË;ù]®Ëuqu5u5u5‰Ü¼=x{PäÁðƒáÃ"i i i "==="óOÎ?9ÿ¤ÈvßvßvŸÈÅ3Ï\<#²rbå땯Ed‹|#߈+DÏ»4ï’¼³ùÞçϾ"s'æŽyF²F²œ-Q_ц³BÚzÚzÚz ô@èÐèNt'ºa[ß¶¾m}Ðù¦óMçHõ¤zR=;;; Ë–5,k€Áµƒk×:xæ Eð°ù-=± bè>:þÔ9öªÀH3Òœ´æªæªæ*È>‘}"û„ãÏ_—¿.ì©ØS±§¼O½O½yñyñyñp,éXÒ±¤ …¿?îð[zBDôU}ÕÕ'bl26Ù¥”8×QW­«vÖ–5Ë×,_³\äY̳˜g1"---"«&VM¬™©ž©ž©)¯+¯+¯iyÔò¨å‘ÈhÆhÆh†HúPúPúƒçÂ5àpøþ€ëg{¸Ú_¶¿œ-t%«Cê>ó;³Æ¬qVz®æ\͹ÈiÏiÏi‡ÖÉÖÉÖI'ÞXÚXÚX 9½9½9½p>ù|òùä ÛD!…Àoj¯Ú8û˜•¿¥gîSùÖxn÷¡ÏXÌbà§8DäÅ‹¨§žzþ;nq‹[@ Eáù cbîS9wÓ>cêz‡ÓÇtŒ×á ªUµª]¬‹u1PK-µ :T‡êåVnåý¥ÎÒY@/¦Õtt®c&ðç¨ýOçÿžº +u¥u&ogïDÓér€‰FCPÜò¢wé]ø<ÎÎÿ»Òès˜h0¦Œ)U®Êñy×¼ îJǶãö|;߯³ñç¼+?Ú×ÅGûû8_°ÿRÀ`Ú¢MIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-18.8.png 644 233 144 3151 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýOTgÇÃPfyY‹ë+µd ÙÚ¤kIúB…¾¤±Ñjj¶’Jº‰J$+B²lëªlI­–ݺòfGŠ$Ö¤a·«Ùfw±¸XÜ,›Z†·q`–™;÷>ŸýaæÎÌv÷ðþrsÎsžï÷{ϹÏ9€ˆˆ,¿,+,+,‹B¶å§Q¿íEÛ‹Îß…ì÷tˆÛ·õÎÏÁqÆq åBÊãnÔ6×ÍøØý"QüX>Ó/‹%êHìJìŠ+ ÛõðJî+¹¶„ì¦~°»ì®¹ ¼ÑóFÀÇm·Q£_Ž~ 0]4]QÛ\7ãÍý&^,¾Ô_úúâþ‰%>&«ž_õüš·BÃk ¬¤¬àÛøoã•t7L²*¼x1Ÿ‰Û\Ç›ûM<ßä3ùCzÒŸMV*vVì´ŸG¹ûT/¯^< ¹øzêIݪ[3ÁÙà,~uÛh2š€óꂺ Ô0¯ïÔwâ‡àtpø5ïó>Éêa¼ßî8Üa ¼û–ûËýöó¦ùïÚ6?Ûg·Ï‚z @ûB pƒjD ±H)¥Pj…ÊRY‘L¡ÒTšJœ¬aMÔOªšQ3(µB×u ðáeá³q{ÉöH›Ÿ‹)¥ˆHö¯Àîµ{½VnÝ{çÞ;Ø-s3³©³©ø´­Ek‰òNNNÃxÙxÙxsƒ¹ÁÜAG9ÊјøþÀT` ÆËF»G»ñ‡áøáx ßÞaïðZM=Â_EDÞû=TÖVÖ‚ú1€‘7ýKw»6ÜÔ¼©uýåë/\”UY•¶Ø¶Ø¶Ø ÙáÌpBEvEvE6øŠ}ž⨠©É©É©I(õ–N”N@FfÆ3Ï *Ö•®.] ÿþIˆÞ|÷ÍwA é5$"òÕaè?¨}Oܘº1¿™×Ûko¯½½n”Ý(»Q™ ™ ™ 0°{`÷Ànp¶8[œ-ЧúTŸŠ så»ò]ùu%ëJÖØ=°m`8O­^¿z=þkU·ž¾õ´Ú}=}= ÿ0¤Gð.ê]Ô«ºøÛhÒh¨ªð9Zªh#ÿ÷üûù÷ájãÕÆ« »t—î‚ì”ì”ìpÔ;êõ°áÀ†ÀØ¡±Cc‡¢ÂÜî wäç烣ÎqÜq6l]ÿøúÇa|nFÍ(÷ {TóÂÒ…¥ªË" ãwÅï"GDä´ˆˆLÆ&¬JX%bù—eÌ2&â¨vT;ªEºzºzºzDÒ6§mNÛ,â©õÔzjEÔ¼šWó"íö@{@"O‡»ÃÝáI[–¶,m™ˆç¸§ÎS'¢«U ÒéêLíL•I‘ôøôxuBîÈr,‚ñ‰ñIÜ hÚKÚK"q+ED$ÝÖ’4›fñ?ô?ô?YêXêXê97rnäœÈå%——\^"2=3=3=#² hAÑ‚"×^×^×^{•½Ê^%ò`ÿƒýö‹t«n£Û™ø“»ÃÝ!’ñ³Œ¤Œ$I™÷Ì{DäªPÆ †OåW‡¹yéÓKŸ¥¡,\ ÿ‘ì#+¬„›M7›n6EKtª÷Tï©^(Ì+Ì+̃¶ñ¶ñ¶q˜Ú3µgj”Ÿ-?[~&<ž ´Ö´Ö´Ö@ar¡¥Ðç‚­´~€?Ülöñ—Ký—úßšÿ‘Sy¬ò˜IkäAÐôzhgDQ#4C 1Óö?GâŽDS—ösú5ý ¯¯¡E¾?óÌÇdH…„ãa‚‰H®¯¯£á×?×?Ág‡m‡íÿvþïÍJsv™³’ðlƒœ 9Rbô]ú.ü úU?qÄAÔ6×Íxs¿‰gâ›|&dV>²·‹Gö>öhÞ`ÿ·Üõ„S rIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-20-red.png 644 233 144 4314 14774263775 15611 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXí—mL”WÇÏó2 H…,¢ ¶ßV Ö,*‚8 ‘’hH+¶LÍšµ›õ…ŽQ,­ÊÒ´†‚J±­ ]m\°ìV™¶6®ÕM¨µÊL`L‰€ àŽÌÌóòß3÷™—d5›Ýó…9÷ÞsÎï¹çï D>›B!Ưˆ´DZ"-Ü¿ü1­­­¹KEY”Eù'i-¢E€oZ­"‘D™„új[ÏâY>–?´¿"”'˜oí¢]|Kèü´yb«Ø*¶¶<ävs»¹Ýˆ>n4n4n—ÖßYgý  ¿ ¿ ؘ¹1scfÀgól=‹gùX~VïÉ<Ä/õg}Àóãü¸}Û¡$S’)É$¿Uo­·Ö[Õè±á±á±apáá;ì°šïŸgëY<ËÇò‡Ö›õÁ“ùÈð ïà¼Ãþ– ójæÕ̫Ҳ^o¯»×^øMMUãÕxHò©AjäÅr’œÈyr¾œÈ‹åL9È©r* ¦ªQj$Ïò±üpH}Ã3×µp-Dâañ°x¸é 0V÷÷IyØÛ²U¶bLjò–xKÕîŸð  ¬RVPpw³1€G©Vªë¥&ù¤|PßVb•XŒ±üÆ*ã~ã~)Õg<Œt}º>]ßÚß°†rÃ!Ã!5Å6dsÚœpúóŒÉïÉ×åë }-} `Ì9䀉è‰h[â€{òþ`ÌérºÀ{É{ ßS•F-fÌ6dƒ pÊ ¥†R5…ñh|âq‡¸£ë0›8^|¼øx±ú;—ÔÂr9n8npgœÏ8|ß55Pî,wóºo¹oÀ+Ó_™øŽ!w‚7Á mm@ ¿¯«¯íl©ƒq ãÆ-DÕÃ܇/>|lHHfßlª4U@âƒÄ`ýÔú)TÞ©¼‚îôît8Öx¬&/¼:;;;À”`J0 Ù™âLÑ@¥‡¹ÃÑÃÑãa| ô뎬;²îHàËä^yŠ<À Z~{ùmØ|ÿñàMýqôÇ`ÐÝ'º`í̵3ÀkŠ ^ßß×ß´~ðüÄù @î ^ãa|¼ÿHÍÓåèrt9Ú‹¤md$#ýŠ ]zÿÒûDDeeDDžŸ=?Uî®ÜMD»&v Ѽ­ó¶}oþÞLD”~!ýBðÍ2Ù0Ù@DDoÒ›D4iøæðM":rýDêÎêÎêÎjG~žçV‡Õa¥^7ïæÜ Âï…—…— ô[õõ"××é눈¾©ý¦–ˆè¹æçš‰ˆj5"¢OÄOD"¢å7—ß$"’nI·ˆˆd§ì fà¦qÓˆÈCuTGDw©Ú‰xßÇøw„Aû }ÐN½Œø<>Ïó>ðoqUî†] »‚$0‰ý´³àf-~gÃ;À³Á³0󃻷L¿L¯y_ó Kýùýù ~!~Èç>ÿòó/õþvô«9_ÍÑ^Àí\—Æ¥y.¤ éû*Ø)K~ÖÐhh”gÙ6Ù¶Ù¶®5û…ˆ"`ñ³‹Ÿ ¶=h{­Ù­Ùpbû‰í0âq@UBUðVÞ Ýû»÷pm¸¿á>€—¦L€G›m‚ÛÏ)Ï)`á¾ í¦ Ó„i9)&'&'&‡H¼"^¯4;´ ãë«\ŒŽŠyFéŒR¸a‰tD:¸è á[áÛàÃt*îT\ðÎnÙ4`ŒTR8çÏ™?P>ºw9*[eúûëÕ¯W+. p›°MØöÏBŸ5H¡–ô¡.M—¦K³Ÿbæ{nï¹­fk›úËó¿<pö9ûŒ9¯9¯ÀÈÞ‘½à©÷Ôû.R¸¸Ñ€p¦9Ó¹ØUçª ´úÌø™²3exI{B+ø ¾b"—›ÎMç¦ÿº> P¸®I} W•¬ªåš¹R®”iEùƒ¥ã³êϪaÑ´[¢cðýŽ Lù*âÊ5å f««¤ähv˜f y’ÁcðH;´, ÍF -ò(O4X³(‹²Ä2j¡j!»`ë‚ö´Öô½¤·íí=Ý{:X»ò<j›Ú@Å»x€‹A¼7µPÉUráf›»7·ù;¹D{‰ãâ¸åPâÎĉ;‰x#oäÜ9?]±v¹ùÿ ÷„{Â=îbÊž”=){ˆt&Ig²Ò´›eÌ2fÉ%¬ bVÌŠnX`ÀF0ØXy®¤ (Ê@@‹=èA`‰ê‰ê‰êQ×kšŒácø˜W†IñÃ0¾Hzò€P¤Ý-Ü–Uë¹f®™kÖ®¥ÃÒЮÔ!uHå>N|œø8X0º`tÁ¨µÕÿG09å³àIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-11.3.png 644 233 144 2753 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–h[UÇŸ´IÓŒ6[»n¬CWÖ!lŒJ‚.àæ¶öçK;©ŒAéªDYUÆêÄŽYß1¤®ÅõʼnйÙw¢…¶6[§ÔluƒÁd¸uÝÚÕ*H+4Yn¼¹¹÷|ü#¹I^ó—ÿíü¾çyÎ÷ûÍ9ç>Ï‘U©_¼óÌó&qÞ‹™ù§ ŸÚt.‰O™àxÖñìÍwae÷Ên€’Ó%§­É ¶ãv~öz‘ ¶ž=/«$3áîs÷9v¦ð{°¯j_Uáš$îÏ€g`9/}ýÒ×ýgúÏpæ/Ï_ˆìŒì„ ¶ãv¾½ÞæËæ—÷þ¦/® ® Ž_Á]à.ŠÚŠÚÊW“ w+¡î™ºg~Ïÿ=_倹Q¤vöea;žÊ·×Û|6¿­gë'ý”=Yö¤ìÝ¿w¿§CDd²Zh}xÀ —c£‘DÀ|Ý|',,€ÿ©sꀚP€nî7÷£§ó;ø”O)R?¤ø>?Üw¸Ï68ÙËgõz½îé±ýÈÿŸí‡5а԰êUãG5ÅÛ¼  Õ %ŠRoª6ÕjZM©)ÈÚ³²ðJVa”ú—õõ°Ä¨¢$?ÿnhnh¶ ~X“u”""›?æÑ4'W§:§:Ó´{–—J—J‰³Æ¬1KÎXŽ.G—£® 4ŽA# »þ8óÇb‰ö$?LkÓpÅÓïéל¶ág‘Sã88ê1«:rbáèÂQð·ú»ü]¨á׆ìé õ†zÁßéïôwÂpËpËpK®ñÅÑÅÑÅQØñ莭;¶BÉÉ’þ’~TÃ'õõÿ8©/G_Ž‚:Ÿô#ꎈÈO‡á«»_Ý…åëªùñC¾R_)º½¯£M£M£MA_¯ÎW—¹#õ#õ#õ¹ÆÎ:Ï:Ï:Á¿Ú¿Ú¿"±H(‚õ%kϯ=>¾öæÜÍ9Õ AT`v$ýš7è ª>nϯ˜_ê`ê;*7~3~ŸÛWà+€ð@x œÔ•®t>¯ÏëóÂ`Õ`Õ`UVüŠ~E¿’ÁÚˆ6¢Àö–í·„ÒÛ%=%=°ðßèéèi€?äu¬¸¶¸VõåIq~c~#[å–ë¸ë¸ˆœ‘pþ¼«ÂU!â<ìlu¶Š8Ö8Ö8ÖHz¸n‡Û!âlq¶8[Dd‹l‘-Yñmîmîm"ÕÕÕ"7îܸsãŽÈÐÌÐ/C¿ˆ”)ï-ï¹xvØ5ì’°Hi[i›ˆ‘B)dkž` YCŽ[bOO‹86ˆˆH™-#ÞoIÌ$f3’3â×â×â×Dpá•™ï©ì©ì©¹´éÒ¦K›Dœ8pâÀ ‘ñãžqHä•Hm¤VdåÝUo­zKÊDô˜‘FU¬Š·òÄ¡íÒv]¿*ÇfÇfEä^°ukÞ©9TsHdƒoƒoƒ/רîu»×í^'R1[1[1+¢—ëåz¹HÐ ZAK¤ñ^ã½Æ{"î@w [¤ýdûíˆüçávO»Gâ{÷Ìí™ãùr(<É÷ƾˆ}qýjª\œ‡@[ Í¾V5$´D¦¢+@G矋\ä" 00²øn›efÐiëÞ¼ÄS_eºŽ)ÏœgNsbMS‚=V³ñ½ñ=1a=ësu­&«Éj ( ˜d’I°¼–×ò›ÙÈF0Oš—ÍË`ÿ–˜Užªc#Ó›§7xf<3š“9»ŽåTþçÜϹÓeñG–ÍoÌoÃj²šÒÿY ÀRª7&R’=*JˆP*ÊzÞzƒ?ÍïÌï²øÓz9•ÿo½Òî]v¯L @ºW¦ŽØl4ÑA©18 ƒíxúJ¤ÖÛ|6¿­gë§{å}ûº¸oßc÷ç ö/vÛÓh¤mߥIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.3.png 644 233 144 3235 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜRIDATHÇÍ–ýOU÷Ç?Î0Ù´‡üÍxÏÄ7ó™ùƒ|¶'láóBw¡ÛÒ ëàô‘¶#m üçø3§8E,è¢ Pxx„Wý˨5jÕªZÔMux¡—è%x!à ¸€Zšh"V}Â;s¤ëH—Ip¬ƒÖBo¡×Òlò‘—k{ü-VìÚºk+¨4ÿ0ðœç lFƒÑ€ßøÞ4QꨪUµ3;…JT‰*ØB³zæªI5‰RÙFª‘ŠxÆ3P±!üü]e»ÊL‚Çß +¥ˆÈÊ¿sÅÒni÷DÃxêx*ø‹ø•#íaÍæý;ü‡ý‡góù³ýÙþlpd:2™¨TªÃÕPCM˜ÿ§~›ßŽ_>l{ØÆtàhì»ø§¥ÛÒí‰6ùD²IDäVÉþàñµ€çÅ2û2»²¾û›¼Ž¼¹¸lÊ©SbÉ!çFÎ ‘{÷ï5ŠäEåEåE‰,_´|ÑòE"%Z‰V¢‰øNúNúNŠH¥TJ¥ÈÔœ©9SsD²¾Êú8ëc‘EiZš&–’Ä¢ãEÇå¢ÿTª–ª)«l>y S Ðâø™ˆÈ#pE»¢AÛ_mù¶|U¶"aéÅ¥ñš+ÎÏÍÏÍÏ…õ#ëGÖÀΤI;“À¹Ñ¹Ñ¹–,^²xÉbX;°v`íìNµ”·”·”CÆÂŒ… Á5írºœ°$>ñBâ¼C‰·&oMª2°)›½6ÈGHÑîi÷T8Þs¼2]®¸?>Ñ>Ñ}ê«ì«„ÔªÔªÔ*NNN5 ÔlÛ2¶e ¸¸¸Á±Ù±Ù±9¬¤tÒ ž>OŸ§¶ÞV¾­܉oŽoÇÉ©–©g†3Tµ–¥e©.¡;®?®ß¸Í»Á•›¿}¥¥âYÅ3°Z­V«®']Oºžw£îFÝ‚¡É¡É¡Ipououo…ÕÅ«‹WCkQkQkÑ,¯QÛ¨mÔà à à àÎuçºsauqÚö´íÐöó³g;p‚qɸú/´­À¸i|¨ TEÜ–îyæ=±}{yüò¸${Q«Õj"¥ëJ×”®q¤;Òé"MÑMÑMÑ"÷ÜwpŸÈ`ï`ï`¯ÈÓº§uOëDÄ'>ñ‰ô$÷$÷$‹\­¸ZqµBdÝþºýu"Có†,C×ï\Y®,‘ùãq•q•’ âöN‹È^¥)-â¶è4Ϙí€í\¼ýÍß|¡Êr~éÍôâÍëËëÉëu£ëF×BÿÑþ£ýG¡þtýéúÓ`ÝdÝdÝgÆÏŒŸ‡'Ž'Ž'(œ(œ(œ€Çê±z¬à˜í˜í˜ 6|¿Á¾ÁÍ?4h:ažaUÆ?:;/Í3œeCp(÷P®Yc=è—ôK¸q£øñ£P/iïp‡;@=õÔ‡é/p €Â?,úŽž ''Ì|‡ªU¾ ¡;ÔǰØ-vO´úÚþ¦ýMÐ? öý¦Ïås1­·ëßéßÚ£ U!èçõóúyÐ+ô ½ «a5¬@)¥”‚±ÊXe¬–‘B è úˆ>úß|—}—™6~êc}ö•ö•–»–»žh&ƒ|þ·óûvGìŽ~uf·~E¿<1 Œ‚™U+}ÿ‡i¦_ÚI˜Â‰3ä e¼o¼Ÿz¿Þ?Óv‡awÌî˜ÿÛùC³’¢’¢’°YÉGÉ%Ïœª©&ž€@ß«ïŠꚺ@0+›vÓߌ7ñL|3Ÿ™fV¾²·‹Wö>öjÞ`ÿ lþeŸì£IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-22.png 644 233 144 2363 14774263775 14702 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܨIDATHÇÍ–mhSWÇoÚi¨ÑBUª¢³vø¶Ú±hk“€-ÚV‘£‚.(ŒA×ù¥¾!"¤‘2ŠeN­`•F£’ö“ÁMq V‹©6JYzsÏùíÃÍɽ«°OÞ/—çíÿÿßçœóÜ£¦iš6'ûÖ o~Þü<·iç}gù ¼Þ/~5ínMަ0»kv@Ñ…¢ â¡e«¸Ê·×kš…oçS~mŽf9œ×מ¬}¶¯Ü¾²àsÓî¼®^Wo*þ[þ[7.Þ¸È÷0646ð$<`Ù*®òU½Â³ãk'þïi0ãöŒÛŽpÎtÎÔ4X¸qáÆÅ?˜ ±Å°¹~s=Àhþh¾Ìc(¤Pz€$IÔóÒf«x6_Õ+<…¯ø¿©Gƒâºâ:MƒÆ–Æ×y³àá/p ô@)Ð{nº)äçÌéÌiÙE™E¤é5²€%,ÎÊfÙl‹Ï´eÚ WŸÃËâçø¿©G{wmƒßÀ¶‚mÀ?zŒ”‘æÇŒcèòk¹KîBªÉ[ò¦¼ ")’" òGÙ*[sD“×ä5¤üÓXc¬A¡ H)ü,_Ž_³ úò,¸Æ\cÉÏà±ñØÈánâw1OÌã­rèßêÍz3Œ/_>¾ôZ½V¯µ„è%z‰^b‹ŸÐÛõv+΀(¥9¼MŸâ7õd…uß…}GöQÕ¢‡žÒSÖ‡'W$Ë’eÐÐÓÐÓÐîw‡»ê†ë†ë†aÄ9âqBc¤1Ò÷÷÷¨é¬é¬é„W¿zðê…'£zXÛørü¦ž¬°?~‚+o®¼ÉÕí1šÒÉt’´ò\:zé襣P>·|nù\« þƒV×®®]] ë¬[°n¯n«n«nƒ3ƒgÏ Z~Ó~š~ªðå‹ßÔ£{Ð=(¯ÃXÕX•­å+Ĥ˜´Ì;_ì|±Fc£±Ñô‡úCý!XÖº¬uY+ôìîÙݳ^‹×âµ€p"œ'`iÕÒª¥Uyyyná‰}Æ*c•/ÇoêÑ hVÑ,ñ¼|öò™í؇äyyØÂ¶Xå‡]‡]‡]PY]Y]Y QÔõ[ñƒ¾ƒ¾ƒ>¨l¯l¯l‡¡â¡â¡bÛah6O-)ùD>±Åoê™¶cÆo™ã™ã–ÝWÖWÖWfáÀ¹À¹À9ÅB±P ‚Á`0„üýùûó÷CÐôýp¹ïrßå>xÔò¨åQ‹Mà)Q/ê?ر÷ï1Ñ4595ií±µkÖ‚×çõy}àÝëÝëÝ ëÝëÝëÝp¨üPù¡rØß߯Çëñz ¢¤¢¤¢Âp °-åWS÷§îpMs*É$3ÖD—@Ú’ù¿{½|ÚSùž9fnüM ºDoå]9!'À'“`Ü3î÷Àˆ#⪸*®Zv.žÍ—2.ã ð,üα÷L~ ;ù£F˜>áCg"ûÅ âÄL)R¤l¶Š«|U¯ðrøÓNþü+M€^à§(´–ÀØaì ò޼€X¶Šç–,[¯ð>ú¯üdoŸì}ìÓ¼Áþ ‘ +×[:}IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-19-grey.png 644 233 144 6065 14774263775 16022 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü êIDATXÃ…—{TUվǿsîµÙì y”iìx¨—¨@®z#@ätðÁÝ!Q àQCsø )¹ÛcxKRé¢Ã"äØ T0DB˜^ÝdAQÛñÜjT²a?ךóþÁ^ØÈÑè÷Ïk­ùûÍÏœ¿ïšó7‰Á`0 ÐbÊÆ¦#Üî wy“¡ÂPa¨àÃÃÃ+qoîͽ÷ýM ÅÀÈõŽzG½£ž¿‹£8Š£$aC€ô Àz¬Çzþ®jµjµj5É~~~¼~”Œ’Q2º«lÿÿ=þç; 3 3 3È$‰A$yŠƒµ¸¹´tp)–b)­b¬€°ç¤sÒ9éUÐPÐPÐPÕïr9‡šÿe}Öú¬õÙÈ^%^%^%hŒLŒLŒL$y‹•‹•‹•@”O”O” ?Ëßåþ²¿o:¾{éãÛìÛìÛ,mOìIìIì¡®pS¸)ÜD^Rå©òTy°â-¼…· VXd"™Ãcx VÇ\Ç\Ç\¼d2šŒ&#w}öeØ—alûHÒHÒHÒ+5Aš MÐ2O)KÊ’²Jx6ÏæÙwÓ èó$ßžoÏ·0ÂãÜ™B½P/Ô;mN›ÓöäŸu±ºX]¬¸TŸ£ÏÑçUZ‹Ö¢µ@ÇE.r"¿Â¯ð+HI#i(((àà@lÄFlÝï…±™c3ÇfâNí‘Ú#µGÄô;—ï\¾sYhõP{¨=ÔßW‹«ÅÕ/¬Ã x/ X¨º]Ý®n”ÊeÀ_²žµžµž}òÏ:½N¯Ó‹/egdgdg­Z­Öb5¬†Õøßà4–ÆÒX€ô’^Ò 2@2I&É$€´ e\à)<…§³Óf§ÍNÃŸäøºUºUºUâKòø2ÌGÅ qBœHŽržvžvžÎxÎWï«÷Õó`ýÇúõ ²FÆYK` ˜EÏÒ³ô, ÅJ±R,`{Íöší5303¢…¾Å·øÀJ¬ÄJÀíˆvDÜÎíÜ E(Â,9¾¾Qߨoª|×ú®õ]˃e™ò0ÆÃþ‘êŠsÅ¹â€øŽøŽø$j«µÕÚjx°ÖÂZ0‹ å(.Å\йœÜ|róÉÍxh`F3F3F3€ÒöÒöÒv`oêÞÔ½©À{Ò{Ò{Ð-t Ý´×,í‡ÚµÂ#þzüõøëH”yd>*‹Ábð¿oðþÅûï_ðîÓqOÇ=GJݳ}fû XŸº>u}*°àø‚ã ŽÇ£ŽG,ù–|Kþ´›Gxnxnx.)•yd>ê¸ï¸ï¸Î/š_4¿yê·Õo«ß†•¥²T–Šé9s-×r-à¿Í›ÿ6Àï ¿'üžXë`­uÖ:kÐoé·ô[€øÎøÎøN`ÞÂy ç-’/$_H¾°ƒì ;˜Ÿ2?e~jÚ]Ð$k’5ɰÊ<2Å^ìÅ^FOÐôÄ´ƒŠ\%WÉÕ‡–K€HÙ•²+eà·ÆoßÀµÌµÌµìa?ÍZÍZÍZ`NåœÊ9•ÀÕ‹W/^½8£œQÎ( Ã¯Ã¯Ã°Þ³Þ³Þ¤V©Uj}$!*ú*}•¾ à#|„HU*üäxôxôx4n‹;Äâ(Èr†œÇ ÜÀ €gòLžù«P°ò:y¼þhêÓ/§_N¿ L$N$N$LLL@Ë›-o¶¼ (%¥¤”îäNîœvãîV1Ù1Ù1ÙÛTGuTÇORÏ"Ï"Ï"±ø¶ÿmÿÛþüä­²[e·ÊD"‘°±ÂBrŽœ#ç‚J(¡–` –üа%(&¯M^›¼¤þuú×@îÁ܃¹ŒêŒêŒj@™£ÌQæ3kgÖάö¶™ËÍåærÀ‡}¡)¡)¡)pH[¤-Òhç4ÎiœÃ–313>$‘ˆTîA.\ ¸øÎnxxøÊ‘¨‘¨‘(ÅÚµ;jwHÛä탗òR^ Ç´ˆ6©6©6ªïTß©¾{4õúqý¸~xÜþ¸ýq;pèûCßú°~`ýÀú°Î°Î°ÎN«h­‚ªnmÝÚºµÌ:::J[=Þ÷xßãýoÖ¹ú]ý®þí.’/ÿ^þ=mhCÛ㇔ÃÊaåp‹z¢a¢a¢áÉìu‚:AÍ—'×$×$׋|%_ÉW‚»&\® @õ•ê+ÕWZÑŠV`ª¨¸•[¹ppp„^¡WèŠ E¬·VÜZqkþZÙVÙVÙ†/Ô}ê>uŸ=‰+¸‚+"ÿŠX€])=JÒ£ŠvºŸî§û·°>ÖÇú²œ£Æ¨1FQgÔñ3í4í4íDµ[«6¥]iWÚ(#n@,Çr,ˆ7ñ&Þ€ê†ê†êÆ4ฅZ¨…BÓxºñtãiQ§ìTv*;2NÆÉønF–%dI×F£ÅÂ\E\\\\\ÿ H@‚ðšOóiþ\šD“hÒx¤´KÚ%íJÞÖ­ÿZÿ51&¼+¼+¼‹þ—ú˜ú˜úÆy¯àP‘Åd1Y @„@²5]=Á­qI"I$ ^u¨C¤mwÏÜ=s÷Œð?šLM¦&³º0d/^ã¹Ásƒç†êÂQßQßQ_a¬VU«ªU=Ô.,°ÀL0ÁÀ\µÊ7ò|#8ÙGö‘}P]1_1_1óåmMmMmMŠb///ÿ»³ÊYå¬Ê}§sOçžÎ=7s37c¶;Ì'2¨ÕÝž`3Ø 6³oþpó‡›?έέέ¹ïxy{y{yß=ÑÓÐÓÐÓ (nz¹é妗ùr’CrHTìSö)ûj¨¡øþ€?ˆHD"Âö³ùgóÏfT7G4G4G`¶×××À¢Y4‹Î}gJzv·¹§™<}É3w_ITîG÷ß­(F3šÑ,m#KÉR²tùš©+Ç…:×&×&×&¶ùö {…јðýáûÃ÷c5ëfݬº€.  àóÄ<1ª#!GBŽ„H¡CK†– -QôzFxFxF/›úi¶·²RVÊJ…CîÌn‘3VXXXXXˆqyEá~á˜N)@Ú6uç‘RBJ.ž¦ñ4žÆo¯G6²‘M7¸\ .qÓXÙXÙX4”RJ)È+qÞvÞvÞÆ¬¥¥¥Š^ÏÝž»=ww6:ƒŽÁÝ{_ì}±÷EÀ ¨“ObPæ›ý °ÜAãð•[»uh7p4p4P«1Ôj Ò6„"¡˜mò1ù˜|ð¿Ævc»±¤kº5Ýšn€é˜Žé6·iBšfûàÅÁ‹ƒO×_‘O¨ßr)ð;6µ@t?š¸÷àäïC ‡-ÄÇÒîã>{L΀{¡ÄßòüýŽv Є&4I{x=¯çõq}ô=EOý_°}•}•}[¨,U–*Ki—"[‘­ÈþòrÈ©S!§VÄ™ûÌ}æ>rŽù1?æÇËÝqÜ€Ößã øûvÝÛ…´9ÈAŽpd ’q)„7ñ&Þ´+S=_=_=Ÿv)úýŠþÁùlÛÇömú¡{]÷ºîuÀ ‚ÝñäÂÒöGÿ3`×7"ÊàIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-19.4.png 644 233 144 3076 14774263776 15055 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜóIDATHÇÍ–ïO”WÇÏ0À0„B‡ US¶Öh»´ò#M[ÐR\ERÒ ¦¾0µh6Ýtc嵦º´AduI7!Qak ±B¡!‘6E1¦&`×Ͱ¥ë(àðk˜çyîg_Ì<<³vÿï›'çÜs¿ßïsνç^y2ôˆH‰H‰ˆÚïXþ˜â˜âô/‚v“¶2[Ù¿AÂg Ÿ¸Z\-ƨe›óf|øz ?œÏôË“b9ççm…!û¼õü[ÏǬ ÚÇÁÙéì\Ð`o×Þ.€ŽÏ;>çOðËÕ_®Ì΂e›óf¼¹ÞÄ Ç—#ð‹@TOTí68¢Ñ"ðLÑ3Eiï&Ò`ûÖí[îØïØUè÷€8âT!àÇ9¼a¶9Š7×›x&¾Égòõ$$ˆÀŽŠÎf""£­ðÁÓ< ä:ù'G8BèQzðwmV›Å¯nF#С:U'€úQýèz…^M›Ñfh¦™8êBx ž;ðœ)p´•¶R£Ôp6CÒî¤ÝVMC߆×áÍù7çA½R7yŸ÷ÔÏêgD©%µ„R‰jZ·š)”]Ù•ØÎ6¶ñèPüÇxÙx™€Ú¯eh¦;0„^þTùS¦À†×ÃJ)"²¡œ>§ÏÉc'ÆN¬–,ÌÎ'Î'²888e1­t¬t¬t€·ßÛïícÜ7ÆÃ¤xðàîq‡;ÀJÐíÿób×b‹së–|K>J`¢~¢¸ìlr6ù"™ êþ%"ÒtªW• `¼0ó·{ßûòëòÛòÛP}½}]}]oQrQrQ2ÄÄÄ@EuEuE5p“›Ü´â´­Ak°ìšM5Å5Ũ¢åÂ_ 5½Æ †{oúÞtàÛ Q?‰ˆ €ö‰ö X¸ öäýå¥Ä—ñ›y)))Vo«·Õ 9Ù9Ù9Ùaælælæ,œ«=W{®ö7¥äÒØ¥±KcÖÆÙºµøAñü¡Jï1¾mëlë‚z"lë㿎ÿúÅ\ùé•ÌW2EbψˆØš‡Î]¹:"Ž¬è¬¨¬(‘¹µskçÖŠ¤HФˆÈ]¹+wEÄ}Ð}Ð}Pd2a2a2Aä¾~_¿¯ËêðÞòÞòÞiÈiÈiÈ©ükåÑÊ£"¶){´=ZÁ([3¿mÿkûEäñçãÏ¿˜+àzÂõ„áá‚·ÑÛÊX=öä]Ï»žwºS»S»S­ ª?T¨vNíœÚ9®!×kNל®9]cÅÕUÖUÖU‚ý¤ý¤ý$äççC̲cÊ1]þoÞýæ]¼°¹ ƶø]ñ» O„`tÝ6oÞ±ýNDD’Ì?öwú;ü"ѥѥѥ"£öQû¨]¤çlÏÙž³"›«6Wm®Iv%»’]"Ù³f?9³þÌú3ëEòûòûòûDÚÝíîv·Hú•ôÁôA‘5;ÖlZ³IdÖ ·7Ü–$‘mA±Åó=ßÛ<¡S9|€kî>wðÇ`ÍC?ì¯ÞTZ ×Ê®•]+³2qìø±ãÇŽCÖ¾¬}Yû ¿°¿°¿|Ù¾l_6”f”f”fÀtÁtÁtµî≋µkáplÍ…š a{ì»¶¯Ú¾–‚zBš.CÕGUY§4ŸæŒP2ÇC “L2¶»[h¡H#´°¶EmQ[@ûNëÕzÁè1n7PüCûTûÔ6“¯ê˪/¡S¹ÚÇ”sÚ9í‹Ä Œ¬>fì XT~žåY‹P÷èÝúF}£¾Œz£Þ¨úé§tC7t8ʇ|&´[ÑcX4ªƒø0þêø«À²sÜ9î‹D3ûØo:¹£ÜÖ™ô^½oocJV(VXü,³ü?=^Gæðâ ϸ±ÇØC€ýŠ~˜áSSó;ÿ#w¥yw™weP`'ð Ÿ·Zbô]ú.ü Õ 6l`Ùæ¼o®7ñL|“Ïäêyœ_í{ìñ|Áþ³¯-LXIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-93.png 644 233 144 2554 14774263775 14714 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü!IDATHÇÍ–oHUgÇWWzÉ4Å™:ˆU#3( k†ÚŠˆ E[FM_Yob EÆB_¬$ÊB'dÑnå´4Z£‰Ksl/ƺÙ6*¢ Ùºvm:ï=Ïy>{qî¹ç¶MzÛysïïß÷û=¿ç<¿ç‘9á_˜y1ób-;æSÇ__øÁ9Ë>©ÀµÑµñ—Ï!©9© ¹-¹Í¼ïØvÜήqð£ùl¿ÌÇç‰ó¸Ö„탰eÉ–%ñs-»±Üîο ØÙµ³ àrûåv>ß oÀ¿Æ¿ÛŽÛùv½/ÿÅ/3zfô¸AÜ̸™"0ÝüuÙµVÂoÙP¼¡xÀÓØ§±:Ô(@‚^Œ3Žý¼ˆ²íx8ß®·ñl|›Ïæ·ô¤æ§æ‹@éÖÒ­îV«àþYØ›±70BÀIN’@³qÄ8úgc±±˜)¾Ö{ô²È¾ÐEºôOÆcS´ÇŒcœà ^?Âgó[zä͵mZ ›ã7Ç“¡P“jHVuªŽNÑ«õj´Ý"½Bçê\Ðåº\—ƒ®Õ5º&ÒAtšÎ×ùh Ôyuž¨—ê%0eã‡ù"ü-èÃcàö¹}ãïÁˆQÜ"¾3ÓÍt&lGðàýà}xqãÅ7ÀÓ/ŠåÈý,÷3[0c‡¡¦¤¦Äõë´ý§  t)]ó)x½ûõn€Î£Gù=L_œ¾0œ ‚e›q3߬7ñ²ñ%ü ~pžqž±M@î#¹ˆ€'ä 7§Æ‹¡ò•ÊW&í“v#´;@yFˆÇ|îfÙf<“oÖ›x&¾Égò§õäWäWˆ@UmU­Ò†*"ríhYÞ²¨]D&4§æ¦~NýLÂø^ß§ïºÓÆiãŠqHhµZ- Hͤf€Ã|ÌÇäü3»¾Úõ•)ðÚ'ü­ÊQåPÚL=òßgûÁó°ùþæû`4¨ÆUZh0FŒTx•W1ôiýž~oáMaØ »a^£žzËÏ„aèÓÚ 6ˆ Üâè‰4>ØüÞæ÷L<Ÿu”""«÷WâqãŽ~¸»q>vÉý%ªŽªÖÓëÕ¯Õ¯y`ÜcË,>}©¾T_ š_ók~Ðûõ~½8Æ1Ž.ºèK ÖËõ7õ7A[Ÿ 'Ã<ÐÛ3sLóŽy”qe<î`Þœcÿ3ù«s«sMzu€y­WëT}»¾u჊ $I˜’‰èèÀw¹»ð® ÐôT’Z¿ÖŸ…Oµ«Úõ'ÿ/v¥¹»Ì]If·Áû¼OÞ£mÓ¶‘ã‚q6°l3næ›õ&ž‰oò™ü »ò¡½]<´÷±‡óûH°±û÷ß|IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-9.0.png 644 233 144 2643 14774263776 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜXIDATHÇÍ–oLÕUÇî…¸0utMp9¦Äœ$[(Vƒ…#òÏh¹ºg+KÜ\cNqÍÕf/œ›öÂÆ\[K¸± ÖœPÌ@ñ [Xq1§.»¡²ø#Ô½¿ß9çÓ‹{Ͻ·Ì^{ÞÜûüû~¿;Ï9ÏȂد€§ÀSàÉŽÚž·~_¯fy[ÔþXAÊË)/ÿøä4ç4,l]تJØ6nó“ëEøÉ|Ö/ $áHïHïH©ŠÙÀ««^]å{,j»g3Îιðv÷ÛÝŸu~Æ] ]ø£ê*HØ6nóm½ÅKÆ—þÅ/i½i½)×!ý‘ôGD pCá†'߉&\}¶lܲàWï¯^ãuÈ"ËT³Ìb×Ý$ÛÆcù¶ÞâY|Ëgù£zr+s+E .PÈh‰üô9îþ¼ýy–Ï9K3M4‘e¾s~s~:•(! æ{ó=60£føÔqg›ïœ«ÎU ›wy—¬8ž²ø1¾8Tü³·Vó×+¼ßgˆ…î°; f‘;ààÄÆxõ¼žj©¥–Äj Ð!=¦Çâ^c¼n·ÛÃ.U  ’ð­Þ­^+ðÃê¤VŠˆ¬ü2B¡ÙTª úx L£id>rÍñ9>¸{ánÏÝÐãz\' j§ö„ÉäGòa²pòñÉÇÁ¬2Ð]º‹y~á› t!ÁÕöñ·Ðð~Ãû`þÐ¥À³< 3#33˜¥&RÌþÌþÌ~i¤‘ûÖÎÐÎÐÎdœÉ8“q¶½ý«í_%v>·ÓíŽ[¾(¿Õ6²Ú§Û§A•˜7cáßœè=Ñ ëê×Õ¯«O¯žZ=µz ÚöµíkÛ—ðwmëÚÖµ JŠKŠKŠávùíòÛåPt¤èHÑè¡g¾g>žVaËå·z<"ÙÙO—‹T¾Pù‚ˆœIi‰u:=ïó¼/ò¾™˜›˜›˜iojojo¹‘s#çFŽÈä¦ÉM“›$¾n¼yðæA©¿Ô_*â¿â¿â¿"R°¨`QÁ"‘k^ó_óÇÓÓeƒå‹ñÇô¤Šx·x·P"’ösÚÏ)â}]DD&圈ˆäÖøk×,ÙñÜŽçw¾ù8LÕMÕMÕAç²ÎeË âVÅ­Š[Ðs¯ç^O’ ¸_º_æêŸ±ûn%ÚÞW¹ â:×1Ü H0 ¸•VZbŠ)Nò¯e-kÓœæt’ÿšiVQK-ÔbµøëoeÒSÁp0¾O¼Ä/ºBW0¯®ëL ê)µ\-}TÕGóœç<(G9ÊNqŠS ×ëõz=¨gT©*}Fÿ ´®×õÌÇñuÐ :œcI“Ÿ­¾­¾¤ÉŒRC€Ñoè7pbÍ5€ƒ ˜fšé$ÛÆ#6?VTƒÉø–ï¾Éÿ€o%ûó÷çÇ·9L¸³î,€ªWõ„Á\4H!¶Û|[oñ,þ¿•íëâ¡}=œ/Ø¿}ÿÇ ÄxbIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-15.png 644 233 144 2412 14774263775 14677 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¿IDATHÇÍ–_HTYÇÏL¦N;•b>D¦8ÛÃ2aŠRMKm +ÂJÿÀ "Š Cûó°Ã<ÄØË*d=ØËZQ‹`DˆÐPˆb…Eˆ]fÈ6Û‡Tl4›tD{îùìÃ3÷Öfícçåòû÷ý~Ï¿ß=„B䤾ÜëÝëÝ«,ÛýƒíϮήþòWËn“àÚïÚÿ×O°úê꫹í¹ífÔ¶u\ç;ë…°ñ|Ú/r„íÈêÈêpU¦ìF8Pr $;ß²îÏ]ÏÝ„'î¸Ðy£ó 0þxü1Àtåt%ضŽë|]¯ñœø¢ñ=~!`y×ò.×?•™•)UUùN[ û`OÍž€—Ë^.Sn1À‹WU3̠ǤÃÖñT¾®×x_ói~K€5»ÖìöÜwÐó‹U½Á‚`æKÞÅ ‘F¼ 3e&°Ý¸f\cßT½ªÀÔ‚6àƌíÆvT,ù&ùø A¼i<\\§FoÙü–ñîÞ6 µÙµÙ€H€æó IR×Õu”z¦"*޵šd000ཕT`vš$AvËîô„Ò|i~áôU+xÆ=ã30,‡eð;0˜G˜c [Gb$1’£Ø(6ŠmÿÛ¼·yoó`"<žC,;; ò ¹EnP¥ª”9†4¾æÓü–ž”°¶>¨;_w^ÛeŒO§öŒÕ7j«Ú Ó-Ó-Ó-°­y[ó¶fxpîÁ¹çla‰‚DAüüü`SÙ¦²MeÉ‹x#^Ïœ][sð¥ù-=)aC?Âøxºî8ÅF¿ÑÏBz…^'^'^C Böè­ë­ë­ƒ¸'î‰{ °¾°¾°šÚšÚšÚ`xpxpxбåßSC —­²Uã«ã6¿¥GÀªžU=ªÆ+Æ+³*¬Â@”P§Ô)u äZ¹V®…r¹¿Ü/>¼øð" ¹‡ÜCnð5ø| °cvÇìŽYØÐ¸¡qC#ŒlÙ<²Ù†W‰Ä94¿¥G@îÊÜ•f&G'G×^ÅT è ƒPJ)¥l˜€?àø¡»¶»¶»^E_E_E¡§¯§¯§ÏÎÛ™¿3g>´µµÙ~Yil46:ù4¿¥Ç-„yß¼ïŠaì5ö =ÖÄ3ñLaˆE±(„«ÐUè*LÇÅ|×|×|—BD/G/G/ qtêèÔÑ)!Úãíñö¸¥¥¥B”¼(yQò®wázîzîàKó§ô,yÆ7åM LØÍnvÛ3­­­€ÁòÁòÁrÛ©õRë¥Vär9pÛwÛwÛçØ±½TQü!OËÓ=cKÜJŒã>Ä‚}>0žð„'€‰‰éð?â€=TSíÀKSÆÔ'oåGú˜2›‡™{‡ «»™G°ú½e”QWäydPeÌ¯Í ³øe5mó¤y’¹ÔÉÿTû@çR¿_ö˜ÇÌc$Ó3N0Í4d‘E‡b•Z±ùÿtþT½ÆÓøKvþÿù¯„&šðÚ[,ÉC,€êU½¸pmëxúH¤ê5žÆ_ò_ùÙ¾.>Û÷Øçù‚ýÜùsºëeç¢IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.png 644 233 144 2065 14774263775 14621 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜêIDATHÇÍ–OH\GÇgך]ñOâ²{KXÅ9xÍBÝ@V’ J 9¤4ÄP"‘æ R…^T!§†D1!ƒxP4ØÔœô$Ùj=ô°tuk\}oæÓÃ{óÞØS¶'ç°Ëï7¿ß÷ûßÌûÍBqÆý<<¬rìà¾?|9|ùÛ Ç~fCàzàúÚ/púéé§ÕÏ«ŸË´oëyoæ áã›|Ú/Îßš Mâ®ýn4Þh Ç{h ʦʦþ±àÞ›{o^¿xý‚Ÿ ³œYØŽoÇÁ·õ¼Ž×ùÏÄOþÃ/”ΔÎþ†Ð©Ð)!à|óù暇NÀf \M^M|*ùT¢‚`oT¨8°Çzd [Ï»ñ:_ãi|ͧù=¢—¢—„€Ô­Ô­²ßœ„ô8<>ûø¬æ;š ¬=k°ì›öM  6Ô0¨†ÔP*?Èö#ûlkÇÚ?_ãi|ͧù=âøÞmá¶°'è°ßÛïä]y—#€û ð'iÒ ¨êþ°ùÂÏR^¾‡§ñ5Ÿæ¦ ï~…²LYfïذ7lð È;òûžgŸm¶-¶Ø9ä …ÎB'äêru¹:Cà2‹,R;Žá]ñù4¿£Çöìw¸ß{¿×K¾àm™^ñ9rFA"vÄŽøvOCOCO4ï6ï6ïú~Ù/ûe?ðk¬™4ñåŸßÑã [ý^å^yÄê°_Ú/)ûF½1“1ßž_Ÿ_Ÿ_÷D2•L%SFü˜“cÀ +¬¸5ßßåÓüŽUïªÞ©IÈ\Ì\4¶µ¬–ÝÕ) Dˆ?»݉îD!‘Oäyhll„–Æ–Æ–F£²i;m§,Y²žïÍïèP]Y])?Bösö³•µ¥¶ ‚¸·ã¾=\>\>\%#%#%#дڴڴ áƒðAø¦Û¦Û¦ÛŒÊõÊ^Ùk 9†Ÿõù=A!ä[ù6ðQëšuMèBlŠMgB;‚Áo^$j5‰!&B¡‰µµµBÄR±T,%D}¤>RñãG£À‘gà»|šßÕSìó*Ð%»d—oÏ-Ì-Ì-@_e_e_¥7.Çå8P àž¨¯=c_ùUîºíA;’*©’`-Z‹Ö"È9#g€QFÕªZU«±ÝfŠû*‹èc¸+Ï“'oU³jd·ì–ÝF´n3^K.ªÑù½;Õn£%ïÝ•–Y¡¢;ÿÿ¼+±oÛ·)€ZRK€oëyoËŠ½+OìëâľÇNæ ö_¦Ð©jÁ¦#IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-69-red.png 644 233 144 4243 14774263775 15627 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜXIDATXí—}P•UÇÏórQ"QÅKH@(l¸f‚z±i‰™h†2¥‚ÚÔšY5£¦É—6#ÉMMÆ—Á×É!à¦5`fd¹•/ÍŽmYhr© 1!õ^Ü Ÿ—ÏþÁ=Ï}™-gg÷÷ÏïœßËç9çûœsbÄn1¦ÎåååUþHNhMhMh]0S7uS7OïÓÅt1F¦íBºÐ¥±¾½QÆË|YOÖí§Î‰å‰æ[)VŠ•jKì|ÚoôV½Uom¹¤<©<©<逤¤úSý©~Þ+?[~¶ü,Ü÷ý}ßß÷=TUUE|9/ãe¾¬'ëË~¿Ì#Ô;bý¬íê€: tO—+4¹zrõäjó©Ý'vŸØ}ÂN üø)ð ¡¡ä*W¹ tÓM78~x^ÆË|YOÖí—µý—ù„ûµGíQ{ºÛe¢cEÇŠŽèºÖê ÑEØì\{œ=Ã\gì5ö‚™ofš™`–šef˜ùf±Y æ:3ËÌ;×N´1d¾¬'ë;À1ýÝ78hJ‹Ò¢´¡oÐ7è¿” žžõžõF©öŒuÂ:AÀh  »›3œ†ùН¬J«°¢^%¶­F°»GFF³Ñlû+ÕJ% £==k=kRÙ_òH>áúÎõë»?þ^¸kݵîZ{ª¯ß×ïëçJ¸NÀ|ÅXe¬àG~í탃D™]g×p æts:ð7ø®íº¶ ÌW¬^«×I øú}–Ï⊻Öý¼ûy{ªäqøôåúr}ù© rbgÕ·v>d/ -ÆYã,€Õcõ¡'î}â^ù¬ôô¶iÛ´hàoæ~3 `JÁ”¨øÐ¸µãÖ´~Ýú5-Ñ9wVí|`çö2gecø„Ý—š“š“šÃÆK .-¸´€IL C¾ó&s“ ø~òûÉõ3êgDw,íX pWù]å™g>pòþ“÷,íZÚ’Ö$­2zŸë}Î5.-è»ÿm<’O‚þõžM÷lºgSäÍÌ.c¼1è“C³Ûf·,+YVÒB@ÏÁžƒ<òÁ#gšÏ4$ % ìqíqE/šÈ? ä*¹@ß>Ï>˜]Ñ1%ä ƒÒVqºâtÅi'Ð4çËÇ+WÆŒ˜prÂI€ݸ(z%—W,¯ˆî•“›“ pÇ”;¦øOùOl»yÛÍQy¯%¼–æó1 fEAEAEsn·É­œY?³~f=燔`°80òeð§À’À 8+q@ΡœC½'{O~çð;ÑÀíùíù?Œùa @úKé/Ü”pS@úÖô­@(zWÙ®2°óÂýÂV4¶hlÑXÎK>¡–ª¥j鵋òªÛ»roÒÞ¤( Œ–3fϘ „Vv¯ìŽÙÊÇü¨åj9À¶cÛŽt$w$|vëg· • •FǼŽy‘3÷·ÝÒvK¤ßG›?,ü°ÐYÉÇ•<%OÉ»vQh·i·i·­®“_YFfFfF¦™å»ÿ\ë¹V§@Àž·æã5$´$´öÛܰ:muZôŠžÛsn@Õ˜ª1i]i]Ÿîþt7,}½ôuàîìeÙˆÝÃnBAB+B+ guö–ì-–shiZš–¶ëŠH.I.I.BÿDÿDÿ¤©Ç9ð+æ¿:ÿUs•$µj&„wqùâr (Á&tLèx£ùæè•¾øÖÅ·Š;‹;@8þJv{v;X»¾ØñÅŽÈVWÿóá­oµ‚àm‰¶¤cሟ(¿zi“w¸ò\y®¼î¿É„šu5Y5Yö<çükn1·`CÀðá÷†ß‹´ßµßrCÖEë"@ ?fUèÛз‘­nhÞܼ™»+´N­Së†(“”IʤßíŽÔ¾p®Ô••ç7(MJ“Ò$µbýÙ{ÔÛæmÃëhw•yÜ<>²ØX@ÈÚgí‹æµ·ÛÛì±öX°çÙì)õ4õ¼Üó2dŒÎÐ24c¹³’ëµ´j<Z©(¥º;ÂZ,ŠE±¾^´ˆÑ"„Ö§õi}O½ã\­ îíîíFŠïY_¯.Z»VµU ˆþ—9Ì{¡Uh’a‹?[üùâÏÍUÎ tU¿ª_õ¾8qÅÄW¡zTêQö‡éª$æ˜ðß…Úyí¼v^94õé©OO}ZWµ«ÚUí}ÑÑn±§ØS­]«Æª!„/^à2—¹u N3§™Ó"Z¬/¬/¬/´ç9wyŠ+Å•Ò3þµ4:v§•#q[/”8÷x¬ï=¢]ßþ(í®«Y¥Ý#ÅH‰Y¬ Ö…ˆ;餼‰‰‰v¹£Éd5YM^ô—8)îˆã%~y@«ÓnùÐîQïшv£ÆQãhäSœ88qp"dû³ýÙ~ó׎ßÔÞÔÞÜ:KJ-,½xÀÅu, üœv7»7»7)¾&_“¯ "„_’Öª9Ts(rìè zƒÞÐþ—$ñq}Ãã"éz€ñ&…µ{ðç´;·lnÙܲˆv½³¼³¼³Ø72o;;¡T*•JåüÕ±mÔËq}ñ_Úõ´;G«Óê´ºî| \Y[Y[YkoÉÎÎ6¾v¶ºOëÓúj&‹FÑ(EøØÑ|qýF‰ÿÑâµûb¬?÷åQåQåQwŠ;ÅÖoÕt5]ME(B?žÌf…ÐNi§´SÊáÄ…q;÷³ç©D”ˆýËØég«T[µU”#ÊåHïÍ#ã¿òÆíLW\Ýënõ¿ùཀྵ].6éIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-20.0.png 644 233 144 3230 14774263776 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜMIDATHÇÍ–íOTgÆïa™1¼TƒìFÄ1|éÕèÔj["Xkiu‘¦Ä¶¸ êÆÝøºnÁ†l퇵nÖ·àmùÐ H)*´PbKÅ6í¶tÕÅ™m]E)Ô‘¢ë™™sžß~˜9ÎìËàù2¹î—ë¾æœç¹žG@DD‰þ $d%d%¤FpÂ/cqûzûúì÷"øˆ–ç-Ïÿm?¤N; 0ë䬓Æå6óf}|¿HŒ?~ž—G$Hz?é}KQ×Cyny®}N<ŽGÇÝ0¼ÖùZ'@{s{3¿‚±ÏÇ>˜,š,‚6óf½ÙoòÅóKýÍÄîÄnËUHš‘4CœÅÎâ…»#¾…°é™MÏŒZG­*ôŸ€d’U0Í4æs+›ùh½Ùoò™üæ®ùØxùþRf+³9šL=òŸßö­§Y¼yÍæ5  ¨£Þ¨'¤Ö)§r¢T¶zL=öàM¡¬Êª¬À«¼Â+±8;(¦eŒéçõó„€ÜC‹òÿzóÍLo=÷)ED–¢×Ñâh™¶/Ç—¡_°á§E?øñ÷B%¡šPMlžæÓ|šüN¿Óï•«rUnœ :èˆÁà¼`I°üó'^Ÿx{Êáï^ï^`ÌqÁqaÚ†Ñ#j¥ˆÈ‘Oa×›»Þ„©ùO•´–´BZJÚ’´%¨5¿Y³c͘¬›¬›¬ƒj£Ú¨6À¾Û¾Û¾*û+û+ûã„yðà‰ÁícÛ¯o¿Ž6G‡£UùÙ‹‰/&šY#Ÿjgµx2¢G™""_×@oJo 4ÿ¾kc×FUµ8=ûtöi4³µ4»4»4ÖëŒu¬Í[›·6nÖÞ¬½Y 999Ðè tb‚NyNyNyÀµÔµÔµ&VNäNäBNýÂì…Ùh 2ˆª‚Ó'NŸÝÑ“`KHù>åû‚•"ee"%çW[V[,M}Cþ¿$ýëÙ¯Î~%2U6U6U&2'sNæœL‘ÔüÔüÔ|‘¹sç6Šd¹²\Y.ŸøÄ'±çÚòk˯-ÉÈÏÈÏÈɸñ]Æw"Y?w®v®–¤¼:Ü4Üdi)þ¨ø#´™}3û V&È­?XÀ%›-^‹Wäg}³ºfu‰ÿOy‡_8ü‚Hm¨V¯ÕE<#žψȆœ 9rDn﻽ïö¾˜€P8…EgggbqÛ|Û|Û|‘°+ì »âêÓCO„ž±WØûì}âI¼žx]Ä’j­´VâJ0†Ã áË%iŸ96sL¤k¸Ç×ã“ô?Ü?˜r0Ed[ѶÂm…"ýýý"i³Óf§ÍŸ1>c|†HÝPÝP݈Ü?îYqeÅ•WD<{<{<{D–•/+_V.2êuºEê—Ö/®_,218Ñ<Ñ,RôÏ¢ýEû%]$ 4Ë]Úh³\ý·æëz¹ëe8}ièÝ¡wUÕú­OiOih¥Zédé$ä5ä5ä5À@Ê@Ê@ t'u'u'Ûív»ÝÐsµçjÏU¸³óÎÎ;;a“u“u“Åâ@1´/h_оVÝXå]å…§:ßî|Û\êŠÌ¶ä¶dàÛˆž¨]ùªKªKâv úYý, 1Î8êÁj.¤B •VZãváqŽsXÄ"ÅÅݸq­œädÌö8 šóªV¦¢»’ö¨áð:¼Ó6õ™÷qïã 7F|Fÿ{p:8Í=½QÿDÿÔ°úR} ÆVc«±t—îÒ]`ôýF?ÐB -`ˆ!†-ÁÆ“Æ.cè+‚õÁzîïE}Ìðº¼.‡Ïá›¶q7êcÿãüÁ-–-Àuæ€Þ«÷·gg Œþc‚‘“!î]Ànq+Z Œ*£ŠA½_àw¡AØbßbÿ¿Î=+)«(«ˆ;+Ù;oï¼À¼A2„§ÃÓúKúKh Î©sX°@ ›y³Þì7ùL~sž9ÿÁYùÐÞ.ÚûØÃyƒý7âªP˘٠IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-17.0.png 644 233 144 3027 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÌIDATHÇÍ–ïOTWÇŸ`ȈÕu_lJwŒ”w¢íÚ²Pû6í¶±+±AªtˆX´™ØF´Ñ¸ÑØH[k”)–¥ÕÚnÁ²aª¨Û&P·º–Åf·i±0$]bÇI;–ÃpçÞóÙ3—;Öý ¸p©r F sL¥Ùf<•oÎ7ñL|“ÏäOêXR¶¤LÖm\·ÑùšˆÈÕawþî|à1-ÀyŽq O´&ZA 'MQŸ q‹0aÖPwXsÌ¥ÙÛYÔÑô4 LŒxŸúʦÊ&Sà›O¦m¥ˆHÑpÆœ±˜ÁÑ·Fßš‡]3óרåØenë+õ•úJÐ6h´ 0Ù8Ù8ÙS-S-S- GÃÑ0Ì6Ï6Ï6sט˟{fî¸ñ뉽{¹­ƒ™¨ºÒW‹/NêÞ½'zOX„Óþiÿ´.U]ªºTîw»Æ?dåÉ?“&<Ë=Ë=Ëa¢dbÅÄ (l\V°¬€øÙß ¢êà|ûùvÐíI=B,¯'¯Guñ]$7’ ê•TýJׯ¡øÅ‹‹C ˆbwoѦáMÛ†ápÓá¦ÃMwÇýGüGüG ¼º¼º¼Úòÿ¾­¼¶¼}ûÝ·ßЪ´*Hè¹}¹}ª+Cdz3½xdØñ†ã 9*""72#·Ã-bßbßjß*‚/^™CW†® ]é÷÷ûûý"›m›m›m"²SvÊN+Ïžeϲg‰$< OÂcùµ%ÚãÚã"9súrú䆈ãšãšˆ-/³&³ ò.ä]P]t\]÷ßùÇ«~Z]…Î:XþwÜq*;*;*;,´(Z-‚Öµ­k[×Â`á`á`!¸ûÜ}î>h(jx¨á!(|õÁÒKaä_ßûý·Ñ‡£ƒ¡\\TWª*¿ÚÅåŽÏ:>þ˜zú(ñT‰Ôq‡«ÃüÇ{7à¾ìIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-15.0.png 644 233 144 3133 14774263776 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ëO”gÆïf^ƒ¶TJ6 ‚JÖ.L°ˆa¡I1UŠlESlÔ˜Åm&¡±qƒÁ¸ZR’BÓÃV¥ ëš­@7Š6E”l`±¥ÚU‰ ’ZQ"‡ˆL±Î¼§ß~˜y™Ù¶€Ï—7÷á¹îë}×ýˆˆÈ“ᯀ}}}Uȶÿ1â+Ž+Nÿ$d7ë`{ÉöÒOÀ>ñ!@B[B›1±­¸•=_$‚]ÏòË“q¸>u}j+ ÛõðrÖËYqO‡ì÷@éRº–4xµûÕn€Î³gy ¦¯L_¸_t¿"¶·ò­ù^4¾Ôÿ¤¾8/8/ؾW¬+VÒ¶§m_(”0±ÊJËJ¦b¦bL;è³@<ñfàÇ5æ¢l+ηæ[x¾UϪâ#ø|âó"P¾§|ÒŠ*"2ö1I9’ä¨]´ó.ïÚ÷Ú÷`´J­’€y×ð^0g9cøÊ|Ç|@÷è ÍkóÀ>â#âͯÃxj.Õ\²Ž}Ì?Ëå¥Õâ#ÿ¿·ï¿»~Øõ˜‡Ô!ÓÇ1Ž˜Ýf7*sÜä&&¿¯ïzk×[Á÷_ˆÚJ‘ßžůøý¾ÿ`üƒeØK“~üðP[§­ÓÖEê-®^\½¸îõÝë»×³µ³µ³µ »t—îú9ß`JðÅà‹0Ÿ:slæMw|G|G€ieXö;„ø×DDšÁSç©3ÀȾÿ—Ù7gß„ü÷ò½ù^Ì‹¾Xs±&R(e)e)e 2ë2ë2ë`cöÆìÙ0Ú>Ú>ÚŨ…ZààôÁÛoƒâUº”.Ì}ÿ~ÅùŠÓJ2²ù—'Í“„øˆyCDä›è˜è˜€¥ÿ˜U[þ”ûTîS!þ"0àð xàò@y @jujuj5447474Ãøðøðø0K.¹^='{Nöœw†;Ã3y3Y3Yð›úõéëÓ œß4Äf|~æó3 ;B|ì¶_¯êYÕ³)On<÷ìsÏŠ¬ø›ˆˆ­u¨ýÊ·W¾WNfNFN†ˆ–¬%kÉ"“ÁÉàdPÄasØ6‘ÞÊÞÊÞJ‘Ò‘Ò‘Òß”oÊ7%ËãVá­Â[…"IÙIÙIÙ"IÃI#I#"k~•V˜V(®›¸Öz­ÕÖ*²½o{Ÿ—W\Þ”g—•1{cöâ–ëηo‹H“ˆˆÌÇL;Óœi"±k‹µ‰¨#êˆ:"’2š2š2*ÒZÙZÙZ)2˜0˜0˜ ’|<ùxòq‘î’î’î’1{’=Éž$¢¹5·æŽøÕD5_͉Ûw9î²Ì‹8o;o‹ØVÅì‹Ù‡Û.ŸŸÙ®‹ª–¨%"¶TI´]xtþÑyÇfÇfÇf‘±Sc§ÆN‰˜?0`^¤mGÛŽ¶"sss"éÒ7¤o9Wq®â\…HNcNcN£ÈÔ–©-S[Dê3꟩FdfhæìÌY‘¢[E'ŠNH¢ÈB`! b[‹×v=|+¿©á+o¯·ø}茅H vE­Ô ç ç çDÎNãéÆÓ§!Ï™çÌsBÇÊŽ•+a¡n¡n¡ʶ•m+Û ¹ ¹ ¹Ð¹¶smçZØzg«o«Î/v7u7¡™U${ã½ñÀÕŸ0±æAð¼áy#ê– ùµˆ¢›@€p•«\ Œ¨Û×O?ý@1ÅGù ( øm´EáýU»¡Ý2­zžO °¾•Ë:f*w•»~Ƹ:®FtÌØ¯^R/ñ;Ydw˜dô&½Ioý°~X? F¹Qn”G9ÊQ0C1àï!¹0 Œj£ôßëƒõ<4> ë˜ásûÜÊ„2áw°déØÏ”·k÷²@ªC,é_è_ª±ßغüÇfxñ#?F­‰Ž<`޹ðZƒ F•Q…JPï×û£ðÙ·;î•ÿ'½Òê]V¯$ÜÛ â#[¬ïÕ÷sÀÀ† "¶_>áùž…oÕ³ê/÷ÊÇöuñؾÇÏìÿýT¸Ð¥MðIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-10.6.png 644 233 144 3151 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–íOTgÆïy¡Ã˜QÛfë.ìÍv]VH#C0n†MkÛP¨/!€FÁ.LcªÄ¤ÙmWÚT>,mŠ4k#¥-Öñ¥«F´¼ìVºÐ(«ʪ [¡ ›Z¨ ’Qp8sžóÛ3‡™t÷ð|9¹ß®ë:ÏsîûyDDäñø[ÀšaͰ.‹ÙÖÝ ês©Ï­Äì#:XJ-¥·þË›–7<ñÑ©á„mÆÍüäz‘~2Ÿé—Ç%áp|æøÌR·ë`[ζœÔŸÄì?õ‚óœó܃(¼|þåóg?9û {`âÊÄ€™¢™"HØfÜÌ7ëM¼d|©û¿¤|žò¹e 9ϳžgW½K]ÅÏ?pÇvÇfX@.\F&ŒùL%Ùf<žoÖ›x&¾ÉgòÇô¸ýn¿””•”9[ÐDD†?…ÚôÚt @;ÇÇÔQ‡ ô=ø ú0úˆñOÕ¨óF›Ñ` ƒ@D/Óˈ@t&:h¦—ñ÷8Þ;ûßßÿ¾)pøS޼8û⬳ÜEî¢ÄžÆß ÏÀæû›ïƒñ €vÙ¢–Zã†q*^â% 5¡¦ÕôâJaØ ›aªØÅ®„ŸZJ)ÅPmú{ú{hÀ4Ó`lá³róÚÍkM Ï$m¥ˆHv#8ÃÎpØÎµÛïÞ~wvÓƒÐýå÷—3§´€HðEB‘P$!OÈò€‘cä9I‚` aFÝÝÁWüa9í1|ÍÍþælu¶†í¦ᆈȑ¯ æš7Àð¨Ü™w‚ƒ¡pUá†Â í¥í›Ú7%ˆvªj§çIçIçI¨ì®ì®ìNZÁ 4‚ {ÇÈŽ[;nk·ë ë ÆoþX¸¯pLoS}ªOåžœ=9 þÓ#Æ7""ûáôèéQx0`T¼ºîÉuO1×õº\—ë=ý=ý=ýmɶd[`Ò7é›ô·Þ[ï­‡6G›£Í‘ÔÞÐÞÐÞééépóúÍž›=ð»CÕYÕYD.¯šš0ªàÂÓž}&¦Çnùé² Ë.äùä› k7¬Yò¡ÌÉœ¥åò¹+__ùZd]¹ï5ßk" ÚBt!*2~müÚø5‘´Ì´Ì´L‘´«iWÓ®Šd\̸˜qQdäîÈÝ‘»²øíA{Ð.29:9:9*RÜRÜ[Ü+ò+÷LJ8~]¶ºiu“¥EÄýû;+KÏ.=›ç³ÊR[…­‚52”RŸR/"‡ED$d›Hñ¤xDìUöj{µˆHˆØÙÙ‰DK¢%Ñ’„-ªEµ¨ˆ³ÃÙáìHøç½óÞy¯Hž-Ï–gûËØ™±3"ÓÿžÖ§u‘ÿÕ\Ð\ !‘´·ÒÞQ.)—rÖØÕ¦Ú,C¢iéZºüÒòsqË÷1`}»^©WŠÌŸ ÌDüÇýÇýÇEözözözDêŠêŠêŠDB[C[C[EòòòDZgZgZgD².e]ʺ$2ž O…EZ~Ûâoñ‹|?r§ýN»ˆg_fGf‡¸E濘ÿBÄÒnÔ5–¡xWìç'ºNt/Äþ1³ù”Øx`#ôuöuöu&þ@y Ãg÷k=Z ¶ª}jÀ÷ñ ^X&ú‰þ‚GðÓ]Ó]ÓÝ• Ås¹Æ\Ãgûùùá·Xk` ¬Ðn ÞB}S}åÊ[–- Ö­€¾ïû¾7®çQX«a5ú× ‰~¢¿àÑù”ÊeGo­.;\v¸Œÿ9V ¬ºU·ê6ìPDËÕr >*ü~ nꀢ`Qf>˜ùRN§œ€_æÿ2@DNá)@Rý°è¯ïláŒìŒìŒlÔ?YñdÅ“z¢ ,°ñÛü¶päÌÈ`ì€moûØÔð¨Á?Ø|°Ù±…l! ×õýà ]}hõ¡Õ‡âߌy™—y@°[ñ›»jî*Xл žv<í€o­ßZ G??ú¹1Ýf·0ˆA@ïë/x_ '×××âUØr¶œ- ³°Ño?Ý~Ú$wÊFq÷ânCAc䃆1Œa€`ØxÇÇÇýÜ>!v´4וëÊuáÎsúœ>§Žã8Žƒc36c3€¿Éo ××€9ÏœK¢K¢Ðµ§k¸ò\yFàê«ÕWZg7Ø ×p —nåVnaÛÛÛÜ|D*–Š¥âÑAqÕ©×x®ñ\£¾“Û¨•Z©utÈ‹äEò¢ª:ñ–YfZfZf²Y¾µ¾µ¾µqéó¶m7NÎÑѺeý–õ V©UÐ×Þ×Ô *lhØÐ@Èæ}v†3"a„]•]•]¥é€ËæççÙïu-¶Ëírûß— ©Å¤— 8‰¼Æâ D—i·ÑÜhnTÓ}m¾6_€"ˆ@¿,§œ§œ§âÇŽÒ¤4)Mý±IÆÿ;©oì9yãu€É&ÖÇ´ûÃË´›¿*Uþª¸v=K=K=Kqt,ÎõIÐRZJK—W%¶‘†’úRò_Úë´»L®“ëä:ÿ|\ZSZSZÃÿ6/:/:/ªÞÐGrÀ™EZI+i%±cGö%õK!ÿ£%k÷`¢Ÿ›n¢›è&€‘"R¤½-M—¦KÓJ(¡ä_?Y–°%LˆÜ+÷ʽ´;–¸.irÿ7K×?’BR¨\O R&q‰K géYzöþŒ±ç¿ó$MÆ›T÷µ£þŒ‚ Í<IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-67.png 644 233 144 2617 14774263775 14715 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜDIDATHÇÍ–]hWÇÏìv³Ù’® jÁ˜ì¦F“@mÑTŠø¤`Zˆš*´¡#ih¤ ú(ø‹ˆ›ª!1DÔÒ ÆÄO0ÆJC¡l›X°dacµùèÆ&ëÎÜûëÃììl‹¶¯Þ‡Ý9_ÿÿ™sî=wDD$;ù/àÉ÷ä{‚¶ìùÐÕg¾ùva§-µÀØdlúqÌ9<ç0@NkN«reÇîø§Ç‹¸øé|Ž^²ÅUøÏúÏk’ò^¨|­òµÌù¶Üt]®Ç&|tî£sß´}ÓÆÇ½½ 0±fb ¸²cwüx/_öþ‹_|}ûàÏðgˆ@¸,\¶èÛáÞ"¨XW± âxµ¬‡@Yz #†³¥ÉŽ=éïÄ;x¾ÃçðÛùÌ[=oµl|ãûvÀP4ä5ä&@¢ 8ÊQ²8e¶˜- ûÍ|3Ÿ8_é*]ôè^Ý ú'Õ¬šAÇÌ2³Œ¸þ%1ži ,;ÑDfÆ…N‚C.¿ü³·Ö»™ïf €Ä·`E¬ð¹õ«õ+ u^¨´S"½UWëj H îšáR’Ð`õZ½Ž:ñmŠ/ÅoçcØ%‡DÑ@ôûÏD_|ù%Sžy‹¼²NÆõZ½V¾–\ÏuÏuyÑʳæ[óE&³&çNÎɩ̩̩ÁƒÈÔäÔäÔ¤ˆ±ÄXb,ñnò–{ËE»»"™þ/ý_ÊŒ ÝF·¼'+GÔˆ’‘e—=œö‰ÌæÎæ¾ùE²RGû¡~wýnçMÔ2ÚÌÃæaàuÊ)w+´udëÈÖ„¡@6„6„6„ cqÇâŽÅv#æ­†âŠâŠâ ðµûÚ}ípä»#}GúÜ Z½ñÓñÓi|)~;Ÿdb?|§¦NM¥âj•ÿÉé'§‰;šËM—›.7AÞ¥¼Ky—àΞ;{îìúáúáúa¸öøÚãkÝNöeôeôe@¸0\.„È‰È‰È ×®w›a3ìàëZ—ßÎG x#xCŸ…èÑ7Ü@ë-3ËÌr厎Žð5ú}P°¹`sÁfX_¶¾l}LLL¸þÕ÷ªïU߃ƒÛn?¸= w·Æôm};mO¦øí|<"Þ o¯ŠøÎû΋³þSÂNÉ2slæØÌ1‘å¡å¡å!‘û÷;ïwŠ<Š=Š=ЉœñœñœñˆŒNŒNŒNˆôööŠÔ,¨YP³ÀÅñ.òz E$.ù’ŸÆ—â·óñˆ¨ ê‚ñ³ˆùŽùNÊqžÑdÔõ.àŠâÅ+ŠEÆ‚cÁ± HkKkKk‹Èhéhéh©HÉÕ’«%WEÚWµ¯j_%Rz ô@é‘ìÙ;²wˆ¨6Õ¦ÚDäŒÉ˜ˆdJD".ŸËŸÌçY{Œß¬}Ö>âúS]§ëÜ‚Ÿ¬;Yw²V+•¿rüÊñ+®}WÑ®¢]EÐÝÙÝÙÝéêUêQ=€ÉŸü `µ[íÿ¹Çžq*gÍßÍßÓæÐ+ä’ 4ÓLsÚÖbˆ!`';Ù™¦`€ J”hCÛÍþ5cf,ïé§²ä¢h춆-@PŽV[ÔþJA•_ùÁÚfm³¶Zª–ª¥À,³Ì‚êWýªt®Ñ5i‰¦N¬ªVÕ)¼ò_Š?9WŸ9ùS“ÙºeÝPµªÖ¾ÍlòNÔ¨äKØk:Ùª8ÓL§Uõú€„‹çà?}òÿÿ]itûÙO–۫ʪ"ú¦¾ €®ìØS-KÆ;xþ3ïÊçöëâ¹ý{>¿`ÿ‰Ûl†íÙIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-22.3.png 644 233 144 3221 14774263776 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜFIDATHÇÍ–mLTWÇŸ¡´ã(ƒGãîªoA%M_ˆkyÉ– ]l"Ae—X»Ù¸+ÝUÐ4Ö"¤¥‰º&t§RËÆ× ¨€EÊ‹©»M‚› ­¤v•2ÀPDz wî=¿ý0sv»Ÿö“çËÍóœçùÿÿ÷œ{ÿ爈HLè)±4biDt0ŽøU8?'{NöÊ‹Áø¬–W,¯ôÿæ0ÿ€Øc?4î…csÞ¬ŸÝ/ÆŸÍgæ%F ë%ë%KF(®†×^xí…9 ƒqÍm°]¶]þ>eWÊ®4;›üõ<êðfx3 ›óf½ÙoâÍÆ—êÿâg[Ÿmµ õ9ës"ð|æó™+~,\;^ÚñÀ7Ï|óŒŠÝD¥2>Ì1:+6çCõf¿‰gâ›|&P€#Ý‘.™¼‰¼ [C°á^#,w–;AÝÐ.óg9Kè¢ ð~àqà1~Õkœ4NUªJU¨~ÕLé…z!~x^ †óœ'J}»P~©ü’)ð^#Êóçùm ¦ùϽ=ý"q[ ¶‚Z u“L‚ºb¼g¼‡føŒÏÏQêwêˆ:2³R¨cê˜:ê®úL}Ω¾V_£T–±ÚX<á ¨¨~nAiA©)ðô‹³¶RDdÍû´Û>²}ä‹„ÁÕƒ«A{€ŸyÖ ¿3ü“Ú6m¿¶?̧-Ök‹Áï‰÷ăV­UkÕ³å(GgÕŸÔ\š š4šþíÙ*žT<ÄäÄäÄdè.ë.ë. ¯DEqEqE1$I<’xz=Ž?ý«úWõ¯‚îúîúîz˜È™È™ÈøW×¥¯K禋ãºqô4ûËö—ã‹À‰À Ë€4Ï}4÷‘ˆë‹¶Á¶Aqœšª±×ØE ÷î.Ü-2Q9Q9Q)R[[[[[+RUU%R”Q”Q”!ò ëA׃.‘;)wR4­hZÑ´B¤£µ£µ£U¤¤¶¤¶¤V¤kn—­Ë&âÝïÍôfŠÌŒ9sH"þIÿ¤ˆìRve· ˆþ[ósív톫}÷}¬J³±Ý¿Ý?û—ÙEÙE •q•q•qP0R0R0Y›³6gm†M‘›"7EBcZcZcß-¾[|† >§\§\§\°áŸÜÜÐ0v¾î|ù «Rš>9÷É9àÏA=!»8Ûûröå˜`¬ýº~€ &Pü¿ã׸(4´°íñÝ¡;€:“o߉}'€éÐ_IsÈǰ¹mn_¤úÔèNýdÐgô¿M;ý-“z§î×ý`4Nà z§Þ©w‚Þ§÷é} ;u§îU¢JT yFž‘,a! A¯×{ôЫ¦Û¦Û˜4~ò±÷÷Û—¶/}‘< ùØœz§e§ 9³Wo×Û¯±ÃØÆ÷¡7ö2Âàeœq`<ôô3Åð˜1Æ ´Ö eì1ö 1¥ßÐoÌØn7ì´î´þOç•äæÎ:+ysÉ›Kf.oó6Qð|ú.}~P·Õm,X ›óf½Ùoâ™ø&ŸÉ?sV>µ·‹§ö>ötÞ`ÿ ãùö÷# ¹IEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-search.png 644 233 144 371 12610450011 16375 0‰PNG  IHDR Vu\çbKGDÿÿÿ ½§“ pHYs  šœtIMEÜ;–¸¢†IDAT(ϕѻ ÂP …áÏ©hHG ›0ÒÐRG´d¶`$$Ó\!7@,¹ðã·Î‘#3MŠÌ|&6èqÃ,ßv@‡5fØ"ÑxU€ëk¿©ÉŒˆûRžF=”Ë œËõ#Ú¯’ÊRb‡æc^î˜×¼ÅÔ?4Ãù7ð+&Kz—Ö¢­]ýxIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-15.4.png 644 233 144 3054 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜáIDATHÇÍ–oLTWÆß 0ò¯VˆiBml,C0 ˜Æ Ù"©¶@-i5𵓕tcCC,i‰e ÛUÇn2‰‰¤¦ìd¡–BkPDjÁ’²ˆ6ê@m-FDþMï½çþöÃÌåNº»ß½_nž÷œó¼Ïùó>爈ÈÑ¿€ó1çcΔ0vþÙŽ'”&”fý3Œ½8^r¼ôûúqêÇË›—7«[íVÿèñ"6t>+.‹ˆo‹osGðûðJî+¹ éaüa¸Ú]ís:ìëØ×ðù'ŸBܸ=0]<] 6¶Ú­þÖx‹/š_ÞÿC~ˆ;wÖqâŠH/y¼$óÍp‡±L(ÛV¶ àVÌ­Ó Æ$D’Y  b}(lµGú[ã->‹ßÊgåëH+J+Š×*^sBùÞÎx;(ÐÚùG8Bè¿è¿€Ò_Õ_%dŽ+Ÿò9©*|g6™M†Ûp"¤ô§8E‡#|©ÕOU?e ù”–rU®\§ íõ´×í=ü?z^ž}yÌ7´oÍQÞá³Ãì@#ÀOü„‰ÎÿûLLÀ$D(*ö£zF=ƒfþEB kßbT®¬\i ü蹨­YëWÐ ÆòoÿQÿÑ%­s7‚a^_­¯ÖWÛÙﯸ¿âþ ¸sáÎ…;`²f²f²ŒD#ÑHŒ’yžN:ßÃ0ô×ùŽùæg].Ù cGÆŽý.¯ËŒå^X𽈈·Üuî:0 TÞôß'M‚nômôav×vWwWÛù2æ2æ2æ §.§.§Öç­Ï[ŸÉÉÃQ´8-N‹³qíºÚÒÚRÌ’Åâ‰â +ªò”o_Ö¾, 7¬GÌë""CÕÐ:Ö:sW̽…o=ýÈÓ²ÖµÏÝçîsÃŒkÆ5ã‚UûWí_µ¼ Þ/øýƒþA[€QeTU6îñ÷ø{üöÁÙ¶­ôné]k³Í½ª·¥½¥¸Ö#S¾LùÒlãÇÛËn/3Bf<ªý¬ý ù9ùOæ? ë/Ö_¬‡!çsÈ ™U™U™U°izÓô¦iÈ>™}2û$ŒùÇüc~[ÐÔµ©kS× 4µ4µ4vümGýŽzx!wëìÖÙ¨‰üvkå­•ÀdJ[J›Ù&°r\d÷Ôî©ÝS"Í[š·4o lllÉöeû²}"§=§=§="………"­¾V_«O$ërV_VŸHzEúºôu"kÿ´öæÚ›’&2§Ïé"޾áÇp¤*‡ªùÎwÞwx!¼ç‘ ‡j–ÕHÀ`þ`þ`¾½žFO£ â â â 5¹5¹5îyïyïy¡üzùõòë0¾f|Íø{\÷Ñîº?€ºeµgjÏD±¯[¾hùX°ÎKUùžû=»J@ê¶£›ñ¥«\å* P¨([襗^ ˆ"Š¢L­Ä,1K@ÿZ?§ŸuV]QW0ù‡Þ¨7‚ù¢•Ïý™û3àn¤*—|Ìt»Æƒ±(¿æ×lS»´­‡yœä’ üÆ n€qÂ8aœã€qÀ8ªBU¨ à 9*I%©$àeСF‚‘À¼ª óÃ賣ϋ®Q×h0Ýò±ÿrþÊøÊø(gž3ÎçMíR»Ð–VÐröEXˆZ9˜!@"«j‚Ú«ö¢ñ»qÙ¸ ÌFø©L¨LøŸÎÿ‡»Òº»¬»2,°h ${‹ÆNB`ö™}8p€­ö¥#oñYüV>+Xσüºx`ßcæ ö?6BÏ“K–IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-11.png 644 233 144 2254 14774263775 14677 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜaIDATHÇÍ–MhTW†ß;ù™‚Ft‚‰­E(”€A%Ðâ@D¨(J4 §Õ,šf“8 ÔE®Z…ê"º¨?¤u!0›@P›Ú…ѨÑhÁ´6qÆ dæÞ{ž.fîmmWžÍð÷ûÞ÷=çÌùîH’jK¿‚H}¤>²¬G>æ«¶Umûà‡bÜÓÚyï+X~jù)€gWœu±‡{ùáz)àëyóªU0½½d%Jq´7¶7VÅŠñ×·¡z°z0gë®\>ù<_@z<=IdÄîå{õ_˜_}Ñ— âFÅ ëˆVF+%X»uíÖu_ž¬ƒÖí­ÛfÊfÊLœßjLȒų¡ØÃKù^½Ççñ{zž~Ñ`Õ–U[$رgÇžêwMïO¯0ˆM}Ô€SéTÛgì3,ò½9hPK-€™0aÜî·û8ÍijpJ|>¿§çéýèõ³ý¦vWí® @a œ1g Àív»)˜”9gÎaÌ”¹oî³d˜”é5½`›I3LóÊmwÛ)€3êŒú óõ|}… }ø-T§«ÓÙr˜r¦ŸðSp;Üø‰¹À@n>7Ÿ›‡Â³Â³Â³¥CøÃÂÃp×mtYø==O¿è§d¬ÿGè<ÚyÔ«v7ð›ýÈ~¬Ø|b6™M9ž9ž9ͽͽͽ0Ô=Ô=ÔèÎÌÌ@ó‰æÍ'`¨k¨k¨+ÀݘÛä6aÀÎÚÙž¯_ôS2v§.Î_œ÷}$yßµGYôwàeîeî%lNmNmN€‘ޑޑŽ@8Þo·øpÛpÛp[€;;Îç‚sÁã7É@¿èG°ìæ²›æ¤7¦7†¶ü•6ÃÀ&™ÓeºL8«ÕÎjˆGãÑxçç炲E³h ÄWÆWÆW•ؕؕXÈØ¯ÎŒ3`ÆÍxøð=ý¢ŸˆTÖZÖÊGRŵŠkòÆœj´A$Ýפ&%ÔI”ÊÒeé²´TÞSÞSÞ#Y1+fÅü:E­¨µ¤òÎòÎòNI %”pU©ZÕ’¤õZÒóõ‹~"’{ݽnMJv›Ýæ'®z¬Ç’lå•—¬«Ájøó‡ò‡ò‡${Úž¶§µdäSùT>%9ÏçÎópOš$=Ñ“ž¯_ô‘²‰lâîÏÒ­‘[#^ŸÉ2OÍSåµVuª“Ô¤&5ü-GZŽ´‘â ñ†øRc-‡[·–êcõ±úÐŽZïYuV$™i3­¼¯çë—üüí­|íÖ`€Åà*ü¯®Û[ù}̸ûÜ},ྮâ&ݤ›“1“YêÂÇÿ0/Ì‹°àîrw½u{CçJ¿Ô©Ýýî~ þŠsdÈòäß°?^Ú!7é&ÿSçËo%ã5Á8{½,‚¹mn`aA{¸d¥zï_¿•ïìëâ}Iz_°]wÚ`Eä›]IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.2.png 644 233 144 3245 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜZIDATHÇÍ–ûO”WÇŸo3©BUŒ ‘” [µ3 êzjÕWñBe·tè6D›j6µ©k!ëDEí*j©Û0ÅØmì4°´A[ukцWZ/„@zI‰ qu†yß÷|ö‡™×™Ýîàùåäû\¾Ï÷=ç¼Ï9""òll°¦YÓ¬IQlýcÜn[m[=ýïQ\¯ƒe½eýíÝ|,ùÀD÷D·ÑǦߌỎó'Ö3íò¬Ä ã<ã<–å1\/g¾œi›Å¯€½ÙÞüPƒ×[^ohjljä è»Öw À·Ü·âØô›ñf¾É—È/5ÿS_Æ´ŽiµüãÆŽ+Ï­znUƛрž p®u®èÕ;JY@Æ3^-‚1‡7›þX¼™oò™üf=³~T@ʲ”e"¼·Î¿Îooˆ&tžæhåÉÊ“ Ú"ÍüzêºèÓ†µaÂêºqÐ84(·r¨[êÒKô ù4pœø€ñêrŒÏUy¨ò)°ó4'× ¯¶7@ÊÊ”•ñ=͇V’ºÑ±Ñj)@ä*ðßÊ7l†ˆúƒZ¦–¡Ôo”S9Ÿ¬j²š¬&ÓÉ #ngŠ ª Jå)F ÀÀµ3ʯ~ÚÚ2Z™°•""³ŽòOûGö‚£¡'­' "à·ƒ/õ7ö7òHËÕ¶h[âõFjGjGjaÀ9àp‚–©ej™ ‚j¨¡&#¿‹¸".|¡_ÿ>Eþ凞ôžtà¢ý´ýtp´©ÇŠUDd{–¬(+)+™ =Ø3ã›ߨ¬Uç–ÎY:GÎ>Ÿ3;0; öÒ¥£JG‰ T T T‰ŠÅ‘¹ÓæN›;M¤X+ÖŠ5‘Ç+WˆÈÙ#{D‚›ƒ›ƒ›E6mHÛ&ò+ç¬ ³&ˆ}ŔŮÅ.9ûó_3¶glWY²²ü\ù¹ šºÓ£­ùw%|ø2ÖϾýì[U¾8iAË‚ÂÞ«Þ‹Þ‹0Û7Û7ÛUÖ*k•² ² ²  £­£­£ ¦Ÿ˜~bú h­n­n­Ž¯”ûˆûˆûÌL™:35n_ôæ‚äÉ„ß}·ñÕÆWU9\˜tahc£z„I-I-ÊÃú{®{®xb°!ðZà5È]š»$w L-œZ8µ:;:;:;À±Æ±Æ±’Ò“Ò“Ò!{köÖì­p¿ó~çýÎ8O_m_m_-ô†zC½!¸P}á ïÀóófDfDà_§¾þôëO‚Á 0~ýLø™°òˆ:šüaò‡Æ]¶Ûá–Öµ¥k Þ«um»Ûvƒ·Î[ç­ƒ<•§ò, - - AÑþ¢ýEûãeŽ2GÔÝ©»Sw‡_ŒöövÈve»²]p-¥¶¸Û«~?øâà‹ÀðDËD‹qw´ú‡^¦—YîŽÚ6æí1oË 7Öܸw㞤Tç¾õý[ß‹ùÓQÏQˆw—w—w—È¡…C ‡Dnî½¹÷æ^‘3Þ3Þ3^Ÿßç÷ùEl­¶V[«H“Þ¤7é"Ãׇ¯_9{ ÷@®Èá÷×®ùÁýãÊLÊL½”zIRfÝN>•|J„7ôúFË]á`ìŒÿø“?yòó—ïµU{ª=„snå´ç´CCfCfCÂ_W·£nGݘïŸïŸï‡ÆÆÆ PZPZPZîw­ýxûqUŸû?÷ƒþ’yÆ¢wÙWPQ^Qœ0(}›¾-Þ¦¸G/½À<æ1è§Ÿþ„½zÀý¼~Šñl²l²üßλ+)*)*I¸+©šV5íIßn\¸ZP è¯è¯uE]À‚âØô›ñf¾Égò›õÌúQ=Oóëâ©}=/ØÿÒ ÁÅ2“IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-142.png 644 233 144 3023 14774263775 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÈIDATHÇÍ–LTWÇÏÌØ2cjFK»ºÆ’†šµ&dYK” C¤4޵¦¦ f­¡íú‡%¦n1¦] ⓺ñ%MDÒBËd%®Š4!i\ë”!DWº¡…éÀlgÞûÙ?foºfÿ÷þóÞ¹çžï÷ûÎ=÷¼+ ""ÏdžÎçÏ;óÒ¶óOö¼»Ú]ýûsiû”Ž×¯ÿ³ ò?Íÿ`iûÒvóžm[~k}v¼ˆŸÍgÍË3bOätåt9*3v ¼ñò/» ÓöñðôxzæuØûÕÞ¯º?ëþŒ÷`bhb`¦r¦lÛò[ë­x /_Zþ‡_ž ?v܇œ§sžo•·ê…?§Œ¾µ5µ5ã®q—r€1ä’«*8q¬1e[þÌz+Þ³ð->‹?­G àÕ‚WE îͺ7=gÒ÷΢75Y|Zà]Þ%—½_ï0êz’ "*´ªãê8à0¿6¿0‡IÔƒzÔ õÔ“KSÆgŸ´ Ÿ²øÓzì­4EDÚ6C@² hPÔ?Ô?5"F-ãP˜Ì2 DˆU¯êU=öXÁ V€Z§*U% `MQå5œÆ‡@a øÉâ—ìb+ ‚gÒ3_#s#sÀ-ü ¾Qߘ%–$–€vWûVû6KÀmns’û“û“ûaöáìÃÙ‡¶[ój^Í S%S%S% 5'Ï&ϒȸý\ùxäcOÜ/²ôd„ºÎûöîÛkÁ™>õGͧù`æÄÌç3Ÿ£ÊÿV~¤üœo;ßv¾ÇơՇVZ [K·–n-µçý¥þR)äïȯͯ…ŠÖŠÎŠNÔO£“ÓÃY|÷Þ ¼°jïÔug:o¯ôÊæ}û2iGÙz~}û×·%åäôŠãÆ_n´ÜhqFQgTƥХХÈÑ;Gï½#R¸¬pYá2‘îâîâîb‘h0ŒEb]±ÞX¯ˆ1i\7®‹ãì¿:‚AIY|êïî ·…úJ¯@ÞÕ¼«ª‹¹‰'^îeŠè}s­¹ŒÆrc9¬+ZW´®BáP8Úi§6E6E6E`Wß®¾]}P×P×P×IoÒ›ôƒЃЃôè?ÐV­]U¶ª ®ýûêW¿°3kïïKÀÒ%K—˜ßÁôÓ?]éc¯”ùÈ|d®¿¼þòúËpmàÚÀµ8}ìô±ÓÇ@š¤Iš`Có†æ ÍàÞâÞâÞz/ô^è…–-;[v‚Ïåsù\0T0T0T`㪺L›™Ÿ™KSÄ ™!Çw‚^«×Šˆ&""ŽßIÊJ´ˆˆ1fŒc"±òXy¬\¤z¼z¼z\äÜè¹Ñs£"ÅmÅmÅm"+KV–¬,¹;vwìî˜Hóšæ5ÍkDvoß½}÷v‘ûí÷ÏÜ?#òý®ˆ7âq|™æãTj"5!bëADdøèŒuÆ€Aµ‡mú¬>KÒú²ƒ 6À­m·¶ÝÚöxñ_Ì¿˜1Z]­®VÜtÝtÝtA•TI•€±±1ø–ûò|yÐw,üRø% _í1k;6vl´ŠøûT²ïð¾Ãö)=®Û]ñ SLemAªQ5 _ѯèWÀ ›a3 œä$'AM«i5¥<Á 3Yx¿Á7}6ZOv›ðLÄ¡F´ 0­>f6š$Ì=æ ó¨YõHeÕÞS—êR]`ö˜=f¨y5¯æÁø«ñ‘ñß›.ÓFkj25IBýÖEË€¸'ê‰>ÖǬFÛ¶î€Ûîü` ƒÀ¼¹ÃÜ–éý ÞÓ#EŠ0Ïs€N‚ðsfýŒùšù?}FZèü9+S¿éüÿç_IãsÏ-ì>árí-0Þ2Þ" j@ àÀ¶mù¶,oáYøßcÿÊ'övñÄÞÇžÌì··9™Œ ¥IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-35-grey.png 644 233 144 6215 14774263775 16015 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü BIDATXÃ…—kPT×–ÇÿûœÓœ¦[AÀàQB£†‡"N h0 0‚å«0*7(>J ÍŒ^"Ñ< #%3H&>“ÐBu Dç¢1$/%¯Ë&ûQôûôÞón¼åT*ëË®}kýöÚÿ³ö:¤¤¤¤¤¤30i†É[.< XKÉù’ó%çÙ_ÊÆËÆËÆW-b~Ìù}¼C ’‚¤ ¸íö&{“½‰}„ZÔ¢–!‘ˆ0€ ØŽíØÎ>³Ål1› ¿ ¿ ¿þTKôDOô«)U:«tVÛƒòÜòÜò\¢“B¥P)”¤OrÐÛn®Ü`À]¢e´Œ–ÑÛ³Ãì0.-Ó”iÊ4—;tC×zϲزز8îß•UÊ*ešãÒâÒâÒHQ¼,^/–ú/õ_êxæžûžç=ï{üMùwÇóÄ÷ðxøw“˜óa>t3É#y$/´ŠåCùÐö:óEóEóÅ—ýZZZ]ï¦ ¤ ¤ pΨިި^’)‰Eb,xïá=(`ï༠Á†Åb±‡ ³·£·£·ƒ9oDÞˆ¼Ißýýßßøý·O*B¡ŠÐD¹+Ï•çÊK­bù,Ÿå?ÚL@@À%qô0=LÓ;ÌʬÌ2ŸÆOã§µ‡;Œ£Ãør·*C•¡Ê l¶¿w2cÄ,¦‰ib$ºn  `,,‘%²D€ê¨ŽêE£hb¦˜)fBò¼¿ãË_îø’ß«ŠUŪb¥‡ÅaqX^îæ•¼’W¶‡{x<|äøíã·ß$_ÉWò=÷“y­y­ymîU…ªBU!eæ¯É_“¿Fhf+Ø ¶&ÂBX|¸ËÜeî2€zÔ£`„F’CrH†ç6™  mhÀƒR‚øÔݬ»YwSÊ,,,š•j¥Z©>ÿ³`Œ‚ñ¯qœ4!MHéKŽFGcî’€uëÖ±ðõë×7 ˜Ü[ëC¬ÄJ¬€]aWØ€$—ä’üŸÝæÎ$ìr»Ü.ÔAp$9’I€ý”ý”ý|<þ×w­ïZß%\ HHHgáŸÀ"Y$‹<ºÖ©t*J`åû+ß_ù>Òf\Ÿq}Æux¹) ‘†HC$P¿³~gýN@×£ëÑõ^«¼Vy­Ò¯§_O¿,}ké[KßGGG€ ¹r/ä|ŸÁgÒ§Ò§Ò§€¨Õ¢Ø·xßâ}‹áã×í×í× Kò¾ä}ÉûÖÜÜ ÈBd!²£k9)\ —Âÿ¥Àï©ßS¿§ø(:.:.:ŽTã.àÂ(Ž6m8 ˜¶š¶š¶»·îÞº{+{(öPì!@­R«Ô* ± »Ãî°;€éǦ›~ Ø6¼mxÛ0—ž—ž—l Þ¼1P¦)Ó”iSáÓÓÓIª=<>444Ò.%^J¼”ÈÇqÇI$w…»Â]™Z™ˆ;¸ƒ;ŽáŽÙ¶l[¶ ˆ4F#@­£ÖQëê¼ë¼ë¼ˆÊˆÊˆJ@á«ðUø:¦c:è.ë.ë.}ò>yŸPªÕ@UYUYU`ûÄö‰í€Œ’Q2ú<>·…ÛÂmð9>Çç$Ràƒø >ˆ}mZfZfZF¢¥ÍÒfi3æ -B‹Ð†Ô ÄãÓpNÄÿÿcüÀLÓLÓLÐ{¨÷Pï!àÉð“á'Ã@–)Ë”e¬cÖ1ë0oú¼éó¦zµ^­W'Nž8yâ$Ðçêsõ¹€%X‚%˜ª¼ùgóÏæŸñËä2¹Lö5'?!?!?!U>œõpÖÃYìëžØžØžX¯à¼«=ÉždO¾*ÿªü«r`äîÈÝ‘»Àâó‹Ï/>d¨3ÔjÀ6f³ƒ³gÎŒYÆ,càààð¼(ÂaŠ0À+É+É+ ° VÁ*LݶjkkÚQí¨vŸÈÊÊJ•Öc=Ö—Ö %B‰PBŠÚ^k{­í5W˜Þ©wêPˆÅâF˜ž6=mzÚ4i:ÓtÐêµz­¸µúÖê[«®›ë溈%K"–×b®Å\‹êæÖÍ­› ×××·:nuÜê¼*¼*¼*€P)T •`÷¬ã»Âï ¿+¤ DK´D‹ÿ".â"®:/~“y“y“ùv»­ÌVf+‹ØnÚoÚoÚûãtœŽS׸è¸è¸hnM8 gá ö¾¹}sûæBèÈèÈèÈô¯ë_׿dggó÷Ïß??0öüÙógÃ/ ¿4üpóÞÍ{7ï–lK¶%X½`õ‚Õ ÀŠÊÊ!4D4D4DPKÿŠþý+¸ÝòyŠ<å9ÎNg§³sc:9òË‘_Žü èœ}Z6.—ßöžhhh}9?õ‡ÔR`)écécécä¦Ëî²»ì`Òi‹´Df‘Yd€kæš¹f©HE*€Ïð>p §p °/²/²/ø#üþ ƒ`€å~üýøûñØxqèâÐÅ!|ç=ä=ä=d{ƒñŒg|ÜF,À,èÛ)pµ\-WËw¡­h§ 4&äU´)ÚmíèØÛ±·c/{%Ä?Ä?ÄŸÔG=‹zõ Ù\—Æ¥AA2I&ÉØ]v—ÝH;i'í8pàÈ ƒ ³Ä,1 €`2u™ºL]ði¾Ø|±ù¢&ó—ùËüL¶Å™ÈDfßNVÉ*Y¥ânó\ñ“}£p”T‘*Rus·’[É­|·i² âÎh¶i¶i¶I» ‡ ‡ ‡¡ »Én²&ÖͺY7@I"I@AAÿitg–©˜Š©¦´èsí굫׮ºèÏêÏêÏ §Å9âqN}¹ê„ê„êÄÉv”¢¥ä0„! I©ž~T‰ÇxŒÇÒ¢…¤i‘z‘z‘ºr¼@^ /¨/×ÏÔÏÔÏ ßÎùvηs\<1ŠQŒÂŽ^ô¢€ö)¬€°0òù€|ñ{í÷Úïµ,¥óFçÎ|¥2P¨ ±9.9.9.üðAéƒÒ¥Ó2-ÓÂ×íæœÔâ¯Ðitßž±ž±ž1ÀQè(tüPé§ôSú=º2 Ð høÊ– -Z6°²‡ì!{ Ò ô½oxÃ`FfdF€HD"¬O´O´O´¨oii¯R§Ô)u]F—Ñe?ä*¸ ®bÄæ–âi÷2Ó=ÀT!wÿ’ˆî©;'|å¤v]HI )k&9Ú¯:w9w9wѽoÓ·éÛ”[UUUlÚOûi?Ün·v©H*’Š ž8q6Â¥Ò½ª{U÷*?(‘ÇÈc*'?šw Õ´šV §Ý;»Ï³cåååååå0y2 ÷…) ¹µ{À­ÝÓní6Ni7ùÈçÎhœ§Æ)í2Ôj 5PpÇqŒžL´YÛ¬mVj©©©æåÅòbyñƒfû¨}Ô>Z|rðÍÁ7ßÜ€ažzêœ:ñ‚½ð€ÂíàŽ[»WÿŸvƒôAú ÁðMÉ7%ß”¸@TðíõïõïõÇW]]]d³¢_ѯèh £a{o ›„MÂ&ëkáñáñáñÜ3w¼õœP/rñøKNNNNN†äžö2/æÅ¼ÈnÝBÝBÝBü·k®k®kî=I ÃÅðug~Ký-õ·Tµ¡ÏÐgècÿÙs®ç\Ï9WÒ„sÂ9áä eËeËeËÿ-„Õ°Vs¹"Dˆü0žážÑ`ϸ%½ÈCð'öÚ-C ZÐâ*eM¬‰5%q \×p+Ü–e˲eÑ…²jYµ¬šëãóù|>ÿÆß#""V%k‡´CÚ!rÒ@ÈêÜ~5n@Ëqpø{A»îrá*ÅìÁá'’KrIîÿF°ÖÂZþöŽ÷<ïyÞó¸>þ1ÿ˜<:~L?¦ïëÏéÏéÏ&îöçi,­Æñ¯1>Œü ¼ÎIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-24-grey.png 644 233 144 6261 14774263775 16014 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü fIDATXÃ…—kPTW¶Çÿûôé' Ï‚ä%‚×Då­‰ÉT$ F‰¶j&:)ñqa b‚ H Mj`î5†#hº¸„gD–SD¤Á AÒ BCC?OŸ}?ЩT¥²¿ìÚ§ÏYë·×þ÷Zk“ìììììlØce¨W&fû}È>¤ Ù_e•ý})÷qîãÜÇ;¨u çþ“så\9×àÃ…AaPÐ|”£å$ ~ðƒ€Œ`ÀaÆaš/Þ#Þ#ÞC²ØŸÙŸÙŸ{ÊÉ<™'ó'Êr\r\r\ZîçíÏÛŸ·Ÿ¨8OΓó$»W8øN —=³ ¸[±•©äsù\>—ï4.—ËÎ!¹u¹u¹u•F•QeT5ÿ[»Y»Y»9øo6%6%6%¨Ž Ž Ž#Y[„[„[„@ˆcˆcˆ#`][·¾oýÞjoվşտ•ÇÊÇZ"¸ÚR[j˧Cä9äY"ðx <¿¯Xþzùëå¯×9:5;5;5›ÅÄÄ0¦ÀÀÀòº8Kœ%΂'q'!ƒZh¤"©Ö` Ö@kp3¸Üðú@Ç@Ç@5µúµúµúñÇžîzºëé®wψúQ?ê÷÷·LQ¦(SÝÝ݇8û/í¿´ÿ"‹![Mª&U“ \н{)ÈŸÉŸÉŸ>ÿ8üãp Ý¹Ý¹ÝÀ>ìÃ>€ÖÒZZ iH4šFM#PœTœTœô¿ÔÿRÿK«Û±µo³o³oƒ(º7º7ºqV+ÃysÞœ÷Ófff‘´-h[Ð6RŠ8« hjjfZgZgZy¸<\D;F;F;ллл€2X¬ HI Ïû]úwéߥ“êIõ¤@‚ô‹ÈŸÂ)œ‚((*(*(Š”Zy¬|¬aÎ0g˜Ã¥€Ý»v#Kz[z[zZÊP†2‘sä9,--aÃ6†mÜywÞœ»»»–¤–¤–$@uDuDuð†7¼ÜùèÎGw>F^yyäeÀIâ$q’æ½æ½æ½Ï8ÍëÍëÍëÁJåR¹T­Ç6mÛÕ;×;×;‡s Îâ,Î?¦š©fªW¿à ^ðzfè½ä÷’ßK¢ë¢ë¢ë€•4´¿Øþbû‹€0V+Œü¥þR)088´v¶v¶vo*ÞT¼©D·D·D·ÚM»i÷/"Út<óÏìcö1û¬'~ŒÀUà*p¥ÿZ ] ] Åwœ;·€ÔRJ§èÄ?‰ÿL¬™X3±(ºXt±è"Ðu¼ëx×q Q—¨KÔ/xáÀ €êÕ«7þþþ€_‚_‚_`l26›“‹ÉÅäòŒ“\"—È%PËR°Ü»Ü»Ü‹1Æ‹ñb¼è¿XI¤@RÀ¹Œ¹Œ¹°—î•Ý+»WF²‚‹‚‹‚‹ [I¸ ÄÄÄ•šJM¥ˆ©Œ©Œ©b¾‰ù&怱"Vhœ5Îg@¢ Q…³úYý¬¹1rcäÀH #š67mnÚ èÛõíúv`Wä®È]‘Ð)«•ÕÊjÈ”””ðɘdL2Æ3HD"sÊÙl6›Í&YÍãÍãÍãf¯ù¦ù¦ù&Ȭ飭²­²­p‹t‹t‹<×y®ó\Œž=5z è“öIû¤€qÎ8gœÒ=Ò=Ò=€ $ï´¼ÓòN Àmç¶sÛðúðúðz`‡l‡l‡ ®œ+çÊ!«w¯w¯wç·%Q%þIÌÄLÌ"Aòròròrç÷ú\}®>×çðÂøÂøÂøü×Ó°§aOÃÌ™dâ»â»â»âaÐ@ Àö”õ”õ”ƒ%ƒ%ƒ%@OQOQOà¦uÓºißk¾×|¯v~v~v~€í1Ûc¶Ç€»¯Ý}íîk@PEPEP¨G†G†GØÚõµëk×óÚan˜æ˜?KÂ$a’°÷šºMݦî¤ÝäÌä™É3“ºÑî—/  wJ—Î/_:¿N÷0îaÜCó*÷*÷*Gnj&5“šIP¡N¨ê@VKåûxïÂ#ŸÝ̤R)Ç`À€a.*f3Š.]í¡öP{@FäDNäX¤™4“fHA R´¡ m¿H;½èE/€iLck%ª÷¯÷¯÷7gÎçÍçÍç±ÄžbO±çÕ<ß|ß|ßüóß#9È!UÅ(F¹Xk?jƒ L`‚»ƒ8ˆƒDPPPU/ù@ò䃫yêFu£º‘U×dÕdÕd™3­-=€ÁRY€0„!ìÍH( ¥¡ x‚'xñmåmåm%éw‹»Å‚b™ÌF6¥7V«ŒU~r?ç~Îý€*©’*ag1sÙ ªµÌÕüsüsüs°ëŸîŸîŸŒGGG?üÄÆÁÆÁÆáaõHÝHÝH ¸á톷Þ¦1$ƒd ˆù+üþ (¤B к@ÂŽpÐÍ(g”3J\mÞÔ¼©yìlT6*À‡ò¡|臟¬HoJo‘âË6w[ ±îÜr%[––#£Íh6g’­d+Ù¿råøþ†)Ý”nJçÿò.ÿ.ÿ.Ïì, , ,Ä~˜æ‡!cüÆ.‹Ëâ² þÜçsŸÏ}̾ª0U˜*Lð@²I²I²©8|åOsì_Ê—ò¥ìËÉþÕzbyyyyyyX´F–«²h7Ó¢Ý ¤„”’›ß2ÑL4}L9ä3ëLu¦:—®.S—©Ë c†a,X#Ñ¢kѵèxíTéTéT©àä´ä´äôýzÃ#Ã#ãÓç¼òà•¯@kÑ–Y­|« ¿¶¾ ³èÂQÅQr#àzÀõ€ëÅñ’4Iš$íjÞ¼ë¼ë¼+«¾–}-ûZ¶9¾ð…/ìñ??tüÐñI‘ ˆeÃïÅ{ñ^éd“Ùd6Y·Í{‹÷ï-ÌœÅߟ,³î×\üÆˆŠŠŠŠŠgYPQù³jƒjƒjþÛ¼Ö¼Ö¼ößœØ[ì-öN¸ø$öIì“XÇëê!õzˆõ_î¿ÜÙ¼}É´dZ2 Ž wwww£e´Œ–}S¿r•Œcs˜ã×XOÀ(î×<¿3~C»¹h@Ì9TAT5ÊÔ2µLm›·þ ýú7ø ÂRa©°”Èr¼µÝ§Ö§Ö§vg”rT9ª%¼3ïÌ;Ó ‹Ý:  ö·8üÎø•v-霃 d ƒí!ûÉ~²ÿ–m  ´áDªÔCê!õ`†‚ ÁÄ#þŽ?—>=¼wxïð^`Þ{ÖÆR÷{ÿrß3üç^IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-28.0.png 644 233 144 3244 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜYIDATHÇÍ–ÿOÔ÷Ç_¾ÎX•Ý–TÅxÁo'ªNj­B[#LųXJWbꈺ™%hÒf.ñÒ»âNG©CNª­&,‡%­”Fi­¸53É1w¶›ˆèUàEîîóå±î>ÜmÝàû—O^ßž¯ççýåù~ ˆˆÈÓѯ@ÂŒ„ é;akÌŸº&uý“ˆ]¯²QÙøÏ½0ùðäÃSÜSÜúõ˜mÆÍüøz‘~|?Ó/OK̑ҜҬDm”f—f§þ(b×v¥ÅÒòH…m­ÛZùù"|°!°!`iŒ\?Á‘ê¦ê&0΄[øõÔcM4©Õ‡¿éµz-Ðh¸ 7€qÕ¸ ŒkeZAP‡Õa #Ájü5Šw¶úóêÏM‚×Oðg’3ÉÒhò‘ÿ^Û/3·ä…’ÀX¾Œ1F«~P?HXÖ¿Ñ¿Á0~aT•3…1͘fLæEVÌϯx‘1ôí’v‰0ÐO?èÁ(þ®’wKÞ5 x9n)EDæý‘s–,&/Ë—áWøù÷ î¾w÷=ÆÂyá­á­±~¡}¡}¡}à/öû‹AÍV³Õì8BµÔR—?=T*„Á™þ·ýo3f8"øàÝíÝ X.[.&Œðc™ˆHý—°ãýïÃÇzÎºÓ…Ç Czyú[éoaüº`[Á6ð¹}nŸ6Z6Z6ZÀvÏvÏvœóœóœó`,8 òƒ±e`Kß–>°œ´´XZ0Ê¿z=ùõd3ªçp¾*³*x>ÂGÔgDDþ^ çÒÎ¥AÓïÛÖµ­3*çfØÛííL´(*****‚ü¾ü¾ü>È;“w&ï \q_q_qƒ½Î^g¯ƒö™í3ÛgÆn=ÝzºóóóÁ¿ÌŸíφ,×lûl;Á3¹¹ˆQ í í  %Eø$$%¤}›ömî2‘\g®S¤ðÒ e…¢4vvŸÚ|´ù¨Èp`80±ÖYë¬u"§žZxj¡H®äJ®ˆÜλw;OÄ5ß5×5WÄÑßäo)øwÁÞ‚½’!‚"Ê#NrRéí·æk{³íMhïíþ¸ûc£rÍk/_ ,ê)ê.ê†E¥‹J•B§§ÓÓéc›m>¶W,®X\Mþ&“†j†j†j ¸«¸«¸ ö€=`Ï,Ï,Ï,XÞ¿Ü»Ü g´j=dîa£’gNZOZDøDå¢þK¨*¬*Œ;%hŸjŸƒ bLìf<À np#îØ0Âp‚œˆó¯b«€ã¸qÇd?«7ÔÀ³_Õ‡U¢§OTǰx-ÞÑ$ã+ï³ÞgAÛÑíZh$4˜övE»Æ£Æ¨íŽvG»ÚNm§¶ô%ú} °žõ¬}ª>UŸ ¸©§ôçõúÐ~r…\ŒéŸDuL÷:¼‹ÏâMâQTÇ~ ü¡MÊ&Œ*s@;§†ôõúz„¢ **ä1ãfÈ@GF¸Ïýh& Wê•„ i_h_˜Éá‹°)uSêÿUþè]‰³ÌYwW²{úîé-@ 5XAUG´7´7‚Ñet  @Ì6ãf¾Yoâ™øf?³ÿÄ]ùľ.žØ÷Ø“ù‚ýÏþ¾ö‚ücIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-94.png 644 233 144 2454 14774263775 14714 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜáIDATHÇÍ–_HTYÇw\SK+¥yû âB˜»$,.JJ±†«2 ø ÛXVWZ…zX}YJÌB‰}’ŒñÅ¥Âíϓæè®Rd ²R©i3νç|öaæÎÝ Ù·Î˽¿ßï÷œ{ÎïÙ} ¸v»v»¶Fl×wŽ?ùhòQOÄî²À8iœœø ¶]Þv ½7½WM9¶·óãëEüx>Û/ÛÅq$ & …Q»*s*s’Ý»} R†R†VM8uûÔm€[7nÝà{< <x]øºÛŽÛùv½/­ÿáD_¢ÏxI›’6‰ÀÞâ½Åû~ˆ$üµJKJKææ´ ¬¿TRu!°Â öXŒ³íx4ß®·ñl|›ÏæèØQ°£@ʼeÞ”žHÁT4ìjؘá! ‹.R¹l^2/þÃÜoî'Ä-]§ëØÂ=¥§€ŸÍ€ Db8ÐM7©^?ÆgóGôÈ¿¿mG”'—'ïÂÁzg½Ò­z«ž°ÎЇô!´½DÚ¥ m^¼xP(еºZWÇVRc©jUM¬ÖÛ~ã‹ñK¼ Ï”@J`å3˜±f¬à7ü¦vª¬ÙŽõ¹õ©õ)X]]õD=QOpÆ4ÓLC¨.Tªƒ¥¬¥=K{ââ”GyXCEñc|6DOTX×ïp¦ùL³]­¾Ðáð«ð+gÆËþåÇËᘓc›}›}›}àíôvz;Á\6—Íe‡¿i i iŠ—‹—‹ãüªMõ¨4š~Óïð9ü=QaþzXXŠé¨± C/B/ÙžÎ{÷:ïA~U~U~•C”“˜“˜“¾ߌoüÙþl¶³AJÊJÊJÊâ„ýª®ª«À¸UgÕÙøºÆáèq‰l½¿õþ—_‰)8ý¾bôÈpÂT”$ٞ̾̾Ì>‘…Õ…Õ…U‘þ¶þ¶þ6‘@K %Ð"219191)Ò¡:T‡©¯¯1æŒ9cNbƒ<sXDöºŠ\E6¾ÑãðGõ@zZzšš„Å—‹/ãŽ}©Î×ùÎLƒÁÆ`#´ô¶ô¶ôB¥§ÒSéO®'ד žxzà)¸ Ý…îBÈËÌËÌË„ä`r09ÃåÃåÃåq+×lµÎÆ·›?¢Ç%¢î¨;ƤˆyÂ<›Øýµvk·3ÓñÒñÒñRŸßç÷ùEŠšŠšŠšD’ГГŠEZÏ·žo=/r}öúìõY‘¬Æ¬Æ¬Fw™»Ì]&’‘‘áàacÒ˜tøþ¨ží1ƬZ«– z]¯;3mll„ƒõëÖÃHÅHÅHïÑþÑþÑ~¸v!íBZÜJõ©nÕ „¬kֵﱞJ”ùÆ|ׇr—»ÀsžóùCùCùC¿›Ç4LÃ4ûÿ(ø ¾‚¯a³­ÎVg«c¡•¨$9D t¡ ]6c36³‰ŠDE"Éáòù‡ÿª$£d”Œþ­b÷ŒÝ3vÏhúwAzAzA:üÁŸÄOpˆ?»¸¼è$`$"I¿óÅ|1_üÙþÌþÌþlzX~}~}~ý7}öAû }°ñ’5Ôj 5ìt;ävÈíÎâ q†8’. —…Ë€0ï0ï0o@KÏ¥÷¥ù’¿Iÿ®xR|‰Gâã]\Ê<˜ó7MdÙäˆóçü9ÿŸŽ<«zVõ¬êï©S§6:wÄuÅuÅuQǂΠ:ÉJEŽ"G‘+ÞÇûxjXa…ÀFlÄF313aµùÙül~XÙÙÚÙÚÙÊÍÍÍâŽ'¯=yíÉkë‹Ôþjµÿ¥s“s“sSì!–Á2XFﺔäŽçŽçŽhE+ZýÜù:¾Ž¯ký»Ýawدü^¤ Ò ‘ÉÉÉü7šxM¼&:¨¡†‚X#Öˆ5à'æHB’²–¬%k aC±+±B€"x³»ÙÝìŽ;'KO–ž,6Üi¹Ór§…¿(WÉUrÕݳB¢($¾º¯âU¼ÚÿÿTuYuYuùÈ|d>ÿûëYëYëÙW~¯[£[£[#¬ÌÈÎÈÎÈæ/j…FihBšWæxOãi<@óhÍh8 §áñ"^Ä @ jPH€¬šU³jÀs«çVÏ­˜–‘ž‘ž‘Î_Ô%êu‰ÂJ)¾Ä#ñQaLÆâÃìµöZ{mú¢©oL}cêLŸbJ1¥˜xI#–ñÏÆ?ÿ Ž·o;Þì»Ånì»ÁnÆ#Æ#Æ#G¹£ÜQà ®à À&0°Í¶Í¶ÍœÎg@n’›ä&<$ÿ)Õ)Õ)Õü7S“§&OMfz‰GâãY d{’n7‡ããã†8¯E^‹¼An˶eÛ²¡.)))))Ìz³Þ¬8 §á4_ÉWò•€Ø+öнÀ²Ôe©ËR¨‡Q£_LÿbúÓÜÜ\@Þ/ï—÷+ÓW¦¯L 0ÀxxUyUyUÁº þ<øóàÏI™k¥rÅ\Å\Å\`UݪºUu@jmjmj-°Þ²Þ²Þ,=°ôÀÒ€Mn“ÛäÀÂò…å Ëüa0'™“ÌI@fZfZf°8kqÖâ,àT©„S €åË– ™|A΂œ9¤Lâ‘øxÛˆmÄ6‚ÏçÅÏ‹ŸU›ªMÕ+ËbY, jr$}¾Gßà(Žâ(€X@›®Mצ–/ ^ LKœ–8-™52kdà*>øÉýä~rÀ¶Ñ¶Ñ¶¸ðé…O/| XÍV³Õ xÀ¯^¥^¥^«6J¥BÎÕ‘«#WG°ŸâC|ˆI =NÓã“+Sà4Nã4%”PN‡ÓátøãcàÒ’KK.-îÜ/¸_ĉ;wdr>bCcCcC;–;–;`¿ï~ßý¾@ù›åo–¿ vvv>¥>¥>¥€Ø'ö‰}/âÓ4šFÓ”£å$r¾œ/çËNX",–ôï ï ï‚# ¤4€a5Vc5À…qa\À~d?²sÝçºÏuѳ£gGÏÔµêZuí Ð+{¯ì½²ð‹õ‹õ‹â¶ÆmÛ D…D…D…w#îF܆҇҇Òª¥ZªsMçž]}võÙUôPÕQ;A•””„âž=3zf°7*nTܨ0ó1Ï/9_r¾ô Ç£Ç£Çp4;šÍ€a¯a¯aï‹çã;ÇwŽïÚ“Û“Û“È»‘w#ïá¹á¹á¹@¼1Þo¬íÖvk;Ð}¾û|÷ùÉéÏMI¦$S`0 ˜pPÙ£ìQöÅ)HAÊîJ>ÏãóHN“w“w“·Sg1‡˜C æÊ¸2® ÉÓµâkÅ׊iÓ:¦ušBM¡¦`ͬ™5ÊBe¡²( ( (Z´-Ú-`ÔuFв¯e_Ë>€­akØ`VǬŽY°¹Ü«¿ßöý¶ï·‰‘ÄDLÄ„ÿ#Nâ$Î#rêsÎçœÏ¹}»äËåËåË«úŸ„= {ÆÝ9¹ì䲓˜Û]¤ýÎ6¬V«—S_N}9õE&Y+ke­/ÆÉ}É}É}€÷yïóÞç£EG‹Ží[Û·¶o$H8¦õÒzi½ ¨ ¯ ¯ ­„Â^”"ÿDþIÇZGŸ£ÏÑ·ÃArïåÞ˽ íhù°lH6$úY5vlìØØ±W2bccÙŠøñ;ãw’scicici`*‡Ê¡r€pǹãÜqÃÆ0€ `À=ÜÃ= H@`ßcßcßÐô=ð7ù›üMXo,¼±ðÆB¬®ºWu¯ê¾WUF•qü5Æ1Žq†ÕB‚ný‰ÒJZI+¹Ë´Ò¿ŠFÑ(7ÙÕ×Ô×Ô×€ÖÑÖÑÖQ6¿s]çºÎu¨žR5¥jJžÓhM£'FÀîp‚„ÈD&2vŸÝg÷y‡¼CÞ1 h±œ¶œ¶œ†úLå™Ê3•‚NÖ+ë•õíß.‘,&‹Éâ[B1ŠQÌû¹ÚÜmîðõË'¯oÏ×óó~¿_¯÷[€Bˆ§Â_1É1É1O„ô˜_FìñÛâ·¥|Ò;40½izóï¿'ÛžlH<™xR¿Ñ ¿/D?ºžaO‰ˆa]ߺ>“+¬×Ã[YoeÅÿ(¤ÿáX¬Ë*¼;øî @O¿‚Ù¯g¿ð»ü.ˆè†ßˆ7ò ¼h|Qÿ?õ…Ë9Ë9ÓmX·.Np¼æxmã{¡€©PòzÉëwcïÆÊÐæ6é–XÂ…(Ýð‡ã|ÏÀ7êõC|ØóìyBpâÅ7­Ý¡„ŸÐYÛSÛò"€2@ ýôccXmU[A^W³ÕlrI?«Ÿ9©Oê“ÀA¹EnÐöiû€:¯Î]tÒ‰M^ 㫽X{Ñ xãþ\j.5[» >â¿÷öƒ|Òݹî\Ï(『òwz¥^‰"¯ËA9ˆ\[£e~à"¢$¥¿G!…H}VûFû˜aô@Ÿ»ÁÝ`ü ?j+…"£…«×ê]2ÃTêT*(;(œ»ýý+߿Šú7US5PÞVÜŠækækæk`¡m¡m¡ ü3þÿ ¬6®6®6ò“‚Á¸ÿ“¹º¹:V¤3„¾¾À¬õ[ë·Kf!>B¾(„—aoÓÞ&xðo}sÑ_ z zÁö¼­ÈV„,Ú\”Y” ½•½•½•`¯±×Øk Ý•îJwÅkñZ¼Ðîi÷´{"„d…¬°{v÷ôîi°ž²Xž¯Ê-å#JßÌ—ÕŽjðrˆPŸBˆkµ0’0’=¿**’Uéö”á”aFjÎåœË9—áˆzD=¢F uŒuŒu€#Å‘âH;Íwšï4Güg’Î$Ig¦3Ó™ s/ÎeÍeAjýÆ”)Î>?Î8² †»†»@3‡ø’n&Ü”}0ÿÎü;po«¿Ø_ w§¦½Ó^¸päBã…FHKLKLK„±£cGÇŽF {r=¹ž\8Þp¼áxÃÃ[ØÞÒÞÒÞ®rW¹«Q|¢®¤^I½’ ŽQǨcgN;œ©¿~fË3[`ò¯·®ßºàÎÿèÒ6f“}BÛoœ±¡Ê¡JþÇħŸÊªm¿ØØ P˜P[ YYY0ž?ž?žÇìÇìÇì0h´Z#ÄæNÏž; %þ‰÷,îYÜýëû×÷¯‡œ™_ŽÎ>ll5ΰ¬âéS¶S6à;ãŒateuAuAT— ×ΰÈbÔÜÒCsmM®r•«À,³Ì yä‘ôr’“‘fåOê¤: «oÉ,¿ò½à{´ß‡æŒ6\.³¢½¯}®}R“+rô{ú=ýH·tKw‘N:éMjR“@/]tþ²¾Wß ÚÏ‚õÁzVôÏÂsL÷9}Në”ujÉÌrxŽ=4ùƒÛMÛMÀýðd^ÔF´àŸz±^Œ‚þãeüø«¬FÓÑЀ±À„WO‚^¥W¡ԾоX»&Æa{üöøÿ;ùÃw%¥;KwFÝ•H:´04Òˆ Ô%u @«Ð*€¼$/`ÂÝðñF¾gàõŒúkwå#ûºxdßcæ ö?oúDUUŠ/IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-13.0.png 644 233 144 3116 14774263776 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýO”WÇϼÁŒ™•B¨FÖ‹1ÅNL€ˆ«.³Ð-ö…Ø`+¨µ ZIÚ`h4&MlÓ1%]c©YHµ®-›bj¡µ´¶6FJ[ÚȾ°ñæ‡5@'å%3ËÈ”á™ç¹ŸýaæafÛý¼¿<9çÜû=ßçÜ{¾÷ ˆˆÈ=‰¯€õ>ë}ÖÅqÛº'éw>æ|lå‡qû„–§-Oÿëd´f´d¶e¶7’¶7ç§®Iâ§æ3ýr$éçÓÏ[¼ ÛÏ®yvóÞ¸}ô*¸º\]³1x¡û…n€Î3gx ß¾zƒ^HÚfÜœo®7ñRñÅ÷«ü"à¸è¸hù7¤§¥§‰@æ5Ä'øó ê‰ª'Ælc6e}pãV^ LsL¥Øf<1ß\oâ™øf>3œ@vYv™l©ÙRãzMDäÆp`ùå@ €ÖÅi|øpƒn×íÀŸc?Ç~&ª~4ŽG6uZPCj˜Ókô¢ Æ‚À)Nr·ú!wqÿWû¿2 Þø€·Ø·Ø]ï›|ä÷ö­ ¨¾S}T€Ö¯†h¤@ªQ4ljVÍ¢ÔŸÔSê©…J¡–¨%j ð6²1é§žrÊQF@ÿNÿ gŒhŸ}ÕoT¿a|«"e+EDòÿ®°+¶óÃðÛÃo/À>>º“u'‹ˆÖ¦µimÉ|Ú6m›¶ &Ë'Ë'Ë!ÖkŠ5¥:Æ1Ž%Íùåó•ó•0}ÿÄ+¯Qž8>Œ9\®°hœðO‘}PÿZýk 0 ‚Í“¯O¾¥/—6—6£.=p)çR(¥”R°¡rCå†JÈlÍlÍl…ê–ê–꘯˜¯˜¯à7cw`÷èîQpµ»º\]¨ßÔ:jfÔ(àJ}n}.ðHœ¨[""ƒûá#ÿG~˜ý;€ª+y¹8«8+Î_W ®\Š.](‚uSë¦ÖMA0Œ#³4giÎR¸Òq¥ãJG’P·£ÛÑíÏjÏjÏj˜xxbÍÄXåË[™·’è§…ýô£êà³SŸÝç#„²øuž›EE ^JôÑ2í¶vŠÅöb;tíéÚÓµ'™0t8t8t65ljØÔY¡¬PVÍæ@sr^kakak!xk½µÞÚ¤ÿ'½Ï{Ÿ‡c-ï¼÷Î{Ú3Ú3Ó]^tY·Êïl;l;ðÈuÇ›Ž7E¤EDD¦mG®#WÄö€-Ï–'âŒ8#ΈÈxÇxÇx‡È1d "=þ_dÙÞe{—íé­í­í­•…a±ÎXgDbž˜'æIúµl­T+qÖ8/;/Ë´ˆcÔ1*bYlÛiÛ‰Ç*=FåºhÚfm³ˆå~É6æŸÛ<·Y$­1­1­QäZÙµ²ke"Ûû¶÷mïéËëËëË™ižiži±»ín»[ä\ƹŒs"ÃÃÃ"c%c%c%"¾Õ¾}ŠLôOœ™8#â½í=ä=$Ù"¡h(*b™¥vËõDWîçûö/Ú¿žŒŸ±DÅ£3¦L‡Û€mÀ–Ü ß´oÚ7 kkkpÖÖÖÁü`~0ªŽW¯:¡üP~(:Wt®è\ëÇ׬Ogº[º[ˆ&ĦŽß·»ÛÝÀ?Ì3ÆBW¾ZÿjJ— Ç’Š®€(Q —^z…B¥´ÝMnr8Âޤø7&tí,m´¥àý5v+v xÈÌWÿný»ÀL¢+tL¹~rý¶c kÃZRnjڗڗDH§ˆ"ào 0ú>}Ÿ¾tŸîÓ}`…F!°‹]ì#ÃÈ02€6NpŒGŒA_7ï›÷1>Lè˜1âñ¸ü.ØÎ¬©c¿Qþ­é[Ód´ŸYýsýs@3ž3žC[øc•¨à¿ðKJ…::ð¦˜JÔuFóú×ú×)ølunuþ_åÿÕ]iÞ]æ]èšhÂÜb}‡¾ƒ(¨«ê*,´ÍøÂ‘H¬7ñL|3Ÿ™ᮼk_wí{ìî|Áþàï´¸rbIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-14-red.png 644 233 144 4104 14774263775 15611 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜùIDATXí—LTWÇÏûAA„—hEÖX]×UU—V„씊mGm…b4lÍ*âØ´±a7J!le#­X(ÙµÙ"ÎhLè–d­[v#’v#¥u#iŒÎLtl¬#ƒ óî{ßýƒwß›™TÍf÷ü3sî½çœÏ½÷{ï!š±9câúDw¢;Ñ-Lè )Ït?ÓýL÷¦µ2“™Ì®þ‘²)›²™n­‰d’Iæ>ëkM|<çùxþØzâúXžh¾ª¡ÑÛ?ÿgr·Ü-w»F„ýÂ~a¿bIKKÃ_·ÜØrcË `ë­w¶ÞùŽ|G¾éó~>žÇó|øà _ïçãy<ÏÇóÇÖ[rüÉ|dMý¢_ôûÎóù}ù}ù}Ê/=O؆ºi™ª¦jPXr\9°VÈ fg%¬`9,‡å¬ŽÕ±:@ËÔ2µL(<ÞñÜö܆‡ç7€cê[S 4Á%¸‘Ü 7È ƒ<ÀÖdk²5)vìM­^«GPéTª•j@ó©§ÔS¦ù„ Bƒèkjôk>ÕªZ¥SMUSíM@ÛšlÚ>Tì¼>çá|”p;ávÂí_ý‚°Ö[ë­õÚRï¯ÇëÁ¨ž'ÈÞ‹\‹\m@œ\;¹†'†'mçp.ÆÏC€ ^ÆË0181°÷&:':1Aïo··£¼>ç1øä½ò^yïåÞq¢òDå‰J­š¯’âR:”` S„yîw–½³ ŠûŠû¢¹ÔWÕW@ËÑr¢Û¿›óÝágç=;Úí@qÅL*Äë+ÃGZ mUÚª´UhÙ4²id“¨ ƒÏyp`p^¨z¡ ˜9ÿðÒÚ—ÖÆ€&ª‰ PD·WäVäFÅÛÛÚÛ#?4¦1(¼>çá|ô÷eGËŽ–5gÆ<‘žH€oºrÿÊ}xãÛ7¾€ž(©)©‰Š<y.Úo»ÒvæõÎëž`ëšÖ5f~æ™.›.3ësΧƒâSÇUÇUÇUc cÙF¶1º`¼_*Àzûz;~À¾9öÍ1˜kk€Ó=§{`¶{¶ÞÿøýŒëÙ¾¾nsä:r¹Æ½ý©¨9çï÷÷ûûÉÃbX$IÚ#UHÚEÔID㸄KÑW¾Æ×DDô}E?`Õ+ªWÙOÛOm~~óóDD¡¡D4=Y:YJD7õ›ò39WÎ%Œ¤€/à øÈÃùH´‹vѹ¯/qÓÉš“5'Í­ ±$–Ä’€Õ²ÚèÃTÒ_Òë\ëbÄÝÑ»£\\Éöd;¤¶¤¶P¤R©Ô”;ûvÎÛæ¡ ý£ù‹²/ÊŒ•üµ%d Y‘û$­–VK«5òS–±8cqÆb¶Ä»Í»Í»ÍHÔ6Dê#õQu«ÿižµá L1WIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-32.3.png 644 233 144 3224 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIIDATHÇÍ–mL”WÇÏŒ(3„×…Õ¤©[ÃÝJJ"‘F„®Vj´Æˆ1•j©uWi¶_\ßXc¾DÚT%AØ¥ î)-¸%ˆ@Œh¢NµDìnk%Œ ̸.ãÌóÜß~˜y˜Ùíîwï—›ÿ¹çüÏÿyνç^‰ÎæùæùæØ6ïÙ-E–¢_žàÓ˜Ö›Ö;öAÜGq$œK8§ß acÝð ñ‡ç3ì/!Cdkd«© ˆÁ¦E›Y~À5—ÁzÁzáŸ~Øißihklkd7<x8à*p@놿oð…óË¡ÿÊ/³;fw˜þ‘s"çˆÀK…/&ÿ6à0’ ëÖ¬[ðã¬g)3hã@4ѪðàÁÎ0l¬ýxƒÏà7òùz’V&­á“’É’Ik} àn§*ÏVžuÀw:NsšhÐDà”ßíwãUƒúQý(pPT”C9€im³¶/ø]~PCuDÏðý©²µ²Õx·‰†o‰×Zoè‘ÿ¬í±U¼°!sC&¨å¾~à;¾U¤[t >µ]­R«Pj›zW½;ó§PÔuÔº¦®…ìD¨Ô(µZOÕSñOx*:È¿vCÙ†2Cà±Ua¥ùÕ)þjýÔú©'FæÌ_¿íQã£Fžú_óïñï åó%û’}É0ž>ž>ž¾C¾C¾Ca‚ö³ŸýaþG}í¾v˜á;à‡{ž{`ÐÚfmóDzD™DDN÷ÁûÚûLþž &ôÌüe¯¦¿šñÇÛãí¨M76 nç}ç}ç}X—µ.k]ÄöÆöÆöB^M^M^ 8{œ=Ξ ×a×a×aÈÏÊOÏO‡„Ú„¶„6Ô†3%5%5ðì=Þ›zo ÔÅ€ñŠˆÜ¨„¯Ü_¹¡Ñüù­Ïo©²ÜØ{ޝ³È™ç̃EQ‹¢EÁŽå;–ïXÙÙÙ!Ëö.Û»l/Ë<–y,3d¯_]¿º~5ä&æ&æ&‚ë©Ëér s/νˆ·o®cÔ1ªÊ ]µ+Ðjz„©X{¬]µ²~ôÈè‘¡§ÞýŽûÈkÌkÈk€y‰óç%‚#Í‘æHƒ1ï˜wÌ ] ºt-€´µikÓÖBoeoeoeØÞ«Pª<ÝžnO7¬øÍŠÝ+vÃϾM¨O¨‡ñ§ÎMpæ:sA‰)Œ)T­¢NÅ5Ä5èwÀsÕsnû‡w ïÂÙ_{eß•}àÒ\šKƒ…¶…¶…6°™l&› ªW/®^ – K†’’’øÉp¤8R)Ð_Û_Û_ “œœÅþÖ• WBãÒóMç›p‚þ¥þ%hù1oļ¡ß1«¿hÛµí¦;"³/ξ(rýõë£×G%iËä–¡-C"½ŽÞÛ½·ET*P"—N^:yé¤HÕ’ª%UKDJÍ¥æR³Èƒ¾}úD®æ^ͽš+Ҝܜܜ,ÒÝÑÝÑÝ!²íø¶ãÛŽ‹ôEõYû¬"®]®BW¡HÜHü‡ñJ’ˆ÷©÷©ˆ”ªcº#kJ—­ÅÖ2S€²?X¶lÅ›µ3«4«ZF[F[F¡«¼«¼«ФHŠŠŠŠ`iÄÒˆ¥Дߔߔ[‡¶m‚G*U@u{u{u;dÿ#û^ö=¨\w¢î^#Ͷ3¶3ÀŸ=†q*ËËÊË€/‚§Di{´P{P|Ë7|´ÐBKX­444þÿ褓N@áÃΧ%iIÀ ãT–W•WÏzL ûÆËÖaëðµJ9{kû­í1~ýo©ƒ©ƒ²Ffùš}Íò™i8âûˆï%Ê”nš4MЍ_¨T•*"9’#9"rSnÊMs¹ÇÜ#‚7nó ó yPDÿn×í"âÒŸèOä_¦³sŠæÉ[æ?޼2òŠ|!…OfËÃé”锜ã?íül´l´*Ø™§µ¯µ¯ô2½ Ï‚_<Ác€‹ &€‰àìešiÀÍc<(”þ¶þ6>¦µKÚ¥™¶Û#7FþÏμ+ysó››ÃîJ>xñƒg.G8B4ø=~€Vª•âuY]À„ BØX7üxƒÏà7òùgîÊçöuñܾǞÏì¿à—÷ùLÙ‡IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-18.3.png 644 233 144 3135 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïO”WǿʌǖÈF4”ÖNjHcÝŠ©ÔMýE»H—¦1Án² ]ݾ0y³‘"£èâb ”]]×N€À[¥MŒm]³&ͺù‘%©`‡ÑÙq0óÌóÜϾ˜yffÛÀçÍäœ{Î÷û{î=ç ˆˆÈªØ¯@jajaêʨúÛ„ß²Ó²³ø¯QûSRÞMy÷ÎÀvÖvÀÞcï1î%lsÝŒOÎIà'ó™~Y% G¦;Ó²-f7Ãû%ï—X~µ]×Á:`x?èïíïåÌߘ¿àßæß Û\7ãÍ|/_šÄ/##)ÿÌ2_uÛ×mñ“hÀÔ‹PõvÕÛß§}Ÿ¦R@_²ÈRÛ€ AÌÏ—d›ë±x3ßÄ3ñM>“?ªG ïͼ7E zoõ^k7šˆÈ½ а¦a ð:€6Àg4ÓLèéz:p6²Y$¤n.Ãt«Õ ÆÕ8°¬ïÕ÷‚ˆ?â\tÑE–ú&†÷—CîCnSའ|¶'´'dí6õÈÿ×öä[P³X³êí[5ÎA¨Y5‹ÆJ¥”B©Bõ’z)¾S¨\•«rbŠ(JøÉTÕC”Úa¼l¼Œ,²*+ŠÏ;5u5u¦À“o%•RDÄñG°­Á`:ÿ|Ðþ =[ùì¿‹9‹9,iZ§Ö™à w„;Âà­òVy« R)‰”$ j¡…–„©µjÍ ¿|Ôû¨—¥È±(>L'ƒÀ?¬ýÖþ`º©Gø·ˆÈ§_C}S}¨_¥þS GŽÂ惛On>‰ºú««;®î•®ÒU:TZ*-•X]¼ºxu1T;ªÕXÚµ´kiWBÞ?ïŸ‡Š²Š ÀÞaï·÷£jÎïqíqAø\”>|5Õ#jBDä»CðùÔçSðì_ªîõƒ¯å¼–CÈÜ×[ëo­¿µ®U]«ºVE­E­E­0¾o|ßø>(î,î,î„‘Þ‘Þ‘Þ„°žüžüž|(Ï-Ï-Ïÿ’ßç÷ÁÏíùÃùľο3wgNÕGy讨!¸Ò³Ò£ÜÜŸ_1¿ÔØ=*ÐfµYpÎ8§Ó0Ü6Ü6Üú€> €Ãî°;ì`k¶5Ûš¡lÙþ²ýàíòvy»’JÚG} ŽÇ`ëï·ØzrîÛ»íݰð§@O ÀWî+u<{{övåN•ì´Ú´Z6È݌֌Vé‘Çióë2Ö‰¤>Jý!õ[ƒ­ÁÖ âtºEr+r+r+DM¦@“ˆZVËjYä²ó²ó²Sâßí©ÛS·§DÆ'Æ'Æ'D†¦‡f†fD š .\ùûŸG3F3ä±HΑœ#"jL,baCº` C)wEÓÖhkäÕ”µ""’'£ÀÚ Í¢YDBOCOCOE l¶›Èì©ÙS³§DúòûòûòEü[ü[ü[D¬Ç¬Ç¬ÇD½ƒÞA¯ÈŒoÆ7ã9§ŸÓÏé"§§ËN—‰øçÃÿ†ˆí׫W5JžH¨#Ô!"µ*[e§ÜÝÊïqóÒ•KW€w¢g,VˆÐaÇᵇ×ÂM×M×MW¢Bge–ê áU”.=l¼ÞÀñœŸr~²Ö@üªøUá= ͇W1Sú¦tP¿ðÿ¸Å-P/iSÚ~åRå@©9j®šûx¥PÓÔ45 x‹B Ã~æ©GêJ-Õãõxü€Žj__ýø†÷ ¯Að𪈭ùÍþjm´6z¦ÃPâP"øÿÀºû+îÖÜ­a2°>P( ÷óøF|#àNr'¹“@¥©4•A¨‘Fæ¿À_ᯀû¿½[y·’IÿA|znè9àkkƒµÁ3Ýà#Ê$"Rý ìÒvi0þ£Œêé+l//zyĦÄfÇf£6íÛT²©ùü@>———€eÌ2fƒ­[;·vò³1Ñ5Ñ5ÑëϬÿlýgSãˆq –ÿÙvÐvÜUúÇúÇz:ì.Ø]ú?ƒ|$°ZDä_¥Ð6Ñ6uæ–¾–>U”5{™s™߃‘C† µ7µ7µöî)ÜS™=™=™=p§æNÍH®L®L®gž3Ï™&V{ ö@íH™Ÿ2?e~Øo{gY̲|UUu…u…ª:â:â ä#<œíœíTÍäTŒT„ =5oO¼ YíYmYm’’’å;Ëw–ï„5k Ö„ó³]Ù®lTõWõWõ‡ý·“o'ßN†aï°wØ å:À¯—<ïÞ«ïù¢ç ÏBÏBÐ_zÊ÷”O5›©7›ÆY$çž~õéWE®jßïú~—¸¯L^yæÊ3"-}-WZ®ˆÌÛ;oï¼½"íöv{»]Ä’kɵäÊãáøþ€ÈÌì™Ù3³Ãþƒ  Š8âqŽ8‘²¨²è²h‘Sÿ9u*JdÅ[¶|[¾¸±û}‰"毣­ÑV™Õ_´íÚvS¿HÔù¨ó"—yäòˆÄoßòí–oEºÏw»º]"ííí"9ŽGŽCäÆâ‹o,ÙŸ°?a‚ˆûžûžûžH†/×áišÛ4·i®H½»Þ]ï9´üÐòCËEìÇìÕöj‘›µ·Þ¿õ¾È@Ú™?dJ¼ésó1ó1öi©Zª©_ø(tÆÚ›Î4y|ù‹Zʛ˛ñ-õ/}¸ô!œ,8Yp2bëN'N:Y—².e]‚¶›m7ÛnÂèµÑk£×À^e¯²WAí¶ÚmµÛ`ƒyƒyƒÖþ¸v`í¤ÿâ… /\À÷Uw¯£×¡ŠÀ5î-Û8c·rGÑŽ"àK=¥½«½–)¦ðâÕ§úTàÂ…+âúà'€4Òˆ” o°.bŒ3Ž­Uk5\z:ìX»c­¡gÕß!Ã:`ðLçØ mÐÚÞ Îh§œSN&õyú}p™nºAÏÐ3ô ЖhK´% wêz'p”£ݦÛt¨<µN­­AÒ†@»:565ƤVÄW]ƒ/¾`´z¦s6¤c?S~ò-ù@…”ß«ujúv};þÇ+~üÀ>|ë¡£¡¸qC(¦Õ7êñ3¦µkí€;„?•oÊ7ý_录änÎÝñVòÞ³ï=ûX·ÏT0 ž€@³kv| .ª‹˜0AØ6âF¾QoàøF?£Ï“ü»xbÿcOæö¿ñý*>DdáIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-9.6.png 644 233 144 2731 14774263776 14773 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŽIDATHÇÍ–_LTWÇ¿3³–?eVkǃi™l£Y0±›FS ´i·1!eS¡ÁĬ&‹$%ч>4›à&fC"<’¨¬4µ¥ÆÕ Ô*ôí6Ûe1©% *8eæÞs?û0÷ÎL×ôÝóróûßïûù朜s@’”ã~þ—ý/ûWÇcC2Ÿ^‘^±ñtµ_Jê§ò¼¼r”L¤õ¥õùJÝøxÓû›Ò^Œsç–,øè³>8Ûs¶‡ý0;2;ð°ôa)$coÞ«÷ú=½T}}ò| V ®ôÍ@ÚsiÏIÿVþ[ŠL@õ®ê]?~8~°ç€,²œR Bo̧ÄÞ¼[ïõ{zž¾Çóøq?‚¼’¼ ÞÞóöžŒ®xÃøI¬CÁCA;GÍ4“åü+öcìGà¬-[,ƒóó°ì¬8+Î÷Î÷@¯µb­°ìŒÆ¦bSÀ_ø˜ÉJè%ô]^‚÷£Ÿïí_Ëyò.ï& v\ëëp^°†­abî„ãLÔDJ*©$9šh¢ ÌysÒœLd§Î~Þ~ž«­k$E?ÁsùÉ­”¤Ðß c6c6ò+˜°'là2•àt]™Ž¥ÇÒaþÒüó_€™4“f2ÅÐ#Œ$C+h­ ÌýynÿÜ~ˆmŠí‰ípÚœ6¢üÓÓwy ~Ü?nï`‘T×^×þk‹'¯^ 8E*×vm×—‘?µüÔ¢ŒšUªIùþüŒü ©¶³¶³¶SÒaÖaIýêW¿£~¸~¸~X*X*° ,©|wùKå/I{  •¡2MiJ_rÃå¹|Ïklëyéͦ7›$§T’|Å’®êªVN=:5vjL¾Gµ‘½‘½R´,Z-“Â-á–p‹Ô›Û›Û›+阎é˜taç…vJCÓCÓCÓÒhÃhÃhƒÊ ½zQ ¯ /…—ä“ôŠ^Ñ Ó/Î÷üø¥Õ뇋^—JÊJÊ$]”$_—[‘<Hw—î.Ý]’z›{›{›¥ÛÙ·³ogK÷·ÜßrKr¥æ*ç*ç*¥{S÷¦îMIÕ­Õ­Õ­Òì­Ù[³·¤Í#›ol¾‘(OóýÁã¹|×_ TªyMZu~Õy)ðGIÒ}¯³bMÅÚŠµR]M]M]4x`ðÀàÉ?êõJ™—3/g^N{¼áñ†Ç¤¢@Q ( ÍôÏôÏôKÂÂÂRç®ÎÝ»“õÎvç{~ü’ùÜ|îûdÕX5’óº$)Ïk«««’¯^¼.íhÜѸ£QZ“³&gMŽTœWœWœ'õ˜Óc¤Â¡Â¡Â!i~`~`~@êºÙu³ë¦tgòÎäI)}~0?˜4¦¿{¼8?á'~ ®7Aïbï"pÀÙKÀ:mfÙ;eGûŽöíƒâ}ÅûŠ÷Á¥ÒK¥—J!’É‹äAU{U{U;,l[ض° ÎdÉ:“[Ç·Žo‡™'2Od¦œân»Ä.a™¯\žÇwý¸ÆÚ¿†Æ#G`~–mÙÀ5f˜Áá6L¤ ÓM7"D(%¿Žu¬Žsœã)ùq¾å[àtà€-[€íñ\¾ëçé{ÌžXžH¬•ü×¼aÞ jϘL“ öoíöF0­¦Õ´¹ÈE°mltÐA˜ ™Ø öö`~oêM=ð³Ö¬%šÐ·<ÞÏï±§o~ÞK/=åfƾf_ó¡ù˜»¹#8ØØÀ"‹,&¾êîü¯ÞíǾj_MÕ÷xOÝü¿ð¯äÐúCëSþ•ð)Ÿ’VĊصv-Ëà\q®àÃÉØ›÷ê½~OÏÓÿÅå3ûºxfßcÏæ öæ!Lè…püIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.5.png 644 233 144 2626 14774263775 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜKIDATHÇÍ–[L”GÇgQ멲(5Ñ"ŤJ¸X©xAE[£‰¢P0˜#µ^Ó‡jmLK%‘ôA4vyà TJIjÄx+&&Æ€@Œ—pÕÕlñV\1°‹.ûÍ7¿>ì7»Ÿ5¼;/ßž3çüÿÿ=3sf!„Hµ¾’f%ÍJ𳓾Nø_:¿üä˜Ý Á±Á±¡ï'˜R?¥ÀÕäj2ï&l=¯ãíùB$ðí|Ú/REÂ1ñÔÄSŽå–]å9å9Îô˜}¸’Ï$Ÿù×€íg·Ÿh;Ñv‚oa { `xùðrHØz^Çë|gÇ5ÿã&\œpÑÑ?˜ø±*cUæžXÀÃLX·vÝZ€§ãžŽSI RÔr L=^Úl=oÅë|§ñ5Ÿæé0mÙ´eB@ɦ’Mɱ„»¿cì¹w¦æ‹žá0ûÙOŠº}}4a#LT¯êÀVçÔ9PÒØhl$¢þ‰¾ˆ¾õ‚}ì#…  _Z|qþ˜ñöÚÖ­äM)¥ñD»˜bô= ¾0^¯ˆZJ}¤œÊ SL1‰$H0ˆÆ£A;ØAÌ ´áS–V–¦+X·Ò¶”Bñéo<<^é•ÀUÖ€:¨2ý5z>z‹.£Ö¨5jyg(CÊ€Pq¨8T þËþ þ 0øÃàÉÁ“ 'îÝň¾†ÛÞÞà鱄5tÂŽŸwü ªÀÌZi…À•ÀýÀ}TÑgEÙEÙàªwÕ»ê¡Ô]ê.uCätätä´­`©ÁÔ`*dø2|>˜W=¯z^5äæçÎÍ ž©ž\O.JÇ›ƒš/ƯõXÂn­ÁÖ ÈoÔ6+/rrü‰è‰(N-œZ8†G†G†G`ÆôÓgL‡ŽE‹:%„õ¯è_Ñ¿f»g»g»¡¶¡¶¡¶¼×½×½×m¥ýÊxm¼&BPóÅøµ“¯N¾ªNÁÀ‚@ÈJ\§ÒUz'Ün 7ÂÒ=K÷,ÝiÁ´`Zžoy¾åù–DÜåÆË—aNóœæ9ͰdhÉÐ’!Ȫɪɪßç¾_méê_¿¥G€ëCׇ¦^>{ù ÔŸñc@_^_^_t¹»Ü]n¬¬¬†ìòìòìr8^v¼ìxY‚Èãóø<>èôtz:= QzQzQ:É8’q$#á—‹5_Œ_ëI‡æ‹ñÇõüÑj­ù_²BVÑÿìPÊ¡”C)Pà,p8¡ùaóÃæ‡0ôdèÉÐ(q•¸J\à¿ã¿ã¿G+ŽV­€…>^øZ2[2[2m{l½2BD¸9æ{ûTZg%Œ°Ú饅â olÀ÷¸Ç=àÇ8fóßâ·Óæ¿B;íÀ:v³r’œ±^7æ©´õ±Qïkïë8ÜäˆaDþ([d Èy@s¾9ßœTRI%˜Yf–™RH!ÈvÙ.ÛA~'wÊ`šÛÍí@¯™oæÛú˜ôF¼‘1û˜­óSæ,sÚ;³ì’]€2·š[‰ZUS`uv…D’èøÊª”b”QHÄ›ÛÌmDA^“×ìøšïÎ?Æ]ÉÞ÷~8ÔRKJ|‰‘›åf" :T ïʸ­çu¼Î×xÌ»ò½}]¼·ï±÷óû2dàl!  IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-101.png 644 233 144 2603 14774263775 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü8IDATHÇÍ–]hTWÇg³“ A‰&j$¨ˆ ¸ú Ä ñ#m› Ñ‡ ÁZ Q±‚>¨¦+ÁV¨¨mBPü"FEÖ(blýHKmQØ&íš/ºÞ{ÏùõaïÝ»ÖæÝórïÌœùÿçÎÜ™sDDd¢ýHš‘4#i|LNúÔÕ§–¦–ÎnŒÉ§,ð”{Êú&œœp ãLÆõÌ•»³?Ñ_ÄÅOäsô2Q\EÊ…” žå¶|* * R'ÇäãwÁÙyÄ„mW·]¸töÒY>ƒðƒð€þåýËÁ•»³ßñwðñåðøE ùzòuÏï2.eœä•ä•Ìú<¶á×Y°a݆u¯½¯½: ¬¿€tÒõr`˜aœõw‚ìØíýŽ¿ƒçà;|,¬â¬b(ÛX¶ÑÿmÌáÙw˜5Ók¦;|ÆeŠØÁÒ9kÞ0oXû¬}DùZoÖ›Aw«nÕ \Õ»õnk‡µƒ(˜æPÄŽÎyšÜš\À´ùâü±xÜR*‘ºU” Äj×µæ>sè§Öë †mÐl%HTX…U8ž1´O{µØÃ€þFÐÐú©²”…z­^ ¼áC03˜éd°nUB)EDòO€¿×ß;샞·=oG¬Ý¡;‰Œ¦¦Ñhœ3ιD#ÑH4‘¼H^$t.Ð|°FF§Nã·èÒèRFmõZºz:{:üaxØçÄcvênß¶}›£èeÆcôÙßÜߌ.œ]˜[˜ ­å­å­å.aµªVÕ üõþz=l m m ¹öþ5ýkú×@áÌÂi…Ó ugë±Öcè8SZŒ¶Ü~ÐÉÜ©{v`÷0¿)·)7^­#‘¡ú¡z¢Kj—ì\²ÓíÝé;w:ïtB¾'ß“ïÞM½›z7A~C~C~4¿i~ÓüJ»J»J»\ÿÛŸÜ^}{µ›pëÇ4 6 :=Þ#0>4>¤/ð6<7<xf‡¶S-R‹ÀšjåX9¨ Tªà~ð~ð~`ÙÌe3—Ít3´b׊]+vAýþúýõû]} "P¨€+“¯d]ÉrõÖÎ[xQx8ñøD¼¼˜/éÉÏ“Ÿ{D~‘ˆ|%7ä†dyOz§x§ˆøÚ|m¾6é–néñõõ1+ÍJ³RâËè5z^š?ÍŸæê}{}{}{EÄ#ñ¸zIµù$ùZò5ÉñÎóÎc¾›1^^|o@®z¥^%|ñÔÀÔÀThikikiƒ¾P_¨/9/s^漄C}‡úõÁœì9Ùs²áŤ“^LJðÏd2àâ’‹‹/.NÈØÿŸ1÷sjÜn×|½9`uÜjËjËjËàá͇7Þt««« (³(³(ZnµÜj¹õaWÖ–Ô–Ô–À£õV>Zéþcê—1ÿ1»+ã]át‰9lº]eˆ¡¦bŠ)Îs>64íušÓœ ( qlüà ƒ xïáÙ•ù'âsD÷= ì9ƒªQ5ŒªjU§ê@¿Ña0PU¶ÊVÙ`YEV¨&Õ¤š#>ŽU­Ž«ã ¬õÖú„96Ú3Ô34æsmÝ*¦S8£¬v«Qª"N¦Ó~×À;Þñ.A&.Çtq+d…ñƒ)Á'SïMþ1ÎJç,‹\û¬‹—ÀÚlm& ú®¾ €¸²c—Ìöwðü1ÏÊövñÑÞÇ>Îì¿ÊËÂT²dp1¶tTƒ3ãk¡$ÛÓ,Ãd‰É˜?B4åF—xá ÔæŒÌ‹ÁP¦l@¢dL ™ìH C6*¶k»ÅekßóžŸ}O[Þsnšçãüÿÿ÷yzžsDD$ßùp¯t¯t/JÚî—ÒþìíÙÛWu&íO¸žs=wýmÈû(ï#€Åí‹ÛíiÛÄM~æ~‘4~&ŸñK¾¤ž.O—k«c¿ M¾&_ö²¤ýA?xOyOýeÁî¯w ÐÝÑÝÁkpïÇ{?D¶F¶BÚ6q“oö¼L|y÷_ü"°àÛߺî€g¡g¡=]ôtñÞdÂ/ÅP_[_ ðÛC¿=¤Ý Æ\rõV`ši̚ȰMÜÉ7û žÁ7|†?©G`é–¥[D á…†¼Ç’n|µÿÑý¾Ä)>æÈÕƒ‰_¿Ǭ˜côÀ… ˆèÓú4he=o=Ïœþ#N„A‡y“7Éå’ƒ‡ƒ¯¾Rü³·nc¶Q%%è±~¶~½Ò´I8­—èzPFe¤W”(QÀ"‘Ê ìa °cv,ŸÆ‚ÆSÁ·e´RD¤ä0xïyïMgÁ°V@5 ;u'3ñþød|Âõáíáí`ù,ŸåcÞÒ–¶´SÕSÕSÕ:ú&ô Œ¿5þùøç râ¯Ä_aÆI¯áÊðàð ¤ù“zaŸ\„=ïìyôÛ 1‘Èhd]7U7Q7+V­Xµb4”4”4”ÀLËLËLKFÁ¦£ÓÑi())Ò¶Ò¶Ò6(÷—¯)_Á%Áò`9ÚäÛã†/Éoô¸“u«8-Rµ¯jŸˆþSDÄõ„ˆøÄ'ñ**Åuó»›7Dί?¿þüz‘ë{¯ï½¾W¤¿®¿®¿NR+jE­¨%â>ã>ã>#Ò\Ø\Ø\(râÓŸøL¤ô~i 4 .iR³jVâî…†/Éoô¸E]Xtáñ§D¶To©q»DD\Çœ Ï÷†œ 9"ž6O›§MdÓêM«7­É æó‚"þ¿ -ìvßí¾Û}"YùYùYù"g›Î6m©=W{®öœÈhÅè“£OŠHW–7Ë+ž1|Iþ”Xüðâ‡í Lü>ñ;¨m©cÀÑ»Gï½ ›[7·nnM·Ìßâoñ·ÀáÀáÀá@Úì ö{àbðbðb0í¯ZVµ¬j,:Xt°(íW _’ßèq‹Ø=v+(bí°vˆÈÇ""²ÔT °¾ðÙÂgEÆ.]»,rrùÉå'—‹D¢‘h$*âðNx'Dºg»g»gE.Ý¿tÿÒ}‘Ö¾Ö¾Ö>‘öòöòör‘ÐÚÐÚÐZߨoÄ7’®°Ëeø~£'ùg»²¾Œ}¾лØdZ£Ì™/;88€ …¿ÂáŽpG&«&«&« acÃÆ†ººº‡vÚyh'TŒUŒUŒÁñâãÅÇ‹3ŽïkÊšbŽŸ>Ãïè™w*Qæ”(Q¼O'hn £eĈºè¢+Õ«\llì ÿwôÒ Ôó*¯¢Aå¨Hκù§rþ³†ç†Su¢†+v™]ÆŒúJÝR·@Po¨7À^g¯³×5ÔPv‰]b—•TR ªWõª^P¯«—ÕË`¯·wÛ»!Ûoû3æ˜2|ÿ9Ç2&?ÙÙ™“Y ¨»Ån!á4Wƒ3ÙµSSAckâÄY“oï²w‘Hã¥&¿Ã7oòÿÏ]ÉþÇö?–8¼Ç{ä‚5mM¨fÕÌè~ݘ»2e›¸É7û žÁÿß»ò}]<°ï±óû7›ÒŘWIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-13.5.png 644 233 144 3144 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïO”WÇÏ0ü´¬ÂqA»„¤¥„ê*¥Ý¢® m1X^´X‰Û ´6¾Z›Ž éf-Ôë а»$5ü¦Äì ˆ(ÝÀn–U&][D¤ü``ÊøÌóÜϾ˜y˜‰þÞ7OÎ9÷~¿ç9çÞï½""ãÿ „¼òBÈjŸr$à|=òõ÷Ùt°¼iyó¿„5ukêbbŒ¡€mÆÍùÁëEøÁ|¦_b$àˆ¸qŲÇoÛáMïlŠ\ë³ÏvCTkTë’>¸úÁU€–Ë-—ù&z'zœ{œ{ `›qs¾¹ÞÄ Æûü"ömØ·–û.I¯%½–Rá›àH7¼qàõU…€>D­ö.\˜c:È6ãþùæzÏÄ7ùL~_>qyqy"Px¨ðPT=šˆÈÐ_á“ Ÿl¶h­\ÂŽhÐCõPàOÞIï$õOã¬qhP—Ô%5¨ôCú!<8½N¯”ÆW|E´úŸOi'ãNÆÝ&_áÍ›Qõ°Ö¶Öè©ÿûÅ«P´X´ª@»©©¤@©14¬jI-¡ÔïÔAup¥R¨x¯â|òÉø™gžy^Îs ØÀ3¨Ý„·?~ûc³‚_¼ÔJ‘ÿQ®(—+”ïGjFjV`÷/Í-Úm¸µ­AkðiÅZ±V SùSùSùà­òVy«xj(¯ZRK°¿PµP“×~ùðKÜSG““Ù¯¯96r `UüªxW¨jõå#üGDäB”Zþ)¨WŒ-Îê©Ï¦>ƒí¨ÞQºž|=ñz"(¥”R°«`WÁ®ˆ­‹­‹­ƒ¢Ú¢Ú¢Zð4{š=ÍA‹™™¤’†’† ýtúÅô‹¨ŒWÒ_J îüa|t|ÔØ'®ž¸ z¡/Q÷DDNÂ׎¯°ôoõþö²mÙ6cŸ±ÏÀ¶Èm‘Û"¡ÑÑèhtÀìØìØìÆÆÆÂäÉ;“w ¦¸¦¸¦r~ÊΆ¿%]î¾Ü´ÇŠ› 𠀿cåTž.?mÒ[Àëò]<À5®q P(T. 3Ì0pŽsœ ò÷ÓO?`ð˜ÇAxÿðj^ 8`ò•W—Wnÿ©\Ñ1õ0ê¡+cDÑ:f¼«ui]¸‰ “Là_ôÑúqý¸~t»n×í`l5¶[J(#ÕH5Rß’Eè×ôI}ô[·â6¶ûðMMˆrD9\¡L™:ö”ò¿ñVD2/éz ¥F)ÚÊ+—ù…_‚˜gši­A¡Œ÷Œ÷ÐXÖoè7‚•ßä{JùŸ¸+yâ®ÄWBUDZ¬ÖãÕ­º°`€mÆW¶„½‰gâ¯Ü•~~_>Ïòëâ™}=›/Øÿï˜ù$t`ÛIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.0.png 644 233 144 3167 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü,IDATHÇÍ–íOTgÆï¡Î4SJ• é®/DÂI@ñ©Á±u«[™bl,Ñ–%»~BltÉJ6‘&!,Z ™.-Z6ŒC”¤4ÊBwë†-M …T7"àtd¨„aæœóÛ3‡™]ÿŸ/'÷Ûu]ç9羟G@DD’£OãZãZcRÄ6þ6æ7½fz-ý“ˆÝª€á€áÀ·§áùæç›^h¡]‰Ùz\ϯ‰áÇóé~I–˜ce×Ê.ƒ-j×áœC9¦ŸEìÆ~0»ÍîÇa¨öT{º]Ý.ŽÃÔ—S_øm~Äl=®çëõ:^<¾Ôÿ¿$^O¼n¸+ŸYùŒ¬ß³~φßGÆ7€ýuûë+&VhFP~,X40Ï<úòÅÙz<š¯×ëx:¾Î§óGô¤ìJÙ%Â_Þ¼0·E F:8ï¼è¼Ú@ÈÍ´ÒŠQhÿþ‰ öOµQmÚ´v­@Ö†E¥L)#aØ\â"±hÿˆâ]wÞpÞÐŽtð·’„’s›®Gþ÷Û¾ÿ*??˜{0´—BƒÀüÚ^Õ¤šiG´]Ú.4íWš]³/ïÚjmµ¶ø%dÄüüŽÝìFS§”¯”¯xj0ŠâàÙƒguï¿÷)ED²ÎÓgþØüñ|Œ¯_ ¡?ðëwO»¦],„w†ß ¿ã[:·tnéxí^»×áœpN8'NP#4Æå¯YÚ»´­ó¾ç}ÍÁ‡±Ú±Z`Ê|Û|{>`Dh‘Ö¿ƒCq(ø3̨¹E…ÖB+$×%ŸO>Vê,}·ô]xè|è|èû)û)û)Hu¤:RP’U’U’ Á…àB'VÕTÕýªû`î4»Ín´ŠòÄòD=ªær³f}Íz 0¢GÂ{DDþå„Ïæ>›—±ç›žo´ÊI[=[=}ƒ¾¾íÏögû¡ÖXk¬5BÞþ¼ýyûah`h`hÒ[Ò[Ò[ w]ïºÞu1AW=W=W=`Ͷf[³Á»Í›ãÍŒú éÒ ^Ëd­z/õ^%!¢G˜Mò$y´.L6L6ÄçÛæªæª`çË; wBjqjqj1Œ Aî¾Ü}¹û )-)-) 696969`20˜ Äpš·5okÞ¶r[¹­<æß}ÑvÔvþÜÔòaˇ¡·BoAXy¶ïÙ>­ËÈG†€!€UÜϽòÜ+"ß*ß;¾wÈ£á…á‡_qr—ºKE2{2{2{Dª³ª³ª³DÒŠÒŠÒŠDæîÍÝ›»'¢-j‹Ú¢H—³ËÙå”åe¸e¸e¸%¶†­akÌJ „ DLe¦>SŸ<I¼Ÿx_Ä´¢bEV£vU9¦3|'’x-ñšÈ}w&ïLJÊáÀá¯-2ð›£GE|'}'}'E2ŽgÏ8.r÷ÈÝ#wˆ\ñ]ñ]ñ‰øþ€? bi±´XZD.o¼¼ñòF‘<É“<™Ø>±}b»H}v}f}¦ˆwÐëòºDlÿ±¶–‘@01<¦“NÃwBcôû¼óÓÎO—›¿ò¬éL×™.‚ùÃù·óoC[N[N[\×5Õ5Õ5ÕÁ–À–À–¸¼.¯Ë 3 3 3 `ï·÷Ûû!H¤CwZwZwìx°clÇ\›ó4yšê|ü¢ÓÒiþ­ÿcè]YSYS ôF»DSN('bcŠI&˜6³™ÍÀ4ÓLǵÝ,³ÌtÐç/¢ˆ"௴Ó‡÷Ax4< ¼壿BÍ`.Ú•ŒFçæQóè|Æ Æ @©‹Ì¥~ɽäfAÍT+Ô àOœá (7•›ÊMPœŠSq‚𝿫ù@1ŃºJ]¥®Úi¥ÔBÕ¡:@ÙºT¿TÏ‚úItŽ©cÖ1+€yÜ<>ŸÀãè{bòó¦éM E'ó¢ò…ò€zL=Fhù!D²ÈbÜi¨¨À,>|:¨•j%!–t<ýd‰ò=9ù£g%%e%eqg%µkj×,¸°@x>< ¼­¼M´~­ˆÙz\Ï×ëu<_çÓù—ÏʧövñÔÞÇžÎì>6îí²Ö«ûIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-34-red.png 644 233 144 4245 14774263775 15621 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜZIDATXíWmLTg>÷c@¾„¥RP‡m »® ‚âjÄlEâØ5Àj4?plÚ’°[%·².M± ÑÕ âŒfª4KQÖ*ü0îf!Ý­4583êlkEf€aæÞûìæ½ó‘]Íf÷ü™9ïyÏsž{Îsßw†hÎ(Äøõ‘æHs¤™›ò/ÄFtGtGt®%Q¥¡3”EY”Ì…•ã$’H"óP_9Îö³|†ÇðCëñëCùó;Hé o 'ÿBì»ÅnÓwˆ;ÄR‰Ä':‰NüiÛ½m÷¶Ý¶?Úþhû# $¯$¯$/à³8ÛÏòÃgõ^̇øu¡þ’Où ~‚Ÿ°e±-®\\¹¸R:Ü1Ø1Ø1¨D»ž¹ž¹ž @€“˜Ä$l°ªï³ý,Ÿá1üÐzK>}1?ÒÆñvÞÎÛm½ ïVÞ­¼[¾_Z¼Å ü¦d(ó•ùðIõ¾^_/ eKYR I[¤-€”-eKÙ€T/ÕKõ€’¡d(ð±|‹×òÐò†¯©¯S©q&ÎÄ™ˆÄF±Qlìf ºãº:]¯H%öž4( ÂåëôxÅæÌâm¼ r©\ @fþŽÎúóm²VÖ¾N9NŽ”÷.¶Yw\÷™î3_«Ïø0~¤y¨y¨y¸y%Û mÐÓSÒ¬O­.« ã~—ô±|D>Ò%é—SïÔÀLÝL‚­5!~.r¸ðÞ€©á©a@úxªsªSÝã²>µv[»1®mÐ6h”4ÆGå'î÷‹ûï4²À©ŠS§*”½~·Ïݬ1Öž×7¾¾˜{­ ®*® Î-;·,˜ŸT-Uûß'|ŸÀójÒ«IÐîhwü¹z¬¾ÚÙ~¤8ÓÓÓq|¬plùØrÀø>¤²g~#ùdÐk‡`ˆâ &¡&¢£ÀqÛqÿÆÊsÊs‚ÐÕÞÖÞ¨øP$E‚o¬p¬p¬`|?Fô7†††'“,Ò5é[ÚýÃîÀ´Õ´5˜ÀÕ“WO@DMD |{åÛ+ÁñS7OÝ€¤þ¤þàI´æ¶æð%ˬaÖ¨Ïø0~~¢ø¼d¨d¨d(07i£¤—ô€hDžÜ1¹Öþ¸öÇà†ó†óÁû¾¾ñõ xåü+çàbÏň1ǘà“sŸœ0á/ø+Ï]ÏÝ@ý’œ’œ’õÜþœ÷ù£}Ð>h$‹‡÷ðž¡ZØ'ì#Ðn|‡ïˆh‚‚A0íØ;ADTÅWñDD7Üx@D4²rd%Qm_mÑæÑÍ£DD[×n]KDä.u—Ñìtñt1úOÊ«bŽ˜C`E6‡Ía# ãG|_ÄyŸ°«î÷Ïž>{:Hó\­®VЯӯàùjô«Ñà΀æC͇И֘ÚLm&D4G4@\K\ ŸP,&!]þ ûƒì@½Í× × j'÷q™\&—é}BÂ*a•°ª®‰½e©¯i;´Òëk•µJp)Ë,{٣٣”Þ7{ßã¨q4‡5‡àvÃí¸»ëî.øhà#øÒþ¥€›ª©À– `ljl 7¦§ôº½+zeõ’…d!¹}œbõ±úX=‘xS¼)Þ첫~IÁ»ïJµŒ©lüÆù˜Ó¥t €›isAÊ‚è:Óu&¸ÓrÐÙÀ5skæ€ñÍ š¹ýtôéh(,\ù×ro¹Wv«÷{„=ÿØ9çG±·žÙâVM¦&S“i;ËŒõÆhc´RÀ}?ñ&y“ Îç—·ÓÛÌH¹®\ù¤|€GŽ”#@iQZ©âéݧ—Æ}qÂd5Y±E½B›ø&¾i¦[È-ä.ï#(üM½R˹r®|c×Å]ä.2­È5æ~Ó¬ifU»µòjy5`ƒ<òù`#@ Ws­U ”ÝÊî@í]ö6{:/5&5Æ·_íäQá¨pÔ¨S©Q‰Ú×|ʧ|ñ(™ÈD&"Á!<ž¾ª^­mÚm‹/Þú¾uuO°våj9øR @àÆ¦˜qe§R«ÔÂö•þ¥4«4KªUo Iñ™øÌ|,å@Ê”D¼Ž×ñ:]£ãÿÜ)Üî ÷¹ž´#iGÒŽi*5•šJó1U»ùº|]~°ve£l„f˜aðÏñ<À[Z*-•–úÛ’Û’Û’«¨wy¼&^oŸñÿZš:i®/lôÄ…¹¡¾vÞœv­—ƒ´[o¬Òn¼/Þ $?–ËZ™S„9j$j$jDÙ¦j2–åcßùu˜[ÃøEÒ‹„–0ín㺸.®+X»æ~s@»¾~_¿¯_%è™N™N™NV8W8W8¥Ÿ«Z¼$\.ýn “š_záçÓK,°´ëAÚmÖ6k›}ñÖ.k—µ €xàdL=ÆcOàØÛÄ6±mÄÿ—$êvX]ÿ:E¿Œ`¸±„wüÚ½òŸ´»¡xCñ†â€vÍkÌkÌkð‡¹¸¢N‚+ãʸ²u¡eøçau9ú/íeÚ]/4 MB“-›.k(k(kP~›1›1›1ëû»:j‡àÆÅÔIÔIþcG°†Õ‹¤ÿѵ{,Ôß0Êíâvq»ÚD›h“¼Œ_Ä/âqÄÑŸRÝ©îT7‘pG¸#Üá®ùw†Mîÿfñê7=éI/‡†ß¯à^á€ëãú¸¾þtnýgæ°ÉXÂp_:ê ‡š„«fIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-5.4.png 644 233 144 2602 14774263775 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü7IDATHÇÍ–oH•WÇšK¹š¹R*ŽÈzao"kÝ„zGn,{QŽEI¬3q±¤еJÂËÕÚ.($³|QËŠþØ$V-]ÏÚ‘IiÙÍͼ>Ï9ç³÷9÷yе×7—ïùýÎ÷û½¿sÎï<„BLw$ÎIœ“8-†?ôæSJRJr¾‹áV ï$¼óëgÑ’Ñٖ٦?¿Øõ‚¾ÜÜðL}mêkB@v0;8ï£XÂyPVZV p/é^’N9 ¤‘¦—cŒaƈ›¸›oÖ>ÃoôŒ~Ì€¬â¬b! ô~èýÔ#h!„85³jfìNmSC iú¾ýØ~ zØ)vЉò£Þ«÷#@T÷èY-«‰²× ;a` UT‘3jw"]~Œž«ïúÏïí¾P¨˜ØW˜Pù*pH%Û hÀÁÁöá߸Æ5ÐÕºSw¢A/×˱‘òª¼êã§"¥"Åܷ·•BñæAHJ›Âcë¡õ0Nÿ¶v乆ñ§o=Ýòt <øáÁ©§`¸v¸v¸d@dÀgè4§9 L2É$D·D7E7A$/Š„ô·ú[Æéñ£¬Ikâú®×Xë%ظcãÐQUht"}‘ÁÈ :ûÏìì˜_?¿~~=,,\X¸°úý~Ÿ1;ÙN¶“=¼}ÁöÛ@ðip88ìÕW}>¹mrð»Ñ‹é?®±ëŸ@8Ž€þ@àDïþq÷æÝ›0·enËÜh8Ôp¨áX}VŸÕç›åf¹ÙÃg­³ÖYË;(¥¡ÒPiÈ‹«oìö ¢üdôbúÆ€i¦]Ð0´hh¨7xnôÔõÔöÔB^c^c^#,]2ºdrçÎ= w¬;ÖËËtëÑ­G· $£$£$*wWî®Ü « V¬*ðý‘çˆsĽǀÑ7~d¦g¦«~}"~í°*­J«. \¸4à/ÍZšµ4 öTí©ÚSåÍ7•5•5•ARsRsR3]/º^tR&R&R& «¢«¢«ÂW¹íF/¦oü$ ¡Nª“ ýB8åN¹z‰Bˆ,÷nˆþŸûoôßbÝÌu3×Í¢meÛʶ•BŒ¬Y=²ZˆÜpn87,ıƒÇ;(ÄâÞŽ‹{…h·‡ÛÃBä\ιœsYˆ¡¡!!ò_ÏÏÌÏñ‘མ~ÜÏ‹gŒ¯Ý=”²‘h¼]M]M]P”\”\” íéíéíéð¤õIë“V(¿]~»ü6ÜÏ»Ÿw?ϫșgœ9õéõéõé¾J·ƒvhLá?ÏØó·Ò]VΘ3üÂ#hÏxæ;|ç8Ç9 ˜bŠ}í,¨ƒ:Îyç¼sT·êVÝÀ—ìg?èÕz«ÞŠ™#s€ñÿ½•¾>f[Ö„×Ç8¡*À¸üJöÉ>ËjY *¤B*ÔQG¨4•¦Ò€ìd§Ïh—îРêÔqu@5«fÆ™pùµåXÎKûØsßíÄëÌòмhµ^­Çv 5`c‰"DˆÊÅæe˜tóÿVïªw±AöÊ^?ÿK;ÿ oeüíª™]3;NÐ 4Ð@Z|‹‘kåZ¢ /ê‹$6q“oÖ>ÃÿÒ·ò•ýºxe¿Ç^Í/Øõ`D-tIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-19.7.png 644 233 144 3057 14774263776 15057 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜäIDATHÇÍ–ïOTWÇŸá§C(0IL „b7†¤u Ö…w…1AL«4Eö$íF4f—6õ…Ie»¬H,±XC5B€@—D  dx!]4».lG ²%íLíÀÀÌ{Ïg_ÌÜ™‰îàysóü8ßï7ÏsÏsŽ€ˆˆdE¾ y y a;áݘÛÛÞ(º¶»t°²ºß ™™¶n[·1³Í¸™¿_$†Ïgú%KbŽÔ¾Ô>KEÄ> G^:òÒ¶íaû/“`´n„ཡ÷†¾øŠ&X™^™X­X­€˜mÆÍ|s¿‰/gãä‘äËš’š"UU/4‡¾5j,'.'ªÐ=@:éªðáÃ\Þ8ÛŒGòÍý&ž‰oò™üa=9¯å¼&µuµuÖ/ÑDDæ{ åù–ç2m«œå,é 'ëÉÀ…ÐZh€ºgtÀ€TƒjVÍèïëï 'Ôê5Ï)N‘®¼a<õËÉgO> ¼kòÕºj]Ö/a{ööìXO#ßÏ^‡7×ß\Õ  ¹Ô¿øÔ’ZB#YmªM”ÊV;ÔŽh¥P‰*Q%5ÔPó$H|Áh@.¹fPsÁ‘o|kVð³×ãZ)"²«¬>«Ï—Äw»»= [½±¶ž½ž_»¬]Ö.Çñ ‚àõŽzGÁx`<0ðÄ îV+Á3äÙòl÷âÏU?Wá_ý!ȧz«Ã=ãž°êVÝ—¤> ëþ)"Ò5Žƒú=€a_ý«çÏ'Pþiù×å_£nߺ=t{(FX•[•[• iÎ4gšêN×®; z§Þ©wÆòFÔˆQU—u(ëìúó®Ïw}ŽJî³\±\ÎÂžŽžÃ§ZNµ€–Ö#ê‘Ù“Ðû°÷!lÜPe|5ûÕlf]ïVß­¾[ =Þoö–î-Ý[°{m÷Úî5¸Y~³üfyÌ¿¾¹¾¹¾ Π熦O˜:yÏ?7N`¹Ö_à/PÐßß߆ ë|ßd|£úøÏJÚJ¨¦È9Ú¡-j‹P’R’\’ ããã0áðNx!¿4¿4¿®·\o¹Þ™*Se*¸tæÒ™KgâZÙl 6Åì†7Üo¸;Ñ^Ò^óëÚòËË/d|—ñê°=c{Ƙ£ßÛáíeD=e3e3e30\8\8\jmkmkmƒúGõêÍesÙ\puÏÕ=W÷<ù¯Í.Ì.Ì.@Ññ¢ãEÇaíÜê«Ä™OÐ6mI¶$c.A0†aËœhÚ~m¿ˆ%_DDr"gCƒÀ€HÊÁ”ƒ)EæççEF®\¹&Ré¨tT:Drm¹¶\›ˆ½ÝÞno¹xãâ‹7$ºzÛzÛzÛDì/ÚwÚwŠdýÉvÁvAĸáû¯^ª—ŠˆÕ3Æ,s bñUú*ïÝ‘ÂÉ…ÉyED„?Dð‚ûþ¾¯o_ŸHÖRÖRÖ’H±Ql"õÇêÕé*è*è*é<Ñy¢ó„HQsQsQ³È˜}Ì>fñŸ÷Ÿ÷ŸIŸNŸNŸ9ú»£yGó¢zƒ–œ_âÄÄÄ„ˆˆ¯ÂWqïNd\tMã#ÇGfe ;„|!n­ŠÝ… °È"‹q½ê¦›nÀŽ{œßœý=+¬ X ¹Cî8>åhu´šó¬k*6Ç”õ'ëO¾$ ·æÖbsÌhМš¿ °“q?ëœ>§Ï^¬ëÅ`´mF0Ê(£ ûtŸîþÁ4Ó`|ol[ BÎ3*µš ÷oî߬+Ö_’©çÿLþ·RßJ›Ìú-ý ïï`JV(‚[lÅUD¡£¿âÁç]7‡ÑèN݇å{bò?vWòØ]ÎqŽôh‹ÑßÖß&jRM`Á1ÛŒ›ùæ~ÏÄÞ•þ°ž§ùuñԾǞÎìÿi•Ýæ)2IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-18.png 644 233 144 2423 14774263775 14704 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÈIDATHÇÍ–_HÔYÇï˜é“Ó°-&™1 ÃÀIÒ’±XN#X¤‚RôPÔÆÀÒöàCº…› Ò?*a‡’°ÒS'Z¤öÁͰ–Ø VHimlgæwïýìÃÌo~¿–­ö±ûòãœ{Ï÷û=÷wî¹W€Bˆ%Ù¯€¼y+òŠ3vÞ^ËïÜêÜZq=cŸ“àhp4üþ#¸»ÝÝž‹ž‹ê‰e›óæz{¼¾Ïô‹%ÂrF #ŽÚ¬Ý»VïZíü2cwCQ_Q_€}·öݸyùæeÀÔý©û±ÚX-X¶9o®7ãM<;¾hÿ¿°ðÎÂ;Ž?¡° °@X¹eå–Ußeü± ÛÛ^.x¹@瀜\¸t-0Çæ˜±Ùæ|v½oâ™ø&ŸÉŸÑ#`馥›„€àîàî¢ ™€'WáhÙÑ2“/݇A;í¸@È`£qÞ8O’˺M·àÃtëz'è1ÃgøHrÁè2ºÆ…‘ÅËá›|&Fxÿßþô 4:€HGAFe@R‡H뾤/¡õ¸~¤abŠ)½B—é2Ë­¿ÐõF4_É3ò i³røÛÄÏòåø…]ÿg(š*ššË‡§ò©ÌáÖjVÍÌó+ a"žˆ'â§Ãé°åOMM…×××0V>ÃgK`Ty•—y ßä3ù3z²ÂÎÀþãû›Ñª’¿ŒIcÒJ\­«u5ÄNÇNÇNÆ#Žl8õõõ óu¾Î‡:g³Î Ë*–U,«€ ?èúáÝÞwÍïš-<üÆrc¹/ÇŸÑ“öè{è÷ÆsqmxQc”dn‡Þ$Þ$ÞÀúÐúÐúUc¾1ߘ†C¡xOyOyOÁxÓxÓxT„+Âa¸»æîš»k¬SžTªßÄ×mF€â¡â!©ª©*Û–¿Õƒzx êƒú ÈRY*K¡êyÕóªçp»ãvÇí}²Oößã÷ø=à>é>é> kÖ6¬m€i×´kÚe«½ëê€:`ãËñgôð,ö,V0ójæ•ýØëi= Dˆ­µÖÚ‚Y]]…=¢G4ô¶ô¶ô¶@M°&X´ÖU¶V¶V¶B··ÛÛíµüò[c³±ÙÎgògôä ¡úU¿cBc‡±C˜c©@<Ï„†H‰”ŽrG¹£<7/Ò‹Ò‹Ò‹„HÎ&g“³B”ºKÝ¥n!^ô¼èyÑ#Ä{7îݸ'ÄÌÙ‡3…(Ù^²½d»/~¢ÑÆ—ãÏêù`!¯È+$‰2È PO=õVÆ!ÈòÃÎ:-WWW?T×T×T×@êQ=ÊöÇ~#J{äžÖØN%Æœaut $­£H$ÒfwÐA0É$“6œ8q ÂU®Úð´1kÌ~òT~¤iÕ¤š˜Çž5 ZT‹j-µÔ6òš¼&¯<&Éc ÊU‰*~á1Ôau˜ùÌ ðÉ>öÈvþQ9  ZU+é\Æ bÄ€4)RïiÖÙý}Ë[ûŽ«6ÕFÚÂ3ñ?Øùÿç] '8ËúÅfèa= €X¶9Ÿ+‰l¼‰÷É»ò³}]|¶ï±ÏóûÙ¥ho©óB¢IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-46-red.png 644 233 144 4221 14774263775 15616 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜFIDATXí—}lTU‡Ïý Ýâ©eª® X´+ˆh[ ±šX’aJluc`­XŒ¦jjWk¶JùPƒ¥cÑ”•°€©J!+פšfé4PÀÐRÚ˜vÚ{ç<ûGçÞ¹3‰’ÍîûÏÌ9çýxîyçž!Æìv‘`êã)þŠ_¹›H×2®e\ËÒùº©›ºyî#1WÌsalYÖ]èB·Æ8–5–¿oå³ò'ÖSOäqò•‰2Q¦6%®O»OoÑ[ô–¦~åååÄ=ypòàäAþ^ØYØYØ +.®¸¸â"ør}¹¾ÜøØZ·ü­x+Ÿ•ߪ÷Ûl%ÈmËmËm3éíí¥‹˜É92_æc˜›/Œ/À|(öY`–˜%`>d>h>æf³Ì,9GÞ#ïÁ°â»F»FºFè²òÛÀ õ=m4¥IiRš„зê[õ­{¿·¼5ÞoQ`ƒ½&_”/4öW« »£ë¢ë€é—~⵿ùð#æ€9²{lÒØ+3dÈ×¢_F¿$h9{k¼•ÞJ£ÀªoñX|ÂuÁuÁuá‰?Zž*O•§Jfú}>by‚æ{æ~s?ÕTA–³àfåÍJ€Hz$ÝŒl–Í|ÄG@0ÔjZ1´Ì÷är¹ÜvúWWðTyÞö¼-³,›O/ÕKõÒS[­…úâúâúb¹6– l4ÍF3€Ü$7+÷åÛ/ßpGÆ;½;½NÐQï¨`Ý3ëž±cDôÃúa€m?mû Œ&g áúâú…õ åZ{gø„ì<{òìɳ©é_Ú¿´©h)¯Ëë@0º5ºÕ™sMΚõîz·s½æ™' GÒŽ¤Ôm¯Ûcó™gî;s_¼^ÿÒÞã½ÇÁâ±ø,п<ýþÓï?ý~üÉÌ.³ßìzÍŸÍŸ gÎLmÚêù°ôÃR§ß#w?r7ÀÚüµù=¢\:yé$À¡k‡®½” ˜]ÎXÂÅå€ïœïœïœíhš‹G.vÆþpà‡SgáÚ…µ †[†[RîJ¹ `öúÙë.¸tàÐW‡¾"±¸s-§ZNÌ;iî¤ÜI¹“8oñ µ@-P F¯ZWÝ'e«« ŒïiïiH­M­"©ÞT/Àĺ‰ujŸš\5­j@Þ£y¼tॎ6· nPëÕz0›?ØôÁ¦x½Ô~}æë3öN¾¨d+ÙJöèU¡=¬=¬=\Qm²Ì»=?z~4gþÔýV÷[RHP.ú¶ãÛ€“i'Óyäâ‘‹b£Ø°>s}&ÏñÀu‹ à ¸ûÛÿ®˜Q1xRiSÚ¾ó}ç#Ž‘Î®¸ÿòý—£ö MÓ¦iÓvˆ´%iKÒ–¡ÓéÇ{ì¾Ï;Ï;ÏÜ`=j´\ž•g‰`½ÜÃÃmÃmS®L¹°+gWŽS£7«oV¬nZÝä8åS§6BtçgîÏÜñV—|Wì/öGÃ6à Ú Ú ?®O°N½eÓ·»²]¸èþØ (ß\¾£|‡\dwnRd\dä'ò 8°g`@xfx&W¸ ;e'a{BzH³x¨}¨=Þê}¡}eûÊxÒ¾B«Õjµzx©r§r§rçv'jgí+u²FY³¸AiT•FK+Ñ—ü­þVk|?Í æ†ø~tŒ%™== r‘Ü%wÙ«ÁžÆW 2Ç{ŽyŽ¥öN¾£½©½YîµÑ D(Ð=qÖ<‘'òôwD“hMBh½Z¯ÖûêWöÕÚàÙáÙa¸¯Þ¼/(EgFÇv²‚ ǹ cb~Ö±äÊèÑ'â÷ÚêÓ«¿Yý¹Á¾nè!=ä¯L9ýåô—…P½ªWõ*Í1ºb ów±Ï•Úyí¼v^9˜µ1kcÖF!\%®W‰¿ÒÖnž7Ï›çÔn´Ì`3F0‚@óƒãl>‹gùXþÈz«;ÏG†d~ŒãÇFβ…C…C…CÒ¯\—ßå‡ ASsÔd5’Ü }+} È&9_Îd«l•­€l’M² ä¹PsÔ5‹w\£®Q¸X~ 8¢¾!YCãú¹~®ŸHl›ÅæÞa`n3×›ë%«öº|Q¾¯Ô¨ ÔêHp`iH¥V© °<ÄC ÁøÅ ©WIV’õu€—M6·™?0 YY}ÆÃøH7ªÕþæ—l‚¡ÉÐhhT׸ÇGâGâñ(˜Ç+¿'Ÿ–O€ü®ü.ïTçT'ªÕ· dDø&˜xñ^€ÙáÙa@~o¶w¶W›ãu»nš M†&u ãÑøÄ}â>qßÕf6p¤êHÕ‘*õwÁ>©_kÖ3®gø×¬+·<ÕôT8ú}á|òyI¸/õ^*ÿò´åiÐãéñ¡ü‹õX}me#øHõè³õÙúl´M–L|?ñ½(ÁÈÞ¹ ­ Vß_}.•_*€W\¯¸ ¡1¡îeÝËÂXåºÊua/èíéîé´üPeU†4Y2Y2Y0ÆÇ@ÿPz¸ôpéáЛÉlÛx¦ë§ë@·\·N”ž( ˜šžš®€+€“%'KÂÇ»–t-€´Á´ÁðNt­ïZÀ\×BéB(¯ñ0>>¸¥žÖYtEÛc±´[Y«¬%¢´äÖäV"¢ÌºÌ:"¢ó?Î'"ò^ó^#"ú4çÓ""\Æe""1FŒ!"º›y7“ˆèWßy•ˆèýù÷版í‰v""e¯²—ˆâ‚?A+ZCõuºÝ€¶åÙùªVlèØÐ±¡wæ¹ynžð…rA¹¿e­wú~0^1^€Ô˜ÔÈX–±,|¥Ž7o€ç†Ÿ€ ¾‚€éñéñ°yþÖ­Ü6>WŽ‘c ²%-\Z¸´p)î0>â­¼•·´¬=¹íä¶0 Ä)~ÅCo ½À}ôú(Ì[æ-ðÍ­on€N¯ÓÀ‡¦M°Ò±Ò1s1sÜ‘Ü@¶[BÀò©7MošBõþÞþUéW¥Ú ¸‡Ëår¹ÜÀò…|!¿¾…í2ãO‰ÆDyµ{ÇíìÛÙ¡ãC-Þ¶cÛȨ˨ ^>zù(X_²¾9– Ì|9ó%\ç¯óp)ãRœ;7ÀG{i/€çkRkR`rvr~æšçšìú¬³YgíV+„=(É’dI²‰Ä â…¾1íÀ/+þ®ø;¹Ž‘*6ÏvÏvøa/z»èm>Öêl}¶n4Þh ßDJ¶’æzç‡æ‡ÛÍõq}\ÓŠò{û }}ìšvë”2¥ Ôsê9~å¦r3 WÅ,fÃÜbõeõåÐúŽõuuÆ8c¢1QÚ§­äAá pÐfÖЬd%«h±Q‰©Ÿú©ŸHðÁóÚiíjí6t:¥÷îîáÚU>R>Š” ðÁ;>Ãg€Z®Ö©uð³i;¯íÌÛ™'×i7ÐŒ8!Nإפפ×ñfÞÌ›¹SAº*†™ü,îw„;Ü™5ÖXs€HW­«ÖUÛiÚ-2™‹Âµ«Øü°Ã;Š< qË™r¦œÒbÇúŽõëÕbí.OÑ¥èRÆæƒ¿–â(¸óQ­'.Êý:Ò7Ä-j×}*L» ¶†0í¦H)RJH¹¯ÜWè„NÀïŒwÆ;Õ­š&“ø$>éÅÆ()vEñÅÒãQÚÝúÚ´†´+ JƒÒ èŸKŸKŸK²¦²¦²¦äŸkZ„?mdR J/p =ÁBX‚Ón»¡ÝÐ.¥¸ûÜ}î>~øáÇ#µ±± ;b·Ø-v;ƒIâ¯DÕ >§„'F x1¨Ý?ÿ˜v7mÙ´eÓ–víííñÉ⸪u‚«à*¸Šgë#Ëð£êrô_Ú“´[ ´-Bˈ‰W4U4U4©ÌYÈYÈYþ©µÚ#xmõR/õRðØÜQõbé´híŠô7Ýævq»¸]m¦Í´YùŸÁgðGqô·¯>£Ïè#® W…«Ü_ƒåQû¿YŠöÍB²ˆÃ‘ÃoTñ*¯ò*ÀçÎsçÿý“Åç?³GuÆ•÷‰­þýrù¦ÚIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.7.png 644 233 144 3177 14774263776 15063 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü4IDATHÇÍ–ýOTWÇF(Œ¡(k²uª)ê.±AѤëKÐ-Û¢ÈK*ÆPB[cP·þ5dcŒºkÖ`ã*ÄÕ’bIìœX V×h‰@S×7Z] Ô”ýaì0u`ÆaçåÞ{>ûÃÌe&ëþž_n¾ÏË÷yòœs¿çˆˆÈÜèWÀb³Ø,ily/fOy#嬿EðiÊÊïï‡9ÍsšÒϦŸ5†bØô›ññù"1þøz¦]æJÌìHv$¬âC°5gkNʼ>v¬Ö¿;:wt|ÖöY»aü›ño<ë=ë!†M¿oæ›|ñürèê‹@Òå¤Ë ÿ‚äç’Ÿ…… _ù}$àá+P²©d€s–s–²€>¤’ªÖ>|˜Ë‡M4ÞÌ7ùL~³žY?Ò@fAf-,´¶F†Îq²î£º@õ„;há4§I]tšµ'Ú‚ê¦qÌ8´ª³ê,€Tƒú}AÎiç´s †ø€HUîŸrÕeÔeïEëQ6P6`m…y/Ì{!¶§Ñó‹·ìoÙA­?ò#¨7#…°ªVª¥~«JTÉ̤P*CeËXƲ˜(à g/ò¢é ÀÖk[¯™üðõ¸­ùÕIz¬ŸZ?õ%ÂCÛC„ÿÀƉ Úµ1­­ÕjµÚX½Pc¨1Ô®W‰«´-GËá©* mm€‰Î‰ÀDÜM?þTÈ´g8ørðe6NŽÜ¹ `Õ­º/QôcÁ""²7O~S³­fÛóÚÔÅß-þNåþ}Í«k^•+Kó³½Ù^±V­ªšU5KÄUïªwÕ‹Tx+¼^‘ܹ rˆThZ…&â·ùm~›Ì¬îÝ{º÷ˆ,m_Z¹´Rd­« ¼ \¬óïYXÈ•OÜüöæ·*OdOÞ†ç5ýx´­PDäN|éýÒ m–®ï»¾WÛ¶ªsU'A÷€»ÛÝ ÙžlO¶ê-õ–z äççÃ`ÿ`ÿ`?dÊ:•u ®:¯:¯:cóû‹ýÅàïñ÷ø{ ¯¢oSß&Xh{éë—¾&è,›^8½Pm‡‹/^CEú¦Ò:Ó:•ƒò±#cGb„¾Vï»Þwaíšµ«×®†ù›çož¿†‡‡Á^d/²AÚ¢´Ei‹`ù®å»–ïW»«ÝÕãÑîjwµ»1\ýÏêûÕ÷á/{Ž/?¾­ülIÙ’¨¨2ô¯ô¯Œ£†ðÌ!L 7…L1ÁDœõ‰QaT&¨÷è=ñÊ¿%yKòÿUþè]IÙ¶²mqw%õ êÌtG8B*h>Í ¿­¿MÔuu€ †M¿oæ›|&ÿÌ]­éçY~]<³ï±góû_E[ƒŽrIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-0.4.png 644 233 144 2573 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü0IDATHÇÍ–mH•gÇ/=f²\à ¨eѤ„`ôõÁc‰‘’'¦c5¿Ì¶^[ƒ Ù"lele‘•„•’0Ñ“ŠÔÑœû lŒ9NK,ÂC:gn‡óÜÏ}ÿöá<÷9§Vc{¾®·ÿÿÿœëº¯ç‘¼_ìeÙ˲$íì·Òþ¼Ê¼ÊâkIûœ Y;³vþôœ.8 °°}a»KÛ6nó3ëEÒø™|Ö//HÚ1·{nwVÀ³›àµÒ×Jó%íÏÇßó—‚·{ßîøòò——y"#‘€ß¿ m۸ͷõ/_šžà9ýsú³&`nîÜ\(ª(ªXþn2á×å°£jGÀCßCŸÉwÈ'߀Yf±Ïo¶{ù¶ÞâY|Ëgù“z Ë ËD øzðuÿ¥dÁØÔ¡%‡–X>§‡ æ0ùægÒ™zÝ7‡8˜Í€k´Ñ€2CfÀ=à ΧªSu9¼É›ä§ð\‹ïñ¥ø“zäñޞ؊Së«õ¥}ûî wèˆ:­Nãxc|:¦cÀ^ö²—?¿0Ê(˜¦Çô`À”›r\÷[÷Û |jójó¬À[3Z)"òòçàø#³9¸áx8$‹·ƒ©5µÄK•‰J˜)šY<³L©)5¥BÆg˜bŠ) A‚Äß‹ïï‡èÊh00WÍUbŒxø:œ' Åïéñ„ûö}¼ïcà ½–‡jL¥h͞Ȟ‰=àïòwù» ~°~°~0CØ]îrÔ5uM]K»×4®i\TLWL§ñtsâpâ0p×ã³üžOØ÷@g´3 nÀ4xñP{èLè ¬.Y]²º¦6Lm˜Ú+¯<¾ò8Üà7žÒÉÛáÛáÛáô T«‚UÁt\w8[­ÄùÎò%ù­_-øÊtCä•È+à–?NÐ:¯Õßê‡ÀæÀæÀæ´¿qDDdÆAññõQÛÔ6µMR£å(‘ÜXn,7–ö·7µ7µ7‰ 8:pTd|ûøöñí"£££"¡ºP]¨NÄW’ÓÓ bNY>ßÓ“-¢C:”õ³ˆªQ5"ÙÓ""Rh‰Ê–=({ r¿í~Ûý6‘¦@S ) 2óhæÑÌ#‘õ»ÖïZ¿Käbßž‹}"[7¶nl¹Þy½óz§Hñpñpñ°È¢à¢à¢ ÈªW-\µ0ý"YÊò%ùSzžœ1&“=7Ô<5¸ý£»»»aSÞ¦¼MypsâæÄÍ ˆ6G›£ÍPs¾æ|Íy˜\7¹nr]ºe·ZnµÜj#óÌ?2?cÆ®8Nñ$ÃSgì‰S·§Ä-t 2ê©ÇÐÁ.d _m´EQ”v›-f‹ÙjH ©!Ðýº_÷g8ÉI0¯šƒæ Üb·ˆýç©ÌØc:ì„Àµ{L¿¯ß'¦_ÒÕºÜ îZw-èA=¨:èíÓ>íši¦9ChŸé6Ý ?ÔWô}JŸ"Æß¾ «°zæËØü©Ml7³;ìèÝ€C"É88€A£(Q¢€Æõ^J¡ •ÿ§®Óu8àŽ¸#ÿkó?ã[É¡¥‡–¦z€Oø„|P³jÀ}Ã}ƒ8˜;æYdAÚ¶q›oë-žÅæ·ò¹½]<·÷±çóû}0w/SIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-32.9.png 644 233 144 3237 14774263776 15054 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜTIDATHÇÍ–ýO”WÇÏ3 0ÓíêÆª¥õeEJpÇ8„¬´qÕб²”ˆm•’ÕÈ`R#»Q²K›ˆMÄî–eȆ·…¾–î’  „uCWʪ`KJ¨È«Ë8óÌýì3þüÞ_n¾çžó=ßç>÷žsDDdqp0ŘbLÑlÚ²G9¢kë¸Rm·¶Ûõ XôÉ¢O^¬~±Ú?ÂÆºá??^$Ä??Ÿa—Å2D6G6k©A\ YñYñQ? àò«`n5·>ñA~[~@KMK áûžï{&S'S!„uÃ߈7øæóKéå\Ô¾…ȈÈx5ýÕô5‡ƒk cgÆN€‘°‘0e}°bU©À 3Ã=ëA#Þà3ø|Fþ€¥Û–náÓ7§Þœ2Ÿ  ÔRQ\U\ê/ÞV~O%•XA]€ ß´oêõäÿ8®Ž«ãÊ¥\À¬ž­gãߤo8MUXÕ_ƒ|mÅWНjùÌæ 3Ÿ5ôÈþÛ“i¬Ø³qÏFPÉÞnà>÷A9üQþ(¼*W¥©4”zW½¯ÞŸÛ)Ô1uLõ7u]]Ù‰P#j¥~ Ïè3xõ{‚üY{í9d<™6ïWŠˆl¨àÏæ:sÝL8 Æ Æ€÷WìýA̓žú^÷ú Cù¼k¼k¼k`¸úàêƒP_\_T_‹F£?þ~ûó3ÅgŠÿ7ëz×õÊN ó6zå3íNøpø°X´8mJ›Q¯¨ujˆØÅ.v¹!7䆈©ËÔeêa˜a†EL«M+L+Dü¿Sýª_D6êoéoÉ¿´ŸF|ñ¡üÌôñ }Ð.—DO¨K¨ûçÑg×Ï®·ü¿•ŸÌ¨Ì(@+ó¬Þ©wøóüyxyüâ Æ&™`˜Îf™¦yÄ#ƒ…òçúsñâ1øŒÎ’™ù+°WâÌvfÏë•~ùðËs­@eXÁ7ã›Ðsô< ®ª«hhÂÆºáoÄ|¿‘ÏÈ?×+ŸÛ×Åsû{>_°ÿƒÝ(}ÏŠIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-31.3.png 644 233 144 3064 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜéIDATHÇÍ–]LœUÇŸùÃGXdŒƒ‘†¤ !!%5Ü»:kvÝ04Ó˜~$…Uܶ«ØÕ‹í¦n—l¤­Úh­ûµÒ e@hËE©í…m/äK¤µF,šø2–0̼ïùíÅÌËÌ.»÷=7“ÿóñþóžsžçˆˆÈªÄ¯€ÕiuZsãØú‡¤=빬çVŸŒãt°l´lý ä½—÷€½ÝÞnL$±é7ãSóE’ü©õL»¬’¤!³+³Ë²!ß‚*^¨ÈúE·^[·­û~ ^êy©Àßáï`üxùÇËÚm$±é7ãÍ|“/•_Þú¯ú"þYúg–ï 3#3Cw?î.ýS<àF)Ô=_÷<Àýð²€²ÉV€0aÌ5›‚M"ÞÌ7ùL~³žY?®G ðé§Exß3ï™·ùâ Çy§ùÃæA]ˆvÓÎG|D6Ä‚± €þšþ~e`œP'ÕI5¦Æ€ˆ¾YßLbZLZ9Æ1²—ù>iîjî2NçcOıùL=òŸ{ûö³<ê­ôV‚ú%@ô à6·A=¢Oê“D©gëPêcuZ5¦FÕ(¤|³ Áœ§æÔJýÆ(3ʈ÷¸*;Áÿ{oƒ·Áøö³)[)"²æ.ØNØN„Óà†ó†¢ûø]ð×?uüÔÁB¬%ˆX±î‡î‡î‡ z+z+z+ÅqˆCJÂè?¢½Ñ^Xæû[œ¦ÂSaàŠÍoó‡ÓL=¢,"" ÃN}§ó{ù™ŸÊZ×SåO•ƒýMûû”÷ˆ·ÍÛ‹Ú¢¶¨A¨(T*׸kÜ5ý»ûw÷ï^)|~h~h~j×Õ–×–ƒý]»ßîGyzZ=­°ô>€Q ¯„^ ê‹ë‘˜[Däz3œ¿{þ.tX_¾R Õ¹Oö<ÙCD{DËÕrÁYæ,s–Á¹3çΜ;îw» y=ƒžAÏJaiiiP]P]P]Ú‚6«Í£ö¢¾¢>"ÃE£3£3ªzU¯½5®Gåöäö¨.6δ̴$ þ»w¡¦©æåš—!¿;¿;¿îß)¾SœŒ«òWù«üp¶âlÅÙŠ¤=r%r%r%…o0<„šÝ5»jvAþ×vŸÝÁ#¡öP;Àlõl5¨–wŽ[uYé´Ì[æ)—îœgržÕ¿ÙùÍN™YqŒ8DߦÓ"¯ÃëðŠ ´´´Êò²Ö[ë­õ"²VÖÊÚ¤=Ó•éÊt‰ŒUŽUŽUŠŒLŽLŽLŠn¾ |+âø«ã¸ã¸È@gzºÌ‰äïÍß+¢%K²(·ª³ú}‡e\$½/½OäÚo¯Í\›‘­ó[¯n½*réê¥//})¢5jZ£HÞtÞtÞtR@´$Z-!tÒ“v_©¯ÔW*raõ…ÕV‹loÛÞ¶½MdøáaÛ°MDû£æÖÜ"y7V½±ê )‰,DDd›ÊQ9–q!±§üëÔ§§>5?¼jø{Ö¾®}]DÖ¬·­·¯ß×ïë_y†ö8÷8÷8áºëºëº ‹‹‹¡®¤®¤®‚µÁÚ`-è=Ð{ ªnWMUMoîØÁc‰˜õ8}êè©£À?Í3†y+›š€þÄ-Qú«ú«Ëõ_3Æp˜ÃNQ¦££óÿ× Š(ÑT>½P/š·²iÓ~`)q+™Lô1l“¶ÉpG§\S.Ðÿï3zËRïR/ †Ãðà=ô$ë[Œ-Æ ƒ 2€ &˜#×È5r5<Á ¿«_Ö/ƒ¾oéüÒy G¢ N­™Z`»i»Nc&ÑÇVt~6emÊT¢3/êCú€±ÃرüŸ#ÜKÌÆXC|F…˜eÖäA¡Œ‰²¨®¾Üv¿€M™›2ÿgçOÌJê7×oN™•¼þØë-t-´ ±p,  oÓ·uQ]À‚’Øô›ñf¾Égò›õÌú˳ò}]<°ï±óûonMÑÉé|hIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-1.png 644 233 144 2037 14774263775 14615 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÔIDATHÇÍ–MH\WÇÏ›4QÁ˜ˆÎBˆ_馛@$*T2`$"„@b›dÑi6•¥Yd‘U«P²Èª!¡mÑâF‰M»(YˆJ4X0Ö…£Œ#:ó.Þ»ï¾I»ˆ®¼‹ιçüÿwïÜ;O@DDŽß±ÚXm¬Âc_Û|éÙÒ³ŸÿæÇ8—œK“ßÑûGîT>¬|èMÛØÌ›úh¿ˆÕòL^ŽŠM”¤KÒN"ˆïB׉®¥q?þa ʆʆr.ÜxvãÀÓGOñ ,/d™ØØÌ›zÓoô¢úr÷#¾|qð…ó7”*9$õgêÏÿÖ/˜;Î_8ðáÀ‡:j(§\'€,YÌX‰Äf>¨7ýFÏèžáû~ªOWŸ‹Ý»Ë~ö¦Þc½Ç ¯0ÜãåàfÝ,àªnÕÍè)=|©Ûu;𫾩o¨Ûê6;(wÝ]ÛoôŒ¾á¾ïGŠ÷öǸ\z¹44ô¨7ê  ½kÞ5 Á„6:¥{u/èY=«g±c“ ™0Òà]÷®SõB}Ã3|‰úâ'([*[Ê~ïÔ; žïªw•­r‡`‚ &l2·‘ÛÈm@a¾0_˜T¿-®ûHïœå¾ï'0öàw¸uçÖ°ùd¸eæ‰ÿažP·û[—È d m°m°mF’#É‘dÄFÜ‹{ñÈ…+Õ÷NZ¾ï'0ö×wðdãÉFØ×ê±z̰ÅÐH#‘ZË­åÖ %Õ’jIÙÄhçhçh§­S3jFÍDW,гúÏð}?¯*^é4,Z:í×ãz•O‰¨µ l^&eR&%:|«ð ß÷É&²‰·м~ùúeØû•ˆ~¯ßK^D¶e[DqÄ‘z©—zi’&i²´Ž¾Ž¾Ž>‘Úxm¼6nóNƒÓà4óõ¬~À3üÀÏ'ŸÊâSµ—±—S¹‹{L³Í6àááYª×ãõx= ×õº^/:ƒÑ‹–]ÞcŸpó‡7w¸‚yò^Ž9 æ]Üè íúæßã%ꊺÂè1=€ƒ66óá–íö¿rß¾]ìÛ÷±ýùû/új7£ÿ€IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-36.0.png 644 233 144 3235 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜRIDATHÇÍ–íOTgÆï3B™ª%™%Û*bºp;b(*¢èˆÆn› "Z«./KHhÖ¾EMKtk›lh›EYqY©“`3, M´Ð+c`ë&+*¡Ã&ËëP˜…23çœß~˜9Ììúø|™\÷Ëu]çœyîç‘W¿¦SŠiy›~‰›w›wÿêZת (ÏŠ/W| t%éŠÖÁFÞ¨î‰ðGëqyE"¸ëq×{W¾ô}éæ_„ðgwÀÒliž BYKY €«ÁÕÀ‡àu{ÝÓöi;D°‘7ê~ƒ/š_*ÿO_bÛcÛ•CÜKq/‰@ê®Ô]¯ÿ>T0ð:8Þu¼ 0²ld™nuH$Q·³Ìb¬'QØÈ‡ë~ƒÏà7ô ýëvëvþ”ïË÷YêC }Ô¿tüèwÍÔQK-‰ Š*ÀUÕ¤šXÔïiŸhŸÐ?Õ?Ðêgê~u?‹œNæ—HÔ{Â|íÇ;ŽwûùfOÌžK½áGþ÷Û~¾“× 3 3@ßè=K}¦># ÿ 7è èšGÖ†—Þúýˆ~°`ƉS†;ºæUï©÷£Œ‚¶æ?Zx¾ð¼aðóQŸRDdm –¯-_ÏÆÀ@Ê@ ªxgrËxÝxóÁƒµÁÚˆ^`40…Éc“Ç&A =H2TEUè_åÛÿ6<]=qfâ óº-Äžž€×Òméža1äGtED¤öG¨P+TðcŠ)-c[vŽ-ÇI’Iô½wövìíý´~Z? E¥E¥E¥àJp%¸ ÷Lî™Ü30µajÃÔž[¥ÞÒáÒa°8-Í–fôCwß}?ÖÈjÜ.O-OrB~LÚN‘¬VǼc^¤µºm´mTÉ >V«Åïù»çšçš(} }jŸ*rnîÜܹ9‘ž™ž™žw•»Ê]%²6imÒÚ$‘G'|tR–VkAkAkHw^÷îîÝ"ƒ5ƒ ~$JÏ=«{V‹¿=Ó-nQ2e»ã¬ã¬ˆÖòcŠùfyËò–7ß’½é_¥%ò[ͱޱ^©¿ùÇŽ7$.¿3ßï æs‚9"V§ÕiuŠ mÚ6´MÄÑåèrt‰x¼ Þ‘ô›é7ÓoFŒìÙ1²C$9#9#9C$¹;¹7¹W$å—©[R·HÜ¿ŠÔ?¨WêEv}·ë;ã;ã;ß|ËÄ_ŸâÃ&Í/罜'òPý¹âç yÚ;ßûjï«"­Z{[{EVN¬œX9!âZïZïZ/’›–›–›&2”0”0” 2u{êöÔm‘ú¦ú¦ú¦ˆ1%_ÉWòE‚¶ -h‹ÄÖ@v [Ä|ÀÜiî”§"±Ã±Ã"Êòe‡–ÂfÒÿ¦«ÅÊc‘ر7DîÿæþØý1±ôüéàO"]û»öuíñ^ð^ð^±çÙóìy"ccc"uî:w[d\×Çuk™µÌZ&âls¶9ÛD2×e®Ë\'2²idÓÈ&‘Ê_W¦U¦‰LtM4L4ˆØígígÅ*â[ô-Š(s8q*…ÏDDþqœ[Î&gÓÒæ/9oþøúÇ×YÜ8·qrã$\.º\t¹(òg¾5þj›Ï®5®5®5°yt³g³nÌ´|Ñò‹†+‰ÎDàŸ!?áqQû#”—”—߆w‰®UFÆ:**èíz»Þ8qâŒÚv}ôќ⧢â[ÙÊVà*W¸ÅWìöo„õ(¿X~˜ ùúÃs K¿¥6†‹žlO6¨!òwÔ*‹¿…yí5-_ËîÒI'h©Zª– j±Z¬ƒæÐš8Ìaƒ¶B[¡­þÂE.‚–£Uh fù+ý•Ìk×ÂsLóØ<6Ë€e`6†¹ð{nòóžù=3 ‡'ó3õ{õ{­X+&°ôÄàÇãd ë=?ùÃg%{ì9uVrbÕ‰UKÍ@5Õ$Bp68  ~ ~À"èwô;((ÁFÞ¨7ú >ƒßÐ3ô—ÎÊövñÂÞÇ^Ìì@¤û¸þQáIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-8.1.png 644 233 144 2527 14774263776 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–]HUYÇ—š¥aYhV““A‘ ҇Ņ ¡,½ Aãƒ1bÓÁøàC3LŸ%Bt1Ë0„¬Æš¹1©L36`Ÿ\¸“^¯¥é½gŸý›‡{÷=§fæ±ýrX{¯õÿÿÏ^k¯½DDdVü+¼0yaò̘üµ3ŸVšVš×³Ï+HªJªêû2Ogž˜Ý4»É~êØfÝø»ãE|7Ÿ™—YâLLóMó%•ÄíØZ¸µ0mNÌþᤷ¥·ZPw£îÀµækÍìÀƒÀ€PI¨Û¬oðÜøÒ𠿤v¤v$=‡iS§MEm\¼7æðçb¨ØT± àuÊë ê/ ƒ ]¼ãf¼uÙf=îoâ žÁ7|†?¦G {}öz¨ÜV¹-ýR,àée¬ý ö/0|Ñ6ÎqˆCdèGÑÑÀ%+l…™Ý§ûKÛÚ,Ý¥»Ô.µ‹ ÖYeVp™ZjÉHà)ƒçKðÇôÈǹ=¾ñj©–„ û|a=±ž€^h=²/h¥Su*°œå,çCÔ;õNÐÏXÊR4Øoì7Dy¯|Êç§:­:Í<¾Á•J‘e?Bz =ðn ô«~tPºE·0¹Š A°"X,«Ð*´ ]Jºé¦ðãÇïL†Gƒ£AˆXéV:€Þ£÷0Ư?Ηàé‰ ;ÿÔ©?ú9€]ôÒ ¡îÐ@h½ydóÛÍoa^Þ¼¼yyP¹¬rYå2øPö¡ìC™#Ä®·ëízÏIÏIÏI¸õÍ­º[uΆÚ9‘´HZ"ªÈð=qa¿…+á+aP?èñˆ‰ö/Ûç¶Ï…%mKÚ–´AoMoMo äÍ;›w:«:«:«a#zDhX{píÁµB¹í½í½íuüÔï‘ÑÃLÄuî0üFÀÌ;3ïhVV‚þåãZÌ\<¸ò ò ò ³!³!³Vì^±{Ån^ ^ ^t^PÔPŪXÃê«g¬ž×ç\Ÿs}ŽËïå³|n¦¿Ñ“,’R‘RA¾Hj{j»ˆ>"""ƒñ”«w®Þ½zW$kMÖš¬5"á£á£á£"z\ëq_£¯Ñ×(‰A]t‰¤µìUö*{àÅ‹ìl;ÛÎŽqŒc®ùÊÞbo=ÌØgì3Œ1ö¿ú˜«ó':±é̪[uصv-Ñø_k JÐØØ®´Q±]ÇÂÞÇý£v]CÔ}uß?içŸä®dîþÜ@ÐH#N Ôvµ Ð÷ô=’HÇ6뉔Åã žÁŸô®ül_Ÿí{ìó|Áþ /x„Rè*IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-193.png 644 233 144 3060 14774263775 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜåIDATHÇÍ–mL”WÇÏ00ò$£²u)Ô]5MŒ(‰f#˜…4¡Y„@kk ¶f…nµMX%ÄÚ”®¨lÚ-IU²"º@º(¬T^\›ŠÖ!ÓšÔmvס°VÛ2–— 280ó¼Üß~`žÉ6ýîóerιçÿÿϹçž{DDä±ø¯@RNRNÒše;é·Ž?õ™ÔgÖu-Û'MpU¸*þuÒZÓZÒÛÓÛ­€cÛq{}b¾ˆƒŸÈgûå1q«zVõ¸vÆíwàù§Ÿ:õgËö‰ õi} 8péÀ%€ÞŽÞBp48 ÚÚ ŽmÇíõv¾—ˆ/ïü¿¤ ¤ ¸þ «<«<"W’WòäëË þó$”=[ö,ÀwîïÜ* ÌiÀ‹W턱¿™ÛŽÇ×Ûù6žoóÙüËz2‹2‹D ü…ò´3Ë ¿`Ôg×gÛ|z¿â5^ÃK‡1d ˜ fQ>P•ªÔ?¬¯­¯¿ªCê€yÄúÐÕÏ­2« (ZƇªÌªL`Áæ—ÄfûåŸ@ûAû!œ ã ã À”‚º¥nyø ²:²ô6ý#ý#GH¬7Öë…™«3Wg®‚ÕfµYmN\¯Ñkô˜þõtñt1Çc]±."ñp)_Œ¿?þ>€ÖÂád[O\ØÉϹ_{ ö€ gmR;ôMú&ý1ôqècÔ¶æmMÛšàÊð•á+ÃqIVIVIhZ‡Ö{7ìݰwÌš;5w ë ë ë }uº'Ý•VöVö¢b‹œœwø(¯¹]sÛŸ'-×­ _Š ‡ ‡ãe׿ž¥ê¥j‰•N•úJ}âòñóÉjÍjÍjéœíœíœ™Ï™Ï™ÏYÜ·¸oqŸH°-ØlÙÙÙñ†¼!oHd¢sâÂÄÿqÿËþ—Åõ¥÷Ö§·>•˜Í§òwtïè¶ù úÖŒ¬Q=,Ÿ >â½rÈÊ·òÁ\k>n>›=›=›=pmÿµý×öÃõ™ë3×g 7?7?7ºvì:i[Ó¶¦m…Ó§3N'ôÞöÁíƒÛ!c,#€é SoN½™Ð›ßóý7`ëIq—¹ËØ(Þ”ÏR>‘‹ˆÈ¬|(C2$âºï»ï‹x|ŸÇ'²0²0²0"R˜Y˜Y˜)R½»zwõn‘Ëë.¯»¼NDkÕZµV‘qÿ¸Ü/2V2V2V"Ò¯ÿ^ÿ=‘µÇÖ¾½öm‘¡ØPîP®]!™U¡ä³ÉgEl=I"Ö'Ö'®;‚Qf”‰ˆ.""™®\‰Ù…‰öEû¢}"ž]ž]ž]"wÀp‹ œ87pN¤h²h²hR$·1·1·QDËÓò´<‘ò›å7ËoŠŒŽŒŽŒŽˆ„~z5ôªHš/ílÚÙøLÙe´í"ŽDD¾ªƒîÝ€ÚÏoŒ9cލ]êÃo<¼üþ …³Í'šO4Ÿ€üìüìülôz½N¼©§©§©¶è[ô-:œ™;3yf@T€(çã|7ºû»ûíæÿªÎ9•Ô¾UûVÂ)ÁÎDWX,²èâǸË]î&øÛi§Ô”šRS$~::0F˜0ŠŒwwøÌÚÆÚFçT&α  '£Æõq°ì9fÕ[õD¬jë=ë=PQ5¯æ6óŽyǼæzs½¹¬«Åj.r‘‹`þÞ|Ã|Ì?˜—ÌK`ýBoЈðwÂ;á í[íÛÍ1{жCUjUª3ùÁô™>à¡õœõ\ü_ƒ Œx-- J4¾ñ •P!÷-Y/Z/¢¯à­àÛ|?šü?qWRÿDý w%ç8^g‹Í—Ì—ˆ‚º¡nàÂŽmÇWZ"ž¿rWÆñò®|d_ì{ìÑ|ÁþlÑÙ gùqIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-30.4.png 644 233 144 3152 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýO”WÇÏ€â̆‚¤º[3I‰UC‰7m*Y¨i´‰X×ͪÛÐ]Të¦mLLq)ˆµˆ¶8n€È4¥5[šºš²C•wG˜çyîg˜y˜Iý¼¿Üœ·ïùæžsϽ""²Ô¿ „¬ Yá“CÞ è­iÖ´¸ >¹JËnËîþ‘G~ UUgÜȦÝôŽ àç3õ²TŠ%MKš,É~¹ÞHx#ÁºÌ'ضf[ó# …€/Ï}yŽ?ÃH÷H7Àdòd2dÓnú›ñ&^0¾”ÿ*¿,¾¼ø²e–„- ûûŽçÿâsx^Ïx=`8t8T…€> „®’Ì5$›v¿¿oâ™øf>3¿@ô+ѯˆðÏÌ©Ì)[­/àögœ.©.©uÀÛÌYª¨"t‹n>ÑfµYæÔŒÓÆiÀ¡œÊ  n©[€®ïÑ÷0‡¦Mj“ÔRK8ÿðãE–¼Xò¢IðögÔg™†­¢ßŒ~3PSÿþÑ«ü6{}özP¿ð~ üÄO ¶êóú<^Õ¢*U%J-U±*vá¤P¡*T…¤B~½ÿ5¶Ûñª?i/h/˜jï·è9±9±&Á^ *¥ˆÈšÓtÚêmõžE0°r`%xß }ôå_j©eF{M{G{'iÎ=çžsø}Ü>n• TB•Aîó3?óþ¸Ã3Ž3Ó+{{H‡>¾±UÙª<‹˜òñe©úé‡t˜ú;Lë_Þ¶=~{Ørm˵-×`¤v¤v¤V\urÕIh¥•Vž\Wú®ô]é 4NFFÚDÚsþJ®úæúf ÓÇG˜ŽpD8T»Ý'Ü'@žÚ€¤Ž¤ö¤vX³:fu ”,;XvvæîÌÝ™ðOiIiIiSŽSŽSŽ€~ôîèÝÑ»™™ yïåUäUÀk éÓüôÿ ÇÇ£MMª)„O-S–)â¥ù™ÔgRE~Ðûõ’ñÞ™Þ½+Dœ=Î^g¯Èò£Ë.?*ґߑߑ/bͲfY³day5¯æÕDÂfÂfÂfúºòºòºr‘ββÎ2‘ÁôÁŒÁ ‘λ¦\S"Îù¶¢¶"ýݳÏNˆ¨â'ñ!ê’¾_ßoùQdqëâV‘›¸é¾é–輩¼ïò¾énínénnnnɬ̬̬\7¸npȱ˜c1ÇbDÆïß¿'’˜›˜›˜+Rã¬qÖ8E¶žÙzfë‘ƆƆÆ‘¸«q]q]"˲–Å/‹Y“ºfhÍD‹<Òi"–¾ækˇþëhhlh\¸ÝÇ­eMeMÌmònšÞ4 5¹5¹5A¥»h¿h¿h‡¤ëIד®CûPûPûLWLWLW@fufuf5¸7»7»7â:Nuï8Ç~SúEéA=öUý¥úKÀc³Ç0oeQAQð/ß-Aé‡õÃAshžYfAõ¨Õ´ÐBKPwŸå,g;vìA,U¥ªTоÒÚ´60.·Œ[(*µ÷µ÷Aíòç£èó¢Ï ÿ­äŽŽa»c»ãYÄ'ýÛú·~Ô7ÇôãóŽy3Ærc—± ¸I7Ý`l06@ߨoÔ7‚á2\† 8Ïy΃j„¡@ïònQ§nÕ­Ì~|è©ÿ%`ÖÖoë÷,Bóϱ'&?9Ö+ ü“yVwé.c¿±ï ‚/0ÏœY¿ÅÀ¦c 0L£À(À˼~U¿ <4_¾''¿ÿ­$kOÖž ·’·Ÿ{û¹…§£8Á ÂAóh=_ÏgT—êÀ‚²i7ýÍxÏÄ7ó™ù}|žæßÅSû{:°ÿ¤0>¨§w IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-21.4.png 644 233 144 3057 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜäIDATHÇÍ–mLTWÇÏð> Œ|i¶¦II©©%6$J&•¦Äš1¼Ê2ËÎJ¨ Y«ÛµËFZ6EÛj×*Õ˜6Õ†Ø`;šH…a‰`Z¡Bú‰v›-ZÀ¢‘j[fpx™aî¹ç·f®w²î‡ýèóåæyû?ÿ{Îsžs!„Xù ˆY³:&5¬ÇüÑ´'9’égÃúI –KÉ¿öí}ÛûK?^ú±~ÍÔ ¿/„‰]ϰ‹%Â4$6'6[r#ú(Ë,ËLZÖöµÕÚ:«Á޶m-M-MüîÜðåúrÁÔ ¿oäxÑøâÀÕâ/Æ_´Ü„Ä„Ä!à±Ím~üÕpÀèãP”_”0;«b@NÉ$«\ÀC¼QºáÄùžoÔ3ê‡ùH{>íy!ø°xªxÊz:œpíS>ªnªnu ÔÊÛ4ÒH2hÚ€¬’UÉÑÑÜê¬:  ¾WßRº¤‹ šæÓ|œæ4ÉŽàÙªŸ®~Ú xíSÜÅz±n= i/¦½hîiäÛðO–æ”æ€z ÔH$¨ýúKúK„Ô-uY]F©vÕ£z@ýS}£¾Á”™ÈŠ)‚ï[×õgõg ©?iZ†aõ#++ ‚ /Dm¥B¬9A—õŒõŒ?FŸ}B¿ o⩟ÿ|˜¹ÐÐ…ÐÙéÙéÙi…ÆBcQŽ&gX›ƒ™k›kcnú‘yÿ¼Ÿ<=2zøÊzÒzÒÇT˜PÙBqò+xåÈ+GàÞ<€þLgË'[>Ûv[­­•ó^ΡœCà]å]å]~·ßíwƒÝiwÚб»cwÇn“—¾^_¯¯¹L.“ËL{íÚZG­µ9ûkî¯÷£ŸÑÏíHß‘\óÚo„b°ºRºR éÍö‚öUùdZzGz‡¹÷oÜ¿q?ÔµÔµÔµ@ÁÞ‚½{ÍFè.î.î.6 ,L.L.LšzÏpÏpϰŸŸï˜tLøªR¿ìnu·_„ùV§ü˜ò£j†‰Š‰ øe“¯ÐW㣷ÏÜ>ݵÝot¿‹3g,†+¥WJ¯”š³j²j²jÀ“éÉôdF­Ø }…¾|¾F_#8l›ÃÛn{gÛ;P™7“7cÆËŸÆWޝ&R›S›U³ eIÏ’}ˆßz³½Ùæ±ÿ›õõ™×g «>«>«ú{û{û{ì1{•½Ê^ž2O™§ìACrCrC2Ä={²³³!)x;ñ6´;_î|/ÌÇÍÇ^˜ZžZ®Åèßiµƒ–!ѲèB´÷ùèç£"íÝÀÑ”£)B”ÿ¡ÜUîâÖ©[§nâzÍõšë5â¾* !ˆ'žxÓ~ÂyÂyÂ)Ć „8îü¹óç„H¿šÞ—Þ'Äò­Ë×._+ÄšMkn®¹)Ò„˜Õf5!,©ôÒkò¯FµooßC_»¿v«JÇï77 æ-ÍKÌK„ucëÆÖAçpçpç°¹"{Ží9¶ç ÚíƒvTªUP´«hWÑ.¸ãºãºã2㻎uÕuÕÁ[‹j/Ô^ˆê±/Ý·˜7z ãTîܲs‹yJ@^’—˜b Åÿ+÷¸Ç=SUù*_åƒö¥vI»úEý[ý[h‡´C  z;?Ûù09•´DæÖëˆ?N]ÉÉù÷ð“?,Ì.Ì2'Ë^Ù ê Õ¡:¢š¼D/ÑK€Hnpƒ 2 ÀAö±/Šè?d’LbN¯ ãÃÈs#Ïp}´È{`ò/8-N ðo€P?S²Kv“z¡^H(2(‘áþ¤×ÐÐÂ\Ñi¼x!|_¡@¯Ô+ ± ¯Ê«ÀLg’3 þÇäÜ•lumuEÝ•¼öèkÿjê©'4¿æ岜 ¨>Õ€ ˜ºá7â|ÏÀ7êõÃ|æ×ÅCû{8_°ÿ ¸I]¸ÞIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-73-red.png 644 233 144 4210 14774263775 15614 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü=IDATXí—LTWÇïû1èTÜl Ê`k\]Pȸji×A0‘jPƒ’ ª±Ý&(Ú±m*Å-‚Ä­lJ£KV©ÒqžšHÕf –Å4v»´îþ°236¡pœ÷Þýî3÷½7“®f³{þ™9÷ÞsÎçÝó}÷α$Æø•S¤)Ò‰{HLhKhKhË[!*¢"*=$Y$‹d‘iz„ˆD$"óXŸaëY<ËÇòÇÖãWÆòù*H©àݱó)¿ÛÄ6±Íý€ÛËíåöj –äÑäÑäQüiãÝw7Þ¶ôoéßÒÚ í…vÝgól=‹gùX~VïÉ<„ÿM¬?÷?Æñc¾,¶CieieieÊÛÍ·šo5ߢφÃabãàƒ>@ó£ól=‹gùXþØzs=™X§ó|?ßï»ÊØoÚOÚOÊ/y&=›=›áAÔhM¥©•*¹J®›,Ê" äË.Ù(6e³²Pª”d% ÔLÍY¼gÒö„á±ß´ß´ß”_Ò€ø~€Õ·N×Ð87çæÜ„ˆ‡ÅÃâáÖïX€ãˆãSǧr¾ö®ã:r+ÞÇûõE'&Ø  j/ÐL¨!5¤¯—[Õ ê€¾£ÚTlµãˆã ã œÏê3ÆGL÷M÷M÷×ýš-°ÖXË­åtžwÈ·Ó·„òшoÄŠ@À\m®îŸé7Ô{7toèÀxý}ÁÑ‚£Gõ'S<ŠGñðÃ?ÀPJ©qr:r: üÝòwã;ªwT€{‘{‘qüò±ËÇ ¡$¡€ÿîÅ»Åc\ƒ ãa|QP|YØSØSØ£ KY£ä)­…€‰®‰.c®Æ¬Æ,H²&Y`¸~¸?cããðò/ÿhÜùM-›ZŒE Tê=^)\Z¸´p©vnÉv´xEʆ è q!.ĸ€ ¸ŠT¢ ¿Ÿj¥Z )¾|pûƒÛF0ù ù £ÿøÌã3ðùŸÿ¯W½^ <íÌ´3znó·y€f´^Ù“ìIö$ô1>Âçóù|þäOìª;UqªâT…AS'L&CÝð×[¾Þ‰­‰­Ð7Ø7³ƒ=ã=kÎ5@gg¿ñ9ËËõUÎ7?Ûü¬^ïzýµîkÝÚNþ–Ëä2¹ÌÉŸˆ°LX&,;PÇÞ²ôçÓŸO^™ëÝêÝêݪ%ÐÕìëöíÛ· ¶-Óã TÝÅ-‹[ÀvÇv®®»º@púþt¯ B#|ûÙ·Ÿ!ŒF-9°pháª]BŠ"¤œxHsss oˆ7Ä®íÀ/\3´fHÙ§5ÜÕ«d˲e¾ÑùF§l²g²Çè÷VöV@FMF €@T›gúgúõDëÅÖ‹z«ËþVZ[Z«5À]Â.a×?‹"¾™½õÌÒŽ›2M™¦LßIà¬rú~}?å¤ÁäÁdP Üî2j}è€ÈÍà{| ¬¨0zô> ”†¾ }¥·úìØÙš³5xU»Bëø:¾.”ÇÍâfq³5Ç ×®Ô®„+YÓĹ8çbZQË¥©Vª…¤iwŸš¡fDØ!G„0£T¤"ÐrZÐÕÔE]º”\– >Õúõy·¶“ÕB¥Péthhù$Ÿä‹V5‡ä±š¸‰›¸ ü 0øöeíjm²VZ+e‹÷=Ïmþ–èjšCsŒ€Qp&: ó1 Ej¶š9è`Û_·unëTöi7и8&ŽI‡R÷¤îIÝCï༃;¥+e˜Ó¢ŸEBŸÐ'ôqWæíŸ·Þ~BLe¦2S™tHÓnŽ#Ç‘cÔ®êTC‚ ÀF0¢s+ ”Ê]‹ Ë–7,§«µ»Üb²˜,¡è¯¥©±æÚãZO¸8·+Ö·Nh×{Þ Ý*g•A»Ù"[t uPTõc+Ø‹^ô’¹×Ükî¥5M&ò‰|âk¿‹“âñ8¾)äÉBCœv7þŒv;¤]»r‡Ü!wh€áÇ©S§‹G.UækZ<'œÎ}œÍ¤•^<à/ÈSL_ÀèÚõ ~ƒvë­õÖzÙâuy]^"n£ŒÔyÅyÅyE?vÄ&±Ilêþ%1ÿ%®ntœ<ó4Àxc¯Eµ{é?iwÕúUëW­×µ+eKÙR6NGæ©Ö ®˜+æŠ×ˆ-ÃÄÕåÈiOÓîJ¡N¨ê|6\\S\S\Cÿ1‘1‘1!ÿCkµ_ð ~gi%­¤•DÁWo ù-^»‡býU÷¸Ün@Ö’µd­ºŸÍÏægáGþÜ•L¦ º…n¡›» ,ŠëÜÿÍ,Ú·\’KrÅïb§ß+å)Oy pí\;×þ¯9‘ñ_JqñÄå}j«ÿ ®¦æwÖ_»›IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-22.1.png 644 233 144 3114 14774263776 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–LTWÇÏF`ŠY61±ÐXÓt£TeâhA(­’-¥ÓÕuMê?µm7›ÍJq ¬«üÑZ’6%Rclh!¸‘jÊEÄ’µÝÆ”Ô!ebLª†! ›÷îgÿ`oÚýoÿòþórÎ=ç{¾÷œwν""’ý ÄeÄeÄ9–ä¸rKŸ´+i׺ Kr³¶Wm¯Þþ<þÑã¬údÕ'Ƙ%›û¦}¬¿ˆ…ÏÔKšXŠÄ‹‰mEQ¹ö>»÷Ù¤_/Éõƒ`o··ÏE ârÅe€K-—Zø#ü8üã0@°(X–lî›ö¦¿‰‹/µ¿ˆ/+:WtÚ|øXâc"ðä‹O¾øÔŸ– ÆŸ‚²—Ê^¸/^Å€îRHQE@ˆ暌‘Íý¨½éoâ™øf<3þôÂôBN¿2ýÊ´ýÜ’ÃØyÎT¶T¶€ÐÚ©¡™fR@]€#3‘Ô ã¤q8¡N¨궺 Dô}ú>ˆD‚‘ g8C ®(^kåPåIpì+ù 5ŽÓŽÓ¨Â……àKô%úÁíq{Üpìpìpì€üúüúüzxž€Ç"bÄñF<ß¾|¶½¿­m[ªëÏW^¿òú²ÕfcGyy¿™¹æëY#"r«zR{R¡åØ¥_”ªϤ¯ëZ×Å‚éZZQZQZÙÙÙ°=s{æöL‹€ë°ë°ë04Þm¼Ûx×ÒÏlšÙ4³ ¶ÙzdëëÇé-ûrúËi_Ð#ç'ÏOšÄnUÆ%Ä¥þúCvžH¶;Û-Rrã9Ûs6Û¹Ž ’ØÛÙÛÑÛ!2‘<‘<‘,rtíѵG׊tú:}>‘n·¿Û/2åòNyEœMÎ&g“,¯•Y+³Vf‰ y†‘›n^¸yAd>s>s>Ó*mqJqBq‚HƯÖL¯™–ÅhÞ°­¼?x_D$T*úæ+1»–,±ºô«úU¦™&ælÿ÷Z°Z ‘PdùÆ06ÃÁcÅt%—¢s »×î %¨y^'è'—æŒþïÅ‹ë}A_£Õh1Z@÷èÝúˆ>¢€Þ¢·è- ÊU¹*c‹±ÅØÔRCMÌ¿·_ëÕz «isŽys¼9Àœ}Ü>3Çþgò/î±í±èdê=z4ÊŒ24æ¢'ò?A¦˜¦¢ßò˜!@0Ì ŒhÌéýz? EñÙ“´'ÉÌÔÏ&ô®Ä½Ï½/æ®äí'Þ~Â<§Ö¼Ã;¤X%Ð_Ó_cÔ Zšì6l`ÉæþrÉ¢þ&ž‰oÆ3ã/ß•ìëâ‘}=š/Øÿü"Â=e¤xIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-15-red.png 644 233 144 4145 14774263775 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXí—mL”WÇÏóBAœŠÐ¤  k×u…b|š2ƒ8€Ù©5´1¦n¬ûAE;6­¶î¦m0KŠÖ†VìJqF¢kãF2ÁИS7!©Yf&ÈÛ) /Ã0ÏË?0÷™— f³{¾×Y^$Ê¢,Ê®¯i%­¤•ÀÌ´ÚH"‰$2ˆ÷ÕF¶žÅ³|,|=ÞÏËWKµTËÛãç3#vŠb§ý1·ÛÇíÓ@Ò2üþ ?®VÞ¯¼_yØò`˃-‹Ñb´£>›gëY<ËÇò³zOç!¾8Þ_ÜÂñcü˜w%Û¡lk¶5Û*¿×z«õVë-550  @À$Æ1Žq^xá4?2ÏÖ³x–寷¸åé|¤žâ‡ø!ïßXc·±ÛØ-½â»Cî܈˜š¯¨Š I>,µH-€¼J.–‹Ù,WËÕ€¼JúAúKïJïj¾ªWõX¼;ì6»Íp»MÆ&é xˆäY}ýógçìœH¬ëÅúö»,ÀÔhj45Jf ì}µN­C@j—vI»Õ«|«| `š­À$&(š/CŽÎ«Þ™§ÔŽƒ8¨ïãn À›M_˜¾Ì¬>ãa|”4˜4˜4ø»5l¾N_§¯Ss=¿xÜ7F#yògá{á{ ö©}Á¢` O O` [Âð—úK&M,€‰ô‰t@þÌïò»´ÅÏ/^“ׄQ}~¯~¯šËx4>q¸GÜs»žM¯9^s¼FÝÅvI²K­R+È’,±Ü-ýh)TtWtÏzùûËß3Ç„Aa@ˆù)Á” Ù®\våxMËå–Ëê.mgãøHõeäeäeä¡ñqùãòÇåZ „öïöÝí€W­¯Zc^/z½h6жSm§ óbæE¸î¼î€®ü®|‹yóäŒëÆuÑzˇÏŸãã#¤§ VƒÕ`¥ƒÎ g†“‚ŠGúNúŽDrEVÌS_R_""*8Xpˆh{›ˆ(l iëuõºˆˆæ_ŸˆèÇàA""_ª/•ˆæ™?4HD.ݸnœHñ(&ÅDb†ó…ªª(Èx_ä‰K—Åe‰jF–7Èä ±;”èWLVL€¡È0ëŽn^³yMìΗö”ö@jOj,)XR`l¤z¤ÿ,[V[V[VkïíK¬õÕEÍEÍE͘⦸)ÀyœÄI¨ø=Nã4€€ÄK|l®òÞò^0|jøt6оä¾dè}Øû0vÜýŽû­º¾¹ôÍ%@-¨l•1ݘnLÇã#ÞÌ›ysøçÈ@c[m[m[mTÜrŠœ"§€¼_Þ{˜6ÞÚx _¾Š Π΀ÓO?€Íšc¦¥±Ü±\સ*@>wtÕÑUÑz7šºF»FµüWÀpáŸIX+¬Öj`§,gQ΢œEòbO•§ÊS¥%¨¥áºp]LAµ"\€â ÅfÛÑ—¹—9È/Ï/€®y]óL°°xmnáÜBpջꚌDåZŽåP´ @È2…Ì/GIW¦+Ó•‰7Å›âÍŽ!í…o1YLy?+«Ø¦šþ !8ØwóØ›Ç`ãðÆáÙ@ïß/€Bg¡@ ÒêÑ%Á%A@ùò‚é‚)Újëš·kÞV&5ÀÂNaç?·Îøs| '5ûXRARAR÷$ °¶¶VKµÎ¥ËçäsP±¶±6»¿=Žð ¼hB€ê¹•[[¹&X¬Œ¶úÌØ™Ýgvã5í màø†©rn·€[ðÛÖ@áÚ•ºÛÎmßp‚ëà:¸¦e·Ãép:œÑý”÷G4Ë,|±ÒP"·©ú¢ú" –ªçÕóQ) u ee9)ú;ú;Òm'?>>¶™443™É,꣬%TB%â'd';Ù‰Ÿà|ïýU»ZOè?×.¥y>ð4{¢‡# –*›•ͱ€˜Â&:JP¨[•b¥8z·õmëÞÖ-ï×n qqLsÉÚ›µ7k/oâM¼‰;¡«a˜s#ϭ€0 pWräÈ=@”dM²&YG4í–˜JL%±ÚUlŠ !8à€ÀF0å–—ÉËäeQ-666ª¥Ú]ž–”–”64ùµ”ßiîZâ5Â%¸=ñ¾>eF»žsOÔnš”&¥E”GÊ#åQT‹ýèG?à˜Ó?§N¿Z©iRÇëxÝ[Jâ±¾dzú€Ðœ ÝÊgiWrJNÉUn0+˜ÌVøWøWøå_kZ<+œÎþy“ZDz‰€óè]À[6µS;µSäµ#xê%Óÿh‰Ú=ï¯ÿ·ƒÛÁí¨‚*¨BYÎ/äò Ž8âèzOÎdÎdÎ$‘p[¸-Üæº"[:÷³4íS•Q™x7~úƒ^åU^¸kÜ5îÚ¿53¾Ô‘ÐwBÞg¶ú? V§W²Ï”³IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-18.7.png 644 233 144 3053 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜàIDATHÇÍ–ÿk“×ÇOºtmJ×6­eý‚‹sé­õNüe޹aõÆÈ¦ˆsǤèîR¿À½n¬‚xi½ÞÖÒ9ê—[¨+6t™­…®,¬:dU¦ÓÛஷл°¤3µIº$Ožç¼öCòä zÿÏ/‡Ï—ó~¿ŸÏyÎçB!Ê2³€¼ê¼ê¼’´÷¾á/|³ðMÛiûœ ¦¦wŽCiwi7€õ’õ’vϰõ¸žŸ»^?—O÷‹2a8 ÜnÓ¦ŒÝ»êvÕ.OÛ×Áâ±xb)ØuÿU€/û¾ìã|ø ¼)¼ [ëùúz/_´=Æ/äæšþ Ï<+Ôn®Ýü‡é„û/€s«s+ÀÜ3sÏÈ<PC@1År!‚>æsl=žÉ××ëx:¾Î§ó§õXöê²W…×n×nËE!„¸×‡«W¯(þEmƒjVÍ@w*šŠ’SZ‡Ö\”—ä%yKÞP÷«ûIПêOõƒ¼ÇŽP,çÓx2ØZÑZ¼¯ó¹&]“–‹°¼|y¹±§™ùôëðVô­(È”Iy›C³r…)¥DÊj¹Z®ÎV Y!+d°–µ¬5üĉGŸó9 PI¥T&a×ø®q½‚§_ÏÙJ!„°w%b‰DÌ|ï?ã?“…mŠ-DË£å,)=JÒcð%Ï&Ï&ÏBÐtªKÕ¥êxb$·$_K¾¡«¡x(ógÝüëf–Â3‰šD Mñ.ÿ” À¢ZÔˆYþ=­Gð£BœóAË'-Ÿ€ü€æÿ#ôièSØphÃé §‘ãcü fi–fh*l*l*„¶¶6pÙ]v—¢UѪh•!lÔ3êõ@Ùî²e;Àþ7ûgöÏùnÓÓè^ÕßÕߥ9àÈá#‡A©LërF!¦[aðþà}ˆÝï½r¨±¼±œ„^ש5Sk¦ÖÀ„sÂ9á„U§VZu nï½½÷ö^°õØzl=067676g‹m‹m‹mƒ˜7æyÁ·Ó·Õ·j«ŸÿöùoI̹–j—jå{0444šLëDJFJF¤›ŠE ?Èœ£•ʬ2 ÿiø¹ág¸Ö~­ýZ;¨Õ£zÀnµ[íV(m+m+mƒúƒõëBðJðJðŠ!,u3u3uÓ°›j¾Ó|þù—3õgê ¿ªÌ½<÷2@ÉDÉ„t °>g}N»ËÐ|×|H-{ìhœlœlœŸôIŸ„ææfØèÚèÚè2€ûûû »º»º»úÉmúÁôƒé`;`;`; 'Ã…?Êi3ËBÉPøÝj¶šµ»ymX6ÝвEÙ"„©F!IJÌÙJ‘R¨ ‘XL,&…XYº²te©³çgÏÏžb¨r¨r¨RˆðBx!¼ DÑpÑpѰ½ñÞxo\dÇ`û`û`»Ž««…(û«µÓÚ)„v!Ã÷?µAmBX´o´oLw3§rº•_| lKÿc™/Iµ­9Z7:ntÜè0*Ð9Ò9Ò9ëëëÐì öáaïÃÞ‡½àÌwæ;ó!¶'¶'¶NÔ¨;Q#£#îw&¡}•áK ü6ð›Þ6¦[3ÂÎù åã–õ|Í©H*¨é6•…j§v`†fröêx¸qãÎñ«¨Œôø$”?åÏá“-Ç[ŽëÂÎùŒ>&-¿X~‰˜ÑüŠ_1ú˜Ö¬x/KRå%^J£ zY½¬^õ˜zL=Ú:m¶ØÎv¶ƒfÑ,šø>Ð~ÐâZdsÊ›ò²¤ãó/ú,K bÖõüŸÎÿvÁÛ99¦Ž©c€¢½«½‹.YI’@‚8ñœŠÈ´p"”ãj;µ($T¯êÍÁÏò=Ñù»+yì®Lx€“œ¤8»Å¨ï¨ïy]^À„ [ëùúzOÇÏÞ•þ´ž§ùuñԾǞÎìkÙ@›ü"‘DIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-83-grey.png 644 233 144 6264 14774263775 16024 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü iIDATXÃ…—}PWºÆŸÓÝó­ «;%a‚^ÃG@#òášè lÜ"AI¢¿ÈnYšbDX.Ê5!¢EÕÞ\!x# hfˆÞ×ÂÏìÁ D#à 3ÓÓçþá4©Ê­TÎ?]§»ÏóþÞ÷<Ýý6ÉÏÏÏÏχ/ž Û³³„»ÏÝçîÓ–üêüêüjP8T8T8ô§yÔúQ¿ƒù@>Œ~×Ùàlp6ШD%*I.ÂŽp]èB€wñ.Þ¥dé²tY:Éå~ä~ä~¼YIFÉ(ÝUQ0«`VÁ¬ÖŽ¢ì¢ì¢l2ȇð!|YñŒC¸äåòe¦€æ¤P( …Â%×S×S×Ó™1………'û\ƒ®A× éš}¡}¡}aôßUeª2Uš¢—E/‹^Frc%±’X £‰ÑÄhq.^ï׋zSúÞxb|‘Gäã¼|‰úPê#d‘ dÙRƆ°!lÈùãOkžÖ<­yNãoò7ù›<;–u-ëZÖŸ#Í‘æH3ÑËre¹²\ر»±JØa‡ÀÛxoB‚`wjZ§zs›¹ÍÜFÝß…þ]¸°ãçå?/ÿyù›Ÿ(C”!ÊErÏÏφÔ2j j¸ŸE@@À¼Dò&ó&ó&´¡ mÚé\×À5´r9\—㹕º¥º¥º¥|BFNFNFwÒwÜwÜw:H ¼p[¸-ÜGI"I0 Ó0 <€ÇxŒÇññ€‡8ÛtÛtÛtôԕווóY={.ö\ä®JR…TÑÛ̧óé|zb&‘ˆÄþqFq]q]qH$ÿø§½ÙÞlo~n¥n•n•n¯7d² ÙÜUõBõBõBüA‚„ n¸áÇÜcî1÷|Œñ1@ä@&È™0ŽqŒ" ­¢U´ PoQoQoÁD}]º.]—ÎëÅø"ÈÇðü?±"Æõµëk××Ù/øgøgøgÐÐŒúŒúŒzNôÈBŠPø`œ³³³^Í«y5@Ö“õd=€b£ÀÆ0 Qˆœj§Ú©<³=³=³ÒKzI/|DýŒšŒšŒî¤_äùØä}Éû’÷}þžSãÔ85Ú¥úSúSúSøáùºç랯#i^¡iã®q׸ ¨6V«@cVcVcpEzEzE ¨ªªAo½ô0Ò5Ò5Òœˆ<y"h¾Ô|©ùpõ£«]ý˜>1}bú™||| É^É^É^Ü3o4o4o$«%:‰N¢ {Ìð¡|(úâ&¿a¿a¿a˜Ÿ8?q~"1b36c3¤^P˜T&•IŒöŒöŒö›ÖnZ»i-ŸŸŸœ)9Sr¦pOº'Ý“@à ?4ü<){Rö¤ غn뺭뀨£>Œú8=ÿôüÓóûkö×쯉Q ,,,'F‘Gäcœ#Îçþ+¸$¸$¸¹Š l(l(làÆ¹qnp¬r¬r¬šå”/(_P¾»È#ò1ØýØO™Z¦–©Z C 85GÊá”Ã)‡žþžþž~à`àÁÀƒÀ±ÇvÛ „‡‡3ógæÏÌVžYyfå b‚¿ þ6ø[8a„F(Ïž:{êì)!¼B^!¯0WII"IÇmLÀ…€ Š÷H“¥ÉÒäšþ‘u#ëFÖ±=uEuEuEžíÞL}^·¾n}Ý §f—f—fpâ艣'ŽíÚ/´_Vï]½wõ^@ë«õÕú™®LW¦ àê¸:®ø,ⳈÏ"€Û·;owK3–f, 2ƒŒÕ/ª_T¿H°?êÔÿ¨Ÿ¹*ýTú©ôÓgºûÜ}î¾n’÷ ïAÞíhGûH†$C’¡KŠ Ó„iÂôœ!µ#µ#µƒ¦¬è\ѹ¢“\ éFºÔ=Ã=Ã=„f£Ùh€]îa×ÐC=€ZÔ¢ u´ŽÖ®s®s®s›Ãæ°9·„[Â-ýûäï“¿OÆ_jnÕܪ¹…³ ‹Â¢°L.§,e)ýD w73L%SÉT²×™CÌ!æÐÀß‹`,\ÊVe«²h{µíÕ¶Wé˜SÌ)æ|A*H©€C"H‰°ñl<ÐZBK4¡ M4Ð@Ãä09 Èì2»Ì>86vyìòØe(›Ê›Ê›Êy¤[Ò-éˆØˆm@âI<‰¿»¥(E)§õ¶yžØg}#÷)#e¤ìB“Ì$3É;°뱞9ÚÝÝÍo±í·í·í‡’ ÈŒÑ+ô ½d'Ù9õM\pÁ༃w:—Î¥sá­Ô|¶ùlóYÏöÑc£ÇFqGdZ™V¦ý¢hNÉœ’9%ŸœG P@NÁ ,|ªØªÐ‡>ôñ؆mØFæžwzÞéÒ?Ë7É7É7}Q4ê?ê?êÏÙê4uš:Í/ÞÅ0†1 'Ì0à À 纃î ;@I1)&Å]¶^¶^¶Ò”öóíçÛϳ¥ªªªý“®“®“®“wttÔJ­Ô µW¦Jµ{µÂ4aš0 ê;î<ºópmsmsmû Xå§òSùݯíjìjìjdK[Ö´¬iYCSHÉ!9 Ÿ Ÿ ŸƒB}BŸÐ'á Ox8[[[ñ…iiiÔªAÕ jâ„8!îƒâgÖëŸôZñˆ7Í ™{IdÞ©·&l)L0ÁäÙNHIHùó³_ŽógÜ[Ü[Ü[„¿¾)¼)¼)0K"EŠ<„t¡Sè:¡d"˜&N>—Ïås!+++óÌŒŒŒgïÉÈÈ”.zöÐì¸*£`äŽxwöoâŽaL¬(¼'¦<äõîv¯wx½ûõ”w 0ÀÀmt7ºÝü[…­ÂV%Ã0 Ãà‰X‰VG«£Õ!ØûýÆ~#{O¾G¾G¾§£É9àpìùäÞË÷^¾÷2àÔy×)E@‘o ôWÀâ J¯À¿¼Þ=óÿ¼88ÈÙ¾Êÿ*ÿ«|ÏvÌÁÌÚ¬1kÌœh»Þv½í:ÉRv*;•€ t‚¸7¸7¸7‹CcCcCc™o<±­tüš‹ÅoŒ¤¤¤¤¤$ðÞ©™J©”JÉÖÁ¹ƒsç⿟5À×xY¨,TúúÑŸRJý)UsÚv×v×v—~|§êNÕ*ÏKî ÷„›Ý&Y"Y"Yò¾–VÐ Zñ?MAÛƒŒ`DwÀ[(þ×<¿3~û…hA Z<´6І$ SÏÔ3õÿ:¹zrõäja®Ä(1JŒÌ]ÖÀXÃwÃêÃêÃêÿ”dµX-V 9'Ìf 3éq¯n£Ðþ[ ~güÊ»Þ×…§9ÈAw“d“l’ýÏ0ÚB[hË®·ÁŠ`E0s—ícûؾ`á pP8¸åQgfgfg&ð ¡^=±±tüÇÿšM䬃vÓ“IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-97.png 644 233 144 2502 14774263775 14711 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü÷IDATHÇÍ–_HTiÆ_g4$GQÁJ¤$\Zª¹j‰ÈX›Øb¦ "p ÿ•Á¶x‘í…m„‹ %SH…¦„BƒéXÁ²©;ZæÕ’T»‘ä2-Îjie3sÎù~{qæÌ™]l»í»˜áý÷<ÏùÞï¼çWâ_ÀQâ(q,7mG½íÏòdyÊzL»]‡´½i{ûrý¹~€¼Î¼NcÒ¶­¸•ŸZ/bã§òY~q‰íÈìÍìM«HØ-°ýþõY…¦Ý:ÙìÀ[ ÷î¸Ùu³‹o!<˜«˜«Û¶âV¾Uoá¥âKËøE #˜L{™Ë2—‰@ieiåšïÌ„ß×€w—wÀ´sÚ© Ï9ä¨ `¬I±­x"ߪ·ð,|‹Ïâ7õl+Ø&{ì9ÝaL^ƒ¦UM« Úi'¿vV; j\+×ʉ2¤ZT pKõ«~PŒv£Ô‚V©UUã³ñYà{šh"Ç 5­lZi œ¼fó›zäß½ýé+Ø—µ/ Xˆ‚¾¨/yúqý8q•¯¶¨-(k‹”S9”ðâÅ‹½bDˆ$-*[eý¶~ÛrÇG“|I~IôYd‡³Ã éðD¢'¿æg£Ø(æ]’ïYl26 ‘ÆHc¤XÇ:ÖAìNìNìÌœŸ9?s"þˆ?⇹?çžÍ=ƒ÷?¾¾¨Ýj7ïxÀOòYü¦ž„°ö_¡áTÃ)‹ÞøBÅ-H<ñüÄüýùû°SvÊNÌ™'2O@ʆ +`°z°z°\—\—\— |±|±|2º3º3ºáƒ Æm<ývôFô†Ígó›zÂ&ŽÃõ××_'ëjõŠè‹è ¢–ç⽋÷.ÞƒÍU›«6WÙÛ´uÓÖM[áêðÕá«61CyCyCyPZVZVZÓÓÓv\ÒJµR _ÕÚü¦åCˇT/„Ýa·]¨/hwµ»¶ÝWÓWÓW«}«}«}ÐÓÜÓÜÓ ¹¡ÜPnü§ý§ý§íüª’ª’ª8wìܱsÇRpçôY}@©±”3™ä7õ8Dœ^§—ÏE2neÜkýíüÆÙâlIÚâ)òyŠDùùùD‚õÁú`½ˆD%*Q‘¢‚¢‚¢‘©¶©¶©6‘ÑË£—G/‹TWWÛ8Î5Î2g™ˆD¥DJl>›ßÔã1úþ´G"šOó% Ô—ªPÚ€½½½"Á‰àDpBd{áöÂí…"ù;òwäïñŒyÆöiÞ`ÿÀRLz!¾ûIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-45-red.png 644 233 144 4230 14774263775 15615 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜMIDATXí—{lTUÇÏ} R¬„j§k¤»êÚR„µ…§´ÆM¬Iµ@«Q)©Q ¬±MkÑê6R‚‹qSKÇyHâJS…Mk\“úȶ3)]C(ô1C_ôÞ¹Ÿý£sîÜN¢d³ûûgæÜó{|îù}Ï93BLÛ­b†©ÎÌÌ(£±ɳNÌ:1ëÄú\ÝÔMÝìú«X.–‹å0=mÕ]èB—c˜9¶j¤¿Œ—ùdþ™õÔgò8ù¶‹íb»ÚìeëëÂF£qŸV(úbôEà†°Ä-J˜0&&p#šþ4y×Àz™/ø"æ xk¼½ Ÿ¬/y$Ÿpõ¹ú\}üƒtpWº+Ý•VFðjðjð*ñãÐj×'?8 V6–ôò,ð,ð, Gò Õ§úTßÔyÕ½¿ýˆzDuH`Nÿ¹þsIµIµÀd’7É 0¿n~€ú£ú£¸|sùf€S÷Ÿº ôdèI§Ɉd(O(O€ÙòΊwVÄë}QÛ6Ü6l¯ä J¶’­dO]ÚÚÚ»«å.K¿Óýû;ó®à¡×C¯PH!a+ÿB÷…n€óÉç“ë³KŸ]r–Õ•ÕD<À²–e-™U™Um·´ÝŒ•7—7ÌË™—ÐUÕUÅäXŒ4s÷½ÜKÔ¾´%ÚmÉ¡a‘¼.y]ò:!ô/õ/õ/›úí¿È›ãÍ1wÊWú­N«“Iäá>6Ñ1Ѱèò¢Ë‡>ô°³ÅÝÁî @N{N;޽ÐðÒñ¥ã=ô±÷co¼Õ¥_—l.Ù³ŸÓžÓžûnãôx®ÜõÒÒ¸²]Ë\ËBGd€¯ÿ ÿ •ownÁä¬ÉYX`½o½„‡ [5¶ €}Lïþ]ì&­ï­ïÂÂÀ,//Œ·úhäèKG_âû ­V«Õê‰õÊíÊíÊí¿?œ¨uÚWê&e“²© AiRš”&©•èKö@{ =¾žæNsg|½IäQ3½-¢D§¿,¶ƒ•oµZ­öl¸¿©?­? Ò縿vml³Wò m¶ÇïµÑ|Â'|º;Κ'òDžþ†hÍ¢Ym@Ðv}b_­ îƒîƒFJð•à«ÁWã­üèÒèRv³Û±o¥èä‘ÖÆèšèšø½öôWOw<Ýaî´o ëzD*RËRËRË„P½ªWõ*-1º‰9/ö¹QëÑz´åtFyFyF¹®RW©«4Pak7Ï›çÍsj7êú™$@€0ÄCŽñnónóî¸ërêrêr¬|û.Oq¥¸Rú'b¿–æÌì´r&¡õBIž9vÏqe»²]ÙÁ‡v÷ú÷:´›b¤)q èåèåè帻é¦s»çvÏí¶ mM&«ÉjòS¯'Hñ@ßlñë´ºíÞL»F»Ñn´Ç•;ž:ž:ž ÷Ü7r߈ù;[‹iiýeµ”ZLz‰€·ˆ›XÜA&ø%íÖºkݵFJ°)Øl&™d’Iê?í?í??vô½AoèŽý%™û„º±ç"éf€‰&žŠi÷Ô/iwí£k]ûh\»ÕÕÕümzÞ²;¡+ÅJqÁî™eÔ¡„ºŠø/ífÚ}P«ÖªµêÐ \\Y\Y\i½“u#ëFÖ ãŸv«´mÀŸ&E£h±cG &Ô›-þGKÔnÅÌñÚ)Ï*Ï*Ï‚xH<$ŠÞ«Þ¡Þ¡ÞŠP„">?›>–>–>&„vQ»¨]TÚb:÷³ûÛ:±N¬Ó¿™9ýJ‰j©–jrF9£œù÷o¦Ÿÿ6Йބ¼7mõCؼd$„IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-186.png 644 233 144 3031 14774263775 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÎIDATHÇÍ–mLTgÇÏPZ¥S5jIܬÁ˜%‰¨™úBªMmHi–²©nl,!”¬1mbÒ"T„X³VeÝICRÚ‚¶úaSiiháîUÆ¢@YÀÈË(ëpï}žß~˜¹ÜÉš~÷~¹sžsÎÿæ¼ÝG@DDžŽ½ÒÒVDå„?:çIEIE¿ù{T>më%×Kÿú ¤¶¤¶x?õ~ª®9²­·íãýEüx>û\žç`YDz×ö˜üìÍÜ›™´:*ïw§»ó •_V~ ðùÙÏÏr&¾›ø`fûÌvpd[oÛÛþ6^<¾¼÷ü"ðä…'/¸F`ÙSËžŒ2^Øøç¨Á¿7Âîw¿0öÄØ:¬i …½Æ~îÆÉ¶>foûÛx6¾ÍgóGãXõüªçE ä•’WÜŸD®ý ³z}õz›Ïèä÷¼Å[¤pÖüÚüÀªµj‰Ð¢÷ê½ ÔêGà¯ú5ý€õ®õ.ÚÍv³t *HáX ¾ã[âÆã”R‰ˆ4B™”ÉR@A]cÖšµ ÿi YC1…f‚€N×é:})cè,¥³@t@@¨i5¾à ]®~R?î(>”­.[ ÌÙüßl¾“àžtO†!t?tø?è=Àƒ¹…å ËÁ8eœ4N:,6/6/6ÃÔŽ©S;À\i®4W:zcÄ1F`úðôáéÃ`dFJ"%,ÄÔ~þz?ô>€;ì‡íxbîå?U•U•6œÚ¢óŒ-Ƙiœùlæ3tîáܹàò®Ë».ï¨u"ø“üIþ$XÓ·¦oMìÙ·gßž}`fš™f&Tx*<ðœð|àùòjóZòZÐ÷ÎL5O5Çñ¾ùú›¯Û½wº7!š·ç¾’Âüoò¿‰¥Q\¿ûoçÃò‡å²èŸòýAqõÔªÿ”ˆ7ä yC"=þ_äúÑëG¯¹tîÒ¹KçDÆnÝ»%RsµæjÍU‘ÔÔT‘àÎ`i°TÄ÷Œïžïž¸®¯þ~ø{Y´ù˜ÌÛŸ·ßæî+ß®øVwpâÙ‰gk±^9¨²TX묵ÖZȺ™u3ë&t×w×w׃ÕiuZàóú¼>/x=ƒžA(8Xp°à œ(:Qt¢’7%oJÞ’!;ÿ´³jg„ÌÎ:%'ñ—­¿l;ïrïrõ3Ü¿;tDÇ^k5¥¦¿ì`v0;½ºW÷j”Êå°­d[ɶÇ®`¢`¢`6‡7‡7‡¡øNñâ;Ž>7?7?7>ú¡±«±ËY3Ö&s&sÀŽ'QDu©.×Ï‚¹ÛÜ-¿CePV¹6È¢,ŠÈX4¹F²‘l$‹Dæ#ó‘y‘u©ëR×¥ŠÜn¼Ýx»Q¤£¡£¡£Ad´x´x´X¤´µ´µ´Uä¢qѸhˆ´Í¶Í¶ÍŠŒß‡D2Ò2"»t²JΙs月""ƒï@`.0ôì2gÍY"ö_ªñÕøj|мÿxÿq'M]M]M]“–“–“­‡ZµrôíÙíÙíÙs%çJÎ8“|FÎDב >‰ñìæ|Ç™JªŽTq¦̰éltÅÂÒÔSO=0Ì0Ã<òè!=¤‡€6Úh‹S\cžy4GÌ·Í·ãø¬ªºª:g*ã÷Ø„{"œˆ!PöSÕªšU®>T‚¶ô‚Ž Ð:o·ÎƒUgÕYu 6¨ jÐM7Ý 6ªõj=X•V“Õj«ñ±ñ1 \¶ño¤ÜHL÷¨{ô‘=f/Ú†B(K*Kr6?XA+

Ó_ÄÃÏŒgô’/ž"çTÎ)ßÊ”|¶l)È}*)ÿù: Þùú¯N·žnå]ù~ä{€øÊøJðd³oì¿ÁËÄ—CÄG„}ÃóhΣ"ðÜKϽôü{IƒèóP±¦b Àí¬ÛYÚî8$¨WfÅ2d³Ÿ²7þÏà›x&~2…å ËE`}åúÊ@3¶ˆÈPì}fï3@ €ÝÁ_9Ä!‚àf»Ù@›ëwýÌê~õ‘úø“þX  õ ฯ»¯3‹ãÄ8Ÿó9AJSxßÙ1 µÑ¾Þ¿Þh6ùÈ/{ûÉ‹°qzã4è÷ìˆb/{ô}›ßSM5ZuªnÕ>)tµ®ÖÕÀ<‚ypi]ç\w®cë›î°;lÔv„ÄFµQ™?y1£•""¿>+`YÙüóFÓ¦4à+‰±éǧçž±#vÄ‹dÇ옃ñÝã»Çwƒ]`Ø©ôÐC0À.xêĤõªõ*÷ì›I|ˆ¢àràLàŒ•mòþ%"r²v¼¿ã}пP…ñ£ã ã Pö›²Õe«Ñá¿„? 樚ªšªš‚`m°6X Ë÷/ß¿|?L4N4N4zv*_å«|ˆÿÊŽ–µ—µ£Ïü¡óíηÓV…jE͹šsæäNö‰¾."ry´GÛ£¸ ·—ü1ôdèIf͹LLLBww7,:¶èØ¢cpõÒÕKW/Aí‘Ú#µGàbôbôbÔKÌj±Z¬(©+©+©ó~œ³ßL~3ÉlªÓÛ]§-Ö3‰]Þ#Xy]y]úÿylä1Ðï¦æh‘ý“ý,ÛºìeoÀùÂó…ç !¼!¼!¼ü[ý[ý[añæÅ›o†µ kÖ6€•gåYy@%•T‚›pnÜb·Ø-†Ð¼P0„¯ž:=Q€{÷ö ·_Èû.ï;}J`þ¼ùóÔ5þ;;Z¥Ç€PO¨'Ô}Ѿh_Ú‡Û‡Û‡¡èpÑá¢ÃpéŠÒ¥+ i i iÀÓ;åN¹Sžaw ô@éøjKGy‡§¹sc?Žý&¿ :U§ïšØöj{µˆïW""²05∃ƒÈtÖtÖt–Hh,4½5zkô–HóTóTó”ȨÕ£ZdÁÁill¹»óîλ;%½æÂs]s]"î^§7­^(ÿv–:KEDT—êò]ÓS~ø²ûËn`m²ç©Jfë^©+¯+‡þÞþÞþ^¯òÖU­«ZWA±Sì;Ð6Ó6Ó6ñ]ñ]ñ]°îκ;ëîÀÈÌÈÌȌ緯l_á¾BX™ˆLxÿ˜ºÿÅØc™ÿ马ßQïM 8–c÷“žiä%,a p‚œÈ ‡!†ê©§>Cïââ&‹4i$ñRøéx&~j*Ó<¦?~¶²Q7ì¶Çcê-»×îåžžäižÎ l•­²Á­qkÜPªBUÛØÆ6&8Â|á÷;û¬}–{zÒðØÍ¢›E@" D3yìÿ˜SΦœ4FH¸ßºß¶zS½‰®X3ÇpŸ2Z…F¡€)bÄeNHmWÛ±I¸çÜsD²#°)wS®9©_0ÿw¥¹»Ì]™L°h¤‘ ×·Ê­bôdv>ðd³ŸnYÊßà|ÏÄOß•íëâ¡}=œ/Øÿ¨À_f‡å\IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-44.png 644 233 144 2327 14774263775 14706 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŒIDATHÇÍ–]hSI†'éºIlSÓÒ^øýÁ),¨÷Û(›b#Öâ ¶þ-ºY)µÐov R4‚RWR¤ h‘‚+êê…´7.º î…Ô¢MÛ ‰93óìE29§–­»wÎÍá›w¾÷}ç›93#@!D ÿà^î^î.ÍÅî}v¿w£wcu4Ÿ“àÚâÚò{,:³è @Ù¥²K*nÇ7ãùBØüN=Ó/Âîð z]õù¸ZëZ뼕¹ø—ûà»î»þ·ûoì¿p­ÿZ?‡!ñ(ñàCý‡z°cƒ›ñ&ßð9ùEÏ'úBÀ‚[ n¹þÏמ¯…€•+«~È ø³ 6‡6‡^½*Ònï€Jt=0Í4¦M8bƒçÇ›|ÃgøžÑÏùP±¾b½ÞÞKˆ_cËŽ-3zÙëXôÐC È…r!𳕰dX «Ç踎;ñl:› B„¬<_ßèýœ1{m{ ÅÛâ-ú -Èê°:L–ghý½Þ§÷1·=#N>Á5RíQ{È‚|(:ø zF_8 }Ó¾„/1ý¼/dð;Rj«ÚJŠwùž¹¥Êtd:2\š\š\ê06Â#9’9’9ÉÚäŠä þHU«jR¨<AÏèçüä{O«Ò¤Õ6µÚðÏ{ŽÍsòNjµWí%[˜ñGf˜ffÝ•v³ñÜxT»jÿ_'ÿ¼+á§(kÚš»ä.2 ïëû¸pÜŒ7ù†ï³wåûºøbßc_æ ö†zfÄZ<ÇEIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-37.7.png 644 233 144 3071 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜîIDATHÇÍ–kLT×Ç÷ð(L$ÃC%æRœÜ’T ¥!E½Q®Vˆ‰ "Æ„H,mQÚÞ6 bbà&È…äÆ¶$Qª0zM:ñAGnR"”8ÐÚ´áCë jb5蜑)ã¼ÎÞ¿ûaæp¦í‡ûÕóegý×ZÿµÎÚçü÷ „"-º ˆËŽË޳D츷 5Û¸¼q9ðv´ããæ3°2ce†±§Ñõ“þRUPUêï¡qà1Aejwµ»„(áe^F-Í(€?ÿïQ@=„€L2u84»‡véü¤$f+…"·‹aóyóyoÜ˾— ¡°}Öÿkõ¯Õø´ÛÒ$M*m m×a×a×a˜ëžëžë÷#÷#÷#ðoöoöo6: f——kÀåwùaîøLéL)>÷d`u`5Ûý]SßO}`ÖÌš7Aý;ÒP&!„8é€wµw5ðü“'<‘¯o,Ê+ÊËvK½¥U÷·º‚º¸²îʺ+ë ýaúÃô‡°flÍØš1H<›x6ñ,tµvµvµÙ‹ìEö"HÛ“V™V ¹Í¹'rO m¦ÏMŸC÷_Ïuë’Ðt°é „2#ýˆp©BL4ÂW _-@Ü—?~ù£ªÛdÙ0°a€€Ûæîw÷CV}V}V= ‡‚CA£ðèµÑk£×ÀšcͱæÀôÎéÓ; ¿oÈ7ä‚ÅáÅáÅapT;v8v€5;ë묯 LWø¬>«ªƒ‹/^©"ýžZ,ÊFåãŽÇ¡÷ÌÂ[ oÁ–Æ-mù233a¦l¦l¦ÌˆÛÛ´·iok?Ö~¬=f kƒµÁZ¹2Wæxí­Ú›µ7áØû¯u¾fàZhúÕéW,£–Qeª+µ/µOÞïwÞïà§ðdÃdsãÇÇZÆZÀSâ)ñ”ÀÚ²µekËÀ† ð þAüƒx°Î[ç­óàéðtxb^L&É$™dØ÷'îO܇œ†œ†œðt¸?t#3+\AWx–žž o më2±L(ø›ýÍÐ[r¾ü|9¬>’½-{ØWØ—Û—C¦%Ó’i±}cûÆöA[{[{[;T4W4W4 xðàŽ®:ºêè*?tàÐC ª³êÓªOc&uZÿ»¯8_‰™G¿±¡ _\øbéï®kOnµµÚ¬O]Ÿ¸>N÷žî=Ýk¶äµäµä½ÇÞcï1ðّّÙ(/,/,/„ÅþÅþÅ~hËoËoËû Ýf·b#¯Dê¾0a^—‰Æ¨\œtÀþºýuÀdJû@û F‡îr‹[@'tÆ(Ô nppâÄù;åR(@"‘1ø8q¢p†§ÂSK_€Úß²¿Eoì¤C0Õ1Ì“æIo=?oüy#h‡":¦uíA;>™*Ke)àç)OA:¤C:@Õ¨USø§8Ú3í™ö ˜à[¾ùƒôK?¨Úðpx_4z;‹S S f§ÙéMÐuõÏÊÏ®ä]ÉQ­&4Ž_ÑFä›òMBKóø'<áÏÊ/ÑЀ§¸pÅÌï7Y-« Іµaî¤]Iú¤~§üѳ’Š={bÎJ¾xðÅ%‚Ë@¤@Øöh5Z P×ÕuL˜À°u¿¯çë|:ÿÒY­éçy¾]<·÷±çóû?•ŸxpM¡IIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-26.2.png 644 233 144 3244 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜYIDATHÇÍ–ýOTWÇŸ;8€;€³?¬‹iS",t´Ô—„ÝZW@«Ö—-µ ÙJRÓd#m\±¤5J\@iV,©"/ݤk…VĵŠEiUº›ZcŒ¨EÒÚn ò62L/÷žÏþ0s™Ùõðürò¼}¿ß<çÞç‰î¶™¶™¶_lÛCþ©ÙS³“ÿ°« Ð^Ö^¾ù.89$Ô$Ô˜!ÛŠ[ùáõ"!üp>Ë/ñrDŸˆ>¡- Ú»aCÚ†´©¿Øí`o²7=š€7>{ã3€ÆÚÆZ¶AÏ•ž+ƒË—AȶâV¾Uoá…ãËîÿãÈ–Èí{ˆŽŠŽ§^zê¥gÞ $t=y«òVüñS„²€Ñħ–£Œb­þ0ÛŠó­z Ï·ø,þ€çRçRެZ=d?(èl º¨¶¨ÔE½‰]TQEbPoØ ~uÕÜgîþ¢ÊT€º©nãÆFc#~˜œó!7‰WZ´¿h¿%°³êÕÞÕ^û1p.w.ipß¿œÙëÜëÜ RôË€?¨ãæ{æ{è*OÍUsQæCÓgú&;…Ú¢¶¨-@‘D†ü8ÕˆA© Ói:ÑÔŽ¾úqíøÚqKàþåaG)"2篜³×ÙëF§@׬®Y ¿Àïû’{w÷îfL/ÔêC|ú]ý®~ú¶÷mïÛzšž¦§… *¦˜â°üÍz©^ }©½ûz÷1¦—ð¡ëé®§V{ƒ½atŠ¥GÔB‘ª/áÍò7ËaÄ`ºr>õÔ{êÁñÇ ŽP™ç3Ogž†‘“#'GNBÁHÁHÁÄÎ;–ì\²sÉN¨¨¨ f˜a ç9õ9õàø³ã°ã0Ê}pñÞÅ{a ÒüÀüÀtÁ¶ÍÛ6ƒù¯€™ø­ˆÈµ"87íÜ4¨-iÎiÎQ³Ég’Ïà·<‰žDO"xîyîyî«ÕÕêj…ëq×ã®ÇÁÖò­å[Ë¡=¦=¦=&$ì¸ë¸ë¸ fϘ=cöŒñ[  ø++k_«}MÀùÄó‰0Ðc›b›Ö=­{ÞB‘ykæ­ñ\ÍÔ25íØ…Ž‹$ú쵳ߜýFdÈ=är‹Ì,œY8³Pä~÷ýîûÝ"y§òNåéñõøz|".·ËírËäÊnÉnÉn¹Ð}¡ûB·HëîÖ÷[ßyxu°°_¢çOOÉKÉÓŽ‰,Š_/b›ëõÏ[(4Æ·Æ·š·XÛ¿°aè·ßaÇûŽÒ;Ò;Ò;àNõê;ÕPŸTŸTŸ2d<ë@Öâ¬ÅYP¹«rWå.[;ì;ì;ì0¿t~éüR¸âüНBá~õ‡¾¬¾,À› %hæ­)æ‰={´[1=1=’Ú|ãó®Ï»ÄY6^‘R‘"RñŸŠ'Dn_º}éö%‘ˆ9s"æˆ ‹M<šx4Q¤Wõª^%âØëØëØ+Ò¸¡qCão¾7ß›/Ræ.s—¹Eüí@Õ*‘ïk~xôÃ#‘Ä´_ÌøBœsn:êu"l3Öë´[büÉúÆš_o~ÎÜêø¨ã#U½ñEÿ‹~ü+GWþ¼ògH/O/O/‡6›¿ÍMÞ&o“2R3R3R¡Á×àkðA[[ä'å'å'AÍŠš5+ ×–k˵çGÏÏpM¶åÙüÿ¼òõᯫhjãw=ÁqQõ%z =VgMg³À8½ô¢&›žL2ÉÀŽp$ì¬:é¤(¡„’0¿ñ?§:Äj’ÏâèÑh εöïìßý»ˆË76ÝØ4mB]žumÖ5Y%«u¯î•OätÄ·ßJŒ-˦Ù4Þe{DpâÄ)¢ù4Ÿæ±EÚ"m‘"jL©1-ZMDÔzuH—9Ýœ.>i‰JˆJWl‹ºžïz^ÎhKŸûø¹½‘Ò4ž2ž²àÀã“ÿ—õÚz Nþ!ãœqxhæš¹èüô€ŽŒã#ìÀ vh„ 8pÍ<3Á ž…oñ=>ùƒw%k6­ÙvWòvÒÛI“s» (¥”8˜0^5^Ū]µ ¡AȶâV¾UoáYøŸÅÐó$¿.žØ÷Ø“ù‚ý/§&ÃCàâgòi?Ãud}“õNÙM䇅f¿š´ÿÖOšÌ 36Ùp±á"I~ûõ·_ó¯äýk÷¯‘d"œ“®­çu¼Î×x™øhz† ý—ü—Œ12ë…¬² ¢ bec2`t%Yý^õ{$ù«÷W¯ò$é<"™Ã&iÑ¢“¶žOÅë|§ñ5ŸæOê¹4´45Ûj¶™§(àÖrßëû^'YJ’âÿÅ&61‡tüŽŸä?ì9{ŽóêgÙ&ÛH^Tª“$Õ°&é8Ûœmœ§m'ìIòK~É–¥ðÎïîj·Î°£ÆSã1Oi=øãÞ}‡ÜòtËSR5’¤ˆª›ÜÇ}$©FÔëø? ’÷åcù8½RT^åU^’ ¬g=ŸJí·oÛ·)Ô]gÌÓnå̹EjGßÉØJXÛFš–iY>Æî|qç‹4`ÕLü颧‹8+ΉsâœË4ŸÏÇÉxA¼ ^@ªBU¨ 3¤Lp‚$ØÇ>×=3e½o½ÏYq7‰OŽš£&ÉfÙcù´pNüHîþl÷g¤ ’¤,N´>úüÑçdùÊòå©z6÷TõT¹;åN¹S’æyó¼yž¬ÔFj#®ð ¯rDŽÈ2ÑšhN4“å­ååT=Ÿt~Üù±–Åò/õ‘úˆ^¹?BÝ€{ÉŽÑŽQrf˜$U]é§^Ùð çõº^Çu\Ù7Ô7Ô7D®5Ök òaðaða\Ó²¦eM Ù½¢{E÷ Wßtb:1 K÷—î/ÝïœÞê料›â|j§ëûÌä™I-ìÆ^Ÿñ§Ü®Ü®’ no|kã[À‹ÿÄ,fSÑ ×~ºö°á£àà`A,Ø 60Ç€ÀòÀòÀr 0 ùÝùÝùÝÀ½ƒ÷Þ;ˆô0+ÍJ³ˆQ#je/•å”å³sñ¹8²,Æbã~ •…ÊäæþûCIЃ—¼Û½Ûù&nú[ü-þˆ{ïû ü€¯Î·Ë· @)JQ øš};fÀ®±kìW€°…-lÀ0Ì×oäyFàycÞàkôíñí6Œ†tXÙþ^/x«½Õ|ÓÊNÙiÜ„ïŠwãÏ€¥:ÃÙáÔ:µÀ“’'%OJ€ÐÙÐÙÐY`¬q¬q¬h 7…›Â@üAüAü°~zýôúiàxûñöãí€ÕfµYm®Ð…K ] ]€ó_ûª}5í^ŠÿØ«ìU »d—qÓÃzÛz{8†ý¿ôÿ ¸KãT+Š*Š€%b‰X"€@( „€ÖC­‡Z—/^ŽU«:V¬.Z]´ºèêêD±(Å®°M9›|›|@þ’¼©¼),¤ÎÜ.ãþ‰þ °ÂVx8} È݇wvo i[¶E¦Ž§JŸæC ‘<ÍÓÍŸº•é:¦ÌqsÜòQÞw„[ÇäNqU\å¬zÌ×øšË'—Éeré $eDFdÄ, iHƒäQᑌ¼ZÑ+z9«¦t»»îî:’3æ¨9šYÇþ§òoÍÚš•Y™ïïI ¹Cî pÿ˜‚‚äÂV‚T””$Ÿp’“$¥Ž—u²Ž‚3NĉI$%·foÍþ¿•ÿ™^©{—î•Lõ6ò0ÇÝg»³ó¤êWý$IƒéÚz>½e©|§ñ5ŸæO÷ÊçöuñܾǞÏìïÇøŒêT¬YTIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-32-grey.png 644 233 144 6262 14774263775 16014 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü gIDATXÃ…—{P“׺Ɵµòå®Ñ*(j“ ¢€Ê P/PÐŽ²*ÔÁ½OUÆÚžvSu£ÁV[7-­Xg£°‡ÓR[ •L¬XPÏo[6#·ˆÅ"†¢ ’|ùÖþƒÄ3ã™NßÖ¬ïò¼¿y×ó­õ~$?????þ˜ˆ¡‰.ãîs÷¹û¬6ÿ›üoò¿a†~C¿¡e›Â¦°)Ÿþ'ÄñAºmN£Óè4²OPŠR”’<„"¡:ÐÛ° ÛØ'ÒTiª4•äq¸GÜ£æR2HÉàŸO˜q`Æõw ² ² ²ˆ•Wój^MVOpW½\þô`,bKO Á „«®Qרktz”Ád0L§{\V—Õe­û—#ÒéˆÔý—ò˜ò˜ò~Ð%ë’uÉ$/Z-ŽQQQ€oî»ï{Þ÷¾O7Ÿ/¿ÇÇÇy+¸”ù1?æ'l&Ù$›d«‰Ô"µH}¹lôÛÑoG¿}1`jÝÔº©užw“;’;’;¨;ÂaŽ0“iž4Oš>ćø 8à€Àxo˜‰™˜ ‡3Øì FйÑÜhndîK¡—B/… ï>YõdÕ“U›>W¨j…:NæÉöd{²“Ž1=Ó3ýýÍt)Ù?¾|ÿ8€F4¢1x2g䌜±ñ®1טkìÅ5ššš|lFNFNFwÚÿ©ÿSÿ§Ð@ 1Äà…;Âá8²œ,'ËLÂ$LÀƒÀ;ì#cd <À Mš<4ÝU'ªNTà7w7t7t7p7%r‰\"ÿåŸÊ§ò©Ë3±˱¼÷)•7É›äM€8P(<üOÇÇÇ…×hÖjÖjÖò)ú,}–>‹»©ŠTEª"1MØ$l6pà 78ú3ý™þ à |/ò€< HI €¸€%‚ê¼ê¼ê<¦ùô5ë5ë5ëù_~ò#ü?²:ÊUãªqÕdýÇÔô©éSÓ™6£&£&£†óydØ»´~ÞÊÀ©p*œ €—ñ2^×ÉëäuÅ(F1€f4£`÷Ù}vÿuü×ñ_þ0˜? Ãä09 ?Ÿ~FyFyF9wzjÆÔŒ©Lëãññq,”…²ÐƒëÝJ·Ò­%J<„dÿ‹þý/BâR ………•Û+·Wn¬­ÖVk+ Y)Y)Y ¬9·æÜšs€îÝ;ºwûyûyûyàì[gß:ûÐ{¡÷Bï€Î£óè< ñtâéÄÓÀ ¬À ÀÏÿŒÿÿ3p$jµ‰Z$W•W•W•â`q°8øàzÊky-¯}éí)§<žòŸ,Ô-Ô-Ô‘T Ï@Q}°ú`õA`xëðÖá­Àέ;·îÜ ,Þ³xÏâ=@õKÕ/U¿`36c3p©àRÁ¥`ÀÀÀÐÇéãôq@âôÄé‰Ó£Éh2š€®¶®¶®6_HÂÍáæp3)ññøø¨Óæ´9møûÜ£sÎ=Š<ùùù8˜‰™˜ œOá…³/œ}á,R˜R˜R <xiii$;$;$;{ˆ=ÄŒôŽôŽô1í1í1íÀla¶0[–(—(—(Eš"M‘ ¼:ðêÀ«Ï@9¥L)SÊàðñøø(>ÆÇø˜„Ò3ô =óì)®á®øá# u;þÙñÏŽ×j®Õ\«Òg¥ÏJŸ©‚TA*€mcÛØ60oÑhËhËh îQ ÕP ;ËÉŽÊŽÊŽòE÷fÜ›qo÷÷ÖÅ­‹[“¼¨ð¨ð¨pŒ9—:—:—BQYPYPY$ÜH¸‘pˆÂâÂâÂâ€[½·zoõzõ<êj‡Ú¡NÒ“ô$’#“#“#¤°¤°¤0@´J´J´ žO„'-¥¥´cÝëº×u¯ƒÂÂ[x ¿ÊîÉîÉîñEÈ@ÆR.ŸËçòI^}|}|}¼G3ètº¡nnnÀðcãcãc#`ôÁ 3Ì0   ÀD# °NÖÉ:ÁÈ!rˆ‚ôºåºåº…½Ü´»iwÓnQ‘2]™®Lïw}åúÊõÕûG̻ͻͻfafÊ›çk¨Ã;ž& “„IPµöµöµö®\W®+÷ý#Ê)Ê)Ê)÷Ït˜:L&QQíkµ¯Õ¾Æ^&9$‡ä@*TBäC0;³3;@xÂc–Ë€•u‹êÕ-‚JiUZ•V@ˆb„˜÷ÐBZH {ǽV,žÀa«}ñmäÞ_©wê]"QÑ„w={H,‰%±/§MTêò9÷÷÷a×&a“°I Ë" # # ‘*´ íB;t>OçÃÉçñy|¤'BN„œñ̳.±.±.uÊÉÉÅM|4ïÞJ„¡„+ö®ì;¾+(((((À°¯¢ð^xæ!¯w÷x½[ìõnÍ3ïꡇž7¹Mn“›ß1tjèÔÐ)((¥”RØ}•¨««½%½%½%¢NÙ>Ù>Ù¾»?8::îû¼ó•ÎW:_¼€_·æ|v">È>÷€Â+pÍëÝsÿÏ»AƒAƒAÜÐwùßå—ïÙƒy˜‡yP™ÌæüwcScScÙ¬hW´+ÚA#hÍ®«ÜFn#·q,^­ÖFS›7ߟ¼ãØó\"üN$$$$$$€÷NÍLÂ$LBvZXX Ü3Ç3Ç3ç_¼T+ÕJµéÇKú-é·¤€ï‡Ú†Ú†ÚØg­_·~Ýúµgéˆ{Ä=â劗‰—‰—½ÌN±SìÔÿü)¤Šºaƒ 6a¦o¼…âŸç!øƒøïP‹ZÔz0#32cB­¦Õ´úµãëÆ×¯ˆKÄ%âÚ&Ò‹ô"ý¥†êêê• –.K—¥‹\¦ Ó…é¬Ì«kò:~ƒââ9ïz· Ïä 9\3É"Y$ëŸ!¬–Õ²Ú?¿!Ÿ+Ÿ+ŸKÛD=¢QÏù§§§;úÚ3Û3Û3 @h½z¾Ærì8þ ;¯çüu´-€IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-74.png 644 233 144 2404 14774263775 14705 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܹIDATHÇÍ–]H”YÆÏL™chiäU–P-z#,x!ÕEI;Ä®’#«áuQF-Ëá{¡A˶+Ô2A)ö¡¢”M²DCŒ5wëÕ¢k¶M2ˆC6š:ã¼ï9¿½˜÷Ìû¶ô±—›™ÿ×ó<ç¼çüÏ „¢Ðúà^ï^ï^•±ÝͶ߳˳kSwƾd‚«ÞUÿW+¬¬]+º&Çl[Çu¾³^ßɧý¢PØŽÜÞÜ^WµeŸ†={*<Åû·0ä ä ÌpøÎá;ý]ý]ü±H,0S=S ¶­ã:_×k<'¾8ý~! '˜t½€Ü¹+„€Ro©w㙄gawÍî€WË^-Sn0§|òU50ÇzĶŽ[ùº^ãi|ͧù3z¬Ý±v‡àkò5å]ÍŒÝÄð¯ó¯Ó|énàÇO¾O¿N¿5gx /)5.;e'ТZT €Š«8ð«5¢¤ÈI'ÓI:è ÃÂÃ_â/ÑÇnÚü=âÝoÛþ4xŸt{CÅT ä¢\”‹vùÈó‘ç#Ï¡´¯´¯´ÏöŸßz~ëù­àîrw¹» *R©Š€'éIz’p·ánÃÝÇʵ™GÍ£Î6£ù3zÜBÈA9è¨3ê„kÅrñB¼‚ïh¢)ëÝñîxw\ˆÊºÊºJ;_lllÑó¦çMÏ!6·onßÜ.D±¯ØWì¢lMÙš²5v¾+íu:ø²ü–žî1üb^!%ä-yËžiëÙÖ³­gáÞä½É{ö c”eF™m?==Á©‚S§ +uSvÈ evšÝcï?•`ÌvGWHq|RB„9vd½ªWõ`„Œ”A.r‘‹ ¾UµªÖ·`LSŸ<•ïécX}æ­¬—õ,d!eŸìÕüNÍnþ,óRC ’ÇåqG^R6ÊF¬¦ü©>öÑÎoujyH"Í[kÆ)ÞZÿß?–¬¸Î×õÿ¿óà®ÌÞe¹Û8ÃòíOlî3÷‘Va\¸À¶u<»%¬z÷É»ò³}]|¶ï±Ïóû/:µ‚âpƼÝIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-97-red.png 644 233 144 4265 14774263775 15634 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜjIDATXí—LTWÇÏû1ü!QgvkÜÕU(Š«–F(h"šhŒh+67Z“ªh6¢Ä(JÙÊFRT*]­J‘ÑM«BêʊƨѦ’’jtÓ…@óÞ»ßýƒ¹o~¤ÕlvÏ?pï¹çœÏÜû=÷ÎÚX 015Ôj µ ƒÞ‰È3!gBÎ,˜'k²&k·ÿA3i&ÍFݬ‚d’Iæc pÌ*øzÏóñüõÄÔ@¾* ±!Ð?aš|F>#Ÿix&l¶[ èØþØþØ~œ_voÙ½e÷€œÇ9s+¬+¬+¬¾1÷óõ<žçãùy½—ó8?p<¹Zt‹nÑí˜ÉwhRþ¤üIùÚµíµíµí,ÂÕëêuõ AÂ0€8àŒ±×Ï×óxžç¬7¹úå|dŽ»Ån±Ûñ/žÀÚfm³¶©oØ=vÅ®À¯±DÅ¢ j¥j‡ÚhÉZŠ–hÙÚ›Ú›€–¬NS§Z©Z¤,‘ű8¨<Þnvk›5Ôª¾aw‹ÑÁ뛣 4¡Ahˆä½ò^yoÝ÷< ³"³$³DÍ6Àеv­.µÎ³Ù³`¯cã0ô½€Î#àÀ˜o½Z‡mذb\Â%¸øâÌŠÌC™‡Ôl^Ÿóp>2=2=2=Zô¾À\fÞiÞɦtõ8ÂáèóæqiŸhZ#h{´=\ýÕýÕàYäY?Óë‹À]ì.€AiPà  ÷=÷=@û¤'¾'”ÃÊa¸ºz¾öð5ô™ËÌ©æT6…ó|ò&y“¼éú^î8˜w0ï`{Ï[uHm0k–}evêìT`´­ ¶6¶6ö>{âšâšü×Ñ>Ú@ ß¾L¥¦R@møpþ‡óO9t0ïÓñŸŽgï;ÀGÌ›››€Šg zö>4UXøž¦ŽK“ŸN~ WV]Yë¿ZÿD|ñ%ü\ðs\οœÇ"ŽEÀ¹sçÎ@éžÒ=\B¯Ð ÀÒîlwúê=[à|æ|pÎÇAÿ¶tßÒ}K÷ù>™ÆÛÆé.q—€i¼i<Yzd©ÿQ÷÷€($Àñ·¿íïW3Ô ÿqzLz lü|ã缚ݳͳÍWŸóp>ÙÛRÓLY¦,S–Ñc¡´NŸ®O'¢ËQ?EýDD45jjÑ1í˜FD”s#çщœ9DDx‚'DDÊCå¡ÿM"·Ê­DD‡fšEDÔÙIDôuß×}Dæ]v@¸#Ü!¢²Ñú¦S¦S¦SFËóû•åΫšW5¯ †…aaXðO½UoÃ_ùÑw* X®Y®Àر!¿?~¿¿k®Ô\ñßÁ‘‹#`‚c‚vü°ãŠ×}[u«n€%1+³‚ñ(kŒ5ƃœÄl1[Ìöüâ¨8ZptùÑå~Ó]€¶ímÛ(·ÝzÃYÃYб c?èÙâ³Åþ Â.„@ä‰ÈT{³½ÙçÕN{z<=¾z—*/U^ª4^À B’$$y~!iŽ4GšSRλÌòËËmr×Êû ÷Œ.–±|åò•¿5~+võðÕÃ}:û4$Ä'ÄÀ sÐéúîÆw7@²’¬òN/fgÙÙÑO‚ P†0ĆP’P’P¢€4Aš Mø¬"³"³"³F•$·ÖwþŠŒ»wµ­¼œ^èÌqæ@-mGÚC|bbàöøÛãñ+–üqòÇ\ë¿]ÿ-Àofý3ÏlÏlßQçßÌ¿™S2×Ië¤u«FÇá¼ë¹M:`J2%™’Gx@aiala,3úVñtz:Á—ÙeàRïªwÈÎã<°VÖ @éì¥Qi´<}›î×Ý'Ý'ûNöa±ñ„–‹åbùða¢0Q˜8½6Pºeô×a°æ­¡^¨ê¹Vô¶ÛÛØ ínÕWè+€]`(úú~¸ n¸ý†,…¥ø¤Ô]ß}²û$` ³„YÂÔMÆNî’vI» 3 ´lʦlÙìcM£4J“wQ5P‘䔜’óƒFãi­1W›«Õè®ºŠºŠüµ«¡¨C¼ß§+ce[¥£cô:VßX}uõUm«ñ Èò€mwÜæ¸Íq›‰ÄL1SÌN{éò8æïßUÒéô@hšR4¥hJ‘)ß”oÊ·í6´›–™–™æ¯]½P/„l°xŽçxî×ÕSµ©ÚTŸ«æVÍ­šË2Œ·<ÚmŠîö~[ £šƒŽž„ áwcsبv»Nûi·´°ÔO»Ñj´íÒŸêOõ§>-v¢€-¼3¼3¼“-34)FŠ‘ïì ’â ¾Pzù„T¤Ýe¿¢Ý[‹O»j‹Ú¢¶€Ê‹¸q/â€ý3úgôk2´xJ:%ÚŸÂ¥æ•^0àïèæ[Àü–v+Í•æJ5º«¾«¾«€ ú9iaSaSa“ïÚ‘k书Óû“$üZP]ï·¶X[æü`,f,–þÀîɬ‰æ‰fÜYîcîc^>W««ÕÕ ¶~[¿­ôQ}TõTO=õ>õ®i×4ü˜ÿ¤óI' î_/ãØeÌ XÛ¬ms~†Q&‘‹ƒ#Ú ìUL3­oùݶô„ôÿSx[xªøañHñتlU¶*È=“{&÷ Y‚,A(©,©,©uKÝR·¼‚f2f2f2 o.Ï–gƒè_FgDg ö&åmÈÛÿù-€¾Þª{«TÕ²q爈ü«>›ýlšÍŸ|óÉ7ªt{hZOZNÛV[¢-’"“"“"¡ädÉÉ’“³˜³˜³è°Ù¾Ù¾ÙW‹®]-òæ»v=ìzq×â®Å]ƒ¡7†^z6þyCò†dœŸ–µý«íª®÷\ïíùe=‚#´'´GuP8^3^㜻2[6[é‡Ò¦„ظظØ8¸|ûòíË·!þhüÑø£ÐÕÕa*L…)¸u!ëB–gbzbzbv%ìJØaÕa§ÂNAJaò³ÉÏÂ?Ù•]LOƒ:·*oUžê0ó‘Én²“ Ý«²We‹ÜÓ¾;òÝ™Zznè9‘¾”¾Ô¾T‘`=XÖEô8=N)/././é-ì-ì-1ß1ß1ß Ø°#`‡¬<ÙÙÙ"«×®^»z­ˆã”£ÚQ-¢ÂUªJiïnl”)‘(K”EDÕÈ=¹G‚Y]ÓhLÃ"þ}þ}"ƒ¹ƒãƒãµß¾ÿëý_‹ øø ø‰8Gœ#Α±Ýc»Çv‹ô–õ–õ–‰dÝ̺™uSdMÄšˆ5"Éë“×'¯i m m  y|èñ¡Ç‡D:U§Þ©‹Ø'Û&ÛD¢GEI”È¢cÑ!"ï©4•fj=ߨÍÖöÖö•á/}/°º£ºgêpê`ê 4Î7Î7Î{·¨¶ ¶ ¶R6¥lJÙý™ý™ý™0;?;?;ùeùeùe033 'N4œ€´4sš.»q|Ümhþb|cSy¸ôp)ðWÏ”(í¸vÜkS|Ï#ûØÇ>À‡=4ÑDH"‰>ùÓœæ4pŸoùÖÏ¡%iI@»1•‡ß9ü {¦’ûÃzßzΆÑm£Û@«\öí´«ÛÕÍ‚¾QM ¨§Ž:КCs€¯Åkñ ŸÕÏêgÜàèAz¼A1Å ýSÓ4 ´JW§«“}ÇÇÚG_}ÀúÀú`Îï=>ö3ççÕÀWåqæEí í ý€~€¥•¬páœ,âc(44À ›ƒZéwxÆÉâáû¹ó{ÎJö–ì-ñ9+y{ÝÛëVºj÷œ{@{]{'¨5€ xccݨ7ú <ßà3øWÎʧövñÔÞÇžÎìBíNÊrÐþIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-31.0.png 644 233 144 3051 14774263776 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÞIDATHÇÍ–ïo“×Çì*u”lu© Š`6·ÚQÔ¹ŠT‘¬H)}˜V‰IFÄ‹´¡.%K“e-¤jPŒ0´4UEC«®€´†„¥‰D7R™vâ%Šóüúì…ýÄÞòpÞXßsÎý~Ÿ{ï9W@DDIÿ XÝV·Õ•ÂÖßeüŽgϬ9•Âïk`ÙiÙyýä½›÷.@~{~»~#ƒÍ¸™Ÿ½^$ß­gúåÉ8v-ì²øÒ¸*Š+ŠKR¸é8ƒÎà” ¯„^ twtwðŒ=þ5@ÌóA›q3ß\oòeóKÃÿé‹€ýœýœåGX˜³0GV–®,]ýz*at5<ÿÜóÏŒ-[`X@»ä’kø€ L»›…Íx:ß\oò™ü¦ž©ŸªG  ¤ D„ãeñ²¸³-µàÆG4×·Ô·€Ñ i§•VrA½£ÞÐÞÐÞ É¯ut€“Æ)ã€1h I­R«$ jL­´ÐB®ñ÷4ß¹úÏë?7 ¼ñ§Ëmå6g›YüïÞ¾ý4?ó¯ó¯ãWÊeà·ÀxTÖ†Q(ç žÀ0þj|l| Æ qݸNÆâÜç~~ílÇÐǵo´oPL>=™æßï?ì?løöÓY[)"ò‹fúœ''6uºAùÛï<ùSÇOL«jÚÃ<›š˜š˜šå¦rS¹™8ÎqŽgàìòÙggŸ…{+¢oFßdÚð¤øaäÀÈ`Üù­óÛ„dª1,""ïuZñ?rŸûúºßx·z¶z ÿùü†?àÇÿÌÄfb31˜X:±tb)x‡¼CÞ!ï ï ïË¢)š¢)\3^©‰€³Ót1v÷WÙ«ìfT_Ç—µ+kW[SõˆZ*"r­>üt:¬=ß÷|oToqm m ‘Œ=sÅ\à^ë^ë^ N_8}á4”..]\º8s.–],»X6ÿ‹ö¶÷¶÷¶ƒ§ÈSä)‚è/£ÅÑbXÛ°zÍê5$Ï®¿ÌeŒj·†[A³¥ê&\!WÈèbçíÆÛÂDÛdÍd l«Ýöê¶WaQpQpQ¢Ë¢Ë¢Ë2yº7toè†3ÅgŠÏÏ/,Ðh4ƒ¯ÊWå«ÊøŸlñ½ì{þ|ì½Þû@yQyTí¡¾‡úŒ.+³Ä-q<|ø©‡Ÿ¹®ýP÷Cܘ((éùwO¤'"Rè/ôúEÎ7o:ß$sf-·–[ËE¤HФHæ™ÍesÙ\"ªGõ¨žŒ_)P¼ŠWÄQéèsôÉ={ı¸ì^°Õ8£íÑöX†DìgígE®þöêí«·¥`W|ו]WDú¯ô×ÿH¬&V«É‹äEò"Y+”Ê ìØ±gü%%%"ë¬?²þˆÈØæ±Íc›EŠkxL$z9ÚíñýËwÈwH DâÉxRÄ2E'–!¡)}Æ>ëü¤óóCÕ‡ou½ÕErãâÎNh ·…ÛÂó·ê û û ®y¯y¯ya¦b¦b¦v ìØ1ñ½ñ½ñ½Ð½ª{U÷*ØrkËÈ–8;::FÒÔãç¹¹À?Ì3†y+k«k«pú–Ú~mÿœ¾Á?d8ÊQŽfU¦¡¡eá$IS€J(>¤ö,¾¿¨Ãê0ðxZÚµ'€Éô­d8ÝÇp;‡6NŒxG¼ ý>Õg´ÆÙÞÙ^¦õB½L/."”ÑÕ«ô*½ È!‡`”QFA›Ò¦´)àCZi}«^§×¶i¶a¶iýTºé#ž€sÔ9š°1•îcó:?/8^pFº3Ïh_h_è{ô=(sÿTTà?éÙ¨¦1¤fÔw¹kò`€^­W£0kò¥ùM½ù?=+)¯,¯Ìš•X~`ùAh¤‘\Pj@{I{‰$—ŒKX°@›q3ß\oò™ü¦ž©?7+Ø×Åû{0_°ÿ¹ý#†ÄžIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-95-grey.png 644 233 144 6326 14774263775 16026 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ‹IDATXÃ…—PUÕÚÇ¿kï}Øç‡ü’+:"'/¡¦¦u®ÍÁW-_t2Œ¡Â’yI½˜–†2áM_ófÂ%50Œä‡Þ@'…¹jäˆa‚ Š„ósŸµÞ?8›fz§éùgÏÚ{­çù¬çyÖ³žMòóóóóóრ1O<¸%Â]á®p—Õç™ÿeþ—lzá`á`áà_#™/óe¾ûÞ–¥@)0&Ã~Î~Î~Ž}„r”£œä!áÐ….tÈ@2ØGâ*q•¸Šä „ƒÿ”“'ä y²ýhA@A@A@ã­¢”¢”¢2 …H!R1LpÐV7—7 ¸ ±«¤…´ÒVǸcÜ1î[X[X[X[Ùëp 8®ZæZæZæÆüMSª)Õ”â|LBLBLÉ›§˜§˜§b§ÆN Ècù»<_^/ë›Ôï¶'Û—yd>ÁíÁÅÌ‹y1/šLÒHI )åCø>¤ùØxÅxÅxÅì©~ ~ ~ ®wººº8g”1Êe$ËÅ<1Õïá=¼5,°À ©H„ ÁbŸiŸiŸ‰åÆc‹±…9›Â›Â›Âé»—=^öxÙÕ!êuÈ"¥+Í•æJ‹/eé,¥ßM& àstÝAwÐËÌʬÌ:Ó“ŸÂOá§4‡:F#Ž‘Ù7ÂÃÃ¥…™¶L[¦ÏšðãÅx1M§é4j6MgÓ¶ˆ-b‹:@è@£h‚Z\..—C’׿}üíãoç³Âæ„Í ›#-tX‡eö ^ÃkxMs¨Ì#óqªvU»ªPLWLWLßûoË·–o-ßÎNԮЮЮ–§§¤§¤§?xÏõžë=¡sè:€ ®’«ä*œÀ œHé ÄqA—Ä%qIÆ0†1hD#_¯ÆWƒ¿¤oOßž¾]øA»V»V»VZn©·Ô[êg'Ê<2'IcÒ˜!ÖñãÇ7)Ïû½æ÷šßk,4©)©)©Isd@¼ˆñ"^€=Æcèçôsú9@Vd&…¾@_ /v…]aWê  8;;öOìŸØ?—¬?©=©=©]¨ô3øü ,Tæ‘ùÎÂYøû«§Æ©–î^º{én$ø|çóÏwðp+R›ýÌ~f?à«ý_íÿj?Ð_Õ_Õ_hš5Íšf`¥ÿJÿ•þ@äÃȇ‘®š®š® ¢¸¢¸¢àùD>>•>•>ıF¬²çfÏÍž /ß¾7|oÀ¢ÏÖg병P­¯ÖWëÅLÅLÅÌ÷WsR¨*…¾éûÈ÷‘ï#|ôœçsžÏy’27  Š31gbÎÄÖÓÖÓÖÓ@ÆêŒÕ«ˆÊˆÊˆJ *ª*ª* p­q­q­'''Ï Ï Ï à­ž·zÞêÒ i†4°6hmÐÚ @“ IÐ$LÂ#º-º-º”É<2Ÿ`¶Û‡ñy¤!Òi@žêŠêŠê ,²'m^6/›л§wOï éVÒ­¤[À¬í³¶ÏÚTTTmGÚŽ´º»»Aí vP (]J—Ò :4tP®S®S®"c#c#cá€p@8°l›AÕ§êSõÁübð‹Á/"ïúðõáëÃØÇaö` çNq§¸S“;i?í§ý€rT9ª¦UN«œV \»xíⵋ€#Ö눮{^÷¼î Xì»ÅHT¢†ÞzgèàÁÓO<:”Ê%Pã_ã_ã”––¶mÛ>Hé#}¿ÙçÖsë¹õ>ÃgøŒ„s| ȲӣóGçÎÇi›´MÚžX‰•XÁä•É’/$_ÆâÇâÇâÆÆF µ µ µŸŸŸ‡‡‡Ã6Ã6Ã6`Ó…M6]R—¦.M] l©ÙR³¥:>t|è8ÐñsÇÏ?OÊöøñëã×ǯã§å´œ–æ”û•û•û¥’;wî°Ó7‹oß,È3äò ¬ÌÌÌÌ ŒÉ­É­É­@îÁ܃¹”-)[R¶¢BTˆ @ù…ò åÀ£—½üèeÀ[ï­÷ÖÿV ÔZµV­<{,öX X«`&?[M;L;L;SŸ©ÏÔ‡•w”w”w¤IHBRA¹/ä ù$¯) ) )À¥^?¼~x=ÔćøŒ~ÿÁ÷|ÿplѱEǃ-ƒ-ƒ-@]p]p]0à³Ûg·Ïn ²+²+² ¨#u¤ŽÇöÛ{l/ÐSÞSÞS\j¹Ôr©ð(ö(ö(B¤)D‚]ÞG]N]N]]HLÄDLø_â".â:æÁ¯_7¾n¼µÙVh+´ê2F~ùiä§9¸ÿáþ‡û][c¼c¼c¼¹WCõ¡úP=ì¿nøuï œWŸWŸWª8Uœ*Xã»Æw/à©óÔyê]¯®W× ôØzl=6àbóÅæ‹Í€e•e•e°"bEÄŠ0íNíNíNÕºj]µŽZ:_ê|©ó%n“2N§Œûéug›³ÍÙ¶Ö@vÝÛuo×=mhCÛŒCŠAÅ b°U5Ö0Ö0Ö0;=¾=¾=¾Åîîî‘‹4™&Ód0ç,ç,ç,E¶"[‘ p3¸Ü ›° ›d! YŽàŽö{„=àwñ»ø]€`Ì‚–çý8ïÇyX[Ñ]Ñ]Ñ:U·ª[Õm[ÆxÆ3>f-"ˆŽ WΕså|;WÌsÅ}Ù´›vÓî4‡ºQݨnZÞly³åMö_ÆDc¢1Uî+Óêíí p¹\.— °_Ø/ì—ßÀ˜–i™˜hÿñ’xI¼4 8:Ú>Ú>ÚõùŠóç+$­Â¤0)L131ï¤dY@tl@ JP"Ìäõz½^¯gŸ!ñˆÞçvq»¸]=¹Ü2n·l4Æ•ëÊuå¶öÞë½×{OZu5êjÔUîïª,U–* £,˜³`ˆ$’D’ÈÉD$"'»'0Â#°“’@ 9{øì᳇][ï^¾{ùîeáõzõzõúª"ÝSÝSÝÓ¿œú8õq*ù &˜`¢’ÜjЋ^ôJ·ƒäs‘5‘5‘5%¯*3•™Ê̪¢'~Oüžø 毧}=íëi®­îu^¸†k¸;Œ0ÂÀ 'œ¿r–É2Y&ÙKö’½¯˜®˜®˜X\[S[S[_¢ñ×øküïÛ•ŽJGe nÜ*˜‰™˜ Þn5'dPù&:E§Ð)t ¼oößì¿Ù8r9ŽœÜ5¾_ïÝS]µ]µ]µ|Iýšú5õkXÙL6“ÍéIz’žƒ *¨6ÂFØ@$" Ö!ÓiÈ„ª†è†è†hxk4š€Î§óéüÜ'Rï¾ÍЇÜÛ4È‘wîþ%ÝCw¹àKЀ4¸¶’…d!Y÷êDÎ5Ÿuntntn¤YoÐ7è”[UUUŒU´“vÒN¨¹.‚‹€]Ê“ò¤<ˆ‡u‡u‡u®° ð·•ÑÊhetÉ¢‰Cóî´Œ–Ñ2á;²ÙrÄŠŠŠŠŠŠ0*{îöÉ\['þy„C¤””’Ò‹ßpK¹¥ÜÒwÏ!éHçþQë¬uÖ:¥æ£æ£æ£PsÇqFdO4Z­Vj¹_v¿ì~[¹S¹S¹óÖy{Ÿ½ÏÞ·óàíWn¿rûÀ ¨•ë© (óM‚þXž v+¸ìÎݳÿ/wŸ> ÌgòÏäŸÉwmEÂoãTãTãT|ÑÒÞÒÞÒN’ÕêNu'@µTKµY­Â:a°Îúbè¼Ðy¡ó¸a·½ÿ–o¨ßsñø™¨ÜC#ó`̃lxvàÙgñO×,×,׬«’*†Š¡ÿó‡ñãÆO­1w˜;ÌìÀÍ7OÜ<áZ<æsŽ9ùÅÅÅ’m3ÙQv”ý×yˆ!ò=Æ0†i·£¤ßóü‰üAî¢õ¨w°sì;§ï檹j®úR¨m¥m¥m%}VQ¦(S”q|:ŸÎ§7}¯«ÖUëªÿª7u›ºMÝä;êOý©?;æÖ[ë´ü‡?‘ßå®»\¸ °›±YøI!)$åß:VÏêYýöTU°*XÌuð½|/ßÛL÷Ñ}t߯þÎ×;_ï|˜D¨[ŸÜXZÿŒãÿü÷ýx§ÀUIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-39.1.png 644 233 144 3076 14774263776 15054 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜóIDATHÇÍ–ïO”WÇÏÌ@eùa(I7š&H°‰Q'‚¨Ð¤…J°‚ÄJ¦¶oøáš¨¸/¨¼qIÚÝ¥ ¢1¦¡¬«6²XH 8Hƒ“µ„.55`ÚÚ•P¦+Ù5–¦S 3÷¹Ÿ}1óÌLÛÀûæÉùõ=ßçž{ν""’ù X7[7[Sòµ>¦Oz=éõ-ÿË ,U–ªoÿi¦}Ñ™ÑiLÅdÓnúÇÇ‹Äðãó™zI—˜b]ߺ>KqD~ª·WoOz>,·}À>°‚cƒÇú»ú»8 ?|ñÃóÅóÅ“M»éoÆ›xñøòþ¯ò‹@â­Ä[–YX÷ܺçDàÅÒK³Âžl¨8Pqà±í±M[@ý¤¢‹?~Ìå“M{Äߌ7ñL|3Ÿ™?ÌG óÕÌWEø¨ÒWé³_ L]çRãåÆË ÿàotÐA (‹²C¾€þʸd\úõ€Ð_믥œÊI€Ph>4Àe.“¾ÞÆñÆq“àÔuzYYí×L>òËÚžßÏï;;@¿ ¾ç{ÐeF²‘LPÑ{ô´~Yï×û£;…¶i›¶yƒ7øõÒº)4š&¨gÔ¬š5ÕÁq–‡ “àùýq¥yéÿ´wÛ»ý àÙìÙ Á?PþSÉ\×\+¡’PC¨!–i­g­g­¼n¯ÛëcƘ1fâ¨<â€/c,¦^öùú² û–ƒÇî±÷íÃöa‚ÉG´ED¤ãs8¡N(ð5󔧆ã•}EÛŠ¶Aú…ôÓ?FWÿ§zªz ¼ÍÞfo3”µ–µ–µB²-Ù–lg“³ÉÙŒý’ˆ1bŒ#0aþƒù ðBaoa/zø7knÖD½Æ+õwêï˜;×ñ¹„JEDî7ÂÈâÈ"tYo~só][˜Z0X0HÀ»Ç»Ý»vlܱqÇFpžužuž…ÒÕÒÕÒÕ¾¾>¸Ñs£çFOL¿Ø»Ø»Ø {›ö6ímŠwŧ¾O}"•®U¡ëÞë^“ØýFa!u0uP÷Qõ¤åIK Ðm±n±Š~_T_TÙ9Ù9Ù9peôÊè•QÈ=•{*÷tgvgvgBšNÓiÚÚÚãJ, @¨U»7ìNÙŸ<ßïé÷ÄüÔâãœÇ9©£©£ºÏÊß->‹m2°áµ ¯‰|«¾;ñÝ ùùÁʃ¼ 2´k((_d½±ÞXoˆ9FŽ‘#r²údõÉjW•«ÊU%b½k½k½+’<‘<‘3/KÅŸ=zÞ’î‹Ã;‰ï$†­ðÆ7ÀÖdkzââ‹ÅÏ4ža ;ü-Àdúd:øcsݬ7ûM¼@|9ü3~XteÑËC ¶½°íÅßx z_Ç›Ž7‚‚ +èc@8áF:àĉ9ÆbsÝWoö›x&¾Égò{õD¿ýº§r¦r¦l5Þ†®:N8sà ×´&þ@U„ƒ.ºµºU·â6¾SÇÔ1à¸qÂ8`Ü3î=_ÏÇÇ3é™ †Â9îË:ðÊWL]uÔç¨e«èÝÑ»ýgê›+3ˆ{;õíT0Öhí€7WªÑ ‡‘`$`¨ åR®§;…±ÛØmì"‰ ‚Ÿƒnõšz Í(õ¼ìyÙLkíèy+óVš+3ŽRD$þ¯´Ú¾°}á †Þ—z_íW¼1;rxä0sZ‰ö©ö©ŸI{ =ÐÀØþ±ýcûAKÔµÄ)Í4Ó Œ1À°àM»;wqî"sÓÏ»œ.'o@oyo9pÓVe«r3åÕ#†]D¤ê&¼Wþ^9̸Ôú_\Ȫͪ…¨ç£^z#å_)Í)Í0Ó0Ó0ÓE3E3E3°$aIÂ’ØrhË¡-‡`¢j¢j¢*àµAmЗ%”e–ebl›OM5³j½:[[ ü۫ǪED6]É9’sD䱿ìælËÆÞâÞçzŸ“…éáéÛÓ·Å^^^(’¿>}þz‘»·ïÞ¾{[¤½¿½¿½_$~Yü²øe"Ýk»×v¯•§cÑêE«­¹ÚsµçjÈÑΣ­G[Å’, Þ*ËFY™V‘V!"xõXƒ­}}ì"r7äŠd}—bI±Xj®v\|ý±„¶Üiù¾å{‘©Ô©Ô©T‘5%kJÖ”ˆô÷õ÷õ÷‰8.9.9.‰ »†]Ã.‘ÄÒÄÒÄR¿°ÉêÉêÉj‘ÊM•›*7‰ì8²ã£‰X……H¨OX qi¥i¥"’y>òü»Ð¸ô›¥ß¨N~9n·ûûßÛ>˜ý`’:’:’:àþéû§ïŸ†Ú˜Ú˜ÚHMMõÑæ´Íi›Ó ÂVa«°ùóÇÇÇt2èdÐI°ß±ß±ß°ùÐG¡à¢û«w¿z—qp»‚AeGîŒÜ©:­êGÏÏK§4.^<,rùǯ{¿î•èó"»w ìénënën ŠŠŠ™.›.›.©>X}°ú Èˆ1bŒ"ÑCÑCÑC"u3u3u3"ö=ö=ö="çΞ;{î¬Hì­Ø±7DVä®HX‘ ¿5þaüC‰yâyâ±DÒF›¥Sô߉ˆÜ9— /Â?;;ê;ê¢Ìü­î­nÜÛÛÚþ$•'•'•Ã5÷5÷574Í6Í6ÍBòºäuÉë ÎUçªsÁäÞɽ“{!7.7.7†V ­ZåßÁÖ¿´~Üú1üiqYCYnŸ›©kõê/.¯Ÿ]TÝ„’¬’,ÿ_z‹ÞÌ3ÂÆSäXb‰NqŠSöÐE]À>ö±/ÀÀ²Œ,# <×<-žPWÔê þæ9ê9 F¶ÉWòeÉ—À„WÐèó1l=¶g°q«gcÏFÐy}LïZp.8™ÓOèmzÿ1n7@e¨ •z^ €r(‡r…Rj¹Z®–懄^ÒÃô0æÔA/>ôléÙÌ{ùñø|ìœ!Ï’gûœyJoÕ[ •­²Ñ|Fi0‹€…¦gPf½*REh,è·ô[À¬y³ä…å…ý_ç÷Ý•ääÜ•¼ó~ÌS›l>áÂÁãô8ôúNÜàÝAÀ‚ü±¹nÖ›ý&ž‰oò™ü^=Ïòëâ™}=›/Øÿ]Ê$B’IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-143.png 644 233 144 2744 14774263775 14771 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü™IDATHÇÍ–aL•eǯC–œup¼«Ä^fÍåæÚÜuÌ9Éz™1È´Ð¥£¨¯Y-$i‡5ælö ñV:¿:ã°¦Óì FN…N Ûbm'tš !Awdïáyžûþ½ÎyÎsŠõÝëËó\÷u]ÿÿ»¯ûºoÉJ|ÒžL{2mAÜO{ÓYO/J/zÚ÷XàzÅõÊO^Èü<ós€ìöìv5ìøvÜÎO­qðSùìuÉgaþÉù']… ¿ ^}öÕgÓÿ÷öûŒûÌ}ªýÕ~€ÓÇOçß0þÝøwáÂp!8¾·óíz/_šþÂ/¸~ƒùÌDò^Ì{ñ©·â מ‚ÒâÒb€Ñ‡FÒi`M<ºˆŶ;)¾OäÛõ6žoóÙüq=9ësÖ‹À¦×6½æn‹ Y—[—kógXËNvâ¡Ãì5{¬*«ŠèÿÑõAÀ¥¾UßXV#1˜›ƒ¤Š*<Mà‘À7|Iþ¸g+•ˆHó P.å’Ôõæ^s/è«VÈ a$E„"Dt•®ÒU8æáQý/]®ËÑ@€†~L•ªR`}ÊsÊs€i›_R›mÙ§à¾í¾#Ó#ÓÀ /þ^ÏÌý©™Œ™ 0~6~4~Lp…+\ØîØîØnˆŒEÆ"cNØ(1JŒ˜,œ|~òy0÷Ïúf}Ì$Â/18Ò:Ò àŽº£Ñy¶ž„°#ýüQ[][méz±ÂXá–ð—á/Ñ|Xð!ô4÷4÷43Dz²²`£o£o£t›nÓm°¶gmÏÚÈ~;{{öv(û¬ìtÙiôìW3'fN8|lªª²{ïHBØï±¼sqçb;Q¿qÿî½Oî}BlMýš]kv9g÷\͹šs5Ž ó]ç»Îw9ñ­K·.ݺN©SꔂÕgWŸ]}Âýáþp?,zlQÆ¢ èÿæÒë—^'fó©}uu¶°ÞXpiÁ%}’éñgÆŸ†©»Ôsê9°ž°·‡•¹+sWæBw ;ÐÚi§6„6„6„`³w³w³нÅÞb¯#<²'²'²Öm[·mÝ6XZ8¼p&OM¼;ñ®“§;nýzëW°õdgdg¨_àέ;·€“ñc¯µšPNaþ…ü ùàrßå¾Ë}pôÀÑG€xÅ+^XÕ°ªaUdš™f¦ -¾_‹†nݺ wîÜ€åË+–WÀñŽc­ÇZ1c}vûýÛ'MDu«n×/‚Yj–Šˆ!""9®ʬÌJÒ¬ëÖuëºÈTÁTÁTHÑhÑhѨˆïšïšïšÈ’Ê%•K*EònäÝÈ»!===,RÑTÑTÑ$DÂ;ÂÛÃÛE2ƒ™Ç2%ásäe³ÝlqôØ=FçTçŒï9%fÄŒØ=õ;êwÔï€Á’Á’Á’¹Íß[Ý[Ý[ ÁÆ`cÐYoò7ù›üïÉ÷ä{ -Ò6Ö6 ‡õ01N$øú:»:»þÔc‰SImcmcÊ)ÁŒšÎD×Üc’É”ž(ÖźÌ‹æEó"¨€ ¨pˆC]¦ËtÙŸ´Çˆ!¢DÑü×ÜgîKá³j?¨ý`Ω\ö)¸ÇÝãÑyècÄ”=ÇTªcF½¡ZT 舞ÐÌ1í×~íÕªZU«3߬w¬ÖN°ö[~Ëj‘±×ØË _ÛøW=W=€éþÝýûœ9fÚæ <½<=9ƒ`­ p_U¨ ŒÄì×üÛ,³ÌÓÉ»ÒÄLd‚æªRUb$ñ’ø6ßœÉÿ7w%u‹ë’sÍ8ìg?g‹­-Öb ût.\àøv<Ù‰zÏÆÿÛ»ò}]<°ï±óûªNXq?’”àIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-13-red.png 644 233 144 4072 14774263775 15614 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜïIDATXí—{lS×Ç÷žkHº0³P•öZÄc ¢Ð0`iÉœ‡p ¡• * JŠ@YW Ð@+Â.QV25jˆ ÑšB°AéH5Ê$j§°*VEÛ‚Lœ¶3'÷ÞóÝñ¹~ˆ‡¦í÷ý;ç÷øÜs¾÷›h¦R‚ɹ“ݓݓÝÒ¿£i“:'uNê,Z®hЦhý¿§Å´˜Ó¼‘RH>èóF/òE=Q?±Ÿœ›ÈÏWKµT+»ç§ÿLéT:•N×Ci§´SÚi€˜Óéôþ²î溛ënë﮿»þ.àÈsä9òb¾˜ñ"_ÔõE¿çó¼"ÑŸÝ"‡äò-+4«zVõ¬jíö޶޶^þRp88ÀÀÀÆF0À|€áGçE¼ÈõDýÄ~³[žÏG–)ò <(ú΋yWò®ä]Qé÷D<x5ž©sCÕêÕµвµ­ÐìZ¡Vç×k¯h¯<“§òT¨"_Ôõ à„þ–)šä’\’‹H9¤Rµ_ ¶F[£­Qµ`{¸“;TÛÕµà>ý¤~À˜ˆÀ=Ü ¯ñ׌é£ú(À}£j»^ª—|ž­g#(¢m¶ý¶ýª]ô<‚LwLwLwVÿBXœ§ÅÉçx‡¼¯£u‚Ú§ã7Æo¿Ê¯>Yþd9 Þ>Àñ®¶IÛ ( ”Àè±Ñc€ö)ïäFPPôýÁ§lW¶+Ûû‰‰ÖªÖªÖ*^-V]j›Úšª©"¢ö¾¹ûæ@ñ•â+xŠyz<=ðúê×W¯!€È”S6À‰òå€êJH ·VµµñceøˆûÓ¥/J_„ƇE‹‰*¬â™¯_½~Þ¬~³:®1J-¥–§–(% Xú-ýÐ/÷˰mê¶©‚©R°ú§ù§Åú=,º5t <‚O€þ¶ìpÙá²Ã±'Ó<ã]ã]übèÚƒkàýÞÿfxfx ÄZb}è–o¶|®µ®µñãçZεÀ¤ÊI•ü7ÏÞ< hž„ä°à|QP|éèwô;úcÂÒVi«´U ZKò‹ÃÅaȵçÚâò´¼x¤|¤Þ¸ÿÆýøxûÄÛ'„¢Yûµ&­)VıııÄ8·¿”£_þ4Ø;Ø;ØKžˆ‘#21ökVÉ* ´…Ú©ˆBèAOüQ†ïðPAÂ÷}ï²2VFDTª ½Wÿ^=u³nFD·n°ŒH>Çö°=‘ä÷ù}~yÉvÙ.ÛÇD—¸ñxíñÚãµqHÑR´Ðvi»â_¦’Þ’^ÈÍÍÍ_ÁPO¨lmàÒÝKwã¦Õà²à²ØÊjgÚ^n{9ÖïoMû.ö+ù+)KÊ’²Æ[Ê–²¥{Ä[f}ÕúªõUm¶·Ü[î-7 ùÊqç¸3®!//€'Wœ|šFî_¸²¿Ïþί>¿@x·u·À[¬•µÀ·_|û"áhÖ¢½ † éÆÀ¦³élú±Ç”V˜V˜VH¤\V.+—;ßasØÚ.ÑV¯»?v¸Å³¿sä#P2\2ü4ÐM› Ó™éŒjóñ4ÿ4? k?Û~\DWÿ£ê“ªOô°¸•me[ÿ¹aÂOõS¢Í:bÊ2e™²| uõuõuõ|¥±s?ÑÎhgÀÐñÐqÁ@{ =0ù€~ôˆèezîîZÕèW£_ŶúTè”ó”oWhƒÜ 7ŒI3¤ÒŒŸ·%²kÆ•Z)UJ•«ŽJR‡Ô!´¢osw»»ÝݱõÔvE5+,‚! ÅKƒ+\¾oøJÞÁ;bRì4škŠåkË×êvc%°}l_Í@³“ìŠ%ÆšOù”¯ ¹ÈEÄüÌÏüž3®Ö£–Ï-Ÿ«fïÇÞfos¼võµzü9É1ŠQBtnÌÃ<€oÐsôœØ«¸ñêÆK/i»ŒhD )!÷ÁŒ;2vÉ6Ù&Û¤3Qº*ù£èçv›Ýf·¥®9»çìž³›ÈTmª6U»ÚÍ·åÛò㵫×éuˆÀ 7Ü៵ùÚ|m~L‹ÍËš—5/ã+»Ül2›Ìƒ£Ñ_K)‰;-]HÚz’’ÜžDß’2¡]ï™gj׬šUs H¿§ßÓïÅ´8€ îÔÔÔ¾ÎÐdšœ&§½û›$)Iâ›LÏ`ÍIÚ]÷"íªÝj·ÚS'O2€………mž¡ÅÓì4;ýYŽZTzÉ€?¦X,@x–v›,M–&Õìíðvx;DAAZ×U×U×;v”£ÊQåè@ô/Iêß“úFÇé¥&›Hx7ªÝ??K»k Ö¬‰i×ãÎqçàóÜØ ©Bª*VíMl#?Jê+Ñi/Òn.k` ¬Á—-€+œÎ 'ÿ]æXæXæ˜zÃØj?ó3Ý,jþv°“ìÌ›Ôo2ý–¬Ýƒ‰~Á-i³´YÚ P1S±¾@ž)Ï”gI$Ñ_{¬akØ&b}¬õI£‰’vîÿffã[!R¡r=qúã*™Ë\æ€tAº ]ø×O'Æçº“vÆ“T÷…[ý˜‰¯Û÷½ÝJIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-92-grey.png 644 233 144 6247 14774263775 16025 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü \IDATXÃ…—{P“׺Ɵõ]HH¸#"-"`‹T8(G­R´¶‡‚šZ*uFhõ0žAÛ㈭‚õRê¨hK•=ØRTÝrbKAto°—M™ÍØ Å* ^ `HHòe­óùØg<ÓéûÏ7+ùÖûüæ]ÏZëýHQQQQQü0æé·R…AÖ\ôeÑ—E_²9%#%#%#kã˜?ógþ¿#…H!RHRž½ÉÞdobGqgq–"шЋ^ôÈCòØQE†"C‘A …߄߄ßþq–Œ‘12¶÷Lqpqpqðõ;¥9¥9¥9Ä$EHRI›æ ·Ü\~Ü à2,Ã2®Ž–ÐZBo9&“ŽÉÙ‹Kô%ú}ÝÃä09L­·&Z­‰Iÿ­>¡>¡>¯“Ö$­IZC —ˆKÄ%"°8`qÀâ@ËÿËïËóå|3ùÝz²¾Ì#ó î ®`>̇ùÐl²l#Û"Nð|q£zò«É¯&¿ l l lu½·¦wMïš^Îoˆ7ÄÈ:E¡¢PQ+öaöA+¬°ØŠ­Ø ༀ`µ‡ÚCí¡Xgè0t:˜³-º-º-š¾÷ôÕ§¯>}uó'ªU„*b¹ÒµÍµÍµ-õËe¹,w0›€€€[AöOíŸÚ? èõš„&¡©ã¢Ãæ°9láŠ\¹:rµ´L—¯Ë×å u~Ïüžù=C$ Ñ_è/ô$‘$’D*¨  A‚`ãˆØˆ (((³·ÙÛì{§O7ž–²ïµßk¿×.üèáéáéáùË7R†”!e¬ÊÂ*¬ÂªÏ8Ï.Ï.Ï.@œ#Îçþ›õë7ÖoÂÿ™™™.­ËÍÉÍÉÍ~ôMôMôMÄ,š@h ˆÀÕqu\€*T¡ ÷É}r A$ˆø?à@Ät‰à{Í÷šï5Ì’óGnˆÜ¹AZ'ëË<2'Y$‹dI[ì¸ê¸ê¸šóoë×®g]›®M×&È™@0‚ âC|ˆ`O²'Ù“ZM«i5@tDGtò‘|·q·6ÀØ0õëÔ¯S¿Òaé°t ‡Éar>r~]®FW#Ôêu:¦‘yd>E³h}`ƒSíT;Õ€ö ö ö Öø}ë÷­ß·ðp'R™Íæ@àbÙŲ‹eÀð…á Ãõ õ õ Ã;Ã;È}û,ö0~düÈøàÒ©K§.4>h|Ðp ¸Ü@[§­ÓÖ«±«¿z¿z¿zXµ­F«ÁšÆšÆšÆ@ CÅÐ8I#i$Í¿¿ëÿÄÿ‰ÿ}Éû%ï—¼I•PECRCRC`»d»d»ämÈÛ·ˆ9s.æp~ÅùçW®C®C®C@[|[|[<ðxìñØã1 wyîòÜå€v¶v¶v6ФoÒ7龞¾ž¾Y ¤Jæ‘ù8û¨}Ô>Š?Ï+›W6¯ …ž ž ž °º' S>S>S>ÀcÈ1ä´w´w´w€°Ø°Ø°X íÓ´OÓ>Ü› wœwœwœ€=ÞaÏ’ÕÉêd50—Î¥s)°T½T½T ¨2U™ªLàñúÇ믟ÔJµR­„Uæ‘ù8Â!"Ñ\=WÏÕÏLPÐa:L‡å„rB9ÕÕÕ7;ovÞ‹‹‹îUÝ«ºWVUgÕö1û˜} ØÌ6³Í Ðvj;µÀô±´´´ééé@DgDgD'ž·…ÛÂmð9>Çç$šãCø>„]šHžHžHÆ€ô¾ô¾ô>x÷qÂä™Ù-Ù-Ù-€%Õ’jI* † pëƒ[Üú-¢E´4…¦Ð”)y y y•••ÀwW¿»úÝU`ã‹_Üø"âââ °<–ÇòfôøÉîÉîÉn p‘\$É.á@È!Ž‘½ {ö&Ð#]´‹vQ&Ç$£ctŒ±ÁÁÁƆçϞϘ³ÒYé¬dÌ4`0 0¶¿dÉþÆg ΜŘqÄ8baloÙÞ²½eŒµ[Œ-FƤ©Ej™ÉÏ\O\O\Oþ¥7>>ÎØ¾´}iûÒØöâ²â²â2ÇtÐŸŠ„"¡ˆ¶··»"G·ŒnÝñ#~ÄíµÔþP½¼zyõr`¤c¤c¤¸6tmèÚ˜˜˜„ÓpNæêæêæj L¦ Sˆ@£Ñh4î9Ýsºçã'ÇOŽŸ„e²L– •>QŸ¨O¤ËH?é'ýøŒ¸ˆ‹¸ª=Èg ?[øÙB`¤}¤}¤½ö×Éí“Û'·o ªˆªˆªpíÎ Ë Ë ãMš'Í“fØëçÖÏ­Ÿ EoBoBoj µ†ZM ›65¦S€ 8^s¼æx `+´Ú ÇqÇqÇq€T RXß´¾i}ìí·Þy˜ù0óa&µÞØscÏ=œÊ«Ý«Ý«ýŸYN½SïÔ/­$ûïï¿¿ÿ>€Ÿð~zñ¤8"Žˆ#·<-­–VKkxnjWjWj{%í~Úý´ûä&ͦÙ4Ìæ s†ˆïˆïˆïÜ|n>7@*R‘ Øêmõ¶z€ ²A6p¾œ/ç ÐZ@ ÕqÕqÕqXnù¹åçlªÍªÍªÍÂ5S1›z•ñŒg|Ò&Ä 1=Ûy­·Ö[ëÍw‘ZRKjÇ7LßÕ?§‰ bƒØ°5y0o0o0u———“‰à+ÁW‚¯`>ÿˆÄ?‚ÈUqU\À^f/³—²“ì$;QQÄ01L „t!]HÄ›âMñ&&,á–pK8¼Î÷œï9ß#ý(ÅJ±R,·Ž×ð^³÷’‘Œäÿ9‰£8Š£B¨»Ís-™î…ä9ANÜÌç´œ–Ó¾×4Ýq•ú8}œ>NÚa.5—šK¡"Ù$›dc‚íf»Ùn€„À ,ÿç*Câ¶–­ekawïjýuýuýu×î§^O½žz 'ÛÛÛ/”ƔĔĔ|rÅ(F1¹ˆ>ô¡OJ•ûQ5†0„!é P€Òw%îJÜ•c™Êw•ï*ß½P:88(˜ƒƒƒ\»eÁiËÀ 0àÁƒ¦i€™‘ÁÈAr„âûþïû¿ïg¯tíêÚÕµ‹?¦Þ¨Þ¨Þø`ÊqÊqÊqjÏÃ.Ã.Ã.€õ³~Ö_·Î2¨|ÕS/êE½à{{øöðíaÀQà(pì9¢öWû«ýë{õ½ú^=¬ùæ7šß`¯|’Oò¡ µ´–Ö‚ÁžðØ8g㑈D$Ø÷?îÜ ­‹Zµ.‚¯Ú¤6©MM¦É4yÏ®œ+çÊLqg¹³ÜYþä4K“/"ÌîO…{è^"þZÑŠV×n²Œ,#Ë^Éœ®Ô¿8w8w8wЛéfº™r+ãËãËãË‘AïÒ»ô.T\ ÃÅÀ.J…R!§£NGŽr-0-5-5-åÊEÊEÊEÇ–Ooš÷~¤U´ŠV 'Ý+û_òŠ•–––––bB®(Ü?ÌxÈíÝÝnïžt{÷êŒws‘‹\®RïÔ;õNi‡ùŒùŒù TÇq‡q¹×m×m×mÔú êAÕƒ*Þ¨üPù¡òÃ;_ÛÚÚ~ø‰ñ5ãkÆ×7`¤Ü­É€2ß èsÀò *w‚ïÜÞýËÿónÈXÈXˆ`n(j(j(ríÆ,Àø †œëèêèêè"Ùª»ª»ª»¤‘4rç-á-á-á-ÛËš%š%š%ܨ[ï?ÜOÛó\<~'RRRRRR ¹‡æÁ<˜ùOS¬)Ö‹W˜+ÌöwI¡Qhš•R¥>J ¸bî1÷˜{XÅí/nqû × ‹Óâ´8ùq¥¸R\ù~(;Ãΰ3翆 (ø{Å(Fé ò ¸ %=ÏCðñ;Þ-A3šÑì*fM¬‰5¥ôq—¹ËÜå¿j¦^Ÿz}êu+V‰Ub×Ãçò¹|n[{Ôå¨ËQ—צô÷õ÷õ÷‘oél:›ÎfÕî¼z7 õ÷88üA<ç]÷qá*ž>'…’CrþÅšY3kÞ»Õsžç<Ïy\?ÄñCçÑéÇôãÃw³îfÝͦ¡qç“KÛqü/^%ê‡ÜíIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-16.0.png 644 233 144 3146 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ûoTeÇŸ¹Ùœ¥jºÍ‚å’à0k )Ô*„!‚¢›¡¦DaK›Ý–¶‰Mš&MÐ8Aà "# ì`³ZÒ¦Ô'Š%ÕÒ­e)¡vŠ-ÓÒi^˜ž9ç|ö‡™33«ûðþrò\Þï÷{ÞËó¼""òHâ+`^h^hž·Í;S~ûóöç—~·©`zÙôòÕ=ùa懞zô”Ö—²¸‘Ÿ>_$…ŸÎgøåI92š2šLž„íƒWܯ¸í¿ŽÛ:ÁÑâh™ŠAeke+@s}s=¡ Cž°R¶7òù^:¾ø~Æ/¶v[»é&d<”ñälÌÙ¸äõxÂÀð¾ä} `Ð2hÑÍ ŽNœºˆÁ£i¶Oäó <ßà3øãz²Ög­¢mEÛ~‘¾¨YP³(PZø>œ ZU+РšU3Q½[Û§íþ¦¿§¿ _Õ¯÷ÕWÕW‰B, 'ù˜qêß%ðÚwµû+C`_gЬEV‡ßÐ#ÿ»·ï?œœ ¿ té}ÔP _Ö/£ðe”¡kgµ L®z™^¦—ìØS~*ñàA׆Ônµ¸ÃТq|Þ(~§øCàûÏ¥m¥ˆÈ²Ãàˆ8"+ßÝøàÆIاîN><ù0ÓJ—Ò¥t¥ø”QeT…‘]#»FvâVÜŠ;MÐ^ö²7eÎ.˜}aö¸÷x¨.TÇ´îŠãCM 0äèqôD¬Dãz„+""Ǿ귪ß} €–>8òöÈÛPøûÂÍ…›ÑÛO¶ÔþQЍd¢d¢dœUÎ*g¬«[W·®ÆV­[Å/FÅPÅíŠÛà8Z-è;¾ÝnÛn3¢Z.ç«sªs€gâzD¿."òýnhh€©ËzyÁ_óË,®_zÆ{Æ{Æ¡;Øì¼CóÍ;½{/ö^„ªýUû«öCçéÎÓ§S‚Z‹Z‹Z‹ÀµÜµÜµBkBî~ç[²tÉR¢ŸåuÑ…^ŸŸüü$¨Ö¸³iþܶ¹mykäúÚ§Ö>%2çï""&×é ?\øA2òþ˜·=o»HÔõD="ááá"¡K¡K¡K"ÞÞÞ"C3C3C3"î ;èJr nÜ0¸A$;7;7;W$»'»7»WdáoržÍyV2þýç+þ+~“_dã—¿!:çÜœsykÌò+K‰¥—\³í³í‘#""rÏ2d˱åˆXË­Ö óóó‘éƒÓ§Šä-Ë[–·LäfÓͦ›M"cçÇÎñ7úý)a¦-¦-¦-"1WÌs¥üJ–ò´ò´ˆ}›ýœýœÜ±Ý¶Ý1͵ì°ìÀe´³ÚYÓ5Q”ÍÊfÓã""’eÄ$F ‘IˤeÒ"’7ÿnþ]‘á[÷†o‰ø'üþ ‘a}XÖE²*³*³*Em¶@›ÈÊ+W¬\!2X0X0X â[î{Â÷„H¨+TªñüdzdzG²DÆ£ãQÓ¦k‰[ùýnþ‚Àâg,qD¢µ/Ö®¯]ÝÝÝ©³S¿©~Sý&X[[ƒ†™†™†‡‹ÃÅà=ì=ì= ã®q׸ š5/j^…w û û᳟Z´!š(6åü6à 8Åõ$„ûªß¬~3í–‹Ä"ÀýøÌ¤¢Å,f1p”£M»v}ôÑÔRKmš-kY üƒSœJ•=NĮǮO|ÕÇ«?%ne²ŽéŽ?F¬h7”JªŽiR:”¦õqæ3?ŧY5«fu§ºSÝ šWój^ ”RJAËÔ2µLàŽs´g´×´×@]=ë›õ1­}š¨cZ¿«ßàp D¬Luì•kÆÖŒdíbJýBýP´R­%ùÇ:³Ì÷™a&m…t44`‚QF“k­ƒV®•£0«~­~†ÏVûVûÿ­ü?ë•Fï2z%‰Þïò.Î䣖¨%DAïÔ;0a‚”mÄ|c¾gà|²W>°¯‹ö=ö`¾`ÿ Q„Èë1ZöíIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.2.png 644 233 144 2621 14774263776 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜFIDATHÇÍ–]hWÇOb5Y‰_ XC ÑµRK«[¨Z]´Jc4‰F ‰´U‘"…4¢-UHh¬ÑP¤ø`ª©±±ˆµæ%Ÿkp Á† ÖàgÉvµ‰f“˜¸ëÌûëÃÎì¬Zß½/»çÜsþÿÿœ3sî‘©ö¯@jvjvêä¸ú¹ëO_ž¾<÷—¸}HAÊš”5W¾†)§˜vdÚëšk;ûN|r¾ˆ‹ŸÌçøeª¸Ž´“i'Sü¶½Ö½½îíô¬¸½ïxš³ù ÀéúÓõ|á`80èôƒk;ûN¼“ïà%ãËžçøE`üùñçSîBÚ„´ "óQÎGolÜ|òWæ¯è×7N§€ê2ÈÐ~`„œ5d;ûv¼“ïà9øŸÃ×#ùaæ‡"PPRPâù CDäZT¼^ñ:P`4ékTPA†1†aÐ7ÌwÌwˆ±S/Ö‹˜Â}Y_~4˜ˆéß›ÆMà[v±‹Œ¸P£ ÓÆÇá³ùm=òlok–BQVQ–Sã"hŸöðßaØ:Q£(Q¢¸+›l²A¿§½Ú›ðjý­š§æaè¿Ì}æ¾$ü±B«ÐrÖ,Mj¥ˆÈ›?€'ì ¼ÆùÞ³½g€+ž~üäÄ“ŒõŸé¿Õ Ô ÔÀ`h04‚èÞèÞè^^XÆcƒ±úßêŸÕ? Œ=Æ)ã€Þ®·3FGzU¯‚¿­'5.ïËù"¥‡JM2­¨7ß›¯çÛº›Û>èŒuÆÄãýջûC$ïß¼¡¼!‘éÓ;¦wˆÔùëüu~I¬H(Š„DÖ¬-X[ 2;vñìb‘%—ÜXrCäÑÍÁêÁjñH<§™€wœwœNð'ôÄö|CCÀoúS°†¬!bÑ¢ó£óa´m´m´ ºŠ»Š»Š!'7'7'îFîFîFÜJUGÕQsfÌ™1g†ë_T¾¨|Q9ÔvÖ6×6'Ü1õ¾ÃgóÛz&wNîÔ'!ì û’zqK7è°~¶ê­z×]zµôjéU¨­¬­¬­týV»ÕnµÃý¾û}÷û /Úí‹BËî–Ý-»Áëóú¼>üBIy›\À´IÓ&YWa 4Ìøgo=Q«¿]€ž;=wzî@î¶Üm¹Û R©Œ$ Ó›ô&½Éµwzvzvz`AÕ‚ªUÌ f3“â×ZyV0ꌛßÖóÒŠ©Õf–™åÚåÝåÝåÝPØXØXØèú¶Ëº`ë7[¿Itþ]0GÌÀznn]â—€0aÂIï¤F'EýߊKŠvð|\Ï‹sÌ™+9c¶3f³n[·A—é]’Dw€k¡µÐZºPêBP ªA5€º¢þP€ú^5«fÐj¦šÉ˜½‚ǽ‘ÞÈ‹sìÿ&zQºÃj\TAà±UlcØO­°P(`˜a†˜}<â€A;þ‘µÚZÁSÕ®Ú“ñ‹ÒŠÒœJ=3ùŸ;+gWÅÌŠ™ €& Š*2ܨOÔ'Ä@_ÐH!\ÛÙO´ÌÎwðü—ž•¯ìí╽½š7ØÿlÚMb ¦IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.4.png 644 233 144 3161 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü&IDATHÇÍ–ûOTgÇßáRíÖ­iRBkÊ™þ2VBãu@a  ºà¥$¸Öl·»Ù„²Zö–B鲂‹K›%µ@g5Òr)ÁZ¤ ¤ÉFCê ‰*ÃÂTnœsÞÏþ0s:ôòx~9ó}Þçù~¿ó^žó Bã Ú´%(ʇƒ~ˆ‡ÛÃí ÿöáz ¯^ùïŸ ú½è÷ž¼øäEm4€õq=}½þõzz\Ĉ@ ¬9¬Ù`óã·á@òäð>\ÝÆVcë’ÇÚµ´4´4𘚘·ÍÛ €õq=_¯×ùÖó‹· /„v†vîAØaOOï~z÷3¿õ%¸žÇ>Ç>€ÉàÉ`ªˆ BÚ€ПÙuX÷çëõ:ŸÎ¯ëéú>?âvÆí‚åxr<Æ ¾‚Ñ9[ÒPÒò€·•?RO=  UUÊå«ò?ZµV \”ÈäyPÔµ€Ue^™àˆ ÊÏ]b.1ëG?Ä™£åhÆ ÷jÜ«5õ¿kvñ\^Z^È缃ÀK ;´:­¯öµÖ§õ!e¹¬–ÕßÍr“Ü$7»x™—ùá#¹«¥j©x寕g•gõ°w5ß”oÒ ÖìZ·”B±õŸt !àJt%‚w?{ÝÏSõMË^›÷ ï%ïïïp§»ÓÝé T*•Jå:+½ôÒ ¸™dXó…W·Ü¾ÜÎò·?[YXY`/¸N¹NÆzcýBŸ!­BQ?¯Ÿzý<\ÐR²Ú2š2š êHÔɨ“HÛNÛ‹¶a¢~¢~¢Ò3Ó3Ó3!¦ ¦ ¦òêòêòê`íòÚåµËJ¡R¨pYR™½ÌŽÜýÈ6c›Ñ£ZŠvéX± ÇçG(?BˆÛ%ÐÙ îÈêÈ’ÅÏÅ%\M¸Êª^š•‘•‘•)C)C)CàˆwÄ;âaÖ:kµÂfÓfÓf ô ô ôüh)éëë lœ}ûìsö9_k=ÎVg+ð¹Ï`KäW‘_ÉfpqéóÙóÙ0éºßx¿®Ÿ¼~âú H¬H¬H¬€Aó yÐ ò†¼!o@êhêhê(Äzb=±˜qÌ8fCs;ævÌí{´=Ú +–,‡¬ä½‹{yêד¦IàŽjŽj–Í‚–˜î˜nm„_øþ¹~ìOKKÁb±X,¸+þV?}~: XU[U[U ÁµÁµÁµ`½m½m½ áÂî‡Ý‡öÕO_ûô5fa%d%´ì¨CQ‡´‘ íK¥B©0Œˆ– Ó¦…èøò3×g.÷÷GÕ‘Õ‘Bn+L.LÂmv›Ýf!Î…œ 9"ÄÑÃG=,D_g_g_§O?<ýð´¡5¡5¡5B8N‡Ó!„5ÞoâÊ¥+—®\"áfBB¿s7&mLbkúÖ{[ï‰8!–”%EC}ôF„ú{}uuÁÕ‘/œ_8e±ý—é«é«¬f^ÏlÏl‡mÃÛ†· Cwywyw9œ9{æì™³`ÙnÙnÙM®&W“Ë×ÿçmkÎ5çšaÊ4eš2f°ë]ït½ÙPöqÙÇëöX¯³ÍÙ¬è{ ýTÏ8ž8% ^S¯àÁƒü‰Î$¿½Ë]îå”S¾.Í.íÒJ¯rM¹Z§6¬ #y_yWyd¶®wü£ãsþSI‹¿a7Ž/„È›ã/Œ¿êß|}L½³6¿6Ï²Ú¨Ž©c È™j›Ú¦¶Zª–ª¥ Y4‹fŠ(¢´X-V‹þÊ[¼µÎè'j¸βö?Œ¿4þðȧâïc?êükù†|ð?gö¨]j0§ekÙxñúç ÿï–YþÞLª¨À·Ì2 hz¾V¬ãeM½©Þýüä‡ç‡ÿdç÷+É-È-X÷­äͧÞ|ê»>ß TRI( Ê€zH=Ä*È~Ù€°>®çëõ:ŸÎ¯ëéú>?óíâ±½=ž7Øÿ7)'°ç¸™IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-98-grey.png 644 233 144 6266 14774263775 16034 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü kIDATXÃ…—}TTÕÞÇ¿ûÌ™÷€$@d/ /e -$áŠÓUƒX¶Àëõk¦>v) „ê!‰À¥Å AWo *!*…H2P)tÍ_Q^D„  f˜™3g?0‡îêY­ö?{ísÎþþ>{ïïÙû·I~~~~~>T˜+†¹ŠYÁö³ýl?mÉÿ4ÿÓüO©GáXáXáØª¥Ô™:Sçýç<9OÎ3|‹¹ÉÜdn¢ï Õ¨&¹D ô¢½¶` ¶Ðw¤)Òi Ée°Øÿ®&“d’Lþ«ªÀ½À½Àýü¢Œ¢Œ¢ 2Êùq~œIœãà;í\*f01ˆajùB¾/ä;-3–ËÌ£…ͅͅ͵ƒ–Q˨e´õ’1Ìf ÿåAåAåAœ OOO ¹‘âHq¤ˆp‰p‰p„¶ð^ø^è/èÍëÛã ñµÏàSÔ‘:RG>d’L’éwPä'òù]82S3S3S³Èŵյյն+¡7¡7¡—±ë‚uÁ:’$Í•æJsaÄkx ¯A#Œ0ØŒÍØ `!b!Œfo³·ÙI:­N«ÓRk[`[`[ ¿k|õøêñÕ/”)ü~ ¿å2[¦-Ó–fÑ,šÕŸF@@ÀpŽKáR¸”§7âi<§‡eä=òy ö{ˆ=þ÷¢ñœñœñÜ¢5êµêµêµ\RVFVFVûS˜S˜SðËøeü²y–©ej™Z•¨D%@†Èˆ;q'îêQz@¤u´ŽÖN9N9N9X è«SÔ)ê.Iˆ/ð| 7ÍMsÓ‰–/,_X¾Èø/×u®ë\×QM›¦MÓÆ ™‚;ÜáGâH‰#`7‡›Ãþ(”?  Ñ €ÝØÝ®à ®Ô‹zQ/Àü¸ùqóã€-À` Èur\‡£ ¯©ÓÔiêØZ×õ®ë]×SGàci ¤ûR­J«ÒªâÞŒ{3îM$¨¾T}©ú»Âàjp5¸ÇKŽ—/FêFêFêååå E™¢LQA3A3A3ÀÃW¾òðà„í„í„ ¸—w/ï^ – K†¤Œ¤Œ¤ áU5ªU Œq1q1q1Hh(m(m(ÄÞbo±÷¾T†óçü9ÿ'¶:ÿâü‹ó/x'Ä!Ä!ÄTÚPԇׇׇ¦“¦“¦“À–Ô-©[R%5Kj–ÔÇBŽ… lݶn[7ÐþRûKí/ª Õ„ Øš¾5}k: œJ>•|*˜z}êõ©×…(ççç’JGàcÌæ óŽú–ø–ø– W^/¯—×ÃhïÈÎ:Î:Î:ƒ–AË ˆ»w#îàää$¶$¶$¶¼–×òZ@¿\¿\¿°tYº,]€“ƒ“ƒ“à-ñ–xKõfõfõf€ù€ù€ù0Œ£a”U¬S¬S¬ƒQàø¼·ñ6 dN0'˜ó¤ü?²)Ù”l p«u«u«.·_n¿ÜX",–àÊcW»ò`J2%™’³»ÙÝ쬬[Y·²¸k¾k¾kö{î÷Üï ^{xíáµ@`o`o`/àQáQáQðƒü ?ø[|&IgÒÆa&ŒÈSä)ò¤'§¢¦¢¦¢p‡ÛÍíævCDLÄDL BÏ´¯Ò¾Jû ˜ŽŸŽŸŽÞÓ½§{Ot®î\ݹ,,,¬™ÖLk&ðýªïW}¿ ðöörrr€'—=¹ìÉeÀ@Ô@Ô@0–1–1–0¾Œ/ã;O4seæÊÌÜaÔŒšQÓ“¬¬DV"+áÊï¸ßq¿ãνZzµôj)É $‚ÀD Ô@ PÌLÌLÌLiii€[™[™[0~züôøiàCÇ?tĉ?\ºtéÒ¥KÀšá5Ãk†ÈÔÈÔÈT ä‡B~zº{º{ºÛ_ßþúö×°o*0éSõ©úT(ô³úYý,ޕݑݑÝáÊh ¦ šÍgóÙ|’ÛæÞæÞænSO¤O¤O¤CATDET˜êx«ã­Ž·€#Ë,?²ÓŽiÇ´À™gœ98U9U9U¡÷Bï…Þ|û}û}ûÎM›:7}ê>uŸè(î(î(èºn|®ù\ó¹³°»œyùÌËg^æcˆžè‰±Û ãÑîÑîÑ^¼W'‰“ÄÕ ÇŽÇŽÇŠî677ÛvÚ5eš2MÌ^§¼Ny >4 º6tmèš÷Ö]_w}ÝuÀå —'\ž>.û¸ìã2 ;§;§;H.I.I.õUùª|U6F6F6FòÆn„á˜ï$$$®m´Z­ƒ»¬$o(o(o@7ºÑíuH<&uʧ[§[§[eÅ÷Ä÷Ä÷Е‰C‰C‰C¤OãÓø4P«ÕÇê"Þ.Þ.Þ0^ŒãàU¼ŠW<‡çð€XÄ"°ì³ì³ì˜“ÌIæ$À^g¯³×aü1äÇCð·š¡š¡š!œ‘÷Éûä}³«©ˆŠ¨(üoX‚%Xró SÍT3Õ¢¦”)eJïoçûø>¾/Ó¢8¯8¯8h_Ô¾¨}‘þE·F·F·uö#Ó$ •„JBf³‡ÙÐ:@” %Öc=ÖtˆÑ!@rMrMrmpjêôÔé©ÓPœ­>[}¶šS‹ûÅýâ~`.ýÛË“hM¢oþå(G9ëmOól‘sy#»$ÉÁöl&މcâv5ÍeAÌûÍK›—6/å¶Š E†"(HI#i˜¢»è.º ‹È"²è?’‘qŒc ß’oÉ· £a4lÞ‹ŽçºÎuë²íœ<6ylò{HºPºPº°®hñ»‹ß]ünÙ ä8úЇ>.^ÈG•Ä ¹ØØAš–~¾ô󥟗ÿU¶U¶U¶µ®hÒuÒuÒ•54¸5¸5¸ýæ]\Æe\†:è `…Öß¼JÓi:M%o7È~£ÿFÿž®ì¾Ø}±û¢¨\é¦tSº ÏZj-µ–Ú=Å7 nÜ(¨žê©Nv™OPá$:Á?Â?Â?§«#WG®Ž–––{Š•ÎJg¥sÿ‰ÞæÞæÞfQyËó-Ï·¤ÂŽp0ý¬ÿYÿ³u­¡­¡­¡pRŽ*G•£ÅGñQ{Šç¬7PغìÞ=õÿ¼ë9é9éÉêóëóëóm;±‹±N:‹Îk{´=Ú’¦¸¥¸¥¸ðj^Í«ÿÙÉnb7±›LOúGúGúG2öxÏÙkÓï¹Døƒ ÎÞÔQ •P ùïÑ Ñ Ñ |dó±ùØ|.qR©¿Ôýû?ÅÿÿS¼Ë熛†›†›ô½«Ÿ\ýäê'¶§¦­ÓÖi«h‡x…x…xÅnoZE«hÕ±³B ©è.&0 ~¡°ö‰â~ÏCð'å¼[ˆ´ ÅV@›hmŠíc™F¦ñkÿÙäÙäÙd>H\)®W27EY¢,QV[G@c@c@ãªX}Ÿ¾OßG¾äåå¥GìºÍv@ãq0ø“ò;ïÚ· [²‘löß$ƒdŒ‹´…¶Ð–m–ûÊ}å¾ÌMÑ hP4xß—ßÏïç÷o¹µñÖÆ[9@øÛõ„ÄÒôgÿƒ~õ´=È$IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-11.8.png 644 233 144 2746 14774263776 15054 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü›IDATHÇÍ–ml“UÇOßÖ•Œ »&/‰¸ ÄØ9–`$Ñ8el DHp‰²†Äl HœÌD²qø’è"Š/sdëÂÆ †d °¨Àpc bÀ%´µ4ÝÆÚ§Ïs~hŸ¶:ãgî—'ÿ{ÎýÿÏsï¹ç\™‘ø XçYçY³ãØúZj>ó¹ÌçµÆñ§:XÖ[Ö_y r>Îùàc3®¥°i7ýÓ׋¤øÓõÌy™!© §×鵬Nàwà¥Â— 3gÆñ{}àêtuŽÇàõ“¯Ÿ8ñÕ‰¯Ø £?Žþ\\ )lÚMs½É—Î/ïüK_§§-¿ƒ3Ù!óŸÿìûâÃCùšò5·l·lÊ ºÈ"K­„1‡? ›ö„¿¹Þä3ùM=S?@ÞÓyO‹ÀºÍë6»¾@¹ÖµskçÅZ'-ä Y Æ‚ún}7VߪVÕ  ®ª«@D߬o&’ôÿ„ÏøŒ,u>Á÷uM[M›àµ¾¬ˆTD\_˜ñÈ?Ïöð3°alè]Újˆ}ìP]ª B©:U¯êA]WCjÒö̇/ ÏV÷Ô=”š§ëºŽL0Êçdza͆ä~&í(EDù\aW8lçâPÓPS’ö…ñ»cî17Ú í†vƒ)c<4Á{#4¦`´/úWô/¸S>Ú1ÚÁDìÑ8? Û†m@Ÿ«ÍÕ¶›ñ¿Šˆ|ú=T½]õ6¨'ŒÇ‚ïû| PR[r¤äªçžªžª´iñ·ø[ ¤©¤©¤ zª{ª{ª§<<<eá2™òæ¯Ê_…Z·¬lAÙ¸÷T\vÙqT}<Qƒ""ý5Ð>Ü> ã?¨mÅozÜ7s_{+{+{+S‚žrO¹§<•g+ÎVœ­˜X÷Âî…Ý aq×â®Å]pùåË/^~}°`Å‚DÎì¼Xr±DmƒÓ'OŸ}v<!œ}*û”òòÛè´Ñi v&îуÚMí&xœž Ot:”`DETD'Û“íɆ®Â®Â®Â”Ý#~¯ßë÷BAiAiA)ä4äÈ9¯_1kÅ,¸3~WÝU¾ߨÃÓ˦—)¯U¦Û¶Ø¶P ŽFG£ˆ|$""Û¨c¾c¾ˆ½Æ^k¯±Ì´Ì´Ì”äpZœ§EÄ^m¯¶W‹ÈRY*KSvk®5ך+â-ö{‹ErçäÎÉ#:j5ˆ¨ê õ„H{g»»Ý-‘<[žMD”+r…«`tÝ–Ñ´çµçE,‰ˆHž)Ý­ÖŠÄFb#±™2¢—¢—¢—DpàÀ‘š?Zz´ôh©ˆ+ì »Â"··ßÞ~{»H‡ê0: ÿ%_›¯M$ÿüiùÓ$Od24‘wU‘*² $ne ?ÿîøw@Y<ÇÌ«ÛQ÷JÝ+pÁ}Á}Á=5‡ölݳuÏVè_Ù¿²%L.Ÿ\>¹Ö¶®m]Û ¢@Q š÷6ïmÞ EYEÖ"+5Þü9‘8‹ÚÆ/ÇûŽ÷ߘ9FòVÖWÕ'3ä1ˆ…c©Š®€ˆIó¿CGGOÇ8Ä!`«\Mã éËôe@»©Wµ¿j?`$ne²Ž)ן®?ÃvŒ!mHKÕ1c›vN;Ç„ 2›ÙSã0*J£È ƒ `AÁ°6Ãle›@¿ ëºz]´#ÚÁ„17QÇÚ¯/¹¾À5â ÛùìcS*ÿFçF§)«ýÀ¸~F?hF¥Q‰–ücˆÆ½1–ÀïQ!üøž ÀxÕxˆÞ«÷¦ñ³1sc&üGåÿW¯4{—Ù+ã앉#Ö·è[ˆ€êS}X°@ ›ödJ$Ö›|&¿©gê'{å}ûº¸oßc÷ç öoø ßøIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-83.png 644 233 144 2512 14774263775 14705 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÿIDATHÇÍ–mHTYǶ5 ÖhØŠnfÈ‚ÆD„áàZ­ÆÔîôî‡^TB¬ ‰¨È•`Ý5Úl]©°¨ +²„e# _wA!›BjÉl G'Çvй÷ÜûÛ3wîm·—¯/—çyÎóÿÿÏsÎyî „"9ú?'~NüŒˆ_fúV%¬Êú5b7Iˆû:îë¿ý”ý@ʹ”sÚCÓ6âÆ|k¾&¾•Ïð‹da:lWlWâœQ»6.ܸ0aVÄþ¡[[ÿQ¡üFù €kžk*Áwßw à 8Á´¸1ßÈ7ð¬ø¢æ?üBÀÔ¶©mqƒmšmš0·pná¼=‘ óÀUì*x>åù=ä0D’îÆÇ~‹mÄ£ó|ÏÀ7ø þˆ©ù©ùBÀºÍë6'6G^€ý³÷ÏT¥h¢‰$~VëÔ:ÐÿT³Õl&9­—è%d‘|§éE–ø9õ¤z€FI2ñ¢ø1>ƒ?¢G¼¹·õ_Âú„õ À€Ò 2$C@†<$¡èsô•úJt£Dú*½P/}¹¾\_ú~}Ÿ¾/VAôOõ|=yI^B9*GI?ÊãVAŸŸ„D_¢oüx,Ën¿i³´Y„ G¸#|;|^º^º^º@UF•QSˆR¬+Å0\0\0\ê1õˆzČӣekÙ1¼"“Ïàè‰ kê„]‡w6²µ/ôçJ¿Òo.<и¸k‚k‚k‚fK³¥ÙÀýÄýÄý|™¾L_&8K¥ÎRHnOnOnwƒ»ÁÝáëá–p‹‰ÇJu™ºÌä3ù#z¢Âz÷Á¥±Kc±¼²/\®ŠàfæÍÌ›™0¿u~ëüVèëëëëëG¥£ÒQ [Žn9ºå(¬®^]½ºFl#¶d¤e¤e¤Ag{g{g»Y8­\±)6_ßiòGô˜qoÆ=ý ør}¹–³ñ‡vB;aÚ#Y#Y#Y³ gAΰ°°€ÅçŸ_|üÇýÇýÇaÂ=ážpC^z^z^:ÌôÎôÎôÂðÕá«ÃW-ø¿håZ¹e‹cü=R¦§L×úÁ?ä2¯½üJÍU-BaEéŠÒ¥¦iÙÒ²¥e°·hoÑÞ"ð>õ>õ>¿Çïñ{ gCΆœ à¹è¹è¹hæÉoÕÝênk›1ø#zâ…Ðni·âú…Pתk…1RÅO¢JTÅl‘îJw¥»„xÖó¬çY—ó/ç_Î"´5´5´UˆÁà`p0(Ħƒ›n:(DWaWaW¡Š@E B{·½ÛÞmâ‰oÄ"±ÈÂãêy×ã®Ü.·3I¹X*×ð áAÃp 9†Cp¶ílÛÙ63^;P;P;Kz—ô.é…æWͯš_Yvì§9 Ü•Ûä¶÷ž±·ßJ¤P–[ô=µÔxÄ# ÑcŒg8Ãþ?¼xñ?RGï üwÞÊ·ô1Õè3Z…VAˆ^&™y]¶ÈÕ²ZVƒæÐšpâÄ ²^ÖËz5²FÖ€ö™–ª¥¿ó‚Úm!ÿ½}ì-ˆvþ.Ù íÐv ÄV<Ék^G–‹f©µ'´xcùžÿÎÎÿe 8Æ1’@WÇd‰,aô½€8âÀ´¸1ßÈ7ð>ø¯üh_í{ìã|Áþ Ò^CrùƒJIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.1.png 644 233 144 3051 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÞIDATHÇÍ–ïOTWÇÏL¥Î$ˆmMcÁ¤Iƒ™¨¡jqSlVÀŽ!j÷ hcÚͲÑ\LZW|A«‰‹Y×4X 8Pl*Ñê lH*1Ý]™¤$K(†‰3ÌÈ„™¹çžÏ¾˜¹s§ë?àysóüú>Ï}žs¾çB‘ü °n²n²f%dëqSoûÀöAÞ„|E‚å åà¿›auÛê6€œk9×ôIS6ì†z¼&~z>C/²…©XÙ³²Ç²7)ÕÕ¶Ü„ü…ì}ö¾% >ö|ìèíèíàðËè/£½½`ʆÝð7â ¼t|ñùÿå23-3°òõ•¯ o–½YöÖŸ¾·à@ùr€Ù×f_SV @&™j/&Œ±üi²aOúñžoä3ò'ê°¦tM©üýÃà‡A{{"`²“Kî«î« Äû¸ÆW|E&h Ú€tK7QZU…ª2T†ÊPjò°Ê(£À?¹Ï}S½ W†+‰Ä§øà³ûìÀ¸ý¶ývx…QP!„¸2 ŸÊO%Ïðœçºã½âwßy÷Èi͹‘såp}ãú"ÑáȰ™¨ÉÝänrCY¨,T2õú9ýœ~ÔµAm€À…ÀùÀy(¹PÒ]ÒºýçþšþT§u‡þÞñ{Çï»2,´2!„wÃ÷¡ïCÐaíÿ©ÿ'U[’Uä)ò Dþ€Ö¬+XW÷?Þÿx?Œ5Œ5Œ5˜¡ÜYî,wòÒZZZ‚;w6šþC¾ ~$šœt­Ô:ý~£°q·`1Ë“åQ=œk™k1Ãí¡c¡c°ûôî¦ÝM°¶qmãÚFxúà郧 "»"»"ŽäÉ?’û*öUì3ãc¥±ÒX)è3úŒ>²HÉ"(\U˜Y˜ ·r{}½>Ó_†fógó²îgÝW=B]Zýõê¯õ …Çà_ÚÔ'SŸàùÛÃæ‡Íàoõ·ú[a—w—w—¶mÞ¶yÛfÈÌÌ„ÎÎN°-Û–mËÐ_Õ_Õ_•–°Y6ËfS.>]|ºø4ܪî+í+5iFÆžýüìg€œU9«ô «º%kdeBˆŒo3¾âÑïÍ=škŽþxôG!FwŒnÝ.ĬwÖ;ëâОC{í¢³½³½³]ˆ¼‚¼‚¼!Öׯ¯__/ÄÆSOm<%D[u[u[µá»á»á»"µbƒ±Ø€ò¿ÚÚ)õñ-OËB}@°L¾Hî±;]Ý]Ý©Ó]{ÎöYÏg=D Sh/´C{°=غè¢ËìÀ“wNÞ9 gcgcgc+ŠÅŠ 2Tª ÁüÖù­ó[Mÿ†’GƒÆÊGž<7÷˜¾|ýÙõgé{ ãTž¨=Q ÜNœ”¬“u€†Dš¼¥Gôˆm\ׯA÷èÝ\æ2—A¹”K¹Òv„¢F€-¬¥n Ý'Μ8“v*™Jòö)ûTxÿ˜.ž.Ù˜àÙˆ Ñ«;u'Ðû뎩^Õ«zA¿¨_Ô/OxÂQ•Qàç9ŸF#ˆŇˆ¨ ÁcÓÛ§·KvŸÝ—Æc/1?U¶*[⟠>²¼'ïè5zMŠË ¡±d'^ð‚I›Y`Ð ½V¯%ÎR/žÄ7ò½ÌüÉ»çaçá´»’ú7êß0þ3Þ´ÐB¦9ù‘üˆ((¯ò`Á¦lØS#KÆx¾‘ÏÈŸº+_Ù×Å+û{5_°ÿTP†qZž#IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-0.2.png 644 233 144 2602 14774263775 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü7IDATHÇÍ–kH”YÇ3™NIV´1x)¶M+L\é¦ÒEÊ.CÒ%¢6bY‚h ,6œ–"ÈRvSƒb'Y5)*l(Š`²¶ -ld—©RêP^*Ûß÷¼ç·æ}ç.~ï|™yžó<ÿÿÿ}Î9Ï9„BL482™Ž QÛñƒíO^–¼ì»Ö¨}BB‚'ÁóèH=žz`’o’ÏxbÛÖ¼Ÿ/„ÏgùÅDa;’Î%K(6í°.w]nò7Q»æ¸.º.þ§Ã¶ömíš.4ñ„î†î¼-~[ ¶mÍ[ñV¾…/|Â/$^N¼œÐIc“Æ Ó—L_2cG4àÅ XµbÕ €ng·S9@ö)¤¨bà°FœmÍ›ñV¾…gá[|T€)ESŠ„€5ÖlpýMxÒŒ¾;}wºÅ§]ä{ØCŠúGëÕzv9FŽ!ê¡zDÔˆPªhÐ_믉¨{Ú íPMU¤Äðbø&_Œ?ªG|¼¶G£•;Ë1AwØ!gÊ™`„ôãúq4sB)§6ÂÀ&6± {¸qãõ½ÊVÙ1¯RÕr®œ‹¦:õ½&?¼ÖXkX.Ž[J!„˜ý¸B®Ð‡1È`$î°T¹*'<’1²ld Lp¸Aåª\•'¨…ZlSÛ¨mÔ6B_Nß̾™ ÐÎkçÔµƒ07,ü  Jˆñ›zLa'þ‚íû·ï~0òèÖŸèOì/ÞÚÚµµ \m®6WT*•>CCCPv¶ìlÙYHÝ›º7u/,¨YppÁAx>£bÀ&ŸÅoê1…ýý3œyæ=È€ÚbæEü>½¿ræäÌÉ™o Þ¼)€¬ÃY‡³C»§ÝÓî±…ùª}Õ¾j˜•6+mVší/ÜU¸«pÔuÔ]©»sGdÅå·ô˜Ð1¡CƒP~(dÉÇhßàjpAñüâùÅóm‰¿Ä_â‡ÚǵkÛþž¬ž¬ž,èîî†ëÞëÞë^ÈÎÏÎÏ·›½7{nöØñÆ6ë_”ßÒã¹ʹŠ!/%^BhB!Ì-(œõÎFg£z©^ª—ŠØÐtM×t!Æ•Œ+WbûÓŸ§?O.DýäúÉõ“…¨J¬J¬JâôËÓ/O¿bQÚ¢ôEéB°V-T …pÔY|&¿¥çÓŠÅ$žýúÌûÌ Ó2¦eLo‘·È[³f7Ìn€û©÷Sï§BëÔÖ©­S¡©¿©¿©ÄR±T,…c™Ç2eB‹¿Åß⇧ž®ºÞÆW¿\±Ïö½Ñ5W?êãõñD¬´¶}mûÚöÁ¼äyÉó’áZ×µ®k]0Ø9Ø9Ø µµµàÛìÛìÛ +++PúªôUé+Èsç¹óÜpõÈUïU¯½ÇŒY£î±ONeÄ:%rŠœQI%Š?9Å©¸Ržä$'\r‰oà 3Ì—FÄþLèôØ1ꩌëcFP j€´úŒ±ÓØIØøÖ(3Ê@È<™FÀ ‘FÁ(4 BPåQͲY6ƒ|$È È+ò ¨2Cf6-çßà»à»QûX\ç§<¹<9Ö&-o[Œ-hŒX_Œ†H$0ÄC@Ä¬Ø ¯y ¼5ãÕÆj4Fd@âñ˓ʓ¬J}ÔùG¹+Ù±;#p8Ä!Rì%²‚¨[ê $€m[ó±%3ó-< Ô»ò«}]|µï±¯óû?öcEæŒÌŒzIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-18.1.png 644 233 144 2773 14774263776 15054 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܰIDATHÇÍ–ïk”WÇϤi3bÒh* Ñ’FlºŒÉ&ñÅ*ô›q‚¢B­±,ekÙ–¦ÐJ-jÔÙ€Ù, qZGmªÔ㻂,›]Ýè´5TCfœIÔÉóã~úbæÎ3ºÿ€÷ÍÃ9÷œïùÞ{žû½W@DD^Ì|ò–å-Ë+NÛy;¿û-÷[•OÛÇ,pµ¸ZþóW(é.é( ”웎­çu|n¾ˆƒŸ[OûåEqCC®u»6Wo®v¿”¶».ƒ'è ΙðÞ×ï} pºïtïÃÔS?ÄÖÅÖcëy¯ó5^.¾t¿EDŽAÛÇmƒú#€íºÿÉýO awÃÁ†ƒ¨ ÍÞ¼ð&¨|•¯ò¡ÉÝänrÃ’Ê%•K*Á_å¯òWÁ£¦GMš"v›Ýf·AìPìóØçÐx¨q°quþ/gZÏ´f£¼öŸv^ÚyIïܱ1Q""×÷À`d0sÿP;êw×.¬]HJï뵕×V^[ £¾Qߨ*T¨8ãÛÆ·oƒÊžÊžÊiiiqˆ%TB%Ô·×·×·;?ÎEß7ñoâ¤2Þa™§¦OMkb×÷ÉâPqH ñ¿©Â©BPïgÎÑRcÒ˜„šŸk~ªù Îvží<Û VÐ ZA¨*­*­*…’Ž’Ž’XµkÕ®U» z"z"zÂ!fõZ½V/XuVUµ j‹j‹à«—NGNGrâwWÜ]Pë.“ÿš•f¥ˆˆ²C®¢{ÊÕo¾þœîyf%©öªöåíËáj×Õ®«]Îʇ‡‡ Î[ç­óB_´/Ú…™ÀL`&þr¹¿¦âSñ©¸“··q¯w¯~\ž Ï8ÿ˜ý¸ÿ^ÿ½ÜŒì©ü¨í#甀™4“€•ÎÌ"wÒI'0Á9òð€<†b(WÁP™ì”¦‘ÆËàgëéú™S™Õ1åùÍó[2û–qËptÌÞn|g|ÇCeñ*¯¦Q°Áê·ú­~°öYû¬}`¯¶WÛ« l`Øev™]|Á§|š#ÛŒ‹ÆEª¸Ö±Û5·k€9OÄÉÕ±ÿSþM› r•Ù±FÃ~×~ÃY1óÌ)󸉲±L3 Ø:ÞÞaïÀ`κd]‚4’†MîMn½SO(ÿSw¥¾»ô]™&>ã3ŠœXïXïuY¥•Ý… [Ïg[–É×x_×Óõ³wå3ûºxfßcÏæ öwú½M}b•ìIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-36.7.png 644 233 144 3233 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜPIDATHÇÍ–íO”WÆï(åEIÀ*YíFŒ5´Ú–•"ij_jÑØyÑèn?ˆntW*KÚÒFË’;ÁFJ" “é•i¢XÓÅe"ãk…AG2;¼Í<Ïù퇙‡™l÷ð|yrÝ/×}Ÿûä¹Î‘øÀW liØÒ°8?Û´G½õöŠ‹~ܨi‡iÇÝðbý‹õ _%|¥ÛƒØðñ¡ù"AþÐz†]â%hˆl‰l1åðGP˜Q˜µØ?»æ6s›ÇÚ´´žk=Ç!pÚœ6€ñÜñ\bÃoÄù_(¿|ô?õE ¢+¢Ëô"F.´ü´üåòÜ_ï¼ ð(üQ¸ ÍÄ«r7nŒõ4þ@¼‘oðüF=£¾¿Em¡aÛĶ óY‚ÝJ]Å—_‚ºàmÃB#Ä‚&š´0-ŒYõƒþ±þ1ð‰úT}  ~R?h´ÌbõY}VPvŽr”XõÔϧžT$U$ûõØÞ·½Ï|'.N žiàûù&RßËz/ ÔÞ>àg~•­Íh3xÕ?Õ9u¥;ô_ô_æ'…*REªˆ#ޏ i¦™Fg8ƒH&Ùpzû °»°Û˜àç›BŽRD$½Žó׿¯Ý àþÒûKÁ[ Àf×£–Q S¾C¾F_c°žwØ;ì×a×a×aðfx3¼üfͽ3÷ÖÜ[àjw͸fàéßç?ÎgjüÞì²Ùelž©º5t À¬™5÷õ‰¿Q&‘ÆëpP;¨ÁD%cŒéYXÿúê×WCÂÚ„‚„ÔÎk;¯î¼ ê˜:¦ŽAqYqYqÄ´Æ´Æ´BÎñœã9ÇÁµÛµÛµ;ØXWaWaW!Äï‰ß¿ÒÿšÞÞ€Šh15™š þwÖ:kžG=Þd?aú&‘ì‘‚©‚)‘ŽšÎáÎaÓß ¯ÆW#sŽ[ދދb²OÛ5»&Ré©ôTzDnNÞœ¼9)b«¶UÛªEÒÒÒDÉŽdG²Ì¯ 66ˆ ï>4|HÄâ°\±\SjEêòÔå2·ý•§vž2­yõµW_ è‡_ãÚãÚU ;FjFj‚;uŸ,›,ƒ ݾÛð¬p¯p¯pÃéÄÓ‰§!º>º>º–y–y–y`KÕ–ª-UàNq§¸S€"Š(m•¶J[ä-úwÑÝ¢»pú§ÖœZ´kÞG™2âzãzUKçM¦ VKÛ y/ä‰ÜÕ†”gS))"ÿêèYòdÉ“%ODZ3[3[3ErVæ¬ÌY)ò0æaÌѱޱޱ^‘¦ËM—›.‹Èy9/çEÂíáöp»ÈwÜy bû‡­ÁÖ RœRüfñ›óƒ}žÙÙ/"3áùáù¬Sßh%Z‰iP$âÛˆoEn¿s{äöˆ,Ú;±·o¿Hßî¾Â¾Bg­³ÖY+’›—›—›'2b±ŽXE,6‹ÍbU£jT‰$U%U%U‰X*-•–Êà‘^ª½T{©V$ë÷Y/g½,ÿ—„/¾Ñ›DDd‘ kkµµ"bÖ¯êWMƒÂg""?VÐÝ|©ùÒüÏ_ú·¨ª–ªf×yÖ¹Ö¹ ©¸©¸©88ú Ñ¢/DCvwvwv7X§­ÓÖi///‡­ƒ[·‚§ÔSê)…“'3Nf@gWgKgË<ͬþ¿¾ægÍÏ Ùø±" ס¼´¼¸ g¡´µƒ2…BCÕ¥ºTÐL3Í!º`ÇŽ¨¤’Ê»/ÞÜ' §oÈ7dõ,Tù‰òFc×…{Ã|Ï|Ͻ€3ŽõŽõ ýÙ¯cZõ\û\;Szª¾MßÜ ‡ÐÓô4= ´­D+½@/Ð €}ìcè õ…úBà7¸z¿>£Ï€*òõøz˜ t´ÏÐäÐ$€Ùivººú[ågWÔ®(@”yFû^û@/ÑKæ÷®€9怦™™ˆBG~Å…+Äúý}ý}¼Ìj=ZO¨òïŠÜù•?pW²}Ïö=!w%G^:òÒ °Úg„Œ¨ëæ7æ7èI@±›ì«Ýj·Úç3†:¤©C Vª|•JS/©—P@èÊoÕX5ÀŠ?Tø+ü@ÔÖ—ÔbËÿøÆ|cQ/ Ì Ì_PêKõ%±{ã±ôX:èa½[ïvÑ'õI}&öNìØ ñ‘øH|ÄÁãûãûãûa<0€±:®Å5bI¸œðÀø¢¾hÔkÇ“ ìh£5Õ5Õ6U 6ézLœúxêcÔÆ?lÌߘŽpÕtÕtÕ4d–e–e–Á–à–à– íÚ5´ ´AmP„%±%SK¦@[¡=­=úõÕhe´Òѣ赎×:ìÚ;ÚãNä­¸]JžüôÉO“i×Ú_Ï;<û²ÄËÇËÃåaqõý·ïû¾ïEüþ …ȵ‹×.^»(Òu¼ëx×q‘°ÖšHQZQZQšÈ±¶cmÇÚD†›†›†›D.=té±K‰ôïî/ë/WÏ¿zÞîy[â¶žR›ÞÜô¦­_Ü.}%ûŠjc&²"²¸ž¬•¿Xë¬u`>d>h>…ÁÂ`aº º º  s{çöÎí຃î ä-Ë[–· ´Ú íÜäk3šŒ¦=USWSçÜÊÔ>ñE¢^Ô€> –ÝǬZ«–˜µÃ:`uG©1GÇòZ^Ë fµYmVƒUb•X%@=õÔƒyÅüÌü ÌyÒ< Ö£z^GŒV›páàB@÷ýèûñ7}Ìn´–@EFE†ÓùÁ ›aàžõ¼õœ2+á}Þ'Ë9b³Ê¬bÔUu.plŸ/‰¤ÿü¬Lòÿo_÷í{ìþ|ÁþÄàÔ(ø¼IEND®B`‚routino-3.4.3/web/www/routino/icons/ball-4.png 644 233 144 231 14774263775 14366 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷ÜNIDAT(Ïcüÿÿÿÿÿÿ0@O››ˆ¦LIÉ®]oÞ02¢‹3 ¥‘€ÌDªF\€±»ÛÕUX˜t— ª¹ˆzáŠbõ›ZéB6-ÛʘùIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-122.png 644 233 144 2761 14774263775 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܦIDATHÇÍ–Qh”WÇïDÛÉà8m B¶µ*˜©Ä1ŒcF‚­›&8•Ô†*êÔÒºH›ÄޏB Û®“Uú‡EÒTmch¤1dw3†IXŠ¡ÐZ»±ìÆÄĉ32óͽ÷ׇ™›oܲ/ûä}ù8÷œóÿÿ¿ïžs¾+@!ÄÓù§€¢çŠž+òäì¢ýö~qCqÃê¿åì. ŽfGó÷axêÓ§>(9[rVݰmã7ñ…ùBØø…|f_<-ì ççG oŸ€/î|±xEÎþóUpõºz²ê õ|yîËs¼ S£S£‰@"¶mü&Þä¼B|qâ¿ø…€'.?qÙ1 Î'O åõåõÏÿ!ðÓóÐøJã+·—Ü^¢‹@ÞܸuH’ĬÙÛøóñ&ßà|Ãgøsz”Ö•Ö M-M-®3¹„ÝdÛŸmÖðY½Ôòïàæ\öëì×òˆ®Úz<‡ÁÁÀœá…ÅöÂipM»¦“KaâÁÄà_¼ úý ©…û©å©å`ýÕ겺l!V¥UiUÂݵw×Þ] –ßò[þ™Uf•øÿ˜îNw“Ê»_æŸN|àJº’É¥FO^X×w„„ œªÒ~«Êª‚D$ñyâs´ï”ïcßÇp¥çJÏ•›xÛð¶ámÃà {ž0ÔÕÕÁ¤sÒ9鄦XS¬)žÍžO lúdStS=÷Óôøôxß·‚oMíuä…·±6º2ºrñ@ö.ÌýÒùK'階šƒ5íÞß2¾e| \ºxé⥋°:¹:¹Ú.~¶‡¶‡¶‡`½½½6®Ú¸jã*Ûï{ß÷¶ïmøËßO¾yòMÒ†O¾ÛÝÚÝj„· ð {†õLULU7ò¡Õµäïd™,ƒê@u :ýÍýÍý;“¾“¾·b·b·b0Ø?Ø?Ø•‡*U‚ó»Ïï>¿æÕ¼šW0H $`͆5Þ5^ˆýgø‹á/lÁêýÛÑÛQ0z”,/Y®~€ÙŸg.äÚ^k5£f ÞtooôF{£½Q{¿-Õ–jK×çõy}ÅCñí?Üz¸õp+xzzÂhéhéhiA³4åÇÌÂìÄì=EB¨¯ÔWŽÙÆl£ÂBQêX%2"#×ÃðÃððî!÷{Hˆøþøþø~!"Ë"Ë"Ë„hÙÓ²§eóóóBD"‘H$"D§»ÓÝéb×ì®Ù]³BLž<3yFˆ¿þcùåB8.åøèÊLe¦„°õ˜#z?zˆçΜßgç³ó¦ m¨m¨m®o½¾õúV#bD@}m}m}-4ìkØ×°j=µžZtTtTtTÀŽ™3;f !Ðh@UY•§Êº\y¹Ò®1ÕøÙæÏ6?Rcù®äÀ±Çì.l2kµÒ¶ÌÿkæëGñU•ÍÿHW¾p\S®©äRô„5aÊÌ1Õ®ÚI©ê„:¬¡œrÐÑÇåqyä5yM^“1Õ£zTȘ”ƒ ¯É´Lƒü$3™&¥ÿaðozoz¤ë¦ëæo昴'_‚`q°xq<ÆAÆex ^S¯a!óol‘"ÜcŽ9 A‚à÷€…E;ŸP¯ªW±¸'ä1øAgÐi¾Ô#“ÿü+i_Ù¾8׬^à#>Âm|C¾AôU}°mã_<²|¾Á3ø†ï7ÿÊÇövñØÞÇÏì¯Z:@GÓ÷sIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-141.png 644 233 144 2672 14774263775 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜoIDATHÇÍ–ohœUÆŸ™$N"IŒu)Itɶ$ B܆RFc;’šh;•¡P»ýC·¶‚!H©¡®°M-®eû)©ÝÝ)Øš¤%4i+U6¢ÛÀj‡X®¦šÍ&“I&ó¾ïý퇙wÞq»ýÞûeÞsÏ=ÏópΜs¯@’T‘ýøkýµþòŒíÿ­·_ÜRÜòëþŒ}ÚßK¾—þqúè¡î{¸Ï¹åÙ®ß=Ÿ/yøù|î¾*ämÎÎûš³ö»ðò/?Q\™±_‡’ %–-ØýÙîÏ>ýøÓùľˆ}0ß<ß žíúÝón¼‹—¯wÿ‡_‚¢¡¢!ß?!ð@à  ?®{=sàv´·µ·ÌÌ?س@)¥¦HÀ]ÿγ]ö¼ïâ¹ø.ŸËŸÑ#>|V‚·¿¸½¤7pë/X]Õ]Õ._úO³Ÿý”òWkÔ°wÚ;I‰š(ðsÜŠœ//ì7ì7Hµ`-OóïQÊŸ³xtÕtÕV–/ÇŸÑã•Ò‘¤žMQD9A7L·õ–õ˜ïí¨%uX¢D‰‚Ùgö™}ܵL·Ùn¶cÌ÷Æg|¤Á´šV`)ƒ‘G"¸ìÙ”WJIjøJ~*ù)QSKSKÀßhó•ùŠär¼êðªÃ« œ'ÂÞ޹йй íí í‚áÃï¿É1=˜áƒ½oï}ÛÍÜéϳ¾y“ÇÏÕœ«Éàµå¹Å? µ¡{à ¼Þ½´çÒžK{<âË—.xþöí;Úw'9ÉIX¿zýêõ«=ÿhÇèó£ÏçÂSöß3|p.~.î ûæMAùÕò«æïø÷ìʆssÄL¥§Ò€ãÎ1§Ëé"鼿œpN€Y0?›ŸÿÏ 1#fœn§Ûé¾ÛïìtãíìòæXrjqjñžsÌ´=› R)váÒ7À¾aß–mÎ6ÒÙÙo ÷Y+¬°,åîJ +/C¹xûª}5?ˆÜLýbòßã®tï² ÀÈÞu¹دگ’sÝ\À‡<ÛõçJ–wñ\ü{Þ•÷íëâ¾}ÝŸ/ØÿÙøÍGŒŸÂ9IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-33.0.png 644 233 144 3156 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü#IDATHÇÍ–ýOTWÇÏŒPg,o%® Ñ–`¯ZY [d±CAé® C[!k™U6º1˜6M×,DI–PC„*R e­¤,Œcª¦Šq+µÛd“-5J‡¦j§åuʤ”™¹÷žÏþ0s™Ùõðüró¼}¿Ï½ç>ßs!„H‰<˜3Ì椰mþcÔo)³”­{?lwj`ÚeÚõÕ_ ¹#¹à‘žGzô[QÛˆù±õBDñcù ¿HQÇò¾å}¦âˆÝ/n|q£åWa»õX]V×Ï*ìsïs ôôò'ðŽxGæŠçŠ!jq#ߨ7ðbñEÓÿñ ñã/šîÀò‡–?$dnÏܾö@8a|-”ï,ß ðݲï–I3hS@ ²ðãÇXÓ1¶äõžoðüá~¬´­´ Á©ç|Ïù¬Ýá‚[ïq¢¡«¡ ä§!oÓI'   MST$ ¿Ð[õV G¾+ߣrXÔ*µJ Î©sÀºè"Aþ+‚w±a°aÐhðÖ{üÃg³výˆÿÝÛ7KYS±¹b3Èß„®ßð Èßë+ô„d…Ì—ùHùgùš|méK!WÉUrð4EEýÔQB R÷jŸiŸîqô@ÿ`űŠcFƒo–Æl¥Bäœ`ÈzÎzÎãã: À¦žù¡÷‡^Ôíê!õP”/dÙCv˜*™*™*µYmV›cj£¶¨L>|f|}òu¤ÆÏaÏaÀkýÜú¹?Ž@¸!MBÑùO¨×ê5ða–Y}óÓ…J¡)¯¦´§´#w—í¶í¶ÁäÉ“À6h´ BŠ'Å“âŠöŠöŠv–Kƒ¥Ü·^Ç„c¬N«ËêBÖ|Z_oDõÍ\­Ë¬Ë Ãýu»Bü»>šÿhz;¼ð¥¬Ýš”ïÎw˜Þ?]3]f7Ìn˜‡×áuxa‡{‡{‡fªgªgªaÍê5«×¬†«ýWû¯öGrÇ»ãÝñ ¬WÖ+ëaò·“'7ÂãMk×­]GàÃÜë\GÖÂ¥3—΀îGðS’;É-ûØõ}ó÷1[áïžwÌ;`Û¾mŽmHÍNÍN͆eF™Q`ñÊâ•Å+P”X”X”©¾T_ª¼Ç½Ç½Ç£8¹¹¹P\U\U\õ?ÓUüRñKÐÖ~ò“ï„^½ª¶bhÅì3ów“ÏäC®Ä’Ä!¾Ò¾®ÿº^ÌŒ.Œ¦¦ q¾íü‰ó'„ÈÊËÊËÊ¢µ¦µ¦µFˆ;úýŽ.„kØ5ì"mÚþ´ýB\®º\u¹J,-ó¼yÞƒ?¨GÀæ°9Døx‹w‹×â 6 6òIICIèü­”RC VÐLš 8ð¼øôëªRU-z«Þ  ¯ø´B­¦ÓÀiê¨Ã:÷§’ã%Ç ƒÔl¹·åžÅ¶,[Vø†®Ï“¼uãÖ ?àïîsô6U¥ªð«ŸÕ%u ]ߢê…ó+…¡Gè@¹ä†ó”P@ºúZ;¦ÃL1ú+!üå[í[í†ÀŠç¼J‘”Jº,ŸZ>‰„¡UC«Àÿ yÏÜþèöG<ðoô¿é3Ì7wrîäÜI˜ìžìžìåVnå^ è2—¹O^ ¼ïܾ~û:ü¿âÃК¡5@·ÁÔ#z†ˆHÍ%x«ü­rø÷,€Z“ÿלS9§`ÑEGEw :®;®ÃpÓpÓpä/Ë_–¿ ,e–2K,0 HKÌx̸HÛCCbûãÃ#±GbEŠª‹*‹*E&¬Ö «ˆ«×Õëê9—y.ó\¦ˆÃçð9|"Kã—Æ/I·¥ÛÒm" ªA5(‘äóÉç“Ï‹L6O6O6‹¸þét ŠŒ¹oµßjY™“8–8&6‘ÙÎÙNS»^¬›DÛoì±¶]m» }àÊgW>Ówg¿úœï9¾Üäöçöƒ=Áž`O€O§Çµµµ`¯µ×Úk¡;«;«; fl3¶8kœ5Îðnðnðn€&k“µÉ ë×][w þU÷EÝÆÖwsêóêϫ栞]Ô\‚âœâc˪5 uh€bŠ)ôùÝÜK/½À#Œ,°‡zê©RH!eA~9ËY|LUaÛcP³i6 Ôà+~¿ø}`.ôUÒò1,n‹{&Rÿ›;ÝÚá Ïhs÷æîñ@«Òúµ~ÐëôãúqPKÔµ´Ú m¨rU®ÊN:éMiJS@-•T‚JQ;ÔÐö̹æ\Öå^å^`ùÑòãL$?‡|ìœn›i› ð„œÙ«ui]À”r*'~ü¡'&tïã!¬Ž†Üc’ÉP%è ^S¯áç¡vN;gû{a[ô¶èÿëü¡%…… þ•H80Ð |ȇX!0˜Ðvh;ð~Q¿€ „ccÞ¨7ú <ßà3øƒzåÓÅ#{{4O°ÿe¼Ã¨¿wŸJIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-8.7.png 644 233 144 2566 14774263776 15001 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü+IDATHÇÍ–mH”YÇÏØNiXŽl¯["Û& }Û((¢2µ°¢×­¨m!X!6ꃴ´Blf ¸„QV³*³ø%6´Ú,±Ò­È¬4†&Ç—&ÔyžçþöÃ<×yzûÞý2œsÏùÿÿsÏ=ç¹""â±’2’2’¦Çí¤ïþäõÉë½õqûœ ®-®-ÿ…´Ê´J€ôÚôZëqÂÖû:Þ™/’Àwòi¿x$á˜Ò0¥ÁµÆ¶Ë`{Îöœä™qû×VHñ§ø£ìiÜÓpµîj?@ðVð@dMd $l½¯ãu¾ÆsâKÙ{ü"ฮg0eò”É"¹.sÝ‚ãÿ.€¼My›ú'õORI`¾RIUk€FÐ+ì°õ¾¯ó5žÆ×|š?®G`Æê«E  ¨ (¥&žðøçWç>Ý}šdfffffBƒ±0 t‡¿Ãßaõ™_f~™ù%óËÌÌüË æÅ¼˜Wî&Á_ðüç&Ù«íÕöj¶%(A É€:èt¡ ]’„$¶W«ˆUÄ’ þÿ€ÐVBLÄDLÿ8”5)kR֤Ǝœ„œ„œ2 „!BY6Æ!^tsiè8à,Àz\̳Ålñ¢ã‰ã‰ã‰oxvmvmvíñ^Ç€cÀ1Ððëë뜹Û< = = qvnÌܘ¹1$#B!‹áÞáÞáÞ€4—îKë¥ý’Þ¸¾;Ÿ”_â‘øxw_bžÌ“yŠëÈF²‘l )äB¸.äÛÃOÊž”=)›ìíÓàÓàÓàÚÓÓÓE3 3 3 ä5E†"C‘+>ÀøjXa…ÀlÀ@¬ö@{ =¯š M†&æ<§;§;§·þòÊ/¯üòÊÛûÕ!êuÈB¥k£k£kct!Kd‰,ñÎ:úÙ9ºstç(€&4¡)p_ÍWóÕMÿvØ6‡mòríbíbíbaA\Z\Z\\cÑX4h„ A«Åj±<@Ö‘udL08!#dDˆÁ›'˜'˜' çtÑé¢ÓEºžï{¾ïùž¿,WÉUrÕÏuB¬+ľ¼/ãe¼Ü÷+UµªZU­€ÌOæ'óûçkµÎZ7y¹6N§^KLHLHLà/kx ¯áñ'Ñ$šDÀ°ìxšCsh@_ /ÐÒI:I'@ž#Ï‘çœÂ)œ$@VÁ*X01mbÚÄ4üIÒׯjcµ±ÂkR~‰Gâ£Âˆ0"Œ, wœqœqœIxÁ'Î'Î'Ž…Æ•Ç•Ç•ó’G,LÏôLOÚNÛi;@¬ÄJ¬€³ÇÙãì\ÄE\Oã ®à À‚Y0 ìSìSìSW˜+Ìä¹OI?®"®"®‚?îó†Ï>o°P‰Gâ£LÇtL·kµSïÔ;õ@ÔÕ¨«QW£)Õ”jJ![ÅV±ždˆ ‘!‹±‹_¿ùõ›_¿ 2 2 2¶ô¶ô¶ô§œfƒÙ`6‡??üùáÏ=;÷ìܳØÛ··ooЖЖЖ0¾ÜSS¦)Ó”Au!êBÔÄH<B…P!t^²×#¯G^°w–~–~–ž»äô=AOl3ÛÌ6?©K©K©Kîݺ;$ >½ß hP4(“Ñd4äøäøäx`~êüÔù©@Õʪ•U+ËvËvËöñmò™33ffb‰Gâ£öaû°}G‚ó‚ó‚ó¡Ú®Ú®Ú+Ûʶ²­àY?ëgýI $ø1ûÇ쳮ήήNÀ‡óá|8@ÌóÅü§ #U#U#U€f†f†f(”Êííí€~F?£ŸV³Õl5oãÕ«Ô«Ô«`•x$>Š=؃=D'UÎ VÎÊY9@Ž‘cä0è5è5è4Úív`UͪšU5€ü²ü²ü2ÀÂY8  ½;zwôn §¿§¿§ÈõÏõÏõ®8¸âà @×¥ëÒu~E~E~E€Ø+öнOóÓxOãÄA$:Êùsþœ?;i‰´DZ"q[ˆ"…Hp´ÒB0ig•¹Ê\etïêÞÕ½ èVëVëVö\{®=f ³…Ùÿõ,•])»R1i1i1iÀ‹Ï¿øü‹Ï?Gþùs$0˜0˜0˜Ð`LƒÇóqO®>¹úä*nS-ÕR-;É+ó”yÊ<¡àö¤Û“nOâ\÷½î{Ý—d„¯ _¾¶Ç›oz¼ ê묰º7toèÐUÕUÕUP5QpÎpÎpÎX®Y®Y®íGÚ´–ïY¾gù bzÄôˆéÀ¬k³®Íº´¶´¶´¶·¾»õÝ­ï€I˜„I€­{u÷êîÕPwvvbŸò¶ò¶ò¶PÀ#qˆË*á—ðKø%ÿÜÞøzã믻´S.M¹4å×£™§™§™K’-É–dƒ§È‹¼ÈŽGƒ£(}Tú¨ô°°caÇÂàÕ°WÃ^ }xôáQàbÌŘ‹1€×××ÐÓJ²$–Ä’€ }Aû‚öÁúë÷¾~ïë÷Ä$™$“dz™è‰žè›©ßy¿ó~ç?Þ!’GÉ£Êú†ß~gø®çtÛé¶Óm®-Ø„MØÏÀšÀšÀ؃æÍ šLnžÜ<¹˜Ð>¡}B;àK}©/¸¸¸€UÆUÆUFÀ;Ä;Ä;(Ý_º¿t?Ð’Ö’Ö’¬Ì[™·2,X¬ Ö@QQQ!Zû…~¡_ —åŸÊ?•Ú¾ÖÙëìuönu’wwÞÝy@ ZÐòÜÙ lP6xQ5rfäÌșɉÑ~Ñ~Ñ~lɲ/–}±ì r^†…a0~=¿ž_2š2š2šp\×È–Ê–Ê–¸¸ ñˆ»»»z’ž¤'þƒ¿ëO³~šõÓ,¬)»[v·ì.¾VUF•qôÆ1Žqs×`¦aZçfJKh -áZi>ͧù÷ÿ.E£hÜèP7«›ÕÍ@“o“o“/û³a›a›a*xoÞ›÷†=`Ø@¹B¹B¹¥ÉÒdiæ`æØ†mذ{ì»ÈÛåíòöq@‹¥ÆRc©úlÉÙ’³%‚VvGvGvkÿvˆd>™OæwnF PÀºÛ6_ÄÁå³ý2EGÜÕ¸«®üˆ] ›27eÆeÙ?Þƒ„ë ×ÿ6`GóŽf€kMךø‚]Á.€‘ü‘|pl;n¯·óm¼X|©þ¿LhÐêꇸ‰qEÀ³Â³bÎ.kAßX³rÍJ€qãL7¨A ‰$3xÃìg(ƶã‘õv¾gãÛ|6¿¥G`jÞÔ<XW¼®8ᬕ່Y9£r†Í¾Î•T’dªðHxÌ?|#Ÿ13¨¯è+€ßì5{³Â¬ó¾1˘Å5Æ~c?'9IFÊ´Ê4[ ï¢Ãoé‘ÿíOßÂÆøñQA@u©.àƒ.Ñ%„-`L Þóç©¢Š*Ð-ú†¾á¸Ímæó&ÉjÚCÔõ¬Üð‡Ïæ—XAé?CB0!øf<ø•_PºI7ñÎ4˜Ë\-- -…W­¯Z_µÂàÖÁ­ƒ[AmPÔ0†acóóó œžžS@»NÕ©¼‹X…Q¾(¿¥'"ìd'”(?`gë¦ ¿¿v õŽvŽv‚ç™ç™çdx2<È,Í,Í,Ðô¡ühùÑò£X’X’X9U9U9U0Ü8|jø”ƒgþ~~àð9ü–·õÝ–´ˆäVäVD>£¸Iµkküc;BSC©¡Tw›»ÍÝ&R\]\]\-r'áN‘—C/‡^‰Ü:tëЭC"ÞíÞíÞí"é)é)é)"=Ó{f÷Ì–(ýR+µ6¾kÑÇüKZÜ"Éw“ï.ÌÉ[ž·<šw–ÓÒ!g{úúúDÆ¿ÿvü[‘Ûõ·ëo׋¬^¼zñêÅ"Þo·@dôØè±Ñc"«ü«ü«ü"ÁçÁçÁç"ó»æwÍïŠ ÷ºq•ã*m|×Y‡?¢R&¥LÒÝ0 8ÇÞ¼¡ëu½³5ü›ý›ý›¡Ó×éëô9þõ§×Ÿ^2z2z2z p p pÀ‰gçfçfçB­·Ö[ëuü*ߘgÌ‹m36¿¥Ç-¢oê›®nc­±6ZÐT3ÇL5S »u?ê~$R:­tZé4‘†ö†ö†v‘þ¢þ¢þ"‘mýÛú·õ‹¼èxÑñ¢CäLß™¾3}"Þ@o WÄ“æIó¤9xrIÊA‡Ïáè±6Û¯pyôòhto–Ѥ–©eŒ —^§Òš–š–šÈ e…²Bp¡îBÝ…:'~¾í|Ûù6Èzœõ8ë14&6&6&ÆœÊsç8pO•©2Æ¢|Q~KÏ'O%o §£›üÆCŽ!  æ^s¯¹h¦™æ˜¸>àû؃§Œ×ÆëX¾Oå§ûX8ÚÇvëݼãOxªAP'@U¨ U:[gëlà)Oy zºž®§ƒÚ©vª ¿Ñ õBà«Ð»ô.ÞEõçúØÿvþûê>€.Óe„1#ˆÎD3â‹–†˜¸µÆÎâ}¶óbVFgX³Ã&ÉùÅj‹Ú˜÷Ì{¸pcÛñè–ˆäÛxŸ•_ìí⋽}™7س.äW'ÞŽeIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-92.png 644 233 144 2527 14774263775 14713 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–_HTYÇϘ¥Cêæ2 †¨ Ò¬9‹`)¬ôǰ¿„1½T[A¶/±éF$¢B„”½¬ÎV; hD†[–«ô¸ë”»[A©¨c5“Ž3÷ž{>û0sçN±nûØ}¹üþ}¿ßó;œß9„B,‹ÿ¤¬LY™’³S¾µüéÓ7ü³Û$ØvØv Ÿµ~Ö ÝžÝnŒX¶7ó“ë…°ð“ùL¿X&,Gš7Ík+Ûg`Ïê=«Ó¿ˆÙÍ`ï²wÍêp¨ûP7@ç•Î+ÔÀ¸oÜðºüu9X¶7óÍz/_œù€_X|sñMÛsH[’¶DÈ­È­Èÿ.–ðg>TUVU¼\ôr‘J9d¡Ê!Ìo:É6ãñ|³ÞÄ3ñM>“?¦G€£ÌQ&l¯Þ^mÿ1V0Ò'rNä:€Ö´ÑF­zƒÞê7½P/$ÂÏê¨: @yÀµKíõ@ÏÓóˆðƒ~\?‰ú^?ÁgòÇôˆ÷÷¶åؾ;hC Ã2 dËZY‹¦>WëÔ:”Ù"õµr)¨cê˜:jŸr+w¢ƒ¨zu]]G©ße‰,AC˜5ñã| ~‘,èË `·‡Rá©|*¸[øÅXa¬`ÎtDÿŽŽDG`ºoºoºŒ6£Íh³„h¥Z©V S…S…S… ÑNi§¬8ýFŽ‘“ÀÛbñ™ü1=qam¿Â‘ÓGN›ÕF‘Ò´mÆZxðQðAðl›Ä&ö~{¿½Ü=îw„ÒCé¡tØ:µujëdÍfÍfÍÂúæõÍë›!0 [xjHëÕz->‹?¦'%Ö·’!6Ôn¨·QØŠÕF5§æDÔtx‚žˆ'"DÐtÝB„ËÃåár!&ÖL¬™X#Dµ^­WëBêu:!‚KƒKƒK…rBNÑ1Öèˆ:­ U¡‰o+~Ÿ¿¤G@Ö½¬{Ê ã®q—ÕqÒoë·-»{÷þîý·-o[Þ6ð\ó\ó\G¾#ß‘ukëÖÖ­…pf83œ ·Þzxë!¬r­r­rÁý±ûc÷Ç,<ãˆtJgÒ'øczdgfgÀô«éWIǾJ•ªR«lþäüÉù“Pß^ß^ß{/÷"d;²Ùð\ò\ò\‚ƾƾÆ>p;‡Ãàsø>GÒaØ©vªÀ¬z¦ž%“?¦gÁ޲JVYö oÐ7èW«ÆU—;/w^îרkÔ5 çËΗ/ƒTgª3Õ -¹-¹-¹à¹á¹á¹þjµ¿:Ià9£Ò¨üÏŽ !Ä£Z¸úöêÛDÙäAy‹TTE­òfo³·Ù E¾"_‘***áÎС;CP¡UhlŽnŽnŽBÑò¢åEË¡·©·©·)iá_EGIð%øcz<•úýµ@†¸Ë]à/x‘´ÐvÚiŠ)¦8É?Ï<óÉ!bÊè!=”Ä÷Á©\xŽIs·ÃÌñWüP<—Oä²@€á5¼†”_ù•dƒl ýÒ/ý ›äYyT¿šT“F«ÑÊïþ×û—ÉÄ'ÿ 0Ðâ3_á]<öE‰f^3É$0ÏûŒ}h ‡äP2þ‚“ÿ#we   8Ç92¬-né&j@ `ÖmÆ[¯7ñ>zW~²¯‹Oö=öi¾`ÿ‰hpD‹CÁIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-60-red.png 644 233 144 4275 14774263775 15623 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜrIDATXí—kL”WÇŸ÷2"HeÅ ¨ÃZÃz‚5«®¸Ê ‘’HÑl!f­ëFE;6m­Ö Т.-«QÚ†Œ3XP)Še½@Ónܶ®ÐÄ 3‘1±Йfx/ÿý0sÞ¹d«Ùì>_˜çœçò{ÏùŸs‘ß~CaÆ/‹²DY¢,Ü“À@츖q-ãZò‹²(‹ò?Ó|šOóÿ´ZC"‰$2÷ÕÏòY=V?¼¿,œ'”¯œÊ©œ7‡Ï'Î[ıÅüˆÛÁíàvh qñ®xW¼ í…· oÞŠú‹ú‹úµYk³Öf}6ÏâY>«Çê³~Oç!þáþÌz~ˆâ‡lóÙ M/›^6½L~ëX÷±îcÝjŒ{Ð=è @€†1Œa6Ø`4?0ÏâY>«Çê‡÷›Yÿt>Ò?ÇÛy;o·g²®f]ͺ*ý¡o¬ÏÛçE¦¦«“ÕÉä½R£ÔÈ äò @Η ä@^ gËÙ€¼WN—Ó5]V£!±|VÕ×€ÃúëŸÓÐ83gæÌDb•X%V5}Ïrkr+r+¤| ìm¥[é†[jòžñžTná~À ”)e–$$ð)uJ ÚüƒR“|\>¨o+•‰p³àÜšÜ=¹{¤|ÖŸñ0>ÒÝ×Ý×Ý_ý{ ¯ÔWê+Õë€uÀ:g Ž[þHÚ)íüŒŸ¸‡Î€‘Å#‹bªKu1c=c=ÜNÓcící€ü‘ò¹ò¹–ä¶XaœúJýúÔÆ£ñ‰ÛÄmâ¶kUl¢¡´áõ†×ÕÍÉ,Ý–n€bWì¼[^Þò2à?V vŠðÉ“Ož„zG½ðjæ«™!ñÞ„±„1¸Pt¡Ì¡9ð4”6”6”ª›µ• ã#ÕŸŸŸ†šGyòå¦b*$$³o®•kåPÀ ±b îpÝáÐñ>WŸ j©–`B÷„nèêêꀲ„²'NìLq¦h Ò£¼Á˜Á€ñ0>úášÚ5µkjƒ_&÷IÏKÏp°¡¥­K[`³a³¼‚W€ï=xÚêÛê` s –Í[66Vm¬ ]´þûý÷C>Ìqzôô( ÷…ÆÀÃx8RstAgÐÎXmÄ"šâv Ý1Ü1µV´V%¬KXGD¤ÿPÿ!Ñ¥¼KyDD1I1IDD×=×=DD /\L!6A?AODD[h üqðG"ú"ìú‰Ò5ëšuÍÚ‘ŸÅi{·½ÛÞM}^~dpdá/þ úoäD4äYåYED”àLpý´õ§­DDm—Û.}œúq*ÑYÇYÑó3Ñè­Ñ[¡ \"—HD>:JG‰è.uP6ÐÏo‚Ãæ°9lÔÇøˆÏçóùü±_K\ÓXÞÓ"ñìç‹K_\ À[n+·…î’k•kлô.4 ¬¾±úçç„„Kýý ¶Š­€|ê«¶¯Ú‚ý.øfÖ7³´ðÏ\—ÁeŒýBÂBa¡°pw5;eÉ3’g$ÏgZ×Ýi¹Ó¼>Ôåï_~ÿ2Œ33P¿Ìü2v§íN =LwÛï¶ÀÁEWÃÕÀõ=×÷ð¼òà•^šôpÒC^7¼^|'|'€´Ý©E©EŠö‰B¢ø©“b ±†X‘xE¼"^1Ùµ íŠC+É;©bùzäkxa).,.àa`SnN¹ ¦¦a×SÏhWWp“J*çÜYsgʧã/ÆCeÑeÿxãЇ¸IØ$lú×z¿í p›~X—¡ËÐeØN°ã^ãLãLu¹¶s“äƒòA¨€ÛåvpûÚ}í¡€jÚˆA oàƒ3ÙÈ¥ž£ž£Á­>9t²âd^ÒžÐj¾š¯Íã¦rS¹©óŽE 74©oà6pVáLœ‰31­([-–VK+,švwÊ]r—±¡ð*&Åâ«x/€ò­ò- .W?S? JÉn²íF y¼Þ§÷IÛ´•¬ö ûŒ¹Z>åS¾¨²fS6e‹d&3™‰‡àoÕžÖ#úz}½g}ÇZm­Õnà×2dž€oÁ›xP×+yJ¼,¬øzñwÅßÉ;µhX‡,û“¶'mOÚNÄçò¹|.w*@Wª]n¿ë…{Â=áw.eWÊ®”]Dº2]™®Ì²_Ónvnvnv¨v£b„X`ðñ8È-Ï–g˳ƒZ¬[T·¨n‘ºœÕÓÅéâtqöQ¿¯¾Ó\GÄÖáv…ûúñ~íZO…hw¯qoˆvã¤8).¤ð5ùš¬N×vâN~f½ˆ‹ŸÉçøe¢¸Žq‡ÇÖæÛv=,÷/÷çLNÙ]€Ü£¹Gÿ6൯_û õ«Ö¯X=?öüŸŸ®íÄ|§ÞÁËÄ—úÿð‹@öÉì“Úo0n츱"PøBá Eo¥º‹`ñÂÅ þÈú#Ké`Æ5`gÜɰ¸ïÔ;x¾Ãçð§ôäWäWˆ@å«•¯æîKt¶`lœ¶qšÃ—<Ê!Þã=<ª-Ùì>4ºn†Au¨44 ®Ž©c Lãã†ÕŸÉÛÉÛ nó.ïâ¡ÍÆÃÆ7m¾4Jü{mw¿ëêÖÕMV€1Øáò­º¾ªcUxj=µžZ˜·eÞ–y[ànãÝÆ»®°¾½}{ûöBa¤0R’m%ÛJ¶A x2ð$„”“oÅl>‡ßÖ£§æ-tL¤|Cùkµˆˆö”\scÌ 9³ãÌûgÞí|äü­ó·DÚÖ¶­m[+2Û7Û7Û'Òµ§kO×IÄ@b 1 ¢ŸÒOé§Dª ª ª DŽ|qäË#_Š”Ü-¹ZrU4Yn™C2¢µùlþ´ð~çýN†ž§{žó¹/MËO-—Z.Aö¦ìMÙ›`ú²é˦/ƒEÛm_´ú‚}Á¾ ›–³œf6ÏlžÙ e÷Êî•݃âúâúâzˆ<)”f,}ÈyKñ;z|y¾<+ wnݹæ³émÀîšÝ5»k ´+´+´Ëœ[1·bn4lnØÜ°Ùõ‡ÃáF¸¾¾výå“Ë'—O††Â†Â†B×ïò¥ø=ºˆuÜ:®…EŒ%Æ­ADDòI-}¢tVé,‘^o¯·×+²/±/±/!ÒkõZ½–ˆïœïœïœHk]k]kHÛÔ¶©mSEjNל®9-Òh 4D¢s¢s¢sDü7üÄ]zMsøRüi=©Ÿíç p(q(ü Ö¨·IÆ$†/k®m®m®…2B´ ¶ ¶ Bà<` fµYÍ0¨ êàœ•iÛ‰;ùN½ƒçàÿïYùÀÞ.Øû؃yƒý,ÜÍ&æIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-9.8.png 644 233 144 2641 14774263776 14775 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜVIDATHÇÍ–kh“WÇŸ¤Ó´µ4qÕV¨™¸TIqöƒb±ÐZ5ÃKZQ¤Ðâp^*Œ©0«&EÁ/ê—!õ‚³Ò‚­õ¤¸¢d^í˜Î‰ÕEm©Fš4X›æ}ßóÛ‡ä$™Î}ö|yynÿÿŸó¼ç9G@DD\‰¯€ÝmwÛsã¶}CÊŸéÍôzZâöl+m+ÿüœ‡œ‡&6Ol¶¤l×ùéõ")üt>í—¤Ž6G›­"aï5ÅkŠ3'ÇíÈ:›uöÏo<Ðq²ã$ßÂÀÍ›CC²u\çëz—Ž/{Þáqþq~ÛpŒwŒi‹§-þü»xÂãÏÁ·Ì· àyÆó eóCŽª"DÐ+˜fëx"_×k<¯ù4\À¤òIå"P]S]“u"^ðàÆöÂí…š/v–C4Ð@Žú#Öë:L1…(¨»ê.Ucj @ÝW÷ÃFÐU¿ÅÇ?³‹]ä$ñ’ø ¾$\ü»·1ºŠUÉ ˆÝ`¢qÛ¸ êSãšqX" T†5bKXÂR+<ò@¹•S9“^¥òŒ€ Æ,ã™ñ, ?ºZV‹xpQZ+EDfþYY‘O ×ì5_X j«ÚÊÈX_,3– Á+ÁKÁK`=²YÒæ0‡SæX`,0€—¾—Þ—^0Š£@mTáºÆOð%ùãzÂŽü õ»ëwƒz `} ,` ÷ ¢¾ï˜w ²»²»²» fGÍŽš ®ª«êjJÐPÙPÙP,,,ÀÏÏTϬž^=ÞnxÛø¶Ê£<À Íç×zÂz¾‡ÖpkÌyê›O´éj“¿Éókç×ίM ˜šš‚–U-«ZR½§£¯£¯£ŠÎ+:÷êîÕÝ«O“§ÉÓ³;gtÎH¦G­,Íç×zì"¹×r¯Í™'R^Y^)"""¶‰N; Ož)<#2øfðÍà‘Ö†Ö†Ö‘§Î§Î§N‘P( …$¹J]¥®R—ˆã˜ã˜ã˜HYQYQY‘ˆ³ËÙåì)é+(H¦;lÇ5_‚?¡Ç.’áËð1KdÜ…qD2¾‘׺қï-ðˆ¬­Z[µ¶JĿſſEÄ~Ë~Ë~KÄQî(w”§„µW¶W¶WŠäææŠ„ÃáFåR.å9=ùtþéüT¾:§ùâüZ]ĺh]´ý%bTU"jžˆˆL҅ݾîÝ+Dü=þÈÂú…õ ëEò]ù®|—È÷÷·Hknknk®È„þ ýúE^lz±éÅ&‘vÕ®Ú•H°;Øì)X^°¬`YJ˜ü ùâüI=ïþc=Ï0ZŒ¢úg8Ðv í@”l.Ù\²®T\©¸RÑáÈp|ë}ë}ëáµûµûµŽî<ºóèN˜›37gn·Ž[Ç­´Sü»¹ÍÜF”ÎÿþÇÞ;•Xú”¦a7xÂOé¥7 ¸™fšbŠ)Nóïe/{‡<äaš?Ì+^mÜä& ŒQcPÿ{*Óæ˜ÙíMîKùÛ*µJ1ŸXÙV6˜_˜ÓÖ~k¿µ¸Ìe.ƒ•SGu`Þ1ï˜wÀÜan5·‚õ™µÔZ œ¶–ƒ‘$¾Ñ;Ú;úÁ9–6ùY¹:3m2cÞ0oÊZg­#–h®bÄ…‰ „ V|×ñd~¢óºy=_ó½7ù?pW²}êö©iw%ìc9`DŒ€YkÖPlØ eë¸Î×õOãð®üh_í{ìã|ÁþÅS¼ñÒ*;IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-27-red.png 644 233 144 4300 14774263775 15613 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜuIDATXí—{LÔWÇÏï1<º¸#4[†µÊ®uEQºjitmL4.Q4P7´û‡Šú °<¶>Û¢­º´–ƒšPµUXµ¤ÖXRM¡ëÌTgS ÃðÐa~ïþÁÜßof²«Ù잘sϽç|~÷~ϽhÚfR€ñ+C­¡ÖP+7áˆi i i]½\”EY”¿=N‹i1-¦Ãj ‰$’È| ÐWkØ|¶žåcùëñ+yüù ¨€ øæÀxôsb«Ø*¶6s»¸]Ü. Ä555Šóëû×÷¯ï6ÞÛxoã=`ƒyƒyƒY÷YœÍgëY>–ŸÕ{<ñ+ý9ðcü?æXÌv(././.O~ýh×Ñ®£]êSîîî0‰qŒc€8Í÷ÅÙ|¶žåcùëÍùàñ|dšÁ;y'ït\` ÌWÍWÍW¥l^›Çæ >SªO«OC’K¥ãÒq@N–g˳9SN•S9Yš'ÍäR©X*Ô…jŒ‰­·ym‹l‹`3_5‡šC¥4`'ïାi††Æ5sÍ\3‘X)VŠ• =l¥ÆRb)‘25°7ä.¹ n©Á[è-T‡/0…t€’¥dPЂè6 ’>_jÀnìÔ7ЉN¸Ù4Kå°å°”Éê3ÆG†»†»†»¿û-›`Úkª0U¨ ö!»Ëî‚Ë—Ç-¿'ß”o€tYº Àír Àɇ~`PJ•R{eì˜àž™€±þ±~@~o(v(<{>†Û>ôó?< —i¯i¥i¥šÀx4>q‡¸CÜÑ]Éu¹u¹u¹êk¾ª“R3pö8{xRN§œ¾›ïƒÕ`€êúêz˜²MÙ 6,6 ˜n? }´€'üðwÀPj(¤æ7W¼¹BûÊɺÜ÷Ÿyÿõ5mgøHŒJŒJŒJDÍðêá‡_¤#âÙžæUçU@Ì@Ìt}Þõ9T·T·øµmkÛ×~ºöÔ×Õ×À™3gÎ@黥ïps¸â»»5Pixõàðà0Àxýóº}ëö­Û§™l“gÊ3hIVô­è€=u{êüÚàNšKsàPó¡fÿ¸”.¥ûûi‘i‘°ýØöcz~ÙæÝíÝ­×g<Œ÷µÔs† C†!Cë±PÊ' Yˆèlèü¡ó‡ˆˆÊï—ß'"šú~ê{"¢êeÕˈˆÂ;Ã;‰ˆRûRûüoñŠx…ˆèð’ÃKˆˆnGÜŽ "ªpU¸ˆ(Ì7íw‹»¥×7´Z -Z˳ûUÍY^»¼vy-î<âÑ#p h€Š?(=J ÷çåÈË‘SS!q!qpzìôþ)›”MíˆvÀžïö|Àã +Ic€š¤šU3T¶ÊiŽ4Gâã#>“Ïä3½¾šú‚ú‚ú? „±ŸÖÖ,>,>LÚ¡íd¹P.”Y4´LʤLѤ³¦R*¥ŠåÔLÍÔL$ ÁñúYíi=b2šŒ’Ñþ–í„í„¿vå!yÔ ê**Qé§E«Z¦–j¶ò•ò•þ9›ÿ¾ù›ÍßÈ…Ú 4.Ž‹ãÖŠ˜1;cvñÞÂ[¸“>º\†ù3ßßláŽpG¸ÃK(N(N(&2äò yÖ M»©–TKª\¨]>EJ‘R¬°Â `#ñëêyòéþœž`ú–@×î 0è§Ýý¦ý¦ý’ÑÞho´7ðÀFiѹ¢sEçôkG<"ôúþ% ¿T×7NO= 0ØØ‚M>ížùOÚM[›¶6m­®]kŠ5Åš‚ÓqU; .‡ËárV•–áG‚êrô_Ú“´»R¨ª„*G2ÎÙ›³7g¯z`áÔ©…SÒ-í¨…Aa°(ލÈwíö z¡ô?Z°v+ý´pÛ¸mÜ6€ÖÐZ£ÌçcùX>àˆ#Ž.}???I$t ÝB7÷7ßÂì “û¿™Qû•A”!ö†ßÊåU^åU€kçÚ¹öþrzüWÖ “±å}âQÿ 'ô‡c[û IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.png 644 233 144 2163 14774263775 14617 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü(IDATHÇÍ–]HTiÇŸ55Dó£û h –@ o¼ÐÄ,(šJ#* jYIØ6»ðbC‚/¶ W/¼Md Š>&RRPñ –ÕnÜ&‰‚½æbv™ÉagsfÎy{qÎ{Îq¯ôÎ÷fx¾þÿÿ¼Ïû>ç‘=ö¯€ÿ ÿ ¿Ø²ýß»þ‚S§¾þÕ² ð]ð]øã'(((*2ß»¶Žë|o½ˆ‹ïåÓ~Ù#®#ÿIþ_£m߃KG/-ØkÙ?ÏBáóÂçÿd¡ýeûK€gŸ=äˆ.FâñFpm×ùº^ãyñåÞÿøE ïuÞkߟ¿+—j>Ô|øG+áãaœ œXËYËQ~0b@EªH’D¯¿<¶ŽÛùº^ãi|ͧù-=Ç+Ž‹ÀùËç/†¬‚÷£pçÀš/ó¤ˆl6ž·Ûlð@UgAýn.™KÀº®®·Œ[l¸ùv½ƒ§ñ5Ÿæ·ôÈæÞ>8 .8‚À˜7æÍ+æ2v@QÂnvƒ:©šU³³c¨¯Ô^µ8A=õ®› ³Íl#ãà9øšOó‹WÐ7¿@a´0šÌ…ÆÃ< æ5ó)Ç3ÃÞ¸B2½™ÞL/ÄšbM±&ȳÁlÐó³ÌzìÍx§]>Íoé±… ÎÁÍ»7ï:ÅÕMfݳ£Ôšú¤>¹ð‰©ÄTb jjj t t tZû[û[û!ý"ý"ý£ç$ 4xvp¾Yíò[zlao»àÑçGŸºïÀ1FØR¤Àè4:N—g$w$w$êÊëÊëÊ!žŠ§â)ØW¹¯r_%ÌMÍMÍMyö©Ýl7ÛAãyðm>Íoé(ž)žQO z,zÌ»åjQ-ÚÿN묳p³’¡d(‚ú®ú®ú.([-[-[…ØÓØÓØSÚ°VÃ<ß^šßÒãÉ äøV$/œ½þ‘#rDDD|âa’I&E$,a ‹¼«~Wý®Zd%µ’ZI‰„#áH8"RÕSÕSÕ#2žO§úèóø -h[·r s,Íæ5È ƒ`tÝF7A#hÁÜoî7÷L0áÉÏ:"¶3Ƕ0ù1o˜7<“2d…‰ |á _¼·ÎŽ;ùº~Ë“›ßJ§F›ÑƨYeMv>pmwZ¶ÝoåŽ}]ìØ÷ØÎ|Áþ)RoÐkTIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-10.2.png 644 233 144 3107 14774263776 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜüIDATHÇÍ–ïOTWÇŸf€¡È´”Uª*[Vb%‘îV@£‹ÄRBÕ‚%ˆ4„nC²Æk“µ`RäÅê4¶ »6E4ŠºPDk¥Åظ¦âHµ[”0˜ïÜ{>ûbær§íþž77Ïóý~ïsÎyΑ§#_{š=Íž¶í²üñ¯Æ¿ú[oØ> ƒ­ÌVöÝßÀý‘û#€gZži1®Y¶7ó£ç‹XøÑ|¦_žË××a[±wÁ›ÙofÇÿ&lÿý¸N¸NL‡àÎw:Ž·oe3Œ]»0¹jrX¶7óÍù&^4¾ìú¿8O9OÙnC\l\¬¤¿’þJÆ–pÂH¬{mÝk£1£1Êú= ‘Dµ ðãÇ÷£l3É7ç›x&¾Égò‡õ¤¤ˆ@é†Ò ®OÐDD®µÃ¶ùÛæyÚ ±‹]$‚îÔÀ?BP€ ú±ÏØtªÏÔg겺 õ ú‚š MM|ÌÇ$ªþ^ÃÖ=[÷˜¯µóÏ×§^Ÿr})«SV[kùîY oL½1j €ö•bÛÔuÖ³eŒÆÄL¥P1*FÅoQE•å'UM«i”úƒ‘b¤ ¨¿Fð\X0îYµ”""YûÀåwùýoznzf`K¦}Sî)74¯æÕ¼_Ðô}àK÷¥ûÒAe«l•%è0‡9l™Z…Ö 5À½E?5þÔÈ#mgFžyøÂÕîj÷;L=‘_Bí{µïÊ0–Lî½W¯–e,[±lêtÙé’Ó%QµQmTà:ê:ê: ›ú6õmêãWãaÿÃþ‡ý°æØš¶5màÞánr7¡V|˜ÿ~þûàóK`sÅæ 0ÃzDÝùv+96Ó—TMÞ_^N~9™ Y׋rQ. œ½töÒÙKe˲eÙ`–0–jsä=§ý ý9s*r*à|ùùòóåàmö6{›aå‚• V.°ˆ » » »À3äò Yþ;™w2ïdÂh`40€ÞúÞºÞ:øÝï_Ð^Ðàì¿>øÀŸáÏ#ï©àSAÕa—Y1•1•¼(CÎFg£ˆ|(""¾˜1gº3]ÄQãxÛñ¶ˆäIžä‰8v;v;v‹„JC¥¡R™ZH i!‘„„„BË?oxÞð¼a‘¦ä¦ä¦d‘α;bEý÷óSäoå—ç—‹Ê`Z0MÄþE¬+ÖÅ‹‚J:“tFupäîðÝa`ÞÏ÷HÎs9©9©p²ïdßÉ>ïïï‡Ô[©·RoA}A}A}d5g5g5à{Ð=èïlïlïlh½ßz¿õ>H‘IìMÛ;ï|8ÜÕþnû»p}ñ÷K¿_ à»î»êϳÍZ¤:"§òÛ­|}¤çH°&¼ÇÌ÷½t{Ñö"èèè¶{7z7z7ÂòøåñËã¡çvÏížÛ0quâêÄU¨ôTz*=ÐRÝRÝR kíkíkíPücñâ°äÙŧŸ"øï ß4}Ó¤j ëA×Ð Í=ÆÌ©ÜY»Ó¤5–@ÈòÁp›šQT@@m´E•ö 9d“MtÛ ð³ExÀèÝzw4_mqm±ÙÏ|iõ1åºëºëw`ÜÔnjV3ªµ3Ú© RIµÐ9Æcè¹z®ž FŸÑgôûÙÏ~0ò|#T™*Q% ·ë#úèß=ž|<É#½1Œ¯ú‡_~ À5ìö;8nö±_uþò¸ò¸™¶øÓ‘?ÓŒ*£ S²44à1ÁHU#ŠÑчøðEU|ÂXg¬CcRÿ\ÿðEð—ÛÊmÿ·óÿâ®4ï.ó® <4Ð@âÌ£Wê•ASç°aË6ãf¾9ßÄ3ñM>“?¬çI~]<±ï±'óû?Ål¦šdOIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-31.4.png 644 233 144 3057 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜäIDATHÇÍ–ïOTWÇÏðs¦!3ì¦c“Jbj3µË–Ý\Ù2ALš«h×Ê êfCØM[¥Ù´t•­Y·! H”™¡•Rµ6¥#IS%MWpŒ& m€0 #0ÃÜ{Ïg_Ì\îdù~¾|>Ý.ž†!µ7µ×TÃïBE^Ežyk8 ·Å½¢ÀQïQ/@G‚ŸG~ðú ÁÀº_×çë|ñüâÝÿË/$_I¾bz©)©)BÀsEÏ=ÿV4`êy(-)-˜IœI”  Îi¤ÉB H},ÄaÝ‹×çë|:¿žOÏÕ# óÕÌW…à_®%×’¥-:án'-õŸÔÒqs‰VZIe^™PëÔ:ÂüZCè’—åe9&ÇU­T+ £(~Å@m¤ñ÷Ÿ­þÅúuw;éri.ÍÒ™od¾aìiìÛü¿*ÛU¶ ä+‘›À#ÌV'Ô "à%^BÊvù©ü䘼#ï`ŒÇ±“„ oX%ÿÕöj{‰ÈÊ Ê º9rµ<»<[ØüZÜV !Äξ¶tYº‚I0eŸ²Cä ûçûKÇ/¬*MÊ€2À¦±X ¬ ò ò ò Î1Â#À<3ÌëQsøÔªwÕËjà™µàZý0õÁÔÀw–‹–‹Á$–¢z„4 !ÄÅïàMõM–þÊ"‹Ú®ß8÷æîÍ…ô¿¤_H¿€,»PöQÙGò‡ü!?²Y,pŽ;Çã0xrðäàIC—æÐšÔ 5CÍ0ì ¹ Å ÅÈ¢Pá\áÜFô.­ûhÎÑàFTPŠ„b´¾Zþj:~øIV¿lÍ÷æ{ û³ýV¿ì;ì;ì;`¨o¨o¨жm)ÚbÂ5×5×5—!`}q}q}ÑÀ×ï]¿wýž_RR¼X¼¨o¶¬Önt¹»ÜÀ×Q=‚€ÕkõÊ^Î6Í6DÁ¶åšå(¨-8Vp 2Üî 7Ìm›Û6·ÍˆÛÝ¿»w?xòÜùPd ±¢¬(B˜¬|Ë·¦qÁ‡±»ÚÝÓݳqº«Ïšßé}§—°c‹Ãâ°@Û`Û`Ûàæ9m?m?m‡Qç¨sÔ ¡ºP]¨J—/=³•³•³•FüÕ\={õ,üí©†Ï>‹«±oº<]`M¯1ôSY[][ FO R=¥žŠïCŒ1œç<ç㔩¨¨qx™e– (Kd‰,åeHíŠö£ö#’ ÊûÊû _壶¯¶XŒJ&b} Ë„e"˜Ä¿'“NPÿícjÓúç럳ª=£¹40„o\‘Òi‡€RHîsŸû †ÔÎÐHcœÐÕ¬šYÕbü0Y0Y„,“–É`J¬mêü”›ËÍ€ŒuæzC½ ÑŽÙXAPP0:½Ã½£,°Ñû ZµVM„uÕ§ú€Ç1~=ßæÎ»+9Py 2î®äígß~Vÿψh¢‰4P‚J@=¬& rX`ÂÖýz¼>_çÓùõ|zþ¨ž'ùuñľǞÌìÿ(?Dä™Õ ÜIEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-left.png 644 233 144 244 12610450011 16061 0‰PNG  IHDR Vu\çbKGDÿÿÿ ½§“YIDAT(Ïc` üÿÿ/f``XÏÀÀ🠆™P…ÿñj€*|†¦S±k```è" ® ªŸ¬Pb``h ÊIX< ÓøJÿ!6X×£i$3âH–¥‹ŒCÄIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-95-red.png 644 233 144 4250 14774263775 15624 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü]IDATXí—mlTUÇϽwZ(-ª¼ØN5Ð]eiS^Ö"‘N)SL¶iH Ñ‚­n@?H[5VX£…Ê*ÆÆŠU²¢›R:Z(‰+M5´h‹–àš‰ŠŽµkˆµÂLéËÐûòÛsç%*Ùì>_fž{ž—ßœçÏi…˜´"ÆÔü)ž)ž)e$ü %±-±-±mõ2‡á0FÏßÄ"±H,‚Éekp‡pHb}kŒ—ù²ž¬ÛOÍ剿Û*¶Š­jkìúœÛmŽ6G[ëÏÊ6e›²ÍIM ¤Ò|PòMÉ7%ß@Ù÷eß—}¥®RW©+âËu/óe=Y_öûm¡®ˆõç5ªÃê°:ì_$w(£2£2£Òx|ÿéý§÷Ÿ¶¦‡‚CÁ!@CCc”«\å*àÇl?¼.ãe¾¬'ëÇö›×øÛ|Â9]PÔÿ?dW—«ËÕ¥ßé›ð…|!|„Íʱ¦[ÓÑú—ú—`,1‹Á(66ÁX¢_Ð/€±S߬o+ÇrZNt™ï›ðûŠñ¹º\{]{õ;màµ_í—ýÓm4¥UiUZ…pìvìvìn>/Ü{ܵîZ½Ø{Â8mœ&¨7OTMTå/\c³Ì­æVÀ”Œ3\ÊÄëÍ<ÍÓ`=ÁÇ|LP»÷¸_w¿®Ëþ’Gò‰„þ„þ„þ?ýQ8ëœÏ:Ÿµ²ú~ò'ù“¸®4^4Úvc—± ••ü‚M<9ñ$@à®À]@päÖ‘[FfŽÌãÅ@O ÇöýäwûÝ\qÖ9«œUV–ä±ù[[[Îî– û*öUì«° Õ[ía-ö-BKó—æÃäkpcÝuGç Úv°í`tœÖ¯õ!éO›:zkï½ØI£û*7·±w6†OXƒiÙiÙiÙìùyõÐwCßÙ‰:™ò7çÏÊŸ0ïÒ¼KŸ¬ÿd=ÀæÞͽ‰=‰=ãMãM-J‹0{Îì9u~Ô Ð‘Ó‘ßÏ~?ȼšr5%ÒïçÕCG†Ž€ä‘|ô¯k^ZóÒš—"¿Ì¯Íàpíp-@Âì„Ùo­ykMôÎÆãÑ;wâø‰ã5›j6dÍ: °¯}_;ÀÁe—Œ55ƒ“U Ÿ±ÊXé/y$_”c¥=¥=¥ÍÆ*c± (û…ìVÔ­¨œ œx5ùÕähPÛãxð܃碟vvLëžÖ 0?w~.0|¹ür9‰¸Qº´tiéRûÜ>&w´|Yò†e ôŽ+ãʸ1O™§°ø³½7ä džÉ<0#qF"@ú+é¯DØu`ÀÅ[.ÞÐ}{÷íÑ ¾‡|Eiµçcï+KF¹fºfºfÒ+ù„Z¬«Å?Ê«îÀÖk¬’ÀT3d†ºžéz}Þÿy?ÀxÑxÀç¿80yÓÀÑûŽÞÐ^Ö^àwù]QœúpÖp€²NYÆá——¼¼$Òïã½W:®Ø;ù¨’«ä*¹? íííŽÚzù–eÞš™œ™lÌë[÷mö·Ùv U¸vÝÚuéÛÓ·Ö§o~ú&@qnq.ÀÂþ`ÞdÞ°¨qQ#@ö†ì 7t܌ִִ÷$ç%çôìîÙMhT ¬v 0í @›£ÍÑæ¼qE¤¥¥ á8å8å8Õ2`ø¥…_~ml—¤fõ`Ù`!<; v£rÔÙiÙiŸ]øìBôˆ¿ÚöÕ6€¼Î¼N Ž¿2lþ˜o¼ç~Ïu幊ÍQp“¶IÛô¯õ“~’|ë¥e¼–››ëK&Tï¬N«N³ íÉÍœðNx± è : îսр–ךôsY­‹Á²`c%c%‘Q>ôءǸǾBëÕzµ~|µr³r³róöÇjŸÛWêeƒ²aU“Ò¢´(-R+æcžNÏ£žGñØÚÝn–š¥Ö‡Ö‡@ÈÐõ@—±Ý¾®:†ÞççVÍ­š[%„êVݪ[9¦«˜ÉáÏõZ¯Ö«õ*'²j²j²j„H¨L¨L¨ô9vMŽ&G“7ü/IÒ™¸¾áçbÚõãM&ÜÖîñ_ÓîÊ{WÞ»òÞˆv=Ë=Ë=ËùûäºeOB)WÊ•òUµ±mÔËq}ñ_Úõ´›¯ÕkõZ½‰.¯+¯+¯³^ι–s-çšþ…=êAmP¬ÎÍ¢Y4‹ð±£õÅõ›"þG‹×îó±þÊo•‡•‡•‡AÜ-îw› Ôt5]ME(BugŽfŽfŽ ¡ÕÎjg•Žpâú¸Éýß,ÕþV$ŠD‘ã|ìòSª¥ZªÊIå¤ròß·L>ÿ'n2¾¸º×õBjÂý¤¯.IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-36-red.png 644 233 144 4242 14774263775 15620 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜWIDATXí—{lÔUÇïï1ò°0Ò€Ô2Ý é*TH­-tÐbÃ5iÅP«¶†¤Šš®b¶ÑÐ2ƒDë‚l…àJ©fÃÊ–Ä55"ÌThQ)¯™aÛN;¿ßï³tîoÉJ6»çŸöÞ{î9Ÿß9ß{o+Ä˜Ý RL½oœœœ_ùW|"ãºöëÚ¯k_\ º¡ÝïŠybž˜cËV“Ð….t9†Ô±Õ$ýå~OÆOͧޗʓÌW#jDêK]Ÿ>Ko×Ûõvß%åYåYåYÄ™Ê e†øËò“ËO.? egËΖo‘·È[”Ëué/÷Ëx2¾Ì÷Û½Z¯Ö«m– ---Ö“ñƒ1ŸŒ¼>x=½­ä¶;V“*&U¼ÿÉûŸ$óƾ} °®x]q’TïÐ;¶~¿õ{HÄË×RÑro˽֓veSø„59'sNæš.-¾”w)€ÏøŒ9ò›—N_:ÀuÂu [íVÖß°þGÔˆõÅúÞZùÖÊäú<ãó €æmÍÛ€p|>çø¬ã³_wiñÀÑ£ y$ŸýãÃo<üÆÃo$¾Ì‡ŒCÀ€œzâç'~ð=ä{(¹ûÊö•è[õ­ç6œÛàq{ÜUwWÝ Õ£:@ÿ×ý_¸xà"0pF9£€HŽÉ ä‘|qP>õv{»½Ý¶£a”ÃÀD&&ǸºòêJ€{~½ç×䊕,; . Le*Ó–N[ 0yõäÕÉþÕÕÕÕ@$žðe#×ÈMä÷Þî½Ý{»}o*+Z^Ð\Ð\ÐÌéaeXV€½ìe/k­³ÖYHœÏ¡Ö¡V€~üàG€Ê§*ŸpFœ€®‚®€ÌþÌ~€¼ê¼j€þ¯ú¿8°ïÀ> în?Ö~ ¬|,™¥hJÑ”¢)œ–|B-UKÕÒÑóò©{¿æ½ïíH’Àøð¶ð6O¡§ˆ~yêËSÉõ„z’+Õ:Ú: P( ¬Ï[Ÿ—|ÆB/‡^P[Ô0>zó¥7_Jäûë–CÇ·+ù”’¯ä+ù£ç…v§v§vg}£f[‹fÿ4û'€ù§æŸ¬Žû;U7 @|(>8€¦eMËôl=`oáÞB`°~fýL`™Ò©t|ãýÆKt0žhNýìs³Ï™ö MצkÓß¾"2<ž úýˆ~¤­Ï¾ð½‹Ö.Zk<'IÍÚïBß…ˆâŸcÌ1€AYÁ©7N½ õ‡Ö’+=taèÀšWÖ¼’tʯLk›ÖæÛ­ÎVg¢Õ•ßTø+üæ  X¥UiUÿ\56ž O½´ÛùŽ|G~ï{rCíÆÚ‰µ­Ev禌N†e·<<êM¹ ­sÖ9²É¢¼Ë»=¢ƒQ1Ô5Ô•hõîÈîšÝ5,³ŸÐFµQm^¬Ü¤Ü¤Ü”·3 Pû‡ý¤>ª<ªµÓÊÁ´Ö %mx4uì?¦ÝàGIÚÝX»1I»Î˜3–t8Ì_Ì_Ì_Z졇ðOè™Ð3¡ÇZnk2CÍP3V¿’&Åmi|ãÄoOhÍiÚ]®´)mJ[²vý‡ý‡ÚŽŽ¶£CYCYCYpkèÖЭ!ãf[‹{´=Úž?-R‹K/p²¸†%d€„v´$ínqmqm‰9ƒmÁ¶`%J”$­Ý_»¿vâÚÑ·ëÛõí=ñI&ü--o|^L¼`ºÉ «ãÚýóÒîÂ>¸ðÁ„vý ü ü øplݲ;¡”+åJyI}jõrZ^Eü—v-íÞ§5jZcï| \¾©|Sù&ë͹#sGæŽÄ¾µ[=  hµ3Ä.±KìñkG ¦å'þGK×nCêxá)åqåqåqKıĜ­f«Ùj6(BŠøâhÎ`Î`ΠÚ1í˜vL9߸*­sÿ7sÚ¿y„Gxô©Ë*TKµT ”ƒÊAå`ÿïÆæÿàOëL -î5[ýoÙËßD@˜ IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-0.png 644 233 144 1367 14774263776 14622 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܬIDATHÇÍ–?hAÆ¿=5wòǃØ)ØØbÀ69P<D’"¨XˆURš"…•¦V†€ØLLH+zêZh!BÊ9°84&¹ÛýYì¼ÝM1&Žfy3ïý¾™ÙÝH’Žº§ u"u"Õæ©ñxf 3pòi˜?j€WôŠŸîBçTç@n:7í/ǹÍ[}²_ŠùI=×QÅéÙô¬—wù\=}õtæX˜ß/Av.;÷£7Ÿß|ðlæÙ ·¡R®”¾ç¿ç!ÎmÞê­ßxI¾&véKpdéÈ’÷Ò-é º/t_蹬öÀ¥ÁKƒ_}=¤ ±´Ñä5,ª‰Üæ]½õÏø¦gú¡AWW¿—‡.e‡ ËO`ìøØqÓÛžîq6¨×ê5€ÆµÆ56!(%<<ˆs›·zë7žñMÏôC?Ú¹·ÎÕ̕Ldè-4Þ4Þø#þÛn"¶] Ë·£jâ~ãßôL_IC§B¶’­ÔÃJc¥/‚?ìó3!¼É&{‰]õ;xc=Óý8c^íñ[ãQó™ÄØ íÕÐß ;ùþ™X?ô“ ×íÜ‚Ô7Ú7ê–QÞYÉ›÷æµ%iCò$¥•Ö~Âú/â;½¤þ¹AÇËŽ—Á,Tz+½;ŽJ9(ÿñ í7/â»0ýРמk÷?Cõ[õ[TU…`=X?PC»ý%ùÕX?ô“’üEÑû,Õ õB´ì]’Vµ¾âß÷ëÂxÆwz¦úIIµ|-ÿñôêÅ«Qïu)X Ö´%é—~¨1Ç‹øNÏôC?îð¿/H¥ÉÒddìƒD‘¢Ò’ZÕ*$mæ?Ãú/â;½¤þûB³ÇšòËß´ÿʦ½]ØÊ5Ý}LRÞ`Ñ¡•yWàÅIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-107.png 644 233 144 2762 14774263775 14771 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܧIDATHÇÍ–_LTgÆßafi¨Ò (D–- ©‘z!QC€H𴉀™’ƹgEu/ „#©f£½X@l×ÕȶZ»4­ZRcÕPHvYšÍv) ÝÄ­¸;ü™Yº d‡sÎw~{1ç›3îfï=7sÞ?ßó<ïûÍ÷žO@DDòœ_¬W³^ÍZ›²³ºþœ·rÞÚÔ›²/Yàiô4þå¬ûhÝG¯|òÊ'jÒµu\çg®qñ3ù´_òÄu¬¹±æ†§Æ±Ï@ÓMoä¤ì_ C /зlBó×Í_|uí«k…Øhl`¡f¡\[Çu¾^¯ñ2ñåÌñ‹€ÿÿ7ž¿Ášì5Ù"PRWR÷Ú/R } ö¾³÷€§Þ§^; ¬y —\»Xb ýÄ3lwòõz§ñ5ŸæOéȯί†÷Þ |œZ0ùfëÆÖšÏèc7G8B.×Ì{æ=ë„u‚$—í°{\«qà¡}Ö> ܶV€¤ý½1aL€ý/ºè"×þ³ƒ×ÞòAËZàägü¦þ§úŸk=îV*‘Ž=’¤Ømæ óØß[ßYßa8›(!B b*¦béŽa{m¯íqˆC®ƒ3œÁZhqñ!T*Ð;ödl¥ˆHÙÌf—|0õlêð{Þ{Ìce9±òÒÊK`ôŸŸºB’‰d"™€øD|">´ÓN;¬ö¬ö¬öÀüåù ó þa| > OÔ&jYù÷/Õâmøaî‡9`4p+pkɧõ8Â.=dæpóáfM§¶ÙUÆ6c,t.|±ðöÎM;‹wÃÝÆ»w]aQÙ‘ìHvŽFFFá¾yß¼oB^~^~^>”­+Ë)Ëÿ5¿¿û×ì~ÐýÀå³þq0z0ª;wé¡#ìÛÊ?/þ¼8Ýùèrb±k±‹de[å±ÊcîÙ“1‡2O™§Ì³ñÙøl¶Ln™Ü2 7wÝÜus—[À`Ó`Ó`”l*)*)‚§¿ý±êÇ*’šÏîê}¿÷}-ìÛµƒkí<‹½{˜tR©íj;XEV¡Uû+öWì‡G¡G¡G!è½Ø{±÷"T•V•V•ºjÛjÛjÛ ³¯³¯³Ïõ‡‹ÃÅáb8ìü‘óG\¿5¯ßbÛcÛAëÉñîõî¥\rýþ™‘„|(÷䞈7æñΈø¢¾¨/*"•R)•"¾s¾s¾s"fƒÙ`6HúInMnMn)È+È+È™î˜î˜î¹:ruäªH¤(²1²ÑÍ÷nvø’þ/ý_Фõ¤;fÇÞŒ½ üÎ) XM«i·²Š¢Š¢Š"¸3pgàÎÌ Î Î BáãÂÇ…áôÜé¹ÓsP:\:\: ‰D"‘HÀÉ™“3'g`ßñ}Ç÷ÏèÔU³Ùl½™àð»[ªYªùÓÄ3ô`èˆüLD„ŸK…ý²ý²¬êÊêvÔí¨Û!4‚FÐY_½¾z}µHç©ÎS§Dú7÷oîß,Òý¤ûI÷‘`0 E<·=·=·EÔ¨?PïvʳžEeU¼Ÿ8üZOúTr¸ýp»{JÀ\2݉n“d‘E·bª©¦¸Îu®gø¯p…+@9å”gøÑO?sð0“f2õ–âÓüÏʲ ˆbK>ì)cÊ”žcªUµ²¢"ªCu€ýO;fg TµAmPÀÚmí¶vƒêQ=ª'#~GÝR·RçÎîP—ÕeVXÖøSÖ”iþç瘴{ ”ÊÉœÌÖˆ5,«wÕ»Îì·Óy·UVYMiqŠJş鎫° c€5j>7ù¾ÿ™üÿç[Ikqkz®}ÀYÎ’ën±¶Â$Á¶‡ðà×Öñô_ÂY¯ñ4¾æÓüéoå {»xaïc/æ ö?sëûŠ *3÷IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-64.png 644 233 144 2515 14774263775 14707 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]hTGÇÏ]›ÍF6[•ŪiŒ²…R4„<©!M%1h¤1(jDSE"õ±PAÔ—jPWIŒ õA‰¸Áú X?ȃ>H‰hª´AócCÖ;óëÃÝ»wm+Ò7çårΜóÿŸ9sç?# ""“_ßLßL_ȱ}ßyþÀâÀ⼟û¤ Örkù¯?§Ç?=0¹er‹~äÙš/âá§ò¹~™$ž#ýBú«$a‚š‚@¶c¹—2.ý¥`ãå—:Z;ZÙýwûï¼*yUžíλñn¾‹—Š/ûÿÁ/iWÒ®X¿Cº?Ý/9e9e³€ßfÃÒ%K—<Ÿð|‚ñ€= š`”QÜ1œb»ó‰x7ßÅsñ]>—ß©G kQÖ"¨ZYµ2£ÙIxÔ;gìœ(€ø%à$' r^ETÌ=•«r‰qÈ”›rB„Lé«~ÕOŒ´øx|€‚^?Éçò;õÈ»{{ôk¨T€8@üØÏíçÀöSû)qÕ½ºã¶È¬1«Íj`Ó˜–ìf}Ÿ0±u­®%ömû¶ëŽßIò%ù%µ /~‚ŒþŒþÑOà‰ýÄbTð§.Õ¥Œ¹Pê3•¥²`hûÐö¡íÏ‹çÅ󼂸ÊU®Blklkl+ŒÌ™52+eþ®ÎÓyŒ¡ø._’ß©'QØÉ_ aOÃ7[E«:®Ž_RA…סÚÞÚÞÚ^® ® ®…§œZp »»»<þÝf·Ùm ìuÙë²×ž_ÐͺC¯z ¤ð%ùz|Nߊ¢" w,Ü‘h£XóLƒÉ6ÙòVJ—t‰uí赣׎ŠÜxvãÙg"÷ï5Þk™˜˜83pfàŒHw[w[w›È!ß!ß!ŸˆxãsQ¢Ä’QëœuNÞº|ïòEB7C7ÍèŸß?ß[™ý ª g·w·w·wCÚ®´]i» g}ÎúœõPå¯òWù¡ïXß±¾cPÞWÞWÞ«¯:¼ê0TTT¤à>²{ì`ØtšÎ”-Nò;õLΜœ©{`øÅð ïØÛ%*_å{i‘ºH]¤ŠšŠšŠš<ÅÅŠ‹!¼%¼%¼¦¶Lm™Ú…¡ÂPaãñÀ8D«£ÕÑê”-Ýco²7¥ÊŒËïÔãѺÓêQËÔ²dó¬#VƒÕàí@a¸0\yzzi.m.m.y<ïñ¼ÇóDjsksksEZkZkZkDæäÏÉŸ“/’]•]•]%žžžâáYq«Çêñø<þD=ÎÏö`œ9?’<ÝøÃ>` f¾7õ¦Þ[i[}[}[=û‹ýÅ~8;ñìij‡<ä¡w}ßõ}×÷ÁÞ̽™{3S:Õ®#:ÄìÓöéÄÙÇlðøzÞ*ÇÕ LÑ¡\¦38Á N型VZº¯î«û £:ª£@M4ùÖTšÊ¼15 Þ*߯c®Î½F¯ñtL‡tºN{³½ÙÞ ºXëb ƒ:¼BM§ósëÝz›Þ–²‚q½B¯`,!@Ò±ÿP~ ¡ü ¥Öôç> ãÉ;Ñx*—2Þò†7À›D ºN×ý/åÿÀ]é\r ¨Q5 `¯¶WsËÜÀÂÏvçÝx7ßÅûà]ùѾ.>Ú÷ØÇù‚ýô F ÙÂIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.1.png 644 233 144 2502 14774263776 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü÷IDATHÇÍ–OLTWÆÏ (˜ÁŽ‘é ,dcÄ FiL$jL5M„ÐX%jÚUÑFÅ… Ƙ*„Hb¢©RšÐ(°Á?øÕZëŸF$“È4ÃÀ 0óÞ»÷׿7ïIjÓ¥w3ùιçû¾¹÷Ýs¯€ˆˆì_ŒüŒüŒ¹)œñ­ÏÚµ¡ðJ ŸµÀ·Õ·õy=|væ³3ó.Ì» ]ìäùÞz—ß«çÄ% n`vÛì6_™AåâÊÅYÁþé>d·g·ÇMØÛ¹·àzëõVj!ô(ô R);yg¾SïðyùåØ4}ÈìÎìöý³gÍž%ë Ö/ü>5áåBؼió&€w3ÞÍÐ`~üº gg„=ØÉÛóz‡Ïáwôý”Ü5¹kD`KÕ–ªìŸ1DD/C]^]Ð `´ëAê¨Ã¯Ç1c ôæs ~Ô¥º€ù̦t¯î°j¬¬67šËìbþ”Q£ËæÇѳõm?òáÞžZÛ‚Û‚Îý Kt '8a'tz4ÚƒÜðA½_ïý'‹X„5¬†1ˆYmV›—[Ö¶,Çà©už­)j†ìPvh|&Ý/n¼¸‘æß˜üjòÚä5&F:G^¼‚ð™ð©ð)ˆ G†#Ã0urêäÔI£fšiva<Æ3ÛÌеº– ž¥øá…õ‚´¾íÇ6vöì;ºï(X¿¨b‡¸§¡çbÏEt *°5°Šê‹ê‹ê!óRæ¥ÌKÐÒÞÒÞÒî1âF܈Cätätä4”6–6–6BÏw={{öº ª>Of%³¨Š}Çmìép5z5 tèÝ ¢*JbêË©¥SK!~;~;~T<¨xP………0Ô7Ô7Ôç‹ÕÆjcµ°òàʃ+ºJoyoyo¹;Ïú=y(yˆ„íswZßö#0·onŸnƒPI¨Ä³%¯ôe}Ô/ªUµºá;v@SCSCSƒOV%«’U b*¦b`­°VX+`yÎòœå9Ðìv=ƆÍ6³Í£—ÖOù˜—3/G @x8< ˜©c¯&­·Ö[·ìé›§ož¾ÂšÂšÂmmõÓ·ô-} ô¤žÔ“n|ÕáU‡W†ŽÊŽÊŽJ±¿ÍAsÐÛfl}ÛO†ˆº©núDÌr³\DfŠˆH._³Œe’WÂWÂWÂ"Å«‹W¯   ‰%ŠHSWSWS—ÈØã±Çcݺdw²;Ù-b YCÖ—çÒ)i”›Ö·ýdˆŒ——=ûMäÞ{wDÄa¯šRJ%éTι;ç"Õ%Õ%Õ%.¿Ñoôý"_>|ùð¥Hâ@â@‛_ë_ë_ëÉæóƒnÜ÷&¦ÃÏž´¾ãgú©tO‰9nŽjZßzž!B„¼ëßû™g$œO=Ågóÿ÷©ôô1§¯Äœ>£Î«óL¨›êµz ºZWé*Ü9Îq”(Q4ÒH£›Vߨ Uz”<òT‹ja‚‰ÿÕÇ>èüv'†Tg¶Y€˜ªPö¿Ö€‰ (,, õ±¹ØÉÇìù†Ú¡v`€Õoõ{ù?Úù§Ý•黫nAÝ‚4A;pœãøÝ-°¶[ÛI€¾¯ïàÃ.vòé-³ë>‡ÿ£wå'ûºødßcŸæ öeAEãE&ÄIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-35.6.png 644 233 144 3246 14774263776 15054 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü[IDATHÇÍ–ÿOTWÆß,L,5è® ”RR[c€!5Xu³[ÒJ—%ŽT«Œ¶¢ÝIÕí–BÖ¬ÕíÆn»--F×°ÓÅ–@PDŒtº¤©ßpÓò¥E„™Ž#äËœ{?ûÃÌeÈòx~9yÎyßç}î9ç>爈HT ‰ ‰ YàÇ!»‚ã/F¼˜ø¹U`zÉôÒõ?Á#e”<úÉ£ŸhÝAlÌñ³óE‚ü³ëã%ÁðÚðZSz¿ ›“6'E,òã÷΃ù¤ùä˜^kx­ ¾¢¾‚=0øÍà7wÓï¦CóF¼‘oðÍæ—·ÿ¯¾Ìkš×dºá…?$ñkã×>ñ{@ÿ`˲eÜ ½ª‡€r,z:0Ê(FsÏÂÆ| ÞÈ7ø ~£žQ߯G ú¹èçD8²Þ»Þkvøº?㣂cÇ@o˜>ɧTPÝ÷£ïGÐ'}9¾&õÛZ•VºKsknà’þ®þ.€²+;“àsûÜÀç”SŽEÿ*À÷÷‚Ç ÝŸqtý½õ÷̈NNîi ÿ~±ÑºÑ ú/¦Û€@ÿ¹êQ=L³†Çx }f¦˜d’`›fŠ©Yølf3ºvZ•ªR¦Ð7ø—lLÙ˜b|ÿ…Y[)"òôGüÛ\i® ƒþ¸þ8˜>Ào]Ö;Üù€qßߘo ÅF,#– 9‡œCNp¹Š\E ÂT˜ cNóÅø2|àÊ¿óíoŸ^æç‡~k¿pš›†zD7‰ˆm…Ýj·ï>Óø ¨»~=!a'4,hH])’'yE³%Û’MŽæ¿<óå ·-¶ÅÛâEXÄ"‰„–„–„–ˆ¨BU¨ Eœ¥ÎRg©HVGVGV‡H_{_{_»Ì´áÈáÈáH‘áþáþá~Ûßle¶2‘Á›CáCáž¼%±,±ÌäYysåM‘"ë#ëSW†pÜä5yY.'#Ÿ|^äºêÝÝ»[~êïXÒ±D¤ño6¾)²0jaÔÂ(‘Î}û:÷‰ÔæÔæÔæˆ\È¿!_$¦$¦$¦D¤!³!³!3(l,n,n,N$54545T䯉u7êD<ß{”G‰ü³³üÙògå'‘ÅÑ,’+¹,ÑO©j‡©KdÞ™ygD®e^»}í¶DçzsÛsÛEZç·>Üú°È„sÂ9á¸4pià’ȶSÛNm;%RSS#âÞàÞàÞ ’x%ñJ⑪ªªB‘¥W—^]zUÄ]ç®s׉8zÝŽn‘¾[go‰ÿÍãH´ÈýæûÍ"¦³º]·›º„÷g싪šªãdèy‰Ø_»¿–ÉM+jWÔ‚£ËÑåè žC›m:´ ÒÚÒÚÒÚ &²&²&¼ÅÞbo1Ø2m™¶Lð&x¼ Pm©¶T[ ­;íZÚ5øWxyMya4zŸV•U•u~=»8Ú ö<{p@³¢«7Ô3:t¾§“N Ÿ|òçþu´ÐB A³Æc‰%8ÂÇ|<‹¯[E«h $Pûû`*ðWÒð1Ì=æžÑ0þÑ·ªo¨"¿Ï¨ýSõSõŒkIÚNm'`çU^U¯êU=¨½j¯Ú Z¶–­eEQÚ|m¾68B)¥ =­mÕ¶‚Ú5å˜r0®¥|싾'ûž0ÿ`þa4ŒÛ›ãü¼ñrø½}º Õ¢Z´Ú¦g¾X8ü÷¹?k…t ¸ç7âÀ¡ÏäÏð7K Þ\çÜ•doÉÞ2뮤0¶0v†à$ðï`ߨo@mU[™ý¼~&bcÞˆ7ò >ƒß¨gÔ÷ëy_ì{ìÁ|ÁþT=Ðn€%ÛIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.3.png 644 233 144 3153 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ÿO”WÆÏP)Ì”QŠÐÅ´©âš YÖFéŠÕÈ tL#š˜‚ÛØÕ]Ú°»n¬.ÙX*I[ÓR›aéòÅ-•YêF¨$2+M5Œ”/ÖMdi“20îÄwfÞ÷~ö‡™—×ý¼¿¼9÷œó<ç=÷Þç^I‰|âVÅ­Š[¶ã~O,N,^ݶ?ÖÁ²Ó²óöïaÙ‡Ë>°5ۚѨmúÍøØ|‘(~,Ÿ9/)HèLè´lØïÀë9¯ç$>¶Áê´:ÿ‚7»ßìèjéjá0|7ôÝÀÜÖ¹­µM¿oæ›x±øòÎÿð‹@ü—ñ_Zþ O'<-Ï>WøÂo“/Àk%¯•L=5õ”ŠÝ$‘¤¶>|˜c&Æ6ý‘x3ßÄ3ñM>“?\@êË©/‹ðQ™·Ìku„F[y¿æ“šO@ý 褙Où”$yB½F¯Aã]UªJx¯âÔux¨ïÑ÷ Ah.44pŽs$-âý¥¦³¦Ó,p´•?—iešÕaÖ#®í{¯ò¬=מ êçÁ«À4Ó žÑGõQ‚ì —\”Ù"u@UªJ¢ãÁ#„ejVÍ¢T‘‘edðTR¿Ô^e¯2 |ïÕ˜¥Y÷>—­mÖ6ߘ\5¹ ‚§ØîÙö}Ë÷-øC¿ !tãÆ ZµV­UÃ|Ö|Ö|VŒ¿žzê£fðOÁž`,â ãÄoÂüÓÚeíò-1ëeùØ ‡ôC:xó?¹[6½”ýR6ØÞµµÛÚQöûö/Àïö»ýî(a]M]M] ...ðØð6y›¼M°å§[²·dƒí[—­ eo*k(k€ÀGF.¼5ÿÖ<¨Þp=*¹Y—.-@KœkØ5¬ªò—¾Øýb7ÚœnfnVæ¬ÌY™·¶ßÚ~k;\;zíèµ£ÑPR^R^Rþxa-#-#-#¿"Eþ 0ñžµ¥õ¦õ¢¹ÓnOßžVUУzè áz„ù¥ÝK»U';§ë§cZïs,X8›»¹ns¤K;–v ƯŒ_¿¥)¥)¥)P±¦bMÅ(-*-*-Šæk}ZŸÖƒ×ïë÷õCÁ¯ †åߨ6xÎÎ7Ï7ÌäÏ䃪O.L.Tq|fñZ¼d‹3ù•äWDnëã‡ÆÉìˆ$c$CÄ™â´9m"kKÖ–¬-©¨¬¨¬¨¹Þv½íz›ÈäúÉõ“ëE.».».»D\—ÅeI(J(J(v;‡"#c#c#c"®»®o]ߊdü!£5£UäïŸ]Œ¿/³"Ë/?.¢ú%QÉŽSÓ+õJË‘øÞø^‘¿¸1}cZR÷z÷~½÷k‘¡Ÿ å å‰L N N Šì*ØU°«@¤ÕÑêhuˆ¬ÎY³:G$½6½6½V$½8½8½X¤}[û¶öm"™™™"ûÏì?³ÿŒˆûGn«Û*2÷«¹Â¹B‘e“)o§¼-©"š_ó‹È>•¬’-w„ÈšÒ×ñyÇç‹"PõÇÄ':Ñ6¬Ø`Ý`‡×áux:èˆ.Qß‘¾#}Gàdàdàd´{Ú=í츿ãþŽûàÙèÙèÙ§{N÷œî¼çMäM€cö\ã¹F4“óMMÀ_Í=†y*V¬.FN‰Ò«õj „ŽÕ-Ãoø ?„n†n†n‚ÑmtÝÀYÎr”]Ù•=f÷_àEàâ¬â=UOÍSyðÔÁS@ r*‹èÖ1ë˜o M›&6~,¬3z} 'Ðƒßø±Qn”]vLu©.ÕF£Ñh4à 3 †Í°6à'<Ïó  éC Ÿ\ \ÂodDt¬bÝÄ:ë]ë]ߦ#:ö˜ò³;qw"„{¼ÊC}@0*ÊÅV@ˆ@C‹èùƒˆOóxð˜8(”ñ†ñAê_é_-ÊîUذ;áÿ*䮤|Oùž˜»’ÚÌÚÌEgDË“ ä ùô}ú>4Pƒj ˆÚ¦ßŒ7óM<ßä3ùïÊ'öuñľǞÌìó =H3­IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-11.1.png 644 233 144 2652 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü_IDATHÇÍ–]h\UÇçîG6kcÔÚÐúÑ[¬¨È­qÁjLD¢¸­´H¡æÁØ’‡¦_$ "VôAû ]QŠ!I¡‰ Ý ´&lÁ@KÛÚdC*–¤Ð¤›d³-wïÇùù°{önÍ›O—ËÌüç?Ù{fŽ€ˆˆ<\ü ÖÖª z`·o¯|£ò ' úqŒwŒwþüúî¡ïé~¤Û»êëÚ¯ñåñ">y>m—‡Å7DNFN Eý3x·îݺʚ‚þå0Dû¢}9öü²ç€S?žú‘½0saæ@¦!Ó¾®ý¯ã5_9¿|öŸü">>c\‡HE¤Bj_¯}}ý¾ ½âoÅ߸¼TpoUT© K-³eºöñ:^ói~Oç/Ô#°êÕU¯ŠÀ¶ÛvFÀ¹ÚOv> ÔØ}ôð9ŸSNÆÉ¸ÜX¼ìáü¤N¨겺 ¸îNw'ŽÆó=ßSÅKE¾Ÿ;R)]àÕz·¶¢?èzäÞÞ~ÕÛ—¶/Ú`§Ô8ò!€êWýØÀ (եލ# &ԸǗ,‹,`c—¬Ju9לkØj½î^×f;En»·ÝÓ~ÕTÖJ‘g¾h6šÍ†OŒ'J„oææ—V.­äŽ=eOÙS,“ÜBn!·ËücŒ1üÎ0ÃeøùìÛÙ·¹cOø!MGKÑd4™ éz„?DDŽ@Û'mŸ€zÀÛ”9vëÓ[ŸB¬3öuìkTr²-Ùæ'˜í™í™íX"–ˆ% ÙžlO¶û~oµ·Ú[ j‹Ú¢¶@æXæ‹Ì;ëõ¢’N¿úýz“÷Êî¡ÝCú䎈º&"r©zÓ½iȨÖúCæJs%–>ס–¡–¡?±7ãfÜÿ·nÜZvbÓL3 ¹Û¹Û¹ÛPßUßUßU†Ÿ?;Uìt«ëôÌöÌêÂ.uÙêêu’¿f˜yÔÞâ=zÌþÛþ̈YaV@ß\ß\ßœŸ×R–²˜ÕfµY ýuýuýu¾?ÏÇóqð–¼%o ÜÍîfw3˜šUfôלJŸJûxwñÆÓ7ž¨>_}^ ȃÁ]Á]<'WÂGÃGEä[™ ΄kõ"¡ŽPg¨SĨ1jŒ)IĈC$Ôjµ‹ÈFÙ(}°9Øl1V+Œ"ÁÑàhpT$´/´?´_DŒ=Æž|N*ÃáA‘`<ç¹€àöNWĶ›ífcˆˆ¬ÒùÃùÎ|§ˆ3éL:“²LòóóE&ìÛ݉îD·ÈâÈâÈâHþL~ ? âþãœsΕ̫䲳ÁÙ "â xÆ•€Ùײ¯ÊSÃSÃS"ò¼ˆhž¦š5Yg®3×™Ë k\Ó¸¦qHíTíT픈uÐ:hIY)+e‰X‡­ÃÖá2|Uc¨1$²öÑ'柘—|ñŸûÀxvøæðM‘lC¶alTô-€¶#mGü[NÖñ'º,ý«þO)W÷ò{›üüÅ[Yšc*:ΆðÆíq0¾éµÚ¿Ù¿qGexœÇ—góZ¼¯¨ ‚ `’I&Á½ëÞuï Žr´ ÿž=hrGÍë96ñÂÄ @.šŽ¦ËçØ²É¿#²#¢iì9÷W÷WÀöZ¼–Ò,W€ƒ,w£SÔ¡°£˜e û ^«×ŠMÎr‡ Àd§`GåŽJ}R÷LþÿìJ½»ô®,Ø¥]Yl»ËÝ…jX&»¾®ý¥–ã5Ÿæ×ùtþÒ®¼o_÷í{¬ðb¼ß^°ÿIXÑ=Ì)IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-33.3.png 644 233 144 3242 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜWIDATHÇÍ–ýO•çǯs Â1 € Áhºêl°Ö B&NÄQ4­KÁ`+ 1¼Lídº4”ùË\Ú!™†â–ª$ jÇ, xx[: ØjÒº±•7;´à8¼Îyžû³àᜭû¼yò½^¾×÷y®ç¾î[@DDBŸæÕæÕæ Øü+¯=pWà®ÿu_ÐÀ´Ç´çáïaeÅÊ €ÐêÐjý‘~#Þ7_ÄËï[ϰKˆx uu¦‹øxû•·_ üÑ.íKƒ¥aÚ‡¬‡¬õ5õ5ÀðÃ_ØwØw€~#ÞÈ7ø|ùåƒÿ©/þ-þ-¦'°,`™¬I]“úâ±…€ÁáÍÝoîxö³”4DÚ8qb¬Qløã|ƒÏà7êõô„'‡'‹ðQš#Ía©ZHxtó…— /ºàn ’ \ 4Ñ8íùÞó=.õ¥^ª—Õ겺  zT0§ej™¸Àc÷ØR*©$h‰ïja]a!ðÑ5.§¹Ò\–*Cüwo?|èŒÍ›AýÀý9ð˜Ç ^×—ëËq« • Pê·ê„:±ô¥P*BE[I$Ñk'P ©!”Ú©¯Ó×ᦘ´ÈÿËŒ¼Œ¶|ìôƒÁÕƒ«Á] À¶_|Wó] 3žTÏ»žw½õÜéîtw:ØRl)¶ð”xJ<%>‚NsšÓ>ñr7¹›`‰ï ü0àpw-õ–z§Ÿ¡G”IDäBÕŽjà8É8ãúæí[¶Æn…ß…”‡”£öíÚ—¼/FŽ9ÉíÉíÉí222åååàªpU¸*¼‚~?‡lÿéöØí±ZZZʸ˜VšV óè›á‰w&@5/èOªˆÈ? á³ÉÏ&¡ÆÜø ñÊK\‘`M°â=<š=š Ç7Žo‡üáüáüaØiÝiÝi…±¬±¬±,ˆŽŒŽŒŽ„Û›noº½É+¬º º ºW%®J\öû¨}¢C#š#šquE<z8¤ò I5)ÐJô+¬+¬ªŽ=C%C>­pVMæOæCÒ¡¤ü¤|[¶>l=ŒÅŽÅŽÅÂ\Û\Û\l Þ¼-ÂaŽ0ضضضø´´–ZjÁÙæls¶AÒo’ ’ ¬7´*´ l™¨ž¨MMUœœªêÌ\19Lb¥!8%8Eä¡Ö´ÿ¨ŒõÌôDõD‰Üøóó7΋¬_¿6^¤4»4»4[ä‰þD¢‹4Üj¸ÕpK$êpÔá¨Ã"­‘­‘­‘²´ºƒºƒºƒDzúzúzúD7~Ûø­HÔ¢®E]ùû•VÿV ;vRDµI kV7´\-×ôˆ³³Èý×ïÝ’ðŽ_øJ¤óJgMgÈüìüìü¬HÿþþýýûE2OežÊ<%r§èNÑ"‘ɲɲÉ2™—y™±ÆXc¬1"EEE"Ë–,éZÞe鲈ØmOµ§Š¬ 9rBÂE\3®ÉRÁ*Øô°ØSþQûIí'K›?ïTàûuï×áŠooŒo„ªÚªÚªZo‡Š­ÅÖb+ÄÝ‹»w®^¼:ã¶qÛ¸ Òž¦=M{ #jD(8Ót¦éLÄý;n nªÆ*ÏVžÅeÔãoµk/× cWÉ;’´.î¥׎{ǽ|Í×@9äðÃÕK/½À9ÎqÎÇÞL3Í€ÂÛ—O ׳ƮPß©ï´mÚ6Ì„fB3 ‚œãIj2Œ§‚u©u©ÀH$ÕW«¯ZšÁ¶Ü¶á‚À*VÆàUØòî–wž|%æ(EDÖœaÐÒfió'ÀDæD&·ðÚýŸþðÁ°, Öë¢ù‰Àøì>»Ï*Gå¨[*¨æÕ<Ì•Î5Ì5€wðîGw?báþ¾ùÕó«yMKß?¾`é³KŸõ'¨®p=¢òEDš®À|sÿÐs7ý¡¬½¬’­Ék’× œ‡œï8ß™ú™ú™z¨ÕkõZ&L<;†v íz¼°Ùí³Ûg·ƒý¶}Ô> YG²ÎgG9ò³^Ìzn¸ã¹ãÑsáP÷¡nЪÃõHh¥ˆÈ_ê`Ð:h…Ö#=›z6©Ý/¤fôeô0”g”g”g@‰^¢—è°Á±Á±Áwß=|÷0d6f6f6BÏ‘ž#=G¢…MÞš¼5y VŸ]}võYhhj8Õp Æ]£ûG÷øj7;:*;*ép=q qÖÛÖÛkóEÖV¯­)ûs¡©Ðdjþ£kØ7ìsÿ_û¿íÿVd®z®z®ZĶҶҶRdYî²Üe¹"iii"éÙéÙéÙ"žO‰§D-Ï^Ï^Ï^‘„”„”„‘­»v‰T|Y9U9%æÉ”;iwÒLÍòéÆÙ³"ä$%­Í:S.§\ÖÝü|::?zíeyþýyp¸.‡ Æ+Æ+Æ+ ÍÙælsÂú±õcëÇ¢)ì,ì,섦M+šVDõîKîKîKpÅ}Å}ÅÕo°9q'ÏŸ5Ÿ53 Œ2 ¡E«ÙjÖÝqúõÐñÐq“[:—Þ[zO¤çúÀÄÀ„¤þöá ë «ÈÎâE;‹DnønønøD’—'/O^.â]â]â]"RïªwÕ»D|^Ÿ×çÉËÍËÍËépv8;œ"®RW©«TdOÿžþ=ý"-Ž–œ–ïÏ~|úǧE?qô9ú$UdþùùçEâlÊ¥\&·h¿4þ±ž]=» Ïíºèº¨vo¬) ””ÊgÊgÀqÜqÜq†­ÃÖa+ôš{ͽf((((((€©©)˜Í˜Í˜Í€ª£UG«Ž‚×ïõ{ýpºætÍéX÷Ïu7×Ý„‹öÖ‘Ö‘˜¬¦£¬£ ¸®'BMW ¶¬¶Ìh´ž Z¿ÖðâE=:ƒ"Š(Úi§=æú]à€rˆ¥k\ã ³Èb”E CA ÂÈW{ªö°¹•tFx ‹Çâñ'¨?yò4ÓL3è6ݦۀB^æeомš´C‹]‹],èa|þîÉòdX&,þîGxì1æ_ÜlÚl|f~  jƒÀ¿ôJ½’`ä«",†'CL/tt`–i¦#ž Pú[ú[y¨]Ö.Ç2ÿfófóÿeþȬ¤z[õ¶˜YÉ{«Þ‹ŽŽ. ’ äù´íÚv FÔ&L• »áoÄxþ£YÉ®çI~]<±ï±'óû_í.îýêH™IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-60-grey.png 644 233 144 6235 14774263775 16015 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü RIDATXÃ…—{TUվǿs=öSåå@ɰÇD‘ Tðfr(µàp£Ç@Ç€.ÇÈGxoCÚæ@šB¥FvCòhÀ ¸Ì{$ “Ü;Ùˆ$/IÙ@ìÍ~¬½æýƒ½èÏhôûgµçšßù™s~÷oþ&Ñét:ñ™³žëãú¸>Ú ûB÷…î º0÷~îýÜûZN=¨õÈÿOÁGð|Â^µÕØjl5ô(Nâ$N’l!AºÑn¯âU¼JÊä ò’Í sÃÜð“ÄDLÄ´¯4gA΂œM·òRóRóRɈà/ø þdã ‡ø­‹Ë™ŒD$"™ 1WÌsÅoíf»ÙnöÏ­Í­Í­­è·ØGì#×,«,«,«Âþ[}L}L} ua±a±a±${5¿š_Íážážáž€ô.µKßKý%½Y}×xÒøÄǹVðI:ΣóÄ—II#iþÇXÖŸõÿæ3óóó?O¯F¯F¯FçÞØîØîØnÆb1„Èfy¶<[ž öc?öC ,°ØŽíØà1<†Ç`±-¶-¶-ÆfC³¡ÙÐL—‚.] ÷>Œ{÷0î¥÷Uþ*•ÿ:…3Í™æLÛpŒ¦ÓtšÞ÷2ó$9h=h=hÐŒf4/žËÕp5\Mó?ìÓöiû´ß&ÍÓš§5O ‘I™I™I™\…û¯î¿ºÿ äCA¼"^¯€#1$†Äð†7¼Ø`ƒ €VX2A&Ȉ!‚Ÿ;>w|.îTWW /ß¹rçÊ+\«L)SÊ”wë…!AHx*Oá)<5ð+£lS¶)Û~!¿_øÎ¿,õ–zK½ß&M¢&Q“(lNOMOMOåZÝjÜjÜj0ßïŒwƸ‡{¸Žñe|_§q§r—Ü%w²—ì%{\ÄE\$@º‰n¢›···Ì—ô5ñšxM¼°Y_â‘øaJ˜¦6†Û/Ø/Ø/¤>á•ä•ä•DµIç’Î%ã$LÒI:I'1ý’ý’ý°o³o³o„!@H2I&Éöaöx¯ãu€~N?§ŸÖ{Ö{Ö{UQUØØy’~R}R}R=Wá•è•è•HµÄÇÐ DƒþöG”#ÊD߈¾}±îeîeîe‰÷Ä{â=Ì#Ï’gɳ@íŠÚµ+€Cü!þÎ>œ}8¸¶åÚ–k[ä#ù€ ¢ •¡•¡•¡À!ïCÞ‡¼÷Úßk¯è}£÷Þ7 Å<÷Ý?vÿ²èŽèŽèÄJ<#h­ ]›áñÀãÇ]½2ze4)Ar³„YÂ,®&^M¼š\]{uíÕµÀöï·¿ý{ ®7®7®(×”kÊ5€iÚ4mš¾ýnô»QàfËÍ–›-@Æ'Ÿd|h¼4^/ b b b°ñ6ÞÆÏËBN…œ 9EJ$‰³ÙÆlcøûòË7.߈le‹²EÙ‹¨u¢* ?åý”÷S°.d]ȺÀÏÃÏÃÏð®ò®ò®æÇÎ È‹åÅòb 3¶3¶3KKK–n]ºuéVÀ}Ì}Ì} Ð'èô €qqq°+°àT>*•,¾¾¾ÈÖéÇôcÈgp‡q˜1ç˜s̹ٙə<&ɬýÖ~k?0??tê:ÔuÈïÎïÎï ôú=pG¸#Ü~„áG€á¶á¶á6`ÑÙEgÕŸÅgñY{‘½È^,f‹ÙbÆ£!g^a^a^ð)>ŧ$ˆa}XÖ‡žŸ\3¹fr zCŽ!ÇXWJ. ä`wØv ^¢^¢^ìÚ¹kç®@ê¦ÔM©›€¦â¦â¦b 3°3°3˜S5§jNàXïXïXÿ &Á$ &j¢&oãm¼=ÛL]OÖ¬7ëÍzô2FÃhèyNQ (PE½ zô.àþÞaî0w˜Iv8ÂLËwËwËwCåããhJ5¥šR`níÜÚ¹µ€,P( Ôiê4u ´ ­B+0ÿ¹ùÏÍêêêÿ ÔÖgë³õì;Äj‹Ú¢¶Ì6O?2~dü*ã qÐ8ˆw½Š^E¯PÄ IHÊ9Éé8§#Ù—â.Å]ŠsjÆ6mÛ •”>–%-KZ–´|ÝòuË×À­à[Á·‚æ#ÍGšÎËÎËÎË€_Ÿ_Ÿ_ Ök‡â~ˆû!   êÞª{«î-€ßÆoã·Z³Ö¬5Ã&ú‹þ¢?Tu¨CÄHb$FbÄ'ÄIœÄù™ŒYxyáå…—EË¢eÑg†? ÎÞ©žªžªžrfIé#Z-‹–Áöø‡øø‡@¹O¹O¹p£ðFáBà…²Ê^(<=====ˆS§"Ná²pY¸ ()+)+)¬z°êÁ* ånÊÝ”» ²Y„,òêÒêÒêRÑ255Å´Ê>} ûàfŠ£ßÑïèßë >øóÁŸ\Çu\_tœ¿Ïßç﫜jœjœjôKß`Ø`Ø` 1oo¼½ñ6¹L#i$µŸ·Ÿ·ŸáLœ‰3l(ʆx ¯á5‹°‹d €õ„õ„õÀ®eײkþyþyþyX:¢:¢:¢°õÌg~<ó#¾Vö({”=Ö8ÊR–²a[± ˰¬ó¯ s’9ÉœdÛ˜B¦)Ü%öˆ=bOš]Õ¤jR5͉͉͉t…a·a·a7Î’VÒJZ1-Û/Û/Û°+Ù•ìJ€ê©žê£ÅÔPC P35S3 Ð+ô ý,àä¤uÒ:i…ª®¦®¦®FÐð|'ß I2I&ˆ$‚DˆÎ¿¢E(â»Ê<çꙺ‘û9FŽ‘c—3™h&š‰Þ[ƒt¤#9QË×òµ¼°cüÝñwÇß…Š”“rRŽIZI+i%@ž O'PPPYÈB@n’›ä&@Ãh ƒM²Rý;õïÔ¿ãÌ2éL:“Ž;.×È5rÍÙ¼À£G¾ÿÍÌCþô GØ Õ£jô£ýÂ-ìÁì!5Ë«—W/¯.ú³"C‘¡È8›gò2y™¼¸ñÊ9•s*çüæ]Œb£°Á ÿ¯j’òͺ…n%¹$—äBÞbl1¶iÌõÆë×Ù"µ·Ú[í=`µWØ+ìo¹•s+çV@ÔHpsÉœ–@¥qNœ#ÎçÀ­}¨}¨}°ï±ï±ïyóˆÚCí¡öè;×]Û]Û]Ë5$7$7$Ó’I2I&äb¹X.–ƒB %” t ˆ€é_Œ¿1âlchchc(ÜÔ#êõ ®׈kÞ<2c½«ËŠÇ]ÓÜ(Dš¹ëJ"—Ò+ï¡htf‘HI"cþ,} r \uy÷Ÿÿæ]“ɇÿJ÷•î+3 D Ü žOƒ'ÊšÛšÛšÛÈ˪.U—ª 5¢FÔìü–{‘{‘{qú?´«µ«µ«™1×xÏI'Ô£\,~'¢¢¢¢¢¢ ¸^ TFeTF^   Æ)çRçRçÒk‚\+×ʵ[NŒnÝ0ºÁ³z¼s¼s¼“¾×~ºýtûiç“SŽ)Ç”ƒÝïç×óëÿk1-¥¥´ô˺™« {cØø˜´®…å!øƒøïæ¢ hpæÐZCk¢z˜*¦Š©ú_­5Þoƒù¾„/a:Ùt6M¿t% * * êOQÆc±‡üè-z‹Þô3—n­ Ðò{ þ ñ®+]8s‰Ldr7H*I%©ÿ   ´6ìÛ®ôUú*}™N¶Ÿígû}Å|1_Ìß1Ô•Ò•Ò•ÌBëÒ“ Ëé?âø?é»åû¼ÄÓIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-5.0.png 644 233 144 2647 14774263775 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü\IDATHÇÍ–[hTGÇ¿Ýwã%’®d‰ÔÆ l…4b,¬×bª!(ØÖ^(E)4¨•ÈC¢XA%1QlZ/˜KiQ#Ý—ZÙªtM¥Ú¤©IÔÜ]Ï9s~}ØÝUkŸ—Ãwûÿÿsf曑i±¯€Óçô9§Dmç‡ ¿»È]4çÛ¨}ØÇ;Žw~ý ¦ÖO­HoJoR·¶Žëüäz‘~2ŸöË4I8\g\gËcv T,¬Xè~-j} <­žÖLø¨í£6€–ã-Çù ú®ö]x´üÑrHØ:®óu½ÆKÆ—šçøE õûÔï€k¢k¢ä¬ÎY={k4¡{6”–”–ô¤ô¤ØN°€4ÒìåÀ(£è1˜dëx,_×k<¯ù4T@F # e•e•žFl‘[ß@UVUðÀhµ ª¨"ÍþËxh<{À ˜"üdï³÷àÆ `‡ìpÔ1GˆØ×n£hc';I‹ 5Z±bøh¾L<»¶ûWAù¤òIú]õ›ú-îµí³ÍlÃàcËgù’ðò”ò-pÿª¤¥yýxú<}£xî÷Çß¶Mkƒµñ‘•#ÛF¶ÁýîwÞï„íÛ¶ƒå²\–‹ÆÓì§ÙO³áA΃Ì™`/´+íJuVeœ¿£øØa3lBœ?¦'&ìðeød÷'»ÁŽ(¿&÷÷bçÜɹ•s T/¨^P ‹ü‹ü‹üpãÔS7N%)j ØÒ·¥oKxNzNzN¦ ›Îm:—øƒüh¶˜-ÀAÍå×zbÂ~þ¾þnì/ìb‘{¿ß Ý Á¬úYõ³ê¡¶¡¶¡¶ÂÁp0òÉ'?¡«ã@ÇŽ—›—›— ýýý0wÏÜ=s÷@'ããñôˆÑ|Q~­Ç)2å┋oˆVVŠpDDÄÑ[iW÷Ñîæîf‘ cÆ&Œ‰œ¯8_q¾B¤$T* ‰Üî¹Ýs»Gâãî²»Ëî.ñú½~¯_Äô½Aßtßtßt‘;“ïxïxãé.Y­ù¢üZS$¥4¥”<‘ÔöÔvÇy +}úz}½"eee"—Ó/§_NÉÚ•µ+k—H[q[q[qB˜Óëô:½"fž™gæ%üF†‘adˆ¸ßuWº+~™ªù¢üZSDu¨ÇMs­¹VÄ~KDD2tÝÍ_n^»yMdsææÌÍ™"MkšÖ4­\?¸~p½ÈœysæÍ™'Ò¼®y]ó:‘Åu‹ë׉ô,éYÒ³D¤&·&·&W¤¿«¿«¿K$p(p0p0i"!Íåëy~q,¶æ½VUGDo†½í{Û÷¶CAjAjA*œž|zòéÉ0T=T=T ¥+JW”®€¡ü¡ü¡|h™Ù2³e&,í]Ú»´:Ç:Ç:Ç’É4³Ãì B÷ï±Net(?˜£æ(pA±Q<æqð.p(¢ˆ¢$!…'8Á‰$ÿê©RL16X3¬À“ÿ=•I}Ì? ?Iô1ZÔ$5‰q먴‚`}n}j} ªL•©2`;ØÊ£<ÊãÇ@ªBUÖ›–ßòƒ:©B*(µQmd<ޝÂFØxi{¦ó»ËÝI«Ëêlõžz#:CìXÏ f˜á$[ÇŸê|õ¾z¬+Ö•d|Í÷Bçß]UÙUÙq€V –ZÒâKŒµÑÚHìKö%8 aë¸Î×õOã¿ô®|e_¯ì{ìÕ|Áþ %º§I±²IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-13.1.png 644 233 144 3010 14774263776 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–íoÔUÇÏ€,3D¬!’!¦µé«Õ8˜êF¬aiñ…ƒÅ”@± Ti‚¦MÍ– ÝÍVyœ5€ ™Ö™éŒm÷ã‹™;¿Yvÿî›_ιç~Ï÷wνß{DD¤4÷p?î~Ü]’µÝ-Ž?ðRà¥%_fíc¸^q½òã_à‘îGºÊ"eûšcëy_¸^ÄÁ/̧ýR*ŽÃÚÚÕ”³ÃðêS¯>x4k‚`o°7mÂî¯w pöó³ŸóLþ0ù@¼)ÞŽ­çu¼^¯ñ ñ%|_~ð÷wM€¿È_$‹_XüBUk6 ZÍš7ÜñÜñ(7X1 ˜bÕ¤H¡ÇT­çsñz½ÆÓø:ŸÎŸå#PÑXÑ(›·mÞü CDäÚIxû±·Œ^Ž&L1X^Ë üÕ¼gÞcNýÃ>d"ê¸: ÆÕ8`ZÛ¬mÌašq3À§|J1+rx_íÙ?¢ ^;IÏf÷fwð3ÍGþ»·?¡™Ð ¨VcDÓN;€º­ncàQi•F©ÕFµ1_)Ôµ@-ž£‰&îJu˜7Ìê–5aMh·1B:d‡lMðãç Z)"òÇ¿A0L¥¼\¾ùÉÍOò€/§3å3ådŒˆ1"N&c«±ÕØ ±µ±µ±µ`všfg•QFFbÈq§©©dŒ[Y|ˆ£A`,x!x!åÕ|„‹ˆ†½ïî}Ô3vM¼+ö^ì=XñÖŠ®]¨‹O\¬¼X J)¥¬^·zÝêuPÖ]Ö]Ö ¡#¡#¡#0tþèüQ‡ˆÝiwÚïŠÿVv­ìYÙƒºðfßë}¯ç£jìg[.µ\Ò•;6,ê†ˆÈØ~è‰öD!ý/µ«á­ºòºræt]Ç–Ž-[ çjÏÕž«…ú©ú©ú)ˆgâ™x*V.¬\CCC±T(J… ¡£¡£¡ÃÙ8ƒÍ‰s¹Nï²Ì“S'§4±±ýBª¤¿¤_æúäC“z#wŽ??C¯Î[ç…Þ–Þ–Þ'aâ`â`â ¬i]Óº¦Êå‰òÄVÅVÅV9qV·ÕmuƒUoÕ[õP÷p]q]1œ{ôlôl´ .y§úN5@É÷%ß«Ónyسóƒ'åªïC߇"rDDD¦=“¾Å¾Å"ž'Éâĉ‹x.{.{.‹x[½mÞ6iríví·MKÀ7èñ4{šyÒ-Ø}vŸëªÆzc½ˆë""R¡W̾<»~v½HQ{Q{Q»È•Æ+WE¶oÞ>,2\5\5\%’ìJv%»DÜÕîjwµH¤&R©IV$+’Ñùóóýóý"Ömó;ó»¼»B~2—˜KDDì~»ßuUtOùû©oO} ü)Ûó\…ç:Ê:ü~õŒzF=NéÃÓáéð4,,,À‰è‰è‰hVÿãM°)¹)¹) “3“3“3κ+ffl #¿Žüêì1{ö‹{_Ü+ÜcäOå;{ßqN ˜)ÓQtÌ1 0À P¨y¸Îu®‡9Ìá¿……•ýIM#‹Wˆo×8ùs§2¯c*øKð—”û¦qÓptÌþ³1h ’ÁO-µÀ?³údµYmVXa+l…Á^f/³—;ÙÉN°KíR»øˆ÷y¿@>rx*¡uìÖÓ·žÒÁh0Z¨cÿ£ü[ü[ü…Êl}c}ökökù?V¹ Ìò¿j|®BÿaŠ)ÀÖ²wÙ»0H[—¬KE2F`K`Kàÿ*ÿ}w¥¾»ô]™%Ø tÒI±Ók‡µƒ9PC*«ì.\àØz>ß²Üz§ñu>?W>°¯‹ö=ö`¾`‰ ý­BeIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-XXX-grey.png 644 233 144 6044 14774263775 16255 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÙIDATXÃ…—LTÇÚÇ¿3çìvùáB‹bŒ²@*x‹¯& (-öVI+©Õ5 ^JÚô¢´¶«Ðð¶µ\áêM Æ«´@-*PĽE+t½ÈF\%²HIQD`aYØ=;óþÁ¼é›¦óÏÉœóÌóýÌ<Ï<3‡F£Ñˆ˜kãsº^ìûÄ>n2V+Œ|QþãüÇù7®à:®ãº/÷JAR´zÏlýlýl=ÿå(G9ÉC8 Ýè°{°‡¡Ú¢Ú¢ÚBòÄGâ#ñÑír2FÆÈØ¡²# ,<²ðJgAZAZA–‚¥`)˜$Ïq°ë®t0qˆ£•,Ÿå³|vÝiwÚöÀ˜ü†ü†ü†Ê~ç°sØ9ÜôŸéW¦_™~eõ_µ'´'´'иzÃê «7¼XE¬"VÄøÇøÇør_þ.ÛËãeóþ=z²¾Ì#ó‰ž\Ç}¹/÷e;H:I'éÁ'„`!Xþù”ý;ûwöï–ù444¹÷oèÞн¡›º";";";ȪøPlÔ^Ô^Ô^¬h'Ä qbçj*MISÒTrŒ³ÎYç¬K[°5`kÀV®ßZµµjk•(çˆûpî_A#h` 4š %J.”ηo;ß0„! ØÝØ ŒìÙ=²¨ ¤‚–lK¶%eÿ²ž¬/óÈ|”‡óp~ô-—Áep€øöøöøvlXpfÁ™g dm¬µÁŸá3|†ù¶´piáÒBàjïÕÞ«½@KfKfK&€eX†eVaV5bX#_ |5ðl ¶[žûq¸GÜ#ð•õd}™G棒^ÒKú?íÓ=Õ=Õ=ÅQ†(C””zü(i+m¥­11¼ž×óz`…q…q…x3éͤ7“€F¿F¿F?`äÖÈ­‘[À¨Q7¢€¾ƒ}ûïØß±¿cünúÝô» ð*^Å«¡B¨*湕²¾Ì#ó!w"w"w‚}Q¹¶rmåZ.7;{Ÿ½ÏÞçœOñ)>Å9—¸Ä%Îùq~œŸ·ãÎIç¤s’ó’Å%‹Ks^ÄŠXã<ߘoÌ7rþ#û‘ýÈžÛ³RVÊJ9ç3|†ÏpÎÇù8ç|^Ï£/óÈ|…(D! §çè9zn~f*Ô¡u´ÐB €‚‚ÈArÁ#x ðVx+¼M¶M¶M6`(o(o(ÐÝÖÝÖÝ66olÞØü<ÔäyDý—?5ÔP¸ƒ;¸ó\Ÿ¾GߣïøßàN… !Hâ?ØÖØÖØÖ W: @ ?‘ŸÈOàóÀS˜Â€qŒc˜;‰žÜ=v÷ØÝc€¦SÓ©éž–>-}Z üªøUñ«â¹¿Çïñ{P@`#Hé!=à3ÁÞno··£—†Ð êcêcêcRqïÂÞ…½ ùwËî–Ý-›/7–ÈY"øÀàñ<žÇd-YKÖ–K¥0G›£ÍÑ@JBJBJ _®_®_T»«ÝÕn`úÐô¡éC©!5¤@2’‘ ð=|ß3ìx¸ùáæ‡›ë uÐ:ˆ¯Ô½ê^u¯T,b+¶bë‘r1ALþ÷ã+û¯ì¿²ß-<\`Y`Y`'ódž _r‡Ü!w€ÉöÉöÉv voíÞÚ½@´"Z­boÄÞˆ½„ø„ø„øE©E©E©@]G]G]°Û±?ÍOóÓyBž'˜•vH;¤Ð\²^²^²²8"‰H´mnŸ§‹®-º¶èÚ燕ñÊxeüw£1£1£1ÂÃóÎ8Àã …/tÐA‡Y9„ÕçªÏUŸœëë딣)GSŽ>±ÿ^ÿ½þ{”Á”Á”Aà—3¿œùå к®u]ë:€‘ ŽhD#ªúOë?­ÿ”MTTTÓ6e‰²DYro›«ßÕïêß.\\Í®fWó¡ZíFíFíÆ_Oußý}÷÷B±I4‰&‘'*REª š™™‰‰‰‰‰2Í™æL3ðzÀë¯@žÇÖÄÖÄÖYº,]–ðýEqþ³ãnÄ݈»øs›¾Mߦ§¯ ¯ ¯ ™$ÇâXܶ BP#Ô8EZNËi¹p MhBÓ`ìœAú׳Ƭ1ÿ óAóAóA±dç’Kv’êȳ‘g#Ïb˪áU놡!¥¤””HCÒŒb£Æ0†1@(Ê…r j2j2jÀMÜÄMØ&5“šI |ÇÇǤåcåcåcd†Ì™Ãl.‡ïÿ…ób^,. ƒÁ`àß ‰HÒOè'ô“‡¹4‰&Ñ$Ûjw®;×›œÓ¯ÿ^ÿ=i}¤-Òi£Ÿz¥{¥{¥ÃÆZX kЉ‘Ìb³¼á oÏð Ïæ`æÀ,I%©$ÚÚ©Ú©Ú)wNßå¾Ë}—Å¿kvjvjvV„ÚBm¡¶¿žÝ5ºktùVXae’|Õ¢ýè—:‘ld“úW\\q±8E½O½O½¯º`lÑØ¢±EâøùgçŸöÁ'ø0·{ᱎXG¬¨nZÙ´²i%ü´ÃÚaí0ÀÖ°5lMî紈ѢO*žôL3Y>ˆÿ›å¬å¬å¬{Ý”kÊ5å²ëëë,áe¼Œ—U5BTÂùªÀËð,”ô[‚?h¿“»ù0Á“ûÈÜýÔÐC/Ð ôB³~fóÌæ™Íl¹¢TQª(¥÷… !CȸúKè…Ð ¡6¬=Ökù d,ŸòømðNÿÅ´ßä®§\¸ YÈo“4’FÒZB¹‰›¸éÐ.¯—¼^òz‰Þú…~¡ð%ö%û’}™9Ôµ­k[×6`z?ùbéø#ŽÿïÆ3oÆÉÛIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-17.2.png 644 233 144 3113 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýOTWÇŸ¡œò²4v‰HºjšhJƒmHK‹i³-Ô‚Öj[pé6ÆX%F"ífM—ĉ’E Á”ÖZÑe©](}Ѧ „—V«C6&k`j1 …È/ØîÜ{>ûÃÌåÎÚþž_n¾Ïóœïó=÷<ç9G@DD’Â_¨ô¨ô¨Å!õ'Û¾è¹EÏeá&/;^¾úHlLlH>‘|´±å·â#ç‹Øü‘ù,»$‰mˆ={ÖQÆ5ðʪWV-z0„ÿÖ Î6gÛ\Þj« õdëIvÂÄ…‰ 33`cËoÅ[ó-¾H~©¹+¿ÜÿÕý_9F!6&6F2Ög¬ÏÜ É„âŠ_»oì>ÆO¼*44¬áÀ–?oÍ·ø,~+Ÿ•?¤G õéÔ§E`ë^u~Œ."2ØUK«–èmœ£‰&â9|?ø>¨`N0‡€ÒÌ/Í/A ™CæP­òT€±ÛØM‚SÁ)à(ññª;ÌçÚ[··Î8ØÂ‡/;4ëüR S í= ë ¡t¶tÔ.ý;5Ì»¼  >SŸ¡3Ë8ã(ì¡þùù™Ÿ#pºÒ•ŽR™©f*:`b‚ªóÿ·Ä_â·ÖFl¥ˆÈÊpjNM‹æòµúkõ ´˜û‡ö½ö=wŒÕÆjc5è›õÍúf˜ª™ª™ªo£·ÑÛ3ã3ã3ãà¯õ×úkùÅзè.ÝSNœ<È}ˆFyp;[œ-Z´¥'Jþ-"R¹V¤¬®¬.!Èîå{–ïQk}õÞoœ{öïë­?&ÎKc—~¸ôƒˆ§ÒSé©ɚΚΚÉ¿™3ÿ¦È’®%]KºDŽ/8^ Ã7î÷‹”l(I/Iù}ñÊ„• â|öÁ'\O¸äÜô‘ÌÊÌJµV +ÎWœO*OXù×^ød䓘» *òöä¦ä¦°þ«»ÙÝìn¶ÿÀí£·Þ> }›ú6õm‚Œ¬Œ¬Œ,õúF}v\³Ñl4°"mEÚŠ4Û¾n×ã‰'¨¯?ùÆÉ7Tt¤t¤@0&¤Gбø u–ÿL<0ñ¨ásô[ý†~r“›’›mZ›Ö¦ýr‹ÊÊÊàÈ#ްíf—ÙevÁäØäØäŒùÇüc~èøkÇ{ïÁòœGôGtè9uñÓ‹Ÿh™Z&˜yq¸€:+œœ`ðOoƒ·”¹pìC+Û·nߺ}ÐZÔZÔZd'öô{ú=ýµ#kGÖð¹|.Ÿ+âDlSÛÔ6W;«ÕNÈve»²]p!õ[¾µÝ^µuê©©§€ÙdG²ÃˆÌÏÍÏ¢ëKõ¥ò¨c™ˆˆ¤Êxhçÿ<ÿÎü;"úú1ý˜];§»OwŸîY“¿&M¾HÒ–¤-I[D¦ÝÓîi·H{C{C{ƒHŒ'Æã©Í¯Í¯Í9üÁá¦ÃM"£'nÌݘIY•Ö•Ö%©+¯&žJ<%ÂN£Ô(u D‰C{F{æÊeù]ï½?ŠÈZÞ çŸ/¬*|»ðm‘eU˪–UÙÂâ®Ç]».RžSžSžcÛƒ[ƒ[ƒ[Ezõê9$b¸ ·á)ê,ê,êq_pwº;EêþXûdí“2?ú¡·Ì[Æ›"ºøˆšœ¼r9Ü.šú`ûþíû*d µ ]S w!3¢Èú駘`‚‰»º[d³‡ Œ¯¯#óm~ûóV?kê³û˜rþäüI‹Æ¼¦_Óí>fVè=zwÔ8‰$F÷óŒyT¹*Wåië©§Ì<3ÏÌUª^T/‚ÑbŒ#`\Ÿ™ŸáŽq0įº‡³‡³œÃÎa-šÖž_éüc7Æ.´Åï˜ ¯L7_7_Ç’¬Ð˜fàÇ!ÌÄÀns‹[@ ?m›ÅèÌßß·Âüó¿Úùïº+­»Ëº+CÛ.âí-6^3^#ªWõàÀ6¶ü %žoñYüV>+HϽüº¸gßc÷æ öuž‰Ú IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-25-grey.png 644 233 144 6347 14774263775 16022 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü œIDATXÃ…—mPTGºÇÿ}Ιw* ’!0@”ã & °(²Ñ#!r‰Œa½V ¥wS5HY‰_‚/Y¸IŒdQ#C(bP@Œ°^·$"^ÜAf€Â08‚Â0Ê03œ9½˜!U©J¥¿tõé>Ïóë§ÿÝý4)*****ÂLËtŬäú¹~®Ÿ6}SôMÑ7ô¹âGÅŠý)’úPêsð>€àâ¶:êuŽ:ú)*P Rˆp„#À}ÜÇ}[±[é§’µ’µ’µ¤{È=äÞ® cdŒŒíÖîþ¹Mÿ.É)É)É!f^É+y%IŸæÚÜ\s˜ÀeX†eÌ·B±P, mÎ ç„sÂ?¾¸¾¸¾¸þÛ§Ùivšÿe[l[l[÷7E™¢LQ†Kq©q©q©¤0A” Jñ¾ñ¾ñ¾€§íé÷Œ÷üï±7cßíÏãßÃãáãÜL¤^Ô‹z Ù$ä‘…s‡¹ÃÜЋ^ô´¶Ñ6€Ä“x ш @€€@šÐ€ V$#Éðªl©l©lá3zò{ò{ò¹K B§Ð}ÓÁsãÜøÅ1ü3þÿ,=Þù½ó{ç÷9±~¯ù½æ÷ ÝP»¡vC-çшaC¼pçp°÷Ùûì}¯åµ¼ ¹$—äþ (DBà;ä9àœ‚Sœ‰ÎDg"àøÜñ¹ãsxyìohßо¡ûÖ/Ý/Ý/†zx<| §á4ü£õSŠ)Å”P¬þXý1Rç\žsyÎeˆÝ†äOsŸæ>ÍΧœO9Ÿ Ö Ö ÖÌrf9³xeÝ+ë^Y¨kÕµêZ`:2ÀÙkg¯½°kØ5ì€?ÉŸäOD'Ñ;ïX¼c1¼|îøÜñ¹[ÒŽ¤I;Z“T“T“ˆE¢ÀÖ3|(ʇ¾”ïóØç±Ïc|ºpÅ WrìÆnìžÅeýeýe=0Ò<Ò<Ò h–k–k–jµÚ¨»Xw±î"`Ò™t&à2ºŒ.#0»uvëìVàí¾·ûÞîòÒóÒóÒó6ÎÛ8P¤*R©/ÇÜŠ¹s‹”{x<|œcÔ1êÅÿF¦G¦G¦£PvCvCv6ÊP†2“ƒä 9XZZK£–F-‚„ !Hüoûßö¿ \ɺ’u% FÌ#æ3 Ý"Ý"ÝŒ¬Y5² fI³¤Y@d|d|d<Àæs‡:ŸÎ§óÁÉL2“Ì[ðŠàÁ+PØ1Ú1Ú1Šƒ àpæ?œ?œ? (D ‘BTÞ¬¼Yyп Aÿ°¾x}ñúbЀ¯¾ ø ’š°š°š0Á6d2 ˜›âcâcâcÿ¿ij`j`j`×Ù÷`߃}ÜÂ-Üš\ôHôHô¨Möìȳ#ÏŽ<¯IíOíOí§É«ùÕüjž´<}ðôÁÓ ¢IѤhãÇ8€<ä!å‹òEùûûû€Ld"p¤9Òi»ÝÇî8 gá,°ÝM¸›p7« U†*~d™ÁžFYÊR6n#"ý_9¦‚©`*Øv4¢¦!UHRóNÉîÉîÉî]Åõ{×ï]¿G£>|@ª£D-ˆZ€µ´’VÒJȉ†hˆÀÏø?@ @]ÔE]¹B®+€D$ID,°À«µÝÚnm‡×¥ªKU—ªø‘¯ÈWäËa:ýÛ+ ÈÐÿ•¥GéQ.Ðæ¹¦óFî#r’œ$'[¶³Ùl6›½«núŽfNÔÔÔðÛ,Á–`Kð  •î¤;éN[°[´ -a KXÇqǪ¢*ªšÑ¢×µ?ÖþXëÚ9vjìÔØ)î¸$H$ ª.QRR:rû±ûÉ9`€Oa“’’’’’ ˜^BÁ‡D‘(E>‰:u:êôÿeZ²,Y–¬Æ +¬ˆùq8m8m8͵3nIÜ’¸%L&úЇ>8Èf²™l‡Ä €"ˆú}‰¾J~"?‘ŸÀÝ0Þ0Þ0ÒäæÃ͇›3ÿ˜;;vvì }jÛÔ¶©m›þ2’=’=’måIi"Md«{bï{g›»>/Ìf ³àÝ9Ô9Ô98 œ΂÷?Qø(|>ýçï×߯¿_Ïmx½áõ†×i2ÙN¶“íg…³ÂYPÈ ƒ  ãtœŽ„'<á19b1ŽQÝÓÓo…YaV˜a‰°DXòþ'L)SÊ”ÚÝR<>CÓ=ñ`î'‰ÄÝt/{tZ»®dYF–%gN?9®ÖNG@x÷MáMáMY]]]еB·Ð-tCÎD0L|!_ÈBr*ìTØ©0—ʼԼԼ”í‘ÆHc¤1G—Ooš]7…r¡\(çŽcàwx$RRRRRR«'¢p˜Ñ[»;ÝÚ=NÊH)kùžQ3jF½«h aNÔOÕOÕOñÛ,Z‹Ö¢…œa†a0î‰DÓdÓdÓ¤`,,,g{¤{¥{¥{ÿ}Éar˜¦½GzVõ¬êY¸=—¶Üèá›ý °g€ÜmàŸ(@ Hm¤.R©;š)Í—æKó«KÆÆÆ8ËwEß}WäÚ TPÁ»Ë·Ë·Ë_·¶·¶·¶“ly·¼[Þ !Bˆòn—ÅeqY“+BBB˜Q·¿?{n¨ßr±øâÞd¼»ÙEÅTLÅä¿Í/š_4¿ˆ¯\ \ \ þÅKB%¡’Ð×N § § §øê,z‹Þ¢§‡;Ïtžé<ãJ|6õlêÙ[ Z)Z)Zù?TKµTûKÓÇÛ‡QŒbT˜çYw øßòüAùí£ hpí§u´ŽÖ%˜¦†©¹jÕþªýUáEQ¹¨\TÎèY «a5Í×ÃjÂjÂjþ”d4 F¹,ø þ‚?­tÛ­wÚ~ƒÁ”ßh×Û­ÝýØŽíØÎÝ&9$‡äüFhmØ+ –Ë‚=;À°¦`á pP8¸m¨{S÷¦îMÀ4 BÝö<‰åäqüUÑÌŒ>4!IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-12-grey.png 644 233 144 6022 14774263775 16004 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÇIDATXÃ…—}T”ÕöÇ¿çÌ3ï¸`xÓ˜BHh ?°&4ãöIé.©d¹–x•è¶ð¥’ÒàB+"¯…©Ù€^LË« Wœ‚ô f]CQ›†#^‚f`æ™s~0ƒ-]­ö?g=gÎÞûóìó}ö9C  Á´N4Q¸!Ünðº‚O >-ø”k‹‹‹—Eqoîͽßú› ˆ±¦j§j§jy)*Q‰J’D @:Ð`6`/•¯”¯”¯$ù¯¯¯—+É-r‹ÜÚ^Qè_è_èßøSqVqVqCÅP1”¤Ns°ó.. L@èg¬ˆ±"vÞ>aŸ°OøÅŠ E†Ïºíöû@í ­ ­ c_TïUïUïÅ—±Kc—Æ.%ù‹¤‹¤‹¤@œOœOœà~vÿî^ïöwÇ›‰ïÊçÎïæqó ® >Ì=¹'÷dÏõd=YºW* •„ž©š8¾ ¾ ¾ έK;–v,í Žhc´1ÚHžçËóåù°â¼‚W ‚VX¬Ã:¬ˆ@Â:<<Œ'ŒÍÆfc3w|ñuÄ×lëÈc#<öô;ªPU¨*t‰Â¹Þ¹Þ¹>e/ÏæÙ<ûÆ3ôa²srçäÎIÍhFsð,¡V¨j›ÿe·ÙmvÛ}Ñ%é’tIbBFnFnF®ð™æ¶æ¶æ6t\ä"!ò ü¿d’L’ €‚‚```Æ0†1€ØˆØ ºæ…ÑY£³Fg¡«æ@Íšâ3]M]M]MÂw2¥L)Sþ|Z\)®W>²à<Ò{›*[”-Ê@ª•j¥Ú’sÖÓÖÓÖÓ÷ýE—¡ËÐeˆOdgegeg ßi|4>ÌfÕ¬šUø?à4‰&Ñ$€˜ˆ‰˜ÒKzI/@´DK´¾Å·øv\Àt‰àõ…×^_`¶;¾n•n•n•ø„;¿›ÇÍGE‹h-©qö“ö“ö“Yúføføfð°Œ3>ÎøXpkdœ¥°–Ozšž¦§g’3É™زlY¶,ð€€S8…S.ã2.ügþ3ÿ˜ì™ì™ìıD,H )!%ðtÇwçsçwó¸ù(à<â«ÉŽdG2 oÕ·ê[±TsDsDs2vžgçá9S¡*T¡ 8—x.ñ\"pìùcÏ{w, iHÆ+Æ+Æ+€_øð…_JûKûKû’y%óJæM}M}M}3^žš£š£š£é«õÕúj,uó¸ù¨&†‰aÿ³Ñ{Ø{Ø{¥$?ü@2)wÑDšHÁ?ü¨ÒVi«´@}L}L} @ƒh Â=Vo©·Ô[€¡ú¡ú¡z {Iö’ì%€ÞOï§÷j µ†ZÐÙÖÙÖÙ6ã&›oœoœo$ån7º9usê&>œ»k»¯|UùªòUXÙ*¶Š­‚àŽÀ5\Ã5€ÿÿ-þ[¿¿¿€Íf³Ùì{AÇÃÇÃÇÃøùñóãç!,„…0 ^¯ŽWªtUº*zrèÉ¡'gܵB­P+`uó¸ù(ÞÀxƒDУô(=:ã 'ÉErñNbímímím`ÅöÛWlüÒýÒýÒuP½³Ž¿Ïßçïk3×f®Íô½Ao¦ÛÐäÓäÓäÈVÈVÈV¡C/†^¼ç=åôYú,}Àø* Hø±ñÅã‹Ç㺸MÜ&nƒ„œ"§È)p\Á\ø:¾Ž¯û]¨Øˆ 'á$üw ±<–Çr‹Ü"·ÝÝÝÀÛûßÞÿö~à›“ßœüæ$°:huÐê À+À+À àø¾ÜF2Ñ:Ñ:ÑŠëTGuTÇQÅ.Å.Å.±ìºÿuÿëþüصŠk×*Ä"±°±pÎÂROêIý B %Àr,Çò;ó4žÆÓxÀd 2999Àƒ}ö=ؼõZÔkQ@ÔsQÏE=°6ÂFRI*I%l]i]i]i€¹ÏÜgîÃ?×××Å2Š d £°R( „’ßèÓèÓèãÔ.]0º*ª¦jªÆ8çœs~ˆi˜†iÖÏúYÿ½=“z&õL*r%äJÈ ¡`2™L&ЪmÕ¶j±}cûÆöaЧótž•a¡a¡a!K fb&füq'qVɨö¬ö¬öì›;dz™^¦?Ü;77'éªÙV³­f›s‹»}ðr^ÎË15#¢yŽ<•ÊJe¥w­&«ÉjÃŽaÇ00üãðÃ?Ÿìÿdÿ'ûÏ7}¾éóMÀá‡?tø!ðž='zN@^· nAÝfíy¹çåž—éw²=²=²=?¬qt;ºÝ[dç/;Ùù €ïñ=¾Ú'”JÏ+-‹Áb¸/;E™¢LQòGS«S«S«ÉYþ8œ?î°8, Ÿä“|_’_’_P„"¶µ¶µ¶µãc|  Ôƒz,å±<@õ®ê]Õ»°^ûêÚW×¾Â_­9´æÐ|¡â*®â“q —pIì_‰HD¶mh%­¤•’4  }‹XK` 먚Uͪæ3hÎiÎiÎáóƒ_ ~1øEr$º>º>º+¥qÒ8iTä¹D.!BPˆBJ(¡ü½–` –Ì©ã–Y–Y–Y𬠬 ¬ u²9²9²9ˆžè‰~›þFÚ6ñ2^ÆË„`Wcq.š¾7 ÿ {É^²÷l.ÕS=Õo­E6²‘M÷¸¸˜3ºgtÏèžÀq~ä °À \÷PQˆBÀ—ñe|ÙŒt< †FC£sˈLjLj‡°O¾I¾I¾éHqdQdQdÑ;g¦_˜ü èD§˜âî€jt£ÝâOÈCòHmÔ‰¨Q'ÊÒßò½å{ËW­‘×Èkäw´ë›‚FH ˜¾HÜÄMÜN^'¯“×!¿`¾`¾`æ¶lnÙܲYR¦^­^­^Ý;iÏþžý½—Þ4n6n6n¸™›¹^®<Ý V×x”y0毫ýWû¯öö<{ž=ï¥7ÕÞjoµ÷£†C‡ARV÷TÝSuOñGI.É%¹³Cì;îÞs·6‰HD"Â6d2™q¤!¦!¦!^êõ€z`‹Ùb¶ø¥7énº›îîtIqŸ«+§Î@n ¹þ’È]®-’”Mk×¹…$’ðhút¥ÎüÛ‘ãÈqä°¿?ÍžfO3š½;zwôn¬dí¬µCE#i$Ä”˜/æ‹ù?~ Ü9o ~ ~ ^bRÄ(b1eK¦?š­ß±rVÎÊ…}®}Á½cÅÅÅÅÅÅŸ9ü\3riw‹K»û\Ú=yv‡Á!æŒVŒVŒV@E)¥”bÌ]‰F[£­ÑƬ½å½å½å“b‡b‡bÇO_NõMõMõíxÇ´Ü´Ü´pê\~*7àÌArw£¾kÊà—vÿ}vnÜ F« ª ª œ[0ó0^F£ÑŸ4·4·4·gTíªvU;ÀtLÇt?/d ™B¦í¡°Ea‹ÂÑ›®|ÿëmwsI𖜜œœœ Ñõhä2.ã2òÜÀý÷Üsœsœsþ+ÊÃäaò°ÕûKù-å·Ÿ£m£m£müí«¯¼zÐù°ÅaqX’_Þç<Ÿó9çó‘ßWÀ¸Ù¸ÙæÅÆßúåÁ{‚÷lkñâz { {¿;áuáu‘M‘Mê¨ëzÝ~­¿ˆŸm<].âµµÒ|¸ öÅí‹ þ™Ÿs»¹ýß8Ôy¨ ­¹­™#0óõÌ×ö4{ø±®×íuo-¿”ý_|0õšz SôTÐS"°%}Kú Ǽ“/À;o¿ó6À?hFPæ€PBµ4À}ͯÁºÞg¯ûë|:¿OïÍG ê¨7Dø8k!kÁ|Éë0ú 5% %  ]p·ÓIm„Òã©õÔ‚v×óªçUœšCíQ{@SÇÔ1àÚkÚkJ±RŒ'´îa`šiÐ~®ÜWîãf7/ò"Úê9YaÿúË,¯Á‘šM³¡i‡âÀ­ï¨êôñïË9–sLOð£ÝkJ)"òR 3jþÔ“›'7ƒû,oYWfß}—eåžjP àNs§¸S`®t®t®æëæëæëÀþÈþÈþVªVªVªX·\ß»ƒÝÁ0ßo}Æú Ë긗&*&*€ïÍÃæaG žh‘z V+°ðGlØÔø_%¿ûz,„½VVˆVðË‚ø‚xèØÑ±£cD>Œ|ùb†b†b†ÀtÙtÙtê,u–:‹?!ûYûYûYÈ=®=.¹22жÿtnqn10 ÆCÑWE_aÞ|Ä“."r«ú–ú– ÙØu§ëŽV–Ô™Ô‰ÓÞjo¶7æÂM…› ¡ßÕïêwù_¿výÚõk°eÛ–m[¶ÁÔÔÔÔÔ”_aç…vBr^r^rž_þ ë+ç^9‡óÏ÷ê?¤ÀÕÓWOƒç/Þ|„ŰΰN­•½ÓÓ~GÇ¥¥÷—Þ‡Ô’ÔR?€ ½z7ôÂãÌÇ™3ývOz>Z¢ºîtÝìº)’2‘ò 別ÛÒméI L L ±X-V‹U¤¶¡¶¡¶AÖ­ŒÊŒÊŒJ‘Û ·n'ˆô¦÷¦÷¦‹§Œ·Œ·DÌ¿1[ÌùQÄgŠ“(ƒ9ཀ÷ˆ5jJ¾’o¸'bê1õˆŒüzdzdZ¢,øæÀ7"C·‡¾úVÄ6h´ ŠDçGçGç‹\)»Rv¥Ld{õöêíÕ"§"NEœ±WÙ«ìU"ÆFc£QdÀ5àp‰ôí;ÚwTdWÖ®Ì]™"mon¼)’z"5"5B¢DssEŒÏ1ˆážpÎwÆú?ûü³ÏõhåÁ¶~ØŠ31<Ñ”h‚ƦƦÆ&‰ÎÄž‰= Ý»/v_ôË­åÖrk9dUfUfU‚-ÖaË€šìšìšlHØ’_æt-w-ãÔãim-M-MÀ?ô3†Þ•EEÀ—¾.Ñ”b¥x5žÆ}îr8Ïyί9D7¸Á `†fÖŸ1†fø'x°†¯É3é™âV»²¾¨Xòu%c¾9†yÌ<æäâDòD2(¿÷Î¥ÂÕíêfY WÓÕt`…EAµ¨ÕZž–§­é6ê©§Ô5D ŽQH!(.5FåeW©«”eõøêKœH<æqó¸#ß[7ùÉ Î ïlw³¢ (j¾š{õÿ… ÛOL~Xdžy ÍçïÔùô›%7(7è''¿ï®${öþ5w%'ž?ñü*A;PA¡àqxJž’‡´Amðc]¯Ûëþ:ŸÎ¯ÇÓã¯Þ•Oìëâ‰}=™/Øÿo‡ÄÉæ€dIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-15.2.png 644 233 144 3077 14774263776 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜôIDATHÇÍ–ñOTWÇÏLA) ?¬A–¬+)†ŒÛ?ª‹­RJI[—³Í$¢Ñ lÍJ­éhhY*–d\›))Yèj¬%¶ †…Ö–þ@Ö Ê S[[V*3³ˆvÆ7ïÝÏþ0ó˜YíàûåæÜsî÷û=ïÜ{î‘Ç#£€5Óši]¶­ˆÎ/}fé3¿þ(l»t°¼`yaìÏò^Ê{©©ÆxÔ6ýf|ìz‘(~,Ÿ9/Kt"¡7¡×²1b¿ /å¿”¿4=l¿3¶3¶3 !xõì«gNŸ:}Š:˜¾<}`vãìFˆÚ¦ßŒ7×›x±øòæü"ßßgù–$,¬²¬²œ½áwT#xÎú–úSàx}~þùyÛ¶9ms´¦‘±e3¼8ÿâ<¨½Ú—j’×y@UgÑðò-ߢñË_€Ÿù9ÆÎTšÒPêwF𑆠#ø?Vª¦À–Í1¥ùmØü6¿?Žo&Z'ZaŸ]¸áÇ÷BkBkBk¢|wWÞ]yw%ܸ=p{< žOè‰z¢žø°^m‡æÔœàÉûéèOG¹§ ãƒ;Û \°uÙºüq¦á_""®ap49š@³ñò‚âwŠ»‹»Qýúëûë£D   ×”×”×ë Ö¬/€«éWÓ¯¦Gãæ²ç²ç²a[϶·})JiOiG•/~«ø-ðµïïP·£nß„õˆº."2Z=î7,ü@í*úã“+ž\AÐü¯CŽ!Çæls¶9¬Þ½z÷êÝàt9]NLŒLŒLŒ€r)—rE…uîëÜ×¹Ö®Z»jíªè|ñÞ§RžJ!ØÚzªöT­Ú+V@hIXà_~nù9ÕË¿§—M/U9G¿Ònj7Ážg_g__<|ñ0ŒZG­£Vȩ˩˩ƒ’ْْYÈ=™{2÷$¸qãŽ)átætæt&L¦S84ðÆÀð› ¹Z®ÿèüêã¯>ðçøsÀ(J &U¯@jrj²q¿{Û¼m ŒÅc@Q^Q^Qœ¯>_}¾fÆgÆgÆapxpxp8* 4½4½4ZÆZÆZÆÞc¶F[£ ìN»Óî„Ëi_ðEÔíU¿÷”zJùTKªÅ¸fŒOŒO,×DÓ¶j[E,«ED$-r6$Ðø4ð©H܆¸ qDÆ?&²Ó·Ó·Ó'Ò±¥cKÇo•·Ê[%’U–U–U&Òè ôD:“:“:“DšKšKšKDjNÔ¸j\"ßwÜØé ttà.>|@0ÿ_£Â¨@cVï×û_ÿ~µ¥Úò‹ÿ»Ò¼»Ì»2,ð àÄIR´Äz^CÔÀ‚¢¶é_Ü‘õ&ž‰oò™üa=òëâ‘}=š/Øÿûv>P;À-FIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-85-red.png 644 233 144 4237 14774263775 15630 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜTIDATXí—mL\UÇÏ}BEf[£­0¬±hµ…P«…6ZÞ¦Å,jʰVª «u“–VÓ@¬ÅbÕš%Á¾ºn4gÚF‹¶©)AÓ‚+Y4ñmaec#R:e˜;÷·˜sç%j³Ù}¾Ì<÷á¼2رDZ߱?P,ûKÉ'â†ã†ã†ÿt— °7Øì fºû÷˜{ŒË¡:^ãU£Çè0DÀëÙêÙ 0½z?¿b³[g·xÖzÖÞ+7]¹ àÊ‚+ ÀxÕÓë鵂½î_†C.ÛìÛíÛÍtÉcñéÕzµ^}~·\ØW±¯b_…ùd¨ÀTÀ)k9øWï\½æ^+€ùó'}{èÛHÐ6[›-2NÖ†¿ô| >8Nœ¶’¦öU4Ðüù¤µ³Q|Â]˜±0ca{.­¿Tx©€D &sÕ–ª-©=©=Ý}Ý}uËë–Ä]ˆ»0õæÔ›­Õ­Õ7$ÜðqÇÇí™í™€÷ýŒ÷3€´É¤É$ 4piýØñ±ã y$Ÿ}eÃk^ÛðZø—ƒ3¯Ì¼ŒÊGë?]ÿ)@NVNVäε÷¶÷FîÜð7Ãßl›Ý6 p«z« °ïÃ}É9’àkñµ„ëƒF¡Qî/y$_”¶ÒÞÒÞÒ°f £p¦m¦-質Ϫ"®ï¸¾#Òßй¡32þÎ:#× : :æwÎïX’µ$ ˜//ãù(¥w–ÞYz§un·É-ÏiÊiÊib`Zñ½ã{8ÎÜÉŸåè+·VnXvfÙ€Cù‡ò?ûøY€äÑäQ€ïžÿîy€¾U}«º>êú(’að±ÁÇ"´ÚûvÛÛm`ÎMÉ”Q¹ rä.`@ò µX-V‹g–WÝ?v¼µé­MH÷û´»´»ÿÁcE6öÔzjÔ:µàåü—óN¹O¹Ü_»¿ŽL¤O¤(*‚qìõ•¯¯ ÷ûdoûåöËÖNþEÉR²”¬ÙŸ…¶J[¥­ªo”oYÚMö>{Ÿq³ûÁ/¾° xÍ‚¢”¢€¥·-½ 0OÅŸŠ¨Ë®ËÐ?×?è¾·û^€5×\XöÒ²—Ú“Û“©Zg­¸ïšìk²zw÷îÆ?j”Q;·´.m‘¶H[tð²HZ—´.iúYý¬~¶uÄ:ðK Ž1ž–¤Áš!sÈÄ« ¿ ˜’Ú³-±-hŽoŽÜéïïþþn€ìÆìFÀŠ¿¼Ä·ÄÁƒï9Þs„G]ÙSñHÅ#Á) ð í 퉾s~¢|륥¾———5ô–L¨ÙUsKÍ-f5¹ÆOÆO˜0™2™xgªgª#Í£æQœ8¿ù£ù#€·Ì[F…¯ÄWõ»ïn{w÷YWh£Ú¨6N¯WnTnTn\v8Pû§u¥nV6+› (­J«Ò*µÜæêp=äz—¥Ý§ic€nº05˜Ék&™Iæuæu`˜ÇÍãa)´Ž¤Ž¤BZ‚½ÇÞ¨¶vòí9í¹‡…V,ŠE±n³æ‰<‘§¿ œÂ)œBh£Ú¨6ú̇ÖÕzÀÞloØÜ;ÝõîúHí77Gb`Rt.òÈscðžà=øeØÃ_<|îásÆÓÖ 4©Oè®o_¼}ñv!T‡êPʱ]…ļ&ô¹Qдådzmzmz­q•q•q•®-íæ9òy‘Ú ÖkðãÂ… gœñˆq©±ÔXÖbSvSvS¶Y`Ýå¶8[œmd:ô×RBô¤•31£JŒÛíÛæ´ë>¡Ý]5»"´k ض0PðbðbðbX‹ýôÓ®ÄþÄþÄ~³ÄÒd’š¤&múkŒ߈á›'~ÿ֣ݒ_Ñn‡«#¬Ý@G #Ðaú}‹}‹}‹a¹g¹g¹Ç¸ÕÒâQí¨vôok¤ÔBÒ‹LW±p€,ð[ÚÝkßkß°¹[Ý­îVÀ?IZs²ædÍÉð±£ÐèúCÿ’$vÇô =ó¯k2aSH»ü–vóïÏ¿?ÿþ°v]k\k\kxgnÝ´&¡”+åJya}tu<¦¯"þK»šv×jZ£Ö8´R—7”7”7˜¯gÎdÎdξ¶F=ªj£5©¢E´ˆ:v4wL¿yâ´Xí¾íçÿK©Rª”*E¢HoWSÔ5¡E|Ü™6•6•6%„v^;¯WÚC‰c&÷3›õmX'Öé_F/ï¬PMÕTMPÎ(g”3ÿþãÜó[\1“Œ©{ÕQÿëâÆ!«kN^IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.9.png 644 233 144 3124 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–_L”WÆß†!ì€ÄMu¥q[6ÛVJ(DBAHA%.¶i ¸–€1¢K¸ØØDǤ¢ÛÆ °`³Ä° *Ä?üÙ€JDØ¥ÝÀfI»ŒTAP‰Ã7ßw~{1ó1´MöÚsóåyÏ9Ïó|ï9ç=G@DD"ý_ëëÖ×­N¶þ!ݺ'æ¢×é`ɵäÞþDÔFÔlhÜÐhL°ÙoŽ_?_$À¿^ÏŒK¤ö6{›%Ó+`Üþ¸Ð_úpå p\q\yá…âkÅ×.7]nâ0727°”¹” lö›ãÍù&ßz~©ø‰¾غmÝ–{`±‡ˆÀÖ¬­Yoõ ˜y>þðã=RVÐçpÂU&àÆÙÖa³ß?Þœoò™ü¦ž©ïó#°1cc†ääçä;ÐDD&›áDô‰hà}í ¨ ‚pЃõ` ÚûÜûú‡qÖ8 ”«rU n«ÛÀK=_ÏÇÞ%ïPÃyή¾ñó]sõ¸zLƒ“Í´çå9L?òãµ­Ú yËyË ŽhÃêÇ8 î©{hlÀŠ¥¶«jÇZ¦PeªL•ú—úV}ˆ¢¨(¥»u7š™QÃããgÞѼ£¦ÁªÝë–RDäíjp¸nw0ßL}9õåíÞO—£–£XÑêµz­> §mÓ¶iÛ`>v>v>´ ­B«Xgè§8€«ßk¡Z(,\üÚã×X1¦|ü0}fú ð½cØ1ì6ýÿ©‚’/J¾• `¼·tn¾|¾RþœÒžÒŽêmímêm effBDiDiD)¤W¦W¦WÂÂ…; wãžÕ<«yV¿“=«{V!¬?l2l•zß§û>¦}zPÒWÒ8}~D}'"2æ‚K3—fàÅ¿Ôá÷%E%Eá1ó:¶slçØN¸Ú~µýj;ĸcÜ1MOÊñ”ã)Ç¡ÊRe©²âÕTS ¤¦¦âñß­|·Oë_¯_/V‡¡çtÏið~åócµüÊÙéìLH–ïÒãÓãEÂþ&"biþjd|d\ìÛ3·°ý‘¹ˆ¹ˆ¹‘ì´ì´ì4‘ññq‘þŠþŠþ ‘ÅéÅéÅi‘W‚+Á%k-:7:7:WäQä£ÈG‘"-'Z\-.‘ûúì³oˆ}éö¬sÖiiÉlÈl‘߇ „ $$Ë/‚ ƒ ‰•;¶³¶³‘yôÛVÛVÙh‹·=µ=ñ{K¼%"öMöMöM"µÎZg­SdpdpdpDäÂè…Ñ £"©]©]©]c{·ìݲw‹È­Ä[‰·Eº³º³º³D¬÷¬cÖ1ÇAÇcHžˆØâlq²Ñâú$èbåüÚùµj£åáôÃi` ?jñmñ—â/A_Q_Q_Ü ¬ã_ÓûYåÿÉ]iÞ]æ]é#¸œá á%Ö õB< n¨X°@›ýk[Â?ßä3ùM=Sí®|e_¯ì{ìÕ|Áþœßì³³\ ¦IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.4.png 644 233 144 2544 14774263776 14771 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]H”YÇÏø‘ šã–W K^$FK¡ÈfäÈj¸--%Ë®kìb´NH»Ú°$‰åj¹4¤ÙE$ÙQ;W‹îÎnµ„6ãdÚ|¼ï9¿½˜÷w´m¯;7/ÏyžçÿÿŸó¼ç9G€B»ñ¶.m]ÚÊ„ö…5Ÿ]•]åHØçt°ÕÚjo…ü³ùg .\S–múÍøÔ|!,üT>s^Ø…5‘5”5d+7ì“°·xoqvaÂþñäxs¼ ºvèÀÕÞ«½| ‰À@¨“?¡GÀê«w®WCNq!„˜ê‡æ5Ík€^€¸WMÑL3¹j>þ*þ ÔŸÚ&mQ¾Ueª €U¬"ê–º 7êDùAÔ r܄иÝÀÇä3ø =bim;* ®°®ÐÜ€ø¯ JU)í´7ŠåC¡–ÌþÁ#jT^åEÚ©vG×èRñë²ë²M)¥Bˆ¢Ÿ '˜Ï`Ô?ìNÂïŠ}üæò›Ë,Î^›}2û‚gƒÁÍ„fB3999"è:×¹Ĉƒè×Ñ#Ñ#þ0ì »Ô%u‰E&øH̃$¿¡Çvn?|ô_d‰ÉsÃ}ãâ‹({ƒ½Ö^ E­E­E­Ù—Ù—Ù]c]c]c–®èÃèÃèCËnÙØ²±e#T¾ªœ­œµöW~;; üeò%øM=†0ß70 ×Ôç Ã2L4òQdsd3,ÜY¸³pÆëÇëÇëÁát8N˜î™î™îy«°Üößößö[?Jµ«ÚUí²ü²/^¯ Êo&ŸÁoè°rl嘂@i 4ù‰êWý –½²×š>0y`òÀ$xÜ·ÇBäé€Pw¨;Ô UùUùUù°¯m_Û¾6Ø]¼»xw±¯Oi=ZqŽ‹?¡G@A^Ažœ„àLpÐÇ^¾ÑŸëÏ- ß3ß3ß3p6:0çžsϹ&šh²â:2:2:2 Ý“îI÷À6ß6ß6dG²#Ù®®®KYP‹Ùf ~COšrDŽØ&…Ðj´!D†BˆÕ|ʶˆä‚B”l/Ù^²]û1û1û1!æÊæÊæÊ„èêìêìêb«o«o«Oˆ+ƒW¯ á¼ï¼ï¼/D¡«ÐUèbà 6X¸6-Á—ä7õ¼õÅ5—ÞxM¼†¨¹²ÖöÖöÖvñøGüÖŠ_Ž¿9.·Ëírˆ /,ÿÍ37ÏÜ<'òNäÈKÙ©þxe¼’h‚á?ÿ±¥§ÒH+m^›ä²¾õ˜Ç<"DRÚYµªVÕ ÝÕîjwAŽÊQ9 tÑI'¨OT“jBîÔÀâÿžÊ”>†_÷ëÀk£Ï »e7‹rD>•OA}¦TÊŽpžóœi“6iÚh£-Eè°RC ¿“ý²@z¤‡Ec1»P~ͯ½³-éüF'†DgÖ'ô ൬—õÄâ*@C$::&L8Å6ý1#ÞÌ7ñ’øïìüËîÊäÝÕ¼¶ymÀ œâ¹É£ï×÷uOÝÀ† ,Ûô›ñf¾‰gâ¿ó®|o_ïí{ìý|Áþ ãçsf\IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-68-red.png 644 233 144 4232 14774263775 15624 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜOIDATXí—L•×ÇÏûG¥ZŒR/3†vb°í¬ZWA“¢±ÔÐY¡ÒÕ8›Zªh ¶º(¸b-U ­i1‹®š[tVÂÔªµ±Ë¨­†&:¹T0V…{ÙÅKߟýÁ=ïý‘µfÙžxŸsžó<Ÿ÷9ßóž‹£ö ˆ0õé8wœ;έü+8ÛÛÛ¼p¶nê¦n¶ fŠ™b&ŒNÛ;„.t¡K"}{‡Œ—ëe>™?²žút$O8_©(¥jSäü¤Gôf½Yonº£¼®¼®¼î€$Nœ08a¿æ_É¿’žï~¾ûùn(È,È,È ùr^ÆËõ2ŸÌ/ëýa÷NHŸ>!wÞYxg!É$c"ß¹Ú¬6Ã?Kø, æÝšwÃÇ=K=KÖî_» 9/9àËK_^(O/O¼ñïÄ¿¤t¿Ùýf¨ýwöÕ÷Õƒä‘|ôÏÏV?[ýluèÍÌN#ÉHzåм#óެÎ] ÐÀ7N|Z÷iÀPÖPÀâÆÅ³nκÞ´ÖöÖv5IMz/®¾¸ÌÎðü’GòA9RÐ^Ð^Ðîšæù8àð$ù’|ÏM<0nŸá|åê+WÃk}1æ‹1áóÛ&¶…ûË|Ë|€/Xp«qÛ¸ª_ðDÁO8ßí#²£E³kf×Ì®áÚ=Åßçïž þà]å]xãçÆÏHoIo¸qîÆ9€cÏ‹ÐlËPË@éÖÒ­i›Ò6¼?ÿýù/Ÿ~ù4x0öÁX ýÛEß.;#X/h™ã3ÇgŽçšäjžš§æýx[^uõ¥õcëdžI`Œ||lÞcó€@iWiWxç^x ö»Øï*NUœH:Ÿt`¯¯?,ܼ9x@¬kÀ6|ŒîÂüÂ|ÀïhïÒÄK­ÿh}x§¿¯û¾ {_ö>ÀŒççë½ÝçwŸmuÉߋˋË-¿¸J[¥­º´|Ô—§^Ú”½111]Êe[ʦ•M³³o¾m¾ ÞAï à9:r4ÐÞiï`»€€zdè0‹‡+‡+C[Ýèk\Ù¸’ÅÎZ¥V©U÷*ÉJ²’ü›}Q€Ú?œ+õEåEåÅuJƒÒ 4H­X¯ºÛÜGÜGp;Ú]gž1ÏŒ6 Xû­ýá¼v® `}e}v¶}È>’ROCwow/¤Œqv6Ö:ܦ•kåe9ZžÈyº+Äš%²D–¾M4‰&Ñ$„Ö«õj½ë?u®Ö:××#ѳÉSå© ×®Ub•„b`Rtn ({¹µÔZêoáW…­…­æ:çÒ}ºÏ½}òk“_›üšjŽš£æ(‡‚tÅóÁ¿ËµkÚ5íšÒ’º!uCê!bJbJbJÜÛífådåd…k×*³ÊàÆ¸Ë]Í43ÍL i±æÉš'kž´³»<1&1&±ç^ð×Ò˜ÈVNDm½P¢Ü3‘¾k̨v=‡Â´»¥lK˜vD#1dý`ý`ýÒbt€;¾#¾#¾ÃÎw4™ &¨ +þ%ŽQ|qâç´š(íæÿí¶¹ÛBÚ5ÚŒ6£Í Ož<<¦Nœ>hþÚÑâAí vð¹RjAéEŽ÷±P€LðSÚÝéÚéÚi$z< ž @€ƒ’´¬¥¬¥¬%ôÙÑëô:½®#ø/Iü—Quƒãbìý£M.XÔî'?¥ÝùKæ/™¿$¤]÷\÷\÷\þ2:o;;¡)EJт͑eÔ»Quñ_Úý´û´V¥UiU]Kࢊ¢Š¢ ûí#3FfŒß:[Ý«õj½eSÄq@Áώ扪'þG‹ÖîöHþ?•—”—”—@,‹Ä"ëQõaõaõaP„"ñ·3)þŠ_í‚vA» ´.Ú¹ÿ›%:O¹"Wäê_GNo*VmÕVmPN('”7~9:þ+wÔÎtFå½ïVÿX ÕmË7£IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-2.8.png 644 233 144 2663 14774263775 14771 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜhIDATHÇÍ–]lU†¿]jba%­Dk¥!–&ML@I0-í†þØ45Ô„ŠÆCC•h › ­XÔQ @%¦±”×-†X”6 1¶Méî¦XVa·3gÎãÅÎì¬"÷|7³ßßû¾{ΜoŽ€ˆˆ|ø@/Ñ>íKEµÎ3ÍA ŠÍqs< ?áðÙüîVŠˆ,ÿr¦r¦b0¦Æð• ;u'wŒWŒ€€HqäéÈÓ`tFGš ílg»ëÎ Î Î Bxc¸<\f‰Ùh6èÝÂ.:ø6_Š?©ÇÖ=o¼ÿÆû -«(¡b+b± ´ÿ¨ÿ ÿàÛáÛáÛkö®Ù»f/DÏGÏGÏ»‚f:g:g:ÁóÇü1X\¸¸pq!Ô,¯)¨)€»¯ßÝyw't¡.–9|I~G7¹n«N‹¼°í…m"ºRDÄS&"¿È/2wªîÔŠS+ÄÚjµ‹Ìf³uSÝT7E]9tåÐIÙ…Ð…Ð…Èhÿhÿh¿Hßê¾Õ}«EFÞiiúièÈÐñˆx®{®Ëœžtø’ü)=°``Á€>SÏN= ó/›~uºiº &B¡‰ôuôuôu@‘¿È_䇪ª*·>œÎ çAqEqEqøvùvùvAYmYmY-Dr#Gvëõ—Î/›ßÖ#°pþÂùÖ¯ŒNgìc_­Ÿ×Ï»í9í9í9P( ” ˜Ìæsí¿¶ÿÚþk°vËÚ-k·¸ñÒæÒæÒfè*è*è*pãêegÌØü¶ž ëŒuÆó«ˆYmVË3V† ˰äÏëõ=A‘³Eg—]&²;¾;¾;.²¯w_ï¾^‘ñ¡ñ¡ñ!o··ÛÛ-rãôÓ7N‹dçeçeç‰L¶N¶N¶Š×Çõq-ŽG‡EùU-ªr·^Þ‘|›_Rz’/ÛåmpdöÈ,X•ú5û%Î}zî£sAySySylÈܹ!Vf¬ÌX™‡7n€¦º¦º¦:·„[Â-p ý@ûvX•»*wU.´Z­´¥ýYmU[Ið­Ã—äwôÜs*“f•‚3݉®‰{·…B¥ù{ØÃ`”QFÓâ³DˆÇDƒ7ã6òÿœÊ{çØ_cŽý™‚«ÔCêIõ$wÔõúÔUuY]Õ£zTèÍz³Þ Özk½µ¨£Ž:P—Ô%u ÔvÕªZÁzª´*£V–•Ås,>¿ïK›üÔgÕg¥Mæ9Õ¯ú«ÚªÆà–½‚3L3 $ˆns›Û€•ZAìUÖ`5[Í .ª‹iøÔg×gÿïä¿Ï·’¶ÇÛOœÈu·XmR›H€Ôƒxð€ë;ùÔ+a÷;xþ}¿•ìíâ½=˜7Ø‘6!}mâ‡IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.8.png 644 233 144 2643 14774263775 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜXIDATHÇÍ–[h“gÇŸ´j ¶5jÕzÀFA(²zÀ O«Sªô@E¥õB‡VpˆÂdu2mëëÅ,NÁ)ιb£U7z3J=!êvQ;m ¨¨šŒ4FÓ¦ßáýí"y“èp×¾7ß÷œþÿ?ïó½Ï÷ ˆˆHNâ)1%cJÆè¸±5åw®r®òþ·OZà¨pT<þ²›²›rÏæžµŸ¤l×ùéõ")üt>í—I9².e]r,OØaýìõ³ãâöÑpù\¾w&l»¶íÀ•sWÎñôÞí½ ZZ)[Çu¾®×xéørð~~søMÇsÈ‘5B¦­œ¶²`g<Á_¥kJ×¼Ê|•©2À nÜj9!‚^Á4[Çùº^ãi|ͧùãzÆ.»LÊ7–ot‰<ùsOþž|Ígø8J-µ¸Õã…ñ8kFÌ1PÕc`P ©!Õ¥º€Í $¦~ÃüÄ^öâNâ%ñ|Iþ¸y¿·Å VR™ÜãÙæ=ó¨/Ì·æ[ŒD@©ñÊ©œÀ"±ˆÔòàÁjŠÊVÙI¯R³ÃìÀ Ð|i¾Lí“u¢6§µRDdÖàêuõF†AÕc픀ªWõDïëÆu|XX fƒÙ`6¤ ª§žú”9Ô1Ô1Ô}¥}«úV9ÛÜhnPÛÔ6¢ÜÖø ¾$\OBØÉ[°}ÿöý žØE@3ÍÐÿGw7jéÜ¥…K !·)·)· *W¯<±¦XS¬)%(42424ÖFÖFÖF`‚w‚w‚Êg•O/Ÿ[êêP ¼Ê ÌÔ|q~­'!ìϯ¡9Ü«@}™à‰ý<ìœq΀…ž…ž…ECÑP&åMÊ›”ííí)a¾#¾#¾#0ãꌫ3®Bç¦ÎM›À{Â{Â{Ú>k›Ù63™³]š/ίõŒnÝ®.Aï¼ÞyÀ›DI©§Æ¥#g"g"g`ÉÎ%;—ì„1á1á1aèËéËéËIåJ%(\]¸ºp5d×g×g×ÃÜŠ¹s+ àŒ ŒJå« ú-ÁŸÐ“!’YšYJ¡ÈðÖá­"´‰ˆÈ?Òê8"]E]E]E"ÑÎhgT¤Õßêoõ‹L¬™X3±F䯳Ïn<“亘1ÿb¾ˆ'ß“ïÉ ×…ëÂu"*G娑–q-ã[ƧòÕÕ_‚_ëɱ¯Û׋˜ef™ˆz,""cuáú‡©ê¯ê¯ê¹Up«àVÈ›Æ7oE2Û2Û2ÛD|+|+|+D\Å®bW±Èëš×5¯kD.«Ëê² > > >É[›·&oMJ˜|«ùâüI=~c4'zþ›µÁÚ@Loô!÷!÷!7ÌwÎwÎwÂyÿyÿy?„$$!²e;Êv@ð]ð]ðœª=U{ª¸¸¸á´}Ú>m§â¿¬ÝÖnb´}ô{ÿTÆ—]fÄŒ¿ÓI' Å ƒiÀOyÊSàÇ8–æ?ÌaÝtÓæ \â.wQ`šƒ€úßS™6džzz’p%œ´¢V”¨µ×º`]ë µÏÚö{Ž=¨¦šj°§ÚSí©@UTuߺoÝëk—µ ì©v‰]´ØYvÑ$¾Ù3Ø3øÑ9–6ùYç\çL›ÌXw¬;€²7Û›1»¦PXX@˜0a@aoY<Óùö{ X·­Ûéøšï?“ÿ#ÿJöLÞ39 àhÀl1VµUM T‡êÀR¶Žë|]¯ñ4þGÿ•Ÿìí⓽}š7ØÔÏ妺IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-7-red.png 644 233 144 3733 14774263775 15542 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXíWLTW¾÷½7ŠŠ;+efqu»@†ÖU–v”RGh3J*¦L ÆM³Š:´%4ºQe+Û%µc¬é†âŒøþHiݰFjšZi£ øƒAeSÒQ‘Þ}÷Û?x÷½™‰J6»ç8÷Ü{¾ïóÝ{€iû%‰3)wv`v`v€>Ö’guÎêœÕY˜­0…)¬÷(É"Y$ ˜óF¢…(Ââ}Þ(ö‹ó"ŸÈ'åÆó‰åWEªH•ä/úÒ©t*þ‡tÝEwD¬)#)#)#è*¹Qr£ä°éÞ¦{›î§Çéqš¾ˆ‹ýâ¼È'ò ¼gó!Òâýe‡¤QiTÈJó¦yÓ¼lÏ‘‹G.¹È熄„!CFcÀ `0|=.ö‹ó"ŸÈ·ìгùÛ|iP”¾ œ=Îgúûþ©þñþqôC7ž©…µ0T¶7:ØKÑÊh%ÀÜÑCÑC1¾ûÅy‘Oä7ÇáÛæÔ¨Ÿú©Ÿ¥^©WêÛ~\®FW£ê6ˆ½Ëkx Âj›Ú¢¶|éH0)v Š(ÍðU¨fœà:®j›úú ÀßåU¼ a±Yà |ÁGð#–»–»–»ë'6Øêlu¶:¾55@ñPñ€°×êµ@äfä&À>ÂkxÍÌ&ð¾àcðSv(;”—êE ¥¼¥¼¥œo×DT¿êWýÀ?㟈ŠÜw :)¼¼ðå…3˜3ùù0ëYo@–œ%ˆjoko›ß«úU¢Ã|£²qü¥d¤d¤d ñaáÇ…1í³Ã;€0Âf£ždÚ[Ú[±~χ=ÀÂÜ…¹ð½õ{klG´«ÚUÀȯã |ÁGðDÿR|°ø`ñAóËX?ëgýB!˜ŒÑ#Ô£Øì ÀOø W<®€ÔR?€êÉê¸sZ––Å(€†0x:¾à#øéDqÊÓëéõôËgù,ÿYÔ/ X6ËŽ]nÜÞ¸æb.à~æýÌØ8?ÃÏ—otš0ÛÇö±}&¾g•g•g•ñnŸ-ËnÎnÎnÆí :A'(€“8‰“à¨D%*ãZÏÁ¯à•8ÞWÕ«ð|×ó]ðÞwï}g­¬5ÆbãzÑ‹^€;¸ƒ;ôÌœ œ œ p[ð#’[rKŨ;Vu¬êXUŒ’XKŠ˜®Ø5v-–È©;§îÓ5€_üñŸ–¥}@Åc<Ž¡ßÁ:X‡‰w¾é|Óù&£’¤ê Ž©Ÿ‰¼Z^-¯®m·Ì¾Ô¾Ô¾”- nnn6¥Ï×ñu|]l¥ñúÁ×ÀŠy+æ=Q*ïàèlÀóó#ˆ  £6£6£V3€¼H^$/:üˆ$$$¢\P.(Úßãò¸!Ÿø[Žš.½D‚¿ 3˜¹A$xšv›lM¶&Õl¶Û!ˆ`ê;ë;ë;k>;J«Òª´öéÿ’ÌùW®¾NæÎD0ÑÄ7uíž~šv×n\»qíFS»œ@N ŸŽs£´Œ–ѲüÚxi8—’ÿÒfÒn®Ü 7È / Âeueueuü¯™“™“™“ê5£Õ!9$‡|i¤´‘6¢?;r0o6ù-Q»âýµ·h­ )"E¤H{AZ"-‘–”PBÉ?¿µGì{„ù’|I¾Dÿ¡,MèÜÿͬÆo¤€(?ćß/—¸Ä%Ðsô=÷ï_M¯ÿ:Йþ„¼3¶ú?Q3/Žß’NÆIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-11.2.png 644 233 144 2774 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܱIDATHÇÍ–L[×ÇÏÿˆÛ ·H Aè²jiÚXʺ¹ ThMCÕª%ÐT%BŽ´d@VEašM¥"„FˆÖ"±ª" õø#©mSTÕ€P)J¦dJà H$+Hà9Ì6Â~~ï~ö‡ýx^ùwäüóô½çÜïùúÜës®€ˆˆ<’ý ä•å•ådpÞ¯íõ-/nyñÇCÜo€öšöÚíà}ßû>À£g=cNÛØò[ñ¹ûElþÜ|Öº<"ö‚û‚û‚¶7‹ß7üoø·eð'Á3ìN¤áÍOÞüà⹋çh†Å+‹W¢{£{ÁƖߊ·ö[|¹üòÎ÷ò‹€ósççÚ]p»Ü.(¡ü…íG3sÛ¡ö•ÚWòòUËÀV¶ª½@Œ–­ä`ËŸ·ö[|¿•ÏÊŸÑ#Pø\ás"ðêWxÐED¦CÐZÚZ ìЇ ÑI'[!MGŒ·Œ·HRebüE ©!õúHŒ$7âûøÙª¾Êòuï9Þc œñA]¼.î€ÂêÂjûL³ßžj¨×ÇAпV3´Ñ FÔ:°Ê*JýNµ«vP³jFÍ@NÍ–YÎÁeJW:JýÜ,4 ÑÔï³üÿ|}ýõuK`OuÎQŠˆ<ñ'ðÄ<±˜ƒk3½3½´/'îÇ}qkú¼>¯Ï³É«‰ÕÄ*lò÷ÐC õƒz§Þ ËO.u-u±¦·gøaǀ1OÈŠ9,=ÂßDDú§ ©£©Ô/ÌÝÑSË'—OBekåéÊÓ¨Ñߌ66å&´Z Aeoeoe/Œ¶Œ¶Œ¶lÛÛÛ5çk>ªù¼mÞ>oªê½Šw+Þ…H¯yÚ’>’>"›,u#u#uC„"ŠÈ>pbàÄÀ ÏuÏuÏu‘îªîªî*‘S>Õª_äî™{‰{ Ÿ¿d¢dB Ÿ¸íôŠÐlÔõÚ<ÑbÏÇž¿yM~49?9/"?Á’ªþCõ±êc"ÛÛÛ›…í+ÞW¼¯X¤|¾|¾|^dmjmjmJdrhrhrHÄa#,²|ÿøþq‘±+cãcã"=¿ê~¶ûYIÝý`åÐÊ!Žˆ\-¾Z,¢¾Oǧo^˶‹þ)hjoj߸!»!KÛ]I’ü?ì>÷Q`|a|‘›¯é¥¦—¬~Ö?e÷1åùÎó]Ì9£Ïèv3ë—õˬ©(%”lÎbÍ \¸p·¸Å-0ý¦ßôƒªW5ªŒ1gÌq;MEY3º2üê«Ù§gŸðÌzfc.Z}lSçop7¸7Úâ×$²¿L7ƒfK²Ò¤xv6¦³Xe:;ÿ!B²UVüÛ¬5kщ__‘,ªAkЬJýOçÿÞ¬´f—5+3‡acVfØh4I‚šT“hh`cË¿q%²û->‹ßÊgåÏèy_ì{ìÁ|Áþ(Î×Oš_\µIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.0.png 644 233 144 2614 14774263775 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜAIDATHÇÍ–mhSWÇŸ¤íL1«uõ¥¢t-AH§L©Ó¶®nlƒn£2ë 2çl? ?M˜Èt,"+ÚP³¸nkA¬öe+ƒ1ŠZ÷a2µSC>lPÉh'M“.³¹÷ÜóÛ‡ä$wýîóåæyûÿÿ9çžçYœ} xW{W{e|ï{ù¸ïß+Ï}ñ/*ð¼åyëÞGÂ%]%]Îý¼oò¦ÞÝ/’Çwó™¸,–|`ÁÕW=õY¿ Þ^ÿözß²ŒÿÉM(¾^|ý/õêè»Òw…÷!v'v`º~ºò¾É›zÓoðÜøÒö~(ú¦èÏo°à™ψÀškvTÎD+ ñõÆ×& & ´Ôàǯë$IŒýéòM>[oú žÁ7|†?£G ´®´NÞl~³¹ør¦áþ—ØGVYeø¬ë|‡|ˆ_ÿdýnýtÙI;Éè{úðD§u@ëqàs;a'˜Ó¿XQ+ ôs”£øsxÊàgùrü=òï½íhàIM¹°F Ø?Ú?‚~Ùžµg±² ­ŸÕ>íj©¥–¼µÒJ+81ç¡ó0ÕºÀî·û±hQ«Õj¾µ³`gØÑàÚJ‘ÊO¡8VKBDE0Àk Oꓤ¬ÓÖ 5S/M½8õ"Øív»ÝîtŽsœË»éòtyº¯y¼üñrÐëu³npn87HñG_Gìˆ yþŒž¬°‹· õxëqп8! ‡ˆÿˆ®}¾6X„’pI¸$ Mç›Î7‡tCº!ÝÀÿì`ì`ì` Š{‹{‹{aßû†÷ çWïí>»è4|~£'+ìç g¦gT €~7 0÷EáëŠ5Kk–Ö,…éÔtj:+ËV–­,ƒ‘k#×F®åõõõA°*X¬‚ÉM“›&7ÁºÓëN¯; C ¥†R¹ò95gø2üFÀ¢‘E#ú*Ä6Ä6‰lK£^¦—å “—“—“—aÛám‡·†%3Kf–Ì@ìlìlìl¾.\®WCýîúÝõ»óñí—¶_Ú~ :ý ;æãj«ù•åÏêñŠ44)(á;y,ž)Ï”Èxh<4K¥ÆR"Ñè@TdEËŠ–-"ÃÍÃÍÃÍ’3o›ð&Dì ´ƒù¸Uj•Z¥"¾]¾fŸ«^Y¾,¿ÑãqAϯ"öö"úžˆˆ”š¾»ß=q÷„Èžøžøž¸È­Š[·*D‰ŽD‡H¡¿Ð_èé ôz"¡H(ŠˆLlžØ<±Y¤­ª­ª­JdrtrtrT¤îӺκN×3|þœžÿ¾côd÷ü[µKíbÎ,ô)ÿ)ÿ)?lômômôAw´;Ú…éÊéÊéJh¼Ðx¡ñÄ+ã•ñJè[Û·¶o-Ô<ªyTó†f‡f‡f]§c±=h2GtÞwìß§2cN줆c æ O\ÀxÀà g8ãŠoe+[nºévÅ?#LXÏ«¼ŠU¦Ê ƒ9ï©tͱtäïÈß9¸×¸¨R*EJU_©¯@µ©cê8ÕNµS ìg?ûÁ 8'tÑE8[œ-ÎP/¨ ÓëŒ9c€ãìuö’Êá;+bÍ;Ç\“Ÿ¾>×dFªQ@;ï8ï`eWM Q(`†f\¾É§M½sÀ9€궺íÆ7|ÿ›üó|+9R~¤<ph§n‹Q{Õ^æ@ßÔ7ðà¼oò¦Þô<ƒ?ï·ò©½]<µ÷±§óûôÀÑå>˜IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-180.png 644 233 144 3007 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܼIDATHÇÍ–mLTg†”™q P1ÈZÙ`I#©JÜ®h UÐ M¨6‘lÒZ… þÙN‰5jlÒÆYš Š±5Yš‰%Œ«†¨4* ˜²[?Ò†¡³*8t‡óñ^ûcΙ3»¦ÿ=Î<ï}ß™çã¼""²Øz ¸r]¹®´˜íúÀñ»ßr¿õû¿Çì’ÞNzûŸG ýLú€Œ/2¾0GÛŽÛù‰çEüD>Û/‹Åq¤SƒI›-ûØY¸³Ð½$fŸ¼žNOgD‡½]{»¾¾øõEöCèÛзӛ§7ƒcÛq;ß>oã%âË'ÿÇ/ ¾YðMÒ#H]˜ºPV–®,Í;K¸Ÿþ ÀOÉ?%+ÿ|øÔf`–YìçI‚mÇ­|û¼gãÛ|6L@VIV‰T¾[ù®çBìÀÈßÐ9›OëäÔQ‡‹z¯Þ `2åŒÚ©v‚0¿3¿ΩjU `|l|L”³z«Þ jˆ÷x¾nñÅùczœRš""oB•TI\P¿ª×é‡@ CÆšP¤!¨\•«rãÿjZ§Ö:§ZT ¨,U¨ Q@=õh*Ù¸cÜöÄð¡jqÕbàW›_›­ ÿøüãó"Áp0 ‹<Êy”ó(Gd×Ä®‰]"ãùãùãù"Ç®»zìªH¸?|+|K¤¤¹ä`ÉÁ8|–ë¶±ÔX*âè±{Œö§íOþXÍÙ¡ÿ¢ÿb÷ÔÔÔÀí“·OÞ>é” ©»©»©Öç­Ï[Ÿ­µ­µ­µN¼c[ǶŽm°qpãàÆAèyÖî ;CKšÅ÷ }¨}èzÌšJjŽÖu¦ôYÝé …Á\|Èh e”Qž{ÔõD=:è #!ÐJ/½( õ—õ—øþSóQÍGÏMeA3X{Dic`Ú{Ì ˜æÌ?™Ÿ›Ÿƒ2ÔœJh´mF‡ÃÆa0sÌ3¸Æ5®ùºùšùŒ=Æ0;ô=…9Ì3Ó3á™xnÙ‹¶ñM¨rW¹ÍF¿ÑDÌwÌwЬݯÝú­€(Q«ð1›xnÌ7oî6w£q˸•ˆoó=·ùã[I`E ¾×´Nà3>Ãç”ØØmì& ꆺ@IàØv<ÞÖyÏÆÿÍoå {»xaïc/æ ö¿l˜ö³•¶IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-32.1.png 644 233 144 3071 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜîIDATHÇÍ–hTWÇïLb‘8FL–J%–°bBb¢“jŠwµ©’Ä‘…¤cC»¬ ¦ ¬ULpµHZÅí²³ Ö¸S&`ŒVCG×tŒ‰QP£nÈØŠ?Ò†L2qƈ“y÷ÝÏþ1óæÍ¶ÿìŸÞçÜs¾ç¼sÎýÞ+@!Dnê+ÀºÄºÄêHÊV·©·ÕØj–ý+){$X¶X¶ ï_-ø `á× ¿Ö±oØgú aâgÆ3ô"W˜Š¹]s»,Õ)¹ê‹ê‹l¯'åŽ+`ï¶wÏh°£gGÀiïi/„ŸˆTGªÁ”}ÃÞð7ð2ñEû/â sÎÏ9oys_›ûšðæú7×çÿ)iʇڵžd=ÉRV@9ªˆÃXá ÙØOÙþžoÄ3â'ó·6o­üãýé÷§í'’÷;9Ú|¬ù¨«‰nŽãÁCH!pT‹jQâêšþ¹þ9ЦÚT€VÀ&·Ê­ÄÑ´ˆàÇÈÁ™Âû¦y yÀHð~'þÍÖÍVû #ñ¿½ýb¿©+©+µ 1üÀ jt›n#¡Ô:µ¥þ >R¥+…Ú§ö©} †Õmu›_.¥Zµm„„•åCC`¦N¯Ó¿X—ÑJ!„øíQþm?e?ˆВÐHìà÷ïþìýÙË í]m§¶ÓŒ”ÈOä'òa¢p¢p¢í‰öD{F*}ôÑ\ç WLõÌtì½Ø{¼HŒ&ñ!dÙ›ö ö ±l#¡,Báé‡Oä'¦÷2Å”^òŽóí· !÷ï¹=¹=¨ú›õ×ê¯AøAøAøÔ–Ö–Ö–‚#è:‚PÕQÕQÕ“ÁÉàdÐLDÏÒ³ô,ˆ|99•_Vú+ý¨ >Ûp¶!mU¢¿ã¾ì¾lTÎÓ/´õBq³¾‹~¯õìí³·Uc¥£¢§¢‡x¸&\®‚¢yEóŠæ{{{ ”õ–õ–õš 8w9w9wÁáG‡~dê£ÅÑâh1¬n]ݺºÕœ‹µ½Ó½ÓÄSn”Zg¸3l$v³YðÌÑãèQ]l;0vÀŒˆ~ýª¼U'«NÂâE‹-^ÃÃÃ0Ç!°4°4° 6l*ØÁ–`K°ÅÄÑ\šKs¬²Êç—ç”çÀ™×O‡N‡L;}òÖ“·ß;¾W]B]prÁIýĮǮÃmäã‘ üíêž«{ "#2"a¹o¹o¹|ŸÅgC+­8´ŠmŶb æ æ æe´PéJW ž«çêyFew;w;wÙúîµÝkMš‘³ã?Žÿ°pþÂùú=«:#dƒåžs¾ó­7~wcìÆ˜ÈÛ6½mhÛÁáàà!TµªVÕB\:réÈ¥#Bì_¹åþ•B¸¬.«Ë*ÄãþÇýû… †BxVyVyV ñ¬îYݳ:‘^³çgÏÍžB>Öú´¾´:OÜÕ–iË„B?§Ÿ³Üt¤f,àóûüéÓÝøW[[W[ñÒ¥®RøÇücþ14šMP#jD€ ƒ7 Byvyvy6tz:=Ø>º}tû(CàHÿª³ÖYím†ùß½}w=lÛ:ú«JP¿Îk¼ ëã(ØôŸõŸÑõ½H/J­ºE·è`#Øöãa=ëѵIuPDns´hŸ}[ßÚú–!ðÝõ[)"òÇ“`Ø#+ßÜ|ïæ{)ØMóṂ¹î+­J«Òšæ‹ùcþ˜¦{§{§{A i!-”!ȇ_FþâØ†Ø˜ydªeª…ûº+¡¦P0i¿b¿±M讉ˆœþû·»oÞ}ªÿZýqõÇè=zº{ºÓD5ÎgýŽ~G?447474ûÙÏ~~3öLî¹µçØ}ö.{ú®¿`{ÁfDµr.zJ<%À“ =¢ßùö |2úÉ(Ì 7Vx¢à‰‚„~Ú4´ihtLwLwLêÊU•«*ÓÄeá²pY:›:›:›Òþó;Îï8¿\¥®RW)L­žZ1µþà]ºlé2¢_¬ Do„/Ï|yTkBÙ´hÁç >_¹Zn<]öt™ˆã#S[ðŸCC’]‘Ua«°‰Ü[xoá½…"ÅR,Å"rGîÈñòòËËË™©©©•Ô?<~xü°ˆ³ÜYî,q^q^w^)^XòTÉS’ýýŸ¯µ]k3µ‰ÔôÖôŠuô;úW®6Ëï,;-;qɰíÛ;"rJDDf,“¶[‰HV0k k@dîâÜŹ‹"k ×®-Ù½}÷öÝÛEûûûD̃æA󠈣ÏÑçèK ³Y‹¬E"qWÜw¥ýJ¡R­T‹ä4äôçôËŒˆí–í–ˆie—e.³ }¦}fEÙ¨l1="""…@´+êúE²¶dmÉÚ"2b±ŒXDçççDÖyÖyÖyDœùÎ|g¾HÅŠDÚGÛGÛGE*[*[*[D&ª&ª&ªD¼¥Þǽ‹L§ÎNq¹¸H¡H8ŽŠ˜æñá3 'oå·¹ìëñõJœ±ä‰6»šm~.×_®¿\Ÿ>;G=~ô8Tì­Ø[±zݽî^7DEEÁæ›Ol>áºp]¸üKüKüK`Íí5¡5!øâ§îSݧˆ&‹M#ûr}¹ÀÕ„ž¤°Ó_ƒçuÏë·„x$´ÄÌ”¢ A‚ÀcŒe\»vÚiJ)¥4Ã_EUÀ?’ñ¤Zã7â7€åŸçÏÀOÉ[™ªcºýGû+ÚM妒®cÚn¥_éç¾å1Kó©Ãê°: êru¹º´cÚ1íÐC= *ª¢*À9ZiíIíeíePWż1/÷µÎdÓB® À>jX™7êØo*ÿ¶ìmÙ½d^½ ^íEíE”ÔëĈQ~á—ŒÒQQ{L3Zk´F­…˜ú•úU>Ûr¶åüßÊÿ«^iô.£W’ìmð6o“›ÚbÔêN¢ _Ò/`ÂiÛˆùÆ|ÏÀ7ø þT¯|`_ì{ìÁ|Áþúê· õÒ?IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-114.png 644 233 144 2641 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜVIDATHÇÍ–_hWÆÏdc7K“´-±ZK U4 K«cBnSºŠD| 5Akó’5i… ±ØÆÒ ”&TlBL› ®bˆZ¤eÕ´Hdc5Ýlâ¦ÝÌŸûëÃÎÝY›öÝó2sîwÏù¾9÷Þ3W@DDžvŸÏ_óiþ¬E¯/z]jwÔî´g®ŸÄŠ–EË4ŸÙÍ«ìe/Å|o Zƒv½]OÔUuxM­Së€ïUƒj°›ì&2`%­$ð ó1ÅJç#º8º°4_m¤6h×z¼¥tDDÚ*!"É V-Ö머=jbº€Ò•Q-ªEµ€º©nª›xæ¸ÏôчR{œ7œ70Ïù°³ù!ŒuÛ*ó–RDäå/ p/po¦âã6ƒº¬.3›NÍ–Ì–€ù›yÓÌàZ:•N¥S`^3¯™×ò€Ÿb2M™o2ß@jùŸ‡ÿ<̬‹næR|(>Ø»»3…Z+ìø»wç>w•Zg®2WAòXò‡ä¨P4Ôj‚þ¦þ¦þ&÷ÁÉ'œ„ББÐèoëoëo›/üàŠƒ/| 6¥ªž¬z•c:åãvc]c®Üñ!WØ•f^éZÚµTOWõéÉéϦ?#³¶eí¾µû¼³ÛÛÛåV„+Âahhhðð³=g{ÎöxxMmMUMUÎ8ßfùøµëB×-ìJ³@é…Ò êå‰ràº+mŸ³ÚY ö³ö{ Tø+ü~èžìžìžôˆ3*£2 Ö”­)[S½}½}½}@tÀÆol¼uGëŽÖ…-+·¬Ø²Â‹·¯º/“‰e‰e õˆøÂ¾0¯Hñ‚Ø‚˜ˆ\‘IùRÎÈ_Â7á›)l.l.l1‚FÐJÎü†ßð"Æ ã„qB¤´¤´¤´D¤ý~ûýöû"±ÎXg¬Sd¬r¬r¬RäÜås¿œûE¤w[Ïúžõ"¾Y>õ­/ì ‹h="N¯ÓkŒ VØ ‹ˆ)""‹ŒçeNæ<sûçöÏí±n[·­Û2Ïì1{ÌI…R¡TH¤z¼z¼z\¤óVç­Î["Ë[—·.o Öß ¾)R¾°®Î¨;ê8æh^û;žŽ§åò?ÚÇt£m«„HQ¤H§3‡Á¶‡´³ÍÙ†éö~¹÷¬¥I“Læ˜ËçáŠ9g§³“‡ö€=Ÿ?âøu¥éüÿó¯$º4šëkf7ÐJ+ÅÞÛ;íd@]T00Àó5žÛn¼Î§ók>ÍŸûW>¶·‹Çö>öxÞ`ÿÀß"õnÑmœIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-96.png 644 233 144 2545 14774263775 14717 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]HUYÇ×½Ö¨7óc(¢4¬¤Ę j*'´/+ ¤ 쓦Ò(Љ(¨„¡ÀÌìšÂI¥/ƒå¤RÈ0t-g,I±ºb¥eê9gïß<Ü{ιÍLôÚy9g­µ×ÿÿßûìµö‘Äð[À;Û;Û²½;]L^L^ZmÈ®°À³Ù³ùÏ á|Ây€¤ª¤*pm;nÌqñ#ùl¿$Šëˆ®®÷ä„í“P”Y”3=dŸk؆؆w&캾ë:ÀµêkÕ|mm¯r^å€kÛq{¼oãEâËÉñ‹Àä¦ÉMž§ýEô"º:uõ¼¡̓‚uëú¢ú¢´¬ GœÎFÁ~#l;oçÛx6¾Ígó‡ôL[5m•lÚºikì¥PB ¥JL£¨ ‚8ΛgÌ3 ;Í 3ƒq~Ñûô>æ2¨Ñ;õNÐíæ\s.ãüh3“ïà…ñ>›?¤G>ü·?} …1…1À{£¬÷Ö{ É*³Ê0ô—z¹^޶—H§éyzèûú¾¾ê‘êR]Î ¢¿ÓgõY4ñÖAë XcÖX$~˜Ïá—HAé?Cì@ìÀÈ$xl=¶ܵ4«™j&£¶c¢g"0€ÁÆÁÆÁFPwÔuÇb†a, –KÁÈ4 Ü8¿©Yj–ƒ·Öå³ùCzÂÂ*~‡=Ç÷·³ÕWÚ0†Œ!wâÃÃíÃí/ù’/àÛæÛæÛ[j·Ôn©uy·'oOÞž Sz§ôNé…•GW]y†.]ºèâé?ŒV£ÕåsùCz¼¡u[zC$»,»,¼ŒâY¬óô¨• ÛquøêøÕq‘áâáâáb‘Qÿ¨Ô/ò<ø<ø<(R’X’X’(Òì vEZëZëZëDÒ“Ò“Ò“DºfvÍéš#O¥\Êm|Ïâù—ÞðŠÄߎ¿½h™ÈªÜU¹NÞ%¹ˆ H´íI®I®I®yñîÅ»ïDü-þ‹H_i_i_©HOGOGO‡ÈKÿKÿK¿È†fl˜!2ðdàÉÀ‘…m Û¶9ÂÄ»)êPÔ!ßsÉå뤩ISÕCìì(û¥³Ü_4vdìÈØ8Qu¢êD¥¥¥Áü5ó×Ì_+ªWT¯¨†ü¼ü¼ü<7/+;+;+Êï•ß+¿çú­3Ã̈l36HWDÝT7=EÌæFgBÓô7zºžîÎðAÁƒ‚"MMM"¹•¹•¹•"¾_‚/Adÿúýë÷¯éyÖó¬ç™Hewewe·Hww·HjJjJjŠ‹'µrJN¹|.XOh³u”AÝ›º7ÎÞ,¡ÅÚaí`œ(=¡'Ü™ž«?W®–.)\Rííínüʤ+“®L‚eCˆ– Áeßeße_DUVq @‹Ub•0îð9ü!=­J”ùÚ|íV­ÜâÐK/½Dm´ÑºPêB ™fš#â€ãæpž‰ÿߪüx³ì>£v«ÝŒòwxo<µYÀÊ´2­LPeªL•¹:”Où”¬½Ö^k/¨¯Õ"µø•~úÔu€ÑÐ ðÉ>ö?§óßµî¨U‚îùšqÞò6ü­‰| ûà ÕN¾ƒgã´ó⬠4§9M˜#æ€Ul3ºE·àÁ®mÇíñv¾÷ɳò³½]|¶÷±ÏóûÕ€à;0;’IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-58.png 644 233 144 2506 14774263775 14712 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜûIDATHÇÍ–_HÔYÇïLk*Œ•lk ¶2E2ÓfÈQº[AA¨Y›IDfôI>ø°=ôP»H›™`[ØJ…BnRŠ4&»²ºF¶–ýaj%m×flMwîïÞÏ>Ìüæ÷sÁzí÷òã{Î=ßï¹çÞ{î „bIü/À¹Ü¹Ü¹(†Õ–=ekÊÖ•Wb¸ÉG©£tøXܰ¸ ýRú%5baÓoŽ·Ç añÛõL»X",Cr{r»£(ŽOÀî¼Ýy)ŸÅð·w!µ#µã ‡nºp½åz G`¬o¬`²h²,lúÍñf¼Égç'þ§/$u&u:þ€ä…É …€œÍ9›Wbž®€Ûwlx±àÅícpáÒEÀS˜ßk6ýññf¼Égò›z¦~,K7-Ý$”ì)Ù“z10ÒŠ®ÍªÍ2õ¢LRK-.mD'£“ ÿ”E²ˆY=¦®©kÀ¨~ªŸ?êj] úg¹R®d–‹òŒ<@#¸q>j³k³ÍGZ-ýX>bîÚ~÷”§”§$ºFŸÑ̨ UA4FŒfvN¥ “L2A/×Ù:Û2ëOõ½ÍF½QOŒˆfL~SÏÔö„<ßCêXêØÔ'0jŒÀ_lÕ¢Z˜Ö’\r!òe¤0R¯î¼ºóêL¬X;±ÔNµSí„è¹è¹è9ÏÏÏ™'se®m½Ê­ÜLÇѶ„^B?–O<±¦>~ø¸­òµ}}cM<üK8AÎóœç9ÏÁ[å­òV/Ý—îK‡ÞG½zÁ®Ë».ïº Pâ)ñ”xà]õ»}ïöY|xd–̲ô,ýX>ÎXÝ ‚Bl<¶ñX¼ŒÂá'ùŽ|ñ¯iˆ,dF2…pÞtÞtÞ¢"©"©"Iˆ[õ·êoÕ …CáC‡¢Ëßåïò 1 „ýzz z\7é&“ß᛫_°¨gQn‡±uc묊« ùL>³pW]W]W¬:µêÔªSPØ]Ø]Ø žÏŒgú+û+û+ÁWî+÷•CZOZOZøJ}¥¾R˜pM¸&\¶½wEQGlKœÐå# =-=Mý¯_¾~i{ý“jVÍVØèÞѽ£{!4 Xö²î²î²nX=°z`õ”Ë‚eAËŸ ÿ@þhp7¸Ü–ÝøZËb{›1õcùÌ[1ãoÙ);-ÜáíðvxÁ=éžtOBó`ó`ó ÈY !°>°>°Öx×x×x¡M´‰6YyYyYyÐh´lü÷åyyþ½BˆÁcp5|5œ(t-F±QÌ,/yÂ+ütðtðtüCþ!ÿ´îoÝߺßòŸuŸuŸuƒ?ÅŸâO ꂺ lú¿q{Àm£Ò¨d6¡—Ðå3ï©9%­>¥¹O?ý€Ba`€ÐRK-"6˜0a VZm|ZFdÄ®7÷TÎßÇ¢fŸQGÕQ¦¹ÎcƒñƒÑh4‚QcÔ5 ¶¨-j ÐB -`Ü6n·Á¨3êŒ:PŸ«ejÐÆC¨UÃt¼Q¨½·ó÷½ªJUEÇg<“èü:n³U˜å-om63>ÁgòÏÛùç¹+wÄî6Nr—µÄæÑwõ]8À¦?±%âñ&ßïÊöuñѾÇ>Îì&8\û¾½:IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-11-red.png 644 233 144 3772 14774263775 15620 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ܯIDATXíWml“×>ï‡I€@ÀªJg¢ãcDA0Á¢,NˆC¢Z!dš–PÅB ¦i¨©*@Ù"¢´ÊJT@Ù¢5M“„”ÎT PFü˜`]1)?h±]È$“„ÄÁÁñ{ßûìGÞû¾¶U¦íü±Ï¹çžóÜç<÷Ê&š±E”brQ†?ßᗞ¬9Ýsºçtoݬ2•©¬ïO´žÖÓz`f™7’J*©ÂR}Þ(òÅ~QOÔOí'¥âIÆWC5T#w¥®/ù‘Ú­v«Ý]£Òaé°tØ’m·ÛÇqeÇý÷wÜv=Úõh×#Àãô8=NËë"_ìõD}Ñov<$ÿ<Õ팕£r4¼^0´Ü»Ü»ÜËÞmímímíåó&F&F&F(P  †ILb@a„Ó7ÖE¾Ø/ê‰ú©ý^;3;>r,‡ä!y(|UpÞrÞrÞÒ~LãÁ8‚0Œçé\çÐX­vF;° ¬„•ÌÍ*XÀ6° lÀjY-«xÏãyÐÄþ`"˜&õMÀ)ý LhR—Ô%u©§ÔSê©ö~±ÁÕèjt5jnØ{¼ž×cBk×hÖ?Ó?0-2C €˦ñ)>x˜/áK­òB€¿Ç·ñm˜i®F×®4·è/ð|d{h{h{ø‹ŸŠG½£ÞQÏW†ž„‚¡ žu&؇‰{‰{Àïò»&¦6Om€‘g#Ïl3€ÁËy9ðZ^›œ?Z:Z °¹››4`"ô$4ÆSÑ_à1ñ©ÕƒêÁ;§Ä¹êsÕçªùÑTëÒZµV`ÓÄEí«N¬€ò[å·’qê¥z)° $ÇO¬>±@¼üzùu+ªuÅcñ˜uHÑßd6ñˆ}}}G·ŽnÝjÕA®8sÿÝþ»Pè-ô3÷^ßüúf|õ_é¿2K¾z.{“½iõýO6þ¹È[ä-òÒ1{½ÇÞCSzHûBû‚Tê32ò|Qþ±ücDDKƒKƒDD gÂIßcüþÊ,ù ´>é+é+"=¤©Iªè/ð|Æ'>÷ôyú<}æÉ+e¥¬4™¡t¿0Kþ´þ†¾¦¯‰ä€d#%Ž„#a |$»e·ìN ãjl«i«i«±ÄÍ2Y&Ëv„I¾L½½à\ì\œÂè&}°UlUrÜÈל œ ’ætqúÛéo­~7šn4Ýh2™ü¥”/åKù‰aYz"=‘žüîãU=V¨ Ôô†+ÕáJš§Ö²CCÍVC¾EC#` 1DàÇU\x¥~^?oe÷ÝÝ»ØQ_T'ÕIÿÉœC9‡rÉ.Ù%»¤‹ºjs¾ñY©Ý‡8üðÃ` cKºÕkضÆâ·ySó¦æM|‹¨g˶eÛ²‡žÏøŽÌÔIK×ÒFoÜS˽ê;2g´ºøBífkÙZ¶H¬?Ö[ZÄ ÿÜÁ¹ƒsùS“Yr–œõöoÓ¤x6 _ÍPšÓ´»ãeÚÕz´­ÇRîTÎTÎT°v|íøÚq¶ÚÔâå‚rátš!½t€ é%f%ˆ/Òn“£ÉѤe‡:B¡óR ¤¾Ë¾Ë¾ËÖ³£¶¨-jË ñ—dîßÒúqš÷2€é&6¼mh÷//ÒnÉö’í%Û-íú üþœŸYçæ$¤*©Jª*=žÚFKë+Ñi/Ón‘Ò 4( á pU}U}U=ÿ}ÞtÞtÞ´vÏuD‰(ßrj7~;¸ÉMn%”Ö/ƒþGK×îÉT¿äi¯´WÚ P9•S¹þcy™¼L^H$‘D½ËåÆˆ”;ÊåŽtÝØX™6¹ÿ›e›ßʨŒÊÔþÔå÷«e.s™Ò5éští_?˜‰¯ò§M&˜V÷¥£þ7¢1E2í™IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-130.png 644 233 144 3015 14774263775 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÂIDATHÇÍ–kL”WÇ™„Z&CS»7hc´Öj7£i©AiœÖ"ò¡U©—–‹MÔˆ¡q“mMÝšx‰·¤]lŒE„fÌ41U;±@´%%Æ4-2ŠLÀ¢³ ïåüöÃÌ;ïìš~÷ýò湜ÿÿŸó<ç9G@DD²âÔçSŸO³S·Ù~çÎ7þúï˜}Ô€”7SÞüq<ýùÓŸ¸O»O›C¶mÅ­üäõ"6~2Ÿå—,±ç3Χ¬ŽÛ-ðöü·ç;sbö?¯«ÝÕþH‡šŽš€¯Ï~}–íê õL¬žX ¶mÅ­|k½…—Œ/-ÿÇ/iߤ}“ò+d¤g¤‹@Þëy¯ÏÛK¸5Êו¯qŒ8T*÷L2Õj`Š)¬o<ɶâñ|k½…gá[|L@¶'Û#ïT¼ã:[0ôzÃs ÏY|Z;«xŸ÷Éä¬îÓ}Ænc7Qþ¡Ö©u nš?˜?'Tµª0>2>"Ê1ý„~Ôïò.™´Çñˆãëq¾L]JSDä“×À+^IêQMún}7¨ 1`  Å ‡Š¨¨RUªJ;†*Q%ªT§êP ²T±*FÍ4£)‡0ÀÖ>x³¼YÀ,~In¶¢Ãàºçº75 †?”º©nyô òTä)ÐNkǵã¶m“¶IÛ÷=÷=÷= ¯××ëëíxt4ú[ô7ç…_ ¿ j¾>¤‰‡Ë¸;|kø \!Whj–¥'.ìh7wkkjk,8s¡ú›¶P[ŸN|5ñªäƒ’í%ÛÁŸïÏ÷çƒRJ)«Ö®Z»j-¸‹ÜEî"ØØ¼±yc3è^Ý«{¡¦¾¦¾¦œÎ{Î{°åÊ–_¶ü‚U§ê€oc|«S;Çê½£ÝqaýòRÛܶ¹‰‚¼÷(üÇ¡?]Þ´|ÇòöÙí/è/è/€‹‹..º¸–Ž/_:ã£ã£ã£P( ±º±º±–ÝXvcÙ  ‚‚ƒ{ öB—Ùq¦ã Q‹Ïœ÷å3_>c ëÿP`öw³¿Sçy* CñÔæ+æ+`GÈq×qWÄ‘ïÈwä‹8#Έ3"rç w.ˆÍ 4E. ^¼4(’ۜۜÛ,â¯òWù«DœÎ g…$>-[ËÑrDœ›\{\{î°¸Ó»Ó»E,=©"f§Ù™ò³ —ëå"¢‰ˆHvÊ_dFflÀé²é²é2‘ôúôúôz‘>OŸ§Ï#²¹{s÷æn‘Þ®Þ®Þ.‘‘Ë#—G.‹l8²áȆ#"·Ü^p{Ⱦ«û®î»*2Ö3v}캈ç°g§gg>;õ{cŽ1GÄÖcõmÚ=±šów}RŸ´zšÜMî&7GÀa— %Ün Ãbm±¶Xƒ“•'+O&•î\Þ¹¼sy°2¸2¸2]»ÆºÆìCËì8ßí¶¶ÿé±ø©¤voí^ûT‚>¥Û]Q[&àÇP(T’†f@ ªA5tÒIgRü>|(æë/è/$ñM×6Ö6>v*‹C|ލamXLkŽ™ fs‹yÐ<d 0À`ì2v»Àh5ZV0sÍ\3è£>0_6_4_c¹±ÕØ æ9}–>‹ˆ?l›€éu>6ǬAûÉkàuzöä£Çè™o™o¡Åg¿tt@a`ÓL3ÅvPKÜ ˜1«Ì*40®דñ-¾Ç&ÿŸÜ•4ÌmHÌ5­ø˜É´KlTUDA]S×H!lÛŠ'Z"¾Þ³ðÿô®|b_Oì{ìÉ|Áþúû*^”IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-139.png 644 233 144 3030 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÍIDATHÇÍ–oLTgÆ320JÔMjj·á¶S5à?"n‹p±F‰´ºHI k̉KRHL—Ø%Öv5®Ö˜ Ä¸T61jc¤tÕRcÔ2³@ ýï}ûaærg×ô»÷ËÍyŸsžçÉ}Ï{î+ ""I‘·€ëE׋®…áØµÏY=þõ´ áø¤‚˜]1»¾û $~’ø @òÙä³Ö]'¶q;?º^ÄáÖ³×%Iœ…¸Kq—b¶Dâzð½ê{5þ7áøhx[½­Ó&T|QñÀçç>?G =ü5ÀØ–±-àÄ6nçÛõ6_4¿ÔÿŸ¾Ä^‹½ó⌠që ‚Þ¦·éms_ ¯óu>è½[ï­wëÝh ‘F íV#j( óCqrq20mëKt³½ò1xG¼#“ó``j` ¸@èÛú6Áé‰àsÁçÀ8kœ2N9FŒ=ÆcŒnÝ:ºÌ\3×ÌuðÙ–ÙæÙfðÿËßãïëóšy`.àáÀ—_xÞÀä<ÛOÄØÉnžTVTVØtÖý{c±Æþ6vqì":ëÏYUYUБґґZk­5doÏÞž½’š’š’šÀ÷À÷À÷üuþ:ä7æ7æ7Â|·Wy”,=Vz Íf¯ÙëèQÿŽ~GÛ½w²;b¬÷=V¶,kY6·!œüÒôK¡µ«7V;g·wyïòÞåp%ãJÆ• Xï_ï_ïÿÿÿXµhÕ¢U‹ ôpéáÒÃ7“7“7ã|ÁÕ㫇VÁņ iÒÙzêQó·ÍßÚÆzßXع°S_bjøåá—»‘Ôj+ÓʵT=¯ž‡u±ëb×ÅBë¾Ö}­û¡ñ†ñ†ñØT±©bS¤¦§¦§¦ÃéÎÓ§;aEõŠêÕp~éù¥ç—BâPâ`â üýÁ§ÍŸ6;k﬽³öœ™:3ufÊÁî<ºóèNÈÌÈÌÈÌ€ë%× ¯ÎÁ!}*¢7Òò}Ë÷ÿÓc‘SIe]e]Ô)Áœ4‰®ch§v@£ÑQëyÌc „J€ &˜ˆÂÏÒAš5fš™¥ªå«Æè7ú£æ˜9Ú;äzjŽÙƒö£× 8¾8Þ™ü nª›À´Ub•`Df¿LL@£PÀ 3ÌD°ð çêÈZÈ*³Ê0@}¥¾Šæ·õžšü¿ò¯¤fYÍÜ\3Z#!ÁÙbU¦ÊîÒ]ÄNlãs-©·ùlþ_ýW>³·‹gö>ölÞ`ÿ PAûŪXçIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-40.png 644 233 144 2452 14774263775 14701 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜßIDATHÇÍ–]H”YÇŸ™Qg¬¡µeºÃÅ>0a£®¶'Ô`+ ‹,K©u˼ˆ-(PJB„ݽÈ5h‹û0¡/*«‹d²Ì.ºÝ0íëb!kbT²uGß÷œß^̼ó¾-[íeïÍðÎóüÿÿ3çœçÉHü ¸3Ý™îqìÞaÇ}«|«¾i‹ãã&¸Ö¹ÖõÕÀWM_5Ìl™Ù¢ll[ùÎz›ß©gÅ%Cì€÷‚÷‚+˜ÀuP’W’ç›ǿ܃ô+éWÞ°óêΫ—[/·Rááoƒoƒ`ckÜÊ·ê->'¿ÔýK_Ro¤ÞpýÞ4ošdffWÇ^dCñêâÕƒžAv€9øñë 0ÆÖ7ìÀÖx"ߪ·ø,~KÏÒûäòE`í¦µ›Ò›ãgaßœ}s,½©+ÔQ‡Ìiæ4àg#l„‰áRݪ€ùÌ~×›õfйF.1®g³4Ñ„3Á—ä·ô,ý¸ùpm-€ ¾ ¾¤¡´Ùmv¨*UÅOÐz‡Þ¦·a»ÙÍnPaõZ½¶ÃÚ£éEh~0š™óù˜Jð'õ,}qZÐéáôðX <3Ÿ™IÞïWëÕzÆJD&ãK«ŠUŪ`tdtdtÄ6{{{ #™#™#™ óô<=Ï17ªP2ŽNð'õ,ý¸Ÿ„±ãÝPY[YkU«o™0"FÄž¸ùµ9Ýœnó¼{ðîÁ»PØ_Ø_ØoÇËw•ï*ßéGÒ¤-¡-¡-!‡±N@ó›QoÔ;ô’úq? c½?Áùwçß%}T€yÚ‡‘“œä$Ç<ì¶¡™0†Œ!‡ÞŸÊOô1ÔVµ•qœ³ôM}Sßµ_íWû§m¶š­fƒ¹Ì\f.Õ®ZU+ ’eªŒñþ\ûDçǼoÞPåª<Þ¯Í$Q¢@ôƒ»2>¦IÞóÞKÖ[|ÿG;ÿÿ¼+¡žzü`Œcf©YJ ô=}.°±5nå[õßgïÊ/öuñžǾÌì?ÏRëÄ;ÜXIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-35.4.png 644 233 144 3156 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü#IDATHÇÍ–ýOTWÆÏðRfdš@Ü]k+• ÄÔÅTÈBÈêÐbi06×N¨®‰¡1Ý¥Ú@Û`Øn–UC‹Ëì(cyKm«Xšò¦4Õ4ÝeÜHcR¡µ3N‘‘—aî½ç³?Ì\gºþž_nžï9ßçûÜóòœ#@!DRè+ jEÔŠ¨„ Žúc8n,2¥ý+ˆ[T0ì0ìøÏQH|?ñ}€Ç?xüífëýúøÈ|!Âü‘õô¸Há@œ=ÎnÈá7áÅu/®3¦ñ»`ê2uÍ*°¯g_@g[gûᇑF~Îÿ9ÂXï×Çëù:_$¿xóÿê ±c/nAÜcq O>UøôŸ‚&ž†âíÅÛnGߎ–Q º3f™øð¡7OÖûCãõ|Oç×ëéõƒz$ç%ç ÁßK¦K¦M­Á„›í4לª9r ÐÅ?i£ 3RùNù¤_)WÊñË)ͦÙ@º5æ®ÉFÙ ZT ~üŠGñÐJ+fB|‰5ÏÖ<« ¼Ù޵D+ÑL­üròËá5 }ß+à7/d¿ r @`˜dä¯T§ê$@.Oò$òÁ-âÇOd“H@þ".ù¯–«åÕÊ3Ê3z80ŒZ¶¬l™.𽂈¥BˆÕÍ|n²š¬¾˜X1±o°ÍýcÓMÌ)_)³Ê,àÃfÌ3æ3Üé»Ów§܇݇݇AWãÕø™—è¥X BÿÁ¹ž¹æîýzÞ7ïcL¼3ñ0hj1µøb˜êÒ „-ƒðšúš ÓÆ‹WËÞº97#7’N&]Hº€,o+?U~ ܵîZw-¤ZR-©XsuÍÕ5W!3;3;3ñŽxG„°@l 6ÆuuEuEÈÂ…üŸòÒ£Z¶fÛ—¶/ èêJ¡BܨK3—f -ª÷ÛÞoeÕorzrzð{k¼ÕÞjHÍJÍJÍëyëyëyÈÌÊÌÊÌ‚zY/ë%¸F]£®Ñ°u¿º_ÝÆW\W\W\á³}{‘·È«/¶¬Òú­]Ö.àó Á½„ž„igÇÔ‰©a"_ëÌÞ™½Û˜ÛÛ+ V¬,€siçÒÎ¥ÁÚöµíkÛaKÓ–¦-M~:ýtúi˜pM¸&\až»cwÇîŽAQbQbQ"T¼UQ_QX·íþ¶û?2y{Ùíe€;Áž`—v!›?LüPs€oÔ7 ÿVœÕÎj<Ã::t¼~¯ßë‡õeëËÖ—Á‘¶#mGÚ`,0 „‰·¦lMÙš•••áxCqCqC1DŸŒ>}6ÞØxcã 0.Ä}÷=ôø?}õÓWñÀ|Ì| hÏ'ìNØ­9¢d·Z©VBÄ~û±×}êú”H®˜®øºâk!ã— .b¡o¡o¡OˆÉk“×&¯ ±§{O÷žn!Î,?³üÌr!<;=;=;…H·¥ÛÒmBœm>Û|¶YˆM#›F6Ñaë°uØ„HJH"¥4%#%CˆÕ¿[}kõ-‘,Ĭ2«aHàK¾48ï†öØe[‡­ãÁé®:nªû(b}aí¶vóúC?•–*KðIð” ÕƒêÁHbŒ1à‡8ÄíŸ~ú<òÈ‹0µBY( AùBùLù ´‹Ú7Ú7Hþ¦¼­¼ òùP=,,oèTâ ù&§Éé‹áã›Ç7ƒz8ècê±ÅÎÅNæ´uÚ^m/`á^µSíT;A= P€Vª•j¥@-µÔ‚fÖÌš8Ƽ!´W5ªFæ´?Œ?7þ°`7ûbPB>öóSf,3BÐÛÃ,¨ýj?€V©Ux0ƒ’Eæ™ÿ…﫨À½ £…¢hUZÕ!u¸â×ë=ìü¡»’Ò—J_Џ+yý‰×Ÿx`“]À N`ŧøÔÝênü ä Æz¿>^Ï×ùt~½ž^?¨çQ~]<²ï±Góû?5:6ZAŠ¥IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-62-red.png 644 233 144 4260 14774263775 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜeIDATXí—{l”U‡ÏwiKÙb¬Ð«Míâ*¢®e+K m!nÅXL]RªiㆰÈb-Õ€"l P¹‰•Kjˆ6Ù`™„ÂP,JI6,ÊÅ55Ö¥Ó”BÀ)ÐNÙi§~—gÿèœo.Y%›Ý÷ŸùÎ9ïå™÷üÎwf„±Ÿ‹SgĹãÜqnå_Á‰„ؖؖؖÙÓtS7uóüûbª˜*¦ÂȲ½AèBºCäØÞ ýe¼Ì'óGÖSgDò„óU‹jQ­º"×'üRoÑ[ô×-ååå$q\ÿ¸þqýüµ´£´£´ž»òÜ•ç®@Y~Y~Y~h,×¥¿Œ—ùd~Yï§y„ú›ÈqÖvu@Pº¦Ê¥U¥U¥U™ËvµíjÛÕföÝôÝôÝ444üÜáw€.ºèg\—þ2^æ“ù#ëemÿi>‘>FíQ{Ôž®c2AþçùŸçnüºó‡Î@g€N‚fO±ïµïÅ0WMF˜š™f&˜%æ\s.˜šf˜«Ì,3 ì)v¼!ãe>™ßލŸ>ÆAS\ŠKq ¡¯××ëëw_EŠÖ­1J°×¬6« Ÿ±;p8pì.¾æk`˜‹\°*¬ Àr"–ÙË€ak¯µ쮑Yc·gÇýšuÎ:‡Ozm(ª+ª3Jd}É#ùDLwLwL÷o%ÒëÒëÒëìlO¯§×ÓK_0ÏÜdÔ5Üàà86p `0w0—0³¯Û×ÃÇÆc àëó÷ù†zÌMö{‡ãäóôz¾õ|K_z]úºôuv¶äqøô¥úR}éÙõragåÎv¾`/ &ð.£Ãè°z¬ °xÞây0r¬ôV½`ÛØmcû=Ý€¼wòÞPϪg@ì¦ØMë¾Z÷®ðü;+w¦ìL±9à¶wÜäq“ÇMfíٷfßš @ )dÈï¼ÙÜl†O8žÐ°±acø|ç¼ÎyKN-90þ¥ñ/´}Øö!À[ou¾ Ʊ%Ç–„Úk¶7×› ’GòIÐÏl~fó3›CßÌì4’Œ$À+§¦š~`Qñ¢b€€ЮV_­8zÿÑûn¸q ðDá €•O¯|:¼i¾l_6€x@<xßÝöî60;Ã}ðKÉåPÙù²óeçGÓ,”}}II÷¹ï À=å÷”‡wréꥫÃkõé`¤©Ž@ÀŠŠññÀÀ…V€‹YöXÙce9ïíC²£Ó¦5Lkàòâïõ÷ûGN¿÷-ô-|ñyñy“L>põÌÕ3G=|pÑÁEá5?¹øÉE€äÕÉ«bÓbÓ€ÀG½õÁæØ9æ%ó¶ŒÊ›?6,—%ŸPKÔµä‡ïåU×TÝ4ºit˜FÉÇG¦?2TwUwEtnmÿÚpОüàI€3?Î Ÿ_ñìŠgcxãðưÖí3†Œ¡P½Ö-­[Z·8üƒ’£ä(9?|/´ÇµÇµÇߨ—§,#3#3#ÓÌòüî»–ïZB²g­<µò@¬+ÖØûŸØÿÀë_? ®W×|yíËk3>ñ)@ÎÖœ­Ç½Ç½€¿eZË4੦ò¦r€Î;ø1¾1¾ÉoLš8i¢å\Úm‚6á½>‘PœPœP,„þ™þ™þYsóÂ/+ÜZ¸Õ¬‘¤VíàÑÁ£p/(]P øe§’Z“Zö½¹ïM€–€´Ô´T€Qù£òŸØ#ö}Úbm1Xï !6ìY¼g1T«YP³Àò;€ µ…ÚÂÌÇËS/-mGLNLNLN×2 vUmVm–=ËyŒ5ß6߯_¿¯ð 77‡KÁžhO¸=þöx Ð{©÷@_O_˜•Þ+Þ+Lg:þ=®‡]ó”s…Ö«õjýÐl%EIQRÞ¨}é\©Ï+Ï+Ï6*ÍJ³Ò,µbýÑ}Ò}È}·£Ýó´yz¤ÙX@À:`à ¾€Ð±ÀÄ{–½Ü^’ROóµÆk1*3)3ÉXêtr¶_Û_[ä •ˆQ¢§‡X D(Ð×—p —šWójÞeq®ÖÆôíéÛDÏrO½§>\»V¥UÞPzéüö9ûà¶Ëír°ç[s¬9¤Û‚¿—w—w›5Î tG¿©ßt¯M~9ùåä—…P‹Ô"µHÙ¤«”˜? ~Î×.k—µËÊ‘ìW³_Í~Uˆ˜ª˜ª˜*÷ZG»EEáÚµj­Z¸qãns›Ûa§úAóAóÁPrrríYÎ]ž““Ø3üµ4*r§•Q[/”¨áéÈqú¨ízö…iwUíª0í&‰FbȺn]·B?Nüí´Óîøöøöøv»ÔÑd‚š &”ÿ)JŠ;¢øâÄOOh QÚ-ýÚ=é>Ò®qÒ8iœtƒÉƒÉƒÉ0©Rÿ¤~s¢£Å½Ú^mï;yRjAéEÞ#îb!™àÇ´»%}Kú#ÑÓìiö4è—¤µGjÔ ½vôF½Qolþ%‰ÿ[TÝà¼}7Àh“åAíþ1íΜ;sî̹!íºóÜyî<þ<²n;;¡T(JEá‘eÔÛQuñ_ÚÝ´;C«×êµú®G%pE]E]Eýö”á)ÃS†¯œ­öj^Í[›&v‹Ýb·¾v4OT½8ñ?Z´v×FŽgþSyQyQyÄ1G̱RSÕT5¡E|z:ßáÏð ¡ÕÎjg•ƒó£vîÿf‰ÎS±(Åú…Èå啪­Úª Ê å„râêý#ó¿pGíLgTÞ»nõ¿*Í i1/IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-89-grey.png 644 233 144 6312 14774263775 16024 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—kPTW¶ÇÿûœÓôK F‚C4Ýi@ô:<”I$¼ÄQ¢¢Qc|͈šàÈ`šT®($f´BÐɽ12¨2Õ*Lজ€£dºGËC@”gC7Ý}úìù`Rå­TÖ—]ûœ³ÿë·×^gïµI^^^^^<ðØ&7Ì*®—ëåzi]ÞÙ¼³ygéÓº݈ndõóTEUTUð6ïÃûð>Á;¬ÕÖjk5ý§q§I€èD'€Øôci’4IšDr¸¹¹ÿušŒ“q2þÇÒ#ÞG¼x_kÏOÉOÉO!üšWójÿ˜Chvry0s€áG8S&è šm3¶ÛÌ‚]®FWSÖo¶ Û†õÿ4/7/7/~WyByByµÁ±Á±Á±$'T* •!ž!ž!ž€ØߋߋãE½9}§?Ñ¿È#òqξDݨuÞ é$¤«O°jVͪoœ™97snæÜ³ž^z/½—Þq0¶3¶3¶“±‚ A’(Í‘æHs`Æ{xïA3Ì0HE*R,ÄB,„Ùêkõµú"ÑÐdh24Qûõ€ëׄƒ£q£q£qÛŠj…Z¡þÌ‘îHw¤Çœ 4ƒfô¾A@@À¼Drgsgsg4¡ M¾®\5WÍU7•Û,6‹Íòl‚æeÍËš—ùðä=É{’÷pe&“‡ H ¼pG¸#ÜG"H‰0ó0<€ILb b!ð @7á:á:ኞ‹§.žºxŠ£çÛžo{¾ånºÈ]ä.ò¾«|ŸÄ'ElA"1`bä­òVy+ yZò´äéÿþ‡ùªùªùê³ šµšµšµ|bFJFJF wÓ}¹ûr÷å˜/, Øa‡ÓÅt1]Žã8Žä>¹OîÄLÌÄ,éZº–®Ü·ºouߊù¢¾fffŸ(úyD>†Ÿæ§ùéø[•­ÊV•ò[¯d¯d¯dªM¾”|)ù'æÈ´ÐB 7 bƒ€u‘u‘uÀ»ò®¼+@Þ"o‘·lÂ&lЇ>ôXƒ5XXìaÖ0€ÎÒY:  …(„›¨Ÿ\›\›\Ë•y­÷ZﵞjE‘£4€|°Á®´+íJ êè£>D¬G½G½G=\œB S‚)Á””ï+ßW¾x { { \f]f]f„ 7n!B.„\Æ2Æ2Æ2€Š†Š†Š`èÊЕ¡+€R¯Ô+õ@—Ä%q@ ¸y|áñ…Ç0GÅFÅFÅ"ö¢î¢î¢øJ|%¾l`x-¯åµ+2UTTðñÒˆ¥K#H vb'vÎB¯Ô+õJ`¼g¼g¼ÈÜž¹=s;°"lEØŠ0 ª©ª©ª 0™‹ÌEÀ壗^> ˜ûÌ}æ>`džvl–”/)_R”‡”‡”‡¦\S®)Wô— ì ì lR"òˆ|ŒuÌ:fÃ_..\\ˆy®;}ðòò|]|]|]IcÒ˜ÉÉÉ`#ð`òÁäƒI *;*;*X¸(pQ #þFü @(Š„"Àøœñ9ãss œ"^¯ˆ‡Yäù|„ð `*˜ ¦bn€>ðÏ\ÑŸEýÐ3Ð3Ð3øøø¥¥¥€¶WÛ«íÔÕÕw‰»Ä]|ßø}ã÷€-Äb n/¸½àöÀ|ß|ß|pÜtÜtÜÄ“&e¶3Û™í¾Ä—ø’0¬ëÃúпM…M…M…áÃÇð1`Ù[ì-ö¨8òV÷­î[Ý€o¤o¤o$»7voì^àÅ}/î{qЛݛݛ ŒªFU£* ­2­2­˜~súÍé7ã†ã†ã ùPó¡æC€Ä!qHµQµÍŠþØ™Û3·gnã£a4Œ†þ“Ê e…|ñ=ï{Þ÷¼¹¿´­h[Ѷ‚ä„ìÙ²K¢%Ñ’E‹©ÅÔb6†o ß„~úIè'ÀÒæ¥ÍK›Ö3­gZÏ€ß~¿ý~ûm£ÛF·ÞEÞEÞEÀè+£¯Œ¾œTŸTŸT®*W•« ÀWø _Áb­ŸÖOëŸÍˆiii§Ññññ¤¾MߦoƒÚŸ²?e „ eCÙP€ÝÈnd7xïàŸO*j¢&jlŸÚ>µ} p]\×°gÙ³ìY˜XýÃêVcó¹–s-çZðwy·¼[Þ=GYÊR6x3–` –ÜÝÉ0§™ÓÌi¶•9ÆcŽ þA躅ît›âšâšâд¾i}Ózú‚!ÚmˆÆyRJJI),A"H€ cÃØ0€ÒBZø3 âx€x/âHïHïHïÌN™cb ¨­ª­ª­â5’vI»¤ SdŠLÈJ²’¬¼»Å(F1çËFFFFFFÒ/ƒÄp0¹L.“Û“ÍÄ1qLÜT°ãããPüþ¡þ¡þ!~UPkPkP+ó'y¾<_ž)ZOëi=¤$“d’̹3HA Ræª'PJ)¥°’8Gâ ¼ŒË¸ ÇÞ+½Wz¯pŸ)R©ŠÔóù~S~S~Sï~5š:š:šJÊa„FëQ%úÑ~¾YÈB©~¾òùÊç+‹_“eÊ2e™çóǽƽƽ¸‰‹ž=/z:8ǹáá¬0À+¬°þ¼!Òt'Ý J H)€ô;ãwÆïŒ4º¥®¥®¥Ž-Vz+½•Þ³¶2[™­,ûhû‘ö#íGj¤Fj„»SækÔìl+„yÂN½Yg*~îœf¼xqæÎ+‰ÔÙuÆ„-†zèH8 'áѯ=¾rܸlßeßeß%ü~›°MØ&0«‚Ž :†$¡Cè: `–0K˜%°ò9|Ÿé)¿S~§üþÃ+‡W¯d»dËdËdËŠ÷ø§9xS(J„îsçÊþA\±üüüüü|L‰…óunIŽï<Üçä9AN4T1QLu°È@óç{½ÆÎïš(((…‚a†a0)FâšåšåšE0” ” ”°]²Ã²Ã²ÃíµÖAë uðpQך®5]k' F¬ÖD@‘oô `ñ…Sàÿœ¹{ùÿå®Ï¸Ï¸7q!ïBÞ…<ÇøÃþp7x< žøß¦Ö¦Ö¦Vò†¢CÑ¡è 4¿oæ¶r[¹­–µ¡ÚPm(3æô÷ª³µ<ÉÅâìñnÞÙ5PêB]ÈîáÀáÀá@üc‘c‘cÑ?y©Vª•j7þù§˜Ÿb~Šñ¬œ¸;qwâ.=ÞöuÛ×m_;^š¶OÛ§íl–d•d•dÕ;¾´”–ÒÒ¿ÖB )¤lÆ0†1a¡¸Î@ñOòüŠýBîêP‡:Ô9ŽÐjZM«#»™KÌ%æR£vvÝìºÙuB ¤DR")aî²l›qý[¿K~—ü.­Ž4v»Ý¤^X ,Ð3NÝ' ù—8üŠ=‘»ÎíÂq{°{¸‘’BRþáGëh­ûcª|±|±|1s—ígûÙþÁÅBP ìêØÒ±¥c ðZ§žXXZ~ã?tµÿˆW¤ÉIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-64-red.png 644 233 144 4177 14774263775 15630 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü4IDATXí—{L•÷ÇïEñ†—z˜1n݆ÅUk]ñÚŒš€ Ö(4Wãl'JiSkÃk ®¨;¬ÙhŠçXÓ #N]Y+jº¸9m×ÊtpN,6VPá9xð½|öç÷žKÚše{þá}~—çù¼Ïóý½¿ƒ#6^Ä™údŠ7Å›âU#iÉ-É-É-+ê¦nêæ•ß‹¹b®˜ #Óön¡ ]èÒ‡xßÞ-×Ëý2žŒŸO}2ž'–o«Ø*¶ªžøù©?Ö[ô½ÅsGÙ¦lS¶9 é&LàÏÅÅŰæ«5_­ù JòJòJò¢¾œ—ëå~OÆ—ù¾ŸG¨?÷gíWƒjP úçÊ Í¨˜Q1£Â|ñÈ…#Ž\°Gnnn!îq{€?~püȼ\/÷Ëx2~|¾Yû¿ŸO¸Æª=jÚã?-äµçµçµw?èw‡é&bv¶=Éž„aÖF#˜¹æLs&˜…f‘Yf®9ÏœfYcÖ€mgÛÙr÷ƒîëÝ×é–ñà¸ü®±šâQ<ŠG½V¯Õk›®Ê ù»ówæï4 °—­ ÖFSødø$Ø~¾à `˜OùÀÚlm,ºèÀĆ#ûý–ËrÑdµÆ‚ý2?wþ¡üCF¡Ì/y$ŸHºžt=éú/~&¸v¹v¹vÙ³}}¾>_ý‘8ó-£Ê¨à¾ÁÓÁÓC ‡kYdÅù¹äV³`ðêàU0ßllrÖ|}¾_ ý2¿äqøô-ú}Ë¥Z9q°ü೟µ7E„ ÑitX=VÞ¼zój9VúGúGûï?ËgÖ›õ±þ×ã¿„§dLÉ8Ü{¸ OÜK…–,?Xnor*Ç'ìÞ‰s&Ι8‡ÝwVÜYqgÓ™ŽA¦|çz³ÞŒ<“v& À}À} vürçåN¾ÅÊæ—ÍY8Üp¸œøØ¦mbÈü’GòIÐßÕÕE+2»ÉÆd W->±øÀ¦‚Ma-¬Üh¿ÑpÊ l¥X)¶ÛvƒYÞw­/zhBGƒŸÇÇÓÎZ§Ö©u÷W(Ó•éÊôŸIÔþé\©eJ™R¶¼AiVš•f©ë×Þ6ï ï ¼Žv«Ìóæù‘bcaëë.s¢µ¹JíeösösÑúö4÷4ô4@æ¨Ì1™cŒ-N%wj;µÕùZ¡(…º+ʺD,KôÂ#<Â#„Ö«õj½/þɹZ\û]ûtß+¾:_]¬v­ «"¶ ØØ@ˆA/ïñØkí*»Š°\¶þïë箟kV97Ð=ý¶~ÛûÆ´Êi•Ó*…PóÕ|5_y?BW.1ÇDþ®Õº´.­KiýÒì—f¿$DRERER…÷ G»Kò—ä/‰Õ®UmUÆ‹/p—»Ür›ššFëë^à^à^`/sîòô¤ô¤ôžû‘_K£â;­œMh½PÜóñ¾kÔˆv}ïÇh·¦º&F»éFº‘²nZ7­›Q-vÐAxS;R;R;ìbG“ijšš¶îõ)HàKß? ¹´[ü-Úmó¶Eµk´mF›š64mhd d d ˜?r´xL;¦ûÝ")µˆôlj‡Xt ð]ÚÝãÚãÚc¤ûš};f L˜0’´ºµºµº5úÙÑô½¡#ò/IêßòFÆÅè‡&šÜ°.¢Ý“ߥݥ«–®Zº*ª]ï"ï"ï"þ82o;PJ•R¥tùŽø4êÝ„¼Šø/íaÚ}R«Óê´:®.ÝUº«t—½7{8{8{Øø—Óê^­Wë­ž!šD“h‘ÏŽæKÈ—"þGKÔîñþÒ+” Ê+ÅJ±Òú‰úˆúˆú(BŠøëùÌPf(3$„vI»¤]RþÙ¸6¡sÿ7Kwž D(ЯÆO¿R®Úª­Ú œUÎ*goü`dü‡Þ„Ît'Ä}h«ÿ8oÚ—ìâ-·IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-39.6.png 644 233 144 3244 14774263776 15056 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜYIDATHÇÍ–íOTgÆï™ÂàøFF7ìb$Õ áE4P-Ù-e¡‘—ZÉ7¾tI$6n©~aÍZÝn¢ØXŠ‘¶‹ÛBÔ"‹P"/[·t‹¶llqµŒ|·2ÂÐQq`Îs~ûaæ0“í?àùrrÝÏ}_×5sιžG@DDïæ%æ%æylÞªGçGç/k àz L¥¦ÒË¿‡ùuóë6-lRÎ6Öþðy‘¸žQ—*D‰:cÊâw ,¹,9zQ× €µÝÚþÈot¼Ñp¶ùl3•pwðî ÀDöD6„°±nôó_8¿¼óú"ùyäç¦Qˆz&êXš·4ïÙ]׳PôJÑ+·,·,º´1À†Mϼx1.w6ÖƒýƼÁgðz†~À€ý%ûK"/ö{¬ç'ÔV}Tõèÿ˜içcê©ÇšI3Gý¿Ÿ~IÕªZà¬Þ®·èßêß>Í¡9ðÂ?´Ð@6ýïA¾÷ªŽU3 :?¡¾x²xÒÚöl{vè™ïGrùùÆ´i gÌ| \ãè*FÅ0£oÒ3õLt=KÏÕsgÿ)t‹nÑ-@!„êTQB º:§½¯½Ï 0Î8蛂üqS7¦ä†=J‘¤ZþfýÔú©7\K\K`æ …cëï5ßkæ±½—WHoºuºuºÜ}î>w¨5¢F 2È`úáÙÿ2ŒýîÞ¥{—x<ó|€\i®4 ÏzÒzÒaøÝ$"RÿìÔvjàÙÇ8ã*íWk_\ùâJXðÞ‚S N¡—ý·ÌYæ÷>÷>÷>(8Tp¨àÄXb,1pìuìu쪩¦ØÍnv‡ŒmÙryËe°í°í·íGÿåÖ½µî-/SÕE••ɕɠ®üˆ?ODä_UÐócÏÐl>÷ݹïômëæetdtàsgº“ÝÉ›› ŽjGµ£òžä=É{Nõ¤zR=Ðr¤åHË‘P½;¿;¿;âÏÇŸ?ÃÿþrøKøíŸ¶'nOÄ÷õϮܽrWß«;Wƒ6ðcŽøl^ǼŽU™òjò±äc"¿QE)E)¦Æž£ý]ý]U’Z’Y’)ò(öQì£X‘œÜœÜœ\‘{nì¹±G¤eQË¢–E"×ç_Ÿ}¾ÈƒÕV?X-³×XáXáX¡È}×}×}—HÑᢺ¢:‘»7ˆú!J¢RËê–Õ™E2ofÞ13÷ìܳ«2Íœ4yLVJûÜœ¹9"—µïw~¿S ?ŽŽéJïZÓµFdŽš£æ(µ\-WËE*Ë*Ë*ËD:K;K;KEÌÍÍEbúcúcúCƦ¦¦DVYVYVYDF?mmÿϸ6®‰œøwà /È‘ÅQ6)—rVšõ¿j[µ­¦+"‘]‘]"CCw†îˆ½ÜSþMù7"‘">§ÏésЏ ]…®B‘ÎíÛ;·‹¬ï]ß»¾WdñÂÅ /I·§ÛÓí"ͪY5+‘Ä ‰/ˆ¸ÛÜmî6‘Æ«ÎF§Èí‘[Ý·ºE–þ:ávÂm±‹LõLõˆ˜ºõ ½ÂtE¨ ¾c½­§[OÏ~üÛþ½ÿÌþ3øÖ\Y3´fN<<ñðÄÃлSS\S\S é‰é‰é‰Ð—Ý—Ý— ^»×îµÃ†ú õêÁ“åÉòdÁ)Û)Û)d83†2†àÏQ §Nã3ôøKk]kÐðŒ‹ú¯ b[Å6 @¥¡kojo†bŠŒ2 lb›€I&™ ‹‡&šh’H")¬GqÀq>àƒ0>§f×ì@uPŠ€éàWÉÕ`Ža½j½êàѵ#kAÛÈíÀtût;Õ2õºz8ÎQŽ‚6©Mj“ ­ÐVh+@V‡Õa ‡z@SšÒð!µÔ‚JR›ÕfÐvL7N7òXes¬w乑ç¬×¬×¼Ü æØO’Ÿ×¢_‹ô`2?ѾоP[ÕVff±Î4Ó€'„Å:0‰·Áƒ>;?Ëgì,A½Ÿ&p¯¤ÄQâÛ+y;þíøY‚và]ÞÅ~¯ß  mÖ6ã}@À„ BØX7úyƒÏà7ô ý€Ÿ§ùtñԞǞÎìÿPcÄñtº©ûIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-29.3.png 644 233 144 3225 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜJIDATHÇÍ–ýOTWÇŸZã€Ù]´M/‘4šÍ¤ÄØ– [ÞºØ5B¶ÑíÆd,¦ë²‘5M T ØTÖ:,,ƶ0¾ tÄĤ¡‹&E’*˜defî=Ÿýaæ2ìnÿÏ/wž·ïóóÜû=G@DDÂO¨UQ«¢–…ì¨ßGüKv,Ù±æ\È>¥émÓÛwþñ'ãOX›¬Mú݈mÄüÅõ"üÅý ¿$HÄ{!ö‚)+lWû¯¾ûê’¤]wÌ控Axÿ›÷¿honoæ0~sü&ÀTÖTDl#näõÞb|©þŸþ"ðB× ]¦ûûbì‹"ðRöKÙ¯% ¿o¼ðSôOÑ* 4GœÊf™ÅXÞE¶çõžoô3ú‡ø$f&fŠðE¡¯Ðgv„ î¶ð÷ŠæŠfP}sŠSÄfÒLÀ‰ /èïõz½hWª@}¯¾üZ‰V‚‚SÁ) ŽÓœ&N}Æ;[q¡â‚Aðn ÿ(ôú̓ü÷l?{ƒõÅ[‹·‚ÚpOy Ê©7è ô‡z¿ÞR…ªD•,ì*ZE«hàM²ÉŽø1«q5ŽRoêkõµ€'<ÆÏ+./.7~öÆ¢QŠˆl¨§Çü•ù«Ù^;¼ïð[ÏÆ‰O'>e.°5°?°?ÒoþÌü™ù3àíõöz{AwënݽˆPM4EÌÀ'gÀ žßL4O43ü[ܳîY`ÀÜnnŸ1øˆ²‹ˆœê‡j?¨…™èiyÿÌ9›s–\vbÙ TæÝÌÁÌA=?z~ô<ä­Ì[™·ÌÕæjs5”T–T–T‚êS}¡ñ‡–Ïî³ûì°}ÓöÔí©`m°¶[ÛQÅ…u…u0ÿE¨ìŸÞ? ª3ÄG‚¿ù®z,=h®ræ9óTùúÄ5×\Äo4È? ÿ¤v¦v¦vB~i~i~i„€ÍgóÙ|Ð:×:×:ñ;®;®;®CÆŠŒ+`jnÊ;å…_Z“;“;ñ÷'ßyxç¡*§r*ÐêB|¢b¢,?Z~L·‹¤¥‰ä l1m1™WnõMöMJl÷Ÿ»?êþHäQâ£ÄG‰"¹Ûr·ån[>¶|l¹HËhËh˨ÈXüXüX¼ÈLåLåL¥,¬²š²š²‘î¶î¶î6‘¢CEGŠŽˆø‚ž Gb7üuUϪ“Cäµ-¯m‰ X²-Ùév¡=árÂe}ˆßyí^{ä³?dþðɇO }(}(}îܸê°:¬CÕLÕLÕ ìº·ëÞ®{`uY]V888Dvl°j°j° \ ®Wør|9¾H}gcæÆLhþõ¹–s-xA¿¤_m»%ß’¯Eé?š†¤}éøÒqçÝÃÝÃ’Xó¬ÎRgÙ}rwýîzOœ'Î'âp9\—ÈÕŒ«W3D2ý™þL¿H²5Ùšl±•ÚJm¥"mmm"×’®%]KÙ{lï±½ÇDú—ö›ûÍ"S˜ÊžÊ‰N8”pHEüsþ9Ù£,ÊbíOÆ;æ,u–ÂÅ¡[­·ZUùŽ÷^÷¿îÇŸû¯ÜÛ¹·Á–bK±¥À•É+“W&¡ÑÞho´ƒ­ÑÖhk„Þ¬Þ¬Þ,˜™™‚‘‚‘‚ð¬ó¬ó¬ƒg³Æ ›lvovƒcòôñÓÇwX•Óöuã×ÀùŸ°\œê‡}9ûrŒèi ]Ò.:yŒZ˜ .`Œ1Æ~FÒH#m‘¿ƒ:E€@Dö¸§%j‰Àq£ß¾£ûŽóᯒö°Žav›Ý³1ê[÷&÷&Ð> éŒ64?=?֠͜ÝÖnƒúR}®>=IOÒ“@[­­ÖVƒ^«×êµ@]tEâ¬çe^­A»©ÝíÈ|÷|7sú/Â:ÖëÞàÞ`1ÌÆð0¬cÿ§üó;M;MÀdX™}ZÖ<Öóõü…­ üÛÏ3ž-Ú!…†LãÅÎ…ÒËô2<Ó.k—d×;cwÆþ¬ò‡ÏJŠJŠJ•L9˜²Ð|ÌÇÄAp68  íÑöàuCÝÀ„ "¶7òzÏÀ7úýÎÊçövñÜÞÇžÏìþùRL*ÉIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-89-red.png 644 233 144 4243 14774263775 15631 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜXIDATXí—{L\UÇϽw …ÅN‹1T\[ºt°(µ‰å5]lbcÐ>h„°ÚnÒm«¢©Å¶«’b«5%}Šº±Ad¬ºÖhز›*mú2–„¤0Tij ´f˜{ïgÿ`ÎGV›Íîß=¿ÇgÎï{Ï!¦m¶ˆ2uÙ ÷ ÷ ·ò¯Ðƒ¤øöøöøöåKlºM·éß9"GäÀô²¹[Ø„MؤѾ¹[ÆË|YOÖî§.‹æ‰äÛ"¶ˆ-j[ôzÊB[»­ÝÖÞvSyAyAyÁ±'{“½É^¾Zyeå••Wà韞þé韠<¿<¿íÏ; Žª£êè@ŽÜ¡´ª´ª´*ý¥æ®æ®æ.3Ñ7âñãŒ1Æ0À`ù¡u/óe=Y?ºß¼¿Î'w©ƒê :8ðµ,ÿMþ7ùßéŸê÷÷ûé'df–9ËœEPßü*øè‹õ=ô2ýqýqÐëzè;ôyú<0³Ì3 Ì—õd} 8ª¿ã. MiSÚ”6!l»l»l»Z¾“ ®Ý®ZWm°Ì{EïÒ»ð[¦J§JÁ-¨¤ÀxÌx 0¬Œæ `´-áø`‹Þ¢·€ùŠ‘l$ã“Ѯݮí®íÁ2Ù_òH>÷cÜq?þá!à¨sÔ9êÌ Ï Ïˆg„Û¡:>ýmýœ~@OПw£w#ÀäþÉýD˜ù™ùW¹  çê¹€ÏÛèm˜jšjýmãšqÍJòynx ÁmGc§c§™!y,>Û&Û&Û¦î]ráPå¡ÊC•æ†Pñ`›¬5xxð0àdë#[aúµHMxï‹÷¾ˆþ!燀ÜÌÜ̈xÿÝÛïÞÐ~©ý„ëO÷;Tyhõ¡Õækg£ø„9œ¼(yQò"vß\~³øf1 $$]þæêõÕëÒÎ¥8Ós¦àÕîW»f^šy `èÄÐ ×÷®ïî/¾¿àÔ3§žXß¿¾ð%¾–ø~mÛµmhðæòŸßø$ä“ {ž|çÉwž|'üËôþÀžÀ`X>Z~jù)€%ÙK²#7¡£££ ~Oü€®Ä®D{½½ ùzóõÈxï¤w@ÉR²€á#®#.Ðû#c—<’/ʱò‹åË/Zº^88™{ºútuäÈïé¼§3ÒêÊSW"ã£ÎQ€GSMðv{»öß·ÿ¾ˆ¼ÑÃñ‡ãAߪ—ç–ç–çZçö1¹£K–4,i oR™82qø”y“?ÊÑWm¬Úð@LJ XóÁš ̼5qk@{H{ð7m:5Ê Þ "Cd4¬mX г°g!ÀYçY'ÀdÉd ì)ê) ï¨~ôØücóÃýþ¹÷DÞ‰³¨4µ4 saæBÀü2þËx€mïo{@éQzzJzJ*/W^HiKi8Ý|º/û°ìCà ç瀀#àÀ?޳3,ªu¾ë|×°.-EKÑRšn‹¤’¤’¤!l'm'm'[­¿¼è£¢ô%©Q3`˜øqãR›öùöùÖX¹ÓC;‡vœ/8øBñ·_;¿£éÂÁ ã®:÷ì¾g÷ãàóÚóÚó=«¦ýùÖKK;———=ðL¨ÙQ³ fYdsôëúuLKK|--‘€æ9áúcÀ·Ø·ôJÿUÿÕð¨?ýxïÇ{yºBëÕzµ~r¹r¯r¯rïÍ1€ÚëJ]§¬SÖ7*­J«Ò*µbüÙÝé^í^ÛÒî‹ú¤> ÀÎ~#ÝHä5šÌÙæl0‹ÌOÍOÃRl|kð-HŸ™®¥kÁMÖN¾¡½®½^ã²ÐÊD™(³9¬¢@ØÞm¢M´ ¡ kÃÚðK_XWk£ã€ã@ÐîÙê©õÔFj×XgDŽÜ$Hùn–± ÌUFž‘‡_†­=»öüÚóú‹Ö 4f³¹ßœ»yîæ¹›…P]ªKu)GCt•ó7¡ÏUZŸÖ§õ)Ç3^Îx9ãe!âªâªâªÜoZÚ-p¸ "µkÔ5øqãÆ Üâ·"ÄL=SÏ k±!¯!¯!Ï,²îr{œ=Î>8úkifô¤•Ž˜Ñ %Æý6Úw̜֮çh„vwÔìˆÐ®=hÚÃ@ÆÏÆÏÆÏa-öÒK/¸zzzÍ•–&“Ô$5iÍ_b¤x0†o†øõZCŒvWþívº;ÃÚ v;ƒáWibîÄ܉¹àô:½N¯þ;K‹ŸhŸhŸì[*¥’^,à,q È¿¤Ý½Ž½Ž½A»§ÕÓêiüøñ㕤5ÇkŽ×;¶F[£­±7ô/I™˜¾¡ç"ñN€±&Ö„´û·_ÒnáŠÂ…+ÂÚu/u/u/åÈôºiMB©P*”ŠâÚè6ê­˜¾Šø/íNÚ]¦ÕkõZýÀb \QWQWQg¾›È d‚—¬QkÃÚpMšh-¢E„ŽÍÓo†ø-V»oFû…?(ÕJµR ¢T”ŠRã÷jªšª¦‚"¡ˆ|›>ž>ž>.„Ö­ukÝÊßC‰«b&÷3»õ­D”ˆÛwÑË[+US5U”¥Cé¸vßôóî˜ÉôÇÔ½ã¨ÿ 8ÁG–ƒ-IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-0.5.png 644 233 144 2576 14774263775 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü3IDATHÇÍ–]HTiÇŸ™Ér˜èÃ5L$SX‹±!Û‚Ma&‹¢B+f+Ыܾ‰ ¶ö"VÁ éb%زC©¶U ›ÂdA¤Ú6i‰–] †ÍL¢a4‹qXÛñ|ýöbÎ;sªõ¾÷fæyÞçùÿÿçýøŸ# "" ì_w¡»Ð=/»¿Îæs7ånZös:n7ÀµÃµã¯ïaþÙùgv-ì2Ÿfc5¯êý"Y|'ŸÊËÉ&æ\sÕ²ãfØåßåÏ]”ޏÞëÞëÿè°¯w_/Àµ‹×.rb÷c÷Þ†Þ† «yU¯úž_š?àœ[9·\#0göœÙ"P´±hcñÑtÁßÅP³µf+ÀKÏKåc˜Ë\+$I¢ÆkG¬æízÕ¯ð¾âSüi=ùÁü lß³}·3Ýðô'ôãÇ Ÿv œàs­?´WÚ+ ×˜eÌ"Öcë1nÜÀ[ë†u,Cß©ï$e½ÒÆ´1°ÆÒýüfãaã6_†?­GÞßÛÖ haOØ“ô+G£̘~V?‹fOX–Çœ2§€ýìg?Ù‘´WLGËTƒà˜ 3áÀ'œÎS+غÁ±•""ŸÿÞ˜7–œ…MES~2¶€¶ÂLM/™Þ4½ &Š&O,Ëoù-? K³4KƒÉêÉêÉjˆÿ¿¿ ãß_¿†oúÐô!¦ìò-<Š>Œ>„ ¿­ÇÖ~4hΘ^êOõ§Y¾†XÃHÃx{¼=Þ¨¨¨øXX¢.Q—¨ƒ¢á¢á¢aXÞ´¼iy”ÊËÊËàÉgOÊŸ”c©zsÜæSü¶[Ø£o¡;Ñ#`íµûR‘®H[¤ V”­([QckÇÖŽ­…ÒS¥§JOA¤1ÒiÌ {þìù³çÏ`陥g–ž–ö–ö–vˆE‡¢CŽ'øJ§¿#EBñ¥ù•yƒó­««ˆU€±þý8ç;ç=ç…Pe¨2T™Í¯¬¬@ë`ë`ë`6ßìö¡ôréåÒËPõ¦êMÕ(i.i.i†á/†W¯vlýõ/ͯô¸E<5žVˆäÜȹ!"šˆˆLØGP½ÖŒ®]3 WН_)vœ‘Z}RŸ$Åï3ž±neJÝ#ßÈ‚ÔSÅe.pÁÜA€?NÛbˆ!ÀÄÄtä裨á0‡±Àð>H{ÝŒ·ÒácfT‹j€¡|Ìo‚m¯mïƒï!ýlúY€…Í ›­Gq[Çu~b½H?‘OûeÄŽvG»msÔ®ƒ}…û S>ØýÚ™Úù·‡»wt´t´ð-LÜ™¸0½yz3Äm×ùº^ã%âKÝ;ü"|=ùºí8>u|*˶-Û¶â»HÂÓàÝåÝ0–4–¤ì`þ¤‘¦6³Ì¢×ë[Ç£ùº^ãi|ͧù#z²J²JD ¬¢¬"õB¤àÑ%Œš%5K4_¸“sãiênøeø%pÁð~‚ ¨Àœ ©€z¨?oŒ7ÕýðÓðS ›ã'-†gjü(_Œ?¢GþÝÛ“[™+—r‰ à ã¾qT®q׸K8P*S%«d`«XE|UQEXÖcëqÌ«T’Ñmt¦ÊÌ5sðÃåIåIZàÉ­ ­É? ©©³ŸÀ¨9j?°T«j%êM…¦Àçõm÷m£Ð(4 5ÒHcÜ å„rB90¹l2{2T¡ªPV—ÕE€?£øjÔ5 ÎÑvþw8râÈ P/,0Ì0Lßž~>ýµûÍî×»_C¶+ە킲ü²ü²|Á@÷Ö¡‰C‡& µ-µ-µ öÿºÿæþ›ñä£ÃèNi¾¿Öv¯.û/ûÁü@}ö|Ù³¨gäuæuæuÂðáÃÀÕäjr5Á¥7–ÞXÔÕÝÕÝÕ îw»|E¾"_¬lXÙ°²zé ôbéA3¨ù"üZ]dþ­ù·Ö‰”l)Ù"b·‰ˆØ.D;í(¶Ï+ž'â¨uÔ:jE6æmÌÛ˜'’>’>’>"âò y†$¶ÆÆÆDœ§Çéq:ƒ"¹¹¹"Ï>{æ|挥;d›æ‹ðk=v‘$o’·HrOrˆ:!""“ºòÊ­+}WúD2‹2‹2‹DüµþZ­ˆšSsjN¤½º½º½:.ÌÖgë³õ‰nÃm¸ãþpV8+œ%’òUJEJEÜ/éš/¯õØE¬kÖ5Ûˆˆ±ÇØ#"çDD$K×-ö..]\*òjðÕà«A‘«Î«Î«N‘é™é™é‘´¦´¦´&‘¶Õm«ÛV‹¬‘5²FDÆÖ­[/RWPWPW âð øDJN—œ*9×eÖ|Q~­ç݌ߢ=ßh<7žû­Ï :3ë<ë<ë<Ðâkñµø`ª~ª~ª¼ýÞ~o?̸f\3.èXÞ±¼c9lß0¾azßö¾í}›0 ŒkÆ5‚<ýï콩ÄÔSbŠ)À´ÒŠâ1C %ûñã.q‰K þMlbp‘‹\LðÿÈYÎ…ì` ÌEæ"`î§2á3Fƒ£ññßÉ=Ëm¹ ˜]æó ˜ÇÌ£æQ°ÖZk­µ@)¥”‚•aeX@3Í4ƒUl[Å`®3=¦¬6kØ,«Òª$÷Fãážc '?å)å) '3æmó6€uÐ:H8Ú\„  +afd×£ñÎÖÇð4¾æ{ïäÿÀ]IMNMNÂ] õÔ“Ƭ1 `Vš•Aõ«~lØ në¸Î×õOãð®üh_í{ìã|ÁþWX¸Àº±\›IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-22.8.png 644 233 144 3220 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜEIDATHÇÍ–oLTWÆßhašáS>h¬Ý(ˆÖN"Ä( ²3 ‚ëÚÿ/1t³ÑS»$¶‘±í6 íÖ´ë¢ÄÿÝXl”¡Åº1nc£(aj̪AgF¡R†™sÏo?Ì\†Ýî‡ýèùró¼ç=ÏóÜssŸsDD$5ú°N·N·&G°õ7±zbqbñÏþÁÍ ,+,+®ÿR>Hù`Ê'S>1nư9oöO^/㟬gÖ%Ub…„c Ç,Q\«æ¬š“85‚»ÁvÂvâIªNU8Þz¼•ßÂÀ¥KCCÃæ¼Ùo®7ù&óKÝé‹À3Ÿ?ó¹å$<›ð¬ÌxeÆ+/þ.Òày–;—;îÅÝ‹ÓVP>ÀŽ]#Œ`ÿ$lÎGûÍõ&ŸÉoê™ú?éùéù"( ”l# næÃm­ÛZAw„NðÍ4c%J€÷ÃÃáa‚úc±Ø¥wé]úº¾Œ©Õj5A…‡€|ÄGØõ×Q¾¶míÛÚMƒ7óii°4h;hú‘ÿü¶{‹È¬È«ÈêF}ÊxÏx1b|k|‹Ö¿×;õΉB×êZ] úª¾¢¯Äê¤èGúZOWJ)B|¶(ÿü gÅÄî-šô)ED~þ>¶6[ÛH&Oý2õK£—r®?7öÛï°mÿaûàXàXàX=U=U=U1Áí•Û+·W‚c§c§c'\J¿”~)ŸŒý·ößÚ oZ¼iñ¦X}Þ†—œ/9áχZR[RñƒîÓ} ¦$ÍHšaôÆß…w‡w[zãŽ?7ðÜ€dùî ÏIÿÓXãìÆÙ" ëZZD¿ EššššššDöÙ÷Ù÷ÙEê ê ê DîVÞ­¼[)bm¶6[›EnŸ¾}úöi‘Ä´Ä´Ä4‘û[îo¹¿E¤Cw†ˆÿª¯Ý×.’q2#3#SÒeÍØã±Ç"ò¶ÎÑ9–^Q[EDþ¹ ά;³þÞ{ù³ËŸéÅ¿.  o*~µøUX”¼(yQ2ÔdÖdÖdB…·Â[á…¥9Ks–æÀüøùñóãáðªÃ«¯‚ÊòÊòÊrðVy«¼Uв£eGËȱçXs¬ð—pËÇ-Œ†ÍF®é>Ò Šø‰ÆEóW°¹ds‰¹ÑƵ·‹§ö>ötÞ`ÿ î Ó‰RfÅIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-45.png 644 233 144 2512 14774263775 14703 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÿIDATHÇÍ–]H”YÇŸ™©Õi¦Ì]Ý›„Y/6ÃŒD–Â3Ú¢ìĘ̈m£‘ˆˆ†…`½ð¢bÛ$–„"(ìà ËÈéƒrc¡òf Ù¾ ÓÊqhô=çüöbæw,Úö²sóò<çyþÿÿyÎ9Ï{DDdzâ+à¸îiqÛý“ãO_’¾ä›Æ¸}Lkµkõß¿@ÆÑŒ£™§2O野mÏÛñ©ù"~*Ÿí—éâ8ÒšÒš\% »Öå¯ËOÏŽÛ¿ÝïeïåQ ¶_Ù~ ¹¡¹Ð{·÷.ÀÛ’·%àØö¼oçÛx©øRû¿LnÜêzi_¤}!9‹swÅþ Še+–¼ð¼ð7¨~Àß”#Œ`ÛžOÄÛù6žoóÙüq=Y‹²‰Àª «6xOÆž…ðÌðL›oü2µÔâ5EM~µz¬bxõ}}€ILÓíºLµÀZ@ÌôŽ&Œ?‰§Â3Â3lÏ:üq=2qo—šô5éIA`Ôu@ïÔ;çÆT›mfÎe”QÀ‚÷*i@7ëfÆA]S×Rð“|6¿¤ úöwðöz{G&A·êVIÀˆêr]N”þ„g,NÛÛÛC¡¡ÐPÈÑ7ìö{¡¯­¯­¯ úîßÝ¿”OªBS` ˆÒ™ÀOòÙüq= aÇîÀŽš56¼žË;ë•õÊY±úRù”ϰoÖ¾YûfÁR³Ô,5À.p[[[ ocÞÆ¼0gsæB×W]þ.¿ƒ§#c=c=)|Iþ¸w¼n…-"Å{‹÷&Ê(®ï$ÝÕæj“1óµñ¿¸ÓbZL èCú><ãÏ@Õ«zU*¬Â* ú{=OÏþÂ`tH‡ˆ&Nþ§úØt~T‡êÐ[õVÆ“+#BˆLèð`ÐhàÝ?‘oãÙøíüÿó_ ûÙ¬k@UªJb`n›Û¸pcÛóv¼oãÙøýW~¶¯‹Ïö=öy¾`ÿ>SEʼÇIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.9.png 644 233 144 3146 14774263776 15055 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýO”WÇÏ RBV+Эi¨/ÝF&KèÒ»²ÅŠvê Ä‚$&ಾ°ÕAÖݤ¸Ë/¥1a«uÙð¢E@°4U#¬$˜bLE‰@»Ý„Ð(/3îĞ繟ýaæapÝ?ÀûË“óöýžçÜ{Ϲ""ø X×Z×Z£ü²õwA}øŽðëšüòY,9–œá?ÁÊOW~ SSgŒeÓnú/ â/ç3õ-AEXKX‹%= WÂû{øK~¹ºlí¶öÿhPÒQÒÐVßVÏAøaà‡€¹ô¹tʦÝô7ãM¼åøRù?ü"ÚÚeùÂ^{A^Íx5ãµÃ~‡ñ×àýÌ÷3&B&B”ôi ’H•¸qc®™e²iø›ñ&ž‰oò™üþ|V¿³ú>Û5¿kÞVëi ÆyÎyÔ?Û©ã<ç‰mZ›к/«,•„ªP  ª‡À=_ÏÇ Úœ6üsœ#RÝ àu8¯9¯™ Ž4pÙâ±ÕšùÈÓ{ûÉ6^ÎMÊMõk€ÅÛÀ$“ ^ÒGôÉ&‰$”Y"µ_©"‚ëñS„5«fQêgº[w³hVÔðð÷äÎ=l&øÉ¶e[)"ò‹®Ûmî0¾v|-,þ€Ó[¬ÿ±vB»¨]\FØO?ýà-ó–yË`aÆ… Ëì•TR}ß-†/†ÃLÏTìT,cÔcUcUÀw¶Û¶Ûîf>¢,""gûá€~@‡ù?3ˬ‘ô›Ô·7½½ b>ŽiŠiBå^ͽœ{<ýž~O°ÂYá¬pB†+Õáâ™åºäºäºïÉßD|11‚Ê?‘W–WŒIPÚ[Ú Dùó-CD䮺]Ý.¨·v~Óù*ÞõVÇ[xçÔ}¨ûÈÖ][³·f‹¬š]5¸jP$­<-:-ZV‹,ä-ä‰X_fˆ!ËC¡:pÆzš?oþ|© ÿ5ü£–Zð¦¬J±¥Ø v¾v¾vh¦™æàVõé9ÒsNúNúNúÀëóú¼>ÈNÊNÊN‚ÙôÙôÙt¨qÔ8j¼-ysòfø2·ÓÓéÁkò©¶¦º¦:à_æü•¥Å¥ÅÀ—[¢ô2½ ÐÐу}ËðÃÚ]í®vŒ£ÃèNsšÓ rTŽÊYvÈz饸7ßòí’VQ§kã€}éVž-= ¸·’G>†í‘í‘{KKý¸¿ÏèU¾«¾«xŒŸÃ´=]1Õ¦ÚT§ŒSÆ)`˜a†Á°Và ¢„Ð}ÆëÆë ¿á«ðUà1Ž.õ±”±@³ÚFÝ+xècÏt~òÂóÂÁ_£ÅÛ<Ñoè7Œ"£ˆÅ¥? ðáÅ <æ16,0Í´‰ƒBâ½&ž9YòÂòÂþoçÌJùŽüe³’òWÊ_Yhª¨"4·æÐ õB¼ úT,”M»éoÆ›x&¾Égò/ÍÊçöuñܾǞÏìþV›¼ßSIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-32.0.png 644 233 144 3220 14774263776 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜEIDATHÇÍ–íOTgÆï3 2CÒˆÁîj%pí”ࢢ DÆjpWc5V£ŽÝÔ’°Y6¿4qy‰š~€Án×¢éÒÒ@#ñ%%ЩÝÚ®vZ—ŠÝ%ŒXA—ñÌ™ç·f3»ý|¾œ\÷ËuÝçy¹ŸG@DD’Â_Ë"Ë"Kb[Dì¶"[Ñ’Bø”Úvm»ç<÷Îsï<ßø|cðn›~3>:_$­gÚ%I"†¸¶¸6ÍÆ5°+sW¦m~×^{»½}:ÝÝç›Î7ñ[xxýáu€ÇÎÇNˆ`ÓoÆ›ù&_4¿ÔüŸ¾Ä^н¤ýâæÄÍÅoLû](` ¶nÞºÀãQ0 $('0Åæ‹Â¦?oæ›|&¿©gê‡êH.L.áϯN¼:a?J¸ÛL}ECE¨/ôvNsŠS$€!†õÉÀ$~Õ|;ø6P­ªU5€ò(0cì6vã‡ÀãÀcà 4 n†ù.UtUt™Þmæ“mÖmVûY³ùßµ­ÛÀÏv,ß±T>€~ ø@mAº*VÔ”úzS½9;S¨*U¥ª@ýM}­¾ŽØÙÏ:Ö¡‚>£xÀúÃüå;Ží8fX·!j)ED~QO·ýCû‡SVX4°ô£üúÑú›~lâI`} >5õSg'÷O¦‚sç e^ʼ”yàÉðdx2`Ä?âñCgjgjg*dlÉØ’±ºotßè¾á©×ëõzœ{œ{œ{"öõ Î7œoÀ‰“ï¾ÿîûúN}'ŒøîønÕfåmB›À¡µÏ}eî+šxŒï˾/ßÔ“±Æ^䎲Ž×;^ÉŸ“—'âqy\—ˆ7Ç›ãÍiii97}núÜ´HÞê¼Õy«evÄŽ;wZ$à8Žˆ]OÖsõ\[­ÛÖ->‘Ø¡Ø!IÖcöÅìÃaQŒb£XûN$öbìE‘[¿º5|kX’÷Nìýrï—"=žžoz¾QNåTN‘®]'ºNˆ]ytåÑ•".‹ËⲈ õõõŠÜôÞôÞôŠ4Îoœß8_$kAÖ‚¬"Þ5Þ5Þ5"5Ëj–Ö,½6Ú4Ú$âtq‘d‘ ÿ„_D›¦…í;¡6¼Ç:[Z[ZgÉ1[u[uþìƒÙ®l´··Cgigig)I‘ lº¾éú¦ë°ÊºÊºÊ ͕͕͕àªrU¹ªÀ×àkð5ÀùÔó©çS!ïAÞ½¼{pqÒ}Ò}¿©ÇÏ[Z€ÛæÃ<•¥%¥%Àåð)QF¹9]Š¿ó-ß­´ÒÙ+QØß” B ¿ÐHcßé@ x)¬Gé{¥ï“¡z4úÃ}c©½ßÞÿ× i¸S|§xn øô¾ô>Ù,1úÇúÇò‰Öo´J¼æÐ&´ õ¢JWé"’#9’#"·å¶Ü±ôZz-½"xðà±[öZöŠ¨Ô€!`¤)òí÷s*çTÊNËî—^–ËbÉrg¹ÿ+OfÒgÒsþøÓÎÏk¶×l€ wæã3ã3€`I°§á?g„à1ãŒãᯟf€I|ø€`8~6ßä3o–°ÞO;ø®dÛîm»£îJ/<¼p– =ÜË 0˜0\† ?¨«ê*D°é7ãÍ|“Ïä7õLýÙ»ò™}]<³ï±góû_&pÁrªtÆIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-32.png 644 233 144 2620 14774263775 14677 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜEIDATHÇÍ–[hTW†×™¨I$ÆhRñ‚‡bÈ…‰ƒŽV‡(×5± óPÅÅ©7TŠ—TÔR0DJSÑ„ mÆšôAS5ZQª&èLL4µ:9—ýõaæÌÛZ_Ý/‡uûÿÿ¬}ö:[@DDÒ¢O×x×xWjÄv­süI¾$ßä"öI´%Ú’ÀW0üØðc#ªGT[·ÛŽÛùñõ"~<Ÿí—4q‰õ‰õš7jï’ì’ì¤"ö¡«|>ùü+Ê/”_h¨i¨á ènïnèõözÁ±í¸o×Ûxñø²çü"0øÒàKÚCH’8D&Λ8/sc$á÷L(^X¼àqÂãå3¤¢¼@?ýØ+gÛñh¾]oãÙø6ŸÍÑ#1;c¶,^±xEò©HÁíïa븭ã@?œä$)6v;A]7܆›0ß©2UÀd&GÔ2µ Ô¯Æ$cav•F%ÄêcxQüŸÍÑ#oïíáO`yÒò$à5€Þækó50ÜÜlnFWóÕ&µ e·HùÔ|5ÔµF­õ¹Z­VÇ:ˆÚ¥Î¨3(õ›9ÝœŽ–X¼²ñ£|1~‰ôñHîNîîwÍ»f w­Öxk<Ùýk}·¾‚sƒsƒsÁ˜cÌ1æ8BôL=SÏ„`V0+˜ú}»¾Ý‰ó³5ÎÃ[àðÙü=Qa'Š;ìj+O=Öoë·ïû©¯©¯ fyfyfy íxÚñ´ãPr³äfÉMÝÝ݇bO±§Ø©þTª *<=÷z=OµéÍz³ÃçðGôD…Ýܵ/j_ÄêÖš_ŒIØöœtzÐéAP^^!_ÈòAöÐì¡ÙCaÝÌu3×Í„ü¦ü¦ü&§A3*gTΨ„ªÖªÖªVÇozÃÂl|µÖáèHmMmUõÐß×ò—ªY5Å|Ê§Ž»ÿTÿ©þSPXSXSX£ÓG§N‡€;à¸áiøiøiZ¦´Li™î|w¾;ü]þ.—ƒcU˜9fN_Œ?¢G`İì[zzâ{uÖ:apʹÜ@.´m;ÚvzÍ^³×„©µSk§ÖB­V«Õjp ç@ÎÈMÊMÊM‚öŒöŒöŒ¸Ã°T-UKWêz?flþˆ—ˆuѺ¨Ý1‹Ä^ê–º .Äl¹±ëÆ®»DVõ­ê[Õ'âøþ€ˆò*¯òŠ\©ºRu¥Jdï´½ÓöN)=Wz®ôœÈÃê‡Õ«E:Wv®ì\)¢5h ZƒGØÈF‡Ïáêy×7Æf‘YD˜Ëœå¬óÆûRö¥ìKO¹§ÜSu]u]u]ÐRÑRÑR>ñ‰O ¨£¨£¨òÆäÉÍ›6ŒÛÊÜŽŽÿýÆþûT‚Ño8]ÑD#€B9S ¸ÃîuÔQç711‰_aç(¡ÞÆÿ÷©ÔbsC’»“»¯oéÕ1j˜!º;Á eˆÚ¦¶ÉYùÖUì*–¡ÖV£Õ("š$J¢ˆÖ©uj"Z––¥e‰¨ j‚š "R "Ò$Ò(âšæZïZ/¢y©§^^Ë+××ùLRîY÷,¹,’Ì þ9XäÍØ7c§óîÉ—m`^3¯Xk­µèÑn)Þð’—qý`€à9=ô½<ãð<š?`•Yeè`¶™mñøïœüïùWFÎûÙOгf©YJÔUu ێǶ,Zoã½÷_ùÁÞ.>Øû؇yƒýÓŸÄA‘WIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-36.2.png 644 233 144 3264 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜiIDATHÇÍ–íO”WÆï™ 2`¥°ì‹H£Íj×bлØJËJ•ÝâP•`c@¶1J¶ÉJ³E³¤4BXÔ¬éBŠRA`ª‰4£HÙmQ««S·n“Õ@(“´¾ð‘·™ò:sžóÛ33ÙÝ?Àóåä~»îë¹Ožëy&° X¬ Öù~Ûú» ?bCĆ%§üv­Ë&˦;‚èêèj€˜†˜£;h›q3?´^$ˆÚÏôË3tÌm™ÛbIØBnRnRÄÏýöá«`;k;;áƒwZßip6:)‚ÎN€ÑôÑtÚfÜÌ7ëM¼P|ùð¿ú‹@X{X»åG˜>7\ßH|cñïý ®Å`Óþ&Àƒ§<¥­ †€yÌÓ逿zb›ñ@¾Yoâ™øf?³¿Ÿ@Üëq¯‹ðqöXö˜­Þ_Ðíà£âãÅÇA à=KµÔ2”(š•UY™Ñ7ŒJ£ø³®ÒUú޾L«­j+3àõ5|Â'ÌÓWxÅGŠ˜»Ïþ)û'[=ÄeÄeÏ4°ÉàÙ-É[’A¿ à½Üå.èÕjZMãÕ—u£nD½Æ}ãþãI¡wêz'NaA?qÚ­ÝhbÄqxôû~|}óôæi“à‘Œ£Yö—lŸÚ>õÌW‚+¼øíЫƒuƒuLúŠ|µ¾Ú`?oŸ·ÏÛCû†ö ío’7É›Bè8’¿Í[á­€¡_VV2é-õãƒë9×sÀE›ÃæðÌ1ùˆ¶ˆˆÔ^ƒ½j¯‚±RF1’_K}eù+Ë!æ¥{Œ½ùêæ‹›/‚.Ñ%ºò ó ó !ÊåŒrBÚþ´ýiûa¸i¸i¸)HhœqƬ3YÍYÍ]]]ƒ^û×ÔòÔrþ‹qÔ8j$CѶ¢m`Üôó±""«Ï‹Ø'í“"ç+ÚúÚú,«|]¾ _…Ìöþ³÷Tï)±tOu«n%R:Q:Q:!rÓ}Ó}Ó-Òy°ó`çA‘e1Ëb–ňtíéÚÓµG¯s+Ï­<·RÄõW‰«Dd¼r¼h¼H,Êe6Ël³8¾s|gY%’Ý‘Ý!¢×ø0>¿u~«naSEEðK=õîBw!¬éXóåš/a‰g‰g‰ŽÆ= ‘Õ‘Õ‘Õ°hbÑÄ¢ È*Ë*Ë*÷÷÷† Î@ß@ß@<˜~0ý`.”]øàÂð‹—ž÷>ï…4ÝøìÆgžÅžÅ`ü*j&jF·Xi²ŒYÆX.gŸ^÷ô:‘;êû½ßï•áÛ“·Ü^ rþßçoŸ¿-ÿ0þaüCç ç ç ‘´¥iKÓ–ŠÜ‹ºu/JdäÊÈ•‘+"õ)õ)õ)Á‰-ˆ_¿ ^¤&¶&¶&V¤$¬$¼$\ä体a'ÃD^Û™š“š#ÃäÍ$Ì$ˆX/†ÛÂm,·êsª@XºDÂ>û\äÖonõßê—¸ícÛ¿Ýþ­Èõ­×s¯çŠ 84pH$}]úºôu"ýŽ~G¿C¤®³®³®SdPêA-]]].âÌuæ:sEÛÛÛDªÖV­­Z+’w,¯6¯Vädž»îéIúáå^–8Ë)ë1ë1ÞW/¨,]Âa‘ÓqúÌé3þ]åe-e-̤L¤ ¥ Á‰üù'òƒGÔÙÙ «;Vw¬îÇ”cÊ1.?ºüè2ìX¸cᎅа¾a}ÃzØhÝhÝh…Ìû™=™=ü³Û_lgæïßÔ|S£wAÛXÛ¨_ûùä¢öìÞµ{ð7#­ÞUïe Bn×íº8ÍiN‡ÈC7Ýt¥”RâWþº5ÆÔê Óe$ÃîÌÝ™¦žÕ^z:†­ÇÖã™Ã±ÞÔÞTPôëŒ:8Û:Ûʤñ¬‘md_s‰K`$‰F"¨U  À°vÃla [ÀÈ42LÐÙ:Sg‚r(—rº3;:;ʤªôãë+½«zWØzm½ž98:ö?ÊONDN Ê?­¾R_FÞÇ„Yfi¦˜ ™‡˜›a†™@þˆa7ìxUªàÏæXr,ÿWùw%o½ýÖÛ!w%ï-|oácÝ> TPÁ<ðy|•§ò˜}U_À‚‚¶7óÍzÏÄ7û™ýý|žä×Åû{2_°ÿr¹ßÕ»—ÚIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-33.7.png 644 233 144 3174 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü1IDATHÇÍ–ûO”WÇÏL¹Mƒ8PÄÄ–’­]C‚4ÆÄí⢂D‰-Q„FJ)ݵ¦"%ÙÅl««Ö®`"ÖˆŽÒ%P;Z6V¡m¸4tEÒ´*riÜX©Îp)³syß÷|ö‡™—™¬ûx~9ù>—ïó¼çœ÷{Ž!„fÿ,ÀoŒ7Fù°ñÍ€=";"{ùß}¸QCž!ïN-,>½ø4@ô…è ÚPë~=>8_ˆp=Ý.Ì"`o o3¬÷ãa{òöäˆ%>|¢LWLWœ ”[Ë­Ÿ[>·ðG˜ønâ;€éõÓë!€u¿¯çë|ÁüâÃÿ©/„v„vþáaáaB@BVBÖK{}c/Ák9¯åŒ?3þŒ4€j"‰”ëôaºß¯çë|:¿^O¯ïëG@lFl†œy}æõS“/a¨™úªO«>Ù à½Â9i$T¡ à#å‘ò·¼¥ÐNäEy@þ PËÕrÜ4+ÍJ3È!ª©&RÚ}|òqÕsUÏoúë‘Û—Ûgj‚%1Kb{êŸ?ÎdY~J~ Èßxû€ŸùäfíYíY¼2_®‘krŸ¬‘5 +…Œ“q2È$“Ì€7nÜHà,gñqÄéNol¿±ý†¾‚gm¥B$ÖÓeúÌô™#ÆâÇâÁ{€-¶ ¿X~±0§d)ï)ïêys½¹Þ\°m´m´m¥N©Sêxbx6{6x6€ÍjsÙ\`ox”õ(‹¹éa÷‹îÙ⪹5r À¤šTGˆüÈ×!„hìwÔwT˜9ÈSZÊÖ¾šôj˜ß77˜;²wdìÈ€Ç{ï}¼2:3:3:ÁIý$5`W½ã¯Œ¿õmÔ·²MÈúÅ_Ôîã{Ç÷ð“2\9\‰½¯¡·¶·¦œSÎ)'¤¥¥AÍÑš£5GaèúÐõ¡ë`°Ø © © ©,‹Åbyò¬ >|0ø–W.¯\^ 3uÓû¦÷ÉL¬ÍcóóÑ!Ñ!Ú=£üBÝ£î1Ü"ôËÐ/…¸½ùöÃÛElÑLÑ@рݗº-Ý!<óžyϼ#;GvŽì¢ðHá‘Â#BôV÷V÷V 1{röäìI!Œ‰ÆDc¢çFÏž £õxëñÖãB¤ü6åå”—…0ÿ9úTô)!´óB!bÅ¿Õ45MaÒ:µNÃ=Á ÿ»ÑÒÚÒºðó—‰ø íƒ6Ü«;W_]}šZšZšZ+pØzØzØ iýiýiýpyìòØå1˜NŸNŸN‡­c[Ç¶Ž³ÄYâ,Cɇ’%õŽkm×Úb¢}᫇Ò2Ù2©ËÆ`•_.{ ¢´¢ø€–‚TßUß È÷¹Ë]`7»ÙýäVqŸûÜNqŠSAv/^¼Ax€ &L(#ʈnÔRµµzc=‚a¿Ža6 ;B8;ºvt-¨ïûtLý«§ÝÓΜ–ª½­½ ä‘C¨ÇÔcê1PªÕƒ ­ÒVi«€J(-L Ó€ÒK/hšKsÜ¥t)]Ìù;Ú‚sdvdÀ4ašp„èºú¤ò³-b[ ýÊìR¿V¿Ðöh{¾]"qã\Ì3´"ø¶ ë´­/nµKí VþmáÛÂÿ¯òûïJr s ƒîJ¼pà…‚+@uD‚âPj±ZŒd·ìÀ€X÷ëñz¾Î§ó/Ü•þú¾~žæ×ÅSû{:_°ÿÇ¥@+Wã:ÏIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.6.png 644 233 144 3155 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü"IDATHÇÍ–oL•×Çi/w^¤˜»,stÖ’®L¼ØUÀÂVÚ1ŠÓ M‘ޤ¦YßÚ&È U©³ÊnG£uiQ‹ €ÿ€Šå6uAÅȿՋ—?Ï}žóÙ‹{.©KöÖóæäû;ç|ßçwÎó=G@DDž ô!φ<²ÌCòƒñ°7ÂÞˆþÂë`ÙlÙ<ðDÔDÔD~ù™1Äæ¸9ñz‘ ÿâ|f\ž‘`Àú•õ+Kj—Á¶ÕÛV‡ýØ÷w‚­ÁÖðÈï6¾ÛpªîT;a´g´`*u*‚Ø7ç›ëM¾ÅüRöƒü"ðTóSÍ–Û`}Úú´¬L_™þüûþ îç!sSæ&€;Kî,Q! vì*ðàÁlã‹°9˜o®7ùL~3Ÿ™ß¯GÀñšã5ÈÊÎʶ¹ÐDD†ŽÁî¨ÝQ@"€ÖÀß)£ ;è¡z(pÀ÷Ð÷9uÞ¨0*€RUªJÔ€fõl=›9ðMù¦€/¨¥»:à«*ú¤èSàÐ1¿õý[ßÛ\àHu¤÷4ÐW¦Á–é-Ó ÞкÕuv± @ÝV·Ñˆ$„”úµzU½ºP)T‰*Q% úUŸê Æù3›Ø„2šôõÑ€I&AýÑÏÏO·¬Ù²ÆX™¶h+ED^:6Íã ¥÷Võ­êÚß?úÏôòéåxµZ­V« æÓb´-ÆbÇbÇbA+ÓÊ´²E‚ŽsœãAèû™ïußë0¶ë~ÿý~¼Ú/ýüàvºÀ¿lŸÛ>÷„šz„k""‡» à£‚@%Ωª±Ò±RHúKR}R=ªõ­u­uÁDç2Îeœƒˆ={"ö@Êþ”ý)ûa¢x¢x¢˜ÇZîpî@îØóí¥öRÔoJÖ®/„ÉmÆyã¼á„«w®ãß~=¢nŠˆ\)‚/Ý_ºáQ?€ÊKÜõÊòW–3gÖõʆ+®l€Óõ§ëO×C´'Ú<ô$&&Bå…Ê •‚ñæËÍ—›/CTKTKT \¿x½ãzüiߎw¼È\÷OGGUœyùÌË Oùõ„ZV,;³ìL|‚ÜLY“²FäG¯x-®î†ž¾ž>‘ÄÔõo¯[d4b4b4B$#9#9#Y$¾/¾/¾O¤­£­£­CdrxrxrXÄiqZœYhããã"ÜÜÜ"™®ÌÎÌN‘_9b­±V±ÆeG×D×X\"ŽLjHá§ÂOÅ'D†G†ƒœ?0~”±ðÛû+—— 'N4œV¢È[ä-òÂÚòµåkË¡ÇÑãèq<¾…G²dɆu‡ÖZwhQ…›“Õkšjš>åSð͇[íÆ`ˆ`4M–AÑ´ -CÄòsq˜_<óÁLñL±ˆ½ÍÞfoéÎïÎïΩZZµ´j©HNcNcN£ÈH×H×H—Hï¾Þ}½ûDêêêD¢·GoÞ.2~rüäøI×M×kHäîð³wΊ¬üÝswŸ»+‘™Ö™VËYU  ,ƒ!bñlðlèï•Ußu~'"ñ""ìèšO‹L K Y1²bdň.\¸DÒ“Ó“Ó“EÚ¯µ_k¿&RWW'âžvO»§EÚ³Ú³Ú³DœWWWE*.U\ª¸$r”£³GgEöN•^,½(óØýæ{o¾Ç9Ö´±i£Èå=è=Øß°‹Ã]PðaÁ‡f¡ 'ø<¾àáVÀsüÿ6Ë,³‹ð*V± ø+9¸ˆoHwè ØÌW°·`/0ø+|LÙîÙîyB1ni·´ Û´¯µ¯ñò 6³Ô¼ò(è%z‰^ú ý†~ô:½N¯•§òT F‚‘TQA/9Fèùó®y^c]ÀÇþ9üÂð ¶omßzB¹gúØcοպպ`£ÝLë-z  ¹F.Zà‹'¹Ï}`ÊïäLú¹@Å2ÁD Ö ÀxÇxYýý›Eül Ûö?ÿw¥yw™w¥Ÿ (§{p‹õ=‡9Pª bs|áHÖ›|&¿™ÏÌï×ó$¿.žØ÷Ø“ù‚ý/èé]D±‘IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-59-grey.png 644 233 144 6325 14774263775 16025 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ŠIDATXÃ…—kPT×–ÇÿûœÓô hÀCb$žaÂÃà˜ð 3JB|F‹!‚/È5*^¹­Mb#‰X–<ÌÌHtP‚‚ÜN5GƒBP2y5Œò§ÝÐÝçœ=èÆ[N¥²¾œÚçœý_¿½öÚ{¯MÔjµZ­†æljîÁ,çú¹~®ŸjÕåêru9ý͈fD3²b u§îÔýèvÞ›÷æ½#¶Yj,5–úÊP†2’‡ !@ºÐ`¶aýLš,M–&“ÂGø ˜a†@Òày<ça¶,²,²,Â[úF}£¾‘Ú~ú!è‡ qÏxâxâxâ{'¾ _…ïŸdBº.¤ÇŸ¤4ƒfôo& `^'ù³ù³ù³шÆE.\ WÃÕ4^´ÎXg¬3/­ò{ÓïM¿7ùek³Öf­Íâ.¸M»M»MÃÎp†3x±B¬+Àáü‚_ò)ù”| Àîp0†1Œd–Ì’Yð!B7å2å2傾ªÓU§«Nó›ûnôÝè»Á5;ÉäNò_ÿÆ'óÉ|òñÞÀ¦Éá¦ÃM‡›^Å«xÕ¹6SŠ)Å”’XXX¿•——ÇÕ¡ h€pÅ ¬À <5 ,°B )TPô:½N¯$œ„“p€®¦«éjÞð†7Œ¤””’R¸ž­9[s¶†«{o÷Þî½\²ZY­¬.¿Ã=æsÿ5‚h´­F›imµ¶Z[ÿÖê:í:í:MýwÜÚqkÇ-ÒêÖàÖàÖ†OçÓùt¸ mB›Ð6ÒFÚÜÅ]ÜH I!)w“»ÉÝÈ äò@•TI•€u‰u‰u QIT@*I%©ˆ;q'î0NíšÚ5µ b‰K‰K‰ 2ºÝŒnÄàååµ*Š£A4ˆJ±)mJ›ˆý$ö“ØO`t²ÇKÑû}ï÷½ßåï–¿[þ.À®bW±«þ †?HŸHŸHŸ{Šöí)Ä-âq p^ (0˜2˜2˜(uJR$sÉ\2„ !€«Û·3ng`ŽMˆMˆM@B•¦JS¥$‹$‹$‹¥0¼?ïÏû¿¶Ã}Ì}Ì} Ÿ½óJÌ+1¤9ÈAÎ<(Lï˜Þ1½¸†»†»†ï÷½ß÷~°uÁÖ[ë¾X÷ź/…J¡R¨€Ê°Ê°Ê0`&|&|&Ø–²-e[ |1øbðEàbäÅÈ‹‘Àtþtþtþ|9…æ†æ†æ’bƒ±LX&,øÊç˜Ï1ŸcÈ“,ÿXþ1ÌÂba±°œCáþîû»ïïäíòvy;0Z4Z4Z˜™™!ÛC¶‡l¬X?°~ô'ô'ô'±þ±þ±þÀâÅ!‹C€¤kI×’®â ñ„x0¼lxÙðò<(§HR$)’`vð8øÆa&AÌ%æsi¾ƒÍhFóÓµ2¾i|Óø&`¨w¨w¨èvH;¤@õ¾ê}Õû€Â#…G ¬–Õ²ZÀkÔkÔk¸åsËç–`´FZ#;žw<ïxæûæûæû€Ð,4 çÇáŸÙÂla¶(A JHÃz³Þ¬7­4.5.5.E/¿—ßËïËŽ²£ì(¨£g’2I™¤2Û2Û2Û€´¸´¸´8 {2{2{xôë£_ý tfvfvf[5[5[5À´rZ9­>×®ÿ\4íoÚß´A"ÔJ­Ô:èðÇšî˜î˜î —ñcü?ZÉÈŽÉŽÉŽñ…½^½^½^´²=­=­= À5\Ã5ÌØÖÛÖÛÖc)c)c)€JT‰*ñéÐ   ©³ÔYê ˜%f‰Y˜êMõ¦z`óO›Úü{"÷Dî µ"µ"µdI²$Y€K•K•Kռ܌á¬á¬á,`xhxhxˆ“õÊze½|!ƒµX‹µË85§æÔ$¯^U¯ªW ~“m“m“mPH*%•’JuWuWuW² eÊ6}e}e}eÀõ–ë-×[î5î5î5 h h hhnn¾úñ«¿úiii®.¾ºøêbÀã”Ç)S@àêÀÕ«av »…ÝPÔ-¬[X·P\F Ä@ 8C"ᬻɴɴÉÔtmV3«™Õl3~hüÐøá?ýu$`$`$@ȉˆˆ`Þ‡¥w¢w¢w\Ã`Ã`à `ÞnÞnÞ¬ [¶& x‘{‘{‘|oûÞö½ ü6ôÛÐoC@ÝTÝTÝ 7ËÍr3°^½^½^ êÚêÚêÚ ®ZZ-­–ŠæNßNßN_&S-‹–EÿïF[‹­ÅÖ²>‰äßÏ¿Ÿ@ ZÐòB‘dD2"i’?Ñ=Ñ=ѽ”7þnü]—Ô—Ô—ÔGÄ&±IlµÝ¶Ý¶Ýá䜜“l&›ÉfØ€ Øà.á@ÔH€õKë—Ö/®›ë溶œ-gËaþyÅÏ+~^õç[ηœoÁUy¼GÞ3›HYÊR6b=‚ŒàŽ SÆ”1el+sœ9θ[ì{Äžt«¢^Q¯¨76nlÜHÿQï£÷Ñû ‚YÎ,g–cÆÉìdv2lÇÆô}@<ÄJ¬ÄJ€OxÂcfÔ0j5 B¦ Ó…A¥V+‡q©¸T\š{d.õÌÚS±È>Ì$Ç@#·_I¤óEÛܾ[tÐ 9dYF–Ž=wå¸vŶ˶˶Küó{â{â{"³<ôxèñÐãH;ÅN± &˜ f‚aáóø<>ÒÓ§NÃÑÃÑÃÑl·,L& +üÓÜ¢ÙÓ,‹Åb1WdŸÙÝŽ+(((((€ÑQØ_Xæ§ äÌÝy¸"r’œ$'¾eb™X&vO 2 æT­­ÖVkãwM•N•N•BÁ0 Ã0xìˆDýLýLýŒh~Pü øA1Û-; ; ;p¯ÎòÐòÐòðÀ‰î•Ý+»Wv@?Ç9âtð̓>ìøAaø{î^ù¹ë=é=éÍM}£þFýZÈA •ÞCï¡÷À6¶6¶6¶’ÍŠNE§¢ýD?ÑïÏMÜ&n·iæŸý£ü£ü£˜ »¿qœPÏr±ø›Û ÀÛ›zêD¨ÉÁÌUW·x©¿Ô_êÿî©GñâÅ{TOuLuLuÐÏÛϵŸk?'¼þÄöÄöÄÆfK–K–K–ï]DKi)-ý¯º¹›Û‡ L`B|Þ1ö@ñÏòüýNîj …Zá ­¡5´&¦‡¹Ì\f._÷Ÿ]3»fv")–KŠ™6ƒÍ`3~¸p9àrÀå1†C¡‡|/zŠž¢'=k×­µšƒÁØ3¹kß.„ƒÈB²¸6’JRIêP-ÕRí_Òä>r¹ÓÁ°ìÀCñ¨xT<ºk°scçÆÎÀ üízŽÂræ8þ7þ¤Øõ¥íIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-31-red.png 644 233 144 4235 14774263775 15615 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜRIDATXí—mLTgÇÏ}AAÜIPgvc]_!P\e±ò:ÔÁ¦´E`Ã`5ëkÓJÃn•HhK+I5´D׊3ª6ͬoóaãê"q+gPÙÄBfÀaæÞûßÌsçΤ«Ùìž/wÎórÎïžó¿Ï“!š´™a|v¬=Ökçž…â§´OiŸÒ^˜)J¢$JG)Ò)˜œVH$‘D摾ÒÀÖ³ý,‹™ÏŽäÑòí¢]´‹·EÎ'-ÛÅv±Ý6Èíævs»UDGçÑyp¡ô~éýÒûÀšÇk¯y ”å”å”å„}6ÏÖ³ý,‹Ïò=Ÿ‡ø•‘þܯø~„éMgšc™c™c‘>hq¶8[œJœ÷©÷©÷)ø0ŠQŒèE/zÕͳõl?‹ÇâGæ›ûÕóùHŸÀ÷ñ}|_o s-çZεà]—ßå‡ !SR•Ê ¥Ú`G°2¤t)ÌR‰THR†”HµR­T (©Jª’Š Ûï ¸®\,¾ ‘_Ÿ ¢q6ÎÆÙˆÄƒâAñ`ëm¶ÁØ`¬1ÖÍ*Ø^É)9á ¶®®JohbïàËår2"m'pPz•$% ¶*¯)¯Ê^¥D)—-36?5~4³üŒ‡ñQÌ£˜G1Vý-Ð×éè(óÜ¿¸½n/†Cq¼Ògrµ\ Ò)é¯Çä1ÀxÍxMÚ\e½²”}Ê>ޱ̱L,,¤Ï³¢–^÷/î~w?†õuú:}2ñ¨|âq‡¸ãÆA6q¤òHå‘JeK(€/hc±ÜÓÝÓø_-xµ˜ü¬ ¡*¡ Ž/>¾XËèôkýç<€¿èRÑ¥ðhÐæ÷ù}ªëcùÕÊFð‘2 KÑ¥èRÐ0X8¸xp2á÷øAØ;''€þ¶þ6tò<lŸ¹}&ÄcðìÒ³Kp÷•»¯@ÖxÖ¸öÅÞÈ|#P›nÖJkÃ܃…ƒ…ƒ…ãa||ˆôx¶%Û’m¡}:‡îGÝ4&»å)ò©3´b†¡ËÐEDôù'ŸBD´T^*××ÉCòÑðÍá›DD\WAD”v7í.Ñ,×,Q 'CD3Bq;¹[Ü-"Ù-_‘¯¨sè:1Æz⻲ββNõÍ$©@2I&@â´-];ºVü¼âgm¥Þ:þÖqí:©T*ÕúE¾"d›³Íšáy¼þ$½+½Þ\¶´liÙRõÜþ.TQœésö9ûœäòó~ÞÏ“ l¶ [ ´ ÷pˆFØ9!¼)¼ID´edËQUmU-‘CrHDDwöÞÙKD$œÎj>t¡‹ˆˆò(ˆ&BÃ=ôýDÄŸãÏñç,É@ï@ï@/¹ñfÞÌ›ý!-4üe×±oŽ}·4Õ{Ø{L+M+ø¯ô\éÑVʻ»B[Ùcï{¿bÅÎb'€`NBN‚¦î§'N< ç»Üx¹ñr£ZÉ­\—Æ¥úIX&,–ÕÔ³¯Ìð;}‹¾Ešë^ë®rW…i”üE=€ŒžŒJÇë¯@õÂê… ®WÀ­n}ôk ER‘À—mÈ6(aãr¹\¿>—ϤԤԤÔÈê $ IBÒ×ÃoŠ7Å›ˆÄ«âUñj[Ÿzà—å¿—ÿž´G gýÁóƒ~ØS¤ €Uð¥ä—’ íhÛQ-X°2X©-üÛ‡Þ>`¸øAñ@þ °iËMËËÙ§n6 ›ÿ¹nÒŸ6u…Î9“““Ö{Œm°ÖZã¬qJ¾šþ7—/C<ÝžnÞ€-`Ó*%¸‡{üêWóåÈ—€T9¨Ô…[}rää…“P¢^¡õ|=_?^ÈÍâfq³·D ÿP¯Ô ÜnCA3ׯäN2­ÈÛíÛ„mvU»{äL9à„€_þVþÐnm­ C”|e“²)\ß¾¶¾æ¾fÀ0Õ0Ý0=¸C­ä~a¿°ßjTÑÌd&³¨³æR.åŠûÉF6² B¿ÐÿÁ9õjmÖ7雂‰îݛݛµÚ•·ÉÛ´…€^xØÑ@Y'ŸO„ë[þ÷ò®ò.izŠ£â¨ý@òÎäÉ;‰x#oäÜé]%Üz®„ÜùyÕóªçUÅXb,1ûU»¹Æ\c®V»²U¶Â;ì°Â†4_õi´ \ߦåMË›–+ùê]ž““Ø7>éë§Fvš»Õzâ¢Ü둾~ê¤vݧ5Ú­µÖj´›L &†ä'òùIX‹Ý“аOëžÖ=­[)U5ÏÇóñëÿ%ÅÃQ|±ôü¡)J»¥\ׯµiµkwØaíAGСúÇ’Ç’Ç’%ž%ž%i¾ªÅSÂ)áÔ¡,&µô¢gÐ ,¼€kw@Ðh·Qߨo &ºÛÜmî6~øá‡‡‘ZÏ[Ï[χ±Yl›»CI¦ý-*ohœâ^mlÃúvÏþ'íæ­Î[·:¬]{–=Ëž…“óŠÚ ®‚«à* j"ÓðCQy9ú/íEÚÍê…z¡¾7ƒWÔUÔUÔ)_¤N¤N¤N鶴„ëj¥Vj¥Ð±#¸£òÅÒÿhÑÚ=éçõp¹ÜF€Š¨ˆŠäEül~6?àˆ#ŽþzÝà3ø >"á†pC¸Á] m\Õ¹ÿ›%ª¿Ld"“x;rúÃJ^á^¸‹ÜEîâ¿~;9þ{{Tg\Qq_ØêÜßXë›­Þ IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-54-grey.png 644 233 144 6111 14774263775 16011 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü þIDATXÃ…—{PǾǿ=3ììÎzyHJŽ„ðZˆï zÐ(5#ŠBÊ«‡Š±0¦Dð‚KŠ«árCù¨¤PÈCMnÐ ÅEÌIZIÌÏEKJy¿evgvúþÁ¦’J¥ÿéê™îß÷S¿þN÷oHAAAAAܱئ;&’{À=àІ‚‹ .Ò•†ÈadëjêA=¨Çû—¼%oÉ;l¿­ÖVk«¥'Q T\#ÁzЃû±ûéIþ5þ5þ5’Ë qCÜP[™"SdêÈùÂ…+ W4ví)ÚS´‡ K~’ŸäGâ9ä'—;³¸±‘ùB6ÈÙ ·Ø-v‹Ýân¨3Ôê¾xh¶Û‡ÿ²ê­z«>ì°ö´ö´ö4êö„m ÛBr×»¬wYï„/_¾PÆÊ{e¾²^‰·ß©§è+< çÌà‹Ô•ºRW9¤“t’îwšõcýX¿•–Ï-Ÿ[>n¹§ÑÓèitÚÒ³¥gK#®1­1­1‘>—ÏåsaÅQÅQ°Â +€½Ø‹½žÁ3xVÛ*Û*Û*$˜šMͦf*~ü]ðwÁò¡‰mÛ&¶½ñà'ø ~›ÔŽtGº#=ö4Í 4ãAó"#çÉyrž|“ÎÓy:¿êߨeì2vÙ@ûŒ}Æ>ó\».^¯‹—6f.d.d.°o-fŒXø>O€$‡Ëár8¹L.“ËêK}©/@}¨õè5z^ƒÀïâwñ» )ë3Ç3Ç3ÇÙ·”øŠž¢¯ð(|¤¸¥¸¥¸Ü$7ÉíB›e§e§eçžuºsºsºsRBFLFLF W&4¡ ³pÀ\±[±¿o€"TP´„–Ð6Ø`ÈQr”Å,8pààZÙTÙTÙ$%ôföföfrõÚm¶æâ]n†›áfþ#Œ‘æ¤9i..Üþýû7{Öy&y&y&ÑÀ¤¢¤¢¤"NñȬtQº(]„«í°í°í0`—í²]ìíöv{; º‹î¢;€MØ„MOq §p >ćøÒ/Ò/Ò/€¸UÜ*n…«?ÉdH2p_(ú ÂÇÐ`Lƒï£Åh1Ø|wóÝÍw±Å½É½É½ *g ×þëý×û¯ïE½õ^P__Ü n7àD÷‰îÝÀŒ~F?£ÿU†â O®?¹þä:P–\–\– t¬ìXÙ±ri–«û÷îß»•¢¯ð(|Œ(JÍô÷÷ÇÉÐèÐèÐhRŽä g –DK¢%p]çºÎu°ïþ¾ûûîéÛÒ·¥o’ÓÓÃM¦&S“ù{G\˺–u- ˜˜˜ŠP„þjBò•¢¯ð(|ŒmÒ6i›ÄǾ%¾%¾%ÈÕäiò4y°:žu<ëxœgàÀÀ€¦CÓ¡éÆÎŒ;XF-£–Q H¤ÒªCªCªCOõïî®ž®ž.ÀSí©öTŽGŠ#åéÅ(F1 f.3—™ËKëxÜÆmÜ~h"u"u"êêêºø.¾‹jVÖ¬¬Y œ:rêÈ©#€CtˆãÇø10¦ÓŒi@bmbmb- úAõƒê€¶ÒVÚú«Œ6£ÍOõ™7™7™7œÃ9œ#ÁëÍz³ÞôÊì†Ù ³H¨”&¥IiàÆ¸1n Ô¹Äiã´qZ@n“Ûä6À'Æ'Æ'˜Ê™Ê™ÊJòKòKòS•©ÊT´÷¶÷¶÷Áë‚ׯ‚? þ(ø#ÀžoÏ·çbš˜&¦=å$“ÉÇKz¬å®å®å.ú™&I Wu‰ºD]"•õ¯è_Ñ¿‚^éØÛ±·c/€¸˜“Åd1ß9¾s|'à&»ÉnòSááá@sVsVs©©©†ôCú!=Ð9Ñ9Ñ9”^-½Zz`ÔŒšQßê¿Õ«Œ?4þ0 Ã0 æÍ—Í—Í—ócócócü·º_ݯî—Ê8$! I…\ ÃÅüW^£[£[£›Ã߿ͿͿ½ïqÅãŠÇÌcŒ1Ƹ2¯3¯3¯‰‰‰@_F_F_À½Â½Â½¬¾½úöêÛ€¾Sß©ïæoÎßœ¿ ˆb£Ø|¶ë³]Ÿí6ÕoªßTD†D†D†À&UHR„úê_¨AÞHÌÄLÌÌmM¢Itå4›jIµ¤ZZn, † ý³oϾ=ûö¿ÿçHÐHÐH#',(,(,ˆÙ¡›ÐMè&`ëŸìŸìŸ×4Ø4Ø4Xß±¾c}xU÷ªîUjA-¨÷—Ý_vpÝîºÝu;ðsüÏñ?Ç¡•¡•¡• ¾Ù¾Ù¾Ùપªdk·Ô-uKÌ?ÕêuÄ/)b«Ø*¶&Ç‘cÇŽ hE+ZÿrÆeÄeÄe¤E3gœ3Οˈmmm§1q÷ãîÇÝ'Mr‹Ü"·€ŠwÄ;âNÍ©95Àf³Ùl6€Ø=LÓÃшF€Ü"·È-ÀZ`-°B”%DÁzoêÞÔ½)$_š»4wiÿ'ð/ð Û(KYʆ%#!éúÃT0LûSÊ”2¥È}rŸÜ—n…F¡hNiNiN¡/˜|M¾&_|ÉD2‘L$æUV•UeØX6–è(¥£>ŧø Q$ŠDä89NŽÃÆ–gŸO„'„z¡^¨$QÈ,™%³ù2‰ $¢ë(CʸUÎ2ϱ~±n䎓Óä49Ý”Ílf63›Õböas¶nwÝîºÝRÖ´aÚ0m€@Ž‘cäfi'í¤ñ"^Ä €;Üáþ«»þîá€A b6å&ª©©qäLMMqgx?Þ÷û²HwRwRwòƒ(D! IúЇ>)V©Gµxˆ‡x(u.^y¤vuÍêšÕ5e;Ô™êLuæ—ESžSžSžÜô×^_{}íåÈQ1Œa ÃL0XÀ¸À. §á4£Å(ø[æ[æ[fÓÊ·ò­<[¦´‚Vx´`¯²WÙ«Þ=ÑYØYØYP35S3Üœ:P«³¿,/“—ÉËàÖ1Ø1Ø1ØÚÚ¾{Bë¡õÐz<¸ÜS×S×SÇ–5ìnØÝ°›Æl’M²ÁË—äKò%Ph  3t†ÎD"‘0?f3™ñ¥q­q­q-Ü´ÃÚaí0 o7ÈÞ=±h½G N+žq–bqÊ@”óÐùKÂ;‡Î-bË`„FGÙH6’1;9n\³Ä,1K~ë ù ù ™‰\Sº¦tM)^“»ån¹„0!°I¹R®” þàƒ> rè†#†#†#Ø^õZõZõÚ²M‹Í¡Ûr¹\.—sgœ;{@Ù±¢¢¢¢¢"Ì*…óÁ’‡œÞÍqz÷ŒÓ»ß,y7È`ÎÖ‰ub(eMŸŸ>?}‚óàžQ2Ñ8ß8ß8/[•?*TÎöªóÕùêüÎzÛcÛcÛãüz_ê}©÷%À è¯Ü#  Â·ú`e‚à pÓéÝ«¿ó®÷”÷”77ýUÁW_8r ƒ:¸™–›–›–ã³æŸšjþ‰¤ ÝB·Ð Èþ²¿ìÿV —Ê¥r©ó \¸>p=3éÔ{ÅÙÏÿ–‹Å´èèèèèhHΡ‰ª¨ŠªÈ?‡Ÿ~~øy|ºX]ýKâù@>p×ÙÑØÑØÑØå5Ó]Ó]Ó]ô:.t\è¸àxqNœçDö K¤K¤Kä;«èyzžžÿßzðàÁ³÷1‰ILÊÏ(;àL”ô[‚?ià]ЀG!­¥µ´6º©fª™êï¶/l_Ø.?ïRîRîRÎt±l›ñÝAÕAÕAÕ[£Í}æ>s¹.{É^²­tÆ­sZÿˆƒÁŸ´ßx×y\8 ‘ldsmdÙCöüDhm8²Wã«ñÕø2]ìCö!ûð±¯ü¾ü¾ü~Ö`wJwJw °ˆ@g<¥°œÿ3ŽÿOøêP":IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-20.7.png 644 233 144 3236 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜSIDATHÇÍ–ëO”gÆïá0 XÔ8%[¤…µL±5!1LäP¶¸õ”ÔHÒƒÔnŒ‘¬ÙºRÒvµD¡ì¸V4aPYYRªÛ5«®ˆu›¸"‹³(ã szßç·†—™¬ûø|ys¯+÷3sÝ€ˆˆ¤Lbl1¶˜9a;æÃˆ?quâêÌ?†íf LkMkÿ¾¬MÖ&€Ô¯S¿ÖoEl#näG׋DúGã~I‘ˆ#áD SÑ´]r7ä&Î Û.ƒå”å”'þè4@g[g¿‚ÑÑ€‰¢‰"ˆØFÜÈ7ê~Ñý¥þðE îlÜYÓ?!!>!^2Vf¬|i{8aä%x»üír€û±÷cU hã@IªpãÆ8¢l#>oÔýŒþžæ#V˜V(Âáw¿óØr4\p«ƒ¯jÚjÚ@]žâSši& 4“fZB¾¿ú›Þ¨7§Õ7êuU]жj[ñÓêu€ºE-µ$©Gá~êß5/Ô¼|8Gå•Ê+–£0oî¼¹‘;þ~ù&¯¼ëx×êÁ+€?¨v½^¯'¨ŠU†Ê@©LõªzufR¨X«b­lekÄO AÐB A`>óg‚W`C÷†nc‚_¾u•""Ùt[Ú-ín3ŒddAp=eã/?üâáxƒ¥Áš`MÏ?âñ€+ÕáÊ•«rU.Ïœ@i (Pã§Ç}ã>xthlåØJ¼·ý/ú_¤Ì×8<4<`Ñ,šÛ¬~æ#*_D¤¹>ÙÿÉ~˜œÐó*þTz¬ôX“­ÙÖl”c‡ãcÇÇ0Q7Q7QÕzµ^­CâöÄí‰Ûa³s³s³°cÇ!vnÁ¹ç@ʦ”µ)k!ûÓìÃÙ‡Qq'L­¦VhúyGcG£žµ»jwAp~˜„ÒED®Õ@wrw2´ýîLÅ™ õþ+i™ç2Ïá7Öd®É\“ Åz±^¬Ã û û ;<Øý`÷ƒÝÕÕÕ]g»Îvóx <àéõôzz¡}y9dØÒûÒûð߯ôfx3ÔûpòäÉ“ «0³9&ùÇä—æ‹,ýlég"¥1?1?1-¼èºè9ÿ×óWÏ_™¬œ¬œ¬±¥ÛÒmé"S«¦VM­Yذ°aaƒˆ­ËÖeë¹ë¹ë¹ë‘™g³ÇÙEâKâKâKDZÖº uȯ[jªjª$aQÓ¬Ÿfýd:ª‡ò_ËM$6nÎÅ9—æ )=)=úM~ù(ÿQ~äoÿKíÓÚ§`´Úa¸|¸|¸ÚíŽv,¿½üöòÛ‘ÉtttBKUKUKÕ³¿µk÷®Ý»v2·enËÜ÷Mì˜Ø%3iãñ0•jN5ë7côë¡ÏCŸ›nJç¬ÑY£"g®;ò툤ýÁw ù@²È–¢-…[ En¸n¸n¸D¬s­s­sEÆâÇâÇâEêëëE\c®1טȲ©eS˦DšMŽ&GdrÇ÷ß|¿H^VÞâ¼Å")¿M=˜zPDo‘4ù—ö†ö†ˆXô½Çt3FÜÞ~oÿ߉8‹Å"渔¡”!>X½±Ä_â—€ó‰ó¡ó¡H}E}E}…ˆµÏÚgí9”s(çPŽÈ…v^Ø)r°ì`ÙÁ2‘Å9‹sçˆôÌî™Ý3[Ä»×»×»W$i i i@¤êå*[•m†oÀ”&"Â{éÒ¥K""î"wÑßMËEs?T—V—“Õó@;¯üŒ1†šz!…Ç8Ʊ¨»:Â޹ä-^¼x£ìïeÅhh84…§ª÷Tï1ô¬¹_èœÖ1,w,wÜfõç;¯ßy´†°Žiÿ¸n¼ZƒÖ§õº®†ÔèõúFЖhK´% ;u§îŒÖ|šOóW`ôïuŸîµ%Ôê¡Z†gxrxÀ2ju› ]}VùëLëL€kZ™kÝZ7ðý-ý-‚ÂB„ðfˆ¬ttà ãŒGyŸêëõõñk½Zo´ò¯KX—ð•zWR¹©rSÔ®d×¢]‹fœö±$¹Cní=í=ü .«Ë˜0AÄ6âF¾Qoô3úÏìÊiü0ŸçùuñܾǞÏìjtÆ´ ˜ö-IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-49.png 644 233 144 2430 14774263775 14706 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÍIDATHÇÍ–[hTGÇ¿=iÜdÑ>¨ÁLƒ—J£IÔrÁ[dÕh©ZH¤"Dº ‚¶}h ¢‚¹Hˆˆ 1Q ®˜TßćP£E]0©®Í6d7çÌüú°{öÛzyt^ßíÿÿÏœ™oF@DD¦'¾Æ\c®1-nß8þ´Õi«?ïŠÛ',ðÔxj¿‡¬–¬€ì¶ì6uß±í¸ï®qðÝ|¶_¦‹ãðž÷ž÷”$ìfظxãâ´YqûÇ[~1ýâß&ì¼´óÀ…Ž ÔCèvè6Àë’×%àØvÜηëm<7¾4ÿ‹_R¯¤^ñ ƒwŠwŠä–å–åí‰'üž••ÏRž¥h¬ “L]Œ1†=F]¶OäÛõ6žoóÙüq=9+rVˆ@umumzk¼à~'쟳ŽÍ7y“fšÉËgù€Ì"ŠGõ«~òÉ~Ö5ºô=s¡¹(Ìv³€ZÈÄJà%ñm>›?®GÞþ·?•Âú´õiIA¿¢­~«@Õ«z&@ëÚ¯ý8c*S™ z†ÎÖÙŽ[§èEzšJ«Çêa¬Qkˆ%ð“|6¿¸}ñ ¤‡ÒCcŸÁCë¡•ÄýŠqµN­cœ‘„'ÿUѽѽѽ~~~ê‰uÆ:c0zmôÚè5PÔ tMàU¬ŠOâ'ùlþ¸ž„°ý°;°;`W«¥L˜/Í—ÎÄ­V†•áà7æ7æ7æÃÚâµÅk‹Ù¡²Ce‡ÀwÒwÒwjÔ¨=¿ÏïàI†J¡ÃçðÇõ"ªWõz~1«ÌªdbŽñ­Qj”:8åyåyåy"]Þ.o—Wd~p~p~P$7˜Ì ŠDNENEN‰t×u×u׉¬ò­ò­ò‰Ì|5óÕÌW"Ë –,/pðŒˆqϸçð9ü =ÚcÀ8ã ö©}jŸ³ð×›®7]o‚@v ;àjǪŽU«‚¢†¢†¢¸ºáꆫ\í£U·è dµŽ¾w½ãTþe>7Ÿ;xºB—êR0ƒfÐ ‚êQ=ªh£6гõl=›ÿŽDœ¥Pà:•æˆ9ââûÿSùž>†Úª¶2Näm>}Y_Ö—A5©&ÕäÚÔCÖ5Ök‰µÔ~µGíqšj³ÚÌ8ú£úØ{:?Ö€5 v¨L&g#Bˆ¼uW‚F¡€h"n{“õ6žÿÎÎÿ‘w%á™`Ž™c–ßò}KßÀƒÛŽÛùv½÷Á»ò“}]|²ï±Oóû<Å‘ï“ IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-43-grey.png 644 233 144 6164 14774263775 16017 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü )IDATXÃ…—PSWÚÇ¿çÞ›„…‚ÀR‘ hAQ@´¥€¨×VVßt«U±£‘ò£»ãè¶³TX¨–jmqÐaŠàÚZñ×TDÁõUlZ+•j‰XDMb€„$7÷¼ ït§ÓçŸ;çÞsžçsŸó=ç<‡B‰ 3O<˜dî!÷{H› ¿.üºðkXˆâƒæo±×ÛëíõôT£Õ$j¨¡Ð….tØ‚-ØB?‘eÈ2d$Ÿ{Ì=æß®&&b"¦VÍ,šY4³ù^IfIfI&äÃø0>Œ,Ÿàn¸¹”Ì$àB,ÄBæ¸P, Å ǘcÌ1_ÜPÜPÜp¼×1èt ênZã¬qÖ¸ùï{–{–{–ãâü%ó—Ì_Bò$ ’ ïïï ˆmñ»Ø_/ú›ôïŽ'ÆyD>ÎÁW¨õ¢^Â:²™l&›ÃÊÙ06Œ »rx¬f¬f¬f¶¯ŸÎOç§sm_Òµ¤kIãŒiii'+dù²|Y>¬øâC(`…Vï༠Á†Õb±‡`E{K{K{ u^V_V_V ÛŸ-{¶ìÙ²·?W„)Âa‹<\›]›]›ÓË©–j©öá:æR0^0^0 -h ™ÎÕsõ\}Ë)‡ÍasØfÿY•¢JQ¥ð 5ïiÞÓ¼ÇWZ”¥*ÌÂ,Ì/Ô õB=8PPP€¬#ëÈ:&˜`ð Ïð .â".ð @gžnžnžŽžÚŠÚŠÚ ~]Ïõžë=×¹¤r©\*ÿµ‘Ïà3øŒW×àU¼ŠWûGy«¼UÞ H%’À¯Y­ÖÆÙViT•†_¡ÍÔfj3¹”œ’Sr˜!˜“`èz€Ç”0%L ÀÌcæ1óÒA:H@ÆÈ0ŠQŒ" =JÒ£€wŽwŽwfˆþUª U¿BŒ/òˆ| ?Êò£Ëãççç2çùiü4~®9¡9¡9Á‰±ÐTšJSáÅüÂüÂü+±+à|à|à|¸Xëb1e#Á€8Ä!°{Û½íÞ€k–k–k@~%¿’_á%ú×Ôhj45Üq1¾È#ò1TMÕTý¯ÕÎTgª3HkKkKkÃåWʯ”_A*´ ­B+¼È0&ÃR‚`äÒÈ¥‘K@YQYQYp;çvÎíœ)N£Ì(3Ê€/Ê¿(ÿ¢øØ÷cß}=q{âöÄm‹Û·-žìî¥<©<©< iÚµ´ki×°Däù>œçüëóÔç©ÏS|›››J*ݤÌiæ4s Ù4›fO4æ4æ4æ}ûö=h.Í¥¹Sßk j j ËZËZËZ wCî†Ü ÀÜswÌÝœ‰={&°®¶®¶®ž&©ˆ©ˆ© •"ÈÇØv£Ýˆ‡î ݺùòòò°Òít;ÝŽÐ:L’I2‹,þ±èêèêèêü†ý†ý†j¥VjõoòoòoV|ºâÓŸ~ø111p#Ü7ØÞ°½a{cr§˜§˜§˜«È#ò1ØÝØMÔbæÜ&£'è z ÇÈ1r òòòšíÍöf;°êüªó«ÎÒ§Ò§Ò§í¡=´g tUÙª²Ue€Ú¢¶¨-@µ£ÚQíûö=ì DäGäGä~Z?­Ÿ I4‰&MÅgÖ3ë™õá5ñAlý%Ñ’hIÄ>‘OäÁ2åL9S*Žk>kÔ¹ê\u. ^­^­^ 8¾u|ëøp;ƒÁÿo1Ml_`ʘ2¦ HÐ&h´ÀËC/½<ôÄ÷Ä÷ă—/ ^ÈMr“ÜœŒÇ޵µµá£bTŒŠþ‡]zwéÝ¥ww6?™ùdæ“™L___IÞ¼;x7lϳžg=Ï‚D£‹ÑÅÆc„1øþÈ÷G¾?»„]Â. §·§·§°o²o²oZ­ŠV0mÆ´ÓfÑUÑUÑU€j¿j¿j?м©ySó& 6 6 xAù‚ò%l†DC¢!’ˮˮË.ì)eJ™’ßÃ@ 4EÕ\!WÈ’üæºæºæ:—Êüù;ówPx/ð^བ-ñ[â·Ä¹ÜFxK÷–î-àÊve»²¤—’^Jz H¯J¯J¯®\¸4´6´6´³Ál0W_¿úúÕ×¶ícû€ÐÒÐÒÐRØÝ™T\8uáÔ…SÂBb bÀÅa)x5ðjàÕÒÒ4iš4­¦ß¸Á¸Á¸í©½]{»ö¶k²…,x…œ9röY f-˜µ˜­Ÿ­Ÿ­¦›¦›¦›ÿÿÿ@š M&ë³Ög­ÏØì öp$êHÔ‘(àçΟ;î4)šM hpepep%du‹êÕ-¬ýýýÌÒýÒýÒý¿¬qö:{½Û¤ ¯ ¯ À-Ü­? I†$C7ä£çFÏž›­MLL¤‹—¹üËå_’«¼‘7òFPn#·‘Û2ž=ž=ž °]lÛHæJæJæNi”꩞ê‡Î¡sè6Ícó.™Kæ’a½›v7ínþZÓVÓVÓ† òny·¼{|e)KÙùE¢Õ‘Í0ÕL5SͶ2û˜}̾Gº…n¡{³C¡Wèz % % %€¾Ôþ~ûûíïã$çËùr¾°ÑÇô1} x¬ôXé±äIò$y–a–4’FÒH€$ÉA@f•YeÖI@‹EoÑ[ôP\¬¸Xq±‚WIHHÄLÌļS I$‰$ud£ e(ãBÜež+a¢näþEÊI9)¿šÇ¤1iLÚözh¡…–9Ø@Hás̻̻̻  ?‘ŸÈO°ÐÏègô3z衟Zô„BÈTE£i4žÔ¢Wã…Æ \ÛL‡L‡L‡¸²Yˆ,ädIäÞȽ‘{?¿‚"¡ˆœB7ºÑͧ‹õ¨'zÑ‹^þ¶b+¶’úϼxæÅ3eñx×ã]wO–˜|L>&Î\ëWëWëçÚ&„rÈaG ÀlSÀ’RRJJ!Óô½.¾uåÖ•[WØ2OOOÿþqÇqÇqÇñJïÝ+ºWP5P¼ÝnŽŠ â™rZ˜&L¦ÁûÎÀ;€c«c«c륞>ž>ž>Ow5t5t5°eMo6½Ùô&]LòHɃL8&ŽºÁAŸÓçô9@x¶aðaØ€“º9º9º9ðöôô„D!QHü tBzýãn)pÿærñ ⟻¯$2wÓ=EltÐAçÚF’…dáâ¿L\9®œuæ8sœ9ÂßÞÞÞ˜ä˜}1ûbö!Cè:…N(˜(&Љ‚Ïçóù|È*"*"*"\‘ƒIƒIƒIì}9s<æ”-šX4Û*…J¡’;àžÙ¿‹3VRRRRR‹˜Q¸_LjÈ­Ýmnípk÷Üi×Ùàlpò9æ*s•¹ †a†Ás1Ͷf[³M°öWöWöW²÷=vzìôØyï¢ý‘ý‘ýÑÎÏï¿vÿµû¯n@•¸ŸŠ€"ß$èo€Å ·ƒïÜÚ=û_Ú 2™‚8ó7…ß~SèÚ†HD"Þí¾í¾í¾øª¥µ¥µ¥•¬St*:€ T‚êo7¸µÜZn­íåð„ð„ðÆèŽ÷ºûiû-‹ß±ÔÔÔÔÔTðîf;•R)•’ÜÁèÁèÁh|9Qßäeá²pYøÿ|’þ$ýIºïs‡¹ÃÜA?»sôÎÑ;G]¯Œ:G£Nv«$Y’,IþG­¢U´êÄEÈ ƒŒíF±J¹Åÿ–‡àìw´[Œ&4¡ÉUDëi=­Oífê˜:¦îÃÇWޝ_)DK*%•’J¦ƒÕ²ZV{ùzD]D]DÝÒTC·¡ÛÐM. B€@»ý6¸­¿ÇÁàì7Úuo®"ä!yÜí‰:õZm¢M´éŸïÈCå¡òP¦ƒíe{ÙÞG¡Âa°'g sMçšÎ5À ÂÝþÄÂÒöGÿgzçûu?› IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-195.png 644 233 144 3044 14774263775 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÙIDATHÇÍ–mL”WÇÏÌÀÀ$h­ŒÆ Æ[%Pe²àËfDlJSÚ¦ÆFBìºñð„ÄmR0 ]£ÛmÙlUa±1¨A04‚Ò!Ön¤¶,¤hv—F3G)/R†çåþöóÌ3]³ß½_žœsîùÿÿ9çÞó\Yù 8ÓœiÎåK¶óíO|#ñWþ¾d7à(u”ÿ^úä¥O^ny¹Åµm+níͱñcù,¿¬Û‘p)á’£ b×Á;™ïd&®Z²OÞO§§ó™•—+/tœë8Çï 8˜*˜*Û¶âÖ~+ß‹ŗºÿáø®ø.Ç ÁàôÂôÂõ¿_Úð`=¿UüÀC×C—r€ñH"I³Ìb­PŒmÅ#û­| Ï·ø,þ%=Þ|o¾ìywÏ»žæ¥„ÑVôê”ê‹Oëä7|À$qNïÖ»ŒZ£–0gT™*5d~k~ \QÕª0Œr£œ°ZÔÂZÔ#ê¨#I=ŠàÝñû‡-£­ôîIÞ“ìi¶ôØ­4EDNí‚r)—¨ €ªÑkõZPßCÆZ$ ˆW jÔJµR­ŒV ¯âU<°›Ýì¶ÝhÔQ‡øñÛøP¾ª|•%ðÔ®˜VŠˆ¼v<“žÉÙ8››¾ Ô7êæŸMÏ/›_Úß´Ï´Ïl!‹‹‹ººº*M¥©4à0‡9 3¯Ì¤Î¤Âdïdp2ÿ01<1̼‘háß¿{ÿ.ðÏUÏÕÙ8KODXÓU•U•¹EýVÛ¢m©?M}1õjû‰íõÛëázÏõžë=¶°ÂÕ…« Wƒ§×Óëé…ýÇ÷ߦۦۦÛ`]úºôué°iqÓì¦YÈz=«(«5âý.Ễ¾•§+O[•kˆ»ë'£=µ=5ZùƒÏžÌœž9Mx[Ͷ#ÛŽØww¨h¨h¨ZC­¡Öäør|9>[h®;×ë†ÆC‡Aöxöxö8Ô—Õ—Õ—ÁØ×c}c}jBM¦l‰éöÛ´„Ýõ ,ï_Þ¯.1|5ø*0‘vÄô™>0~e¬1Ö@¶;Û톾ƒ}ûÂÍÐÍÐͬõ­õ­õÁ…3Î\8ieieie°w~ïüÞyÈíÉíÉí9;rväÀ†º møþõëÆ#ælæ?ò?òƒ¥Ç)â*v“!Iñ7âoˆÈ?EDä‰üYº¥[ÄtM¸&DÜwÀ™ëŸëŸëÉóæyó¼"öØw`ŸH·³ÛÙíÑêGõ£"]]]"Í÷šï5ß¼3xgðŽHÊ_R>MùTäòã+Ë®,k=Q+ãqKSļj^uŒz±^,"šˆˆxkeQ£‰î w†;EÜ%îw‰È¨kÔ5êé:ßu¾ë¼H~I~I~‰Hj^j^jžHò±äcÉÇD*žV<­x*Ò¼µykóV‘É×'³&³D2ÿùeæ—Qx¯CÓßÔß±õXgŒöéöi éùÛúOúO„­R×dÔdÔdÀíÒÛ¥·Kíœ8yâ䉓àóú¼>/\Ûymçµv¼¡¤¡¤¡rrr m}Ûš¶5Ñp˜·#|Cíýíý¿8c‘[IÕ‡UÚ·ôYÝžè “ŸùÙ&$@€0Î8ã1þZhœ8qòüºÁü€¢X/Ð bø´ªÚªÚçnåkgÁôgãPcÚ˜˜Öœ1«ÍjæÍf£Ù*¬fÔŒÍcŒ#Æ›ÍÆf0̳`€0þjœ5΂á7>7>s»Ö¤51Ï÷Ñ9æ¾ï ÏCÏÃçæ˜5hOí‚òÄòÄØÉlŒð̬0+Ð"³_:z¤–&&i¼B-%£Ev‚bÁ|Ï| Œ¯Œ¯~1ù#|ÏMþÿó¯¤:µ::×´Nàc>&Én±ñ¾ñ>aP·Ô-8À¶­xôHDò-< ßâ³ø£ÿÊöuñ¾Ç^ÌìÃõþùÊIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-66.png 644 233 144 2537 14774263775 14715 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]H”YÇŸ™Ö¯2K²‹u-k—Jc[± 3q%° "¢Ä`òサ$¨Öc£ CX’LÊ,7#‚¤¢.„-)›ê¢ bÉJ+…Ñ)•>¶Íæ}ÏùíÅ;ïûN±Ñmsóò|ýÿÿóÌ9Ï9""23úðÎñÎñ¦X¶·Òõ'®L\ù]—e·šàYçY÷÷Ï0ãðŒÃ©'RO¨~×¶ãv~l½ˆ‹Ëgûe¦¸Ž„s ç<…Q»6älÈIœmÙM×!©;©ûª.T]8òüIj!^¾*×¶ãv¾]oãÅâKãGü"w9î²gââE ³8³øÛíVÂà·°vÕÚUÁ)Á)Ú æ8L².„±1¶æÛõ6žoóÙü–´i+D lcÙÆ¤v« ÿ¨Ï¨Ï €H7ÐJ+Éœ1ÚŒ6зŒùÆ|&ùUëb°èÔ•º2&þ›±ÇØN½ƒÅwøl~K|øßúÖ'®O"‘›`Í °Û|b>!¢.ª5€¶[¤Ñ ºôA}P5¢‚*èt]¡èhRÌ:³Ž˜ïÌwÀ¿6~”Ïá—XAY¿CR()þ ›M`€FU‘*â­Md|c¤i0¾m|Ûø6ˆÌŠÌŠÌr…DEEÁøŽñã; ’YYèÆùS¥«t¯Äásø-=Qa­7 ¦¡¦Á®VßsÒ8lSB‰Û¡ŠŠŠHŽOŽOއü³ùgóÏB¸6\®ÿ ÿ ÿ ˜–7-oZ,ß½|÷òÝð²ãåÑ—GÝFêû‘›‘›1|¿¥Çkõ-÷¢HÁ΂Ñ6Šç]£gëÙò^î˹"žžC=‡z‰\{zíéµ§"}wûîöÝÉkÌkÌkiò4yš<"·®ÞºzëªH (P(ÉJÍJÍJyøõÃyç‰CÀ4K³¼·ù>äϽèIéMé]âYQ´¢È©k§À[é­”Û3‘?‘?‘/2Ö;Ö;Ö+²æÞš{kØôbÓ‹M"é9é9é9"ããã"¥C¥C¥C"¡g¡g¡g"‹‹‹Ž0ñ–M©ŸRoã{Ú]þ¨Hž:]=€‰‘‰÷Ø›…F¶‘ín¶­m[Û¶BnKnKn‹ë_XX€ìºìºì:(9]rºä´_V°¬`Y4ßi¾Ó|Çõ„?áò[z¼"ê’ºäy b”¥Î‚ÒÙçò¹üQ=Öfûk'œysæ³7ý ›ûÌ}LêŸtµ®vWÚYÝYÝY ¾/ä AûÞö½í{câqqqà»í»í» S;¦vL9•'h¡¸núMôì£ý.¿¥çÓ§ò1fŒ¹§ˆù¤“áGbˆ ú”>¥O]tÑï§Ÿ~ ]ìŠÁ3ׯëOŸÊOÏ13Z•«rwŽ©• À¬1kÌP>åS> >ú@ÍUsÕ\0«Ì*³ TžZ¢–=Œ0 ¶«í¼µn€Ïαÿ™ü8“¿ÏìP~å·î@óιµ;圷rœzÏÆÿääÿÌ]itûÙO2a# `n673 úº¾€¸¶·óízï³wåûºøbßc_æ ö?½GÑ}LÅ»IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-63-red.png 644 233 144 4221 14774263775 15615 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜFIDATXí—}P•UÇÏórQ #ßò…Ë:Ž½Ë ´á¢¨€M¨… ê:`;Žk“‰aÓ¤C;D2–Ö2ƒ9»êFx¯5‰I®Ù°ij³±ÛRmÅ(\ưI!…{õÂ¥çå³pÏs_¦rvvÿðœs~/Ÿçü¾Ï9!Fì6cꃣ¼£¼£¼ÊðDRBSBSBSþ\ÝÔMÝlû“˜-f‹Ù0²lïºÐ….Ç;¶wJ/óÉü±õÔcy¢ù6‹Íb³ê‰]Ÿ|·Þ¤7éMž«J¹R®”; ÉãÆŒ௅……°âÛß®øв‹²‹²#c¹.ýe¼Ì'óËz¿Ì#Ô߯ŽgìQj@ tÏ–;”R–R–Rf>½ïì¾³ûÎÚcü?øðÿhhh¹Îu®ÝtÓ Î8¼.ýe¼Ì'óÇÖ›±ç—ù„{¬Ú£ö¨=Ý'd‚ì³?ÎþØøM×]¡®]„ÍN³'Ø0ÌJc¿±Ì sº9Ìs©¹Ì 3Ç̳Ҽݼì4;ÑNÄñ2ŸÌïÇÔwuÐâQ+ý#ý#€×”×”hÀΔ΀9w̹#Ê?4¶xl1À•V‚቎!XWZ—_—oopv6†OؽãgŸ5~;¯æ_Í¿šÀT¦b*ßy—¹ËŒü éƒ$€ÚmµÛ¢ç/œ¾pà±å-˜öÈ´GÚÔ6àÉÛž¼ ð'V%V©½z'8 ÆÕü¾ }@òH> úÒ£»Ýõè®È›™]ÆDc"Ð+§æ`CÞ†<€Ò.•_*8Þz¼à»™ßÍxâÓ'>8ä:äŠÞ´c{ŽíHX“°èí8ÒqÌ®h‚’Gò…A9ZÔVÔVÔ–¹H>öú“ÎM:pëê[WGïä¦òMåü„nnÌ»<ïr´ÿòËpÁçÍÝæîHý¢û‹î/ºß9·Ê-™[;·vn-CJ°/ؼ3òeð;ÿzÿzÀŸ˜•˜0«yV3À¥s—Î?vüX4@Óö¦íÑ ××]_pðüÁóë*×U¡[Þ¼åM íKõKìôp½°eË—=ŽNÉ'Ôµ@-øñмêöoÞ?fÿ˜( Œ–sæÏ™„6woîŽé·ÿ]×5×5€šµ5kV´­hh¹»åî(wßéÏŒ¼˜ùö¾‰û&Fê}´ûÃÖ[ü½’®¤+é?^ÚÚÚÛjäW–:=uzêts†oåù¦óQLJ½pû©í§< À~gÞ;óž;üÜaµJ­hó´y2ë3ëf/™½àÄÃ'‚[S·¦K´:­à³7>{ƒP0\hÖ¶{úî鳜 @›¬MÖ&ïíIyIyIyBè§õÓúéÆçÀ/Zôê¢WÍ-’Ôª<>xœÞâÂâB ([=é«I_¼•ñVFôNóÒ7/¤­J[øÃþýz'ô‚µ·áHÑH«ËþYúbé‹VÐ\¯­×Öµjdœ(¿zi)¯»Ò]é®ôî?Ë€ŠÊŠ3ì…NçÆ™¯˜¯`ƒÀ?ø‡›‡›£íuö:npYY \¸féÐûCïGZ}(p¨úP5Kœ+´F­Qk†ò•©ÊTeê½ûâµ9Wêe²fQ½Ò¨4*R+Ö“ÞïQïQ¼Žv·˜gÌ3#›„¬ƒÖÁh^{œ=ÀÞho{¡Ýh7F¤ÔÓØ“Ü“ ©£ÝŸ¸?169;Y¥m×¶Wä:h¢@èîkŽÈ9z•ðð¡õj½ZïÓÇœ«µÞ½Ç½ÇHö=ë«ñÕDk×*³Ê¢10):/wr'Ø«¬,+‹t+þGñ©âSæçº®ô€÷…)OMyjÊSB¨¹j®š«¼¦+•˜·„ÿ®Ò:µN­Siž¹uæÖ™[…p•¹Ê\eÞíæäæäæDkת°*áÅ‹¸Æ5®E¸Í»Ì»Ì»"Z¬Í¬Í¬Í´:wy²+Ù•Ü3þµ4:¶ÓÊÉ¸Ö %nx&vì=¢]ßÛQÚ­¬¨ŒÒn²‘l$G€¬ï­ï­ï#Zl§vð&¶'¶'¶Û…Ž&“Ô$5iõâ¤øzß(ñËZmœv B»-Þ–ˆv£ÅhqCƒS§ Nûî¸oÀ¼ÓÑâaí°vøYRjaéÅÞ*nb™àç´»Û½Û½ÛHö5ú}@ˆ!$iEsEsEsäØÑëõz½¾=ü/Iâßãê†çŘ›Æ› XÖî{?§ÝK,]°4¢]o–7Ë›Å_FÖm§J‰R¢”,Ú[F½WWÿ¥ÝL»j5ZVÓ!KªKªKªíWÒ†Ó†Ó†;­îÕzµÞŠÑ Dƒ;š/®Þ(ñ?Z¼v_ˆ/¸ <®<®<b±X,[÷¨ÓÔiê4P„"ñ·3©ÁÔ`jP­UkÕZ•ëâ:÷³dç)Oä‰<ýóØågKU[µU”“ÊIåä¥_ÌßáëLW\Þ›¶ú?ÓÎyé#ÚºIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-112.png 644 233 144 2640 14774263775 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜUIDATHÇÍ–[H”iÇß1k2m í°A‚…Qˆ%4Ñi*‰Œµ„IÚ¬.ì`§õ"'iÃhƒŒ¥Í·‹.¢l§°£ŒB·õÀxÓy,Ö V-Íltbæ;¼¿½˜yýleoöªçæûžÓÿÿ|ïû¼Ï÷ B19þ0+aVBJLOØeÙ“Ö%­Kÿ=¦Ÿ7ÀV`+x\©çRÏ8/9/™Ï,]ùUüè|!,üÑ|Ê.& Ë`¯µ×ÚÜqý.(\45¦ÿÒ¿Ã?¬Ãî[»oܼ|ó2 »­» `À=àKW~¯òÞh|qâ_üBÀøúñõ¶.°O°OfçÎÎóC,àåÈß¿à͸7ãdïd’¥BIß(]ùãñ*_á)|ŧøcõH[•¶JØ´eÓÇÅX³tï ï ŧùYÆ~ö“̽Ao0Šb" ËÇÀr¹B®.Ër'€QaTá7½Z¯ ˜b’©ˆãáîhq>©øcõX[i !Ä™µà1RP@–ëGô# ƒÆSã)ZÜ!ÕÊÈrY.ËA>’ä#,qâÄ r±tK7h¡M—6iÙÃÏTÏT _ñ‹ÑÍ6¯½ŽÞP"‡‚C@;y ʇ„‡ӓ@ûKëÔ:#ÃÃà]Ð.h,»–©ej™ð~þûùïçƒöS¤&RC8îÎãÏàÉàIGÈ %ªzâ…o¥§dwÉngfÉZ––U×®!—z—–.-…»¥wKï–ZÄ}5}5}5àªvU»ªáþÕûWï_µüë›Ö7­o‚ÔS¥‚å§—û–ûý/{;z;Fñ=ÛãÙãQ½w¾5^XGó}3}3U ,îÿtöÓY"KÊ—\rÐ:»¶?Øþ`»Eœ“Ÿ“Ÿ“où;Vw¬îX u×ë®×]‡ôPz(Ý:¸¹öºö¯œÙqfÅg¨ÙV³MÖQ& ¥)¥IÖ2Ô=·{.ð,zÐ\d.ãcš1 rì9ö;øûýýþ~‹("#2"a±{±{±îÜ)¸S‘žHO¤^7¿n~Ý §N5œ‚ŒEÙÙÐüwÓ¦ŽyèïT=œ“œ“̧Ð÷¶ï-PÛ!)Íwæ»Q_zÔuÔuêlu¶:ÛØs-t-t-¿Ïïóû,{Y¸,\†ìÊìÊìJhKkKkK³ürS|Ì ÷û‚ êI¼mÞ¶=èùz¾BB‘fûVDETŒHôpôpô°ú+ý•þJŒ‘ÏŸ+>W‘ܘܘÜ(D`W`W`—U«&VM¢hkÑÖ¢­Bt]êºØuQˆß?Ÿý|¶¶ºç£ÝÑn!¬zTáô ØžóþQÿ¨zÊ÷•ï+ßíSÚ§´O»beeeðdÍ“5OÖ@«h­r—å.Ë]yÎñGXóùšÏmŽ6c2ŒÍyÓ?r½H˜?RÏ´ËZ b»b»,{Bøcxsë›[ã~Ä C`?o?¿€w{Þíènïn§ æoÌßðìñì06çMs½ÉÉ/ÿL_lm-ÿؘØÈ(Ì(Ì|?èp7Š^-zà‡¨¢”t@‚Úxñbw6çCþæz“Ïä7õLý`<))"PòVÉ[öV4‘ÉsðAÚi@€vž/ø”OI€À÷ïAùe2üjÎè0:@¹ ·á¾Qõª@wêNüX, ´ÐB‚ºâû[uWu—àä9þRì/öÛ[ÍxäsûÙ‹Pú¨ô¨÷´¯Õ4ñ€êQ=h¸™aE€ÿ?ãÃרµ€R{ÆF4à@%ùy­´²´Ò ð³#R)"²é ؽv¯7šo§§Wh_Yšõâ_`C`C`CXïaòÃä‡ÉpoàÞÀ½pÕ¸j\5 ÇëñzüÓñj'µ>­\¿ù©ý§v|ãA~˜öN{Ú»íÝÞh3áß""ÍÃà¬uÖ‚Ê0²=§\Ç\Ç`GÃŽŽ¨+¸R}¥:,”¶”¶”¶›k7×n®…mÙÛ²·eÃÄòÄòÄrØï~Ïýžû=°;g÷–Ý[ÀÑäèvt£JÏ77À“?õà½Å÷AõãuGDd´:ïvÞ…¥¨Ê_ÿþ…¤’ð›û:är9aѾh_´CúÁôƒé¡®¹®¹®¦F¦F¦F@]R—Ô¥p`í¾v_»ò“ó“ó“Áãó¸=nø¥c]ÿº~üÃë&æ&æT%ô©>zC0Á»ºouŸêâöüªùU ªB÷(UûNûr6ç<Ÿó<\;~íøµã0jµŽZ!³*³*³ vzvzvz «%«%«f®Ï\Ÿ¹‘à (ï€wÀ;»~·«jW$Ýv´:ZÁõ§Å¶Å6w¾;T]bab¡ê²JbTyT9[ä–í¤í¤ˆ4‰ˆÈBÔ¼-Ö!#1–‹ˆ6®kã"i7Ón¦Ýi-k-k-v ;†"ë¬?²þˆÈ…¸ qâdeŒmÛ>¶]düÎøñ;"½3½³½³"©µ©çRω\úë—¶/m² ’t4騈8‰c‹U0z^Ë-Ñ´—µ—E,é""’b/_\î_î‰ÎÎΙ<=yzò´HÅBÅBÅ‚HÛÞ¶½m{EÜûÜûÜûD2’3’3’Eº+º+º+D333Eœ:pêÀ)‘áUÃöa»ˆç·žBO¡Èš»k?\û¡¤ˆø}~Ÿˆ”«D•h¹º•£Õ|Óq¹ã2ðZðŒ…á¯YU#5#9#9#9á 8sẩ3g˳åÙ 3±3±3<(xPÅÅÅàŠwŻ⡾¯¾¯¾rÌΆօ–Æ–FüA6UÉ?:Îvœ¾0Ï+·ò¨ó¨)kdCÀWtøñcŒ1giA"Š(а÷ÒK/ ÐÐ"ønë)z Ðhê9?q~< ÝÊ•:¦ìsö9o4Æ”6&xÅØ¯]Õ®âÃÊV¶?2Ë,èMz“Þú!ý~Œ£Ä(s˜Ã`dYF°‘tÒAoÒoè7@?öäò“ËøŒÔP˜Þ4½ À>cŸñF3gÖ±§*ÿ±oÄ®”ůYÒ¿Ò¿4c¿±åŸ*´ƒË<æqÄ)tt`7îÐ^ƒBoo£±¬_Õ¯Fð¯è=UùÖ+ÍÞeöJB½ ê¨#!œb½\/ÇjH `Áalί‰Ðz“Ïä7õLý•^ù̾.žÙ÷سù‚ý/îÉß+{èÓIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-52-red.png 644 233 144 4345 14774263775 15622 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜšIDATXí—{LTWÇ÷1<”vh«¨P,]QÓeòÐÅGl£k Tkº¤ø ØZMè¶¢HÛ%-–ÖøHCa_t%Y "ÑZ³A²6¸ UX¬GF¼÷žïþÁœ;¤šf÷ü¿s~Ï=ç{~'C41BÉgˆÉÖ@k UqO„ÔÔÔe,–UY•Õ›Çi!-¤…ÀÄ2+#™d’¹ øÚ¬Œûóxžç÷­'&ûòxóí¤´S´ø®‡ÇÊur\gy,ìv »tcØPØPØþ¾¶cmÇÚ`}ïúÞõ½À:ó:ó:³ÇæëÜŸÇó|Ÿt/ä;•••§¾wìÚ±kÇ®±IŽ~G¿£€ œÆ0†t£Ý€n»×¹?çùx~ßz3¿x6™^ûÄ>±¯û"O`¾j¾j¾ª,ézÚåêr¡ îÁ♉™ ¨ÅÊÊ€š¨ÌPfj–:W ¨‰êru9 «1j ÀâY0 †Âãy>ž_ö©ozAG,‚E°ÉåƒòÁªŸx@ZYÚ—i_*Y:ØûhF3Jöb/ÀºÝ ãÜ8hzD>Ë0®ÕÎzü•*Èö¾ÖªµÂÁ½ÓÊÒJÒJ”,^Ÿóp>2ôz =øw0•˜JL%l¶í‘í;ÛwäêáÑîÑnúlè3Ž‘˜‘þqøGY1²X"K„×P6+›8ƒN›76P³ VáùHÛ#ÛÛ šJLLØlΣóÉÛåíòö–ƒ|áhîÑÜ£¹ìw§bá¹.„^àšð¤©˜¸^˜˜÷{ï÷€ýkû×°$hIˆ-b WÀá€ÃpàÖ[€'ÿD½£¹G#F²wôõá#f‹ ‹ ‹CÙãŒÇéÓ€°(ˆæß|²þd=„Ÿ?—/]¾³gÀéÖÓ­Þ5·®Þº"Þˆx®}{í[8Ôq¨€ÃýÑß½ø®gûgØ“ìIçá|¢›ôTr^r^rí k »v™F5›bVÌ$ÓM·Ç‹×;¯w…6‡6Ý»3FDô°ùa3ÑêI«'y_ÌŽŽ"¢·3ÞÎ "2o6o&"*XY°’ˆ^¤Y4‹ˆnvÆvÆi6""’Ú¦µNk¥QÎÃùÜ B¬!ÝnH׫Ò6ê¦n"šÆ§ú[ú[ˆˆ:*;*‰ˆÎωˆòoçß&"z¹àå"¢Á‚Á"¢ÆW_!"úøÜÇ爈Æ;Ç;‰ˆ-9´„ˆ(¸)¸‰ˆ‚Rî§Ü'¢o|ÚO ¡ÖPk¨Õ¯<ï¯,gqùâòÅå¸;&Œ c€3¬Œ•a+?ú‘7"àú½ë÷¼¸+¯+Ï[«§ÖœZã½~©øR1D|ñDDp}tö€›î‘ ¶©m`<Ê<Å<Å<w9‰Yb–˜õô¡{¢ìäÎc'Æ<âVƒFºFº *±*€«÷pïao'±Ob½A³ã ö6ìõžÿðÍß Œ:þ©'Z=­Œ)^õš4i>¢¿€„!áéC’I‹¤EûJù-‹Ž1U™ªÔ™¶?ÚfØfxÚKÛ· â×įÀCC`÷«»_€É®É.h{©í%HÎL΀K‚¾·oà¬[\·ÀÊ“Ù'³ «¢«.'”Ÿ•Ÿ¸} æ,˜£é€.…Ká_ RHzHzH:‘|E¾"_©îÓþºÔý©ûÕBNªÝn»Ý¬IIIIœ|§fg þ|ýy€émÓÛ hyÐrª¡ƒR¾”h_5ù5ù@^káÆÂšSÜ&m“¶ýkÄl÷{B£* †CB÷ PT\YÉRõþ1E±*V0À±Â±€cƒÑ`4ûÆ&lSïI ~GO‚Ÿùƒ¯m šÐ®í´—v‹‹Š½´kTŒŠÑ¤=Ðhf³ÁŽ€°t–Ër¡¨ÕÊYå, fžfõ-õ-@ÍR—ªKµZ¢NX:‹fÑPx¼}Ìî·ûaçùuÀaõq:4Á*X+‘|X>,nýŽ˜êLu¦:Ŭ{me[áUZ•Ê€9µw´wŒ2³!(šñ"{À¨6¢Ì9¾ª´jkµµ{OËÒ²àåÞ¦:Ó~Ó~ÅÌës<îîî®þ5w0ÖkŒ5l¶cÀ1àÀ£@¯ú‘ú¹ú9 µ¼Xõðäà“ƒàŸéŸ‰ÿ ã†×³Ö³FšGšõ#ÖÁ:t'¯cÀawØñˆ×çxt|ò6y›¼­÷074–7–7–³Ê@ŸbUÚ•v`°øyî~L€)Æ)FhJnJøCÕUðòê—WãŸ!ܦ¸MprãÉ€b Û•¯±¼±°±Uê ÃG̘–˜–˜†ºÁÂÁÂÁB=PA*bC¼ÚaíphβÅe‹C ñLã™P»Éb²€±ÏØ}bŸU U ¼Ñ£HuOvOÖ,¸=pàx8>ô÷ë>^÷ñºƒ;Síê :À­~¯~  éZÓ5HîJî z4áhB¨ßÛ%o—€Õl5‡®_8ráD•E•pß:wë ÚC}àãx8¾Pœ/î+î+î KÍË˽~þúyH2&àtçéN˜dd€ON}r*¬Øgø o|¼^ù镟B7¶þäú“†÷«õj}°~ñââÅÅ‹õsû¼x9ëêqõ¸z„Eþ%#—G.Óì‰íÑyÑyúÝøá@ •Ó+§Ñ æ6sÑëi¯§ù’}ÉDDO=O=ag]6eIÝR7Qåpå0ÑüêùÕD4zV:+ÑíÒ ‰H¼©ejª!""Éít;ÝN²s|$šE³h{À¯º;Ž‹ÇÅ Ltõ¸z ¦>¦€?Æc€¸†¸÷‰û€ò)v%îJ€7^}ãUèjïjé³âÍöf;«¶·$µ$ëý­þrïå^½“[… !CÈ{@Òi‰´do-ÿÊRi¼i¼©Îrltp¡^–÷Mÿ7ýp5öj,öå½/ï…Žrûõí×À»Ê» Òæ¤Í€¬¤¬$¸¸úâj¾Ý©»S¼&5Jðí§ß~ ¿/€4m~HS¥©ÒÔæG[[[@$_‘¯ÈWÚ\ú_lÊ6e«»øV5 »Æ®Á~¸ûFºGº é~Ò}h^м ”¢7Ø é5é5¼ =šìžì´æÖs­çÀ¸wÅ?Ë?,ÿPóé·H[¤-7KÆõh7…ËŒ£† Ã"Ã"çq`©¶³cyúä~áòGì;Àû¨ùQ3ør|9€=ØèD'¿¶J[ž»ž»€Z>òÅÈÁQŸ>]sº¯éWh­X+ÖŽ Ó„i´_µD”®éWj™P&”å7 mB›Ðƹ¢UÙºl]¶®`?Õ]ê®`¿ø1€1™ÉÀªXÀòXkÓ­^W›+Þ¤N4^5^U¶é<(í“öYL:43™É,ƒXWÐ Z!$+YÉJ$¹%·ä~÷‚~µ6)ñŽ=Ž÷ï ²<í%í%À^ìôarÒÙ0sV¢åh9Á{mÓ?6}µé+u—~=–‡åaÛ¡”í)ÛS¶‰&Ñ$š„öºrsRàY"Ý‘îHw„ÎÙ»gïž½›ÈPa¨0TØéÜ]aZaZÊ]Í¢Yà‡ 6Ø aCÁƪóÔyê¼ ²²²Yž~—Çâ ñ®‘À¯¥‰á“.EŒž„õëpÝ8ÑaÈ0d8ÚC¸[m©án¼¯Äi÷µûÚý ûÑ~ÀÝÝÝÏŠtNÆŠ±bì›"¨x4ßzö‚ÔÁÝ¢çqWéRº”® sŸ¦çÙß³÷sHVVVVV|0¶Ñ]̵sí\;«Ì:u:ë4óËy˜ó0çá²ç˜/óe¾ÞâýyÞ?b“Ãà08 ì#£Å$h І6´Ø„MØÄ>’'Ë“åÉ$ƒ{À=àü«˜X‰•Xÿ~"{jöÔì©Õ·sµ¹Ú\-±ðA|D–r?x¸|è`4¢MÏ 9BŽ#üàr9‡žšŸcÌ1æÏv:-N‹ÓRõO{¸=Üñ®×a¯Ã^‡QO2"¥‘ÒH)0âü‰ó'âX¼.Þ/>/êé{ò‰ùE‘óTp›À&° Âd#ÙH6–I‚$Aߟ***yz⤪IU“ªÜ;ãÛâÛâÛ¨kNËœ–9-$Až!ÏgÀŽÝØÝPÁ;ìÖc=Ö˜†i˜»#Àà@BKmKmK-s]Ö\Ö\Ö;{ñ·{qíAU*H´PáÞèÞèÞ¸ô0Ó1Óµ¿A@@@‘̵̑̑¨EmÀxÎÀ8Cí?œÃÎaçðÓ+ÔÏ«ŸW?ÏG§¤¥¤¥¤qg}~÷ùÝçw¨!…RðB£Ð(4‚#±$–ćq€À 1A2HÁC€œm¼m¼m<î—+?V~Œã~Íýšû5\½L)SÊ”—ød>™OŽ]XÄ"¶ûwª¼¡¼¡¼Hý¤~R¿¯Ù/Ù/Ù/=½B¨NT'ò :­N«ÓrõÞáÞáÞá˜,¬Ö k¸à‚ m¦Í´À!Â!€t‘.ÒâOüœÇyœD@VÊJY)àîîŽÉ¢¾:Y¬NæÄü"ÈGùA~\>ßyÑyÑyQû?“^ôê¤WYpÊÅ”‹)9Ñ#ž©@†É0*‡Ê¡x¯ày“¼IÞF?*?á'ü°l›8žq<ãxp‡¸CÜ!¹En‘[˜ ê§”¦”¦”rgÅü"ÈÇ1 Ó0;•./——Ë ˆÛ·?n?â}¾óùÎç;Èø/›}û>ö}ŒæF̘AŠpgpf ú}ú}ú}ÀÀºuë€më¶­Û¶{7ìݰw½F¯Ñk|/ðp¥âJÅ•  /¢/¢/Øœº9us*•••\Hºt! Ø3°g`˜²9s2æd"‘G䣎>GŸ£Ÿæææ#C™§ÌSæÁÎŒÌÈŒàD…)eSʦ”   €ß~¿ý~ûžž€›ÍÍæfúaݰJJJ|Ú|Ú|Ú€Y€,@¨×«×«×ôú ý°Ûì6»m ”S½¢zEõ ì"ÈGñ>ÀDCÏÑsôÜØrÔ¡uÞÇûxHII4ýš~M?Pì,v;“~'ýNú!!!€Ò­t+Ý@lTlTlЮo×·ëþüøÇ'O4mš6MàwÌï˜ß1@è:…Îÿä§©4•¦8Žã8N4Tâ/ñ—ø³² àÿÿÿ$¤’T’J0<Æc<5R#5‘ºH]¤ˆ©Œ©Œ©:::€G·Ýzt ¸Ys³æf 0}õôÕÓWñéñéñé@LXLXLб cAÇà¡ö¡ö¡ 4‚yÒH†~úyègÜ£jª¦jVFùŠ|E>_xo꽩÷¦²²¦°¦°¦0¡E(†‹‹‹€S¹§rOåÝ×»¯w_ÂO‡Ÿ? ¬øpŇ+>6‡ÍaZý[ý[ýÆ]»wQ¶([” ˆÌŒÌŒÌ–›–›–›{ƒ½ÁÞܽz÷êÝ«cu6¯4¯4¯Ì=æs>VÜSÜSÜã )R‚”ìb.‹Ëâ²HFuLuLuŒ[muY]VTòUòUòUxlxlxl G G G³Õl5[«—¯^¾z`fa 444444>hŸ÷ù< Ñ·Ñ·ÑX¥\¥\¥&?˜ü`ò ÑœhN4“ú'õOêN•O‘Ú¥v© ´‚VHF2’d bƒÀ¹Ï¹Ï¹ e´Œ–Ü-îw ö›soν9«JºJºJºð­Ò¤4)M#/2 “0IÄ*ÌÆlÌnÝBi1-¦Å’´€Ђž¿ &Á$˜6:UÕªjU5P»¡vCíÚ2±ebËD”Jä¹DŽaY¼,^ÐOé§ôS€]g×Ùu`°k°`¬“u²fY³¬y p`à›o¾ª¢¸¢¸¢˜WKÛ¥íÒv`´ýÛ+(E¢Z· …(ä>ø=²‘lò˜`‚‰_*ö£^èD':ùÛØŽíØN Ï}ýÜ×Ï}]ø²b³b³bsi®u²u²u2g+ŸQ>£|Ƽ‹ô ´ -pŒá`©,•¥‚‘÷È{ä=È4ÿhþÑÌ^h¸Öp­áš¤ÐkŠ×¯)Ý#γγγ»òngßξ 03333¼=2_Š vÏñœ0N'ŒƒwSoSoS/àÜîÜîܾ+ÏË×Ë×Ë·ý\›±ÍØf”V¾VùZåkì’FÒHäÂáŒp J(¡X?ëgýá Ox ÿjþÕü«¥UóªæU̓·—ÅËâe„ÂaÁ®¼Qëux¬xÄóšËÅ €ˆoîù%‘{†žšH Q…*T¹whM¢_xy´;úþ‚k«k«k«ð×µÂZa­@Ï)˜S0§ÉÂáŽp*:›Î¦³áà3ø >òc!ÇBŽ…¸gY¢,Q–(É]Å<Å<ż…£ÍÎz¡H(Џ#ž™ý›8c¹¹¹¹¹¹+ ω1y¼»ÃãÝ#ï^ó®:èèQ£Ëè2ºø­¶¶¶PQJ)¥è+Q=\=\=,Ø»‹º‹º‹$w{{{oW8z=Žž½ï¾t÷¥»/@µ¸žŠ€c;"žˆ'nPyê<Þ½ð_Þõ·ú[ý9Ûù¬óYç³Ü;0 ³0 ÞžUâTíÚµ7Ȫ;ª;ª;€ Ô‚ú¯?pk¸5Üšá˜àÈàÈàHÚçÉ÷¿âõ$—K–,Y²d xϰ…ɘŒÉÈ6˳–g-Ïâ ÷L÷L÷Ìòò`y°<øÕ£–>Zúhéįm­¶V[+û¿¦/›¾lúÒ½hÐ5ètI¶KKK¿ÀN°ìÄWC¹ä>úЇ>aš8žBñOòüIüwsP‰JTº³™˜a‰‰ê©žê¯$$$ ÏJ‹¤EÒ"Ú*ÑItÝåš}ˆ>D¿l‰Ùd6™Mä;á)á)á)vÒ£kôÚÿˆƒâOâ ïz– w6Ò†4î_DK´D{-„U²JVù÷õÊ@e 2¶J:%’Ξ@á€p@8°µ÷Îê;«ï¬FìÑËá?ãø7÷ÂÚ¶8TIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-18-grey.png 644 233 144 6053 14774263775 16016 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü àIDATXÃ…—TTU»Ç¿{Ï™fÆtƒÁKLL ÖEô"o™ XñzSzÓbM¬%]äÂûæRkIJ T/‰\1}e]n? C2$¥‚±zCÞRP¡A@(” †™9söýƒ9ÐÊÕjÿsÖÙç<ß糟ý={ïCrrrrrr Æ\3Ï]èZn€àXcÎÉœ“9'™&o,o,olÃ̹3÷ƒÿÅûð>¼Oèk¶:[­Ž½r”£œd!AЋ^ôx ¯á5ö¾ÚüOëjëjëêÐ7TGUGUGq!46464–d…IäaR`Ç5€x/>ßãE½y}W>1¿È#òq® >ͳÅl±ð ÙN¶“íþG%þ‰ÿ×Ó•Ó•Ó•zx6{6{6;wÇöÆöÆöRGpwpwp7Ù(Ï’gɳ`Å[x oA +¬°HA R,Ã2,ƒÕækóµùbcw[w[ws|ôUÐWAÂî{ÏÞ{öÞ³/Vú+ý•þrsnwnwn9ÊRY*Kx…€€€>M²g³g³g´¡ m¾qu\W×vÚ>cŸ±Ï<úgÝ:Ý:Ý:>2)#)#)ƒ;¥žRO©§ c<ãžµ³vÖŽl#ÛÈ6€ ,°ÄB,ÄÞÕÏ™2?d~ý5%5%5%ü+ý­ý­ý­Ü·2…L!SüØÀ'ò‰|â3[ñ žÁ3CSTqUqUqj¤©æï—­ ÖkãÖ%é’tIüÆT}ª>UÏ}«öP{¨=°T¨ª…j]èB8ºŽ®£ëÒGúH@†Èˆñ!>ªQêypŽU±*V,É\’¹$KE}]¢.Q—Èoó‹<"å-¼…·Ä­±aÿÂþ…þ?<“<“<“X@ÒGI%}ĉ™b„!‹im  €sss0£ŸÑÏè,Â",Ђ´èD':¦eZ¦lÙ³=8Î@€Ü 7È ,õ“ª’ª’ª¸Sž[<·xna"ÈDZ Ä‚lv¨*‡ ˆ~'úèw«nR7©› ®W„+P Ñ € ¸€x2Í}Ü}Ü}﯌Zµ2Š”ºF*£kéZºûpìñ M…¦B4…4…4…ÔúQ?<Кƒšƒšƒ€ Äa¤%§%§%À¹„s ç€É}“û&÷͇ɂ³‚³‚³H©È#òQÛ}Û}Û}üŸ¶P[¨-D–bŸbŸb¬Âfa³°œ¨ÀÔLÍÔ€÷.ï]Þ»¯G¼ñz`O²'Ù“‚Z*,– @¬V¾2_™¯ Ð¥èRt)=NÓã€Õl5[Íóaœòå Ê`yD>Š÷ðÞ#Aô =CÏÌÈÉwä;òÝBbÍ”fJ3Äïß¿ðÚäµÉk`´Ú]ÿÁúÖôõõ}úôNÄŸˆ?õõõšM‰¦L‚I0-ä§É4™&88A‚¨ÄGâ#ñag'Ã'Ã'Ãq›ßÃïá÷@BΓóä<~Àø`),…¥üŠ$ iH0 L<Úiê4ušß(ß(ß( 63636xjÕS«žZüþcøáÀ˜~L?¦¨–j©Ì.™þ~úûéïq›ê¨ŽêØYêVèVèVÈßö¾í}Û›½^v½ìzD—ÏB &ÒDš@%”P&˜°P ̌όόú}‡ˆˆˆ²òò8Cœ!ÎX;¬Ö ïRߥ¾K áÆÍÆÍÆÍ€qØ8lÆ!·Ûn·ÝnóÅIHBRn9—Ãåp9$«Å£Å£Åé3¯2¯2¯‚’ª¨Šª0ÉcŒ- jA-¨vœgÇúKKKÀC‡­ÚVm«0è :ƒh-h-h-ØKì%öà×å×å×›+\ùåë_¾þåëB$1#1≓8‰³BF555 öË¢eѲèÊ¡{kî­¹·FÒ_³§fOÍç.—ÀbVÊJYé¼ äéòty: ç弜pê·˜¶˜¶˜K—<.þøðLJŽÌŽÌŽL ¡0¡0¡L«ÖªµjÈkÃjÃjÃë?Âðô[ÙÙÙ‘®­“Ãä0ívìÁìÁìAè@Ç¿“ŽIǤcW–zK½¥þÑÔEŒ"FÁÖÇUÇUÇU“‹ìyö<{ÌaqX±Òòvy»¼@=êQÿ«-4‰Hìììz–ž¥gîwƒ»ëõ•×W^_‰¿TVVâK…AaPfŸe&a’п`V`Å­”–ÓrZ.¹J‹h-þ›` ‚a»]Ù¦lS¶mº6]›Žý{÷Ýot¿*—Wg¤³ÒYé쯧1iñˆG<€Ø»Ãî°;€¬KÖ%ëšœœÝ|Ä|Ä|JÒI:I'&ÙIv’ ‚ *›ølâ3î˜|™|™|YUþòCË-?tøkä"¹ä4 0ÀÀLjçQÕÜ×ËßÄNìÄNR÷ÄçO|þÄçÅ›ÜÒÜÒÜÒªò'<'<'<9s¼F^#_ð.¦0…)ØÐntpÀÇ‚WY2KfÉ`ämò6yòvc»±ÝÈÖw\î¸ÜqYR¬zXõ°êá¡Yû)û)û©7 næÞ̽™ 0#32#–¸d>A­®ëa‘°HX„%×F®\ì;í;í;ß,P¹«ÜUîgzë{ë{ë%Å/6¾Øø"[O2HÉ€\øTøTø ( Ø/ìö @xÂ3?6þlDUsHsHs–¨FU£ªQ@Â…ð7 æ¬74ë²â1×0ãæ7 qä®_¹ëÖ5E’b4£ÍÎ]$’D’Èõ›æ~9¾>çHw¤;Ò…¿¾,¼,¼,еÁEÁEÁEHz„¡Jº‚® +`ã³ø,> ò’À’À’@çòшшÑIŸ[ˆ[ˆ[HñŸæ>šÝß ¥B©PÊsÍìßÄËÏÏÏÏÏǤXQ¸:æ=äòî.—w¹¼ûÅÞuÔ;ê|º¹Ì\f.ƒ’RJ)Å/b%ZfZfZfëPéPéP©¤Ïm¿Û~·ý7/؆möáý‡ûžë{®ï9qãàuâz*Š|ó ¿_Pº¾qy÷ÜÞõ™ð™ðáÌÕ9Õ9Õ9Î]XŽåXŽ%ÝÝÝø¸íjÛÕ¶«äe²GÙ:A'èþz…ÛÆmã¶Í<Fï»òý§¸Cý–K‚ßiQQQQQQ—òn&c2&#ÿ=úøèã£ã#§ŸÓÏé÷O^ lùÇO1?Åüãñ¹ù–ù–ùûŸkŸ\ûäÚ'Χ-‹Ãâì”®•®•®ÝãËÊX+ûìäC.éÇ}ÜÇ}a™8®B=°…üAûïæ¡htæ²:VÇê¢ ´–ÖÒÚK³ ³ ³ ÂãÒRi©´”Þ’¤JR%©_µÖÖÖnˆ2Œ£4 ^‚—àÅ*\ºõ.@ëïqPüAûw]Ë…3È@÷/¢'z¢¿ÈY#kÜ›¢Ð*´ -½%1ILÓ°V8(¦ôlíÙÚ³˜D€KOŒu£~q¿H1Ÿ‘— &Â/„_0mÄ'àÕÔWS#Vúã:Xº,]ÿš‡ÃŸþ ó\ç9~ޝ_LnŸÜÁØX7ê~o1¾œø/~û4ìSÓ?!|IøXýòê—_øµ¿`è(*(*ø!ä‡em ˆ$Rm\¸0ç¢ØXÔýžoðü~=+^\ñ¢ ÅSÅS–Ã@ÍUçªÎº àëâw4ÒH$h¢ Ъ™53õµ~J?üIÕªZuOÝæ´R­ÌOÎO ¼Ç{Dª/xç«Ú«Ú m|Pì)öXZ =òŸgûö6”ä–ä‚Jðõ< >ÐßÔßħŠTŠJAéº[w/ìjŸÚ§öK#,˜Çª&Õ$J%hš¦áf™e ào*)(YØÁ·w,:J‘¤?sÝrÞrÞ C‰C‰àû9?[;zbô³¾J_½¯>Èç{è{è{cGÆŽŒ_ª/Õ—ºHÐQŽr4zmÞ ï<)rt8:˜OöãÃPÈP`³´[Ú]¡†Q›ED¿€×O¿~fÜzFá¥üÖüVˆþIô¦èM¨œ9Ws®ÂÌÅ™‹3¡b¦b¦b–¦,MYšyÇóŽç‡ñšñšñš  ‰3g&Î@¡«ÐY脸5q¹q¹¨=i…Ï>îù\ïçgÎÍÎÍÁßþ˜å§o<…´Þ´Þ´^°7Û›íÍÐßßYO²žd= Ù–m[¶mÙuÖ:k5˜¯_W¿®~äÌ;˜w0˜Ï8^^õ­M1M18AÙ•4kÔê¨Õz¨þÝ|Í|©?¤ó9ÇsI¾òÝgCŸ ÉŠÚ¹ºõuëEêÕ]¨» ò ûA÷ƒn‘¤¤$‘éêéêéj‘³ËÏ.?»\dTªQ%kµÆZE:w>î|,bi´4ZE-{´ìÑ2‘Õ¡wè"Î;cící"q—â6Ämò˹é¹iù£ÊVÙ¦~Ñ~#"òm\Ùe?ü­¿÷ÃÞUÅÎÒ—ܵÍv3\¢¤£@¢DÅ(µ Ù…Á.W c¡½Ùõ¢E(,]—H­›sÍ 6XR£¤ ÒHûPgÜqÞóžß^̼óNËJ·›wž¯ÿÿΜóœ# ""鑯€Óít;Ó¶³Þö'–&–nú-l_Tà¨pTüý¬l[Ù°êòªËæ˜m[q+?¶^ÄÆå³ü’.¶#Á—às”Dì8ê9êIü"l_‚¤ž¤¿ ×®\ë¸ÖA#LL¼+yW¶mÅ­|«Þ‹ŗ–ÿð‹@\\¿ã$Ä'Ä‹@Öþ¬ýÙß…ždCÙá²Ã/\/\Ú ê BŠ.æ™Ç31¶ä[õž…oñYüa={2öˆ@yeyeÒ¥pÁX'œÍ<› ¡à"I¡Í8oœý—Q`ä}FŸà+¾~ÕUº ôÃHüºÑitÐF)( /‚å³øÃzäãÿö§}p$ñH"°ºjQ-«T“j"¤Wëz'ÚZ"£7ëÍ ô€¦SujtÑ.½UoEsJªQB ¦Õ4²ð#|Q~‰”÷3$M%Mͯ€Ç걊ââ–¹Þ\OÀr,M.-ÁÌÍ™›37Á¼b^1¯ØB‚FÐ0›5›5›Ú£su®gÚÜoî'™Ú!›Ïâ뉻ø'œn>ÝlU›_ëPèmè­=ñ¹swçîÂA9(’+’+’+ ²ª²ª²Êæ­Ï«Ï«Ïƒ¤ì¤ì¤l¨¨¨ˆv‹1ÆÐüb´­6ŸÍÖã ¯[Q¯Èî¦ÝM‘eÇ6]ª: K–£k®+Ø™«ž«ž« ôz="Ó¦L©ÙQ³£f‡ÈDùDùD¹ÈÓ‡O>}(2zôþè}‘~é—~‘}’/ùâÐßk·v[øŽmóõ:EÒÓ¿ùVdÏÞ={£Â.I¯kÌ5& –gcçÆÎ"¯ý¯ý¯ý"W‡®]yÕúªõU«È#ß#ß#ŸÈÚŵ‹kE6¤nHÝ*â^í^í^-2™:™:™*ÑA‰³ÁÙ`á;.Ùüa=+D\e®2 DâÆãÆVݬ«ÆÕâj‘ é•R))]Sº¦tHí®Ú]µ»DnÔݨ»Q'âwŒ;ÆE’'O>.bL“Ƥ- ”Êeˆ$K<–xÌöKºl—íQkV$®7®W2D\ù®| ÒÓµ¦ § í­`þ¨ÊT™m @acaca#´g¶g¶g‚§ÈSä)‚þ—ý/û_¦®M]›ºàÜ–s[ÎmoŽ7Ç þ ÿ„?æ´~©¦ÔTÌÞ‹ò‡õD6ÿƒ&èþÐý!Zv’!U§êâÒKzÉ.¿à»à»àƒÂªÂªÂ*èìì´ãÝëº×u¯ƒâPq¨8} } } 1üéĦ¬>cž2Oàiäry¦&Ô(ò(˜^Ókzc¶€Ût›nPŪXƒù»Ùavf4£Ö¬%±?ÕÇþ§óíüÃjÀÀÊà•Á+ƒoÝûÜû¾·¿7ß\~žWßËãå“xFð îÏý¹?K%™$“d†– ¡B¨úÍ {•½Ê^õ@ð‚¦M šÜo¬ë]×»®—º–š–š–šÈ3²\Y®,SØ…]Ø%¦0…)È@€{q/îÅ”#ÄâÁ3&£Éh2r×ב_G~ÉÞø5ñ×Ä_·R†*C•¡‘»3Ý™î̵¥\Çu\w3•€€€>Aòfòfòfa„1ÄOR'©“ÔO;§ÓÎéžÖ¬Ñ¬Ñ¬W§¼žòzÊë’“¶@[  „#áÙv]€„oâ›ø&J(¡`‚ &€D“h PµQDt¡ ]Xý¬~V? Ô”Õ”Õ”‰©---’ï¤ ©Bªøñ¼˜,&‹ÉOnÆ“xOMPE»¢]Ñø,öYì³øÿþ5u~êüÔùžÖ¤hR4)â3ºt]º.]ò] ­¥<’GòÈ=]q®8Wßß߉u@)kcm¬ þä$9INhD#1ÕǪUõúF= ×È5r `ö5ûš}£ÍG›6ãŒ0þ€#8‚#± ±ì{ö=ûþ^=¯¾—ÇËGÅ01L ûﬠ»Awƒîbÿ#qÄ=GÊ=Rj¤Fjx'ïä^ÆËxöööÚÞi{§í`cÏÆž=@Ú}i÷¥ÝäÄäÄäÄt/ÝK÷F»Ñn´Ï ë`¬ —éezy®YêÕ÷òxù$‹Ãâ°àÑIÑIÑIÈU´*Z­˜âz®çz(Éûä}ò>€-Ø‚-6`6öWí¯Ú_ÜÉîdw2à;à;à;0"•ÆJc?îÇý80:>:>:>ÿœ\#×È5Ïá9<xô$Š2E™¢ SK_òø’Ç‘Ûié´tZp€â=¼‡÷H$=CÏÐ3sydø_âK*¨ ÈF²‘lœzðÅ_|ðE@½^½^½0ì5ì5ìzszszs€}¾FÜoŠ7E@^./——ÿô(9JŽÃÆü€ðü>M£i4 @*PA"© Ô‚šŸµ­²­²­Â q»¸]Ü\ Èð9àT¤"€Zh²’¬$+]¥®RW øùù¶|Øòa ` °X€}ˆ>D8ÒiŽ´yPžÍ³yöoÀûI?é÷T{§½ÓÞ‰TC5TÃÏbzzÚ9ºsùÎå;—³}~~~Üv÷¤{Ò=É9¿Æ¯ñksíÜE\ÄE8ïIìIìIäÜ®°+ì ÎY.Ëe¹œ‹·Ä[â-΋3‹3‹39¯©©™ïÏXKàœ%²D–8¯wcýõ7Ös¾+iWÒ®$þZAqAqA±s”")H)¨”äKò%ù$÷bðÅà‹Ánu¹u¹u9”TEUTàü7ò„g>gf«‰™˜‰Lj›¸‰û„”{øØÃÇF[F[F[>»5û“¤…DlˆØ±Á£{I÷’î%¡„—ñ2^:ÐÈÈ r‚œL3¦Ó ðyÈç!Ÿ‡¤‹t‘.€;¸ƒ;€øKñ—â/‰™‰™‰™ó[+_Ã×ð5àDGtDR;P;P;À¦®L\™¸2A•Ê!årèÚf—Áepb޼Ÿò~Êû @ÚÐö_‡}F}F}F/+& “†IúµŠµŠµ žTTTM.±lÛNch ™àîÀÝ»À­„[ ·u–:K,Þ½x÷âÝÞÆÛxàñøG¹Cî;˜êÊíÊíÊŦªÒªÒªRœSü¨øQñãL"¸À…›…(Du¿Fi%­¤•B;=HÒƒ·ÿÎúY?ëÏt*J£Ò5FQÃ6½izÓô&NÑbZL‹1ÍñCü0›XèZèZè|lð±Áß.À,˜[~¼€¶‰€‰€‰(ë÷Ôï©ß#j|ú|ú|úb#6bÛÍH ‰!1ݯ¡%(‘„xŽyníì¹Q²‡”’RRzI?»‡¿QtÐÑ#b "nµ¾k}×ú.”ä[ò-ù6¸à‚ à¡<”‡lšM³i€·ðÞà+|…¯E¢H‡ú×çÔçÔç¸sÆvŒíÛ!9, —…ËÂOEìØ±ÿÐ7(@ Èiô£ýâZïyT…A bP¼Žld#›ÔEýEô%äYò,yÖ©¢± ± ± ‰µfaÍš…î¯ ßηóíp>ÒGú €¬!kÈšy/b“˜„¬ÕÜjn5ó„¶Æ¶Æ¶F¡DµHµHµhhÆYå¬rV½µïzÁõ‚ë7s37#À£ó‰tÊSža¾Ì—ù"àê«w®ÞœÙÎlgö[ûTAª UÐÍ3½†^C¯A(ix¾áù†çyÑ=ÑCÆ>cŸ±ÏÀ¡€ €óq>‘ˆDÄô/æ_Ì¿˜qªiYÓ²¦eP¨FT#[ÅV±Uo훵ÞЌNJ‡=«m’w ÞÕÂs%‘yªž)JЄ&4¹sÈj²š¬NØ0{åøæŸ®­®­®­lÛ¶…ma4véÁ¥—D2ëa=¬JE£hb®˜+æBV^^‰‰úäËäËäËJþ2ûÓ¼ñ+gå¬\rØ3³÷ÎXQQQQQlÞ…§aÎCïæx¼{ØãÝ/ÿû.ƒËà·Z[[CI)¥”»«Ë.N_œ¾8ͦ†Ê‡Ê‡Ê…>ùnùnùîëõŽÛŽÛŽÛ»õ=Õ÷TßS€Pãé§ôzùæ@ì}AéIð­Ç»ÿüïªÇÔcj‰µ:¿:¿:߃D ¦`S°)ÛíÆv’ªìQö({¦a¦ÙvYò‚äÉ Ó‡iôaZjñèý§œþ=—€?ˆ¸¸¸¸¸8ˆžª‰K¹”KÉÿŽ<4òÐÈCøÈ}¿û~÷ýWDY˜,Lö·#?¯ýyíÏkƒ¿°v[»­Ýüƒ«Ÿ\ýäê'î'&]“®I—íëë»=„çÇùñÏë!ƒ 2aX`a÷zgÀ3Pâïyþ$þÀ»…h@ܼŽ×ñº¸~ZKkimsØÌ³3ÏÎ<Ëò)÷)÷)§Ý‚NÐ º¯[ÂkÃkÃkÿgî7÷›ûI#»‡ÝÃîá'{GöŽO~µâ ‚´Ýi»}Þ Þ +ZW´šØÞ·ëSûEüT>;/ËÅId]˺–VžˆÏ@]I]Iv®7ßw‡»cÁ€ƒ]»®_¹~…/ajpj R)'¶÷íz»ßÆKÅ—3ÿãÌ›™7ÓÆ!kIÖXë_ë_÷•UðtTíªÚ0™>™®] f]Ì3½þN‰íýD½ÝoãÙø6ŸÍoéX¹uåV¨©¯©w·X †£kŽ® €x$ˆ‡sÆIã$è?Œ"£ˆ­z¿ÞÀR–è‡ú!ð™qÙ¸LŒ_Œ à—ð l¼~’Ïæ·ôÈ›g{îsØ“½'x¿ê•zxÕau˜¸Þ®éChÛ"§WéU@ 5Ô€þI·êVУú~tRóÒ¬3눃Pv:~/É—ä—TAÅ?‚{Ê=5ŸOÔ•¬à¶Y`°˜„ú>~:~f¶Íl›ÙFÀÞZ Ñ…èBâÅÃñpÊÆŸf‰Y’Ä«pøl~KË’whƒHC°!¸Ô)J/J×xn„°ôÊVׄkBÜÑߣ¡hHÄßîïñ÷ˆ¬ß´~ÓúM"õÞzo½W$6›ÍŠÌåÍåÍ剸_ø_ø_ˆÜúáÖÅ[%¹ôvÉ q‹¨—ê¥ôÚ|B¥ðþ7p5z5št¾Q}ý:çu1;Ó–Ñ–Ñ–›}›}›}É‹äEò  ° ° Bí¡öP;ø}~Ÿßç\þêþêþjÇ0V÷Õ}Õ¦Úl|Ýèð[z–Ý^v[_ƒ©²©²ËçtH‡€**©tÒó-ó-ó-°¥iKÓ–&ÈéÈéÈé€éÕÓ«§W;ue7Ên”Ý€ÎÜÎÜÎÜaÏÕ¤šЃz0õðm~KK$½*½ŠOE2»3»“ŽÿC?㌋H·ôHÈhéhéh©ÈÈâÈâÈ¢H÷³îgÝÏDòkókókEúšûšûš#sU¸*\"R.åRîä%[Üâ‘B)tø~KKÄì1{ÒÆDŒj£:Y¸Ré.Ýåà Ÿ>5|JdïìÞÙ½³"ÃÃÃ"‘‘‘"Þ ï„w©ŇâC"jBM¨”¼<’‘§òÔásøzÞuÇøMíT;‰ÑK;íŽág=g=g=°Ñ·Ñ·Ñ-½-½-½o?•Ç‹/†¡Ê¡Ê¡”«`Ž›cæØÝ1‘à]h:Ñt"Ù^ ƼáLtMtíL1 L˜0pžóœOÉ+ê ­1çQB¿‰o–:ü–žwϱ×öœ1™ÇX$È ¾UGÔPP0óÍ|3"”âLƒÙ`6€žÕÓz:EÞ¢YkÖ¾޽{ò[ãôž3©ÍF³‘xÂ-Í¿Ì1—øŸê ½ˆâ¶C‰þŸüïyWZ@€çÔ>µè;úi¤ÛûÉ#KôÛxï}W~´_í÷ØÇùûïóìÌ·-‘IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-36.8.png 644 233 144 3224 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIIDATHÇÍ–ÿO”WÆÏ ¢  8‚)-µ¦Ñ,X—DmgK´©»Pi´‘Ä€XMmÖÔT1k¤¡Ø­51 ±PÄ®•Jø’a¡e“juÍ´°Y­›ìŠŠM¶–/ÆA`œÃÌÜ÷~ö‡™—™Ýþ¾¿¼9çžó<Ͻ7÷¹W@DD–FþÖLk¦uI8¶î‹æ^Ox}Õ•p\§À²Ý²½ïR›R `ÿÌþ™1Íq³>¶_$ŠËgæe©D‹ÚµY "ñ{°3wgnÂòpü‘l¶Žé¼ÕùV'€ë’ëïÀXïX/ÀdÁdDcsܬ7ûM¼X|yïÿøE ¾;¾ÛòX´pÑBÈ~-ûµþ.¸ÿm-Ú 07§­ <@2ɺðáÃüÆcbsý@°ƒê¨#”(.+«²2§ÿn|`|üI¨?Ð}ºð«]jsš MŸÐ@ÉóxŸi9Òb hâÏÅsÅs¶‹¦ùß½=»™çJÖ–¬ý2@°ø‰Ÿ@;”_ù ê¿éKúÚ2~6~ž_)ô½GïO|4]OêI´ÎTJ)‚À 3 müß”l-™_Á³›c¶RDdÍÇ\·}aû·îgÞÏ„`5¿÷¼ü°áa3¡wBu¡º(_p$8ÏaÏaÏaæsƒ¹1‚Žr”£Ñ0àL&àQÑXûX;3¡_…ñá~Üý8Àmk±µø˜zD[DDê¾…ƒê ‚©“L0a¬ýíú9sÀþk{‘½½Ã½ã›߀>®ëãPVQVQVI®$W’ œ•ÎJg%<®~\ý¸:*hâüÄù‰óPè+/‡ô•鯤¿‚Þ–Wø|áó0ë0ÖÂÛçÞ>údXÕØ,"âè)š)šéªùräË˺P¨&T#¡ÛCW†®ˆe`v@ (‘“Ó'§ON‹ÜzrëÉ­'"½Õ½Õ½Õ"kìkìkì"ýñýñýñ2ÿ¹n§Û)2xc°g°GäÚÆk˯-KßÞ{ö{v ¸soo¼½Ñ²NdëÊ­+Eôň¼K:—tê6¶ÖŒÖDgê»ø¤âIl¸ºáë _Ã*ß*ß*œ[vnÙ¹eX›X›X YÓYÓYÓPXUXUXÞaï°w8Šãi÷´{Ú!gKΖœ-R•r*å¬ÛþÒ3/=¦§ô”ðô{úAŸ]\¸¸P·YùÜ2e™"G:oZ¼I¤Oýpð‡ƒòøîÌÝgï>+Òõï®»]wE2e<Êx$âÊså¹òDœ«««E$=Hz$2qsâæÄM‘ yò.äEW¬¥²¥²¥R$5#5#5CÄ{Ê[å­ÑKu¾Îiíh]ÖºL‹¤Å¥Å‰èé“>r¬ú/ª\•[úE⿊ÿJäÎïîŒÞ•´ÝS»¿ßý½HÏ®ž=;EÆÎŒ;#R°©`SÁ&‘ѦѦÑ&‘†Þ†Þ†^‘‡ú¡~¨ERí©öT»ˆkÔ5ê±ÕÙêlu"#ûGöìi×íF»!2~ÇÓâiI?”ž˜ž(i"~¯ß+"ïk‡vXú…DDþy„«Í­Í­ó‡ïû UmUmÌåOç{ò=ÐXÖXÖXݢˉ—/'‚ãªãªã*4Í6Í6ÍÂdÎdÎdï+ÞW¼Æýãþq?Ô«?V ɫà BõõÌ™|ü«ÙÝì.‡õDì¢î[8°÷À^௑S¢Õ!u(jSh t·îÖÝ@3Í4ÇØÃ '8Á‰˜üiNsä÷bð¼*Oå­æ©£ªNfŒçŒb£øŽë\#ÛÈ6²A•«rUF‘Qd¥”R F–‘ed»)¡Ô?”R Ô»ö@;3ÆŠˆµ½8ô"€íGÛ¾<ˆøØ/œŸ7ÞHtÄ™ýꆺ`”åçg €ŸYfcVHc`^Æ7qÐóýs&žy³Dø~éü‘»’mon{3æ®ä芣+æ:€jH†/äP¥ª”9ÐníÀ‚¢±9nÖ›ý&ž‰oò™üówåSûºxjßcOç ö¿ë}ܦZvIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-2.5.png 644 233 144 2627 14774263775 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜLIDATHÇÍ–]LTGÇgùˆ(jáÁ(A)hÕ‚?¢¦%JP$®ª6Иhµi-Vcªí>l¢U7)6Á‡–ðUcM4(ŠÑ” ±11¥h6ˆ±›ä³U–{çί{ïî¢!}u^î=gÎùÿÿ93sf!„˜j~D$E$EL ØŸ…ü1¹1¹ïÿ°Ë%Ø6Û6·}ñgâÏL«˜Va< ÙÖ¼ž/D?œÏò‹©"䈾}Á–mÚNØš¾5=&1`Ÿ¼ ±—b/ý«Cq]qÀÅÊ‹•|Þo @v6„lkÞŠ·ò-¼p|á|ƒ_˜xuâUÛ_%$ç$ç¤|èH6nèžÐ=AE€ìâˆSÙÀ0ÃX£7̶æÍx+ß³ð->‹? G@Âê„ÕBÀ¦í›¶ÇþHxXƒ^:³t¦Å§]âGs˜8uW{¬=¾ÓÛô6ü ÚT6l@¿º¬.ƒ’ú} ~õ·öB{ê9HwMõùŠ »£»£»n:o:o:anþÜü¹ùÐx¶ñlãÙPüÝ7vߨ iÕiÕiÕ`ï³÷Ùû Õ™êLuBçÒÎ%K–~™õgò›zL›|€ŸF€!† (FF¬Š;h ïÈ;aøÄÄX•Óùǹ+)U:+p pá".´Ä²Pâu[ݬ»2h[óÁ-aæ[xþ¸wå;ûºxgßcïæ ö?óZc\{.^$IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-97-grey.png 644 233 144 6252 14774263775 16026 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü _IDATXÃ…—kPTW¶Çÿ{ŸÓ4Ý­ˆB|‚æ1F# ØŽx}qqʈñba¼–£¥‘’¨j…1¢Ì½Ñ`ðy-LC`šQ© ¹ZEĺ›>}zïûn˜òV*ëË©½ÏÙkýÎZÿý"™™™™™™ðĘ Ž=èB±Kì»xMæéÌÓ™§ù+ÙO³Ÿf?ýSŸÊ§ò©¹ïÉÓäiò4Ýf[•­ÊVÅ?ÂIœÄI’`#À]ÜÅ]›±›ùGÊUÊUÊU$C|">Ÿüx’<'ÏÉó='²|³|³|kÛs6ælÌÙHúä9@ qc¬ÉÉåIÇ#‰Hz†e³l–Íš$³d–Ì/GdWgWgWŸé–ú¤>©ÏpÝ2×2×2W·[S¨)Ôâ²n‰n‰n ɘ§˜§˜§"¼"¼"¼WÛõÞõ½k¼Ë߸gç8¢ Ñ„h€ÚÚZ JŠ’¢$Àï¿ü~Ø\6—Í…¨>«>«> ‹‹ÇÅGq‡pˆÓsô=7þgJÖËzY/ànr7¹›Ÿ3>g|Î7êoÔߨ¤)BŠZ|Z|Z|K¥ÇÒ8 ކ‰¹C÷Ò½t/p=êzÔõ(àÑþGûíôoêßÔ¿ù/“l;¶cûD|ºn |ŽÏñ9 ¦Â4aš0Ÿ7Í7Í7ÍÇ=ù}ù}ù}ÄJ¬Ä î™ômÒ·Iß#úýˆø¤í“¶OÚ€¦=M{šö ¦` ðJ^É+'â;Z-Ž ¾£¾£¾X´vÑÚEkU²*Y• °a6̆šI3iæx<ÁÜbn1·àEgÑYü¼èžçžçž'Üó½ç{ÏWü{k~k~k>Ɉ $‚ÀÊù „Ú<`0IMIMIM€ÏŸ#>G€þøþøþxà¸çqÏãžÀäÓ“OO>=zÕýU÷WöZ{­½н¥{K÷Ö¿drva€ô Öû+ﯼ¿j£l”2>v¿ç~Ïýž\@‘ˆD$f3ÅL1“dÔùÖùÖù:f lØ0°jâI<‰'Lßüþà÷’¨’¨’(àiãÓÆ§À¥€K—/îŽ8HI ™à¸Õp«áVðÒÏ/ýüÒÏ€§ÕÓêi°+° ›è&º 69IN’“ ¾d¼d¼dd‘ÄHŒÄˆÏˆƒ8ˆ£Ä¾RÿJý+õ‡÷¹ÅºÅºÅ–öôÇôÇôÇ÷/¾xøâaÇNg<Ä#‰GÀ6£bFÅŒ  ¨§¨§¨°4X, Àºí붯Ûˆ×Äkâµ ÐþŠþŠþ `FÂŒ„ ýÌÀ ÌŽhD#ʪƒU«2KOYOYOý§ÛQ·£nGÿw½ÛÞmïÞe'ûî¸ÿ!€›¸‰›3ŠOOO›T#†ÈáµT}³¾YßÌÇ=Œ{÷Ô³$–Ä’Àí~v?»ˆb»b»b;@§Óét:€Nt¢ÀÀÀ’eɲdÊÊÊM¡)4 kȲ–Ÿöü´ç§=øsiQiQi.©¨¨Œ.帠û3B‚Û¡ô$=IO Í4ŸæÓüÇe¬“u¦HêZu­ºh|·ñÝÆwùÚâÛâÛâQFÏÐ3ô ¬nánánáÝMwÓÝŸð'‚„ `ìØ¨_W¿®~š…f¡yÐ4ì5ì5ìõåìËÙ—³åYŠE‡¢ &b"¦}Œ, È‚ÛA P ÎbbbbbbøçÐC½ø!ÝO÷Óý÷ÓéRº”.5ééŽtGzÜÎî‡Ý»Ê g_Ÿ}}öuú_ªmªmªm0qîÏý¡$Á$˜ààà0æàóùǰ‘ D‚ ©0W˜+ÌŽ]ßt}ÓõxL½I½I½©,'Èd 2íþïþäþäþdrFad²ë<ªA7ºÑ-·cv`© +++/XížæžæžV–óÜû¹÷soqðkŸ¯}¾ö™Ð.nànÀ†6´¡ À(F1 À npøU~•_'ñ$žÄCyÍxÍxÍÈß4Ü4Ü4_¯Æ·gT*•J¥ÒôÃíYíYíY7r#7bŠ3Î)¨k':Ç&±Il¦´ö¶ö¶öÒi‡´#ý°fªfªfj×¹»Õw«ïV 5kkÖÖ¬å‹ÉV²•l…’}ɾd_‚CTâC| 2‘‰ ë3ã3ã3#Ê á†pC8¦hú4}š>€ÍgóÙüôÃcÒëuJ±h ‡Ç¹6€ñ…Äy%Q:›6çº[ 08v’HI"¯ÓÞwö-ö-ö-lÛz¶ž­gtáìüÙù³ó±ŠÝawبi ¡!°Ér†œå§AŸ}äÐö-è[з@èpww/ˆ›4»þÉŠY1+‹œ•ý««b9999990¹2 g‡m¼¤cûÊα;XD I!)¬¯¤±4–ÆîªB*R‘JÿVm¯¶WÛå-ƒ'O ž€šRJ)Å+µÖZk­•YzŠ{Š{Š…÷}îûÜ÷µ_¶=¶=¶=Þw¤cYDzŽe€p–ë´æߊñ‚½ðÚéàªS»ÿO»ÓžO{>M¼y!óB¦c'´ÐB‹)m^m^m^ø¢±¹±¹±™$©ï¨ï¨ïl›Åfmkßßß±¾8/p^à<:àŒ÷oΧõE.¿ac«dg³»q7îFþ³/´/´/ÿãðsø9ü®ËÊ@e 2ðßÿö‹þý/z¯òÁÛƒ·oóOZOµžj=刱ØGìÂÅBÅBÅÂ÷gòü?ñÕe(¡„R¸ `€MwUÀ™(ùE‚ß±ßÐn6jPƒG¯âU¼*¦“^¤éņÀÑ•£+GW²PE±¢XQLo ©BªZ÷}ÐÅ ‹Aÿcì4v;Éö2{™½ÌKœ~«€–ßâ ø{A»Îå‘…­ØŠ­âd#ÙH6þ#ˆ×ð^³'Yå¯òWùÓÛB·Ð-t?ög¹,—åné½³îκ;ë€1@:ý¹–Ößãø?Li ¸dº‡IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-9.4.png 644 233 144 2606 14774263776 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü;IDATHÇÍ–]hTGÇÏ&­Ù„Äd‹ú`!¡ZŠbkŠ!¥ù0X &[Œ’'K%‘ÒúP£%´JÕ‚h4+}Pƒ4ºh¨¡Ö}Ð(k¢ ZK,këÚHÈJMRÓìî™_öÎÞ­bé£ór9sÎüÿÿ9gæÜ‘÷+1?c~ÆÌ¤ñ7ï_é_Y|ƒüù].}Ó³­ßƧ¯ñðÓù켈7‘Õ“Õã«pí/`Ý’uKü³“öÞKÝ›ÝûÄ ßoøàÔÑSGù>ø³âÏ ðlë·ñv½ÅKÇ—/žâ—Ã/‡}w!kFÖ XP½ ºè£dÀoEP[S[ð óA¦É5ä’k*€I&±#šf[¿o×[<‹où,RÀ¬òYå"l6dI.¸Ù³¹ps¡åKôr€6ÚÈ5?%F#À)%JˆùÙü (£ÓoúÔFµ‘{œ^b=ëÉMá)‹ïò¥ø“zäßµíXÁôÖ¤ à\u®‚yŹè\$á:ŒÉÔSz ¨¥–Zž¿rk`6š^Ó‹Si*I Ôu% Ÿz½ß ìX‘VJ‘×¾‚ì‡Ù'_‚ˆŠ(à<«Àl2›˜ŠßNø~ˆöEÏDÏ€¾¥oé[iB†fcŒ1 Nœ8Ä>޵ÆZaüÕñàxÀ3ǘbÐÅבx$R+웡åó–ÏÁü  ßÞᘚż++ã+ãs!çBÎhØÒ°¥a pƒÜðô9N‡ÓáÙí‹Û·/†ê‰ê±ê±Ô´Ñ;âmñ6à–åKò[=®°¡O 4U `Þwbû††¡¬¹¬¹¬Ù#\úxéã¥áÄ®»Nìz¶’ç#ç#ç#ÞA© Ök‚ž_›X‘XAŒë–/ÉoõdˆÌ¼8ó⛥"åUåU"rVDÄwÄ­tVawáw…߉Œ>}2úD$Ôj µ‰ÜË¿—/_ä‘z¤)Ièè葎åË;–‹4ílÚÙ´SÄwÛwÛwÛ‹ã-_£¯Q²dåsù­äòô0DÿˆþîAŽÚMoÞ:½¶wmïÚÞ÷ï7Þ‡À@` 0‡Úµj÷2±»iwÓî&ÈìÌìÌì„Ò¡Ò¡Ò!ðOû§ýÓpºþtýéú´Ìµ[>—ßÕ“!¢Ð?ø†Eœ:§NÄ”ŠˆÈ,»³ëµ×W__- …‡D*[*[*[DæÌ)˜S R2Q2Q2!rxîṇ犔-;[vVädèdèdH¤ørñåâË"³ƒ³ƒ³ƒ"‹^YXð2çs,_’?¥çé3Æ%·æ™Îqç81»³½={{ööÀ²Öe­ËZ¡¯¢¯¢¯&K&K&K naݺ…0R>R>RîeäÜþsûÏí‡myÛò¶å¥eª;Q¨&–dxöŒ=s+Ñö–8ÊQÀw¹‹á"i§»‹.º€"Š(ò¦M•©2Uàô;ýN?è°ë0ð5ûØfÙd6a@«b`ê?oeZS‘X$•'Vñ»~[¿Í”º«st¨×“€zÞ£÷}ôÑJ+­4°ƒìHzÚô˜ПênÝ  ;u'SL»ø&âDœçö±´ÎŸêĶ3«5½^¯'á× €A¡€qÆ´kƒƒÄÝø¿ôZ½–¨A5ø¿:ÿsþ•lž·y^  ø’/ÉgÒ™Pͪ™˜Kæ>|àÙÖoãíz‹gñŸû¯|a_/ì{ìÅ|Áþ¦÷™Dy‡IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-5.1.png 644 233 144 2557 14774263775 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü$IDATHÇÍ–ohUeÇ÷Úæ.w³¤»W KYøY8q07© n×0WX’˜X‘nŽ!)ì…CZ¢p¢¹‚(p²Mkö"6ÄáloúºÁ-KÐ5ÝnÞÝÍÍÝ{ÎsžO/îyî¹*B/}Þ¾¿ç÷|¿ßó{Îó{Ž€ˆˆ<á>üÏøŸñÏKbÿ»^<ëÕ¬WŸû6‰Ûø6ù6]þÿüñÏæ·Ïow†=læM~úz?]ÏÄå ñs;ævøÖ»¸ jVÔ¬ÈÊMâ– è tMÛ°ãÌŽ3_w~Ínˆ®®›y“oÖ¾t~iºO_2z2z|×`næÜLÈ%ÿ•g?H&üù,T¼VñÀ97æh?¨q ›l½˜b 3"iØÌ»ùf½á3üFÏè'ý„ÊBe"Pµ¥jKà$ZDdø¨Ï«ÏnX]Ú¢žz²õ?Ömë6èq»Ì.#ÎÏúý‰1$t¯îP»Ô.â”Øåv9ð ïðÙI£VÊåÇè¹ú®¹wo?}ªƒÕASë"³NSØ`¹°±FóÀÐ ú=ýè?(  Έ3‚ÅÕ¡:Òø©ÎªÎ2?}9m+EDžÿ £Ñ©Ç¸ ¥øËµ­ÞPo03ùÒ䇓­ŸnýpëoooTALst”£õàtlzlz ¬¿í€лõnfø-ÉaVÒwý¸ÆÚúaç@ÇœBCŒÄFÐùåçÃÒƒK.=+ W®,„+‰+‰+ ψZ¥V©Um¶F[¡øHñ‘â#pîýs;Îíð ê<•ÈJdè}ãÇŸ¬[ÑY‘ÒºÒ:iñ½à41šŒNFÅçÿÑßçï©]X»°v¡Èéc§>&²,sYæ²LIxg¼3Þ)R>V>V>&ri諒—öŠdÜÈÏO¥ù¸ {d$\øBJßøyçç×0úâè‹à¾ø8\¸:pu ­bËÕrµT‘*RE°:guÎêèÎíÎíÎM˱;ìŽt¥¤¾ñ#0?g~Ž3‘‘ÈèÎÔ± ¼5¼5¼ú‡û‡û‡=šÒPi¨4­ù­ù­ù^Ü.³Ëì2¯Ý¿vÿÚýÐ]Ó]Ó]“fì_{Øöø"Fßøñ‹8ß;ßû†DìJ»RD—ˆˆHÈuè·¡_‡~Ù¶`Û‚m DÚ7´ohß ÙÙÙ,²hÝ¢u‹Ö‰œ¨;Qw¢NdªªªßÛÚDO¢'Ñ#¢®«ë꺗ËrFΤPÈè§ü$?¶_êà»Øw1à+½Õ¬š‰›W:|öðÙÃgaMÆšŒ5p*çTΩ˜h›h›hƒÊ“•'+OÂMßMßMŸW™}ÅûŠ÷ÃàÆÁƒ½¸sÍj²š ¿ÞžÒwýú€ *¨H‹[X©nwïˆ{¯‰Nñ?äT>ØÇ¬ðlxÖëct:A'ÈŒúR ªAP©]j8UN•S4ÒH#8A'èZhI«Ì›ÎëÎë 'È#ÀùÂù‚fþW»§ó»’Y]Tí¼í¼Å¬yc·2…bĈŽ‹ÍÍpÇÍ·œ·œ·°R|)þ‡vþûîÊÔÝUÿtýÓ)‚.à‡Èö¶@ÕªZâ /è øð‡Í|jËÜõ†Ïð?ô®|dÿ.Ùÿ±Góö?DÎ%Cî9 ^IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-34.4.png 644 233 144 3137 14774263776 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïO”WÇïð£Ì4„)#v·¤±hc$Ä*êªlÙíHˆƒ˜V1i®5m³$fЖݴ(u6W]—4c1 ØÁÑ’B­ ?’†òb ¼0-Òn™0ÀàÀÌ<Ïs?ûbæaf·ÿ€Ï›'çœïýž“sÏýÞ+@!DZä/ .+.+.%lÇý)ê7‹³o…íë** ÿn„Ô+©WÒo¤ßÐ&£¶×ñ±ë…ˆòÇæÓý"MDI]I]†¢ˆý!¼™÷fžÑ¶?vƒ©ÛÔýT®.g«³•÷á§‘ŸF¼EÞ"ˆÚz\Çëëu¾X~ñáÿå{{ !鹤焀—-/[^ùs0ó ”—–—ÌÆÏÆË8Pçd’eàÇþybl=Áëëu>_ϧç×# ãõŒ×…àŸ.šá“m\¶µØZ@„º¹Á§|J2(óÊ<€jSm°Ë2Y$ÊD™ 'ä ªGÔ#P¯âÀƒdþáKµåÚrõ'Ûh?¨ÔLÈx;ãíèžFþŸ¼Áo*ó+óAî sÌ4«“ê$!O>Ro‘<.«e5ÑOEA$ë^ÉCm¶‡|WyUyUw‡†QgÎÔ ü䘭Bˆ­—ùÆÔnj÷%ÀLÖL„ÎP2ÿ‡Ÿ[nůüEù\ù<¦€A„@m 6P K[–¶,m‰‰÷ÓO?ð~à vjý.¿ ÿÒ‹«¾U%0cŸ±ƒ¦ë¦ë¾ÃõiBˆëƒðžúž ‹e-ÿ÷»÷äìÉt{ú­ô[ÈÊ{•·+oƒÐ?èŒæ¯·ÕÛêm`Y¶,[–£~í¦vS» Ê‚² ,Dý 9 Å ÅHËZÑ/E¿¬£óµŽÙ'²ûáz„bBˆ1ô.÷.C«ùî“»OdÍïR \.^¿×ãõ@f^f^fŒ—Œ—Œ—ÀèéÑÓ£§£ƒPj-µ–Z£„zC½¡Þ˜NõOõOÅàK‹ŠôÍ–5Úýöîönà›p=‚¥WŠKvQ1×<×%ò9–/‡} ûê÷ÕÆ3Îl8SSSP–V–V–G7Ý|t3”í/Û_¶?¦cFͨÁ{Þ{Þ{ŠS‹S‹S¡êlUSU”啬”¬ÄŒæ“ÙÌÙL`>¥+¥Kv y9õ³ÔÏ´ ðúFabËô•é+x†ÿ1Ô8Ô»Çî±Ã^÷^÷^7lÛ´mÓ¶M`î1÷˜{`»u»u»ŒkÆ5ã8¯9¯9¯E^°_°_°Cü¥øKñ—`çØÎ±c`\Kú1éGp¾zç«wðÀjÂjhRŽ¥Ó&âäµZ­6L‘øeâ—BŒõÿÖ÷o‰ŒªÅªïª¾bdûÈk#¯ 1ëžuϺ…8Tx¨ðP¡mŽ6G›Cˆì¼ì¼ìõ˜zŒH·t`ÀQ[ëx}½Î§óëùôüázžå×Å3û{6_°ÿ8;AåòäIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-29.1.png 644 233 144 3130 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ïOTgÇÏÁÂ¥ü¨õÅ¢Mj6¥ÝAˆIEHÛ•AÜ.I7!%ZM7f7AÉv]7òÂÚ ÄÕâQ -VÅ,B)0Á îTŒ®“]L3lGR³@:ÃŒN À̽÷³/†Ëv÷ðy3sÎs~|ï9çù>€ˆˆ¼°ü+`Û`Û`K‹É¶=–>iGÒŽM_Ää ”w”wþùGHÿ4ýS€Õí«Ûõ‡–lî›öñþ"Vüø|¦^^K‘x5ñªR²,7À»¯½ûZÒÚ˜|bÔnµ{. {{öö\ë¸ÖÁo`ê멯‚%Á°dsß´7ýÍxññ¥á'ùE`Õ—«¾TAâs‰Ï‰À‹o½øÖKb/AÅΊíí† ´ïRŒ LsùãdsÙÞô7ã™ñÍ|fþŒâŒbþ²+´+¤^ˆ9<줭®£®Œ€H7‡i¡…ÐMNECÑ‹†G?­Ÿ®ÝF7€ñÀxhZµVÍ"Ñh0 6Rغïr»Îm|ØIW¥­Ò¦^0ñÈ{{òM²ª¶Um〈˜cŒ^ýŒ~†ˆþý–~ ÃØeTÕ+•°vÃ8)§œŸ.è~ý†ˆáÕiLuÄÍ\•^¥›O¾×J‘ŸŸfHýLý,œ/O¼ ‘_ðö÷¯L2ý ó‘m‘ý‘ýV¦¥óKç—΃ßåwù] {u¯îƒâǸÃ(£–z.v†ÌGb¶oÄ:¡÷Õ~µ?œ`â#_D¤å|Øøa#<ý@Ï)ÿ[é祟CÚÁ´Si§0Š{Š=à»â»â»åëË×—¯µAmP º¾º¾ºý1}PÔ!Øü8ø16vvaôÿöúû×ß_±ÊÑ·ï¹±ç†Y¹–[ý™ˆÈý:JJ…Ž#½å½åFmVƦþMý,š®ÎÎÎÝ—Ý—ÝÎg³Æà9BŽ\¾tùÒåK–þi×Ó®§]PP_P_Po Ž«â«ÐW!3¾Q«E;ý~Øý:[‚-õÛÔo7ç‹l®Ü\)RzûuåuE¹0<6 Hâà?üHd&c&c&C¤¬¨¬¨¬HdrÍäšÉ5"¾N_§Od2}2}2]$8 ŽÉÊR›Ô&µIÄ}Ó}Ó}SdKê–”-)"óc …€$Ƭ” òCñÖâ­""i#i#›óäÏvŸÝG¶T)^Å«ÈúáÕwVß‘Àï“ÏŸ“ ×?†¿þNälòÙä³É""êQõ¨zTd`j`j`JÄvÛvÛv[$ù^ò½ä{0e²NY'bï³÷ÙûD'N8,"ÿVö*{EDdDF$ I«\«\’!bwØd‹ö§ç‹ž/2®Âü†ù pýÁ€wÀk•üÄþœøzü=þ?œÛ~nû¹íP˜]˜]˜ mž6O›²Æ³Æ³ÆÁ3êõŒBs´9Ú… T‚ŠÕÚÜ_侚û*üµ Ëè2,½vÿ±òXHI1®Šö;sÆzkzk |ìâØE£vǯÞX|c‘Ų•Ý-» ŽLG¦#†Ãá´æ·æ·æƒ£ÕÑêhW‰«ÄUá¼p^8*üþ ?LgNgNgZÊ9”wvºgݳ֌é g.ÎX3&æ)€}¥ûJ­SÚ€6èÌ2‹õmnܸI&™Œ£‡vÚirÈ!'N¿À ,ZG ¢áh8>ß¾#ûŽÄJ®-óªWõ†Œ¿{s½¹ ñŒ6¾ôdé óÚí®vŒsF³Ñ úZ}­¾´ÚFm#èz£Þ¸páMÓ4MNrŒcqôñëˆ+âbÞ™<æÍóæsê„:ÇcÿÃüK»•Ý Xfæ6¤ ³ºSw!b~ñòÿÅ•Š˜µÐЀ'øñºi¯×êµD˜Ónh7 'â†ÝI»“þ/ó/ß•TVWVÇÝ•Ì<¸2‘nàÇH±Z ½§½Ç"£FŒP°ds¥eËþf<3¾™ÏÌ¿rW>³¯‹gö=öl¾`ÿ Õ‘úðÜ;ûIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-16.3.png 644 233 144 3143 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïOTgÇÏ ƒ0 Èš`êªÝm1¬°·áê¦Øh ©m‘”j¡Æí&‹ÆÆD .1,R k·Öh tɺ[ Z~ÔAXdY“F"*J¬q3à8îÜû|öÅÌ™mÿï››sžs¾ßï}Î}ÎyDD$>ð°®µ®µ®ðÛÖý!ôëѯÿâo~ûs,–‚ñc°òÓ•Ÿ$4'4!Û\7ãÃóEBøá|¦_â%äˆj‹j³lØ'àí´·Ó¢æ·ëÀ~É~é™>øúƒ¯Ú[Ú[83×g®8·;·CÈ6×Íx3ßÄ Ç—?âÈîÈnˈZµLÖå¬Ëyù#À½—!ï¼7E<ŠPVÐ@,±j;àÆùÌ…Ùæz ÞÌ7ñL|“Ïä÷ëHÚ–´MÞ|÷ÍwíMh""­pø¥Ã/¯h—ø‚œ t›nZu«nÅ«†£ø“ªUµj\Ïõwôwð‚Ïésuœã±êŸ¼¿j;Ôf œhå‹|o¾×Þdê‘ÿ¯í'¯AáBᨴ!5Áa¨›ê&¿§„”Ñaô=ÁB•¨U,Æ-äg™z¤¡Ôãã4`P±~|r K KMŸ¼VJ‘”?ƒÝmw»müûnÃ݆ ì®gbbðhCÚ6âÓæ´9mŽ GhiZš–&èÇ8_£ujàøílËl ßýø0éžtÃöv{»Ûfêþ#"òù ”/?ê7Fº³ÞQ娂¬_eíÌÚ‰ê>ßýY÷g!¢bW±«Ø±e±e±e}4ûhöQ˜¯ž¯ž¯Å9ÎFØúë­·n„„Ó í í¨Â³ùuùu°tÆÏº>têòëuGDäûCðÕ½¯îÁ³›ªôÕ?d&f&â5÷uäéÈÓ‘§0Ü3Ü3ÜÉÉÉ0vcìÆØ (;Uvªì ¤¤¤†„5_i¾Ò|²Ve­ÊZNsÎ9kVw­îÂ;¸z|z|Z•B§êT ×ùõî+:U·g–Ï,u0pŽ’µ´ coFQF\K¿–~-ºwwïîÞ Ö½Ö½Ö½°~Ïú=ë÷@nUnUn¸cÜ1îP£jT†º{ݽî^Èþ]öÁìƒx;¡)¡ q5»šæ²æ²@ŒË‰ËQmV‰‹(Ž(f£ÜЬ‰¬‘Ó""21¹.rˆ­Ôö¾í}ëEëEëEO½§ÞS/’‘’‘’‘"ò íAÛƒ6‘'ýOúŸô‹œ?pþÀù"–M–M–M"£££"cwÆîŒÝé¸ß1Õ1%’|<¹5¹UäÊ—ßD~)ó"‰•‰•"ªW¢%šVÁè0:,·DÓvj;E,?‘¤ÀÙŸøð!²±±!’ù8óqæc‘Ù‡³gŠ4¹š\M.‘Y5«f•H|A|A|ÈåþËý—ûE®Ž\¹:"RR_R_R/2¸|Ð>hqpæ8sDVÞ‹ÿ8þcIñz¼)Vq*Îr+p*¿?Ä¿.ô\èrýÿX Þ#»Žl;² †û†û†ûB¥iÙѲ£elñmñmñAëbëbë"8“œIÎ$ÈŸÊŸÊŸ‡ÅaqX ¶³¶³¶6ÿwóäæIhš?×p®o Ù”ò÷ g/œþaþcOeey¥Ik¤ƒÏísÏý™AEØÀà g8Ö&˜`¨¤’Ê0]t -Ôö¸­'éI@ƒÉW^]^ ,Ne°)û´}Úmø«Ý ì2öi}Zõ”5¬ ñ6ÃfØ@߯ï×÷ƒ‘gäy@E‘j¤©À/YËZÐOë×õë W-õ,õà1’}¬w2e2À~ß~ßmcÚìc?éüoE½l‹C<Ó¿Õ¿4ã=ã½à7+K,ÏYd1l‡àb޹à^+”±Ï؇Æsý;ý»0ü ßO:ÿf¥9»ÌYI`¶ÁIN,1z±^ŒÔ€À‚B¶¹nÆ›ù&ž‰oò™üÁYùÂÞ.^ØûØ‹yƒý°' )Ç•°§IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-18-red.png 644 233 144 4107 14774263775 15620 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜüIDATXí—{LÔWÇÏï1.•]BeÐ\|`0õ¦ÊkxÄ©UcGmÅb´¬ºŠv4 ¶¸©S[ÝHT¢!JÒ 2ÒM©Å´…°!­A+MHcëÌDfSʈ:380ð{|÷æþæÔlvÏ?̹÷žs>¿s¿¿{MØ)Ìø5QÖ(k”•{ˆÒ2¥eJK~†(‹²(÷ž§%´„–Ój5‰$’È| ÜW«ÙzÏò±üáõø5á<¡|eTFe|SøüŒùb‹Ø"¶4=áp¸H\¼;ÞïÆ·l|°ñ°¹sÿæ~À”iÊ4e}6ÏÖ³x–ågõ^ÎCüêpîiÞË{y¯c ëPRIRIR‰üa]w]w]·:Õ3äò  @€ÃÆ0pš˜gëY<ËÇò‡×›{úå|¤wòNÞéøŽ%ȼžy=óº´Ò6nóÛü°!`êbEUTHr…tZ: ÈoÈÙr6 å<9/įSåT@]¬Æ¨1X<ËÇòkÀaõõ¯ih\×Ä5‰•b¥XÙp‡ª Õ†jɨV-ª©A*•JÕ¡\T.c+0€Š±WÝ `L©P*Õ11*5(ï*ïêae¥²¶ÚPm8j8*Y}ÆÃøH÷H÷H÷hí2¶@oÑ[ô5ÅþØn³Ûð,Ç#>~oü¨7Õ›<##0ô|è9B펄ºÒ5éû°û0Œ^½ ÈŸ«õj½¶Èclï·÷ã™Þ¢?¦?¦¦0OÜ'î÷õT²‰ÚâÚâÚbµ4À'5IuRÈ’,ð³ÜÏûx\/¸ŽI̹Á¹V]y˜x ø§M€ •*©),ÈW[\›S›£–j ã#ÕŸŸŸ†ê'ùOòŸäÛdöÌwnÞ¹ o–¼YRo/{{Ùd ;ÞÙñ$ÝJº7î߸åiåi<1'cNHîÿ¤ÿ“`½'ùë׌‡ñ1пo8¾áø†ãÁ'“mã­ã­\lèöàíAØýóîŸ`¦m¦ ?(ü`2Ðü‹ù #=#=t¼½·½ø>€ënéÝR@¶…ûã €âkS¯©×Ô«-”å\9WÎ ô |>Xc\cÄ$öC½ãõŽP“w“€7ý¨4( ‹™–š–š–jçö×|àÇ?ÝÎng7Ùü¼Ÿ÷ó${„íÂví¤j "/ºÐz”á.î‘ì4‰Ÿ~~:Ѷ…mDDŸU~VID´³sg'u&t&ѯ÷ ïñ߈ÓÅé#Áåp9\²1>⼑7ŽZ\]_V_V_"h9ZŽù |0ôe*ì.ì€ÕÒj)´“îw ðüœ»rîJÈ´äþÍýÐnÚ ÈÍÇŽ'ë];ÑÞÓÞ£uò/\:—Î¥’°\X.,?RÅÞ²ä9És’çÈsí[ì[ì[´5gÜ2n )¨ŒŒÀê_Vÿ2ÙÖ~_ø=¤ÎN W£®Fð•_*¿à-q­¸º¤. ~_ *íÈ‚¯|¥h€0C˜!Ì8÷ŒbóbóbóˆÄN±Sìltj¾É`2˜äƒ¬¬bû}ìwøaeϾé̦3P8T84製ö@Μ<m>›æ›æ”s§~<õ#T¶ºäVqyq¹âÓw »„]÷·Nø1®]%Ñ¥ëÒuéŽ ,À\a®0W¨9ÚÎýIn–›¡Þzo=»ÁÝF¸{¥( •Êðüáù€\Ð,3?\Á£ €ªf¨ ü¤ü¨9j³Ú”’³±ßÕï’£õ_ê¿”öiüT(ÊÍ ÍHF2Šú keQ–ø)5Q5 .Á%¸>üF»ZÏêOéOIqöì5öšPí*ë•õ¡€Å(&:+L0êVe½²>Øßm7·µok—j7аè½Öc‰û÷'î'â ¼7pͺb†ù‡Àß­ÂCá¡ðkM9”r(å‘®DW¢+±Ó´›eÈ2d…jW1+føa…VOñOƒÜrªœ*§µX³¢fEÍ 5G»Ëãtqº8çhàk):|§¹¶ÈC‹p»Â}}ô„víÍ/Ônœ'Å”e@j±}è¬1}1}1}êFM“±|,ûÞß"¤x&‚/Š^> ÔDhwã«´+uHRGP¹#‰#‰#‰À"÷"÷"·ügM‹—…ËÂå“«˜ÔÒ‹œF¯°à–àEÚ=¡?¡?!ÅÙíöF~øá‡›‘š[Í­æÖà±#žÏŠgûÿ’Ä܈¨§©¯Œ4ð^@»W^¤ÝìuÙë²×µk]e]e]…/&æUm'¸"®ˆ+Ê=^†Q—£ÿÒ^¥Ý5B•P%T9Þ`ÀE–"K‘EýÇâ±Åc‹Ç¤{ÚV»—à2'QCàÛÁHF2 ‘_ Qô?Z¤v…ûÙ¿r;¸Ü€ ¨€ ”ü,~? àˆ#ŽþÕ•ìKö%ûˆ„¡GèáÚ[#vîÿfqÚ¯<Ê£<ñNøôGżʫ¼ pm\×öïÙãó¬;c‹ÈûÊ­þ’Þ·ÉQ&Õ`IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-28.7.png 644 233 144 3207 14774263776 15054 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜBvÊï)¿+'x>÷|ƒK½«½«¡¿ïÙÙgg¡µ¬µ´µf7ÎnœÝMÉMÉMÉPXZXZX 6·ÍmsCÁ΂;Á}Î}Î}.FLëÒº´®Þô`ÓýM÷áŸ_~Wð]AÌ®‡ûçõÏHmOmWNÁ•~5ýªñ? Æ~û¿Z«ÆªÆ`^÷¼îyÝÐs­çZÏ5p4;šͰ¨eQË¢–Xáü-ù[ò·@MvMvMö›ßÚ½§÷žÞ{ 9;rvä쀑CÞ¯¼_ÅÉL¦'ä ¯33‡ ÆoÚ·Ú·–‡âš20e@äÒo?÷ýÜ'™ÿI9’"²Ñ»ñ寗"O\O\O\"/¼xðâˆ{{{ˆ³ÎYç¬ñŽxG¼#"S.N¹8å¢ÈéÀéÀé€L¬ÆêÆêÆj‘üYù¹ù¹"é{3Že1êDD$Sþ£¤$"VãªqÕò0A|þG÷-‘kK®-Iœœ~;ý6_,ÿóÒàÒ „Ú3ÛßmWdßð¾á}Ã"…¹…¹…¹"{wïݽw·Hugugu§ÈÁSO<%b¿k¿k¿+Ҝ֜֜&âßàßàß bë´uÚ:E6ÿqsöæì ¾!K¦ˆ_Ȥëׯ_ñùŠºoE墶¶¯Ø¾Âœ¬‘z‹Þè 3Œšº . ‡zâÎj”QF'Nœqv=ßa€Z¯Ö×Omß¿}¿©gµ‚+ªcX[ûÕ¯ €þ÷ˆŽéB£¡QüúI½KïuTR‡@®?ןƒ¾Kߥïc¾1ߘ”QFVÃjX[tÐÆ#`@mÒÚ´6üQF+ï}Õû À:`ð%šºú¦ò‡ÖXÖX€á¨2è­z+ðÒXm¬&L("ô€†yÍ븉( `ž8똱ÖXK˜ Þ¦·Å+ÿš¤5IÿWù£w%öõöõqw%{fì™ÊppˆCØ@ói>}ƒ¾ ¨ê,æߌ7óÍzfý‰»2Ú?Âçm~]¼µï±·óû_û³ÿE¡IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.5.png 644 233 144 2545 14774263775 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–_LSWÇOÛ!% X ‰$™F*‰ã2¢D‹F ‚25úbdjز ÷`† F^6Ä Mx’If Ä‘ÍˆŠÆ…&Ò-DG FlaJÛ{Ïù졽Ü*’½z^z¿óû}¿ßžsÏ÷B!–G~XWYWY—…cë—f޾˾+£-7ê`)¶ÿù=$^N¼ àhr4Éa36æúè~!Lüh>#/– 3ÛÛnÉ‹Ä5p0ë`–=%ÿxânÆÝüWƒ²Ž²€_®ýrÓ0ñpâ!ÀtÞt˜±1oÔý^4¾¨y‡_ˆéŠé²ü ±Kb—i®4Wze¸`, žÙžÙ”t/@‚Êf˜Á/¢bc>Roôx¾Ágð‡õHÞž¼](:\t8îj¸aøg¨ZYµÐB7«\%´j­ˆÑŽiÇ€zªž`Å L«[ê(]Û¯í' þ M…¦@Mq†3$ÐoàU­¨ZèŸÁÖ#ÞÞÛºPb/± ôô}‘[åVBê¤jP áY4B„0ÇsÌ-È+ œrB }Òg¤C $©$ÉXÁºQ[)„Ÿüqq3[wëÀköà•»ån^ C¾ T*À—éËôe²`¨  ª øwøwøwÀ䯓·'oƒ÷;o³·ôøàÉàÉ:ìaÀýÄýLþ°žˆ°Æ>(¯.¯æd6èÝz’ž¥g™+tvÃÙ g7€Ëïò»ü …ùZ}­¾VHó¤yÒ<°þÜúsëÏ3۹ι†>r9M<é5ø"ü=aßÂußõù%VÇeJ°'ØCÀÈôŽöŽöŽš_PTPTP´PØøñã7`MÚ†5 PÛXÛXÛîÇîÇîÇQ…_ho´7ð…ùLþ°Ëî.»«ÚabÓÄ& æm¢Wɯ’^%Aþlþlþ,¹pä‘ °×µ×µ×µPX¯·×Ûë…Ì–Ì–ÌÈ}™û2÷%¬­Y[³¶<Ÿz6{6Gm}ŽñáèàXêX*‡àÅóÏAÿ|þØP__¶K¶K¶K°e`ËÀ–°ÏÙçìsÐaë°uØL¢áÑáÑáQèêê2óÛR¶¥lK‹iÓ.¦™y“/Ìoè± !;e§eHmŸ¶Oëi!„É‘³!òÓóW篢-¶-¶-VˆŒ±Œ±Œ1!R«R«R«„HíLíLí¢E´ˆ!Ä£ÊG•*…(í)í)í¢ÉÙälr 1¹qrãäF!²þÊòdyÄü°X ¾0ÿ¼žÅÞ1ЛõfòY.ËÍx§óNçN8<<„ÀH`$0…ŽBG¡¦§§¡þPý¡úC3ž3ž3­é­é­éQ{¾Oók~ü±è;öΩôÏŸÊl=T:¡N ´ßµ­d—ì’]À®pÔu@ˆ"ì§Ÿ~@"‘Qùßè¦(ä§P ÇëñöºEOå{|Ìð™YY,‹ç}uKµ«võ²^Öƒ 22A&È —\rAïÖ»õnпÖ+ô ŸÉ2Y Êl™åcº;à,êcïq~ âü÷õû²T–Š­b–i¦#Ï ðáèÈJ)‚‰ø" äqyœ‰gà| œÿ¾•a€›@-µ$€6£ÍèGõ£@ÝS÷°`36æz£ßÀ3ðýV~°·‹ö>öaÞ`ÿMŸbŒ{·!‘IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-75-red.png 644 233 144 4161 14774263775 15623 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü&IDATXí—mL”WÇïó2*––…¾€e¨Qv­[)„®¨I ʈÍRIÅ ÕØúÁ—¶ã¦i•ÝT*qE»$jmL5µKZß’nDjÓl¬YŒ» MŒ `"ò6# àóÌóÛ3÷™—tk6»ç sï¹çœßÜó¿÷B„íW"ÎÔ—¦{¦{¦{”±ÈDò´3ÓÎL;S²H7uS7;>y"OäAØmíºÐ….Ç?¶öÉõ2^æ“ùãë©/ÅóÄòí;ĵ9ÞŸþ¬~F?£ŸiRÞVÞVÞ¶ARÒFÓFÓFù¶ìvÙí²ÛPÑ[Ñ[Ñ å…å…å…ѱôËõ2^æ“ùe½_æê‹ñã9‡Ô€P¾<¹C™Õ™Õ™Õæ»Ç®»vìš5Ó?èôãÜç>÷>|`#~¹^ÆË|2|½9‡~™O8UûÔ^µ×÷W™ ðjáñÂãÆbïïkÞ×ð1+Çʰ20̣ƨ3߆³Ô¸d\3ßè5zÁ¬16Áʱœ–CÆ{xK½¥x ¯(<`,¶ûÔµGÖw>j£)ÍJ³Ò,„¾Wß«ïm¼)\û\Ÿ¸>1Jm°?p™ËøFÞç}°|Çñ²?™˜Q¿\oÇGòÉŲž¬/y$Ÿpô8z=¿ÿ\à¬ununµ²»ïù6ù61Éã7÷û†}ckÆÖþ±icÓ†+†+‚'‚'Œz£`Ä1ÿØì±Ùc©c©`îíí°¿”¿ûžÏås1â¬unwn·²%ͧoÓ·éۮ#U‡Ý‡ÝÖ[‘ãF³_ø@æ3™Ï“áu êE=@Òž¤=ÊMå&Àþ'ö?p¥úJ5„€Ö£õÄÆÏ΂ÑÜõm×·6ðø‘ªCç³Þ²w6ŽOXi Ò¤-`ßPÉÐãCÛY䓸/¦\L8yòäI€sçϨ©­©ú)é§$O§§àÉuO®ø®í»6€ÖœÖÀÿÍ‚oY÷“ï'Gë • ¶ ¶€ä‘|ôÏ«êWÕ¯ª~3ÓkzM/0À4Ñ`Y–+Ê¥©KS¶ mНžW=àÙ—Ÿ}àÈù#ç¾\ôå"€`c°"¹1½f±Y­/y$_”³åååQ͘f±Yb–0É$ÀTûT{,È‘¼#y©I©Iw×Þ]ëuΫsbwzYû²v€™í3ÛææÎÍÕÕ`þ1îHšå/”¿Pþ‚}oŸ•;Z¹¨aQâº&” eBZh¡‹M–Çò@ô|†v…v¤ûÒ}»oí¾ÅÏØ‹\ ðCß}±óÞ7¼oÄhµã󳟟+»W…©…©…©tI>¡–ª¥j郻ò©;±ãÄŽ;b$0cÊ1利3y©âR@rcr#€w…wE,ÈDúD:À|@oCoCŒÛd²”ÕÊj0¿:˜0?ZïòÖ‘Ö{'·(¹J®’ûà®Ðj µ…ÔÉS–5;kvÖlsN÷êîÕÝ«í~k™ü¸aÆ €•?‘?·…¹äÆŸŸûü\€œ’œ€ÖÇZÆw6ïl^y¤à‘€Ž½{™D-ø`>ó Ù€–®¥k韎ˆäåÉË“— ¡_ѯèWšúì ¿¼ø^ñ=ó»áîˆ^=ùyùyÀø›ß¿ù},؃Áƒ±ãÛ•·+ Ú Ú¤Õ#sƒsƒúôk××®h««oT½^õzhÜܬmÖ6ÿsMxœ$O½´ÌÃŽ\G®#×w\¸kÜîè~©ýiýiX0Ù>Ù«]îp€z·ÇÇ| LZ¾ð«ä¯ðW€Y, –E[}*pjë©­¼b?¡ujZ7Q¢ÌRf)³~{,Pû»ý¤®WÖ+ë‹*MJ“Ò$µÚêió|äù­ÝwB9¡œ0;0I€@̆Z¡Èkj=e=Ö2«Åj‰J©¯©/³/²f8o8oÛìüPÛ­ív»l´RQ*Jug”µH‰"ýCÑ,šE³Ú€Ö¯õ¿{Þ~Z:w9w)Ýïyoy£§Üo-³Š¬¢XÀ¸‡"ŠÀZz1ôbø¢X÷㺫뮚ïØ/Ð}= <{2¶glÏØ.„êR]ªKù*BW%1‰ü]£ui]Z—r!{göÎìB8ªÕŽjÏ[»E®"WQ¬vCî›IGŸZz·z·ªªgS³z²zÐL‚²¬²¬²,(6Šb s s sa¼v¼v¼œ ÎgtííÚÛµ7&¬%¡%¡%Ö/_¿|ýrÌîîCZòÊ +/  ®¼1~c\UWyè=q‹âwwó׉ä{ò="¥×6X6X,Í_ øüb½ô÷Kß^úVä¡ç¡ç¡GdEúŠôé"Kó–æ-ÍIkHkHkÉpe¸2\"c«ÇV­–ùQY\Y\Y,ÒÛÞÛÞÛ.âÙï9ä9$¢] O…§Äšý^F_FŸ¥Yäù Ïo‰ 9J%ùëâäñ?ÆÿˆKÊ->‹Oä_&{“½âÿSî‰×N¼&RªÕku‘Ó#§GNˆlqnqnqŠ<8ðàÀƒ1¡p( ‹ØöÙöÙöÅòÃÃÃ"Ã#Ã#Ã#"ÝwºïvßYõÞª³«ÎŠüíLÏâžÅâI9˜rPD}.6±áŠ3®‡ëÃõ–[Ò±dbÉ„ˆ÷zïh﨤yÜèhtˆTlª(ª(¹é¿é¿éIJIJIJ™L˜L˜L©ªªñOú'ý“"ùCùCùC"çêÎÕ«¹üèò£ËD*ŽV­8*2¸dÐ>h ü:P(I]¶Ù~IÑfµYÙ©Êa¹%ú^sy+½•ÐskèÓ¡OUÕæí/h/hheZY ,¹õ¹õ¹õ0àp 8à¢õ¢õ¢  w¬w¬w f\3®¸Ýn·Û SéSéSépÄ{Ä{Ä kÿ¹Ö·ÖÍþ¦cMÇÌ=¬ªhÿìÔg§€s=Q»89Õ¥Õ¥æ–5ò@¿¤_4&™DÍïæ"Š(Úh£mÁï×DM@9,´N:é!B1Ûã=UOŽ™|ÕõÕõÀ\ô¯¤#êcØ}v_p‘úÊ·Æ·ô†ˆÏè?Ìç‚Ìê úeý2¨ëêõ ÛíÆvÐ]ºKwÑoôý@3Í4ƒ‘f¤iÀ3d’ úÇúUý*è‡æzçz™5VE}ìs_¶/À~Ç~'¸ˆñ¨ýÌùç¶Y¶YÔ™§õ>½x`¼l¼Lˆ¹èC˜009¬…ÌpŸûÑJP(ãMãMB<ֿп˜·Ý¯a›u›õÿ:ô¬Ä³Ã³cÁYÉ»O½ûÔ<@'ðá`8 ïÔw¢º¢®`Á±Øœ7ëÍ~ÏÄ7ùLþù³ò‰½]<±÷±'óûÕt¸ÆrÑçËIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-70-red.png 644 233 144 4234 14774263775 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜQIDATXí—{LÔWÇÏï1<…FPA]W «ÉÊ &KI4„‘T,­º]hǦ©‚Dâ³k¬ˆZµµdd4P[·µ ©V7kÓÝ„&Fg&26¤#¯™™ßã»0¿ßüfÒÕlvÏ?üνçžó¹÷~ï½јM¢c—ÅÚbm±6æe¨!!¦5¦5¦µà¼È‹¼øè,eQecÝòâ‰'^ñH_> Ä+ã•|JþÈzì²H-_UQÛÙŸü;¾•oå[[˜íÌvf» ¢ONNÆÍUW=^õ0÷š{ͽ@INININØWú•xe¼’OɯÔ{=±Œôg~ÊzY/ëuf)+”Z™Z™Z)~p¦ûL÷™nyœ§ßÓïéÀF0‚N8áT?Ô¯Ä+ã•|JþÈz3?}=&°.¶—íuþMIs7ç\Î9a‰=h/¶ÃŽÉrŠœA¬j„@ÌxÄBÁ*X1[,‹±Fœ+Îä 9^އ Œ·í~»öœ»9wsî KT`ëb]J}ÃiaZ˜"~?¿Ÿßßü£2ÀtÀtÒtR(TÁ>Äm܆GhÆÇø¡Ž€QŒT&HÇ¥ãáx¡Y<+žä¥‰ÒDx”`ÓSµ©Z(Tê+< éžéžéžýi¡`ØgØbØ"§;^8×;×c(”Ç#t:àeéËRž—1/cÀ{Ô{_‘¯ ž žàò ù x3xI_H_¨AÇ ÀaŸaaœ®ð¨|üV~+¿õÁ~¥£±â„å„EÞJàZ<ä!Hž:€, Ãtâkãk€ÿŒÿ v¹ûK-¨yºy:0v ø§§àó7f@hÑÆÂ×XÑXÑX!oRW6‚dwâüÄù‰óq` ` i I( ÙÈài×·ëàÂ… àÚõk× ¦¾¦^‚ž¯{¾€ƒîƒn?8~ºººº rJ垉I“¤ ¥¥‡ë ôë(< ŸzpåᕇWÏL´‹vÑÀ 7Ü+¬ ˲¬]ã÷Æï`sîæ\mûÂÞ…½°þÒúKÚöÞg½Ï4s_½2 ˆvm | ÂE[É£’G%Ô@QÌ Ä€~tº´¹³³`Rì¤Xö{àUÞ«<àWð+ é­¦·´ã¤ è}z€÷Ô§~Ä= bÉ‚’% Ô{» }\qu»º]Ýd÷³~ÖÏÇý…ÛÄm"Ð{hCycŒ1F""¹Z®&"ª¿VˆhóÏ›&"ÒOÐO "’fI³ˆˆbÅ"" t:´W “Ì$Q€NÓi"zBíÔNÄ^ qn§Ûév’]á#¶-d ƒ¿*OÝùªóUç«4ˆ è:Í\ýæ3$4'4€½Î^‡ß°%qKâàÝà»AM³Ð[Ô[|߈—¯~uõ«p½ÛG:fwÌVWòÏL&“Éd%n·ˆ[´«A9ei3Òf¤Íg:V;V;V« <òrå³¼¼¼€œ=š=ªn ·µ~±Îüd~2<¬~X ÀWü¼ø9€·'÷MÕ#«á÷!p.p˜¿kžyžYR.™Kæ’O QB~B~B>‡¿Ãß±ºÔ ¿$ïEÞ q‡RV²„ôjËÎÊÎàÛøÝÆï"@íBÄðß÷߀5W×\à!™dCsgÏ H§n%ÞJ„z,+ÿ^þIù'’OÜÀmà6ü«tÌwS¤¥žÐeê2u™ÎsÊKÅmq‡×S˜Ü—Ø—ðwù»€ðÛ‚{¸èG?ȿȿðã žÀPæP& VøNûN‡·ú¢÷bíÅZ¼­>¡ lÛ0ZÀLe¦2S& û‡*õµÌZfm^ce¬ŒUÑŠ´ÅÖi«·Õæjw‡”!eŒ±CÝ ~Í‚ÊHBH÷¥û€¼\þ\þ<,%—ÕeqY€´8CÀ¶ª+YËíåöZL*Z!R!o³ÉHF¾–Z¨…Zˆ87×Çõ}p]}Z› » »½ã#ûOöŸ´Ú•²1p Üòm؈€\*Hᩬy¸æÞš{âõá½¼×V—²-e[Ê6"ÖÄšXs9DW¡`Žý-åžrO¹§Ìôé;Ówé*u•ºJ[ª]£Éh2jµ+Y$ ü°Á€A bPs!ÎçˆsÂZ<¶øØâc‹ååê[®×éuz×hè×R\äN3íQ[OL”ÛéâÆ´ë¸¬Ñn¥F£]½ ôa ©Oê“úÂZìAz[|O|O|¼JÕd›À&¼³7JŠ'¢øbéõ ܱ(í®ú ívÚ:ÃÚ:…N¡3|ô_¥¼Jy•Ìž7šÈd„ª[íæÜœÛ’JÍÔLͺv8GT½Xú-Z»u‘~îf³ŽYÐ ZA+¤¹ì4v; `ˆ!†¾íJó¥ùÒ|DÜî÷€¹Xµsÿ7Ó«_ù”Oùü‘ÝU°2+³2À´3íLûóécí³lQ;cÊûÆ­þ7忥 luIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-118.png 644 233 144 2706 14774263775 14771 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü{IDATHÇÍ–]lSeÇŸvÅ®d® ¶0âÐà˜Â\  Qc2¥)ÉP£@" ˆ»`¥8/¼⃠!q™!§Th–ñQ—ñ1Ã2•‹MC¢f·Œ®ëL{>ÞŸ=ïNuzÏsÓ>_ÿÿ?ç<ïs^™æü xg{g{ ³¾÷-7žÿBþ åŸgýCxVyVõ5Bð@ð@ÑgEŸÙW]_çu}n¿ˆ‹ŸË§ã2MÜ€?æyV8þûðòü—çç—dýÝç!ÄS&lhÛÐpâð‰Ã¼ ß|0²bd¸¾Îëzݯñrñåýñ‹À”SSNynÿÿ"ðÈó<ÿè;Ù‚_…Ћ¡~Ïû=OyÀú( @­’$Ñ6”ãë¼S¯û5žÆ×|š?«G ø™âgD üjøÕ@K¶áêÌÈC‘‡4Ÿç)6³™Žšß˜ßXë­õ¤Aõ©>àiµL-«7Õ›V£ÕHšæ'æ' ºyƒ7(àSßtø&ø³zÜWi‹ˆìyj¥V&u©¨¹Ýܪߺb]ÁpJ?UQÕ«zU/®RH!¨Ùêqõ8 ø–o1T±]g×ó²øP[\[ $5¿ä[ÅǸ¸“ôAÿXÿÐ @ ¨ÕÃx*1þàøƒ`üj\7®3ÉR‰T"•ã qÐ8èÆ3û3û3ûánènènÌù™p&̸“®¡«ÿÃþÉ@2éÓza‡.0X·¡nƒ†³¨eÆcŒìùräKÔ’È’ú%õpºþtýéz—xèÈБ¡#°xëâ­‹·ÂÙ•gWž] ʧ|Ê5ù5ù5ùPZ^ZVZáyágÃÏ¢þz+ùJò—'7¶ol׳wè‚#ì§žh-k-Ó…j}jxô£ÑHWG«·ToqÏnÇÚŽµk]aU¡ªPUÈÍ÷Ìí™Û3:C¡ÎÌÙ5gל]л¦wMï(?X¾§||=ÿÔåS—Ik>{áÑò£åZØO ……*ÆØÀ¼yÀU§t‹]iW‚5Ë*µJ¡Ê_å¯òC|8>v…¥UZ¥TÞ¬¼YyN6l:ÙVÜŠ[q¨(ª(ª(‚àÎàÎàNX¸jaxaþ,¸Ów§ÏÅQ_ýqë[ õxEòBy!ž‚)S:Däg–ýrFΈä ä æ Šø| ¾O‰§ÄS"æ÷ø=~ˆwÐ;è F‚‘`D$Ök‹µ‰ÌX>cùŒå"‰‰‰"jš*RE"ÇJbÕ±ê ˜aÕá«÷Õ‹h=^»Ýn÷\ÌCDDŠ=KF2®€Ì¶Ì¶Ì6ó†yü!“̘jL5¦Š¤GÓ£éQ‘YÁYÁYA‘ÛÍ·›o7‹?wüÜñs"C?ý0ôƒÈÌ—f>6ó±‰öbÙfv™]"®=c´&Z@Wö³Ò¼gÞÓ3ÑMÑMÑMÐ=½{z÷ôɧ2Z­ˆVÀ¥Ý—v_ÚíÆ÷µïkß׋–.Zºh)4ÛÍcÍcªRU’æ²Ã÷]ë‰Öÿ˜1çTR÷^Ý{9§3iº]iW昅…•ã7ÑDpk\ˉ'¼˜Ùb¶äð©ºÆºÆI§²âc ’>T¿Ño¶ÞcvÄŽ0n¯·÷Ú{A¨A58Y—½Î^g¯e)Kå´ŽZ-V XïZ_X_€ý°Ñh42Î1=x=ß¿MÚczÑîyjókó5¬ÑV—Õ¤ìÕöj g÷+˜øïlXR¤ƒ LÌœ'ž¶_³_Ãë¢u1_óMÚüÿó­$R™ØkFø€(p_±õºõ:iPçÕyŸçó¾Ïçyß;¢ '?ã7[ƒ­ÁVnÚ;ÔÔÔ™™,Ê¢,Ê_ýž(€…iµ–DId>à﫵l=‹gx ß?¿ÉŸ/¿b*¦b¾Ý~Ùsb§Ø)v¶s¸Üˆ1r2r2r—¶ßÙ~gû`çý÷wÞv¤îHÝ‘ªûlž­gñ á³|çCüFÕ{ü?ÅO &°Š.Œ.Œ.”ß:m;m;mSCÜÜÜ `ñ bƒ€æ{çÙzÏð¾¾Uï=ž™Âx'ï䃗@êõÔë©×¥ŸÛçí»vxMSŸVŸ†$—I-R 'ÊÑr4 gÉ9r 'ÊÏËÏr™\&—jœ§ÆAbñöyû}v†¯öËo Ó¨qí\;×N$V‰UbUk? 0ךKÍ¥R–FìmÙ&Ûà–ZçKæKuÐ;1‡^ô€’­dP`…ºÍyã“b¤V%L Ô·n¶Ì\k~ßü¾”Åò3>Œ† C†¡_üŒ-0UšŽ™Ž©kc—×Ç-¿+ß”o€tUº ÀísÀlÈl|íe¼ìç'! €¯à˜îŸîäw§[§[µ5nǘ£ÓÑ —©ÒTiªT×0>?qŸ¸OÜ×WÅ&Nœ*8U þÚ 0#µ3,g¿³€'åbÊEàûø>jj€wνsΗŸR¤ùú߇ÀóìÒg—@óhó( ã/äcùµ“õãGêhäúÈõ‘ëQ;ž9þâø‹€t¤CB ÛsaMa DD€íÛ'Ps§æ°p@wLw þå¿ÿ‚Ï:wsSs áC•UÒxæxæx&Àø0~ŒèosŽçÏ9®ïL¶Ëár8€Q6´ñöÆÛpäÔ‘S¾Ü+Ý+€)N6žlôo|ªñ)XÚ»´×wCII:¾lŸË™ËÑó3>Œïm©ç † C†ÖcÁTDf2ÑR6t©áRQÅpÅ0ÑÜwsßÕl¬ÙHDüið§DDÙë²×Ýí»ÛGDt´ëhQÃlÃ,Ñë+‘²GÙCD‹¼ðgQƒ=¿¡ÃÐaèÐZžÝ¯j^r}r}r=îÍr³4K. ­Pñ+¥_é÷íÏ«W# ª<ª >€‹7.Þðë¡Ò¤RxýÌëg`jljÌçD=5#5#¾ò>^’ƒ ²èÔˆÔˆÔÜcüˆÏâ³ø¬ùï@mKqKqK±±¯ÖÖ<¬t‡_=ü*xV{Vû€ÂBÉ É€°ú°z’°Mئ–ÏN<œ¨çûkÝ•œ+9Ú ø.ž‹çâçGHØ l6”V³.‹Yiºbº"¯rüÒÞj÷¹>Ôôä–äHp%¸¨=±=±ðÙôgÓp&ùL2|[þm9|½÷ë½`ûÜö9t;»fhí½?|8ŒOOÃ3ƒGUª€õ¥±—c/+Ú ,– Ëš]šššA$^¯‰×ڜڅ¿ã%ÛK6¹˜ÌÌËŠòåðÀì ^HxŽÎ€ð¥ð¥o“|Øõa—_»Â!îÙë³×¸ž©{¦Pš?ù D/uáßóçóç•`‘P$ý#wÁ_W•liâÚ¸r®œiEÙkí½pòÂIíqœ‘K³bö97üM pÓÕ7Ô7t)9ÛœMÎ& fQÌ’˜%Ò>í$+„ ¡ÂbÖ¨eQe‰&k¥QšXAíÔNíD¨0( ¾õ'íim2MFÉè8d?k?ë«]yLµ[í ¢•fXâ#|¨¹j‰Z¢og×] »äíz(>XEíÚµŸˆ7ófÞÌ÷²+`4—x?s…{Â=á×µæàšƒk …†Bë1M»iæ4sš\Â*Å¢XàÕûcd˜ÐOR^+¯•×êç[ŸTŸTŸ¤¦ko¹Ñ`4³ ¾iù×PzâÜ/ü}Ó¢í:ÎëÚµ”YÊ|´k”Œ’Q'¤ +Ãʰ®Å `°.X<°x@Ý®i2”åC_; ÅÆ~Áôø¡ÞG»ù\þ–í\ׯµùj×ÚkíÕµ+õJ½R¯®ÜGQ¢E±“±“±“òO4-vBÇïR˜Ô¼Ò $ø=Áô @×î¨0ê£Ý:S©N2:ÚmŽ6xàÁ$cjé²tYºôkGl›Ä¦ï_’Å Èë§' 4ðšW»üOÚݼmó¶ÍÛtíZS¬)Öœ]˜WµJpy\—·¥Ô? ?—£ÿÒž¤ÝMBµP-T&2Ây•y•y•ꉸ¹¸¹¸9é–VêQaTµDS+µR+y¯Á/˜þG Ôî1ó]n7·›Û ÐVÚJ[•uü ~¿àˆ#ŽþòEÌLÌLÌ ‘Ð'ô }ÜŸ½¹•û¿™Qû–A”!öûO*àU^åU€ëáz¸žþhaüÇÖ€ÊØpŸXê”ü€ß(¸~IEND®B`‚routino-3.4.3/web/www/routino/icons/ball-3.png 644 233 144 213 14774263775 14365 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷Ü@IDAT(Ï­’A Ã6ÿÿçzâDˆ×+¬!€@ [²{$°[‰¦à‰¯×à„Ëù+ŠM”MW¸%¿ìÔm‚/õï{”–IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-49-grey.png 644 233 144 6224 14774263775 16022 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IIDATXÃ…—kPTW¶Çÿ{÷é'A^#`.Òá™K¨DD™#£\b bã#cY$rQ¨r‰JÆHD“¨@tÔð j¢c ”DÓ% ­* A6ØMŸ>çìû>xË[©¬/»Î9{­õÛk­³÷Ú$77777®˜’±©.àîpw¸;¬!÷tîéÜÓÌ;o0o0opñ‹Ì¹1·„YÂ,aÖœL[µ­ÚVÍ>F)JQJ²Œ`èAzd"™ìcõ õ õ ’Í=är;JÉ(%£»ïõÚëµ×«ñF~Z~Z~üÁŸ$LqHÍ.W: …(DÑr)OÊ“ò¤fþ ÿ„â‘W›W›W[ÞÇðü€á_–—-/[^ž³Ã©È©È©usâæÄ͉#Ùs•s•s•@„{„{„; ?Ëßåù²¾loھßì_æ‘ù8G_e3Ø 6CZMÖ“õd½‘Â_á¯ð¿tâIÙ“²'e³Ý= ƒ˜×××CíaÆ0c˜‘,Ug«³ÕÙ°à|€ ƒX¤#éžÇóx›ÍÇæƒ¥Æ&c“±‰Ù þ1øÇ`)k8~8~8>õ°Î_ç¯óÿ³F\/®×DZ –Á2î¬&  ¯’œÉœÉœIMhB“3WÍUsÕMgy+oå­³ÿ¢_¨_¨_(D%¿—ü^ò{\¹«ÙÕìj†¾ð…/©Zª–ªÁd5YMVÅ(FŒcã±+±B€ ¸1ç1ç1gܾpôÂÑ G…Õ·ºýÓퟸ«*­J«Òþ»^X!¬V¼¶ ¯á5¼vœjÛµíÚv@é­ôVzÿýŠ¥ÞRo©Ÿý}²>YŸ,,ÍHËHËH㮺r®œ+‡?I£Ò¨4 °bVÌŠÁÑ|šOóú }…¾.ÒEº¦Á€f4£Ù2¶Œ-\R\R\Rð'Ù¾~¹~¹~¹°Tö/óÈ|T˜&„‰„¾Š¯â«Ò^ñHöHöHfÉÉÉœ\#fÍ¢Y4fÐ_é¯ôW€Xˆ…X»Én²›ÑEt]ðTêQzK°K[¤-Ò °I6É& ˜!ÛO®K®K®ãÊ===Y€Ì#óQÌ‚Yð¾${´=Ú ÄtÆtÆt"Îõ×o\¿Jj—Ú¥vÌ Cdˆ Xˆ…XŒÿ0þÃø@á¾Â}…û€Ž´Ž´Ž´§œÃmÃmÃm@I{I{I;°?iÒþ$àññèæº¹nnzú ×c®Ç\AÓÓÓ8™Gæ£B€ Ì{×í‘Û#·Gøø¥è—¢_Š&%*zŽž£ç¶‘mdÿOÀ6ÕoªßÜ5Ü5Ü5ä9EN=ý~>ü|øùpÀZa­°V™I™I™I@ÈÙ³!g³g#ÎFã9ã9ã9Ójª°a;Ãv’™G棶Ûˆm'ý ü ü ­ýPû¡öCXXËbYàØö€=HI#i@k^k^kÐÓÕÓÕÓx”z”z”(BŠ„#á@Ÿ¦OÓ§bŒ1Æ#àêê $\J¸”p K‡¥Ã€éÓ ¦¦A9]‚.A—‹Ì#óQìÇ~ì'Árä¢f¬‚Uä 9C΃nƒnƒn@£­ÑÖhkkk•ŸÊOå×…ëÂu×q×™Çf›y h½Òz¥õ ÀGð|ÐéÙéÙé XîZîZîâUñªxÏŠš®¡kè_âK|I‚©b–b–bû‡9ÒiŽÄ-!Rˆ"¡ E´ˆÉš•c•c•c@ðæàÍÁ›à¤à¤à$€çyžç>…OáSžzZ³Íþ5û ß ß _àññhÞÕ¼«y •¢RÏxÆO«ÉþO:Ÿt>éÄ-ª§zªgÿà4šMPxËë–×-/îä5Ïkž×ýu•½ÏÞgï˲“œ»9wsîhCÚþ£X9¨T6k'ª&ª&ªfgÄzÇzÇz³E _'|ð5¹,Œ#·–[Ë­™Ü<¹yr3 èPt(:å;Êw”ïð|fffføÏøÏøÏî&w“» (N+N+NÃr}ñõÅ×ceY[Y[Y¾×öj{µ½“ñLÁL1g%B‚®”–ÒRZªh§éAz°«Ô+õJ½ëy]‹®E×4y6y6y²ÿ4î0î0îÀ·œ;çιÃʲ‡ì! yCó†æ @ù¾ò}åûO±‹° 3ÉL2Pÿ¢þEýË4 yœŽÓq ]]U]U]• WÞPÞPÞˆ™˜‰yDæ“ùd~×F¢…œ":::::š}‰XÄ"–ÛGsh͹½“ÆÓxož#îw‹»¶÷uöuöu ÂZÃZÃZéÿhË´eÚ2˜Ù!vˆ‚𨉨衇À:¬Ãºéî Œ1Æl$žÄ“x8U¢•·ß©¹Ss§†ûL—®K×¥›h4šw|5œ>œ>œNÎÂL’ ÷£NèCú„؆mØFª_üîÅï^ü®ð¯šw5ïjÞý6ÔmÔmÔ»àqÁょ¸]>ú …ZØà ox°Â ëÓZuœhŒ Ȩ[L-¦[ÔÖÐÖÐÖ (tòròròº?É—óå|ùÎnì½±÷Æ^€™˜‰™ w§dP‹c<'='='=—k®=¸öà·ñÛøm;?rrsrsr»s®§¶§¶§VQØðfÛ o²Ed ÙB¶@-‘ÎHgÀà`Ùcö ˆëiÈ4d·†pC¸!.NNN€)EJ‘;?š*½û“ŽR,v,3A>ˆ¼rÇ•DþomŽ}·`·“(E¢ýuêÊq©Ò¾É¾É¾Iú[ª”*¥JtAØÁ°ƒa±Bê–º¥nèh ¡!° ÙB¶ õÑÀ£GÅ ùóæ+njÂ5ášðÂ?Oý4YW¥©D*ኙÝ*g,?????f9¢p¼°M§ nŸºópŤˆ‘¢ËU4†ÆÐ˜¬jd ôH­½Ö^k6;>v:J)¥åH4Z­VÉr¿ä~ÉýÅMÍÍÍžu¶~[¿­Ïᛯß|ýæë€PïÐÓÉ€2ß4è3ÀòÃÀÏŽÚ­üµ;ktÖè,nì|îùÜó¹âv!Ap1ºÝîø¦©½©½©¬ÖuëºuÝ€¤—ô’þoÍ\ —Â¥Xÿ+`nÀÜ€¹tÄáï Çh}–Kß‘©Ý‚ãÑÈTLÅTdó@è@è@(¾}E_Ñ÷_‚:@ øï#¿Åþû[¬ûwc]c]c]ìеS×N];%¾:aŸ°OØÛ” ” ” Þ÷aÇÙqv¼¢j¨¡VÜÆF0"=/gÀ(áY‚?ß©Ý<4  â^VͪYut/½H/Ò‹ÿ ˜\>¹|r¹ª,Q–(Kh—"C‘¡Èøñ§À‹/.Ž6õšzM½äÉSò”<Ù ‡ÝZ å÷8(þ@ž©]Çv!îÅlÁ®cªO½ÈXkØ®õÓúiýh—¢Oѧèë÷“H¤›t¯ê^Õ½ ˜D€ÃžÜXZÿˆã¢ŒÿÆ4œºIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-2.0.png 644 233 144 2635 14774263775 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜRIDATHÇÍ–mL•eÇ/8Àg îb¬dÊNl§Õ‰ sÕ;aÎlcFƒ/I懖Ææ|Ãé·ÊfÓE"®XN^ã 8'ež/Î&Á—iâNj qxžû¹}8ç9Ï1³Ï^_ιÞþÿÿî—ë¹DDdAìW 9?9?93ê'äÄÓé—¿úß(Hz/é½áíu0ë ÀÂï~g8¾·ëûEüD>;. Ä ¸O¸O$­ŠùM°¡dCIúóQÿ9ÈèÊèzd¦žM=mm|¡ó¡óW=\Žoçíz»ßÆKÄ—¦ñ‹@êéÔÓI·ÀæN‚Õ«_ú4Zpý%X÷κwÆ]ã. ê0Ÿùz0Ŷý™àÛùX½ÝoãÙø6ŸÍÕ#à©ðTˆÀúêõխц‘㘠/4¼`ó]|M#Ì׿7ŒÀnsØ&úоÌê9=qÿ[sÒœ$¢3®מhOÙø1¾8T<¾·-o1[%Uô ùæ°9 úuówówŒXBë]º^׃¾¤/éK8VGu`…¬Qk4ÕÚeö˜=|¬òU~¾QåªrÙ[ÞJØJ‘å_BF(#4•cjLƒ¬½OïcÆøÀh6šá÷ÁÒKÁh2šŒ¦AÍ4Óì¸sysysy.//]¢«u5€Õmu3Ã1|=fŽ™àðGõÄ„}3›wlÞÚ°|@ %0õÊÔÛSo£×þ¸¶}m;dmËÚ–µ Vî_¹å~o o oá « Õ…êBёёÑµgjûkûdÀì4;/l¾(¿­'&ìâgðÃß?ü * 7Æ"Çvk8ÖËr—å.ËuˆWl]±uÅVhénénévâ]·»nwÝo±·Ø[ ÷Kï—Þ/…¢½E{‹öB}3}3ñòˆŠØ|Q~[O²HæÙ̳¯–ŠT¼Yñ¦ˆë®ˆHRkl§Ý[{{"ƒCƒCƒC"{ö 외6qm⚈/×—ëË•¸/_2¾D$Û—íËö‰d³ƒÙA‘üEù‹ò‰Ü|îföÍìx¹[VÛ|Q~[OŠˆkk^‘Ô«©W“DöŠˆHXÖSN¹xrzrÎçœiœ×8¯qžÈÀöíÛEŽEÊJËJËJaî#î#î#"¦×ôš^'nx áI?½:½Ú‰KVŒORO¥žˆ«ØUŒW ólæY}B¯…^ÕÿøYé-ê]Ú»Ô¹»üüüÐ1Ò1Ò1Á;Á;Á;Ðêiõ´zàÂÉ '/œ„‚Á‚Á‚Aؽ|÷òÝË¡¨¾¨¾¨FNN;øúEû_”ßÖóijÖ<~Æú¿íÿªÿ+ÔjµP™V™V™þŠ?Žï<¾óøN¨ÙU³«f„‡‡Cgagag!”Ý-»[vú¦û¦û±Àì5{‰pý¿ÏØ·2j–Ì)Ó™èˆyòöùW¼‚ *€vÚiOˆá *©DƒÊQ9ÀìÿÞÊ„96=öר_q¸5zHªBfÔçê'õ¨+ꢺªMµ©6ÐõF½,¿å·üÀ!q¬r«Ü*õ†ò)XÖeë2`Y5V ö½\ƒ5fŒOc “Ÿ*w•;a2Ï©3ê 0a½k½‹ÁÃØ Np{@„YfI&™,*ÚŒÌÙ+n}h}ˆêgõs>UéUéÿ9ùŸò­¤!¯!/Лíó-V5ª†èsúI$ãÛùø‘ˆõÛx6þS¿•Ïìëâ™}=›/Øqüù®@ÊîJIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-144.png 644 233 144 2733 14774263775 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–LTWÇÏ R˜(n¤­Bפbh²51)4†4¦lGv§¤â_ÅBW“&J¦ÐÚ›’nÒ˜(!q™­øj\c³© N¬ÕMƒ¡Eë*¼÷îýô™;oºtÿ÷þóÞ¹ß{¿ßóÎ;çÜ+ ""ùɧ€÷9ïsÞ¼„íý›;Ÿ]•]µ®/aé€ç ÏßwÀS_<õÀÊž•=êºkܬOß/âò§ë™yÉw"k kÀ³%iuê6d$ìƒcà;á;±`Þ“{Nï=ÞËßaꛩob[b[Àµ nÖ›ý†/_>ú}ÈÊòü²žÈzBÖn]»õù}‰7Ÿ‡ê@u`2c2C{À¹ 䣷qâ˜q/Í6xr½Ùoø ¿Ñ3ú V½ºêU¨}»ömßÑĆëǰ[ [ žu‚Wx—wÉá_vÄŽ8ï8ï°:ª£À?ôA}ÈT—Ô%ç=ç=ÁŽÙ1àS>ár´á£å™–gÛèÕkƒ¾£Æ÷W*‘®JJPRëV»Ínýƒu¢XI@£˜aˆ% ºY7ëf–(C ¡u³zM½†|Î瀓à‡`A°ÀD°«ÒøãM<^è¯ïß/£"óó"òo‘Ì=Ÿf¼™ñ¦<|øôÒËK/K¦=ag'ñJ¾ä‹H\â±2­L+Sd®h®h®HÜñ³dH†x¬ »Ú®–̹õ±x,.%#Á/—:wå»ã»Ó8šò'Y5_ósÓž¦=æ3ÕF½ÙÚhm„Ø¡X¬]þqù‡åÂé®Ó]§»–¦½¸½¸½üùþ|þàYíÒ.°uÖÿ¤ÿItJ©-¡ÇMõMõ&r_~tìÛýü%\.2ËuïsŸÍ}Æâ¦ÖM{7íukw¤q¤q¤ÑȽ{;÷6”ÊeÈ~”ý(ûœ žÜ|r³ÛfÔé}ÓûÀøãQƒjÐ3!ØÕvµˆX""²ÊógY’%7‡[Î-ç–Èlùlùl¹HÕdÕdÕ¤Hß;›}7EÖß_ý}_¿¯ß×/Ò°ºauÃj‘Þý‡{‹‡ŠCÅ!‘‚Ú‚š‚‘’?•ÄJb)úUžv¥])âúcrŒðlxOþóöŒ=âù¤ÖæÖæÖf¸¼ãòŽË;–'wä|ä|ä<„rC¹¡Ü?À‡#Ñaå†V„V¤åØÑ¤Þbx:<ý»KV%M4}àV%ØqÛíèš9îr×Òа/Øì  Â*¬ÂÀ5®q Ô:µN­{Æž±g@ ¨cêðO¾â+´þ«å·üiz›ö7í_V•/tƒoÊ7_¾aݰÀë ZT Tƒ:¤žÑÓzzyDô°ÖàÚT[¢,ÃÒ?zßš°&xœ~G7n,:©Ïïú˜9º*!˜Ì6tÖ88ãÎ8° ÞRoa%{¿†Ô{b,±Ä0Ÿ:+mì´ˆ/©]jóΈ3’ÎÌ f™H¹ÿÿŸ•´µ¤úšu褓÷;»œ],‚Ócxð€k<•Éý†Ïð=£Ÿ:+ÛÛÅc{{Ìœ9cÅw÷ËÌZ{­ÿÿÏ^{¯½DDdzâWÀõŽë×Ô¸íúÂñç|óÁüŸãöQ ÒÖ¥­ûó[˜vxÚa€-3ZT¯cÛóv|j¾ˆƒŸÊgûeº8Žì“Ù'ÓV%ìÝP[\[œ3+n7_÷i÷éq6ÿ²ù€S­§Zù†þàùªç«À±íy;ÞηñRñe÷ÿøE ³#³#ídgeg‰À¼ŠyE_Åú‹Àÿ‘ÿ#€ÇéÓµ ¬g@.¹z0Æö§Øö|"Þηñl|›ÏæëÈ[™·RÖ~¼öc÷ñ„ÞŸ0óóm>ã4ËÙÊVri5Ï™ç¬]Ö.&øIoÖ›AUPïô‡úCk»µ 0Ÿ›Ïåìe/¹ü˜À£qnã\ÀLð%ùãzœR*‘ý>¨‘I êÖs—¹ t¯uϺ‡‘˜Ðlg#AQgԙ䊡?ÓŸêO|æ3ô ݬ›ÑúžšT“ «tãCÍÌš™ö î÷¥”RDä½ïÁr‡Æ2 /Úz¨}Sß$6þ4–Ë£Ûè2º!FØax¶ãÙŽg;À(6Šb^ã‘X~,Œ¿'–M,#–pWq§ïVß-÷°{x,ÃÖãŠËûºTBõMõMSL‘¹ ru)³Ô,•³£#‘qWVVVŠtþÕÙßÙ/ɱ)sSæ¦L‘¢‡E‹Šøü>¿Ï/220202  DÑ€HÅ7¾r_¹Èo‡.W_®w"ý¬^¶À³À£KEêÖb&õÄÞÞÉ¢¶¹ms“ù||äÅÁ™ð¼Û¼Ûœ³Û3Ú3Ú3 Á Á Á 0çМCsÁÝ‘»#wG áXñ†cp±íbÛÅ6ð­ð­ð­pò;×tVvV&rÂú#Îm‘¶ˆ]ÒÛ;¦^zUŸ$:¼px!Л¶My”¬9Ölk6”Ö•Ö•ÖAWIWIW t¬ïXß±\u®:Wø ü~¨.¯.¯.‡H8Ž„rÈÅy‹óçAû¬ö¼ö<§ÄÖ?ö¿aϰl=3¦Ì˜¢@x(<œŒ{­ÕSõÔ(»Tv©ì\ï¿Þ½N<:ñèÄ#ðìñìñìqâ¼ao؆7Ü8pãõüöÚöÚöÚa!»Í$øz\"êWõkÚÁô›~1DD$/í]™”Ig/™bŠ)"Ñôhz4]¤,T* ‰<|2ødP¤åxËñ–ã"C÷‡îÝ)XZ°´`©“oäùF¾ˆõ¯5h :~¹ç1טkD=ö³kܨùjsÔeÂþ²@U *PÁ+Á+Á+ηV¶V¶V‚7Ë›åÍ‚–;-wZî¼~*‹‹‹ guÏû=ï;{L=|ã9z¶4mi²ãU ˜c¦ÓÑ5/‰Ia*¤BàG8’â綾^ ‰&šRü±d“ý*¾*qøãzRûX¼è>£Ï”ÝÇT£j$¦6ªfÕ zT‡tÈáS*Ce€Õ`5X  –¨%j pžóœO‰«WûÔ>УÖjkuJ‹õ½è{ñz“Woõý>¨É©ÉI¶Ïn°º­n`\mP0½_&& Q(à%/y™˜ÓL2™²BÉ|ëªu5¿&»&Û^©W:ÿîJû.‹œ†Ä]—,õ‰õ  ¯ék¤‘ŽmÏ'K–È·ñlü7Þ•oíëâ­}½/ØÿXW!¬ÙŸ÷IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-21.0.png 644 233 144 3115 14774263776 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–LÔçÇ?ÇY„’0fRF*-^ ?þ˜E bZ#¡´@`Œ;\CtvÝDͪÝ ­¦V³I¢u„ µÈ®0žF8jm­â¢eŽè1o 54üô<æÝ÷¾ßçµ?î¾ûcúüsy~¼?ïï=Ïóù<""òtäW &=&=&)Œc~µ'lJØ”y2Œé`©²Týõ]HnKnHq¦8Ñ(6ýfüÂ|‘(ÿÂz¦]ž–¨ÁvÊvʲ!‚[ vMíš„ï…ñÁ‹`ïµ÷úCðæé7Oôtötò3˜øjâ+€Ù ³ ŠM¿oæ›| ù¥å¿ê‹@Ü™¸3–€-Þ/36®|+0¶^{åµW¾ý6VÅ€>$’¨6>|˜kz6ý‘x3ßä3ùÍzfý°Ô’ÔŽVÌUÌÙ; £Ÿp¼©³©Ô­—ßÒN;‰š Mèoëo ØÀèR'ÕIuSÝz^GB³¡Y ã'Q]ðil4Ž~Â+­•V{‡©Gþso?|™çª‹«‹A­Ð.::¨fã ã 4õO5¤†PªO ªAP7Ô×êk¢kŽ{Ü[€ß¢Œ2”1¡_Ö/£w¹ F ÂÿóêÖêVSà‡//ØJ‘çÏyûÇö}V[5¶ ´P6µú»ß`^kÑ>Õ>eÑòß÷ß÷ßÍ«y5ïÇQŽr4 ƒËƒ¥ÁR˜ùÁä;“ï0¯a~ðìòì&ìÃöaŸ•@X¨µ""Ǿ€ílÿü ÀÈ-ÿSé‰Ò¼%yoò^Tñ¡â÷‹ß‡éeÓ˦—¯Ë×åë‚‚š‚š‚pípípíˆ Ñ5]Óµ(Þ:±u|ë8Ø»í½ö^Ôæ/_{=Îô¹\hÌhÌ Ãz$ôŒˆÈõ&8¿ôüRèüu_y_¹jx.5Ó•é"`¦555CkOkOk”ï+ßW¾/z***ÿ£}Î>gŸÙŽlG6L®\3¹Vµ¬Ì\™I ?ï—P àjwµƒn 뉱Æ,½³ôNÞZ‘¼Ê¼J‘ÒËE–"‹¥Ã}åÂÌ…± îÜ;¸WdêàÔÁ©ƒ"…Ý…Ý…Ý"ý­ý­ý­"ù{ò÷äï™÷Î{ç½²h?8þP$-7-7-W$m8m$mD$}YFQF‘Øþþ“o:¾é°tˆlØ8 B`‰{‰;o­U~ëõâj‹Çâ±È÷Ý)Ã)Ã2ó«%ûýûý’:øîБ¡#"N—Óåt‰®/\_¸>ZØ´mAÉ–lÉ^,ÌšdM²&‰„!Gȵk©ZV ’PœàNpËŒHÜxܸ¤Z’b7ÇnÆ!úožzñ©Õ)˜OŸO‡?ß8ç9ç‰nÑ!ï¡;‡î@W]W]WŒîÝ=º;ºU¹×r¯å^ƒÞúÞúÞú¨½-µ-µ-®f]ͺšî w†šŸoÎj΂U¿|ö…g_€[ñÞôޘ͙ÍC%~–ø™:%ú/Ì3Ö·¥o ¸þv¥ëJ—jØôã—/”¥”ÙÊlãÍñæxáìí³·ÏÞŽ Øyxçá‡ázÁõ‚ëð¨öQí£Z())¹msÛæ¶AÏŠž=+`ÝÝužuèpúÈé#æV <ÓØÜ뉴‹c_@cicé‚[‚~N?éLs(þß ½2@ %”'pâ|lUü!t+t XmÖkü¨ñ#àAäVÒécØ=vϪ¾ôä{òAßî3ú­ ?èg^? ®Ê­\Ê­kTUFO<ñÀcŒî×ýº8A;í`Ûí ÿ0ØlaÞ8éc†ÇáqØÇìc>+þH[Ôùƒ5– 0éÌsúyý$`î¦ÆRcÀ¬1kŒ$˜ÌÀ‚Iš$dð—VÌŠ‘4uëO¥û3|~W/£Ÿö£ÿ~·ÇÞÄjÍoÍÏú ]ö{ 8—­w­wI¹ cÚM‹i )¤ì $f…)5¥™¨1åVÄŠ¢ÖúÅú%‡?ÙªVy½™ó*%©æOPsvÌí˜Û1Ë«—W/¯†–š–ª–*Ht$ºÝ0Õ¦ø«çé»~òÒÿ[ýeéoœÝ’ä[§,ùyÉÏZ¼rìʧW>•ïÆO7ÆoŒKw;îvÜíj‚5Áš ô àAÁƒeV¤1Òi”¢×£×£×¥«®n¸ºA~¸s¸Sºõ·[ý·úå“|?ú~Ô¢wõ\}ÏOžT2T2´ö5iÓ–M[$m‘$_Ÿ[á5ĶƶJSCSCSCRèhèhè¨4‘˜HL$¤Õm«ÛV·emŒnŒnŒJþ“þ“þ“RÃʆ• +¥Òk¥×J¯Ië~Z7±n"Sî÷õzz®¾ë'OÊ凨• .\–”’$=ö:½‰S‰SÒÚʵ•k+¥‡H37gnÎÜ”zWõ®ê]•5v¾ë|×ù.©¼¢¼¢¼BŠwÇ»ãÝ’)3e¦Lºðü….¼­7öô\}×Ožä|ã|ã{ YÍV³äû£$i©×¸þ·ë_]ÿª4Y2Y2Y"õÅûâ}qiÒ™t&©’Š{Š{Š{¤ñðxx<,]4ÍE#ÅîÇîÇîKËv,Û¾l{Ö˜º<½´~ÆOúcûûè÷ǘ÷Ì~ë9ë9’ÞG}&|&|& õV½UoÁÙÄÙÄÙÌÖÎÖÎÖBsGsGsÄb ±8qðÄÁ¡>P¨@¯Óëô:9»ø{{¿½Ÿ$ߥõ2ú®Ÿ'weÂÛ%ö‹ö‹@ 4`ø’Ïù<‡x„F€CâPNüG8D‰͉Ǚfàw0`-X €ùÿ»òÉ9挦FS^Màìuö2ï”8¯;¯ƒÝa·Ûíà„œÚh£ œJ§Ò©v±‹]`ß³ïÙ÷Àþ½ýý8•N“Ó\püŽŸy×nÖèÂèÂSçXÎä§µ¨µ(g2cß¶o8»Ý¤XHÏ5 Eú NœxöòI¯ÞíÏðyüžÞ“ÿ)g%/u¾”sVÂg|F¬9kÀn³ÛH‚‰˜>|Å^Þ«÷ú=>ÿ©gå3{»xfïcÏæ ö?HŽƒ½™MZIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-32.2.png 644 233 144 3223 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜHIDATHÇÍ–mL•çǯç€xe B5!ºV±•ò˜¤¬_‚LÄÚ2£56“j‰L&'q­ “ÓØ’K¨g¥£SĆ*0¬P ºuMPŠ#Án†Š 9ÚÓç<ÏýÛ‡sÙöeß¼¿Üù_/ÿëŸûåºoYœlËmËmÑlÛ²Ûóìy?ûS× mÓ¶ ƒ˜wcÞˆ}?ö}óV[~+~~¾Hˆ~=Ë.‹$dXغ°UÛÄ•°=e{Šýé®éG›£í±öµïkøÄõ‰‹ƒðýÀ÷3f6@[~+ÞÊ·øæóKåÔ :´ˆ…"ð̦g6%–Æ¡psáf€»awÔ ŒI Š(µðàÁSó°åÆ[ùŸÅoÕ³êôį_/¶º·º„[Mœ);[vT?€ÞÆ{ÔSObpÆ?ëŸÅ§Í“æI BU¨ 5¬†¯±ÃØü3þ ŽˆRWƒ|Ueµeµ–À[MœÝúhë#G#ÄçÆç†ö48׿’ðjú«é Öè_ßò-¨<ÓnÚÑÕ•«rQêuõ¦zsn¥Påª\•ƒú›úJ}²³X¹•¥~nÆ›ñ耉 êH€_ÝyÅûŠ×X›;o+EDž;CãCLJžp[>¶ôßðËÉ÷\÷\üàßè?ä?ª§'ê‰z"L&O&O&ƒ^©Wê•óå(GçÅïÔ«ô*˜\}ï体ü ðÃØŠ±ÀŸMŽ&O¸¥G”&"Rÿ0à>Î4Ófúºì—’_J†Eu‹Úµ£¶½}pû LÝžº=u 3 3 3 º7º7ºrjrjrjB~k<ô<ô<ô@AKÁ@ÌocêbêP9ïdŸÈ>N™§ÍÓf:Üyp'˜ èÿ&‘¯Ë s¶s\¶‹7.ÞPÅ¿ˆÎjÏjÇ7•7•3•)‘)‘)‘°wíÞµ{×Bæ¥ÌK™—B²gÎ> µ±µ±µ±!{cococ/¬JX•°*a^|iVLV ¾S§\»]»U1t/î^ þˆ€áat{t»jeÛxÕxU(ÑÓ8ûÆìãÊ9—s–Æ-[ÃIÃIÃI0á›ðMø kE׊®TTTW/\½põBˆg¼`¼`¼îzïzïz¡»¢»¼»’2ŸÕŸÕ¡÷ƒçÏx=‰`¾ø”ï)Ÿju&æ\Ì9s<×=×á¦tÿè~¦¾|§ÿXÿ1˜1fŒV7¯n^Ý ÍZ³Ö¬Aujuju*¤ÙÓìivˆˆˆ 2›Ì&³)„8Ž8Ž8 £*£*£ âûé¹§Ôk“ë&×bµXÍ ;î ¿~±b½í×o-}k©–|)ïÊí+·%²tÉ;îˆ<û|Êó)"=)=)=)"ú2}™¾L¤>¬>¬>L¤t¤t¤tDD®É5¹&ò¸úqõãj‘¾Ô¾Ô¾T‘!çsÈ)âLp&8DœÎËÎË"þ÷üüD"Š¢ÞŽz["Ÿîq4:EøÍéÏO.½BMðŒu5·4·Ì]þâöŠÖŠV|û2veì‚–ñ–ñ–qè*é*é*<É“<üüüX¾&|M8¸î»î»îÃþÈý‘û#¡¡£¡£¡¶Ø¶Ø¶Ø ÿNþhþ(¤Ç½ÐñB¾K×ë®×©bøÔý©ŒÖú•%Å%ÅÀgf:Ê8d„Úƒâï|Ã7@ -´„öƒÿg¸q£À¸l\žÛøt(É/É·úYý£Á¾±Ê1êýk™œ½±çÆžŸøÍ¬\9(›%LÿHÿHÎk£áß…'‘Z²æÖÜ"ê§j¥Z)"Y’%Y"2$C2$bë´uÚ:EX–ˆh£ÚMí¦ˆÚ­Tƒˆ¤›qfœüK:"b#båW¶Ç2Ç2å3m}ÚÇi?Z mÞ$oRÖïÿ»óSd/²*Øù½Æã €Yl£ócp§™`˜aši`:8ûðâ¡^Ë‹Ø' 0³0Ó‘¶O·ƒ³ÁÙðP‡þ~€k>®áðC÷ÝSySyµ­¸•oÕ[x±ørâÿøE ¾1¾Q» Ï$<#Ïoz~Óâ?…öümùÃöa»²€1$’¨ò€¬o<ƶâ‘|«Þ³ð->‹?¬G ù¥ä—DøÇöéíÓÎ á‚Ûµœ-;WvT'@¨RM5‰`ˆ!ÀY}FŸ!¨zÌ·Ì·€ãê¸: úT »Œ]Ñõ)} € \ ‘Ê^RÙ e/Xo×R·ÝÜn:/@òžä=Ñ5Œg6ò«WW¾ºÔz€Pðßr›ÓAHíUÕF”Ú£ªƒg uLSÇ@õG„=D~ï˜ëÌu„Ô!=]O·‚¡.Œ‚Ô‚TKà™1K)"²ô,_:ëœu8\8¸Bl{ùÇškx¤¿¬ÖGùB‹C‹C‹a,c,c,B'B'B'b5ÒH#0Æ0ÃÀÃîàáGþG~ýüËÙÀl€-0øöàÛ@‡³ÚYˆc:¬G”&"Rݯ¯0ýg&™4WnX».c]Ìw¾¾Ux½°§°Æï߿۲¶emËW›«ÍÕ¹§sO瞆‰Þ‰Þ‰Þ˜?p't't'j—g”»ËݨMsy?åýdyÍ•¦÷@Ú4àJXè›DD®—Á3_Ì@í“›ŸÜT%¿uåøsüÇÝã¹ã¹9/s^æ<Ø¿~ÿúýëaUÓª¦UMQµGÖY{<­žVO+O|-w[î¶Ünœü|÷¤{’`d½KÌ+u u À—a=ÂÏ.¿Ë¯êÙ9rjäT(pafßÌ>ȭɽ˜{R¤.H]}é}é}é0 Ž¡yQó¢æE¾5}kúVh­j­j­ŠâLØ'ìvp'¹“ÜIPTQôFѰ5s˃-¢yƆS‡S1W½«^Õ‹:›t1é¢y _¾†^}àÐÀ!Æ»þÞy´ó(LSÆ”˼˼˼àÕ¼šWƒªåUË«–Ã Ç Ç t'w'w'?9Sg´3Ú ì»Çî5××\_ss C Cà6l:È8ÌÆÍÆùŠ«ØUlÞ²©ËÆ^c¯vK$þÓøOE®ýþÚȵI.š.ú¦è‘¶¾¶Þ¶^•§òTžH‹§ÅÓâ©X]±ºbµH±­ØVlêê깺ï꾫ûDΜ/8_ ’]˜]˜](âóú¼>¯HZgZ{Z»HÊŽ”Œ” ‘¥¿[zé}Iy¨?ÔE4m´i·„Ó‘=Öìõy}ÏxÉIÇñúãõ³dgƒoÄ7âæÒæÒæRp‹[Ü›»7woî†ì¸ì¸ì8¨­®­®­†Ý)»Sv§ÀPåPåPet›ÿÖ|²ù$üe^ùGåÅ챯ê.×]f­=†u*KKJK€Ï§e6¢íAq‡~ú>|1ke``ÄØ3Ì0ÓÆòU¾Êý+ýsýs0ÍoÍoQ¼«¿©¿ ê•¥—J/“a=‘¾ñç€sàj™œ»¹÷æÞ_èæ¿—ô,é‘|±‡> }(—´¸ïã¾—yZ†6­M‹¨_«%j‰ˆäHŽäˆÈ ¹!7Dl]¶.[—ýôÓ/bÛ`{Ñö¢ˆTŠG<"üËtšN™¥Û>gŸ“?ت7 nÏ$¸â½ï=ˆ—¸¹ô¹ôœ¿>Ùù)p8¬Žêbθb\0KÌB‘F©˜d”Q`ŠI&ÉÈdŽ9`† &ÓêÿV½Ñit¬›%Â÷dçÜ•ìØµcWÌ]ÉëϽþÜã6ٜ≠ô€QlÕ®ÚÐÐ j[q+ߪ·ð,|‹Ïâëyš_Oí{ìé|Áþ¦ù÷«ô`„IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-25.4.png 644 233 144 3135 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýOTWÆfaÀ*Æl”4)ÒŠ[ª~ Eˆñ—nÙÒ@Ú"%[w7k¨¬%»d¡¥+³/íº“Š4Ca RÞ$Xvd1Rm4ÒM×ÐM`míŒ:fî=Ÿýaæzg_þÏ/÷>ßó=Ï÷¹çå¹G€Bˆ5¡§C²!ÙĆƒz<ÖkIùKÛˆx9âåÉßBâlj<ýéÓŸª·t¬õkùáã…ÐùÃëiq±Fè˜î˜îˆ¼n„W·½º-v}ÿq Œ}ƾåTTôÚ{í‚o¿úö+€yò@ÇZ¿–¯×øÂùEãÕ¢‡¢‡"þ 1OÅ<% Eû‹ö,D.DJ(. žx™,²ˆÖÜaXëåkã5>_«§Õê”›”+.ö{ŒmÁ·:ø¤Ö^kyÀßÇ{ر¹ÀH_ ,P†OÞQÏ©ç@ºT·ê®ËÙ Ô(5øðÜ7m´ϱ_bí µ/houÐY¬«Æ6Hz#é }MCÏóyþ•—^y äVÿ5@EÙ¨Vª•øå¸ì’]ÈÇsäe™e›D¾°Ø?Ôl5¿üyà¹ÀsZØ ¥tCéMà‡ùaK)„[Ná0¶Û£`6u6ü?`ŸkÃwG¾;‚×Íïñ{ôê   p÷ÒÝKw/«ÎUçª%N‰SâÂdþ• \VƒÐ÷+ï€wï?^Y\YdÌZg­À—F›Ñ¶…'¨GÈ,!„°} o[ß¶ÂÃ5ã@ÿžÏö| u §N!ó>Éû(ï#˜ë˜ë˜ë€”å”å”eHËOËOˇôŒôŒô ˜Ž›Ž›æöGû£u\ÿ“zK½Yð(ïû¼ïµ¨š¡ž«N©NFƒzD`£BLÔ‚Ãä0ýwƒȪç“R.¦\Ô#ךk͵Â᳇Ï> f›Ùf¶A£³ÑÙèç ç ç ]€rH9¤ÒñˆsÄ9âÔ7Îþý–û–û¿¬RG;û:û€¿õ’Ms¦9Ù ®×]¯ÃÝÝ ÂÂì|û|; · ··ÂŽöí;Ú¡!±!±!2»2»2» »,»,» 6ŸÙ|fó˜uÎ:gº {S÷¦îM%Ñ’hI„ò÷ʛʛàÀ¶}Kû–Â>ä_ 6®„î„nÙ-è]3²fDæ§î,w–~ìc<²td 2Í™æL3Œ¯_;¾æÓçÓçÓa,m,m,M'Þµ~×ú]ë¡¥²¥²¥R+:Vt¬"ODžˆ<YYYû(f>f|_¼õÅ[¸a%j% ÔÂ„Š„ uZ( q9q9²¼ÉÞd¸ð÷á™á}Ê­Öqë8 † Chnjnjn‚-ý[ú·ôCëÍÖ›­7akÍÖš­5ÐÓÓö“ö“ö“peÝ•uWÖA¹ÇÜc†ò“åÇËC²e“i“ ngSðM€  +LMe·P~­í±Á7ß„‹Ó×;¯wÊ*KÙnßn¾½ƒ{»övÁv¹]n—àèpt8:àtÎéœÓ9°Ó¼Ó¼Ó çMçMçMà±ylß.¾]|î¤ÞI½“ªÏ ã¸ã}ÇûÐð£úžúž°=v¹³¿³XÑöÚ©¬ÙS³G?%  +Ãxð„ùÖã” ¿=n£Œ2 ä’Kn˜©ÈYËáÀ0¨Cê×ê×Hþø ðÈB­^Íç5Ÿ÷C§’Þaœ1Î,FÉ«3/μÊ‚>¦L®zV=x•³Ê”2ò²ZVƒ2©L*“ T*A-QKÔà(G9 j¼¯Æ¿ç]Þ zA‰UbñªuA~˜É™ÉëùØÿ8ÿjiDip/äÌÅ¡8€ûj¡ZˆÈÉ ½?‹÷?|_A~ÀB³*A­R«ð³ª\U®K!~JcKcÿ¯ó‡þ•”¼VòZØ¿’w6½³é±MöÍ4ÅÀ"€R¡Tà9&Lj t¬õkùÚxOã×êiõƒzžäÛÅ{{2o°ÿÕPs¬nìIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-42.png 644 233 144 2457 14774263775 14710 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜäIDATHÇÍ–]hTGÇgwkwó¡kÊ ‘5iÐcIQ|Œ$Q#h4~£`©X·¾(•f_6 òÔ ”ˆ4WI}£][4u!Y56t³wf~}ؽ{¯¥j—Ë9sÎÿÿ?œ3sG€Bˆ¹é¯çBçB眔íüÞò{ÖyÖ}Ýž²[%8¶8¶<ü ¼-Þ€¼¶¼6õزÍ}3Þž/„…oç3ýb®°îw‡£“?¥'-¬µœ•¹ÇP{Ô¦™|Ý¡;t¨.Õ¥º@Oé)=ò”<%OŒÊ¨Œ‚ ËÓò4è^=ªGT‹jÉà}êûÈͼ+ï¨}jÉLÅ3L2 L¥¿ð†8qà-£ŒoÌxU¯êI‚vüÞüÿó_ g8C®Õ¹[î&ú޾€X¶¹ŸiY:ßÄûä¿ò³}]|¶ï±Ïóû´X–ÇìÑšIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-33.png 644 233 144 2510 14774263775 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜýIDATHÇÍ–]LWLj.$Á•ÖhýŠ&¤‰1¸/š¨ (F„b…DÅ¢1 Z­Æ>T„ˆi &V!6Y+1¥F"¬Æb”Xƒ`ÒÔô…ªûÀƒqùZ%åcgîÜ_fggÛj}õ¾Ìœsîùÿÿsîs¯€ˆˆ¤EŸ‰óç%N·íÄÏ\r~rþâm»QABqBñ_CêùÔó3.͸d=um'îÌÏqñãù¿¤‰ëð\ó\KÈŽÚµ°uÙÖeÉØvC'¤´¦´þeBe°2pýòõË|¡‡¡‡#Ù#ÙàÚNÜ™ïä;xñøRû/~˜zkê­„~ðLóL¹ rUÙþ\… 7<Ÿò|ŠN5xñêl`”Qœ1g;ñè|'ßÁsð>‡ßÖ#ž•ž%E¥E¥);áé82÷È\À0ZFñrÚ¬6«Aÿff˜Lò½.×å,f1ð­.ÐqñKæYó,¸€×Å‹âÇø~[üsmO[’·$ãF7¨q5¤ªCê†ÎÓõA´S"½A¯×ëA—è]ú > Ä*ˆþPgé,49ªY5c€VÃÀ¤ƒå‹ñK¼ ÏBJ(%4š}ªOÅp ¸oͳæ1æ8ŒoŒ£rrrÀÌ5sÍ\WˆQdEqñSv…cãW+Ãʈá¸|¿­'*¬ñì;¾ï¸“m­ÐϧÆS÷ÃÃ÷ÂíávX—¹.s]&¤K;–v ¶åoËß–/«^V½¬‚¬Ž¬Ž¬H{–ö,픜+9Wr"m‘«‘«.yæ*s•ËçòÛz¢Â~ÿš_5¿ŠåU¨/"¾ˆÏ.8@SRSRS¬ž¹zæê™0¸wpïà^X:¼txé0ì í í A^0/˜„¡²¡²¡2˜3kά9³àÁ½÷Üs gUÃãàë —ßÖ#0ýþôûú„V†VÆ•üµ¾­o…lb“ë ŒF°¶rmåÚJðeø2|0´dhÉИ¸;qwâ.¬ñ­ñ­ñ¯××ëë…–––¸½÷ƒUiUÆñÅøm=‰"S §²Ddê©7ÄCÜ¥Ÿ~¹!7å¦ÈãW<^!Ò3Ö3Ö3&Òv¦íLÛ‘…þ…þ…~‘†ò†ò†r‘~«ßê·DZï´Þi½#2»zvõìj‘öH{¤=Ãý\{´Çåsùm=‰"ÖMëfÂs³¹961]?ÑAtxtâÑ ‘ááa‘ΦΦÎ&‘Èxd<2.Ò·½o{ßv‘ÒºÒºÒ:‘®ù]󻿋ŒìÙ?²_$µ;µ;µÛÅ“Oe¹,wù\þ¨ž·í1~RÔ&ù™â– Î[ç­ó‚¿Ãßáï€@s 9ÐìÆOOOÁßãïñ÷@ Âq+v…‹\~Q;ÕÎÿÝcoþ+Á5ÝŽ®i§6@£Ý.ôÒK/°‹]ìâ¿Ã‰G=õqxÊ1GÞùW¾¡Eœ>cµŽ2F#]túJV‡AÕ¨UV¦•ieÅS ª^Õ«zPµªVÕ‚õ‘•n¥wxÁ «ÊªbÌ>ÞÙÇÞÐùq:³êR]V…U­–f‚׼޾ÇWPcaA\Üöbí¶vc¸xþ[;ÿ;ÎJ 8Å)¼î«2UÆ$èNÝ @ àÚN<¶%¢ùÞ;ÏÊ÷övñÞÞÇÞÏìß!"23û‘IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-59-red.png 644 233 144 4305 14774263775 15625 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜzIDATXí—{LÔWÇÏï1òXº´†‡Ã âÊ.,YqM¤3Ú–5VŒ ݦ«h±­v[‰”U,ÄB!t±µdÐPXHÖ h´–l`+m5%­Yf¦Š­_3<œ~ïþ1sóHªÙìžàÜ{î9Ÿû;ß{o†ÈkÑdü²0K˜%ÌÂMù¢fuÎêœÕ¹b±(‹²(ýÒBZx§ÕjI$‘ù@°¯V³x¶žåcùƒëñË‚yùÊ©œÊù¶àù¸4±Sì;Ûîq»¸]Ü. DëˆuÄ:ð5××\_sXwsÝÍu7µ¹ks׿ú}6ÏâÙz–ågõÍCüÒ`?åC~‚Ÿà'ì ÙšS2§dN‰üZóåæËÍ—ÕHç]ç]ç]˜Æ$&1 À;ì€æûæY<[Ïò±üÁõR>|4žàGùQ~Ô~†%Ƚ”{)÷’ôGëŒÕmuà Ÿ©™ªA5@’HoHor¶”,%r¼@^ÈÙò³ò³€|@ž+ÏÔL5B€ÄÖ³|,¿Tßð„†Æµqm\‘xH<$2Í«?’ 4°×qà”ÌØ‹½€j÷MxXœpP´©j*Òª´úã%³l–Í€úº«ÄÂÉ¢ÕÆýÆýR«Ïxénènèn<ÿ`¨4T*ÕTÛ[—­ „|ø¡ý¡8>àœš;5&/M^€©-S[@ùFù&§È)œŽFG#Ì4Í4òaå–rË¿IÛ›bSðÀPixÇðŽšÊx4>q‡¸CÜ1pˆM477«Û} ¦¥6–«;º;€Û7„€÷x@ؼ°yp;ùv2ŒzF=ðôÇOç~rÿ“û ójçUÀŸß[¯¡¸á¥†—ÔíÚ— â#u<6#6#6Õ÷VÜ3Ý3€:¥NABÛóñžã=÷yÜçpþÜùsÐ;Ø;åå0S8Sy#y#²:e5|¹þËõ°ÍºÍ ÀùväÛ’ní½µW•î­¸Óq§`<Œþuõ‘ÕGVñïL¶z²=ÙÆÙPéÑÒ£öjÚ«ÐÐÝÐ æds2H³¥Ù0µtj)ˆûÄ}вªeUàGs¸.à2¹Lã'Œ'Œ€l ŒÁ4ãa|¼ïH¥éL:“Τ±0*#;Ù‰h6º;pw€ˆèzãõF"¢}‡žˆè•ÔWR‰ˆÒÈ{ ªõj=QFtF4Ñ'žO^ÞâjqH |Ê:es¶9€ûæá›‡A'"'"€‹æ¢àØ[ÇÞ€«Û®n€Á_—Ée ]Ë¿–ïߘ|ªk^×<½ 5çrÎåh/àŸ¸,.‹Ëš#a‘°HX´¯Š²¤¹³Á,§ØÖÛ’mÉþëCÍÏ(Ë(€ÌU™«¨g£ÎFÀž–=-~1ü"X¯X¯Àæ†Í çŠs@s3€é‚O >ðBúöôíà1x pOýӽÈØ—~4ý¨¢=Bœ'Ä5= (S”)ÊD$^/Š[Gµ mþÁüƒònFªT|ÿí÷ß KNNN€iÖêÔù©ó ã‡Ž¿ôXéX)äÙòlœ¾øégÒÏJÓ•ú+õþV—üksíæZeZ,Ê„²k¼~Ä8Ûœz]–.K—eoa *T$T$¨ùÚý#Y$ TÀùœó9NÑc T»Ô®×­Œ)càÌvfr±ûG÷þVŸœ8Ys²/hOh_ÅW¹Vp \—ðûæ@áŠv¾6q›¸MÏ4r­ÜIî$ÓŠògKŸå)ËS°hÚÝ­D+Ñ€ntp+CÊP ¯Z«Ö€£Æj¾zZ=í—Òhëèû£ïIáIB’ íоä{»»F ­€ ¨@4øYó(òÄ÷¨Ú¨HÆ…ñ׺µ§µÑpÌpLÒÛÞ´í¶íöTó•­ÊÖ@@Ì`À´Ï·`–ê%GÉ›…mÜøÕÆ¯äÝÚ 4)NŠ“–ƒñ;ãwÆï$⼑7r§|tÅ óW¾¿„aDázR÷¤îIÝC¤+Ñ•èJ,5íæóŒyÚU*” ¸a÷q÷ýÜòy¼À¯Åºœºœº5_{Ëõ:½N?êòú†ðàNs½!­'.Äý"Ø7„{µk; Ý´«—ô’Þ¤ÜVn+·ýZÆ0†KÄpÄpݺFÓdÅG½ü—)Ö‡ð…Ñ£„ºí®áZ¹V®5H»}–>¿v¥>©Oêó¥‡ñãÆéŽtGºCþ­¦Åv¡]h¯]¤æ“^(à¯é1æ` ~I»5†C¤·µÚZm­Üpà #­è©è©èñ_;b£Ø(6û~’Dü3¤®oœ"jlÁË>íþý—´»¼pyáòB¿v-K,K,KpÂ;¯jàŠ¸"®è™}Áeøû!u9ú/íqÚ]&T UB•=›UUUªG3=™žLtUkõ¸0.ŒWÌ!3™ÉL¾kG°…Ô £ÿÑBµ{0Ø_þo®”+åJZI+i¥ò;>‘OäŽ8âèüIÓIÓIÓD€0 pg} 7„tîÿfzí?™È$~<ýf1¯ò*¯\/×ËõÞúw|¾%¤3Ö¼mõ”ánŸu~ZIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-15.6.png 644 233 144 3174 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü1IDATHÇÍ–ýoTUÆŸ;v:0E ]¶ÃBm$¼¤PJBÅÄ 5Z¶vSXJh€hÐþ@LXa'° ‹1âKJkRuBŠ–Øb`á_ØR*´4¬Pv(¥ãí̽÷³?Ì\¦ÿÎ/'Ïù~Ïó<÷œs¿ç$I'{kŒkŒkD»–¥Æ3ggÎÎû"·˜`íŒÛñÜxn<7¥×?ªTÿ(¸¾ÿúþëû¡'Ðè €é6ݦû~¿ñœxI¼zþþË¿üÈíØÄ?ttû½Ÿy?‹¸?â¿’´å0T­¯Zv€Upóýž =`æ»3C3CØÍÿl^Ù¼2%äú£þ(LZ?iý¤õ0¥`JÁ”hmlmlm¼ßØ’ö%g—œß2ßßì?ÿë‰WŸxzXǬcV,Ï_žÖÿ~\x$iÆ^é©ÅO-–îl•$£ðÙ®²š² ÿÇñEÇÉÈìÍŒfF¥þaýÃú‡I®€+à H•£+GWŽ–vmݵu×Viò¶ÉÛ&oÓ½Ö¼®y]ó:é`çÁ®ƒ]Ò±—Í:6KÆÏÄ}÷ið§CçÇgJ³3fgHŒHøqñÕˆ¯¦éü“SŸœ* ûX’Œà‘G8úƒ<…“ 'N”â9ñœxŽÔ9Ø9Ø9(¹ ·á6¤¦Š¦Š¦ ©¬¥¬¥¬Ej?Ý~ºýtÊXwVwVw–ÔÝÑÝÑÝ!•o*¯-¯•®]¾î¹î‘gʼڼZ#(].º,¹ÈÚµ{Z‘KYi•i•LÖ¹ô·Óß–T#Iº‘v-}lúX)CF†!ÅZb-±Éßêoõ·JÁŠ`E°B:<òðÈÃ#¥œµ9ksÖJ ¥ ¥ ¥)cÑ1Ñ1Ñ1Ò´´iiÓÒ¤K».Õ_ª—zê5{MéãÖºÇë× é‘7yS²|Z¤ELv k¯µ×8§X¬4V*’$e;Äwï~}÷kÉ=Ý=Ý=]j«n«n«––ÞXzcé i{Éö’í%Rxnxnx®”w2ïdÞI)´*´*´Jjü©ñ§¤p}¸>\/ÏÛ‚mRWû•}WöIcÿ2®k\—²¥;Mwš$cŸ]eWç’å÷+9j 5°_LžÙÀ°€‚…' O¦óÆÍ7oÜ EéEéEé°3kgÖÎ,è[Ý·ºo5”—–—–—B_n_n_.ìðíðíðÁŒ¶ßÍø>ñÔí¬ÛÉ@‚Í~‘‡jCµ@}ÂOÒØ–ÃPõZÕkެUñH‡ßÑsô~ä×Åû{0_°ÿ÷™hç?@IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-26.6.png 644 233 144 3254 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜaIDATHÇÍ–ÿOTWÆß­3£C•8kÒ¬ßR¢‹¡h(ÔF¢­¸]»Z!1`jt'©ÙÄju£ÝD­i\¡»í:4JK¡4´Z´m·ˆ] bmpD¦daA¾Ã°ŽóåÞûÙf.3Ùîàùåä}Ïû>ÏsÏÉ}ΑE‘YÀ¸Ì¸Ìød86î‹æÍ[Í[jÂq¹†— /wþººâ?ˆÿ@uGc}]¯í‰âÇòéyY$Ñ„é3Óg†ìH| vÙwÙÍ¿Ç%7ÀÒ`iøOö±ÿ €úÊúJÀàwƒßLdOdC4Ö×õz½_NjŗSÿÃ/O|ùÄ—†‚ižiž¬xaÅ Oÿ>\ày/9^èŸÓ?G3€2X±jÙ€/ú‰õõH½Þ¯ãéø:ŸÎÖ#`˲e‰P–7™7i©7¸«¹p¸òp%hׂ ¼I9åXAE€*Ũñkmêõ ð'í¬v@ëÔ:GJ¾’B¡  †‹\Ä:‹÷çÃï~_讦Õ7»ShEZ‘VÌÇŒ9šçu8ÐÔFå=å=‚À8ã ½ÁjÇ3;žÑ¾³%æ(EDÿÊ5ËG–¼sÁ³Ê³ ‚¯ðë‘„¡SC§xtÏÏEù‚÷‚÷‚÷`äÐÈ¡‘C´íA{Œ jª©Ž†¡_†^ ½#¯ý0ôƒkÂøàIõ¤_éüa=¢eˆˆ” ¯¿V Ó>5õ7ŸçTåTÁ§>»ðY´ _m¸²á L×M×M×ÁÞé½Ó{§aAò‚äɰñØÆcÁxÖxÖx?E=EE`Ýg=i=‰¶ñÄó‡ž?ã»Ô6µMM…övPÿÖcTDDÒEòNçùüÌ•Ü+¹†užýžÅžÅ˜œê˜êƒµÀºÇºG$?5?5?UävÇíŽÛ"7ûnöÝìIŒOŒOŒé:Ùu²ë¤ÌŽæÌæÌæL‘–Þ––‘¶ßµeµe‰!Ñ´¦iM“îÞè^Ù½Ò°Ndë¼­óDx2¬Ç8×××»6CdíöµÛErÚ66 k¿>v}LLÍß7ßj¾%2™9™9™)²Ì¹Ì¹Ì)Ò×Û×Û×+âht4:E}ƒ¾AŸˆ½Ò^i¯Œ [<¶xl±È°gØ3ìq;\—Èàý¦&1¥$¸\† ‘Œû÷EŒÄÕÇÕ¯Íê}½èkõ¿Í͈þö°™92)í)í)íÐ}¡ûB÷¨ZZµ´j)¤ § § Gjý¦õ›Öo‚K‰¥ÄÍ—Ö”Ö”Ö@zizizilýsIÏ%Á_6»]Œç9¡@œ)ΤÞ1ª?†N‡NîHýüÁùƒ"—¼ê¹êÛÙG%q%q"……ý…ý"w[ï¶Þm™“8'qN¢ÈÔñ©ãSÇE.½tôÒQ‘!mHÒDlf›Ùf©íªíªíY}põÁÕEFëFëFëD*º+Ün‘žþ¦þ&‘9+VˆMÄwÕwUÄФ95§áŽ(ED¾? —÷\ÞMwÚ?nÿXÛ»5³³ÿ6ï¶Û@JqJqJ1´ø[ü-~h˜i˜i˜´¤´¤´$¨öUûª}0‘;‘;‘ ŽóŽóŽó0¹drÉ䨵ÖZk­îN¿•~ >4]üôâ§ø#f³—ªO\Ÿ¸€º°žˆ]” Îg޾Ñj*(ÍJ3ðˆ!†ÐfÏ €2Ê(‹ùíܸqG8‘˜ür–³(ãQ»Ñp+6ż©ó9ßr¾Âz„úˆaé±ôxçjïY׳”3aŸQÜoÀËCå¬Òª´‚öí†vÔ-êu (JRªCu¨ B AWãÕx ŒwyÔDu·º”}Š@Õôˆ]ëYÕ³ Àò“å'ï\þñ±Ÿ9`§a§‹8ó¤rM¹Œ«¹j.A‘/† Aà>bn4TT`ŠQF#• úªú*A)ß(ßÌÚôMØiÞiþ¿Î¹+Ù^°½ æ®ä¥o,hÞæm¬ò†¼Êne7~ï `ÀÑX_×ëõ~OÇ×ùtþ°žÇùuñؾÇÏì{ж:±^IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-27.8.png 644 233 144 3160 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü%IDATHÇÍ–ýOTWÇV&0 R+¡eÀnPj™f©!ÀÖHWª"/£µi­TÝÆêÖMh—`vUq…Õ¸Õˆ´+µÛÐ1À¬•4 4ht“®o!C‰n5(ÌÍÀÀ0÷ÜóÙf.îûøüró¼}¿ß{î¹Ï9„BćžLɦdÓ’ oúm8½.zõïAÿ´„ˆÒˆÒ[„¸“q'ššô»aßÈõ û…ã/ä3â"^„‹‹kB~5¼ùvfô/‚þ_úÀÜnnŸÖàCç‡N€¶æ¶f>‚ÑïG¿˜X3±¾‘7ê~o!¾¨þ~!`ÑÅE#îÁâç?'¤¼™òfêï‚é°iæ "D*Èq –XµðâÅ0÷ßȇê~ÏÀ7ø þ ‰o$¾!õœœæÆ`ÃÝs|^Ñ\Ñ ê2@ Ïh£X:µÚ P·µ×´×ð+¯þ­þ-¨!}H*Õjµ@~,?ÆÚ¸6Ôó_«úCx-­­†À»ç8[ì/ö› =â¿¿íÑ^¶çÙó@eÔ½\/' n+§r¢æ×hš)¦Û,3Ì,ð—ª5ƒRÉRJIðáeáÿʾÁ>¿‚G |J!„øågt›[Ì-Þ(NN‡ÀÖÝ{”û(Ÿö/Mjïì;Œïß;¾Ü'Ý'Ý'aâáÄɇ0[;[;[ËS6×7÷dî Œm=?zŸ–ćáÈáH ÏÜjnõFzL¬Bˆ½Yâ7;ÆvŒY4ïlš+Í¥²ÊÞ}ëÜ[çD§µ,=>=^˜KËK3K3…h]ÔÛ+D†ÈBˆÜöÜöÜv!’z’z’z„8“z&õLª˜7Ï>Ï>Ï>!ìYveWB¬ºe;a;!Ì[¢Š^*zItÎþ:M¦I•%ò?xôÁ#‹Æþí!„øgt[º-Ðü§ /lT;_N´vZ;ñoœs%çJÎ8¬Öká•è=Ý{º÷4¤XS¬)V¸¿çþžû{Âù޳g;ÎBZGZGZÜÜv³ìfXÿúbÖ‹Yø»>º–s-G턋΋NKƒzÉ–ˈrÀøûãïÃãµEEð`ø§–ŸZàÒáK5—j`yÂò„å Ð{¤÷Hï‘0ñ¶¼myÛòàø¡ã‡Ž Çõ}FŸ·Ãíp;`EáŠÂ…w0î@ܰ•f%e%ÁØô¤šTãwÆï€:jÙhÙ¨‚¶øËñ—õ;”¹_w¿þí+ÍŸN}:¶j[µ­úcúcúcÂÄ7l7l7l`ÝnÝnÝ“5“5“5@%•T†ëN¹N¹N¹ Wþ®ü]áø«;VmXµN|ÙßÔ™`I±¤èw„Ü““¯àKö%Ã?~èru¹Âÿê±{ÇFŽ@‹©ÅÔbw‰»Ä]UuUuUuP¶²leÙÊ0¡gÄ3âƃBÓ­¦[M· õZêµÔkàÐÒ!á…Ìç§žŸG¼s©s)€ïªï*ÈS1[b¶(‡¿7öØ…ò åÐygð«Á¯ÔÎu[×ú×úñ¯·¬\ ™ƒ™ƒ™ƒ0P0P0Pµ‰µ‰µ‰à4;ÍNsXØXõXõX5÷÷÷'Û“íɆ†Ê†Ê†JÈŽÍ6e›àoZÙ†3ÆV;ùá뾯û€/=<Ë®ÀîÂÝ…ó;äU]² €I&Ì-=8׿í:×¹Œ2ÊèÓc‚:ꨆ¸Ííù¨âgùŠ|øÆàÛ]µ» Ѓzm¡9†Ùevy£T¿Ëæ²üspÎÈ¡¹é¹i|r¿üN~J*ŸòþX¬?eWve_ ¤žzêA_¢/Ñ—ÛÙÊVW¥”äæÎÏǧ/ ͱo\é®tóæ½Qü;¨çéÉ?·9bsà MæIÙ-»'z‘^D-ôÆÓL0ø™ev0‰~ÆBk­@ß¡ï €_öÈ£80›£7GÿßÉ:+)y§äg%Ÿ,ûdÙ<@;PC ± y5/€|O¾‡TŸê ‚ûFÞ¨7ú <ßà3øçÏÊgövñÌÞÇžÍì$¤4ÄÁŒ*êIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-30.3.png 644 233 144 3176 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü3IDATHÇÍ–íOTgÆï™ÔQ– ÖLÒ UCˆ²˜ªÓTZ¬»} ¤QSé]ÝmH,ګҵĪƖT:qX»vÅ’@‡¡®`Ý"&uÓeL-‰MØAt‡%ÌË9Ïo?Ìfv»€Ï—“ûå¹îëœûÜ×óˆˆÈÂøS eYʲ”ù1;å7 ¿ù%óK?ÿKÌ>«i‹iË?À‚|`m±¶èw¶7ò“÷‹$ð“ë~Y( GF[F›icÜ~^/|½Ðü³˜Ýx,–ŽGa·{· ý|ûyöÃXßX€£#$l#näû ¼d|y÷ê‹@Úi_˜îCFzFºØÊleOÿ>–0ü4¼öòk/Œ¦Ž¦ªÐÆL2ÕF HcM$ÙF<žoì7ð |£žQ?ÆG ûùìçEøÈ1嘲¸bî^àÌ| êœå,™ ™4ÐÎRÿÔÏèg·êTêõ Ò¶j[ AÔõ8q’9‡÷çmÚ ‚w/ð'GȲ¸ >òß½}ÿEò*VW¬õK€ÈWÀüjÖÂD”G5©&”Z¨žTOÎ})TªJU©ÀNv°#áç 5¦ÆPj“ž¯ç¦™•Ç¥¢¦¢Æ øþ‹I­Yq†¿Y>µ|œÈ—Aä¿/yàzàb&úJôè;‰z!_ÈòÁ¤mÒ6iU¨ Ua¡VZiM˜‘ãOÄã¥Î?8ÏLô1| ›–vK{pžÁG”IDäì Ø§íÓ`ê0?ò£¾ºdýsÏ€u¹µÔZŠª8TQ[Q ÑÊhe´v×î®Ý] f¿ÙoöÃöÞí½Û{ùÉš*Ÿ*Ÿ*‡’_””€õk»µUÑìht4Bø#}5ì ì €êŠñ‘h™ˆÈ?@÷£îGp>¥s s@ÕØç?ë~ÖMhÂ71<1 +o­¼µòÔí¨ÛQ·ÖÞ\{síMs¹Æ\<ÿxþqp׺kݵ b-é-é-é`_l_l_ þÿ„ò¬9]9]„näÜñÝñ©ð(­1ÆGÌwÏw«6¶ø| À ëÑ›Þ{½ÛÞ Ës–ç,Ïú½õ{ë÷¦ªMU›ªù¥žRO©N;O;O;~}³¾Yß Á«Á«Á«°áwöoØ‹¾³º¬.o ´Z&ìvP YeYeª-…OLS¦) ¤#ë…¬Dîhßïû~ŸLzg¼¹Þ\‘ÎNo§WdÉÁ%—é©î©î©1—›ËÍå2·"ÑH41×™ëÌu ¿wwwˆwÐ;èé¼×9Ò9"’{$÷Bî‘¿~r9íršLŠ,:¼è°ˆº*f1S¢>×vi»Lߊ¤u¥u‰ÜþÕmßmŸdo›Úöõ¶¯Eúºú<}‘Ñ+£WF¯ˆ8šMŽ&‘‘U#«FV‰É9’s$GdòáäÃɇ"EýEýEý"—Ž^:zé¨ÈµékÓצEvžÜyrçI‘Oܰܰˆøë/ó—‰,^xhá!É Í„fD¤Ze©,Ó·B¼§ô\üìâgsÃ_óž¹¾­¾ÐšÈšÀšœ«:Wu.©u­¶V[« ìýö~{?tßï¾ß}‚@8‡ÃãKÇ—Ž/…žž(þWñPñ¸&§œ§õh½Ø|±¸dücS¹§fO p9>%J{K{+!S„™eÔ€P€ž¤ñsâÄ RH²ltÐA ˆIÂûNËÖ²SÆTî9¶çŽO%ƒqÃ2h ΣyhýÐzÐÆtF{/컙їè¯ê¯·é£ô"½H/­X+ÖŠAïÕ{õ^À… èyzžž<ƒ hh}Zhõáîp73zn\Ç®­Z`¹g¹œ‡/®c?Q~*Í•f@Å•yVëÕzô]ú®¹wVÿaBFCâ0Á„ƒBéoèoaVûRûrNv¿‚ʌʌÿ«üñ³’ò­å[“ÎJÞ~êí§æ:€È„h0ЪµjB ®«ë˜0AÂ6âF¾±ßÀ3ðzFý¹³ò±½]<¶÷±ÇóûDÂ`3=wIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-76.png 644 233 144 2507 14774263775 14713 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜüIDATHÇÍ–mH”YÇÏŒ¦N˜9ÐB[ŠÖB½°%…dÆJlE%D¸ ûa2*?H(·bËÝV¤­p\5K!E{¶…¥Ð2$’Ýl«%?4 á¤Õ´ù2ÏsŸß~˜yæyjqûÚý2sιçÿÿß{Ÿ{Αôد€3Ó™éL‹ÚÎRËŸ²)eÓmQÛ§ƒ£ÈQôG5Ì>=û4€»Éݤ†,ÛŒ›óíù"¾ÏôKºXŽäŽäGAÌ>»–ïZžòYÔþ©\Ý®î4Ø{yïe€®–®¾ƒ`_°`¬`¬,ÛŒ›óÍ|ÏŽ/G>à×g\w CrRr’df.,‹Nxº¶mÙ¶àyÂóà úJªQ„ cŽÍ6ã±ùf¾‰gâ›|&TÀœ s6ˆÀŽâÅ®_¢ CçÑ*æWÌ7ù"Ý´RA©Æ_‘ÑÈ(a­P+dÒøSÕ«zàGã„q¸iTU`ôj™Z&“ü UiUøð‘Šã"£"Ã8tÞâê‘÷϶ö+Ø™²3%.è.è7ôªKu‰ "¼ä%Ö¨¤’JPWÔ%uÉrß5F iz¹^Nô }7ñM>“_ì‚r~WÐ 'Âcý±\`3]F料ž:4uF.\¹¡ÚPm¨ÆîÝ»&L<Ý¥»tŒ¬Y7²"Ë#‹"‹l ø]ÍSóx³6ÇùâüQ=1a¾^ØçÝç5³Õ—úÍÉŽÉkáþïý^¿Ò‹Ó‹Ó‹!'3'3'¡ádÃɆ“PÖVÖVÖ® W†+ÖW®¯\_ £Í£gGÏZxÆ`änä®ÅgñGõ8£û¶æŠHþÁüƒ±mǪ=±3±S¦LÇÆ_7ÞÚxK$P( ”Šøò}ù¾|‘%o–¼YòF$!HˆøÝ~·ß-Ò¿¬Yÿ2‘wŽ;Ç-òèóGÙ²%NÀ°ÔI‰ïXõ>ÿš+i·ÓnÌ æÚ¶£Ïèþæ)OASçÔ9+Z² dAÉh9Þr¼å8øçúçú炳ÔYê,…ìÝÙ»³wÃÖý[÷oÝaoØöÚàEÝS÷ì|&T€{–{–z¡@(`»öš4‚ ÆÕ¸·Òž <xYYY–¿ñTã©ÆS°º}uûêvË¿6mþÚ|¨ë¯ë¯ë·üz¶T[j/3&TSD]UWE´íÚöøVÏ‘D–a¾¡˜â¸_ÚBm¡¶Hnynyn¹å_á[á[áy1þbüŸHSCSCSƒHàIàIà‰HVFVFV†Ø€ä¨µñÅùcz¢ÛÀAhÝþ:~Œ4½QodRu« ꂵÒêšêšê¸Öw­ïZÿ­žVO«ò’ò’ò’ yfóÌæ™¶ Mœá У{t“q¾8TÏ´·´°fUtÅ8¶#¥—^zmöb³¨§žz›ˆ!†/‡9lÃÓµWÚ«éoåôu̬3oU‘*Š×ÔUÕ©:ÁðÃc¿+ ÒTšJý€~@?*O­T+ßPeªŒwÑðÑ:ö¿•ÿŽ~@íQ{ˆð6&c’·±ÿ…&Þë¡(ò±ðLüi+ÿ4½2ÞË ÚÛ8Æ1R­#ÖKô&Áè1zpàË6ãñO"–oâ}´W~²¯‹Oö=öi¾`ÿ€S!¸|VÓvIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-26.9.png 644 233 144 3266 14774263776 15061 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜkIDATHÇÍ–ýOTgÇÏ TD(² iZRE¨–Ø(–#¶+L*µD!Ûf#6›ÑM\cŒ+4&ÚD‚´ fÃ Š¶òbUhié²­±Q˜²[h Êë0,0/÷ÞÏþ0söåðþró=Ï9ßó½ÏÉý>€ˆˆ˜}ocŒ1Ƹ܋{ýñà­Á[c¯xq…†· o?ú#„}ö!@xuxµÚãÇúºž¿¸^ÄÏ¿¸Ÿ³øAuAu† >;w$ÿ‹ËÛÁÔ`jø—öÝØw þRý%~Ã_ 0™1™~¬¯ëùz½Î·˜_ŽýWxá“>1ü‚–-—¶¼´å•ýÞÛ+ýVö[?ü @B Õ2ôglÖ×}ùz½Î§óëýôþ^=‘¯G¾.¹œ©œ)S•· §–ÊÒK¥—@»ànàT Š(Ô(FňSûJ=©žþ¬ÒNh´GÀ¼’¯äãϤg8K%•„jóñÝ(m*mÒöÔòWK€%ÀT¥ë‘ÿœí™¬ÎÝ”» ´xwàÄ ÚEõ¨z·–­%h hê„:§Î-ìÚ.m—¶ XB þ8ÁÚÏÚÏhZ„âP¸õU>þ¹ûs÷ë?È\4J‘¸3´˜>6}ìÛ«¶WÁýoŽÆŽ9Ƭ»Ä}Ö}ÖßÏÝçîs÷ÁèÁу£ÁèNt'.dÅŠÕ]î`w0Œµ<‹zŬÚçå‡þý'€S‡©Ã¨ë-MD¤âsx¯ì½2˜žP×ýúzVMV „ý2,5,mcëÆ[oÁôµékÓ× hºhºh–&,MXšéÖtkºÆÏŸ?ïd¿h¿h¿Y²ÕµÕ!wBzBzÐ ŽäÈ;ô{ûAIkI+°Ü«Ç¨þ$"ò«F‘œã9ÇE®Ÿ¼µýÖvC²mŸíEÛ‹â²Û»ì]b-ݺ[$]þºüu"ºt=èéìì‰ y¼çñžÇ{dá©}Xû°ö¡Èt¡£ÈQ$2›9»fvžèé×_>k-n-6$‹XÚ-í"Êy¯c qÙÀ²õi"ë-ë-"Y_m4l4ª>ë¼?~\‚š¾mú¦é‘©MS›¦6‰Ä”ĔĔˆ   ˆd7f7f7Š Ï Ï Ï‰¬X±6Â/l¥u¥u¥Uä©ù©ù©Yäê¡«¥WKE~P†^zY‚& -Zn¨ɨʨ‘wBî†Ü]Ÿ&Ô›ï˜ï¨Ýüf,m,ÍÿÛÿÁôþÌû3Ô™Ô™Ô ½•½•½•P]] )ÏRž¥<ólÃæ ›7l†ÓQ§£NGùã3Í3Í3Íp´êhÕÑ*Ø9´shç„w˜¯›¯CuçåÔË©ŒºEÝÊ’e‘Ë"Õî@õ;ÏqÏqCw@}ÈpȰÄßü®ÙÖl“ÈSóå«ÊW‰”ÿT^W^'ò¤íIÛ“6‘€¸€¸€8ûaûaûa‘ ".DˆŒh#Úˆ&b¾m¾m¾-RW\W\W,<<<&ÒÜÒÜÒÜ"²7n諾«Dþþ§®¬®,‘ô²tsºY"¥ÃžgÏ1®à#>2t‹ò{‘oKáæî›»áÓîÎË—µ¢­ùo8ßpâÜæØötÛSH*K*K*ƒ{Î{Î{Nh˜i˜i˜”ø”ø”x¨««ƒÉ¤É¤É$ÈIÈIÈI€‰‰‰8c9c9cäÌä×’_ƒOsggqú̦H«¿R}¥ø‡WÏ.*>‡’¬’,}ê:Pš”&`žFÐfK,±À9Îqn‘=ôÐCp„#Yo§và¾ç{¿íQí±yl@âÂ_YQRL{õõ>ÃÔoêwj_ô'÷'ƒrÒë3JËár0«œRÚ”6оÖÚµvP3ÕL5”¥@)5[ÍV³B )u…ºB]ü–"Š@q©«ÕÕ ¬qY]VfÕƒ >–ÚŸ xL}¦>G ó>ûçwåò À¸Ï™§”¥˜P·«Ûqãò}1¸qó̱è@CEìŒ1æË M}W}7Nå®rwÁ¦; /(/èÿ:¿ï¬ÄR`)XtVr(úPôAp‚„‚Çáq(…J!Nðî `À~¬¯ëùz½Î§óëýôþ gås{»xnïcÏç ößdyÐÎqì IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-75.png 644 233 144 2540 14774263775 14707 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]HTiÇŸ3Z:‹µÚfÐÂl9AøÁš‹QB4P .}mk°tÕÜya( »^X,ݸV®ENQ{Q”ÛJ²¢ÈЦeÆ’ ¡VŽc£Í9ïùíÅÌ™sjkw/{oÎyžç}þÿÿ{ž÷}Î+ ""éñ§€k¹k¹k~Ìv}kûS7§nþòBÌ>c€Vª•ö‡ÏO~ £1£Q ض·æ;óEl|'Ÿå—t±)-)-ZIÜ®‚]9»rR3cöíà¸Ó:¼vð@ë¹Ös|ÁŽ`À«’W%`ÛVÜšoå[xN|©z_æÜœsS{ )sSæŠ@Ö¦¬MžÃ± =°Õ·Õð,éY’éc H#Í,¦˜ÂãÛŠÇç[ùž…oñYü1= 7,Ü Û˶—¹Ž% ü‚î_ê_jñE4áÇOš9}} fHߨodÖVgÕYà;³Â¬æ«^Õ æ_z‘^Ĭ9}} <ˆå'ð ?Ηàé‘wkûãFØ‘º#5!èw0n·T«j%˜@ˆö˜a†@GG‡÷¾¤iç[x¾ÅgñÇôh±—Uõ"î ;øÇ‘ÞE½‹æéÒ–”$>ñ W¢[ôN½S> U„Ö„Öˆh½ÚCí¡Hò¥äKÉ—DRv§ìNÙ-bŒ€‰”FJ#¥"®°kÂ5!²à§<Išv½u½•ˆôh½Z¯ì”¯©GJÚDòÇòÇÂsDf–Ì,ùº.þ¥Îü••ÖJT¾ñëlËl‹½â¶ê¶Ê¶JH/K/K/ïQïQïQp_u_u_…šúšúšzȽœ{9÷2x ½…ÞBÈÍÏÍÏ͇þ/úÓúÓl<~ûüís›Ïæé‰ ë>'/N&òösÓØiìd6Q©µ3kgÖÂôíéÛÓ·á^ß½¾{}]œ]œ] Ç:Žuï)ï)ï)¨Î¬Î¬Î„¡Î¡Î¡NGÉwâÃLõF½…oî·ùczæß×l`A°À€ÙavÃ<æ1¨óê¼:oGËCå¡ò4 6 6 B·¯Û×íßã÷øa]x]x]VT­¨ZQO Ÿ>)t NºL@ƼŒyªÆGÇGÇ^7ƒfTDETÄNïééÏbÏbÏbˆœˆœˆœ€áÚáÚáZh¶Ûƒöüõ™ë3×gB]V]V]–í7JôÕújg›±øcz\"꺺®õ‹èÛômb…’,Oå©ßPFYÂ/Æ/Œ_É[™·2o¥ˆ»Ò]é®é)é)é)Ù«íÕöj"“““"/ò^ä½ÈÉÉɱq4´amØÁ—àëùèÓ£YPͪÙ^éñ“ÇO? 7jnÔܨq”fÔ5G¡¶µ¶µ¶ŠÒ‹Ò‹Ò¡ÙÓìiö8*¶MlºŒÃÆáÝc>• OéÎ>¤ˆà()]tÑ `0xwóÜáw€­lf³/ªOèÿy*WÕƒ;èN%Ã1do!¬JU)o×ÕuÌ=æsC@M4Ñ`4 `ø ¿áU¬ Tð'&&€:¤ñ&.~‹ÍgñÇûêÿèü÷ûê€:@”p|ų„ãïï…fþÑù÷©}Dm< ÿÃÿãÿJüËüË †ÒìåF9³`¶›íhh`ÛV<±%âùž…ÿÑå'{»ødïcŸæ öo’µ@޲ÿIcIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.1.png 644 233 144 3133 14774263776 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–íOÔWÇÏ ´2 cÑ€·¦IÝTŒL‚KHdiyXy°E]\iHq_l7Ý,E7îú Ñ]ê†-Y“RšÍšfmXvHÉFbê.Ø2RY)VFPø=ÜϾ~ÌØîà}3sÎ=çû=÷ÜûûÞ+ ""1«¿ö­ö­öõAÛþË?*'*'áã }ÉÛë¶×ÿõx¾þùz€ ͱmÍ[ñáù"!üp>Ë/1r¬»¶îš-sÕ®‚#;쌊 Úµàhw´/êðöõ·¯´5µ5ñ+˜š˜ËœË„mÍ[ñV¾…Ž/Ußãg:Ÿé´Mºg×=+/¾öâk/ý:à} ˜Š˜ŠPv0|@4Ñ*À³a¶5¿oå[x¾ÅgñëˆÝ»_„‹Eþ"¿ãÃ`ÂX MM ú´v~Ï%. †œ×gô–Õ?ÍZ³hT©ÔmuУ„et}NŸ ¢Ù·Š÷· O…Ç*p¬…¿´´;>´ê‘'÷öýWÙ^œQœêeÍ,²Êm~`~€fþÇì7ûQꬪUµkBmR›Ô&à§d’É÷‡R'õ¯ô¯ÐÔ¸1iLZnÍÃb±YlZ¾ÿjØVŠˆüø/t;šÍHð&y“@; ÀÏ|/{þÛó,i™Ú;Ú;!&-[ËÖ²Á—åËòe^£×è5a¥ 3Ì00Ì!÷¢?P(`Iâƒ×áu#Ž.GW ÒªÇNšˆÈ».É~ë»·¾sêljã‰ãÊõÆ/òZòZ¤+q÷ö‡ÛŠ#‡œ‘œ‘‰Ë—'.‹äEäEäEˆl‹Û·-N¤ÄYâ,qŠhµ‹ÚEI•TIQ7”GyDüöŸóŸÉnÌ-Í-Gï_ÝåîréI|”øH¹ÔoE‹rêÁv½ëýG""#ÐíìvBÓw¾;_•oMèJèbÙZi~n~n~.¤ ¥ ¥ Aa|a|a<̦ΦΦ–Í[6oÙ “““¡ŠÅbH;™v2ídèàô~âÿÄoá«rCo™m™µ¶t¤BØêœpN¨kà{Ó÷&ÌdÍÌÀ”÷^ó½fèù]Ï©žSTTT ždO²'TŸêS}>–>–>ýýýàK÷¥ûÒC…õF½QÆ^c¯±ö8÷Dï‰†Ž¸6o›7,n~*q*`}ßú>uMh‹éé5Gy#¸rë³?å¨\¨\—Ëår¹àfüÍø›ñp7ânÄݼ?xð>ø3üþ ØqxÇᇡ©µ©µ©5D¨WéUzUÈÞwzßé}§¡ãHûþöý!>ceæ›™o6878ÍQ»ù¥^­WÛF¥í¹éç¦EÜ_~æýÌ+±|\ë¬uŠÝutçÑ"¾d_²/YäJä•È+‘"ÇK—/éïìïì0aþ‚ˆ=ÑžhOiLiLiL™•µ±Ò¹â^q‹÷ôÏõÏ×ܱòo=AO1ݦÛ6*Æo¬3æ.s—A×è­_´ªòœŸg-g-³œ×“w=ï:캵ëÖ®[Ð{¶÷lïY¨k¨k¨kWš+Í•W½W½W½AýŸË„¢ù¢ù¢y˜^˜^˜^u¬ò'•)•)0|ÀóÀó tÆÌÇ­3­3ág,x— ‰Ü¹Vº™ƧƧøñ£~¨L¨'¼w¸Ã Ž:êÂüË¡O z@„ó8sâŒUØ¥A¡mUÇpŒ;Æ‘ê㯌¿ƹ Î·WæVæX2š¯¯AQEªŒ£Ãè£Ò¨4*Át™.Ó”QF˜1fŒü‰jªCuš¥ZÖÃ’ò[:6¾{|7°èð:¼!û¡ò¯²²ÿ]Uf¿Ñmt̳ ÍZñêÿG,±ôD'ƒzÈ,³€iÅ›åf9‹Æ ãq4Š:õ•õ®ä`ÉÁ’°»’÷^xï…5oj¨!:´Æ1ãË TPÙmØ d[ók[¶šoáYøŸÅ¿vW>µ¯‹§ö=öt¾`ÿþ^+4£š?IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-51-red.png 644 233 144 4205 14774263775 15614 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü:IDATXí—mLTgÇÏsï¥"‚À¤  ÃªÅ—UTW»3ˆØ,1 j*6L}Éúa}+¶¶îF‰Œ«¤­¥1Uc 2jSTñ-Ĩ]Úº iu™¡È6*È÷Þ翘çÎK¬f³{¾Ìœçåœß=çŸg†hÂâ(Ä$Ë$ç$ç$'öD¿ÔðRÃK ùYЦhŠÖöePeÓ¼’RH>êóJ±^ìñDüÐ|’%”'˜o;m§íR}è|Â<¥AiPêûضƒí0@bM¦Ó.­z°êÁªÀêG«­~[‹­ÅÖ€/æÅz±_ÄñE¾çóôÇPÖ'Ò 4( vfˆ MwLwLwhï»uìÖ±[<ÊóÄóÄó€ 2¼Â†t¢€áûçÅz±_ÄñCóÍúäù|dŽ‘º¥n©»ó²`½a½a½¡.q»|.\ðOãfn†ªíUßWß´…êLu& ÙµùÚ|@[¨-Õ–Ú^í#í#€§ñ4žUìw»Æ]ãp‰øpH~sŒÆêY=«'R(”µß‰ ¶JÛg¶ÏT»öZÐZ‹ÝØ ðNÿÄBM‡-È×øà<'j-¿ð÷x!/„G,³UÚªlUª]ä<‚"º"º"ºþô±À\n.7—ó÷¯îóîóxêãÑŽtŽtÀÀáÃ<Ã3†gÀPëP+ /^ ü:¿ü$? | ßÀ3’5’}Ëû–ÚAnçFàqÿêîq÷à©È/x >e«²UÙz瀘8Zz´ôh)ÿ³?€W­±.Æ]Œà›XÈ]r0ñz@ä½È{ÐE]„g؇s>œÀWÐTÐUë}^Ÿ×p½"¿QÙ>⽦TSª)•}ù}y}yÀ‡ù0T$‹g>Ñx¢¾Nø®~sõhJkJ€sýçú@oÔà~õýjXz{éíàz#ë,Àhz²¶F[àîËïËïËà“ü¤'-‹Ãâ Ý¦fÓUÓUÑݪUµ’BmþS[¶>$"Šk‰k!"úiô§Q"¢Þ¨Þ("¢ÂªÂ*""©H*""R¯©×ˆˆ2â3≈’\I."¢q븕ˆ¦úã¶±oÙ·Dº[¿¦_#ÅÔlj65Óˆà|þOœ/n+n+n3žLÓ–ÅÅ·®huÑêàÊäÞȽQ7£nÀ+鯤@ÿ–þ-Ïj}·À »Å4<¨ÏÕçÚ_µ·µ·ù‹/*^dœÛçEëK²ª³ª³ªÑ1ÊFÙ(pŽWòJpl­¿›t7 Ziý%ÀõŽëà85óÔÌgæ·æ·€¥ÊRÀçnÓI'€§ó.V[ã­ñÖxt>’ì’]²÷ˆ«îÄöã£ÇGâÖ"‡]Ã.¨]X»€ïÑÁGƒç ζ„-€êÊêÊg®¸µâÕc ŒjgÇ~û9¯åPË¡–CF%·°t–ÎÒÇ{H^,/–ï©oYò s­¹V›å^ãžéTÆÃsS7§n€´¢´"¼)º)v]Øu¦ôL逶Mm›žÙz­@àµ$[’Šq}¾>/¼.¯ HÝ“º'un\r‚œ '|þ”¢ó¢ó¢óˆ”ëÊuåz]·qàçîÏݯí4•ýøÃ?Àgfff&¯huÊì”ÙÐðjëÁ`j¶šäzÞ<òæOWt¬èôÏ ÐjÇ=ÇWޝt¯¸YÞ,oþçÚ roØ:ýÓˆôˆôˆôÎãbCÙÞ²¤²$žk¤Wªð¼îy€gÌ6f ä]¼ ð‚´ˆÁÇ­´ÏÔg ´úôàéK§/¡Ð¸B+¤ ©b4Ÿ%±$–4ÿX üãJ]ÏÖ³õËkX;ÍN ­èq6;_v¾ §¡Ýzœ>q*\ÄE>ý¡þà†;¸VС<—oâIxºëºkºk€äÈä)ÉSÔ­F%÷Éûä}e6ÍNv²+ækåPŽ²ê©žê‰ä^¹Wî}÷¢qµÖ˜?6¬Æº?pïtï $ä¹úF}cpA'Àà…N\Æe€¯ÕOé§õ]wwÝ÷ë¾×v7Ð2¤ 9÷'nKÜ–¸H²I6ÉÆÎúéJæÿçZ¹Cî;XcÊ®”])»ˆ"އs¿¡Ý[Ž-'X»z™^œp  ýèz«çjsµ¹úVgVgVgò\ã.ˆˆíõÿZŠ í4»ÖzbaîÍPß9¡]÷Ù íî-Û¤ÝX5V éõÇúã€ÛÑŽvÀ9¹}rûäv¾ÊÐd´-E¿õ·0)~Æ7‰ž? W‡iw«cu¬.D»ÍÎæ€vÕfµYm6}#‰#‰#‰À‚ ´9†ÏÈgä3G²…ÔüÒ œJ/°Àà·´{È|È|Hu×¹ëÜu|ðÁ‡AZÖXÖXÖ8v”¥F©i÷ÿ%™|;,¯œ¢^nbÃ[~í^ø-í.[¹l岕í:³ÙÎlœš˜çF'X +a%Ë÷„¦‘úÃò2ú/íEÚµÈr…\ѹP—”—”—”ó¿§¥¥©÷V÷ʽroÙtª¥Zª%ÿ±#»ÃòM¢ÿѵ»?Ô_ö/¶m`* *Ð/M“¦IÓFŒ]½™ìMö&{‰ä;òùkòo\Ö¹ÿ›Åßò(ò”ïB§?(•¸Ä%°+ì »òïßMŒÏv†uÆ÷…­þYêž ÿR…IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-86-grey.png 644 233 144 6336 14774263775 16027 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü “IDATXÃ…—{PS׾ǿkïB’Bx±XFH Åbt¼ÈS¥8tV–:Z-2꣎ö؃WD¡ã©´œµ­SÄÖ[)Üúà!E <§×ÅçEÀ´‚hR $;{Ý?Hp¦w:]ÿ¬Y{ïõý}Öï÷Û¿µÉÏÏÏÏχfši¦cVrƒÜ 7H›ò+ò+ò+èó <ús(õ¦ÞÔ»h+ïÏûóþa[¬õÖzk==Š“8‰“$!A€^ô¢ÀlÁzT¼F¼F¼†är¹‡ÜÃ'É#c+?4÷ÐÜCs[º Ó Ó Óɯ༂hg8„v'—3 hD3UBP í6³Íl3û-+h(h(h¨2ÚFl#¶]‡e©e©eiØ_eÇdÇdÇЖ––HrÃEá¢p°Ìg™Ï2À5v½w}ïšïÒ›ÕwÚsÙwñ¸ø8§WPOêI=…$“d’LÅ1VÁ*XÅ¿¾0Wš+Í•A>¾:_¯Î±7±7±7±—±«»Ô]ê.’"ÎçŠsaÁ~ìÇ~HaÈ@€y˜‡y°X¬Ö¤tµuµuµQû¥K!—B„½O“ž&=MzãŸR…T!Uĸ;2™ŽÌ„c4‹fѬÁÌ ’777   mh ðàê¹z®¾íŒmÊ6e› JV¾¬|Yù2¶=m{Úv®ÊkÂkÂkJˆ ‚¼pK¸%ÜGbI,‰àx0à 3€ù˜ù d¼@Þ%ï’wáéÒO;“v&í Wå»Öw­ïZªrñ¸ø8BChÈáµv™]f—ñïÇ¿ÿ>½š½š½šáæ’N$O$O$gÞ9óΙw€Ÿ ~.ø¹p3»™ÝÌ@ʺ”u)뀰saçÂΤ0)LAAAÀÕ˜«1Wc6›Íf³­F«Ñj€(D! ðô:íuÚë4,ñáñáñáH¬.­.­.D¢QÀáµ ¯âU¼*r›÷ï'ÞOptqìâØÅ±¤ ÙÈFö,(t2L'ÆÆÆ€m›¶mÚ¶ ˆÊ‰Ê‰Êj;k;k;»Án°€ŽÊŽÊŽJ }GûŽö@ÆÕŒ«W¤Á¤Á¤A ª¤ª¤ªž; 8>~yüòøeH¿lü²ñK^)êõ‹ú™ãßD‘(u/%(A ÀÆÅÅÅÅÅÑH@¸ÃL“Çä ìc’˜$&i<Ìñžã=Ç{Ú=Æaã°q˜_©îTwª;™ƒ’BI¡¤ã´™6ÓfˆÉV²•l}Vΰ+° ¤ƒt”PB ¬$žÄ“xÈêÊêÊêÊ{¯^¼Ê},Ý(Ý(ÝøMaðdðdðä_O=Íxšñ4ƒœÞu•Á#Œ|7vc7v“úÐÚÐÚÐÚ’¿¸osßæ¾í›Â1ß1ß1_ÎTíSíSíãØãœç‰'x‚'°¢ ]è0iL?㥩4•¦‚’Ãä09 ñÃÃÕ\ûþÚ÷×¾gKdsdsdsLÛªlU¶ª}tê>Ô} j È2§] gVxNxNxòÛ÷‡o¶Ý¶Ý¶Ýû>y˼eÞƒg{zzØ’¦×›^ozjÈv²l‡XøZøZøH è¯ôWú+@xÂS¿~1übÀ7º%º%º%ËFd#²@ˆ"„ˆ}̤ރig*~â\¦Öµ×ÊW±sè,l tÐAçØC¢I4‰ÖüeæÊñ¯:{Ž=Çž#ì|CxCxC`Vª‹ÕÅêb¬z„¡Rf!³Y+ŸËçò¹>|<ØñâHÔHÔHÛç¾Ä}‰û’’˜™ŸfïB™P&”qŸ8#»Ë±ÂÂÂÂÂBŒ»< çëlHŽ=3wîrŒ#Çþ}‰gâ™ø½õÈB²˜Oì ö;Ÿc*7•›Ê!e†aüêòDËTËTË”`yPö ìAÛç~Àý€ûîFëuÈ:tàŸ}¯ô½Ò÷ àTºê© ÐÅ7 ú`×R§Àÿ8s·îÿå®ÿ˜ÿ˜?g:Ÿ>ÿ|¾c^Ä‹xò.Ÿ.Ÿ.|ÕÖÙÖÙÖI6J{¤=Ò@P JA¹³ÛÀmà6L-W…«ÂUą́ÓÞ*×õ[.¿Ófªxç°‹ºQ7êFÞyi䥑—ð_ŽùŽùŽù¼X%V‰U¯}ú8áqÂãŸZÓ=Ó=Ó=úÛ§oŸ¾}Ú±bÒ>iŸ´³»E+E+E+ß  å´œ–ÿw#ÄCÌ`£æ¹"àtÿ[‚?h¿“»hBš‡h=­§õqz¦†©aj¾WM¯ž^=½ZxIT&*•1÷Ø,6‹ÍºÔ\\\óç8ƒÞ 7èI³à'ø ~ô §nƒÐò{ þ ý&wåÂqÛ±Û¹$¤“ôËÁ´‰6Ѧ¿eH%’@ækd¬q(P(Š„¢œážõ=ë{Ö3€P9õ\Ç‘©?âø?S~ÝÈAyMÅIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-72-grey.png 644 233 144 6233 14774263775 16016 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü PIDATXÃ…—}TTÕÞÇ¿{ŸÃ¼!/¦ d1käÕP|ÑŠ[ )*’‘+Æâò6KË.-‚µ¢ìj$²ì!°4½”z¡1ç‘A½’¥e¾EåEDràafΙ³Ÿ?˜c-×jõûg¯³ÏÞ¿ßgÿöw¿‘¢¢¢¢¢"bÜìãÏßæoó·™µè@Ñ¢,¤ä^ɽ’{‹c˜–i™vû_ÅP1T 5¬u5¸\ ì}Ô 5¤‘ˆD$€›¸‰›Öb-Ö²÷•Ê e)äáá¹\CäÁß«‹'O.žlûOinini.éÃÅp1œ¤sHßx¹éCÀ$$!‰ÖJ%R‰T"}ãuºG'%”XJ,%–Ú.wŸ»ÏÝ×xÑ1Ë1Ë1Ëð¦o…o…o¾6,2,2,"…‰>‰>‰>@BPBPB ËÿåörÙßCÿÞxr|™Gæã½œÇü™?ó—^"y$ä…Wpá\8~zïè¡ÑC£‡ž n n nôlZtsÑÍE7©0£eFËŒòœ²PY¨,„oãm¼ pÀ` Ö` €)˜‚)p¸Â\a®0<×ÒÜÒÜÒÌ„¦È¦È¦HiÓàÓƒO>ó¡&\® OVyòa>a>aï,¥¢^Ô‹úÿzM; Ðàý¸Oã>û”TyGªPF+£•ÑÀ‹ /6¼Ø,¯_^¿¼ÈÎÎæ•Í+›W¸‚]Á®`à©•O­|j%pòÄÉ'Oñññ€)Ù”lJŒ“Œ“Œ“€Kƒ¥Á´·¶·¶·B6ElKlKl ©’yd>lÚ<´yHz¿6¹6¹6™É6*HRcl„°ÆØ5v]cŒmb›Ø¦‡íØ^ý^ý^=cj¡ú[}õöêíÕÛ³Ùmv›ý·zçÎ?2¶mæ¶™Ûf2v>â|Äùö¨Ê<2Å»xï’HZGëhÝÑ)ñ¾ÂWTPAxàìÄNì.&_L¾˜ tè>Ð}H«M«M«}Ø/½<öò°°yaóÂf`|ÛÎ :(^P¼ xÿ>üûðïñ¨)éjºš®ð >Á'$’r¡\(ʾž=<{x6:Å7Ä7Ä7À+±+V`V\—À%ì;ÅNgÚδiRrRrRru¶:[ HFÉ(U±ªXU t…u…u…;+wVî¬Îן¯?_,›ºl격@h@h@hÀÖ²µl-˜”½2zeô :©Žê¨Ž}AU¨>P} –wNîœÜ9™}q½úzõõj±ˆE,Æ~G8´µµµµµWB®„\ †víÚ Ëd™,Ë,Ë,Ë,)‰tÒÿ&â!ž½ r&äLÈ™÷¶(Œ £Âxèî`Â`Â`wëè‚£ Ž.ðlôÆ•÷;×€f@3 ¦.Ÿº|êòß©j6`àŒsÆ9ã¡_èúŸ~øØ_¹¿r%p8ÿpþá|àÐÜCsÍë>Þ}¼û8”Ö™Ö™Ö™’£û­î·ºß¢)>R|ôS¶Ð%t ]›²õÎÖ;[ïø?à‡©»}îùÜó¹÷zäðÈá‘ÃOšÒ2Ò2Ò2ØÂô7ÓßL“œY=²zd5˜ZP j„«ãê¸: Àgø ŸcÆ1ã˜`vfgv€N è@2KfÉ hvivivÁqýÔõS×OaÅÁìƒÙ³qBÃ4LÜO3ŽqŒ3¬@¢ÕšÏÓZCk¸KhD#{¥$)IJÊÛ£¹ª¹ª¹zÍ)Í)Í),6lUت°UäÈŒ#3ŽÌ8‚ VÁ*X4Þ£   ò‡<@ 5Ô¿_ÇÉHF2€ïð¾Ãðˆßˆßˆü­S¬S¬SDbšbšbb$FbÜ"Á ­ù¬œ•³r>Ì{Íó$ŽßùwH© gÖÓTšJS75àU¼ŠWi¥%À` ×ÙgÙgÙgAC^'¯“×1Œi˜†i¿Å(Få{(€Ä `‹Ùb¶.YJ›Åf±y6Nœ08ß­ÌWæ+ó”F•D•D•|xÅ(F1ù'ÚÑŽv1KMMMMM…/†0„!IK Ä@ 佨½±{c÷~—iϲgÙ³¢èpÂpÂpBÜÉþùýóûç{6fffÓL¦b*¦‚‹¨‰š¨Á#ÁÆ)ÀÌÌÌÌ`ä,9K΂ÿ¶ãÛŽo;ØÂ¦ü¦ü¦|zØ/Ó/Ó/ó®SX#¬Öd¿ÐŸÕŸÕŸ5,±YëØfùâìð–uÒi‚4×z¯õ^ëÜf·ÙmÞüž¯ÖW뫽]wÓrÓrÓ•[—[—[—³…d=YOÖC)”JÁä9gClˆ D$"1v¿ã~ÇýiŒkŒkŒC€oŸoŸo Í–fK³7¿GwÐtÇ]§WŠ»ÇqXº|yƼO¥¼º½ûnù¸v=II"I 3ÇŸ§ÿ%¬Ö ë¤ 9RŽ”#Ñù3vÌØ1c2¤Ò é44ŠFÑ(¸ÄB±P,„rÏô=Ó÷L÷DôÍé›Ó7‡kSÅ©âTqåÉã‹fÓ©Jª’ªøÝèBºÄ¿É)-----ŰœQx+jÈ«Ý^íîöj·ž©‘75ÀL´Ò"X‹ ®³WÛ«íÕÐPJ)¥’3a³ÙÆ$Çݪ»Uw«¸6ÕÕÕ–ÿ|íêqõ¸z¶|ØöLÛ3mÏ^@·ŸF|xÒ@ãupf˜a&ÿŠ9s<æxy¦ê5Õkª×Ž”>}ú ”·YôeÑ—Ežˆ@"ÐÔÔ„ýÍ—š/5_"/inhnhn’NÒIº ßð«øUüª±¹úD}¢>‘þê÷¼·{”‹Ã˜w‘‰ÞϦ` ¦ }Ñ}Ñ}ÑØç™æ™æ™vQTê•z¥~YeZZZÐq{«½ÕÞÊv^ûüÚç×>÷ÌF„3ûÌ÷™ï3ÿ0VͪYõᯡ„Jî~ůøUš"Ï€7Qâ£<b ÝXa…ÕSÌXkHm§Çè1zì¬Þ¹Ä¹Ä¹DŠö©ò©ò©¢­œ‰3q¦¦sÓM?6ýØâÔŽöŽöŽvò?Ò$i’4‰íõúµxÄAñ'öˆv¼Ú-Æz¬Çzþ2É%¹$÷ßÓ™•Y™õïkÔO¨ŸP?A[¹.®‹ëêyBÚ.m—¶¯ë½‘}#ûF60½×Ÿ|±û3Žÿã’¹)ÃIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-47-grey.png 644 233 144 6215 14774263775 16020 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü BIDATXÃ…—PTÕûÇßçܻ첫 `Å 0°ùQu>9`ùƒ/XaŠ‚Ã'Gʤl– œÄ†‚V„|§,Ò¯)(a‹R¡¤I*FòkÑP åÇ»ìÝ»÷|ÿ`W›š¦çŸ3÷žûœç5Ïó>÷<‡hµZ­V‹i˜´áÉ.âoó·ùÛ¬Vû¹ösíçÌ#§?§?§ÿß³™ sa.ù)¢§è)zo6W™«ÌUlã0“, ÚÑŽv›±›Ùù*ù*ù*’Å÷ò½|ïÕÃdˆ ‘¡¥Ù3²gdϨ»™»!wCîÒ'úˆ>¢‰žä.ظ¦ÑG€aCýRÊ‘r¤é‚0.Œ ãî!9Õ9Õ9Õ_v }BŸÐ§»lœkœkœü†ªHU¤*BMpTpTpÉš'›'›'B\C\C\û³}Þþ½Ýß¾Þ£õmñìñíÞ–ÁæÄœ˜“´Ž$‘$’äSÄùp>œÏù²ñòñòñòY®n:7›ÎšÕÕÕN-sZæ´Ìi!+äYò,yŒx oá-(a„F±<‰'ñ$Œf/³—Ù +ZZZ˜å\À¹€sRæÃç>ÿðù„”>J¥O¸ÂšdM²&E±d–Ì’o¯#  Tz[z[z[ºÈLÌÄL^S¹)ÜnÊy?aDFf]WǨcÔ1bXª9Õœjæ2&3FÆåëåëåë!J«¤UÒ*(¥6©MjX0 fÁ€t@: ¤`)X †R-–GC´û§H9r€ËP¨Ôb˜ ¢ κÎ)9%§<ïgç±ó‘Ýv_Ø}EgÑùÈÕñØñØñØ ÿR«‹ÕÅâŠäèäèäh¾®p…+ R—Ô%uÁ‰ü@~ ?ä3òù @*PÀ 3ÌäCŽ¿ZêP€,Ã2,ƒSY}Y}Y½¸¢#µ#µ#•¯QUª*U•Ÿ_ãGø~$1˜Šcâ˜8"œN §7üË-Î-Î-ŽùÅ;w”·kÄÀ4LÃ4p¢¿Ð_è/1#1–––€u±u±u1€ïñ=¾Ìæ ó Œ £Â( ƒ`„2¡L(Œ•ÆJc%œ¬Ök q‹âÅ-â¿t{Îí9·ç˜ŸÇÎdzÀÞµ¨,*‹ XúÞÒ÷–¾‡¨ig§vR“Ô$5AIè°K°Ý4ºitðÑ=ñÑ@T^T^T¢ Ñ„h€¢éEÓ‹¦#Öëˆà œ3üÇüÇüǻ®°+@X~X~X>œ–Ë–Ë–Ë`\²bÉŠ%+U©®TWª™—ÌKæõn,ýD?Ño~ªË—.°çYͳšg5¤Ä–Izœ§Ç¶…ma[Wð›´oÒ¾IîÄ܉¹°6ÖÆÚϯ®X]±ºˆ¯ˆ¯ˆ¯ †±?bÄ~@P *Aîܸ㑛CÐÙ ³AgI‰ÇÎÇ›̓æAüïìèÙѳ£‘åØèØèØ#Ëd™,JÜÇ}ÜÈ^²—ì~Êù)秠ݻݻÝpóqóqó¬áÖpkøcPÿ(ÿ(ÿ(€d ’Ø´ˆFu£ºQ „ áB¸xÿèý£÷€4Wš+ͯ¼®¼®¼ãÌ…3Î\ˆ¬kƒ×¯ "ŸÇnìÆn`ÏœÍäì(;ÊŽ´—öÒ^ ß¥ß¥ß¨K¯K¯KÖœYsf͠ʥʥÊ`Ì9ðƒüqPÙTÙTÙTàrøåðËáÀ݃wÞ=$´$´$´üa“½†×ðÚãøôUú*}À'øŸÊyržœ'ûÊj5„¢K CÅPp´ˆÑ"0»ç©áS熀ô€ô€t 6 6 t‚NÐO‹§Åóq\Y›¬MÖ°Cì;ÔwÔwÔw‹ãÇ/Ž7:ntÜH£Ò¨4 P-ÕRí£xÜøµñkã×ÐE}©/õe_QÅ^Å^Å^±°kF׌®ì«f÷f÷fwk±kaIIIz{{Ö»­w[ï§ Nœ¨’*©øÖë[¯o½ÝÝÝ¡E( ?¤?¤?Xê,u–: ¸/¸/¸ï™ÌD&2ô =0ÝZykå­•€þžþžþþ«èRt)ºÄBŠ8Ä!.û0¯åµ¼–dÕUÔUÔUX}‡/_¾¥ó|çùÎóaز9dsÈ'ò‰<ð’î%ÝK:@\".—á>á>á>ÀÂþ…ý ûs\¿týÒõKÀô_§ÿ:ýW`šišiš À‹x/tÝD7Á,®׉ë üZÿµþk½FôDOôø˜X‰•X˨G½G½Gýû»–:,uXZÞ3¸~pýàzîÖÉ«'¯ž¼jÝŽ¤ N^g¼ÎxÙ{¾÷|ïùÀ¬ÆY³©'¦ž˜zp?é~Òý$ zFõŒê™Ç K–>,žŠ}*ö©ØÇï%¤“t`ˆ@" ¯Ê«Ê«Ê“Œ=ÇzŽõ£—ö;ìwØÿËË–nK·¥;ÓBÞ¹óÎw+¸òT±¬_Ö/ë¿à8vzìôØéYÉ‘‘‘lYô§ÑŸFJêm›„ñ‰|"Ÿ2‘>‘>‘pç¹óÜy@¶O¶O¶@$" KŒ%Æ@þºüuùëM¢I4 kȲÆ;oì¼±kˋˋˋñµãoŽ¿9þ6ñ<ãǸàµD [·Pz˜¦‡¹&Z@ hÁ½ÿHR§Ô™$(•ÊF Á½Á½Á=ÓòFË-oàïÊ»ò®0±^ÖËzÅ Š/²|Y¾,ÿÚ;‡s8(ý•þJ€k⚸¦G€†Q×Q×QW(krjrjrD_Y‡¬CÖ1Ã.‰, È‚Ö-(D! y/[›g7Ù7òï’"RDŠê·Ò¥t)]šY…d$#™¬&Õ¤šˆiÃyÃyÃyP’ŸÉÏägØ>¶íð¾ÃwµŸùh X+ce0Ûfj2j2j2¬Û‡ÞzsèM¾Xî/÷—ûËUïQïQïùà<²‘lòèD':ÅH{?ªB7ºÑ-ÞÄ6lÃ6R5»rvåìÊÂÕŠTEª"õXîËË ?|Òí¤ÛI7ëv{@8ÂŽ0Ãð`‚ & ( ØEv‘]#1$†Ä@Þ¨oÔ7êÙ²+º+º+:®P5C5C5£gB(Ê…òïß̾™}3`z¦gz8ÛⱃmãqiŠ4Ešçæß›oþ¶ Û„m;ÞW¹¨\T.··W·W·Ws…µñµñµñlÙJ¶’­K_H_H_€ÙÀÁF؈HD"Â4 ÐèqL¤ ÒÁYÕ§êSõR¨*…îxRz=6)Oâ°hû@앲]Iä 7ùß-„:è¬ÛI #aËVO^9Ο²¤YÒ,iRF‚” %HtÑœ‚9s °ÊÖ—*i ¤0‹Yb–˜ù‡þúèoU÷-è[з€ëP)‚A…á“›&ó’T"•H%|±­²ÿ±W,77777{Fa{ñHC6ín·i·Ø¦ÝÓÑ®¥ÚRmÓ†K‡K‡K¡¤”RJ1bÏD©ÎTg’Œ=%=%=%\‡b—b—b×Íó=ó=ó½]t,ïXÞ±°úÚü”v@;ß#Ð?Û?PÚ¸hÓî©¿h×sÈsÈ“>¡=¡=¡µn‡j¨áÜâÚâÚâŠÏšššÈ:e›²MÙH¾’¯ä›q……Å´Ðožß<¿ytÐïÛhú3‡¿1F£Ñh Ú[&›’Þ÷tßÓ}OãS«·ÕÛê}Y”ûÉýä~ÿsð~äýÈû‘®•íííl_ó‘æ#ÍG¬c–1˘…Û&[$[$[ôº+e¥¬ôhÍä €»…A bPzÒ^[¢Ä?óüƒývsP‹ZÔZ³Y«bUšNZA+hÅw~+'VN¬”ž–•ÈJd%´•Kæ’¹äs?øWøWøWü[£ïÔwê;ÉYÉ]r—ÜY™mÝj ñï8(þÁþ¤]Ûïš­ØŠ­üU²l ¾÷gµ¬–ÕîÜè8Óq¦ãLÚÊusÝ\÷½™R¾”/å§ýÞörÛËm/“€ð³­go,MÿÄñÿìÞ‚>ÃdIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-19.9.png 644 233 144 3144 14774263776 15056 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïO›×Çml0b£)*‹ÒUêFJ DIJ¥F…±¦+Á‚%T¤FCDZRu#ABY«æEÔ%tÍ ÓPÉ`Mø±¶*O&Œ(J¤ÕÚ aÕЮ4-‰~˜@Ìã繟½°Ûkÿ¹Ñïξ; w?P‡žøÍ®Œ]ͺNîŸÜ?¹ºýÝþn?ìÞ¹{çî1ùKùKùKÐ3Ñ3Ñ3ó·5·5·5CQmQmQm\ü­ÇZk!ø·?_¬¿X¯ç„ç„Þ ë±Z²SßO}ÿñ=òéSùOå‹$ÿEDÄÒ9öÎøäø¤$: í…v‘å-Ë[–·ˆäHŽäˆÈ‚,È‚ˆôï;Þw\dnÓܦ¹M"‹½‹½‹½ý²‡²‡²‡DÒÒÒDúŽõ5ö5ŠÌé7·ÝÜ&‰‹S7So¦Z:EŠ;‹;Eä—É—’/=¾'A~`«µÕ²]¦í¯Ù_³ˆ´‰ˆÈ·¶?Ù·Ú·J¦ã_ŽqǸÈjÍjÍjHyfyfy¦H]M]M]ˆÛåv¹]"Ö ë„uB$%'%'%'&¬¬£¬£¬CdÊ7å›ò‰¸KÝ¥îRëÖÖ"Î:çUçUùVÄžgÏ“L‹ÓVc«a»U0†Œ!Ë´hÚ3Ú3"–‰ˆH¦ öûED¼6¯ÍkqŸwŸwŸ)i(i(iÉJÏJÏJÉ¿–-ÿšÈ…³Î^8+ryþòüåy‘á#ÃG†ˆ”(y®ä9‘Íw6°ù‘½Çö¦íM“L‘åêåjk6ñ‘e:r+o4r½o¸oøEøŒEŽB°i{Ó¶¦mp½òzåõÊØ9Ýrºåt .<\xFŠGŠGŠae}e}eÊsËsËsáNÁ‚;ÐZÑZÑZ…û Ÿ,|þQ5´6´F0Òl©þÞ®Þ.à¿a=aíW¡á冗MZ£BP0™QEcŒ1Ì1Ç\\{袋.`;Øçe”Q`ŽÏø,Ööè ͆f¼è­lohV"·2ÚÇ”sÞ9HÀði>-ÖÇŒ:mTeMy„Gb|ú´>­Oƒž«çê¹`œ1Îg<`8 ‡áŽPO=èƣƣ ÿt£y£™5ã·Ñ>¶kfrúœ¾@÷Ì>ö½Î_XhÒkcÜÕ=ºÐŒççÑ¢ÿX±Áä÷â*¤ÐÑeüø£µV(ãã4‚ú%ýR~”ï{ÿ;³Òœ]æ¬$2Ûà§H‰n1z­^KÔu ˆÙæºoæ›x&¾ÉgòGgå}ûº¸oßc÷ç ö9¾„Ó9 IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-10-grey.png 644 233 144 6015 14774263775 16004 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÂIDATXÃ…—{PTǞǿÝçÌ;Ñ,®…a D !î€Á»A†ÀM‚YÁ$äÆ1‘,—¥®ESNJ… y)«Ò#6”å*ˆA°0q „Êä"dÂC ä1ÌãL÷þÁ°b¥òûçÔé_÷ï÷éîïéþ’“““““=æmrþA£Å›âMñ&oʩȩȩàþycycyc\˽¸÷:ôR€ ßpÔ9êuü JQŠRbF(B  }èðÞÀü *I•¤J"fñgñgñç–’ 2A&ö–äúåúåú]êÎOÍOÍO%£R$‘„yÖêáÒÓÀ Ø€ ´’å±<–ÇZ³ÎYç¬oD^}^}^}å sÔ9êmþ‡mmmqî¨î¨î(ŒñÆxc<1G*"‘ Â;Â;Âße¿Ü_/Ç[ˆïÉ'ç—yd>ѳ‚Oò%| _¶‘dÙtT‚„ /ËfOÏžž=ýˆ·O³O³O³{w|_|_|u…YÂ,aòœÊ¬2«Ì°ám¼·¡… 6ØlÇvl°˱6Ç Ç Ç }÷é»O¿ü¡6H¤ úƒÚ½Ã½Ã½#î(Oãi<íæ6ú$ÙoßoßoЂ´¬xX¬ëĺ–¿;çœsιG6b 1†iCrfrfr¦X©ŸÖOë§aà—¸‰·ñ6Þ‘l%[ÉV0‡9Ìä¹GîAò´‹“O><ù0nÔ¯9^s\Úvã«_ÝøJüF©Qj”š¥$)IJÚ˜‚؈CÓTÓ®i×´ …¿Âÿý+¶F[£­ñ‘M†dC²!Yz.-5-5-UüFï­÷Ö{c«fÕ¬À÷øßC¤14†Æd€ € ‘!2d'Ù  õ¨_ù&¾‰o–¦,MYš‚er|C¢!Ñ(='ç—yd>*ÍH3ÒLB„ósççÎÏSÿÕ'Ù'Ù'™'—'—'—‹²F¦X‹cqXBi#mÜ1îw 0—:—:— @ 4šÐ„&¯á5¼ð“ü$? زÿdÿ àZ®åZÈ@–Èñ“““ÅJŸç}ž÷yžË<2å¡<”‡þõ—Éer™€ØŽØŽØÄë«ôUú*(Y+ke­XBü‰?ñP†2”W¢¯D_‰ÎfžÍ<›‰EËF6²÷-÷-÷- fcÍÆšÀ»¾ïú¾ë é<Òy¤xsàÍ7F-ѬÿXÿ1”±]±]±]ˆ—yd>*KÁRðé^w¼îxÝÁÁÇL™3‘bO%¦Ñ4ûtìÓ±O2ÿ2ÿ2àbøÅð‹á ¢A4è>Ðð~®$^I¼’X`@ú‰ôé'ƒÁÇàTUU…CáP,ŒV†•‡•‡•“b™GæãŽqÇ8þ{mÂÚ„µ 0kÚ4mš6ØØ ìö´´–ÖÒZ€ë¹žë¿×ý^÷{˜ÐMè&t[Æ–±exÀúÎ÷ï; ŒÆ ð|àùÀó€~\?®:’:’:’«ŸÕÏê<ŠGñ( j´ÚØV¬,XYsÇxÇxÇ8Q¼‡÷ð ¥gèzf!Š|K¾%ß.&öŸöŸöŸ6ïݼwó^Àw‹ïß-€kkkÏb?{©½Ô^ ܶݶݶË#—G.\ô+v)v)vÂá‚p°ÍÚfm³ÌSE_¡¯ÐW|‚Oð ¥B€ ð³Së§ÖO­Ç€”-eKÙÈr\Ç5\Ã5€oçÛùöûB¥#é"ˆÅfáˆpD8ˆ§ÄSâ)ÀÝìnv7/úɲ†¬øŸàÞÁ;xgÁÍå0³³³ j ~–ª Ôê©pÀoÀoÀŸí*é*é*`„F̱ÂBr‘\$ïKH % ¤‚TÜ·b=ŠEàóµÏ×>_###‹~ÇMÇMÇM@Ȳ„,@gÖ™uæ÷œõ#ëGÖë°uØ:ŒÿR¨ÔR!E2’‘œ[*æˆ9b1_ò¾ä}ÉÛm˜||òñÉÇ¡¥:ª£:LqÎ9ç‹ ™žé™`ñ,žÅ?¨ÑÐÜÐÜÐ\ ½¼½¼½   4h8(^U¼ªxž ž ž…ƒ± mжX‰•Xq‚¸‰›¸Ë”Ôÿ²ÿeÿËìSÆ*c•±§‡îFܸ!ܨɮɮÉvï’^Ì‹y1 "ÊPe¨2U·ª[Õ}á6lÃ6 ¦*¦*¦ 0ZŒ£(>Y|²ø$pgÝuwÖ)?¦ü˜ò#¸2J¥Œ‚ª¶¤¶¤¶„Ù†MæaýFY¤,R}Ÿât ºw»Èþ[ûoí¿à*®âê¿SŒ)Æc­š™ú™ú™úGÒâ4qš8 *¡:¡:¡š\æÏògù³à®׌k„N8T­ªVU+«¦8àö"{‘½žžž›››aë2u™ºLøÓék§¯¾†ÿÕôkú5ýö§¹À.ÿ„ÕXÕ=¦´”–ÒR¡¦‡éáᬟõ³þNm‹¶EÛ´Z -þ¨eeeª@;ì° ežüàð)>ŧu‡ºCݱ85eŸ²OÙ¡m¨k¨k¨“ ²¶É™"Sû‰"Q$ªçÏ(D! Åž2Ï9_7Š%GÉQrôr&¥±4vwÒ†4ú·z^Ïë¹”1Y4Y4Y-ùŽ|G¾Ã¯à¼€j¨H 0à 3@ºH鸑¹qA:Kßo|¿ñ}÷®‰œ‰œ‰ñ˜Ê 2¨ Uù«®:¸êà‡_"¹È%G?úÑ/ÅÉõ¨ƒÄ Ô,d!‹Ô­­][»¶¶p‹:]®N¯ÊŸð™ð™ð'kT5ªÕ¢v1iLñp¹à‚kQ²üEþ"œä‘<’U›µÍÚfåO]m¾Ú|µY(Ôùê|u¾Cvg¥³ÒYùÖݹݹݹ·r+·b©'Ìg2¨Íó<Ãb±‡°´s¤s¤spf9³œYo} óÒyé¼nžé«ï«ï« ›^jz©é%þÉ$™$*vŠb§Àåâ„ßã÷ø=€HD"æ~±þbýÅŠªæðæðæp,ÕêFu£[ÏÖ³õo}0/½!»GŠÇ<ÓLX¸€ä™{~ITòqç9w ÑŒf4»w‘ dÙðÔ–ù_Ž/Ï»2\® ö——ÙËìeF£Ã‡;Œ$ÖËzY/´t5]MWÃ!™%³d†êxÈñã!îU£Q£Q£QÂuu¸:\^ø‡ùf÷7¬˜³bñ˜ggwÊ;–ŸŸŸŸŸ)yEáiXÐG»»<Ú=æÑîçh×UïªwI“%“%“%ÐRJ)¥¸'¯Ä¥¹Ks—æ˜m¨x¨x¨X¸®Þ§Þ§Þ×Ýàv ;†÷}xý™ëÏ\ð<ã´2 Ì·ú+`¹ƒÖàkvÏ? Ý€‰€‰q²:§:§:ǽ «° «°Ôâmñ¶xãdK{K{K;Ù¦íÕöj{f`føK«¸UÜ*nû·àÈàÈàH:îÉ÷ïò õk.¿a&“Éd2Aò¼Z¸’+¹’üçèšÑ5£kPîtºÿ!©‚UÁªàÿv;îvÜí8ïÚɞɞÉ~¤ó³ÎÏ:?s?9ãšq͸„,E´"Z½‚—ð^ò? PA•pãÇ8[.ï€g¡¤_óüŽý†vóæ+yw.¯ãu¼ÎÔOÏÑsôÜÿÛí‰öD¶FQ¬(VÓ!MHÒ¾ø*ä\ȹs4Yû­ýÖ~r‘ù2_æËË;¦¯×÷ëñôø‘ùø‘<á|ÕTMÕ¼3r>õ5±Cì;œCÜnn7·Û1'$$àOk¬}°ö°ñáÆ‡lll!_Ÿ××ëûõxz|=ßóyˆÿ]¤¿àK~”åG=Yz…Ò+Ó+Ó+•Ïܲ$òýüCþ¡çŠÀÖm;k;+¿éšr­w­‡ š± –ÆÒ +5r\(Ù²(‹€R$K²(ÙJR(5Ê>eÀ2XË€¬ïwM¹ú\}pÙºmݶnùM¸Ÿïçûõü–DsrNÎI$Ö‰ub]ë}Cþ±üÓù§å"ì#\Ã5øäVìÃ>€y´‰IDš h55æ™Gµ¨@nUÕD€}ðéÛô|z~Gç#SŸ©ÏÔ÷Öoõ–ZËNËN¶Ð=èÙêÙŠ§ZŸòŰgØã%ã%|ã1ã10zbô Ÿ> þz}89cc|X‡u0~gü |1Þ:Þj,ò¹Ýî<µÔZj-µl¡Îcð‰»Ä]â®[uúÄ©Š&{“½¯ðËNùÒç¥Ï®è8€¸Ãq‡À´Î´ö7ïoÆ4ö(éQ€À+)¯¤@³·Ù ÈΈEþS§*NU°÷ÊFðó&/I^’¼dž ‡^zÉØ(Êldðuš;ÍÐÒÒÒ/]¼5GjŽ7ÂÀç~<7hÙeoÁ{€¯ÙÑì`5*¯0òPáPáP! óè|:èï‹/>úeŠKq).^xá´¡ c, /!/vžßy~:@G»£RºRºÂ@Ñ´¬i Å†âš,ž,å×yt>^;R¯™ L¦ãŒÅÒ6ÚNÛ‰(…fÑ,"¢)딕ˆˆã8Žˆèôë§_'"º—t/‰ˆèó¾ÏûÂo»ŸÝýŒˆè`ÕÁ*"¢“''ˆˆfJ3%""u‡ºƒˆfhË[pGCùMí¦vS»qäõû••æ4æ4æ4¢w‚›à&8pÀ°•IL ?Ÿêõ¤zR=ðiɧ%ÓU2ç—œ_ üzùu «hàèã£ü¬5>S‰Qb`ôÊ6Û6Û6½:ñE|_4õX8v®ú\õ¹ê0 ̘4MšÂò®n¼ºZZ w}ïúˆC#?’ ~süfˆ/Š/€ÄÆÄF²°FXVÎ’ýIv(ßµ†«ÅW‹p;—Éer™SIX*,–î¯×O™u¾u¾u¾²À½É½É½Éàc+õ¯ååååXöDöÄt•œúfê¸Ýt» ~~àûþïûøiíðvURU #àdzºguÀ’ý‹¯,¾¢€*¤ ©ÍO)¡ ¡ ¡€H¼.^¯·õþ†Uƒ«•=FÃíÁzBÊÎÊÎàï‡÷~T¾V¾ÖÖ)H ›öMtOtxúrÃË €ÚüUüWñ¡VWþ­lªlJõ€Û„m¶{%A?ÎK‘–ÞdÊ4eš2=gõ ö»×î ÕSž=< nn„k÷qp ×@ý@ý@@5«f`¬P*ïÞµú»Q§ÛéÆÛÆZÏ×óõ…Ün7ç7g¢…¿竌+ãÊV9¸6®kÓµ¢î”º¤#ÒH†v÷¨jF2 U1d,Ê]ÉÞeï†êÛßÖïèwÖÖ™Ö™ò.£’‡„CÂ!{¾VDET$ZB¬¹”K¹â!r’“œD‚W>¼d<­ËËÙìþØu×u7\»,—åFßz?üðð-¾X ÛÃö„~ÎæÛ›³6g){ŒhL|">‘§U¥U¥Uñù|>ŸÏ×è*tÌ™Úg‰Ð+ô ½Üå…{î]¸—ÈTiª4UJ‡ íææçæç†kWµ«v A‚`ÃSî"e‘²(T߯eË—±•Æ[n6™Mæþ‰ o™AÆuFµž¸(÷F¤o™Ô®û|˜vkì5aÚ5ËfÙRÔu ¤Åô âzâzâzØZC“ |ŸðÎÁ()6EñÅÒó„Æ(í®F»]RWH»r—Ü%w€giÏÒž¥‹G,Q^5´Ø.´ íX®KM“^4à,z…èBÚõ Þ0í6X, ²ÙÝæns·i—S#:©ý²ý²ýrèÚ¢CtôhIâþ•W§øF›¾áM»ÿ“vóÖä­É[Ò®´\Z.-GKpžàJ¹R®tÕþÈ4üpT^ŽþK{‘vWõB½PïÉÖKkKkKkÙ‰ŒÉŒÉŒIùF«½‚WðÚÓ©•Z©•´kGpGå‹¥ÿÑ¢µ{8ÒÏû'·…ÛÂmh5­¦Õê¯ù¹ü\~.ÀGýå†Õoõ[ýDÂ-á–p‹û³¶±$ªsÿ73ß ¨€ Ä;‘ÓWðŒg<¸N®“ëü×¼àø¯¤¨Î¸¢â¾°Õÿiæ’ÞÈõ³IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-54.png 644 233 144 2462 14774263775 14707 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜçIDATHÇÍ–oHÕWÇϵ5¯ ¦‘+²ºeݲ@Ô‹ˆËÈ6 ¦èYXA5æúÃ.å‹5¸mo†E*Sdµ "—Eš±Àh1î5›·–ˆ»ÚìÞÝß9糿û»¿ÛÖö®çÍç9çù~¿çwÎyž#@!DVü+ enÊÜ”LÓOÙnÇkkþdú'%8Ö9Öýö5L«ŸVÝ’Ý¢‚¶o[ó“ó…°ñ“ù¬¸Èv õ\ê9GQÜ?  68sLÿÛ›Ö–Öö—;.î¸p¡õB+_ÀPÏPÀXÑXؾ5nÍ·ò-¼d|qø_üBÀÔËS/;þ€Ô÷Sß\Å®â¼/Í ¿çAYIY Àà”Á):äNº.&˜À²Ñ$ßÏ·ò-< ßâ³øM=f¬ž±ZðVz+Ӛ̈́à)´/×—kñÅÚÇt-cc±1ÐO"£ˆ¨QçÕy [ßÒ·ôSý¨3A¢LEbi$#އoŽoŽ%0xÊæ7õˆ—÷ö»O ÂYáLº²GöµQm$f£ÐH$¶õ$ús½]oOD5RmQ[ˆì–ÝÉøŸÅ/’åiCiCïA¿ì—ÀŸ| ªUµ2© ³Æ?÷Œ{`¸s¸s¸FªGªGªÁxa¼0^Øú¢ž¨'ê°;éµJ­R«€ÛÜæ¶­W_Ò—ô%P5jŸÚ—´ˆZ¯Ö3‰¶ðßXÇÞXùã•ZU©*bq@M$Ñu<ö²ýÍsžÏãsPÛÔ¶ÿUù_Ó+½ ÌÞ†?éöËÍr3QÐ7õM8Àö­ñÄ‘ˆç[xoí•ïìëâ}½›/Øh8uãèÍ4JIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-16.7.png 644 233 144 3070 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜíIDATHÇÍ–ïOTWÇŸpZ "Ø mÅ.Y_Ð@ ¦¾ØŠ bT$h‹¡4W‚S©Q¬i6Ò‰iËÔm¢)- Y³ê*¡)• U:E—†ØâB;!Ѷ@gØa€áνç³/fîÌÄîàysóü8ßï÷>çœçYþ X×X×XSB¶µ:ê_±}Åö ÿÙu°ì±ì¹{ žúè©R?MýÔ‹ÚfÜÌ/Åå3ý²R¢ŽÄÎÄNËÖ°Ýûröå¬X²ÿvìWìWüA8xõàU€ÏÛ>oã-˜üvò[€Ù­³[!j›q3ßœoâÅâKã#ü"ßßc¹‰ ‰ "¹-s[Vm(a< Jw•›ˆSVÐ=@Ij+àÇ9¼1¶ç›óM<ßä3ùCzÒ Ó E ¬¢¬ÂÞŠ&"2Ö'ž;ñð€v…Ïh¤‘$Ðmº h×­º•€4Þ7Þ>PªÔ÷ê{ý ~íÁö`;¨1Þá’”7„§~­K«KªM¾2W™ËÞ «W­^]Óð÷L¼:ÿê<¨ZÍ¥Æ8Á uGÝAãm8PÆ5£×èT åPåRH!%êg‘EQÀÇ|Œ<ÍÓfPsÁ¾¯ö}eVðLQÌRŠˆüé<Ø}vŸÏÆ¿Ý-î–ìNÿôü“óO² ¹4—æŠòi^Í«yÁsÜsÜs´-GËáwcyÇò+˯€çªgɳÞ¿Oo›ÞÆÂìOµµì\:ïrØu»î³©Bz¬2""r4OÄqÆq&9ÈÛÙDz©¼¹o£·Q¾(.Þþòö—Å~ýÇë?\ÿA"ã@üøñ"Yþ,–_¤¨¤¨¤¨DÄ[á­ðVDóú’ûÒûÒE²ÿ™]™])òç_ ÷îûFìïÙß“/>97tkè–Ê9òî‘w“ƒzKXúIDd¸:Æ;ÆÁ@U½t¬`UÁ*f]oÏÝž»=ƒ½ƒ½ƒ½q6ãlÆY‚C͇š5ƒ«ÖUëªVÌ?ãŸñÏ€ßéwú0P>°k`d®y¶ÿÙ~e ™ ™ª ººººÀP!=‚/¥;¥[uòãä“O€z+|Ž2´ŸµŸ!¯2ïõ¼×áFîܹг·goÏ^°VZ+­•°®|]ùºr(i(i(i_†/×8pà}£¾Qßêøã®ã.œ=ÒòbË‹Q¿®M¼0ñ@Ê×)_«NÔäÔdc”.ïyïyPFäØPà,p8a`|`|`:îwÜï¸ùMùMùMQàÍ[6oÙ¼Z\-®–˜½hŽá{Ã÷†ïÁ†Ão8 s§gÎi3éžeÏ2°˜jKµ£VÁ¸f\³ŒŠ¦íÐvˆXÖŠˆHº¹G‚$ˆÈ|Ü|Ü|œHÁtÁtÁ´ÈÔƒ©SDZ¶>l}(2¥¦Ô”IkHkHk¹T©þR}t¯u4w4w4‹äþ1÷ùÜçEVþ5õ\ê9ã“0ßõ|=_DìFŸÑg ŸÊá:n]î½Ü ”„öXøO'wž,†[sGvÑúµ~ÔÏðLß°6Ãzµ^­WƒQj”¥À~ö³Œ#ÁH†ø†oÀøÎX2–@9‚Π“¿û7÷oöIû¤Ïfêù?ÿµÄ×c:³_ÿRÿÐŒ77#ÿ®P,³ ,±ÈbLEðžï¼Qn”£к3?Â÷»ÎÿÈ]É#weà pšÓ$E–ý ý  nª›X°@Ô6ãf¾9ßÄ3ñ#we˜?¤çq~]<¶ï±Çóû?ržh ShdIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-99.png 644 233 144 2542 14774263775 14717 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–KLTWÇ¿¹S„™«õ‘%F»)•8Uƒª†A"ø8„ø¨Xu1!) Z#]´aÁ 4` 5ŽX‰¡¢‰‰„é B ‰ A)Ê 3eæÞ{~]Ìܹc[ÃÖ³¹ó½þÿÿ=s¿ïY hZ†6?fkßÚþ´‚´‚/~‰Ù 8ö:ö|ŸÕV°°ia“°m+nå'×‹ØøÉ|–_ˆíHmOmwäÇíZ8´öÐÚ´%1»®\·]·gt8qçÄ€[×n]ã;{4öàMþ›|°m+nå[õ^2¾Ôþ‹_R:R:#:/už¬Ü¹rçês±„¡ÕP\T\ðÒùÒ©40^餫|`ši¬5‘d[ñx¾UoáYøŸÅÓ#°8oqžì)ÝSêjŒZ jEÕ @ˆÞh zý’~ T¿¾F_Ã,mêŒ:À*V?©}j_Rü–~U¿ @=õ¤cXxqüŸÅÓ#ïÿ·?î€iÒ€0@´Œ°•F%Qõ¹ÊQ9(k‹”GmR›@QGÔP[Õµ%±ƒ(§ÊRY(Š ¿á' Æ„1D,ü8_‚_’}ù3¸Æ\cÓŸÀs㹑ÀÝůæ2s!Ëù#ˆ`âÞĽ‰{`6˜ fƒ-$r?r?r?)þÂ0ì8š9fNo—ÍgñÇôÄ…5ü§jNÕXÕæNF'íöƒW¼âpu¹º\]àëñõøz Øl ¶‚7ß›ïÍ·Çíq{ ôBé…Ò À °*ªõ³úY›ÏæéÑbûæñ‹äVæVÆ·QU ©D,ÇõàõÙë³"A_Ðô‰„½aoØ+2ž9ž9ž)R²¹dsÉfí´vZ;-zzz"2X=X=X-ÒÖÞæoóK‚ÀüFM©) ß±ñ}~_™ÿ`þƒ¯¾ÉÛž·=Q×(~gÀT˳¼eyËò‘ñ™ñ™ñ‘–ó-ç[΋ Џr]¹®\‘Wƒ¯_ Š4w7w7w‹Œ†Gãa‘ɲɲÉ2±×ÚMí¦…ïh´ùcz4g±³˜5")þûþr–;kµ6NÁÒ‚¥KE*J*J*JDºz»z»zEfÊgÊgÊEvvvD*ú+ú+úE:«:«:«D´mDqûÜ>·/Iا²^ÖÛ|6L&bÞ5ï:~ÑKô’DâbµU-QKlœ§ÅO‹Ÿ‹tôuôuô‰äåå‰dÎ8œqXĽ߽߽_¤­¹­¹­Yd‡s‡s‡SdÑä¢ÉE“"Û2·enË´ñ´wZ¿ÖoóÙüq=±­¯nLݘJ|›Çè1ŽǙũ"*b7U]{]{];d{²=Ùè(ë(ë(³ãW ¯^)„l_¶/Û;vLª^ÕcÆeã2³ ¾LÏ»S«¿Mê¢^ºéFe4©ý[i¥TH…Tˆÿ®&šh6IfÞßúkýõ‡»òÃs̰æŒyÒ `ø ³ zT`ÛVÜÊ·ê-¼9ÏÊövñÑÞÇb7Æíûe’zÈ­ ûIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.6.png 644 233 144 3222 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜGIDATHÇÍ–ÿOÔ÷Ç_wHá’“Òx–¸a¼Ô0† j²¢­S N 6t~a¬Ðu™Gˆ[Ä:·D»¦B-ëðØÖÀ )´%ÚvuXBZRœÌB+K¯wT¾Þçó~쇻w™ÿ€ï_Þy½Þ¯×óùü¼ßŸ×ëý‘øÐ,`^n^nŽ Úæƒa쳱Ϯ|/h×i`ÚiÚyýwðhí£µ{ìœÞ¶u#>2_$ŒÉgø%^ÂŽwŒÛ”²ÁîÔÝ©±Kƒö©«`iµ´Þ@i[iÀņ‹ TÀ/î|àËñå@Ø6Öx#ßÀ‹Ä—cÿÇ/ÑEd‚˜Gb[Vlyâ×Á€Á'À±Ý±`8j8J™@»X±ª`’IŒá‰°õP¼‘oàøŸÁÔ#`ÛlÛ,Â[ùþ|¿ÅLè‡Óηoƒê˜oå¯ÔQ‡4Ѩ üøYõ¥~J?¸Ô9u@õ©>`FÛ£ía¾€xz걪+!¼?;ßt¾i쇺üñüq‹ l9¶œð™†æ×rùQaZa¨§æ¯ßñ¨çôX=–yU¢6«Í(µU9”ca§PKÔµH&‰¤°ŸCä“ÒÛµ7´7˜¼xAý<„¿¬ð©Â§ ¯åF¥ˆHÊiþay×òîä"\>¸æð³{?mm`*°1ðbàÅ0ßÜɹ“s'aÌ1æs@ 5HäÆ;l~ØØ ÷~;Ú;ÚËÔüª > ¦ ¦ŸX-“‹ =¢L""uÿ„r­\ÿïñâÕÓ6­Û°zÃjˆ¯Š?Uä,z©è%¸ë¼ë¼ëÇÇÇH(O(O(‡‚”‚”‚˜ŽžŽžŽæQ2Pr½ä:XZ«­Õ¨Ÿ]hý!ðîÖ»ô.= *R+RAÿoP¶ˆˆüË —'.O@ƒ¹ýëö¯ÕþõqYmYmÌz®y>õ| «|«|«|Pi®4Wš!}GúŽôÐÛÙÛÙÛ +Ϭ<³ò tdudud…uœí8Ûq/%^J¼}_ö}Þ÷9üò’$3{-áÆwÔ~ø ムÐ|A=Âx\[\›r³säÄȉ0à¤kâÀÄØøôÆ 7@B^B^Bô÷ö÷ö÷BÚ¶´miÛ Îg³Ãšò5åkÊaÄ?âñ‡q§§§ º&º&ºì»ì…öBØñ«íOn&3ûÊì+cKÇ–‚ò.¾¸ø¢r›i4ùM~VKëâg?#r]û¦ü›rù¾oªoYß2‘ÖÝ­E­E"ÉíÉíÉí"¥)¥)¥)"öMöMöM"CCC"jFͨ·Óít;eaÜïºßu¿K$=*=*=JdèïC-C-"Þÿx5¯&rößõÙõÙò½ÈãÇ?.¢[¥XŠYmVïkû´}¦"ÑF(Ò³­g¤gDlÅþ⯊¿éüEç /ˆx{{‹$U$U$UˆÜ*¹Ur«D¤ÉÓäiòˆøü>¿Ï/bͶf[³EšÍŽf‡HRnRnR®ˆ§ÅÓâiqÝtõ»úEn w wˆ¬xÎ~Û~[l"Ó—§/‹˜:T™*3ÝN…þ±/4_h^(þýˆ­vW»™ÍìËìÎìWª+ÕQu5U5U5U°Ö¿Ö¿Ö c c cà=ê=ê= ŽnG·£üqþ84Y›¬MVÈêÏêÉê¿ÅÔ7×73kðqþBí…Z ÅøÇ0ª²lÙ~ @OCi/k/‡Û# 3 dA0Ê(£e7Î8ãÀyÎs>ÂoÇŽx‹j"ðú5›fŽ„ø({µìU`.T•Ü õ1,7-7'ñ—uë@« öíØ\ë\+Sz²þ¼þ<ð'ª©íŠvE»šSsjNÐ3õL=È#<ÐmºM·gx×AOÑ÷ê{A;8çšs1¥g…úØÇII–o-ßN.b$ÔÇèüìŠÝ ¨PgžÑ>Ó>Ð÷éû˜_øb˜g˜e†™ˆRèèÀ8<j!ϸYB|vþÐ]IÁž‚=w%•‰•‰ ­À N`…Àd`@Û«íeÔUu&ÛÆºoäx¾Ágðõ<̯‹‡ö=öp¾`ÿBô{À„ŒIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-72-red.png 644 233 144 4243 14774263775 15621 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜXIDATXí—{LÔWÇÏï1<ºÔY±+(3Ëj}èdm×A4Yj¢!*EŒ­øBëƒnDTÌbË£1« ¡ãüP¢&«¬ø$͆5Öê64Úef"lK:ÈcБßoîwÿ˜ùýæW³Ù=ÿ0çÞsÏùüîýÞsQÀ~MÆ/ˆ•b¥X‰{Hˆi‰i‰iY’%*¢"*ßþ™2(ƒ2€À4«"‘DUˆôY•¯®Wó©ù#ëñ "yÂùJ¨„Jx{ä|Ò;b‹Ø"¶Øû¹ÜNn§¢OJJÂ_V<^ñxÅc`U÷ªîUÝÀJóJóJsÈWçÕxu½šOͯÖ{5ñ¿ô§}ÉóÃü°+CÝ¡”¢”¢”"eשöSí§ÚÙž§ž§ž§àÅ3<Ã3.¸à4?8¯Æ«ëÕ|jþÈzÓ¾|5Þä{øn¾ÛuEM`¾m>m>-ÏsŒ9òyp h,%³dÈJ™\&—ŠIePre›l“’§äJ™bTŒKcñ,²ºÞ1æð9|p˜o›o›oËó4྇ïQëÞÔÐ8;gçìDâañ°x¸é¾ºÀRe©·Ô˹Ø'¸ðÈMØ‹½s'FÕxàà×V³b£þ þ ¡x¹‰Å²X€}â¿ë¿ m©²”[Êå\µ¾Ê£ò‘î‰î‰îÉ~§Ê Û ÛXª³ÏµÑµƒ*„rlÀ5à€çùÏóxžÇ<€áÃ'` n ¼¯a&§Éi<ƒÞA/ŒÌ™ (ÇX-« }¤³ÏùÈùƒ†rC…¡‚¥ª<Ÿ¸]Ü.nï8¬NÔ­¯µÖZÙÇÁ^Ùî!@Ê””)|8€ŽÓqˆ?„«ÂUø¼øóbž2<2­™Và;ø¾˜c1Ç âaÅC@¶‡¼uëë&ÕMbk;ÁGÌ8'qNâTõ/éŸÐ?!´0ÂO«¾UpñÒÅKP¶·l/èÐ9¡sliÞÒ ë'Ö@û×í_À‘ÇGðãW¶^٪׿ÄéÎT•O=ºüøòãˇ¾Lq(ÅÀ 7ÜlÀcá›}-ûl½·õ^øø{»ÞÛJ”†{R=©@oÓÛÜ'¿8ù 8ÂcàUyT>>x¥ÞÑåèrt9Ú‹¥M´™6Ñoh#"3މˆ8Žãˆˆêß­—ˆèû¿ÿˆ¨ü~ùýðr¥ýJ;ÑAñ HD4úãèDDGæ™GDßßFDqÙ?gÿLDí'V׬kÖ5kW^í¯¬0«&«&«]#Ü7Â8ó8†LbºŸþýþýäJrÀï|¾c'ÇN†û7õ7õüYòg““Àw¡ïB€oƒ="]y <€vVæñæñæñèRùˆÏåsùܱ_‚UgJΔœ) “@ܨnTV×wmÕµUДÐŽëŽëx‰Ik¥µáÚý4ïÓ<òèÑÑ£¡(åœ<"„êݨ¾Q}£Z{7sé\:—>ö s…¹ÂÜ}•ê-3N5N5NU¦9W;W;W‡„Å©?×­[·3˜F"Ȭ°†»¦oL߀i¢i"\u_uð¶dµdøàLÁ™pÔ:jáóBþAþ˜³oöôÙÓýÚ $ IBÒWƒ”““C$Þo‰·l=ZÃ_¹¸oqŸ¢]ÂÉ”aÊàýèæG7_¶“]]`H0$@Ü–¸-Ë> hOh%_ÉWŽ,á&q“¸I³NE ÷´ûµ–[Ë­]ÜÀÙ8gSµâß&µIR$M»¥þ4Z€2_ÔÆ²(wÛÃö„¤Ôcû©á§À7õ­©oÉÛµ<(œÎ[-Z.åR®h±fS6e‹ÉNv² n¡WèÝuI{Z û ûe½sããA¸vÙ¶ 0Ðw½ì.» @b¬`ùþ¥þ¥¡ÏYó÷‚'O”Ríz&>ŸJ‡’w$ïHÞAÄ[x oáÎéÖ«˜¿ þͺ„.¡‹»œº;uwên"]‘®HW$Ò´›mɶd‡k×oõ[რ€ ` ìVÏPf(3Bû[“Y“Y“Éio¹^§×é{F¾!.ò¤¹Ö¨£'.ʽéâÚuž Ón™µ,L»zY/ëC@þ^¯¿7Ôv:щN@ŠïŒïŒïd+4M&ð |BÁ£¤XÅK¯j¢´»â%Úm“ÚBÚ•Ûä6¹Mô½H~‘ü"˜=4{hö2]Ób³Ð,4ÿi¾*µ ô¢ÇÑk, &i×-¸Ã´[m¨6TËz§ÍisÚøàƒCZs½l½l½j;bƒØ 6tÿ%‰ÿ[TÝà8½ñ:ÀhSµ{ñ?iwá²…Ë. iWš/Í—æ£10Ï´“à ¹B®pñ¾È2ü@T]ŽþK{v•B¥Pé2©À…å…å…åìDÚhÚhÚ¨üP;j·àÜÖj¢&j¢`ÛœQõbé´híŠôþ“ÛÀmà6´”–ÒRÿL~2?™Ÿ pÄG×ï½F¯ÑK$tB÷×àÂü¨“û¿™^û•C9”#ޜ޳žg<ãÀµr­\뿦Æ+EŒ#*ïkú߇ï‚?š5´ˆIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-87.png 644 233 144 2524 14774263775 14714 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–]H”YÇ5WËÑì¢-üˆ–ìcÑ ¯6Öb7±B„°¬6¤¶…bm»h„" Ü]MKºP”0¤Lû°"Örc#ƒÚ-Œ¨E­±ÑœÔÇyÏ{~{1óÎûîRÛmçfx¾þÿÿœçœç=""â ÿ D§E§EÏ ÙÑߨþøuñë2[Bv½‚¨MQ›þô@RmR-@rcr£ùȶ­¸•בּñ|–_\b;âÎÅ‹ÊÛG¡xEñŠø!û§HhOhkÀî‹»/\hºÐÄ·àíóöøóýù`ÛVÜÊ·ê-<'¾ý¿ÄvÆvFý qŸÄ}"îwAÆw¡„'P´¾h=ÀpÌpŒŽ5 $’¨ó)¦°Ö˜Ã¶âá|«Þ³ð->‹?¤G uMêØX²±$¡!Tðè T,®X Áv žz9eTÕ 72Œ tèúpEwêNЙ§ÌS §Œ£€€ŽÇ¨ ‚ÄÐ`;FÅ¢ŠE–ÀGglþùwoþ¶Äo‰f‚·@M«iàSåQ‚:M¯ÕkÑÖéù:E§Ùd“½fðá‹Xt‚N ꚺf¹ƒ·"|~q úìHð&x§æÀcõXE¿æWs¹€iË1Û3{}ö:øb|1¾P•ªRUBpspsp3Œ=8zÆjÇjÇjÁÿÜÿÔÿfªg:g:t¡.dšÛaüŸÅÒVß å•啽ù¹> >´ÿ±ÿ¦ÿ†ÿNNNBê“Ô'©O`[ÿ¶þmýpÞwÞwÞ)Õ)Õ)Õ°´eiËÒˆmŽmŽm†ºÛuÝuÝ6žºh ´Ú|6HOXXÿ÷pvâìD¤n§º7»v?Ës)ýRú¥tÈjÏjÏj‡É’$CÖ‹¬Y/ coÇÞŽ½v'»Ê»Ê»ÊÁéÎtgÂpÃpÃpƒו†Ûp[øz§ÍÒ#0¯k^—>Þ\o®£ð³Æ¬±íW™¯2_eBöòìåÙË!éxÒñ¤ã³*gUÎ*ééé°óK”)=5ûjöÕì³ýʯÆÕ8€îÓ}Ž3áéHž›<×|cÏÇžÛ×^}eä¡'‡N‚Õ»VïZ½Ëö¯,YY²²< ž .\6¸ ܽî^w/¼®z]õºÊÁïÂ… ˜ÑCzÈ9f,þž9"æeórÔCcƒ±A–‰È]¹+©R'ûe¿DÖ¢…E ‹DAcÐiënënëñ-ñ-ñ-I™þ2ý¥Hó¡æC͇Dr¶çlÏÙ.âzæzæz&b6™Mf“HÌ˘‘˜‰“{rODDÒ$MRÃüÑó¾3ÆoªL•à rqì܉û'yyyyyypºítÛé6;î)ö{ŠáJã•Æ+¶ß¼j^5¯“L¨fÕü¿gìÝ·eø ¿cýÈ1Ž 0àhÍL­´Òêðßáw/^¼a á ¨Á˜2¦|ユï˜c†5gÌ=æ¦é'@T‡jU­ «Ãê0˜óÍùæ|`„FÀì3ûÌ>ÐeºL—9„¾ˆ(5K#sñCsì“Oþ›ê&€¹ÃÜA0²ƒÞðИ˜o­²âV~¤Þ³ðß;ù?ð­ ´UT‘h·@mU[ €îÑ=D¶mÅ#- ×[xþ{¿•íëâ£}}œ/Ø:Fx¬´EÜ IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.1.png 644 233 144 3151 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ïOTgÇÏ Pg Ð6Ò˜n0%WÙò#J1ÊZ[]d€X,QbºÄS›,H|±Ýhw‰Ym6©ÆuÙÈ”®«íâb¡‰n5´tK(¤’,:Âe(t`î½Ïg_Ì\fÚþÞ77ç<ç|Ï÷>ç¹ßóˆˆÈc‘·€}}=9lÛõ;^t¼˜þ°}Î[…­âóßÁ£g=ð¸ûq·9µ­u+>6_$Š[ÏòËcu¬ð¬ðØŠ#öqØ›µ7ËñDØ>uœ^§w^‡ºöºv€km×Ú8“O~ 0S ®W ÀxÜxœ²€ñ H¢*æ˜Ãzü1¶µ‰·ò-< ߪgÕóHÙ–²M„¿”ieš³5œ0twZZ@õ„¼üsœ# 18£§Ç¢úyÊ<´*·r¨A5èF•QÅ"º>£ÏÐB ‰lŽàý³¡¿¡ß"8t+åör»³Õâ#?ìíÛÏó³=Ù{²A„ú¯ø ÔNÓa:©j›Ú†R/(—r-ïj•Z¥V¿ “L~ü(Õ¤ëÄԈ1fŒYîP?ó{Ì=¦EðíçcZ)"²þþí¼è¼8£kF×@èüê›_NµMµ± oÑ_Ó_‹VZ:¹tré$ø\>—Ïz–ž¥gÅPé£>à·¹uÏks¥s¥,„FÂø0êu÷]ή¹x‹»ˆÈ9²½¦ª¦*IŸý}ƧŸªœ7Šž-zVº~ž—È ˆ³º :®:NÄ×èkô5ŠT*•‘ ©R7¤ŠTê•z¥., –KD¤HФHD½«.©K"ÚŸµÚ ‘Ü;«wV‹óÖÙÎÚÎZéÉø>ã{•£~»ß±ß‘¤‡·ëÑwˆˆÜo€ ÍÞñYÇgª¶0¹ ½ E¿ÿ–ÿdÎdÎdÎ@£½ÑÞh‡œÝ9»svÃ@ß@ß@¤ŸM?›~nVܬ¸YÝ¡€ ¨€‚MM›š65EN·ë†vCc1ÒéZC¿à¿à·Zz¿A˜MnOnW*&š'š£€s­W¯Â–¢-ÏmyV—®.]] CCC½+{Wö.HNKNKNƒõë7Öƒï¼ï¼ï|Çh1ZŒ0 Œ£ò“òóá½'®^‰ ŒgŒg$÷&÷*¿Û4›Æ3âMÚž´]äsãËú/ëåÛÁ…Á'Ÿñîõ¾ì}Yd]ǺŽu"uëëÖ×­IÛš¶5m«H`,0QATAO³§ÙÓ,Ë=ôÐ#w7înÜ]‘ø×ãÇ‘b[­n9ì[q$t't‹ˆÄ¹â\4>0kÌBÑ/&DX$Hð;db³øñ¦oÖšµ„˜à…¬É©÷SåÌJʫʫbf%©©Ë£Ã 4ÓLb´Æ~c?‹ n«°²Û°AÔ¶Ö—[É·ð,|«žUyV>´·‹‡ö>öpÞ`ÿ=ß %€’ÂIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-2.6.png 644 233 144 2703 14774263775 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜxIDATHÇÍ–oLUeÇ ¸ˆ$­”XB¢l)S‹k¶6`à˜æÐ” sSh¾pÍJ7x¡+œ×š…[™š›ÉÝ0unh9pk¢(ã ²…]†7uMwUþ(ŽË9Ïy>½¸çÜs‹zïóæÜïïùý¾ßï}žóüÎ# ""3í§@BvBvBz'Ôºñ”ò”òWŒâà <ïzÞíß Ïxþ@ƱŒcVÐÅμ“_/âòÇë9q™)n ùtòiO‰`ýÂõ S^ˆâ¯®€÷Œ÷̸ þôáO-–[!ÜîxXò°\ìÌ;ùN½ÃÏ/ ÿÒçZŸkõ܆ä¤ä$xeù+Ës?Š&„r¡âŠwî$ÞIÔ  †€4Òt ð„'8c8;óv¾Sïð9üŽž£õ#YœY,kªÖTyˆ›1wdíÈrôŒ3|G=õ¤énããàs³ßì'úº¾LèI= 1|œ4'‰èn#d„€/¢õ1¾¿­Óú‘îí×eLTJ¥Ä ýJ¶Ùoöƒ~ÃüÓüÞÐú3ý‰þtŸîÓ}¸cÛØÖÏV³Õ‹j½QMWÓ1H7»Ì®8þ‰u¬Ã1øuYÜVŠˆäÞ°7üd ªA´°ô—úKžï~ÃC¯ Íš FƒÑ`4Ä:ÎqŽ»ÐÌ2³Ì,úthëÐV0UF€> ðÔå·õbúQ? Q{Û‹l<¼ñð =/q^¢^,¥R Òö×ÂñËã—Å»vÍÚìµÙ"y«óÖç­)M-M-MÝ9ºst§ˆTKµTKlÔtÔtÔtˆäŽçš¹¦HÙª²Ùe³EÍ4_¼R*! I×l=[ßñcóý,R´½h»ˆ^)"âY""¿Éo2yvíÙgˆ'ôq¨.T'2æóùEÔ=uOÝ ¬ ¬ ¬r µõ¶õ¶õŠ\ºy鿥›"ݵݵݵ"ùù/å¿$20k`|`\<"’'y2ÉMG/ªïøIIïHïX¼T¤¸´¸T$ñ®ˆˆç;#¹üvùýòû"ííí"v_Ø}a·ÈèÑ£7Dyyy\c#Ã#Ã#Ã"BBB"û*öUì ß ß ß)è*¸Vp-–žìyÏÑ‹êÇü@ÆŒŒÖï0|wø.pÎ>ö«õ[ú-÷©óÖy뼰ĿĿÄ]™]™]™LGªŽT©ßAßAßA7¾¬hYѲ"Øß³¿gWo;mÆÖ·ý¤w¤wèÓ~=ü:¨óÿ:—wnî¹¹îÙm,l,l,„“Á“Á“Aèñ÷ø{üÐäkò5ù ½µ½µ½rJrJrJàèÀÑ£=+{Vö,h¹Ûr§åNœ±Øï¨¾ãÇ>•½ÛáÄØ‰1°VèÍvväüÑóßžÿÊ7”o(ß+’V$­H‚Âi…Ó §As}s}s=Tï­Þ[½FöŒìÙ§ÒN¥J_Ðô¡)µ)µ)5îSŪ˜—½¨¾ãÇ6v¸¶ìڲ˩²ùÄt;º"D¦nL0‡sÈ!8Ä!ÅŃôÑìâ{¾Gƒ%€rôý¨Ÿ©}ì¯ÁGƒbt+u§š£æðTíSmª ÔuÕ«zAT@@oÖ›õf°–ZK­¥@#4‚•oå[ù jÕê°Þ´j¬àëEëEž:ü˜ƒ‘ÁÈÔ>6µóS™\™×™'ÕEuµV[«1xh¯à(÷¹Dì{Ìc] °WSƒµÉÚ„ꪺÇOeJeÊvþÿùV²ãå/ÇÎ~ü¤¹[¬ªU5ÐWô‡ÿ¿•Ïìí♽=›7Ø¿ñHÓJifƒIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-11-grey.png 644 233 144 5560 14774263775 16011 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü %IDATX×kPWÇÿ÷vÏ43ã"*× yÉ®F©€øºQKIÊhJ©€% %‰.ªŒ1«!«IjX] ,«"H@¡q]ˆ•DD)2@a¡$¼†Ç03Ý÷(7Ùä|éêîÓ÷ÿësÎ=÷^’•••••7ØmÄ~¡±bØ#öðÚ¬óYç³ÎsœaÜ»s÷ã;dÙGö‰Ún©²TYªø{(D! I&B‚è@€íØŽíü=i´NZG2ÅïÅïÅï¿+$Ãd˜ *ÈöÊöÊöºÖš»5wkîVÒ/ûËþ²?I´s°F—u.Æb,¦¥,‡å°Öh°NX'æDçTçTçT—öZû­ýÖþú¯'Ÿ|vòÙ¨†S†S†S¨‰ZµÜർ–×B/m”6J!«ß§YÒ,ia·:¾ª§ê«<*9Úx´ñh# Ï–g˳‹¿›Ø0±abÃÖÈàÓÁ§ƒOËkRSSÅøÂ¾0±“ì$; W2ŸÌ'óI"I$l°!B`ÐŒf4öTð€<ô£ý0A®EuEuEuòš»ì~°[¬1T* ç›ÄQqTÝEåqy\OŒ¶^±^±^Ùé™ä™ä™Ä“Î%K:'ª5bb ,%À•~N?§ŸÊóÊóÊó€y›y›y 4Ð!Cà?øxoà @eQó.ó.ó.Àñã®êøI%I%I%b©ª¯ò¨|”‡ðòÎ[œ-ÎÄ7Å7Å7a¹[™[™[´¬‘5²F¸oâM¼¡EÀÍØ›±7c‹éÓ/¦Ãi¼˜ób€Çð hœá1þb<€nt£PÞTÞTÞ„«[±[±[1´ª¾Ê£òQ9P”ÿ˜æþ“ûOî?ὧ㞎{:Žä;tµ4–ÆÒX`àìÀÙ³@‘w‘w‘7PQQP?êGý¦AI*I%©À@ý@ý@ýÏøÒ@8íO¯Ð+ôŠóV«ê«<*Ÿh² Y†ð÷°Ä°Ä°Ddênénéna’m`Øèi­ wãnÜ ðzÍë5¯×€aðaØð¥|)_   ]èšY×qà•á•á•ñü÷`ö| ß·@Ô•êJu¥˜ô]â»Äw 2›†š†š†pœâ(Žâ( ¡èzÁ©#‘oÈ7ä›iaï1ï1ï1àÅC/zñ0gýœõsÖÖNk§µsàÇücþño÷‡€&4¡iZŸ¾J_¥¯8ƒ38CB¨à#ø>ü¢i¡i¡i!ºäýò~y?òùŒ|Ž»¸‹»OæÉÊG"™È0ÿhüÑø£eõõõ˜mè7ôú¶-d ³—^ß”£O;æZ¢sRkÈq$‘œMÆÞwóPzÔ+d1YL/[o?r|QiÛiÛiÛÉvof›ÙfFcÃO„Ÿ?u¬µ³vèi( ¥¡°È™r¦œ é“ O‚> R‚ûõ/ê_$iö}ÅòY>ËO;2»GÍXnnnnn.LjDáx`q¦ dØÏ<âirŠœ"§n\¡ñ4žÆï«B*R‘J?ª¶UÛªmòΑ‚‘‚‘è)¥”RŒª‘¸f¾f¾ff“}ù}ù}ù—Ã.‡]·ÖXYYþàÁª«¬R»…¬vX½ èì·xžpÐ;øÒQ»•ÿS»>Ã>Ã>âÈ¥¬KY—²” #Á˜ÝâÑâÑâ4Üi¸Óp‡lÑ·ëÛõíjÃßÝ(¾"¾"¾b^C‡zr\ÍOr ø³wÈŽÛ®åZ®%»úô/è_€sÊSÊSÊS_ËR (nü臄~Hð¨iiiã'›‹›‹›‹•¥ã¶qÛ¸MØ«‰ÕÄjb÷Ïã¼€ü³Æ>Ù„n aCl®šG ä'y~Å~¡vsP‹ZÔ*Ù¼ŠWñª¸Nz™^¦—ÿ8µvjíÔZ¶@“¯É×äÓ6!UHR¯ÿ'èrÐå Ë+âŒÆNc'©csØ6‡«»jàä/qPüŠ=Q»Žv¡d#éH¿#[ÉV²õfýw(Yç«óÕùÒ6¡Wèzù²ãì8;¾óqû¦öMí›; Ô­³º±4ÿÇ…©¿Î¶µùIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-1.6.png 644 233 144 2645 14774263775 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜZIDATHÇÍ–]h”WÆŸw&“¯Î¦RÚmtƒYb#‹b¶¨ëBi$©…˜MSšŠ ºIÛ - ~” +K/Š%ÄÝ@lŨՕjÝZš ?0u›„?ZXwò…ãEd f“ îd2ó~ýöbÞwÞ醲·ž›áùŸÿÿyž÷œ9ÿs’¤g¼_AhUhU¨"‡C]A¼ôµÒ×~~6‡Û`¼a¼ñÏßÃÓ½O÷¬8µâ” °?ïçÖK¡ž×3 %Ÿ—|nlõðG°cÝŽu¥ÏæðoBÙ¥²K) Þùò/¾8óÅö@b$10¿u~+ØŸ÷óýzŸ¯_ý¾‘¯#_ ¤¸¤X‚êW«_­y?—0U­Û[·L‡§ÃnìG@”¨»xÌcü1[€ýy/߯÷ù|~_Ï×ÏùT6T6Hж³mgY® 6VX Xæ%à3>#ÊËÖkð[¶È€{Ͻdܬ›…<>ge­,wÔœ2§€#|ȇDsFÍKXªTùc~Î~¸·=M¸íÅíÅþ˜Ã`oîÖ¸5ŽéNRDn~’Ì3O0qˆCà\vœ|Ôu;ì§ì§0©°F¬‘þ¥7yß`OSÁVJRÝŸ ,Q–x\ö„'læÎg ‹~ µšIÍ€7ãf¼ÀÐ ƒ Ъ²ª¬*x´ïÑžG{À\gî4w¸½n/‹\÷øóz¾~ÎO(gïwõRÇñŽã?±”X^vë%;e§4ÈÆKÆK*KMI‘¶ÚvvÛYéÚÑkG¯U~8ÇœcαwuuI5©«Æ’šZš^hzAš?“|1ù¢ÊÔ¨)Mi»¾ž§ïùñŒmº,½²ÿ•ý’~-IÆ/¥¢ëEוMÿ-Ýî–Ñ<Ӽм îÝ7ºOŠLG¦#Ó‘ðÕðÕðUéJÏ•ž+=Òû7î߸/vvvIu+ꞯ{^ûéXj,%CR­j•徯çé{~BRÅPÅPýf©¡±¡QÒ=I2ú5Æs*)ÿCù'åŸHÃÃÃÒÆŠ+¤Åøb|1®ecvxvxvXš™š™š™’Z»[»[»¥D<OÄ¥õ#ë﮿›O/1Þòô|}ÏOH ·†[ù…¹¹,)*Iú·î)«¬¤?«W½R8N„RÑÞ¢½E{%­ÕZ­]n,]™®LWJõáúp}XzpáÁ…¤¹±¹±¹1éäö“-'[‚|÷eOÏ×÷ü„$ç+ç+ã_’õºõº¤Ü©¨”¥˜b’ñ3c•±* ÊÞÎÞÎÞ–ˆ!Äû6÷mîÛ,ÕÞª½U{Kš½8{qö¢Ô?Þ?Þ?.=œ|8ùpRª^Y]U]Uð%õô|}ßOîÜÙçÎ-äO÷o¶ßµß%Ãoh¤18m;vì€;[îl¹³–Ú–Ú–Ú e¢e¢e’íÉöd;œžžÂ¦Ø¦Ø¦œ.?]~º¼àŸ²ì2|ãéåõs~û0sçÞmqw;/÷þþ}¿ßsϹ¿sDD䣨SÀ=×=×=+j»¿¶ý‰k×ÌkˆÚ5&¸Š]Å¿WBª/Õà9ï9¯ض·òõ"6¾“ÏòËGb;]«bö!غhë¢ÄO¢öñ[Ô’Ôò΀ÝþÝ~€æ ÍØƒÝƒÝ#«FVm[q+ߪ·ðœørè=~˜Ñ1£Ãõf&Ì̢̢ìo¢ O²aú ë^L{1M»À’IÖ«€1ưFÐa[ñX¾UoáYøŸÅÕ#0{åì•"°©tSiÒ¹hÁƒ: oº7Ýâ‹´ð3^¼$ë?"¯#¯AEF“úž:­N?ècúpYïÕ{AÿfdÙLrΨ2ª¨¦šdŒÞ o†%ðAÍÕ#_Û?‡-‰[ã‚î€yͼ šU3‘X@bˆ!ì1‡9Ì=Wgè Û­?Ö…ºÍBó„y‚˜oÌ7@È·ø,~q Êý ’“ǦÃ#ó‘ t°t³nf<üEø@ø û‡/_† /è ú`¤v¤v¤&û'û'û!âø#~JJJc‘‘cä8&p[e©,ÆcÖÚ8_œ?ªÇ•÷í2‘5;jR ‘œi9Óô25=Ün’«"®Í®Í’ԙߙؙ(’óKNkN«HAOAOAHú«ôWé¯DŽß8~ãø ‘²”²”²‘…] »v‰”%î·HhwhGh‡ˆ¸Ü’$Ÿ™f†\µølþ˜ž¨ÂÞïàÒè¥Ñø”Óa–˜%LZžP~(?”ï:ßu¾ë„ÀüÀüÀ|X^^†SSSXв eA ô?îÜÿæUÏ«žW ×—\_r}‰ýá”'Ün³ðu¹ÍÕ#0+0+ apùàrÇ'GwënàOžðÔEuQ]´£Ûë·×o¯ß3ß3ß30CfÈ Anznzn:¤I=’zòŠóŠóŠa8y8y8ÙÞ ö©}N>‹?ªGÀ“âIQ÷!ø2øÒñÛzP‚šPjÂ.ïèè€ÌöÌöÌvÛÆsÆsÆ…ÞBo¡×ö/-[Z¶´ |Y¾,_–í7¿4V«mÆâêq‹¨6Õæº/bl46Š5fËty*OEøŠRJã~i6‚"yyy¶ßsÓsÓsSä¹ÿ¹ÿ¹_äJàJàJ@$Øì öˆ¤­O[Ÿ¶ÞΗïe‹lqðÅùcz¦Üc†YkÖ2©ZT½ª·gZy´òhåQh¯k¯k¯ããdßɾ“}°"EþŠ|8«Îª³Ê‘ÐÇÛÌmÿºÇDDjº`ÏÁ=ã[s)c†ÝÑ5Š KÊ]îrgœq Š*ª€‡<ä¡#o”QFFê¨sàiãñÆÉgñGõLÝǬ>óV«âxßAµ©&Õz§Þ©w:tÑE˜­f«Ù f…YaV€úT¥©4à2÷¸ ö«ýŒGO€©ûØÿéü·ÍÛj—ÚE„·±Oò6öþþÐhx/®A•«r"6ž…?eçŸâ¬ŒŸe=Û8Ìa’í%¶öˆ¾¥oà¶mÅã["VoáýçYùÁÞ.>Øû؇yƒý Ñm<, tIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.1.png 644 233 144 2520 14774263775 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[hTW†×L@ÔDÅB*XP!Ö 2Z5V+(&J¼¡/ÔK°yjŒUª5`(hkŸ¬Ú<¼D¢¡JD%VJ!±^hDeÀ©Lf&ŽfÎÙg}˜sÓVé£ëå°ö^ëÿÿ³ÖÞëÉ·ŸÁ±Á±ÁÁ?ø¥·ZZôÑOÿ¤‚ÀòÀò®oaHÀ‚¦‚&ë¾ç;ûN¼?_ÄÃ÷ó9ë’/ÞÂÀ–-RÛ¯…U“WMeüCí{>÷üK¶\ÜràÜ©s§Ø‘[‘[±ÒX)x¾³ïÄ;ùž_jß✶œ¶@ 0p€Œ[8naqU& »Ê–”-xšõ4K@E<òt)$‰cû|gߎwò<ßásø3z çÎek–­ÉmÌ$Ü?ƒY=ºz´Ãgœç»ØEžþÕxl<šÌ¤™¤t—îLmi 0õ5} @UªJúùÔ\l.ΰ‰Mä¹xÊÁ·ù\þŒy³·õ x]A…[ã&CÌÛæmП›}f†½¡õpÒ!`>ó™Ï¿L×èíz;è?™À4XϬgô©ÕâÃgEhEÈX¿À×J‘€ÜHn$™ Ô#\`1èýz?)ã{ã’q ¢ŸEgGgƒYgÖ™u>%tÐá{Úö2þòùËç`üeæš¹z‡ÞAŠß|›ÏåÏè±…¼ÛönÛ ºÀ*ši†Þ_zö>DÏýdîĹ¡ ¡ ¡ *ŽU«8éé鞫Ϊ³ê v8v8vÂGÂGÂGàòW—·\ÞâÔž¥CnV‰Ãïè±…ýö54Ǜ㠶èÍvFÿÙ§ŒS„‡…‡…‡A,KÅR0jĨ£F@{O{O{',Y‘¬HVÀÌš™53k¼ƒrµüjùÕr/N=HïNï¦ßÖ¹Ùáwô ¾>øºnÈÔÈT ag–é"]ä#lL6&aNÕœª9U04>4>4ÑYÑYÑY>ÂÕ @ÍP3Ô ˜>hú éƒàBÑ…¢ ><õÌl1[ð™Íoë Šd•e•1Q$§5§U„ŸEDä…´¢¨È½’{%÷JD:S©Î”Hkwkwk·ÈÈ­#·ŽÜ*r¥òJå•Jq1b"Yw²îdÝɮʮʮ‘R)•R/NB2I&¹Þ ‡ßѱ.Y—ˆ˜åf¹ˆî‘B'ãîww÷ÝÝ'²¶wmïÚ^‘Å7Šo‹$êõ‰z‘àøàøàx‘¦’¦’¦‘Da¢0Qèñ§ÛÒmé6õD=QO|ºä¢\t½B‡ßÕóö£ÙîùeµZ­vÎÈ;w ¦…¦…¦…àt÷éîÓÝ™y+…òDy¢<‘¾H_¤ÏkÐÎðÎðÎ0t,íXÚ±ÔwIzŒZ£ö½gìÍ[éÝ3i&+tÒ‰Fóš×¾#ñ€<Žr”£¾u…Bñ_Öï½&ÚÅÿ­ôͱô£W^¹‹9©R*EJ}£Îª³ jÕµ¬)Ök ° l+ßÊ·òƒä ¯2_X+­• {Íhë¸uœ©ÿ5Ç|“ßÄÎdV7ÕM@[­vÕ4``Ú®Pœ8qÀr+fb}v¼a­·Öc¸x.þ;'ÿ;¾•T©ãœê¨#ÏkZ§ÖѺ]· žïì»-³ó<ÿßÊöïâƒýû0ÿ`ÿ,&:Q¸˜ºIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-24.png 644 233 144 2540 14774263775 14701 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–kHUYÇױɸÈèFDɨ&Ê ‚(aD(I+{HfTÃDRaƲ‰¨œ)r#£ˆº0æã’C¡Ùô©ˆ&¥FÐÈÓŒëU»söþ͇{Ï=§a"æ[çËa­µ×ÿÿßkï½ö‘)±¿@Âì„Ù éQ;á[ÇŸœŸœ?ÿ·¨]k±ÉØô×q)ã@æÕÌ«ªÛ±í¸=Þ/âà»ùl¿LÇ‘äMò¹1ûlËÞ–ì‰Ú?µCJcJ㸠û›ö7ü~í÷k|¼Ë}— ŽmÇíñv¾çÆ—SÿâɾÉ>£’“E`nÞܼ¬ï£z²`ã†ú'õOÒ ` ©¤ê\ @ûvÙv<6Þηñl|›Ïæê˜¶nÚ:(ÚQ´#¥>šÐ}ŽÎ:: 0"@-µ¤ò«yÖ< úOsž9U:7FŸN:€îÒ]@µ9`br$ PG©^ ?ÎgóGõȇkûó7Pœ\œ "`[ãÀlë¤u’ˆþZ—é2´]"}BWêJнºW÷Æ+‡.Ó%ºÄ1±T™*#Ö}ë¾íŽtÆùâüâôÕ/22ø^X/¬8àzþP3ÕL&âP%‘Í‘Í0´dhÉЈTD*"Ž Úh£ B‡B‡B‡À¿À?Ç?Ç æ«ùL bøq>›?ª'&¬¶T¨´³UFd<2îÌ8°4° ° nÜ,¸ ååå°Æ»Æ»Æ ƒþAÿ ßá?>z|ôø(äææ:~õ£ªWõhþ6™\|qþ¨ž„hÝV6‹¬=²öH¬Œb,WEZk-aÛqkó­’[%"=‡{÷ñ_ô_ô_ ÷…ûÂ}"¾Õ¾Õ¾Õ"OzŸô>é9—q.ã\†HâîÄ݉»Åù¾SL1$`\7®ÛøÆòùW6 ¤ßK¿§½0°b`…«äKÕ˜sÌÁ]ƒ»wAOOܹpç °øéâ§‹ŸBËž–=-{`‹g‹g‹¶¶¶  » » ÛÁ±º­.« Ö-ºÅÅçêÈLËLS]0üzøµëØ·êz]RH¡“^‘R‘R‘Ë.{¸ì!tWuWuWAÍËš—5/Áxe¼2^ÁªŽU«: 9˜LBsqsqs±kI+­ƒÖAw›±ù£zDT‹j1ºDÌB³0^ði*Iõ«~i’&ii]غ°u¡Èùàùàù HY{Y{Y»È³÷ÏÞ?{/âið4xD5k<&’5=kzÖtO‘§ÈS$²hꢩ‹¦:+jDŒ.£Ëásøcz¢›íÑhð7Ä7¯Þ«6…ÇÂc„lÏí+·¯Ü¾ù¥ù¥ù¥°>s}æúLÈ™‘3#g´u´u´u¸çHÛHÛœH;‘v"ÍU©ªNÕ!ë²uÙÆ×{þ¨žŸJÌ€étt „™À(£¸N›~¬ëÇ`Þ5ïšwAù”Où€j¨½EèÞ„9h~üT~¼Ù}F]R—˜ÐzD€Um¶NƒõÜzn=«Úª¶ªA·|¸™µW{µÔqU®Ê] ª­j+±ý©>ö?ÚN;Áê´:°*U¥D‰ÍøoxŒð–·@˜0a—€0cŒÅ'¨AíSûþWçÿÄ]hÎp†Tg‰­ÖNB Ûu;8¶o‰X¾÷É»ò³}]|¶ï±Ïóûb½2|2¢ÞIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-20.4.png 644 233 144 3206 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü;IDATHÇÍ–ýOTgÇÏe, †—j!fµ„¤”ìÑ&"IK©áM ­l}©±‰»,µw7¡ÙÜ]lÙU²Yc]V#¾M´Ä‘‘¢í’˜îºfÕêL¦$6X,è¬è0÷Þç³?Ì\gÒîàóË“sžs¾ç›ûœû=€ˆˆ<Ùâ2â2âRÂvÜ/¢~{©½Ôq"lw ½©½ùŸßCê¾Ô}óÏ;lÞŠÚÖ¹›/Å­gùåy‰:N'œÖŠ#v3¼óvŽ==lï†ÄîÄîG:Ôž«=pæè™£ü î}yïK€©â©bˆÚÖ¹oå[x±øÒüƒú"ð\ïs½Ú($Ä'Ä‹@æêÌÕ/mx_‚7*ߨøÖö­MÅ€ñ=D’*°ÖDŒmGâ­| Ï·êYõÃ|ÒŠÒŠDø[ÕtÕtbg8áÖ'¨?ZÔ@¨›tÐAš¡ןèOª›{ͽÀ9åR.uM] cƒ± º>¥OÐI'Iü)‚—Z¿´~©EðÖ'tU™Ufb'¤mIÛ½ÓÈÞþ:KÖ¬+õS€Ð@ ¨cf³ÙLH­R™*¥j©ZúôK¡lʦlÀ/©¥–.Å׿+æ+„Ô6}±¾Ør‡¾À¨YP³À"ØþzÌUŠˆdïe ñXâ±Àðfy³ ô3*¾_üÝ®ïv1* Շ꣕‚Þ 7è¦?ÓŸ *G娜*>|ø€ûÜå.0Éûõ̹™sÌ<øÉãÀãàÝíÝ \NìHìÌa:ÌGÔJ‘ŽËðþî÷wÃÃÇæ²5gËŽ—‡ÔäÔìÔlTÁo Þ+x¦š¦š¦š Î¬3ëL°o·o·o‡ÍîÍîÍîb¢/ùg= $$ÃÑ?ô¬éY£¶.Is\p\ h¥–;ÊåXe®2W™P˜[˜[˜ c c c Õ–Õ–Õç9Ïy~¼.Þ¹xçâhãTV–N–NZøj«éîêîêÃ|âæÄ%û’}ËWŠ,¯^^-RöWµW5­spdÈ?ä—„¾õ}Õ÷•ÈÃê‡Õ«EÒ¥/J_$’²,eYÊ2‘…m Û¶‰d83œN¯ËëòºäéšðMø&|"íyíyíy"›Z7µljÑîÚâmñ’ŽÒ:YR¸­p›ˆä¦œN9½|eœüÕö휲Nóh‘ƒózæõˆÿãÜ}oí{K¤!Ô`4"Gn¹}ä¶HEVEVE–Èdãdãdc”@Hé!]$~&~&~&ê?Ü|¸ùp³ÈàÎÁƒ;E|¾J_¥ÈàU÷´{ZÄ5ÛW×W'~Û¢&_˜Q?—¸pÆ™×õV½U»)gæÞ›{O¤çz¿·ß+i~²'yO²È–â-E[ŠDnøoøoøERç§ÎO/2??/Ò4Ò4Ò4"â÷ûÇEò6æmÌÛ(rÈuÈuÈ%’¿?þ~‘S'Oôööƒ–-Z ê@Õª0¶blÅØŠh¯ üe`×À.øãÜÆÏ?‹é±K]g»ÎÃ|"rÑqêÊêÊ¢ }FdœqÔSä"Š(Žsœã1Ý}ƒ2É$3FÀJT‰*ý’Þ§÷Ùk^3¯¡øXÿHÿÔZ«^ݧuŸ“‘¿’3#Ñ“è ÌQWÝÀ‡|Hè=`¼c¼CÔ°@Cƒ¨m[ñV¾…gá[õ¬úa>Ïòëâ™}=›/ØÿˆÅÇye$vIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-24.1.png 644 233 144 3107 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜüIDATHÇÍ–ýOTgÇÏP)L* tÛ4nHJ° ˜’…´D°taѤ[š“ÖukŒîZKÝú‚ɲÆT*êFh™ðR¦ÊÛ¥¿¨iVÐ@PK!¼Ï0ÀÌÜ{ŸÏþ0s¹³Ûý|~¹9oßïÉyÎsΑõá¯@Ô Q/D­ ÉQ{-}ìöØí)WCòyloÙÞú÷QXW¿® áË„/aK6í¦d¼ˆ…Égêe½XŠ˜17lyaù(¹üåØ !ùLØ[ì-> Þÿöýoš›ùž <˜Ë›ËK6í¦¿oâEâË'ÿÃ/ÑmÑm¶Gól̳"ðbþ‹ùÉ 9Œ&îÂ]…¿<óË3* ô) Ž8•xñbžéÙ´‡ýÍxÏÄ7ùLþP>‰¹‰¹"üãÍù7çí—BÃM\¨j¬jÕlá¯|ÁÄ6¥MèUz~N«"UD«h  †Ô ë{ô=øÑ´9m€ \ Žì0Þ?«ÜUn3Áá&®—D•DÙ/™ùÈßíÙ7x©4§4T@Ð  þbTÕCåR.”Y"U¡ÞQï`‚WµJÒhªý‘þÈTÝøJRÃLðìW)"òÛ¿ÓeÿÊþ•w Œ¦Ž¦BðìœJ›ø|âs–‚//G$ÐI'à?à?à? © © ©ö~ ‡Kí›÷{‹Y Ž„ðaÔ>jnÛÛííÞ5f>¢""çûáƒÓœÏ2€‘QôMÁå‚˰î£ug×EåÜÈiÊi‚É…É…É‹è°ç°ç°ò=ùž|¥7jZ£Ô&µIm‚¹º¹“s'a[ݶëÛ®£ÚÿÜú^ë{«ÞÆïöÞÚ{ˬÜù~Ñ~#"r» ºâ»â¡ñ˜³ÈY¤*_JLiOiÇo†fžÊ<•y .¦]L»˜wÇîŽÝ³¡°¤°¤°„_ŸËçò¹ ëPÖ¡¬C–¿kWÇ|Ǽ‰¯*u­iºiÚLìvUÔš¨ø±ø±-‘-%[JD ~xÍöšÍvéæ`ÏLόĸιê\u"‹;w,îÙèØèØè©ÍªÍªÍÙ=»{v÷¬ˆmÙ¶l[–ÕÌ æóDì©öT{ªˆ»×ÝëîÙ¿5nkœÈÒàÊÌʌĄ¼m—d97;7[DdmÏÚž-¡yý÷ë¿7†øý´cÚa=ûí5‹5‹>˜>˜>ÃLJ‡†Ç ƒmÜ6nG¿£ßѱ+±+±+ÐZÖZÖZfUL?ªÕZrö‘ì#ÙGà›ò–Ü–\‹OL>œ|Ÿo E?iŸjŸÚ†¤ù¹'Ï=qþôÝèw£’xjåLü™x‘оŠÞŠ^‘{Ë÷–ï-‹l¸¶áÚ†k"-5-5-5"Éû“÷'ïIªNªNªÙ|póÁÍEêËëËëËE¼7½7½7­JÚ΀SD׺µîUu¢ÜÓR´Ãi8mC¢dö˜ó]ç»Ð>4xeðŠªÜ¾ûuÿë~ü;vÆìŒŒ¤Œ¤Œ$èìïìïì·*Ð1Þ1Þ1'''È d2¡ØSì)öÀDúDúDºå_³­&£&~,tϺg­3V®L^™´zLÌWû öX¯ôN½ðð3?GÌ­;ꎺZ·Ö­uƒÑf´m@ 4€*U¥ª4¢û—Xb ¿õ”P y5o$ß¾cûŽE¼JšÃs ûˆ}Ä»Fýkä•‘W@ÿ[hÎè¾€%ý´Þ§÷rª¯Õׯºª®ª«`œ3Îç€ûÜç>è~ݯû:Nr2bŒü1è ºXRóæyuäUÀgµF̱_Mþ@™­ÌÌ„'ó¼Þ¥w³F±QL0<Õ £~VXYd1lSÀSL†éoT•ñé·ô[Ú A7”Å–ÅþßÉÞ•”ì)Ù±+©~¾úùÕÕÑ|ÆgÄYW ¿­¿TŸêÀ† ,Ù´¯^Y8ÞÄ3ñM>“uW>µOíÿØÓùû;K®å5ßIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-6.6.png 644 233 144 2625 14774263776 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜJIDATHÇÍ–ohTWÆŸ™ÑæO‡´©©­Ä&Ø¥i`‰˜"éRˆ±µPëÔR7%nÓøAü *ØBÙE]Ê"ØÀf4tc´Ò”‚XJ¢ÛßÚRÌ&fB’…f'Ä81D3Žsﹿý0÷ÌLÖõ»çËð¾ïó>ÏsçÞóž#$=íÿ ‚/_Väâ`[!_úVé[¿9›‹¿t!ð^ཟÀS'ž:Pyªò”.ĶnñÅýR¿XÏæõ´ ‰’Þ’ÞÀF?þZZJŸÍÅÇ®AÙ¥²K÷øèë¾øªë«.vCr090·qn#b[·xÛoùŠùõéÿèK°üÛåß&¡ä‰’'$¨}³öÍÿ˜Œ½Ñ-Ñ-¿†~ yApoaÂÞF`ìš-ŠmÝÇÛ~Ëgù­žÕÏùTEª"lÛ±mGY<×0Üs ú@µÕË^âó1aïzv,;üÙsÆÈ€7ä ÷½Œ—||Îyà< “Çÿ)ןçËóûzyýœ-}·ÇßÀÙÚÊú'‡Üuî:0}N«ÓJÖ/x^ÌÛæmÊ)§œÂÚË^ö‚é3ݦ;Ÿõ¼˜û¤û$Y*œAg°ˆÿþû¼5xü¢W)Iõ…²dYra™ÑÅÑEà?¼ æ¬9Ë¢Sílv6í}·vßÚ Ù†lC¶¡ÈP7ÝŒàT;ÕNõüŽìï„w‚E¾·ü£î¨ y}ßoìËÀ®Ã»§Ì:Ö:kœ5…'Ž%b7b7 Ün·Ã†Cm8©H*’ŠðЊ%b‰Xb ~߆}:ú.õ Þ¾žÕ÷ýsÿ[SŸôúþ×÷Kf§$^Ñ/Ë&–MèÁ•ãW>»ò™ýãýSýSÒõ¶ëm×Û¤úÊúÊúJièÈБ¡#ʯËÍ—›/7KýãýãýãKðÏ×?/¬¹7rOI/é%=`Ü×óõ­Ÿ T1P1ÐøªÙÙ$i“$â>¢d¶yvóìfif`f`f@Š‹‹“’éd:™–ººº Æn¯¸½âö iflflfLŠ•’ɉ䄴vpíOkÊÃK¿·z¾¾ï'(…¢¡(¿•–÷-ï“”ÍñÛÎôßÒéN©±¦±¦±Fšììì•RWSWSW¥øùøùøù‚±»-w[î¶H¡ÆPcHš¼0yaò‚”I¤F¤Î-ït¾SÀ{ÍVÏ×÷ý%óù&ð/Éy×yW üE’Te׿¼¾n}4]1]1]!ÅçãóñyiÚL›i#U•V•V•J=C=C=CRÝžº=u{¤Ù‹³g/Jñ›ñ›ñ›ÒTb*1•jW×V×VŒéïV/§Ÿ÷“ûØ~ÜçæÏÍÿðþàíqžqž!c?æ3ígÚÏ´C“Óä49ÐîNw§anëÜÖ¹­íˆvD;àÎÊ;+fflžpO¸' MÃMÃMÃpºütùéâ±rʸ2\Íéåõ}?ïÊ´Ý%î*w°†fšñ8É|QD<Ì0ÃÀAr°(_C 5ÀINrr þg~ÓA¸r¸ÿW><ÇÌhv4 xù9¶ËìbÑT˜×Ìkà¶¹17&j¢& ´ÒJ+˜JSi* †L½©7õà¶¹­n+˜ß™͇ÀóœyŽEßîÛ8£™ÑÌ#çXÑäg{éöҢɌûƒû€Ùiv’å~n®Yr`0À<óÌŶžÇûýy>Ëoõšü8+9°úÀꢳ>çsÂà,8 îîdÀ»æ] @ ±­[¼í·|–ÿ‘gåc{»xlïcç ö¿aÚ‹;Tê¢IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-30.7.png 644 233 144 3171 14774263776 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü.IDATHÇÍ–ýOTWÇŸ…™ÄRhµ­l·FÅJêJ5-´è®."5j‹v·!AÜfW‰ukÜØ¦–Áh\éªkaÀ)´‘:j 5E·Fj MX¦,LyÛÁy¹÷žÏþ0s™ÉvÿÏ/'ßçåû“߬gÖõ#0û•Ù¯ˆP•=–=f« %Ü­£¼ä£’@}¼Ìª©fèÝœÖ|š¿úÖ(7ÊFÕ¤šTêÐ÷ê{ñS§Õiu îRJ)³ÔHˆOý»äÉ’'7Ãõȹ–sÍV sž˜óDäLÃûû¯ñÔ¦”M) Ö¯?ð¨_é=@P9U¥ªD©D5WÍž*VŪX`/{Ù±$Hœæ4A ™äiç5ØÒ¾¥Ýœàû¯E¥ˆÈâr:lŸØ>™œ÷Ü_Á¿°aøåk¬eJû­ö¶öv¤žÐ?èÝc÷ØA9”C9øÙ ü:H‡áÆaß°Fþ6”9”ÉÔè=ÿ³þgÙà+ïûºïk›nÓ'g¨¿†úe©î‚"½H‡±ÃüÄOFÊË«_ZúÒRHZ””‘”ÚôÇMÅ›ŠAËÓò´<(,.,.,ë¨uÔ: Û;·wnï–±Œe‘Ʈ̽2÷Ê\HÜš˜›˜ ‹ÿ¼¸jqjfƒ¥ÆR¿¨+¯+7R ô@é&‡ú-SDä›h›h›€³1M½M½jOZ‹/6â¹?r–Ü\rsÉM(ÝQº£t¬º¾êúªëà®u׺kaáñ…Ç‡æ–æ–æ–HcÞ5Þ5Þ5àíðvx; ksׯ®`_ðôO gÊ>eW{àÒ¥K—ÀP¡~„ñ„Æ„FÕ@îà±ÁcÂÉÚ‰7&Þ€´ö´¶´6X”¼(yQ2Ùdÿ‘ý°.]þºüH|†3ÙᄓO^Ówë»-߉ÌlžÙ,Òó›žÁžA™½ml[÷¶nW³ËérŠ ´´´ŠdWfWfWŠLúPĨ‘Ùò/}¥¾RDlÆçÆç–ï„÷ÂßXûùúóõÓ?ÿžw­GŽ4àO ¦Ž§ŽCM~M~MÔÑ]°_°_°CÚ´i7 ­¿­¿­ÆËÆËÆË k}Öú¬õà=ì=ì= GGGàlq68"?·ñY¨ÚyÏy)ß”„墺 öíÙ·¸`¤ ô·ô·"2E>P½ªWõNœ8£tá g88p-SL1…»qãFáÖú´>Óh¤ öÚwÈl¬ºK¸Ö1l÷l÷&gpúûÕ߯ý`HÇôwF¦ŒyF–‘ôàÂÆ c…±ô•úJ}%F§Ñ œãç@÷é>Ýßmø ¨Z‡Ö1Ýê¼}}6·Í=9ÃÔÕŸ+?yÖ<+ ÂÊìÓ;õNc·±›àôCšüø£&¢00€q†޲þÇØll&ˆ_ïÐ;¢•?/>/þÿ*ø®$gkÎÖ¨»’Ïxfšà2pŒcÌmR›Ð ôü ®ª«X°@›~3ÞÌ7ùLþé»2\?ÔÏ£üºxdßcæ ö¿§}ýÿéIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-22.2.png 644 233 144 3125 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–oLTWÆÏUwšWlƒè´I™­´TKu¡Ýˆà²ØjHÙ%•ÝT])’âv‘Ä FÇþIÍZCh†ÌnTÿ,¢d piúwSl˜‰Õa& %3ܹ÷üöÃÌeÈöë~ð|9yÎû¾ÏóÜ{î}Ï „bY|”•”•”ÃIH¬§–¤–¬ùG ŸVÁ°Ã°ãö_`éÇK?Èü4óSm4õ¸ž¿°^ˆÿB=}],‰…ÅÝ‹» Û⸠ªŸ©~&õÉ>qŒŠBýåúË\\ü ~þq °-° Xëùz½Î·_´ý¾ðDf`ñ¢Å‹„€§^yê•ì·c Þl(­ü5€‰ä‰d™ªH']nB„ÐÇ£XÇóõzOç×õtý˜æ­æ­Bð·íÁíAcg¬`ÔÍ™FW£ ä €r‘Üæ4é  UE§£ÓDä-­]kŽÈ#ò€¼-oaµF­!Ñ@4œ¢ƒÒçùÎF§npÔÍ™í3ÛgŒ`.6'ö4>;‹±T½TõÈ\å&0Ë,ÈËÚ‡Ú‡(ZHûFû)ÿ,[dËü›B¶ÊVÙ ò+ù¥ü2±Îr”A¤|N3kf@CÙã—÷*ÕaÝ ³xÁV !Äúð»Œ]¡ð®õ®å·üÆŸûàØƒcÌ*…JƒÒÐSV(+”àßàßàßJ›Ò¦´-0t˜Ã^¿Kq(ðç>hÐάò^Œ¼O{ŸŒn£;”¢ûIâ!„ØŸ'loúÞô™¢¡pÎXΘ̫|ýU÷«nq5g‡%Ã’!Œ¶c¶j[µwSï¦ÞM¢ú\õ¹êsBä˜sÌ9f!ŠÒŠÒŠÒ„˜ŸŸBGÅQ!¦g¦g¦g„¨¬¨ÌªÌbmùzÓz“0=ù¢ãE‡¸:õAöþìý2O×]«»fŠÊ/â~¢¿Bˆ¯Ácò˜Àõ^½Ç.ë,æ5W×\%¢?±½Þ^o¯‡¼Â¼Â¼BؼzóêÍ«o¤à`ÁÁ‚ƒàÌtf:3ëCCC`YiYiY¹ ÿíü¥ùK‰¼ÿ¾kk¬ƒþåýË!º(æGe7Ënðïñï‡E²@LxïuÝëÏO§räÈ=çkÏמ¯… Ô‚ôùú|}>Xg_g_g‡ÁKƒ—/% Ü·ß·ß·ÃDx"<†þ#ý­ý­°îW9JŽC]·>»õ@(;” Ú K"K"²[paÙÀ²í;*=ÿèùÄoßllšiškµÀZ7ëoÖ߬O6ínÚÝ´¬-Ök ›‡ÍÃæD\sknÍÀÍÆfc³¬«Ãê€aó n$Âäëþ—ý/3™†LƒöPÿº¤pI¡ì†Ù¬Ù,øçúÆúÆÿêñ3Ç?9þ \ñ^ñ^ñ‚Óét:¼7yoò^81pbàÄœ=;zvFGGÁíq{Üèªèªèªa6aƒ“Y'W\ïq¿ë~îlÏϘ¼3yäM¹¦\Ù-Ôú7ÖSÛS ÿr|»óÛ²®äwE‘¢‘’ß—ì*Ù[2¶dlÉ€C–C–C¨òUùª|`Ë·åÛòaSʦ”M)àò¹|.4¤5¤5¤AGoGoG/”%•%•%Aé½ÒïK¿‡g±±wc/‘kߟúü”¬ƒž`OÔ_ëßXì,û7¼UúVéüF< jŸÚ@ ’ÿ߈óÍóÇõtý˜Á…xÃ8f ¥ÈcÖ1+¨í±>£~5÷pî!³êQ# Õ\š Ô!uHuDQG@u©.Õ²FÖÈÐöiû´} mr«Ü ª[õª^PoÏæÌêür0¦§ëë~~Þùçvv€Éxç¨Õ´r­…Ÿbž>|@€)¦€©ø!LÍãXþT¼^çÓùu½ŸwþøYIEMEÍ‚³’wV½³j¾o_8H‡h(PßPß òº¼€$°×óõzOç×õtý˜ŸÇùvñØÞÇÏìû!!®µÏ‰pIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-27.5.png 644 233 144 3151 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mLTWǨ†— ÍP¶QBè8¸!`Všˆ1Œ[W\)–2€–Z­D]×Í–miݘìvCâ¸ê‚¤PKk„€ºÆ0aiÑ HÊKõ±»…òV,…`Ö20÷ÞóÛ3×™¬»ß=_nž·ÿÿÏ=÷yŽ!„±§€ðÄðÄðçývø¯‚þˆÝ»ÍõÛu*„„üã°¶vm-@\C\ƒ6´õ¸žZ/D?”O÷‹Xtš Ía;v¼™þfzD¼ßþKFÇ¢ÇZµ´4¶4ò˜úzêk€ùó; hëq=_¯×ñBñEÅñ k¾\óeØ0߯G€éUÓ«Bði¾;ßm¬÷ ]áóòÆòF>ÓB Ñ´+5J Èï”W”WX–í í ÃÚ°6 œ[åVõ]õ]–q*NÅ ÒÇg|F´ü§OúÊMå& 'À‡­ßÖo¬‡øâ_~ÓÀ³2›EÖ"+ÈT_? ¡ü“V¢•à“ßÉVÙŠ|²G‹,°Àÿ_^¼x‘(|Â'ø€õ¬×ƒ¾~Ø÷þ¾÷õ¬Ìù”BñÓé06›<«aÌ2fß>rgü˜õcKÊ·Šª¨à{ÛWä+g™³ÌY®ZW­«æÍ?šÞÞÞA]²OvÉ.x¼ó±ý±¦;~¨þ¡š%篒’ÉU׎”Ž”D¾ù¢gµtøõ„³U!Ê6‹_ž9<£x¼F7ŒÊÍ…o¿våµ+¢Ý\h‰µÄ cAIAzAº××\¾-DªH©Bˆ,G–#Ë!DÂí„Û ·…¸”)ÿR¾x²Ü]î>wŸ›.n*ØT Ä/úwEîŠÆìo3#2#Dûð¨÷¢Þ“›…8vñØÅE^èQÖ !ĽrèˆéˆÆ?¶½Þöº<²Ñdn7·³¬¿ù¶Þm½Ûzá´rZ9­w¤»®»®»’ÌIæ$3L¬›X7±.¸ÿáþ‡û!¹&¹&¹ìuö*{Œ ••êøò¯å]Ë\~=‚Ęñ˜qÙ ÎwœïÀôÎù¼ù<˜›hšh‚[§oÙoÙ!%.%.%ºÏtŸé>$>h=h=h…êSÕ§ªO=}Ä:e§ì”`¹l¹l¹ Ö9ë¬u6T˜sÌ90¾vò¥É—æ¬sV?‰Ž–Í‚–ØÎØNmBW¦+3øÛÿÞøá‡ Q‘Q‘Q}Q}Q}QA»w3îf€ùùù¸ín»Ûþ´°‘‘‘Bèìì úoÅ T~^c¨1à†e%ÆcÐ…úQÔö¨í²–—áo÷oŽÞ þ«UªÆ«Æ¡)¼)¼)\6—Íeƒ“çNž;y Ó Ó Ó‚„³s³s³sPŸPŸPŸ ÷î5ÜK¥¥ÒR õéõiõi°1;%2%nµ}ÕõU€Ççñö|Ô7QßÈf¡þN?cm%m%Ð>8puàª<²»xçòÎe–scrW宂ôôôèÏîÏîφ³¦³¦³&h5¶[Aa3GgŽÎ[©­ÔV 3ñ3ñ3ñp¾ø|ñùbØò¯-ßoù®&5ö4ö„œ±âk9×r€NýŒùgY/Ï9ž£Ãk?õ¦z7î¾¥ùûÚ“u‡;ܦ˜b*Ä/‘Hà>÷¹h¬°½­ø°Gç;^u¼ Xòë´úÆQã¨gµìÍÍõÏþ>¦¯,®,²¤~¤ÞPo€Tå’\mZ›Ö¦AÉ"Y"踚I3i&`;™d‚zCV§A-[q¬8XÒ¶úñùûhêh*€qÌ8æYÓ¯çéο²7lo0èÌnµCíæ´<-Jà™gXÆ‹7D˜†Š ü.ìµDj‡µÃøðªjghçßkØkøŸ?0+±½e{+dVòÁú‚£Ãر ŠGñ¨Ô,ƒì‘=„A[ëùz½Ž§ã?™•~¿žgùvñÌÞÇžÍ쀪3øƒX?ÍIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-99-red.png 644 233 144 4254 14774263775 15634 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜaIDATXí—kL”WÇŸ÷2rDLjˆ3n©«¬@°ºàš, ´éÔkZ1Ýxù°¢tl›ÖVÙª‘)HV)2h ]‰kݲ«Äê–¶Ñ–D« "FÛeyá½ü÷sÞ¹¤ÕlvÏ—™çœçò›sþÏ9¢‰1•üŸd²Ù¹{&Â&µNjÔº|‰¨ˆŠ¨|óWZH i!0±¬•“H"‰Ìüm­œù³x–å÷¯Ç§øóøòm£m´oö_Ÿ+¶Š­bkócn;·Û®ƒD]F—Ñ…¿¯ºµêÖª[Àš{kî­¹d¥f¥f¥zm¶ÎüY<ËÇò³zÏæ!þþvL%?ÄñC½ ÙÍΟ?;_y»öRí¥ÚKZ¨{À=à @€€ cÃzÑ‹^@·=ë̟ų|,¿½˜Êgó‘)œïçûùþÞs,AêÅÔ‹©å?ôŒ÷H=zàZ‚®…CVvÊßËßÊ"%II«òŠò  ,RÒ”4@Ù©Ä(1€– …h!Y<ËÇòëÀ~õMá:×Ì5sÍDâ^q¯¸·ñ[`)·YŠd«öŽrI¹·Ü8^0^h½ž…1ÌÀ P׫ë¨zÄm€1õSõS¯¿Ü¨4*€öŽjTp3oK¹¥ÄR"[Y}ÆÃøÈÐgè3ô½ú{æ`*5í2íÒæ:õ†ô†`Гǭ|¬œQ΀²GÙÀíªtUÀøºñuðÚ»Ú»'œ ,Tp»ª]Õ0^3^(«÷ÕûzÛñÈ¡:T šJM˜>Ðæ2OÜ*n·^Ý˪òªòªò´Íž#r³~X/õ¼@Zœ²8˜h+˜^:½N«§U_à/ÿx§.Nõñ—¦—L/€Öë­×oþ‰zUyUoT½¡mÖwÖ4§1ÞoŒGùãåwîê2Ìì7§ÌH™1cÀåœË9°©hS„\¹Î=:––ðÂë/¼—³/gÀ¦žM=ܡšÅÌ÷ß¿ÿ¾·ÞãåN?: 0ÆÇ@ÿ’¹?sæ~ï/SXÛ8‡Š†ŠÀiˆ€£™G3}7a°o° †¨|Pù"ŸD>€#G*|ý]£®Qà¸ÎKƒÐëyê3ÆÇ{Z*ÖaÈ0dè=DÕê"š¾/|ÑüÂù…DDõIõIDDîkîkDDÇ;ŽwÉëåõDD¡U¡UDDó¦Ì›BDTŸYŸéç{<–ˆ?à" –:¥N"jð»~‚ -†C‹Þòì~Õr—T,©XR;£Ü(7Ê8¥v¨Ðð'vôÝR·æ+æ+0uÒÔI}(ú¯fëÎրꢃ£ƒÁ_òøS³²f% %Nt"ÛÒÔi©ÓR§áã#ÞÊ[yëøÏž‰òcÛŽ­>¶ÚGÁª¤Jp±øb1©«¯«F3F3àFìX_г[În€ï꾫€kÕת}üåé7Ò½þÊÉÏ^üìEo½ ¾Hþ"Y·p‰\"—8þ3 IB’TTƺÌüódód%Æ‘};þv¼÷úÐÒWg¯Î€èÂèBZç‘Î#`ýÄú ÄÆúÊ,{Oö˜µkÖ.è¬í¬0b­·Öx-nsÜf3™ @* €ø¢¸ƒqUýf 3…™5ƒ–––A$vˆbGS¿~ág¥ßL¿©²²ªÍ¹Æ¹ìi%i%FØÆãÐ5¯kž/èOm?µÀ2nÀíñŒ;wPkºwöuþ¿Þ:ôÖ!uDÜ(l6ÞÈ™°Cœä?f6$ ‰½GY€m§Íh3jéúý1m¼{¼à6¹MÜòMù¦_ÇF"ÒÇ’Ôu܋܋%Oº+y¯¿‘C'œ8€×ô'´Œ/ãËF—s³¸Yܬµ€B—Þ_ë¸uܺ—«¹&®‰kbZQÿlo·o±o]×n¡š¥f€ö¹ö9IýJýÊPÓŠµbЦkÓ-];¥òJ©¿©_ÿ>ÀlÌ‚¼UßÉ„…mÍJV²Š&/k¥Qšø5S35 NÁ)8ß>£?­Õ¦JS¥áxϱñÃW»jZç ˆQŒñØv¤ ÐrÔd5s[{mí×k¿V õhX‡í»£ ¢ ¢ ˆx oá-ÜI]ÜìùÌîw„;\ÛÜswÌÝAdÈ7äòí»uí¦YÒ,i¾ÚUmª ì°Ãà žà‰—[™¯ÌWæ{µX‘\‘\‘¬¥ëoy„!ÂÑ?:a›‚ýOš;pôĘ_úÛ¦à í:Núhw§m§v#ä9 ¤>Tª½ZìF7º{HwHwH·¶J×dƇ½¹+@Їø‚èÙBE€vWý‚vÛíí^íÊír»Üîm¥§QO£žFq®8WœK™§k±EhZ-eRóH/p =gxX‚_ÓîÓÓ9ÂÑähr4 A‚‹‘ÚÚlm¶6ïµ#V‹Õbu·ç/IÈ•€ºžy }`à`oz´û·_ÓËV.[éÕ®}©}©})&Ö5ý$¸\.—Ë}¹È¿ ÿ$ .GÿåxžvS„2¡L(ë]Ä€sKsKsKµƒ c c còuý¨‚SpÚfS#5R#y®ÁP/ˆþǨÝÝþö²ÛÜn· ´‚V¨¿ã£ùh>àˆ#Žþù¥yÄ[Ÿ­Ïªuuu ˆìöûYJ–’¥<àS˜Â€çñ<žH?é'ýññ„vB;¡Å`íñÚãµÇÅÔÁ›ƒ7o ß*Ô µBýÃbŠ˜"¦¼¸/âE¼8ò˜ª;Ôê@î'÷“û½{Ãò…å Ë “ƒ×¯^/®ËLËLËL¾³tÎÒ9Kñö{½@„­¦Õ´ÀœÁ€˜ˆ‰˜b&fbÈ r‚œ0iLCÀ|ÌÇ|@7­›ÖMã’þàÍÁ›ƒ7‹ë$ûÄGÅ)qJœJŠq\t\t\L‹ò~ÕûUïWyˆ¾Eߢo¤™„/|á -Ñ-Ñöh{´=`§Ùiv ëÉz²@Ð Qˆ°;±QÀºÓºÓº@ ­¤__¥¯ÒW ÕÞzo½·ž‡H<åa<Œ‡ý}“3ÎçŒâïÄ߉¿ƒ5º2]™® ·"í„÷„÷„7Pþiù§åŸ‡6Ú|h3ðAÀ===R‚€i™–i|ƒoð p#öFìXà|üùøóñ1ˆAÀµÇµÇµZ]¥®RW E|g|g|'ÖH<CÄ1äYž=z>Ä{Kž]òì’gI¹PÅ…è Ñ¢ëyëyëy`û¦í›¶oÂ«Ã«Ã«š°š°š0À6h´ æ)ó”y ¨XW±®bðeä—‘_F4„†ÐÌ ½H/Ò‹³SÅ’¸%qKâH¹Ä#ñQû¸}Ü>ŽÓGAžú‚ú‚ú,î‚MkÓÚ´€Éar˜@|w|w|7° bAÄ‚ éZÒµ¤k;ÁN°€ñŠñŠñ ’GÉ£ŸM>›|6>Ïù<çóÀWóÕ|õPìÆnìx*Oå©Ôï¨ßQ¿‹Ä#ñQÂ!"aô=GÏÍnW²ûì>»¨&U“ªI`nõÜê¹Õ@ûõöëí×GŒ#ÆtútútúV§Õiu¶ïmßÛ¾tº ]òFÊ)o>}6úlýŽ~Gÿ/@eA è|bŸn£Ûè6Ÿà|B¨Ì_æ/óçç'—O.Ÿ\ŽñMñMñMȈ•X‰\Ú™z%õJê`*a*a*øÐð¡áCÐöVÛ[mor»Ü.·| _—à×’…,dd!YHþbÝ 3̳åK²'›îœîœîÄ ¦Á4˜ŸTGTGTGÄÒßß_átWIWIW É‹!1$†ÀÊ'øŸ€fz|z|zHmKmKmæ{tîQÀœlN6'ÇuÇuÇu€¶OÛ§íû5'¡„ `-Öbí“u–Á2X ;(;(;ëà†Á ƒ 1ŠFÑ(âÕ€j@5 –R衇¾°B( „’×âÛâÛâë ß6¾m|4DGtD‡É›o¼y8µêÔªS«€±Ö±Ö±VàRÐ¥ KA€÷â^Í Í Íf{¾¤c:¦X0 fÁ¿H¦ZZKka“Åd1šKÆKÆKF¶’‰‘ñ?ÄE\ÄuJAý®û]÷»~ø€"^¯ˆ¯1Ç™ãÌq²ÁºÃu‡ë»öJåITTöùõóëç×ÇFŽ,_Y¾²|l©ÜR¹¥ í´¶̇ù0Ÿ'@Ê,e–2 P~§üNùÝì2'¹$—äBÙðnû ï2ËHÍHÍH ýVñ‘â#ÅGßmqšœ&§iŸ“äçç¸Û¸=ÿ˜|L>&kSO5O5O5/ÌLèHèHèà/' ' ' “ë,•¥²Tpçççùùù€Î£óè<gqg$"‰üà¿'ÉçŠrE¹¢u…ºB]Ë­w¶ÞÙŠ¿TÕWÕWÕã’Ú¤6©M¶D.ã2.‹þ ÂŽðž¿RZA+h…¬ƒ–ÐZro7ëgý¬?Ṫ¹ª¹ ´¾Þúzëëü? ɆdC2jÜ-ÓªˆTD*"ºŸî§ûþ€?à¤! i¼à¯'U¸.…kpò±æ±æ±šËg.Ÿ¹|F –÷Ëûåý™$“dò#+È ²¢ç¯(E)J…Y\\\\\ÿ H@‚ðwšOóiþ`.M¤‰4q2Ú•ëÊuå&í5 ›†MÃbìâ[‹o-¾EÿK½K½K½ “<ò@(I #a\p†ÎÃy8ìdYDÁ£žÕ³zæÚ;T?T?T/ü·&]“®I¯) Üÿ¿ætsº9ü Fad¢tõ€ &˜Änä 9¤aÑç‹>_ôyéFU–*K•USüÈû‘÷#oa¢vníÜÚ¹ObíhG;ì0À;ì°PB %À#x'z¢'z(¿6~müÚÈ_¾}ùöåÛ—e¥¾¾¾#6Gµ£ÚQ{¸»°»°»àFnäFÌqÛ©”@¥NtŽ=ÞaÏ`N×ý®û]÷GŽ#Ç‘“{ØÃÓÃÓÃsè\_c_c_£¬´isÓæ¦Íüe’M²I6”ì3öû j¨¡øÏügþ3@D"ÖŸŒ?2¢¦9²9²9s{ñÜë}6×ö¶óæy¾¿s~ßï—ó»çwŽ@’ôŠ÷+Ï Ï g'qø½ ž^–^6÷H·8ZZÿËGÓ”ÓÛšÛêöØŸ÷×§æKªž×+ ÓŽM;*ñðØP¸¡0ýÕ$þ¬2Ú3Ú'lØz|ëq€ï˜Z¾<|`¤d¤ìÏûëý|Ÿ/•_{þ¡/A¬3ÖºÓÒ¦¥IPPZP:g{rÁÀ¨X[±ànänÄ„Àyd‘eJ€qÆñÇ£ìÏ{ëý|ŸÏç÷õ|ý¤AþÊü•¬«^Wñu2¡ï¨£þ ÀH´_ò%Y¬°Û‹6GŽˆƒ¹anqc &q“ýÀ~@Üô&Àw|Àd%&Úqê_¯Ý7Ø÷M Ÿô£¿×¶q ¦*­*Í߀Ä%pz^0 öïöï$ÌM¢D1){ô‡#—\rÁL7QŒ±ÛÇIPáÄœX ¿U® ûפ”R’æï‡ŒáŒáñ(ô;ýÎ$á;üèÎsçñÌLŒN<˜x‰ÁÄ`b0ÅP#4кmݶnã³N=:îM31÷ª{•g zü“z¾~Òg¬åØöñ¶{îb°ŸÚOÁ¼m6š˜‘ÏG>ù–ï[¾où>8]wºîtSÆØõ±ëcס\å*džË<—yªªwTïnòœçpŠœ"à}_ÏÓ÷üxÆ®ï‚oG¿ Ìf ƒâ'îNÜ…e Ë–5…?[y¶òlåTcÍÝÍÝÍÝP\S\S\Ä=YôdÑ8úÉÑ~8Ž;'}=Oßó#È>Ÿ}Þƒá¢á"à©—Òg¾2_©3µ¦œ™ÎLg&,Í^š½4: ; ; §ë¸ßq¿ã>Ì®];»Žì:²ëÈ.ȹ—s/ç4ßnhÖ;oûÿ<}ÏOTŠTD*X(Å~‹ý’²$Iè†,YÊ×jR“iŠˆ¢»£»£»%ÝÒ-ÝÒä ‹.º¤òžòžò©wIï’Þ%Rgigig©¾¾¾#eÖgÖgÖKº¢+º")ÓÓSìDì„ò¥È‚Ȇ%÷¤{2ô«dWÚ•’’ÅÊ—­>õI¡7C³B³Ö5ëšuM"FŒX?8ýàôƒÓ¥î±î±î1éLÝ™º3uÒªÊU•«*¥¼ÇyóK+¬˜¿b~~îéùúžŸ°4^2^òóOÒ…î Ý’B’ÄÛØ²ô–æ+…hõŒÕ3VÏ   ¥xQ¼(^$uµuµuµIÅCÅCÅCÒ¦²Me›Ê¤–¼–¼–cIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-94-grey.png 644 233 144 6210 14774263775 16015 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü =IDATXÃ…—iPT×¶Çÿûôé™ Èeh%(á á>0ÝAM0½FTb*–˜\u-Ë)—¨K[^!B*âÄ^T$HqŽM¯P"¦‹Án5PL@ =ÐݧÏ~胯ò*•õåÔ>g¯µ~µöÿì½6)(((((€¦Í2ý`–²Ù‡ìCÚXðMÁ7ßТGEŠ­Œ¥þÔŸúô.§âTœ*q»³ÖY묥Gq'q’ä# QˆЋ^ôØŽíØNJ×J×J×’|v˜f‡oŸ$ãdœŒÿýDapapapK—>[Ÿ­Ï&#\8Î…“ôi¾ÕËåÇ̦"©L%_ÄñE|«Ëæ²¹lAIEuEuEu•}®׈k¤ùßö{‚=!q¯²LY¦,C}âŠÄ‰+H~²8Yœ,’f'ÍNš cá»0_ðâÍÄ÷æò <ë­àêK}©/¯#ÛÈ6²-¼L. …_9eûÖö­íÛù³ššš=»Wô®è]Ñ˸ÉÒ|i¾4v|€ð°Ã;€wðÞ0s0vg¨3ÔŠ7Œ£Áh îËQ—£.Gñ»GW®]µ¹D®W„/–y¶y¶y¶¥•ÑšCsê˜%äàÔÁ©ƒS 0Àú[ËÖ²µ†s.‡ËárÌ_­^®^®^Î¥fæeæe汕~“~“~“Pƒ ÿ+ÿ+ÿ+X’@H%”P°Â +€X€11ÃS<ÅS°b!‚Ï\},=DÑC€ŸÛÏíçÆŸ„øjZ§Öqoùᬜ•³¦'¹.¹.¹.eÿGÀº€uëhDæåÌË™—YA#F0‚áK|‰/ñœ‰ÎDg"ÀŸæOó§’A2H€b£€rÈ|ŽÏñ9@^$/’îîîÀ½Ò½Ò½¾Bü̢̢Ì"¶2 3 3 “F<C£húÇ›n[ãÖÚ»Ú»Ú»XáWæWæW‰7¯%À` *¾®øºâkàð†Ão>ý8ôãP ÛÜmî6Ø‹½Ø P†2”‹\ä“?Lþ0ùPº±tcéF 3¤3¤3‚ùú]ó»æw m‡¶CÛÀÇp\ñŸïù?õêÿGã^ˆ{!îRá €¢*±*±*p\p\p\¶¿¹ýÍíoѕѕѕÀ¹Œsç2€ÉîÉîÉn€ð„'ü rrr~K¿¥ß qˆ{þû±û!‰ÓÄiâ4¤Bàøç˜sÌ9†ÓóŽÍ;6ïòåUò*yì^wvÊwÊwÊèsõ¹ú\€¶KÛ¥íÂbÂbÂb€ô–ô–ô€/çËùrÀôŠéÓ+Ïóß,¿Y~³èíîíîíd²àÉòdy²žÏó¼äyÉóXù~ù~ù~ØÁaÆaÅœgÎ3çgü¤ü?IJ Ù„l¬ ¬ ¬n]½uõÖUÀ•äJr%!!!€­ÇÖcëD‘D$ž½ûìÝgï-¾-¾-¾ÀºÚuµëjÉuÉuÉu€¶Ñ6Úö*j€†çù™-Ìf €/ð¾ QŒH%R‰TôÂÄ¢‰E‹pŸÛÃíáö@DÄA ‚§®Iפk¬iÖ4kð‰ñã'FÀjH5¤’I¤àns·¹Û@ÍæšÍ5›¨MQ›¢6Që£ÖG­\M®&Wàv»ƒŸs’Óä49=“Odë°uØ:pŸQ3jFM/°²c²c²c\éýàûÁ÷ƒÙÓÅÅÅ$?‰$‘$µP µ@a³ÙÆ]«®U× –––£‘£‘£‘@EPEPE@×Óõt=0|gøÎðÀèt¦SŠ)`dŒŒ‘M M M ÀÔ©S7€UËW-_µóyóyóy(̃æAó >–Ý—Ý—ÝçJEÚ­Ú­Ú­œ?¶b+¶®ü`H;¤ÒzÔ1wbîÄÜaö*¶(¶(¶`¢vOížÚ=^›smε9@äÃȇ‘†/¾lø ”PB5Yk²Öd‘±‘±‘±@<ÏÇó@ô•è+ÑW€Ž×;^ïxXìYìYì4*J£‚“Ô“zRyeDeDeŸj;e;e;EjØ6M8áfB®†\ ¹zä€D+ÑJ´ßŒjF5£уê#ÕGªxv ÛGfIfIf œskæÖÌ­Ž8>؇íÃöa`“Ï&ŸM>€8Cœ!ÎTJ•R¥Â.…] »Ìÿqþó|ô>z=ÔÔÔ*O–'Ë“!­ÙX³±f#oôôôgnJ>•|*ùô—,wŸ»ÏÝ·ÛMöì?Ø  mh›{\üHüHü¨Unm¶6[›ç礵§µ§µÓWÓûÓûÓûÉU^Çëx¨;ÌæïïÌ\f.€C8„C]B—Ð%ÏÒJZI+`/°Ø Å2Å2Å2ØïŽß¿;Žg­g­g­ø—Bª*¤S«¨ˆŠ¨(q#¢èî¿2ÌIæ$sRÔÎ3ÅLñàÞÄ›xÓ6—¢EÑ¢h oÞ6¼Mÿl\m\m\ï¼G¦C/‰—ÄÌ>f³ Ãt˜øâC€,%KÉR€’BRà žàÉ àĤbR1©€¢^Q¯¨Wpj ‘ È™ x’BRHJ÷_QŠR”²¡Þ6Ï“<Ý7²ÿ e¤Œ”]Íc´Œ–Ñî®î‚˜òºØºØºX.×¢·è-z(ˆŽèˆt7ÝMwDETD€ÀtÛt¢†0„!8)ÕG×G×G{vëÇõãzö¸4\. ÿN¿àè‚£ Ž–\A! QHÎÁL\šÐ*ч>ôq]؉ØIjc¿ý>öûÒ¿ÈÞ“½'{ï;ýxÀxÀxk¹x1ðbàsíânáœ0Â#'œpC 1@“hMÅc<ÆcH2ÿdþÉL_m“¶IÛ¤¢R¥B©P*¦\ç\ç\çöé*ì*ì*¨™š©³¼yΠÂItž÷á}xÌêêê\;];];÷Qú+ý•þÏ÷ÖõÖõÖ‰J74nhÜ@_%y$äAÊŸåÏògA…f„>£Ïè3€p„#OÌOÌOÌø®9¾9¾9³”#ÊåÀ/âñ‹ö™–ÞÀ”WŠÇ§qhºpaÃõ^I¤Þ¡w‰D¥hF3š=»H*I%©¯þeúÊq¥ÆëÎuçòÛÌoæ7óÌÒ…Å ‹c-ßÃ÷ð=P0ÑL4 '—Ïåsù~ùYäg‘ž#)#)#)¢{²xY¼,¾tñôO³û&_ÁWðìqïÊîVL¯×ëõzL…÷ÅŒ†¼ÚÝåÕîq¯v/Íh79ÈaÊëÜuî:7—k9a9a9Ã0 Ãà™P‰G‹£ÅÁÛ***D÷dddºêƒÎAçà’{¯Ý{íÞk€PíõS€ß èo€… o€½Ú­ùÚU«ÆU¬¥ª ª ªÀ³ËÛÑÏ2Î6Î6ÎÆ×†vC»¡è=ŠEÀ«y5¯þ[+ûûû–㕈äˆäˆdf̛OÇo¹DøÓh4œwh¤*¡òß#1#1#1øÊæ ó„ý›“FH#¤ë˧=N{œ6û{K·¥ÛÒM?é<Óy¦óŒg‰Õmu[Ý¢â¥â¥â¥{Bé z‚žøŸzH!…TôcÃ?GXo¡¸ßòüýŽv‹ÐˆF4z i-­¥µSÍT3Õ×"¦ÖL­™ZÃLj+Äâ ¦[”#Êå\¾YYY½Rc6™Mfùâƒø zÊ·Î hÿ=`¿Ñ®w»ð"yÈco“l’M²¯GÒFÚHÿþŽ|ž|ž|Ó-êõ‰úçñññåõdõdõdÓ€ˆðÆKÇqü/ú•Öãº}¸IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-61-grey.png 644 233 144 6127 14774263775 16016 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—{PTGöÇ¿ÝwÞ:Àª *>0ZÅ€bHR(Ü$˜ª ?ÖXŠ…¿¥ÄÇÂBÔĬ,‰Ù²Š@v£âjT !5¨?~D£‘HÔQDp"Ôð Ì{»÷æbÊT*矮î{ûœÏ=}ι}HAAAAAL˜”¡É®Ru«ºUݼ¡àÓ‚O >åþEŠ=XÁ}¸÷9ð?R€ ,~ÓUëªuÕòwQ T|„! aÚÑŽvoâM¼ÉßÕ®Ó®Ó®#ùªU?ª~¼ZAÉ ÜQ^8«pVá¬Æ[ÅéÅéÅé¤O ’‚¤ ’4ÉÁ¾öp™è`,bK«X+bEìkÑ):Eç̘¢º¢º¢º*‡Ø'ö‰}ÖËc ÇŽ-\üã!ã!ã!Ô/^½xõâÕ$‰z‰z‰ˆñññ”¹ò\y_Ù¯è›Òï±§ØWx>•ǃ+ù4>OcI&É$™A‡„ !H:÷±³ÒYé¬ ôõ³úYý¬òöÕí«ÛW·Sw¤-Òi#/hóµùÚ|Œa'vb' ÃÆd žÂSx c®9®9®9xÁÖlk¶5s÷Ù°³agÃØöþÄþÄþÄ´‚ A† :9SΔ3ñ,žÅ³º7Е”íb»Ø.vóq>>Ç[ð¼¯s!â°8,~?ÿùùÏÏ^ŠÍžÈžÈž¶LzŒ8µ‰ÚDm"$–Ä’X ÜÄMÜðE|_pîÏýÞÀx Ú—´/i_‚¤ìÏve»²]ÂE¿bO±¯ð(|TߢoÑ·jµ¿ÚÓØ—c_Ž}ø|pJpJpŠôBVzVzVºêÒôÚéµÓkñ9YN–“ÜÃ=ÜƒŠš©™šT¡ Ui!-¤ d€ ä09Lp 'T˜Ù˜ ˜œ&§É‰?(úƒ7oÞ ½ ØWx>*J£ÒhRŒX#Öˆ5é‹üRýRýRyHê‰Ô©'TJŒŒð>ÂG0MøLøLø ßßߤP)T H I!)¾ÃwøÀB,ÄB›±›I%©$0þÖø[ão0à 3¦)úS+S+S+UUŠ}…Gá£<Œ‡ñ°¿ýÑçŽsÇ–«–«–«Xm:b:b: »Çî±{˜Fž#ϑ瀺§ëž®{ثޫޫöíÜ·sßNàòé˧/Ÿ°k±`ëØ:¶À7øßM«šV5­NZNZNZt¡ ]€œ#çÈ9˜f:j:j: ¥ÕÒjiÅj…Gá£Rˆ"…,ËöùÉç'ŸŸðn”%Êe!e(D! ¡¡sé\:¸r!åB paÙ…e–ßf|›ñ-hO´'ÚÊ·+ß®|x´ëÑ®G»€Á´Á´Á4 ¼¥¼¥¼ø*ú«è¯¢BCh¦„ÖÐZ35ÕDÅEÅEÅ‘2…GáS¹\®ü+")")" ùú‹ú‹ú‹c¬€À@AAÜ,¾Y|³X¹"rE$èèè̼9óæÌ›€_£_£_#`Ì0f3€ÑG_}ðoòoòo†çÏž ð•|%_  è°[±àùF¾*}•¾J_…1ó³ægÍÏ"¿u u uT؇}ØGÂè z‚ž˜ú2--¦Å´˜pL8&Àpòpòp20œ5œ5œØÚmí¶v`¢d¢d¢ˆ ˆ ˆ ÂÄ01Lttt€äÉ3’gƒë×®ÄÍâfqócB€@+ZÑú û¯Ñ×èk>ÂGøˆ„Q!@øÉ‘¥#KG–¢ÓÝëîu÷BðlआÔ@t‹nÑ ççç[·lݲu ðú²×—½¾ ˜¬‹@[X[X[@gÐtÆ/€²‘l€’@ø‹õ~ô£ ¤ƒt€+øÎVg«³4˜Ó`~’êÞÓ½§{O*íœÕ9«s?yÝyÝyÝ9¥f\›£ÍÑæ¦&S“© n n n¼ë¼ë¼ëóóóÀ;È;È;ŠŠŠÀ¯„PB °k°æñ:Ëd™,€ Æ»’»’»’û}û}û}ü]שëÔuJ¥*¤"©…ªxU¼*~ÿ®³‰gÏ&ÊÁAAAB—o½o½o=FÂSÃSÃS1­In’›dÀl5[ÍV woïÞÞ½€¼R^)¯æÝwwÞÝ_ƒ231À‚Y0 þE2¢§è)¸¤sÒ9é _ÜýâîwY,‘ˆD$z‰Ä‘8÷ñõ?ïÞÿü;»5Ec©ìéééºÎŒž=3*çzôM³h,‹®g>xæƒg>Ž 8\-¹ZrµxÙü²ùe30;vvììX€Y™•Yi³µÙÚl@{C{C{cj™“<’Gò ­Ý_»¿v?ë9Þs¼ç8½¤y_ó¾æý¯¸n‡Û±ÝMöü°ç‡=?¸‚+¸2ûCõõõƒ¯õ£ÖQë¨50+Á–`K°ñø¤;Iw’îó<–ÇòXpñ¤xR< ¢T ª!Zˆ¢ä"¹ö`öðƒü1FŒcy‘¼H^è+ôú Œ]O»žv= ª¬®¬®¬Æz‡Þ¡wL$r \Xü'„#ám¦´‚VÐ ¡…¤éÁû[Yë`™¢¡ÑÐhhšSšSšSøÓ¶[Ž-ÇÉ%r‰\¸f§f§f' D QBÀoðü€<ä!ï1 888 ‘5²FžùÙð³ág õŸÔRÿ‰¬îPw¨;2BFÈÈnF–“ådyÛŸQŠR”ªæqqqqqqü#$  ª¿Ñ=tÝÓ•Gi"MY,ïwÈ;’rß;¾w|/­Š¼y=ò:ý«¾D_¢/Á?ÅOñSÐ’xOâxÃÞ\pÁ Ýèx8çáp‘A"`¬fÕ¬šÉ¹ÝÕÝÕÝÕª † CÆñâБББ¿ü»?£?£?ƒüvØag’r5ÂÒ-lÃ6l#µg"ÎDœ)]¯ËÖeë²ú ú ú©†Nyò:åõ8vññ.Ø`ƒ À8Æ1@ -´_Àðà$•¤’Th/Ú/Ú/Úyü•ú+õWê…Rã,ã,㬞 ±J¬«òÞ¹Ux«ðV!ÀíÜÎí˜î±sTóŒ'˜ób^˜~­÷Zïµ^@Ü&n·å½cô1ú}ºO´×µ×µ× ¥ 64làñd3ÙL6CËŽ±cì8ôÐCða>̇ÉìÅø#û#û#;Ž[£­ÑÖhL7öûŒ}[Ê–²¥yïL†^Ï„'?ôäZ’’‹DI?OK¢õL]žº[ +¬°Ê¹$–Ä’Øøõ“-ǹj÷&÷&÷&¶%¥±4FWEŒ<yëØmv›Ý††Óp—”/åKùÐ=z8Tžß·¼oyßráŽ.Z­‹.]1™4Û/±2VÆÊTzNv«rbÅÅÅÅÅÅQ< Ï‚kêHrîdÏ£ú"‡È¡ó5ÔB-Ô²½YÈBýg»Î]ç–6 •••Ã@)¥”bXñDãxãxã8ë)ë)ë)îèvëvëvߪwÝwÝwÝßý;k﬽³ð*Ö NÕÛ' ó/< .xb·úW±00 ú¼àó‚Ï ä\ÌÇ|ÌÇt›¯Í׿‹#Í-Í-Í-d£á¶á¶á¶Rð·|­zUõªêÕñgC–„, YB<ö^TþˆOr ø ™¬Yåw{žßùüN€ïþSfÐî1Ĩ-€ Ƙ ÁÆ|À߈7ø ~#Ÿ‘ß_@BNBŽïäÏåÏYZüÃÐPs¡æ¨A¯?ÑL31 ‰&Àï}?ø~À­þ®×ëõ@«zO½ n©[À¢V¢•à߬ohäˆQ ð9j®Ö\5 þ€¿„„YZŒzä¿÷ö­í$¦¦ú€÷ð-ß‚zVÖ£ñªBµQmD©—Ôkêµ¥•B­P+Ô `YdíD« 5RñšKsá5VTwøwVV¾µ=d+ED~ÚÀ_-Z>t…ÃØª±Uà= À¯ïoh›hcÞ—ë{Å÷J0Ÿ·À[à-€ûÛîo»¿ |u¾:_]HAµÔR„žï¼QÞ(˜ê™LœLd^ñóÃhÝhðå†å†+ܨG”ID¤ù:Ök0wŠfô´_fnJÞ” ÖW­ÖFTq^qNqLVMVMVAN_N_NXG­£ÖQ(l,l,l·ÍmsÛ‚9œ Îø•äyò<Ý==Œ*9Yt¬è0  §Á¡ÞC½@œ¿ñ劈ü£ºÝNh3w~Ùù¥ªÈŠÛèØèÀ=upªlª RfRfRf r¼r¼rv8v8v8`ºtºtº’““¡Ÿ~úC®imÓÚ¦µYšYšY´ÿ|2¥>¥÷Gïôè9 *àêÉ«'Á÷g=ƒ8GœCÙØu¯î^ÈV¸Zœ•ÎJÈ>]™] ñëâ×ůƒéäéäédXì]ì]ì…ͱ›c7ÇBü\ü\üLdMdM„œ1ûûûXsdÍ‘5G ½¦½º½–Ý‹»w Þ~ñÝšwkܹŸ}-úš²™yß4gš#Yì±Ûb·‰|¥9,Ó·æo­¼µRäÊ®4\iY±:cu†H}Y}Y}™È]ý®~W±÷Ûûíý"+®<¸ò HwOwOw,ÜêÜêÜj‘òôòôòt‘®—º^îzYÄ|×f±”[®[®Ë´HDjDªˆÉVVL²Y]ÑökûM߈D|ñ‰ÈгC÷†îIÂÞ¹½_ìýBdàý¶6Ï‚gÁ³ 2²gdÏÈ‘’Ú’Ú’Z‘Áƒ'Oˆ8Ï9Ï9ω˜ÊMå¦rÛ mÐ6(ÒŸÛŸÛŸ+Ò}´ûh÷Q‘­ù[ŸÛúœÈò™åŸ/ÿ\$ûx¶5Û* "Љ˜“bÈôP8c=w|¼ÔüµQoØÞ°áÎèËèÌè„–Ž–Ž–ŽàvœvœvÀ†›nn¸ Ç.Ž]ƒÙðÙðÙpÈOËOËOƒ™È™È™Hh(h(h(€ôíéYéYðiaç|ç~Ä>ÀÀ¿üz¸Ä×êó©K]Ù|¨pº’;ÃrÇrÇÎG3G3A{Õ¯3Úï<—<—˜×Óõô€]ìd'hgµ³ÚYÐNi§´S ¯××ëë2Ê(=IOÒ“€© 4þ´þ4h?ó¼îyy½zIÇž}ðYF,#®p:ö#å§(ª( Pe^Ô®i×ôýú~¼K¬pãY`!d…ð€)¦ *ï6øŒ›¥(²(òÿ*த ¤ $ä®äøãÇ_"°uÔ>—Ï •j¥¸A ¨L˜ ˆyÃ߈7ø ~#Ÿ‘é®|h_í{ìá|ÁþIàðcˆ½tIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-96-grey.png 644 233 144 6333 14774263775 16025 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—{Pמǿ§»‡™é O/ޏd€"A 1B¢áá%AQo™ q]ßJ‰«‹ÊkÌ©% jÞ-ù´h›Åfè~Øý°û!°Ä±Ä±Äøô=è{¢CtM»›v7íj”5Ê%б­c[Ç6@~X~X~ðWù«üUÊvÈvÈv@”œ”œ”œÄv¯v¯v/Ù*QKÔuÈF‚…àgöx?ô~èýo=íþ´ûÓî¤Â èæ¼¢>ª>ª> °ÔYê,u@ÎŽœ9;€ÐšÐšÐ ¦¡¦¡¦F…Qaè¬ì¬ì¬:r;r;r̮̮Ì. i,i,i ¨.«.«.¦”SÊ)¥+ Ü"$’ ©pñ¸ø8ë¬uÖ:‹Â’Ã’Ã’‘/¿-¿-¿ ³Ó‘_ðXðXðôgõgõgÔþÔþÔ~@uBuBuPžWžWžzò{ò{òÁ¾Á¾Á>@W©«ÔU±l,Ëb (Kï-½·ôà{×÷®ï]@±U±U±õ1(ÇÇÇsÀ³Ï<‹üÞÙÞÙÞYœçpgq–¬dj™Z¦ö±ƒTœ§Ä)@6'›“;±¾±¾±@×d×d×$¾6|møZ —ô’^X£¬QÖ(Àð‰áÃ'€á Æ7€É˜É˜ÉàÞÆ{ïmJJJ˜Þ˜Þ˜^ äjÈÕ«•S9•ÄB,Ä)óó󀋸ˆ‹d%Ãú±~¬­›[7·nnF„cÂ1áX§u‘§}“öMÚ7À|â|â|"Pª-Õ–jÍ1Í1Í1@ÂKx Àîpl9¶[ à¼‚ì?°ÿÀ~`÷3»ŸÙý ÐÞÞôÏöÏöÏ>tåcM½¦^S/F5£fÔ´Ž‘½-{[ö¶P6¢QŽ(i]_I_I_ @Vd,ÔHÔ˜˜˜iii@Þ…¼ y€ .ƒËà¶›íf»¿¿¿À«Þ«Þ«P+ÕJµpototo>ø8àcÀ=Â=Â=0Ôj ÿ¬¤E—¡ËÐeºIݤn“ÈFd#B‡T¤"õÌe.KàþúmÊ6e›Ò¡J J JbG}ª|ª|ª0×~´ýhûQxŒÇŽÇŽÇ¯k^×¼®¾®ùºæëÀ[æ-ó–+¬+¬+¬€þ°þ°þ0p3òfäÍH (,(,( ˜*˜*˜*“ŽIÇ$«kM444ˆ1d3ÙL63wH‰#qÉá„Ì´Ï´Ï´WþhÊ5åšr_ó) ) )uÉQå¨rTl™Éh2šŒ°Ö>Yûdí“®\=¸ð/ö/ö/R¤H=øiý´~ZÀ.Ø»|5ñÕÄWÀݬ»Yw³/½—ÞK$ë“õÉzÐH!Rˆ@®¾tõ¥«/‰æÎ¼Î¼Î<†çM¼‰7ýÏ.{£½ÑÞ¸þ]rzüôøéqÝèF÷¿¼#™‘ÌHf:äó­ó­ó­Ù‰=‰=‰=4!yOû¢(d>d>dþøÇ2e>Ê$‡:èDÁÕ* ‡z¡‡p‡HCØ—a_†}Y¶M¶G¶G¶ç‹"ÃÃÃÎxÅ÷Šï_ǧŸºÐ….X¡…ÚÿsÆ;n§ÛévPò&y“¼ émÝmÝmMèþ¶ûÛîoÙ2…¯ÂWá;±`«¶UÛªóÎõŸé?Ó :ª£:x:Ã|æuDµâââðì›ê›ê›l‡l‡l‡òÎ)¼Þ ï±ÚÁÆÁÆÁF¶¬egËΖ4ì#ûÈ>HÅJ±R¬…rÈú ý…þD€åîî_´F¶F¶FÂS1­˜VLâ:q¸.ïÜ¢ô&œR|Çù™É®ˆ¸¾ÜùK"uÛ[†V´¢Õq„Ä“°m±»y;׾׾WÜÿªøªøªÈlˆ(‰(‰(AŠ8 ˆà™P&” …UÈò…|Hßy?äýÇSÓë§×O¯g‡d‘²HYdYìâ¢9zG¬+Ä îge¸*VTTTTT„9׌ÂyÃú¸¤Ç‘ÅîÅþò_1ñL<´ÙÈF6ón£½ÑÞhö///g†aü⚉––ÑÑf´mæÙÁE¢@‘HjFjFj†HçæÎêÎj‘u]ewÊîˆc(ãþ‚û ´F9Q, а4} }`™[8“ÑÑmöñë ÷„;ùÛÿÎùÉÔ'Sß›ß›ß þ=þ=þ=Ðp·ánÃ]ІµamÜ>·Ï탴pZ8- m)m)m)ÉOéðøÀ×çëóõ%ã¿ÊöàêŽ~áøÂÁàÇztžcžÃìK5oèûô}Z_Ê™¹#sG$¯ýFç`ç dý9|hñ¡Å"u=uêˆÜš¹5skF$ûTö©ìS"­7Zo´ÞiéoéoéóŒyÆ<"9í9í9í"Çå¸c—±ËØ%R[R[R["RSUSYS)2ú˱¡±!‘üŸçŸË?'Y"S¯N½*bËV½ªWëãC‘ÿx¡½º½Îõõ6÷6«÷K*ߎ¼!²6s­c­ r r rà‚ï‚ï‚/¹óóÃç‡ÏÃÞèÞèÞ(Dú#ý‘~(Ï,Ï,Ï„1טkÌõ•õ•õ•Px¯°¿°šs›zšzˆ$Dç}*O•ž*ºãó$ôëˆv”î(µèÌ0.€÷¸7K·®©kêè—ôKú%0;̳h PÕFµqÖoy•«\L¢DŸFÿÒcz Xgñí8¼ã0ð$>p&®à 8“©êßåå``­1ŽNóÄ8hô= ÚÕiu:É«Nª“ê$˜õf½YÜä&7ÁL7ÓÍtÀC!…`œ7FQ0vG[£­<1WÄñ¹È ä8ƒ“©Œ'tìånÒ6iÀƒ„2?6¾7¾šef±Ä®``„)¦˜JädœñD%(”ùžù1ÂF·Ñ=[ù7969žUþä]IEUEÕ¬»’~œ¼:ZÏøŒtÐ'õIc‹±…¨Õ€†IßÊ[õV¿…gá?½+üñyžç×Åsû{>_°ÿÓ<¥S ÔÏ IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-169.png 644 233 144 3033 14774263775 14771 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÐIDATHÇÍ–mL”g†Ãç˜:ÕMj ´0Äî¦i„‰6.i!…ˆD ’flVMºînB)ºþ(Y ¡«Ý]—%%«kµ6@¬5)ÒjênÝ"Ý"­à8Ã2”8¼ϵ?fÞy§»éß?oÎsŸsßwžó<""òXü/àÈsä9²c±ã—öxÖËY/{ÎÄⓤìIÙóßAN_N€»ßÝoÞ¶c ·ò“ëElþd=k\{ ó\æ¹”òxü4>×ø\ÖObqÏup^p^XÕaÿûûßxoà½~óŸÎ °X¾XvláV¾Uoñ%óË[ÿ£/éCéC)3™‘™!OU>UYøëXÂt!ÔÕÖÕ|—ú]ªr€\¸T9°Ì2ÖNŠ-<žoÕ[|¿¥géÇül~qó‹"°û•ݯ8ÿ+¸íGo{²íIKO»ÀÏy×p1 è#ÆãQüj¿Ú*`Ìð{U¥ªŒ77‰r\ïÕ{AÝ …\ü=ÎGœ_ë%ôc~ì¥4EDÞ~ ¤A†ÆU»~D?ê¶q˸…¿aûÀ¼d^2/%f Õ«zU/¨§U¾ÊU¥šU3 è¦M¥A#ÔÆø¡ÁÝàV-}IÞl?ígÐ\Nƒ©•©`€P“j’µÕk™k™ k£Ú¨mD ka- ¡ÖPk¨ÖCë¡õ¯ÿiýÝõw!|%üYø30ïèCúkq¸†™©Ñ©Qç‚sa9ÍòãˆÙûm‰_=úêѺÈV×V—*¡]/ÑKd8rl雥oÄYUUYPY rå_W¦¯LKâkIoIoI)ˆD ""ÕwªïTß¹Ûz·õn«H}]ýîúÝ"ùÿÌÿ(ÿ#‘¦?7Ýüµ8eÚ¸aÜayzë [_P%ÒÙüxóãõ„Ÿ˜ÃÏ_çÙÁÜÁÜÄ‚übuáûcß#º£}Ç¡‡ì³;™ˆLD p9p9p¶ßr|Ëq¸éºéºé‚ޮޮŽ.ðöö†JO¥§ÒcÏà¶È¶¹msð·Î3ž3¢–žq×ÿ…ÿ ëP|þº@öÇÙ«s¬Ì?3ÿ p;žzÈ,5KÁØb‡Ïჼ]y»òvAÓpÓpÓ0ø'ý“þI(*+*+*ƒÓ§;Nw@Î\νœ{ð‡¿ãÇo6ö|ÛõmX~ÜÝÍ/!|/|8;öJ™Ìv¡÷ª÷ª÷*ŒMMMÃÙ™³3gg ´³´³´ÓÎÛ¹a熠;£;£;úÎ÷ï;EEEàw»Çá¯;ú=ýöL†æ`E°,?óóƒ”/½N¯MDD6§ä˺¬Û{I]tYI]I]Iñ½AoPäþìýÙû³"§ Ož*Y¬^¬^¬ ùCþ_äbîÅÜ‹¹"###"›þ³iaÓ‚HÙÏÊÒËÒô›!ãyãyÛµÇ\\ÆckÎ.=¢G¬=í5í5í5¸¸¸fÏÐ@Õ@Õ@lŸØ>±}ú³û³û³m¼§¦§¦§J½¥ÞR/ ï®®MÀQõǸ^pð«Á¯~°ÇDDNŽÁÁ£Zùf1è˺ÝÑYbɤ€ €œàDÒø,³ÌTP,²ÈbÞχ|ˆ¢X÷èž$½èÁ7¾a;9–ÜÇæóËi¨)mJL«™mfkæ>³ÇìQA´uÌ43ÍLã€qÀ8f¹Yn–Û†H¬¡ÏF#˜mÚ-íVRÓ§¢SQ@9çœsv“Þêo¿ Y YvçcÜVͽæ^´xïW€Ž(LLà!yÇT¬-ž ЍÙd6¡ñ‰ñI2¿¥÷ÿGîJÚrÛ}M»tÑ…Ë^b£Éh" 꺺@ )`ÇžØñz‹ÏâÿÑ»ò‘}]<²ï±Góû_·à ë}òIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-86.png 644 233 144 2550 14774263775 14712 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–khTGÇÏÆW’UcP%M@¤1R šú¡‰!Õ»$Š¢‚ &Tªø$`0TÄÚJB}T›P_Å ­OjE«iV±b©Æh!!4šèÚÔxïÌüúa÷î]ÛZ¿:_vÏ9sþÿÿ=3sfDDdHøW ftÌè˜Á!;f…ëÍ‹ÍK=²*ðÌóÌû}+$ìKØx8ñ°ntm'îÌÎqñ£ù¿ ×1 v@­''loƒ…é Óc‡‡ì¯ë îtÜé?m(9SràÔÑSGù77ºrºrÀµ¸3ßÉwð¢ñeÛ?øE ß…~<-0 ÿ€þ"<3yfÊÚЄ?R àó‚ÏÚû´÷11 žhr€ AœÑe;ñð|'ßÁsð>‡?¤G`ØŒa3D`î⹋ã¾%4þ›“6'6€u8ÈAò­½ÛÞ æ¶=ÞO/ß™%f ©¤ÇÍ ³ÌM{œ=Ž^¾´Ëì2ˆäGðÂø>‡?¤GÞ^Û=ŸÁ‚رÀk˪Gõ£ÔVµËŒ6³Ì,ŒS"“a¦˜)`jL©Ý¢›us¤‚˜¥f—Ù…a°Ú 6`z­^9øa¾¿D šð ÄâÁ¾ðH=RÜ9ü¤‡ëáô8Ž7uo.¿¹ Of?™ýd6ØCí¡öPWˆÕbµX-ðtãÓO7‚•n·Æ»q®èQzToŽËçð‡ô„…üV–¯,w²õǦÝz`=p?¼«¾ëJ×ð½ô½ô½„þþ~(\T¸¨pØévºEÞ"o‘¼•ÞJo%dmÉÚ’µžy~èù!Ïܳü–ßåsùCzbBu›vV${Sö¦pÅ3ÅtRMµ¼qõKëKêKDš®6]mº*r騥c—މ´7·7·7‹”Þ/½_z_ävÂí„Û "~Ÿßç÷‰LHœ8!QäáȇcŽ•-R!¾gÊÛüÓÎ ¾6øš©…@F #joü¦+u¥k?K}–ú,Ò&¦ML›Þoƒ·r×ä®É]•y•y•yŸŸŸÉ’,ɾU¾U¾U,–Ë£–TôM}3ÊŽð‡ô$J¤@gGg‡{ìU¾aG =Ðv í@d-ÏZžµÜõçr¹˜œœ„üÖüÖüV7>={zöôl¨¸Uq«â–ëW9všÝfþž¾"úœ>çy bÚ…ò‘ˆÜ‘;2LöËzY)½Œ,Y0²@¤Õnµ[m‘Ú=µ{j÷ˆ´å·å·å‹Ì¯š_5¿Jä¢uѺh‰TwWwWw‹t<îxÜñX$9)9)9ÉÅ“²]¶G¬aa~‰è m¶†MPó¢æEd!‹ùE-SËèåS2ˆªÜÞ{{ïí½™I™I™IPµ®j]Õ:7~|êñ©Ç§BæõÌë™×áHü‘ø#ñQ+v˜ýìêT±*¦7Âáéyç©DÙ]v—»åøŠìšh¢‰ s×Ü5wjª©Ž 4ÒH#PN)¥QxÊî¶»ß}*ßÝÇl§ÏèÕz5=4ÐK/¨ÕIuT™*Se Çè1z pžóœ¢St ¨U¢J@¢'ëÉÀÏtР×êµô¸øÿÛÇþ£ó‡Ú¥T½ªÐEº+ò޼âUø¿!zh4ðú­;Ô€.ÖÅX.žƒÿÎÎÿž»2pØÉN‚´ƒj‰ZB/˜:S€¸¶wæ;ùÞ{ïÊöuñÁ¾Ç>Ììß®‡ /G5]IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-27-grey.png 644 233 144 6306 14774263775 16017 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü {IDATXÃ…—{PTÇ—Ç¿Ýw†y´$(J `0_(‘‡†×ÏçÆ·¿BIX ƒèRþ¤Ä55H¬ˆKÀ€1!ÈÖÆL¥5 »ˆø³°@]g (ä1À sçÎíýƒMY•Êù§«ûvŸóésÎí>M222222à‚inè*I·¤[ÒÍj2~Ìø1ãGöfÖ³¬gYÏþÀ\™+sÍÙ+x‚GP’¥ÒRi©d§pçqž¤Ãþððð@’ÄNÉ6Ë6Ë6“tÉï’ß%¿·ž'#d„Œ-ÎtÏtÏt¯{˜ŸŸOoÁ[ð&ë§9Ä&;— } ‚„Ћb–˜%f‰Mü$?ÉOÎYžU•U•Uu±‡àøímÓRÓRÓÒ W¨ T¨Š Š Š!é+¤+¤+¤Àr·ånËÝGßñÝ1ß±Þ¡ï¥~»=‡}ƒOb÷`8sfÎÌYŒ#‰$‘$zpÞœ7ç}½d²t²t²ô-·YÚYÚYZ[ZÌ£˜G1¨5°=°=°l”¥ËÒeé0á|‚O „ &˜$  æb.æÂdñ´xZ<±±ýFûöÌZï_ï_ï/¦½XóbÍ‹5»ó”ÞJo¥w¨Ü–hK´%F0 Ó0Mw §â1ñ˜xL¼ÉÌÌÌÌžop3¸ÜŒë¾ü?ƽuW½A½A½AIžJžJžâL{ŒLÊÖÈÖÈÖ@׉ëÄuP2æÂ\ÀX Š…b! ‰Ab”²õ²õ²õë÷~½÷ë½_sÔƒêAõ  ¼À oÝ唜’S^÷uð8øÈɦ“M'›a¦0S˜y¡urÛä¶ÉmñËÔ¹ê\u®°Q³E³E³ERÍV³Õl5Œlœ³q8Ó»ô.½ À kbM¬ ËÉr²@ @„P‡:ÔàÀƒQˆBœKJJ„ºd]².YR­ªPU¨*~l“ŒIÆ$cÿD… aB˜X¿œ¿Æ_ã¯Å/›µ}ÖöYۙ;®î¸*qäˆ~ðƒœQŽr”S]S]S]€pF8#œHI ëgý¬à=yOÞà'ø ~༑7| _—¦ S…©ζp[¸-Æ«v¬Ú±JrqÖ’YKf-a¾Ÿ„ù3æÿÙ6«Êª²ª€ÈÏ#?ü1.µ.µ.µp²ƒ*ÇÆÆ€KÑ—¢/E½Wz¯ô^h+m¥­@Ô¹¨sQ瀰ذذX  ª ª ±ØFl€d¶d¶d6 ùNòä;€µ°Ö„ä„ä„äÀy­t­t­¦÷6¾·ñ½ˆ©PW¨+Ô€ÔSê)õül|_Á÷Ýd×!×!×!œZ¶(lQ)ÂQÅÑ— ¨í¨í¨íëëëM¨&T D¦F¦F¦×ö\Ûsmн¯{_÷> 6"6"6س3fg °Û¸Û¸Û„Ÿ ?~àU¼ŠW ,<²ðˆÃ œ×.®]\KŠ<>‰eØ2lƬX°éŠfE³¢&FeJ’CrH`\d\d\¬|gå;+ßæ‹óÅù"0§uNëœV .¬.¬. xNŸÓçK K Kæéæéæéª¢*ªšÕÍêf5ʇò¡<°àÖ‚[ nâRq©¸å]å]å]˜¼Â¼Â¼ÂÞ6Ü6Ü6ŒŠ“8‰“ÄŸ^¢—襗;“Á>ðyÙLJ»>Üõá. ²*²*² ˜>F€F×F×FWÀi³Óf§Í€÷ ïÞ7^­£§éiz¸z;ôv(ðôÄÓOOÑïF¿ýî«y8ˆƒ8øÊ>ý€~@?ð=¾Ç÷ÄŸrœçÁ~6ƒÁ0‡…ÃÂapä2¹L.ƒ±^ÖËzÙSÙSÙS gnÏÜž¹ÀWg¿:ûÕYàfåÍÊ›•ÀöùÛçoŸx¨àÓÀO? öì Ø 0wæÎÜ_| >ÀZg­³ÖAAAðdÒ ½è…¹kSצ®M€¾Oß§ïÃÈ rƒÜ äSìÀìÈO€e¨t¨t¨øáÛ¾ýá[ ,¥,¥,¸8tqèâÐÖÖýÐA~äyÛæm›·íÕ¸¨µ¢ áG8d•_T~Qù…hê-ë-ë-£ÿt:ãtÆéÌÿÅZ{¬=Öž4+9ñäÄ“O´ -ó ¥Ï¤Ï¤ÏšyyyoibºcºcºYÔ:a°N ãOÆŸŒ?“š¥f©Fa°°pqqh'í¤€©ÏÔgêdy²`;4òñÈÇ#K e~2?™_Y¶ú”ú”úTÞud"™¤ñ…hG=ªBzÐ#<ÄGø‘Ê€ò€ò€òü-òƒòƒòƒeÙ£µ£µ£µ’ÑËé—Ó/§Û9 Úk ŽáŽF0‚ÿp<Ýb·Ø-0²l  kÖ7ë›õ,ªEÛ¢mÑrù*w•»Ê½wŠ/åKùÒ#_>Ì|˜ù0`z¦gzÌ´«¹à5ÙÛKâ q†83ïõßë¿×ð©|*ŸzäK•«ÊUåÚ}éQÕ£ªGU\~ÍΚ5;YI!)$2ñ'ñ'ñ'0( €`clŒD `Ôêõ(Ó.Ö.Ö.ÆLÕ€j@5ˆÁb°|äËéÔë²§b¡}›ëqìÜþ$‘Ù»öqùÐB ­í !!$$jËô“ãúUë~ë~ë~ñÀnq·¸[¤«sss±Yì;ÅN(éBº.„EHÒ…tÈÎùó;çgS¬X9°’ÓÉËËç‡Nÿ4iÿ‹Ä"±HRhì?ËÎÎÎÎΆÑáQØ^æ=wÙs·RÐpFÒH™V 4ÐгUÖ*k•UØ?ZKßñ<ÝZÝZÝZÀ踴•À—W1^“×&(í n"©H%W***ò·È“åÉòä²ìÉè/¿dü’a;5ÔPcf»[»[»~¸qçÆwHœ²SÙ©ìDÑGô9Ð$Ù%Ù%Ùeó]á»Âw¶Ûû{k~‹ÃŸHDDDDD{·91'æDþmàí·ÞÆÙØØÜd¾2_™ïö³Ï£ŸG?v«ííí`_Ý»pï½ ¶ð ë„uÂÊ¥JWIWIWödŬ˜ÿw5dAÆuaÃç:"`w”ð:Á_ÈŸänjPƒ[&«d•¬2â1½B¯Ð+ÿã;µijÓÔ&ñmi‘´HZD;8 §á4õ~Wü®ø]ù[„þ±þ±þ1©çˆsÄ9¬Ä®·Êhú3Š¿×r×~\Ø2‘‚¤HZI<‰'ñÿëÇjX «9š ðRx)¼h×Ãõp=}^bŽ˜#æìïïŒíŒíŒ¦ák×ç(,ÍÅñÿûòþâK`ê”IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-34-grey.png 644 233 144 6176 14774263775 16022 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü 3IDATXÃ…—kP×¶Çÿ»§çÕ$<„ÌQ ÃÀ(ȼh”€`,!‘ä@,ðAÅr<ŠÔ91&'‚^1ñu¹!¥V"¬¨˜EQ© ÁœèPЇ z¡x‹ÎðšgOïûi¼å­TÖ—]»{ïµ~µÖ¿÷^Mòóóóóóái3OÌ2öûˆ}DkóOçŸÎ?M ‡ ‡ ‡W¼N}¨õ9øW~6?›ŸµÙ^e¯²WÑ(E)JI.4Ð@ è°›±™§ÊSå©$—dÙÁ»¥ÄDLÄôÏãþþþõmº,]–.‹ ñA|DVMs7Ü\ÞÌ àb,Æbæ{¡P( …Ž)Ç”cêåèB}¡¾Pÿ}cÈ1䪻c‰´DZ"£þáqØã°ÇaTG%E%E%‘ÜiŒ4F DÏŠž= çâ{q½¸_ô7ãßOŒ/òˆ|¬;ƒK©'õ¤žÂ:²‰l"›‚K‚$A’ ŸË¦ÎL™:óê,ß:ß:ß:×ÇIIIŒsAë‚Ö­$Ež+Ï•ç‚Ïð> ,°øà¯à¼‹}Ž}Ž}RZ ­†Vu^Õ\Õ\Õ?yëÉ[OÞZû%ÄqAK®M®M®M‰‡©–j©öÑ:f)ÙmÛmÛm`€†9/²Ul[e8ë°:¬ë«Éª7UoªÞä§ç¤ç¤ç°ß{OxOxO@)¤‚š…f¡,‰#q$À‹x/˜Ä$&„"¡é"]¤ ŠÊ=•{*÷ãÆ7Œo¶mضaÛ`áÎ…;î.®¼¸òâJÀrÞrÞr ͤ™4Ï€ &»&»&è5÷š{ÍÂŽðg<äAOJD‘±?µ?µ?ʼnÀC‡!W¹_¹_¹ª§zª+úy©â¥Š—*€”¢”¢”" `oÀÞ€½@È`È`È ÀÚY;k,Z‹Ö¢}ÿNîÜ;¹@g{g{g;à«ðUø*W†+Õñl+Øì «ÌSæ)ó`yD>_à |A4Ì9æsnfŸ¿âWü às|ŽÏT[ª-ÕhÆ4cš1 ÔQê(ue~e~e~€úCõ‡ê¿1¿1¿1`ØsØsظj¸j¸jÞ«z¯ê½*@vMvMv   ´6üŸŒ`€áY|f=³žYà[|‹o‰†‘̖̖̦ã‹Æ/B7ÿ ÿ ÿ $¤–Ô’ZP÷q2cŒžÑ3z F£ÑoT¼QñFðÈë‘×#/àqÜã¸Çq€¾Cß¡ïBu¡ºP IÓ¤iÒÇÇÇÀéïôwú?óKNä¨{*™jšjšjB7£bTŒŠV0ŠCŠCŠC|q···?­hYز°e!€ù˜ù°Ú—Ú—Ú—'u'u'u@ß­¾[}·€ÈÓ‘§#OÉ[’·$oìgìgìg€–Æ–Æ–FàIæ“Ì'™@›µÍÚfŠ.]*º0 FÁ(€+‘W"¯Du×ë®×]†aVã9ã9ã9ÀØoì7öã¿ÝŠnE7_Ì"éH/(e—³ËÙåûòê#ê#ê#\*•SåT9%}Öø¬ñYƒñјјÑxV­:ZuH1¥˜RL@÷H÷H÷@¾#ß‘ïM¯¦WÓ D ¬G­G­Gg½³ÞYœL;™v2 XR½¤zI5°,lYز0ØùR¾”/W=¿z~õ|a11#12·I<‰'ñefIæTæTæÔŸm…¶B[aÈæñÆ?ÿhá ðàÚ쫦jª¦°·ÏkŸ×>¬!ÙlHLѦhS4š™š™š „‡‡œ‚Sp À;Ñ;Ñ;ð\í¹Ús5ð[òoÉ¿%áeáeáe 999`+ƒ+ƒ+ƒKßÁwðÌ6E¬"V{?ÃÙàlp6¬YEv÷îîÝÝ   høÓé°tX:|C9Y7Y7Y÷ª6ñvâíÄÛtùªU«È¿]v—Ýeå×óëùõ Ò)é”t `j˜¦Àz¬Çz€fÓlš  õ¨ÈMr“Ü,ù–|K>ÀÅqq\,÷L÷L÷LXS>Y>Y>‰99'çä¶·¨„J¨$j †°ö­ SÊ”2¥’F¦ˆ)bŠúÿ.t ]B×&WÏÕsõ€a£a£a#ß:«uVë,ü ‘Kä9¬²$Y’, `Ž1ǘc½KïÒ»¾ÂWø ï~²‡ì!{<Æc<žŸà&¸ \5WÍUs¼JFdDF2NÆÉø.Ä’XÛ¾Å(F1;ÇÝæ¹b¦ûFv9L“ÃÿÎa˜&áãªé.ˆ9ªß¨ß¨ßÈg›óÌyæ>>Îuê;õzIqíûµï×¾O—“’Cr Ê…r¡J(¡è£cá OxXñC]D]D]¼<†<†<†a‘°HXôéþiéõÙÜR<2CW‰\÷/‰Ü=u—HRŒ:ԡεƒ,&‹ÉâåïNÿrü|É™íÌvf [+¬Ö ̲E Š!Uè:„pLÆ„ÁÎçò¹|.ä_‡|òuˆ+t(v(v(Vò@¡ˆPD/™þh>¾-”%B {Ä]Ù¿‹Óét:ãbFá~0£!·vw¸µ{Ä­ÝË3ÚÕB -sTïÔ;õN>Û|Ü|Ü|œûà3Qo­·Ö[K_I_I_‰äb—b—bW[µ½ßÞoïßõ僕V>X ¸Uî}œ8s#â9{nçvð«[»—þŸvg›f›f³æóùçóÏç»v¸;z/÷)qÒÐhh44’u\×Áu‚JP ª¿Ý`3ÙL6Óú†:F£Žažºã½í­ÏsIð;Þ=m¥2*£2²m赡׆^Ãw®y®y®ywx¹Z®–«ÓŽŽ$Ž$Ž$κhn7·›Ûé·œj9ÕrʵtÒ9éœtJ¶K—I—I—}2‡§ÇéñUC9ä’‡xЧx*¼"VÀ(þy‚?°ßÑn!jQ‹ZW­¢U´*¾‹©d*™Ê_Ô¶Õ¶Õ¶ÕÂkÒi‰´„i—h%Z‰öêõÊÊÊñÆ.c—±‹ü$¼,¼,¼LËÜ~õn@Ëïq0ø{N»îãÂU€ä ‡½K²HɺBki-­ýçÊ@e 2i—ôHz$=ýÂAá p0{ #£#£#˜„ÚíOl,­Äñ¿•!Þ± bXÇIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-18.4.png 644 233 144 3066 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜëIDATHÇÍ–ýO”WÇÏÀ´Ì` 2*Iµ±ÓÐI-‘¨H )ÙZÒ±Â4%Õˆ%‘hÉJº‰±Ñ†lÝÒm«W|Yâ KÒY(¥ˆ¦‚ÚZƬ 1ËF+Ò¤,F ¼8¼ ÏËýì33k÷ðþòä¼}Ï÷¹çžs¯€ˆˆ<ù Ä­Ž[—–ãöFõŽGçïaù¬¶wlïüëà:ã:ÒÒ`ÞÊ–Ýò‰âÇæ³ôòœD - -¶üˆ\ïe¾—ép‡åšnp¶9ÛfuØ×¾¯à›Æo©€‡?=ü `22¢²e·ü­x /_ªžÈ/Ï\zæ’í$<›ð¬¼°õ…­/~v| ·nŽŽWq`Œ‰$ª| HkÇÈ–=âoÅ[x¾•ÏÊæ#özÚë"àßéßé¬G¹û|ôüGϯhmü*ªHÃnØ3úŒ>CHÝ2kÌ ^5¨Õ¯úÝØiì$„®Oê“ÔSO"Ç"x®ƒ¯|Õ"x÷+Ef‘鬇´Ò´ÒhM#ßãoÀ»3ï΀ú@ëUýà€RCh$+¥J­V/©—–v µ\-WËu¼Â+<¹?›¹f.šú½ž¡gXj­£xeñJ‹àñ7bJ)"â=Π3´ó'–}³S3©3©ÌiuZVÍ´xzñôâi---=SÏÔ3c¨\á W€1†ÃêÐæÚçÚ™›NŸÎñÁ`õ`5Ðã<ë<´3æ#üSDäl”)?*ÀÌšüËØ§cŸÂ–[Žo9ŽêÚÞõf×› ìÊ®ìàsø>¬ò¬ò¬ò€ßë÷ú½0_2_2_å§çê¹znT®\WYPY€Úº?š?jiÍ,³iŸgŸø>ÌGÔ=‘¾ƒÐ<Ø<³·TÙk²S³S Yûz+ãVÆ­ ¸^x½ðz!¬=ºöèڣп»wÿnðÔyêB0¹#¹CµðóÃe—ªˆôQº6¤ ÁÆoüeã/p±úbõÅj0ÚŒ6£ ¼)Þo ¸ª\U®*ذÃþ ûáQû£öGíQBùùùPà*p¸`ןw}¶ë3x;Ó7㛉úÿ^9¼KnInQ-)I)IæZÇOŸe.µ=ٽٽٽУzT‚¦Ò¦Ò¦RÈõçúsýQà¬=Y{²ö@mYmYmYTlï±½ÇöB|m|m|-äôåôåôc!áׄ_¡=ôÝß}À8ÌÛçí`nO.I.1ïÄ æó‚íŽhÚ[Ú["¶5""’é Ñ–iÍ!zzz,’îJw¥»D†Î :'Òº¢uEë ‘É©É©É)‘$w’;É-¨T*DròròròDš›š›š›D<7<Ýžn·ß½Î½NÄû;ïïI™Õgu[2?ò£íN¤+ûr³©³©x;\óȇy­9´nÖܬ¹Y݉“';NvÀæ¬ÍY›³ q´q´q&&&À¿Ã¿Ã¿FRGRGR£q]'º>ïúŽ,«l­l9c?¾ | Ì[gŒ¥®ü¤ü“h—€Ôƒ€™CÖª¦šjà÷¸sº§™f8ÏyÎÇ 0Ÿò)è?è—õË`^2o›·QüUÿRÿÔv+_ù×å_‘®\šcÊ9â Ú1´-:ÇÌRíšv9eð2/‡Yc‚0FŒÃÆaã0˜›ÌMæ& ˆ"ŠÀt›nÓ ü‰ù8†èÃa8˜3…ñá~Þý<`Áyßy?hG·æØo&qBqBÌdž5.—Í|ß|‹²YB,°ð?3ÞĦg0-³Ì,CcѸaÜf"ø;Šÿwò?qWZw—uW† ¶_ð‰K%Æ(1JêVÝØ°AT¶ì–¿oáYøV>+˜ÏÓüºxjßcOç ö¿@¡3g–¦Ð×IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-67-grey.png 644 233 144 6233 14774263775 16022 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü PIDATXÃ…—LTWÇ¿÷½73ÌŒò³©ÅŸ…À- "*ìhùañÕ..«ÑÒ€e-‹m­XÛ¡6Å– Ȧ‘À$­ë*  u@¶"F„àb§ Ã¨¥EAE‘àÍ›{÷f0qÓìùçåÞ÷Î=Ÿœó}÷žKt:N§ƒ7¦ldêÁ­î w…»¬A÷½î{Ý÷ì¥üùò¼þ óa>Ìçð»’¿ä/ùG혬›¬›¬c…¨D%*I.B‚·p ·ìÀì`…Š7o*Þ$¹Â€0 tV’a2L†TäÍÊ›•7«±»`{Áö‚ídP ¤²vŠƒ^vqysÓ€1ˆA w‚æÓ|šO/‹6Ñ&Ú^\’oÈ7äNô‰ƒâ 8hl³/²/²/Šú@}T}T}õQ«¢VE­"¹Ñ²hY´ Xâ»Äw‰/à»ß»¿wû»×›^ßÏßÍãæ\Ô2OæÉ<éV’A2HFÀQ>€à.êmÕ¶j[õ˾~F?£ŸÑ¹oÕ­U·VÝâá¦pS¸‰$+r¹Š\Øqq*Øa‡@:Ò‘`6fc6ì“s'çNÎE²©ÅÔbjaަ¦¦ºïqÒã¤ÇI[ލTª€Xg†3Ù‘x”e²L–yw+§åèGô#úmeãlœÏÉÏàgð3.‰£â¨8úò4ë4ë4뤘¬‰¬‰¬ >g*cĦHR$)’ Ñ5t ]óe¾Ì`a,Œ…´Œ–Ñ2€FÑ(•b­b­b-$·ÿ»¥ï–¾[ÊçhiiI1¢$J¢ôòx¯âUƒÜòùåÏ/~¼$/Éëx§m£m£mãöÅšM‰¦DJÎ|#óÌ7„zÖÌšY3¬ô=BÀ“×óz^€‚‚ì*»Ê®$ŽÄ‘8>ð`*5@#Ñ€V$  ðÔ7ë›õÍR²9ËœeÎêÕ5êuÍ÷×…QaT};Š“Æ¤1ilí±V¬k·/öKõKõKeA©§SO§žÜ±2+³2+<ùøøñmñmñm@š-Í–f$…¤€™‘1X ƒ©Ê¢U´ŠV@Ô‹zQØkì5öx:µN­S kêŠÔ©+„~ ýú-dAn7ŸÀBX ùt£CíP;Ô@|A|A|Vy_ð¾à}rúýƒþYCÖ5€!Äb®E^‹¼ ðž¼'ï $G$G$Gч¢EJ¯•^+½Œxxx‚ ‚Ç„cÂ1€µ³vÖÄŽ9sž«e«e«e°¿–üZòkÉXU£©ÑÔhÙ\Ù\ÙÜO7rR$-ËòòòBaD|D|D<)Gò97›ÇÍZSZSZS€Öe­ËZ—é×Ò¯¥_’b“b“b*m•¶J ›s6çlÎÒ>Hû í`‹u‹u‹ЖhK´%€¨Õ¢Ýº?t?Ü&ü)ò§ÈŸH¹›Ç͇ý£ûG÷Ò±'bOÄ2·ÙœŸ8?q~2=fÇÚŽµkc¬ÖVk«µ1&É%¹$g̺̺̺Œ1³Ì,3ËÙ6²mdÛ3?ÚA;hdz±>EŸ¢OaÌmÈ6d?›w.t.t.|ßÍãæãµTKµôÓÌ)šS4§¡ážážážàHI à&ú&ú&ú€K‰—/%CcCcCc@Ë·-ß¶| \ê»Ôw©P]W]W]":#:#:g¥³ÒY pë¹õÜz -¶-¶-è,ì,ì,¶É¶É¶ÉÙ"Ù"Ù"€É™œÉ²˜,&‹ÁuOtOtO€hhh#CïÏûóþìŒu©u©u)n;î;î;îƒw•‚‘ZRKjÑ!:D ž§ž§žìÊÙ•³+ض|Ûòm˦ð¦ð¦p ûT÷©îS¿ƒßÁ晴*©h67››ÍÀÊ´•i+Óeº2]™Чô)} p:NÇéÀ\qyÛuÛuÛuÜæ¹@.á<¾ôøÒãK©øö¬Û³nÏbgnØnØnئ53®Ø­Ø­Ø xÿìý³÷Ï@`O`O`0Ó0Ó0Ó,ønÁw ¾fúÏôŸé Ïž=<{Ú–nK·¥p4:@Ô`Ô`Ôà³÷؇}Ø ýèÇø w6ÜÙXîYîYîá+Û·=nKÅR‘ŠÔ¼JA'èÉmJjJjJr>I~’ü$*÷öššš \9åü•ó@wXwXwÐò^Ë{-ïÎ g…³˜¯œ¯œ¯|ÆÑõj׫]¯/üú¯/ü x{{XõXpïpïpï`RÚ*m•¶BuÞrÞrÞBcˆ…XˆLj“8‰S/ç^j~©ù¥æ/ÉãåñòøêþÇK/y¼„¿S3V3V3æÜëŠç/—ÇË1¹°taéÂR Ê¿Ê¿ÊèüºóëίM6=Úô˜=/z^ô3ÐÇ9sçs6ÎÙ8gã³yj¤FjƒZh¡¨û¬î³ºÏ¨½ÿdÿÉþ“ÜUy‰¼D^òËfGŸ£ÏÑ·ÏA>þýãß?þ@;ÚÑ>§Lö@ö@öà²rÌ8f3¾œ™hJ4%šXÂZóZóZ3if1,†Å€‰gÄ3âaX†>’ä#œÂ)œpp°çÚsí¹€â}ÅûŠ÷.ƒËà2¦û7Ü8€MÕeÕeÕe8¯üMù›ò·‰$Æ3žñQ›ŠP„öüã*¹J®’ïàŠ¸"®èÞ.ÚK{io†¨jT5ª–”–”–öªi·i·i7N’«ä*¹ŠqùAùAùA€à#ø€ýÂ~a¿X‰•X @=ô€*X¬ ø¾ƒï˜´>õ}êûÔªúüúüú|)Pf–™ef€X‰•XQ²œ,'Ë{þŽb£X˜ëjóœÑS}£ð)9JŽ’£ÍÙ\<ÏÅï«C&2‘ÉýÓ 3È 2içÈW#_|©"U¤ Vv–egA"HÄt·ˆ!ˆCâ¦gz¦Ç¤[Jõ9õ9õ9νÃ8ü¡P¦V+‚Oh 5…šÂ#§r ½èE¯”èîGÕèCú¤nìÁì!u¯Ô¼RóJMñ_=²<²<²N û û û #ggœqvÆ3íâ!â!&a‚ &ãÇ89䬕µ²V0²Ž¬#ë ¸b¹b¹ba íÆvc»‘/VÏRÏRÏ꟫Åj±zÿÝyÝyÝy³0 ³ÀËç¸Ôîzž¦3è :^]÷»îwÝÄ=âqÏþ/Ô>jµÏÝÓ· · · |qCZCZCK Ù$›dCA«h­ƒJ(6ÊFÙ(@$" ã,,,8iŒ4F#á¥Tªº”.¥K÷1%½þ —Ë\Û¸«Ó‡‚¸ÿBוDáºJÄÃ#ŒÎ½$†Ä˜„¿N]9.þ˱ӱӱ“æl¡[èÊ­/ / /›ô&½IoBÅ…r¡\(&¥\)WÊ…â›ào‚¿ vj—.\Λ="="="‹c§~š}Wi9-§åB™«²»Ü+(((((€ÕQ¸&¦5äÒî^—vË\Ú­ýí: ƒCÚ9R1R1RÇqÇaÔ‰ÆñÆñÆqjï/ï/ï/ç͇<yꮟ¼7yoòÞ¡#æÕæÕæÕ€ 0Ðå§rºù¦AŸv r-ÐêÒî¿þG»þÃþÃþÂȺu?êœ{¡x™|M¾&_|×ÒÑÒÑÒA¶ªnªnªn4ÒÀœËÂ[Â[Â[ã ŠŠŠæž¸â½á>Ÿçâñ'É54M5 ä½Á°Á°Á0|ëœïœïœß&)‚AŠ ¿ýóaâÃ㉾5#=#=#=ìë®ã]Ç»Ž;µcŽ1ǘƒß#[![![ñþ\VÁ*XÅõP@OðO¨ûÐU¸%=ÏCðìO´›4 Á™ÇêX«‹ëåÎqç¸sÿšØ0±ab “•ËÊeå\ŸÉgò™M—‚ÏŸ >÷zœ¥×Òké%?Ñé‹ôE¦w­kpÚÿŒƒÃÿ±ç´ëÚ.œyÈF6²…N²l'Ûf ¬5HW.P.P.àzø>¾ï»·€¦‡éá÷on¾¹ùæf` A®õNÿY©Ÿ·ÿ[ÌInSøIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-127.png 644 233 144 2742 14774263775 14771 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü—IDATHÇÍ–mLTWǃT&Ê$¸Q«aSilŠtäƒ5„4ZÓ‚¡ÆP#ñ…ظnü0¤ÑD%Ä@-EÔu³4iéª]Ñ`‹M4!u@^’¾HŒÕ%ŽÛŠî( ê8“÷ž{~ýÀ=sq7›ìGÏ—™çíÿÿßsîóÜ#@!D¶ý+ÀµÌµÌ5Ævívü™od¾‘w~Æn“V™Vyç,8½à4€÷3ïgÖ°cë¸ÎŸ]/„ƒ?›OûE¶ps;çv¦ùm»¶¼ºåÕÌ…3öG7ÀÝåPûUíW_žùò ‚ð`x êúÁ±u\çëz7_4ü¿q5ãjÚÌ}aî B@nynùKžIø×KðÖ›o½ ð ýAºr€œí©ÝS«é¬BµÎ(4 !zÏãƒM…› 7¹šs5çj gÎþœýïÏ/É/Œ3ßd|ƒúë'ƒ'ƒŸü÷î»wêkë³… x¥ciÇÒÔÎïŒO>i}ÒJrõû«÷­ÞçôîPéPéP)\¾tùÒåKË‹å9/?%}%}%}Ðd6™M¦ã¶Û‚m›—»8w1<øttÝè:’šOµž¯?_¯… Ìï™ß£:yÎçÃvê>k•µ äb¹H.‚"‘¿ÈW*¯T^©„ä£ä£ä#ííí…î¦î¦î&Xî]î]î…à±à±à1GضõÛÖo['öØ{b¯ã—ú_xUxh=¼YÞ,ëŸyytδ½RÖ¸5î@WGWGW‡ã$‰@| ¾_ôÏëŸ×?ωßôÝôÝôAÞö¼íyÛaªqªqªÑ‰³À3¿E~ŠüZ³c*ì û€ØK­1kÌ©_Ù¹²se'tïèÞѽúwõïêßåññ‘ã#ÇGà¬ë¬ë¬ "‘ŠHl>Ø|°6oÞ<î°;›ƒ !lÐ`ÕYu$¬-VƒÕ,'—\PÓjZMƒ¬—õ²ä=yOÞyD‘G@I%•ë±õ³õ3¨­ê¨: `}l}L‚¸ÆÉ„ÿ³sLÚ–2¨Ê¬ÊLÏrxj½c½ƒ´ŸØ Aø…I&(Q¢À/Dˆ¦ÛùI«ÚªÆ9(gãk¾ÿšüÿã[IÝÒºÔ\3º€Fñ8G,ß•ï’uCÝ 4plO½v½ÆÓøšO󧾕Ïííâ¹½=Ÿ7Øß3•V&Mä WIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-192.png 644 233 144 3043 14774263775 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜØIDATHÇÍ–_LTgÆßf²@ Ñm‹L즤f2˜Fâ²”DÒ,H:m0l¸ µ6­{ÓNÔ ŠÛ¦Ý(v“e‰l"Ñ8‹],liꢘA* Ýf Pì…nl¤0Â0sþ|¿½˜9œé6{ï¹9yÿ=ÏsÞïûÞó ˆˆÈÓÉ·€3ß™ïÌNØÎ7l¿ë×+;ÿ–°; pÔ9ên7ÃSíOµätåt™Ó¶mÅ­üÔz?•ÏòËÓb;2z2zåIûxýÅ×_tmIØgFÁÝçî[Õáðç‡?è=ß{žw`nln `©|©lÛŠ[ùV½…—Š/ü¿lØ<ภéé"°£bGEáï ßBMUMÀý´ûiÊ ÆI¦*"D°žpŠmÅ“ùV½…gá[|B€çeÏË"p°þ`½û\¢`ú"zàÙÀ³ŸÖǯy›·Éä¼>¨'ŒÄø³zU½ ê_æ7æ7ÀßÕQuÀ8n'Æ_ô6½ Tˆ&šÈ¤9‰Gà™À3€–äSB½”¦ˆÈ'ûÁ/~ÙRÇôú Pÿ6¾6¾FK›ÕºZ•«rUîFÇP{ÔµÔÑ„@õ;õ–z |É—hê¤r(¨É>ø·ø·‹¿¤n¶_µ{Þ=Ù³g_P jBM°¶º¼–µ–Ú_µ­Ãï÷Æ{!<ƒÙivšv\+ÑJ´X(Z(Z(í±‹±‹¬%ÕŒÌ~4û€;âŽD6Yz’Â:oðàÈá#‡-8Ó«~£y5/,ýiéÓ¥OQ%§K>,ù® ]º2dWäUäUä{Ä=â†þ†þ†~ˆ¸"®ˆ ªªª {5ûQö#(m-í.íF-~7?9?™Â7ý¦ÿM¿µ÷:o8}{©_ö— • %Û(_´o½q½Qâ•+C•!qŒooÉkÏkÏk .ƒ‹"+ù+ù+ù"Ñòhy´\ä÷÷W¤^¯×ëu‘Å–Å–Å‘•_¬ä®äŠóÆ ã†8.þ'Øl“¸Å§Î–ºJ]ÿKýÙײ¯©Ï=?÷<0Ü+GÍb³Œ_ÛŒmàK÷¥ûÒa¤i¤i¤ ®‡¯‡¯‡a{ñöâíż¼¼žO§ZöµìkÙѬhV4 o Þ¼»Šwùvùàú×>»ö™ÝyóÝûÝ÷»ÁÒ#“•“eNAøûð÷@OâØ+e>4Ú…{'öNì€þ‚þ‚þÛßÜÚÜÚÜ ‡:uê€OŽ'ÇÁ³Á³Á³pjøÔð©aØ}{÷íÝ·aÌ3æó¤–ƒÉ1³ž Ï‚¥Ç)b~a~á˜ô½FD4ñ8¶KÜj´ˆH¬/ÖëI¯M¯M¯™N›N›N¸0paà‚HÙÖ²­e[E oÞ,¼)¾¾¾,Òh4D«««EîvÝ=w÷œÈ·‡fvÌìqü#ÁGg|.>'bëADdò=è^î^Bª‰ßê?ê?³¾ìXѱ¢cE0^7^7^gñé3§Ïœ>Þ1ï˜w F«F«F«àjèjèj*´ ­Bƒññqðnóf{³aèÔÀ /XøªÉ¬ –ˬÍ?ùž}*9òþ‘÷íSzD·'ºÂ$JÔDˆ!à÷¸—â.À‡_Še–Sð~‚ozmþ„žÔ96çž‹lBÍj³`ZsÌ ˜ÖÌF³ÕlS+jÅæ3¦Œ)c ŒÆNc'˜=fÙjFͨ0þhœ4N‚1c:M'­ñùøì©?Ú’.wq@0IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-3.4.png 644 233 144 2575 14774263775 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü2IDATHÇÍ–]H”YÆšëšå}(K *Õ•­®‘1MhVvQ-ÛV,nk²iY²±MÉêB7®º IŠ»áD¦^Ôz“ô1ëEA5ÐDÎ8íäÌûq~{1ï;ïTë^wn^þ_Ïó¼çãŽ!„ Œ¯€äåÉË“çÇìäo,¿­ÂV‘ÿ{̾¤AÒŽ¤“?BV{V;€ýŠýŠþв͸™ŸX/„…ŸÈgúÅa9ÒúÒú’J û4ÔÕÙrböùÛÞŸÞÿ ¯¼p­óZ'ßoÌ70]:] –mÆÍ|³ÞÄKħßãR‡R‡’ž@Ú'iŸ+ÊW”çÕŦòÀQé¨x–ò,E&€æ2È¥@ˆæx•`›q#߬7ñL|“Ïäé°hÓ¢MB€s·swzG¬àa7jýÒú¥&ŸÒÏyŽsœ yWyª<®¨!5D䤜T©KP¥Gz´#Ú"ü¬ºU70 #ާ™ø_œ?¦G¼»¶®2f«¨ŠO€2J–:®ŽƒüJ}£¾A1R~*mÒ”QFŽGÜå.È#²_ö#An–›Qдqm<Ÿj[µÍè*KXJ!„øüH÷¥ûBóÀ«y5à[Až’§+?)ƒÊ ø¿ô¯÷¯µEmQ[„xðàüøñQ¢D!ò}äpä0? :ƒNÙ#{3fàëÞ¨7 L!ìÒ:yè$È'újÀÃÇÇÈ_l,ØXöv{»½ªÚªÚªÚ z5z5zÕÒ§îQ÷¨{,»¡°¡°¡ÊgÊýåþ¸[êÍÑcÑcÀß&_ŒßÔc›øÜAw´oä×@ä·yJ§% K–,„éðtx: Kr—ä.É…‘á‘á‘áWò¦÷¦÷¦×Ú(•ÎJg¥ÓŠë]J™RF„¿L¾¿©GÀü[óoÉ>ð­õ­fŒJ‡Ì‘9P¨#Ôê€ uê6ÔAv0;˜„—Ž—Ž—+ïuÉë’×%P‘U‘U‘µgjÏÔžmEÛŠ¶YyÚCµCí0Î1ç7ô°gÚ3õðêù«ç {ãÇ€ÉU“«&WÁhÛhÛh¶¶¶@AMAMA \ö]ö]öY„çZϵžk…”Ö”Ö”V(ž(ž(žÛ¬mÖ6 ÕÕÕ 3×`òÅøM=ÉBèƒú`Ò!Ôíêv!ä¤BˆEÆÙ÷šî5Þk¢6P¨ 1’7’7’'ÄŒkÆ5ã"Õ•êJu Ñãèqô8„(^\¼¸x±½î^w¯[ˆü;ùwòï‘ãÌqæ8…X™½Ò¾Ò.â#I5ùbüq=ïï1ÜÆšÿ¡íÒv1ÿìlÆÙŒ³°Î¶Î¶Î]S]S]S±~?] ÎBg¡³^ä¾È}‘kÍÈ‹7.Þ¸™™™ 3Õ­”+åDb ÿ¹ÇÞ=•FÙjPCjø“ûÜG"™eö>õˆG@3Í4[nY!+d¨Õ£z@Ò‡ô!àW.pd•<*"AË×òðÿžÊ„>õ¾õ¾ólå’Ö„µZÖÚi­Ak}¾F_ìcû@ÏÖ³õl ‰&š„È>Ùú ½[ïÐ[õVÂÆOnEzU¯:gKèüñN ±Î¬j£€Ô÷ëûQ @ ((€DC‚ ºaƒŠ Dü7úN}' hcÚX"þœŽ»’úeõËâý@ -dÄ—m¯¶—ÈÛò6I$e›q3߬7ñLü9ïÊöuñѾÇ>Îì¿_h¤IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-172.png 644 233 144 3013 14774263775 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÀIDATHÇÍ–LTWÇÏP 3q°ˆIm‹nj…XÃB­;!l%¡‹¡‘ÚdZÙÝ®øÇný£y!)®¤-ɲ`bÈvþÒÔ(BLÁ¶6%1Q~ì@*Ô4± *U#Ž e’Î@™yóîýì37­Ùÿ½ÿ¼œsîù~¿ïÜ{Ͻ""òdú+UUµ>egýÕñ»kÜ5[»SvÐ×ë®×¿{žèz¢ ÀwÊwJM9¶·çgæ‹8ø™|¶_žÇ‘{>÷¼«*m·Â›/¼ù‚{cÊþ×0xú=ýËI8øÙÁÏú>éû„¿Ax4< ©ŠTcÛq{¾oãeâKëoøEàñ/ÿÒu rsrsD`Ë+[^yîÔ„žƒºWë^¸ûØÝÇtX/^]D‰bÅ ÛŽ§çÛù6žoóÙü)=ù»òw‰ÀÞú½õž“©„©3$gŒgl>³Ÿ?ÐD^¾J~“üøÊòXâzRUtTÅT ôÕÇêcàŸÉ;É;ÄéIö${@ÑH#^ÞOãamó§ô8K©DD:ª! YÒÍÉ÷’ïž±nX70ÓMŒ{Ü묲šaP@èu•®Bà cêh—v¾–‡ÀÆÀFà'›_27Ûó'À3ï™fÃtl:| @-èq=ÎÊòÙå‘å°¶[%V ˜ûÌ}æ>xÐú õA+,v-v-vAätätä4Ä/Æ/Æ/Brwrwr7,Äb 10ÅÏÄϰ’–_Ë•é§?ðD=Ñh¶­'-,8ÂýC´W•ê?š¥f)D:#½‘^ôÎ?íܵs„|!_È¡±ÐXh òçÎ; EG‹Ž÷M÷M÷Mh[i[i[£Áh0À[ê-öCe{å¹ÊsèŸ~˜¿6-ƒoª)а÷^p$+U·—>—ê—^H—Q\e¿ô¯6®6J¢v¡6T×ÕKW‡®‰¬_=¾z\¤Â_á¯ð‹ÌÎΊ‹ƒÅÁb‘‰¿Ä/BE‰\ï¾Þ}½[$öml*6%bÍ[#Öˆ¸ÎÜ9{âì IØ|úß•îJ·ÍÿÒçë×êóÄÂEá"`*½‰þ®ÊU9X›¬§¬§`džvl€þh´?ÊC£ÑÝèntCWoWoW/$êu‰:¸=~{üö8\j»Ôv© Ë Ë Ë`èÞৃŸ:ùêÝ»çîž[€/Ï—§&aqnq8Ÿ:öZ«µà$ú›ýÍþfèÛÓ·§o㟟Ÿ€­[ ¶@d22™tâÍ›š75o‚²–²–²ÍÍÍwâzoºÍ,/N/Nƒ­'KD}¡¾pM ɺdˆ˜""’ïÚ, »Ð""‰#‰#‰#"f…YaV8þîÁîÁîA‘íKÛ—¶/‰øJ|%¾‘ cÆ.Œ‰´ßo¿ß~_¤á@Æ"·NÝ:yë¤È÷¾±åÆ×…ÁD8±õd‰D«¢Uß^×Е¡+"ò;Þ–ßë<çH«6ªjCd³±ÙØl8ÂÖÍ®›]7+²Ûþmû·9þœÎœÎœN‘šúšúšz‘Ëå—Ë/—‹t4u¼Õñ–ÈíÒ½?zm|Þæ?CÇ†Ž‰¬éY;•j9ÔâœHF“Î^Ò@œxƦR(T†=Á@˜0á ¿F£á7ùú×øªÔáOéÉìcaO8šž6§MH“Ö‚2”ÁŠú‹êT çô¬žÍÐ×£zTèz]¯ë3ô è=V»õõXß«l• V{b>1ÏŠ¾lãϔ͔QÏŒgæ¡>f7ÚŽj¸n§óƒ²BÀ²zC½™îý°°€(?ósº™M°Ì2°”žQ¯©×0Y²¬ ±Öùs¹v¥~ÕùÿÏ]‰ñ¬ñlÆ] ñ^g ¬«8èa= € 8¶_[²t¾gãÛ|Ý•ìëâ‘}=š/ØÿFçÆþb­ŒIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-16-red.png 644 233 144 4147 14774263775 15622 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXí—{LTWÇ÷1Š]—ÔŠ:¬1øZ5]u O‘Új›A«@Ì–8Zlšhq[ˆ„­IabK¬ÍÑn‹+q­·m6â«qlM™(6ÂÈcfpp˜{îýî̹óˆlvÿ0¿sÎï÷ûÜóûž{.D“6“"L̘j›j›jžb§´OiŸÒž»Vf2“ÙÍ”B)”LNku$“L2÷H_«ãëy<ÏÇóGÖ3"yÂù,d!‹Ø9?{‰Ü.·ËímÃÂa°G‰‹wÇ»ãÝøÇæ»›ïn¾ >(|Pø0gš3Í™!ŸÏóõ<žçãùy½ó˜é/h½¢Wô:SøÍ+W:¯”½ÛÔÓÔÓÔ£½âò y†H Á‡1Œa €N8ÝÎóõ<žçãù#ë-hx1§‹ýb¿Øï¼Àdvevev)¿·ì~»vM[¡jª…U) JÀV²l– °–Ïò¶’­f«VÅ,Ìh+´EÚ"(<Þ°OØ'`çùuàˆúÆé:šÐ&´ mDò!ù|¨ù0Õ™êLuJöžV£ÕÀ£4+eJ 9ÕµÀ_ŒPuß 3€ 6ÊFÍ99¨4ksµ¹€öžú•ú<|±©ÎTmªV x}ÎÃùÈpßpßpÃïøc±ÆX£%9;ì;Fƒy<ìãÀíÀmÐzµ^žñµãk`èÉЄ[3š@{¨=œÀ o—· Æ Ç ö±ö–ö–ãq°ðÀBÈû6ïÛpNµZ­µIm€òwÊß&!¿|A¾ wîJ[ÄCú¬%Ö4kšV¦ïli®øåñËã—£n8w8w8WTÈŸùVï­^H+M+ +Œ7Ö¾±ϰÇÂ×}ûM,Ô7Ö7ðǯ/¹¾$To8×Õíê8çã ÙtxÓáM‡COÆìŽ@º1xcÊ,ÿæØçØ Mþšg¦K;e9e9à—ý2<üþá÷p~èü×}á¾0{D°óp¾ (Κošošoê [ÏÖ³õá±Ñ~ž/Ïé©é©áãˆÀ«·_½ ³¾›õÌØ6c[øWTTTð³dI,)T̼ʼʼJoŸƒ?þÖßÓßÓßCv¿èý"IÒŸ¤b©˜@ fj&"/ºÑþ*ÃøˆˆÒ)â-'Îgù }…DD¯¹_sÝÙugÑùsçÏÑ„ÕjµÑÏg{Ïö‰ç¤{Ò= ‚‘ärºœ.'Ù9‰bX nqÝIËIËIK˜bX ‹¶—í ?Lù=ù=ñuÆ×Ïj}ÊHÊX,aÊû û ˆVÑ °3G?8úA¨Þ?\º~麾“’…d!90HÒjiµ´z-?e‰óç'Îg [[[ôm] &PVPË ä cIÆ’gVWÀ”/¦|_¦™À·Áþ^º„.¸f¾f†ßŒZ¾é/KQõ @š-Í–f:J±9±9±9DòùŠ|¥µ_á›Mf“™íåeÕʉ‰øaãÏþvãÛÿ8ÿq8 ö“ö<}ðôloÛÞ†Ð)Õ:«P?m‰k‰ƒÆ£J¯•ØJlªOÜ)í”vþ{ë¤?ÍE‘6¯ÑlH6$;?ç•U•U•UÚ:½s¿fgØh€÷¤÷$û”ûTÄV¶£´1m €-h¯ì•V2Þ3Þjõ)ï)Ë) ^ׯÐZ±V¬}š+Ìæs~Û(ÝЯÔb¡X(^\hZ…V®u—­ÓÖië í'ÛÔ,7?Üp‡o,¦c:¨Ô €¶NûLû,$¥þÖ~C¿HŒ1^1^Q*ôüH: ¨4éhT@²1ÄšEY”%DmÔFmD’KrI®wÏéWëqã'ÆO”8ÇûŽzG}¸vÕ7Õ7#ýðࢳ¡倶UÝ nÅí½Û/o¿Ìöê7И약¶ê„Ý »v‰&Ñ$š„3AºŽù«àß­Ò=éžtOèHÚ—´/i‘¡ÔPj(µUëÚÍ2e™²Âµ«Vª•ðÃl˜ü4 q³Ål1[Òbýšú5õk´uú]gˆ3Äõ? ~-ÅDvZ¸Õz¢ÜîHß3©]Ç™çj7N‰S‡úH}¤> i±}èlÓú¦õMëÓ6뚌cÅØmŽ’bcßTzñ€T¥ÝÍ/Ó®Ò©t*!åŽ'Œ'Œ'ËÜËÜËÜl‘®ÅÓÒiéô±T.µ ô¢gÐK,´€'xžv(qŽVG«£€~øCǪ²£²£²#ôÚ‘ËÇåã}ÁI¦ý+ªnpœ^y`´ñ€mAíþýyÚÍÞ˜½1{cH»¶T[ª-œ×ôNEB‘P´~dq$ª®@ÿ¥½L»R­T+Õ:Wr࢚¢š¢í芉+&”Ûz«]’KrUΣæà·CP䈪7•þG‹Önu¤Ÿý³°CØ!ì(ò(O]*ÎçŠsèrw¢/Ñ—è#’®JW¥«Â¥`àÖ¨Îýß,Nÿ•C9”#ߊœ~¿DÔDMÔá¢pQ¸øð7“ã mQ±Gå}i«ÿ¿Ä¶irtFIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-25.0.png 644 233 144 3231 14774263776 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜNIDATHÇÍ–ÿOU÷ÇŸ{µ@KÂ.K*»Fj Ü)Ðxg«Høf@¥‚«mjÒˆš›¸u™ÁâšlÄëjHY§CË—QoKÐ 2 QèEcK‘M›´Àˆ\‡3ê¨"ó„í~9ç¼öý‡{·îðùåœçù<ÏûyŸÏç|ÞŸ€ˆˆ<z S©ÆÄ o܎Ǖĕ¤}ô0T*Ç~ O}ðÔI­I­êDØ×ÇõüÈz‘0~d?=.OK8{&öŒ¡ ä;àÕÕ¯®Žû^ÐÿÍe0u™º°§{O7@g[g?é/§¿xXð°Â¾>®çëõ:^$¾8þ§¿ÄôÆôþ±OÄ>!–M–M+ß &ÜX å[Ë·܉º¥@™â‰× €yæÑíA„¯‡òõzOÇ×ûéýƒ|’ó“óEøÝ+žW<¦–`Á„““5m5m ]ðwñkÚh#S)мííxµ¿«íj;h3êõpE{O{@±+v¼˜ ÌMœä$ñÚŸBx½5ŸÕ|¦œpò‡ŠèŠhS‹ÎGþ{mß/æùªUAËð**hu§º¿vMëÐ:Жæh‘›¾ÿ-¶°MV†•aüÀ]î‚ê áÿ¬êݪwu‚ïG,¥ˆHúQúM™>š†«n¬ÿØ2“òíÛ߾͢Èïñ{ÂýæŒsÆ9#ܸ7pofjgjgjA‰Ub•X¾c¾å¾R_)Ìþàþ;÷ßaQ³ñÁ½ß½˜6˜Fæ£ñùˆ¶ND¤ñsØÛ°·æþ f—+=Uz k&E+8Yp¬àL9§œSNH[H[H[€ŒâŒâŒbX“½&{M6ŒwŒwŒwD0:Á NÀ®é]·wÝS»©ËÔ…¶ã‹×c^Ñ“Ôl.Ù-v °!ÈGψˆ|Uý ý Ðö«ž²ž2­úùä´¾´>¼zi~C~C~ìkÞ×¼¯l¶F[#8&“ŽI˜™™lذ…yõé9Òs¬Ö kÜ_wõýհʱ2meÞOs†B«†¾¦¾&P¢ƒ|ŒÑÆ„©„©œu"99"¥Ã¹†\ƒ¡ÅuåÒì¥Y‰½Ðz¡ùB³È£”G)RDjjjD”$%II¨¨¨Ù:ºut먈ûŽûŽûŽ,Ù­Ü[¹·rEÌÙæls¶ˆyÄ }Æ"#ÓÈ£ÈxÐxŒEFŽ‘F­q³q3Xé–Ór’ù²ž¬oÇôwO±Ñ”V¥UiBߦoÓ·5-ò·ç×äׄŠl°MF‡ÑA Ô|½ðz!X½á…1*¨00L;c¶53GÌ‘H|¨Ù,6‹ÁÚd.2ÑùÛó_Î9T$ûKÉ'º[¸ëÜuî:kŽwÀ{É{‰«á:ã5ãŒqÀpN à_ç_0Ú8ÚH´¹pE»Æ*cðû‹Fwîã5«Íj³ƒÞo·‡«²¿ä±ùôõúz}ýémr¡±¢±¢±Âz:\`8Ô*kõíéÛïÝ|ïf?V“' ¼}øíÃрݓ»',\°pAT|pÊš)kö­Ø·"õÇû5V44XOÛ;Ã',_ò‚äÉ Ø~¹àòÒËKpâ$DšüÍUOU=z&õ À©s§ÎlIÚ’°?a?ÀÐô¡éÅß:?u>@§Ú©<;õÙ©@À¹Õ¹HóMóM³AC— ~ø$ä“ ;}ýÑ×}=òËŒž±c;Ÿ|TðyÁçYYÑ›p|Ëñ-Š_ñ|»ãÛVlXpàâ‹Ññîúp@ByB9à;èü!0z¢c–<’/ ÊáÒÎÒÎÒΈ°Œ¥c‡ÇbFy²êdUôÈg´Ïhö¿öø5~Áîû龟¢ãÛ÷Ø>`0Üðec§±3Ò¿ô®Ò»Jï²ßۇ厖e5d5d5Ð=ªŒ¼7òð7²‹?ÊÑW®«\pDZ;ŽìÉÝ“ °öÄÚS§Lpvôìh4èµM×6¼ûý»ß~ÚÞÉg” %Cɸþ³ÐîÑîÑî©©—§,í÷îsîsÆlïŠî/»¿´ ¬¼Â”€y·Ï»°Ž&MØ’¾%À1Ñ1à‹’/J²Öf­ÈLÎLøø¡†7¦mLÖµF€¯ö|µ‡àp¸Ñ‚šùóLûÐfj3µ™»¯ŠÄe‰Ë— ¡ŸÐOè'Zúì~iÞ¼Æ ’Ô¬îµz-‚xòróra©5×­®[Þì³?z§¿+û® ½8½„ã¯NóMó¹»ùPó¡È¨+ÏT¼Zñª9l>©=©=ynå¸ï”§^Zê[Ž G†#£÷™P][=·z®•gO.ɸh\Ä‚¡”¡ 0¶~l}4 Õd5ÐO?4‹Ì"ÿÿ0*FŽŒúýÁ÷ëÞ¯ãaû ­WëÕúÑååå–;öÆjÿ²¯Ôr¥\)_Ú¤´(-J‹ÔŠù¬§Ý³Ê³ ­ÝŒQcüМâ4ݦ;š×J²’¬g¬gÀʳZ¬–ˆ”úZú\}.H›è>é>ZoïäVí%í¥ê|­H‰"ÝaÍ9"Gß*ZE«hBói>Í÷â‡öÕÚäÞåÞry7{k¼5ÑÚ5ËÍòh@ @ŠÎÃmÜÖJs‰¹„  [óåšOÖ|b¼`ß@Cú >èyeÖs³ž›õœj¾š¯æ+Ãtsrøs¥Ö­ukÝÊ‘9çlœ³QG¥£ÒQéyÅÖnN~N~N´vÍj³š ÍW*šE³há׎æë7Aü¯ÝWbýÜ”*¥J©Q( E¡9_MQSÔP„"ñÏÒ†Ó†Ó†…ÐNk§µÓÊñpâʸÉýßÌe[&–‰eúױ˛+TKµT ”cÊ1åØ¿7þ|®'n2=quo8êÿ]EÇo˜âpIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-5-grey.png 644 233 144 6033 14774263775 15730 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÐIDATXÃ…—}PUå¾Ç¿Ï³Öf¿[ÒI Ø m0q{ó€Š5ÈU:¾4D¡2šÑ)Ý09iZŒp²țɹS4†¼øÂ…C÷#ê%^d“â ìÍÛ~]Ïsÿ`mhlš~ÿ¬Y{­ç÷ýÌóû®ç÷Û$77777ó0–™ ])ÞïˆwxMî×¹_ç~Íççåå­‰ä~ÜûyÓètÆd8ªUŽ*~'q'‰ áG8€.t¡ @2Á+7(7(7“x_¼/Þ¿~’Œ‘12v ,O—§ËÓÕµ¤¤¤Aw°;ØL’f8X£Ì5ήÀ ¬ gù,Ÿå³Fç”sÊ9°,¿:¿:¿úï½ÎAç s°ö_ÓÏM?7ý\Ì»Ú"m‘¶ccc‰É¨0*Œ `™ÿ2ÿeþ€çÞóÜó¾g½'ßl~YÏ£ïáñð‰òÆqîÃ}Ø’FÒHZp‘, ÁWʧ*¦*¦*‚ü¯}¼öñZéĮĮÄ.ê2´Ú m$YiRš”&Lã}¼÷¡Á4¦1 ©HðžÂS˜v,t,t,Dr[C[C[w]¿~9œ½3òÒÈK#/mÿ\¬ ÖÿI%¥IiRÚê"žÎÓyú4޲ØìöOnã6n[ø˜à-x ÞWBV§Õi º¡_«_«_ë^‘éÈtd:„=3;F¦”ÙÊle6ÜÌÂ,Ìô„ô„ô m’6I›É $ Y%«d…ÆËèeô2ÂíYŸiË´eÚ„=žü=¾‡ÇÃG5j<Ô¸}ݾnßS×§6NmœÚ˜²T_¬/Ö»“Ó“Ò“Ò“Ä‹˜ù˜qVŪX|èizšžPˆB @ÀÁÁH !BЀ4 ÝJ·Ò­Ç0Ÿòšòšòwòí½·÷ÞÞ+^ԞממÿºU´ŠVÑúZ ɯɯɯIZælq¶8[þ»ÅgÂgÂg‚‡fÞϼŸyŸ´ÌûjÞWó¾å <'À¨@@dÐÛÜÛÜÛ Ôߨ¿Q ^Ä‹x$‡äÀÞcï±÷«Ö®Z»j-ðÌåg.?sîJw¥»€$ A·¤ZR-©`¥¥¥Ü8þØøcãóL%Ö)çá<üàFW¼+Þ$´&´&´"Qôbͬ™5Ç\#×È5€ë¸Žë0×ã®Ç]:¢;¢;¢¶Œ-cË—Ëår¹ûûû@º ].Ì­£u´ŽÖžü=¾‡ÇÃGÝ¡îPwè¿eú=ô{è÷‡£â£â£âI‰œÏ‹6ÐÚÀYL“Ås‚ãׯ¯_"‘ÆH#jH5¤€×—¾¾ôõ¥Àž£{Žî9 èûõýú~ÌÖž¤’Ìæ—õ<úŸèuŒ:Fñ‘I‘I‘I0©›ÔMê&Ló,žÅ³ !GÉQrÀU\ÅU€t“nÒ=:é3é3錤¤¤EEEµQµ/_0¾`^<õâ©O„J(€´ ÀNìÄN@ÖÕ'Ô'Ô'0½(vQì¢X˜ZG[G[Gq„âá §gèzfV_‰ïð¾ …Z•¨Då Íb³Ø,€5Òit6Mg6¦lLÙ˜D:u¨,­,­,~ìû±ïǾ¹õ<‡çð ( p7pcNŸ¾J_¥¯(E)JI¸( B ÿv|ùøòñå$ʽýýψ?ˆ?ˆ?€ËÀãc|<'¤ÎRg©³€·¾|ëË·¾¼Ú½Ú½Ú¯6¯6¯6 Qˆ040404t$v$v$±±±q7qhD#g+ÅåôÂTëTëT+zh2M¦Éü[ªúTõ©êSwa®G×£ãßÞ*»Uv« À³xÏÂÆÖ°5l €ýØýs –Í–Í–Í€y§y§y'À"X‹ÀoB]¯®W×<„‡ð_=ÈF6²¾…oá[<À<€í—õ¿¬ÿe=`î7÷›ûqTÕ£êQõ¸ )6a6åsÅ\1—˜êüëüëü¥ËËËh¨–j©ãü?ÇÏÍéH!Rˆ”——————ú.õ]úUi»té>üüsðÏÁ@‚ô+N–Ì’Y2@È€C®¤æ{ó÷æïÍl131ãoD"‘ʽ„mSÛ¦¶M5^±çÛóíùaÖk‹µeÉGÃo ¿1ü†”³$fIÌúŠüµ: ƒ:ˆƒÆ 1þ¾þ¾þ¾ÀÕ¡«CW‡€z{½½Þü”ñSÆO€¾Wß«ïÖÍ_7Ý|@ŒãÄ8`'o“·ÉÛ/,½°ôÂR6ݱ¡cCǺ[«ŠUÅþßVW³«ÙÕ¼%‰äÜ˹—s@3šÑ¼ X1¤R 5ª'«'«'«ƒÒW«W«W«ùª¤³Ig“Î’«ì#öûœj¨†j@ä‘Ý#»Gv÷2îeÜË|›|›|›€ uAë‚Ö4˜Ó`€ ³a6 Ð@0}ËtËtË„-EEEø^}W}W}×þ¸À…˜-ˆ@":v’™1OhA-jQ+É ²‚¬Xubfl»²ÛµËµËµ‹íÙ.m—¶Kt¥á3Ãg†Ï°/à øhÈ"CÆ0†1j¨¡þUë| ¯á5€‡òP \’Kr1>á=á=á Ÿ/~ñð‹‡î½“'N>‹v…]aÿK"OâI<éó+ü ?ÈŠ å1O2ÎÌâARDŠHÑÕ,š@hÂ;UHG:Òé_«i5­¦î]–K¥ÒOúI?Æ€\ÍÕ\ pWpÀßäoò7D#Ñ9NŽ“ãpÈõ¹øîÅw/¾+eíÛ?¶_,V†)Ôaßèëë~yÈCùºÑn÷jÏ<ªE/zÑënÇ>ìÃ>Ry>ò|äùÂWT™ªLUæ7c~c~c~¢åÜ“çž<÷¤”í”ÏCé$¤ ÓdšL¤Œ”‘2€›¸‰›À1‚Œ@Ùdn27™ùªæKÍ—š/ …ZV§ÕõÙÎ gÅ{Ÿ´çµçµçÜÌÍÜ _Yç”tZ¾žaÞÌ›yÃ÷æÀÍ›€sŸsŸsß{Ÿhý´~Z¿;gºª»ª»ª…šÍ5›k6óU$‹d‘,(Ùivš÷”ž[¹•[gÏKÛóó3¾©®®†¯vP;¨Ør¶œ-ïzŒ£Çúìô$=IO År[Hò4â9.ä¿$JùV.‘P({7[öî+²w/Ìz—mgÛ]i8f8f8† ¬“u²Nhh p¸Mn“Û剰a'Â$ýàóƒÏ>/ÜVE«¢UÑ…šùhÞù_VÂJX‰X,Wv¯§b÷ì(äf=${7[ön±ìÝï~ã]Wµ«ÚåÞe)³”YÊ ¡”RJaõìD­ÎVgcÓ}%}%}%ÂmÕ‡ªU¶_tô;úý~~ûåÛ/ß~=-A㜶í$¼ ‘üSöî…ßx7p,p,P´œÍ=›{6WʆzèáÛæßæßæ¯ZZZÈM§¦SÓ °ÂBö4ŠÛÄmâ6[l¨1Ôj¤£²Þ¿{F‰G¹üNÄÇÇÇÇÇÃ-ß¶q/îŽÈîÁŃ‹ã?¥§¥§¥§ÿåV†*C•¡þëðêáÕëýÏ[:,–þÙÍS7OÝ<%ÅMº&]“.aŸb¥b¥bå_ò2^ÆËþë"”PB)ü‚QŒb”=å©€¼QîGyþ ~Ç»ù¨A j¤<^Å«xU|7­¤•´òZ¨}½}½}=[¬(Q”(Jh‡.¤ é—ÿ'¬2¬2¬rM¼¹ÛÜmî&—X `¼\Î[-NÿÅÄ#Þ• )YÈB–x}f®ã5¼†×HU/R/R/¢B¯Ð+ôö/bGØvd×@çÖέ[@„Êù<ƒ¥í8þGöãn<زIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-2.4.png 644 233 144 2643 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜXIDATHÇÍ–_hTׯי™$3? ñA¬Z”$¥&´è jA¨Å0µš”NC±ñ¡WÛ"—K©M‰ ­m®ÌÅÔÄÐ?à˵DÓ tˆšFL®¡ãC1!VI-½4)C0SÛ™ÖNXùÅÊ/ìžíúÝøâ|¿˜ÏÝ—âm” • ;» ÚÚ‚«òö±+J„XðÆðÃ_÷ÝÏ? •L%îì¼³<Ûõ»ñn¾‹WŒ/]÷ñ‹@ÉHɈñ?(+-+õMë›6ü3pk¼Øüb3À¼Þ¯} nå”ë@–,îZ,²]¿ïæ»x.¾ËçòçõT?[ý¬´¾Úújèd>áÆVÇšŽ5.Ÿ™àsqˆr}ÕüÁüøÈš±fX}]_,mk°ô¸PÔ–øØ´¯ó:å<åâ;|þ¼Yþo{v‘‹JT ‚¾a­5cÍ€þ›õ“õ¦ãÐúCýŽ~'/K_Ç[nò-ß‚> :ýœ~¥®ª«EøDƒÑ +°g—«Ç—ÿ<ñ‰H(J½ù_ ÆU\‰Èe‘’ËœÔ?*ª¾äK)Y¬_¬Y¬CùÔ µBÄØdl26‰È¨ŒÊ¨ˆ¤%-iÙ OÉS"f‰9fމ‘©ÍVf+¥Dü¾}?ÊŸrÕÁ×ñL<#Ràwõ8§fÞúà­@ÛöÓ@ ­Ï>Ÿ}999 U±ªXU vÛqlÇ1HO§§ÓÓ^ÁÌ›æMó¦gÇêcõ±zhÊ4ÝnºíÕÕþ×½÷î½|ïòåù]=ް©wað·Áß@…ô߀¥S‡Ouœê€ºÕu«ëV{„Ûn?¸ý ôMôMôMðÀº4{iöÒ¬×(Í­Í­Í­žß>mî2w±Ä5—/Ïïꨜ¨œÐCÚ’ÚlZN°°w¡}¡æoÍßš¿c]c]c]P©ÔF`¢{¢{¢Û‹OûÓþ´ÂUáªpì9²çÈž#iˆ4D¼8uÃ:itÎ1Pàwô¬¬XYa‹?/þ œsŽ}‹~F?ãu†:C!Øß߇du²:Yý`¥zŒ£ÇŸ¿Ïß[§¶Nm‚`.˜ æàlôlôl´¨r1wÌ8üŽž€ˆ}Î>g|'bµX-ò¤krMªýÃFÒHŠœ¯=_s¾F¤;×ëΉô÷÷‹ÌMÎMÎMŠööö‰Lg¦3Ó‘ƶƶÆ6‘3ƒgÏ Š$Œ„‘0DR±T,©[_·®n–a‰ˆHµÃ/=÷÷˜ýÂò»ðŸ Ÿ^øÂíáöp;ì.Ý]º»Æ œ81pö®Ú»jï*˜;:wtî¨W‘‹Ç/¿xW®8\QT©³Élb‰¥‡öØòSé¤= VÖò&º侕!C¦hŒ5ëfÝ Ö¸5nƒ=bØ#ÀçôÒ úeý¶~ j£ÚÜý¿§ò‰O ” ¥²~Ÿýuö×Ï zR=®ç®úXªQP×Õ”šÕ¯úU?èýz¿Þö6{›½ 褓Î"¡gõû=`Ø}vwÉåñѳ֬~–ͱ¢ÉO´,ZV˜JßpO]V—_컓;Na`‰¹¢ÊÙ(pωÿÝ~Å~TR%‹ð2ù~WÒñXÇc€'N¹÷‹Õkê5–@_ÑW00À³]¡%œ|ÏÅè]ùȾ.Ù÷Ø£ù‚ý w)ç¶°IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-10.3.png 644 233 144 3127 14774263776 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–íO”WÆï˜1 "ËblØÒ¢1C0F0Ŧ–t°Æ(¡ÛÐ͆Äúš&Ua›J •D›¬†uUÄš@x) mQVð%¶®]D›ùÐBÆ‘ ‡gžçüöÃÌ3ÃÖÀóer¿]×5ç<ç¾€ˆˆ, ý D¥E¥E-ÚQ‰øíïØßy£5hŸÔÁ²Õ²õîçðuÂ׉-‰-ÆýˆmÆÍü…õ"ü…|¦_–HÄ{)ö’¥ d×Á‡ÙfÛ_ Ú WÀÑáèx€;?îh?Ó~†¿Áäðä0€·À[ÛŒ›ùf½‰·_êþÀ/¶ïlßYÜ#é…é…«k‚ WÃûï½ÿÀ¯Ñ¿F«(Ч€8âTàǹ¦Øf<”oÖ›x&¾Égòõ$ç'ç‹@ñ¶âmŽf4‘ûç`ïë{_r´¾¡Ž:â@·é6àTàEà~õã¸qèT]ª @ÝV·¿¾M߆Þ€h ‰&âÔ¿Cxg÷\ÚsÉxÿ߸ü.¿£ÙÔ#ÿ¶_½ %³%³ j´«ê{Ù  î¨;hTñ ŒIã©ñ4¼S¨h­¢TPñ³HMªI”ÚldhÀ,³ â‚ø•T•T™¿z{ÁQŠˆd‡ÏáóY¹ñ ñAcvËsÏlÂlsZ«ÖªµFøü¿ÇïOº'Ý“*[e«ì‚Úh£-bjõZ·Ö S›~?óûæâøoÜŒ8Úí>«©G¸#"rrªUå0Þò›ªª…¼Õyò6 z·önéÝ!ª4*JmŽ6G”””ðÒzVü¬øY1l\³1kc$žHlOlG•œr5¸`þA>ødæ“P=A=¢ÆDD~Úß>üö!<¿  ªr?]·tÝRüæ¾Þ”›rSàò­Ë·.ß‚LK¦%ÓOœOœOœQŸQŸQ»:wuîŠk‰i‰i‰¼¤¼¤¼$ðÎy§½Óš˜Ò“Òƒ(åîÄÝ Uݪ[ÞÔcµ¤.î^Üã”± onxSdÑi™“9KóՎះY·Ýù™ó3‘ym>0™¸1qcâ†Hʪ”U)«DR®§\O¹.’Ö“Ö“Ö#âNr'¹“$¼vnÚ¹iç&‘ÒÝ¥»Kw‹(ª-ªñÖÖHlæ@Ú÷iß[šE–Ÿ^~Z$J‹/Œ/ÌqFI|tYtYrÏVo«‘""≞´¥ÛÒE¬UÖ¬‰H®äJ®ˆõˆõˆõˆH 8P(ŽÐZ@ ˆØ÷Ù÷Ù÷Eü£¹£¹£¹"£c£c£c"]º~éúEdÅ¡çVœù×?{m½6ñˆ,=¸ô ˆúAìb'+J0ºŒ.Ë=Ñ´wµwE,‘dX¯ÐËõr‘™œ™œ™‘üóùçóÏ‹¸kÜ5‚º‚ºÏcÏcÏc‘œk9×r®‰\<|ñðÅÃ"ƒ³ƒ³ƒ³";Ží8¶ã˜ÈТ!ÇCÄûWo¡·P$áá’KH²ˆÎ?'"e*^Å[î…nåO{¸v¡ÿB?PüÆÌË·¿xÿæý›a¤o¤o¤/òí´noÝÞºÖÛ×Û×Û¡ßÝïîwÃLÖLÖL¸\.—ËS+§VN­„£ÝG»vÃÚßÖŽ¯‡fOScS#þP³©¢í© §€‹A=!a'‡ ú`õA“Öx ¾€B¥*¬(Ÿ|ò³œåì‚ë×DM@6Ù,ltÐ(4´HÛã¿z²ž 4š|Õ_Ṫne¸)Ç„cÂgÅx =ˆl1*µAm9õ”å,ðËŒeÆ2кSw‚1` @3Í4ƒ‘j¤©ÀŸI'ôú°> zí|ÿ|?sÆŠPûaÎ çÚ ü·°÷Ø{–ÂðÚ'¯}ÐÝÚÝÊŸà§ë?]XØ¿°,lúÍx3ßä‹å—3ÿ£/k>]ó©íߘ˜ ééoF¦2 øùâçfš}HÅ€î’IVû?~Ìq'›þh¼™oò™ü¦ž©©G õ™ÔgDx·d±dÑ~!’àiç|MkM+¨!­‡Ó¼Ïû$CØöèÕz5!öªSu¨oÕ·@H¯Ô+ Ax!¼ü3’Ÿ¯¡¦©¦É,ÐÓÎù’@IÀ~RóSó­=ÎMùd–ï+ß*@ttPõÆ+Æ+hê5¨QªO¹•Ô„úJ}1kæÃƒÓ”¦4”ú‘j¤¢¨º¿ºU¶\¶lØ”³•""Yÿ`ÀÞfoóÇÃÔö©í ½Àï|ÙsçæÎÔÎhk³j,Ý[º·t´mF›‰q4ÑD“µ?h Zø²çç joGøaêÑ©G·½ÝÞî7ë‰ã ‘êÝrðÕ_^ýÅö/oónóªÝe/=×þ\»ôoÿm–?Ë/ö¼äØüÁfÞÈ’›Ü|ÄvA}ð<_mïÂëϾþìý² ôËúeYDñÿQ¾ûüQ=S?RÐícؽv¯?^]óæxs@oŒôý»•¥•%‚ú9}XuUõ«þ˜C^j”¥@ $L0†ÓpNPåªP‚Þ®OéS ³²°²@ÐäWC=S߬guç_yÁö‚ ˜ÐÆXÔôà®Qd¡±€"z#ˆÞa„éìü‡yæ!Úpwb£…(ŸÉoê­îüÑ»’Õ‡+cîJÞÚòÖs]´ ’!ìûô*½Š¨5€ XØô›ñf¾Égò›z¦~¤žùuñÀ¾ÇÌì2v+ë„9|IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-51-grey.png 644 233 144 6004 14774263775 16007 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ¹IDATXÃ…—{PTWžÇ¿çÜK?ÙæU…ÁÕ´^b¢Àꬤx()t%>ˆQL¹È0jù(Œ¢. 1qÝ! “TíLFƒãj$„@Ad˜£ HB Ø ˆ…±‘‡@hšî¾÷œýƒ¾`i¥òûçÔ¹}Ïïûéó{ÜsHNNNNN¼1cc3ûÄ>±×æ\ȹs?“7˜7˜7¸f ÷á>ÜçÃßKR€°ü-G•£ÊQÅ?€ &˜H6†0ÝèF7€·ðÞâ¨_U¿ª~•d‹ÄâƒVyD‘GGÏæÎË—;¯ávþŽüù;ˆU ”¥@’4ÃÁšÝ\Þtp%Vb%½ÈòXËcÍN›Óæ´ùGæUçUçU_ìwZV§µþŸS/M½4õÒòCú"}‘¾5ËW/_½|5ÉŽòˆòˆò"}#}#}e®ü®¼¯¬WüÍúwë)ú Â'ºwp7p7°í$¤“ôÀ"!P¯Ÿ³•ÙÊle‹|ýêýêýê僫»Ww¯î¦®ˆŽˆŽˆ²N­ÎVgc ï༦0…)iHC€ù˜ù˜r,p,p,ÀºŽ¦Ž¦Ž&îú:ìë°¯ÃØÁ‘đđÄÔ?êuºÀßiät9]NO(â<ƒgôm'  «(;ÆŽ±cìÜÎíܾà_OÁSð¼ìwŽ;ÇÝ ]º6t­´2s:s:sZØ;³cĦ^§^§^‰E²H +d…¬àFnäF€/ä ùB€Å¿â_A§Þ¬Þ¬Þ IYŸéÈtd:„½ŠEOÑWx>RÐ\Ð\Ð H^’—äu¾Õ¶É¶É¶iDzÐÒÐÒÐRi]F|F|F¼XƒF4¢!C†k°kð´qpp3[´£íÀL(øÂ¾¬°Â:çï\ݹºsuÒº;{ïì½³W¬ÑWè+ôÚÄqq\ÿÏåTš”&¥É¤Hç5ç5çµËüRüRüRxpJ~J~J¾¨äÈ„tAº ]€ÁqÈqÈqp2's2ÀyËyËy pi]Z—ö±'#ÉÞÄ›xDI”DÀ¾Û¾Û¾€FaPü§”¥”¥”‰}…Gá£<Œ‡ñ°“›\±®XW,××׆ÕÞÞÞP¹zêzêzê€w_~÷åw_ Ö¬-X äyåyåy§îžº{ê.0NÆÉ8ð¾ÀZÑŠVà›˜ob¾‰®Ä]‰» ½èäýò~y? Þç½Ï{Ÿ‡JÑWx>*KÁRð¿eú û û ãƒb_ˆ}!–” YÈš…m£m£m#`XfXfXììÝÙ»³HOLOLOR )†`8b8b8 ž<9x0Ý0Ý0Ýê–Ö-­[ Ð`Lƒç2…^£×èµÙ©JÑWx>êuŒ:FñgãiãiãidkiiaJ~V~V~¢âáÞ¾{ûîí´íÚvm;0TÓø/ô_è¿à«ø*¾ê±œÞ‡}Øðí|;ßQÑWx>Š €„ÑËô2½<»\´ eÎßȶ‘m#Û€=zôêNu§¨ð¯ð¯ðŠK‹K‹Ké¢é¢é"`~Øü°ùaÀú£ë®? øoðßà¿pšf§ù1PmhCÛœ>}ƒ¾AßPŠR”’0*B¿2==émémémÂ0$ ++“ôIú$=°»uwëîV ->->-Ø_±¿b0d2 ™æþÀS–‰LddYD=ö|#ˆ™˜‰yVO°µÙÚlmè¡A4ˆñ+TsZsZsZ*ì™×3¯g¿ÒžÖžÖžà:®ã:ì®-®-®-Àð¦áMÛ/æÅ¼ØœŽ.X¬ T/ª^T½8Þs¼çxïiNB %x²­±t–ÎÒH Áޛܛܛ Xî[î[îã¿5=šMT(")HÉ5‰ñb¼ÿþ±¯¯/9(¨5¨5¨Uèõ¹âsÅç &êãëãëãa ¯Ó×éëÀFÓFÓF`~Îüœù9@eWÙUvÀ¸Ö¸Ö¸öiPæÍ¼™7À‚X z¬˜Êi9-‡Cº.]—®C÷åÝ/ï~y—­$‘ˆD[H,‰%±çÆèL²Ÿ:®ŠSÅ©âÊF=$ô–[Ë­åV9KiO;×ï\¿s=ž²§ì)ç~8÷ù€ÎèÎèÎh`søæðÍá@@i@i@)À>f³ç€Ô™êLu& þIý“ú§¹Ï9L“ÃPW½_õ~ÕûljàÒÀ¥K´Eõ‘ê#ÕG?muõ»ú]ý]äĽ÷NÜp7qó_‹===›µ“õ“õ“õ‹2n%ÜJ¸Åã“z“z“zI#kfͬÜuÃuÃuDÔ‰:Q»„]Â.pä 9üà?ÀéŒtFò2y™¼ К´&­ S?¦þ˜úc*¶”U–U–UâKm¿¶_Û?È.paù„#á ÔDMÔ$|OÏÐ3ôÌý}ÌÌÌÌœîÔ5èt @ÓÖ¦­M[ùóÆc‡—h ¡1°«¦TSª)@ˆâ„8€?äùC'q'ç•OªJVÉ*ypâÝ/º_tÐÕ|ZóiͧR‡ÙÃìaÈ™ ÇYAV@! Q(.bcccccy)€ñ$=AOн‡i"M¤‰Ëå#òùHRV¿½ßÞo—b"Z"Z"Zèis´9ÚLðoù·ü[¨I‰"Q4Ð@À 'œúЇ>€‡ópYB–%ÐW²JVÉ䬾ʾʾJñuiº4]Ú¥ü‰‰‰CIII#ÿ ,°0I9êÑ~ôK·gBGª–T,©XRQ¸A“©ÉÔd^Êä÷È8Vî_î_î?—»îÃ…è@€iLc€j¨¾˜/æ‹ÁI I!)PgùÎò…Ç߬¹Ys³F(ÔÏÓÏÓϘv^t^t^<|êvîíÜÛ¹·p ·ÀË­s^r—™'ódžðjÿ¹ýçöŸççççô>z½Oßåîêîêîj¡°öµÚ×j_ãñdÙCö@Í>cŸ±ÏÀ¡…Z€óq>ÌT/ìC–!Ë—ê—Ö/­_ /½UoÕ[Í¢YôáS3©70íNÅbw­%)µH”òs_I”Víp÷ÝBÔ£õrYIV’•ñf®×+]»\»\»ØÞT–ÊR‰8q&â ^e]¬‹uAGÃi8 ‡CÊ–²¥l¨? ù$ä“9ԺººB¸£YªYªYZø»™¢9ØÂJX +‹Ý‘ݧD,?????ÊŽÂýÀ1R€œ5sç‹I)"E×h£q« dÐ?U»ª]Õ.i×ØÙ±³cg¡£”RJ1®ìDƒ½ÁÞ`gS%%%ÂÍqÍqÍñÛ5ŽûŽûŽûÇÿxç•;¯Üyp*V§ÎöÛ'ó/èÜþáÎÝʧr7àQÀ£qìóœÏs>Ï‘³ŠP„«÷÷Ãmú¾éû¦ïÉv]—®K×¥4ü½Íâ6q›¸ÍþïÁQÁQÁQtÔ­÷îÑþ$—€_±™nÉ=íà*®â*²ÛºØºØºŸÎœ®þ)©ƒÕÁêàÍz˜ð0áa‚oÅXçXçX'ÿŸöóíçÛÏË«&]“®I—pÀ#Æ#Æ#æíü,?ËÏþ­f¦Ø„^Œb£l¾÷FIOòü†ýJîæ¡µ¨•sy¯âU±fz•^¥Wÿ<<<Ì{”x”x”ÐN!CÈ2¾þ6äjÈÕ«kb-f‹Ùb&uÌŸù3~Îí·Ú 8õk¿aOä®»]ȹ؃=Ø#¶’dÙñM¯åµ¼öhšÖ¨5j´Sèú…þûFö!û}¸ëç®­][»¶3€PŽÎÊÁÒþ[ÿ[Ì¥s¡ã‹IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-128.png 644 233 144 3002 14774263775 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü·IDATHÇÍ–ol“ÕÇÏÊš•á’ QrmrÑÆ%tÉBVæ0ÕKi“9 Ḛ́Ff|±iH¬^ø‚8Œˆ—%w¡\o‘--  2˜•½Û‚T² œ¸¿X±[Iû<ç9_´ÏžÞ‹¾ç¼yòû÷ý~sÎïüž#@!Ä#¹¯€Â' Ÿ,,ÉÚ…M–¿èù¢çÿÉÚí üþ«AXtpÑA€ÒPiȸfÙfÜÌϯÂÂÏç3ýâa9t.è,pçì½Ð°²aeÑ£YûÃK`‹Ú¢³:ìèÞÑ 99ÊNûjì+€„;áË6ãf¾Yoâå㋽ÿÇ/GU}\µ¯jœ=vöØÙc±§ÏÓç郒m%ÛJ¶»ÙÝìn†ë¡ë¡ë!ðÛü6¿ O,þiñOà[î«õÕ¢î5%_N¾lñá|ýäë'ÍÞkïÏ haExixéܼ6{ç÷~ÿˆ´ë]W³«Ùº»6 l€]'ºNt#éH:’yB=Ç5£5£5£àêqõ¸z`04 㟎6Gœ]yjðÔ i“ÏXý™ã3‡)l E@I_IŸêdflùØràZ.µÙXc¬ù¸|L>N·ÓítC¿Çßã‡ôxz<=·.Þºxë"œÛ|nó¹ÍP~¼üxùqˆE‹¢E°Î»Î»Î ö„=aOÀjÿjßjLÙ'®N\ÍëÍ®Û7oßS€Ò…¥ ïaúöôm 3{í•2&I«°ª¢ª¢ª¢áh8¶ü-©–TK *†*†*†`øÂð…á ::: ÕgªÏTŸ±ò+++áàß>)þ¤Ø3ò‰M›ÀÔS(„qÒ8Yð½@÷ê^!„&„¢¬à)‘1·îïï…°÷Ú{í½BÄšbM±&!öï/Þ_,ÄÖÄÖÄÖ„7"7"7"BŒÇÇããq!&×N®\+Dׯ®]…˜þïô·Óß ±äKž]òì|™xGé1!,=f¾¾ IJgÎ&ý7ý7³ ¥·¥·¥âµñÚx-ô‹~Ñ/ ®º®º®r>r>G¶Ù~d;8w:w:wB‡Ñ1Ó1 Ö¨5¤ÌñG‘ÿé±Ü­$ð~àý¼[‚žÔ­¦V@Ú’ù'K"‘yv„`˜a†óüwsxúaýpŸ Áûnå3À6fKÎGh#`˜sÌh5ZI Æ^c/ðw–± TFeTän¹[î—qyH’‡@µ©6Õòù£üäÛ²Cv€ñ”Ô‚¤8nâÿ°è‡E€fµÞ7ÇÌAÛöÔÕY“dLÆ€ã%ã%´Ü®(4R¤€_¹Ã A‚Dža–Ù¼O[Œ-h ¿”_æã›|÷Mþ¿øWÒº´un®iQà>Àn±|U¾JÔ%u € À²Íø\KäêM<ÿ/ÿ•ìëâ}=˜/Ø?ž@NçIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-33.2.png 644 233 144 3251 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü^IDATHÇÍ–ûOTgÇŸ3Š0V@VRce[lЦ ñ²(o]ïE+ˆMÖ5­ÑMƒY¶©Mipâ/U eݰK*wèN׊×zÝêþ ­ˆÒئ,Ì ;2ãÌ9ïg˜9Î캀ï/'ßçò}¾çyßóœW@DD#OËËË„0¶ü&jOXš°ô— ã:´µÚÚow­ÆVÔÔ`tD±é7ãcóE¢ü±õL»$JÔßߢ-ŒààÍ™oÎLøEï»Ö“Ö“Ã!ØâÜâhu´:ؽ—{/<\øp!D±é7ãÍ|“/–_>úŸú"çŠsi?@ü˜ø1"0uñÔÅiÛÃ]i°jùªåÝ£ºG) èýÀ8Æ©…€ærÇ`Ó‰7óM>“߬gÖëHÉKÉá“Õƒ«­õᄎc.?R~ÔE€àIþLuŒ]tþú9ô3õ±ÏØ4¨£ê(€º¥n~½P/$¡‡¡‡@-Ÿò)ãÔùŸ½|ù~S`Ç1ެZ=d­‡”E)‹¢{yî_DjAfA&¨_/ßó=¨×±ÆX‚ª@娔úªPO:…š¤&©IÀ<æ27jg’RC(5ËH1R„sƒ—ÔOoøßð›÷/ŠÙJ‘—sÖú™õ3ßhèšÒ5‚UüºÿµŽ…‡Þ ½­\\\ýùýùýù²‡ì!{Œ ;vbp°(hÚ¡ÿ•{ìáQðƒ0?t½ÐõpÆzÌzÌ7ÚÔ#J©ûÞÑßÑað02Ì™—1/ŸXXÚ°tCÞ†<èÛÞ·½o;äÉ;“wï%ÞK¼ÕÕÕh ´Ú¢‚¼åÞro9¬8¾¢iEØþ`«µÕ¢r«çìž³<LØV´­Œ†õHh±ˆÈ¿Êá+ïW^pXÚn¶ÝT¥s'ä8sœÜ¿uoro‚3f @YoYoY/,q.q.q‚§ØSì)†ÔÉ©“S'ÃyÛyÛy[TXCOCOCLOž:=5jŸ³=Ç–c#pð ã-Ç[ªÚ“Û“!4&¬Gø÷ç§jam½'¦õ¾zo™· æo™_6¿ ’Ó“Ó“ÓÁ“áÉðd€¿Ýßîo‡Üñ¹ãsÇCò`ò`ò ôíìÛÙ·3ÊÓ[Õ[Õ[Ýþn·Ú+Û?lÿÒ³_ ¾„4^9qå€/Í—ÆìçÏT‹¨Ã¶£¶£Æmð]ó]ƒ[¡Î·;߯}©ú⮋»``x`x`²6fmÌÚ{*öTìŽS§:Nûºûºû:d¬ÏXŸ±…ŽBG!O­ k…µÂ Yö,{–.§\äbÔíVûô/†’´$͸=ZýU/ÑK´Û£vĽ÷¾¼rãõ=7z$¥2÷½ûïÝ9ÔxØqØ!òxäñÈã‘»Ew‹î‰‹TÆUÆUƉx›¼MÞ&i¤Q¤ÕÕêju‰ y†¬´¬´¬´À²Ÿ–u.ë„̉3\3\þ~ùZíµZU _ ~1úkæÃü*·–n-¾02Qú}GtLq‡ïøØÌf6?½UÜáw€CâPŒ]GGÿ¯ÈAQ ŸÒO™&#¶.ۺ̜gu_ktFæÆtk§µó›r9r³äfÉøqÿ¥+/]‘åb ¶[å„ö·ÑgGŸ•±–©–nK·ˆ1Û˜oÌ‘a–aÍ¥¹4—ˆ%Í’fIQÔ#õHD‹×DµNÕ¨É4&eD\c’Æ$ÉzËì®ì®lùRË{õóW?Š““þtzΧ'?ëÖ%*2ùýú9ý€Qb”|ÒAE€àg„‘˜~‘yñà‘øc•±Š õÓúiÀá¼N[§ýßÉùW²¦pMaÌ¿’Ïï|þÉÜ>™åã ä ùôb½˜¨ êD±é7ãÍ|“Ïä7ë™õÃzžåÛÅ3{{6o°ÿ gÿ¦_èIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-183.png 644 233 144 3040 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÕIDATHÇÍ–oLTgÆÏPÚa :Œ²±lË6v?”Ä4ÑE1†Õ:YÉY  ­m°]µtë®IB§dc ÉŠÿ1Ƭ¬Š.Nª[ØŠDbšMN¥¥Á»)0U\”ˆ£³ÌÜ?ïo?Ìܹ“5ýîý2sÞsÎó<÷}Ï9÷‘¬Ä¯@ZnZnÚ’¸¶Ë^Ï(É(ùùŸ}ÊÇÇ–ýÜ'Ü'­“_ò>ï“I›~M¿`ø ?QN¨­j+¨ó[ó[àÏê-õ€ñ‘ñQþ¤Ð€ú†wx‡Lþ’À#¯'ø’üq=öQš""‡Š R*%)(¨êu¿îõOã–q -áP,AP¹*Wå&w U¢JT ¨BU¨ AÕ©OÔ'( ƒ4µÜ,3Ë€Mq|¨Ì®ÌYü’ZlyÇÁußu?œ¡G¡GÀ×ø@ ¨"ç"‹#‹A;©׎ÛBb-±–X L•M•M•ö@{ =°ýZ©Vª•Âô¯¦‹¦‹@oŠ]Œ]$’pûø:t4tÀv…Ãé–ž„°S}ü§fwÍn Î\¥6j«´U0{xöÓÙOQëÿ°~Ïú=p}óõÍ×7ƒJWé*|¾ _,w.w.wBÅhÅhÅ(L®˜\1¹¼;½;½;!ëYײ®AEKEGE*ö÷È…È›òwo½{˪½S}iñ}+¸"E¯õ¼Ö“ØFqüâ¿ Õ ÕóMù‚¾ 8úôŸì?)â yBžH¯¯××ëÞ7¼oxŸHÏÍž›=7EÆŒ?"R»£vGíç2ç2ç2‘;¾;[îléoê»ÿmq|“9ðÅÀ³øTþÆÀÆ€Å_pE`É—K¾T—y4ùÊä+ÀP¢V~gæ›ù`äÏÏCþhþhþ(\m¾Ú|µŒN£Óè„3‡gφ…Š…Š… س!gC,^:´t¦ÿ6õÁÔ)µÙ>121–ÏbÏbó;˜™˜™.ÇÛ^)sÊœ²××סOõ©>ê@u  Ë Ë Ëí¸u»ÖíZ· öúöúöú`øîðÝá»0Ó6Ó6Ó+«VV­¬‚¶ösGϵnjÑrÿÃû‚¥'MÄì2»ß z™^&"šˆˆd;~&1k£ED´EÚ"m‘Ht>:Éqç¸sÜ"÷ZïµÞk¹ä½ä½ä‰lll›››ÙÖ°­a[ƒÈâÅ7ŠEf;ûÞì{"î ûœû\>[~­ŸÕÏŠØz¬…À\`¨ß°Y¨?$j½R}^}^}ôì?ØÐÞ¡c]ǺŽuAÁDÁDÁ´v·v·vÛþÆÛ·oÚÁ5ƒkáÌÃ3?œù@ ©!¢\Hðõ®®XÅ?Xkw%5×|œÒ%èaÝžè ƒH²Éši¦a„‘”õ9æ˜NsšÓ<ù &Œâ˜Þ¨7¦ð5 5 vW¦Î±I×d8ÒB`Zs̬3ëˆ˜Õæó(CETŠ@£Ýh7ÚÁ¨7êz0 ̳ðâÅ Æ!£Éhc¿ñ™ñ˜?ÕüšŸ×-üï3¿Ïtטkì‰9f ÚCEP™Q™aO~0‚FxlV™Uh‰Ù¯=ñ_Q¢‰ƒ7/U‰˜ó ó ´$^ßâ{bòÿÈ·’ºë^LtM4‘i±ñ¦ñ&QP½ª°mËŸ,‰D¾…gáÿè·ò©½]<µ÷±§óû?š¶¿&ÕtÏIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-178.png 644 233 144 2730 14774263775 14774 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–_LTׯ7ÔV&aâ4Ô¢%·˜@¹Ñ¬ACl4ý—Ø‹ZšlйI­/’éššµ± -±jm"‚åÊ\"¦iB͉t0,!õ*›Æ@)¦¡2@™9çìýëÜ͙{MßÝ/“µöZß÷ÍÞk­³!„Èq~¤oHß¾&i§×¹þŒ×2^+¸”´[mHÛ›¶÷N#d‡²CÞ/½_Ê{®­÷u|j¾.~*Ÿö‹á:Vw®îLÛåØMðæ¦77e<•´OÜOØ^´`÷þn€®¯º¾â]˜êŸê˜Û5· \[ïëx¯ñRñEÓÿñ _{üZÚ}XýÄê'„€üWò_yî½dÀŸƒ=¯ïyàçÇ~~L¥€= d’©v1bèM±õ¾¯ó5žÆ×|š?©G€o§o§àËÿ–ç|2áÞE¬`^0Oó™a¶q€dòuÛº |c{lquW¶ÊVP1¹ @ýG~.?Ž[ãÖ8q¾¶:­NPj¨!“/<|Ëá[áOêq¯R !ÄÉ—¡RTŠAUo}h}j̱G0 Å¿ð îZf™åûÖ±ÔU¬ŠQ@/½˜Ê'2&ñ¡ÒWébš_¤[ѧà™öLÇVÁèÂèp €Ý ÔK‹m‹}‹}`o¶‹íb0«Ì*³ f›f›f› І¢!˜;7wnîćãÃña0»Ín³frgrgrÁÚ”ð'ü,9òw=>zÀóÄb«´GXk¿ööë¿+KÔ‹f‰Ys§æ.Ï]F•½Z¶³l'D¼oÄ ‘›‘›‘›u(ëPÖ!(¬-¬-¬ÏÏÏ8zâ艣' úzõõêëàõýèûü…þ—ü/¡þ¨‹UŪ\>^8põÀU]{­}ްÞçïíëÛ×ë@õÎâoóŸÌB|[ý¶ƒÛº½Û{¡÷Bï÷Ææ[æ[æ[ÀØhl46ÂæÄæÄæ´-F‹Åáâpq†Ç†Ç†Ç à³‚“'áÛM׆® ×|²´­ ­@ ûá}kŒ5†êdaªpª¸ç„”[ä°×ÙOÛOÃÖµ[×n] áX8v»peÕ´Õ´Õ´Ah<4{Ù^¶—¡(¯(¯(²eË>¥{Ký¥~˜Íœ¾3}ÇÍWÿš¼?y´Þ,o–¼ ÑÉè$Йl{¥äŒœq·×o¯ß^]]]®`p`p`ò{ò{ò{\ÿ™œ39gr`GpGpGÐõ—ì+ÙW²Bk~²ùIwÌØÿœ®˜®­']yU^M»+°öX{„¦B_Ú³"!be% ‰!Ìr³Ü,wý—ŒKÆ%CˆÒÃ¥‡K»~¯á5¼†ÝÝÝB\1®W !¢·£ƒÑA!rÿ‘û|îó+á>ñ±"B¸ztÑþ ýIÞ9ÖïÖﺠ¾®¾®¾úí~»ßvO !Ðh@ÏÅž‹=¾âæ¡æ¡æ!(+/+/+‡³òìÂÙµEm!ÎÃ÷]{W{×ÿÔ˜Ó•> |”Ò%X1Ë­%Ä]™€D"Sì[Üâ°ÄKÀiNsa„‘”¸^§uÞ:ŸÂ§Ƈº²èSðLy¦b«P£æ¨ énAdI¾#OÉS &ÕOê§}²Cv€ªUµª6E@}ôýoû²}ìÃv‡ÝòY³Ñld‰¯5þXöX6`z&<Í1=hO¾ ••ÝŒ€±#À¢|C¾éÌ~ØØ@ŒyæóL=QHH9ñ¸|[¾ ö÷ö÷©øšï¡ÉÿßJ‚ëƒ+sÍ ó1™îÛÕv5qP7Ô ÒH×Öû+%áäk<ÿ—ßÊGöuñȾÇÍìŸÎœR*ÇIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-40.0.png 644 233 144 3133 14774263776 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ÝOTwÇŸy+s } 8Y³"Fƒb'$ PéÆNâ,¶Mˆm)¡&EÛÌ"í^¨›…„ÄÛpQ{ak¢…òâ"\°ËKS1u±´¡ÖZ£[`• u0S 8/çw>{1δÙ?Àssò¼ü¾ßï9¿ßó`‘EÌçaŠmÆWóÍõ&ž‰oò™üI=™/f¾(*Th­ÄEDnw±Ç6Mñ>i$t—îÎ&%5¾W§Ô)`ÀøÂøÀ¸n\¢z…^A ‰ …ÏøŒtãÛ$Ž^:zÉx»“¿ppj­¦k+•ˆÈÉ}P¶¾l=p >j¼£/éK4ÑDœÃ¼Å[jVÍ©¹µ?…á0†¨æmÞ¶üü ?~ 5«£C¸Ï}PÑ$>~ýƒ×?0žÜ—²•""¹§XÖîhwÌOO1^ŽÖ®d¬d°ž¬‹¬³ø¢ÓÑéè4ÌgÍgÍg‘gäy)‚úè£Ï2ccûcûa~S¨>TϲáMâÃı‰cÀ¬6¦-:‰&õ‘3W!ÐhÝ òMÀúÕOÖObøoù¿ógU×T×T×€vB;¡€ª`U°*˜"¬vÚ-óÐì¡éCÓ uk}ZFÕWoºÞt™Q•Ï•@v (NêYýc׎ª‚óÛÏo_Û˜ƒ—þ=T7T—Ô/•¶J[¥ ‚¾ /èƒÜk¹×r¯AÈr†œÓ”Ó”Óáð@ØÔßÞßÞßÞÞÞ* å…ò §qËÖ-[‰~¹s”QŒƒ0Ø2غ3©ÇÎÊ“ƒOî,´ëoñ·ˆDì+é+é¶Ö6~ìûØ'iå7ʯ—_qÕºj]µ"s=s=s="žO‰§DÄ“ð$< ‘,o–7Ë+2)“2)Öso÷½Ý÷v‹xò=ùž|ϘçÏ"Y¿Ë~!ûIûOõÖ­¶Vÿ°X„èºËë.ï,´+§¼&¯áÉÜ›¹Wäó-?µü$óÁσ#Á‘»¸»÷î^‘àÕàÕàU‘ΦΦÎ&÷÷÷K@<OÄ"ÚEí¢vÑò;79797‰$¼ o›’Ÿ>þ¼ˆ»Â}Ù}YæE\Ó®iÛSŽ*G^»ãŒ¼$/Ùn‰,ÜY¸#òÇ¿îÏØŸ!™]i]3]3"9ï缗󞈻ÍÝæn Ìf3"Þ ï„WäøÐñ¡ãC"óæÌ?)//i?Ò~¤ýˆÈ®ò]å»ÊEfŠfŠfŠDw4noÜ. u„:D|ÿõ5ø$S$ GElKtÓm»µvÆ ;Òu8yÆÌâ>?Ü<Ü u u uÖÙéÊîÊîʆb[±­ØCSCSCS©‰ÔDj ÔQê(u@Øö‡ýл¹wsïfØsÏÄž øòçO>!jži~ßÞ|ŸÔ#Ì®UåP`Œ}É*IüóÑÀ£PÿPcj ƒ‹ôÓê´:­N7¹ÉÍ”*l¦™f`ÛØ–â/¢ˆ"ào´Ñfµ=š?&~ž3»@àlà,ðó¯ª2÷h³Ú좓_ÆÃãVU½l êzËê/ªCuX|jƒÚ 6€^¨ê… ‚*¨‚À9Îq”(QœK VÅê°: zA¬1ÖȲêZícjÂ;áÐ&µÉE'KfûÕT?¹ÊÒÊÒLúø(1=¨_Ôê âk_ 1b@Œ¨¹!«…"<äáj& ªƒÄ×ðL|ÊÜeîÿÛù3+ÍÙeÎJVg|ȇ¤Cb1± Wê•DÁ1F°aË6ãf¾¹ÞÄ3ñM>“mV>¶·‹Çö>öxÞ`ÿ +À±~¯/IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-91.png 644 233 144 2431 14774263775 14704 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÎIDATHÇÍ–]HTiÇŸ™ÑtÌ-ÛT°‚¶`C$­‹%IвìƒÔ(D˜%ȶضÀ‰ºÙ.¼¨·‹%‚”Â]/„¤bìÂ¥·”.2Á6µZ·0°Zk2sœó¾ïo/fΜi-ê²÷æœçëÿÿŸ÷ã9¯€ˆˆdÄžî…î…îYQÛýƒãO-K-ûæ÷¨Ý ÀµÕµõÞÏ0ûäì“sšæ4é~Ƕãv~b½ˆƒŸÈgû%CGJkJ««$f×AU^U^jVÔ®ïo›·-dÁî‹»/\8wá?ÂH×H@°$XŽmÇí|»ÞÆKÄ—ºÿñ‹@r 9àz )3RfˆÀ¢u‹Ö-þ)šðh1”o.ß ðÔóÔcÜ þÒI7%À8ãØc4Á¶ã±|»ÞƳñm>›?ªG ³8³X*«+«½Ñ‚þf8´àÐÀˆ´ 4ÎIë¸uL¯•kåæ‚9`0“™¦ÏôEÖë a~³¬Nsšt”ÃóÙüQ=òþÚþR ÛS·§ï"·@½Sï€9ʯüDÌ×fµY±§È$ñ>|øÀ4š³æ,˜¿L¯éϤ᭮ÒUD@ÝT7mwäVœ/Î/‰‚¾ý¼#Þ‘ñ$x ¨8à&þÐ9:‡ Û154Õ?Õ£££ ê‡ú!ÓFh,4ƒÈ?‘È@B Wçé¼8Þ&‡Ïæê‰ køöÝ{Ô®Öù&yyå|ñ›ž7Ýoºaƒl iÍiÍiÍP}¤úHõ09&Çä@ðnðnð.z ½…^hßß¾¿}¿£Kgé]€kÜwøþ¨ž˜°?´ŒµŒÅuÔ¨’ðpx˜°í9uíÔµS×`•o•o•Ï!Z¡Wèkkkacׯ®]Îé¨è¨è¨pòÕ€êQ=ê¼:o㛇?ªÇ-2ëú¬ë߉¯-^[_q5Ê%O¿§_RlÏüæùÍó›Ež‡ž‡ž‡DZ¶l9(2tcèÆÐ ‘ÉÁÉÁÉA‘+…W ¯ŠTTT‰LtOtOt‹3¾’lÉq/q/±ñ]TO’ˆ§ÜSN®Hò@ò€Ë.éùÞSç©“L¹$eR&R–]–]–-²£hGÑŽ"‘@i 4P*â>á>á>!’L ¦þ¤Ú¤Ú¤Z™>RÅ+^Y*KãÞ—"É—’/I¦ˆg™g¹n}Y_vݱ*¬Šxb¦)4Y&ËÁ»S~§üN¹H 'ÐèY“±&cM†ÈÜgsŸÍ}&R´¾h}Ñz'_íSûÔ>5¬†Õp‚°{Ò'}""òH9|LÏÇöj—ÚE™2SΩo­o­o…•þ•þ•~hŸ×>¯}ÞôSy¸òpåáJ¸½åö–Û[6ÿc}_ßÿôûè©D[¯­× }èW¹ <á O4ÑDO>ù þI&™|OkØ9JŸ}*?ÐÇ”Ýgô½‡ þŽªÇjP ‚Z®–«å ýÚ¯ýÓgLïÔ;õN0¯Í ó"!0¡·émŸÝÇ>ÐùXçuj]£kˆÄz¾!Ì[ÞÆÞÍta„"ö Åê?¿óâ_hŽqŒtg ”Oùƒé4¸pcÛñø’Åêm¼Oþ+¿ØÛÅ{‹Þ¿´ìI™Ógd›ÚcIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-20.6.png 644 233 144 3301 14774263776 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜvIDATHÇÍ–íO”WÆïg†23:HM¡ëK ¦fKQÆHšº¾‰v¬TM56¾-MÙ]ñƒ±©¥ YÅD‹)­,UèKlW¬R@]y‰Ý¢Ñuod¦”º:Â0àdÅaæyÎo?Ì<ÌdwÿÏ—“ë>÷}Ý×sžœëy26 XfXfX&E±eS»5šà}Š^/zà¶õ¶UY@œ8U$ˆ9°¹Ë7ëM>“ßìgöêHËOËá“âáâaG}´àÆ|V~¤ü¨.€ðqÞ£–Zœ kº|yyDHýÃ8`N¨“ê$€º¬.!}µ¾šD‘ðuÔáçÛW~°ü )ðÆÔ8ê!­ ­ þOcsõ+ÌY±hÅ"PÏ„B„@5»Ý„ÕK*Ce Ô,õ¼z~|§PVeUV`ëY³å,G'õýú~ÂÀC ÞŒñO]1Å|S`õ+ ¿RD$óg ކ`x]^„ß`éÀì{Þû‡áÂpy¸<Þ/ä yC^ðgø3ü ²U¶ÊNt‰K\ŠÃÈôÈk‘×`à÷.ß»ÌÃðÜ(?xs¼9À_ÍþQ=¢ŠˆÔþïîyw<0r~ó]aca#¤¦¤f¦f¢ýnÑ;‹Þ@E "PeF™Qf€}«}«}+¬íXÛ±¶#aÔ€ˆãužuW×]ç&çûÎ÷Q¿®xaÛ Û`h¥Ñmt9°%{K6ÿŒê±wDDrOŠWWŠ|Wõý²ï—i ¼›½OyŸ’±‘àÈÍ‘›¢9[œggEJw•î*Ý%Òëîu÷ºEú&öMì›(rþÂù ç/ˆ4Û›íÍv-]K×ÒEÚöµíkÛ'ÒÙ×y§óŽH÷o»ó»óEË´ÍmÛ*c7ÏõÎì©-Yœ¼8Y„IQ=–$KJ_JŸ{¡ˆ»Ä]"RØý¢ö¢¦Õ·÷tù»üb;õ÷SO]yPò äA‰HúôôééÓE&åLÊ™”#2­jZÕ´*‘Y3²fd‰x|ŸÇ'ãc i i Iä¾÷¾÷¾W¤hOQMQÈÝ[>›Ï&¶y«gÕ̪ÑêEÞZxKÄBJSJ“{¡Eö[±þB–¬Ð<šGäWí“›'7‹ÿ༚7jÞÙÞ¡ïÐE÷î=Ü+²ÔµÔµÔ%2´shçÐθ€p$ GDmŽ6G[<>êuºDÜV·ÕméÿKÿ±þc"C7‡ô!]äÏ×êòêòÄ/òtåÓ•"†SÞ’·ÈJ2®D*#•ÚukÓ„»îÊsÍWN{O{%íOöÎÞ;[¤º ÚVm¹6ÿZε‘Ô)©SR§ˆø’}ɾd‘ŠžŠžŠ¿ÏïóûDr«s«s«E †€Èœö9ísÚEƒƒÁÁ HýKõùõù"w<·[o·Šdl›Ù6³MÒDFÏŽžÑZU™*Ó®‹þ{‘KåÐüvóÛÐz½çËž/Նū^½"´$´$°$ó*çUΫ„®”®”®h±µØZl—————§ûO÷Ÿî‡‘#G6BÑ„¢ E`Ø=ìvÃQçQçQ'äÞȽ˜{Û꾩û†Pì¨l ñ뚯k€cQ=1»¨ýÊ Ë Í3dä€~J?„ðáC¯|òÉi¤1ÁqˆC€ ®„øT¦2ø„ù8~h¹¡§éiÀ{f¿²Ê>Æ¢z„¦˜áð8<Á$õ7ÏÏЫ¢>£ß Žy¨Wéz'¨+ꂺÆ*c•± ô,=KÏ£Ãè0:€hÃbX ð)8F¦±ÆXú¦±ú±z¹1;ãqy\ŽŸ?“øWÌÇþÇùÇJµR ðÇœyX?£Ÿ†ŒeÆ2Œž"D€±èͰ0 ƒ±LP`¬7Öæ‘Þ¡û]øG(µ—Úÿ¯óÇîJJV—¬N¸+ÙþÌögÆ ŽñNˆ#A}¾†¨sêı¹næ›õ&ŸÉoö3ûGõ<ί‹Çö=öx¾`ÿ³F’ŽußåùIEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-remove.png 644 233 144 345 12610450011 16426 0‰PNG  IHDR Vu\çsRGB®ÎébKGDùC»IDAT(Ïѱ Â0…áÏ,ÁX‘¨é™€:NÍL;ÀàZèyym­÷×â~Ö ¸ó›Ì¼ÔñJIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-79-grey.png 644 233 144 6236 14774263775 16030 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü SIDATXÃ…—kPTW¶ÇÿûœÓoy4 Ñ‚€mÑ"@ jib¸¹†@ÐB0ä!ŽãPc(5f°´š@•CéÒ º‰Á *„0Ü’ksŒID¥èFƒÅ'M M?Î9{>ÐSN¥²¾ìÚ§ÏZûwVÿ÷^kƒÁ`0à³Î L"w»Î]§m†#†#†#ôÉ’Û%·Kn§>CÕTMÕþ…æƒùà¸MÎfg³³™îC-jQKŠDÀlÂ&l¢ûdé²tY:)ânq·¸[¿Ö’q2NÆÿQS<¯x^ñ¼Ž+¥y¥y¥ydŒãÃø0’6Ã!v{¸ü™YÀåXŽåÌQ±D,KÄn×”kÊ55WWÒRÒRÒrtØ5æsµŸ³ÇØcì1q直¨ 5.%.%.…-•,•,•º]€.ðν¿{ß÷ú{ãÍÆ÷¬ç]ßËãåã<|žúR_ê+æ’d#Ùv€ cÃØ°3uSõSõSõO¶¶¶ ÛSRR÷’¾%}KúÈ˲"Y‘¬vìÂ.ì‚vØað&ÞÄ›žÂSx vççç¼Ügê3õ™¨»3¢3¢3BÜ~ÿÅû/Þ1§B¦ S†­ …ÂÆUh>ͧù×s ˜çÉÇÇL0-ðáš¹f®ÙtÂåv¹]î§ÿ+<2<2<’_þZÄk¯EpGÕiê4u¡„JðâIñ¤xÜŒ?€Ld" Ù$›d¸‰›¸ 'q'xˆ!‚³úX}¬>¸Öx°ñ`ãA>÷ÚÙkg¯åz¤ ©BªøíŸ|:ŸÎ§'e# IHyHövïíÞÛ ð~¼ï÷ůS™S™S™y±ÚÃÚÃÚÃüËùÉùÉùÉ\+ºÐ….Ø @€_¤"©xdN8á ƒ 2~ðƒ@¿§ßÓïKbI,@×Ð5t €`#6RCjH |ëšëšëšù—w îÜÁµªN©N©N¹ÀMpÜÄq ?ÉOò“i:W“«ÉÕ”øRàK/QM–%Ë’eá¼±999Á×ý†û ÷€Ëæ²¹l€+ÆãŠ©ŽTG*à~Ëý–û-˜À@5TC5€3Þƒ:¨@ÊP_oü¬Ö¬Ö¬Vîh`F`F`Õxy¼| 4âýL·Ê­r«½J¯Ò«âëë ©³ÐYè,„Òh4FÀª±j¬€U³jV pµ\-W ˆfÑ,šý'úOôŸ © © ©ÀçÕŸW^ Üʼ•y+Pµ«ÚUí@:—Î¥s@¢øúêÿ©ÿ§°¯LY™²2)%%%€dddÁû™ ¯á5¼&a³úžúžúöEýYôg¤Úó¥RY”,Jd4g4g4k›Ö6­mrl9¶ð\Îs9Ïå®W‰«Ð&k“µÉ@ƒƒƒ?022lÊÜ”¹)ˆ<y"òpBwBwB<ÜópÏÃ=³’.Ù¹dç’¤ÚËãåcœœœðYhYhYhŠUŠ*Eì´€ÐpÈCòM‚&A“Ä´Ä´Ä´‘ªHU¤ ø­ý·ößÚ¤ø¤ø¤x x:x:x0×›ëÍõ@²-Ù–lB¢B¢B¢€´3igÒÎb…X!V–…–…–…³ œ2M™¦LƒÝËãåc°{±—D0 LÓ0ë Ã7øßC9 ¸·àPŽr”çVœ[qn028282èõ‰úD€t’NÒ ¥¥¥?ýòÓ/?ý¸t.K\˜{aî…¹€ý†ý†ý ô=B7³ÙÀlp‡q˜D0l0ÌÓ¯lñ¶x[<†øü~XÒFÚH(ÖaÖ¬ŽÕ±:€~G¿£ß]ƒ]ƒ]ƒ@’1ɘdF…Qa|´Òë›_ßüúf`rõäêÉÕ@y_y_yÐý^÷{ÝïA"H€º¨‹ºfݨgd§.L]˜º€!&œ gÂéWŒ¼L^&/ã+‡æ ÍšG¿ºTs©æR €ÅXŒÅ˜‚„ !èÀïï/àîtwº;Xs¬9ÖüÁäÙɳ“gܞܞÜ`gÅΊ@Þñ¼ãyÇI¤@Rø4ú4ú4κM[ê,u–:À2jµŒâ#ù|H>ÄW2ÈB²Šk9gà ¤¨# # #@·>k}Öú,”l5[ÍVÃæÔ[Ù[Ù[ %ˆP'ežìz²ëÉ®vKWJWJWÖÜ×Ý×Ý×±×_h|¡ña›g]ïyç¼§¼§¼§毿vþÚKáø?>šfMdMdMóóó@ÕïU¿WýØÙÙÙ†lC¶”9ÊeŽBv:ãtÆé Ñ>ªÕŽj™éÇÒ¥_Îv»‡ÝÃÛÝdÏ=7öÜpçq~~•ä¶ä¶äv·bòØä±ÉcOç¯J_•¾*&§½›önÚ»¤krÃä†É   ·Â­pƒ° lÛ`£0Sœ½5ÔNíÔ¸Ê]å®r€ä¹A€=ÂaÀ~)õRê¥T¬«?_¾þ<¾U˜f…Ùñ"e)KÙ¸uˆD$"¯þ•aj™Z¦–ý™ÙÏìgön9¸7º”½Ê^e/`7›Æéâ¾õ}ëûÖãøœú9õsê1Í$2‰L"à©Ý@‚ôÉHF2@ÔDMÔ€¬WÖ+ë´=d2([›Z›Z›øpÉÉɀ؈Øv‹dYF–]ý+*Q‰Jn§Í–ÎôÜûä9@t0zFÏè·7ãm¼·c‹_‹_‹¿Åc±Æ@IÞ!ïw`C(B @ )¤ÿ>ÓqgK©Ó+¥ÖâÖâÖbaÛø®ñ]㻸*ÙBÙBÙÂã¥Ú}Ú}Ú}gPŒb“0à 3¿ŠÕëõz½ª™Ú,ªI‰#qäƒÅu‹ë×ýøª5ËšeÍŠdl:›Î¦‹þçÄ;‰w…mqñqñqñÌ«TNåT'QQ€ƒ/|á @ $M  4”˜ˆ‰˜Àý`ùÁòƒ…&w~ÔùQçGÌ1Ÿ8Ÿ8Ÿ¸‡{‹{‹{Köš»¹wsïæÚxÒA:HÙäù°ÞÆÙîÄ9âqü.Þ¼xóâMÀUè*tîü@¥V©Uêë ---leÛÚ¶µmki2) ¤2ñKñKñKP( € t‚N„'<á1}×r×rׂãíÑíÑíÑðS©ÆTc€/Æ‹ñ;?˜‘ÞˆÃ#Å*ϱšæ-Ä»K=WÙlÓ6sîV¢íh¶‘åd9YžüêÌ•ãÌé™ ˆÏsÄ‘I\²Éþ%û‘.ö‹ýb?”L$ÉDÂÉñE|d\tp‘ [6¶ll;(–GË£+WÌlší=bµX-VsUÆ0†ù­^‰”–––––ÂæÍ(<f5äÑî6v«<ÚmbV2+™•Û›‘|ä3Æw‹»ÅÍo±ÖXk¬5P2 Ã0 &¼™è˜î˜î˜í#Õ#Õ#Õì |·|·|÷•Vç¨sÔ9º»bpõàêÁÕ€0Üã§ôzùfAö¾ ôø¢…äô3§ž9õÌ©ÊWå›å›å›—ŽsÖ¯ _¾6Û …ZøõôôàsÓϦŸM?“\e¿²_Ùˆáb¸þ÷nn=·ž[?ýœf©f©f)óÀ³Þ{+Ôã\,þÀ<›Œ÷Lû¨”J©”üm,j,j, ÿ#„!BÈ9^¦‘idš×ŒwVÝYugUÀ)ëUëUëUZ~ñ‹‹_\üBx~Ò=éžt³…’DI¢$qÇZCkhͱ֙›{ ðħ¼ÿ€'Qüã<b Ý´¡ mB1m¦Í´YofN2'™“ßk¯8^q¼"FIª%Õ’jæ*›Ïæ³ùg\trÑÉT½Ål1[ÌäŹâ\q.­óÄmñÚÿˆƒÁŸØcÚõóh·(@÷+É#y$ïÿÑ6ÚFÛþñ¦"Tªe®²Ãì0;<*~(~(~¸åfvv60'ž·±œþ3ŽˆËÇâÙëŠIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-189.png 644 233 144 2772 14774263775 15004 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܯIDATHÇÍ–mL“WÇo±NjPÖèâÌÄéH€Íâ 0—A6‰ŒØ`Ü4.s$ÓÅd ³}p‰:è^·˜¥YuÃ"™¨KXb˜Xã”D§¶ø’!¬ˆ‚4)ÏsŸûÛ‡>OŸnfß}¾´çžsþÿî=çÜ+@!ij毀”Œ”Œ”¹q;å]{=µ4µ4óDÜ>*Á±Ñ±ñ· ýHúwÀ0nÙ¶å·â“ó…°ñ“ù¬uñ¬°fuÌêp›ö~ðæzsSŸ‹Û¾ àêtuNé°ó‡?œ:~ê8»`äÒÈ%€ñâñb°mËoÅ[ù^2¾Øÿ~!`æÙ™gwaÖ3³ž^|óÅ7_ú ðÇKà)÷” Íš¡R@þ ¤‘¦ŠI&±¾Ñ$Ûò›ñV¾…gá[|\€ù¯Ï]¨¬®¬v}O¸Õ†^÷BÝ ŸÖÉ«¼Ïû¤q\ÿQÿ@6ÈbQ^åÕgüjü |£ÞRoÈFÙHŒ/õV½T?;ØAß›x˜øºÉ—àë±ÒBˆÏÞ€*Q%‚Bª^oÐ@]—ý²Ít(æ" 2T†ÊHìj½Z¯ÖƒZ§ŠT¨bU­ªQÀ§|ЦfȰ åq|¨rW¹)‹_$[Îap…]áI' >| ü@¨>ÕGtêQtNth_k‡µÃ¶éÖéÖéVˆx"žˆ´ˆÑ"Iþï¦MƒÑŸF¯Œ^ãwý¬~–¨é.ãîàσ?¸Æ\c“NK)ìh/Õì¬ÙiÁ+ÔkÚ mŒ>~rü$ªàÂ]» »¢»¢»”S9•ÊRËRËRaÁâ‹,†Mµ›j7ÕB8/œ΃²•e+ËV‚kÄu×uª÷V·T· ø]¿ª_µùØÿžzOYµw´×vµ–eÁEÁE‰ygjl⋉/ˆ­­_»{ín»wû²ú²ú² ÇÓãéñÀÒCK-=ýþ@Ö´¬iYÓ*T<€Òó¥çKÏÛ;¸üáòáåÃpò“™'2‰Y|ò^Ûµ¶k–°«µæöÌíQ<ÉÉn™¡»|#äBù¼|òoçßο gšÏ4ŸiÙ);e'ä¸sÜ9nHkLkLk„â@q 8þ;þ;þ;åÌrf9¡}Iû’ö%>œ~?ý>|}û«¶¯ÚlÁrãŸþ<–î9î9ÆM½?z舷½RFÄHª•U¡U¡U!èU½ªWAp[p[pUUUÚqyËò–å-ßvßvßvh´FZ#à-ôz Ár‡Ü!8¶6È´ÇŒ|;\.KOŠF—Ñå¸)Ð=ºG¡ !„˜ïX,¦Å´H|Úlm¶6[ˆØDl"6!ÄÂô…é Ó…¸ç¿ç¿ç¢cCÇ†Ž BD £…ÑB!†n ݺ!Äé-§·œÞ"DISISI“óÌ›7&ĺ—×Í\73??åoY „°õX5FðQðŠŸ9úCý¡UPŸSŸSŸ—}—}—}öµtµtµtÁjµZ­Vàwø~‡í÷íóíóíƒüÜüÜü\8·ù\ù¹ò„;¦¾1ùÂÁàÀ¿jÌìJj>®ù8©KÐ'u{¢+$ÑD“4ÓL30ÀIë:::°‡=ì†f8É ›n+ôL=3‰/V³·fï]™s\#®‘I'jPÔÚcFQGÔØf4M ¤Šª$²]¶Ëöø= ÀÈ6²là 9ò±“c _‘^é£N»®]Ošcú`l0(×°kø‰9f ÚÏÞ€ªÔªT{òƒ É0el66£™³_™{ÿ¯€1óàã6f¬2×bÆVc+È‹òb2¾Å÷ÄäÿŸ»’ºEu‰¹¦u8@š}Är«ÜJ Ôu°mËŸ( 3ß³ðÿ÷®|j_Oí{ìé|ÁþxŽ9Ï:i<IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-24.2.png 644 233 144 3124 14774263776 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ýOTWÆÏ 03Qw ‹Ô¸Õ-RIk&´µ m]E© B[Ô‰f›Æšš&´Ál–ª¤Ðiv;»MSK‰;D·N¨ ¶Œµ´&_"¾V;$ÅŒ20ƒ8o÷žÏþ0s™éòx~¹ù¾=ÏsÏË÷B!2_iËÒ–¥ý.n§ý9é7l2lZÙ·?W@÷†îkÓg¦Ï²Z³ZÕ᤭ŵüÔz!’ø©|š_dФCïÒ»tëöaxë…·^0,ŽÛã)㩇1xçëw¾8Ùv²}ðë…_/ø×ù×AÒÖâZ¾V¯á¥â‹ÃÿÇ/¤w§wëî€>CŸ!<]útéŠ÷ã #+`Kù–r€±ycód(>`! å: HmÜO±µx"_«×ð4|OãëýZökBð¯ÊÉÊIãWñ‚ᾨk«kù-@ôù’/Y1_Ì Ô)u„9*-Ò¤Ët™ ¯Ëë@HÙ®l' 1Ì8âõ³x¶:{]8ÜÁ•Ó•ÓÆ¯ {Cö†äš&¾ö ä[K¬% ¢ß**ÈÕ]ê.¢ò¿²Oö!µ)’»d¬!9þfa™ŒÊ(R¾¤f«ÙDgñêãøÒ»5´5¤ ´oHYJ!„xîïôFgp>ŒääAôM6û ƛǛ™‰ÖGÛ£í)„=ôÐáýáýáý0•7•7•—o¤‘ƤݵEmà+oob&ÚLJ‘gFžÎ;ŒÁùš!‹…âs¼wô½£x š-ÿ)k/kÓ&»ÉŽ,q•t”tÀ½©{S÷¦’„P( ”˜3‚† !hË¿-í–v009LdÉ?Ö~²öxТ~ª~ªšaߎ};@ý)®GÄþ „?×Aï¢ÞEÐÖම-rO~öÊoV~CX#(:Rt¤è/8^p¼†F‡F‡F“¡¼ª¼ª¼j®0§ÅiqZ iþÒü¥IÿÚ÷‹LE&Â--m5m5rô=Ñ÷Ä2âzË.•.ðÕøjàÞz…¿ÆF¼N¯zõÚ{í°úêê««¯‚{·{·{7X[[CõDõDõX6Z6Z6&‰ÕNµSí„ñËã—Ç/ÃXh,4‚¾C}ûªŸ>…ïœ?týÐ\\ê„„¥Kp2ólæYõ:[ïß/NûzãGÓMÚÁ5ƒkaøÐð¡áCà¸ë¸ë¸ :¯Î«óB±§ØSìCÈ2„à´þ´þ´~îÌÕëõF(´Ú mp!û<ç“áûr§ïUß«Àt–.K§^×)/xeÁ+Ò5ï°ïŽïŽîM÷O¿§_ˆJóë«^_%„½ÙÞdob¹ùäòI!È$“L!2®d\ɸ"„ë†ë†ë†ƒ%ƒ%ƒ%BœÈ9‘s"Gˆ[Õ·ªoU !öнb¯µéµéµéB»qløØ°Oþ3§&§FˆÿòrÿËýBÐö˜»Ö] ý¶¡mCÛäžMÕëÃëÄ7gmÖoÖƒy‰y‰y ôxz<=žä¯žñžñžñBc¤1ÒGÍš5ÃÎܹ;s¡µ¡µ¡µ*Ò*Ò*Ò Ì[v³ì&˜ÿ|÷óÝ„Ï\øÑñ£Cî÷¤{”?i{ íT¾[önÙì1ƒÒ£ô~á—”¾uI^’— v.v.vÔnµ[í8p€´J«´¦¬á 3ÌüfU'™DÎâÏòiü‰SÉÉDÃxÛx;8_ž¿]x»”¦xŸQnFF2£U”nÙ%»’,²SvÊNP[Ôµ¸ÈE.‚jVͪäVY.ËAéPF”P®Eü?3¾ü6ΧñkzævþÈ6Ý6ð Ñù'•^¥˜P+Ô ¢Dâz"L3Ít"&x‰†#™P·¨[ˆâOàiøßÜΟ¸+©Ú^µ=å®äç>|j¶oŸlØX±`, ¼­¼Mä€@‡’¶×òµz OÃ×ø4þ¸žÇùuñؾÇÏìÿƉ5½ fMˆIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-14.9.png 644 233 144 3105 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜúIDATHÇÍ–ÿOU÷Çßç^¯x‰Rü²T±ÎX£©¦–عÔ"aq™5µ%³´™²fíÚ#6™ŽDkº péÔx FeBªQ§I×d­€ØVV£X(\ÄÞ{î9Ÿ×~¸œ{iù|~9y>Ïóy¿ßçóåy>IRúØWà›ç›çK‹û¾ß%ǧäMÉ[Ø÷k°Š­âë‚§>zê#€éõÓëÝ›Iß‹{ùãçKIüñ|Þ¸Ò•Hù4åS+{̯‚õËÖ/›ò³¸¿ÿOO<ŠÁ¶“ÛN?rü¿‡{—ï]Ì̆¤ïŽ|o¾‡7_U?á— Ðhµ¾‚”É)“%˜Ÿ;?÷Ùñ„žgamÁÚ€>ŸßøÀé¦2ÕdaÂxöpœïÅÇò½ùž‡ïñyüq=‚Y¯ÌzE‚¢ E‚uØ’tó(T>Sù ð+ûG©¦š©Œ 8NþlÖ˜5@ÀLÀÜ07€œ Î"‰üC|ÌÇL5ׯðNVœ©8ã ¼y”ù‹üÁ:O~¼·Vú‘u#`vØ—L7»Ø`Ž›ãØ¸ 2ˆáKîpÌÛæ-óIùÑ Ât3`0f†vÂØÞŠº‘8>ë×íX·Ãx`õ¸­”¤_„`8OâZWMWMöÕGßÌ™Á¨ÝiwÚã¯qk)”GÊahÑТ¡EãâUTQ•t£½ö{ <<÷àéO3êvÅñ¡»º»è ^ ^ OòôˆÿJRíE({¿ì}0+Üåƒéÿ ÿȪÎ:’usúÀéêÓÕL°ÝKw/ݽr‡s‡s‡'Ƈ[†[†[à×Ê‹æE!õ_©7Sob6¼[R^RtÇù ¬­¬ H‹ëñ‘"I¿ I9›s6Kÿ*IVæ«ÿ+8TpHÑ+ï^yýÊë²|ݾo|ß(açN;uî”´¯s_ç¾NiòÖÉ['oÕkìkìk쓆7…KÃ¥ÒèêÑ%£Kd}Y~kÞ­yжœo{³íM+S*ºPtArþ×ã³2ÒN¥zq¥n½üÂË/H©—$«îRËå/.¡”sWd¬Èbkckck%5¨A ÒþÅûï_,mÜ»qïÆ½’õØzl=ž(,#?#?#_ºŸ~?ý~ºÔ\Ù\Ñ\!}íÜ]pwR¯ßM»›fÕIÙuÙu’~›ÚžÚþâJŸ¦ù7ù7ñ¼n> |(é$é;ÿ½ÀüÀ|Éú‡õ‰õ‰”6-mZÚ4©®¿®¿®_jojojo’zó{ó{ó¥ó¡ó¡ó!)Ôj 5&…å.È]»@Ú’¹%sK¦Ôú‡ÖwZß‘|_ùü>¿Ü¼¼¨ï¤À²À2É ú_ó¿Æó>á†ÜuC¶oçKÖÏ%I³<`§×¹íÜ–†²†²†²¤¼¾¼¾¼>©©§©§©GZس°ga4»rvåìJiα9Çæ“4Öë–%nemY-0ד¬c&ømðÛð$Ü.»ËNÖ1·ÔþÌþŒQó=s™;qÅLÈ„LÜ·Æ­®sëàú\Ÿë¶³màDÝçÜçÀYÝÝŨûÇD{©û% ì v…'ñƒWÇ&Tþ’”’Ö¾Ä#çŒs°ÝÍîfìÄCŒ%Ba„‘±˜†è§?±Öã¾á¾MÄiwÚÇá'ø&TþŸôJ¯wy½’±ÞF¢WÆ·g“³‰˜ æ$}/îå{ó=<ßãóø½ò‰}]<±ï±'óû‰ !"%IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-11.6.png 644 233 144 2763 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܨIDATHÇÍ–oL›×ÆÁƸrhƒL§vtN¨*Z¢Êùƒ´©H¥]T0AÕ47….j!Q£-]ڪ뇴´ƒ*‘ÆHÿx‰’Œ@Õ‚EBK¦´ËP´$ÐP) Uc0Ȱ_¿ïýíƒ}y­zÚçœ/¯ž{Î}žsß{ï9W@DDîKrÊy(§ …s¶ÙãùÏæ?ûãC)|ÀÇóŽç/ÿîí¾·`õÁÕ­qk¿ŽÏœ/bógêéq¹Oì÷1÷1GU¿MåMåùE)¼ï,xú=ý‹IxåÄ+'ŽzüS¶Ãô—Ó_D«¢U`cí×ñz¾æËä—·¾§/®/\_8®;Ï'%Õ%Õ¿š ˜|j7×n¸‘{#Wå€yðâUU@ŒÚ"XûÓñz¾æÓüZOë§òð=å{Jê·ÔoñôbˆˆŒ¡£¸£Ø`ôä]ÞÅ Éh2 `î0wç'À_Ô!u@]QW€¸¹ÅÜB|%þ=ôàUOó}ÐþqûÇ:Áñ êæëæ=½à«òUÙ{šþ¾ÿ44,4,€zÀ8§Â¼Áj@ `óÌ£Ô.µGí5¡Â*ŒmsD‰fàÝ4Ñ„²Nš™a³Ì‚úEŠŸžhxB'øþÓ[)"òèÁóÄbNþî w®Ðþ|qn¡p¡;ÆUãªq•,[œ_œ_œ‡,ˆ!&˜|&ù Ü~íÛ‹ß^䎱6Å““ÀiÏgžÏbNð‘ÿ€À›7Am°*¢ÜÞ{{/TvT~Xù!*ô›P °…"ÁH0„ÊÎÊÎÊNµ…ÚBm¶ß¬6«Íj·N´^n½ ÞmÞ½Þ½¨Ÿþ¾òõÊ×a¶ÉúÊúʪ€íåÛËÁºžÊGÔ7""£íptòè$,^P[7¾æ/ô×ÿu¸e¸e¸Åò×úkýµöA8]wºît]öÚ7´ohÂ¥_:sé üò/?òò#ÄÏý`lzlZm…SOžzÌh*!Vpªà”:Æ×Ó÷Lßj{zÅ×ëàwûóüyÐ?Ó?Ó?c ÆU\Åø üþ(((ÏN,X¬ Ö«ËÕåê‚ÒÆÒ†Ò¨ùÕæÇ7?±ñÝñÝß}WjvÕñUÇÕ±Y•ÛœÛÌc2æzÏõžˆt‰ˆÈLî´«ÄU"âlwv8;DEŽ"G‘¬˜Ûáv¸"Î6g›³MDÖÊZY+Y¶ä[ò-ùDÖå®Ë]—+rí¯×ú®õ‰Ì~=kΚ"¾Ò³±g£ÌˆÜÿÎýïˆX^yA^à±Á:itŒ‰a}ÆX¹•{{´œUÉXÒ®è ˆkšÿkË,³œ×°†5À~ºèÊà7}¦ø­Ö ¼xH¤oåJSž[ž[1'VØv³¶gŒ3ÜQQäÁì<¬«ÅjòÈ#˜`‚ 0—Ì%s øÝtƒõ¨Õl5ƒ¹-Ñ›è厵>]Çþ6Q6Qà™òLÅœÜÒu,«ò7ºÝZÖ8Ç¢9h†Õbµ`¬¬’$…toL¦1¤zÔ<"éHP`½d½„Á²9lgðӘߘÿ£ò¯WêÞ¥{eŠ Vzez‹Íf³™8¨³ê,`cí_9éùšOók=­ŸÊçn~]ܵﱻóû_Û¶ûådPQIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-35.9.png 644 233 144 3240 14774263776 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜUIDATHÇÍ–íOTgÆïǕٮµ”ØýÐÅ3%jµ®ZŒÆîbÇ©Ž/`ÌVÜvRI\Ð`p£Í.‰MM•¶QY3”l•ÁjS:TJ…Zö‹мì6[Êt@FGæåœóÛ3‡a×ý|¾œÜo×}=Ï“sÝ€ˆˆ˜"_˜ô˜ô˜Ô°óǨ?qCâ†_ŸÛ§0¼jxõ›Ã0çý9ïÌ­š[¥öFm=®çϬ‰âÏì§ûÅ$QGB]B!'b¿Û²¶e%šÃö;7ÀxÑxñA^oz½  ¡º¡š?Á_þð%ÀxÎxDm=®çëõ:ÞL|yëú‹À¬+³®þ ñ ñ"±>cý3û Ï€5ך ð}ì÷±Z (c@2ÉZàÅ‹¾Ü3l=É×ëu<_ï§÷óH{)í%NmšØ4at† z?¢¢¸²¸´6€àEþA5Õ$£…†BC ùCÛCÛñkwÕµ´1Õ­ºímímÅ¡8ðCèçÐÏÀ{TRI²öU¯©øÓâOu‚½Qo‹µÅ:ùï»=¾Ž'·X¶X@û-@°a´_)}JAVò4O£MŸQ?~¢ë!>|3칚Gó i¿P¼Š— ~¢ª?‚¿m˾-ût‚Ç×͸J‘ßTð¹ñœñœ7ÒÒ!øW~?fùñÝßÅú*ô ôðâÆ “ɓɓÉ0êuº`ìàØÁ±ƒ ÌVf+³yd†‚‰ÁDpöÓ?=O½Ƈþòþr`ÈØnl÷Æé|D3ˆˆœnƒ½Ê^&þ‚jY³bås+ŸÓ S½©m{õöÊí•0V:V:V   y3ófæMXlYlYlîÔîÔîÔ(¡‰ë×'®Ã˲!°!IW“z“zÑv”Ù‹ìE@?€j‡ËáRÃ|bÔu""Ë.‰X}VŸÈ¥òG>1d‡zBå¡r µµŠáÖ‰[§nqY\—E$¥3¥3¥S$oyÞò¼å"õgêÏÔŸYthÑ¡E‡dzՌ׌׌‹Lîôx D|ë|™¾L1|[Ô—Þ—. Ÿ»Þp½aȱݰÝQþæWŸÚ”Úôü ²9냬Dþ Z[œÍ'®^¾zY¬¿´fX3D0cÆ,[[[&¢”(%J‰ˆë¤ë¤ë¤HîíÜÛ¹·EV ¬X%6¿x~ñüb‘QÓ¨iÔ$RSRS\S,ò2¼px¡$Œ3œ:œjpŠä8sœ"²5©%©åùD«˜óáœÕðvz;áv¨ï;7q·¿÷Åá/ƒÇïñ{üm϶gÛ¡¬º¬º¬ºƒÝÁî`ôÊ֘טטáxÑñ¢ãEQÿýæûÍ÷›áˆóˆóˆò†ó†ó†an»©ÑÔUç–ž[ŠÔõêzPâSÒRÒÔž­QÙ­ì6ôˆÌº<ë²H×ïºîvÝ•´ü‰ü¯ó¿i›Ý–Ô–$2åšrM¹DF:F:F:Dv5îjÜÕ(rvÁÙgˆ¸7»7»7‹d”f”f”Š\ˆ¿!^¤ÕÛêmõŠ466Š¬Ý´ö•µ¯ˆÌóÌëœ×)²ºdµiµIÒDîÙïÙEbž¤‹.CðŽˆÈ?‹ù¬¦¶¦Vß§Vð·Ä£uGëð/¹²¤nI8{œ=ΞèIÛzlë±­°¬}Yû²v¨M©M©M‰ü‰ü‰|°Z­ƒà1{Ì3TØ*l6È^—ýbö‹ðÉ–K¾K>]h´­á|Õù*à_a>¹8ÝŽGðIä/Ñ”"%z%ßÒM7°ŸýìTh¡…`#Ù8Ãk\¾cÁxU¡Ð5ýWžvœ&Ã|„¾ˆŽaì3öyã8Ó¿¢(Ã:£ 4ð©Yêuàà5^¥AiP@)T •BPmªMµ8ÀPͪY5{ÙÃPê³ê³ dáSÿ<­cKû—!ããoS{Dù±'Ú!¬íÁv¦”¥@Ý­î&8½c`Ї<œqB p/,Ä‘¡¡Eêý:ž>Yì ö„ÿ«ü‘Y‰m‡mÇŒYIÉS%OM\Ê)'BÞ@Ù©ìÄÚ í µõ¸ž¯×ëx:¾ÞOï?=+Û×Åcû{<_°ÿÝKÙû–£vIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-93-red.png 644 233 144 4232 14774263775 15622 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜOIDATXí—}lTU‡Ï½wÚRi·¥È‡í ÂÖem- ˆ±-8Eã±”HI¦¸AL”/[5)Vƒ•U ÅÚÈ*,MéàF곊v°í.Öè’&`éÔZt@˜)[:íÜ{Ÿý£sî|d•lvßÚ÷ž÷ã¹çý{Z!Æ,SÄ™Z˜âMñ¦x•E¤%·&·&·.Y`ÓmºMïúƒ˜%f‰Y0¶lî6a6éC¼oî’ñ2_Ö“õãû©…ñ<±|›Åf±Ym‰_Ÿòk[«­ÕÖÚò£²EÙ¢l±@2²Y¬YqqÅÅaÕ·«¾]õ-”••E}¹.ãe¾¬'ëË~?Ï#Ôûâýéõê :¨öÍ’;”S‘S‘S¡?s ã@Çó¶àÕàÕàU@CCcˆÜàÐG}`ù‘u/óe=Y?¾ßôúŸçötu@Pú>ŠN.:¾§w´7Ô¢—ˆ™ùfº™NX¯ ŸŸ}Ž>OŸºKPô9z±^ z>YŸ f¾™j¦–ù²ž¬oÇõ·§[hJ‹Ò¢´aÛiÛiÛÙô…LpîrV;«Ã. ìY½Cï nÝ4º ̾È“˜`¬3Ö†•‘cæ#ÆMãf4>Üd,3–ù¬1ǘCPF;w9_t¾vÉþ’Gò‰¤þ¤þ¤þ‡~+ìûKö—̾+}©}©\Ô ê¯êmz€¾Cßõz€Q÷¨›3/˜b}½L/‚eeÃû†÷þªÙj¶ZAAß_¯¯—ëvÝc÷˜3$ÅgÛhÛhÛØ¹S.4¸Ü nsC¤ÀP¸ÅÖìÞÙ@hnáÜB;V==ïêïê±€=‡zÌvÎvÆÄ‡Òפ¯8Xv° ¢õÇú5¸–4,17X;Ç'LV^V^V»~\rõ›«ßX‰aò 'N˜~yúe€3«Ï¬x¢ã‰€”×S^ÊÊX¶aÙ€œ{rîèR»T€§3ŸÎ‚©ÛS·ÿDÿÄh¿—\é¹Ò’GòIÐß/mùkË_‹¾™.°z° irÒd€·–¿µ6# _Ôw뻣ýKç–Î-k}·ß“;Z¾ nAÝ‚:. +ÃʰüÉ8eœÂäwrôÝ¡î€ãSǧ™É™ÉÙ{²÷Ä4F,èàwƒßúúÐ×ëjÖÕ¡ñ‡Çº¾T¿TÁ,;‰2«hBÑ„¢ \’|Bu©.Õ5úƒ¼êÞÞüöÊ·WÆH`œ2B§·Þ„>ïÿ¼`¸d¸à«-_mP?V?8ªÕu?êhßÛ¾7†;œœ}1ý·¸=Úïo»?êü¨ÓÚÉ'•¥@)ýAhó´yÚ¼êZyÊ¿tŒwŒ×§ûÊzòzò¬Asñʲ•eÙ[³·æÙýg÷¸r]¹y¹y¹ºCwÜ~w:Àlÿl?À}ð0Tå¨rk ZÀ¹ýçö’«žyeæú´)Úmʾë"­$­$­DÛ)Û)Û©æëƒ_ºøÂâ úVIjTúWùWÂ[üBñ Àu^V^À¹¶sm±#?¿÷ü^€|O¾Fâ¯OôOôƒ±¯éXÓ±è¨+þáÞáÞa Y€ëµõÚú®óSå©—–ófRARARAß[2¡²¦2«2Ë\lMnÂh÷h7&íA; w‡»cÍ3æüøá2\þ@?èîá÷‡ßŽúÈàÏ[Wh­Z«Ö/QîPîPîøÍ@ísëJ]«¬UÖÞߨ4+ÍJ³ÔŠñ´·Ýû¤÷I¼–v·¥F)€ù¡ù!2>3>‹å5FŒó)ó)0›ÍfsTJÍàg?k?Þhíävm›¶­Òi¡¹„K¸lö(k±(Ŷí¢E´ˆ!4¿æ×üÏ´YWk£½Þ^Îð=ï«òUÅj×8hŒd˜a@ŠÎK.¹`®6 ɰ5_srÍI}«uݰ Ú½/OÝ4uÓÔMB¨NÕ©:•w"tn‰9>òsµvI»¤]RŽÏ¨šQ5£Jˆ¤Š¤Š¤ ïË–v‹ÅÎâXí•F%!¼xñ׸Ƶ(·~§~§~gT‹uóëæ×Í7[wyFRFRÆÀp䯥qñ“VN$Œ^( î'ñ¾}ܘv}ïÄh·¦²&F»áŒpFȸl\6.GµØM7ÝàMíNíNí6WXšLSÓÔ´Ç^Jâ› |)âçhu Ú]ñ´Ûîmj7Ün·[€¡›SoN½9î ܸ+ çZZ<ªÕŽîY(¥‘^"à/Ä-, ü”vwÛwÛw‡3|;f_3"Dˆ€$­<^y¼òxô³ck´5Ú»#ÿ’¤~šÐ7ò\Üv+ÀD“ E´ûçŸÒ‹–.ZÕ®w¡w¡w![7­I(åJ¹R~u|õZB_Eü—v+íjµZ­VÛ7G—{Ê=åóõü‘ü‘ü‘ðWÖ¨ýš_óWæˆ&Ñ$šDä³£ùú¥ˆÿѵûr¼¿¨Gy\y\yÄâñ€1SÍV³ÕlP„"ñ×OCŽ!ÇZ§Ö©u*EW'LîÿfÖo%¢D”ؾˆ_~Þ­šª©š œPN('¾›6öüWÞ„Éô&Ô½å¨ÿ ¿yÈˇ`‘IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-27.6.png 644 233 144 3200 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü5IDATHÇÍ–íO”gÆÏ€&[I°¤‚@ÑÖ •’b¡éDÔÖÞ†ÒFmPh×M6+nh¢dw»)UV­DËXaéÂRJ… –NpZ]’¥¦»®P3ÔâVwpƒŽ ó¼üöÃÌõ€çË“ë>ç\çº_žsß""²$øKKûY‡½Úµ)¥-€ëU0š ÿý[xÜþ¸ 棘´Ñ6üFüÂ|‘ÿÂzƸ,‘Ð@dGd‡ÉÄïBIZIZÔÒ~ÿ˜»Ì]÷x«û­n€ÎæÎf~ ®¯]_x¬+„°á7â|ƒo!¿¼ûõE âóˆÏMãùXäc"¸!qCò¯cÉ·%o Àðáz¨“€‹nf˜Á°©Øðã|ƒÏà7êõzb_Š}I„SùÓùÓæ¦@Âh+¬l®lý¯þ.> “N,ô*uJèW”L%Ÿ>£ÓÎ~U»ª]öëYz€ºWÝ‹”Ieh£‘F,ú—A¾ÚÊ“•' £­ÔçßÍ¿kn‚Xk¬5´§Áï±\VÚrl9 ¯ðè¿×JµRüú½[ïFŸ_£ûÜã!ó3ÇÜ\E %èÚYõ„z?àÆ ú«Aþ'mÏÙž3Ë]°•""O@Ÿ¹ÅÜ2³ÆRÇRÁÿ*›'ÆoeßÊÆ«üKQüÛý6¿ &+&+&+`Ê>eŸ²ƒç¦ç¦ç&ÌVÏVÏVó)Ë”ÊF˜üõ­oo}‹×ÿL€ÆÖŒ­ÎõzÂȩȻ'vOD+3³O9ŸrêEÛ_i}¥UzSŠR—¤.saiaZašH{D»¥Ý"²JVÉ*ÉîÊîÊî‰ëëëir5¹š\ò•Y^[^+’|/õlêY1ç–¼PùB¥ôz^K>•|JÏ eÇÊŽE+ú‚z”e""—*¡/º/š׳µg«^¶26¥7¥Ÿ1ãu×]\wj”¥F ­Ä@ý@ý@=$¦$¦$¦Àõ¶ëm×ÛB~‡Ùav˜!ÞïˆwÀå\þêòWðóšò•å+ñ ƸF\zôdöd‚ê 袯E_Ó;`òÉ7àözÏ6Ï6¸1öcË-p¾æü¡ó‡`EÌŠ˜10pxàðÀáPá9;svæÀñƒÇ?øð¶æ·æ·æCD]D]D,/^n[nƒ­¿Ø’¾%f*|U¾*€‰¥KAwGwFwêar"ü‡ðxVl&§É)÷·˜ž˜¹s2Ý^d/9 P¨"Mþ&“_ĺߺߺ_äRæ¥ÌK™"CICICI"»L»L»L"²OöɾÐ>°<°<°ˆd„g„g„‹Œ6~füŒˆû;·êVEN_iÌjÌ’;"O¼÷Ä{"šE¶ËvžõÅ/.~Qïo‚7ÎþÓát8CÿjíxíµÚkÐÖÖSSSPu´êhÕQ(Z]´ºhuh…ÜÃîa÷04T4T4TÀ@ú@ú@:$Y“¬IV8ýÝé‘Ó#ðä²ñeãÐùþ¹Ï}à-ð€Úµxïâ½z‡¨ûŒ3ÖSÚS ½#C}¬—mzm½o½ßæèÍá›Ã!m(m(msssáHì‘Ø#±Ðmî6w›CÂ&Z'Z'Z!Ï›çÍóÂtñtñt1´[Ú-íX;ºö›µßÀŸ#?müÔ8ÃzùÄþ‰8cœ±À]vö¼¼çeƒ^[ªCu0Íô‚¾¥úÚ¼ 3Ì0àÂ…ë'üI$‘œ¢ŽºùQQ5V~cÔÛS½§˜ è:ƒ} ³ÓìœY¤ÿÝù¼óyPÿè3êÕ¹ûs÷ñªï¨_¨_€®ê^Ý Úmí¶vt›nÓm „4Ð@h¢‰&ÀŸ°cíim‡¶Ô7çšæšðjkƒ}¬Ï™êL0oþ~fÿ èy¸óÏ›ŠMÀ`gžVûÔ>À­mÓ¶áG Îø><€YfÓPQ»L1ÁµÖAÛ­íÆÏ¬Ú¯öÏ_ƒPUõ“?xWRðzÁë îJÞŽ;~ž  8Ä!, Ì(3êu>Ð/è0a‚6üF¼‘oðüF=£~@Ï£üºxdßcæ ö–“ó%?MQ´IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-23-red.png 644 233 144 4255 14774263775 15620 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜbIDATXí—mlTUÇÏ}iË`Ù¡`¤ÐéduY!¥u)["åe Æ µJlIZÝýbm‚´†V «ÈÖ`’]@j騄ºBV0Õ*×îjw“«íÔÒ ÊT˜™Bé´sïýí‡Î¹ó’]Éf÷ù2sÎsžçùÝóüÏ=3BLØTgê’OŠ'Å£\‹L¤&·$·$·¬\¤º¡ ı&ÜÖn¡ ]èr ñck·\/ãe>™?¾žº$ž'–o³Ø,6«Íñþ¿Ô[ô½¥ù²ò´ò´ò´ ✘˜àÏk{Öö¬í‡/<|áá P”_”_”K¿\/ãe>™_Öûi¡Þ?ž½OV‡Õáþr‡2Ê2Ê2ÊŒg¶l?ØnMþü1ø# ¡¡1ÂU®rè§Ÿ~°Ç¿\/ãe>™?¾Þì}?Í'\SÔAuPì_&Èÿ$ÿ“üO¿éï õ…è#bÖ|kº5°Q>>FŽ‘ad€Qh¬6Vƒ‘cäù`T··€5ßrXÂ2^æ“ùmà¸ú®)6šÒ¬4+ÍBè;õúÎÆ.àÞíÞæÞ.´Áž5Úv‚áÆñòñr°ú#Ž1Zi0—˜K“F¬\+3¯šW£ëÃæs XÏš9fA™ß½Û]í®Êú’Gò‰¤¤¤{-¸j]5®kŽwÈë÷úñGò—Œ//Âmá6 èòŒ:FÄÚd&Çb£ÖÖŒ=ÆKV‹Õb/ z‡¼}Þ>ü®ZW­«Öš#yl>}“¾IßÔ±S:JJJ­'" FÂÍ2×`×`Ê;žw@íP;’_M~ Æ¨1b{¯õ^ÈÖ³u˜8†@hJñ”b€Ã~¢ù'ê5”6¬lXi=aïlŸ°|ÓæM›7m»/¯¼¼øòb–³œ0™ò™Ëv•íH¿”~  ýÍö7vµíj‹ásís  È_ä˜yvæY€NµSØ8uãT èØáØdú¦û¦Û áË+‡¾ú$ä“ ¿»ÿåû_¾ÿåè“}ÆTc*à“SwŸ¿û<Àö†í ±›è tÅ‚6œj8ð܇Ï}ÐXßX»þ½}ïíH^Ÿ¼ðõœè9F_ìF$ä‹€ònQgQgQgTXÆ ã!ã¡8 'O„·‡·„zB=[K¶–8úýõq`ñÀ8Àâÿû@~à00)Xmì1öDëÝUtWÑ]ö{û]¹£%‹êÕ/ª§wT£x‡F±ø­ÙevAô|¶¥µ¥¤W§W$g$g>>Ì¿±ë5×kŽ|sä€Çª«B7½é(Ðù•ú• V–ŒÊOËOËO£Wò µP-T Ç/É«îÐæC›mŽ‘À$ùÕóŠç $wdëƒ[ ‰»öõµ¯ œN€¶ mbÜá`n07º³ÆÛo>xs´ÞG{>èø ÃÞÉ'•,%KÉ¿$´…ÚBmá¶:yÊ2ouq1f{ñnðn°­åÙÉÙÉ9·æÜ X§/¾pâ£N?œðÝÅï.doÉÞ½3{'Àû÷¾/0R™Y™ ܧ5h _¼þÅë„F"…æm›;4wÈ´/m†6C›qÀ/R R R „Ð?Ö?Ö?n´_øE÷´ßÓn”C`]`˜³ªgU“2˜2Œˆcâ€ö™öY¬öŽn:º àâ‹ æž›{Füþé¾é>04žh<muÙßJ_,}ѱ7h´ ÿX71vÈS/-㵤¬¤¬¤¬þ?Ê€ŠªÊó•ç­åvçÒ.Þvñ6,ðø€ ÿSÿ§Wö^Ù 0vûØí1­™if@` 0Féè©ÑSÑV>V{¬–ûì+´N­SëFW*3•™ÊÌ_LÔ¾´¯ÔõJ¹R¾b¿Ò¤T+ÕR+æFOë;{ßÙ‹ÇÖn¹é6ݱ@ {˜,K·tk£µ¬åV“Õ•Ò`Ó sÐ ™“\ç\ç›ìÜ¡=¯=_á¶Ñ E¡(Ô]QÖ¥b©XªïÍ¢Y4 ¡ù´~­ÿ™÷ì«u¿Ëér†Þ-}oô½«]cȰN[§‹x¢ó0›Ù`­3óÌÍW‘!E£h‘׎æM¨—"þGKÔnMüxÙ·ÊãÊãÊã V‰Ub•9W¥ÎRg"¡ˆÏfŽdŽdŽ¡uhZ‡òA$p]Bçþoæ´¿ˆQ wÅ»·”ª–j©(g”3Ê™þ|bþž„Îô%ä½a«ÿž)×OŧøxxÀ˜nL7¦ð„'´>´> ¾Ô—ú.¬£U´ŠVÍw•²¾Ì#óñ¦QÓ¨iÿ‡ M‹¦EÓ‚v€` Å<Á€'ÇÉqàvÎíœÛ9@GGà¤vR;©ñññ“ö {…½¸Ä»Ä»Äc‹Ç-Ø*¶Š­Ї>ôØ‹½Ø °-l Û^S¦)Ó”aÆ3Ò3Ò3í£í£í£8FqGq”È‘³šŠgçÙy€œ#çÈ9`ØaØaØh45šMÀ{Wß»úÞU@ySySyÀ0°êúØõ±ëcà#ïyçà¼ÁyƒóÀÜkî5÷.¬›Ïåv´£}AŸ~L?¦8…S8E(çÆ¹qnìÒdÄdÄdú„!BˆG h-“wVŽWŽWŽééé@ÀÆ€ó5ó5ó5Àò’å%ËKÏ!AÏõÓ†4€x/âõÜøF0^ÒKzçõ¸éöéöévôQêC}Ø%ª>®>®>.ä÷¹ô¹ô¹°KÎÎÎ6a6Á8±cbÇÄ`0i0i0 èú­ë·®ß€¼Ê¼Ê¼J€j©–jk¾×|¯ù×3¯g^ϸ“ÜIîä¡„ `-Öbí¸”"¥H)`ì_ß¿¾= ¤¤„¿ªûÔ}ê>!Ÿ" HÈ.âu¼Ž×‘ŒÆŠÆŠÆ ÑgüÖø­ñ[ÐÚ-³[f· “Ûö‡m’ø$>‰aµ°ZX ¬ôZéµÒ ˆLŒLŒLX"Kd‰ÏÙKö’= ùH>’Ïs—©œ–Ór˜„x!^ˆ‡ö;ýwúïôÒ ¢'z¢Ç‘ˆD,VR×®7\o|™©ŒQÆ(cJF·ŽnÝÊõ—·•·•·‰û±;°¶îWݯº_…Éc™Ç2e€W‹W‹W °øòâË‹/Îgƒ³м¦yMó ¹Kî’û*M•¦JTwUwUwî9D‘CPUQýEõÒÌÀ… è?”ß(¿Q~s÷C‹Áb°XHÖì‡Y´¢­ÿrB1¬V 7k¦ª¦ª¦ª¼Rc]c]c]ÙqgâÎÄ!7„QaTã“ø$> d6}6}6àZ¹V®Pè:…@ÚÐ áÌaæ0s .—ˆKM‘¦HS„™Ÿ7ÿ¼ùçÍØTZYZYZ‰ï4Ac˜]Ç8Æ1né&"];)-¢E´ˆ»CóhÍ{´Wê•z¥Þ³¶EÛ¢mšœ›œ›œÙ¿vì<ØyxGÞ‘w„‘ ²A6¨ßV¿­~Pd)²Y((èà|•¢Rœœ|¦}¦}¦…¶öLí™Ú3‚¢WÑ«èÈ$™$“™YN–“å];‘|äóî\ttttt4;…XÄ"–ÿ Í¢Y4«ÿ]G×Ñu“KÅÃâañpÜ~C»¡ÝÐ.D…ܹr›þ»¦TSª)Å$ûš};†ŠÌ’Y2 À>ð`„F¿âWü °@Èa"Á$˜æRª”*%qÿƒÊ•*ùÿÐ&k“µÉrý&ý&ý&þ÷HòHòH2ù衇^ä÷¨ 0À ÜÃ>ìÃ>R|%øJð•ü ê4uš:íBî˜Ã˜Ã˜?^îTîTî$î·î³…h`‚+\áúàÜ8X bA`$$¨Zô-ú={£µ¶µ¶µ–Ë·q±q±q˜5—™ËÌe‡¾¼—}/û^6ÀôLÏô°³êœ•Ag¬íEi‘´HZ»ŽÇ;æ}æ}æ}‡¾´q°q°qxp±§¦§¦§†Ë¯û îƒºØd7ÙMvC%“ÎIçÀæ'Ø›ˆ@"ÀøTÿTÿT ¡ ¡ ¡°³²²¤)BŠ8ôå\ê ÌZSñ„õ®ÅÉw‘È9dý’¨¬]“µîæ£ h÷“dYñƆ¹/Ç•–]–]–]ÒžÍÒfi³D£BòBòBòð®Ô-uKÝÐÒ@Ha2„ !ª“~'ýNú‰þCˇ–-çî«CÕ¡êÐü•s—æÀ?¤B©P*äOXOv¯|b¹¹¹¹¹¹˜”# ë€iþHâþ¹?‚Rp£ŠÆÐs ©HE*ý{¥ÆRcvŸ?=~ZJ)¥r$ÆF£43P8P8PÈÝWgª3Õ™÷jMLL2ÿvÿÍûoÞ°ÊV+Î×[¼`/,ÐZܲænåÿË]·1·17~ü²î²î²NÜøÃvŽŽŽ(iºÓt§éÙ¢íÖvk»å‚¿§™ÿˆÿˆÿÈéîîNG­zo[[ã‹\þÀæªk·“)™’)IúPÐPÐPΈ¢‡èñOAå«òUù¾ÿ÷'±ObŸÄ:^ïïïb_wœí8ÛqV\5e™²LY¸}Š(E”"êßÜÙivš>_ TPqýÅ(F¥—å°Jx‘‡àOìr7u¨C˜ÍªY5«Žî¥´‚Vü¯ïìúÙõ³ë¥ E¡¢PQH»¸T.•K½þ£_…_…_ÅÚh}¯¾WßKê%gÉYrfÅV¿5VÀ™?â ø{!w­åBÌÆnìÆn¾l#Ûȶ›~sŸ¸ÃÉO§Æ“vqÎÀyJǤcÒ±]»?ìþ°ûC`òÓY~XÿŒãÿýÇÓäÐÕIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-98-red.png 644 233 144 4224 14774263775 15630 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIIDATXí—{l”U‡ÏwiK±X© X¦n ¢S‹Vn‰m©-#„ ­¤ÕUÀd¹ÔB¤$RZYaC„Ø’ÛŽ˜€+¸JÓÝP›îb5¨5¡µe#2T˜)[:ô»<ûGç|sÉ*ÙìžfÞsÞËó÷w¾3#Äð¸CÄ 5'É—äKò)ÿ O¤$I<’xdîLÝÔMÝìx[LÓÄ4^¶· ]èB—6ÄÚö6é/ãe>™?¶žšËÍ·F¬kÔ¦Øõq÷êGô#ú‘¦Ÿ•µÊZe­’šH ¤øË¢s‹Î-:Kz—ô.éo®7×›±åºô—ñ2ŸÌ/ëý:P‰µ'îVûÕ~µ¿{šÜ¡ ¥J'”š/í?µÿÔþSöÈ`_°/Øhhh pë\ºé¦;¼.ýe¼Ì'óÇÖ›¸û×ù„k”zQ½¨^ìþX&È=‘{"÷„1ëÂÐ…Ð…;ÓeÂ07ß߀ù9Ýœ¦Ç|Ì| ̇Ì<3ÌMæs Ø™v²Œ!ãe>™ßŽ©ïå )MJ“Ò$„^­WëÕ¿”Û * * ¶Þ-X~nù9€ÄÞÄ^€ÁƒV~´ò#€ô‡Óhûºík€ w…&ïLÞ dônìÝ©÷óÜ+õWêAòH> ú‡…Ûn_¸=òd¦<6þþÊþJ€„»î¨[X·0z——£wøè棛ŠêŠê²Ë²Ë¢ý›;š;Ô1êÀÿÕŠ¯V€S/\_òH¾0(x;¼ÞÇÑ45§šS£cݯ»_x¤ê‘*€@{ `×=»î‰}wÁ» ¾=ûíÙèù±-c[¢íÅý‹ûþpÁWËÆåH}o¶7Û›í¼·?;Z<³vfíÌZÎ*ƒÊ ¼oµZ­ØüN¶¾3ÔÈhËh¸#ñŽD€ôÒˆx{ÃÛÊÖ–­˜<4y`ßœ}sžo}¾…ã;ÎÌ;3ì¬á“(IsGçŽÎÍyÉ'TêQ=C—åUW¿¦~qýâ( Œ°BVàÄ+'^B_ô|Ñ0X8XpfÚ™iÚ;Ú;Ë—¤-M[ ÃÇ3ª1FàÇÀâEñ"˜‡¶Ù>&Rïo;šÛ›Û\©d)YJÖÐe¡MצkÓ+kä)ËøMÆm·™»žüÞý½ÛI´ó?¹øI€ô²ô2Àþlßgû<Ë<ËîÛyßÎh©xæ{æLž1yÀ±¤cIÀ@EcE#°@Ÿ¯Ï8iœ4 HUN=<õ°å\Ú8mœ6î­k"¥0¥0¥P½UoÕ[.:/|oþÙü³¦s ¬rÿÿBøò6æmd«Ýiî4€ÓÁÓÁhÐîÝòÛòÛ€`ØÿÚí·€õÖ®Ïw}iué?J*J*¬ðíí…¯‹†ídyêå˜ðfBVBVBVw (ßTžVžfç;=Ô9Ô‰ AWÐïŒï¢í«öU¶²Éùë÷^¿Ì’Õ7ª#­nìo\Ö¸ŒÎZ£Ö¨5ƒs•»•»•»ïÛ¨}á\©Ï(Ï(Ï<ºWiP”©ë÷¾ßJßJ|ŽvË,¯å°?±?BV›ÕÍk»m7€uÚ: v¾}È>‘Òņ^¯2F¸Þw½o¬rvò5­B«(/pÐ<Â#<º+š'òDžþšhM¢Iͯù5ÿK:Wë^×n×n#µëå®u]뢵k°D"HÑùðâ»ÈzÂz"²¿Oÿýéæ§›Í2纮÷ëý¾-ãW_=~µjZ (‡Ât%ó¶ðg‘v^;¯WŽNZ7iݤuB$”&”&”ú¶8ÚÍ+È+ȋ֮Un•‡p•«\p›SÌ)攈kgÔΨaç;wyjBjBêÅÁ䌴VŽÇµ^(qæÉXÛ5bX»]‡¢´»©|S”vST#5d]².Y—"Z줓Nð%w&w&wÚ‹M¦¨)jÊS›ã¤øf_’øõ ­6N»‹þƒv[|-í-F‹Ñâ†nŒ¿1þÆx¸?pàþ€9ÙÑâ{Ú{Ú{;gK©…¥x»¸Åˆ8È¿¤Ý®®FjWCWCW"Dˆ€$-?Z~´ühäµ£ïÕ÷ê{;ÃI’Ûâê†çÅÈ[ÆðTX»þ%íÎy|Îãsh×7Û7Û7›? ¯ÛN'”b¥X)~´2¶Œz5®®"þËq+íæh5ZVÓý.®*®*®²ÿ˜y3ófæMãŒÓj¿æ×üåÄAqPá׎ÖW/Iü#^»[bí9ß+Ï)Ï)Ϙ'æ‰yÖT5]MWÓAŠPÄ_Of d d ¡µkíZ»Ò,ŠëÜÿm¤:ß E¡(Ô¿Œ]~¹DµU[µA9®WŽÿóžáùßúâ:s!.ï-[ýosfÇ™pj­BIEND®B`‚routino-3.4.3/web/www/routino/icons/waypoint-right.png 644 233 144 231 12610450011 16240 0‰PNG  IHDR Vu\çbKGDÿÿÿ ½§“NIDAT(Ïc` üg``Xÿÿÿ|] Ï$UÆgØ4âÓ€ÕFb5Àp ÃO¬ ¸œôJ¿DWˆKÃKBñAQÄ  m¥‹f¤@ñIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-99-grey.png 644 233 144 6311 14774263775 16024 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ~IDATXÃ…—{PÓ×¶Ç¿{ç—„$%(J¡Db­e¬Th‹½H=UÔ"–ñ=Z‡V=tô ¡íme¬Lñ1Å×½·*×>J±‰zát2RmyähƒŠÄB$ùå·ï$§w:]ÿüfç·öZŸ¬½~k­M****** Â„Ø&4“{À=à°æŠ'*N°—µV­Uk7³`¼g ÉGò‘)«] ®Wû GqGI9‘ˆDÝèF7€ÕXÕì+i´@Z@ʹ'ÜîÉí£äyFžýõÈ®ˆ]»"ô•++WV®$|,ËÇ’¼ ¡ÕÇ¥¢Ï3 Z'h­ ZÝ£îQ÷hxª¶QÛ¨m¬³¸ÜîÝ-g²3Ù™œ²UQ£¨QÔ )%'%'%‡”§‰ÓÄib 5$5$5ð¯ýïýúþý~{Ïíûüùýûyü|œ/‚s˜’)™R("«È*²*¶F+ŠÅ^?6zjôÔè©WCBu¡ºP÷ãœîœîœnê™ašaša"ïJË¥åÒr8ñ)>ŧà 'œJP‚“1“átE¹¢\Qx×d0Læ¹–x-ñZ¢ðñ`î`î`îûä±òXyììï*ï*ï*M +e¥¬ôACvŽïß9À Q\×À5θÇÜcî±W¨çªçªçò‹7.Þ¸x#W§Q¨F xáWáWáWp$™$“drÈ!Àƒ`ÃÈ#cà!@€Îh ´âþùCç?ÄÝo¹ßr¿…»)‘IdÙ¯Wø¾€/xkÞÂ[xëÑ•eF™¿,~YüòþÃyÅyÅyåÕê|u¾:Ÿ·teéÊÒ•ÜÍ ä ä dLÞÞÞxÂÑ:ZGëÔ¢µé#}¤ vb'v? Ëgù,Z´ôúÐëÀYãYãYã ú:…N¡ ¸®€’„$@©úVõ­ê[8³s²s²ss^{^{^ ˆ£ÄQâ¨ÝeÈPz²ÿdÿÉ~ÀyÛyÛy(^T¼¨xÀ¿Æ¿Æ¿èééW3®f\ê—Ö/­_ ŒØGì#v 8½8½8à?ä?ä?ôú }jMµ¦Z©Fª‘j@‚#‚#‚#È{wíwíwíøÊ•éÊteNYC]C®!׎ÇTÅTÅT¡\V/«—ÕÃé䯕ãÊq%`q[Ü7Ý™Ý™Ý D'E'E'yï罟÷>@Ûhm:R;R;R'QO¢žDYW²®d]yAÿzÞõ¼ë€°OØ'ìÌSÍSÍSáNž'Ï“çÁéçñóQ|/ðI¤géYzöù©Ð/ô ý@€=À`ÂêÂêÂꀶm7ÚnîTwª;èØÚ±µc+0b±ŽX™Af€IúIúIz ÍÔfj3½ ÞÞ8ûœ}Î>À{Ó{Ó{¿)]AWÐã0“D*ŠEŠ"Ù9û,û,û,ü‹ÿ„ÿ„ÿ"_9aþE?ýXô#àÐ84 ðµékÓ×& µ©µ©µ à2¹L.À>ìÃ>`EüŠøñ€#Ù‘ìH~A{ëöÖí€Ø+öнs37s?ôûvŒvŒvà_TMÕTÍΑݑ»#wGº­cácácáÜñÂŽÂŽÂRžJRI*“Ù˜Ù · Y†,C€t¾t¾t>VVV ¾9øæà›ÀAÅAÅAP6°¬«¸œp9ár<7xnð\ anÂÜ„¹€þŽþŽþp|Ãñ Ç7ÖVk«µ¸}9úr4r ä@È !?!?!.ïfïfïfțšš„ b&fbÆ·ÄK¼Ä{L"Z>º|tùhëõqí¸v\¿zø—á_†yãoO«žV=­ò–¥¥¥Ñ÷â²â²â²àz¸îẇëÀ5É›äMr@–(K”%…Û ·nUª@0õ›©ßLýxØò°åa Ðô¤éIÓ@æ”9eN °¢°¢°LiT•Fp¥¥¥‚³+¶+¶+–nHHHÿe™§ÝÓîi/Ì#;ûvöíìÐŽv´OÙ/¶Š­bk«Ì¡sèºWK5FQcdoçõåõåõ‘B‘P$y¢=ÑžhñGâÄt2L'¨BªlÇvl˜ƒ9˜pW»«ÝÕ×Ãõp=€è„è„èœwçÝww OµŸj?Վ˲^Y¯¬w<—‰˜ˆ‰R 1 Ó0íÞ:JÒ£ô¨ÈH÷Ò½tïãÍB¯Ð+ô®rËõr½\РņböšiiiNûZæ˜d¦d¦d&@·Ò­t+À,ÌÂ,ÿÄÌÁ€„’P H–þ,ýù9 }„ŽÐ yÓ÷Mß7}Ï«ÅâNq§¿õîH:I'é÷Ö¡Õ¨æ¢DYYYYYYì04Ð@Ãí¦;éNºóþ6šKsi®=Żͻͻ-¯ÌÒgé³ôñ™3n͸5ãý›l“l“lì,†Å°HÉt2LaYƒ5Xó|zcŒ1É%¹$ŠK¸„Kð–=øáÁ~ྑ—ÈKä%§+ãíñöxûÖÿ,,,!g`†f÷Ï£ X`…ïÄlÁÒ0ýâô‹Ó/V¿°6`mÀÚÓ•ÏBŸ…> ålç÷ó–ùö)ц6´ÁL0ðÀÏ¿ "[ÇÖ±u`dÙCö@ú“ù'óOföv{s{s{³¨Z¡ˆPD<w×¹ëÜuÛ¾ìÜÕ¹«sÀÌÌÌÌò™ùÎêïDg…—„—„—t§ÿNÿ~À½Å½Å½eÛ—Š`E°"øÁÙîÆîÆîFQuó’æ%ÍKØÛd#ÙH6B*œN 'Á ƒ 2€ ³a6 žð„ÇØoæßÌ¿™qZ7S7S7AŠÅ€bf ³„YÛ¾œH½Gã¾TÜïû›yþàïåð]I¤¾¥ËWw«¡ƒ:oÉ $ãí÷&®×/yÖ{Ö{Ö ›>>>h挽3öÎØ‹¡Kèº §Óè4: .¾œ/çË!=(þP¼7a } } ]Ô03`fÀÌêÙÍÇ7…Z¡V¨åöûNv³ÿÄ*+++++a÷G¾\Ïà-›¸ópûI ©!57¾§Ù4›fÜ€R”¢”hô4z=üzÛÛÛÈ)¥”R û#¡ÓéÇç£ÚGµjE=;vìèlr=v=v=Þ±¯g~Ïüžù€PíŸÖü€~¾ç ¿ö+È}þéËÝKÿ/w#ŸE>‹älõõõÞ2$  2…˜BL!øƒÑ`4I‘¼KÞ%ïµ Ô›Z¹åÜrnùØ›qiqiqitÈçï?|ϱßs‰ð2Q Àû–&&a&!’’’ðßÞho´7ú/“ÆIãÞ?ðTóTóTrÑvÏvÏv}}ç»;ßÝùÎ;ÇáqxÑq¦8SœùI;ÂŽ°#ÿÛ)¤ŠîcC&ûOÀ(þ÷<"»Z4£ÍÞ]¬5°†¬^z^ þ7¾p|áøB!I\+®×Ò{¢RQ©¨ôZKü…ø ñæe™{ͽæ^rUÂ…pvÌg·Ñèü#Š?‘ß宯\xwa#6b#w›¬$+ÉÊijfÖÌšÿZ"‹‘ÅÈbè=‘EdYÇ{„=žõý]˺–u-&ç³ç,ÇþŒãÿ@Üg¢IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-8.9.png 644 233 144 2640 14774263776 14774 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜUIDATHÇÍ–oHÔwÇ?÷3wž“´Ùú³Y1Ï‘ÜI„,›Rd©…ã°06­¡4™1–¬'[O2ZjÂPLÌe‹YshŒÒæ˜Ez1°œ;½É<½ûý~ß×Ü}ïwkkû>9>ÿÞï÷ý>ßïçû‘¬ø¯€±ÂXa,ŒÙÆ;Ž?msÚfo{Ì>mk‡kǽO ódæI€Egµql×ùÉõ"~2ŸöK–8w—»ËU·Â®Â]…i/ÇìÏo€§ÇÓó— ï^x÷Àù¶óm¼ã7ÇoL•N•‚cë¸Î×õ/_Ž>Å/©}©}®1p¿à~AV•¯*Ïý –ð *+*+~Kù-E`ýd¡JfÐk2ÉÖñx¾®×x_óiþ˜ÅoêÚêZÏ™XÁ/_a6½Úôªæ‹öðÍ4“¡nGÑpÆ ™!æAÝS÷€9Qõ³ú8iN˜Ì«»ÑÑ@7‡8DFÏÒøq¾Lü³·Ç˘«‘IúžWÌ»æ]P+ÌÛæm¢ñ€RÙ*U¥^¼xq–P/©jA«TŠyÁ¼@”J+ÕJMÂÔ5†x¼,©•""ù'À3îŸY#Öˆ|ÀVPíªÙÈH0„‰Ê‰Í›Á,4 ÍÂ$AG8ÂÇŒ<Œ<Œ<„Éo'/M^û~ü`ÿhÿÈ,£?Ηàé‰ ;ý¼wø½Ã Æì"`ˆ!˜˜EmûsÛä¶IXæ]æ]æ…êüêüê|˜Ý3»gv#(…CaØ"[d‹@úÕô«éW¡ö£Ú†Úà>aÂ(°ÖXk€fÍã×zâÂ~ú:B!°~P{ã<ó½¯õ.í] y=y=y=0T7T7TÞSÞSÞSÐרר×èk½Óz§õ¬÷¯÷¯÷;þÕÓ«§WOCç§w~œpÏ[5_Œ_ë1Dö/ì£Xdã[ß1\""®3ñN»7^Ü𢈻ÅÝân)É+É+ÉÉÎÎñø |’X9ý9ý9ý"O²žd=Ééhêhêh „á@X$øv°>XŸHwËqÍã×z ‘”Ê”J DR{S{EÔaùCWžë?wýÜu‘ìâìâìb‘PK¨%Ô"¢æÔœšéîîv„•—–—–—Šìöíöíö‰ô5ô5ô5ˆcƘ1&’îO¯K¯sò%]óÅøµCľh_t ‹˜Uf•ˆ|!""‹uÝòÊåÛ—oytëÑ­G·Dº—t/é^"25=5=5-âyìyìy,Òè tD®í¿¶ÿÚ~‘+®¸r@dSÕ¦ªMU"ÙÁì`vP¤äõ’ü’|G—Ö|q~­çé=ƵxÏKÌQs”ùÄÞll„uEëŠÖAÛDÛDÛëƒõÁz¨òWù«ü4‚FЀÕ'ªOTƒ¯ÌWæ+ƒË;/ï¼¼ÓÙsêŒù¦ù&óŒÿ÷ûשÄÒ§ÄK€Ïh§ů 2˜4B„tÒ™ä`€ @€@’ÿ,§9 QA ¬¥ÖR`îOeÒ3GæG߉­üdØÌZ_[÷­û`5[V#ØkíµöZ ‚ *À^i¯´WûØÇ>°"VÄŠ€õº•kå‚Ýdi `´2‹ÇW#Ñ‘è3çXÒä§&­&-i2c Xv½]O4Þ\D‰ ;é j[!N¾½×ÞKÔÁÓøšï_“ÿw%M9M9Iw%ã`Θ3–ßò3ꆺ€ 8¶Žë|]¯ñ4þ3ïÊçöuñܾǞÏìßíz½qð™LÇIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-100.png 644 233 144 3001 14774263775 14745 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܶIDATHÇÍ–kh”WÇŸ™Lt&Ö`¢]b/¦HD0+´’¤v¥²a“´äRl\;¥ÛØIm>I¡õÃê–í/ݲÅf3i‘6¶qL`!”˜4…ˆx‰dPz;›¤¹Ô™÷}Ïù퇙wÞaK¿{¾Ì<Ïÿ<ÿÿùüß# ""k²¿îGܸWgb÷Ÿœ¼÷9ïsOD2ñI \u®ºk‡à¡ú øãâÕ”Û¸=?¿^ÄáÏ׳ó²FœÄÊ3+ϸvfã·¡aKÃoi&>:¾~_ÿ’ û¿Üÿ%À§¿8ÍŸ!ñMâ€Ù³;Á‰mÜžo×Û|ùüòöÿé‹@a´0êº +W¬\!íylOy[f­r¨}¾öy€ï ¾+Ðn°î~üz'°Àöø)/¶ñì|»Þæ³ùm=[?Ó@I $ Áƒ/úþ™)˜úfGYG™­gôSÍk¼†ŸÓæ 9`uZ¤8¥›tè+ꊺ|®ßÐoXoYo‘âCó#ó#Зy™—ñÓŸå#Ëofõrú™~œ­T""ÇvCHB’khL4;ÍNÐ7¬«ÖUŒ, i%DTB%T"·bèMz“Þú†¾¦¯.Òåº tÒ‰¡ ¬ kØ—á‡ÐšÐà[_òÛïßß¾<[Œ-Ô€¾¤/±¼”\.Z.#b|b|â4’J¦’©$$Ë’eÉ2PKjI-9xÚ“"$MV'«Ao1§Ì)–³p wc·b·íKø »Ÿlc'/p7¼?¼ß¦S[õc«±fÿ:ûÙìgèÊ'*7Tn€óuçëÎ×9Â{Õ^µW¯ÚWí«†æžæžæß׳¯g_ø*}Û|Û y¸yºy úUý*ðÂëÂëì³wò‚;³nO}%»Ÿzv(»ŒâúÃ/ý÷_ºÿ’¤kfjÆjÆÄ5ÿ~ü{‘Ò³¥gKÏŠŒLŽLŽLŠLx&<‘ø½ø½ø=‘Ø‰Ø‰Ø ‘p4 GEnÞ¹yçæ‘¸ŽÆ E.^º¹WT<=ð´¤eOFOÿåõŒ²õŸúJ`õ׫¿ÖgXL<™x˜Êž•×Õ6µ ¬ßY[CEcEcE#Œ†FC£!ˆ‡wlܱÑY¡†é†é†iØ\¼¹xs1ÔGë£õQßõá®S»NÁßüï]}望·‚ß¾óí;`÷ã)¨-¨e³ø ‡ ‡E予ˆ$åï2(ƒ"‰‚»wE<­žVO«ˆl—í²]ÄsÄsÄsDÄ šA3(¹a¬2V«D¼íÞvo»ˆÙev™]yx‰Qj”Šx_ðòÊ¥“R¼âŠ "v?n5 \7³Ö¬CDDJ\JZÒ¡ÕbµX-"óóó"Þ@o WävÛí¶Ûm"Ý%Ý%Ý%"ñµñµñµ"‡/^¹^t½èz‘H·¿Ûßí™› ¼h ´åèKÜÿ±ÖYëDœ~™l‡¾ù¾y` @·òGsΜ#e/õÁàÁàÁ Œ9[iŒ4F¡Ê¨2ª hhhqð¾£}GûŽBÕ\Õ\Õœ[<7snƹԬÎêÅû.÷]¶ÿd»s+ w…»œ[ æ‚é8º&ÅÏüì @衇¼[È0à ƒ> èÀYëÉŒ0È š-æãæãyz÷Ão†ßtne¾e|DÇŒ˜(ÛÇT‡ê`YíUÇÔ1ÐÿÕ g¨j½Z¯ÖƒUiUZ• zU¯êÍÃËU™*«ÒzÅzÔ§¦Çô°ìðÇTLÊ÷ƒï‡_ù˜m´ÇvCÈò:ÎÖ˜5,©zU‘õ~ ˜˜ÙÿH“&“››É¥U“jÂkÔÍç·õ~åü¿ñ­¤cCdžA?ð.ïâw¶Øj²šHÑ#¸pÛxîHdëm>›ÿ7¿•ìëâ}=˜/ØÿUÙ\÷–bIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-55-red.png 644 233 144 4235 14774263775 15623 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜRIDATXí—{LTWÇÏ}Œ NåQ@.ZÅuU×AÀAãN¡ `+¨†tÿPÑÛŠ©k*Pƒ-©µ´¦º5æªAP¬[)Áië¦Dè23A¶5¥ 3<†ûøîÜsç‘­f³{þ¹sîïõ™óûžsf™Q$h°™ab˜&2“Ú ã¼–y-óZ6gð2/órïçd YCÖsfµ†ð„'<Ásµ†úÓxšæ®Çfóò•‘2RÆÚƒíq¿ç[ø¾Åþ”9Èdê ‘1îwŒ×óòò€‚G ùæ|s¾Ù?§vêOãi>šŸÖ{6a7Ï—žbÇÙqvܵ†®PbIbIb‰üÖ™ÛgnŸ¹­FxžxžxžàÀÃ&0 .¸àô¹f§þ4žæ£ùƒë-=õl>"¼À³Ãì°ëo4¹ËÜeî’Ö;f>‡hCMUU€$•Þ–ÞätI@¶Ê™r& §KýR? •J¥R¿?wÌ:¬+æ.s­¹VZ¯³Cì­/¼ £1vÆÎØ á«ø*¾ªá[`©±|bùD²ê`ÆMÜ„Gj@*Õ¥f<ý“ Ùo§þz¼–:Óz´>å¡|Ä0d2 ýñÔA¨*…J5Ùù«³ÕÙŠ1-G>áuy]àþÀýÏä’É%0Ñ3Ñ“a“a€“8 ³Í³ÍàNu§úOFOFò w¯»WÿRç¯.‹Ë‚1¡R8 P“)ÎÇïç÷óûïTQÃéâÓŧ‹Õ7µS’æºu5 €oÎà†¸!`n{€a«a+¸?t_|=h×üõøpo¸ìƒ×¯ëÀS§‹O]9uE}S_Ù >¢ŽÄ¤Ä¤Ä¤ æéæ§¹Os@T'!!‰~çsmçÚ îrÜeèü¦óhOmO€‹Ç. ÔÀùŠó þžË)—S$M'Œzôtó“KO.”‡ò±é_3K2K2KHELGLgL'ñ*NÉ,™ Oz5…=?öüH!Q7£nBHÿtÿ4!„ŒDŒDBˆµÂZ¸1»w&„¨Â¨BBé÷ö{üZ[BzÆ B§bQ,„éx±ðÅBâ¥<”O{¢5¿7¿7߯YÞ45¸BÛ ¶¶2§+§ "Z"Z`±²X¥^©€W_{õµ ÿîœnˆèŽè€eiËÒŒò_‚¶¤œ¿6mþZýÜn¥­/ʨ˨˨Ãà43ÍL3.©5j T쥭¿›p7z~êù)0§ã Ç@M?7ý ££ÐýJ÷+ÿÁŸjµ÷‹Ö/Z5mîp ^æhs´9ƒ”°VÖÊZg¡Wݹ²³Óg§ýâ–Ã'“hHoHà{tâщÀž+ž+À•r¥ðþî÷wÀ5ášNŸÓà.''SÈòÅ“é'ÓýõnÖ¶µé+ù'&IcÒf!Ü:n·îH5ÝeIK„¡A^ê,t¾ä|ÉO£æ¤”¦”@êöÔíÔvc»Ê3Ê3`ÁW ¾€ß=øÖ¹þKXõê }aûBSåör;€—˜˜ ·ª· ¾)­PÊ‘•X E¿¸8.Ž‹ûtŒs¹Æ\Bø[ü-þVã°~àççÏ9.¢¤Šíá÷¿‡¢Éd2˜¢­N^ž¼š+›+Wºqÿb0}fú €Gó[æ]æ”O›-Í«Kîï.Þ­L逥\)Wúsóù#!Whâdž4Cš!Íu–ØŽÚl jŽÞ¹hI”D¨€g«g+ÏLöLv  Z¦–®áŸúP}žO {ó¼yþV77íkÚ‡—õ+´š­f«§73 L“°êL w_¿Rw1»˜]›ê™F¦‰i¢ZQö‰b¬ Q×î!%J™;®â*Ÿr_¹È«†«á Æª±€š£^R/ù¥4Ü8œ8œ$… ÷„{Ò~}%ßãÞåÞµYt4+±+/øY³HÉâß#vb'vB¸n„yëª~µÖ  I‘Îwœ‡œ‡üÕe¯²7³˜@E'" Y€ºCÙ¨l„¾­vÞÝÙµ³K>¤ß@ü8?.? þ!¬…µ°æ¢FWL1hÏÜ 7È 2mÉåÉåÉå„J %†ñ¸®Ý,K–%+P»ŠM±Á"D£ŨŸ[^!¯WøµXgª3Õ™Ôý.4D"‡§µ_KáÁfn„´ž0!Óîà¹>§]çÅíµ Ðn¤)Eú”ÇÊcå±_‹}èC Îï›ß7¿OÍÓ5id¬ñõc!Rü8„/Œ<ûW¢Ý<¦‘idƒ´Û!vøµ+uHR‡èóÆ{ã½ñÀj÷j÷j·ü;]‹¸ Ü…7P©iÒ \Hž3ü4Áoi·V¨j¥Hg£³ÑÙÀ|pSR[›­ÍÖæ?vøz¾ž¯ïÓþ’Ìÿ{H]í=‰x`è ¯kÚ½ò[ÚÍÞ–½-{›_»âqƒ¸ççìªÞ ¦ˆ)bŠ6 .ÃŽ†ÔeÈ9ž§ÝL®š«æª]鸨²¨²¨R=™:“:“:#=Ð[=Âp#¶DÒ@HÑŽÎR/Œü#T»ÇƒçÙÿdö0{˜=ÙB¶-ÊJv»ˆ]0„! éìNšJšJš"„»ÃÝáî0íZàŽÎýßF¤þ)—ä’\þÛ`ó;Ŭʪ¬ 07˜Ì-ž{¿\ éŒ#$ïs[ýoò;y‡žøœIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-56-grey.png 644 233 144 6276 14774263775 16027 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü sIDATXÃ…—{PS×·Ç¿ûœBN”ðð]”GyX~èTÅÊ”Xûƒ"ÅÚ,Xô::øj¥êBÇÛêÅÓÛ{AøQ±PZE«RzSyÁP% INξƒwz§ÓõÏž“œý]Ÿ½Ö:{¯M´Z­V«…;¦Ì850‘\×ÇõÑzm™¶L[Fçå å å ­ ¡ÔƒzœüP˜/Ìæ/ßn­±ÖXkèç(A JH6‚Œ`]èB€íØŽíôsùÛò·åo“lî÷Œ{ÖZBFÉ(=T|lî±¹Çæ6>ÊMÉMÉM!ÁOðüḢØìärg¦#¦BÌsıÙf²™l¦9+rjsjsj+úm›Áfh¸g~Ýüºùõå•Êe®._»|íòµ$;L& “+ÎÁ5ÔºQ7q+I'é$ݯ€õcýX¿çLå¦rS¹¯§WƒWƒWƒcÿÚ®µ]k»{¨.Tª#qòly¶<f|‚Oð x˜a†@Ò``ÌVo«·Õqº[º[º[Ô~=øzðõ`qÿ‹õ/Ö¿XÿÞ?x?Þ÷[íêHw¤;Ò£ hÍ }[ ˜5ŒxX<,oS µP‹÷Lv;ƒq#À6f³ù¶ÅÅÅ ™“™“™“ì“Ñ *A%¨J[M ¦SBʲ ¢ ¢ "!.C“¡ÉÐpWÑ„&4a8à€ÖaÖᥠ àÀP‰JTô>½Oïä49MNàÁƒh%­¤•'›È&² nçêÎÕ«âº÷vïíÞË]UV+«•Õe¹1nŒK]΄0³Âöí;Ûw)˼½½i@bnbnb.'ÕȸP&” ep³´´l¢M´‰€­ÍÖfkì³ì³ì³„! aL0ÁxOâÛ&Û&Û&@ð<O€ ȸIú‰•‰•‰•\…W‚W‚W x$>ŽÓ`|<Á®´+íJ@ý©úSõ§XëÞäÞäÞ§ß{­÷Zï5 ì²wÊÞØX6–„¯„¯„¯y‘¼H^dé²tY:@•®JW¥ßoü~ã÷¦…iav»ƒÝÄhb41`Vaàæ^ê^ê^ ³:L¦ÃÚKg.¹ty˼eÞÇ8!@Vfz\ô¸èqŸ/‰Zµ$Šböaä#ù€)ÞoŠÜ–¹-s[$Õ'Õ'Õâqƒ¸˜ô™ô™ôT×U×U×ÛÕ·«oWwï4Þi¶»owßî Íš=4¨h«h«h&.L\˜,Z0´`.¡²PY¨ŒÞx~ãùçøÜ¤6©Mê•™ŒuÄ:bÁ×>§|NùœB¶â°â°â0ÌŽEŽEŽEà¤|²çÉž'{E»¢]Ñ Ÿ>;|˜x0ñ`â4+hVЬ—%«kѵèZ€ÕÆÕÆÕFÀ×èkô5K~]òë’_Ý5»kv×Ê5Ê5Ê5ÓÓ8þ'þ'þ'˜%‰Ã œÀ Ì\`.0¦'Èqwq÷¥ã[^ly±xæýÌû™7Ð!ïwȾª¾ª¾* é‹¦/š¾¶Øv`Ûà÷¢ß‹~/Œ?0~èºt]º.`òôäéÉÓ@ÄȇÀË—/TAT ± äÌûÌûÌûŠP„"̱óÙùì|Z5>>N–[…­ÂV¼Ê sÃÜ0¨““Ä(c”1J@l[ÅV`¡f¡f¡=9zrô$gͳæYNC§¡Óà&nâ&Àðü°-o[Þ¶<àYò³ägÉ@asasa3à;â;â;„XB,!–i¬é¡é¡é!z™8&މ£UŒë)×S®§„üÞ¹½s{çÒªö´ö´ö47p7`±'Ù“ìIÀó„ç Ï•¨UâËHóZ^Ëk®˜+抶œ-gËÀ¿ß¿ß¿˜Y;³vf-àóÏ7>ß3Cg†Î F/Œ^}™I‹>UŸªOôúýþÓµ×µ×µWÈçˆD$+á4œ†ÓüÇáFU£ªQåð÷oõoõoe{TyTyTa¼AÓ iÐÀy—y—yˆ/‰/‰/z^íyµçU€ÛËíåö¥¥¥€Ål1[ÌÀµèkÑ×¢¿¿¿`P;¨ÔŽÇ€cð ñ ñ UZw¶N[§#H,‰%±Ì]E¢HÔ9#3¯i^Ó¼¦Ïޏ¨]Ô.êò§#GŽd_2\2\28ö9ܶ½µí­moÁ:Ã1Ã1Ü{pîÁ¹@GxGxG8°¹jsÕæ*À=Õ=Õ=xÃñ†ã °lxÙð²aàü¼óóÎÏZ´i=$J:”tô•7_yó•7!¿¼ñòÆËEóàÓÁ§ƒO™».g\θœùŸd{¿½ßÞ¿ßNŽ>9úäè-hAË+geC²!ÙP³b¢a¢a¢Á7#º-º-ºjbÇ<ŽyLšÄf±Ylµß·ß·ßáxŽçx€ÝÉîdwøâC‹±‹¨¡†°úZ}­¾›Ê¦²©WÇÕqu0ÿþKø/áH*ï.ï.ïF¢GÑ£è™\OYÊRvyÒ”Ndž)aJ˜ög&Écòöˆ=bØ“nãùF¾¸•|+ùV2ý›ÎGç£óÁ·L$ÉDÂâbv1»˜VͪY5@é PŒbΣ”§<åyŠþãøã?‚¿úõÕ¯¯~-øËze½²^`ªý;"’UdYÕ±cjç¼Ù¨¨¨¨¨(Z„hD#š;ÎeŽ2GĬgÖ3ëÇ—;>v|ìø8f_¿¥ßÒo"Cï†Þ ½Ëü»B«Ð*´§7éMzr²’¬$+ˆ!ˆD$"rÜ#÷J(¡V¢&j¢†òJá•Â+…Ž}}÷ûî÷Ýç¾à·ò[ù­ßæNNNüæEÚ‹´i¤zè¡©U¢ýè! YÈ"5!Õ!Õ!ÕùwÍtÍtÍü6wÔkÔkÔ‹3^šsiÎ¥9/k`€:è `…uúÓ@ãi<%ÇÉqrò;ú;ú;zªiù¡å‡–Ø|ålålåì§“¶ […­â£Ï{tìÑ1€ê©žê¡rÊ”J fçxAœ!Îg@Õ>Ø>Ø>زlY¶¬>Sz(=”}ºj»j»jÙüúÍõ›ë7S ÙEv‘]‹çÅóâyP( € ctŒŽD `Öë‡õø¶aiÃÒ†¥P) JƒÒˆáb¸þÑgS¥÷tÒYŠgËŒ‘ "­Üy%‘;1aóÑ€48ö‘A"4Ÿºrܸbßißiß)î~O|O|Od"CóBóBóð¶Ø)vŠà™ÅÌbf1¬B¶-dCþeà—_:‚ « « «Øn×¥®K]—毞úhöß ÅB±;ëÌì)c¹¹¹¹¹¹—" çÖé”û¦î<ÜYR@ HAÓwŒšQ3êý5È@2˜ÖÚkíµva§±ØXl,Ï0 Ã0“"Ñhi´4ZDóÓ§…O Ùn×#®G\<ºj°XŽü£{C÷†î €Ð_ÚO%@‰oôÀÒ ¼Sà¶³v¯ü¿Ú?:t>g¼¨½¨½¨uìC‚•ÎSç©óÄßúùÖÏ·~&[ùN¾“ïDÑ_ôßÝÌmá¶p[,o„„„1#N¥ê\,þĦvR3D]¨ u!ÿfxÍðšá5ü×TwuOÈäïüó·èߢ‹ö¬6v;Œôt{i{i{©cÍ„}Â>ag³d‘²HYäoZL‹iñ¿®B9äìcŒ`#â)Î@ ä!ø û“ÚÍA=êQï8Fkh ­‰êa.3—™Ë?LnšÜ4¹I|MV(+”2l›Áf\¿9Õ%­‹Ò÷è{ô=äš8Gœ#Ρ眺µN@óŸq0ø ûCí:· Ç1ìÂ.ìâZI I!)?ÒzZOë¥)|> ¦ƒígûÙþñ¤xR<¹s°3¹3¹3˜D€SOjG,Åñ¿Og÷w`ˆÓIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-58-grey.png 644 233 144 6254 14774263775 16025 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü aIDATXÃ…—TTÕÚÇ¿{Ÿ3¿‰¢†NŒ Ö«f Á5 k¡WAÅ4.èr ®šfë¢Ùk’¯´¤\¡ø® 1®†!â‚DÅÊ+j#?œA†DgæÌÙ÷æÐZÝÕjÿsÖ>çìïóÙÏþž½ŸC²³³³³³áŽñ64~¡a|'ßÉw²êì’ì’ìæÛŸÛŸÛ¿ôæÁ<˜Çþ¿ >‚à³à-k…µÂZÁ>B1ŠQL2ˆ@hCÚ¼…·ðûH§ˆSÄ‘L¾ïãûn31ó?æLÍ™š3µ¶9/)/)/‰˜?ÁOð#Ñãâ5'—; E(BéI1WÌsÅk¶QÛ¨mÔkanenenåÉ.›Éf²™jþm™o™o™¿`‡æææªD-ˆZE2ƒdA² °pÒÂI 'R_z.½/—ô&ôñ¤øÄÇ;3ø se®ÌU\ORH Iñ;Äùq~œß¥c£¥£¥£¥ÏMò¬ñ¬ñ¬qlj‹j‹j£ö9ú9ú9z²\‘©ÈTd‚؉Pà ,’‘ŒdÓ0 Ó`±úZ}­¾X®¯××ëë™ý»Àï¿ ·?zíÑk^{ã ÚOí§öû‹Ò‘âHq¤Db©,•¥v®'  ¯¬§YO³ž¨G=ê}Ÿá+ø ¾¢þ_¶1Û˜mì¹eºWu¯ê^BÒÒÒù“îOÜŸ¸?.p ±L,ËÀã.îâ.@ö’½d/xÀ€f˜2JFÉ(ˆ!‚zf虡gÐQ~¸üpùaa}ÇÕŽ«Wùër•\%WýrAˆℸʼnXŒÅXÜó„ªnªnªn2o™·Ìû¯X.X.X.<·L·^·^·^Xžš”š”šÄ_w¯p¯p¯ÀdÔ¢µF0‚ð4†ÆÐ€¾Cß¡ïä yBžd ™B¦(G9Ê •±2V¸e¸e¸e`²¤¯‹ÓÅéâ„åR|‰Gâ£Âˆ0"ŒD/´}cûÆöMÒKž ž ž Ì?!/!/!—<2,”%B \­;¬;¬;›hm"`»c»c»ؽíÞvoZh¡p ·p `“Ùd6°Î´Î´ÎŽG@î’»ä.\%ý„²„²„2þ¤g¼g¼g<ó—x$>ž²@¸g•]cר5@ÄD|€(÷:÷:÷:ÈBêö‹íÛ/%ñ%ñ%ñ·Œ[Æ-„Ï…Ï…Ï…\!WÈíaÛö‡Ô‹zQ/àDÞ‰¼y@OVOVO ï‘÷È{€åIË“–' ° W÷R÷R÷RX"B#B#BU~ ü@ù@æ+ó•ùîYEÁ_ð9ÍcÀcÀcÍ Ÿ>7œa¶aÛ(FWŽ®] ¸¾äú’ëKÀÆŽ;€”¨”¨”( arÂä„É€K©K©K)pQqQqQ˜ÓÌiæ4 mCÚ†´ @HzHzH:p.ö\ì¹X`x×ð®á]RÈçdÎÉœ“IŠ$‰Z­ƒÖAü¿6_›¯ÍG¦j—j—j,ŽŽŽà%…îÍÝ›»7ªFU£ªxXø°ða!0Ú7Ú7Ú$$$OÄðÀðÀðà±Óc§ÇNÀWî+÷•ºd]². ŸÑÏèg€eÈ2dšÆ«WªWªWÂ"ñH|âC|Hé)zŠžš Àu\Çõß?Z÷hÝ£u@_{_{_;ТhQ´(€³ÓÏN?;(ì/ì/ìÄp1\ ¢š£š£šö¥íKÛ—û}öûì÷ŽÄ‰9¶¶¶Þ‡½{Ä.±Kìú->Ý@7Ð ŽàŽ@Êùp>œ;=<<Œvá]á]á]pÜCî!÷L­‰ÖDk€·o¿}ûíÛ@ò’ä%ÉK€-Ù[²·dUUU@Óâ¦ÅM‹ýqýqýqàYųŠg@TFTFT°èÅE/.zø%ø—à_‚þ¤þ¤þ$€j©–j'âq£?þ4úÚ©Žê¨Ž¦Ê|e¾2_(hŸÚ>µ}*;ݘܘܘ à.áÆìkìkìk€U«Vn¢›è&þ–iuºN]¨:UªNÀl1[ÌàF̘1@hohoh/”””D¢ ÑÀÒ`i°4÷.ß»|ïò„ܘq•q•q`ì5ö{ñ±²]Ù®l (€„œb>›Ïæ³If­[­[­›Cg¾m¾m¾ µì´ì´ì4†kÎל¯9¯-^[¼è(î(î(._¾ ÐBZH ¹_ÌýbîÀÌ—g¾<óe ¾ª¾ª¾ 0è :ƒ¸ºï꾫û¶–­ekM3šf4Á*Íûü–ó[ÎoC‰‘‰ŸqÇ19õ®ó®ó®Û·[!G”ö îÜ1¸ƒë(7•›ÊMŽmN×1c6ÆÀêâpq¸8€c·ŽÝ:v hy³åÍ–7øñ+âWžƒžƒžƒÀŠÇ+¯x xö{ö{öÇ?xü ÐÑÑÄæÇæÇæƒiݵîZw(Î :$Z„½.ÿDþ‰ü“¦D{—½ËÞµÝN²º³º³º4  ÏÊúeý²þkª‘š‘š‘šçR#ïDÞ‰¼Ã–DwDwDw:ñšxM¼f¿a¿a¿Â+y%¯¸t.K‰HDØ‹½Ø `a`ÛcÛcÛÐÓô4= ðwù»ü]X~žûóÜŸçbMiwiwi7Ϋ *ƒÊðô5Æ1Žq Ö`6fcvËß)-¦Å´˜»IÐô@ïfÑ DCŠM]«®U×õ‰õ‰õ‰ìôZ½V¯E £a4 cr‹Ü"·\$ÉEì>»ÏîOxHD"ÖͺY7 o’7É›&‡‡¿þvø[¨«Š«Š«Š¬SÖ)ëÆË¿Ý" !!$¤åï(@ x_g™ç¯ù=ä9DÕ¥ÓA#¶W`#6b#ý´ruåêÊÕ¦¡Ü¡Ü¡\¨IÉ"Yfͬ™5d:™N¦OœéÀ}ÜÇ}€üH~$?l>›ÏæOxÑõÂ÷¾¿ð½c›ù+óWæ¯øBÅ4Å4Å´²¼YÏúxÖÇ/!9È!ÿ‚„H©Õ  ]èš±[±•T¼pö…³/œ-ø«2M™¦L+Ë3{š=ÍžüP¹W¹W¹×oÞ… &˜`…zèXaÀÀ6° lyŸ¼OÞ‡âãÆŒlIÕ†+ W¸ÍÍÍ”ž§¶“¶“¶“ïíkÎiÎiΘ‘™nN™/%P‹ózJt]D¸5>h|Ðø°mµmµm}oŸÆCã¡ñè<ÕVÙVÙVÉT¯®^]½š-!é$¤C!žOˆ'À ‚ *€=fÙc€D ÆQV3¯f^Í<¸iL“ƈÁb°üÞ¾qëõüÐ×Ù_gíØ†Y˜…YpÓOÒOÒOÂñú›õ7ëo’õêVu«ºu¢NÔý㿎_ǯ[äääDñVH'Ôï¹8üA ‡àìꙜəœ¼mzÞô¼éy|1^]ý[Pø+üþñŸþùk䯑“ε µ µ°ÿkü²ñËÆ/¯ŒØGì#vn«,L& {×—eGÙѯª € ®ƒÄ 8MZg¢„ßóüIûïæ¢Õ¨vä° VÁ* ô =CÏ\öû4öi¬ø¼¬HV$+¢-\*—Ê¥~w5àLÀ™€3KãÁh E/ÑKôbÇœº•N@ËqPüIûwÛ…#éHG:›$‘$’t%€U³jVýÏd•V¥Uii ×Åuq]½Zq¿¸_Ü¿éAkbkbk"0§žTXŽýÇwó~pø®ÐIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-35-red.png 644 233 144 4327 14774263775 15623 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜŒIDATXí—mLTWÇŸû2Š‚‚-(Ãe×U!XXA à€v§Æ1[@£Ý4ŠÚ¡i%e·•@H‹YßZZW7ˆ3J,º­ÀëšE¢ª†"›X©À È0Ì}ùïæÜyÉ®f³{¾Ì<÷yûÍyþ÷ š^s(`ñé3m3m3mÜsM3šf4変²(‹rç×´‚VÐ `Ú­V“H"‰ÌmµšÅ³|VÕìǧòøóí¥½´—·ú£+6‰Mb“u˜ÛÇíãöi ‘ŽHG¤—sæ>Ì}l~¼ùñæÇ@ž1ϘgôÙÌÏâY>«Çê³~/æ!~m ½è0?Æñcý+ØÅÅÅÉï×uÔuÔu¨zç3ç3ç3˜À8Æ1 ýè4Ûëgñ,ŸÕcõû-:üb>2ÌæùA~°ÿ +`l3¶Û¤U}ž>wŸ}ð.5Q WÃ!ÉåÒé 'Ë r ›åwäw9Yê’º¹\Ú%íÔDÕ  ±ü>OŸ¹ÏŒ>c›±ÆX#­Ò€ù~€õ7ÌÖÐ8+gå¬Db¥X)VÖßa ¦jS™©L2k`ÈrœR½§ÝÓ¨ý^ÇÞÄ› lU¶PXdȦ BõÅKõ8€€ú®ã:œ,ØTm:f:&™YÆÃøH7 Ð üþw,ÀPa8h8¨ÆÛ±;íNŒzë8åÏ”R¥ä³òYNG¶#&Ë&Ëðo–g—g8Œ#çó…ÏÀó¹ÏçògŽNG§ì´ÿÒoê7aÔPa(1”¨ñŒGã÷ˆ{Ä=·*™ãháÑ£…ê»Þ’•Õ²‡ÚC¸_[÷Ú:`úµ€Ùų‹à+ëWVÐ&µIõ„nf‡¸B\€dí½Ü{YKš8Zxøâá‹ê»ÚÎð‘:™™™€êáœáeÃË—p âØoÞ½! w w “ïä`÷œÝs@w_w”%N‡ž€W׿º®µ^k€–Ä–DÎo¾I76¦JÃ9ÏŸ5Œ‡ññ^Ò“éEéEéEt ²5²'²‡\Š]™¡Ì ‘:½áq]q]DDŸòù'DD)JŠBD´¡bC‘Ò«ô}õ]QDLD Ñ×Ñ~HODáæÌQgØxØ8‘bWLЉÄÈÖ¨ü¨|r1ÆçýÄ…¼Î¼Î<Ÿfdyœ-gôÐût<<Öü¼ægÿÑn*ÙTâ·iǦþþ¬ö¬vзëÛ`qÒâ$c##€üÇËy)y)y)Ú¹}¾ ­6­6­½“Ü$7ÉhD#¡b‡úX} øÞO×i×i8õã© ¸¼¸ôUú*èYÓ³îݼw:Nvœôgè+î+öÓjç© §.jÒôᢌsssÑËøˆ7ófÞìyÊ®º¿ì=ñå‰/}â–CœGœG {möZîo}ûÈ¿±£ÃÑ\×Ç2eÀ¥ï/}ö»ö»~áÒXüX<pù\> Ÿ;”|(Ù×ïzMËh˨¶“à’¸$.Éó”„•ÂJaeY{Ëâê uò"{¾½Ø^ì;>Ô¬¥?-ý ’%? ^yýÊë`9o9b”]ƒ]ƒ°Ê±ÊËÚ–µ@KxK8€‰Rk©À¡©¡©ÐYÙY ÷„·QBÙR,…¢]B´-D1JaÙaÙaÙDâ ñ†x£aP;ðó²vdí÷3RÅrßqß7l r‚ `‚io^̼¨®ößé9r õHêNoüèb×b |qÞtÞäuÑí· ßV&4ÀÂNaç½-Óö¬¡ +4öˆ.I—¤Kê?Á,å½E¯fi“›ëyÅó TÀÑíèàôœöœöT«Õj@3š¸ÕÔÀ¹Ù¹ ]¹®\ߨόÙ}f7ÞЮÐ*¾Š¯šÌáæsó¹ùËê‚…hWê6n·mÝq®;ÃaZQvÛZ­SÖ)Ø4íîWÒ”4@:¸•cÊ1^U¯ê@§ÎÔ,µQmôIi°a0v0ˆ 1Ü6Ü–öh;ù©ð±ð±Å¤¡™ÉLfÑàcÍ  Ê?%+YÉJ$ O…§ïÿM»Zj µR„ýCûNûNí*ï)ïùÂ&:2¨[”µÊZ¸YØÖ¿omÛÚ&ï×n qqL³Œ)‰)‰)!âM¼‰7qç¼t… 3Ôû¹Eèz…^®9¾4¾4¾”HW¤+ÒÙjÚÍ0e˜2üµ«X ܰÁ€Œ`Äï@\"/‘—ø´X›Z›Z›ªfiwy„.B18éýk)$pÒÜÕ Ñd¶Ú†iíÚÏùi·ÜRî§Ý)BŠð)O”'ÊŸ»ÑnÀ6«{V÷¬n5WÓdƇ½õ§ ) â›I/~ Ôi7—kà¸íÚZm­>íJ­R«Ôªº]1®W °Ü±Ü±Ü!ÿFÓâYá¬pöÏ«™Ô¼Ò  §—,_+àÓî0ä§ÝC¡Fа7Øì Üpà #µ4[š-;cG<.w{ÿ%™u3¨¯÷9é_¼XÂ[^í^üOÚÍܘ¹1s£O»¶Õ¶Õ¶Õøë´_Õ&Áp\Áº²À6üHP_ŽþËõ2í¦ UB•PÕŸÌ€ * * *ÔC‰S‰S‰SÒ]mÔCÂ0d‰¥zª§zò;‚=¨ßLúW°vÚ™¸íÜvn;@ëi=­W–ò øü€#Ž8ºÖ777A$Ün ·¸oâ– ÉýßV„ö-›²)[¼èþ°Wy•Wî*w•»úÏ_M?ÿµ-h2}Au_:êù „'®(@=IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-29-red.png 644 233 144 4330 14774263775 15620 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXí—PUeÇŸsν .…b›—u7w‘Á¨0EébMÄLLc‘ÑÓŽ¹¬?ûåJLpK' ³]G$ä"5´9¥nlf¤;¶35’SÂ%ÅÉä‡pu‰ ÷œóÙ?¸çÜ{™ÝœÝçîó¾ïó<Ÿû¾ßç}/"ã6E"L]í‰öD{”b£š£š£š—.pèÝ¡ù'™/óe>ŒO›ÛÄ!qX>Dúæ6k½oå³òGÖSEò„ó­‘5²FmˆœŸ>×Ñìhv47 (k•µÊZ$.~(~(~ˆó¿Íÿ6ÿ[xøÂþ˲–e-Ë ùÖ¼µÞŠ·òYù­z?Ï#êÂHÖëêUõªzµ{¾µCIÅIÅIÅúÓ{[÷¶îm5'ûú}ý¾~@CCc˜k\ãÐM7Ý`ûÁyk½oå³òGÖ›õúÏó‰ëµGíQ{ºX ²NdÈ:¸«k¬Ëßå§‹ ™©æ4s}S`_`èéz’žz®ž§çž®géY oÒgé³ÀL5cÌV¼•ÏÊoGÔwÝ`£) JƒÒ âØêØêØZ×n¸·¹×»×rm°gôV½_ n¬d¬ÌîàÄ(-´‹ŒE€Á0Ãf¦™ ŒµFmh} N¯ÓëÀ|ƈ7âñYùÝÛÜݹV}‹Çâçyçyçùûï°¸¶¸Ê]åæoŸwÐ;È`0OEoÓÛÇÇß`ß`ÀHÔHafzLßð €~‡~પÛ3¶ôWŒ‹ÆE;Èçíó^ƒA×W™«ÌœcñØ|ŽUŽUŽU§·ZÕEÕEÕEæÊ`‚á@ƒ•«§½§ðg¾“ù€zZ= µ+j@¹Yn†w&t&Ü.· Œ·!àŸ¶qÚF€æ¯š¿‚PþñzÕEÕV?j®´w6‚OÌÞøyñóâç±m`éÀÝwM6’­ï\\Y\ p9á2@ëÛ­oT>[ùlúø@î@îÀ-çn9ðÙ#Ÿ=ðT×S]€oò†É€ä‹/\|Á ,í{·ï]°x,> ô¾ú૾úfz—>EŸôZC Ï.< °±zcuø& Ý8t#€ã Ç/g¼œpsÿÍýoV½Y±~dh@IURÞZw­ô®ð5 [<Ÿl©¹ÎgŽ3Çî±hY!nq‹È/­¡w}¸KDdó¥Í—DDF¿ýND¤²½²]DÄ9ß9_D$ÿHþ‘™ïÏ|_Dä@Íßç¾ÏEDÌ=0WD„3œ‘Iþ“þ“"RqýD;ÎF»å­ûÕ,\Pµ jA#ʈŒÐDu˜üÎh7Ú!ԟǧŸ P–P••Ðݾ)gÏ4$×'×L‰š¸3q'àJåË=y{òÀLïD+:kjÖÔ¬©tZ|¢æª¹jîØåàÀ¶}kö­Ù·&L“¬žžaxþ¡ç];º–c'òOä´ýØö#ÀHÎHø:ûëì¦õCïÍ~ov¨ÞÇÛ?Êø(Ã~¯¤)iJÚØeÑîÔîÔî\_auYòL×~×~}–÷ï ïŠÐõafßu[@úÌô™€yôòÑËͩͩo]xëÀÀ¹sËû—÷ÌH˜‘prïɽÀpîþÜýÀ)+SVŒºF]ø‡ñ¯ö¯†yëSv¤ì0ì@›®Mצï”؜؜ØÇ'ŽOŸÔ÷Øþ²ûZïkÕK`¨`¨ŒÒIJÄ2üx¢{¢{€a9(´SÚ©ð®ß?yÿd€@A `aÎÂÀœL9’rŒ=m»Ûv‡ŽºøOì|b§1l®ÐVh+¾.÷cz%Ò’v;Óœiδî?[¥›Ö]wÖ̶ï©?Ìþa6& ž<øO ž¸²áÊ€ÑFC× øŒ|é¾tЋüßû¿õÁ«·ÜÎöZ¡V¨#K•Ê eÆo÷NÔÚìþz\)QJî©Qê•2¥ÌÒŠñOKÓkM¯á±µ[b¸ w8PðGˆe¦YaV˜7™7™m6™M!)õÔ÷TöTBò¤d-Y ¬²wr³ö’öR©ÛFË•\Éu¸B¬‹e±,vl–i­WëÖºŸ~ß~Zk\q®¸@œ÷¹®Ú®Úpíê}z€yÔ< ˜¼È‹0þÞîâ.0 Œ #¿øØç}ñØz‰ý]s\s\ó”'¬NX°ZDu«nÕ­ ÒY˜¿þ-Ð:µN­S9îpøSzäݳ=ø9lÌݘ›t Ôoê7Ý¥»H¦†¿agùðáó©ñ¿ã6ß›“æ$Æ‘º’º’ºǟݚݚÝ*R¨ TDzý½þ^¿ÈÁí·Ü.2T:T:TêäsZ5«fûޱÕáOëIϲ°£iGSæ,kÌr:ºA3ŽëH¹Ë]îa„ÝÁðo+NÜ•õ¾^âð§ô¼¿Ù}&¦«uu¦ï ÏëNÝ &`Æ}4=¦Çô€jQ-ªÔõD=Õ¢ö«ý`ú̈ÐAä-±ÿîcÿ§óßT7ôV½•dÐ'–þŸZ $€Q^óˆ¦'Ãh:?¡·è-$AÝR·Üøïíü™Y©ÙF3Íä;G 6«ÍÄÁ\7×ðàǶã™#K×Ûxœ•í×ÅGû=öq~Áþ Cÿý„kå{IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-200.png 644 233 144 3143 14774263775 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍVmLTW~fÀùБñ\Í”µb¨k6PÅÆ* D ¥Í¤v+’·N“F‰Á¦Da¤u›µýÑ­‘–ÆÊÎ"mšJ&’4"·)ÑH•aŠk¶© î€2ârçÞ{ÎÓ3wî´Mÿ{þܼï{Îó~‰t¶;Ûg4òÕŽW;HòlËÙ¾NÞ¸3@’SÅSŤiqc¿qÞÀKÅÇ[¿àÈ9Á9AË¿I»ÍnÈå[–oÉÙßÎ!Ë·—o'ÉÒ~H“V’$õ»$]tÉb’QFi¬ÿ¥ØF<±ß8oàøŸÁ×2³(³ +^¬xÑyŠ*Üø'yÐsÐCòï$©¶Ë~V³š.Ök‡µÃ$©ÖSáGò%ù)¯Š«â*É/e¬!IýMýM*üXûDû„”C|…¯ÐÅö8^_3øü =毜€÷ž!½YÞ,’KIRí—§Ä)’dû¨Êȳò,¥,‘%²„”+åJ¹2™1Ê\™+sIù¼.¯“r®Ì‘9”$ëXGU¦éƒú É=q|Ò»À»€äÿ ~¤Û> Qg4šÎ ¡·Co'y¶©Vê•z>¼»ê«Hu«ºUÝj QÂJX “OÄñbF̈3KW¨Œü>²9²™”yÚ íøüo( “”Î;Î;ÑtCOBXS/Ý{ßßû¾'ÖDó¦–O-'w|¾£G?¥;ÃmwÛÉššÂrêÈÔ‘©#¤Oø„O‹Ãâ°•Ê@eÀ¶'°'°'@:Ÿr®s®#+/VŽTŽP’ò5ùɯã|üȷķĨ½¦^kðôÀÐcÒÊÓÊùGüÕ¶Þ¶@ ò»ÀÒï—~œÈ?ñä‰':µN­SÓ#§GNÛr·ånË&Mš<„äRç©óÔy€£ÖQ먴­AkH‰gªYjàØé¬wÖ'Ý,´õÚzC¢ÓòX<[=[  ÙõĹȹplöØì±Y ª¸ª¸ªŽ G†#€{‘{‘{0n·Û³¿Ùß Œ-[<¶ð?ð?ð?†çÏž 4º].`¢¢o¢(ú h_Ѿ¤°Lëe}‰¾0ô$ŠÿÛZQÓúrëËɦ¯>ßܵ¹k3•ÒÊÒçKŸ'Ë”2¥L!óæÍ?JöÌï™ß3Ÿ Úƒö Ü¸zãê«ÉÎÝ»;w›Åßv¼íxÛqrÓ½M÷6Ý#»tMtM˜MÍŒ8ÇÚ†Ú†Œâÿ¶ÖìJú| fW’ZT3'º¤ÂiN›„,b‹H`Jò"/ò")÷Ëýr?ÉAr0%ÞÌó–h'ùß¡ËüÅú.}R^Jd×B iÚF>ô1Àås—ÏñG˜ùjæ+€ù=ó{Àóu^×ë~WŒ/Çþ_J“¥IßCAxºáé†gþT(øç3mŠ6üø! ü`ÿTP¡ö‹,¢-Säë¼[¯û5žÆ×|š¿ G úÅêEà•ÖWZÃ+4LƱzŸì}Ró™ ~Ç[¼E·®Y×ì»ÔuØ©v©]À9õ†zÀ>jÅ`À:e5Îë¼N—\<\|Ëå[á/èñ¥#"òÞKÐ"-²"(¥bÖÛÖÛ Òö]û.¦›PúŸQ1S1PjBMàY) ÖªçÕó(`€L°çì9 ©€-U-U@NóKñ°=÷„çÂs‹%^J/·hõµúšåÜÂòcËùoóžyU–[È-äÀÆöØöÃÛ{gwäàÈÁ‘ƒq]´.ZõòãããÏÄ3ñ l‹l‹l‹xõ›nžÞ< þŠ÷pìæï´¿H ˆR+¥#¥#"òÉÊ)ùT> Ìf³"%=%=%="¾õ¾õ¾õ²b!_Èò‰SÁT0%²4º4º4*²»zwõîj‘öíÚˆ$»’]É.ÿÿ”J¤¼­üÝòwW`²R Žˆh=~ççß]ÁŠZQ1ED¤Ú·Iò’÷äûò}ù>ë¾uߺ/«ÌH #!ÜÜÜ'2˜ LD’ç“ç“çEöVí­Ú[%²î?ë²ë²";»³tgéJ{µÿ'»Þ®ñôèchahHž9¿·Zõ @¬+Öë‚[ko­½µvõ©ŒÕÆjcµp³ùfóÍf/Þ¢ÿDÿ ˆôDz"=0¼¸i¸©hþêòÍ }7ôÝÿ̘{*é|§ó¢S‚µhy]†'óÌÁÁ)òS¤HSL1U?Ëg|†b‹UcÕñ}}«Nås@x&<³X‚J›i\’Fpz^–ç¤sÔ¼šU³¿ «ÝiwÚAÊPE?À¾kÛã`o¶_³_§×œ0'Šö˜•6Ò ÂÓáéU{L/Ú÷^‚–²–2 k¦ÀNÙ) çìwöcº»_ÁÊ÷‚åÈ‘Lòä°°ÜJPN›Ó† ö—ö—ÅøšoÕæÿ•w%½{Wöš™Žsœ ïÛmv¨ê>|àù:¿2n¿ÆÓø¿ú®|doì}ìѼÁþ+O …Ô2 IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-21.png 644 233 144 2473 14774263775 14703 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜðIDATHÇÍ–_HTyÇÏŒ¹:d–Eµ4,´RÙô°”¸®`”¦1ešbô°,FA&!Õî²°ˆ¨`ÿص‡(G³|(ÁþèÁ²[a&&MIÚèŠWQçþîï³3wî´±ûÔïårÎùï÷{Ϲ¿s""²$úp¯t¯t§Flw…ãOÎMÎý¼5b7*píví~Z ‹ëפO;o=sl;nïÏqðãùl¿,Ç‘t%éŠ++jׂ/בœ±¼ ž6OÛ´ Û¶\»xí"ßÁHßHÀDÖD8¶·÷Ûù6^<¾Ôþ‹_o$Þp½€¤Ï’>U9«rÖ|ÙX»vìÚL&h7¨1 …L1…½ÞÆÙv<ºßηñl|›ÏæèXº}év(ØW°Ïs.’ðìW8²âÈ À·4’BƒyÚ< úwsµ¹š9Nê¬(}*©ú±~ |m6›ÍÌñ›Ùh6ÐD)(/Šã³ù#zäÝÞþô ìIÞ“ Ì„{AM«i`¥ªQ5„õWºL—¡í铺F×€ÖÃzôuÝ¡;@ÿ¥éG±Jj Ëgùƒº¯îÛîpoŒ/Æ/ñ‚¾ø<#ž‘©0¨U 0nk¹µœ™Tq¸0\cëÆÖ­ƒpm¸6\Ë{kzrzrzÂCáð@\àO+Ãʈáå9|6D;"¯r£HYcYã"SÄ›àMÐÅmΘ3rS²Ý¯Ý¯Åcd^Ã+RXP¸·p¯ÈÚÍk7¯Ý,’’’"ZZZ&b´­F«HNENEN…ÈíŸo7ÜnØÒßÊY e(CnÆøbü=Qa[:D¶Um«²Ó]™VÖZ˼íðú‹ýÅ"ÃÃÃ"“&/L^ÁÀÀinhnhnÙ?°`ÿ€Èƒ«®>¸*’L &aÜ£…q‰¸ü.¿ïÊ|—K‡@jOj¾#›F6Å•üK˰ Ç|sàÍ7 ‚¸uüÖñ[ÇÁ»Ð»Ð»zŠzŠzŠœý™Õ™Õ™ÕàO÷§ûÓ¿z¥‚* ût_|ómþˆ´Ei‹¬~xûêí«¸cß©Ïés@>ùä;éÇ<Ç<ÇÜéø­V¿Õ .©K6¾.wø#z¢ÂïÁ¡‡NÄÒ7€9e:]sŽÌÿµâóõ»øÖ‡?¢çÃs̰çŒUoÕ3£ïéq=êuJõ\=WÏAQgÔÐݺ[wÇUÆgù,è¿õ¨“7cYEŸcžü@tò÷ª^`Þ*µJ 3}ã FÆ æ™g>N€Á@Ø®Un•ÿ§Éÿ‘e  ¨£Ž§ªD•0ú®¾ € 8¶µ,šoã}ô_ùÉÞ.>Ùûاyƒý½= (¬uIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-126.png 644 233 144 3034 14774263775 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÑIDATHÇÍ–oLTgÆÏ€­Ì2JÙHâZXL%[b#! IÈP¤º(ª4FÓélº»‰²%clbRܲÙÖ4†â²Yl P5Ô•TNj“]+ ûa] XèÌàÈpÿ¼¿ý0s¹“íö»÷ËÍóž÷<Ï“sÏ{î+ ""ÏÄÞ   ›£8ᨽžôrÒË;þÅ8j5ÿl”³)gR?Jýȼkc+níϱùãõ¬uyFì…—7^v”Æð)Ø¿kÿ®¤´(þã-pzÞG:Ô÷Õ÷|rñ“‹ü澜û`¹t¹llÅ­ýV¾ÅÏ/§þG_žºöÔ5Ç¿aãÓŸÌŠÌŠç~Ýð¯ç ú•êW¾Mü6Q%€±¸p©R Dëy‡­xl¿•oñYü–ž¥õ#°å¥-/‰À¾º}uÎÎhÂÝ¿¢7>Ûø¬¥§y)æ-ÞÂÅE½_ï0šŒ&"| jU-¨sÄZ”[¹ŒwŒwˆÐ­wëÝ |¼Á¸8ã#ƯÅôÖõ£~ìOiŠˆ¼_µR+ë†|êz“ÞêÆ×Æ×h±€"•DAå«|•¿^1T—êR] ªUµªsÉ\3×P@/½hê°9aNÎ(?Ô¦Õ¦K_â›-ûpÎ;çCÀ¿â_ƨ5®Æ ? „7…7vAëÐ:l#ÚNm§¶³³³@óhÍ÷k~Í‹Ç/mWd_dáX¸ŠÏýïúßp†œ¡ÐËOÌXÇ0<õžz‹ÎÌUn-WË…å¶å—?Fý¹¨µ¨®_º~éú%[¸r°r°rR¶¥lKÙÅ7Šo߀`o°7Ø G‚G‚G‚üBrVr¸›ÜgÝgQK] .|§wÿÍ×ß|Ý꽎á„hÝ^üTÊK>+ù,VFqüò±wõðêaY«Z¨òUùÄ1zlôíÑ·EÒ.¤]H» Ò×Û×Û×+277'˜ ÌfE\u®:WÈܹrEnß¿=.âûoÞ7/’ýÓì¥ì%qLn™‘5Ky÷A÷AKÿÅO6nT—Y™{~îyàn¬W~gæ™y`üÌØjl…üÒüÒüR¸Zsµæj DDDÀ½¡{C÷† ¢¢ ÷î-Ü õeõeõez.õ\ê9ÈÎΆ=¿ÙãÙãЉ`y°Ü®<fwÏîË@ê¦ÔMæ7ðpæá p9zì•2Ì;¯(§(§(¼=Þo½Þn7„!g4g4g¦ÎOŸ:ÝéÝéÝé¿¿ÏSRTRTk»ÒvÅ3Ưç ç Áò“ b^1¯8¾ôj½ZD4Ùâø¹¬Y…yÜò¸åq‹ˆkÀ5àñõõiKnKnK94shæÐŒÈäÐäÐäHbvbvb¶H 9ÐhéÜÞ¹½s»ÈÌôŒÆ/’™žÉŒ¬Óo‘¿è= bûADä«è ô€:¯ôïõWf a aî”Ý)»SÃ2,ÃÅÅÅPª U† çLΙœ3p3r3r3ÞïŠw  ë']ÒGDèŒéùz®õ\³šÿ«ûTâ9á9aŸÐCº=ѱmþŸg•UVãðv°h§ö¸õ» ¢8¡ÓÅéžfO³}*ãçØœs.´å×ü`ZsÌl4 ›ûÍSæ)àd’ jM­©50N'“`L“Æ$­F«Ñ jL©10ËM·éãñžñ˜»µv­0·ø§]Ó.@wÞwÞÿÁ³íûåP›T›dO~0|†X1_5_EÈUP#LXâ;¾–Yf9¯ñˆGq_5_3_Cã ã‹x~Kï“ÿGþ•4¦7¦¯xÓœÆebã q¨[êÖzÏ`c+¾Þ±|‹ÏâÿÑå{»xbïcOæ ö¿D#¢f8ËIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-29.5.png 644 233 144 3234 14774263776 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜQIDATHÇÍ–ïOTWÇŸhÇÁ€f»TbmÓ-FúB6F]m„Êݪ Ý„T·ZÝ7պ麾 Ù.Š4 f…Ð*JL` –å‡;b²±Ýu@‡8°©Ú)ƒÂ€®óãÞóÙ3×™l÷ð¼¹÷ùõý>÷œ{¾çˆˆˆ-ú0¿l~Ù¼(b›ó/ذ`ÊöˆÝ¤é]Ó»ÿú¤žH=ÖšÖªÆl#näÇ׋Äðãù ¿Ø$æ°\°\0Fíjغjëªûè X»¬]ÃðáÅ/t¶u¶ñxðõƒ¯>*„˜mÄ|£ÞÀ‹Ç—êÿá¾zá+ÓX^´¼(Yog½ýʾHÂø+°iã¦ß%|— Ì MÉ$«B`Ž9Œá‹³x4ߨ7ð |ƒÏàô#^^ ŸËfÊf¬-‘‚Ñ3œ:Ðv  Ô5€P‡i¢‰dÐLš ¨Ï„g¨›zƒÞtª.Õ ¾Qßh•Z%…… ÑL3ÉÊÁS¡éÒÁ(åÎr§µ2g,Ž­iôyì-^oÝ{ë@e„œÀcƒêÖõFBú}}HB©2U©*ŸÍ*A%¨`›ØóãÇE˜“œ$d’iCNØòñ–<öVÜRŠˆü¬~ëÖ/æaüµñ× ´€w¦²¿ÿüûÏyZú(ôQŒ/x:x:x|¾ßènÝ­»ùÑPaõX=‘¿Æ_Þþûõ÷ëy2µk~ùürÞÑRïì¹³`á’…KæUW¤Qù""MC°·vo-øÿ ç–þµøËâ/aÑÁEõ‹êQ£7 n‚§ÃÓáé€Ò¥¥KK—‚µÚZm­†ÊC•‡*º­n«Û±Æf‹f‹f‹ ënÖhÖ(dÉ>•} •“ŸýFöpkï=÷=·ž û/î¿Zy¤ ÿTDä ?¥?ÚŽt—v—ª¯§¯èYÑCÀ pìsìs샕—V^Zy UŽ*GU¬ûŒ}Æ>çÍçÍçÍ1¿§ÉÓäi‚åË—7BMSM]MÜÝ3ºÇÀW;øÕ9Ç9à‹ôcN4§ÜM¹›—/’WžW.R|}­i­ÉÔreøÚôµi±ôý¾ïÓ¾OE¼éÞtoºHÉú’õ%ëE&O.ž\,rÆsÆsÆ#2™:™:™*â«óÕùêäÙp_p_p_I´%Úm"}[ûªúªD68&bñØî½tï%S‹œÙ0»aV„UÉ·“oçå ¶Ë¶Ëº‹_úò}ù±mÿ;ë'óŸÌCž+Ï•ç‚ë×'®O€:¬«ÃpÄÄÄÛÆ¶mƒ4gš3Í -Þo‹76c®W‡«†\C®!WÌÿ‹Œu¬Žj´4Zð£ŒB8˜bI±è.³þmø³ðg&—t.|°ðH÷·}ã}ã’þ§§GSަˆl?±½a{ƒÈTòTòT²H‹³ÅÙ⹺æêš«kD ‚€È’´%iKÒDì#öûˆH{{{{{»ÈÈ®‘]#»DvöîìÝÙ+ÒšÓºªu•ˆ×þCÒI"9?ÉéÉé‘t‘ùWç_1g¨a5lr‰ö[ãë®ê®‚×ðÙá³jÇ†Š¢@Q€@É­’%7ÀžiÏ´g•é+ÓW¦¡9¿9¿9ìÍöf{3 ‚ÿ–ÿ–ÿ”%•%•%W÷ê^ŽW¯8^«ÿ½zlõœÍjlŒûÇ*Ο+.Gú‰ÊEÓì.Þ]lL´ž Z¯Ö è<ä!êÙ8qâ&™d2NZi¥È%—Ü8ÿ#Œ:A‚1áj8 ¾Ýu»ë€'Ñ]IgTǰº­î¹Dõw÷›î7AûcDÇ4Wp68Ë­Q»¡ÝõuR=CÏÐ3@[¦-Ó–^«×êµ@=ô€nÓmº XËjVƒö7Í«yAÛì vñDÿyŸº³ÝÙÖqëø\"SQû‘ò7›6›€é¨2ÏhýZ?ðPwèB„¢_Lô=ÀSžÆ+*0‹_4Jÿ@ÿ€OµËÚåxåßlÙlù¿Ê=+)¯,¯Œ;+9˜y0vtt5Ô á¹ð€ö¾ö>Pƒj&ˆÙFÜÈ7ê <ÿÙYåôó<ß.žÛûØóyƒý/¯©t™ÍIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-65-red.png 644 233 144 4244 14774263775 15624 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜYIDATXí—{lTe‡¿s)ÐZé‚..)ÝeÑ–"®­l)SH¶j,I‘@%­l1RÀÁTvƒ ì6Ä]pÓÖl´7P©¥7¬ÙBVm·3M-‰Ú™ÒqÚsyöÎ9s‰J6»ï?÷ûÞË3ßû;ç› 1a¿q&?4Ù3Ù3Ù#ÝŠ,¤NjžÔ<©ye¾ª«ºªwÿE,‹Åb˜Ø6÷ U¨Bµ|ˆ÷Í}V¼•oÕ³êÇ÷“Šç‰åÛ&¶‰m²;~ÖoÔfµYmvß¶KÛ¥í6HÚtÿtÿt?ï•]-»ZvÖ|³æ›5ß@yayayaÔ·ö­x+ߪgÕ·úý<—Åû™‡ä ”ƒ}‹­J¯J¯J¯ÒŸ;vþØùcçÍ”ÀõÀõÀu@AAa”Fúè£l?²oÅ[ùV=«~|¿ÌC?Ï'wÊò€<Ð÷¾U ð\á¹ÂsÚÞqoØÆKÄÌó.ó.4}·v\;ú=]O½Tߨo}‰vY» úní)í)0sL‡é@³ò½ãÞRo)ÞÂs… hØÀr¿ÜoõwÜi£InÉ-¹…P÷ª{Õ½õ—¬ç>çç­Ô{Þ8oœ' Õ‡[í`öñ_c\æ2€±ÅØx£_ÃÀ³oÂÕêÙÅ.0Ÿç,g XaÎ}Îׯk¥V‹ÇâIýIýIý¿û­à¨qÔ8jÌ,ßoÈ7Äp¤N@MÛ¡íà;¾Á÷ƒï„òCùüˆ»Æ]þ¥þ¥@àÖ¼[ónM»5 ô×üÝþn;8àêsö9vÔ8ªÕf–Åcó©[Õ­êÖ‹{­#•G6Ù`nŽÕÜÚUí*€1` á-«·¬†‰Ç @=«ž¨[X·0´e^˼Ø8¥_é–?%4%š»÷½Þ÷ì¤Ñ#•‡Zµš›í“ãæàôìéÙÓ³Ùwcå•7V0‡9hdXßy¿¾_müAê©u‡ëÇ®ûVùVœ:90sÑÌEu~Ô Ð‘Ó‘ÞÍ~7ÈIIµAµ+¯7]o‹Çâ³@_}lÿcûÛýfºW›¡Í­¥¥-K[6—l.+aàÚ§×>h+n+Ù>²àéê§«d.È8Òv¤  !¿! TªÖ×½ú }E´¿ÅcñE@i)ï.ï.jF& ‡ƒ3‚3‚3/̼0uÝÔu±'ù̲g–ÅŽþÑñGÇc÷‹»Š»RºRºæçÎÏ‚7+nV€þ‡8ëå÷•ßW~ŸýÞn±N´"¿.¿.¿ŽÞ¤Ñ¡Ñ! iâaç÷MM@ ¹ ¹ »=»àÚ…kN·n‹:Íi®,º² «¡«!–Áû¤÷É­v¿Ùòf ˜¹‘~+œV8­p½ŸKåR¹tü{ëª;¾íxÊñ” L±>Þ»ôÞ¥@x[ß¶¾ØÆþ €Ú 6¼ê~Õ pê© ¾/}_Æ„kÁ¬`€ô¸ô8èo\rpI´ßÙÃÃöI>-åJ¹Rîø÷B¹_¹_¹ÿÅZë)˘—1/cžžé{üëæ¯›í³ø¥_ú`’{’0›lz`Wë®Vy¹¼àÒ‰K' æÌ¸ûû?è˜Ú1ÝéÞé¾#ïŽ<€î½Ý{ Fe¿¸…ö ÌRf)³Þ©%©%©%B¨Ÿ¨Ÿ¨Ÿ4Ø/üòZñ'}‡Ej¸B§C§ ãY_¶¾ µF=óó™Ÿ4¬nX{ÒW¶\ÙW—W"ñÃóCóC`¼ñŽógtÔUŸUn¨Ü`ŒÚ€›”MʦÏ×NøÉÖSoYúá¤Ü¤Ü¤Ü¾¿Z ®Ý®LW¦YlOnš~P?ˆ ÀÆÚÇÚcM—éà§€°ù•ù@`M` è•¡²PYtÔoßzö­gyؾBkåZ¹ö‡•ÒiŽ4çîc €Ê?í+õ é é‰G¥F©Qj´´b<ëéô´xZðØÚÝ¡wé]‡„ƉX^3ÕL0g˜3À,6›Ì¦¨”ÒÒ!cŠã3ÇgÚVû$÷(/+/»œ6Z©(¥ª#ÊZ$ŠD‘ºG¸…[¸…P•Aeð¹6ûj=ê8ä8¤¥ù^ðÕújcµkTU±€hh€%:E¹ÖXf,#l…­ÿÇúsëÏé;ìhD ªAÏ+³«gWÏ®BvÊNÙ)½¡«´0ïˆü]«ô*½J¯Ôžµ3kgÖN!’ª’ª’ª<¯ØÚ-r9‹bµk¸ ax?f¦{úîÌ`U¶R¹ÿtÝî{ÏùÔ¹ß>ç\¢Óét:4˜ƒ“&Š»ÁÝànÐ*ÝwºïtßÑY¹}¹}¹}«‚©;u§î{Þg‹³ÅÙ‹Þ±UÚ*m•t7 QˆB’…@"€f˜¼ƒwðÝ­X£X£XC²¸»Ü]îî•B2@ÈÀ¿äxæxæxÖ´ê7è7è7^ÑGô}HÂ$‡tÁÉ¥a¦#‰H¦XÊ•r¥\é‚}Ì>f›¹8×kÈ5wÛ{í½öÞêËãaãaãa‹þ¥>¨>¨>㢸Eq‹âHV¸,\.ÏXK•ŽŽŽ+R-ÕRí× ˜ed»u»u»@=êQïõWÉUr•õÇíö ûļç}—û.÷].F&§'§'§sÅš͈f¾P@D©Nª“êÀ‘dYÀžð0„! .)NÒI:!âà¸A2H ®—+?V~L|ýzÝõºëuÜ%¹J®’«~?-®׈k¢×#ш¾=©šTMª&@œ%Îgí:?vzìôØéyø4àÓ€OÅÕÚ´/h_à.Q/êE½0ìHt$:ö{‹½Ž‘‰‘ZL‹i1@–“åd9w¸ÃÀdH@÷Ò½t/8|„ð 4‚FÀÿi9-§å¸KG½ŽzõWw¤v¤v¤Î3ªSÕ©êÔ]ç¹&®‰kzk#ŽŠ£âhÂbû)û)û© ÷HöHöH¦~ɥɥɥœK#Ãt˜ÓaLgKض°¿eËþ ú‹þ¢?@’HIP‚”<ÄaÆa€xoâ ˆ-b‹Ø«„UÂ*LwÙOÎMÎMÎåŠ]þ]<.>†Ò@¸ãE!Fˆb€Ø+±Wb¯ Nó­æ[Í·K·¤[Ò-L'Ï‘çÈs€aaað±ìcÙÇ2`göÎìÙÀåŠË—+¼‡÷ð@ci,†4¤#?ü<ò3¿.]þ:àꬫ³®Î‚kLלӜӜƒ<¶9¶9¶q.#ú‰~¢ßÓ©îܸ?ÀîÐØÐØÐXR€ä rÆ›ñf¼‹I“.&Ÿ¾øôŧ”_R~Iùˆ·Ä[â-@qIqIq Гٓٓ sä97‚Ói§ÓN§7oÞŠP„>úŽð>€<4&4&4†¸x\|œ­ßÖoëÇWÁ Á Á ÈR5¨T —t’NÒgÀ€ð›þ7ýoz`iÈÒ¥!À<÷yîóÜ™-3[f¶›7?nTF•Qe|äÿrçåÎË€¹ÍÜfn<”J%àXïXïXÿhãIÇ“Ž'Á©´*­J‹ñ¹ÏÌ}fî3ÈjîoîoîÇ;±;I SÊ”2¥SûŒžÑ3zÀÚmí¶vC‰C‰C‰ÀvH;¤Lf“Ùd¬û­û­ûˆæˆæˆfÀ?Ê?Ê? èíîíîíj3j3j3€$e’2I TzTzTz”£åøÁ~®¬@ -´P0o0o0oø_âKȰ³ÙÙìlZ6¼dxÉðt =BÐÖ LÉ)rŠœì‚]° €Ú[í­ö6oÚ¼ió&àMë›Ö7­ÀYùYùY9`Î4gš3*REªÐÐоøRàK€ýŒýŒý x ž‚磈’¯ÈWä+Pç”kkkFãËø2¾´ŒQîUîUîó»<»<»ôö¡·)_§|ò5ðJÍ+5¯Ôâ2q™¸ Xj\j\j¢ø(>ЇM, ÅBðFo£·Ñ[Š$b!&â Ž£rrxÁá‡}u}u}uE·ÆÞ{wìÝ7¼îܸïت­ÓÖiëØ|1D C`;¹ûäî“»¡¸ràÊ+UcÕXç}þ×çBm¡¶P7¸ÁíQ…M¢I4ûÝö»íwâ>Œû0îCÐðo¿ ÿäÄЉ¡CÒxãÝÆ»wžïâ»ø®–õ‚A0†ˆÏÈö›Ûon¿  hüÛ!YŸ¬OÖwA5Z=Z=Z=O»Ò´Ò´ÒDW$t$t$tÿÐHI#Aíeö2{÷{È=Ø06Œ ð"^ċͤ™4@ jPÒ@€qݸn\ðÑ|4ñk×® `]ÑhÑhÑ(~⼂WXã)KYÊ.Z‡ !¨í SÈ2…l“Çä1yw6KR§Ô¹ÑÎ×ð5| PŸTŸTŸD˜2L¦ ü@.‘Kä&äÙòly6À>Å>Å>ÐÚB[|ŽÏñ9@¢I4‰È²ƒìp÷q px„áGxðFÞÈyÑWNäDN2L†Éð6‰DÑöä#ùœ—³Ís„OöÜr$ÿ“ÎÄ2±Llfådº`>3È 2ƒLLÜ7¸opxRDŠH†i9-§å %¡$tª[\Ã5\ЃôÀæªDÆ c1ȱu@? Ðs‡> …Ïú€Ý»v8;YpÈqt¢âJW?ªF7ºÑ-¶b ¶` © þ1øÇàó×*S•©ÊÔôÜ`ù´òiåÓ[]q÷p6˜`‚ À&0@d]LÓÅ ÎuŠKƒ¥ÁBW4* 6_Í«y5Ûj?n?n?þþ'­9­9­9µP µÀÍéç˜ tÜù,•¦IÓ¤ip»Úsµçj`ßbßbßòþ'jwµ»ÚýF©Ù`6˜ l~ÕËU/W½LWt’NÒ¡Š¤"©*¨ è¢C‰HDLÜ·Ü·Ü·à‡ê…Õ «ÂMÝ«îU÷Òi‰´äýO&¥wÛê”â!gOp âJ˜Î+‰Â9u›jT£Ú±•D’H¹bíä•ãìI!MHÒ¤M¯I¯I¯ILTH^H^HÖHíR»Ôž b‚˜ ØÄ,1KÌ‚â ÿ/ü¿ðwôFôFôF°Ê…Ê…Ê…ùK'šÌKRT p‡œ'»Ùubz½^¯×cØQ8_LiȩݭNírj÷ÔÿhW0AL<2xdðxgârE¢f¢f¢fB¿]p»àvۡܦܦÜÖj´Ý±Ý±ÝÙv ãÙŽg;žœ€¾Î}¼ ÐÅ7ú`×Þià¢S»'ÿG»³fÌæOèNèNè[€ÀÍ4Ã4Ã4ßÖ7Õ7Õ7‘×ùv¾o$_ÉWòÝt{•{•{uâ¿p¿p¿p¦ßéïWEü#‹?111111S•S9•“ÿïß;¿w>¾qÌqÌq̹,*ü~ ¿—>»·òÞÊ{+gü8Ø6Ø6ØF÷_=võØÕcŽe£Â¨0*°[dQ²(YÔ?½èz„)1N^eØëèG?ú¥'\'à ”øG‚¿¢Ý\T¡ UŽZI+ieL'SÁT0çü¬‰ÖDk¢4_V +0m¬–Õ²ÚÚ:ÿ ÿ ÿŠU1–NK§¥“ü,Í”fJ3éQ§]ƒpüÏ8üÅøƒv鑃t¤#»B6 dÃyZE«hÕ¿STsUsUs™6¶›íf»ïÌ•öH{¤=i=íëÛ×·¯&áç´çj,'þŠã¿á)ì^ØÉ§IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-98.png 644 233 144 2505 14774263775 14715 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜúIDATHÇÍ–mH•gÇ/u¥’¤gjÕ "H4:«h$e.Œ^Ž ö†&ôNň¨/‹ÔGdrèC)F%x211r­Z%4t~X³b‰TNS+çñ¹ïû·çÜç95¿ö|y¸ÞþÿÿývÝ·€ˆˆ¤„ÿ±³cgÇN Ù±Û]BaBaÖ¥}FALILɯßArur5€§ÖS«»]ÛÆm~t½ˆ‹Ígý’"®#>ˆÉÛGaýÜõsÒCvå]HlJlzëÀŽæÍWê®Ô±úô=ÌÌ×¶q›oë-^4¾ý¿LjÔó â'ÇO9+æ¬øü›PÂoµo5Àó¸çq&Ô+ ‰$“Œ0‚ýú£lçÛz‹gñ-ŸåéH[–¶LŠ7oL¬ t_€ƒ³Î€ñ&à gH¢Ú9áœÓåä:¹ŒÑ`ö˜=d’ T›uf˜Ÿl'›1jœSÎ)üøIrñÂø>ËÒ#ÿ^Ûᅥ҄Ò``ü>¨Q5 xÔu€qó©Yb–`ì™/×xÁì6»Ín0+L)ˆÌ &Õä™< ¹ê¤:É8¨a5 ümñÃ|~‰”S‰}‰}#ŸÀSõTEpWñ£ž¡gðÎ:‚»ƒÝУÿFÿ Чõi}Ú<<</}/}/}àÌu²l7Î=©3#x«\>ËÒvæ'Øux×a[­¿0ãããîÀ‡;‡Û‡Ûa¥¬”•‰u‰u‰uP¾¡|Cù¬¬¬…µÞµÞµ^ȨɨɨâœâœâÝ>ºyt³‹GŽ3Ó™éò¹ü!=aa ~¨~(R·UåõŽõ2f=þÛþÛþÛ°¸lqÙâ2w–¶/m_Ú›››°@/Ð 4tMïšÞ5²üYþ,?´Ík›×6Ï­Óž`K°Åâ›­.HÀÔ;Sï˜ôyû¼n¡qÚœ6×nÞÒ¼¥y deeÁÅ‚‹ ­,­,­ Ž 86yyy0åᔇSÂü’ù%óKàUÒ«¤WIQ{ï’Þ«÷F-q„?¤'V$Îç#WdÒÕIWÅ~Å•Ç;±¥pZá´Âi"EEE"-/Z^´¼ñx<GäZϵžk="©×S¯§^y»ðí· ELŠI1)" é é é.ži1Íc—Ïåé‰Ñ-º%æ7§È)Š$¦™¯Lº‰êðuø:|"­­­"Ëë—×/¯IVÉ*Y‰”6–6–6ŠtŸë>×}N$  ˆHGG‡HÆšŒ5k\<ùVJ¥ÔåsùÃz>´Ç¸«¶©mŒg‚&èNxe 2P¯×ëõz¡µºµºµÚWí«ÚWµe-ÊZ”gõY}VG­Ø/Üç>ðƒ*Seÿ»ÇÞ*ÑÎkçuÔ)ºÏ-n=ôÐEÔH#`nš›æ& ÑD bˆ! À.DágØžðT¾§)ÛgôN½“wü>ÏÔõT®ÊU¹ è#úÐK/½ .«Ëê2¨Cê:ú3¡3€ñ@ï×ûyº&ìcïéüØÎ¬î©{z«ÞÊx¸çÆxÃ;úèÓ¶ÝxÈgë#xÿƒ‚»2Ðç8IàŒ8#v˜»æ.1Ä€k۸ͷõo»ò£}]|´ï±óû…´é!5@IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-158.png 644 233 144 3027 14774263775 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÌIDATHÇÍ–LTWÇÏL¡ÎPY­[hû‡2‰†MÑÔЬMéj‡¶–l‰ZË6®›RJ,ý£&š6ëE“%6¸t ËFR‘¨‰]µ1!cÒÎR~(…;0ïÝûÙ?æ=Þd›þïýçåÜsÎ÷{rÞ¹ß{DDäIë+àÎuçºW&l÷»Î¾çUÏ«¿ûGÂ>k‚k—k×H#džÎ< õEÖ*ìØ¶ßŽOÎqð“ùì}yRœí+Ú][-ûSxcÃ<¿IعÞoÇ‚¾:ðÀÅ–‹-„ñ¯Ç¿˜Ù:³ÛöÛñv¾—Œ/Ÿþ¿¤v§v»îÁŠÇW<.Ͼòì+ù‡ÿɇ¯ï|à‡Ç~xL»ÀœÒI×[(Qì5dÛ~+Þηñl|›ÏæOÔ#ýröË"PþVù[Þs‰„p+FÝÓuOÛ|ñ^ä}Þ'6#hÌ€`Q/ª«ê*èÿªq5z\µ©6`Ô|Î|ŽEþn´­ ÿM5Õ¤ó7  ß°ø–ùõ8¿R‰ˆß ÈrAºÞh0@™a3LÜrh¦¹Ë]ÀÀÀYdgý–µ¬«}Ú‡®r•¸ÎV5ªX—À‡@v ˆÚü’ì–³³³û öì–?ËŸýwúïôßÊó•ç+ÏÃêÕ«3WgBùºòÒòRôÏïFߌ¾éðñü{]ïuÙ³w6äNôí…NÙöRÏK=VÅåÿ¹#öNìY*›,(×õºë_ÿXÄóÀóÀó@d.m.m.MÄ]ï®w׋ìIÝ“º'U¤çDωž"³¡ÙÐlHdxÿðþáý"½Å½%½%"#ymä5q…n†> }$K6ŸÖ%µ%µ6ÿ +ƒ+ƒºùñuã뀰5DREª̵æSæSà÷ù}~ôé=Ò{†ÜCî!7äÌ?˜¶ôméÛÒëcëcëcp³êfÕÍ*ðü2‚ÁŒ øwùËýå0•>121ât^ÿ+r/rìz²2²2Ôw0™Ží‰c¯µšT“Nâ&ß&ß&\ \ \ Àdx2<†`( †œ¸Š¾Š¾Š>ð ú}ƒPÑYÑYÑéø ÷î-Ü §óšžhz‘ó;&v€][Du©.×w‚±ÓØ)"qÉv=#Kv£EDbݱîX·HJQJQJ‘Hødødø¤HõýêûÕ÷Ešo5ßj¾%)‰”DJDJ•*=$2Ö0Ö0Ö Òîjwµ»D¦§¿þVdÍï׬)X†Ï–c@Ä©‘¡àÂì…Y`@ïc‡ñ“ñ“#õiõiõipÃÃÃïtàØ©c§Ž‚âáâáâah­n­n­vüMyMyMyPì)ö{ Y5Ï7Ïè"]Ä"·,¾Þ /\´‡èçTRóIÍ'I§#j8Š®-¥rÖmnsP(TÒþ ƒ ‚6´¡ `Ž9æ’ü³^»qÎ8—ħkkS™¬cãÞñh z4>‹¬ Tªã¡úƒúL}¸-Â"`6™Mf˜µf­Y j»Ú®¶-´Ðæe³Ëì³ÁüÒüÔ3ñÆx#ù§?–9– Ľß{¿ÿ…ŽÙB{|<£ü`˜À‚ªT•Ä-íז惶:#FÌòéDòò=šEõ¶z›8˜ýf2¾Í÷ åÿ•»’ºœºœe€à(GIw~±YeV±úš¾€ 8¶í_ +߯³ñõ®|d_ì{ìÑ|Áþ?oôÙöCYIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-1.7.png 644 233 144 2523 14774263775 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–_HTyÇÏÕü¦#T[”;4؃dH`ˆlÒ?*ÈŠIY…u+"—}XV¶‡ÄÅc‘ˆ Äh‹R {)£r5ZLVØ’ÜÙ`bØÖ83÷ÞßgæþæN+Ñk¿—Ë9¿ßù~¿œsîùýDDÄã|Ò Ó ÓòvÚ×®?{öþ¢ë û¢ÆQãè?@~w~7@AOA=åÚz_ŸOqñSù´_<â:²ú²úŒ*Ç>5%5%ÙköO!§?§?b‰Áƒ·{o÷rBc¡1€ÙªÙ*pm½¯Ïëx—Š/çþÇ/CCÆß•™•)Þ½Þ½›¿Iøk3>tø@0=˜®ÒÀšrÉUUÀ"‹èN±õ¾s^Çk<¯ù4BÀš]kv‰À‘Ú#µ9WS× ySó&Àˆ÷—¸D.•f©Y üb‰%DAMªIòÉ®©“ê$¨—æ6sQµ_ˆ/€š¢™friÖxÍ›7qͧùzäýÚvîAù3ý™:ñQ°&­IP-æKó%qõ'«X…JæèÝ{ûÐR@;íÄ­lMÅ÷¯õ¯ÕìÜ“RJ‘âŸ!'”Z\ÓÖ´•<ÈSÛgûXÒŽÈ|ämä-Äñ@<°RAì@ì@ìÌ Î Î B¸;Üî„Ù7sž9,ÿ EBI¼ƒ<—?¡'-!ïÛí"õë/®6%äK÷¥«í"VÄŠÈ]ZŒ2£LræºæÚçÚEöõ컾ïºÈý®û]÷»dÅ®®®ñÝôÝôÝ©|[9_9/òÙƒuë:D®|ÑkõZ’ã¿k¿öUø*”˯õ$N|7æoÌ^õ0ÀÑÈ¿‘`$å-å-å-náïUß«¾WR+Ÿò),W,W,W@d82†‘ã#ÇGŽƒ·È[ä-‚à•`w°;Ußk>‡ßÑ#÷0ï¡êƒPY¨ xç„L©Ëê2¨&uFkƒµÁÚ;òväíȃ’’’”úcþ˜ìb»Ø.výõÏëŸ×?‡óMç›Î7¹~kÖ2‡R›Àáwô¬.Xm¿€ð›ð›”ß¾O]P@)¥”ÛêìlÝÙº³jjj\<ƃ®=˜L ètÑé¢Ó0×6×6×–¢ÃcÇí8°¬ÇŒæOèI±ïØwŒ"fµY-"‰b­S¦dJÄøÜ(4 ÝŠ=‹=‹=!ƒ 2\§ÕiuZ®}«ãVÇ­‘Ò-¥[J·ˆxZ=­žV»×î±{DäcÌ‘l‡Oó;zÒD««~ÿMäуGDÄ¡Q¼ÊT¦Äd»K±K¸{ýîõ»×‹xÞ€7 mŠ6E›Dž”?)R.²tuéêÒU‘ܱܱÜ1‘_ƒ¯ÁçÆëŒ<#ODÒU@$æôlc’_ëqî²8uöÔYg»ÌEÓO ˆýè¼;Ågœq Äk^§à)sÁ\HåÓü =žcÊ™3¶]g×¹sÌþÒ®±k€L2É^ñŠW`…­°&˜`ìq{ÜÕ jUmŠÐˆ}Ì>–2Ç’sóý9¶ròãÏög'[z¬_­_ìF»‘¸ó×*L–øD†æ™g^gxÇ,³àdY%ã“x_ó­˜ü¹+ý@mäº%¶ê¬:¢ «ÇàÚz?ÙN¼ÆÓø¼+?Ù×Å'ûû4_°ÿ„–þWvyþIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.3.png 644 233 144 2641 14774263776 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜVIDATHÇÍ–]hTGÇÏÆZ‰IüjP[]HD•*i£•k[Д&š*lA*%ÖÒ‡®ýÀ´4 ¡Û(ø Ñ-j[¢ º~@%*n"”Šh·Z›Ò°à.ÙÝnM²Þ{g~}ؽ[Ó¾{^î=gÎüÿÿ;g²ìS à™‚g J2~Á;n¼ð•ÂW¼'2þAƒùåóËç—CèRèlèl.=­|†/ËŸÕ#Pr¥äŠîHu¤:¯wõ1} Ô7* nØ7äò Á¾¶}mûÚÜxz0=˜týÔÅÔÅÔEX¹c厕;`ÖíY·g݆èÉhO´ÇÍÓÝæÍðgôÌœ1s†‚ØHl°3¿½wþpþpnÜ»qïÆ=ð6{›½ÍhK´%ò„»Yu³êf t t tAb]b]b,n\ܸ¸ÇÇÇÝ|çsÓf²üY="*¨‚ž!{ƒ½ADž‘9¼Ås<çî±±1‘eµËj—ÕŠ”í*ÛU¶Kd´u´u´U$°9°9°Y¤oQߢ¾E"¾½¾½¾½"¡é¡é¡é"ñæxs¼Y¤t ´¿´ßÅ•73|9~£gÒ³25W½Ökióe-í-í-í ÃÁ°ûÅ÷·ßß~;Ô×Ô×Ô×@tUtUtt;‚A¨©©îDw¢;‘·´Çœ:§Ž4—þw‰ˆ Á»Ÿ½û™™¥–²S€z¤o]ç:×"yD.p y¾±Û 2|Å)N¡Áñ8À1|†?£gr3}åoÓgÔ!uˆ1T¿©ß@¿­›tSápÔ<5OͲ…àt9]N8_8Ÿ:Ÿ‚Z ÖªµÀª\•3fú$v8NOîcÿÕù  ó:3Î5çð·jTXÙâjÀÆ$IÐ( yÈC`Âä«­j+8ýN>¾á›Ôù9+sg—ÿiÿÓ9€^`{(Εg‹³…4è«ú*<àúfÜä›ùÏàÿïYùØÞ.ÛûØãyƒý‰¿;ògGŒIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-26.5.png 644 233 144 3275 14774263776 15055 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜrIDATHÇÍ–ýOTgÇÏ ´ãè Ðbc-†´bJ™EKe݈/Ѭ Ò­ Ñ(©®Kêfã[î’ÆãúÚ]ÛjQ`)ÚþÐêK]´²*.… ±&]weB ‘†Aq¸sïóÙf®C¶ûøüòä¼}Ϲçä~Ï# "" ‘[À:Ý:Ý:9,[ÕOÈ;ã³°|LË›–7oýâ?Œÿ ±:±ÚhʦÝô/ÅŸÏÔK‚D¶/l_XGä]°:cuÆ„)aù@ØëíõB°é̦3u5u5üz¾éùÀ·Ø·¢²i7ýÍxo<¾ìúŸü"ðÔWO}e¹ ¶§mO‹@Êë)¯¿ô»°ƒ÷%(X^°à^̽e½pàP‹Ì30N6í3ÞÄ3ñÍ|fþp=I‹’‰ptÅЊ!{U8 ý$[k¶Ö€º  ÕóŽq è¢ P«[u+AÕbì5öRûÔ>uKÝЋô"‚øB¾”Æ'|‚C}ÆSÚÖ¤­I@S$…Í…Íö*˜òÌ”g¢3Ü—òò[9oå€rhÍ@ ¨¿ï•®ÒQÆÆ¨1ú¸S¨õj½ZLf2“£z|øð¡ñ¡É$›F­V•­*3;xpé¸QŠˆ¤ý…KöOíŸbÁ;Ó;´U¼Ñ?£wWï.j¥ÚíH4ŸvG»£Ýþ²þ²þ2Ð2´ -ƒŸRÔ^2¼gxô]úáƒ>àaÿoF^y‘7ôø;ïÜy`âsŸ Īúp=¢²EDŽ]‡Íû7ï‡áQ#ó—_æÕæÕBüóñ¯Å¿†šÿõüóóÏÃðéáÓçaÃð†á Ã0)}Rú¤tX°cÁŽ;`°r°r°2ZØÐ‰¡C' ¥3¥=¥œåÎ gÊ•í|Åù ügswGw‡‘ [Îl9za¸«Ñ-"2÷¬ÈŠÝ+v‹|¹÷|þù|Ëï&ï³ÞgeÌßãoó·‰ÅQì(q”ˆeeeŠÜl»Ùv³M¤¹«¹«¹K$-1-1-QÄsÜsÜs\ÀðD¬¬ÖF‘µÓÖ>Xû@,ûóéE§ÉXúÇ/Ì|a¦eŽ¬Ë®Ê®‰9®ÇkëŒëœ-2»pv¡H^Ë|Ë|‹¥ª±õêàÕA±5|Ûp£á†ÈPÎPÎPŽÈôÒé¥ÓKEº:»:»:E Μ-8+Ò3Ú3Ú3*2K›¥ÍÒ¢…y˼eÞ2‘؄؄Ø‘‹«/–\,YþuþÝü»bû>¡{Z÷4K•œÌõçúEÈpÜvÜž-Ô%\N¸l¸ùÕ@ö@vô·ßnoä½pµºZ]­p»âvÅí ¨M®M®M†¬ûY÷³îGG6oá¼…ó¡퇶ÚÕ»+Ý•îJ¸î¾î¾îŽêNÉ!8XqÄvÄÆÐN;„Æâlq6Ãm5¾ íí¶¸¥nbÏÄ‘sß]ô^ôJÒ¾Gâĉ¬ë^woÝ=Ï5Ï5Ï5‘˜´˜´˜4ÿNÿNÿN‘Êm•Û*·‰ôª^Õ«DEêÊëÊëÊEZ¦¶Lm™*²±acÃÆ‘jWuFu†HßÏîOº?IÄõ¼ë‚ë‚$‰Œ¤Ž¤ŠX§¨VÕjq‹þ{‘o·Â¹’s%pÁÝzªõ”Ú[´$¸$HpY`Yß²>píwíwí‡+Á+Á+A¨©©,g–3Ë 'GOŽž_œ/Î…ŽBG¡ú<}ž>.:\t¸ævÍõÌõÀ©”š¦š&‚‘wEŸç}ž\ס‹cס4¯4Ïl´‘ zƒÞ<¢—^ÔãÌ`3€£åè8^h‚rÊ)§¿Á ncŒEY„„´,7ó•*=< ×#ÔEx {‡½#«þÙ1§cè{Ã<¦·Æ<Ô÷é×ôk þ¥šTK¥ÆRЋõb½Œ£À(Ö°†5`¤©F*ð ^åUÐÿ®÷é} o««ç¡ñó0>ÿîpv8ì^»7K„Ç~Âüc+-+-À`„™‡ôKú%àG#ßÈG‹|µ44࣌Û( ÀÏOP(ãmãm4é—õË㙥m¥íÿ2dWRX\Xÿç×O?çénRPPPPP&mxòÁ,⺹n®›Öœ.8]pšèúuýºþßEPoêM½n…@!0j£½Ê^e¯¢â$Nâ$ÉGÂà.îâ.€ØˆôCIº$]’Nò¹GÜ#îÑ¿N’!2D†v–îõßë¿×¿þNaVaVaéB„!„¤NrˆMn.óP -´L™¨u¢NlrX‡Åo®ZW­«.ëqô9ú}úZç[ç[çGýAqTqTq5QÉQÉQÉ$?šæ£y`ÏŸ>€§íé÷Œ÷|ïÑ{¢ïöçñïáñðqî¾H§Ò©tª¸†l Ȇ£l†üísËYËYËÙ™>¾z_½¯Þµ#ùnòÝ仌3Òiˆ44I¾$_’+ÞÅ»xrXa…Àz¬ÇzAB¬ö`{°=i†FC£¡‘:¿ û.ì»0qÇã”Ç)S^ÿ³Ý>Ý>”‚RPdYGÖ8„C8`+¶b+@¿ _Ð/ÛCÛCÛC€Ê©œÊä"¹˜êÑϬͬͬåÊ|—û.÷]N5GÃh {…SáT8Àâ}‹÷-Þ‡dÕUÕUÕUx¹…äcKÆ–Œ-οyþÍóouuu€—ÅËâeÒ´iÚ4-u=êzÔu@„ b~ÅüŠù@›_›_› lS¶)Û€o­xkÅ[€¦IÓ¤iÂTÕgªÏTŸÁºø•ů,~Éå{Ê÷”ïø`>˜~#h ‰ÍñððÀ‡sãçÆÏ'%ØŒÍØüz…^¡WC]C]C]@ÎÚœµ9k¸Ü¸Ü¸\ âÇŠ+~„5Âa ðýþï÷¿¸ýÂín¿äÏ9žsPûª}Õ¾@™©ÌTfì¼·ó/ðŠü2òËÈ/I‰‡ÇÃÇÙíƒöAü%"5"5"ù²k²k²k°º.».».C΂ `üôøéñÓ€*R©Š‚½‚½‚½»Ö®µk¦Mš#-#-#-€1ߘoÌ¢ÎE‹:L4ýÑôG€jP5¨ZÓ[Ó[Ó£¿ÑßèÌÁÌ8y û\ì/:|ŸÇçì7ì7ì7€ÕbµX-xÚ$ÌZf-³À œÀ Ʊl Hÿ:33Cæ áB¸ŽYÜJn%·±ˆE,ÈÍΛ7;à„à„à@® ׆f‹Ùb¶§:Nuœú¿íÿ¶ÿ[@æ”9eN`r§ù…€„“pÐUt]`öa€38ƒ3 îa¬¥ÕÒjiÅ}&IcÒè_9é!é!é!¡è¾ÿ}ÿûþÜ_ÚbÛbÛbIþ‚7¼±à LL¤M¤M¤AÞ<Ö<Ö<dh3´Z úpôáèÃÀÜ+s¯Ì½4·7·7·½‡{÷üƒüƒüƒóóó•_@íÝön{7Àö²½l/ °*¬ ë“î ã§ÆOŸBn4ÍF3KïKïKï E 2‘‰Ì½'¹®€+ ùõºz]½Î¥JJJ\V#«‘Õ`TS¬)Ö ³f7Ì:C:C:C€†¯¾nø &j¢&`æ™f4fYcnÆÜŒ¹ô†ö†ö†5{jöÔìøuü:~ ±h, ìbˆ"†@^ƒÔ@Ô#1#Žq×ç^äøœãsŽÏúúúÎ<´l¶l¶l^º#tGèWÞÆ…n\È _¾8|öÊÜÊÜÊ\HŒ§Œ§Œ§ù,ù,ù, Y•¬JVqqq€pC¸!Ü***€ÛªÛªÛ*`Z÷´îiÝ@Úδi;Ag™f™f™@ÊëËëËëEë€7¹¼GÞ#ï¹½ÚYí¬vVÇ}Bv?Øý`÷ÍhFósÅ|?ßÏ÷7ÉÆõãúqýÌì¤;Iw’îÐÄÔŽÔŽÔòwº‰n¢›@Ï:Ÿu> ÂF³Ñl4Àf°l€ð>à€Û° Û[±­ØV °±l, ðKù¥üRXHø!ᇬ<{ëì­³·pEÖ)ë”uÚR(KYÊF­ÄlÌÆìöÍ s’9Éœd[˜#Ìæˆy›Ø)vŠòzy½¼h\Þ¸¼q9cH4$qŽ”’RRŠ ^äE^Ø6†èz„ðÞÃ{¼á o€ŽÑ1:H[¥­ÒÖ'€££¶QÛ¨ òšªšªš*AÍ·óí|;@FÉ(Ý%’8GâÚ7£E(â‚Ù„„„„„zIHB÷>³›ÙÍìîz›IaR˜”Ñ(×;®w\ï¤æõôöôöô ‹"["["[˜=²BY¡¬£ô*½J¯BB6‘MdÓ˜…Xˆ…i$¤   €$’D’Eeaeae¡+¯»®»®»ŽûX¾N¾N¾î\aèhèhèè¾x¼þñúÇëÉya„Q<çQzЃá¶c;¶“ªˆŠˆŠˆŠ¢ßKs¤9Òœs…C¾C¾C¾Üp¹O¹O¹+ÏýÝT `°Ã l°Áö /Í 4”èˆŽè ¹f¼f¼f¤‰Íúf}³ž-Rø)ü~&›£ÌQæ({ûÀ½wöÞÙ P#5R#”n™¯< žqAœ"N§@ÙÖÛÖÛÖ 8¶;¶;¶¿}@á­ðVxw_¸[}·ún5[T÷jÝ«u¯ÒD²…l![ ψgÄ3 A@Gèˆ@"`âgãÏÆŸ8§Ÿ§Ÿ§Ÿ¥¢OѧèÄ1FŒyûÀdê™lîT,vO3Õ³ÏÌÝW‰§Ü¹ënôÐCïÊ#Z¢%ÚÄßO^9þVéÌuæ:sÅ­¯‹¯‹¯‹Ì¢È#‘G" ]ì;ÄÈ™ÙÌlf6ìB¾/äCr,ôXè±P×ó}q}q}qì=é<é<é¼¢…“?ÍŽëb‰X"–pÅî•ÝæY±ÂÂÂÂÂBŒz" ÷ û“%¸ò&ï<\19JŽ’£¿Ì,f3‹wT!ÙÈf>©vV;«Bîpépép)ä Ã0 ƒO$ê'ê'ê'D«©ÄTb*aïIwIwIwÝ©±›íf»yןï½|ïå{/n@µç´æôð=} Ø3@îøÞ»•ÿ•»CCÜðÅ‚‹ \yxÏãy( >ƒN5¶4¶4¶5òy‡¼Õ¢ZTomâ^ã^ã^›xA­‰ÖD3ƒnÿëÙ¡žæbñ+6Y ¸›êE½¨y£/¼/¼/_º¦»¦»¦ÿSh$‰&㓟’~Jú)ɧb¸}¸}¸þ©í«¶¯Ú¾r½8îwŽ;Ùíü"~¿èÿ‚i)-¥¥_×@ $l1ˆA1ȳî@ Oóü†ýJîêP‡:Ô¹öÒ*ZE«:™KÌ%æÒÿklËlËlËÄp¾„/áK˜v6›Íf³¿k½z)ôÒïŒÆNc'¹*ú‰~¢ýÜ­[í´þƒß°§r×].\{±[°…ûÉ"Y$ë¡´ŽÖѺëe3d3d3˜v¶‡ía{Ì3ăâAñ`noÇêŽÕ«I@hÜzžƒåÄoqü,Bó§=fn×IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.5.png 644 233 144 3301 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜvIDATHÇÍ–ýOTWÇŸ±0‚ØVŒ´J¥Rµ¦ Xe+)¤ DÔ.¸¬³mZŒúÃf£Ù%›¨µ[5ëËÂZj,ÆQÛR¬/!¨µÍÖ•.M-JÔ4e`æÞ{>ûÃÌu&Ûý<¿œG@DDžõïÖ™Ö™ÖHŸmý]ÀöFس?ñÙ‡t°[Šø#L90åÀs Ï57¶7óƒëEøÁ|¦_ž•€#´9´Ù²Ìoï‚5)kR¦úì=í`³Ûì4¨>S}àTã©F¶Àý¯ï 0¸lpl3næ›õ&^0¾ìú~˜øÅÄ/,÷ ô™ÐgD`VÞ¬¼ÿàKè~ W®è™Ð3AY@D¡–à c.gmÆýùf½‰gâ›|&¿¯˜Ü˜\þþ¦ëM—­ÞWpóc>ª=R{Ô¯£â ‹.ÀmDaLýËØcìêUƒjPª@/×ËcPÔAy9Ìa"Ô]žòÖÆÔÆí~>Š®]µÕÃÔ¨©Q3õï{W0ã­´·Ò@ex¯w¸j¥f„áUT®ÊE©ß¨BUøäO¡¢U´Š’I&9àÇ…  ƒÄ Äo½W¡ôýÒ÷Í?¸wEÐQŠˆ$}ÄE[“­i8ºgvÏïŸ(xøúƒÆŒjÙÚfms€o|÷øîñÝà(t: AKÑR´~µ”¦©Gà^î®s×AßW½ö~ÈèÃß¼0òú”[›om˜ôü¤ç‡C”Ý׫ˆÈ» dyeyeùdmèOs¾Ÿó½Z÷eÖ+Y¯HËK™/»_v‹mÝ¢uÖMqlulul)u—ºKÝ"©ñ©ñ©ñ"¥Z©Vª‰<®z\õ¸Jž,·Ç­ÜJ$õhjqj±ÈëWó&åMÛŠÿ,[&-]áï…¿§ˆT­>:YSÇ|ý„+DD ‘ÂÑÂQÉ>[÷Ù/ŸýbI×"´:­NÆ»÷t‡w‡KèÒyK×/]/²7foÌÞ‘ž‚ž‚ž‘sÛÏm?·]¤$¹$¹$Y¤}zûôöé"ù’/ù"âÒ\šK±¶X/Z/ŠT̨Ð*4±”ü­8·8WÆ_z5.1.Ñ’.ë×.®™ð_?ÂPä™È3ª™âÞºÞºÀ ×»7º7BvVökÙ¯Á´ÕÓVO[ 7;nvÜ쀴ü´ü´|ˆLˆLˆL€ôšôšô¸ßv¿í~[ç|Óù¦óMx,ñXâ1ÈÈîÏî‡9»f¯œ½îLé‰í‰ÈÈ5=¢+¢K5[ù§Åeq‘,öÉË'/ùA¿Us«Fú;G;c;cEìkìeö2‘¹gçž{V¤:©:©:I$!'!'!GÄ}Ï}Ï}ODy”GyDNFŒ:8ʸȸȸH‘úŒúŒú ‘ËQ—£/G‹ÄœÑ:£UäôîÓƒ§¥_$êHÔãgË|Ë|’­ê´^©WZ~™øùÄÏE®ç_ï½Þ+1k]k¿[ûÈ•ß^yûÊÛ"ÎÎÎ"‰[·$n¹»áDN8O8O8E]ƒ®A—ˆÍisÚœ"§<§<§<"×ú¯õ_ëÙØº±uc«HCjCJCŠHß|G¸#\$56µ%µEbDFæŒÌ±NUߨo,? {DDþ]ËWÇ?=þé“»Tõ—°Í;›ËìÌü6ó[¨O©O©ºuû·íß¶,t-t-tA££ÑÑ耜œ(Ê*Ê*Ê‚¾Ž¾Ž¾ØW¶¯l_,úyÑO‹~‚¦Yí팙|”_y|%pÁ×_.]†MU›ª€# ¥¿£¿¸õôÒCAÀð H†bh¦™æ ÿ np0g<ï’æÕ¼À*?›>Øô0êëGèòë¶.[×p‡o/¹½ôm>ÓwÛÇíŒsuÆ:à¯ìd'èmz›Þz­^«×‚‘id™@€‘d$IÀÒIýK½Oïý]?Þ«>|:oÏ»=ÀÖmëᡯŸ_+?%a%a€ò+³G¿¤_0*J¼O¾¼x1nëU׫ßþŠûŠû|Ÿú>•·[ûõþÜx!ü\>½.žÎBþéüÓ®€m¿[VoYí)ÉØ‡.ƒwØ;,ï=ï½”[ë±…ã¿­»Zwi4Y­êj£’G’ƒÉAÔú?¯ß³~\ØtaÓ…M ÜÊ­ÜÐìiö4{ tQé¢ÒEj 5…š Õ™êLu:úöoÞÜ„ SO7>Ê2ueøøOëë­¯ë̳…}½U‘Å‘ÅÙ‚¼9óãô‡Ó’^×±®m]›Ó»±•±•±•0 Ž¡¼»¼»¼n츱ãÆX6´lhÙD'¢Ñ ˆùcþ˜ß‰o µ4¶4fõ¦å_3|ü;2Õ¾Þ' h´hTæÁdåd%pË–Ö&kd X ­R«jÆkÆkÆá\Ϲžs=` [ÃÖ0Tùª|U>(:Rt¤èÔNÕNÕNA¼<^/‡–Á–Á–AØV½­z[5l\½ñÅ/:™´¾µ_~œ\:¹´¾B_¡¼ ÷ïÝ¿œÎ´½R2!@m´6Z…15¦ÆDvFvFv‚?äùCξÀõÀõÀuXuiÕ¥U—`Áwܵ+Ö®X»<==áá³õgë1#ßOìMì­'O9"G\7fÐ ! !„ó]KÄœ˜ÙǘgÌ3æ ‘žNO§§…XX¼°xa±ýýýBœÙ}f÷™ÝBÜ­¸[q·Bˆ­u[ë¶Ö q²ïdßÉ>!*d…¬B”„J^)yEˆÊg+“•É,ü|׬Ù`6áèÑgŒÈTd ˆÚ5ßdþlþLZÿ¥ŽªŽªŽ*¸vèÚ¡k‡œ õŽôŽôŽ@¿Î_ç‡~Ù/û%àÆÛÙw±óbçÅN8XxÐ}ÐYOË›/IDœ1»+i}»õm§+ÁL™ÎDWXÌf› ‡z€ÛÜæ6 PN¯Z£Ö¨5`^1¯˜W@ž“CrøˆÏù¥þ`49|ÿoÝ׺ï7]Yu¼“ÞÉ”7â õ“í²Y¹S~ ?e©Y•#Ð:e²NuÀ:`¹D.‘K€È:¢ÆÕ8ÈNã¦q3gŽ=ŒÏÄgeó?:Çô =ÜaOØãL~°¢V˜‘›åf {ö+ÀÄ´ß&m^gn޹œŒÏÉír;¬/­/sñÃùá|©G&ÿï|+i_ÜžkÆ0ðïQà”ØÚnm' 겺 € 8¶ög„¯ñ4¾æÓüÙoåc{»xlïcç öÍí9_û`K2IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.7.png 644 233 144 3043 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜØIDATHÇÍ–aLTWLj…!H ÅnVKÉ–8Ù(ÅJ$)©› B›Uƒ*iÚcŨ©]ƒPÓ´0H7Ya‰±K—Ĭ®HÑ”6µH( lã4Ä¢”vJDth‡Šá1,Û÷îo?Ì<Þ¬Ý/ûÍûåæî½ÿÿ¹çÞsî‘'"½@lzlzlrÇVÚö„W^ÉüGŸ1 ¦4¦ôv-<Þòx @ÊÇ)›c6¶Æ­ùÑëElþh=Ë.OˆmˆooÉ`”?Wþ\ÂÚ0þK?8:¼rð À'mŸ´ñø†|Csùsù`ckÜšo­·ø¢ùÅõ¾¬þlõg1“ÿXüc"Q”QôìÛá ãÏBñ®â]Ó«¦W©X0ü@I*ÐаÚl¶Æ#ó­õŸÅoéYúaÒ¶§m’×J^s´¢‹ˆŒƒš§kž^Ð;ù;.\$gÄÍ¡ùÐÃÎ¥f¯ÇëpC‹Sû+·DDŽm©8YqrMˆ?9«œUjË÷¬kÖ%Ÿµ½üÑˉ£7©wuïjYi{Nï9½ç´È†â ÅŠEv$îHÜ‘(âoñ·ø[ìy×äZüµxç?¯;_ùÃÏÛK·—Šã7·ï;Þ—ÏÿÖäùÚóµÚ"rôÝ£ï® îˆ?ê‘áj¸8~q7Ô›/T妿¦´â:\0\0\—/]¾tùdj™Z¦}éÉ;žw<ï8œª9UsªÆ¶/Ô.Ô.ÔB 'Ðè½»vAFúúÞõ½§K33Ô›ÐÑÑѦ û#hÉŸ&ªÚùÞ—èKõV$~«OéS°5ëK[_‚®Ò®Ò®RÎg‚30Õ7Õ7ÕÝõÝõÝõàÜíÜíÜ }®>W_Ô‘êMz“ÞdãŠÑŠÛ·áÔQwŽ;Ƕútöt6@òWÉ_©v”5)kÌïè˜mžme®¤}8ÙyÙyÙÐy¾ó|çy›¨z±z±zrrr`(m(m(-Jh§±ÓØiãá‰á‰á È<’y$óqÊÜeeQ°*èËòeÙ‹•­@+¸yC~×?Ñ?!"[DD8¹»Ë…)… … "ë³îŽ­´Ò*R´­h[Ñ6‘ž‘ž‘žw¶;Û-â÷Ž{ÇEbã ã ‚ úU?1Ä€­ñ•+YoñYü+oeD?ìÏ£ü»xdÿcæö?›â*3êtcQIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-92-red.png 644 233 144 4322 14774263775 15621 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷܇IDATXí—{LÔWÇÏï1<*,Jky k(«°¨]DÒ…‘Ú,5ÕÐ &P­Vëú C£¡µ¦‚ø(íÒ ¥µ+©RdPSª&«n]¥Uc›úÀj•¡È6Äá9èÀÀï÷»ßýƒ¹¿yd«ÙìžàÜ{Ï9Ÿß½ßs/Ùxò11=Ðh ´ Ü!ÍÍÍsSeUVeõû¿ÑtšNÓ±i¶ƒd’Iæ>àë³|=çùx~ßzbº/7ßzZOëÅFßùˆ§åf¹Ynnì6„ :HXø@ø@øþ¾ðÖÂ[ oywóîæÝr3r3r3<>Ÿçëy<ÏÇóózç!ñO¾~ÜnqPÛ§óŠ)Š)Š)R_ßÓ²§eO {ÌÑãèqô A‚÷q÷´£í€î»çùzÏóñü¾õâv?œŒ¡b§Ø)v¶ç 2ÎeœË8§Ìnmsµ¹Ð·±i,”…BQ7+×”k€:SMQS5[}A}Pgª&Õ¨›Õ85`ÓX0 †Âãy>ž_ö©o ÕÑ„F¡Qh$’·ÉÛämõ?ðós©¹TÉÖÁÞP[Ô8”úÑu£ëÖîžÁDLíeíešñ {ÀˆvH;äY¯Ô³@°7´KÚ%8øjós™¹LÉæõ9ç#C‡¡ÃÐñç?òÆ2ããoënnF¿;CÝ¥U€Z®–p ìØ £…£…ð2vƒÝðö•5ÊŽ~g¿†§OÔ]¬šUë‹¶nÛMÛMôËŒåÆrÏyt>y­¼V^{aŸ¨)¬)¬)d¯º8•Fý°f´Íàz6ýÙt`¬­àñ²ÇËà‹/B¼;–w,€´Ãi‡@¼ ^à Ø° ʯ”_<ùÇêÕÖDÕD±Wõõá#fO O OÂŽÞ¹=¿ôüâÙÄòoNŸ˜>âºâºà›Åß,€•WW^€À¨À(Ú?´V^_y"r#r åó–Ï`û­í·8Ü{|Íñ5žz½sí³ì³ÎÃù8èÎï.xwÁ»ž/SyÛØKKÀð¤áIØ»`ïïMØ7°¨ˆŠÀÚk퀗¾|éKØtc“ñŽx §è)ö>üàC@¯ç®Ïy8Ÿìn©§ Y†,C–Þc´BKЈèLèO¡?M JDô™ú™JD”w1ï"Ñþ’ý%DDÔK½DDŽŽDDÇî»GDäºéºID4òóÈÏDDÛgoŸMD\\NDA¦OMŸQµ»rÙX}C“¡ÉФ·<¿_YAjUjUjî ðàvV; †å|#Z]­.ˆ={ÆŒ€è÷£ß÷ÖìGöìÞ›óUîW¹ùväÛÀu¸ûp7€ïÝ-˜¬þ¨þÆ£2&dLȘ€;œÄl1[̽ǟººõu9u9^Ò\š νyîM®Ë—;`8k8 ®Î½:×ôLß™>8~äøïñM9›r(#;Gvz>C=¨ +Þz§+OWž®Ô_ÀUB²,$Þ#)EJ‘RJ+x—ÅNŠ;N³-ºt;É#,–™³(gDG`ß~òí'˜I I  ,U–@JJJ ÌxfÆ3pÂ~ÂÀٜڜ àźüº|h«n«†Ë å†rH*Mœœ8YÓ)BŠ">¬,"ù¬|V>ÛЩ_ø¹™73oªÅœT³ØóìypÁjzËô'ß©-A€+ʆÄ!¢ã¢ã èµ ×8èÐ/­–VÚÇDD`ÀÕVE—Š—/Ñœ:à i…´âêâ1?˜w=·˜jC²!Ùܾ—X6[Â-á,S¿?&Œ¶Ž¶‚£ÃÀ¡|§|ç­I¶“퀾оP®îkÝ× ¿³¿P íwíwÏá98 6&4&àEý ­+ÄŠá¹B”%D%ìñ”.ëýµTX*,}¾Vh„®í/ÖSÖUÖU°êÚ-Örµ\`'Ø .íºvÝ›ðÀËÍdÙF”:~­ýµˆ šôĤ'”µúN¾#’YÌ:Z6eS¶lô°šÈD&ùj¤Fj$’ì’]²¿~TZk»»•0ÛF[‰­Ä[»ZVçØ….Nv‰]`eù,`‹µyÚ<¸ø²%ó;ò;Ôbýº/÷È=Ö­‘ë"×E®#Í¢Y4 Ýt…sœûçbéŽtGº#‹/‰/‰/!2Š EÖ­ºvMf“Ùä­]Í¢Yà‚VXô¡}^]=E¢Nñ\;U³ªfUÍb™ú[f3„u»ÿZ ò=iá¤ßÑ“àç~íëƒÆ´k;è¥ÝÍ–Í^Ú S”0Ö¥ui]žk§­h¬Á­Á­Á­l¡®É1D Éßâ'Åj?¾@zø€Tå§Ý…ÿA»§¬§<ÚUN)§”S: k(r(r(HHHP'ëZl’š¤¦¿¦q©¹¥çø;z„yð¿¥ÝJc¥±R ³5Øl \pÁ…Nj9f9f9æ¹väZ¹V®muÿK|Þ¯®{œ{ ¿ñ€|·vü–vçÌŸ3Î|v­iÖ4köÍ3ý$„¡@(x¾Ô·ŒØçWW ÿÒ¥Ýt©Bª*Úgrà‚²‚²‚2öÞ´‘i#ÓF”+úQÛ%»d·ÄP=ÕS=¹¯ÉæW/þGó×îV_Îma™°LXÐ<šGó´©b´-F $Ð?¿ŽuÆ:cDÒé‚tAø‡;p±ßÉýß,Lÿ-‹²(KþÁwzc¡ÈD&2@8)œNþë÷cã°úL›_ÞGõ¿Þ@sS…Ú(IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-28-red.png 644 233 144 4324 14774263775 15622 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷܉IDATXí—{LÔWÇÏï1 ŠR‚Ã«ë ‚UÁêÒHiµF—Vl n‰Ûdéh*DY…® V‚µ•ÔP`P#ñW‘õE£Á­b4!Æ*C„ÆAdftdð÷øîÌýÍ#YÍf÷üÜ{ï9ç3÷|ï½ш%?ãë-z‹Þ½ò „µµµ,] Ê¢,Ê·¤Y4‹f#Óê.I$‘ù€¿¯îbëY<ËÇòû×ãûóøòPðMþó㧉-b‹ØÒ4Àmâ6q›4ð{„=ÂŽs+¬x°â°ºwuïê^`•q•q•Ñë³y¶žÅ³|,?«÷vâùû“¾ã¼“wöÌb;›››'}¸ýpûáv5ÔñÜñÜñ€\x‰—x  =è4ß3ÏÖ³x–å÷¯7é»·ó‘a4ßÇ÷ñ}=g ŒWWW¥¤î7Ýîn7ºá15A}O}’¼]ª“êyŽ+Çr¦œ%gòÙ(y»}GÊ”Þü#õjrkÒjÒÔõÚÎúñ‘j‹ˆˆˆÇ®¥ Ò qì;çUæU@ô³ègÐþsûÏPÙUÙå‚›n€MÆMFˆ¾} nÜ»qŠâ‹â8Bö‡ì×»­w›wû–ö×õ׌‡ñ1п-ß³|Ïò=Þo&wËcå±llhÑýE÷`[ͶßMpD9¢|Aë;ë; û‡ì`náÜBßõ­·[oÉG°ÝYg= wû®‹ñ0>Ñs¤¦éÒuéºtíŒé)ŸLd"¢Ëlè\õ¹j"¢Q‘£"‰ˆ†þˆ¨riåR""½Cï "JH "JèIè!"š[=·šˆ(*+*‹ˆ¨?£?ƒˆh¥s¥“ˆ‚gž=šˆÊ6ÙFDeb”Ez]³®Y׬yv¿ª9 ªT-¨Â£!nˆ†ÀqÔ£*þ¤t*€÷|^wyD—D—€î¢î"œ(>Qì»)¹r'ÀŒÚµð}ê÷©ðå•/¯p àöÝŒ»€š8r¹°hã8ã8ã8íÂ_õaû‡ír!`϶gŠ9¦$¦nXô}ú>.j¤F® ×}ÓÑÈ£‘à49M`ÔõžùÁ1®1.@9tàúëÞVçý3·(·Hqi€ùB¾/{Äa§žYìA]¢.Q—Øs„˜·o¾¿ù¾š¦unÜ“÷Ÿ¼|<ø€cð—Á_àÅî»`øÓáO}ZíÆC<€—Ó^NäÜ×å¯Ë½­nt6~Ñø>ҞР¾‚¯ZÊMà&pfniçk-WÈ.©å¸®„iEù‹¥íø·Ç¿…EÓn¡bRL~@ï ª Ô üªü ¨iê1õ˜WJ} ½¶^l8n8.mÐvr§P$™MZ&eR¦hð²¦P ¥ˆ;©‰š¨‰H° =BÏ×§µ§µÖn—­ßtí>ê«]¹_îõ¼z€ŠØ€‰Î‚åX¨ÙÊ'Ê'p³À57×´®i• µè¥è–ÒèÑ£7ñ&ÞÄ›¸cº\†9Êó7[x$<qg&ož¼yòf"]ž.O—g)Õ´›bJ1¥ÈÚ®˜³b†X`ð/ð»±òTyª<իŪùUó«æ«iÚ[® ×…÷ y~-ûwš»ÐzâÜkþ¾!xD»Öc^íš·›·ûh7\ —½@ÊSå©òÔ«Å.t¡ °„t…t…t©+4M†ña|Øç âÁ>=½}@¨òÑîZní’\×À5øj×ÒfiójWj“Ú¤6¯r_G¿Ž~ ̴ϴϴ˿״Ø,4 Íû“™Ô<Ò Cï0ï–À«]›`óÑî^Ã^Ã^)ÜÚ`m°6pà 7ìŒÔ|Æ|Æ|Æ{툵b­XÛåù—$äF@]Ï8…¾ 0ÐXÀçížúOÚMÍJÍJÍòj×’lI¶$ãèȼªu‚Ëár¸œ%Åþeøu9ú/í]Ú],TBEÏœS–S–S¦îKNN–îj­¶ 6ÁfŽ¥zª§zò\;‚5 žžþG Ôn©¿Ÿú[Ç­ãÖ”A”¡Lçcø>àˆ#Žþq-ÎçŠs B‡ÐÁµz³:÷³píS:¥SºØé?ýM.¯ò*¯Üîwá_¿Ÿb èLw@Þw¶úßnrËcfIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-78-red.png 644 233 144 4211 14774263775 15622 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü>IDATXí—{lÔUÇïï1-e‹µC±SŒ²‹"M›ºXHÖ>Š¡%d¥J_,¤:¢©P‹mŠÅØ ’¥ ©¥$"BÖP» ÕHØuë+©b¶3Ú•J§0tÊïñÙ?f~¿yÄ•lvÏ?3çÞsÏùüîùÞß"j7‹$“ïO÷¦{Ó½ÒÕØ@fÚ‘´#iG*KT]ÕU½ïÏ¢H‰"ˆN›-BªP-’}³ÅŠ·Ö[ù¬üÉõäû“yù6ˆ bƒÜ•+r½;Þþu>áœ"Ƀò`à#+Aé©Ò}¥û´y¾ë¾e¾eøˆ™Y`æš¹hzƒÖ 5€^¬©š z•Ö©u‚^¬/Ó—Þ ß©ß f™af Yë}×}__é©ÒS¥§´y6ð<$YõSl4©Kê’º„P›Ô&µ©ã+k«ÅõŽë­ÊÛÈ'|BHë žz0±‰ +‚!À°W L FC<^ë01s£1ϘGÈŠvµ¸^u½ªUYõ-‹O8Î9Î9Î-þ½àÜê\ç\gÎô_<x’Ë„þÆH`$puåÕ•@èjÚÕ4€±7ÇÞÙ1² ì»I0­^«B£G7Œ?úf»ÙHÿÿ ËέÎFg£9Óâ±ùÔõêzuý™&kbWÍNÏN¹&– ¬u…DHäÍÈ›D¢q ZE+@FcF#€rL9°¥nK@èçÐÏsËæ–Aô‘É'_Ø×´¯ ´®Ä‡"¼«fWÅ® s½³I| æÌÉ™“3‡–K•—n¹tK|;ȧ˜b t"ëDÀþýû÷ýðè‡ [¶$€ð}ö÷Ùë¶­Û0ý¥é/œþîôwõsê硌·2Þò7nŽ×»Ty¡ýB;X<ŸºíáÖ‡[n?™îÓ}º$@'¦iš‰›P®–«k+×V&Ž»j\5%“K&'Žw÷u÷ÈSå©@ðë5_¯Ý—CØâ±øb |àîs÷¹ûì@]_ WêÑÂ"½½‰¹ví*Èvf;ΟOœÿ¼ðóÂľµçÖžDÙØ²1`,VðUí¼v>^ß}¯û^÷½ö{ûkG«KÚJÚJÚ—Æ¥q 8Ìacò¤é5½?ŸÆ&cÀ´À´ÀæºÍuü‚Õ¶Ô¶ÌþhöGï–¿[ðÔɧN‘›ÓnNú¾]ôí"0 °{Uš]š]šÍ€Å'ä*¹J®º~ÞºêÚ7´ohß IŽ GBýÈÇË?^Ù‘Ù0Ð5t BE¡"EVd€=G÷M˜ÖFý @¬kA?Ô:µuj¼Þ'Û»ÏtŸ±wòR¡T(^?/”¹Ê\eî+ÍÖ)Ë¿=ÿöüÛõ;ü+ü+ü+âÕÍ ëëêÕ«WfñxqR«ŒýÎ>p`ÖŒY3ާOÂõꪋՎZ¯F$[5畻߿û}þ”iÊ4eÚžË"saæÂÌ…B¨'Õ“êÉÎ!û…ï^paÁýyÃÓ«·¸¨¸?óé3Ÿ&‚iS´)‰þ¹mç¶Tœ®8 „bÚ¼|Sø¦0{v|±ã‹x«kÿ^S_So„mÀ§•§•§¿[õ3¬SoYÞNG¡£ÐQØg-ð4x‚ž`|?µìáœáLˆôFzµËYÎðï°–µ=ˆWîºrè5ך®5Å[}`ìÀãçAû m–›åæñJiº4]š>{o  òûJ}LzLzlÁn©Sê”:-­ë¼=Þ×½¯ãµµû¼Q`DÙÑ€cÖ Ž ³Ä,0¾4¾³Â³Â¾Ë³Yެ¡ñد¥IÉ–N¤´^H)no²ïœÕ®ÿP‚v< ÚÍÒ²´¬81l Ãq-öÓO?x3ú3ú3úÍ¥¶&3åL9óÑ?¥Hqg _ºøõ¥-E»KA»=Þž¸vµ­Gë±#×r¯å^Ë…{Fï½gTÿ­ÅƒÊAåà[ó-©Å¤— x“¸Å¬qí•`‚v·;·;·kYþN§¿“è…aÔ"õóó‹¿vÔÝênuwì/IÆé”º±q1ùF€©f-x4¦Ý£ÿI»åKÊ—”/‰k×;ß;ß;ŸýÑyÓî„T-UKÕ ^I.#¤Ô•Äi7ÒîýJ³Ò¬4Š-àê­Õ[«·šoLLLhßÚ­*A%èÉ¢CtˆØkGñ§ÔKÿ£¥j·1Ù/ÿ§ô„ô„ôˆEb‘XdÜ-ß&ß&ß’„$þÚ›Î燅PÎ(g”3RwláÊ”Îýß,Ëþ¶P, Õ¯’§_®‘MÙ”MNH'¤ÿšÿ­7¥3¾”¼7lõ¿äáAò÷IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-4.4.png 644 233 144 2460 14774263775 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜåIDATHÇÍ–]HUYÇ÷ÕÌ+ifØSZQDà}Àˆ”!ÁK^ÁèÃ"Ÿµ;>ÌCu)+»êˆ÷œ³÷þÍÃ9çžc$óÚ~¹w­ý_ëÿßûìµö „b•ó+ %?%?e¥m§|ïùƒ%Á’MÚöM Ê@å_¿Böµìk99jܳÝyïÂËïçsýb•ðé=é="Ç>‡ רöo!#œþׂ÷NÜè½Ý{›Ó‰LMg»ó.Þwóùó‹óŸð iýiý }yúr!`}h}hã6`r#”—–—¼L}™ªS@N™dê"`–YÜñÎg»óÞwó¹ù]>—ßÖ# wwîn! âpÅáŒv;`¼ êòêò À í´“I³Õ`5iÖQë( Ðcz Zi˜zXÈZYK‚f«Ûê–qŒcdÚBÍ0²nmÝZWàx—Çoë‹¿mË^¨ V `>9*G µKíÂÔµúª¾jÏÚ›…h´Ï <ãèZÖa4è=z&R>•O]ù$É—ä~A_ý±ŒØì2ˆÊ¨æØÏ”Ú§ö1a§Jü˜8•8ñÍñÍñÍ>!C 1¼á oc¾"^ ïè;Ì3âäWQ#j€Çoëq„Ý|5 5 À€Ú 2Gæ€\- e¡·õõõš Í„f<]ªSuªN°>X¬žß‡Ÿ M%ÝZ5g³Àß.ŸÃïèq„þ Ýñîx2î;µÆ0H$7äÅЋ¡Þ‡/­(­(­ð˜÷Íûæ}ßF‡¢CÑ¥ñês¯¹—Ïm>ßÖ#`僕tĶŶi,s?®þ¸ŠçŠçŠç úBõ…ê P* •…|DATA˜¾4}iú”d—d—dCuSuSu”––zx9nµ[íNI~G€œ¬œ,5ï^½{ò›dÙв¢eEË HmKmKmƒ£;FwŒBp!¸\€Þ½7zox„—›/7_n^ßWÕWÕWå[P½Ëgó»z– ¡"*Â:`_§œÏÅs‘ëÔ†(ÞX¼¡xƒyéyéyéBD&#“‘I!Þv¼íxÛ!D~Z~Z~š·ênÕݪbçøÎñãBÜ}÷ýÝ÷B„á@8 D¬>V«bËú-붬ɰ„Bä:ü"©g©3²Sv’P?©Uã­p02Œ@£Ñh4`l7¶Û¡¼ ¼ ¼^W¾®|]é÷¶¶Â¹¬sYç²|;Õe†Ì ûöŒ}R•3ɪÜ*·‚.Õ'õI´5l X úU¿ê®së C:¤}gMé"]Ö°5l /Â_á èoõ} r“Üä¶¥%«ò3} §ÏÌ©JUét5@÷éݪUµªV`‚ &@ÒÐDM>¡.þÕ¥ºT›jcÞnKìGG­¨µdûLç·›Àåcu\Çt­fŽi¦ÿˆ'($öÂì!‰WÕAL#rÄŸÉÎÿ?w¥ \ä"™`ÍZ³òˆ7ÿ’wåûºøbßc_æ ö?~£fâgq‘IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-5.png 644 233 144 2205 14774263775 14616 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü:IDATHÇÍ–MhWÇÏŒIHÔ„¼ŠåAT(„GE ‚ÆG*‚B¢ A "JÅEéÊ\T!â´.Š ]¤!RëÂcD\ˆAŒ D,/BÒ…é#¼¤ò’Ô$ÍÜ{]ÌÜ™I7MÛw3œsîùýÏœû1# ""¥ÁSÀÝânq×û¶ûEä/| ¹Ö\k®T±*Vű„7,²!/ä[=«ï×v«Î^8{ÁRt ¼Y/Ú;Æ(3oæ#ü«ü«ü+HŽ%Ç’cPu±êbÕE¨IÕ¤jR)Ï”gÊ£ùzVOëéxã|Šôýz\¿o»zEêÎÕ Ú(Îg"NÓ#ŠÈ¼Ì‹#mrM®I8f3‰™„ˆûÄ}â>i®h®h®éºÝu»ë¶HÕtÕtÕ´ˆ4I“4‰¸Æ]í® y?ЋëïêXÿ|ýss²;²;–-Ö€ˆöŒÞ¨7êQôÙùg矇íW·_Ý~öÌí™Û3ÛÚ¶µmkƒ±c;ÇvÆhµ¦ÖÔÆ÷`ȆÕ÷ë([W¶Ng`jbj"~ìMÎäbàÓcz"{äøÈñ‘ãÐ?Ü?Ü?ùëu‰ºÜHÞHÞHF~•Vi•^öâqþT¤ï×ãŠèGú‘“ñ½Æp¥"2*£þùDÌ^³×ì–23˜Ì ŠœÜtrÓÉM"ùŽ|G^d25™šL‰TWWGó"^ŒèYý ³½9÷ò÷òáÛœuGÝaøÀ “N: &ˆ:ËõÞë½×{¡¶´¶´¶îVÞ­¼[kL#4¯yÍky?гú~=+>•`{0†bÐhtÌßG}@ 4ÄüKÌ1·òS¹ò{lù% ÝtÓ ª]µ«vP-ªEµ€Þ­wëÝÀ[Þò66?dþ«{ì?Üüöf7AÇX`!~êþ÷Í¿Âo%\á %ѨfÕÌ"˜æD¶‡Kä[Þ?~+?Ú¿‹öìãüƒý Ò¥Q©‡¡GIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-39.2.png 644 233 144 3235 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜRIDATHÇÍ–ýO”WÇÏ ‚ R‡²³Ù$5”@S+–à¢5-¬Z•R`H7‘Ú55&6®kjw%Å×NJ­8bA¬4ÎRtÛ:­qí®¦›¸YÑ8á¥Ö¶hM4óöÜûÙf‡t÷ðþòä{î9ßóÍ}ù>W@DDÒb_k–5Ë:=Š­kâñäW’_yæD·`©´T^ÿØß·¿ð¤ëI—òƱ9oæO®‰óOîgÆ%Mâ©]S»,¥1üÔÌ®™üë(Þsln›ûAÞê~«àtÛé6àçK?_--…86çÍ|³Þä›Ì/ïý¢¿$žMw=t8:°k»¶kpv:;qžÛ¹·soçÂP`(0ÏÏ»žw!÷·9áœ0üýøåO/ àÏögƒúÝ´à´ î²rÜâ³ø˜%î'^~âe‘ëFÿºþu2ríáµ§®=%r¦ðLÑ™"‘ijšš¦DTŽÊQ9" 5 5 5"=•=•=•"ÖËÖËÖË")‹R¥,’G#³?³?³_Ä™îLw¦‹lMÜš´5IäØÇ%мøû’ª’*¡.˜Ì±~•dK²1kŠþ«±ÚXm¹‘°1q[â6yîÊ’+w®ÜÇŽï|ÿÎ÷"gšyh¦HÐô½"ƒÅƒÅƒÅ"WƒWƒWƒ"Õ¡êPuH¤wSï¦ÞM"ùòä9a=a=aQͪY5‹4-hZд@dï‡{[ö¶ˆÜrýðà‡"é³3Îgœdz×íÇíÇEh0V+-7„=±3v®óTç©G—¿~gòŽ®]‹n])º­­­ñ-ÚS±§bOæææ§ÔSê)_£¯Ñ×u™u™u™àjp5¸`¹u¹u¹ÿ´¸oqüêù³ÏŸ%øù¥oß:u=ôøz|`,4Ïæ­\[¿¶ø€*@q›âGnq ¨¦šj`Œ1Æ&Ùƒ . € &ŘtI>4__˜!Uk¯]lúYË7B_ÌǰõÙúüSøp d Œ-QŸ1þr‡Ün+ED~}„ËöÏìŸ&BOFO„ß`åÀË?ïÿy?Áðá“á“ã›i¦Be¡²Pø2|¾Œqù]ìbW<ÔÂI0xùÁsž#hÞ‰âC÷¾î}À]{»½=0ÑÒ#Ê)"r´ Þ;ðÞ𘙫ÎåÌ; ©ï§J=„ZrzIõ’jè÷õûú}qÂíþíþí~Èõçúsý<5ü§ü§ü§ OVè+tH¾’ܕ܅Z÷‡â²â2 ;Ê[<[<À”¨›ù‘ßœY½gõ‘s}^ðy–Õ³¹gZÏ4Ñ}ñ¹}nÑôõ>½O¤)»)»)[äFïÞ½"ûS÷§îOIؘ°1a£<5jî×ܯ¹/âߨØ$\œœ'Ú¿ËnϾ=[ôS_zÞõ¼«e‰¸Z]­"Æß£zlm)wSî.tŠ,t-t‰ä}óŠöЦU~Ùqíᵇ’è9ìùØó±Èpþpþp¾È ç ç §ÈÞÅ{ï],²vhíÐÚ!mTÕFŸ6+Vþ¬|‘~G¿£ß!RW^ç®s‹Ü3¼/z_”ÄG7½S¼S´J‘œÊœJy3ùjòÕ…N¡ÞqÅqÅìä·ƒÎAgüØ`ß6¼mt,èXÐ];»vv턊{÷*îæÕ¼šœmÎ6g$%%Acucucu|+G‚#Á‘ ì¨ÜQ¹£Ö{×{×{aj»ãœãTuÔ,ªYÄ ˜¹f. )i)if§Íü>²'²Gë”úä¾ä>‘ ß_ê¹Ô#i;˜r0E¤¤µä«’¯DnÞ½5*2½nzÝô:‘†m Û¶‰Ì)S:§T$½<½<½\dæÙ™ggž9þàøƒãDZ[[E.•^*½T*²lõ²‚e"Ó†¦};í[‘¥åKK’&â+ö‹Øfñßib¼/"ò/7\Øxa#|ÑÙQÓQ£6­XûZ赡•SW&®L„ÌôÌôÌthnknkn‹¯ÈEïEïE/ìÖwë»ué!=¤CAfAfA& å å åÀ××d-ÏÊÎʆ/ŠÎÏ ÅLg“ª¯­ª­z£zbvq´ ¶ämɳèÌL0šfÀÏOü4η®«ëê:DZ"-‘0›Ì&³ ¨ ‚ P…ªPŽ;–†½ÛÞ˜¨þÑÕÆGQŸ1në#úAã€Ñj´‚º Î¨3q^U«jU-˜‡ÍÃæaà&7¹ ¦Í´™6 ”ÍlC7çšsÁ˜§¨HÐüý[Ô½ˆØïØï&2ó±§œ_/ÖŠ5àaÌ™—ËÀY`Fý1@ˆ1Æ€a†Žåàc€X%(”ù¶ù6aBÆUãªõ[áv(N,Nü¿Î»+q­s­wWRþ|ùóO€}ìc2D‘€±ÁØ@T«j@Cƒxlå­z«ß³ð->‹ÿÉ]ù̾.žÙ÷سù‚ý/¬Vß`Ô`w¬IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-29.8.png 644 233 144 3243 14774263776 15056 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜXIDATHÇÍ–ýOTWÇŸlq·qQÉ. [¥Ýhp“…„t¤u…2 ×EÛ„([íKÜlV«q]~€n³-6aÁFÆ*¬/ÕÐÐà; vª[³­+j "›*ud¥Î˽ç³?Ì\föåðþrïóœçù~¿÷œ{¿çˆˆHrø.`N7§›C±ùבüôeÓ—Í?Š›40½jzõ€¤]I»¬-Öýf$6Æúè~‘~4Ÿ‘—d‰$b?ýÜTŽk`uÖê¬é³BñΰtX:ácohßß¾Ÿw`è«¡¯F G !ãF½ÑoàEãKÍñ‹À3'ž9aº ±ÏÆ>+s—Î]úܦPAÿsPVRVð]Ìw1Ê Ú0O¼*&˜À¸áâÕ—a¼›[7·oâ/Ë}Ë}–fCüçÚ~ô2/”;Ê ÜÀcƒêÔõFú}ý¢~¥–« U15S¨£b€_°”¥‘5ƒ½µ”""?kà¬å€åÀÄ4èÏìÏ„À/xexá÷|ÿ“GàÍÀ›>ÿ>ÿ>ÿ>ðtyº<] ÷é}z_” ÝìfwT}ÿ¡ÿ!ü«l¨m¨ÉàÂ>ôÇôÇ=–VKëÄ4C¨\‘¦‹ðvÝÛu0þ€ží ´ -C˽N¯Óë€Sœâèqzœ¼ÎjVƒöWMÓ4жúÛümLêiaû¬/³/Àò­åÛ‰iü3ìcÿãüþU¦U&`$ìÌ^í¬vx¨—ꥄߘð³'<‰š!…†ŒáÁ®ú:}|Z·Ömܰjúªéÿ×ùÃ{%+*VTDí•lIÛ’6мÏûÄCp"8 ½¦½†TêÀ„ "±1nÔýžoðüS{åS{ºxjÏcOç ößK2îZ¸õIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-45-grey.png 644 233 144 6214 14774263775 16015 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü AIDATXÃ…—kPTǶÇÿ½÷ž·yTð‚ÁÀ`ˆ!>P1RŽ€XH4šK¨˜&Å(*¥7FD Îh"A¨@bÇ`|äš„B |\ÔQ┈3h!" 3„™aöì龘ªœJe}éêÝ»×úõê÷^›äçççççÃãfo¸8á¾p_¸Ïêó¿Ïÿ>ÿ{6Ý0`0 ¬Œb,€ìß,ÍfH3lrÕºj]µì Á!¹ˆD$"t¢6a6±/¯+^W¼Nr…>¡Oèk=B†É0Þy¸`ZÁ´‚i· Ó Ó ÓI¿&…Ia$yœƒ^órùs€±ˆE,wЍè5Ñ.ÚE{ðBC¡ÎPwª[ìûÅþ†ŽyŽyŽy >Ö”iÊ4e8» qAâ‚D’#‹‘ÅÈ€… ¾¾oÜ÷¾o¾Ïß„o<_|Oðfpóc~̾C2HÉ+ãÃø0>ìâQûIûIûÉ烂‚<Û;;;9÷\Ó\Ó\IQä*r¹p`vaÔpÀ€÷ñ>Þ031Wˆ+Ä‚ÓUÓUÓUæ¾y!òB$Ýþ4éiÒÓ¤·KÔaê0uØR¥'ÓáÉH(cz¦gúûïpË8šGóh½ÎœÌÉœ!ÿÅOá§ðS.†‹6Ñ&Úžÿ·vµvµvµ›éÊteºøÆ3FìŠ÷ï)ÞƒD×ÑutÔô½Eol%[ÉVô}Dt.KçB­HQ¤(R ùæo>¶ùØæcüGÚW´¯h_‘bE‡èÏÿ›×ð^s1ÜÇãã#{¯í½¶÷ M•¦JS·Úß°¿a#}¾¶\[®-—RôÉúd}²pD Fhí¢]ð#WÈr •¤’T¨Bª¸à‚ €rÈŒ§dÒшFÍú4 Ø»zï꽫C¯¡×Ð ì7î7î7Ãó†ç σŸÿÿþ; ×AèãññqR¸.…/Î xð$à ¾xY÷²îe©ðÆ“sg¸3Ü€e±,–5 rn˹-ç¶ž>xúà)€D brÜžbO±§~Ñ~Ñ~ÑÀ÷>¸÷Á= #9#9#H›™63m& IÔ$j'¦É£›£›£›I…ÇÇ'¸†\C®!ü3*9*9*¹ª&U“ª ¶mgÛ¡Æc<Æc€‘"RÜ4Ü4Ü4¡¡¡@2H¤<éžtOú$hO^O^O Ò«ô*=0X>X>X(7(7(7Q £F-„ÂáÀžeϲg!¨zU½ª^8f½:ëÕY¯"·m¨m¨mû9ìÅ^ì%‘¾ÌyMÁN³Óì4@Nä0004º].`ý/ëYÿ ?'?'?°ÖÃz&AŸ¬y²æÉ ï~ßý¾û@‡²CÙ¡ŒÁÆ`c0Pf(3”€±/Ǿû ½¤—ôNÆçÞåÞåÞp‡pˆD ü ~?ƒý8²hdÑÈ"ò²"…H!xA(Ê„20ïDRm­¶V[È#?Œüˆ¼y9ò2 îw‹»ÏÏÏíhG;°Ú´Ú´ÚÐfÚL›PM¨&T ‡ÃF ¨¤¨¤¨èðtx:<À|ÌÇ|LÄãímö6{º¸.…Ka?rÊ"e‘²H*íšÖ5­kû±=¸=¸=@Ò§m³m³m3з±ocßF £§£§£(®.®.®H+i%­@Ã͆› 7óæóæóf`tçèÎÑ€ß>¿}~û&3­ž­ž­ž È—É—É—NÁ)8…‰a§%Ï’gÉ,½–^K/¾Tv)»”]R©€T¤"µàˆ/Ä ñûò_k|­ñ5Ï쮿pý…ëü=ÿÅþ‹ýcd“s“s“~T ±Al€Ê¸Ê¸Ê8`é'K?Yú `K°%Ø€²Ûe·ËnOJg}Øú°õa€9ÔjäÅòby1¶8lqØb¸|ëø5çל_sh,‰#q$ŽûÑѵ’o_úö¥o_® \¸r¢Çžeϲg½¢]®]®]î٦ߪߪßÊ—" IH‚ h@’I2I& dyÉò’å@ÂhÂhÂ(#ƈ1"0X3X3X™‘Ð]×]×]<³ë™]ÏìVµ®j]Õ •••RQQA7ŽÝ8vã§VÛÔ6µíÖ[î:w»nÉ×dσ=ö<ÐŒf4?[. È®©FkFkFkž×'LO˜ž0Å'—ü]òwä’4$ IC`ÂFa£°d,k,k, à;ùN¾ÅÊbe±F1ŠQµ¨E-àŠrE¹¢~¿‡ßVÁ*Xáø=æ÷˜ßcvÒ|Ò|ÒŒ_Uf•YeKb<ã¿ s0s:²8îw„;·pÅ\1WÜ»•š©™š3Du“ºIÝ\ ¾|5˜½dúØô±écü  B œ¬õ±>@¹V¹V¹e˲eÙâ‡8€%±$–àŽá ¸¬¸¬¸<82Ò2Ò2ÒõÙ“gOž=)Í–Yd™ Vb%ÖÝ”,!KÈ’Ž,”¢¥Bˆ·ÌóÄŒ×Â?H)#e—²¹Ü nÅöZ衇žûºŽÔ‘:"m±~fýÌúÔä7òù #ì;ÀhBš& á Oxßà|0-Ó2í„ýÎUŸ«>WíÙ6|pøàðA¡\ñœâ9Ås?j‹´EÚ¢’‹(@ Èÿ 3ÌR‚¯Õ Ýè–n#9È!µQÆ(c”±t2S™©Ìü¡p8`8`8@°þôsÐÏAžm¾€PA\˜Žé˜À 'œ“À,“e²L0²ì#û h²4Yš,,¾ùBó…æ |©&X¬ ~8&žO‰§v|~»àvÁí€Y˜…Y0Õëæ¸ÔámÏÐ)t ‚©íÚµ?Ä1GÌÙñ¹&@  ¸¦³®³®³Ž/­³þÍú7Y<É&Ù$ z‚ž 'À¼à`6fc6€HD"œƒ–AË ?4D7D7Dcª¦_Ó¯éè"ºˆ.Úñù¸ôŽy¥Xî]f²ï0Q€yIÞ®w‹øÒñSîÙFbI,‰_7þËq±Ú½Å½Å½…~ô6}›¾M¹¸¹Ås‹çãuz‡Þ¡w ææps¸9pI¹R®” ÅÁˆƒ#<Úþ%ýKú—ðw•ÑÊhetéÒñC³ý_´‚VÐ ¡Ü»³[};VXXXXXˆ_Fá}0¡!¯v·yµ[îÕnÍh×]ç®sK[¬‡­‡­‡¡æ8Žã8Ø|™ht6:Ôñ°âaÅà þ®r·r·r÷í³®^W¯«wwÉÝUwWÝ]xgûîS oôOÀ¾Ô^×½Ú­þíΞ1;^`ó÷0„! Ñ™¾ð&Jú3Áߨ_h×€zÔ£ÞSÀjY-«Õ™¹*®Š«º>¶vlíØZú¢¬BV!«à:x=¯çõ®DTETET­ÔY̳ÅLÎÓ`LƒÙQ¯ß:/ ã¯88üýI»ÞëÂS€ld#[h%é$¤ÿ_«gõ¬~çûªYªYªY\ßÍwóݽ³è~ºŸîßòèÎ[wÞºó0ˆp¯?_aéü;ŽÿÇ+bQHÇ(IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-113.png 644 233 144 2674 14774263775 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜqIDATHÇÍ–]lSeÇŸ®Ûº&ƒ¹1" `¦!š‚)‚ˈ dÆŠaŠ"»às¢¸+ ! „D"øÅ72‹A(ÎÀ4 aŒd’mC C¢‰ŒM¶¦¥ íùx^ô¼=Ó…ÄKž›Óçëÿÿ§çyŸó ˆˆÈSÎS oFÞŒ¼‰Y?o½/z½èõçOeýÃxÞö¼}}”*9PÚTÚdG]_çuýØ~,ŸŽËSâ|§}§=‹¿Þýîì¢ÉYÿ‹Ëàø#I6ü¸áG€³ÇÎãc¸:p ¾8¾\_çu½î×xcñ¥ñ?ü"Pp¾à¼çOðú EàÙ¥Ï.}î“lÁïÏAðàw½w½*¬! ˜bµH@Ûð_çzݯñ4¾æÓüY=åUåU"°ü½åïùd¢'0CÏ„žÑ|F„E|ÄGsÒüÙüÀZk­% 꺺¼¢*U%pL­Së¬]Ö.Ò|nî7÷ƒú•5¬¡˜ï<|ÓáËñgõ¸¯Ò9°j¤Fr‚:TØÜaîÕgݰn`8 ¥ÿVaÕ«zU/®yñâõšªQ5(à<ç1ÔÓvÐUY|¨)¯)j~;l/~þ¿ý'ò¡ïaßC €jP×Ô5RÉÑÔ„Ô0þ0n·gÉÑährŒ&£ÉhrãÆJc¥±†^Z2´Ì}™S™S¤œt5}_õ}àOø‰|­Çv¸Áº u4œ=GUsŒ9?ÿ>þ=jahaýÂz¸P¡þB½K<|bøÄð Xа aA\¬¸Xq±”RJ)X´lѲEË ôPéÒ°âÛgWœEeÎ¥Ž§Ž»|,ߨ³±GÏÞávGXw/5Oož® ÕÚdìÁ—¾$=?<óüÍîÙm«m«m«u…‚` èæ»guÏêžçæž›{n.Ìž7£Ïl½Çì"e¯µÚAÅÕ ¯Ã^m¯¶W>|ø€zè«Þª³êÀÚgµX-`O3v;HqQãß.¾] ˜þ¿üÛczÑX5E5E¹õØV‡Õ$íwìw0œÝ¯ ÷ÛÙ°$I2˜˜N%(ÙïÛïcäðrøšoÜæÌ·’ÐôPn¯`û(v_±õõiP—Õe7N¿ÆÓøýV>±·‹'ö>ödÞ`ÿÚq ò—XKÊIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-12.8.png 644 233 144 3160 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü%IDATHÇÍ–}LTWÆß©Ì)²F×ÚMí"UüØ%Š­RíLTÖ˜46ºnCš¦1Ɔ„´v Y­QÐhãbjhÑf]t, µ‰„ˆ|,¬«i¶²‚¢hu)BœÄÁÁ™Ë¹ç·Ì\†m7Ù=ÿÜ<ïyÏó¼÷=÷>爈ÈôèSÀ>Ë>Ë>-‚íˆÅo:ÞüÕŸ#¸R­ÐVxícHþ,ù3€”/R¾0¯Ç°5oåO^/㟬gÅeºÄñgâÏØVDqlš·iž#=‚´‚³ÖYûdÞ­{·àë꯫y::†W ¯€¶æ­|k½Å7™_Ê~¢/Ï}ûÜ·¶»?5~ªÌ.˜]ðò‘„Þ—ak àÇ)?NÑvP> ‘D½ÀþIØšæ[ë->‹ßÒ³ô#õ¤½‘ö†¬Û¼n³³ CDäúWðáÌg¿0jù’2ÊH§â€ÃãÇÒ7?5?Ju©.Ð×ô5à©Ú¬6‚ñáñaàO|Îç$ê¿EùNìªÙUcxý+¾\ZrVYõÈïmy>¬]? ú£]ÿ‹ìÐwõ] R°cGëEz©^:Ñ)´G{´ôwúо‹“¬ê‡h=K)¥0€ AÐÎ?‹×»ÖOt°<ÒVŠˆüú08Î@ ŽË7Þ<8AûÖ“G£/Œ¾@Ð8n7ŽÇôŒL#ÓÈ_–/Ë—F™Qf”M*¨˜bŠc0Ü Áƒ5Þ/ÁñÌ?ôNé´:kœ58«¡SD¤² Š>)úôoÌùþR_)äÊõæzÑ i¨n¨Ž ­n^ݼº’K’K’K ï@Þ¼à¿è¿è¿ËÚ7´oh¸n¿Ûs2ò2òÐë²Ý/¹_‚±å=xïÐ{‡@ïŽÔc'^DdI½ÈÊ-+·ˆŒ±å¼Õï:â:"áK;/m¼´QléÇÓO¦Ÿ©;[w¶î¬È­…·ÞZ(2²wdïÈ^5¨ՠȉ«'®ž¸*£¥·¥·¥W¤§©§½§]¤qiczcºØ®ý¾+¥+E­ó®,½²Ô–#âšãš#¢«¢õ˜öÍ´oôn ûhì#‘Äó‰ ‰ "íMíMíM"UUU"‹+W,ékëkëk±WÚ+í•"wêïÔß©q¤:R©"ý;úwôïñj¯é5Eüßùj|5"Íx5ãUI“-OGžŽˆÈõ½ÄÖm[`e`å÷—eNë­?ˆÈ¶G?‘p~J¾#ß!2£oFߌ>ª¨¢J¤`YÁ²‚e":/t^è9˜}0û`¶Èí–Û-·[DDÜ îw‚Hqmqmq­HyrùÔò©"¥ÿôœöœ–ðÆGkﯽÏvé¬ׇE¦$½Aï÷—£vQÙE»‹v[6çÃx`<æèâÿ…BMÂûÙÏ~ ‡.º&ñ¨l• œ¶ôŠJŠJ3ROÌÇ´ó¾ó~ ó¦qÓˆù˜¹É8gœ#È\ )ÖåQåÕ¥ºT¨jU­ªAoÕ[õV0óÍ|3ø.\ þ¡”R ŠÃÞ°— 93êc§o½rëçmçí@ÿ¶|ìgο!~Cü„¶3ªÎ«ó€2ß1ßÁÀˆ¾ñƒ à 1 EŸ!žòxÌC¦Õqs›¹ ƒjRM“øÙàØàøŸÎÿ“³Ò:»¬³2BP ìa‰±-Vo«· nխذA [óŸDt½Ågñ[z–þÄYùÌÞ.žÙûسyƒý lò#Y¤cãIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-27.1.png 644 233 144 3074 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜñIDATHÇÍ–ýO”WÇÏL±2ìµñKHÊK7D›:F‹)mµÛbyq­©SÜÆ¤f!YŠfí†DDY¨±d—h‚Í*¨k‹F(o?´jº›m ΄’€Advyv‡†çå~ö‡™‡gÜý¼¿<9oßïyι÷Ü+ ""ÞØWÀæNs¯‹Êî_9úÄ݉»3þ•[Mp•¸Jþñ[x®å¹€ÔK©—¬ûŽlÛmÿøx?žÏÖ‹WÅÚ®µ]®‚˜\û7ïßœø|Tþýxz<=a>¾úñU€îöîvŽÂÌØÌÀ|Á|8²m·ýíx/_êþ‡_Ö|³æ×$¬}ví³"þfú›/þ:êxö¾³÷€ég¦ŸQn0ç€d’U"„½‚q²mùÛñ6žoóÙüÑ|ÖïZ¿K„?¾§½§yÚ¢÷;¹PÓ^Óª@ïá<Ýt“L¯ñ¥ñ%¨Œ­ÆV"*d}m} jÜ·ÆÏT®Ê0«Ì*",sƸ@2;bx®­µ¼ßÉ•bw±ÛÓfç#Oö¶é ^*Ë/Ë• ¨ßY‡¬CèêuU]E­Ö(Ì 8KEýÝѪcƸ1Ž®üæ¤9i«õQÂeV™e'ØôF\+ED~~ž›žOG(Y,Ð À/O>Ê{”Ç¢ñwÃ4LÐ?ÐËô2˜«ž«ž«†`K°%ØóçÎ?„å³Ëg—ÏÆ%zžF1¬…ŠBE,êþ(><pÏÓëé %Øù¸É©Þ"o}ôø£Ç)Fh9ÓŸéW[J?x»óíNéÍ(ÍòfyÅSr¨dsÉf‘Ëk.'_Nɑɑ¼ž¼ž¼‘ 6 ˆ´eµeµeÉê2ŸŸˆh_h ZƒÈ[—ö”ï)Oÿ®U^«”^‘Ì¥Ì%µEýæ`âÁÄ#U½EŒ""÷jàfÊÍh?yíÝkïªÊ—Ögôfô±ÿtçðÎáÃpÚ8mœ6œ ¶¶¶BzFzFzLÝšº5u˱/]8ºpråË=ælœ¾½×µëš¯*M£3Ø´[z¯FHK™H™P]0÷á܇0[8_4_Ó©Ž©è;ÝWßW٩٩٩0xfðÌà‡¸<¿<¿<Î:wêÜ)G¿r`åÀʰ¬kÌíævs;lKÙ–¼-¾z¾;ÐpüÍÿLgNg¬»µî–꺽ýÞ~ëGJƒ¯_uŽýgžÚ…ÚðÕùê|u0’4’4’äÝõÝõÝõAFEFEFhõZ½VwúU¿êµ¤–Ô’£ßqblj'à«ý=»zv9|æÊìO³?¤¦¤¦X?ŠùyÒkI¯©.XL[Lƒ¿þí†ÿ†ß)yódóDót¸;Ün‹ƒÅp¼ñxãñF(ÝTº©t“C¬)Mi š«š«š«@»­ÝÖn;vß˾M¾Mð—Ü+êŠs¶1ïM»¦]NÅÜZ^þþ[‘×^IXãýÎû‡w¿_)ŒÈÊÀËÙÙ"McMcMc"ÂÂÂ"ÞFo£·Q¤b¢b¢bÂÙìú¨>ªŠŒF#‘Hm¤6RëØ “  DÒ~¶QÛ¨ÉJ¬‡]9C†‰ˆ„ Bß­ÃpdÏ‘=vþÖ+`Þ0oD‹€7·¬Õ9]w¸Ã`†fž˜g*. â%!#Ïwää‘“öæoºcs ßã%¨¿Ïï³!:gÌñ•ðJ˜Eósóºy”©Õ"X³Ö¬5 ªL•©²8ú‹\ä"Xb‰%À4Ðà˜­r½OïcQiöóoõož€'à̱ÿŸü+û\û\À?c“Y3oš7YEV:FìÃÌ3DXf9.1 ø7A‚«®«ÒªD'l˜½ôQØ—¸/Ѯԓ?vWR| ø@Ü]ɧ/|ú‚ͦ÷õÔ“ì´ÀìNÚ?Àûæ™sî¹ßó}ι÷{¯€ˆˆ<ÿ X—Y—YÅl뾄?ã…Œ~ö—˜Ý®ƒåU˫׃£ÅÑåÉò7¶9oÆ'¯Ià'ç3ýò˜$éçÒÏY6Çí:x}õë«3~³O^{¯½w. o~òæ'=gzÎP SW¦®ø7û7CÂ6çÍxs½‰—Œ/u?È/©ý©ý–o =-=M–?¿üù¼ªX€7¶½¼íe€qÛ¸MY@Ÿ2ÉT› AÌ1“d›óñxs½‰gâ›ùÌü1>ÙÏe?'¯ì|e§ýC4‘ÝP³´f)°@륃:êÈ=EOþý.úõwã¤qð¨Õ ÆÔÖwê;‰@Ôõ­|Àdªá8^}õ©êS&ÁÝüy{h{Èþ!doÉÞ’èiü{j ”†JC ª´/Õoñ€º§î¡aSsj¥~«JTÉB¥P‹ÕbµøÏòlÂÏbR!”ZgdÙh€ê÷qü{¯…_ ›OmIj¥ˆÈ“{Ð ¦ðõí¦ÛM °/ÍBΓyÍ£y4O"Ÿ¶CÛ¡í€éâéâébˆÖGë£õI„ê©'ÉÖviõZ=L?õm÷ ÌkGbøà}Üû8ð™½ÛÞL1ùÿiÿ*Þ©xÔ/Œ5þÆé£ÓG¡èí¢Æ¢FÔ`î kÐJ)¥lpopopCVKVKV ”6—6—6C¤/ÒéKš­ž­ž­†­g·vmíG­£ÕÑŠÚØ\ô^Ñ{àk2Þ7Þ7Ö@å®Ê]`|ã#ê–ˆÈh5œõžõÂÜ?ÔÞõo8 œDÌºŽ®]1º.ä_È¿…3…3…3àŸ÷ÏûçÁµÄµÄµ†ÃŽaG‚˜gÒ3附•®•®•®„¿¨ªÐQè ÒÔtfÏ™=j/ 9‡œM‹ñ‚‹..º¨Îqsê‘©G@UÆÏQŽvW» ©))л¯w_ï¾pàXàXàlªÚTµ© œgÀ€û5÷kî×$⦎OŸ:ãáñðx†Ž½;ô.üüOhOhð×ί>þêc€`^0ŒõF¨sVù‘­ÜVÎÓr=µ!µADšEDÄg›J]žº\Ä–k˳å‰dÌgÌgÌ‹LœŸ8?q^dÌ3Æ ‘>oŸ·Ï+’³?gÎ~‘‰‰ Y9‡sçiu¶:["µ©µiµi"ÿîHíHùõïŠÊŠÊÄGydYd™ˆõ³4{š§S£Ïè³\M[ª-•§,?‘l‰ƒ‡_ ¿~Q$mWÚioˆ\Í»šw5Oä@Û¶m"m«ÚVµ­™­­­¡“N:Ezú{ú{úEB¾/ä9±ñÄÆEÿÔØÞØ.òçîÜÝ9çj×ç®Ï%ûÉkŽNG§•z©^j¹?•£Õüí£O?úØÛcñNDeJ?”#¶Ûˆ-Ñ¢:_¯Îë2Öe¬Ë€.o—·Ë 3-3-3-°;wwîî\ð{Š=ÅPb-±–XÁ}Ï}Ë} Öüø™þgú‰\º2Ò:ÒªöÂÅÀÅè¿1÷ §òHÅ3­±¢ÁhBÑ!\â—…B%ÉÃMnr8ÍiN'ùutt’G€ ô} 9_…»ÂmêYû SöIûd0ã¶v[K蘱[Ò†˜'|ò0ÂèõƒúAÐëô:½ŒµÆZc-PJ)¥`¸ ·áµ]¹•ônÝ«{A¿öÀÿÀϼÞÃWÃwòïäØïØïSè1u씿,½,}A¿d.þgš±Ç؃IY¡â ó=ß'ÕÈWh> ÿ±Í؆†_Ô_ÿA™¥Ìò•ÿw¥yw™w%ñ»-¦å™‰ëåz9P—Õe,X a›ó ["¾ÞÄ3ñÍ|fþŸ‡ùuñоÇÎì§Íý#±ŽµIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-24.8.png 644 233 144 3211 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü>IDATHÇÍ–ýOÕ×Ç?÷ \. š›ªÑ©´ ‰<˜Œkj15-ñ«RujÒI}hÕRgš¡Ã&c£ÖfE­Ý©XÅ!T¤”B[í¥v¬É¦«1P6¤†:/ —ûðýž×~¸÷Ë¥s€ç—o>Oï÷çœï9ïsDD$.ø0Ï7Ï7ÿ$`›_ ù#WG®^|1`ŸÖÀô’饻¿…ØâØb€øóñçõÎmÄü™õ"!ü™|†_â$ä°\¶\6­ ÚoÃÖ¥[—FÎØ'œ`­³Ö=òÃkõ¯ÕÔ–×–óôÝÿ5ÀȪ‘U²¸‘oÔx3ñåíÿáðÆðFÓ¿Áa‰™ 2ý*н6dmÈø~Ö÷³”´ šhµ gc ΰx0ߨ7ð |ƒÏàô#ð|Âó"|¸qt㨵,PÐYÉ™¼ò¼rP7|uüž³œ%üþ-OËÃÃqåP \…«pÕ¡:€)m»¶øGü#À‡|ÄGD«¯‚xòªóª;+ùËFÏFµÌèG~üoO¾È3›36g€JðÝttP¿Ósô|ê_ªEµ Œ%R9j‡ÚAh<úÑ ÂSÊ­Ü(5_Ó4 0É$(kÿ盳6O¯àÉgüJ‘Ÿý‰fëë…ñ0èNìNß/X7ôÃ{?¼Ç¤/ßW᫘AØDMà9è9è9®DW¢+qF¼€ B¦×éöÃ6ô×ô×0éO àC÷¬îY€ÓZm­3úe9Ý ¹ÇsØ@Ou\YS±¦bߌ={•q9£2£ºººB„GÆŽŒƒÌ±Ì±Ì1#çGΜǸcÐ1¶ŸÚ2l¨ìdÇBÇBp¯ ðÁë¼þ¨‚@?âŸ+"ò°·Ú[í­999µeµeµe¡+ÞY¼³x'¬Ü³rÏÊ=!ê®”¬”,øsEi\iƒ î©{ ÅÇ,ˆY w˜õoýïøß1uHmTT¿H÷ŸvÚ- ES'bNĈä8s¾ÌùR¤ÝÝînw‹Ì®š]5»J¤îpÝáºÃ"‹,:°è€ˆíííÈ\Ë\Ë\‹HåþÊý•ûE¢†¢†¢†Dì}°÷Á^‘U£×è"ƒ¨¨±´EÙ¢$AdÊ5å‘c*]¥›:D{ÓØc ¯4¼W;Ú>nûXí^½íÏ <ëâ×YÖY Õ–jKµASkSkSkhæ×ú®õ]냣ޣޣ^ðLz&=“°>w}îú\JJJÒüÒüÒ|HN7§›á¬¿ô\é9c«Ýü³ÊYå*ýåât+ì[³oA§§‚Ö¤5cÜçþ ݺ¥n©[à¿î¿î¿z£Þ¨7%”P*[e«™‡ B {´Ó>íU¸´d-øÄàÛ÷Ö¾·=x*© êÖ.k×x˜úªkY×2ÐþÐíž÷‘÷“ÚqÍ©9A5¨UâUÕEuôSú)ýp—»Ü=BÐ#€le+hÓ4Mí7Þo “ú¼ Ž}Ò•Ø•`ýÎúÝx÷ƒ:ö˜ò{·˜¶˜€¡ 2jÍZ30¬¯××ãÜ1hh€‡)¦€ &˜Æàb€`&(Ðwé»ðáѾо0¦å» ["·Dþ_åÞ•doÏÞ>ã®äмCó¦ê€wy—hðûÇ´—µ—ñ€r*'&L²¸‘oÔx¾ÁgðOß•Oìëâ‰}=™/Øÿnó´y?¥IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-XXX-red.png 644 233 144 4055 14774263775 16061 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜâIDATXí—lS×ÇÏûa %Ì#ý#ìâǺ$J ƒ4ò;´M‘ˆùQ‚¶"BÀµŠ +¤D¡d‚´Ð h ÖÈØÐFa‰´5S@@$&F—V›šVlF¢1âdNmÞ}ï»?òî{ÏV š¶ó}î=÷œÏ;÷û&ì§”bâŠÉÉÉáßú@椮I]“º*%3™ÉlàTH…TLLkÍ$“L2÷T_kæñ|=ÏÇó§ÖW¤òXù꩞êEê|öÏå.¹Kîò?v ;…ˆ=k$k$k®¾Q}£ú°öîÚ»kï®"W‘«Èôù<çëy>žŸ×{:‰¿Nõç~(ŽŠ£âh¸wh–{–{–›yÚûÛûÛûµçbccH !Ž1Œa @a„Ã×çy<_Ïóñü©õæ~øt>rL#bDŒ„ÿÂ].º\tYY|Ž#Ý´|uX†Âö&Ô„ °EJR°*ö&{`‹Ø¶`{•ç•ç-_íQ{ ðõ<Ïo§ÔwL3пàüDòAù |°ã ¾ ¼¹¼¹¼Y©2ÀöhõZ=bJ‡ò™ò …1€I#¢F« êÊP ©]Õ®Zx"JéPGÔ@Û£•j¥ˆñÕ¼¯Ïy8ÙîØîØî¼òKàht4:µy¡¡¡x¬ç‰±÷Ù¶¦Å<>^Ïx=ÆæŒÍ\Â%K1±—^|éE8ýÝéïö¾51^×ç<Ÿ\'×Éu×ò‰ãµÇk×j¿ÑÄ¿ò±ò1¨nÕ Áswú;ýÀÄë ù ùÖÚì6» Ëú—õ@Îõœëá©á©f”âO>L>4Ü8¯ot6…´hV^V^VšU>ª|TiæN8Äp×@}W}× äñx¼úðêÃæ“± ² €(¢ˆ’ºgc¶4¾%¾t.è€9¡9!˜Ö6­ ¶¯Ùn• Ô—Õ—£ÅÜŒzzRÎÃùtPœw ¸\æ¾±2VÆÊRtÄÀRÜ7ØV¿{°{ÐÚÁÜÒÜRNÉcƒ 0Žqw`ûØ>¶ÏLîZìZìZlœÛçEý˧‘þH¤Ÿ‚ 1!&D’¤mÒ6i¶ÐÚBD£4DCDDt›n ÅB±õh;ûùÙÏ­~ðíàÛDDWn\¹aW;ÕN"JReÑMúš¾&»Ån±›t0’¢áh8¦ ç#±J¬«ž é-n>UªþT½ES˜Ä$K?ìö޵A>ŧX;ùÑ'}ÕžjdNÏœC•C•€y’jǵã;Ç:Y§YïbËÅ–‹-F'+BÁ“!’–HK¤% Mü-sÎvÎvÎfsCëBëBëLék¥¬µ[ø´{7ïÝ{†=JšJš¬ðíß~Â|a>¸6¹6ˆëÓ¯ª£ê(àK|‰DqÄä5ä5ä5¨Æ eKÙRö‰Ç”Y‘Y‘YA$_’/É—|ãÀw•»Ê]l—ñ xÕ=ê$àÏ^¹ªrÈ'äð͆o6àìØ½c÷ÄôŽ?>Òx¤POL<.r_w÷¹ûÔ¸¸UÚ*mý×ú ?#J©6똭ÀV`+Ÿä ¼{=!OH+å •é#Ù#ÙЀ“ï|@ìjöÕl+˜–«åZ¥’t'Ýà¯ôW¬öüóÌ­>3zfã™xÕ¸B›Ä&±éûJa†0C˜ñ‹ö4@鯕ºIØ$l*k|‚Oðq­¨Û}Ö@«ÙO¶K-T íhÐ.h¬¼¸…[ ÒZ©¶CÛaJ)â‹´EÚççTçT¥Îèä~i¿´ß[n UQUÉ“µ˜Š©XÞO~ò“ŸHŠJQ)êé6®Ö6Ç!Ç!Åz+t9tÙª]¥F©Iœ8¹˜‹¹€¶^!…Ì{mãß7ömìc»ŒhLŽÉ±Àœ9;rv‰åb¹X.œÓéj9æTýs½tKº%Ýzæíž·{Þn"›Ûæ¶¹ í——§h׫z‘@ c–s“-d ÙBS‹G—]zt©VjÜåv›Ýf|¯ÿZš’ºÓBoÚÖ“æ^IõS&´:gj×»×»×¢]»bWì&z_½¯Þ7µ88ñã$1˜1˜1¨UšÌ3ÅÌ×~—&Åci|“ééÒÑ4íVÿ€vû}¦v•>¥Oé3_¥ñœñœñ w$w$w„-0´xV:+=²œKM—^:àOèfð?¦ÝG‹£E±‡|!_È á¤Þo·ÇNÏ= 0Ýø‚×tíþéÇ´[²ªdUÉ*S»åååøãļfì„P#Ô5e ©eÄá´ºý—ö,í®š¤&©)¼ˆ×4Ö4Ö4j¿ÏOæ'ó“Ê?­ŽJQ)êEÔA¤;R(­Þdú-]»Rý’›Âfa³° •´’Vª/ˆ3Å™âL@ ºpÅwÆq"éštMº&üU_¸>mçþof7¾UPUÈ_¤N¿U+j¢&j€Ð+ô ½÷~61>?¶3Á´¼ÏÜêÿ1cºù'ç»IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-63.png 644 233 144 2567 14774263775 14715 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü,IDATHÇÍ–H•gÇϽ殂Ó·IÎY:º ÆÆdBP†¹¸3tŽ ¡²œWbĆ ™°„Ù‚‰ýQ¬’\$“Jvé·íÖ+b0úc¤•‘ÉðNoe³ô¾Ïó|öÇ{ß÷½´þíýçå<çœï÷ûœçáœG@DD^KþüoúßôgÛ¶ÿ3o=cUƪ·~²íN¾_Íß@Î9?ÌížÛ­=Ûñ;ñ©ù"~*Ÿ³.¯‰·88æ[‘´¿…uï®{7c¾mw\‚Ìhfôo Ž7øùÐχøÆ®Ž]ˆ¯ˆ¯ÏvüN¼“ïà¥âË·ÿáôÓé§}#x%ðŠ,¬XXQ´Õ.‚ªÊªJ€Ñ´Ñ4ã²È2+€)¦p¾¿RlÇŸŒwò<ßásøm=Á²`™|\ûqmæA;a°¾Êÿ*°Q “N²èµXÀ\³ ­BføÎT˜ ³øÞ„MÌoVÈ 1C·µÇÚÀ>ö‘åá%ñ]>‡ßÖ#ÿ>Û]+aMÆš ¸jT-ꮺKBŸÐwôŒS"³Çì6»Á˜S¦Å|m¾v+ˆyÝ”™2 åªWõ’5©&?ÉçòKª ·÷@æXæØÔ¸­n+'‘¸¯Ëu9Ó‘õ†´‚kŠ5Åš`vrvrvÒ’X™X™X ±òXy¬¬V«Õêù¹®C:äâ}äò¹ü¶¿-ï‹b‘M›:_µDBi¡4S,GÔ^µWÎHØð$3¹©¿P­þšHá­Â[…·DÂeá²p™È½÷6ÞÛ( †EBE¡¢P‘Hí«µÁÚ Hâxâh⨈,õßöß–LY¥–©erÆåsù“zl…¿oƒÞG½Üج³Gf$ëœë8×q®òûóûóûáÆòËo,‡–º–º–:ˆÌ‰Ì‰ÌŠáŠáŠa˜èè腼ܼܼ\¸|þòùËç½Âé†D pðÍfßÖ#}!û‚9cŒ}à%ª­,+˳{®÷\ï¹éÍéÍéͰhõ¢Õ‹VCeee?<1OÌÓ»¦wMï‚Òm¥ÛJ·Á¼¡yCó† Öë‹õ¥Ü½uƒnH9b—ßÖãI«J«â‘ôé'œ“ ±d¡,tmyÚõ´ëi—HqAqAqÈÈ©‘S#§Dl!"ÍuÍuÍu"£óGçΉæFs£¹" Z´.h9;{vö쬇gFMÀRø\~[_DŸÔ'}7E¬j«Ú ú:|¾F¨dIÉ’’%"²d?ÈéÊëÊëʉ7Æã"ã5ã5ã5"kK×–®-hhh‰o‰o‰oɹ’s%犇'ŸÈ{òžÇçñ'õ<ïŽñ§jSm̘/MÄD¼‚ŽŽŽÀÒèÒèÒ(t_ì¾Ø}ÑóïèÛÑ·£Jn–Ü,¹ |xðaʉõp€À¯ªNÕýïé¼ Û·»Wó}žYãÖ¸w%($<`?ûÙŸB4È ƒ@„)p¿!†vÓN{ ž²âV<…Ïå·õ<¿édŸ1zƒÞàõ1­:ª^Õ«zÐÕºZW5ÔPª]µ«vPmªMµ~Cuø…ûÜÐ[õV¦í ðü>öüÎÛùÔ€Þ¬7Ûó0Ÿ}1óÌÙý8onίï÷äžóœç‘âÌWÀ³È³ÈS”Ö=M®=ÿ¥ü—J§õNŒ××¿ß ó:æuÌÿrþ—ÎMW×~Ÿ›/ââçòi»‹kÈ;™wÒ¨ÊèmðÆÒ7–æ?‘ÖÿÑP OÁ¶¯·} pê«S_Ñ ƒƒÑªh¸ºöëx¯ñrñ¥í!~ðŸõŸ5î@Þcy‰@É‹%/>½#yj^­yàž÷žWyÀž (PU€‰‰–©]û3ñ:_ãi|ͧùÓõ,|~áó"°¶vmmà ,‘›Ç õ©Ö§€?X!ÎÑI'œO}–ú ÔHª°ý½íï¹§RfÊ)$HNvO¥e˜a† &˜xh»©ßcBz/ß)sù3§2»ÇTàçÀϦç–uË]Œ¯8 Ö·Ö·$úæ9_®—ùdþÄzê²Džx¾Íb³Ø¬¶%ƳÛÚmí¶ö¶aå9å9å9 $cÎÈœ‘9#üuÍÅ5×\„ª+UWª®@¥«ÒUéŠù2.çËõ2ŸÌ/ëýá¸EíWûÕ~ÿ§2ë´ë´ë´~¯wÊö†ñ5³Àt˜t£^^ §~§~'F¶‘ †S/Ò‹À¨×·ê[Á,0³Ílt¹Þ;å½Û{7^×iWŠ+E¿×îWýª_ÖwÜb¡)mJ›Ò&„m·m·mwË7rAÙž²7ÊÞÐ+,°ç9ÉIz ÛÙ¦?˜$Ñ"I~4.ç[ë£ùä4YOÖ—<’OØ/Û/Û/?ô9ÁÑàhp4˜y¾Aß1ß1nDóŒ½ãþq?ÀÈ«#¯àíÁÛÆÚÇÚ‚ÝÁnÃm¸F?ý`,4ÁÁ£G/‚±wpîà\€ð[á·ø¿Ÿÿý|n8ËËÌ<ÉcñÙ6Ù6Ù6Ý-Í5Í5Í5æ“QÀÞ&¿¹svçl <=´ËÚe˜>^³zfõ\xêÂS ®-¸ûÄ> œöRÚKöz{=èm/Ü÷Â}Öþ‡škÞvð6óIkgø„90'Nþœ|ö ¯..0ƒf\¹§ï÷8@ÖѬ£_tÑ Ð¥wéG«ŽVµ Ð}¡ûÀ‘”#)õ¯Ô¿”!eÈíè°@õá•Ãà y$Ÿýãê}«÷­Þû2Ã;éœtV’õÖXüôâ§š;›;>(ù `¼e¼%A©¤˜¦iƯÈ\‘ ðÌÛϼËox§¶OmÕ—<’/ ʱÊs•ç*ÏY ãþÉÙ“³ã ¬ªZUßÊÒÓ¥§fžšy àçN€ë뮯ˆœ‰œ‰_ß\Ô\™›™ 0´wh/0-ø{½"vt1*—T.©\bÝÛÇäŽV—4•4•4qiB™P&à/æs&dë{szsÎ\=s5À»Î».þÞ[ôÞ¢øøäÕÉ«Yþ,?ÀËç_>„£ású¨> f¡é2]X{ïÊteº2¹$ù„Z¡V¨S×äS÷îæw&Þ™ˆ“@jÐô´8[œ@øÊÞ+{ãAF.PJ”€»ìŽúÕ§_¤¿Ÿþ> {»¼]±¨ñÑÔàÔ`¬ÞÉý'÷ŸÜoíäï”B¥P)œº&´{´{´{v4ÊS–{»£ÅÑb,ðýÖ7ß7ßJ0Kó7æo(XU° 0?Oÿ<`[Ƕ€Y×f]èu÷ºãA«¨þÀv†Ptøaó˜y €ÏøŒpˆ2!GþŽüëв´,-ëÍ"½<½<½\Û)Û)Û)w¿uáW–î*Ýel‘å"ußžÿöúÀ“Ö—Ö—Ög®±4™®¦«éþ!IН'ñ¥ˆŸК’´»Fq+nÅ Ýž1íê'ôú 0<ž=ž=ž wÜ5r׈q§¥Åµµÿ´TJ-*½dÀ_ˆ›Xl‚LðSÚÝïØïدgøÜ>·Ï „ fD’Ö¯;^w.\›Ô¹ÿ›eX¿•‹rQnû&1übjª¦j‚Ò¥t)]?ürz|¡'©3Þ¤¼7mõ¿Áåé©íùóIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-86-red.png 644 233 144 4271 14774263775 15627 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜnIDATXíW{L”W?ßc@\tv‰D„Á-Á7âÛ¨¼!•’j“A ˜ ¡Ú.[íØiu[(T«Í’âT4ºÍ‘‘në³ÜŠÔŵéÚ`bdfªckœ"Î 3Ì÷}¿ýƒ¹ß<²ÕlvÏ?3çž×ïžó»÷ÎMÈo)Dø5‘æHs¤™{ê_ˆŽèˆèˆèÈ[.J¢$J7R¥Q0aVö’H"‰LBue/ógñ,ËZ_Š'_5US5ßjŸ>Wì;ÄŽ¶ÇÜ6n·M¢qÆ8cœ8·þÎú;ëïE÷‹îÝôéút}z@gvæÏâY>–ŸÕ{6âW‡êIM¼›wón[ëPByByB¹ôö‘Þ#½Gz•É®A× k€F0Œa °Á ê~;ógñ,ËZ/©éÙøH7…·óvÞn;Ϥ÷¤÷¤÷øVXÆ-‹øEY¨LU¦Â'íöó¤ERš”HRTH‹¤%Ò@Ú-UKÕ€²P™­Ì†Å[Æ-^‹–_R_7E…Ƶqm\‘X/Ö‹õ-ß±€œ½9595¾Ø;R¯Ô —¯e<<Pl~ƒ@~E~€Ì"°x¥!i(àïkQâ•x@yGþJþ .朳7§6§ÖWÀê3< iîiîiî­]Âtuº:]’lýÅ:hÄ—ô±Ô'õ€%Ep9ßr¾cŸ}†`y /€âS&ú׌f.w»F‹F‹écåUåU5ÆeýÅúÈúOtuº÷uï+É ŠO¬«ÄªkõÌ`2˜ &ƒò¦?Áˆ¯å²¶àY±sÅN`âXÀd×d8:Œ×wßw*WU® ò÷ˆçÅóÐt»é6È?QÏd0­2­RÞT;‚GLJLJL ö>Î{œý8…(øÈö\ñFÅЗÐWo]½»Rv¥@DdD$<-|ZŸžÿô|ð†¾Žþ:6àò¯'Þ˜{cn`wó——†‡ác@÷­Û¿nÿºýIï>ï>¶”÷mÞ·°¬ÿ°žˆèõö×Û‰ˆ¾YðÍ"¢ïO|‚ˆHyª<%"š–2-…ˆèö–Û[ˆˆÎž:{Šˆ¼&“ÉDDw;¯w^'âO Âù‘à°9lY>â ø¾`ü{êþR}¬äXI& €°DXÀÓÜÞÜÜiçG΂;e7@öÃ쇰eþ–ùÁg̹ǹxo¤öOÞûä½@½¸pã µ“àR¹T.uü K…¥ÂÒšvʯ»¥»%%Y7 \¸¸>”¬üøüx˜3wÎ\Ê™ˆ3°«sW'pE\üPùC%ìËÞ— ‚E°À—«¿\ `¤&©& ÀË\×}ú>=<#þB)5ó~š÷“¬>Âtaº0½ù EçFçF牗ÄKâ¥V»zá볎g—¶3¤²Ñ¦Øx`ÎÊÌÊ0Â:¨MÒ&@“³ÉÜéÑG€Òí¥ÛƒNù“ØÖØV@n>®=®…¼Ëû fƒYQn6 ›oOèQìÔ3I8¨IÕ¤jRmÇX€q·q–q–’¥NîwÒÏÒÏP€áøáx.ï6ï¶ÀLàÁçøÜ¢[$Ãhïho`Ô'Ü'ªOTãeõ màø†±Äµr­\+㊼ÅÜm~ÍüÌ*w·KcÒà*®ðÈ/È/L42ñˆùŒ|P²”ÃÊá•ì­v]$NÒ]Ò]òU©ü@xWxט£B+ *u¬”AâÔFmÔF$8‡àxû”ú´Ò5éš|ZëNkµ&˜»òFycP?H0Ò™Q‰J@)–×Êkáan¥×K/–^”¶«/аèÝæÚ¸­q[ã¶ñ9|ŸÃµûÑÌßø?‹…a@àN'ïHÞ‘¼ƒHS®)×”›kUîfädädsW6ÊFx`†fCÂP·4Gš#Í p±qYã²ÆeJ–ú–k5ZÖ>æÿµ4)tÒ\WØè‰ S/‡êºIܵ¶qw·qwwµ>­/èpÈå‡òÃûÑ~ÀÕÕÕ¯¬W9ÍGóÑ% £âÁ0|‘ôì¡1Œ»ëÿw»ÍÝîúº}ݾn g4n4n4Xà\à\à”f«\<)œNþy%£šŸzá§Òs$àÀüwèèø´ÖVk«µ€x ^TÆÓÆÓÆÓkG<$õûÿ’D] «ë_§ÉÏ., ÄÏÝ¿ÿw3 3 3 Ü5¯4¯4¯Ä_'ìŠ: ®Œ+ãʲkBËðCau9ú/åyÜ]#4 Bƒm\VWVWV§|²Ð»Ð»Ðëû—:j‡àÆj¡j!ÿµ#XÃêEÒÿ(áÜ­ Õ3ïr\WP>åS¾<çãùx€#Ž8ºx9q$q$q„H¸&\®qüÅa“û¿‰Vý–K¹”+~jÞià^á€ë⺸®3'Ög™Ã&c ËûÜQÿí0„7‘©4vIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-17.4.png 644 233 144 3060 14774263776 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜåIDATHÇÍ–ýO•GÇÏå¥p•WcHZ‰½IKb5lXD%6¥‹K*KkÖFˆt-1m1‰ÛÚ”VêÚÅ#)‰†RS_ŠÕÕD–EZ…²Ù`bm ’Ô‡—{yž;óÙî}xnëþÎ/“ï™3ßóÍÌ9gF@DD‚³@ØaO„ÅpØ_{tnt®çL×ûÁõ²ëåÿVBüñøã‰Ÿ'~®n;Ø^·ýC÷‹8ü¡ñl»$ˆcˆjŽjveq¼²î•uÑ+ø]ànu·ÎY°·mo@Ë-_ð&Œ;þ-Àtöt68Ø^·ýíý6_(¿Tý&¾D^мäºQE=&)[S¶>ùvÀaäIx1ïÅ<€ÑðÑpþ † Øc2ÛëA{¿ÍgóÛñìø=IÏ%='Û_Ýþª»SDäö—PþxùãÀÌVþI=õÄpÙúÌú ô •n¥ãÓ†º¨.‚¾£î¨;ÀßôF½À_æ/Çך°&h þä‹?ðÌgl·¿äôKê%ån€¤¢¤"çNƒsMÌÌ‚~ÀìÑü˻úký5&³Œ1†ÆúWÈÆ¾Û÷*Keaê}ÖSÖS¶ÙìÁ_¸ªp•-°&'ä*EDRÛpF·†>út‰pÛÜiã;ã;æýëýëýëÁÜiî4wÂDÕDÕDLŸ<>y¦Ç¦Ç¦ÇÀ{Ä{Ä{$DæEÎsX @_Ù|Û|ó¿$/ Û`ä“‘O€nw½»Þˆ`& GøˆH}7”¾_ú>èL•6}t⃉ óO™{2÷ {{–õ,ƒž=7zn@lYlYl¤V¦V¦VBä©ÈS‘§ ®³®³®ÓÑå»é»é»éàŠµ¹¹è­Þ쟳¶­*MÝëÙë:zDßé?M#M#07 K6þ5cEÆ |ö¹¶7¶7¶7:Ô=¨{PÝ;ºwtï€OŠ'Å£ £ £ <4Ú‡Ú‡Ú‡œÄÉËËʲ/[—¨ŽÓ­§[ôFÜ7qßèf¾_6¾ ô›Á:J64„Œße¬ÈX­F«Ñj<°h°h°hjÕª=äØUŠJQ)0}rúäôIÈÏχ]íúpׇðçuÛf·Í:þþ±ÑU£«€‰¸æ¸fÝ,›«9?ylòhµTöl:¸éঃВߒߒïõöõöõögŸgŸgÌTÏTÏTûÙÏ~ǯ&¢&¢&ÂkÃkÃk!³?³?³¢½Q?Eým¾Ëo\~ƒIXˆXˆ•·;n· ÔuÁ5(¦ù‚ù‚ˆkµˆˆ$kC+ßY|GÄÌ2³Ì,Yg:ÏtžéIÛ’¶%m‹HBEBEB…ÈÌæ™Í3›EêŽÖ­;*²¡Cÿ†~‘¦³Mg›ÎŠx®{º<]"+·¯\»r­HêSï¥Þ“$‘9kÎqÅqk®Á0qÏÏÜ’5]?tý "¿áu[WNyÎ[9o‰¬._]¾ºÜ¶üîò»Ë§§;v+ÙJ¶’E:|¾Ÿˆç°ç°ç°HAoAoA¯H±.^(^Ùs½¨±¨QŸîYsuÍU^×WÛ®¶‰¸NÎÞŸ½?p+Ø.껡ô½Ò÷œ*˰œœÒìK … I²>úèÆgðâÅÒÔòtžÎëßÖë ¨Kj@  ©³>¶>oÇ+ýªô+`*X•K}L»ï»ï¨!sÈtú˜*1¯™×˜×cÄ’ÜçÔ9ut±.ÖÅ!BOp‚ \Ê¥\ÀGTR"ô‚?Úͼ:à‡ág‡Ÿ¼îa÷°e÷±‡:aTaTHgžó_ñ_Lõšz [²Æ`Š)À÷ëBáÇüÂ$“<] ªD•`²è¿î¿Ìù)Œ.Œþ¿ÿ7o¥ývÙoe@`+PM51ÎûwûwãÝ¥»páÛëK)ÜoóÙüv<;~@Ï£ü»xdÿcæö¾¡Ø]›ÕIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.7.png 644 233 144 2410 14774263776 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–_HTYÇc[j˜«‘XIƒ>D+B‰lÒFìni†Ì@nTlËBY°°=J‹ÉâC`XJ¬IØ®û ØX¦°"²›±²åÊÀ*ÌŒ“ãèÜ{îgæž{oöö­ó2ü~çûû~¿üΙ߹""’gÿ dlÏØž‘›Ž3¾róY³ÿœŽ¯›à;â;òç÷ðqÛÇmù7óoª§n¬÷5Þ[/âò{õt^òÄMdÞͼ뫲ãËpl×±]YéøÇGݛݻhÀɾ“}÷:ïuò5„G㑪H¸±Þ×x]¯ù¼üry•¾¬í_Ûïû2×e®¢Ev|“ü½ªU˜Y3³ÆÊsÈ!ǪâÄÑkÞë}¯ë5Ÿæ×zZ?íG`Ó¾MûDàpýáúìR""OoCcac!Р굞ÒH#9V<µZë/c·±›eÎ[{¬=ìd'pË:ap÷¼]OcšÏáwôl}Û¼~¶W?ƒ£G tR#`•[å\á ){Ãâÿ-ËS_J©—_ëi}ñ*ù ²ÃÙáøGôOÝŸºï~±òùÒ¥;$æúæžÍ=ƒù¶ù«óW!2™ÌB²2Y™¬t¬l\Ù¸²æúæúæú¼øh^4’?,†Ã$4?¿OL€£oûÉHÛû¶L$p=p}ƒ¡’þjµUfûþm°bhyhY²ý=þ þ "•ÿVÆ*c"[B[B[B"íûÛ÷·ïg ”””Šø{ü=þþÁæ–Í-"Ÿvš¦dk~õÂ_ᯰ}ÇOÚáÄyèŽuÇ€_¬ b*Ær²"Y–,ƒÅÁÅÁÅA®®®ƒ¢â¢â¢b˜©™©™©q;–H $Þƒï˜i›isàËÖwZÏÖ·ýäåYw!\.÷ÜŠgÖmë6¨.Õ©:Ýt`20˜„Ö¦Ö¦Ö&ÏV+P%ªD•xðOOO õlëÙÖ³nÞŒýF¿÷jý´ü ùÔ$ÌÏÎÏFúo¯–Ì—æK·lbzbzbŠÏŸ)>ѦhSÔcLeªL•ù|s´9Úìñ‘§R*$õ˜±õm?ïì˜ù¥Q`¸ñ¹±scçÆ ¶»¶»¶ÛÍG‰Z¶¶lmÙêæ/ž¾xúâi¨½V{­öš‡÷–ÙavËÖ5ôîŽeˆÄ«âUŒ‰<|ððˆ""4ø‚ìe¯¬èK½>´>´>$,–ËÝËž ¥B©ÈHáHáH¡H¢+Ñ•èÉÍÍ úƒþ ßÅû6ûr}¹"²Æš¶¦5? ޾öc¿eÃpêÒ©KÎÁ|F܈Ê™Cé5Î8ã@˜0á×&•…(”]³ÿ‚^´±`,xõ´~ÚÏ›sŒ)sÊ^ÙsuCÝ ¡~QÏÕs°‚V½Uïn§v0—Ì%s ˜`‚ Pãj\¿¿¨jTgŽi½Usìm“?ëh–fI€9jޝTª#ŲÓAP˜˜@Œ1§wðŠpñªA5ó±ùØË¯õÞ˜ü«ÞJœ·r[ã6‡ h¦™çˆ1›ÇYë‘õ>pc½¯ñº^óiþw¾•ì×Åû=öa~Áþ_TR}ÒÿãIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-16.8.png 644 233 144 3135 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýOTWÇŸaZ^œˆ)Û BkSS‚ ìª)jÓZ+PÁ¾@ «N%MÓýA‰³¶¨[»niҖ–¬gqkCâK”8,w›ÝtwKkx³3‚“AÞîÜ{>ûÃÌ™íîàùåæyÎs¾ßïyNî÷Yù X—X—XÓ±ÕË'¿”üÒ“ÇM:X¶Y¶Ýø5¤œþ1€ãsÇçÆ@,6çÍúøõ"1üx>3/ %–H:›tÖ²1†Wò^ÉK^Ž{À~Î~îAÞøò/ºÚºÚx ƾû`rãäFˆÅæ¼Yo®7ñâñåðOøE ±;±Ûr’$-e/.{ñ‰·ÃCO@iIi ÀpÂp‚²€îRHQ AÌá‹ÍùH½¹ÞÄ3ñM>“?¬G cCÆØúÚÖ×ì-h""íP—U—ü@;G+‡9L è6Ý´ëVÝÊœòïï¿U¨Ô u˜Õ_Õ_eB“¡Ià4Ÿð )êϼßïëØ×a h§µl®lÎÞbê‘ÿ>Û/@ùTù¨·´>5@uê[õ-¿¢†”qÞ¸h\Œv U£jT °€DcyjRM¢Ô]×u4`šiPö0>…å%åÑžx!î(EDVœ{Ð Úøë­o}…ÝòàîÔ£S2­õi}Z_ŒOók~;½¾½¾½ åiyZ^œ :sCá1˜Ÿ€KÇÜcn¦CÏ„ña(a(ðØ;ìA›©Gø§ˆHS/Ô¾Sû¨Ÿù“¿ó5ø`íʵ/¯}Õýi÷©îS1¢ª@U *){Rö¤ìâúâúâz¸wôÞÑ{Gcu§&NMœgÐéwú!3'ó¹ÌçP[W:³Ù0Sæƒ7?zó#P‡Âz¬$‰ˆy¾úùj‘™f˪-#%%2ïý—÷‚÷‚X2*2*3*E®_º~éú%‘žÖžÖžV¯ËëòºDV8V8V8Dúûû%:<ÅžbO±ÈàÕÁ¾Á>‘Ëë./¾¼X,7vÝtÜtȼ'ï›u߬³¬)É)ÉQ-=Ó¾JûJåßcŒ=ê­Èô3íí(¨,x½àu¸–-ÿZ>toïÞÞ½¬•ÖJk%dïÈÞ‘½œ Îg†ÃáXÇ|nŸÛç†Ü͹›s7CzCú»éïªm<?>¸¯î+_¿¯Ô‰TgªSp¤:R~þè?é? ʈþö^)¼Rxz‡z‡z‡ óvçíÎÛ°úÈê#«Ä¬Y¿fýšõpÜqÜqÜË7.o\Þ¸Šwï.ÞËçï|¶äÙhü¢yaóBü Õ èŽÔe©ËŒ~›`œ7Î[úEÓ²´,yƲTDD2d$|! Bd*a*a*A¤ðnáÝ»"ãwÆïŒßi ´Z"ãj\+‘EŽEŽE‘®Ñ®Ñ®Q{“½ÉÞ$2’6’6’&âVnÃmˆøÿæëðuˆdþ)óȩ́%Cªg³ù*RE–þÈ_ù÷}\?sñÌEÀ  vE66·Ëþ û7€·ÇÛãí‰í¸mSÛ¦¶MP* … }¦}¦}&s's's¡ÌUæ*sÖ?럅æÍš@QJ‘µÈ Ÿ†š?kþŒ¹ˆÙìâgí¯ØŽôËé—Å–ý>ìxyÇËË“öïo‚§ßÓ?Ÿ€ú/ê¿èëêëâ×LOƒmë¸Î×õo1¾¼ÿ_ü"àp 8þ éît·ä—æ—>ÿ›dÂ?ž‡ÊW+_¸ç¼çTi`L™dªb`–YôYd븕¯ë5žÆ×|š?©GÀ÷Šïxí­×Þò|œ,ë&Ñ´ªi•æ‹÷ó+ö³ŸLº××ŒÃÆa¢œRo¨7@}k~g~Ô1u ø³á1Ÿ]¢õXÂÎ~Íý†ú†zMg®WEñõñõ0ý‡éO§?Em9¾åØ–cp}ðúàõA[Xinini.¤J?”~V6¬lX Wk¯Ö^­ï9ï9ï9(x\ð¨à¸º\7\7PüöÔЩ!›Ïø÷Þº½uºsg¿¶„}ßÈK½«{W§:_7ÿp¦u¦•èæw7Ø|À>»###ÐéŽtG`“““ߺ¡hCц"¸¼¼´ýì@v ò_È_‘¿îýi²h²ˆ¨æS­=-=-ZØ÷ËËê2sá‚p0f¥0ý¦ŒÆsÆs°Ñ½Ñ½Ñ CuCuCuŒ#Á¬ñ¯ñ¯ñCÏ‘ž#=G ëVÖ­¬[ÐÞÒÞÒÞb «É«É«Éƒ“Nî?¹ßöSú-ìûAëIqV:+yI2]_¹¾‘;""òPNË5¹&â ;ï;Cî;$2˜ ÌD¶ù¶ù¶ùDvïܽs÷N‘úúz‰JT¢"¹¾\_®Od²m²m²M$t>t>t^¤vEíªÚU’zœ¿´ø¢®Ï\Ÿ‰h=i"æ—æ—ŽQ!Q™¨‘¸ˆˆøk$&1 Úíö‹¸«ÜUî*‘1ç˜sÌ)2piàÒÀ%‘_‰¯Ä'’S–S–S&R~»üvùm‘ Á Á Aÿ„Â?!â=ê=ê=*bvïïˆÈƒ$Ÿd$v$vˆh=i"³Å³Å?üUÁ¡àˆüBD„·eƒZª–ÚÒÊ®”])»"â½ë½ë½+Rhš…¦È®Ú]µ»jE:š;š;šEN;O;O;E²z³z³zE£ŽQǨȞ­{¶îÙjÿQG.3ÌHLœŸXüZOêTÒÐÜÐlŸHÌ&쉮0yÌc{o"D˜d’ÉEþN:éÖ²–µ‹ü·¸Á lᑈ&¢É·$ŸæêT¾Øž°'<»5¦žcf“ÙÄ‚¹ÛüÈüTTͨ™E›wÔ5FÁXg¬3Ö¹ÏÜgî³ãf¿ù‰ù ¨·U«j0;Ì˜×øãƸ)þ§ç˜´'¶CuFuÆâÉl„Œ0o¾i¾IÜšý H°ziQ¢ÖáWÉ.Xñ9Ë5kÌâ` ÃOM~‹ï&ÿÿùVÒ´º)5×âýÀ|@¦½ÄFQCÔMu°mOm «^ãi|ͧùSßÊgövñÌÞÇžÍì]x¿\|xIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-37.png 644 233 144 2433 14774263775 14706 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÐIDATHÇÍ–_hSWÇoÿÙbÒÔÚ—Z-âDÄáÔ@«h­X¤PÃÔ‡9œmSªXic¢ÌŠ}D£ÌIÄTlZÕ¦]ŸöÔµN†L­mm¢ñOÒ{Ï=Ÿ=ÜÜÜ(íÜ£çåòûýÎïûýÞó;çwŽŠ¢(JIú«@nene®Ý°s¿²üE›Š6UÿbØ]rrFÚÀÑéèpú~}̲͸9?;_Q,ül>Ó¯”(–£0XÌq§ívعlç²¢ù†ýÓ}(‡Þj°÷æÞ›7.ݸÄ׊ÄÜ17X¶7ç›ù&^6¾Òþ¿¢@A¸ œóÎ)œ£(àªuÕV}cLø» ¶Õm«ÏÏ“¹ &6é$0Çd–mÆÓóÍ|ÏÄ7ùL~CeÊ6( lßµ}W±ÏH»­ Z€ºèÂÆ)í¸väïZ•VEŠ›²Y6=2,à ÿÔÏëçA&´Z­–”üKR§€ïh¥›!T ¡µV´V˜Ç®Xü†åÃÚžªE;Š€÷ê ˆ÷â=à‡Ä!T¹Q”‘æÉr9_Îj¨¡k¤˜`"cIŲDŸè3Ýê`†/ïd úâg(ŽGùðP<À-ôë•z%ï2P?¨'Ôð"õ"õ"bTŒŠQPݪ[uÃÄ‘‰#G`²s²s²bÏbb ùc2œ È­r+ïNãgøL~COZX×ì?¶ÿ˜I¯)ÇÕ1uÌúãøoñ¾x¬_±~Åú`¯³×ÙëÀ³Æ³Æ³ºWu¯ê^Î'Î'Î'°8²8²8‚@AÎ Ÿ»wîž…'úR×R×,>‹ßГöG \}uõU&Ï#¾..%ezùü@>¬·vÞÚy Æ‚± Tì«ØW±îLß™¾3mU²ÿnÿÝþ»àªvU»ªaÜ7î÷YqyLsi._z,~Cö~{¿ BteteÖy-oËÛÀ6ê©·Ü _—ðÁº–u-ëZ 4\. Ãóúçõϳæ5m<ÚxÎ8sàÌË/bbJLÈ!9”Å—á7ô(àœëœ«Âä³ÉgÖ±—×ÓeŽ‘å#ËG–ÃàÙÁ³ƒg!^¯‰×À’ú%õKê!H ð8ïqÞãºé$ÒêbÀð8ÍiNgù‡fˆ%šÆÎ•âÏz*gècÆ Ûúaý0ïè"BÄ÷¢Y4ƒð ¯ð‚îкH%Òô}d“l’MYBßfD4꙾ø©>6CçÒ?""ºG÷ fþ8i–ä£|“ö§xÛ¬GߣïAµðLüY;ÿ'îJ xñb³J v‹Ý¤@Þ—÷È!,ÛŒgJ–Î7ñLüYïÊÏöuñÙ¾Ç>Ïì¿Ú¶äÀIIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-28.png 644 233 144 2524 14774263775 14707 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–]H”YǶ­L–l›ôµa–IVJy‘ ±%S¢Nˆën£]رA,ôID´+Ñ®˜åTDƘh_‚•íÅÒ±†ÁB–ù‘ƒŽ–μçœß^̼ó¾-µÞvn^žç9ÏÿÿÏyÎsŽ!„³"_± cÆ&„íØ–?>?>?årØ®“ãŽqÿ}fÖ̬Hô&zÕ3Ë6ãæ|{¾¾Ïô‹YÂrÄ5Æ5ÆäEì£Pº²teü×aû×{àhr4°³yg3€ï‚ïUÐ÷°ï!€?ÏŸ–mÆÍùf¾‰gÇGÿÃ/L¿>ýzÌ?÷eÜ—BÀ¢‹6.þ1<¡g1n)ÜÐ;­wšŽ98qê< @s Ùl3™oæ›x&¾Égò‡õ˜;;W(.+.sÔ‡ž]‚} ö- €PPGNjÆ ÐÉF2“Ð9:€%,~×%ºôŸFª‘Ê$õÆiã4µÔâ´ð"øQ>“?¬G|¸·ÕßBI|I<0ê9.Ç…ò°|ø€nºé¶ùGahä—lxÚ5F§<•éccfŸQ5ª†wú¾Öà ‘Çä1]²Kv<#ÏÈ3 «uµ®ùZ¾–¯Aî‘{äPߨ$•4ÐE€Ú«öò.|LÙÇ>ÒùHçï@Py”‡Ñ?ö3À0Ì[ÞA‚m+5ùÁªAUªJB ÈvüOvþ)îÊ0@pœã8­-6kDßÓ÷ˆ!,ÛŒGK"’oâMyW~¶¯‹Ïö=öy¾`ÿc—à6aIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-32.6.png 644 233 144 3253 14774263776 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü`IDATHÇÍ–ÿOÕ×ÇŸÏ•/—åŠ4^c¶Õ‰XY…(„èµß˜â¨¸APƒ%DŒZe­™ÍJÐè"T 1ÔYAK¡ÞNJ…©ƒZB™Ö!‚+T+‚¤èf„òUؔ˽Ÿ{^ûáÞ÷fþž_NÞÏyž÷û}>'Ÿç óΦ¦¦P6½á‹›“ÌI‹?óà2´MÚ¦®ý0§tN)À3Ÿ<ó‰»Ç‡u#ß¿^ÄÇï¯gÄ%L|àÚàZ-Á‹ó!}Yú2ó<.¾!gCÎþ×;êvÔœ±Ÿ±³ î·ÞoOO6Ö|£Þàóç—üÿÓÀ/¿Ôþ ÁAÁA"°ðÕ…¯FüޓЩɩÉ÷fÝ›¥L ,*˜b cŒøacÝ›oÔ|¿¡gè{üX×X׈ðц‰ !•ž‚ž“Í-Ï-uÀy–?SFÐEà¨kÒ5‰Cµ¹ßw¿ä©<• ºT0­gè8À5î>£‚ ,ê^¾Ã¹Çr{NR¶áÁ†!•`M°&øÎÔ;ÈÏÒbÓbA½àü¸ÍmPIn³ÛŒSe©D•ˆRÛÔNµóñ—BPÔPWÕwê;_œ·I&å®×?Ô?Ä Œ1ê5/ÿOÓbÒb ƒ$ú¥ˆÈóG¹RR5} ú€ó ¿^;h´óеֵ۵ۧçŒpF8#`8z8z8œùÎ|g¾Ÿ¡*ª¨òA×Ï]ë\ë`øƒW¯òйÔÃ}±}±ÀßC> ùt*Àð#J)k·ô·t˜ø#cŒ¹cW¿ørôËÑv,¬.¬•Þ™Þ–Þ#·Fn܂ԸԸÔ8mmm†øâøâøbÝ7ºotOŒm?lëÚÖ–7,y–<Ô¯¼ôÎKïÀXº»ÍÝæŽ…]Ëv-÷“;QDÄV/’ú0õ¡H}áý_ôkq®nW¡«PfúÎõî;,ÚÍø›‰7Eönß»}ïv‘‚‚‘ÉÕ“«'W‹èƒú >(bO±§ØSäñhèlèlè¹xûbÿÅ~‘¶mkÚÖˆö|ðÒ†¥ 2sóRoxo¸'’”$B¨×BëBëT-›  };œªœ|}òuˆ·ÇŸˆ?óçΟ;.tEvEvEÂcÈ1䀦ð¦ð¦pˆL‰L‰L íÚ/´ûxìöF{#–––@øæð´ð4Hù]òòäå0õ¶c¯c/Àó~œjlö™ÙgT­¨£sNÌ9áö©v¸îê}³÷MF¾)¹¼ÿò~×Çõq¢ª£ª£ª¡Z«Öª58´üÐòCË!ÆcŽ1C«µÕÚj}òË3Ê3Ê3ÀvÜvÜvÜqõ Q/DÁŸ~]Z_ZÏð1ƒkfvðì`w·IýMÏÒ³´n‘ÀsçD:~Ó1Ð1 Ö-[¾Ýò­HsWóõæë"*A%¨‘óGÎ9DäàŠƒ+®É4eš2M"w[î¶Üm¹Rt¥èJ‘ˆ}•}•}•Èâ­‹·.Þ*2rzäôÈi‘ÊÞʞʑþî5ÜkY¸>¼?¼_¬"¾zô•ˆÖ rTŽÖ-‹ˆtæÒT]S]óøçÏ.0çÕæÕâˆÛ—— 555ДӔӔI’$Ië[×·®o…•+VÀÉ='÷œÜ™E™E™E0Z0Z0Z§,§,§,`ë±uØ:àDpEME C¿T—V—§=~¼í¢¬r²s²w,Jß­ûÚƒâ&7¸ÔPCßYéèè~xši¦ýð"±øˆJüøzt«nöyõÈy/ç=`ÆãG£×Û7~ÒÒûÏ\)ÿ>ëû¬Ù.÷¿–´-i“d™åüÜù¹üUë ¸pG~¢EkÚ„ˆú…Z¢–ˆˆMlb‘krM®‰˜ZL-¦ºé¦[Ä”nÚhÚ(¢*Ô uC„WôµúZy¤]ÊÊ–×Lû"û"¥AÖÅ4Æ4þ'PîO?7ýœíð“ŸÍæÍf@y;ó´þµþ5€;Û“ïŽÇb÷trƼ³ÃûÅ&eÔàA;Ë…ÓÇgÜ,^½';¿÷®dcÆÆ ¿»’wŸ}÷ÙÇgB ±€kÊ5 gê™8@]R—ÐÐÀ‡u#ߨ7ø ~CÏÐ÷øyš_Oí{ìé|ÁþÛÐäsaY´IEND®B`‚routino-3.4.3/web/www/routino/icons/ball-8.png 644 233 144 213 14774263775 14372 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷Ü@IDAT(Ï­’A ìÿÿó<N Qãz…5@’¤a€Wv?X‰ºà‰Ï×`åýÅ&ʉº+Ü’_vêëß7óU/?£IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-32-red.png 644 233 144 4270 14774263775 15615 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜmIDATXí—mLTWÇÏ}ŲÚP†5–mÑ v+ë  €Ö¥¦µ-­ELÀ¶¤K¬µvl5¤vSPV­›b…PÍÚÔ(Ì€Mpk³TÃÚV>l\²» M©2ؾ8¾0#;00÷Þß~`î—dk6»ÏxÎyÎóüîsþçbÒ~&¢LΉwÅ»â]Ò¿B‰qmqmqm«³UMÕTíÒÅB±P,„ÉicŸP…*TÓ‡hߨgÆ›ëÍ|fþèzrN4O$ß6±Ml“ÑóÉ¿TÛÔ6µÍySzEzEzÅIšéééåÏë{×÷®ï…§Ÿ|zŠs‹s‹sþ9oÆ›ëÍ|f~³ÞOóyE´?÷°|[¾-ßî_hv(µ<µ<µ\{õhçÑΣÆTß ß ß @AAÁÏ#ŒýôÓ–š7ãÍõf>3t½¹‡šOاËCò<Ôßn&Èý<÷óÜσ¿î›è ôè#dÆã.ã.‚Úî`{°´ÅÚBm!hEÚZm-h‹µ<-´ÝÚ\m. Œ# ¹ÞÌgæ·€£êÛ§[h’SrJN!Ô½ê^uï‰nsAÁ¾‚ª‚ª`‘öšÖ©uâ ž˜¸0qŒþÐÄ8Oñ€¾N_èÖŠJ£×[õÖp|ð„oăñšÞ¥wá3£ öÔÔ‹Ìú&É'l¶ÛÀo~eØkìÕöj#Ý}Ýísûåñiôú­Ek|ÞBo!ÀXÕX‘–AF¤ÜÜø†ýÃ~€±Œ± ÐõF½äs_wíþša{}}‘nòX|êVu«ºõâ^s¢¡¬¡¬¡Ìx1”Àtš¹ÜÓÜÓ€À¢üEù0y¬¦ož¾àØ¡c‡"ΜXzdéù¢|Ĉ;°ç‹=_@8ÿd½†²†Y ³Œ­ÎFñ Ã3sþÌù3ç³ïæê›ónÎàc>&HšùÍ$?’ `ï¶w\’/É/Ù^²Ä͉› åh9î 7@rur5@çÉΓ¿ïý}/à }hZû–ö-áöß\íYâY&Ég‚îüíÇß~üíð—i}Ú9íà1‡^øþ…ïœ9‹lÂG+>Z`{ÇöÀÀÆ«·¬ÞPµ¿jd¼/Ý— î÷žCïz´¾Èü&Éåtñ¥âKÅ—¬@MË× µB¦252ÇÈ3#Ï,ûqÙ‘xâô§#㼯{_˜0& €@o `Wé®R€„¾„>àv÷®î] ½ª?TüPñCÖ½}Úìhiv]v]vWǤ1iLNqŠSŸ£'GO|ðÍßl~cóÓŽO;Ð}¼ûxdÍŽ®Ž.€”7SÞˆKK^ÿð:jŽ‘¥]Ö.c˜«rgäÎÈÁU“OÈEr‘\4qÍ|êÞßvìȱ#˜â«÷Õ®(\>½ò镨­\æ[ÙÙ––€s‹Î-Šßõä®'àøþñ)h­Á±àX¸Þùƒçž?huò·R–”%eM\ÊÃÊÃÊÃUµæ)K›c?j?ªÍu?ãÞìÞ¦1Ve|›ñ-Àâ+‹¯FûÚöµŽVG+€ú¬ú,@wfw&@N}N=@Öá¬ÃŸx>ñþ¶ì¶làÑ÷KÞ/è«ï«'à'øUð+˜_•ù@æºõ(ÉJ²’üÞ°H,L,L,BýLýLý¬iȺð‹W=¿êym»Iª;¾ô~é%€k¾6_üf§î–ï–ZSZSF6l˜=:{`Jþ”|À'šE30¬T*• ¿'„Ð\Ù\ å]Û7nߨû-À ¥B©øÇ†I?Á<õ¦¥ÖÛ²lY¶¬þcæÇnÇTÇTc•u̘¸wâ^ ðöx{ßDÃDC¤ŒåÆr€[÷ݺ\¿|ý2ÀðÐðhežAÏ ËYŽ¿ù¶sžsZOh­\+׎­–fI³¤YóŽÆ*·žÔMÒ&iS~£Ô$5KͦVô—\Îqç8.K»Ûõl=€N:€~R? @=>èè`¬2v;ÃRjú®ñ»FH›2çž9÷·Z|K9¥œrXhE¢H©ö0kžÈyê[Â)œÂ)„âQ®)×^ýÈzZíuöº`’{§»Â]©]½R¯Œl(<€ßè2º—Qb”€±A_£¯!`†mü[É@É€¶ÝzFÔê WuÊË)/§¼,„\ ÈRkˆ®ÌÄœú¹A¹ª\U®JgÒw¤ïHß!„­ÜVn+wU[ÚÍ+È+ȋԮîÐpáÂÜâ·"NõƒÚƒÚƒáþÖ-©[R·ÄXe½åI¶$[ÒÐX该)Ñ;-Ùz!Ÿ¢}û”Iíº[#´»Û±;B»IÁ¤`RHÿAÿAÿ!|íôL*•ГГÐc¬·4™('ʉ%¿‹‘b} _¼øé¥.F»ë¥&©IjŠÔ®«ÃÕÖn°#Øì°£)£)£)éÍôfzµ,-¶(-JË;KM©…¤ x—¸ƒ…ÌaízO„vÚÚ“ÜMî&w @¯Iê8ã8ã8¾vÔFµQmì ýK’ðטº¡q1õN€±f.( i÷OÿI»+×­\·r]X»®¥®¥®¥Ÿœ7¬J¥R©4¿*ºŒ|+¦®$þK»“vs”Z¥V©í_l—Ö”Ö”ÖX0¾`|Áxð k«=ŠGñ8RÅ qBœ¡kGqÇÔ‹ÿ£Åj·:Ú_yEzNzNzıF¬Ñ3äÙòly6HB’øË…4š?Í/„rQ¹¨\”Î…nˆÙ¹ÿ›%Y¿ŠBQ¨vGOï,“ Ù ÎJg¥³ÿüùäø/\1;Ó“÷Ž[ýoælÐÛgJ£-IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-38.4.png 644 233 144 3175 14774263776 15056 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü2IDATHÇÍ–ýO”WÇÏŒZg6¼U™LÜ­)éÄŠ¥DT¬q©(k]VPÀÔˆ†V\B„®¿ !D÷[ín°ÙD]—v¦, mÇÁÚøÔZlÒ´nHiÊ ù¥‚Óa`”×çyîg˜yœÙúxyrÎ=ç{¾yî9ß{DD$!ü°.·.·Æ…lëo#~[¶-Ûõ¯]¯ƒe—e×w¿‡øSñ§žn|ºÑè‹Øæ¾/Á®gú%A"ŽÅm‹Û,YaûìIÝ“js„ìã7Àî±{jPæ-ó|Üôq•ð×?| 0ž5žÛÜ7ãÍ|/_Žü¤¾,º´è’e?µø)xvÛ³Ûžû](àÎs—›— 0¼`x²€~ˆ!FeA‚˜Ëe›ûáx3ßÄ3ñÍzfýÄ-‰[Dø{~ ?`o%ô}À ÷ûî÷AuÌ{øõÔºèœÒh˜U_Çã@ƒjTªWõš¾WßË,š6®Ð@1ü%Œï~Ñý¢I°ïšó|ÃÞ‰%‰%‘3 ß}…Ÿ¿šöj¨—æoƒ ‚úa3lÌ«µEmA©_«<•÷èO¡–ª¥j) ¼ÀO—â?F†‘Á¼: =¯=oºço¢ïvîvšß}%ê(ED’OÐio¶7Âåw–ÃüÛäÜÿÕ½¦{MLi›´ÚH¥¹º¹º¹:ËËË-UKÕR£¨\ã×€û 3 ̅ܳ§¼S^¦&–M§ƒäÀº;uÀöz{}p!Q‘ú/ B¯Ð!ðüø´Í3R2R ¡:áD T¡»ðÍÂ7aÔ=êuCÞá¼Ãy‡ÁYá¬pV@ArArA2LOOGøiZ†–±¥Ê>”Ú6“5–5fz4£¥ÌUæºB|DÛ&"òo7\™¼2 MÖöoÛ¿U¥¿Œ{Éû’—YßM_‡¯V¯_5UÖ*k•ÖìX³cÍèéîéîé×i×i×i¸²úÊê+«;J:ú;ú;ú#“››íÏö3>éR£«ÙÓì:C|„‰8oœWµ±käØÈ±P°arÿä~Øôò¦ŒMàÜéÜéÜ }=}=}=¶=m{ÚvˆKŠKŠK‚µk+ÖVÀ¨wÔ;êàø³üYþ,ÈŽÏŽÏŽ‡¢·‹Þ*z v¤æ<Èy‰Óÿ;ìv÷ãÚâÚT›•Z–)â‰Ý»Uä;½¿¢¿B~ìê]Ö»LijÇSè)YÙ¾²}e»HYrYrY²HÒæ¤ÍI›E&‡&‡&‡DÔŒšQ3"ç.ž»xî¢Ë÷"‹>Yô‰È­í·FnHbQ è›¢oDºßè~½ûu_¯ÆW#²¢rEåŠJ‘»%wKî–ˆœ÷÷÷‰ŒÆã‘XG¬#Ö!Ò\Ù\Ù\)²!sCæ†L‘Ö–Ö–ÖW·ë†ë†ˆ£À‘âHIÞš<”<$‰"µ‡šˆ%ŽÏùÜò½p<ÜcW[Z[ZMwéQ[m[m³é½é_¥ © © QSw²údõÉjXXX€¦±¦±¦1ð7úýPPXPXP#KF–Œ,‰ä]ýëÕ£WÂvè£CEõØgÍš/ÓfaNeyiy)ðihJPúAý`”„Ç~ëXÜã÷¢º{‚ &€³œål”€å¨•ÚgÚeí2—Œ£Åß´w´w@í ×£üÃòx*¹Ö1ì·í·ƒ yo`ãÀFЫC:¦™óÌy˜2V¯¯¦–ZЯë×õë »u·î#ÝH7Ò|òÉÃa8 ð'j¨‰"Ú®ÛtSF22û€} ¸-¬c)?»m»m€ +óŒÞ¥wûŒ}Ì?úƒ0Ï<0Ë 3ÿ§ñ0`˜ñF©QÊ”]ù¦³ÎY笣Q…*T‘Bh €f˜¼‰7ñ&=(Ù Ù Ù@ Ùav˜¾QE&É$™ü{eqpqpqpËÍ’ì’ì’l2ÂGð|Éœã.{¹ü™yÀ¤ …9%ƒ`.»l.›Ë”`¨7ÔêO ºF\#®‘æ«öx{¼=~e¢\Q®(GÃÊu+×­\G ʼnâD1ø~ûÖ}ñ¾ç}ùæó{õ|ú>ë­à3ÔúQ?á5²l#Û"ÊE¢QÄÅc¶ÏmŸÛ>lllöìYg^g^gfܱ=±=±=äI¡¤PR;öb/öB;ì°xoà ãq<»3Ìæ à =¦S‰º¿Õ|«ùV#ìy˜ñ0ãaÆ«É#äòˆURÏ6Ï6϶´ršKsiîטgH‘£ÈQä`‚ ¦°ÇØ:¶Ž­3qͺf]³áÿ¹6rmäZ>E÷¶îmÝÛì)ÿiÿiÿiDBTà…:¡N¨ -d Ù`ÃhD¤ô‘>ðÇ8ÆÁZ‰•X jNÖœ¬9É¿6Ð6Ð6ÐÆ~ÏÉ8'û××ü~¿aÍf¬Á¬¹÷ˆ¸|àòË¿˜_Ì/>yöɶɶ)ûÏQG£ŽFå_ÈÍÌÍÌÍd€`Zèú…~ø‘6ÒFÚr‚œ 'Ô¢µœp `®@Ki)-]X'{É^²Ó`Á‚…ß±KÇ.»Ä¿p{ûíí··³ ŠsŠsŠsŸu²Sì;•³’ágø~&3ÁuÞuÞu>ûϺ@] Žªu§u§u§YŸG¦©–j©~L7ÓÍtÄNìĸÜî€$@À*Q‰J€C5TC5û7¹µn­[ ¤v¦v¦vbÿ ÿþ'À ×…ëÂuø‘12FƬÅZ¬}óè›Gßeú2}™ø1íÇ´Ó0?„¡@(‡<äý*>«,«, è é é ™÷óoõoõoçÓ÷ñøø^Í«yõSÛ•ãÊqå8®Ð®Ð®Ð’ oŽ9ËœeÎtÝAw,€|ÿuþ×ùÀ݇wÞ} ÈXXŸ{þK¼õ®õ®À ¬ÀŠ…u¼‹wñ.8Ÿ¾ÇÇÇ:'œÎ ɌɌÉD¡¬]Ö.k‡î¡{èÈñ𠥤””× × × €YeV™U@ Èr€'Û“íÉ^Ð%‹’EÉÀµâkÅ׊s¸9ÜJ¥RÀ³Ù³Ù³y!޳̳̳ ¬,W–+Ë…}éÓKŸ^ú4 ;':':'pˆÁÀ¢ñUÎ;$ô4=MO¤šT“j`T9ªU-Îg‹Øxaã…ÎÄ™8 ´ ­Bë‚ðpòpòp2Ðânq·¸uë6ÖÜwÜwÜwí ´ãW5ÁÓ‚>³…ÙÂlð >Á'DÈBE¡¢PúÏé¤é¤é$ôóI|ŸSΔ3å ¾'V£Õh4oiÞÒ¼h6i6i6Î"g‘³˜3ý‚®±ÉØdl4éštM: yIó’æ%ÀÕäjr5î`w°;x!ž'ÇÉñy=‘­ÓÖiëD?ÉD2‘ôŸ¬´TZ*-åËúƒûƒûƒÙã]A]A]A¤0!+!+! ³SySySyç ç çc¿Œý2ö `6šf#À´1mLp±åbËÅ`\7®×ÖCÖCÖCÀøWã_˜cÌ1怑2RF 4Å7Å7ÅŽ6G›£ ÈX›±6c-f-g-g-g!· Y†,Cøi¿´_ÚÏ—‰R·¦nMÝÊ+±[±5}ïÐ{Cï ½ç‰Œ½{5ö*SàÏùsþ¦ÕKÔKÔK ‰SÅ©âT@ôþèýÑûN®“ë䀔¼”¼”< íHÚ‘´#€F§Ñit@œ-Îg¢ë£ë£ëÎç;Ÿï|XåYåYå´¡ÚPm(œ¤4ÈN©O©O©…Û1Û1Û1bdãÙx6¾ÒÍ„\ ¹réƒ}\*—Ê¥~~oâõ‰×'^ Ôܨ¹QsóÛ{¼ø…]»vNÕSª§TOáíáíáíÀcÝu?Ö ,yqÉ‹K^F…QaBBBU•ªJU„_ ¿~XT²¨dQ ÔÔÔ*K”%Ê!1f³ŒY‚}H9¤R2ßsG¸#Ü‘îÍîA÷ {p›Ý-º[t@:Ðñ?GÅ£âQñèeÙÌù™ó3çÃsÓBÒBÒBè³™Ÿf~šù)¹ÄOðü(›Ãæ°9 ŽŽŽ€ègÑÏ¢Ÿq–8KœÐ+ô ½ ýèH;i'í€]o×Ûõ€||| ì?Mþ4ùÓ$²ªgªgªgð•\"—È%Ž *¢"*Z™5ׂoí`˜*¦Š©]g3‡™ÃCú„>¡o›KÞ.o—·¦ S)ˆþ©§ § §_°l€Y:L‡é0 ]/]/]ˆ Äâ˰ Ë’CrH@ Ä@ Æ0†±yÀéGòGòGrÈä ò9ÉŽp ÓdšLïH2I&É·v  e(cü×îã>œ¾NÔÝÝíÙ=Y2Y2Y•DH"$_”DŒ:uð£‹(F1ŠÉô¡}|šï>ªÀ 1ÈßÄ.ìÂ.Rs.æ\̹²¿H·K·K·Q2©œTN*YkM`M`M g·O2È ƒ!A€YÌbv¡çÓš@@½CÒni·´[è³’I‡DT¦+ä ù=‡ëŒëŒëÌ;Ü,¾Y|³ j¡,öêœôÚ½óYa‘°HX„Å]÷»îwÝ\»\»\»Þù@¡T(Ê;gÍõæzs½¨¬ñ寗_¦Ï’d'Ù ‰P-T Õ ^pÐ):E§Âžð˜³ŒYÆ,ø¢9®9®9‹#ŠÅ $ IBÒ;ÌYïžÃkÅ£ÞFœékÄ·SÞOÉüÆÍ»ehF3š=»I I!)Ïþeî“ã¢ÑïÎwç }UxUxU`VÇŽ={„^¡Wè…œ‰f¢™h8ùB¾/„äãå/ÿx¹'j$y$y$Yt['“Æ•­š{iö|/TB{Ô»³óíXIIIII ¦}…÷yy½»ÛëÝ£^ïžÿïºëÝõn>ßZi­´VBÎ0 Ã0˜òU¢e¶e¶eV°ß«¸Wq¯Bt[ºOºOºïfƒsÈ9äÚ÷Ñíçn?wû9À é}Nîôñ̓þØ ÷&¸âõ®ñ?¼::ÊZ¿Ô©ÿRïÙ(D! ‹{zzpÂtÝtÝt¼&ï•÷Ê{!Rˆ"ÿz™}…}…}eöiu¢:QÈLxõ^ôγ¿åáw†V«Õjµswa=”£åÈ[#OŽ<9ò$>õ¨<*ê*/QKÔõKÿxö íAZÀ9ë-ë-ë-úa×É®“]'=Ï̸gÜ3nÑ.ñjñjñêÿ £•´’Vžn˜{ÙD˜À&„Ç};à-ÿ[‚?¿ã]шFO1­£u´NÛÇÔ2µLm«Ú±Þ±Þ±^xR\!®W0·D¹¢\Qî·mËk—×.¯M×Zú,}–>ò$ Aô˜7o½Ðþ{ þ`üÆ»ÞãÂSŒØ‰ì ’M²IöwËi#m¤C¶T¶T¶”¹% Ї– ‡„C¡üû½›{7÷næ¡öæó],gÿˆãßÈ8Ðoé)΋IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-7.8.png 644 233 144 2643 14774263776 14775 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜXIDATHÇÍ–h•UÇŸÍj»tݤ V6Ü]#Ù¦±?´IB¡il ·X$‹e[H†A³™8X MSa6f?&n¶ üC”« ,5˜xu™Õ¸°ûÎy[º{÷¾ï9Ÿþ¸÷Ü÷æêÏ?÷>ÏyÎ÷û}ÏsÞïyDD$?õ+½0{av^2Î~ÓËç®Î]<šŒ¸U›UûËNtºæõÎëUW½ØÌ›úÌõ"~&ŸÉK¾x‰œþœþ¬U©¸^YòÊ’ÜÉøãø|wh>Ñ|àxßñ>Þ†Èpd`rÕä*ðb3oêÍzƒ—‰/í÷ñ‹ÀÃ'>™õä<’óˆ½PôBñ;É‚ÅP½®zÀŸsþœ£³À~üz0ÅfX±™OÕ›õÏà>ßÔ#0ÿ¹ùωÀË /7ø>ŹzZo}è°ôUZiů§ì¿ì¿@_sÊœ2´éåz9úgý3°ß±‹„þѾaß±mø“Bíœ>†/ÅŸÒ#ÿîíÞç¡nAݳö÷ —éetÒ‰šÐé=Š'Ž7 )¤ôBÐtVëÇœÂf±ó‡óG~¢NêÄÜû|F+EDžþ|_dê!N†¿ “\;óâô—Ó_r/z":«ËÚkí…ɱɱÉ1ˆïŽïŽïfÖ˜ Í„fB0^=¾z|58Kœ§@7ëfîq>‰a7ìBš?¥';)oK…HãÆs/­.­Ö)Ýß^q6q6!¾Ò¯J·–n©¯ŠUÅD Μ)8#r¨øPñ¡bI‰íÛ'¶‹¬¯X_±¾B¤l¤l´lT¤Þ©ÿ¡þ‘xs¢0Q(>y–Jä;)-S:G§ùÓz’ /¿_ľˆßè7@ÅTŒD|E¼"^wOß=}÷4œ«?W®Š‚EÁ¢ ÜÚ|kó­ÍÞN <Õç¥GGG`_ǾŽ}^^M«i5 V¿ÕoõÃâ5‹×,^]]]°´viíÒZˆú£FõÖéÏÍ?ßÔ#0oî¼¹j¬1k p’¯½švw÷.ß¼|óòMn n n‚;w:îtm´ÑæÕu_ï¾Þ}Vn\¹qåF/_ÞTÞTÞ]‹ºu-òòîzc3)þ”žl5¤†²FDœ§FD‘ù¼Ê3<ã£ÖQë¨%R^U^U^%’¿#Gþ‘Û-·[n·ˆô¶÷¶÷¶‹øf|3¾‘±–±–±‘cú˜>¦E¬KÖ%ë’HÁKë Öy¸òA’/ÍoôÌ:cv²çjÀ®±kH˜'ÛÙ¹³sg' …‡ÂCaï‰ÇÛÇÛÇÛ¡&Tª ÁDåDåD%l;Øv° *ý•þJ?ô¨Õ£2ŽÊOî»î»$8õ¿gLDäÀ9xë÷>LŸ˜rp¦œ)@Ýç[¹ÈE B„Èl›`{Ø\ã×2ò1¢D~†FƒwâY•{üI=³}ÌøÊ߯gTêážR¿ª_A¿®tCá~ö³TžÊSy@#4‚{Á½à^÷}w‹»Ô“j­Z |­rT÷ŒOâ„ãáølû/çÏ­ËÍpfÜawø[Õ«zìTs5àà ˆ#hTj—mlðêU“jÂ÷¼{>ßðÍrþûîÊôÝÕúDëi€à#>Ÿn1îkîk$@‡t€,²À‹Í¼©7ë žÁÿß»òýºx`¿ÇÌ/ØŠª7A42R±IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-80-red.png 644 233 144 4273 14774263775 15623 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜpIDATXí—kL”WÇŸ÷2à ¥Y@v5¨¨¨ñš¬\ä¥4ÚFÁµ+»Ý®·Ž ‘h PV×ÚP«XVŠ Æ¶W‚­Qâ6]š˜ÊLdŒ´# ì03Ìû¾ÿýÀœw.Ùj6»Ï—™çœçò›sþçœ Ñ´Í"?ãׂ Áî_žÐ Ž Ž Žì•¢$J¢ôFJ¡J¦§•:I$‘ù€¿¯Ô±x–Ïê±úþýø5þ<¾|»i7íæÛüç£Ä±Cìh{Æíáöp{Tðk„5ŠËl|°ñ?”?”?lJÝ”º)Õë³yÏòY=VŸõ{>ñ¿÷÷çÕóãü8?nJa+[[[*½{º÷tïé^%Ä6b± @€˜ÀL0ªï™gñ,ŸÕcõýûÍ«>é^âͼ™7›þÎ ¤ÞJ½•z˽jpjÐ9èÄ <¦$)aJÜÒA÷e÷e@Z*¥H)€”+­“ÖÒR)MJ¤ƒR’”(IŠVÑÂÍòY=V_öë¯{IEãÚ¸6®H¬kÄš–ïXBf]fEf…;W{Oê•zas·LåLåŠÉ3áB J@ΓóÈ,³1€KþXþØïn‘¥F@yO“Ã`cÁ™u™2¸sYÆÃøHóHóHóhý2 «ÖU몕xãSãˆqcž:6éC©OêI+iجïXßǧŽOák‘ˆ<Æc˜úqêG¶1û˜¦.O]¤åÏåÏÕ›ñ©F`LW­{_÷¾ÏxT>q§¸SÜy·†Mœ(9Qr¢Dù£§€ÝÝÆj™Ì œ«ÊW•ÓÇ Bl!6hlilñåuüìø 3 3|â‘S‘Sp%ÿJ>à­?ÝõWWÖKDbDbD"êže?[ûl-@ -܈c¿y{Ùö2ˆí‹í€;ýwú`âþDÐLj&ÀžcÏ€ÚªÚ*m m€žžž(,` {9ìeqcñcñ*¨ûYöHÈHÀx=¼áȆ#Žx™4è:ì: À†²og߀•É+“}ájåÕJ kt 4?h€Œ+WàͲ7Ë|㇠=òYaËÇ úÆÀÎxï9R š,M–&K=cÁ´ƒ(ˆ~Æ*›+›‰ˆúúûú‰ˆ"¯G^'"ZW¹®’ˆ¨àlÁY"¢¸§qO‰ˆ¾Iþ&™ˆhÅk+^ó½Yfêfꈈèmz›ˆfŒ|?ò=}áwýkÚ5íšvõÈ'x@qÁÜkî5÷Ò “wœuœ%AøsPUPþà‰oÔ6j‰ˆw-î""ú æƒ"¢·î¿uŸˆèFÈ"¢þWú_!"šõdÖ""§Õiõeࢸ("rQ5ÑOÔE]Dü×Ó ž Áb²˜,&d|Äçò¹|îÔ/ž%®;³»iKÓ Ìa™° €óÔùSç}wÉÚiíô=\Ÿùì ¬^? EkŠÖø„»‡ò†ò@ì;éüW—¾ºäíwãèµ×¨/àŸ¸d.™Kžú…„åÂrayE-;eq¿Óõëú¥yÆÍï=¼ç½>”Œœ˜œX˜°0€r)èRìïÜß \!W?lûaãñÀ½Î½÷Ü;ÀþÆã7xuöðìa˜Ø<±N;\M®& ±bIþ’|Y}„(!Jˆ:5F¡Y¡Y¡YDâMñ¦x³Õ¬^ø›2¾ÌøRÚËHe½I1)p‘ž‘ÀÎV0|^ø<¨Ÿ¬Ÿô»žÚmPT^TÀF )Æ-X´O]¸…E—öm;¶í˜lWw;„ýÓ¾ÖBþû‰&Y“¬I65±ýAý|ý|%CݹÙÒé `"f"€ÍµÇµÇïÄÎÄLPdEàÄ`,y,Jì öïVŸ?Wy®¯ªOh-_Ë×:²¹9ÜnÎâÓ€Â}Uê[¹­ÜÖµ'¹V®•keZ‘ÿbè6 aPµ»WrHÀÜà”çÊs$ æb.È·åÛ€’¡4+Í^)™[Íz³ˆ›¡sé\îêJV ‡„CúL-—r)WÔyYÓ(ÒÄJj£6j#,‚E°¼ûµú´žÔÕëêÝáÆrc…±ÂW»òVy«Ïz*P»Ç7  e€R gËÙp²°¢{Eß}+íU_  q\7TEïŠÞ½‹ˆÏä3ùL®D½Ü<ŸÂCá¡ð»¿/~_ü>"M©¦TSj¨Rµ›–™–™æ«]Y/ëᄌb£^ni¡´PZèÕâñÇW_¡d°zšpM¸&Üì˜öu3üwšë ØzâÜ_7cZ»Æó>Ú=¨?è£Ýpw¸;Ü $ËÃò°W‹ÓR5h´Úe£ªÉP>”Ýr(@ŠŸðÓó„ãÚÝø´Ûmèöj×Ýíîvw«€ÎÉèÉèÉh`‰u‰u‰UZ j±]hÚ?Zͤæ‘^ `½À¼¬À¯i÷¨î¨î¨;ÜØjl5¶p '¬ŒTQQÑ{íˆ'Å“âÉÏ_퀾žq y` ±„-íþí×´›ž—ž—žçÕ®aµaµa5¾˜žWÔàŠ¹b®xm…~4 /Gÿ¥½H»k„Z¡V¨5-eÀÅÕÅÕÅÕÊ_“\I®$—ûŸêV[‹`ÑÇR µP y®ÁÐ/˜þG Ôn•¿Ÿþ·ÛÎm(‡r(G^ÄÇð1| ÀG]ÇÙãìDÂ]á®p—»êI,عÿ›…«ß²(‹²Äïü§ËKx…Wxຸ.®ëño§Ççvf0 î ·úß™Ê)U­ÙIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-53.png 644 233 144 2617 14774263775 14710 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜDIDATHÇÍ–_hTGÆÏÞ4M¶¤Y#VÝmC°‹¡¡¤(ŠˆÅØj ‚M›V ¡Ú`CéC0>Ô@M¤-h‚ˆH¶¥¶¨Õ¦´"â*®«ØbÑ MbBb]d›nþôOv÷Þ™_vïÞµ­m—ËwfÎ÷}sfî̈ˆÈ¬ÌWÀ(5Jâ46Þuâ…µ…µþÏÓø ®7\oÜø<]ž.€’@I@Ýr°ÝoÏÍqøsõì¸Ì'Pp´à¨«&ƒ?‚õ•ë+ ŸIã/€û„ûÄo&4}Ýô5ÀW=_õð>D/E/Äkâ5à`»ßoçÛ|¹üòÑ_ôE ÿÛüo]#PðdÁ“"P¶ºlõó¤ >ëÖ®[ p/ï^ž6ÀŠEé`šiìös¶û3ãí|›Ïæ·õlý´9+笺 uÜÝé„[Atë³­ÏÚz©Äi¥•"m¥â©8èûfYCBGÕê àŽÔƒÀAÝ @_1ý¦Ÿs¿¹€ 3ÃGës­ÏÙoý´yxm?yÞ*|«0k(Ö%ë0£T©41š™‡*¯BtItINâ\sÈrðÙíg·ŸÝ ÷,ܳp¬ˆ®ˆ®ˆ‚¿ÏßçïƒáÁáÁáAH^N^N^†êãÕÇ«ÃìþÙý³û!v,v,v,gï}¦šTSÎgõÓ~ ‘¼uyëxQ$¿7¿Wì6î:dœ3Îe±”ޕޕމt×u×u׉„½aoØ+â¯õ×úkEÚí‰ö„ȈoÄ7â99|røä°ˆ·ÍÛæm9•<•<•tøô=]  =G?íÇQߨo\7EÌ×Í׳çè—µOû¢›×n^»yM¤q~ãüÆù"‡[·n™M‡¦C"‰âDq¢X¤>P¨ˆD®F®F®ŠÄ›ãÍñfOÄñD>yS^’—=G?ãçQ{Œk•µŠ?1À€SðŽÞŽÞŽ^X~zùéå§!x;x;xÛéßµiצ]›`éÈÒ‘¥#Ð=Ñ=Ñ=‘³bAq8g5ZÿºÇþù¯sÚtÎ)Íu¾ç{@¡P9B!B„€ *¨àï­Ÿ~ú}ìeoŸeÆÍø£ÿJWöÜwÔýa›Èõ¹×ç>mŠYžWž'k%_·è9&'Œ÷Œ÷ä)5¡B*$"7d@D\c®1טˆá5¼†WDy•WyEAqruº:EŒ€Ñgô‰ÈÝ¡;䱌N£SÞ–'Ô€’ïDÅÅ~Í™ñÍø–}úNþ‹ÖEµYm&…þÛɯ31»éŠÎ0ÅTNõŽz‡”Ã÷Ÿ'ÿ#îÊì]é»Ýì¦ÈYbk£µ‘è ú.\à`»?»%2ù6ßÞ•íëâ±}=ž/Ø?€›èˆA,IEND®B`‚routino-3.4.3/web/www/routino/icons/marker-home-red.png 644 233 144 4172 14774263775 16322 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü/IDATXí—LTÙÇÏû1 ;-»~8È[«bPñg¢òÛ]ÁÄYwVÌ‚DWW«è¢YÃ$.65¢Áu[ÓdÇjbƒAV–˜†5i#Ù˜™Ed ³¢ÌàÀ ïÍûöÞ{óf¶Õ4íùç͹÷žs>ïÞï;7C4c¿ c×EZ#­‘Væ•<a‹°EØ Vñ"/òâÃ?ÒZBK€™i©‰xâ‰W| Ô—š”õJ¼’OÉZ]ʣ嫢*ªb-¡óq¿ám¼·YƘƒÌAæ  ¢}û·Œýïǽ|øÄ´Í´ 0­7¦SŸ|°ìƒe€±ßøÊø ˆuźpK‰Wò)ù•z¯ç!vm¨ŸÚÂzXëq.QvhNÅœŠ9â§z.ô\è‘¢ÝÏÝÏÝÏpàÀÁ‹ L`€N8Õ—ç•õJ¼’OÉZ/µåõ|d˜Í³Ãì°ó¯J‚õÝë»×w «íÓöIû$ìMZ,ÜîCkg|qYN ¾{ð݃€¸¬­«­ Pæ¥ÅâQñ(%Þ>m—ììJ~8¤¾a¶ŠÆX c!âOð'øm”€¼¦¼¦¼&¡P;"Ý“îÁ-´ùæúæ’Sžð;9'©ß¥~ 0Ð=ºÀßþ^û{ÁõBÛäàä ‘öJ{áVòç5å5æ5 …J}…Gá#ÝnH7´q¹²ÀPo¨7ÔKó?:ì;^ÊyÜâþ·üo!hnÇŽ 5!5˜Q/D|ñ°çÙóšqwûêöÕÁpñ‹)Û”M“íGǨc/ õ†:C4OáQùøýü~~ï eâ\ù¹òsåÒn9W°LGOGk}›Ã))ZÀÈÏ#?n·tźbÐÍÖÍÖ¬óµg´gÓ ™¿Lu½J}ugCøHrŦǦǦ£i¬`¬`¬ ˜IÊ;LL@Ê`Ê 9Ïhwî§Ï&jJ¤Dí_ª½T ¨ùåzccc€Â£ð) '77onÞÜ|3ÑîOö'p)C;zvôhÒ–§-€ÒÂÒB0öûÀtÛtJÒJÒ üQù#X»víZm|B]B׫´Wi€hö*< Ÿ Šë¦‡¦‡¦‡A ‰¹‚^Ðkc]Û]Ûµ…¶,ܲP;/抹¯óm l ´ñ–¥–¥<òêcþ}þ}Á`S¦)Ó”©öíë¬üãÚpÏpÏpÙ}¬õ±Äq{¹®@;åwñDí‹Ú§me| ŸBD4qkâÑ—¿ÜHD4qcâÑÖ=[÷éwêwyÜ·&Ü™™IDr§¼ÁD0$ƒçrºœ.'Ù>b ÙB¶pzTÞ⦋U«.Vi$0Ký0¸ð);RY[Y ßä“¯Ý©Ž‘Žhili€²ceÇÀÜkî (ë®M\›Ä+¡GÞuª«±«QÝÉ=L“ÁdL·‚[Á­¨iP¾²¤ä¤ä¤d1Õ±ÕžcÏ ¶)Ç“æIÓI•×+¯@wIw‰ÔvÒvÿÆäq¯¼®èëÇ_?V'}^xr=¹@zMzMzM@½¸8.Ž‹;ÿ’bòcòcò‰ø»ü]þ®yXmø¦ì«ÙWÅCJ¦@uKtK4|°rvÎÀ›ùUæW`2w€;E«ŠVÀîÇ»ÀÇm·pí(Úà%»]ÎoIÙ’ @+ZŠû•ɕɯ ¸‹ÛÅíúgñŒå¢P›sV—¡ËÐe8ÿ¤T×)=R*åÄ@" ür´r´à:ê: À=Ü0Üž3ž3ðôÎÓ;à8ã8Àçhv4ÀÈê‘Õ€X>V2VÞãÞãðþÙcöš½(R¯Ðö0{xª€I`˜„…¹ꕺÙÎlÏmeÌŒ™1+Z üÖÚyuéÕ¥°ªÚ=XX©9Y_ØIKanŽT#Õ¥4léé’fÍ}{îÛÂ~u'븳ÜÙê<­ ©7Y³(‹²ø:²…,Dœ‹ûžûþÓêÕÚjH3¤ zÇgö.{—V»wï€4%M¤Qi€W’†X¥f©ŠŸ> ¾NéßK©”ÄCê 4ÁñcÖãñâÄ bóØ<6¹"Ó•+˜?“ŸÅÜ 7È 27çžwxÞa"]…®BWa=®j7+/+/K«Ý@u >Xa…À ¼À M7/Îç÷÷ôÊÓ+O¯”rÔ»\¯ÓëôÃS3¾aVèI3aGOL˜ûm¨o˜5£]Ç• v«k«k%µ/zA/èƒ@gggÁ¶Ó‡>ôÖ¨¾¨¾¨>ɨj2†ac¶ý.LŠgÃø"éõÜé0íª]k§µ3¨]¡Sè:ƒÊŒŸŒŸŒ/_4.þZÕâeî2wùk©ÉÒ ü9½Á‚ ”Aíº8—F»§ § §½Ãì0;Ì|ðÁ‡q…´úfõÍê›Á¶Ã·ò­|kŸü—$êoauåqŠ~`¸)Ûdíþå?i7{Sö¦ìMAíZ×X×X×àÒ̼¤žSÆ”1e¹5¡eØauú/íMÚ]Ç5p \ƒs™\V_V_V/ý~±±±_ø‡zÔ.ÎŹªçPµQÉm‡s„Õ‹¤ÿѵ{<ÔÏ`*™J¦  ´6°‰l"›0ÄCw¾Mò&y“¼D\/×Ëõ2·åÀâ°“û¿™^ý•Où”Ï? þ¬œ•X‰•¦ƒé`:žÎÿ•5ìdìayßxÔÿ%©Må¿z*IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-35.png 644 233 144 2517 14774263775 14707 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]HUYÇ÷5KÅ[i& ”˜Z0zMûT0AG+Њ¢‡dÄ`ç¦ BSiSLA%äC†NFááù‘‰ÔÃØ5dªyÈD®™ygÌë9ûìß<Ü{î¹ÍÔôÚz9g­½×ÿÿß_koB!¢ü_!q!q!K|~ÈwV<D´F´þ­Ci{i;@KCKßÃxÿx?À›œ79`ùf»ÙßÌ7ñ‚ñEÍ¿ø…€… ;lBØ¢°EB@|^|^âa_‡?¡° °àå‚— TH7`Ç®rL› òÍv3ßÄ3ñM>“ß§GÀòmË· ;÷îÜQïKi„ÊU•«@kê¨ÃÎyý„~Ô ¾V_‹—FUªJ…@€ò]F¨Wz–ž…W¹µim ’Jì>¡Z+²reåJSàH£ÅïÓ#Þ_Ûó¹P^¼Ðú@¾“Ò)hêkU®ÊQæ©/Ô µÈ$“L,›g’É€§Àh1ZÐ@vÊN3¬õøü"XЗ— b=~a*àÆÛoy%ò‡ùeóËðš‘ë¡×C¯‡BFLFLF LULULU@‚#Á‘à€¦›M7›nBŠ#Å‘â€Sê”:¥`ôáèÃчAK\LÀ[yI^2ñU‰ÅïÓ#`ɽ%÷Ô-OO˜QwÕ] oùÖ {ê=õžzÈ<—y.ó¬Î]»:š“š“š“`}ãúÆõU›U›U kjÖÔ¬©ç›Ÿo~¾ÙÂQ_I$Áfòûôˆ^½ØpÁäØä˜uìÕmãŠqÅJv ;†Ðw¹ïrße˜òNy§¼V”V”VÇŽ5k€'Úí‰fåeÇfÇfÇÂ…ø ñâ­¸ÌÑ7è‚ËŒÉïÓ"„qǸcs ¡ïÐwÓ–+—jWí_ :9tRˆ}Óû¦÷M ÑÙÙ)Ä\×\×\—cccBh;Ðv Mˆ«ýWû¯ö 1á˜pL8„H~‘ü"ù……gÃöÌöÌâ³øýz>¶Çh–Ûåv¼üÆmn[#=m?m?m‡M›:6u@½«ÞUï²ÚÏŸ->[ [o}¼õ14%6%6%­ØòȆäayø÷؇O%èݪèŠNÚhʪbÀSžòpâÄÉ­›nºBòÉÂÓô×úëOžÊÔ±y³ÎG£ÌRG/½ «äydµ¬–Õ`$ÉF2PFe [d‹lé”Né#ÃH7Òß͇ŒCÌúwþ§êØ*?à¯ü½²À(1JÐü³¥˜c†ÿð * `î½;TqÐ8ˆfá™ø­üŸ¸+}­ÀÎ`·–Xî—ûñ‚º¯î`Öo¶¶„?ßÄ3ñ?zW~¶¯‹Ïö=öy¾`ÿCd·2Ø,µIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-6.0.png 644 233 144 2605 14774263775 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü:IDATHÇÍ–[hTW†×LªÉ@šh˜FÅÄK‹¶aœ/¨D"Q«¢Â$b°MÀjÆ)”VD¡>‹iÑ ThJĨhLD¥ÄT-"J´Á4ˆ…Ø £&ÆØŒãÙgŸ¯söÌÔKŸÝ/‡uûÿ³ÏZ{ ˆˆÈ÷+à-ôzs¶w[ÊŸµ:kõ§öQ<ë=ëo ¹GrL<>ñ¸îMÙ&nòÓëERøé|Æ/$åÈlÉlñ,sí:ØÜÌz/a×wƒï¼ïü? jÛjÛZO¶ždDnDn /^)ÛÄM¾©7xéøR÷¿Œ»4î’ç>dŽÏ/ÓWN_ùþ牄þ÷!´.´` c Ãñ€ýÈ&ÛYŒ2ŠYÒlwóM½Á3ø†Ïð'ôøËüe"PQUQåkLôžB휺sªá³ÎÓÌnv“íüjõ[ýÀ7ª_õçŽsxîÄ8$ícê©zJÜùÝÍoKÔ'ñlƒïò%ùzä¿gûí'¨ÊŒÊŒ¤ ë챋íbÐUµªÆrŽSãT8€>R«–ZjAGô]}7éuœ Õ¦Ú°Û…va¾eø\þÔQŠˆ|Ô¾ˆ/2úñ¾±¾1àoÖ‚>­O3¦¦ªUj<üòᎇ;À ZA+˜&hûØ—2_¼(xQ§?žüx28A§Ê©ÐôÆtñ>Õ§ Éïêq…ý¶ïݾ8 ‹ùXÍT3S;®ù³ævÍmÈg‡³Ã°tÏÒ=K÷ÀÐü¡ùCóyemll€ïŒïŒï lþyóåÍ—Sxü¤ZU+pØå3ü®WØo_AóHó؉ºÏ\€xg}g]g\)¸RpznõÜê¹áƒáƒáƒÐ}¶ûl÷Ù” ¶Š¶Š¶ ŠE]]]³Ì:0ëtÐ1Ö1–LÛq×à7z¼"9]9]s‰”­([!"+DD<îIg>*}´êÑ*‘hW´+Ú%ªÕ‡êE"±H, v;ƒ’\Ë–,É/Î/Î/É¿™3ÿ¦Ha^a^ažÈ½wïåßËO¦gÊJÃçò»z¼"¡Œ‘qÇ]KDD›Êرc±c"s§Í6wšÈý–û-÷[D†®]º*Òx®ñ\ã¹”0O¹§ÜS.¢* )¿å·ü–_$ëÓ¬ª¬ª”_r ŸËïêñŠèvÝîùCD•«rÏw""â7u >\0{Ál‘ÁœÁœÁ‘ƑƑÆ‘A=¨µˆ¿Ö_ë¯inonon™7gÞœysD,X,RWTWTW$½½½.RÖPv¸ìpJ—·Çð%ø“z^þÇø+qæÎ*Oå7?CS¸)܆…j¡Z¨àTìTìT †7 oÞ¡†PC¨žžž uFëŒÖPò äAÉèxÖñ¬ãYZwLPíª8ý¯ÿÇ^íʘé{Š=˜I)¥8|Ï!¥÷ÒK/°‹]ìJó—RJ)ÐDMiþ8 ÈÖà€=Éž<ÿß®L›cºÏê³'9ǶëíŒé]¢KÀÞfר5 C:¤C@5ÕTƒÎÕ¹:8Á N€^¢—è%`/tôÝ£{­7éM˜¾\›ä{ýK›üTfUf¥Mfìkö5½EoÁJì°Hl@£Flwæ$â/L¾[ŸÄ3ø†ï•Éÿ†»’; ÒîJØÏ~²AªQ{“½‰88ÝN7<²MÜä›zƒgðßxW¾µ¯‹·ö=öv¾`ÿù‚½NÁJÍãIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-31.5.png 644 233 144 3107 14774263776 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜüIDATHÇÍ–kL”WÇŸAÆaZ*µH«4-$´¤‹Õ]›Ò¹Š Ù&ÊV¢ë–¤ÔÍ~°IÍî|ªRµf —xkJÂE[–4¬‰Ü©š˜ÊÀº ­@†20ïûžß~˜y²ì~÷|yóÜþÿÿ9'ïó ÷‚bƒbƒVùì ?ü!ï…¼·ášÏ>¯ƒ%×’ûà8„}ö5@DUD•Ѱ͸™¿´^$€¿”ÏôK¸¶Z[­e§ß>ÉÉ!Ñ>ûËV°×Ûëç4ø¸ñãF€ºšºþ?wþÜ àÜéÜ ÛŒ›ùf½‰·_Nü¿X¿·~oùØVÚVŠ@ü»ñï¾ö'_Âðkµ;k7ÀãW¨ Ð'PBÕNÀsM-±Í¸?߬7ñL|“Ïä÷éˆÚµC„¿gOgOÛ+}}W8SVQVªÀ[O—¸D(h“Ú$€^ª—²@†pU]S×TêÐ÷éûXÀ©95'(/¸@¨õá)oYTYÐêç#§#§Ã^ ёё;õOîâå¼Ô¼TP¿ðvcŒZ£èxÉa3›QªZ}£¾Õ£¨Ö,³Ì.±=xð Ð8Ç9¼ÀzÖ›Ao|øé‡Ÿš'xr×’«yã ÿ´_µ_uÃpìp,xÿ À“¿ý¥æ—æ5‡vC»Á²5çšs͹À;êõŽ.+MÍ©9˜ùÝŒcÆO~ÿjü+æ';:û*èaƒ‡¼óBŒ;XÕûôˆ²ˆˆœoƒ#ú¦?ç)OÔwÒßNz; "þq.â*ï\Þ©¼Sàqzœ'¸b\1®HïMïMï…¦£MG›Ž.æêvu»º!~$¾/¾?O¬H¬@¥lK|3ñMè92646d¤Bici#è9>=ÁÆ.‘­7‚%k>k^2n8nŽÝ³lÖB5‡æÅ‘Ñ‘F>Û¦U›ÖlZ#r{Íí¸Ûq"åF¹Qnˆt%u%u%‰X³­ÙÖlY¶fVϬžY-ÔÔÔ,Rôr‘V¤‰%ÿtîŽÜ²øú[¯$¼’`Ù,¿ßV¶­LdÅ%ŸÁµªqU£ª%wÜ1îìÔ]9S¼øðâC‘ββÎ2‘âæâæâf‘ª”ªäªd‘'›&^œxQ$e]JSJ“D‰ÌnœÝ(­ºT—¥WøRDä^?\ÿöú·Ïþ¥ƒ ù¢ö‹ZÒV§ÙÓìPÙTÙTÙ´üDŽÅ‹= ÷Òï¥ßKO¸'ÜY{²ödí‰è‰è‰h(ß[¾·|/lý÷Öþ­ýp5¾¦µ¦•“½×3¯g->=þvq¾ J–šŒT”þ‰þI௧Ÿz€Óœæôe:::ÿÝç>÷ƒE—àÝÒ¼šØíç£äTÉ)`Þ§Gð÷1ìöw0†Ò‡ÒAÿ³¯éŽÅ›‹7™7ÖÙF6ÐL#^c¿±ßجd%+~úéÃnØ ;°mlýúý 襋õ‹õÌoùðùi(q(À>lv3éïcË:?ù!ù!€òwf~K¿`0à}¶cÐЀYÿlÔü6øf”‹)¦LÊ_ïÑ[ô–¥?ß–oûŸß?+ÉÙ—³oɬä³õŸFG=àÀA(hnÍ  éE,€jU­X°@À6ãf¾Yoâ™øÏf¥Ÿß§çy~]<·ï±çóû¬Úiò<Œ,IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-22.6.png 644 233 144 3235 14774263776 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜRIDATHÇÍ–mLTWÇŸ¡Ôaê0µélâfÛ(%ÆÖ-’8S©[ «*ÖÁ-+K¬Ùì¶ÖÀ&@µÐ-ÅØR¥ÆÐN…ZÛˆõm*/ËKL|IC`ÍLÕ ²R˜Zd˜¹÷þöÃÌeȺö£çËÉÿ9Ïóþ÷œÜÿ9""²$< D=õt”%„£vEâ1é1éñŸ‡p£†W ¯ ü ox¼à‰OžøDŠ`}]Ï_X/á_ØOˉŒ_¿2¤†q5ìX»cmÌ/B¸® L§L§~BÑé¢Ó­ÎV'{ànïÝ^€ÉÔÉTˆ`}]Ï×ëu¾…üRý_ýEàÑóž7Üã"ã"XöÒ²—žùS(Áý dnÉÜpç‘;hQ ŒfÌZ*0Í4úð,Àúz8_¯×ùt~½ŸÞ?¤GÀšbMápÖTÖ”©)T0ÔÌ‘g‰´€À)*h¤3(¢ðAÐôá×úÔZµ¨Òª´*m@f‡âÀÁÉà$ð9G9Šyž¯¾ä£’tCÍ4fÝ˺gjkª55r¦áùýY™“œ“ Ú€@0à h§ÕƒêAê´zM½†¦½¡•kåó;…V©Uj• ]×®i×"qþ̶ ©g”ƒÊAÀ ½æÿeγ9ÏêßqÁQŠˆ¬ú€ ¦ÏLŸMGƒ{…{^à·ãkFß}—™À ÝÝ‘~¥¥¥0ž0ž0žê@u z Zh‰ÀூiÁ4côúèuf«CüàNt'õþ!=¢ÙED»áõ÷^|÷ÔÄ­_gË8– ËaËa´”¾”Ž”¸m¼m¼m„ìÎìÎìN°l²l²l‚äºäºä:ðVx+¼<0 \`Þe®2W¡½Pùü›Ï¿ ;Ô>µOM„=k÷¬õ_!=QꈈˆíŒHÖ¾¬}"_מ{ù܈$w‘ûI÷“2çÛïÛíÛ-ó§æãæã"ÛìÛìÛì"žO§@Ä×éëôuŠ(£Ê¨2*âÜêÜêÜ*ó£íjÛÕ¶«"—n^¹4"Ò÷Ǿ”¾1¬2®n[Ý&sÿ캱üÆrC’Hú¢ôE"XBz¢££boÆÞ\gYWµ®J$£/ú^ô=CÓæþo‡Wäâù‹ç.ž¹µøÖâ[‹E*ã*ã*ãDÒ:Ò:Ò:DÚÇÛÇÛÇE&\® —H¢!Ñhˆóz¼¯GdÌ=æs‹d6evev‰üÚš`L0Šñ7Žø†øC“ˆuØ:,Elklë:»ÐºäÛ%ߪƒlóØ=öÈoÿWSéO¥?AÒ†¤ I §¨§¨§(r4¥ù¥ù¥ùTžTžT½Ö^k¯õÁ#<â8â8âÛ!Û!Û¡H|æçÖ<·ln8Ópð1Cp.ÖkT£Ôïƒû‚û ƒÒúØÝÇý¾ÝÝîëßgëbëbE¿wìtì™*›*›*©¯¯¯¯¯9`>`>`ÉMÍMÍMîîî¹\s¹ærˆÓî´;í"ñùñùñù"ž“ž“ž“"M7š†š†DF\wÚî´‰,ËX>²|D¬"÷Ûï·‹Ú´b­Ø0(Ê_DD®–ÀÙgwBÛ`K‹V˜þ»ÍþÍ~üéHÏMÏ…––([Y¶²l%äŒåŒåŒAš-Í–fƒõÑë£×GCóÞæ½Í{!¯&¯&¯¼û½û½ûá„ù„ù„lC¶+¶+ð©ñè—G¿Ä6›BŽo8Þœ é ÛEc7ggè­&‚òò SL¡ñÿŽYf™]€ãˆ#8̇|±=†«b*ô~Åo¿ Ì…ô­aÃä2¹¦£µ¸’\I Ô†|F¹2÷ãÜÌ(Š_ñƒú…êT t*J'(ýJ¿ÒŠSq*NÐ µB­T»jWí@=µÔ‚ºJÍSó@Ù5×4×ÄŒj ûØ× × Ó¦¦£ùwØÇpþ¹í†íÀvæIå‚r˜T3ÕLüþâIÆ&CNÎDxö‡ẇ/„÷Zõ5õ5Ì*ß)ßÍÛtlÙó??|W’íÈv,¸+yë©·žš'8¼Ã;˜!8œPò”<ü ui]0@ëëz¾^¯óéüz?½HÏÃüºxhßcç ö?Ò˜¨À¬ÈIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-23.6.png 644 233 144 3236 14774263776 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜSIDATHÇÍ–ýO”WÇϦa¶¾€²V” @W±05A6Ķå¥"H‹«¤Ú²ÉvÓÝPâ6Ýý¡wÙ [ â *Ú6b„0A0 èBš4S6`Ëh6[uÔa…™ç¹Ÿýaæqhwÿï/÷9çžóý~ïËsî‘…þ^ (:(:èg>;è€?,+,kõ>û¦SÁ?ÿ/4¼Ð°èø¢ãúxÀ6Æøùù"üù|†_JÀz6ô¬)Ýo;ÖïXé³k/¹ÃÜñÈ ïž÷<@ûÉö“üÃŽaWº+¶1nÄùÞ||ùä'ü"° gAé_ú\ès"°j˪-±¿õØc!okÞV€›Á7ƒUhN œp•L3Ñ&çÙÆ¸?ÞÈ7ð |ƒÏà÷éˆx=âušòÝùns‹/aü4‡+OVž5àéàcqˆpÐD Æ{×{—Yõ^«×ÇÕ u@ªQà‰V¢•0 ^—×|ÁQŽþ¯®ò³ÊÏ ã§9”ÿ ÿ¹"Ò#Ò{êïl&¡pSá&Pk¨b?þÏ “ “ 6ÏÛJ‘—þNŸ¹ÕÜ:ö8{xŠxùöNÍf<éž÷=ïø<™žLO&83œÎ ðî÷î÷îŸ'¨ƒ:¦÷Eo¦7œ¿¿sõÎUf<¿ðáƒ=Ùž ôü>=A¤Šˆ|`•Ì=÷öܳx§Ÿ¬™X3¡¬oþ*çtÎi±­Ùð ᘳȺ’uEäFóæÍ"9Á9Á9Á"ñ‘ñ‘ñ‘"%–K‰EÄSà)ðˆHH=B»¿Žaž0OL‡¨L¼2ñ hñÕmtÎ5çbFkÕ¾×¾µCå«|Ð:µN­´*­J«ݪ[u+PJ)¥ /Òé‹€&>åSÐ_Òwé»@{g®e®…=Å_Çú&â&âÌ×Í×§C¸íÓó¿•®ÈTdþã¯Ìn­OëîëÛômxðøgŒÿû13Ìüh%54à“Lú#A¾G߃‡'ÚWÚWOËô……ýßÊï¿+Ù^²½dÞ]ɇ+>\ñ ØÏ~ÂÁ;íÐvi»˜uI]À„ ¶1nÄùžoðü>=Ïòëâ™}=›/Øÿ|ðõ3®B|IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-21.5.png 644 233 144 3125 14774263776 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–oLÔ÷Ç?wŠÇñgbf¬Ó ÎØ€ó’Iyp›™JQ`ÒZe¦YVhYº,ÙŒ!uÑÒ­­+`$ø‡>püél‘êi ánâÉ]d¬¬–òçîÈqw¿ß÷µw¿{´G~ž|óùû~Ÿü>Ÿ¯€ˆˆ$ENó&ó&ówºùXÔ»/vß–ö°þ±¦bSñß ë?\ÿ!À†Ö ­úƒ¨nøø•ù"Ñú+ñ »$IÔ`¹b¹bÚÑO@ififljX?ÝÖ.k—/ÕŸV ÐÙÖÙÆ/àñàãA€¹=s{ ª~#ÞÈ7ê­¬/'þ _b>ùÜô°¬³¬Íy›ó^øe8Àýí/Ú0±fb2€6 $ ö<2³B7ü‘x#ߨgÔ7ð ü0”Ý)»EøóùóÖóá„—h®k«ku ØÅï8Ç9 4šÐj´–±ëè—U»jP÷Õ}­\+g™¹Ð\hT&šHPcáz*X—R—ôGð88ppÀzRŸI}&ÚÓÈyf/ß/±—ØAm¨ßë¯é¯Tãê–º…RW•C9@ÝU_©¯ˆŠ/Þº?~!>â#‚ÀF6Îà®=\k|Á3{W´RDdÛŸ¸n½`½àY î wP0½ýÛSßžb)x"Øì`•ø| ¾ŽÇ‚c«ý*¤|Ê‹¹‹ ‹ 0yý›÷¿yŸ¥éŸ{Ÿ÷>O¶~ôÑ7âž{Ö³Vu…ù˜yID¤f§üôÈÔ‘©ÄÇŸîJw©¯T¼|éåKÒ“ñÃmžm±æ&äºr]"³i³i³i"Þvo»·]$ïXÞ±¼c"ŽFG££QV‰gØsßs_$«%«8«Xä'yqyqbÝ{/;6;VzVÆ¿ÿ¦Ú)RÝRÝ’RÃ|Ìú¿DDvýUäÀÉ'Eºßý¬ð³B“Í]íNv'K`¡m¡a¡ALx i>Û|¶ù¬H…³ÂYáêêꉙˆ™ˆ™XMl1y1y1YÄÜc¾i¾)Rù½J_¥OLùcÇîŽÝxñìsÏe˜lR•}>û¼Èšs>lJ|”øH]éªé*˜Ì+œ+„ ÷×¾¾7~sãïÀÖø­ñ[ãávÉí’Û%ÑVÙêmõ¶zèÎìÎìÎ\ÝJ‡r(‡‚Œ‹3.‚ý‰}Ö> é'¶äoɇGë'Ò&Ҟ؟ØA}7áaÂCuEèLr$9ô^™ÉžÉŽþö¿¶¾í}Û ¶[ƒ­úúúVçÔäÔäÔ@wiwiwéjÿhÅhÅhܹ3rg$jÿqª;p¦ùËf€<€P Ñ’hÑGÌú½ÐÉÐIÓˆtÆ=Ž{,rõÞî/Ü’òÿéÄÓ‰"•?«,¯,oooqÖ;ëõÑVù«üUþ*bˆ!&jooo¬¬¬9Ú{´÷h¯HkVkfk¦È䎩ø©x‘¬´¬ž¬Iñ¦{ÓEÌ©jH ™FDû•ˆÈp\}õê«Ð32tyè²z}_Yîrî2Ë ,Ø1¶clÇ\½6zm4zóÚÆÚÆÚFÎÎÎ’?ÉŸE…E…E…0•:•:• eee°ëŸ»œ»œpys[[?Ë‘÷uÊ>Éÿ$p„ùDÆÅÇwàxþñ|Nÿh½Z/óÌ£øå.w¹ èD§·BÁPØoàïø{ÀR˜Ð™cX]V—g­úÒesÙ@{7<Ç´‡_ÀÇ’vJëÓú@ÝT=ª'Š«ëÅz1°Žu¬œ8q‚nÕ­ºøÙdƒvM›Ô&A« tºXÒ_ ×ço®í®íV·ÕíYËt˜ÏêÉ8d:df#“y^»®]žè…z!ÁÈ­‘€7²C„…¹¢ Ì0‰…ÒèGâךcåä?d9dùŸ“?²+9X~°|Å®ä­oEWGÐ@ ò„<Z¥VÉ2¨~Õ€ DuÃoÄùF=£þve?Ìçi~]<µï±§óûoÏížo2Ÿ,IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-17.9.png 644 233 144 3070 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜíIDATHÇÍ–ûOTgÇŸ™a 3 ¸iwS¥–ê¦Åee‰/©„.v›vmD1N^K6\¶+$[/5%jØÕ´°NR­Û%nÝl‹ jXËd°5°1› ¬@)$EŒP&z„eæÌ9ïg3-ÿ€Ï/'Ïåý~¿ç½<ï+ ""©s_ûRûR{rÄ·ïÆ  3›#¾×Û«¶WÿsRRŸ]|ÖìúVÞª/Åå³â’*Ñ@üÅø‹¶s~-lËÚ–•𓈲 \-®–é0ì»´ïÀ§~ú!å0Þ=Þ ØØQßÊ[õÖx /_jÄ/Î6g›mâ‹L2^ÈxáéÊHÁÐÓðÊK¯¼ðã;‡²€1$‘¤6–MÆøV~®ÞoáYøŸÅÑ#°äù%Ï‹Àæí›·»>@éÿjž¬yø€ÞÂe¼xIâá3á3 úÂ9á‚J3¿0¿uÛ¼mÞþ¨Ö¨5F•QEÂá à=Þç}’ÔÍ9¼KÕíÕí–ÀþøûfÇf‡ëKüpmß)€-·<U  ûÕ 8 ZU+:c EÔÔ¼ÿ1ÃLŒ¿XM©)”J34CC·fÔ FðÙ¶¥rK¥%ð‚˜¥Yñ.¸4—¦ÅqsàÔÀ©yØßLÿUûJûŠc¥±ÒX z±^¬ÃDíDíD-L6L6L6@`,0ƒÙúÙúÙzXhXOÐ`òʽÇï=ÎŒ9Á‡ÁãƒÇa—ßå×â,=¿ED¼>(;RvÔj3;𧉷'Þ†Õ¿^½kõ.”±ßíwƒÿ†ÿ†ÿ,ªZTµ¨ V^qxÅapžwžwž‡_ƒ¯Á888 ›¤0T÷5w¿»µýPQUQ0ჲ«eWäˆQ·EDþU }<Ó·Ôî5ÈMËM#hÍëµs×Î];%|Ðø ñA#ø¶ú¶ú¶BFfFfF&ŒŒŒŒŒŒDë×5®k\yžw’à…3Wö]Ù§vCû¡öCþ[D %žü¹ºÈÇÝãnPåsçè§ú¨> ¹é¹i¹iТµh- ¬¤¯¤¯¤N;}ìô±…ùÖ»­w[ïÂòòååËË¡¹ºyó~H¹“üIò'ðçß5U7UŸ>aÓÝéîTí²ÈáqxxVúœuÎ:yODD¾wŒ;3œ"q{âöÆíÁƒÌ[OoOoO¯Hwcwcw£ÈNÛNÛN›,°M'6ØtB¤dUɪ’U"m¿o{£í ûˆÝawˆ¸J\>—O¾qf9³Dl.G±£˜gí‚ù™ù™­OtýEýEÛ2Yb‡†Þ ½)¢¯Õ×êk£„Í×›¯7_É^Ÿ½>{½HêÁÔƒ©Eõú@½H“½ÉÞdé u†:C""ù¿Í9ÿe‘ô©ô¯Ó¿ÙP³!uCª,¹_t¿HÄþ3zéµõÙŦåkù·nÊò®o»¾‘_Šˆ°ÇÒUPSPQP!²¬fYͲš¨°ÄáÄáÄa‘ҜҜҜhÜ0 Ã0D.×]®»\'’7š7š7*²£pGáŽBoº7Ñ›(òî_N9uDB™þ¥W—^e-ΧˆíŸÓOM?uëæ\»ðú ì­²·¬afCX G÷”‚3fõÐC0Î8ã ÷~üøQ¾á›¼³á¡ð5*½e^àÁÜ©œïcÊuÇuG‹ÃÐôh3wë_ê_2£ÆH!%Êg^0/˜@•ªRU#Ä‹/˜nÓmºJ^çu0Bæ3æ3`üÿÇSLAf™fb`÷™drn®A¡Ì]æ.t‚F§Ñƒ?Ï· óÿè®´î.뮌´Ç9NRt‰ á!ªKu`ÃQßÊÏo‰¹ñž…oñYüówå#ûºxdßcæ öÿ °Ëzfr_>j7€6¨F¨§@ÝP7ÐØC%•(£Ûðžh¥P•ªRU˰cùIRÔ”J×zͬ¨ ã³½|wùnSàã¶RD$ë88Ž@ÀΗ£Ž~…Ýúhj>e>…mPÔc|šWój^˜Ù7³ofh9ZŽ–'ÈwÌ\úNKÒ’ÀÛ7ýÌô3,£a|¸{èî!à;Ç c0`7õÿi¾µïÕ¾j€ñ’ïèÌ™P¸¦ðÕÂWQ='{>îù8Fäò»ü.?¤Ö¤Ö¤Ö@‘»È]ä†Ù–ٖٖXœ¿Íßæoƒ-²yió$ÿ#y$yµ³¡bOÅàn˜j¿¨ýH ëõˆÈWuðÙØgcð耪zùOééͺ^{xíᵇ0äò y`űÇVƒ[÷†o CÍ‘š#5Gà²vY»¬Å„5ímÚÛ´Ö»Ö»Ö»bþÜé_l$ø·}»úv©*èmèm€Ð§a=VKFÚçiŸç­“o^É}%W$ù¯""–ÖÁO¯~}õkIÌû]Þyoˆ‹ƒÅÁb_‹¯Å×"2}}úúôu‘ÒÆÒÆÒF‘‰Å‰Å‰E‘ÜôÜôÜt‰~+Ý+Ý+Ý"SÎ)ç”S¤³¾³®³Nä{ý~æýLIôݾŸv?ÍÒ*RÜZÜ*"¿M¾˜|1oU~fsÙ\d˄à ‡Eä#™µM$¬NX-b¯²¿m[ÄzÆzÆzFdáèÂÑ…£"yYyYyY"ã]ã]ã]"s—æ.Í]iKiKiK‰ +¹Yr³ä¦He~e~e¾HÏÞžwzÞ±Ž[mV›ˆ£ÒqÅqEfErrD,ÛÛ²í‚Ñmt[­ÒVɯ-¿‘åòŸ0pHB„™·ÍÛæm"SSS"“÷&ïMÞiõ·ú[ý"“jRM*ççç‘®š®š®‘$o’7É+âéóôyúDª³ªŸ¯~^äúá-Ã[DŠŽ9‹œ²\ýþ k'9i¹¹•_ÕñÏNO§øMøŒEŽBpÿÖýöo€¡þ¡þ¡þØißÔ¾©}¬ ­ ­ AÇbÇbÇ"øÖøÖøÖÀ¶ìmÙÛ²a.y.y.Ž—/;^ùó ó áïåÝ Ý #ͦJ=}êô)àßa=aÍW öÝÚwMZã%Bàq83ª(“L2œàD\{a„ âü 0|Ï·|k{œ …Æ€œè­l®mþ¹•Ñ>¦vŒQm4v«¶¿×úµ~ÔC2ȈñvÃnØA¯Ö«õj0JR£páÂF†‘ad Š*ЗŒŒ@ÿÕ’{ÉÍ‚±/ÚÇ î!Ǩc4`ç±ÙÇ~Òù++£mtGz¯Þ hƛƛhѬXb xÌ"‹qR€/Þh­ÊxËx  ~Q¿‡åûIçÿѬ4g—9+‰Ì68Ä!R£[ŒîÒ]A ¨,X f›ëf¼™oâ™ø&ŸÉ•Oìëâ‰}=™/Øÿ¤ÈÌôþ²dIEND®B`‚routino-3.4.3/web/www/routino/icons/marker-49-red.png 644 233 144 4270 14774263775 15625 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜmIDATXí—{LTWÇ÷1"ˆ‹K} »EvÑEŠÁ—FytÀd§¦b‚Š-ĬÅn×ÅÆVA«Dd+MÅ!°-|­ÉZ·ìFKÉV¶¬‰¦¤%uf*cCyŒ8ÎÀ½÷|÷æÜy$Õlvÿ\~çüŸ9ç{Î D6BL\a‹°EØ„ÇþèI­“Z'µæ-•UY•Õÿ…Ñ"ZLL³j’I&™û@¨Ïªy<ÏçõxýÐ~âòPž`¾í´¶‹Í¡ó³æË­r«ÜÚ<(ìv;t˜Ø‘Ø‘Øü5¿'¿'¿XÓ»¦wM/PYYðù<çù¼¯Ïû=‡Äe¡~ÂGâ#ñ‘øÈ¹ˆ¯ÐÜâ¹Ås‹Õ·ÚÚÚY”û¡û¡û! $x0ŠQŒp ' ûþyÏóy=^?´_ÂGOç#ãTÑ%ºD—ó*/y#óFæ åwöqû¸}vø¥°l– E­P.(5Íÿ5«¯©¯jšºL]¨j‚š°É"¡ð|û¸Ýg÷ÁÎëëÀ!ýSu4¡Yhš‰äƒòAù`Ó-ž`ª6U›ª³öÛ¶À­4)”sjojoc6fCÀ4=#‘%Ó¬š`ΉQ¥ImR›öŽ«ÅÂÍ£MÕ¦rS¹bæý9ç#Ã=Ã=ýßÿ–+•ÆJ–èp 80ì¯ãV«çÕó€*Tpc5VÀã½÷€o©o)‚í|êRu)÷ˆeÄãõãõ€zX»¯Ý×cÝŽ‡æÐ0l¬4î5îe‰œGç“·Ê[å­7ò‰º¢º¢º"Vâ/àQš•sÊ9`嬀×þaÚÓ`¦q¦,3-3ƒ9{j{j`qÞâ<`âð=Wþ\9´Þn½ (Í!?ÎSWT·¾n=+ÑW6„XìÂØ…± Q=˜7˜7˜§'*ˆgCl€[;¨ ®¹qñÆÅA°ôXz‚ç3J3J ¡/¡¾XûÅZxÃþ†€;jOÔñ÷ß»ÿ^ ß`ÞÀÅ‹çá|ôÏ«Ž¬:²êHà—©vuPЯ~£~ `é²tÀŒ¶mÁ õ-õ-ÁqÂ!áœ4Ÿ4xG¼ ¤)úϘΘÕçá|¢ÿHÍ7är ¹ú‹ Íl [CD3¤Ò"¢Û—o_&"Ú·zßj"¢½z‰ˆ¦,˜²€ˆhÌ>f¾A’Ö'­'":q:ƒˆÈÝéî$"úxþÇó‰ˆð5¾&¢É¾_ ¹~" -†C‹~äçûAqÁÕîjwµ“Ý'z«½Õ$I4ärô죒9%sˆˆÌV³•ˆè•_y‘ˆÈó­ç[""Ï~Ïþà^…‹Q¯Ú«=Ÿõ|ÑáÒÃ¥D4æû+°‚HüdÄ?*õ;ûýN²s>Í¢Y4?ð/qõ©í'Å“b&»Ú]íUUÀeŠ2ÀÔÚ©µ ¥IiÁ¨ØU± ní¹µ:/u^o®7€r'çNN ^=wiÞ¥y~ÿ¨ù,ý³týÜ"¤ ©Bêø’–HK¤%»«ø)‹ÿ¥ñŽñŽšàXëÜçÜÈG>Ü,çËî/» #º#û´÷Ó^ b*€·ßj¶Œ-€‚Æ‚F˜m›m€Ž†Žóiói/'—$—À˜qÌŸ¾m¾mÀÂÝÉG“jú Í’fI³ê‡):7:7:—H¾._—¯[]ú…_`J7¥«¥ü§je¬‹uÁ~¹{¼7¼7`zßô>¨?U*ø<ô%ô%@¶-pûW|8ùjòU@«ï:ÞuŒGÿëõc¯Ó<:àfi³´ùκ ?’ŸznsR /^pžä ee'ÊN°ýþø¹o’oÀN±SÜÃÃàIò$:ÑÄëÓ~Ô~wš; P‹|ßû¾lõÙGgkÎÖàeý ­«Ä*ož0[˜-ÌþMC Ô¥Ÿ¯ÂFaãKÁ*X+׊ö'[›­ÍÖXOµT- ¬7âaÏX«6MX;ÏÎë³n—ÕuÈuˆŸ/ÅKÊV}%÷KïKï—™t43™É,¬Y”EYò~j¦fj&’ú¥~©ÿíOô§ÕbØ`ƒ À†0XX5IMR“Z¬M¯M¯Mg9¼ž!Æcˆqy'|ãäЮ…m= aî硾q²!ÕjHuœ ÒnEYEvc”%&¤õi}Z_@‹ÝèF7`‹ìŽìŽìfùº&£Åh1úÕ}aR<ÆAOjô›ÿ,í*mJ›ÒP'qOâ€ä‘ä‘äõ׺[¤©åX—š_zá€?£gX €ø)íÖkŒ5JŒÃê°:¬|ðÁ‡NZv¥ìJÙ•Àµ#[d‹léöÿKùϰ¾þqŠz`¸ñ„WýÚ½üSÚÍ^™½2{e@»¶ [†-g&晾B¡P(¾´;´8ÖW ÿÒž¥ÝåR•T%U9Ó8paeaea%;š2–2–2¦ÜÖ·º_ê—úËæR5Qù¯ÉÖ/‚þG ×îP?û;a“°IØÐ ZA+´âqŽ8H þþy¼'Þï!’nJ7¥›Âßü‰ëÂvîÿf1ú_¹”K¹ò­Ðé]E"™ÈášpM¸vÿ㿲…íŒ=¬î3·ú?"?7÷ÇÛçÿIEND®B`‚routino-3.4.3/web/www/routino/icons/limit-20.9.png 644 233 144 3265 14774263776 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜjIDATHÇÍ–ïOTWÇŸ;ƒÃo£ÁÒ6øc§!éJšj€JÀmi˜ŠQ«Öhi¬¸›Å[»‘jÈÖ¾X¶É²˜ "Õlj´bi Ö4º]# 2 ÝØi&²Î{Ïg_Ì\†Ýîàysó}Îó|Ÿï='ç{Ž€ˆˆ¤D¾– K†%)Œ-»¢ñØâØâO†q£Ú›Ú›·þÉŸ& °àØ‚cÆH›ófþÜz‘(ÿÜ~f\R$°}nû\+ˆàC°1{cvì¢0>Òö³ö³OB°ûÜîsgŽŸ9Îûðà›ßLL@›óf¾YoòÍå—CÿÓ_æuÌëÐîm¾m¾de½PNp¿e¯—½ðƒõ«²€þ3@‚*|ø0ÇÃ9Øœä›õ&ŸÉoö3û‡õ¤å§å‹ð×òÇåíÍá‚‘6šjŽ×Õ<ˇ4ÒHèš® = =ůþi4 À9Õ®ÚÔwê;À¯oÒ7á‡Ðdhø M4‘ ®FøÎÕtÖtšGÚ8í´:­öfSü÷Þ~²žåk+Ö‚ú@ð àǪÕ8d"¨ U¦ÊD©ÕKê¥Ù•BY•UYm¼ÍÛÑ8ñÊ£<(µP÷é>‚æŠþÿÆŠêŠjSà'ëçl¥ˆÈŠºí­öV_ ¸³ÜY| €ßü¼ìÇ~üˆ™`I°&XíçwûÝ~7x3½™ÞLPÙ*[eÏÔFmQ˜Æcáa÷O‹ZÌŒq'Ìc‡Çö+ö+¾S¨5""—aÏÇ{>†é«ßø¢äDÉ HNL^‘¼µö·kß[ûLÖNÖNÖB•QeT[[[ [{·öníåczÇôŽéP"ÅâÄ]Œ‰Amúеϵ ÷ƒª U€¤°‹ñ/‘_·‹”ו׉|Qÿeé—¥Z®{·;Õ*)ßÔí©Û¢%t$\L¸(â:è:è:(2š3š3š#2??/rõÚÕkW¯‰´¶¶ÊìhÝÞº½u»ÈôßNßN‘™õ3+gVŠv{ßhÆh†þÞsáÝ ïj¹"Î~g¿ˆ~4¬ÇcIœHœÈY#’ãÌqŠ”|ûªöª¦5÷ ôyû¼bëüGçõÎë"ÓÎiç´SdÑÒEK-IZ´:iµHz}z}z½H†#Ñáß<¾y|sTXúžô=é{D<)žOŠÈ©ý§jNÕˆ|¯ßþþób›¼u?é~’Ö,RÐ\Ð,"oÅõÆõ欉‘?[ïZïâ mLÓdqÏ‚ÁƒâýC\ý“ú'’Öy©{¨{HäôèéÑÓ£"ƒYƒYƒY"Mš4ˆ †‚¡`H$~Iü’ø%ÑxqKqKq‹È­á[÷†E:Š:Š:ŠD,÷,7,7DìÛì—í—Å+2/{^¶¤ivk¥µ‡Å¸ª ÕiÃr&îAÜ‘ó7»Ü]nIûÓÓ#‰GE¶lËß–/2äòyE’&/L^(â™ï™ï™/R;P;P; âõx=^H®#בëi[Ö¶¬m™H___¿H×Þ®½]{E Ë K KER¥¦Š¬Û¿.e]Ф‰L¹¦\"–t®s]ýw""7jàüöóÛá«áÏ>S;‹+_ó¿æÇ¿Á¿arÃ$¬ª[U·ªúûû¡ÃÖaë°A^^^^^tÝëº×u¦Š¦Š¦Š ¬¹¬¹¬e=Êz” Îgƒr×ç¾’û |UÑ>Ó>ƒ?b6;Õ™“ÇNî†õDì¢ñ2T•T•˜gÉX z§Þ øñàAͳ|òÉNp‚sŽßQŽrpàÀ1'ÞC=À÷Œ3µ=Ž…Ü!7={*«é°áLÄǰÙÇ|1êë±Ü±\ÐëÃ>£ßø>fôzý’~ ÔMuM]£Ò¨4*AwèÝF¯Ñkô-´ÐF¼oÄﳋ] ŒåÆrÐW>|ÀŒñûY{yìe d¿c¿ã‹áiÄÇ~áü—æÒoÄ™ëÝz7ðÈ(5J ˆü1„ðÍ0g- `Ї<Œd‚Bïïį÷ê³~¼.›Ëö?rWâÜäÜ4ç®dÿsûŸ›%8 æ0 ò…|ú} ~Pýª ¢Øœ7óÍz“Ïä7û™ýgïÊgöuñ̾ǞÍì÷l„Á˜IEND®B`‚routino-3.4.3/web/www/routino/icons/limit-59.png 644 233 144 2571 14774263775 14715 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü.IDATHÇÍ–_hTGÆÏÞ˜f£‰f š6,—Fªê‹Öüi­($)Ô’‡¨4ô! .B´DJÛ—J)dc VQ7«QPl‹¶Iꃤ$¨m‚Ul®I7ÙÆlöÞ™_îÞ½kÁÖGçårΙó}ßœ;sfDD¤(ý0JRc¹mï¹~ï[Þ·^þÚ¶¿´Àó¶çí±aEçŠN_·¯[Ývm'îÌÏÎqñ³ù¿‰ëÈ;›wÖS¶Â»ëÞ]ç}Á¶?½ùçòÏýmBkk?@_O_m09890S=S ®íÄùN¾ƒ—/GÿÅ/¹¹ž{÷\Þs"PöfÙ›köÙ&Ö@Ýκ¿çüž£ °¢@º˜cgIJl'žžïä;x¾ÃçðÛzVV­¬†Æ†Æüp»x1ð¢Ã—:Ç h+5“šý§YmV“Ô“ê´: Œë =œÐ»õnÐ7͵æZ’ô™'ÌtÒIVÀK—·{]~[<þo?{Þñ¾ãÍú¬AkXPMª‰&š…Ç*>|ø@?¯}ÚçºuŽ®Ðh꬈!VÌŠ‹¾ÃçðK¶ µŸCþdþäÜøÕúÕ°Têa^›”S³µ³›g7ÃÔ•©+SW Z­ŒV‚*U¥ªRáT8†X0ŒA«15–µ€ßÔfµ™ù´µ#×á·õ¤…}yÞÿèýœlµ^[©¿R¹ ÿ¿¿ewËî–Ýÿ!ÿ!ÿ!ØpxÃá ‡a(6ŠAC¸!Üo¿·ßÛ6ÆÃ¨é0?0?pù\~[a×íµˆÈÖ[¤Ë(žJ9êYïY/‹ŽcvålÉl‰ˆqɸd\ililil¹ºýêö«ÛEFý£þQ¿È”gÊ3åY¨_¨_¨¹Óq§ãN‡È™³g"g"’!P5:®ã¾§òqþ×"†Èòï—¿a“HUmUm&/ÄWò­|+yŽg¢k¢k¢KdIbIbIBäráåÂË…"Û–m[¶m™Èü±ùcóÇDâÃñáø°ÈÉ“'Dî?ºÿèþ#‘é¦é¦é&qÇ'Æ7Æ7¾'äòÛz ‘œºœ:^Éäº+zèùÊøÎøÎÅ)}Pú ôH¨!Ôj\=¸zpµH¡¯ÐWèI%‡’C"m¶@[@äBû…ö í"Æ=ãžqOdióÒæ¥ÍY–ɫòªËçòÛz u^÷Ü1ëÍúÌÄ•úu]¢K\œ[#·Fnˆ´¬jYÕ²J¤«£«£«C$J„!‘ÅÖÅÖÅV‘¾#}GúŽˆÔÕÕ‰OOO‹lñoñoñ»xFÂ1F\>—?­ÇÞl7À©ø©xfoî¥Çª±jHò㌻‡* F‚Ø4ºitÓ(ô–÷–÷–»ñãæqó¸ «6Vm¬‚‹».+«}„t§î&­ $™áËðÛzžx*Áœ3ç²NÑÏÜà P¨¬ã?Ì0Ã@1Å‹,Ú=*=ºé¦XÞ‚5£O>•Oîc©LÛ¯ö3O¿ð X]ÖÖ`µ[íV;¨U£j€0aÂ`E­¨«Âª°*@Ô>µ/K¨©šTóè§êcÿÙù°~P{Õ^RiÀìίÓ>§vE“$HdyQ{ÔR.Þÿvþ'Ü•™»Ì¹Ûø˜)p±Õl5“}M_Àƒ\Û‰g¶D:ÿ©ïÊgöuñ̾Çìã³ö‚ýJz€t)­IEND®B`‚routino-3.4.3/web/www/routino/router.html.sk 644 233 144 100710 14774263772 14374 0 Routino : PlánovaÄ trás pre OpenStreetMap dáta

Možnosti Výsledky Dáta
Routino OpenStreetMap PlánovaÄ Táto webová stránka umožňuje smerovanie v rámci údajov zhromaždených z OpenStreetMap. Vyberte poÄiatoÄný a koncový bod (kliknite na ikony znaÄiek nižšie), vyberte preferencie trasy a dajte vyhľadaÅ¥ trasu.
+ - Body
Uzavrieť okruh:
OpaÄné poradie:
Hľadať
+ - Typ prepravy
Pešo:
Kôň:
Invalidný vozík:
Bicykel:
Moped:
Motorka:
Motorové vozidlo:
Nákladné vozidlo:
Ťažké nákladné auto:
Verejná doprava:
+ - Nastavenia ciest
+ - Rychlostné limity
+ - Rozšírené nastavenia ciest
+ - Iné obmedzenia
+ - Pomoc
struÄný návod
Kliknite na ikony znaÄiek (vyššie) a umiestnite ich na mapu (vpravo). Potom ich presuňte do správnej polohy. Priblíženie mapy pred umiestnením znaÄiek je asi najjednoduchÅ¡ie. Prípadne zadajte zemepisnú šírku a zemepisnú dĺžku do polí vyššie.

Vyberte typ dopravy, povolené typy ciest, rýchlostné obmedzenia, vlastnosti ciest a ÄalÅ¡ie obmedzenia z vyššie uvedených možností. Zvoľte "NajkratÅ¡ia" alebo "NajrýchlejÅ¡ia" trasa pre jej výpoÄet a zobrazenie na mape.

Trasové body
Kliknutím na ikony znaÄiek prepnete ich zobrazenie na mape. VypoÄítaná trasa prejde (Äo najbližšie pre vybraný typ dopravy) každý z trasových bodov, ktoré majú znaÄky na mape v uvedenom poradí.

Typ dopravy
Výber typu dopravy obmedzí zvolenú trasu na tie, na ktorých je to povolené a nastaví predvolené hodnoty pre ostatné parametre.

Predvoľby ciest
Preferencie ciest sa urÄujú na základe percent a výsledná trasa sa snaží dodržiavaÅ¥ zvolené preferencie. Napríklad, ak má "cesta I. triedy" hodnotu "110 %" a "cesta II. triedy" má hodnotu "100 %", trasa na ceste I. triedy môže byÅ¥ až o 10 % dlhÅ¡ia ako na ceste II. triedy a stále sa použije.

Obmedzenia rýchlosti
Zvolené rýchlostné limity pre rôzne typy ciest sa aplikujú, ak cesta nemá iný rýchlostný limit alebo je vyšší ako zadaný.

Rozšírené nastavenia ciest
Nastavenie vlastnosti sa vyberá v percentách a podľa toho sa vyberajú trasy, ktoré majú preferované atribúty. Napríklad, ak je "spevnená" cesta nastavená na "75 %", tak nespevnená cesta má automaticky preferenciu "25%", takže trasa na spevnenej ceste môže byť 3x dlhšia ako nespevnená a stále bude vybraná.

Iné obmedzenia
Tieto obmedzenia umožňujú nájsÅ¥ trasu, ktorá sa vyhýba vyznaÄeným obmedzeniam na hmotnosÅ¥, výšku, šírku alebo dĺžku. Je tiež možné ignorovaÅ¥ jednosmerné obmedzenia (napríklad pri chôdzi).

SmerovaÄ: Routino | Geo dáta: | Dlaždice:
routino-3.4.3/web/www/routino/visualiser.html.es 644 233 144 53146 14774263773 15227 0 Routino : Data Visualiser for Routing Data
Visualiser Router Data
Visualizador Routino This web page allows visualisation of the data that Routino uses for routing. Only data relevant for routing is displayed and some will therefore be excluded.
Instrucciones Zoom in and then use the buttons below to download the data. The server will only return data if the selected area is small enough.
Estado
No data displayed
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Ayuda
Quick Start
Zoom to an area and select one of the buttons to display that type of data.
More data options can be found by expanding the details below each button.

Data Failure
If the area selected is too large (depends on the data type) then the status will say "Failed to get visualiser data" - zoom in and try again.

Enrutador: Routino | Geo Data: | Tiles:
routino-3.4.3/web/www/routino/profiles.pl 644 233 144 20051 14774263770 13707 0################################################################################ ########################### Routino default profile ############################ ################################################################################ $routino={ # contains all default Routino options (generated using "--help-profile-perl"). # Default transport type transport => "motorcar", # Transport types transports => { foot => 1, horse => 2, wheelchair => 3, bicycle => 4, moped => 5, motorcycle => 6, motorcar => 7, goods => 8, hgv => 9, psv => 10 }, # Highway types highways => { motorway => 1, trunk => 2, primary => 3, secondary => 4, tertiary => 5, unclassified => 6, residential => 7, service => 8, track => 9, cycleway => 10, path => 11, steps => 12, ferry => 13 }, # Property types properties => { paved => 1, multilane => 2, bridge => 3, tunnel => 4, footroute => 5, bicycleroute => 6 }, # Restriction types restrictions => { oneway => 1, turns => 2, weight => 3, height => 4, width => 5, length => 6 }, # Allowed highways profile_highway => { motorway => { foot => 0, horse => 0, wheelchair => 0, bicycle => 0, moped => 0, motorcycle => 100, motorcar => 100, goods => 100, hgv => 100, psv => 100 }, trunk => { foot => 40, horse => 25, wheelchair => 40, bicycle => 30, moped => 90, motorcycle => 100, motorcar => 100, goods => 100, hgv => 100, psv => 100 }, primary => { foot => 50, horse => 50, wheelchair => 50, bicycle => 70, moped => 100, motorcycle => 90, motorcar => 90, goods => 90, hgv => 90, psv => 90 }, secondary => { foot => 60, horse => 50, wheelchair => 60, bicycle => 80, moped => 90, motorcycle => 80, motorcar => 80, goods => 80, hgv => 80, psv => 80 }, tertiary => { foot => 70, horse => 75, wheelchair => 70, bicycle => 90, moped => 80, motorcycle => 70, motorcar => 70, goods => 70, hgv => 70, psv => 70 }, unclassified => { foot => 80, horse => 75, wheelchair => 80, bicycle => 90, moped => 70, motorcycle => 60, motorcar => 60, goods => 60, hgv => 60, psv => 60 }, residential => { foot => 90, horse => 75, wheelchair => 90, bicycle => 90, moped => 60, motorcycle => 50, motorcar => 50, goods => 50, hgv => 50, psv => 50 }, service => { foot => 90, horse => 75, wheelchair => 90, bicycle => 90, moped => 50, motorcycle => 40, motorcar => 40, goods => 40, hgv => 40, psv => 40 }, track => { foot => 95, horse => 100, wheelchair => 95, bicycle => 90, moped => 0, motorcycle => 0, motorcar => 0, goods => 0, hgv => 0, psv => 0 }, cycleway => { foot => 95, horse => 90, wheelchair => 95, bicycle => 100, moped => 0, motorcycle => 0, motorcar => 0, goods => 0, hgv => 0, psv => 0 }, path => { foot => 100, horse => 100, wheelchair => 100, bicycle => 90, moped => 0, motorcycle => 0, motorcar => 0, goods => 0, hgv => 0, psv => 0 }, steps => { foot => 80, horse => 0, wheelchair => 0, bicycle => 0, moped => 0, motorcycle => 0, motorcar => 0, goods => 0, hgv => 0, psv => 0 }, ferry => { foot => 20, horse => 20, wheelchair => 20, bicycle => 20, moped => 20, motorcycle => 20, motorcar => 20, goods => 20, hgv => 20, psv => 20 } }, # Speed limits profile_speed => { motorway => { foot => 0, horse => 0, wheelchair => 0, bicycle => 0, moped => 48, motorcycle => 112, motorcar => 112, goods => 96, hgv => 89, psv => 89 }, trunk => { foot => 4, horse => 8, wheelchair => 4, bicycle => 20, moped => 48, motorcycle => 96, motorcar => 96, goods => 96, hgv => 80, psv => 80 }, primary => { foot => 4, horse => 8, wheelchair => 4, bicycle => 20, moped => 48, motorcycle => 96, motorcar => 96, goods => 96, hgv => 80, psv => 80 }, secondary => { foot => 4, horse => 8, wheelchair => 4, bicycle => 20, moped => 48, motorcycle => 88, motorcar => 88, goods => 88, hgv => 80, psv => 80 }, tertiary => { foot => 4, horse => 8, wheelchair => 4, bicycle => 20, moped => 48, motorcycle => 80, motorcar => 80, goods => 80, hgv => 80, psv => 80 }, unclassified => { foot => 4, horse => 8, wheelchair => 4, bicycle => 20, moped => 48, motorcycle => 64, motorcar => 64, goods => 64, hgv => 64, psv => 64 }, residential => { foot => 4, horse => 8, wheelchair => 4, bicycle => 20, moped => 48, motorcycle => 48, motorcar => 48, goods => 48, hgv => 48, psv => 48 }, service => { foot => 4, horse => 8, wheelchair => 4, bicycle => 20, moped => 32, motorcycle => 32, motorcar => 32, goods => 32, hgv => 32, psv => 32 }, track => { foot => 4, horse => 8, wheelchair => 4, bicycle => 20, moped => 16, motorcycle => 16, motorcar => 16, goods => 16, hgv => 16, psv => 16 }, cycleway => { foot => 4, horse => 8, wheelchair => 4, bicycle => 20, moped => 0, motorcycle => 0, motorcar => 0, goods => 0, hgv => 0, psv => 0 }, path => { foot => 4, horse => 8, wheelchair => 4, bicycle => 20, moped => 0, motorcycle => 0, motorcar => 0, goods => 0, hgv => 0, psv => 0 }, steps => { foot => 4, horse => 0, wheelchair => 4, bicycle => 0, moped => 0, motorcycle => 0, motorcar => 0, goods => 0, hgv => 0, psv => 0 }, ferry => { foot => 10, horse => 10, wheelchair => 10, bicycle => 10, moped => 10, motorcycle => 10, motorcar => 10, goods => 10, hgv => 10, psv => 10 } }, # Highway properties profile_property => { paved => { foot => 50, horse => 20, wheelchair => 90, bicycle => 50, moped => 100, motorcycle => 100, motorcar => 100, goods => 100, hgv => 100, psv => 100 }, multilane => { foot => 25, horse => 25, wheelchair => 25, bicycle => 25, moped => 35, motorcycle => 60, motorcar => 60, goods => 60, hgv => 60, psv => 60 }, bridge => { foot => 50, horse => 50, wheelchair => 50, bicycle => 50, moped => 50, motorcycle => 50, motorcar => 50, goods => 50, hgv => 50, psv => 50 }, tunnel => { foot => 50, horse => 50, wheelchair => 50, bicycle => 50, moped => 50, motorcycle => 50, motorcar => 50, goods => 50, hgv => 50, psv => 50 }, footroute => { foot => 55, horse => 50, wheelchair => 55, bicycle => 50, moped => 50, motorcycle => 50, motorcar => 45, goods => 45, hgv => 45, psv => 45 }, bicycleroute => { foot => 55, horse => 50, wheelchair => 55, bicycle => 60, moped => 50, motorcycle => 50, motorcar => 45, goods => 45, hgv => 45, psv => 45 } }, # Restrictions profile_restrictions => { oneway => { foot => 0, horse => 1, wheelchair => 0, bicycle => 1, moped => 1, motorcycle => 1, motorcar => 1, goods => 1, hgv => 1, psv => 1 }, turns => { foot => 0, horse => 1, wheelchair => 0, bicycle => 1, moped => 1, motorcycle => 1, motorcar => 1, goods => 1, hgv => 1, psv => 1 }, weight => { foot => 0.0, horse => 0.0, wheelchair => 0.0, bicycle => 0.0, moped => 0.0, motorcycle => 0.0, motorcar => 0.0, goods => 5.0, hgv => 10.0, psv => 15.0 }, height => { foot => 0.0, horse => 0.0, wheelchair => 0.0, bicycle => 0.0, moped => 0.0, motorcycle => 0.0, motorcar => 0.0, goods => 2.5, hgv => 3.0, psv => 3.0 }, width => { foot => 0.0, horse => 0.0, wheelchair => 0.0, bicycle => 0.0, moped => 0.0, motorcycle => 0.0, motorcar => 0.0, goods => 2.0, hgv => 2.5, psv => 2.5 }, length => { foot => 0.0, horse => 0.0, wheelchair => 0.0, bicycle => 0.0, moped => 0.0, motorcycle => 0.0, motorcar => 0.0, goods => 5.0, hgv => 6.0, psv => 6.0 } } }; # end of routino variable 1; routino-3.4.3/web/www/routino/router.html.pl 644 233 144 100513 14774263772 14373 0 Routino : Planowanie trasy dla Danych OpenStreetMap
Opcje Wyniki Dane
Routino OpenStreetMap Planowanie Trasy This web page allows routing within the data collected by OpenStreetMap. Select start and end points (click on the marker icons below), select routing preferences then find a route.
+ - Punkty
Zamknij pętlę:
Odwrotna kolejność:
Znajdź
+ - Typ transportu
Pieszo:
Konno:
Wózek inwalidzki:
Rower:
Moped:
Motocykl:
Samochód:
Dobra:
Pojazd ciężarowy:
Pojazd użyteczności publicznej:
+ - Preferowanie autostrad
+ - Ograniczenia prędkości
+ - Ustawienia zmiennych
+ - Inne ograniczenia
+ - Pomoc
Quick Start
Click on marker icons (above) to place them on the map (right). Then drag them to the correct position. Zooming the map before placing the markers is probably easiest. Alternatively type the latitude and longitude into the boxes above.

Select the transport type, allowed highway types, speed limits, highway properties and other restrictions from the options above. Select "Shortest" or "Quickest" to calculate the route and display it on the map.

Waypoints
Clicking on the marker icons will toggle the display of them on the map. When a route is calculated it will visit (as close as possible for the selected transport type) each of the waypoints that have markers on the map in the order given.

Transport Type
Selecting a transport type will restrict the chosen route to those on which it is allowed and set default values for the other parameters.

Highway Preferences
The highway preference is selected as a percentage and routes are chosen that try to follow the preferred highways. For example if a "Primary" road is given a "110%" preference and a "Secondary" road is given a "100%" preference then it means that a route on a Primary road can be up to 10% longer than on a secondary road and still be selected.

Speed Limits
The speed limits chosen here for the different types of highway apply if the highway has no other speed limit marked or it is higher than the chosen one.

Property Preferences
The property preference is selected as a percentage and routes are chosen that try to follow highways with the preferred property. For example if a "Paved" highway is given a "75%" preference then it means that an unpaved highway is automatically given a "25%" preference so that a route on a paved highway can be 3 times the length of an unpaved one and still be selected.

Other Restrictions
These allow a route to be found that avoids marked limits on weight, height, width or length. It is also possible to ignore one-way restrictions (e.g. if walking).

Router: Routino | Geo Data: | Kafelki:
routino-3.4.3/web/www/routino/visualiser.openlayers.js 644 233 144 76266 14441354752 16446 0// // Routino data visualiser web page Javascript // // Part of the Routino routing software. // // This file Copyright 2008-2014, 2019, 2020, 2023 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // // // Data types // var data_types=[ "junctions", "super", "waytype", "highway", "transport", "barrier", "turns", "speed", "weight", "height", "width", "length", "property", "errorlogs" ]; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Initialisation ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Process the URL query string and extract the arguments var legal={"^lon" : "^[-0-9.]+$", "^lat" : "^[-0-9.]+$", "^zoom" : "^[-0-9.]+$", "^data" : "^.+$", "^subdata" : "^.+$"}; var args={}; if(location.search.length>1) { var query,queries; query=location.search.replace(/^\?/,""); query=query.replace(/;/g,"&"); queries=query.split("&"); for(var i=0;i=0; l--) { mapprops.mapdata[l].tiles.url=mapprops.mapdata[l].tiles.url.replace(/\$\{/g,"{"); var urls; if(mapprops.mapdata[l].tiles.subdomains===undefined) urls=[mapprops.mapdata[l].tiles.url]; else { urls=[]; for(var s=0; s" + data_text + ""; document.getElementById("attribution_tile").innerHTML="" + tile_text + ""; } change_attribution(0); // Add two vectors layers (one for highlights that display behind the vectors) layerHighlights = new ol.layer.Vector({source: new ol.source.Vector()}); map.addLayer(layerHighlights); layerVectors = new ol.layer.Vector({source: new ol.source.Vector()}); map.addLayer(layerVectors); // Handle feature selection and popup map.on("click", function(e) { var first=true; map.forEachFeatureAtPixel(e.pixel, function (feature, layer) { if(first) selectFeature(feature); first=false; }) }); createPopup(); // Move the map map.on("moveend", (function() { displayMoreData(); updateURLs(false);}), map); var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon !== undefined && lat !== undefined && zoom !== undefined) { lat = Number(lat); lon = Number(lon); zoom = Number(zoom); if(lonmapprops.eastedge) lon=mapprops.eastedge; if(latmapprops.northedge) lat=mapprops.northedge; if(zoommapprops.zoomin) zoom=mapprops.zoomin; map.getView().setCenter(ol.proj.fromLonLat([lon,lat])); map.getView().setZoom(zoom); } else map.getView().fit(extent,map.getSize()); // Unhide editing URL if variable set if(mapprops.editurl !== undefined && mapprops.editurl !== "") { var edit_url=document.getElementById("edit_url"); edit_url.style.display=""; edit_url.href=mapprops.editurl; } // Select the data view if selected var datatype=args["data"]; var datasubtype=args["subdata"]; if(datatype !== undefined) displayData(datatype, datasubtype); // Update the URL updateURLs(false); } // // Format a number in printf("%.5f") format. // function format5f(number) { var newnumber=Math.floor(number*100000+0.5); var delta=0; if(newnumber>=0 && newnumber<100000) delta= 100000; if(newnumber<0 && newnumber>-100000) delta=-100000; var string=String(newnumber+delta); var intpart =string.substring(0,string.length-5); var fracpart=string.substring(string.length-5,string.length); if(delta>0) intpart="0"; if(delta<0) intpart="-0"; return(intpart + "." + fracpart); } // // Build a set of URL arguments for the map location // function buildMapArguments() { var lonlat = ol.proj.toLonLat(map.getView().getCenter()); var zoom = map.getView().getZoom(); if( ! Number.isInteger(zoom) ) zoom = format5f(zoom); return "lat=" + format5f(lonlat[1]) + ";lon=" + format5f(lonlat[0]) + ";zoom=" + zoom; } // // Update the URLs // function updateURLs(addhistory) { var mapargs=buildMapArguments(); var dataargs=";data=" + displaytype; var libargs=";library=" + mapprops.library; if(displaytype === "") dataargs=""; else if(displaysubtype !== "") dataargs+=";subdata=" + displaysubtype; if(!mapprops.libraries) libargs=""; var links=document.getElementsByTagName("a"); for(var i=0; i" + id + ""); } } } drawPopup(string.split("\n").join("
")); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Server handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Define an AJAX request object // function ajaxGET(url,success,failure,state) { var ajaxRequest=new XMLHttpRequest(); function ajaxGOT(options) { if(this.readyState==4) if(this.status==200) { if(typeof(options.success)=="function") options.success(this,options.state); } else { if(typeof(options.failure)=="function") options.failure(this,options.state); } } ajaxRequest.onreadystatechange = function(){ ajaxGOT.call(ajaxRequest,{success: success, failure: failure, state: state}); }; ajaxRequest.open("GET", url, true); ajaxRequest.send(null); } // // Display the status // function displayStatus(type,subtype,content) { var child=document.getElementById("result_status").firstChild; do { if(child.id !== undefined) child.style.display="none"; child=child.nextSibling; } while(child !== null); var chosen_status=document.getElementById("result_status_" + type); chosen_status.style.display=""; if(subtype !== undefined) { var format_status=document.getElementById("result_status_" + subtype).innerHTML; chosen_status.innerHTML=format_status.replace("#",String(content)); } } // // Display data statistics // function displayStatistics() { // Use AJAX to get the statistics ajaxGET("statistics.cgi", runStatisticsSuccess); } // // Success in running data statistics generation. // function runStatisticsSuccess(response) { document.getElementById("statistics_data").innerHTML="
" + response.responseText + "
"; document.getElementById("statistics_link").style.display="none"; } // // Get the requested data // function displayData(datatype, datasubtype) // called from visualiser.html { // Display the form entry for(var data in data_types) hideshow_hide(data_types[data]); if(datatype !== "") hideshow_show(datatype); if(datasubtype === undefined) datasubtype=""; // Delete the old data vectorData=[]; unselectFeature(); layerVectors.getSource().clear(); // Print the status displayStatus("no_data"); // Return if just here to clear the data if(datatype === "") { displaytype = ""; displaysubtype = ""; updateURLs(true); return; } // Determine the type of data switch(datatype) { case "junctions": break; case "super": break; case "waytype": var waytypes=document.forms["waytypes"].elements["waytype"]; for(var w in waytypes) if(datasubtype == waytypes[w].value) waytypes[w].checked=true; else if(waytypes[w].checked) datasubtype=waytypes[w].value; break; case "highway": var highways=document.forms["highways"].elements["highway"]; for(var h in highways) if(datasubtype == highways[h].value) highways[h].checked=true; else if(highways[h].checked) datasubtype=highways[h].value; break; case "transport": var transports=document.forms["transports"].elements["transport"]; for(var t in transports) if(datasubtype == transports[t].value) transports[t].checked=true; else if(transports[t].checked) datasubtype=transports[t].value; break; case "barrier": var transports=document.forms["barriers"].elements["barrier"]; for(var t in transports) if(datasubtype == transports[t].value) transports[t].checked=true; else if(transports[t].checked) datasubtype=transports[t].value; break; case "turns": break; case "speed": case "weight": case "height": case "width": case "length": break; case "property": var properties=document.forms["properties"].elements["property"]; for(var p in properties) if(datasubtype == properties[p].value) properties[p].checked=true; else if(properties[p].checked) datasubtype=properties[p].value; break; case "errorlogs": break; } // Update the URLs displaytype = datatype; displaysubtype = datasubtype; displayMoreData(); } function displayMoreData() { // Get the new data var mapbounds=map.getView().calculateExtent(map.getSize()); var url="visualiser.cgi"; url=url + "?lonmin=" + format5f(ol.proj.toLonLat([mapbounds[0],mapbounds[1]])[0]); url=url + ";latmin=" + format5f(ol.proj.toLonLat([mapbounds[0],mapbounds[1]])[1]); url=url + ";lonmax=" + format5f(ol.proj.toLonLat([mapbounds[2],mapbounds[3]])[0]); url=url + ";latmax=" + format5f(ol.proj.toLonLat([mapbounds[2],mapbounds[3]])[1]); url=url + ";data=" + displaytype; // Use AJAX to get the data switch(displaytype) { case "junctions": ajaxGET(url, runJunctionsSuccess, runFailure); break; case "super": ajaxGET(url, runSuperSuccess, runFailure); break; case "waytype": url+="-" + displaysubtype; ajaxGET(url, runWaytypeSuccess, runFailure); break; case "highway": url+="-" + displaysubtype; ajaxGET(url, runHighwaySuccess, runFailure); break; case "transport": url+="-" + displaysubtype; ajaxGET(url, runTransportSuccess, runFailure); break; case "barrier": url+="-" + displaysubtype; ajaxGET(url, runBarrierSuccess, runFailure); break; case "turns": ajaxGET(url, runTurnsSuccess, runFailure); break; case "speed": case "weight": case "height": case "width": case "length": ajaxGET(url, runLimitSuccess, runFailure); break; case "property": url+="-" + displaysubtype; ajaxGET(url, runPropertySuccess, runFailure); break; case "errorlogs": ajaxGET(url, runErrorlogSuccess, runFailure); break; } updateURLs(true); } // // Success in getting the junctions. // function runJunctionsSuccess(response) { var lines=response.responseText.split("\n"); var junction_colours={ 0: "#FFFFFF", 1: "#FF0000", 2: "#FFFF00", 3: "#00FF00", 4: "#8B4513", 5: "#00BFFF", 6: "#FF69B4", 7: "#000000", 8: "#000000", 9: "#000000" }; var styles={}; for(var colour in junction_colours) styles[colour] = new ol.style.Style({image: new ol.style.Circle({fill: new ol.style.Fill({color: junction_colours[colour]}), radius: 2})}); var features=[]; for(var line=0;line Routino : Route Planner for OpenStreetMap Data
Asetukset Tulokset Tiedot
Routino OpenStreetMap Router This web page allows routing within the data collected by OpenStreetMap. Select start and end points (click on the marker icons below), select routing preferences then find a route.
+ - Reittipisteet
Close loop:
Reverse order:
Etsi
+ - Kuljetusmuoto
Jalankulku:
Hevonen:
Pyörätuoli:
Polkupyörä:
Mopo:
Moottoripyörä:
Auto:
Pakettiauto:
Raskaat ajoneuvot:
Julkinen liikenne:
+ - Highway Preferences
+ - Nopeusrajoitukset
+ - Property Preferences
+ - Muut rajoitukset
+ - Ohje
Quick Start
Click on marker icons (above) to place them on the map (right). Then drag them to the correct position. Zooming the map before placing the markers is probably easiest. Alternatively type the latitude and longitude into the boxes above.

Select the transport type, allowed highway types, speed limits, highway properties and other restrictions from the options above. Select "Shortest" or "Quickest" to calculate the route and display it on the map.

Waypoints
Clicking on the marker icons will toggle the display of them on the map. When a route is calculated it will visit (as close as possible for the selected transport type) each of the waypoints that have markers on the map in the order given.

Transport Type
Selecting a transport type will restrict the chosen route to those on which it is allowed and set default values for the other parameters.

Highway Preferences
The highway preference is selected as a percentage and routes are chosen that try to follow the preferred highways. For example if a "Primary" road is given a "110%" preference and a "Secondary" road is given a "100%" preference then it means that a route on a Primary road can be up to 10% longer than on a secondary road and still be selected.

Speed Limits
The speed limits chosen here for the different types of highway apply if the highway has no other speed limit marked or it is higher than the chosen one.

Property Preferences
The property preference is selected as a percentage and routes are chosen that try to follow highways with the preferred property. For example if a "Paved" highway is given a "75%" preference then it means that an unpaved highway is automatically given a "25%" preference so that a route on a paved highway can be 3 times the length of an unpaved one and still be selected.

Other Restrictions
These allow a route to be found that avoids marked limits on weight, height, width or length. It is also possible to ignore one-way restrictions (e.g. if walking).

Reititin: Routino | Paikkatieto: | Tiilit:
routino-3.4.3/web/www/routino/router.html.ru 644 233 144 104031 14774263772 14405 0 Routino : Route Planner for OpenStreetMap Data
ÐаÑтройки Результаты Данные
Routino OpenStreetMap Router This web page allows routing within the data collected by OpenStreetMap. Select start and end points (click on the marker icons below), select routing preferences then find a route.
+ - Язык
+ - Точки
Зациклить:
Обратный порÑдок:
Ðайти
+ - Тип транÑпорта
Пешком:
Лошадь:
Инвалидное креÑло:
ВелоÑипед:
Мопед:
Мотоцикл:
Машина:
Фургон:
Грузовой автомобиль:
ÐвтобуÑ:
+ - ÐаÑтройки типа дорог
+ - ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти
+ - ÐаÑтройки качеÑтва дорог
+ - Другие ограничениÑ
+ - Помощь
Quick Start
Click on marker icons (above) to place them on the map (right). Then drag them to the correct position. Zooming the map before placing the markers is probably easiest. Alternatively type the latitude and longitude into the boxes above.

Select the transport type, allowed highway types, speed limits, highway properties and other restrictions from the options above. Select "Shortest" or "Quickest" to calculate the route and display it on the map.

Waypoints
Clicking on the marker icons will toggle the display of them on the map. When a route is calculated it will visit (as close as possible for the selected transport type) each of the waypoints that have markers on the map in the order given.

Transport Type
Selecting a transport type will restrict the chosen route to those on which it is allowed and set default values for the other parameters.

Highway Preferences
The highway preference is selected as a percentage and routes are chosen that try to follow the preferred highways. For example if a "Primary" road is given a "110%" preference and a "Secondary" road is given a "100%" preference then it means that a route on a Primary road can be up to 10% longer than on a secondary road and still be selected.

Speed Limits
The speed limits chosen here for the different types of highway apply if the highway has no other speed limit marked or it is higher than the chosen one.

Property Preferences
The property preference is selected as a percentage and routes are chosen that try to follow highways with the preferred property. For example if a "Paved" highway is given a "75%" preference then it means that an unpaved highway is automatically given a "25%" preference so that a route on a paved highway can be 3 times the length of an unpaved one and still be selected.

Other Restrictions
These allow a route to be found that avoids marked limits on weight, height, width or length. It is also possible to ignore one-way restrictions (e.g. if walking).

Маршрутизатор: Routino | Гео данные: | Тайлы:
routino-3.4.3/web/www/routino/maploader.js 644 233 144 4224 13715301754 14002 0//////////////////////////////////////////////////////////////////////////////// ///////////////////// Map loader (OpenLayers or Leaflet) /////////////////////// //////////////////////////////////////////////////////////////////////////////// function map_load(callbacks) { var pending = 1; var head = document.getElementsByTagName("head")[0]; /* Allow selecting between libraries at run-time if an array is provided */ mapprops.libraries=Array.isArray(mapprops.library); if(mapprops.libraries) { if(location.search.length>1 && location.search.match(/library=(leaflet|openlayers2|openlayers)/) && mapprops.library.indexOf(RegExp.$1)!=-1) mapprops.library=RegExp.$1; else mapprops.library=mapprops.library[0]; } /* Call the callbacks when everything is loaded. */ function call_callbacks() { if(!--pending) eval(callbacks); } /* Javascript loader */ function load_js(url, urls) { var script = document.createElement("script"); script.src = url; script.type = "text/javascript"; pending++; if( urls === undefined ) script.onload = call_callbacks; else script.onload = function() { load_js(urls); call_callbacks(); }; head.appendChild(script); } /* CSS loader */ function load_css(url, urls) { var link = document.createElement("link"); link.href = url; link.type = "text/css"; link.rel = "stylesheet"; head.appendChild(link); if( urls !== undefined ) load_css(urls) } /* Load the external library and local code */ if(mapprops.library == "leaflet") { load_css("../leaflet/leaflet.css"); load_js ("../leaflet/leaflet.js"); load_js(location.pathname.replace(/\.html.*/,".leaflet.js")); } else if(mapprops.library == "openlayers") { load_css("../openlayers/ol.css", "../openlayers/ol-layerswitcher.css"); load_js ("../openlayers/ol.js", "../openlayers/ol-layerswitcher.js"); load_js(location.pathname.replace(/\.html.*/,".openlayers.js")); } else if(mapprops.library == "openlayers2") { load_js("../openlayers2/OpenLayers.js"); load_js(location.pathname.replace(/\.html.*/,".openlayers2.js")); } call_callbacks(); } routino-3.4.3/web/www/routino/visualiser.html 777 233 144 0 14774263775 20164 2visualiser.html.enroutino-3.4.3/web/www/routino/profiles.js 644 233 144 15601 14774263770 13715 0//////////////////////////////////////////////////////////////////////////////// /////////////////////////// Routino default profile //////////////////////////// //////////////////////////////////////////////////////////////////////////////// var routino={ // contains all default Routino options (generated using "--help-profile-json"). // Default transport type transport: "motorcar", // Transport types transports: { foot: 1, horse: 2, wheelchair: 3, bicycle: 4, moped: 5, motorcycle: 6, motorcar: 7, goods: 8, hgv: 9, psv: 10 }, // Highway types highways: { motorway: 1, trunk: 2, primary: 3, secondary: 4, tertiary: 5, unclassified: 6, residential: 7, service: 8, track: 9, cycleway: 10, path: 11, steps: 12, ferry: 13 }, // Property types properties: { paved: 1, multilane: 2, bridge: 3, tunnel: 4, footroute: 5, bicycleroute: 6 }, // Restriction types restrictions: { oneway: 1, turns: 2, weight: 3, height: 4, width: 5, length: 6 }, // Allowed highways profile_highway: { motorway: { foot: 0, horse: 0, wheelchair: 0, bicycle: 0, moped: 0, motorcycle: 100, motorcar: 100, goods: 100, hgv: 100, psv: 100 }, trunk: { foot: 40, horse: 25, wheelchair: 40, bicycle: 30, moped: 90, motorcycle: 100, motorcar: 100, goods: 100, hgv: 100, psv: 100 }, primary: { foot: 50, horse: 50, wheelchair: 50, bicycle: 70, moped: 100, motorcycle: 90, motorcar: 90, goods: 90, hgv: 90, psv: 90 }, secondary: { foot: 60, horse: 50, wheelchair: 60, bicycle: 80, moped: 90, motorcycle: 80, motorcar: 80, goods: 80, hgv: 80, psv: 80 }, tertiary: { foot: 70, horse: 75, wheelchair: 70, bicycle: 90, moped: 80, motorcycle: 70, motorcar: 70, goods: 70, hgv: 70, psv: 70 }, unclassified: { foot: 80, horse: 75, wheelchair: 80, bicycle: 90, moped: 70, motorcycle: 60, motorcar: 60, goods: 60, hgv: 60, psv: 60 }, residential: { foot: 90, horse: 75, wheelchair: 90, bicycle: 90, moped: 60, motorcycle: 50, motorcar: 50, goods: 50, hgv: 50, psv: 50 }, service: { foot: 90, horse: 75, wheelchair: 90, bicycle: 90, moped: 50, motorcycle: 40, motorcar: 40, goods: 40, hgv: 40, psv: 40 }, track: { foot: 95, horse: 100, wheelchair: 95, bicycle: 90, moped: 0, motorcycle: 0, motorcar: 0, goods: 0, hgv: 0, psv: 0 }, cycleway: { foot: 95, horse: 90, wheelchair: 95, bicycle: 100, moped: 0, motorcycle: 0, motorcar: 0, goods: 0, hgv: 0, psv: 0 }, path: { foot: 100, horse: 100, wheelchair: 100, bicycle: 90, moped: 0, motorcycle: 0, motorcar: 0, goods: 0, hgv: 0, psv: 0 }, steps: { foot: 80, horse: 0, wheelchair: 0, bicycle: 0, moped: 0, motorcycle: 0, motorcar: 0, goods: 0, hgv: 0, psv: 0 }, ferry: { foot: 20, horse: 20, wheelchair: 20, bicycle: 20, moped: 20, motorcycle: 20, motorcar: 20, goods: 20, hgv: 20, psv: 20 } }, // Speed limits profile_speed: { motorway: { foot: 0, horse: 0, wheelchair: 0, bicycle: 0, moped: 48, motorcycle: 112, motorcar: 112, goods: 96, hgv: 89, psv: 89 }, trunk: { foot: 4, horse: 8, wheelchair: 4, bicycle: 20, moped: 48, motorcycle: 96, motorcar: 96, goods: 96, hgv: 80, psv: 80 }, primary: { foot: 4, horse: 8, wheelchair: 4, bicycle: 20, moped: 48, motorcycle: 96, motorcar: 96, goods: 96, hgv: 80, psv: 80 }, secondary: { foot: 4, horse: 8, wheelchair: 4, bicycle: 20, moped: 48, motorcycle: 88, motorcar: 88, goods: 88, hgv: 80, psv: 80 }, tertiary: { foot: 4, horse: 8, wheelchair: 4, bicycle: 20, moped: 48, motorcycle: 80, motorcar: 80, goods: 80, hgv: 80, psv: 80 }, unclassified: { foot: 4, horse: 8, wheelchair: 4, bicycle: 20, moped: 48, motorcycle: 64, motorcar: 64, goods: 64, hgv: 64, psv: 64 }, residential: { foot: 4, horse: 8, wheelchair: 4, bicycle: 20, moped: 48, motorcycle: 48, motorcar: 48, goods: 48, hgv: 48, psv: 48 }, service: { foot: 4, horse: 8, wheelchair: 4, bicycle: 20, moped: 32, motorcycle: 32, motorcar: 32, goods: 32, hgv: 32, psv: 32 }, track: { foot: 4, horse: 8, wheelchair: 4, bicycle: 20, moped: 16, motorcycle: 16, motorcar: 16, goods: 16, hgv: 16, psv: 16 }, cycleway: { foot: 4, horse: 8, wheelchair: 4, bicycle: 20, moped: 0, motorcycle: 0, motorcar: 0, goods: 0, hgv: 0, psv: 0 }, path: { foot: 4, horse: 8, wheelchair: 4, bicycle: 20, moped: 0, motorcycle: 0, motorcar: 0, goods: 0, hgv: 0, psv: 0 }, steps: { foot: 4, horse: 0, wheelchair: 4, bicycle: 0, moped: 0, motorcycle: 0, motorcar: 0, goods: 0, hgv: 0, psv: 0 }, ferry: { foot: 10, horse: 10, wheelchair: 10, bicycle: 10, moped: 10, motorcycle: 10, motorcar: 10, goods: 10, hgv: 10, psv: 10 } }, // Highway properties profile_property: { paved: { foot: 50, horse: 20, wheelchair: 90, bicycle: 50, moped: 100, motorcycle: 100, motorcar: 100, goods: 100, hgv: 100, psv: 100 }, multilane: { foot: 25, horse: 25, wheelchair: 25, bicycle: 25, moped: 35, motorcycle: 60, motorcar: 60, goods: 60, hgv: 60, psv: 60 }, bridge: { foot: 50, horse: 50, wheelchair: 50, bicycle: 50, moped: 50, motorcycle: 50, motorcar: 50, goods: 50, hgv: 50, psv: 50 }, tunnel: { foot: 50, horse: 50, wheelchair: 50, bicycle: 50, moped: 50, motorcycle: 50, motorcar: 50, goods: 50, hgv: 50, psv: 50 }, footroute: { foot: 55, horse: 50, wheelchair: 55, bicycle: 50, moped: 50, motorcycle: 50, motorcar: 45, goods: 45, hgv: 45, psv: 45 }, bicycleroute: { foot: 55, horse: 50, wheelchair: 55, bicycle: 60, moped: 50, motorcycle: 50, motorcar: 45, goods: 45, hgv: 45, psv: 45 } }, // Restrictions profile_restrictions: { oneway: { foot: 0, horse: 1, wheelchair: 0, bicycle: 1, moped: 1, motorcycle: 1, motorcar: 1, goods: 1, hgv: 1, psv: 1 }, turns: { foot: 0, horse: 1, wheelchair: 0, bicycle: 1, moped: 1, motorcycle: 1, motorcar: 1, goods: 1, hgv: 1, psv: 1 }, weight: { foot: 0.0, horse: 0.0, wheelchair: 0.0, bicycle: 0.0, moped: 0.0, motorcycle: 0.0, motorcar: 0.0, goods: 5.0, hgv: 10.0, psv: 15.0 }, height: { foot: 0.0, horse: 0.0, wheelchair: 0.0, bicycle: 0.0, moped: 0.0, motorcycle: 0.0, motorcar: 0.0, goods: 2.5, hgv: 3.0, psv: 3.0 }, width: { foot: 0.0, horse: 0.0, wheelchair: 0.0, bicycle: 0.0, moped: 0.0, motorcycle: 0.0, motorcar: 0.0, goods: 2.0, hgv: 2.5, psv: 2.5 }, length: { foot: 0.0, horse: 0.0, wheelchair: 0.0, bicycle: 0.0, moped: 0.0, motorcycle: 0.0, motorcar: 0.0, goods: 5.0, hgv: 6.0, psv: 6.0 } } }; // end of routino variable routino-3.4.3/web/www/routino/visualiser.html.fr 644 233 144 54157 14774263773 15232 0 Routino : Afficheur d'itinéraire
Visualiser Router Data
Afficheur de Routino Cette page Web permet de visualiser les données que Routino utilise pour le routage. Seules les données pertinentes pour le routage sont affichées et certaines seront donc exclues.
Instructions Zoomez puis utilisez les boutons ci-dessous pour télécharger les données. le Le serveur ne renverra des données que si la zone sélectionnée est suffisamment petite.
État
Aucune donnée affichée
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Aide
Quick Start
Zoom to an area and select one of the buttons to display that type of data.
More data options can be found by expanding the details below each button.

Data Failure
If the area selected is too large (depends on the data type) then the status will say "Failed to get visualiser data" - zoom in and try again.

Routeur: Routino | Geo Data: | Dalles:
routino-3.4.3/web/www/routino/index.html 644 233 144 3240 12520735533 13471 0 Routino : Route Planner for OpenStreetMap Data

Routino : Route Planner for OpenStreetMap Data

routino-3.4.3/web/www/routino/maplayout.css 644 233 144 3734 13532500144 14221 0/* // Routino map layout web page style sheet. // // Part of the Routino routing software. // // This file Copyright 2008-2014, 2019 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . */ /*----------------------------------*/ /* Body HTML formatting */ /*----------------------------------*/ BODY { /* fonts and text styles */ font-family: sans-serif; font-size: 12px; /* colours */ background-color: white; color: black; } /*------------*/ /* Left panel */ /*------------*/ DIV.left_panel { width: 23em; position: absolute; top: 0; bottom: 0; right: auto; left: 0; padding: 3px; } /*-------------*/ /* Right panel */ /*-------------*/ DIV.right_panel { position: fixed; top: 0; bottom: 0; right: 0; left: 23.5em; } DIV.map { position: absolute; top: 0; bottom: 1.5em; right: 0; left: 0; border: 3px solid; text-align: center; } DIV.attribution { position: absolute; top: auto; bottom: 0; right: 0; left: 0; margin: 0px; border: 0px; padding: 0px; text-align: center; white-space: nowrap; overflow: hidden; } /*-----------------------------*/ /* Leaflet base layer selector */ /*-----------------------------*/ FORM.leaflet-control-layers-list { text-align: left; } DIV.leaflet-control-layers DIV { text-align: left; } routino-3.4.3/web/www/routino/router.openlayers2.js 644 233 144 162051 13756466616 15701 0// // Routino router web page Javascript // // Part of the Routino routing software. // // This file Copyright 2008-2020 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // var vismarkers, markers, markersmoved, paramschanged; var homelat=null, homelon=null; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Initialisation ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Make a deep copy of the routino profile. var routino_default={}; for(var l1 in routino) if(typeof(routino[l1])!="object") routino_default[l1]=routino[l1]; else { routino_default[l1]={}; for(var l2 in routino[l1]) if(typeof(routino[l1][l2])!="object") routino_default[l1][l2]=Number(routino[l1][l2]); else { routino_default[l1][l2]={}; for(var l3 in routino[l1][l2]) routino_default[l1][l2][l3]=Number(routino[l1][l2][l3]); } } // Store the latitude and longitude in the routino variable routino.point=[]; for(var marker=1;marker<=mapprops.maxmarkers;marker++) { routino.point[marker]={}; routino.point[marker].lon=""; routino.point[marker].lat=""; routino.point[marker].search=""; routino.point[marker].active=false; routino.point[marker].used=false; routino.point[marker].home=false; } // Process the URL query string and extract the arguments var legal={"^lon" : "^[-0-9.]+$", "^lat" : "^[-0-9.]+$", "^zoom" : "^[-0-9.]+$", "^lon[1-9]" : "^[-0-9.]+$", "^lat[1-9]" : "^[-0-9.]+$", "^search[1-9]" : "^.+$", "^transport" : "^[a-z]+$", "^highway-[a-z]+" : "^[0-9.]+$", "^speed-[a-z]+" : "^[0-9.]+$", "^property-[a-z]+" : "^[0-9.]+$", "^oneway" : "^(1|0|true|false|on|off)$", "^turns" : "^(1|0|true|false|on|off)$", "^weight" : "^[0-9.]+$", "^height" : "^[0-9.]+$", "^width" : "^[0-9.]+$", "^length" : "^[0-9.]+$", "^language" : "^[-a-zA-Z]+$", "^reverse" : "(1|0|true|false|on|off)", "^loop" : "(1|0|true|false|on|off)"}; var args={}; if(location.search.length>1) { var query,queries; query=location.search.replace(/^\?/,""); query=query.replace(/;/g,"&"); queries=query.split("&"); for(var i=0;i=1;marker--) { var lon=args["lon" + marker]; var lat=args["lat" + marker]; var search=args["search" + marker]; if(lon !== undefined && lat !== undefined && search !== undefined && lon !== "" && lat !== "" && search !== "") { markerAddForm(marker); formSetSearch(marker,search); formSetCoords(marker,lon,lat); lat=Number(lat); lon=Number(lon); if(latmaxlat) maxlat=lat; if(lonmaxlon) maxlon=lon; markerAddMap(marker); markerSearch(marker); vismarkers++; urlmarkers++; } else if(lon !== undefined && lat !== undefined && lon !== "" && lat !== "") { markerAddForm(marker); formSetCoords(marker,lon,lat); lat=Number(lat); lon=Number(lon); if(latmaxlat) maxlat=lat; if(lonmaxlon) maxlon=lon; markerAddMap(marker); markerCoords(marker); vismarkers++; urlmarkers++; } else if(search !== undefined && search !== "") { markerAddForm(marker); formSetSearch(marker,search); markerSearch(marker); DoSearch(marker); vismarkers++; } else if(vismarkers || marker<=2) { markerAddForm(marker); vismarkers++; } var searchfield=document.forms["form"].elements["search" + marker]; if(searchfield.addEventListener) searchfield.addEventListener("keyup", searchOnReturnKey, false); else if(searchfield.attachEvent) searchfield.attachEvent("keyup", searchOnReturnKey); // Internet Explorer } if(args["loop"] !== undefined) formSetLoopReverse("loop",args["loop"]); else formSetLoopReverse("loop",false); if(args["reverse"] !== undefined) formSetLoopReverse("reverse",args["reverse"]); else formSetLoopReverse("reverse",false); // Zoom the map if(urlmarkers>1) { var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon === undefined || lat === undefined || zoom === undefined) { var deltalon = 0.025 * ( maxlon - minlon ); var deltalat = 0.025 * ( maxlat - minlat ); var markerextent=new OpenLayers.Bounds(minlon-deltalon,minlat-deltalat,maxlon+deltalon,maxlat+deltalat).transform(epsg4326,epsg900913); map.setCenter(markerextent.getCenterLonLat(), map.getZoomForExtent(markerextent,false)); } } // Update the transport type with the URL settings which updates all HTML forms to defaults. var transport=routino.transport; if(args["transport"] !== undefined) transport=args["transport"]; formSetTransport(transport); // Update the HTML with the URL settings if(args["language"] !== undefined) formSetLanguage(args["language"]); else formSetLanguage(); for(var key in routino.profile_highway) if(args["highway-" + key] !== undefined) formSetHighway(key,args["highway-" + key]); for(var key in routino.profile_speed) if(args["speed-" + key] !== undefined) formSetSpeed(key,args["speed-" + key]); for(var key in routino.profile_property) if(args["property-" + key] !== undefined) formSetProperty(key,args["property-" + key]); for(var key in routino.restrictions) { if(key=="oneway" || key=="turns") { if(args[key] !== undefined) formSetRestriction(key,args[key]); } else { if(args["restrict-" + key] !== undefined) formSetRestriction(key,args["restrict-" + key]); } } // Get the home location cookie and compare to each waypoint var cookies=document.cookie.split("; "); for(var cookie=0;cookie100) value=100; if(value< 0) value= 0; document.forms["form"].elements["highway-" + type].value=value; routino.profile_highway[type][routino.transport]=value; paramschanged=true; updateURLs(true); } // // Change of Speed in the form // function formSetSpeed(type,value) // called from router.html (with one argument) { if(value == "+") { value=routino.profile_speed[type][routino.transport]; if(value<10) value=2*Math.floor(value/2)+2; else if(value<30) value=5*Math.floor(value/5)+5; else value=10*Math.floor(value/10)+10; } else if(value == "-") { value=routino.profile_speed[type][routino.transport]; if(value<=10) value=2*Math.ceil(value/2)-2; else if(value<=30) value=5*Math.ceil(value/5)-5; else value=10*Math.ceil(value/10)-10; } else if(value == "=") value=document.forms["form"].elements["speed-" + type].value; value=Number(value); if(isNaN(value)) value= 60; if(value>150) value=150; if(value< 0) value= 0; document.forms["form"].elements["speed-" + type].value=value; routino.profile_speed[type][routino.transport]=value; paramschanged=true; updateURLs(true); } // // Change of Property in the form // function formSetProperty(type,value) // called from router.html (with one argument) { if(value == "+") { value=routino.profile_property[type][routino.transport]; if(value>=40 && value<60) value=2*Math.floor(value/2)+2; else value=5*Math.floor(value/5)+5; } else if(value == "-") { value=routino.profile_property[type][routino.transport]; if(value>40 && value<=60) value=2*Math.ceil(value/2)-2; else value=5*Math.ceil(value/5)-5; } else if(value == "=") value=document.forms["form"].elements["property-" + type].value; value=Number(value); if(isNaN(value)) value= 50; if(value>100) value=100; if(value< 0) value= 0; document.forms["form"].elements["property-" + type].value=value; routino.profile_property[type][routino.transport]=value; paramschanged=true; updateURLs(true); } // // Change of Restriction rule in the form // function formSetRestriction(type,value) // called from router.html (with one argument) { if(type=="oneway" || type=="turns") { if(value === undefined) value=document.forms["form"].elements["restrict-" + type].checked; document.forms["form"].elements["restrict-" + type].checked=value; routino.profile_restrictions[type][routino.transport]=value; } else if(type=="weight") { if(value == "+") value=routino.profile_restrictions[type][routino.transport]+5; else if(value == "-") value=routino.profile_restrictions[type][routino.transport]-5; else if(value == "=") value=document.forms["form"].elements["restrict-" + type].value; value=Number(value); if(isNaN(value)) value= 0; if(value>50) value=50; if(value< 0) value= 0; document.forms["form"].elements["restrict-" + type].value=value; routino.profile_restrictions[type][routino.transport]=value; } else /* if(type=="height" || type=="width" || type=="length") */ { if(value == "+") value=routino.profile_restrictions[type][routino.transport]+1; else if(value == "-") value=routino.profile_restrictions[type][routino.transport]-1; else if(value == "=") value=document.forms["form"].elements["restrict-" + type].value; value=Number(value); if(isNaN(value)) value= 0; if(value>25) value=25; if(value< 0) value= 0; document.forms["form"].elements["restrict-" + type].value=value; routino.profile_restrictions[type][routino.transport]=value; } paramschanged=true; updateURLs(true); } // // Set the feature coordinates from the form when the form changes. // function formSetCoords(marker,lon,lat) // called from router.html (with one argument) { clearSearchResult(marker); if(lon === undefined && lat === undefined) { lon=document.forms["form"].elements["lon" + marker].value; lat=document.forms["form"].elements["lat" + marker].value; } if(lon === "" && lat === "") { document.forms["form"].elements["lon" + marker].value=""; document.forms["form"].elements["lat" + marker].value=""; routino.point[marker].lon=""; routino.point[marker].lat=""; updateURLs(true); } else { var lonlat; if(lon==="") { lonlat=map.getCenter().clone(); lonlat.transform(epsg900913,epsg4326); lon=lonlat.lon; } else lon=Number(lon); if(lon<-180) lon=-180; if(lon>+180) lon=+180; if(lat==="") { lonlat=map.getCenter().clone(); lonlat.transform(epsg900913,epsg4326); lat=lonlat.lat; } else lat=Number(lat); if(lat<-90 ) lat=-90 ; if(lat>+90 ) lat=+90 ; lonlat = new OpenLayers.LonLat(lon,lat); lonlat.transform(epsg4326,epsg900913); markers[marker].move(lonlat); markersmoved=true; document.forms["form"].elements["lon" + marker].value=format5f(lon); document.forms["form"].elements["lat" + marker].value=format5f(lat); routino.point[marker].lon=format5f(lon); routino.point[marker].lat=format5f(lat); routino.point[marker].used=true; markerCheckHome(marker); } } // // Set the search field from the form when the form changes. // function formSetSearch(marker,search) // called from event handler linked to router.html (with one argument) { clearSearchResult(marker); if(search === undefined) { routino.point[marker].search=document.forms["form"].elements["search" + marker].value; DoSearch(marker); } else { document.forms["form"].elements["search" + marker].value=search; routino.point[marker].search=search; } } // // Change of loop or reverse option in the form // function formSetLoopReverse(type,value) // called from router.html (with one argument) { if(value === undefined) value=document.forms["form"].elements[type].checked; document.forms["form"].elements[type].checked=value; if(type == "loop") routino.loop=value; else routino.reverse=value; updateURLs(true); } // // Format a number in printf("%.5f") format. // function format5f(number) { var newnumber=Math.floor(number*100000+0.5); var delta=0; if(newnumber>=0 && newnumber<100000) delta= 100000; if(newnumber<0 && newnumber>-100000) delta=-100000; var string=String(newnumber+delta); var intpart =string.substring(0,string.length-5); var fracpart=string.substring(string.length-5,string.length); if(delta>0) intpart="0"; if(delta<0) intpart="-0"; return(intpart + "." + fracpart); } // // Build a set of URL arguments // function buildURLArguments(lang) { var url= "transport=" + routino.transport; for(var marker=1;marker<=vismarkers;marker++) if(routino.point[marker].active) { url=url + ";lon" + marker + "=" + format5f(routino.point[marker].lon); url=url + ";lat" + marker + "=" + format5f(routino.point[marker].lat); if(routino.point[marker].search !== "") url=url + ";search" + marker + "=" + encodeURIComponent(routino.point[marker].search); } for(var key in routino.profile_highway) if(routino.profile_highway[key][routino.transport]!=routino_default.profile_highway[key][routino.transport]) url=url + ";highway-" + key + "=" + routino.profile_highway[key][routino.transport]; for(var key in routino.profile_speed) if(routino.profile_speed[key][routino.transport]!=routino_default.profile_speed[key][routino.transport]) url=url + ";speed-" + key + "=" + routino.profile_speed[key][routino.transport]; for(var key in routino.profile_property) if(routino.profile_property[key][routino.transport]!=routino_default.profile_property[key][routino.transport]) url=url + ";property-" + key + "=" + routino.profile_property[key][routino.transport]; for(var key in routino.restrictions) if(routino.profile_restrictions[key][routino.transport]!=routino_default.profile_restrictions[key][routino.transport]) url=url + ";" + key + "=" + routino.profile_restrictions[key][routino.transport]; if(routino.loop) url=url + ";loop=true"; if(routino.reverse) url=url + ";reverse=true"; if(lang && routino.language) url=url + ";language=" + routino.language; return(url); } // // Build a set of URL arguments for the map location // function buildMapArguments() { var lonlat = map.getCenter().clone(); lonlat.transform(epsg900913,epsg4326); var zoom = map.getZoom() + map.minZoomLevel; return "lat=" + format5f(lonlat.lat) + ";lon=" + format5f(lonlat.lon) + ";zoom=" + zoom; } // // Update the URLs // function updateURLs(addhistory) { var urlargs =buildURLArguments(false); var mapargs =buildMapArguments(); var langargs="language=" + routino.language; var libargs =";library=" + mapprops.library; if(!mapprops.libraries) libargs=""; var links=document.getElementsByTagName("a"); for(var i=0; i" + data_text + ""; document.getElementById("attribution_tile").innerHTML="" + tile_text + ""; } change_attribution(0); // Define a GPX layer but don't add it yet layerGPX={shortest: null, quickest: null}; gpx_style={shortest: new OpenLayers.Style({},{strokeWidth: 3, strokeColor: "#00FF00"}), quickest: new OpenLayers.Style({},{strokeWidth: 3, strokeColor: "#0000FF"})}; // Add a markers vectors layer layerVectors = new OpenLayers.Layer.Vector("Markers",{displayInLayerSwitcher: false}); map.addLayer(layerVectors); // A set of markers markers={}; markersmoved=false; paramschanged=false; for(var marker=1;marker<=mapprops.maxmarkers;marker++) { markers[marker] = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0),{}, new OpenLayers.Style({},{externalGraphic: "icons/marker-" + marker + "-red.png", fillColor: "white", graphicYOffset: -25, graphicWidth: 21, graphicHeight: 25, display: "none"})); layerVectors.addFeatures([markers[marker]]); } // A function to drag the markers var drag = new OpenLayers.Control.DragFeature(layerVectors, {onDrag: dragMarkerMove, onComplete: dragMarkerComplete }); map.addControl(drag); drag.activate(); // Markers to highlight a selected point for(var highlight in highlights) { highlights[highlight] = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0),{}, new OpenLayers.Style({},{strokeColor: route_dark_colours[highlight], fillColor: "white", pointRadius: 10, strokeWidth: 4, fillOpacity: 0, display: "none"})); layerVectors.addFeatures([highlights[highlight]]); } // A popup for routing results for(var popup in popups) popups[popup] = createPopup(popup); // Move the map map.events.register("moveend", map, (function() { updateURLs(false);})); var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon !== undefined && lat !== undefined && zoom !== undefined) { lat = Number(lat); lon = Number(lon); zoom = Number.parseInt(Number(zoom)+0.5); if(lonmapprops.eastedge) lon=mapprops.eastedge; if(latmapprops.northedge) lat=mapprops.northedge; if(zoommapprops.zoomin) zoom=mapprops.zoomin; var lonlat = new OpenLayers.LonLat(lon,lat); lonlat.transform(epsg4326,epsg900913); map.moveTo(lonlat,zoom-map.minZoomLevel); } else { map.setCenter(map.restrictedExtent.getCenterLonLat(), map.getZoomForExtent(map.restrictedExtent,false)); map.maxResolution = map.getResolution(); } // Unhide editing URL if variable set if(mapprops.editurl !== undefined && mapprops.editurl !== "") { var edit_url=document.getElementById("edit_url"); edit_url.style.display=""; edit_url.href=mapprops.editurl; } updateURLs(false); } // // Callback for a marker drag occuring on the map. // function dragMarkerMove(feature,pixel) { for(var marker=1;marker<=mapprops.maxmarkers;marker++) if(feature==markers[marker]) dragMarkerSetForm(marker); } // // Callback for completing a marker drag on the map. // function dragMarkerComplete(feature,pixel) { for(var marker=1;marker<=mapprops.maxmarkers;marker++) if(feature==markers[marker]) dragMarkerSetForm(marker); updateURLs(true); } // // Set the feature coordinates in the form after dragging it on the map. // function dragMarkerSetForm(marker) { var lonlat = new OpenLayers.LonLat(markers[marker].geometry.x, markers[marker].geometry.y); lonlat.transform(epsg900913,epsg4326); formSetCoords(marker,lonlat.lon,lonlat.lat); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Marker dragging //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// var dragged_waypoint=null,dragged_marker=null; var dragged_waypoint_over=null,dragged_marker_over=null; var dragged_icon_x,dragged_icon_y; // // Drag a waypoint up or down the list. // function dragWaypointStart(e) { var w=e.target; while(w!=null && w.className != "waypoint") w=w.parentElement; if(w===null) return; w.style.opacity = "0.5"; dragged_waypoint=w; dragged_marker=Number.parseInt(dragged_waypoint.id.substring(8)); dragged_icon_x=e.clientX-e.target.offsetLeft; dragged_icon_y=e.clientY-e.target.offsetTop; } function dragWaypointEnd(e) { e.preventDefault(); if(dragged_waypoint===null) return; dragged_waypoint.style.opacity = ""; dragged_waypoint=null; dragged_marker=null; if(dragged_waypoint_over===null) return; dragged_waypoint_over.style.border = ""; dragged_waypoint_over=null; dragged_marker_over=null; } // // Drag a waypoint over another one up or down the list. // function dragWaypointEnter(e) { var w=e.target; while(w!=null && w.className != "waypoint") w=w.parentElement; if(w===null) return; if(dragged_waypoint_over!==null) dragged_waypoint_over.style.border = ""; if(w==dragged_waypoint) return; dragged_waypoint_over=w; dragged_marker_over=Number.parseInt(dragged_waypoint_over.id.substring(8)); if(dragged_marker>dragged_marker_over) w.style.borderTop = "3px solid black"; else w.style.borderBottom = "3px solid black"; } function dragWaypointOver(e) { e.preventDefault(); } function dragWaypointLeave(e) { var w=e.target; while(w!=null && w.className != "waypoint") w=w.parentElement; if(w===null) return; if(w==dragged_waypoint_over) return; w.style.border = ""; } // // Drop the waypoint after dragging up or down the list. // function dragWaypointDrop(e) { e.preventDefault(); if(dragged_marker_over===null) return; if(dragged_marker_over>dragged_marker) for(var m=dragged_marker;mdragged_marker_over;m--) markerSwap(m,m-1); } // // Drag a waypoint over the map. // function dragWaypointMapEnter(e) { e.preventDefault(); if(dragged_waypoint_over!==null) dragged_waypoint_over.style.border = ""; } function dragWaypointMapOver(e) { e.preventDefault(); } function dragWaypointMapLeave(e) { e.preventDefault(); } // // Drop the waypoint after dragging it over the map. // function dragWaypointMapDrop(e) { e.preventDefault(); var rect = document.getElementById("map").getBoundingClientRect(); var lonlat = map.getLonLatFromViewPortPx(new OpenLayers.Pixel(e.clientX-rect.left-window.scrollX-dragged_icon_x+8, e.clientY-rect.top -window.scrollY-dragged_icon_y+21)); lonlat.transform(epsg900913,epsg4326); formSetCoords(dragged_marker,lonlat.lon,lonlat.lat); if(!routino.point[dragged_marker].active) markerToggleMap(dragged_marker); if(routino.point[dragged_marker].search=="") markerCoords(dragged_marker); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Marker handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Toggle a marker on the map. // function markerToggleMap(marker) // called from router.html { if(!routino.point[marker].used) { routino.point[marker].used=true; markerCentre(marker); markerCoords(marker); } markerAddRemoveMap(marker,!routino.point[marker].active); } // // Show or hide a marker on the map. // function markerAddRemoveMap(marker,active) { if(active) markerAddMap(marker); else markerRemoveMap(marker); } // // Show a marker on the map. // function markerAddMap(marker) { clearSearchResult(marker); markers[marker].style.display = ""; routino.point[marker].active=true; routino.point[marker].used=true; updateIcon(marker); markersmoved=true; updateURLs(true); updateSearchButtons(); } // // Remove a marker from the map. // function markerRemoveMap(marker) { clearSearchResult(marker); markers[marker].style.display = "none"; routino.point[marker].active=false; updateIcon(marker); markersmoved=true; updateURLs(true); updateSearchButtons(); } // // Display search string for the marker // function markerSearch(marker) // called from router.html { clearSearchResult(marker); document.getElementById("coords" + marker).style.display="none"; document.getElementById("search" + marker).style.display=""; } // // Display coordinates for the marker // function markerCoords(marker) // called from router.html { clearSearchResult(marker); document.getElementById("search" + marker).style.display="none"; document.getElementById("coords" + marker).style.display=""; } // // Centre the marker on the map // function markerCentre(marker) // called from router.html { if(!routino.point[marker].used) return; clearSearchResult(marker); var lonlat=map.getCenter().clone(); lonlat.transform(epsg900913,epsg4326); formSetCoords(marker,lonlat.lon,lonlat.lat); } // // Centre the map on the marker // function markerRecentre(marker) // called from router.html { if(!routino.point[marker].used) return; clearSearchResult(marker); var lon=Number(routino.point[marker].lon); var lat=Number(routino.point[marker].lat); var lonlat = new OpenLayers.LonLat(lon,lat); lonlat.transform(epsg4326,epsg900913); map.panTo(lonlat); } // // Clear the current marker. // function markerRemove(marker) // called from router.html { clearSearchResult(marker); for(var m=marker;mmarker;m--) markerCopy(m,m-1); markerClearForm(marker-1); } // // Add a marker after the current one. // function markerAddAfter(marker) // called from router.html { if(vismarkers==mapprops.maxmarkers) return false; clearSearchResult(marker); markerAddForm(++vismarkers); for(var m=vismarkers;m>(marker+1);m--) markerCopy(m,m-1); markerClearForm(marker+1); } // // Set this marker as the home location. // function markerHome(marker) // called from router.html { if(!routino.point[marker].used) { markerMoveHome(marker); } else { clearSearchResult(marker); markerSetClearHome(marker,!routino.point[marker].home); } } // // Set this marker as the current location. // function markerLocate(marker) // called from router.html { clearSearchResult(marker); function success(position) { formSetCoords(marker,position.coords.longitude,position.coords.latitude); markerAddMap(marker); } function failure(error) { alert("Error: " + error.message); } if(navigator.geolocation) navigator.geolocation.getCurrentPosition(success,failure); else alert("Error: Geolocation unavailable"); } // // Update the search buttons enable/disable. // function updateSearchButtons() { var markersactive=0; for(var m=1;m<=vismarkers;m++) if(routino.point[m].active) markersactive++; if(markersactive<2) { document.getElementById("shortest1").disabled="disabled"; document.getElementById("quickest1").disabled="disabled"; document.getElementById("shortest2").disabled="disabled"; document.getElementById("quickest2").disabled="disabled"; } else { document.getElementById("shortest1").disabled=""; document.getElementById("quickest1").disabled=""; document.getElementById("shortest2").disabled=""; document.getElementById("quickest2").disabled=""; } } // // Update an icon to set colours and home or normal marker. // function updateIcon(marker) { if(routino.point[marker].home) { if(routino.point[marker].active) document.getElementById("icon" + marker).src="icons/marker-home-red.png"; else document.getElementById("icon" + marker).src="icons/marker-home-grey.png"; markers[marker].style.externalGraphic="icons/marker-home-red.png"; } else { if(routino.point[marker].active) document.getElementById("icon" + marker).src="icons/marker-" + marker + "-red.png"; else document.getElementById("icon" + marker).src="icons/marker-" + marker + "-grey.png"; markers[marker].style.externalGraphic="icons/marker-" + marker + "-red.png"; } layerVectors.drawFeature(markers[marker]); } // // Move the marker to the home location // function markerMoveHome(marker) { if(homelon===null || homelat===null) return; routino.point[marker].home=true; routino.point[marker].used=true; formSetCoords(marker,homelon,homelat); markerAddMap(marker); } // // Set or clear the home marker icon // function markerSetClearHome(marker,home) { var cookie; var date = new Date(); if(home) { homelat=format5f(routino.point[marker].lat); homelon=format5f(routino.point[marker].lon); cookie="Routino-home=lon:" + homelon + ":lat:" + homelat; date.setUTCFullYear(date.getUTCFullYear()+5); routino.point[marker].home=true; } else { homelat=null; homelon=null; cookie="Routino-home="; date.setUTCFullYear(date.getUTCFullYear()-1); routino.point[marker].home=false; } document.cookie=cookie + ";Expires=" + date.toGMTString() + ";SameSite=Strict"; updateIcon(marker); for(var m=1;m<=mapprops.maxmarkers;m++) markerCheckHome(m); } // // Check if a marker is the home marker // function markerCheckHome(marker) { var home=routino.point[marker].home; if(routino.point[marker].lon==homelon && routino.point[marker].lat==homelat) routino.point[marker].home=true; else routino.point[marker].home=false; if(home!=routino.point[marker].home) updateIcon(marker); } // // Move this marker up. // function markerMoveUp(marker) // called from router.html { if(marker==1) { for(var m=1;m1;m--) markerSwap(m,m-1); } else markerSwap(marker,marker+1); } // // Copy a marker from one place to another. // function markerCopy(marker1,marker2) { for(var element in routino.point[marker2]) routino.point[marker1][element]=routino.point[marker2][element]; document.getElementById("search" + marker1).style.display=document.getElementById("search" + marker2).style.display; document.getElementById("coords" + marker1).style.display=document.getElementById("coords" + marker2).style.display; document.forms["form"].elements["search" + marker1].value=document.forms["form"].elements["search" + marker2].value; formSetCoords(marker1,routino.point[marker1].lon,routino.point[marker1].lat); markerAddRemoveMap(marker1,routino.point[marker1].active); } // // Swap a pair of markers. // function markerSwap(marker1,marker2) { for(var element in routino.point[marker2]) { var temp=routino.point[marker1][element]; routino.point[marker1][element]=routino.point[marker2][element]; routino.point[marker2][element]=temp; } var search_display=document.getElementById("search" + marker1).style.display; document.getElementById("search" + marker1).style.display=document.getElementById("search" + marker2).style.display; document.getElementById("search" + marker2).style.display=search_display; var coords_display=document.getElementById("coords" + marker1).style.display; document.getElementById("coords" + marker1).style.display=document.getElementById("coords" + marker2).style.display; document.getElementById("coords" + marker2).style.display=coords_display; var search_value=document.forms["form"].elements["search" + marker1].value; document.forms["form"].elements["search" + marker1].value=document.forms["form"].elements["search" + marker2].value; document.forms["form"].elements["search" + marker2].value=search_value; formSetCoords(marker1,routino.point[marker1].lon,routino.point[marker1].lat); formSetCoords(marker2,routino.point[marker2].lon,routino.point[marker2].lat); markerAddRemoveMap(marker1,routino.point[marker1].active); markerAddRemoveMap(marker2,routino.point[marker2].active); } // // Reverse the markers. // function markersReverse() // called from router.html { for(var marker=1;marker<=vismarkers/2;marker++) markerSwap(marker,vismarkers+1-marker); markersmoved=true; updateURLs(true); } // // Close the loop. // function markersLoop() // called from router.html { if(vismarkers==mapprops.maxmarkers) return false; if(routino.point[vismarkers].lon==routino.point[1].lon && routino.point[vismarkers].lat==routino.point[1].lat) { if(routino.point[vismarkers].active) return false; else { markerToggleMap(vismarkers); return true; } } if(routino.point[vismarkers].used) markerAddForm(++vismarkers); markerCopy(vismarkers,1); markersmoved=true; updateURLs(true); updateSearchButtons(); } // // Display the form for a marker // function markerAddForm(marker) { document.getElementById("waypoint" + marker).style.display=""; } // // Hide the form for a marker // function markerRemoveForm(marker) { document.getElementById("waypoint" + marker).style.display="none"; markerClearForm(marker); } // // Clear the form for a marker // function markerClearForm(marker) { markerRemoveMap(marker); markerSearch(marker); formSetCoords(marker,"",""); formSetSearch(marker,""); updateIcon(marker); routino.point[marker].used=false; routino.point[marker].home=false; routino.point[marker].active=false; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////// Route results handling //////////////////////////// //////////////////////////////////////////////////////////////////////////////// var route_light_colours={shortest: "#60C060", quickest: "#6060C0"}; var route_dark_colours ={shortest: "#408040", quickest: "#404080"}; var highlights={shortest: null, quickest: null}; var popups={shortest: null, quickest: null}; var routepoints={shortest: {}, quickest: {}}; var gpx_style={shortest: null, quickest: null}; // // Highlight a specific item in the route // function highlight(type,line,action) { if(action == "clear") { highlights[type].style.display = "none"; drawPopup(type,null); } else if(action == "zoom") { var lonlat = new OpenLayers.LonLat(routepoints[type][line].lon,routepoints[type][line].lat); lonlat.transform(epsg4326,epsg900913); map.moveTo(lonlat,map.numZoomLevels-3); } else { // Marker var lonlat = new OpenLayers.LonLat(routepoints[type][line].lon,routepoints[type][line].lat); lonlat.transform(epsg4326,epsg900913); highlights[type].move(lonlat); if(highlights[type].style.display == "none") highlights[type].style.display = ""; // Popup drawPopup(type,"" + routepoints[type][line].html + "
"); } layerVectors.drawFeature(highlights[type]); } // // Create a popup - independent of map because want it fixed on screen not fixed on map. // function createPopup(type) { var popup=document.createElement("div"); popup.className = "popup"; popup.innerHTML = ""; popup.style.display = "none"; popup.style.position = "fixed"; popup.style.top = "-4000px"; popup.style.left = "-4000px"; popup.style.zIndex = "100"; popup.style.padding = "5px"; popup.style.opacity=0.85; popup.style.backgroundColor=route_light_colours[type]; popup.style.border="4px solid " + route_dark_colours[type]; document.body.appendChild(popup); return(popup); } // // Draw a popup - independent of map because want it fixed on screen not fixed on map. // function drawPopup(type,html) { var popup=popups[type]; if(html===null) { popup.style.display="none"; return; } if(popup.style.display=="none") { var map_div=document.getElementById("map"); popup.style.left =map_div.offsetParent.offsetLeft+map_div.offsetLeft+60 + "px"; popup.style.top = map_div.offsetTop +30 + "px"; popup.style.width =map_div.clientWidth-120 + "px"; popup.style.display=""; } var close="X"; popup.innerHTML=close+html; } // // Remove a GPX trace // function removeGPXTrace(type) { map.removeLayer(layerGPX[type]); layerGPX[type].destroy(); layerGPX[type]=null; displayStatus(type,"no_info"); document.getElementById(type + "_links").style.display = "none"; document.getElementById(type + "_route").innerHTML = ""; hideshow_hide(type); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Server handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Define an AJAX request object // function ajaxGET(url,success,failure,state) { var ajaxRequest=new XMLHttpRequest(); function ajaxGOT(options) { if(this.readyState==4) if(this.status==200) { if(typeof(options.success)=="function") options.success(this,options.state); } else { if(typeof(options.failure)=="function") options.failure(this,options.state); } } ajaxRequest.onreadystatechange = function(){ ajaxGOT.call(ajaxRequest,{success: success, failure: failure, state: state}); }; ajaxRequest.open("GET", url, true); ajaxRequest.send(null); } // // Display data statistics // function displayStatistics() // called from router.html { // Use AJAX to get the statistics ajaxGET("statistics.cgi", runStatisticsSuccess); } // // Success in running data statistics generation. // function runStatisticsSuccess(response) { document.getElementById("statistics_data").innerHTML="
" + response.responseText + "
"; document.getElementById("statistics_link").style.display="none"; } // // Submit form - perform the routing // function findRoute(type) // called from router.html { tab_select("results"); hideshow_hide("help_options"); hideshow_hide("shortest"); hideshow_hide("quickest"); displayStatus("result","running"); var url="router.cgi" + "?" + buildURLArguments(true) + ";type=" + type; // Destroy the existing layer(s) highlight("shortest",-1,"clear"); highlight("quickest",-1,"clear"); if(markersmoved || paramschanged) { if(layerGPX.shortest!==null) removeGPXTrace("shortest"); if(layerGPX.quickest!==null) removeGPXTrace("quickest"); markersmoved=false; paramschanged=false; } else if(layerGPX[type]!==null) removeGPXTrace(type); // Use AJAX to run the router routing_type=type; ajaxGET(url, runRouterSuccess, runRouterFailure); } // // Success in running router. // function runRouterSuccess(response) { var lines=response.responseText.split("\n"); var uuid=lines[0]; var success=lines[1]; var link; // Update the status message if(success=="ERROR") { displayStatus("result","error"); hideshow_show("help_route"); link=document.getElementById("router_log_error"); link.href="results.cgi?uuid=" + uuid + ";type=router;format=log"; return; } else { displayStatus("result","complete"); hideshow_hide("help_route"); link=document.getElementById("router_log_complete"); link.href="results.cgi?uuid=" + uuid + ";type=router;format=log"; } // Update the routing result message link=document.getElementById(routing_type + "_html"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=html"; link=document.getElementById(routing_type + "_gpx_track"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=gpx-track"; link=document.getElementById(routing_type + "_gpx_route"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=gpx-route"; link=document.getElementById(routing_type + "_text_all"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=text-all"; link=document.getElementById(routing_type + "_text"); link.href="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=text"; document.getElementById(routing_type + "_links").style.display = ""; // Add a GPX layer var url="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=gpx-track"; layerGPX[routing_type] = new OpenLayers.Layer.Vector("GPX (" + routing_type + ")", { displayInLayerSwitcher: false, protocol: new OpenLayers.Protocol.HTTP({url: url, format: new OpenLayers.Format.GPX()}), strategies: [new OpenLayers.Strategy.Fixed()], style: gpx_style[routing_type], projection: map.displayProjection }); map.addLayer(layerGPX[routing_type]); hideshow_show(routing_type); displayResult(routing_type,uuid); } // // Failure in running router. // function runRouterFailure(response) { displayStatus("result","failed"); } // // Display the status // function displayStatus(type,subtype,content) { var child=document.getElementById(type + "_status").firstChild; do { if(child.id !== undefined) child.style.display="none"; child=child.nextSibling; } while(child !== null); var chosen_status=document.getElementById(type + "_status_" + subtype); chosen_status.style.display=""; if(content !== undefined) chosen_status.innerHTML=content; } // // Display the route // function displayResult(type,uuid) { routing_type = type; // Add the route var url="results.cgi?uuid=" + uuid + ";type=" + routing_type + ";format=html"; // Use AJAX to get the route ajaxGET(url, getRouteSuccess, getRouteFailure); } // // Success in getting route. // function getRouteSuccess(response) { var lines=response.responseText.split("\n"); routepoints[routing_type]=[]; var points=routepoints[routing_type]; var table=0; var point=0; var total_table,total_word; for(var line=0;line")) table=1; else continue; } if(thisline.match("")) break; if(thisline.match("")) { var rowtype=RegExp.$1; if(rowtype=="c") { thisline.match(": *([-0-9.]+) *([-0-9.]+)"); points[point]={lat: Number(RegExp.$1), lon: Number(RegExp.$2), html: "", highway: "", distance: "", total: ""}; point++; } else if(rowtype=="n") { points[point-1].html += thisline; } else if(rowtype=="s") { thisline.match("([^<]+)"); points[point-1].highway = RegExp.$1; thisline.match("([^<]+)"); points[point-1].distance = RegExp.$1; thisline.match("([^<]+)"); points[point-1].total = RegExp.$1; thisline.match("^(.*)."); points[point-1].html += RegExp.$1; } else if(rowtype=="t") { points[point-1].html += thisline; thisline.match("([^<]+)"); points[point-1].total = RegExp.$1; thisline.match("(.*)"); points[point-1].highway = RegExp.$1; } } } displayStatus(routing_type,"info",points[point-1].total.bold()); var result=""; for(var p=0;p" + "
#" + (p+1) + "" + points[p].highway; } result=result + "
"; document.getElementById(routing_type + "_route").innerHTML=result; } // // Failure in getting route. // function getRouteFailure(response) { document.getElementById(routing_type + "_route").innerHTML = ""; } // // Perform a search // function DoSearch(marker) { // Use AJAX to get the search result var search=routino.point[marker].search; var mapbounds=map.getExtent().clone(); mapbounds.transform(epsg900913,epsg4326); var url="search.cgi"; url=url + "?marker=" + marker; url=url + ";lonmin=" + format5f(mapbounds.left); url=url + ";latmin=" + format5f(mapbounds.bottom); url=url + ";lonmax=" + format5f(mapbounds.right); url=url + ";latmax=" + format5f(mapbounds.top); url=url + ";search=" + encodeURIComponent(search); ajaxGET(url,runSearchSuccess); } var searchresults=[]; // // Success in running search. // function runSearchSuccess(response) { var lines=response.responseText.split("\n"); var marker=lines[0]; var cpuinfo=lines[1]; // not used var message=lines[2]; if(message !== "") { alert(message); return; } searchresults[marker]=[]; for(var line=3;line"; for(var n=0;n0) innerHTML+="
"; innerHTML+="" + searchresults[marker][n].name + ""; } results.innerHTML=innerHTML; results.style.display=""; } } // // Display search results. // function choseSearchResult(marker,n) { if(n>=0) { formSetSearch(marker,searchresults[marker][n].name); formSetCoords(marker,searchresults[marker][n].lon,searchresults[marker][n].lat); markerAddMap(marker); } } // // Clear search results. // function clearSearchResult(marker) { document.getElementById("searchresults" + marker).style.display="none"; } routino-3.4.3/web/www/routino/visualiser.html.nl 644 233 144 54372 14774263774 15234 0 Routino : Visualisering van routeringsgegevens
Visualiser Router Data
Routino Visualisering Op deze webpagina kunnen de gegevens gevisualiseerd worden, die door Routino worden gebruikt bij de routeplanning. Alleen de gegevens die relevant zijn voor de routeberekening worden getoond, en sommige informatie wordt dus uitgesloten
Instructies Zoom in en gebruik dan de knoppen om de gegevens te downloaden. De server zal alleen gegevens aanleveren als het geselecteerde gebied klein genoeg is
Status
Geen data getoond
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Help
Snelle Start
Zoom in op een gebied en kies één van de knoppen om dat type gegevens weer te geven
Meer gegevensopties kunnen getoond worden door de details achter iedere knop op te vragen

Mislukte Visualisatie
Als het gekozen gebied te groot is (hangt af van het type gegevens) dan volgt er een bericht "Failed to get visualiser data" - zoom in en probeer opnieuw.

Router: Routino | Geo Data: | Tiles:
routino-3.4.3/web/www/routino/router.html.en 644 233 144 77606 14774263770 14360 0 Routino : Route Planner for OpenStreetMap Data
Options Results Data
Routino OpenStreetMap Router This web page allows routing within the data collected by OpenStreetMap. Select start and end points (click on the marker icons below), select routing preferences then find a route.
+ - Waypoints
Close loop:
Reverse order:
Find
+ - Transport Type
Foot:
Horse:
Wheelchair:
Bicycle:
Moped:
Motorcycle:
Motorcar:
Goods:
HGV:
PSV:
+ - Highway Preferences
+ - Speed Limits
+ - Property Preferences
+ - Other Restrictions
+ - Help
Quick Start
Click on marker icons (above) to place them on the map (right). Then drag them to the correct position. Zooming the map before placing the markers is probably easiest. Alternatively type the latitude and longitude into the boxes above.

Select the transport type, allowed highway types, speed limits, highway properties and other restrictions from the options above. Select "Shortest" or "Quickest" to calculate the route and display it on the map.

Waypoints
Clicking on the marker icons will toggle the display of them on the map. When a route is calculated it will visit (as close as possible for the selected transport type) each of the waypoints that have markers on the map in the order given.

Transport Type
Selecting a transport type will restrict the chosen route to those on which it is allowed and set default values for the other parameters.

Highway Preferences
The highway preference is selected as a percentage and routes are chosen that try to follow the preferred highways. For example if a "Primary" road is given a "110%" preference and a "Secondary" road is given a "100%" preference then it means that a route on a Primary road can be up to 10% longer than on a secondary road and still be selected.

Speed Limits
The speed limits chosen here for the different types of highway apply if the highway has no other speed limit marked or it is higher than the chosen one.

Property Preferences
The property preference is selected as a percentage and routes are chosen that try to follow highways with the preferred property. For example if a "Paved" highway is given a "75%" preference then it means that an unpaved highway is automatically given a "25%" preference so that a route on a paved highway can be 3 times the length of an unpaved one and still be selected.

Other Restrictions
These allow a route to be found that avoids marked limits on weight, height, width or length. It is also possible to ignore one-way restrictions (e.g. if walking).

Router: Routino | Geo Data: | Tiles:
routino-3.4.3/web/www/routino/router.cgi 755 233 144 5706 12767517350 13524 0#!/usr/bin/perl # # Routino interactive router CGI # # Part of the Routino routing software. # # This file Copyright 2008-2014, 2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Use the generic router script require "./router.pl"; # Use the perl CGI module use CGI ':cgi'; # Create the query and get the parameters my $query=new CGI; my @rawparams=$query->param; # Legal CGI parameters with regexp validity check my %legalparams=( "lon[1-9][0-9]*" => "[-0-9.]+", "lat[1-9][0-9]*" => "[-0-9.]+", "heading" => "[-0-9.]+", "transport" => "[a-z]+", "highway-[a-z]+" => "[0-9.]+", "speed-[a-z]+" => "[0-9.]+", "property-[a-z]+" => "[0-9.]+", "oneway" => "(1|0|true|false|on|off)", "turns" => "(1|0|true|false|on|off)", "weight" => "[0-9.]+", "height" => "[0-9.]+", "width" => "[0-9.]+", "length" => "[0-9.]+", "length" => "[0-9.]+", "language" => "[-a-zA-Z]+", "type" => "(shortest|quickest)", "format" => "(html|gpx-route|gpx-track|text|text-all)", "reverse" => "(1|0|true|false|on|off)", "loop" => "(1|0|true|false|on|off)" ); # Validate the CGI parameters, ignore invalid ones my %cgiparams=(); foreach my $key (@rawparams) { foreach my $test (keys (%legalparams)) { if($key =~ m%^$test$%) { my $value=$query->param($key); if($value =~ m%^$legalparams{$test}$%) { $cgiparams{$key}=$value; last; } } } } # Get the important parameters my $type; my $format; $type=$cgiparams{type}; delete $cgiparams{type}; $type="shortest" if(!$type); $format=$cgiparams{format}; delete $cgiparams{format}; # Fill in the default parameters my %fullparams=FillInDefaults(%cgiparams); # Run the router my($router_uuid,$router_success)=RunRouter($type,%fullparams); # Return the output if($format) { ReturnOutput($router_uuid,$type,$format); } else { print header('text/plain'); print "$router_uuid\n"; print "$router_success\n"; } routino-3.4.3/web/www/routino/visualiser.html.en 644 233 144 53047 14774263773 15222 0 Routino : Data Visualiser for Routing Data
Visualiser Router Data
Routino Visualiser This web page allows visualisation of the data that Routino uses for routing. Only data relevant for routing is displayed and some will therefore be excluded.
Instructions Zoom in and then use the buttons below to download the data. The server will only return data if the selected area is small enough.
Status
No data displayed
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Help
Quick Start
Zoom to an area and select one of the buttons to display that type of data.
More data options can be found by expanding the details below each button.

Data Failure
If the area selected is too large (depends on the data type) then the status will say "Failed to get visualiser data" - zoom in and try again.

Router: Routino | Geo Data: | Tiles:
routino-3.4.3/web/www/routino/router.html.it 644 233 144 101317 14774263772 14377 0 Routino : Pianificazione percorso per i dati di OpenStreetMap
Opzioni Risultati Dati
Routino OpenStreetMap Router Questa pagina consente il calcolo del percorso con i dati raccolti da OpenStreetMap. Seleziona i punti di partenza e di arrivo (clicca sulle icone dei marcatori qui sotto), seleziona le preferenze e trova un percorso.
+ - Punti sul percorso
Chiudi il ciclo:
Ordine inverso:
Trova
+ - Tipo di trasporto
A piedi:
Cavallo:
Carrozzella:
Bicicletta:
Ciclomotore:
Motociclo:
Autovettura:
Merce:
Trasporto Merci Pesante:
Mezzi Pubblici:
+ - Preferenze per autostrada
+ - Limiti di velocita'
+ - Impostazione proprieta'
+ - Altri limitazioni
+ - Aiuto
Avvio rapido
Seleziona le icone dei marcatori (sopra) per posizionarli sulla mappa (a destra). Poi Trascinarli nella posizione desiderata. Eventualmente ingrandire la mappa per posizionarli con maggiore precisione. In alternativa digitare la latitudine e longitudine nelle apposite caselle.

Selezionare il tipo di trasporto, i tipi di strade e le loro proprietà, i limiti di velocità e altre impstazioni dalle opzioni sopra riportate. Selezionare il tipo di percorso "più breve" o "più veloce" per calcolarlo e visualizzarlo sulla mappa.

Punti sul percorso
Selezionando le icone dei marcatori, questi saranno visualizzati sulla mappa. Quando viene calcolato un percorso, ogni punto viene visualizzato nel modo più coerente possibile al tipo di trasporto selezionato, ciascuno nell'ordine indicato.

Tipo di trasporto
La selezione di un tipo di trasporto vincola il tipo di tragitto ed imposta i valori predefiniti per gli altri parametri relativi.

Preferenze per tipi di strade
La percorrenza sulle strade principali sono impostate come percentuale di preferenza. Ad esempio, se ad una strada primaria viene data una preferenza del 100%, mentre ad una secondaria una preferenza del 90%, significa che il percorso sulla strada primaria può essere fino al 10% più lungo di quello sulla strada secondaria.

Limiti di velocità
I limiti di velocità per i vari tipi di strade si applicano se la strada stessa non ha altri limiti di velocità contrassegnati o è superiore a quello scelto.

Preferenze sulla proprietà
La preferenza sulla proprietà viene impostata come percentuale e vengono scelti i tragitti cercando di rispettare tali preferenze. Ad esempio, se ad una strada asfaltata viene data una preferenza del 75% allora automaticamente ad una non asfaltata viene data una preferenza del 25%. In questo modo un percorso su una strada asfaltata può risultare filo a 3 volte più lungo rispetto a quella non asfaltata.

Altre restrizioni
Si può decidere di ignorare i limiti imposti come peso, altezza, larghezza o lunghezza. È anche possibile ignorare restrizioni di senso unico se per esempio si desidera un percorso da fare a piedi.

Percorso: Routino | Dati Geografici: | Tiles:
routino-3.4.3/web/www/routino/visualiser.openlayers2.js 644 233 144 103711 13755535130 16530 0// // Routino data visualiser web page Javascript // // Part of the Routino routing software. // // This file Copyright 2008-2014, 2019, 2020 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // // // Data types // var data_types=[ "junctions", "super", "waytype", "highway", "transport", "barrier", "turns", "speed", "weight", "height", "width", "length", "property", "errorlogs" ]; //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Initialisation ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Process the URL query string and extract the arguments var legal={"^lon" : "^[-0-9.]+$", "^lat" : "^[-0-9.]+$", "^zoom" : "^[-0-9.]+$", "^data" : "^.+$", "^subdata" : "^.+$"}; var args={}; if(location.search.length>1) { var query,queries; query=location.search.replace(/^\?/,""); query=query.replace(/;/g,"&"); queries=query.split("&"); for(var i=0;i" + data_text + ""; document.getElementById("attribution_tile").innerHTML="" + tile_text + ""; } change_attribution(0); // Add two vectors layers (one for highlights that display behind the vectors) layerHighlights = new OpenLayers.Layer.Vector("Highlights",{displayInLayerSwitcher: false}); map.addLayer(layerHighlights); layerVectors = new OpenLayers.Layer.Vector("Markers",{displayInLayerSwitcher: false}); map.addLayer(layerVectors); // Handle feature selection and popup select = new OpenLayers.Control.SelectFeature(layerVectors, {onSelect: selectFeature, onUnselect: unselectFeature}); map.addControl(select); select.activate(); createPopup(); // Move the map map.events.register("moveend", map, (function() { displayMoreData(); updateURLs(false);})); var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon !== undefined && lat !== undefined && zoom !== undefined) { lat = Number(lat); lon = Number(lon); zoom = Number.parseInt(Number(zoom)+0.5); if(lonmapprops.eastedge) lon=mapprops.eastedge; if(latmapprops.northedge) lat=mapprops.northedge; if(zoommapprops.zoomin) zoom=mapprops.zoomin; var lonlat = new OpenLayers.LonLat(lon,lat); lonlat.transform(epsg4326,epsg900913); map.moveTo(lonlat,zoom-map.minZoomLevel); } else { map.setCenter(map.restrictedExtent.getCenterLonLat(), map.getZoomForExtent(map.restrictedExtent,false)); map.maxResolution = map.getResolution(); } // Unhide editing URL if variable set if(mapprops.editurl !== undefined && mapprops.editurl !== "") { var edit_url=document.getElementById("edit_url"); edit_url.style.display=""; edit_url.href=mapprops.editurl; } // Select the data view if selected var datatype=args["data"]; var datasubtype=args["subdata"]; if(datatype !== undefined) displayData(datatype, datasubtype); // Update the URL updateURLs(false); } // // Format a number in printf("%.5f") format. // function format5f(number) { var newnumber=Math.floor(number*100000+0.5); var delta=0; if(newnumber>=0 && newnumber<100000) delta= 100000; if(newnumber<0 && newnumber>-100000) delta=-100000; var string=String(newnumber+delta); var intpart =string.substring(0,string.length-5); var fracpart=string.substring(string.length-5,string.length); if(delta>0) intpart="0"; if(delta<0) intpart="-0"; return(intpart + "." + fracpart); } // // Build a set of URL arguments for the map location // function buildMapArguments() { var lonlat = map.getCenter().clone(); lonlat.transform(epsg900913,epsg4326); var zoom = map.getZoom() + map.minZoomLevel; return "lat=" + format5f(lonlat.lat) + ";lon=" + format5f(lonlat.lon) + ";zoom=" + zoom; } // // Update the URLs // function updateURLs(addhistory) { var mapargs=buildMapArguments(); var dataargs=";data=" + displaytype; var libargs=";library=" + mapprops.library; if(displaytype === "") dataargs=""; else if(displaysubtype !== "") dataargs+=";subdata=" + displaysubtype; if(!mapprops.libraries) libargs=""; var links=document.getElementsByTagName("a"); for(var i=0; i" + id + ""); } } } drawPopup(string.split("\n").join("
")); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Server handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Define an AJAX request object // function ajaxGET(url,success,failure,state) { var ajaxRequest=new XMLHttpRequest(); function ajaxGOT(options) { if(this.readyState==4) if(this.status==200) { if(typeof(options.success)=="function") options.success(this,options.state); } else { if(typeof(options.failure)=="function") options.failure(this,options.state); } } ajaxRequest.onreadystatechange = function(){ ajaxGOT.call(ajaxRequest,{success: success, failure: failure, state: state}); }; ajaxRequest.open("GET", url, true); ajaxRequest.send(null); } // // Display the status // function displayStatus(type,subtype,content) { var child=document.getElementById("result_status").firstChild; do { if(child.id !== undefined) child.style.display="none"; child=child.nextSibling; } while(child !== null); var chosen_status=document.getElementById("result_status_" + type); chosen_status.style.display=""; if(subtype !== undefined) { var format_status=document.getElementById("result_status_" + subtype).innerHTML; chosen_status.innerHTML=format_status.replace("#",String(content)); } } // // Display data statistics // function displayStatistics() { // Use AJAX to get the statistics ajaxGET("statistics.cgi", runStatisticsSuccess); } // // Success in running data statistics generation. // function runStatisticsSuccess(response) { document.getElementById("statistics_data").innerHTML="
" + response.responseText + "
"; document.getElementById("statistics_link").style.display="none"; } // // Get the requested data // function displayData(datatype, datasubtype) // called from visualiser.html { // Display the form entry for(var data in data_types) hideshow_hide(data_types[data]); if(datatype !== "") hideshow_show(datatype); if(datasubtype === undefined) datasubtype=""; // Delete the old data vectorData=[]; unselectFeature(); select.deactivate(); layerVectors.destroyFeatures(); // Print the status displayStatus("no_data"); // Return if just here to clear the data if(datatype === "") { displaytype = ""; displaysubtype = ""; updateURLs(true); return; } // Determine the type of data switch(datatype) { case "junctions": break; case "super": break; case "waytype": var waytypes=document.forms["waytypes"].elements["waytype"]; for(var w in waytypes) if(datasubtype == waytypes[w].value) waytypes[w].checked=true; else if(waytypes[w].checked) datasubtype=waytypes[w].value; break; case "highway": var highways=document.forms["highways"].elements["highway"]; for(var h in highways) if(datasubtype == highways[h].value) highways[h].checked=true; else if(highways[h].checked) datasubtype=highways[h].value; break; case "transport": var transports=document.forms["transports"].elements["transport"]; for(var t in transports) if(datasubtype == transports[t].value) transports[t].checked=true; else if(transports[t].checked) datasubtype=transports[t].value; break; case "barrier": var transports=document.forms["barriers"].elements["barrier"]; for(var t in transports) if(datasubtype == transports[t].value) transports[t].checked=true; else if(transports[t].checked) datasubtype=transports[t].value; break; case "turns": break; case "speed": case "weight": case "height": case "width": case "length": break; case "property": var properties=document.forms["properties"].elements["property"]; for(var p in properties) if(datasubtype == properties[p].value) properties[p].checked=true; else if(properties[p].checked) datasubtype=properties[p].value; break; case "errorlogs": break; } // Update the URLs displaytype = datatype; displaysubtype = datasubtype; displayMoreData(); } function displayMoreData() { // Get the new data var mapbounds=map.getExtent().clone(); mapbounds.transform(epsg900913,epsg4326); var url="visualiser.cgi"; url=url + "?lonmin=" + format5f(mapbounds.left); url=url + ";latmin=" + format5f(mapbounds.bottom); url=url + ";lonmax=" + format5f(mapbounds.right); url=url + ";latmax=" + format5f(mapbounds.top); url=url + ";data=" + displaytype; // Use AJAX to get the data switch(displaytype) { case "junctions": ajaxGET(url, runJunctionsSuccess, runFailure); break; case "super": ajaxGET(url, runSuperSuccess, runFailure); break; case "waytype": url+="-" + displaysubtype; ajaxGET(url, runWaytypeSuccess, runFailure); break; case "highway": url+="-" + displaysubtype; ajaxGET(url, runHighwaySuccess, runFailure); break; case "transport": url+="-" + displaysubtype; ajaxGET(url, runTransportSuccess, runFailure); break; case "barrier": url+="-" + displaysubtype; ajaxGET(url, runBarrierSuccess, runFailure); break; case "turns": ajaxGET(url, runTurnsSuccess, runFailure); break; case "speed": case "weight": case "height": case "width": case "length": ajaxGET(url, runLimitSuccess, runFailure); break; case "property": url+="-" + displaysubtype; ajaxGET(url, runPropertySuccess, runFailure); break; case "errorlogs": ajaxGET(url, runErrorlogSuccess, runFailure); break; } updateURLs(true); } // // Success in getting the junctions. // function runJunctionsSuccess(response) { var lines=response.responseText.split("\n"); var junction_colours={ 0: "#FFFFFF", 1: "#FF0000", 2: "#FFFF00", 3: "#00FF00", 4: "#8B4513", 5: "#00BFFF", 6: "#FF69B4", 7: "#000000", 8: "#000000", 9: "#000000" }; var styles={}; for(var colour in junction_colours) styles[colour]=new OpenLayers.Style({},{stroke: false, pointRadius: 2,fillColor: junction_colours[colour], cursor: "pointer"}); var features=[]; for(var line=0;line Routino : PlánovaÄ tras pro OpenStreetMap Data
Možnosti Výsledky Data
Routino OpenStreetMap PlánovaÄ This web page allows routing within the data collected by OpenStreetMap. Select start and end points (click on the marker icons below), select routing preferences then find a route.
+ - Waypoints
Uzavřít okruh:
OpaÄné poÅ™adí:
Hledat
+ - Typ přepravy
Pěší:
Koňmo:
Vozík:
Kolo:
Moped:
Motocykl:
Motorcar:
Zboží:
HGV:
PSV:
+ - Předvolby pro dálnice
+ - Rychlostní limity
+ - Property Preferences
+ - Jiná omezení
+ - Pomoc
Quick Start
Click on marker icons (above) to place them on the map (right). Then drag them to the correct position. Zooming the map before placing the markers is probably easiest. Alternatively type the latitude and longitude into the boxes above.

Select the transport type, allowed highway types, speed limits, highway properties and other restrictions from the options above. Select "Shortest" or "Quickest" to calculate the route and display it on the map.

Waypoints
Clicking on the marker icons will toggle the display of them on the map. When a route is calculated it will visit (as close as possible for the selected transport type) each of the waypoints that have markers on the map in the order given.

Transport Type
Selecting a transport type will restrict the chosen route to those on which it is allowed and set default values for the other parameters.

Highway Preferences
The highway preference is selected as a percentage and routes are chosen that try to follow the preferred highways. For example if a "Primary" road is given a "110%" preference and a "Secondary" road is given a "100%" preference then it means that a route on a Primary road can be up to 10% longer than on a secondary road and still be selected.

Speed Limits
The speed limits chosen here for the different types of highway apply if the highway has no other speed limit marked or it is higher than the chosen one.

Property Preferences
The property preference is selected as a percentage and routes are chosen that try to follow highways with the preferred property. For example if a "Paved" highway is given a "75%" preference then it means that an unpaved highway is automatically given a "25%" preference so that a route on a paved highway can be 3 times the length of an unpaved one and still be selected.

Other Restrictions
These allow a route to be found that avoids marked limits on weight, height, width or length. It is also possible to ignore one-way restrictions (e.g. if walking).

Router: Routino | Geo Data: | Tiles:
routino-3.4.3/web/www/routino/results.cgi 755 233 144 3456 12767517343 13707 0#!/usr/bin/perl # # Routino router results retrieval CGI # # Part of the Routino routing software. # # This file Copyright 2008-2014, 2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Use the generic router script require "./router.pl"; # Use the perl CGI module use CGI ':cgi'; # Create the query and get the parameters my $query=new CGI; my @rawparams=$query->param; # Legal CGI parameters with regexp validity check my %legalparams=( "type" => "(shortest|quickest|router)", "format" => "(html|gpx-route|gpx-track|text|text-all|log)", "uuid" => "[0-9a-f]{32}" ); # Validate the CGI parameters, ignore invalid ones my %cgiparams=(); foreach my $key (@rawparams) { foreach my $test (keys (%legalparams)) { if($key =~ m%^$test$%) { my $value=$query->param($key); if($value =~ m%^$legalparams{$test}$%) { $cgiparams{$key}=$value; last; } } } } # Parse the parameters my $uuid =$cgiparams{"uuid"}; my $type =$cgiparams{"type"}; my $format=$cgiparams{"format"}; # Return the file ReturnOutput($uuid,$type,$format); routino-3.4.3/web/www/routino/visualiser.html.pl 644 233 144 53532 14774263774 15233 0 Routino : Data Visualiser for Routing Data
Visualiser Router Data
Wizualizer Routino This web page allows visualisation of the data that Routino uses for routing. Only data relevant for routing is displayed and some will therefore be excluded.
Instrukcje Zoom in and then use the buttons below to download the data. The server will only return data if the selected area is small enough.
Status
Brak danych do wyświetlenia
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - Pomoc
Quick Start
Zoom to an area and select one of the buttons to display that type of data.
More data options can be found by expanding the details below each button.

Data Failure
If the area selected is too large (depends on the data type) then the status will say "Failed to get visualiser data" - zoom in and try again.

Router: Routino | Geo Data: | Kafelki:
routino-3.4.3/xml/ 40755 233 144 0 15003125373 7153 5routino-3.4.3/xml/scripts/ 40755 233 144 0 12324523025 10641 5routino-3.4.3/xml/scripts/ride.pl 755 233 144 3656 12306667762 12173 0#!/usr/bin/perl # # Special case tagging rule generator. # # Part of the Routino routing software. # # This file Copyright 2011-2014 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Process the input while() { if(m%
%) { print " \n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "\n"; print " \n"; print " \n"; print "\n"; print " \n"; print " \n"; print "\n"; } if(m%%) { print " \n"; print "\n"; print " \n"; print " \n"; print " \n"; print "\n"; } print; } routino-3.4.3/xml/scripts/drive.pl 755 233 144 3616 12324522764 12345 0#!/usr/bin/perl # # Special case tagging rule generator. # # Part of the Routino routing software. # # This file Copyright 2011-2014 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Process the input while() { if(m%
%) { print " \n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "\n"; } if(m%%) { print " \n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print "\n"; } print; } routino-3.4.3/xml/scripts/walk.pl 755 233 144 4214 12324523025 12154 0#!/usr/bin/perl # # Special case tagging rule generator. # # Part of the Routino routing software. # # This file Copyright 2011-2014 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Process the input while() { if(m%%) { print " \n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "\n"; print " \n"; print "\n"; print " \n"; print " \n"; print "\n"; print " \n"; print " \n"; print " \n"; print "\n"; } if(m%%) { print " \n"; print "\n"; print " \n"; print " \n"; print "\n"; print " \n"; print " \n"; print "\n"; } print; } routino-3.4.3/xml/routino-tagging.xml 644 233 144 123635 14473337151 13111 0 routino-3.4.3/xml/routino-translations.xml 644 233 144 160644 14774263775 14231 0 <!-- %s = [shortest|quickest] --> <start text="Start at %s, head %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="At %s, go %s heading %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <rbnode text="Leave %s, take the %s exit heading %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="Follow %s for %.3f km, %.1f min" /> <!-- 1st %s = street name --> <stop text="Stop at %s" /> <!-- 1st %s = [waypoint|junction] --> <total text="Total %.1f km, %.0f minutes" /> <subtotal text="%.1f km, %.0f minutes" /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="WAYPT" /> <!-- For the route waypoints --> <waypoint type="trip" string="TRIP" /> <!-- For the other route points --> <desc text="%s route between 'start' and 'finish' waypoints" /> <!-- %s = [shortest|quickest] --> <name text="%s route" /> <!-- %s = [shortest|quickest] --> <step text="%s on '%s' for %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="Total Journey %.1f km, %.0f minutes" /> </output-gpx> </language> <language lang="cs" language="ÄŒesky"> <!-- Copyright of the data being routed, not of this file --> <copyright> <creator string="Vyvíjí" text="Routino - http://www.routino.org/" /> <source string="Zdroj" text="Postaveno na datech OpenStreetMap na" /> <license string="Licence" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <turn direction="-4" string="Velmi ostÅ™e vlevo" /> <turn direction="-3" string="OstÅ™e vlevo" /> <turn direction="-2" string="Vlevo" /> <turn direction="-1" string="Lehce vlevo" /> <turn direction="0" string="Přímo" /> <turn direction="1" string="Lehce vpravo" /> <turn direction="2" string="Vpravo" /> <turn direction="3" string="OstÅ™e vpravo" /> <turn direction="4" string="Velmi ostÅ™e vpravo" /> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="Jih" /> <heading direction="-3" string="Jihozápad" /> <heading direction="-2" string="Západ" /> <heading direction="-1" string="Severozápad" /> <heading direction="0" string="Sever" /> <heading direction="1" string="Severovýchod" /> <heading direction="2" string="Východ" /> <heading direction="3" string="Jihovýchod" /> <heading direction="4" string="Jih" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="První" /> <ordinal number="2" string="Druhá" /> <ordinal number="3" string="TÅ™etí" /> <ordinal number="4" string="ÄŒtvrtá" /> <ordinal number="5" string="Pátá" /> <ordinal number="6" string="Å está" /> <ordinal number="7" string="Sedmá" /> <ordinal number="8" string="Osmá" /> <ordinal number="9" string="Devátá" /> <ordinal number="10" string="Desátá" /> <!-- Highway names --> <highway type="motorway" string="dálnice" /> <highway type="trunk" string="hlavní silnice" /> <highway type="primary" string="silnice I. třídy" /> <highway type="secondary" string="silnice II. třídy" /> <highway type="tertiary" string="silnice III. třídy" /> <highway type="unclassified" string="nekategorizovaná silnice" /> <highway type="residential" string="silnice v obytné Ätvrti" /> <highway type="service" string="obslužná silnice" /> <!-- TRANSLATION REQUIRED: highway type="track" string="track" / --> <highway type="cycleway" string="cyklostezka" /> <!-- TRANSLATION REQUIRED: highway type="path" string="path" / --> <highway type="steps" string="schody" /> <highway type="ferry" string="pÅ™evoz" /> <!-- The type of route --> <route type="shortest" string="Nejkratší" /> <!-- For the description and route name --> <route type="quickest" string="Nejrychlejší" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <!-- TRANSLATION REQUIRED: waypoint type="waypoint" string="Waypoint" / --> <!-- For the chosen waypoints --> <waypoint type="junction" string="KÅ™ižovatka" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="Kruhový objezd" /> <!-- For roundabouts --> <!-- TRANSLATION REQUIRED: title text="%s Route" / --> <!-- %s = [shortest|quickest] --> <!-- TRANSLATION REQUIRED: start text="Start at %s, head %s" / --> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <!-- TRANSLATION REQUIRED: node text="At %s, go %s heading %s" / --> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <!-- TRANSLATION REQUIRED: rbnode text="Leave %s, take the %s exit heading %s" / --> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <!-- TRANSLATION REQUIRED: segment text="Follow %s for %.3f km, %.1f min" / --> <!-- 1st %s = street name --> <!-- TRANSLATION REQUIRED: stop text="Stop at %s" / --> <!-- 1st %s = [waypoint|junction] --> <!-- TRANSLATION REQUIRED: total text="Total %.1f km, %.0f minutes" / --> <!-- TRANSLATION REQUIRED: subtotal text="%.1f km, %.0f minutes" / --> </output-html> <!-- GPX output --> <output-gpx> <!-- TRANSLATION REQUIRED: waypoint type="waypt" string="WAYPT" / --> <!-- For the route waypoints --> <!-- TRANSLATION REQUIRED: waypoint type="trip" string="TRIP" / --> <!-- For the other route points --> <!-- TRANSLATION REQUIRED: desc text="%s route between 'start' and 'finish' waypoints" / --> <!-- %s = [shortest|quickest] --> <!-- TRANSLATION REQUIRED: name text="%s route" / --> <!-- %s = [shortest|quickest] --> <!-- TRANSLATION REQUIRED: step text="%s on '%s' for %.3f km, %.1f min" / --> <!-- 1st %s = [turn], 2nd %s = street name --> <!-- TRANSLATION REQUIRED: final text="Total Journey %.1f km, %.0f minutes" / --> </output-gpx> </language> <language lang="de" language="Deutsch"> <!-- Copyright of the data being routed, not of this file --> <copyright> <creator string="Urheber" text="Routino - http://www.routino.org/" /> <source string="Quelle" text="Basierend auf OpenStreetMap-Daten, erhältlich via http://www.openstreetmap.org/" /> <license string="Lizenz" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <turn direction="-4" string="Sehr scharf links" /> <turn direction="-3" string="Scharf links" /> <turn direction="-2" string="Links" /> <turn direction="-1" string="Halb links" /> <turn direction="0" string="Geradeaus" /> <turn direction="1" string="Halb rechts" /> <turn direction="2" string="Rechts" /> <turn direction="3" string="Scharf rechts" /> <turn direction="4" string="Sehr scharf rechts" /> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="Süd" /> <heading direction="-3" string="Süd-West" /> <heading direction="-2" string="West" /> <heading direction="-1" string="Nord-West" /> <heading direction="0" string="Nord" /> <heading direction="1" string="Nord-Ost" /> <heading direction="2" string="Ost" /> <heading direction="3" string="Süd-Ost" /> <heading direction="4" string="Süd" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="Erste" /> <ordinal number="2" string="Zweite" /> <ordinal number="3" string="Dritte" /> <ordinal number="4" string="Vierte" /> <ordinal number="5" string="Fünfte" /> <ordinal number="6" string="Sechste" /> <ordinal number="7" string="Siebte" /> <ordinal number="8" string="Achte" /> <ordinal number="9" string="Neunte" /> <ordinal number="10" string="Zehnte" /> <!-- Highway names --> <highway type="motorway" string="Autobahn" /> <highway type="trunk" string="Schnellstraße" /> <highway type="primary" string="Bundesstraße" /> <highway type="secondary" string="Landesstraße" /> <highway type="tertiary" string="Kreisstraße" /> <highway type="unclassified" string="Nebenstraße" /> <highway type="residential" string="Wohngebietsstraße" /> <highway type="service" string="Erschließungsweg" /> <highway type="track" string="Feld-/Waldweg" /> <highway type="cycleway" string="Radweg" /> <highway type="path" string="Weg/Pfad" /> <highway type="steps" string="Treppe" /> <highway type="ferry" string="Fähre" /> <!-- The type of route --> <route type="shortest" string="Kürzeste" /> <!-- For the description and route name --> <route type="quickest" string="Schnellste" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <waypoint type="waypoint" string="Wegpunkt" /> <!-- For the chosen waypoints --> <waypoint type="junction" string="Anschlussstelle" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="Kreisverkehr" /> <!-- For roundabouts --> <title text="%s Route" /> <!-- %s = [shortest|quickest] --> <start text="Start bei %s halten Sie sich Richtung %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="Bei %s wenden Sie sich nach %s Richtung %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <rbnode text="Verlassen Sie %s, nehmen Sie die %s Ausfahrt Richtung %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="Folgen Sie der %s für %.3f km bzw. %.1f min" /> <!-- 1st %s = street name --> <stop text="Stop Sie sind bei %s angekommen" /> <!-- 1st %s = [waypoint|junction] --> <total text="Gesamt %.1f km, %.0f minuten" /> <subtotal text="%.1f km, %.0f minuten" /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="Wegpunkt" /> <!-- For the route waypoints --> <waypoint type="trip" string="Reiseroute" /> <!-- For the other route points --> <desc text="%s Strecke zwischen 'Start' und 'Ziel'" /> <!-- %s = [shortest|quickest] --> <name text="%s Strecke" /> <!-- %s = [shortest|quickest] --> <step text="%s auf '%s' für %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="Gesamtstrecke %.1f km, %.0f minuten" /> </output-gpx> </language> <language lang="es" language="Español"> <!-- Copyright of the data being routed, not of this file --> <copyright> <creator string="Autor" text="Routino - http://www.routino.org/" /> <source string="Fuente" text="Basado en datos OpenStreetMap de http://www.openstreetmap.org/" /> <license string="Licencia" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <turn direction="-4" string="Media vuelta hacia la izquierda" /> <turn direction="-3" string="Muy a la izquierda" /> <turn direction="-2" string="A la izaquierda" /> <turn direction="-1" string="Ligeramente a la izquierda" /> <turn direction="0" string="Todo recto" /> <turn direction="1" string="Ligeramente a la derecha" /> <turn direction="2" string="A la derecha" /> <turn direction="3" string="Muy a la derecha" /> <turn direction="4" string="Media vuelta hacia la derecha" /> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="Sur" /> <heading direction="-3" string="Sur-Oeste" /> <heading direction="-2" string="Oeste" /> <heading direction="-1" string="Nor-Oeste" /> <heading direction="0" string="Norte" /> <heading direction="1" string="Nor-Este" /> <heading direction="2" string="Este" /> <heading direction="3" string="Sur-Este" /> <heading direction="4" string="Sur" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="Primera" /> <ordinal number="2" string="Segunda" /> <ordinal number="3" string="Tercera" /> <ordinal number="4" string="Cuarta" /> <ordinal number="5" string="Quinta" /> <ordinal number="6" string="Sexta" /> <ordinal number="7" string="Septima" /> <ordinal number="8" string="Octava" /> <ordinal number="9" string="Novena" /> <ordinal number="10" string="Décima" /> <!-- Highway names --> <highway type="motorway" string="autopista" /> <highway type="trunk" string="enlace" /> <highway type="primary" string="carretera nacional" /> <highway type="secondary" string="carretera regional" /> <highway type="tertiary" string="carretera local" /> <highway type="unclassified" string="carretera sin clasificar" /> <highway type="residential" string="calle" /> <highway type="service" string="vía de servicio" /> <highway type="track" string="pista" /> <highway type="cycleway" string="via ciclable" /> <highway type="path" string="sendero" /> <highway type="steps" string="escaleras" /> <highway type="ferry" string="ferry" /> <!-- The type of route --> <route type="shortest" string="Más corto" /> <!-- For the description and route name --> <route type="quickest" string="Más rápido" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <waypoint type="waypoint" string="Punto" /> <!-- For the chosen waypoints --> <waypoint type="junction" string="Cruce" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="Rotonda" /> <!-- For roundabouts --> <title text="Itinéraire %s" /> <!-- %s = [shortest|quickest] --> <start text="Inicio en el %s, dirección %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="En el %s, ir %s dirección %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <rbnode text="Dejar la %s por la %s salida, dirección %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="Seguir %s durante %.3f km, %.1f min" /> <!-- 1st %s = street name --> <stop text="Parar en %s" /> <!-- 1st %s = [waypoint|junction] --> <total text="Total %.1f km, %.0f minutos" /> <subtotal text="%.1f km, %.0f minutos" /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="WayPoint" /> <!-- For the route waypoints --> <waypoint type="trip" string="Punto" /> <!-- For the other route points --> <desc text="Itinerario %s entre los puntos 'inicio' y 'final'" /> <!-- %s = [shortest|quickest] --> <name text="Itinerario %s" /> <!-- %s = [shortest|quickest] --> <step text="%s en '%s' durante %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="Trayecto total %.1f km, %.0f minutes" /> </output-gpx> </language> <language lang="fi" language="Suomi"> <!-- Copyright of the data being routed, not of this file --> <copyright> <!-- TRANSLATION REQUIRED: creator string="Creator" text="Routino - http://www.routino.org/" / --> <!-- TRANSLATION REQUIRED: source string="Lähde" text="Based on OpenStreetMap data from http://www.openstreetmap.org/" / --> <license string="Lisenssi" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <!-- TRANSLATION REQUIRED: turn direction="-4" string="Very sharp left" / --> <!-- TRANSLATION REQUIRED: turn direction="-3" string="Sharp left" / --> <turn direction="-2" string="vasemmalle" /> <!-- TRANSLATION REQUIRED: turn direction="-1" string="Slight left" / --> <turn direction="0" string="suoraan" /> <!-- TRANSLATION REQUIRED: turn direction="1" string="Slight right" / --> <turn direction="2" string="oikealle" /> <!-- TRANSLATION REQUIRED: turn direction="3" string="Sharp right" / --> <!-- TRANSLATION REQUIRED: turn direction="4" string="Very sharp right" / --> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="etelä" /> <heading direction="-3" string="lounas" /> <heading direction="-2" string="länsi" /> <heading direction="-1" string="luode" /> <heading direction="0" string="pohjoinen" /> <heading direction="1" string="koillinen" /> <heading direction="2" string="itä" /> <heading direction="3" string="kaakko" /> <heading direction="4" string="etelä" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="Ensimmäinen" /> <ordinal number="2" string="Toinen" /> <ordinal number="3" string="Kolmas" /> <ordinal number="4" string="Neljäs" /> <ordinal number="5" string="Viides" /> <ordinal number="6" string="Kuudes" /> <ordinal number="7" string="Seitsemäs" /> <ordinal number="8" string="Kahdeksas" /> <ordinal number="9" string="Yhdeksäs" /> <ordinal number="10" string="Kymmenes" /> <!-- Highway names --> <highway type="motorway" string="moottoritie" /> <highway type="trunk" string="valtatie" /> <highway type="primary" string="kantatie" /> <highway type="secondary" string="seututie" /> <highway type="tertiary" string="yhdystie" /> <highway type="unclassified" string="tie" /> <highway type="residential" string="asuinkatu" /> <!-- TRANSLATION REQUIRED: highway type="service" string="service road" / --> <!-- TRANSLATION REQUIRED: highway type="track" string="track" / --> <highway type="cycleway" string="pyörätie" /> <highway type="path" string="polku" /> <highway type="steps" string="portaat" /> <highway type="ferry" string="lautta" /> <!-- The type of route --> <route type="shortest" string="Lyhyin" /> <!-- For the description and route name --> <route type="quickest" string="Nopein" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <waypoint type="waypoint" string="Reittipiste" /> <!-- For the chosen waypoints --> <waypoint type="junction" string="Liittymä" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="Kiertoliittymä" /> <!-- For roundabouts --> <title text="%s reitti" /> <!-- %s = [shortest|quickest] --> <!-- TRANSLATION REQUIRED: start text="Start at %s, head %s" / --> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <!-- TRANSLATION REQUIRED: node text="At %s, go %s heading %s" / --> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <!-- TRANSLATION REQUIRED: rbnode text="Leave %s, take the %s exit heading %s" / --> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <!-- TRANSLATION REQUIRED: segment text="Follow %s for %.3f km, %.1f min" / --> <!-- 1st %s = street name --> <!-- TRANSLATION REQUIRED: stop text="Stop at %s" / --> <!-- 1st %s = [waypoint|junction] --> <total text="Yhteensä %.1f km, %.0f minuuttia" /> <subtotal text="%.1f km, %.0f minuuttia" /> </output-html> <!-- GPX output --> <output-gpx> <!-- TRANSLATION REQUIRED: waypoint type="waypt" string="WAYPT" / --> <!-- For the route waypoints --> <!-- TRANSLATION REQUIRED: waypoint type="trip" string="TRIP" / --> <!-- For the other route points --> <!-- TRANSLATION REQUIRED: desc text="%s route between 'start' and 'finish' waypoints" / --> <!-- %s = [shortest|quickest] --> <name text="%s reitti" /> <!-- %s = [shortest|quickest] --> <!-- TRANSLATION REQUIRED: step text="%s on '%s' for %.3f km, %.1f min" / --> <!-- 1st %s = [turn], 2nd %s = street name --> <!-- TRANSLATION REQUIRED: final text="Total Journey %.1f km, %.0f minutes" / --> </output-gpx> </language> <language lang="fr" language="Français"> <!-- Copyright of the data being routed, not of this file --> <copyright> <creator string="Créateur" text="Routino - http://www.routino.org/" /> <source string="Source" text="Basé sur les données OpenStreetMap de http://www.openstreetmap.org/" /> <license string="Licence" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <turn direction="-4" string="demi-tour à gauche" /> <turn direction="-3" string="Très à gauche" /> <turn direction="-2" string="à gauche" /> <turn direction="-1" string="Légèrement à gauche" /> <turn direction="0" string="Tout droit" /> <turn direction="1" string="légèrement à droite" /> <turn direction="2" string="à droite" /> <turn direction="3" string="très à droite" /> <turn direction="4" string="demi-tour à droite" /> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="Sud" /> <heading direction="-3" string="Sud-Ouest" /> <heading direction="-2" string="Ouest" /> <heading direction="-1" string="Nord-Ouest" /> <heading direction="0" string="Nord" /> <heading direction="1" string="Nord-Est" /> <heading direction="2" string="Est" /> <heading direction="3" string="Sud-Est" /> <heading direction="4" string="Sud" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="Premier" /> <ordinal number="2" string="Second" /> <ordinal number="3" string="Troisième" /> <ordinal number="4" string="Quatrième" /> <ordinal number="5" string="Cinquième" /> <ordinal number="6" string="Sixième" /> <ordinal number="7" string="Septième" /> <ordinal number="8" string="Huitième" /> <ordinal number="9" string="Neuvième" /> <ordinal number="10" string="Dixième" /> <!-- Highway names --> <highway type="motorway" string="autoroute" /> <highway type="trunk" string="route de jonction" /> <highway type="primary" string="route nationale" /> <highway type="secondary" string="route départementale" /> <highway type="tertiary" string="route locale" /> <highway type="unclassified" string="route non classifiée" /> <highway type="residential" string="rue résidentielle" /> <highway type="service" string="rue de service" /> <highway type="track" string="piste" /> <highway type="cycleway" string="piste cyclable" /> <highway type="path" string="sentier" /> <highway type="steps" string="escalier" /> <highway type="ferry" string="ferry" /> <!-- The type of route --> <route type="shortest" string="le plus court" /> <!-- For the description and route name --> <route type="quickest" string="le plus rapide" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <waypoint type="waypoint" string="Étape" /> <!-- For the chosen waypoints --> <waypoint type="junction" string="Intersection" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="rond-point" /> <!-- For roundabouts --> <title text="Itinéraire %s" /> <!-- %s = [shortest|quickest] --> <start text="Débute à %s, direction %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="à %s, aller %s direction %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <rbnode text="Quitter %s, prendre la sortie %s direction %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="Suivre %s pendant %.3f km, %.1f min" /> <!-- 1st %s = street name --> <stop text="S'arrêter à %s" /> <!-- 1st %s = [waypoint|junction] --> <total text="Total %.1f km, %.0f minutes" /> <subtotal text="%.1f km, %.0f minutes" /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="ETAPE" /> <!-- For the route waypoints --> <waypoint type="trip" string="POINT" /> <!-- For the other route points --> <desc text="Itinéraire %s entre les étapes 'début' et 'fin'" /> <!-- %s = [shortest|quickest] --> <name text="Itinéraire %s" /> <!-- %s = [shortest|quickest] --> <step text="%s sur '%s' pendant %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="Trajet total %.1f km, %.0f minutes" /> </output-gpx> </language> <language lang="hu" language="Magyar"> <!-- Copyright of the data being routed, not of this file --> <copyright> <creator string="Alkotó" text="Routino - http://www.routino.org/" /> <source string="Forrás" text="Openstreetmap adatok alapján http://www.openstreetmap.org/" /> <license string="Licenc" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <turn direction="-4" string="Nagyon élesen balra" /> <turn direction="-3" string="Élesen balra" /> <turn direction="-2" string="Balra" /> <turn direction="-1" string="Enyhén balra" /> <turn direction="0" string="Egyenesen" /> <turn direction="1" string="Enyhén jobbra" /> <turn direction="2" string="Jobbra" /> <turn direction="3" string="Élesen jobbra" /> <turn direction="4" string="Nagyon élesen jobbra" /> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="Dél" /> <heading direction="-3" string="Délnyugat" /> <heading direction="-2" string="Nyugat" /> <heading direction="-1" string="Északnyugat" /> <heading direction="0" string="Észak" /> <heading direction="1" string="Északkelet" /> <heading direction="2" string="Kelet" /> <heading direction="3" string="Délkelet" /> <heading direction="4" string="Dél" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="elsÅ‘" /> <ordinal number="2" string="második" /> <ordinal number="3" string="harmadik" /> <ordinal number="4" string="negyedik" /> <ordinal number="5" string="ötödik" /> <ordinal number="6" string="hatodik" /> <ordinal number="7" string="hetedik" /> <ordinal number="8" string="nyolcadik" /> <ordinal number="9" string="kilencedik" /> <ordinal number="10" string="tizedik" /> <!-- Highway names --> <highway type="motorway" string="autópálya" /> <highway type="trunk" string="autóút" /> <highway type="primary" string="főút" /> <highway type="secondary" string="összekötőút" /> <highway type="tertiary" string="bekötőút" /> <highway type="unclassified" string="egyéb közút" /> <highway type="residential" string="lakóút" /> <highway type="service" string="szervizút" /> <highway type="track" string="földút" /> <highway type="cycleway" string="kerékpárút" /> <highway type="path" string="ösvény" /> <highway type="steps" string="lépcsÅ‘" /> <highway type="ferry" string="komp" /> <!-- The type of route --> <route type="shortest" string="Legrövidebb" /> <!-- For the description and route name --> <route type="quickest" string="Leggyorsabb" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <waypoint type="waypoint" string="Útpont" /> <!-- For the chosen waypoints --> <waypoint type="junction" string="KeresztezÅ‘dés" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="Körforgalom" /> <!-- For roundabouts --> <title text="%s útvonal" /> <!-- %s = [shortest|quickest] --> <start text="%s, indulás %s felé" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="%s, menj %s, %s felé" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <rbnode text="%s, hagyd el %s kijáraton %s felé" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="Haladj ezen: %s, %.3f km-t, %.1f percig" /> <!-- 1st %s = street name --> <stop text="Ãllj meg itt: %s" /> <!-- 1st %s = [waypoint|junction] --> <total text="Összesen %.1f km, %.0f perc" /> <subtotal text="%.1f km, %.0f perc" /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="ÚTPONT" /> <!-- For the route waypoints --> <waypoint type="trip" string="ÚT" /> <!-- For the other route points --> <desc text="A kiindulási és a célpont közötti %s útvonal" /> <!-- %s = [shortest|quickest] --> <name text="%s útvonal" /> <!-- %s = [shortest|quickest] --> <step text="%s felé itt: %s, %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="Az egész út %.1f km, %.0f perc" /> </output-gpx> </language> <language lang="it" language="Italiano"> <!-- Copyright of the data being routed, not of this file --> <copyright> <creator string="Autore" text="Routino - http://www.routino.org/" /> <source string="Sorgente" text="Basato sui dati di OpenStreetMap (http://www.openstreetmap.org/)" /> <license string="Licenza" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <turn direction="-4" string="Immediatamente a sinistra" /> <turn direction="-3" string="Subito a sinistra" /> <turn direction="-2" string="Sinistra" /> <turn direction="-1" string="Leggermente a sinistra" /> <turn direction="0" string="Dritto" /> <turn direction="1" string="Leggermente a destra" /> <turn direction="2" string="Destra" /> <turn direction="3" string="Subito a destra" /> <turn direction="4" string="Immediatamente a destra" /> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="Sud" /> <heading direction="-3" string="Sud-Ovest" /> <heading direction="-2" string="Ovest" /> <heading direction="-1" string="Nord-Ovest" /> <heading direction="0" string="Nord" /> <heading direction="1" string="Nord-Est" /> <heading direction="2" string="Est" /> <heading direction="3" string="Sud-Est" /> <heading direction="4" string="Sud" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="Prima" /> <ordinal number="2" string="Seconda" /> <ordinal number="3" string="Terza" /> <ordinal number="4" string="Quarta" /> <ordinal number="5" string="Quinta" /> <ordinal number="6" string="Sesta" /> <ordinal number="7" string="Settima" /> <ordinal number="8" string="Ottava" /> <ordinal number="9" string="Nona" /> <ordinal number="10" string="Decima" /> <!-- Highway names --> <highway type="motorway" string="autostrada" /> <highway type="trunk" string="superstrada" /> <highway type="primary" string="strada statale" /> <highway type="secondary" string="strada regionale" /> <highway type="tertiary" string="strada provinciale" /> <highway type="unclassified" string="strada non classificata" /> <highway type="residential" string="strada residenziale" /> <highway type="service" string="strada di servizio" /> <highway type="track" string="traccia" /> <highway type="cycleway" string="pista ciclabile" /> <highway type="path" string="sentiero" /> <highway type="steps" string="scalinata" /> <highway type="ferry" string="traghetto" /> <!-- The type of route --> <route type="shortest" string="Il piu' corto" /> <!-- For the description and route name --> <route type="quickest" string="Il piu' veloce" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <waypoint type="waypoint" string="Punto sul tragitto" /> <!-- For the chosen waypoints --> <waypoint type="junction" string="Raccordo" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="Rotatoria" /> <!-- For roundabouts --> <title text="%s Itinerario" /> <!-- %s = [shortest|quickest] --> <start text="Inizia a %s, su %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="A %s, vai a %s su %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <rbnode text="Lascia %s, prendi la %s uscita su %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="Segui %s per %.3f km, %.1f min" /> <!-- 1st %s = street name --> <stop text="Stop fra %s" /> <!-- 1st %s = [waypoint|junction] --> <total text="Totale %.1f km, %.0f minuti" /> <subtotal text="%.1f km, %.0f minuti" /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="WAYPT" /> <!-- For the route waypoints --> <waypoint type="trip" string="TRIP" /> <!-- For the other route points --> <desc text="%s punti sul percorso fra 'start' e 'finish'" /> <!-- %s = [shortest|quickest] --> <name text="%s percorso" /> <!-- %s = [shortest|quickest] --> <step text="%s su '%s' per %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="Viaggio completo %.1f km, %.0f minuti" /> </output-gpx> </language> <language lang="nl" language="Nederlands"> <!-- Copyright of the data being routed, not of this file --> <copyright> <creator string="Maker" text="Routino - http://www.routino.org/" /> <source string="Bron" text="Gebouwd op OpenStreetMap data van http://www.openstreetmap.org/" /> <license string="License" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <turn direction="-4" string="Haarspeld naar links" /> <turn direction="-3" string="Scherp links" /> <turn direction="-2" string="Links" /> <turn direction="-1" string="Half links" /> <turn direction="0" string="Rechtdoor" /> <turn direction="1" string="Half rechts" /> <turn direction="2" string="Rechts" /> <turn direction="3" string="Scherp rechts" /> <turn direction="4" string="Haarspeld naar rechts" /> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="Zuid" /> <heading direction="-3" string="Zuid-West" /> <heading direction="-2" string="West" /> <heading direction="-1" string="Noord-West" /> <heading direction="0" string="Noord" /> <heading direction="1" string="Noord-Oost" /> <heading direction="2" string="Oost" /> <heading direction="3" string="Zuid-Oost" /> <heading direction="4" string="Zuid" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="Eerste" /> <ordinal number="2" string="Tweede" /> <ordinal number="3" string="Derde" /> <ordinal number="4" string="Vierde" /> <ordinal number="5" string="Vijfde" /> <ordinal number="6" string="Zesde" /> <ordinal number="7" string="Zevende" /> <ordinal number="8" string="Achtste" /> <ordinal number="9" string="Negende" /> <ordinal number="10" string="Tiende" /> <!-- Highway names --> <highway type="motorway" string="Autosnelweg" /> <highway type="trunk" string="Autoweg" /> <highway type="primary" string="Primaire weg" /> <highway type="secondary" string="Secundaire weg" /> <highway type="tertiary" string="Tertiaire weg" /> <highway type="unclassified" string="Niet geclassificeerde weg" /> <highway type="residential" string="Woonstraat" /> <highway type="service" string="Toegangsweg" /> <highway type="track" string="Veldweg" /> <highway type="cycleway" string="Fietspad" /> <highway type="path" string="Pad" /> <highway type="steps" string="Trap" /> <highway type="ferry" string="Veerboot" /> <!-- The type of route --> <route type="shortest" string="Kortste" /> <!-- For the description and route name --> <route type="quickest" string="Snelste" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <waypoint type="waypoint" string="Routepunt" /> <!-- For the chosen waypoints --> <waypoint type="junction" string="Splitsing" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="Rotonde" /> <!-- For roundabouts --> <title text="%s Route" /> <!-- %s = [shortest|quickest] --> <start text="Start bij %s neem de richting %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="Bij %s, ga %s richting %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <rbnode text="Verlaat %s, neem de %s afslag richting %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="Volg de %s voor %.3f km %.1f min" /> <!-- 1st %s = street name --> <stop text="Stop bij %s" /> <!-- 1st %s = [waypoint|junction] --> <total text="Totaal %.1f km, %.0f minuten" /> <subtotal text="%.1f km, %.0f minuten" /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="WAYPT" /> <!-- For the route waypoints --> <waypoint type="trip" string="TRIP" /> <!-- For the other route points --> <desc text="%s route tussen 'start' and 'eind' routepunten" /> <!-- %s = [shortest|quickest] --> <name text="%s route" /> <!-- %s = [shortest|quickest] --> <step text="%s op '%s' voor %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="Totaal trip %.1f km, %.0f minuten" /> </output-gpx> </language> <language lang="pl" language="Polski"> <!-- Copyright of the data being routed, not of this file --> <copyright> <creator string="Twórca" text="Routino - http://www.routino.org/" /> <source string="ŹródÅ‚o" text="Oparte na danych OpenStreetMap ze strony http://www.openstreetmap.org/" /> <license string="Licencja" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <turn direction="-4" string="Bardzo ostro w lewo" /> <turn direction="-3" string="Ostro w lewo" /> <turn direction="-2" string="W lewo" /> <turn direction="-1" string="Lekko w lewo" /> <turn direction="0" string="Prosto" /> <turn direction="1" string="Lekko w prawo" /> <turn direction="2" string="W prawo" /> <turn direction="3" string="Ostro w prawo" /> <turn direction="4" string="Bardzo ostro w prawo" /> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="Na poÅ‚udnie" /> <heading direction="-3" string="Na poÅ‚udniowy zachód" /> <heading direction="-2" string="Na zachód" /> <heading direction="-1" string="Na północny zachód" /> <heading direction="0" string="Na północ" /> <heading direction="1" string="Na północny wschód" /> <heading direction="2" string="Na wschód" /> <heading direction="3" string="Na poÅ‚udniowy wschód" /> <heading direction="4" string="Na poÅ‚udnie" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="Pierwszy" /> <ordinal number="2" string="Drugi" /> <ordinal number="3" string="Trzeci" /> <ordinal number="4" string="Czwarty" /> <ordinal number="5" string="PiÄ…ty" /> <ordinal number="6" string="Szósty" /> <ordinal number="7" string="Siódmy" /> <ordinal number="8" string="Ósmy" /> <ordinal number="9" string="DziewiÄ…ty" /> <ordinal number="10" string="DziesiÄ…ty" /> <!-- Highway names --> <highway type="motorway" string="Autostrada" /> <highway type="trunk" string="Droga ekspresowa" /> <highway type="primary" string="Droga krajowa" /> <highway type="secondary" string="Droga powiatowa" /> <highway type="tertiary" string="Droga lokalna" /> <highway type="unclassified" string="Droga nieznanego typu" /> <highway type="residential" string="Droga osiedlowa" /> <highway type="service" string="Droga dojazdowa" /> <highway type="track" string="Droga polna" /> <highway type="cycleway" string="Droga rowerowa" /> <highway type="path" string="Åšcieżka" /> <highway type="steps" string="Pieszo" /> <highway type="ferry" string="Prom" /> <!-- The type of route --> <route type="shortest" string="Najkrótsza" /> <!-- For the description and route name --> <route type="quickest" string="Najszybsza" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <waypoint type="waypoint" string="Punkt" /> <!-- For the chosen waypoints --> <waypoint type="junction" string="Połączenie" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="Rondo" /> <!-- For roundabouts --> <title text="%s Trasa" /> <!-- %s = [shortest|quickest] --> <start text="Start %s kieruj siÄ™ na %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="Jedź %s, dalej %s przez %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <rbnode text="Zjedź %s, skręć w %s, nastÄ™pnie %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="Podążaj %s przez %.3f km, %.1f min." /> <!-- 1st %s = street name --> <stop text="Stop Na %s" /> <!-- 1st %s = [waypoint|junction] --> <total text="CaÅ‚kowity %.1f km, %.0f min." /> <subtotal text="%.1f km, %.0f min." /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="Punkt" /> <!-- For the route waypoints --> <waypoint type="trip" string="Podróż" /> <!-- For the other route points --> <desc text="%s trasa pomiÄ™dzy 'start' a 'koniec'" /> <!-- %s = [shortest|quickest] --> <name text="%s trasa" /> <!-- %s = [shortest|quickest] --> <step text="%s na %s przez %.3f km, %.1f min." /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="CaÅ‚kowita podróż %.1f km, %.0f min." /> </output-gpx> </language> <language lang="ru" language="РуÑÑкий"> <!-- Copyright of the data being routed, not of this file --> <copyright> <creator string="Ðвтор" text="Routino - http://www.routino.org/" /> <source string="ИÑточник" text="ИÑпользованы данные OpenStreetMap http://www.openstreetmap.org/" /> <license string="ЛицензиÑ" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <turn direction="-4" string="очень крутой поворот налево" /> <turn direction="-3" string="крутой поворот налево" /> <turn direction="-2" string="налево" /> <turn direction="-1" string="плавно налево" /> <turn direction="0" string="прÑмо" /> <turn direction="1" string="плавно направо" /> <turn direction="2" string="направо" /> <turn direction="3" string="крутой поворот направо" /> <turn direction="4" string="очень крутой поворот направо" /> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="юг" /> <heading direction="-3" string="юго-запад" /> <heading direction="-2" string="запад" /> <heading direction="-1" string="Ñеверо-запад" /> <heading direction="0" string="Ñевер" /> <heading direction="1" string="Ñеверо-воÑток" /> <heading direction="2" string="воÑток" /> <heading direction="3" string="юго-воÑток" /> <heading direction="4" string="юг" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="Первый" /> <ordinal number="2" string="Второй" /> <ordinal number="3" string="Третий" /> <ordinal number="4" string="Четвертый" /> <ordinal number="5" string="ПÑтый" /> <ordinal number="6" string="ШеÑтой" /> <ordinal number="7" string="Седьмой" /> <ordinal number="8" string="ВоÑьмой" /> <ordinal number="9" string="ДевÑтый" /> <ordinal number="10" string="ДеÑÑтый" /> <!-- Highway names --> <highway type="motorway" string="автомагиÑтраль" /> <highway type="trunk" string="Ð¼ÐµÐ¶Ð´ÑƒÐ½Ð°Ñ€Ð¾Ð´Ð½Ð°Ñ Ñ‚Ñ€Ð°ÑÑа" /> <highway type="primary" string="дорога регионального значениÑ" /> <highway type="secondary" string="дорога облаÑтного значениÑ" /> <highway type="tertiary" string="дорога районного значениÑ" /> <highway type="unclassified" string="дорога меÑтного значениÑ" /> <highway type="residential" string="улица" /> <highway type="service" string="проезд" /> <highway type="track" string="дорога Ñ/Ñ… назначениÑ" /> <highway type="cycleway" string="велодорожка" /> <highway type="path" string="тропинка" /> <highway type="steps" string="леÑтница" /> <highway type="ferry" string="паром" /> <!-- The type of route --> <route type="shortest" string="Кратчайший" /> <!-- For the description and route name --> <route type="quickest" string="БыÑтрый" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <waypoint type="waypoint" string="Точка" /> <!-- For the chosen waypoints --> <waypoint type="junction" string="перекреÑтке" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="круговое движение" /> <!-- For roundabouts --> <title text="%s маршрут" /> <!-- %s = [shortest|quickest] --> <start text="Старт %s, на %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="на %s, %s, на %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <!-- TRANSLATION REQUIRED: rbnode text="Leave %s, take the %s exit heading %s" / --> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="Следуйте по %s %.3f км, %.1f мин" /> <!-- 1st %s = street name --> <stop text="Стоп %s" /> <!-- 1st %s = [waypoint|junction] --> <total text="Ð’Ñего %.1f км, %.0f минут" /> <subtotal text="%.1f км, %.0f минут" /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="ТОЧКÐ" /> <!-- For the route waypoints --> <waypoint type="trip" string="ПОЕЗДКÐ" /> <!-- For the other route points --> <desc text="%s маршрут от 'Старта' до 'Финиша'" /> <!-- %s = [shortest|quickest] --> <name text="%s маршрут" /> <!-- %s = [shortest|quickest] --> <step text="на %s по '%s' %.3f км, %.1f мин" /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="Ð’Ñего - %.1f км, продолжительноÑть - %.0f минут" /> </output-gpx> </language> <language lang="sk" language="SlovenÄina"> <!-- Copyright of the data being routed, not of this file --> <copyright> <creator string="Vyvíja" text="Routino - http://www.routino.org/" /> <source string="Zdroj" text="Postavené na dátach OpenStreetMap z http://www.openstreetmap.org/" /> <license string="Licencia" text="http://www.openstreetmap.org/copyright" /> </copyright> <!-- Turn directions, 0 = ahead, -2 = left, +/-4 = behind, +2 = right --> <turn direction="-4" string="veľmi ostro vľavo" /> <turn direction="-3" string="ostro vľavo" /> <turn direction="-2" string="vľavo" /> <turn direction="-1" string="mierne vľavo" /> <turn direction="0" string="priamo" /> <turn direction="1" string="mierne vpravo" /> <turn direction="2" string="vpravo" /> <turn direction="3" string="ostro vpravo" /> <turn direction="4" string="veľmi ostro vpravo" /> <!-- Heading directions, 0 = North, -2 = West, +/-4 = South, +2 = East --> <heading direction="-4" string="Južne" /> <heading direction="-3" string="Juhozápadne" /> <heading direction="-2" string="Západne" /> <heading direction="-1" string="Severozápadne" /> <heading direction="0" string="Severne" /> <heading direction="1" string="Severovýchodne" /> <heading direction="2" string="Východne" /> <heading direction="3" string="Juhovýchodne" /> <heading direction="4" string="Južne" /> <!-- Ordinals, 1 = first, 2 = second ... --> <ordinal number="1" string="Prvý" /> <ordinal number="2" string="Druhý" /> <ordinal number="3" string="Tretí" /> <ordinal number="4" string="Å tvrtý" /> <ordinal number="5" string="Piaty" /> <ordinal number="6" string="Å iesty" /> <ordinal number="7" string="Siedmy" /> <ordinal number="8" string="Ôsmy" /> <ordinal number="9" string="Deviaty" /> <ordinal number="10" string="Desiaty" /> <!-- Highway names --> <highway type="motorway" string="diaľnici" /> <highway type="trunk" string="hlavnej ceste" /> <highway type="primary" string="ceste I. triedy" /> <highway type="secondary" string="ceste II. triedy" /> <highway type="tertiary" string="ceste III. triedy" /> <highway type="unclassified" string="neoznaÄenej ceste" /> <highway type="residential" string="miestnej komunikácii" /> <highway type="service" string="úÄelovej komunikácii" /> <highway type="track" string="ceste" /> <highway type="cycleway" string="cykloceste" /> <highway type="path" string="chodníku" /> <highway type="steps" string="schodoch" /> <highway type="ferry" string="prievoze" /> <!-- The type of route --> <route type="shortest" string="NajkratÅ¡ia" /> <!-- For the description and route name --> <route type="quickest" string="NajrýchlejÅ¡ia" /> <!-- For the description and route name --> <!-- HTML output --> <output-html> <waypoint type="waypoint" string="bode" /> <!-- For the chosen waypoints --> <waypoint type="junction" string="križovatke" /> <!-- For the interesting junctions --> <waypoint type="roundabout" string="kruhový objazd" /> <!-- For roundabouts --> <title text="%s Trasa" /> <!-- %s = [shortest|quickest] --> <start text="ZaÄiatok v %s, %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [heading] --> <node text="V %s odboÄte %s, %s" /> <!-- 1st %s = [waypoint|junction], 2nd %s = [turn], 3rd %s = [heading] --> <rbnode text="Opustite %s, %s výjazd %s" /> <!-- 1st %s = [roundabout], 2nd %s = [first|second|...], 3rd %s = [heading] --> <segment text="PokraÄujte po %s Äalších %.3f km, %.1f min" /> <!-- 1st %s = street name --> <stop text="Zastavte v %s" /> <!-- 1st %s = [waypoint|junction] --> <total text="Celkovo %.1f km, %.0f minút" /> <subtotal text="%.1f km, %.0f minút" /> </output-html> <!-- GPX output --> <output-gpx> <waypoint type="waypt" string="BOD" /> <!-- For the route waypoints --> <waypoint type="trip" string="CESTA" /> <!-- For the other route points --> <desc text="%s trasa medzi 'Å¡tartom' a 'cieľom' cez" /> <!-- %s = [shortest|quickest] --> <name text="%s trasa" /> <!-- %s = [shortest|quickest] --> <step text="%s po '%s' Äaľších %.3f km, %.1f min" /> <!-- 1st %s = [turn], 2nd %s = street name --> <final text="Celková trasa %.1f km, %.0f minút" /> </output-gpx> </language> </routino-translations> ��������������������������������������������������������������������������������������������routino-3.4.3/xml/routino-translations.xsd���������������������������������������������������������� 644 � 233 � 144 � 15101 12572577346 14166� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!-- ============================================================ An XML Schema Definition for the Routino translations XML format Part of the Routino routing software. ============================================================ This file Copyright 2010-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ============================================================ --> <xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- The top level Routino translation --> <xsd:element name="routino-translations" type="RoutinoTranslationsType"/> <xsd:complexType name="RoutinoTranslationsType"> <xsd:sequence> <xsd:element name="language" type="LanguageType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="LanguageType"> <xsd:sequence> <xsd:element name="copyright" type="CopyrightType" minOccurs="0"/> <xsd:element name="turn" type="TurnType" minOccurs="0" maxOccurs="9"/> <xsd:element name="heading" type="HeadingType" minOccurs="0" maxOccurs="9"/> <xsd:element name="ordinal" type="OrdinalType" minOccurs="0" maxOccurs="10"/> <xsd:element name="highway" type="HighwayType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="route" type="RouteType" minOccurs="0" maxOccurs="2"/> <xsd:element name="output-html" type="HTMLType" minOccurs="0"/> <xsd:element name="output-gpx" type="GPXType" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="lang" type="xsd:string"/> <xsd:attribute name="language" type="xsd:string"/> </xsd:complexType> <!-- The copyright information (of the generated output, not of this file) --> <xsd:complexType name="CopyrightType"> <xsd:sequence> <xsd:element name="creator" type="CopyrightCreatorType" minOccurs="0"/> <xsd:element name="source" type="CopyrightSourceType" minOccurs="0"/> <xsd:element name="license" type="CopyrightLicenseType" minOccurs="0"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="CopyrightCreatorType"> <xsd:attribute name="string" type="xsd:string"/> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="CopyrightSourceType"> <xsd:attribute name="string" type="xsd:string"/> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="CopyrightLicenseType"> <xsd:attribute name="string" type="xsd:string"/> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <!-- The turn, heading, ordinal, highway and route strings --> <xsd:complexType name="TurnType"> <xsd:attribute name="direction" type="xsd:string"/> <xsd:attribute name="string" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="HeadingType"> <xsd:attribute name="direction" type="xsd:string"/> <xsd:attribute name="string" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="OrdinalType"> <xsd:attribute name="number" type="xsd:string"/> <xsd:attribute name="string" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="HighwayType"> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="string" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="RouteType"> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="string" type="xsd:string"/> </xsd:complexType> <!-- The HTML output strings --> <xsd:complexType name="HTMLType"> <xsd:sequence> <xsd:element name="waypoint" type="HTMLWaypointType" maxOccurs="3"/> <xsd:element name="title" type="HTMLTitleType"/> <xsd:element name="start" type="HTMLStartType"/> <xsd:element name="node" type="HTMLNodeType"/> <xsd:element name="rbnode" type="HTMLRBNodeType"/> <xsd:element name="segment" type="HTMLSegmentType"/> <xsd:element name="stop" type="HTMLStopType"/> <xsd:element name="total" type="HTMLTotalType"/> <xsd:element name="subtotal" type="HTMLSubtotalType"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="HTMLWaypointType"> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="string" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="HTMLTitleType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="HTMLStartType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="HTMLNodeType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="HTMLRBNodeType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="HTMLSegmentType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="HTMLStopType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="HTMLTotalType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="HTMLSubtotalType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <!-- The GPX output strings --> <xsd:complexType name="GPXType"> <xsd:sequence> <xsd:element name="waypoint" type="GPXWaypointType" maxOccurs="4"/> <xsd:element name="desc" type="GPXDescType"/> <xsd:element name="name" type="GPXNameType"/> <xsd:element name="step" type="GPXStepType"/> <xsd:element name="final" type="GPXFinalType"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="GPXWaypointType"> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="string" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="GPXDescType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="GPXNameType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="GPXStepType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="GPXFinalType"> <xsd:attribute name="text" type="xsd:string"/> </xsd:complexType> </xsd:schema> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/xml/osm.xsd��������������������������������������������������������������������������� 644 � 233 � 144 � 13460 12042033044 10522� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8" ?> <!-- ============================================================ An XML Schema Definition for the OSM XML format (including JOSM specific additions such as 'bounds' tag and 'action' attribute). Created by reverse engineering a JOSM saved file; not used in Routino but in a proof-of-concept parser created by xsd-to-xmlparser. ============================================================ This file Copyright 2010-2012 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ============================================================ --> <xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- The top level osm element --> <xsd:element name="osm" type="osmType"/> <xsd:complexType name="osmType"> <xsd:sequence> <xsd:element name="bounds" type="boundsType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="bound" type="boundType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="changeset" type="changesetType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="way" type="wayType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="relation" type="relationType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="generator" type="xsd:string"/> </xsd:complexType> <!-- The second level bounds, bound, changeset, node, way and relation elements --> <xsd:complexType name="boundsType"> <xsd:attribute name="minlat" type="xsd:string"/> <xsd:attribute name="minlon" type="xsd:string"/> <xsd:attribute name="maxlat" type="xsd:string"/> <xsd:attribute name="maxlon" type="xsd:string"/> <xsd:attribute name="origin" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="boundType"> <xsd:attribute name="box" type="xsd:string"/> <xsd:attribute name="origin" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="changesetType"> <xsd:sequence> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="min_lat" type="xsd:string"/> <xsd:attribute name="min_lon" type="xsd:string"/> <xsd:attribute name="max_lat" type="xsd:string"/> <xsd:attribute name="max_lon" type="xsd:string"/> <xsd:attribute name="created_at" type="xsd:string"/> <xsd:attribute name="closed_at" type="xsd:string"/> <xsd:attribute name="open" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="nodeType"> <xsd:sequence> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="lat" type="xsd:string"/> <xsd:attribute name="lon" type="xsd:string"/> <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="wayType"> <xsd:sequence> <xsd:element name="nd" type="ndType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="relationType"> <xsd:sequence> <xsd:element name="member" type="memberType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> </xsd:complexType> <!-- The third level elements and their contents --> <xsd:complexType name="tagType"> <xsd:attribute name="k" type="xsd:string"/> <xsd:attribute name="v" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="ndType"> <xsd:attribute name="ref" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="memberType"> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="ref" type="xsd:string"/> <xsd:attribute name="role" type="xsd:string"/> </xsd:complexType> </xsd:schema> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/xml/routino-osc.xsd������������������������������������������������������������������� 644 � 233 � 144 � 13542 12051456376 12227� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8" ?> <!-- ============================================================ An XML Schema Definition for the part of the OSC XML format read by Routino. Part of the Routino routing software (semi-automatically converted to create osmparse.c). ============================================================ This file Copyright 2010-2012 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ============================================================ --> <xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- The top level osmChange element --> <xsd:element name="osmChange" type="osmChangeType"/> <xsd:complexType name="osmChangeType"> <xsd:sequence> <xsd:element name="bounds" type="boundsType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="modify" type="modifyType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="create" type="createType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="delete" type="deleteType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="version" type="xsd:string"/> <!-- <xsd:attribute name="generator" type="xsd:string"/> --> </xsd:complexType> <!-- The second level bounds, modify, create and delete elements --> <xsd:complexType name="boundsType"> <!-- <xsd:attribute name="minlat" type="xsd:string"/> <xsd:attribute name="minlon" type="xsd:string"/> <xsd:attribute name="maxlat" type="xsd:string"/> <xsd:attribute name="maxlon" type="xsd:string"/> <xsd:attribute name="origin" type="xsd:string"/> --> </xsd:complexType> <xsd:complexType name="modifyType"> <xsd:sequence> <xsd:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="way" type="wayType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="relation" type="relationType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="createType"> <xsd:sequence> <xsd:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="way" type="wayType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="relation" type="relationType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="deleteType"> <xsd:sequence> <xsd:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="way" type="wayType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="relation" type="relationType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <!-- The third level node, way and relation elements --> <xsd:complexType name="nodeType"> <xsd:sequence> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="lat" type="xsd:string"/> <xsd:attribute name="lon" type="xsd:string"/> <!-- <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> --> </xsd:complexType> <xsd:complexType name="wayType"> <xsd:sequence> <xsd:element name="nd" type="ndType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <!-- <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> --> </xsd:complexType> <xsd:complexType name="relationType"> <xsd:sequence> <xsd:element name="member" type="memberType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <!-- <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> --> </xsd:complexType> <!-- The fourth level elements and their contents --> <xsd:complexType name="tagType"> <xsd:attribute name="k" type="xsd:string"/> <xsd:attribute name="v" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="ndType"> <xsd:attribute name="ref" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="memberType"> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="ref" type="xsd:string"/> <xsd:attribute name="role" type="xsd:string"/> </xsd:complexType> </xsd:schema> ��������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/xml/routino-profiles.xsd�������������������������������������������������������������� 644 � 233 � 144 � 7431 11523232407 13234� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!-- ============================================================ An XML Schema Definition for the Routino profile XML format Part of the Routino routing software. ============================================================ This file Copyright 2010-2011 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ============================================================ --> <xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- The top level Routino profiles --> <xsd:element name="routino-profiles" type="RoutinoProfilesType"/> <xsd:complexType name="RoutinoProfilesType"> <xsd:sequence> <xsd:element name="profile" type="profileType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="profileType"> <xsd:sequence> <xsd:element name="speeds" type="speedsType" /> <xsd:element name="preferences" type="preferencesType" /> <xsd:element name="properties" type="propertiesType" /> <xsd:element name="restrictions" type="restrictionsType"/> </xsd:sequence> <xsd:attribute name="name" type="xsd:string"/> <xsd:attribute name="transport" type="xsd:string"/> </xsd:complexType> <!-- The second level preferences, speed, properties and restrictions --> <xsd:complexType name="speedsType"> <xsd:sequence> <xsd:element name="speed" type="speedType" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="preferencesType"> <xsd:sequence> <xsd:element name="preference" type="preferenceType" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="propertiesType"> <xsd:sequence> <xsd:element name="property" type="propertyType" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="restrictionsType"> <xsd:sequence> <xsd:element name="oneway" type="onewayType"/> <xsd:element name="turns" type="turnsType"/> <xsd:element name="weight" type="weightType"/> <xsd:element name="height" type="heightType"/> <xsd:element name="width" type="widthType"/> <xsd:element name="length" type="lengthType"/> </xsd:sequence> </xsd:complexType> <!-- The lowest level elements containing the real information --> <xsd:complexType name="speedType"> <xsd:attribute name="highway" type="xsd:string"/> <xsd:attribute name="kph" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="preferenceType"> <xsd:attribute name="highway" type="xsd:string"/> <xsd:attribute name="percent" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="propertyType"> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="percent" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="onewayType"> <xsd:attribute name="obey" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="turnsType"> <xsd:attribute name="obey" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="weightType"> <xsd:attribute name="limit" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="heightType"> <xsd:attribute name="limit" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="widthType"> <xsd:attribute name="limit" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="lengthType"> <xsd:attribute name="limit" type="xsd:string"/> </xsd:complexType> </xsd:schema> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/xml/xsd.xsd��������������������������������������������������������������������������� 644 � 233 � 144 � 5261 11506610624 10513� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8" ?> <!-- ============================================================ $Header: /home/amb/CVS/routino/xml/xsd.xsd,v 1.1 2010-03-28 15:27:05 amb Exp $ An XML Schema Definition for the XML Schema Definition XML format Not a full definition but sufficient to allow the xsd-to-xmlparser to read it to bootstrap itself - a program to read in other files in the same format to create more XML parsers for other useful things. ============================================================ This file Copyright 2010 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ============================================================ --> <xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- The top level xsd:schema element --> <xsd:element name="xsd:schema" type="schemaType"/> <xsd:complexType name="schemaType"> <xsd:sequence> <xsd:element name="xsd:element" type="elementType"/> <xsd:element name="xsd:complexType" type="complexType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="elementFormDefault" type="xsd:string"/> <xsd:attribute name="xmlns:xsd" type="xsd:string"/> </xsd:complexType> <!-- The second level xsd:element and xsd:complexType elements --> <xsd:complexType name="elementType"> <xsd:attribute name="name" type="xsd:string"/> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="minOccurs" type="xsd:string"/> <xsd:attribute name="maxOccurs" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="complexType"> <xsd:sequence> <xsd:element name="xsd:sequence" type="sequenceType" minOccurs="0"/> <xsd:element name="xsd:attribute" type="attributeType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="name" type="xsd:string"/> </xsd:complexType> <!-- The third level elements and their contents --> <xsd:complexType name="sequenceType"> <xsd:sequence> <xsd:element name="xsd:element" type="elementType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="attributeType"> <xsd:attribute name="name" type="xsd:string"/> <xsd:attribute name="type" type="xsd:string"/> </xsd:complexType> </xsd:schema> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/xml/routino-profiles.xml�������������������������������������������������������������� 644 � 233 � 144 � 52066 12634332507 13270� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?> <!-- ============================================================ An XML format file containing Routino routing profiles Part of the Routino routing software. ============================================================ This file Copyright 2010-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ============================================================ --> <routino-profiles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.routino.org/xml/routino-profiles.xsd"> <profile name="foot" transport="foot"> <speeds> <speed highway="motorway" kph="0" /> <speed highway="trunk" kph="4" /> <speed highway="primary" kph="4" /> <speed highway="secondary" kph="4" /> <speed highway="tertiary" kph="4" /> <speed highway="unclassified" kph="4" /> <speed highway="residential" kph="4" /> <speed highway="service" kph="4" /> <speed highway="track" kph="4" /> <speed highway="cycleway" kph="4" /> <speed highway="path" kph="4" /> <speed highway="steps" kph="4" /> <speed highway="ferry" kph="10" /> </speeds> <preferences> <preference highway="motorway" percent="0" /> <preference highway="trunk" percent="40" /> <preference highway="primary" percent="50" /> <preference highway="secondary" percent="60" /> <preference highway="tertiary" percent="70" /> <preference highway="unclassified" percent="80" /> <preference highway="residential" percent="90" /> <preference highway="service" percent="90" /> <preference highway="track" percent="95" /> <preference highway="cycleway" percent="95" /> <preference highway="path" percent="100" /> <preference highway="steps" percent="80" /> <preference highway="ferry" percent="20" /> </preferences> <properties> <property type="paved" percent="50" /> <property type="multilane" percent="25" /> <property type="bridge" percent="50" /> <property type="tunnel" percent="50" /> <property type="footroute" percent="55" /> <property type="bicycleroute" percent="55" /> </properties> <restrictions> <oneway obey="0" /> <turns obey="0" /> <weight limit="0.0" /> <height limit="0.0" /> <width limit="0.0" /> <length limit="0.0" /> </restrictions> </profile> <profile name="horse" transport="horse"> <speeds> <speed highway="motorway" kph="0" /> <speed highway="trunk" kph="8" /> <speed highway="primary" kph="8" /> <speed highway="secondary" kph="8" /> <speed highway="tertiary" kph="8" /> <speed highway="unclassified" kph="8" /> <speed highway="residential" kph="8" /> <speed highway="service" kph="8" /> <speed highway="track" kph="8" /> <speed highway="cycleway" kph="8" /> <speed highway="path" kph="8" /> <speed highway="steps" kph="0" /> <speed highway="ferry" kph="10" /> </speeds> <preferences> <preference highway="motorway" percent="0" /> <preference highway="trunk" percent="25" /> <preference highway="primary" percent="50" /> <preference highway="secondary" percent="50" /> <preference highway="tertiary" percent="75" /> <preference highway="unclassified" percent="75" /> <preference highway="residential" percent="75" /> <preference highway="service" percent="75" /> <preference highway="track" percent="100" /> <preference highway="cycleway" percent="90" /> <preference highway="path" percent="100" /> <preference highway="steps" percent="0" /> <preference highway="ferry" percent="20" /> </preferences> <properties> <property type="paved" percent="20" /> <property type="multilane" percent="25" /> <property type="bridge" percent="50" /> <property type="tunnel" percent="50" /> <property type="footroute" percent="50" /> <property type="bicycleroute" percent="50" /> </properties> <restrictions> <oneway obey="1" /> <turns obey="1" /> <weight limit="0.0" /> <height limit="0.0" /> <width limit="0.0" /> <length limit="0.0" /> </restrictions> </profile> <profile name="wheelchair" transport="wheelchair"> <speeds> <speed highway="motorway" kph="0" /> <speed highway="trunk" kph="4" /> <speed highway="primary" kph="4" /> <speed highway="secondary" kph="4" /> <speed highway="tertiary" kph="4" /> <speed highway="unclassified" kph="4" /> <speed highway="residential" kph="4" /> <speed highway="service" kph="4" /> <speed highway="track" kph="4" /> <speed highway="cycleway" kph="4" /> <speed highway="path" kph="4" /> <speed highway="steps" kph="4" /> <speed highway="ferry" kph="10" /> </speeds> <preferences> <preference highway="motorway" percent="0" /> <preference highway="trunk" percent="40" /> <preference highway="primary" percent="50" /> <preference highway="secondary" percent="60" /> <preference highway="tertiary" percent="70" /> <preference highway="unclassified" percent="80" /> <preference highway="residential" percent="90" /> <preference highway="service" percent="90" /> <preference highway="track" percent="95" /> <preference highway="cycleway" percent="95" /> <preference highway="path" percent="100" /> <preference highway="steps" percent="0" /> <preference highway="ferry" percent="20" /> </preferences> <properties> <property type="paved" percent="90" /> <property type="multilane" percent="25" /> <property type="bridge" percent="50" /> <property type="tunnel" percent="50" /> <property type="footroute" percent="55" /> <property type="bicycleroute" percent="55" /> </properties> <restrictions> <oneway obey="0" /> <turns obey="0" /> <weight limit="0.0" /> <height limit="0.0" /> <width limit="0.0" /> <length limit="0.0" /> </restrictions> </profile> <profile name="bicycle" transport="bicycle"> <speeds> <speed highway="motorway" kph="0" /> <speed highway="trunk" kph="20" /> <speed highway="primary" kph="20" /> <speed highway="secondary" kph="20" /> <speed highway="tertiary" kph="20" /> <speed highway="unclassified" kph="20" /> <speed highway="residential" kph="20" /> <speed highway="service" kph="20" /> <speed highway="track" kph="20" /> <speed highway="cycleway" kph="20" /> <speed highway="path" kph="20" /> <speed highway="steps" kph="0" /> <speed highway="ferry" kph="10" /> </speeds> <preferences> <preference highway="motorway" percent="0" /> <preference highway="trunk" percent="30" /> <preference highway="primary" percent="70" /> <preference highway="secondary" percent="80" /> <preference highway="tertiary" percent="90" /> <preference highway="unclassified" percent="90" /> <preference highway="residential" percent="90" /> <preference highway="service" percent="90" /> <preference highway="track" percent="90" /> <preference highway="cycleway" percent="100" /> <preference highway="path" percent="90" /> <preference highway="steps" percent="0" /> <preference highway="ferry" percent="20" /> </preferences> <properties> <property type="paved" percent="50" /> <property type="multilane" percent="25" /> <property type="bridge" percent="50" /> <property type="tunnel" percent="50" /> <property type="footroute" percent="50" /> <property type="bicycleroute" percent="60" /> </properties> <restrictions> <oneway obey="1" /> <turns obey="1" /> <weight limit="0.0" /> <height limit="0.0" /> <width limit="0.0" /> <length limit="0.0" /> </restrictions> </profile> <profile name="moped" transport="moped"> <speeds> <speed highway="motorway" kph="48" /> <speed highway="trunk" kph="48" /> <speed highway="primary" kph="48" /> <speed highway="secondary" kph="48" /> <speed highway="tertiary" kph="48" /> <speed highway="unclassified" kph="48" /> <speed highway="residential" kph="48" /> <speed highway="service" kph="32" /> <speed highway="track" kph="16" /> <speed highway="cycleway" kph="0" /> <speed highway="path" kph="0" /> <speed highway="steps" kph="0" /> <speed highway="ferry" kph="10" /> </speeds> <preferences> <preference highway="motorway" percent="0" /> <preference highway="trunk" percent="90" /> <preference highway="primary" percent="100" /> <preference highway="secondary" percent="90" /> <preference highway="tertiary" percent="80" /> <preference highway="unclassified" percent="70" /> <preference highway="residential" percent="60" /> <preference highway="service" percent="50" /> <preference highway="track" percent="0" /> <preference highway="cycleway" percent="0" /> <preference highway="path" percent="0" /> <preference highway="steps" percent="0" /> <preference highway="ferry" percent="20" /> </preferences> <properties> <property type="paved" percent="100" /> <property type="multilane" percent="35" /> <property type="bridge" percent="50" /> <property type="tunnel" percent="50" /> <property type="footroute" percent="50" /> <property type="bicycleroute" percent="50" /> </properties> <restrictions> <oneway obey="1" /> <turns obey="1" /> <weight limit="0.0" /> <height limit="0.0" /> <width limit="0.0" /> <length limit="0.0" /> </restrictions> </profile> <profile name="motorcycle" transport="motorcycle"> <speeds> <speed highway="motorway" kph="112" /> <speed highway="trunk" kph="96" /> <speed highway="primary" kph="96" /> <speed highway="secondary" kph="88" /> <speed highway="tertiary" kph="80" /> <speed highway="unclassified" kph="64" /> <speed highway="residential" kph="48" /> <speed highway="service" kph="32" /> <speed highway="track" kph="16" /> <speed highway="cycleway" kph="0" /> <speed highway="path" kph="0" /> <speed highway="steps" kph="0" /> <speed highway="ferry" kph="10" /> </speeds> <preferences> <preference highway="motorway" percent="100" /> <preference highway="trunk" percent="100" /> <preference highway="primary" percent="90" /> <preference highway="secondary" percent="80" /> <preference highway="tertiary" percent="70" /> <preference highway="unclassified" percent="60" /> <preference highway="residential" percent="50" /> <preference highway="service" percent="40" /> <preference highway="track" percent="0" /> <preference highway="cycleway" percent="0" /> <preference highway="path" percent="0" /> <preference highway="steps" percent="0" /> <preference highway="ferry" percent="20" /> </preferences> <properties> <property type="paved" percent="100" /> <property type="multilane" percent="60" /> <property type="bridge" percent="50" /> <property type="tunnel" percent="50" /> <property type="footroute" percent="50" /> <property type="bicycleroute" percent="50" /> </properties> <restrictions> <oneway obey="1" /> <turns obey="1" /> <weight limit="0.0" /> <height limit="0.0" /> <width limit="0.0" /> <length limit="0.0" /> </restrictions> </profile> <profile name="motorcar" transport="motorcar"> <speeds> <speed highway="motorway" kph="112" /> <speed highway="trunk" kph="96" /> <speed highway="primary" kph="96" /> <speed highway="secondary" kph="88" /> <speed highway="tertiary" kph="80" /> <speed highway="unclassified" kph="64" /> <speed highway="residential" kph="48" /> <speed highway="service" kph="32" /> <speed highway="track" kph="16" /> <speed highway="cycleway" kph="0" /> <speed highway="path" kph="0" /> <speed highway="steps" kph="0" /> <speed highway="ferry" kph="10" /> </speeds> <preferences> <preference highway="motorway" percent="100" /> <preference highway="trunk" percent="100" /> <preference highway="primary" percent="90" /> <preference highway="secondary" percent="80" /> <preference highway="tertiary" percent="70" /> <preference highway="unclassified" percent="60" /> <preference highway="residential" percent="50" /> <preference highway="service" percent="40" /> <preference highway="track" percent="0" /> <preference highway="cycleway" percent="0" /> <preference highway="path" percent="0" /> <preference highway="steps" percent="0" /> <preference highway="ferry" percent="20" /> </preferences> <properties> <property type="paved" percent="100" /> <property type="multilane" percent="60" /> <property type="bridge" percent="50" /> <property type="tunnel" percent="50" /> <property type="footroute" percent="45" /> <property type="bicycleroute" percent="45" /> </properties> <restrictions> <oneway obey="1" /> <turns obey="1" /> <weight limit="0.0" /> <height limit="0.0" /> <width limit="0.0" /> <length limit="0.0" /> </restrictions> </profile> <profile name="goods" transport="goods"> <speeds> <speed highway="motorway" kph="96" /> <speed highway="trunk" kph="96" /> <speed highway="primary" kph="96" /> <speed highway="secondary" kph="88" /> <speed highway="tertiary" kph="80" /> <speed highway="unclassified" kph="64" /> <speed highway="residential" kph="48" /> <speed highway="service" kph="32" /> <speed highway="track" kph="16" /> <speed highway="cycleway" kph="0" /> <speed highway="path" kph="0" /> <speed highway="steps" kph="0" /> <speed highway="ferry" kph="10" /> </speeds> <preferences> <preference highway="motorway" percent="100" /> <preference highway="trunk" percent="100" /> <preference highway="primary" percent="90" /> <preference highway="secondary" percent="80" /> <preference highway="tertiary" percent="70" /> <preference highway="unclassified" percent="60" /> <preference highway="residential" percent="50" /> <preference highway="service" percent="40" /> <preference highway="track" percent="0" /> <preference highway="cycleway" percent="0" /> <preference highway="path" percent="0" /> <preference highway="steps" percent="0" /> <preference highway="ferry" percent="20" /> </preferences> <properties> <property type="paved" percent="100" /> <property type="multilane" percent="60" /> <property type="bridge" percent="50" /> <property type="tunnel" percent="50" /> <property type="footroute" percent="45" /> <property type="bicycleroute" percent="45" /> </properties> <restrictions> <oneway obey="1" /> <turns obey="1" /> <weight limit="5.0" /> <height limit="2.5" /> <width limit="2.0" /> <length limit="5.0" /> </restrictions> </profile> <profile name="hgv" transport="hgv"> <speeds> <speed highway="motorway" kph="89" /> <speed highway="trunk" kph="80" /> <speed highway="primary" kph="80" /> <speed highway="secondary" kph="80" /> <speed highway="tertiary" kph="80" /> <speed highway="unclassified" kph="64" /> <speed highway="residential" kph="48" /> <speed highway="service" kph="32" /> <speed highway="track" kph="16" /> <speed highway="cycleway" kph="0" /> <speed highway="path" kph="0" /> <speed highway="steps" kph="0" /> <speed highway="ferry" kph="10" /> </speeds> <preferences> <preference highway="motorway" percent="100" /> <preference highway="trunk" percent="100" /> <preference highway="primary" percent="90" /> <preference highway="secondary" percent="80" /> <preference highway="tertiary" percent="70" /> <preference highway="unclassified" percent="60" /> <preference highway="residential" percent="50" /> <preference highway="service" percent="40" /> <preference highway="track" percent="0" /> <preference highway="cycleway" percent="0" /> <preference highway="path" percent="0" /> <preference highway="steps" percent="0" /> <preference highway="ferry" percent="20" /> </preferences> <properties> <property type="paved" percent="100" /> <property type="multilane" percent="60" /> <property type="bridge" percent="50" /> <property type="tunnel" percent="50" /> <property type="footroute" percent="45" /> <property type="bicycleroute" percent="45" /> </properties> <restrictions> <oneway obey="1" /> <turns obey="1" /> <weight limit="10.0" /> <height limit="3.0" /> <width limit="2.5" /> <length limit="6.0" /> </restrictions> </profile> <profile name="psv" transport="psv"> <speeds> <speed highway="motorway" kph="89" /> <speed highway="trunk" kph="80" /> <speed highway="primary" kph="80" /> <speed highway="secondary" kph="80" /> <speed highway="tertiary" kph="80" /> <speed highway="unclassified" kph="64" /> <speed highway="residential" kph="48" /> <speed highway="service" kph="32" /> <speed highway="track" kph="16" /> <speed highway="cycleway" kph="0" /> <speed highway="path" kph="0" /> <speed highway="steps" kph="0" /> <speed highway="ferry" kph="10" /> </speeds> <preferences> <preference highway="motorway" percent="100" /> <preference highway="trunk" percent="100" /> <preference highway="primary" percent="90" /> <preference highway="secondary" percent="80" /> <preference highway="tertiary" percent="70" /> <preference highway="unclassified" percent="60" /> <preference highway="residential" percent="50" /> <preference highway="service" percent="40" /> <preference highway="track" percent="0" /> <preference highway="cycleway" percent="0" /> <preference highway="path" percent="0" /> <preference highway="steps" percent="0" /> <preference highway="ferry" percent="20" /> </preferences> <properties> <property type="paved" percent="100" /> <property type="multilane" percent="60" /> <property type="bridge" percent="50" /> <property type="tunnel" percent="50" /> <property type="footroute" percent="45" /> <property type="bicycleroute" percent="45" /> </properties> <restrictions> <oneway obey="1" /> <turns obey="1" /> <weight limit="15.0" /> <height limit="3.0" /> <width limit="2.5" /> <length limit="6.0" /> </restrictions> </profile> </routino-profiles> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/xml/osc.xsd��������������������������������������������������������������������������� 644 � 233 � 144 � 13507 12051456324 10524� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8" ?> <!-- ============================================================ An XML Schema Definition for the OSC (OsmChange) XML format Created by reverse engineering an OSC file from the planet replication diffs; not used in Routino but in a proof-of-concept parser created by xsd-to-xmlparser. ============================================================ This file Copyright 2010-2012 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ============================================================ --> <xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- The top level osmChange element --> <xsd:element name="osmChange" type="osmChangeType"/> <xsd:complexType name="osmChangeType"> <xsd:sequence> <xsd:element name="bounds" type="boundsType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="modify" type="modifyType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="create" type="createType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="delete" type="deleteType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="generator" type="xsd:string"/> </xsd:complexType> <!-- The second level bounds, modify, create and delete elements --> <xsd:complexType name="boundsType"> <xsd:attribute name="minlat" type="xsd:string"/> <xsd:attribute name="minlon" type="xsd:string"/> <xsd:attribute name="maxlat" type="xsd:string"/> <xsd:attribute name="maxlon" type="xsd:string"/> <xsd:attribute name="origin" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="modifyType"> <xsd:sequence> <xsd:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="way" type="wayType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="relation" type="relationType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="createType"> <xsd:sequence> <xsd:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="way" type="wayType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="relation" type="relationType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="deleteType"> <xsd:sequence> <xsd:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="way" type="wayType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="relation" type="relationType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <!-- The third level node, way and relation elements --> <xsd:complexType name="nodeType"> <xsd:sequence> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="lat" type="xsd:string"/> <xsd:attribute name="lon" type="xsd:string"/> <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="wayType"> <xsd:sequence> <xsd:element name="nd" type="ndType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="relationType"> <xsd:sequence> <xsd:element name="member" type="memberType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> </xsd:complexType> <!-- The fourth level elements and their contents --> <xsd:complexType name="tagType"> <xsd:attribute name="k" type="xsd:string"/> <xsd:attribute name="v" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="ndType"> <xsd:attribute name="ref" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="memberType"> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="ref" type="xsd:string"/> <xsd:attribute name="role" type="xsd:string"/> </xsd:complexType> </xsd:schema> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/xml/routino-tagging.xsd��������������������������������������������������������������� 644 � 233 � 144 � 10176 12156135452 13056� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!-- ============================================================ An XML Schema Definition for the Routino tagging rules XML format Part of the Routino routing software. ============================================================ This file Copyright 2010-2013 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ============================================================ --> <xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- The top level Routino tagging rules --> <xsd:element name="routino-tagging" type="RoutinoTaggingType"/> <xsd:complexType name="RoutinoTaggingType"> <xsd:sequence> <xsd:element name="node" type="NodeType"/> <xsd:element name="way" type="WayType"/> <xsd:element name="relation" type="RelationType"/> </xsd:sequence> </xsd:complexType> <!-- The second level node, way and relation tagging rules --> <xsd:complexType name="NodeType"> <xsd:sequence> <xsd:element name="if" type="IfType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="ifnot" type="IfNotType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="WayType"> <xsd:sequence> <xsd:element name="if" type="IfType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="ifnot" type="IfNotType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="RelationType"> <xsd:sequence> <xsd:element name="if" type="IfType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="ifnot" type="IfNotType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <!-- The if tag and its contents --> <xsd:complexType name="IfType"> <xsd:sequence> <xsd:element name="if" type="IfType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="ifnot" type="IfNotType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="set" type="SetType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="unset" type="UnsetType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="output" type="OutputType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="logerror" type="LogErrorType" minOccurs="0" maxOccurs="1"/> </xsd:sequence> <xsd:attribute name="k" type="xsd:string"/> <xsd:attribute name="v" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="IfNotType"> <xsd:sequence> <xsd:element name="if" type="IfType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="ifnot" type="IfNotType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="set" type="SetType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="unset" type="UnsetType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="output" type="OutputType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="logerror" type="LogErrorType" minOccurs="0" maxOccurs="1"/> </xsd:sequence> <xsd:attribute name="k" type="xsd:string"/> <xsd:attribute name="v" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="SetType"> <xsd:attribute name="k" type="xsd:string"/> <xsd:attribute name="v" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="UnsetType"> <xsd:attribute name="k" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="OutputType"> <xsd:attribute name="k" type="xsd:string"/> <xsd:attribute name="v" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="LogErrorType"> <xsd:attribute name="k" type="xsd:string"/> <xsd:attribute name="v" type="xsd:string"/> <xsd:attribute name="message" type="xsd:string"/> </xsd:complexType> </xsd:schema> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/xml/Makefile�������������������������������������������������������������������������� 644 � 233 � 144 � 3725 12531654133 10642� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# XML directory Makefile # # Part of the Routino routing software. # # This file Copyright 2010-2015 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # All configuration is in the top-level Makefile.conf include ../Makefile.conf # Files to install STANDARD_FILES=profiles.xml \ translations.xml \ tagging.xml SPECIAL_FILES=tagging-drive.xml \ tagging-ride.xml \ tagging-walk.xml ######## all: $(SPECIAL_FILES) #### tagging-drive.xml : routino-tagging.xml scripts/drive.pl perl scripts/drive.pl < routino-tagging.xml > tagging-drive.xml tagging-ride.xml : routino-tagging.xml scripts/ride.pl perl scripts/ride.pl < routino-tagging.xml > tagging-ride.xml tagging-walk.xml : routino-tagging.xml scripts/walk.pl perl scripts/walk.pl < routino-tagging.xml > tagging-walk.xml ######## test: ######## install: all @[ -d $(DESTDIR)$(datadir) ] || mkdir -p $(DESTDIR)$(datadir) @for file in $(STANDARD_FILES) ; do \ echo cp routino-$$file $(DESTDIR)$(datadir)/$$file ;\ cp -f routino-$$file $(DESTDIR)$(datadir)/$$file ;\ done @for file in $(SPECIAL_FILES); do \ echo cp $$file $(DESTDIR)$(datadir)/$$file ;\ cp -f $$file $(DESTDIR)$(datadir)/$$file ;\ done ######## clean: rm -f *~ rm -f $(SPECIAL_FILES) ######## distclean: clean ######## .PHONY:: all test install clean distclean �������������������������������������������routino-3.4.3/xml/routino-osm.xsd������������������������������������������������������������������� 644 � 233 � 144 � 13477 12051504736 12242� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8" ?> <!-- ============================================================ An XML Schema Definition for the part of the OSM XML format read by Routino. Part of the Routino routing software (semi-automatically converted to create osmparse.c). ============================================================ This file Copyright 2010-2012 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ============================================================ --> <xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- The top level osm element --> <xsd:element name="osm" type="osmType"/> <xsd:complexType name="osmType"> <xsd:sequence> <xsd:element name="bounds" type="boundsType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="bound" type="boundType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="changeset" type="changesetType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="node" type="nodeType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="way" type="wayType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="relation" type="relationType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="version" type="xsd:string"/> <!-- <xsd:attribute name="generator" type="xsd:string"/> --> </xsd:complexType> <!-- The second level bounds, bound, changeset, node, way and relation elements --> <xsd:complexType name="boundsType"> <!-- <xsd:attribute name="minlat" type="xsd:string"/> <xsd:attribute name="minlon" type="xsd:string"/> <xsd:attribute name="maxlat" type="xsd:string"/> <xsd:attribute name="maxlon" type="xsd:string"/> <xsd:attribute name="origin" type="xsd:string"/> --> </xsd:complexType> <xsd:complexType name="boundType"> <!-- <xsd:attribute name="box" type="xsd:string"/> <xsd:attribute name="origin" type="xsd:string"/> --> </xsd:complexType> <xsd:complexType name="changesetType"> <xsd:sequence> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <!-- <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="min_lat" type="xsd:string"/> <xsd:attribute name="min_lon" type="xsd:string"/> <xsd:attribute name="max_lat" type="xsd:string"/> <xsd:attribute name="max_lon" type="xsd:string"/> <xsd:attribute name="created_at" type="xsd:string"/> <xsd:attribute name="closed_at" type="xsd:string"/> <xsd:attribute name="open" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> --> </xsd:complexType> <xsd:complexType name="nodeType"> <xsd:sequence> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="lat" type="xsd:string"/> <xsd:attribute name="lon" type="xsd:string"/> <!-- <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> --> </xsd:complexType> <xsd:complexType name="wayType"> <xsd:sequence> <xsd:element name="nd" type="ndType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <!-- <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> --> </xsd:complexType> <xsd:complexType name="relationType"> <xsd:sequence> <xsd:element name="member" type="memberType" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="tag" type="tagType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string"/> <!-- <xsd:attribute name="timestamp" type="xsd:string"/> <xsd:attribute name="uid" type="xsd:string"/> <xsd:attribute name="user" type="xsd:string"/> <xsd:attribute name="visible" type="xsd:string"/> <xsd:attribute name="version" type="xsd:string"/> <xsd:attribute name="changeset" type="xsd:string"/> <xsd:attribute name="action" type="xsd:string"/> --> </xsd:complexType> <!-- The third level elements and their contents --> <xsd:complexType name="tagType"> <xsd:attribute name="k" type="xsd:string"/> <xsd:attribute name="v" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="ndType"> <xsd:attribute name="ref" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="memberType"> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="ref" type="xsd:string"/> <xsd:attribute name="role" type="xsd:string"/> </xsd:complexType> </xsd:schema> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/xml/routino-tagging-nomodify.xml������������������������������������������������������ 644 � 233 � 144 � 2736 11663245320 14663� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?> <!-- ============================================================ An XML format file containing Routino tagging rules - copy the input file directly to the output with no modifications (e.g. importing a file dumped by filedumper). Part of the Routino routing software. ============================================================ This file Copyright 2010, 2011 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ============================================================ --> <routino-tagging xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.routino.org/xml/routino-tagging.xsd"> <!-- - - - - - - - - - - Node rules - - - - - - - - - - --> <node> <!-- Copy everything from input to output --> <if> <output /> </if> </node> <!-- - - - - - - - - - - Way rules - - - - - - - - - - --> <way> <!-- Copy everything from input to output --> <if> <output /> </if> </way> <!-- - - - - - - - - - - Relation rules - - - - - - - - - - --> <relation> <!-- Copy everything from input to output --> <if> <output /> </if> </relation> </routino-tagging> ����������������������������������routino-3.4.3/ChangeLog����������������������������������������������������������������������������� 644 � 233 � 144 � 1321117 15003124672 10230� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������2025-04-26 Andrew M. Bishop <amb> Version 3.4.3 released. 2025-04-26 [r2207] Andrew M. Bishop <amb> * doc/html/readme.html: Fix typo in release notes. 2025-04-26 [r2205] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html, src/version.h: Update to version 3.4.3. 2025-04-09 [r2203] Andrew M. Bishop <amb> * src/files.c, src/files.h, src/sorting.c: Merge the "filebuffer" and "openedfile" data structures. Add a new function for deleting an open buffered file. Improve the new logassert messages to print the filename. 2025-04-08 [r2202] Andrew M. Bishop <amb> * src/files.c: Allocate the string for the filename of the mapped files. Don't allocate a filebuffer structure for mapped files. 2025-04-06 [r2201] Andrew M. Bishop <amb> * src/files.c: Print an error message and exit if read/write fails. 2025-04-06 [r2200] Andrew M. Bishop <amb> * extras/find-fixme/fixme-finder.c, src/files.c, src/logerror.c, src/planetsplitter.c, src/router.c, src/uncompress.c, src/xml/xsd-to-xmlparser.c: Check and update all exits from the program to make sure that there is consistency in the error messages. Use logassert if it's an internal bug, use fprintf();exit() if it's a user error or program failure to route. 2025-04-06 [r2199] Andrew M. Bishop <amb> * src/nodesx.c, src/relationsx.c, src/waysx.c: Revert part of r2189 and add extra checks on the sizes of node_t, way_t and relation_t with respect to index_t. 2025-04-05 [r2198] Andrew M. Bishop <amb> * src/logging.c, src/logging.h: Create a logassert function that allows a format string (via a pre-processor hack). 2025-04-05 [r2197] Andrew M. Bishop <amb> * src/version.h: Update the version number to make clear it is modified from the release version. 2025-03-29 Andrew M. Bishop <amb> Version 3.4.2 released. 2025-03-29 [r2193] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html, src/version.h: Update to version 3.4.2. 2024-09-18 [r2192] Andrew M. Bishop <amb> * src/output.c: Fix compilation warnings if index_t is changed to a 64-bit type but preserve formatting of fake nodes (shown as negative). 2024-09-18 [r2191] Andrew M. Bishop <amb> * python/setup.py: Add header files as dependencies for the Python module. 2024-09-03 [r2190] Andrew M. Bishop <amb> * src/types.h: Change the lower limit for fake nodes when index_t is a 64-bit number. 2024-09-01 [r2189] Andrew M. Bishop <amb> * src/relationsx.c, src/waysx.c: Change some types and correct some comparisons that cause errors if index_t is changed to a 64-bit type (prompted by patch from a user). 2024-08-29 [r2188] Andrew M. Bishop <amb> * src/files.c, src/output.c, src/router+lib.c, src/routino.c, src/tagging.c: Swap the order of arguments to calloc() function (new gcc warning). 2024-05-27 [r2187] Andrew M. Bishop <amb> * src/optimiser.c: Fix gcc-13 false-positive warning. 2024-03-17 [r2186] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Added more/updated German translations (via http://www.routino.org/translations/). 2024-02-27 [r2185] Andrew M. Bishop <amb> * web/translations/translation.es.txt: Added more Spanish translations (via http://www.routino.org/translations/). 2023-08-29 [r2182-2183] Andrew M. Bishop <amb> * src/osmparser.c: Add new parsers for heights/widths in feet and inches format. * xml/routino-tagging.xml: Update the way tagging, minor changes. 2023-08-28 [r2178-2179] Andrew M. Bishop <amb> * extras/errorlog/summarise-log.pl: Include the first 100 links (rather than none) if there are more than 100 of them. * xml/routino-tagging.xml: Rework the node tagging, only consider barriers as blocking access. Now cycle_barrier defaults to allowing bicycles (unlike the {horse,motorcycle,car}_barrier which block the named transport). 2023-08-26 [r2177] Andrew M. Bishop <amb> * xml/routino-tagging.xml: XML formatting tidy-up (no functional change). 2023-08-25 [r2176] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Always have a 'k' attribute on 'logerror' objects (for clarity). 2023-07-16 [r2173] Andrew M. Bishop <amb> * src/sorting.c: Fix bug with using uninitialised memory - found by valgrind. 2023-07-16 [r2172] Andrew M. Bishop <amb> * src/sorting.c: Refactor the code to put the file merging into a separate function and share it between the two types of sort. 2023-07-15 [r2171] Andrew M. Bishop <amb> * src/sorting.c: Simplify and comment the threading functions. Fix a potential deadlock if the last thread finished before we wait for them. 2023-07-13 [r2170] Andrew M. Bishop <amb> * extras/find-fixme/osmparser.c, src/osmo5mparse.c, src/osmparser.c, src/osmparser.h, src/osmpbfparse.c, src/osmxmlparse.c: Refactor the OSM file parsing to move code from individual file format specific parsers to the shared parser back-end. 2023-07-05 [r2169] Andrew M. Bishop <amb> * src/sorting.c: Create separate functions for thread handling. 2023-07-04 [r2168] Andrew M. Bishop <amb> * src/sorting.c: Merge functions filesort_fixed_heapsort_thread and filesort_vary_heapsort_thread. 2023-07-04 [r2167] Andrew M. Bishop <amb> * src/version.h: Update the version number to show it is from SVN not a release. 2023-07-03 [r2166] Andrew M. Bishop <amb> * src/sorting.c: Review the sorting problems fixed in v4.3.1 and update the code to: * Make it clearer to the reader how it works. * Better at choosing the number of threads to use. * Optimise the data per thread (uses less memory in some cases). * Add optional debug output. * Remove the real cause of the bug in v3.4 (affected only when all the data fitted into RAM with a single thread which is why it only appeared when the default RAM size was increased). 2023-07-01 Andrew M. Bishop <amb> Version 3.4.1 released. 2023-07-01 [r2162] Andrew M. Bishop <amb> * src/sorting.c: Last minute fix for v3.4.1. 2023-07-01 [r2157-2158] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html, src/version.h: Update to version 3.4.1. * src/sorting.c: Fix a bug that was introduced in r2138 (sorting failure in some cases, unclear which but not found in tests of slim mode or when using multiple threads). 2023-06-11 Andrew M. Bishop <amb> Version 3.4 released. 2023-06-11 [r2153] Andrew M. Bishop <amb> * doc/NEWS.txt, doc/html/readme.html: Update to version 3.4. 2023-06-11 [r2152] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.openlayers.js, web/www/routino/visualiser.openlayers.js: Update to OpenLayers 7.4.0. 2023-06-11 [r2151] Andrew M. Bishop <amb> * web/www/leaflet/install.sh, web/www/openlayers/install.sh, web/www/routino/router.openlayers.js: Update to leaflet 1.9.4 and OpenLayers 7.4.0. 2023-06-11 [r2146] Andrew M. Bishop <amb> * doc/README.txt: Update to version 3.4. 2023-06-11 [r2144-2145] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt: Update to version 3.4. * doc/README.txt, doc/html/readme.html, src/version.h: Update to version 3.4. 2023-06-06 [r2141] Andrew M. Bishop <amb> * doc/USAGE.txt, doc/html/usage.html, extras/find-fixme/README.txt, extras/find-fixme/fixme-finder.c, src/planetsplitter.c: Change the default amount of sorting RAM from 64 or 256 MB to 256 or 1024 MB. 2023-06-06 [r2139] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Examine the 'access' tag only for nodes that are barriers. 2023-05-30 [r2138] Andrew M. Bishop <amb> * src/sorting.c: If the number of items to be sorted is small then do not create multiple threads. 2023-05-30 [r2137] Andrew M. Bishop <amb> * src/sorting.c: Delete the file even if there is only one (normally no file is created in this case) because of the rare case where more than one was expected but the second one was not needed. 2023-05-29 [r2136] Andrew M. Bishop <amb> * src/sorting.c: Improve the shortcut if all the data fitted into RAM (1/Nth of the RAM if multi-threaded) so that it is not written to disk at all. 2023-05-29 [r2135] Andrew M. Bishop <amb> * src/sorting.c: Fix a bug (slight data loss) introduced in r2132 when not using multi-threaded sorting. 2023-05-29 [r2134] Andrew M. Bishop <amb> * src/sorting.c: Fix a serious bug (thread deadlock) introduced in r2131 when using multi-threaded sorting on certain workloads. 2023-05-24 [r2133] Andrew M. Bishop <amb> * src/segmentsx.c: Fix error with logging about the number of duplicated segments. 2023-05-08 [r2132] Andrew M. Bishop <amb> * src/sorting.c: Remove the mutex around the file writing (but not the opening and closing) so that threads can write in parallel. 2023-05-08 [r2131] Andrew M. Bishop <amb> * src/sorting.c: With multi-threaded sorting allow all N sorting threads to run at once not just N-1 sorting threads and the pre function in the main thread (the new code assumes the pre function is quicker than the sorting, the old code assumed the opposite). 2023-05-08 [r2130] Andrew M. Bishop <amb> * doc/DATALIFE.txt: Add a missing function and explain why ProcessErrorLogs appears twice. 2023-05-08 [r2129] Andrew M. Bishop <amb> * doc/DATALIFE.txt: Add missing entry. 2023-05-08 [r2128] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h: Merge ProcessSegments into SortSegmentList (avoids writing the data to disk and them immediately reading it all in again). 2023-05-08 [r2127] Andrew M. Bishop <amb> * doc/DATALIFE.txt: Add new columns for reading and writing the data files. 2023-03-18 [r2125] Andrew M. Bishop <amb> * python/Makefile, python/pyproject.toml (added): Do not try to install the Python module when running 'make install' but write a warning message explaining why and offering suggestions. Add a pyproject.toml file. 2023-02-13 [r2124] Andrew M. Bishop <amb> * web/translations/translation.es.txt: Updated Spanish translations (via http://www.routino.org/translations/). 2022-08-09 [r2123] Andrew M. Bishop <amb> * doc/INSTALL.txt: Fix name of default Apache configuration file. 2022-08-09 [r2122] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Add platforms (railway=platform or public_transport=platform) as highways (equivalent to a path). 2022-07-11 [r2121] Andrew M. Bishop <amb> * web/translations/translation.sk.txt: Updated Slovak translations (via http://www.routino.org/translations/). 2022-07-10 [r2113-2114] Andrew M. Bishop <amb> * web/www/routino: Ignore files that should not have been checked in. * web/www/routino/router.html.sk (removed), web/www/routino/visualiser.html.sk (removed): Remove files that should not have been checked in. 2022-07-10 [r2112] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Don't route through barriers (fence, wall etc) that are explicitly tagged on a node. Add a few more barrier types. 2022-07-10 [2111] Andrew M. Bishop <amb> * doc/html/style.css: Update style sheet for the documentation. 2022-07-10 [r2110] Andrew M. Bishop <amb> * src/relationsx.c, src/waysx.c: Drop data and log an error rather than exit if a way or relation contains too much data. 2022-07-10 [r2109] Andrew M. Bishop <amb> * web/translations/translation.sk.txt, web/www/routino/router.html.sk, web/www/routino/visualiser.html.sk: Updated Slovak translations (via http://www.routino.org/translations/). 2022-07-02 [r2108] Andrew M. Bishop <amb> * web/translations/translation.sk.txt, web/www/routino/router.html.sk, web/www/routino/visualiser.html.sk, xml/routino-translations.xml: Updated Slovak translations (via http://www.routino.org/translations/). 2022-06-24 [r2107] Andrew M. Bishop <amb> * web/translations/translation.sk.txt (added), web/www/routino/router.html.sk (added), web/www/routino/visualiser.html.sk (added), xml/routino-translations.xml: Added Slovak translation (via http://www.routino.org/translations/). 2022-05-21 [r2106] Andrew M. Bishop <amb> * src/nodesx.c: When not running in slim mode use the OSM node number rather than the database node number for determining whether a node is used by a way. Huge speed improvement for large databases. 2022-05-21 [r2105] Andrew M. Bishop <amb> * src/nodesx.c, src/prunex.c, src/segmentsx.c, src/superx.c, src/typesx.h: Use 64-bit integers as the base type for the BitMask type. Simplify some of the BitMask macros. 2022-05-21 [r2104] Andrew M. Bishop <amb> * extras/plot-time/README.txt, extras/plot-time/plot-planetsplitter-memory.pl (added), extras/plot-time/plot-planetsplitter-time.pl: Add another script to plot the amount of memory used. 2022-05-21 [r2103] Andrew M. Bishop <amb> * extras/plot-time/plot-planetsplitter-time.pl: Fix bugs in processing (change to end error message, ignore memory usage). 2022-05-19 [r2102] Andrew M. Bishop <amb> * python/setup.py: Change from distutils to setuptools for building Python modules. 2022-02-20 [r2101] Andrew M. Bishop <amb> * web/translations/translation.fr.txt: More French translations (via http://www.routino.org/translations/). 2022-01-08 [r2097] Andrew M. Bishop <amb> * src/errorlogx.c: Avoid infinite recursion if a route relation with no nodes or ways contains other similar relations including itself. 2021-10-09 [r2096] Andrew M. Bishop <amb> * web/translations/translation.pl.txt, xml/routino-translations.xml: More Polish translations (via http://www.routino.org/translations/). 2021-05-18 [r2094-2095] Andrew M. Bishop <amb> * web/translations/translation.fr.txt: Updated French translations (via http://www.routino.org/translations/). * src/version.h: Update version so that we know it is from SVN. 2020-12-30 Andrew M. Bishop <amb> Version 3.3.3 released. 2020-12-30 [r2092] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html, src/version.h: Updated for version 3.3.3 release. 2020-12-30 [r2090-2091] Andrew M. Bishop <amb> * web/translations/translation.fi.txt (added), web/www/routino, xml/routino-translations.xml: Added Finnish translation. 2020-12-13 [r2089] Andrew M. Bishop <amb> * doc/TAGGING.txt, doc/html/tagging.html: Add a note clarifying the setting of highway properties when processing tags. 2020-12-13 [r2089] Andrew M. Bishop <amb> * doc/TAGGING.txt, doc/html/tagging.html: Add a note clarifying the setting of highway properties when processing tags. 2020-11-22 [r2087] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.openlayers2.js: Include some margin around the markers when zooming (particularly a problem for openlayers with non-integer zoom). 2020-11-21 [r2084] Andrew M. Bishop <amb> * doc/CONFIGURATION.txt, doc/html/configuration.html: Make a clarification and fix an error in the configuration file documentation. 2020-11-21 [r2083] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/installation.html, extras/find-fixme/web/www/fixme.leaflet.js, extras/find-fixme/web/www/fixme.openlayers.js, extras/find-fixme/web/www/fixme.openlayers2.js, web/www/leaflet/install.sh, web/www/openlayers/install.sh, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.openlayers2.js, web/www/routino/visualiser.leaflet.js, web/www/routino/visualiser.openlayers.js, web/www/routino/visualiser.openlayers2.js: Test with OpenLayers 6.4.3 and Leaflet 1.7.1. Update install script, install instructions and change javascript to handle differences. 2020-11-17 [r2077] Andrew M. Bishop <amb> * src/errorlog.c, src/nodes.c, src/nodesx.c, src/relations.c, src/relationsx.c, src/waysx.c: Small update to simplify binary search implementations. 2020-11-15 [r2076] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Update tagging rules (based on common UK usage, wiki and taginfo). 2020-11-14 [r2075] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.leaflet.js, extras/find-fixme/web/www/fixme.openlayers.js, extras/find-fixme/web/www/fixme.openlayers2.js, web/www/routino/visualiser.leaflet.js, web/www/routino/visualiser.openlayers.js, web/www/routino/visualiser.openlayers2.js: Update the visualiser/fixme data as you move around the map. 2020-10-13 [r2074] Andrew M. Bishop <amb> * web/translations/translation.cs.txt, xml/routino-translations.xml: Updated Czech translations (via http://www.routino.org/translations/). 2020-10-04 [r2073] Andrew M. Bishop <amb> * web/www/routino/visualiser.leaflet.js, web/www/routino/visualiser.openlayers.js, web/www/routino/visualiser.openlayers2.js: When selecting data to view update the URL and permalink so that it automatically displays the same thing next time. 2020-10-04 [r2072] Andrew M. Bishop <amb> * web/www/routino/router.openlayers.js: Fix error with setting initial map view. 2020-09-06 [r2071] Andrew M. Bishop <amb> * web/translations/translation.nl.txt, xml/routino-translations.xml: Updated Dutch translations (via http://www.routino.org/translations/). 2020-08-17 [r2068-2069] Andrew M. Bishop <amb> * src/routino.c: Fix testing of parameters when calling Routino_LoadDatabase(). * extras/find-fixme/web/www/fixme.leaflet.js, extras/find-fixme/web/www/fixme.openlayers.js, extras/find-fixme/web/www/fixme.openlayers2.js, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.openlayers2.js, web/www/routino/visualiser.leaflet.js, web/www/routino/visualiser.openlayers.js, web/www/routino/visualiser.openlayers2.js: Update the URL when new waypoints are added etc. 2020-08-13 [r2067] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.leaflet.js, extras/find-fixme/web/www/fixme.openlayers.js, extras/find-fixme/web/www/fixme.openlayers2.js, web/www/routino/maploader.js, web/www/routino/mapprops.js, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.openlayers2.js, web/www/routino/visualiser.leaflet.js, web/www/routino/visualiser.openlayers.js, web/www/routino/visualiser.openlayers2.js: Allow multiple map libraries to be used with the web pages and select between them with a URL argument. 2020-08-10 [r2064] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.openlayers2.js, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.openlayers2.js, web/www/routino/visualiser.openlayers2.js: Fix errors when zooming to the markers from the URL for openlayers. 2020-08-09 [r2063] Andrew M. Bishop <amb> * src/Makefile, src/filedumper.c, src/filedumperx.c: Merge changes from destination access branch [improvements to filedumper & filedumperx]. 2020-08-09 [r2062] Andrew M. Bishop <amb> (from 'branches/destination-access') * src/Makefile, src/filedumperx.c: Make the output of filedumperx more user-friendly. 2020-08-09 [r2061] Andrew M. Bishop <amb> (from 'branches/destination-access') * src/filedumper.c: Add more hex digits when printing out the access and highway values. 2020-08-09 [r2060] Andrew M. Bishop <amb> (from 'branches/destination-access') * src/filedumperx.c: Add more hex digits when printing out the access and highway values. 2020-08-08 [r2058] Andrew M. Bishop <amb> * Makefile.conf, doc/INSTALL.txt, doc/html/installation.html, extras/find-fixme/Makefile, extras/statistics/Makefile, extras/tagmodifier/Makefile: Add options to the makefiles to compile for code coverage or profiling. 2020-08-05 [r2055] Andrew M. Bishop <amb> * src/nodesx.c, src/waysx.c: Ensure that empty spaces in files are filled with zero values (to simplify regression testing). 2020-08-03 [r2054] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.openlayers2.js: Fix zooming to markers in URL if there are none or just one. 2020-08-03 [r2053] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.openlayers2.js: Improve the setting / clearing of the cookie for the home location. 2020-08-03 [r2052] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.openlayers2.js, web/www/routino/visualiser.leaflet.js, web/www/routino/visualiser.openlayers.js, web/www/routino/visualiser.openlayers2.js: If on a web page that has a language specific extension then make sure that the links between the router and visualiser also use that extension. 2020-07-31 [r2051] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.openlayers2.js: Zoom to the visible markers when initialising the form from the URL if there was no lat/long/zoom specified in the URL itself. 2020-07-14 [r2049] Andrew M. Bishop <amb> * doc/USAGE.txt, doc/html/usage.html: Updated documentation due to an error for planetsplitter "--tagging" option. 2020-07-08 [r2048] Andrew M. Bishop <amb> * web/translations/translation.de.txt: More German translations (via http://www.routino.org/translations/). 2020-05-15 [r2047] Andrew M. Bishop <amb> * src/routino.c: Catch NULL pointers being passed into the library functions. 2020-05-15 [r2046] Andrew M. Bishop <amb> * python/src/router.i: Bug fix for supporting the progress callback function. 2020-05-14 [r2045] Andrew M. Bishop <amb> * python/router.py, python/src/router.i: Support the use of the progress callback function in the Python routino.CalculateRoute() function. 2020-04-19 [r2043] Andrew M. Bishop <amb> * web/www/routino/router.openlayers2.js: Fix indentation. 2020-04-19 [r2042] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.leaflet.js, extras/find-fixme/web/www/fixme.openlayers.js, extras/find-fixme/web/www/fixme.openlayers2.js: Compare Javascript files and merge best features into each other. Fix error with handling of mapprops.browseurl. 2020-04-18 [r2041] Andrew M. Bishop <amb> * web/www/routino/visualiser.leaflet.js, web/www/routino/visualiser.openlayers.js, web/www/routino/visualiser.openlayers2.js: Fix error with handling of mapprops.browseurl. 2020-04-18 [r2040] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.openlayers2.js, web/www/routino/visualiser.leaflet.js, web/www/routino/visualiser.openlayers2.js: Compare Javascript files and merge best features into each other. 2020-04-07 [r2038-2039] Andrew M. Bishop <amb> * xml/routino-translations.xml: More Russian translations (via http://www.routino.org/translations/). * web/translations/translation.ru.txt: More Russian translations (via http://www.routino.org/translations/). 2019-12-20 [r2037] Andrew M. Bishop <amb> * web/translations/translation.de.txt: More German translations (via http://www.routino.org/translations/). 2019-11-03 [r2036] Andrew M. Bishop <amb> * src/errorlogx.c: Ensure that we do not try memory mapping a zero length file. 2019-10-14 [r2035] Andrew M. Bishop <amb> * src/waysx.c: Remove unnecessary modification of way id. 2019-10-13 [r2034] Andrew M. Bishop <amb> * doc/DATALIFE.txt: Correct an error in latest change. 2019-10-10 [r2033] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/errorlogx.c, src/nodesx.c, src/nodesx.h, src/relationsx.c, src/relationsx.h, src/segmentsx.c, src/waysx.c, src/waysx.h: Reduce memory consumption by writing the index to a file and mapping it in to memory rather than allocating large amounts of memory. 2019-09-22 [r2032] Andrew M. Bishop <amb> * python/Makefile: Include the DESTDIR flag when calling setup.py to install. 2019-09-22 [r2031] Andrew M. Bishop <amb> * python/Makefile: Avoid setting LDFLAGS in the environment when calling setup.py. 2019-09-21 [r2030] Andrew M. Bishop <amb> * python/Makefile: Avoid setting CFLAGS in the environment when calling setup.py. 2019-09-20 [r2029] Andrew M. Bishop <amb> * src/version.h: Change the version number so that compiling from SVN has a different version than from using a release version. 2019-09-18 Andrew M. Bishop <amb> Version 3.3.2 released. 2019-09-18 [r2025] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html, src/version.h: Update for version 3.3.2 release. 2019-09-09 [r2023] Andrew M. Bishop <amb> * python/Makefile: Fix parallel compilation in the 'python' directory. 2019-09-08 Andrew M. Bishop <amb> Version 3.3.1 released. 2019-09-08 [r2019] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html: Update for version 3.3.1 release. 2019-09-08 [r2017-2018] Andrew M. Bishop <amb> * python/Makefile: Make sure that 'make clean' deletes all files generated by swig. * python/README.txt: Correct tiny mistake in documentation formatting. 2019-09-07 Andrew M. Bishop <amb> Version 3.3 released. 2019-09-07 [r2013] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html: Update for version 3.3 release. 2019-09-07 [r2012] Andrew M. Bishop <amb> * web/translations/translation.cs.txt (added), web/www/routino, xml/routino-translations.xml: Added an incomplete Czech translation. 2019-09-01 [r2010] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/README.txt, doc/html/installation.html, doc/html/readme.html: Update Openlayers version 2 URL. 2019-08-31 [r2005-2007] Andrew M. Bishop <amb> * web/www/routino/maplayout.css: Include the CSS fix for the current and previous Leaflet versions (merge of latest and previous versions of this file). * extras/find-fixme/web/www/fixme.leaflet.js, extras/find-fixme/web/www/fixme.openlayers2.js, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers2.js, web/www/routino/visualiser.leaflet.js, web/www/routino/visualiser.openlayers2.js: Update Leaflet and OpenLayers v2 scripts based on improvements made in the new OpenLayers scripts. * doc/INSTALL.txt, doc/html/installation.html, extras/find-fixme/web/www/fixme.openlayers.js (added), web/www/openlayers (added), web/www/openlayers/install.sh (added), web/www/routino/maploader.js, web/www/routino/mapprops.js, web/www/routino/router.openlayers.js (added), web/www/routino/visualiser.openlayers.js (added): Add support for the latest version of OpenLayers (version 5.x) library as well as the older, incompatible, version. 2019-08-31 [r2004] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/installation.html, extras/find-fixme/web/www/fixme.openlayers.js (removed), extras/find-fixme/web/www/fixme.openlayers2.js (added), web/www/openlayers (removed), web/www/openlayers2 (added), web/www/routino/maploader.js, web/www/routino/mapprops.js, web/www/routino/router.openlayers.js (removed), web/www/routino/router.openlayers2.js (added), web/www/routino/visualiser.openlayers.js (removed), web/www/routino/visualiser.openlayers2.js (added): Rename the "openlayers" version of the web pages to "openlayers2" to accurately reflect that they use the older OpenLayers version 2.x library rather than the current, incompatible, version. 2019-08-03 [r2003] Andrew M. Bishop <amb> * web/www/routino/maplayout.css: Fix for updated version of Leaflet. 2019-08-02 [r2002] Andrew M. Bishop <amb> * web/www/leaflet/install.sh: Update script to install latest version of Leaflet. 2019-07-28 [r2001] Andrew M. Bishop <amb> * src/logging.c: Increase the number of digits allocated for elapsed time and allocated memory when logging that information. 2019-07-27 [r1999] Andrew M. Bishop <amb> * src/errorlogx.c, src/logging.c, src/logging.h, src/nodesx.c, src/prunex.c, src/relationsx.c, src/segmentsx.c, src/sorting.c, src/superx.c, src/typesx.h, src/waysx.c: Add more checking of memory allocation success/failure by combining the allocation and the assert into one function. 2019-05-01 [r1995-1996] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Disallow access to highways tagged with "access=destination" or "access=customer", the "routino-destination" branch allows them instead. * xml/routino-tagging.xml: Move some tag rules around so that access denied by "motor_vehicles=no" overrides access allowed by "designation=byway_open_to_all_traffic". 2019-04-25 [r1994] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.leaflet.js, extras/find-fixme/web/www/fixme.openlayers.js: Fix bug with regexp generating link to node/way/relation on openstreetmap.org. 2019-04-17 [r1991] Andrew M. Bishop <amb> * src/waysx.c: Rename some structure members and function names to reflect more clearly their meaaning (mostly change "allow" to "transport"). No changes to file formats or API. 2019-04-17 [r1989] Andrew M. Bishop <amb> * src/filedumper.c, src/nodes.c, src/optimiser.c, src/output.c, src/profiles.c, src/profiles.h, src/prunex.c, src/routino.c, src/segments.c, src/types.c, src/types.h, src/ways.h, src/waysx.c, src/waysx.h: Rename some structure members and function names to reflect more clearly their meaning (mostly change "allow" to "transport"). No changes to file formats or API. 2019-04-13 [r1988] Andrew M. Bishop <amb> * src/sorting.c: Ensure that data pointers are correctly aligned - found by gcc's runtime sanitizer (make SANITIZE=1 test). 2019-04-13 [r1987] Andrew M. Bishop <amb> * src/errorlogx.h: Revert change to this file because it broke binary compatibility with version 3.2 output files. 2019-04-13 [r1986] Andrew M. Bishop <amb> * src/sorting.c: Ensure that data pointers are correctly aligned - found by gcc's runtime sanitizer (make SANITIZE=1 test). 2019-04-12 [r1985] Andrew M. Bishop <amb> * src/errorlogx.h, src/files.h, src/sorting.c: Fix some integer type usage (in relation to offset_t and size_t). 2019-04-07 [r1983] Andrew M. Bishop <amb> * src/sorting.c: Ensure that data pointers are correctly aligned - found by gcc's runtime sanitizer (make SANITIZE=1 test). 2019-04-07 [r1980-1982] Andrew M. Bishop <amb> * src/test/run-one-test.sh, src/test/sanitizer-suppressions.txt (added): Suppress some warnings to stop gcc's runtime sanitizer complaining (make SANITIZE=1 test). * src/osmo5mparse.c: Initialise some variables to stop gcc's runtime sanitizer complaining (make SANITIZE=1 test). * src/translations.c, src/ways.c, src/xml/xsd-to-xmlparser.c: Free some memory to avoid leaks - found by running with gcc's runtime sanitizer enabled (make SANITIZE=1 test). 2019-04-06 [r1979] Andrew M. Bishop <amb> * src/errorlogx.c: Make the looking up of error latitude/longitude more robust (don't trying looking up if there was no node/way/relation to look for). 2019-04-06 [r1978] Andrew M. Bishop <amb> * src/nodesx.h: Copy the improved comments from the "destination" branch. 2019-03-31 [r1975] Andrew M. Bishop <amb> * src/relationsx.c: Do not store the nodes as part of route relations (but keep the file format compatible with the previous one). 2019-03-31 [r1974] Andrew M. Bishop <amb> * src/relationsx.c, src/sorting.h, src/waysx.c: Change some generic integer types (unsigned short, int, unsigned long) to specific integer types (uint16_t, uint_32_t and uint64_t). 2019-03-19 [r1972] Andrew M. Bishop <amb> * src/optimiser.c: Fix bug with routes starting facing a dead-end taking far too long to realise this (due to routing forward and reverse at the same time). 2019-03-14 [r1970] Andrew M. Bishop <amb> * doc/TAGGING.txt, doc/html/tagging.html, xml/routino-tagging.xml: Add heuristics for deciding what transport types are allowed on a ferry (based on patch from Melvin Vermeeren). 2019-03-13 [r1968] Andrew M. Bishop <amb> * src/errorlog.c, src/nodes.c, src/nodesx.c, src/relations.c, src/relationsx.c, src/waysx.c: Change binary search algorithm to avoid index_t arithmetic overflow. 2018-11-19 [r1967] Andrew M. Bishop <amb> * python/setup.py, python/test/run-one-test.sh: Update some comments. 2018-11-14 [r1966] Andrew M. Bishop <amb> * Makefile.conf, python/Makefile, python/README.txt, python/database.py (added), python/setup.py, python/src/database.cc (added), python/src/database.hh (added), python/src/database.i (added), python/test/Makefile, python/test/run-all-tests.sh (removed), python/test/run-database-tests.sh (added), python/test/run-router-tests.sh (added): Add a Python3 module to access the data in the Routino database. 2018-11-08 [r1965] Andrew M. Bishop <amb> * src/filedumper.c: Bug fix with filedumper program dumping plain text version of a relation. 2018-10-31 [r1964] Andrew M. Bishop <amb> * Makefile, python/Makefile, python/README.txt, python/test/Makefile: Add the python directory to the top level list. Print a warning if Python or Swig are not installed. Make sure that running 'make' or 'make test' in the python directory compiles the library and runs the main tests first. 2018-10-30 [r1963] Andrew M. Bishop <amb> * Makefile.conf, extras/find-fixme/Makefile, extras/statistics/Makefile, extras/tagmodifier/Makefile, src/Makefile: Indent Makefiles. 2018-10-26 [r1962] Andrew M. Bishop <amb> * python (added), python/Makefile (added), python/README.txt (added), python/router.py (added), python/setup.py (added), python/src (added), python/src/__init__.py (added), python/src/router.i (added), python/test (added), python/test/Makefile (added), python/test/run-all-tests.sh (added), python/test/run-one-test.sh (added): Add a Python3 module that can access the Routino database and calculate routes. Not compiled by default at the moment. 2018-10-26 [r1961] Andrew M. Bishop <amb> * src/test, src/test/Makefile, src/test/a-b-c-d.sh, src/test/a-b-c.sh, src/test/a-b.sh, src/test/cycle-drive.sh, src/test/loop-and-reverse.sh, src/test/only-split.sh, src/test/run-all-tests.sh (added), src/test/run-one-test.sh (added), src/test/run-tests.sh (removed), src/test/start-1-finish.sh: Update the routing test scripts (refactor them, no change in the tests themselves). 2018-10-24 [r1960] Andrew M. Bishop <amb> * Makefile.conf: Refer to 'clang' compiler by generic name and not a specific version. 2018-10-23 [r1959] Andrew M. Bishop <amb> * src/relationsx.c, src/sorting.h, src/waysx.c: Add extra checks to ensure that the FILESORT_VARINT integer type does not overflow. 2018-09-25 [r1958] Andrew M. Bishop <amb> * src/router+lib.c, src/router.c: Update some error messages for consistency. 2018-09-21 [r1955-1956] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Use the 'prow_ref' tag instead of the 'ref' tag if it exists and 'ref' does not. * xml/routino-tagging.xml: Add some more access tags after reviewing errors from data processing. 2018-09-16 [r1954] Andrew M. Bishop <amb> * src/osmparser.c: Add new parsing error message (turn relations with multiple 'via). 2018-09-16 [r1952-1953] Andrew M. Bishop <amb> * extras/errorlog/summarise-log.pl, src/osmparser.c, src/relationsx.c: Add new parsing error messages (turn relations with multiple 'from' or 'to'), improve the formatting of the existing ones and improve the HTML log summary creation. * extras/statistics/update.sh: Fix error with bogus path in script. 2018-08-09 [r1951] Andrew M. Bishop <amb> * extras/README.txt: Update information about extra programs. 2018-07-28 [r1950] Andrew M. Bishop <amb> * extras/find-fixme/fixme-dumper.c, src/filedumper.c: Fix two warnings found by gcc-8. 2018-06-15 [r1949] Andrew M. Bishop <amb> * web/translations/router.html, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Initialise the router map web page with the search form for locations rather than coordinates. Dragging a marker to the map converts it to coordinates. 2018-06-15 [r1948] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Enable the search buttons if two markers are placed by searching for a named location. 2018-04-23 [r1947] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/installation.html: An extra Perl module needs to be required with new Perl versions. 2018-02-07 [r1946] Andrew M. Bishop <amb> * web/translations/translation.de.txt, web/translations/translation.es.txt, web/translations/translation.ru.txt: Remove whitespace at the ends of lines. 2018-02-07 [r1945] Andrew M. Bishop <amb> * web/translations/translation.es.txt: Spanish translations updated (via http://www.routino.org/translations/). 2018-01-13 [r1944] Andrew M. Bishop <amb> * web/translations/translation.de.txt: More German translations (via http://www.routino.org/translations/). 2017-11-01 [r1943] Andrew M. Bishop <amb> * src/sorting.c: Bug fix for race condition in multi-threaded sorting algorithm. 2017-10-18 [r1942] Andrew M. Bishop <amb> * web/translations/translation.hu.txt, xml/routino-translations.xml: Hungarian translations updated (via http://www.routino.org/translations/). 2017-10-10 [r1941] Andrew M. Bishop <amb> * web/translations/translation.hu.txt: Final set of Hungarian translations added, now complete (via http://www.routino.org/translations/). 2017-10-09 [r1940] Andrew M. Bishop <amb> * web/translations/translation.hu.txt: More Hungarian translations added (via http://www.routino.org/translations/). 2017-10-05 [r1939] Andrew M. Bishop <amb> * web/translations/translation.hu.txt: More Hungarian translations added (via http://www.routino.org/translations/). 2017-10-03 [r1938] Andrew M. Bishop <amb> * web/translations/translation.hu.txt, xml/routino-translations.xml: Completed the Hungarian translation of the XML file and added lots more Hungarian web page translations (all from Gábor Babos). 2017-09-23 [r1936-1937] Andrew M. Bishop <amb> * web/translations/translation.es.txt (added), web/www/routino, xml/routino-translations.xml: Added a Spanish translation of the phrases in the routing outputs. * Makefile.conf, doc/INSTALL.txt, doc/html/installation.html: Add make options to compile with clang instead of gcc, without fast-maths or with the gcc (or clang) sanitizer without editing Makefile.conf. 2017-09-20 [r1935] Andrew M. Bishop <amb> * extras/statistics/dumper.c, src/filedumperx.c, src/logging.h, src/output.c, src/planetsplitter.c, src/queue.c, src/routino.c, src/sorting.c, src/visualiser.c: Remove most of the warnings found by the clang static analyser. 2017-09-20 [r1933-1934] Andrew M. Bishop <amb> * Makefile.conf, src/osmo5mparse.c, src/xmlparse.c: Make it easier to compile with clang instead of gcc (use CLANG=1 option to 'make'). Suppress compiler warnings from clang 5.0. * src/xmlparse.c: Suppress compiler warning from gcc 7.2. 2017-09-17 [r1932] Andrew M. Bishop <amb> * web/translations/translations-head.xml, web/translations/visualiser.html: Update dates in header of generated translation files. 2017-07-17 [r1931] Andrew M. Bishop <amb> * web/translations/translation.fr.txt: Updated French translations (via http://www.routino.org/translations/). 2017-07-12 [r1930] Andrew M. Bishop <amb> * web/translations/translation.it.txt, xml/routino-translations.xml: Updated an Italian translation (via http://www.routino.org/translations/). 2017-07-08 [r1929] Andrew M. Bishop <amb> * web/translations/translation.it.txt: Modified Italian translations (via http://www.routino.org/translations/). 2017-06-29 [r1928] Andrew M. Bishop <amb> * web/translations/translation.it.txt, xml/routino-translations.xml: Updated Italian translations (via http://www.routino.org/translations/). 2017-06-27 [r1927] Andrew M. Bishop <amb> * web/translations/translation.it.txt, xml/routino-translations.xml: More Italian translations (via http://www.routino.org/translations/). 2017-06-25 [r1926] Andrew M. Bishop <amb> * web/translations/translation.it.txt: Modified Italian translations (via http://www.routino.org/translations/). 2017-06-23 [r1925] Andrew M. Bishop <amb> * web/translations/translation.it.txt: More Italian translations (via http://www.routino.org/translations/). 2017-06-21 [r1924] Andrew M. Bishop <amb> * web/translations/translation.it.txt, xml/routino-translations.xml: More Italian translations (via http://www.routino.org/translations/). 2017-06-17 [r1923] Andrew M. Bishop <amb> * web/translations/translation.it.txt (added), web/www/routino, xml/routino-translations.xml: Added an Italian translation (via http://www.routino.org/translations/). 2017-06-16 [r1921-1922] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Added another translated German word (via http://www.routino.org/translations/). * extras/find-fixme/Makefile, extras/statistics/Makefile, extras/tagmodifier/Makefile, src/Makefile, src/xml/Makefile: Change Makefile so that rules cannot fail when a parallel make is run and attempts to create the .deps directory many times in parallel. 2017-06-07 [r1919] Andrew M. Bishop <amb> * src/optimiser.c: Fix bug with route calculation that may not give optimum solution. Forward and reverse routes were not being treated equally. 2017-04-26 [r1918] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Added more translated German phrases (via http://www.routino.org/translations/). 2017-04-15 [r1917] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js: Update Javascript to handle function that has been removed from Leaflet version 1.x. 2017-04-02 [r1916] Andrew M. Bishop <amb> * web/www/leaflet/install.sh: Update to version 1.0.3 of Leaflet. 2017-03-31 [r1914-1915] Andrew M. Bishop <amb> * web/www/routino/router.openlayers.js: Change zoom level when clicking on a point in the route to the same with Openlayers as with Leaflet. * src/queue.c: Change 'int' to 'uint32_t'. 2017-03-29 [r1913] Andrew M. Bishop <amb> * src/queue.c: Log the memory allocated in the queue data structure. 2017-03-29 [r1912] Andrew M. Bishop <amb> * src/results.c: Add a comment explaining the change of hash table. 2017-03-25 [r1911] Andrew M. Bishop <amb> * src/results.c: Bug fix for modified hash - error in resizing array only found with large dataset. 2017-03-25 [r1910] Andrew M. Bishop <amb> * src/results.c, src/results.h: Change the hash table for storing the results from a chained linked list to a simple linear probing method for handling collisions. 2017-03-25 [r1909] Andrew M. Bishop <amb> * src/results.c, src/results.h: Revert the previous change (was: Remove an unused entry from the Results data structure) the special case of ResetResultsList needs the two variables to be separate. 2017-03-25 [r1906-1908] Andrew M. Bishop <amb> * src/results.c, src/results.h: Remove an unused entry from the Results data structure. * src/test/a-b-c-d.sh, src/test/a-b-c.sh, src/test/a-b.sh, src/test/cycle-drive.sh, src/test/loop-and-reverse.sh, src/test/only-split.sh, src/test/run-tests.sh, src/test/start-1-finish.sh: Change the test scripts to make it easier to enable and disable the use of valgrind for all tests. * src/version.h: Update version number to reflect changes from released version. 2017-03-12 Andrew M. Bishop <amb> Version 3.2 released. 2017-03-12 [r1903] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html, src/version.h: Update to version 3.2. 2017-01-12 [r1902] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Added another translated German phrase (via http://www.routino.org/translations/). 2017-01-05 [r1901] Andrew M. Bishop <amb> * web/translations/router.html: Change some HTML to improve web page format when zoomed in or out. 2017-01-04 [r1900] Andrew M. Bishop <amb> * web/www/routino/router.css: Remove some CSS to improve web page format when zoomed in or out. 2016-12-20 [r1899] Andrew M. Bishop <amb> * extras/statistics/dumper.c: Resize the array as crossings are added rather than starting with a "large enough" array. 2016-11-22 [r1898] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Handle more tags like access:foot=* by translating them to foot=*. 2016-09-20 [r1897] Andrew M. Bishop <amb> * web/translations/translation.pl.txt: More Polish translations (via http://www.routino.org/translations/). 2016-09-18 [r1896] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.cgi, web/www/routino/results.cgi, web/www/routino/router.cgi, web/www/routino/router.pl, web/www/routino/search.cgi, web/www/routino/search.pl, web/www/routino/statistics.cgi, web/www/routino/update-profiles.pl, web/www/routino/visualiser.cgi: When using 'require' in Perl scripts for a local file use './' prefix for filename because the current directory is no longer on the include path in new versions. 2016-09-11 [r1895] Andrew M. Bishop <amb> * web/translations/translation.pl.txt, xml/routino-translations.xml: More Polish translations (via http://www.routino.org/translations/). 2016-09-08 [r1894] Andrew M. Bishop <amb> * src/translations.c: Ensure that when a language doesn't have a full set of translations the built-in ones generate valid HTML. 2016-09-08 [r1893] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Ensure that when selecting a new language web-page that this language is used as the default for the generated route (previously it was selected on the web-page but not used). 2016-09-08 [r1892] Andrew M. Bishop <amb> * web/translations/translation.pl.txt, xml/routino-translations.xml: More Polish translations (via http://www.routino.org/translations/). 2016-08-20 [r1891] Andrew M. Bishop <amb> * src/filedumperx.c: Bug fix for error detected by gcc-6. 2016-08-12 [r1890] Andrew M. Bishop <amb> * web/www/routino/mapprops.js: Remove MapQuest as a default tile source since they are no longer available. 2016-07-12 [r1889] Andrew M. Bishop <amb> * src/planetsplitter.c, src/router+lib.c, src/router.c: Improve the error message when the default profiles, translations or tagging files cannot be found. 2016-07-08 [r1888] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/installation.html: Update instructions to reflect that the Apache root directory might not be '/var/www/'. 2016-07-05 [r1887] Andrew M. Bishop <amb> * web/translations/translation.de.txt: More German translations (via http://www.routino.org/translations/). 2016-07-04 [r1886] Andrew M. Bishop <amb> * web/translations/translation.fr.txt, xml/routino-translations.xml: More French translations (via http://www.routino.org/translations/). 2016-06-19 [r1885] Andrew M. Bishop <amb> * src/optimiser.c: Bug fix - if the start and finish of a route segment are the same point and the previous route segment finished with a fake segment then it would crash. 2016-06-06 [r1878-1879] Andrew M. Bishop <amb> * src/test/expected/turns-WP01.txt, src/test/expected/turns-WP02.txt, src/test/expected/turns-WP03.txt, src/test/expected/turns-WP04.txt, src/test/expected/turns-WP05.txt, src/test/expected/turns-WP06.txt, src/test/expected/turns-WP07.txt, src/test/expected/turns-WP08.txt, src/test/expected/turns-WP09.txt, src/test/expected/turns-WP10.txt, src/test/expected/turns-WP11.txt, src/test/expected/turns-WP12.txt, src/test/expected/turns-WP13.txt, src/test/expected/turns-WP14.txt, src/test/expected/turns-WP15.txt: Update test cases after ignoring highways forbidden by turn restrictions when determining which interesting junctions. * src/functions.h, src/output.c, src/router.c, src/routino.c: Ignore highways that are forbidden by turn restrictions when determining which ones are interesting for the HTML format output. 2016-04-07 [r1877] Andrew M. Bishop <amb> * web/translations/router.html, web/www/routino/router.css, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Move the two route buttons to be just below the waypoints so they are less likely to scroll off the screen. Add another pair of route buttons on the results tab to make it quicker to re-calculate a route after moving the waypoints. 2016-03-30 [r1876] Andrew M. Bishop <amb> * web/translations/translation.ru.txt: More Russian translations (via http://www.routino.org/translations/). 2016-03-29 [r1875] Andrew M. Bishop <amb> * web/translations/translation.ru.txt: More Russian translations (via http://www.routino.org/translations/). 2016-03-26 [r1874] Andrew M. Bishop <amb> * web/translations/translation.ru.txt, xml/routino-translations.xml: More Russian translations (via http://www.routino.org/translations/). 2016-03-18 [r1873] Andrew M. Bishop <amb> * web/www/leaflet/install.sh: Update to use the newer version of Leaflet (0.7.7). 2016-03-15 [r1872] Andrew M. Bishop <amb> * src/version.h: Update the version number to note that it includes changes since the latest release. 2016-03-06 Andrew M. Bishop <amb> Version 3.1.1 released. 2016-03-06 [r1869] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html, src/version.h: Update for version 3.1.1 release. 2016-03-05 Andrew M. Bishop <amb> Version 3.1 released. 2016-03-05 [r1866] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html: Update for version 3.1 release. 2016-02-28 [r1865] Andrew M. Bishop <amb> * src/typesx.h: Change node_t to a 64-bit type by default due to the imminent OSM node number overflow with 32-bits. 2016-02-28 [r1865] Andrew M. Bishop <amb> * src/typesx.h: Change node_t to a 64-bit type by default due to the imminent OSM node number overflow with 32-bits. 2016-02-27 [r1864] Andrew M. Bishop <amb> * src/xmlparse.c: Fix an XML parsing bug found by AFL. 2016-02-25 [r1863] Andrew M. Bishop <amb> * Makefile.conf, src/segments.h, src/ways.h: Fix some changes found with gcc sanitizer options. 2016-02-24 [r1857] Andrew M. Bishop <amb> * src/optimiser.c: Change the FindMiddleRoute function so that it routes from both ends towards the middle. This will make it much quicker to detect some cases where a route is impossible but it does slightly slow down normal operation. 2016-02-14 [r1856] Andrew M. Bishop <amb> * extras/statistics (added), extras/statistics/Makefile (added), extras/statistics/README.txt (added), extras/statistics/create-basemap.pl (added), extras/statistics/create-image.pl (added), extras/statistics/dumper.c (added), extras/statistics/update.sh (added): Add scripts that will process the Routino database and generate maps with highway statistics. 2016-02-12 [r1855] Andrew M. Bishop <amb> * extras/find-fixme/Makefile: Use '$(DEPDIR)' rather than '.deps'. 2016-01-05 [r1854] Andrew M. Bishop <amb> * src/profiles.c: Remove a couple of lines of code with a literal type conversion error. Add special checks that neither max_pref or max_speed are zero. 2015-12-30 [r1852-1853] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/installation.html, extras/find-fixme/web/www/.htaccess (added), web/www/routino/.htaccess: Update the instructions about setting up Apache (tested on Apache 2.4.x). * web/translations/translation.de.txt, xml/routino-translations.xml: More German translations (via http://www.routino.org/translations/). 2015-12-24 [r1851] Andrew M. Bishop <amb> * src/optimiser.c: Remove a lookup in the FixForwardRoute function. 2015-12-21 [r1850] Andrew M. Bishop <amb> * xml/routino-profiles.xml: Reduce the preference for service roads when driving. 2015-12-21 [r1849] Andrew M. Bishop <amb> * src/optimiser.c: Add an experimental (commented out) version of the FindMiddleRoute function that finds the route in reverse (starting at the end working back to the beginning). Verified to give equivalent, if not identical, results to the existing function. 2015-12-21 [r1848] Andrew M. Bishop <amb> * src/optimiser.c: Simplify the way that the beginning of the route is inserted into the results. 2015-12-18 [r1847] Andrew M. Bishop <amb> * src/optimiser.c, src/results.h: Change the way that the beginning of the route is used to seed the search for the super-route and then to create the combined route. 2015-12-18 [r1846] Andrew M. Bishop <amb> * src/optimiser.c, src/test/expected/super-or-not-WP01.txt, src/test/expected/super-or-not-WP02.txt, src/test/expected/super-or-not-WP03.txt, src/test/expected/super-or-not-WP04.txt (added), src/test/expected/super-or-not-WP05.txt (added), src/test/super-or-not.osm: Fix a bug where the optimum end of the route was not being used because the search was stopping at the first super-node that was part of another possible end of the route. Add to an existing test case. 2015-12-15 [r1845] Andrew M. Bishop <amb> * src/optimiser.c: Improve the debug output (add debugging information to the FindSuperSegment function). 2015-12-14 [r1844] Andrew M. Bishop <amb> * src/optimiser.c: Improve the debug output (use a common function for all of them and add more information). 2015-12-08 [r1843] Andrew M. Bishop <amb> * src/optimiser.c: Rewrite FindFinishRoutes so that it does not find node-segment pairs pointing in reverse and then reverse them but find normal node-segment pairs working backwards. 2015-12-07 [r1842] Andrew M. Bishop <amb> * src/optimiser.c: Fix bug in last change (FindFinishRoutes is not the same as the other functions). 2015-12-05 [r1835] Andrew M. Bishop <amb> * src/optimiser.c: Rename some variables, move some lines of code around and extract some code into a separate function. Tidying up, no functional change. 2015-12-01 [r1834] Andrew M. Bishop <amb> * web/translations/translation.de.txt: More German translations (via http://www.routino.org/translations/). 2015-11-24 [r1833] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.html: Fix error in non-Javascript version of statistics URL. 2015-10-24 [r1832] Andrew M. Bishop <amb> * src/router.c: Fix routing bug where missing waypoint data still gets routed. 2015-10-24 [r1831] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Store the home location cookie with 5 decimal places. Fix the home marker icon jumping about (Leaflet version). 2015-10-24 [r1830] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Print an error message if the geolocation function fails or is unavailable. 2015-10-17 [r1828] Andrew M. Bishop <amb> * src/routino.c, src/test/loop-and-reverse.sh: Fix test case for loop and reverse and fix libroutino error that wasn't detected by broken test case. 2015-10-12 [r1826-1827] Andrew M. Bishop <amb> * src/test, src/test/expected/loop-and-reverse-WP-L.txt (added), src/test/expected/loop-and-reverse-WP-LR.txt (added), src/test/expected/loop-and-reverse-WP-R.txt (added), src/test/expected/loop-and-reverse-WP.txt (added), src/test/loop-and-reverse.osm (added), src/test/loop-and-reverse.sh (added): Add a test case for the loop and reverse route options. * doc/LIBRARY.txt, doc/html/library.html, src/router+lib.c, src/routino.c, src/routino.h: Add the loop and reverse route options to the library. Increased the API version number. 2015-10-07 [r1824-1825] Andrew M. Bishop <amb> * src/router+lib.c: Fix a bug with the change to handle reverse and loop together. * src/router.c: Simplify the ugly code for handling reverse and loop better - more code, simpler to understand. Calculate all the waypoints first and then use the points. 2015-09-30 [r1823] Andrew M. Bishop <amb> * src/router+lib.c, src/router.c: When using --reverse and --loop together start at the first waypoint specified rather than the last one specified. 2015-09-30 [r1822] Andrew M. Bishop <amb> * web/Makefile: Force the make not to be run in parallel in the web directory. 2015-09-30 [r1821] Andrew M. Bishop <amb> * web/translations/translation.fr.txt, xml/routino-translations.xml: Add new and updated French translations (via http://www.routino.org/translations/). 2015-09-29 [r1820] Andrew M. Bishop <amb> * extras/find-fixme/Makefile, extras/tagmodifier/Makefile, src/xml/Makefile: Re-implement the change to allow using 'make -j 4'. 2015-09-29 [r1819] Andrew M. Bishop <amb> * src/Makefile, web/Makefile: Re-implement the change to allow using 'make -j 4'. 2015-09-28 [r1818] Andrew M. Bishop <amb> * doc/LIBRARY.txt, doc/html/library.html, src/router+lib.c, src/routino.c, src/routino.h: Include the version number of Routino that was used to compile the library into the library as a string variable. 2015-09-28 [r1817] Andrew M. Bishop <amb> * src/router+lib.c, src/router.c: Make router.c and router+lib.c more similar without changing the functionality. 2015-09-26 [r1815-1816] Andrew M. Bishop <amb> * src/test/expected/coincident-waypoint-WP01.txt, src/test/expected/coincident-waypoint-WP02.txt, src/test/expected/coincident-waypoint-WP03.txt, src/test/expected/coincident-waypoint-WP04.txt, src/test/expected/cycle-both-ways-WP01.txt, src/test/expected/cycle-both-ways-WP02.txt, src/test/expected/dead-ends-WP01.txt, src/test/expected/dead-ends-WP02.txt, src/test/expected/dead-ends-WP03.txt, src/test/expected/dead-ends-WP04.txt, src/test/expected/dead-ends-WP05.txt, src/test/expected/dead-ends-WP06.txt, src/test/expected/dead-ends-WP07.txt, src/test/expected/dead-ends-WP08.txt, src/test/expected/dead-ends-WP09.txt, src/test/expected/dead-ends-WP10.txt, src/test/expected/dead-ends-WP11.txt, src/test/expected/fake-node-with-loop-WP01.txt, src/test/expected/fake-node-with-loop-WP02.txt, src/test/expected/loops-WP01.txt, src/test/expected/loops-WP02.txt, src/test/expected/loops-WP03.txt, src/test/expected/loops-WP04.txt, src/test/expected/loops-WP05.txt, src/test/expected/loops-WP06.txt, src/test/expected/loops-WP07.txt, src/test/expected/loops-WP08.txt, src/test/expected/loops-WP09.txt, src/test/expected/loops-WP10.txt, src/test/expected/loops-WP11.txt, src/test/expected/no-super-WP01.txt, src/test/expected/no-super-WP02.txt, src/test/expected/no-super-WP03.txt, src/test/expected/no-super-WP04.txt, src/test/expected/node-restrictions-WP01.txt, src/test/expected/node-restrictions-WP02.txt, src/test/expected/node-restrictions-WP03.txt, src/test/expected/node-restrictions-WP04.txt, src/test/expected/node-restrictions-WP05.txt, src/test/expected/node-restrictions-WP06.txt, src/test/expected/node-restrictions-WP07.txt, src/test/expected/node-restrictions-WP08.txt, src/test/expected/oneway-loop-WP01.txt, src/test/expected/roundabout-waypoints-WP01.txt, src/test/expected/roundabout-waypoints-WP02.txt, src/test/expected/roundabout-waypoints-WP03.txt, src/test/expected/roundabout-waypoints-WP04.txt, src/test/expected/roundabout-waypoints-WP05.txt, src/test/expected/roundabout-waypoints-WP06.txt, src/test/expected/roundabout-waypoints-WP07.txt, src/test/expected/super-or-not-WP01.txt, src/test/expected/super-or-not-WP02.txt, src/test/expected/super-or-not-WP03.txt, src/test/expected/turns-WP01.txt, src/test/expected/turns-WP02.txt, src/test/expected/turns-WP03.txt, src/test/expected/turns-WP04.txt, src/test/expected/turns-WP05.txt, src/test/expected/turns-WP06.txt, src/test/expected/turns-WP07.txt, src/test/expected/turns-WP08.txt, src/test/expected/turns-WP09.txt, src/test/expected/turns-WP10.txt, src/test/expected/turns-WP11.txt, src/test/expected/turns-WP12.txt, src/test/expected/turns-WP13.txt, src/test/expected/turns-WP14.txt, src/test/expected/turns-WP15.txt, src/test/expected/turns-WP16.txt: Change test cases for the changed output formats. * src/output.c, src/translations.c, src/translations.h, web/translations/translation.de.txt, web/translations/translation.en.txt, web/translations/translation.fr.txt, web/translations/translation.hu.txt, web/translations/translation.nl.txt, web/translations/translation.pl.txt, web/translations/translation.ru.txt, web/translations/translations-body.xml, xml/routino-translations.xml: Change file output formats so that waypoint numbers are included. Change the names of the GPX route waypoints in the XML file. 2015-09-26 [r1814] Andrew M. Bishop <amb> * src/Makefile, src/test/Makefile: Fix makefiles so that 'make test' works from a clean directory. 2015-09-26 [r1813] Andrew M. Bishop <amb> * src/router+lib.c, src/router.c, web/translations/router.html, web/www/routino/icons/waypoint-loop.png (added), web/www/routino/icons/waypoint-reverse.png (added), web/www/routino/router.css, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/router.pl: Add a loop and reverse checkbox on the web page and replace the loop and reverse buttons with icons. Update router programs and scripts. 2015-09-26 [r1812] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Fix bug with specifying 'oneway' or 'turns' in the URL arguments. 2015-09-24 [r1810] Andrew M. Bishop <amb> * src/router+lib.c: Fix a bug with freeing the waypoints if routing a loop. 2015-09-15 [r1804] Andrew M. Bishop <amb> * extras/find-fixme/Makefile, extras/tagmodifier/Makefile, src/Makefile, src/xml/Makefile, web/Makefile: Fix Makefiles so that 'make -j 4' works. 2015-09-15 [r1803] Andrew M. Bishop <amb> * Makefile.conf, src/Makefile: Add a "SONAME" shared library version number. 2015-09-15 [r1801-1802] Andrew M. Bishop <amb> * src/version.h: Change the version number so that anybody using the SVN version knows that it is not the released version and let them take care about the exact version. * src/Makefile: Don't create the *.so files on Windows. 2015-09-14 [r1799-1800] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Make the whole row of the route clickable, not just the number on the left. * doc/html/library.html: Give each HTML header a unique id. 2015-09-12 Andrew M. Bishop <amb> Version 3.0 released. 2015-09-12 [r1798] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html: Update files for release. 2015-09-09 [r1797] Andrew M. Bishop <amb> * doc/USAGE.txt, doc/html/usage.html, extras/find-fixme/README.txt, extras/find-fixme/fixme-dumper.c, extras/find-fixme/fixme-finder.c, extras/tagmodifier/README.txt, extras/tagmodifier/tagmodifier.c, src/filedumper.c, src/filedumperx.c, src/planetsplitter.c, src/router+lib.c, src/router.c, src/version.h (added): Add a '--version' option to all executables to print the current version (defined in version.h). 2015-09-07 [r1796] Andrew M. Bishop <amb> * src/output.c, src/translations.c, web/translations/translation.de.txt, web/translations/translation.en.txt, web/translations/translation.fr.txt, web/translations/translation.hu.txt, web/translations/translation.nl.txt, web/translations/translation.pl.txt, web/translations/translation.ru.txt, web/translations/translations-body.xml, web/translations/translations-head.xml, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js, xml/routino-translations.xml, xml/routino-translations.xsd: Merge some of the translation phrases together to simplify them. Change the HTML output and web pages to work with this. 2015-09-03 [r1795] Andrew M. Bishop <amb> * doc/LIBRARY.txt, doc/html/library.html, src/output.c, src/router+lib.c, src/routino.c, src/routino.h: Add in an HTML-all linked list formats that includes the full set of points and the HTML directions for the important ones. 2015-09-03 [r1794] Andrew M. Bishop <amb> * src/router.c: Bug fix in usage information. 2015-08-17 [r1793] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Fix a bug with dragging a marker from the left panel onto the map when the left panel has scrolled the page. 2015-08-17 [r1792] Andrew M. Bishop <amb> * doc/LIBRARY.txt, doc/html/library.html, src/router+lib.c, src/routino.c, src/routino.h, src/translations.c, src/translations.h: Add a new API function to return the full names of the languages available in the translations XML file. Increase API version to 6. 2015-08-17 [r1791] Andrew M. Bishop <amb> * src/test/copyright.xml, src/translations.c, src/translations.h, web/translations/translate.pl, web/translations/translations-body.xml, xml/routino-translations.xml, xml/routino-translations.xsd: Add the long version of the language name to the XML translations file. 2015-08-17 [r1790] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Replace one German word (via http://www.routino.org/translations/). 2015-08-16 [r1789] Andrew M. Bishop <amb> * web/translations/translate.pl, web/translations/translation.pl.txt, xml/routino-translations.xml: Delete some Polish documentation strings that were incorrectly formed (not enough '%s'). 2015-08-15 [r1788] Andrew M. Bishop <amb> * doc/html/index.html, doc/html/installation-ms-windows.html, doc/html/installation.html: Some small documentation tidying up. 2015-08-15 [r1787] Andrew M. Bishop <amb> * extras/find-fixme/Makefile, extras/tagmodifier/Makefile, src/Makefile, src/xml/Makefile: Use $^ instead of $< in Makefiles where it is simpler and where there are multiple dependencies that all need to be used together. 2015-08-15 [r1786] Andrew M. Bishop <amb> * src/test/Makefile: Compile the executables all in one go rather than running make for each one. 2015-08-15 [r1785] Andrew M. Bishop <amb> * Makefile, src/Makefile: Don't automatically choose the order in which to enter the sub-directories but hard-code it to make it more sensible. 2015-08-15 [r1784] Andrew M. Bishop <amb> * Makefile.conf, doc/INSTALL-MS-WIN.txt, doc/LIBRARY.txt (added), doc/html/index.html, doc/html/installation-ms-windows.html, doc/html/library.html (added), extras/find-fixme/Makefile, extras/find-fixme/fixme-dumper.c, extras/find-fixme/fixme-finder.c, extras/find-fixme/osmparser.c, extras/tagmodifier/Makefile, extras/tagmodifier/tagmodifier.c, src, src/Makefile, src/errorlogx.c, src/fakes.c, src/fakes.h, src/filedumper.c, src/filedumperx.c, src/files.c, src/files.h, src/functions.h, src/logerror.c, src/nodes.c, src/nodesx.c, src/optimiser.c, src/osmo5mparse.c, src/osmparser.c, src/osmpbfparse.c, src/osmxmlparse.c, src/output.c, src/planetsplitter.c, src/profiles.c, src/profiles.h, src/relations.c, src/relationsx.c, src/relationsx.h, src/results.c, src/router+lib.c (added), src/router.c, src/routino.c (added), src/routino.h (added), src/segments.c, src/segmentsx.c, src/superx.c, src/tagging.c, src/test, src/test/Makefile, src/test/a-b-c-d.sh, src/test/a-b-c.sh, src/test/a-b.sh, src/test/cycle-drive.sh, src/test/only-split.sh, src/test/run-tests.sh (added), src/test/start-1-finish.sh, src/translations.c, src/translations.h, src/types.c, src/visualiser.c, src/ways.c, src/waysx.c, src/xml/Makefile, src/xml/xsd-to-xmlparser.c, src/xmlparse.c, src/xmlparse.h, web/Makefile, web/www/routino/documentation: Merge libroutino branch back into the trunk. 2015-08-15 [r1783] Andrew M. Bishop <amb> (from 'branches/libroutino') * Makefile.conf, extras/find-fixme/Makefile, extras/tagmodifier/Makefile, src/Makefile, src/test/Makefile, src/xml/Makefile, web/Makefile: Add '.exe' to the EXE targets to stop MinGW recompiling the executables each time. 2015-08-14 [r1782] Andrew M. Bishop <amb> (from 'branches/libroutino') * Makefile.conf, doc/INSTALL-MS-WIN.txt, doc/html/installation-ms-windows.html, extras/find-fixme/Makefile, extras/tagmodifier/Makefile, src/Makefile, web/Makefile: Fully automatic host detection (for Cygwin, MinGW and generic UNIX). 2015-08-14 [r1781] Andrew M. Bishop <amb> (from 'branches/libroutino') * Makefile.conf, src/Makefile: Using 'make install' now installs the libraries. On Windows installation uses 'Program Files/Routino' as the base directory. 2015-08-14 [r1780] Andrew M. Bishop <amb> * web/translations/translation.de.txt, web/translations/translation.nl.txt, web/translations/translation.ru.txt, xml/routino-translations.xml: Remove duplicated words and whitespace in translations. 2015-08-11 [r1779] Andrew M. Bishop <amb> (from 'branches/libroutino') * Makefile.conf: Don't include '-fPIC' for MinGW compilation (stops some warnings). 2015-08-11 [r1776-1778] Andrew M. Bishop <amb> (from 'branches/libroutino') * doc/INSTALL-MS-WIN.txt, doc/html/installation-ms-windows.html: Updated documentation for compiling with MinGW64 and compiling library files. * src/Makefile: An attempt at creating routino.def and routino.lib using dlltool instead of gendef. * src/files.c, src/files.h: Undefine some #defines that MinGW64 uses to remove lots of compiler warnings. 2015-08-10 [r1773-1775] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/Makefile: Create routino.dll and routino.def when compiling with MinGW (based on suggestion from Oliver Eichler). * src/router+lib.c: Use 'use_stdout' instead of 'stdout' as a variable name (patch from Oliver Eichler). * src/routino.h: Use DLL_PUBLIC for the extern definitions of the global variables (patch from Oliver Eichler). 2015-08-08 [r1772] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/translations.c: Put the missing space back in the HTML string. 2015-08-08 [r1771] Andrew M. Bishop <amb> (from 'branches/libroutino') * doc/LIBRARY.txt, doc/html/library.html, src/output.c, src/router+lib.c, src/routino.c, src/routino.h, src/translations.c, src/translations.h: Simplify the HTML generation by making more complex format strings when parsing the translations. Add another field to the API HTML format output (cumulative distance). Increase API version to 5. 2015-08-08 [r1770] Andrew M. Bishop <amb> (from 'branches/libroutino') * doc/LIBRARY.txt, doc/html/library.html: Add some missing API changes. 2015-08-08 [r1769] Andrew M. Bishop <amb> * doc/OUTPUT.txt: Fix some text formatting problems. 2015-08-08 [r1768] Andrew M. Bishop <amb> (from 'branches/libroutino') * doc/LIBRARY.txt, doc/html/library.html, src/output.c, src/router+lib.c, src/routino.c, src/routino.h, src/translations.c, src/translations.h: Add a new output list format that contains a text version of the normal HTML output. Increase API version to 4. 2015-08-04 [r1767] Andrew M. Bishop <amb> (from 'branches/libroutino') * doc/LIBRARY.txt, doc/html/library.html, src/optimiser.c, src/router+lib.c, src/routino.c, src/routino.h: Add a progress callback that reports routing progress and can abort the routing algorithm if required. Increase API version to 3. 2015-08-04 [r1766] Andrew M. Bishop <amb> (from 'branches/libroutino') * doc/LIBRARY.txt, doc/html/library.html, src/output.c, src/routino.c, src/routino.h: Add speed for each route segment (text-all version) and rename the 'string' parameter to 'name'. Increase API version to 2. 2015-08-03 [r1765] Andrew M. Bishop <amb> (from 'branches/libroutino') * doc/LIBRARY.txt, doc/html/library.html, src/router+lib.c, src/routino.c, src/routino.h: Add a library API version number #define and variable and a function to compare the two. 2015-08-03 [r1764] Andrew M. Bishop <amb> (from 'branches/libroutino') * web/www/routino/documentation: Ignore the library documentation when copied to the web directory. 2015-08-03 [r1763] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Format the web links to only use 5 decimal places. 2015-08-02 [r1761-1762] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/output.c: Another fix for a mistake in output generation. * src/output.c: Patch from Oliver Eichler for some mistakes in output generation. 2015-07-31 [r1760] Andrew M. Bishop <amb> (from 'branches/libroutino') * doc/LIBRARY.txt (added), doc/html/index.html, doc/html/library.html (added), src/routino.c, src/routino.h: Documentation for the libroutino library. 2015-07-31 [r1759] Andrew M. Bishop <amb> * web/translations/translation.pl.txt: More Polish translations (via http://www.routino.org/translations/). 2015-07-30 [r1758] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/functions.h, src/output.c, src/router+lib.c, src/router.c, src/routino.c, src/routino.h: Add the ability to request a linked list output representing the route when using the routino library. 2015-07-21 [r1757] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/routino.c, src/routino.h: Add a user profile type and functions to convert it to and from the Routino profile. 2015-07-20 [r1756] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/router+lib.c, src/router.c, src/routino.c, src/routino.h: Add options to the routing function to allow selection of the type of output files generated. 2015-07-20 [r1755] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/profiles.c, src/profiles.h, src/router+lib.c, src/routino.c, src/routino.h, src/translations.c, src/translations.h: Add functions to the library to return the list of loaded translation languages and profile names. 2015-07-20 [r1754] Andrew M. Bishop <amb> (from 'branches/libroutino') * Makefile.conf, src/Makefile: Compile the version of the router using libroutino to search for the shared library in the same directory. 2015-07-20 [r1753] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/routino.c, src/routino.h: Check for validated profiles before using them. 2015-07-18 [r1752] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/test/Makefile, src/test/run-tests.sh (added): Put the test script execution into a script. 2015-07-18 [r1751] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/test, src/test/Makefile, src/test/a-b-c-d.sh, src/test/a-b-c.sh, src/test/a-b.sh, src/test/cycle-drive.sh, src/test/only-split.sh, src/test/start-1-finish.sh: Add tests of the router built with libroutino. 2015-07-16 [r1750] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/router+lib.c: Fix bug in last check-in. 2015-07-16 [r1749] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/router+lib.c, src/router.c, src/routino.c, src/translations.c: Allow choosing a named translation, the first in the file or the built-in English one. Make the routers use the first in the file if no language is specified rather than the built-in one. 2015-07-16 [r1748] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/profiles.c, src/profiles.h, src/router+lib.c, src/router.c, src/routino.c, src/routino.h: Validate profile parameters better when reading XML or router command line. Change the Profile data structure so that UpdateProfile() does not change the parts that are loaded from file so that it can be used multiple times on the same profile. Change the highway and props data to be between 0 and 1 rather than a percentage. Add a new function to the library to validate a profile and also update it. 2015-07-15 [r1746-1747] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/profiles.c, src/routino.c, src/routino.h, src/translations.c: Add a Routino_errno variable that indicates the error status of the most recent library function called. * src/Makefile: Fix bug with Makefile dependencies for libroutino.so and libroutino-slim.so. 2015-07-14 [r1745] Andrew M. Bishop <amb> * src/files.c, src/files.h: Merge changes from MS-Windows branch (changes for stati64/fstati64/lseeki64). 2015-07-14 [r1743] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * src/files.c, src/files.h: Fix changes for stati64/fstati64/lseeki64. 2015-07-11 [r1741] Andrew M. Bishop <amb> * src/cache.h, src/errorlog.h, src/errorlogx.c, src/files.c, src/files.h, src/logerror.c, src/nodes.c, src/nodes.h, src/nodesx.c, src/relations.h, src/relationsx.c, src/relationsx.h, src/ways.h, src/waysx.c, src/waysx.h: Merge change from MS-Windows branch (offset_t). 2015-07-11 [r1740] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * src/cache.h, src/errorlog.h, src/errorlogx.c, src/files.c, src/files.h, src/logerror.c, src/nodes.c, src/nodes.h, src/nodesx.c, src/relations.h, src/relationsx.c, src/relationsx.h, src/ways.h, src/waysx.c, src/waysx.h: Define a custom type for the offset within a file (because MS Windows can create a 4GB file but only seek +/-2GB within it). 2015-07-10 [r1739] Andrew M. Bishop <amb> * src/nodes.h, src/nodesx.h, src/relations.h, src/segments.h, src/segmentsx.h, src/ways.h, src/waysx.h: Clarify the comments surrounding the definition of the slim mode cache data structures. 2015-07-09 [r1738] Andrew M. Bishop <amb> (from 'branches/libroutino') * src, src/Makefile, src/router+lib.c (added), src/routino.c, src/routino.h: Update the library and include a version of the router program that uses the libroutino shared library for calculating routes. Currently generates output files of all types and accepts but ignores all options to change this. 2015-07-08 [r1737] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/translations.c: Bug fix when freeing the loaded translations. 2015-07-08 [r1736] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/translations.c: Bug fix for change introduced into xmlparse.c by r1701. 2015-07-08 [1735] Andrew M. Bishop <amb> * src/files.c: Merge change from MS-Windows branch. 2015-07-08 [r1734] Andrew M. Bishop <amb> * src/xmlparse.c: Remove a commented out line left over from a previous change. 2015-07-08 [r1733] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * src/files.c: Use the same definition of ssize_t in files.c as other files (for MS Windows). 2015-07-07 [r1732] Andrew M. Bishop <amb> * web/translations/translation.pl.txt: More Polish translations (via http://www.routino.org/translations/). 2015-07-06 [r1731] Andrew M. Bishop <amb> * web/translations/translation.pl.txt (added), web/www/routino, web/www/routino/.htaccess, xml/routino-translations.xml: Added Polish version of translations (submitted through http://www.routino.org/translations/). 2015-07-04 [r1730] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/functions.h, src/optimiser.c, src/router.c: Move the CalculateRoute function from router.c into optimiser.c. 2015-07-02 [r1729] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/functions.h, src/output.c, src/profiles.c, src/profiles.h, src/router.c, src/translations.c, src/translations.h: Identify the best bits from the profiles XML reader and translations XML reader functions and implement them in both. 2015-07-02 [r1728] Andrew M. Bishop <amb> * src/profiles.c: Fix error with --help-profile-xml option. 2015-07-01 [r1726] Andrew M. Bishop <amb> * src/files.c, src/files.h, src/osmo5mparse.c, src/osmpbfparse.c, src/xmlparse.c: Merge changes from MS-Windows branch. 2015-07-01 [r1724-1725] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * src/files.c: More fixes for MSVC, set permission for creating files and combine code with MinGW. * src/files.h, src/osmo5mparse.c, src/osmpbfparse.c, src/xmlparse.c: More fixes for MSVC from Oliver Eichler (include basestd.h and define ssize_t). 2015-06-22 [r1723] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/optimiser.c: Bug fix for latest change (logassert and LIBROUTINO). 2015-06-22 [r1722] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/files.c, src/nodes.c, src/optimiser.c, src/relations.c, src/results.c, src/segments.c, src/ways.c: Remove all references to log_memory(), log_free(), log_mmap(), log_munmap() and logassert() from code compiled into the library. 2015-06-20 [r1720] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/routino.h: Avoid defining DLL_PUBLIC twice on Cygwin. 2015-06-20 [r1719] Andrew M. Bishop <amb> * extras/tagmodifier/tagmodifier.c, src/osmxmlparse.c, src/profiles.c, src/tagging.c, src/translations.c, src/xml/xsd-to-xmlparser.c, src/xmlparse.c, src/xmlparse.h: Make the xmltags definitions of XML files be constants. 2015-06-20 [r1717-1718] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/xmlparse.c, src/xmlparse.h: Don't print an error when XML parsing fails but store a string for later use (for use within library version). * src/optimiser.c: Check for defined(LIBROUTINO) instead of LIBROUTINO. 2015-06-19 [r1716] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/files.c, src/optimiser.c, src/output.c, src/profiles.c, src/translations.c: Do not print error or debug messages when compiled into library. Return an appropriate error value from functions instead of exiting. 2015-06-18 [r1715] Andrew M. Bishop <amb> (from 'branches/libroutino') * Makefile.conf, src/Makefile, src/routino.c (added), src/routino.h (added): Add stub files for Routino library exported functions and Makefile support. 2015-06-17 [r1713] Andrew M. Bishop <amb> * extras/tagmodifier/README.txt, extras/tagmodifier/tagmodifier.c: Add the '--logmemory' option that the other programs have. 2015-06-17 [r1712] Andrew M. Bishop <amb> (from 'branches/libroutino') * extras/find-fixme/fixme-finder.c: Fix error with command line tagging filename selection. Change code to make it clearer that the error log file is not optional. 2015-06-16 [r1711] Andrew M. Bishop <amb> (from 'branches/libroutino') * extras/find-fixme/osmparser.c, extras/tagmodifier/tagmodifier.c, src/errorlogx.c, src/fakes.c, src/fakes.h, src/logerror.c, src/nodesx.c, src/osmo5mparse.c, src/osmparser.c, src/osmpbfparse.c, src/osmxmlparse.c, src/profiles.c, src/relationsx.c, src/segmentsx.c, src/tagging.c, src/translations.c, src/visualiser.c, src/waysx.c, src/xmlparse.c: Audit the use of file static variables to make sure that there are no implicit assumptions about initialisation conditions that would be wrong for library usage. Fix problems and add comments for clarity. 2015-06-14 [r1710] Andrew M. Bishop <amb> (from 'branches/libroutino') * extras/find-fixme/fixme-dumper.c, extras/tagmodifier/tagmodifier.c, src/filedumper.c, src/nodesx.c, src/osmxmlparse.c, src/planetsplitter.c, src/relationsx.c, src/relationsx.h, src/segmentsx.c, src/superx.c, src/tagging.c, src/translations.c, src/types.c, src/waysx.c, src/xml/xsd-to-xmlparser.c, src/xmlparse.c: Audit the use of function static variables to make sure that there are no implicit assumptions about initialisation conditions that would be wrong for library usage. Fix problems and add comments for clarity. 2015-06-12 [r1709] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/filedumperx.c: Correct an error in a comment. 2015-06-12 [r1708] Andrew M. Bishop <amb> (from 'branches/libroutino') * extras/find-fixme/fixme-finder.c, src/planetsplitter.c, src/router.c: Minimise the number of times that FileName() is called since each one will allocate memory and take time. 2015-06-12 [r1706-1707] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/profiles.c, src/profiles.h, src/router.c: Add a function to free the memory in the Profile structures loaded from file. * src/output.c, src/router.c, src/translations.c, src/translations.h: Create a Translation structure to hold the translated strings and have one global variable instead of 30. Add a function to free the memory in the Translation structure. 2015-06-10 [r1705] Andrew M. Bishop <amb> * doc/html/index.html, web/www/routino/documentation: Merge the MS-Windows branch back into the trunk. More documentation changes. 2015-06-10 [r1704] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * doc/html/index.html: Update the index to point to the new MS Windows installation documentation. 2015-06-10 [r1703] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * web/www/routino/documentation: Ignore the new MS Windows installation documentation file. 2015-06-10 [r1701-1702] Andrew M. Bishop <amb> (from 'branches/libroutino') * src/router.c: The translations are required to be loaded for the text output formats. * src/output.c, src/xmlparse.c: The ParseXML_Encode_Safe_XML() function now returns a pointer to the same re-allocated string each time rather than allocating a new string each time that it is called. 2015-06-09 [r1699] Andrew M. Bishop <amb> * Makefile.conf, doc/INSTALL-MS-WIN.txt (added), doc/INSTALL.txt, doc/html/installation-ms-windows.html (added), doc/html/installation.html, extras/find-fixme/Makefile, extras/tagmodifier/Makefile, src/Makefile, src/errorlogx.c, src/files.c, src/files.h, src/logerror.c, src/nodesx.c, src/output.c, src/relationsx.c, src/segmentsx.c, src/test/Makefile, src/uncompress.c, src/waysx.c, src/xml/Makefile, src/xmlparse.c, web/Makefile: Merge the MS-Windows branch back into the trunk. Code changes and documentation for Cygwin and MinGW compilers. 2015-05-31 [r1697] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * src/errorlogx.c, src/files.c, src/files.h, src/nodesx.c, src/relationsx.c, src/segmentsx.c, src/waysx.c: Microsoft Windows does not allow deleting an open file and continuing to use it like UNIX does. For MS Windows rename the file instead of deleting and replacing it and do not delete open files immediately but wait until they are closed. 2015-05-30 [r1696] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * src/files.c, src/logerror.c, src/output.c: Open files in binary mode for MSVC and MinGW. 2015-05-29 [r1695] Andrew M. Bishop <amb> * src/nodesx.c, src/relationsx.c, src/segmentsx.c, src/waysx.c: Ensure that allocated strings are long enough even if the %p format is extravagant in the number of characters it uses. 2015-05-29 [r1694] Andrew M. Bishop <amb> * web/Makefile: Change the order so that the translations are created before the icons (because the icons are more difficult to make and more likely to fail). 2015-05-29 [r1693] Andrew M. Bishop <amb> * Makefile.conf: Remove the -Wfloat-conversion gcc option since it was only included in gcc version 4.9 so is not available everywhere. 2015-05-29 [r1692] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * doc/INSTALL-MS-WIN.txt, doc/html/installation-ms-windows.html: Add instructions for compiling with Cygwin (no source code changes needed). 2015-05-28 [r1690] Andrew M. Bishop <amb> * extras/find-fixme/Makefile, extras/tagmodifier/Makefile, src/Makefile, src/test/Makefile, src/xml/Makefile, web/Makefile, web/www/routino, web/www/routino/router.html (removed), web/www/routino/visualiser.html (removed), xml/Makefile: Update Makefiles so that 'make clean' goes back to the source code in the release tar files and 'make distclean' goes back to the source code in subversion (the difference mainly being web page icons and web page translations). 2015-05-28 [r1687-1689] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * doc/INSTALL-MS-WIN.txt (added), doc/INSTALL.txt, doc/html/installation-ms-windows.html (added), doc/html/installation.html: Update documentation to describe compilation on Microsoft Windows. * src/uncompress.c: Do not try to compile the built-in file decompression on MINGW or MSVC due to the lack of fork() function. * Makefile.conf, extras/find-fixme/Makefile, extras/tagmodifier/Makefile, src/Makefile, src/xml/Makefile, web/Makefile: Update Makefiles for compiling with MINGW to include mman-win32.o and handle executables with .exe file extension. 2015-05-26 [r1683-1686] Andrew M. Bishop <amb> (from 'branches/MS-Windows') * src/xmlparse.c: When compiling with MINGW there is no strcasecmp() function so _stricmp() must be used (the same as with MSVC). * src/files.c: When compiling with MINGW the same mman-win32 functions are required as with MSVC. The open() function can not set the 'group' and 'other' permissions although it can set the 'user' permissions. * src/files.h: When compiling with MINGW the pread() and pwrite() functions are not available. Fix a signed/unsigned assignment warning in the inline functions. * src/uncompress.c: Only compile the pipe_and_fork() function if any of the compression methods are enabled. 2015-05-26 [r1680] Andrew M. Bishop <amb> * Makefile.conf, extras/find-fixme/fixme-dumper.c, extras/find-fixme/fixme-finder.c, extras/tagmodifier/tagmodifier.c, src/Makefile, src/cache.h, src/fakes.c, src/filedumper.c, src/files.c, src/files.h, src/logging.c, src/logging.h, src/mman-win32.c (added), src/mman-win32.h (added), src/nodes.c, src/optimiser.c, src/osmo5mparse.c, src/osmpbfparse.c, src/output.c, src/planetsplitter.c, src/profiles.c, src/router.c, src/segments.h, src/uncompress.c, src/ways.c, src/ways.h, src/xml/xsd-to-xmlparser.c, src/xmlparse.c: Merge branch 'MSVC' back into the trunk. 2015-05-26 [r1679] Andrew M. Bishop <amb> * web/www/leaflet/install.sh: Update to Leaflet version 0.7.3. 2015-05-21 [r1678] Andrew M. Bishop <amb> * src/sorting.c: Fix bug with 64-bit version failing 'make test'. 2015-05-20 [r1677] Andrew M. Bishop <amb> * src/output.c: Change a static variable to a const to clarify it usage. 2015-05-20 [r1676] Andrew M. Bishop <amb> (from 'branches/MSVC') * Makefile.conf: Add the -Wfloat-conversion gcc option to catch any future score_t related conversions required. 2015-05-20 [r1675] Andrew M. Bishop <amb> (from 'branches/MSVC') * src/optimiser.c, src/profiles.c, src/router.c: Typecasts for score_t and explicit float (not double) literals for MSVC compilation [based on patch from Oliver Eichler]. 2015-05-20 [r1674] Andrew M. Bishop <amb> (from 'branches/MSVC') * src/logging.c, src/xmlparse.c: Updated MSVC code changes after testing [patch from Oliver Eichler]. 2015-05-20 [r1673] Andrew M. Bishop <amb> (from 'branches/MSVC') * src/files.c, src/files.h, src/mman-win32.c (added), src/mman-win32.h (added): Added a Win32 implementation of the mmap/munmap functions [files from https://code.google.com/p/mman-win32 suggested by Oliver Eichler]. 2015-05-19 [r1666-1671] Andrew M. Bishop <amb> (from 'branches/MSVC') * src/ways.c: Fix uninitialised memory [found by Oliver Eichler when compiling with Microsoft C compiler]. * src/fakes.c, src/segments.h, src/ways.h: Add some explicit casts for some assignments resulting from pointer arithmetic [patch from Oliver Eichler for compiling with Microsoft C]. * src/files.c, src/nodes.c, src/xmlparse.c: Add some explicit casts for some assignments between different integer types [patch from Oliver Eichler for compiling with Microsoft C]. * src/Makefile, src/planetsplitter.c, src/router.c: Rename DATADIR to ROUTINO_DATADIR to avoid problems when compiling with Microsoft C compiler [inspired by patches from Oliver Eichler]. * src/files.c, src/files.h: Remove memory mapping functions when compiling with Microsoft C compiler [inspired by patches from Oliver Eichler]. This will only allow slim more to be compiled. * src/xmlparse.c: Remove <strings.h> when compiling with Microsoft C compiler (in which use a macro to replace strcasecmp) [inspired by patches from Oliver Eichler]. 2015-05-19 [r1664-1665] Andrew M. Bishop <amb> (from 'branches/MSVC') * src/files.c, src/files.h: Remove <unistd.h> where not needed at all or when compiling with Microsoft C compiler (in which case add <io.h> and some macros to replace read/write/open/close/lseek etc.) [inspired by patches from Oliver Eichler]. * extras/find-fixme/fixme-finder.c, extras/tagmodifier/tagmodifier.c, src/cache.h, src/osmo5mparse.c, src/osmpbfparse.c, src/output.c, src/planetsplitter.c, src/uncompress.c, src/xml/xsd-to-xmlparser.c, src/xmlparse.c: Remove <unistd.h> where not needed at all or when compiling with Microsoft C compiler (in which case add <io.h> and some macros to replace read/write/open/close/lseek etc.) [inspired by patches from Oliver Eichler]. 2015-05-19 [r1663] Andrew M. Bishop <amb> (from 'branches/MSVC') * extras/find-fixme/fixme-dumper.c, src/filedumper.c, src/logging.c, src/logging.h: Remove <sys/time.h> where not needed at all or when compiling with Microsoft C compiler (in which case add a replacement gettimeofday function) [inspired by patches from Oliver Eichler]. 2015-05-18 [r1661] Andrew M. Bishop <amb> * src/optimiser.c: Fix use-after-free error found by valgrind. 2015-05-16 [r1657] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Fix bug with moving markers on the map (OpenLayers version) and enable markers when they are dragged onto the map (both versions). 2015-05-16 [r1656] Andrew M. Bishop <amb> * web/translations/router.html, web/translations/translation.de.txt, web/translations/translation.en.txt, web/translations/translation.fr.txt, web/translations/translation.nl.txt, web/www/routino/router.css, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Allow dragging the waypoint icon up-and-down in the list and onto the map. 2015-05-15 [r1655] Andrew M. Bishop <amb> * web/translations/translation.hu.txt: Add updated Hungarian translations submitted via http://www.routino.org/translations/ on 2015-05-14. 2015-05-14 [r1652-1653] Andrew M. Bishop <amb> * Makefile.conf: Add the -pedantic compilation flag to allow detection of more potential errors and portability issues. * src/errorlog.h, src/files.c, src/nodes.h, src/relations.h, src/segments.h, src/sorting.c, src/ways.h: Replace all arithmetic involving 'void*' pointers with 'char*' since it isn't strictly valid although it is accepted by gcc. 2015-05-13 [r1651] Andrew M. Bishop <amb> * src/xmlparse.c: Remove a gcc warning about overflow in implicit constant conversion (by making it an explicit type cast). 2015-05-13 [r1650] Andrew M. Bishop <amb> * extras/find-fixme/fixme-dumper.c, src/filedumper.c, src/logging.c: Use "%zu" to print 'size_t' type values and use Pindex_t to print 'index_t' type values. 2015-05-13 [r1649] Andrew M. Bishop <amb> * src/sorting.c: Remove some pthread related code that was being used even if compiled without pthreads. 2015-05-05 [r1648] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Add updated German translations submitted via http://www.routino.org/translations/ on 2015-05-04. 2015-05-01 [r1646] Andrew M. Bishop <amb> * doc/html/algorithm.html, doc/html/configuration.html, doc/html/data.html, doc/html/index.html, doc/html/installation.html, doc/html/limits.html, doc/html/output.html, doc/html/readme.html, doc/html/style.css, doc/html/tagging.html, doc/html/usage.html, extras/find-fixme/web/www/index.html, web/www/routino/index.html: Add "meta" header to HTML to help mobile devices and tidy up some CSS. 2015-05-01 [r1644-1645] Andrew M. Bishop <amb> * doc/html/readme.html: Fixed some header links. * doc/TAGGING.txt, doc/html/tagging.html: Fixed some text formatting. 2015-04-26 [r1643] Andrew M. Bishop <amb> * web/translations/translation.hu.txt (added), web/www/routino, xml/routino-translations.xml: Added a Hungarian translation of the Routino routes and router web pages (from unknown person using http://routino.org/translations/). 2015-04-11 [r1642] Andrew M. Bishop <amb> * web/Makefile: Run make in the xml directory after updating the xml/translations.xml file. 2015-04-10 [r1641] Andrew M. Bishop <amb> * src/translations.c: Change built-in default HTML translation strings so that they work with the web page if they have to be used. 2015-03-30 [r1638] Andrew M. Bishop <amb> * src/optimiser.c: Fix bug with indenting of debug output in FindMiddleRoute() function. 2015-03-28 [r1636] Andrew M. Bishop <amb> * src/optimiser.c: More verbose, consistent, complete and descriptive debugging of routes found. 2015-03-28 [r1634] Andrew M. Bishop <amb> * src/optimiser.c: The new FindStartRoutes() function does not need to be so complicated. 2015-03-28 [r1632] Andrew M. Bishop <amb> * src/functions.h, src/optimiser.c, src/router.c: Remove the ExtendStartRoutes() function by merging its functionality with the FindStartRoutes() function since they were almost identical anyway. 2015-03-21 [r1626-1627] Andrew M. Bishop <amb> * src/optimiser.c, src/router.c: Make sure that all complete routes have finish_node and last_segment filled in. * src/optimiser.c: Bug fix and clarification for previous change. 2015-03-21 [r1625] Andrew M. Bishop <amb> * src/functions.h, src/optimiser.c, src/router.c: Don't merge the end of the route with the middle part of the route before combining with the beginning of the route - combine beginning, middle and end all in one function. 2015-02-02 [r1624] Andrew M. Bishop <amb> * web/translations/translation.de.txt, xml/routino-translations.xml: Add updated German translations submitted via http://www.routino.org/translations/ on 2014-01-31. 2015-01-17 [r1623] Andrew M. Bishop <amb> * web/translations/translation.de.txt, xml/routino-translations.xml: Add updated German translations submitted via http://www.routino.org/translations/ on 2014-01-16. 2015-01-13 [r1622] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Add updated German translations submitted via http://www.routino.org/translations/ on 2014-01-13. 2015-01-09 [r1621] Andrew M. Bishop <amb> * web/translations/translation.nl.txt: Add updated Dutch translations submitted via http://www.routino.org/translations/ on 2014-01-08. 2015-01-07 [r1620] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Remove cycle_barrier and bicycle_barrier since these don't always block bicycles. 2014-12-04 [r1619] Andrew M. Bishop <amb> * src/typesx.h: Increase MAX_SEG_PER_NODE to avoid further problems. 2014-11-29 [r1618] Andrew M. Bishop <amb> * src/visualiser.c: Include typesx.h to get the definition of MAX_SEG_PER_NODE rather than having another one. 2014-11-08 Andrew M. Bishop <amb> Version 2.7.3 released. 2014-11-08 [r1616] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html: Updated for version 2.7.3. 2014-11-08 [r1615] Andrew M. Bishop <amb> * web/translations/translation.de.txt, xml/routino-translations.xml: Translation of the final German word missing from the XML file. 2014-10-25 [r1614] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/nodesx.c, src/planetsplitter.c, src/relationsx.c: Sort the data geographically before pruning so that the data points physically close together are close together in memory which reduces swapping/paging and therefore runs much faster when memory is limited. 2014-10-23 [r1613] Andrew M. Bishop <amb> * src/logging.c: Comment fixes, tidy-up and one bug fixed. 2014-10-22 [r1612] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/waysx.c: Use the waysx->idata array instead of wayx->id when logging node errors during the segment creation. 2014-10-21 [r1609-1611] Andrew M. Bishop <amb> * doc/DATALIFE.txt: Correct errors in wayx->id usage when compacting ways. * src/logging.c: Improve the message printed at the end when using --logtime or --logmemory. * src/planetsplitter.c: Clarify some comments. 2014-10-18 [r1608] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/segmentsx.c: Use the waysx->idata array when logging duplicate segments rather than looking up the wayx and using its id, also saves mapping the ways into memory. 2014-10-18 [r1606-1607] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/segmentsx.c: Use the nodesx->idata array when logging duplicate segments rather than looking up the nodex and using its id. * src/nodesx.c: Shrink the size of the nodesx->idata array when removing non-highway nodes. 2014-10-18 [r1605] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/nodesx.c, src/planetsplitter.c, src/relationsx.c, src/segmentsx.c, src/superx.c: Free memory that it allocated by IndexSegments() when no longer needed rather than holding on to it. 2014-10-14 [r1604] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/planetsplitter.c: Speed up the database generation when pruning by reducing the amount of random memory accesses are required by compacting the database after each step. Unless there is enough RAM to hold all the memory mapped files this should be faster. 2014-10-13 [r1603] Andrew M. Bishop <amb> * src/nodes.c, src/segments.c, src/segments.h, src/segmentsx.c: Try to speed up the search for the closest node/segment by minimising the number of nodes that are examined in detail. 2014-10-10 [r1602] Andrew M. Bishop <amb> * src/nodes.c, src/relations.c, src/segments.c, src/ways.c: Record the memory used by the node, segment, way and relation caches in the slim mode router. 2014-10-10 [r1601] Andrew M. Bishop <amb> * extras/find-fixme/fixme-finder.c, src/logging.c, src/planetsplitter.c, src/router.c: Log the router time in microseconds rather than milliseconds. Add a note at the end about the format of the time and memory logging. 2014-10-10 [r1600] Andrew M. Bishop <amb> * doc/USAGE.txt, doc/html/usage.html, src/logging.c, src/nodes.c, src/optimiser.c, src/results.c, src/router.c: Add the '--logtime' and '--logmemory' options to the router to report the time and maximum memory in use (allocated and mapped files) during each step of the routing. 2014-09-30 [r1599] Andrew M. Bishop <amb> * extras/find-fixme/fixme-dumper.c, extras/find-fixme/fixme-finder.c, extras/tagmodifier/tagmodifier.c, src/filedumper.c, src/filedumperx.c, src/planetsplitter.c, src/router.c: Use exit() when exiting the program other than at the end of the main function. 2014-09-27 [r1598] Andrew M. Bishop <amb> * doc/DATALIFE.txt, doc/USAGE.txt, doc/html/usage.html, extras/find-fixme/README.txt, extras/find-fixme/fixme-finder.c, src/errorlogx.c, src/files.c, src/logging.c, src/logging.h, src/nodesx.c, src/planetsplitter.c, src/prunex.c, src/relationsx.c, src/segmentsx.c, src/sorting.c, src/superx.c, src/typesx.h, src/waysx.c: Add a '--logmemory' option to planetsplitter which will report the maximum memory in use (allocated and mapped files) during each step of the processing. 2014-09-27 [r1597] Andrew M. Bishop <amb> * src/nodes.h, src/relations.c, src/segments.c, src/ways.c, src/waysx.h: Be more consistent in the way that cache.h is included. 2014-09-26 [r1596] Andrew M. Bishop <amb> * src/logging.c, src/logging.h: Make a function static in logging.c rather than global. 2014-09-26 [r1592-1595] Andrew M. Bishop <amb> * src/planetsplitter.c: Free the segment list before generating the errorlog files (it isn't used). * src/prunex.c: Change a comment and the style in which some data is freed. * src/segmentsx.c: Free segmentsx->usedway in FreeSegmentList() rather than letting it leak. * src/nodesx.c: Free segmentsx->firstnode in SaveNodeList() like DATALIFE.txt says it should be. 2014-09-23 [r1591] Andrew M. Bishop <amb> * src/files.c, src/files.h, src/sorting.c: Allocate only the memory that is needed (but never more than the limit) when sorting files (i.e. don't just allocate the limit without checking). 2014-09-18 [r1589-1590] Andrew M. Bishop <amb> * src/visualiser.c: Update comments for the functions (some were wrong, all were unclear). * extras/find-fixme/osmparser.c: Remove unused macros. 2014-08-27 [r1588] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Add updated German translation submitted via http://www.routino.org/translations/ on 2014-08-26. 2014-07-26 [r1587] Andrew M. Bishop <amb> * src/profiles.c: Limit the property preferences to a factor of 100 preference for a highway having a property compared to a highway not having the property (was 10000). 2014-07-04 [r1586] Andrew M. Bishop <amb> * doc/NEWS.txt: Fix release date for 2.7.2. 2014-06-26 Andrew M. Bishop <amb> Version 2.7.2 released. 2014-06-26 [r1584] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html: Updated for version 2.7.2 release. 2014-06-25 [r1583] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/installation.html: Add a note about another Perl module required if compiling from subversion. 2014-06-25 [r1582] Andrew M. Bishop <amb> * src/router.c: Clarify the reason for the unreachable code (#if 0) and fix bug in it. 2014-06-25 [r1581] Andrew M. Bishop <amb> * src/errorlogx.c: Fix for compiler warning on 64-bit systems but not 32-bit systems. 2014-06-24 [r1580] Andrew M. Bishop <amb> * src/output.c: Fix for revision r1565 that crashes on 64-bit systems but not 32-bit systems. 2014-06-24 [r1579] Andrew M. Bishop <amb> * src/optimiser.c: Fix for revision r1553 that crashes on 64-bit systems but not 32-bit systems. 2014-06-09 [r1578] Andrew M. Bishop <amb> * src/cache.h: Increase the size of the caches for the slim programs by a factor of four (gives a large speed-up on virtual machines with low memory and slow disks even though it makes little difference on machines with lots of memory and fast disks). 2014-06-07 [r1577] Andrew M. Bishop <amb> * doc/TAGGING.txt, doc/html/tagging.html: Document the default assumptions about allowed transport types on ferry routes (none). 2014-06-05 [r1576] Andrew M. Bishop <amb> * web/translations/translate.pl: When creating the translated HTML and XML files give the statistics for each file separately. 2014-05-26 [r1575] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Add updated German translations submitted via http://www.routino.org/translations/ on 2014-05-25. 2014-05-21 [r1574] Andrew M. Bishop <amb> * web/translations/translation.ru.txt: Add updated Russian translations submitted via http://www.routino.org/translations/ around 2014-05-20. 2014-05-20 [r1573] Andrew M. Bishop <amb> * src/visualiser.c: When visualising segments include all of the ones that overlap the selected region (not missing a few that cross the edges). 2014-05-19 [r1572] Andrew M. Bishop <amb> * web/translations/translation.de.txt, web/translations/translation.fr.txt, web/translations/translation.nl.txt, web/translations/translation.ru.txt, web/translations/translations-body.xml, xml/routino-translations.xml: Remove un-needed whitespace in translations files. 2014-05-17 Andrew M. Bishop <amb> Version 2.7.1 released. 2014-05-17 [r1570] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html: Update documentation for version 2.7.1. 2014-05-17 [r1569] Andrew M. Bishop <amb> * web/Makefile: Re-create the xml/routino-translations.xml file if the translations are updated or the file is deleted. 2014-05-17 [r1568] Andrew M. Bishop <amb> * xml/routino-translations.xml: Add updated German translations submitted via http://www.routino.org/translations/ around 2014-04-11 and 2014-05-02. 2014-05-12 [r1567] Andrew M. Bishop <amb> * src/prunex.c: When pruning short segments take the highway types into account when sharing the pruned segment length between the two neighbouring segments. 2014-05-10 [r1565-1566] Andrew M. Bishop <amb> * src/test, src/test/a-b-c-d.sh (added), src/test/coincident-waypoint.osm (added), src/test/coincident-waypoint.sh (added), src/test/expected/coincident-waypoint-WP01.txt (added), src/test/expected/coincident-waypoint-WP02.txt (added), src/test/expected/coincident-waypoint-WP03.txt (added), src/test/expected/coincident-waypoint-WP04.txt (added): Add test cases for routes with contain two consecutive coincident waypoints. * src/fakes.c, src/fakes.h, src/output.c, src/router.c: Don't crash if the specified route contains two consecutive coincident waypoints (route instructions at those points may not be perfect). 2014-05-09 [r1564] Andrew M. Bishop <amb> * src/output.c, src/test/expected/loops-WP01.txt, src/test/expected/loops-WP02.txt, src/test/expected/loops-WP06.txt, src/test/expected/loops-WP07.txt: Fix bug with results output that would miss a segment and get the distance/time wrong if a waypoint node was passed again on the way to the next waypoint. 2014-05-05 [r1563] Andrew M. Bishop <amb> * src/optimiser.c: Remove some left-over debugging print statements. 2014-05-03 [r1562] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Add updated German translations submitted via http://www.routino.org/translations/ around 2014-05-02. (Some of the changes from the 2014-04-11 submission were not merged last time, they have been included this time). 2014-05-02 [r1561] Andrew M. Bishop <amb> * web/translations/translation.de.txt: Add updated German translations submitted via http://www.routino.org/translations/ around 2014-04-11. 2014-04-30 [r1560] Andrew M. Bishop <amb> * doc/USAGE.txt, doc/html/usage.html, src/filedumper.c, src/osmparser.c, src/visualiser.c, src/visualiser.h, web/translations/translation.en.txt, web/translations/visualiser.html, web/www/routino/visualiser.cgi, web/www/routino/visualiser.leaflet.js, web/www/routino/visualiser.openlayers.js: Update the visualiser web page to allow displaying the "cyclebothways" highway type and the "roundabout" highway type. Also "cyclebothways" is no longer a property so removed from that part of the visualiser. 2014-04-29 [r1559] Andrew M. Bishop <amb> * src/filedumper.c, src/optimiser.c, src/osmparser.c, src/output.c, src/segments.c, src/types.c, src/types.h, xml/routino-profiles.xml: Remove the "cyclebothways" property and replace it with a "cyclebothways" highway type. This means that it is no longer possible to choose a preference for this type of highway when calculating a route. There was never really any reason for allowing users to do this since they can't specify a preference for oneway streets. It does however mean that the broken Javascript in the router web page (no entry field for this property) is fixed. Unfortunately this means that a database created by previous versions are not compatible with this one. 2014-04-28 [r1558] Andrew M. Bishop <amb> * doc/TAGGING.txt, doc/html/tagging.html: Add some missing items into the documentation related to cycling both ways. 2014-04-28 [r1557] Andrew M. Bishop <amb> * web/Makefile: Fix bug with updating XML files in web/data directory (Makefile error). 2014-04-28 [r1556] Andrew M. Bishop <amb> * src/test, src/test/cycle-both-ways.osm (added), src/test/cycle-both-ways.sh (added), src/test/cycle-drive.sh (added), src/test/expected/cycle-both-ways-WP01.txt (added), src/test/expected/cycle-both-ways-WP02.txt (added): Add a test case for the ability to cycle both ways on highways that allow it. Tests the roundabout exit naming as well as shortest route. 2014-04-28 [r1555] Andrew M. Bishop <amb> * src/test/fake-node-with-loop.osm, src/test/prune-straight.osm, src/test/roundabout-waypoints.osm: Remove unneeded tag from <osm> XML element. 2014-04-27 [r1553-1554] Andrew M. Bishop <amb> * src/test, src/test/expected/fake-node-with-loop-WP01.txt (added), src/test/expected/fake-node-with-loop-WP02.txt (added), src/test/fake-node-with-loop.osm (added), src/test/fake-node-with-loop.sh (added): Add test case for the bug with particular arrangement of a fake node (waypoint in middle of segment) and a roundabout. * src/optimiser.c, src/segments.h: Fix bug with particular arrangement of a fake node (waypoint in middle of segment) and a roundabout. The FindFinishRoutes() function was invalidly allowing a U-turn which the later parts of the route calculation didn't and therefore failed to find a route. 2014-04-26 [r1552] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/installation.html, web/www/routino/search.cgi, web/www/routino/search.pl: Correct the list of Perl modules required to be installed to use the search function. 2014-04-24 [r1551] Andrew M. Bishop <amb> * xml/scripts/drive.pl, xml/scripts/walk.pl: Omit some more properties from the special case tagging rules. 2014-04-14 [r1550] Andrew M. Bishop <amb> * src/optimiser.c: Revert r1462 which makes no noticeable difference to the speed in normal operation but makes a lot of difference for databases created with the special "drive" tagging rules. 2014-04-14 [r1549] Andrew M. Bishop <amb> * src/router.c: Check the number of waypoints after considering the --help and --help-profile options. 2014-04-12 [r1548] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Disable the route calculation buttons if fewer than two waypoints are active (more cases). 2014-04-12 [r1545-1547] Andrew M. Bishop <amb> * web/Makefile: Automatically update the translated files if the translation files or HTML templates change. * web/translations/router.html, web/www/routino/router.css, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Disable the route calculation buttons if fewer than two waypoints are active. * src/router.c: Refuse to calculate a route if fewer than two waypoints are specified. 2014-04-08 [r1544] Andrew M. Bishop <amb> * web/translations/translate.pl: Make script work with older versions of Perl. 2014-04-06 [r1543] Andrew M. Bishop <amb> * src/output.c: Change routing instructions if on a bicycle and cyclebothways is enabled on the highways at the junctions (e.g. different count of roundabout exits). 2014-04-05 [r1540-1542] Andrew M. Bishop <amb> * src/test, src/test/expected/roundabout-waypoints-WP01.txt (added), src/test/expected/roundabout-waypoints-WP02.txt (added), src/test/expected/roundabout-waypoints-WP03.txt (added), src/test/expected/roundabout-waypoints-WP04.txt (added), src/test/expected/roundabout-waypoints-WP05.txt (added), src/test/expected/roundabout-waypoints-WP06.txt (added), src/test/expected/roundabout-waypoints-WP07.txt (added), src/test/roundabout-waypoints.osm (added), src/test/roundabout-waypoints.sh (added): Add test case for router error when waypoint is on a roundabout. [Test case also unintentionally detected the super-segment merging bug.] * src/test/Makefile: Compile programs before running tests (fix Makefile bug). * src/superx.c: Fix bug with merging super-segments and segments - an improvement on fix that was applied in version 2.7. 2014-04-04 [r1539] Andrew M. Bishop <amb> * src/output.c: Fix router error when waypoint is on a roundabout (stops crash). 2014-04-02 [r1537-1538] Andrew M. Bishop <amb> * web/translations/translate.pl: Don't use HTML character entity encoding for UTF-8 characters in the HTML. * web/translations/translation.de.txt, web/translations/translation.fr.txt, web/translations/translation.nl.txt, web/translations/translation.ru.txt: Trivial changes to the translation files to put them all into the same order. 2014-04-01 [r1536] Andrew M. Bishop <amb> * web/translations/router.html, web/translations/translate.pl, web/translations/translation.ru.txt, web/translations/translations-body.xml, web/translations/visualiser.html: Use '~~' delimiters in the templates for the special-case replacement strings (like the language name). 2014-03-31 [r1535] Andrew M. Bishop <amb> * web/translations/router.html, web/translations/translate.pl, web/translations/visualiser.html: Use '$$' delimiters in the templates for the multi-line replacement strings (to match the files of translation phrases). 2014-03-25 [r1534] Andrew M. Bishop <amb> * web/translations/translation.ru.txt, web/www/routino, xml/routino-translations.xml: Add Russian translations submitted via http://www.routino.org/translations/ around 2014-03-23. 2014-03-24 [r1533] Andrew M. Bishop <amb> * web/translations/translate.pl, web/translations/translation.de.txt, web/translations/translation.en.txt, web/translations/translation.fr.txt, web/translations/translation.nl.txt, web/translations/translation.ru.txt (added), web/translations/translations-body.xml (added), web/translations/translations-head.xml (added), web/translations/translations-tail.xml (added): Create the routino-translations.xml file from the translated language files in the same way as the HTML. Reverse engineer the existing XML file into the translation files for the languages. 2014-03-23 [r1532] Andrew M. Bishop <amb> * doc/README.txt, doc/html/readme.html: Fixed typo in subversion command line example. 2014-03-22 Andrew M. Bishop <amb> Version 2.7 released. 2014-03-22 [r1529-1530] Andrew M. Bishop <amb> * FILES, doc/NEWS.txt, doc/README.txt, doc/html/readme.html: Updated for new release. * doc/INSTALL.txt: Fix missing text when translated from HTML to plain text. 2014-03-22 [r1528] Andrew M. Bishop <amb> * doc/Makefile, extras/find-fixme/Makefile, extras/tagmodifier/Makefile, src/Makefile, src/test/Makefile, src/xml/Makefile, web/Makefile, xml/Makefile: Another iteration through the Makefiles with some small changes. 2014-03-18 [r1527] Andrew M. Bishop <amb> * src/profiles.c, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Run jshint again and fix some recently added changes. 2014-03-17 [r1525-1526] Andrew M. Bishop <amb> * src/osmo5mparse.c, src/osmparser.h, src/osmpbfparse.c: Make two global functions local to the files that contain them. * src/errorlog.h, src/tagging.c: Fix some invalid function comments. 2014-03-15 [r1524] Andrew M. Bishop <amb> * web/translations/translate.pl, web/translations/translation.de.txt: Store the translations as UTF-8 in the text files and convert to HTML character entities when writing the HTML. 2014-03-11 [r1523] Andrew M. Bishop <amb> * Makefile, Makefile.conf, doc/Makefile, extras/find-fixme/Makefile, extras/tagmodifier/Makefile, src/Makefile, web/Makefile (added), xml/Makefile: Update the Makefiles by creating one in the web directory and moving parts from the src, doc and xml Makefiles into it. 2014-03-11 [r1522] Andrew M. Bishop <amb> * web/www/routino: Ignore the translated HTML files. 2014-03-08 [r1521] Andrew M. Bishop <amb> * web/translations (added), web/translations/router.html (added), web/translations/translate.pl (added), web/translations/translation.de.txt (added), web/translations/translation.en.txt (added), web/translations/translation.fr.txt (added), web/translations/translation.nl.txt (added), web/translations/visualiser.html (added), web/www/routino/router.html.de (removed), web/www/routino/router.html.en (removed), web/www/routino/router.html.fr (removed), web/www/routino/router.html.nl (removed), web/www/routino/visualiser.html.en (removed): Create the router and visualiser HTML files from templates and lists of translated phrases. 2014-03-08 [r1520] Andrew M. Bishop <amb> * extras/errorlog/summarise-log.pl, extras/find-fixme/web/www/fixme.cgi, extras/plot-time/plot-planetsplitter-time.pl, src/test/waypoints.pl, web/www/routino/results.cgi, web/www/routino/router.cgi, web/www/routino/router.pl, web/www/routino/search.cgi, web/www/routino/search.pl, web/www/routino/statistics.cgi, web/www/routino/update-profiles.pl, web/www/routino/visualiser.cgi, xml/scripts/drive.pl, xml/scripts/ride.pl, xml/scripts/walk.pl: Update all Perl scripts to "use strict". 2014-03-08 [r1518-1519] Andrew M. Bishop <amb> * src/xmlparse.h: Print the XML line number using the correct formatting for a uint64_t type. * src/files.c: Don't ignore the return value of the write() function call. 2014-03-01 [r1516] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/installation.html, extras/find-fixme/web/www/fixme.openlayers.js, web/www/openlayers/install.sh, web/www/routino/router.openlayers.js, web/www/routino/visualiser.openlayers.js: Updated to version 2.13.1 of OpenLayers (also 2.12 still supported). 2014-02-23 [r1515] Andrew M. Bishop <amb> * web/www/routino/icons/waypoint-left.png (added), web/www/routino/icons/waypoint-right.png (added), web/www/routino/router.html.de, web/www/routino/router.html.en, web/www/routino/router.html.fr, web/www/routino/router.html.nl, web/www/routino/router.leaflet.js, web/www/routino/router.openlayers.js: Add buttons to allow increasing/decreasing the transport properties and preferences (to help on tablet devices where typing a number in a box is hard). 2014-02-22 [r1514] Andrew M. Bishop <amb> * extras/tagmodifier/README.txt, extras/tagmodifier/tagmodifier.c, src/uncompress.h, doc/html/installation.html, doc/html/usage.html, Makefile.conf, src/planetsplitter.c, src/uncompress.c, doc/USAGE.txt, extras/find-fixme/README.txt, doc/INSTALL.txt, extras/find-fixme/fixme-finder.c: Add the option for automatic uncompression of .xz compressed files (not enabled by default in Makefile.conf). 2014-02-22 [r1513] Andrew M. Bishop <amb> * web/data/create.sh: Downloads from GeoFabrik only and URLs changed. 2014-02-22 [r1512] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/installation.html: Clarify that gzip support is required for some PBF files. Clarify that multi-threading, gzip and bzip2 are enabled by default at compilation time. 2014-02-02 [r1511] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Add some synonyms for "cycleway=opposite_lane". 2014-02-02 [r1510] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Handle "access=bus" like "access=psv". 2014-02-01 [r1509] Andrew M. Bishop <amb> * web/www/routino/maploader.js: Ensure that all Javascript files are loaded before calling the callbacks (better implementation). 2014-02-01 [r1508] Andrew M. Bishop <amb> * web/www/routino/maploader.js: Ensure that all Javascript files are loaded before calling the callbacks. 2014-02-01 [r1507] Andrew M. Bishop <amb> * web/www/routino/router.openlayers.js, web/www/routino/router.leaflet.js: Allow mouse clicks in the router result description to popup the details and not just mouseovers. Hopefully this should work better for touch devices. 2014-01-31 [r1506] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.leaflet.js, extras/find-fixme/web/www/fixme.openlayers.js: Handle the new format XML (using ''' instead of '''). 2014-01-31 [r1505] Andrew M. Bishop <amb> * src/xmlparse.c, src/output.c: Output HTML4 strict DTD compliant HTML (fix bug with using ''' instead of '''). 2014-01-30 [r1504] Andrew M. Bishop <amb> * doc/html/usage.html, doc/USAGE.txt, src/router.c: Add an option to calculate a circular route. 2014-01-30 [r1503] Andrew M. Bishop <amb> * doc/USAGE.txt, src/router.c, doc/html/usage.html: Add an option to calculate a route in the reverse order. 2014-01-30 [r1502] Andrew M. Bishop <amb> * src/types.h: Make the type conversion inline functions static so that compiling with -O0 still works. 2014-01-29 [r1501] Andrew M. Bishop <amb> * src/results.h, src/types.h, src/output.c, src/router.c, src/results.c: Refactor the code so that the Results data type has the start and finish waypoints defined within it and the array passed to the PrintRoute() function doesn't have holes in it. 2014-01-28 [r1500] Andrew M. Bishop <amb> * src/router.c: Remove ancient option that allowed latitude and longitude to be specified on the command line without the --lat<n> or --lon<n> options. 2014-01-28 [r1499] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, extras/find-fixme/web/www/fixme.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/visualiser.leaflet.js, extras/find-fixme/web/www/fixme.openlayers.js, web/www/routino/visualiser.openlayers.js: Add close buttons to the popup boxes. 2014-01-27 [r1498] Andrew M. Bishop <amb> * web/www/routino/visualiser.html.en, src/profiles.c: Allow displaying the cyclebothways property in the visualiser. 2014-01-27 [r1497] Andrew M. Bishop <amb> * doc/html/tagging.html, src/types.c, xml/routino-tagging.xml, src/segments.c, xml/routino-profiles.xml, src/types.h, doc/TAGGING.txt, src/optimiser.c, src/osmparser.c: Detect the "cycleway=opposite_lane" tag and allow bicycles to travel in both directions along those highways. Based on parts of https://github.com/cgravier/routino-2.6-bikeopposite-elevation/commit/47d68b37f1ea0d2f967ea6aa1555991747491200 https://github.com/cgravier/routino-2.6-bikeopposite-elevation/commit/764832f2671e6f6d8176be65cea3992bd1a488d3 https://github.com/cgravier/routino-2.6-bikeopposite-elevation/commit/37af908880c045309fba1125c4d683f6925f7d25 by Christophe Collard. 2014-01-26 [r1496] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.leaflet.js, web/www/routino/router.openlayers.js, web/www/routino/visualiser.leaflet.js, extras/find-fixme/web/www/fixme.openlayers.js, web/www/routino/visualiser.openlayers.js, web/www/routino/router.leaflet.js: Fix bugs in displayStatus() function after jshint tidy-up. 2014-01-26 [r1495] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, extras/find-fixme/web/www/fixme.leaflet.js, web/www/routino/visualiser.leaflet.js: Fix bug with Leaflet map startup. 2014-01-26 [r1494] Andrew M. Bishop <amb> * web/www/routino/mapprops.js: Reformat the whitespace. 2014-01-26 [r1493] Andrew M. Bishop <amb> * web/www/routino/router.leaflet.js, extras/find-fixme/web/www/fixme.leaflet.js, src/profiles.c, web/www/routino/router.openlayers.js, web/www/routino/visualiser.leaflet.js, web/www/routino/maploader.js, extras/find-fixme/web/www/fixme.openlayers.js, web/www/routino/page-elements.js, web/www/routino/visualiser.openlayers.js: Run jshint again and update some more in the JavaScript. 2014-01-25 [r1492] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/readme.html, web/www/leaflet/install.sh (added), doc/html/installation.html, web/www/leaflet (added), doc/README.txt: Add a script to download Leaflet Javascript and update documentation to match. 2014-01-25 [r1491] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.html, extras/find-fixme/Makefile, web/www/routino/router.html.de, web/www/routino/router.openlayers.js (added), web/www/routino/mapprops.js, web/www/routino/visualiser.leaflet.js (added), web/www/routino/maploader.js (added), extras/find-fixme/web/www/fixme.js (removed), web/www/routino/visualiser.openlayers.js (added), web/www/routino/router.html.en, web/www/routino/router.html.fr, web/www/routino/visualiser.html.en, extras/find-fixme/web/www/fixme.leaflet.js (added), web/www/routino/router.html.nl, web/www/routino/router.js (removed), extras/find-fixme/web/www, extras/find-fixme/web/www/fixme.openlayers.js (added), web/www/routino/visualiser.js (removed), web/www/routino/maplayout.css, web/www/routino/router.leaflet.js (added): Add the option to use Leaflet Javascript library instead of OpenLayers. Dynamically load the appropriate Javascript library based on mapprops.js. 2014-01-16 [r1489-1490] Andrew M. Bishop <amb> * src/superx.c: When merging segments and super-segments ensure that all super-segments are added to the merged list. * src/visualiser.c: When searching for nodes for the visualiser don't exceed the database lat/long limits. 2014-01-13 [r1488] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/router.html.fr (added), web/www/routino/router.html.de, web/www/routino/router.html.nl, xml/routino-translations.xml: French language web page and routing translations based on https://github.com/ocivelo/routino-2.6-bikeopposite-elevation/commit/d426c7ff42e217ca5ace1244afc085c1433843c8 by Christophe Collard. 2014-01-11 [r1487] Andrew M. Bishop <amb> * web/www/routino/router.js, web/www/routino/search.pl, extras/find-fixme/web/www/fixme.js, web/www/routino/visualiser.js, web/www/routino/search.cgi: Change the search CGI to use latmin/max and lonmin/max instead of left, right, top, bottom. Change the Javascript to send the parameters to 5 decimal places only. 2014-01-11 [r1486] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.js, web/www/routino/visualiser.js, web/www/routino/router.html.en, extras/find-fixme/web/www/fixme.html, web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl, web/www/routino/router.js: Update the web page URLs as things change rather than using on(focus|click) action handlers in the HTML that don't work very well. 2014-01-05 [r1485] Andrew M. Bishop <amb> * web/www/routino/maplayout-ie6-bugfixes.css (removed), web/www/routino/maplayout-ie7-bugfixes.css (removed), web/www/routino/router.html.en, extras/find-fixme/web/www/fixme.html, web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl: Remove special support for IE6 and IE7 browsers. 2014-01-05 [r1484] Andrew M. Bishop <amb> * web/www/routino/router.js, extras/find-fixme/web/www/fixme.js, web/www/routino/visualiser.js: Replace the unescape() function with standard decodeURIComponent() function. 2014-01-03 [r1483] Andrew M. Bishop <amb> * web/www/routino/router.js, extras/find-fixme/web/www/fixme.js, web/www/routino/visualiser.js: Run 'jshint' to check for Javascript errors (fix the important ones). 2014-01-03 [r1480-1482] Andrew M. Bishop <amb> * web/www/routino/page-elements.js: Add a new function to hide and show sections (not currently used). * web/www/routino/page-elements.css: Make the tabs and hide/show targets a few pixels wider to make them easier to select. * web/www/routino/router.html.en, web/www/routino/router.html.de, web/www/routino/router.html.nl: Squeeze out a bit more space for the waypoint coords/name. 2014-01-02 [r1479] Andrew M. Bishop <amb> * src/relationsx.h: Fix error in function prototype (argument names switched). 2013-12-31 [r1477-1478] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.js, web/www/routino/visualiser.js, web/www/routino/router.js: Update Javascript to make map tile function more self-contained. * extras/find-fixme/web/www/fixme.html, web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl, web/www/openlayers/routino.cfg, web/www/routino/router.html.en: Update HTML to make it work better on mobile devices (no zooming allowed). 2013-12-31 [r1476] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl: Update HTML ready for HTML5 but keeping HTML4.01 loose DTD (form action attribute must not be empty). 2013-12-31 [r1475] Andrew M. Bishop <amb> * web/www/routino/router.css, extras/find-fixme/web/www/fixme.html, web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl, web/www/routino/router.js, extras/find-fixme/web/www/fixme.css, web/www/routino/visualiser.css, web/www/routino/router.html.en: Update HTML ready for HTML5 but keeping HTML4.01 loose DTD (align attribute and image tags with names are deprecated). 2013-12-31 [r1474] Andrew M. Bishop <amb> * doc/html/readme.html, doc/html/output.html, doc/html/tagging.html, doc/html/installation.html, doc/html/limits.html, doc/html/usage.html, doc/html/algorithm.html, doc/html/configuration.html, doc/html/index.html, doc/html/data.html: Update HTML ready for HTML5 but keeping HTML4.01 strict DTD (anchors with names are deprecated). 2013-12-30 [r1473] Andrew M. Bishop <amb> * doc/html/readme.html, doc/html/data.html: Update some URLs. 2013-12-30 [r1472] Andrew M. Bishop <amb> * web/www/routino/router.html.en, extras/find-fixme/web/www/fixme.html, web/www/routino/index.html, web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl: Fix some changes that were missed from the last set of HTML updates. 2013-12-30 [r1471] Andrew M. Bishop <amb> * doc/html/installation.html: Fix links within the page. 2013-12-30 [r1469-1470] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.html, web/www/routino/index.html, web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl, web/www/routino/router.html.en: Convert map pages to use lower case HTML tags and fix some HTML 4.01 strict DTD errors (but not converted to strict DTD due to use of target attribute on <a> tags). * doc/html/style.css, doc/html/usage.html, doc/html/algorithm.html, doc/html/configuration.html, doc/html/index.html, doc/html/data.html, extras/find-fixme/web/www/index.html, doc/html/readme.html, doc/html/output.html, doc/html/tagging.html, doc/html/installation.html, doc/html/limits.html: Convert documentation to HTML 4.01 strict DTD (from loose DTD). 2013-11-17 [r1468] Andrew M. Bishop <amb> * web/www/routino/router.cgi: Fix bug that did not allow more than 9 waypoints to be routed. 2013-11-13 [r1467] Andrew M. Bishop <amb> * src/osmparser.c: Refactor the length, weight and speed parsing functions a little bit and add some new formats. 2013-09-07 [r1466] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Add the same "access=foot" aliasing to nodes as previously existed for ways. 2013-08-02 [r1465] Andrew M. Bishop <amb> * doc/html/usage.html, doc/USAGE.txt, src/output.c, src/router.c: Add a '--output-stdout' option. 2013-07-31 [r1464] Andrew M. Bishop <amb> * xml/routino-translations.xml: Updated Dutch translations. 2013-07-18 [r1463] Andrew M. Bishop <amb> * src/types.h: Replace the macros for type conversion with inline functions where there is a risk of overflow for normal data. 2013-07-14 [r1462] Andrew M. Bishop <amb> * src/optimiser.c: Removal of some code intended to speed things up but that actually slows things down. 2013-07-12 [r1461] Andrew M. Bishop <amb> * doc/html/algorithm.html, doc/ALGORITHM.txt: Update the algorithm documentation with a description of the algorithm used for finding the shortest path. 2013-07-10 [r1460] Andrew M. Bishop <amb> * Makefile.conf: Add an option to enable debugging symbols. 2013-07-08 [r1459] Andrew M. Bishop <amb> * doc/USAGE.txt: Fix typo in documentation string. 2013-07-08 [r1458] Andrew M. Bishop <amb> * doc/html/usage.html, src/filedumper.c: Fix typo in documentation string. 2013-07-06 Andrew M. Bishop <amb> Version 2.6 released. 2013-07-06 [r1455-1456] Andrew M. Bishop <amb> * FILES: Add some new files for version 2.6. * doc/Makefile, extras/Makefile, src/test/Makefile, src/Makefile, extras/find-fixme/Makefile, Makefile, extras/tagmodifier/Makefile, xml/Makefile: Update some Makefiles for running 'make test' from a clean set of source code. 2013-07-06 [r1454] Andrew M. Bishop <amb> * doc/NEWS.txt, doc/README.txt, FILES, doc/html/readme.html: Update for version 2.6 release. 2013-07-04 [r1453] Andrew M. Bishop <amb> * doc/html/installation.html, doc/INSTALL.txt: Added a 'quick start' set of installation instructions. 2013-07-04 [r1452] Andrew M. Bishop <amb> * web/data/create.sh: Fix error with URL. 2013-07-03 [r1451] Andrew M. Bishop <amb> * src/planetsplitter.c: Revert r1268 which was applied between v2.5 and v2.5.1 and could be the cause of the slight slowdown in version 2.5.1. 2013-07-02 [r1450] Andrew M. Bishop <amb> * src/relationsx.c, src/errorlog.c, src/logerror.c, src/optimiser.c, src/waysx.c, src/xmlparse.c: Fix some comments. 2013-07-02 [r1449] Andrew M. Bishop <amb> * src/logging.c: Fix bug in time printed by --logtime option. 2013-07-02 [r1448] Andrew M. Bishop <amb> * src/segmentsx.c, src/prunex.c, src/segmentsx.h: Revert r1432 because even though it seemed like it should have been faster in slim mode it was actually much slower on the routino.org virtual server. 2013-07-01 [r1447] Andrew M. Bishop <amb> * src/output.c: Small optimisation for calling GetLatLong(). 2013-07-01 [r1446] Andrew M. Bishop <amb> * web/data/create.sh: Fix the URLs in the example download script. 2013-07-01 [r1445] Andrew M. Bishop <amb> * src/xmlparse.c, src/xmlparse.h: Forcing the xmlparse tags to be lower case adds a further speed-up (and was implicitly assumed already in other code). 2013-07-01 [r1444] Andrew M. Bishop <amb> * src/results.h, src/superx.c, src/results.c, src/queue.c: Re-use the Queue and Results data structure for all routes - saves a huge number of malloc/free calls (found by valgrind/callgrind). 2013-06-29 [r1443] Andrew M. Bishop <amb> * src/xmlparse.c: Optimise out most calls to strcasecmp the most-called C library functions (found by valgrind/callgrind). 2013-06-29 [r1442] Andrew M. Bishop <amb> * src/prunex.c: Close file and free memory (found by valgrind). 2013-06-29 [r1441] Andrew M. Bishop <amb> * src/sorting.c: Free allocated memory (found by valgrind). 2013-06-29 [r1440] Andrew M. Bishop <amb> * src/logerror.c: Avoid writing uninitialised to disk (found by valgrind). 2013-06-29 [r1439] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.js, extras/find-fixme/web/www/fixme.html: Update highlight size and help text as was done with visualiser. 2013-06-29 [r1438] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl: Add some help to the visualiser web page and slightly reformatted the help on the router web pages. 2013-06-29 [r1435-1437] Andrew M. Bishop <amb> * web/www/routino/visualiser.js: Increase the size of the nodes in the super-nodes/segments display to make them clickable. * web/www/routino/visualiser.cgi: Increase the maximum size that will be returned by CGI. * web/www/routino/visualiser.js: Fix bug with visualiser failing to run failure callback in case of CGI error. 2013-06-29 [r1433-1434] Andrew M. Bishop <amb> * web/www/routino/visualiser.js: Make the node highlights smaller (to match the segment highlight width). * src/filedumper.c: Print the fake XML for the visualiser with special routino:* top-level tag names. 2013-06-28 [r1431-1432] Andrew M. Bishop <amb> * src/segmentsx.c, src/prunex.c, src/segmentsx.h: Keep the next2 pointer in memory while pruning rather than in the segmentx object. * src/prunex.h, src/planetsplitter.c, src/segmentsx.c, src/prunex.c, src/segmentsx.h, doc/DATALIFE.txt: Revert the last three changes because r1430 didn't work and r1428+r1429 didn't give any speed advantage and was possibly marginally slower. 2013-06-28 [r1430] Andrew M. Bishop <amb> * src/segmentsx.c: The IndexSegments() function can now process the file in forward order rather than reverse. 2013-06-27 [r1429] Andrew M. Bishop <amb> * src/segmentsx.c: Fixed error with last checkin. 2013-06-27 [r1428] Andrew M. Bishop <amb> * src/segmentsx.c, src/prunex.c, src/segmentsx.h, doc/DATALIFE.txt, src/prunex.h, src/planetsplitter.c: Put the next1 pointer in the segmentx object rather than in-memory. 2013-06-27 [r1427] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/relationsx.h, src/segmentsx.c, src/nodesx.c, src/segmentsx.h: Revert the last change because, paradoxically, it was faster to create the database (as expected) but slower to route. 2013-06-26 [r1426] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/relationsx.h, src/segmentsx.c, src/nodesx.c, src/segmentsx.h: Sort the nodes geographically at the beginning rather than at the end. 2013-06-26 [r1425] Andrew M. Bishop <amb> * doc/html/installation.html, doc/INSTALL.txt: Add some more details about configuring Apache. 2013-06-25 [r1424] Andrew M. Bishop <amb> * src/relationsx.c, src/planetsplitter.c, src/nodesx.c, doc/DATALIFE.txt: Remove one usage of the nodesx->gdata array. Remove one call of the IndexSegments() function. Update the DATALIFE.txt file with both and the previous changes to mapped files and add a new column for segmentx->next2. 2013-06-25 [r1423] Andrew M. Bishop <amb> * src/superx.c: Change the ChooseSuperNodes() and MergeSuperSegments() functions to read through the file instead of mapping the data to help slim mode (since the nodes in the first case and segments in the second case are read sequentially). 2013-06-24 [r1422] Andrew M. Bishop <amb> * src/segmentsx.c: Change the IndexSegments() function so that in slim mode larger chunks are read from the file (since it reads sequentially but in reverse through the file). 2013-06-24 [r1420-1421] Andrew M. Bishop <amb> * src/files.c: Increase the buffer to 4kB from 1kB. * src/osmo5mparse.c, src/waysx.c, src/nodesx.c, src/osmpbfparse.c, src/prunex.c, src/superx.c, src/relationsx.c: Move some printf_first() messages to the front of the function and printf_last() function to the end of the function. 2013-06-23 [r1419] Andrew M. Bishop <amb> * src/ways.h: Fix error in slim mode WayName() function. 2013-06-22 [r1412-1418] Andrew M. Bishop <amb> * src/files.c, src/files.h: Make the changes required to handle the new function names from the last few checkins. * src/prunex.c: Use SlimMapFile(), SlimUnmapFile(), SlimFetch() and SlimReplace() [see earlier log message] and also refactor the code so that the additional ways are placed in a separate file using the Slim*() functions rather than being appended to the open (or mapped) way file. * src/ways.h: Use SlimFetch() instead of SeekReadFileUnbuffered() [see previous log message] and also refactor the code for reading the way name from file. * src/errorlog.h, src/relations.c, src/ways.c, src/segments.c, src/cache.h, src/nodes.c, src/errorlog.c: Use SlimMapFile() and SlimUnmapFile() [see previous log message] and also use SlimFetch() instead of SeekReadFileUnbuffered() and SlimReplace() instead of SeekWriteFileUnbuffered() to hide the internals of the slim mode. * src/superx.c, src/relationsx.c, src/waysx.c, src/segmentsx.c, src/errorlogx.c: Use SlimMapFile() and SlimUnmapFile() as the function names for the slim mode of operation to open and close the files (to hide the fact that they are files being opened for reading or writing unbuffered). * src/errorlogx.c: Use buffered file accesses for appending the error strings to the binary file. * src/planetsplitter.c, src/tagging.c, src/translations.c, extras/find-fixme/fixme-finder.c, extras/tagmodifier/tagmodifier.c, src/profiles.c: Create simple OpenFile() and CloseFile() functions for those files which are used by the parsers (they just call open() and close() internally). 2013-06-22 [r1411] Andrew M. Bishop <amb> * src/logerror.c: Fix for closing binary error file that only shows up after the recent file function changes. 2013-06-21 [r1410] Andrew M. Bishop <amb> * src/files.c, extras/tagmodifier/tagmodifier.c, src/files.h, src/cache.h, src/nodes.c, src/planetsplitter.c, src/waysx.c, src/segmentsx.c, src/tagging.c, src/prunex.c, src/translations.c, extras/find-fixme/fixme-finder.c, src/errorlogx.c, src/profiles.c, src/ways.c, src/filedumperx.c, src/segments.c, src/superx.c, src/ways.h, src/relationsx.c, src/errorlog.c, src/errorlog.h, src/relations.c: Rename the functions for unbuffered file access to make this clear. 2013-06-21 [r1409] Andrew M. Bishop <amb> * src/waysx.c, src/segmentsx.c, src/nodesx.c, src/errorlogx.c, src/sorting.c, src/relationsx.c: Use the new buffered functions in the filesort functions. 2013-06-21 [r1407-1408] Andrew M. Bishop <amb> * src/segmentsx.c, src/nodesx.c, src/prunex.c, src/errorlogx.c, src/filedumperx.c, src/relationsx.c, src/logerror.c, src/waysx.c: Use the new functions for buffering while reading when looping through files other than the ones already done that use the FILESORT_VARINT method of storing data. * src/files.c, src/files.h: Add a new function for seeking in one of the buffered files. 2013-06-20 [r1406] Andrew M. Bishop <amb> * src/errorlogx.c, src/files.h, src/relationsx.c, src/waysx.c, src/nodesx.c, src/files.c: Rename the function that skips forward in a buffered file to avoid confusion. 2013-06-20 [r1404-1405] Andrew M. Bishop <amb> * src/relationsx.c, src/waysx.c, src/nodesx.c, src/errorlogx.c, src/filedumperx.c: Use the new functions for buffering while reading when looping through files that use the FILESORT_VARINT method of storing data. * src/files.c, src/files.h: Add new functions for buffering when reading and also allow seeking in one of these buffered files. 2013-06-20 [r1403] Andrew M. Bishop <amb> * src/files.c: Fix the non-buffered close function assertion and re-factor the code for buffered reading (although not used yet). 2013-06-19 [r1401-1402] Andrew M. Bishop <amb> * src/nodesx.c, src/relationsx.c, src/waysx.c, src/segmentsx.c: Use the buffered write functions when creating the nodes, segments, ways and relation raw files. * src/files.c, src/files.h: Add functions to read and write file descriptors with buffering. 2013-06-19 [r1400] Andrew M. Bishop <amb> * extras/find-fixme/fixme-finder.c, src/logging.c, src/planetsplitter.c: Bug fix for the change to the --logtime option functions. 2013-06-19 [r1399] Andrew M. Bishop <amb> * src/files.h: Split the function prototypes into two groups for the ones in files.c and the inline ones in files.h. 2013-06-17 [r1398] Andrew M. Bishop <amb> * extras/find-fixme/fixme-finder.c, src/logging.c, src/planetsplitter.c, src/logging.h: Change the --logtime internals so that programs don't need to store their start time themselves. 2013-06-15 [r1397] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Add some more barriers which are too generic to warn about and fix spelling of motorcycle_barrier. 2013-06-13 [r1396] Andrew M. Bishop <amb> * doc/html/usage.html, doc/USAGE.txt: Document that --errorlog and --keep together will create the binary database of errors. 2013-06-13 [r1395] Andrew M. Bishop <amb> * src/errorlogx.c, src/logerror.c, src/logging.h: Separate out the type and id parts of the errorlogobject. 2013-06-12 [r1394] Andrew M. Bishop <amb> * web/www/routino/mapprops.js, doc/html/installation.html, extras/find-fixme/web/www/fixme.js, web/www/routino/visualiser.js, doc/INSTALL.txt: Add links to the OpenStreetMap browse URLs from the error logs. 2013-06-11 [r1393] Andrew M. Bishop <amb> * extras/find-fixme/web/www/fixme.js, extras/find-fixme/web/www/fixme.cgi, extras/find-fixme/web/www/fixme.html: Put the data tab back and display the statistics in it. 2013-06-10 [r1391-1392] Andrew M. Bishop <amb> * src/errorlogx.c: Fix typo in program logging. * doc/html/usage.html, doc/USAGE.txt: Fix typo in documentation. 2013-06-06 [r1387-1390] Andrew M. Bishop <amb> * src/Makefile: Tidy up the compilation and linking flags again. * Makefile.conf: Tidy up the compilation and linking flags again. * src/test/Makefile, src/test/is-fast-math.c (added), src/test, src/test/start-1-finish.sh, src/test/a-b-c.sh, src/test/a-b.sh: When compiled with -ffast-math don't expect the results to match exactly, display the differences. * src/test/only-split.sh: Remove a debugging message. 2013-06-06 [r1386] Andrew M. Bishop <amb> * src/test/expected/dead-ends-WP08.txt, src/test/expected/dead-ends-WP09.txt, src/test/dead-ends.osm, src/test/expected/node-restrictions-WP08.txt, src/test/expected/dead-ends-WP01.txt, src/test/expected/dead-ends-WP10.txt, src/test/expected/dead-ends-WP02.txt, src/test/expected/dead-ends-WP11.txt, src/test/expected/dead-ends-WP03.txt, src/test/expected/dead-ends-WP04.txt, src/test/expected/dead-ends-WP05.txt, src/test/expected/dead-ends-WP06.txt, src/test/expected/dead-ends-WP07.txt: Change test cases so that they don't show differences due to pruning or the last checkin for divide by zero which changed behaviour in trivial case. 2013-06-06 [r1385] Andrew M. Bishop <amb> * src/prunex.c, src/nodes.c, src/fakes.c: Fix some code that could, potentially, have given a divide by zero and which therefore behaves differently with FPU and -ffast-math compilation options. 2013-06-06 [r1384] Andrew M. Bishop <amb> * src/translations.c: Fix bug if using the built-in translations for GPX route files (present since v2.0). Make a few other translations match the ones in the XML file. 2013-06-05 [r1383] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/nodesx.c: Update the node id just before sorting geographically rather than relying on the pruning process to do it. 2013-06-05 [r1381-1382] Andrew M. Bishop <amb> * web/www/routino/index.html, doc/Makefile: Copy the style.css into the web page documentation directory, fix the link to it from index.html. * extras/find-fixme/Makefile, extras/find-fixme/web/www, extras/find-fixme/web/www/paths.pl, extras/find-fixme/web/www/index.html (added), extras/find-fixme/web/www/fixme.html: Add an index.html page to redirect to fixme.html, copy in a style.css file, slightly change the web page titles. 2013-06-04 [r1380] Andrew M. Bishop <amb> * src/waysx.c, src/waysx.h, src/prunex.c: Remember what types of transports we have so that we don't spend time pruning for transport types we don't have. 2013-06-04 [r1379] Andrew M. Bishop <amb> * src/tagging.c: Unconditionally execute the tagging rules within '<if> ... </if>' even if there are no input tags to match against the match-all rule. 2013-06-03 [r1377-1378] Andrew M. Bishop <amb> * extras/find-fixme/fixme-dumper.c, extras/find-fixme/README.txt: Reinstate the --statistics option. * extras/find-fixme/web/www/fixme.js: Nicely format the item tag information. 2013-06-03 [r1374-1376] Andrew M. Bishop <amb> * extras/find-fixme/fixme.xml, extras/find-fixme/README.txt: Make it easier to select arbitrary tags and store them. * extras/find-fixme/osmparser.c: Store a whole XML-like item in the log file. * src/tagging.c, src/tagging.h: Add a new function to convert a TagList into an HTML-like string. 2013-06-03 [r1373] Andrew M. Bishop <amb> * Makefile.conf: Use the -ffast-math compilation option (trivial changes to estimated journey times and distances). 2013-06-03 [r1371-1372] Andrew M. Bishop <amb> * web/bin: Don't ignore tagmodifier (not put here any more). * extras/find-fixme/Makefile, extras/tagmodifier/Makefile: Compile all of src directory before starting here. 2013-06-03 [r1370] Andrew M. Bishop <amb> * src/osmparser.c, src/relationsx.h, extras/find-fixme/osmparser.c, src/errorlogx.c, src/relationsx.c: Write relation nodes into the file as well as ways and relations. 2013-06-01 [r1367-1369] Andrew M. Bishop <amb> * extras/errorlog/README.txt: Make the README files more consistent with each other in style. * extras/README.txt, extras/plot-time/README.txt, extras/tagmodifier/README.txt: Make the README files more consistent with each other in style. * extras/find-fixme/fixme-dumper.c (added), extras/find-fixme/web/www/fixme.js (added), extras/find-fixme/web/bin (added), extras/find-fixme/web/data (added), extras/find-fixme/web/www/paths.pl (added), extras/find-fixme/osmparser.c (added), extras/find-fixme/fixme-finder.c (added), extras/find-fixme/web/www/fixme.css (added), extras/find-fixme (added), extras/find-fixme/web/www (added), extras/find-fixme/fixme.xml (added), extras/find-fixme/web/www/fixme.cgi (added), extras/find-fixme/README.txt (added), extras/find-fixme/web/www/fixme.html (added), extras/find-fixme/web (added), extras/find-fixme/Makefile (added): A tool to search an OSM file for "fixme" tags to create a database and display them on an interactive map. 2013-06-01 [r1366] Andrew M. Bishop <amb> * src/planetsplitter.c: Fix minor error with usage message. 2013-06-01 [r1363-1365] Andrew M. Bishop <amb> * extras/tagmodifier/README.txt, extras/tagmodifier/Makefile: Compile all main Routino files before trying to build tagmodifier. Small changes to the README.txt file. * src/Makefile: Use the WEBBINDIR variable rather than a hard-coded path. * doc/Makefile: Make the Makefile clearer with respect to the copying of HTML files to the web directory. 2013-06-01 [r1361-1362] Andrew M. Bishop <amb> * src/errorlogx.h, src/planetsplitter.c, src/errorlogx.c: Make the functions for processing error logs more like the ones for nodes, ways and relations. * src/waysx.c, src/nodesx.c, src/relationsx.c: Store the number of kept nodes, ways and relations when first sorted. 2013-06-01 [r1360] Andrew M. Bishop <amb> * web/www/routino/visualiser.cgi: Return an error if neither type of recognised request was made. 2013-05-31 [r1359] Andrew M. Bishop <amb> * src/planetsplitter.c, src/router.c: Use exit(EXIT_FAILURE) instead of return(1). 2013-05-31 [r1357-1358] Andrew M. Bishop <amb> * extras/README.txt, extras/plot-time/README.txt (added), extras/plot-time/plot-planetsplitter-time.pl (added), extras/plot-time (added): Add a Perl script that allows plotting a graph of the time taken to run planetsplitter. * extras/errorlog/README.txt (added): Add a README file for the summarise-log.pl script. 2013-05-31 [r1356] Andrew M. Bishop <amb> * src/osmo5mparse.c, src/osmxmlparse.c, src/osmparser.c, src/osmparser.h, src/osmpbfparse.c: Move some functions about so that osmparser.c can be replaced for other types of parsing. 2013-05-31 [r1355] Andrew M. Bishop <amb> * src/segmentsx.c, src/planetsplitter.c, src/waysx.c: Small changes to comments and log messages. 2013-05-30 [r1354] Andrew M. Bishop <amb> * src/segmentsx.c: Don't de-duplicate when sorting segments (now done in ProcessSegments() function). 2013-05-30 [r1353] Andrew M. Bishop <amb> * src/relationsx.c, src/planetsplitter.c, src/relationsx.h, doc/DATALIFE.txt: Merge the ProcessTurnRelations1() and ProcessTurnRelations2() functions into a single one now that segment processing is already complete. 2013-05-30 [r1352] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/planetsplitter.c: Move the first IndexSegments() function call earlier in the sequence. 2013-05-30 [r1351] Andrew M. Bishop <amb> * src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, doc/DATALIFE.txt: Merge the RemoveBadSegments() and MeasureSegments() functions. Saves one read/write iteration through the segments file. 2013-05-30 [r1350] Andrew M. Bishop <amb> * src/planetsplitter.c, src/segmentsx.c, src/nodesx.c, src/segmentsx.h, doc/DATALIFE.txt, src/nodesx.h, src/relationsx.c: Delete the non-highway nodes by searching for them in the ways rather than marking them when processing the segments. 2013-05-29 [r1349] Andrew M. Bishop <amb> * doc/DATALIFE.txt, extras/errorlog/summarise-log.pl, src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/segmentsx.c, src/nodesx.c, src/waysx.h, src/segmentsx.h: Simplify the segments by using the node and way index instead of node and way id which avoids lots of IndexNodeX() lookups. Move some other code around to cope with it. 2013-05-27 [r1348] Andrew M. Bishop <amb> * src/planetsplitter.c, src/waysx.c, src/waysx.h, doc/DATALIFE.txt: Simplify the sorting of the way names (only sort the names, not all the ways twice), merge the generating of segments and separation of way names. 2013-05-27 [r1347] Andrew M. Bishop <amb> * src/osmparser.c, src/waysx.c, src/segmentsx.c: Redistributed error log messages from osmparser way handling. 2013-05-26 [r1346] Andrew M. Bishop <amb> * extras/errorlog/summarise-log.pl (added), extras/errorlog (added), extras/README.txt, web/bin/summarise-log.pl (removed): Move the summarise-log.pl script into the extras directory. 2013-05-26 [r1345] Andrew M. Bishop <amb> * extras/tagmodifier/README.txt (added), extras/tagmodifier/tagmodifier.c (added), extras/tagmodifier/Makefile (added), doc/html/installation.html, extras/tagmodifier (added), doc/html/usage.html, extras/README.txt, src/tagmodifier.c (removed), src/Makefile, src, doc/USAGE.txt, doc/INSTALL.txt: Move the tagmodifier program into the extras directory. 2013-05-26 [r1344] Andrew M. Bishop <amb> * extras (added), extras/README.txt (added), extras/Makefile (added): Create a new directory for extra (non-essential) programs 2013-05-26 [r1343] Andrew M. Bishop <amb> * doc/Makefile, src/test/Makefile, src/Makefile, src/xml/Makefile, doc/INSTALL.txt, Makefile, doc/html/installation.html, xml/Makefile, Makefile.conf (added): Re-organise the Makefiles so that all configuration information is one of them (Makefile.conf at the top level) rather than being spread between them. 2013-05-25 [r1342] Andrew M. Bishop <amb> * src/errorlogx.c, src/relationsx.c, src/relationsx.h: Rename the route relation structure parameters (r* -> rr*) to match the turn relation parameter names (tr*). 2013-05-25 [r1341] Andrew M. Bishop <amb> * src/errorlogx.c, src/relationsx.c, src/relationsx.h: Finished allocating coordinates to error logs, nodes in preference to ways in preference to relations. 2013-05-23 [r1340] Andrew M. Bishop <amb> * doc/USAGE.txt, src/filedumperx.c, doc/html/usage.html: There are no segments stored after parsing so cannot be dumper by filedumperx. 2013-05-23 [r1339] Andrew M. Bishop <amb> * src/superx.c, src/types.h, src/planetsplitter.c, src/osmparser.c, src/waysx.c, src/segmentsx.c, src/osmparser.h, src/waysx.h, src/segmentsx.h, doc/DATALIFE.txt, src/types.c: Don't create segments when parsing input file but create the segments later using the nodes stored in the ways file. This makes applying changes simpler (segments file is not kept with the --keep option) and handling changed ways is simpler than changed segments. 2013-05-22 [r1338] Andrew M. Bishop <amb> * src/osmparser.c, src/waysx.c, src/waysx.h, src/errorlogx.c, src/filedumperx.c: Store the list of nodes in the raw ways file for use by the errorlog functions. 2013-05-21 [r1337] Andrew M. Bishop <amb> * src/sorting.c: Don't waste memory in filesort_vary() when the pre-sort function drops the data. 2013-05-20 [r1336] Andrew M. Bishop <amb> * src/osmparser.c: Store more logerror information even for items that are discarded to allow them to be located geographically. 2013-05-20 [r1335] Andrew M. Bishop <amb> * src/xml/Makefile: Update CLFLAGS and LDFLAGS. 2013-05-18 [r1334] Andrew M. Bishop <amb> * web/www/routino/router.html.en, doc/INSTALL.txt, web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl, web/www/routino/router.js, web/www/routino/mapprops.js, doc/html/installation.html, web/www/routino/visualiser.js: Make the OSM editor URL be configurable in the mapprops.js file. 2013-05-18 [r1333] Andrew M. Bishop <amb> * web/www/openlayers/routino.cfg: Need to include OpenLayers/Control/SelectFeature.js when building OpenLayers.js. 2013-05-18 [r1332] Andrew M. Bishop <amb> * web/www/routino/visualiser.css, web/www/routino/visualiser.js: Put the popup colours in the Javascript, not CSS. Set the popup font (fixed) and size (smaller). 2013-05-18 [r1330-1331] Andrew M. Bishop <amb> * src/visualiser.c: Remove unused header file. * src/filedumper.c, doc/USAGE.txt, web/www/routino/visualiser.cgi, doc/html/usage.html: Create specific HTML formatted output from filedumper for the visualiser web page. 2013-05-18 [r1329] Andrew M. Bishop <amb> * web/www/routino/visualiser.cgi, src/visualiser.c, web/www/routino/visualiser.js: Add the ability to select any item displayed in the visualiser and display information about it in a popup. 2013-05-18 [r1327-1328] Andrew M. Bishop <amb> * web/www/routino/router.js, web/www/routino/visualiser.js: Don't display the marker layers in the layer switcher control. * web/www/routino/visualiser.js: Store the feature attributes using the feature.attributes object. 2013-05-18 [r1326] Andrew M. Bishop <amb> * web/www/routino/visualiser.js, web/www/routino/visualiser.css: Change to using a popup like in the router and highlight the selected item when the popup is displayed. 2013-05-17 [r1324-1325] Andrew M. Bishop <amb> * web/www/routino/visualiser.html.en: Selecting the radio buttons updates the display. * web/www/routino/router.html.de, web/www/routino/router.html.nl, web/www/routino/router.html.en: Added some missing ';' to the Javascript actions in the HTML. 2013-05-17 [r1323] Andrew M. Bishop <amb> * doc/html/usage.html, doc/USAGE.txt: Add the documentation for the change to the filedumper program. 2013-05-17 [r1322] Andrew M. Bishop <amb> * src/visualiser.c: Limit the error log outputs to the geographical ones and make the strings HTML safe. 2013-05-17 [r1321] Andrew M. Bishop <amb> * src/errorlog.h, web/www/routino/visualiser.html.en, src/errorlogx.c, src/visualiser.c, web/www/routino/visualiser.js, src/planetsplitter.c, src/errorlog.c, src/visualiser.h, src/Makefile, src/filedumper.c, web/www/routino/visualiser.cgi: Allow dumping error logs from filedumper. 2013-05-14 [r1320] Andrew M. Bishop <amb> * src/errorlogx.c, src/errorlogx.h, src/errorlog.c (added), src/errorlog.h (added): Copy errorlogx.h to errorlog.h and create errorlog.c so that they mirror the nodes.h and nodes.c filenames. Add functions to read in a set of error logs from a file. 2013-05-13 [r1319] Andrew M. Bishop <amb> * src/logerror.c, src/Makefile, src/logerror.h (removed), src/errorlogx.c (added), src/logerrorx.c (removed), src/errorlogx.h (added), src/planetsplitter.c: Rename logerrorx.c to errorlogx.c and logerrorx.h to errorlogx.h so that they mirror the nodesx.c and nodesx.h filenames. 2013-05-13 [r1318] Andrew M. Bishop <amb> * src/tagmodifier.c, src/logging.h, src/osmparser.c, src/segmentsx.c, src/logerror.h, src/tagging.c, src/relationsx.c: Move the logerror function prototypes back into logging.h and remove the logerror.h header file from most source files again. 2013-05-12 [r1317] Andrew M. Bishop <amb> * src/logerror.c, src/waysx.c, src/Makefile, src/relationsx.h, src/segmentsx.c, src/logerror.h, src/nodesx.c, src/waysx.h, src/segmentsx.h, src/logerrorx.c (added), src/nodesx.h, src/relationsx.c, src/planetsplitter.c: Add functions to process the binary error log file and convert it into a geographically searchable database. 2013-05-11 [r1314] Andrew M. Bishop <amb> * src/planetsplitter.c: Rename the Nodes, Segments, Ways and Relations variables to avoid confusion with types of the same name. 2013-05-11 [r1313] Andrew M. Bishop <amb> * src/logerror.h (added), src/tagging.c, src/logging.c, src/relationsx.c, src/planetsplitter.c, src/tagmodifier.c, src/logerror.c (added), src/logging.h, src/osmparser.c, src/Makefile, src/segmentsx.c: Create a binary log file that contains the node, way and relation id and a link to the error message for easy parsing. 2013-05-11 [r1312] Andrew M. Bishop <amb> * src/ways.c, src/relations.h, src/segments.c, src/nodes.c, src/ways.h, src/segments.h, src/nodes.h, src/relations.c, src/router.c: Add functions to destroy the node/segment/way/relation lists and don't call them from the end of the router by default. 2013-05-10 [r1308-1311] Andrew M. Bishop <amb> * src/Makefile: Enable -Wextra compilation option (but not -Wunused-parameter option) by default. * src/sorting.c: Change data type from signed to unsigned (pedantic compiler warning). * src/results.c: Change data value from signed to unsigned (pedantic compiler warning). * src/waysx.h, src/segmentsx.h, src/nodesx.h: Make no-op macros look like real statements. 2013-05-10 [r1305-1307] Andrew M. Bishop <amb> * src/results.c: Change data value from signed to unsigned (pedantic compiler warning). * src/prunex.c: Change data value from unsigned to signed (pedantic compiler warning). * src/filedumper.c: Remove always true condition (pedantic compiler warning). 2013-05-10 [r1304] Andrew M. Bishop <amb> * src/queue.c: Small change to algorithm to match sorting.c. 2013-05-09 [r1302-1303] Andrew M. Bishop <amb> * src/relations.c: Change data value from unsigned to signed (pedantic compiler warning). * src/planetsplitter.c, src/waysx.c: Change datatype from signed to unsigned (pedantic compiler warning). 2013-05-09 [r1299-1301] Andrew M. Bishop <amb> * src/osmpbfparse.c, src/osmo5mparse.c, src/xmlparse.c: Change datatype from signed to unsigned (pedantic compiler warning). Use inttypes.h printf formatting for unsigned long long data type. * src/files.h: Cast data to signed before comparison (pedantic compiler warning). * src/filedumperx.c: Change datatype from signed to unsigned (pedantic compiler warning). 2013-05-07 [r1298] Andrew M. Bishop <amb> * src/nodes.c: Change the GetLatLong() function to have one binary search instead of two. 2013-05-07 [r1297] Andrew M. Bishop <amb> * src/cache.h, src/nodes.c, src/relationsx.c, src/waysx.c, src/segmentsx.c, src/nodesx.c, src/waysx.h, src/prunex.c, src/segmentsx.h, src/nodesx.h, src/superx.c: Add cache functions for NodesX, SegmentsX and WaysX to speed up the planetsplitter in slim mode. 2013-05-07 [r1296] Andrew M. Bishop <amb> * src/cache.c (removed), src/relations.h, src/cache.h, src/ways.h, src/segments.h, src/Makefile, src/nodes.h: Move the cache functions out of cache.c and into each data type's header file as inline functions. 2013-05-03 [r1294-1295] Andrew M. Bishop <amb> * src/cache.c: Revert to the round-robin cache eviction algorithm. * src/cache.c: Implement an LRU eviction algorithm for the cached objects - it's slower, but code kept for possible future re-use. 2013-05-03 [r1293] Andrew M. Bishop <amb> * src/cache.c, src/relations.h, src/cache.h, src/ways.h, src/segments.h, src/nodes.h: Tidy up the code for the last check-in and use macros to allow replication of the functions for each type. 2013-05-03 [r1292] Andrew M. Bishop <amb> * src/segments.h, src/Makefile, src/nodes.h, src/relations.c, src/router.c, src/cache.c (added), src/ways.c, src/relations.h, src/segments.c, src/cache.h (added), src/nodes.c, src/ways.h: Add node, segment, way and turn relation cache for slim mode. Approx 40% speed-up for router. 2013-05-01 [r1291] Andrew M. Bishop <amb> * src/output.c, src/router.c, src/segments.c, src/visualiser.c, src/nodes.c, src/fakes.c, src/optimiser.c, src/filedumper.c, src/nodes.h: The GetLatLong function takes a pointer to the node as an argument - must be an optimisation for slim mode if not normal mode. 2013-05-01 [r1290] Andrew M. Bishop <amb> * src/results.c, src/queue.c, src/results.h: Move the queue score back into the results structure since it is quicker but uses slightly more memory. 2013-05-01 [r1289] Andrew M. Bishop <amb> * src/queue.c, src/results.h, src/superx.c, src/optimiser.c, src/results.c: Try to speed up the priority queue by allocating less memory and storing the score in the queue rather than in the result. 2013-04-28 [r1288] Andrew M. Bishop <amb> * src/results.c: Set pointers to NULL when resizing the hash table. 2013-04-27 [r1287] Andrew M. Bishop <amb> * src/superx.c: Update for change to NewResultsList() function. 2013-04-27 [r1286] Andrew M. Bishop <amb> * src/optimiser.c, src/results.c, src/results.h: Increase the starting number of bins to allow more results to be stored before resizing. 2013-04-27 [r1285] Andrew M. Bishop <amb> * src/results.c, src/results.h: Use a linked list to store the results in each bin rather than pre-allocated pointers. 2013-04-27 [r1283-1284] Andrew M. Bishop <amb> * src/results.c: Improve the hash function to avoid node/segment correlations in some geographic areas. * src/router.c: De-allocate the final routes at the end. 2013-04-27 [r1282] Andrew M. Bishop <amb> * src/results.c, src/results.h: Increase the allowed number of collisions as the number of bins increases. 2013-04-27 [r1281] Andrew M. Bishop <amb> * src/results.h, src/optimiser.c, src/router.c, src/results.c: Remove the FindResult1 function which allows hashing to be performed on a combination of node and segment rather than just node. 2013-04-26 [r1280] Andrew M. Bishop <amb> * src/results.c, src/results.h: Force a hard limit on the number of hash collisions. 2013-04-20 Andrew M. Bishop <amb> Version 2.5.1 released 2013-04-20 [r1279] Andrew M. Bishop <amb> * doc/html/readme.html, doc/NEWS.txt, FILES: Updated for version 2.5.1 release. 2013-04-18 [r1278] Andrew M. Bishop <amb> * src/router.c, src/optimiser.c, src/functions.h: Fix a bug where the shortest route crossing super-nodes requires two U-turns and is therefore impossible to compute even though an obvious shorter route without crossing super-nodes exists (but cannot be taken until the super-node route is fully tested). Requires quite a major change in router handling of this special case. 2013-04-18 [r1277] Andrew M. Bishop <amb> * src/xmlparse.c: Fix bug with handling UTF-8 characters that are four bytes long (it didn't since v2.5). 2013-04-17 [r1276] Andrew M. Bishop <amb> * src/optimiser.c: Fix bug that corrupts the combined route score when combining the route (only important if comparing non-super-node route with super-node route). 2013-04-15 [r1275] Andrew M. Bishop <amb> * web/www/openlayers/install.sh: Default to downloading openlayers 2.12. 2013-04-13 [r1274] Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/html/installation.html: Add a note about the *-slim executables to the installation section. 2013-04-13 [r1273] Andrew M. Bishop <amb> * src/tagmodifier.c: Use single quotes rather than double quotes when writing out the XML for similarity with filedumper. 2013-04-13 [r1272] Andrew M. Bishop <amb> * src/xmlparse.c: Fix XML character quoting for characters within the 7-bit printable ASCII range (bug reported by Dirk Eversmann). 2013-04-13 [1271] Andrew M. Bishop <amb> * web/www/routino/router.js, web/www/routino/visualiser.js: Fix the Javascript so that it works with OpenLayers version 2.11 again (bug reported by Dirk Eversmann). 2013-04-13 [r1269-1270] Andrew M. Bishop <amb> * doc/html/readme.html, doc/README.txt: Remove some differences between the HTML and text versions of the documents. * doc/INSTALL.txt, doc/html/installation.html: Fix some errors in the installation documents and improve the description of pre-requisites and compilation (prompted by bug report from Dirk Eversmann). 2013-03-24 [r1268] Andrew M. Bishop <amb> * src/planetsplitter.c: Prune the straight highways after removing the isolated sections and short segments rather than before. 2013-03-19 [r1267] Andrew M. Bishop <amb> * doc/html/output.html, doc/html/tagging.html, doc/html/installation.html, doc/html/limits.html, doc/README.txt, doc/html/usage.html, doc/html/algorithm.html, doc/html/configuration.html, doc/html/index.html, doc/html/data.html, doc/html/readme.html, web/www/routino/index.html: Remove e-mail addresses and replace with links to website. 2013-03-03 [r1266] Andrew M. Bishop <amb> * src/prunex.c: Improve the pruning of straight highways (more likely to remove larger sections). 2013-03-03 [r1265] Andrew M. Bishop <amb> * src/test, src/prunex.c, src/test/prune-straight.sh (added), src/test/prune-straight.osm (added): Add a test case for pruning straight segments. Found an error case related to loops and fixed it. 2013-03-02 [r1264] Andrew M. Bishop <amb> * src/test/prune-short.sh (added), src/test, src/test/prune-short.osm (added), src/prunex.c, src/test/only-split.sh: Add a test case for pruning short segments. Found some disallowed cases that had not been detected before and fixed them. 2013-03-02 [r1263] Andrew M. Bishop <amb> * doc/html/tagging.html, xml/routino-tagging.xml, doc/TAGGING.txt, src/osmparser.c, src/filedumper.c: Recognise mini-roundabouts tagged as junction=roundabout (as well as highway=mini_roundabout). Pass them through the parser as roundabout=yes. Output them from the filedumper as junction=roundabout. Update the documentation for mini-roundabouts. 2013-03-02 [r1262] Andrew M. Bishop <amb> * src/test/oneway-loop.osm, src/test/node-restrictions.osm: Remove the 'update' element from the osm tag. 2013-02-28 [r1261] Andrew M. Bishop <amb> * src/relationsx.c: Rationalise some of the turn relation error messages. 2013-02-26 [r1260] Andrew M. Bishop <amb> * web/www/routino/router.js, web/www/routino/visualiser.js: Clarify comment. 2013-02-18 [r1259] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Add some more tags to not be reported as errors (barrier, highway), add some more aliases for highway types, bridges and tunnels are enabled for anything except 'no'. 2013-02-16 [r1257-1258] Andrew M. Bishop <amb> * web/www/routino/index.html: Move the meta tag for charset declaration to the top of the head, before the copyright notice, within the first 1024 bytes. * doc/html/readme.html, web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl, doc/html/output.html, doc/html/tagging.html, doc/html/installation.html, doc/html/limits.html, doc/html/usage.html, doc/html/algorithm.html, doc/html/configuration.html, doc/html/index.html, web/www/routino/router.html.en, doc/html/data.html: Move the meta tag for charset declaration to the top of the head, before the copyright notice, within the first 1024 bytes. 2013-02-09 [r1256] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Stop two contradictory errors messages about 'access = foot' etc. 2013-02-09 Andrew M. Bishop <amb> Version 2.5 released 2013-02-09 [r1255] Andrew M. Bishop <amb> * doc/html/usage.html, doc/USAGE.txt: Fix HTML validation error. 2013-02-09 [r1254] Andrew M. Bishop <amb> * doc/html/readme.html, doc/NEWS.txt, doc/README.txt, FILES: Update documentation for version 2.5. 2013-02-09 [r1253] Andrew M. Bishop <amb> * doc/html/tagging.html, doc/TAGGING.txt: Update documentation for the new tagging transformations. 2013-02-09 [r1252] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Add some more highway tagging transformations (motorroad, sidewalk, footway, cycleway), remove some rare bicycle specific ones and add some access tag values. 2013-02-09 [r1251] Andrew M. Bishop <amb> * src/osmo5mparse.c: Rename the local functions that perform the integer conversions (from pbf_* to o5m_*). 2013-02-08 [r1250] Andrew M. Bishop <amb> * web/www/routino/documentation, doc/html/limits.html (added), doc/html/index.html, doc/LIMITS.txt (added): Add documentation about the numerical limits (OSM identifiers and database size). 2013-02-03 [r1249] Andrew M. Bishop <amb> * src/prunex.c: Some trivial changes, same functionality. 2013-01-24 [r1248] Andrew M. Bishop <amb> * web/www/routino/visualiser.js, src/visualiser.h, src/filedumper.c, doc/USAGE.txt, web/www/routino/visualiser.cgi, web/www/routino/visualiser.html.en, src/visualiser.c, doc/html/usage.html: Add the ability for the visualiser to display highways that have a particular property. 2013-01-24 [r1247] Andrew M. Bishop <amb> * doc/html/tagging.html, xml/routino-tagging.xml, doc/TAGGING.txt, src/osmparser.c: Change the "lanes=..." tag processing because it counts lanes in both directions. A normal road may be tagged as having two lanes (one in each direction) but the multilane property is intended to allow prioritisation of roads where traffic can use multiple lanes in each direction. 2013-01-21 [r1246] Andrew M. Bishop <amb> * src/tagging.c, src/osmparser.c: Remove unnecessary word from logerror messages. 2013-01-21 [r1245] Andrew M. Bishop <amb> * xml/routino-translations.xml: Updated German translations from Alex Treiber. 2013-01-20 [r1244] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Change the comments to clarify what the way access tag rules are for. Change slightly the logged message. Add new tagging rules to transform (for example) access=foot to foot=yes, access=no. 2013-01-20 [r1243] Andrew M. Bishop <amb> * xml/routino-tagging.xml, src/types.c, xml/routino-profiles.xml, doc/README.txt, doc/html/usage.html, src/types.h, doc/html/configuration.html, src/osmparser.c, xml/scripts/ride.pl, web/www/routino/router.html.en, doc/USAGE.txt, web/www/routino/visualiser.html.en, doc/CONFIGURATION.txt, web/www/routino/router.html.nl, doc/html/tagging.html, xml/scripts/walk.pl, src/relationsx.c, doc/TAGGING.txt, doc/html/readme.html, web/www/routino/router.html.de: Replace 'motorbike' with 'motorcycle' everywhere. 2013-01-20 [r1242] Andrew M. Bishop <amb> * doc/CONFIGURATION.txt, xml/routino-tagging.xsd, xml/routino-tagging.xml, src/tagging.h, doc/html/configuration.html, src/tagging.c: Change the <logerror> element of the configuration file to lookup the tag value if not specified and add a custom error message. Rework the access tag checking to use the new logcheck. 2013-01-19 [r1241] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Ignore some more highway types ('no' and 'disused'). 2013-01-19 [r1240] Andrew M. Bishop <amb> * web/www/routino/visualiser.html.en: Fix link to documentation directory. 2013-01-19 [r1239] Andrew M. Bishop <amb> * web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl, web/www/routino/router.js, web/www/routino/mapprops.js, web/www/routino/visualiser.js, web/www/routino/router.html.en: Added MapQuest as an optional map layer, added layer specific attributions to mapprops.js. 2013-01-15 [r1238] Andrew M. Bishop <amb> * web/bin/summarise-log.pl: Fix stupid typo. 2013-01-12 [r1237] Andrew M. Bishop <amb> * web/bin/summarise-log.pl: Sort the listed nodes, ways or relations by ID. 2013-01-09 [r1236] Andrew M. Bishop <amb> * src/osmparser.c: Reset the to/via/from indexes before parsing each relation. 2012-12-29 [r1235] Andrew M. Bishop <amb> * src/xmlparse.h, src/osmpbfparse.c, src/osmo5mparse.c, src/osmxmlparse.c, src/xmlparse.c, src/filedumper.c: Replace the remaining 'long long' and 'unsigned long long' types with uint64_t. 2012-12-29 [r1234] Andrew M. Bishop <amb> * src/osmo5mparse.c, src/osmxmlparse.c, src/tagmodifier.c, src/osmparser.c, src/osmparser.h, src/tagging.c, src/osmpbfparse.c, src/tagging.h: Re-factor parsing code to remove duplicated parts from three parsers (osmo5mparse.c, osmpbfparse.c and osmxmlparse.c) into a common place (osmparser.c), also removes lots of global variables. Change the node, way and relation count to uint64_t instead of index_t to avoid wrap-around (although it would have been a cosmetic problem only), also removes dependency on types.h. Make the node, way and relation counters be 'int64_t' instead of 'long long' in the XML parsers for consistency with the non-XML parsers. 2012-12-28 [r1233] Andrew M. Bishop <amb> * src/osmparser.c: Log errors for areas that are oneway. 2012-12-28 [r1232] Andrew M. Bishop <amb> * src/osmparser.c: Log errors for areas that are not closed. 2012-12-27 [r1231] Andrew M. Bishop <amb> * src/segmentsx.c, src/osmparser.c, web/bin/summarise-log.pl: Don't append segments if they are duplicates within a way or have duplicated nodes. Log errors for middle nodes that repeat within a way (can be non-trivial unintentional loops). 2012-12-26 [r1230] Andrew M. Bishop <amb> * src/osmpbfparse.c: Some small changes for similarity with the O5M/O5C parser. 2012-12-26 [r1229] Andrew M. Bishop <amb> * doc/ALGORITHM.txt, doc/html/algorithm.html: Remove the "practicalities" section because it is out of date and not very relevant. 2012-12-26 [r1228] Andrew M. Bishop <amb> * src/relationsx.c, src/segmentsx.c: Make the log error messages more useful when there are missing nodes or ways. 2012-12-24 [r1227] Andrew M. Bishop <amb> * src/osmparser.h, doc/html/usage.html, src/osmo5mparse.c (added), src/planetsplitter.c, src/osmparser.c, src/Makefile, doc/USAGE.txt: Added parsing of O5M/O5C format (a binary format but otherwise very close to OSM/OSC). 2012-12-24 [r1226] Andrew M. Bishop <amb> * src/planetsplitter.c, src/osmparser.c, src/osmparser.h, src/osmpbfparse.c: The PBF format does not support change files (the 'visible' part of the info message is only for historical data and not for changes). 2012-12-24 [r1225] Andrew M. Bishop <amb> * src/osmpbfparse.c: Fix memory allocation error. 2012-12-22 [r1224] Andrew M. Bishop <amb> * doc/html/usage.html, src/planetsplitter.c, src/tagmodifier.c, doc/USAGE.txt: Data can no longer be read from stdin for planetsplitter or tagmodifier. 2012-12-21 [r1223] Andrew M. Bishop <amb> * web/data/create.sh: Correct the URLs to use to download data. 2012-12-21 [r1221] Andrew M. Bishop <amb> * doc/html/usage.html, src/osmxmlparse.c, src/planetsplitter.c, src/osmparser.c, src/Makefile, doc/USAGE.txt, src/osmparser.h, src/osmpbfparse.c (added): Add a parser for OSM PBF format. Separate the XML parser from the data processing in osmparser.c. Update planetsplitter and documentation to use new format. 2012-12-19 [r1219-1220] Andrew M. Bishop <amb> * src/xmlparse.c: Use 'unsigned char' instead of 'char' for buffer. Renumber the LEX states to remove hole. * src/uncompress.c: Trivial change to not set a state variable where not needed. 2012-12-19 [r1218] Andrew M. Bishop <amb> * src/osmxmlparse.c (added): Copying osmparser.c to create osmxmlparse.c for the XML callback functions and shared variables. 2012-12-17 [r1217] Andrew M. Bishop <amb> * src/optimiser.c: Refactor to remove duplicated code in each branch of if statement (in each optimiser loop). 2012-12-17 [r1216] Andrew M. Bishop <amb> * doc/NEWS.txt, doc/README.txt, FILES, doc/html/readme.html: Reintegrate the changes from 2.4.1 branch back into trunk. 2012-12-15 [r1209] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Fix some errors that appeared in the tagging file after adding nesting. 2012-12-15 [r1206-1207] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Change the tagging rules to use the nested <if> rules. * doc/html/configuration.html, src/tagging.c, doc/CONFIGURATION.txt, xml/routino-tagging.xsd: Change the tagging rules to have an <ifnot ...> rule which can also be nested. 2012-12-15 [r1205] Andrew M. Bishop <amb> * src/translations.c, xml/routino-translations.xsd: Change one entry in the translations XSD file that used a different case from the other defined types (not consistent with other XSD files but self-consistent). 2012-12-15 [r1204] Andrew M. Bishop <amb> * src/xml/xsd-to-xmlparser.c, src/osmparser.c, src/tagging.c, src/translations.c, src/profiles.c: Change the xsd-to-xmlparser functions to output the source code in the same order as the XSD file and do not attempt to sort them into reverse order of reference. 2012-12-15 [r1203] Andrew M. Bishop <amb> * doc/html/configuration.html, src/tagging.c, doc/CONFIGURATION.txt, xml/routino-tagging.xml: Change the tagging rules to use the nested <if> rules. 2012-12-15 [r1200-1202] Andrew M. Bishop <amb> * src/planetsplitter.c: Change the order of the command line option parsing to match the program usage output. * doc/USAGE.txt: Add the --logtime and --errorlog options to tagmodifier. * doc/html/usage.html, src/tagmodifier.c: Add the --logtime and --errorlog options to tagmodifier. 2012-12-15 [r1199] Andrew M. Bishop <amb> * xml/routino-tagging.xsd, src/tagging.h, src/tagmodifier.c, src/osmparser.c, src/tagging.c: Allow the tagging rule syntax to contain nested <if ...> statements. 2012-12-14 [r1197] Andrew M. Bishop <amb> * doc/USAGE.txt, doc/html/usage.html, src/planetsplitter.c, src/tagmodifier.c: Update the usage messages and documentation for bzip2/gzip uncompression. 2012-12-14 [r1196] Andrew M. Bishop <amb> * src/Makefile, src/uncompress.c, src/uncompress.h, src/planetsplitter.c, src/tagmodifier.c: Add the ability to read gzip compressed files when specified by name. 2012-12-13 [r1194-1195] Andrew M. Bishop <amb> * src/xmlparse.c: Handle the output of the uncompressor where reading may return only a partial buffer. Makes it more robust generally against short reads. * src/Makefile, src/uncompress.c (added), src/uncompress.h (added), src/planetsplitter.c, src/tagmodifier.c: Add the ability to read bzip2 compressed files when specified by name. 2012-12-12 [r1192] Andrew M. Bishop <amb> * src/xml/xsd-to-xmlparser.c, src/planetsplitter.c: Use STDIN_FILENO instead of 0 for the stdin file descriptor. 2012-12-11 [r1190] Andrew M. Bishop <amb> * src/xmlparse.c: Reorder if/then/else statements so that most common ones come first (using profiling when parsing GB OSM file). 2012-12-11 [r1189] Andrew M. Bishop <amb> * src/xmlparse.c: Most xml attribute values are ASCII so optimise for that case. 2012-12-10 [r1188] Andrew M. Bishop <amb> * src/Makefile: Re-enable the optimisation option. 2012-12-10 [r1185-1187] Andrew M. Bishop <amb> * src: Change svn ignored files (don't ignore xmlparse.c now). * src/xml/xsd-to-xmlparser.c, src/planetsplitter.c, src/tagmodifier.c, src/osmparser.c, src/xml/Makefile, src/osmparser.h, src/tagging.c, src/xmlparse.h, src/translations.c, src/profiles.c: New XML parser doesn't use stdio buffered file access but lower level read functions. * src/xmlparse.l (removed), src/xmlparse.c (added), src/Makefile: Remove flex based XML parser and replace with a parser created by implementing the same lex rules by hand. Operates faster because tag attributes do not need memory allocated or copying from file buffer and there are no yylex() function calls/returns. 2012-12-17 Andrew M. Bishop <amb> Version 2.4.1 released 2012-12-17 [r1214] Andrew M. Bishop <amb> * doc/html/readme.html, doc/NEWS.txt, doc/README.txt, FILES: Update for version 2.4.1. 2012-12-17 [r1213] Andrew M. Bishop <amb> * src/optimiser.c, src/waysx.c, src/segmentsx.c, src/nodesx.c, src/router.c, src/prunex.c, src/logging.c, src/relationsx.c: Merge revisions 1191, 1193, 1198, 1208 and 1210 from trunk into 2.4.1 branch. 2012-12-17 [r1210] Andrew M. Bishop <amb> * src/optimiser.c: Fix the incorrect finish_score variable that was set to infinite distance and not infinite score (infinte distance << infinite score so search was terminating early). 2012-12-15 [r1208] Andrew M. Bishop <amb> * src/nodesx.c, src/prunex.c, src/relationsx.c, src/waysx.c, src/segmentsx.c: Stop planetsplitter crashing out in unusual ways if there is no data. 2012-12-14 [r1198] Andrew M. Bishop <amb> * src/waysx.c, src/nodesx.c: Don't crash in binary search if no nodes/ways. 2012-12-13 [r1193] Andrew M. Bishop <amb> * src/logging.c: Fix bug with printing messages if not to stdout. 2012-12-12 [r1191] Andrew M. Bishop <amb> * src/router.c: Fix error when searching for default profiles.xml file. 2012-12-08 Andrew M. Bishop <amb> Version 2.4 released 2012-12-08 [r1182-1183] Andrew M. Bishop <amb> * doc/NEWS.txt, doc/README.txt, FILES, doc/html/readme.html: Update for version 2.4. * doc/TAGGING.txt: Update with the tagging rule changes in this version. 2012-12-08 [r1181] Andrew M. Bishop <amb> * src/xmlparse.l, src/xml/test/good.xml, src/xml/test/bad-cdata-start.xml (removed), src/xml/test/bad-text-outside.xml (added): Simplify the XML parser by not handling the CDATA and DOCTYPE sections and also raise an explicit error for text outside of tags. Modify test cases for these changes. 2012-12-06 [r1180] Andrew M. Bishop <amb> * src/xmlparse.l: Some further small changes to pull out bigger groups of characters (only marginally faster though). 2012-12-05 [r1179] Andrew M. Bishop <amb> * src/prunex.c: Minor theoretical improvements to pruning (slim mode is still very slow). 2012-12-05 [r1178] Andrew M. Bishop <amb> * src/xmlparse.l: Change rules to remove all states that require backing up (only marginally faster though). 2012-12-05 [r1176-1177] Andrew M. Bishop <amb> * doc/html/tagging.html: Update with the tagging rule changes in this version. * xml/routino-tagging.xml: Small change to the tag processing for nodes for easier future expansion. 2012-12-01 [r1175] Andrew M. Bishop <amb> * src/tagging.c: Fix memory leak from making incorrect assumption when freeing tagging rule. 2012-12-01 [r1174] Andrew M. Bishop <amb> * src/superx.c, src/translations.h, src/visualiser.c, src/profiles.h, src/types.h, src/osmparser.c, src/filedumper.c, src/output.c, src/router.c, src/translations.c, src/profiles.c, src/types.c: Rename the Way_* enumerated values to Highway_*, add a new Highway_None type, change the HighwayType() function to return Highway_None instead of Highway_Count if no match found - all changes for consistency with similar types and functions. 2012-11-27 [r1173] Andrew M. Bishop <amb> * src/osmparser.c, web/bin/summarise-log.pl, src/segmentsx.c: Log an error about duplicated segments within a way while parsing the OSM instead of later (will have been removed by de-duplication code before tested later in most cases). 2012-11-27 [r1172] Andrew M. Bishop <amb> * web/bin/summarise-log.pl: Make the script still work when no command line argument is used. 2012-11-27 [r1171] Andrew M. Bishop <amb> * src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/segmentsx.c, src/nodesx.c: Don't log an error for duplicated nodes, ways or relations because it can only occur when applying changes or if using multiple geographically overlapping files and neither is a data error. 2012-11-21 [r1170] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Add some more tag checking, accept more tags. 2012-11-21 [r1169] Andrew M. Bishop <amb> * src/types.h, src/segmentsx.c: Finally fix the segment area handling - segments that are areas are discarded in preference to those that are not (as it was between r914 and r1136) and segments that are areas don't have the wrong distance (as they did between r914 and r1136). Revision r1137 correctly changed to use a flag and fixed the distance bug but then didn't sort using the new flag. Revision r1153 started sorting using the segment flags but the area was not the most significant bit so they were not sorted last. Revision r1164 correctly cleared the area flag when no longer needed but didn't fix the rest. Revision r1168 reverted r1164 so needed to be re-applied. 2012-11-21 [r1168] Andrew M. Bishop <amb> * src/prunex.c, src/segmentsx.h, src/filedumperx.c, src/segments.c, src/superx.c, src/fakes.c, src/types.h, src/segments.h, src/optimiser.c, src/osmparser.c, src/filedumper.c, src/segmentsx.c, src/fakes.h, src/output.c: Revert r1164 - some super-segments are longer than 65535 metres even if no individual segment is. 2012-11-20 [r1167] Andrew M. Bishop <amb> * doc/html/usage.html, src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/relationsx.h, src/segmentsx.c, doc/USAGE.txt, src/nodesx.c, src/waysx.h, src/segmentsx.h, src/nodesx.h: Rename the '--preserve' command line option to '--keep' for simplicity. 2012-11-20 [r1166] Andrew M. Bishop <amb> * src/segmentsx.c, src/nodesx.c, src/prunex.c, src/results.c, src/sorting.c, src/logging.c, src/superx.c, src/files.h, src/relationsx.c, src/tagmodifier.c, src/logging.h, src/optimiser.c, src/osmparser.c, src/waysx.c, src/Makefile: Replace all assert statements with a custom error message that explains the cause and suggests a solution. 2012-11-20 [r1165] Andrew M. Bishop <amb> * src/types.h, src/osmparser.c, src/nodes.h, src/nodesx.c, src/nodesx.h: Use a specific type for the node flags instead of a generic uint16_t. 2012-11-20 [r1164] Andrew M. Bishop <amb> * src/filedumperx.c, src/segments.c, src/superx.c, src/fakes.c, src/types.h, src/segments.h, src/optimiser.c, src/osmparser.c, src/filedumper.c, src/segmentsx.c, src/fakes.h, src/output.c, src/prunex.c, src/segmentsx.h: Replace the 32-bit combined distance and flags in the segment with 16 bits for each. 2012-11-20 [r1163] Andrew M. Bishop <amb> * src/relationsx.c, src/relationsx.h, src/typesx.h, src/filedumperx.c: Tidy up all of the recent code changes - Rename TurnRestrictRelX structure to TurnRelX. 2012-11-20 [r1162] Andrew M. Bishop <amb> * src/files.c: Tidy up all of the recent code changes - Fix comment. 2012-11-20 [r1161] Andrew M. Bishop <amb> * src/nodesx.c, src/waysx.h, src/segmentsx.h, doc/DATALIFE.txt, src/nodesx.h, src/superx.c, src/relationsx.c, src/osmparser.c, src/waysx.c, src/relationsx.h, src/segmentsx.c: Tidy up all of the recent code changes - change the name of a few of the functions. 2012-11-20 [r1160] Andrew M. Bishop <amb> * src/waysx.c, src/relationsx.h, src/segmentsx.c, src/nodesx.c, src/waysx.h, src/segmentsx.h, src/nodesx.h: Tidy up all of the recent code changes - change the order of the functions within the files to a more sensible and consitent order. 2012-11-19 [r1159] Andrew M. Bishop <amb> * src/osmparser.c: Unconditionally mark ways as deleted if they have been modified to handle the case when applying more than one change file if a way is created by the first of the change files and modified by the second it will not be in the index. 2012-11-19 [r1158] Andrew M. Bishop <amb> * src/waysx.c, src/waysx.h, src/planetsplitter.c: Do not create the way indexes when loading the parsed ways to apply changes (reverses r1145). 2012-11-19 [r1157] Andrew M. Bishop <amb> * doc/html/usage.html, src/planetsplitter.c, doc/USAGE.txt: Do not require that --preserve must be used with --parse-only before changes can be applied (reverses r1151 for the change to functionality but preserves the changes to the functions that enable it). 2012-11-19 [r1156] Andrew M. Bishop <amb> * src/filedumperx.c: Fix bug with dumping ways. 2012-11-19 [r1155] Andrew M. Bishop <amb> * src/segmentsx.c: De-duplicate segments when sorting only if they have the same nodes, way and distance - i.e. the same data imported twice. 2012-11-18 [r1154] Andrew M. Bishop <amb> * src/osmparser.c: When marking modified nodes as deleted don't accidentally re-include them as new ways with the deleted flag set. 2012-11-18 [r1152-1153] Andrew M. Bishop <amb> * src/segmentsx.c: When sorting segments use the distance flags as the tie-breaker so that duplicated segments with different flags get sorted into the same order when applying changes as when not applying changes. * src/osmparser.c: Mark modified relations as deleted before storing the modification to handle the case where the modification causes it to be invalid and not stored therefore leaving the old version. 2012-11-18 [r1151] Andrew M. Bishop <amb> * src/segmentsx.h, src/nodesx.h, src/superx.c, doc/html/usage.html, src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/relationsx.h, src/segmentsx.c, doc/USAGE.txt, src/nodesx.c, src/waysx.h: Using --parse-only and --preserve must sort the data so that it is ready to apply the changes. 2012-11-17 [r1149-1150] Andrew M. Bishop <amb> * src/filedumper.c: Some small changes to match the new filedumperx program. * src, doc/USAGE.txt, src/filedumperx.c (added), doc/html/usage.html, src/Makefile, web/bin: Add a new program to dump the contents of the intermediate files that are generated by using --preserve or --changes. 2012-11-17 [r1147-1148] Andrew M. Bishop <amb> * src/waysx.c: Replace a hard-coded constant with the #defined value it should have been. * src/relationsx.c: Clear the route relation before adding data to it so that there are no unused bytes in the structure to get written to disk (avoid byte-level differences when applying changes). 2012-11-17 [r1146] Andrew M. Bishop <amb> * src/nodesx.c, src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/segmentsx.c: Suppress some error log messages when applying changes (false positive duplicate detection due to modification of existing items). 2012-11-17 [r1144-1145] Andrew M. Bishop <amb> * src/planetsplitter.c, src/osmparser.c, src/waysx.c, src/waysx.h: Fix applying changes for ways (highways that have been modified to be non-highways were not added to the database so the original remains). * src/typesx.h, src/types.h: Change the type-casting of some constants. 2012-11-16 [r1140-1143] Andrew M. Bishop <amb> * src/xml: Ignore the automatically generated executables from the new XML Schema. * xml/routino-osm.xsd, xml/osm.xsd: Changes to comments to make them more like the OSC files. * xml/routino-osc.xsd (added), xml/osc.xsd (added): XML Schema for OSC change files (.osc files) used to create the XML parser. * doc/html/usage.html, src/relationsx.c, src/types.h, src/planetsplitter.c, src/osmparser.c, src/waysx.c, src/segmentsx.c, doc/USAGE.txt, src/nodesx.c, src/osmparser.h, src/segmentsx.h, doc/DATALIFE.txt: Code to allow adding OSC change files (.osc files) to an existing set of parsed (and preserved) data. 2012-11-15 [r1139] Andrew M. Bishop <amb> * src/nodesx.h, src/superx.c, src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/relationsx.h, src/segmentsx.c, src/nodesx.c, src/waysx.h, src/segmentsx.h: Fixed the --preserve option. 2012-11-12 [r1138] Andrew M. Bishop <amb> * src/relationsx.c: Fix mis-use of NO_WAY/NO_WAY_ID and NO_RELATION/NO_RELATION_ID constants in route relation handling. 2012-11-11 [r1137] Andrew M. Bishop <amb> * src/types.h, src/osmparser.c, src/segmentsx.c: Mark those segments that come from ways which are areas with an explicit flag rather than an implicit one (also fixes a bug). 2012-11-10 [r1136] Andrew M. Bishop <amb> * src/nodesx.c, src/waysx.h, src/segmentsx.h, src/nodesx.h, doc/html/usage.html, src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/relationsx.h, src/segmentsx.c, doc/USAGE.txt: Added a --preserve option which keeps the raw data files after parsing, sorting and de-duplication. 2012-11-10 [r1134-1135] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/waysx.c: Don't index the ways in the first sorting, but wait until after de-duplicating. * src/relationsx.c: Sort the route relations and remove duplicates. 2012-11-10 [r1133] Andrew M. Bishop <amb> * src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, doc/DATALIFE.txt: The MergeSuperSegments function creates the output file in the sorted order already, there is no need to re-sort it. 2012-11-10 [r1132] Andrew M. Bishop <amb> * src/segmentsx.c, src/segmentsx.h, doc/DATALIFE.txt, src/planetsplitter.c: De-duplicate the super-segments as a post-processing function after the sort so both operations are combined in a single function. 2012-11-10 [r1131] Andrew M. Bishop <amb> * src/segmentsx.h, src/planetsplitter.c, src/segmentsx.c: De-duplicate the raw segments before any other processing (to match the node, way and turn relation processing). 2012-11-10 [r1129-1130] Andrew M. Bishop <amb> * src/planetsplitter.c: Separate the de-duplication of the ways from the extracting of the names. Use the modified functions for creating lists of nodes,segments,ways and relations from r1123. * src/waysx.c, src/waysx.h, doc/DATALIFE.txt: Separate the de-duplication of the ways from the extracting of the names. 2012-11-08 [r1128] Andrew M. Bishop <amb> * web/bin/summarise-log.pl: Allow generation of an HTML version of the log file summary. 2012-11-08 [r1127] Andrew M. Bishop <amb> * src/osmparser.c: Add two extra parsing rules for feet and inches. 2012-11-04 [r1126] Andrew M. Bishop <amb> * src/tagging.c: Clarify that errors logged when examining tags mean that tag will be ignored. 2012-11-04 [r1125] Andrew M. Bishop <amb> * src/osmparser.c: Log an error for ways with only 1 node and for relations with no nodes, ways or relations. 2012-11-03 [r1124] Andrew M. Bishop <amb> * src/prunex.c: Append the new ways directly to the end of the existing ways rather than using a new file. 2012-11-03 [r1123] Andrew M. Bishop <amb> * src/nodesx.h, src/superx.c, src/relationsx.c, src/waysx.c, src/relationsx.h, src/segmentsx.c, src/nodesx.c, src/waysx.h, src/segmentsx.h: Don't open the input file for appending if there is no intention to write anything to it. 2012-11-03 [r1122] Andrew M. Bishop <amb> * src/superx.c, src/files.h, src/relationsx.c, src/segmentsx.c, src/prunex.c, src/files.c: Change the UnmapFile() function to take a pointer to the data instead of the filename (like the CloseFile() function takes the file descriptor). 2012-11-02 [r1121] Andrew M. Bishop <amb> * src/prunex.c, src/segmentsx.h: Fix a bug which gave different results for slim mode and normal mode when pruning short segments. 2012-11-01 [r1120] Andrew M. Bishop <amb> * src/planetsplitter.c, src/waysx.c, src/relationsx.h, src/segmentsx.c, doc/USAGE.txt, src/nodesx.c, src/waysx.h, src/prunex.c, src/segmentsx.h, src/nodesx.h, src/superx.c, doc/html/usage.html, src/relationsx.c: Introduce a new'--append' option for appending data from a file to the currently parsed data. Rename the intermediate file used for storing data to be appended to. Add a function to call after appending to a file which closes the file and renames it to a temporary filename which is used for the remaining processing. 2012-11-01 [r1119] Andrew M. Bishop <amb> * src/files.c, src/files.h: Add a function to rename a file. 2012-10-31 [r1118] Andrew M. Bishop <amb> * src/relationsx.c, src/sorting.h, src/waysx.c, src/segmentsx.c, src/nodesx.c: Add the option for the sorting function to preserve the input order of equivalent items on the output. Use this feature in sorting so that slim mode and normal mode give the same results. 2012-10-24 [r1116-1117] Andrew M. Bishop <amb> * doc/html/usage.html, doc/html/algorithm.html, src/planetsplitter.c, doc/USAGE.txt, doc/ALGORITHM.txt, src/prunex.c: Perform the pruning for isolated regions in terms of each transport type individually. * doc/DATALIFE.txt: Use the index provided by the pre-sort function rather than the way's internal id when pruning/compacting. 2012-10-24 [r1114-1115] Andrew M. Bishop <amb> * src/segmentsx.c: Remove a debugging print statement. * src/waysx.c: Use the index provided by the pre-sort function rather than the way's internal id when pruning/compacting. 2012-10-22 [r1112-1113] Andrew M. Bishop <amb> * src/waysx.c: Use the new pre-sort function to allow CompactWays() to delete the unused segments before sorting them. * src/segmentsx.c, src/sorting.c, src/relationsx.c: Fix bug with index parameter in new pre-sort function and change comments to clarify. 2012-10-22 [r1110-1111] Andrew M. Bishop <amb> * src/segmentsx.c: Use the new pre-sort function to allow RemovePrunedSegments() to delete the pruned segments before sorting them. * src/segmentsx.c, src/relationsx.c: Change the message after sorting geographically to be consistent with others. 2012-10-21 [r1109] Andrew M. Bishop <amb> * src/planetsplitter.c, src/nodesx.c, doc/DATALIFE.txt, src/nodesx.h: Move the UpdateNodes() work into the callback for SortNodeListGeographically() and use firstnode when saving the nodes. 2012-10-21 [r1108] Andrew M. Bishop <amb> * src/planetsplitter.c, src/relationsx.h, doc/DATALIFE.txt, src/relationsx.c: Use the new pre-sort function to allow UpdateTurnRelations() and SortTurnRelationList() to be combined into a single SortTurnRelationListGeographically() function that only reads and writes the data once instead of twice. 2012-10-21 [r1107] Andrew M. Bishop <amb> * src/segmentsx.h, doc/DATALIFE.txt, src/planetsplitter.c, src/segmentsx.c: Use the new pre-sort function to allow UpdateSegments() and SortSegmentList() to be combined into a single SortSegmentListGeographically() function that only reads and writes the data once instead of twice. 2012-10-21 [r1106] Andrew M. Bishop <amb> * src/nodesx.c, src/sorting.c, src/relationsx.c, src/sorting.h, src/waysx.c, src/segmentsx.c: Change the sorting functions to have a pre-sort and post-sort selection function instead of just a post-selection one (this will allow deletion of some items before sorting instead of after sorting in some cases). 2012-10-21 [r1103-1105] Andrew M. Bishop <amb> * doc/DATALIFE.txt: Added new columns showing when the data files are mapped into memory. * src/waysx.c: Delete the onumber parameter from the Ways file header. Don't map the ways file into memory when writing the ways. * src/ways.h, src/filedumper.c: Delete the onumber parameter from the Ways file header. 2012-10-21 [r1102] Andrew M. Bishop <amb> * src/segmentsx.c: Reallocate the firstnode array when indexing segments because there may be fewer nodes now. 2012-10-21 [r1101] Andrew M. Bishop <amb> * src/nodesx.c: Remove some unused parts of the SortNodeListGeographically() function. 2012-10-20 [r1100] Andrew M. Bishop <amb> * doc/DATALIFE.txt, src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/segmentsx.c, src/waysx.h, src/segmentsx.h: Move the compacting of the ways back to the top, delete the unused ways at this point and also call the function again after pruning segments. 2012-10-20 [r1099] Andrew M. Bishop <amb> * src/nodesx.c: Mark pruned nodes in the node index. 2012-10-20 [r1098] Andrew M. Bishop <amb> * src/relationsx.c, src/planetsplitter.c, src/relationsx.h, src/segmentsx.c, src/nodesx.c, src/prunex.c, doc/DATALIFE.txt, src/nodesx.h, src/superx.c: Delete the pruned nodes before searching for super-nodes etc. 2012-10-20 [r1097] Andrew M. Bishop <amb> * src/nodesx.c: Move the calculation of lat/long extents to the UpdateNodes() function. 2012-10-20 [r1096] Andrew M. Bishop <amb> * doc/DATALIFE.txt: Add missing data (nodesx->super). 2012-10-20 [r1095] Andrew M. Bishop <amb> * doc/DATALIFE.txt (added): A description of the data lifetime in the planetsplitter program (as an aid to understanding it better and not messing it up when editing it). 2012-10-19 [r1094] Andrew M. Bishop <amb> * src/waysx.c: Remove one filesort and one read through the ways file when compacting. 2012-10-19 [r1093] Andrew M. Bishop <amb> * src/waysx.c, src/segmentsx.c, src/waysx.h: Change to an external index for the compacted ways. 2012-10-18 [r1092] Andrew M. Bishop <amb> * src/planetsplitter.c, src/waysx.c, src/waysx.h: When compacting ways exclude the ones that are not used by any segments. 2012-10-17 [r1091] Andrew M. Bishop <amb> * src/planetsplitter.c: Perform the Way compacting at the end (after pruning segments). 2012-10-17 [r1090] Andrew M. Bishop <amb> * src/waysx.h, src/waysx.c, src/segmentsx.c: Rename the WayX->prop entry to WayX->cid to disambiguate it. 2012-10-17 [r1089] Andrew M. Bishop <amb> * src/typesx.h, src/superx.c: Rename the BitMask functions to set or clear all bits. 2012-09-28 [r1078] Andrew M. Bishop <amb> * src/ways.c, src/segments.c, src/visualiser.c, src/nodes.c, src/ways.h, src/fakes.c, src/segments.h, src/optimiser.c, src/filedumper.c, src/fakes.h, src/output.c: Rename some variables so that pointers to nodes, segments, ways and relations use the Hungarian notation "p" suffix (only applies to the router, not planetsplitter). 2012-07-22 [r1027-1028] Andrew M. Bishop <amb> * web/www/routino/noscript.cgi (removed), web/www/routino/noscript.html (removed), web/www/routino/noscript.template.html (removed): Delete obsolete noscript web pages and CGIs. * web/www/routino/customvisualiser.cgi (removed), web/www/routino/customrouter.cgi (removed): Delete obsolete custom* CGIs. 2012-10-06 Andrew M. Bishop <amb> Version 2.3.2 released 2012-10-06 [r1083] Andrew M. Bishop <amb> * doc/NEWS.txt, doc/README.txt, FILES, doc/html/readme.html: Update for 2.3.2 release. 2012-10-02 [r1079] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Make the access tag normalisation consistent between nodes an ways. 2012-09-26 [r1077] Andrew M. Bishop <amb> * src/visualiser.c, web/www/routino/visualiser.js, src/visualiser.h, src/filedumper.c, web/www/routino/visualiser.cgi, web/www/routino/visualiser.html.en: Add an option to the visualiser to display nodes that disallow selected transport type. 2012-09-25 [r1076] Andrew M. Bishop <amb> * doc/OUTPUT.txt, doc/html/output.html: Change the example output now that the copyright notice has changed, the final turn is no longer missed and minor junctions are formatted differently in the all text format. 2012-09-23 [r1075] Andrew M. Bishop <amb> * src/test/expected/turns-WP08.txt, src/test/expected/turns-WP09.txt, src/test/expected/dead-ends-WP10.txt, src/test/expected/dead-ends-WP11.txt, src/test/expected/loops-WP01.txt, src/test/expected/loops-WP02.txt, src/test/expected/loops-WP03.txt, src/test/expected/loops-WP04.txt, src/test/expected/loops-WP05.txt, src/test/expected/loops-WP06.txt, src/test/expected/loops-WP07.txt, src/test/expected/loops-WP08.txt, src/test/expected/loops-WP09.txt, src/test/expected/turns-WP10.txt, src/test/expected/turns-WP11.txt, src/test/expected/turns-WP12.txt, src/test/expected/turns-WP13.txt, src/test/expected/turns-WP14.txt, src/test/expected/turns-WP15.txt, src/test/expected/turns-WP16.txt, src/test/expected/dead-ends-WP01.txt, src/test/expected/dead-ends-WP02.txt, src/test/expected/dead-ends-WP03.txt, src/test/expected/dead-ends-WP04.txt, src/test/expected/dead-ends-WP05.txt, src/test/expected/dead-ends-WP06.txt, src/test/expected/dead-ends-WP07.txt, src/test/expected/dead-ends-WP08.txt, src/test/expected/dead-ends-WP09.txt, src/test/expected/loops-WP10.txt, src/test/expected/loops-WP11.txt, src/output.c, src/test/expected/turns-WP01.txt, src/test/expected/turns-WP02.txt, src/test/expected/turns-WP03.txt, src/test/expected/turns-WP04.txt, src/test/expected/turns-WP05.txt, src/test/expected/turns-WP06.txt, src/test/expected/turns-WP07.txt: Change the all text output format so that minor junctions (where no turn instructions are output for the HTML) are labelled differently. This also required the expected results for the tests cases to be changed. 2012-09-22 [r1074] Andrew M. Bishop <amb> * src/test/expected/super-or-not-WP02.txt, src/test/expected/turns-WP10.txt, src/test/expected/turns-WP11.txt, src/test/expected/turns-WP12.txt, src/test/expected/turns-WP13.txt, src/test/expected/turns-WP14.txt, src/test/expected/turns-WP15.txt, src/test/expected/turns-WP16.txt, src/test/expected/dead-ends-WP01.txt, src/test/expected/dead-ends-WP02.txt, src/test/expected/dead-ends-WP03.txt, src/test/expected/dead-ends-WP04.txt, src/test/expected/dead-ends-WP05.txt, src/test/expected/dead-ends-WP06.txt, src/test/expected/dead-ends-WP07.txt, src/test/expected/dead-ends-WP08.txt, src/test/expected/dead-ends-WP09.txt, src/test/expected/loops-WP10.txt, src/test/expected/loops-WP11.txt, src/output.c, src/test/expected/oneway-loop-WP01.txt, src/test/expected/node-restrictions-WP01.txt, src/test/expected/turns-WP01.txt, src/test/expected/node-restrictions-WP02.txt, src/test/expected/turns-WP02.txt, src/test/expected/node-restrictions-WP03.txt, src/test/expected/turns-WP03.txt, src/test/expected/node-restrictions-WP04.txt, src/test/expected/turns-WP04.txt, src/test/expected/node-restrictions-WP05.txt, src/test/expected/turns-WP05.txt, src/test/expected/node-restrictions-WP06.txt, src/test/expected/turns-WP06.txt, src/test/expected/node-restrictions-WP07.txt, src/test/expected/turns-WP07.txt, src/test/expected/node-restrictions-WP08.txt, src/test/expected/turns-WP08.txt, src/test/expected/turns-WP09.txt, src/test/expected/dead-ends-WP10.txt, src/test/expected/dead-ends-WP11.txt, src/test/expected/loops-WP01.txt, src/test/expected/loops-WP02.txt, src/test/expected/loops-WP03.txt, src/test/expected/loops-WP04.txt, src/test/expected/loops-WP05.txt, src/test/expected/loops-WP06.txt, src/test/expected/loops-WP07.txt, src/test/expected/loops-WP08.txt, src/test/expected/loops-WP09.txt: Fix a bug that stopped the last turn before a waypoint from being described in the HTML output if the final section of the route was a fake-segment. Update the test case expected results since the last turn was not being described properly. 2012-09-20 [r1073] Andrew M. Bishop <amb> * src/test/start-1-finish.sh, src/test/a-b-c.sh, src/test/a-b.sh: Change the scripts for the test cases to use 'diff' instead of 'cmp' so that it is possible to see the changes. 2012-09-19 [r1071-1072] Andrew M. Bishop <amb> * src/router.c: Change the error message printed if a super-route cannot be converted into a normal route. * src/superx.c: When not marking nodes that allow no traffic as super-nodes don't route through them when calculating super-segments. 2012-09-18 [r1070] Andrew M. Bishop <amb> * xml/routino-translations.xml: Change the URL for the license/copyright file (not CC specific and points to openstreetmap site). 2012-09-17 [r1069] Andrew M. Bishop <amb> * src/superx.c, src/test/node-restrictions.osm, src/types.h, src/test/expected/node-restrictions-WP04.txt: Do not mark barriers that cannot be passed by any type of transport as super-nodes. 2012-09-16 [r1068] Andrew M. Bishop <amb> * src/test/expected/node-restrictions-WP06.txt (added), src/test/node-restrictions.sh (added), src/test/expected/node-restrictions-WP07.txt (added), src/test/expected/node-restrictions-WP08.txt (added), src/test/node-restrictions.osm (added), src/optimiser.c, src/test/expected/node-restrictions-WP01.txt (added), src/test, src/test/expected/node-restrictions-WP02.txt (added), src/test/expected/node-restrictions-WP03.txt (added), src/test/expected/node-restrictions-WP04.txt (added), src/test/expected/node-restrictions-WP05.txt (added): Don't fail to route if a selected waypoint is a node that does not permit chosen traffic type. Add test cases for this change. 2012-09-13 [r1067] Andrew M. Bishop <amb> * src/test/oneway-loop.osm, src/test/invalid-turn-relations.osm, src/test/turns.osm: Make every test case loadable in JOSM. 2012-09-13 [r1066] Andrew M. Bishop <amb> * src/superx.c, src/optimiser.c: Update some comments and make a few very small optimisations. 2012-09-10 [r1065] Andrew M. Bishop <amb> * src/relationsx.c, src/waysx.c: Tidy up relation expression. 2012-09-10 [r1064] Andrew M. Bishop <amb> * src/relationsx.c: Log an error if a foot/bicycle way doesn't allow foot/bicycle transport (it already overrides the way tagging but didn't warn). 2012-09-09 [r1062-1063] Andrew M. Bishop <amb> * src/optimiser.c: Refactor the code for the previous change. * src/superx.c: Tiny optimisation to super-segment calculation. 2012-09-08 [r1058-1061] Andrew M. Bishop <amb> * src/optimiser.c: Fix the FindSuperSegment() function for routing problem. * src/test: Ignore new log files. * src/test/Makefile: Fixed a spelling mistake in the printed output. * src/test/oneway-loop.osm (added), src/test/expected/oneway-loop-WP01.txt (added), src/test/oneway-loop.sh (added): Added a new test case for a real-life pathological routing problem involving oneway streets and loops. 2012-08-12 [r1057] Andrew M. Bishop <amb> * src/visualiser.c: Fix for highway type visualiser (was missing one-way segments). 2012-08-11 Andrew M. Bishop <amb> Version 2.3.1 released 2012-08-11 [r1050] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/router.html.de, web/www/routino/router.html.nl: Revert the change to waypoint table widths. 2012-08-11 [r1049] Andrew M. Bishop <amb> * web/www/routino/router.pl: Fix for older versions of Perl that don't accept certain anonymous list syntax. 2012-08-11 [r1048] Andrew M. Bishop <amb> * doc/README.txt, FILES, doc/html/readme.html, doc/NEWS.txt: Updated for version 2.3.1. 2012-08-11 [r1047] Andrew M. Bishop <amb> * web/www/routino/router.pl, web/www/routino/router.js, web/www/routino/router.html.nl, web/www/routino, web/www/routino/visualiser.js, web/www/routino/icons/create-icons.pl, web/www/routino/maplayout.css, src/xml/Makefile, src/Makefile, web/www/routino/router.css, web/www/routino/router.html.de, web/www/routino/icons, src/xmlparse.l, web/www/routino/router.cgi, src/test/Makefile, web/www/routino/router.html.en, src: Merge the changes from trunk version into version 2.3.1 branch. 2012-08-06 [r1044-1045] Andrew M. Bishop <amb> * src/test/Makefile, src/Makefile, src/xml/Makefile: Be more consistent about what files to clean up. * src/xmlparse.l: Allow an unlimited number of attributes per tag without crashing. 2012-08-04 [r1043] Andrew M. Bishop <amb> * web/www/routino/router.pl, web/www/routino/router.js, web/www/routino/router.cgi: Don't send back the unused lines from the router CGI, add the complete command line and execution time to the log file. 2012-08-03 [r1040] Andrew M. Bishop <amb> * web/www/routino/router.html.de, web/www/routino/router.html.nl, web/www/routino/maplayout.css, web/www/routino/router.html.en, web/www/routino/router.css: Force the font size in pixels and adjust the table width so that user browser preferences don't destroy layout (using small or large font). 2012-08-03 [r1039] Andrew M. Bishop <amb> * web/www/routino/router.js: Fix some bugs in the latest check-ins. 2012-08-03 [r1038] Andrew M. Bishop <amb> * web/www/routino/router.html.de, web/www/routino/router.html.nl, web/www/routino/router.js, web/www/routino/router.html.en: Add a button to close the loop (duplicate the first waypoint at the end). 2012-08-03 [r1037] Andrew M. Bishop <amb> * web/www/routino/router.js: Don't add the waypoint items at the start and hide them if not needed but make them invisible to start with and display them if required. 2012-08-03 [r1036] Andrew M. Bishop <amb> * web/www/routino/router.js: Improve the way that the home marker is handled (dragging etc). 2012-08-03 [r1035] Andrew M. Bishop <amb> * web/www/routino/visualiser.js, web/www/routino/router.js: Add comments to the functions that are called from the HTML file (to simplify debugging and make easier to maintain). 2012-08-02 [r1034] Andrew M. Bishop <amb> * web/www/routino/router.js: Never-used markers now show as blank, not 0,0. Clicking an unused marker centres it on the map and updates the coordinates. 2012-08-02 [r1033] Andrew M. Bishop <amb> * web/www/routino/router.js: Refactor the code that inserts, removes and moves markers around so that all properties are moved including search/coords selection, search values etc. 2012-08-02 [r1032] Andrew M. Bishop <amb> * web/www/routino/router.js: Change the formSetCoords() function so that it doesn't change the active state. 2012-07-31 [r1030-1031] Andrew M. Bishop <amb> * web/www/routino/icons: Generate the full set of icons and ignore them from SVN. * web/www/routino/icons/create-icons.pl: Create more limit markers for the visualiser. 2012-07-22 [r1029] Andrew M. Bishop <amb> * web/www/routino/icons/create-icons.pl: Create marker-XXX-(red|grey).png icons which can get requested before the Javascript removes them. 2012-07-21 Andrew M. Bishop <amb> Version 2.3 released 2012-07-21 [r1026] Andrew M. Bishop <amb> * doc/NEWS.txt, doc/README.txt, FILES, doc/html/readme.html: Update to version 2.3. 2012-07-21 [r1025] Andrew M. Bishop <amb> * src/osmparser.c: Fix problem with not logging all invalid tags. Minor optimisation to speed up tag recognition. 2012-07-17 [r1023-1024] Andrew M. Bishop <amb> * doc/html/output.html: Change the comment describing the parameters for the example route. * doc/html/usage.html, doc/USAGE.txt: Add a note that too many threads and not enough memory will slow down planetsplitter operation. 2012-07-17 [r1022] Andrew M. Bishop <amb> * src/xmlparse.l: Some small lex changes and an optimisation to remove repeated memory allocation. 2012-07-16 [r1021] Andrew M. Bishop <amb> * src/sorting.c: Restore the shortcut that doesn't write the data to a temporary file if it all can be sorted in one go. This removes the slowdown with the multi-threaded code even when running with no threads. 2012-07-15 [r1020] Andrew M. Bishop <amb> * src/sorting.c: Don't call any of the pthread functions unless running with multiple threads. 2012-07-14 [r1019] Andrew M. Bishop <amb> * src/logging.c: Default not to use the --logtime option. 2012-07-12 [r1018] Andrew M. Bishop <amb> * web/www/routino/router.js: Another change related to OpenLayers 2.12. 2012-07-11 [r1017] Andrew M. Bishop <amb> * src/prunex.c: Fix bug with pruning straight highways (uninitialised data). 2012-07-10 [r1016] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/router.html.de, web/www/routino/router.html.nl, web/www/routino/router.js: Trigger the search form only when pressing the return key. 2012-07-10 [r1014-1015] Andrew M. Bishop <amb> * web/www/routino/page-elements.js: Remove some temporary variables by combining statements. * web/www/routino/visualiser.js: A change that should have been in r985. 2012-07-09 [r1013] Andrew M. Bishop <amb> * web/www/openlayers/routino.cfg, web/www/routino/visualiser.js, web/www/routino/router.js: Make compatible with OpenLayers version 2.12 (but don't default to using it). 2012-07-09 [r1012] Andrew M. Bishop <amb> * doc/INSTALL.txt, web/www/routino/router.js, web/www/routino/mapprops.js: Move the maxmarkers variable from router.js to mapprops.js. 2012-06-30 [r1011] Andrew M. Bishop <amb> * web/www/routino/router.js, web/www/routino/visualiser.js: Remove some temporary variables by combining statements. 2012-06-29 [r1010] Andrew M. Bishop <amb> * web/www/routino/router.html.de, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl, web/www/routino/router.js, web/www/routino/router.html.en: Fix HTML so that it validates. 2012-06-29 [r1009] Andrew M. Bishop <amb> * web/www/routino/router.js, web/www/routino/visualiser.js: Be more consistent with the .transform() operation. 2012-06-29 [r1008] Andrew M. Bishop <amb> * web/www/routino/router.js, web/www/routino/search.pl, web/www/routino/search.cgi: Pass bounding box to search to help find local places. Properly URI encode search strings. Properly check CGI parameters. 2012-06-29 [r1007] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/router.css, web/www/routino/router.html.de, web/www/routino/router.html.nl: Remove all style definitions from HTML files except for "display:none". 2012-06-29 [r1005-1006] Andrew M. Bishop <amb> * web/www/routino/icons/waypoint-coords.png, web/www/routino/icons/waypoint-search.png: Fix icons to have transparent background. * web/www/routino/router.html.de, web/www/routino/router.html.nl, web/www/routino/router.js, web/www/routino/search.pl, web/www/routino/router.html.en, web/www/routino/search.cgi, web/www/routino/router.css, doc/INSTALL.txt: Display all of the search results and allow the user to select one. 2012-06-05 [r1004] Andrew M. Bishop <amb> * web/www/routino/search.pl, web/www/routino/router.cgi, web/www/routino/results.cgi, web/www/routino/search.cgi, web/www/routino/visualiser.cgi, web/www/routino/router.pl, web/www/routino/statistics.cgi: Made some of the perl variables scope-local and checked other perl functions. 2012-06-05 [r1003] Andrew M. Bishop <amb> * src/visualiser.c, doc/html/usage.html, web/www/routino/visualiser.js, src/visualiser.h, src/filedumper.c, doc/USAGE.txt, web/www/routino/visualiser.cgi, web/www/routino/visualiser.html.en: Add an option to the visualiser to display segments of each of the highway types. 2012-06-05 [r1002] Andrew M. Bishop <amb> * src/visualiser.h, src/filedumper.c, doc/USAGE.txt, web/www/routino/visualiser.cgi, web/www/routino/visualiser.html.en, web/www/routino/visualiser.css, src/visualiser.c, doc/html/usage.html, web/www/routino/visualiser.js: Add an option to the visualiser to display segments accessible to each of the transport types. 2012-06-05 [r1001] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/search.cgi (added), web/www/routino/router.css, web/www/routino/paths.pl, web/www/routino/router.html.de, web/www/routino/icons/waypoint-search.png (added), web/www/routino/router.html.nl, web/www/routino/router.js, web/www/routino/icons/waypoint-coords.png (added), web/www/routino/search.pl (added): Add a button to replace the lat/long text entry with a location search entry. Use Nominatim service via CGI to get first search result and fill in coords. 2012-06-04 [r999-1000] Andrew M. Bishop <amb> * web/www/routino/results.cgi: No need to include paths.pl. * doc/html/installation.html: Move the filename prefix parameter to the paths.pl script with the other user-editable parameters. 2012-06-04 [r998] Andrew M. Bishop <amb> * doc/INSTALL.txt, web/www/routino/paths.pl, web/www/routino/router.pl: Move the filename prefix parameter to the paths.pl script with the other user-editable parameters. 2012-06-04 [r997] Andrew M. Bishop <amb> * web/www/routino/router.pl: On OSX the md5 program is called "md5" and not "md5sum". 2012-05-10 [r996] Andrew M. Bishop <amb> * src/sorting.c: Added some mutexes and condition variables to communicate between threads. 2012-05-09 [r995] Andrew M. Bishop <amb> * src/relationsx.c: Force bicycle routes to be bicycle accessible and foot routes to be foot accessible. 2012-05-08 [r994] Andrew M. Bishop <amb> * web/www/routino/router.html.de: Merge in the changes to the HTML template. 2012-05-08 [r993] Andrew M. Bishop <amb> * web/www/routino/router.html.de: Make link to documentation a relative one rather than to the Routino website. 2012-05-08 [r992] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/router.html.de (added), web/www/routino/router.html.nl: Add a German language router webpage, and links to it from the other ones (patch from Andreas Matthus). 2012-05-02 [r991] Andrew M. Bishop <amb> * src/planetsplitter.c, src/Makefile, doc/USAGE.txt, src/sorting.c, doc/html/usage.html: Convert sorting algorithms to optionally use multiple threads. 2012-05-01 [r990] Andrew M. Bishop <amb> * xml/routino-osm.xsd, xml/osm.xsd, src/osmparser.c: Handle OSM files that contain changesets. 2012-04-29 [r989] Andrew M. Bishop <amb> * src/planetsplitter.c: Handle the --process-only and --parse-only options better. 2012-04-01 [r988] Andrew M. Bishop <amb> * web/www/routino/customvisualiser.cgi, web/www/routino/customrouter.cgi: Don't even bother checking the legality of the parameters since the JavaScript does that. 2012-04-01 [r987] Andrew M. Bishop <amb> * web/www/routino/icons, web/www/routino/router.html.nl, web/www/routino/router.js, web/www/routino/icons/create-icons.pl, web/www/routino/router.html.en: The number of waypoints is controlled by the JavaScript and they are automatically inserted so there is no need to insert multiple lines in the HTML. 2012-03-31 [r986] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl, web/www/routino/router.js, web/www/routino/visualiser.js: Update the link URLs just-in-time rather than every time the map moves or parameters are changed. 2012-03-24 [r985] Andrew M. Bishop <amb> * web/www/routino/visualiser.js, web/www/routino/customvisualiser.cgi, web/www/routino/router.html.en, web/www/routino/visualiser.html.en, web/www/routino/router.html.nl, web/www/routino/router.js, web/www/routino/customrouter.cgi: Process the URL query string in the Javascript not in custom*.cgi. Refactor a lot of the code for coordinate handling. Simplify custom*.cgi so that they just redirect to the HTML page (will be removed in later versions - for existing link compatibility only). 2012-03-23 [r984] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/router.html.nl, web/www/routino/router.js: Added new buttons to centre map on marker and to add coordinates for current location (Javascript geolocation function). Shuffled the existing buttons around. Allow "up" on first marker and "down" on last marker to wrap around. 2012-03-23 [r983] Andrew M. Bishop <amb> * web/www/routino/icons/waypoint-locate.png (added), web/www/routino/icons/waypoint-recentre.png (added), web/www/routino/icons/waypoint-down.png, web/www/routino/icons/waypoint-add.png, web/www/routino/icons/waypoint-home.png, web/www/routino/icons/waypoint-remove.png, web/www/routino/icons/waypoint-centre.png, web/www/routino/icons/waypoint-up.png: Enlarged the button icons, changed some and added two new ones. 2012-03-17 [r982] Andrew M. Bishop <amb> * src/logging.c, doc/html/usage.html, src/planetsplitter.c, src/logging.h, doc/USAGE.txt: Add a new '--logtime' option that prints the elapsed time for planetsplitter. 2012-03-03 Andrew M. Bishop <amb> Version 2.2 released 2012-03-03 [r978-981] Andrew M. Bishop <amb> * doc/html/output.html: Updated to version 2.2. * doc/html/readme.html: Updated to version 2.2. * doc/README.txt, FILES: Updated to version 2.2. * doc/NEWS.txt: Updated to version 2.2. 2012-02-21 [r977] Andrew M. Bishop <amb> * src/prunex.c: Refactor code slightly for isolated regions. 2012-02-21 [r976] Andrew M. Bishop <amb> * src/prunex.c: Re-arrange small sections of code based on results of profiling. 2012-02-21 [r975] Andrew M. Bishop <amb> * src/test/a-b-c.sh, src/test/a-b.sh, doc/html/usage.html, src/planetsplitter.c, src/test/Makefile, src/test, doc/USAGE.txt, src/test/start-1-finish.sh, src/test/only-split.sh: Enable pruning by default. Fix the test cases to run with and without pruning but only compare against the expected results when not pruned. 2012-02-20 [r974] Andrew M. Bishop <amb> * src/planetsplitter.c: Prune straight highways then isolated regions and then short segments. 2012-02-20 [r973] Andrew M. Bishop <amb> * src/prunex.c: Remove compiler warnings (when compiled with optimisation). 2012-02-20 [r972] Andrew M. Bishop <amb> * src/prunex.c: Allow pruning isolated regions to be run second or later. 2012-02-20 [r971] Andrew M. Bishop <amb> * src/prunex.c: Don't remove nodes/segments when straightening ways if it would cause the loss of a way name. 2012-02-19 [r970] Andrew M. Bishop <amb> * src/prunex.c: Some fixes to be able to process the whole of the UK. 2012-02-18 [r969] Andrew M. Bishop <amb> * doc/html/algorithm.html, doc/ALGORITHM.txt: Add a general description of data pruning. 2012-02-18 [r968] Andrew M. Bishop <amb> * src/prunex.c: Fix bug with pruning that caused super-node search to fail. 2012-02-18 [r967] Andrew M. Bishop <amb> * src/prunex.c: Refactored the code for straight highways and made improvements. 2012-02-18 [r966] Andrew M. Bishop <amb> * src/prunex.h, doc/html/usage.html, src/planetsplitter.c, doc/USAGE.txt, src/prunex.c: Prune nodes in the middle of straight highways. 2012-02-12 [r965] Andrew M. Bishop <amb> * src/nodesx.h: Need 3 cached nodes for slim mode. 2012-02-11 [r964] Andrew M. Bishop <amb> * doc/html/usage.html, src/planetsplitter.c, src/segments.h, doc/USAGE.txt, src/waysx.h, src/prunex.c, src/segmentsx.h: Prune short segments. 2012-02-09 [r963] Andrew M. Bishop <amb> * src/prunex.h, src/planetsplitter.c, src/prunex.c: Prune isolated segments if they cannot be routed to anywhere else, not just if they are not connected. 2012-02-09 [r962] Andrew M. Bishop <amb> * src/types.h: The latlong_t type is signed so must use an appropriate constant. 2012-02-08 [r961] Andrew M. Bishop <amb> * src/nodesx.h, src/types.h, src/prunex.c: Change the way that pruned nodes are recorded. 2012-02-08 [r960] Andrew M. Bishop <amb> * src/prunex.c: Don't mark pruned nodes as they are found but mark them all at the end. 2012-02-07 [r959] Andrew M. Bishop <amb> * src/Makefile: Revert the CFLAGS value. 2012-01-28 [r958] Andrew M. Bishop <amb> * src/typesx.h: Fix the recent change with the bitmask type. 2012-01-28 [r956-957] Andrew M. Bishop <amb> * src/files.h, src/prunex.c: Fix function comments. * src/sorting.h: Replace a missing header. 2012-01-28 [r955] Andrew M. Bishop <amb> * src/segments.c, src/prunex.h, src/superx.c, src/visualiser.c, src/relationsx.c, src/profiles.h, src/sorting.h, src/fakes.h, src/nodesx.c, src/output.c, src/relations.c, src/typesx.h, src/results.c, src/relations.h, src/nodes.c, src/waysx.c, src/optimiser.c, src/osmparser.c, src/segmentsx.c, src/nodes.h, src/tagging.c, src/prunex.c, src/segmentsx.h, src/profiles.c, src/queue.c: Simplify and standardise the included headers. 2012-01-14 [r954] Andrew M. Bishop <amb> * src/typesx.h: Change the bitmask type from uint8_t to uint32_t. 2012-01-14 [r953] Andrew M. Bishop <amb> * src/prunex.h, doc/html/usage.html, src/planetsplitter.c, doc/USAGE.txt, src/prunex.c: Add the option to prune small isolated regions out of the database to avoid routes starting of finishing on them. 2012-01-14 [r951-952] Andrew M. Bishop <amb> * src/segmentsx.c: Bug fix for latest change. * src/relationsx.c: Zero the structure before filling it in so that no junk is written to disk. 2012-01-13 [r950] Andrew M. Bishop <amb> * src/nodesx.h, src/superx.c, src/segmentsx.c, src/typesx.h, src/segmentsx.h: Add new macros to abstract the bit mask types. 2012-01-13 [r949] Andrew M. Bishop <amb> * src/nodesx.h, src/prunex.h (added), src/superx.c, src/relationsx.c, src/types.h, src/planetsplitter.c, src/Makefile, src/segmentsx.c, src/nodesx.c, src/prunex.c (added), src/segmentsx.h: Add an infrastructure to allow adding new functions to prune nodes and segments. 2012-01-11 [r948] Andrew M. Bishop <amb> * src/sorting.c, src/relationsx.c, src/sorting.h, src/waysx.c, src/nodesx.c: The filesort_*() functions now return a count of the number of items kept after sorting. 2012-01-10 [r947] Andrew M. Bishop <amb> * src/superx.c, src/nodesx.c: Move the allocation of the nodexs super flags memory until just before it is needed and free it as soon as no longer needed. 2011-12-11 [r946] Andrew M. Bishop <amb> * src/segmentsx.c: Remove unnecessary test. 2011-12-11 [r945] Andrew M. Bishop <amb> * src/output.c: Remove warning about uninitialised variable. 2011-12-11 [r944] Andrew M. Bishop <amb> * src/relationsx.c, src/segmentsx.c, src/nodesx.c: Fill the structures with zero before inserting data and writing to file (removes junk from unused spaces in database files). 2011-12-11 [r943] Andrew M. Bishop <amb> * src/superx.c, src/relationsx.c, src/segmentsx.c, src/segmentsx.h: Remove the "position" parameter from the NextSegmentX() function. 2011-12-11 [r942] Andrew M. Bishop <amb> * src/nodesx.h, src/relationsx.c, src/segmentsx.c, src/waysx.h, src/segmentsx.h: Remove the "position" parameter from the PutBack*X() functions (only used in slim mode). 2011-12-10 [r940-941] Andrew M. Bishop <amb> * src/osmparser.h: Update file now that the name has changed. * src/functionsx.h (removed), src/planetsplitter.c, src/osmparser.c, src/osmparser.h (added): Rename functionsx.h to osmparser.h. 2011-12-09 [r939] Andrew M. Bishop <amb> * web/www/routino/customvisualiser.cgi, web/www/routino/customrouter.cgi: The custom router uses the translated router.html or visualiser.html depending on the browser's Accept-Language header. 2011-12-08 [r936-938] Andrew M. Bishop <amb> * web/www/routino/visualiser.html (added): Create a link from visualiser.html.en to visualiser.html. * web/www/routino/visualiser.html (removed), web/www/routino/visualiser.html.en (added): Rename visualiser.html to visualiser.html.en. * web/www/routino/visualiser.js, web/www/routino/visualiser.html, web/www/routino/router.js: Move semi-constant strings from the JavaScript to the HTML so that they can be translated. 2011-12-08 [r935] Andrew M. Bishop <amb> * web/www/routino/router.html.en, web/www/routino/router.html.nl, web/www/routino/router.js: Use the translated total distance from the summary and not the untranslated one from the CGI. 2011-12-08 [r934] Andrew M. Bishop <amb> * src/visualiser.c: Make limit checking work with one-way streets and in slim mode. 2011-12-07 [r933] Andrew M. Bishop <amb> * doc/html/installation.html, web/www/routino/visualiser.js, web/www/routino/router.html.en, doc/INSTALL.txt, web/www/routino/visualiser.html, web/www/routino/router.html.nl, web/www/routino/router.js, web/www/routino/mapprops.js (added): Move the map preferences (N/S/E/W range, zoom range and URLs) to a separate file. 2011-12-07 [r932] Andrew M. Bishop <amb> * web/www/routino/page-elements.css, web/www/routino/router.html.en, web/www/routino/visualiser.html, web/www/routino/router.html.nl: Replace the "show"/"hide" button with "+"/"-" buttons. 2011-12-07 [r931] Andrew M. Bishop <amb> * web/data/create.sh: Generate an error log. 2011-12-06 [r930] Andrew M. Bishop <amb> * doc/TAGGING.txt, doc/html/tagging.html: Describe what the roundabout and mini-roundabout tags are used for. 2011-12-06 [r929] Andrew M. Bishop <amb> * src/output.c: Mini-roundabouts are now described as roundabouts instead of junctions. 2011-12-06 [r927-928] Andrew M. Bishop <amb> * src/test/expected/turns-WP09.txt, src/test/expected/turns-WP10.txt, src/test/expected/turns-WP11.txt, src/test/expected/turns-WP12.txt, src/test/expected/turns-WP13.txt, src/test/expected/turns-WP14.txt, src/test/expected/turns-WP15.txt, src/test/expected/turns-WP07.txt, src/test/expected/turns-WP08.txt: Updated test case expected results with the roundabout changes. * src/output.c: Use constants for the values of the "important" variable. Fix the missing junctions on roundabouts. 2011-12-06 [r925-926] Andrew M. Bishop <amb> * src/output.c: Output HTML directions for roundabouts. * xml/routino-translations.xml, src/translations.h, src/translations.c, xml/routino-translations.xsd: Add new translate-able strings for roundabouts. 2011-12-06 [r924] Andrew M. Bishop <amb> * src/ways.h: Cache three ways not two. 2011-11-26 [r923] Andrew M. Bishop <amb> * src/types.h, doc/TAGGING.txt, src/osmparser.c, src/filedumper.c, doc/html/tagging.html, src/types.c, xml/routino-tagging.xml: Parse and store information about roundabouts (to improve routing instructions). 2011-11-26 [r921-922] Andrew M. Bishop <amb> * doc/OUTPUT.txt, src/output.c, doc/html/output.html: Refactor a lot of the code, simplify it and fix some bugs: Names of highways in HTML format. Names of highways and bearings for GPX routes. Change the format of the text file to be more like GPX & HTML. * src/ways.h, src/ways.c: Allow space to cache one name for each cached way (in slim mode). 2011-11-23 [r920] Andrew M. Bishop <amb> * xml/routino-tagging-nomodify.xml: Fix the invalid XML. 2011-11-22 [r919] Andrew M. Bishop <amb> * src/osmparser.c, xml/routino-osm.xsd: Check that XML file contains version='0.6' in 'osm' tag. 2011-11-22 [r918] Andrew M. Bishop <amb> * src/filedumper.c: Refactor the code by moving the dumping of an OSM region into a separate function. 2011-11-22 [r917] Andrew M. Bishop <amb> * src/filedumper.c: Include a bounding box in the --dump-osm XML output. 2011-11-21 [r916] Andrew M. Bishop <amb> * src/filedumper.c: Ensure that only segments completely within the specified region are dumped when using --dump-osm. 2011-11-21 [r914-915] Andrew M. Bishop <amb> * doc/TAGGING.txt, doc/html/tagging.html: Document the use of the area tag. * src/osmparser.c, src/segmentsx.c, xml/routino-tagging.xml: When an area and a way overlap keep the way and discard the area. 2011-11-20 [r913] Andrew M. Bishop <amb> * src/test/Makefile, src/xml/Makefile: Fix some more Makefile oddities. 2011-11-20 [r912] Andrew M. Bishop <amb> * web/www/openlayers/install.sh: Change script to default to downloading OpenLayers v2.11. 2011-11-19 [r910-911] Andrew M. Bishop <amb> * Makefile: Fix some Makefile oddities. * src/test/Makefile, src/Makefile, src/xml/Makefile: Fix some Makefile oddities. 2011-11-19 [r907-909] Andrew M. Bishop <amb> * doc/html/tagging.html: Fix heading anchor names. * src/xml/test/bad-comment-extra-double-dash.xml (added), src/xmlparse.l: Fixed bug in XMl parsing that allowed invalid XML (double dash within comments). * src/queue.c: Revert back to r874 (itself the same as r867) but with the change that should have happened in r883 rather than being based on r868. 2011-11-12 Andrew M. Bishop <amb> Version 2.1.2 released 2011-11-12 [r903] Andrew M. Bishop <amb> * doc/NEWS.txt, doc/README.txt, FILES, doc/html/readme.html: Updated for version 2.1.2. 2011-11-12 [r902] Andrew M. Bishop <amb> * xml/routino-translations.xml, web/www/routino/router.html.en, web/www/routino/router.html.nl: Added Russian language translations. 2011-11-12 [r901] Andrew M. Bishop <amb> * doc/OUTPUT.txt, doc/TAGGING.txt, doc/ALGORITHM.txt, doc/INSTALL.txt: Small formatting changes. 2011-11-11 [r900] Andrew M. Bishop <amb> * doc/OUTPUT.txt, src/output.c, doc/html/output.html: Change the names of the variables for the XML and raw versions of the highway names. Output the text files with translated highway names. Update the documentation to say that only the header is untranslated in the text files. 2011-11-11 [r899] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Fix invalid XML file. 2011-11-11 [r898] Andrew M. Bishop <amb> * doc/TAGGING.txt, doc/html/tagging.html, xml/routino-tagging.xml: Improve the documentation for the tagging rule configuration file. 2011-11-11 [r896-897] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Add some more tagging rules from the UK error.log file. * web/bin/summarise-log.pl: Summarise segments that are loops. 2011-11-11 [r895] Andrew M. Bishop <amb> * src/relationsx.c: Make the progress messages more consistent. 2011-11-10 [r894] Andrew M. Bishop <amb> * web/www/routino/router.pl: Use the same convention to indicate the user-editable part of the file as used elsewhere. 2011-11-10 [r893] Andrew M. Bishop <amb> * src/translations.h, doc/OUTPUT.txt, src/output.c, src/translations.c, doc/html/output.html: Change the names of the variables for the XML and raw versions of the translations. Output the text files with the raw versions and not the XML versions of the copyright information. Update the documentation to say that only the copyright information is translated in the text files. 2011-11-10 [r892] Andrew M. Bishop <amb> * src/translations.c: Don't convert the highway types to XML numeric entities here (it is already done in the output functions). 2011-11-09 [r891] Andrew M. Bishop <amb> * src/optimiser.c: Change the condition used to terminate the search for the best route. 2011-11-08 [r890] Andrew M. Bishop <amb> * src/superx.c: Improve comment. 2011-11-08 [r889] Andrew M. Bishop <amb> * xml/Makefile: Delete the auto-generated profile.js and profile.pl files with distclean target. 2011-10-31 [r888] Andrew M. Bishop <amb> * src/files.h: Add a #define to disable the use of pread()/pwrite() but this must be manually configured, there is no configure script. 2011-10-31 [r887] Andrew M. Bishop <amb> * src/nodesx.h, src/relations.h, src/files.h, src/relationsx.c, src/ways.h, src/segments.h, src/waysx.c, src/Makefile, src/xml/Makefile, src/nodes.h, src/waysx.h, src/segmentsx.h: Use pread() and pwrite() functions instead of seek() followed by read() or write(). 2011-10-30 [r886] Andrew M. Bishop <amb> * src/nodes.c, src/nodes.h: Copy the node offsets into RAM for the slim mode since looking them up in the file is the largest single contributor to the time. 2011-10-29 [r885] Andrew M. Bishop <amb> * src/segments.c, src/visualiser.c, src/nodes.c, src/optimiser.c, src/filedumper.c, src/nodes.h, src/output.c: Rationalise and reduce the usage of LookUpNode() function. 2011-10-24 [r884] Andrew M. Bishop <amb> * src/Makefile, src/xml/Makefile: Fix long-standing annoying bug with dependencies for slim versions. 2011-10-24 [r883] Andrew M. Bishop <amb> * src/queue.c: No need to use uint32_t (just use int). 2011-10-23 Andrew M. Bishop <amb> Version 2.1.1 released 2011-10-23 [r881-882] Andrew M. Bishop <amb> * doc/NEWS.txt, FILES, doc/html/readme.html: Update for version 2.1.1. * doc/html/configuration.html: Update copyright year. 2011-10-22 [r880] Andrew M. Bishop <amb> * Makefile: Fix running 'make test' from the top level. 2011-10-22 [r879] Andrew M. Bishop <amb> * src/filedumper.c: Add some more typecasts before printing the values. 2011-10-22 [r878] Andrew M. Bishop <amb> * xml/Makefile: Fix the installation of the XML files. 2011-10-22 [r876-877] Andrew M. Bishop <amb> * src/test/expected/turns-WP09.txt, src/test/turns.osm, src/test/expected/turns-WP10.txt, src/test/expected/turns-WP11.txt, src/test/expected/turns-WP12.txt, src/test/expected/turns-WP04.txt, src/test/expected/turns-WP13.txt, src/test/expected/turns-WP05.txt, src/test/expected/turns-WP14.txt, src/test/expected/turns-WP06.txt, src/test/expected/turns-WP15.txt, src/test/expected/turns-WP16.txt (added), src/test/expected/turns-WP07.txt, src/test/expected/turns-WP08.txt: Test case for 'except' tags on turn restrictions. * src/osmparser.c, xml/routino-tagging.xml: Fix handling of 'except' tags for turn restrictions. 2011-10-22 [r875] Andrew M. Bishop <amb> * src/sorting.c: Revert back to something very close to r869 because it is fastest by a tiny fraction. 2011-10-22 [r874] Andrew M. Bishop <amb> * src/results.h, src/queue.c: Revert back to r867 because it is faster (although only by 1%) than any of the other combinations. 2011-10-22 [r873] Andrew M. Bishop <amb> * src/sorting.c, src/queue.c: Revert back to r864 zero-based binary heap but with r868/r869 refactored code. 2011-10-15 [r872] Andrew M. Bishop <amb> * src/sorting.c, src/queue.c: Change the binary heap to a 3-ary heap. 2011-10-15 [r871] Andrew M. Bishop <amb> * src/sorting.c: Bug fixes for the previous change. 2011-10-15 [r870] Andrew M. Bishop <amb> * src/sorting.c, src/results.h, src/queue.c: Change the binary heap to a 4-ary heap. 2011-10-15 [r868-869] Andrew M. Bishop <amb> * src/sorting.c: Refactor the binary heap to reduce the number of comparisons. * src/queue.c: Refactor the binary heap to reduce the number of comparisons. 2011-10-09 [r867] Andrew M. Bishop <amb> * src/sorting.c: Change to a unity based binary heap rather than zero based one to save some additions. 2011-10-09 [r866] Andrew M. Bishop <amb> * src/queue.c: Bug fix with previous change. 2011-10-06 [r865] Andrew M. Bishop <amb> * src/results.h, src/queue.c: Change to a unity based binary heap rather than zero based one to save some additions. 2011-10-06 [r864] Andrew M. Bishop <amb> * src/results.c: Swap the order of two parts of an && statement. 2011-10-06 [r863] Andrew M. Bishop <amb> * src/results.h, src/results.c: Change bin counters to 8-bit (reduces memory) and pre-allocate first dimension of pointer array (saves time). 2011-10-06 [r862] Andrew M. Bishop <amb> * Makefile, xml/Makefile, doc/Makefile, src/Makefile, src/xml/Makefile: Makefiles are more consistent with each other and 'make test' can be run from the top level. 2011-10-06 [r861] Andrew M. Bishop <amb> * doc/html/usage.html, src/planetsplitter.c, doc/USAGE.txt: Change the default number of iterations to 5 since testing shows that there is negligible improvement beyond here. 2011-10-05 [r860] Andrew M. Bishop <amb> * src/optimiser.c: Optimise the number of hash function bins by trial and error. 2011-10-05 [r859] Andrew M. Bishop <amb> * src/Makefile, src/xml/Makefile: Add the gcc options for profiling (coverage) and delete the files generated by it. 2011-10-05 [r858] Andrew M. Bishop <amb> * src/results.c: If there are too many results in one bin then double the number of bins. 2011-10-05 [r857] Andrew M. Bishop <amb> * src/results.h, src/results.c: Remove the two RESULTS_*_INCREMENT constants by swapping the dimensions on the 'point' array so that both have unity value and are pointless. 2011-10-05 [r856] Andrew M. Bishop <amb> * src/superx.c: Optimise the number of hash function bins by trial and error. 2011-10-04 [r854-855] Andrew M. Bishop <amb> * src/superx.c, src/optimiser.c: Increase the size of the hash array used to store the results. * src/results.h, src/results.c: Change the way that allocated memory is tracked. 2011-10-04 [r853] Andrew M. Bishop <amb> * src/results.c: Split the data increment constant into two for the different parts of the data structure. 2011-10-03 [r852] Andrew M. Bishop <amb> * web/www/routino/router.cgi: Ensure that the shortest or quickest option is passed to the router. 2011-10-03 Andrew M. Bishop <amb> Version 2.1 released 2011-10-03 [r851] Andrew M. Bishop <amb> * FILES: Remove another .svn directory. 2011-10-03 [r850] Andrew M. Bishop <amb> * doc/NEWS.txt, FILES, doc/html/readme.html: Update for version 2.1. 2011-09-07 [r849] Andrew M. Bishop <amb> * src/test/super-or-not.osm, src/optimiser.c, src/test/expected/super-or-not-WP03.txt (added): Handle the special case where the start point is a super-node and the finish point is somewhere within one of the super-segments from that node. 2011-09-07 [r848] Andrew M. Bishop <amb> * src/nodes.c: Fix for previous binary search change. 2011-09-07 [r847] Andrew M. Bishop <amb> * src/filedumper.c: Fix bug with earlier change to OSM file creator. 2011-09-07 [r846] Andrew M. Bishop <amb> * src/router.c: Fix confusing, duplicated, output message. 2011-09-07 [r845] Andrew M. Bishop <amb> * src/nodes.c: Make stricter checks for closest nodes just like in v2.0.3 for segments. 2011-09-07 [r844] Andrew M. Bishop <amb> * src/filedumper.c: Fix formatting problem with dumped OSM file. 2011-09-07 [r842-843] Andrew M. Bishop <amb> * src/nodes.c, src/waysx.c, src/nodesx.c, src/relations.c: Check binary search functions and improve comments, fix pathological case with end point and/or improve start point. * src/filedumper.c: Use macro test function rather than direct check. 2011-09-06 [r841] Andrew M. Bishop <amb> * src/test/super-or-not.osm (added), src/test/a-b.sh (added), src/test/expected/super-or-not-WP01.txt (added), src/test/expected/super-or-not-WP02.txt (added), src/test, src/test/super-or-not.sh (added): Added a new test case for the routing bug-fix in version 2.0.3 (route via super-nodes may not be shortest). 2011-09-06 [r840] Andrew M. Bishop <amb> * src/test/expected/dead-ends-WP01.txt, src/test/expected/dead-ends-WP02.txt, src/test/expected/dead-ends-WP03.txt, src/test/expected/dead-ends-WP04.txt, src/test/expected/dead-ends-WP05.txt, src/test/expected/dead-ends-WP06.txt, src/test/expected/dead-ends-WP07.txt, src/test/expected/dead-ends-WP08.txt, src/test/expected/dead-ends-WP09.txt, src/test/expected/loops-WP10.txt, src/test/expected/loops-WP11.txt, src/test/copyright.xml (added), src/test/expected/no-super-WP01.txt, src/test/expected/no-super-WP02.txt, src/test/expected/no-super-WP03.txt, src/test/expected/no-super-WP04.txt, src/test/expected/turns-WP01.txt, src/test/expected/turns-WP02.txt, src/test/expected/turns-WP03.txt, src/test/start-1-finish.sh, src/test/expected/turns-WP04.txt, src/test/expected/turns-WP05.txt, src/test/expected/turns-WP06.txt, src/test/expected/turns-WP07.txt, src/test/expected/turns-WP08.txt, src/test/expected/turns-WP09.txt, src/test/a-b-c.sh, src/test/expected/dead-ends-WP10.txt, src/test/expected/dead-ends-WP11.txt, src/test/expected/loops-WP01.txt, src/test/expected/loops-WP02.txt, src/test/expected/loops-WP03.txt, src/test/expected/loops-WP04.txt, src/test/expected/loops-WP05.txt, src/test/expected/loops-WP06.txt, src/test/expected/loops-WP07.txt, src/test/expected/loops-WP08.txt, src/test/expected/loops-WP09.txt, src/test/expected/turns-WP10.txt, src/test/expected/turns-WP11.txt, src/test/expected/turns-WP12.txt, src/test/expected/turns-WP13.txt, src/test/expected/turns-WP14.txt, src/test/expected/turns-WP15.txt: Ensure that test cases have correct copyright notice (Routino, AGPL3) in generated data and not the default one (OSM, CC-SA). 2011-09-06 [r838-839] Andrew M. Bishop <amb> * src/test/expected/dead-ends-WP01.txt (added), src/test/expected/dead-ends-WP02.txt (added), src/test/expected/dead-ends-WP03.txt (added), src/test/expected/dead-ends-WP04.txt (added), src/test/expected/dead-ends-WP05.txt (added), src/test/expected/dead-ends-WP06.txt (added), src/test/expected/dead-ends-WP07.txt (added), src/test/expected/dead-ends-WP08.txt (added), src/test/expected/loops-WP10.txt (added), src/test/expected/dead-ends-WP09.txt (added), src/test/expected/loops-WP11.txt (added), src/test/expected/no-super-WP01.txt (added), src/test/expected/no-super-WP02.txt (added), src/test/expected/no-super-WP03.txt (added), src/test/expected/turns-WP01.txt (added), src/test/expected/no-super-WP04.txt (added), src/test/expected/turns-WP02.txt (added), src/test/expected/turns-WP03.txt (added), src/test/expected/turns-WP04.txt (added), src/test/expected/turns-WP05.txt (added), src/test/expected/turns-WP06.txt (added), src/test/expected/turns-WP07.txt (added), src/test/expected/turns-WP08.txt (added), src/test/expected/turns-WP09.txt (added), src/test/expected/dead-ends-WP10.txt (added), src/test/expected/dead-ends-WP11.txt (added), src/test/expected/loops-WP01.txt (added), src/test/expected/loops-WP02.txt (added), src/test/expected/loops-WP03.txt (added), src/test/expected/loops-WP04.txt (added), src/test/expected/loops-WP05.txt (added), src/test/expected/loops-WP06.txt (added), src/test/expected/loops-WP07.txt (added), src/test/expected/loops-WP08.txt (added), src/test/expected/loops-WP09.txt (added), src/test/expected/turns-WP10.txt (added), src/test/expected/turns-WP11.txt (added), src/test/expected/turns-WP12.txt (added), src/test/expected/turns-WP13.txt (added), src/test/expected/turns-WP14.txt (added), src/test/expected/turns-WP15.txt (added): Store the expected results to check for future regressions. * src/test/a-b-c.sh, src/test/expected (added), src/test/start-1-finish.sh: Store the expected results to check for future regressions. 2011-09-05 [r837] Andrew M. Bishop <amb> * src/relationsx.c: Ignore relations based on all vehicle types (including bicycles) not just motor vehicles. 2011-09-05 [r836] Andrew M. Bishop <amb> * xml/Makefile, xml/scripts/walk.pl (added), xml, xml/scripts/ride.pl (added), web/data, xml/scripts (added), xml/scripts/drive.pl (added): Generate special-use sets of tagging rules for walking, riding and driving 2011-08-27 [r834-835] Andrew M. Bishop <amb> * web/bin/summarise-log.pl (added): A script to process the error log file and summarise it. * xml/routino-tagging.xml: Add lots more tagging rules based on errors logged from parsing UK, add some more error logging. 2011-08-27 [r832-833] Andrew M. Bishop <amb> * src/osmparser.c: Only log errors for highways. * src/relationsx.c: Improve the error messages for bad relations. 2011-08-27 [r830-831] Andrew M. Bishop <amb> * src/filedumper.c: Change the 'generator' tag in the dumped XML file. * xml/routino-tagging.xsd: Whitespace change. 2011-08-21 [r828] Andrew M. Bishop <amb> * doc/NEWS.txt, doc/README.txt, src/nodes.c, FILES, src/optimiser.c, src/router.c, doc/html/readme.html: Merge version 2.0.3 into working version. 2011-08-14 [r827] Andrew M. Bishop <amb> * src/tagging.h, src/tagging.c, xml/routino-tagging.xsd: Add an unset rule in the tagging processing XML file. 2011-08-13 [r826] Andrew M. Bishop <amb> * src/tagging.h, src/tagmodifier.c, src/osmparser.c, src/tagging.c, xml/routino-tagging.xsd: Add a logerror rule in the tagging processing XML file. 2011-08-04 [r825] Andrew M. Bishop <amb> * src/osmparser.c: Add more acceptable number suffixes. 2011-07-23 [r813] Andrew M. Bishop <amb> * src/osmparser.c: Better parsing of width/height/length and weight and more information about value actually used. 2011-07-21 [r812] Andrew M. Bishop <amb> * src/relationsx.c, src/osmparser.c, src/waysx.c, src/segmentsx.c, src/nodesx.c: Add logging of parsing and processing errors. 2011-07-21 [r810-811] Andrew M. Bishop <amb> * src/test/a-b-c.sh, src/test/start-1-finish.sh, src/test/only-split.sh: Use the --errorlog option. * doc/html/usage.html, src/planetsplitter.c, doc/USAGE.txt: The filename is now optional in the --errorlog option. 2011-07-21 [r809] Andrew M. Bishop <amb> * src/planetsplitter.c: Only open/close the error log file if one was requested. 2011-07-10 [r806-808] Andrew M. Bishop <amb> * src/test: Ignore the auto-generated files from the new test case. * src/test/invalid-turn-relations.osm (added), src/test/invalid-turn-relations.sh (added), src/test/only-split.sh (added): Add test cases for the new turn relation validity checks. * src/relationsx.c: Check turn relations more carefully and discard them if they are invalid. 2011-07-04 [r805] Andrew M. Bishop <amb> * src/relationsx.c: Change the termination of route relation way/relation lists. 2011-07-03 [r804] Andrew M. Bishop <amb> * src/logging.c, doc/html/usage.html, src/planetsplitter.c, src/logging.h, doc/USAGE.txt: Add framework for logging error during OSM parsing and subsequent processing. 2011-07-02 [r803] Andrew M. Bishop <amb> * src/nodes.h: Replace over-sized file entry with one of appropriate size. 2011-08-04 Andrew M. Bishop <amb> Version 2.0.3 released 2011-08-04 [r823] Andrew M. Bishop <amb> * doc/NEWS.txt, doc/README.txt, FILES, doc/html/readme.html: Updated for version 2.0.3. 2011-08-04 [r822] Andrew M. Bishop <amb> * src/router.c: If there is a route that passes super-nodes and one that doesn't then choose the better one. 2011-08-04 [r820-821] Andrew M. Bishop <amb> * src/router.c: If there is a direct route without passing any super-nodes then keep it as a backup in case the potential route that does pass super-nodes doesn't work out. * src/optimiser.c: Allow calling FixForwardRoute() more than once. 2011-08-04 [r819] Andrew M. Bishop <amb> * src/optimiser.c: Revert previous change because it breaks the dead-end handling. 2011-08-03 [r818] Andrew M. Bishop <amb> * src/router.c: Find a valid route if the start and end point are the same location (it doesn't require a U-turn). 2011-08-03 [r817] Andrew M. Bishop <amb> * src/optimiser.c, src/router.c: Add a new (less confusing) error message for when the start of the route has no super-nodes and doesn't include the end node and make clearer the error message when the combining of routes fails. 2011-08-03 [r816] Andrew M. Bishop <amb> * src/nodes.c: Make more checks on the closest segment to avoid choosing one that our profile does not allow us to use. 2011-08-02 [r815] Andrew M. Bishop <amb> * src/optimiser.c: Handle the case where the start node is a super-node and there is no previous segment. 2011-06-26 Andrew M. Bishop <amb> Version 2.0.2 released 2011-06-26 [r800-r801] Andrew M. Bishop <amb> * doc/README.txt, doc/html/readme.html: Update for version 2.0.2. * doc/NEWS.txt, FILES, doc/html/readme.html: Update for version 2.0.2. 2011-06-25 [r798-799] Andrew M. Bishop <amb> * src/results.c: Fix comment associated with results list memory handling. * src/optimiser.c: Free temporary results that are calculated. 2011-06-25 [r795-797] Andrew M. Bishop <amb> * src/tagging.h, src/planetsplitter.c, src/tagging.c: Add some functions to free the tagging rules when they have been used. * src/osmparser.c: Free some memory allocated when parsing the file. * src/nodesx.c: Free some memory allocated when writing the file. 2011-06-19 [r794] Andrew M. Bishop <amb> * src/tagmodifier.c: Change to unsigned long and ensure that printf format specifiers are correct. 2011-06-19 [r792-793] Andrew M. Bishop <amb> * src/segmentsx.c: If a node has no segments return a NULL pointer rather than random junk. * xml/routino-tagging.xml: Reinstate the line that makes roundabouts one-way. 2011-06-18 [r791] Andrew M. Bishop <amb> * src/osmparser.c, src/xmlparse.h, src/xmlparse.l: Don't use the flex yylineno but keep track with an unsigned long long line counter instead (if there are more than 2^31 nodes then there are more than 2^31 lines as well). 2011-06-18 [r790] Andrew M. Bishop <amb> * src/superx.c, src/relationsx.c, src/types.h, src/osmparser.c, src/waysx.c, src/filedumper.c, src/segmentsx.c, src/nodesx.c, src/router.c, src/typesx.h: Ensure that when printing numbers of the index_t type that an appropriate printf format specifier is used (ready for if it is redefined as 64-bit). 2011-06-18 [r788-789] Andrew M. Bishop <amb> * src/Makefile: Use the -std=c99 option by default. * src/relationsx.c, src/waysx.c, src/segmentsx.c, src/nodesx.c, src/segmentsx.h: Fix some more warnings from -Wextra and/or -pedantic options. 2011-06-18 [r787] Andrew M. Bishop <amb> * src/xmlparse.l: Use flex %options instead of #defines, force clean compilation with C99. 2011-06-18 [r786] Andrew M. Bishop <amb> * src/relationsx.c, src/relationsx.h: Rename structure element "restrict" to "restriction" to avoid C99 error (reserved word). 2011-06-18 [r785] Andrew M. Bishop <amb> * src/superx.c: Removed warning from gcc-4.6. 2011-06-14 [r784] Andrew M. Bishop <amb> * xml/routino-tagging.xml: Fix error with handling ferry routes (patch from Michael Günnewig). 2011-06-07 Andrew M. Bishop <amb> Version 2.0.1 released 2011-06-07 [r782] Andrew M. Bishop <amb> * doc/html/readme.html: Update for version 2.0.1. 2011-06-07 [r781] Andrew M. Bishop <amb> * doc/NEWS.txt, doc/README.txt, FILES: Update for version 2.0.1. 2011-06-05 [r779-780] Andrew M. Bishop <amb> * src/superx.c, src/visualiser.c, src/nodes.c, src/relationsx.c, src/waysx.c, src/filedumper.c, src/segmentsx.c, src/nodesx.c, src/relations.c: Replace int with appropriate defined types (mostly index_t, ll_bin_t and ll_bin2_t). * src/types.h: Add some comments to clarify the latitude/longitude bin types and a new type for latitude/longitude bins (two dimensions). 2011-06-05 [r777-778] Andrew M. Bishop <amb> * src/profiles.c: Change unsigned int to int for consistency with the rest of the code. * src/optimiser.c: Remove unused variable (hangover from previous U-turn searching). 2011-06-04 [r776] Andrew M. Bishop <amb> * src/superx.c, src/osmparser.c: Add missing header file. 2011-06-04 [r773-775] Andrew M. Bishop <amb> * src/osmparser.c: Convert integer and floating point values inline. Check that node, way and relation IDs don't need to be long long types. * src/translations.c, src/profiles.c: Convert integer and floating point values inline. * src/xmlparse.h, src/xmlparse.l: The XMLPARSE_ASSERT_(INTEGER|FLOATING) functions now don't return the converted type. 2011-06-04 [r770-772] Andrew M. Bishop <amb> * src/segments.h: Add a type cast to a macro. * src/segmentsx.c, src/segmentsx.h: Change name of function parameters to clarify what they are. * src/relationsx.c, src/segmentsx.c: Fix some more potential problems with a transition to 64-bit node_t. 2011-06-03 [r761] Andrew M. Bishop <amb> * src/superx.c, src/relationsx.c, src/segmentsx.c: Shorten the messages when running to avoid going beyond 80 characters. 2011-06-03 [r759-760] Andrew M. Bishop <amb> * src/visualiser.c: Remove hard-coded numeric value and replace with a #define value. * src/superx.c, src/relationsx.c, src/segmentsx.c, src/typesx.h: Remove hard-coded numeric values and replace with a common #define value. Handle overflows consistently. 2011-06-03 [r758] Andrew M. Bishop <amb> * src/nodesx.h, src/typesx.h: Move some macros from nodesx.h to typesx.h. 2011-06-03 [r757] Andrew M. Bishop <amb> * src/relationsx.c, src/tagmodifier.c, src/optimiser.c, src/osmparser.c, src/waysx.c: Rationalise the increment of the numbers used for the output when not --loggable. 2011-06-01 [r756] Andrew M. Bishop <amb> * src/relationsx.c: Delete turn relations that refer to nodes or ways that don't exist as soon as possible. 2011-05-31 [r755] Andrew M. Bishop <amb> * src/nodesx.h, src/osmparser.c, src/segmentsx.c, src/waysx.h, src/typesx.h: Fix some obvious problems with a transition to 64-bit node_t. 2011-05-31 [r754] Andrew M. Bishop <amb> * src/tagging.c, src/translations.c, src/profiles.c: Fix inconsistent C language version usage. 2011-05-30 Andrew M. Bishop <amb> Version 2.0 released 2011-05-30 [r742] Andrew M. Bishop <amb> * src/relationsx.c: Don't crash on malformed relations, give better reporting of number when processing them. 2011-05-30 [r741] Andrew M. Bishop <amb> * FILES: Update for release. 2011-05-30 [r740] Andrew M. Bishop <amb> * src/segmentsx.c: Fix spelling mistake in function parameter comment. 2011-05-30 [r738-739] Andrew M. Bishop <amb> * src/test/Makefile: Make sure that clean really means it. * doc/NEWS.txt, doc/README.txt, doc/html/readme.html: Update for version 2.0 release. 2011-05-30 [r737] Andrew M. Bishop <amb> * doc/html/usage.html, doc/html/algorithm.html, doc/TAGGING.txt, doc/html/index.html, doc/html/data.html, doc/USAGE.txt, doc/ALGORITHM.txt, doc/DATA.txt, doc/html/tagging.html: Run a spelling check on the documentation. 2011-05-30 [r736] Andrew M. Bishop <amb> * doc/html/algorithm.html: Describe new philosophy of alloing U-turn at waypoints to avoid dead-ends. 2011-05-30 [r735] Andrew M. Bishop <amb> * src/optimiser.c: Fix problem with test case loops WP11. 2011-05-30 [r734] Andrew M. Bishop <amb> * src/optimiser.c, src/functions.h, src/router.c: Change the philosophy on dead ends so that now a U-turn is made at the waypoint if continuing in the previous direction would lead into a dead-end. This simplifies the algorithm and removes a lot of special case handling. 2011-05-30 [r731-733] Andrew M. Bishop <amb> * src/test/loops.osm: Give the loops unique names. * src/test/a-b-c.sh, src/test/start-1-finish.sh: Print less information when running. * src/fakes.c: Fix error with calculating length of fake segment and optimise the ExtraFakeSegment function. 2011-05-29 [r730] Andrew M. Bishop <amb> * src/test/a-b-c.sh: Exit on error. 2011-05-21 [r729] Andrew M. Bishop <amb> * src/optimiser.c, src/functions.h, src/router.c: Find all routes in the no-super.osm test case. 2011-05-20 [r727-728] Andrew M. Bishop <amb> * src/test/no-super.osm: Add new test cases for fake nodes/segments. * src/fakes.c, src/optimiser.c, src/fakes.h: Add a special function to handle the detection of U-turns between two fake segments that sit on the same real segment. 2011-05-18 [r725-726] Andrew M. Bishop <amb> * src/test/a-b-c.sh (added), src/test, src/test/no-super.sh (added), src/test/no-super.osm (added): Add new test cases for very simple routes with no super-nodes. * src/fakes.c: Fix routing between two fake nodes on the same segment (again). 2011-05-18 [r724] Andrew M. Bishop <amb> * src/test/dead-ends.osm: Add a new waypoint at the very end of a dead-end (not super-node). 2011-05-18 [r722-723] Andrew M. Bishop <amb> * src/optimiser.c, src/functions.h: Remove the override flag from FindNormalRoute(). * src/optimiser.c, src/functions.h, src/router.c: Use the beginning of the route as the start of the combined route (since it may have special override segments in it). 2011-05-17 [r721] Andrew M. Bishop <amb> * src/optimiser.c, src/functions.h, src/router.c: Change the order of the arguments to the routing functions (move profile earlier). 2011-05-17 [r720] Andrew M. Bishop <amb> * doc/Makefile: Install the license file in the doc directory. 2011-05-15 [r719] Andrew M. Bishop <amb> * src/optimiser.c, src/router.c: Finally find a way out of dead-ends, might have some nasty side-effects though. 2011-05-14 [r717-718] Andrew M. Bishop <amb> * src/optimiser.c: Fix slim/non-slim variation. * src/test/dead-ends.osm: Add another waypoint at the terminal super-node. 2011-05-13 [r716] Andrew M. Bishop <amb> * src/test/turns.osm: Force waypoint 13 to go round the roundabout twice. 2011-05-12 [r714-715] Andrew M. Bishop <amb> * src/test/turns.osm (added), src/test, src/test/turns.sh (added): Added turn restriction test cases. * src/test/start-1-finish.sh: Bug fix for logging. 2011-05-11 [r712-713] Andrew M. Bishop <amb> * src/superx.c, src/segmentsx.c: Add comments to assert statements that don't already have them. * src/optimiser.c: Crash out if infinite loop (usually caused by a bug elsewhere). 2011-05-08 [r708-711] Andrew M. Bishop <amb> * src/test/start-1-finish.sh: Run filedumper, allow running under a run-time debugger. * src/optimiser.c: Remove clash of cache locations. * src/test/Makefile: Print an extra message after comparing the slim and non-slim results. * src/segments.c, src/segments.h: Make the NextSegment function inline (move from segments.c to segments.h). 2011-05-08 [r707] Andrew M. Bishop <amb> * src/segments.c, src/visualiser.c, src/nodes.c, src/optimiser.c, src/filedumper.c, src/nodes.h, src/output.c: The FirstSegment function now takes a cache position argument. 2011-05-08 [r706] Andrew M. Bishop <amb> * src/segments.c, src/nodes.c, src/relations.c, src/ways.c: Ensure that the correct number of cached nodes, segments, ways or relations are initialised. 2011-05-08 [r705] Andrew M. Bishop <amb> * src/ways.h, src/filedumper.c, src/ways.c: Remove the unused name caching for the ways (in slim mode). 2011-05-08 [r704] Andrew M. Bishop <amb> * src/segments.h, src/segmentsx.h: Simplify the lookup of the segment index in slim mode. 2011-05-07 [r703] Andrew M. Bishop <amb> * src/optimiser.c: Allow the start of a route to double-back to the initial node even if a super-node. 2011-05-07 [r700-702] Andrew M. Bishop <amb> * src/test/loops.osm: Rename the waypoints. * src/files.c: Remove useless assert statement. * src/optimiser.c, src/nodes.h, src/segmentsx.c: Fix bugs found by valgrind. 2011-05-07 [r697-699] Andrew M. Bishop <amb> * src/optimiser.c: Handle things correctly if the FindSuperSegment() function is called with a fake segment. * src/test/Makefile: Ensure that executables are compiled before running the tests. * src/Makefile: Require slim and non-slim versions of fakes.o. 2011-05-07 [r695-696] Andrew M. Bishop <amb> * src/router.c: Calculate an override version of the start of the route to get out of dead-ends. * src/output.c: Use real segments when making comparisons (not pointers or non-real segments). 2011-05-06 [r690-694] Andrew M. Bishop <amb> * src/test: Ignore files and directories generated by running 'make test'. * src/xml: Ignore files generated by running 'make test'. * src/Makefile: Allow running 'make test' in the source directory. * src/test/waypoints.pl (added), src/test/loops.osm (added), src/test/Makefile (added), src/test/dead-ends.sh (added), src/test/dead-ends.osm (added), src/test/start-1-finish.sh (added), src/test/loops.sh (added): Routing test cases. * src/test (added): A directory for routing test cases. 2011-05-06 [r689] Andrew M. Bishop <amb> * src/xml/test/bad-attr-character-ref.xml (removed): Remove false-positive test case (a bug in xmlparse.l previously flagged this as an error). 2011-04-27 [r688] Andrew M. Bishop <amb> * src/optimiser.c: Force going straight on if a waypoint is a super-node. 2011-04-27 [r686-687] Andrew M. Bishop <amb> * src/optimiser.c: Improve the FindSuperSegment() function when the existing segment is the right answer. * src/optimiser.c, src/router.c: Rename the variables in and around the CombineRoutes() function for clarity. 2011-04-26 [r685] Andrew M. Bishop <amb> * src/optimiser.c: When starting a super-route ensure that all starting segments are super-segments to avoid u-turns at the starting super-node. 2011-04-25 [r683-684] Andrew M. Bishop <amb> * src/output.c: Fix error with turn description. * src/output.c: Include a point number (hidden) in the HTML file. 2011-04-24 [r682] Andrew M. Bishop <amb> * src/waysx.c, src/waysx.h: Fix error is last semi-automated update. 2011-04-24 [r681] Andrew M. Bishop <amb> * src/segments.c, src/superx.c, src/visualiser.c, src/relationsx.c, src/segments.h, src/superx.h, src/filedumper.c, src/nodesx.c, src/relations.c, src/nodesx.h, src/relations.h, src/nodes.c, src/waysx.c, src/nodes.h, src/segmentsx.c, src/waysx.h, src/segmentsx.h, src/ways.c: Make the comments more consistent. 2011-04-24 [r680] Andrew M. Bishop <amb> * src/translations.h, src/fakes.c, src/filedumper.c, src/fakes.h, src/nodesx.c, src/output.c, src/results.c, src/files.c, src/nodesx.h, src/results.h, src/files.h, src/nodes.c, src/planetsplitter.c, src/osmparser.c, src/nodes.h, src/profiles.c, src/segments.c, src/sorting.c, src/tagging.h, src/visualiser.c, src/superx.c, src/logging.c, src/ways.h, src/profiles.h, src/relationsx.c, src/segments.h, src/sorting.h, src/tagmodifier.c, src/visualiser.h, src/superx.h, src/logging.h, src/relationsx.h, src/relations.c, src/functionsx.h, src/relations.h, src/types.h, src/optimiser.c, src/waysx.c, src/segmentsx.c, src/functions.h, src/waysx.h, src/router.c, src/segmentsx.h: Update comments throughout the source code. 2011-04-23 [r679] Andrew M. Bishop <amb> * doc/html/algorithm.html, doc/ALGORITHM.txt: Add description of U-turns at dead-ends. 2011-04-23 [r678] Andrew M. Bishop <amb> * src/optimiser.c, src/functions.h, src/output.c, src/router.c: Allow U-turns at dead-ends to avoid getting stuck. 2011-04-22 [r677] Andrew M. Bishop <amb> * src/optimiser.c, src/router.c: Handle failure to find route gracefully. 2011-04-22 [r676] Andrew M. Bishop <amb> * web/www/routino/visualiser.cgi: Another change related to turn restrictions (missed in last checkin). 2011-04-22 [r675] Andrew M. Bishop <amb> * src/segments.c, doc/html/usage.html, web/www/routino/router.cgi, src/segments.h, doc/USAGE.txt, src/router.c: Add in the option to specify an initial heading. 2011-04-22 [r674] Andrew M. Bishop <amb> * src/segmentsx.c, src/nodesx.c: Finish off the geographic sorting of segments. 2011-04-22 [r673] Andrew M. Bishop <amb> * src/filedumper.c: Use the common TurnAngle() function from segments.c instead of a local one. 2011-04-22 [r672] Andrew M. Bishop <amb> * src/segments.c, src/segments.h, src/output.c: Move the turn_angle() and bearing_angle() functions from output.c into segments.c. 2011-04-22 [r671] Andrew M. Bishop <amb> * doc/html/algorithm.html, doc/ALGORITHM.txt: Simplify the language used describing the highway properties. 2011-03-21 [r670] Andrew M. Bishop <amb> * src/relationsx.c: Ignore turn restrictions that ban going the wrong way down a one-way road. 2011-03-21 [r668-669] Andrew M. Bishop <amb> * src/segments.c, src/filedumper.c, src/profiles.c: Include math.h for files that use math functions. * src/types.h: Round the node latitude/longitude rather than truncating. 2011-03-21 [r667] Andrew M. Bishop <amb> * src/filedumper.c: Include some of the Routino internal information when dumping an OSM format output. 2011-03-21 [r666] Andrew M. Bishop <amb> * src/segmentsx.c: Fix bug with segment deduplication. 2011-03-21 [r665] Andrew M. Bishop <amb> * src/relationsx.c, src/planetsplitter.c, src/relationsx.h, src/nodesx.c: Sort the segments geographically. 2011-03-20 [r664] Andrew M. Bishop <amb> * src/nodesx.c: Sort nodes strictly by latitude/longitude within the bins (helps with regresssion testing). 2011-03-20 [r661-663] Andrew M. Bishop <amb> * web/www/routino/documentation: Ignore extra image files. * src/xmlparse.l: Ensure that UTF-8 is used internally when reading in a numeric entity. * src/router.c: Fix bug found by gcc-4.5. 2011-03-20 [r660] Andrew M. Bishop <amb> * src/segmentsx.c: Return early from the IndexSegments function if there are no segments. 2011-03-19 [r659] Andrew M. Bishop <amb> * doc/html/algorithm.html, doc/html/example0.png, doc/html/example1.png, doc/ALGORITHM.txt, doc/html/example2.png, doc/html/example3.png (added), doc/html/example4.png (added): Update the algorithm documents for turn restrictions. 2011-03-19 [r658] Andrew M. Bishop <amb> * src/segmentsx.c: Deduplicate in pairs only (i.e. if a segment occurs 4 times then keep 2 of them). 2011-03-19 [r657] Andrew M. Bishop <amb> * src/segmentsx.c: Cache the recently used ways when de-duplicating segments. 2011-03-19 [r656] Andrew M. Bishop <amb> * src/superx.c: Use previous segment in router rather than looking at previous node. 2011-03-12 [r655] Andrew M. Bishop <amb> * src/segmentsx.c, src/nodesx.c: Make the used nodes marker bit-wide rather than byte-wide. 2011-03-12 [r654] Andrew M. Bishop <amb> * src/nodesx.h, src/superx.c, src/nodesx.c: Make the nodes super marker bit-wide rather than byte-wide. 2011-03-12 [r653] Andrew M. Bishop <amb> * src/nodesx.h, src/superx.c, src/planetsplitter.c, src/superx.h, src/nodesx.c: Make the nodes super marker a boolean. 2011-03-12 [r652] Andrew M. Bishop <amb> * src/superx.c, src/planetsplitter.c, src/superx.h: Optimise the search for supernodes, consider traffic when counting segments that meet at a node. 2011-02-27 [r651] Andrew M. Bishop <amb> * src/nodesx.h, src/superx.c, src/relationsx.c, src/waysx.c, src/segmentsx.c, src/waysx.h, src/segmentsx.h: Rename the xdata and xcached members of the nodesx, segmentsx and waysx structures. 2011-02-27 [r650] Andrew M. Bishop <amb> * src/nodesx.h, src/relationsx.c, src/planetsplitter.c, src/waysx.c, src/relationsx.h, src/segmentsx.c, src/nodesx.c, src/waysx.h, src/segmentsx.h: Don't have both xnumber and number in the nodesx, segmentsx, waysx and relationsx structures. 2011-02-27 [r649] Andrew M. Bishop <amb> * src/segmentsx.c, src/segmentsx.h: Remove a now unused array of segment indexes. 2011-02-27 [r648] Andrew M. Bishop <amb> * src/logging.c: Handle the case where the middle string is shorter than the previous one. 2011-02-26 [r646-647] Andrew M. Bishop <amb> * src/superx.c: Use the OtherNode and IsOneWay* macros when routing. * src/superx.c, src/relationsx.c, src/segmentsx.c, src/segmentsx.h: Remove a pair of functions that are no longer used and rename the other pair. 2011-02-26 [r645] Andrew M. Bishop <amb> * src/relationsx.c, src/planetsplitter.c, src/relationsx.h: Fixed the turn relations with a few more functions. 2011-02-26 [r644] Andrew M. Bishop <amb> * src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h: Renamed a couple of functions for clarity. 2011-02-26 [r643] Andrew M. Bishop <amb> * src/nodesx.h, src/superx.c, src/relationsx.c, src/planetsplitter.c, src/osmparser.c, src/segmentsx.c, src/nodesx.c, src/segmentsx.h: Go back to the internal structure used (but reverted) during version 1.2 development where each segment is stored only once. This halves the memory usage (mmap files or just files) for planetsplitter. This is allowed because a new algorithm to create the node to segment indexes makes it simpler now that it was. This change is required so that super-node/segment optimisation doesn't remove mutual loops. This change doesn't handle turn restrictions yet. 2011-02-24 [r642] Andrew M. Bishop <amb> * src/superx.c: Change a variable name to match the one used in optimiser.c. 2011-02-24 [r641] Andrew M. Bishop <amb> * src/superx.c, src/segmentsx.c: Create super-segments that go in loops and preserve all such loops. 2011-02-23 [r640] Andrew M. Bishop <amb> * src/segmentsx.c: Fix latent bug that can occur when de-duplicating segments. 2011-02-23 [r639] Andrew M. Bishop <amb> * xml/Makefile: Fix error in creating web files containing profiles. 2011-02-20 [r638] Andrew M. Bishop <amb> * src/optimiser.c: Allow U-turns at via points for transport types that ignore turn restrictions. 2011-02-20 [r637] Andrew M. Bishop <amb> * src/optimiser.c, src/functions.h, src/fakes.h: Don't allow U-turns at via points (but doesn't necessarily include turning round in the score when searching for optimum). 2011-02-18 [r636] Andrew M. Bishop <amb> * src/optimiser.c: Fix the code that stops routes doubling-back on themselves. 2011-02-11 [r635] Andrew M. Bishop <amb> * web/www/routino/update-profiles.pl (added), xml/Makefile, web/www/routino, web/www/routino/router.html.en, web/www/routino/router.pl, web/www/routino/router.html.nl, web/www/routino/router.js: Move the Javascript and Perl profiles into separate files. 2011-02-11 [r634] Andrew M. Bishop <amb> * doc/html/installation.html, web/www/openlayers/install.sh, doc/INSTALL.txt: Change to OpenLayers 2.10. 2011-02-11 [r632-633] Andrew M. Bishop <amb> * src/output.c: Don't confuse fake segments with junctions. * src/optimiser.c: Fix problem with only one super-node in the route. 2011-02-11 [r631] Andrew M. Bishop <amb> * src/fakes.c: Fix bug with generating fake segments. 2011-02-11 [r629-630] Andrew M. Bishop <amb> * xml/routino-profiles.xml: Wheelchairs do not obey turn restrictions. * web/www/routino/results.cgi, web/www/routino/router.html.en, src/router.c, web/www/routino/router.pl, web/www/routino/router.html.nl, web/www/routino/router.js: Print a message if routed OK, allow web users to see router output (now logged to file). 2011-02-05 [r628] Andrew M. Bishop <amb> * src/filedumper.c: Fix statistics for ways (broken by change for relations). 2011-02-05 [r626-627] Andrew M. Bishop <amb> * src/superx.c, src/optimiser.c, src/segmentsx.c, src/nodesx.c: Change some output printed while running. * src/filedumper.c: Fix problem with dumping turn relations. 2011-02-05 [r625] Andrew M. Bishop <amb> * src/filedumper.c: Print out the size of the relations.mem file. 2011-02-05 [r623-624] Andrew M. Bishop <amb> * web/www/routino/visualiser.cgi: Updated the visualiser to include turn restrictions. * src/visualiser.c, doc/html/usage.html, web/www/routino/visualiser.js, src/visualiser.h, src/filedumper.c, doc/USAGE.txt, web/www/routino/visualiser.html: Updated the visualiser to include turn restrictions. 2011-02-05 [r622] Andrew M. Bishop <amb> * src/profiles.h, web/www/routino/noscript.cgi, web/www/routino/customrouter.cgi, xml/routino-profiles.xsd, web/www/routino/noscript.template.html, xml/routino-profiles.xml, doc/html/usage.html, web/www/routino/router.cgi, src/optimiser.c, web/www/routino/router.html.en, doc/USAGE.txt, src/router.c, web/www/routino/router.pl, src/profiles.c, web/www/routino/router.html.nl, web/www/routino/router.js: Include the option to obey turn restrictions in the profile for each transport type. 2011-01-30 [r620-621] Andrew M. Bishop <amb> * doc/html/algorithm.html, doc/ALGORITHM.txt: Update algorithm description to include turn restrictions and a note about how the algorithm terminates the search. * doc/TAGGING.txt, doc/USAGE.txt: Update text versions of documents to match HTML. 2011-01-30 [r618-619] Andrew M. Bishop <amb> * src/output.c: Correct comments. * src/filedumper.c: Put a "restriction" tag into the turn restrictions when dumped. 2011-01-30 [r617] Andrew M. Bishop <amb> * src/optimiser.c, src/functions.h, src/router.c: Ensure that the first/last node and first/last segment of the Results structure are filled in properly. 2011-01-30 [r616] Andrew M. Bishop <amb> * src/optimiser.c: Fix routing where the final node is a super-node. 2011-01-29 [r615] Andrew M. Bishop <amb> * src/relationsx.c: All nodes adjacent to a turn restriction must also be turn restrictions. 2011-01-29 [r613-614] Andrew M. Bishop <amb> * src/files.h: Fix assert problem. * src/Makefile, src/xml/Makefile: Make dependency filename based on object file name (fixes overwriting problem with slim versions). 2011-01-29 [r612] Andrew M. Bishop <amb> * src/superx.c, src/files.h, src/relationsx.c, src/waysx.c, src/segmentsx.c, src/nodesx.c, src/files.c: Ensure that record of closed file descriptors are erased. 2011-01-29 [r610-611] Andrew M. Bishop <amb> * src/optimiser.c: Don't check for turn relations in FindStartRoutes(). * src/optimiser.c: Add some comments, shuffle a few lines of code. 2011-01-29 [r609] Andrew M. Bishop <amb> * src/optimiser.c: Fix the code that allows overshooting by one node when finding finish nodes. 2011-01-29 [r608] Andrew M. Bishop <amb> * src/fakes.c, src/optimiser.c, src/Makefile, src/fakes.h, src/relations.c, src/router.c: When finding a normal route check for turn relations (considering previous segment). When finding turn relations convert fake segments into real ones. 2011-01-29 [r607] Andrew M. Bishop <amb> * src/nodes.c: Fix pathological case of rounding error for points almost exactly on a segment. 2011-01-29 [r606] Andrew M. Bishop <amb> * src/superx.c: Fix for route finding in planetsplitter. 2011-01-24 [r605] Andrew M. Bishop <amb> * src/results.h, src/superx.c, src/optimiser.c, src/functions.h, src/output.c, src/router.c, src/results.c: Finds routes and obeys turn restrictions (only tested with very simple route and restrictions, more turn restriction testing and regression testing required). 2011-01-16 [r604] Andrew M. Bishop <amb> * src/relations.h, src/relations.c: Fix logic error with searching for via nodes. 2011-01-15 [r603] Andrew M. Bishop <amb> * src/results.h, src/superx.c, src/optimiser.c, src/output.c, src/results.c: Change the results structure to contain next segment and rename elements to clarify prev/next node and prev/next segment. 2011-01-15 [r602] Andrew M. Bishop <amb> * src/segmentsx.c: Change to comment for clarification. 2011-01-15 [r599-601] Andrew M. Bishop <amb> * doc/html/usage.html: Correction and clarification to filedumper usage. * src/nodesx.h: Change to comment for clarification. * src/relations.h, src/relationsx.c, src/planetsplitter.c, src/filedumper.c, src/relationsx.h, src/relations.c: Store the 'from' and 'to' segments and not nodes (to handle fake nodes inserted in segments). 2011-01-15 [r598] Andrew M. Bishop <amb> * src/visualiser.c, src/output.c: Change the IsSuperNode() macro to take a single pointer argument. 2011-01-09 [r597] Andrew M. Bishop <amb> * src/superx.c, src/relationsx.c, src/types.h: Make the 'from' and 'to' nodes of turn restrictions super-nodes. 2011-01-09 [r596] Andrew M. Bishop <amb> * src/relations.h, src/optimiser.c, src/nodes.h, src/relations.c: Check turn relations when finding a route. 2011-01-08 [r595] Andrew M. Bishop <amb> * src/optimiser.c, src/filedumper.c, src/nodes.h: Change the IsSuperNode() macro to take a single pointer argument. 2011-01-08 [r594] Andrew M. Bishop <amb> * src/optimiser.c: Move the local variables closer to where they are used. 2011-01-08 [r593] Andrew M. Bishop <amb> * doc/html/tagging.html: Add information about the tags used for turn relations. 2010-12-29 Andrew M. Bishop <amb> Changed version control environment from RCS to CVS to SVN. 2010-12-29 Andrew M. Bishop <amb> * doc/NEWS.txt: Temporary checkin to allow transition from RCS to CVS to SVN. * xml/routino-tagging.xml: Pass through turn relation information. 2010-12-21 Andrew M. Bishop <amb> * src/filedumper.c: Add turn relations to the statistics and dump outputs. 2010-12-21 Andrew M. Bishop <amb> * src/ways.h, src/segments.h, src/nodes.h, src/ways.c: Optimise the node, segment, way lookup in slim mode by checking if the previous index is being requested again. * src/relations.h, src/relations.c: Optimise the turn relation lookup. 2010-12-21 Andrew M. Bishop <amb> * src/relations.h, src/relations.c: Add functions to search for turn relations that match a particular node. 2010-12-21 Andrew M. Bishop <amb> * src/relations.h (added), src/relations.c (added): Initial revision * src/superx.c, src/relationsx.c, src/types.h: Update the nodes to force a super-node where there is a turn restriction. 2010-12-21 Andrew M. Bishop <amb> * src/relationsx.c, src/planetsplitter.c, src/relationsx.h: Finish the processing of the turn relations now that the extra node lookup table is in place. 2010-12-20 Andrew M. Bishop <amb> * src/nodesx.c, src/segmentsx.c, src/segmentsx.h: Handle the SegmentX Segment in the same way as the other data structures (map into memory when used, open/close the file if slim). Create the real nodes without mapping the segments into memory. * src/nodesx.c, src/nodesx.h, src/relationsx.c, src/segmentsx.c, src/segmentsx.h, src/waysx.h: Make the PutBack*() functions be no-ops in slim mode and remove the pre-processor guards from around the function calls. * src/nodesx.c: Don't map the file into memory for writing out the Nodes file. * src/superx.c, src/waysx.c, src/waysx.h, src/nodesx.c, src/relationsx.c, src/segmentsx.c: Close and open the files for the slim case to match the map/unmap of files for the non-slim case. * src/nodesx.c, src/segmentsx.c: Make the last two changes work for slim mode. * src/nodesx.c, src/nodesx.h: Create the Nodes offset table at the end rather than during the sort process. * src/nodesx.c, src/nodesx.h, src/segmentsx.c, src/segmentsx.h: Don't maintain a copy of the whole set of Nodes along with the NodeXs but generate the Node from the NodeX when written to disk. Create a lookup table between the original index and the geographically sorted index. 2010-12-19 Andrew M. Bishop <amb> * src/planetsplitter.c, src/relationsx.c: Process the turn relations (apart from updating the indexes to the geographically sorted nodes). * src/superx.c: Handle the case of no super segments better. * src/planetsplitter.c: Change around the order of the functions. * src/relationsx.c: A temporary check-in that handles turn restrictions more complicated than actually allowed (ways must start/end at the via node). * xml/routino-tagging.xml: Add mini-roundabouts. * src/sorting.c: Bug fix for last change. 2010-12-18 Andrew M. Bishop <amb> * src/segmentsx.c: Remove the test for sorting zero segments (now that the sort function doesn't crash). * src/nodesx.c, src/segmentsx.c, src/segmentsx.h, src/superx.c: Duplicate the IndexFirstSegmentX() and IndexNextSegmentX() functions to create two distinct one for use at different times. * src/sorting.c: Handle the case where there is no data in the file. * src/Makefile, src/filedumper.c, src/functions.h, src/optimiser.c, src/planetsplitter.c, src/relationsx.c, src/relationsx.h, src/router.c, src/types.h: Add a Relations data type and write out the turn relations that have been read in. Still doesn't perform the required processing after reading the data or use the information for routing. 2010-12-12 Andrew M. Bishop <amb> * src/osmparser.c, src/typesx.h: Change the names of the enumerated types for turn restrictions. 2010-12-05 Andrew M. Bishop <amb> * src/osmparser.c, src/relationsx.c, src/relationsx.h, src/typesx.h: Parse turn restriction relations and store ones with a single via node. (Doesn't do anything with them yet). * src/nodesx.h, src/segmentsx.h, src/waysx.h: Updated the comments for clarity. 2010-12-04 Andrew M. Bishop <amb> * src/filedumper.c, src/nodesx.c, src/nodesx.h, src/osmparser.c, src/types.h: Improved version of previous change. 2010-11-28 Andrew M. Bishop <amb> * src/filedumper.c, src/nodesx.c, src/nodesx.h, src/osmparser.c, src/types.h: Add parsing of mini-roundabouts. * xml/routino-tagging.xml, src/filedumper.c, src/osmparser.c, src/types.c, src/types.h: Remove the roundabout type from the parsing. * src/fakes.c: Fix some problems with fake nodes, in particular a route between two fake nodes on the same segment can now be calculated. * src/nodes.c: Return the two nodes of a segment in the same order each time. 2010-11-27 Andrew M. Bishop <amb> * src/fakes.h, src/sorting.h: New file. * src/fakes.c, src/functions.h, src/nodesx.c, src/optimiser.c, src/output.c, src/relationsx.c, src/router.c, src/segmentsx.c, src/sorting.c, src/types.h, src/waysx.c: Split functions.h into fakes.h, sorting.h and the remainder in functions.h. * src/optimiser.c, src/router.c: Move some of the complexity from router.c to optimiser.c. * src/types.c, src/types.h, src/ways.h, src/waysx.c: Change the wayprop_t type into properties_t. * src/nodesx.h, src/osmparser.c, src/profiles.c, src/profiles.h, src/relationsx.c, src/relationsx.h, src/types.c, src/types.h, src/ways.h, src/waysx.c, src/filedumper.c, src/nodes.h, src/nodesx.c: Change the allow_t type into transports_t (and associated enums and macros). * src/types.h, src/ways.h: Change the waytype_t type into highway_t. 2010-11-14 Andrew M. Bishop <amb> * xml/routino-tagging.xml: Fix mis-spelling with surface=asphalt tag (patch from Michael Günnewig). * src/filedumper.c, src/types.c, src/types.h, src/ways.h, src/waysx.c: Print out statistics about what highways are included in the database. 2010-11-13 Andrew M. Bishop <amb> Version 1.5.1 released 2010-11-13 Andrew M. Bishop <amb> * doc/NEWS.txt, doc/README.txt: Updated for version 1.5.1. * doc/USAGE.txt: Update program usage for new logging option. * xml/routino-translations.xml: Add translation for ferry into German (patch from Michael Günnewig). * src/relationsx.c: Fix bug with relation processing. * src/logging.h: Add GCC attributes for the logging functions. * src/logging.h, src/logging.c: New file. * src/Makefile, src/nodesx.c, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/relationsx.c, src/router.c, src/segmentsx.c, src/superx.c, src/tagmodifier.c, src/waysx.c: Add an option to make the output more suitable for a log file. 2010-10-31 Andrew M. Bishop <amb> * src/files.c: Ensure that enough memory gets allocated in FileName() function. 2010-10-30 Andrew M. Bishop <amb> Version 1.5 released 2010-10-30 Andrew M. Bishop <amb> * doc/README.txt, doc/NEWS.txt: Updated for version 1.5. 2010-10-18 Andrew M. Bishop <amb> * src/profiles.c: Use sqrt() function to reduce the effect of property preferences close to 50%. Ensure that preferences cannot equal zero (error on division). * doc/ALGORITHM.txt, doc/INSTALL.txt, doc/USAGE.txt: Updated with information about the new features. * doc/CONFIGURATION.txt, doc/TAGGING.txt: Add in the footroute and bicycleroute configuration options and route relation tag processing. 2010-10-16 Andrew M. Bishop <amb> * src/files.c: Fixed some comments for recent changes. 2010-10-09 Andrew M. Bishop <amb> * xml/routino-profiles.xml: Add footroute and bicycleroute to the profiles. * src/files.c, src/files.h, src/relationsx.c: The ReOpenFile() function cannot be read/write because it stops the router running with read-only access to the database. * src/nodesx.c, src/relationsx.c, src/segmentsx.c, src/superx.c: Fix previous check-in on this set of files. * src/xmlparse.l: Ensure that comparisons are made with unsigned chars. 2010-10-03 Andrew M. Bishop <amb> * src/nodesx.c, src/relationsx.c, src/segmentsx.c, src/superx.c: Don't try mapping a file if it is zero length (e.g. no super-segments). * src/files.c, src/files.h, src/relationsx.c: Add a function to map a file writeable and use it for updating the ways when processing route relations. * src/relationsx.c: Avoid self-recursion and adding route information to relations that already have it. 2010-09-25 Andrew M. Bishop <amb> * src/osmparser.c, src/relationsx.c, src/relationsx.h, src/waysx.h: Apply the route=bicycle or route=foot tags from the relation to all ways contained in it and to all ways in all sub-relations of it (including recursion to depth 5). This requires all relations to be stored even if not routes because they might be included by another relation that is. * src/segmentsx.c: Don't sort the (super-)segments if there are none. * src/nodesx.c, src/functions.h, src/sorting.c: Rename the heapsort() function to filesort_heapsort(). 2010-09-19 Andrew M. Bishop <amb> * src/files.c, src/files.h, src/nodesx.c, src/segmentsx.c, src/sorting.c, src/waysx.c: Change the names of the functions used to open files, change the ReOpen function to open R/W. * src/relationsx.c: Remove the sorting of the route relations. 2010-09-17 Andrew M. Bishop <amb> * src/nodesx.c, src/segmentsx.c: Zero the NodesFile and SegmentsFile data structures before writing them (zeros unused bytes). * src/planetsplitter.c, src/waysx.c, src/waysx.h: Split the sorting of waysx from the compacting so that the route relation information can be included before compacting. * xml/routino-tagging.xml, src/functionsx.h, src/osmparser.c, src/planetsplitter.c: Parse relations and extract foot and bicycle routes to be added as properties to the ways. * src/types.c, src/types.h: Add footroute and bicycleroute properties. * src/relationsx.c, src/relationsx.h: New file. * src/typesx.h, src/Makefile: Add files and datatypes for processing relations. * xml/routino-tagging-nomodify.xml, xml/routino-tagging.xsd, src/tagging.c: Process tags for relations. 2010-09-16 Andrew M. Bishop <amb> * src/waysx.c, src/segmentsx.c, src/nodesx.c: Fix the comment for the Append...() function. 2010-09-15 Andrew M. Bishop <amb> * xml/routino-profiles.xml, xml/routino-tagging.xml, xml/routino-translations.xml, src/output.c, src/translations.c, src/types.c, src/types.h: Add routing on ferries. * src/filedumper.c, src/planetsplitter.c, src/router.c: Bug fix for last change. * src/filedumper.c, src/planetsplitter.c, src/router.c: Improve the usage information to tell which command line argument was in error. * src/profiles.c: Fix --help-profile-perl option and make perl and JSON outputs more pretty. * src/router.c, src/planetsplitter.c: Usage message has wrong option name. * src/xmlparse.l: Fix last change to make UTF-8 parsing more strict, also added strict conversion to XML-safe character references. * src/translations.c: Convert translations read from file into XML-safe encodings before using them. * src/output.c: HTML file has UTF-8 meta-tag. * xml/routino-translations.xml: Revert to UTF-8 multi-byte representations instead of character references. 2010-09-14 Andrew M. Bishop <amb> * src/xmlparse.l: Stricter checking on XML data (Unicode). 2010-09-05 Andrew M. Bishop <amb> * xml/Makefile, src/Makefile, doc/Makefile, Makefile: Move all of the installation pathnames to the top level Makefile and include it into the lower level makefiles. * src/planetsplitter.c, src/router.c, src/tagmodifier.c: Use the installed tagging.xml, profiles.xml or translations.xml files as the fallback option if no other given. 2010-09-04 Andrew M. Bishop <amb> * xml/routino-translations.xml: Change German translations from named HTML character encodings to numeric ones (works in GPX files as well as HTML). * xml/routino-translations.xml: Added Dutch translations (from Jan Jansen). 2010-08-30 Andrew M. Bishop <amb> * xml/routino-translations.xml: Change German translation to UTF-8, add comments indicating the origin of the two translations. * xml/routino-tagging-nomodify.xml: Relation rules are not allowed at all. * xml/Makefile, src/Makefile, doc/Makefile, Makefile: Added 'install' to top level (and lower) Makefiles. * src/ways.h, src/output.c: Change the names of the functions used to get the highway names. * src/filedumper.c: Only print the way name in OSM output when the way has a name. Change the names of the functions used to get the highway names. * src/profiles.c: Fix bug with writing out JSON profile information. 2010-08-30 Andrew M. Bishop <amb> * src/ways.h, src/output.c: Change the names of the functions used to get the highway names. * src/filedumper.c: Only print the way name in OSM output when the way has a name. Change the names of the functions used to get the highway names. * src/profiles.c: Fix bug with writing out JSON profile information. 2010-08-04 Andrew M. Bishop <amb> * src/output.c, src/segmentsx.c, src/types.h, src/fakes.c, src/functions.h, src/nodesx.c, src/optimiser.c: Change the way that fake nodes and segments are recognised (allows nearly 4G nodes to be stored instead of 2G nodes). 2010-08-03 Andrew M. Bishop <amb> * src/filedumper.c, src/nodes.h, src/nodesx.c, src/optimiser.c, src/types.h: Rename the variables that hold the node allowed transports and flags. 2010-08-02 Andrew M. Bishop <amb> * xml/routino-tagging-nomodify.xml, xml/routino-tagging.xml, xml/routino-tagging.xsd, src/filedumper.c, src/nodesx.c, src/nodesx.h, src/optimiser.c, src/osmparser.c, src/superx.c, src/tagging.c, src/types.h: Understand node traffic type restrictions. 2010-07-31 Andrew M. Bishop <amb> * src/profiles.h, src/types.c, src/types.h, src/ways.h, src/waysx.c: Rename the wayallow_t type to allow_t (since it applies to nodes as well now). * src/filedumper.c, src/nodes.h, src/nodesx.c, src/segmentsx.c, src/types.h: Add extra information to a node to store turn restrictions and properties. (Move the super-node bit from the first segment to here.) * src/nodesx.c, src/segmentsx.c, src/waysx.c: Assert if the number of nodes, segments or ways exceeds the legal range of the index counters. * src/nodes.h, src/nodesx.h, src/segments.h, src/segmentsx.h, src/ways.h, src/waysx.h: Change the data types to index_t where they are counting nodes/segments/ways. * src/nodes.h, src/nodesx.h, src/segments.h, src/segmentsx.h, src/ways.h, src/waysx.c, src/waysx.h: Ensure that seeking within a file uses a 64-bit offset. * src/nodesx.c, src/segmentsx.c, src/superx.c, src/waysx.c: Remove the assert statements that check the order of calling the functions. 2010-07-26 Andrew M. Bishop <amb> * src/filedumper.c, src/nodes.c, src/nodes.h, src/visualiser.c: Final part of slim mode for the router (node offsets). 2010-07-24 Andrew M. Bishop <amb> * src/nodesx.c, src/segmentsx.c, src/waysx.c: Some tidying up of the writing of the file headers. * src/ways.c, src/ways.h, src/waysx.c, src/filedumper.c, src/nodes.c, src/optimiser.c, src/output.c, src/profiles.c, src/visualiser.c: Finished slim mode for the router by adding ways. 2010-07-23 Andrew M. Bishop <amb> * src/filedumper.c, src/nodes.c, src/nodes.h, src/output.c, src/segments.c, src/segments.h, src/segmentsx.c: Added slim mode to the router for segments. * src/Makefile: Add the fakes.c file. * src/optimiser.c, src/results.c, src/results.h: Change the results structure to hold the index of the segment instead of a pointer to it. * src/types.h, src/router.c, src/functions.h: Move the fake nodes and segments to a new file. * src/fakes.c: New file. 2010-07-19 Andrew M. Bishop <amb> * xml/routino-profiles.xml: Reduce the "multilane" preference for motor vehicles. Gives too much bias with previous setting. 2010-07-15 Andrew M. Bishop <amb> * src/Makefile, src/filedumper.c, src/nodes.c, src/nodes.h, src/nodesx.c, src/visualiser.c: Added a slim mode to the router (just for nodes to start with). 2010-07-14 Andrew M. Bishop <amb> * src/segmentsx.h, src/superx.c, src/waysx.c, src/waysx.h, src/Makefile, src/nodesx.c, src/nodesx.h, src/planetsplitter.c, src/segmentsx.c: Replaced the runtime selection of slim mode / non-slim mode with compile time selection that gives no runtime overhead but gives two executables. 2010-07-13 Andrew M. Bishop <amb> * src/nodesx.c, src/nodesx.h, src/segmentsx.c, src/segmentsx.h, src/waysx.c, src/waysx.h: Move the functions for slim mode out into the header file and make it inline. 2010-07-12 Andrew M. Bishop <amb> * src/files.h: New file. * src/segmentsx.h, src/sorting.c, src/superx.c, src/tagging.c, src/tagmodifier.c, src/translations.c, src/ways.c, src/waysx.c, src/waysx.h, src/filedumper.c, src/files.c, src/functions.h, src/nodes.c, src/nodesx.c, src/nodesx.h, src/optimiser.c, src/output.c, src/planetsplitter.c, src/profiles.c, src/router.c, src/segments.c, src/segmentsx.c: Create a files.h header and put some of the most heavily used files.c functions into it and make them inline. 2010-07-11 Andrew M. Bishop <amb> * src/segmentsx.c, src/segmentsx.h, src/files.c, src/nodesx.c, src/nodesx.h: Made the planetsplitter slim mode handle the output node and segment data in a slim way as well as in the input data. * src/nodesx.c, src/segmentsx.c, src/waysx.c: Change the names of the temporary files. 2010-07-10 Andrew M. Bishop <amb> Version 1.4.1 released 2010-07-10 Andrew M. Bishop <amb> * doc/NEWS.txt: Update NEWS for release. * doc/ALGORITHM.txt: Update documentation for slight modification to algorithm, also add more information about how preferences etc are handled. 2010-07-09 Andrew M. Bishop <amb> * src/Makefile: Default compilation flags include optimisation and not debugging symbols. 2010-07-08 Andrew M. Bishop <amb> * src/nodes.c: Fix error with finding closest segment to the specified point. * src/optimiser.c: Bug fix for not crashing when finding the middle part of the route. 2010-07-07 Andrew M. Bishop <amb> * src/results.c, src/optimiser.c: Changed the amount of memory allocated for intermediate results => routes much faster. * src/output.c: Remove compilation warning. * src/Makefile: Copy files to web directory like done in other Makefiles. * doc/Makefile: Change location of HTML files in web directory and clean up web directory on distclean. * src/xml/Makefile: Stop message being printed when make runs. * xml/Makefile: Fix error from last checkin and clean up web directory on distclean. 2010-07-06 Andrew M. Bishop <amb> * src/optimiser.c: Don't crash if the middle part of the route can't be found but exit cleanly. 2010-07-05 Andrew M. Bishop <amb> * src/superx.c: Change the algorithm used to determine supernodes. 2010-07-03 Andrew M. Bishop <amb> * xml/routino-translations.xml: Added German translation [patch from Christoph Eckert]. * src/translations.c: Don't crash if more than one language is in translations.xml but --language option is not used. 2010-06-28 Andrew M. Bishop <amb> * src/router.c: Don't crash if start and finish are the same point. 2010-06-27 Andrew M. Bishop <amb> * doc/DATA.txt: New file. * doc/ALGORITHM.txt, doc/CONFIGURATION.txt, doc/INSTALL.txt, doc/OUTPUT.txt, doc/README.txt, doc/TAGGING.txt, doc/USAGE.txt: Updated documentation to match new web site. * doc/Makefile: New file. * xml/Makefile: Add some new variables. 2010-06-26 Andrew M. Bishop <amb> * xml/routino-profiles.xml, xml/routino-tagging-nomodify.xml, xml/routino-tagging.xml, xml/routino-translations.xml, src/translations.c: Changed URLs to http://www.routino.org/ * doc/README.txt: *** empty log message *** * doc/OUTPUT.txt: Changed URLs to http://www.routino.org/ 2010-05-31 Andrew M. Bishop <amb> Version 1.4 released 2010-05-31 Andrew M. Bishop <amb> * doc/INSTALL.txt, doc/NEWS.txt, doc/README.txt: Update for version 1.4. * src/xml/Makefile: Make sure that distclean really cleans up. * Makefile: Make sure that xml sub-directory is made. * src/router.c: Fix the code that should stop routing if no segment is found. 2010-05-30 Andrew M. Bishop <amb> * doc/USAGE.txt: Add the planetsplitter tagging rules option (and remove the unnecessary options that it replaces), add the filedumper OSM dump option and add the tagmodifier program. * doc/TAGGING.txt: Describe the new tagging rules. * doc/OUTPUT.txt: Note that the HTML and GPX outputs are translated. * doc/CONFIGURATION.txt: Add the tagging rules configuration file. * doc/ALGORITHM.txt: An update to the current size of the UK database. * xml/routino-tagging-nomodify.xml: New file. * src/tagmodifier.c: A tagging XML file must be read (just like planetsplitter). * src/filedumper.c: Add the option to dump a region rather than all and to not output super segments. * src/optimiser.c: Fix printing the number of super-segments tried. 2010-05-29 Andrew M. Bishop <amb> * xml/routino-translations.xml, xml/routino-translations.xsd, src/ways.h, src/filedumper.c, src/osmparser.c, src/output.c, src/translations.c, src/translations.h: Translate the names given to unnamed roads (the highway type). * src/profiles.c, src/profiles.h, src/router.c: Stricter check on specified profile before routing. * src/router.c: Ensure that if no segment is found the routing stops. * src/nodes.c: When finding a closest segment one of the nodes must be within the search distance. 2010-05-28 Andrew M. Bishop <amb> * src/router.c: Make sure that some profiles are loaded. 2010-05-27 Andrew M. Bishop <amb> * src/optimiser.c, src/profiles.c: Fix bug with profile preferences (used incorrectly in route optimisation). * src/Makefile, src/filedumper.c, src/types.c, src/types.h: Add an option to filedumper to dump an OSM format file. 2010-05-25 Andrew M. Bishop <amb> * src/xmlparse.l: Fix bug with encoding XML strings. 2010-05-23 Andrew M. Bishop <amb> * xml/Makefile: Make sure that modified files are copied to web directory. * src/tagmodifier.c: Fix bug when filename is specified on command line. * src/tagging.c, src/tagging.h, src/tagmodifier.c, src/xmlparse.l, src/osmparser.c: Fix some memory leaks. * src/tagmodifier.c, xml/osm.xsd, xml/routino-osm.xsd, src/osmparser.c: Add the 'bound' element to the XML parser. 2010-05-22 Andrew M. Bishop <amb> * src/functionsx.h, src/osmparser.c, src/planetsplitter.c, src/ways.h, src/waysx.c, src/waysx.h: Remove the --transport=<transport>, --not-highway=<highway> and --not-property=<property> options from planetsplitter because they can be done by the tagging.xml file now. 2010-05-18 Andrew M. Bishop <amb> * src/Makefile: Add tagmodifier program. * src/xmlparse.l: Handle floating point numbers in scientific notation. * src/planetsplitter.c: Read in the tag transformation rules before calling the OSM parser. * src/functionsx.h, src/osmparser.c: Almost completely re-written OSM parser using tagging transformations. * src/tagmodifier.c, src/tagging.h, src/tagging.c: New file. * xml/Makefile: Copy the tagging rules to the web directory. * xml/routino-tagging.xml, xml/routino-tagging.xsd, xml/routino-osm.xsd: New file. * xml/osm.xsd: Small fix for OSM schema. 2010-05-14 Andrew M. Bishop <amb> * src/types.c: Remove highway type aliases from HighwayType() function. * src/xmlparse.h, src/xmlparse.l: Allow empty strings to be returned. 2010-05-10 Andrew M. Bishop <amb> * src/xmlparse.h, src/xmlparse.l: The line number is now a long integer. * src/xml/Makefile: Running 'make test' now compiles everything first. 2010-04-28 Andrew M. Bishop <amb> * src/xml/Makefile: Delete zero length file if xsd-to-xmlparser fails. * src/nodes.c, src/nodesx.c, src/segments.c, src/segmentsx.c, src/ways.c, src/waysx.c: Change file format to allow 64-bit off_t type with 32 bit void* type. * src/Makefile, src/filedumper.c, src/xml/Makefile: Compile with _FILE_OFFSET_BITS=64 to get 64-bit fopen() and stat(). 2010-04-27 Andrew M. Bishop <amb> * src/output.c: Fix mistake of writing GPX information to wrong file. * doc/OUTPUT.txt, doc/CONFIGURATION.txt: New file. * doc/TAGGING.txt, doc/USAGE.txt, doc/ALGORITHM.txt, doc/INSTALL.txt, doc/NEWS.txt, doc/README.txt: Interim checkin of updated documentation. 2010-04-24 Andrew M. Bishop <amb> * src/router.c: Merged the three functions to output the head/body/tail of the results back into a single function. Added the '--output-none' option. * src/functions.h, src/output.c: Merged the three functions to output the head/body/tail of the results back into a single function. * xml/routino-translations.xml, xml/routino-translations.xsd, src/output.c, src/translations.c, src/translations.h: Added translations for the HTML output. * src/xmlparse.h, src/xmlparse.l: Changed functions from const. * src/output.c: Add the copyright information into the translations.xml file instead of the separate copyright.txt file. Add the translated copyright strings into the outputs. * src/functions.h, src/router.c, src/translations.c, src/translations.h: Add the copyright information into the translations.xml file instead of the separate copyright.txt file. * src/xmlparse.h, src/xmlparse.l: Add an option to not convert the XML strings into decoded representations (saves converting them back later for the translated strings). 2010-04-23 Andrew M. Bishop <amb> * src/xml/xsd-to-xmlparser.c, src/translations.c, src/xmlparse.h, src/xmlparse.l, src/profiles.c: Pass the tag name to the tag function. 2010-04-22 Andrew M. Bishop <amb> * Makefile: Fix bug in makefile. * xml/Makefile: Move the translations into the web directory. * xml/routino-translations.xml, xml/routino-translations.xsd: New file. * src/output.c: Changed HTML output to be useful in web pages. * src/xmlparse.l: Restart properly so that a different file can be read. 2010-04-13 Andrew M. Bishop <amb> * src/xml/xsd-to-xmlparser.c, src/profiles.c, src/translations.c: Name the tag variables and functions after the XSD data type and not the tag name that uses it. 2010-04-12 Andrew M. Bishop <amb> * src/profiles.c, src/translations.c, src/xmlparse.h, src/xmlparse.l, src/xml/xsd-to-xmlparser.c, src/xml/Makefile: Change the last parameter to the ParseXML function to be general options. * src/Makefile, src/types.h, src/ways.c, src/ways.h: Move the type checking/printing functions from way.c to type.c. * src/types.c: New file. 2010-04-11 Andrew M. Bishop <amb> * src/xml/xsd-to-xmlparser.c, src/profiles.c, src/translations.c, src/xmlparse.h, src/xmlparse.l: Added helper functions for parsing strings into numbers. Added macros to perform common error checking. Change XML parser callback functions to return an error status. 2010-04-10 Andrew M. Bishop <amb> * src/router.c: Fix usage information. * src/translations.h, src/translations.c: New file. * src/output.c: Added translations for GPX and turn/heading. * src/Makefile, src/router.c: Added file of translations and language selection. 2010-04-09 Andrew M. Bishop <amb> * src/functions.h, src/planetsplitter.c, src/sorting.c: Add an option '--sort-ram-size' to specify the RAM to use for sorting - defaults to 256MB if not using slim mode. 2010-04-08 Andrew M. Bishop <amb> * src/xml/Makefile: Fix test program generation and running. * src/xmlparse.h, src/xmlparse.l: Make the strings const and add the number of attributes to the xmltag structure. Add functions to convert character entities and character references. * src/profiles.c, src/xml/xsd-to-xmlparser.c: Make the strings const and add the number of attributes to the xmltag structure. 2010-04-07 Andrew M. Bishop <amb> * xml/Makefile: New file. 2010-04-06 Andrew M. Bishop <amb> * src/Makefile: Remove special lex/flex flags. Remove profiles.o from planetsplitter. * src/xml/xsd-to-xmlparser.c: Don't print anything for attributes that are not set. * src/xmlparse.l: Change error message for bad character in a quoted string. Make sure attribute values are cleared before calling tag function (for end-tags). 2010-04-04 Andrew M. Bishop <amb> * src/xml/Makefile: Add some XML parsing test cases. * src/xml/xsd-to-xmlparser.c: Rename the XML handling function. * src/xmlparse.h, src/xmlparse.l, src/profiles.c: Added error checking. 2010-04-03 Andrew M. Bishop <amb> * src/functionsx.h, src/osmparser.c, src/planetsplitter.c: Rename the old ParseXML() function as ParseOSM(). 2010-04-01 Andrew M. Bishop <amb> * src/output.c: Wrap GPX descriptions in CDATA. 2010-03-31 Andrew M. Bishop <amb> * xml/routino-profiles.xml: New file. * src/xml/xsd-to-xmlparser.c, src/profiles.c, src/xmlparse.h, src/xmlparse.l: Call the XML tag functions for the end tags as well as the start tags. 2010-03-30 Andrew M. Bishop <amb> * src/profiles.c, src/profiles.h: Change the name of the --profile-json and --profile-perl options. * src/filedumper.c, src/planetsplitter.c, src/router.c: Improve the program help messages. 2010-03-29 Andrew M. Bishop <amb> * src/files.c, src/functions.h, src/profiles.c, src/profiles.h, src/router.c: Added command line option to specify a file containing profiles. Added command line option to select profile by name from loaded set. Use XML parser to read in the profiles. * src/Makefile: Better handling of the xml sub-directory. * src/xml/xsd-to-xmlparser.c: Add the option to ignore unknown attributes. Print out the skeleton file using static functions and variables. * src/xml/Makefile: Keep the intermediate files. * src/xmlparse.h, src/xmlparse.l: Add the option to ignore unknown attributes. 2010-03-28 Andrew M. Bishop <amb> * src/profiles.h, src/router.c, src/profiles.c: Add an option to print out the profiles as XML format. * src/xmlparse.h, xml/xsd.xsd, xml/osm.xsd, src/xml/xsd-to-xmlparser.c: New file. * src/Makefile: Added the XML subdirectory and xmlparser.c. * src/xmlparse.l, src/xml/Makefile: New file. 2010-03-20 Andrew M. Bishop <amb> * src/output.c: Add descriptions to each point in the GPX route file. * src/files.c, src/functions.h, src/nodesx.c, src/output.c, src/segmentsx.c, src/waysx.c: Move the stat() calls to find a file size into a helper function in files.c. * src/files.c, src/output.c, src/planetsplitter.c: Improve the error messages by adding strerror() to them. * src/filedumper.c, src/router.c: Don't check the return value of the functions to load the nodes, segments and ways because those functions will exit in case of an error. * src/nodes.c, src/segments.c, src/ways.c: Don't check the return value of MapFile() because it will exit in case of an error. * src/planetsplitter.c: Allow filenames on the planetsplitter command line. 2010-03-19 Andrew M. Bishop <amb> * src/waysx.h, src/filedumper.c, src/files.c, src/functions.h, src/nodesx.c, src/nodesx.h, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, src/superx.c, src/waysx.c: Allow planetsplitter to be run with a --parse-only or --process-only option and append to existing file or read from existing file. 2010-03-18 Andrew M. Bishop <amb> * src/router.c: Fix usage message error and shuffle order. * src/output.c, src/router.c: Allow selection of which outputs are to be created. 2010-03-17 Andrew M. Bishop <amb> * src/output.c: Re-order the code for HTML. 2010-03-15 Andrew M. Bishop <amb> * src/output.c: Create a simple HTML output. 2010-03-06 Andrew M. Bishop <amb> * src/router.c, src/nodes.c: Speed up start/via/stop point search algorithm. 2010-03-05 Andrew M. Bishop <amb> * src/profiles.c: Change the format of the output for the --help-profile-{pl|js} options. 2010-01-21 Andrew M. Bishop <amb> Version 1.3 released 2010-01-21 Andrew M. Bishop <amb> * doc/NEWS.txt: Update to latest news. 2010-01-18 Andrew M. Bishop <amb> * doc/USAGE.txt, doc/TAGGING.txt, doc/INSTALL.txt: Updated documentation. 2010-01-15 Andrew M. Bishop <amb> * src/router.c, src/functions.h: Change the test output formats to add turn, node type and bearing information. 2010-01-13 Andrew M. Bishop <amb> * src/output.c: Change the test output formats to add turn, node type and bearing information. 2009-12-16 Andrew M. Bishop <amb> * src/router.c: Added an option to use only nodes and not interpolate a point into a segment. 2009-12-15 Andrew M. Bishop <amb> * src/osmparser.c, src/profiles.c, src/types.h, src/ways.c: Added wheelchair as type of transport. 2009-12-13 Andrew M. Bishop <amb> * src/osmparser.c, src/profiles.c, src/types.h, src/ways.c: Add bridge and tunnel to highway properties. 2009-12-12 Andrew M. Bishop <amb> * src/Makefile: Ignore the error if executables cannot be copied after compiling. * src/functions.h, src/nodesx.c, src/segmentsx.c, src/sorting.c, src/waysx.c: Add some FILESORT_* #defines and use them. 2009-12-11 Andrew M. Bishop <amb> * src/functions.h, src/nodesx.c, src/planetsplitter.c, src/segmentsx.c, src/sorting.c, src/waysx.c, src/waysx.h: Added a new function to sort variable length data - simplifies the compacting of ways, reduces memory usage potentially required for it and simplifies the code. 2009-12-10 Andrew M. Bishop <amb> * src/waysx.c: Write out the list of ways without memory mapping anything. 2009-11-27 Andrew M. Bishop <amb> * src/osmparser.c, src/profiles.c, src/types.h, src/ways.c: Add in "multilane" as a new highway property. 2009-11-25 Andrew M. Bishop <amb> * src/filedumper.c, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/profiles.h, src/router.c, src/ways.h, src/waysx.c, src/waysx.h: Store the selected options when parsing (planetsplitter) and display them in the statistics (filedumper) and check them when routing (router). 2009-11-23 Andrew M. Bishop <amb> * src/osmparser.c, src/output.c, src/profiles.c, src/types.h, src/ways.c: Add in "steps" as a new highway type. 2009-11-19 Andrew M. Bishop <amb> * src/optimiser.c, src/router.c: Made the verbose output consistent between different places. 2009-11-18 Andrew M. Bishop <amb> * src/router.c: Fix bug with previous segment-splitting routing. 2009-11-14 Andrew M. Bishop <amb> * src/optimiser.c, src/output.c, src/router.c, src/segments.h, src/functions.h, src/nodes.c, src/nodes.h: If a selected waypoint is not very close to an existing node then insert a fake node in the segment that comes closest and use that instead. 2009-11-13 Andrew M. Bishop <amb> * src/optimiser.c, src/osmparser.c, src/queue.c, src/results.c, src/results.h, src/types.h: Added in some more constants with the value ~0. 2009-11-06 Andrew M. Bishop <amb> * src/filedumper.c: Check the values for the --node=, --segment= and --way= options. 2009-11-03 Andrew M. Bishop <amb> * src/output.c, src/planetsplitter.c, src/profiles.c, src/profiles.h, src/router.c, src/types.h, src/ways.c: Rename Way_Unknown to Way_Count to make more sense and match the properties. 2009-11-02 Andrew M. Bishop <amb> * src/osmparser.c: Allow the tag "paved" as well as "surface=paved". * src/filedumper.c, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/profiles.c, src/profiles.h, src/router.c, src/types.h, src/ways.c, src/ways.h: Added the ability to set routing preferences using highway properties. Initially the only choice is either paved or unpaved but the code has been updated to allow any number of properties to be added. 2009-10-27 Andrew M. Bishop <amb> * src/osmparser.c: Handle the "designation=..." tag for bridleway, byway and footpath. (Also change to using a macro for testing if access is allowed and now allow "destination"). * src/osmparser.c, src/profiles.c, src/types.h, src/ways.c, src/ways.h: Added Moped to the list of transports (and incidentally increased the transport data type to 16 bits and re-ordered the Way data-type in response). 2009-10-26 Andrew M. Bishop <amb> * src/profiles.c: Ensure that horses and bicycles have a default speed on trunk even though they have a default preference not to use it. * src/osmparser.c, src/profiles.c, src/types.h, src/ways.c: Re-ordered the types so that Horse comes before Bicycle. * src/osmparser.c, src/output.c, src/profiles.c, src/types.h, src/ways.c: Remove the Bridleway and Footway highway types and use the Path type instead (also re-ordered the types so that Cycleway comes before Path). * src/profiles.c: Remove unneeded spaces at the end of the output. 2009-10-25 Andrew M. Bishop <amb> * src/output.c: Fix bug in code that determines waypoints for abbreviated output. 2009-10-24 Andrew M. Bishop <amb> * src/functions.h, src/optimiser.c, src/router.c: Fix missing segments in output if start and finish points are found by the start search. 2009-10-22 Andrew M. Bishop <amb> * src/files.c, src/nodesx.c, src/segmentsx.c, src/sorting.c, src/superx.c, src/waysx.c: Added some missing comments and corrected some existing ones. 2009-10-21 Andrew M. Bishop <amb> Version 1.2 released 2009-10-21 Andrew M. Bishop <amb> * doc/README.txt, doc/USAGE.txt, doc/NEWS.txt: Updated for version 1.2. 2009-10-20 Andrew M. Bishop <amb> * src/Makefile: Add sorting.o to the Makefile. 2009-10-12 Andrew M. Bishop <amb> * src/waysx.c: When sorting we cannot have NULL pointers now. * src/nodesx.c, src/segmentsx.c, src/waysx.c: Re-order the functions in the file into a more logical order. No functional changes. * src/nodesx.c, src/planetsplitter.c, src/segmentsx.c, src/sorting.c, src/waysx.c: Rename the tmpdirname variable. 2009-10-10 Andrew M. Bishop <amb> * src/nodesx.c, src/osmparser.c, src/segmentsx.c, src/sorting.c, src/waysx.c: Corrections after running with valgrind. * src/planetsplitter.c: Fix early termination test. * src/nodesx.c, src/nodesx.h, src/segmentsx.c: Remove the nodesx->gdata index. 2009-10-09 Andrew M. Bishop <amb> * src/nodesx.c, src/segmentsx.c, src/typesx.h, src/waysx.c, src/waysx.h: Free the nodesx->super array and the segmentsx->firstnode array when finished with them. Remove wayx->cid and overwrite wayx->id instead. Overwrite nodex[i]->id=i for later geographically sorted use. 2009-10-08 Andrew M. Bishop <amb> * src/nodesx.c, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, src/superx.c: Replace node, segment and way indexes with a single index for a set of segments containing the location of the first segment for each node. * src/nodesx.h: Fix comment. 2009-10-07 Andrew M. Bishop <amb> * src/osmparser.c, src/segmentsx.c, src/superx.c: AppendSegment adds a single segment and not a pair. * src/waysx.c: Use heapsort() instead of qsort(). * src/nodesx.c, src/nodesx.h, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, src/superx.c, src/waysx.c: Go back to the version 1.1 method of having each segment listed twice. This simplifies the lookup of first/next segments at no in-RAM index cost and now that slim mode has sorting of file contents the balance has tipped back. 2009-10-04 Andrew M. Bishop <amb> * src/functions.h, src/sorting.c: Change the sort function to allow the indexing callback to veto the write. * src/nodesx.c: Remove the duplicates when sorting. * src/waysx.c: Sort the ways using the same method as the nodes. Also remove the duplicates. * src/nodesx.c: Use the new sort functions to allow sorting the data in the file without needing to read (or mmap) the whole file into RAM at the same time. * src/functions.h: Add some functions to perform sorting. * src/sorting.c: New file. * src/queue.c: Fix bug with binary heap sort. 2009-09-25 Andrew M. Bishop <amb> * src/queue.c: Add comments describing the algorithm used. 2009-09-23 Andrew M. Bishop <amb> * src/nodesx.c, src/waysx.c: Simplify the de-duplication when sorting and update some comments. 2009-09-22 Andrew M. Bishop <amb> * src/nodesx.c, src/nodesx.h: Remove a leftover from the last change on these files. * src/segmentsx.c: Improve the super-segment de-duplication. 2009-09-21 Andrew M. Bishop <amb> * src/nodesx.c, src/nodesx.h, src/planetsplitter.c: Remove the non-highway nodes without re-sorting the whole list again. 2009-09-17 Andrew M. Bishop <amb> * src/osmparser.c, src/planetsplitter.c, src/segmentsx.c, src/superx.c, src/waysx.c, src/waysx.h: Added the slim mode to Ways as well. * src/ways.h: Add padding to Ways structure to allow it to be zeroed. * src/nodesx.c: Add some comments when closing and re-opening files. * src/files.c, src/functions.h: The WriteFile function now has a const parameter. 2009-09-15 Andrew M. Bishop <amb> * src/nodesx.c, src/nodesx.h, src/planetsplitter.c, src/segmentsx.c: Some bug fixes and some missing unmap function calls. 2009-09-07 Andrew M. Bishop <amb> * src/segmentsx.h, src/superx.c, src/nodesx.c, src/nodesx.h, src/segmentsx.c: Fixed slim mode for segments and nodes (slim now means mapping only one file into RAM at a time and none when creating the final output). 2009-09-06 Andrew M. Bishop <amb> * src/nodesx.h, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, src/superx.c, src/superx.h, src/nodesx.c: Slim version of segments code (still very slow and only works on simple cases). * src/files.c, src/functions.h: Remove the delete option from UnmapFile() and make it return NULL. * src/filedumper.c: Allow dumping all nodes, segments or ways. 2009-09-05 Andrew M. Bishop <amb> * src/nodesx.c: Don't re-sort unnecessarily. * src/nodesx.c, src/nodesx.h, src/planetsplitter.c, src/segmentsx.c, src/superx.c: Improve slim mode for nodes so that no data is not loaded into RAM at all. * src/files.c, src/functions.h: Add some more file functions. 2009-09-03 Andrew M. Bishop <amb> * src/nodesx.c, src/files.c, src/functions.h: Remove extra argument from MapFile function. * src/nodesx.c, src/nodesx.h, src/planetsplitter.c, src/segmentsx.c, src/superx.c: Added slim mode (--slim) to planetsplitter for nodes only. * src/files.c, src/functions.h: Changes to mapping and unmapping files for slim mode. 2009-08-25 Andrew M. Bishop <amb> * src/planetsplitter.c: Revert the order that the functions are called. * src/nodesx.c: Fix for assert statement. * src/files.c: Bug fix for mmap(). 2009-08-20 Andrew M. Bishop <amb> * src/osmparser.c: Fix bug with memory allocation. 2009-08-19 Andrew M. Bishop <amb> * src/nodesx.c, src/nodesx.h, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, src/superx.c, src/waysx.c, src/waysx.h: Remove "sorted" parameter in data structure and change assert statements. 2009-08-17 Andrew M. Bishop <amb> * src/router.c: Increase to 99 the number of waypoints that can be specified. 2009-08-15 Andrew M. Bishop <amb> * src/queue.c: Fix comment. * src/Makefile: Tidy the compilation options to make it easier to turn them on and off. * src/router.c: Remove the --all, --super and --no-output command line options. Handle the renamed routing functions. * src/functions.h, src/optimiser.c: Rename the routing functions and make FindRoute only find routes with no super-nodes in them. * src/queue.c: When popping from queue make sure that place in queue is cleared. * src/optimiser.c, src/queue.c, src/results.c, src/results.h, src/superx.c: Optimise the priority queue used for routing. * src/filedumper.c: Fix dumping nodes when they are super-nodes. 2009-07-23 Andrew M. Bishop <amb> * src/Makefile, src/optimiser.c, src/results.c, src/results.h, src/superx.c: Split off queue functions into a separate file. * src/queue.c: New file. 2009-07-19 Andrew M. Bishop <amb> * src/nodesx.c, src/segments.h, src/segmentsx.c, src/ways.h, src/waysx.c, src/filedumper.c, src/nodes.h: Include the number of super-nodes, super-segments etc in the database as useful information to put in the statistics output. * src/superx.c: Fix incorrect progress indicator message. * src/waysx.c: Fix problem with memory reallocation. * src/nodesx.c, src/osmparser.c, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, src/superx.c: Store only one copy of each segment but index once for each direction. 2009-07-12 Andrew M. Bishop <amb> * src/functionsx.h, src/nodesx.c, src/nodesx.h, src/osmparser.c, src/output.c, src/planetsplitter.c, src/profiles.c, src/results.c, src/segments.c, src/segmentsx.c, src/segmentsx.h, src/superx.c, src/superx.h, src/ways.h, src/waysx.c, src/waysx.h: Tidy up and fix comments and include files. * src/osmparser.c, src/planetsplitter.c, src/router.c, src/segmentsx.c, src/superx.c, src/waysx.c, src/filedumper.c, src/nodesx.c, src/optimiser.c: Check all print statements and made them more consistent and/or accurate. 2009-07-11 Andrew M. Bishop <amb> * src/nodesx.c, src/nodesx.h, src/planetsplitter.c, src/segmentsx.c, src/waysx.c, src/waysx.h: Free memory at the end of planetsplitter (to aid finding potential leaks earlier). 2009-07-09 Andrew M. Bishop <amb> * src/segmentsx.c: Free memory correctly (really). * src/planetsplitter.c, src/waysx.c, src/waysx.h: Separate the sorting of Ways from compacting of Ways. * src/nodes.h, src/nodesx.c, src/nodesx.h, src/segmentsx.c, src/visualiser.c, src/filedumper.c, src/nodes.c: Rename structure members after recent changes. * src/segmentsx.c: Free memory correctly. * src/types.h, src/segmentsx.c: Fix duplicate checking. * src/planetsplitter.c: Ensure that variable is reset before using it. * src/types.h, src/visualiser.c, src/visualiser.h, src/filedumper.c, src/nodes.c, src/nodes.h, src/nodesx.c, src/nodesx.h, src/optimiser.c, src/osmparser.c, src/output.c, src/router.c, src/segments.c, src/segments.h, src/segmentsx.c: Change from float to double for latitude and longitude. Store latitude and longitude as an integer type rather than float (higher precision). 2009-07-08 Andrew M. Bishop <amb> * src/superx.c: Ensure that variable is reset before using it. 2009-07-06 Andrew M. Bishop <amb> * src/visualiser.c: Print all super-segments within and crossing the border. Don't display speed limits for tracks and paths unless set. 2009-07-04 Andrew M. Bishop <amb> * src/segmentsx.h, src/superx.c, src/waysx.c, src/waysx.h: Change data structure to avoid calling realloc() each time to allocate more memory. 2009-07-02 Andrew M. Bishop <amb> * src/types.h, src/waysx.c, src/waysx.h: Handle duplicate ways. * src/nodes.c, src/nodesx.c, src/planetsplitter.c, src/profiles.c, src/results.c, src/segments.c, src/segmentsx.c, src/superx.c, src/superx.h, src/types.h, src/ways.c, src/waysx.c: Fix some gcc pedantic warnings. * src/files.c, src/nodesx.c, src/osmparser.c, src/results.c, src/router.c, src/segments.c, src/segmentsx.c, src/superx.c, src/ways.c, src/waysx.c: Removed unused header files, change assert statements, tidy some code. 2009-07-01 Andrew M. Bishop <amb> * src/nodesx.c, src/nodesx.h, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, src/superx.c: Remove the Node structure from the NodeX structure to save memory. * src/filedumper.c: Print latitude and longitude in degrees. 2009-06-30 Andrew M. Bishop <amb> * src/segmentsx.h: Re-order the data in the structure. * src/nodesx.c, src/nodesx.h, src/osmparser.c, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, src/superx.c, src/waysx.h: Remove the Segment structure from the SegmentX structure to save memory. 2009-06-29 Andrew M. Bishop <amb> * src/filedumper.c, src/nodes.h, src/nodesx.c, src/segments.c, src/segments.h, src/segmentsx.c, src/superx.c, src/types.h: Move the super-segment and normal-segment flags from the nodes to the distance. Remove the NODE() macro and rename SUPER_FLAG to NODE_SUPER. * src/waysx.c: Replace memmove with structure copy. * src/nodesx.c, src/segmentsx.c, src/segmentsx.h, src/superx.c: Rename SegmentsX sdata to ndata. 2009-06-25 Andrew M. Bishop <amb> * src/waysx.c, src/waysx.h: Rename part of the structure. * src/nodesx.c, src/nodesx.h, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, src/superx.c, src/waysx.h: Undo part of the previous change - only update the Segment way index at the end. * src/waysx.h, src/nodesx.c, src/osmparser.c, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h, src/superx.c, src/superx.h, src/typesx.h, src/waysx.c: Reduce the number of ways in the output by compacting them (sharing the same information between identical ways). 2009-06-24 Andrew M. Bishop <amb> * src/filedumper.c, src/nodes.h: Allow dumping out of nodes, segments and ways. 2009-06-15 Andrew M. Bishop <amb> * src/segmentsx.c, src/superx.c, src/visualiser.c, src/ways.c, src/ways.h: Rename WaysSame() with WaysCompare() and reverse the sense of the output. * src/functionsx.h, src/typesx.h: New file. * src/functions.h, src/nodesx.h, src/osmparser.c, src/planetsplitter.c, src/segmentsx.h, src/superx.h, src/types.h, src/waysx.h: Put some of types.h into typesx.h (for extended data types). Put some of functions.h into functionsx.h (for OSM parser). Change included files to match. * src/filedumper.c, src/osmparser.c, src/output.c, src/router.c, src/types.h, src/visualiser.c: Add a macro for converting degrees to radians and radians to degrees. * src/optimiser.c: Fix weight, height, width, length restriction routing. * doc/TAGGING.txt, src/osmparser.c: Recognise tags "vehicle" and "motor_vehicle". 2009-06-13 Andrew M. Bishop <amb> Version 1.1 released 2009-06-13 Andrew M. Bishop <amb> * src/nodesx.c, src/planetsplitter.c, src/segmentsx.c, src/segmentsx.h: Handle nodes that are missing from the .osm file (ignore the segment). * src/nodesx.c: Revert the last change (Print an error message and exit if a node cannot be found). * doc/NEWS.txt: New file. * src/Makefile: Delete the executables from the web directory for 'distclean'. 2009-06-12 Andrew M. Bishop <amb> * doc/USAGE.txt, doc/INSTALL.txt, doc/README.txt: Update the documentation. * src/Makefile: Copy the executables into the web directory. 2009-06-08 Andrew M. Bishop <amb> * src/filedumper.c: Change help text. * src/visualiser.c: Change format of super-node/segment visualiser output. 2009-06-07 Andrew M. Bishop <amb> * doc/TAGGING.txt: Updated with imperial to metric conversions. * src/Makefile: Added visualiser.c. * src/filedumper.c: Now used for data visualisation and statistics. * src/visualiser.h, src/visualiser.c: New file. 2009-06-05 Andrew M. Bishop <amb> * src/osmparser.c: Improve parsing of imperial units (mph, feet & inches). 2009-06-03 Andrew M. Bishop <amb> * src/nodesx.c: Print an error message and exit if a node cannot be found. 2009-05-31 Andrew M. Bishop <amb> * src/ways.c, src/ways.h, src/waysx.c, src/waysx.h: Move function from waysx.c to ways.c. 2009-05-29 Andrew M. Bishop <amb> * doc/USAGE.txt: Update usage information with new options and copyright.txt usage. * src/nodes.c, src/nodes.h, src/router.c: Make sure that the chosen "nearest point" is a highway that the profile allows. 2009-05-23 Andrew M. Bishop <amb> * src/profiles.c: Change the default profile; horses are slower, bicycles may be allowed on footways (and similar). 2009-05-15 Andrew M. Bishop <amb> * src/files.c, src/output.c: Error checking on opening files (to read/write data and to write output). 2009-05-14 Andrew M. Bishop <amb> * src/output.c, src/results.c, src/router.c, src/segments.c, src/segmentsx.c, src/superx.c, src/types.h, src/nodes.c, src/nodesx.c, src/optimiser.c: Replace ~0 or 0 with NO_NODE value for "no node" condition. 2009-05-13 Andrew M. Bishop <amb> * src/output.c: Remove one more NODE macro and fix an output formatting error. * src/nodes.c, src/nodes.h, src/optimiser.c, src/output.c, src/router.c: Remove some node macros, change some node function arguments. * src/optimiser.c, src/profiles.c, src/profiles.h: Move some common code into the profile. * src/superx.c: Remove distance and duration from Result structure. * src/output.c: Better junction detection. * src/optimiser.c, src/results.c, src/results.h: Remove distance and duration from Result structure. 2009-05-09 Andrew M. Bishop <amb> * src/output.c: Add better junction detection for deciding on route waypoints. 2009-05-06 Andrew M. Bishop <amb> * src/optimiser.c, src/profiles.c, src/profiles.h, src/types.h: Route using preferences for each highway. * src/router.c: Print out longitude then latitude. 2009-04-30 Andrew M. Bishop <amb> * src/results.h, src/router.c, src/superx.c, src/types.h, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/profiles.c, src/profiles.h, src/results.c: First attempt at preferences for highways - uses integer arithmetic and doesn't work well. 2009-04-27 Andrew M. Bishop <amb> * src/functions.h, src/optimiser.c, src/output.c, src/results.c, src/results.h, src/router.c: Allow generating a route with intermediate waypoints. 2009-04-24 Andrew M. Bishop <amb> * src/functions.h, src/output.c, src/router.c: Split the output functions into separate head/body/tail. Read in an optional copyright.txt file and include contents in output. 2009-04-23 Andrew M. Bishop <amb> * src/profiles.c: Improve Javascript and perl print out. * src/filedumper.c, src/files.c, src/functions.h, src/planetsplitter.c, src/router.c: Move the filename generation to a new function. 2009-04-22 Andrew M. Bishop <amb> * src/Makefile, src/functions.h, src/optimiser.c: Split the function to print the output into a new file. * src/output.c: New file. 2009-04-15 Andrew M. Bishop <amb> * src/osmparser.c: Fix for parsing nodes from XML (no effect on results). 2009-04-12 Andrew M. Bishop <amb> * doc/USAGE.txt, src/optimiser.c: Create a GPX route as well as a track. * src/ways.c: Changed the license to Affero GPLv3. 2009-04-10 Andrew M. Bishop <amb> * src/optimiser.c: Add a waypoint to the GPX file for the start and finish points. * doc/USAGE.txt: Include more information about the output file formats. 2009-04-08 Andrew M. Bishop <amb> Version 1.0 released 2009-04-08 Andrew M. Bishop <amb> * Makefile: New file. * src/Makefile: Fix dependency file generation. * doc/USAGE.txt, doc/TAGGING.txt, doc/README.txt, doc/INSTALL.txt, doc/ALGORITHM.txt: New file. * src/Makefile, src/filedumper.c, src/files.c, src/functions.h, src/nodes.c, src/nodes.h, src/nodesx.c, src/nodesx.h, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/profiles.c, src/profiles.h, src/results.c, src/results.h, src/router.c, src/segments.c, src/segments.h, src/segmentsx.c, src/segmentsx.h, src/superx.c, src/superx.h, src/types.h, src/ways.h, src/waysx.c, src/waysx.h: Changed the license to Affero GPLv3. 2009-04-07 Andrew M. Bishop <amb> * src/planetsplitter.c: Remove the --help-profile command line option. 2009-03-28 Andrew M. Bishop <amb> * src/optimiser.c: Fix file headers (again) and fix segment distance/duration for abbreviated text output. 2009-03-24 Andrew M. Bishop <amb> * src/osmparser.c, src/profiles.c, src/types.h, src/ways.c: Added highway=path; defaults to foot=yes but also is defaulted for bicycle and horse transport. 2009-03-23 Andrew M. Bishop <amb> * src/optimiser.c: Fixed the header in the output text files. * src/osmparser.c: Add parsing for *=designated allowing passage along a highway. * src/profiles.h, src/router.c, src/profiles.c: Add a function to output default profiles as perl data structures. 2009-03-21 Andrew M. Bishop <amb> * src/nodesx.c: Handle duplicated nodes (e.g. from concatenated input files). * src/optimiser.c: Add a header to the output text files. 2009-03-07 Andrew M. Bishop <amb> * src/optimiser.c: Renamed the *.txt output to *-all.txt and added a new shorted *.txt output. * src/router.c: Renamed the --no-print option to --no-output. 2009-03-04 Andrew M. Bishop <amb> * src/nodes.c: Fix bug with finding nearest node. 2009-03-03 Andrew M. Bishop <amb> * src/superx.c: Fix the merging of super-segments. 2009-03-01 Andrew M. Bishop <amb> * src/profiles.c, src/profiles.h: Added more limits (weight, height, width, length). * src/segments.c: Use the lower speed from the profile and the way. * src/osmparser.c: Added more limits (weight, height, width, length). Added highway=living_street and highway=services. * src/ways.c, src/ways.h, src/optimiser.c, src/router.c, src/segmentsx.c, src/superx.c, src/types.h: Added more limits (weight, height, width, length). * src/waysx.c, src/waysx.h: Added a function to test if two ways are the same. 2009-02-28 Andrew M. Bishop <amb> * src/nodesx.c: Round the node location to avoid if falling into the wrong bin. * src/nodesx.c, src/planetsplitter.c, src/segmentsx.c, src/waysx.c: Move print statements from planetsplitter into individual functions. * src/Makefile: Compile with optimisation and no profiling. * src/profiles.c, src/router.c: Add new command line options to make it more CGI friendly. 2009-02-27 Andrew M. Bishop <amb> * src/profiles.c, src/profiles.h, src/router.c: Print out Javascript code containing the profiles. 2009-02-24 Andrew M. Bishop <amb> * src/segmentsx.h, src/superx.c, src/nodesx.c, src/segments.c, src/segments.h, src/segmentsx.c: Remove segment->next1 since it always points at the next segment or nowhere. * src/profiles.c: Remove track from valid types for most transports. 2009-02-15 Andrew M. Bishop <amb> * src/functions.h, src/optimiser.c, src/router.c: Change some function names. * src/osmparser.c: Add in tests for motorcar=1 etc. * src/nodes.c, src/nodes.h, src/router.c: The search to find a node given the lat/long now searches harder. * src/optimiser.c: Better test for failing to find a route. * src/router.c: Change --only-super to --super. * src/nodesx.c, src/optimiser.c, src/osmparser.c, src/router.c, src/segments.c, src/segmentsx.c, src/types.h, src/nodes.c: Store radians rather than degrees. * src/segments.c, src/segmentsx.c: Change to sinf(), cosf(), sqrtf(), asinf() functions. * src/optimiser.c: Set the sortby parameter to the minimum distance/duration consistent with the travelled distance/duration and the remaining straight line distance with the fastest possible speed. * src/filedumper.c, src/nodes.c, src/nodes.h, src/nodesx.c, src/types.h: Add macros for handling lat/long to bin conversions. * src/osmparser.c: Handle oneway=1 and oneway=-1. 2009-02-10 Andrew M. Bishop <amb> * src/results.c, src/results.h: Added a new 'sortby' entry to the Result. Changed node_t to index_t. * src/router.c: Changed node_t to index_t. * src/nodes.c, src/segments.c, src/segments.h: Change the Distance() function to return distance_t. 2009-02-08 Andrew M. Bishop <amb> * src/optimiser.c, src/results.c, src/results.h, src/router.c, src/superx.c: Calculate quickest or shortest, not both. * src/optimiser.c, src/profiles.c, src/router.c: Give appropriate error messages if start or end of route are not possible. 2009-02-07 Andrew M. Bishop <amb> * src/results.c: Slight speedup by doing a linear search when looking up results and not storing in sorted order. * src/superx.h, src/superx.c, src/waysx.h, src/waysx.c, src/segmentsx.h, src/segmentsx.c, src/nodesx.h, src/nodesx.c: New file. * src/ways.h, src/Makefile, src/filedumper.c, src/functions.h, src/nodes.c, src/nodes.h, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/router.c, src/segments.c, src/segments.h, src/types.h, src/ways.c: Split the extended data types from the normal data types. * src/nodes.c: Return NULL if the node cannot be found. * src/Makefile, src/filedumper.c, src/optimiser.c, src/router.c: Add new command line options. * src/supersegments.c: Fix some status messages. * src/optimiser.c, src/types.h: Routing works with super-nodes now. 2009-02-06 Andrew M. Bishop <amb> * src/ways.c, src/segments.c, src/segments.h, src/supersegments.c, src/types.h, src/nodes.c, src/nodes.h, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/functions.h: Segments now not duplicated in database. Routing with all nodes works, not with super-nodes. 2009-02-04 Andrew M. Bishop <amb> * src/router.c: Fix usage output. * src/ways.c, src/ways.h: Only sort once, don't store the index. * src/planetsplitter.c, src/router.c: Use '--*' command line arguments, not '-*'. * src/nodes.c, src/router.c, src/segments.c, src/ways.c: Make sure that nodes, segments and ways could be loaded. * src/nodes.h, src/optimiser.c, src/router.c, src/segments.c, src/segments.h, src/supersegments.c, src/types.h, src/filedumper.c, src/nodes.c: Sort the nodes geographically and take coordinates as command line arguments. 2009-02-02 Andrew M. Bishop <amb> * src/ways.c, src/ways.h, src/nodes.c, src/nodes.h, src/osmparser.c, src/segments.c, src/segments.h, src/supersegments.c, src/types.h: More variable and function name changes. 2009-02-01 Andrew M. Bishop <amb> * src/profiles.c, src/router.c, src/segments.c, src/segments.h, src/supersegments.c, src/ways.c, src/ways.h, src/files.c, src/functions.h, src/nodes.c, src/nodes.h, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/filedumper.c: Rename some variable types. 2009-01-31 Andrew M. Bishop <amb> * src/segments.c, src/segments.h, src/supersegments.c, src/types.h, src/ways.c, src/ways.h, src/functions.h, src/nodes.c, src/nodes.h, src/optimiser.c, src/planetsplitter.c, src/profiles.h, src/router.c: Intermediate version during code cleanup. * src/optimiser.c, src/planetsplitter.c, src/router.c, src/segments.c, src/segments.h, src/functions.h, src/nodes.h: Intermediate checkin, routing now working. * src/Makefile: Don't print out anything when creating the dependencies directory. * src/planetsplitter.c, src/router.c: Add command line options to specify the directory and filename prefix. 2009-01-30 Andrew M. Bishop <amb> * src/results.c, src/planetsplitter.c: Remove gcc warning. * src/Makefile: Move dependencies to subdir. * src/osmparser.c: Remove gcc warning. 2009-01-29 Andrew M. Bishop <amb> * src/functions.h, src/nodes.c, src/nodes.h, src/optimiser.c, src/planetsplitter.c, src/router.c, src/segments.c, src/segments.h, src/supersegments.c: Intermediate version while transitioning data format for nodes and segments. 2009-01-28 Andrew M. Bishop <amb> * src/Makefile, src/functions.h, src/nodes.c, src/nodes.h, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/segments.c, src/segments.h, src/supersegments.c, src/ways.c, src/ways.h: Intermediate version while transitioning data format for nodes and segments. 2009-01-27 Andrew M. Bishop <amb> * src/Makefile, src/functions.h, src/nodes.c, src/nodes.h, src/optimiser.c, src/planetsplitter.c, src/router.c, src/segments.c, src/segments.h, src/supersegments.c, src/ways.c, src/ways.h: Intermediate version while transitioning data format for nodes and segments. 2009-01-26 Andrew M. Bishop <amb> * src/osmparser.c, src/planetsplitter.c, src/segments.c, src/segments.h, src/supersegments.c, src/ways.c, src/ways.h, src/filedumper.c, src/files.c, src/functions.h, src/optimiser.c: Change Segment to contain index of way not its real ID. Don't store the real way ID to save space. 2009-01-25 Andrew M. Bishop <amb> * src/segments.c, src/segments.h: Slightly speed up the Duration calculation by changing the macro. * src/osmparser.c, src/profiles.c, src/ways.c, src/ways.h: Fix misspelling of Unclassified. * src/planetsplitter.c, src/segments.c, src/segments.h, src/supersegments.c, src/ways.h, src/optimiser.c: Change the segment->way so that it contains the index of the way, not the id. * src/profiles.c, src/profiles.h: New file. * src/ways.c, src/ways.h, src/Makefile, src/functions.h, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/router.c, src/segments.c, src/segments.h: Added profiles to define speed and allowed highways. Added new options to planetsplitter and router to use the profiles. 2009-01-24 Andrew M. Bishop <amb> * src/optimiser.c: Changed some variable names for clarity. * src/planetsplitter.c: Print more information about progress. Don't quit until 99.9% unchanged. * src/optimiser.c, src/results.c, src/results.h, src/supersegments.c: Change the Results structure so that the real data doesn't need to be realloc(). Add functions to access the first and subsequent elements of the Results structure. 2009-01-23 Andrew M. Bishop <amb> * src/osmparser.c, src/planetsplitter.c: Fix bug with not specifying a method of transport. * src/optimiser.c, src/router.c: Proper check that it was unroutable. * src/functions.h, src/optimiser.c, src/planetsplitter.c, src/supersegments.c: Remove "iteration" as function argument. * src/functions.h, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/router.c, src/ways.c, src/ways.h: Add command line options to planetsplitter and router. Select transport type (must be allowed on way for parsing). Select highway types (ignore when parsing or routing). * src/ways.h, src/functions.h, src/optimiser.c, src/osmparser.c, src/router.c, src/segments.c, src/segments.h, src/ways.c: Add enumerated type Transport. Replace variables of AllowType with Transport where more appropriate. Replace AllowType with Allowed. Replace WayType with Highway. * src/osmparser.c: Only include ways that are not Way_Unknown type. * src/osmparser.c: Include permissive access. * src/functions.h, src/optimiser.c, src/results.c, src/results.h, src/router.c: Create a large or small results structure depending on how many nodes are expected. 2009-01-22 Andrew M. Bishop <amb> * src/results.h: Increase the number of bins to 64k. * src/optimiser.c, src/osmparser.c, src/segments.c, src/segments.h, src/supersegments.c: Remove INVALID_DISTANCE and INVALID_DURATION. * src/optimiser.c, src/osmparser.c, src/supersegments.c, src/ways.c, src/ways.h: Removed the Way_TYPE() macro. * src/results.c, src/results.h, src/optimiser.c: Move queue functions into results.c. * src/filedumper.c, src/nodes.c, src/nodes.h, src/planetsplitter.c, src/router.c: Nodes, Segments, Ways - Nodes, Segments, Ways. * src/filedumper.c, src/nodes.c, src/nodes.h, src/segments.c, src/segments.h, src/ways.c, src/ways.h: Remove the choice of indexed or non-indexed data structures. 2009-01-21 Andrew M. Bishop <amb> * src/optimiser.c: Various small speed-ups including not-reversing direction. * src/functions.h, src/optimiser.c, src/osmparser.c, src/router.c, src/segments.c, src/segments.h, src/supersegments.c, src/ways.c, src/ways.h: Calculate way speeds at routing time. * src/supersegments.c: Add reverse-oneway segments when creating supernodes. Check incoming oneway streets as well as outgoing ones. * src/osmparser.c: Don't change speed on roundabouts. 2009-01-20 Andrew M. Bishop <amb> * src/planetsplitter.c: Add command line options for skipping parsing and iteration limit. * src/optimiser.c, src/osmparser.c, src/segments.c, src/segments.h, src/supersegments.c: Remove duration from segment, calculate duration depending on speed. 2009-01-19 Andrew M. Bishop <amb> * src/functions.h, src/optimiser.c, src/planetsplitter.c, src/supersegments.c: Iteratively calculate the super-segments. * src/ways.h: Redefine Way_TYPE() to include one-way status. 2009-01-18 Andrew M. Bishop <amb> * src/optimiser.c, src/supersegments.c: Fix problems with way-type matching and duplicated/missing super-segments. * src/functions.h, src/optimiser.c, src/router.c: Print out a GPX file. * src/optimiser.c, src/filedumper.c, src/functions.h, src/planetsplitter.c, src/router.c, src/segments.c, src/segments.h, src/supersegments.c, src/ways.c, src/ways.h: Added Super-Ways and allow user to select method of transport. * src/segments.c: Fix for changes made to ways. * src/supersegments.c: Ensure that supernodes are inserted wherever the way type changes. * src/osmparser.c: Fill in the extra way information. * src/ways.h: Store more information about a way (allowed modes of transport). * src/filedumper.c: Fix output printing. * src/router.c: Print an error if no route can be found. * src/optimiser.c: Fix bugs when start and/or finish nodes are supernodes. 2009-01-17 Andrew M. Bishop <amb> * src/Makefile: Add the option to create assembler output files. * src/optimiser.c, src/results.c, src/results.h, src/supersegments.c: Change the contents of the results data structure. * src/router.c: Added an option to not print the result. 2009-01-16 Andrew M. Bishop <amb> * src/optimiser.c, src/results.h, src/router.c: Speed optimisation by changing the contents of the Results structure. * src/optimiser.c: Don't bother calculating the distance to go, it takes too long. 2009-01-14 Andrew M. Bishop <amb> * src/planetsplitter.c: Remove bad segments and non-way nodes. * src/nodes.c, src/nodes.h: Remove nodes which are not in highways. Fix the sorting and create indexes after sorting, not before saving. * src/segments.c, src/segments.h: Remove bad segments (repeated consecutive nodes and duplicate segments). Fix the sorting and create indexes after sorting, not before saving. * src/supersegments.c: Use invalid distances properly. * src/ways.c: Fix the sort algorithm and update the indexes after sorting, not before saving. * src/optimiser.c: Fix the bug with merging the results. Fix the bug with not clearing the results structure properly. * src/osmparser.c: Add segments that correspond to the wrong way along one-way routes with an invalid distance. 2009-01-11 Andrew M. Bishop <amb> * src/functions.h, src/optimiser.c, src/router.c: Routes correctly using super-nodes (not Lands End to John O'Groats though). * src/filedumper.c, src/functions.h, src/optimiser.c, src/planetsplitter.c, src/router.c, src/segments.h, src/supersegments.c: Replace Junction with SuperNode. * src/nodes.c, src/nodes.h, src/segments.h, src/ways.c, src/ways.h: Some small changes to the nodes, segments and ways functions. * src/Makefile, src/filedumper.c, src/functions.h, src/optimiser.c, src/planetsplitter.c, src/results.h, src/router.c, src/segments.c, src/segments.h, src/supersegments.c: Working version with supersegments and junctions. 2009-01-10 Andrew M. Bishop <amb> * src/ways.c, src/ways.h, src/osmparser.c, src/segments.c: Store more information about ways. * src/results.h, src/results.c: New file. * src/Makefile, src/optimiser.c: Move the results data type into new files. * src/nodes.h, src/segments.h, src/ways.h: Increase the increment for the indexed array case. * src/ways.h, src/Makefile, src/filedumper.c, src/functions.h, src/nodes.c, src/nodes.h, src/optimiser.c, src/osmparser.c, src/planetsplitter.c, src/router.c, src/segments.c, src/segments.h, src/supersegments.c, src/ways.c: About to add the super-segment functionality using Segments data type to hold them. * src/functions.h, src/types.h: Changed after nodes, ways and segment changes. 2009-01-09 Andrew M. Bishop <amb> * src/segments.h: New file. * src/segments.c: Changed the format of the segments data type to match the nodes. * src/nodes.h: Enable indexed arrays. * src/ways.h: New file. * src/ways.c: Changed the format of the ways data type to match the nodes. * src/nodes.c, src/nodes.h: Changed the format of the nodes data type again. 2009-01-07 Andrew M. Bishop <amb> * src/nodes.h: New file. * src/nodes.c: Lots of modifications: Two data structures - in memory (pointers) and in file (array). Data is hashed into multiple bins. Each function takes a nodes structure as an argument. 2009-01-06 Andrew M. Bishop <amb> * src/supersegments.c: New file. * src/Makefile, src/filedumper.c, src/functions.h, src/planetsplitter.c, src/types.h: Added SuperSegments data type, but it does nothing yet. * src/optimiser.c: Tried to optimise the Queue data type. It was slower than the original. 2009-01-05 Andrew M. Bishop <amb> * src/filedumper.c: Print out the longest segment. * src/optimiser.c: Some optimisations. Increase the number of result bins and change find_insert_result() into insert_result(). 2009-01-04 Andrew M. Bishop <amb> * src/optimiser.c: Introduced some new data types to simplify the code. * src/filedumper.c: Print more useful information. * src/segments.c, src/types.h, src/ways.c, src/filedumper.c, src/functions.h, src/nodes.c, src/optimiser.c, src/osmparser.c, src/planetsplitter.c: Changed the node, way and segment functions and data types. Removed 'alloced', shortened the prototype array. Remove the automatic sorting of the data. Added assert statements. 2009-01-03 Andrew M. Bishop <amb> * src/ways.c: New file. * src/router.c, src/types.h, src/Makefile, src/filedumper.c, src/functions.h, src/optimiser.c, src/osmparser.c, src/planetsplitter.c: Added the ways to the output. 2009-01-02 Andrew M. Bishop <amb> * src/optimiser.c, src/osmparser.c, src/segments.c, src/types.h: Added macros to convert between distance/km and duration/hours/minutes. Shortened the Segment data type with shorter distances and durations. 2009-01-01 Andrew M. Bishop <amb> * src/functions.h, src/nodes.c, src/planetsplitter.c, src/segments.c, src/types.h: Remove the functions to initialise the node and segment arrays. * src/optimiser.c, src/router.c, src/Makefile: Print out the results. 2008-12-31 Andrew M. Bishop <amb> * src/types.h, src/segments.c, src/router.c, src/planetsplitter.c, src/osmparser.c, src/optimiser.c, src/nodes.c, src/functions.h, src/files.c, src/filedumper.c, src/Makefile: New file. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/Makefile������������������������������������������������������������������������������ 644 � 233 � 144 � 2620 13366130255 10034� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Top level Makefile # # Part of the Routino routing software. # # This file Copyright 2009-2015, 2018 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # All configuration is in the top-level Makefile.conf include Makefile.conf # Sub-directories and sub-makefiles SUBDIRS=src xml doc web extras python ######## all: for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done ######## test: for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done ######## install: for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done ######## clean: for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done ######## distclean: for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done ######## .PHONY:: all test install clean distclean ����������������������������������������������������������������������������������������������������������������routino-3.4.3/Makefile.conf������������������������������������������������������������������������� 644 � 233 � 144 � 10406 14451324551 11001� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Configuration Makefile # # Part of the Routino routing software. # # This file Copyright 2013-2015, 2017, 2018, 2020 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # Automatic operating system detection UNAME=$(shell uname) HOST=UNIX ifneq ($(findstring CYGWIN,$(UNAME)),) HOST=CYGWIN endif ifneq ($(findstring MINGW,$(UNAME)),) HOST=MINGW endif # Simplify handling of executable targets ending in .exe ifeq ($(HOST),MINGW) .EXE=.exe else .EXE= endif # Installation locations (edit if required) ifneq ($(HOST),MINGW) prefix=/usr/local bindir=$(prefix)/bin incdir=$(prefix)/include libdir=$(prefix)/lib docdir=$(prefix)/doc/routino datadir=$(prefix)/share/routino else prefix="c:/Program Files/Routino" bindir=$(prefix)/bin incdir=$(prefix)/include libdir=$(prefix)/lib docdir=$(prefix)/doc datadir=$(prefix)/xml endif # Library version for ABI compatibility SOVERSION=0 # Full library version (SOVERSION.MINOR[.RELEASE]) LIBVERSION=$(SOVERSION).0.0 # Compilation programs CC=gcc CXX=g++ LD=gcc ifdef CLANG ifeq ($(CLANG),1) CC=clang CXX=clang++ LD=clang endif endif # Maths library LDFLAGS=-lm # Language dialect selection CFLAGS=-std=c99 # Warning options CFLAGS+=-Wall -Wmissing-prototypes -Wextra -Wno-unused-parameter -pedantic ifdef CLANG ifeq ($(CLANG),1) CFLAGS+=-Wno-missing-field-initializers endif endif # Optimisation options CFLAGS+=-O3 # Fast maths option - makes test cases fail slightly CFLAGS+=-ffast-math ifdef FASTMATHS ifeq ($(FASTMATHS),0) CFLAGS+=-fno-fast-math endif endif # Optimisation option (only works if compilation and execution use exactly the same CPU architecture). #CFLAGS+=-march=native # Compile with debugging symbols CFLAGS+=-g # Option for compiling with sanitizer for debugging memory addresses and undefined behaviour ifdef SANITIZE ifeq ($(SANITIZE),1) CFLAGS+=-fsanitize=address -fsanitize=leak -fsanitize=undefined LDFLAGS+=-fsanitize=address -fsanitize=leak -fsanitize=undefined endif endif # Option for compiling with profiling for checking execution times ifdef PROFILE ifeq ($(PROFILE),1) CFLAGS+=-pg LDFLAGS+=-pg endif endif # Option for compiling with coverage for checking execution times and unused code ifdef COVERAGE ifeq ($(COVERAGE),1) CFLAGS+=--coverage LDFLAGS+=--coverage endif endif # Extra flags for compiling libroutino shared library (visibility of symbols, shared) CFLAGS_LIB=-fvisibility=hidden LDFLAGS_LIB=-shared # Extra flags for compiling libroutino shared library (position independent code) ifeq ($(HOST),UNIX) CFLAGS_LIB+=-fPIC LDFLAGS_LIB+=-fPIC endif # Extra flags for compiling libroutino shared library (SONAME) ifeq ($(HOST),UNIX) LDFLAGS_SONAME=-Wl,-soname=libroutino.so.$(SOVERSION) LDFLAGS_SLIM_SONAME=-Wl,-soname=libroutino-slim.so.$(SOVERSION) endif # Put the current directory in the shared library path for the router using libroutino LDFLAGS_LDSO=-Wl,-R. # Required for multi-threaded support (comment these two lines out if not required) CFLAGS+=-pthread -DUSE_PTHREADS LDFLAGS+=-pthread -lpthread # Required for bzip2 support (comment these two lines out if not required) ifneq ($(HOST),MINGW) CFLAGS+=-DUSE_BZIP2 LDFLAGS+=-lbz2 endif # Required for gzip support (comment these two lines out if not required) CFLAGS+=-DUSE_GZIP LDFLAGS+=-lz # Required for xz support (uncomment these two lines if required) #CFLAGS+=-DUSE_XZ #LDFLAGS+=-llzma # Required to use stdio with files > 2GiB on 32-bit system. CFLAGS+=-D_FILE_OFFSET_BITS=64 # Required to compile on Linux without a warning about pread() and pwrite() functions. ifneq ($(HOST),MINGW) CFLAGS+=-D_POSIX_C_SOURCE=200809L endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/INSTALL.txt��������������������������������������������������������������������������� 777 � 233 � 144 � 0 12031126065 12564� 2doc/INSTALL.txt����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/README.txt���������������������������������������������������������������������������� 777 � 233 � 144 � 0 12031126065 12242� 2doc/README.txt�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/NEWS.txt������������������������������������������������������������������������������ 777 � 233 � 144 � 0 12031126065 11700� 2doc/NEWS.txt�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/agpl-3.0.txt�������������������������������������������������������������������������� 644 � 233 � 144 � 103330 11506610625 10414� 0������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. Also add information on how to contact you by electronic and paper mail. If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see <http://www.gnu.org/licenses/>. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/������������������������������������������������������������������������������� 40755 � 233 � 144 � 0 13333077163 7670� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/find-fixme/�������������������������������������������������������������������� 40755 � 233 � 144 � 0 15003125373 11707� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/find-fixme/fixme-finder.c������������������������������������������������������ 644 � 233 � 144 � 25566 14774247523 14522� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************** OSM planet file fixme finder. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2023, 2025 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. ***************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include "version.h" #include "types.h" #include "ways.h" #include "typesx.h" #include "nodesx.h" #include "waysx.h" #include "relationsx.h" #include "files.h" #include "logging.h" #include "errorlogx.h" #include "functions.h" #include "osmparser.h" #include "tagging.h" #include "uncompress.h" /* Global variables */ /*+ The name of the temporary directory. +*/ char *option_tmpdirname=NULL; /*+ The amount of RAM to use for filesorting. +*/ size_t option_filesort_ramsize=0; /*+ The number of threads to use for filesorting. +*/ int option_filesort_threads=1; /* Local functions */ static void print_usage(int detail,const char *argerr,const char *err); /*++++++++++++++++++++++++++++++++++++++ The main program for the find-fixme. ++++++++++++++++++++++++++++++++++++++*/ int main(int argc,char** argv) { NodesX *OSMNodes; WaysX *OSMWays; RelationsX *OSMRelations; ErrorLogsX *OSMErrorLogs; char *dirname=NULL,*prefix=NULL,*tagging=NULL; int option_keep=1; int option_filenames=0; int arg; printf_program_start(); /* Parse the command line arguments */ for(arg=1;arg<argc;arg++) { if(!strcmp(argv[arg],"--version")) print_usage(-1,NULL,NULL); else if(!strcmp(argv[arg],"--help")) print_usage(1,NULL,NULL); else if(!strncmp(argv[arg],"--dir=",6)) dirname=&argv[arg][6]; else if(!strncmp(argv[arg],"--sort-ram-size=",16)) option_filesort_ramsize=atoi(&argv[arg][16]); #if defined(USE_PTHREADS) && USE_PTHREADS else if(!strncmp(argv[arg],"--sort-threads=",15)) option_filesort_threads=atoi(&argv[arg][15]); #endif else if(!strncmp(argv[arg],"--tmpdir=",9)) option_tmpdirname=&argv[arg][9]; else if(!strncmp(argv[arg],"--tagging=",10)) tagging=&argv[arg][10]; else if(!strcmp(argv[arg],"--loggable")) option_loggable=1; else if(!strcmp(argv[arg],"--logtime")) option_logtime=1; else if(!strcmp(argv[arg],"--logmemory")) option_logmemory=1; else if(argv[arg][0]=='-' && argv[arg][1]=='-') print_usage(0,argv[arg],NULL); else option_filenames++; } /* Check the specified command line options */ if(!option_filesort_ramsize) { #if SLIM option_filesort_ramsize=256*1024*1024; #else option_filesort_ramsize=1024*1024*1024; #endif } else option_filesort_ramsize*=1024*1024; #if defined(USE_PTHREADS) && USE_PTHREADS if(option_filesort_threads<1 || option_filesort_threads>32) print_usage(0,NULL,"Sorting threads '--sort-threads=...' must be small positive integer."); #endif if(!option_tmpdirname) { if(!dirname) option_tmpdirname="."; else option_tmpdirname=dirname; } if(tagging) { if(!ExistsFile(tagging)) { fprintf(stderr,"Error: The '--tagging' option specifies a file that does not exist.\n"); exit(EXIT_FAILURE); } } else { tagging=FileName(dirname,prefix,"fixme.xml"); if(!ExistsFile(tagging)) { fprintf(stderr,"Error: The '--tagging' option was not used and the default 'fixme.xml' does not exist.\n"); exit(EXIT_FAILURE); } } if(ParseXMLTaggingRules(tagging)) { fprintf(stderr,"Error: Cannot read the tagging rules in the file '%s'.\n",tagging); exit(EXIT_FAILURE); } /* Create new node, segment, way and relation variables */ OSMNodes=NewNodeList(0,0); OSMWays=NewWayList(0,0); OSMRelations=NewRelationList(0,0); /* Create the error log file */ open_errorlog(FileName(dirname,prefix,"fixme.log"),0,option_keep); /* Parse the file */ for(arg=1;arg<argc;arg++) { int fd; char *filename,*p; if(argv[arg][0]=='-' && argv[arg][1]=='-') continue; filename=strcpy(malloc(strlen(argv[arg])+1),argv[arg]); fd=OpenFile(filename); if((p=strstr(filename,".bz2")) && !strcmp(p,".bz2")) { fd=Uncompress_Bzip2(fd); *p=0; } if((p=strstr(filename,".gz")) && !strcmp(p,".gz")) { fd=Uncompress_Gzip(fd); *p=0; } if((p=strstr(filename,".xz")) && !strcmp(p,".xz")) { fd=Uncompress_Xz(fd); *p=0; } printf("\nParse OSM Data [%s]\n==============\n\n",filename); fflush(stdout); if((p=strstr(filename,".pbf")) && !strcmp(p,".pbf")) { if(ParsePBFFile(fd,OSMNodes,OSMWays,OSMRelations)) exit(EXIT_FAILURE); /* no message because one printed in parser function */ } else if((p=strstr(filename,".o5m")) && !strcmp(p,".o5m")) { if(ParseO5MFile(fd,OSMNodes,OSMWays,OSMRelations)) exit(EXIT_FAILURE); /* no message because one printed in parser function */ } else { if(ParseOSMFile(fd,OSMNodes,OSMWays,OSMRelations)) exit(EXIT_FAILURE); /* no message because one printed in parser function */ } CloseFile(fd); free(filename); } DeleteXMLTaggingRules(); FinishNodeList(OSMNodes); FinishWayList(OSMWays); FinishRelationList(OSMRelations); /* Sort the data */ printf("\nSort OSM Data\n=============\n\n"); fflush(stdout); /* Sort the nodes, ways and relations */ SortNodeList(OSMNodes); SortWayList(OSMWays); SortRelationList(OSMRelations); /* Process the data */ RenameFile(OSMNodes->filename_tmp,OSMNodes->filename); RenameFile(OSMWays->filename_tmp,OSMWays->filename); RenameFile(OSMRelations->rrfilename_tmp,OSMRelations->rrfilename); RenameFile(OSMRelations->trfilename_tmp,OSMRelations->trfilename); close_errorlog(); printf("\nCreate Error Log\n================\n\n"); fflush(stdout); OSMErrorLogs=NewErrorLogList(); ProcessErrorLogs(OSMErrorLogs,OSMNodes,OSMWays,OSMRelations); SortErrorLogsGeographically(OSMErrorLogs); SaveErrorLogs(OSMErrorLogs,FileName(dirname,prefix,"fixme.mem")); FreeErrorLogList(OSMErrorLogs); /* Free the memory (delete the temporary files) */ FreeNodeList(OSMNodes,0); FreeWayList(OSMWays,0); FreeRelationList(OSMRelations,0); printf("\n"); fflush(stdout); printf_program_end(); exit(EXIT_SUCCESS); } /*++++++++++++++++++++++++++++++++++++++ Print out the usage information. int detail The level of detail to use: -1 = just version number, 0 = low detail, 1 = full details. const char *argerr The argument that gave the error (if there is one). const char *err Other error message (if there is one). ++++++++++++++++++++++++++++++++++++++*/ static void print_usage(int detail,const char *argerr,const char *err) { if(detail<0) { fprintf(stderr, "Routino version " ROUTINO_VERSION " " ROUTINO_URL ".\n" ); } if(detail>=0) { fprintf(stderr, "Usage: fixme-finder [--version]\n" " [--help]\n" " [--dir=<dirname>]\n" #if defined(USE_PTHREADS) && USE_PTHREADS " [--sort-ram-size=<size>] [--sort-threads=<number>]\n" #else " [--sort-ram-size=<size>]\n" #endif " [--tmpdir=<dirname>]\n" " [--tagging=<filename>]\n" " [--loggable] [--logtime] [--logmemory]\n" " [<filename.osm> ...\n" " | <filename.pbf> ...\n" " | <filename.o5m> ..." #if defined(USE_BZIP2) && USE_BZIP2 "\n | <filename.(osm|o5m).bz2> ..." #endif #if defined(USE_GZIP) && USE_GZIP "\n | <filename.(osm|o5m).gz> ..." #endif #if defined(USE_XZ) && USE_XZ "\n | <filename.(osm|o5m).xz> ..." #endif "]\n"); if(argerr) fprintf(stderr, "\n" "Error with command line parameter: %s\n",argerr); if(err) fprintf(stderr, "\n" "Error: %s\n",err); } if(detail==1) fprintf(stderr, "\n" "--version Print the version of Routino.\n" "\n" "--help Prints this information.\n" "\n" "--dir=<dirname> The directory containing the fixme database.\n" "\n" "--sort-ram-size=<size> The amount of RAM (in MB) to use for data sorting\n" #if SLIM " (defaults to 256MB otherwise.)\n" #else " (defaults to 1024MB otherwise.)\n" #endif #if defined(USE_PTHREADS) && USE_PTHREADS "--sort-threads=<number> The number of threads to use for data sorting.\n" #endif "\n" "--tmpdir=<dirname> The directory name for temporary files.\n" " (defaults to the '--dir' option directory.)\n" "\n" "--tagging=<filename> The name of the XML file containing the tagging rules\n" " (defaults to 'fixme.xml' with '--dir' option)\n" "\n" "--loggable Print progress messages suitable for logging to file.\n" "--logtime Print the elapsed time for each processing step.\n" "--logmemory Print the max allocated/mapped memory for each step.\n" "\n" "<filename.osm>, <filename.pbf>, <filename.o5m>\n" " The name(s) of the file(s) to read and parse.\n" " Filenames ending '.pbf' read as PBF, filenames ending\n" " '.o5m' read as O5M, others as XML.\n" #if defined(USE_BZIP2) && USE_BZIP2 " Filenames ending '.bz2' will be bzip2 uncompressed.\n" #endif #if defined(USE_GZIP) && USE_GZIP " Filenames ending '.gz' will be gzip uncompressed.\n" #endif #if defined(USE_XZ) && USE_XZ " Filenames ending '.xz' will be xz uncompressed.\n" #endif ); exit(!detail); } ������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/find-fixme/web/���������������������������������������������������������������� 40755 � 233 � 144 � 0 12216114770 12466� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/find-fixme/web/bin/������������������������������������������������������������ 40755 � 233 � 144 � 0 15003125373 13234� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/find-fixme/web/data/����������������������������������������������������������� 40755 � 233 � 144 � 0 15003125373 13375� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/find-fixme/web/www/������������������������������������������������������������ 40755 � 233 � 144 � 0 15003125373 13310� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/find-fixme/web/www/fixme.openlayers2.js���������������������������������������� 644 � 233 � 144 � 36520 13755517227 17301� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// // Routino (extras) fixme web page Javascript // // Part of the Routino routing software. // // This file Copyright 2008-2014, 2019, 2020 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Initialisation ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Process the URL query string and extract the arguments var legal={"^lon" : "^[-0-9.]+$", "^lat" : "^[-0-9.]+$", "^zoom" : "^[-0-9.]+$"}; var args={}; if(location.search.length>1) { var query,queries; query=location.search.replace(/^\?/,""); query=query.replace(/;/g,"&"); queries=query.split("&"); for(var i=0;i<queries.length;i++) { queries[i].match(/^([^=]+)(=(.*))?$/); var k=RegExp.$1; var v=decodeURIComponent(RegExp.$3); for(var l in legal) { if(k.match(RegExp(l)) && v.match(RegExp(legal[l]))) args[k]=v; } } } //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// Map handling ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// var map; var layerMap=[], layerHighlights, layerVectors; var vectorData=[]; var epsg4326, epsg900913; var select; // // Initialise the 'map' object // function map_init() // called from fixme.html { // Create the map (Map URLs and limits are in mapprops.js) epsg4326=new OpenLayers.Projection("EPSG:4326"); epsg900913=new OpenLayers.Projection("EPSG:900913"); map = new OpenLayers.Map ("map", { controls:[ new OpenLayers.Control.Navigation(), new OpenLayers.Control.PanZoomBar(), new OpenLayers.Control.ScaleLine(), new OpenLayers.Control.LayerSwitcher() ], projection: epsg900913, displayProjection: epsg4326, minZoomLevel: mapprops.zoomout, numZoomLevels: mapprops.zoomin-mapprops.zoomout+1, maxResolution: 156543.03390625 / Math.pow(2,mapprops.zoomout), restrictedExtent: new OpenLayers.Bounds(mapprops.westedge,mapprops.southedge,mapprops.eastedge,mapprops.northedge).transform(epsg4326,epsg900913) }); // Get a URL for the tile (mostly copied from OpenLayers/Layer/XYZ.js). function limitedUrl(bounds) { var res = this.map.getResolution(); var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w)); var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h)); var z = this.map.getZoom() + this.map.minZoomLevel; var limit = Math.pow(2, z); x = ((x % limit) + limit) % limit; var xyz = {"x": x, "y": y, "z": z}; var url = this.url; if (OpenLayers.Util.isArray(url)) { var s = "" + xyz.x + xyz.y + xyz.z; url = this.selectUrl(s, url); } return OpenLayers.String.format(url, xyz); } // Add map tile layers for(var l=0; l<mapprops.mapdata.length; l++) { var urls; if(OpenLayers.Util.isArray(mapprops.mapdata[l].tiles.subdomains)) { urls=[]; for(var s=0; s<mapprops.mapdata[l].tiles.subdomains.length; s++) urls.push(mapprops.mapdata[l].tiles.url.replace(/\${s}/,mapprops.mapdata[l].tiles.subdomains[s])); } else urls=mapprops.mapdata[l].tiles.url; layerMap[l] = new OpenLayers.Layer.TMS(mapprops.mapdata[l].label, urls, { getURL: limitedUrl, displayOutsideMaxExtent: true, buffer: 1 }); map.addLayer(layerMap[l]); } // Update the attribution if the layer changes function change_attribution_event(event) { for(var l=0; l<mapprops.mapdata.length; l++) if(layerMap[l] == event.layer) change_attribution(l); } map.events.register("changelayer",layerMap,change_attribution_event); function change_attribution(l) { var data_url =mapprops.mapdata[l].attribution.data_url; var data_text=mapprops.mapdata[l].attribution.data_text; var tile_url =mapprops.mapdata[l].attribution.tile_url; var tile_text=mapprops.mapdata[l].attribution.tile_text; document.getElementById("attribution_data").innerHTML="<a href=\"" + data_url + "\" target=\"data_attribution\">" + data_text + "</a>"; document.getElementById("attribution_tile").innerHTML="<a href=\"" + tile_url + "\" target=\"tile_attribution\">" + tile_text + "</a>"; } change_attribution(0); // Add two vectors layers (one for highlights that display behind the vectors) layerHighlights = new OpenLayers.Layer.Vector("Highlights",{displayInLayerSwitcher: false}); map.addLayer(layerHighlights); layerVectors = new OpenLayers.Layer.Vector("Markers",{displayInLayerSwitcher: false}); map.addLayer(layerVectors); // Handle feature selection and popup select = new OpenLayers.Control.SelectFeature(layerVectors, {onSelect: selectFeature, onUnselect: unselectFeature}); map.addControl(select); select.activate(); createPopup(); // Move the map map.events.register("moveend", map, (function() { displayMoreData();})); var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon !== undefined && lat !== undefined && zoom !== undefined) { lat = Number(lat); lon = Number(lon); zoom = Number.parseInt(Number(zoom)+0.5); if(lon<mapprops.westedge) lon=mapprops.westedge; if(lon>mapprops.eastedge) lon=mapprops.eastedge; if(lat<mapprops.southedge) lat=mapprops.southedge; if(lat>mapprops.northedge) lat=mapprops.northedge; if(zoom<mapprops.zoomout) zoom=mapprops.zoomout; if(zoom>mapprops.zoomin) zoom=mapprops.zoomin; var lonlat = new OpenLayers.LonLat(lon,lat); lonlat.transform(epsg4326,epsg900913); map.moveTo(lonlat,zoom-map.minZoomLevel); } else { map.setCenter(map.restrictedExtent.getCenterLonLat(), map.getZoomForExtent(map.restrictedExtent,false)); map.maxResolution = map.getResolution(); } // Unhide editing URL if variable set if(mapprops.editurl !== undefined && mapprops.editurl !== "") { var edit_url=document.getElementById("edit_url"); edit_url.style.display=""; edit_url.href=mapprops.editurl; } updateURLs(false); } // // Format a number in printf("%.5f") format. // function format5f(number) { var newnumber=Math.floor(number*100000+0.5); var delta=0; if(newnumber>=0 && newnumber<100000) delta= 100000; if(newnumber<0 && newnumber>-100000) delta=-100000; var string=String(newnumber+delta); var intpart =string.substring(0,string.length-5); var fracpart=string.substring(string.length-5,string.length); if(delta>0) intpart="0"; if(delta<0) intpart="-0"; return(intpart + "." + fracpart); } // // Build a set of URL arguments for the map location // function buildMapArguments() { var lonlat = map.getCenter().clone(); lonlat.transform(epsg900913,epsg4326); var zoom = map.getZoom() + map.minZoomLevel; return "lat=" + format5f(lonlat.lat) + ";lon=" + format5f(lonlat.lon) + ";zoom=" + zoom; } // // Update the URLs // function updateURLs(addhistory) { var mapargs=buildMapArguments(); var libargs=";library=" + mapprops.library; if(!mapprops.libraries) libargs=""; var links=document.getElementsByTagName("a"); for(var i=0; i<links.length; i++) { var element=links[i]; if(element.id == "permalink_url") element.href=location.pathname + "?" + mapargs + libargs; if(element.id == "edit_url") element.href=mapprops.editurl + "?" + mapargs; } if(addhistory) history.replaceState(null, null, location.pathname + "?" + mapargs + libargs); } //////////////////////////////////////////////////////////////////////////////// ///////////////////////// Popup and selection handling ///////////////////////// //////////////////////////////////////////////////////////////////////////////// var popup=null; // // Create a popup - independent of map because want it fixed on screen not fixed on map. // function createPopup() { popup=document.createElement("div"); popup.className = "popup"; popup.innerHTML = "<span></span>"; popup.style.display = "none"; popup.style.position = "fixed"; popup.style.top = "-4000px"; popup.style.left = "-4000px"; popup.style.zIndex = "100"; popup.style.padding = "5px"; popup.style.opacity=0.85; popup.style.backgroundColor="#C0C0C0"; popup.style.border="4px solid #404040"; document.body.appendChild(popup); } // // Draw a popup - independent of map because want it fixed on screen not fixed on map. // function drawPopup(html) { if(html===null) { popup.style.display="none"; return; } if(popup.style.display=="none") { var map_div=document.getElementById("map"); popup.style.left =map_div.offsetParent.offsetLeft+map_div.offsetLeft+60 + "px"; popup.style.top = map_div.offsetTop +30 + "px"; popup.style.width =map_div.clientWidth-120 + "px"; popup.style.display=""; } var close="<span style='float: right; cursor: pointer;' onclick='drawPopup(null)'>X</span>"; popup.innerHTML=close+html; } // // Select a feature // function selectFeature(feature) { if(feature.attributes.dump) ajaxGET("fixme.cgi?dump=" + feature.attributes.dump, runDumpSuccess); layerHighlights.destroyFeatures(); var highlight_style = new OpenLayers.Style({},{strokeColor: "#F0F000",strokeWidth: 8, fillColor: "#F0F000",pointRadius: 4}); var highlight = new OpenLayers.Feature.Vector(feature.geometry.clone(),{},highlight_style); layerHighlights.addFeatures([highlight]); } // // Un-select a feature // function unselectFeature(feature) { layerHighlights.destroyFeatures(); drawPopup(null); } // // Display the dump data // function runDumpSuccess(response) { var string=response.responseText; if(mapprops.browseurl !== undefined && mapprops.browseurl !== "") { var types=["node", "way", "relation"]; for(var t in types) { var type=types[t]; var regexp=RegExp(type + " id='([0-9]+)'"); var match=string.match(regexp); if(match !== null) { var id=match[1]; string=string.replace(regexp,type + " id='<a href='" + mapprops.browseurl + "/" + type + "/" + id + "' target='" + type + id + "'>" + id + "</a>'"); } } } drawPopup(string.split("><").join("><br><").split("<br><tag").join("<br>  <tag")); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Server handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Define an AJAX request object // function ajaxGET(url,success,failure,state) { var ajaxRequest=new XMLHttpRequest(); function ajaxGOT(options) { if(this.readyState==4) if(this.status==200) { if(typeof(options.success)=="function") options.success(this,options.state); } else { if(typeof(options.failure)=="function") options.failure(this,options.state); } } ajaxRequest.onreadystatechange = function(){ ajaxGOT.call(ajaxRequest,{success: success, failure: failure, state: state}); }; ajaxRequest.open("GET", url, true); ajaxRequest.send(null); } // // Display the status // function displayStatus(type,subtype,content) { var child=document.getElementById("result_status").firstChild; do { if(child.id !== undefined) child.style.display="none"; child=child.nextSibling; } while(child !== null); var chosen_status=document.getElementById("result_status_" + type); chosen_status.style.display=""; if(subtype !== undefined) { var format_status=document.getElementById("result_status_" + subtype).innerHTML; chosen_status.innerHTML=format_status.replace("#",String(content)); } } // // Display data statistics // function displayStatistics() { // Use AJAX to get the statistics ajaxGET("fixme.cgi?statistics=yes", runStatisticsSuccess); } // // Success in running data statistics generation. // function runStatisticsSuccess(response) { document.getElementById("statistics_data").innerHTML="<pre>" + response.responseText + "</pre>"; document.getElementById("statistics_link").style.display="none"; } // // Get the requested data // function displayData(datatype) // called from fixme.html { // Delete the old data vectorData=[]; unselectFeature(); select.deactivate(); layerVectors.destroyFeatures(); // Print the status displayStatus("no_data"); // Return if just here to clear the data if(datatype === "") return; displayMoreData(); } function displayMoreData() { // Get the new data var mapbounds=map.getExtent().clone(); mapbounds.transform(epsg900913,epsg4326); var url="fixme.cgi"; url=url + "?lonmin=" + format5f(mapbounds.left); url=url + ";latmin=" + format5f(mapbounds.bottom); url=url + ";lonmax=" + format5f(mapbounds.right); url=url + ";latmax=" + format5f(mapbounds.top); url=url + ";data=fixmes"; // Use AJAX to get the data ajaxGET(url, runFixmeSuccess, runFailure); updateURLs(true); } // // Success in getting the error log data // function runFixmeSuccess(response) { var lines=response.responseText.split("\n"); var style = new OpenLayers.Style({},{stroke: false, pointRadius: 3,fillColor: "#FF0000", cursor: "pointer"}); var features=[]; for(var line=0;line<lines.length;line++) { var words=lines[line].split(" "); if(line === 0) continue; else if(words[0] !== "") { var dump=words[0]; if(vectorData[dump]) continue; else vectorData[dump]=1; var lat=Number(words[1]); var lon=Number(words[2]); var lonlat = new OpenLayers.LonLat(lon,lat).transform(epsg4326,epsg900913); var point = new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat); features.push(new OpenLayers.Feature.Vector(point,{dump: dump},style)); } } select.activate(); layerVectors.addFeatures(features); displayStatus("data","fixme",Object.keys(vectorData).length); } // // Failure in getting data. // function runFailure(response) { displayStatus("failed"); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/find-fixme/web/www/.htaccess��������������������������������������������������� 644 � 233 � 144 � 2166 12640720765 15141� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������## ## Options for Apache web server for language specific web pages and to run ## Routino Fixme-finder CGI script. ## # For some of the configuration options in this file to be accepted the # 'AllowOverride' option in the main Apache configuration file must be set to a # particular value. A suitable value for the 'AllowOverride' option is # 'Options=MultiViews,ExecCGI FileInfo Limit' which will allow this file to be # used unmodified. Alternatively the specific option can be commented out from # this file and set in the main Apache configuration file. # The Routino CGI scripts are stored in this directory and use the filename # extension ".cgi". This filename extension needs to be registered with Apache # for the scripts to be executed. AddHandler cgi-script .cgi # The ExecCGI option must be set for the CGIs in this directory to be executed # by Apache. Options +ExecCGI # The CGI scripts that are used by Routino also call some other Perl scripts, to # stop these scripts from being seen by web users they can be denied by the # following entry. <FilesMatch .*\.pl$> Order Deny,Allow Deny from all </FilesMatch> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/find-fixme/web/www/paths.pl���������������������������������������������������� 644 � 233 � 144 � 2172 12153665547 15021� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Routino CGI paths Perl script # # Part of the Routino routing software. # # This file Copyright 2008-2013 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # Directory path parameters # EDIT THIS to set the root directory for the non-web data files. $root_dir=".."; # EDIT THIS to change the location of the individual directories. $bin_dir="$root_dir/bin"; $data_dir="$root_dir/data"; # EDIT THIS to change the name of the executable (enables easy selection of slim mode). $fixme_dumper_exe="fixme-dumper"; 1; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.3/extras/find-fixme/web/www/fixme.html�������������������������������������������������� 644 � 233 � 144 � 13252 12625131677 15360� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="keywords" content="openstreetmap routino fixme"> <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=no"> <title>Routino Extras : Viewer for OpenStreetMap "fixme" Tags
Fixme Data
OSM "fixme" Tags This web page allows viewing the "fixme" tags in OSM data. It is generated using a modified version of the Routino router data processor.
Instructions Zoom in and then use the button below to download the data. The server will only return data if the selected area is small enough.
Status
No data displayed
Get Data
The points displayed on the map are the location of items in the OSM data that are tagged with "fixme" = "...". Clicking on one of the points will display the Node, Way or Relation identifier and the contents of the tag.
+ - Help
Quick Start
Zoom to an area and select one of the buttons to display the fixme data.

Data Failure
If the area selected is too large (depends on the data type) then the status will say "Failed to get fixme data" - zoom in and try again.

Data Generator: Routino | Geo Data: | Tiles:
routino-3.4.3/extras/find-fixme/web/www/fixme.cgi 755 233 144 6531 12767517341 15146 0#!/usr/bin/perl # # Routino data visualiser CGI # # Part of the Routino routing software. # # This file Copyright 2008-2014, 2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Use the directory paths script require "./paths.pl"; # Use the perl CGI module use CGI ':cgi'; # Create the query and get the parameters my $query=new CGI; my @rawparams=$query->param; # Legal CGI parameters with regexp validity check my %legalparams=( "latmin" => "[-0-9.]+", "latmax" => "[-0-9.]+", "lonmin" => "[-0-9.]+", "lonmax" => "[-0-9.]+", "data" => "fixmes", "dump" => "fixme[0-9]+", "statistics" => "yes" ); # Validate the CGI parameters, ignore invalid ones my %cgiparams=(); foreach my $key (@rawparams) { foreach my $test (keys (%legalparams)) { if($key =~ m%^$test$%) { my $value=$query->param($key); if($value =~ m%^$legalparams{$test}$%) { $cgiparams{$key}=$value; last; } } } } # Data, dump or statistics? my $params=""; my $data =$cgiparams{"data"}; my $dump =$cgiparams{"dump"}; my $statistics=$cgiparams{"statistics"}; if(!defined $data && !defined $dump && !defined $statistics) { print header(-status => '500 Invalid CGI parameters'); exit; } if(defined $statistics) { # Print the output print header('text/plain'); # Set the parameters $params.=" --statistics"; } elsif(defined $data) { # Parameters to limit range selected my $limits=0.5; # Check the parameters my $latmin=$cgiparams{"latmin"}; my $latmax=$cgiparams{"latmax"}; my $lonmin=$cgiparams{"lonmin"}; my $lonmax=$cgiparams{"lonmax"}; if($latmin eq "" || $latmax eq "" || $lonmin eq "" || $lonmax eq "" || $data eq "") { print header(-status => '500 Invalid CGI parameters'); exit; } if(($latmax-$latmin)>$limits || ($lonmax-$lonmin)>$limits) { print header(-status => '500 Selected area too large'); exit; } # Print the output print header('text/plain'); print "$latmin $lonmin $latmax $lonmax\n"; # Set the parameters $params.=" --visualiser --data=$data"; $params.=" --latmin=$latmin --latmax=$latmax --lonmin=$lonmin --lonmax=$lonmax"; } else { # Print the output print header('text/plain'); # Set the parameters $params.=" --dump-visualiser --data=$dump"; } # Run the filedumper $params.=" --dir=$main::data_dir" if($main::data_dir); $params.=" --prefix=$main::data_prefix" if($main::data_prefix); system "$main::bin_dir/$main::fixme_dumper_exe $params 2>&1"; routino-3.4.3/extras/find-fixme/web/www/fixme.css 644 233 144 3133 12260524267 15155 0/* // Routino (extras) fixme web page style sheet. // // Part of the Routino routing software. // // This file Copyright 2008-2013 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . */ /*--------------------------------*/ /* Left panel - override defaults */ /*--------------------------------*/ DIV.hideshow_box { overflow-x: auto; } /*-----------------------------------*/ /* Left panel - specific tab options */ /*-----------------------------------*/ DIV#tab_fixme_div INPUT { padding: 0; border: 1px solid; margin: 0; text-align: center; } DIV#tab_fixme_div INPUT:hover { background: #F0F0C0; } DIV#tab_fixme_div DIV.center { text-align: center; } DIV#tab_fixme_div TABLE { padding: 0; border: 0 hidden; margin: 0; } DIV#tab_fixme_div TABLE TD { padding: 0; border: 0; margin: 0; } DIV#tab_fixme_div INPUT { padding: 0; border: 1px solid; margin: 0; } /*-------*/ /* Popup */ /*-------*/ DIV.popup { font-family: monospace; font-size: 10px; } routino-3.4.3/extras/find-fixme/web/www/fixme.openlayers.js 644 233 144 34114 14441355012 17175 0// // Routino (extras) fixme web page Javascript // // Part of the Routino routing software. // // This file Copyright 2008-2014, 2019, 2020, 2023 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Initialisation ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Process the URL query string and extract the arguments var legal={"^lon" : "^[-0-9.]+$", "^lat" : "^[-0-9.]+$", "^zoom" : "^[-0-9.]+$"}; var args={}; if(location.search.length>1) { var query,queries; query=location.search.replace(/^\?/,""); query=query.replace(/;/g,"&"); queries=query.split("&"); for(var i=0;i=0; l--) { mapprops.mapdata[l].tiles.url=mapprops.mapdata[l].tiles.url.replace(/\$\{/g,"{"); var urls; if(mapprops.mapdata[l].tiles.subdomains===undefined) urls=[mapprops.mapdata[l].tiles.url]; else { urls=[]; for(var s=0; s" + data_text + ""; document.getElementById("attribution_tile").innerHTML="" + tile_text + ""; } change_attribution(0); // Add two vectors layers (one for highlights that display behind the vectors) layerHighlights = new ol.layer.Vector({source: new ol.source.Vector()}); map.addLayer(layerHighlights); layerVectors = new ol.layer.Vector({source: new ol.source.Vector()}); map.addLayer(layerVectors); // Handle feature selection and popup map.on("click", function(e) { var first=true; map.forEachFeatureAtPixel(e.pixel, function (feature, layer) { if(first) selectFeature(feature); first=false; }) }); createPopup(); // Move the map map.on("moveend", (function() { displayMoreData();}), map); var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon !== undefined && lat !== undefined && zoom !== undefined) { lat = Number(lat); lon = Number(lon); zoom = Number(zoom); if(lonmapprops.eastedge) lon=mapprops.eastedge; if(latmapprops.northedge) lat=mapprops.northedge; if(zoommapprops.zoomin) zoom=mapprops.zoomin; map.getView().setCenter(ol.proj.fromLonLat([lon,lat])); map.getView().setZoom(zoom); } else map.getView().fit(extent,map.getSize()); // Unhide editing URL if variable set if(mapprops.editurl !== undefined && mapprops.editurl !== "") { var edit_url=document.getElementById("edit_url"); edit_url.style.display=""; edit_url.href=mapprops.editurl; } updateURLs(false); } // // Format a number in printf("%.5f") format. // function format5f(number) { var newnumber=Math.floor(number*100000+0.5); var delta=0; if(newnumber>=0 && newnumber<100000) delta= 100000; if(newnumber<0 && newnumber>-100000) delta=-100000; var string=String(newnumber+delta); var intpart =string.substring(0,string.length-5); var fracpart=string.substring(string.length-5,string.length); if(delta>0) intpart="0"; if(delta<0) intpart="-0"; return(intpart + "." + fracpart); } // // Build a set of URL arguments for the map location // function buildMapArguments() { var lonlat = ol.proj.toLonLat(map.getView().getCenter()); var zoom = map.getView().getZoom(); if( ! Number.isInteger(zoom) ) zoom = format5f(zoom); return "lat=" + format5f(lonlat[1]) + ";lon=" + format5f(lonlat[0]) + ";zoom=" + zoom; } // // Update the URLs // function updateURLs(addhistory) { var mapargs=buildMapArguments(); var libargs=";library=" + mapprops.library; if(!mapprops.libraries) libargs=""; var links=document.getElementsByTagName("a"); for(var i=0; i" + id + "'"); } } } drawPopup(string.split("><").join(">
<").split("
<tag").join("
  <tag")); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Server handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Define an AJAX request object // function ajaxGET(url,success,failure,state) { var ajaxRequest=new XMLHttpRequest(); function ajaxGOT(options) { if(this.readyState==4) if(this.status==200) { if(typeof(options.success)=="function") options.success(this,options.state); } else { if(typeof(options.failure)=="function") options.failure(this,options.state); } } ajaxRequest.onreadystatechange = function(){ ajaxGOT.call(ajaxRequest,{success: success, failure: failure, state: state}); }; ajaxRequest.open("GET", url, true); ajaxRequest.send(null); } // // Display the status // function displayStatus(type,subtype,content) { var child=document.getElementById("result_status").firstChild; do { if(child.id !== undefined) child.style.display="none"; child=child.nextSibling; } while(child !== null); var chosen_status=document.getElementById("result_status_" + type); chosen_status.style.display=""; if(subtype !== undefined) { var format_status=document.getElementById("result_status_" + subtype).innerHTML; chosen_status.innerHTML=format_status.replace("#",String(content)); } } // // Display data statistics // function displayStatistics() { // Use AJAX to get the statistics ajaxGET("fixme.cgi?statistics=yes", runStatisticsSuccess); } // // Success in running data statistics generation. // function runStatisticsSuccess(response) { document.getElementById("statistics_data").innerHTML="
" + response.responseText + "
"; document.getElementById("statistics_link").style.display="none"; } // // Get the requested data // function displayData(datatype) // called from fixme.html { // Delete the old data vectorData=[]; unselectFeature(); layerVectors.getSource().clear(); // Print the status displayStatus("no_data"); // Return if just here to clear the data if(datatype === "") return; displayMoreData(); } function displayMoreData() { // Get the new data var mapbounds=map.getView().calculateExtent(map.getSize()); var url="fixme.cgi"; url=url + "?lonmin=" + format5f(ol.proj.toLonLat([mapbounds[0],mapbounds[1]])[0]); url=url + ";latmin=" + format5f(ol.proj.toLonLat([mapbounds[0],mapbounds[1]])[1]); url=url + ";lonmax=" + format5f(ol.proj.toLonLat([mapbounds[2],mapbounds[3]])[0]); url=url + ";latmax=" + format5f(ol.proj.toLonLat([mapbounds[2],mapbounds[3]])[1]); url=url + ";data=fixmes"; // Use AJAX to get the data ajaxGET(url, runFixmeSuccess, runFailure); updateURLs(true); } // // Success in getting the error log data // function runFixmeSuccess(response) { var lines=response.responseText.split("\n"); var style = new ol.style.Style({image: new ol.style.Circle({fill: new ol.style.Fill({color: "#FF0000"}), radius: 3})}); var features=[]; for(var line=0;line Routino Extras : Viewer for OpenStreetMap "fixme" Tags

Routino Extras : Viewer for OpenStreetMap "fixme" Tags

routino-3.4.3/extras/find-fixme/web/www/fixme.leaflet.js 644 233 144 31417 13755516501 16444 0// // Routino (extras) fixme web page Javascript // // Part of the Routino routing software. // // This file Copyright 2008-2014, 2019, 2020 Andrew M. Bishop // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Initialisation ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Process the URL query string and extract the arguments var legal={"^lon" : "^[-0-9.]+$", "^lat" : "^[-0-9.]+$", "^zoom" : "^[-0-9.]+$"}; var args={}; if(location.search.length>1) { var query,queries; query=location.search.replace(/^\?/,""); query=query.replace(/;/g,"&"); queries=query.split("&"); for(var i=0;i" + data_text + ""; document.getElementById("attribution_tile").innerHTML="" + tile_text + ""; } change_attribution(0); // Add two vectors layers (one for highlights that display behind the vectors) layerVectors = L.layerGroup(); map.addLayer(layerVectors); layerHighlights = L.layerGroup(); map.addLayer(layerHighlights); // Handle popup createPopup(); // Move the map map.on("moveend", (function() { displayMoreData();})); var lon =args["lon"]; var lat =args["lat"]; var zoom=args["zoom"]; if(lon !== undefined && lat !== undefined && zoom !== undefined) { lat = Number(lat); lon = Number(lon); zoom = Number.parseInt(Number(zoom)+0.5); if(lonmapprops.eastedge) lon=mapprops.eastedge; if(latmapprops.northedge) lat=mapprops.northedge; if(zoommapprops.zoomin) zoom=mapprops.zoomin; map.setView(L.latLng(lat,lon),zoom); } else map.fitBounds(map.options.maxBounds); // Unhide editing URL if variable set if(mapprops.editurl !== undefined && mapprops.editurl !== "") { var edit_url=document.getElementById("edit_url"); edit_url.style.display=""; edit_url.href=mapprops.editurl; } updateURLs(false); } // // Format a number in printf("%.5f") format. // function format5f(number) { var newnumber=Math.floor(number*100000+0.5); var delta=0; if(newnumber>=0 && newnumber<100000) delta= 100000; if(newnumber<0 && newnumber>-100000) delta=-100000; var string=String(newnumber+delta); var intpart =string.substring(0,string.length-5); var fracpart=string.substring(string.length-5,string.length); if(delta>0) intpart="0"; if(delta<0) intpart="-0"; return(intpart + "." + fracpart); } // // Build a set of URL arguments for the map location // function buildMapArguments() { var lonlat = map.getCenter(); var zoom = map.getZoom(); return "lat=" + format5f(lonlat.lat) + ";lon=" + format5f(lonlat.lng) + ";zoom=" + zoom; } // // Update the URLs // function updateURLs(addhistory) { var mapargs=buildMapArguments(); var libargs=";library=" + mapprops.library; if(!mapprops.libraries) libargs=""; var links=document.getElementsByTagName("a"); for(var i=0; i" + id + "'"); } } } drawPopup(string.split("><").join(">
<").split("
<tag").join("
  <tag")); } //////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Server handling //////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Define an AJAX request object // function ajaxGET(url,success,failure,state) { var ajaxRequest=new XMLHttpRequest(); function ajaxGOT(options) { if(this.readyState==4) if(this.status==200) { if(typeof(options.success)=="function") options.success(this,options.state); } else { if(typeof(options.failure)=="function") options.failure(this,options.state); } } ajaxRequest.onreadystatechange = function(){ ajaxGOT.call(ajaxRequest,{success: success, failure: failure, state: state}); }; ajaxRequest.open("GET", url, true); ajaxRequest.send(null); } // // Display the status // function displayStatus(type,subtype,content) { var child=document.getElementById("result_status").firstChild; do { if(child.id !== undefined) child.style.display="none"; child=child.nextSibling; } while(child !== null); var chosen_status=document.getElementById("result_status_" + type); chosen_status.style.display=""; if(subtype !== undefined) { var format_status=document.getElementById("result_status_" + subtype).innerHTML; chosen_status.innerHTML=format_status.replace("#",String(content)); } } // // Display data statistics // function displayStatistics() { // Use AJAX to get the statistics ajaxGET("fixme.cgi?statistics=yes", runStatisticsSuccess); } // // Success in running data statistics generation. // function runStatisticsSuccess(response) { document.getElementById("statistics_data").innerHTML="
" + response.responseText + "
"; document.getElementById("statistics_link").style.display="none"; } // // Get the requested data // function displayData(datatype) // called from fixme.html { // Delete the old data vectorData=[]; unselectFeature(); layerVectors.clearLayers(); // Print the status displayStatus("no_data"); // Return if just here to clear the data if(datatype === "") return; displayMoreData(); } function displayMoreData() { // Get the new data var mapbounds=map.getBounds(); var url="fixme.cgi"; url=url + "?lonmin=" + format5f(mapbounds.getWest()); url=url + ";latmin=" + format5f(mapbounds.getSouth()); url=url + ";lonmax=" + format5f(mapbounds.getEast()); url=url + ";latmax=" + format5f(mapbounds.getNorth()); url=url + ";data=fixmes"; // Use AJAX to get the data ajaxGET(url, runFixmeSuccess, runFailure); updateURLs(true); } // // Success in getting the error log data // function runFixmeSuccess(response) { var lines=response.responseText.split("\n"); for(var line=0;line. ***************************************/ #include #include #include #include "types.h" #include "typesx.h" #include "nodesx.h" #include "waysx.h" #include "relationsx.h" #include "osmparser.h" #include "tagging.h" #include "logging.h" /* Local parsing variables (re-initialised for each file) */ static NodesX *nodes; static WaysX *ways; static RelationsX *relations; static node_t *way_nodes; static int way_nnodes; static node_t *relation_nodes; static int relation_nnodes; static way_t *relation_ways; static int relation_nways; static relation_t *relation_relations; static int relation_nrelations; /* Local parsing functions */ static void ProcessNodeTags(TagList *tags,int64_t node_id,double latitude,double longitude,int mode); static void ProcessWayTags(TagList *tags,int64_t way_id,int mode); static void ProcessRelationTags(TagList *tags,int64_t relation_id,int mode); /*++++++++++++++++++++++++++++++++++++++ Initialise the OSM parser by initialising the local variables. NodesX *OSMNodes The data structure of nodes to fill in. WaysX *OSMWays The data structure of ways to fill in. RelationsX *OSMRelations The data structure of relations to fill in. ++++++++++++++++++++++++++++++++++++++*/ void InitialiseParser(NodesX *OSMNodes,WaysX *OSMWays,RelationsX *OSMRelations) { /* Copy the function parameters and initialise the variables */ nodes=OSMNodes; ways=OSMWays; relations=OSMRelations; way_nodes=(node_t*)malloc(256*sizeof(node_t)); relation_nodes =(node_t *)malloc(256*sizeof(node_t)); relation_ways =(way_t *)malloc(256*sizeof(way_t)); relation_relations=(relation_t*)malloc(256*sizeof(relation_t)); } /*++++++++++++++++++++++++++++++++++++++ Clean up the memory after parsing. ++++++++++++++++++++++++++++++++++++++*/ void CleanupParser(void) { /* Free the variables */ free(way_nodes); free(relation_nodes); free(relation_ways); free(relation_relations); } /*++++++++++++++++++++++++++++++++++++++ Add node references to a way. int64_t node_id The node ID to add or zero to clear the list. ++++++++++++++++++++++++++++++++++++++*/ void AddWayRefs(int64_t node_id) { if(node_id==0) way_nnodes=0; else { node_t id; if(way_nnodes && (way_nnodes%256)==0) way_nodes=(node_t*)realloc((void*)way_nodes,(way_nnodes+256)*sizeof(node_t)); id=(node_t)node_id; logassert((int64_t)id==node_id,"Node ID too large (change node_t to 64-bits?)"); /* check node id can be stored in node_t data type. */ way_nodes[way_nnodes++]=id; } } /*++++++++++++++++++++++++++++++++++++++ Add node, way or relation references to a relation. int64_t node_id The node ID to add or zero if it is not a node. int64_t way_id The way ID to add or zero if it is not a way. int64_t relation_id The relation ID to add or zero if it is not a relation. const char *role The role played by this referenced item or NULL. If all of node_id, way_id and relation_id are zero then the list is cleared. ++++++++++++++++++++++++++++++++++++++*/ void AddRelationRefs(int64_t node_id,int64_t way_id,int64_t relation_id,const char *role) { if(node_id==0 && way_id==0 && relation_id==0) { relation_nnodes=0; relation_nways=0; relation_nrelations=0; } else if(node_id!=0) { node_t id; id=(node_t)node_id; logassert((int64_t)id==node_id,"Node ID too large (change node_t to 64-bits?)"); /* check node id can be stored in node_t data type. */ if(relation_nnodes && (relation_nnodes%256)==0) relation_nodes=(node_t*)realloc((void*)relation_nodes,(relation_nnodes+256)*sizeof(node_t)); relation_nodes[relation_nnodes++]=id; } else if(way_id!=0) { way_t id; id=(way_t)way_id; logassert((int64_t)id==way_id,"Way ID too large (change way_t to 64-bits?)"); /* check way id can be stored in way_t data type. */ if(relation_nways && (relation_nways%256)==0) relation_ways=(way_t*)realloc((void*)relation_ways,(relation_nways+256)*sizeof(way_t)); relation_ways[relation_nways++]=id; } else /* if(relation_id!=0) */ { relation_t id; id=(relation_t)relation_id; logassert((int64_t)id==relation_id,"Relation ID too large (change relation_t to 64-bits?)"); /* check relation id can be stored in relation_t data type. */ if(relation_nrelations && (relation_nrelations%256)==0) relation_relations=(relation_t*)realloc((void*)relation_relations,(relation_nrelations+256)*sizeof(relation_t)); relation_relations[relation_nrelations++]=relation_id; } } /*++++++++++++++++++++++++++++++++++++++ Add a node after processing the tags associated with it. int64_t node_id The id of the node. double latitude The latitude of the node. double longitude The longitude of the node. int mode The mode of operation to take (create, modify, delete). TagList *raw_tags The accumulated set of tags for the node. ++++++++++++++++++++++++++++++++++++++*/ void AddNode(int64_t node_id,double latitude,double longitude,int mode,TagList *raw_tags) { TagList *processed_tags=ApplyNodeTaggingRules(raw_tags,node_id); ProcessNodeTags(processed_tags,node_id,latitude,longitude,mode); DeleteTagList(raw_tags); DeleteTagList(processed_tags); } /*++++++++++++++++++++++++++++++++++++++ Add a way after processing the tags associated with it. int64_t way_id The id of the way. int mode The mode of operation to take (create, modify, delete). TagList *raw_tags The accumulated set of tags for the node. ++++++++++++++++++++++++++++++++++++++*/ void AddWay(int64_t way_id,int mode,TagList *raw_tags) { TagList *processed_tags=ApplyWayTaggingRules(raw_tags,way_id); ProcessWayTags(processed_tags,way_id,mode); DeleteTagList(raw_tags); DeleteTagList(processed_tags); } /*++++++++++++++++++++++++++++++++++++++ Add a relation after processing the tags associated with it. int64_t relation_id The id of the relation. int mode The mode of operation to take (create, modify, delete). TagList *raw_tags The accumulated set of tags for the node. ++++++++++++++++++++++++++++++++++++++*/ void AddRelation(int64_t relation_id,int mode,TagList *raw_tags) { TagList *processed_tags=ApplyRelationTaggingRules(raw_tags,relation_id); ProcessRelationTags(processed_tags,relation_id,mode); DeleteTagList(raw_tags); DeleteTagList(processed_tags); } /*++++++++++++++++++++++++++++++++++++++ Process the tags associated with a node. TagList *tags The list of node tags. int64_t node_id The id of the node. double latitude The latitude of the node. double longitude The longitude of the node. int mode The mode of operation to take (create, modify, delete). ++++++++++++++++++++++++++++++++++++++*/ static void ProcessNodeTags(TagList *tags,int64_t node_id,double latitude,double longitude,int mode) { node_t id; int i; /* Convert id */ id=(node_t)node_id; logassert((int64_t)id==node_id,"Node ID too large (change node_t to 64-bits?)"); /* check node id can be stored in node_t data type. */ /* Parse the tags */ for(i=0;intags;i++) { char *k=tags->k[i]; if(!strcmp(k,"fixme-finder:keep")) { DeleteTag(tags,"fixme-finder:keep"); logerror("%s\n",logerror_node(id),StringifyTag(tags)); } } /* Store the node */ AppendNodeList(nodes,id,degrees_to_radians(latitude),degrees_to_radians(longitude),0,0); } /*++++++++++++++++++++++++++++++++++++++ Process the tags associated with a way. TagList *tags The list of way tags. int64_t way_id The id of the way. int mode The mode of operation to take (create, modify, delete). ++++++++++++++++++++++++++++++++++++++*/ static void ProcessWayTags(TagList *tags,int64_t way_id,int mode) { Way way={0}; way_t id; int i; /* Convert id */ id=(way_t)way_id; logassert((int64_t)id==way_id,"Way ID too large (change way_t to 64-bits?)"); /* check way id can be stored in way_t data type. */ /* Parse the tags */ for(i=0;intags;i++) { char *k=tags->k[i]; if(!strcmp(k,"fixme-finder:keep")) { DeleteTag(tags,"fixme-finder:keep"); logerror("%s\n",logerror_way(id),StringifyTag(tags)); } } /* Store the way */ AppendWayList(ways,id,&way,way_nodes,way_nnodes,""); } /*++++++++++++++++++++++++++++++++++++++ Process the tags associated with a relation. TagList *tags The list of relation tags. int64_t relation_id The id of the relation. int mode The mode of operation to take (create, modify, delete). ++++++++++++++++++++++++++++++++++++++*/ static void ProcessRelationTags(TagList *tags,int64_t relation_id,int mode) { relation_t id; int i; /* Convert id */ id=(relation_t)relation_id; logassert((int64_t)id==relation_id,"Relation ID too large (change relation_t to 64-bits?)"); /* check relation id can be stored in relation_t data type. */ /* Parse the tags */ for(i=0;intags;i++) { char *k=tags->k[i]; if(!strcmp(k,"fixme-finder:keep")) { DeleteTag(tags,"fixme-finder:keep"); logerror("%s\n",logerror_relation(id),StringifyTag(tags)); } } /* Store the relation */ AppendRouteRelationList(relations,id,0, relation_nodes,relation_nnodes, relation_ways,relation_nways, relation_relations,relation_nrelations); } routino-3.4.3/extras/find-fixme/fixme.xml 644 233 144 3547 12156135452 13573 0 routino-3.4.3/extras/find-fixme/fixme-dumper.c 644 233 144 26645 13327116556 14540 0/*************************************** Fixme file dumper. Part of the Routino routing software. ******************/ /****************** This file Copyright 2013-2015, 2018 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include #include #include "version.h" #include "types.h" #include "errorlog.h" #include "files.h" #include "xmlparse.h" /* Local functions */ static void OutputErrorLog(ErrorLogs *errorlogs,double latmin,double latmax,double lonmin,double lonmax); static void print_errorlog_visualiser(ErrorLogs *errorlogs,index_t item); static char *RFC822Date(time_t t); static void print_usage(int detail,const char *argerr,const char *err); /*++++++++++++++++++++++++++++++++++++++ The main program for the fixme dumper. ++++++++++++++++++++++++++++++++++++++*/ int main(int argc,char** argv) { ErrorLogs*OSMErrorLogs; int arg; char *dirname=NULL,*prefix=NULL; char *errorlogs_filename; int option_statistics=0; int option_visualiser=0,coordcount=0; double latmin=0,latmax=0,lonmin=0,lonmax=0; char *option_data=NULL; int option_dump_visualiser=0; /* Parse the command line arguments */ for(arg=1;argfile.number); printf("Number(geographical) =%9"Pindex_t"\n",OSMErrorLogs->file.number_geo); printf("Number(non-geographical)=%9"Pindex_t"\n",OSMErrorLogs->file.number_nongeo); printf("\n"); stat(errorlogs_filename,&buf); #if !SLIM printf("Total strings=%9zu Bytes\n",(size_t)buf.st_size-(OSMErrorLogs->strings-(char*)OSMErrorLogs->data)); #else printf("Total strings=%9zu Bytes\n",(size_t)buf.st_size-(size_t)OSMErrorLogs->stringsoffset); #endif } /* Print out internal data (in HTML format for the visualiser) */ if(option_dump_visualiser) { index_t item; if(!option_data) print_usage(0,NULL,"The --dump-visualiser option must have --data.\n"); for(arg=1;argfile.number) print_errorlog_visualiser(OSMErrorLogs,item); else printf("Invalid fixme number; minimum=0, maximum=%"Pindex_t".\n",OSMErrorLogs->file.number-1); } } exit(EXIT_SUCCESS); } /*++++++++++++++++++++++++++++++++++++++ Output the data for error logs within the region. ErrorLogs *errorlogs The set of error logs to use. double latmin The minimum latitude. double latmax The maximum latitude. double lonmin The minimum longitude. double lonmax The maximum longitude. ++++++++++++++++++++++++++++++++++++++*/ static void OutputErrorLog(ErrorLogs *errorlogs,double latmin,double latmax,double lonmin,double lonmax) { ll_bin_t latminbin=latlong_to_bin(radians_to_latlong(latmin))-errorlogs->file.latzero; ll_bin_t latmaxbin=latlong_to_bin(radians_to_latlong(latmax))-errorlogs->file.latzero; ll_bin_t lonminbin=latlong_to_bin(radians_to_latlong(lonmin))-errorlogs->file.lonzero; ll_bin_t lonmaxbin=latlong_to_bin(radians_to_latlong(lonmax))-errorlogs->file.lonzero; ll_bin_t latb,lonb; index_t i,index1,index2; /* Loop through all of the error logs. */ for(latb=latminbin;latb<=latmaxbin;latb++) for(lonb=lonminbin;lonb<=lonmaxbin;lonb++) { ll_bin2_t llbin=lonb*errorlogs->file.latbins+latb; if(llbin<0 || llbin>(errorlogs->file.latbins*errorlogs->file.lonbins)) continue; index1=LookupErrorLogOffset(errorlogs,llbin); index2=LookupErrorLogOffset(errorlogs,llbin+1); if(index2>errorlogs->file.number_geo) index2=errorlogs->file.number_geo; for(i=index1;ifile.latzero+latb)+off_to_latlong(errorlogp->latoffset)); double lon=latlong_to_radians(bin_to_latlong(errorlogs->file.lonzero+lonb)+off_to_latlong(errorlogp->lonoffset)); if(lat>latmin && latlonmin && lontm_wday]); strcpy(month,months[tim->tm_mon]); /* Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 */ sprintf(value,"%3s, %02d %3s %4d %02d:%02d:%02d %s", weekday, tim->tm_mday, month, tim->tm_year+1900, tim->tm_hour, tim->tm_min, tim->tm_sec, "GMT" ); return(value); } /*++++++++++++++++++++++++++++++++++++++ Print out the usage information. int detail The level of detail to use: -1 = just version number, 0 = low detail, 1 = full details. const char *argerr The argument that gave the error (if there is one). const char *err Other error message (if there is one). ++++++++++++++++++++++++++++++++++++++*/ static void print_usage(int detail,const char *argerr,const char *err) { if(detail<0) { fprintf(stderr, "Routino version " ROUTINO_VERSION " " ROUTINO_URL ".\n" ); } if(detail>=0) { fprintf(stderr, "Usage: fixme-dumper [--version]\n" " [--help]\n" " [--dir=]\n" " [--statistics]\n" " [--visualiser --latmin= --latmax=\n" " --lonmin= --lonmax=\n" " --data=]\n" " [--dump--visualiser [--data=fixme]]\n"); if(argerr) fprintf(stderr, "\n" "Error with command line parameter: %s\n",argerr); if(err) fprintf(stderr, "\n" "Error: %s\n",err); } if(detail==1) fprintf(stderr, "\n" "--version Print the version of Routino.\n" "\n" "--help Prints this information.\n" "\n" "--dir= The directory containing the fixme database.\n" "\n" "--statistics Print statistics about the fixme database.\n" "\n" "--visualiser Extract selected data from the fixme database:\n" " --latmin= * the minimum latitude (degrees N).\n" " --latmax= * the maximum latitude (degrees N).\n" " --lonmin= * the minimum longitude (degrees E).\n" " --lonmax= * the maximum longitude (degrees E).\n" " --data= * the type of data to select.\n" "\n" " can be selected from:\n" " fixmes = fixme tags extracted from the data.\n" "\n" "--dump-visualiser Dump selected contents of the database in HTML.\n" " --data=fixme * the fixme with the selected index.\n"); exit(!detail); } routino-3.4.3/extras/find-fixme/Makefile 644 233 144 12727 13712516240 13416 0# find-fixme Makefile # # Part of the Routino routing software. # # This file Copyright 2013-2018, 2020 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../../Makefile.conf # Web file paths WEBBINDIR=web/bin WEBDATADIR=web/data WEBWWWDIR=web/www # Compilation targets DEPDIR=.deps C=$(wildcard *.c) D=$(wildcard $(DEPDIR)/*.d) ROUTINO_SRC=../../src ROUTINO_WEBWWWDIR=../../web/www/routino ROUTINO_DOCDIR=../../doc/html EXE=fixme-finder$(.EXE) fixme-finder-slim$(.EXE) fixme-dumper$(.EXE) fixme-dumper-slim$(.EXE) DATA=fixme.xml WWW_COPY=page-elements.css page-elements.js maplayout.css mapprops.js maploader.js DOC_COPY=style.css ######## all: all-bin all-data all-www all-bin: $(EXE) @[ -d $(WEBBINDIR) ] || mkdir -p $(WEBBINDIR) @for file in $(EXE); do \ if [ ! -f $(WEBBINDIR)/$$file ] || [ $$file -nt $(WEBBINDIR)/$$file ]; then \ echo cp $$file $(WEBBINDIR) ;\ cp -f $$file $(WEBBINDIR) ;\ fi ;\ done all-data: @[ -d $(WEBDATADIR) ] || mkdir -p $(WEBDATADIR) @for file in $(DATA); do \ if [ ! -f $(WEBDATADIR)/$$file ] || [ $$file -nt $(WEBDATADIR)/$$file ]; then \ echo cp $$file $(WEBDATADIR) ;\ cp -f $$file $(WEBDATADIR) ;\ fi ;\ done all-www: @for file in $(WWW_COPY); do \ if [ ! -f $(WEBWWWDIR)/$$file ] || [ $(ROUTINO_WEBWWWDIR)/$$file -nt $(WEBWWWDIR)/$$file ]; then \ echo cp $(ROUTINO_WEBWWWDIR)/$$file $(WEBWWWDIR) ;\ cp -f $(ROUTINO_WEBWWWDIR)/$$file $(WEBWWWDIR) ;\ fi ;\ done @for file in $(DOC_COPY); do \ if [ ! -f $(WEBWWWDIR)/$$file ] || [ $(ROUTINO_DOCDIR)/$$file -nt $(WEBWWWDIR)/$$file ]; then \ echo cp $(ROUTINO_DOCDIR)/$$file $(WEBWWWDIR) ;\ cp -f $(ROUTINO_DOCDIR)/$$file $(WEBWWWDIR) ;\ fi ;\ done ######## FIXME_FINDER_OBJ=fixme-finder.o osmparser.o \ $(ROUTINO_SRC)/nodesx.o $(ROUTINO_SRC)/segmentsx.o $(ROUTINO_SRC)/waysx.o $(ROUTINO_SRC)/relationsx.o \ $(ROUTINO_SRC)/ways.o $(ROUTINO_SRC)/types.o \ $(ROUTINO_SRC)/files.o $(ROUTINO_SRC)/logging.o $(ROUTINO_SRC)/logerror.o $(ROUTINO_SRC)/errorlogx.o \ $(ROUTINO_SRC)/sorting.o \ $(ROUTINO_SRC)/xmlparse.o $(ROUTINO_SRC)/tagging.o \ $(ROUTINO_SRC)/uncompress.o $(ROUTINO_SRC)/osmxmlparse.o $(ROUTINO_SRC)/osmpbfparse.o $(ROUTINO_SRC)/osmo5mparse.o ifeq ($(HOST),MINGW) FIXME_FINDER_OBJ+=$(ROUTINO_SRC)/mman-win32.o endif fixme-finder$(.EXE) : $(FIXME_FINDER_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## FIXME_FINDER_SLIM_OBJ=fixme-finder-slim.o osmparser.o \ $(ROUTINO_SRC)/nodesx-slim.o $(ROUTINO_SRC)/segmentsx-slim.o $(ROUTINO_SRC)/waysx-slim.o $(ROUTINO_SRC)/relationsx-slim.o \ $(ROUTINO_SRC)/ways.o $(ROUTINO_SRC)/types.o \ $(ROUTINO_SRC)/files.o $(ROUTINO_SRC)/logging.o $(ROUTINO_SRC)/logerror-slim.o $(ROUTINO_SRC)/errorlogx-slim.o \ $(ROUTINO_SRC)/sorting.o \ $(ROUTINO_SRC)/xmlparse.o $(ROUTINO_SRC)/tagging.o \ $(ROUTINO_SRC)/uncompress.o $(ROUTINO_SRC)/osmxmlparse.o $(ROUTINO_SRC)/osmpbfparse.o $(ROUTINO_SRC)/osmo5mparse.o ifeq ($(HOST),MINGW) FIXME_FINDER_SLIM_OBJ+=$(ROUTINO_SRC)/mman-win32.o endif fixme-finder-slim$(.EXE) : $(FIXME_FINDER_SLIM_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## FIXME_DUMPER_OBJ=fixme-dumper.o \ $(ROUTINO_SRC)/errorlog.o \ $(ROUTINO_SRC)/files.o $(ROUTINO_SRC)/logging.o $(ROUTINO_SRC)/xmlparse.o ifeq ($(HOST),MINGW) FIXME_DUMPER_OBJ+=$(ROUTINO_SRC)/mman-win32.o endif fixme-dumper$(.EXE) : $(FIXME_DUMPER_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## FIXME_DUMPER_SLIM_OBJ=fixme-dumper-slim.o \ $(ROUTINO_SRC)/errorlog-slim.o \ $(ROUTINO_SRC)/files.o $(ROUTINO_SRC)/logging.o $(ROUTINO_SRC)/xmlparse.o ifeq ($(HOST),MINGW) FIXME_DUMPER_SLIM_OBJ+=$(ROUTINO_SRC)/mman-win32.o endif fixme-dumper-slim$(.EXE) : $(FIXME_DUMPER_SLIM_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## $(ROUTINO_SRC)/%.o : cd $(ROUTINO_SRC) && $(MAKE) $(notdir $@) $(ROUTINO_SRC)/%-slim.o : cd $(ROUTINO_SRC) && $(MAKE) $(notdir $@) %.o : %.c -@[ -d $(DEPDIR) ] || mkdir $(DEPDIR) || true $(CC) -c $(CFLAGS) -DSLIM=0 -I$(ROUTINO_SRC) $< -o $@ -MMD -MP -MF $(addprefix $(DEPDIR)/,$(addsuffix .d,$(basename $@))) %-slim.o : %.c -@[ -d $(DEPDIR) ] || mkdir $(DEPDIR) || true $(CC) -c $(CFLAGS) -DSLIM=1 -I$(ROUTINO_SRC) $< -o $@ -MMD -MP -MF $(addprefix $(DEPDIR)/,$(addsuffix .d,$(basename $@))) ######## test: ######## install: ######## clean: rm -f *~ rm -f *.o cd $(WEBBINDIR) && rm -f $(EXE) cd $(WEBDATADIR) && rm -f $(DATA) cd $(WEBWWWDIR) && rm -f $(WWW_COPY) cd $(WEBWWWDIR) && rm -f $(DOC_COPY) rm -f $(EXE) rm -f $(D) rm -fr $(DEPDIR) rm -f core rm -f *.gcda *.gcno *.gcov gmon.out ######## distclean: clean ######## include $(D) ######## .PHONY:: all test install clean distclean .PHONY:: all-bin all-data all-www routino-3.4.3/extras/find-fixme/README.txt 644 233 144 10537 14437671700 13461 0 Find and Display FIXME tags =========================== The "fixme" tag is often used in OSM data to mark an item whose details are not completely known - as a reminder or request for somebody to check it. Since Routino can now generate a map of tagging problems that it finds it is easy to extend this to finding all "fixme" tags. The files in this directory provide a complete set of executables and web pages for extracting and displaying all items with "fixme" tags on a map. Editing fixme.xml and changing the rules for selecting tags allows for creating custom databases to display items containing any desired tag(s). fixme-finder ------------ This program is a modified version of the Routino planetsplitter program and can be used on an OSM file to extract the fixme tags and generate a database of them. Usage: fixme-finder [--version] [--help] [--dir=] [--sort-ram-size=] [--sort-threads=] [--tmpdir=] [--tagging=] [--loggable] [--logtime] [--logmemory] [ ... | ... | ... | ... | ... | ...] --version Print the version of Routino. --help Prints this information. --dir= The directory containing the fixme database. --sort-ram-size= The amount of RAM (in MB) to use for data sorting (defaults to 1024MB otherwise.) --sort-threads= The number of threads to use for data sorting. --tmpdir= The directory name for temporary files. (defaults to the '--dir' option directory.) --tagging= The name of the XML file containing the tagging rules (defaults to 'fixme.xml' with '--dir' option) --loggable Print progress messages suitable for logging to file. --logtime Print the elapsed time for each processing step. --logmemory Print the max allocated/mapped memory for each step. , , The name(s) of the file(s) to read and parse. Filenames ending '.pbf' read as PBF, filenames ending '.o5m' read as O5M, others as XML. Filenames ending '.bz2' will be bzip2 uncompressed (if bzip2 support compiled in). Filenames ending '.gz' will be gzip uncompressed (if gzip support compiled in). Filenames ending '.xz' will be xz uncompressed (if xz support compiled in). fixme-dumper ------------ This program is a modified version of the Routino filedumper program and is used by the web page CGI to display the information on a map. Usage: fixme-dumper [--version] [--help] [--dir=] [--statistics] [--visualiser --latmin= --latmax= --lonmin= --lonmax= --data=] [--dump--visualiser [--data=fixme]] --version Print the version of Routino. --help Prints this information. --dir= The directory containing the fixme database. --statistics Print statistics about the fixme database. --visualiser Extract selected data from the fixme database: --latmin= * the minimum latitude (degrees N). --latmax= * the maximum latitude (degrees N). --lonmin= * the minimum longitude (degrees E). --lonmax= * the maximum longitude (degrees E). --data= * the type of data to select. can be selected from: fixmes = fixme tags extracted from the data. --dump-visualiser Dump selected contents of the database in HTML. --data=fixme * the fixme with the selected index. routino-3.4.3/extras/plot-time/ 40755 233 144 0 14434674723 11612 5routino-3.4.3/extras/plot-time/plot-planetsplitter-memory.pl 755 233 144 5416 14242154252 17513 0#!/usr/bin/perl # # Routino execution log plotter. # # Part of the Routino routing software. # # This file Copyright 2013-2014, 2022 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Check the command line my $type="RAM"; $type="Disk" if(length(@ARGV)>0 && $ARGV[0] eq "--disk"); # Read the planetsplitter log file open(SECTION ,">gnuplot.section.tmp"); open(SUBSECTION,">gnuplot.subsection.tmp"); my $count=1; my $startcount=0; my $sectionmemory=0; my $totalmemory=0; while() { s%\r*\n%%; next if(! $_); next if(m%^=%); if( m%^(\[[ 0-9:.]+\] *)?\[ *([0-9]+), *([0-9]+) MB\] *([^:]+)% && ! m%Finish Program$% ) { my $memory; my $description=$4; if($type eq "RAM") { $memory=$2; } else { $memory=$3; } print SUBSECTION "$count $memory \"$description\"\n"; $sectionmemory=$memory if($memory>$sectionmemory); $totalmemory=$memory if($memory>$totalmemory); } else { if($startcount>0) { my $boxcentre=($count+$startcount+0.5)/2; my $boxwidth=$count-$startcount-1; print SECTION "$boxcentre $sectionmemory $boxwidth\n"; } $startcount=$count-0.5; $sectionmemory=0; } $count++; } close(SECTION); close(SUBSECTION); # Plot using gnuplot open(GNUPLOT,"|gnuplot"); print GNUPLOT <. # use strict; # Read the planetsplitter log file open(SECTION ,">gnuplot.section.tmp"); open(SUBSECTION,">gnuplot.subsection.tmp"); my $count=1; my $startcount=0; my $sectiontime=0; my $totaltime=0; while() { s%\r*\n%%; next if(! $_); next if(m%^=%); if( m%^\[ *([0-9]+):([0-9.]+)\]( \[[ 0-9,]+ MB\])? *([^:]+)% && ! m%Finish Program$% ) { my $time=(60.0*$1)+$2; my $description=$4; print SUBSECTION "$count $time \"$description\"\n"; $sectiontime+=$time; $totaltime+=$time; } else { if($startcount>0) { my $boxcentre=($count+$startcount+0.5)/2; my $boxwidth=$count-$startcount-1; print SECTION "$boxcentre $sectiontime $boxwidth\n"; } $startcount=$count-0.5; $sectiontime=0; } $count++; } close(SECTION); close(SUBSECTION); $totaltime = sprintf("%.1f",$totaltime); # Plot using gnuplot open(GNUPLOT,"|gnuplot"); print GNUPLOT < planetsplitter.log plot-planetsplitter-time.pl < planetsplitter.log This will generate a file called planetsplitter.png that contains the graph of the execution time. plot-planetsplitter-memory.pl ----------------------------- Example usage: planetsplitter --loggable --logmemory ... > planetsplitter.log plot-planetsplitter-memory.pl --ram < planetsplitter.log OR plot-planetsplitter-memory.pl --disk < planetsplitter.log This will generate a file called planetsplitter.png that contains the graph of the RAM or memory mapped disk usage. routino-3.4.3/extras/statistics/ 40755 233 144 0 15003125373 12053 5routino-3.4.3/extras/statistics/create-image.pl 755 233 144 13720 12660125354 15002 0#!/usr/bin/perl # # OSM data statistics Perl script # # Part of the Routino routing software. # # This file Copyright 2008-2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use Graphics::Magick; # Range of tiles and zoom - PARAMETERS THAT CAN BE EDITED @xrange=(120..129); # At zoom level 8 @yrange=(73..87); # At zoom level 8 $zbase=6; # Zoom level of images in basemap. $z=13; # Granularity of data points. # Base image dimensions $basescale=2**(8-$zbase); $width =(1+$#xrange)*256/$basescale; $height=(1+$#yrange)*256/$basescale; # Chosen zoom level $scale=2**(8-$z); $tilesize=256*$scale/$basescale; # Get the command line arguments $prefix=$ARGV[0]; $name =$ARGV[1]; $number=$ARGV[2]+0; # Graph annotations $annotation{highway} ="'highway=$name'"; $annotation{property} ="$name property"; $annotation{speed} ="'maxspeed=$name'"; $annotation{transport}="$name allowed"; # Read in the data %density=(); while() { ($x,$y,@distances)=split(/ +/); $distance=$distances[$number]; if($distance > 0) { $area=&xy_area($z,$x,$y); $density{$x,$y}=($distance/$area); } } # Find the maximum value $max=0; foreach $xy (keys %density) { $density=$density{$xy}; $max=$density if($density>$max); } $max=500.0*int(($max+499)/500); $max=500.0 if($max<500); # Create the overlay image $colour0=&colour(0); $image=Graphics::Magick->new(size => "${width}x${height}"); $image->ReadImage("xc:$colour0"); foreach $xy (keys %density) { ($x,$y)=split($;,$xy); $colour=&colour($density{$x,$y}/$max); $x1=(($x*$scale)-$xrange[0])*256/$basescale; $y1=(($y*$scale)-$yrange[0])*256/$basescale; if($tilesize==1) { $image->Draw(primitive => 'point', points => "$x1,$y1", fill => $colour, antialias => 'false'); } else { $x2=$x1+$tilesize-1; $y2=$y1+$tilesize-1; $image->Draw(primitive => 'rectangle', points => "$x1,$y1 $x2,$y2", strokewidth => 0, stroke => $colour, fill => $colour, antialias => 'false'); } } # Create the scale indicator $indicator=Graphics::Magick->new(size => "${width}x40"); $indicator->ReadImage('xc:white'); foreach $v (0..($width-2*5)) { $x=$v+5; $y1=12; $y2=23; $density=$v/($width-2*5); $indicator->Draw(primitive => 'line', points => "$x,$y1,$x,$y2", stroke => &colour($density), antialias => 'false'); } $indicator->Annotate(text => "0", font => 'Helvetica', pointsize => '12', style => Normal, fill => 'black', x => 5, y => 11, align => Left); foreach $frac (0.25,0.5,0.75) { $indicator->Annotate(text => $max*$frac, font => 'Helvetica', pointsize => '12', style => Normal, fill => 'black', x => 5+($width-2*5)*$frac, y => 11, align => Center); } $indicator->Annotate(text => $max, font => 'Helvetica', pointsize => '12', style => Normal, fill => 'black', x => $width-5, y => 11, align => Right); $indicator->Annotate(text => "Highway density (metres/square km) for $annotation{$prefix} per zoom $z tile", font => 'Helvetica', pointsize => '14', style => Normal, fill => 'black', x => $width/2, y => 36, align => Center); # Create the combined images $base=Graphics::Magick->new; $base->ReadImage("basemap.png"); $base->Composite(image => $image, compose => Dissolve, x => 0, y => 0, opacity => 50); $final=Graphics::Magick->new(size => ($base->Get('width')+2)."x".($base->Get('height')+$indicator->Get('height')+3)); $final->ReadImage('xc:black'); $final->Composite(image => $base , compose => Over, x => 1, y => 1 ); $final->Composite(image => $indicator, compose => Over, x => 1, y => $base->Get('height')+2); undef $base; undef $image; undef $indicator; # Write out the images print "Writing '$prefix-$name.png'\n"; $final->Write("$prefix-$name.png"); $final->Resize(width => $width/4, height => $final->Get('height')/4); $final->Write("$prefix-$name-small.png"); undef $final; # # Subroutines # sub xy_ll_rad { my($zoom,$x,$y)=@_; $PI=3.14159265358979323846; my($longitude)=$PI*(($x * (2**(1-$zoom)))-1); my($latitude)=($PI/2)*((4/$PI)*atan2(exp($PI*(1-($y * (2**(1-$zoom))))),1) - 1); return ($longitude,$latitude); } sub xy_area { my($zoom,$x,$y)=@_; $RADIUS=6378.137; my($width,$height); if(defined $width{$y}) { $width=$width{$y}; } else { my($lon1,$lat1)=&xy_ll_rad($z,$x ,$y); my($lon2,$lat2)=&xy_ll_rad($z,$x+1,$y); $width=$RADIUS*($lon2-$lon1)*cos($lat1); $width{$y}=$width; } if(defined $height{$y}) { $height=$height{$y}; } else { my($lon1,$lat1)=&xy_ll_rad($z,$x,$y ); my($lon2,$lat2)=&xy_ll_rad($z,$x,$y+1); $height=$RADIUS*($lat1-$lat2); $height{$y}=$height; } return $width*$height; } sub colour { my($density)=@_; $density=sqrt($density); $density=0 if($density<0); $density=1 if($density>1); my($r,$g,$b); if($density<0.5) { $r=0; $g=int(255*(2*$density)); $b=int(255*(1-2*$density)); } else { $density-=0.5; $r=int(255*(2*$density)); $g=int(255*(1-2*$density)); $b=0; } sprintf("#%02x%02x%02x",$r,$g,$b); } routino-3.4.3/extras/statistics/dumper.c 644 233 144 34011 13160524366 13555 0/*************************************** Data extractor and file dumper. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2017 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include #include #include #include "types.h" #include "functions.h" #include "nodes.h" #include "segments.h" #include "ways.h" #include "sorting.h" /* Global variables (required to link sorting.c) */ /*+ The command line '--tmpdir' option or its default value. +*/ char *option_tmpdirname=NULL; /*+ The amount of RAM to use for filesorting. +*/ size_t option_filesort_ramsize=0; /*+ The number of threads to use for filesorting. +*/ int option_filesort_threads=1; /* Local types */ typedef struct _crossing { double f; uint32_t x; uint32_t y; } crossing; /* Local functions */ static void ll_xy_rad(int zoom,double longitude,double latitude,double *x,double *y); static int compare_crossing(crossing *a,crossing *b); /*++++++++++++++++++++++++++++++++++++++ The main function. ++++++++++++++++++++++++++++++++++++++*/ int main(int argc,char** argv) { Nodes *OSMNodes; Segments *OSMSegments; Ways *OSMWays; int arg; char *dirname=NULL,*prefix=NULL; char *nodes_filename,*segments_filename,*ways_filename; index_t item; crossing *crossings=(crossing*)malloc(128*sizeof(crossing)); crossing **crossingsp=(crossing**)malloc(128*sizeof(crossing*)); int crossing_alloc=128; float ***highways,***transports,***properties,***speeds; double lat,lon,x,y; uint32_t xmin,ymin,xmax,ymax,xt,yt; int zoom=13; int speed_count=0; double *speed_selection=NULL; /* Parse the command line arguments */ for(arg=1;arg] [--prefix=]\n" " [--speed=,,...,]" " [--zoom=<10-16>]\n"); return(1); } } /* Load in the data */ OSMNodes=LoadNodeList(nodes_filename=FileName(dirname,prefix,"nodes.mem")); if(!OSMNodes) { fprintf(stderr,"Cannot open nodes file '%s'.\n",nodes_filename); return(1); } OSMSegments=LoadSegmentList(segments_filename=FileName(dirname,prefix,"segments.mem")); if(!OSMSegments) { fprintf(stderr,"Cannot open segments file '%s'.\n",segments_filename); return(1); } OSMWays=LoadWayList(ways_filename=FileName(dirname,prefix,"ways.mem")); if(!OSMWays) { fprintf(stderr,"Cannot open ways file '%s'.\n",ways_filename); return(1); } /* Allocate the arrays */ lat=latlong_to_radians(bin_to_latlong(OSMNodes->file.latzero)); lon=latlong_to_radians(bin_to_latlong(OSMNodes->file.lonzero)); ll_xy_rad(zoom,lon,lat,&x,&y); xmin=(uint32_t)floor(x); ymax=(uint32_t)floor(y); lat=latlong_to_radians(bin_to_latlong(OSMNodes->file.latzero+OSMNodes->file.latbins)); lon=latlong_to_radians(bin_to_latlong(OSMNodes->file.lonzero+OSMNodes->file.lonbins)); ll_xy_rad(zoom,lon,lat,&x,&y); xmax=(uint32_t)floor(x); ymin=(uint32_t)floor(y); highways =malloc(sizeof(highways[0]) *(xmax-xmin+1)); transports=malloc(sizeof(transports[0])*(xmax-xmin+1)); properties=malloc(sizeof(properties[0])*(xmax-xmin+1)); speeds =malloc(sizeof(speeds[0]) *(xmax-xmin+1)); for(xt=xmin;xt<=xmax;xt++) { highways[xt-xmin] =malloc(sizeof(highways[0][0]) *(ymax-ymin+1)); transports[xt-xmin]=malloc(sizeof(transports[0][0])*(ymax-ymin+1)); properties[xt-xmin]=malloc(sizeof(properties[0][0])*(ymax-ymin+1)); speeds[xt-xmin] =malloc(sizeof(speeds[0][0]) *(ymax-ymin+1)); for(yt=ymin;yt<=ymax;yt++) { highways[xt-xmin][yt-ymin] =calloc((Highway_Count-1) ,sizeof(highways[0][0][0]) ); transports[xt-xmin][yt-ymin]=calloc((Transport_Count-1),sizeof(transports[0][0][0])); properties[xt-xmin][yt-ymin]=calloc((Property_Count+1) ,sizeof(properties[0][0][0])); speeds[xt-xmin][yt-ymin] =calloc((speed_count) ,sizeof(speeds[0][0][0]) ); } } /* Dump the segments out with lat/long in tile units. */ for(item=0;itemfile.number;item++) { Segment *segment=LookupSegment(OSMSegments,item,1); if(IsNormalSegment(segment)) { double latitude1,longitude1,latitude2,longitude2; double x1,y1,x2,y2; uint32_t xi1,yi1,xi2,yi2; Way *way; double distance; /* Get the coordinates */ distance=1000*distance_to_km(DISTANCE(segment->distance)); GetLatLong(OSMNodes,segment->node1,NULL,&latitude1,&longitude1); GetLatLong(OSMNodes,segment->node2,NULL,&latitude2,&longitude2); way=LookupWay(OSMWays,segment->way,1); ll_xy_rad(zoom,longitude1,latitude1,&x1,&y1); ll_xy_rad(zoom,longitude2,latitude2,&x2,&y2); /* Map to tiles and find tile crossings */ xi1=(uint32_t)floor(x1); yi1=(uint32_t)floor(y1); xi2=(uint32_t)floor(x2); yi2=(uint32_t)floor(y2); if(xi1==xi2 && yi1==yi2) { int j; for(j=1;jtype) == j) highways[xi1-xmin][yi1-ymin][j-1]+=distance; for(j=1;jallow & TRANSPORTS(j)) transports[xi1-xmin][yi1-ymin][j-1]+=distance; for(j=1;jprops & PROPERTIES(j)) properties[xi1-xmin][yi1-ymin][j-1]+=distance; if(way->type & Highway_CycleBothWays) properties[xi1-xmin][yi1-ymin][Property_Count-1]+=distance; if(way->type & Highway_OneWay) properties[xi1-xmin][yi1-ymin][Property_Count]+=distance; for(j=0;jspeed) == speed_selection[j]) speeds[xi1-xmin][yi1-ymin][j]+=distance; } else { int crossing_count=2,i; double lastf; uint32_t lastx,lasty; crossings[0].f=0.0; crossings[0].x=xi1; crossings[0].y=yi1; crossings[1].f=1.0; crossings[1].x=xi2; crossings[1].y=yi2; /* Find X boundaries */ if(xi1!=xi2) { uint32_t x,minx,maxx; if(xi1f; lastx=crossingsp[0]->x; lasty=crossingsp[0]->y; for(i=1;if; uint32_t xi,x=crossingsp[i]->x; uint32_t yi,y=crossingsp[i]->y; double d; int j; xi=x; if(lastxtype) == j) highways[xi-xmin][yi-ymin][j-1]+=d; for(j=1;jallow & TRANSPORTS(j)) transports[xi-xmin][yi-ymin][j-1]+=d; for(j=1;jprops & PROPERTIES(j)) properties[xi-xmin][yi-ymin][j-1]+=d; if(way->type & Highway_CycleBothWays) properties[xi1-xmin][yi1-ymin][Property_Count-1]+=distance; if(way->type & Highway_OneWay) properties[xi1-xmin][yi1-ymin][Property_Count]+=distance; for(j=0;jspeed) == speed_selection[j]) speeds[xi1-xmin][yi1-ymin][j]+=distance; lastf=f; lastx=x; lasty=y; } } } } /* Print the results */ for(xt=xmin;xt<=xmax;xt++) { for(yt=ymin;yt<=ymax;yt++) { int do_highways=0,do_transports=0,do_properties=0; int j; for(j=1;j 0) do_highways++; for(j=1;j 0) do_transports++; for(j=1;j 0) do_properties++; if(do_highways || do_transports || do_properties) { printf("%d %d",xt,yt); for(j=1;jf; double bd=b->f; if(adbd) return(1); else return(-FILESORT_PRESERVE_ORDER(a,b)); /* latest version first */ } /*++++++++++++++++++++++++++++++++++++++ Convert latitude and longitude into tile coordinates. int zoom The zoom level. double longitude The latitude of the point. double latitude The longitude of the point. double *x The tile X number (including fractional part). double *y The tile Y number (including fractional part). ++++++++++++++++++++++++++++++++++++++*/ static void ll_xy_rad(int zoom,double longitude,double latitude,double *x,double *y) { *x=longitude/M_PI+1; *y=1-log(tan(latitude/2+(M_PI/4)))/M_PI; *x/=pow(2,1-zoom); *y/=pow(2,1-zoom); } routino-3.4.3/extras/statistics/Makefile 644 233 144 5010 13712516522 13530 0# database-stats Makefile # # Part of the Routino routing software. # # This file Copyright 2008-2018, 2020 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../../Makefile.conf # Compilation targets DEPDIR=.deps C=$(wildcard *.c) D=$(wildcard $(DEPDIR)/*.d) ROUTINO_SRC=../../src EXE=dumper$(.EXE) dumper-slim$(.EXE) ######## all : $(EXE) ######## DUMPER_OBJ=dumper.o \ $(ROUTINO_SRC)/nodes.o $(ROUTINO_SRC)/segments.o $(ROUTINO_SRC)/ways.o \ $(ROUTINO_SRC)/files.o $(ROUTINO_SRC)/fakes.o $(ROUTINO_SRC)/logging.o \ $(ROUTINO_SRC)/sorting.o ifeq ($(HOST),MINGW) DUMPER_OBJ+=$(ROUTINO_SRC)/mman-win32.o endif dumper$(.EXE) : $(DUMPER_OBJ) $(LD) $^ -o $@ $(LDFLAGS) DUMPER_SLIM_OBJ=dumper-slim.o \ $(ROUTINO_SRC)/nodes-slim.o $(ROUTINO_SRC)/segments-slim.o $(ROUTINO_SRC)/ways-slim.o \ $(ROUTINO_SRC)/files.o $(ROUTINO_SRC)/fakes.o $(ROUTINO_SRC)/logging.o \ $(ROUTINO_SRC)/sorting.o ifeq ($(HOST),MINGW) DUMPER_SLIM_OBJ+=$(ROUTINO_SRC)/mman-win32.o endif dumper-slim$(.EXE) : $(DUMPER_SLIM_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## $(ROUTINO_SRC)/%.o : cd $(ROUTINO_SRC) && $(MAKE) $(notdir $@) $(ROUTINO_SRC)/%-slim.o : cd $(ROUTINO_SRC) && $(MAKE) $(notdir $@) %.o : %.c -@[ -d $(DEPDIR) ] || mkdir $(DEPDIR) || true $(CC) -c $(CFLAGS) -DSLIM=0 -I$(ROUTINO_SRC) $< -o $@ -MMD -MP -MF $(addprefix $(DEPDIR)/,$(addsuffix .d,$(basename $@))) %-slim.o : %.c -@[ -d $(DEPDIR) ] || mkdir $(DEPDIR) || true $(CC) -c $(CFLAGS) -DSLIM=1 -I$(ROUTINO_SRC) $< -o $@ -MMD -MP -MF $(addprefix $(DEPDIR)/,$(addsuffix .d,$(basename $@))) ######## test: ######## install: ######## clean: rm -f *~ rm -f *.o rm -f $(EXE) rm -f $(D) rm -fr $(DEPDIR) rm -f core rm -f *.gcda *.gcno *.gcov gmon.out rm -f *.png ######## distclean: clean ######## include $(D) ######## .PHONY:: all test install clean distclean routino-3.4.3/extras/statistics/update.sh 755 233 144 6374 13347430563 13733 0#!/bin/sh # # OSM data statistics shell script # # Part of the Routino routing software. # # This file Copyright 2008-2016, 2018 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # set -e trap "rm binned.dat" 0 # Database location and zoom - PARAMETERS THAT CAN BE EDITED database_dir="../../web/data" zoom=13 # Run the dumper ./dumper --speed=32,48,64,80,96,112 --dir=$database_dir --zoom=$zoom > binned.dat # Generate the base map ./create-basemap.pl # Generate the highway outputs ./create-image.pl highway motorway 0 < binned.dat ./create-image.pl highway trunk 1 < binned.dat ./create-image.pl highway primary 2 < binned.dat ./create-image.pl highway secondary 3 < binned.dat ./create-image.pl highway tertiary 4 < binned.dat ./create-image.pl highway unclassified 5 < binned.dat ./create-image.pl highway residential 6 < binned.dat ./create-image.pl highway service 7 < binned.dat ./create-image.pl highway track 8 < binned.dat ./create-image.pl highway cycleway 9 < binned.dat ./create-image.pl highway path 10 < binned.dat ./create-image.pl highway steps 11 < binned.dat ./create-image.pl highway ferry 12 < binned.dat # Generate the transport outputs ./create-image.pl transport foot 13 < binned.dat ./create-image.pl transport horse 14 < binned.dat ./create-image.pl transport bicycle 15 < binned.dat ./create-image.pl transport wheelchair 16 < binned.dat ./create-image.pl transport moped 17 < binned.dat ./create-image.pl transport motorcycle 18 < binned.dat ./create-image.pl transport motorcar 19 < binned.dat ./create-image.pl transport goods 20 < binned.dat ./create-image.pl transport HGV 21 < binned.dat ./create-image.pl transport PSV 22 < binned.dat # Create the property outputs ./create-image.pl property paved 23 < binned.dat ./create-image.pl property multilane 24 < binned.dat ./create-image.pl property bridge 25 < binned.dat ./create-image.pl property tunnel 26 < binned.dat ./create-image.pl property foot-route 27 < binned.dat ./create-image.pl property bicycle-route 28 < binned.dat ./create-image.pl property cycle-both-ways 29 < binned.dat ./create-image.pl property oneway 30 < binned.dat # Generate the speed limit outputs ./create-image.pl speed 20mph 31 < binned.dat ./create-image.pl speed 30mph 32 < binned.dat ./create-image.pl speed 40mph 33 < binned.dat ./create-image.pl speed 50mph 34 < binned.dat ./create-image.pl speed 60mph 35 < binned.dat ./create-image.pl speed 70mph 36 < binned.dat # Tidy up and exit # This is handled by the trap at the top # #rm binned.dat routino-3.4.3/extras/statistics/README.txt 644 233 144 2207 12660125417 13573 0 Database Statistics =================== The Routino database is a concentrated source of information about the highways in the selected region. By stepping through the database the properties of each segment can be checked and recorded. The scripts and program here group the data into regions that correspond to the standard OSM tiles (default of a zoom 13 tile). The highway properties are written out to a text file indexed by tile position. A separate Perl script is provided to create "heatmap" images from this data which is overlayed on a base map created from standard OSM tiles. The Perl scripts 'create-basemap.pl' and 'create-image.pl' will need modifying to set the range of coordinates (quoted as x and y values for zoom level 8 tiles) to plot and the zoom level of the basemap and data granularity. The shell script 'update.sh' will need modifying to set the location of the Routino database and the zoom level of the data analysis. The script 'update.sh' will perform all the actions to dump the database into a text file, create the basemap and plot the data over the top. routino-3.4.3/extras/statistics/create-basemap.pl 755 233 144 4301 12660124550 15300 0#!/usr/bin/perl # # Base map creation Perl script # # Part of the Routino routing software. # # This file Copyright 2008-2016 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use Graphics::Magick; # Range and source of tiles - PARAMETERS THAT CAN BE EDITED $baseurl='http://a.tile.openstreetmap.org/${z}/${x}/${y}.png'; # URL of tile server. @xrange=(120..129); # At zoom level 8 @yrange=(73..87); # At zoom level 8 $zbase=6; # Zoom level of images to use. # Base image dimensions $basescale=2**(8-$zbase); $tilesize=256/$basescale; $width =(1+$#xrange)*$tilesize; $height=(1+$#yrange)*$tilesize; # Create a new base image $image=Graphics::Magick->new(size => "${width}x${height}"); $image->ReadImage('xc:white'); $xb=-1; foreach $x (@xrange) { $xbase=int($x/$basescale); next if($xbase==$xb); $yb=-1; foreach $y (@yrange) { $ybase=int($y/$basescale); next if($ybase==$yb); $tile=Graphics::Magick->new; $url=$baseurl; $url =~ s%\$\{x\}%$xbase%; $url =~ s%\$\{y\}%$ybase%; $url =~ s%\$\{z\}%$zbase%; `wget $url -O ${xbase}_${ybase}.png > /dev/null 2>&1`; $tile->Read("${xbase}_${ybase}.png"); unlink "${xbase}_${ybase}.png"; $xpos=(($xbase*$basescale)-$xrange[0])*$tilesize; $ypos=(($ybase*$basescale)-$yrange[0])*$tilesize; $image->Composite(image => $tile, compose => Over, x => $xpos, y => $ypos); undef $tile; $yb=$ybase; } $xb=$xbase; } print "Writing 'basemap.png'\n"; $image->Write("basemap.png"); undef $image; routino-3.4.3/extras/errorlog/ 40755 233 144 0 14471174347 11531 5routino-3.4.3/extras/errorlog/summarise-log.pl 755 233 144 25116 14471174347 14716 0#!/usr/bin/perl # # Routino log summary tool. # # Part of the Routino routing software. # # This file Copyright 2011-2014, 2018, 2023 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # use strict; # Command line my $verbose=0; $verbose=1 if($#ARGV==0 && $ARGV[0] eq "-v"); my $html=0; $html=1 if($#ARGV==0 && $ARGV[0] eq "-html"); die "Usage: $0 [-v | -html] < \n" if($#ARGV>0 || ($#ARGV==0 && !$verbose && !$html)); # Read in each line from the error log and store them my %errors=(); my %errorids=(); my %errortypes=(); while() { s%\r*\n%%; my $errorid=""; my $errortype=""; if(m%nodes ([0-9]+) and ([0-9]+) in way ([0-9]+)%i) # Special case pair of nodes and a way { $errorid="($1 $2 $3)"; $errortype="N2W"; s%nodes [0-9]+ and [0-9]+ in way [0-9]+%nodes and in way %; } elsif(m%way ([0-9]+) contains node ([0-9]+)%i) # Special case way and node { $errorid="($1 $2)"; $errortype="WN"; s%Way [0-9]+ contains node [0-9]+%Way contains node %; } elsif(m%nodes ([0-9]+) and ([0-9]+)%i) # Special case pair of nodes (multiple ways) { $errorid="($1 $2)"; $errortype="N2"; s%nodes [0-9]+ and [0-9]+%nodes and %; } elsif(m%Relation ([0-9]+).* contains Node ([0-9]+)%) # Special case relation/node { $errorid="($1 $2)"; $errortype="RN"; s%Relation [0-9]+%Relation %; s%Node [0-9]+%node %; } elsif(m%Relation ([0-9]+).* contains Way ([0-9]+)%) # Generic case relation/way { $errorid="($1 $2)"; $errortype="RW"; s%Relation [0-9]+%Relation %; s%Way [0-9]+%way %; } elsif(!m%Way ([0-9]+)% && !m%Relation ([0-9]+)% && m%Node ([0-9]+)%) # Generic node { $errorid=$1; $errortype="N"; s%Node [0-9]+%Node %; } elsif(!m%Node ([0-9]+)% && !m%Relation ([0-9]+)% && m%Way ([0-9]+)%) # Generic way { $errorid=$1; $errortype="W"; s%Way [0-9]+%Way %; } elsif(!m%Node ([0-9]+)% && !m%Way ([0-9]+)% && m%Relation ([0-9]+)%) # Generic relation { $errorid=$1; $errortype="R"; s%Relation [0-9]+%Relation %; } else { $errorid="ERROR"; $errortype="E"; warn "Unrecognised error message '$_'\n"; } $errors{$_}++; if($verbose || $html) { if(defined $errorids{$_}) { push(@{$errorids{$_}},$errorid); } else { $errorids{$_}=[$errorid]; } } if($html) { $errortypes{$_}=$errortype; } } # Print out the results as text if( ! $html ) { foreach my $error (sort { if ( $errors{$b} == $errors{$a} ) { return $errors{$a} cmp $errors{$b} } else { return $errors{$b} <=> $errors{$a} } } (keys %errors)) { printf "%9d : $error\n",$errors{$error}; if($verbose) { my @ids=sort({ return $a <=> $b } @{$errorids{$error}}); print " ".join(",",@ids)."\n"; } } } # Print out the results as HTML else { print "\n". "\n". "\n". "\n". "Routino Error Log File Summary\n". "\n". "\n". "\n". "\n". "\n". "\n". "

Routino Error Log File Summary

\n". "\n". "This HTML file contains a summary of the Routino OSM parser error log file with\n". "links to the OSM website that allow browsing each of the nodes, ways or relations\n". "that are responsible for the error messages.\n". "\n"; my %errortypeorder=( "N" , 1, "WN" , 2, "N2W" , 3, "N2" , 4, "W" , 5, "R" , 6, "RN" , 7, "RW" , 8, "E" , 9 ); my %errortypeheader=( "N" , "Node Errors", "WN" , "Node Errors in Ways", "N2W" , "Node Pair Errors (Single Way)", "N2" , "Node Pair Errors (Multiple Ways)", "W" , "Way Errors", "R" , "Relation Errors", "RN" , "Node Error in Relation", "RW" , "Way Error in Relation", "E" , "Unknown Error" ); my %errortypedesc=( "N" , "A Node has an error.", "WN" , "A way has an error with a node that it contains (if the node is not in Routino database it may not have been in the original OSM database).", "N2W" , "A way has an error with a pair of nodes that it contains.", "N2" , "A pair of connected nodes have an error with more than one way (unspecified in error message) that connects them.", "W" , "A Way has an error.", "R" , "A Relation has an error.", "RN" , "A relation has an error with a node that it contains (if the node is not in Routino database it may not have been in the original OSM database or it may not be a highway node or the highway may have been discarded because of access permissions).", "RW" , "A relation has an error with a way that it contains (if the way is not in Routino database it may not have been in the original OSM database or it may not be a highway or it may have been discarded because of access permissions).", "E" , "An error message in the log file is not understood by the log summariser." ); my %errortypelabel=( "N" , "Node list", "WN" , "(Way Node) list", "N2W" , "(Node Node Way) list", "N2" , "(Node Node) list", "W" , "Way list", "R" , "Relation list", "RN" , "(Relation Node) list", "RW" , "(Relation Way) list", "E" , "No data" ); my $lasterrortype=""; foreach my $error (sort { if ( $errortypes{$b} ne $errortypes{$a} ) { return $errortypeorder{$errortypes{$a}} <=> $errortypeorder{$errortypes{$b}} } elsif ( $errors{$b} == $errors{$a} ) { return $errors{$a} cmp $errors{$b} } else { return $errors{$b} <=> $errors{$a} } } (keys %errors)) { my $errorhtml=$error; $errorhtml =~ s/&/&/g; $errorhtml =~ s//>/g; if($errortypes{$error} ne $lasterrortype) { print "

$errortypeheader{$errortypes{$error}}

\n"; print "$errortypedesc{$errortypes{$error}}\n"; $lasterrortype=$errortypes{$error}; } print "

$errorhtml

\n"; print "$errors{$error} occurences; "; my @ids=sort({ return $a <=> $b } @{$errorids{$error}}); my $first=1; my $count=0; foreach my $id (@ids) { if($first) { print "$errortypelabel{$errortypes{$error}}:\n"; } else { print ",\n"; } $first=0; print "$id" if($errortypes{$error} eq "N"); print "$id" if($errortypes{$error} eq "W"); print "$id" if($errortypes{$error} eq "R"); if($errortypes{$error} eq "WN" || $errortypes{$error} eq "N2" || $errortypes{$error} eq "RN" || $errortypes{$error} eq "RW") { $id =~ m%\(([0-9]+) ([0-9]+)\)%; print "($1 $2)" if($errortypes{$error} eq "WN"); print "($1 $2)" if($errortypes{$error} eq "N2"); print "($1 $2)" if($errortypes{$error} eq "RN"); print "($1 $2)" if($errortypes{$error} eq "RW"); } if($errortypes{$error} eq "N2W") { $id =~ m%\(([0-9]+) ([0-9]+) ([0-9]+)\)%; print "($1 $2 $3)" if($errortypes{$error} eq "N2W"); } $count++; if($count>=100) { print " [first 100 listed]."; last; } } print "\n"; } print "\n". "\n". "\n". "\n"; } routino-3.4.3/extras/errorlog/README.txt 644 233 144 1532 12152437721 13234 0 Error Log Summariser ==================== This Perl script can be used to process the log file generated by runing 'planetsplitter --errorlog' and generate a summary of the most common types of errors. summarise-log.pl ---------------- Example usage: summarise-log.pl < error.log Generate a summary of the number of each type of error that appear in the error log file as plain text. summarise-log.pl -v < error.log Generate a verbose version of the plain text summary of errors with each error item (node, way or relation) listed. summarise-log.pl -html < error.log Generate an HTML file with a summary of the number of errors of each type with links to each of the items (node, way or relation) on the OSM website. routino-3.4.3/extras/tagmodifier/ 40755 233 144 0 15003125373 12153 5routino-3.4.3/extras/tagmodifier/tagmodifier.c 644 233 144 63462 12574075134 14671 0/*************************************** Test application for OSM XML file parser / tagging rule testing. Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2015 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include #include #include #include #include #include #include "version.h" #include "xmlparse.h" #include "tagging.h" #include "files.h" #include "uncompress.h" /* Local variables (re-initialised for each file) */ static uint64_t nnodes,nways,nrelations; TagList *current_tags; /* Local functions */ static void print_usage(int detail,const char *argerr,const char *err); /* The XML tag processing function prototypes */ static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding); static int osmType_function(const char *_tag_,int _type_,const char *version,const char *generator); static int relationType_function(const char *_tag_,int _type_,const char *id,const char *timestamp,const char *uid,const char *user,const char *visible,const char *version,const char *action); static int wayType_function(const char *_tag_,int _type_,const char *id,const char *timestamp,const char *uid,const char *user,const char *visible,const char *version,const char *action); static int memberType_function(const char *_tag_,int _type_,const char *type,const char *ref,const char *role); static int ndType_function(const char *_tag_,int _type_,const char *ref); static int nodeType_function(const char *_tag_,int _type_,const char *id,const char *lat,const char *lon,const char *timestamp,const char *uid,const char *user,const char *visible,const char *version,const char *action); static int tagType_function(const char *_tag_,int _type_,const char *k,const char *v); static int boundType_function(const char *_tag_,int _type_,const char *box,const char *origin); static int boundsType_function(const char *_tag_,int _type_,const char *minlat,const char *minlon,const char *maxlat,const char *maxlon,const char *origin); /* The XML tag definitions */ /*+ The boundsType type tag. +*/ static const xmltag boundsType_tag= {"bounds", 5, {"minlat","minlon","maxlat","maxlon","origin"}, boundsType_function, {NULL}}; /*+ The boundType type tag. +*/ static const xmltag boundType_tag= {"bound", 2, {"box","origin"}, boundType_function, {NULL}}; /*+ The tagType type tag. +*/ static const xmltag tagType_tag= {"tag", 2, {"k","v"}, tagType_function, {NULL}}; /*+ The nodeType type tag. +*/ static const xmltag nodeType_tag= {"node", 9, {"id","lat","lon","timestamp","uid","user","visible","version","action"}, nodeType_function, {&tagType_tag,NULL}}; /*+ The ndType type tag. +*/ static const xmltag ndType_tag= {"nd", 1, {"ref"}, ndType_function, {NULL}}; /*+ The memberType type tag. +*/ static const xmltag memberType_tag= {"member", 3, {"type","ref","role"}, memberType_function, {NULL}}; /*+ The wayType type tag. +*/ static const xmltag wayType_tag= {"way", 7, {"id","timestamp","uid","user","visible","version","action"}, wayType_function, {&ndType_tag,&tagType_tag,NULL}}; /*+ The relationType type tag. +*/ static const xmltag relationType_tag= {"relation", 7, {"id","timestamp","uid","user","visible","version","action"}, relationType_function, {&memberType_tag,&tagType_tag,NULL}}; /*+ The osmType type tag. +*/ static const xmltag osmType_tag= {"osm", 2, {"version","generator"}, osmType_function, {&boundsType_tag,&boundType_tag,&nodeType_tag,&wayType_tag,&relationType_tag,NULL}}; /*+ The xmlDeclaration type tag. +*/ static const xmltag xmlDeclaration_tag= {"xml", 2, {"version","encoding"}, xmlDeclaration_function, {NULL}}; /*+ The complete set of tags at the top level. +*/ static const xmltag *const xml_toplevel_tags[]={&xmlDeclaration_tag,&osmType_tag,NULL}; /* The XML tag processing functions */ /*++++++++++++++++++++++++++++++++++++++ The function that is called when the boundsType XSD type is seen int boundsType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *minlat The contents of the 'minlat' attribute (or NULL if not defined). const char *minlon The contents of the 'minlon' attribute (or NULL if not defined). const char *maxlat The contents of the 'maxlat' attribute (or NULL if not defined). const char *maxlon The contents of the 'maxlon' attribute (or NULL if not defined). const char *origin The contents of the 'origin' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int boundsType_function(const char *_tag_,int _type_,const char *minlat,const char *minlon,const char *maxlat,const char *maxlon,const char *origin) { printf(" <%s%s",(_type_==XMLPARSE_TAG_END)?"/":"",_tag_); if(minlat) printf(" minlat='%s'",ParseXML_Encode_Safe_XML(minlat)); if(minlon) printf(" minlon='%s'",ParseXML_Encode_Safe_XML(minlon)); if(maxlat) printf(" maxlat='%s'",ParseXML_Encode_Safe_XML(maxlat)); if(maxlon) printf(" maxlon='%s'",ParseXML_Encode_Safe_XML(maxlon)); if(origin) printf(" origin='%s'",ParseXML_Encode_Safe_XML(origin)); printf("%s>\n",(_type_==(XMLPARSE_TAG_START|XMLPARSE_TAG_END))?" /":""); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the boundType XSD type is seen int boundType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *box The contents of the 'box' attribute (or NULL if not defined). const char *origin The contents of the 'origin' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int boundType_function(const char *_tag_,int _type_,const char *box,const char *origin) { printf(" <%s%s",(_type_==XMLPARSE_TAG_END)?"/":"",_tag_); if(box) printf(" box='%s'",ParseXML_Encode_Safe_XML(box)); if(origin) printf(" origin='%s'",ParseXML_Encode_Safe_XML(origin)); printf("%s>\n",(_type_==(XMLPARSE_TAG_START|XMLPARSE_TAG_END))?" /":""); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the tagType XSD type is seen int tagType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *k The contents of the 'k' attribute (or NULL if not defined). const char *v The contents of the 'v' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int tagType_function(const char *_tag_,int _type_,const char *k,const char *v) { if(_type_&XMLPARSE_TAG_START) { XMLPARSE_ASSERT_STRING(_tag_,k); XMLPARSE_ASSERT_STRING(_tag_,v); AppendTag(current_tags,k,v); } return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the nodeType XSD type is seen int nodeType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *id The contents of the 'id' attribute (or NULL if not defined). const char *lat The contents of the 'lat' attribute (or NULL if not defined). const char *lon The contents of the 'lon' attribute (or NULL if not defined). const char *timestamp The contents of the 'timestamp' attribute (or NULL if not defined). const char *uid The contents of the 'uid' attribute (or NULL if not defined). const char *user The contents of the 'user' attribute (or NULL if not defined). const char *visible The contents of the 'visible' attribute (or NULL if not defined). const char *version The contents of the 'version' attribute (or NULL if not defined). const char *action The contents of the 'action' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int nodeType_function(const char *_tag_,int _type_,const char *id,const char *lat,const char *lon,const char *timestamp,const char *uid,const char *user,const char *visible,const char *version,const char *action) { static int64_t llid; /* static variable to store attributes from tag until tag */ if(_type_&XMLPARSE_TAG_START) { nnodes++; if(!(nnodes%10000)) fprintf_middle(stderr,"Reading: Lines=%"PRIu64" Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations); current_tags=NewTagList(); /* Handle the node information */ XMLPARSE_ASSERT_INTEGER(_tag_,id); llid=atoll(id); /* need int64_t conversion */ } if(_type_&XMLPARSE_TAG_END) { TagList *result=ApplyNodeTaggingRules(current_tags,llid); int i; for(i=0;intags;i++) { printf(" k[i])); printf(" v='%s'",ParseXML_Encode_Safe_XML(result->v[i])); printf(" />\n"); } DeleteTagList(current_tags); DeleteTagList(result); } printf(" <%s%s",(_type_==XMLPARSE_TAG_END)?"/":"",_tag_); if(id) printf(" id='%s'",ParseXML_Encode_Safe_XML(id)); if(lat) printf(" lat='%s'",ParseXML_Encode_Safe_XML(lat)); if(lon) printf(" lon='%s'",ParseXML_Encode_Safe_XML(lon)); if(timestamp) printf(" timestamp='%s'",ParseXML_Encode_Safe_XML(timestamp)); if(uid) printf(" uid='%s'",ParseXML_Encode_Safe_XML(uid)); if(user) printf(" user='%s'",ParseXML_Encode_Safe_XML(user)); if(visible) printf(" visible='%s'",ParseXML_Encode_Safe_XML(visible)); if(version) printf(" version='%s'",ParseXML_Encode_Safe_XML(version)); if(action) printf(" action='%s'",ParseXML_Encode_Safe_XML(action)); printf("%s>\n",(_type_==(XMLPARSE_TAG_START|XMLPARSE_TAG_END))?" /":""); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the ndType XSD type is seen int ndType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *ref The contents of the 'ref' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int ndType_function(const char *_tag_,int _type_,const char *ref) { printf(" <%s%s",(_type_==XMLPARSE_TAG_END)?"/":"",_tag_); if(ref) printf(" ref='%s'",ParseXML_Encode_Safe_XML(ref)); printf("%s>\n",(_type_==(XMLPARSE_TAG_START|XMLPARSE_TAG_END))?" /":""); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the memberType XSD type is seen int memberType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *type The contents of the 'type' attribute (or NULL if not defined). const char *ref The contents of the 'ref' attribute (or NULL if not defined). const char *role The contents of the 'role' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int memberType_function(const char *_tag_,int _type_,const char *type,const char *ref,const char *role) { printf(" <%s%s",(_type_==XMLPARSE_TAG_END)?"/":"",_tag_); if(type) printf(" type='%s'",ParseXML_Encode_Safe_XML(type)); if(ref) printf(" ref='%s'",ParseXML_Encode_Safe_XML(ref)); if(role) printf(" role='%s'",ParseXML_Encode_Safe_XML(role)); printf("%s>\n",(_type_==(XMLPARSE_TAG_START|XMLPARSE_TAG_END))?" /":""); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the wayType XSD type is seen int wayType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *id The contents of the 'id' attribute (or NULL if not defined). const char *timestamp The contents of the 'timestamp' attribute (or NULL if not defined). const char *uid The contents of the 'uid' attribute (or NULL if not defined). const char *user The contents of the 'user' attribute (or NULL if not defined). const char *visible The contents of the 'visible' attribute (or NULL if not defined). const char *version The contents of the 'version' attribute (or NULL if not defined). const char *action The contents of the 'action' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int wayType_function(const char *_tag_,int _type_,const char *id,const char *timestamp,const char *uid,const char *user,const char *visible,const char *version,const char *action) { static int64_t llid; /* static variable to store attributes from tag until tag */ if(_type_&XMLPARSE_TAG_START) { nways++; if(!(nways%1000)) fprintf_middle(stderr,"Reading: Lines=%"PRIu64" Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations); current_tags=NewTagList(); /* Handle the way information */ XMLPARSE_ASSERT_INTEGER(_tag_,id); llid=atoll(id); /* need int64_t conversion */ } if(_type_&XMLPARSE_TAG_END) { TagList *result=ApplyWayTaggingRules(current_tags,llid); int i; for(i=0;intags;i++) { printf(" k[i])); printf(" v='%s'",ParseXML_Encode_Safe_XML(result->v[i])); printf(" />\n"); } DeleteTagList(current_tags); DeleteTagList(result); } printf(" <%s%s",(_type_==XMLPARSE_TAG_END)?"/":"",_tag_); if(id) printf(" id='%s'",ParseXML_Encode_Safe_XML(id)); if(timestamp) printf(" timestamp='%s'",ParseXML_Encode_Safe_XML(timestamp)); if(uid) printf(" uid='%s'",ParseXML_Encode_Safe_XML(uid)); if(user) printf(" user='%s'",ParseXML_Encode_Safe_XML(user)); if(visible) printf(" visible='%s'",ParseXML_Encode_Safe_XML(visible)); if(version) printf(" version='%s'",ParseXML_Encode_Safe_XML(version)); if(action) printf(" action='%s'",ParseXML_Encode_Safe_XML(action)); printf("%s>\n",(_type_==(XMLPARSE_TAG_START|XMLPARSE_TAG_END))?" /":""); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the relationType XSD type is seen int relationType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *id The contents of the 'id' attribute (or NULL if not defined). const char *timestamp The contents of the 'timestamp' attribute (or NULL if not defined). const char *uid The contents of the 'uid' attribute (or NULL if not defined). const char *user The contents of the 'user' attribute (or NULL if not defined). const char *visible The contents of the 'visible' attribute (or NULL if not defined). const char *version The contents of the 'version' attribute (or NULL if not defined). const char *action The contents of the 'action' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int relationType_function(const char *_tag_,int _type_,const char *id,const char *timestamp,const char *uid,const char *user,const char *visible,const char *version,const char *action) { static int64_t llid; /* static variable to store attributes from tag until tag */ if(_type_&XMLPARSE_TAG_START) { nrelations++; if(!(nrelations%1000)) fprintf_middle(stderr,"Reading: Lines=%"PRIu64" Nodes=%"PRIu64" Ways=%"PRIu64" Relations=%"PRIu64,ParseXML_LineNumber(),nnodes,nways,nrelations); current_tags=NewTagList(); /* Handle the relation information */ XMLPARSE_ASSERT_INTEGER(_tag_,id); llid=atoll(id); /* need int64_t conversion */ } if(_type_&XMLPARSE_TAG_END) { TagList *result=ApplyRelationTaggingRules(current_tags,llid); int i; for(i=0;intags;i++) { printf(" k[i])); printf(" v='%s'",ParseXML_Encode_Safe_XML(result->v[i])); printf(" />\n"); } DeleteTagList(current_tags); DeleteTagList(result); } printf(" <%s%s",(_type_==XMLPARSE_TAG_END)?"/":"",_tag_); if(id) printf(" id='%s'",ParseXML_Encode_Safe_XML(id)); if(timestamp) printf(" timestamp='%s'",ParseXML_Encode_Safe_XML(timestamp)); if(uid) printf(" uid='%s'",ParseXML_Encode_Safe_XML(uid)); if(user) printf(" user='%s'",ParseXML_Encode_Safe_XML(user)); if(visible) printf(" visible='%s'",ParseXML_Encode_Safe_XML(visible)); if(version) printf(" version='%s'",ParseXML_Encode_Safe_XML(version)); if(action) printf(" action='%s'",ParseXML_Encode_Safe_XML(action)); printf("%s>\n",(_type_==(XMLPARSE_TAG_START|XMLPARSE_TAG_END))?" /":""); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the osmType XSD type is seen int osmType_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *version The contents of the 'version' attribute (or NULL if not defined). const char *generator The contents of the 'generator' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int osmType_function(const char *_tag_,int _type_,const char *version,const char *generator) { printf("<%s%s",(_type_==XMLPARSE_TAG_END)?"/":"",_tag_); if(version) printf(" version='%s'",ParseXML_Encode_Safe_XML(version)); if(generator) printf(" generator='%s'",ParseXML_Encode_Safe_XML(generator)); printf("%s>\n",(_type_==(XMLPARSE_TAG_START|XMLPARSE_TAG_END))?" /":""); return(0); } /*++++++++++++++++++++++++++++++++++++++ The function that is called when the XML declaration is seen int xmlDeclaration_function Returns 0 if no error occured or something else otherwise. const char *_tag_ Set to the name of the element tag that triggered this function call. int _type_ Set to XMLPARSE_TAG_START at the start of a tag and/or XMLPARSE_TAG_END at the end of a tag. const char *version The contents of the 'version' attribute (or NULL if not defined). const char *encoding The contents of the 'encoding' attribute (or NULL if not defined). ++++++++++++++++++++++++++++++++++++++*/ static int xmlDeclaration_function(const char *_tag_,int _type_,const char *version,const char *encoding) { printf("\n"); return(0); } /*++++++++++++++++++++++++++++++++++++++ The main program for the tagmodifier. ++++++++++++++++++++++++++++++++++++++*/ int main(int argc,char **argv) { char *tagging=NULL,*filename=NULL,*errorlog=NULL; char *p; int fd; int arg,retval; /* Parse the command line arguments */ for(arg=1;arg=0) { fprintf(stderr, "Usage: tagmodifier [--version]\n" " [--help]\n" " [--tagging=]\n" " [--loggable] [--logtime] [--logmemory]\n" " [--errorlog[=]]\n" " " #if defined(USE_BZIP2) && USE_BZIP2 " | " #endif #if defined(USE_GZIP) && USE_GZIP " | " #endif #if defined(USE_XZ) && USE_XZ " | " #endif "\n"); if(argerr) fprintf(stderr, "\n" "Error with command line parameter: %s\n",argerr); if(err) fprintf(stderr, "\n" "Error: %s\n",err); } if(detail==1) fprintf(stderr, "\n" "--version Print the version of Routino.\n" "\n" "--help Prints this information.\n" "\n" "--tagging= The name of the XML file containing the tagging rules\n" " (defaults to 'tagging.xml' in current directory).\n" "\n" "--loggable Print progress messages suitable for logging to file.\n" "--logtime Print the elapsed time for the processing.\n" "--logmemory Print the max allocated/mapped memory for each step.\n" "--errorlog[=] Log parsing errors to 'error.log' or the given name.\n" "\n" " The name of the file to process.\n" #if defined(USE_BZIP2) && USE_BZIP2 " Filenames ending '.bz2' will be bzip2 uncompressed.\n" #endif #if defined(USE_GZIP) && USE_GZIP " Filenames ending '.gz' will be gzip uncompressed.\n" #endif #if defined(USE_XZ) && USE_XZ " Filenames ending '.xz' will be xz uncompressed.\n" #endif ); exit(!detail); } routino-3.4.3/extras/tagmodifier/Makefile 644 233 144 3600 13712516541 13634 0# tagmodifier Makefile # # Part of the Routino routing software. # # This file Copyright 2013-2015, 2017, 2018, 2020 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../../Makefile.conf # Compilation targets DEPDIR=.deps C=$(wildcard *.c) D=$(wildcard $(DEPDIR)/*.d) ROUTINO_SRC=../../src EXE=tagmodifier$(.EXE) ######## all: $(EXE) ######## TAGMODIFIER_OBJ=tagmodifier.o \ $(ROUTINO_SRC)/files.o $(ROUTINO_SRC)/logging.o $(ROUTINO_SRC)/logerror.o \ $(ROUTINO_SRC)/uncompress.o $(ROUTINO_SRC)/xmlparse.o $(ROUTINO_SRC)/tagging.o ifeq ($(HOST),MINGW) TAGMODIFIER_OBJ+=$(ROUTINO_SRC)/mman-win32.o endif tagmodifier$(.EXE) : $(TAGMODIFIER_OBJ) $(LD) $^ -o $@ $(LDFLAGS) ######## $(ROUTINO_SRC)/%.o : cd $(ROUTINO_SRC) && $(MAKE) $(notdir $@) %.o : %.c -@[ -d $(DEPDIR) ] || mkdir $(DEPDIR) || true $(CC) -c $(CFLAGS) -DSLIM=0 -I$(ROUTINO_SRC) $< -o $@ -MMD -MP -MF $(addprefix $(DEPDIR)/,$(addsuffix .d,$(basename $@))) ######## test: ######## install: ######## clean: rm -f *~ rm -f *.o rm -f $(EXE) rm -f $(D) rm -fr $(DEPDIR) rm -f core rm -f *.gcda *.gcno *.gcov gmon.out ######## distclean: clean ######## include $(D) ######## .PHONY:: all test install clean distclean routino-3.4.3/extras/tagmodifier/README.txt 644 233 144 3213 12574075511 13674 0 Tagging Rule Tester / Tag Modifier ================================== This program is used to run the tag transformation process on an OSM XML file for test purposes. This allows it to be used to test new tagging rules or to make automatic rule-based modifications to tags within an XML file. tagmodifier ----------- Usage: tagmodifier [--version] [--help] [--tagging=] [--loggable] [--logtime] [--logmemory] [--errorlog[]] [ | | | ] --version Print the version of Routino. --help Prints out the help information. --tagging= The name of the XML file containing the tagging rules (defaults to 'tagging.xml' in the current directory). --loggable Print progress messages that are suitable for logging to a file; normally an incrementing counter is printed which is more suitable for real-time display than logging. --logtime Print the elapsed time for the processing. --logmemory Print the used memory for the processing. --errorlog[=] Log parsing errors to 'error.log' or the specified file name. Specifies the filename(s) to read data from. Filenames ending '.bz2' will be bzip2 uncompressed (if bzip2 support compiled in). Filenames ending '.gz' will be gzip uncompressed (if gzip support compiled in). Filenames ending '.xz' will be xz uncompressed (if xz support compiled in). routino-3.4.3/extras/Makefile 644 233 144 2657 12313271770 11353 0# Extra files Makefile # # Part of the Routino routing software. # # This file Copyright 2013 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../Makefile.conf # Sub-directories and sub-makefiles SUBFILES=$(wildcard */Makefile) SUBDIRS=$(foreach f,$(SUBFILES),$(dir $f)) ######## all: for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done ######## test: for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done ######## install: for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done ######## clean: for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done ######## distclean: for dir in $(SUBDIRS); do \ ( cd $$dir && $(MAKE) $@ ); \ done ######## .PHONY:: all test install clean distclean routino-3.4.3/extras/README.txt 644 233 144 3004 13333077163 11377 0 ROUTINO EXTRAS ============== This directory contains some programs and scripts that although distributed with Routino are not necessary components of a working OSM router. They are generally either programs that use some components of Routino (i.e. they are compiled and linked with some of the Routino source code) or they are scripts to be used to process the outputs of Routino. Each program or script has its own directory which contains all of the necessary source code, documentation and/or web pages for that program or script. None of them will be installed when Routino is installed. -------------------------------------------------------------------------------- tagmodifier - A program to read an OSM XML file and process it using a Routino tagging rules file to create a modified output XML file. errorlog - Scripts for processing the error log file (created by running planetsplitter with the --errorlog option). plot-time - Plots the output of 'planetsplitter --loggable --logtime' to show how long each part of the processing takes. find-fixme - A modified version of the Routino planetsplitter and filedumper programs to scan an OSM file for "fixme" tags and create a database so that web pages provided can display them. statistics - A collection of scripts and compiled code to extract statistics from the Routino database and create a map of the data. routino-3.4.3/python/ 40755 233 144 0 15003125373 7674 5routino-3.4.3/python/setup.py 644 233 144 4504 14672571447 11447 0# Python interface setup script # # Part of the Routino routing software. # # This file Copyright 2018, 2022, 2024 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # import os import re from setuptools import setup, Extension routino_router = Extension('routino._router', sources = ['src/_router.c'], depends = ['../src/routino.h'], include_dirs = ['../src'], library_dirs = ['../src'], libraries = ['routino']) # Note: the database needs access to all symbols, not just those # exported by the libroutino library so it must link with the object # files and not just the library. lib_files = [] for file in os.listdir('../src'): if re.search("-lib.o", file) and not re.search("-slim-lib.o", file): lib_files.append("../src/" + file) routino_database = Extension('routino._database', sources = ['src/_database.cc', 'src/database.cc'], depends = ['../src/types.h', '../src/nodes.h', '../src/segments.h', '../src/ways.h', '../src/relations.h', '../src/routino.h'], include_dirs = ['../src'], extra_objects = lib_files, library_dirs = ['../src']) setup (name = 'Routino', version = '1.0', author="Andrew M. Bishop", author_email='amb@routino.org', url='http://routino.org/', description = 'Interfaces to Routino in Python', packages = ['routino'], package_dir = {'routino': 'src'}, py_modules = ['routino', 'routino.router', 'routino.database'], ext_modules = [routino_router, routino_database]) routino-3.4.3/python/src/ 40755 233 144 0 15003125373 10463 5routino-3.4.3/python/src/database.cc 644 233 144 33276 13372620415 12611 0/*************************************** Routino database access from Python. Part of the Routino routing software. ******************/ /****************** This file Copyright 2018 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #include extern "C" { #include "types.h" #include "nodes.h" #include "segments.h" #include "ways.h" #include "relations.h" #include "routino.h" } #include "database.hh" /* Copied from ../src/routino.c */ struct _Routino_Database { Nodes *nodes; Segments *segments; Ways *ways; Relations *relations; }; /*++++++++++++++++++++++++++++++++++++++ Create the PythonDatabase object by loading the database and filling in some useful information. PythonDatabase *LoadDatabase Return a pointer to the Python view of the database. const char *dirname The name of the directory. const char *prefix The filename prefix (or NULL). ++++++++++++++++++++++++++++++++++++++*/ PythonDatabase *LoadDatabase(const char *dirname,const char *prefix) { Routino_Database *database = Routino_LoadDatabase(dirname, prefix); if(!database) return NULL; else return new PythonDatabase(dirname, prefix, database); } /*++++++++++++++++++++++++++++++++++++++ Create the PythonDatabase object by loading the database and filling in some useful information. PythonDatabase LoadDatabase Return a pointer to the Python view of the database. const char *dirname The name of the directory. ++++++++++++++++++++++++++++++++++++++*/ PythonDatabase *LoadDatabase(const char *dirname) { return LoadDatabase(dirname,NULL); } /*++++++++++++++++++++++++++++++++++++++ Create the PythonDatabase by passing it a loaded database. const char *_dirname The name of the directory. const char *_prefix The filename prefix (or NULL). Routino_Database *_database The opened database. ++++++++++++++++++++++++++++++++++++++*/ PythonDatabase::PythonDatabase(const char *_dirname,const char *_prefix, Routino_Database *_database) { database = _database; /* Copy the database path information */ dirname = new char[strlen(_dirname)+1]; strcpy(dirname,_dirname); prefix = new char[strlen(_prefix)+1]; strcpy(prefix,_prefix); /* Fill in the extra information */ nnodes = database->segments->file.number; nsegments = database->nodes->file.number; nways = database->ways->file.number; nrelations = database->relations->file.trnumber; } /*++++++++++++++++++++++++++++++++++++++ Destroy the PythonDatabase by unloading the database. ++++++++++++++++++++++++++++++++++++++*/ PythonDatabase::~PythonDatabase() { Routino_UnloadDatabase(database); delete[] dirname; delete[] prefix; } /*++++++++++++++++++++++++++++++++++++++ Return a pointer to a modified Node data structure for use by Python. PythonNode *GetNode Returns a pointer to the Python view of the node. index_t item The index number of the Node. ++++++++++++++++++++++++++++++++++++++*/ PythonNode *PythonDatabase::GetNode(index_t item) { PythonNode *pynode=new PythonNode(this); Node *nodep=LookupNode(database->nodes,item,1); double latitude,longitude; GetLatLong(database->nodes,item,nodep,&latitude,&longitude); pynode->id = item; pynode->firstsegment = nodep->firstseg; pynode->latitude = radians_to_degrees(latitude); pynode->longitude = radians_to_degrees(longitude); pynode->allow = nodep->allow; pynode->flags = nodep->flags; return pynode; } /*++++++++++++++++++++++++++++++++++++++ Return a pointer to a modified Segment data structure for use by Python. PythonSegment *GetSegment Returs a pointer to the Python view of the segment. index_t item The index number of the Segment. ++++++++++++++++++++++++++++++++++++++*/ PythonSegment *PythonDatabase::GetSegment(index_t item) { PythonSegment *pysegment=new PythonSegment(this); Segment *segmentp=LookupSegment(database->segments,item,1); pysegment->id = item; pysegment->node1 = segmentp->node1; pysegment->node2 = segmentp->node2; pysegment->next2 = segmentp->next2; pysegment->way = segmentp->way; pysegment->distance = distance_to_km(DISTANCE(segmentp->distance)); pysegment->flags = DISTFLAG(segmentp->distance); return pysegment; } /*++++++++++++++++++++++++++++++++++++++ Return a pointer to a modified Way data structure for use by Python. PythonWay *GetWay Returs a pointer to the Python view of the way. index_t item The index number of the Way. ++++++++++++++++++++++++++++++++++++++*/ PythonWay *PythonDatabase::GetWay(index_t item) { PythonWay *pyway=new PythonWay(this); Way *wayp=LookupWay(database->ways,item,1); char *name=WayName(database->ways,wayp); pyway->id = item; pyway->name = name; pyway->allow = wayp->allow; pyway->type = wayp->type; pyway->props = wayp->props; pyway->speed = speed_to_kph(wayp->speed); pyway->weight = weight_to_tonnes(wayp->weight); pyway->height = height_to_metres(wayp->height); pyway->width = width_to_metres(wayp->width); pyway->length = length_to_metres(wayp->length); return pyway; } /*++++++++++++++++++++++++++++++++++++++ Return a pointer to a modified Relation data structure for use by Python. PythonRelation *GetRelation Returs a pointer to the Python view of the relation. index_t item The index number of the Relation. ++++++++++++++++++++++++++++++++++++++*/ PythonRelation *PythonDatabase::GetRelation(index_t item) { PythonRelation *pyrelation=new PythonRelation(this); TurnRelation *relationp=LookupTurnRelation(database->relations,item,1); pyrelation->id = item; pyrelation->from_seg = relationp->from; pyrelation->via_node = relationp->via; pyrelation->to_seg = relationp->to; Node *nodep=LookupNode(database->nodes,relationp->via,1); index_t from_way=NO_WAY,to_way=NO_WAY; index_t from_node=NO_NODE,to_node=NO_NODE; Segment *segmentp=FirstSegment(database->segments,nodep,1); do { index_t seg=IndexSegment(database->segments,segmentp); if(seg==relationp->from) { from_node=OtherNode(segmentp,relationp->via); from_way=segmentp->way; } if(seg==relationp->to) { to_node=OtherNode(segmentp,relationp->via); to_way=segmentp->way; } segmentp=NextSegment(database->segments,segmentp,relationp->via); } while(segmentp); pyrelation->from_way = from_way; pyrelation->to_way = to_way; pyrelation->from_node = from_node; pyrelation->to_node = to_node; pyrelation->except_transport = relationp->except; return pyrelation; } /*++++++++++++++++++++++++++++++++++++++ Create an iterator so that we can iterate through all nodes in the database. PythonDatabaseIter *PythonDatabase::Nodes Returns a pointer to a node iterator. ++++++++++++++++++++++++++++++++++++++*/ PythonDatabaseIter *PythonDatabase::Nodes() { return new PythonDatabaseIter(this,nnodes); } /*++++++++++++++++++++++++++++++++++++++ Create an iterator so that we can iterate through all segments in the database. PythonDatabaseIter *PythonDatabase::Segments Returns a pointer to a segment iterator. ++++++++++++++++++++++++++++++++++++++*/ PythonDatabaseIter *PythonDatabase::Segments() { return new PythonDatabaseIter(this,nsegments); } /*++++++++++++++++++++++++++++++++++++++ Create an iterator so that we can iterate through all ways in the database. PythonDatabaseIter *PythonDatabase::Ways Returns a pointer to a way iterator. ++++++++++++++++++++++++++++++++++++++*/ PythonDatabaseIter *PythonDatabase::Ways() { return new PythonDatabaseIter(this,nways); } /*++++++++++++++++++++++++++++++++++++++ Create an iterator so that we can iterate through all relations in the database. PythonDatabaseIter *PythonDatabase::Relations Returns a pointer to a relation iterator. ++++++++++++++++++++++++++++++++++++++*/ PythonDatabaseIter *PythonDatabase::Relations() { return new PythonDatabaseIter(this,nrelations); } /*++++++++++++++++++++++++++++++++++++++ Fill in the segments array so that we can access all segments on the node. ++++++++++++++++++++++++++++++++++++++*/ void PythonNode::fill_segments() { if(segments.size()==0) { Node *nodep=LookupNode(pydatabase->database->nodes,id,1); Segment *segmentp=FirstSegment(pydatabase->database->segments,nodep,1); do { index_t seg=IndexSegment(pydatabase->database->segments,segmentp); segments.push_back(seg); segmentp=NextSegment(pydatabase->database->segments,segmentp,id); } while(segmentp); } } /*++++++++++++++++++++++++++++++++++++++ Create an iterator so that we can iterate through all segments on the node. PythonNodeIter *PythonNode::Segments Returns a pointer to a segment iterator. ++++++++++++++++++++++++++++++++++++++*/ PythonNodeIter *PythonNode::Segments() { fill_segments(); PythonNodeIter *pyiter=new PythonNodeIter(this,segments.size()); return pyiter; } /*++++++++++++++++++++++++++++++++++++++ Get a segment from the set of segments on the node. PythonSegment *PythonNode::get_segment Returns a pointer to a segment. index_t n The index of the segment. ++++++++++++++++++++++++++++++++++++++*/ PythonSegment *PythonNode::get_segment(index_t n) { fill_segments(); if(n > segments.size()) return NULL; return pydatabase->GetSegment(segments[n]); } /*++++++++++++++++++++++++++++++++++++++ When acting as a list return the selected item from the iterator. template<> PythonNode *PythonDatabaseIter::__getitem__ Returns a pointer to a node. index_t n The index of the node. ++++++++++++++++++++++++++++++++++++++*/ template<> PythonNode *PythonDatabaseIter::__getitem__(index_t n) { return pydatabase->GetNode(n); } /*++++++++++++++++++++++++++++++++++++++ When acting as a list return the selected item from the iterator. template<> PythonSegment *PythonDatabaseIter::__getitem__ Returns a pointer to a segment. index_t n The index of the segment. ++++++++++++++++++++++++++++++++++++++*/ template<> PythonSegment *PythonDatabaseIter::__getitem__(index_t n) { return pydatabase->GetSegment(n); } /*++++++++++++++++++++++++++++++++++++++ When acting as a list return the selected item from the iterator. template<> PythonWay *PythonDatabaseIter::__getitem__ Returns a pointer to a way. index_t n The index of the way. ++++++++++++++++++++++++++++++++++++++*/ template<> PythonWay *PythonDatabaseIter::__getitem__(index_t n) { return pydatabase->GetWay(n); } /*++++++++++++++++++++++++++++++++++++++ When acting as a list return the selected item from the iterator. template<> PythonRelation *PythonDatabaseIter::__getitem__ Returns a pointer to a relation. index_t n The index of the relation. ++++++++++++++++++++++++++++++++++++++*/ template<> PythonRelation *PythonDatabaseIter::__getitem__(index_t n) { return pydatabase->GetRelation(n); } /*++++++++++++++++++++++++++++++++++++++ When acting as a list return the selected item from the iterator. template<> PythonSegment *PythonNodeIter::__getitem__ Returns a pointer to a segment. index_t n The index of the segment. ++++++++++++++++++++++++++++++++++++++*/ template<> PythonSegment *PythonNodeIter::__getitem__(index_t n) { return pynode->get_segment(n); } /*++++++++++++++++++++++++++++++++++++++ Convert a Python database to a viewable string. char *PythonDatabase::__str__ Returns a pointer to a statically allocated string. ++++++++++++++++++++++++++++++++++++++*/ char *PythonDatabase::__str__() { static char tmp[256]; if(prefix) sprintf(tmp, "Database(%s,%s)", dirname, prefix); else sprintf(tmp, "Database(%s)", dirname); return tmp; } /*++++++++++++++++++++++++++++++++++++++ Convert a Python node to a viewable string. char *PythonNode::__str__ Returns a pointer to a statically allocated string. ++++++++++++++++++++++++++++++++++++++*/ char *PythonNode::__str__() { static char tmp[64]; sprintf(tmp, "Node(%" Pindex_t ")", id); return tmp; } /*++++++++++++++++++++++++++++++++++++++ Convert a Python segment to a viewable string. char *PythonSegment::__str__ Returns a pointer to a statically allocated string. ++++++++++++++++++++++++++++++++++++++*/ char *PythonSegment::__str__() { static char tmp[64]; sprintf(tmp, "Segment(%" Pindex_t ")", id); return tmp; } /*++++++++++++++++++++++++++++++++++++++ Convert a Python way to a viewable string. char *PythonWay::__str__ Returns a pointer to a statically allocated string. ++++++++++++++++++++++++++++++++++++++*/ char *PythonWay::__str__() { static char tmp[64]; sprintf(tmp, "Way(%" Pindex_t ")", id); return tmp; } /*++++++++++++++++++++++++++++++++++++++ Convert a Python relation to a viewable string. char *PythonRelation::__str__ Returns a pointer to a statically allocated string. ++++++++++++++++++++++++++++++++++++++*/ char *PythonRelation::__str__() { static char tmp[64]; sprintf(tmp, "Relation(%" Pindex_t ")", id); return tmp; } routino-3.4.3/python/src/__init__.py 644 233 144 0 13351656656 12537 0routino-3.4.3/python/src/router.i 644 233 144 7657 13657511227 12222 0/*************************************** Python router interface definition. Part of the Routino routing software. ******************/ /****************** This file Copyright 2018, 2020 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ /* Name the module 'router' in the 'routino' package */ %module(package="routino.router") router /* Include the 'routino.h' header file from the library in the auto-generated code */ %{ #include "routino.h" %} /* Return NULL-terminated arrays of strings as a list of strings */ %typemap(ret) char** { $result = PyList_New(0); char **p=$1; while(*p) { PyList_Append($result, PyString_FromString(*p)); p++; } } /* Handle lists of Routino Waypoints as an array */ %typemap(in) Routino_Waypoint ** { /* Check if is a list */ if (PyList_Check($input)) { int size = PyList_Size($input); int i = 0; $1 = (Routino_Waypoint **) malloc(size*sizeof(Routino_Waypoint *)); for (i = 0; i < size; i++) if (!SWIG_IsOK(SWIG_ConvertPtr(PyList_GetItem($input, i), (void **) &$1[i], $descriptor(Routino_Waypoint*), 0))) SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Routino_Waypoint"); } else { PyErr_SetString(PyExc_TypeError, "not a list"); SWIG_fail; } } %typemap(freearg) Routino_Waypoint ** { free((Routino_Waypoint *) $1); } /* Handle the Routino_ProgressFunc pointer function */ %typemap(in) Routino_ProgressFunc { if($input != Py_None) $1 = (Routino_ProgressFunc)PyLong_AsVoidPtr($input); } /* Rename variables and functions by stripping 'Routino_' or 'ROUTINO_' prefixes */ %rename("%(regex:/R[Oo][Uu][Tt][Ii][Nn][Oo]_(.*)/\\1/)s") ""; /* Rename the Routino_CalculateRoute() function so we can replace with a Python wrapper */ %rename("_CalculateRoute") "Routino_CalculateRoute"; /* Rename the Routino_LoadDatabase() function so we can replace with a Python wrapper */ %rename("_LoadDatabase") "Routino_LoadDatabase"; /* Add some custom Python code to the module */ %pythoncode %{ import ctypes # Set up a replacement function for a macro in the original def CheckAPIVersion(): return _router.Check_API_Version(_router.API_VERSION) # Set up a replacement function so that we do not need to pass the size of the list def CalculateRoute(database, profile, translation, waypoints, options, progress=None): if progress is not None: # typedef int (*Routino_ProgressFunc)(double complete); callback_type = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_double) progress = ctypes.cast(callback_type(progress), ctypes.c_void_p).value return _router._CalculateRoute(database, profile, translation, waypoints, len(waypoints), options, progress) # Set up a replacement function to make the second argument optional def LoadDatabase(dirname, prefix=None): return _router._LoadDatabase(dirname, prefix) # Create a function for concatenating directory names, prefixes and filenames def FileName(dirname, prefix, name): filename="" if dirname is not None: filename=dirname + "/" if prefix is not None: filename += prefix + "-" filename += name return filename %} /* Use the 'routino.h' header file from the library to generate the wrapper (everything is read-only) */ %immutable; %include "../src/routino.h" routino-3.4.3/python/src/database.hh 644 233 144 26010 13372351011 12600 0/*************************************** Header file for interface between Routino database and Python. Part of the Routino routing software. ******************/ /****************** This file Copyright 2018 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ #ifndef DATABASE_H #define DATABASE_H /*+ To stop multiple inclusions. +*/ #include extern "C" { #include "types.h" #include "routino.h" } /* Constants that are not automatically picked up from types.h */ const nodeflags_t Nodeflag_Super = NODE_SUPER; const nodeflags_t Nodeflag_U_Turn = NODE_UTURN; const nodeflags_t Nodeflag_Mini_Roundabout = NODE_MINIRNDBT; const nodeflags_t Nodeflag_Turn_Restrict = NODE_TURNRSTRCT; const nodeflags_t Nodeflag_Turn_Restrict2 = NODE_TURNRSTRCT2; const distance_t Segmentflag_Area = SEGMENT_AREA; const distance_t Segmentflag_Oneway_1to2 = ONEWAY_1TO2; const distance_t Segmentflag_Oneway_2to1 = ONEWAY_2TO1; const distance_t Segmentflag_Super = SEGMENT_SUPER; const distance_t Segmentflag_Normal = SEGMENT_NORMAL; /* Classes (much easier to use them than C for doing this with swig) */ class PythonDatabase; class PythonNode; class PythonSegment; class PythonWay; class PythonRelation; template class PythonDatabaseIter; template class PythonNodeIter; /* The database as seen by Python */ PythonDatabase *LoadDatabase(const char *dirname, const char *prefix); PythonDatabase *LoadDatabase(const char *dirname); class PythonDatabase { public: PythonDatabase(const char *_dirname,const char *_prefix, Routino_Database* database); /*+ A constructor +*/ ~PythonDatabase(); /*+ A destructor to unload the database. +*/ PythonNode *GetNode(index_t item); /*+ Get a single node from the database. +*/ PythonSegment *GetSegment(index_t item); /*+ Get a single segment from the database. +*/ PythonWay *GetWay(index_t item); /*+ Get a single way from the database. +*/ PythonRelation *GetRelation(index_t item); /*+ Get a single relation from the database. +*/ PythonDatabaseIter *Nodes(); /*+ Create a node iterator to get all the nodes from the database. +*/ PythonDatabaseIter *Segments(); /*+ Create a segment iterator to get all the segments from the database. +*/ PythonDatabaseIter *Ways(); /*+ Create a way iterator to get all the ways from the database. +*/ PythonDatabaseIter *Relations(); /*+ Create a relation iterator to get all the relations from the database. +*/ index_t nnodes; /*+ The number of nodes in the database. +*/ index_t nsegments; /*+ The number of segments in the database. +*/ index_t nways; /*+ The number of ways in the database. +*/ index_t nrelations; /*+ The number of relations in the database. +*/ char *__str__(); /*+ Convert the Python database to a string. +*/ friend class PythonNode; friend class PythonSegment; friend class PythonWay; friend class PythonRelation; private: char *dirname; /*+ A copy of the database directory name. +*/ char *prefix; /*+ A copy of the database prefix. +*/ Routino_Database *database; /*+ The database opened using the libroutino function. +*/ }; /* A node as seen by Python - copied from ../src/nodes.h and then modified */ class PythonNode { public: PythonNode(PythonDatabase* _pydatabase) { pydatabase = _pydatabase; } /*+ A constructor passed the database. +*/ index_t id; /*+ The index of this node. +*/ index_t firstsegment; /*+ The index of the first segment. +*/ PythonNodeIter *Segments(); double latitude; /*+ The node latitude in degrees. +*/ double longitude; /*+ The node longitude in degrees. +*/ transports_t allow; /*+ The types of transport that are allowed through the node. +*/ nodeflags_t flags; /*+ Flags containing extra information (e.g. super-node, turn restriction). +*/ char *__str__(); /*+ Convert the Python node to a string. +*/ private: friend class PythonNodeIter; PythonDatabase *pydatabase; /*+ A pointer to the database that this node came from. +*/ std::vector segments; /*+ The list of segments for this node, only filled in after calling Segments(). +*/ PythonSegment *get_segment(index_t item); /*+ Get a single segment from the node. +*/ void fill_segments(); /*+ Fill in the list of segments. +*/ }; /* A segment as seen by Python - copied from ../src/segments.h and then modified */ class PythonSegment { public: PythonSegment(PythonDatabase* _pydatabase) { pydatabase = _pydatabase; } /*+ A constructor passed the database. +*/ index_t id; /*+ The index of this segment. +*/ index_t node1; /*+ The index of the starting node. +*/ index_t node2; /*+ The index of the finishing node. +*/ PythonNode *Node1() { return pydatabase->GetNode(node1); } PythonNode *Node2() { return pydatabase->GetNode(node2); } index_t next2; /*+ The index of the next segment sharing node2. +*/ index_t way; /*+ The index of the way associated with the segment. +*/ PythonWay *Way() { return pydatabase->GetWay(way); } double distance; /*+ The distance between the nodes. +*/ distance_t flags; /*+ The flags associated with the segment. +*/ char *__str__(); /*+ Convert the Python segment to a string. +*/ private: PythonDatabase *pydatabase; /*+ A pointer to the database that this segment came from. +*/ }; /* A way as seen by Python - copied from ../src/ways.h and then modified */ class PythonWay { public: PythonWay(PythonDatabase* _pydatabase) { pydatabase = _pydatabase; } /*+ A constructor passed the database. +*/ index_t id; /*+ The index of this way. +*/ char *name; /*+ The offset of the name of the way in the names array. +*/ transports_t allow; /*+ The type of traffic allowed on the way. +*/ highway_t type; /*+ The highway type of the way. +*/ properties_t props; /*+ The properties of the way. +*/ double speed; /*+ The defined maximum speed limit of the way. +*/ double weight; /*+ The defined maximum weight of traffic on the way. +*/ double height; /*+ The defined maximum height of traffic on the way. +*/ double width; /*+ The defined maximum width of traffic on the way. +*/ double length; /*+ The defined maximum length of traffic on the way. +*/ char *__str__(); /*+ Convert the Python way to a string. +*/ private: PythonDatabase *pydatabase; /*+ A pointer to the database that this segment came from. +*/ }; /* A relation as seen by Python - copied from ../src/relations.h and then modified */ class PythonRelation { public: PythonRelation(PythonDatabase* _pydatabase) { pydatabase = _pydatabase; } /*+ A constructor passed the database. +*/ index_t id; /*+ The index of this relation. +*/ index_t from_seg; /*+ The segment that the path comes from. +*/ index_t via_node; /*+ The node that the path goes via. +*/ index_t to_seg; /*+ The segment that the path goes to. +*/ PythonSegment *FromSegment() { return pydatabase->GetSegment(from_seg); } PythonNode *ViaNode() { return pydatabase->GetNode(via_node); } PythonSegment *ToSegment() { return pydatabase->GetSegment(to_seg); } index_t from_way; /*+ The way that the path comes from. +*/ index_t to_way; /*+ The way that the path goes to. +*/ PythonWay *FromWay() { return pydatabase->GetWay(from_way); } PythonWay *ToWay() { return pydatabase->GetWay(to_way); } index_t from_node; /*+ The node that the path comes from. +*/ index_t to_node; /*+ The node that the path goes to. +*/ PythonNode *FromNode() { return pydatabase->GetNode(from_node); } PythonNode *ToNode() { return pydatabase->GetNode(to_node); } transports_t except_transport; /*+ The types of transports that that this relation does not apply to. +*/ char *__str__(); /*+ Convert the Python relation to a string. +*/ private: PythonDatabase *pydatabase; /*+ A pointer to the database that this segment came from. +*/ }; /* A generic node/segment/way/relation iterator */ template class PythonDatabaseIter { public: PythonDatabaseIter(PythonDatabase* _pydatabase, index_t _number) { pydatabase = _pydatabase; number = _number; } /*+ A constructor passed the database. +*/ index_t __len__() { return number; } /*+ When used as a list return the length of it. +*/ T *__getitem__(index_t index); /*+ When used as a list get a particular item from it. +*/ PythonDatabaseIter *__iter__() { return this; } /*+ When used as an iterator return itself. +*/ T *__next__() { if( next < number ) return __getitem__(next++); else return NULL; } /*+ When used as an iterator return the next item. +*/ private: index_t next=0; /*+ The next node/segment/way/relation to be returned. +*/ index_t number; /*+ The number of nodes/segments/ways/relations in total. +*/ PythonDatabase *pydatabase; /*+ A pointer to the database that this node/segment/way/relation came from. +*/ }; /* A segment iterator for nodes */ template class PythonNodeIter { public: PythonNodeIter(PythonNode *_pynode, index_t _number) { pynode = _pynode; number = _number; } /*+ A constructor passed the node. +*/ index_t __len__() { return number; } /*+ When used as a list return the length of it. +*/ T *__getitem__(index_t index); /*+ When used as a list get a particular item from it. +*/ PythonNodeIter *__iter__() { return this; } /*+ When used as an iterator return itself. +*/ T *__next__() { if( next < number ) return __getitem__(next++); else return NULL; } /*+ When used as an iterator return the next item. +*/ private: index_t next=0; /*+ The next segment to be returned. +*/ index_t number; /*+ The number of segments in total. +*/ PythonNode *pynode; /*+ A pointer to the node that these segments come from. +*/ }; #endif /* DATABASE_H */ routino-3.4.3/python/src/database.i 644 233 144 14037 14376704415 12456 0/*************************************** Python database interface definition. Part of the Routino routing software. ******************/ /****************** This file Copyright 2018 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ***************************************/ /* Name the module 'database' in the 'routino' package */ %module(package="routino.database") database /* Include the 'database.hh' header file in the auto-generated code */ %{ #include "database.hh" %} /* Typemaps for the special integer types used by Routino */ %typemap(in) index_t { $1 = PyInt_AsLong($input); } %typemap(out) index_t { $result = PyInt_FromLong($1); } %typemap(in) transport_t { $1 = PyInt_AsLong($input); } %typemap(out) transport_t { $result = PyInt_FromLong($1); } %typemap(in) transports_t { $1 = PyInt_AsLong($input); } %typemap(out) transports_t { $result = PyInt_FromLong($1); } %typemap(in) nodeflags_t { $1 = PyInt_AsLong($input); } %typemap(out) nodeflags_t { $result = PyInt_FromLong($1); } %typemap(in) highway_t { $1 = PyInt_AsLong($input); } %typemap(out) highway_t { $result = PyInt_FromLong($1); } %typemap(in) properties_t { $1 = PyInt_AsLong($input); } %typemap(out) properties_t { $result = PyInt_FromLong($1); } %typemap(in) distance_t { $1 = PyInt_AsLong($input); } %typemap(out) distance_t { $result = PyInt_FromLong($1); } /* Exception handling for the iterators */ %exception PythonDatabaseIter::__next__ { $action if (!result) { PyErr_SetString(PyExc_StopIteration, "End of iterator"); return NULL; } } %exception PythonDatabaseIter::__next__ { $action if (!result) { PyErr_SetString(PyExc_StopIteration, "End of iterator"); return NULL; } } %exception PythonDatabaseIter::__next__ { $action if (!result) { PyErr_SetString(PyExc_StopIteration, "End of iterator"); return NULL; } } %exception PythonDatabaseIter::__next__ { $action if (!result) { PyErr_SetString(PyExc_StopIteration, "End of iterator"); return NULL; } } %exception PythonNodeIter::__next__ { $action if (!result) { PyErr_SetString(PyExc_StopIteration, "End of iterator"); return NULL; } } /* Rename the internal data types to remove the 'Python' prefix */ %rename("Database") "PythonDatabase"; %rename("Node") "PythonNode"; %rename("Segment") "PythonSegment"; %rename("Way") "PythonWay"; %rename("Relation") "PythonRelation"; /* Ignore most of the constructors */ %ignore PythonDatabase::PythonDatabase; %ignore PythonNode::PythonNode; %ignore PythonSegment::PythonSegment; %ignore PythonWay::PythonWay; %ignore PythonRelation::PythonRelation; %ignore PythonDatabaseIter::PythonDatabaseIter; %ignore PythonDatabaseIter::PythonDatabaseIter; %ignore PythonDatabaseIter::PythonDatabaseIter; %ignore PythonDatabaseIter::PythonDatabaseIter; %ignore PythonNodeIter::PythonNodeIter; /* Mark the functions that create new objects so they can be garbage collected */ %newobject LoadDatabase; %newobject PythonDatabase::GetNode; %newobject PythonDatabase::GetSegment; %newobject PythonDatabase::GetWay; %newobject PythonDatabase::GetRelation; %newobject PythonDatabase::Nodes; %newobject PythonDatabase::Segments; %newobject PythonDatabase::Ways; %newobject PythonDatabase::Relations; %newobject PythonNode::Segments; %newobject PythonSegment::Node1; %newobject PythonSegment::Node2; %newobject PythonSegment::Way; %newobject PythonRelation::FromSegment; %newobject PythonRelation::ViaNode; %newobject PythonRelation::ToSegment; %newobject PythonRelation::FromWay; %newobject PythonRelation::ToWay; %newobject PythonRelation::FromNode; %newobject PythonRelation::ToNode; %newobject PythonDatabaseIter::__getitem__; %newobject PythonDatabaseIter::__next__; %newobject PythonDatabaseIter::__getitem__; %newobject PythonDatabaseIter::__next__; %newobject PythonDatabaseIter::__getitem__; %newobject PythonDatabaseIter::__next__; %newobject PythonDatabaseIter::__getitem__; %newobject PythonDatabaseIter::__next__; %newobject PythonNodeIter::__getitem__; %newobject PythonNodeIter::__next__; /* Ignore most things from the types.h file except the enumerations */ %ignore M_PI; %ignore NWAYPOINTS; %ignore LAT_LONG_SCALE; %ignore LAT_LONG_BIN; %ignore kph_to_speed; %ignore tonnes_to_weight; %ignore metres_to_height; %ignore metres_to_width; %ignore metres_to_length; %ignore HighwayType; %ignore TransportType; %ignore PropertyType; %ignore HighwayName; %ignore TransportName; %ignore PropertyName; %ignore HighwaysNameList; %ignore AllowedNameList; %ignore PropertiesNameList; %ignore HighwayList; %ignore TransportList; %ignore PropertyList; /* Use the 'database.hh' header file to generate the wrapper (everything is read-only) */ %immutable; %include "database.hh" %include "../src/types.h" /* Declare the specific templates */ %template(DatabaseNodeIter) PythonDatabaseIter; %template(DatabaseSegmentIter) PythonDatabaseIter; %template(DatabaseWayIter) PythonDatabaseIter; %template(DatabaseRelationIter) PythonDatabaseIter; %template(NodeSegmentIter) PythonNodeIter; routino-3.4.3/python/test/ 40755 233 144 0 15003125373 10653 5routino-3.4.3/python/test/run-router-tests.sh 755 233 144 1543 13364653553 14531 0#!/bin/sh # Main tests directory testdir=../../src/test # Overall status status=true # Functions for running tests run_a_test () { script=$1 shift if ./run-one-test.sh $script $@ ; then echo "... passed" else echo "... FAILED" status=false fi } compare_results () { if diff -q -r $1 $2; then echo "... matched" else echo "... match FAILED" status=false fi } # Initial informational message echo "" $testdir/is-fast-math message # Get the list of tests scripts=`echo $testdir/*.osm | sed -e s/.osm/.sh/g` # Run the scripts for script in $scripts; do echo "" echo "Testing: $script ... " run_a_test $script done # Check results if $status; then echo "Success: all tests passed" else echo "Warning: Some tests FAILED" exit 1 fi # Finish exit 0 routino-3.4.3/python/test/run-database-tests.sh 755 233 144 221 14402155001 14700 0#!/bin/sh # Python build location PYTHONPATH=`echo ../build/lib.*` export PYTHONPATH # Run the test python3 ../database.py # Finish exit 0 routino-3.4.3/python/test/run-one-test.sh 755 233 144 3172 14402154753 13577 0#!/bin/sh # Main tests directory testdir=../../src/test # Exit on error set -e # Test name name=`basename $1 .sh` # Libroutino location LD_LIBRARY_PATH=$testdir/..:$LD_LIBRARY_PATH export LD_LIBRARY_PATH # Python build location PYTHONPATH=`echo ../build/lib.*` export PYTHONPATH # Create the output directory dir=results [ -d $dir ] || mkdir $dir # Name related options osm=$testdir/$name.osm log=$name.log option_prefix="--prefix=$name" option_dir="--dir=$testdir/fat" # Generic program options option_router="--profile=motorcar --profiles=../../xml/routino-profiles.xml --translations=$testdir/copyright.xml" # Run waypoints program run_waypoints() { perl $testdir/waypoints.pl $@ } # Run planetsplitter run_planetsplitter() { echo "Skipping planetsplitter" } # Run filedumper run_filedumper() { echo "Skipping filedumper" } # Run the router run_router() { waypoint=$1 shift [ -d $dir/$name-$waypoint ] || mkdir $dir/$name-$waypoint echo ../router.py $option_dir $option_prefix $option_osm $option_router $@ >> $log ../router.py $option_dir $option_prefix $option_osm $option_router $@ >> $log mv shortest* $dir/$name-$waypoint echo diff -u $testdir/expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt >> $log if $testdir/is-fast-math; then diff -U 0 $testdir/expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt | 2>&1 egrep '^[-+] ' || true else diff -u $testdir/expected/$name-$waypoint.txt $dir/$name-$waypoint/shortest-all.txt >> $log fi } # Run the specific test script . $testdir/$name.sh # Finish exit 0 routino-3.4.3/python/test/Makefile 644 233 144 2325 13372030354 12332 0# Test cases Makefile # # Part of the Routino routing software. # # This file Copyright 2011-2015, 2018 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../../Makefile.conf TESTDIR=../../src/test # Executables EXE=$(TESTDIR)/is-fast-math$(.EXE) ######## all: ######## test: $(EXE) @./run-router-tests.sh @./run-database-tests.sh ######## $(EXE): cd $(TESTDIR) && $(MAKE) test ######## install: ######## clean: rm -rf results rm -f *.log rm -f *~ ######## distclean: clean ######## .PHONY:: all test install clean distclean routino-3.4.3/python/Makefile 644 233 144 7124 14405342572 11363 0# Python interface Makefile # # Part of the Routino routing software. # # This file Copyright 2018, 2019, 2023 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # All configuration is in the top-level Makefile.conf include ../Makefile.conf # Programs PYTHON=python3 SWIG=swig # Compilation targets PY_FILES=$(wildcard src/*.py) C_FILES=$(wildcard src/*.c) CC_FILES=$(wildcard src/*.cc) SWIG_C=src/_router.c SWIG_CC=src/_database.cc SWIG_PY=src/router.py src/database.py ifneq ($(HOST),MINGW) LIBROUTINO=../src/libroutino.so else LIBROUTINO=../src/routino.dll endif BUILD_TIMESTAMP=build/.timestamp # Check that we have Python3 and swig installed # Note: We need to use swig here and not have it called from setup.py because # setuptools copies 'py_modules' before building 'ext_modules' so will # miss the python files that are generated by swig. HAVE_PYTHON=$(shell $(PYTHON) --version 2> /dev/null) HAVE_SWIG=$(shell $(SWIG) -version 2> /dev/null) ifeq ($(HAVE_PYTHON),) $(warning Python3 not installed - skipping Python module creation) endif ifeq ($(HAVE_SWIG),) $(warning Swig not installed - skipping Python module creation) endif ######## all: $(and $(HAVE_SWIG),$(HAVE_PYTHON),all-if-python) all-if-python: $(BUILD_TIMESTAMP) ######## $(BUILD_TIMESTAMP): $(SWIG_C) $(SWIG_CC) $(SWIG_PY) $(PY_FILES) $(C_FILES) $(CC_FILES) $(LIBROUTINO) setup.py @rm -f $@ CFLAGS= LDFLAGS= $(PYTHON) setup.py build && touch $(BUILD_TIMESTAMP) src/_router.c : src/router.i ../src/routino.h $(SWIG) -python -o $@ $< src/router.py : src/_router.c @true # fake rule since src/router.py is created by the same rule as src/_router.c src/_database.cc : src/database.i src/database.hh $(SWIG) -c++ -python -o $@ $< src/database.py : src/_database.cc @true # fake rule since src/database.py is created by the same rule as src/_database.cc $(LIBROUTINO): cd ../src && $(MAKE) all-lib ######## test: $(and $(HAVE_SWIG),$(HAVE_PYTHON),test-if-python) test-if-python: $(BUILD_TIMESTAMP) cd test && $(MAKE) test ######## install: $(and $(HAVE_SWIG),$(HAVE_PYTHON),install-if-python) install-if-python: all @echo "WARNING: '$(PYTHON) setup.py install' is not supported by Python v3.10 and above." @echo "WARNING: This Makefile therefore no longer tries to install the Routino module." @echo "WARNING: You could try this to install it but it might not work on your system:" @echo "WARNING: $(PYTHON) -m pip $(DESTDIR)$(prefix)" @echo "WARNING: You could try this to build a Python 'wheel' and install that manually:" @echo "WARNING: $(PYTHON) -m build --wheel" -@false ######## clean: clean-local cd test && $(MAKE) $@ clean-local: rm -f *~ rm -rf build rm -rf dist rm -rf Routino.egg-info rm -f $(SWIG_C) rm -f $(SWIG_CC) rm -f $(SWIG_PY) ######## distclean: distclean-local cd test && $(MAKE) $@ distclean-local: clean-local ######## .PHONY:: all test install clean distclean .PHONY:: all-if-python test-if-python install-if-python .PHONY:: clean-local distclean-local routino-3.4.3/python/router.py 755 233 144 32435 13657511237 11647 0#!/usr/bin/python3 ########################################## # OSM router calling libroutino library from Python. # # Part of the Routino routing software. ########################################## # This file Copyright 2018 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . ########################################## import argparse import sys import os import math import routino.router as routino # Parse the command line arguments argparser = argparse.ArgumentParser(description="Calculates a route using Routino and command line data.") argparser.add_argument("--version", dest="version", action='store_false', help="Print the version of Routino.") argparser.add_argument("--dir", dest="dirname", type=str, default=None, help="The directory containing the routing database.") argparser.add_argument("--prefix", dest="prefix", type=str, default=None, help="The filename prefix for the routing database.") argparser.add_argument("--profiles", dest="profiles", type=str, default=None, help="The name of the XML file containing the profiles (defaults to 'profiles.xml' with '--dir' and '--prefix' options).") argparser.add_argument("--translations", dest="translations", type=str, default=None, help="The name of the XML file containing the translations (defaults to 'translations.xml' with '--dir' and '--prefix' options).") argparser.add_argument("--reverse", dest="reverse", action='store_true', help="Find a route between the waypoints in reverse order.") argparser.add_argument("--loop", dest="loop", action='store_true', help="Find a route that returns to the first waypoint.") argparser.add_argument("--output-html", dest="html", action='store_true', help="Write an HTML description of the route.") argparser.add_argument("--output-gpx-track", dest="gpx_track", action='store_true', help="Write a GPX track file with all route points.") argparser.add_argument("--output-gpx-route", dest="gpx_route", action='store_true', help="Write a GPX route file with interesting junctions.") argparser.add_argument("--output-text", dest="text", action='store_true', help="Write a plain text file with interesting junctions.") argparser.add_argument("--output-text-all", dest="text_all", action='store_true', help="Write a plain text file with all route points.") argparser.add_argument("--output-none", dest="none", action='store_true', help="Don't write any output files or read any translations. (If no output option is given then all are written.)") argparser.add_argument("--output-stdout", dest="use_stdout", action='store_true', help="Write to stdout instead of a file (requires exactly one output format option, implies '--quiet').") argparser.add_argument("--list-html", dest="list_html", action='store_true', help="Create an HTML list of the route.") argparser.add_argument("--list-html-all", dest="list_html_all", action='store_true', help="Create an HTML list of the route with all points.") argparser.add_argument("--list-text", dest="list_text", action='store_true', help="Create a plain text list with interesting junctions.") argparser.add_argument("--list-text-all", dest="list_text_all", action='store_true', help="Create a plain text list with all route points.") argparser.add_argument("--profile", dest="profilename", type=str, default=None, help="Select the loaded profile with this name.") argparser.add_argument("--language", dest="language", type=str, default=None, help="Use the translations for specified language.") argparser.add_argument("--quickest", dest="shortest", action='store_false', help="Find the quickest route between the waypoints.") argparser.add_argument("--shortest", dest="shortest", action='store_true', help="Find the shortest route between the waypoints.") argparser.add_argument("--lon", dest="lons", action='append', type=float, help="Specify the longitude of the next waypoint (can also use '--lon' to specify the n'th longitude).") argparser.add_argument("--lat", dest="lats", action='append', type=float, help="Specify the latitude of the next waypoint (can also use '--lat' to specify the n'th latitude).") for i in range(1,99): argparser.add_argument("--lon"+str(i), dest="lon"+str(i), type=float, help=argparse.SUPPRESS) argparser.add_argument("--lat"+str(i), dest="lat"+str(i), type=float, help=argparse.SUPPRESS) args = argparser.parse_args() # Check the specified command line options if args.use_stdout and (int(args.html)+int(args.gpx_track)+int(args.gpx_route)+int(args.text)+int(args.text_all))!=1: print("Error: The '--output-stdout' option requires exactly one other output option (but not '--output-none').") sys.exit(1) if not args.html and not args.gpx_track and not args.gpx_route and not args.text and not args.text_all and not args.none: args.html=True args.gpx_track=True args.gpx_route=True args.text=True args.text_all=True # Load in the selected profiles if args.profiles is not None: if not os.access(args.profiles,os.F_OK): print("Error: The '--profiles' option specifies a file '{:s}' that does not exist.".format(args.profiles)) sys.exit(1) else: args.profiles=routino.FileName(args.dirname,args.prefix,"profiles.xml") if not os.access(args.profiles,os.F_OK): defaultprofiles = routino.FileName("../xml/","routino","profiles.xml") if not os.access(defaultprofiles,os.F_OK): print("Error: The '--profiles' option was not used and the files '{:s}' and '{:s}' do not exist.".format(args.profiles,defaultprofiles)) sys.exit(1) args.profiles=defaultprofiles if args.profilename is None: print("Error: A profile name must be specified") sys.exit(1) if routino.ParseXMLProfiles(args.profiles): print("Error: Cannot read the profiles in the file '{:s}'.".format(args.profiles)) sys.exit(1) profile=routino.GetProfile(args.profilename) if profile is None: list = routino.GetProfileNames() print("Error: Cannot find a profile called '{:s}' in the file '{:s}'.".format(args.profilename,args.profiles)) print("Profiles available are: {:s}.".format(", ".join(list))) sys.exit(1) # Load in the selected translation if args.translations is not None: if not os.access(args.translations,os.F_OK): print("Error: The '--translations' option specifies a file '{:s}' that does not exist.".format(args.translations)) sys.exit(1) else: args.translations=routino.FileName(args.dirname,args.prefix,"translations.xml") if not os.access(translations,os.F_OK): defaulttranslations = routino.FileName("../xml/","routino","translations.xml") if not os.access(defaulttranslations,os.F_OK): print("Error: The '--translations' option was not used and the files '{:s}' and '{:s}' do not exist.".format(args.translations,defaulttranslations)) sys.exit(1) args.translations=defaulttranslations if routino.ParseXMLTranslations(args.translations): print("Error: Cannot read the translations in the file '{:s}'.".format(args.translations)) sys.exit(1) if args.language is not None: translation = routino.GetTranslation(args.language) if translation is None: list1 = routino.GetTranslationLanguages() list2 = routino.GetTranslationLanguageFullNames() print("Error: Cannot find a translation called '{:s}' in the file '{:s}'.".format(args.language,args.translations)) print("Languages available are: {:s}".format(", ".join([i1+" ("+i2+")" for i1,i2 in zip(list1,list2)]))) sys.exit(1) else: translation = routino.GetTranslation("") # first in file if translation is None: print("Error: No translations in '{:s}'.".format(args.translations)) sys.exit(1) # Create the numbered waypoints firstlatlon = True for i in range(1,99): lon = getattr(args,"lon"+str(i),None) lat = getattr(args,"lat"+str(i),None) if lon is None and lat is None: continue if lon is None or lat is None: print("Error: All waypoints must have latitude and longitude.") sys.exit(1) if firstlatlon: if args.lats is not None or args.lons is not None: print("Error: Mixing numbered and un-numbered waypoints is not allowed.") sys.exit(1) else: firstlatlon = False args.lons = [] args.lats = [] args.lons.append(lon) args.lats.append(lat) # Check the waypoints are valid if args.lats is None or len(args.lats) < 2 or args.lons is None or len(args.lons) < 2: print("Error: At least two waypoints must be specified.") sys.exit(1) if len(args.lats) != len(args.lons): print("Error: Number of latitudes ({:d}) and longitudes ({:d}) do not match.".format(len(lats),len(lons))) sys.exit(1) # Load in the routing database database = routino.LoadDatabase(args.dirname,args.prefix) if database is None: print("Error: Could not load Routino database.") sys.exit(1) # Check the profile is valid for use with this database if routino.ValidateProfile(database,profile)!=routino.ERROR_NONE: print("Error: Profile is invalid or not compatible with database.") sys.exit(1) # Loop through all waypoints nwaypoints = 0 waypoints = [] for n in range(len(args.lats)): waypoint = routino.FindWaypoint(database, profile, args.lats[n], args.lons[n]) if waypoint is None: print("Error: Cannot find node close to specified point {:d}.",n); sys.exit(1) waypoints.append(waypoint) # Create the route routing_options=0 if args.shortest: routing_options |= routino.ROUTE_SHORTEST else: routing_options |= routino.ROUTE_QUICKEST if args.html : routing_options |= routino.ROUTE_FILE_HTML if args.gpx_track: routing_options |= routino.ROUTE_FILE_GPX_TRACK if args.gpx_route: routing_options |= routino.ROUTE_FILE_GPX_ROUTE if args.text : routing_options |= routino.ROUTE_FILE_TEXT if args.text_all : routing_options |= routino.ROUTE_FILE_TEXT_ALL if args.list_html : routing_options |= routino.ROUTE_LIST_HTML if args.list_html_all: routing_options |= routino.ROUTE_LIST_HTML_ALL if args.list_text : routing_options |= routino.ROUTE_LIST_TEXT if args.list_text_all: routing_options |= routino.ROUTE_LIST_TEXT_ALL if args.reverse: routing_options |= routino.ROUTE_REVERSE if args.loop : routing_options |= routino.ROUTE_LOOP #def progress(fraction): # print("Progress: {:.0f}%".format(fraction*100.0)) # return 1 # #route = routino.CalculateRoute(database, profile, translation, waypoints, routing_options, progress) route = routino.CalculateRoute(database, profile, translation, waypoints, routing_options) if routino.errno >= routino.ERROR_NO_ROUTE_1: print("Error: Cannot find a route between specified waypoints") sys.exit(1) if routino.errno != routino.ERROR_NONE: print("Error: Internal error ({:d}).".format(routino.errno)) sys.exit(1) # Print the list output if args.list_html or args.list_html_all or args.list_text or args.list_text_all: list=route first=True last=False while list: if list.next: last = False else: last = True print("----------------") print("Lon,Lat: {:.5f}, {:.5f}".format((180.0/math.pi)*list.lon,(180.0/math.pi)*list.lat)) if args.list_html or args.list_html_all or args.list_text or args.list_text_all: print("Dist,Time: {:.3f} km, {:.1f} minutes".format(list.dist,list.time)) if args.list_text_all and not first: print("Speed: {:0f} km/hr".format(list.speed)) print("Point type: {:d}".format(list.type)) if (args.list_html or args.list_html_all or args.list_text) and not first and not last: print("Turn: {:d} degrees".format(list.turn)) if ((args.list_html or args.list_html_all or args.list_text) and not last) or (args.list_text_all and not first): print("Bearing: {:d} degrees".format(list.bearing)) if ((args.list_html or args.list_text) and not last) or (args.list_html_all and list.name) or (args.list_text_all and not first): print("Name: {:s}".format(list.name)) if args.list_html or (args.list_html_all and list.name): print("Desc1: {:s}".format(list.desc1)) print("Desc2: {:s}".format(list.desc2)) if not last: print("Desc3: {:s}".format(list.desc3)) list = list.next first = False # Tidy up and exit routino.DeleteRoute(route) routino.UnloadDatabase(database) routino.FreeXMLProfiles() routino.FreeXMLTranslations() routino-3.4.3/python/database.py 755 233 144 20403 13372623265 12062 0#!/usr/bin/python3 ########################################## # Routino database access from Python. # # Part of the Routino routing software. ########################################## # This file Copyright 2018 Andrew M. Bishop # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . ########################################## import routino.database # Database, access all attributes database = routino.database.LoadDatabase("../../src/test/fat", "turns") if database is None: database = routino.database.LoadDatabase("../src/test/fat", "turns") if database is None: print("Failed to load database") exit(1) print(database) database_attrs = ['nnodes', 'nsegments', 'nways', 'nrelations'] for attr in database_attrs: print(" Attribute: " + attr + " =", getattr(database, attr)) print("") # A single node, access all attributes and all functions node=database.GetNode(0) print("1st node =", node) node_attrs = ['id', 'firstsegment', 'latitude', 'longitude', 'allow', 'flags'] node_infos = ['', '', 'degrees', 'degrees', '[note 1]', '[note 2]'] for attr,info in zip(node_attrs,node_infos): print(" Attribute: " + attr + " =", getattr(node, attr), info) segments = node.Segments() print(" Function: " + "Segments()" + " = [" + ", ".join([str(segments[x]) for x in range(len(segments))]) + "]") print("") # A single segment, access all attributes and all functions segment=database.GetSegment(0) print("1st segment =", segment) segment_attrs = ['id', 'node1', 'node2', 'next2', 'way', 'distance', 'flags'] segment_infos = ['', '', '', '', '', 'km', '[note 3]'] for attr,info in zip(segment_attrs,segment_infos): print(" Attribute: " + attr + " =", getattr(segment, attr), info) print(" Function: " + "Node1()" + " = " + str(segment.Node1())) print(" Function: " + "Node2()" + " = " + str(segment.Node2())) print(" Function: " + "Way()" + " = " + str(segment.Way())) print("") # A single way, access all attributes and all functions way=database.GetWay(0) print("1st way =", way) way_attrs = ['id', 'name', 'allow', 'type', 'props', 'speed', 'weight', 'height', 'width', 'length'] way_infos = ['', '', '[note 1]', '[note 4]', '[note 5]', 'km/hr [note 6]', 'tonnes [note 6]', 'metres [note 6]', 'metres [note 6]', 'metres [note 6]'] for attr,info in zip(way_attrs,way_infos): print(" Attribute: " + attr + " =", getattr(way, attr), info) print("") # A single relation, access all attributes and all functions relation=database.GetRelation(0) print("1st relation =", relation) relation_attrs = ['id', 'from_seg', 'via_node', 'to_seg', 'from_way', 'to_way', 'from_node', 'to_node', 'except_transport'] relation_infos = ['', '', '', '', '', '', '', '', '[note 7]'] for attr,info in zip(relation_attrs,relation_infos): print(" Attribute: " + attr + " =", getattr(relation, attr), info) print(" Function: " + "FromSegment()" + " = " + str(relation.FromSegment())) print(" Function: " + "ViaNode()" + " = " + str(relation.ViaNode())) print(" Function: " + "ToSegment()" + " = " + str(relation.ToSegment())) print(" Function: " + "FromWay()" + " = " + str(relation.FromWay())) print(" Function: " + "ToWay()" + " = " + str(relation.ToWay())) print(" Function: " + "FromNode()" + " = " + str(relation.FromNode())) print(" Function: " + "ToNode()" + " = " + str(relation.ToNode())) print("") # The list of nodes as a list and an iterable (just the first 4) nodes=database.Nodes() print("len(database.Nodes()) = " + str(len(nodes))) print("database.Nodes() = [" + ", ".join([str(nodes[x]) for x in range(4)]) + ", ...]") for node in nodes: if node.id == 4: break print(node) print("") # The list of segments as a list and an iterable (just the first 4) segments=database.Segments() print("len(database.Segments()) = " + str(len(segments))) print("database.Segments() = [" + ", ".join([str(segments[x]) for x in range(4)]) + ", ...]") for segment in segments: if segment.id == 4: break print(segment) print("") # The list of ways as a list and an iterable (just the first 4) ways=database.Ways() print("len(database.Ways()) = " + str(len(ways))) print("database.Ways() = [" + ", ".join([str(ways[x]) for x in range(4)]) + ", ...]") for way in ways: if way.id == 4: break print(way) print("") # The list of relations as a list and an iterable (just the first 4) relations=database.Relations() print("len(database.Relations()) = " + str(len(relations))) print("database.Relations() = [" + ", ".join([str(relations[x]) for x in range(4)]) + ", ...]") for relation in relations: if relation.id == 4: break print(relation) print("") # Enumerated lists transports_enum = ["Transports_None", "Transports_Foot", "Transports_Horse", "Transports_Wheelchair", "Transports_Bicycle", "Transports_Moped", "Transports_Motorcycle", "Transports_Motorcar", "Transports_Goods", "Transports_HGV", "Transports_PSV", "Transports_ALL"] nodeflags_enum = ["Nodeflag_Super", "Nodeflag_U_Turn", "Nodeflag_Mini_Roundabout", "Nodeflag_Turn_Restrict", "Nodeflag_Turn_Restrict2"] segmentflags_enum = ["Segmentflag_Area", "Segmentflag_Oneway_1to2", "Segmentflag_Oneway_2to1", "Segmentflag_Super", "Segmentflag_Normal"] properties_enum = ["Properties_None", "Properties_Paved", "Properties_Multilane", "Properties_Bridge", "Properties_Tunnel", "Properties_FootRoute", "Properties_BicycleRoute", "Properties_ALL"] highway_enum = ["Highway_Motorway", "Highway_Trunk", "Highway_Primary", "Highway_Secondary", "Highway_Tertiary", "Highway_Unclassified", "Highway_Residential", "Highway_Service", "Highway_Track", "Highway_Cycleway", "Highway_Path", "Highway_Steps", "Highway_Ferry", "Highway_Count", "Highway_CycleBothWays", "Highway_OneWay", "Highway_Roundabout", "Highway_Area"] def print_enum(list): for item in list: print(" routino.database."+item) print("Note 1: The Node's and Way's 'allow' parameter can be the combination of these enumerated values:") print_enum(transports_enum) print("") print("Note 2: The Node's 'flags' parameter can be the combination of these enumerated values:") print_enum(nodeflags_enum) print("") print("Note 3: The Segment's 'flags' parameter can be the combination of these enumerated values:") print_enum(segmentflags_enum) print("") print("Note 4: The Way's 'type' parameter can be one the combination of these enumerated values:") print_enum(highway_enum) print("") print("Note 5: The Way's 'props' parameter can be the combination of these enumerated values:") print_enum(properties_enum) print("") print("Note 6: A value of zero for a Way's speed, weight, height, width or length means that there is no limit.") print("") print("Note 7: The Relation's 'except_transport' parameter can be the combination of these enumerated values:") print_enum(transports_enum) print("") import gc gc.collect() routino-3.4.3/python/README.txt 644 233 144 4036 13535224522 11415 0 ROUTINO PYTHON ============== This directory contains a Python version 3 interface to the Routino routing database that allows routes to be calculated and the database to be accessed. Compilation ----------- To compile the Python module run 'make'. A working Python 3 installation and the Swig tool are required to be able to compile this Python module. If they are not available then a warning will be printed but no error occur. Running 'make' in the top level directory will also try to build the module. Testing ------- To run the test scripts run 'make test'. The tests verify that the results of the Python version are identical to the results of the compiled version. Running 'make test' in the top level directory will also try to run the tests for the Python module. Installation ------------ To install the Python module run 'make install'. The installation directory is the one defined in 'Makefile.conf'. Running 'make install' in the top level directory will also try to install the module. Using - Router -------------- To use the Python module normally it must be installed and the libroutino library must also be installed in a directory that is searched for libraries. The Python example router 'router.py' accepts the same command line arguments as the compiled versions. The Python module supports exactly the same functionality as the Routino library (libroutino) because it is implemented simply as a wrapper around that library. The documentation for using the library (and therefore the Python module) is available in the files "doc/LIBRARY.txt" and "doc/html/library.html". Using - Database ---------------- To use the Python module normally it must be installed, the libroutino library is not required for the database access functions. The Python script 'database.py' is an example of using the Python module for accessing a Routino database (one created by 'make test'). No further documentation is provided, all possible features are used in the example script. routino-3.4.3/python/pyproject.toml 644 233 144 121 14403103334 12572 0[build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta"