routino-3.4.1/ 40755 233 144 0 14450044533 6354 5routino-3.4.1/src/ 40755 233 144 0 14450050342 7136 5routino-3.4.1/src/planetsplitter.c 644 233 144 55254 14437671417 12444 0/*************************************** OSM planet file splitter. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2017, 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 "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.1/src/types.h 644 233 144 34337 13455661565 10544 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. +*/ #define NODE_FAKE ((index_t)0xffff0000) /*+ The lowest number allowed for a fake segment. +*/ #define SEGMENT_FAKE ((index_t)0xffff0000) /*+ 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.1/src/ways.h 644 233 144 12352 13455415301 10335 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.1/src/superx.c 644 233 144 37301 14242177043 10677 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.1/src/sorting.c 644 233 144 67714 14450050342 11042 0/*************************************** Merge sort functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2009-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 #include #include #if defined(USE_PTHREADS) && USE_PTHREADS #include #endif #include "types.h" #include "logging.h" #include "files.h" #include "sorting.h" /* 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 */ #if defined(USE_PTHREADS) && USE_PTHREADS static pthread_mutex_t running_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t running_cond = PTHREAD_COND_INITIALIZER; #endif /* Thread helper functions */ static void *filesort_fixed_heapsort_thread(thread_data *thread); static void *filesort_vary_heapsort_thread(thread_data *thread); /*++++++++++++++++++++++++++++++++++++++ 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 *fds=NULL,*heap=NULL; int nfiles=0,ndata=0; index_t count_out=0,count_in=0,total=0; size_t nitems,item; char *data; void **datap; thread_data *threads; int i,more=1; char *filename=(char*)malloc_logassert(strlen(option_tmpdirname)+24); #if defined(USE_PTHREADS) && USE_PTHREADS int nthreads=0; #endif /* Allocate the RAM buffer and other bits */ nitems=(size_t)SizeFileFD(fd_in)/itemsize; if(nitems==0) return(0); if((nitems*(itemsize+sizeof(void*)))<(option_filesort_ramsize/option_filesort_threads)) /* use one thread */ nitems=nitems+1; else if((nitems*(itemsize+sizeof(void*)))1) { /* If all threads are in use wait for an existing thread to finish */ if(nthreads==option_filesort_threads) { pthread_mutex_lock(&running_mutex); while(nthreads==option_filesort_threads) { for(i=0;i1 && nthreads) { pthread_mutex_lock(&running_mutex); pthread_cond_wait(&running_cond,&running_mutex); 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)) { WriteFileBuffered(fd_out,datap[heap[index]],itemsize); count_out++; } if(ReadFileBuffered(fds[heap[index]],datap[heap[index]],itemsize)) { heap[index]=heap[ndata]; ndata--; } /* 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 */ tidy_and_exit: if(fds) { for(i=0;i1) { /* If all threads are in use wait for an existing thread to finish */ if(nthreads==option_filesort_threads) { pthread_mutex_lock(&running_mutex); while(nthreads==option_filesort_threads) { for(i=0;ilargestitemsize) largestitemsize=itemsize; ramused+=itemsize; ramused =FILESORT_VARALIGN*((ramused+FILESORT_VARALIGN-1)/FILESORT_VARALIGN); ramused+=FILESORT_VARALIGN-FILESORT_VARSIZE; total++; threads[thread].n++; } else ramused-=FILESORT_VARSIZE; count_in++; if(ReadFileBuffered(fd_in,&nextitemsize,FILESORT_VARSIZE)) { more=0; break; } } /* No new data read in this time round */ if(threads[thread].n==0) break; /* Shortcut if only one file, don't write to disk */ if(more==0 && nfiles==0) filesort_heapsort(threads[thread].datap,threads[thread].n,threads[thread].compare); else { /* Create the file descriptor (not thread-safe) */ sprintf(filename,"%s/filesort.%d.tmp",option_tmpdirname,nfiles); threads[thread].fd=OpenFileBufferedNew(filename); if(option_filesort_threads==1) { filesort_vary_heapsort_thread(&threads[thread]); CloseFileBuffered(threads[thread].fd); } #if defined(USE_PTHREADS) && USE_PTHREADS else { pthread_mutex_lock(&running_mutex); threads[thread].running=1; pthread_mutex_unlock(&running_mutex); pthread_create(&threads[thread].thread,NULL,(void* (*)(void*))filesort_vary_heapsort_thread,&threads[thread]); nthreads++; } #endif } nfiles++; } while(more); /* Wait for all of the threads to finish */ #if defined(USE_PTHREADS) && USE_PTHREADS while(option_filesort_threads>1 && nthreads) { pthread_mutex_lock(&running_mutex); pthread_cond_wait(&running_cond,&running_mutex); 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; FILESORT_VARINT itemsize; if(!post_sort_function || post_sort_function(datap[heap[index]],count_out)) { itemsize=*(FILESORT_VARINT*)((char*)datap[heap[index]]-FILESORT_VARSIZE); WriteFileBuffered(fd_out,(char*)datap[heap[index]]-FILESORT_VARSIZE,itemsize+FILESORT_VARSIZE); count_out++; } 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 */ tidy_and_exit: if(fds) { for(i=0;idatap,thread->n,thread->compare); /* Write the result to the given temporary file */ if(thread->fd > 0) for(item=0;itemn;item++) WriteFileBuffered(thread->fd,thread->datap[item],thread->itemsize); #if defined(USE_PTHREADS) && USE_PTHREADS if(option_filesort_threads>1) { pthread_mutex_lock(&running_mutex); thread->running=2; pthread_cond_signal(&running_cond); pthread_mutex_unlock(&running_mutex); } #endif return(NULL); } /*++++++++++++++++++++++++++++++++++++++ A wrapper function that can be run in a thread for variable data. void *filesort_vary_heapsort_thread Returns NULL (required to return void*). thread_data *thread The data to be processed in this thread. ++++++++++++++++++++++++++++++++++++++*/ static void *filesort_vary_heapsort_thread(thread_data *thread) { size_t item; /* Sort the data pointers using a heap sort */ filesort_heapsort(thread->datap,thread->n,thread->compare); /* Write the result to the given temporary file */ if(thread->fd > 0) 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 if(option_filesort_threads>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; } } } } routino-3.4.1/src/waysx.h 644 233 144 12733 13547422350 10534 0/*************************************** A header file for the extended Ways structure. 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 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.1/src/mman-win32.h 644 233 144 5064 12531126220 11215 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.1/src/segments.c 644 233 144 24107 13455663676 11217 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.1/src/results.h 644 233 144 10356 13066777144 11073 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.1/src/errorlogx.h 644 233 144 4555 13454331526 11370 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.1/src/results.c 644 233 144 16770 13517016361 11060 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.1/src/tagging.c 644 233 144 66152 14375733225 11006 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 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(sizeof(TaggingRuleList),1); 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(sizeof(TagList),1)); } /*++++++++++++++++++++++++++++++++++++++ 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.1/src/osmparser.h 644 233 144 4264 14450041353 11346 0/*************************************** Header file for OSM parser function prototype. 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 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 ProcessNodeTags(TagList *tags,int64_t node_id,double latitude,double longitude,int mode); void ProcessWayTags(TagList *tags,int64_t way_id, int mode); void ProcessRelationTags(TagList *tags,int64_t relation_id,int mode); #endif /* OSMPARSER_H */ routino-3.4.1/src/routino.c 644 233 144 53525 13716543132 11057 0/*************************************** Routino library functions file. Part of the Routino routing software. ******************/ /****************** This file Copyright 2015-2017, 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 "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(sizeof(Routino_Database),1); 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(sizeof(Routino_Waypoint),1); 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(sizeof(Results*),nwaypoints); 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.1/src/test/ 40755 233 144 0 14441357437 10134 5routino-3.4.1/src/test/oneway-loop.sh 777 233 144 0 12064636362 15773 2start-1-finish.shroutino-3.4.1/src/test/loop-and-reverse.osm 644 233 144 7304 12606772336 14056 0 routino-3.4.1/src/test/coincident-waypoint.sh 777 233 144 0 12333356554 16041 2a-b-c-d.shroutino-3.4.1/src/test/a-b-c.sh 755 233 144 1103 13364652274 11361 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.1/src/test/loop-and-reverse.sh 755 233 144 1302 13364652316 13662 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.1/src/test/node-restrictions.sh 777 233 144 0 12064636362 17175 2start-1-finish.shroutino-3.4.1/src/test/dead-ends.osm 644 233 144 16570 12326256227 12540 0 routino-3.4.1/src/test/loops.sh 777 233 144 0 12064636362 14656 2start-1-finish.shroutino-3.4.1/src/test/roundabout-waypoints.osm 644 233 144 10276 12327506431 15122 0 routino-3.4.1/src/test/no-super.osm 644 233 144 11616 12064636362 12461 0 routino-3.4.1/src/test/prune-short.sh 777 233 144 0 12114364765 15352 2only-split.shroutino-3.4.1/src/test/turns.sh 777 233 144 0 12064636362 14675 2start-1-finish.shroutino-3.4.1/src/test/is-fast-math.c 644 233 144 450 12154147145 12560 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.1/src/test/a-b-c-d.sh 755 233 144 1202 13364652253 11577 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.1/src/test/run-one-test.sh 755 233 144 5077 13452410701 13041 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.1/src/test/super-or-not.sh 777 233 144 0 12064636362 13762 2a-b.shroutino-3.4.1/src/test/expected/ 40755 233 144 0 12725336336 11733 5routino-3.4.1/src/test/expected/roundabout-waypoints-WP06.txt 644 233 144 1577 12601522406 17415 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.1/src/test/expected/loops-WP09.txt 644 233 144 3465 12601522413 14333 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.1/src/test/expected/node-restrictions-WP05.txt 644 233 144 3416 12601522410 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.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.1/src/test/expected/dead-ends-WP01.txt 644 233 144 2307 12601522417 15011 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.1/src/test/expected/turns-WP13.txt 644 233 144 6657 12725336245 14370 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.1/src/test/expected/node-restrictions-WP06.txt 644 233 144 3416 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.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.1/src/test/expected/dead-ends-WP06.txt 644 233 144 2557 12601522416 15024 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.1/src/test/expected/coincident-waypoint-WP04.txt 644 233 144 1202 12601522420 17142 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.1/src/test/expected/no-super-WP02.txt 644 233 144 1057 12601522412 14732 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.1/src/test/expected/turns-WP06.txt 644 233 144 3650 12725335772 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.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.1/src/test/expected/turns-WP04.txt 644 233 144 3767 12725335624 14367 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.1/src/test/expected/turns-WP01.txt 644 233 144 2530 12725335423 14344 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.1/src/test/expected/turns-WP08.txt 644 233 144 4467 12725336077 14374 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.1/src/test/expected/dead-ends-WP03.txt 644 233 144 3025 12601522417 15011 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.1/src/test/expected/loops-WP05.txt 644 233 144 3345 12601522414 14325 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.1/src/test/expected/turns-WP02.txt 644 233 144 2411 12725335500 14337 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.1/src/test/expected/cycle-both-ways-WP02.txt 644 233 144 2203 12601522417 16173 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.1/src/test/expected/turns-WP14.txt 644 233 144 6540 12725336307 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.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.1/src/test/expected/loops-WP04.txt 644 233 144 3464 12601522414 14326 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.1/src/test/expected/super-or-not-WP04.txt 644 233 144 1602 12635017000 15531 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.1/src/test/expected/loop-and-reverse-WP-R.txt 644 233 144 1327 12606772160 16415 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.1/src/test/expected/dead-ends-WP02.txt 644 233 144 2557 12601522417 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.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.1/src/test/expected/node-restrictions-WP02.txt 644 233 144 3426 12601522411 16636 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.1/src/test/expected/super-or-not-WP01.txt 644 233 144 1603 12635016647 15547 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.1/src/test/expected/coincident-waypoint-WP03.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.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.1/src/test/expected/no-super-WP01.txt 644 233 144 2121 12601522412 14722 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.1/src/test/expected/loop-and-reverse-WP.txt 644 233 144 1327 12606772160 16216 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.1/src/test/expected/oneway-loop-WP01.txt 644 233 144 2325 12601522410 15427 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.1/src/test/expected/dead-ends-WP10.txt 644 233 144 3025 12601522415 15005 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.1/src/test/expected/turns-WP12.txt 644 233 144 4601 12725336204 14345 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.1/src/test/expected/fake-node-with-loop-WP01.txt 644 233 144 2546 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.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.1/src/test/expected/node-restrictions-WP08.txt 644 233 144 3152 12601522410 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.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.1/src/test/expected/dead-ends-WP09.txt 644 233 144 2557 12601522415 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.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.1/src/test/expected/turns-WP11.txt 644 233 144 4601 12725336173 14351 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.1/src/test/expected/loop-and-reverse-WP-L.txt 644 233 144 1713 12606772160 16406 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.1/src/test/expected/loops-WP08.txt 644 233 144 3465 12601522413 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.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.1/src/test/expected/roundabout-waypoints-WP04.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.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.1/src/test/expected/loops-WP07.txt 644 233 144 3346 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* 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.1/src/test/expected/turns-WP03.txt 644 233 144 2411 12725335533 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 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.1/src/test/expected/roundabout-waypoints-WP05.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 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.1/src/test/expected/turns-WP15.txt 644 233 144 6540 12725336336 14362 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.1/src/test/expected/loops-WP01.txt 644 233 144 3344 12601522414 14320 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.1/src/test/expected/coincident-waypoint-WP02.txt 644 233 144 1322 12601522420 17143 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.1/src/test/expected/turns-WP09.txt 644 233 144 4467 12725336134 14367 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.1/src/test/expected/node-restrictions-WP07.txt 644 233 144 3152 12601522410 16636 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.1/src/test/expected/no-super-WP04.txt 644 233 144 2237 12601522412 14735 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.1/src/test/expected/turns-WP05.txt 644 233 144 3650 12725335745 14363 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.1/src/test/expected/node-restrictions-WP03.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.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.1/src/test/expected/loops-WP03.txt 644 233 144 3464 12601522541 14326 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.1/src/test/expected/node-restrictions-WP01.txt 644 233 144 3426 12601522411 16635 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.1/src/test/expected/loops-WP11.txt 644 233 144 3345 12601522564 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.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.1/src/test/expected/super-or-not-WP05.txt 644 233 144 1602 12635017465 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.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.1/src/test/expected/roundabout-waypoints-WP02.txt 644 233 144 1577 12601522407 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.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.1/src/test/expected/turns-WP07.txt 644 233 144 5056 12725336032 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.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.1/src/test/expected/loops-WP10.txt 644 233 144 3346 12601522413 14321 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.1/src/test/expected/turns-WP16.txt 644 233 144 2153 12601522402 14337 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.1/src/test/expected/cycle-both-ways-WP01.txt 644 233 144 2176 12601522420 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.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.1/src/test/expected/dead-ends-WP08.txt 644 233 144 2307 12601522416 15017 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.1/src/test/expected/turns-WP10.txt 644 233 144 5162 12725336146 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.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.1/src/test/expected/super-or-not-WP02.txt 644 233 144 1211 12635016670 15537 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.1/src/test/expected/dead-ends-WP07.txt 644 233 144 3025 12601522416 15014 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.1/src/test/expected/dead-ends-WP11.txt 644 233 144 3273 12601522415 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.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.1/src/test/expected/roundabout-waypoints-WP07.txt 644 233 144 1454 12601522406 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 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.1/src/test/expected/no-super-WP03.txt 644 233 144 1547 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.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.1/src/test/expected/coincident-waypoint-WP01.txt 644 233 144 1442 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.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.1/src/test/expected/loop-and-reverse-WP-LR.txt 644 233 144 1713 12606772160 16530 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.1/src/test/expected/roundabout-waypoints-WP01.txt 644 233 144 1454 12601522407 17403 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.1/src/test/expected/dead-ends-WP04.txt 644 233 144 3273 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.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.1/src/test/expected/dead-ends-WP05.txt 644 233 144 2307 12601522416 15014 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.1/src/test/expected/node-restrictions-WP04.txt 644 233 144 3416 12601522522 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.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.1/src/test/expected/roundabout-waypoints-WP03.txt 644 233 144 1453 12601522407 17404 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.1/src/test/expected/loops-WP02.txt 644 233 144 3345 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* 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.1/src/test/expected/fake-node-with-loop-WP02.txt 644 233 144 2426 12601522415 16737 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.1/src/test/expected/loops-WP06.txt 644 233 144 3345 12601522413 14325 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.1/src/test/expected/super-or-not-WP03.txt 644 233 144 1212 12635016730 15536 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.1/src/test/oneway-loop.osm 644 233 144 10263 12114366272 13153 0 routino-3.4.1/src/test/no-super.sh 777 233 144 0 12064636362 13400 2a-b-c.shroutino-3.4.1/src/test/prune-short.osm 644 233 144 65656 12114416166 13206 0 routino-3.4.1/src/test/invalid-turn-relations.osm 644 233 144 22476 12105426741 15323 0 routino-3.4.1/src/test/sanitizer-suppressions.txt 644 233 144 16 13452410542 15415 0leak:FileName routino-3.4.1/src/test/prune-straight.sh 777 233 144 0 12114436047 16031 2only-split.shroutino-3.4.1/src/test/dead-ends.sh 777 233 144 0 12064636362 15346 2start-1-finish.shroutino-3.4.1/src/test/loops.osm 644 233 144 16247 12064636362 12052 0 routino-3.4.1/src/test/only-split.sh 755 233 144 752 13364652324 12601 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.1/src/test/roundabout-waypoints.sh 777 233 144 0 12317323573 17735 2start-1-finish.shroutino-3.4.1/src/test/fake-node-with-loop.osm 644 233 144 10546 12327506445 14463 0 routino-3.4.1/src/test/fake-node-with-loop.sh 777 233 144 0 12326742550 15377 2a-b-c.shroutino-3.4.1/src/test/prune-straight.osm 644 233 144 20500 12327506436 13655 0 routino-3.4.1/src/test/a-b.sh 755 233 144 1004 13364652304 11133 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.1/src/test/cycle-both-ways.osm 644 233 144 10655 12327513605 13721 0 routino-3.4.1/src/test/coincident-waypoint.osm 644 233 144 10700 12333376606 14672 0 routino-3.4.1/src/test/Makefile 644 233 144 2723 13454404165 11606 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.1/src/test/start-1-finish.sh 755 233 144 1061 13364652340 13250 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.1/src/test/run-all-tests.sh 755 233 144 3656 13364652727 13236 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.1/src/test/super-or-not.osm 644 233 144 7676 12635017361 13252 0 routino-3.4.1/src/test/turns.osm 644 233 144 43517 12064636362 12071 0 routino-3.4.1/src/test/waypoints.pl 755 233 144 3443 12306670127 12541 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.1/src/test/cycle-drive.sh 755 233 144 1052 13364652311 12703 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.1/src/test/cycle-both-ways.sh 777 233 144 0 12327512664 16171 2cycle-drive.shroutino-3.4.1/src/test/node-restrictions.osm 644 233 144 16636 12114366273 14370 0 routino-3.4.1/src/test/copyright.xml 644 233 144 2406 12563645242 12701 0 routino-3.4.1/src/test/invalid-turn-relations.sh 777 233 144 0 12064636362 17475 2only-split.shroutino-3.4.1/src/filedumper.c 644 233 144 133644 13713767721 11546 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.1/src/nodes.c 644 233 144 44120 13755013433 10456 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.1/src/osmo5mparse.c 644 233 144 45136 14450041353 11623 0/*************************************** A simple o5m/o5c parser. Part of the Routino routing software. ******************/ /****************** This file Copyright 2012-2015, 2017, 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 #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.1/src/prunex.c 644 233 144 122462 14242177045 10717 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.1/src/sorting.h 644 233 144 4321 14251172034 11012 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.1/src/segments.h 644 233 144 17360 12663133501 11202 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.1/src/relationsx.c 644 233 144 126066 14257274621 11576 0/*************************************** Extended Relation data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2010-2015, 2018, 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 "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; 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 { int ways=0,relations=0; index_t i; /* 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_NODE || relationx.via==NO_NODE || relationx.to==NO_NODE) 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.1/src/osmxmlparse.c 644 233 144 53263 14450041353 11723 0/*************************************** OSM XML file parser (either JOSM or planet) 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 #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) { TagList *result=ApplyNodeTaggingRules(current_tags,llid); ProcessNodeTags(result,llid,latitude,longitude,current_mode); DeleteTagList(current_tags); current_tags=NULL; DeleteTagList(result); } 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) { TagList *result=ApplyWayTaggingRules(current_tags,llid); ProcessWayTags(result,llid,current_mode); DeleteTagList(current_tags); current_tags=NULL; DeleteTagList(result); } 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) { TagList *result=ApplyRelationTaggingRules(current_tags,llid); ProcessRelationTags(result,llid,current_mode); DeleteTagList(current_tags); current_tags=NULL; DeleteTagList(result); } 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.1/src/segmentsx.c 644 233 144 62023 14433450037 11364 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.1/src/nodes.h 644 233 144 12404 12550223461 10457 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.1/src/errorlogx.c 644 233 144 64161 14166353501 11400 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.1/src/xml/ 40755 233 144 0 14450044533 7743 5routino-3.4.1/src/xml/xsd-to-xmlparser.c 644 233 144 40355 13452416363 13410 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 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,"Too many subtags seen for type '%s'.\n",currenttype); exit(1);} } 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,"Too many attributes seen for type '%s'.\n",currenttype); exit(1);} } 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,"Cannot parse XML file - exiting.\n"); exit(1); } /* 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.1/src/xml/test/ 40755 233 144 0 12531652211 10716 5routino-3.4.1/src/xml/test/bad-double-quote-attr-invalid-utf8.xml 644 233 144 233 12064636364 20057 0 routino-3.4.1/src/xml/test/bad-end-tag-space-at-end.xml 644 233 144 204 12064636364 15746 0 routino-3.4.1/src/xml/test/good.xml 644 233 144 252 12064636364 12377 0 routino-3.4.1/src/xml/test/bad-single-quote-attr-left-angle.xml 644 233 144 233 12064636364 17572 0 routino-3.4.1/src/xml/test/bad-double-quote-attr-invalid-ascii.xml 644 233 144 233 12064636364 20261 0 routino-3.4.1/src/xml/test/bad-single-quote-attr-invalid-ascii.xml 644 233 144 233 12064636364 20270 0 routino-3.4.1/src/xml/test/bad-attr-entity-ref.xml 644 233 144 252 12064636364 15231 0 routino-3.4.1/src/xml/test/bad-tag-attr-no-quotes.xml 644 233 144 217 12064636364 15647 0 routino-3.4.1/src/xml/test/bad-comment-extra-double-dash.xml 644 233 144 205 12064636364 17141 0 routino-3.4.1/src/xml/test/bad-end-tag-space-at-begin1.xml 644 233 144 204 12064636364 16345 0 routino-3.4.1/src/xml/test/bad-xml-header-at-begin.xml 644 233 144 204 12064636364 15702 0 routino-3.4.1/src/xml/test/bad-start-tag-space-at-begin.xml 644 233 144 204 12064636364 16653 0 < level1> routino-3.4.1/src/xml/test/bad-text-outside.xml 644 233 144 235 12064636364 14632 0 text routino-3.4.1/src/xml/test/test.xsd 644 233 144 2512 12064636364 12445 0 routino-3.4.1/src/xml/test/bad-tag-level-nesting.xml 644 233 144 203 12064636364 15514 0 routino-3.4.1/src/xml/test/bad-unexpected-end-tag.xml 644 233 144 204 12064636364 15651 0 routino-3.4.1/src/xml/test/bad-double-quote-attr-amp.xml 644 233 144 233 12064636364 16322 0 routino-3.4.1/src/xml/test/bad-tag-attr-space-after-equal.xml 644 233 144 222 12064636364 17210 0 routino-3.4.1/src/xml/test/bad-single-quote-attr-right-angle.xml 644 233 144 233 12064636364 17755 0 routino-3.4.1/src/xml/test/bad-unexpected-right-angle.xml 644 233 144 213 12064636364 16533 0 > routino-3.4.1/src/xml/test/bad-xml-header-not-first.xml 644 233 144 203 12064636364 16140 0 routino-3.4.1/src/xml/test/bad-xml-header-at-end.xml 644 233 144 202 12064636364 15362 0 routino-3.4.1/src/xml/test/bad-unbalanced-tag-start-end.xml 644 233 144 203 12064636364 16733 0 routino-3.4.1/src/xml/test/bad-double-quote-attr-left-angle.xml 644 233 144 233 12064636364 17563 0 routino-3.4.1/src/xml/test/bad-end-tag-with-attr.xml 644 233 144 221 12064636364 15427 0 routino-3.4.1/src/xml/test/bad-single-quote-attr-amp.xml 644 233 144 233 12064636364 16331 0 routino-3.4.1/src/xml/test/bad-comment-ends-triple-dash.xml 644 233 144 203 12064636364 16772 0 routino-3.4.1/src/xml/test/bad-tag-attr-space-before-equal.xml 644 233 144 222 12064636364 17351 0 routino-3.4.1/src/xml/test/bad-unexpected-attribute-name.xml 644 233 144 225 12064636364 17256 0 routino-3.4.1/src/xml/test/bad-single-quote-attr-invalid-utf8.xml 644 233 144 233 12064636364 20066 0 routino-3.4.1/src/xml/test/bad-early-end-of-file.xml 644 233 144 173 12064636364 15374 0 routino-3.4.1/src/xml/test/bad-unexpected-left-angle.xml 644 233 144 213 12064636364 16350 0 < routino-3.4.1/src/xml/test/bad-end-tag-space-at-begin2.xml 644 233 144 204 12064636364 16346 0 < /level1> routino-3.4.1/src/xml/test/bad-double-quote-attr-right-angle.xml 644 233 144 233 12064636364 17746 0 routino-3.4.1/src/xml/Makefile 644 233 144 5611 13121002124 11402 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.1/src/version.h 644 233 144 2071 14450041367 11017 0/*************************************** Routino version. Part of the Routino routing software. ******************/ /****************** This file Copyright 2016, 2017, 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 . ***************************************/ #ifndef VERSION_H #define VERSION_H /*+ To stop multiple inclusions. +*/ #define ROUTINO_VERSION "3.4.1" #define ROUTINO_URL "" #endif /* VERSION_H */ routino-3.4.1/src/uncompress.h 644 233 144 2131 12302106364 11516 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.1/src/profiles.h 644 233 144 6056 13455663534 11176 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.1/src/profiles.c 644 233 144 106753 13455663672 11241 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.1/src/types.c 644 233 144 32600 13455661543 10522 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.1/src/logging.c 644 233 144 36527 13517273476 11023 0/*************************************** Functions to handle logging 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 #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); } /*++++++++++++++++++++++++++++++++++++++ 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.1/src/files.h 644 233 144 11422 13452711023 10446 0/*************************************** Header file for file function prototypes 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 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); 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); 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 OpenFile(const char *filename); void CloseFile(int fd); offset_t SizeFile(const char *filename); offset_t SizeFileFD(int fd); int ExistsFile(const char *filename); int DeleteFile(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.1/src/errorlog.c 644 233 144 12763 13755013500 11204 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.1/src/osmpbfparse.c 644 233 144 75300 14450041353 11666 0/*************************************** A simple osm-specific PBF parser where the structure is hard-coded. Part of the Routino routing software. ******************/ /****************** This file Copyright 2012-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 #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.1/src/fakes.c 644 233 144 27550 12563633051 10447 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 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; } } /*++++++++++++++++++++++++++++++++++++++ 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). ++++++++++++++++++++++++++++++++++++++*/ 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). ++++++++++++++++++++++++++++++++++++++*/ 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). ++++++++++++++++++++++++++++++++++++++*/ 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,"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 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.1/src/visualiser.h 644 233 144 6117 12327765765 11545 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.1/src/typesx.h 644 233 144 7023 14242177145 10673 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.1/src/router+lib.c 644 233 144 45335 13351654624 11446 0/*************************************** OSM router using libroutino library. 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 . ***************************************/ #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(sizeof(Routino_Waypoint*),nwaypoints+2); /* 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.1/src/relations.h 644 233 144 10517 12550223461 11352 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.1/src/xmlparse.c 644 233 144 210451 13160531572 11222 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.1/src/logerror.c 644 233 144 11432 12563633053 11203 0/*************************************** Error logging functions 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 . ***************************************/ #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 if(!errorlogfile) { fprintf(stderr,"Cannot open file '%s' for writing [%s].\n",errorlogfilename,strerror(errno)); exit(EXIT_FAILURE); } /* 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.1/src/relationsx.h 644 233 144 12236 13547422532 11551 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.1/src/segmentsx.h 644 233 144 15640 14426167633 11405 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.1/src/ways.c 644 233 144 7012 13452412002 10275 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.1/src/errorlog.h 644 233 144 14565 12550223461 11214 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.1/src/files.c 644 233 144 57621 14435171537 10470 0/*************************************** Functions to handle files. 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 . ***************************************/ #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 { const 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. +*/ }; /*+ The list of file buffers. +*/ static struct filebuffer **filebuffers=NULL; /*+ The number of allocated file buffer pointers. +*/ static int nfilebuffers=0; #if defined(_MSC_VER) || defined(__MINGW32__) /*+ A structure to contain the list of opened files to record which are to be deleted when closed. +*/ struct openedfile { const char *filename; /*+ The name of the file. +*/ int delete; /*+ Set to non-zero value if the file is to be deleted when closed. +*/ }; /*+ The list of opened files. +*/ static struct openedfile **openedfiles=NULL; /*+ The number of allocated opened file buffer pointers. +*/ static int nopenedfiles=0; #endif /* Local functions */ static void CreateFileBuffer(int fd,int read_write); #if defined(_MSC_VER) || defined(__MINGW32__) static void CreateOpenedFile(int fd,const char *filename); #endif /*++++++++++++++++++++++++++++++++++++++ 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 fprintf(stderr,"Cannot open file '%s' for reading [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #endif } /* Get its size */ if(stat(filename,&buf)) { #ifdef LIBROUTINO return(NULL); #else fprintf(stderr,"Cannot stat file '%s' [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #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 fprintf(stderr,"Cannot mmap file '%s' for reading [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #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=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 fprintf(stderr,"Cannot open file '%s' for reading and writing [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #endif } /* Get its size */ if(stat(filename,&buf)) { #ifdef LIBROUTINO return(NULL); #else fprintf(stderr,"Cannot stat file '%s' [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #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 fprintf(stderr,"Cannot mmap file '%s' for reading and writing [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #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=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 fprintf(stderr,"Cannot open file '%s' for reading [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #endif } CreateFileBuffer(fd,0); 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 fprintf(stderr,"Cannot open file '%s' for reading and writing [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #endif } CreateFileBuffer(fd,0); 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 fprintf(stderr,"Cannot open file '%s' for writing [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #endif } CreateFileBuffer(fd,-1); #if defined(_MSC_VER) || defined(__MINGW32__) CreateOpenedFile(fd,filename); #endif 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 fprintf(stderr,"Cannot open file '%s' for appending [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #endif } CreateFileBuffer(fd,-1); #if defined(_MSC_VER) || defined(__MINGW32__) CreateOpenedFile(fd,filename); #endif 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 fprintf(stderr,"Cannot open file '%s' for reading [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #endif } CreateFileBuffer(fd,1); #if defined(_MSC_VER) || defined(__MINGW32__) CreateOpenedFile(fd,filename); #endif 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); DeleteFile(filename2); #else *oldfd=ReOpenFileBuffered(filename); DeleteFile(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) return(-1); filebuffers[fd]->pointer=0; } if(length>=BUFFLEN) { if(write(fd,address,length)!=(ssize_t)length) return(-1); 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) return(-1); return(0); } if(filebuffers[fd]->pointer==filebuffers[fd]->length) { ssize_t len=read(fd,filebuffers[fd]->buffer,BUFFLEN); 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) return(-1); filebuffers[fd]->pointer=0; filebuffers[fd]->length=0; if(lseek(fd,position,SEEK_SET)!=position) return(-1); 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) return(-1); } else filebuffers[fd]->pointer+=skip; 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 fprintf(stderr,"Cannot stat file '%s' [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #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 fprintf(stderr,"Cannot stat file descriptor '%d' [%s].\n",fd,strerror(errno)); exit(EXIT_FAILURE); #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); } /*++++++++++++++++++++++++++++++++++++++ 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) return(-1); close(fd); free(filebuffers[fd]); filebuffers[fd]=NULL; #if defined(_MSC_VER) || defined(__MINGW32__) #ifndef LIBROUTINO logassert(fddelete) unlink(openedfiles[fd]->filename); free(openedfiles[fd]); openedfiles[fd]=NULL; #endif 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 fprintf(stderr,"Cannot open file '%s' for reading [%s].\n",filename,strerror(errno)); exit(EXIT_FAILURE); #endif } #if defined(_MSC_VER) || defined(__MINGW32__) CreateOpenedFile(fd,filename); #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) { close(fd); #if defined(_MSC_VER) || defined(__MINGW32__) #ifndef LIBROUTINO logassert(fddelete) unlink(openedfiles[fd]->filename); free(openedfiles[fd]); openedfiles[fd]=NULL; #endif } /*++++++++++++++++++++++++++++++++++++++ Delete a file from disk. int DeleteFile Returns 0 if OK. const char *filename The name of the file to delete. ++++++++++++++++++++++++++++++++++++++*/ int DeleteFile(const char *filename) { #if defined(_MSC_VER) || defined(__MINGW32__) int fd; for(fd=0;fdfilename,filename)) { openedfiles[fd]->delete=1; return(0); } #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); } /*++++++++++++++++++++++++++++++++++++++ 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. ++++++++++++++++++++++++++++++++++++++*/ static void CreateFileBuffer(int fd,int read_write) { 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; } if(read_write) { filebuffers[fd]=(struct filebuffer*)calloc(sizeof(struct filebuffer),1); filebuffers[fd]->reading=(read_write==1); } } #if defined(_MSC_VER) || defined(__MINGW32__) /*++++++++++++++++++++++++++++++++++++++ Create an opened file record. int fd The file descriptor. const char *filename The name of the file. ++++++++++++++++++++++++++++++++++++++*/ static void CreateOpenedFile(int fd,const char *filename) { if(nopenedfiles<=fd) { int i; openedfiles=(struct openedfile**)realloc((void*)openedfiles,(fd+1)*sizeof(struct openedfile*)); for(i=nopenedfiles;i<=fd;i++) openedfiles[i]=NULL; nopenedfiles=fd+1; } openedfiles[fd]=(struct openedfile*)calloc(sizeof(struct openedfile),1); openedfiles[fd]->filename=strcpy(malloc(strlen(filename)+1),filename); openedfiles[fd]->delete=0; } #endif routino-3.4.1/src/mman-win32.c 644 233 144 12565 12531126220 11234 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.1/src/waysx.c 644 233 144 53435 14257274607 10544 0/*************************************** Extended Way data type functions. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2018, 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 "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; 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; int nfd; char *names[2]={NULL,NULL}; uint32_t namelen[2]={0,0}; int nnames=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.1/src/logging.h 644 233 144 7552 13517017132 10765 0/*************************************** Header file for logging function prototypes Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2015, 2017, 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 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) #ifdef __GNUC__ void _logassert(const char *message,const char *file,int line) __attribute__ ((noreturn)); #else void _logassert(const char *message,const char *file,int line); #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.1/src/uncompress.c 644 233 144 24015 12535623410 11542 0/*************************************** File uncompression. Part of the Routino routing software. ******************/ /****************** This file Copyright 2012-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 #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); 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); if(bz.avail_out0) { m=write(pipefd,p,n); if(m<=0) exit(EXIT_FAILURE); p+=m; n-=m; } } } while(state!=BZ_STREAM_END); if(BZ2_bzDecompressEnd(&bz)!=BZ_OK) exit(EXIT_FAILURE); 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); 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); } if(z.avail_out0) { m=write(pipefd,p,n); if(m<=0) exit(EXIT_FAILURE); p+=m; n-=m; } } } while(state!=Z_STREAM_END); if(inflateEnd(&z)!=Z_OK) exit(EXIT_FAILURE); 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); 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); } if(lzma.avail_out0) { m=write(pipefd,p,n); if(m<=0) exit(EXIT_FAILURE); p+=m; n-=m; } } } while(retval!=LZMA_STREAM_END); lzma_end(&lzma); exit(EXIT_SUCCESS); } #endif /* USE_XZ */ #endif /* !defined(_MSC_VER) && !defined(__MINGW32__) */ routino-3.4.1/src/router.c 644 233 144 64061 13351654633 10701 0/*************************************** OSM router. 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 . ***************************************/ #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); 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); 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.1/src/translations.h 644 233 144 4646 12601525105 12056 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.1/src/cache.h 644 233 144 21730 12550223461 10414 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.1/src/Makefile 644 233 144 21157 13713767735 10666 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.1/src/routino.h 644 233 144 33717 12663650335 11071 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.1/src/nodesx.c 644 233 144 53157 14242223016 10650 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.1/src/queue.c 644 233 144 12775 13157512275 10511 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.1/src/relations.c 644 233 144 24100 13754203452 11343 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.1/src/filedumperx.c 644 233 144 26424 13713770012 11676 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.1/src/prunex.h 644 233 144 2761 12731266071 10662 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.1/src/translations.c 644 233 144 157522 13452411162 12115 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.1/src/functions.h 644 233 144 3117 12725333236 11346 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.1/src/superx.h 644 233 144 2420 12064636364 10664 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.1/src/output.c 644 233 144 136751 13455663674 10761 0/*************************************** Routing output generator. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2017, 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 #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(sizeof(Routino_Output),1); if(option_list_html_all) listhead=htmlalllist=htmllist=calloc(sizeof(Routino_Output),1); if(option_list_text) listhead=textlist=calloc(sizeof(Routino_Output),1); if(option_list_text_all) listhead=textalllist=calloc(sizeof(Routino_Output),1); /* 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(sizeof(Routino_Output),1); 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(sizeof(Routino_Output),1); 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(sizeof(Routino_Output),1); 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(sizeof(Routino_Output),1); 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 */ { fprintf(textallfile,"%10.6f\t%11.6f\t%8d%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), IsFakeNode(result->node)?(NODE_FAKE-result->node):result->node, (resultnodep && IsSuperNode(resultnodep))?'*':' ',type, 0.0,0.0,0.0,0.0); } else /* not the first point */ { fprintf(textallfile,"%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", radians_to_degrees(latitude),radians_to_degrees(longitude), IsFakeNode(result->node)?(NODE_FAKE-result->node):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(sizeof(Routino_Output),1); 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.1/src/xmlparse.h 644 233 144 10145 12563633052 11207 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.1/src/tagging.h 644 233 144 5110 12153161715 10745 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.1/src/fakes.h 644 233 144 3742 12563633051 10431 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.1/src/optimiser.c 644 233 144 203460 13455663675 11425 0/*************************************** Routing optimiser. Part of the Routino routing software. ******************/ /****************** This file Copyright 2008-2017, 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 "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,*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.1/src/visualiser.c 644 233 144 77076 13160256411 11547 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.1/doc/DATA.txt 644 233 144 11262 12572106465 10437 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.1/doc/ALGORITHM.txt 644 233 144 46204 12572106465 11260 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.1/doc/INSTALL-MS-WIN.txt 644 233 144 13422 12572106465 12004 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.1/doc/NEWS.txt 644 233 144 121122 14450044035 10506 0Version 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.1/doc/html/ 40755 233 144 0 14450042646 10070 5routino-3.4.1/doc/html/output.html 644 233 144 37671 12520735062 12365 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.1/doc/html/limits.html 644 233 144 17142 12520735050 12312 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.1/doc/html/algorithm.html 644 233 144 50311 12520734723 13000 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.1/doc/html/installation-ms-windows.html 644 233 144 16500 12563643607 15631 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.1/doc/html/readme.html 644 233 144 24365 14450042646 12261 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.

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.

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-2023.

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.1/doc/html/example0.png 644 233 144 351656 11541143677 12411 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.1/doc/html/example4.png 644 233 144 204063 11541143743 12374 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.1/doc/html/example1.png 644 233 144 413161 11541143712 12366 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.1/doc/html/index.html 644 233 144 10252 12563643544 12130 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.1/doc/html/installation.html 644 233 144 40400 13756227311 13513 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.1/doc/html/configuration.html 644 233 144 24661 13755526237 13704 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.1/doc/html/tagging.html 644 233 144 73654 13765144732 12460 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.1/doc/html/library.html 644 233 144 115411 12606774344 12511 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.1/doc/html/example3.png 644 233 144 241144 11541143732 12372 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.1/doc/html/example2.png 644 233 144 272260 11541143722 12373 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.1/doc/LIMITS.txt 644 233 144 14050 12572106465 10725 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.1/doc/LIBRARY.txt 644 233 144 51356 12606774417 11050 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.1/doc/TAGGING.txt 644 233 144 50226 13765372430 11013 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.1/doc/OUTPUT.txt 644 233 144 30700 12561371522 10760 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.1/doc/Makefile 644 233 144 3410 12313271732 10572 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.1/doc/USAGE.txt 644 233 144 64442 14437672226 10607 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.1/doc/README.txt 644 233 144 15515 14450042561 10661 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. 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-2023. 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.1/doc/DATALIFE.txt 644 233 144 31412 14426215445 11075 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.1/doc/CONFIGURATION.txt 644 233 144 20035 13755526336 11742 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.1/web/ 40755 233 144 0 12605264262 7134 5routino-3.4.1/web/INSTALL.txt 777 233 144 0 12031126065 13552 2../doc/INSTALL.txtroutino-3.4.1/web/results/ 40755 233 144 0 12216114770 10631 5routino-3.4.1/web/bin/ 40755 233 144 0 14450044533 7701 5routino-3.4.1/web/translations/ 40755 233 144 0 14372477207 11665 5routino-3.4.1/web/translations/translation.fi.txt 644 233 144 7147 13741352406 15376 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.1/web/translations/translation.fr.txt 644 233 144 33306 14204455134 15420 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.1/web/translations/translation.cs.txt 644 233 144 10504 13741351732 15415 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.1/web/translations/translations-head.xml 644 233 144 1527 13157503575 16046 0 routino-3.4.1/web/translations/translation.ru.txt 644 233 144 22373 13643141523 15441 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.1/web/translations/translation.pl.txt 644 233 144 15165 14130256707 15432 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.1/web/translations/translation.de.txt 644 233 144 34531 13701405023 15373 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@@ Geschwindigkeitsvorgaben @@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 Schlaufe 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@@ 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-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.1/web/translations/translate.pl 755 233 144 25623 12564147067 14265 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.1/web/translations/translation.nl.txt 644 233 144 36203 13725172421 15423 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.1/web/translations/translation.sk.txt 644 233 144 36311 14263050511 15420 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.1/web/translations/translation.es.txt 644 233 144 7107 14372477207 15413 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 @@SPEED-LIMITS-BOX@@ Limites de Velocidad @@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-CENTRE1@@ Centrar mapa en este Waypoint # # Visualiser specific translations # # # Multi-line descriptive translations (router) # # # Multi-line descriptive translations (visualiser) # routino-3.4.1/web/translations/visualiser.html 644 233 144 53565 13157503637 15010 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.1/web/translations/translations-tail.xml 644 233 144 30 12314102416 16001 0 routino-3.4.1/web/translations/translations-body.xml 644 233 144 11416 12601526231 16103 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.1/web/translations/translation.it.txt��������������������������������������������������� 644 � 233 � 144 � 36275 13236635625 15446� 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.1/web/translations/translation.hu.txt��������������������������������������������������� 644 � 233 � 144 � 40440 13236635625 15433� 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.1/web/translations/translation.en.txt��������������������������������������������������� 644 � 233 � 144 � 34145 13236635625 15426� 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.1/web/translations/router.html���������������������������������������������������������� 644 � 233 � 144 � 75617 13311001776 14131� 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.1/web/data/ 40755 233 144 0 14450044533 10042 5routino-3.4.1/web/data/create.sh 755 233 144 637 12764327167 11663 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.1/web/Makefile 644 233 144 14607 12603024144 10627 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.1/web/www/ 40755 233 144 0 13532473475 7770 5routino-3.4.1/web/www/openlayers2/ 40755 233 144 0 13521272362 12221 5routino-3.4.1/web/www/openlayers2/routino.cfg 644 233 144 2230 12260565540 14414 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.1/web/www/openlayers2/install.sh 755 233 144 740 13521272362 14223 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.1/web/www/openlayers/ 40755 233 144 0 14441353720 12137 5routino-3.4.1/web/www/openlayers/install.sh 755 233 144 1524 14441353720 14162 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.1/web/www/leaflet/ 40755 233 144 0 14441353677 11405 5routino-3.4.1/web/www/leaflet/install.sh 755 233 144 224 14441353677 13404 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.1/web/www/routino/ 40755 233 144 0 14441354752 11463 5routino-3.4.1/web/www/routino/visualiser.html.it 644 233 144 54252 14402424662 15211 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.1/web/www/routino/documentation/ 40755 233 144 0 14450044533 14325 5routino-3.4.1/web/www/routino/page-elements.js 644 233 144 4426 12271221644 14561 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.1/web/www/routino/visualiser.leaflet.js 644 233 144 74241 13755535065 15673 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.1/web/www/routino/router.html.hu 644 233 144 102542 14402424647 14362 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.1/web/www/routino/router.html.de 644 233 144 100330 14402424644 14324 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
+ - Geschwindigkeitsvorgaben
+ - 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.1/web/www/routino/update-profiles.pl 755 233 144 4536 12767517273 15162 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.1/web/www/routino/visualiser.css 644 233 144 3165 12260522707 14376 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.1/web/www/routino/page-elements.css 644 233 144 4616 12261523234 14735 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.1/web/www/routino/router.html.nl 644 233 144 100753 14402424651 14354 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.1/web/www/routino/visualiser.html.fi 644 233 144 53247 14402424657 15202 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.1/web/www/routino/router.css 644 233 144 11366 13033250176 13547 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.1/web/www/routino/.htaccess 644 233 144 3472 12640556437 13306 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.1/web/www/routino/statistics.cgi 755 233 144 2271 12767517356 14374 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.1/web/www/routino/paths.pl 644 233 144 2701 11763176234 13154 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.1/web/www/routino/visualiser.html.cs 644 233 144 53063 14402424655 15203 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.1/web/www/routino/router.html.es 644 233 144 100011 14402424645 14340 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
Close loop:
Reverse order:
Buscar
+ - Medio de locomoción
Foot:
Horse:
Wheelchair:
Bicycle:
Moped:
Motorcycle:
Motorcar:
Goods:
HGV:
PSV:
+ - Highway Preferences
+ - Limites de Velocidad
+ - Property Preferences
+ - 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).

Router: Routino | Geo Data: | Tiles:
routino-3.4.1/web/www/routino/visualiser.html.sk 644 233 144 55003 14402424665 15210 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.1/web/www/routino/router.openlayers.js 644 233 144 155425 14441354202 15577 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.1/web/www/routino/visualiser.html.de 644 233 144 54504 14402424656 15170 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.1/web/www/routino/router.pl 644 233 144 12263 13143556741 13400 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.1/web/www/routino/search.pl 644 233 144 5070 12767517266 13315 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.1/web/www/routino/visualiser.cgi 755 233 144 7743 12767517352 14375 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.1/web/www/routino/search.cgi 755 233 144 4305 13143557265 13437 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.1/web/www/routino/visualiser.html.hu 644 233 144 55261 14402424661 15211 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.1/web/www/routino/router.leaflet.js 644 233 144 152305 13756466616 15051 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.1/web/www/routino/router.html.fr 644 233 144 102274 14402424646 14356 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.1/web/www/routino/icons/ 40755 233 144 0 14407626360 12575 5routino-3.4.1/web/www/routino/icons/limit-125.png 644 233 144 3014 13755454065 14746 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÁIDATHÇÍ–íOÔWÇÏÀ(N§ÐÈB”f,»%j!»$®›Ød3$Û€›6bEÝhMIWØØ6}±Ù¾hcÍFŒ¸²q7«ëC¦!:Aĸø‚§ŽéH!(»”¶k)#eu™(~÷³/†;ƒ»ÿ€÷Í/çÜs¾ßoîùÝs®€ˆˆd,~R^Hy!Å·SÞJúW”¬(ùqsÜþ³Ž7oüã÷ð\ãs™g3ÏÚ_&m½¯ã—æ‹$ñ—òi¿dHÒ‘ÖšÖê(^´?‚7 ß,\‘·ë{Áp›p í@Àåó—Ïó¸óþM€ÙâÙbHÚz_Çë|·_>ú~XÖ±¬Ãñ/H[ž¶\¼¯z_Í«LäÁke¯•|—ú]ªJë߀·*¢DÑëÁ[ï/Æë|§ñ5ŸæëXå[å×+^¯pý-žðe¼Ÿû~®æ3À'|‚̨°*­Jb zU/´õ¾Ž×ùOãk>Í×#O×öدPåËË—&€kÒšÛmÔuªO=TQZ²ú‘ÊRY`›Ãæ0Ø_Ûwí»À=ÆëwVÀ  ¬ Û¶cX{R£(ÕøÛíYäO–RDdÝ1]“®É¨Æ3Æ3€«lµz ¯áå —ùН%CM«i5 ìe/{“~Žsœã î¨;êÎÿ ,¨Õ‹õnóþæýúŸ|OÀÓíéV­ü)üyøó%'¿á‡¹æÀ¿Þ¿Î¿r#¹‘ܯ¯¯CWwWwW7ª}}úz‘©ÃS‡§‹µµµ‰ì¸¸ã⎋"í­í­í­"FƒÑ`4ˆxnznznŠTTUTUT‰äLæ|›ó­È¬9;:;š€_%g‡ÆC­'E$Z-º%Ξޞ^™a¿ãêyõ¼,èÌôé;ÓwЏ Ý…îB‘þùþùþy#ÃÈ02D®n¹ºåꑬڬڬZ‘±ÈXd,"2ètºE<Ç<Ç<ÇDò§ò'ò'D~½yOÖž,ÏþÔPðHðˆHBÏâ,냷?|ûCˆ_iûgLš#æH²;<Úö¨äQ Æ€1 ûö-샙£3GgŽB85œN…ðÆðÆðFˆùb¾˜¬«Æª™/f‚3A°í€@Uf•wù4ÿ¢ždÃußu?ê„1kÌJÚ vµ]è;1}—žZyÌã%}n@ ¨P¥ªX&õócócž°Fã¿<þ20ïúÆõM²ýç§<­< °ÈR­Ö Úc Å ê©Õ¢šU3¨ ©PÒæ/4Òœ§Ÿ~”ê´ÖXk0h±Þ±ÞIŒº V¹³Ü©Oê©ÎÿÌÎÊgöuñ̾ǞÍì6—ØÙæÌÀIEND®B`‚routino-3.4.1/web/www/routino/icons/home.png 644 233 144 351 12610450011 14204 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.1/web/www/routino/icons/waypoint-up.png 644 233 144 361 12610450011 15551 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.1/web/www/routino/icons/limit-121.png 644 233 144 2523 13755454065 14746 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]H”YÇŸq4´Ò¨½ˆ)ÃnT4j%»X(„dKI,”²Z%b3Šên»h©eÑ Ä BŒ(RúÐÕÖdS'ŒÚJD%Ý s”>HÌfÞóÛ‹™ã;ì²wž›™çãÿüÿçžç=""’ýˆ[·&nYÄŽ«rüI…I…ëoFì˸J\%þË–7¤]M»j8¶ŽëüX¼ˆS?–Oû%UGâíÄÛ._Ô>e¹e¹I«"v£ 8Ç9RÀ šA«Âª ʯü¸pcë¸Î×x]O××|š?¢G>½Ûó[Q¥KJ—&€ÑÖ„5vŠqÔ8Š¡ª·ê-JKV_©Uj˜#æˆ9ösû™ýŒÏ—²“£C ˜õfý†û™Ûeí²´Àó[c®RD$³Ó3á™ÆÃXêX*ðÛ-¿‘n¤óV^ð"†iZM«i ’J*c$4ÑD¨ë꺺Ö[+`€6ưÙÇøÙ8ÛaÔµ>>¯j_Õ¾ª…€;à¸!p8p8pæ'ç'ç'+›ýz6g6Âýáñð8 ì|;xø¯]™YïÌ=Wôœ±÷Ú{ùÓù!BüŸõYþ'õþkŽÅL~JK¢“ÐÜVµUA;£Œ¢¸Hu šÕMuÔõD=u[ÝR·€Ÿ9ÃçÄðV¥U©ÝF?fi|i¼>©O&ÿ¢ýV.Ú×Å¢}-Îì?J%)•ÐÛIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-10.5.png 644 233 144 3046 13755454066 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÛIDATHÇÍ–ëOTgÇ Cq"ångchªC¨¶xc`7iºµhÜ0ØH B}¡,34µkIj"š7nß4‚®1ë’X"KpÊf›’´¶rM¬¶!a‹Ìz¡X 3\èdæœ9Ïg_̆mÿŸ7'ßßåûýæ9çùG@DD2ãOËË–—-é1lùc"¾bçŠùí1|1 Iï$½óŸq>ã<@Ö•¬+ÆÝ6ófýò~‘ÿr=3.™’¤v¦v&m‹ãSðîÆw7®XÃí›Ïæ[Ô¡¡»¡àzÛõ6áÇ¡‡f·Ínƒ6óf½Ùoò-ç—S¿Ð”ÏR>Kz©/¤¾ ¯ìxe‡ãp¬à¾*Ý•n€’HVˆNi¤©m@ æò/Ãf>^oö›|&¿©gêÇü侕û–ìªÙUcû{¬áîUx?ïý}8úë Ónk·µÛàkó]ò]‚ÖŠÖƒ­Q—¾m½Ùz‰†£ac 4: *b~„‘ïŽAÇÛoƒ~@í¯¬öT{›GäÆÚko¬­L+ÓÊ`³³³6õlêÙÔ½½½0åšrM¹Æfêfêfê`ÕΉUP¹¿²¦²öÕzk½„ÿ»iÖ˜5Ô~¸þÁõÀ¸ó#œK/O/WðôÚÓkÉg#áÚkíóíó÷û¼7óÞ„[+o­¼µºÊºÊºÊ ØYì,v& ”„KÂ%a¸0raäÂH"Þ¿ÿ~ÿ}°º­n«܇ÝîFøÇÔ•O¯|ºlkKžxŸx¡ô3égT§Eþœ<<@¡ôX­‹")§dDF$Ps·6£6CdõÕWÑŠ´"­HD+ÖŠµb‘´Ž´Ž´YZémémém"áÂpa¸0700ÙçÙçÙçÙ»yoÑÞ"‘æ²æÍDþù¢ïC߇;/y^òˆýd’I¡E¢†Ïð%ŠEÛ¥í‘ߊˆH®I¬Ïê3úŒˆæÔœšSÄqÚqÚqZd²b²b²BÄ_å¯òW‰,L/L/L‹8ì»Ã.ñD<È\Ê\Ê\ŠHÎÑœ£9GEªë«ë«ëE~3aÿÊþ•ÈÌìܹ¹s’+b Ã"rÉpî¤Q‹Xƒ;‚;†¿‘pßç}Ÿ‹$¹DD¨ûŠdTdlÏØ.Ê e…²DJSKSKSE¶žÜzrëIÇ´cÚ1-²3´3´3$âÊwå»òE\N—Óå±gÛ³íÙ""™G2½™^‘W|Yð¥DöµÔëõ:õ"ݥݥ"–ïBkBk†¿IœJÍÛäm&ÌSý"úÌŸ›oŸoGE¾ŽôDzŸ„1nŒã A5©&Õ*Wåª\ð7û›ýÍ ©CêèÇõãúq˜¶N-N-¢ŒóZ¹V¾Ä¶…ÞõÞõæ<»Ø/æÜÛO¶Ÿ‚V[[XÒ/G3®W—ͱ?ÑH##`FÕYuVö°‡=Ëâ}ªWõ‚úƒzO½ ÞPoð³rÄùóƾûÀ6k› Z¹õsLŸ¼ª*¹*91ùIÕ'õIàoÑP4”˜üü‹.º@}«î¨;@=ô3€UÃj˜Ž×·D'¢hê†þT |ç§ÊZe"¿œüÏï¿ò¹½]<·÷±çóû?âCÐ/]¨IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-73.png 644 233 144 2370 13755454065 14674 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü­IDATHÇÍ–_HTYÇ“9 e‰Sm”(1ÙD…$X‘…Œ2Kÿ0¶zX–ˆ•b}Èþ=$4"ѶEYög)$S´ž–ìÏ0¥¬¦QN²nÎÜsÎgfŽ÷îV»Ë>y^îýýû~¿çžs~÷B1=ùàÊqå¸2¶ëÛŸ¾6}í¼Ÿö )›S6?ù¦ÕO«È e…Ô3Û6q“ï¬ÂÆwò¿˜.l‡ûªûjJqÒ>é3ö‰6ÈhÊhúÝ‚]7vݸ~þúy¾…ÁÎÁN€¡â¡b°m7ù¦Þà9ñÅ¡¿ñ “oM¾•Ò î4wš»:wuþw‰„H>”­/[Ð?©’v€|LaŠ.FÁŒ÷ÛÄ“ù¦Þà|ÃgøzxVyV ›› ‰‚g?AÕܪ¹†/Þå(SÀ±Fä¹…1Ðmº €RÀ¶MÜä›zƒgð ŸáOè]ÛÚð§ûÓñP.åý@ΓóˆËIr\€–_K¿ôƒÌé2ôv½]oý•ž©g‚Õm=¶ƒ.к ê„:Aœ?ä=yÐ?É7Î/œ‚¼u1˜18’ a–ãKS j›ÚÆ(öc eÔéÕ–¶´æ0‡Ù7¹Æ5`A‚ê€:À(1ƒoø BORØ™vØS½§Ú ©EúP¼*^eóöäõÌî™ õEõEõEp®÷\ï¹^¸ðñÂÇ !|*|*| ž/}¾ôùR¨M­M­M…ð›ð›ðÇõ#ýíXb@-²ùz’Â~ý.E/EÇËwªâX¬Ÿ1ãi ¶Û‚°¬|Yù²r(ÝZºµt+¤Ó‚iAØÝº»uw+ä.É]’»Êe²äDr"9x{{s,Ž÷Åû ¾Þió'ôÈlÍlÕWa°p°Ð±èNÝ™xAƒZ®–«åv4TªUCeeeee%Ü÷Ý÷Ý÷ÁAïAïA/Ü®¹]s»|M¾&_tíïÚߵ߮W¿ÉËò²“Ïð'ôÈšš5U=…÷¯ß¿vû:¢#@ %”ØåÑÆhc´òòò }aûÂö…v|hþÐü¡ù°nͺ5ëÖ€w…w…wtgwgwg;„Åå€p¶ßÐãB5«æ”§BX­Â ÈïÄ;!Ô åQžq¿¸¸á↋„˜™™be×Ê®•]Bœôœôœô( „¸s÷ÎÝ;w…Ћõb½XˆÎ#G:Ø8¬%Ÿ|ß8RÏ—ö–l ŒÉ›òмbÏ´¼®¼®¼Ž—/=^jûû:ú:ú: °¤°¤°²{²{²{À/üÂ/ ê‹ú¢>ÇF‰Yg­³ÿ¸Ç>*QVÔŠ-¼àE¢ë × × ×Àhïhïh/ŸŒØ±Ø±Ø1xë~ë~ëùJ¾’¯ Ofø?ŸÊÿÑÇv°ƒŽ/Т[t èéߦP€fsÔiuz¼þ[ûLç Þ%[e+$cœ,Š(BSÅ^ö~úÅø*ª@ÿ¢›u3ÐÀC¢AíSûˆcÉòÿËÂþ+'ìíbÂÞÇ&æ öOAälúäoݼuoûbþ÷:X¶X¶üY¯µ¾Ö °ðÇ…?F‡MßÈõÉý"&~2Ÿ—L1öóöóOÜ?Û ¶Ì{#æÝ Ž Ž ÿiPýKõ/?·ÿÜÎxÔ÷¨ à xÀô¼QoôxÉørè%~H»œvÙòØmv›ä¬ÍY›»7Vp'6z7zî[ï[U èÓ@:éÊ bØ?I¾‘×ýžoðü1=Yd} ›Ë7—;~ˆ5 w@íÒÚ¥_äp˜Ã¤ƒÔ‚úÇúÇ„@õª^,XÀô¼Qoôx¾ÁgðÇôÈ‹kûÍT™­Ìh?è“ú$DÓ#ŸG>'¢ÔsõÅK¦ö«ýj?Dߊ¾}ÓŒGÿVY* ¥= —„Kˆ¨jmµ¶:ñÂ~ž—ê¥: âüæRŠˆ¸¾EsL:&ƒ©0–9– ôP¢÷Fr"9<ã ÷¹Ï\+¤BP[ÕVµ5Iè´šVÓÀ—ÔQ—T¿F?£Ÿá‹cø0–7–Öë‚uÁ‹´îwŠ;eÉNJ¥TJ½¾ž?ÎÅÛâmñ¶8C4AAÿ¥ðVx+¼O#ÎçÈC?†­[¶BŠIs¤9ÒŠÌÉcvÍZÍZÍZHÔLÍÔ éHG:@ÅA@”ˆQP%UR%tšç4Ïižƒ$÷—óÉùe=Y_æ‘ù¸×¯ ^Õ,Õ,Õ¬N×××?´"$)$)$Iz*59595YÙæ«óÕùêðñ½ø^|à ¼7 œœ©2øËüeþ2À7ò|#€ d €Zh¡6a6ÀWã«ñÕà/r~YOÖ—yd>.IcÒXâç1ç1ç±ä¿ÎLš™43‰ŒIIIJÙ#£A¾ˆ/â‹äE =蘘p–9Ëœe€´JZ%­Ø¶mƒäÜÈÜÐ\šKsá#ç—õd}™GæSR8…Sø»k]z—Þ¥âß‹/þ=˜}¿õýÖ÷[¨Åyq^œ‡Ž·òVÞ à(Žâ(€5Xƒ5€È™"¨O¬O¬OÎÆž= 0æÏüXËb@ ”@\pÁ°½l/Û xòûøîõÝë»ãñËã—Ç/‡¹êªwªÞTAª Uлk¹d”Œ’qašß€ß€ßŠŽ{8îá8VâùR5·r+·pÀ@9”C9˜ŠÆôÆôÆtàTù©òSåÀÚµks¦9Óœ TuTuTuç¶ŸÛ~n;TP´˜Ób`*¿GOÖ—yd>lÙ2²eD\tpÑÁE$‡]¼&^¯ÑÑ}BŸÐ'Sõ$5KÍR3QáÂÂ…… ‰Z÷·îoÝO¿‹“¦“¦“&"ë>ë>ë¾é÷â´8-NOçŸÒóèË<2G! QÈÂy%¯ä•S_¦Á1Ã1zè¡|äOähÆhÆhàØêØêØ t=Ðõ@×@Ñò¢åEËüêüêüj@½Y½Y½ˆMŽMŽMð ~Á/Ó1ÓPB %€ñ#~œÖç/òù‹vc7v³p®T*éðhôhôh4®J›¥ÍÒf(X#kd ˜ŽÓq:> êXâXâXÐô}Ø ìöÀl0Ì`qÖâ¬ÅYÀ!û!û!;ÐRÖRÖRÀ =MOÓÓ¿ïa=¬äI¯°ÿ`ÿÁþ®òÂCè0×~¤ýHû‘T|5àjÀÕ:|¹ôréåRs1s1!–Š¥b)ÀV³Õlõ4¨:B¡Ž\å®rW9¯ŽWÇ«èŠèŠè Àü“ù'óO€iii Ð3»gvÏìéþl[ÇÖd"™ÜÁÜÁĵ•×V^[ ØnÚnÚnâŸÚ«Ú«Ú«R1G’”_¦ÌSæ)óXn³¡ÙÐlp‡ ?2üÈð#Ðq=×s=Fésúœ>Ÿš‘0#aFàUèUèUôGöGöGN×£¨FÒFÒFÒuº:]>]MF2’`§Ø)v i½´^ZÝqÛqÛq›ˆa6fc6ü›¹™›¹¿T+gµÌj™Õòá¶Û–Û–Û–¹\0¸`pÁ‹×ªVW­®ZíÎNE*R¡(Æ0-¤…´Å9Å9Å9`Ùîe»—í=< Üj»Õv« °Ã;€ÀaÀ¬h[Ѷ¢íW ÔA Ï>«©y¿æýš÷ÅxïÝÞ»½wy›®W׫ëýßu®ZW­«vÓ.Þ[ß[ß[¸Z]­®Ö­GõKõKõKÿïËîC݇º)Šžmx¶áYz’e° – Í¡94„8@ŒWŒWŒðÊ3¯<óÊ3Ó‹#p0p0pH³¤YÒ,€ñ>ã}Æû±Gì{¾‹ïâ»0qyëå­—·âog£ÎFâ:¯@¯@¯À{ "FĈ˜ufÅÅÅ‘ %/ãe¼LqMhBÓMÓdƒ”/tVUg= kº5ÝšNsƒr‚r‚rØ×Q_E}õVQ$ER$t,šE³h êLÔ™¨3@”ˆQ€ &˜¦O.J¡Jø¾‡ïÁè]Ÿ»>w}àS×_×_×/…¨6ª6ª6*ÁFÙ(Ý&ˆD$vþS1+ƒ<×<·iòHT¾Ëv²lgËÏãyü¦¤"©|W-«eµLJ¶ [†-бNÖÉ:1*{‘Ò(ÒÏQ z‚ž 'j¡jX%«d•pxfÞ§.».».Û=ôæÐ›Co*?Ó„jB5¡_„……}|rr;d‡&?TZ"ßGõ¸¸!u YÈb5s¾™óÍœoŠWkÓ´iÚ´¯ †ü†ü†ü”ÃUþUþUþîlY>¥OéS8Øëìuö:À.²‹ì"À¬ÌʬS—ÂÆ0Íw¶ïlßÙèÉóçÏ7*Šõú}@ï=ççç-väwäwäd#Ù0ã³O÷<+…·ðÞ˜qéÖ¥[—nÎ,g–3kˇz?½ŸÞïzewmwmwí¯¼ëY ¢\”‹r¼á o€Fh„Fæb.æÂÄÛÛ¾nš×4¯ifèûô}ú>@D‹h½åC¾ƒïà;zïy¬ø™gÉ%Ê“W¡ç—D#ïçž}·xÒ»îlÃbXÌ“«'9Nu¥»Ò]é"óñ‚xAðبQ;¢v`•è]¢ :Á#xR®”+åBóEè¡_„ºÃúë{¬ï1Åí<í<í¼âE¤ )6µMÞ_•Ÿyfv£¯|^ùüÄMF“ÑÄñèýÍóœø-—qqqqqq<ÅvR“šÔ쵾ȾȾH|å~Ðý ûÁ³’ƨ1jŒÏìê_Ò¿¤‰á›áÎáÎáNú×¥}—ö]Úç~|Ì5æs)²T±ªXUìæ *¥R*­¨ƒh×&Ïzq¿<ž’~ËÃð'ñÞµ  hpçS ÕPM\¯æÕ¼ºÕxo录÷VŠHU‰ªDUÂ;©ŠTEê‰ÿ„V‡V‡V/³õØzl=ì[á/ü…?}éÉ[ëÿ#Ž?‰ßx׳]¸ó±°Ay‘%³d–|*”¨¶¾ä5Ûk¶×lÞ©¸¡¸¡¸qs¶Ø.¶‹íé·ºÖu­ëZLÂèÉ'_,'þŒãÿ„#Ë—âÕIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-39.5.png 644 233 144 3072 13755454070 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜïIDATHÇÍ–ýOTWÆãdGR­¼lÆ6LI ´+‘(EÇâh#©VZ@abbÖV 1!%ÑífËšŠ‚AB²mB …”tݶ¡ SwÍN TG#K¡”·æÞ{>ûÃÌí%öðüró}{žçž{ïs!„«ÃW¦DS¢iU(67òËs—çnü<תñvÄÛ}çÁZc­ˆmˆmÐ~4b½®÷/ÂÀ_ʧçÅja$¢®G]È ÇÁ;¯¾óêòøPü×›íŽv?V ø‹â/Z[9¿x~ñLçLç€ëu½_Ÿ×ñ–⋞âžûò¹/#þQ‘Q‘B@òÎä¶“¡†6Èß›¿`dÙÈ2iuXÉJ™Ì1‡¾¦–Äz=ܯÏëx:¾Î§ó‡ôˆ{3îM!àÀᇣ¯…~ü;|ðA‚Ît¸ÀJPæ”9µP-$ò¦¼ @`Äz]ï×çu<_çÓùCzŒG9/„Ÿ8à ï ´ÿ»•Ÿ‚¶  ¤]yCyƒ`X©Ô&µQm”_•)e äqy\ç÷« ©V.^Y¼BP}%x2xÔ½!| ®=¸Vø‰Ãx”ß!„ýSˆž‹ž›3KÍ×íëªØ2U¦2ÏOŒ2 ²PÊBà*W¹ºD€`ëX·$ïǘe–Yù’|‰ùpu„ùÂü!aöOcBQ{KRr ä€Ž¦eôÿÿC>T§V§T§ ïï-Ü[0øz’z’z’àröåìËÙðÐûÐûÐûû Þ Þ Þw£»Î]®T>$¢ŽýóX×±.!…èˆïˆïˆ"ñFâÄBܶ߶߶ a©¶T[ª…h•­²UŠßÖ@Ã@Ã@ƒ3¥3¥3¥Bh+´µÚZ!¶¿èØåØ%¢l½±¦XSÄ5‘™õ(ë‘&ÿª «.¼¶Y@lLlŒ6ÀòIÿ¤ßøìUΔ͔An]n]n¤[Ó­éVhokokoƒ-©[R·¤ÂîS»Oí>‘™‘™‘™Pk­µÖZë¼ßy¿ó>···AS}S}S=$¿’ô|Òóд²¥¢¥‚)P¼ŠÔ?Ǹb\Ú€Pã,ý–~yÏ.ž…K7\]®.x«bgÎ΃ c0c0cJ,%– 8›ÍÎfpmsmsmƒõ¶õ¶õ6èˆëˆëˆƒ…ô…ô…tp¸GÜ#pnã¹ç6x›Weögöƒ+Xo®7êõ þÁ2d’×…ŒÒß±æìæl=³àXpÈ¢?¾•>–>F`Í?ָ׸áPß¡¾C}0˜7˜7˜¹ž\O®6ìÛ°oÃ>¨8]qºâ4Œ©cê˜ iiiàÑ<šGƒ­Þ­Þ­^°ž²–XKàýé#—Ž\"ðäo²šúšú@úCzÂ>V{‹¯f§Ùø*ÿò$çILD/Œ/ ÕµF­1î80˜ ÌÂø¦ñM㛀‹\ä"hCÚ6SUSUSU Ëe¹,åŒrF9“æ‰Ç‘ZMpOpÁÇ Óî´ë~V{KÐþ”}òyí7{W¾Ë¼Ì’é)#e$È*Y%« ¡2Y&Ëdà(G9º$S~'¿¹K¾'ßÙ2›yi ã'øú}ýÑÓÑÓsfþ¥û˜îüÝy –,þrfù•2£ÌuêÏêφóSÅy΃ü^vËn —^zI&˜9 {d0î¿¢«Ãå7ʘ2|v~ Ìf`ñiçvÿ•Ïìéâ™==›'ØÿäŠ3SE†æIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-108.png 644 233 144 2717 13755454065 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü„IDATHÇÍ–}L•eÇççx“—ÑtŒ3Æ SÀmmBÔÚr8PÖhË’å ²F­?zq™µg=¡c1ksO0ŸP&†ˆÏ¦Á¡¤È–XNC(uGÐu`d§TÎýr}ž?ιÏ}¬íùÛëŸ{¿·ï÷{½ýîK@DDÒc_§×éu.‰ÚÎm¶ñ‹ŸXîÚà¨sÔÒ>Jû ãÓŒOÍ‹¶mÅ­üÄz?‘ÏòKºØw¯»×Q³ß§V=µjñ}QûŸ#à9â9ò§ÍýÍý}Ý}Ý´ÂõÑë£óUóU`ÛVÜÊ·ê-¼D|yç/ü"<˜<è¸n—Û%¹ç>žÿb4a*6¬ß°àÚ¢k‹”ŒJªª„±Æl‚mÅcùV½…gá[|T@VeV¥Ô6Ô6xþ-¸øox5çÕ‹O;¼Ç{¤‚ÖÃF“ÑĨ5€ض·ò­z Ï·ø,þ¨¹{o?| Uïªw:€vŒ 3U{I{ MTH…P–dõ°ªP _Õ¯êWA½ ZTK|1SÙ*¥#DASEz–žŸðiîlÒ7逊ñÛ[)"RØî z‚á$˜LŸLŽð¤1¢åj¹Ü¢Ÿ)¦lB|øðKYÊÒM4*Pªè£‡ž„øÓkz¹Å£Q|˜ÌžÌîx®x®„“,=1a Ï¿õü[À<€¹FíÒ^Ó^‹Ã©ýÍûŸÞÿ4ŒÏŒÏŒÏØ<£££Ðéètt:àrèrèrÈŽŸÛ}n÷¹ÝÐþvûëí¯ÃÄ‰®„ïŠòÅùczb¾oãÅ϶|¶%žþ¬þ…• +Yhkj²7üTÞ©¼Sy UkÕZ5¬ž]=»zŠ[‹[‹[aÍÚ5k׬…¡¡!ðmömöm†Ú¾Ú¾Ú>È{0ïþ¼ûáâ3çç,X|*ןîO·„}ß&°dxɰê¥sæ›™oì™FVÞùýÎïÐSÔSØS9ërÖ嬃±”±”±8\}¸úp5”•–•–•Úu•ݕݕݰտտÕÅÇ‹‡ŽºŽºŽ:XñÝŠ3+ÎÀw¿žùüÌç gqøÚ×þKSdцEx@Z]^—WDþ#""sÉoºº\]" ~jøI${{ööìí"Z‰V¢•ˆheZ™V&’z0õ`êA‰´miÛÒ¶‰„góáYí¨vT;*rrßÉ}'÷‰‚ˆÈågù9^6'y®]?ŠXzœ"æ€9ภ†¾^_/"É’‡$C2lB}^Ÿ×çE´R­T+Éß•¿+—ÈtÍtÍtȱc7ÆD"m‘¶H›HdOdOdˆ7à x"Ç–[vl™Hòåä_’ùzÏhËhK>‹—#ÑaKS$\®ÿV’#¹-"ÂsŽr•©2%_‰š´š´‘Û·3ngˆ”»ËÝån‘Š;+vŠø|¾‘’¢’¢’"ÿ^ÿ^ÿ^×r×r×r‘ÌéÌéÌi‘‚‚C‡Dšºßh|ÃÂç9羯6}µI$®ço·2»%Aý‚~Á¾•7?¸ùîÍw!2Š %œIsÒœ„¹à\p.æ 9hÚq½YoÖ›!”J ¥€ñŠÑn´£À8`~ø¿·²°<×=×ÃIpɸdÄqŸs‹¹…[hÜ=v°ƒ`ΙsæœíVPPÕFµTq¬ŸYñBý}ý}n©Kñ>V>Yüé™òLý­%t~êÝõnÀŒwþqcp-F Ÿ0ˆ݇8J?ý Îª³ê,p˜^z&ËW_¹F.FƒÑÐùõú¤ú$k¥îêü÷ì¿òž}]ܳï±{óû? CÆ‚ObrIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-12.4.png 644 233 144 2740 13755454066 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü•IDATHÇÍ–_LTgÆ_þ™€Ó1em4 ½hk:JÈfÓ`ã2Z¢Bjem´)MDº iWb^¨ñbí£–„bC½˜Ô¶A«aÕÈ(ÒB¢ @[³„´ “`ŒŽT„Œ‡AdÎ9߯3‡Cmzïwsòþ{ž÷;ßyŸó ˆˆˆ+ñHÎIÎIvÆíäÛþôé_<·OTžTþóAxöÓg?XvrÙI3hÛVÜÊ_\/bã/æ³üâÛ±¤mI[’'a‚íîíîô¿Åí{ÁqÁq!ªCõÅê‹ç¿<ÿ%ÿ_ûí˜òLyÀ¶­¸•oÕ[x‹ñåÐü"ðÌåg.'݆%iKÒD ·$·ä…ÚxÂ//À–²-e¡”PŠJcÈ$Sy kM.²­x"ߪ·ð,|‹Ïâ÷#UœU,[ßÙúŽãóxA°öfïͶøb€È]Ó5£Â¨à1¨^Õ @I`ÛVÜÊ·ê-< ßâ³øãýØGiŠˆ4¾±Mߦ/4ÔgfÆòcù ®ËåÄ¥–+—rÔ‡õa0ÍAs{Í% Dâù`Vš•ÄT½Ñat€¹4ŽÛæ¶ÍáÿÂQÞy¹£ŽQ-•K·ònåq €RΛ/™/1kñ©û*¤BÀNv²sQ#G9ÊQPSjJMñçUDE v-à•ùvä[‡æÐ´Ôxc/7'ÞØ‰ëL×T×Tƒ:`Xxþj½¿5tk(8´y‚•ÁÊ`%4å5å5åÁ`á`á`¡WšÒ”ªQ5ªFÛ?zeôÇÑQW·wmêÚdyÍ^õ¶yÛ€ñx?ÂßEDëáìú³ëA? ªÞíÛáÝáå±5"=­=­=­pwúîôÝiXÙµ²kex|ŸÇ9{röä쬬,»Ãm¸ ·moÐ7<ÜðÖXûÚÚ×xœØF•yêTË©àF¼ᘳÔYªÚàþ™ûg`þEܸáÌ+§#§#=ÎC_g_g_'\½võÚÕkPWQWQWa®º³êΪ;p¼éxÓñ¦?ŸdãÆ@¾“rþõ¿òºò:;n–‡B À/N¿Ó¯Ú–-]¶ÔæÊ¤ÒêÔÂØÇ?ТТ 8·ûÜîs»m áâáâábXݼºyu3xj=µžZÐÚµv­ÝÎ „¡@ J J J`÷þîýݰvEQjQª-3*<ñÓÄOÀ×g®ÏÌaAwv;»UߌMŽM‚ùãN ×z =ÐÙÒÙÒÙ!_ÈòAZ$-’Ÿá3|ÌtÌtÌtÀlt6:…°7ì {¡!Ðh@FzFzF:änÍ}+÷-[Ö?_Úú|ëóÚ„6Æ÷G2ލ¶dIÕJ´’¡äqï•Þ+"IÿáýÄÐÎgìÈØ’±E$ÓéÎt‹Ü|tóÑÍG"1WÌs‰´onßܾY$Ÿ|òñ¯ñ¯ñ¯)Ë-Ë-Ë)¿T~©ü’Ht.:©ßX¿®~È?~}ïë{e¾J{oü½qÞ—ç.¯¸¼B$åÌì¾Ù}C?ØS«ÙW³¸kM¥ÑetAäÍÈ‘P±ÿÇúcý0_5_5_Ž=8öàÜ»7vo ÆÌ1sÌ„hO´'Úá]á]á]`Œ€°O`NŸûmî7ÔÃMS2%‹¦ò›šäšdKpO\K7À1î×Radfdf§̳æY[Ç¿^úñÃæ0¨>5 €f­YË,ÁþGzFzéØƒ?è˜*¡¼êí”·S,ÔX)úmý6pÑtšNb|B7Ý(õµúJ}ê;Õ¯úAT@€¼xA=T“jÂÄDù¡ù!17Œ@ZŸßü“Êÿôþ+ŸÚÛÅS{{:o°¿ËåZêñ ÿôIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-34.2.png 644 233 144 2720 13755454067 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü…IDATHÇÍ–ÿOUeÇÀ‚ J¸«„ØÑÒ~ˆ†ÒMæ¼(¸¡2 WyÍ/åZ+PL34æSçn¨à†.d­ÆP±ä62)Y3‡[…câüÊä"—®À=ç<¯~¸÷xîäðürö~žÏçý~Ÿó<ç}B!bw¡J¨íÇ¡™ã«"VÍÿÁ«4É Éù÷+x©ò¥J€é§¦ŸÒo˜Ø˜7êƒû…0ùƒõŒq#Ìðúðú[ï‡w¼» b¦lËYËÙÿTØÜ¸¹àÌ÷g¾g;ïSAï<ÈZµànØÝ0 Ú0•©Òxð`\ƒAؘÔýŸÁoèú~?f,Ÿ±\È.È.°œô7ܨƒ’WJ^1ô|g`*¨Õ iEŒƒl“m„&6æz£ßà3ø =CßïÇ\J¯BZ ¹=¹= ÿ໬ÞñÍ÷͹@MSÓðœJò,–ŸËÏAWtEW èÝÝçþS$åkjŠš‚O½á{Ù÷2èm~~CÏÔ7–²E!Þp€Åcñx¦H½çrÏeà2A&Ëd¼4ÐH#àÀXÏzÖƒ,”…²0ÈÐCòЄrPÊAàìØd†ÌÀK…Ÿ_ôú´ùýú…¢êwÉ–ì-ÙþÖßw®e]Ë‚ÃïN9œ‚ìyÜãîq3éêsö9ûœÐšÛšÛškŽëíz»Þnâîøî¸î88òê刂ìH¾R{¥ÖÔ“[2·d‚áGh !DG1œo8ßWV÷Æ÷ÆK{Ì·Ó¦%0žS‘S–SÊ^e¯²zëzëzëLÁ´Ô´Ô´TXV³¬fYÍdãaaa ¨Šª¨`+·í¶íåãøÈøHÆÛ÷weweK;œ/?_†¡'E G ËzuŽ:¡Y¿~)v¯øÒò¥šî5Ýmº ‰§O'ž†[kn­¹µŽÏ9>çø3lÖ9×9×9';q.â\”ì)ÙS²ÇózBMB |WX½©zÀÄŽ‰ j‘-‘-²^ÀôiÓ§é׉2·îã²áO†?ŒíÛ3¶Ã"ë"ë"+TtTtTtÀ’™Kf.™ ¥ÎRg©–ÎZ:k鬠¥Ì×óõü ¥,ê.ê.‚…Ž…Ž…°}º<y>x÷ùÜ>7ƒàÎsçôĈ¡_ÚŒÈÎÈNY¥¥p¤ùØÇþ€ŒÝé¶t›Iœ²1ecÊFHX‘°"a(” ʘ}bö‰Ù'Ì7Wu´êhÕQ---€«IW“®&ATbTbT"”{ËGËGÁÓ>rhä<5çAìƒXàvtmt­¬2ÜØc © ©pçØÊ±•ÒþvFRR?ãÖ3Ö:käµäµäµ@ÿÎþý;MÃŽVG«£ÒûÒûÒûÀUéªtUÂâÆÅ‹¡ìbÙŲ‹`i¶4[š!9.9:9¢ŠÊŒÊdüÇ+ÍÕÍÕÒMö&;¨‡{,ð/ûß¶NÙ:ÅüJ&*žØžØàa¸kÌ5†Ônj7µ›“÷ÐcŒ#]#]#]@,±Ä£ƒ>:Þbo±·¶|8ð!Ü»}O»§!ïvÛ~ÛOnúõ`ÛĶ à½ÀWÉÏÏäØE®È“Osì}ù>^'_—¯ƒÜ%wÉ] 5©I XËZÖ]tÑìcû‚œkhhÁ"çÉyx žÉ1Œ3vǸ‘¼yayaÀþd–¿ªÃê0pRsi®ÉÉÏþ€+V¬€›!†@I—të)§)Q5UÃ'ÿÔ"µHuä?œûuî×à÷œüÏï¿ò¹=]<·ç±çóû?Ê#X‚VÁ„²IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-0.6.png 644 233 144 2604 13755454065 14746 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü9IDATHÇÍ–ohSWÆŸ¤Ö¤õÚ¨ÔÙŽˆ’RW\R6EBk•h…VQ¤"¥u›ˆÖ1Æü`Ý 'VCÁ¡X"£þù¶¨¡ØJ-øo5h ©Öº)©6™•ÔÚöÞsϳÉÍ¿÷~ ï{Þ÷ù=7‡óÞ0'ñ ҺкК­_›y»ÏîËk‰ÇÇiÙhÙxÿGÒqÄq„$ç6ÏmÖš±±nÔ§ö¦~*ÏÈcÌ„í¼í¼¥$7[<[<öùñøçn2ãbÆÅ7¹£uG+IþáÿÃÏZ2|#|ƒ$_•¼*!ÍØX7ê~C/U ÿãdú¥ôK–!Ò6Ó6 ­Y´ÆõM¼à‘‹,__¾ž$Ÿ¥=K“V’$ÅI…Š,!cŒÆI‰õD½ÑoèúÏàÇý€Ì.Î.È •*3NÆþNîuîu<õ"ÉC“™Ì$åSùT>MÉÿ«¼J2_9žÔŸ…ÆÈ$?á'aìØurgýÎzCEÿLþ©žRO™ÀÀº:òè¼£óŽÎ#‡ú‡ú‡úM®Þ 7è fü¸öqíãZ²éDÓ‰¦äí·knטzR¨£ê(ÉWqžÉûI»û=yúõéפì%IùeB`2òSdd?¹Ü½Ü½ÜMvvvù]ù]ù]äË%/—¼\b ŽG‚äÊ‚•+ ÈòÆòÆòFrYÕ²ªeUd 7à8’å“ú€Á‹ó ?V ëZֵϿŠK‹KÙ–“‰¶µmoÛݶHËMËMËkkk‡×áux þ þ ~$Ÿ+ž+ž+`pöàìÁÙ€Óæ´9m€¯ÂW᫜Šs¾s~²ÜfùØàÅù†+VžVÎOô¶ô61@ÔèœúkªoªPZ•V¥Õ4åÏògùIuRTͼVª•j¥€Ýb·Ø-€;躃À9ýœ~Nz{Ÿô>1ëù‰ÁKð~fz»Þné´ ­K-pwm4æýW—W<_üÜõÜDÒ#é‘t`¬p¬p¬pÝsÝsÝDPEPF•QeP:•N¥Ø¥ìRv)ÀñúãõÇëAmPLyºÙ > ?V V+é» tuvuÖ½À¯Ð¡Wꕘò|÷}÷o™·Ì[¸F\#®À7á›ðMÞaï°wðäxr<9@QQQQQ°¢eEËŠ`–:K¥ùUùUùUÀö™5z¦¬Ý ^‚ŸôóÞ©Ô§DÕ¢Z4å}$ÒAF{¢=ÑRî“ûä>RfËl™MFš#Í‘fR¿¥ßÒo‘òŒ<#Ï‘ºH]¤Žâ€8`êñ¡vS»iNœÊ”9¦†&B)sì[qWÜ帕92'e€6ÊFÙH²šÕ¬N™W[¹•[I=¦ÇôXJýB¹N®#叨$6¥Ì±·¡X(öÁ9öÎä·o¶“ÉÉ’—õúªòŽ|+ßR²ƒíl'ù/£Œ’²_öË~’à 3Lò*/ó2)¯ËˆŒPò7¡ •*)ˆÆÎ¨=IÞû“Ú~+§ííbÚÞǦç ö?BÑ‘»ÏG *IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-28.5.png 644 233 144 3115 13755454067 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýOTWÆ¿ƒ£Î´¶ÒÄRt; Í&ýTŠ ÖÐ@ºM†4!ZdžUÜhXÓl²v# ZBúƺÝf#úmmä¥aÅì²¢³Ë¶:¬³PáÎÜóÙfn‡mÿÏ/7ß·çyî93Ï=""’} Ä=÷T\b$Ž;Ë[ -…iŽÄ-a0½lzùᅢ¤óIçÖ_ZIÅFÝè_9/Ã_Égä%Yb‰µîµnS~4~ ^yö•g-Gâº[`õX= !x½óõN€ŽË—©„éé€@~ b±Q7úyo%¾¼õ~XݵºËô/X»fíxºàéÛÑHÃ=(>P ðͪoV©8Ï $¨| HcùWÄF=ÚoÌx¾ÁgðGôlÌÛ˜'%¯–¼jýcd`ü]8¹ùäfƒOó5Ô¡`(v†,º¥n`±بýƼgà|DOì(çDDÎî…ÒïK¿• õ‡þ¡=¡=ú æÕ¼hQ¥J_ÐzBÿM…¦@eªL•ÉÏW*üûå¦å&´°];ª…pqŸ²ÒÇJ3žÝ;ÊED2À´ƒf57Ù?Ù¼€Ôóêyù˜Ïø ôY}VŸ:è c…€+\á O>ù+ò÷¸Ç=àx ¶«í,F«ˆòEù#Â2¢;ÖÒ«>:l:l2Ðôç&6A}Ò;¼jdßȾ‘}1¾»õwëïÖùã玟;g&ÎLœùù†i·µÛÚmð\ö´zZ¡ù¥æ7šß@µŽ4Þü9ÌÕ†—ÂKúsP™]™ ꥈž8•#"²óºi_QKQ‹ÈXÏôÛÓo›² &_ì{±O–;3¯g]Ï“ó¢ó¢ó¢HÓÕ¦«MWEÊSÊSÊSDz·öníÝ*Rä.r¹EÆ÷ïß/?®àlp68+âÚí*r‰t?Þ=ß=/¦þå÷Þ—åïWW›²Evì.¡.¢G£ñõñõÊ ‹K‹Kp-éƒ'?xN;‘s"'öæ;kwÖî¬gª3Õ™ öv{»½òòò }<}<}†R‡R‡Rcsýyýyýy`.6›‹¡øhqeq%üiæÒµK×VlmŽÏås‰5‰5Êm^e_óæš7y†êÅáÅa“”üÇ1혖¹Ìr[¡­P6Úýv¿Ý/b+±•ØJDœ§Ãéééé¹yèæ¡›‡DX`±ŠU¬±Ó3ô =C¤¢¨¢¨¢Hd_ä·{ªT±N% ' Ëܯþ{àðòQ¯eAžý/ ®—rÃü·óßÂßj''aÝ&‹×â…ÓÇOW®Š½Xczczc:äTäTäTÄòö ö ö Pg©³ÔY@/ÓËô2ðÄ{â=ñp*íTÚ©´Xÿ®ÄܱÜ1hÖÚÌmf€¥¶¥6oY7µnJ¹ãÔ¯ZZG‡D  EFj¾r|åàà’g)m)M–»ÖwYº,"¼¼¼"ÅcñˆlÞ6¼mX$ñFâÄ";w î)ôz ½"¹¶\[®MdSÖ¦¬MY"}î>wŸ[$ù7É®d—È/¦¶²ýY®h::â Hç®Î]"qýaË[F‡¢?¶–^8R}¤öDþ•3_úz|=à[åKõ¥¢|¿ôeû²ááý‡÷Þ=AOÐ`¦u¦u¦tÑEPUªJUßåwù] Ž©cꄪCÕ¡j˜5Ï,Ì, ôóšCsÄ\€º2\†ŸµôŠá11|%ê3‹*E¥üè;¨€ ¨(‹²(KìhT†ÊP î¨;êΊü§ªGõ€Ú§ÊU9€zA½À¢²Eñ7OŽMŽXÖ@ÐÌàÿù˜ñ8»—?”ž(=ê݈3«¡pB8Ô{¡ùÐ<ø‚/PtÒN;¨Ô‡êC 6Ú€y@©Q5 ÌFôÑþ:ü5šú4ô]è;àjÔù)3—™åŸ:ÿ£û­|doì}ìѼÁþJÅÚçU¤4PIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-31.8.png 644 233 144 2771 13755454067 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü®IDATHÇÍ–aLTW†¿‡FiE´ b-Ñ…Ô¦bL³°mR Ž% õ“‚‰Û6ìnc³Éf“’Ìf·»“”–t’š®lhJc 6µAp1PYAœmkƒ€ ³ËÌÜ™{ϳ?†ë%%ûßóçæýÎwÞ÷Í=çûΑì寀=ßžo2íoXñÌ—3_.ü•Æ» îwÇSPÿEýퟵÆoàþ•ûWæ=ó°°9oæ›ëM¾•üòÞ/ôE ã|ÆyÛàrºœ"PðbÁ‹Ï¼•N¸ý Tª<ðóšŸ×(;è€,²”ˆÅ³+°9¿œo®7ùL~SÏÔOûØt`Óð¾æ}ÍÝš^p³ Þyú§M½d @¤¢©(€þºþ: P—ÕelØÀÂæ¼™o®7ùL~SÏÔOû±¶rIDäïÁö…Áø7@²?u/Y˜,µ+åIyH.;U¦e#ËXg¬5¬†Õ0Ö˜g†™GHÉÔ†Ô’©{ɼd¨‚4?øf|3@ÄÔ7·²OD¤¨ÜQw4êPF¸?Ü4ð ¨Ýj7K rkÀf6³ô;úýÐE]+ -²È¢UJ¥T h"@@PXâô2Ų޲>#i?”ˆHè[Eƒ·Áûè?ì½7R9R Á__¾€ ß ßß`Õ8ÕpªáTŒîÝ3ºÇеF­QkáÑÏGÛFÛ ø§à»ÁwQ·þ<îwZzª»ÁÕà2·6ô­èC""ÿ‡®s]çà_‡nçÝÎSþ쿘<??¨ü¥/=?õü‰w7Žm_‡¯ÃבòHy¤Ü:CeR&e=#=#=#«ÕÆj¡hºhºhÆcŽ1TUF•Ùw³Ç²ÇÀûêáøá8‰¹Sê„:¡üpöû³ßƒúCÚ˜U@ïqÇq‡U%Ú_cž˜f\Óñé8JŸÐ'ô‰Õ‡{¡q¡q¡’¾¤/éœ8qÂì±Ùc³Ç@•ªRU zžž§çÁÌâÌO3?¡ôßjÅZ±¥Çøñ­Ç·®¨J¾üE»”î+ªõQó+?KÊ©rT¨ˆŠ¨È gK,±ôÿ±z¨æÔ¨L•«rÔu„%õ«4¿º¾¾à^t/F\4û˜Yð ³ó]st ð»tgVÝ©H*´êÓúôêΠ6Ú€ÿ¤ïJ5¦¾SßÁr÷WüS_ÔIªÞÔ\jøÐìüGG`é?ºÄÛ»ò±}]<¶ï±Çóû?hnГùÃìIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-6.png 644 233 144 2145 13755454064 14607 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–AHUYÇÿ÷½QߣÇËD7ñ$p2†¦ ™E³LiB˜@ *Â0i¨$ÄU-mÑ"ZŒDC‹7E5LQXi­"2• † Aì1•`0Ž‘¯1µ{ïùÍâÞóî­Uî<›÷¾s¾ï÷ÿsî=ß=IReø+HÔ&jÙ NŽæSM©¦¯ÿâ¼Îng÷h7¬>¿ú<ÀšKk.ùãQl×m~¼^Šøq=;¯JE7+n:a| ömÞ·9UÄ¿<‚ôíôíÿ\8Ò¤àÖå[—é„éáéa€·o!ŠíºÍ·õ–çëÔgú”Ý+»çü åå¬Û±nG]W0YÍ;›wL%§’&Þ?@†Œiбc&Ûõ0ßÖ[žå[=«øT7T7H°kÿ®ýé‹AÁøïp"w"gõ>ÞNsš ¸E·àð°æ‘y€ƒQl×m¾­·<Ë·zV?ð£OŸmϰ'µ'U24Þcï1€È?ÄÇp7ŒÍ0GÌasÜgî3÷ø¯ýWþ+¢±æ›°¾Ä³|«gõ7ôͯžNO¿‚ oÂ+a¿Íocž|:ª¨¢ ÌKóÒ¼ŒÍŸå,gzê©Í/Ø?!¯Ä·zV?ðËBÇÉŽ“¥â-±G`wh‘E0WÍUs5Ò{Ñù¢óE'ô\è¹Ðsž}zôéÑhÝxÆ3ð–7¼‰óâ|K¤øIû¶u@Úv|Ûñpå|/9wœ;Z’ôAä0Ék^KN›Óæ´I³f7ÌnÚ´?h ÎÎÎJ   ÒóµÏ×>_+9I'é$%S4KfI²¼?Ô‹ëoHHههßý 5loØ^2vQJ¬O¬W…¤´Ò’é6ݦ[¥qøþðýa© ‚ ’ré\:—–šZšZšZ¤\&—Ée¢|§Æ©qj$Ë‹ñC=«øIHÉæd3ßJee%ο’êUTÉ‘ô^ïõ>r«Ýj·ZJeSÙTVÚ4¶ilÓ˜tÿáßð¥‘ÂHa¤峑lŒñ"~¨gõ? É¿ëßuþ’Ü·¥”X-iR“SHÊ+¯|$TÙWÙWÙ'­º¾êúªëÒ±Þc½Çz¥ìhv4;*Ü‚[pcÆê¨£.Æ‹ø¡žÕý/ÛŸÇáÚ»kïJïæÏà]ñ®°Ì3œãç€'<áIôr·öµöµöA¦+ӕ邽{'öNÀ\r.9—ŒJÇö¹ñC=«øYö©dŠ)¦b§®Ü”›r˜éééïŒwÆ;34Î8ãaG[üòSùå}lé³>vƒ¿èýbÌh­©5µ`æÍ¼™å—úà²úØ2:¿WÚÁ` ÐO?˜!3d†€ßÈ“rmþ²;ÿŠýV®ØÛÅŠ½mi¥Ý`ÿç&™ê(ådPIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.3.png 644 233 144 3022 13755454067 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÇIDATHÇÍ–ïoSUÇO·éVÖLÙ$ºdf€[:V'?jº„mI)1(Á`Ã`àͦ/@´Á9e ,?§Æ:0,“ LKpØÏ2‡h©U×±­£ë½=_t×[ñ༹ùžó<ßïsÏÉó=G€Bˆ'§¿žMx6!-†6êó)å)åÏ}ÃûU0¼fx­{<±ï‰}3Î<íÓ±¶®ÅÇç ¡óÇëióâI¡O$»“݆’iü!¼^øzaʬ®?FÑ3¡@åÉÊ“'Ÿ8Ì»ðç¥?/Œ”Œ”€Žµu-^Ë×øâùŇé ~ì´á7H~<ùq! »4»tî–XÀà\°­²­ð%úe¨Ã€ “,ÆC8¬­OÇkùŸÆ¯éiú±z¹¨tFŒ#H“2G™CDþJH%ª„•0¨o¨kÔ5 ¦©ijÈi•V2z+Š„ˆ(D2#™ Ÿ‹ñƒ}Ø> 5}í(Bˆü/À8fK’y/z/o°äKò%Bìå3>9"GäHœä$“LÆá!Bq)R‘ à`»¤UZ ñÃ4Õ´Þ´>ý±z¦wlÿϲ­ÊPeÐè¢EY====Ðp´ÁÙàDvvv‚ooo8sœ9Î8pëÀ­· 9¹9¹9zœ=ÎçÿvŒë·¯ß¾~–54 ½wû÷ÖõäOU)U)ÚÑîÿ9qÇi!„ø(=á“m_nû2³¬§=í\Ú9qå•ú—ï½|ÏðÊ=%ÈIGŽ ÂPb(1”Ѧ¶©mªƒƒƒBì½¶÷ÚÞkBÍ/š_4_ˆ…¥ K– q¹ùróåf!J»J»J»„H|>±0±Pö<ó±ïcŸ˜²\ïYïWÓíI¿$ýbxU¶|/¿— û„z-õóÔÏ¥BáPZŒ­­P³µzQõ"ýͽæ^s/4¦6¦6¦êó®u®u®u`o±·Ø[þ¿Sg\g\g\P[Q[Q[­­ã­ãð¼ÇRc©ëËûmý6€`G°¢í¦ZS­t ”™Æ™Æh¯|oøÍá7õ¶XÛ_Ö_‡Åaq€õ”õ”õ<¸úàꃫ0ž7ž7žÙì@v.˜/˜/˜õ‚T·êVÝ:Ý9ºst'¬([Q¶¢ ò_Ì›—7ºo{m^˜¨Ÿ¨‡hwÚïi¿G{Eô;Ó&Ó&é†àัgÀ9à„O§ ¥ A¥®°®‚³ƒ³ƒ³u¡¦›M7›n²Ìe™Ë2ãzÁ1é˜t@PePBýÑú£õG¡¼±¼±¼Q›·5wQî"ø*ïÐ ‡^˜Z9µuÆÙg¥[(BÑU mmðõ·žO\ŸpI!/Þ³xÇâº!uCêhßÞ¾½};lôlôlô@]n]n]®.èË÷åûòÁRd)²Agqgqg1,]²tÉÒ%¾9ýíô·Á®T¸*\„G“äzp»‹A‹Õ#¨u¼óþ;ïÃ%Ö%÷.ûÛýíà7ø³üYH?ÇŸáÝáÝáÝpÖýY÷gA¨2TªÔ ‹ÖFk£µpÈãò¸<sÄ1Ã]ÿÝÞ»½HuhªiªIïJú6eoÊÖ»rÚ.tÍWþõ±¹rn¼3=46³™Íqx‚ &â|ì¬ì ÊÙ mÒFH&Ÿ卷ËÛ`5ŽŽ%qî?>¦ÝŸ.ç#{µ½䱘3ËNÕ¤š@~«• ÑE’yÌa°•-l‰+ì&^¼ ä yƒØí ’Ô+ê"²U¹£Ühο:qu"~ØùÝ»ò‘}]<²ï±Góûò'@—†ûWÞIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-9.5.png 644 233 144 2573 13755454066 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü0IDATHÇÍ–ïKÕWÇ?×®v–5M„Y޵ƒµ¦«öÄÆ*ŒZ—Ô~-C,XŠ*Í ™[mAìºFw cí"LV´Á@¼Ó±…2Ên[Í™?òš×™Þï÷|Ïkî=Þ»ÜÐ÷Éåó9Ÿó~½¿ç|ÏçYÿHYž²|ë÷<ËbñçÞ–Þö Õ?Tÿð}Ë÷-‚¡®¡.€ðÆðFHÄfÜÔ›ùF/Y_N=ÇÔ©7\°0mašäoÎßüÚ‘XÁ¯A‰·Ä ðׂ¿èP£@z#!‚yÆ’b3¯7óžÑ7<ÃùÈÞ½AÊÊËÊÓý± ýßÀ±¼cy†gµg8CØ; *T³ ;t.\ˆÍ¸©7óžÑ7<Ãù‘ÿîíùbôî´Ýi€`u‚PàLÙ{ì=Xö¸ÊQ9h]¥èÌ~&HÔ§ªA5€zSíQ{Ðê@´#Ú…W-QKæ^¸“™]ìÂ<_œ´•""o|éCéC7Ó¡H(±5Ûô´Ú¥v1Í'´Òšd ˜bŠ\rÉMʇ&™d;Ù¹SéT2mô!¤B æøq?qcÍA¨i¬iÂN/Û©vꜚ¾]{ûÐíCà[ï[ï[÷{î÷Ü`Ö-ë–u ÚZÚZÚZàbÉÅ’‹%pé·KÁKAxÒûdâÉ`x)Î3ü¸Ÿ”غ½{Mäýº÷ëDô¬ˆˆëw[nK¢½Ý½ÁÞ ¸Ê¦Ê¬2K$°/°/°Od›››_dðäàÉÁ“2÷LUMUMU‰ÔlªÙT³IäföÍì›Ù"®NO§GdòædÓd“¸DäUyU¢ìˆóâü9?°¸}q»n…¡5Ck@½÷ßðY¾¨/ Ew‹îÝMä g g gÀ×èkô5&òÁî`w°Ü^·×íïïï¸2reäÊH’p3ãÌ¿šDŒoü,]´t‘Ócƒcƒ KçŽ=üüüPXQXQXÞzo½·ÒÖ¥­K[͙͙͙ ^û½ö{í÷ úZõµêk¸¸¸ ù«òW寂@m 6P›¨WAËñŸçºsÝÕ'b—Ú¥"|&""ÙfQÃ7Â×Ã×EVެY9"²ýÜösÛωdgg‹¬H]‘º"Ud¶`¶`¶@d"}"}"]$«6«6«VdïÁ½÷É}”û(÷‘HØ[a+±õrÙðbü9?±­§®>½út?€þ(þB³áœpF8ŠË‹Ë‹Ë!ogÞμÐP×P×PÕcõXÁê‚Õ«  Ëérº(ê)ê)êÌ£™G3Be¤2Rgß=ó?óè¯ôWÌò¶áÅøÆÏüSIü”ühì@âTF—Gs¢90¼vxíðZà,g9 ÎCç¡óÆN; ú°>¬ƒ}Ü>n‡Q÷¨{Ô N“sÞ9ŸÐãOûwû÷$Þs§r~› M…¦}ŒeªNÕ1­?Ðõº>ñmè|¯óýìgR¾#ÖùõV½UoMÊ¿®Ku)ðŠ:¡N$õ±9Þÿö±¤ÎÏnÏnÄš¢Õ ª_õgÔ°ÆÒ¿è =æ6Ýt£Œ0ºO÷é>`”a†/¹ÀÐ?é¿õßh®:ǃꎺ(£çÍïü/ìå {»xaïc/æ ö_µ‹mL"9IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-30.0.png 644 233 144 3052 13755454067 15023 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜßIDATHÇÍ–ýOTWÆ¿t``x²IÓŠ‹ÛA6 -kB'¨MVB©°¦IkhÉ"Sצ¡í&¬»ÝEÝv@wZcZu4¾N–} 6Ú ëmv\y™’A`fîÜóÙf®—øx~¹y¾/ÏóMÎ9Ï=""’—ü ¤<Ÿò|JN§üÊŒg¼šñjÉ™>Ëë–×ÿsr?Íý ÿ³üÏô[&6òFýê~“µž—<1éçÒÏYzB_žé{¦Ï€tkºUŠ·ou¼›(¸ë€úíõÛî§ÞOU)ŸìØ•ÆXÁUØÈ'ë~ƒÏà7ô ýÄ<…¯¾" o4¼aëI4Ü: ï?÷þs†^ì"ÐAvÐÂZ þfüM" ®©kX°€‰¼Qoô|¿¡gè'æ1·rIDäO[ q¼qô›±Am"V+µNsknbÉI•Ú¬ªThÿÓZÔu@À\3Üçþc¤ÔVímímbÚD,+–jo‚Ãa`ÎÐ7¶ò""¥[ا)}|p|ø-¿åR.–ø/L€:¡N¨@T¬Ä… °žõ¬_wàÀü„µ¬P¯©×X•äߘÔKêó]baJDää×ŠÝ » 6ýgÿž®®‡ÎŸw¾Üù2êöÉÛÞÛ^SoÜ5îw·À[à-€Àh`40jæõcú1ý˜‰ï¹säÎðxS¼)¨À­;ì4õÔÂî—v¿dlíɯ%þˆÈƒpÙwÙßn¿ûìÝgUKÞï³7fo$Ò°«¡±¡{{{àúñëǯ‡joµ·Ú ®ˆ+⊀sÀ9à€™¢™¢™"s Y÷¬{Ö ® W… 6ù7]ØtœýŽ·o™ÍÓZ@µÀùÃ烪MÌ#zyÖBÖ‚:‹_-~ÓÒÒá7µÚ>´Á•ú+uWê 6³6³6öŸÙfÿ¨Y®Y®Y6¨ŒTF*#Ð5Ô5Ô5dÆOqŠS€{‡{‡{Ǫú¹Š«Wá/eŸW}^== ñìÌ™7Ô¹´”ëZëZ^Ûʽ•{Ù¶R©‰H¨jsù¾ò}RøËüvn‰–EË£å"ñ‘øH|DľξξNDª¥ZªErzszszE"¥‘ÒH©<^Q=ªGuûiûiûi3žs>g$gDdåÛ•²•2 ‰Xë¬uR(‹©žT/¦éEÑo¢ßXFSWr?ÎýX~z¢¿»®»N ýÚ¥±Kc"ýïõwõw‰¸n‡Û!2]2]2]"2ï™÷Ì{D¦º§º§ºEçççDŽGHl.6›)..™<;yvò¬Hp&8œ o g‡³EœKÎgŠméË¥/EäžúD}b•nœ1ßfßf˜ü`eËÊÕR±­|ª|ŠÈšƒkö®Ù þF£Â7Ã7Ã7¡ÅÚbm±BVUVUVj?Ô~¨¦š¦š¦š ´§´§´øøø µ£µ£µìyv«Ý ¼w0ÿ`>‘¤›´À¾Ø¼›[uë‚zPBh04Õ®ÚU;¨<•§ò Øì öÞ¬7ëÍ üꪺ ¡Ðph¥ÏÄ^ˆ½`êj{§í@OÞJ®<ácÿLøŠêyìc»Ô.–T©ªT• šU³jåTNå4UGÕQuh¦™æU>¶—6Ú@© • rU.KêwIþÖñÀxÀ²…ÂiÜ5|Ìpþˆá¼M©M©À¯άüÚ‚¶ü5>Ÿ4ŸËøðúA}¯¾üøñs„º¥FÔð0Yÿ/=[Ï&¦~Ði€‹†ó7¥5¥Ñ'ÿéýW>µ¯‹§ö=öt¾`ÿ;ð"†æ±ùIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.0.png 644 233 144 3033 13755454066 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÐIDATHÇÍ–ïO”WÇÏüp†)SÍ&iÁ@Ç€¤6´QSpVjÔZ©„h ²1u_ØnúB­پ؅Dk ÑPíVZJ¨1¡fwÛÍ6ŠÄ2””­ áLj:ÌèÌóÌs?ûbæáaûxßL¾çœûý~3÷žó\Yžü°¯²¯²§%°ý+žòfÊ›«ÿžÀ­q°•ÙÊ~Ú韧q:ã´1la3oÖ/Ý/bñ/Õ3ã²\¬€û÷7¶’$> k+Ö¦<—À½ ž.OWX‡ú‹õ:Û;ÛÙ÷¾¿÷=À|É| XØÌ›õæ~“o)¿þ¾,ûvÙ·¶ p»Ü.xaË [r>Lüœ;·ïÜ0é˜t(;Äg/^U„a®¹%ØÌ'ëÍý&ŸÉoê™ú ?+ŠW‹À®Ê]•žS‰ Ãgá£Ì2M=­ h¢ /è!=¯ŽWuU]À† ,læÍzs¿Égò›z¦~Âu”†ˆÈßþ@|·¾[_4tÍðjÙZ6¨ÇŸ?–L(cÞ˜6¦A¿£ÿªÿ jZ£Ö`­Y¦˜ZDJmÑkô4ýŽ–ª¥‚úc‚v‡v‡€ûIýÅ£œñÏ/ž_BNzÆ^{âÿ`†ÏðYTˆª° G8‘%FÎp†3À6°aI|5«Y üž,²ÔÛêm"$ù׌^½à yB!'?&ü$ÿ±Ö>4Ö7ÖƒÚ`¼lòž,?Yw²5¸}°t°ÔÒ»9{söæ,4l>Ø|FŽŽ9jår£Ü(·ðØ¡±Cc‡àÄïNØOØQÃãÍãÍ‹Õ/« ¯5¼fmkŸ°^DäÆ>èØÜ±ôýª®êÚ» ï65[¤ÏÝçîsøÜ?î‡¬Š¬Š¬ (‹—ÅËâ]˜]˜]ü@~ ß24Ó2Ó2Óë Ö¬+€ÂË……Û›ó^Î{Dg—ëú„ªƒóŸžÿ”?áÇ)iÛÒ¶½R$òÆûo¼/¢ÎI¡ÚN½Õ¹³g¿HÿÇ?¤ý&¢î«y5/¢wëÝz·HôQôQô‘ˆßî·ûí"ÃÃÃ" 6.l”ÅÕ}»ûv÷mGž#Ï‘'r}ëõw®¿#òêüz×z—¸/¬ú²òËJÛ©©ÚZµUDýøÌgn¼Rd—ýŽ~òå²3ì ‹,;,·ä–+‡«Ò«ÒEVn^é_éÑÜš[s‹hUZ•V%sÄ1‡È•ö+íWÚE&,Â#ŒXÆb¹±ÜX®ˆ÷¬÷¬÷¬O;Ÿ6˜6(òä?OÖ>Y+A××Yp”8JÈ·KÜè2ºl±k»´]"òªˆˆ¬X$6bñX\Ä]ä.r‰ ù†|C>‘œ²œ²œ2‘ µj/ÔŠ¸\®‘þžþžþÆg\$³:³:³ZäîÞ»{ïî™{knÇÜ‘ „"¹‘Üc¹Çd…HäVä–ˆüWWÇmä忱‹_}ñÕ@zâŽ%¯H´Ø_üzñëpéñ¥Ç—[w§4«4«4 2R3R3R¡¢¦¢¦¢†ìCö!;(8Pp&ÓáÉ0Ô7Õ7Õ7w¹×åuÁŸÿ´/c_Ñd¯×Á¹¼syÀ‡ ?VWjŸ4~Ü1»2Þï…‡-¿~ø5*Öû,ö™eLߤoÒ7ÁLd&2C 1ÔµGí¹¶¹¶¹60jŒ£ÔeÕ£z ø¯à@peÌh/i/Y]I°±¶±ó´µ/iÌw <ÓžéFFõ·1N§—̱ûjZMƒJQ)*Å2ª|ʧ| * KæØÔQFЬWé*ˆúK’¿~tbtÀôCN~þ¿9&‚JN^Uî(wX“·>¥O­ñH«Çê‡÷ã7…óèùªH©âáþ„ŸŠ½b¯ØëxÈUsÕ\µ bŒ›‰›‰›ÁŸvßÚ}k÷-`Ï=wöÜŠóŠóŠó4›ùY<ËgõX}ÖïÉ<„ÿE¸|‚ŸågùYw6›PRyRyR¹üæék§¯¾Fc¼“ÞIï$øðð€n¸ÕùY<ËgõXýð~É'žÌGL‹ù ~‚Ÿp_bò†ò†ò†¤ŸÆãŒ#´h&ͤ™äz¹^®ä5òy [e«lÕÙ!?‹gù¬«¯‡õ7-VÑ8çà„ˆÇÄcâ±ÎoX‚¥ÅRg©“¬*Ø[Êe¼Rç|×|@ÝR–”àq EY (CÊ´õ˜~O¿¨[Z&-¤Nš?  o)>Å/ ³´X, ’•õg<Œnnno_ÇLM¦÷LïÑ×׈kÓ¡:^ù}å¾r_à…¤Í'´ãÕ›´žÖ=CÏá>@~_:(Ôr]ÜñîxL›šLGLGh ãQùÄJ±R¬>ƧÊNΜ£B|’Ã÷šï5èèàï¶uÛÀñ¥ãKpÄ:b ûÓîOàúåë—õHSSÐmí¶ð÷ûŒà÷ø=€äP •B5ØwªìTÙ©2z@l¡ž¸Œ¸Œ¸ ´<Ü2Y;Y«&J0Ï¿>ÿ:orjr*|î€xbnÄÜÐï7¾ÑøÌÆÌÆ@—Ä€xX<¬‹ó …³’ $hýn™ühò#€ñ0>z|Wë®Ö]­Ú/“Çå‹òE¶åòGÀôд^ƒ8þîñw µ2µR¿`æÀ ¤•¦•ê÷¿[ÿÝzˆ.þ9ž+IW’y\ãa|!Pôh’ åB¹PŸKh‚Þ««®k€OÌŸ˜õþŒ¶Œ6x>åù(ù¢ä xé³—>€¯û¾î0jxT:*Õú¯-^[¼V½·ûØDm9í9í9í›çæÉ<Ѓô€â—ØŠ­¼r¾œ¯)­+­€mãÛ¦1Õ3ÕÆKÆK°èÜ¢s°÷…½/Àºmë¶ðG7D7¹•s+ YÁi°*yKó–æ-Åã#¼•·òÖÀ}öª;[u¶êl•N ‹‹uþ›oÔkòsÃç=hàÛÀ·°âÌŠ3P;S;£sK^³× äò _ø âƒ ­ß•¶ËׇÕIþŠËⲸ¬À}"¬Ö ëëšÙSf^i^i^)'»öºöºöª¼t3ûژݘ €>ûö³o€´QÚ´ˆé÷lß³ÖîZ»K¯¾aß°ÀöC{bzbà÷1ÁÔ­Ž_¯¨/!AH>œ&±E±E±E„ˆWÅ«âÕ® õÂ/¶,±,‘k¬Â*@±ç çºþuý|/漘6É££zû¦í¦ ž©x¦€76üT>|õåW_”j¥(¿^‘Q‘¡øTÀýÂ~aÿßK‚v4{êÙJ:iÈ2d²Ü¿g öúÚôÚtmžÒÒóŸÿ¸‘|#º‹œÒA@¢ôRùñ߀s9çr¹l f F›o÷¬ãˆãHp¾„|3ßÌ7Ïoá–q˸e?;(üM}¥–r¥\ia×Åuq]L+ʯƒÎ&gœªvk^á÷p€t€”ž '¹ÈèfÚL›5)MtÝi½Ó ˜šŠLER¥:É¡F¨±[T4+±«hÒXóI>Ɉƒ8ˆƒÁ#Üî¾ùGõÕÚaÚaÚ!]‡Ç:Æ:ôÚ¥éF= æ0€‰ÎIÓi:@Kàgaûþº/u_ª\£¾‰ÑãlL<”x(ñ!¼…·ðîBˆ®Œa. }–c˜0Æõ§Ô¦Ô¦Ôb(7”ʪvó-ù–|¹†5TìŠ]±Ã'œp˜Â¦4n9MN“Ó´k§}Cû†ö t³ú.7ŒãÄ|该…á'Í D=á"̯ÂmÓ v]4íÚëíõ:í%£dÔ€”{Ê=垦ÅQŒbpFFFÒݪ&cùX>ö•ßDHñdßòä ¡=B»»ÿvƒšv¥AiPÔ¥¹Ä¹Ä¹D }&}&}F^¥jñ¼p^8ÿ»\&µô"Bž²´V@Ó®Gðè´Ûfj3µIFW—«ËÕÀ?üP¯x{¿½ßÞ¯];b‡Ø!vŒ†þ%‰þKDßÐ>‰y`äb ¯„´{ñ?i·`gÁ΂šv¹Î\g.þôSõ$8gãl…uámø©ˆ¾ù/×Ó´»Ihš…f÷lk²5Ùšèo3g>Î|,ÝPÚ#x=‰t’NÒIB׎àŠè·€ü+R»ávÁ?¸ ®‚«ÈV²•lUVóËùåür€#áÈŸ¿2ûÌ>³aX†¹Ë¡Ä’ˆ“û¿-£ú­ˆ‘"ñ›p÷á2žò”§7À pwW÷S'3Q÷©Gý/¬÷Îu׳‚1IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-9.7.png 644 233 144 2547 13755454066 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–oH•gƯsª£BÚØ™)*cÁ´Ú‡r8‡2–‘Š6ÖL"*F‹AØüâþÀXµÁ˜#šÛB 1+Ú§ûOkD*ÚJ7+³Ùô žê=ï{žß>œóžó–ßö©çËᾟû¹®ë½ïû¹Ï#$½ÿø³ýÙþŒ˜íß‘ô§¾“úN~GÌþÞ_µ¯úæg°¨eQ ÀâÿHÚî¾ï=/%ñ½|®_/)éHéJéò•Æí/ὕï­L]³¿>i'ÓNÎÚ°ó׿üòó/?³Æ.]˜,,…¤íî»ñîyÏ‹¯/Ÿã—`Á™g|#H HSžSž÷q,àÏ<ØX±±à󌜀…,4¥À4Ó¸kÂc»ûñx÷¼‹çâ»|.L ó­Ì·$¨z¿êý´ÖØ6øä•O^qù"'ýìg!ØÓö4€SçÔñÌys>HÚî¾ïžwñ\|—Ïåéѳµý¦ S¨ €È%pFœˆÎØ›ìMDì¥ÎRŒÙa¶š­ÌYæœé1=à̳£vœœ¯œ¯0N†µÇÚCļm§Ø)‰¾ÄL]c»¿)ó”R’^ûÒÆÒÆ¦çšJ–f½ ;5N a¾ ‹.‚2Ê(²È"ËãÌc?£õ)O½f´>ZOØÅ‡!gÈ\O\Ø÷àÃÏ?ü˜ˆ¾ÎËö{A27nì¾±š‹›‹›‹áε;×î\››±áÜáÜá\hYÛ²¶e-}tôÑÑGОҮvAßO}gûÎbÀã|.\?–·7NI%{KöJæ©$ùŠôïüÈüˆ¬›½7/ܼ _ÕLU¤*"unîÜܹYZߺ¾u}«4:8:8:¨Ä•:‚ÁŽ têÖ©[§nI[¬-Ú"éjéÕàÕ |ñp+ÁçO茞ŒÓc«ÆVóæ³hŽ4[ͬë[×·®/é/|Rø¤ð ^vxÙáeI¿Un•[åIûXðXðXjÚkÚkÚ=À÷L—鹎¿«G°8}qz´&îMÜS™¸ö±Ò´··Ba]a]aT4V4V4B`M`M` i:Òt¤ÉÓüÍAsB'B'B' ÷~îýÜûpqÅÅWx:­ÃùÖùÖ;fbü®žùRôtô´¯_²+íJ­àzÕ«L7דg&OOž–ògòÃùa©¬­¬­¬Mº^p½àz´<}yúòtéAýƒúõRV[V[V›t<ýxúñt)˜Ì æIÅýÅýÅý’ùÛüeþ’üEþ †¤ˆ$)S»Ò®”\=~iºtºôߥsÝçº%_T’Øîö@Þå¼î¼n)”Ê eJûj÷Õî«•¶Uo«ÞV-YEV‘%• – – J³Ã³Ã³ÃÒ•†+ W¤  6${P¯’M¶¤\ãG–._Œ?¡gέ$~K~³;íÎd…¬lk©µÆW¯_ à :‰ŽÀDÓDÓD˜Ûæ¶¹ ¡üP~(ÂÝáîp·§·Î2ÀÇž²§<|ÏÝʹsìÉÐÌÐLrޱÄÙëì%lÞ5¦ÑÓK9&Ç仨Å.q„Hl8Ç×GlgûÿžcžÉOmjm*`C|ò8À~gÜ'b®˜)3…á½ôÿð‡`úM¿éBL1,c K€~à D?~J„ˆÓãô$¾âR‚oîäaÿ+_Ø×Å û{1_°ÿ›ùéÚ·(IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-30-grey.png 644 233 144 6265 13755454063 16001 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü jIDATXÃ…—yPTÇöǿݳ2À0€‘å™°‹KY \ƒ¯ÔbM4SÀ})J#Š‚P‰!‰/¤@“ &y/"?@@ED~%Jb4 (¢² * „E–ad˜¹÷öûƒxeU*矮^î9Ÿ>çt÷¹$----- *L‰~ª¡âÇâÇâǬ*ítÚé´ÓÌ=£?£?£UsfÎÌù“ÿå<8ÎcQüdùdùd9ËÂ)œÂ)’Œ@"@ÚÐ ñˆgY² ² ² $YÜ+î÷6ž"#d„Œ8™î–î–îVó s{æöÌí¤óá|8òê‡ð“•KE§ÃŽpZ dB†ð“Ùh6š³gTdTdTt™ûÌ}æ¾ê[ã ÇŽ/\´Ï>Ç>Ç>•‹V.Z¹h%I•„JB%Àb—Å.‹][ß6o[oûÞ¦oZ¿ÕžÍ¾ÇÆ'¶zpS2%S [I,‰%±>9"‘Èçê7Æ3Æ3Æ3Þ.®Õ®Õ®ÕüÞ•m+ÛV¶Q˼–y-óZÈ:Y²,Y–ŒqÄA„ãÇ8€Ø<á OŒOΙœ39ëZêZêZê˜åJà•À+ÂÞ¡ÕC«‡Voù\á£ðQø,•ó±|,»"‡Å±8÷x+]FR'R'R'Ô¡usÅåârqy]‘Ùd6™MÞѾË}—û.çÂcvÇìŽÙ-.PT•¾˜…Y˜Ž°1ÚÑŽvp€€1Œa €j¨ÒA:H8 bƒë•z¥^‰G¥ÇK—ç¶>ºþèú£ëâ›R;©ÔîÉen·ÛðНà¼ÒýŒÚ5Ø5Ø5w‰»ÄýȵñËã—Ç/{Gû¾îûºïëܺ¸íqÛã¶‹oª\U®*WÌâÏóçùó€ðšðšðÄÓ å¤œ”¤‹t‘.€ ‘!2^ÒKza­°VX 1¯åµ¼pvvÆ,›~ßM¾›|7qëlöm<6>’Q•Q•Qõêbsƒ¹ÁÜp¹AùLùLùŒù't't't“U¾*_•*¬V+ ¤5´†Ö`F(((€åXŽå¾Æ×øÀNìÄNk±k¤ )3Ÿ ZA+hZD‹h ú÷ôïé߃pÂñ„ã Gjp28œˆN* •†F‡RÈYàáM–HK¤%Ð4j5Xi” 1BŒ%½J¯Ò«ÀÀ… €F—F—F ãfÇÍŽ›€-d Ù†1Œa×q×aõ°zX Üþåö/·ž˜Ÿ˜Ÿ˜E£h ¤ ©B*”ª¯T_©¾‚Ts[s[s+m<6>1çÏùsþKœKœKœK5_3_3_Cò0€ €£¥´”–÷.Þ»xï"PX_X_X8Pê@ããã`îàÜÁ¹ƒÀéé)ðôç§??ýÈß–¿-`l66›ÓÓÓ â÷ˆß#~¢‡¢‡¢‡¦-¯ž¯ž¯&yW¯^D–QcÔ5K4š4š4*d,-XZ°”ÙÄÈïã÷ñû¦ûì‹Ñ/F¿e¬$³$³$sf¼åtËé–ÓŒ%­NZ´š1S¡©ÐTÈXAgAgA'cÇ"E‹œYßþ¾ý}{Æn=¸õàVÆúÏôŸé?Þ£ÇÆGñ>ÂG$ÓbZ<½3©'õ¤~&§ÖÕ®«]W ,gËÙr´Þh½ÑzhÔ6jµ€««+@›hmd²´4hiÐÒ=~ûüöùí$M’&IÐ]Ý]Ý]çEFߢoÑ·œÀ œ Tä!òy°³†0C˜! ÜÜÜ‘ãä89†P„"ذ1`#àø¾ãûŽï·*nUܪڿmÿ¶ý[ÀÎÏÎÏÎ0K̳êêê”AÊ eТ……lÆflø~€˜žfÖVdl26›ÐI}©/õeg©üSù§òO¹ìN·N·N7vönìÝØ»±æb.æÂd©³ÔYê€;?ÜùáÎÀDðDðD0°ãÈŽ#;ŽIÁIÁIÁÀ}õ}õ}5ÐñaLJž#ž#ž#€!Úmˆþ¯K¢‘6ÒF€¥°–<’Gò¦§M:­N«Óº]®ŸÉ;åòN.›"1ˆI?%N§‰ÓHrMsMsM3ï;š>š>š…äää EÅEÅEÅ@]S]S]ÓŒá±Óc§ÇNäGò#ùpiriri<ó=ó=óÆÒÆÒÆÒ™õ÷î%ÜK¸·¹·¹·¯e^˼–aÒ:­¨,©,©,‰Žèˆ_žð„ÿF*v¯u¯u¯ý8¥?£?£?cîÛÃï¿;üî[ÎVŸ­>[Íï‰×Çëãõ¢ì͇6Ú|“%ªU‰ ²†ƒ ¼?ïÏûaê0u˜ðZèµÐk! 4( JpŸ»ÏÝ瀬+YW²®² Ù„ Ðôhz4=`/t½ÐõBdeeeÂxÏ¥žK=—èM¯àü=­¥ÂRa©Ø{Œ¤þ–ú[êoêQú¿åJú%ý’þŸìÆJÇJÇJ½ã¢ÎE‹:Ç¢¢££ImïµÞk½×Àú¶õmëÛ¢ŠWÅ«âïÃÞ‡½¤´‘¶™§sìÌØ™±3@{q{q{1àú«ë¯®¿^½^½^½oÎiÎiÎÁæ|m¾6_‹K ¢ 2±š‰˜ˆ‰mF‚ôð]‘ÆQã¨q5|’OòG7Áv°k~UR)©”Tî{òìɳ'ÏXÃìÁÙƒ³‰Áo½ßz¿õðs¹‹ÜE8p>à| ÉErÀ,ÁGpG©«ÔUê xÜñ¸ãqP5«šUÍ0Ê å†r8„„„p7ùYü,~]' ‰†üQˆBÔÅ\d! Yâ9Ö2ªŇI.É%¹µ»h {˱»±›»Tx©ðR!·Sï¡÷Ð{@AI"I„AØ/ìöøßá;«° «€©úÀ~ìÇ~@ 2A6‹Ê˹—s/çò{FJGJGJŹ27™›Ì­0Sý™ú3õgŸ_E:Ò‘NŠÐtp+lõ¨=ºÐ….DRr!äBÈ…ìòwäïÈß)Ì   ëKÓJÓJÓø=6ƒÄ›xoLN¿ù&˜`š9<ÌÄLÌF+i%­„ì†î†î†ŽEÕÕÕ‰²íììº'ÌEæ"sQÒÇÒ¤?H˜Žé˜NV5ßÛ@Ç­m±à 8pºûÇÝ?îþ˜͉æÄ¤ííí·U´U´Uˆ²«Þ¨z£ê Ev‘]ddB¾/äƒM¥ÀFÙ(G8ÂÁôT÷T÷T‡ÂêÕ ªÀɾϾϾ„0!,écz”¥G»'è)zŠžåZ·ùêôdÛ¹õ—DfíZC$ÊF5ªQÍï!á$œ„Gmœ éÕó–––Â?¶[„-˜wtÞÑyG±AhZ…V(h ¢A˜ä’¹d.²/¾ ø2€W÷½Ü÷rßË¢vùùù‚ì¥S‡fïM!OÈòĹÖȾo‹Xfffff& 6Â:0CÖÜÝcÍÝ\’CrHNíª¡ªÙ[Ž8Ä!Ž«°TX*,ÜNýIýIýI((¥”RŒÚµÎT“ÏÉs V?[s÷|ȹs!ç²7Êä ò„Â̱¾$­$­$ßc½–œZ\Z\Z\ðﺆº†º²UѪhU´‚¯à+øþã'ñ›â7ÅošþÇ?Ô?Ô?”[íýÝöB=Ï%ŸHddddd$8k·…I™”IÉ{}Á}Á}ÁøÿÿÿÒ-Næ/ó—ù¿~l`ÅÀŠ.çôõõÙ?ï~÷û»ßóËÆ,c–1‹(Q!‰D|0‡d'ÙÉÿ«„ 2ÈD¦êWÁÓ«£¸çyþBþ$w3P…*Tñ鬜•³òÈZFËhÙþë'ÖO¬‚%y’èçç…¿CPv±ì"ÀùSçOñ ´´ ffƒeë¸Î×õ/_ª>á‰W&^±ýŽGŒÌ^>{yòá„GÉP_ðl³ ÊÆk`“T6àÇÞ([Ç#ùº^ãi|ͧùÃz¦gMÏÂu…ëœÍá‚î_¡rfåLͼìg?“ ä ùŒ£„ <Ê€ X¶Žë|]¯ñ4¾æÓüa=òñÚÊÁW, Ž º¡®…jB5`L”J ë}Æ>”g8 '¨l•¥²øl˜ïÍAsBoÆ ”* u„:‚1h þ0>;ŠZ࡜¨¥ùêp8|_@ÑcŒáç¹Ñ܆‰Œ|ˆ²üø££Ê¯üÊìe/{£òrØÂàKc‡±c¬"Ñž÷=ïÁâë‰;òlÞ³y¨Ýæ×—Ô—Ñ—jHoHmH…co޽9öZ-ŽÜ?|ÿðýÃŸÏØÝŠ»w+ >³>³>ßyÜñ¸ÃÒ¯:ƒž gl~—h~­'"ìÎV83|fÌtõžOç€ç,]³tÍÒ5àîpw¸;¬ Ðt»évÓmKPW]W]WÌ)›S6§ ÒÓÓa^ù¼òyåÐߨ°ÿ 5ûê'Íæ×zâ®Æ]Uga u 5ú›U»j3Ã\f.³¼§O'žN„¢Ö¢Ö¢V @€€¯/¨/¨/€Œ§O3žZ~—×åuy¡qEcnc®å7¾Öoš?¬G ~rüdóxû½ýÀ»È±ÏQ‹Ô" `øÜð¹ásô<éyÒs¸>ÿúüëó?_Â¾æ¾æ¾fp•¸J\%¿-[þ6ˆI‹I‹Iƒ£µGkÖF û&§ù#zì"æeó²íHhuhµˆÄ‰ˆÈt3Áô™>-îw‹[$±0±0±P$³;³;³[$ˆ ÄŠ¼è}Ñû¢WäUÊ«”W)"sÕ\5W‰¬ªZUµªJdšš¦¦)‘äËÉ—’/Y¸¶{a¾1þˆ»ˆ/Û—ÝuKäZÛµ61DDØ$ëUšJ“€ð4yšE.¹ªJU (ÂÿBD/¢Ï`¸žÈ;ñ¥:»Ç´Çd°é¿º}ëÖ­[Ðô³&s“u-ïZÞµ¼¨ÞÐàÐàÐ ¸Š]Å®by4òhäQÔ¯×éuz]ßi¸Óp§Žg9ƒ¾ëºëŠê©Ù=¯ìyÅhí‰/E·‹ˆ\?Ýw 7ÏyŽzŽª·rÏŸxþó¥¿(µ”Z °½°½°šô&½I‡å­Ë[—·BUaUaU!äŒæŒæŒÂhßhßhߢŽ^™¼2yìEö"{Ÿ-î,î„_ž·î°î`Þ›®kãê-8ýÞé÷@ý6\O OiJizée‘ŠúŠz‘»[‡Ž 3¹·ýù ÷nI¸ôðÒ—~IŸLŸLŸ¹Øv±íb›Èþ5û×ì_#âLs¦9ÓD2îeÜ˸'âóùÇäé93xfðÌ ˆy•y•y•ÈßÝxíÆk"û’mK¶IBwΧµŸÖšÜ"[d‹ˆ¨ÁäëÉ×_z9Ö\ÿnü»¼ÈÁÀׯM²õ¿}}â{a‡µÒZ)™%Í%Í%Í""‡:uÑ,šE³ˆÔdÕdÕd‰,Y8²pDļҼҼRDvÉ.Ù%²»»+’Ú–Ú–Ú-8ítÚPÚÈ“«OlOlâ‰ß¿Y2åGs™¹ŒEÿgêÞÔ½ªfÌ>€ÿ½Ý|»’³ÇÇ áý†Æ†Æhk\.—Ëå‚ G…£bÑG^à(p8 %®%®%T§êTÐíéöt{ ÀYà,p‚w³w“wüºÙ^k¯…M]\̹çÜšH9™rRuĨ}sŸÌ}òíU‘ÊJ‘ÁÜáûÃ÷qÎwÍçÍçÉB‡{‹,]»tíÒµ"¦ÓŒiF$”J ¥ˆ¤—¦—¦—ŠØÛííöv‘rG¹£Ü!bË·åÛòEV—¬.Y]"²ÎºÎºÎ*bí·^°^ùÍØúsëÏÉÂÆÌòäòdœ"=ô| bvêõß^Ž…§Þ>øöAx¢…§dòßžóžóà1{r=¹(Ï*Ï Ï ˜ß>¿}~;hÙZ¶– ]]] ïÓ÷éû@íT;ÕN˜rO¹§Ü ×ëõz=¨³ªGõ€ï’ïß7(}2X,ˆN%¾½oî}Ð#SÏèc¯DöÌj™ZFàé¦ìS}ªT«jU­ÑVªx¯âAy•Wyí±Ý8q‚îS‰*@Y”…€z?¿{d|d É—äóÇ2ú{Ìø|TÎ_ªTÕÞÌêj(5” êÚ¬6K¿1ÀŠi¤ÔÕ­ºSœâ0Ë4Ó ¾SCjx®›‹úsúsÕ5mN›ƒðröÃ뱯Ç ?ÝüÏî¿ò™½]<³÷±góû?0rÁX ‰GIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.3.png 644 233 144 2454 13755454066 14751 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜáIDATHÇÍ–_HTYǯã–Nei¹D» µ-‰eÿˆÖÄ¢e„!‰m—­ mçe'–¢ØB{(Í?HHJ°».Z»j´k­–=èƒéÊ º¦4ãÖÊÔ4ÎÈtï¹ç³3w}õ¼ÜùþÎï÷ý~ï™s~÷( (Š¢d'Ÿ Ø6‡meÛ¾6ã™e™eŸþœÀ-Ò*Ò*FΪæUÍ9m9mú˜‰y#ßZ¯(&¿Uψ+ÙŠÈhÏhOs&ñ8´åЖ̸öØ;íQ ŽÞ>z ãzÇu¾™‡3^:_:ÁÄÆ¼‘oÔ|V~åÂ[úŠKº—t§=…Œ¥K6”n(Ýôm"a||~àóÏÒŸ¥Kˆ¬N BcÌZ°1ŸÌ7ê >ƒßÐ3ô~È-É-QpUº*í­‰‚±Á»Þ»ÞÐS;‹\dh- ªDqäÒHóF¾Qoðü†ž¡Ÿð£,üoë>w†;ˆ¨ý ¢" ò­F«AÕÆ44úþXŒ9¢D5‰¡Oê>ÝÚ´X.–#å­Ak@!`>É/“z)}Åj(¿ ì3ö™ÈÄü¯ý¯Süûå¬(åÄø‚Ë\¶¹Ä%. È€ ˜a‘ª©¦Ú’ßÅ$“ÀQÑ'úˆü¼ñÏûç!¥Ÿô“4Öò'?wü\ê}·ÉŸÔµÅÔó}ìËõåBÃÆ† ahÇÐŽ¡–òë~Ýoâá©á©á)¸Rt¥èJøÿñOù§L>ù‹Ú¦¶™z¦~ÂOÒØÐwp#|# ú$€ü*YÝ6š7šÍ¡94pÖ8kœ5àð8<ôuõuõu™†¼Þ/d×g×g×CEsEsE38ÆãŽq˜x3ñjâU*=.‹ ½„¾áG•½+{e;ÌìœÙ ºãÖ—·ŽÜ:^×ãõ˜ñ‚é‚é‚ih´5Ú-5wÜwÜwÜpÆuÆuÆ=ÑžhO ; ; ;aøûáSç,+ýÔø•Ð7ü(“•“¥ÿ³Ù Ç^zôJ½Ò$ðUùª|U°µikÓÖ&pžtžtž„X]¬.VÇ;#|>|>|Ê÷•ï+ßùEùEùE0ºftÍ英xB/¥ŸôóîŠ .xòû“»Oî²µËÖ.[ Õ¢ZT ˜ë™ë™ë˜ŒÉ˜„°=lÛ¡¶®¶®¶ÊËËMž(v»‹ÝÐ?Ñ?Ñ?{÷ìݳw¬>±úÄêàVÜŠ[paxsx³eÍ¿w½u*ÿ0N‰P… ñâ»ã»‘/½è}Ñ ` BPêA¢÷£÷£÷!´.´.´¤Kº¤ Ôµ@-€çÁçÁçA‹11fžJF´GÚ£ÿ=•–>†_øEŠ`?è‡õé¾'nAsÌ1gByOÞ“÷@¶É6Ùf‰/•Ûåv¯ÄAqÐÒÇbþˆ?ïéc–ί¹ÓÝéÚÏYQ"J@¶‹,‘…*dX†‘ò7Ù!;€ããÈ É0C ð§9 ²GNÊI$­*ˆ1hI~Ü™îLc¥tþEû­\´·‹E{[œ7Øÿ·n¬v-€qIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-19.5.png 644 233 144 3052 13755454066 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜßIDATHÇÍ–íOTgÆïœy Œ¥@Wl* .ÄX ʤ¤DRˆm¨tRÑÄÕjƒºën»›¢bPKÜ) ³D“v^íZ#2fKSXe¤€È NµsÎy~ûaæ8lûx¾Lî·ëºò<¹¯yDD$!ô+ñrÄËqÁ8bG8¿ xAñÒKÁ¸^K™¥ìßµ:þ4@â…Ä Æáج›ýóçEÂøóù̼$H8ÓÓlYŠÂÛ+ß^¹ 9ÿ¥ l­¶Ö'T·U·´4¶4R?]ÿé:€gg„c³nö›ó&Þ||9ú+~ˆjj·üb¢c¢E }}úúÌÝÁ†ÿdB©£Ô09©"@Ä«Ö>|˜ßô¼Ø¬‡úÍyÏÄ7ùLþ E¯/z]Þª|«Òv>8ðÃßáÃÔSM¾@+p‚Ä‚æÓ|ú;ú;øAu©.,X ›u³ßœ7ñL|“Ïäê _¥!"òIú&m“ö\P¯x%ð ¨é/é/”1aŒ£ Íh´G v¨j¿ýzÐÐPú‘¹3sgè¯vvƒîâS¾)iS’)ð“¢ðU>Éþ löaŸ• e e€Þ@ -F¶‘ÍS“G=V3j8ÌaÏPDEÀb³x^~AÇ<æ1€Z¦–=Ç+ÁÞÁ^›ÏæóYƒÂ²? X}7^gµ³T-€a7qʪªPîî"wQ˜¯ÿZÿµþkPWXWXW÷úîõÝëûínnnBkcëÙÖ³àzÓõëÔÙ[®W<ú“î×ý†jrkrA½Ô#䉈ô탦7šÞ­@mÛÜ[ñ~ÅûøÍéÔ;õNêþ)HËJËJË‚5®5®5.X¾sùÎå;aìÈØ‘±#aa393939<š<š< ¥ÛJ+K+á½ë››øïåx ¡¶AËG-ñcPð縒¸Õ —'.ÃÜRV².¯¸4{iR_M]‘ºnŒß¿1+/V^¬„‚®‚®‚®°€UÏV=[õ êÕª;Îwßê¾Õ} ¬«ÃêÇnG£>ŸºðÕ…¯æmÞ¸sÜ \;wB5 $.L\h puºaºÔÏ×€‚¶‚¶‚6hw·»ÛÝàÝêÝêÝ 9ksÖæ¬Ç~Ç~Ç~ˆ^½:z5ÔÇ×Ç×LJù:†:†:† úJõ•ê+Ðt®é\Ó9H--%-šb[¶d´>­ô?.t-tVÑV£Õ2 {À.¯ÊjYÚ |88/b½k¶‹x¼¯Ç+²4riäÒH‘âŽâŽâ‘ÛY·³ng‰¤E¥E¥E‰øí~»ß.âm÷¶{ÛE’ö&íMÚ+Rq·ânÅ]‘¿íý´àÓ‘×îµË"#ÓÈ‘³†ÃpX"Äê[ï[ßÿø»®v]±ü^D„í!]sq?ƹãÜ"jÚ£öˆdôdôdôˆÌn˜Ý0»Aäxùñòãå"UeUeUe"¹“¹“¹“"ù–|K¾E$eIÊ’”%"=Í=Í=Í" Hp&8E~7²ì›eßÈ\Õ™íÚví"mùmù"}¿dü’Ñÿ]x+ΣæVê_ë_Ãì_g¿œý5wpnßܾðùGü#þ˜Ì›Ì›ÌNr’“`Œ#ÆL›>6} Ô.µKíí€v@;­SO¦ž ŒÓ’@‰‰fØvf;³M?«ïÓ7À6i›ôYaðçÁŸŸó—ðÌh4Ã>F2‰$‚Ú¨6ªa¡*]¥«t` [Ø2/ߥ:U'¨ ê]õ.€*T…ïûÞÅj–íûÏñ}¾?>Ÿû>Ÿç{hÊ~@q&ç$ù’|I>é‘q2­}Zû´öõ?W™ÊTvóÏ´‚VÐ `*ÌëI%•Táñ>¯ù¢^ôýãñäœx>v~•TI•²7>þ£%j»Ú®¶{ÃÒ>iŸ´Ï$’š6”6”6„³…w ïÞ¶ônéÝÒ åååZ¾ˆ‹|Q/ú‰þïÉ|H^ï?w\–‡åáà 1¡ùåóËç—³×›»›»›»ùŒÈÃÈÃÈC (ÅF0 ˆ ‚€éq‘/êE?Ñ?ï¹ãOæGŽgä>¹Oî ž r¯ä^ɽ¢ÿÂ?éŸôOÂÃxÏâYÐY5«fÕ[ÉV²•s37sÛ|#.òE½è'ú›„ãðϘÔ$¯ä•¼Dê!õz¨å–(pÖ;ëõºÛ$ö¯âUˆè-úúrp˜`ß²o€çó|1Qû¸`¨²Gì ·D¿ˆ~ð7x'ïDD$ ‚Ÿ úûÍG6Ùl]á(ó³ ñ9|Ž@`{`;,([Pf'ÚTÐT`Ïë w†íqñùb΋9¶´Plil)Àüì»dá >‚Ÿl<©%šKsi.ó%Ñn\ÄE"ú¡Ô/õÛ7CÑkE¯-¼±ðQòƒäDDÑh4jÏË/Ì/´“tÞvÞ&" _ _³¥%'NDчô¡…¯µimZ›ùä—Dq¦¯»¯»¯›üQy<4"Eù•ô²ô2v¹Ã{wìÝAD4ëËY_yÏ{ÏMê“:Qòxò¸¨¶]Ûn÷•L%“ˆ°ˆ&ŒãoèkúšHî;ä‚HCÁPü‚ÉnÙ-»'™ñú÷+OÍ>5Û&äû·ï߀äÉ DGGÀíwû€ÒBÈHÊH€÷ßk|Ü(h)h çlÍÙj{r§'ü~ ïRÃ¥†K æ/à)[Ê–²'ûei@~wÊñoj:j\5®ØO‚Žïö¾K3”ñÙGg¥aäWݪºEDIá‚0aNÅœ ""õœzŽˆÈ±Ç±‡ˆÈqÂq‚cJ¯ÒKD“Ê5åm2N‹ÕwÔwhbŒÆ‚cAšQ9X9X9ÈWE’ûå~¹ÿýi”âJq¥¸ˆÔËêeõrkŸ¹ð‹œ«œ«Ø~ñUcþ1ÿÑ©Ý`täÞÈ=û#i|¥ñû£µÑZ›yžž'ß­éXÓĦv*áò”ûÊ}±Q¯ìVv+»oOùÓC ßz~£–­eiYÁS¢ÀSíiö4óuæþ˜=þÉø'à{–= òiøÓ0ô¼Ðó‚hìdì$€¨ð¯¸®¸Vv¾ð|¡uÕnlÄF'×ÉurÝøzi®4WšûÓæÄkù§ù¾J¥R©4¿Ij•Z¥V¡•د}]¾._—5O¶Ÿí·æ ЍEÊ>+Ã]Çwñ]Ö|ûZûšúš€ŒäŒ™3õ s’5JRãqšÔÜä&·ê°¸æQå©5ä%/y‰”RB¯wˆŽ&G££QO ¼88`òu“ŸO~¼„—ØŽÂ?zÐðb¶ˆ-²¾Ê¶Ûîl»Ãö‹þêˆ:¬û¦ïMß›¾—HvÊNÙ)6Ø• š3Ïbå®rW¹+ufVeVeViåZ¹Vî;hj7Ï™ç̳k7æ‰y…ÏømÄ m¯z1[Ì[ó=¶êتc«ø:ÑOKÕRµÔ>c±9’ãoZºø$¥÷j¼ïHÖ²µl-;pÚ¦ÝjOµM»©zªžjŠ=ˆ=ˆ=°´Ø35Xßôžé=Ó{x¡©É9ENyõ@‚ø%Ñ“”c Ú-|švõ.½Kï²”;–>–>–,Z6´lˆ-2µØ¦´)m\-¤fH/‘à,zŠY ¢Á÷i·ÁÑàhÐS­Ö@«ù¨†SO§§ÓÓi­µImR›zŒI¦ÿ=×8§O#˜h¢àUC»ý>í®Ý´vÓÚM–v}«}«}«ñÑTœ›7!•H%RIþoãaäÁ\‰þK{švs”:¥N© ®„KjKjKjù²&²&²&ô™WRBJÈ3ŸZ¨…ZÈX;J /‰þGKÔîÁxí7ÒNi§´ * ‚ØRyžŒ¢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.1/web/www/routino/icons/limit-14.5.png 644 233 144 2704 13755454066 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜyIDATHÇÍ–ÿKÔwÇß^7í¶ÔÉ)£È];7ˆèÂbåÈQ³’•‘L”-‚¶S$Œ­¤,„-Ém¸±±J$î޹ÍE£FN3=aÄŽˆ®ÌÝÆ­}É›§žeççËû±î>žÛíèýˇ×ûõz=ŸO>ï÷ûù~ Bñtü+À”kÊ5eÄbÓ‰ù…¯.|5ï‹XÜ¡AJYJÙ­fÈ<™y ëÓ¬Oõ;‰ØÈõóû…HàÏç3æÅÓ"1‘v6ílJQ<>;; sbñ×Àâ±x¨à<ï<ÐÓÙÓÉ>øcøa€pQ¸±‘7ê~o>¾8ö~!à‰ožø&åHKMKlŶb{C¬à';”n/ÝðÛ‚ßHhcÀ"É" Bc„æÅF>^oôx¾ÁgðÇôÈ~%û!൪ת,gb w>‡Æ¥K >Å´ÒÊ"P#j@«Ñjˆ‚¼&¯B $b#oÔýžoðü1=‰¥Ô…âÃ-håj¹:'È«§+vÅÒ§=§=‡OH£B”äÐsõ\=—ä1„ŠŠÔÞž=5{ E[©4(  máSQn-·?Ü’XÊ{B±ü°,ˆ™‹?.ûqhW(á²¾F_ÃÃ$Âõ¬g=È=rÜ3o~ši¦çÅA‚)¦˜/ÈæðJ`Ô;ê°D,‘ˆ9&lù'ñ?Ö1ÈD³Î ²@Ï7p]¯»Þr½…¼¹ñfáÍÂ丸¸ýåýåýåÉy¥OéSúÀÓé9í9 í;ÚëÛë‘§h¿Ú~þ~_‹jQ=ö­Ù·䎘Á‹Bá;Ý›º7Ú ÷V{+k+k‰GäòºËë.¯K&Þ¬nV7«°Á½Á½Áœ7‡›ÃÍÌ æ¡toiUiì®®«®#úóª°Öå^è9Üsô»1=&±3£$£duBȯÄ*±*åÌgi[i›H³Ý±ùm~!”¥Ais£­¦­¦­Fˆ¾®¾®¾.!²—d/É^"’ÆÝñ»ãwÇ…˜¨Ÿ¨Ÿ¨BJ·êV!6=¿eë–­"Í~3Ë”eJ9#Ö¾4ùÒ¤¦ñŒÖŒÖÕ²Ò³ÒõÛ\ ¹B.]sÇ€‚–‚–‚èõ÷ú{ýàíôvz;Á±Â±Â±Žôé=Ò …‹ .þŸ½o²ÙÁyÁyÁyºÝÝîn7ØV>û̳Ï@÷¢ž£=G êS} ½—ޞޮߨ½½ò,ßþú=rôßÀù×òò ßÓïé÷€+Ï•çʃT_ª/Õ¶*[•­*aÓeee0snæÜÌ9ð\÷\÷\‡¦¼¦¼¦¼nAÆZÿZ?´+n³Û uGÝ -{ò×'•gã›ßwó_~öåg@flÅû£E¹EÖ"+\<~ñøÅã `Í¡94œðžðžðBq 8P€±±±pÔ:jµ0<=<=< …¾B_¡2ß̬ͬ…Ýáê«?&:ó‘Á×}«ûÈñ˜žÄ©Têšêš€ q*µ+Ú˜ühòëɯ‘³Þپپä¥zÄ#S#S#S#@%•TBh[h[hÈýr¿Üê!õzÆÌ÷Ü€ÔO*%J‰¢ç¨[^·Üð³ŽAaøXþ²ü1Ãèôh‡JPõ.½kž½K - ½Ò+½ !Œ0ÂÐH# árHÊA[å.¹ @¾,_æ¡´Çñ—ŽúGý–°%1óý¿|LdÜyeÅ‚Šs.ä%M½§Þ\Ú¬6›ìüãÞ¬X±Ó±»RÞ–7ä à~¼þ”Ô‚(ò;õOõO +ŽO…¹Â Ìþ×ùß»ò±}]<¶ï±Çóûu¤AÝO–†ÇIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-2-red.png 644 233 144 4021 13755454063 15510 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜÆIDATXíWmL”W>ïDz°³b¨¨3k¬»[Wè«©"vRÑF~ ¦bÂTKw¨ˆ£!%±Š„ [ÙJR ÆTBp ’Õt7nÑHµÙ Ñ&šPkÖ¢lj¥0àð1ïûìæ¾ï;“U³Ù=fÎ=÷œç¹ç>÷Þ¢û%˜¼&ÅŸâOñK/âé³zfõÌê)ÉW™ÊTvç+Ê£<Êf¼™TRI>èóf1_ä‹z¢~"ž¼&‘™_ ÕPìKŒÏ{KíQ{Ôß°´WÚ+íÕ‰X3G3G3Gñ×òåÊ›o~¼ù1PQTQTQdø".æ‹|QOÔx¯æCòêDñ—ò˜<& æ‰-t/t/t³}§®Ÿº~ê:O ??? @‚Æ1ŽqƒÄ  ûñ¸˜/òE=Q?oñ—¯æG¶ yH’‡ÿ& õõõih ˆ"€¸ñ\¾”/…ƲVÖ °åÚwÚw+Ólš `˵­`Ù6¶ à¹|_Mä‹z¢¾N8ß–¡S“|’Oò©Mj“ÚÔñ½Hp6;›ÍZ™Nì?À ¬uh'´DrLó ž±›±›bH´éXA¬àƒ±p, hÚ=íÀð]|ÂbšÀø‚àG–G–G–GëWˆ ¶F[£­‘/ > > >ÃH¼N˜}μÌk"Æj¬63ŠÞÞ€ð­ð-˜´NZÍóù=~ÏpÙçì ö…x_ðÑù©»ÕÝêîþ&8Qu¢êDÿC¼@Dói>ÍgœâðÌt?è€ÂÃ…‡™ã²E¶ÀÇ·?¾ “ŸM~`JOüŸIõ#_ïl?â¡ÌœÌœÌ4— — —è‰ì°Ã ŒzÔ¾Æ×f¢«æ®š oÖ½YÝWº¯Àá¾Ã}fâŸöÚoî0kbMìÈB–'ðÁOýÓ¦£›Žn:j¬ŒX€„Bøi~ÚLðÙÝgwÍDŽ—/ðÒÚÒZXî^î6ónÞ „“8 èxq|ÁGð“ãGê-‹ËⲸô3–BÕTMÕD”EY”ED$=‘ž˜oˆŒçωˆ..ˆˆ6åmÊ3Çï?½ÿ”ˆèFÓ&""ÇŽÍqþ.—ˆR©”J‰¨Ú©ÝÀ·tYº,]ú‘÷+¯ÌoÍoÍoÅÃIiRš”œÇyœÇNìÄNa„3 p#¡CYYÐÛkîtþÅü‹ðÓ¡Ÿ%h½–׸ƒ;¸pwp¸Í)šS4?’Ëä2¹,ú4>Ð|¦æLÍ™“RY*KM¨àf‚÷WÝ_ÙÙ0kdÖ4¤5¤ÀXÚXšiº ’á²s¬‹uxW[®¶\mÑ_À?JÉ!9¢OIY©¬TVÖ{Å)³/²/²/b‹ƒ[‚[‚[ éóu±¾XŸYbâË;9ïä@þGùÀ‹›/n&t>æ…FAÀlÀcùb8§>§>§>¦?Êò)!%¤„ö]ÔŸÖ6ÛQÛQͬ ^^0k7Úíöûgר5ÖÇúøÙ¶à[µ mÂXʶ›Ûnl»Ájõh\WÇýG²÷dïÉÞC$;e§ì”ÎÅÙU š¿ˆnU*•‡Ò¥%û—ì_²ŸÈⶸ-nÿ]»kÅÎb³vc;c;1?ÚÐàgŒßXû›Ëæ½m]ÕšßšÏ×éo¹ÕbµX‡&g|[jâNK—“¶ž¤$÷ÛDß–:£Ý๗jתY5«A(ö$ö$öÄÐâ0øg̘=ÀËuM¦Ëérú‡‡’¤x<‰_ ½z@iMÒnùë´«õj½Z¯¡Ü‰ì‰ì‰l`Ùè²Ñe£ì·º»”.¥ëX¡Z\zÉI¯1c‚(ð2í¶ØZl-š5Øì vê‡jT0õ\ò\ò\2®µMmSÛâIfÿ# 7>Ni¯#˜l"áøvÿò2ío,ÞX¼ÑЮ¿Ð_è/DûLœë;!UJ•Rå{õ‰0òÏI¸ý—ö:í®Q¼ŠWñ.„+++ùŸs§s§s§µ»úV‡”ò,¤ê Š_;J0 /…þGKÖî‘D¿øŸÒi‡´ R*¥ÒØRy¼@^H$‘DW¾µGì{„HéWú•~éïñÄ­I;÷3«þÍE.r©ß'†ëªd.s™Òeé²tù_¿žÿ?igIu_»ÕÿåÀ q˜¢¤vIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-33.4.png 644 233 144 2766 13755454067 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü«IDATHÇÍ–ïOTWÆ¿3cÈe,–ÝJcV 4©E¤kG5qhhf‹nC@²Iëãš]Iš¸Yç4”¬Òåé˜ew©Õµ¦Ýd[g‚Áb¡ò£#ΤÀÀÜ{>ûbæzg»ÿ€çÍäûëyž¹çÜçÉNþ Xó­ùÖ¬Dlm0óéÕéÕ/žOÄ]XÞ´¼9ú'xú£§?pö8{ô€u£?u^ÄÄOå3ò’-f"­?­ßâJÆ'Á[â-Iߘˆÿ6 2.ü‡ÆÏ?ðâÿ„?À_ýøÀC×C˜±Q7úy/_Nþ‚_žºôÔ%Ë=H³§ÙE  ª jSk¢abØ`?À¶lÊ Ú<°žõÊD‰b¬…”ب'ûyÏÀ7ø þ„œ7rÞš·kÞÎèN záhÞÑ<ƒoíð!²âÑx@{G{‡¨a5 € ˜±Q7úyÏÀ7ø þ„s+—DDNÿjCµ!Ðo¬ÝˆO­mZÛª(þzüuÖ’J•>®§ñ©ø÷ñïA•¨U‚¹–‰%úAW—5õ6¨ ‚ž™À‡Ú•Ú lð[ù…ˆHQ;dD3¢ÑuJÝÝÚØê%õKL1à ¨zU¯êzèIr‘‹\i¤‘ÿ_TPê÷Z›ÖÆR2»ŸCC¡!0øŠڅ""]×GjŽÔ(zéÈýo|{|[}/û^FïÇ‚c&Ï­Ó·Nß: ¾J_¥¯BBB̺TƒjÔuF1ó“ÿ˜™A]õ~îþÜmò±åHÿ‘~`6¡G´‹ˆüçøtàSøfÿÄsÏ©úìS™Å™ÅÄ‘_eÍ:[öš€3Ó™©“>ž›¯ý£?/6/6ÃÞ={÷ìÝ…®BW¡ ‘@$UϪgÕÕ®jWµ Š*‹*‹*a¤|¤|¤Ü|BÁà@J«J«J«àØåc—]†¿®XW±ÎäSáùÛó·SÙg¬‹VëxÆñŒê‡Ø{±÷ ó‹³7ÏÞ„½ûÜN·3åìæUäUäÁÖá­Ã[‡¡nºnºnÚ¬*`œqô3êˆõxj¾®×zZ_ó4ßò#`nÅÜ !`­­?ë„Up÷4ç5çi^ò"°ŸýÌcÜ0ëÍzâ Â* € ر×óu½ÖÓúš§ù–ñß½ý¡ê2ë2Ó†~A™}f`ÈÍr3ÉÔ€’Iô€Š¨›êfúC>•Qã¥ñÔx j«jU­(åA’L˜=fC?ÍÓ|á4ôÉÍŠŽgÀ}ó¾ |r‡ÜÁ?3Ì0˜á”pˆ!Ûz­^«×À^ö²×ÎSÉ*VSI%€ Èü£õS¼4ßò“2v´¶íÙ¶'½îOÓ[0fqÕ·j·ÚmóÚëÚëÚë`°z°z°ÚÎߺrëÊ­+ж²meÛJp,à7õ\=G9¶8ÅÓ|ËOÊØÀ×Ð눥˷ð…é5½ÄuÆ8`0ÀÆÈÆÈƈ}®™×Ìk&< < < Àü…óÎ_+‚+‚+‚P´½h{Ñv ŽG‚ƒß‹ŒEZ_m±ù–³®Îºª.@tyt¹c Ú”_ùí0Q’(I”ÀùâóÅç‹!¯$¯$¯"O"O"Oà¬ÿ¬ÿ¬ÊÂeá²°]·ttéèÒQV«‚UvÞô^Ãëà¥ù–Ù3³gÊ;0:2:â|íÕ õ¸Ä%.êPªÃ–)ë,ë,ë„îÁîÁîAxÕðªáU,)_R¾¤jvÖì¬Ù žRO©§ŽŽŽÆ>3–Ëœ<Í·ü¸…]²ËuGc±Fèg®0Å=qOáNeJE©(M‹ä©ä©ä)!2ê3ê3ê…ëëë¢p¸p¸pXˆÚÞÚÞÚ^!rTŽÊQBtttÙõ®Û"$B^šŸòóÎ3†yÆ65o°ÿ ‰pð@dx¸IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-137.png 644 233 144 2650 13755454065 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü]IDATHÇÍ–íK•gÇç˜GefœÁ¬aPíÀÊ^ŒZMh˜‰bøÔÅØ² å‹U#ˆ"\ ×C)r—hbO/V·†ùbæÖÎA‹È™ÖÊ´³™žûáúìÅ9—÷qûºÞÜüž¾ßï}ýîëw_""2'þpgº3ݳc¶{›ãOÍMÍ]ôCÌ®³ÀµÑµñÁH?‘~ #°CŽ­ã:?±^ÄÁOäÓ~™#Ž#åJÊWNÜ®‚²÷ÊÞK}+fko“·é*š+šÏ5žã ÿþàeÎËpl×ùº^ã%âKÕøE ùzòu×Hñ¤xD`áG ?ʪŒ%<Ê‚ÂüÂ|€§IO“”¬¿€YÌR9@„z=O°u<ž¯ë5žÆ×|š?¦GÀ÷¡ïC(ÚT´É{&Vº{ßÞû¶æ3š€oø†Y`FÌ€õ‰õ “ ÚU;.\àØ:®óu½ÆÓøšOóÇôÈôÞ_‡*ñ”xÀ¸ Ö 5öL£Ò¨ÄP÷Ô+õ ¥%Û¿Ù¿Ú¿‚ùÀ|`>µKíT;Aý¥†Õ0˜†µÂZ²>ŽîŽîưÒuÆ:Phüb£ØþŒó;­YZ‹éôFfÀÃ9çר`µ …ŒÓH?ýS-CMªI5 æ0‡?׸Æ5 ‚ *üQ¢DT–Êb<îÝýwûïx#ÞHd†ÖV×;î8¼°³ÕׯWÆWŽŽúMõë7BïâÞŽ‹>mk=Öz¬jjj`hæÐÌ¡™P® ׆¡þEýpý0\ò\ʺ”…úý|ïÉÞ“Sûž­ú·—o/×­­ëˆ ûe•—·\Þ2¥ã3óÛIÿ¤ŸÉÍ÷6·nnuÞÑÓÑÓÑ}gúÎô´‚´‚´(  ƒà÷ù}~ŽŽŽÂÚ;k﬽ù©ù©ù©Î÷O:uˆIÍg=»øðâC-ì—=³šý“ºÂÉá®á®„÷O¼šx ï6,mX ™ë3×g®‡Ž]»:vAwCwCwìËÞ—½/nLܘ¸1Ë›–7-o‚ž–ž–ž/@€P|©øBñ…„şLJۆÛ@ëÈHËH³ƒð|èùp#vìÕe»Æ®qêWo]½uõVht7ºÝŽdÛȶ‘m·*oUÞ*XRµ¤jI„JC¥¡Rˆîîî‡  @§¿Óßéwêí zÌÄùãzÜ"v‹Ýâ Šeæ›ù"⟼/’!SëuåëÊו"¾B_¡¯Pä¼}Þ>o‹”••‰ÜìºÙu³KÄÌ5sÍ\‘Pu¨:T-r5|5|5,2¿{~÷ün‘5Á5Á5Aõ‡Ý`7ˆ¸ßófž™'¢õ¸E"9‘œûÝ2£­½­]D^‹ˆð¹k¥š«æJT K÷¤{Ò="III"¥GJ”IIIñ=ò=ò=YöbÙ‹e/DŠ/*^$Ò|¶ùlóY‘¢yEóŠæ9/*‹m·í–¨¼ãO[g[§È”žÿÊhì”0hÍ s*Ǿ««†èèè„o± Z-€gÉÏ’Ÿ%ƒuÚ:mvâ£å£å£å0þd¼o¼ÏÁãG³Ñl¬8ŸæŸ~*—Ö‚7ì Gf@¿ÕoMl{‹½…qþfÚR·ÕmuT@T ÁïQå5ªFÕhBÁ§ç8Lá9s,Χù§Í±„ÉOIJI `OMþûÖ} ÅÚiíÄ Ž6ÚœÉÏn¾äKP·Ô-u 8Eu ‚ÒXÉJ{­Âë±õ04~IjIªÞ©i“ÿýW¾±·‹7ö>öfÞ`ÿ¬7w¹&ˆIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-33-red.png 644 233 144 4156 13755454063 15605 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü#IDATXí—mLTWÇŸsï.åC}aXkp­ Ô%U^0uÖTÒèš‚ʆÔ‚6¦Fj”@YT$ñµV1–â h$ Í_Ö—šfà š¬H_˜‰°Ô€‚Œîà0÷ÎùsçÎtW³Ù}¾ÀsÎsžçwÏù?çdˆü6BLZa°GØÙ?ÑSÚ§´OiÏ]ªhЦh·OP ¥P àŸæu¤BŠðPŸ×‰x±^äùCëIËCyŒ|[h m‘l¡ó3ÞSÚ•v¥Ý6ʶ²­l«;;;Ž?çÝÏ»ŸwX7°n`ݰ6cmÆÚŒ /æE¼X/ò‰ü¢ÞëyHZêÏ=(½^H/œ)b‡âŠâŠâŠ´Šã7ß<~“¿åzæzæz@† n¼ÄK¼à„N@÷ó"^¬ùDþÐzs¾žÌS¥AiPt^ 2ndÜȸ¡þ¶ßÛïí÷¢ãI<‰'AÕª´*­ ÐRµT-ЬšU³üÀ¼ˆëE>‘_©ožª£1³1‘R£Ô(5ÍwÄK¥ÖR«Zu°Ïy ¯KmžÜ6¹ àNïOÞŸLj]Z õ|µI_·¯;¯6{Ê=åÿœÇñ8¸D˜¥ÎRm©V­¢¾à|dzlzlz¼*M˜«ÍÕæjžàxêr áy K«÷òxáà‚Üà_ñ¯ hžÈmhûe¼V¯¾£¾£».ÇSg´3ÏÍÕæ/Í_òÁ£ó)¥J©RÚU#&Þxx#ÿ,À­Ú¼—½— <žÞÞ8±æÄ¸Pv¡ Ô¯Õ¯ ¢[ïpï°!ÞsaÓ…M ö¨=€jÓ´=Ø}¸ðpááBþ™¾³!|ÄGbccQ7š;š;𠏇{P/¾ùŒóŒð÷=L›˜6aôóÞÍ{×xæô™Ó!ñîinƒïúhì£1@Ïï7u4÷ÙÝgwÁ#øè×ì]³wÍÞà—iýêju5€1”ž–žEEÆÜçìçìF ¡ü¡|ÈîÍî€OðI˹±sc†ø‘¥J­?$È-xŸh©÷L9¦SŽÞcTÂ2Y&]C»¦îšJD4gçœDD;;v5Å6Å¥ý˜ö#ÑÛõo×í8¿ã<Q\k\+Q:@DÔôAÓDDi;ÓvQ䬶YmDtˆ®Ñ5"ª& Y(ÂÔjj5µê-/îW^°´qiãÒFô¡°GõEõEõñ<]“ÑR´ýñ®0) ã‹ ×Èín`Vä±ÖÂZŒÚµ_±_ jW½¢^Q¯•;1sbæÄL`Ñø¢ñEãÚot-¶Ê­rët!µ€ôÂߦ7X0@$jwD1hwŸyŸyŸãhq´8ZxàzÿWvVvVv¯å¨rT9ÚøIõ×°ºqzëM€á&|ÐîŸþ“v³Vg­ÎZÔ®=ÝžnOÇiÿ<×O‚°V°bGhi,¬.£ÿÒÞ¤Ýår­\+×:SpAuAuA5ߟ4™4™4©þ]?êyD©Œ£fj¦f \;²#¬^ý®Ý=¡~ÖCVÌŠY1@+i%­ô-fK³¥Ù#FŒþòC¼;Þï&’»ä.¹‹] ,\vrÿ7‹ÑÿË¡ÊQî„No/”¸Ä%°‹ì"»ø_ûÇçÙÃN¦?,ïú_?ÂvWì¤+ÀIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-104.png 644 233 144 2617 13755454065 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜDIDATHÇÍ–ÛOTWÆ×€8Nëx ÆHÅX“¢bkÚhš •IK$c½$m*6VH›£¦ ±}hÅÄÅ4= H±í“¡…0©}(=/‹Äð6z=;ö9xçåw^^°,nѾ_Ë¿m=Ú Ð\ß\Ï0 LìœØ ®­×µ¿Ž×x©ørî)~Èø1ãGO?xç{ç‹Àê7V¿‘ûaÜáa.ìݽw7À`ú`ºJûE–Ú L3ã)¶^Oøëx§ñ5ŸæëXZ¸´PJËKË}uñ€¿¾…s>ÎÑ|f ð9Ÿ“Ö´5 `WØÄ@u¨Í×#Oží—»PÁùÁù€`v±#àd™'̘êWõH=BiÉêuõšz ¬kÀõ‘:©NòôPê”Õmuc:«Ì 3#¹á.þ+3ËL@%øÝ£Yÿ5–/â‹Lσð¢ð"à6oÙæjs53´ò‡)TëXÇ:`+X‘2ŸGy@ Aà‡8ê]uZpú~fø7Ž?x àûÇ÷Ïô<­'!ìJ'?sü 0àlRçÍÓæiwÇ׎^;xí ô ÷ ÷ »:î‡î‡î‡à²ÿ²ÿ²úûúûúûžÉ}?÷Ýê»íeí'ÚO¸''ÎÇãã'ŸÔG{¥3!ìS|h0$u¶jbbˆí¿»¿}»{àwÖÜYsg ˜Åf±Y Ç7Žo‡üæüæüfÈ;œw8ï0Œ­[;¶ÖVÔTÔTÔ;®ï¸´ãRr:朋óqÏè2º´°?N ,üeá/ª‘Ëÿ ÿæÍm˜š‚†—Ö7¬‡œ@N 'w3ïfÞÍ„¦â¦â¦bØR°¥`K·y`óÀæ¸yìæ±›Ç >³>³>ÓÝØ¾ï÷5îktýbÒ‘Å#‹Aëðgû³^~Š—½2œ¯œ¯\€­ [¶6@çöÎíÛÁ¨2ªŒ*„á@Øõ+­,­,­„o‰·Ä »jvÕ쪪ôªôªtضrÛÊm+Sªb$Ñf.WWƒÖ“&â´9mž^±­ÝÖnñˆˆÈRyUüâ—ä°&¬ kBÄ,0 Ì‘Üó¹çsÏ‹ íÚ3´Gd´w´w´WdfùÌò™å"fÈ ™!‘{Kî-¹·DĨ3êŒ:‘Ðhh44*r㓺ºBÏÊ8Ÿú4ö{ìw‘¤žäØ4&¦Ä™/¶n[·‰éF #…h;Ûv¶í¬»ã £Â¨0 »,»,» ªó«ó«óa¶h¶h¶(§œr¨½^{½ö:îºÝî##ÁwŨ1jž¸cOUå\¢J"V¯Õëf|òâä…É 0×>×>מrGÂNØ C4D#àŒ9cÎØ³Uˉ-‹-ƒ©7§Þ›zÎEç¢nKΦ$ÿ“U¹þkðøF¦çÁûÄ{ œÎf0Ÿbª¤’Jp¢NÔ‰¦Ü™«êªº *ª¢* jT ¨`g8üí¼â¼Â g5~8+œؾAßà3},¥óô½€‰Îßc÷^û}û}L¾¡ƒŽ”>ô­´‚êVݪ¸E -Ï$LqÁ´1É´ÂV²XÌ.ì`z0]gê‰ÎÿÜþ+ŸÛ×Åsû{>_°ÿzW“mæÂÛIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-164.png 644 233 144 2645 13755454065 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜZIDATHÇÍ–ÿKÕWÇŸ«]õÒÅie°P‚öK5ªú¡RÙba Zb®PØšDVNÚŠ,Ú(c‹‘¹2l™0´°r¢1è †CÛVÔýaëۥӺꥷZ×Ï—óÚ÷žû¹Õ?ÐùåÃóœç¼ßïó<ç<Ÿ# "")‘¯@\F\F\rØŽûÌñ'}”ôÑ;Ía»ÞW¾+ÿðVÝ[u©©ö-ÇÖó:>v½ˆƒ˧ý’"Ž#±5±Õ•±÷@á¼ÂyIiaûÛnð´yÚž™PÚ^Úp¶él›!Ðèxœý8[Ïëx½^ãÅâËžWøEÀ}Î}ÎÕ‰ ‰ "0sÅ̳¶†þš¹«rW ÅÅ«8°þ¼xU6$ˆbl=‰×ë5žÆ×|š?¬G`ZÖ´,È+Ê+ò/¸õ#|™þeºæ3Ú€½ìÅ fÐ Xë­õ„@u«n\¸À±õ¼Ž×ë5žÆ×|š?¬G^®íQ  € `ô€5h ‚í5Êr uYªQ”–¬>VEªLŸé3}`ÚÛóêPj›yüagnÃÝpÿ­1Ö€Šð;¥™]‹éô '?ÅŸtcu3™<ç'üøc¨’I&Ô€P1þj¨òÉ'ø„bŠA­U•ªÀî·ûyγ0>Ü}z÷)€gÄ3œ¤õD„Õÿ«7Vì÷ÔWF¥QéìøXé±’c%à»ã»ã»ãèð·ûÛýíp á@øVq­âZÅkã~óýÆû妫¼«ÜÉ8éa>žn¬ØX¡K[ÿKDØõ/ØÚRÜRÕñ©¹?474—кßÖu­ër ~iꥩ—¦‚ñÀx`<€ÅˇCnunun5,d! _ÀðaÙ}Ù}Ù}°ü‡å‡–ŠºCöž0¶ô´ôha׿H¾œ|YµòýÃ_þêMÌ}1þbNÎ99ûälHÏLÏLÏ„+û®ì»²:Wv®ì\ iiiiiiP¶«lWÙ.¨jªjªjÃ0 ÀƒË.;¸ÌÙØêÓ«[W·:<ö:¥)) õĉÄçÆçò®lNÈHÈ‘ŸEDä_÷΄ 'DŠnÝ.º-2cÓŒM36‰LäLäLäˆX;¬Ö‘$w’;É-2Ç;Ç;Ç+raàÂÀ…‘mG¶ÙvD¤mIÛ’¶%"Uþ*•_d´|ôóÑÏ%:\?†ù䜻Ô]*¢õĉØv‡ë¦Xæ*s•ˆ¸DDdš¼/©’꘧ÍÓæirÈ!G$¥#¥#¥CdrãäÆÉ"[*·Tn©I}’ú$õ‰Èž‹}ûDúç÷ÏïŸ/Òl6Ez‡{‡{‡E·Ï:ž%âz;̧v„~ý.Õ=c´ŒµŒg"5Ÿbvš„tʳîeÝ˺µµµN)Öž_{~íyð.õ.õ.…ÂÃ…‡ ÃHÞHÞHžWç­óÖy!óNæÌÎÃá«oÙß²ÿ¥3öÊ­œˆÜ’Aó¦yÓ¹•cßÕŒÕÀÄ©‰S§bÎÈUûª}5ÆÇøJ8à€ÀNìÄN¯à¼Ç”vJ;¥Å†®–®–®æ¾~#üF¸˜;þúøë㯿sTª U†®–{vyvyv%cY,‹e=ÜN@@@×O'?üt@ ZТÃy#ol¹àrºœ.ç_Ö‡½öZØk‚!ãýŒ÷3ÞçÏùÛümþ6„!A‚ÀôLÏôàч>ôðƒü<Çs<°‹° ý¤ŸôCÀÆ0Þª¶ª­j \þúò×—¿¶ü8ðãÀüm©Bª*¯ éBº· qˆCÜð3.5-5-5 A$ˆ¿íøÂñ…ã‹ø8Ý>Ý>Ý>aCÖ[Yoe½Åß”YeV™œGåQyTa!b!(i ¤ðŒ0ÂÀ ,šÑŒf€dÙAPÇãñxÅÅÅpÑFý!} ²A&l=1zbôDàgòÝòÝòÝÿ’&{({({x¥‚××קŸZ]­®Ök­j»Ú®¶3]vwvwv7iõ¿êÕÿ*(³1³AMÔDMÔDˆPPø”þÿ±XÚІ6ج«Áj€x2õdêÉTk“Ú¤6)1Kc¥±ÒØõ±< gá,ü³­n•[åV é é éHöŸðŸðŸ€Ôýû;÷wPö­í[Û·cÄ1€ &˜ä"¹é%½¤˜;îü¹óûfûfûfÀ\Ȳ…lpgp@ bDDDA­m×¶kÛáˆ¯Ž¯Ž¯FrmHmHm ÑJ´íg[yA'èÝ_³jjjPºL¹L¹LI*¼ÿ-9d™\_p}ÁõÀXôXôX4À·ñm| ©“ÔIꀉ¨‰¨‰( åtÊé”ÓÀàâÁŃ‹¡£CG‡ŽÒ6i›´ LH&$ÀøÙñ³ãg 6&Zh¡¤‘Á‘Á‘Á¤âæØÍ±›c(µ'Øì ÍFÞÓ¼§yOÅÒs«Ï­>·šùÌ.¾!¾!¾1Ógn§Ûév2æ¼å¼å¼5;ÞÚÚÊXywywy7cÎLg¦3“±éÌ3æÔ:µNíÿ//gÌ1æsŒ±—ÍîãããGqq„Ó‹ô"½8£ nã6nÏJŠàø@¾F¾F¾°|bùÄò ÐÛÛ $Õ&Õ&Õò*y•¼ `ëÙz¶ÿ*ÿUþë øœ†œ† 雤o’¾óóóO­§ÖS;Ÿî ;è'q'I8Ïi8 §a—l+m+m+É2a»°]ØŽ…üuþ: U¨Bs37sÓu hR6)›”€>QŸ¨O"—F.\ °Çì1{ ùÈŸýÑ|’>IŸôÞÌÌÌ Ð-t Ýæ…sö{ö{ö{x@7Ð t»Då‡å‡å‡…²Á‚³K•••–b)–ÂéÉðdx2"À˜{Ì=æÚ5íšv `(7”Êg ±Óì4; P?êGý€16ÆÆØ ø2C™¡l/ÚD›h%”P86 lؘGÌ#æüMþ@þ@þ@(ã‘ dâùD>ñ??iÊmÊmÊõ„…E…E…Eqþíþíþí°yýª;ƒ;ƒ;ƒé2è~Ñý¢ûå…²DÌv;ÕêN5 v©]j ûI÷“î§Ùy®“ëä:1% ‡¡üÞü½ù{³h˜N ½MâI<‰ÿÖÊ/¸¹àæ‚›_xRü¤øIñÒwÇcÆcÆcv \^vyÙåežœ,d! œ/Si¶j¶j¶4ŠFÑ(@´‹vÑT’JRg‰tìèØÑ±Ð,Ô,Ô,h,¥±€§ÛÓíéãvr;¹ãŒqÆ8Ñ1üløÙð3z[9¬Vwns›Ü&·)÷8¾6|møànv7»›ó¯ªÖ©Ö©Ö ~Û{¾÷|ïy®¬¾¦¾¦¾†%úDž\š\š\ –r#åFÊYB4&Ѐ(ˆ‚(Â!RSS”k)×R®½É.‚‹€³#¿#¿#ïDÞ‰¼I• B£ÐL¾.DƒhØ–ÌÕp5\s>OOÑSô׊F4¢q$v°ë„ò‘ò‘òÑh¹×r¯å[ª½¤½¤½DÎG^ˆ¼yé,†Å°(gÎô»¸‹»/H yÈ–ä/É_’€~fÖö,èYг ¨ë†ë†ë†…0É’$ð 6b#¶"Ò†´ûÿÆÊX+ãµÞÃÏ;}oä?#ÇÈ1rìæ^Gãh\®ÙÈF6=nš4Mš&…=–rK¹¥Jò9ùœ|ÛÌýóeó±,„…°@œ§Ä)Lù´^÷^Ý{uïyr,Y>²|Ä%ÓËô2ýù’E¥‹J•ýE(B¹€~ô£_HòÒ* aCB7öc?öc„1Âa,Û,Wþ®üÝó%–U–U–U¼µVZ+­•zr|Ùv€ÀºÐ….N8á|!ƒ#Áå(G9È~6ÿlþÙÌï6ßm¾ÛÌ•©‚UÁªàáIWµ«ÚU÷ewQwQwÑLÙšëSå#êð¶E?ÑOôÃÜöGíÚ®ý®ý®ýy_ªTª€‡{M½¦^WVÿfý›õo²D²—ì%{!ÏŠgų`P@Àž²§ìéLYsþnþÝü»ç—7.o\޹ªQÕ¨jWŠ+Å•y_Ò#ô=2<é•âWÞb—æÛÄ·RÞ'‰Ì·»½’/›Ö®'‡ˆ7O?9~¸êÞãÞãÞ#î{G|G|G¤k#D‰<‚t±Gì{ ¤‹ébºSBP @vBBBïY4ºjtÕè*®O¾\¾\¾¼l5ãǸÜÛb…X!Vð_yWöߊ•”””””À6sAóÌhȫݯv¿òj÷Ó»;׈,d!‹7¹Mn“[Øc­´VZ+¡¤”RJñÔ—‰&g“³É):†+†+†+¸>ùùù‘©‘©‘GûRúRúR/Á0ïwJÁ™ªòòx  ô:øÉ«Ý«W"®D\)Û,Ï–g˳ϗX4EÃ[k k k =9ÞýÜ®À®À®@üwKkKkK+Ù®ìQö({1L ÃöÝâßæßæßvþ«.V«‹¥Þx½­óe^þÀâããããã!x»]LʤLJþ}tÉè’Ñ%øÎóªçUÏ«w™N¦“éÞ8þ[ÒoI¿%^±Þ·Þ·ÞgÿÕ^Õ^Õ^åYóÜýÜýÜÍí—¬•¬•¬ýPË*Y%«ü{dAÆ `˜_ñ­€7QÂË|þÄþ@»Å¨G=ê=EÌÈŒÌßOki-­mÖMnšÜ4¹I\"©TH*è}.‹Ëâ²nü¨¯Õ×êk×Å›ûÍýæ~Ò Îç‹óÙ·^¿&/AÇñøÓGÄKÚõ– Oöb/öòÿ$™$“dþžÕ³zVŸ¿S¢Q„ÐûÜ7Ä „ˆ‡ÄCâ¡=z¶õlëÙL„ÎëÏw±tþÿqßêá'~IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-110.png 644 233 144 2561 13755454065 14746 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü&IDATHÇÍ–ëk“gÆïÄ&14¶8­+)]7O­C÷Ik•2KebÑbQ†g•¡~RO DAG7æ OíTª¤5ÚbsE†Z#´ØÚ‚¦+5¬mòž~ûÜwÉKþ 8§:§:s¾sƒ[1¶bú¥„ÆÇrÇòöAî©ÜSþsþsæ ÛWyUŸÞ/bã§ó©¸ä‰ð\ó\s”%ýƒ°rÆÊc¿Hø?…À{Ë{ë?66nl¸yáæ¶A[À`Ù`ؾʫzÕ¯ðÒñåà'ü"àºëºëèÛãÀ’À’‚퉂×°¬rY%@ï˜Þ1–Œ÷€ŸUD‰¢,’æ«|²^õ+<…¯øBÀ„…ŠÀ÷5ß×xK4¼øvçïÎW|Ú-à0‡ñÕ£F­QK ¬Àl_åU½êWx _ñ)þ„ùønO,ƪvW»@k£ÇèÓ§íÐv YYÃÖ0Ÿ˜é3}¦¬‡V‹ÕbÇ­o­õÖz,ýM|a|!šõ£^¡W¤ÜÊð c…¡žXœv•""E'ѽ=Þžh„óÂyÀ–!- æÝt§)i 0BFÈ4Ò˜–/¤B`yä¥Å¿6êŒ:†)JàC¸0\Œz»¼]Ñ,¥')ìÌ#ؼó~`ÀœmÒöh{ìƒ×o¬_[¿žŸŸɰúMõ›ê7AG_G_GŸïlëlëlƒÓãOgŸÎ†îçÝCÝCö·Â ¾RORØÓ]l¿¼æòšTù:ýX¬8VLluûêæÕÍö…ß¹?rÄ&^ulÕ±UÇìüƒi¦=˜Z¹V®•ìȬȬ̼7óÞÌ{|l 6ÁûÊþþbŠÏj¹Ôx©Q {ºK §%§ÅºÆé¾'}OlÂxñè‡ÑpåË+EWŠ °7°7°šŠ›Š›Šíº‹/N¼8òä/È_íÙíÙíÙp£üFùr(-)-)-±ëçþ;727¿üzvÝÙuvÜø¡çTÏ)Pzœ"c–YÆW²Í=Õ=UDšDDdÀµÏ}Þ}^¤æEÍËš—"Sz§ôNé=>z|ô¸¤¬ö]í»Úw"“·LÞ2y‹ˆ6G›£ÍÑJµR­TÄwÕwÕwծϹžs3ç¦HìuŒ©ð€ÄÝ×Ý×E”§ˆyÛ¼íx.†^©WŠˆCDD&È7â¿ ¨ù5¿æ‘i‘É0}PÔE´­D+)8Tp¨àÈÛª·Uo«D"G"G"GD¢Z4‹[ƒ‚Rííú$}’ˆÒ㉖EË:þ”¬‡¡‡!a½cž5Þ/qÕ9®k\׸.W–+Ë••),·*·*·JdÄ?âñ‹ÌóÌóÌóˆÌ?0ÿÀü"Ó™ÎtD½YÔ¹¨Sä»ÖŠG>ë{—<.IéɘÊxrJzôçús{*‡~::tâÍñæxsæTÕ Õ ÕeæÍ°6Ã0Ð3ðzà5˜ï,—壨Þ'ù¬Íû6ï˘ʢ“àí÷öG³à•ñÊHá.s¹†á4 15K™††–æïd';Á0ûÍþ´…{TïÓûfCj î}ã}“±ÇÒ6?Õžj`&73F‡ÑxŒ­ÆV4êi¥5sóãÁƒ8ËΤÅÿ LËúÛ˜mÌF£ÁØeìJ¦£ÚUíR_ê£ÍÿÙþW~¶¯‹Ïö=öy¾`ÿÛ“ÍbWn–¡IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-23.8.png 644 233 144 3123 13755454067 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýO•çÆ¿çh™ eêd”¸ê9MýAEkk¬–×¹S,é´qÚØ´.KZÃÒÙˆšp7“ÒD28šœV-BQtà,ÊK,¬šs7•3ÐóöÜŸýððxXÿï_žó}»®+Ï}îë¹DD$nö)`N6'›çé±¹$”z%ê•´z=¶Á”cÊéþ#Ä=0¿f~ÖŠºÑ?w^$„?—ÏÈKœ„‘ ‘ ¦ÌÙøCØ‘¾#=ê§züI+D7E7M ôËÒ/kkù=¸/»/ÜϼŸ ¡Ø¨ýƼ7_>ü¿Dœ8k†HK¤ER6§l~~¯Þ0ø<¼öêk¯Ü »¦ÌbˆQ™€ÆŸõÙ~cÞÀ3ð >ƒ_×#°!aƒd¿žýztµ>ÐWï&½›dðù›€rʉ€'à ñ‚jU­˜0A(6êF¿1oàøŸÁ¯ë m儈ȧ/AÞdÞ$¨EþK^ÿÿЮú¿÷V©ÒniÝZ7þ ƒJWé*Кbœñ'‘Òüùùøwü‰þDP):>äæ ~c+¿±…hO´Ç®&ú/õ_v°Ô*µŠ¾â¾mLÓÆ€&šhš#ä g8RHa(­©Gêð唨 j3œœÅß4Ë7ËÏu]Ï쳫œ»M»Mœöë[I====Pù\eXeêZÚµ´ki!Â®Ž®Ž®°­°­°­€þ‘þ‘þ‘P]kÑZ´–P|£þFÝ:°ýÉöží=Ô­?÷Zz-!>åܹ;ÒØZû·¢­ù÷p|æø º¿v}ìúX'Ï$Úíx×ÿl}ìúX°ž²ž²ž‚J­R«Ô`qÍâšÅ5eͲfY!y0y0yC‚:Û;Û;Û!ÕžjOµCN0Ç“ãTkrGrÞÞ‡#Í#ͪV‡´]™¿=[ùlåÊE^~óå7Enïè:ÚuÔTý»÷ߨ~£Z"[Ü-[ŠÄÆÆŠ4×5×5׉ì_³Íþ5"»æíš·kžHüPüPüÈô²éeÓËäÉòŸðŸðŸñÚ¼6¯Md“iÓ3›ž±ÔE_‰¾"‘ZÆ‚cASµHfyf¹ˆXc¶Ål[ù¢9ìW–,°œƒ3Å3Å"Ù·º·ºe¢d²$¾$^$ãXƱŒc"QÃQÃQÃ" Û¶7l)]Zº´t©HÕª…U E|‡}‡}‡EªªªBÂ|›}›}›E|øð!ráïN^8)¤‘&"gYÄ"™‰pG¸EäçæwÌï°Ü¬þØØiê5‰8qD¤û/ýÇûKÂo.¬´¯´‹äÎäNçN‹\¬¸Xq±B¤ª¶ª¶ªV$¿(¿(¿HÄyÚyÚyZ„TRIiu¶:[!aׇ®]IÛ—¶/mŸˆ£ÈQä(‰Š8q^ärnûýöû’ î w‰¨ì 9h6õJà9ã?æ\î\5?qÜvÜVÅæË""xWÇ­¶¬¶@ÂÚ„µ k¡âPÅ¡ŠC°±lcÙÆ2ˆ]».vX ,èkëkëkƒŒ-[2¶ÀMí¦vSƒ,-KËÒ n(®'®²»íñ¶Çx'þªÞVo«bhhõ¾®GøD?Pv°ì <>§Ÿ’Ñ+®s®sà s-q-A¹~áJq¥€·À[à-€@R )÷l÷l÷l íÑöh{@«bU ã{Ç÷ŽïÕÍF­‚`b01˜£S£?Œþ€ þÁ÷‚ï…Щ¤÷­%o-™s*õ!ÃWf}æ¿jZÀÌ_jSmª TªQ5süÊ¢,ÊÊ­ÜÊ='WÝQw@E©Eºi«\•ËŒú¥Ž¯û;û;¢§¢§<á|ý>f|>}‰òäU§;³úW0&ê‹ÀƒÀüœà*WQÑ SýS9”¨§žzà“L‚êQß©ï€Q]Ÿ§‚SøÕùÀD`8f8~x~8àý±ó?½ßʧövñÔÞÇžÎìÿ`•Äïü‰íVIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-5.5.png 644 233 144 2551 13755454066 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mH”YÇÏŒ3:.‘V. [懈•Š%z³Ìv`L´´ÂÂuÃKQ)J±}‚Š7ÂXSX¶ ¡"k{±TVèe³¬†-B%·›|™Êyæyîo?Ì\çqc¿{¿ çÜÿùÿÿœ;÷å¼cU<>›nZèù2m…Tª?…w\¸Ð|¡™¡¿½¿ ´*´ ±Þ×x]¯ùìürè?ú"à¾â¾âx)É)É"0g휵Y;c€¿³Àçõyú’ú’”Ì` SÔ*`„ô Úb½ÇëzͧùµžÖùÈX™±R6”n(MmŒ<ýªgUÏÒz†8Ìa¦@t$:`n5·2ªUµàÀ‰Xïk¼®×|š_ëiý˜™x¶ÇÖ-v»Æ µÑf1€y0ÒéÁ0˜Í(s»¹ÙÜ ¬#<ë:׸æAs¿¹øHk¤¯™n¦Ûø?Q„6xlí(ED¾®ƒÔþÔþ*`Œq™ïèµVZ+ùÀðx.JÔfD¡P¶¸—^za†ã5ñXeVÆù ˜Æõã~âÆNÝÊ•€3VX…V!Ækã5Êßìoð7ÀIßIßI4t6t6tÂ`õ`õ`uB6ò<ò<òüÍþfóü†;0øxðýà{ðŠWÀZ/®÷ãŒõíÛK"+ªVT‰°^DıHÄéwú%î __GåêÊõ•ëEZ2Z2Z2DÚmŽ6‡ÈsÈ9g / / /©\]¹ºrõ¼§Í#2Ü2\?\/™+s%B¡Ö‹éû©·¦ÞRç¡qÿb°¶3au´vÜî¸ ®å®å®åàÝéÝéÝ Má¦pS˜ÏVGQGQG¸¼.¯ËkÿmzÛôÖ̱>YŸ€?u"¦¯ý¸D’|I>ˆ¸Ÿ¹Ÿ9D扈È`Üz†õ—õÈz$R^U^U^%’Ì æEj—Ö.­]*’|/ù^ò=‘-)[R¶¤ˆnÃm¸EÊ·•o+ßfÃçÖæÖæŠ¤æ¥æ¥æ‰”<,9^r\ĺÓK÷%÷%ÉIšŸ4ŸNë²uÙÑ--ˆˆˆ'fH7uôîhëh«Èô²éeÓËDJ*J*J*D2»2»2»D‚¾ /è±j¬«F$Ôêu‹ÌØ;c6|ofof¯H(2BFâèå­××~b¶ûUpvèì¨*õ}¼¿c}ÿô½ì{ Kz–ô,é´Æ´Æ´F¨««ƒ7^ÜxqrJsJsJ¡½®½®½–Ý_vÙ}HÛ¶;m7”””ÀÇß?6~lP§ÕiÆøFëÅôµŸÏo%ñ[Ò½½š F·ñÀxžÏ€T–ÊRY fª™j&÷÷÷€Ú¥v©]­‰ÖDk`À5àpUo³ŽÙ†Ì‹èÃèC›Þnåçs, %æ˜ê0³Íl>¨|Uëfœ9[e«l tÒmù›ê¦º *_å«ü øU|eî3÷ÙæØ§Àh`ôç˜mòSì)ö@l(m`>1ŸGÍwæ; õ‡z­^£ðsŽs@ˆw¼Õ­ºU70ÀÞ?s‚0Ž?ky,˜]f`jþ¸Þç“Ò~+'íëbÒ¾Ç&ç ö_ø£×ÍáV$ïIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-42-grey.png 644 233 144 6165 13755454064 16004 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü *IDATXÃ…—PSWÚÇ¿çÜ$Á6Õ’‚P‰ÚUÜ¢`´·­l”¶cZàÕ}ëÈÖYZ\˜©¢¯-3XŠ|[T»*²0hX¡µü5Š‚MåWb¥‚˜ò#äæžýƒ\Ýq§ÓçŸ3çÞó<Ï'çùæœç’ÂÂÂÂÂBh0eŽ©&ò}|ßÇ .<ÌŠîÝ/º¿r. bA,h÷{ÂLa¦0sá»®zW½«ž• Õ¨&ùˆB¢t¡ ]ÞÅ»x—•ÈSä)ò’ÏÿÂÿÂÿr£š<"È£¿Uíݺ#´ùvqVqVq± áB¸NVMqˆ->. } ˜€$Уb‘X$‰-îq÷¸{|Æ¢¢†¢†¢†£ýn»Ûî¶7]u¾ä|ÉùÒÂTeª2UÎ,\±pÅÂ$?V+‹•‹‚/ ¤¹ô^Z/ùKñÇ÷å“òK<ïÛÁ—Y db&ÙH6’áe\8Î…w`üëñ¯Ç¿~>8¤)¤)¤É›·¢kE׊.êÑ[ô½…¼&Ï—çËóáćøB 'œpxoãmÏà<§KëÒº´xÍb¶˜-fæù6êÛ¨o£Ä¼‡¯<|åá+ë?U†+ÕáKÞÞÞ†2fdFfìË$  /“í“Û'·O0à ³v_Ï×óõæ¸'Üî‰çÿ¤[¦[¦[&$¤mNÛœ¶™?ªÑŒhF ÃtLÇt,’E²HðèF7º Æ0†1s0sÒCzH aCàŽ@G l5å5å5åB¦í‚í‚íÅÏßÏßÏÿŽIHR„”¥XŠ¥Xzo”ú_÷¿î…ÉÂda;Ï;MN“ÓôüŸtiº4]šðš1˘eÌâ¯h”¥F‰éâUñªxÀflÆfðX„EXQ@úI?éÈCò<Є&4âZq­¸¼WãÕx5€ú’ú’ú¦KñuoêÞÔ½)¼&å—x$>*Œ cÂØªEî:w».ë!i!i!i,"íXÚ±´c¼¤‘ö{½€@Oãi<€c8†cYOÖ“õîâ.îâ‰é¡‡ m¤´´‚VÐ €spΰ!6Ć(ÅO»˜v1í"4$%$%$…EH<eQ,ŠEý}'É“äI’o&ßL¾‰šƒšƒšƒð[ıä"¹H.ÌÂ,ÌH¥¶µØZl-ÀPùPùPù€Z`´ ÚmÀ ó ó 3ÐÙ×Ù×Ùˆb…X°RVÊJ¨Ù©Ù©Ù ¿dK²%Ù‚ÄG…!BˆXœ444„’yIó’æ%‘J_:?z‡Þ¡wÍ¢Y4@ôDOô@ŸºOݧÊö—í/ÛtïêÞÕ½ë gOAOAOPžWžWžœýéìOgŽ|rä“#Ÿ_ÎûrÞ—óÏQÏQÏÑÇn~z“Þ¤7‘J‰G⣮a×°kÿ?{Ïì=³÷ ßÿ#ÿü?‚“me[ÙVðxïá=€t’NÒ 8*Ž  ¦¤¦¤¦àƒø >ðÓúiý´O@Ï~öû³ßÏêžÕ=«ò3ó3ó3¼×ó^Ï{°Þ²Þ²Þn¥ÞJ½•úØWR%UR8%‰âc|ŒI=NÓãä,“e²LƒÄà€C‰‡%šTMª&И4& ðLóLóL{².:,:,: XjYjYjyò\DA¿t¿t¿t@vZvZvO›œ¾Eߢoø_à E¹™ÜLn&;177‡^!GÈrÀ‘ä9&7gRϤžI¦Ýžv{Úm 3'3'3T‚JPüb~1¿øI&Æ7 osöÎÙ;g/p9örìåX "»"»"b b b »1ßÈß¿9~½TGuTÇNPÅÅÅ¡´7´7´7”hmmȲ‡ìÁĨmÔ6jZh m¡ÀHÆHÆHPÛUÛUÛ°2VÆÊ€ ݺ/tmmmÀdùdùd9°¿uëþV YݬnV†Ý†Ý†ÝÀ;Ü;Ü;Àµqm\ÛcÐ ÛjÛjÛjÀ:`°àÿ½Š^E¯PÊ# iHÛQÍ/ç—óËw~Ô¬jV5«¼ºˆöˆöˆvΦZ©Z©Z‰‘•Ú•Ú•ZNj&5“ÀuØuØu  èº<x ðœM<›x6///Þ_óþš÷×ê ê ê €û¸û¸û8ÀesÙ\6\ì{À@yúüéó§Ï‹ $”„’Pz…$‘$’tÀÁ‡ ;vnWÁý¢ûE÷‹b6 ç ç ç¼e;¹ì䲓˼[ƒÆAã WjÐô=\pÀä­GëÑWUWUWUÀ÷÷70K1K1KTÝ©ºSu £d”Œeíeíeí€Çæ±yl€Óà48 `Z7´nh…| v v Vt޵ߵߵÓ+çΜû!ÃÓàið4ä}F¶ßÝ~wû]×p מÝ'³Ëì2{‹ÿXÝXÝXÝóFƒÖ 5hÙòUVXu€œš…f¡Œ[Å­âVt˜;Ìf`FîŒÜ¹Àôç¦?7ý9àǬ³~Ì<ÕžjO5€8Ä!`7ÙMvåF¹ΡÅC‹‡c­©ÚTmªÆiùòä?L¾ÂªY5«^¸шFtGO«i5­æ®O]u±b‚˜ &lü\yYyYyù;˜s͹æ\£ý@ûöò~¯~¯~/Rض€-€rî’¹Kæ.ЊV´àÁƒbƒÈ@2¬Á¬`‚ &Œ8¿r~åü ¦ S†)CÐqÎÃyxÐ1:FÇ D1^Œã;r¦.^ëkó¼±S}#ÿwRFÊHÙ¹M4™&Óä¼za„‘~Ö€4@Èu”8J%P’VÒJZ1"®׉ëÄ#ñOþõ¾±Cì;1D Càò½¬k®k®kön’¿O.“Ëä²oŠcrbrbr>ý;°;È?Ѓô©U¡ýènc ¶` ©Ÿ[;·vnméŸÙŠlEö7Å‚? æ5êuÚ»UJH–‘ed\8ˆƒ8`˜H;i'í™Gæ‘y`S•ƒü’õ’õ’•-oímímíåJ®\ ¸voҽͽͽmÛ®¶ô¶ô¶t€Y™•Y¡–Žo Ôé‹b€uûÏí?·ÿ ¸·¸·¸·lÛ¥ R©‚úŽw5t5t5p¥ééél9ÙD6‘M‹GÄ#â0øÃþû•ýÊ~ˆ@"`bÐ:h´â›¦ùMó›æC­²«ì*; Ɖqbܶ]t/ÝK÷Þ›ôIqŸ¯.«¤ €H¥ò}’È}S_‰¸Ò)íz·’’@–ÿyê“ã»zr=¹ž\ñ/ëÅõâz‘&JÚ;ÅN±JM£i4\B¾/äCþyä瑟GzçØãíñöx®[1_1_1¿t ãǸ¼+b¥X)Vòû|•ý_©bÅÅÅÅÅÅ‘v¾5äÓîVŸv÷ù´[÷_Úõ4x?¥(ñ=} XZ ô¸èÓî?ÿK»3Í|4“wœ,brõäêÉÕ⋲JY¥¬’vpFÎÈ¿½y*òTä©•IÖkµ‡üKœ!Îg°¾¸ >@çoqPüŽ=¥]ßqáÝMØ„Mü ’E²HÖùHÖÈYãßÞöŸí?Û6íàú¹~®`¶¸[Ü-îÎý¹3£3£3˜D„/žÔXNüÇ¿„pç ;(îIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-10-red.png 644 233 144 4066 13755454063 15600 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜëIDATXí—{LÔWÇÏï1"HÅ%1ò–*>ªŒ¨«Eyt€Æ©©6I…b%n6«hÇÚÆ†¬$øØ¨Q¢¥jc(;ƒXI%ÕhÑ ˜Öî’¬-M™©°–vÊ(#¢3óûÍýî3÷7¿™øÈf÷ü3œ{î9çùß{'C°)fâŠ([”-Ê&< .ÄNh›Ð6¡­à²*«²úÏ㴀Рfõ$“L2÷pŸÕóý<Ÿ×ãõÃû‰+Âyô|UTEU¢5<>mŽÜ&·ÉmV—°EØ"lÑ@ââGãGãGq~Í­5·ÖÜŠ‹‹¢ì¢ì¢ìÏã|?Ïçõx}Þïù<$.÷§ŠŇŽ|BÉÉÉê{ÝÝÝ,Æ=âq AÂ8Æ0†18à4?çûy>¯Çë‡÷›~øù|d|I‡Ä!Ç^ »3»3»SY:àð ø0€ ±t–ÎÒ¡¨ÕjµZ ¨ Õ…êB@5«fÕ¬óƒq¾Ÿçóz¼¾Ößø’†&X«`%’wË»åÝM½<ÁToª7Õ+f ì}¶‘m„[iR\Š `õ‘ú€×ŸâOAÈüø?ë|/+d…sø¾õ} (Mžkžk{Ÿe±,¸ù6S½©ÖT«˜yÎÃùÈp×p×pwå"¾ÁXc¬1Ö°4ûoö{ö{x¬ãV÷&¨·ÕÛÜì;½ÝÃ=½ËÊY9` ¦!¤€©{}—}—5×mÿÍ;ðÀXcÜiÜÉÒ8Æ'o’7É›zvó@CyCyC9Û,0®X«bÿÿ^ûüÛç߀šC5‡ÂZÕV½ßßÕߟ^ùô Og{g; ™€bU&)“´Íã å % %l£6Ù0>bÎøùñóãç£ÞUà*ph‰ ø±ºG=Ž€®²®2˜õѬ ?)? O± ? Õ•ê€I×']ïwÕµªkRÂ’W+ÆpÎÇA÷¬Þ·zßê}¡ÿLððàäKê/ÔëiŸoe½•õ4Ð7ÛÞl€E•‹*õë_¼úÅ«º|ç÷~ÿ! „%sÎ'¯ÔC¾!߯ݱ(ª”¶KÛ‰h*_ÊKÌKÔCšnšnÌ™¥9XK "êû¬ï3"¢•³WÎÖÇ >)ø„ˆˆz©—ˆ&~Wû]- {~¢ -†C‹våçAqf¨{¨{¨›<¢Gôˆ$I’l’@hm ¢‡ŽL8¢¯%¥IiDDèCŸ~}líØZ"¢Ÿ>ÿés"¢äÖäV}ÜÊŠˆ¼”I™DÔÿäö“ÛDâ¹/ît8N p>Í¢Y4û~ N£þdÕɪ“U: LTÕDP“Ô$ýe*l*l€åß,ÿFjþ³þ³0Ã;à ;svæèU8Ú:Ú ô.½ ¨§OÄœˆ õ»²ÿRÏ¥íðB†!dø~%i±´XZ¼£Žß²”Ô”Ô”Tuº}­}­}mèù`y¾C>ýíf+kWÖ@îÌÜ™OÓhÙô²é–š–ªW_ã/¿xƒËè‡ÆázÑ Ìß1wÑÜE~í @š&M“¦{@±ù±ù±ùDòUùª|µyH{ð‹LE¦"u«6'‹÷+ïWðÀƾ.¿.ÀòÎåOíŸÜ?¦žz€{*M%äò Àl{Öö,0¾»âFyfy¦\¬”*¥Ê›%?ÚIá–|ÄaÈ0d8NðKµ¥ÚRÍò´“û]`ž@gqg1÷×w¿¾«dÑ,Zçz†€ã7ŽßÔò.¡KÍ÷o­3­3ó%Ä:±N¬{R $ ‰BâÜÆ@éÚý*Ê„²×Ž ÍB³Ð̵âÿ³­ÃÖaëÍSݪn Í€.¸ô¼¬‰5–b)ÀòØ^¶7$¥¡æÁáÁa e¢ñœñœ²I›äÇÒi‡Å¤¡™ÉLfÙb͡ʑ?&+YÉJ$9%§ä|ï/`ÚüI}=¢opb^i<á v¿|–vsWå®Ê]Ò®m™m™mNâL; ¡T(J_ÛÞF¼ÑW ÿÒ^¤ÝRT'Õ9ràÒšÒšÒö×toº7Ý«üK;j§ä”œ–dj¢&j¢à³#Ù#úEÑÿh‘ÚÝîçö ë…õÂz€ © ý¯ˆIb’˜$@—»RÆSÆSƉ¤©Gê.K"NîÿfqÚ_ù”Oùroxøƒr‘‰Ld€pQ¸(\ü÷ïë3m'3Q÷…GýúãF_]1j³IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-25.2.png 644 233 144 3032 13755454067 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÏIDATHÇÍ–ßO”WÇp[ù1XµcÀ)îèÅÚŒf“5rÓ‹ÁÇjcƒ[«Ä¥A«³Ù…¹ÐM-!MXª¢Ó!íV éjX¤@»²M³l$ÂD$Pt J¶®Œ•B˜:óÎ;ç³3ogjûxnÞ|Ïó<ßï“sÞó=G@DD–Ç¿©–TKê²N=˜Os¤9Ö}ÃçtHy=åõoþÏ}øÜ‡+>]ñiôvq#?¹^$ÁŸ¬gÌËrIL,mYÚ’’ÇÕðÆÆ76¦­Šáz Ý“îYŒÀÛWÞ¾Ðz¡õ„½zfógó!¸‘oÔ|ÉüRý„¾<ÓùLgÊaé³KŸÜ‚ÜkY,áŽ^+|­àþ’ûKT*èS€ “Ê0Æt6âñ|£Þà3ø =C?ÖÀóöçí"°óÍo¦ÿ-Vp»*×T®1ô4ð>ïc‚H ЋõbB zT)¤@q#ߨ7ø ~CÏÐõ“ØÊ‘¯@Ñ£¢G Vh×"ÃÚJm%Dǵ€@ã[”~T¯Ô+AIß o½D/ÑK€Bœ8yr(õËH^$-r[3kfˆöÄø¡h¬h úÆVþSDäWg =üBÍŒ]»ü'¨—ÕË9ÅG|jH ©¡$É0aÂI8H`RGÓjZM%”R  ¶©mùkŒ_ÍÅõâúôÄú‰¯Ø¹ÿ¨/¦L1袿]3222§þ}êÊ©+¨›î›î›nà.w¹ ­u­u­upÖ~Ö~Öýýý032323ò“c4{tõèj¨_[o©· 6÷7õ7%ôTø ó ø.ÖD#"2Pm m ðÍU­¿V•Z‚Ùç²Ï²—ÛØ€5Ëše͂ξξÎ>XXX€ÂPa¨0û¼û¼û¼pçðÃw'v»‡Ý`‰X"–ä×äÍ? –?dgdgê­öíôíT¥Ð^Ó^º7Ö胙õ™õª‚¡`ÚÒ»Vv­„ÊòŠÍ›[š¶4mi‚=î=î=n0›‡ÍÃàhs´9ÚàüâùÅó‹?])Ï‚gÁ³•Ç*UKÌ¿tkÃ'>÷ž†ý ûÂGÂG ¢g|•ñ•j"+ÒW¤Go©#S{§ö&Žýh±o›oØÌ6³Í ;;;p5÷jîÕ\pÙ\6— .6_l¾Ø ¹¶\[® .•_*¿Tþ3[Y¡£ü¾Wz¯¾é+ì {ã§2f cÞð•¸-*³2'œIÝP7Ô PÛÕvµ=ɯ֫õj=C9I?×cóøG^kUÖøœð„ñ#3n€¯ÐXTWTª9æÌª_7é&PÌEæÐhà:×Q\àc>õ¥úB}xðà&yÈCPÔCõø5Ô TGDèh꺞¡g$ø9YônÑ»ÆÕ”ìüOï]ùÔ¾.žÚ÷ØÓù‚ý?‡!J|“]õIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.7.png 644 233 144 2772 13755454067 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܯIDATHÇÍ–L•eÇ/ ”'ŽS÷‚ŽNsºæd9„@l ÒLåý#c6Þ¬%Ú\+·Ò”– +&¦³bö¾9œ)™æRˆ—Úü1ó(ø¾gmÕa㜂ãÑ£‡ó<çþôÇáá9ÕÖÖ^ÿ<Ï÷º¯ëú^»îçþ>·€ˆˆ¤Œ?âgÅÏŠOŽâøç,bYbÙìGq‹qkâÖ|ÿLý`ê©¥~¹nas݌ͱêÇò™~IË1¹mr[\Ñ8~žÎ{:/qF¿s´v­ýŽu'ëNœøäÄ'ü †¾ú`¤h¤,l®›ñf¾Y/¶¾¼ñ~xðÔƒ§â~€É“&OÌ™+[¢ÿsÀS+ŸZ ðSÂO * /`Ã¦Š€LóÅ`s}<ÞÌ7ë™õM>“?ÚÀôÂé…"°zÝêuÚ‘hÂõ£°Í¾Ínò…Û·x è=`l06u^ Ž8°°¹nÆ›ùf=³¾ÉgòGû±¶ò‘}%Pýkõ¯ Ò½zX k lz¶žMXýŸiLCé=¤‡ÀxÆXg¬#ÙH6’A-Q‹Õ≠¢¾P>åC cici„õáÃáàEë«gªÒ«ÒÍ÷•X[ù¥ˆÈ#ïÐÔ/ƒ½ƒ½À?¨õ¸zœ oó.ï‚Q#jÄ"æ.w¹Ëß0åP‚ã ÆùÆù£=òÞR&"òÒ"¾¬Z;uŠ÷ä\5W©Eƒç\.—+þrçÑ®š®¡´ª´¼´\$¥$¥$¥DÄpœ­[ëÖºE´-GËY˜±0ca†È÷÷·ˆ{Ø=ì9]uzåé•"‰ŸkÍ#šöp‚JPҹз¢uE«Z´à¡MŽMŽ)ººÒ,ÍòRD‹ˆ\lçAçAø¾ËÓèiTÏÎ Îl™ÙBhyßò³ËÏBαœc9Ç`oûÞö½íP\W\W\+6Vl´Îö!Ç!Ç!‡5Ÿs5çjÎÕÀÒš¥5Kk ²¯òlåÙ‰øÐá«'ZO´ªgá”ÿ”ôÎh?b\NjJjRm CàÔ:§uNƒm/6,iXbäºr]¹.ØŸ´?i’å?R{¤öH-T;«ÕΘ [¦–©e`4MF“åoÍhMoM‡êO«ê«êcvØ3”6”¼™üDòªMÐSµT-âRÛ½ë½ë­c?°áFéRÈß•¿+vvvÀ½K÷.Ý»·çÝžw{dú2}™>èÉíÉíɵx ¯á5¼ö÷÷‡,O–'Ë=¹¦_˜nñEN77¤NIqIä3ÛfÛfÕ£?þ WÞxúG¢;Ñ »ówçí΃ѬѬÑ,‹¨ùfóÍæ›P^^nùÃóÃóÃóa g g Çò°°°AA~A^Ažå¸Ç_†’†’€±ä®ä.Õ¯^¸óá/+Ò_Ö_&òÝÃ×¼þ#›Bí¡Ù¡Ù2Ö±¾cMÇ{±½Ø^,rfç™gvŠ\¹våÚ•k"å¶r[¹M&̻ݻݻ]dU˪–U-"Á¢`Q°H¤okßÖ¾­"•s*3*3&ÂÇÈa“d~íþÚ-"“e²Ëß ïˆˆ´\€ç_yþ¸§Dþ¯§ÛÓ ž8ÝcGyæ{æxæ@hOhOhÜšqkÆ­¬ Öëb&°#²#²|¾F_#(·r+7øgûí~;¿ Qy9ò2ÐåÃØüêæWM=k¹ ¦nX:bêÊ„ŽÅêΟ­žzêù+ Š7úþßé˜1hhCÚ¥còû¿ú¾Þ¬n¨nu Ü«ú ›aõ}T%ÌÇ\ä"йd“ ¼È¶ÄßdAP7ÔUuðG)3×× ³ÕxÌxlâ‹ìE_›°6ÁœT¬òß¿ÿÊûövqßÞÇîÏìo[¿Š÷ç3IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-19-red.png 644 233 144 4101 13755454063 15577 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜöIDATXí—ilSWÇÏ[œšÖL*”Í¡2@&ˆNX$ÈR;TI‘ˆD"AÍ"Rø0hh‹(*(†…– EÁNŠ ¨ 8iK™éPRÔB‰-â)—à0Ø~Ë>Ø÷ùÙbÑhæ|y>÷ÜsÎïÝû¿÷ÉDa›D1Æ/N´'ÚíÜÓÈ@rBBBñ|QeQ¾v„æÐš„Ãj+‰$’È| ÖW[Ù|–Ïê±ú±ýøÅ±‹³ù,ŸÕcõY¿Wó¿(ÖŸÖÁ?æó]sØ eÖdÖdÖÈw u u ©}}} À'x‚'\pÁh~$Îæ³|VÕí7­ãÕ|dz“wónÞí:Ë ä;òùiÁHh$4Â"¦æ¨9j$¹In’›y®2Ü5Ü5Ü-ù3›`j65›šÕ,çïÎßœ¿Á©ã“¿ ¯ ß–oð©‡ÔCÐÛ<лʠ2Øý@)lò—¡ïCßk®Ïù»Kt‰ðššMÛMÛÕ,Æ£ñ‰ëÅõâú«»X ³º³º³Z])à—l’M²€rR9 ÀjŸY~f94·5·Å øä¨Ÿk®€#mGÚ_9¾õGõG@²I‹¤EÚdguçªÎUêZmecøHõ¤ÌN™2­cÅcÅcÅZ¢¶­¾g‰Ï`põàj˜þùôÏÀšaÍÀ ÌVa«Â÷;Œ:ß÷‘å# sL’4VüPy¨Œ‡ñ1ÐÝËö,Û³lOôÍä‘`[° €‡ m=ÛªoÌže e ú^Ïï=¿©í©íPï©÷èãG/Žêò=W‚W‚€<ìg<Œ©lƒÕ`5Xµ3–Hõ§§D4™ ¥¥ë!-7-7‰ˆÆÖßÊre9‘w²w2Ñô Ó/èãæãæã:7iøëᯉH?F”hè5ôzµ#Ÿ-F´pÒ=ärq äòy”•Ô—Ô—ÔG 5´†ÖGí 7nÑ[TC5DDB––ü»ô®¾Ç?¼ñQý†{DD[2·d úýDD£ßŽ~KDÁÈô_¥)…ˆ?¡f""<.Ëã¢ÆG|)_Ê—†D–¸õXñ†c : $Éér:Èr†þ0-é^Ò ‹+WêwM½©Þ€§uOë`_í¾Z(ºTt €´mÁ¶`È6drß±ÇDû]Ü{þ—ó¿h_Àu\.—Ëå†'ä y[[Ø)3O5O5O•§9W8W8WD¯µ(´?´_ÏS²³d'Š…â‹SImI-ÔUÖé_Äßaí°ø`böÄl¸;éî$üPÖ)ë€Ù[gvÍìR´€*¤ ©‡¼”lM¶&[‰ÄËâeñr[»ðË-å–ry«¯4¿ ~ƒì¬áûâû",r,r¼ôTðT(Òø¸©ÜTÞp}åÐ>yŸ •Í®ù燗>¼¤ø5Àz¡^¨¿¹2ìOðP¬e0är ¹®£,¡±©±©±I-Òî?„×pT8*ø.Œ^Ùú5Açn;n;àèÛGßäêkë®­‹®ï‰Ç'¦œ˜‚´Oh ß·]Oy“¼)ºÞǸžW-WËGpP‹Ô-ê–¨”Ü=n³Û ˜“L×M×¥õÚJ~!l¶5Z4´R*¥RÑe- *¿ ÙÈF$xàùø+`:hÚmÚ-Ÿ9ƒzíJõR½^xø#¾]9¬Ô•¡ïBßEbå?*T7i_ '¢WôÚw¤mHÛ¶ˆ·ðÞÂõE誵;%ò\)Üîw¸ÓY›³6gm&2Ôj 5öšv ,–½v•F¥Øa‡À#<£(·yÕö8)ˆãK¤WíqÚ-{v¥i@ˆ*÷YÚ³´giÀ¬ñYã³Æåéš{…^¡·m!“ZDzñ€oÑk,:x™v÷šöšöJFg³ÇÙ €ÑcÕxºñtãéèµ#Ї#I&\‰ë§‰¯Œ7–°*¢Ý¿½L»…K —.j׾ооÇÃqUÛ ®Š«âªÞÛۆח£ÿÒ^§ÝÅB‹Ð"´¸æ2àªæªæªfõ¯9Áœ`NPº¡mµGðžÆLê¦nê¦Èµ#8ãú%ÒÿhñÚÝëþÊÕqu\@Kh -QþÈgð|ÀGý}Ðì7ûÍ~"áªpU¸Ê$®ŒÛ¹ÿ›µ_V²’Uü)6üY5¯ò*¯Ü9îwîßSÂãïØãvf$®îk·ú?ûFµµ1ƒ.IEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-home.png 644 233 144 271 12610450011 16055 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.1/web/www/routino/icons/limit-157.png 644 233 144 2622 13755454065 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜGIDATHÇÍ–ohUuÇŸ{g÷î‚sÞ¡ot×ktu.$F ¬‘y%&›[&¬¶¹h¯,¢ ?RImŽÙ²v§Ë1uÔ $YwÍ™ á076c†kÓTPwÝÚî9¿óûôâÞßε^õÎß›Ãóïûýžóð<ç' ""K3OoÈò.IÛÞ]îS¹O=ôuÚnVàÙâÙòۛߘßü*ø•3âÚ&nò³ëE\ül>ã—¥â:ü]þ.OEÆ~j©y$wyÚþ¨ÇÇglx©ç¥€cñcq^ƒ«ƒWnUܪ×6q“oê ^6¾¼ó/~x ÷^Ïà÷ù}"~2üdÑëé„ß‹à™è3Q€?sþÌÑ^P7€Å,Ö@’$æÜ̲M<“oê žÁ7|†?­G`ÙËžÊg+Ÿ |™.9{ ÷>ë8ðï±ì¤PÏ©ç˜ݯûðà×6q“oê žÁ7|†?­GîííÇÐÕ¾j`X§AM¨ pr­z«KãÇP{ÔnµTH…TÔ—ê:z±ök?¨ˆz^=V[R¯¦^ÅRùÖkèÇ ~•UeeøÝVŠˆ¬þ ;0˜H.‚KK/-¾`“ê·ÂV˜Y¾g‚ Üs™Ë\¦™fšÿqt‘.b6cl‚±Óc§É@2¹ÈèÉkþ ^yë•·€[Σú]ë ë í _ -À…¦ Mš\šî©î©î)hjj‚x,‹ÇàÜ̹™s3ÐiŽ4G Ån™i™v_{Q{úbÛСÅyT½\ûr­imóOa¿îæõ£Ûn_ÐQg8_2_Âü¶³Ûú¶õ¹ ?µîÔºSëÀÙéìtvBA[A[ADÛ£íÑv¨Ï©Ï©ÏÖÂÖÂÖB(_S¾¦| D#ÑH4ââÿüíÏßfÞð©ëG.¹d„ýº[`ÉK~Ô]˜úyêg÷K¤Jæ¦ç¦¡cMÇêŽÕІ¢¡($ö&ö&öÂHx$<ÏZÏZÏZˆîŠîŠî‚Öë­×[¯ÿ·ñkñkñkPÕ^u¸êpV`2óüx*1•£G ˜Ìs†áæäÍIà»ôØë£Î§Î§n}ÙdÙdÙ$œ=9zr.n½¸õâV¨kªkªk‚Îýû;÷êتتtõvõvõºõ¡îPw¨JJJ\¿sج™ FWÄùÆùÆ3,ÊŽÚQñˆˆÈ2yL‚”…cÚ…v¡ˆ'ß“ïɹ{öîÙ»gE‚UÁª`•Hm¬6VY>·|nùœHšV¤óDç‰Î"+Â+Â+Â"ë‡×¯ÑWœ§CÄûX†Ï²Ÿ¶Ÿ1z¼"ÉŠdÅù_dQ¢?Ñ/"‹ˆð‚§LèIayƒyƒyƒ"ºA7è‘Ò†Ò†Ò‘>Ÿ¿Ï/¼¼¼")”GÊEj6×l®Ù,Ò3Þ3Þ3.RYZYZY꾨<ìx¯¤äÁ4Ÿø‰‘=ÿ™ÊTzJ˜°‡íaw*ïì¿óÁ µ/µ/µÏm…uÐ:h„Å7ŠoƒSéT:•nüöŽÛ;nï€Ù?fGgG]<~°ÙÇ•á3ü÷NåêÏ p5p5¹ÆÔ˜ZØÎvg;³ÌükÑgôÐõF½1Ë_¬‹u1°’•¬Ì*¨ã>*àƒ©:X~¿è¨­Ôc©—ZäjéÔ¢ÐkkûÃ2#UÌ J)?/E¥•;¤x/ô§ÄçH!¼"­h(á‘’sξ ãÎ]ÿìÙç|ÏÚŸ³ÖÚû¬Crsssss€I³MÌjÖÂZX ­Íý6÷ÛÜoiH^_^_^ßúhHiàçïp³¸Yܬ%{'ª'ª'ªé œÃ9œ#9˜ù˜ è°{±—žl‘l‘l!9ìSö)ûôþ92D†ÈÐ%Ggyt¦Þ˜Ÿ–Ÿ–ŸF¬\8Î…“×'9„Ÿ=\Ì`<âÏ” yBž'üì²»ì.ûŒ¥y5y5y5å=.«Ëê²Ö‹‹‹—üEqJqJq ×–¬[²nÉ:’'Žlj¥AKƒ–Þ¹÷¾Wï}ÞëoÊ¿g=ïú^/ë‰à*êGý¨Ÿð&ÙCö=á§Dá¢pQxýyûwöïìßÍ ® ® ®ã®ëX×±®ƒqÇ´Ä´Ä´M’IŽ$|ˆñ!äpÀ€ÝØÝ^Á+xމ°‰°‰0ljilili¤îŸæÿ4ÿ§ùÂÁ 6ìüR.—‡¯ò{ø=üžµ§¨–j©Öò&³Š?2~d@#Ѧd«Ùj¶ºño.§ËérÎÙ¨Z£Z£ZÃÅkÞÓ¼§y-   Ó0 ÓÀQ5US5Xt¢|á _cÀy˜‡yé"]¤ žážµùÙül~è¾túÒéK§¹7»ººØ&™ÌGöè:·…ÛÂmym;^Ãkxíñ(#»+»+» ˆCÄ!âOÿé¸î¸î¸>g£J£Ò¨4Ü&mš6M›Æ6„„„`oà ¼R…T!ìH5©&Õé!=¤ d€ h@žëù>†üÍþf3¦yý«RU©ªTn“w}/—áÆ¸1nìõ¥®\?¸~Hû¯`M°&XC#4¥šRM)ë­‘!YH’á'š+š+š 0ç˜sÌ9€\ È™ÈD&€Û¸Û€€4‘&Òô\/jµˆZz’ž¤'áçõ¯Ñkô=[œœœJ#¼<^>³³³4ýõpãáÆÃ”666étÒì“5C§¬GÿŽþ”Þ;yï体”vövövöRÊ·ñm|ý7ëßÕ¿«× úžÎžÎJy;oçí” +…•ÂÊ)¹ÝlH6$ é^/ËEp\ÄŸÒ+++q"61616‘è0‚Œ€cÎ3ç™ó€yºyºy:p¡ìBÙ…2ÀÇècô1‰Câ±æXs¬Ø¹3rg$`zbzbz”ªKÕ¥jÀ‡ø8…C,R-R-RÛ­Û­Û­ðšO¬$V+!ºúgõÏêŸá„=ÑžhOüS: >4,œ(_Q¾¢|Åó7ãŽpG¸#Ï#S–°%,¥gWœ]qö¹Žv÷u÷u÷Qšu#ëFÖ Jm¬µ±”~óà›ß< ôÌè™Ñ3£/è»»)̮̮ͮ¤´·¢·¢·âßa÷òxùD«„UÂ*áØ{¡¡¡ˆŒñ‹ñ‹ñCïÑ{ôf³ŠY8ï;ï;ïmLÓÆ¾C¾C¾CÀ/–_,¿X™Qf”•ú•ú•z`\7®×Æã€qPÞPÞPÞx®—âÝñîx7 Öˆ5bÍTdã¸qÜ8æ©á©á©^ûÈ(Ì(Ì(Nœ88tNëœÖ9 0( Jƒ¨}«ö­Ú·€Ä¬Ä¬Ä¬çúìôìôìtÀ¸Í¸Í¸ ¸—r/å^ €åXŽåpš˜˜¦^S¯©ÿ+5KÍR3WÈ@ 4Gϱ¹l.›Krôj½Z¯æU¶f[³­rÖÉ:Y'FÄ­âVq+0Ú>Ú>Ú>•"8b1Ž€cãØ8@Z/­—Öb³Ø,6£££/è§;¦;¦âÃâÃâÀä´ä´ä4&<·åWíWíWíB<11á,á Oøó>ä삳 Î.úúúÊ~³¿k×þî[aêfu³º™ÏÚÛ±·co‡¨°UתkÕa¢b´b´bD#Ñ€›º©›QÇ£ŽGÒn¦ÝL» ´mmÛÚ¶¸¨¼¨¼¨‚¤¼ ÿ1êǨAwéwéwéAªŠ«Š«ŠGSuSuS5#—§ÊSå©¿lw׸kÜ5Ë¿"G~=òë‘_ÜÁÜ -÷‰ûÄ}?ËÆ®]»6G›ôIÒ'IŸÐ¤‹7.Þ¸˜ÜäùAô7Ùo²ßd ¾V_«¯ׇëÃõ3—™Ḛ̈K±NNNÕ?ªT(ä ¹BDôGôGôÃÑÜÔÜÔÜ„meee¸*’ɃÆ7PQÑ’mˆD$"ÛÞ%*•‰JÑ]RFÊHÙðCdͯ‹«ÄUâªÝËIIIèݾ3|gø’‘9³çÌž3sgúÍô›éqPRPRP@Ž“ãä8)¤ØŠ­Ø H‹¥ÅÒb ävÈíÛ@PWPWPFF>ùtäSø–[Ê-安ßÌoæ73›D=¢Qϰë±þÇ"œÀ œ`ÃÞÇûÞÁ;x€XJCi( „ aBØT-ú]ÿúú×׿泆CŽ![$‘KäùÅüyEóŠæ}Y£8Š£äoèBº¸µÞ~Tô ‡3N~³IutUtUtUáR­T+Õ^ÌŠŠŠdm—4—4—4|–wAM¢I4& „JN8á|¾yŠP„‚2—™ËÌeHnšnšnšhÒéw¦ß™.*TÈ2…ìñ¸«ÂUáª8ô™ñcãÇÆj¢&j‚¿ÇK©Ôá+_ÁWð…ÿÃ'Ÿ<|¸2]™®ÌCŸ)Š@KEGMGMG¨°vkíÖÚ­4‰d ’‰P&” e “¥Ða:L‡ÂŽppö›úMý&\¬[X·°n!üV…Ua„eÂ2a١Ϙ¦€)x<>Ù¼ˆŠ&q¨§Ó‡„x_ÜóK"ñL=)¢u¨ã³H<‰'ñIoLþrÔW¹÷¹÷¹÷ ûw ;…³:¦ ¦ ¦[„v¡]h‡œ‰d"™HLp9\—Éõõ5?Ϻܺܺ\Ô)](](]X¸brÓlt‚NбEžÌ¾ïÍX~~~~~>F¼…çÂT yj7ËS»Eä9ENÝøId™ÄƒÕÐB -óU»Æ]ãæöÙJl%¶È†aÃÞHèz§Þ)8ëëëDÒ¤I?2^›èèèýèËÎäÎäÎdÀ¨òž§^À©o*^²—rƒÿ÷ÔnUô•è+ÑW ߦKÓ¥éó‡f ÍšÅÚ*s+s+sù,O#íßÔÔ„ wï6Þ%oÊÛåíòv@P *Aµÿgv»ƒÝá\Ç zÖÛì/s‰ð–Î3m¡>Ô‡ú?[£¬QÖ(|ÃÏægó³ œ$B!‰øŸ¯~_ûûÚß×]±µÙÚlmôäÃÒ‡¥KùUcî1÷˜[”)^-^-^FKh -ù¿k@‰¨ƒÄ ðŠ7ž@q/óüûƒÚÍC-jQË¥Õ´šV'tMîêDŒ§Œ§Œ§QbX'Ö1m"­H+ÒþÔ ¾¬¾¬¾¼>ÁÔeê2u‘¿ 3„ zÞã·Æèø#ÿÁ^ª]ÏqÁE2ÁÞ'i$¤ýSMki-­ý`·ìUÙ«²W™¶Éƒ»÷Uásásáó}OÚ··ooßL"Âã¯âRý²ý 4z¤D¨¸%IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.3.png 644 233 144 3061 13755454067 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜæIDATHÇÍ–ïOTWÇŸ¡ü¬q5¤C *Z!šRé&€Ç7„††Aªeš±»/v1ÑÆ¤v7†¸ŠaS6Æ%XLÓµŽ µvã‹u7€´‰²–i‹3]~ˆà(3÷žÏ¾˜¹^¶çÍÍ÷yžóý>¹çœï9""òZô+`ͰfXG°u¯wÄ;V~Á'5°¼my»ÿ¤|œò1@êéÔÓú€‰¼Q¿p¾ˆÉ¿PψËkbâ¼q^KI•ë*×Åÿ,‚uAB{Bû³0¼ûÅ»_\l»ØÆ>øñë¿x\ò¸Lläzc¾Á·_>ú‰¾Ä~û•eâ^‰{E2K3KWü:R0´ʶ—mx¸èá"emH&Y•A‚cb6òÑzc¾Ágðz†~¤¥ÅK‹E |GùŽ„ÖÈ„O¡ÞVo3ôBíÀŽ á`8 UiUÌêR]X°€‰¼QoÌ7ø ~CÏÐôc.匈Èñ-Pá«ðþ-@¨'<ZZ *3¼!¼P´S¥ªU¥ª„p_øvø6è#úˆ>‚9ž2Éä ¤ôÿ„fB3„Â#¡ôP:¨•~¨¯¦ }c)¯Šˆ¼ñ'H&ƒ1J÷õøz€ßà•«r™ÁÏ(£ ¨ê(MiJ[ÐÈ Np°aÃf†ÕSõT=þÀލbUÌ _Fùë¢zQ}#ýÿ9Ù­¨+¯+7èôŸß¹]v» ßjÜÔ¸ uï÷î5˜‚Cˇ–-‡ã-Ç[Ž·@¯»×Ýë6óú#ý‘þÈÄwÜypç4¾Õ˜Û˜‹ò´ ´™zêŸuñuñÆÒžì¶êEDò/Yd{õöj‘›¿üîõï^·äýµh¨hHæ¯å]˹–#׿\ý®~‘›y7ón扸ººŠt®ï\ß¹^Ä=ëžuÏŠôuôuôuˆXÓ¬iÖ4‘7:otеµµ‹ôìè©é©Ë–É-ƒ[eþû–)ϔǒg)Ù¦mÓDTG¤«Åô$é‰}£ÈfËf‹È“@ +eiõô¿?÷þœÄíÚíßíÉÌÍÌÍ̹°çž {D†ÃÎa§ˆí¬í¬í¬ˆc§c§c§ˆÍkóÚ¼òbAgÐ)âéöt{ºEöþj¯g¯Gd‰o©¾T—¸ïX`,`i)¹RrED’“?HþÀ¾Q õÕÔWõ»ÄOŽ››ubúÃ)Ï”J›J›J› 0¥0¥0êWÕ¯ª_kcׯ®…æÚæÚæZXqnŹçà²õ²õ²uÁó+¿òÃôáéÃÓ‡Á¹Õ¹Õ¹ÞøÅšÕkVCÿ_™¯Œ xvìÙ1Ðûÿ°øý®hIiIiÊ sïͽ¾ÚòMË7àtmKÝ–j äòùp;‹ÅPä(r9̼}Ÿ}Ÿ}=sôÌÑ3f¼a¼a¼aMŽ&G“_ý›ì7³ß„Sk>±b˜wÍ» ¬%^M¼ª¼¢.ŠˆÜúx“¼I¬P»7mÞàßàg.õyêdê$ThZ…ÁSÁSÁSP“^“^“‰Y‰Y‰YP5\5\5 ƒÙƒÙƒÙ`ßoßoß× ®\/€Â‚‚ÂXâYR»¤*Âå­å­ÌMÇDôÀ›ïÍõi¤1NwǸcÌS2t¶d¶ÆâFŸ>Gi]Z—ÖµàÔÝ×ïë÷aâÐÄ¡‰C /Ó—éË@¹”K¹`b×Ä®‰] Î«óê<„rB9¡ ŒÞ½‹Ò¾Ÿožo6õpgº3ÍS)|ûÿ>FaÄWÔ½>V­ª™QëÔFµT™*Se rTŽÊY°—2T†Ê5¦ÆÔØ‚ø—ê’ºê´êPa`FE~‚KMûnùn$L'Lcø‡ác†óÏÎû΢w¿8³ºž OÑZÀt~.ò9ŸƒêŽ^Am´ÑLñ˜Ç þ­úT_ôöŇZ¯ÖKHý-ìûÃù£zs?uþ—÷®|i_/í{ìå|Áþpü3\½ IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-14.1.png 644 233 144 2577 13755454066 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü4IDATHÇÍ–ohÕUÇŸmêè–Ì¥yË^X£æ… ¶ÖÉ‚07\lä ›ªjB‚ˆ›Yd/F»:wn%9ÿܱACåÆ]á‹êÜí^aaNv%¯WÅÝûûóéŽçþ~$½÷¼ùñüû>ßßyÎóœ# ""Oe¿ùeùeùÅ9ÿG¿øÍÅo>2#wÙ÷NÞ;×öCÉw%ß,ëYÖ£&ÙØ¿;^ÄÁwç3zyJEá©ÂSy5Y¹¶z·z?‘¿ AÑ`Ñà Úζ8Ý{º—áÖØ­1€jþ©G6vãoâ ž_:þ“_-Êû .O§nÍLJkàí·Þ~ `º`º@ç€=,a‰®’$1+î’=ëoâ žÁ7ùLþ å¯/]6¿»ùݢ㙀É|òÌ'Ϙ|éAà3>c XI+ `·Ø-̃éyä#»ñ7ñÏà›|&†SJ%"òõFì«ÁÊ «¥é5é5 ÇíçìçHg Úxè=z·Þ ªL•©2œõ€»Ü,ã¯*TiµÔzÅzôï|h\ظ˜ËæÏ•rFDä…o¡hªh*¹€`ìÙØ³`_ žõªz•‡üwUPAèVݪ[]ú .9H Ø!;d‡€S±^=V4 %‹’Éb/|›Ý±®_¹ÛÞÖÞz?€ZgpýÛý»ü»ÐWª¯T^©|ŒSÃSÃSÃp±ábÃÅ—¡„J@ïÕ{õ^Gíoówø;ÐW|ãåãåF«Öé÷Ún´Ý0¥íúUX/"2¾~|ãÇ7ÀÚ ßo7íhÚÁ¼i‘‘ #F6%°lé²¥ê:Ãqܺ/×öø:}¾N€po¸7Ü Þro¹·öîÝ7 •++WV®tíXîÑ= }Ú§}®£¹­b[Å68­~žýyÖ3vòöäíI0|òÅVƒj0ïºä§7§7‹Èk""²<Û’ªNU¥ªD b±‚˜HäPäPäH4 D"ýÇû÷›››éu‡ºC"ñ®xW¼K$µ*µ*µJr+}#KÇDä‚tKwN½\XµV­ˆˆ:¯Îç]SSÎöÿÐÿP’©yöOækÊjJkJ!x8x8xصõ^Ûk{áhøhøhê¦ê¦ê¦àΦ;›îl‚µÛ×n_»n®¾¹úæj'®:ZýGõpþ·3;ÏìtΘz¹ÏÓçqŸ1Ó•éöOÛ?þ6]iÿbÿ‰o?%~B§Â© © þG<âp/r/r/4ÑDÄÄÄ€ªT•ÊÕ͉_$¾@§Â‡æÎ¤ZÇoíÛ7º»’Ü»]t;¹¢÷£÷s8õXªOõ¹æØçtÒ :¬Ã:ì!B„pƒt1·±±Ý¿¢=ÚãšcDÇ¢cÿ;ÇDÐÙÉ«  H:L¡5cÍ~;e§Ÿütd‰”RJ)p?sWê?õ5} ˆÕªZI³È®²«€ï³ø46Bf0¹'ÿ“{W>±¯‹'ö=öd¾`ÿ·b‚âÚŒIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-39.7.png 644 233 144 3007 13755454070 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܼIDATHÇÍ–íOTgÆoÀ‚ /iâ vºÉPRW´Ú̪ ¥Ã,±­¦.~Ñ"D¶›X¶MíĦ‘¤°fk6•¢AûFÚíDêÖ°« "º)Eû¨ ™òRË88 3sÎóÛ3Ç3­ÿ€Ï—s®û¹ïûºÎ9ÏsG@DDæG®±Å>›Ʊ¥f|náÜÂÇÿÆÇ4ˆ)Ž)þö¤Õ¦Õ,øpÁ‡ú&6æüèz³4Ÿ—ùbcò#ø l_¶}ÙÜGÃø!ñtâé{!ØsfÏ€SŸú˜¿€»ËÝðKþ/ù`bcÞÈ7ê~ÑýåàoøEà‘³œ¹ ñ ñ"éÌtZÿN¸n…6n‰‰S± MÉ$«|À‹cLFac>’oÔýŒþŸÁÖ#þlú³"°ùÅÍ/&~.øáxuÉ«K ¾àiàmÞ&BÞ@+ÑJ˜uQ] †0±1oäõF?£¿Ágð‡õ˜ŸÒ'"òNlØ:ú7ÁÎÐpд‚Ê=z†`D©Ò'ôQ}B?‡&C“ JU©*å¡Ú•_ùQZ\`Q`AíÏÁÁ „û«[,[,†Àw ÌOy^D$û]Hô&z½s”>Ð9Ð Tð<¨•ƒaFU¢JT pœãRP@€ –¨ø 3ÌüJªUYñEÀóá‹ð‡…e¿+ü$"r¬CQ¶¹l³Q¬ç^ýñë_o„Ã9‡m‡m¨þ`¿¿ßo¶¿²ôÊÒ+KáȺ#뎬ƒÁžÁžÁžߨPÖPÖPÔ®©}ªö)8ñóû ï' >MúHÿH‡o}·÷ÜÞ£çÂË5/×€ÞÖ#ÚÿDDzþ-M-MpyÃõŒëj÷ü¿§<‘ò³›ÞÚôÚ¦×Àæ°9lhîjîjî‚ìžìžì°÷Ùûì}`«°UØ*`¸o¸o¸ÏÖžÞžÞžömömömPÔ]t¾èüý4{â›S §Ôn8ë9ëпÃzD_>ojÞ”j„é/¦¿€6½=¡=\Ž7ßH„Ö?¶Ú[íàqŒ8F ôZéµÒkà¬vV;«M+ü+ü+üP—Q—Q—aÆ΀3à4qÃâKƒ¶~º¥bKEÔ«u/r/ªRŸK}N5 ,HY¢Ï܉;wÌmïykªbª ë ë ëayÚò´åiÐÚÒÚÒÚkrÖä¬ÉõûÖï[¿âWǯŽ_ õ®zW½+jER‡Ô!ðœôœôœ„¬Ñ¬Ñ¬Q¸”Ó‘Þ‘nòégÆß =¢¥'}—ôj„Àë×áŸmu—ê.ÁŸ\Î|g¾I;”;”;eIeIeIPÞTÞTÞuyuyuy`±Z¬+œ«9Ws®Ü;Ý;Ý;Íú£ÉG“&ÃÚ?¬]¶v™×#7ýîyîy@ µ-µM5ÆÆNÏ<9ódïe‘Ï»>ïÙ~a÷ÁÝyéÎWŸM|&…m ›6‹Ø|6ŸÍ'²ß±ß±ß!rËrËrË"RRR"²«xWñ®b‘•••‘¼þ¼þ¼~‘{C÷†î ‰tWvWvWŠý¾hqÑb1F€ß‰ˆð’d¶¶ŠH¼·Ð[Ø{9âcÇ:øoùœò9æ® šÉŸÉ‡ñ„1ÿ˜¥ÕjµZ­ù¤³wgïÎÞ…±Uc«ÆVÕTS úMý¦~&]“®I¨ꆺžÇ=Kv!ì+êƒû>¶CíÀ§ìª@€ŠWñ*T•ªRUQk)SeªL`/{Ùµ¨ƒL3…+´/µ/åcÚ€èNtGûØýk8ï q/Ä•g>š MõÚmí¶éüTq€ ºU§ê®r•«À㌃ú^õª^ÀÉÏÐÞÔÞ$H¥ö´öô}Õ„"|8ÿÃû¯|hOíyìá<Áþ[€5¾Ÿ0–FIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-6-red.png 644 233 144 4066 13755454063 15525 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜëIDATXíWmLTW~ïÇtÙ¥5¢Îh îR`ü\ìŒ6RSMŠņ©‘ìÆ,¢Ž_¡±A *›Å´†Öª‰!8ƒiCÕD‹¥F!éí®ÍnÂÌD±5Rgdg¸çžgÌœ{g&~d³ûþ÷|<Ïsß÷9çQ,~MI!/Oó¦yÓ¼Ò¿ã™Sº¦tMéZ¹Te*SÙ?NÓ|šOóØ4o&•TRE$ç¼Y¬ûžÀOæ“—'ëIÔWGuT'{’ç§å«]j—Úå“vJ;¥†kN0'˜Ä•uw×Ý]wXýýõ÷ÊÒÊÒÊR3ób½Ø/ð¾à{¹’—%çs>–ŸÊOå§þù¢B3]3]3]l÷©¾S}§úøk¡Ç¡Ç¡Ç(PÆ8Æ1À?ü€‘ÇçÅz±_à üd¾9¿\Ù²äyDñ_¥7Ko–ÞÔ~?<9<9<‰aăñ^d‡Ùa€-`o°7V¡•h%[ -Ôì s1À‹øB¾šØ/ð¾!8‰ß–eH“<’Gò©GÔ#ê‘ö;bƒ£ÙÑìhÖ* a{ù^¾!­]û\ûà~¤! @å(dA:F1 3¢ú} ÀýÜÁ€Ö®}§}𽼎×!$– >Á/ô}d¹g¹g¹·z‘X`k´5ÚyžoÔ7êÅ“8NˆcÇØ±!üˆ€‡yl¯¯€‰¯'¾NZŸ|3MÁ >Á/ôúÔZµV­í?"&NVŸ¬>YÍÿkÍ£y#ØŠ­ 94Ÿæ€íÛ'€Øq©D*€}îû0i±ëE/‚üFe“ôäææ¢ylåØÊ±•¦ Øa‡@¡X£X «Iê®u×& <Ó¦šF›FÇ?›õÙ¬Ä ³]l`àÇù¿Ð#ô ¡G×_{|íqóËØ0fà ÈC^¢À¨+ê€×¯½~ /=¼ωB…àè—G¿L×Oè'L|ƒ/Î/ô}rüHå[œ§Åiœ±4ª¡ª!¢©4•¦!Ù‰7ÄO·~ºEDŒ£DD­­DDSïL½CD¤öª½DDYd}@Dt ò@% Ñ‘l•­D”Né”NDçè3ù-–NK§qäóãBñÅHßHßH G䈑IQ¶+Û•íÚFÛh=… ®D¡¡²P‘¾V_KD˜L5[w¶îl]‚ÒY:K^ÂKDÄÔPx(œèÁÓ‹N/z^ëßž÷ö<Xj[jÌ›”?âv½ÇÞ3ù®·\o¹Þb¼€”Š¥b©xò)‹•ÅÊâú&qÊì³í³í³ÙßßßÓú|…¾Iß”ÀÏ£ÅÑbÈ~7û]p7»›òA>« V€ó‰ó ?ñÀ;úz}=à Ž_…õ…õ…õºñ(Ó”iÊ´OŸP¦3Ó™é$Ro¨7Ô#Æ…_é¨tT²]†õÝún}7"ð²}l_!NŒK¬liki+ee@Æ‚ŒBWùUˆ›Yÿt22(®Û®Û®ÛzØX£Ô(5ÿÚË3Ä©1óK±¥ØRì?#6¸ººòÆýñ›Éû“÷ÁÔ£0ßoƒ·Jý¥~Ølßl¹]{»Ö¬3«ÖÞ×Þ7[}þéùàù Þ1žÐ&¹Inz¶Rš.M—¦Ï;•"Pù»q¾¶H[¤-oµIR‡Ô!¼¢ÿÉÛãýÆû ¼†ww±-l ðüF¢w¡AÌZá ®|ûý`Zi¤cäìÈYÀžnO·§kµF%)‡”Cn‡!­‚*¨Bµ™Z˨ŒÊÔCä!yˆ”€P»/Ok›­ÍÖ¦Y}û}nŸ;Ñ»<›g`8ÛÀ6ÇþXW_¦/øF^Å«ÌÏÙ|kó÷›¿g»Œh\Wǽ ¹;rwäî ’²CvHâꪅÌ_ÅnT†”!eHºœ·'oOÞ"‹ËⲸ¼ †wËe޲$ïºu7"ð¢~ÁÏø9¡Õ¿cù,߬oë’Ö%­Kø g±Z¬ëȳXnKOî´ÔÒz’RÒÞäÜ–ó®ï ½kÕ¬šÕ¤?ÔêM/`€7c c c€¯3<™)gÊ™›þœbÅORô¥ÑË”Öï®{Žw{¼=¦wµ­Gë1F&r'r'r‚`A° È~kx±SéT:ÿZ"¬·^ªÀlzE˜ À‹¼Ûbk±µhV_‡¯Ã× ‚" ¥îËîËîËæµ£¶©mjÛ@ü_’Œ¿¥ðÆÇéµW L ±aSÜ»_äÝò5åkÊטÞõ–xK¼%8›çF'¤*©Jªz«>™Fþ%…W¢ÿ2^åÝåJ“Ò¤4ùÁUUUü/EÑ¢hQTû§Ñê€Pî™ÔNíÔNñkGñ¥ð¥Ñÿ©ÞmHÎË¥­ÒVi+@«h­Òß”gÈ3ä€DIôm¯=lÛÃDJ¿Ò¯ôK×â7¦tîÿVã7'9É©ÞIžÞ_-s™Ëº¥n©ûÁ¬Øø\oJg†Sp_Ùêÿ´\+BYTIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-60.png 644 233 144 2422 13755454065 14666 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÇIDATHÇÍ–]HTiÇŸSgh˜lµ #h0²Ø0º¨´„ a%S³ˆ‚…ÂêBŒ£›VÈ ¶ð##ûZ‰µ5*ku‰@(³ÅÈ„v/¶1Æbí´f4d\WwÎ9ïo/fΜ³»{é{sx¾þÿ?Ïû¾ÏyDD$-þp.t.tzc¶³Âò» ]…Ÿþ³[tp”:Jûæ™w`~ëüVcв͸™o¯±ðí|¦_ÒÄr¤^K½æ(ˆÛµ°mù¶å®ô˜]wÜ7Ý7ÿÐ`OçžN€—n\¢FŒ<xWð®,ÛŒ›ùf½‰gÇ—Úñ‹@ò­ä[ŽaHMIMEm\\Kx¶ЋЋ^'½NRNÐC€*"D0WØf›ñx¾Yoâ™ø&ŸÉÓ#àÛàÛ %ÛK¶»¿‹ ¶ÁÁ¬ƒY&_ô&pŒcx@‹h}§¾“P÷Õ}8À²Í¸™oÖ›x&¾ÉgòÇôÈ?÷¶þs(w•»‚úˆè·õÛF«ÑJTíQª¥ýª h`Œ'Æ“DÇPù*OåöB{¦=õ•:¯Î£À8eœ"ʔޭwÛð|&¿ØeŸ÷ˆ{$2‚zPþà 0F¦ø„<ò@½PCjÈB7Ýtƒ*Q%ªÈ'Ÿ|[<?~`)å”'ŒL1mâÇùü1=qa-?þš}5&šñ™¹ê{uWÝE™‘ç•Ï+ŸWBý…ú õ` c c ÃÒ¬ Ök ÙÑìhvÀp`80°uôwUQ”m‹ã|&LO\ØãjhŸhŸH”ïVCÚaí03¦gÌ?æóÃÚìµÙk³aSÙ¦²Me°:¼:¼: www°®a]úÈ9›s6ç,ø{ý½þ^…ŠBE6Z™Vfâ«ÝL€÷ž÷žº#¹#¹V¡¾MËÒ²,»-Ôj Á‚ìÙ ²aïèÞѽ£Ðàjp5¸ nEÝŠº°&}Múšt«nÕøªñUãpî⹋ç.ÚðK´ ÍÖi‹?¦gŽHRqR1ËD’Ÿ&?uÄOžŒÉ¤dJ¦øL‡æÓ|šOÄåuy]^‘œ‡9sŠ\~yùåå—"¾-¾-¾-"™Ó™Ó™Ó’XÞëÞëÞë"3Ã3Ã3Ö_f$K²Äâ“ä®ä.ñ‰$-MZÊ2§ˆñ“ñ“# ¢mÖ6'}Ò"ÕRmá¤u¤u¤uˆÌ½2÷ÊÜ+"U¥U¥U¥"îBw¡»P„ýìg¿È›à›à› Èhÿhÿh¿H$‰F¢"þ>Ÿ¿ÏÂs<–«rÕÆ—àëùУI_©¯d†~zè±¾£cGÇŽð8=N¶6mmÚÚ“í“í“í°kp×à®Að÷÷‡CÕ‡ªUóßuZÏÕs?zÆ>~+yBY·R¥¨•á–pK¸ôZ½V¯µøŒqc܇±Wc¯Æ^ñÖxk¼µ Å`PÚ„6aç{ï­|Ïû+1ÇŽG™âKNrŒˆ6¶۵^­WëAU¨ Uj‰Z¢–Øâߨ#êPAMF­QËÑÿ5Ç>2ùu½Wï0ˆÒÅC(Õ§zTð-Í4Û:ÒE' ~QÔ#àG‚Q‰ú^ÿÓÖþ+gíëbÖ¾Çfç öoûI$ºj=iIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-31.9.png 644 233 144 2735 13755454067 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü’IDATHÇÍ–ïO”WÇÏ NÔ4X(UÙȤÛÈÄX©"–ZíDC3†`x7LÜlB]mÓŸV›UW²RWÓL£i_ Ð k›JðÇJ$*,’PZ‰ Œæ×óÜO_Ì<>ù¼o&ßsÏý~¿yΜs¯€ˆˆ,Žÿ $å$å$¥ÇpÒn3¾àÝï®ú>†Ïh`yßòþÀg°èëE_dœË8§ß7±±oä'ž1ùõŒ¸,3r1墥$ŽAùåo,XÃǯ‚­ÉÖôGªš«š¿küŽ¿Áï×~¿0U2U&6ö|ã¼Á—È/‡žÓù­ó[-£bM±Š@î;¹ï¬ü{,ax%ìpîpü:ï×y* ´ÇÀBªÀcM&`c?žoœ7ø ~CÏÐùXºié&(«(«°ÕÇÜ¿û³÷gz‘&àGXQÔ Uj•„@]UW°`ûF¾qÞà3ø =C?æÇ,e@Dä_¥àò¸< ÷Dº£c‘U‘U þ-‰–‰;U†e}¡žª§‚º­n«Û˜kŠ &ž!¥?¦GÓ‰DŸD^޼ ª2Æ®i×40e襼""’l~›ßŸ¬tO·§8 À{  TnÐCEY h#ÚÐB - †f˜aÆ„* *|ÁލMjÞŽó/ëÅõ¹ó#<9Ó¥¨.«.{ö úÆzwôî€E'Þ<ñ&Êsß3à`Î:[}¶úl5ôööšq½B¯Ð+LÜ·¯o_ß>¨+ª{½îuÔHïÐWC_™zj´:¿:ß(í™.Ñn‰ˆÜþ´4´4ÀÿœÃˇ—+÷â¦ÙÓì„ÊÂe¾2änÈÝ»~pøÁap;Ü·Ãìé˧.Ÿº|j®ñþžþžþXQµ¢jE¬ÿÏúãëÃêÝyÖ<+¡ñ÷f³f³”N6œ•ó#úšT_ªO]„§mOÛ Cÿ%å—øäímÛàÒ±KG/G¾#ß‘·Îß:ë<455AÎÍœ›97¡µ³µ³µs®±º®º®º.(++3ãŽÉ‚–‚85ðíÈ·#áŸÃ?CT{éÊKWÔEŒ´Œ4ý ?yüÄlû郾½¾½°m˶-Û¶Àjÿjÿj?ôwöwö'X·kÝ®u» QoÔõ¹ÆÖ?¬XŽJG¥£œœœÀZ8ÿµù¯Á7çž;È$h-𤥧¥ë÷’ôeáá–{\tlÑ1‘wžî>Ý-KË£åƒåƒ"mmm"¬e-kE®·_o¿Þ.ÏVȲ‡ì"–FK£¥ÑŒ‹LØ'ìv‘<•§ò”ÈöCÛ¿Üþ¥H¦ÊðdxDVŒ®ütå§²T$øQð#W§ÕiË=1j o5¼¿}, –*÷Ú-k­yDhÉÃ%w—ÜW“«ÉÕ¾Í¾Í¾Íæ)–b)hïmïmï…Ù³g7‚½Ö^k¯…;µwjïÔ‚³ÔYê,…ì¿d¿’ý ìßûAê©„â½ëfà‡îºÏãÿ1£ øïžä=Éf—„Ζ̖ÀDŠ7è ¢´AmPœ[ªéšéšéˆ¸"®ˆ °bÅ “['·Nn[uÂ?…;Âàux‹½Å(ŒF M=¦öìÞ³Ðã]ÉÏͱŸbsEÕ?›cnå& ¬*Se‚ò)Ÿò%8  €ƒ &àed’ j›ªQ5ú„>A@½çßë™ñÌØ¼6¯?™ÿsÌhø1ywÎÛ9Ø›ÌêrÔõõšWóÎüXI&¸À.Ocw¥º«zU/±ÛµÚ¨6JD]‹z£^àfŒv&ïL"ÏOþ÷®|a_/ì{ìÅ|Áþ ñQ=Ùf4IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-13.png 644 233 144 2404 13755454064 14663 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܹIDATHÇÍ–MLTWÇÏ|àÆfÜÌ7õFÏèžá§üÈ_÷öë`yÖò¬´¡ŸÐv‹Ý$U¥ªdÔÐêåW~ÐíºM·¥ßê7uSÝ„äïÉîd7虺\—£AíU{eؾh_´£Ÿæ¾x |Ù}Ù}ƒã Óî´$ƒªVÕ q†<»ÙŽ#æÒ#zD;ØÁ7ÏNrXϨÍj3C$Œ¾ÃKóS~c‡Z`ÃÖ [Óëþ ½)®þJoÑ[\Þ‘Š#G*àÆŒ3nÌpó&ÞW´¯h_t>í|ÚùÔ³€ïõ5} íÙb‡gø)?ޱ_¾„†xC<]¾ŽÏì€`Äd’»“»“»aUûªöUíîÐr½åzËu¸W¯þ^=ä„sÂ9a(«-«-«…PW¨+Ô݉îDwÂc°dôÑè#£¯×¹ü”Kd╉W>,)žW<ÏÙ_ñÕËûV™U&“ÑÇõq}\$¼6¼6¼V$´(´(´HD¢•¨È«ñ¯Æ¿/²±wcïÆ^‘H$‰DD&wLî˜Ü!2´mhÛÐ6I?µZ­V£ï«wùŽÈËÉËQ·áÅã½Ç^?×ÏsœãèÝ ÜÏ­œ[9·bVÌŠYn¾?ÒéÀâ‹,^EEEpkÊ­)·¦xɨýÄ~âå~Ê%¢U£ï¶HririzAA±å®ÜËÉÌ‘92Ç]ñpÕpÕp•H°4X,9¦Ž©cJ¤<^/‹œ¿pþÂù "z¶ž­g‹´îlÝÙºÓóÆ’O¾‡—æ§üX"ƒ%ƒ%¿þ,Òt¹érºìS§ꇒa_¡¯ÐWè çúsý¹~‘7o2Þdˆ¬Ø³bÏŠ="ý™ý™ý™"Áž`O°GdÖÁYgYyxåᕇÝzëG©•ZI¤yi¾ãç­§2õÁjÑM·»ñýñýñý¨IÔ$jÜ|"œ'Âð,ð,ð,ö}û¾}ßÓ>:xÉËÿ}*ÿ¡‘îc«Õj†<Ò#Œ¯yÍkÏ)»¤/éK £:ª£ž¼_¡ý’©LPuªŽ!Gñm}ì?:?öUû* ÔµÆíü°°€CÔQç±ýÕTƒþA7êF ž6ÚÐN£%i7ÙM^ýíücö¿rÌÞ.Æì}llÞ`ÿƒ 鈢%€ÕIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-106.png 644 233 144 2672 13755454065 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜoIDATHÇÍ–ÿKÔwÇ_^vסÞ*Œ†(‘Û¤YÖ:[øÃn†1ɆhúCÌŒ… ª±Eä˜[ rBŽXŽ­ÌìNc„ÍL Êdii3¼4ª»œÊ\wŸ/ïÇ~8?÷9Û?Ðû—ãõ~½^Ïçóý~½>¯{ ˆˆÈÂÙ_G†#Ãá‰ÚŽìýl|åtÔ>n@BqBñŸŸÂKß¾ô-À¢“‹Nš¶mù­øø|?žÏÚ—…bo¸Z]­ ëgí#ð~Îû9 –Dí¯»À}Þ}þªÚªÚ~þáçØ{öL¬ŸX¶mù­x+ß‹Ǘ#Ïñ‹Àü ó/$Ü—Óåeï.{7³&0œ ›7mÞð`ÞƒyÊÆ ™dµ˜fkãlË?oå[x¾ÅgñGõ¤æ§æ‹À{¥ï•º¿& üûÒ÷¥[|Úyàs>'ôi}À(7Ê ƒêR]$¶mù­x+ß³ð->‹?ªGæÖöè;¨g‰Ð´«`Œ˜ÉÚGÚGhê7õD=AY’Õ:õ¶zôQ}TõÚ®¶ÇnU®êTJïdE²ÐÌ€6ªÆ|•ðm‹˜³üv)EDVCwÜéDZ8´è ÐèÒ–i˘¡a†mB²È" XÊR–ÆíWRI%¨<•§ò€$\¸âüߘo™o1ÃkQ|JJþußwߟN´ôÌ ;~ªU&Ì7T­ö±ö±}ðU'*OTBÿxÿxÿ¸Ís§çNÏhXܰ¸a1Œ90rÀöÂÑGŽ6À7joÔÆÝx8ÊÇßÕ5Õ5Vi_™Ö·—šæŠæŠXøvýËpv8›pÙõ²Î²N»à—–_Z~i9hZVk‚k‚k‚SŸSŸSÙ¾l_¶ö ìØ¾/ä AѺ¢uEëÀ[áÝâÝ¿¿Üw±ï"a‹Ï Ÿz|ê±%¬o¯€ç²ç²j¥aüÚø5û¤‘ìgSϦàÌëgVœYé¾t_º®']Oºžþ¿r½¹Þ\¯·¡{C÷†nð5ú}°²weïÊ^ØØØ€ƒþƒ­[áékÁ`0׋ÚxÎxXz"ó6ÏÛÌJÙåÌpfˆÈ¯""šÿ©³ÉÙ$R:P:X:(’¶3mgÚNm­¶V[+¢åj¹Z®HrKrKr‹Ä–§ÅÓâi 7…›ÂM"îw‡»CdÕÍU7WÝ9kžå,"½õ:z±´ÞıÄ1KCÄl7Ûn‹¡oÒ7‰H‚ˆˆ¤Ê›²HÙ„ú„>¡Oˆh^Í«yE2k3k3kEÆŠÆŠÆŠDU?ª~T-2Y7Y7Y'²ºjuÕê*gŠ3Å™"RS\S\S,âùÓó‡ç‘¿ô‘Á‘Á|*¯FöFöŠÄôÄzŒæÉæIÀ­9‹õ½ÃêÈäòÐ~¸ýpûa»åÍåÍåÍ’š’š’ ûóöçíϳýecececDIÀÖ»[û·öÔãé©§§ì#ù´yÚœÓcÏ}•‘Ù¯$ ßÖoÛ-0ùÕäg“ŸA¤3Òé´‰Í!sÈ‚P Àì3û̾8ÿ”9eNAð»`}°Œ/ŒQ`2·gù,þ¹_åŠcà~è~8w»F ·Ì ³‚4æ®Ýìf7˜!3d†âšØ¯üʪ[u«nPK”Gyâüú'ú'̨bs,w(˜qßsßûß‹›ü”¸J\€›üýF?à2>4>D£‘.ºì9Ä/´Ñê–º¥n~Îq.îçd¥®YFÆ6c[Üä7JK­›š3ù_ØÿÊöuñ¾Ç^Ììç ŒÜÊŒIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-39.png 644 233 144 2445 13755454065 14701 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÚIDATHÇÍ–mHTYÇÏL6£ôâ -´`.6"H[VX%£ÌºVV„~X+¶EVöC$šmÁ°)¨‰XÁ²}ìeÙ£!üà–Iï䚦­›Í½÷ùí‡;wîÝ¥–ýèý2<ç9Ïÿ÷¿÷œçÌQ ”R*%ö«À½Ä½Ä½ÐŒÝåöxb 1ðÙOfÜ¢ƒk‡kÇÀQHnJnH=—zÎxhÇVÞšï¬WÊÖwò¬q•¢ìï%ï%W~,>¥9¥9‰Ÿ˜ñ=t9éòŸ쿺ÿ*@û…ö |£áÑ0Àëü×ù`ÇVÞšoÕ[zN}uì_|¥`nÇÜׯàõx=JÁ²Âe…æ„g°­x[1Àðœá9â}˜Ï|ɦ˜Âz&±•Í·ê-=KßâY|Ó‚E›mV ¶ïÙ¾'©Í,xø#T¦W¦[¼èeà'˜Ú”6 —éeÌ€ôH.\`ÇVÞšoÕ[z–¾Å³ø¦õϵ=U»w%½MT¿©ß0ªŒ*¢Æ xÅ‹hCÚ3íH–,—åñ/†1aŒã ý¦ic åR/õuFQ¦õ.½+þ·ã¼8_9 e5@ÒhÒèT<ÑŸèÀ4_‚qÊ8Å´høðÇ9ÊQÛ/xÁ 2)“2à,g9ëȰ‘À§P` ÓüeéÇxq¾é'f¬å¬:XïÏ™ÒF´?˜Ç<óûôõõA]v]v]6<Ž>Ž>ŽÚ>î-½·ôÞRhÜи¡q<ï{Þ÷¼ÏÎË/2.ãˆc‰M^œoú‰ëû.F.FâåûŒæèÚèZf¬‘ÞÁÞÁÞAH©O©O©‡’ê’ê’jðù}~Ÿ®„¯„¯„!«/«/«òå=Ê{¾C¾C¾C0Ò<Ò<Òì0x\ËÔ2-}ÙgóM? v/ì–K0š;šëØ+_é™z¦wuuÁÿÿ?„Ö…Ö…ÖØ?ì†ò§åOËŸBáÉ“…'íº•“+'WNBs 9аÇõ|Í«yKç›~¤.H]`<€É‘ÉgÛË„L $`—Gª#Õ‘j´Z­°"yEòŠd] ] ]ƒõÙë³×gCÑá¢ÃE‡Á³Æ³Æ³Zƒ­ÁÖ ÃØÚ*m•“gñM?n¥Œr=PJ+ÑJ”õ,2ö¹F®RJSšÒ”jXݰºaµR¥Z©Vª)Õy ó@ç¥\w]w]w•êØÛ±·c¯R9µ9µ9µJmqoqoq+•&i’&Je„2B¡¸¾rõ«vÕnól~ÌÏÇö˜|ïÜðòÆË/o@nqnqn1¤u¦u¦uÂîÝ»`pëàÖÁ­Â0¤7¦7¦7BeEeEe…cÅú¹Ã MߤoúÏ=ö‘®´ºæ:÷¹owåûàûàû Œ{ǽã^Лô&½ÉæÎ¼™y3ó^í|µóÕNwòNÞ9Œýn:A´ˆqò>Ø•8ÇÞÆÏ±6£iùYÆd 䜴H‹£»ò$Oò@<âH­ÔJ­#¿LËbàkNsÀ¨1j˜&ú¿Î±œüDo£éÝz7€QiTå;Îs‘ë’ÐÊÎ8¾H-5Ԁܑ[r èå-o0*Œ ¢èzÞãÐÿøÉ?kÿ+gííbÖÞÇfç öo[af«8àîIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-11.0.png 644 233 144 2666 13755454066 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜkIDATHÇÍ–mL•eǯó<€6²$§N²Š„9Që‹NTÖFV&Nú@/ÀZen–cå¦nÖ¤¢Íbs {ÙÐi2Nm0ŽÑ–aäf‹ lI!¢xŽ…àñ›ßÖ³õ“ý8Gi‰ˆ|°³Â¨0fê±²ôõ³4ƒè©€²3¬,kž5T¯êU½8v…¿øk)UfTÕèÆˆ>OŸêå$?Thp=¥?s”£""ÿEÿEÍKûÐ}C÷y €rÚ­b«˜é‰¯h¥Ìn³Ûì"DˆÌjh’I&gáB )î!Ÿ|õ´zši–¤øììðk~MóòS²ŸÔ;tšêjêj@í°–Ú¼Í5Í;›w¢ú úîﻟ9Ö\Û\Û\ }+úVô­püæ”9eN9xhïÐÞ¡½ÐtW“»É¸Ðx¡qæ½/UÿÔ>Vû˜}´‡N ËEDzwÂñµÇׂ±@½°­§²¶²–[öˆœ¼yòæÉ›ŽPåÊ•œ™Ž4Eš"Msîî%%KJ–@q¤¸­¸ ºBÏ…žãÖµùư1¬^€Ö=­{@­Kö#¼—]ž]®NÀ•cWŽAâŠ(‚c8:Á·ƒoß‚ÎÂÎÂÎBGðÈÂ# ,„àXp,8]]]s;>>†•›VnZ¹Éñ/¿^Ò^ÒŸ}þèç$ö$ö€™•Ù›Ù«N¸åMÏžxD"Þ)oŸœ—óÛ:°-g[ŽHÞ¥¼Ñ¼Q‘xC¼!Þ 3V5^5^5.’WŸWŸW/’X—X—X's,áKø>‘@K %Ðâø³[³ÍþU$~6^/’˜HÚ†´ "2é)õ”òˆ[L+l…]ýâÖ7êEd…ˆˆäÚú=GÏ‘SrJNÍÖGô}DÄÕæjsµ9þñüñüñ|‘üù7òoˆ\Þ~yûåí"Ñ'£¢D4]ë×úE ¦ ”\‘éóÓçEäOõ‘úÈÕï¯V¦•;+·º;»;E\+EDxÑ~ଋYY">¯ÏëóÎm,p&p&pF$sqæâÌÅ"q#nÄ ‘U[VmYµEdÙ®e»–íYZZ õ„¾ }+²ö5߬ùFå¹ë3×gò¢H{C{ƒˆ§qºzºúÜYg*õºúºz`ÄžJ³Ë삉'¾œø•ø.IDæþ‡&vLì˜Øz…^¡Wnܸ!ÚmŒ6‚UmU[Õ "ª]µCìûØ/±_PÖ¸þ þ 3•Äꞯ{’ûôÐéTcÿUÿUÍ ƒ“ƒÎ*ë¸u|Öƒÿ7}f ¼Î«¼ VLe¨ •£r˜Vï¦øk‡‡ü1Lóòûö˜*µyÕfÏfÏŒJ鯍1 4› 31wó“†/ÐB -Àdò[©úÕ9uKågeYYèêgcʘÂ)~6{7{Äí›ÿÎýVÞ±·‹;ö>vgÞ`ÿT³Êý³ÊÙ IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-13.7.png 644 233 144 2717 13755454066 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü„IDATHÇÍ–ÿOÔuÇ_^Á‘Ó6 ™ˆM©d£9÷CbJ4(«éXy²ÙõCT³9ü¡\kV¶5òËvA°dç&81›r‘“5Êœ‡ƒL9¾Èíäw÷ù¼ýp÷ásæ?àû—Ïçõ~½ÞÏçsï÷çõü¼DDä©èSÀ’nI·Ø"±e9¿´piẖH|\ƒ¸ò¸ò?ë µ>µ`Yã²Fý¦y£>v½ˆ‰ËgÌËSbN$µ'µÇm‰ÆŸÂëÙ¯g/}:ÕÖÓÖÓsapœqœèhêhâ=ûmì7€û[îo36òF½±ÞÀ‹Å—OÿÇ/ qCRbR¢¬Ù¶f[æû‘‚Û™ðÚ«¯½ p/þ^¼²€ö/L²ÚøñcŒ©˜ØÈGëõžoðü=+^Zñ’”í,Ûimˆ,¸ù#|´ú£Õ_è4ð9Ÿ“ aØ ½­½Í¨Õ@q`ÆFÞ¨7Öx¾ÁgðGô˜G©‹ˆ|ý2ZE¸"¼(¨WO­ ­uUKÓÒEJÿC¿¦_ƒð?á;á; ²U¶Êæ‘¡.«y5Òâƒ+ƒ+ io…\!„ƒ|õæŽU;V¿~Ù<ÊQ‘¬oÁ:bñ/áìPÆPh—(¦CÏÒ³,-¨95â‡bœå,g1óA‚’š©2ñŠÁÓëé°ú­~ÿ’ˆ°¬o£;vÜÍl£Æª@Ï1`\;]—5°~ s Ó„X?°~`=±±±ƒgÜ3îtÇF2F2F2 >¯>·>\Óß'}Ÿ„:ùÄú:üuŒ:ôp~áüôë=‹""×>„Ÿ ~*€p€zç­Þ7ö¾±—£EÜýî~w?Üj¸Õp«RJSJSJ¡¼¾¼¾¼Òo§ßN¿ CùCùCù¦°Kƒ—/ ÂæªÍU›« äJÉÅ’‹‹Ð‚ëŽæŽfõtú:}îŠè¾´ÛŠU;Œ·Ž·BpÙdCës-¾¤¿’^˜^n§ÛévB_k_k_+ìÏÙŸ³?º]®lìÞØ½±‹‹‹La!oÈòšqsZóªæUPqrǾûb¶Ö;¶rl%ð™­ÀV Ú–¥,KÑÿâÜ”kÊêäbÛ·;owÞnè°tX:,&ÎÌž™=3{ h{Ñö¢íeϲgÙáF„ ©ï”ï”ïdx3¼^øõy÷ ÷ Ófô3“ßM~†!lûÙö³jç¼wÊ;Êó0`Îï9}9}ÐSÖSÖSMZ“Ö¤ÁÖÊ­•[+ͺ »6ìÚ° ŽÞ=z÷è]˜®˜®˜®0óÇ’%K†üò³ócºW޾Ü{rìI hë¶u«v‹,ñoóo»Þ' =çzΉÄmáÝhÓSSUª™ŸŸ©:\u¸ê°ÈLÂLÂL‚ÈòËO,?!’Û–Û–Û&R0^0^0.b¯³×ÙëDæòæòæòD®Ô^©½R+RòlIZIš#ÈÚ(ßšËׇE$Ñ_è/¼Þgve¨æ“šO€»FWj´ àûÆ×ækCë‚?ŽqÒ`i°&&'&'&AwêNÝ ªZU«j˜ªžªžª5¬†Õ0øÖùVûVCà—€'àAþþp!ʧÕ¨9`øÙq·¾Ö ë„ xx,òó@oÐb|ì¢:¯ÎƒjTª1ÆU¢J5«fÕlÌ·à>÷câ}ÚUíêC>¦y4ë˜uìAEWUÆWÆ/öT/IáÑð(p\ hÓù©Å‰T—êT@ -´³Ì0ê†êWý€/ZÿŒvP;HˆZm“¶)?lðýßùßåc{»xlïcç ö?¿ÀKh5®ÏJIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-13.8.png 644 233 144 3045 13755454066 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÚIDATHÇÍ–íO”WÆï†Á!(HØÖÐNI\jC¥Ñµ_LºDcq)Â'' Bc·Õ¶‰iâ’ÙÝe“] “h E—¾˜&²‚Õt7%Rd…$³U,/BF óò<ç·fžÙý <_&÷˹®+sÎ}=G@DDR¢¿V§Õi]‰­f~ÍÞ5{3[#±W‹Ëâú÷iHnHnXß¼¾Y5c£nôÇî1ñcùŒ¼¤ˆ™H¸”pÉ’Ï@IvIöš_Eâ?õ€£ÝѾ†ÊË•—Ú¾hû‚ã0u{ê6ÀÓ¼§y`ÆFÝè7öx±øræÿøE ¾3¾ÓòH°'ØE`cþÆü͵‘†‰ÍPønồq“qÊ Ú ‰$•øñc¬¹˜Ø¨Gûýžoðü=i»Óv‹@QiQ©£)²aô"|ôêG¯|¡vÀƒ‡$ûÃ~­\+'ªGõ`ÁflÔ~c¿gà|Dy”ºˆÈŸ‹V.¯ º¥'…2B þ¥½¢½B(ZPú°~W¿ á‡áÃ?‚ÊVÙ*s-2ÇÜj¤ôPx}x=¡ð£Pz(ÔÆ>ÏÏÏ¢ü«GùXD$ë¯àð9|~WÆ7oíŸì§MÏÒ³X^e¨%µÔQG]Œ+\á PN9åfZ­¨µüµ[íf™ Qü=c·Æn8ü¿ßÆ`DOôóöò¬ª²ªÔi=Ç>_z¾ò|%jhËÐæ¡Í&áЖ¡-C[ ~Wý®ú]06=6=6mÖõ›úMý¦ßk½wñÞE¨ÿ¬þãúQþ8b±¯v種c ÇŒ£õö ;DDî~_¿óõ;>  Üe·Þ;öÞ1ƈôööƒ¦Mš`mÁÚ‚µàjp5¸À9áœpNÀxÛxÛx›)h   2¼Þ /¸4—ß凌,ç÷Îï Œ,L7ýrCGVGè=V)Y·Ýþ·ÞÉ­Ì­Q_É›ò¦¥© ²ðóÂÏ%Á¹Ï¹×¹WDš¥YšEEª'«'«'E*Üî ·Hª/Õ—êYÚº´ui«¬®Ð¹Ð¹Ð9‘@} >P/²Ç²'qO¢ˆý¢ãŽãŽ$¬Ü|¢=Ñ,M"yž<ˆd%H:ðÖÛV9××ÇÒe[²-‰ÄŸ‘a–ùÒѲä²dçKΗ/‹Ì5Î5Î5Šì,ÝYº³TäÔŽS;Ní9ë:ë:ë Öë‚u"qqq¦°`~0?˜/$H‘-7.ܸ d’)"l`ƒÌ‹ÄOÅO‰È&ëûÖ÷yÃ*šÞ®·[FÄ* ‰ÈoDD$Í^©]9¾r\$­0­0­P¤EoÑ[t‘’…’…’‘«×®^»zM„ 2Èééêéêé2… ú}ƒ>‘Ì™'2Oˆtí8ÚqT$Þ=þºÈíCýOûŸJšˆí'ÛO"ªH³jVËHôòßýË_¶|Ù$GîXôŠrïåÞɽÝÅÝÅÝŰìYö,{ çHΑœ#êMõ¦z¡Ì^f/³ÃhßhßhlÛ·mß¶}0¬ëÃ:ÔêuHñ¥ÜO¹E¿;ðË_ÌŸWÕªZ¹áÒø¥qPŸFô˜Sªú¤êà‘1•Ú·Ú·°ð—…o¾AOOOš—:X,ÀÌìÌìÌ,è5z^Ê­ÜÊ sµsµsµ ¶«íj;héZº–³‹³g¢´‚¯_7§’‘ª×ª^‹JV}lÆ1ã·ÁØó±ç«üûy®7éM1>vCu«nPͪY5Çø•]Ù•Ô”šRS1ùIõH=µFmPÔ!uˆeõ뾚p,:ý6®ý‰ ¢Î«ÇŽ3Ÿ„ðãðcÀ«-k˦óó{j¨õÕ©:VZižñ3?ƒº¯~P?³Ñþ¿k‹Ú"!u=<žþf8ÿaÛaDŒ)Öù_Üoå ûºxaßc/æ ö¿ø¼Ð8¿i‘CIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-53-grey.png 644 233 144 6224 13755454064 16002 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IIDATXÃ…—PS×¶Ç¿{ŸüN0|TMʱB„'^Á¹µâm©>½µ´uœJ*ú†ê{V¬ ´WëX¡Zíå‡3ÏJ-‚¿ŠPé Ø+êè˜Ñ‚(¹Z:üˆ(?$䜳ï$pÇ™N×?{ö:ë¬õÉ^k¯³Bòòòòòòà žXh¢ä±ä±ä1«Ï;‘w"ï .xRð¤àÉŸç0Ó1Ýÿ͇ð!|HìÇ®W«†íC9ÊQNr‰HDxˆ‡xàc|ŒÙ>yšIßr2D†ÈÐŽ2óËæ—Í/_zP¸¶pmáZbãõ¼ž×“eâ5/—?L@èI±@, ÄkîQ÷¨{tÚü‚Ú‚Ú‚Ú“]n›Ûæ¶5ÜrÎsÎs΋ý?õ!õ!õ!ü›››Brâ¤qÒ8)0?`~ÀüÀ·÷=÷ÙûÞ÷ù›ôïç‹ïãññI¼'¸ˆi™–iÅ÷Éz²ž¬×âôœžÓ7ýnô»Ñïf666ÛR¦)¨/¨/¨_6ßmq[Ü–‹íˆvD;ÂÂ2û2û2ûˆÅÿ¸ÿqÿã l[À@Kn‘[ä\pC98p(((€û¸ûÀä%óêÅ=âq@si.Í…cø“áO†?X*-•–JYœÃßáïð'VYœ,N—GY$‹d‘ù+=FÑcLwMwMw‘â”y‹Y;’9’9’ Ü ¸p/hÝݺ»u7p/â^Ľà~êýÔû©€[t‹n€"Ð_Ü_Ü_ Ü ¸p'è¼Þy½ó:€ñ!>˜‰™˜ ZÿbÿbÿbÈL-¦S R|<>>ʇña|Øfêžéžéža_´1Úm$%Xƒ5X3 Š®]]»ºv¥I¥I¥IÀéÑÓ£§GSõ§êOÕÕIÕIÕI€pF8#œÚµ-j['''?ÑŸèO8žz<õx*P¥¨RT)ò3ù™üì‹Y´,Z-#%>¶Û·Û·ÛÅ}'ž\xr!óÉ(_ÄñE“{vÝpÝpÝÀXISISIÓ”žE°Á˜Ð+ô ½Sꯢ¾Šú*бÓ9§sNçLé[+Z+Z+ÛaÚaÚablàÍ7Þd/ʨÇÇGñ9>Çç$’VÑ*Z5ùËä |r.¾‹ïâ¾è¾è¾h lCÙ†² @™¦LS¦¬qÖ8kÜ”}jwjwj7°Ø³Ø³Ø´ßh¿Ñ~¸[y·òn% OÕ§êSM‚&A“à1ãñT|úý€~ ¥(%‘” áB¸VíˆwÄ;âñO>‹Ïâ³ÀÑCcÀ|oJ¶K¶K¶===@|P|P| )×”kÊcÍÇš5}û6ömÂáŽp 1jŒ#p«öVí­Z £§£§£ä¹ 6j£6z衟ŒÇÞ½;zÿ¤j Vüüü÷“¯ïx}Çëâ^‹Çâ±x¦R „1{ =ÐȘ{‰{‰{ÉTŽ\ƒ®A× cæXs¬9–±¦éMÓ›¦3Öîlw¶;ˆˆˆœ²wø9ü~Œ}êøÔñ©ƒ1‹Ò¢´(§âu¾Ûùn绌í\¶sÙÎelƒy¿y¿y¿û Å*¬Â*s¹$O’'É#9—/5^j öööPQ‘ŠT„£äË’/K¾ÍæFóTŠm÷m÷m÷Q#jD  ë×õëúʺʺÊ:àÚŒk3®Í˜²Y9²rd%Àµqm\ Ú¢Ú¢Ú—÷±ªNW§«Ó‰ ÄJ¬ÄŠ¿D8&£ÁW‚¯_Ù»Kf’™d¦ïº¿üfðîQµ½Ú^m¶úÚSòíäÛÉ·áºj¿j¿jòcócócÒŽÒŽÒ ¡"¡"¡xÍóšç5æIó¤y€›çož¿y0o3o3oŽÎ::ëè, Ïâ>‹Úµ?j?äçV[un•èì í í ¥7eŲbYñ½5ž.O—§k›‡äþ–û[îonã6nÿÇaééé“kÊç5Ïkž×ÌÊH.M.M.eÉ©¯¤¾’ú ¹ò´èiÑÓ"°îàîàî`]³®Y× Ì ›63 KÉR²À ÌÀ  _ѯèW=¡=¡=¡€v·v·v7ðjú«é¯¦ÃÙr§åNËüµB[¡­Ð¢N¥UiUÚñ7Ç8ÆÅþ³1³Û6p¦—L/™^â,¤‚T ûJ(¡„²e™ô‚ô‚ôºø_Ý¿ºu3Ë´þiýÓú‰C¿A¿A¿¯777BªËÕåêrr$( €Àj¬Æj@ý‹úõ/@HuHuH5p$àHÀ8{{{ 99xrðä S0 FÁH—sÝ\7×½ã8R‚” ‡±û°Oê󄸉¹Q’O“Ãäð•,šHiâ¶lÆfl¦_×]¨»Pwß833É&Ù$±P, ä#ùÒ‘Žt-hA ÀXkÄ@1P œ¬EíŪ‹U«„­C=C=C=’Ãr\#×TFEEl„f˜É)t¢üß<ªFºÐÅ?@6²‘Mjæü0ç‡9?½£øHñ‘â£Ê¡yCó†æI†Ïl:³é̦©Ú%A$ˆÁ…qŒcÀÆ0öo3Àz¬Çz0z™^¦—!¿a½a½aeÉ·Õ·Õ·Õ\‘Z©Vª•Ýãî*w•»jûÞææf€Y™•Yáçó­Ôé]«¼·×¯¹·¹·¹pg»³ÝÙÛ÷ªujZ÷¸êaíÃÚ‡µ\QýêúÕõ«Y2É"Y$ r±B¬+À&J`vfgv€ð„'<ÆžZŸZŸZQÙÓÓ?µMmSÛ1^Œã·ï¥èz {œ–ÓrZΞÀaË|âkÞ¿$rïÖ›"® h@ƒ°•$’üÎÄ«ñ¼g£g£g£¸%]LÓEš8÷ÀÜs MlÛÅv¨èl:›Î†‹ÏásøȆ ?.DØØØpŠEŒ"¦háÄ¥ÙvS,KÄÉaofÿÇ—±ÂÂÂÂÂB8|' ¯b²†¼µ»Õ[»‡É!rˆºò5Q5m«A2A¿®õÔzj=üÆá²á²á2¨(¥”RØ}'qiìÒØ¥1ÑÙ]Ò]Ò]Âu(v)v)v=øÑÕãêqõì:ر´ciÇRÀ hðõS oô`ŸÊëືvÏÏ97çÜœsEï(2™ŠÌÊ¡¡¡Éðé¼Óy§ó„­Þ‰Þ¯5 5 5Ç›,M–& y_Õ®jWµ¢A4ˆ†-×$ïIÞ“¼7ö§°¸°¸°8:è÷ï:ö"‡ß£Ñh4Á{·­LÆdLF6Ù¢lQ¶(ü¿0C˜!̸ÅËÃäaò°ÿúºIÿ’þ%ç†Û†Û†ÛØ—Íß6Ûü­°è¹ç¹ç¹‡Ë–&J¥‰ÿÊÊX+ûþÇ‰ËÆ= 1(N÷eÀ{Pü‹< ¿S»¨G=ê3«a5¬ÆØIÏÒ³ôìÏaão¿=þ¶%-‘–HKh—Áep—¯†Ÿ ?~öÏFk§µÓÚI~§‰ÓÄiì˜×o­Ðù{ /Ô®·]fd! Y’;d-YKÖþ#œÕ³zV¿cr¦r¦r&m㺸.®«g¦ø…ø…øÅÆÞö5íkÚ×€óúó –cÄñ/{ýQŒí|xÖIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-133.png 644 233 144 2670 13755454065 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜmIDATHÇÍ–mh“çǯ¦ic<¶Õ¾L„•ÂÔ8lëA)¸à±Õ,•¥›:ZÐF9õ€›ûæ›=îØÃ^pv+ Ý+‘ÁÜü"Ó¸í ³õ¥µ©kZ»uRg³µMò<ÏýÛ‡äÎ78Ÿ}¾„ëåþÿÿ÷uq]¹DDdeöWÀQí¨v”flGÐö/kYÖò×ãû¨ Û ¶]=e–}°*¼*lÚ¶Žëüüó"6~>ŸöËJ±®“®“Þ¬ý&¼P÷BݲªŒýï(¸O¹OýfÀžÏö|ˆ ð˜ùvæ[€{Þ{^°m×ùú¼ÆËÇ—7ÿÀ/E§‹NÜW±«Xj6×l~lo&áÆcðܳÏ= 0U8U¨`þ ¬`…ò èïnž­ãÙ|}^ãi|ͧù3z*Ÿ®|ZZ··nw÷gŒƒýîTó¥Oïð+ÀH ó%ó%’ ¢* @`Û:®óõy§ñ5ŸæÏè‘{{øï¨@q 0Ò߀7ã`ý%½7½—´ú^Í«y”–l]±.[—Á˜4&IPU«jsı°@·SM©&ҪΨ2ªrþ†Åçç @eùíVŠˆxÞÇpÇÝñ„ÆWޝ>à3š®I×°@„1›P%UR%ƒä íç6·¹ j·Ú­vazéÍ‹n­±Ö°Àž >Œ?2þrOº'N­'+ìèxùõ—_îXÔ[é×Ò¯Ù:ú¶÷mëÛõõÃyÑvO}O}O=Œ]»>v=/~xøððaèiêy²çIˆý8îwØWƒ¾VOVد²w°}°=—¾ÛøWòñäã$w~¿ó«_Ù ¿péÂ¥ —`¬¬¬J|%¾ø=~ßëªÖU­«‚Áø`|0«W/®^ÿ5ÿ5ÿ5¨¾Q}¹ú2L$cŸÄ>!©ùTàøæã›µ°^uˆ”ž+=÷·§díÆÐÆP¶¿RЯþËw|'.ß._È©ÞR½¥z‹ˆ„%,a‘ùåóËç—‹„¦BS¡)‘`C°!Ø RÙVÙVÙ&rçÖ[wn‰t©.Õ¥D‚EÁ¢`‘HùÕò‰ò ‘…7–Ž-—æã£cÇDrz`UɪkîN߾Ȍ½´Þ³Þ³[ÒØÑØÑØGÄqØþ¹à\p.[›·6om†µÞµÞµ^‡”?åOù¡ÅÛâmñ‚§ÉÓäi‚kWÔ•\C¹« gšý ´Òs¥çÔIŒ™†™àËlqoXŸZŸÚ6\ÜpqÃEˆ¶F[£­0`˜&l l l ä]ÀÙèltB}´>Z…Ó;¦wLÛñÚÖvÕvÁÇG{Û{Ûm¿Ù;þ6h=‘„7áúŸ8ÏGÏGEdQD„΂§T¹*—”nnYqYqY±ÈRáRáR¡HÛ¡¶Cm‡DæŠæŠæŠD*:+:+:EjºkºkºEN¬?±þÄz‘›#7GnŽˆTÄ*b1‘úêÞ­{WäÅÞÀþÀ~Ogáé¯÷}½O$§çOS™ÊNIÜ1F쩼ÿŸûÝ÷»!u u uÀ¾iÊ—ò¥|0ëšuͺÀ¸gÜ3 'Ä̘™Ã}¬v«~åOUgÕYPaVá<³jVÍ`E¬ˆ5ª†ÔP^¼Øè4:YP¿äöØãO î ÷ÄŸöXÞæ'à ¸+·ù‡Ì!Àe†ÌiŽržóöâö±ÔuF>þÃB}…>úPꌹÆ\Cš~s—¹+oó›gÀ©+õÀæhÿ+Ú×ÅCû{8_°¿wÌ …KòVIEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-down.png 644 233 144 310 12610450011 16066 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.1/web/www/routino/icons/limit-1.3.png 644 233 144 2431 13755454065 14742 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÎIDATHÇÍ–]H”YÇŸÑmTú­….¡%Ð"Ü>”/ÊÈÈ”¤¢¨‹% Z‚`‹¥ØZ« ÖŠ0è"„X£dDJ³$(+cº(4i°&³šÕÕl?ßóÛ‹™wÞ·uco=73ÿç<ÏÿÿÏyÏóñ$~R²S²SÄqÊ~;ž¾)}ÓwÆñe\U®ªž_`aýÂz€Lo¦×ì³±5oå;ëEl~§žØ´i7\¥ | v¬Ú±*ýÛ8þ£ 2Z2Z&t¨i­ið5úùÂÝán€±Ò±R°±5oå[õŸ“_NýK_æ´Íis½4wš[r6æl\v(žÐ¿ *¶Tlx—ú.U¥€ñ70yªˆÅ#lÍ'ò­z‹Ïâ·ô,ý¸Å%‹KD rW完†xAßU8²ôÈRKOkÎr–y Gõ(€±ÇØC T—êÀ… llÍ[ùV½Ågñ[z–~Ü|¹·u :½:PÚctãñÀ¬5kÑÌùf¡YˆRÏ”_ù±ÇcŒÙÐ ™/Í— ¿5æsQj•~A¿€ÆGã#0•àWÕiÕi–Áº Ž­ɽáŒpôô`,Kò—sËÌ43™4ºŒQcè •V‡¡Ï|æ³ •®t¥g8ÃGÞ-B„€ã‘ñˆÉ$ÿtp*8Iý„Ÿ„±ËáÀ‰'’Ïû=cú[ý-¨ÓªA5Ä×àJÍ•š+5( +T`˜ à\ñ¹âsÅü+8°ý«fÍ«yzIý¸Ÿ„±g?AS¤)ìP?€JU©Äôßõ“úIØíßíßí·7¾ãRÇ¥ŽKÌOCOCOCà9ï9ï9UõUõUõݟݟݯ¦_}zõ)™SÅ–^B?áG`Áý÷Õ ¯ ¯.~)4½b:o:®å]Ë»–9áœpNÚ:Û:Û:gëÌêÌêÌ‚ã•Ç+WBûDûDûä·ä·ä·@àçÀÑÀQÇJ¿±þ%ô~2çgÎ7_ÀÈû‘÷Žcß®U#¨&Õ¤šl¢¢}EûŠöÏô™>ÓŽëCú>dãHm¤6R ›Ë6—m.ƒÜâÜâÜbè]Ô»¨w‘ÃX,¡—ÔûI1oš7]/Dômú61DDd±¤Èky-"²NÖIrhƒÚ 6(âò¹|.Ÿ.‰.‰.©»^w½îºÈNÏNÏNÈí»·ïÞ¾+¢Ö¨5jH÷oݧ»OÛulLèYú–Ÿï‰=÷F1²H'Ý~Âw‰»Ä wžßy~ç9LOOÃʲ•e+ËÀ_è/ôBÑú¢õEë!ë`ÖÁ¬ƒP-ÕR-É,,w¼cS_}Ǿr*§õQ}D¡ìS999 Úvm»¶pãÆ #å#å#å šU³jm…¶B[C†> }ãµÑgôÙ§’ý‰þäO¥£4‚F’ ̽æÞd߈s qÆ·¡º§î©{ ¼Ê«¼Ž¸[­V«A}2¶[}l2 Fá+}ì?:?ÚcLã¡ñÀù(®âÅ ŒÇ¿ªWõª^`„a†_9Æ1Pí*¤B( ÐÀè1z=ÁŸÔ›Ñùgí·rÖÞ.fí}lvÞ`ÿwöuöP6%IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-71-grey.png 644 233 144 6046 13755454064 16004 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÛIDATXÃ…WmL”×¶~ö~ßù`FG@Œ%Vè •¢4‚¸bAÛr*ÆÒ±¡6ÐC-z4r/‘;öƒöz‹ÚÖ\“Ö¶ÈQ :¤=âõ#¥R,ás@I¢‚3Nef˜ygïûƒ0&Mן½ö»×zö^ÏZ{½D¯×ëõzøbV,³MoŠ7Å›¼Yÿ•þ+ýW<¨ôNéÒ;©Üûq¿þ!i%­¤]óÆŒaÆ0càå¨F5ªIÂŽpÀ€7ðÞàåŠtEº"‰¿‹¿‹¿_¯&fb&æýU%%%m½eÙeÙeÙdB ‘B¤òÂ,vɃ˗ÎŒCâh +e¥¬”]rN;§ÓÑ¥ÆRc©±fÔ9áœpN´^³=k{ÖöìšÿRSSCãš”5)kRHQŒ,F#¢ý£ý£ýïÜ»îýÞ»ßkoξǟ׿Ÿè¹Áu\Ã5\ö“’CrBŽ !BˆÒ~rú›éo¦¿YuqëâVwAÊ@Ê@ÊuEöDöDö4E‘¢HQÞÆÛx*Ø`ƒ ÀìÀK±Ka› ž ž FZOGOGOw]¿~!œLmœÚ8µ1ëUˆ*D¯tç¸sÜ9Žñ\žËson'  ëÈÇÇ€t #x¡h ¢¡ã_N»Óî´/1ô¹ÐçBŸ“â2veìÊØ%ÖøZ}­¾V„b –` $ÆÃxD bƒ`xˆ‡x`V`@†È‚„ILb¢EcÑX4©ÿ¼þóúÏ¥í#G.Ž\¯Ê}ä>rŸ[MRº”.¥¯ÏÄz¬Çú±?¨O§O§O' ’É‚>ø·­ÉÖdkZþbèK¡/…¾$¥åfçfçf‹W½µè­Eoa‰tYº,]Øv€€ˆqŒcàwø~ÀE\ÄE€L‘)2+ä ¹ðžÃs º·¹·¹·¾¾¾Xⵚšš!¥yý{ñxñ‘ÒæÒæÒæ¢ÎNggS§fZ3­™æº¼Þ¼Þ¼^Òé{Î÷œï9PnåVn…†hˆ†h000€n¸ èAz¾‡ïá{¢$J¢ЈF4<žÇóø¹ƒX-;,;,;ÀNhOhOhyŒu¡u¡u!1Écä1ò˜cDÎÃyøÁ­.µKíRIéIéIéHñ½ï{ß÷>ä®/\_¸¾€j0a0a0`Ñ,šE0Â#€Ó8Ó~Á/øX´8hq°´jiÕÒ*€´“vÒ ÅÅÅãåãåãå@â•Ä+‰Ww§»ÓÝ ï—¾_ú~ [ÒóIÏ'=”úwëß­Ë‚eÁ·RI'é$Ýßòü&ý&ý&Q¾JµJµJE*=Ù&' ÉB²h j j j×Ô®©]ÔýZ÷kݯÀù»çïž¿ œ’|$™s–ÊRY*çÃÚaí°–óâÖâÖâVÎ÷Wî¯Ü_Éùée§—^6¿ŸU° VÁ9ËbY,kÞ¿Åûxï“pz†ž¡gæN¦ÀU\ÅÕù“‹~¢Ÿè(×)×)׿wÌï˜ß~(ø¡à‡ å©”§RžH+i%­@pupup5ð^ê{©ï¥+¿[ùÝÊï[‚-Á–0o@ºÐ5J_¥¯88AÂEA+h-?k]k]k]KVIÛ¥íÒv<%¶ˆ-b 8NáNpwq0[×€6U›ªM„%‡%‡%‘»#wGî¸Û¸ m‘m‘mà‚ .€'ÇÉq€?ÁŸàO<t S˜š+_Ü£¦»¦»¦»0LÓhMãg©òcåÇÊ¥ŠáÀáÀá@~öFÕªUžÁ3xvw†;ÉHD&]“®IЭíÖvk¸£qGãŽ>⸕¨ø$Ÿä“è{Ñ‹^€(ˆ‚(æÕìuö:{€ ì#›G6lL·M·M·ñßÊaå°rXª È@2JªE½¨õ¤¨Í¿Í¿Íßj‰²DY¢ Ô‚ZPÃê5ü[ào¿š|M¾&ÐíÒíÒíšwLI H‰"Q$M!-¤…y“¼IÞ|DßB[h f¤4)MJƒê{Ó÷¦ïM,Ž˜ˆ‰˜ð¿ÄMÜÄ}RNƒ~ ú1èÇ‹åIò$yÒ7cSÑSÑSÑÂHýÖú­õ[Ýû<ö4žqæFĈ€öíÚE£hÀx‰LdÜÄMÜ4hfdfdfpø;üþó %ù$ŸäCa8d8d8ÄlcµcµcµôªüˆüˆüÈo™®Qרk´ÀEǚƚƚ×O®Ÿ\?í?§NU§ªSo¨¨¨*šëšëšëx²—ä)å)å)åà›.lº°éÂ#7¹l æšE³hÖüzJcJcJ#°Ñ¸Ñ¸Ñ8§¶wOwOwOãï×b¯Å^‹¥*­ÖGëØÈâX‹ËLê„:¡Î@i5­¦ÕB'=LÓ÷ÿɆØÊqªÆUãªq £«£«£‹?ӓٓٓ‰ÚȄȄÈØ¢¢¢yÓkQ‹ZÌgÛYœÅÙy Ë÷,ß³| »®»®»ëª?T¨ j›Ä&Q •ݒݒ݈•X‰µ˜‘XKbûÞD*P!{ÚOG¿¨Ç¿Ç¿Ç_vtvtvt’íª~U¿ª`¡,”…î¾$n·‰Ûìÿ¡‹ÑÅèbè}¿¿{ËÖã¸ü‰$&&&&&BòL{¸œË¹œ¼5±rbåÄJ|á^æ^æ^vMšÍÖ—?»»áü¿µôYú,}üºOuŸê>å^÷ÐõÐõÐ%ì•%Èd ÿÌ«x¯:ÝP#¸û¸Ï–z#à¹(éq<!ÂÝR4£ÍînànH¢ ´6ü¤slvlvlf+e•²JY%ír…\!÷Âۆ°†°†ÔDÓiÈ4D~`,€ð“»F@ÛŸá ø yŒ»žrá.A>ò‘/^'Ù$›dÿ;Œ7ófÞ¼‡Ï“>OúÚ9ޟٟٟ Ì„ÎcÏÛXÚÿ Çÿ¿Hås(˜JIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-52.png 644 233 144 2645 13755454065 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜZIDATHÇÍ–]L\uÆŸ32$ ÖB4 í ©µ@¿l¼À¤»,dmF`i,i +^lvzmö¢ÍF7u›RmR·%鮉ƒRnLE º›LJ$HÍvw•„ •©…qÎÇo/fÎÌìfÍÞöÜœ<ïÿ}Ÿç9ÿ÷ü’¤™·Àô=EiìùU.h 4Vü9ß¶ÀxÞx~ú<Øû`/ÀC—ºdÃŸ_/åøóõܸ6*(ˆDŒú ~^¬y±&P’ÆgÆ p pà^þðå>èû _Cl"6°R¿R9쎻ùn½Ë—ϯWÿK_ÿ°Øø'øÆúÆr ù%Øív;÷˜ËLÞ*K,I’$³Kˆ³ì,;ËÀQŽr4ç÷¼Ækà¬ð0ØoØop5—?£—ÕOûÉ{ûsxåô+§]6{—ͳ'§›úkj<5}}}p>t>t>˜MÌ&fáVàVàVÎî<»óìNˆî‰î‰îÉû€8>|8¬šóæ|ž^V?í'c,Úï~ÿî÷ÙòvgÉY>Yž3hŸO=™zÒåwÚsúi?‚¢O‹>u"{"öD^a»µÍږÓc“c“càÛçÛçÛM'›N6„««WW¯®ÂPíPíP-t]îºÜu9W·}fûÌöè¹Ñs£çF.nÕ›fAÞ’gõÓ~|’7ä Q%ùgý³Ffçé_ªP“šTìì){Êž’Žuë:Ö%X<°x`Q G‘pD:<<”NÜ9qçÄ©úpõáêÃRiIiIi‰Ô±¥cKÇI»´K»$ïuOÜWNOþAÿ Š%ïãÞÇ©òHöGöGÆŒd>k>›M,Væ4—ź;~wü©mSÛ¦6éPç¡ÎCRE¨"T’®5\k¸Ö í­Û[··Nj©m©m©•[[[¥@4 D%ÝÖwúNÒ?Œóô²úi?)QŸ¨¿ñ鳑ÏFÜ<:Œe¾à ýèFjzkzkz¥‘é‘é‘i©hwÑî¢ÝÒïï¯T¨T¤Åäbr1) W W WIeKeKeKRÿ‘þ#ýG$µY›%ûsó’yÉå§#§Ÿñó“§ÒmŒ|Ë·™æ¤fR3©ˆÇâ±x œ‹ÎEç"$»“ÝÉnˆ_‰_‰_ï‚wÁ á…ðBÖµÔZ*w8ù“ù–ùÖÿ=•ÿ£ýícïØïpÏ™tNœ&§ÞýÑ8•N¥S  ÌÛË묳™Ž—÷Ømv÷2à'û˜‘í´Jw^©9Ðèº&õ¯÷¯›²ì1{Ìÿ”|Æ1$Sozžö<-;dÃoø%Mé+}%QÆ#<"ég*W¹¤9mÔFaüÝ)uJeé·ZÑŠü2½y3'äo)l)ô?%½Ÿ|?ù‡†´îOîçå}{»¸oïc÷ç ößR—6^ºdéIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-17.7.png 644 233 144 2634 13755454066 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜQIDATHÇÍ–lSUÇÏ~±=ØÊHJÝ,’ c"º²%„É(ËØ˜ &šˆ AŒÙ”d!ò#Q’e°„©qQÂR2Fd€€¢¥Û"àŒH!• l°5HSmXûnïÇ?Ú×WðOÿáþÓwÎùžï÷¼{ß9½""RšþÈ}<÷ñ\GÊÎ}Ãö­)Z3ÿPÊîR³>gý¯ÀÌ}3÷ÌúrÖ—É˶mÅ-|v¾ˆÍŸ­gù¥TlG¡¯Ð—ãIÛ»áÅÊ+‹f§ìÏü`5Žþc›ÇÞ<Ð÷UßW¼ ãCãCyþò€m[q oå[|Ùü²û!}((ȹ…Ó §‰@Y]YûàšÖ6¬¸™w3O瀚Š)Ö Jk…³l+žÆ[ùŸÅoéYú©zœ++E ñ寗/R —¿†÷ç½?ÏÒK>æcŠÁŒšQõŠz…)Ð~í ‡°m+ná­|‹Ïâ·ô,ýT=öQ&EDö¾€j6›ÍLAƒŠ„3áf¨×Ôk$4TP6ï§Õ&µQmåPå]¥Ÿ×Ïgv}\‡u­òâsâsH¨M‰îD7˜ñ¿ÞØ4·i®UàÞ주%"²°Œ?Œ?¢ù¿Z~µÔÔs*ù\ò9b%“ûÜç,íÖî _=ƒƒFÔˆFóS…-ìÌ—ˆÈ»K%òê'¯~RbraÁõ×õÒ¼DDrGÞù<ðy@Xq}ŵ×DJC¥7Joˆø†|C¾!‘éÛ§oŸ¾]Äp.Ã%²ÄµÄµÄ%²8´8´8$šM„&DN5Z{j­HѷƘ1&†ñDžÎÓrbI¸®§®G/]<}³{³»ÄÔ£ûe¿¼ªDD.¾½«zWù€~}ÓàKo½ôSV‹...ÂhÃhÃhT;«ÕNð{‡½ÃvotttÛûs®å\˹XÞ²¼ey x‡½ß{¿Ï৺/õõôõè×a 2óDªáSG½£^ûàöáÛ‡!>ŸJ*áðÓ‡"‡"Pv§ìvÙmèèèÿïÁô¸z\=.hîoîoΊë]£k@u¨Õñ~nÏ\hþ¦i[Ó¶,¢±ñ9ãs€««´O`Vɬ’äoœ w‡»A“i{jkk¡ÏÓçéóØ. # 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.1/web/www/routino/icons/limit-85.png 644 233 144 2517 13755454065 14702 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–H”wÇ?wþ.Q#'¦‘M[Dä&¥û«¤™Xé,вQþ1ö‡£ùG£,ÐhSRbô†%ÒE‘A;m™i`fs•86J”ºœä±sÞ=Ïó}í»çžk4ÖŸ=ÿŸ_ïׇï÷ù|î‘”Я€=ÞaO Úö*Ë__¼´-h·ê`ÛbÛòË7ÜœÜ °àÜ‚sÆcË6ãf~d½ˆ¥É3ý’"–#îrÜe[aÈ>++VÆ´nCBgBç_쿲ÿ @Ç…Ž | “w'ïLN‚e›q3߬7õ"õåÈ¿ø"s-æšíˆ‹‹ÅE‹‹²¾ &ŒeAÙ¦²MãQãQʺH$Q^¼˜Ï«ÛŒ‡òÍzSÏÔ7y&?Ø@êºÔu"P¾£|GÂÙ`Áãáࢃ‹L^ 8Æ1Aój^}—¾‹9P·ÕmlØÀ²Í¸™oÖ›z¦¾É3ùÁ~äÍ»mü ¶Åo‹@ —€îÖÝFQGÀ¨¥j)Jû]{ª=õ©*PÀSLþµ~H?ú =[Ïý ý„~Å&½Sï$ú ý0Ò7ya¾D6ôÑ÷0™0é†Q}T|l£Ñhħ4–± ø–ÃÆzÚi§È&›ì¿††Às~ŒJ£2¤ü0?ØO¨±ÖŸ¡º®º.\œË´öL{¤’Knðü†Û†Û†ÛàdæÉÌ“™0:>:>:na;Š:Š:ŠàtÙé²ÓepfàÌÀ™˜™œ §)’4Ñ$‚æû±ÏmKdmíÚÚÐ1Šíu—ZjÅ/¯dH†Äö þAýƒz‘ro¹·Ü+r§ÿNÿ~‘͞͞Í‘¾Ä¾Ä¾D‘šÕ5«kV‹Üȼ‘y#S¤×Ök뵉ÌtÍtÏtKÀV±‹]ü&ïMþ—@RwR·º “y“yÞ¨oÕ·Zö½ë÷®ß»iŽ4Gššªšªšª ¯5¯5¯šºšºšº i"i"iJrJrJràüËó/Ï¿Œ¸É\V± èW§Ô©È+6ùÁ~¢E¢Ê¢ÊX!ó$æ‰ÍlyJeFf$Õtø}~Ÿß'âŸçŸçŸ'r«çVÏ­ )¤PÄ8n7Ž‹ì-Ý[º·T$¿4¿4¿TĹ޹޹^$aC†„ "Û‡¶?ÜþPÄè3\†K$J¢%ZdJ$Æã’T‘¨åQËYa1®Wm¿ŠhŸkŸ‡:•ôÒ¶edÉÈ’‘%"Y»³vgíq¹Æ\c"±¹±¹±¹"î›î›î›"éiéiéi";w6îlqÇ€cÀ1Pû¯‰·&Þšx+üÕ)Õ)Õ)\ &²Y„ Xì·Øo±à޻ϻýÝ×»ãMÇwåsçwó¸ùxWßfj¦fjiÙN¶“íºSœŽÓqºkßÚ.Ú.Ú.ÎñÓÖjkµµâÞèŽèŽèê\о }A;‰•gÈ3ä˜ÀÀ(1 LØŠ­Ø à5¼†×0a°ØÛÞÐÞÐÞÀœõ!õ!õ!ÒÞáw‡ß~7ñk¥N©Sê–yŠÛÅíâöÕ§X2KfÉ6зɡ©CS‡¦4  Þ|%_ÉW6üÓ1é˜tLΉѯԯԯ"?2~Äi¬«Æ =f`f@`Á,˜ƒG':Ñ À ^ð0ŽqŒ˜‹¹˜ .ÒEº à žà ø1õ˜zLÞ²¼²¼²AŸ Ä&'%'%'ñ­F«Ñb†xE¼"^¤x)^Š? RA*H@úHéÈ0&ÃJP‚’çþb˜&†>½>½>½˜áޝ×Çëã…Xw~7› ã¸0¾n±£ÂQá¨HZ¤5jZ# 2^4^4^äݱJ:I'é æâ¸8. gèz çÉyrÀaÆa·q·h¡… b!–çþ\ׯµ,Ÿå³|¨ÝñµÆZc-_¤×ÆkãY›ÇÍGY a!GÖ;£œQÎ(ÀÐbh1´ ZS¨)ÔÂC2JFÉ5½F¯ÑkÀPÅPÅPÐâ×â×ât5v5v5ÒQé¨tÀR,ÅRÃÆ00Ô;Ô;Ôû‚ÿÏ]?wý ` ¶` À ÌÀ PkNjNjNÂÃp×p×pÑn7/ ABÐßvø^ò½ä{ Çà a†0)À†0–Ñ2Z´ýÐöCÛ@qSqSqàE½¨lklklk€ù©óS秉˗'.ÚrÛrÛrâËÅ—‹/¿àc‹±Å :t.è6þ´ñ§?Ámaaa¤àÚ“kO®=Áq›Áf°þ¶û,û,û,Òñ¢eEËŠ–1·ÙÄOÄOÄO¦÷ì¤å¤å¤…±KÙ—²/e??ÞžÕžÕžÅØþØý±ûc{š÷4ïicy+óVæ­d¬ô`éÁÒƒ/ø¶¶2–nH7¤^;¼vx-{Ùln7£8Š£$„–ÐZ2}grÒDšHÓô±×c¯Ç^4LÃ4 0ß6ß6ßZ¯´^i½èëëýýýÀÚ™kg® xgygyg½à_ÜZÜZ èbt1ºÀkÂkÂkÀ<À:è ƒœn¦›éfgpgHÏùsþœ?+µ.±.±.!aÂ&a“° |ŸÇç!ˆ nnn¦VN­œZ \ýêêWW¿zЃz¢'zÐ4šFÓ€@g 3Ð Lš:4u¨–ª¥j èéïéïéôz½^¯h­£uÓ€ÌUÎÖjkµµ¢‡ÆÒXËJqÄÿˆÿÇ`ú›éo¦¿)}ÞÜÞÜÞÜþ¼Ñ!:DÆZR[R[R1:ctÆóY̳ÅÌXº9Ýœnfì—¦_š~ibÌì0;ÌƆƒ†ƒ†ƒžû[}¬>VÆö[÷[÷[kV4+šÏóu}ØõaׇŒXw`Ýulgæ—™_f~é¤0Âcæ9ÞÄ›xɨ»Sw§îލ·³³ƒR–(K”%ÂZYY 4ô4ô4ô<—ÄÓWž¾òô€¿À_à/ŠÇŠÇŠÇ@±½Ø^lnùÜò¹åó‚ÿú§ëŸ®¸ûÜ}î> Ü£Ü£Ü»ë´òGß}ô•"I7é&ÝÈ'"‰ø­ÉŸŸ??>0xsðæàÍÂÿ³í´í´íÜ\\\/¦¥Œ¤Œ¤Œp9¡¡¡°×ú]ëw­ËŽÈŽÈŽ¢FÔˆ Ün 7 ö{‚híhíhíJµ¥ÚR- ;&;&;ˆ>¢è„7„7„7€%Ô%Ô%Ô”ËåFi¢qQã¢ÆET©\¤\¤\Ô¶ÁYå¬rV-ý†úýÐï‡~Є&4ý[®lP6(¼¥///›“¼ª|Uùªr¶*Æ;Æ;Æ›\tãÑG7À¶ lØ¢IѤhR€Ùi³Óf§TMÕTý¼‚CžCžCž@@@ þTý©úS 01010w[î¶ÜmÁ? Õ…êB5~Tª•j¥zê]Æ1ŽqáÿÀ<Ìüû;9ƒ·ÁÛàÍ5“BRH -ë¡€Š»ëdWeWeW·.ùÍò›å7 kž¹yææ™›‰5ðtàéÀÓœÅÍâfqù¦û¦û¦Ä@ Ä€ÀFlÄF@ÕªjUµþ¥þ¥þ¥€_ž_ž_¬ÖϬŸY?ƒWÑHÑHшÐ(F‰Qbår¹‡éçhDÿ‹ã8Žã|€kÌ#žÍü’KrIîõÝt]AWì­ÄÇøÓoª–W-¯Z.ìóóó‡’¤’T’ «´_Ú/í|ä؆mØàWüŠ_VËjY- i%­¤Ö¢ºº¤º¤ºDLíííçså^r/¹WqöÜœ¹9ss¾¾†Ld"“ü]èB—°Ú=ªÐ‡>ô ÷ŠT¤’ÊЊЊЊœ÷=·ynóÜVœ=99É•™ÊLe&1ÍÌ!sÈØÁ`“˜à OxØŽíØFëi=­‡üv÷íîÛÝlU“ªIÕ¤ârT •B¥x8å(q”8Jö}~/ó^æ½L€u³nÖ ÷cø½tµ–H^’—äŸ;Üùã΀#Õ‘êHÝ÷¹ÊWå«ò}PÒQÕQÕQÅåÔ|PóAÍlÙMv“ÝK…R¡TöL:³0 ³D 0ù¸ûq÷ãn×.¬]X»>ªÕ€j–HK¤%û>§'è zâá=GÏÑs\î3¶núä½ë—DîÚºZÄå µ¨ÓH$‰$‘«ÞöËqíŠs—s—s—´'QJ”%ºbÁ‰'œ@œd–Ì’J:Σó`2„ !òÓÁ§ƒO‹s–,XÊuz.ô\è¹0gÙ³‡fo£T H|®«³»;– «»¢p˜ÖK»i.íæ’Sä9u½‚¨öV"ÉH¦ßT9«œUNa×ØÙ±³cg¡¤”RJaqW¢n²n²nRšxXð°àa×éyÐó çÁ{Wíýö~{ÿÁ¯;×t®é\¸õî÷©ÐÍ7 ú°ÛAé ð³K»WBËCËCËsÞ÷Üá¹ÃsGqö¨ÿ¨ÿ¨??vÉtÉtÉ$¦¹iŸv¿v¿v?œohnhnh&›”f¥Yi$½¤—ô{nñùüÆÉåAAAtÄ•ïß]ëäË\þÄ¢¢¢¢¢¢ ¸¶í̃y0òŸo ¼1ð¾___ÿ— ’Ƀ¾Z=´zhµ_ùØý±ûc÷ÙßùþÎ÷w¾ßwŽ;Ç\ªl…l…lŰ³ì,;û?W!‡r®#Áˆôš»®B /óü…ý‰v³PƒÔˆ™¬’U²Ê¨.z™^¦— šzo꽩÷¤7d²Y½Ï%sÉ\rýÍàËÁ—ƒ/ÿ=ª»«»«»‹ü¯ôªôªô*ûÖ·Ê8ñga/i×õº3±»±›o!I$‰$Ýf5¬†Õ¤oUÌVÌV̦÷¹>®ëëŸ-}!}!}±ëóóóà ‚\ñ܃åä_qü?š~W.ß%FIEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-locate.png 644 233 144 1035 12610450011 16413 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ö¼©(l„ªµUk?²\ËË…ÿù¡öóÚÏ>kÿ¬=0zuô*ÀtÑtDl#näõÞB|9ø¿,úbѦaˆ‰Ô—R_ÊøM(áv”—–—üýs´F@`H A‹.Œ3±À6âá|£ÞÀ3ð >ƒ?Ô€u“u“T¼Qñ†åãPÁ÷…)R >ßà‡H¿Ëïl lÅzE¯`ÂÛˆùF½gà|¨ŸÈ(çDDþ\•ŽJoøìþß*ß*Ð4ÿ þð…;Uݨyšþÿú‡ýàõZ¯õDÎÆhipÖŸèOÄçŸò=å{ tk*T>¦ ~c”—EDV‹Ëâr™5è°;ìÀx Ô¦6æø#Œ€Ócz XÏzÖ/hĆ J*©·Né”N¿ç‡t“nbŽâ0~r˜/ÌÏßCýc""§¾QvVì¬0à‚ëF®—_/‡£G_<ú"zëÔ­–[-B‡ÍasØ eY˲–e0<8<8<‰]AW0r÷Ø?°`?œ(8±æÄôÎõ>øáƒŸï\½sµ1ÚSßHàŸ""ÿ~º:»:᥷“o'kÍÒ?>ñÜÏá©Ø^QYQ »3vgì†kÍך¯5C~K~K~ Ø<6ÍY½Y½Y½àÜàÜàܰ ¡¦¦&H¯M¯M¯…ü“ùGòÀ¯vdÆdÆàùåµùó+´:w õ#Áìøûñ÷õ<Ì~9û%ô{c{cá·ÅïZÞµÀÅò‹eË 8®8®8öžÝ{vïY(œ/œ/œ4ëÉõäzàd×É®“]³µÙÚl…‚‘‚‘‚‘ˆ?gb]׺.h¹Ùv§í€÷kï×àÄ]Ž»¬çÍQý1+cV²F,îŸÜ?™äew¡§Ð#“y³÷dï믓ªž­zVĻ֛íÍ ôúý" i i i"’/ù’/’؞؞Ø.âËñåøräá)((9Óp¦áLƒHYrYrY²È`ïৃŸŠ,úÑ\m®–I™Žnˆn«É½"zk¢‚Oz¿õ~k÷’—|(rìR«½Õ.Ö*ÕPÕÈ¥}—ö]Ú'âíðvx;Dœ}Î>gŸÈôÌôÌôŒÈXëXëX«Èìøìøì¸Hz[z[z›Èü¹ùsóçDÆÝãîq·H¦fj¦Šl>¸ùýÍï‹,Ó$G’C$}8㽌÷Ä*â~ÇýŽˆü¢­Újc¦Ð¹±s#Ümp—¸K´fýËÙcÙcx–¿½üÍåoBewewe7¸n¸n¸n@MLMLM ÄçÅçÅçAScScS#Œž==zl=¶[ô§õ§õ§AiIiIi ¤d¥<ò4x«>¾>Oxwk¸Ùaï°¿ ß1c øÛ.ó.sdK¼š/š/‚{ÑÎYç, †lÝDp"8“öIû¤´QµÔªVµÂDÝDÝDh¯öj/x¿òöx{À™ã,t¢êö?ï>ÂÇô®»vÁðVrñû*¤+úñCÛ®Û™ÓÕš«¹ ÕZ­Õ Yš¥Y ôê°ÖÃÀ6¶±m¾-%ÐWµNë‚÷‚÷˜Ó•aü·3Ž‹Óât™ùÑÐ1Cù=†òn‰Þ ì)³vûïûïm»»å§‹N:Aÿ¥ßéw@7ÝtSL2 :¨}Úþ{‚ò—Àp`Ÿ^õ;ýNàš¡ü[Ì[Ì€ïQå|ÿ•íëâ±}=ž/ØÿúýT¿úIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-70-grey.png 644 233 144 6167 13755454064 16007 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ,IDATXÃ…—{T”ÕúÇ¿ûw.ÌŒŒ $2q14b­ÌÄZ.ô,ñp”üåRr ­ÊÊŠV?@­)GÈX’ –J\ä:j¬¸Êe`¸ ̼³÷ïgà,×jõü³×¾¼Ïþ콿{?ÏK222222à‚Ç6ú¸à"ø‡üCþ!«Ìø&㛌o˜{Ö@Ö@ÖÀÆæÊ\™ëÇ<Á#dÏLùLùL9;†38ƒ3$ þð‡?€v´£ÀìÁvL#‘Æ4¾ïãûîž!Fb$Æ¿dºeºeºU·d'f'f'’~Á[ð¼ÉK9èM;— 7 †0„qE4‹fÑ,zÓ2i™´L>¥ÍÒgé³ôE]–~K¿¥¿êöÔÊ©•S+CÞQä*r¹¨‰‰‰&i¡âPq¨Ъµj­pÔýŽñŽïþfýÛçsÌïàqðñö g*¦b*š@v“Ýd·w®È[ä-ò¾qvòÂä…É KÕó«æWͯ²Šnnnç¬ÍÍÍäeiš4Mš†)ÁS˜Â€]Ø…]aajÆsÆsÆ/7×4×4×0ëuÿëþ×ýé¡áMÛ†7½ù™Ü[î-÷^+³í¶í¶íÞË’XKz˜@@@À…“£ÓG§N¨A j<çñå|9_^Sl1[ÌóÒÍšç5ÏkžÂâÞŠ{+î-¾ÈÅäbr1AƒX€˜/óe¾àÑtPB %€ L`€üàNÒI:!`C?ªUªð ôóÒÏK?üôà§?ñ·$N'‰ÓoW…!Fˆ‰ŒG$"Ù=Î9Õ9Õ9Õbw±»ØýÃO]º:uuéfÍ+šW4¯/'%&%&%ò·œ÷9ïsÞ‡B­P+Ôô(=J‚G/zÑ °6ÀT£Õ&Ãd ¿‘ßÈo}‘¾H_o‹·ÅÛâççç,pø×Äjb5±ÂËŽù<>’U™U™Uù’ÖRg©³Ô]­SMª&U“Ì'¹%¹%¹…Ô¹\q¹âr313AETDET(((8X` AB€$ °KcÖh<§ñWÌsÅ0îÝ7º4^þ¼üy,Ôälr69ƒ$T* ÝÊ3æÏüß‹µ*¬ «ÐÅèbt1ˆvqqÄúµõkë×wDtDtDTKµT @=ôŠP„" h@ Þ£Þ£Þ,nZÜ´¸ QŒ(FÀCÝCÝC0_;_;_ ,]¿týÒõ³'£rùÒåK—/1¥‹ÖEë¢]šUšUšˆ=ÅžbÏ÷byÁGð|V'»–¸–¸–àXÀø€øs—¸KÜ¥Ù•Iq ·pkNS¼+ïÊ»²pY¸,0¾k|×ø.ðƒæÍ`“ï&ßM¾sãúúú€e»–íZ¶k®ý™wžyç™wq½¸^\tWuWuWáI“r;¸ÜùÈG>ñçD"‘»lZeZeZ…ûBª*¤BD®‘kä QˆB€Y™•Yçrî»Ýw»ïÆ.744XŽåX³-Îg‹ˆ@"CÖ!ëhðhðhðÂ:Â:Â:æ@dͲfY3 þYý³úg`¼~¼~¼~®Ÿ»ËÝåî,¥³t€ä‘¼Ù˜ ñ†xC<`è1ôzð©ì¾ì¾ì¾Ã!qˆË<Ãgð|I«VW««Õ6ÍèŠÑ£+ )D ‘&‡§&·&·&7@•¢JQ¥>U>U>U«gõ¬ á$œ„‹ébº˜wSï¦ÞMmJnJnJ„ÂNa'àîîŽ{·¼¢¤¢¤¢„†1þ—؈ØÎJ8÷Ýtÿñ£t‰N¢“è.tk‡µÃZÑƒÒØÒØÒXÛA»•½œi h h <>ôøÐãC€[Á­àVl+ÛʶÎmÜ¿qÿÆý€å¤å¤å$pìú±ëÇ®úqý¸~Ðõèzt=` »v-ì‚´LY¦,SÒ©žï{¾ïùž»%9!9!9Ñoí²vY»YE+לּ³ò@ki-­½­‘¹ÉÜdnÛ›úÎöí;«>bs·¹ÛÜÙzŸŸŸ’¤ôSú)ýÀ‚ ƒ ƒ A”;”;”;r‡Ü!w´¢­€S¬S¬S,ðœþ9ýszÀåœË9—sÀºëN¬;hïiïiïÁܘۘۘ‹W+ò+ò+òÉ_ä‹ä‹ä‹¦7±%l [²é.…KáRú¢xî w†;#ªCªPÕJÃh Ûý…¼WÞ+zúšúšz¶Üó²çeÏËäb`q`q`1b˜–i™òÙ˜n¿tA€m؆m€r‹r‹r 222 }èƒÉTn*7•CU±®b]Å:A#KÄ12HÉ`:ÅlÁ–Ö¿±–ÃrxO{šg }œ7òï‘\’KrLá"¹H.òP9’‘Œdî´~Z?­ŸöOOOBNÞ'ï“÷ašÍ?€¾Ãwø@*R‘ P)•Ré¬UWO]=uõ”í ±ÔXj,åOIݤnR·‹Ù~Ÿú}ê÷ég7‰Ld’bt¢ÂG>ª@ºÐ%´àà)(((ÏÙ&Û)Û)Ûy1۸ƸƸ†-“”IÊ$sÚµßÞ4£ͬ°â¿ž1ffffã*¸ ®ÒZC­¡ÖÀÖÿ2ñËÄ/¢…R¡T(»§-Å–bKñáZ2[2[2f`f€³ÝM¡tÊ^^¢Jª¤J87ô6ô6ô–––‡?R¸*\®/µëÛõízQNåk•¯U¾ÆÖ“’BR ¥çéyz Np‚ÀÆØ›}Ö̃†Aà«‚«‚«‚á¬èWô+úºŠ®¢«ÄçŽsÇ»§íRÅÎÚýêí€SÄÁáOì íÚŸ [&R‚þ.I$‰$ñß¾¬’U²Ê¿ïròròròâZE]¢.QWý˜~L?ÞÛÛßß<„ÝŸ#±4ÿÇÿƒP ò M>³IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-29.0.png 644 233 144 3057 13755454067 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜäIDATHÇÍ–ïOTWÇŸD¦Œ"‚]5ȶ‚ YByGqQ£¸@¥!M$Ò ›ºk}AŒZL×þ0 lÖ¶ Ù’à M,J¶­šµ[éB"Âfa´ C5³ÎÎË=Ÿ}1s½lÿÏ››ïóãû}rÏyžsDDdMì+·)nSÜê(Žk4íI;’vüòÏQܵ–W,¯Ü9 )gSΤ~œú±>abÃoÄ/Ï1ù—ëvY#¦aeßÊ>Ky ¿ uŽ:GÒº(~÷Xû­ýO4hú¼és€ËŸ^þ”ßÁƒ›nüTþS9˜ØðñF¾Á·œ_Þþ™¾¬øbÅ–X™¸2QìÛì۲ߊü U•U•³ñ³ñ*–¼€ ›*üø1ÖÂ2løcñF¾Ágðz†~´ô—Ó_š×j^³^Œ&Lô@kFk†¡éÚiÇš_ó,í]ÚKÔ5u 0±á7â|ƒÏà7ô ýh=æVúDDÞ«€ÚÅÚEPë"7´ñÈó‘çA¿™ŽL‰UªôEýGýGÐ|šWó‚jTªsÍ3ÇÜS¤Ô6íuíu"Ú¿#É‘dPÍQ~¨õ×úECߨÊ!‘-`õ[ýþ囼1yØÀ.PEªˆC|ÅW {u¯îúè£oY!TP¤’Jê2{Yd¿ “LU­ª ã1¦ÓçÑzb¬ëkåvZœƒMÿÕ½Œ»wïÞ…3)ð¨ÛÛoo¿½ÝÔ­­­‡Î‚΂Θ™™1ýú1ý˜~ÌÄ÷OÜ?qÿœ[{.î\jfbêý©÷M=õÈYê,5¶¶ëkÑ‹DDF\0Ð=Ð w¾ô¼ãyGíßØØµ±‹PÙÊœeNșșș€ Î Î NÈ?œ8ÿ0”æ•æ•æAnKnKn Ì6Ì6Ì6˜y­^«× EùEùEùPà.¸\p6g×g×ò®Ñf´µ.¿tÔo¢õÈÒ?“Ï$ŸQ}B0`LLƒÖƒ®bW±)P–\–\– Ž­Ž­Ž­PÝ\Ý\Ýlú ƒ…Á tê8ÔqÈ´w?î~ÜýJö”ì)ÙcÚ‹‹®] ŽO^úä%€ðñðqXZõÜÈs#ª/!>?±-±<޾ |k‘šÿîòíò‰ïÅúìÙ;$Ý1ç˜s̉dgg‹ôºz]½.‘†¬†¬†,‘Ê£•G+ŠŒ‹$\L¸˜pQž®pr89œ,bë±õØzLûêK«GWŠ¿ :‚ñ‰$îNÜ-éòŸøòøròâÔ_´}Ú>˸åôŠÓ+N‹ÜùãäÙɳ’þë¿vv‰ÔåÖåÔåˆ ƒƒA‘ˆdÕdÕdÕˆT9«œUN‘´Å´Å´Eû=û=û=‘°;ì»Eì×í×í×E<==E~»°{a·ˆ?â÷‹llîØÜ!é"ïߋȿT§ê´Œ‹–fœ1wž;þôYk«ÚwSD„PqSñÞâ½°öäÚ“kOÂù±ócçÇ ¶µ¶µ¶ևׇׇ¡ÍÕæjsÁü†ù ó`KÉ–’-%074747MíMíMí`[cK´%‘߻R]©„bÓd?ôæôæoÅÎïF»Þ<òæjÑ.™ÿ»gØ3 žxO¦'åyÁ“éÉ„PK¨%Ô‘È@dN>œ|8 œâ§@ŸÒ§ô)Xp/¸Ü 7è z(·º¢®€ïªï;ßw(}>’É5»ß7¼è±®Œ¶§9ÇÀ˜+±9TÕFO-ëXÇ:P;ÕNµÓ<ÌÊ®ìÊ4ÒÈòAÛÌ€îSI* @¥¨êTŒ¿irfrÀê³úü üðs̸Þ«àd­«Öª':™Õ7K¶%¨Ï´GÚ#"|Ä-n¡øˆùÔ5uU]Æc ð2Ï<¨ 5¦Æ€Ѻù›¾J_EDÝÖžhO€~cò¿šðjþùävïÊgöuñ̾ǞÍìÿß[èæ¦†¢aIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-185.png 644 233 144 2772 13755454065 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܯIDATHÇÍ–íOTgÆï™Á&‹k HÙÅÐ%Í’ »‰_PtK:¡(7â"‰Õ&Æ’ýRK¶a“U»‹k 1+M6k )¥TMJ•’4hV%ã m¡¨; ,LWÊœ—ç·f3Ýþž/'÷Ës]×sßç¹Ï# ""é±·€=Ûžm÷Dmûïâþä­É[~.j·`«²UýómH;•v `ùÙågÍ»qÛŠ[ù‰ëEâø‰|–_Ò%îpw·mˆÙï@õKÕ/%ÿ,jÿ)îwÏu¨ÿ¸þc€îº?à xôÅ£/f7Ìn€¸mÅ­|k½…—ˆ/ïü¿,ûtÙ§¶¯Áåt9E ·,·,ïP4á~Tz+½“ŽI‡²€RIU€0a¬çß ¶å[ë-< ßâ³ø£zV”®(Wk^­qÿ-ºàîßá­çßzÞâÓz€wy—TÐÃzÀ¨5jYPlØ n[q+ßZoáYøŸÅÕ#?îíñÍ(ŸÓçtmŒ cÌívM «y5²$›³æŒ9ú¸>®ƒúµ*Q%À4y ÆïQFaÄñ¡¿Õʵr ÜÂM{Mþã·RD¤à/èî ÷D8 î¥ßKúØn´\-—§t$¸Ô2Ô¢ZT‹@M4ÅýtÑEO>ù ~=ºYõ‚z§1ïv‡Üaw8œdé‰ kýŽ6fÌ"Õ¤5jqg|g*ÎTÀMïMïMoœo44 Á‰œ9'r 8œ NÆãÝeÝeÝepºòôÖÓ[¡m¸í»¶ïPÓ·ŸÜxrc©îEdíoÛßfµ¶õs{´n¯ôÊ›ë¿Yÿˆ,±½l:U¿ê—Hí—µWj¯ˆ­þ£ú¾ú>‘ð@x < òpóÃÍ7‹ì<¸óà΃"׆¯ _ÙÚÚ¹žz=õzªÈᵇ×^+r!çBþ…|‘!ûЃ¡b›¿ÞÞ/‘(¿íe^_?²~$ÖFy¥WÀsÅsEç¯S7¦nÄwùåó?ÌCç‹ݘݘÝWë®Ö]­ƒ±Œ±Œ± X™´2ie´ìkÙײÖ´®i]Ó -[.¶\Ï”gÊ3ÛVo[½m5´ÿ«ýqûã„ÿ*öþrÊœ2ÁÒcqT:*)”7œÙÎlùLDD¦—½ílw¶‹ÔÜ­«Éܘ¹1s£ˆæÒ\šKDÛ­íÖv‹DGÄ!2 DðàÁ#b6›Íf³ÈÞν{;Eüþ …ȱMÇÊŽ•‰üãH—¿Ë/"7£|fŠcÀ1 b鱋˜Ÿ˜ŸØîˆ¡{u¯ˆØDDd…¬•åѶFŸˆ1#¦ˆ«ØUì*¹]p»àvH^U^U^•HïýÞû½÷EœEÎ"g‘Èà¥ÁKƒ—D²2³2³2Evßu|×q‘U«¾]õ­È¬>;6;¶¿BÎjÓÚ´È’žèÇöÕè˜ë˜>Pu<§÷é},Z/ÝTº©tô/ô/ô/Ä;±%gKΖHIIê”ê”긵çÖž[{ $R)‰@Ú`Ú`Ú øÃþ'þ'°Ðù}ù÷循ã7……ÖÇÿÕ‘ŸžÊHì”Lèwô;ñS9wr®y®"'#'#'¦À:}¾B¡ŒPÅF±Qk]Z—Ö¡Õ¡ÜP.˜§Ì³†×ðb|LO|Žá~ä~N‚ 4–p·ƒé7ý<]š<–Ò5£f@%«d•œàoP ªÌsæ9ó¨?¨£êhBüz“ÞÄS²,ü{…÷ ÷¸{ü's,aòãsù\€¹4ùGQÀe0 ÑJ€@|òÓÊû¼겺¬.æ=ÞKØÁ饥\#ã€q`©žC¾$_’U©Mþgö_ùÌÞ.žÙûسyƒý‹SÖû¶ƒýCIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-44-red.png 644 233 144 4066 13755454064 15610 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜëIDATXíWLTW>÷½7üP„•ÆŠ2lQYu•`Œq×deÐfGI‹µ]h¡F²Ûí"Ú¡m↸H`ÙêF XÌdm£”ÐP%qÕ²-M6ºYk‚ÔÔ™Qg-a™Þ›ûíÌ}ófâlvÏ?pî9÷|ß=÷»çeˆfícÒÆDg¢3ÑÉ&" ) Ý Ý Ý[~¢hЦh×ÿDkh ­fü‰RH>ëó&‘/ö‹z¢~,ž´1–‘_5USµäˆ/\¡t+ÝJ·c„ícûØ>HZº?ÝŸîÇùâ;ÅwŠï;ì|°óP’_’_’õE\ä‹ý¢ž¨/ðžÍ‡¤ŸÅúKš¥1iLó¬ʬȬȬÐÞ·÷Ùûì}|NàQàQà2d1ŽqŒðÀ û‘¸ÈûE=Q?oIó³ù‘yžä•¼’×óQ ÿJþ•ü+êO]3®× \ˆÏå¹<ªV«Õjµ€¶V[«­4«fÕ¬?ùb¿¨'êë„cðÍótjÌÁÌA¤4( JCÛ ±ÁÒdi²4©Vؼ†×  ¶©Ÿ©ŸÜÃÁ`Z»§Ý^È „Å0ILFóÕ¶PS¨ à„“ÃɈdK“å€å€jø‚àG¦û¦û¦û?_'Ìõæzs=_æv»‡1*@µµ:­Q ðWù«€Ã8 £©‘¾Mbò‰ù·qÐ>Ëa9x_ðÑù)UJ•RuµAN”Ÿ(?QÎ)Tª]µCáîp·‘W¯§×]]Æu>ÊG |>|Þ¸¿÷ÛÞo````P1‡ |½³1üˆûÒW§¯N_¦‘-#[F¶º“…mØ  •ie1¯÷^fç4›ƒÆx¨+ÔõŒü@óhó(€,ý`~î‡*ðÁOýÃŽÃ;ïˆ^aPsi>ÍÀÇ_ä/Ýo»ß€ìòìr#Qûû<Ážšÿ‰ý¾Ù,Í5m™¶DñÁOŠ<©¦"S‘©Hc‰T‰K¸DD Ø2N†’wKÞ%"ʹ–sˆ(i0iˆhbãD̘ûÃ~"¢’²’²'å¿~ODI‘ôÓ4@Q|S‡©ÃÔ¡?ù¢èòöyû¼}ä IS¾)Éò¯Ùkì5í‰äŽí}gï;DD©7So9.8.Íxg¼DD m mF¢U·«n¥ºR]1ùêŒJDÓI=I=Dô]dRžcÕ¬š"$Ùçñy|r ~$Y%«d‰ôŒ7}Z}jþ©ù $=¼õð$e'e-,€Õeu¯ré饧 á•†W ýÃô §2§Ò¯R6e@Öʬ•€Öy2÷dnïoG¾šøjBÿþŠå±<–73¤°a6̆wj6ðûßÖ«+ª+ /-Üz|ëqÙ½djÁÍ7i …57jnP*»ìñ&ª&ªˆˆ)éJ:ÑâäÅÉDD9S9SDD¶—m/=\÷pÑä[“oÑŒrV9KDÅ™¾L‘|þ¥£/¥éIâóø<šSýxßÁ}ù†HŸ¯JCÒ4ô©ŸRŠRŠRŠˆ”ËÊeår»Wø%–õ–õÚ~qÔ°Ÿág‚Sœ}üþø}cG[^oy=fœ®VWçh$t6?|²ù½æ÷f¿Pñ² eÂA/WÊ•rå­]³~²xõÂ2[Ly¦\S®ç”Ø`«µÙmv¾Y‡Ÿ?õùÔçà€ö‚ö€Àƒ_ @ÿžþ=1D3Ô !íKíKд@+ï\عî Ü@ðÏc]Ç»Žc›þ m”¥Æ©-l[ÄýØGPþ§þ¾ÊX++leí¬µ ­„ãìuö:{£ýÔökû£ýB!ƒÏc|3ßã xÛ½­ÞV +)knÖ\µJïd\'×Ù,:5+Yɪ˜£\ ¨€ ”:rƒD²Oöɾ÷ωæVs‹¹EMsä>è>ä›g¾™ùx)/5 bƒœ°Ãð]¼·! µÀ/®½1öƘ¶_ÔWÆ·âvÊØ›±7c/‘d‘,’…uFØ• šs#wÉwå»ò]Ö³¬fYͲ"S…©ÂTá<¤k·ÀR`)0j7l Û‚N8<Æc<ŽvR[®-×–Gû{lý±õÇÖóÍ¢ž)Í”fJóNÍúæ$Š1v1îê‰Å¹_Çúæ$Sž)Ï”çî4h·ÖVkÐnšš¦¦E …ÃáÁèØéG?úgrrr?/Ö5™"¥H)oŒ“bK¿Dzö‚|,N»ÅÏÓ®Ú«öª½QåNfLfLf«ü«ü«üÚt-vÈrÇÑ BjéÅL¥çX4Axšv˜˜¨iîvw»»]T~ÁÔÖcë±õDÇŽÒª´*­ý‘Ÿ$ÉìӜçŒ7±á͈vÏ>M»›¶oÚ¾i{T»Î Î Î 8=çúM°RVÊJ ÄÂHãpý—ö<ín”åF¹Ñ³V.­/­/­çÌÎÎVÿ¥_µOöÉ>[&µQµQdìÈî8¼Dú-^»‡býMß±Ýl7Û ÐVÚJ[Ã+¥ÅÒbi1Àˆ£¿~Ì f‰ä«òUù*»Ù¸+îæþo–¦ÿWDET¤Üˆ T.q‰K`ÙEvñß?œ]ÏqÆÝŒ+®îs¯ú?´È$iàºÅ~IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-25.7.png 644 233 144 3047 13755454067 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÜIDATHÇÍ–oLTWÆ_þ(L™ÁÑAQ‡MÓ6C-Yƒ&²ÉØHÇ-Ø´P›ªaM*è®m ,ÌöMj0è6¥DlÈVGvWEŒ"íÐv­Ö*‘JëØŒ»±"bq2¤ÃÌóÛ3×;Ýì—ýæùrïsÞ÷}ž7çÜûœ# ""§ž™ 3fæ'qf½1ŸëÊu-þ[wiñrÆËßþ f}8ëC€‚ >N\7°×óÓëE þt=}^c"§7§7cU ·Â«¥¯–æÎIâö³`ò˜<‘8¼qâÇ?Àïaüëñ¯¿ ¬Çõ|½^çKç—ÖÿÒý3ú3þ93sfŠ€­ÒVißžLøÞ/V½XðCÖY*´»€³Z„ £É4¬ÇSùz½Î§óëzº~²Bg¡S^zí¥×LI\ïæÍ t½˜x÷0C<hµDAUgÈ  ¬Çõ|½^çÓùu=]?Ù±•÷DDv¯†ÚŸjU;͎͆„?Ž…‰ño”¶CkÖšA{Z{J{ ´MÚ&mð*¨x¸‚¨OTPQZÖtÑt1mC¬;Ö ñé$¿Z_3¯fžÞàîÕÆV~*"òä` ›ÂáluÏwÞwø/€ªPLñg:éuM]S× a¦™fšÿc(»²3•/@J/¥ŸlìɲÅ%"òVŸÖͪ›e‰g¬yB=¡T™ïcccc™#g››g¶ó¶ó¶HY^Y^Yžˆ§ÝÓîi¹3pgà΀Hö®ì]Ù»DjöÔì©Ù#Rx¤ðHá‘[Ko-½µTdÀ<0c`†HîISÀ“iQ–ÊRrzéd¥»Ò­Êm¶o¶[âê›Né”·¾’įED†› o_ß>øÖh ´©×NÍïšßEÔù¦³ÞYv‹Ýb·@ÿPÿPÿ”„KÂ%a¨ŠVE«¢Pw¹îrÝe¸yõæÕ›Wõ9::‚ëV¬[±ª/T^ýùÃ(Ú=zÜ}Ü­^‡þPâ§“ýˆ6’÷~Þûª¦¢SQè3ž}z64¿Ù´¬i™!Pî.w—»a}ÇúŽõ`µŽZGÁÕçêsõÁþÈþÈþˆ‘ŸØ™Ø™Ø Ú°6¬ óîb÷<÷<¨ýkͶšmi;//ÞÍ.ÿ9Õ+Ä L¦Ä˜úãÝ w7¿ýß=ÿÝóà°:¬+¬u­u­u׿µymÐàhp48àPÏ¡žC=`sØ6®?\¸>M0‡r t4t4tJ%’|õô¹Âs…†^âÄDçD'@¥À’“Ä!óóÕ Áƒ?ÂhÛŽð˜5ןë‡ÖÏZ[Sî†SžSžShyÐò å¡¿\-WËtx;¼^˜<8ypò ßkÞkÞk†•Ϭ,]Yš¶²þÔËñ¼ñ<`:ß›ïU½™ê‘"\r ¹D./º~ûúm6G=ÑÅÑÅ2}ê·''"s¶ÏÙ>g»ˆ/è ú‚"Ãæaó°YÄRi©´TŠ8bŽ˜#&RÝVÝVÝ&Rá­ðVxE"‘ÆH£È…Æ Eª—TW‹>¦ù•ˆ›Åö¥ÿK¿ˆÌ »Â®‘KB»ˆH×9hhihŸã‰g'.ƒÈ , ,B–J¥uFQ'h ZƒÖÇ&ŽMKš€²ƒš«æª¹0¹urëäVP~åW~---€©/¦|S>$ÞN¼ &õÐ¶ìØ²C÷³®s¢û†á#º¯¤|&¢¬ÊúÐwPWÔuÔµF­Is§%j‰ZSLqÚ7ö3!Bix›6¤ ýÂÇ4Ÿ`7>&¿<Õw¯æÝÚ¦Ú&P=)g¾¤™53¨¿Çƒñ 1öq‘‹(ÐM7¨OÔ€[Ïò±ü¬Þóyˆ_íÏù”áGø‘žtÖ¡Ye³Êf•©»OÝ[Ïò±üpT}Çkä¹F"±R¬+ë¿c œ^§×éUÜØ^½N¯C@©?=~Ð{”Ê !õ zPŒb[Çx Yߣ>QŸJ}°=Øè{õ½6™Õcõã#Û}Û}Ûý‚%l‚£ÂQá¨Ðçúú}ݾn EòÔ#Êeè¿è¿f ãSîêwe(|ï@õª^ý¤~Òœ­Q?Q?1Ü€¯ß×ïëÇ«Ïx >q›¸MÜÖQÉjKkß«}Oÿ ’@VÇŸŽ?µð‡öí€óç àÒ+—^€àà +¸&h‚Õ¿Rt¥@°âHÅ3ª4†.….®\[Z[Z[ª`t6ŠtbJbJb ¼yΧ™Éì›Ü~pf4û#÷‰û€ð=¹Çs¶c;ŒÝ» mWÛ®À¼ó€k¦k¦eG’ÕêF³Þ@Þ@Þ@Àxýý꣫®>j~™Úz5ô*? mþxóǰ@Z Y;õsÆÏ`÷ÛýpûóÛŸ@{I{‰õCØÏ·3ßδ,÷k µ…€Ú­^W¯›õã#GjÍesÙ\Æ‹£-B»ÐNDa¡;SïL%"z­üµr"¢â©ÅS‰ˆ”Ê"¢«Þ«^"¢ŒcLjˆÆ0†;óDD®]? ¤¤[.š‰¤“ND'è,%¢ r’“âlM¶&[“qäÙýª—,«YV³¬÷žrr¿Üàbø„`óð¤áIöN{'Lþbò°ö­µoÀ’•KV@¼7Þ ]v}ˆgX¾œ/@¦;Ó  «‘F€ž¦Oѧ@g³³¦eMËš†{Œx7ïæÝã}‘€÷³g¾:ó•EC·B·`ö­Ù·÷ôí鳿æ}CßÀñŽãϭϯ dg›QõB¨;ÔmÖ»^}½úzµñþŽKãÒ¸´ñ>2„ !c;eɯ&¿”ü’:Ç·ö®|W6iôÜw޽s ^_ûúZÀüö„¹˜/ô]è{hAeA%9Ç‘ãð&‹kµÊ}²HÙŸ²?e¿f<Âtaº0ýä%¸\ ."ñ†xC¼ÑÐk\øE¹«rW©»ŒtžŸ ~*@ÒË£/cIiki+„~ýÚYí¬µñ+i%ZqyÅe@;‘VÄÊþV&•Išln¶[þ±.ìÇû)Úf°¥ÙÒli=gØOùî5»×è¹Æý1í¡øP„œSÏ©­[/€"+²µƒúj}µE‹hsµ¹µôËÂ/ Í­>?Ò0Ø0ˆ7'´Š¯â«žæq3¸܌ߜŠîçk·ÛðF×À5p L+ÚV©UÊ–²Á.&YÝ¥-ÒY¸‚úV}+`VX{… ‚€ž«¿¯¿oö··¡·®·Hž˜<9y²²Íèä!ápÈã4ÐÜä&·è0Y³)›²ÅCÔHÔH$ø…>¡o÷eãi­s”;Ê»oŸo‰o‰U»ãòx¸“çpÎ(ã!ЉN@_§ÎSç™ý]k}×ú.u—ñŠ#âˆt8i{Òö¤íD¼“wòNîB„®”aNŽü\'Üî ÷¸–¹{æî™»‡ÈVf+³•I‡ íf;³ÙVíj̓ $H bƒ–S=_¯Î7û[³´fiÍR=×xËí6»ÍÞû4ò×ÒÄèæ®Ål=q1î×ѾcbX»¾ ¦v=åžr‹víŠ]±›@Ú#í‘öÈÔbg¸±R|g|g|§^hh2OàÞ=#Å1|qôü€P£ÝÂgh·Uj5µ«´*­J«©Ï±¤±¤±$`Ñð¢áEÃêP?ò%—-îoÝßê*¸ô?è€ó›Îo€k…× @¶ÈÀq×#õvôvÀm_´pµ7·7’È9\ׂǫòªrªrÔ´ à#Õµ,jYÔ2ÎÎÎ<ÄCȈãß|É~ÉxÏ=Ìœ˜9¡÷ß‹~/ZØÓÛÓ sKæ–@øíðÛºxgÑ­¢[€–ßkòpÖpØpÀy8=¾é䦓›Nú¿Lé“7Ê8øPÊŠ”’¢Ï}eèÊx¸~¸r s  qGâ}ü׫¾^¥‹w<øôÁ§€Ò<Îy8Ÿà;R‹ ™†LC¦vÆBhKciD4‹šqhÑâÅDDMÅMÅDD’/$%×&×M3O3ÝO¿ŸNDdZdZ¤¿Y²>Ïúœˆˆº©›ˆ¦ôû£DTpý„ †íÈ/öâÊ@ç@ç@'õ¹—àHÿ Îçèw(@šnšnÅ~û%Qå–Ê-DD-®QÔ†¨ DD“Ò¤DDôãáÅÞ½¯gðÔzj‰hŠ’(‰ˆz'˜üHhò‚ø‚D‡ÝawØ©ó‘`L‚ÉýÜ·ÅÇ.Õxj<: LŸˆ›ˆ€ÚÊÚJ.Û9Û9}—²²õ­¯ÝQ»’¯'_€âÒâR½ G¾ù èCúP.ׄՄù뵺Þu½K{ÏXKp?'1YL“VðS7טhLTæÙ~ûtËÓ- ÷Š"2#2#2‰¤›ÒMéfý€vág§¯J_¥ìåù=æšÅ5‹á‚ÕW`œ%±$=`ÞÕ<=ž,|²fEÍŠàœE³À+émémÀsî“ÕŸ¬önþݼ¤¼$ϸ¸KÜ%îúGŽ×uP Åž1$ ö¾À\²¯m_›ºVëÜÏ»—v/… \Øya'gÛ¶; D(€«Ð»++àüÝów%¯ƒu0ÿþ^µ,°,ðî/ TBÅd›Íf³ÙKªƒÅ{ÚùÚζ±mëβzÖÀ¸V<´¶ZXÀªiw¯g‰g‰HÝ­î|†Ï¨ê=õ༨kÕê -Ú9Pß?Ø?ÄM76›äm'KŃâAs††f"™$£Ÿ5Ò(M*% YÈB$:Ägâ³}MÚÓzÖ¸Á¸AŽ´è»ØwÑ_P]ë–ÝÞ§ô".ê´;îûµªo©ojŽ»ßÝ_¸íζ­Û¶*{µhLz!½°‰)Œ)Œ)$2„ !ƒ]öÑåqÌpßoŽøD|">aÍó÷Ïß??‘!ßoÈ·Ñ´›–‘–‘¦×®Çì1Ã+¬°x‰—xéßhe‘²HYä×âé•§Wž^©®åù ‘†HCäÀ¤×7Nì4k j=± ·#Ð7N÷j×vÙ¯]s‰¹D§ÝH9RŽôy=ƒžA¿{ЃÀÚÚÚ£nÖ4!Dï ’â™ ¾zý€xZ§ÝílûºÍ¬žÕ³z½v­­ÖV¿våV¹Unõ+w"f"f"X:²td鈲PÓbƒØ 6ü9…KÍ'½`ÀŸÑÌÀøµë:íž2ž2ž’#mõ¶z[=\pa„“š›ÍÍæfÿµ#•ÎJg{|ÿ’„ު맰7_ð¾O»ùOÚMߘ¾1}£_»ÖkŠ5µÞyUëËe¹,wÝÁÀ2ÂË ºŒþK{“v׈b…XaOäÀ¹e¹e¹eêŸâ§â§â§ä¿k­vˆÑaŽ¥:ª£:ò];¢-¨^ý¬Ý#~z/ÛÉv²­§õ´ÞóKaŽ0G˜0bÄèFGÜxÜxÜ8‘Ø%v‰]ìºoaNPçþo©ý•I™”)uNÈTAT€µ°ÖòÏ_xÇXƒ:Ó”÷­þ7_D.Ëçþ›IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-81-red.png 644 233 144 4142 13755454064 15604 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXíW}LTW?÷½7";J²YÔÁ¤ºZ?ÆnühäCgëH"M!´`uKפ‹ hZ·E*ům ]²4¶dvMJ•T˨`\»5Ñ„"ÌT°±€ƒ€ÌÌ{ó~ûsß¼™t5›ÝóÏpνçü~ïœß½7MÙLŠ0!-ÆãŒq²§¡@ü´æiÍÓš7¬’I‘”þFËi9-¦–Õ’H"‰û@¤¯Öðý<Ÿ×ãõ#ñ„´H>z~¥TJ¥‚#rýw/JÍR³Ôìð°2VÆÊ4"ÆÄÑÄÑÄQ\ÈîÉîÉîrûsûsûœôœôœô°Ï×ù~žÏëñúïÙ|HXé¿ð‰0.Œ ãîå¼Cs‹æÍ-RvÕ_«¿VM{4öhì"DxñOð€n¸Í­óý<Ÿ×ãõ#ñ^øäÙüÈ” €û"/ÞžÞžÞ.¯î ôúèCÈÔ5EM¬T(J ¬PV(+Ŧ؛έóý<Ÿ×ãõ5Âø¦s0sI‡¤CÒ¡ÆÛ<Á\cþÐü¡lÓˆíQ?V?ƘÜè·ûí€êtºø•Ê ÀqäðÀÀÊw+O•§€ÜèëðuêµEmÁßl®1טkdÇç|8?2Ü7Ü7Üßô¾ÁTeª2U© \îû®ûxª3¦ üøÐn ¡}J™Z؇}€[¸Êaå0€1õ3õ³ðn刲OÙ§¹c®a×°k9>ç£ñ“J¤©äæ!¾pªðTá©BõO¡^Ùè ôèøø~Lù165l€‹M›@þ^þ^O<8?8_ï_ȹÀWu¤êH8*;ü_û¿Ö\/Ç×:ÁÔ¡Äe‰Ë—¡Æ³Á³Á³ð #™sëŒÖ žO@B~B>0uÀkß¼öž˜÷œ÷´{Ú=°ðý…ï€eŽeŽn"ÉʛʛaÞŸóáü8ÑÃ[Žn9ºåhEéóçûó ñ5Ú«ËV—é ]±^±ê ÷6ö6ÀÕÒ«¥ú8ÿ}5íÕ4]úPpqp1 ô)—•Ëa|·óBGêEƒÅ`1X´3CÅt‡îÑoyÈzÝzˆ¨ÛØm$":u:‹ˆ¨N®“‰ˆ^Ê})—ˆ(qâ~"¢—k^®Ñ“4ß5ß%"òtz:uÍtRI%¢/è4ãš M†&íÈóûU-XU»ªvU-z'Ù$›dÎ*ÍJ3Tü‘ÞtõIMLMÃÃØØ±±üþN¶[ô·z­^H³¥ÙøBá‚$@MUÔ¨|wú¬ôYé³ÐËù‘`l‚-0 Ô|^Úp²á¤NÓ½×½×`æ½™÷øT¨Ðè¥ÿýÔwÔwàWÌÚhm §½žöz8ªœñ÷ùûÂx—]>vù˜öng©,•¥6̆Ùð†P‹÷Vž¯ì®ìÎwçýtí§k'NƥťÑ8ÖÇÜŽ¹MD1ƒ ~DDàcñ¼ãy‡ˆˆJ¨„ˆ(öAìúûÅ~" ˆb'e…¢yÒÒ䟠 ÷„›âJGJGJGÔ5¡¤¿ ƒÂ 0øù4Š·Ä[â-DÒéŠtÅ> ]ø9™og¾­ìÔ.›ò³¹gsáƒSL“xÙ vBßÉÍ1›c`Ò;é€àÃàC]CÇ6ÒFðxíùµçàÔªºèV‘³Èôr|±X,‹ïæMù±CQ_=÷SCª!Õênà å»öîÚ«®ÓîY½ïõ¾ørÉ—KŒ}÷Õw_€¼UÞªµjSõZD»¥Ý(…ßf›õßÇí#ölÖžÐj¡Z¨žÜÀf³Ùlö’úè±üK;_[Y+X_ÇìÌÉœ\+Á?;ÛÅŽb85íî . .Õñò©—ÔK€y˜§ï&1 ¨ëÔ·Ô·Âý°Ô ÔÉÓ“g$ÏK´NVŠ•be¹Y£f#Ù$S˜keP†TIrƒHŠwמÖ:ÓvÓvÙèz·Ï×ç ªë´§õNèzñ3~àDº5OY¨, ÷7ÿŸù=ù=ÊNíz"Kã΃I;’v$í Ì‚Y0³3!v…œæŒÐožØ+öн¬eÁî»ì&2Š E΃šv3Ìæ ½vƒåÁrøà„N#ÁˆîT/R)‹Âý­]Y»²v¥ºŽ×3 Fƒq`rÊ7Mœ4k>’,ʽ雦Oi×u&¬ÝòŠò v²Q6† F&o×Tc±]±]±]j¶¦Éx!^ˆc”?âCψµ:íne[×g3;³3»^»Î6g[X»r›Ü&·…•;‘4‘4‘,]:ºtTY¨i±Il›>^Ã¥’^4ÁßÐs,¼kwHÒi÷˜é˜é˜ltÙ]v—€>ø0Ê™–·”·”·„¯©Nª“êºBÿ’Äވ Å)îy£'¼Òî¹ÿ¤Ý̬̬̬°vkœkœkðÅÔºªM‚°V°þ/‘0ÂH.£ÿÒž§Ý4±Z¬«Ý+8Ⴊ‚ª‚*õxŠ?ÅŸâ—ïh£‡Ä¡ò¹ÔHÔH¡kGtEáÅÐÿhÑÚ=égÞcÛØ6¶ +YÉ\,ÌæsFŒ]ºšìMö&{‰Ä›âMñ&ûG(1/jrÿ73jYÈBéväò»…‚*¨‚ °VÖÊZÌ›ŠÿÞ5™¾¨ºÏõ¿¿NVãA¢Á’IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-28.6.png 644 233 144 3064 13755454067 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜéIDATHÇÍ–ÿOTWÆßA„a:,ÐíVÓ`ÙdÁxK©’t…¤VÒC¤—bh ¨4uƒ‰ FmÝHj,‚@"£+¦,( ¢ )­¶V7º-]˜2¶CdÁQaì+ÌÌ=ŸýaæzÙþž_&ï·çyrÏœçIŒü D-‹Zõ»pUnæ­¹ÖÜ?þ#7…Àò¦åÍ!¡1¡ éDÒ ý'36êFÿÂy!Ÿ‘—D1±±–u‘x>_ø¼õáø“Kw:îôL6ŸÙ| óÓÎOyn÷Þî˜\7¹ÌبýƼ·_öý†_w/î¶Ü„ؘØxîµç^Kùk¸á—È#ÿ €±Ec‹T„&;vµðãÇX¾±Qôóžoðüa=O½òÔ+"PPTP×ø©>Hþ Ùà œª©ÆAÐ*3ê’º€ ˜±Q7úyÏÀ7ø þ°s+Լ ŽûŽû –®]§Oƒ~50&Qªô}RŸ„à‚#ÁP+Ô µs3ÆØ£H©ÍÁÝÁÝ‚ý¤@èCa|pÜtÜü¿±•_Šˆ¤ÕCœ?ÎïV÷n\¹qx€XlæÛJÛJÛJA›Ö¦µi3Ÿñá 9/äÀáê#uGêæÏ†`ÈöµíkÕ!Áßÿ±ž•=+áD|—§Ë£Ê¢zED˜ËÜ—¹3s'$y’ ƒV«Õjµ0v~ìüØy(u–:K`›·MÙ¦à/®·ªÞªbîÁϪ :â:â@u†õŸ„OTTUTÁÃsáS2Þç=ç=ÞEÞg½Ï¢¼k¼«¼«à¡ç¡ç¡t»n×í0~tüèøQÐE]@UªJU ¾j_µ¯ôkú5ý¨vÕ®ÚÁ·Ë÷žï=Tèãù—ç_^p*Ý[S¶¦†Ût9b¦á+Ÿ™UKÕRf9多T“ ¬Êª¬æÖ¨4•¦Ò@ ªA5¸ÀÇ6âÀº_E«h•­²™Uá[%Oý÷Æ÷7¾ˆ{÷ÀÍ·ÿçcÆ Pó*sìpìÕvfõÏ=dÕœ NÀÉw|‡â Ÿñ¨õ…ú8ÎqŽSL2 Ê¥~P?wº9§Çê±Ôåà¯Á_#†óoŒÞ ÌýÖùß»ò±}]<¶ï±Çóû?Ÿâð ,y—UIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-37-red.png 644 233 144 4154 13755454064 15610 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü!IDATXí—mLTWÇϹ÷​¢|¨(3kÖ7¨K£ÃË©`ªIqMÅTdkêÛ&PÜ*…à[–F ƪE˜QšRW»†-R_ÚlÕ¨© Øaˆ²Ö@Ø™ûrþû9÷Þ™ìj6»ÏxÎsÎóüîyþç d¦‘ VY\—ÅEÿˆœÔ2©eRKÖ I•TI½s‚,%KÉR`"ÌjˆD$"qöY ŸÏ×ó|<p=aU0™¯ˆ‘"ÁŸ±@j‘Z¤ç -¦Å´X‰ŠŽŽÆ_Ö=X÷`Ý`ýãõ×?òìyö<»áó8ŸÏ×ó|ž?¸Þœ#/æ#Ö)BŸÐ'ôõ^â ìWíWíW•ßõÈ=rŒŒÅ³xE­P+Ô @MTÕD@ÍQsÔ“ˆóù|=ÏÇóëÀAõ­St4ê¤Nê$Dª’ª¤ª†»|£ÆQí¨Vrt°÷Y«‚GiðïöïX¯|_¾À¯þ þø ŸÐÐPËÔ2~5NX¯’¤$JÃxãx#ÀÞ×–kËááù5Ž2G™’ÃësÎGÂ…= {´:™O°VZ+­•l®ûW÷÷<äñ¨ä:¹ Càbì°Ãì0 %æq}~©Ø»ì]Ýõ¸uîþÏ­•ÖO­Ÿ²¹œGç“vH;¤7ªxàèæ£ï}‡½HàUœò·ò·¦ ¾ŽÇàÄÚkà’å’´\-ä3òh^Ò¼š › Àùó;>ç$ç$hêlêçSœªg÷Ý\7»n6{OßÙ >¢ã¢ã¢ãP3˜5˜5˜èD'Øø77õ6õç¦M3ûëW®_ ²"+ðê/¯þbŽ ¢ ÀäŽÉOŸÇÜúSOO=5Ç;/v^4Å•‹ß\üƈªçüWýWzí‡Ú¶ë-Ç6š@h‚ÜOÄeâ2qYY5?e¶ÙÖDk¢:ÇýûGo=z Ô~µ–q?â>”Œ”ŒÆ·ß^r{‰´9¼9Ü ºçòžËðJÙ+e¼Š]±0t\Œbø¼ðÊ^ˆ+‹+‹+Óô@œ!Îg{N"3#3#3 ‘®HW¤+}ú…Ÿ—özÚëª~#j¥'œ\\ /M¢IfÀ-[¶l9\M.J.ày3éÍ$€ßÌÚ19\7>·àVÁ­‚[šWÜ*n·þ}ÄÁO=·Øº°„°„°„Þ“|AiÅ®ö]í,'T¦ß]|w1pªðT!Oû­ö[ \W®›Y+kàûªæ«¸7íÞ4@Ýt¼M#MÃMÃÈÕŸÐj¡Z¨Ï¢3éL:sÑñ@ñ¶þ¤n¢éÆŒzÚHÏÒ³\+ÚvW›sžs\ºvK´EÚ"SIû€}È@†Yìt6…MÑ]O_c_s_3` ·Yle‡¾“{ŽâÞR‡Ž–CrHŽd5XSI*I•ö'q'!â€øD|²ëÏúÓZo]m]­D¹?ì9ÓsÆ(ÈÒù/ð… Ð <\j®š ° j¶š­Ÿul¼¹±mc›Z¢¿@£Ò¨4êÚ³3fgÌNB‡àô\€n3ÇüMàç±[ì»é…¹»çîž»›°‚°‚°×>]»©ŽTGªY»Z©V \pÁ`C2êùê|u¾±¿µËk—×.géú[Õ7øk)<¸Ó´5¤õ„†¸×‚}kø„vÝç í–V”V˜´¥D)QöT{ª×”· ]è\]]]l®ÉH!Rˆ|û!R¬ ᳈µ&ín¢›2ÖÑFÚHÍÚuµ¹Ú í*mJ›Òf(w,f,f,X<¼xxñ°úš®Å³âYñìŸR¸ÔÒ œJ^bÆžÀÐî€8`Òî!ë!ë!%ÊÝènt7ðÁ†9ié…Ò ¥ŒkGª—ê¥ú®À¿$ ©'“_j|ÁÛížÿOÚM[“¶&m¡]WŠ+Å•‚Óq¦w‚æÓ|šŸQ\F ©KÉi/Óî*±Z¬«{9p~e~e~%;ï÷Çû•{z«Äq 4–4Ò@׎è©g!ÿ£…jw_°ŸöÒBZl’M²µ…Â,a–0  „J._³ym^›—ñ†xC¼AÿX¸!¤sÿ7‹ÒË$™$Sºþp³À&0€¶ÒVÚúßNŒÏs…t¦'$ïK[ý/ã»å#âFÎIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-84-grey.png 644 233 144 6231 13755454064 16004 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü NIDATXÃ…—{PWÚÆŸsº‡¹p™ ^B#/e?p5‚h¬¨]Ç-£)ÊÄ1袆’|©`4°ä ?I¡ID4Y/«Ü‚€$˜˜e\/¥Áå2ˆ £ ŒÌÓÝgÿ`¿/U©œNõô9ïó›÷}ºÏÛ$----- :ŒëøDó|ßÁªÓN¥J;Ŧd<Êx”ñhyófÞÌû³·…©ÂTaê¼m£å£å£å, ÇqÇI*BŠP-hA €m؆m,K¯ŒWÆ“TþWþWþ×[ÇÉ ïç§ONŸœ>ùòÝ̄̄Ìb‚„ !ˆ¼:Î!]uqéè`4¢MÏHR†”!]ö›ŸQ‘Q‘Qq¦sÌ2f³ÔܴϵϵÏ÷ßî¹î¹î¹¨š·lÞ²yËHj¤"R©æûÌ÷™ïÈ×ò}y½¼_Ž7ߥ'ëË<2ïÊà"æÅ¼˜—´™l%[ÉÖ \.ˆ â‚~<1|zøôðé@ßßß1eY˲–e-Ô9«qVã¬F²J™ªLU¦ÂŽ½Ø‹½ÐÀ;ì¶` ¶˜†i˜û¨ÿ¨ÿ¨?V5šM&æü!ô‡ÐB¥”'¯Á'$”ž§çéù‰}JxÁkÂAÂW‡¯_ <ñ|âùĸ{;÷v.PW^W^W„x‡x‡x>Ù>Ù>ÙÏözxêᩇ€n½n½n=àmò6y›€1Ó˜iÌô2Ú‹^ô>Ó§oÐ7èŽáŽ‘PÊMå¦rSÙÛÛÛ´ ï ï ï‚£×éuzLÞ©íÕöj{G¸#Ü\ï¸Þq½h l l ÔÔÔu‘ºH]\ò¸äqÉðÔzj=µÀæí›·oÞ8-N‹Óð¾¼/ïûŒ“|G¾#ßMèq÷‡oßF; ¦Á4˜] ªªªBNûäöÉí“Ù…†™ 3f¤„”8µ Ô@éêÒÕ¥«¸®¸®¸. )')')H©M©M©Zßi}§õে?=üé!Pï[ï[ï <ízÚõ´ (m)m)mØçìsö9`ºaºaºÔ Ô Ô ô*½J¯Âa–Ì’YÌÝæns7²UíªvU»Ca€†ôã|ŸÆ§‘ÔËúËúËz1ØzÇzÇzÞÁ;xlŠ&E“¢ lll~– {¢=Ñžð•|%_ h5ƒšA`y÷òîåÝ@ˆ>D¢4ÙšlM6@“hM¼l^6/ +Ó•éÊ0ÊzY/녦ꥪ—ª^’¢‰™˜‰G‰HD"žp#Ggyt&ð¨öQí£ÚÂ_†·oÞþ†¿þŽþŽþޏg[˶–m-\NS^S^SFÏž`ÓÖM[7m8‘9ñÙrú;ýþÀ‡»?Üýán`mËÚ–µ-` ¿^øõ¯Aо/ú¾è{É^PP@5švM»¦ýßÎ gEÔ²ÿáþ‡û¨Cêž?¬x¤x¤xtU=T5T5Th\úÑÒ–~Ä–®œ»rîʹäJ¿Ø/ö‹`¿¨Qÿ¢ñèñèñè‚®] ºÐxOã©Cê:²—ì%{všf§»Ü]î.¼°ï…}/샽«©«©« )Ðh ´¨ÏüÈ+ŒcãæýaCؽí\¬g¬g¬'WO I!)|úg¨¡†úΫŠ2E™¢lË‚ÊÊJVïçáçáçAlxq²×d¯É^PøÄùÄùÄäcò1ùÀ<À€¬"«È*€¬#ëÈ:€D’H øíðÛá·6çççxÖÖÖ 7Äh1ZŒ¦«¸an˜~¿±ˆEìÅÃÈB²xW›'FŽ÷üßÈar˜¾’D—Ð%tIJ9‘ˆDz¤ò«Ê¯*¿vX—[—[—CC’I2I†MÚ%í’vMœåÏŽÒŒ`@Ð0á€Qù$ªÌªÌªÌ÷ 86pŒ?ì6ÍmšÛ´s™3²fdÍÈ:ô#Ò‘Žtò´¡ mBœÜº£èî"ÉH&åeee9kUF•Qe<—966Æ[‹ ņbƒ¸G$$‚D`t¢krÀTP,ŠE±(0üŒŸñ3”×Ì×Ì×ÌliýÙú³õg¹w›»ÍÝÖ5â,s–9ËÞûônúÝô»é3333CëÒ9)ƒÚ]óyÉCò< mèièièÆ’Ç’Ç’ßûÔÝÛÝÛÝ»ã|KEKEK—S½¡zCõ¶”$‘$’¥T(J…`ãÖØSö”=ˆ@"ÀÑkî5÷šq®fNÍœš9к[Ü-î@Z -¼÷)=HÒƒ]#ãÍwx‡½*D®‰ë“DùÿKÄå 5¨÷hM¢—®ÿäø±Ì¹Ã¹Ã¹CÚµIÚ$m’èâYgœuñR³Ô,5CCÃh è*¤ ©P~©ÿRÿ¥^œa‰²DY¢¸VÕÕÕœœ…ãMÊ )OÊ“òøÃ®Êî–+–™™™™™ ›œQ¸~˜ðË»{\Þ=LrI.ɽò-¥±46¥Fa¤G*œÎ §°ÃšoÍ·æCC)¥”⩜‰ËŽËŽËÉޕווǵªö©ö©öÝ­íííÞw¨uEëŠÖ€ 0صO#Ê| ¿–h\þåònYDiDiDiÎZU¢*Q•x.s`êÀÔ©¼µ(­(­(MÜãj¤µ>>>(0Õ›êMõd³¦YÓ¬i¤`)X Þu•Ýñ§ÈÈHÚïÒ[íš¿åâð;#&&&&&‚벑¹17æFþj ·„[Âñw1@ n Êeˆ2dý‘ÇqãÇù”ZïYïYï±ÿm8Ùp²á¤¸hÈ9ärrÉŠÅŠÅŠÅïú³|–ÏòÏVA %”Ü}ô£ýÒ4¹®D ¿å!øƒñ;ÞÍ@5ªQ-¦³rVÎÊcÚh -¡%?…Œ¬Y3²F Wä)òyôg䌜ñ‡Z}‰¾D_²<ÆÜfn3·‘ï$?ÉOòc'\q+\€ößã øƒñïº^b:’„$þI $áŸzVͪYõû[ÔÓÕÓÕÓé=®“ëä:»§KŸIŸIŸíèiÞØ¼±y#0ˆW<¹±tüÇ#ÖѸé†qþIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-7.0.png 644 233 144 2471 13755454066 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜîIDATHÇÍ–]hÓWÆßÔiZÑΊâE­–ŒÂ*µˆU±~ÑdŠ´F[m•¢2+ÂÆ”MÑ ëÐùu1/Vªø‘N*뼨h¥ E˜3±0Ø¿ ©ØR5Å5©Ö`l›üÿç·‹äô• v×s“<ï9çyž¼ç¼oŽ€ˆˆLI| ¤d¥d¥¤ÇqJ•O]ºú³_ãøŒ¶õ¶õ«áÓÚOk2.d\0;-¬çõúäý"²žŽË±öF{£Í™À‡aÓÜMsS§Çñ>H»švõm v\Ûq àJý•z¾†¾ö¾v€WÎWN°°ž×ëõ~Í—Ì/‡?Ðñ7Æß°õ€}‚}‚Ì^5{•ã›ø‚'X·fÝ€çãžS)`ô“˜¤œ@˜0z“°žO¬×û5Ÿæ×zZ?îG`ZÑ´"(«,«Lû9¾¡óØ;sïL­½ ã“ Ž…Œ-ƆAù”6°°ž×ëõ~ͧùµžÖû‘÷ÏöäJÂåÑò訡6åcÜHÕHQc³qÄ8‚2Ò4# ”K9u^’‡Z¥ŠTÄz‰ÆD”ú6ö0ö(oŒ7@$Îö »6xreÒQŠˆ|^i}i}áOÀoøQþ0·š[ã4‰1Ìpbˆ¡$<‡9Ìf0ƒIñ<*©rƉQ¾†üoýoÁÒûI;svÜyT5€9Oóugw/í^Šª]R[P[ž'ä Aƒ½ÁÞ`‡GõêÕœ±®C]‡ºÁ©©§¦žš ={îöܵªº£÷£÷54çi}í'aì¯=piðÒ ˜KÔ—:;¾Ÿ|Ç}ÇañÆÅow‡»ÃÝa]O£§ÑÓhzYü²øe1äääA~K~K~ äxs¼9^è_Óïì·Ž~X]Ñzq}íG ývúmÕ}}ïÝ’vÕæR³Ð,´¢3/f^Ì„ò¦ò¦ò¦3UWXWXW‹6,Ú°hƒ_0°``Áœ«;ç9ç±â†[Óúq?“3&›!ø"øx“(û•*_å[ƒ—/^†ì@v ;­¹­¹­¹;}ýôõÓ×ÁqE\I7ÓuÖuÖujö×ì¯ÙŸdì‹„žÖOøI1›ÍfÛc‘Xi¬TDÒEDdš9Ý ›a îwƒ[$³,³,³LdYç²Îe"ååå"¡¬PV(KdVpVpVP$°+°+°K$¸6¸6¸V$ GÃQ‘œ¶œÖœV‹×v/®7ªŸð“"v†÷þñÞòÞCD„í²Y-T eDøÎûÎû΋¸KÜ%î‹x 8Š,/Z^´¼Hd~õüêùÕ"+++"Ž6G›£MÄÕëêuõŠ···‹ˆ˜]f—Œ¤|ŸÐÓúÚχU‰™¨’ßbM1ë©×?¼>ðúD|_Äg…¹ÏÜgîƒ`G°#Øæ6s›¹ T‹jQ-ò†¼!/˜›ÏÌgý±§±§€úϪü}ì+¶³=éRE‰M»ÙÍn0CfÈ %•Ò Õ¬š*ãŽq'©Eýïüïþµ%u~݉cïÌÆã aì1öå;ꨋÿÎxÔ_ù•è#@ø›Üõ§Š¨Š&3ÃÌ Æã`hþŠÔŠT©÷:ÿ˜ý¯³¯‹1û›/؃é={8)!IEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-recentre.png 644 233 144 222 12610450011 16730 0‰PNG  IHDR Vu\çsRGB®ÎébKGDÿÿÿ ½§“:IDAT(Ïcd üg````b 5`$ätuLd†×†ÿ¤(ÆjíRóŸXÓÉŠ’5° ÎØ [ÚÇIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-15.8.png 644 233 144 3026 13755454066 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜËIDATHÇÍ–ýO”WÇÏ 3Â$Äa¬‘Š(VJcüEìnƒƒ n16T1l46um¦Q›}©›°Õ 5bÑ[¢`²fë é*õìÈ‘¦-hG)/Xæy¹Ÿýaæafë?àùåɹçœï÷äÞ{¾Ï‘¸ÐWÀžhO´ÏúöwÂë1y1y)çƒ~­¶b[ñƒƒàþÄý €§ÎSgö…}+nåGÖ‹„ñ#ù¬u‰“ðBtct£m]È? oe¼•ó« ÿ—àjr5Më°ýòöË—>»ô¿‡G·Ý[7¶¾·ò­z /_ÿ‚_œWœWlßBô¼èy"ôFÒÉ»‚ ƒÉPXPXðCÔQÊÆ –XµðãDz§¾å[õž…oñYüÁ~æ.Ì¢-E[\§ƒ}ç`ï’½K,>­ 8ÂbA÷ë~ãmãmfAÝP7°aƒ°oÅ­|«Þ³ð->‹?ØOø(M‘‹Q¢—ès Ý4]ÚRm)¨‡ÆJc%Z( Œ½Ænc7éÆkÆk`l3¶Û€|ÞäM~iÊÔtîAÓ¿×´PIA|(ñ•ø€ñÿÜQ‹ˆ¬¨×kÈïàË–ñoòù§™ef13G1ÄÀ$“Lò¼Í0‘Ò•®t š#P¹*—ΆðÓ³ÿ&€Ëïòûü'ØOhÇjÛ¯Ü^¹ÔAs¥|Êyê¥S/¡ºw×tׄ /Ž\¹8Ç /„“÷NÞ;yFÛFÛFÛžï·ë|×¹®spôãï}õßzçõγ¢æJõåŽèÑÖÑÖ¶ ¿ùæ=øüõÏ_ý €*ßz³tGéf­iÍnÍnÍs§¹ÓÜ êÔ/¨‡ÂòÂòÂrð¶{Û½í0˜;˜;˜n¨c¤c¤c–×.¯]^ ÅF±¿ØËW$¶'¶3Û;ñø«Ç_©rh^ѼÌw‚ýžŸ??_5Âã /@ … 2àBÚù‰óX˜Ÿ˜×\?pýô%õ%õ%-Ý–nK‡‚]» vÁ™é3Óg¦Ÿß©;ywòîäÁâÔÅ©‹Sá˜yÌ8fÀ«¯Ô¼R—»®u]˜¸4q Ìc7ÄnPvùCÔ×Q_“._:¦Ó"ÎÃÒ-Ý2º¥o«{«[$ád§ ŸŠ¼oÀ+¢V©Uj•HYUYUY•ˆ7Ó›éÍ9´úÐêC«Eî7Üo¸/sö,íYÚ³4‘ˆ´Ö·žm=+¤""Wˆ'^FEœœDd™}·}7év1Ì&³ÉÖ+v­H+‘YhëK´—µ—Eln›Û智;uwꮈ§ÄSâ))­(­(­‰ïŽïŽïñeú2}™áÆ:s:s:sDRö¤ìIÙ#Ò\Ö\Ö\&âr¶8[Dnmº=v{LŠ8F#"ªÈ°v[oèòó—êêwðŽ…Nbví­µ-k[àêþ«û¯î‡©æ©æ©fÈÏÏw»Î]³³³ðpÍÃ5×@FOFOF<Èyó 6šÍ&Ä ÅõÄõ@Ñï6ü¼ágfGO©*U¥Ê¡q qÔ~ëŽYS©U~Pùð½5•Æ5ãLüu⋉/P?ªÕợÐNh'àIÌ“˜'1 ’U²JµH-R‹àé¾§ûžî•­²U6 F‚‘¾Ißw¾ïPÆ»´@Zx*é­\Z¹4r*™Ó±]?úÐ?Õ?5ÇŸÏ´yÚ<V&u[µ©6PëÕzµ>B¯RUªJ-xøÔdÔd˜|‘kÀQŽâ-¨ô]ú.B î¨;8p€e›q3߬7ñL|“Ïäê‘¿Ÿí‰Ï <©< P‘~"úmý6€QgÔ1*Q%¢´gÚí ¨,•©2ã;†*TëÕzОiµÇ ¾RgÔF#ô›úÍøîóÅùÅ.hM3$O$O—À˜>¦ |Æ ã Jc5«¯9ÂK@5©&Õøðá³ÅsðâÖRN9€qÌ8Æšø1¾8TOLXëϰ¯n_‰f|JP{©½õËXÝ?€O<}ðNž,jµtŒåŒåŒå@Ëò–å-Ëa|d|d|Ķ£Q”툣|qþ¨ž˜°»ÕÐ1ß1/¯2¾äGò ™ž¡ÀP`(©§RO¥ž‚²Ýe»ËvCöþìýÙûa°q°q° Z Z Z '”Ê ·ÏÛçíƒiÿ´ÚoØ©mÓ¶™øªÊâêHéMéU—aÂ7a;£R÷ê^ËîÙܳ¹g3.>\|¸ºJ»J»J¡xiñÒâ¥p ý@ûvØðnû ךּ¼7yoòÞ@ÛÙ¶³mg-¿^¦­ÔVÚŽ<ÎÕ³DÄUê*eˆ{Ô=êˆužÌ:/:œ’.nq‹[¤D+ÑJ4‘üúüúüz‘i;Òv¤‰„sùá\ý¾~_¿/âÉòdy²D¤@ ¤@$åJÊ•”+"¡ñÐxh\¬’ Ɉ[³"îëîë’.âZëZË:§ˆÑet9FD´-Ú–xbº±Óð>ÑDM¤9¯9¯9O¤B«Ð*4‘žƒ={Š„;Âá‘×÷^ß{}OdîíÜÛ¹·"“ƒ“ƒ“ƒ"ÁH0Œˆxû½ýÞ~K—ã®\’KŸÅÓó¡Sßh^ÍkõØ«[¯n½º>¿ÏïóÊêÕ+ªa{÷öîí݇¡*¡*¡*Ÿ}>ûŒ)cʘ² šŽ*Aióڼキò=sì÷ø;gœcAý¤&Õ$¨óªUÙÆƒZ£Ö¨5 *U¥ªåU^e»4ê[U¯ê=4Ñ`4 ,ù_sì=“ߜ̚ޫ÷5F j¹À”êV]ª 8Cm¶¹N' ~QCjø‘1ÆP`2A×ûô>þ‡'ÿ¢ýV.Ú×Å¢}-Îì_ƒ„'%k¹õpIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-15.9.png 644 233 144 3025 13755454066 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÊIDATHÇÍ–ïOTgÇÏE¦p6åW)MlÃ4q}á $k[‰„­fya¡MëjZ¥»U›ýašHÑ¢ØvW¤Æ¢fâTÚ"ª¾ØF%‚;’X,0ȯ&0wî<Ÿ}1sÖþ>onÎsÎù~Ï}Î=ßûˆˆÈòèS .+.+.%bÇíŽí'½–ôÚóç"v“ÚëÚë·?„ÔOS?°¶X[Âý1Ûô›ñ‹óEbø‹ùÌ}Y.±Ä ‰´’¨}Þ(|£0é·ûï×ÁÒniŸ AõåêË_þõç¼ ¿ôüÒ0Y2Y1Ûô›ñf¾‰·_?Á/ ß$|£ AâÒÄ¥"óJÎ+y{"÷ó ÔQêøyÉÏKT^`ËT àǹÆÙ¦?oæ›x&¾ÉgòGêHߘ¾QÊv–í´œ‰$ôÿöeîË4ùôvà(GY!_È`T̃º®® ¡AÌ6ýf¼™oâ™ø&ŸÉ©'ÖʰˆÈ±Må¡òÐBA®°EÏÖ³AyŒ"£=êPÆ>ãã0 Œ—Œ—ÀØeì2vv¶°…'— ûC)¡ôЄž¡g€ªˆàCùtù40å_hå°ˆÈêã`y`yà‹ç߃¹ƒ¹`ü€Ž°-l#°@ñ€Af˜á×+@`Q4* *ü™£PÕFü>Š¿rÀ5à°ø,>_™ÀÍ ÍiÍi(w£û¸ûxŒð⣋.>‚ÆÒÆÒÆR8uëÔ­S·àq÷ãîÇÝ¿®·ooßÞ¾½Ð°¡¡ ¡åùiðãÁMo¸H Õ¬®Ym¶¶©;NÖ‰ˆüîŠ,/ñ”xDÂ""¢½\ѳ³vg­«CÕÕ¢y[¼_z¿QuªNÕ‰ÔtÖtÖtŠ8ÓéÎt—æÒ\šÈTÇTÇT‡,,w¡»Ð](Ræ/ó—ùEÚþÐöfÛ›¢ÙOØÙIð‘cnåÜJíe-÷ÕºWëDHŠÖÃßRì)vuFΜ‡àóRç_<7}n²Yö,;tÕwÕwÕCNNhZVŽ=Ž=Ž=pvöììÙY`„Fb'Õp¬áXÃ1ØðpÃà cû¶ñ¢+EWà·?ó|æ~üBÆ3Ïtª Ödkrø.ãÍãÍ þµ0ö¬^?¼~œ÷œ÷œ÷àÎö;Ûïl‡ÊÆÊÆÊFh;Ývºí4ä¬ÉY“³Z]­®VW¬€ûU÷«îW­ÂVa«Ç~Ç~Ç~Xº.!7!NY[>jùˆq0F ININ ß#Ün×îJœ^¦—‰DZ+éf+B™ú*}•ˆ–ª¥j©"þ›þ›þ›"Örk¹µ\dGÕŽªU"+Ü+Ü+Ü"Þ>oŸ·ODwêNÝ)2vcìÆØ ‘|•¯ò•ÈÖÃ[m=$òe°ˆ<7”WŸW/é"sïϽ/"Ãê„:¡Ý~üÿù#—[¿hýHP•Ñž/î)¾V| ®¸zàêð_ò_ò_Û”mÊ6©-©-©-P5_5_5žlO¶'Ö\{píAèíêíêíÇ&Ç&Ç&È|!sUæ*Ø÷Ö{Ͼ÷,óÑÙ­ävô¤ÿ©'6•zíµÍ©4¾5¾…éO¦¿šþ ükðHðH¬EúIý¤~¼IÞ$o¨<•§ò@e¨ •ã•ã•㕹U×!ø]Ðt¨m´x´¥æBëBëbSÉdíîÚÝÑÓ¦îha«ƒeÔ2ꋇÿ€ßÎløLøLL™Ôª[uƒÚ¬6«Í‹ô*_å«| 4ÒéD2, ¶¨wÕ»á±ð•Åk`f`øÿû:&‚Š*¯Ú¶dÛ’˜ò“ MFÀÄ”Ÿ¿p„# :Õ5u h§v`’ &@ÝQ½ªwaŒŸCÆºê †F›¦òo‹ßèO*ÿÓû¯|joOí}ìé¼ÁþZqZ·C ¯IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-22-grey.png 644 233 144 6144 13755454063 15776 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—PTG¶Ç¿}ï ÈQWMf­D!èSâJ²¾‚ FC¦ «>³ …/dIAÁB%& UŠÈ¨1ÈsM¥PP]A‰[ÄH”„äç°Ã3wºßÌEËÝTÎ?]Ý÷Üs>·Ïé>ç’ŒŒŒŒŒ ¸bVÆgnƒð@x <`Õßd|“ñ [œ5˜5˜5øÇ̹1·ý=EOÑsõ{333ì ¡E$>ð€v´£À{xï±/QŠ(EI~~~m."cdŒŒýµ0Ó#Ó#ÓC/;.;.;Ž ˆjQ-ªÉ«³ô†Ë•›\‹µXË•Ò,šE³è ˤeÒ2¹hMVeVeVeieÀ2`¨ù§ùó æVäxÈñã!\Z½iõ¦Õ›Hj ,P(ÖÌ_3Í|@šKÏ%}é}ÉÞœ}»?É¿Ä#ñ ö\Ïœ™3s¦±$$õ!^Í«yõÕâÉÓ“§'O?;߽ƽƽƶwSû¦öMíœ5 5 5 •lQ¤*R©0ã|‚O ‚f˜ìÀì°K°晥3Kg–bKk}k}k=³ÖúÔúÔúн#›G6l~ë+•Z¥V©×)m ¶[Bø!–ÈYâƒXn=IŸNŸNŸPzÔ/'TBEýß-S–)ËÔ³Ò¼¬yYó²¸Vû¾ö}íûB©ë„ë„ë4X€X‘y3oæ è@'8Á € &˜<çñ<@:I'鄈a c¸ó¸ó¸3ºÏ9wäÜ1¶»®»®»N¸%w;È~®£Ä(1*dB‚¾qMMM€l±l±lñ¾ëæ*s•¹êÙ?i´­F+nIŒKŒKŒn¹.v]ìº lu¶:[@·Ò­t+¨ ‚ 9$‡ä¤‡ô€Œ2 5¨y¬osµ¹Ú\———,ìk¢5Ñšhq‹ä_â‘ø8Ñ$šDÓ«k,,,â^t׺kݵÌK{J{J{Jrd‚FÐgÞ÷ãýî(w”; ZRKj衇ÀaÆa¯à¼FÒHëóãü8?°a6̆á,Ù×ÞÔÞÔÞJݣܣܣ˜—Ä#ñq̇ù0Ÿ¿½n µ†ZC°æ°æ°flr-u-u-…œFÓh g.Ëãò€¡Ê¡Ê¡J ¹¾¹¾¹hëmëmëıGìð>À.ã2.C‡=|BÿAÛƒ¶=JÒ£Ëe¹,ήû\÷¹îƒ<¬5¬5¬›$‰½D/Ñë¥nÃnÃnÃøbeØÊ°•aDg?rîŸá3|F|¸³ÜYîìÜ—)`–¹9|­¾V_+ÒÒÒñx©‘e±²XY °4–ÆÒŸ%>K|–!S!S!SOè‹T¤" ‘ÇÈcÙEÙEÙE<- îmîmîmÇp LjÀ{òž¼'ûv"h"h"ˆ¬cÅX1Ï B‚f?dãÔÆ©Sͧù4ø>ðûÀï}¿¾_ߨ›ÔMê&ÀÏægó³Bª*¤TC5Tóôo©o©oþiþiþis€Ì>ò“·'oOÞF·…ÛÂmaßrÊÊÊbn—G—G—ûöÇ ,àøc (@`´-F  óÐyè<½³ÞYï „þeø—ÀŽ…;îXøШ3êŒ:@—«ËÕåz½‹Þß¾?|?ð.ÿ.ÿ.ð-| ß2:ÕÙÙ ú ý†~|©ìRv)»Ä\Zh¡Í,2„ !ƒ¤ÎÞ26ÍhÃhÃhTÒõQÃÕp5011|(ÿPþ¡XÿÎúwÖ¿ˆ_‹_‹_?Ž]íOµ?ÕþLj&5“š'ôã×ǯıAlèNº“îÄŒøH|$>‚êâõ‹×/^§k‰ˆÄFlÄV,'þþþÀ`Ý`Ý`]ÉCS‡©ÃÔñöR¿e~Ëü–Ù’cå±òX9Ÿû©ñSã§FÌ^ÒKz¡ÅËâeñ€uuu`q·¸[ÜHïHïHo .¨.¨.0‡›ÃÍá€|‘|‘|`½a½a½˜ÍÎfg°øæøæøfþòþòþrj¾šs5çj§rºætÍéÚÝmÖJk¥µ28¤÷¦÷¦÷hD#ÿpXvYvYvù†ƒi—i—i׳‰a'ÃN†dýSýSýSɵá”á”á0~9¿œ_B4DC4€mmm°,yYò²d`4x4x40‡šCÍ¡é#}¤`·ÙmvP$*‰0¿4üÒðKØZUTUTU„‹Š»Š»Š»Ó›Y+bE«·Â¾ð½¿KàŠ¸"®ˆoš-uý4žÆÓø„|‹ƒÅÁr /6¼Øð"ó®ü¹òçÊÉ™5§×œ^sQ¬Œ•±2¨Èä òÆçõu¼Ž×…Xˆ…ø÷uT¡ U˜0Ÿ4Ÿ4Ÿ„sÕ¶ªmUÛD oå­¼UgâLœ)Ò`Lƒïïš-ÂR{›g œí…¿‘|’Oò¯íá ø¾`oób^Ì‹Ë;7xnðÜ ¸{lûØö±ís€ÔƒzP€¹0æ@ 5Ô{“½ÉÞh m¡-u§îÔ3vlç ú ú z[ò`Ö`Ö`–pX!SȲ3Ùþ»üwùïúê*2‘‰Lòwt¢b¸Ô:¢=èïa36c3©XQ¼¢xEqîkÊteº2ýL¶QiT•ÂxYhYhY¨-YrH2I&ÉÄ ¹In’›îáîä,9KÎ$’@°ÙÈAÑ`h04ØÆº~èú¡‹Ïujtjtjì›¶¤XR,))Ÿ·Ä´Ä´ÄÌÀ Ì»ŸS¨Ù>ž¥NÔ‰:ÁåÎ/w~¹ó `I²$Y’R>wtstst{p¶½²½²½’Ï­Ž©Ž©Žaɲ‡ì‚–ÐZ8À`FfdF€ˆD$"¦† C†!ÎÔ¬ªYU³ .ŽŽŽ ¢A4(åsî w;Ø7mOÅÃökõU©)…ì¿$ ûÔ">w6wmÉd-YKÖn|mö—ãêyënënënú—·è[ô-Êm8p0à ¢hm£mPq¾œ/ç‹1ULS¡È÷Î÷Î÷¶=?<<Ìw(W)W)Wå®c<ã¿÷ÕQÕ ‡í‘ý@ŠXvvvvv6&¤…}a.‡ì¹›lÏÝÃä9D]»À…qa\ØÞ $"‰\^¥µÒZiwŽŽBÅqÇq0J;¡ŸÒO駨¹O×§ëÓñÊ4eš2íÞ¥™þ™þ™þ´¯:":":"; ÆþžJ”øæ@Ÿ–Tv7‘„$$‘ó+ÊW”¯(Ï}M¹S¹S¹óLö˜ç˜ç˜§0þ]ÆwßeØ’í½KëüÖù­óñu}S}S}‰Uµ©ÚTmRIýË a»°]Ø>õ_^^^ܨÝßKêi.¿!¡¡¡¡¡¡íÓV&gr&'ÿ3à7à7à‡“¶å¶å¶åÿ^ /…×yÂ…? Ÿ_>~üþø}–sçÔSwNÙÖ›¬&«ÉÊ'É6È6È6üïRVÈ Yáÿ]‚ (ønŒb£t‰ûF‰OóüŽüFîf¡Õ¨¶e² VÁ*B;¹2®Œ+û‡×tätät$õ“éd:™Ž»Ï'ò‰|bmw™w™wÙC †NC'¹LÑEt+¶Û­´š‹ƒÃïÈS¹k¿.l™Øƒ=Ø#4“8Gâ®{³jVͪÿºÃá‡gžáîó=|ßÓÿ ÝO÷Óý»iÛÖ¶­m0 /»=©±œú=Žÿu$L¾£üËËIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-11.7.png 644 233 144 2532 13755454066 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mhSgÇOÒ´5ÚV 誤V]Aœ"2Á¥®Öתu ‚ÝÚ‚sà(N?8e“¡´à‡tjiÕjM'´k¥¸iºZ¦Ò9…8ÚÖ¨Ëp—¸JrsïóÛ‡äæf¶¯ž/á¼ýÿÿ<çÜG@DD&%~œÓÓyqßù©W1®b湸ÊÇZÇÚûabãÄF€üÓù§Í‡¶oå­úÔ~?•ÏŠË$±Ù—²/9ÊþaØ8{ãìqïÄý¯ýàîtwþƒº+uW|g}gù ‚7ƒ7^–½,Û·òV½Õoá¥âËá7øE ³;³Ûñ;dgeg‰€g™gYñçñ‚ߊaÕŠU+žd<ÉPN0þrÈQe@˜0–…R|+Ÿ¨·ú-< ßâ³øãz –,5›ÖlroxØ {§ífñéÀޱp, `l1¶åW~8Àö­¼Uoõ[x¾ÅgñÇõØWiŠˆ_ŠQ«Ž% ˜¹z±^ êgÃcxÐ eU˜¹æs¨;ꎺCš©*¢"(##:%:ÝØ¬{u/Ä¢q|õñº©ë¦Z/µ¯rTD¤ä$¸GÜ#a]Šq€JºÌ9æÆ’LßÑA~Ãoø^zéMQ#FŒÿ0U¬Š“x• ¸ÃîpØVr2qb§úù«¡®¡ÔAs®ã­óîñîA ½74chF:·Þ[ï­‡¡ùC󇿧çGŠFŠFŠ qQã¼Æyàý³9»9Õ6þŒyÆ„ûc£u£uæ\ØqtÇQ0ïÅõˆˆÜÙíåíå; j7ÔÔ×Ô±Fäê뫯¯¾¶ kŽÕ«9fÏtoSoSoSº0ÿ ÿ ÿ X¸aᆅ j°êZÕµd_Äû‹¯Å×¢j¡[ëÖ ö}\ðU^e^¥ºÏ.<»Ñ™Ìf6\xÿœvNÏžžÐSÚSÚSj¶Mn›Ü6|°8´8$¢Fâ|ÎsŸ¹ODtó²yÙñÀ)®ð²ð²{·%âïñ÷ˆ8ˆˆðI/š;’û0÷¡H¦+Ó•éJ–3˜3˜3(2~ÖøYãg‰Dj#µ‘Z‘•+;VvˆŒ•••‰ îÜ=¸[¤jVUaUa²=ÊŒŸçÆðaÉ W„+îݶ§RoØß°xlM¥ÑgôövQ»ˆŠþíö¦_¥¶SÛ©í½Z¯Ö«.\ZZZ jX «aÐfjÓ´i0öÃX`,€s—¹ èKð XûìT¿X{ÜÏÝÏÃ.¼ ¼JòV‚Ùn¶§ì1þoO¥Y„HŠ·Ý¸eÜú×3€;è¦í1Tbóªõë“S¤^#jDÓ7?Yñ¢•VZWño¥úUÝUw-Qÿ®qÈ8„Înc± ?fñ½¹ùßÞoå[ûºxkßcoç öûWŸm¸#IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-152.png 644 233 144 3020 13755454065 14743 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÅIDATHÇÍVßOg=³»î#à6Tbe¥AÓÚ°U1ZŒ I±k‰+ (kˆiŒu‰kŠFÁ'ú`µhcC$©©1 Ôš¢XB¥.¨(&E¤PK]lA(»³3ßéÃî0Xÿ¿—ÉýuΙ¹¹w>€™ñ'H“Ëä2%ÆlÓg†ßþ‘ý£yçbö •”>‘>ù­œL:žtœ$5Îížaëq=j=`àOåÓý˜ Ãa«³ÕIÙq{¹ñýïÛߌه[IÇÇ…±(¹íÇm?’äg~8Ãä@Û@Igg“†­Çõ|½^Ç›Š}ÿãÈi Ó¤¿H›ÕfÈ´œ´œôÏc ¤“Þ\o.I>2?2 I’êÉœ!²IÊ”©ŸgSl=Ï×ëu<_çÓùcz@&g%gdž/Ïç8+¸w–,M-MÕù” $÷s?gQ9*“¤Z¤1LŠVÑJ’”(‘†­Çõ|½^ÇÓñu>?¦/÷öë) ¬V’Q’Tnj¿ÚOjv% ¨ˆ?i¥•‚¤FTKÕ=êRÍP3Ô R-PóÕ|’åÜ˽¤X#v‹ÝÑŽHz$ŠÖ¡ÜSîM¾ð *ùJ¾BR‹ó­€Çuô;úe Ù;³w&ÉK$ÉÕV%MIã8b?ûiœ>ö±ä ¾à ’a†6Ââ™x&ž‘ü”E,šRW¡-Ñ–p\üÃ'{çöÎ%9îèsôÉ]O\؉kdñÅ_&Im±øR)SÊ žSÖ“¾ßT»¬v"˜ãÓžþrî—sÀ¤žW¦2Ÿ’þhW´Ë˜ÊçGž|~ŒTD*"ÆT*ÕJµRM  â”8%N‘áÒpi¸”<;xvð,2?V«d¨$Tª ˜äQyTGѳ¶øâwŒ©4öŽÙBö¨=ê$ïǤ¶YÛÌqŽñ¥#nŠ›â&)<Â#Oî9ç9G@DD2_K®%ײ8Ž-¿IÆÓv¥íZûyÓA{Y{ùúŸ`ÉÇK>Èú$ëãF›óf~j½H²*Ÿ—LIì§ì§´’~*Ÿ®|:myÿõ8:ÿAÍ—5_t|Úñ)oÁýþûý?•üTIlΛùf½Ù/µ¿¼ÿ ~XxváYíØmv›佘÷bþïâ 7óÁ]æ.øaÁ ”ô‡€§*0‡/›ó‰|³Þìgö7ùLþ¸e/,{AÊ÷–ïu´Å nœ€wrÞÉ1ù¢À|€bX@M0¨ ê$±9oæ›õf?³¿ÉgòÇõ$—2("rh'xÆ=ã`ü Ú»]] jC¬$VB4¡T™’ §±ÈXꊺ¢®÷™bêRª&önì]¢±«Ñ¬h£ñþà¹ã¹L~s)¿Yߎ€#°*c¼o¼8ÀnP›Ô&‚ 0İ’•¬}BŸÐ'€.ºèJø¿¥…l²É5©¦Õ4€zU½J#‰þë| ~âz¯ˆÈ±‹ŠÚòÚòGÿaÓµ»Ãîa7.:üìágQã7Ư_gÞ8^{¼öx-\Ûrm˵-ɸîÕ½º7‰o½u«îV:~¨åP j¨n`d`$ÉGzí뵯“q=¢Šˆ\ùtî: ß–Ý|âæª:óÏ„Ë#åþr?ämÏÛž·ÆŒ;Õ…Õ…Õ…É3ÝÝÜÝÜÝ<_øŒkÆ5ã‚¢õEë‹ÖƒûC÷{î÷àW{7F6F_ýûݺ»uª¾ð~ácc\E«Yä_ä/Ü*Rš^š.2{æÞ÷~ÔÚ~ûõÛ“oOн¦©¦µ¦U$Û—íËö‰VVV‹¸ÛÝíîv‘Ü˹—s/‹ëŒuÆ:™7ºté>"2‘1‘1‘!’cÏÉÌÉÙU±»qw£Øsÿ˜u&ëŒÖ&òœó9§ˆv6ã³ŒÏ ·Z,WmOÚžä)qÌmÛ*ò’¥8\–™†m U U"Íß4÷6÷Š„Cƒ¡A‘´i+ÒVˆìqíqíq‰¬jZÕ´ªI$²#²#²c¾°XY¬,V&’¦¥iišÈ†Ñ cÆDÚöüö|‘þ–~½_—‘ÌÉÌIµP<âá)‹±<2ÐFdnÉGK>ùÛWGûŽöɲÊXåhå¨È¹óçΟ;/Âf6³YäRÏ¥žK=IâpA¸ \ ¢uhZG2þpðáàÃAçççg¯³×Ù+RßZßZß*²øúâÎÅ"·'n7Þn”e"Ò+½",7ŒmD”ÝÜc§·Þ÷ævÎíTÕ›_zÆûŒ—ðÒÛK¿_ú=x:=žNð—úKý¥É=T,ÅR,Ð3Ü3Ü3 ¡`( ‚ë ë ë LOMOMOAUKUKU ¤GÒýé~øõÈ+ ¯4žý€ª†SŽSPq= ;v‘¯÷Y÷Y“§$ò—PI¨þm0÷`¥ê£úèüÍ=»vÿì~ˆz¢ž¨°aþ_ƒ¯Œ!cÈuRT'Á×è«÷Õ£ô#ÏGžO9•cûò÷囆{ì¢pæ>Ö÷ÕöÈǪU5AeSÙ*”_ù•?EY Á!B$¿É¼F@Y•@©"‚*~«ìV¡ñáñaǬc6`妙>l:oÅ‚ŠÀïãάºcþ˜hÓèæ;?6¬XœàðŸ¸Áªõúð&ò¿2솨ºû9ö3pÔtþ k…’ü.ñÇö®|l_í{ìñ|ÁþnÄþ%ðx@IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-14.png 644 233 144 2270 13755454064 14665 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜmIDATHÇÍ–[hTW†×Lª“Xo‹)ö¥£‚ÇàÞÑñ‚ÄúP´HDÖP•H‹´*FCtìE0 F'àƒm51VR¨Å€Ä``&gïýõáÌžs45}Íz™Y·ÿÿÏÙ{¯³DDd|úW †ƒc]?XæÅ³g/þæw×?® °2°òÏaÜÑqGrërët»çÛ¼­÷÷‹xø~>—ñâBçCçEi¬¬dåú?·@ÎÅœ‹Øzië%€ õêùº[»[Þ½+Ï·y[oû-ž_ö}Â/#®Ž¸øB#C#E oaÞ©ÛÝ‚¿¦Â²âeÅ/²^d™ ¨·ÀhF›" >¬õø|›O×Û~‹gñ-ŸåwõLœ7qž¬(YQ’sÊmhÁ®)»¦X¾‹À0œ>§@­WëI‚i1-€çÛ¼­·ýÏâ[>Ëïê‘×ö—°&{MvFP£î¨;€£7ê ¤FÑ!óÀÜ7÷d¦Üì0;@‡õ"½ú”>Åýꆺ˜4~†Ïò‹_з¿ANwNwßЩ:à°ôN½“~é¢ TK¸‰&š bs˜f“Ùd6ùâì½Ao ?í,Íðeø]=iaÇïÀ¶½Ûöfš§g–àûL•Ùcöx<µeµeµeð(ú(ú(:X_×õ®ë]×áæê›«o®ö%¾¦B }Î+畟Ïò»zÒ”C¼7Þ›Yˆ-|§B*DÒFœ§Æ©Ò{¥÷Jïy iVÓ¬¦Yƒ…Íwæ;ó˜{rîɹ'½¸®Ñ•ºøC•«r‹o¶xü®±·ÆÞ2ç¡{F÷ òSbJ<7•ŸÊOåùi禛yíyíyíp9v9v9æÕ*=Tz¨䌜‘3°ªaU꟰…z^t™³æ¬ÿQ,¿«G wLîýz^ö¼ÌTõ€ykÞ׸Æ50q7qfvÕìªÙUÐü¸ùqócHÔ'êõÉäGò¡¢¹¢¹¢ 'N.œì;oÌóøõ£­Ñãñ»z‚"úоx"â,w–‹µ‰¢¤C:D$˜ŽÌ”™23“—T4MEE²že=Ëz&ÒQÝQÝQ-ÒëŒuÆDâmñ¶x›HëëÖ×­¯Eê*ê*ê*D“““DôºXûø2üi=ŸÝc¨Óê4I.#L`¼'/ …‹Âи¿qã~/®"*¢"plÔ±QÇFAôiôiô©oÅBF Qª`È=ö?§2åvòÏyîá÷î=Ü{R‰T"•¼ù“ád8†÷KÞ/y¿Ä—¸JmßàêTþÇsmé's Ippҳεƒä ˜„I˜°Žu¬:xÈCà'hÐÛõvúQÈ96ÄäGÝUw­7ëÍÞä'D PË N ~cTSI%ð%`@ïÖ»@©Ûê¶ÿ³“Ø~+‡ííbØÞdžç ö_¢ã‡t”ò,IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-28.3.png 644 233 144 3104 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜùIDATHÇÍ–ÿOÔ÷Ç_¨‡½(ŠëüŠ­‡p2ZˆÙbBÒAš®„e)­…šnÅb²dvó ¤L€ÍZ#Û04Pª­&6¶Â@À'd²1ê5ôpp‡pwŸ÷c?Ü}ü°þ¾¹{¾¾<Ÿ¯|Þy?ßo‰þ ˜¶™¶™Ö°éˆ7§™Óvþ5€ëü’’=ô;X[»¶`Ý…u4‡õ¼^¿¼_Äà_®§Ç%BŒÀªæUÍ!‚ø#xcï{Í? àoA¸=ÜîöÁ»íï¶´^l½Èûðý7ßà:à:Öóz½Þ¯ó-ç—~¤/+:Vt„üV­\µR¶¿ºýÕèß þ ™¯e¾ð]èw¡Êþ)À‚Eæ˜C_Ó˰žÖëý:ŸÎ¯ëéúy6¤lH¬7³Þ ÿ4Ðàh„’­%[u=¯8Å),à›óÍøóüy,‚º¥nBXÏëõz¿Î§óëzº~`c+gDD>I…œr~µÀ{Ûwßû¢÷Eк½cÞ1¼ÁI•æÖ\š |ÿñûÆAíQ{ÔŒõ_f˜y†”ö/¯ÇëÁë›ðnònµ3À9S9SÀ¬®¯oå""1Õ>>7¦fFoÞ~ @¨D•ˆ‡/¸Á Ц´)m h¥•Öeƒ\â—€d’I6ÂÊ­ÜÊ ü‘SœP)*WƒüA½ >ó¿XÝת« ¤ D§ÓF¶CÕÚJ*Aõ¥÷¥÷¥‚ƒUƒUƒUPq¬âXÅ199rr䤑×Îiç´s¾7~oüÞ8Tü¢"®"5:é¸è¸h詛泾µu_‹–("r·ÚêÛêaèš³ÌY¦ÞÞæÙ\·¹ŽÅý?ß¿?¬Ö ëÔ6Ö6Ö6‚­ÉÖdk‚CÕ‡ªUÃŽøñ;âahahahÁèÎäÉ;“QQQ ÙµÙåÙå°íþæ7ÈâÃ?¹ŽºŽª·Áf͘Gü/T½P¥šÁ³èY„¶ðÎÈÎH(ù 8©8ÉØW¶¯l_äEåEåE­ÅÖbkê”ê”ê°:¬«z¶ôléÙbôuuwuwuCiViVitº;ç;çágöø’ø¸—ú óA&Àì—³_‚vÝRj)UÍa¡¶•¥+K‰ã¸§×Ó"Y 332³çWÑiÑi²Á6m›¶M‹DgEgEg‰äeäeäeˆ\ë»Öw­Oäæ‘›GnÁ·ˆé´é´é´<[éÃéÃéÃ"É É É "¹‡ssrsD––Æ—ÆEL1ŘbdFdÅàŠAÙ ›L…¦BâDk²Z U3Ì>š}ÿ(©©Õ?5™ÇàıE'ŠŒ/Pc­±ÖX!)?)?)߈Ûêmõ¶z(**2âg¦ÎL™‚´³igÓÎñݼ”ôR4X?{ù³—–2–2Àç_ýÕê¯T³IýÆÝànèéNëNù{”cÂ1Á;‹öÅ‹;e©c]‡¹Ã,²~lýØú1³Ýl7ÛEvõîêÝÕ+²æêš«k®ŠÄvÇvÇv‹Œ:u0J$ñpâáÄÃ")»Sv§ì™¿<yþ²Häû‘ù‘ù"{+âŽÆ•¥_޽ÕÿV?ïˆ\™¹2#Ú´º:Ð#|8ðÞñ÷ŽÃS_à”<¾ã¼î¼ÎPg”3 åLv¾â|ž>|úðéCÐ,šE³Àã†Ç @M4U¤ŠTLçNçNç‚jQ-ª¼±ÞXo,L:'ïOÞGùÇ–Î-=;µZŽÂí…Û—ÊÀÃÇ@÷• ÏxÔFµÏ3_r)—r2+³2/ó«£b@õ«~Õ¿,~Eµ«vPT›jP™* ð«'£wGï„? 2Æÿó1ýø$•?äçƒj 8³êñ[üPóÍúfñRÏ·|‹¢Z@u©ÏÕçÀyÎs˜Å… Ô°PÁÛ¿÷÷ú{ñªNß#ß#àϺó¿úz(°øcç~ïÊçöuñܾǞÏìÿç [ä9BàIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.6.png 644 233 144 2771 13755454067 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü®IDATHÇÍ–ïOTWÆ¿3¢0±Å6YHœÚf·¼BH§)ib¢Lmm6Å¡mZ!Û¤´ƒ46ë*Íèd•6¡ã®i4!f5tÍVaÜ4”Ñe«Ìì,óëžÏ¾˜¹^¶þž77Ï÷œó^Ÿ¯ó­ä—¢/«GV˜îAúšô5"PXYXYôÛä€AÕ[Uoü°ê‡UÊ ‰Yd)$ˆÞ+°ÞŸ¯Ï×ùt~]O×Oúxñµ_]{wíµü19arš·4oÑõb—€ã' âÁx ±/±¨Q5 € Xï×Çëóu>_×Óõ“~Œ_¹("ÒýØÙÚóÆ'ccA›ˆÍÅæˆ¥œ*ݲ:¬>R–¯åkùí_Ì1÷)Uo·‹ßŠ­­m*Éö{ö{@P××åŸEDJN€%h ÓÔâ]ï]/ðv‚*Wå„ù„.º€<òÈꨣTªQ5+ XsÉ%Ô}5¯æÔ;êÂ|žâÿEJ/¥Ïõ¤ŸÔŠõ©Ë‡L‡L:›öŠoËíÛ·oƒ³À¹Î¹5±cbÇÄži³çgÏÏž‡«ö«ö«v£®icÚ˜§§ë§ë¡ûÝݨ›õ×ï\¿cè‘yè½Cï÷“~Dû•ˆÈD  À÷ñwù»Tm~xsÿæ~"¶vÛ‡¶!?'?'?¼¯Çë1m=¶[Tœ¬8YqòYãH ˆ@YIYIY TuV©:¿Ü»=º=JäÖïçêçêU- ?~Úö¤Iüíç Nå†p$áìoò¾Éƒæš^mzÕ(¾Q|£øœY<³xf̓æA³6ÕžjOµçYcC'†N €M¥›J7•BÃç Ÿ5|mj=Üzå„6‡6,„B æÖ~¹öKå6¯²®i_ÓÎ6ZµáZ‘]Ov>Øù@>:˜{0WÄê±z¬‘’¶’¶’6Kž%Ï’'Ò{­÷Zï5‘ÖÑÖÑÖQ‘… ˆH•TI•gŸ Úíx"óÛÌo•[âô=vyÛåmpjíðôð´ª5‹ˆ)ÝWº»t7d7d7d7Àií´vZ3œÎFg#TÎVÎVÎBÀð|P|´øhñQ˜ožožo†ýûö@f4óqæcøõê–ê"Oþ jÁmq[@]Lí1>Mž¨o©oå+ÉS²pÝÅü«üþ”ÿ¿Ãï€åòåòårÃØòÙå³Ëgaijiji ØÃö@Àp ÝÔnj7A¹”K¹ Ðx?ð>*Ñ­ˆV¬8•>G‘£HÜþ±T\9z®¤r&® Tá§.\ ¼Ê«¼†¦˜b h§ö»ïò.hA•¦ÒT™*#¬’·ÊNõß»ßÝýÀòÄò$˜ÆµÿË1ýè~ƒOìMö&PCÉdVMd%²@¹ã¡xˆ¿ãk¾6’Ÿ#tÐl`€Pò®TwÔ-u x˜º)®héZ:15_Š/}zò¿övùiò?¿wåsûºxnßcÏç öUV)\Š5_tIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-13.9.png 644 233 144 3035 13755454066 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÒIDATHÇÍ–íOTgÆïÞ+/EÙ4Ý–­PÂNÓ!.» ’¨uÑ‘¨wŒ(/I¡ qKhR³ÅˆM\ÖFe·ÐHÍJ(¦6()Ë¢›ò[µt-–a'#ãè3çœç·fg¶çËÉýv]WΓû:€ˆˆ<y Ø3í™öÔpl¯µò‰{÷¼ÜŽ»t°UÚ*¿9iié}é}ÆwVlÖÍþèy ?šÏÌ˳b%.&\´íŒÄÇ¡*¯*/ñá¸c’†“†ŸhP÷yÝçCŸ }B#ütí§kw>Ü VlÖÍ~sÞċƗã?ã¸Kq—lóŸ//•¼T’ýV¸áN6T”U”üócŒ²€þ_ ™dµðãÇ|ì÷í÷#üëG¹ "â8 Iß'}ïednóÜfÐÿ@)C†ÃpXgXSOÔà'8%d„F'NœVZ-«eµ ü™“œP;ÔìŠàÿÒuÕu ÉŸä÷Çòï°žÈëšd¹¡®¡Ô1#ßî©î©ë©CÍäÎdÏd[„3¹3¹3¹pºøtñébp-º]‹VÝ7Æq+ž=:{tö(œÛvîÕs¯¢î]Ÿ{îýõî|5_ï¨w˜GÛ5)üFDdúOðékŸ¾Ú1UóÇ«¯×¿^Ïš¹"“×'¯O^‡Û½·{o÷BJyJyJ9TvVvVvBæÌ;™w`îÁ܃¹Q‚’g“g“!«.«.«Šþ^ÔQÔ¿®Í‰Ï‰gm¡tåù•çU |vö³³ Âz„¿¤–¦–ª‹°8°8Á—É#^é÷õû ó™{2÷ÀdÓdÓdL L L @k~k~k>\\\À–±-c[Æ`ºcºcºÃvæÂ™ g.À¶ûÛîo»oå <ù_äûæã{ߎÇAÓŸ¹òÌuQ =%=ŸŨ§ÇÓêÂúÚPt¤èHѲه찷Ö[ë­…½»÷î޻ŎbG1ܬ¿Y³Þê»Û}·ûn78 œN(k)k)køÂ¸Íq›á£ô¾÷úÞÃz@€.)©)©Æ-»èư1l»%öоÐ>)‘ŒÈnÈÊ[++""çóÆyC¤ÊWå«ò‰ŒŽŽŽ‰EY"ÕÕÕ"Z£Ö¨5Џ›ÝÍîf‘•£r”Hùñò¶ò6‘*Ý•îÉšÏ~7û]ÉYm]m‘õ¡úÐvË.±þÉ)Y›±ýVD„7"º‚iñi*M‰¬Æ¬Æ¬ÆˆïÇÈXqY Ê̪ÁV,†¬²tÐVJÔTŒ qkUÔÑiÈV „U¬$­¡1JB ΠM‰k»à Ö–5b³›ðÃC”%¦(–G>ÞûÞg0÷}ß™TÍf÷üsÏ=çyÞ{Ÿsn†hÚ~K!&¯ðFx#¼ÒËàBäŒÖ­3Z7¤©Le*ë¾H+i%­¦Ã¼†TRI>êó±_ä‹z¢~(ž¼6”•_•Q™ì Ç-S[ÕVµÕ3,’I‡ "Q1#1#1#ø[þÃü‡ù­O¶>Ùú(Ì,Ì,Ì4}ûE¾¨'ê ¼7ó!yM¨¿è yT•GûWŠJ(I(I(aG.ܹpçÂþŽÿ¹ÿ¹ÿ9 0†1ŒèG?úÃÆÅ~‘/ê‰ú¡x‹¾x3?rÌ–äy ÿ†(y;óvæmí}S}S}SèCÐø žÄ“ ± vŽXªvB;°\-^‹Xª–§å¬‚¹™à+x O&òE=Qß ‚ï˜mP“<’Gò©Uj•ZÕô@$¸j\5®-× vŒãÇàך´óÚy€÷# I&õµúZàŸóÏè"è0©ÏÒg¼ŸÆ?´&­Mkø1~˜†_lx_ðüÈöØöØöxÓÄG¥£ÒQÉ}Ï|Ï|ÏðK°ŽŸfÕ¬¦ùQ€À¦`üãñ`tÎè˜HœH ÙGM—f§Ùi3*ð¾àcðS¨Ô]U"p¾ø|ñùb¾7X  y4æ±Nð$ždñq'ûN68—8—Óí3VÍXUUÖ|ìÃ>@/z°úoœl?âC1É1É1ɨÞ0¼axƒ‘¨Á 'œüxïZ jZ$œH8©“©“p-éZy|䱕ø÷ü{n=aÖÇú£~°¨À|?Aô/[Îl9³åŒùe¬/XhC^É+­DŸ¦>M€Ù_Ïþ®-¼¶Ðæ{æ³=3÷Ì\kœmb›Ìú^_ðüä`K-³åØrl9FEP)•R)Í¡94‡ˆH* ¬"v[ì6"¢Áï¿#"Ê(Ï('"ú°áÃ"¢5Þ5^"¢Ø†Ø"¢‚ ~ 9?É?‘ìd'¢Fj¤FßÖbk±µ-/æ+/J«K«K«Cï¸4.K®â*®‚cö`?üfdÈVwXÖ`óÝÍw`Ñ’EKÀ¾Ø¾nrû«VõF½@7ºÑ ðžÂS`ˆ#3:3:3½‚ɹr®œ;õsp¡¦¡¬¡¬¡Ì";³3;ðnÞ ÀhŒ~ÞÏÀóçxé{éïز¸eqàzàz˜“TO×Óv…egM¼[µ·joÕ/àŸ¤)EJ™ú™”UÊ*eUyµè2ççç¶È·Í·Í·Í”>_§­ÖV[ðyç–Î-V ~»ïÛ}V‚ã7ÇoÀÜ{sïÀû­ï·Ã°<–gžo$—'—'—ëÆ Ä)qJÜW¿PdNdNd‘Ú©vªÍÆÀ/tº ÙaãûÝì%{‰ xq-€X¿yýf£åhÈmÊm€¥K; "?"€¿íEÛ @Lfý«©Á©AóªKî•Ü+¹§ ‚¥J©Rú¯íÓþÌ! µ„/m)¶[Jÿ%‘à®pW¸+ø:c~DO¥M¥™ð@ElE,dÏ8»–ïZ`â~ÃýK¯kŸjŸšW}yô²ÿ²Ohµ\-WoæIó¤y¿¿FP¹oô×Ni§´s}½Ô,5KÍB+ú~o»÷†÷¼†vk´G€$Xµl:óSZÐðu¬“uš{š. \œv§Ýi×'yR9©œt» j¹”K¹ªÃäšEY”¥ž$yÈC¤ )CÊБ¿Ok½£ÞQ¯EùŽûöûö[µ«/ÔË`8«d•l/Û À«¿§¿ðí|ße~ÎŽìèÚÑÅ/И:¦ŽyOÅŒ?HvÉ.Ù%] ²+4gÿnWz•^¥Wºžx4ñhâQ"[‰­ÄVâ=eh7Ë•åʲjWwënLÀ;}rxA Z®z)[Ê–šç[·ºnuÝj¾ÎxË£lQ¶¨ñißa½i©-ìêI sõöiíú®¼V»QZ”eÒŸêOõ§¦{ЃÀ;³gfÏÌžoh2RŽ”#?ús˜¿ ãAo^Pê´›ÿ+Úm÷¶›ÚÕÚµv­Ý;¯â_Å¿Š–,Y>–ZlQZ”–séBjAé…ü ½ÅÌ ¢Àë´[ë¨uÔjQ¾f_³¯À&0ÁÔ}Ý}Ý}Ý;j½Z¯Ö÷’̼†\§wÞF0ÜDÂGAí^{v³ó²ó²óLízÓ½éÞt4NǹqR‘T$­/…‘_„áJô_ÚÛ´»V©Vª•êþTA¸¨²¨²¨’Ÿ]1¹brŤöO㪇”!eÈ@MÔDM;Š/ /‚þG ×î©P?û‘´[Ú-íh#m¤z’<_ž/Ï$’H¢¿ÿà 8Αҥt)]ÒÍ`âö°›û¿Y”ñ_åPŽú 4|¼Xæ2—9 µImRÛ¿7½¾Øv3}außzÕÿ?y–ñÙÞgIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-25.png 644 233 144 2470 13755454064 14671 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜíIDATHÇÍ–]LSgÇß¶|#(ÓlÈêØLæR'‹D/¼°Ä™?– †if$Yè…—yÁ…ÆH‡®øÅ&Fiä¦a aµºØ1lF¥±ƒ¬€GÎ9ïoíi‹zÍ{Ó<Ïó>ÿÿ¿ïÇÿ¼„B,Ný °–XK¬ÉØúu&o÷Ø=ý”ŒOk`ùÒòåïßÁ¢–E-…g Ïê2±Q7æ›û…Èà›ùŒ¼X,2‰Ü+¹W,©¸v­ÚµÊ¾47õC^W^×´ {»÷vtžï<Ï7ˆ <«xV™Ø¨ó~ÏŒ/ÿÇ/d÷d÷Xþ†ÜœÜ!À¹É¹©´>9áÏRØæÝæxl{l“VÐþ²PV cÂõÔ|£ßÀ3ð >ƒ?©G@‘»È-ì¨ÚQ•×–lxÐ Ë–|s]ÀްÔ„šÐj´ý² ÈÄFݘoôx¾Ágð'õˆ×÷6ðTÚ+íiA¿2£…µ0€ÔƒÌÉ¥Wz‘jT¨ÐÇôQ}xÈC‚ö­vH;Ú§Ú mhµÚ1í¯Ö¥u1ÚSí)0›ÂOóüÂ,è“ /–KdÁˆ6¢Ólý¤~’9PKUdF3Í4ƒ¼/ïËû¦ü+^ñ Å”G÷é>fRÁ–4_š?©'%ìô/°ïð¾Ãéæ2c ä²Oö!Êpñpñp14÷7÷7÷ýà½à½ 0Ê(£Ðy¼óxçqhu·º[ÝpæÖ™[gnÁäÐäÝÉ»iu’U¨ÂÌgð'õ¤„Ý=—¦.M¥ûöèOæŽÎÍüס²¡²¡2(QKÔÜ~·ßí‡ÒüÒüÒ|èìì„å‰å‰å ð*^Å«€ï¶ï¶ï6ŒÆc̺ɯT«j5ðåž R€‚¾‚>ybkbkL žÏô­+XW°®NÕŸª?Uo¶G]©®|犽ùŒi^eR™Ìœ±¶P[¨-Öˆ5b@yVyVyÕÕÕB -ÐhƒúF}£ùMùMùMàKø¾ÌvÌvÌv˜t|®FÕè;ÏØ[neŸRC™³ª¼¯,Q–@üfüfü&ŒÛÆmã6///Å­¸7huZVñ;ñ;ñ; ·è-z‹IÐ( Òd¼ïº•oð±´Ï¼æ;`øÒ4Ó)¯K*ȈŒ€Ü,7ËͦüDzD–Åxðè=À / ü7û˜%í´"é¼BTÚ+íz…zõåÕ—ê€ÈÖGô‘ìõâ°È9Bå3ëŒuFd‰Ä”˜ñ—x$ aIX^X^!ì"Wä Á{,e©–-Å–b¨–åE¡ ílÙÂfÛ`Û ±3og^öz!®)×”ï7%u4ü<Ÿ¿•óöu1oßcóóû¾hk1ˆs¹“IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-29-grey.png 644 233 144 6221 13755454063 16001 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü FIDATXÃ…—PTÇ–Ç¿Ý÷ÎOP,,A ƒ€ eŸ°¨ *•Ç‹C(•š‚,ºæ%”îRb‰ð ’q5S…HÑMfˆŠ¡³Ä!¥‹òkÀ ‚€ df`fîÜÞ?˜‹[V¥rþ¹Õ}»ÏùÜsNŸ>—äæææææÂóbœÐ ü?À°†ÜK¹—r/±eùcùcùc[W²Ål1[üÙ¿>‚àñ¾µÆZc­a'qpd#ÁЃôxïã}vR±C±C±ƒdóOù§üÓŽ dŠL‘©£¥yÞyÞyÞM R R Rɨ äy±ÍÉåA£…(Z.æ‹ùb¾Øf3ÛÌ6³×ÚüÚüÚüÚòAÛ¨mÔ6Úx۲ƲƲ&âß] ] ] Q±%bKÄ’)‹”EÊ€µKÖ.Y»ÆÒ{i½´_Ò· ßiO²/ñH|¼Óƒ1̹171…¤‘4’PÈp\ÀÍ‹f½YoÖû/ñlôlôltÙÒ³¥gKµ¯î\ݹº“$*²ÙŠlXp Çp jX`À~ìÇ~¯à¼‹Õ×êkõEbgkgkg+³777‹G&·Mn›Ü¶÷su€:@­t¤9Òiñ…,¥³ôCræræræ´¢­¾‹ø¾†¯i½b›µÍÚfýÿ¸)pSà&!*郤’>àË=fÒ˜Àx£›ÑÍè†Ç×Ï]?wýœò¸åqËãþ'¹J®’«~­v;„wc#6bã“ߨêžêžê [&[&[öÿ°Ô[ê-õþL L LÓSÓSÓSùŸ<–y,óX†¥ŽG‹£“Åd1<ÔPC 3ä 9A2H2I&É$€&4¡ ·‹ÛÅíàÉŽdG2à>î>î>Ž¥’þÀ]»w ‰’}‰G⣂I0 ¦7ÖÚ¾µ}kû6õuÏ$Ï$Ï$¦I*K*K*㥙Ä1n\(Ê…ô úý ͤ™4hF3šh¡…`VfeV€tÒÐ/é—ôK€«à*¸ €¥±4–7IÒwIß%}Ç—{îòÜ幋i$‰²`Ì‚ÿ¶ËkµÇqqqØâQîQîQ¹ø–ø–øÜh-¢EÀxíxíx-ÐÑÚÑÚÑ tuu°0, 8ŒÃ8 Q0Q=Q=Q t¬éXÓ±øÕø«ñW#@UTEU€X$‰Epó8çqÎãä’}‰Gâã 4ÊX|mñµÅ×p2,.,.,Ž”8…@«i5­ú3û3û3KúKúKz@Y¨,T¦+¦+¦+€ŸÁÏàg2Z2Z2Z€‡uëÖú}ˆ>p w w ~«ÿ­þ·z *3*3*ض3lg$‘‡ù…ù…ù‘’›7'nNà¤9ÎgŽûS²¦³¦³¦Å“åÑåÑåÑL³ƒ8ˆƒ,ŒYñ¢âEÅ‹;¿îüºóë^ÌOnŸÜ>¹±£™G3f2v{ÓíM·71¦õ×úký«ÔWê+õ/Ö?Žyó8†±cÅÇŠ36d²ÙÙËb–x$>ŠOð >!Áô*½J¯.|™6Ø`[#Äb±{7önì}1/Žˆ#â °*¬ +@OÐô0W1W1W,½²ôÊÒ+/Ö»SwêN_¤ÈØ‘±#cGð²(è»ô]ú.€ó8ó$˜ç|8·U̬›Y7³Ž„ )BЂ׸4>OÃYœÅYͳ›g7Ïb±X,?Fþùc$ÐÔßÔßÔøyùyùy‘[#·Fn¦äSò)9PWQWQW e e eÆkÆkÆk€Ýh7Ú«fÕ¬z9Ÿœùó/æ_ÐOi"Md¼ò”ò”ò” í÷î÷î÷æÿëAéƒÒ¥$;âLÄ™ˆ3˜…:è ž¶MÛ¦m@¹w¹w¹70á6á6áÄÆÆÑÑÑ/\;;;¸.w]îºèYß³¾g=ââ⌓q2Nº—î¥{¶ÍÒ é†t¨ #†ÃþSÙ¯ìWö ZŠ$$!)ïŸËçò¹${¾ì9Ÿ·?oÞµT>i#m¤€9Áœ`N>’$ÿHĤƤƤö{Œ=æèÕ®«]W»€1ݘnL¼wë½[ïÝ\n¸Üp¹PŽr”4Uš*M¬PAÔuuub11@GÄAåD·J·J· kkkùúM½¦^S﻾¡¯†¾úªãpŠÏ|ž>e>e>e°!^êG]0ˆA ° Û°Ô¬¼¸òâÊ‹ÚÊeŽ2çrÁ´rZ9­ä•±•±•±ŽÃ’Ar‚œ '`•îtÜÀ Üø1ñˆ£·è-z ŠvC»¡ÝÀ6ßí¼Ûy·“Óº,vYì²øÉœíÛ7¶o²>}”÷(ïQÀ ÌÀ pwj)“@-Òa]EWÑî÷GîÜl™¶L[fÖ§ó ®öÔöÔöÔrÚ†wÞix‡m&‡È!r ñkñkñk0çé›fÓl ˆ€ÙqøaÜ€ËááápwuuÄuâ:q]Ö§ô4=MO?™s¦âYgY}CºˆôáÎ_…sè §Ï]ÇaE¢HÔæó¿7«íííÅ¿î÷Š{EºaõéÕ§WŸÆ±[컡¦!4„†À*d ÙB6ÅAÅAÅAŽ£ëG×®çz•áÊpe¸6zþÐùI,KÄþ¬3²J+(((((ÀŒäQ8'rÈ™»‡¹{–’BRøÃ·4ŽÆÑ¸#5HG:ÒiQ­½Ö^kK¥ÆR¨)¥”RLKžhšmšmš-OJž”<)áz•ǕǕÇÕY‡­ÃÖáãŸ÷&ô&ô&NÀ@ç>µ(ñ-€¾,-P;ÜB&2‘IªWV­¬ZY¥Ý©ÌPf(3.LùLùLùðÆk¹×r¯å:;;z÷Î%K:—àï­÷ZïµÞ#)ênu·ºÅ@1ð¯mü~¿göŸ5‘šHM$}î´÷é†z™‹ÃïHlllll,ç°“É™œÉÉ¿Ž†Ž†Ž†â+‡ŸÃÏáw[Ph…æí¢gñÏâŸÅ/©2v»Œ]ìÌý²ûe÷Ë1&»Én²s™² ² ² ÿæËJY)+ý¦ ( àã9žã¹øŠ§£„—yþ@~'wóÑ€48òX «a5±}´’VÒÊÿÖÌmŸÛ>·] ••ÈJd%´‹KçÒ¹ôæ– Ê Ê Ê­±†>CŸ¡|/z‰^¢»èÔ[ë´üÅÈK¹ë,Ž<Â!â;H*I%©ÿb ¬5ݯZ®Z®ZN»¸An^.~&~&~vp¤{w÷îîÝÀ< 4N}Rc9ûGÿ\L:¼w ÛIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.5.png 644 233 144 3051 13755454066 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÞIDATHÇÍ–íO”WÆïF† .HÐvc-v›Œé–U² ­ÖJ ‰D2-‰àÊ´1êÆ¶´I«FÓMm¬b| Õn›0jŠiâÒAºw@uÝ@µ„¦ƒ™y^Îo?Ì<Ûþž/Oî·ëºrÎ}î爈ȢøWÀþ´ýi{Z̶ÿ>áOy-åµ_ý%f7`+³•ÝÚéÇÒdœÉ8c&l+nåϯIàÏç³ü²HçÎ/l…q{?T<_ñ|Ê’˜ýçkà ¸a¶]Üv µ¹µ™íð}×÷]ÁÂ`!$l+nå[õÞ||Ùÿ~Xж Íö_p&;“Eà™WŸy5gG,áv”zK½ß%}—¤ì`L Y¨ !¬õ`žmÅãùV½…gá[|LÀâ‚Å"°±jc•ët¬`ð¼³ìeŸqˆ… ‡ô€ñºñ:P×Ô5lØ a[q+ߪ·ð,|‹ÏâéI¥)"ÒP„±Iߤ?tÝ\¨ekÙ þn ®»®»!_~»üÛå`\ „VÓmº™³xTD…U8ÀÌp–³œ )¤pžÿ6·¹ Ì2Ë,€zV=û¯†¯_p…\¡#&Ì}4¾cMLû·ù·Ú`®´pO–Ÿ¬=Y‹ºé½Y|³8Á×;Ñ;Ñ;‡÷Þ{x/ :8tðç¦ÝÐnh7 Ð88ßj| uâ_W¯Â䟌ˆ1WÂö¼íy 6Äô¿é~ZÖµ¬}€ªõ]¯¬«¬#b]‘g‡³Ã w™¬ô¥ûÒE–®[êYêÑœšSsŠh>ͧùD¢IѤh’H{s{s{³a„EÄ%.q%„™nÓmºEjêjêjêDª[½ªz•È>Ͼ7÷½)rþȤüó‰º'êḎˆçìb˜3`»¶QÛ("/ˆˆÈb 8jF¨!âÌwæ;óEúÝýî~·HNYNYN™È…š 5jD’{’{’{D:F:F:FDÔfµYm™:7unêœHæîÌÝ™»E*·Vn­Ü*òËÑ'¿~òk‘©àôGÓÉb³×쑦×ôÚâÍßý6?ÿôóOôXÅ[$Rà)x©à%¸üðòÃ˽SœUœUœ©©©P±¥bKÅè»ßw¿ï>äÕçÕçÕC×ê®Õ]«aM÷šî5Ýþ‡ôºô:¨ú>ö}LäዯåVË-PS1=‰[©ùß÷¿ŒZ·Ò¸b\™#3çgΣ¢G¢F?LÓ×êkõµ0>7>7>¦˜b ¨]j—Úüüü vªj'èõz½^ŽñðxeÓJ´ Í\É]¿Ûï¶æYS‡Xs\c®±†þñ sæó̼96¥ÆÔ¨•¢RB•[¹•TêQ=óüíꊺj½zC½ ^V/3§râøË†û‡û\AW0äàÿ7ÇDPñɫʓʓ“§~O¿4sÆ\bòÓÄ'|êo1bNqŠSÀ4A‚ úU¯ê&âùÇQcMµë?è?ŸÅñ)w”;€èO'ÿãû¯|l_í{ìñ|Áþê*Ñ’«·IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-4.2.png 644 233 144 2440 13755454066 14745 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÕIDATHÇÍ–MLTWÇ/ 0%¥~…éP»iü‚T¦Zã§&H êTÆ¢!iJX4ÔlÔ5„Ö Ô&$ UÛ¦† |$|$j”Ø0l Ö¤"ŒŠD@:é¼÷™Ë{huÍÛÌüÏ=çüÿïž{λ„B,ý ˆwÄ;âS¢8þKÓnÛmÛýÁoQ\¯Cܾ¸}~Ëê–Õ¤^L½h<4±ZWþÖx!ÌüV>eË…iHjJjŠsÅð8¸ñàFÛ»Q\yì-ö–¿5(j+jh¾Ü|™¯`Ì7æ˜rM¹ÀÄj]ù«x•Ïš_œy…_Xܱ¸#î$%&% N·Ó½¶$êð×ZØ»g Od<èãÀR–J €zü¬Öcþ*^åSùŸâê¶3m§çÍóÚŠ<üÊÒËÒ_¤¨ ‚¥ ´€^ yGÞ Ž80±ZWþ*^åSùŸâêók[µ <6mNP3z§Þ `4ÍDd©l HÃa¬4V‚e¯üøM(ß—é2´‡H£OËÔ2‰€þHüË/=‰žD%°j—¥”Bña ØÇìcE0¤é@€0Îg ò1E,”^éµzÁ ^Xù¥_úB )´ø}O §ô\=—`ÌšÃ?C¡˜üQ=1aõ¿CñÉâ“€0²@Ó4 ä²SvF­#]#]#]pûÀí·˜¼†Ïð>®\3¸ÎgœÏ8Ÿ}õ­ï[oê—/"Ña`FñÅøczbÂúJáÊô•iˆ¾‹ü‚Ÿõl=›°¬—Õ²Ú$ÌÖ²µl v4ìhØÑÀkσ„ À¡94‡®rW¹«GGG¡÷½Þ´Þ´9÷°ñCŒOñÇôHéNé–M0¶yl30ë£Yí†vÃ$¬*©*©*qI\—`×þ®ý]¯ kµµÚZmPv¢ìDÙ Ó¾®]ÿº~¨ý£ö^í=Ó®¢þÅøcz¤&§&ýàõ‚‘1×ö´··C–;Ëå†c7ÝkŸ§×éuzÍ^®¿P¡þÌzg½³^¸›y7ón&,Ù°dÃ’ P,–!à ø>0>7‡€'²Q6OÞ¸c¯œ±{ªæÆaã0áЧ¡í¡í€'N¨í©í©í÷ˆ{Ä=Ïëž×=¯ƒ­m[Û¶¶Á©[§nºöëöëöë°eÕ–U[VAJkJkJ+4v5^k¼fž1½ágì•®d®+£ƒ±“ûÜ7»2Dˆ030303¬`+`¢r¢r¢‚¥ÁÒ`)ŒÃèãÑÇ£áÙ×ÏŠŸC(.”JG‚QaT¿¼µ+-sL …çÞ(‡oõQ}” ì‘/åK Ÿ<ò€NsšÓ–ÚëèèóNC˜°GŒ#–9¦ææÿϱ·LþˆÞ­wÇãD8ÃU®"y‡d’)&™9)'å$ð< Ûe‹lÙ+§å4R6éÉz2¾Ósõ\K~Í“àIP;5oò/Øo傽],ØûØÂ¼ÁþN«¨<°IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-102.png 644 233 144 2721 13755454065 14745 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷܆IDATHÇÍ–ßO”gÇÏŒÖaV*Á˜&ƒÊ4!:¥ÚŒAÙÄ&Ø 5›p­Öd× ”¤­MÈS[£v·±´¦l¢KJZ!XkÒ;;…-^¹ØBdLØ@³0³™:ʼ?žO/†—wZÿŸ›Éùõý~Ÿ÷äœyDDdýò¯€³ØYì\—µ'l^M^͋ײv‡Ž×¯ÿçoPðYÁgžNO§9iÛVÜÊÏ­±ñsù,¿¬Ûáºîºî.ÛïCýËõ/çmÈÚ÷M÷ÍG:„úB}ß|ñÍüŒ>H“A°m+nå[õ^.¾¼ÿ;~xnà¹ÇÁµÆµF6¿ºùU_s6á¾8xàçU?¯RN0€|òUH‘Â:ñÛŠ/ç[õž…oñYüY=EUEU"pèð¡Ãîe &¿„w¼ïx->í&pŽs䃞ÒSƛƛ,RC8p€m[q+ߪ·ð,|‹ÏâÏê‘ßöö{QukêÖ:€6Ƭ1 f¾vR;‰¦î¨µ€²$«?ª UúŒ>£Ï€jT!Zù‚¨ªZU£ôÉÌK™—ÐÌqmR›\¹ðÚÚ`.óÛ­ÙÚŽîžuϦVCt}t=ð-¯CÚfm3iú¸Ï}›RJ)6²‘9þãç8¨ jƒÚ\äçrâÍ€ ­þŸÅ‡è¦è& ížvO§V[z–…u Cc[c0_Qgµwµwí‹_ ]yëÊ[‰Eb‘˜ÍsoôÞè½Q¸\x¹ðr!L·N·N·ÚñImR›ÔàÒ–K/\zÆãÇæ|ñX–TcKc‹ÕÚŽáeaãoÓÜ}¬ûØJúŸõ Kþ%?KGÆŽ„„í†ß.¹]r»´j­Z«†ññq(»Zvµì*lll@¸-Ünß oÐ7UåUåUåP|ª8T‚{‡ÃÃa–,>³ï«®¯º,aão ¬\7¨®s9öcìGû¦ÿ“Å'‹Ð³­gkÏVðVz+½•0¶vlíØZ¸Q}£úF5ì ì ì Øu{Ó{Ó{Ó°OíSû\È¿!ߎû'ü?ù‚O#ퟷnûC³Î~–ÏóžçÍ ˆÏÅç€ï²c¯ºÍOÌOìÂ]=»zvõÀðžá=Ã{ ût÷éîÓP­ŒVFí¼ +è º ãhÇÑŽ£èLt&:ÁõGýQ6›ƒÍþøÑ{ÞËY3XH.$ÁÒã1ûÍ~Ç„úý€ˆ8DD¤HÊÅ#Y9zROêI- ´€ˆï¬ï¬ï¬È\í\í\­È|ý|ý|½ˆ2CfH$åL9SN‘²-e[ʶˆ445454‰Ü:|«áVƒHÞx^o^¯ˆÌ.óMÛŒm"–§H*˜ FîÊê;Cw†D䱈qìV…ªP2–°‚Ú‚Ú‚Z‘ǞǞÇ‘ݮݮÝ.‘Š3g*Έ”´–´–´Šìwìwìwˆµµµ‹Äkâ5ñ‘©©)ï‚wÆ;#òõŸzË{Ë%#›²|æÿ¾¿öý5‘=OMefyJfõ }žʇ=üàá g™°Ý:3jFÍ($º]‰.P‹jQ-ÂRËRËR Ì÷Ï÷Ï÷CÌ9§Ïé;»»ˆzâHý’úeåzKKŸšÊ­íà~à~Z SÆ”±Âû˜ÇÌc¤Ñøí9Å)N™0f"g¡žWçÕyà'8‘“¯¡e1”OùHÛøS#S#î”;õÔËÙüÔ¹ê\€¹²ù#FpMFÿdˆ!{q‹>ú@ÝUwÕ]`„øø(»XUšP(5fx šº®'õ$d—®6u«êVOžÚüÏìå3ûºxfßcÏæ öW_1 Š­ÿ…£IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-0.7.png 644 233 144 2557 13755454065 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü$IDATHÇÍV_L“Wÿµµ´,Jp’!ŠE—¡H–†c¬±i‚tˆ!#¾LŒÉæ‚cEgœqF³é‰1v#†¨CâÂ!” IftÆðÇ F4"Ú °í÷ÝÞßÚ¯_ÙËž¸/ÍïÜsÎïwÎwïé XýiÌ0fml¬ÒíV—Õ•õK_¤a§agÿ7dr}r=I.¹²äJxHÇÚ¾æèùãù4;C7XZ-­GŸ$w¯ß½Þº4‚è!o$Þ˜VÉ}mûÚHòzÃõ~AŽÝ»M’oo¤Žµ}Í_‹×òÅçÇÉñ¤ù–ù–a„´$Xr¥s¥ÓþeÄá±,Ù^²$_˜^˜¤‘$I1N2‰IÒAÒO?µåÃÚ~Ô_‹×òiù5>?¢dê–Ô-¹£bGEâO‘€¡&òÐòCË5>åÉÓ<Í$Rõ«~’•¢’ARöÈ’¤RÇÚ¾æ¯Åkù´üŸÆуÙßöÜ6r—e—…ŒT­ô’BAJ§zU½JE}.Š…”ò+y@àœ%=²[v“¤†Õ0)>§Ä)Ja  ¤"·ªÕ+¸—Sej™ª <·-îSÀ‡?’‰c‰cþ OOÇxЏVœg9ÃeÜÊ­q r˜Ã’ÙÌfvœ=À³´Œ‡á=á=œ‰åç°dŒ?ª'*ìâïäþãûÇ‚?’¿*J£ÞˆGß>ª{TG^H¹r!…œÛ±§™O3Ÿf’õë7Öo$/û.û.ûÈfK3šAü<Ð9ÐIKüG„Oçè‰ »÷5Ù2Ù2IÊ>’”ŸiÕz¿óõ%óròròrÈÜŽÜŽÜrgg‡|uþÕùWçua‡Çáq…å…å…ådq_q_qŸ~`ÜÏÜCî!½›¢Sã‹ðkz@Úºmݲ•ËË#Å'³;à~éu’œœœº=?˜Ì’—ª/U_ªÖí¡òPy¨\ÇééédYsYsYs\âQÙ*[I~¯"üšž€©ÄTÂu€ù¡ù¡ð|Ñ#˜ú+t?tHjKjKjClÙl ¶ ¨• ¢ÛÍæsðöÚÛko¯'sâÐälr69T¢•€ì‘/åKÀXk‚ ðæ›æ›HLÙ¦l®[„ÛÃí†A@-UK±Öðwq©QÖ±¬º¬:`4sÔ>j¼f¯Ùk¦r§r§rU+V­Xµx]ÿºþu=V›V›V ´,jYÔ²H·§ÛÓíÀ¦ÁMƒ›ù\>“ÏãÇF›Ñ RT*ÔRµÐô¿Ãï¸ÿ'àéòtÆCÀ½èW„+r=põ»ú¢¢Â"À>n·®€+à ùùùÀfëfëf+0Ý?Ý?ÝôÕôÕôÕÅ«‹W¯Ö;Š˜Á ™RH¢|Qþ˜ž9·RÞEõ©>ýVÊ÷d²L&}½¾^_/)È#ò)SdŠL!½‡½‡½‡IùD>‘OÈɬɬÉ,r¦k¦k¦+îlurˆC”ê„:¡Oÿ¸•qsL ës¨ˆÕ➸Ǚ°O¦É´¸AzFž‘gHV±ŠUqÄ *qøsîåÞÿ=ÇfM~ë.+IAF'ÿñ€äoáeáeTä]ùN¾£dÛÙNòoúè#å€$'9Á ’ïs)—’¬¡›nJ2|,|Œ Ñ-ºcUôÆøæNþyû_9o_óö=6?_°ÿþ°ç­ßX*IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-10.4.png 644 233 144 3005 13755454066 15022 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܺIDATHÇÍ–ÿOUçÇ?÷‚^©x)î.¶S¼DSíEØDÛ€ Jc[J#Æ’ŒØ!kÕ-gИ8HŒIç/6NÙ‰ C¢™•öÆtP ±a ) #`™¬"÷Šxù~¾<¯ýpïáܵÿ€Ÿ_N>ßÞïÏ9Ïó¼Ï# ""/FžÎ5Î5NwØwþÚŽ/Ë_–ŸÒö/à(tö†„ kkÍ{¶oå­úè~?šÏŠË‹b\M®&Gnį‚}©ûR—ý<ìÿ±âZâZ¦u(»QvàzÝõ:Ã]?tLäNä‚í[y«Þê·ð¢ñ¥êGü"°äÖ’[ŽàZêZ*¯ìze—÷h¸`È o¿õö[cÆ('ã@<ñ*²@”oå#õV¿…gá[|xÏÏxwÿ»ûãþn¸wŽ'O²ø´à,g‰=¤‡ŒŒ˜Õ®ÚpàÛ·òV½ÕoáYøŸÅžÇ^JSDäüNŒ"½H_¨Ó\¡y5/¨6ÃcxÐ" ¥¶©L• úˆþ½þ=¨cê˜:†m3L2 < ׃Yj–¢© ãsãs0W„ñ¡h®hxá_\ÊQ‘W?…¸á¸áP,LLãpÃÜhndf‘p=^¼À*V±*j>|À6°ŸÚv¶³Ô¯Œj£z¯€é/¾ˆ Å…B±áÁ^ý4òÅ.}ÍÓò²ò2P§ÌÍ^MYMEMªç¿=#=#6Ïý®û]÷»àâÊ‹+/®„ýúôÛy5¦ÆÔ¨+ꊺbLJo7üê«}þÝþÝVÔÜŒïPÓ¡&`,<)"ò¯ h|³ñMÐO¨ƒ:‹bÞ:"wÖÞY{g-hyZž–i´@Z6µnjÝÔ ëÚÖµ­kƒñÜñÜñ\{s¹ÇÜcûyzÞ³¼g}éõ¬×³˜¼ÆA³¾þ³úÏ€Žð<Â'îwj‚G×]ƒ…RI…k&&!)');)î.¿»üîrhÎkÎk΃ŒôŒôŒt›0s>s>s.—\.¹\òÓ•<êü©ó§@þ*µR ïý­ðXaÔž4 ž}xr׸kT“S~ÓÓÁkÒ;;-²¤Jz¥W‚ûïH8 ²ú7«?Zý‘ˆ¶EÛ¢mÑ2´ -C$¾1¾1¾QÍ]ç®s׉ÌäÌäÌäØñ›ëo®¿¹^¤¾»¾»¾[ädÒÉ5'׈<þíã /,–víuí‘ëNÝ©óZ¬f‹Ùâè§¶YÛ,å""â±:ô ý‰þDDK×Òµtoµ·Ú[-2š6š6š&ð|ŸÈTÚTÚTšHrQrQr‘ˆé3}¦O¤·­·­·Md(e(e(Eäéò§/<}Adäш1bˆÔºë_ªI<Cïô½Ó'bîÐCzÈÑï”ØÐ®Ð®žoe¾ývûmÇ/EDø02×BÂÞ„ ;EfggE¶º¶º¶ºD²ÎdÉ:#â÷Ž{ÇEògógógE¶ù·ù·ùERO¤žH=!R|¤øHñ‘é¹é¹é9‘ŠüŠìŠl‘œ¾7Ž¿q\†JÆJÆøP~vëå[/‹Ä\›©œ©ìùÖ>•Zyey%ðëT~ÓŸL6L6 ¾Zh]hÚƒæ 9ÁÎ`g°T¥ªT• <Ê£<ðü?˜+ÌaÍ Ûœ>œ ¢žíž ‰:•_”;Ë–à^úZ,Ý€¸±¸±P, L L-â ™WÍ«Q:ö;sÌ 4ƒQòpNSç€RJ)ÚõUTQªS}£¾ŠÍ£æQf¸ÁÿÃ@Û@[”Ž=þ?AE”W½ó~Œ­ü¸ôQ}ø“1kÌÚÊÏMšiõOÕ­ºVZiž$j@õ©>àß‹Êÿ±ù1UF‡Ñ,µ”?·ðcå~ÿ•Ïííâ¹½=Ÿ7ØÿK·á-D´5IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-37.2.png 644 233 144 2714 13755454067 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–LÔeÇðÇÝqražåXXÒÆÍ¤-6Ôµéå¯ »†É±+Ðl­•[I,Wþ˜Qk²å¢ cj“¥µÅ0mE§ryúî¾ß{^ýq÷ô½Ù_ýçóÏwŸ_ï÷{Ïó|>ßG€Bˆ´øW@rFrF²#f'¿`ú­ë­ëý"f0 除gúß„û>ºï#€¹s£C¦­â*?±^?‘OùEš0–KK’;nצÇ7=n³÷tÍgóÝÑ¡üxùq€¯š¾jâ%ôz&Ün0mWùª^á%â‹Ú»ø…€Yí³Ú“~ËlËl!àᵯÍ|9–p% ò òþ˜ñÇ ™ Æ(0‡9Ò „¡ÖX‚­âñ|U¯ð¾âSü1=œ«œ«„O‰§ÄöY¬`ès¨|¨ò!Åñïò.s@é!£Ô(ed—ì ‰$0mWùª^á)|ŧøczÌ£Ô„bï(¼\x¢?D.è‘ù‘ù _ÒkõZ"r”E,BêýŽ~ŒÍF‰Q†ÃpOK·Ú§„%å"=WÏ%¢EŒ<Ñ®¾â3ùÕQžBˆÇêÁ²…B3eôò…Ë€wÈ™#sÐ8ÉiNå”Sž@&L8ÁÖÐÐÉ19<‡/€\'סñ~ _ã|q~ºbz×…âÀ7’ O…GÁEŸøñ÷Þ‚ÞØóõž3{Î ýø÷ù÷Áˆ}Ä>b‡ú@} >‡Æ‡#–#–#8{ðùƒÏ„_¿º‘r6å¬l07unjtëèÍÑ›fÛÿývp[plX¶aÙ†e°¸vqíâZ***‚pM¸&\ ý ý ýÐíêvu»LbÃi8 gÂQ–——ÂÒú¥õKëÁýòªâUÅ íŒLD&ƒ‰A†ÒDšˆ Ù22 [ \®‚ýwÜ ëjÖº×&tWæÅÌ‹™¡õjëÕÖ«p´ìhÙÑ2È­Ê­Ê­2ó¦ô)}J‡ÀêÀêÀjèÍêÍêÍûûû¨Óên×݆PÏ­½·öB´8^ø{àÀÀ5G³£Y¶iQw¬õ©Ö§àÏ7¦ÖL­‘Þ'×e_ϾÎô¼_æõÍëO»§ÝÓn (¡„`Wõ®ê]Õ¦ßôýAXÞ´¼iyìtítít­ÓÖi넜9Ž8ŽÚóìyLy©ó`çAé…o‡ô½ñ;ÿ—}Ù-3·Ì4»$üþ¤{Ò ͺ¡ÝÐFƒÑ`4˜‚ÅÁâ`1h]Z—Öeú£+¢+¢+`¼¼¼´íÚvm;Œn--ƒ‘k#ƈüó•kÞk^˜ü5Æ[Ã[ÃÀæxWrâ®9v.6WägÿÎ1¯ô¢ÉÙò~y?È  Ê`Âí.£Œ2þÇ’™2óßI—wÍ1ÔS>­&ïÆg¯D.ÈÓzPŸ#Æ…N*V¬Àk¼Ê« ¼ƒ 0òV|°QGRžÔ Ý "¿5RŒŸÇðÙWøVá[Ó‘8ùïÝå=ûº¸gßc÷æ öÇôka<ÖŒIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-0.0.png 644 233 144 1367 13755454070 14741 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.1/web/www/routino/icons/limit-25.9.png 644 233 144 3034 13755454067 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÑIDATHÇÍ–ûO”WLjÀÈ@K`;­E@–f­ŽFâ-Ñ&#-êĦ µ)%. %½¥$Æt·a£„êT¶õº˜l¤Uh·A2®—¸¶ZœØX§‚\”‘±3ó¾ó|ö‡™73ëþž_Þ|Ïyžï÷É9ïó=GRJ©'#_ñóâçŧ…q|et>¹(¹èÏÿ ãfâ^‹{íêGðÄgO|~$ýHè§(6ÖøØ|¥¢ü±zƼzRE'’Ú“ÚãÖFp=¼±øÅÉ ã}gÁä49g4¨:Yu óXç1ÞßÏý~`jíÔZˆbc݈7ò ¾X~Uÿˆ¾R0»{vwÜMHJLJT r^Êy)ï½pÀH¼bÅðÛ¬ßfI<èw3fY xñbŒñl¬Gâ|ƒÏà7ô ýp= 2m™6¥àÕ7_}Ót8œðS+ÔfÕfzA'°›Ý˜Aój^½T/ÅrVÎGD±±nÄùŸÁoèúáz¢G9¡”R …P•vðù}~è2}“ñMÔ¾_³¼fyT`åñ•ÇW‡G‰£Ä–!ËeŠºŠºŠºàèÌÑ™£3Àîp'šçhp48`Í­5·ÖÜŠÎŒ/ýzé×pðêçîÏÝ?€¦Ïù~Î÷Ò®ÐÒMé¦Ð²ãî[wߊ¶ýµÒŸ_þùe°Z¬«6m*ÚT=9=9=9Pm­¶V[áDë‰Ö­cͱæX¡ÍÕæjsE ©©©€‚Ò‚Ò‚R°ï°ï°ï€Ä³sgç¡ô#ù˜qÐ}ºt•š–šúQ…N˜·™·I;Ü»}ï6 í¹æ¸æ€9–dw²ê¿«ï­ï¸“N9O9O9¡nºnºn:ZÀ*Y%«ö7íoÚß333àZèZèZ›K6—l.–‡-¾<½ì©ÀSè½ßì GIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-50.png 644 233 144 2457 13755454065 14675 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜäIDATHÇÍ–kHTiÇŸñ’ ƒM¢•`±›Â‚ö¥•°f8db5Ñ.BËDl¬B±‚•]p[%6ÐÈÕJ¬/›®&¸Ðˆµ²¤5ˆ³&ËûÛ3gÎìn-ûÑ÷Ëá¹ýÿÿsÞç}Î+ ""®ÈS nMÜš¸Ô°wÔö'—$—lø>l_3ÀQî(ù–7/oXqkÅ-ó…m[q+?¶^ÄÆå³üâÛ‘Ô‘Ôá(ŠØõP™_™Ÿœ¶û!¥3¥óǺŽuÜk½×Êçxx 0[4[¶mÅ­|«Þ‹ŗúð‹@âÃÄ‡Ž HZ–´LÖ¯+Ω 'ü–ež2Àdüd¼Š#8qª" Dkýc[ñH¾UoáYøŸÅÖ#¾+}—ì?´ÿPÊ·á‚·áTÖ©,‹Oë.p'è!=`TU,‚êWý8p€m[q+ߪ·ð,|‹Ïâë‘¿ïí7ŸBErE2 hƒ`Œ#À ™kæ¢_íF;ÊØjä¹`0Êrà<ç9ê3uBýW}Dõ…º©n¢À¼d^BcÁxl<޾ð`”/Ê/±‚6]”@J ”cƘ(JÁôš^ðG°þ HÐÑÃâ#k [جb«büy¸q›© Àl0XàO ?Âå뉻ö?wüœ…f~Âwz“Þ…WÚÏÚ€6­­­pµìjÙÕ2¸~æú™ëg Ôê õÂxÍxÍx 4g7g7gÃÄèÄèĨ­S+Mi¨˜-óEùÃz"žùàÎܹh¹WõF½‘EË3Û1Û1Ûþ †öæíÍÛ›ÞƒÞƒÞƒ0ìö {`»c»c»òWç¯Î_ î>wŸ»‚ž 'è‰Ø¥ÐXøÊkó‡õ¤>I}¢: P(° M¯±ÉØdÛCýCýCý°#aGÂ(**‚ÅŠCÛtÛtÛ4l«ÝV»­Ö®+|[ø¶ð-Üh¹Ñr£Åöûõ•úʘ-ò‡õ$ˆÄ—Å—±U$ñeâKG¤ódF6ÈÙ#é–Ã|n>7Ÿ‹ñññ‰ì\¿sýÎõ"uë6Ömqºœ.§Kdm÷ÚîµÝ"Ò Ò ’z7õnê]‘ʼnʼnбעdI–Ø|’ØØ-é"ñ›ã7³5NļoÞwŒŠèûô}ÑÄtI¿ømœùùù‘´ê´ê´j‘ªÌªÌªL‘´Ê´Ê´JW¶+Û•-xxx%2œ NEBZH i"îA÷ {ÐÆs<“viá‹òGô|´ÇjõL=Óî±É©É©É)(|Sø¦ð ¸ÎºÎºÎBu{u{u;¼/}_ú¾7n:ÜÎg³NûNûNûø÷ºbÿÙc9•Ö©yÊk^G† j£Ú(s‚9Á0/šÍ‹1½9oΛó0ãŸñÏøÁœ6§ÍéAÁ°”>§ÏÅò}ðT~`޽‹Î±³…5¤B*j*²~4j·Ú­vƒjTªT–ÊRY1ñ¯UªŽr™Ëf½YÏÚÿšc˜üÖdÖ>£Àô™>4é¡¥~TÔ#à6m´Å|‘nºèõ‹VÃÀŒ1†ó¤y Ëà|ò/Ùå’½],ÙûØÒ¼ÁþLt¾UvHËIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.1.png 644 233 144 3005 13755454067 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܺIDATHÇÍVmOSg¾N* V“?¬Múa5“d#C£$L˜D#!j™X×DÆ…š˜h—¸§Æefdg“e:£‰Î—"TÚ%nøkƒ°Î"í9ç¹ö¡}8dÙðùÒ\÷Ûuçܽ¯ç ˜™þi²›ì¦)lúÀ°O­˜Z1ç‡nÒHe²æÞÒòµåk’œõݬïôû–~?90êOæ“vÌ„a0·š[WûÈÚµ ¦¾–Â_Èì3Ùg^¨¤ç¬ç,IžöŸös+ù,ø,H’Ï]Ï]¤¥_ÆË|Yor}øþÙ2/(Hs–9 åŽò‚RᲺªºŠ$g<Î&’$µÉiœ&\$cŒQžè$,ýéx™/ëÉú’Oò§úi]n]«×­^—}<•pÿ{²ÑÖh“|É3$÷s?§‘jL‘¤æÖÜ'E@H’ ÒÀÒ/ãe¾¬'ëK>ÉŸêÇe® ×ö¯í'õ^’LvªÉ9É9¤p¨o©o1™îTˆ:Q+jIõ®zG½Cêú€>@ã¼äßü›LgR/ÑK˜Ô§«‹ÔE¤¸•ªOÖdÖd’ŒH~9ÊŸà¯ÈìXv,6Eèýý$?!IV’¢P2Î'â)v‰]b)4¡ mR#‡y˜‡Iæ3Ÿù“ì­le+©´€ yIé!ÆÓÞJªýþ)ùS½ñ8M‚®þpµ¬¦¿Ù3p§úN5yhñ¡w½CñðÀÃÏ~fð…g‡g‡g“›6l&o{o{o{ ¿ˆŠ¨ˆ’b§Ø)vöfO³¯ÙGÑSÜíìv|â}OØ–£mê0éàís ªêªê€®÷~ý÷ו¢e'—…—…‘¸YtÓyÓ ¥ò·Ê{•÷€®¢®¢®"À»Û»Û»¸±ðÆÂ ï˜wÌ;ôøz|=>@±*VÅ ¨ãê¸:¸»Ü]î.ÀÓìÙëÙ å™{0g0‰ÔÜ”"ñéÒÄÒ4Þ>gR<¹#¹#‹ŠÒœÒ`ôüÓá§ÃÊñ-W¶ý±í˜ëÿ¬ÔGG¡£ÐQ´5´5´5V>Zùh%`;e;e;Tl¨ØP±°åØrl9˜8bŸØ'ö«¶¯Ú¾j;àxæxâxèvºè‚9ÝØqä-_·|̸>ãú¢b³¦Ïš®÷qjd82l¬ýèÞ‘-#[Èò#åGÊ%–K‰…lœÛ8·q.9/s^æ¼Lòèæ£›n& Z Z ZÈvS»©ÝdŒN ªA5hà’%K6’§õ¶Á¶AƒO‹ ݺOÊ~Lúk‰[‰[J^ZXG.ÓùM'¬µjíƒÚÀå—w\Þh×´kÚ5 ÏÖgë³y¥y¥y¥ÀÖ[Ol=X:,– T* •£‰ÑÄhP»ÕnµÛø‚Ép2” ¸Šc86a¶â…Z¦–€~^?¯ô™LÿŒÍ›÷ =Øj¯Öûê}lþ5r2r ë«Çêìš]³k@Ëú–õ-ëG¯£×Ñ äæçæçæÎFg£³¨rW¹«ÜÀÿÿ?IF’‘¤ÑX®?·)· Èœ–1˜1(ÿclPÞ d² 抹îþ¹¼ââblIâ‹1ט‹üË<ôrè%ÅĺˈÒCdtOtOt©çéyz)*E¥¨$£þ¨?ê'õÅúb}±‘7ºmôóÑÏ)ñ‹ñ‹ö®ð®0¶<ÿ»šÒ1q|BÇêDã¢P‹bRT‹jQM §p §A(ìÂ.줈‹¸ˆvŽ1ÎɘÂ!“tŒýÁþàÿé˜Tþq©¼55$?N)³¸¤Ž¨#$iOµ§†òó4ä¤èH_A~úé'9Âç|NЇ¢Wô’|0¡ü›ôML2K[ª-%ùí„ò›k̤Á?q‰¿²wå+ûºxeßc¯æ ö_Åέ 0úoâIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-21.6.png 644 233 144 2715 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü‚IDATHÇÍ–oL[UÆOí`ƒ‰Û\Ì: SDã( a1`ü“Ì„ Uƒ—Œ¬›Ñ2‰ù0Ãt (›À,1ÕÆã0`cfX¶,d˜(fv¶#¬lÃvEÚ{ïùùáöî¢ûâÇ/7Ïyßó>OιïsŽ!„Ùɯ€”õ)ëSVè8e§9ŸñLÆ3÷©ã.,ÏYž;÷¬ütå§9=9=Úq#éz!ÌúKùŒy‘-̉tOºÇR•Äû᥇_z8ã·ƒÕgõÝTÀõ­ë[ïÞ/x ®œ¼ràzÕõ*0±7òõF½¥õÅþÿð w Ü5`¹éiéiB@ÁSOÙ_×~³Cõ³ÕÏü¹ìÏe2Ô«@&™² ˆÁá%؈'óõF=£¾ÁgðëzäVæV 5µ5µÖÏõú`_Þ¾<ƒ/áp€LP"J@ݦncä°À‚LlÄ|c½QϨoðüºó(ç„¢íIp^s^¹ qB¹X“XÚω@"@"©T’µåšM³•£rs\!@à’Ò¥¼«¼KBOä$r@»¨×ç%ç% bðG9$„E‡Á±F"©rnêÄÔ `;[A–Ërb|N} {e¯ìuNSç>|KEþu´°ŠU¬ù‡ Ê €|Y¾LŒ“õHò%ù9¥ëIîX×q9¸Ë²ËrkÌ;þüyhßОݞµÚGíÜ6ŽÔ©=R gggæ¼:£Î¨3&ž~mºaºÚŽ´u·u#O7œš85aòaÛU·«øC×#´ÍB1ÚýÝýÝpî‡ÐÁÐAY¿>¶®k]‹•áÊ@eòÇóÇóÇaØ=ìvƒkÊ5åš2{z°c°c°ãvás…s…s…PQTQTQÕV7W7Ãcµ%ñ’8‹ãŸ]n¸Ü 롦´]PÏ,o_Þ.=[Œ-BÿÊïïýþ^Ø÷Fcic©IP\S\S\­J«Òª€ÿ˜ÿ˜ÿäååÁ€À?à¿]XßѾ£}Ga­c­c­ö~¼÷£½Á;ß¼ýæÛoµìèºè:€Ùèläå¬Þ¬^é(9Ö«6!ߺúÊÕW̶ŸÜvñé‹OCÉá’Ã%‡¡Ê^e¯²ÃÍÍ77ßÜl—ï,ßY¾¼šWój· ë‘=²G†² eÊ ÓÕéêtýëû:îë€ï¾Z=´š0ÄÏÅÏ:“ËŠiBsgîÎÜ-=p#x#¿œüdò°­Éø=ãwhy°eSË&ˆ4Gš#Í –©ej™I\º±tcéFðy|ŸÇœŸ™™O§ÀSÅÑâhqÔŒ?úÞ#O<ò:ÐÙÞÙ??ŠjûÑö£ôånã|hð!èÉêŸîŸ–õ)'…‚EG«c¿c?¬¨[Q·¢Ü#î÷ˆI°Å»Å»Å CcCcCc°[ˆ-Ä °¥°¥°‚` €Ý;ºwtƒ-n»a»/N<ßô|‹ó¿ÈzðX=VÞä?F«ÞÐÐÔÐûõ.™=ò‡üZÊå#C{Bõ¡zX.‚¦°ùÜùÜù\H8΄H#47…›ÂM ÖNk§Aº¥[º!üNxOxRý0þxüñ%]9¹Û¾Ûnn×ñ¤]˜>†¯Üò1»´ãÿŽ8qâKðv^åUÐ"2U¦È YALê·ÊV¹0565`·ÎGRùé_>fÜmOò¾³ÑÙ² qBލ™j&HU¢$ø€LçÇ‚@}ºÕ VNÈ3ò  {™Ä¯¥ké$äqå/å/ S¯/¤¾ ,þ×ùïÜ»òŽ}]ܱï±;óûUXqŸs2÷IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-13.3.png 644 233 144 3033 13755454066 15025 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÐIDATHÇÍ–íOTgÆï^Çð¦3SÚ‰``14­în—¤Ð ¬6L$V0Kb*ˆôËn›6ÉÚ©‹fCÍ"Í®4ÐZ-­Í® ±Æ¦±u`ËbÁ:8EÆáEæå<¿ý0sæÌö/ðùrrÝ/×uŸç9÷}ɉ=Ìv³ÝœÅf§aO¯J¯zþL€©ÆTsg?d·g·¬v¯vkcÖýz|b¾ˆÁŸ¨§Û%G CÚ¹´s¦òþjKjKÒÅGúÁÒké] ƒëS×§=§zN±~úú§¯•?*ë~=^Ï×ùùåƒ_è‹@Ê¥”K¦ÿBZjZª¬Û²nËú·¢ëÁñšã5€é¤é$e€ÈC ƒ U /_Öý±x=_çÓùu=]?Z€­ÌV&ÛwmßeéŒ&ŒýÞ~îíçt½P/pˆCd@8Dê#õ¬€êWý˜0u¿¯çë|:¿®§ëGë1ŽRùk‘ááxA×µŒP~(ÔÍȳ‘g ÅJûNÔ!|/<žU¢JT ÆzŒ_)m2´Z"þ1ôLèPÏGùaÇÃù˜~ü(gDDŠþ–IËd ™‹ãyãy¹ À6z´"­ˆ¥¸ÂŠZT‹ÀAr0¡‹\ä"PO=õ†Y-«eµ ä‡T™*c‰Ïbüžëžë–€%Hæûh=±;>À|“«Éj?€ö¢Nܱ«ÃÕáB  ¯^o  @[i[i[)xxx~í¤vR;iàÛS·§nOAÛïÛ6´m@y¼c§ÆNÅ£_TWÓÓõ£=> üFDdðÏÐõj׫Þ þx½®±®‘½E†††ànçÝλYYY 5í5í5í`Ÿ°OØ'`üØø±ñcFA7ónæÝ̃œ£9GsŽBM{MkM+ØGsßÍ}—•ÿüýÑÞG{Uô&÷&ƒÖ­Ç,µYÛ²¶½ô²È+®W\"êcyA^0uV»:>”4ûìUö*q‹[Ü"W=^õx•Hótót󴈳ÁÙàlY3¹frͤÈbîbîb®Ä×üÈüÈüˆHó@ó@ó€ˆs³ÙÙ,²ÆcÓlš¤-›½?{ßÔ)RþEù"’‘ñ~Æû/½,°:su¦6JŸ¯Ã×êŸñ¶`óîÍ»7ï†s¹ÇlìÄœsÎ9ç„­•[+·VBQiQiQ)ŒXG¬#Ö„oï׸þþþ‰ñ……pgÊãð8ðÁâ‘Å# Ýɺ—uO5KDëÕzM£bmm‘ߊˆˆMãå·–÷-ï±9l›Cä´vZ;­‰Ôúkýµ~‘¾Ë}—û.‹O>ù"W ¯^)4vìpñáâÃÅ"u9u9u9F¼Ú¨²T–ȪÓ7¦Å&’r5媈úud"2a5Kr`K`Ë­od¥¿¯¿OÄô;ÞŒñ³S³U¶y’ô$éI’ÈÎÖ­;[EæRæRæRD¬'¬'¬'D6uoêÞÔ-R±¶bmÅZ‘g7žÝxV¤¬²¬²¬Rd¡k¡k¡KĺϺǺG¤¤mÃÞ {%X÷ÃCo ñ¦È…Ÿ/ü,’ôñrÅrÅ­oŒ® 5½×ôð£Þ•‘¯"_ÿ¨¿Ûß î¾|Ç8¡`u°:X ÞYï¬w´­EkÕ Tøê}õ¾zPçÕyuBÅ¡âP1xï{G½£¨ÈÁ‚]ÉXÓº¦u‰]I|Žy-Þ@2x< qým,hZgÂû—úR} Ê­ÜÊ0¯RUªJ5£fÔL‚ý3uA]åVŸ¨O”C9XRÉQ~å÷ z,~‹?Ì¿ÿoމ b“W½žôz’1ùI Ï„g€ã‘¥È’1ùù-´€ú\]R—€3œá 0Ïs FÔ-u+ÞFŠ¿D¾|KH}ãëÐ'Loå—“ÿéýW>µ·‹§ö>ötÞ`ÿ?Õø,EÛÖIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-37-grey.png 644 233 144 6271 13755454064 16006 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü nIDATXÃ…—kPTǶÇÿÝ{óà5Œ–ˆ‡ 2™AA|âá¥&ŠA¬è) …D ŠÂ€5p C¼Þ Q“º7/†ŒH5бb”ðQsAA†˜™=»Ïfà”U©ü¿tuïîµ~»{u÷j’ %&d˜(è þÿˆÄj²¿Ïþ>û{63·/·/·oUób^Ìëó÷ÁGð I±TYª,U,§q§É^ÌÁÌÐŽv´HA RX¾t½t½t=ÙË?ãŸñÏîœ&Cdˆ í9•ããã]×’———@zÁ_ð'k&8Ä.% CÂè1WÌsÅV“Õd5ÍXœ«ËÕåêÎ<±öZ{­½µ·Ì‹Ì‹Ì‹B2]¹s=†ê•!+CV’½¡’PI¨X¬Z¬Z¬œuçwgçx§½IûNÿN'ï˜Áטó`bÂGPÀ 3Ì‘ˆD³0 ³`¶øZ|-¾ˆi®o®o®g¶Ës.Ϲ’[“[“[³f±µÑÚhm¼Øè1â1â1Â4Ûº·uoë&Êbe±²TŒ£ÅhxÐ:ZGë0% `Va€Ld"À¬Á"DˆÿÑÏ©EX„EîáîÁh3„ ž|óä›'ßd¡F£‹Ñ…è]B]B]B׆r‘ŸD~ùIñN‹Ê¢²¨|ÃcJcJcJñû«•¯V¾ZIÖ‰ÅâF¸ÑjZM«þóýçûÏíËÛ—·/FÝFÝFÝÕÕÕ€}˾eß-Ã-Ã-Ã@_b_b_"пºuÿj ÿHÿ‘þ#@¿{¿{¿;`˶eÛ²!q{Æí·!òOù§üStü¾ð÷…¿/$±µD-QkŸó‚FК¿oó*ó*ó*CþüÈù‘ó#IúÑ~´œ–ÓràÁO~zðPÚPÚPÚ¸Q7êFQå¨rT ,L[˜¶0 Ø”¶)mSp)üRø¥p`   àïñ÷ø{€ä…ä…ä0X2ÌXY^Y^YÞT{sqsqs1c{÷î dl°f°f°fê»ù²ù²ùòT½Þ¿Þ¿ÞŸ±£ƒG2f0˜ØË29yœ|ŸâS|JæÐsô=7AÒÉMáPÌÕ˜«1WpÎÂÐv³ífÛMànéÝÒ»¥€ÿVÿ­þ[·Ûn·ÝnO“GË£åÑÀо¡}Cû€Ÿ3~Îø9ˆþ:úëè¯ù4ù4ù4À^a¯°WLù§[èºÀIœÄI2‡r>œçÃ~0.1.1.ÁCáCáCáCpä89NŽƒ!¡´qÚ8màžæžæžÜÒÝÒÝÒ===€4@ è ¤ƒ¼á ï)à:E¢Nh£µÑÚh xðþàýÓ3=ÓtÝ@7€9ºs¦»¦»¦»xHÕTMÕì*;$;$;$<ô~èýЛýДԔԔ`æaÆlõ¶z[=pïÒ½K÷.ããã@âÁ㉬ÇY³­!­!­!@Ó†¦ Mô¡}Às×ç®Ï]&Ÿ&Ÿ& ¬ ¬ ¬`êD£h¡„б®Ø®Ø®X@ߣïÑ÷à¿dee…±sNóQ|up_Ýýºûu÷íjÍ9Í9Í9®ËÓäiò4ÁxÖpÖpÖåw—ß]~ˆE,bŒlÙ4² àWò+ù•€,I–$K&jàþšûkî¯ÚutÖÑY€*C•¡Ê²²²{‹½ÅÞÆqA\HEWEWE—h¾5rkäÖU(ºÝŠî›m:›Î¦[ú%9ðÇ?ü  hø[¡¤OÒ'é»!---ŸUUUÉ¢Öº¯u_ëN®>»öìÚ³k`½ïõ¾×ûˆ2E™¢Lüâýâý⪥Zª°[°hllTV•Ue¼¯x_ñ¾29¡æû{îﹿÿ(),),)ÄùcùcùãñÕŒcãBþ¹˜‹¹­Ûyzšž¦§¹FÔ¢µ=¡âRq©¸4é+E£¢QÑx7roäÞÈeó|C|C|CHéüøùñóã±~fæÌÌ™™Pt’NÒ,Ã2,°Û±@ JP"Àƒ? h™>2}d:<ª»«»«»µ$M’&IãAŒÄHŒûʼn›­u;+`¬€÷u\jöЉ¼‘ÿ)$…¤ðj*]AWлª°;±“~y¡ôBé…Ra‡ÁÇàcð™4Š»ÅÝân'p'lÅVl`€ù1?æˆÑ"Z`q€zT¿_ý~õûöŒ¡ÝC»‡vó…R­T+Õ–æäääq9ÈA9‹Nt¢SˆvÞ¾®x‚'x"´ éH'UA?ýôcAœl«l«lkiÞPØPØPo(Ï.Ï.϶g8’Ùd6™ 8pàŒa c¤B  =è£å(éMýMýM=‹jø¥á—†_¸WoWoWïîqk‰µÄZ’õYKNKNKÎä±åéðóÔì(ωn¢›èϦ§MO›žÖtkº5=ë3W/W/W¯GçÚuíºvWP³©fSÍ&ERI*I…T,‹Åb0È!‡`Ãl˜ »cÏõÏõÏõ(­]P» v<]{]{]{q‰¸D\’õ=LÓÃÝãŽP,œÀak&/ gÐ8ž$RGÕ±D\ÁDìÚ3H #aQqOŽ+çm;l;l;ľ+¾+¾+ÒÁ‡ƒÆz±MlÛ  sé\:a¯°WØ éWÚ¯´_ií½K{—ö.å:d d d –Mlš]¿‰Eb‘XÄ:V6͹byyyyyy0N&^ކÉrÄn†#v É1rŒ»ú#¤‘4rW’‘Œdú¥Î¦³élÂÃ)Ã)Ã)((¥”R ;g¢n¬n¬nL4wuuq²ý²ý²ý-Õ–K¥gÿot¼ÑñàT;Æ)œ€SÙäKz©ƒÂaàWG잪 ª ª,ˆ“m“m“m+Íòòòá eÙeÙeÙö GFïÙ¬jV5«ð¿õõõ$^ѦhS´¢ZT‹êÞàßáßáß[® Õ„jBé ‡¿uŽrìe.¢ˆˆˆˆˆŽj3sa.Ì…|ÐØØˆÿ±¿bÅþÊ-Aª‘j¤š·¿ìîîVUZ ­†VößMß5}×ôýµQÛ¨mÔÆ¥KVHVHV|èËN±SìÔÿUOl6® /ð/ÄYÎpL”ð2Á_èOb75¨A=‡U±*VÑI+h­øE3;;+JŠ$E’"ÚÊ%sÉ\òåëÚ m…¶bU„¾Sß©ï$?‹3Äâ öîÎhþ3Š¿ÐK±ë8.ì9HE*Rù;$$„kZVÃjXÍžD¹ŸÜOîG[¹'ÜîIŸø¹ø¹øùާm›Û6·m&¡qØs&–cÅñol{GVðp³IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-31.7.png 644 233 144 2634 13755454067 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜQIDATHÇÍ–kLW†]VEi"VÁ¨Ø” 1,YªX/AdÕHõ›Š µQÑÔHª$†Újª/ ÞPë6Ѐª‰ ¶\ÔÕ`D­îfueÙ9O쳕¦¿=fÞï|ß÷¾3gÎ;G€Bˆ±«€ÐøÐøÐh?ýRG,ŠX4ùg?>ª@ÈŠߘ²1e1'cNªwt¬ÍkùÁõBèýƒù´¸+ô€Áj°†˜x¬NYñÿØF›ÑöÆj6ÔTŸ®>ÍWÐw³ï&À+Ó+èX›×òµz­_p±ç~!`D݈º¿À0Ò0RHX˜°0ékƒ$ÈYš³àqØã0 Ês Š(i\¸ÐÆ‹ ¬Íòµz­ŸÖ_ãÓøýzÄfÆf ¹kr×Oø 퓶OÒø¼6`/{‰ŸËçPÖ*kñ€l”„:Öæµ|­^ë§õ×ø4~¿})ÝB±˜íf;¨Þfß#ïdïdûL>Þ€R©IV£ÔH5d›l“m òºôHR œ08¯ò…·Â[¾A™Ÿ—§ Ü¿@_Ê«B‘|Œ.£Ë.U{³½(` ÈT™Š›ß¹Å- Ž8â@éQz” –Zjƒ”øðáã†L’I¸` øü~aɇO…âh“¤ · wè=¤Þ~ÔžÓž2Ì90i¿cï´w§©(¨(¨(€Û³nϺ=køüÃ㉡ìÓ²™e3¡âïã†ãä¹Q§ÔS*tºŸlx²AM…M¥›JAýÓ¯G(­BѶ j«j«à¥&>˜(-c¿=}ôt<¹ƒ¹Ž\$ÌK˜—0î•Ü+¹W–4Kš%MßÓ—Ê/•_*.¬ñ`ãÁƃ¾*}Uú*XöÛ²«Ë®Õy*:ª+«+¥êœuNðÕûõuF¤#Ò!­ðúâë‹pE½n¸n€âÏvw¡þ‡ú}õû -9-9-ZÏ´ži=5÷kî×܇ø–ø–ø¨k¨k¨kZÑ,_–/ Ô05L Óã•VÆUÆù\^a^aÐôöMè›”DgEgI«€˜Ñ1£Õn"ž¿|þRßöÎï…ŽBXœ½8{q6LsMsMsAGCGCG€ôüôüô|¨V«ÕjU+ÉJ²’¬cçççHìMìMì…5Å6Åê|jͳògå éJ쨮Q]Ò ƒ;wÀOWß8|²‹ššôÆS§L2u +:Vt¬H§–¤–¤–€Íj³Ú¬z¼»¹»¹»YÇG¢ŽD‰‚ŒO2R2Rô¸Ú¸¹×Ù F_‰¾"­B´o¬jnÕ\èýf`ÁÀi™™=ã錧xÆ?ß5¾ Ì6³ÍlG–#Ë‘¥7ž/æ‹ù.·_n¿ÜëÖ¬‡¤ÍI›“6ÛÌ7™o2aÝîu»×í†Ò¼ÒÏK?*÷(@Z8ß¾_³¶m;ÚįÃ7†ë»rpß[Ó[<3ôô •»Ê]åîð۹ŹŹ¼f¯Ùk '^,±üÅr=²Gö€s²s’s¸¯¹ín;Ô­êV Áχ²±xc±&ìh“à—w|ìšßWä Íg¤EZpË‘rœÒ!Ò¤Ì{È•þ{xð¡B¥Eiù—)vÀØgì ö±¡«9ïʰ•a@€·Y^ò9|à„Ò¯ôw~Fúßg9ËYàµÿ_)»d»lœü‰Ê.e^Š”ÙÊl­ØÛŒ/À7Ìùßßå{{ºxoÏcïç öx*|êÑŸÌ€IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-4.0.png 644 233 144 2441 13755454066 14744 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÖIDATHÇÍ–OLTWÆ/ ˜Ú°ÁLbch-#Ä…5‚S$È$šÔ‰ ¢Á˜¨Õè‚j,$-uª6P’±h`&º4¸kýÄQRE 3ã@œqÞ}÷×ÅÌ›÷íš»yó{Îù¾9÷ó®!„Ù‰§€Ô%©KR³â8u‡iÏܘ¹ñ‹?ãø¤„”Í)›ïý‹Ž-:s&çŒ~ßÄÆ¾áoÂÌoå3ì"[˜†Œ RJølY±eEæçqüó5°]´]|£ACwC7€çœç0~cüÀËÒ—¥`bcßð7â|ÖüâÐüB@zOzOÊ(dÌϘ/8œçÒ¦¸Ã£¥P¹©rÀÓ´§i*d°cW¥ÀS+dÁÆ~Â߈7òù >ƒ?®GÀâ’Å%B@•«Êeû=p¿våïÊ7øbZ°ƒ6¥MÈ­r+QP×Ô5RHû†¿oä3ò|\xÿl[7@mfmfRÐ “²WöèÝCL5+·r£ô%zžž‡¹&˜`„ʩJT hÿÊrJý ÝÓî9)'™D~j3j3 ­,G)„_þ ¶qÛøÔ<ðK¿¢”ƒ~D? ki ÔwÊ¥\Aa„-x9ËY䑇Ux!.\ÀWò°<—”ñ¿ñ¿“?®'!ìäuعç~@è«@Ó4 ÔoªWõÆ­#ÞïˆújújújL^ý–~K¿eâ‡|xŽçÏ=ž £C£7GošU#±;±;ÉèUIþ„ž„°šáüëó¯«ïùC–É2¢ê¤jSm&a™V¦•i°Þ½Þ½Þͬª Õ…ê ¨°¨°¨VúVúVú`ÙÀ²eÜ, –&ݣʓà3øzdõgõ« 0^4^ƱÈiíªvÕ$lmjmjmqVœg¡Ú[í­öÎæns·¹Û`Mõšê5Õ¦½øEñ‹âpÊ}êô©Ó¦]V¿ü =©B¤U¦Uòµé—Ò/ ¡Š…B„ÓìóœóœBôz=!:t>è| Äžü=ù{ò…˜¨Ÿ¨Ÿ¨BTŠJQ)’ëïïO{‡½ÃÞaÚ³º²º²º„ˆ>Š>Ž>6í"ç3ø“z>¬˜,¿G]GëŽÖmÚ6m›‡Ëár¸Ì^>ñüÄóÏ!º:º:ºº;»;»;¡ ¾ ¾ ‚ÁŠ`···ƒ÷ïZïZË»™ûñŠÍ~Çng®oÓ·|YY8pà€öÁöÁöApŽ8Gœ# „¡444Á˜gÌ3憖†–†°gÛ³íÙ°»ywóîfë_–~é'Ê/Ÿ|Ç>èÊd—$c/·¹mve„`rxrxr¨¡†}»¾]ßʧ|Êáð@xô ý‰þÄìJ‚Z@ X§ÀG»Ò2Ç4ÔM&(ç'9&ǘQƒê•zÔQE0Ì0ÃÀ>ö±ÏRˆFi=¬‡uË|S‡ÕeuØ!¯Ëë–9ó¿õ¿ýäûŸÉ“ý²@ß«ï%Æ!ºèBñ YLÇ¿jH ©!`œg<ú¸ÂP«5ƒâ/=GÏ!ò®¼ ÈDþ$߬É?g¿•söv1gïcsóûË5gÆÂ\ÉIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.png 644 233 144 2465 13755454064 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜêIDATHÇÍ–]HTiÇß™IÇéC“Ü$r6EX’¶¡„‚QØ2$Ë CTˆÍ!¶õ¦쨼X×Üjˆ.¶‚vƒÒ>´½ÔeBw·2ÅÑ ·5Z³Ui˜ÑsÎûÛ‹3Çsv©®=7‡çëÿÿŸç}ß缄B¬M¾ØÝv·=]·í_™þ´’´’Ï~Òí+*ØÊmåC q)ã@æµÌkÚˆiq#ßZ/„‰oå3üb­0Î;Î;¶â¤Ý‡¶Ú’ö‰nÛ®{®{ï8úà耻7îÞàkˆöGûÞ¿-Ó6âF¾QoàYñEãÿø…€”ŸS~¶M€3Õ™*lÚ½i·ç=aÜe¥e¥“ŽI‡´€ú7°šÕ²˜gã™¶ØF<™oÔx¾Ágðëzde û+÷Wº~Ð FnB0'˜cð-ÞÎqŽÕ Ì+ój•ZEdŸìÀ† LÛˆùF½gà|¿®Güwm›¿„Š´Š´%A¿S»Ô.í¢v‘E™'Ke)RQž*OAëÕz´ž¥Ž!ke¬åwå‰ò´¿ä*¹ ÚYí,‹$Ô°d‰ÏàVAŸ®¨+:¿"jDÞ°´V­•˜œ&›l –J*M!tÓM7H!…ú} …&š€|Ê)‡¤Àq?ɷįëI »ò NNhš×Xù£ì‘=ú÷ŒnÝ8º.ä^Ƚ ÃÃæŽqÿ¸ÜÍ-Í-Í-0 ,UÉ&É[å¥òÒÊgðëz’Â~;·foÍ.•Ñ^-ž_;rväìÈô“é'ÓOBÛá¶Ãm‡áØãc=×:×:×:ðGüæsŽ9‡E‡M¹©ÜüèûÀ©ìQ:”sKÄÇâCñ!xýèõ£×`Ê1å˜rÀÔ©S ŒãAà*W¹ Ó¾iß´Ô&µIm²aŽ9¤eð~ìT¾gŽéÏ^Ъµjbè `,Þj¨m^›×Ì_Ò-×Ëõ cä’  ]Ö.K"~pŽÙ–&­Ð'¯ii'º…Òo‹+ý"E‹h‘”â´H©Bá {Ì+ħbVÌ ›˜“bRÛ?¶YÛ¬Â+¶Š­B°@Œ˜¶ˆÍis D@vÈ¡ •2ÊDŠXáð9|J¿~—ß•²SˆöD{â»ÝºŽ`x9ÿ+—ííbÙÞÇ–ç ö_Pa4º«–IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-117.png 644 233 144 2450 13755454065 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÝIDATHÇÍ–KLTgÇÏŒÀ0–QÆP7J†`l(‰Æ 1%.œÄG%ˆX´õ]øXY£ÔIJªÄW­Jb2b„ª 0j›”€) Ð):JKUœeîë×ÅÌÇœM—žÍÍyýÿÿ{¿œs?ÉN<œ¹Î\缸ïüÊŽg®Ï\¿ä§¸ÁÇÇ–ß¿ùgæŸð^ô^4m_åU}r¿ˆŸÌ§â’-vÀuÍuÍáOø5°uÙÖe™ÇýïBà¾î¾þ¯;n츼¼Ä×ðüÞó{¯ü¯ü`û*¯êU¿ÂKÆ—š÷øE ½-½Í1 ® W†øÖúÖæïü‘¥%¥%OçQ¯úžÂW|Š?®G guÎj(ÛV¶Íýc¼að \|p±âÓ®'8AèQ= `|n|Î4X!+€ؾʫzÕ¯ð¾âSüq=2ûlëÖ`UdTd:€Ö Ƙ1f–¶OÛ‡fýfMYSX¼gÀGÌe.XX1+ú;c¹±ËØÛÛfÌ×ÖhkÀúLá—kå0žà·RD¤ Ý=拦Ápöp6Ð ÀF#¤ù4S´2Êh’’Zh#d„Œp›ÛÜNÊëèñ—{߬|+Ÿ©„³†º‡ºÜQw4š¦ô$„]¸ »Žì:¼0WXßj‡´C6ZãŽÆêÆjx¸ôáÒ‡KS鯯ÆáÑÈ£‘G#ð¢ýEû‹v¨?V¬þ4þÓiŒ@ #ÈÇêoê;ÛwVu›+¬¡•;+ÕÑ^¸›Ös€½W«®VÍèøB¯.œ.dzû/Û;¶wØ~çí·wÞÚ‚*k+k+kí|¸'Üî¾Ò¾Ò¾R(Ê)Ê)ÊM÷7Ýßtß®ûáIÃц£L+>ã¯+ÃW†•°žó:çuZ×8yy`Æ ß½y÷š?m.h.ßaßaßa¸Ux«ðV¡]XXX¾q߸oÚZÚZÚZR¿hSnSnS.”Ê/—_NJØû؇yƒýn˜Ìܲ‡IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-95.png 644 233 144 2443 13755454065 14701 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜØIDATHÇÍ–]lLiÆßK;‰Ö´JJ§Š.Ùdm¸‘*•*2JDšŒ±ÙÆE³AÕúZ‚DÒÝ­4Õˆ¸(’µˆ¤ÕÒ 7”2»‹ˆôƒD¶T”1meÈì¶[ç¼çýíÅÌ™svƒë¾7'ÿ¯çyÞ¯ÿy!„pÇ¿œÙÎlgjÌv~cù“‹“‹s‰Ù'$8Ö:Öv}ê'Ô¤J;e<¶l3næÛë…°ðí|¦_¸…åHº˜tÑQ·Á†9æ$OŠÙ?ÝW“«éoʛ˛Ï4ž¡BÁP R)Ë6ãf¾YoâÙñÅ¡ÿñ c[Ƕ:z!i\Ò8! gyÎò™ßÆþœ ¾U¾U}cúÆ('È`<ãU!%Š9m¶ç›õ&ž‰oò™ü1=2–f,JËJË\ ±‚Ç?C•§ÊcòiMÀŽ0ô¨~égÔ-u °l3næ›õ&ž‰oò™ü1=â¿{[Së“×' @»ƒ&oÈÆãšñ—ò(Jï×ûô>PUj‡Ú¼å-oA~'wÊ ¿”³ål_ÉjYb•l’Mh Ã2 ÇñM¾¿° ú¢\!W(ú<‘O$0ÀJ0jŒ†ÔÓ™`7»±F %”€’J*iókhhŒ0bócŒ@V&øü1=qa'ÚaËþ-ûÅyDôçús ¹Ì­@GeGeG%ÔõÔõÔõ@¯·×Ûë„ CãÖÆ­[á¸ï¸ï¸NÞ=y÷ä]xÓýæÁ› uŠT]èÂÆ—àé‰ {°ν;÷.Q·ÙÔŽjG­¹vÞï¼ßyf”Ï(ŸQ .<¸ð x]^—×]Kº–t-¬`V0+«_¯~½ú5îîîÁÓš§5Ok¬uS_ëNÝiâ«ÍL€Ô¶Ô6uBóCó­BY¨'éI–}L;¦Ó  » » Ûò/¾ºøê⫰ѵѵÑ™žLO¦Š[Š[Š[àtÿéþÓý¶Ìcó€?T­ªµo±ÉÓ# -%-Åxƒ/_Z×^­5‹¬²g Ïž5@¾?ߟï‡ú }…éîtwºþ€?à‡]î]î]n8ûê쫳¯ Ç›ãÍñÂ…Ê •*mêÍz³½Í˜ü1=N!ŒËÆeÇ#!ô5úaŽ ~¤œò„-"­‘ÖH«¹ý¹ý¹ýBøÚ}í¾v!&–N,X*DFAFAF)ÛR¶¥lÂ?Õ?Õ?UˆÌ™/2_Ñ#zD·ðDƒØ#öX|\ÏÇΘz¢ïÓ÷Yg,29292ŠÊŠÊŠÊÀ“æIó¤ÁÞi{§í¡)¡)¡)°àÊ‚+ ®€û°û°û0¢h Ãç‡ÏŸ·í\¾Þ©w~òŒ}äVšñW:è°nåûì÷Ùï³!¼.¼.¼Ôuu]]·u‰ÛÚmí6 ̘50 Œz£Þ¨· êa„”­ñ~êV~ ý“ècµF-CL¢BP%j™Zf»]›Ô&µ TžÊSy *T…ª°Å?WÙ*È¢˜b0û¢…ÿÉ>öΛÿtÙ&ÛŒ*£ #\âJý®ÚU;ðA‚¶ùjªAÝP×Ô5àyˆc»± )oÊ›6üwþQû¯µ¯‹Qû/Ø[KTÙ¢±›IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-196.png 644 233 144 2727 13755454065 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŒIDATHÇÍ–íOÔWÇãÀÌèHqƒIÓ€&Õúc²±Y«£/˜h­Ô EÐ’¡¼Ù,š´™„Dx¡­“jR©®©)5q7dKÃúI5Mm4Ťíð Ÿà}VŸ0Êrb ÚTi¤m[~+ÞÊ·ð,|‹ÏâOè‘ŵ=· UšQšèÚ]0FŒ0—i!-„¦:ÕŒšAY’Íÿšcæè“ú¤> ê]uHJÞ ª\ÕªZ”Þ__‡fŽhÃÚpòÀw‰•h%`.ðÛ¥Ùð9ºgÄ32ë„þ¬þ,à&omÚjm5ó\§¾Â5£f€0aÂö>5ÔPʧ|Ê,ǃ'Åÿ™ù†ùó¼–À‡þWú_žyžxžÌ:-= Â.¶Ã‘GNSæŸÕ)­F«±uÔ—ÖÕAwawaw¡ÍÓu»ëv×m¨ÛQ·£n T T TÙþˆ?âøá\ý¹ ç.ÀƒÃN=8e߸Š%øøíHèHÈ*íÅöaºRq¥"þWýÓX^,X°3øCð»à­F«ÑjÀð™á3Ãg`ÕÚUkW­…mUÛª¶UAþxþxþ8tßé¾Ó}ËËË È[ä-òÂæŠÍ%›Kà?/?üþá÷Ä,>3vé×K¿ZÂÈlÉlQM\íí°OÏ{>ó|®n¼ºáêÈÉËÉËɃÎÑÎÑÎQh,k,k,ƒ­m[Û¶¶Ùy;Ûw¶ïl‡íþíþí~ð¹|.Ÿ ÷î9ÜǾ>Öt¬ &_‹F£Ñ”ÖÐF7nKCdɾ%ûÈ—2r3rEä–ˆˆL¤”ÑÑ Rö¨ìqÙc‘œÓ9§sN‹LD'¢Q‘"w‘»È-ò,ü,ü,,²§eOËž‘Þݽ»{w‹8ýN¿Ó/’~>ý|úy_ÄñED®™×¸†ÈýÁûŽû±Ö›¿8±ô8DÌoÍoÓzÅÐ÷ê{E$MDD²å/²BV$Ekдg¹³ÜY.2Õ<Õ<Õ,²fhÍК!‘ý%ûKö—ˆdÍ:›uV$?˜ÌЏ›ÝÍîf‘Pq¨8T,’Ù“ùcæ"ƒúÐã¡ÇIølÖÆÆŠ$õ${Œ+ÓW¦¯5çOúMý¦ÕP°¾`}Áz¸U«þV=˜ƒæ 9Ê@e r7ænÌÝÕ[ª·To±K ÃÁ0x—z—z—ÂÁ¾ƒ]»`Æ1yiò’Ýcx/›—ÍE=ö‡¯2¾ð•Œè½z¯ÝÓŸM×N×Büxüxü¸M{{{ ãÆŒQ±ýæœ9gÎAôŸÑºhµF£Ñˆã„qè]à³ø•>ϘglÖ }FŸ‘Ä}Ì ³‚yž³x­d%+AªB•2>Ô.µKíÕ©:U'¨lµ\-Oñçêê2¯æ’sìõþ×yÏ€gàÿæXÊä§ÔUêÌääï2º—ñ¾ñ>i¥ÕžCœäc>Õ¡:TpŸ{ÜK9À ~â'”ºk¬3Ö¡ñã=ã½”Éo”:KÖM-šü/ìå ûºxaßc/æ öwzÌþm|²0PIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-123.png 644 233 144 2734 13755454065 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü‘IDATHÇÍ–kh”gÇÏ\š8LjgbFˆ&t,$èÒR4B¨(•ÔÖ¦$س¡àÚB¬ýÖRºXÆj̶ÕEkˆ;$Å¢ÒŹ4µ¦!%iÝ„dše%ÍUk"c'™y/ϯfÞ™±…ýìóe8·ÿÿ?Ïáœ÷OòWÀ^h/´¯NØö¿¦ý«v¯Ú½±-aŸ3Àöšíµ;ïÃ3Ÿ<ó €·ÅÛbŽ¥m+någÖ‹¤ñ3ù,¿x$íÈþ2ûK[yÒþ(ZåKØ'ûÀuÍuí7ê;ê;®¶^måo0{köÀbùb9¤m+nå[õ^&¾|ô~xªë©.Ûÿ ;+;K6ìÚ°ëÙ· ?? ¯ì}e/À/Ž_ÊÆ= ‡UDˆ`û¶Oæ[õž…oñYü =yeye"ð꯾ẘ( Áñ‚ãŸv h¤‘Ð#zÀ¨6ª‰êS}ذAÚ¶âV¾UoáYøŸÅŸÐ#÷öã—P¬@ hß‚1eL™£½£½ƒ¦¾Q¿ª_Q–dµVù”ôQ}TsÀ¼mÞNÝ æ¸r(J¿/‰— ©"ݧûRø[–_×_וäO·RDÄߌîšrMEœö„=ÀW¼lôi´ D¹Ê8ãiB5§æÔPC 5i?7¸Á 0ï™÷Ì{À5¾à‹ŒøWf¾™O”ú>„׆×q×]×݈ÓÒ“vîx냷>Ì­êïÚ{Ú{iê/¼yáM‡‡Ãiž±Cc‡ÆAÓš¦5Mk`hãÐÆ¡éøÈàÈàÈ œ*>µùÔf˜˜ ÛÃöŒoOð¥ø“z’Â~x—·Û¶L¥Öÿ{.ö±ªªîªîtÃ{C½¡ÞL-M-M-Áº›ën®» ¥ù¥ù¥ùà¿ì¿ì¿ Mf“ÙdÂú–õ-ë[`ŸŸŸ .ü±ðG˜ŒMœŸ8OÌâS¶]m»,a?¼kYݳºgÛ‹²¹ôHé‘dÅvQý›ÛÜ–ìŠÚŠ#GD – – –DœyÎü½8{ûzûDdYD„:Û‹*WåJܪtWº+Ý•"9E9E9E"ƒËƒËƒË"šGóh‘®`W°+(â+ñ•øJDl‹¶EÛ¢ˆá6܆[ÄÛèmô6Šÿ³(X©üWàxฅO£«¿¡¿A$¥çOSONÉTb/YÓð°âáAÒ†´!ˆŽŽ†…àBp!3ŽÇŒf6ÍlšÙ±ªXU¬ ô½@/€ù+ómóm`ü׈1ŸŸwþïTú›Á5ëš8a˜0R‚^ó yhÆ&ŠY³ôØyÄ#eì¹~Õ¯úAµ¨sê\†?K¯Ó눪¥Ô{>ü<uMº&ÿ´Ç26?ì@6`¦6ÿ°1 8Œz£&˜@q†“œÕ®ÚT¨5 Ò6çù”O ]t¡T§á3|h\4jÚŒÍoœ§uSmþ'ö[ùľ.žØ÷Ø“ù‚ý‡»Ö3`ú”cIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-37.6.png 644 233 144 2763 13755454070 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܨIDATHÇÍ–ÿOÔuÇß zwÀ™ 6ÇÊ”¶$¦Ò ¿l4 Óš±ÝH4)«!ë”p¹eMâVk´iå—ÔUˆ²Î–6í†`„™¡%b“b1‹/uÊ&Úèagwð¹Ïçó~ôÃÝÇÏ-ÿß¿|ö|½_¯çóµ÷çýz½Þ„BL‰}$ÞŸxâä(N|Å´[Ÿ¶>ýà—Q¼Wƒ„gží~îùøžÒÜin½ÏÄÆ¾á/„ɯgØÅa,‹'¡0†k๹Ï͵N‹âím`k´5ÞRÁyÌy àèçG?g þ4øÀ?…ÿ‚‰}Ã߈7øâùEÍÿô…€‰-[.ƒe’e’ðÀ²–e½u¸”Ž"GÀ_þš @»¤’* AŒåÃÆ~Ì߈7ø ~CÏÐæ# ㉌'„€âÒâRÛgÑ€¾ƒðæ}oÞgèE-l!Ô ÐÖhkÙ&ÛH LlìþF¼Ágðz†~4óW†…bÇR(ñ–xAÿ rNí‰L‹L¹A­QkˆÈëÌbR¨·Ô[ ½ •j¥ MÖ&k“A.‘…Æ9Å-)ªKuQ/DÒ"i ÿ凒Ë%— ¡oüÊSB‘½lA[0˜$uï9ï9à=ž™'óó '88q⌓TPPâð(£ŒÆátÒI9 }Ò Ÿ—Ïæ£ÿC1½˜>ç£ù†„bïYɺâuÅ›þÈoW»]ØþÃöÖí­ÈÝ;v‚/Å—âK=ƒ{÷ BýHýHý²²²@Ïž=î81ú7ôWôWÀŽúu;êç{Ï÷šz$¯{qÝ‹À@4¡ý"„¿¾_7|Ý?]ʼ”)˧|`Øþ0ãŽ^G§£r2r2r2À½Í½Í½ Ÿ^|zñi(²Y‹¬fm×·Ö·Ö·š û‡ýÃ~ÈÏÎÏÎÏÇûŽwïÀ£¥ó”y ãö]­¸Z!Ë¡i¨iôyÑ|„ž›H H„¾ } 'õ3–3p=Ym«¶Áñ±ã£ÇG!·1·1·ºš»š»šMa·îÖÝ:”4•4•4ÝyR ,€éó§ÏŸ>*?ªÜY¹ªÞÚôÖ&¸1%”ʸºyÕþ…ý éfO³ë½X¯ß¸~Ã,û›ï*•°|ÑòEËÁìšÙ5³k oUߪ¾U ¸—â‚3f @{N{N{Ή¹¥[º%Ì\0sÁÌPë¬uÖ:!ë«YŸÌúš|wïw÷â¥[émȶ‡õ^¡e$÷$÷H(UJì:ùiû§íð”kYᲸêÊêÈêÈꀆþ†þ†~8Rv¤ìH,¬ZXµ°ÊôKKK…‘ޑޑðdz2=™0'4'4'dú=òvî’Ü%°{Kí®Ú]Êne7¨Zò©äSÒ#¤Å¸c 7<o[:¶T–?öTîPîãS/N½0õ···˜Ä¥”R l­ÞZ½µÚ´ûò|y¾<ÈÞ˜½1{#ø®ø®ø®ÀÚºµukë YI$`UïŠÍ+63~ó"€,Ícy4vÇb³ì,­ë“Ö'™U¢|8Z8Z×&‡‡ÃHm¿¶_Ûo&XXX á¶p[¸Í´ë.Ý¥»Àßäoò7Þ©wê ËÃò0ø«ý¯ú_Ejï+JA\Uþ¹>k}–Ñp÷ž4ÿ¯ŽöùÙí>V.Ë ËI2]¦ƒ È€ Ä]¢2Ê(‹Ã"Dâð˼ÄK e’Lù2Ÿ°ŒN•g䨷ËÛ`»i»LâG£…>ntÞ•VN6E;³<¡Ô°Oói¾Û’;V¬À&^çõ¸D.âÅ Ò+»e70óÿ^·è"ò¬ú¯ú/P凕I+“ÀÔ¿=ÄïÚYy×¾.îÚ÷ØÝù‚ý¦•i v»–¹IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-33.8.png 644 233 144 3061 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜæIDATHÇÍ–ýOU÷Ç?÷‚¯Ð,FCÀ'LäaˆÔ`3cSÑ‘²b¸ Žˆþ@¨4 mÖ5i—,ËZòeÜdB,™FÒé0 éµmdkL b1“Ì w\hT§ËCݽ¸÷žs¾¯ýp9¶¿Àï/'ïÏÃûý9ùžïû|DD$qõ)`O³§ÙÅöZ+¾þõõ¯§·Gq«¶2[Ùw¿†[^lHjKj3¼6ófýÚ~‹­ž—D±qq¶‚UüTäTä¬ßÅìç5çµ§¼õÅ[_x>õ|ʘþvú[€ ~( ›y³Þì7ùÖòËGÿ§/ë:×uÚBœ#Î!Û ·îlˆŒí„’â’b€Ç1c”ô9 U b®ù5ØÌ¯Ö›ý&ŸÉoê™úÑy’%Ò7Kßt^Š6x¯Àû©ï§šz‘k@#$€Ô‚zµ^MT¯êÀ† ,læÍz³ßä3ùM=S?:µ•K""M?…r_¹ŒA€ÈMm<²3²T†öªö*‘ÕI•1lÜ5î‚6®=ÒÊQ9*k˜gþRFDKÒ’ˆh‘”H ¨mQ~(÷—û'¦¾¹•]""çÀtƒ±ÊðÝôÝ>à PY*‹%Æ™b TªQ5@m´­ä:×¹TSMµVËjY-ÓH#€:¤±ÄåUþ#«z«ú܉Î#̈ˆ´~£8UzªÔ¤3öÞŸ¸Sr§Ü{ÜÙîlÔÈ¿G†F†,Á{M÷šî5û û û øf|3¾+oô=F…ï·ß¿rÿ ¸ãþÀýjäwÃŽa‡¥§¾:w*ÎÜÚÖoD¿-"ò¯_—Ÿ}ùü³x,e,EÕ$þþ…Ì2 ¹2\[][!sSæ¦ÌMpuâêÄÕ Ø¼¼yyó2¸†\C®!HKKƒQϨgÔc 4Ð?Ð?Ð;Zw´îh…2½,X„i·ÓnþÏL÷L·ªÏ3>Ï£6:ÝVˆä½"rØvØ&˜šÚ>µÝvéôwõ¡úÄÕfÖ¾\û²HrErEr…ÈÔé‡SEêU½ªW"µöZ{­]dãƒ6>yšõ4ëi–<[‘ ‘ ‘ "!wÈr‹±ÙpdƒˆãŠó–ó–Ä-÷Ìésºí’HAcA£ˆd$M8š÷J¬ýŽ#Õ‘J¶8W­<²IáÊkÇ^;& û›{&÷Œ$WÞªú¾ê{‘9ïœwÎ+R¼·xoñ^‘ôêôêôj‘’`I°$(ÖÂZX‰É‹É‹É‘fi–f‘pa¸0\(î ÷…ûDºþÒu¹ë²?&téd [dA\ë|ë|’,ÛíïØß![ôòø—â_Rz;ô6œïºØ±~öFQRQ’µ%R¤H…=½{z÷ôBådåd夕ß}b÷‰Ý' yWó®æ]V¼élÓÙ¦³ß’ß’ßbųÿ–õnÖ»ð§|ÒóI@øÃð‡ éº6t©Qóëˆïˆ‡`€ªùÉáüÉüIB‰ó‰ã‰ãPÙ]Ù]٠ËË˰ÿÆþûo@Ò¹¤sIç ÊQå¨r€·ÏÛçíƒÜ¢Ü¢Ü"4A\†Ëpø q(qJ~tåè ¡…‹ê´:­j c´cÔ¯¢óˆy øº.¶.Ö:%á?,,€?nvev¥Ÿ×Ïëç­7Ÿ Ÿ Ÿ„Yÿ¬ÖF½QoÔ[v2ß0ß0ßjŸÚ§öž¢§è)àøÇýã(ýáÌp¦¥ÇpÝÖº­kN%ƒÿëcˆúŠyæcª‚%U¤ÊU9Ãcx@y•Wy×ø•C9”Ô´šVÓkâÕ„šµ^mQ[Ô1uŒ%µ;ʯÆ|¾gÀÆrÃô1ÓùC¦ó9¼ufõ•öD{üYŸÔ'-çç=hõwÕ©:vÚiž°È"¨!uWÝü«õÕz€ˆúZ[ЀfÓùÇKÿÙOü¹ýW>··‹çö>ö|Þ`ÿ ³ĘÇËUIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-147.png 644 233 144 2463 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜèIDATHÇÍ–ßK”iÇ_-g0Ó¥½S&ôÆò¦Æ•¢ŠÀ"*‡Ì –ì×Rý‚`C²_ÖŠ” „ÍnŒ?Ö¢T w× aÊz£½‹õwX‹?†Ý Rµ™wžy?{1óøŽ¹€ÏÍËyÎ9ßï—sžç¼Š¢(JFü«@rvrvrzÌN>bì§îLÝ™ûK̾' i_Ò¾?€µw×ÞÈ|ù :hØÒ/ãóÅÀOä“ûJ†bl˜›'9ãöe8`?`Oý:fÿØ–vKû\*:*:Ú|m>¾‡À«À+€OÎON0lé—ñ2_â%â+—¿àWHù5åפ`6™MŠÖÖ9§bïr`Ï®=»&VM¬Ò“@ü ¤‘¦; Aäú˜`K<^æK<‰/ù$Lë¶­Û¦(°÷àÞƒ–Ÿc ƒMp.ë\–äÓÚk\# "ÁH@”‰2B ÷è=$‘†-ý2^æK<‰/ù$L²´·5ÛÑ]&— ˆh*ˆq1Ñ4í´vMïÕôt¾Xz…^¡W@´,ꎺAú‚¾‘°Èùè¢4|&|M¬Õ¶kÛAÿVâkÅðwœßh¥¢(JÞ"–qËxp5ŒfŒf‰ͪY™§‹ &X¾ )¤ôÃúaýpÂþsÌýOÕ§úÀn³Ûì6¸Øz±õb+*ôØŽíØÎöÉ6Ê6Ê6’<þ7þ7þ·'SdŠLí)7›‚MÁMÝEiEiEidT„0²~–C¼âáò§c‹XZ%Š…b¡xÅ9ãœqÎ<½¼°®°®°®jÈ9êuŽ6^·EÛ¢mÑËþӧħħõËÖ,[³l É‹‘ÄHb$ÀòÀåËoß;îï]ïõ÷Ø¿'ž7¾—ÇËÇ{2ø1S9S9Sùl`PcPcP£{÷š¾5}kú¨+ª+ª+ª‹¼,Ë“åÉò`ÃûxïC l°xoâM ± as¨j‡/wµvµvµ2×¥ðKá—ÂÅÝë&ÖM¬ÛvP¦ S†ÅÉÝéîtwzR 303Üy€€€>O <*x ­hUûòµ|-_Ûúw§ÝiwÚŸÝ Y­Y­Y-Ħ¾“úNê;|•¿Õßêo…ó1ó!0Ó1xÜÆmÜ0ó0ÀC<ÄC‹°‹ÒOúI?Œcãà-*‹Ê¢Âà™ÃgŸ9,¼>Ø2Ø2ØÂÿ UHRÅ/„ÂFaã [ð^À ÃÓTÑ®hW´’’’ÿõÛÛÛ…g7hR5©šTáeCš!ÍÆÿà¿ÀÿÌw_w_w_ÄMâ&qxh¡… ¤‘4¤´‘6Àû=èA šD“h/\® W¿·ýÞö{ó½þ5¯h^Ѽ"¼ìïåñò‘†††õËíÎvgû…vÕ´jZ5Í´w3îfÜ%íþUþUþU âNq§¸*º—î¥{OFç,±ˆ|äHA R¸á†Ü¿ÌF4¢ÜÄMÜ„Õk‰µÄB<öÒ±—޽Äb¬R«Ô*%fiŒ4F³!†gá,œ…ïý«ËÇåãòŠŠаÆÿ¢ÿEÿ‹ŠÑ  ¤'è zß6¾m|pwÅÝwW¾Z_­¯К´&­ `ÙAvèîîıD,pçpÀIœÄI˱Ë€çž x*u‡ºCÝ[|e|e|%ÖÔ„Ö„Ö„µD-Qïý+/h­ ýKFÀé€Ó§±oIÂ’„% ¤ VXa…àxjà©§€¯*¾ªøªvK»¥Ý€­ÃÖaë¢/E_оlÞ¿yÿæýÀEçEçE'0n·Ûþ&“¿ H&%“’I`¢b¢b¢HNHNHNÔPC H£‚£‚£‚IÙåñËã—DZo&a&a&á/È}û ÷¸¯*®*®*ŽymF( „‚Ç}VΗóåÂG$œVÓjZýXA2¨ ‚jNR‘ɑɑÉÀ„ï„ï„/p£äFÉ íÛ¶oÛ¾tFQgü×ù¯ó_7·NQ¨(TSL}0õðÝ®ïv}· H:’t$é R)‚w»Æ]3Ÿ¾Aß o8†c8FÂ)Â…p!ìë ë ë 9BŽŽ^£×è50ïJ¿û~÷ýîöH{¤=¸vçÚkw€[Q·¢nEŠtEº"~)ýRú%ÀšY3kžnR6)›”€.I—¤K¢ò£ò£òffffè&º‰nz›¹1sc樆j¨†}CåŸÊ?•*³o:w,îX RCj`‚BPg“Ï&ŸM’†“†“†¬â¬â¬b '+'+' èNìNìN~rýäúÉ$’D’€ûšûšû #¤#¤#ˆ-Ž-Ž-ž{Ñ*ZE+@(¡„Â>˜2˜2˜˜GÌ#æì—ÈäB1E*R‘j:Îy#o$yMº&]“έ±tZ:-PòvÞÎÛa•ܒܒܦ{§{§{çÙ‚mÁ¶`@2$’ ’ É„dbn¼3ª3ª3 Pe©²TY€6S›©Íœç~æ~æ~†CØ*l¶ByÞ|Þ|Þ,Æ313Ž7q÷ )9ºøè⣋±–±–±–Š_gvÌì˜Ùñ†ZשëÔuºwmïÛÞ·½+¾Uv«ìVÕÓÕÓÕÓA=ô€‹¹˜‹úõ?궘¶˜¶˜ •P >s~æüÌ  :tHËMËMËÜÝînw7§çôœ¤f°f°fP´]Ÿ¾>}}š*•ÃÊaåðÏ[\u®:WÝÊÏIÁÝ‚»w´¡ mÿV*“ŒIÆ®(Ö?¬Xÿ¬!ñÃÄ?d‰¢7Doˆ&—'Ý“îI7دŠ_¿*@æÍ›7„;v ´€x ¯á5 ÇÚcí±Î@g nnžÓ®­sOçžÎ=ø[eieie)Î+~Qü¢øåÑ:Æ1ŽqËþ†D ¢gOÓãô8׎F4¢q$F\)®W¦¡lQ¶([šq¥êJÕ•*¶XmWÛÕvrjIÜ’¸%qذ?`À~(I ÿRÖÄAPjT‘ˆD$ðàÁ?´NÏŸž?=ªúáúáúaA#yWò®ä]ÄJ¬Äš/b=Öc}ÏVÌŠY1¯ö”yî˜Ùº‘ßKJI))½œEWÓÕtõîZd ôóóGÎ9DÈ´¬µ¬µ¬…’d“l’ «çj²…,»±»8à€`¡,”…¢Ctˆ8< ªú·êߪ˽k꽩÷¦ÞãKe:™N¦;U´hߢ}‹öl† &˜ÈßÑ~ô IÞzÔCÂÐld#›ÔêÏéÏéÏ¿*7È r颩ˆ©ˆ©Þr&õLê™T÷.o@¢'z¢‡¾ð…/;ì°A€Œ`Œr”£dWÍWÍWÍ,±íû¶ïÛ¾çŠ}‚}‚}‚‡9+•ÎÊÜ»MݦnÓãcËÏçk/¨ÍÓV‹óÄyâ<øuÜë¸×qpf;³Ù¹ûøøÜ©î«ë«ë«ãŠ67lnØÌIÉ"Y‰b…XPì{ÀD `¿o¾o¾oƩƥK—ÂÏgÔgÔgWˆ+ĹÓô=0üÈ#ÅÒY¶Þ{¯h<¿$2O׳E\ñ¬vÝ»H,‰%±‰¯Îþr4Ÿseº2]™âÎmâ6q›HWEˆ:uÅ^±Wì…’FЇ'ä y}¡ûB÷…νhtåèÊÑ•ÜmùRùRùÒâ¸Ùf÷b™X&–ñ¥ž}×»cEEEEEE°z3 σÇòhw—G»¥¤„”’ËßÒš@v× ôó:W«Î%dZÊ-å–r()¥”R<ðf¢ÉÞdo²‹¶á²á²á2î¶<_ž/Ïï®wŒ8F#ùo¿xûÅÛ/@gÒ èå{ ú°w‚Òãàÿ<Ú=§?«?«?[üªàéRŽîžçù¾öÇÝÓ‡õ¯ýé÷ŸËûóãýþä>Ïçóý B±<ù+ÀR`)°d%°¥Þ´§¿”þÒÿ”À]¤¼–òÚµßÀSŸ<õ €ã¤ã¤~ÃĆ߈_š/„É¿Tϰ‹åÂ4¤yÒ<)IÜ o½Q”þL[¿­^…†/¾ø¼÷ó^~S—¦.<¨xP&6üF¼‘oð-å­?Ж ,H BZjZªPøBá k÷$n­…Wª^©øö‰oŸÐî™dÊ `Ž9Œ^‚ 2ÞÈ7ø ~CÏÐOÔ# g{Îv!àÕ7_}ÓöÇDÂ>hÉoÉ7ôâý@md‚:§ÎhuZ‹ Gä)¤€‰ ¿oä|¿¡gè'ê1[9-„WBÍLÍ È\€¸W½__ úßâãñqâÉJ¥Ì—+ä P¯«cêè>ݧû0Ï<yø=’zDÍR³ˆ«3 >Y—à‡šÙšYà¡o´ò/B±þ8ØælssV9}Ó{Ó ü€—An•[‰rF@ŸÐ'ô à0‡9¼¤:è©HE*¦YNËi9 ü–6Úäv¹(?Kò¯Jê%õù{¢žä?ÖuQžs¥¸R :½x<lll Ü«ÝËÝË‘WüWüWü¦ ßê·ú­àÎvg»³Á·Å·Å·Åô뚮隉¯î½º÷ê^è,ïÜÔ¹ øçÄG™z2èZïZo´¶ë¢Ð· !„¯ÎtŸé†kç'Û'Ûåî‚誮U],:é|Ûù6¬;°îÀºÐSÝSÝS ìììàÌsæ9ó  © ©  ¼Þ o†YÐè®Ñ]£»`MÚ†5 Pöû²#eGà§õÏ¥>—Ê¢òò£¼Gyr7|vü³ã Óõí_v·Ý-=]Œ.ÂÛ`ö`6´üºùùæçM²@Y ,;¶íضc´[Ú-íÓ¿ñöÆÛoÃ1å˜rlI+ÝV·Õm…ò;åwÊï˜ö’pñ—Å_Âï®õz±¯b_ªe\ȸ =ÕasØôërßý·î¿eŽýxÿEÿ‹°ùèæ£›‚ó–ó–ó¨mj›Úþ ÿ„ŠºŠºŠº bOÅžŠ= F‚‘ Y@ /Ð胒º’º’:¨ÚWµ¯j¤–.[½l5üÁqòÓ-ªEAOf=™¥_úŸ33¥*øwûxçx'd¬L¤ U¶ê­:h½Z¯Ö £=£=£=`‹Ùb¶   Bd02„…ƒ ”2¥L)pÙsÙsÙ;kwÖîGÝÑî(än][ƒ¡Ùáøp ò^ä=Ðû§öO¥G¨ÙÆ7vnÓ¹MpâTK‹Üm¹$„,–øK|%>(<]xºð4TçTçTç€#ä9BP.‡!g g gÜEî"w”Ÿ(?Q~|¥¾R_)TUVUVUBþOòŸÍZÞýÀþÅäìîæÚ)ï)/p ùq$1ðÎþwöš˜’{—'‡&‡@¹¨|£|ƒœÚ?Õ4Õ³õ³õ³õ® ׆kAéP:”˜Ô'õIæ‡ç‡ç‡a&w&w&¤Kº¤ b‡PIÈr"å‚Zª–šSɃÆúÆz@ONeb<Í=Æ^ù~­•k‰òÿžXX‚Ÿáižùsù¾|@¿§ß#*”ä÷æw7¿°…l¡9+ÿùŸ=fÜWr°¦¹¦d_b3K¯–¦¥üZK×Ò‰ãÀ‰)¿–CräÅÄ$Ïʳò,Ј ÈyWÞî&zÅ1-¨‰ËKjH ÿ06ÿëÖ×­@ü‡›ÿñ½+Û×Åcû{<_°ÿhlT_½®IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-1.1.png 644 233 144 2246 13755454065 14744 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü[IDATHÇÍ–OhTWÆÏ›˜éN‰XMÁ¤`b n T”*þA(¢N\TA¨Ë*ÍFÀ4e4$‘€05cU’…–¡˜&„PŒ2Bd˜Ô:óÞ½÷׿Š"îr6sîw¾ï›wß=sDDd…ûˆ¬Š¬ŠTóÈñ ^±¥bË׿ók ¬ÝÖî?†š+5Wj{k{õD{ë>Ü/ð‡õ¼º¬ P~«ü–Õîæ`ߺ}ë*¾*濤 òNåˆDñDœ!ó8óàMû›vroÝÃ{ý_˜_.| /¥Ã¥ÃÖßP^V^&õ›ë7¯9UL¯ÛvlxYò²ÄD@ýTQeÚ9¼˜ åÞº‹÷ú=>ßÓóô‹~ê6Õm]ûwí¯¼Ql˜¸ gVžYééÙw€‹\¤ œœ“PÕAò`R&€…Aî­{x¯ßãóø==O¿èGÞßÛžïaoÅÞ ÀØpÔ¨Ðçõyl½\oÐ0æ©3c‘sß”ƒ”¼jRMØ #:,¸üžž¯/aCß\†ÊLe&·g*?•÷y`H×êZÞª”šWóÀ „ ½ãïBùC J©”J}ïèúo}~¦Ô”_ßõã»öNœ=qÖÿßñÆyá¼Óen˜Å÷‹Æ¢±(¤[Ò-é–@Ï4›fÓ ¦Ët™® ëŒuÆ:!Ý’nL7p³Ùnµ[Cz¾~ÑkìéOЗíËÇÌQ0%¦„¼ÓíœsÎAÇXÇXÇX°ñ#WG®Ž\ [mV›Õàt;ÝN7tŒwŒwŒ¯~+)ÁÝsÔ×wýT?¨~`nAf}f=p™÷¢ðm¡¡Ðý ý ý PŸ©ÏÔg`øþðýáû!¡¤Jª$äò ùèoíoío áïß¾ÂÏ;ƒÎ`XÉÕwýÔ.¯]®ŸÃÜ«¹W¡cÏÄMLŸé3}A{Ûá¶Ãm‡!¡:¡CB×Õuuý ð/gγž¯_ôуzÐz.âìtvŠˆ‘:‰ÈŒÌˆH‹4K³øaÏÚ³ö¬ˆ•°V"¨Ï\š¹4sIDÝV·Õí~Úž¶§E$)IIuy+iIûY¯ïú‰ˆäÚs팋Œ&G“"²DD„còŸI›´¬V«Ñj øªžT=©z"²tíÒµK׊ä£ùh>*²}ëö­Û·Š¼n{Ýöº-À/‹/‹/‹‹”V—V—Vu«ÅÔ˜)¸ßà1_ßóóÉSYpæy`ƒ Neötötö4Ø{ì=ö Œ2Ê`®g®g®ôF½Qo ¶,{2{2{ ÉB28+üîÜsî}öT†æ˜?W¼9£éCþÜÈ“çKâü{|Ÿ›c™üØÐê¡z OéSØ”ÑD†›ôÒ ,'¾™4“fø‹ &B>J]|Li¥±AMªIÀqù?=ùí墽],ÚûØâ¼Áþ°å;§«\ÇIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-57-grey.png 644 233 144 6254 13755454064 16011 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü aIDATXÕ—kPTW¶Çÿ{ŸÓôKh˜ BW#‚ˆÇ€¦$™k&ÄXÆR4EaF%AÁFsC¼Þtc 0Éõñ0!è@@ȉZšI0Ï$¡¦±»¥ûôÙónœ²*•ºëË®}Î>kýÎÚÿ³×:¤°°°°°^˜5Óì@ãùA~d …' Ožd twuwuwÿƼ™7óþðMÁ_ðü£²fêfêfêX ŽáŽ‘|„ !zÑ‹^YÈB+‘¦KÓ¥é$ŸåGùÑ#“d’Lî®,ò+ò+òkî*ÞP¼¡x1 ABDÒf9Ä+../:‡8ÄÑÓ¢NÔ‰:ñŠÝb·Ø-ODëêuõºúÓCv£Ýh76]·FZ#­‘QS–*K•¥¸µ"jEÔ ’#‰‘ÄH€hu´:Z ¸çîûîõîçÝþæü»â¹ã»yÜ|¼+ƒÏ1S1•ø:ÙL6“ÍA¥\ĵ|f©²TYªžQû4ù4ù49w¬è]Ñ»¢—:Â;Ã;Ã;Éji¾4_š+ÞÅ»x Xa…ÀFlÄFOâI< ëLÀLÀLVw¶u¶u¶1ÇåË!—CÄã+ÇWޝ\÷‘"H¤Z.snvnvnN)e™,“e¾N@@@Ÿ#{îy¸ç!€6´¡-`>_Ç×ñumgí6»Ín{f•æyÍóšç…¸µÛÖn[»?íeö2{™¡/|á ³` }èC€y˜‡yàXˆ…X~ÒOú!à>îã>x“ʤ2©0pá“ Ÿ\øDx}à»ï¾ã¯yÈ=äò;ÿÒ…t!=! H@Âð4—š–š–š_âK|\³°°HLÐn×n×nVg¾šùjæ«|«Ô$5IMàœJ§Ò©„ÁF0(©&Õ¤€h²—ì%{Œa c~Àø`ûÙ~¶Ôét:N@>_>_>\Ô;QïD½C·ÝawØ&¬655Uï“eɲdYH“J¥ƒµåD× kÐ5¤EÛoÚoÚoþã¦jZ5­šfÚìÑìÑìQrÓë¸×q¯ã l[Æ–AE®“ëä:€Ì`€RHñÿ·HD"ÀOø ?ÁlŠ3Å™â V¤V¤V¤²³‡ÙÃìA 111«bxÂBXȾ¿8”¥C $íOÚŸ´+¼½½áár«˜ÎžÎžÎ†ÔCê!5@rHÉÄ]â.qÀGò‘|$  Õ„jBÁÆÁÆÁFÀÑëèuôD œÄIœhDÞK½—z/…* # # ÖĪĪÄ*¬¨ ¬ ¬ $’IÀ¾¿ð‚VÐ Ú?e{W{W{W£dIâ’Ä%‰¤È@œÅYœ† † † €Š„Š„ŠÀÇâcñ±Â~a¿°Z¤©ÈIÏIÏIš£š£š£€Ñ£'FO’0I˜$ LH&$Àø©ñSã§€“^Lz1 @p¿p¿p?RÞz¿õ~ë}”X’,I–¤?ecçÔΩSbÉéå§—Ÿ^ÎÜfô‚^ÐÏÍY»¦]Ó®a¬¼­¼­¼íÑu¶š­f«ÛÅv±1ö,{–=˘°TX*,eÌöíÛ7–·µµ1vxüðøáqƬ÷­÷­÷Ùãfqó¸ù(ÞÇûxŸ„Ðsô=7§ éìþHRCÂ0$£KF—Œ.*·Tn©ÜTr•\%ôEöEöEhG;ÚKci, [)[)[ L¾7ùÞä{@c^c^còiʧ)Ÿr¹ÜpÖ8kœ5âÓõt=] ¨ !”óçü9vÞkŽ5Çâ¶#ä9àh `î'ùüN~'à3â3â3ÄúÆúÆúótótótÀç¶ÏmŸÛ€Ñ®Ñ®Ñ.€T’JRùèE›ÍŠfœœœ„„„ÌÀ ÌЗéËôå¹xœåGË–q›j¨†jØy^vPvPvPÐßö»íwÛÿ¼£´£´£”äGóÑ|4›HE*R(RÕ©êT5 ¯•×ÊkÉeÉeÉe`ñ¢Å‹/z|{|{|Á®Á®Á.ÀÂÂS©ÆT@‡¾Cß¡Þп¡C¸wL4‹fÑ p”£…m`ÍÀš5Pƒ`ð?²Û²Û²Û‚žÇZ¬ÅÚ¢c|2ŸÌ'ÿ÷{Í-Í-Í-Nv¯v¯v/7à)zŠž"ÌåÇË—‡*"("("HE*R}Œ>FÀYí¬vVžãžãžã2y+ãVÆ­ @•£ÊQåÚvm»¶ýÑ}îgîgîgÌ…ƒÂA(...ĸÙS‚^#‰$‘$~fâ´.h]ÐúAÁ]Ý]Ý]Ýâ7&2'2'2לŸ:?u~Ê™—…,dÓ'ßH¾‘|3µêZu­Ò«QW£®FÂva»°ˆÏˆÏˆÏÂî…Ý » Ýè:[:[:[ÿþü4†ÆÐÀÙåìrvq¹ÜFHëêêDëðôðôð4½¦V +†ÎpÔ;êõ;Ž=¿ìùeÏ/nànü±LrWrWr÷ŠüA݃ºuÏd&W$W$W°äUO­zjÕS¤uL?¦Óƒ /^0¼Ä»Ã»Ã»œ8?p>@ H)° ›° èííÔvµ]müZüZüZæj½µûÖî[»ñת²ª²ª2\”ߑߑßy¸’qŒc\Ô_±‹°¨{ OÑcôwMhBÓHŒ¸L\&.Û|TqUqUqµW>¾òñ•Ùâ€È€È€HrfIÞ’¼%yH÷=ì{Ø÷0¤„”ë±ë|‰/ñ%€/ð¾BŠPàÁƒŸ4OûNûNûBuiøÒð¥aA#y[ò¶ämÄLÌÄ\ " iHëÞÂôLÏô|€«ÍsÆÌöü>RFÊHYk§ñ4~G¶a¶Ñ#¿¾øõů…­¦S„) ’KrI.Ìb±X,؇}Ø`ÖaÝ£ËY ÄqFœ-º ºôæ¥7/½éÌ›Ü5¹kr_& –KƒÏ/,YX²°ä£¡Eä,úÑ~!ÅÝ*1„! ]ÈE.rI]ØWa_…}¥I¶I¶I¶éLñdädäd$oºðÖ…·.¼åÌsœmf\X3l°Áö=ÀF0F9ÊQÒï ß¾7°äßÞøöÆ·œ^é§ôSú ?´WÙ«ìU;?è*ê*ê*š;¶<]qN¸A­®ñœ8Oœ'΃gǯ¿vü Øsí¹öÜ(½•ÞJïÁs½õ½õ½õœ¾á•†W^aÉ®š/O‰§ÄS`C9À¦Ø›š«ñ¶1ØaÌ€3MMMðT•F¥cÅX1vçô=D ?tI±l‡¥¹ q‹ÆõKâîƒ\[ÄégµëÌ#q$ŽÄ%¿4{þµüݱձձUܾN\'®i|ø¡ðCá‡.öˆ=bt]DaFÈò…|H >ì\h\f\f\ÆõÉ"d²ýòÙfÇ5±\,Ëù2×ξíÞ±âââââb˜Ý…뜆\ÚÍsi·Œ”’RRÚúM¢I4iG2‘‰Lz¤ÞQï¨w[M•¦JS%”RJ)¦Ü™h¶5Ûšm¢u¸|¸|¸œë“È d]—fFfFfF >ê{¡ï…¾ ÆÝ­¹Ý|s »(\Ú]Úý{XmXmX­þ%Y¶,[–}¦xÒÒÒŸ7UVV:ó\½g§ºSÝ©Æñ¶›m7Ûn’×=ŠE jD¨Ù~…Íö¬6F£¡®x/ºFÛã\~Ã!¸¦Ìƒy0ò–1Ôj Åÿ9Ÿv>í|úº ÕJµRí¹—r/å^ŠºÖÔmê6u³ÿí8Ñq¢ã„󹎎.W/‰—Ä¿À*Y%«üòÒìÇÆ `˜Ÿtï€+QÂã<¿c¿¡]Ѐg«cu¬.±ŸÖÐZó­öᚇk®C%å’rI9íæ2¹L.óòwÁ5Á5Á5N4ôú ý¤Q|B|B|‚}æò[ï´þÅïØcÚuÎ"ä 9ü¿È²løg0k` ¬a÷Fy Ïçóy¿ßÏó|žÏ÷‘YÓ_§ÏésÎLØÎ—íùÌÒÌÒEM ûc[[/¾5<Ö0ûóÙŸ›—mÛò[ñ©ù"6~*Ÿ5/³Äžp·º[k¦í7¡bEŊ̬„}4ž3ž3÷uØÑ¾£ í˶/Ù ·Â·ÂckÆÖ€m[~+ÞÊ·ðRñåÍñ‹@FWF—ã:¸]n—,\¿p}þžDÀÕ|زqËF€›i7Ó”Œ»€¯ZL05î¥Ø–:ÞÊ·ð,|‹ÏâOè˜[<·XÊ*Ë*=Ÿ%.¯å¾–kñig€·y/èú€QeT1*¤B8p€m[~+ÞÊ·ð,|‹ÏâO葇Ïö½u¨ +ètíG0¢FL¯¶WÛ‹¦Î©»ê.Ê’¬žQO«§AÖ‡õaP¯ªÝjwr15•©Púøêøj4µBÏÒ³’ þ‘åz¹¨i~û(ED–~ˆî‰z¢é™™tðœÒj ™¤«\µ Y–ó™Ïü”ù*ª¨µX-V‹6ZhIñwšÙf6“ìHàCd^d÷ {†'Ò-=ÓÂ>þvÖí¬ÆÌBuX«Õj“pêøŽãÕÇ«¡o´o´oÔæ¹¾¾†cÇ2ŽeÀPx(<¶ýýçúÏõŸƒúÕõ«êWÁàíˆ3âLÙñæ_’ZÏ´°_°§y{óödø‹ú;S˦–1µíü¶žm=öŸÍ;›w6´­D+‚{÷ îÁòMË7-ß…Z¡V¨AW +Ѐ¬ò¬ò¬r([W¶®lø®ú|pmjðÓÁO™²øT°i}ÓzKØ/f~?ó{ÕʱÑÞÑ^{¥ñeÿõ÷_ÐòDËÒ–¥È äàüŒó3ÎÏ€Ó%§KN—€¿È_ä/²óÖžZ{jí)V«ƒÕP£þFý èØÐ±¡cœ)h+hƒ×ûŸí6¥ïŽøF|`éqФmIÛ“²ÛåsùDä[‰e¼áúÂõ…HååÊß*ÉÙ•³+g—ˆ¶R[©­Ñüš_ó‹xOzOzOJrpŸûÜ är9"ûì_°HCiCiC©HüýøñDÒ!g(™sdgüœñ³ˆ¥Ç)bv˜ŽKbèõ"⑹²JfËl›PÓÇô1­H+ÒŠDòçÎ?,2²ydóÈf‘ÛC·‡n‰¸ººŠtÖuÖuÖ‰T,ªXT±H¤»¦»¦»FD©BU(>òÓó?=Ÿ„Ÿ«6Çã"I=É£y¼y88s×;õN« 8Z-ŽBÇ¡ŽC‡R.asUsU3x3½™ÞL8h4š0z}ôúèuðññ95sjæÔ@PÊ”?€ñ‚Ø@lÀ®1Ò›&›&ª±ÝÊøô-‰ê—ôKö­wü­ñ· Þï‰÷¤ÔFÄŒ˜ˆEcÑXÌæ óDJ­ÖÆkãµð‡ëwãwcʘBñ‘ñpñoåÒÁsËsk"A#‰û˜ÛÍíL¢ñðØÇ>ö3cfÌžV½ªWõ‚ÊSy*THu«î¿KI‰Iõg²=y ˜ô\ó\ûOKéüÝA7`&;ŸÑ¸WŒWÐø„!»ñ í´ƒº .¨ À×´Òš²€ý4ÒˆRßÙF6Ÿ//¤t~#˜L·vê¡ÎÿÈþ+Ù×Å#û{4_°ÿjjYŒ6ÀIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-15.1.png 644 233 144 2705 13755454066 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜzIDATHÇÍ–oH•gÆïWÓã¡òOk˜p}ØêEm‚EdÉ1¤Ð4Œtf°Ú‡Ö`P_ ‚ö‡U†XYY´ÒÂ\L1*­NdË bf.­5˜–¥­ì¨äyÿ<¿}8ç=ïacß{¾®ç¾ïëºyŸç¾Î# ""Éá_˜´˜´˜ÄŽùÜÙOX•°ê£3!\m‚¶V[û`$J:r"å„Õí`;nçG׋8üÑzö¾$‹³á:ï:¯e…ñn(œW8/áÃþÞîFwã¨åË/\8yá$_Àóöçí¯³^gƒí¸o×Û|Ñü²û_ú"×׬ý ®xW¼xVzV¦o %*è> ;fì˜aëéÀ^ö2 Œ€07˜åW~44p°·óíz›Ïæ·õlýP?ÎQZ""?¬ÀÌ7òHC·,·>SŸ ês¾9=PæóKóK0çšsÌ9`–˜%f ‹Î 僕ie¢[“ÆP¿†ø¡ ®  ëG޲_Däãƒà~ê~˜@Sï¬ÞY`^ÀG‹µÀZÀXDè)½ôoyË[þ» Œ(ÜDM`úM¿é.Y½Vo„χÑãïñ¸î@`B¨±†¿XõMÞT”W”ƒÚ`Í·ykâj>¨ùÕYÕy°ó £×ð¬áYÃ3¨Ê«Ê«Êƒ#G:ŽtÀ«®W]¯ºœ<ë€uÀ:ààšòšÝ5»Q¿eÜ›soN$k¾ÚXþ¸ü±}´Õ7…E""÷¾‚úåõËÁØ J‹om.Ú̸="­ [¶.k‹µÅÚSNM95å䕿•æ•ÂÆ»ïn¼ OFžŒ<q ¾ ¾ ¾„âŽâŽâÇ.U6/j^Äxøf”š}§»NwÙÝûJø.Ñ—èSça n ‚1yP÷É™á3Ö›æKóÁ7vÞØ ÝžnO·´¹Ú\m.änËÝ–» jGkGkG£ŽP ÃxÛxÛxÔeÔeÔe€ç¹§ßÓÍ?7}Ýôµ“nû¼}^€Äë‰×Õy”É)“­‡´ Õ Õ€ú)2ödôgôgôÃåG—]~]ëºÖu­ƒÒªÒªÒ*¨?V¬þx¼¯Ç õÛë·×oºr[­ÆVgnÊÜ”¹ .X  ŽÍ˜Ý/ºÁî'FL«ÑjÔJŒ¾F_#"ŸŠˆÈÔðlˆ1COÕSE´$-IK¹3rgäŽHJ~J~J¾HQYQYQ™ÈôÎéÓ;E³³³EÞÈy#"FŽ‘cäHdéõ^½WDÚä¨lO•Q#Ûȱ~±~ÑÆÈ„ÀÊÀÊû2îoñ·ˆhŸ‰ˆP.NnOlMlQ•ªRUŠx+½•ÞJ‘k®k®k.‘äÚäÚäZ¯îÕ½ºÈêý«÷¯Þ/²¤pIá’B‘Á„Á„Á§±‰''VO¬‰›;; Áð+Órüñþx‘@V ë~‡3•zÅ7ßÙSi^1¯ÀðÃç†Ï¡‚ß÷÷8G¢Öë‡!$ *]¥«tPÓÔ45 †Î: Öbk±µØ©Þ:¼ox*xk¬e¬Å™JnW¬¨X=•D|ì…ûE`ôŒô8SåcÔ:nw|LÝV7ÕMP9*Gå8‚j¶š­f©¤’5ïxÇ»h£Så‰ò1zÚ{Úÿ×ÇDPaçU±±‘ïr —ÑoôÕæ˜9æ8?ûØÃP­êªº 4ÒH#ðš¿ùÔ#õ@=~8‰U‚N¼¹Ô\ ‰8¿«À!cŠvþ÷÷¿ò½}]¼·ï±÷óûß® \ý5>ÄIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-165.png 644 233 144 2741 13755454065 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü–IDATHÇÍ–íO”gÆÏ •™`‡¡8ÑXpÒk}é—bÒ¸d›’›6’Æ¥Àšu…ĵý­ò¡Í¦FhfÓfJ\4b“ B¤ …6¦ q§hÕ“-­Ž-;PBu2¶ð¼Ü¿ý0s3ãöðþòä¼]וûäœçOâ+–—–—æŽÛiKú/;_~¦=nµÀñšãµÿ¼ Y¬@v[v›ý}ÒÖqŸZ/’ÄOåÓ~ñHÒ‘q:ã´£0a¿¯o|}£Ó·›ÁÕãꉙ°·wo/@÷§ÝŸòw˜úzêk€¹Â¹BHÚ:®óu½ÆKÅ—÷ÿ_ûâ±/ÿ…Œ¥KEÀ÷’不ߌ'Ü|^)y¥àç%?/Qi`Ý–±LQ¢è3“bëx"_×k<¯ù4\Àò‚å"ðê®Ww¹NÄ ¾ÿ7¼ûv®æ3z€XfÔŒXoXo0jP àÀI[Çu¾®×x_óiþ¸y¸·Gþ„*[Z¶0ŒXÖØËŒ·Œ·0TPÝQwPZ²ú³Ú¥vyżb^;jß·ïSŒ3V½Õmu£¬õ ;vbX1Šb Xãï4vÀ/ þd+EDÖ}ŒéšpMDÓ!ì {€~üÖ á3|<à aÂ$7nPQ‘€À‰gŠßÀÀPO©§xðúáFèFÀuE£éZOBØÑ!¨y¯æ=`À~^2Þ1ÞY„UÇ÷¯:^#×G®\Oò…{ýá^8²õÈÖ#[áêðÕá«Ã@ -´@÷‰îÝ' å-ù-ùÐz©u²u5ûÝí‹·/jûyž¬n­nÕ­=:”ömožªtü¡c]Ç:ÈÝ–»-w 777Bqq1x½^¯× 5±šXM êêê¡?ÖëÓít;Ýà¯öWû«áä“Ó'§SZ¼9ñýæ–}Ë­G ûñìÇíQ˜™œ™¾Œ½:ed”¬ÏïÌïÌï„àµàµà583tfèÌä­Ê[•· ³ÙÀ,l:¼éð¦Ãpàì³ÎB]¤.Röööðmðmðm€ÎÚŽŠŽŠäš±¾»ýÕí¯@ëI±ûì>ǨXf‰Y""Y./H¶dËâ1»Ì.³K?~ü"ž>OŸ§O$³-³-³MdÎþœý9"Yk²Öd­ŒFF#"+ÆVŒ­)/*/*/Y9±r|å¸Èœ9÷ÃÜ‹ð˥͘5fE´ž4‘ha´päI??x~PD~ac‹zB=! º2«)«)«I$v0v0vP¤ ¹ ¹ Yd³c³c³C$s*s*sJdõøêñÕã"Mf“ÙdŠôìîÙݳ[Ä3í™öL‹¬\{síM‘Ý/Vy«¼Ÿ=K.…C"‹z~7• ‰)™0GÍÑäTÞûç½î} ÉÛ—íËöe˜96slæX¥V©Uš²%ºŒ.£ ë»ë;`÷Ø=(°J¬àÇŸæx*×} ®)×T4nX7¬E\?Ø•v%â‚SNUTµ£vò—„ªPªì ´ƒ þ¡êU}JüYóyˆ<©ñÃÏ…Ÿ~u¹Æ~·ÇR6?ee€½¸ùG¬ ÃÚgíÃà_ 2˜ÜütóŸ © Ÿ$¬>ò9Ÿ£Ô9Ëgù08eí³ö-Þg«,½,]ßÔC›ÿ‘ýW>²¯‹Gö=öh¾`ÿ)»ÚŽIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-67-red.png 644 233 144 4156 13755454064 15615 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü#IDATXí—mLTWÇÏ}ÞDG±)(3®ºB0‚º&:ˆƒDGZå%RˆÖÔ¤¾ £µ…àV©«iª¡1ZcÌ(MÁÕºu‹VkÒìÒÔ­´¡ Ê6½23÷Îùïî¹÷Îì®f³{¾Ì<çyÎóüÎ9ÿsÎ !m* küòhw´;ÚÍýCíˆjjj]µDTDETºN‘dYL¸i‰HDfá6­cñl<ËÇò‡×ã—‡óùv’d'ï ÷'Î[ÅV±Õ5ÂUp\…bNð&x¼¸¼¾g}Ïú ð~áýÂû@­ÀV`Ómægñl<ËÇò³zÏæ!ü²p;åC~”åGû°J.O.O.WvŸ¼yòæÉ›4Î÷È÷È÷€$Œa cúÑ~@³U?‹gãY>–?¼^Ê‡Ïæ#–Éü ?Èöÿ‘%°Ý°Ý°ÝÛì öѵÑtšNÓ!+ÕJµR ( •…ÊB@q(Åa°U?‹gãY>–_«o™¬¡q.ÎŹ‰‡ÄCß²ö:{½Nvh`{im€On ž žh¿Ož¨y|Êûr”ôú  —Ц2@ùÈsø×xå}ú:}]3}ž‡ž3ž3xb©±|`ù€¦2OÜ.n·wbŽe'^;ñ}CM É®àxpÜPÁÿdм¦y ´¶µ¶@pkp+ÈÅr1´Lm™ Í›š7€ëK×—ü®(W4ßm¾ È®[SnMѲK'ÊŽÏ>>›¾¡­l¡Ã i i i¨Y5b±keXÙœïsÿ˜õæ¬7@Ü'î&îÈÝ»ž®|ºRRŒ~^àˆû>î{>µßZÕYÕ©×Y5ôãÐãa| ôðº#뎬;¢ÏLé ÌÌ0̺6¿µù-˜ëžë6nâÀ¢E0}ÒôIp-p-`ô?êyÔc´¿{ø]˜—6/ ÀðÈõ‘ë€ÒgŒÄxŸ ж‚®‚®‚.]BÊJeP4ŽÍ¨Í¨€Õ©«S øóâÏ`Cë†Vøºíë6c|(1”h´{+z+€Oæ“ ¥ª¥ À¨Zpà½À{zý‚̂̂LíÞnc+Z²¤~Iý’zôŽsÒCé!€–‰‚ÍÞ8oŸ¹ÛÜ “>™ô ½Tôdåeå@ìáØÃГß~˜ÔVZUZ«GWð«Ý]¡ïBß4ƒò”eѶi¶i¶ièe|„wðÞbOÝÇ;Oqú ƒbN˜Õ9«€ÏО!#€/Å—ä¹Ç®»jôß½t÷’A«ò¥Ï.}¦{•óz½kG¯¹¦m9¶r\—"Â"a‘°¨²–2ëlëtët%ÅSô“ô“¤ÓМW޽r 2‹2‹}î耮tWºt×þ.x±òÅJ’l“mÖj¨€_‚”‚@ZeZeZeH{„D!QHüè ‰ÏÏÏ%D¼.^¯7 j~AN~N¾²KSœó‡5?¬îÆ^ 10öYöNÙ;0ãmd•f•ð½œùr&ÀnæÐGÁ˜`Œ>ÝòÛå·Ëo‡$ p‹°EØò×â ;–zÖ’›2L¦ŒþÓl€³zwáîBšÃÊÓ~A³ÊY€¯½¥½ä ò# ½L/ðZ÷iÜ™zg* ”…ÍBjmö6{±V{BkùZ¾v|7ƒ›ÁÍøÍÉ@á/Ú“ZÊ•r¥+¸&®‰kbZ ms·»³ÝÙ`“¤ì ÍÍ7”ôÓmt`–¥¡bçÐÉt².¥Á¦Á–ÁÀc¶FËÛµ•< 8횃8ˆC´è¬Ù$›d‹ˆ‹¸ˆ‹aX†vÿA{Z,Õ–jÙìÙçÉòdµ”‚Z>ƒ3@ >ø¸•µÊZ€+yJžvÖ±±scûÆve—ö‰câ˜û`ÒŽ¤I;áí¼·sçUº2†9Iý,z…^¡—»˜º'uOêBLå¦rS¹û ¦Ýl{¶=Û¨Ý3ä„n¸áðñØpªç(s”9úúÖ/®_\¿˜æho¹Ùd6™ÇÕ_K1á;Í]‰ØzÂE˜_…Û–˜ ízÎëÚuV;« Ú5ËfÙ¬…„„èZìF7ºwlwlwl7]¯i2žçã_ý]„GðE“gwõÚ]ÿo´Ûîn×µ+·Ëír»®Ü§IO“ž&ó½ó½ó½Ê¯5-žÎ çŽ-eRS¥ 8…<§é,®Ýaaؠݣ–£–£²ÙÓäiò4ðÃ?¼ŒÔyÑyÑyQ¿vıAlèVÿ’Äþ9¢®ÚOâžÙØ€WUí^øOÚ]‘¿"…áÞu/u/u/ÅÙ ?Õv‚+áJ¸’••áeøÇu9ò_¶çiw¹P+Ô µý pIMIMI ý}z =ïh[=, ÃÎdÒHI#Q¯ÁQ/šü-R»Ãíã6q›¸MÉ#y$/4ŸÉÏägáG®~e•¬’U"Dè:„îOêÀâˆû¿5³ö-—ä’\ñÛp÷¾2žò”§w…»Â]ùû¬‰þ_¹#v¦/"ïs·úŸ´2æ-”éÈÚIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-182.png 644 233 144 2747 13755454065 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜœIDATHÇÍ–íkTgÆïIRÏÌ®5“!—,ÆÉbd 6¸RH¨&tHÝ¿¸J4ËìÚÄUQª®ì&©‰0lhÙªMߺY¡æk]$ÆÑLb\Éš©‘H‚N3ëÌœsžß~˜œ9Óõðùr¸ß®ë:çæ¾Ï# ""î…§@Ž'Ç“³$mçì´ýÎ÷œïýòLÚî4ÀQ먽ÿÈïÈï(è.è6ÇlÛŠ[ùÙõ"6~6Ÿå·Ø­WëuT.؇ îíº·ËÒöŸÁuÁua^‡]—v]8ÿÅù/ø-<ýîéws•s•`ÛVÜÊ·ê-¼l|9ôü"ðFß}Žƒ¶H[$+7¯Ü\L'ü«¶To©ø!÷‡\•Æ °˜ÅªˆÃ:ϲl+¾oÕ[x¾Ågñ§õ¾[ø®Ôl«ÙæúKº`ì¯ðiѧE_êp„#,=¦ÇŒŒH€Tƒ8p€m[q+ߪ·ð,|‹ÏâO둟ööÏ¿B:@ê#æÏSÁT”º¥^¨(K²9gΚ³ OéSú¨båQžÌD­P›Õf”Nú’>Ræpj,5–yá¤>H}Ì~»•""Þ讈+˃‡î‡nàïTƒ©•©•Ä9ÏY„ •P à0‡9lû & jZ£Ö‡ØÏþ¬øqs­¹–¸šMãÃÃâ‡Å@Ü5隌åYz„uAÃþ†ýÀ€ùŽ:œjJ5Ù:º]ïw½w«ïVß­¶yFfFfFf å@Ë–0^6^6^fÇÇúÇúÇú¡ím+ÚVÀðÚá-Ã[ì/®¦Ó|Ä>nøØjmçЂ°áOžÝ~v{&}‡þÇ„/á#Q«þzýu»áCÚ6¤Á£M6=ÚÅuÅuÅu°õñÖÇ[ƒ¯ÂWá«€ÞöÞöÞv(=Yz²ô$llÝØº±<¿÷ìòì‚›ECׇ®“°øÌK_}ùÕ—–°áO–ô/éW½œœþ~ú{ûM“¾—/^¾€seç¼ç¼àiò4yš``ÇÀŽ0¾t|éøRXž·râÔ‰S¶ß¨‰|ù ,=o¼i†áÙ“gO€¤Ç^5?7?· ýWüWüWàÚžk{®íP0 !_Ë×ò5¨éªéªé‚UëW­_µBGCGCG!âø#~(ß]¾»|7T+ƒ•Aˆ·Ì7Ï7g­™ŸÍÌÍÌ¥'GÄüÆüÆC¯Ö«EÄ!""…²N ¤@2'i&ͤ)¢ù5¿æõŽzG½"%µ%µ%µ"w^Üyq§ˆ»Ê]å®éxÐñ ãȆæ ÍšE΀3๼íò‡—?q;{œ="Yà›0ÊŒ2KOŽH¬2V9òOÉ‘ÿŠˆð‡_½¥Þ’¤%ÌÝæns·‰Ì×Í×Í׉Ô7Ö7Ö7Š,»¹ìæ²›"ùÝùÝùÝ"å¡òPyHdõÕwV߉ú£þ¨_¤/Þï‹‹ÍMM‰üí×=ëzÖIRŠÓ|æ¾=ó푌žW¦2¹0%=¬‡í©|ÞúüØóclM¶&[íëz…^Ñ{Ñ{Ñ{`î5÷š{!q;q;q¢§£§£§a:÷‰ñÄ€éßMŸ>Žzéˆýû1³ ß¡§¡´¡ô•©ôž×S×ÓXLF†· ÌíævâÄùÉQ³jVÍ‚r*§rfù½Ê«¼ &Õ¤šÌ*ˆ[ªD•dЪ`âÆÄ WÌ{eem~Z@ÌÌæ1FÍh4IÑÉ ƒö¢“SœuU]UW¾æk …cuVªQ”ºe¤T¯>§ÏG,ü@n xùÊæmÿ•¯ííâµ½½ž7Øÿ2ÿä'ÎIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-26-red.png 644 233 144 4262 13755454063 15605 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜgIDATXíWmLTW~ïLj°tgl™éÖàZW ƪ,í Ê ÚÎj4­B+V[R›V‡†Äj¬UI¬¡!jk'8ƒ6¥J\ AãGÃZi³Ûðƒ ‚Ö:¢2âÀ0÷ÞóìæÜùØ]Íf÷ýsï{Þ¯çžó¼ï™!š’_Q„ˆKb\1®—ð8¸?­uZë´Öü,Y•UYí>Bói>̬ͦŽd’Iæ:©³:îÏãy>ž?²ž¸$O8¾r*§rÑiO~An•[åVç}a«°Uت1&Ž&Ž&Žâ¯kz×ô®éÖ ­Z7¬ÍY›³6'¤s;÷çñ<ÏÏë=‰ˆÔg‰ÄGîù|‡ÒJÒJÒJÔmMWš®4]aqÞïˆw€ |ÃƸá†Ðõ ûóxžç¬7óГñ‘éqX‡Ýçx‚œK9—r.)¿ïôúèGPØ<6̓¢îTwª;uº@]¨6Õ¦ÚÂô ûóxžç×GÔ7=£Cœ‚SpÉ5r\ãøžXê,{-{›ìv„WqL6N6Ì ˜TÔ€V"e’±1€¹•T%PþÙþÙû@ói>x¹›¥Î²Û²[±ñúÇG†›†›†›¯.ä¦jSµ©š¥Ü¸9pƒy¼ê¾ÀíÀm@z€P ýSαsa€ÁÚX°Cìпú«û”÷”÷tÕ;pÏäNÂCSµi‡iKçxt|òfy³¼¹«†Þxx#{'˜À§8ggÃ*ø{Î÷œ€£gŽž€ÓgOŸ€ñããÇñoäᎇ;à„í„ €ÿ+ãWFð{ü@qjyZžîì;\|¸øp1{GßÙ|Ä<‰‰‰¨»Ÿ?ÿ~>`#P`æßܱ©cˆ×Åëx0ñ ÐI: ÙÙàoò7ÀíŽÛ`.1—€\%WSs€7OÊ“˜µd-YªÜÏùtäS€ãáø8Ð?¯Þ¿zÿêý¡/SûU*¾´¤fI ä¼–óZøŽõö†@ë¬ÖYPy¬ò¤#=b‡ .€¤—’^à¹v! Pû#œ|Ç'[êƒÕ`5Xõ‹¡2±^¬'¢_ó¥¼góž%"²cÿ&|R¨&Õ®}1öÑwþïüDDÏöügDDo´¿ÑND´mû¶íDDmUmUD4ÝrËr‹ˆŽ«»Ô]¡ú†C‹¡Eoy>_YQVCVCVnL„àNáþÄ~d?†7ƒò²ò2Ô_ª¿Ób§Å€eeü\ús)$\M¸ q߯} « VÀ WðÇîŽÝ  »7«7 `™SÉ«ä$ä$ä$àÇG¢M´‰¶ÀÝàBݱòcåÇÊÃ(0¿­ZÀ?¿{~7Ä|ó5ìß7Z‰V,—åÀsqÏÅ@¥·2¼ã¯Ùkú‰~Ô“õ¥õ¥¡zttuté7à&!SÈ2wIZ$-’m¯å]fþI3iêÌ‚¾/û¾ ¶lcÅÆ 0}dúÜ;¸7œV£Ý£ÝázÁ»ïÀ‹)/¦„³¯Ë×åðGÎéSq§âà÷ÍÛç$ÍIÒô @J–’¥äOR¼5Þo%’/Êå‹ÍÃúÀ_»bߊ}jàux€f7šføáËÄ2¾˜Wb^±[ìo&Gµ£î&ÝM€G‚€7h8õÔ>yëõ·^´­ÚV äZiFi†æÓ–IeRÙ? §ôXEJÚdžLùù÷Q`ßYÞYÞÉ–—q€’Ф6©`Àñ„ã ¼Ž6GˆÐ{¢÷DØúï$ßI€Ï³>ÏÔâö¸ö¸ÐþžxäÜáÜ1µ¿D€X+ÖŠµùBª*¤þ®)  t]ï¯ ‚Spæ5 ÍBª  3…™Úû®Î3î3n¸tîVhoko‡Âc<ÓYðF²‘ °e¬–Õ†¨4Ü<´h?`žn²š¬Êf}'wKR…Ý¢C³‘lrØ\É¥\Ê•w““œä$’<Ò5éÚ¶3úÕÚ˜&¥IŠq ªo¢o"œ»kÀ jªš €±Ù‡8é\ÌÄL+ Ü ÜƒŸ®ÿÛúYëg©ú 4&{dkOÊ–”-)[ˆD‹h-ÂÉ ºbóÁg¡tCº!ÝÚÒ+Ó+Ó+‰ %†C‰kÎÝ\K®%W­à5»f×ìðÃ\à„6V­ÎVg‡ÆNÃâ†Å ‹Ù2ý.7ŒãðÄ”nšyÒB{ÔÑ“¥^ŽÔMÓ ™†LCæÀÉwí;í;Ù2}ê£b Òîhw´;!.öLý–qÅöÄöÄö°5:'ãÅx1þÍ]‘õ¤£ðÅГ¤†0în6ä­š…f¡™Ï9í}W§«ÓÕâ®Ò©t*!控Œ§Œ§sGçŽÎU«s±Ej‘Zfsª© ð—ô 9ð!îz$Ow˜˜(Æææf~øáÇ(Gjo³·ÙÛBcGn”åÆžà_’Ø«Quƒë÷4€ÑÂÞ r÷ôâîÒ•KW.]â®+Û•íÊÆñ);ÓOB(Š„¢¼í‘eÄQuú/åiÜ]"ÕJµR­{\T]T]TÍþ2orÞä¼IåïúQ{$ä±§‘ƒä àØ‘¢êÅÐÿ(ÑÜÝ©/íJ…R¡ å´œ–ksÄâ q @¿lö™}f‘Ô%uI]BG0°0êäþobÔ߬d%«ü}¤¹ªXd" ´ íBû­ç¦Ög¹¢N¦?*ïSúŸaÞnïPÊñIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-14.3.png 644 233 144 2667 13755454066 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜlIDATHÇÍ–ïO“WÇ/È€D”îR'™L †.BuHÄŒH0BÆ ˆ,.Ù$q.&C¦‹â4Nf«8ŒÌ ƪӉaJj QbˆüH÷£s* k£Ö*‘>?îg/Ú‡Vùíí”p@r‹ü\~z¦ž©g1?^¼žÔ=ʘ2†¢>PÒ”4Y!|(÷–{§aþ‰­|$„ó¾“Çä Äqñ÷Y¿Ïí7JèÐé‹ãuË'Ÿ|ëä:¹.jÝûŠ ¤*U©_³‹]²P2Æ/aü·Ëí0L@Ã!=á?v´‡§µÕµÕ ·è9°ãcÇgŽÏýý¶~Û$yx.{.{.Cwywywy” ™"S"~ÿýþûý÷aŸmßü}ó‘îÑ¡–¡#ªçÈîšÄšDckö !Dß8½ìô2P·È º*j*j7Z¤#·#·#w²°åêru¹ K-=¶ôØäxï…Þ ½ eÊþ”ýPv¨lOÙÈLßš¾•ñ?x²éÉ&¹œqÎ8Ð!=±bmrIrÉÂÈÖ‰¶ ¯1¯1¯:::ÀÕâjqµ€5Ûšm͆mÛ:·u‚-Í–fK‹ü)ý±þXÕ þ¬\±rÅÊ0ï½¹sæÎ{÷Ý¥îR|ðb ßKþ'ù}P &w&wÊv®ŒøF| ݯnEΜë9סÛÙíìv‚#Ë‘åÈ‚ø¾ø¾ø>°TZ*-•‘1}$ãHÆ‘ ÐͺY7Ãî¶Ým»Û ø@ñâÜ9Ÿ¾»øÝÅðýÜþ¸ X,U›zmê5Ù>ü}[8êÄ©ÀôÐ ×Û3í©öT¸¸óâ΋;#ÀšU³jV8è:è:è‚"O‘§ÈÞ;Þ;Þ;`-´Z áVï­Þ[½¿$Iþ˜Y7sýÌõP®®n^Ý̸?ÎàkÏmÏy2¤'Ò•Jíµ_Œ®Ô®jWÁ¿ßßæoC]Á®`×äÃý’—¼ž ?~6 TPAøl>›ÏòŒ<#Ï€’­d+Ù0:2:8:ˆÔþ Žt%Cµ–ZKtW21ÇFM£8p?w?Ÿà-AÕ[õÖ¨9ö 4‚tI—tE„0Ì0Ã@=õÔG+òмò¸<'ÏÈRYʘŒ áK¿»ÏÝ`ò›ü8º^™cB ÓW®™²fŠ«¸HP©‡Ô‚“'?;h H%•Tàyè®”ò®¼ áa+ùJ»­ÝF‘¿xa|Â|ã¯Oþ7÷®|c_oì{ìÍ|Áþøœ>ø˜cÀ9IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-90-grey.png 644 233 144 6246 13755454064 16007 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü [IDATXÃ…—kPTGÚÇÿÝs†f› **r')T”«tc¢ñC ‰ 1_4º[F_-1X°P‰1ʆ*ˆI“Z¹”K|)@R÷]0¡¢‚b¹Ì0030s¦{?0[V¥ò|éêÓÏyú×OÿûôsHjjjjj*1mšé†F „GÂ#^“ZZZÀ¤¦¦þ%€;q'îôÅÿˆ Å…â•{¦*¦*¦*ø)œÇyœ'Éðƒü<ÄC<°{°‡Ÿ’m•m•m%ÉB¿Ð/ô7Ÿ'j¢&êcyi®i®i®u÷322È€è!zˆäÕivÝÂåHgÆ0z‘¥³t–ήuFQç²*½2½2½òb¯qÀ8`¨½©ÖëƒWQf+³•Ù¨^¹~åú•ëIrˆ4D"V9¯r^å XûÖq«¿õ}k¼™ø–ù¬ó[y¬|‚%ƒ‘ÜžÛs{¶“ì&»Énl‰‡ÄCâqí;]‘®HW´ÌyníÜÚ¹µæÃ뮸þ!5¶¶¶‘M²dY²,zÇq‡zè¡° »° À",Â"è§O-žZŒMm m m Üô³ßÏ~?û±Ã#/¼<òò;_*< p¹y·y·y÷ºlžÈyâ£4’œ˜<1yb@аxŽP!T —Œ£ÁhX¶Ñó%Ï—<_ÃâĈ; \tÔ:jµðÄ<ÌÃ<ˆÜ‡ûpè@:ØÁv&0 ¾ð…/@:I'鄈a c‚Æ^c¯±GwÙÙ²³egÅÝõÝõÝõ¯6¶6¶6¶=WÅ­âVqëÚx¬ÅZ¬í§¶M¶M¶M€tttÁÉë¯ê¯ê¯.Ûèçç'nJLHLHL~utututÅÒ|¤ùìÜœssÎÍá!Z­ƒÖ¨lBlBlB6†PîÇý¸ßß·›¢MѦh ¦9¦9¦ë-€6l-[ËÖž>¦éc`8}8}8hnnzÆ{Æ{ÆD"‘‚Œ`hD#0ê5ê5êܹqçÆ@±ÇØch,¥±;ÁN°°wüÆñÇo`s'æN̬·òXùÑ[ô½×$9•:•:•âÔòØå±ËcI.ÔPC ‘6ÐÚ´ÉÚdm2à·Ü~p”iÊ4e0^9^9^ „ž =zx}Ñë‹^_   …êBu¡ÐÕéêtu€aaa õ$êIÔ`ãÈÆ‘#3‰¶Yî»Üw¹/ɽ6|møÚ0Nébt1º˜5I8:vtìè;u1übøÅpn5ÿ”Ê?åÜœoÎ7çs~rÙÉe'—q~åô•ÓWNÏøñîðîðîpÎåË;–ÇùÈ{#ï¼ÇyñOÅ?ÿÄyŽ:G£žõÿMù›ò7%çÇwßy|'çƒEƒEƒEüyÓYy¬|Ÿá3|Füèez™^žY™ ;°;vŸÝg÷©Ì©Ì©L`^æ¼Ìy™³Z³¯°¯°¯(¡„ [Ñ­èVšM‰¦ð_à¿ÀÁ¬¿×¯#^Gi‹´EÚôÕöÕöÕây“Ñwé»ô]çp爟 Y(Y(YÈK´«µ«µ«Érñ ñ ñ xIZ$-’p¡QhA"ŠPåVåVåôí9ÚsШ4* °6 a†0`dïÈÞ‘½ÀŠÕ+V¯Xý_‡h [–ÖD˜›ÌM榙ani%º]‹®]tÝD7ñ*?-?-?-fu¹v¹v¹ò’{ù÷òï夑4’Fø ~ƒßb£b£b£€Í›;7w¦FS£©ðËÿ-ÿ·Û1Û1Û1À.Ò.Ò.pssÆëÆëÆëfAi3m¦ÍOá)< ¹$—äÎ TñªxU< zªzªzŠ3ò.y—¼KÌ¢ˆCâÒÎ ©BªJ’ëh­£fÏÑþÑþÑ~(H8 'áÐ ÅB±<«{V÷¬øà—~ùà@9G9G9À†0^¼xpéuéuéZ´h90 ÚšÔšÔšˆï‹ï‹ïî‘î‘² +ªK«K«KYQQá[b&fbþΆ|ûâ·/~û"0X?X?X_øD—¤KÒ%½»Ø§Û§Û§Û|hOóžæ=Í’¬ööööövLè ôzȈq#n/à¼Ø<ºytó(~2üdøI`dhdhd8×{®÷\/@ÆÈ&e“²Iq<âxÄqð 64€”Û•Û•Û1ýÍÒ›¥7K©BaV˜æÖxS¥©ÒTú9ñøÄãÜÆmÜvË‘J¥ƒ×m'ª&ª&ª–%Æ~ûIì'ćô«ª«>®úXܧ Ó„i  ûÈ>²ZvÝc÷f5 "D%(A €#8‚#“1“ÍhÑþjÎÕœ«9æCê2u™ºLÈ‘¹Ê\e®Å¾g|ÏøžùòÒ†4r èD§¸ÎZ*Ñ‹^ôŠ÷qqT\ ¸p%k›¬”dÕ¼YófÍ›<–ì'ûÉ~ÈX!+d…à°…-l>ÆÇø@D"†!ÕjH…âÚ Ú Ú 8(”Ê€­f«Ù꣟OK¯oÒ"ÅË2_µ^ĺrË/‰ÌÒµl‘$ µ¨E­ù #a$,vÛô/ǵ+¦}¦}¦}ì¯ï°wØ;ŒFfffb+kgí¬ êOý©?¦Äd1YL†ìkŸ¯}¾ö1û„„„J:äAò yPVøô¡9ü+Ëe¹,Wȱìì߬;–‘‘‘‘‘­5£°<˜ÑE»‡,Úͱh÷ÿh ¡1‡+ˆD$Ò¯*M•¦J“¸O“§ÉÓäAA)¥”bÌš‰:C¡ÎÀô}¹}¹}¹’yŠd©èڜۜۜq¡¡©¡©¡‰ìT´+ÚíódžÌó¯×…·…·…· Þ!Þ!Þ!tÔ2ßkÖêy. þÀ¢£££££!Zºm܆ÛpòÑÀ / ¼€š—š—š—ÞeÞ2o™÷_=[÷lݳuÎ?jhhðÜÍ¿›7ß9aš0M˜$¥QÒ(iÔÿ.æy<çýP dIº1ŠQŒ²EÖ°$J|ž‡àOì´›ŽÔ ÆœÆ+x¯ˆî¤å´œ–ÿ¿÷ä–É-“[Ø Ò\i®4—>$J%‰?×û”û”û”ÿ%ZÕ©êTu’Ÿ˜ sa.ü;KÜJ  þ8(þÄžÓ®åsaNÃ~ìÇ~¡™$’ðo^Ãkxͱ]¶î¶î¶îô¤WÒ+é}êξ`_°/öýÞßßLÂÛÏZXþŒã?³k6 ‹ÆCŽIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-12-red.png 644 233 144 4071 13755454063 15576 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜîIDATXí—mL”WÇïó2¸ÔYiV^Ö|Ù1¾Q—œÖ©‰´"´B Õ÷Ã*âØÚÚ£T3*«4­ÁØ•ÔPœA±TZ,kM6j·M–ȫ̠lc:2Ȉ3óÜçùûÌ3_²Ù=_†sî=çüæÞÿ½w $l¿%1Æèz§ÞÉ=‰’¦tMéšÒU²D¤"é#y$äáaÅND"‘ù@¬¯ØÙ|–Ïê±ú±ýø‚X-_©#u¼#vËgõX}Öïù<„ÿS¬Ÿù9ÿ˜Ì?v籚Y;³vf-ÝzôêÑ«G¯*S}#¾ßø1ŽqŒpà 7 ú‘q6Ÿå³z¬~l¿ÌÏŸÏGŒ/ñÃü0?ì¾È ˜zM½¦^ié`h04 "¦ä(9J$Ú@h@Ðt@­ÔJ­?2Îæ³|VÕWcú_RÑ8çà„ˆ{Ä=âž¶ŸX‚Ùn¶›í’Uû@Ù¨l„Oj“¼’PÜô } (gȈš /¼?(Ê£€â …†©-°4°P>GäøØ4³Ý¼Ë¼K²²þŒ‡ñÝ=Ý=ݽ Ùc£±Ñبd¹º~qý‚G‘:>º?¼Bý™þ À§QŽ@kð@ë*ÕJ5`?öQ¤°ÑýÒAé êú\Ý™îL<26?6~¬d1•OÜ$n7]ßÃ×®9\£lŒðKÉ!9@î”;Xí «/¬€ÆæÆf-‚ä9À÷ÊÐ+C2|_ ÚÏ[2’?’0ÆÇ@÷­:°êÀªÑoFƒ‡‚‡xXè¢ý¢_PÚÏ7¦½1íi ï¼¦7Mojãw*ïTjò=_öÙÐÁ˜d?ãa||äHÍÓYtE=cz²AøPøò;*N+NÓBšûÍý„2òíÈ·ä)¶B!P€m'Ú€Ú›õkë×Ê~pƒ°AØÐ_ö=$Öf~¡ËÕåêrÝÇX‚­ÁÖ`kPŠUÅMgZê]Ó»€ïûßïÔ‚3ƒ™Ðùnç»_ÿê<ùøË­i½Ùz:owÞ†ÿÄc{–= ¯«Oè^®‚«˜,áÒ¸4.íGㅪ竚«æª—·pí\;×δ"ÿÅÙãìqöDדÖÓúèz Õ¯öXDÜbÅ¡8¢Rn÷œöœ2f[f[¤MêJîgˆ3lfÍJ¬Ä*£¬…¤Š»ˆƒ8ˆƒÁ#xÏÖ³êÓÚbÜgÜ'\Û]}®>­v¥÷¤÷b»Ñ ÀO·ÓíœRÔ(•R–”…€"ko¼•üV2­W_ qÑ%ºœ»S7§nNÝLoæÍ¼™;¡«a˜¿‰|V w…»Â]î\Ö¶¬mYÛÑÕêjuµÎݪv Í…æB­ve›lCN8á0ŠQŒF¹é\:—ήoóâæÅÍ‹•bõ-7è :ÃðdØ7&Äî4×;sqn_¬oLk×uò™Ú5HÉ’Èäèÿ08”2U“I|ŸôöÎ8)~ǧ'ÏÍqÚ-{‘v¥žðV3åN¤N¤N¤óÇæÍ£sT-vBÇ¡|&µˆôâ§‘Xt+ð,í6›ŒM’ÁÕîjwµ«‡jŒ‘ÚÎÙÎÙÎE¯±El["ÿ’$þ#®o$N¦¾0ÞXÂÛížy–v‹V­,ZÕ®3ß™ïÌÇñð¸¢îWÅUqUËwĶáGãúrä¿´i·@Ø+ìöº0àªÆªÆªFå¯9Áœ`NPú—ºÕÁ#xl3Ii#m$rí®¸~zò?Z¼vwÇúEw¸uÜ:n@JI))•ÿÀ§óé|:ÀŽpäï}þ †Ÿáºp]¸Î]Š$VÆíÜÿÍ ê_b!ñ§Øáí5¼Â+¼pÝ\7×ýï߇ã³q;3W÷…[ýßf„1órôIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-28.4.png 644 233 144 2767 13755454067 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܬIDATHÇÍ–ëO”WÇ3laX,Ú-¦á»/ã@šJŒkIEmSbÓKƒ$$»H¨6m,6‰/„h‚)”i¸”Ú"T#dð¼&5µ^ZƒÍÚ&CŠnW;\ÊÈtèÌóœO_Ì<>Óöð¼yò»}¿¿óœs¾çˆˆÈ“ѯ€5ÚaM‰ØÖjÓo{ÅöÊß?ØXJ,%cû`YDz€Ôé‡u·iq#?¶^ÄÄå3üò¤˜Ž„Á„A˦¨Ýe9e9¶¿Eì.CâpâðbÞ<ùæI×g®Ïx~ºöÓ5ß&ß&0m#näõ^,¾4ü_žybÄò?HˆOˆ¬—³^~vW$áûgáõW_à^ܽ8em°cW›?~Œ1cñh¾QoàøŸÁéGà©‚§ D ¸¼¸<ñ“H»êÒëÒ ¾Ð0pƒØ!ìû´ ­‚%P—Õe,XÀ´¸‘oÔx¾ÁgðGú1—rND¤ù%(}PúÔJ€ÐÕðDèéÐÓ ººM(Ú©ÒuŸîƒðÿÃ?„µZ­V«1Ç/,°üɽR¯$¤jµ3ÚГ#øP,  ~c)Ï‹ˆd·A¢?Ñïÿ‹š›¼:yø[A­Uk pž/øô}FŸ\¸pÅ4r„#6³™Íüyl`@ý[kÔ D½[Yœ¼0y þHcÙmÑ?Öù•:·Ã²Ãb èÏyÒÇÇÇÇ¡uÙ‡|êfáÍ›…&Ï­Ö[­·Z¡ewËî–Ýà9à9à9`Æ•K¹” TêQ=¦ÿÎÙ;ßÝùu©ìbáÅB“çŽÁƒÀýH?¢¯ù¶Nt肱 Þ&o“ªÊ<ÓùL'K×oÌݘ ޻޻޻ÐÑßÑßÑÎcÎcÎcPÔVÔVÔ«rWå®Ê÷6÷6÷6³­OëÓúL{KxË–x±ó…õ/¬g):*}`ࣀ+‘~DûORkR«„ÀR` N$žYqfÔ½[›W›g®kZ×´® *2+2+2Á9ärA[A[A[8Ü·Ã £ÇGÿóJ6×7×7׃|*‡å0üs¨ä½’÷̸^rïགྷÀ÷)§|¬­qÎøúøzÖ°'P¨)þeëÜÖ9™«~P½¼z¹ˆsÖ9ëœI+N+N+©©©¹ÿðþÃûE.U_ª¾T-Â"‹,Šèézºž.Æé‘Ó#§GDFFFEö¦ïÍØ›!2ýîtÇtÇ£´9KoÂk ¯‰ˆË¶†Y#ú1ûNûN5ó?Îÿÿmò´{Úá¯i¶Û¶Û°÷þšý5æÌÚíŽvämÏÛž·Ýô;»œ]Î.8tãÐC7Lcjcjc*$Ù’lI6È*Î*Ê*2eý“äþ´þ4ÿŒ´o’š’šÔ „W{ìÜšsk ÷èpÝpª²^a)¯!ïý¼÷!u*u*u z&z&z& ÜYî,wBò©äSɧ ¬²¬²¬ÆóÇóÇó!§!§!§<ÝžnOwÌÄ:Û[Ú[`ãX~]~¹ÇX~4îhPÝc|9ðÖž·ö@09%Ó_{/z/‚7ΛéÍDyÿá}Þû<§‚SÁ)Ðíº]·Ãt÷t÷t7袋. jTªÙ¾Ù¾Ù>ÐSô=Ål,ÎçP …>ñIÌ©<¿ÓºÓjnçWb膩#Q3t& Vª•tåS>åeS6e‹‘‡l•­²AM¨ 5³ë÷±} ®ªëê:°Mߥï"€;Š¿òËÉ/ctlúw:fÜÍ/ÑXZ[Z ª?¢Ìê†f×ì Ž†çÃó„èâ:×Qœdˆ!PçÔYu襗^`>P5¦Æ€ñGÊÿ¶þ6!´+Ú ÞPþ7âÞˆ~ý£ò?¾wåcûºxlßcç ö7 °,:Ô”+qIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-1-red.png 644 233 144 3662 13755454063 15521 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜgIDATXíWmLTÙ~ïÇȰuw*Y#êL¡-­ŒT Ù È ‰HÄdE»baem´ŠîhLˆ¦A"•¦î‡¡1­‰!8Û )nÚh¨_üèúQ5M3?ŒÎLpH ãÇ2àà ÷ÞóôÇÜsçÞ[•4íûgî{ÎyŸç9ç<çœ Q&¾O–×äs‚9Aá¥Þ0Þм¡yCë~.«²*«wÿ@+i%­2ÝÌO2É$ó°æÌÏÇózŽÇñ­|⫳¾vj§v1`í_T(ÉCòP๰_Ø/ì7„¸ò&ó&ó&ñ—Í6?Øüh|Üø¸ñ1°¥rKå–ÊlÎûùx^Ïñ8>ç{»aÍ—!N‰SâTt%_¡¥-K[–¶¨Ÿž=;zv”½“x–x–x@‚ ILcÓ¢ˆ" ¹ÞÏÇózŽÇñ­|Ë¿x»>r¿+ÆÄ˜‹þ•T^¯¼^y])φgóCVÌŠY1õ¨zP=¨«Ô]ê.@­Sê•z@]•¾›¾ ¨GÕÏÔÏVÌŠX^Ïñ8¾!ØÂï~×&„€ ’ËÇåã}÷x×ïõ{ýJ!ì;Ä!¡ô)}JÀ¢,ÌÂÒ|îá`4f0°(‹²(`Ôëx|çãü\×GŽ1ǘclÃÏøw—»ËÝÅ "O#O#OñŽ“POª'Õ“&…Ö¬5›ÚÆ£p{üö¸eü·ø6›Úðœós=†>y¯¼WÞ{ó8ï8Ó|¦ùL3Û¥$•€P&ÂRHéÔ P‡Õa³Ð#÷Ü€ê™êüg¤ÐŠÖljÃOr~ce-úˆÅóŠòŠòŠà¾îùºçë²8ðÀ.+ZVcfþfá7  ôFé s/@cuc5  e©»±Û„Çñu>ÎÏõp}\艆S §Neg¦†Õ°Gq3]èW—¿º 5e5eð~àý4T4Tàu±{ÌNÉà|:?×Ãõ‰ú‘*tÔ:jµÆË¡6j£6"ZH i¡åª¸*^5çžøðÑÕÛWo•^þ9ÑË /7ÐëSæ$'9‰è<§óY~Ç€cÀ1`ùB](þÆF)œSbJ$IÚ-í–vh'í¤D4ES4E¤™‚5³f‹Žû¸ODDUTEoŽ4¥)MDé!=$‡Åaqؘ‚Æ£ñ(…¹>ëÄ:±nvB'õŸk?×~®Ýd§êT¯=LüüÖ¨+Ô—×—€·ÓÛùšWð >1Uªƒê`–ïJÏ•ž+=Æ ø+¡D(Jf'HZ-­–VwtóSæYæYæY¦.lll5l-[ËÖš¨ jƒYɦÑM£°¾`}Ák„&ñ1>°±1;ý$’H(ê(ê(êÐŒ@Z$-’ýþ;1וëÊuùÈ×äkòµ ã±±ØXlLŠ´±6ÖÆ4ý‰£÷PŠR”Ršh€ˆè½¢WDD4MÓ+ÄXŒˆ(•L%MÍÜ.³ô‚^±MlÛdluΞ;{îì¹ÃfBþ?äoJmR›Ôö¯_jÚ„6áSlÆYú¥£ÄQâ(‰þ‘ÏÈwÔwÔw4»–Êe² ³–™µÖZµVó’øàÄà«õÕV›j³’V²¯YòÂÔ…© SØÈùÄn±[ì~µNX,,ÿô¬M ôã|ív;jz…~¡_èç^Ñ~ ŽG4¼{@= šŸJ»w kè©Õ:‰X¬?Öxœ§Ç©ì5¶ºSê”:}^CZÕQìÎj­¢*ª’;)@ Iq).Å?æî^w¯»WqEGG[¼»š­6 ÔZ@RëÕzñ5¾Ø6¶mÏNeû­í·¶ßRp|yZž–§ƒÇò÷åïËßG$zE¯èuuƽò=ýw›ôHz$=.,8XpÈÑâhq´q@o•·Ê[•]Kͧù4Rbƒ^`¦7^ý±Z¨f×ötÙé²Óel-Çs¸.‡+–q;¹Ö.Ùo5Á–Þ°ængÆ»‘Á7z×¥¸WVöD{¢=Éz1„B@07”Ê ±Í†'ç‹óÅùýÆfÅ/múrèí Òi›w7Ïå]eDQF²ÎÉŸÉŸÉVL®˜\1©þÈðâ€4 ü®‚[M·ž]à{4Gdp€7y·ÇÝãîQ\‘þH¤ß8T“\©ï¢ï¢ï¢–4¼Ø+÷ʽ!ý/Iîßm¼z;½3—@{ð‚tïþùMÞ­®¯®¯®Ïz7X¬Và|¦Ÿ;!4 MBSM‡•F|aã迌¹¼»Fê–º¥îè*.¸©«©«©‹ý¶8]œ.N+ÿ4¶:.Å¥¸o)õQõ‘~íH_ýa÷î1k^ýPhZ…V€ÖÓzZ¯ýD\".— $Ðßnx’ž¤'I$Ý”nJ7…Ëzá6ÛÎýßÂe|ÕR-ÕÊ÷¬Ý‡›E&2‘Â%á’piü™öm;¶áιÕÿ³D]ìúSIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.9.png 644 233 144 3024 13755454067 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÉIDATHÇÍ–íO”WÆÏ 0ŒL±h©Å`%¾`´bkšHªC¨!!5Stp?´Ž6V›F”¦±©"º±Rœº1hÓ²»†´PÒ6[_Ú`ÕJ7 *ƒe°`A§‚€Ï03Ï3ç·fž>³öð|9¹î—ëºsNîûB!žîâæÄ͉KŽà¸-†=qmâÚyÿŒàZ LëMë»>„éŸMÿ åTÊ©ðmë~=>6_ƒ?VO·‹g…a07™›LùQü1¼µä­%‰©|ä"Xš-ÍUp~ãüàëÏ¿þœ÷`èÊЀ‘ü‘|0°î×ãõ|/–_|ü„¾ÿ]üw¦»`N0'k2ÖÌÝ ¸3JŠKЧ N‘q =¬Xe>0Î8úòÅ`Ý×óu>_×Óõ#õxÎöœMx£ôRKC$áö—°;}wº®jr+¨ãê8€æÐ@^”0aë~=^Ï×ùt~]O×Ôc\åBñÉë`hò€Ðeµ=d Y@ZÕ,5‹ü™ÌDªa5 @Û¨•j¥ %kÉZ2È|i“6ž\2<¡&«É„Ô‡¡Y¡Y ~°?²?Ft}ý*Bˆ…ÇÀ2nŸ*ÿð\ö\þ@È×äk(üjªAŽÈ9#éÇ?+((1)R‘ °ƒ6iC¡ Ê?;ªÕç—H=Ñ«ýYþg«i«I§ /ëIw»Ýn8úÅQ×Q²ëN×®;0¸|pùàrpe»²]Ùp²ÿdÿÉ~h47šÍà®vW»«ÿrbÜÜus×Í]àÊs-v-FöuôVõVzòîÖ…[êW[û³¿,„×Ë¡¥®¥ºÎz{Ë·ç(³kg×Xõ˪ «.À¢3‹Î,:‡š5j†g³À EeEeEeFo×_«¿VÍ(¨³¦³¦³²œYÎ,'¬üÇÊ#+À‚-Ù Ù îùÓüiòmøêØWÇ@š#õ­3éÓ¤Oe(%-–ïg~?v¿_þJù+†@NwNwN7Ô$Õ$Õ$ö†Í ›6ƒ½ÅÞboB„~W‰«ÄUyyy†=×·¬uY+ïªï«ïþü TmÚ…id“@M±¤XÂÝrσM6mßãø­ð·BXz`é¥ÀÖjkµµÂdÇdÇdL,˜X0±2|¾ \ʹ”s)ç¯WØßÐßÐß¹Ž\G®Š÷ï)Þ +â3ã3áDÊ©N}„4ES@Ï$?“îá[·Y·É&½7znîqõ¸`ڬľÄ>¨\Z¹¤r ŒfŽfŽf‚Ç{÷ï…¼´¼´¼4Ã0Ì3 y†­ØÏ~r@êQ£Æ¨!*¨‚8p€í[y oÕ[ý¬þŸÅŸÇ>Ê ‘ƵPñ¤â ¨·´}X›§Íówí¡ö-1©²F6³Í,3 TH…TÛ¢<á  [x³Ô,E3géËôe ~‰÷‡miÛҀǿu”?ˆˆ6Cf43}CM„Â@-›@•¨f8F;í Nª“ê$Æ„1tÓMwÒ@ÏyÎó$¿—^zÁA#ô™wÍ»Ì$²›ÐÃÁp,þø`…͉/滢ú>v|ìxù޽ウ…Ms›æ¢Bî;äæ_ÖVÕVÕV7VÜXqc…WŪXƒÚ§ö©}IxoÛÞ¶½¨+CKBKl>õ÷ž÷žu´¾+b. ÕÁ™#gŽÀÍ#õ‘zµcÁÌ|ß|±²ñ²‡e!ÿzþõüëìv;Àö†½a{§û÷î;œ4ØBµP-½^¯×ë¡z°z°z0 ÿm 8PL,ÞaŒ´µYƒ…êĸ–ݔݤ:a&6ƒ3™çÞ<÷&ìúª®¸®Ø&**/*/*‡½AoСÿbÿÅþ‹à*tº !ÐèôÛxã‚qÁ¸±©ØTl :Vv¬ìX  F F!p¦wwïî$ü‹‘¢‘"€Ù—f_R‚ž›™›iÞR»W?®¶×þNÍíõ·×ÃÒæ¥ÍK›Áãö¸=n˜^>½|z¹Ý°dgÉÎ’à7ý¦ßL"j5ZVP§Ô)uÊŽ—Ö–Ö–Ö‚ß<=vzÌæ3¢ ÿ5 ;+w–y+EÖkõZÇ-Ç¡´Ci‡Dn ·„[$⦅–ù–ùD*V©<"ÒSÓSÓS#âLu¦:Så¥é—õËúe‡ßáwøíøý÷Ü? bt]F—×îiwµ»"rAZ¥õe8O¦õ5úó¬yÖq+E}1}túèµA‘_7üºAä·üá?‡ÿä£XwlQl‘¼èù°§ª§JÄõÀõÀõ@¤«¥«¥«Å&rttÉZœµ8k±HÌóƼ"[6nÙ¸e£ÈXéXéX©Ï>‘íËö‰¤å¤Ž¥ŽÉ‹Äî#ÇÆ`z0]D$ê‰z® ñ-€O÷|ºžëñ-ùû—H¤"©‘üH>*òYdGd<}6úlÔ>šÉ¼É¼É<Ð*´ ­H'tooos•¹Ê\•„ÿb²~²õb`æüÌy{+ùù“µŸ¬MÚJK7lI蘥3(·r¿ÔÿÁT*HÒ1ÂWÃWÿSǬ q-û*ê*ê@µhjÐÈ1r@uêSúß `+?ÚãÌTü®TwÔêàv|0·›ÛÑH7V«£ñþ°-c[{Uù_ß»òµ}]¼¶ï±×óûQM_ÑIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.7.png 644 233 144 3005 13755454067 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܺIDATHÇÍ–ÿO”WÆ_*LI]E•qMˆ›ªm3Y‰"± eÒ´Liº­¡+Ó(» 2Û(Ùþ@“¦&EHK‘º-¤Ý4‚ß2Á¸º4‚KY]âh*PР uH”A&&3ÌÌ{?ûÃÌÛ—®ûx™yÎ=ç<ÏÜ;÷¹W@DD–'>’s’s’3â8ùF<½$½dãßã¸-Io$½qû¯`i±´d~•ù•6f`}^Ï_\/bô_̧Çe¹´î´î¤] Üom~ksúoâø“05ÂÁóÏœé<ÓÉa˜þaú€Ç»ïëóz¾^¯÷[Ü_þ‡_žé}¦7é>¤-I["ë_YÿŠõOñ„»Vx­ôµR€ŸS~NQÉ{˜1«]@€ú˜Y„õùD¾^¯÷Óûë|:\ÀŠÂ…"ðúÛ¯¿mú[¼`ìpe»²u¾ÈYà#> Ñ@4«ŒU5 H" ¬Ïëùz½ÞOï¯óéüq=ÆVúDDwƒcÖ1 * 2‹¬Š¬­?2%’PªÔ;ªBU@Ô½½Ú”6¥MñÄPWTH…P±”…¬…,"±ŠHG¤¢ ñþêe«ËVëw[ù‘ç?SÀ¤*ßÄàÄ °€WA½¤^"È?é§”(Qß(ý÷ÐDMÀ&6±iQ¨¾U}«ú»xìⱋà û¾°QD#ш»Öv­îZ ŽoË•Z´´Þé¬é,àÃŒ¢Œ"Õ-D3M™&mTýåQÅ£ ãØWþTüS1äÝÉ»“w;;;¡µ¿µ¿µ¬n«Ûê†ÖšÖšÖ°ž²ž²ž÷¼{Þ=¿ˆð8þ¿6x7x7xá_yWW\]aðiç~þðs€Ìe™Ë´QѾ3;ÍNÕ sæÀÇÇ?ÿ ž]•>™> –†Œ† ƒ§ç~Ïýžû???`Ä·ÞrxËa8±÷ÄÞ{Á×áëðuó'Í'Í'ͰýwÛ7oßlĵÉÄ—ñé¥ÓK…ŒK—Tw²ª™oŸo¿y]äZɵ‘ÿ¬››âÝðÙðÆðFYè]Ö›Ú›*b9j9j9*"õR/õ";Òv¤íHI÷¤{Ò="y®„¢ñSùðßÞËÞËàMñ®ó®Cy˼¥ÞR¹B® h§v˜ÉÉÉm¥¶R[ jÚ£öÀLÕLÕL¨I5©&Á¿ÑŸíφà÷Á‰à ´Z­¸ç#æ¬wÖë~ÖvUtß0|D÷•„Ï,¨l•ý‹ïÀ~ö³´€ÐŒ«•£rT¨  *#‚Ì1·Š]‹]û•Å&b¦iÓô>¦ß»ùÐQç¨õM™¯ÇÌ13¨ï¢þ¨Ÿ'dÅ €ú^õ©> “N:9óÔˆò(àëfMìƒØD8{9ö²®22HôÍ”7SþŸó?½wåSûºxjßcOç ö¿Ÿ)4Ù#ÛÜŠIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-17-red.png 644 233 144 4025 13755454063 15602 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜÊIDATXí—LTWÇï}ï ?\%i™YcX© Áˆ &2 ´¦ÚtÔTh Zãþ± 26M ¬E”ŒÅ˜j4¦kcÌMé®UkËZÁ¤[5kSmIk†(Û©(Î 3ï¾÷Ý?fî{o&«f³{þÎ=÷œó™{¿÷ÞˆÍ&1&%z=‰ú$:’ЛЛÐ[¶Bb“ØÍÈR²”,"aÕE$"‰û@¬¯ºø|žÏëñú±ý„¢X#_-©%µ‚;6>÷%©Wê•zÝã´ŽÖÑ: $5m"m"m6ÞÙxgã`Ó½M÷6ÝV‡ÕaÕ}çóy>¯Çëó~Ïæ!ÂêXÁû¤0)LŽ,å+”Y“Y“YÃêO]=uõÔUu†ï¡ï¡ï!"Dø1…)LÁFÍÆù|žÏëñú±ý¼ÿl>bž)Œ £ÂèÈE^ÀÚoí·öË+‡ÃÃáá0†55WÍUs!³&ÖÄš¶Œ-cËfgvf7øÑ8ŸÏóy=^_Žéož©¡Q7uS7!ÒAé t°ãž`sÙ\6—l×ÀÞVwª;á“;äqyPGØö@HÉP2 ›‚Ïð°}l€Ëa9€:"çËù€Üì vêÛJ¡RO³¹l ¶ÙÎûsÎGLwMwMw×-çÌ-æs‹šåýÕû³÷g<ŽÖñ±÷"+°ŸØO|êIõ$ŒæÓÛþ‹‹±÷Ô·Ô·ô¨÷Wï‡ÞñØÜb>j>ªfqOÚ%í’v];ÈÇ«W¯VwF øe·ì–Ý |¤|`š×¾ðú…× eqËb#Bð«àWÐÓØÓ]Ûº¶€ûK÷—¦Ý îèú¾ë{@v=ëëYZ²ÿxõ±ùÇæ«;µ•á#êXZNZNZ\ãeãeãeZ¢ ÿÎÄ@" T TÀÂÆ…`«°UAýmþ6X0{Ál rO€ "ÌønÆw|ÑqKãõÆëz¿ñ²?<øà<œƒÚж¡mC›Þ ‡Ž„ŽãC]]ÆÆüóµ¢×ŠŒ j‚šÁ_‚¿ÀãþÇýÆø¡w½ ‹rå¿2~`ÃÆ9ðsÎÅ'ޛޛޛº„ØZ&2ј88côm·m·ÀJ­Ô8®ä+ù ”€q|¨n¨„L!Ó ÉhÃ?†„èýùŽ|G¾voÂW´rEûŠöí Ò R=èATlÇvlàcËÙrcãr¹ŠìEöД rÚu«j¬j€W&_™4hý¦ò­ò- æ©‚*@å³­s¬s¬s0Äùˆ`ì‚=ü€?u§kOמ®5H ‰e° `óØ†˜×c^¿¾RÚSÚÒ¾HûB¿ab#oÔ/ì1ùêqI3*þTLq od¿‘ð\ÿõ*غl]4¨=_{àìWg¿bÜuÝuüVü[1˜ØÈõF¿Á·_>~B_žé~¦;fâ­ñV°—ÙË2ß‹ÜÌ„ë7®˜ˆ›ˆS±öI$©bÀ‡cÍ,ÀF>Zoô|¿¡gèGæH-ý5Ø´}Óv[G¤áÆqxÿù÷Ÿ7ôB]@3Í$æÓ|áªpPWÕUbˆy£Þè7ø ~CÏÐÌcn弈ÈßJaËÈ–ÐÿêÕ~ e†2Aei¯h¯ŠNªt>©O‚æÕf´P5ªFÕ`®iܸ#¥Ê´·µ· i¿†C‰ ÞðÃß0kè[ùO‘¬C`óÙ|>‹ÒGzGz&ÖZ¥V1Ï/L2 ªJU©*àÇ8¶`RJ)ÒH#mA|9ËYü 2T¥ªdg”eT/ªÏÏ‘y„{""G~PÔmªÛd°éøõÚÆk¡uU«£Õ û‡ý¦^FF´µµÁ­¾[}·ú̼¾_߯ï7ñèÑ£àðâñ‡cQã7ÆZÇZM=5WWXWhlí‘$ü³ˆH_|{æÛ3ðÓú›Ko.U;R&¯L^I ²±òƒÊÀQâ(q”À9×9×9dõeõeõAáPáPá8v:v:vÂDõDõDµ9Çæ±ylïÌwæ;!§'çlÎYXq9ó­Ì·xRµqm\í€Ó§A•Dæ=7q.qN‚‡ß=ü¾×¯Ä_‰‡½%Ù>²Á…?](¼P%%%P3Z3Z3 e-e-e-æyþ<ží9´çÐ3~ôþÑûGïCÁæ‚Í›ÍøêÙü‹ùáóì/×|¹ Øl„pò³}Ïö©S–Ø~k†5ƒ—Åæ¿ã¿#ký¯^ ˆwMQî®Ü]’¾méöÜí¹"^§×éuŠìîÜݹ»Säà‰ƒ'žYçYçYçt º]"–K‡¥C¯`b01˜(’t<éxÒq3¾èô¢þEý"þŸüÙþlñŠX+¬’.ãŠãŠyÙ¢?ü1øcÌ`œ?å“”OdÕß/VñY…¤÷hç‡Î‰|_wùÓËŸŠä•å•啉t;»ÝN‘ìÎìÎìN‘œöœöœv‘þÙþÙþYû°}Ø>,tÝA·ˆ=Áž`O™<9yrò¤ÈÌôÌÔÌ”ˆo­/Ù—,²b~EÇŠIÛü7ó߈ÈÕ¦ÚbEÅgìLÑ™"˜üÐ_ê/U;ò׿Þ˽G`ñ¥Å]‹»`Ûõm×·]‡Ûno¸½Ê]å®r,«XV±¬ö6ìmØÛÓK¦—L/¬‚¬‚¬p_r_r_‚ÚæÚæÚfHJM²&YáÃÝ i i¢n²¾~éë—€÷¢g̸ü£ÞRo1oIð/¿ÿ^ ÓñSþ)?*Ün·›g$ð ð ð¦VO­žZ ´ÐB ècú˜>3=3=3= WëÕz5¨uQ]ïï5ï5”>r„¦Þúwêßôè­äÂ>ö¯ˆ¯¨ŽÇ>ö¦z“yU¨JU)(«²*+¨&Õ¤šÌA•]Ù•¨¡†…Fû.õÔƒîU *@¥¨æUK”¿vd|dÀæµy}n>f8ÀpÞ­q[ã€?GœYõhsÚðyØv›ÎOûØê?ªWõ 0x˜fÔ 5 €»ÑúëÉz2!õ_í‘öè2œ«e«>éüOï¿ò©}]<µï±§óû8éð¡3&2IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-14.0.png 644 233 144 2760 13755454066 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¥IDATHÇÍ–íO”gÆÏ¼ @ Í…Ò²Z+DÊ.ml‚º´Û¥/c"M¤¸#1 n ÝMÆb•~Àí&¥&$*M‰³ÕâÂjhœÄwµÃ‡m– ÝÊdh…Zñ…Îl«˜yæ¹ûaæaXù<_&×y¹Î•¹Ï}ž[@DD–'¬…ÖBkv[Ÿòg¼ñÂ/ÿšÀ]q°¼jyõ?{!磜r?ÎýØKa3næ/®Iñ/îgúe¹¤é½é½Wï‡-e[Ê2JàCÀÑïèŸÑÁ{Ú{ ï“¾Oxn ÝøÉõ“ RØŒ›ùf½É·˜_ößÓ_–}¾ìsË$¤§¥§‰@QMQMqs"áÛb¨}±öE€k¶k6e€ø€§r¦…a3žÌ7ëM>“ßìgöOèÈ6ÿYx¥î•:Gw¢`ì8¼]ðvÙ/Ö´ÓŽtM×âõñzæA]P°`6ãf¾Yoò™üf?³BOê( ‘?ÿ†¸[wë ‚FV¬8V j8þhüQbÉ€23T«jQ-`…F!)›æ×R5zƒÞ@Lÿ!ö@ìP;üàÖÜðßdÿ…£œyìCpL8&4;ãŒ?ñ° ¿ñ¤ñ$³ÜkëYÏzPÛÔ6µm‘?B„È"¼†5¬~ÁÃ<  ^V/3ËÚ$ÿã¡@(àКfçË„žä?Öu‘Ÿ›¼M^P{Œu&ïÑíGß:újtÃè3£Ï,‘ÇÄÙ‰³gá¼û¼û¼;å7.—ŒK)<Þ6Þ6Þ‡V}¬úØÒxØö„=P¹¶rmåZ(÷—÷•÷Áêsů¿ÎüËõI}R5©wO½ jcBU¶doÊÞTñ”È﯈:!åRnéþ·¶£¶CÒ‹ÆŠ¾)úF$ÖkŽ5Ë‚uÔwÔwÔ‹ ú}ƒ>‘ü•ù+óWÊ;Su¦êL•ˆ­ÄVb+ýíèk£¯‰äTæzr=’þ÷B_¯ÎÒ-R+µ"¢¾ÌήxÊ*´}aû‚'ÄoŸ±Ïˆ,Û/_Ëשۚ³5GdÅßVô¯èɬȬȬêêêñøF|#"» vì.™Þ>½}z»$økS¢þ¨?êqwwOù³OedˆÌýk®l®L""i/¥½$"wm.›‹'ì7ú~Ëe±ÆÖÅÖÉùµˆˆä/oˆVG«Elã¶qÛ¸Hð@ð@ð€H¨7ÔêÑi‡´C"Wo^½yõ¦Hב®#]GD+++EVµ¬jYÕ"r}×õ]×w‰„§Ã·Â·D´çµ,-KdõìêîÕÝ’/ŽÙ“³'Eä{Õ©:-—“Ã?ÜÊéO{>ír3–‘yW¡+Ï•LÍN¼,^/ƒÎ@g 3555¾¾¾¥Í¥Í¥Í0Õ7Õ7ÕÞvo»·œËiÎ4øÓZs[s™On“F8Qr¢hNèIÝÊXÓ;Mï?˜·2~.~nÿåög·?CEÑÁèàÒážcŽ9àNðNðNpãÆ á}á}á}`4 F(¿Pùgä«ÈW(c:V+MÝJ"Mo4½‰}Úu1)ì±ÁqËqK³CènèîBßMè†Ïð-Úcïóï ¨€ Œûðöo õlêY€´ iô»±ØÈõËû…ˆá/ç3æÅ*›HìHìˆ+ŒÆuðQîG¹Ik"ñ`é²t…T(ÿ¶ü[€Î¶Î6*aÂ3á˜+œ+„Xläz£ßÀ[Ž/ê~Ä/Ä÷Æ÷Æ=€Ä„Ä! ûìwrª"÷r È^døî…ï^&ЦRd!0Ï<ƘYùh½ÑoàøŸÁÑ# ýíô·…€ö°ßòûHÃÝoàhæÑLƒOéê©'Ôyu@;¨$ r@GÄb#oÔýžoðü=±_9+„'÷@I°$ògÊ õ®’¡d€~]R†P¢J¥Ì”/É—@½£úTè^Ý«{ùép£  µß.[:‡¢½¡T)U Ù#øì+±–X '÷Ä~å_…bã—`™·ÌÏ›åìðáÀ/Ø ²@°H? €>¢è#@M4-ÐH# ƒ2(ƒËæ‡fxžÈ×äk,F³{!ÊåÛøetÅ\ny¹"®"Î@Óó†2}>Ÿœ¯:W9W!oúoúoúc|~³ßì7ƒÓê´:­àÍ÷æ{óº`J¿Ò¯ôCW[×ù®óÐü~óáæÃÈóƒÍW›¯ÂlƒÖÂzTæWæƒ|?¢GèBá=Ý_u·ÿh4Ȳ¬Å—]/»ÛÛ>µ} ë¯?¾þ8´··æäMÉ›’Á¶Ö¶Ö¶²ª³ª³ªÁcñX<–˜°YÛ¬mÖkÆÖŒ­ƒ¢²¢ýEûáO©£ÔAxtËœ>§Ë2èü¼ósЇ"z„ö¯dg²SvÀbx1 Ý–>kŸŽþòȶ#Ûb;FwŒî…ÝÛwoß½L ¦S,¿ùÑæG›Á™ø3ñgâ—m±A÷ {Ìv³Ýl{•½Ò^ _O]è¾Ð½li·àYY¿²^vÔ4KšE¿#=]:];öCýïúß…-§¶œÚr l÷l÷l÷@­WëÕzñøGüëÊu庠°ª°ª° ¬ Öë2a.·Ëí‚òžòžòhomomo…ì7^Éx%ÚS:k;k™Õ«zAûÝ‹Í/6ëw„þçGŠCvÀã?ŒÃ¿ú§ýÓ°"#i4iêd^§ƒÖ¦µimp«åVË­°,Y–,KpâÁ‰'ÀBßBßB<-xZð´¦Ú¦Ú¦Ú §³§³§Ž­;¶îغ˜àí+ßô½éƒf¥ÕÜj·†[A{uÅÃe‡P­Æ»üúå×á{»{»e™É#„„·ú·z·z!ûböÅì‹Pœ^œ^œi“i“i“7“7“7é½é½é½pzðôàéAØU»«vW-\O¸žp=vzwzwz!õW©©ðÉ\©³ÔIø?§d´ßn¿ 2Ýc|9ðYÍg5 ü%r*§þ¸¸ãîñûã÷‘5ÕÕðøÐãCÁÌ™3`¼q¼q¼z@躺ºÁ Á Á WËÕr5¨5jZÓæ©ÐT©ŸUö*{c.À}ÇFÇFÃÏ\naøÆ3ybøÊ3Ë‘9Ï|çÿ!B±Pþ]z¤äÏåÇòcù–|‹E™ÅÏö û,s–¹y3ÿü3n€“{8_ÒTÒò›ˆ3ËZ¢–òª–¤%¡† R^•WäîÈ$/ÉKòà ‚ A9)'@Dç´1m Eö«ß«ßŒ:?ûÌûÌÀÒÿù½+ŸÛ×Åsû{>_°ÿ,>W ›4IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-52-grey.png 644 233 144 6261 13755454064 16002 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü fIDATXÃ…—{T”ÕúÇ¿ûw®p¸‰ ý°`„q[,Cââ1Ó–GŒÌÈ•ÓÁÛùIZtHtZZ™†¡i3P–‘Ç»G!@L1/GY‘ÜlbåÎÀ̼ïÞçfð,×jõü³×Þï~Ÿçó>Ïwíý¼D§Óét:x`Â&.†¿Ãßáï°rÝ7ºotß0Ÿœžœžœž¿„0OæÉø|ðù`ºùÁ‚ ,Xñ‰*@  ˜«W‹«ÅÕ‰ùLË´L{çUnÙ:¾u|ë8€Ô ÆïO|1_Ì×³ÙÆlcþIêgÕϪŸæ,Û°lò ü!!!¨á oxC`A,ˆG ZÐÀ®p0‚ŒxOâI€´’VÒ ÷q÷Á¸ ¸ ¸¡ýÔg§>;õ™ðjû¥öKí—øk2¥L)SþZ&,–KbS‹XÄvsÊ:e²úH}¤>;/ZÊ,e–2ÿ$õ êÔ/‹´©ÚTm*Í}û:÷uð®W„+ÕQÕý /|á Ãä09 äy å(èrºœ./zˆ¢à~ÅýŠûx;ý«_R¿¤~IXäŒïäqò‘œòœòœòç£lu¶:[]YÛ°Û°Û0 LëNëNë&u_{|íñ58Í¢Y4ÜÈur\`…VrÈ!`‡vRH!†0„øŸãs1ˆA &þ@ ?\<ÏÅch`ËÀ–- «Áj°2Í××1Ê42L“¤áY0 fÁÛ—Ú]ì.v þýø÷ãßÇ|ï=¾÷ø2‡_ÕpÚpÚp`ò2y™¼²ž¬'ëvœgÇ.€ à€ Ò Ò R@Ö k5½/÷¾Üû2ÐÁ:XT~*?•x0ð`àA€Ü$7ÉM¸yìôØé±–ø…ñ ãbþ©m§¶ÚHý¤~R¿íK9!PŸNó¼ïyßó>> #z¤ )“ 0e™²LY€!ÖkˆNŽž=9 +?V~¬8‘t"éD n·‰Û€_Ç~ûu Øß½¿{7PÑQÑQÑí)ÚS´8~(üP8`?b?b?2™hYXYXYXÑ;yœ|ÈÌ̤™{dÌi£Bž'äMÎÙêÕ?ªÓ×èkô5×Y‹bQŒ‰o‹o‹o?\>°àÀ‚ 3„B ¡×œ{pîÁ9ÆÞ]þîòw—3V»³vgíNö¨:yœ|v`v`î8wœ;>ùeò‰ü¡¦L‚I0 @wxwxw8P°¦`MÁ `¬`¬` hÕ¶j[µ÷ûûû±·coÇÞþm T  K–%Ë’i©´TZŠGMέäVr+`€ó_‰¯Ä—š=4{h6 – K…¥ø³$B!‰s¼Hø >ƒÏ¦tMéšÒÌöží=Ûh,j,j,¾œúåÔ/§o¾UøV!hH4$qTG«š«š« ª«ª«ª ¸p-àššš5 èŒ'½9zsô&Ú¸EÜ"n;Á+v)v)v ymÓÛ¦·M翬ϯϯÏ'™Q|ÅcŒr”£T ½z-ô”g”g”géyéyéy tfèÌЙ@ã3Ï4>tÜé¸ÓqðþØûcïƒÁ`0€¾Ü¾Ü¾\ qcâÆÄÀ\É\É\ @n‘[ä€$$! cí‹Û·/†Ê(£€mŠ6E›Ça–aYv!¯ãu¼ŽdVUWUWU‹êÁèÁèÁh¨8ÊQŽbH¿G¿G¿¨Î®Î®Î~X#3gæÌ ú‰~¢0µmjÛÔ6 âµŠ×*^,;,;,;€²²2`Þëó^Ÿ÷:0y§Ñ4š«pO¸'܃ªôbéÅÒ‹t1#1âs"‘ˆ_È8Ÿ >|.|%‹—ÅËâ¿íì;Øw°ï ¤ýÄà‰Áƒâ&[BmBmB-¬—/ ^¶ÏÚ>kû,@ß¡ïÐwq3âfÄÍ|ê}ê}꟔?)Rë†W ¯òëóëóë]»®]×lIÜ’¸%ì—¿Üøåä•ٕٕÙÔr×|×|×Ì]“í•í•íý9Ån²›ì¦Ív²õîÖ»[ï¨E-jÿoŸ´GÚ#í¹¬)))ö×& –4#iFÒ r¡7¯7¯7¬Ó§Ó§ÓÄóç!ÏC€ˆˆ@kh ­šZšZšZ[¬-Ö ‘ˆØMv“ÝäZ¹V®…åþÓ÷Ÿ¾ÿ4–—––¢Tþ³ügùÏã X!+d…³–c&fbfãž+ä ¹BI*Q‰Ê. ¦Ñ4zõÕUÕUÕÕj\Þ{yïå½,Ô/Ò/Ò/’ ß¾)|–xêý©÷§P‘ RA*¬ÄJ¬¸w¸w¸w€!+BV!BŒd$(CÊ0dùÊò•å+¸•¥”¥”¥j‰]b—Øyp#Ü7’E'8×°<–Çòx?G›'j&úF~;ÙGö‘}Ös1\ ³¹°¸ý¥ß•~Wú°v b b *’NÒI:†èvºn° »° @"‘0 Ó0 @[h mè:…NÕ)¥³Ug«ÎV‰›zrzrzrø}r©\*—Í ]º&tÍ'ÕÈF6²É1´¢­B¢³u &˜„ÛHG:ÒIqÈÙ³!gó^T¼¡xCñÆÑÜþÈþÈþH~àÔºSëN­{¨]2L#Ó`E?úÑÀ npH©#u 'á$l¢r_1^1^1²„m7Ún´Iò\k]k]k;Çm¶ [FÆ·’o%ßJ˜‘™îŽ8‡ ÇxœºRWê ÷úßê«ÿ °¥ÛÒmé¸xºxºxÞ9Þ\Ò\Ò\"É+O.O.Of Ž;_N‹h-ƒJ(6ÈÙ @"c½Æ^c¯G+#*#*#àîbv1»˜:›Î¦³3>àvs»¹Ýã)îs«Ï;/âƒw=ïzL½T/p”£¬-¡%ô½%PCj6°°i7ýÍx“Ïä7õLýt>Ö¯4DDZ…^«ÕjÙ„.kS¾”Ô ^¬“Ê”úªSu ]ÕF´0ŒXãf˜É"¥~®•k头[©gSÏ‚1”æ‡ÚñÚq ™ÑÏþÊi‘_¶cÒ1™XÉ—›&6>€ŸsÆóÆó$³.œ8AÝS÷Ô½œDŽsœã@ %”XÓjJM©)àw ¨×Ôk$ùSš_=¿0~À‘p$+Jç“Ù±Oâû•±¡â¡bۑׯ'DØêp¼T.P´¶h­q“̵ϵƒúk¶ìØÙÙÁkƒ×¯Á¹ø¹ø¹8xÝ^·× 'C'C'Càëöuûº!J”(ÿ?ÆÆÆ ´­´­´ *ß©T y8µZ`êê@% ¥PŒ›y¢½F¯í¦ä¥jR5"²]DDÖ›+Öþ®ÕΊàÇ_¤0Z-ŒŠäwäwäwˆ8}àôÓ"ñ‚xA\dÜ=îw‹hÍ£yD†>(²íú¶ëÛ®‹ìnÜÜéßÛ¿½»ÈêÛ«ŠVÉz™ZŠ/ÅElU—ê²ÝÌþ+aú>ïú¼ (HŸ±ÌB—*¾­­…h[´-Úfí@ ˆb¿9sþfh¸Ûp·á.ŒÎÎÎ÷;î|‡¶Úrh 8bŽ˜#eË\e.pEòýù~–¾¸;;¥‚ðuðë h­é|¬ªL5½×ôðÀ¬JýýxrüI÷“nÔrd¹k9§ÊŒËÆeã2Ì5Ï5Ï5ƒ±ÁØ`låPå€ùžùžùH†“ádf›fßš} ¦ïOëÓ:êáïïañ[Sïíå·—z³*Éö±ÇLb%Œÿ8þcVßϲñ©ñiNû-õÔƒ‘0†u¡¼Ê«¼ ’*©’9‡k‘EsO›ò)_–Ï?écüOAe:¯ª[Q·Âêüصim8¥/ê‹V秇PñÌÔI'À,ßó=¨ÔŒšvÓB J}©éšNJýSwêNPŸeøÿRûAíæÕ”ÛùŸÞ»ò©}]<µï±§óû_Qoüo·A)IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-28.1.png 644 233 144 3016 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÃIDATHÇÍ–kLTgÇŸ†0b1ØØFA«q)Y/Ñ]Œ©-ÆFh£4 “Ò¤]Ú&Û]MÐ~Z?hdÃÚZ‚c2RY¢b—„›„Rìššfð8Þ–Ëp²¬t´ŽíH&€03çý퇙Ùm²ß}¿œüŸÛÿ9ç=Ïÿ}DDä…ÈS fEÌŠ˜ä0Žùƒa7˜ VÆŽ˜Þ6½ÝÿXl_lH©K©ÓÜÖýz|t¾ˆQ?šO·Ë bMù|ÞyõWÍKÃøs'$¶&¶N¡¬­¬  ålËYþ¯?¼àË÷åƒu¿¯çëõ¢ëË‘_ñ‹@\G\‡éߟ/鯧¿þÊŸÂ÷_Â7 ߘŒŒU1ò,*ðãG_O¢°îÄëùz=½¾Î§ó‡ûHÍKÍ·Þ}ëÝÄ¿‡ÜõppùÁå:_ ¨  ýA?@Ȳ1Ê©œ˜0u¿¯çëõôú:ŸÎîÇØÊŸED¾Ø {Ùû ¨ekÁÁÀ‹Aë ŒÆ D:UÚ´æÓ|üOp"8jZ§Öa¬¦˜‚áxÐr´Ú¢à†àPÝáú°/n_àÕùõ­üND$£ý‰~ÿoÔÏ#×F®¥ìµImb†ï¸ÂмšWó-´ÐÕÈyÎsÈ%—Ü({3Í4CÈr†œÀ%mTe&âÝMpÄ9â?ÜXFuä‹9ºÔ¥L™ôjÚo‡— @Õâ/ùÔ­]·vÝÚeðÝ«ºWu¯ N8qàÄ>6|lø˜áWveWvPGÕQuÔ°Ÿ);säÌÔ¿¶Þμið©÷Êî—Ý×·ÖÑ%Ú&‘ÛåpñôÅÓÐÿOO¥§R}°bæeÇËævünGöŽl°>°>°>{½½Þ^Y Y Y PT]T]T «²We¯Ê†ÁîÁîÁn£‘ù“ó'çOBIoIoI¯¡—NvlîØÌ\ä5>MÖÔèÝ.—Ðݤª¤*Õ3s3spqñ·/}ûüsùæòÍÁ–Ê-•[*Á–fK³¥AVSVSVTçUçUçÕmu[Ýà*tº ¼ÙÆÙÆÙFhØÚ°µa+¤?Lÿ1ýGè¸øÍ¡oq¡ùɬÉ,€ä’PB0%1%QT‡¼%Þcì‡mCo ½ë½ë½ë½°gxÏðžaèìëìëìƒÔºÔºÔ:(ºPt¡è¬½¹öæÚ›à:ç:ç:Ex8t8tØÀ9¥9¥9¥Ð¢5?j~dð…ü?¹r¤,JY¤ ƨæ`i°Ô4h:w<î¸HÿßFì#vIÝøýLJHñ_‹+Š+DÚ­íÖv«ÈXñXñX±ÈÊ«+¯®¼*Òfk³µÙDâïÄ߉¿#Òåîrw¹E¦&¦&¦&DKKKeaîF£"rE¾’¯Ì©2|-øšˆˆÖ®µ›cÔ§Ó5Ó5w{Ez z DnU íÚ͇s­s«çVË|GJ‡¹Ã,²d|Éø’qs«¹ÕÜ*²ÆµÆµÆ%’ܞܞÜ.’ٓٓÙ#R0[0[0+²ýÔöSÛO‰xû½ýÞ~£±¤³IŽ$‡Hœ%öQì#™üsšv9ãñ""þ|þÝ^áóðÀ'Ÿ}ò<»ž’Çݞ˞Ëà‰õ¤yÒPžß{6z6³±gcÏÆ@³hÍk×<®M4ÑÔ~µ_í‡'µOjŸÔ‚¶MÛ¦m3¶rêÓ©Ê©JÔüµ™Î™Nc*¹ññÎwFM¥®†ŽDtL×™µL-[ДOù””Y™•9J2T†Ê5ªFÕèÿí4ÓQ•®Ò£tŒ‘ë#×ÿ¯Žé'À;9º·|o9¨ú°2«Þ%dõàÓàSœæ7P´ÑD¨KªSuµÔR <ŇÔ°êS}ÀЂò¿¯½O€øPn(¨YPþ„} Àܯ•ÿù=+ŸÛÛÅs{{>o°ÿ¶’ôQ«Ü×IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-34.5.png 644 233 144 3014 13755454067 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÁIDATHÇÍ–ÿOTWÆßÇ"ø…’t)D“’¶n•º˜Xp  ‹+k­l›‚T³Ý f“â&ºkZ—LH 1Ñ6ø…‰6 S†dcvÚtÅâDd Æ¢°ÃÀðufîœÏþ0s;Döðü2yÎû¾ÏódνÏ=""òrôWÀ˜fL3®‹`£5¶¿êÝUïf~Áv e†²»†Ä³‰g’¾Lú2üS ëu½é¼HŒ©ž¾//Kl#îrÜeC^Ÿ€÷²ßË^•ÁŸß†xG¼c6Uת®tï:Oü<ðóÀdÞdİ^×ûõyo)¿œxN_V~»ò[à —D ½ ½ ãh¤áAì-Ù[ðxÅãÊÚ8°†5*ðãG_K°^öëó:ŸÎ¯ëéú?Éï$¿#ûÞß÷~|Gdà§ P¿±~£®t'9ÉùC~ívˆEP·Õm  †õºÞ¯Ïë|:¿®§ëGüÄŽrNDä ”{Ê=þ7@Ð f3Ae‡òCù£N•nY}ª>QŸ@8-œNcùê'D¥}88GP{-x4x´’?åær³nð Kì({DD6·B¼?Þï7©°Çåq`¨·Ô[Ìq•k\Zi¥ØÏ~öƒ:¨ªƒKŒÌ0ÃÌ<Ê(£À4ÓL¨,•Å\´º¢zQýˆ±Í­Â˜ˆˆ½OQ½¯zŸÎ~ãÇÑï÷~¿ÎüöLΙ”gÊ3é™\þ‡Œtttƒ³ÜYî,_^Þ Þ ÞÇyG›£ l¥¶Z[-ªí_¶^[/ü÷oÚ¢¶~ê¶ÖmUñc ?Ù~Ý %•%•"w~7œ:œjغëë]v=€ë÷®"W‘,g,-–‘á‹Ã‡/Ê/ËzÊzÊzJ¤¹¸¹¸¹X–­ÙÞÙÞÙ^‘šüšâšb‘)7|7|bp::%0ýµ¥¥a«H~A~ŸGü U«}«}oæˆä'ä'ˆL}óÄûÄkè8òÝÇ>~$qÖCV«Õ*’˜•˜•˜%bºdºdº$bO·§ÛÓEœ.§ËéIÞ¼!yÃrc÷½÷½÷½"¾Z_­¯V$¼:l›Eò7YŠ,E—ñc’1ÉhèmoO½=%bô®;¹îä›9Ik“Ö†ï±jÜ;î½öSŸùŽøŽ@a]a]al7o7o7Ãi÷i÷i7ìHÙ‘²#»»»!w}îúÜõÿçÙÏèÏèÏ€ªëU׫®Cg{g{g;¤¿öê+¯¾kºŽwgBî´¿®µ­µ…œ0˜0¨.C 1Ð-7lý¶~(<^WÈ9œs8ç0lÙ½e÷–ÝV™V™V ©m©m©m±˜¶—ÙËìe0eþÊüpÜqÜqܦ̦̦Ì%|ë¶ n[°ÝÔnXl_lí× ©Ë¢âDDÜŸÂÕWw“†Ë‚E}ô›Â×Ç^cÑÜe¾`¾===0Ö0Ö0Öhu¶:[P0R0R0ã·Æoß‚ìêìêìj˜˜˜\w®;× ‰L¬N¬†?L~ÐòA ‹óPAçÝλ ¼?ѳ÷ñ]©Æ{+§çóæóàYÜÓ…§ (í¡öP{¸ü¨X`˜ššp€0Qf\õ«>ÕªHUªJµSídNeDù7z=ƒñ“ñ“~ÿÔsL:õä­XQ±øS$™Õ?B¾èОjO—'?'h¦0cÆ ÌD¾•êžúAý<‹öŸÓFµQ‚ª'4.F“Ÿ S… <Ÿü/î·ò…½]¼°÷±óû?ļöc‡å+IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-5.3.png 644 233 144 2462 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜçIDATHÇÍ–mHTiǯf9’éXI_ɵ¶Ð^ ·*W¥Á‰)Šˆ@W„ûÐ RlT¬•‰H ä$,ƒÒP¬ÁB¹Ö”Áâ$ cæKZiÚ¬Œ¢÷>óüöÃ̹æöÝûeî9Ï9ÿÿÿžç8o9o9oAú†ô éÀyÒyÒyÒÐc5²FÖ€ÿ¢ÿ¢ÿ"î-Ü[¸²r³r³rÁ³Â³Â³Â lFç ñëzæWì·¹x`{°ÿÁ~¨JªJªJŠú·Émr›„Ú”Ú”Ú”¨¿:±:±: nÜ(¸õ¯;±îĺ`¿io°7Dýâ‡oVì«;5·Ç†> ½z [¶l€äÆäÆäF(›)›)›ÞÎÞÎÞNÈÙœ³9g3<¯x^ñ¼vlß±}ÇvX~|ùñåÇÁ¦Ø›þlÿZÿZCM³Ç¾:•ú)y¦=ÔFwH}­¾R_Á¨iÔ4j™!3dÈUr•\cecece [d‹lu½º^]‡?ñVôˆž(Ýš[søþÿTæXÀë÷ú#EÒ-2E&SòGy*TÍ0r¦Ì”™€3fƒ¿U¶ÊV郉Ü$7ü"ö‰}†96åôNÂ7æ˜aòc3ÙL¢êSájĸG•Éa9ŒÄ…'0Á8ã =Ò#=ÀŸø\à,gA¶É>Ù‡¤Q @Ñ-ºøa¾ù“ÁþW.ØÛÅ‚½-ÌìÛr¨þ‡u”IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-25.1.png 644 233 144 2752 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŸIDATHÇÍ–]LTgÇŸåk™±%Ö̶~ŒA/Z3&Û,‘.’fH¤ãŠ6m4¤b”¤•JRì… ›½™MšÛˆÖ ![5dÅLgÐÊÆt§Ñ•1¢§ÈTL7ÅÑ‚:‚ž™9çýíÅp<“&{ï{sòŸÿ“ç=Ïÿ}DDäåů@ÎÊœ•9K28g¯µ_è-ô®ùgwè`{ßöþÍ¿ÁK_½ô@É7%ßc6í¦v¼ˆ•?›ÏÜ——ÅÚ(è-èµU-bÔ®¯]_¸,ƒ?CQ (0Ÿ††3 gúOôŸà¸wéÞ%€ÙªÙ*°°i7ýÍx3_v~ñý†_òBy!ÛÏP_/®jWuéþŒÃíRx·æÝ€ÉÜÉ\•ú4`Ç®ª€ Ìõ ›öE3ÞÌgæ7ùLþL=¯x^ñˆÀ{¼÷AÑ?2cÝв¢e…É— ŸñvH'Ò }—¾ TX…°a ›vÓߌ7ó™ùM>“?Su”3""_l‚í·?õ€ÔÅôhjij)wR‰T‚ÿ@éÕ[ôÐ×éoèo€^¯×ëõ@ [Ø‚µždüÁ¨0*HŽô›é7A]Îä‡y;ò€i“ß<ÊïDD^ÿŠE‰ÄïÔLìbì"°€- *U% æk¾uCÝP7²ˆ“$Ifá4iÒY8H èa=¬‡sÆOÆO,,Z·Ž…ca0ù3…½þåbÇ:~Pç>¶}l3³_F£pøß‡Ï>ƒºæ¿æ¿æ&˜`úõê?G=G=G=ÐéŒtF`&:‰ZuGŒ#Æ w5tùº|¨å#ëFÖY|jwÃí†ÛæÑvü ÆŸDDFšaàØÀ1¸y>ÞoS®\x­ãµ4ϧž½ž½Pê(u”: 4 ÃêÄêÄêÔh5Z»¯ì¾²û L<™x2ñ$«¡SÉ©äÔEê"uKÎùCe¡2´Œ—úPŸìŽvGÍÂFšE¿^Ü^Ü®zaA[Ð` hpéàRhù´¹¬¹Ì"ØprÃÉ 'a§§§œ£ÎQç(x¼Þ8>|þø|ÖÚ2à]Ð.h §¼§¼§\÷\w]w!4<n}ÜúØ",Wåª\Ð?è„Yf™ž†ž†ž†,¿²?—½Uöôõùú|Y»7ùêä«VÇrTÓ|ç|çõˆÈ°wØ+reÕØ/c¿ð‘ÐÖhk$üË·žo="Ëö/Û¿l¿Hl.6›±ØGì"ŽjGµ£ZÄr§Ü)‘­í[Û·¶‹TÖVÖVÖŠLNNÊóU|¢¸£¸C$Ïž{?÷¾$ÿ¹l›Ãùá|‘DU¢êzDø<3ÐØÚØ ÏÒ™)™ºŠA<7¾*¾ /‹¯¯Í£y4èz£ÞS}S}S} JU©*åTNå„§œzp ŒÆFc£Õ™GMÚµ¡’Î.œµ¦’ÿìÛ´oSÖTšºaéÈ¢Ž™:3¯œÊù\wPWÕUuÔfµYm¶ÕZµV­–³œåYCðŒg<ËÂ(—reé±K±KÿWÇÌà‹Mü}{óöfPÝeVÝ®ÛAJÏ¥çHqŒË\Fq‚.º@SgÕY @€0ËC‚W7ÕMàÖså¯7êI‘¯¿­¿ t>Wþ‚€ö[åqïÊöuñ¾Ç^Ììÿ‡ˆMCAùÒIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-29.4.png 644 233 144 2754 13755454067 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¡IDATHÇÍ–íOSWÇà€®àÓæ´%ag£ e Y2d%nÝŒ‘ª,î!Eq/F lf,<È"3ѹ¤ B"LŰøüÅ_À5”ÊFÂÒˆ€’®âƒ%h “¿¶”'„âõoÀà7øýSä„û¼û<ð! óe>N0Ä(>ŧøq”PB `„‰ÿ"Š(ùQÔµˆy+øÛ}Ò}4~µ±×¿‰ý±Ž³ò¸5Áš ¡(Kne8N'ì›ö5_ƒ¼Rv¥ìJ™Îsmýµõ×ÖCëâÖÅ­‹aôêèÕÑ«z\ŽÈ9²KvÉ.Ýçç;Ãw†‘¿¬,,×ùȵ:¬àÚPò…⪠z;{;áÆIO“§Inš˜Û1·ƒù3³Õl…lW¶+Ûû­û­û­»#wGî(Ì)Ì)Ì…u ëÖÁxóxóx³Þˆ’¡d(º½*²êɪ'ðfGqaq!¡Ø46)‡·nΩýˆèoÆ}Æ}ÒP ½ÓL&¨ÿÄV`+ÐÍF³Ñl„¼•y+óVBå¶Êm•ÛôøÒàÒàÒ ´¥´¥´¥ü%[ZZ@|/ºE7¼÷SÕçUŸÇM jlÏØà÷©ßMýN:‘†å¦Üá[ç[§û[5#e#e;–;–;åærs¹œÎçä»ò]ù.¨Ø]±»b7$/K^–¼ Ú{Ú{Ú{t¾} úÀ’Ò%¥KJaש]§v‚bSÑ”¢):Ÿœô]÷]š¦·OoWn åÇ´-i[¤?‡ëM·ZoµÂ‹³SGSGÁþ¢Ý`7€²\Y®,‡Ëý—û/÷Cuvuvu6tÞë¼×yLY¦,SsssA8„`÷Ú½v/S©ÆTÈ\“Y™Y©ËúôC³Íðûü>ˆ^26›¤CD^ÒöØñœã9ÐÞ{»÷¶Ü”xA!ÔÔÔÀLûLûL;´··ƒ¥ÞRo©‡9Oç<ól ¶x-^‹×‹Š/*÷÷÷ý¶v´~Õú˜o¼QÿF½¾Ç˜y$éHðilѬžغsëNª§Äû«gÐ3ž$Ï|Ï|¤ç5Ï|Ï|Õ…êBuî ÷†{á¾û¾û¾ØË^ö‚rW¹«Ü…‡C‡’®¤«š¥Ž`$8œ@>)$‰¸SybKâ–DMp;Î M7t‰é˜¦3A9WÎ}¦;0‹Y̹Z®–«ãä!SfÊL –Zjãv}#4‚4õ÷õ¶ bOÅžŠ=0j5š•Xi]i]i…Ûwlß±\U®*Wø›ýÍþŒ3v,v,v,…[ ·n…#Þ#Þ#^(>UômÑ·pöäÄsÏ‚صØ5H.:¢Ž¨6k–¤6¦™fÅßß)"¯ˆˆH¾þÇOÞ²ÿÉ~‘|w¾;ß-2¢h#šHc¸1Ü9ñüÅóE(¢ˆ"_›¯Í×f¬˜­ÃÖaë±OÚ'í“"G;vɹ–3–3&2g¾{¾[òEdR&ExV›Ò¦L³éÃ?ý!g~ùaØ”:cé^«þwõTõLx&<ˆöD{¢=PÞTÞTÞyýyýyý°;{wöîl¸Ñ|£ùF3l n n B0 °w`ïÀÞ°Ålmáϳoòö'¬…oéx§­§­ FS|Œ®Œ·Öþp_ïÊä¥ä%>>…Šˆ}ûØØ¢X]¬.VK–,=­KëÒº@µ¨Õ¡ÞPo¨´«ÚUí*¨ê„:¡îPg¨•ì½{-£+o¶·ë‚ÛïKs}Ö%ëR$ æÍ=Zǯå‘6¤ eèØ?Õ„š5¬†Õ°ATe«l• jY-«å kÀƒ´ˆÊRYªRUU©[¥V=™›™›°†­áH?ýމ ÒÊ«64l0”Kb!±ô'£É¨¡ü|@] þ¡ÆÕ8pœã²Â ¨YåW~`1I³hâÊ—XM¬GtåoÈjÈ‚”0e*ÿÓ{W>µ¯‹§ö=öt¾`ÿ ªö|dªJ€IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-176.png 644 233 144 2721 13755454065 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷܆IDATHÇÍ–ïo“åǯv¥œµnËL˜¬Y2¬A8dd@xAÖD1ذŒ¬1fºÆ4ÂÎ “¡3Y"œCŽu5g :sbb”:1ÍP·‰uØ1,a6Û°qc}~ÜŸó¢}ö”ƒ×›'×u_×÷û½<×} ˆˆHYþ+àô9}NoÎwî²ãK\úàÊsþ8v:vþðÜñú¯”¿SþŽ9fûÖ¸•_X/bãòYq);àŠº¢Ž@Þ×>¼vé9ÿ_1pŸvŸþC‡ÈG‘úßë¿ÃÕ¡«C3™Ø¾5nå[õ^!¾tÿ¿” ” 8’àZâZ"5ÔF‹Ñb´€á0ÄP/ªNÕ ê]õ­ú¥•­ÊV¡™“Úeíòâ„ϳЬ5k€™ç··RDdÕkèîI÷d¦e‰2à2bZVÃÿá W°MGωÏÛ<óÌøTPjB«ñ‚ø+æ&ssøsø¸+q0ïNº“™bKOqNÞ³ë¤8üvøm.³þYÿ¬Zǰþœþœs¸¨«d¢dBè™ê™ì™ٚܚܚ)»Tv©ì’Ht(:Y¶wÙÞe{E\®×€ÈæC›m>$âºìJ¹R"Ñ—¢ÝÑn‘gC°!(î ‰ ²AäS²þ”?¥Ö9²áöp»G÷[ò–<;˜_±ø>ž9Ùz²Õš–zRÿçÂê…Õ,´ü·å‹–/ì ŒÆãp¡ñBã…F¨¯¬¯¬¯„à‰à‰à ;ïð®Ã»ï‚íñíñíqîîî€õ­ë›×7ÃwËãŸÅ?cÁâ3z§z§¬3ß'àýÒû¥Šr4õuêk{ų«oü~ãw8uï©U§VA͵šk5×`àÌÀ™3ÜbÇ÷ß|?DDD@ßž‹}a¹g¹g¹ÚªÛªÛª¡óßÑÎ(LûÓétÚ®WZjmj-XzÊ=åsÒ¿¦>Íýöê¤ùªùª]¸¥iKÓ–&èôúv|úÈô‘é#à«óÕùê`Ä1GLˆ†¢¡h|ã¾qß8‹‹‹@m_m_m|â<;}vÚn3æ_§Ê§ÊÁÒã1?6?vŒŠ¡õ ˆ8DD¤Rê¥\ÊeÑ´•ÚJm¥ˆ9bŽ˜#v¼7Ðè ˆ¬¨ZQµ¢JdssSĹѹѹQÄ›ð&¼ ‘=={zöôˆxð~ïý^ä’þË¿ü¸SÉÝÙ}Ù}"–§H& #Åçbçb"2/"ÂSŽMªBUHÖªôŒyÆûÃÌí°í?àóËÍyÎ9ßï÷Þsï÷>""º ˜“ÍÉæMÁØìïoxsÛi‚ñé˜Þ6½}ÿ÷ÓÓ×ש»Â±‘7ê×÷‹„ñ×óû+ᨮ¨.S~(n…òÌòÌ ‰Áø/½ÝÝóDƒ÷?ÿs€îóÝçi„ïû¾ïXÈ_ȇpläz£ßÀ[/­?ág.?sÙô¢"£"EàÅ‚ R›ƒ#©`+¶|ñ]„2@`ØÈF•xñb,ϺØÈ‡ê~ÏÀ7ø þ „7ÞŒ>lp}&}˜dðù{€ãg#h^Í ¨ TâÕ«z0a‚pläz£ßÀ3ð >ƒ?¨'<Êe‘¶ýP:\: ú·þ›Ú¸?ÕŸ *]{M{ H©Òèwõ» kcÚ¨L•©2ùùú'*ð‡µSk§ð~éoö7C 8ˆOYi|i¼!°mx”×DDÒOB´7Úëµ(}øæðMàOzY½Ì2ãL2 ªFÕ¨ “N:× ¸Ä%.8Öí2Ê(°ÄKê%õË¡l„øBüAaé'…)‘Ó7µjhzö7wlwlОվ½};jè?CƒCƒa¾{m÷ÚîµA{^{^{ O O OýüùoùoùoAÏùž3=gÀù–³ÁÙ€:óoç—Î/aîDÀðéÙи£q¨·‚z$pKDäöïà‹Ï¾ø þU<òüÈóª&öÄsÏeà+I/y¡äÈHÌHÌH„‹'.NÀ–•-+[V d°d°d’G’G’G`Ä=âq‡…ÍyæÚ}ô¡ ³©Îºd]ÊÙ%²×´×$²49™2™b:÷›ûM¾&ŸD92;;DÊÊÊE&M>š|$Ò¤šT“q˜f‡YdóÃÍ7?yÜÿ¸ÿq¿ü¸†Z‡Z‡ZEDt«¯Ç‹ìýÅþÂý…•úMœ9Îl:'¹¯þðê"æùMÇ7ÏÙe1߉LŠLb»D¯Ž­Ž™¤`õõw^Gævþñ•ÆW%ÁþuÅhŨȬkÖ5ë)Î.Î.ÎI«L«L«±ym^›WdM[ÓÖ4‘ˆêˆêˆê°0=EOÑSD*8T ²Ï³Ï³Ï#rt_K}K½HôXÌ@̀̽ûØVk«•ýýô³]¥Öxk¼ê_½¯œ×>þêã¯à×E…q…qá‘ìNÚ´; ²z³z³zÁî¶»íëF¶­j[Õ¶*è8Òq¤ãè[õ­úVè±öX{¬p,íXÚ±´pý®M¹ƒ¹ƒàôŸµœµøÎúÎB åÙ±gÇT—¨nãë²vYÁ[ j~µ7×ëÆë‰ûuûuûux0ÿ`þÁ<ì¼²óÊÎ+w2îdÜI¨ˆ¬ˆ¬ˆW«ÀU999Ðgï³÷ÙaÏí=·÷܆˜ßÆÔÆÔBÕBÅGá[ùk>½ÿé}PóA=!;}ƒ«u–:Kø«\ûóJþJ>ÌDM¯N¯¢΀3à ßñZõZõZ5LÏLÏLÏ€Þ¤7éMa;ñÔ{ê=õ «Ãê0h-Z‹Ö³–™'3OPz‡¿È_æãa]z]ºág§oßþ¿±;è+jèG+Wå,«BUªJAïÖ»õnP.åR®°P©"U$(·r«u#V×ÔUuT¡zO½ òTË*5„Ÿ4<8<½½àµÐoø˜áü>ÃyË"Ê"€‚άþ¡-j‹À™€;à;?ÐL3¨¿«Ëê2p \™gÔ º«î³¡úS‰À~uM›Ò¦€¿…œŸ2K™Xû©ó?½ÿʧötñԞǞÎìÿ=âú…/ÙöIEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-add.png 644 233 144 261 12610450011 15654 0‰PNG  IHDR Vu\çsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ ׋'À1IDAT(Ïc` 02000üÿÿU‘ñ?TœMœ‰Th¯æÆÿĪg‰¡D2Î ‡Z„ßIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.6.png 644 233 144 3041 13755454066 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÖIDATHÇÍ–íOTWÇó ÃŒ”‡Ä¾±•6ÙŒ•"ÝtC€Ð¢´`–Ha©¥m"¦<¥6Æô!¥±&‰/D’¶Ia} e³LíjLPÒR^h”gÑ ©-ÂÀfî½ç³/f.wvÿÏ››ïùýÎ÷ûͽç|ï‘øðSÀ¾Å¾ÅÂö¬ùèüèü?ý+„u°ÙІAÜ7qß$œK8gŒYج›ý‘ëE,þH=s^âÅšp]p]°íã#PúréËÑφð‰àîpw¬jPq±â"@{s{3Âo}¿õ,îXÜ6ëf¿¹Þä‹ä—#ÿ§/.o¸l»®(W”¼ðæ o&jøO2î*Ü0ã˜q(;èó@ 1jàÇ9"°Y÷›ëM>“ßÔ3õC~6ålÊÝ{vïqŸ -û'|òü'Ï›zÁ Ž:b@ói>ý]ý]Ö@ÝP7°a ›u³ß\oò™ü¦ž©òc}JCD¤þ ôb­X[7tÓˆ &“@õëÏéÏ ”±hÌs =Ð~Õ~µUmU[±Æ#f˜YGJUh_h_Ô†‚ Á0ÆCüP|¯øà ë¯ÊYïWàžvOûœüû΋w^ýG h7¼†ÿºÂšZU«ÀQŽr4ÂH -´™d’1ïÁƒÔ}5«fÔ;êü4„ùÿcm鎩wÁ}Á ª=äÇ:•ÁªÏ«>˜§RïÒ»`©a©m© h·ŒiÙZ¶– üüü`ˆ!†€: ¨°P·P·PÆ-ã–q Ôyu^‡…Ú…š…”~<ðZൈS9Q•\•lncOؘ÷+pϹç|N˜\™\Y×/Àoœ3ÎEäØjNÍŠVÑ*Ú2ª¼Ê«¼ FÔˆ‰È±Š)çœÊ  ²T~ú«¨'““î%÷’ÏÉÿ“c"¨pòªG‰ÃJ~\Ú¬6 4ê~Ýo%?|Í× ®©.Õœá g€Ç,²jT ªAàa¸¿Ëp.‚ªG[Ö–oÍä/q–8!L‘Éÿôþ+ŸÚÛÅS{{:o°ÿÀ¾Ê^tC˜IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-62-grey.png 644 233 144 6240 13755454064 16000 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü UIDATXÃ…—kPT×–Çÿ{ŸÓOœæeÅà#ò¯ˆ£ hE§$Q 4ÎC zÕ+3FŒ^(CLÆH¡&Eeˆ2^#Ú_â-0P‘G7>Q Ý}zïù@7VY•Êú²kŸ³ÏZ¿½Ö¿ö^‡dgggggÓfžèñŽxG¼Ã Ù?dÿý9çqÎãœÇ !Ü“{rϯ>•|$Égþk•µÊZÅ÷¡Å(&YB‚t¡ ]6`6ð}ŠDE¢"‘d‰ÄG⣖b2D†ÈÐŽ£{fì™±gFío¹º\]®ŽôK~’ŸäGÞšä` N.:hDÓ2–ÃrXk°ÙÆlc/isªsªsªËúlý¶~[Í?-ó,ó,óæÿ§ÛA·ƒnqq~üüøùñ$+R)‹”Z/­—Ö pÍ]ï]ë]ß»üMùwÆsÅwñ¸øDgs ×p {¬'ëÉz¿ƒ‚Ÿà'ø]>6vjìÔØ©Ù^Þ5Þ5Þ5ŽÌø®ø®ø.jëëë +YŠ,E,Ø‰Ø 5,°Àà#|„ÌÄLÌ„ÅêkõµúbeG}G}G=·×ÕÕ±ÌgËž-{¶ìÝj?µŸÚo‘Ò±Þ±Þ±>î Oå©<õÎ{t1Ù=±{b÷€zÔ£Þ÷_Ä*±J¬ªÿ‡mÜ6nŸ½ÂÿMÿ7ýß”¢“¶$mIÚ"–yŒxŒxŒÀÓ1Ó!ñ@È!¢Ýè0 Ó0 À(F1 àu¼Ž×ÒCzH$ `ͳƬAoÅ·ßV|+½×{½÷zïuñ†\%WÉUÿ§—¥D)ñµxoàû¿SU³ªYÕ È^–½,{9ïšEoÑ[ô³Wø'ù'ù'I+Su©ºTxÃÃ×Ã×ÃÓÙr¶œ-X&Ëd™1¹eBRH ÒGúH@ž‘gä€Ô `),…¥@tx8<€{£{£{#¦»üû¿ãÿŽÿ;ÒJW|‹J£Ò¨4ú–ÖVi«´UêþâääÄ’J’J’JD—FFض†­††ÓpÐÏéçôs€4’FÒà*®â*€ZÔ¢@,b ›ä&¹ ÐBZH Á,˜3Àø€Æå?é礟“~˼½½y€‹ÇÅGyâA_m±ÇØc€Ø–Ø–ØÄ{œö8íqrgæ4t/ÝK÷@»o»o»/ÐéÙéÙé 899H@žƒ?í{Ú÷´h©o©o©:ïtÞé¼°BVÈ žÏóy>4yyyÇvÄvÄv ÞÅãâ£R€ D¥yxx`_xLxLx )rîTNÐô0¢ÑèÃu‡ë×åEåEåE@éHéHéPr·änÉ]L™éŠéŠé pxÖáY‡g—î]ºwépò›“ßœü8~"üD8`/³—Ù˦>“‡éÃôazRäâqñaûðöáíÃl_Ù¢²Ee‹¸ËƤ ÒiÃÔœ—w•w•wqžOói>}þ|èüÐù¡óœçµæµæµrþP÷P÷PÇù1·cnÇÜ8ÿ¾îûºï랯vñÙÅg9ÿ,å³”ÏR8oÊkÊkÊã/Ú˜‹ÇÅGñ¾À$ˆž¡g虩)¨’*©òy†]{tíÑ5À{§÷NïÀYÝYÝY``f`À|Pø”ú”ú”³wÏÞ={7“““ðÜ“˜Ä$@ž,O–'² ² ² xÑô}ú>}ÀÁ$ >‚àÃÏŽ,Y0²€„Û¯Ú¯Ú¯â5Ù!Ù!Ù!ðñÇ?ÿÄÜnn7·à à à @`c`c`#`n3·™Û€šš`˾-û¶ìâ²â²â²‡Ê¡r¨€_"‰ü%¨}Pû öàwÃï†ß tWè®Ð]S€Ü9 c­c­c­0Ñ•t%]Éϊʯ•_+¿–òM3L3L3Äã¿vÿÚýk7ÉÒiƒ´A—gÊ3å™P«®¨®¨®á¡á¡á¡ÀòÞå½Ë{ëkÖ׬¯{Cö†ì Lj“Ú¤4×5×5×#G2Ždƒîƒîƒî@ܶ¸mqÛ€EÂ"a‘6ÒFÚ¬À ¬ÀxïªÞU½« 6JFÉ(á¿•&¥Ii’ò)’„¤=Åb¶˜-f“¬º´º´º4‡ÿ nP7¨ƒZ˜+Ìæbħȧȧ0ªŒ*£êyžÞ{zïé=@Z&-“–^M^M^MÀ¥äKÉ—’K®%×’ l“o“o“‹?\üáâ©Qj”–ÆÒX¬Òé‰ôê ×.\»pE#1#¾'â ŽcraÝØº±uc —'r&r&r7 ß¾5|+⿞Ä?‰ïȘ¯¯¯¥oû÷9îsÖÆ³gÏB4ôz ½@ëO­?µþDY£¬QV Â=Â=Â8³æÌš3kë„uÂ:4W4W4Wu«ëV×­ Á†`C0øÌ–™-3[ ¶¶¶2K[M[M[ ý«*X¬ n_ko²7Ù›RÞ"»ïî¾»û.€&4¡é_ÉËË7¨FkFkFkf§.ݺtëÒ­|銸q+âÈ•ßWÿ¾ú÷Õà¦ã¦ã¦ã šUšUšU€_®_®_.À x/:õúN=`K°%ØÌÃ<Ìx+oå­€"U‘ªH…e j j )úb}±¾íŠvEûÄ2^Ì‹yñü#Á·7Š´˜Ób¡yòª{É¢Y4‹^ÿºV]«®½Œ†9 sæðÐWv¼²ã•ätXSXSX# " "  & ¤4ÐB -@6“Íd3RRR @‚ @ R@=ô±”XJ,%Ðè×ê×ê×Jþ‚]° vt”ŽÒÑ]Œ-d ÙÂÛ'/Ñ×Ùæ9"'ûFñïä 9H^ÙLci,ͬšì‚èájmµ¶Z+m2bþÄü Ô$¤“tŒ° –Á2œÂ)œˆD$\˵\ °ÖÃzæÍ¼™7¬Nik*k+k+ksç<Î)d ™Bv:7tcèÆÐ.cö`ùzЃ)ÎÕº¡}è“~C:Ò‘NªB~ ù1äÇü·•Ÿ*?U~z:whÖЬ¡Y¢¹"ª"ª"Ê‘á HI „u*sÎîÉuÇ“pNÂÁ'+E£±ÑØhäKošnšnš„üiMÓš¦5ÝŸ°m·m·mßþe[r[r[2ÀÜÈpwÆ)uZœã6McÓà~ëá­‡·¶t[º-}û—nžnžnžwÎtUwUwU ù†dC²!™/u–ZÁN²“ì$8TPAða>̇"‰Hj|j|jÄéš¹5skæÂÝ­ß­ß­` ض`û—t?ÝO÷ߟpJñóX}Ëu×1ãü%Q8§Î ù“ÚudhM¢—¾=ùËqù¼}“}“}Ûú.{—½Ëè’°ýaûÃö#‘u²NÖ 5 ¦Á4V)KÊ’² ø.ð»Àï¯÷/ì_Ø¿PèVÎUÎUÎÍ_Ä.p!ó+bE¬H<ä¬ìß\ËÍÍÍÍÍň+£p>˜ÒS»Nírj·rJ»©HE*=\m¯¶WÛ¥Mæ£æ£æ£PSJ)¥ve¢v¼v¼vœYîÝ/º_$t+w)w)wývÑúÀúÀú`×îåÝË»—N@çwj ‹o ô`×µÓÁÏN힟Ònš2M™v:wÈgÈgÈG4—g—g—g;2œ½{‡W‡W‡þ§¾¹¾¹¾™¼§îTwª;æÏü™ÿÖq¸N\7þo‘‘‘tÐïßãø‹\þÀbbbbbb 9§\Îå\NþÚ?§Nÿ”8f9f9fýSR(k?‰{÷$ÎëGómómómþÍ­Ò[¥·J‹Gí£öQ».["["[ò¾ü(?ÊþïE( €BèÅ 1Èfº*àL”ô"ÁŸØh7`pìáU¼ŠWÅôÐsô=w5`bÕΉUlެHV$+¢·…T!UH­»x.ð\ไc±ÇØC~b/±—ØKü˜ÓoµÐòGb/h×y\8ö`36c³ØBtDGt×¹¸aÇGªWU¯ª^¥·…>¡Oè{ð*ûŠ}žÚô°smçÚεÀ$ œþ\åøŸqü?·SwÖAø.IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-31.1.png 644 233 144 2665 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜjIDATHÇÍ–L•eÇϽÀ½òK”Q›-vY: '›Lœ†³yËLS †?Z¶Ýº¸©9WýÙl°5±tËr±`47›éu"Ôrí:P©(Á¯ŒÕ²„`tÙ[Èå¾ïû|úãòðÞeô§çŸwçœïs¾ß=Ï{ÎóˆˆÈ‚Ù¯€;ßðÝo8ñy/Î{qñ ¿Þ×Ë®—o¿ 9Ÿä|°ðó…ŸÛޝóŸ¼^Ä©ŸÌ§ã²@œ€÷Kï—.ÿ¬_UEUEóKø†!ý\ú¹¿Mžž b?Üïºßð§ÿO?8¾Îk¼^¯ë%×—šñ‹@ÚÅ´‹®ŸÁëñzDÀ÷‚ï…§ÞL†ž‚²­e[î¥ÜKQn°Æ€,²”00Ð6žäëü,^¯×õt}ͧùzò6ämòå;Ó› šá'ßyRóÅÏïó>Y`¦`½b½B TX…páÇ×y×ëu=]_óiþ„ç(§DDŽm„ŠHEì>€x§ùk|q|1¨¦ßôŸUª´d;Ëδ3Aõ¨ÕƒcL¦ÆÛ¥v)q;Û,6‹AÝHԇʴÊ4`Lóë£üZDäén¤Fª²#‘N €—@­T+™âßñ°ˆE,kض†VZiM4Í4ÓI~m´¶ÂVè°ïÚw™šÍ¾„ G ùž>!ŒˆˆÔ_ST—W—ÏíÃÊÞ_(û¡ ޝ;þÌñgP‘ÈíÈm²ÆêÆêÆjè]Ý»ºwµW%ªD•€ªUµª6 l¬i¬Aõ®éYÞ³ÜáS¯‡‚Cúh믉õ­ˆHÏÛÐz¶õ,tozbè XP—]˜]H¬|¦ñû„«ißW~9ð‹xƒ'‚ Á‘ÜñÜñÜq£À(0 DÊN—.;-’3ÿfþM{©½Ô^*s¦šT“j±÷Ûûíý"Ûn?¸ý ˆï¾ï7ßo"v>~üâM ]Mòø†vŠˆÌÿfþ7Åkf/̶û™7616á´ýä{Ñ}Ñ}°eÓ–M[6Á2c™±Ì€¾+}Wú®8;³v×Ú]kwAÈÙ!Û‰[ VƒÕªEµ¨'^º§tOéÙgGÎŽ8|–1:0:ZÛ~læÆÌ W¿Lç|óÈGW>íü´SòªÌªÁªA‘öËí—Û/‹°ŠU¬¹~éú¥ë—œ‰Æ c…"®+ä 9ñá#ÃG†ˆXg¬3Ö'Šßß‘«Ò sá<ùÛ|Þ|^Dľ`_põ»Ý=Xñ`ÅÝ"m]m]"UW5^Ÿø~¬e¬Efò~ÎëÏë):Zt´è¨ÈŽ[;ní¸ååÎ9œsX$cIÆ’Œ%"±`, ŠlÛ¼mó¶Í"#¥#¥#¥>óTf}f½HZVÊHʈÌÌþs¯»6‡=aˆˆá7ü?v‹î¾Ú›º7Õé’™£üüð‡wtzte ZƒÖàÃ]9yhòÐä!ˆWÄ+â€?6~lüØëìuöº$üɺÉ:ÔLçTûT»ÃÇõ½÷nLêJ.ükŽ]MÌ1Õ47Ç*À”ò¨\• *ª¢*š¤lŠ©¹©ô¿Lù”/iŽéŠtý×Ó Ó“·2¥2x+1™U‡5£@“5j><ùñJ*ÐL3ÍÀ_‰»RÝQ}ªÔxû5û5âx¬g­gÏõ¡Ò[é‡îdïÊGöuñȾÇÍì?îæ4`ð–IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-40-grey.png 644 233 144 6121 13755454064 15772 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—kPTGÚÇÿÝs†Ã FÂ%$„â‚É‹ÜHä¢Iؼ-XÄ¡ˆU’ˆ¯î–Á˜Z(X¨dCˆ+U˜H¸YŒJP@!x ˆÙ@b‘"R\ äÃ8ÜfΜÞÌË­Tž/]}{žßéþw÷sHFFFFFTX1ãJA#¹;Üî«Ïø:ã댯™WÖxÖxÖøŽ Ì¹1·OÞ¼oÁ;ì­åêåêåj–ƒb£˜¤B -´zÑ‹^oá-¼ÅrøüN~'IåF¹QnôV1™%³dö¯E™ž™ž™ž]ىىىdLðü·Â!¶Ø¹Ttp ¶` ½ f‰Yb–Øb™·Ì[æß”U“U“UsaÈ2f³Œ5\_xná¹…çÂŽ;å;å;å£6l{Øö°í$5\.—›Ü7¹or¤ºÔ/—æKþVýÛãIñ%‰³¯àVæÂ\˜‹¨'ÈrÀ?_æ/ó—ùfþüüùùóO»«Ô êÛ±í½Û{·÷RkHgHgH'y•OåSùT,à}¼÷¡Ä°`?öc?øÀ ˾˾˾xµ³¹³¹³™Y›´MÚ&­xlú¥é—¦_ÚwRé¯ôWúÿÑÑvÀvÀv 6Ÿ%±$–tGO@@@·’ô¥ô¥ô%ÍhF³ïc\5WÍU7—Y-‹–ŧÿ¤Ù¦Ù¦Ù&lÑÑÑá.¨L*“Ê ÖaÖA`,‚CúÐÀÎp`†fAB@úI?釀)La œÑÅèbtÁ`ÅçŸW|.èüqðGî…ƒÂAq·NØ)ìv¾ñ"^~@777¹—ÜKîõ÷/Ô-Ô-Ô=ý'N£Óè„W“““¹_TJ•R¥Ä:ñºx]¼àŽà8lÂ&lˆq"N"Cd ÓdšLd”Œ’Q@|E|E|œ-Þo‹\g\g\g°Nò¯Ù­Ù­Ù-¼*Å—x$>*˜³`ŽÛd©²TYªÿG­SëÔ: +Õ•êJ9I#&¶ž­gëáB#hPŠR”dÙGö¸‡{¸‡5 E(B$#É=OÏÓó€¬LV&+XK` p‘üë¾Õ}«û–» Þ­Þ­ÞÍ$‰2-Ó2íßv[£¬QÖ( º=º=ºÛU%ªU ıEl ù‰üD~X'ëd€´Õƒ-ƒ-ƒ-ÀTñTñTñC ·q·™€™€™ íZÛµ¶kÀ]Ë]Ë] @ch Ät1]L‡‹ª@U *€Ct[t[t¶K<„!àùƒnSnSnSÈ "…öpô.½Kï,˜³`€„Üq½ãzÇÈÿ"ÿ‹ü/€>cŸ±Ï¸Æ9>7>7>”œ.9]r¨s¯s¯sŠž/z¾èy .­.­.  Ò釫ÓBƒBƒBƒH¡Ä#ñÑå™å™åüÓ/×/×/©Š(>ÀKa),ÞÆÛx =¤‡ôÆc±¨È©È©È8-§å´€ÜGî#÷Y­o«o«oxÞwÒµéÚt-`H0$€æ¸æ¸æ8`âÂÄ…‰ «Ó8E¢@Q€‰Gâ£øá#¢¥éEzquÏôLÏô&1‰É5€³‘g#ÏFª=ª=ª=€ê˜ê˜ê è [7Ý:Ý:Ý h«´UÚªµöõÇ×_·ËÛåíÀpÃpÃp5ž&КàK|‰/‰–ʼeÞ2ovɴٴٴB²,$CF.‘Kä˜tÝÔî©ÝS»x¬ë±®Çº}²>YŸ %B‰Pðj^Í«ÕOë§õ€«¯«¯«ïZ»ø¤ø¤ø$€½Ø‹½€mÂ6a›XíföR6ß>ß>ߎª¡ªa—¨c®c®c®7à9à9àÉ.u<èxÐñ ¹$—äbñÁàƒÁƒ@ m¡-0Å›âMñÀåÞ˽—{ÖÏúY?ðCé¥?”m÷Ûî·Ý¼½½Sº)Ý”¾JoÑ[ôÀÒXKH!)\=À¢!Þoˆ #†Ã>uppò(tÐA—YÌep\ImÜ߸¿q¿M3×1×1×¥"B¡ˆ€iÇÀŽ@ *P¨”¹Ê\e.@›hmœûûû/µ—ÚK øÄøÄøÄ·nܺqëÆC—ÁÁÛo„7…7…7¿­~[ý¶bÙÞ­¬-¯-¯-·1¾ 6b#¶3œ×U¯«^W?NÏÏÏúÛ3É3É3É ƒåÛÊ·•o³¥$M&M&MÊòbCbCbC° #Œ0‚·úZ}­¾ÀõâëÅ׋}ˆ>D<Á?Á?ÁÛ· nzi/í¥@NSNSN°Ä/ñK<===æ1ä1ä1¾Ò¹Ò¹ÒY\ùn仑ïè/J›Ò¦´ÝŽ·ÖXk¬5Ç>#é÷Òï¥ßЊV´>qJ>&“µ(ÌUæ*sÕÓI±¾±¾±¾,&îLÜ™¸3äªÐ(4 `²8Yœ,¤{¾{¾{ðxÇãw‚µ4eþÊüÐw¥ïJß@}C}C}ðõõůù¿æÿš½çâÏÅŸ‹ÇwJ¢$J²ô“1“…íE0‚ÜLi1-¦Å²›ô=AOŒüE4ˆÑpÀ¢¼¦¼¦¼4«›ÕÍjö‡ÎãÇ;ãn·ƒÛE<‹gñ,°ßÀoà“'=N>tnwavÎVg«³3‡™ÃÌ«€&Sµ©ÚT eí µ/Ô¾ här9°’þ¥‰$‚Dˆîdä!yœ¯=ͳ…¯äÜßH>É'ùWÓhM£U# IH¢ŸÕ 5sŒ9Æ(Ii#m0‰zQ/ê„#áV¡ UÞÅ»xy‘ùU-ºÔª;UwÊ–2[1[1[Áâ=yOÞó›ì Oƒ> úôä÷ÈD&2IúÑ~!VÊG0„! ]8Š£8Jª7\ÞpyÃå¼]Ž:ü&{Ö}Ö}Ö3V¸V¸V¸ÚR¤€$’D’H,£ e(°ˆE,®ñ²E¶ÈÁh-­¥µà6üløÙÀbZÍ­æV³,ÏÉÙÉÙÉyxÉRf)³”½÷qWfWfW&À ÌÀ p•®o tÁ^^EgÑ®÷;îwÜ,G-G-GßûØÉÍÉÍÉíÎÅÞšÞšÞY^ýëõ¯×¿ÎbÈar˜/žωçÀ € €Í±96DÀâ¤aÒ0iÀ7 66l„«Ó˜Ó˜Ó n7‹›ßûxEzÃKv)ž²fœôéËí¿$¼½jß"YЀ[ ÙB¶-1»V~9¾¿b=d=d=$þyŸ¸OÜ'ÒÈ!'BN`§Ø#öˆ=PÒ`Lƒ±,¤ ©B*øÓ§OÚ‚Æ"Æ"Æ"d}Ž7:nÌûãÊ¡9ö‹X(Š…Ü)ûÎþEÚ±ìììììl˜¤…½aUCví¦Øµ{ʮݪÿÒ®µÆZc‹ŒEÆ"()¥”RÌI+Ѹظظ(. ÊúÓÓÓºj—G–G–GÒNö½Ü÷rßË€P#ݧàêCñè#ûÈ¥ÝÁOví^ù/ízÏzÏzsÆòŒòŒò [Š=£wítïtïtGIóÍæ›Í7‰^Ù£ìQö¢FÔˆš?·popopo,¾NgìñþWz¡å’á7,***** ‚½Úɘs ÿ7öÌØ3cÏà_¶§lOÙžº.ð|°ç³‰Ø‰Ø‰X÷ËÆnc·±›ý£ãlÇÙŽ³¶­f«Ùj¶ÊŽÊ#å‘òÈw}Y+bE¥µàÁƒ— b3˜¥¼‹·/”ð(ÁïØoh7 õ¨G½-“U³jVÕO+i%­ü!`éµ¥×–^Ÿ‘Ê å…´[–$K’%5ýXXX¹#ÊÐoè7ô“ÿggì~kì€ ¿ÅAñ;öˆví×…-‡q‡¹[$‘$’IJzVÏêÿº_á§ðSøÑnÙlH64â'~"~"~rè~O|O|O<°ˆ»?)±\ü=Žÿ™°Ìyº«Í´IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-129.png 644 233 144 2724 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷܉IDATHÇÍ–íOTgÆï'Cy+Ó%²ÖQÍCjMZ^BEÑš4Vâ.­m4–Oê6Øìê¦X‹i©Ù¦)Aã aK4~à¥Òˆ‚Ù•IeC6à(´B'e˜9sÎóÛ3gθþ>_Nî×ë:Ïsîë<""’} $ä$ä$¤Fì„?[þ•+*×±¿ÔÁöží½Ÿ€´/Ò¾Èø&ãÃcÙfÜ̯±úÇã™~IË‘|9ù²­,j·@}a}á gÄ>3ökök¿…¡©»©àê·W¿åCxüããž•=+Ë6ãf¾Yoö‹ï/-ÿ‡/Ë¿_þ½í¿œ”œ$¹ïæ¾›÷Q$á?yP½½z;ÀTâT¢J}H!E•~ü˜k.Î6ãÑ|³Þìgö7ñLü¬Ò¬R¨ÝU»ËþH§>Éþ$ÛÄÓ®§8E „ýa?€îÖÝA ªAlØÀ²Í¸™oÖ›ýÌþ&ž‰á#ÏŸíß+PuIuI@@Ý«{ÁHÑ>Ö>FS?¨ŸÕÏ(“²zM9•Âãáñð8ÃÆãNl1~Q+ÕJTx.´-´ M5…ß ¿{á!ïëï뀊â[G)"²îsÂv¯Ýë_ééÀ?¨Òµ\-—E®ò?Y€Ê§|Êìe/{-?7¹ÉM0fYc¸L'qñ ý;ý;Yé® °OÚ'ýËL>Qb_þN8 <0þ þ¢5kÍ M>¸ðŒMŒMŒMX8žFO£§ÚÒÚÒÚÒ`dËÈ–‘-Vü~Ãý†û pî÷ç\ç\09:ùdòIÜŽßàÅð£|¢ÄFñÑÅ=÷ÄÒ÷…ÿÜÜ@p÷ðî¾Ý}Öttt‚wÞ;ï‡U·VÝZu JŽ”)9k=k=k=б¿cÇ~(h.h.h†Mù›ò7åƒë«ÑÕÓíŠ4ñT{ש®S&±Ñc©ý©ýê2í3wfâ¾Ð†¥_—~…Kë/­»´²ç³ç³çaèÆÐ¡Ð×ß×ß×GÝGÝGÝV]‰£ÄQâ€ÂòÂòÂr¨9Xs°æ /š+š-š…ó•í©í©–_¯õ¶z[Áä#ñJÆ+Æ8ÌMÏM½‘±W³ÆY«p³{³{³®¾røÊaË?^:^:^ SSS°µtkéÖRxÐû ÷A/lôlôlô@ÕñªãUÇ!©8©8©:þöÕ±¯ŽY2£ïzòö“·Áä“ bô=¶qÑÃÛÃÛEÄ&""YR,’!±ô}AŸˆc½c½c½Ètëtët«HQwQwQ·H½«ÞUïé ôz"‹,²ˆÈêÚÕµ«kEj:j:j:D2U¦‘iˆäõäµåµÅÚgÙFÃÙál“O‚ˆ¿Ì_6vW–  ŠH@D„?ÙÞT™*SBf¥c§c§c§HJaJaJ¡È½À½À½€ˆ–®¥ké"=îw[ĹùùCd4g4g4G„jª©iÉoÉoÉiØÜPÔP$R1Tñiŧ’EðNÜ~ëö["1>/Le(:%Þˆ.™Ó°ðÇ…Ê…JÐF´mBûBûBûàéé§§Ÿž†™Ä™Ä™D˜Y3³ff v]»®]ß’oÁ·j‰Wyz–žüÅSN8ñÂT®ûìíýËà¡þPªc±‡Å8% š³ôÜZb‰¥8Û‰'¨mª\•Çé_nødø$‹ŒéØë¯šý‘ýÑ :§üÔ%×%FLùÇô1 QoÒ›Ðèæ!Qœå g@]T]ª Ô°VÖÍלç<ð5C ¡Ômý ý 4îêŸéŸÅ)¿Q·¼n¹¹SÏ)ÿKû¯|io/í}ìå¼ÁþÏšq¨aî/IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-5.2.png 644 233 144 2501 13755454066 14744 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜöIDATHÇÍ–mHTiǯ/é 嘠¥k;뇥ì…MèCl8P´¨Hƹ&‚­øaq%úІ´"ënµéD„ e»l RS±b å¦ ºÐj9YÄøVù†;9ëxïsŸß~˜¹3cnûÙûeæœçœÿÿÏóœsEQ”¡_b3b3b-A;ö«ˆßtÈtè“_ƒöU1E1E} É—“/¤\K¹¦?ØÆº¯(üh>ïlT"ŽÄŽÄŽ[È>ÇvÛaJ Úç»Áì2»5¨¸[qàvûív¾†©Þ©^€yÛ¼ "¶±nÄù^4¾rî=~Euë:c^AbBb‚¢@æÁ֪̃`À¨ ó óÆãÆãd,ˆi`¤ ðáÃxf¢lc=oäx¾Ágðõ(š›š«(pøøáãæ¶`ÂÓ_ 6½6ÝàS]@ lͧùD‰(!²[vC Dlc݈7ò <ßà3øƒz”•{{áš=ÞÔCh ê–½Ë^T±]G‘¢L‹b Ÿ<òXõÈeºLí©†RÐvi»PA¼¯€å¾´'Ø Dm¥¢(ʧÍ`ž2Oùâ‘Õ£†ñóÓsõ\üüöihQ üøñG š‘3r(£Œ²¨¸è¤ä¼(áŒ<þñø<>ó‡ô„„]ý*ÏVž®è»A/Ò‹@íS'ÕI¤«ÝÕâj+…W ¯BK_K_KÌÍÍ­®ØÈæ‘Í#›áÒÖK[/m…϶lè—oÕê ¾°¾;ÌÒ6P7n.€| ËCùŽùöùvHKKƒÂòÂòÂr(í/í/í‡ÑS£§FOE=q7þù = ¤$¥$éÃ0313úwá¶àqóãæÇÍPq¯â^Å=p¶:[­™™™ Îjgµ³ú?¶²d¤d¤v6ïlÞÙ ¶*[•­ üýý£ã ¾ ¿¡guÅ~\IÐeï:ÒuN[N[N["þ½r¯Ü+¡©±©±©–­ËÖe+ô;úýXŸ½>{}6Ôûëýõ~ðõúz}½ ©ëÅÀ˜tJ'0öÁнwÆjVž±ñ×ã/Ç_BŽ7Ç›ã…ä¶ä¶ä6888€çMÏ›ž7Á¾ûnì»u'êNÔóóóÈÙ”³)gXîXîXËyËy+rÆDëÏØ{]I¨KzµûÚýH©Ãê :Ó¦iÓ´ ¤UZ¥ôgú3ýÌvÎvÎv‚¿Æ_ã¯éÊéÊéJ˜ðNx'¼0ùÍdåd%,Å,¥/¥#AoЀŸÿ·+£æØ¢gÁ³”'Ý"Kdá—_Èš`5CJ³d–̶°…-Q{¿ÄK+NC€@´©—ê¥Qs ðøÀ‹šüØMv‡¨ÚbH çÅœ˜C•¿ËI9‰Ä…'ð–7¼9'çäp;v¿I—tt˹€”"I$¡ò½(†HµÍg3*µbò¯Ùoåš½]¬ÙûØÚ¼Áþ _U§Ÿb±”IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-124.png 644 233 144 2706 13755454065 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü{IDATHÇÍ–ïO”WÇÏ N˜Ú#IûBÑTÓf2aµfk«¨Äj¡ÄZRZ›ºfÝ®Ínp©ÝÄ®bdÚ©è¤-šX ŒR$P^´ °¦.Dd¬0qÙ¡ì+²ÁÎâÅós“öÉx.{.ÿfBU¸* ÐTßTÏkkxxÇÖû:^çk¼t|9ö;~Èü6ó[×dgeg‰@ák…¯½ø~2à¿/Â[ÞØp/ã^†r€õ?À‹W€8qôO³õ~*^çk<¯ù4RÀ¢’E%"ðæÛo¾í9—L軇òåk>ã2ð)Ÿâ3nƬr«œ¨ˆŠàÂŽ­÷u¼Î×x_óiþ¤y²·ÿú#ª,«, 0Œ(XÃÖ0Ø^£Ú¨ÆP7Õ„š@iÉê•«rÁì3ûÌ>°»í.»‹ß/¥>4»Ín »ÀÈ42ç^8Êôvc»¨¿ÓJ‘eŸaz†=Ãñy0àðßðº1 BÓÄî¤1ÅTLÅ€½ìeoš„ãç8Gy@ïò.¨ê:`ÙC<æ·$>ô?êàùÕók|žÖ“væ&ì?ºÿ(ðÀ~Y7>6>vtœ­:ûÎÙw g g gÀÑÑ·¯o_ß>8UxªðT!t¯í^Û½ö©Š1øÅ`Ã`´lo©n©v*N~’Gû?Øÿní™›)aÝñ~ãžÆ=s:*Ì&–'–“ØÝ±»ew‹Óð¶ mÚ.Àðäðäð$,¹¾äú’ë888þ¢W£W£Waº@] Öÿgýéõ§çÜ ûX’_£Q-¬û#­ ZUˆþ8ú£4»|fjf ‚EÁeÁe?™?™? ÑkÑkÑkÐÒÚÒÚÒ 5å5å5åNÞÒÎ¥K;¡a¢a¢aêÝõîz·óbÛ¾ÚÚrâíR]Ò±…c Aëð?çÎî…ñ‘ñ 9yìU£]g×9«ËW—¯.‡K/¼tÐñ÷–ô–ô–ÀŠæÍ+šakéÖÒ­¥Ê e†2aUdUdUGGG`MÞš¼5yißêXjÌœÿdüÐzÜ"ö×ö×®^±Ì-æq‰ˆÈ"yUüâ—¹•ˆ%b‰˜HNQNQN‘Èȉ‘#'DV†W†W†EvtìèØÑ!¾¾¾!r÷ÊÝ+w¯ˆÜν{;W$Øl 6‰´ÇÚcí1‘ó>Wr®DÄ•—äSG··D´·H<ôÜ’ym‘¶ˆˆL‹ˆPéúƒZ¨ʬ–³+gWÎ.o±·Ø[,Ò9Ý9Ý9-bø ŸáillñððY¼yñæÅ›E¦‹¦‹¦‹DjJkJkJE6ÜÙðÓ†ŸD*þQÙVÙ&³’•äsŸüaÓ›Dæô¯þøÞsw¶úß矻Ïçù|Þï÷}¾÷¼¿€ˆˆ<ÿp?å~ʽ‰Ýo'óÞ]Þ]OçÄ_+písíûõCÈü2óK€•§Wž¶KÆfßÔ§ö‹$ñSùL^“d"ýBú׎x\ òä{wâÏBÌÎÄà‹ï\øáìgyFnܘÜ1¹’±Ù7õ¦ßà¥âKí¿øE írÚe×¾4}©¬{mÝk¹ÕNÁï¹PR\R 0´dh‰v€ŠËX¦wÓLcÖXJlöãõ¦ßà|Ãgø=ÙÛ³·‹@é¥od49 ¿} 5959†Ï §8Å2ˆMǦÔ›êMæA‡t.HÆfßÔ›~ƒgð ŸáwôÈÃ϶®ˆX™§Ì“ÔN»úD}êã…Á…A,µAíWûÑê-U®Ê?>|,ZvÔž´'!6¡žPO õÛ±ŽX¨I5 ÌÆñ)K/K7ëŠR¥ˆÈ3_@ÆHÆÈ´=` X |?wííövfù+‘‹KQ0ˬCâ,=«gõ,p‚œH©+â}ÞžT¨~þˆD!Á×öõM¨ú¨ê#à4€ýØûì}`uYÃÖ0:x6Øl„†’†’†hìjìjì‚ñ›ã7Ço.žXÏ‘ž#=G ~[ý¶úmþ9ÜîHê×·­JÌ÷¹\Û™Û‹-"/^ˆàq=/⺃²038sm暸ª^©òUùDZ³[³[³EÚ]í®v—ÈÔ•©+SW$±zó{ó{óEJ£¥ÑÒ¨Hsysys¹ˆ¿ÉÎNdø«áºá:q¹ Ò Ó e“†ÏáOè7VÜÐ`ä…‘À~ëá_ÞêhëhO¡§ÐSÅÕÅÕÅÕpfæÌÌ™`”QF“õõuõuõu°õîÖ»[ï&ócccа«agÃÎd^½d¾9üF[dIÉ’6ˆ¤µ¤µˆÈÓ""2n´Û¿Ø=vÈ¡À¡À¡€HŦŠM›DNn9¹åä‘óáóáóáäÄ|w|w|wDæŽÍ›;&²ûèŠôûûýý~Ï+žW=¯&ëe©á‹óÇõ¸EìKö%W¿Hlol¯ˆxED$ÛôEІ¢!‘¬Š¬Š¬ ‘ƒ•+VЬé]Ó»¦W$Òé‰ôˆX­V«Õ*r¿ó~çýN‘<§ó´ÈžÚ=µ{jE²t–ÎÒ"¹—r[r[’º\¿¾8¿ÑãüÙ~À÷¾: Çç;?4: ÃæÁ̓›!³)³)³ *ç+ç+ç!¼6¼6¼6ßx|ãqènënënƒâ¢â¢â"ÈYŸ³>g=ÔT×T×T§žPæùÆð9üFÏâSiNÉ­ØÕØÕä)²ú­ÛÖmˆx#Þˆt®ÎÕ¹ WëÕz5Œ;•‹}lfàÁÀƒ¤é•§ò˜Õ¯ë€3Í8ržÎÓyÀ*V±*eËYÎrÐ>íÓ)Æ«×i¿öïªNÕ™âcÖÀÜÀÜÿúXŠóSæ-ó‚c¢V;¨>Õ|¦&Ô–þQëa4Aši&™`tŸîÓ}À"Àç|ʧ oé)=…¦Ë~Ö~ T·êTÂù¾ÅÎÿȾ+ÙÛÅ#{{4o°ÿl¢Þ3éy$IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-6.7.png 644 233 144 2501 13755454066 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜöIDATHÇÍ–KLTWÇ¿á5C2[ŘÄF|ñQkÒ…š(D£C¤Xb*Ö° »0bŒ1ºh‘¤Áhâ¨Õ ˆiL\("ñµ˜Ä" >j%Ñ^##ÌÜ{ϯ‹™;3HÜtÅÙÜü¿×ÿ¿sÏw€ˆˆÌ =bÒbÒb’‚8f_ÄnÛlÛœÞÄgu°äYòþ¬‚äÚäZ€O.~rÑè‰`ÓoÆGç‹DêGó™v™%ƒµÉÚdÉ ácP°¼`¹-%ˆn‡ÄæÄæq ö_Û àꥫ—(ƒÁ»ƒw†³†³ ‚M¿oæ›õ¢ë˱øE þzüuËs°&XD`þ¦ù›ü ø{äæä漊}«b@ ر«,À‹s¹£°éÅ›ùf=³¾ÉgòõÌÙ0gƒlß¹}gâ…`BOL=˜jòšœÀšWóè»ô]L‚jWíX°@›~3ÞÌ7ë™õM>“?¨G¦îmõFØaÝaÆ £j¿vO»G@si~Í2þ1ú~¦-Õ¦n«Û Çj†f€þ~\?ŽÒ“üåþr*[³jÖð wò._Ë×LÕ£¶RD$ãHLôÆñ¾ï]ß»0Ï×|ª—ëåøÔ ìæûPC 5À"±(Ê>ÁS´N2 ÝÆn|áúôé}:„ùCzBÂÎv@É‘’#áä/ÔoÓÓ‘Fô—õïëßÕÎjgµ?*~T<½cÏ’Ÿ%?K†Ú5µkj×€Óãô8=Po­—zî_»ovßD… ÿä‹ðõÄûöU‹ÈúÊõ•"ü%"bùÒ²;¾,¾LüC‹‡R‡RŲ§uOçžN‘ޡޡŽ!‘’‰’‰’ W¡«ÐU(áõ²èeÑË"‘Gƒ£Á!Òò´åiËS‘B¡ŠÈý¬ûŽû±„Âýj2Ègò‡õ@R[R›j‚ÁÕƒ«AÿfjêÞÖ½©{ó2æeÌË€ÒšÒšÒ8tãÐC7À3é™ôDm•ÐZ ‚/;.;.; ¿>¿>¿>ªð¿ªI5?™† ¿©'F$676—L‘ø–øñŠˆˆÇÔ®ÍÑR´[’-É–$²¬wYï²^‘Fo£·Ñ+Ò¥wé]z¤cqÅqÅqÅ"cWÆ®Œ]9úðèãEÊO–Ÿ,?‰Síêµz-"?š|!~SÏ´Ž}pÒš›š›!s s s b_u`ÕUàÔÖS[OmÓãô8#þ3ö3ö3vX»b튵+¢>ýÆsã9Ы.¨ €ÿ£ófy³\Dî´Þi‰ý]D„½òÀ(5JÅŸ÷m^A^ÈJ×J×J—ˆ}‰}‰}‰ÈÒÊ¥•K+EròsòsòEÖÅ­‹['2ž=ž=ž-ÒUÑUÑU!²má¶…ÛF:%‹I#MD>WºÒÅ/ !¾XÏÇN%¯´'Ú“È©T à®rW¹«À˜kÌ5æ‚Ú¢¶¨-à.r¹‹@ ¨5£é£é£éàkõµúZ£¶à&=ô Ðµm$ŠïƒS9}ŽùûÞ÷½šcßë·ô[ø ¯JSiQƒ4-ˆ•Où”/ŠØ‡h\Ê^öþï96eòÛvØB“ÿ±þh1f³ ¨åVn—8Ç9`„a†Au«nÕ Œ2Âð)¤œç< ŒÃÆaô6½Íè óMŸü3ö_9co3ö>63o°ÿínó¤½=IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-34.png 644 233 144 2334 13755454064 14670 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü‘IDATHÇÍ–mHTYǯ65JoŠ EÝZZ¤ FŒ2*³¦+²´-*–b£â'ÅÄÛhƒ¶BW6¿8Ùö!3"Ì@|©¥‚ éeÙ6±Æ–FíÚi6Áæžs~ûáz¼w×ò³çËçíÿÿß3çyî1À0 ÃH~h&š‰Ól;ñ;ÇŸ´6ií—¿Úv€„‚„‚ßÃôÚ鵩gRÏÈ'Ž­ã:ß]o¾›OûÃqx/y/%äÛGaû¢í‹’Òmû§[|%ùÊ ö_Ý é\Ó9Š¡ÿNÿ€w¹ïrÁ±u\çëzçÆ7Žþß0`bóÄæ„^ðNòN2 ˜·fÞšù%vBÏ|Øœ¿9àå„—T"ˆ7À¦¨\ F ½ÞºlÎ×õOãk>Íoë1`ÆÊ+ ¶ìز#9d»câË´LÇ®öUûª}à¯ôWú+ÿ⽋÷.Þ óæ-Ìs·¹ÛÜ ³ïϾ?û¾³s¡ŠPE¨Â…u׺;æŽ}úŒ©¬ +Ã9c}í}í}íàË÷åûò!­)­)­ Û Û Û` | | Ü¡©õÔzj=°â銧+žºø½J* ü,²DÖ˜gì3]©ã óØéÊÁÁAxí}í}íñ\<ÏGwå9d™ð~Ýûuï×¹Í<àÊ5xÇêÊO̱{Ž…dˆAÕ¦Ô¨3ªNÕ¹ÎÌL5SÍU¡*T(¡„À&6± ø“‡<¾§‘FY"KDhü1çØ'&?ñÛX¢StÈ2YFœrÎr¥n¨kꢞzF¯cTQL&‹,ÈrYN!nŠ›.üÏOþqû­··‹q{Ÿ7Ø3«¦4ð‘¡IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-5.8.png 644 233 144 2522 13755454066 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]HTiǿ֑"5’>(Z? $´À¤è"l)ÜF%Ë>BÝZ„£«­­Ø 0– ñ¢´Ý’² ÚX¡tÓ¨!]K¥AtQÓ2GIEÏyÏûÛ‹™33åvß¹™yž÷ÿüÿÿyÏó>ó ˆˆHBàS rEäŠÈþ8ò»PÞ‘ëÈM½æ«DF¾üâÏÇŸH¼œxÙêÅöº¯ ñ‡ëÙyIP"öFìˆ-øìÎØáHòÇ•M××à3áà탷nÖݬã{nnß2¾B±½nãíz›/œ_N}¢/1÷bîEü ±_Å~%+·­Ü–Rîô¤€3Ï™05¥#@½æ3_o&™Ä~FÃb{=€·ëm>›ßÖ³õý~å,Ê‚={â.ù º‡£Ë.·õŒà g˜æ¤9  ö«ýÌ€nÒMD¡Ø^·ñv½ÍgóÛz¶¾ß|ünÏmÅ,Š.ŠzÌcuVõÓlÿl?†Z£v©]hu@íU{lg;s˰|–Ì5OÍCët³Ò¬ÄåU^`:À¯‹b‹bmƒç¶†½J‘Õ¿BÜpÜðd4ÚcxŒ ÿ¬+‡)&‚93ÌÁSL…BmjS›ÀiNs: ÷m´ߨ:U¬ØÁŒÇçñAP?à'`¬º?t¸ `­«Ð*ã©1d ¡êjjà¢ó¢ó¢jžÖ<­y Þfo³·yîŽu\ë¸Öq ªNT¨:¯~~uüÕñ}Õ¨6ªƒû».¨ð0ö¼êß׿ý@—*fÆoŒ××AÒ@Ò@Ò8K¥ÎRp=s=s=ƒžœžœžœ!÷{È=ÉÕÉÕÉÕP¨ U¡‚äÌäÌäLè.é.î.Âgt´­ç×·ý,x¸à¡¾ÃYÃY`øø—·6µ>j}Ñ›£7Go†¼ò¼ò¼r¨õÕúj}swêIî“Ü'¹°4miÚÒ4¸`]°.X°Ê½Ê½Ê î÷[÷Û°^üÃþæ×·ýDŠD9£œ¬‰¹sGDREDÄhA±þ±:¬‘’Š’Š’ ×Z×Z×Z‘“On<¹Q¤þyýóúç|¦Ó§Ó§ÓEf™e‘Æ+W¯ˆøÅEäOy BxùÚÖ èüDŠXw­»]"f¾™/"Yd×}øûCÓ‡&‘…®…®….‘â²â²â2‘%/–¼XòBd$s$s$3¤ÓžÝžÝž-’z$õHê‘[%·Jn•ˆÄôÅôÅô‰´þÒZÕZÂsØÖ èÛ~æôXÅÇ=6øf°w°Ö÷¯ï_ßñ—â/Å_‚²™²™²èÝÔ»©wdtftftÂËì—Ù/³!ßÊ·ò-HèKèK胂}û ö·ÝÛâm ë±îÏöØ'§Ò>%-æ}ó~è]F›Ñïïï StŠN½X/Ö‹aôØè±Ñc ³t–εL-SË`dbdbdÔê°:âã…Ùb¶„éýÿ© ›c>Ï{ÏûÐÓ­*M¥1¥¿ÕþÝ 0§é4$’HbXþµ~­_ƒvh‡v„åWëz'hÚ 6„ͱ)Ï„gâ³s,lòSä(r€ˆAuªN R©1 ݨ‡ôš®sgŒ1Ð]ºKw#¼å-p•ZjAÿÀ_PÓj#ÈäèÍü_ìå{»øbïc_æ ö?ÓÉ Ò]pXIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-21.3.png 644 233 144 2746 13755454067 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü›IDATHÇÍ–mLTgÇÏð&S ‘M­AÜL“–ŠeÛZˆ¸~€Äb´ 2 ’bLC„ÖÝì~m²ÉênÜTA‰Áw]‘ì±3Ô ˆŽ]+ZIwTÂ['2 oÅq`\zïÜç·î\îlý²=_fþç9çÿ?yž{Î󈈈+ñ+².e]J¶‰SöÚþÌí™Û_ú³‰;âà¨rT ÿžo¾`ÕéU§1[ëV|r¾ˆÍŸ¬gùÅ%¶cE÷ŠnGy€êת_Ëü‘‰[Àéwúu¨ÿ¬þ3ßß~ßÞøöÀ|ù|9ØØZ·â­|‹/™_ü@_Ò{Ó{ÿ‚+2D`ýÛëßvÿ ¸ç†Êw*ßx˜ú0U¥@|È"K•Q¢X6›„­õD¼•oñYü–ž¥oÖ#[–[&žOó”™0Ö MyMy–žær,Уz ^¯e Ô€Àll­[ñV¾Ågñ[z–¾Y}”s""­ÛÀû÷;Pk´ëú˜ö‚ö×&´ ´D¥Ê*ÙXiT²{ºÿxÿñþãO>xðþà}puu…ªöªCU‡`ÝèÚ×~ÌÒ?þ8¿o~Ÿªš? ¿YÄï¬l[Ù¦º!¶[‚gßê¾ÕÐôËÆ·ß²6z6z6z EoÑ[t\ \ \…¼‚¼‚¼è ôzOÈ är ÙÓìiö@ßbßBßüÄ_ÔTÔCÛÆ+Ç+]ytŒ@VsV³êôUÎUNcTýjæ½™÷ì¶ÿ¦v¼b¼ŠŽ+:åîrw¹7-nZÜd —î-Ý[º|†Ïð¶_ŸÒ§ô)GöGöGöÃŽŠ;* `ë+/¿ò2 ?U†*™…Å–Å0†³'²'ŒÑõ©¾GßãuN?œ~XdøP¨=Ô.¹o~þFÇ"Õ¨>Q}BäBí…Ú µ"™©™©™©²lú5ýš~MÄásø>Û]]]#Òz®õ\ë9‘]®]®].‘‹—/^¾xYD½©²U¶ÈÍí7Þ|(¹"é_¤!¢^ß‹ßsŒŠ¾ÚúÆú û áOñ7ù›T]Ê –Š[Š€ìÝÙ»³wC×`×`× ½[}[}[}péö¥Û—nCl:6›†ÂŠÂŠÂ ¸Ur«äV lÙ¼eó–Íó³œ÷sÞ¯î9å9ÅR$ @ÕAwIw ¨ÎÄ7F‹ÙðáG~ÿÑÍ.™þ* œÎç£ÂûÂuá:x2ùdòÉdÒåFr#¹ y5¯æ2È fwÎîœÝ ê¼:¯Îƒ¶AÛ m€©ðÔèÔ(*þÏï¿Ü,ÆëŒ}°þƒõI]iþ±çXsey޹•›ÿ¯-°ÀBÒû\]QW@V=ª@UªJb*ÍäW‘P0pFœ‘hûŸ9fÝ­Ûø­·ÑÛªÓœÌj0žÏÕ­/è hüž^zíÉA€Ns³`Þ•jDÝQw0oOPü&þuük4Õ§Oê“ÀI“ÞM}7XúáävïÊgöuñ̾ǞÍìçU<?óXîIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-20.8.png 644 233 144 3057 13755454067 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜäIDATHÇÍ–ÿOÔ÷Ç_wrÀ¥ ±° ùV°•pMCbÃÐÙ4Z¢ mm$šH€2¿ƒŒ˜%mtvVCœŒ#Yf¨®YÄêiaESµ ÛÄÍîH¯4eXœNÇÝçÞýp÷ñÃúøþåîùúò|¾òyÞÏÏ[@DD’¢¿ætsº91‚Í5F<þ­ø·r>‹`‡¦ SÅð1Xynå9€UçWXÏëõËûE þåzz\’ÄÄuÅu™6Eñ‡ðÞëï½ÿÓþäX¯Z¯Î‡ öZí5€+W:ù5Lܸ ðtÓÓM``=¯×ëý:ßr~ùðGú"`é¶t›Æ .6.V2ßÌ|ó•ý‘‚ÑW`ûÛÛßøaÅ+”´i µ ðãG_3˰žÖëý:ŸÎ¯ëéú‘yRJSJE üýò÷­Ž4Œ\„#kެÑõ‚Wœ Bþ@«Òª€º£î`ÂÖóz½Þ¯óéüºž®™ÇØJŸˆÈé-Pù¤ò ¨ÕÁÐH05˜ á;Á‘àÁè¤JýB½¡Þ€ÐBc¡1P‡ÕaucÍ2Íôs¤ÂÁЪÐ*‚¡GA[Ð*3•S•SÀu}}+ÿ&"²î,XýV¿?Fù<ž`/Û@«bè¦>Pi*M¥›ÙÌæeƒØ±c2É$Ó«y5¯æ8Á UªJYàB”ÿ—Q½¨>ÿŽÌ}bޝTo©Î¤Ó…öÍ—Ëå‚Ö¬Ö¤Ö$Ôà£ÁGƒ AOƒ§ÁÓm–6K›ÆÜcî1·‘χçÃóúlèâÐE8óÛ3GÏE}ó;w¬;ÖÐS½uquqúÖ:¾’ðÏEDþÕÎg áýØû±ªN_°9l¥ÛK·”nl-[ËÖàºëºëº J6–l,Ùö2{™½ ÖÞ^{{ím˜d’ÉeòAñƒâÅíÈvd; B«ðWø!{]úýôûܳ“_N~©ªÁ¹Î¹Â5‘yD{øRëK­ª  p®ìIëIƒ#‹‹ ’Â’Â’B(¨-¨-¨…­ž­ž­#_(  ]k×Ú5#Þÿ°ÿaÿCHËMËMË…¶p›Ö¦Ákƒ¯ž}õ, ^ê꘽2{§ÊÊT—y…=¶%¶…|šªªEÊg·Ml›_Í“š—k^ÉÍÍImImIm©J®J®JÑ:´­Cž¯ÄÎÄÎÄN‘€+à ¸ŒøRîRîR®ÈK,!róÓ›n^rÈ‘nV³Z|"– Ë„ˆd™˜oVŸ‡ö†öšÜ¦S–S–S"ÿ÷œóœ“”›Ž‡È®£»šv5‰tUvUvUŠäYò,y‘ñ[ã·Æo‰Ìl˜Ù0³AäÙô³égÓ"Y¬@V@D2$C2D†j†j†jDråÊ9$âÜçÜçÜ'bùÞrÃrCäîÎ{Oï=•‘oŒWD•kfÍlrK(YÇzó{óáüOœß9¿SÕæ»""Ög¯O]Ÿ ‰u‰u‰upyÏå=—÷ÀþîýÝû»!þqüãøÇp¬ùXó±f˜è™è™è{²=Ùž ÃíÃíÃí°#¼#¼# Iß'¹’\PþnÙbÙ"ߟTƒjPÕÐõm×· ~}Çø$r  ¾©¾ û"§dêïÞ>o<ÆkóÚPÞ_y«½Õ°h]´.ZK\âøê}õ¾zPͪY5ƒJQ)*fŽÏŸ9ªPªBÐlšM³ÁÔÜÔøÔ8J;¼”·”gœJÜd|±ìTFþ>º¯D}&¨ÒU: Ï#9ÈAû¾°o™_T'ÕI`7»Ù½,>©&Õ$¨xµ:bÚj§ÚÉ‚z-¯F=ƒžAëœuÎÃÿçcúàô>ªl¬lu1âÌêŸZ‚–ꯡÙÐ,AþH?ý(î3À¨¨{êÐK/½À|ø@¹Õ×êk`*2Ñæ´9‚êFÈòÐÿ˜wb€ÀÿÅýV¾°·‹ö>öbÞ`ÿªÿ÷1•‡)¼IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-80.png 644 233 144 2405 13755454065 14671 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܺIDATHÇÍ–[H”iÆÿ£kj ê„¡1è²ÞÄì…ÂF¨`“IFRDlB›Dkä‚l‘R(µm‹ÑZÍ‚¢¶TÆ ±Y ÆJ†Î6«¥Ãë|‡÷·3ß|ßîÖ²—¾7Ãó?<Ï3ïé{DD$/ù+¶*mUZN§í²ãY³6®éIàn\›]›ùrOçžð\ð\0_ØØÊ[õÎ~›ß©gÅ%Oì@æÕÌ«®Ê$n…­k·®Íú4O Böìè°»ww/Àõ‹×/òLO¼«|W 6¶òV½Õoñ9ù¥õú"q+ã–k2—d.ÕVo(jJŒAmMm À›ô7é* ŒàÆ­*(Q¬ñ»[ùd½ÕoñYü–ž¥Ÿð#_‘_!ííÙ?$^ü XzÚ  6Ü Gõ(€Ñ`4°jP àÂ6¶òV½ÕoñYü–ž¥Ÿð#_Ûö/¡>«> PZÍx`<0[Ì4SSkÔ”>©¿Ò_*P+ÕÊÔŒ¡¾P~åýµ>®ƒúZSçP`ž2O¡3îwS8˜ÒKé‹ÓPI'dOgOG?2€Õ`¶›íÄ”N1ÅÀ·áˆm„QFÕ¤šT°žõ¬wäKñá>£žzó¸yœZüI½”~ÂOÒX÷ìiÙÓb±™ëx§¿Ö_ù¬c]bþžõ<ëyÖ'žÉèËèkÌȈÌË| K<Åc"ñ¥ñ¥ñ¥"÷:îuÜë‘I™”I‘xC¼!Þ âžrO¹§ì¾œk9×r®‰,Œ/Œ/ŒÛqY)pè¥ô~ÒDÌ›æMטˆ¾Iß”*Ìç7‚mžç…Ï ŸŠí(ÚQ´C¤ßÛïí÷а…-l ‡Â¡pHd666_$ü$ü$üD$ªEµ¨&â ú‚>ŸkD®È[ÏÖOúùØS1½Kï²÷Øü‰ùó' *¯*¯*"ÉwUïªH'Vëª^õ+½l}4ý®^W¯öé^ä^kv¬ÙáûÆ.ó‘==$9aLR'IÒŠ‘Ìcž¬"9ËYªg*+VëézÕ¯ô”¾â)¾íd¿À5ûkö{/Ø Ï~"Ož,T¼Ô ’ÍlfiΚ³$i°0AÊòIR£F:±ZWõª_é)}ÅS|ÛþûmÏ}IÖzj=$%I¦¢LYw­»$)DS"%Kd ¥9n¾2_‘²\–ÊR~ðˆ<ánRËy9OIŠ.ÑÅß[Ö@æ…£^†lCåm¤wÒ;9›CŽZ£É8Ir7)ΉsŒK“e,#ùÏðL–ƒ~ö³Ÿ”ór^Γք5aMìf7»³êÌŒåCâPZÜáeø¶ݶ÷ífàpøpx± ”¥†ÜŒ¤5n£+õ+úxµ¼À `¤d¤b¤hmlmlmF#£‘Ñ y5¯æŒB£Ð(Î÷Ÿï?ߌlÙ:²@Nz#vh†fÀ Xï­÷èËð2ü´ÛáðwäÕé«Óê­dHü’ªMÕ2¡2ÃÍÃÍÃÍdq¸8\&ƒ¡`("}m¾6_ù$ö$ö$F   9ävÇíŽÛÎÆYw­^«—$­ËÖe¥/Cßö£Kî-¹·yà¯öW§¿/´ Õ¥.áV™Teª2U $šM‰& zKõ–ê-€»ÏÝçîæ*æ*æ*€ÀñÀñÀq èRÑ¥¢K€X-V‹Õpž/° Û@_«¯UúÚ‡oûÉŒ€àÀõÜõ\Sía3˜AJ$ãÉx2$s“¹É\àNîÜ;¹€Ø.¶‹í€Kwé.l l lÎÖ­;[$‡’CÉ¡,cÿ `ÖÁáÁuËu €±ÞXÏ : zDö;`î5÷f ø'£Œ:zO‹Ÿ?-|}}›Gn¹yp½q½q½>|<èÔ'‰FDÉ2Çæcsx?íçcgLÆÍN³Ó9c3-3-3-ä®ü]ù»òÉåÁåÁåA²ÆSã©ñSãSãSãÎYò—ùËüedÏPÏPÏPÖY, a|úŒ¥…’ÇŽ5dÚ+3ƒñW¾å[{ª‘¤yÚ9ùì傽],Øû˜}c\h7زNˆsT~,˜IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-9-red.png 644 233 144 4057 13755454063 15530 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜäIDATXíWmLTÙ~ïÇ®XZ"èL±kŠJRA0+k‚?P15b»FD³Y¿DVŒ& bH5!f0ºDM4üœl?Ú]k–lXtš5;ŠË0ŽÜsÏÓ̹sgâGšöýï=ç}žçœ÷9çdˆ¦â×òŠ8Gœ#Î!½ H˜Ö?­ZÑ2•©LeÿüeQeSü…TRI9ó1_Ô <Í'¯ˆÖcÖWC5T#Û£Çg¥©ýj¿Úo•vJ;¥†Ä¤±¤±¤1\Z;¼vxí0°îɺ'랥¹¥¹¥¹‘\Œ‹ù¢^à |Á÷n=$ÿ1:Ÿ÷•<.Ëãž,±Cs*çTΩdµÎNg§“àîî@A@€x#‹ù¢^à üh¾y_½[YgÊ^Ù+{=—@îÍÜ›¹7µå®Iפk.„ƒgð…|!4¶ŸcǶD»¦]X±–¬%l‰¶IÛ°ýlÛð žÁ3 ‰z'ð ÁQüÖ™†4É.Ù%;‘Ú¤6©MÝߊ‚‚–‚–‚­Ø¶›ïæ»á׺µÚ €{†4ºW÷'NtQ4˜Ð—éËîá|кµsÚ9€ïæµ¼~1Yð ~¡Gè#ËcËcËãÕ¬ÖFk#Ÿï~æ~æ~†_Â8~öWÖÄš ?²eÊ1µƒ€ÿ¾ÿ>„ C…æùSBEÄàùŸàz }jµZ­VßníííüOa€ f×ìšÝDâËùr³Àï~ÿ–œ]r˜:n5þ*œ?1U¿—ï5-Ï®õj½FüÆÎFé#îKJOJOJGËhÑhÑhQ6Ø`{ã:5'̽?÷>,øfÁ7pþÅù°½i{“YøåöËíæf/ÙKÀÀƒ ~¡GèB—)9Rr$²2æb.æàƒ>`çØ9³ÐE‹¢„ì½¼oˆôC釠d°dÐüeGø0‚Àà ó =BŸ>Ri–BK¡¥Ð8cqTEUTEDÉ”LÉDDÒˆ4uÇ^ŸuÝœoÞjÎ ü "rù\>"¢—õ/룮œïäïˆ(žîÑ="ê¢.êŠð[ú,}–>ãȧ……â¬×éuzä É!9$“¢lS¶)Û´…¶Ð"—“åd""|¯‰ˆ>Lù0…ˆ¨ì³²ÏˆˆjçÕÎ#"Ê=™{’ˆ¨h_Ñ>"¢P[¨ˆhš4M2霠LÊ$¢‡ô€Éä ò ï )>ÏãóKè#¹X.–‹'oqËéšÓ5§kLˆgñ,Þ|pgÌ-œìì€îîøØù±ºFºF í@ÚXýzõk r“ê‹õÅ;ÃÚX[„ïZëµÖk­Æ øg)SÊ”2'&%[ÉV²÷4‹Sf›k›k›Ëæ¹×»×»×›.—|½T/5éãëë=ž=½Ÿ÷~n^À÷~¸òùtvtv†‡?a©,5²ü ‚Hß“¾'}n<Ê,e–2ëä/”P˜P˜PH¤ÞPo¨7z¼Æ…_ZPZPÊvë¯Ó³õl„àÐ/é—L„(;_vÞ|¨V•®*€™ù3ó ';'€?à xq3ë'Y;k(•w+ïVÞÕƒ†À*¥J©z°a*Ÿî£è˜ÓfÉ´dZ2=§DAÝþºýuûy¾qüf²z²:B¨/Ô‡o¾9¾H= 4:<:l:ëZ½Viuïxïxï8>1žÐf¹Yn~]$¥J©Rê¢ÎÊ?ŒóµIÚ$mú¨Cê‘z¤á}»cÐqÅqû»X:KîäN!ƒ| c€i)30àùú§ú§‘åy{¼§¼§[¼-Þ¯U;Ù 4( u†´b*¦bÕÑšGy”§6ìd'R|ŠOñÕ^0žÖk‡µCKtáÞáÞåÝ&½ Ø:¶g_²/Y-«àà[ùV€oà‡ø¡Èr6ÞÙxgã¶Ëxj@ 8¦ìHÙ‘²ƒH. äéLX]…9#üwƒòHy¤<’.ίŸ_?¿žÈRi©´T:ÞÍ+È+È‹òn^‡pÀà~ÂO¦V/` Ø‚Èþ_z|éñ¥<_àY-‰–Dïë©ÜÝii ¦õ$Ť·¢skü”wÝgÞêÝD-QKŒÒŸêOõ§/aC€cúÐô¡éC|­áÉ9AN(ûKŒÛbôÅÑ»?(Çc¼»ö Þt F¼« jƒZä© ½Jy•ò*X<¶xlñû½áÅ>¥Oé;–#¬¶^¬À_Ñ{"2A¼Í»­ÖVk«–èîq÷¸{„BcBiÝź‹u#׎ڡv¨CáŸ$ÓÿÃþN¼O`lˆ‚²°wϿͻ+׬\³rMÄ»ŽGŽ#]SãÜè„T.•Kå퉦‘_ÄðJô_Æû¼»BiVš•fÏ!¸¼±¼±¼‘͘ȘȘÐþe´Ú§ø_Ýê¦nê¦ðµ£¸cøâèŒXïŒÎW>”6K›¥Í­¢U´J_(Ï–g˳‰$’èê-[䉔ÛÊmå¶t%\¸!¦sÿ·H4þ+¤B*T¿þ¢Bæ2—9 HÒÀ¿;õýwŽ˜Î¸bpßÛêÿk'W]Ûþ{·IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.2.png 644 233 144 3013 13755454066 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÀIDATHÇÍ–ïOTWǘaÀ@‰®Ú¡/„6J1ØK#& d”ºôEqDéf³ÙD0iªÁ(6Í®µf©‰$²l¬–JZÒ $;PMuŠ,òK·BUœ²J¦ aæÞ{>ûbærgûxÞÜ<¿¾ßçÜsÎ÷y%úˆwÅ»âS#v|åOz7éÝ×ÏEìS:ÄUÅUýë ¤}™ö%@ú™ô3ƨe›q3?¶^ÄÂå3ýòŠXG§£3®4j†êµÕk“~± €³ÛÙ=¯ÁžË{.tµwµóGxrýÉu€ç¥ÏKÁ²Í¸™oÖ›x±ørø7ü"ð]ÂwqÀ‘èHìw²ßÉýS$áA.¼·í½mmm*t?°ŒeªÀ¿ÄØf<šoÖ›x&¾ÉgòGúXQ²¢D*wVîtþ=R0ú4¾ÖøšÉî>åS–Ðúú,‚PÄ–mÆÍ|³ÞÄ3ñM>“?Òµ”†ˆÈç[ÐÝš[[jèš±,œÎõ£þªþ*áh@Ïc´ŸµimT¾ÊWùXc–'åS>àCá:áBÝ.¼Ùq³c)û-Ú[±·xéG(¹Ý6_Ø ÚA婹öþÞ÷÷²h‘AÇ cÐË–=,ƒ¬ê¬ê¬j¨Ò«ô*rÖå¬ËY#å#å#1Þ4¼ix¸4—æÒ ´¹ô“ÒOÀõ‡ÌäÌd¯««TèiîiýŸ‘~„¿¦V¤V¨Nxzþéy½ÎZÖÂùüssçæÀµßÕèj¯Çëñz`lùØò±å°Ò¾Ò¾Ò'ÕIuRÁšÑ5£kFáÆàÁƒVc§.N]œ‚ÆXþ7îç·å·AËï[w·îííMOîOîWñ²ßöƒíÞ”ïíóöy‘„Ã2,Ã2»s´&­&M$ssfYf™HØv„"ášpM¸F$d ÙB6‘þöþöþvæ™g^ÄöÀöÀö@–†;ÛíΩ›ª›ª›)h)h)hÉh͸šqUd÷Ï1Ï1™ > >±-$nIÜ›ñ¢ÝFwÜ}‰W†+Edƒˆˆ¬0CFHé"Ž"G‘£Hd$o$o$O$·*·*·JäÒ®K».íI¼“x'ñŽˆ·ËÛåíÑlšM³‰ÜÚwkß­}"ëï­¿·þžÈŽºž‘ž=z6ˆ$%¤'¤Ë y¼8¸8(÷Bu¨Ž¸ûÑÍ»Ë_w|ݤEöXô/–”•¼]ò6ô.ô.ô.XKQžUžUžé)é)é)P][][] C}C}C}Pì-ö{áýýœ}Î>g®*L-L…Ô )),ž¿Ù×Úת<Ðëéõ€ö¹¹ÇÌS®ÿ¸þcàgóTêWô+0÷ÅÜ7sß B_„> }f5¦kÅZ1< > > ‚!†ª@¨˜íœíœí„`C°!Øþz­¿|Ó>ݧ£þóçiÏ´þmò}ú(Ô˜§’%›qÎì0ñëįKü3Æ™û¯šQ3 ’T’JŠÑ«<•§ò@MªI5£oA‚V5€ÊU¹Kž øŽñ:&‚Š*¯ÚnÛn³”‡æÓ|À)=¨-åç-´€ºª®¨+@m´¿àÇoM€4ÓŒRßjº¦V?êÉz2¨¯¢øÇÝMî&ójŠUþ—÷®|i_/í{ìå|Áþ4Ž÷èô®ŸIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-33.6.png 644 233 144 3046 13755454067 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÛIDATHÇÍ–ÿOÛuÇßí®@O:™K (rÉQdT]"æ%çØXÒNË‘1í œì5^f4/Y¸ËÁ¹MÇ0ۈьÝ™ºq™»[va›.ç²Yj·1hhƒŒîÀ~Ú~Þû¡ýìÓ»¿`ï_>y¾¾<Ÿ¯O>Ÿ÷óý „"?ý`,2‘ÂÆV=¾ºnuÝ/¥ð¡$^0¼pím¸ÿýûß°ö[ûÕ1ky­>³_?SO‹‹|¡Lƒ¦Aƒ#ß…ÆŠÆŠÕkSøÏ#`>a>ñŸ´}Þö9ÀÐGCñ*üøÕ_üäøÉ:ÖòZ½Ö¯ñeò‹wÿO_¸oø¾aÃ$˜²MÙBÀ#Ï?ò|ÉîTA œ[œ[‚«‚«¤’a <é¢DÑV$kùt½Ö¯ñiüšž¦ŸšG@ÁsÏ [·mÝf>šjûÞ(|£PÓ‹Ÿö²—&c™)f˜Ù"[d ÐO?ýƒœâ§<ñ<òÈyK†d@6É&–ùKšÿWi½´>—Róf…âÐyÉέ;·jlêßM_u^uB½§¼§91>1:1ªëy»½ÝÞnè©é©é©ÿ¬Ö?«çU§êT:¾þêõŽëÐ}¸»¯»y¹ã’ï’O×#gçË;_n¥æÉo„âÊëðŧ_| ÿÞx(ðlÉÿ£¥ÌRFÌes=ìzÊÖ–­-[ ÓÓÓ°neÝʺpºF]£P(  0 d¼@¸=Ün‡j[µ­ÚÎ.ç;Îw`Ã6»bWˆy?œî˜î-ðÙìg³ ÚSó í¹K¹KO>-D­¡Ö ÄÒÌLñL±áè®k±Î˜0µ–µnhÝ DAcAcA£3“3“3“BtÊNÙ)…h5¶[B¬¹¹ææš›BD¯D¯D¯ˆ»ë´ý´ý´]ˆ––! M…ù…ùBÔ5Ôï©ß#LE¿³ž´ž4¢*¯*OðåcËÇO>-Àj±ZT«Ã á}Ûßþýâ®Å]°yãæ›7B©£ÔQꀱ¥±¥±%P\ŠKqA£ÎQç[­ÆV^×ãÍøÇŽ(G”# WWWBo[o[o”üíÑýNþõË¿|(×”kœµ,[–UŸHºsÈ}@B¬#ÖÏþúð×°¹~“u“U¨*¬*¬*ûˆ}Ä>M¡¦PSHÏ—zJ=¥8páÀ…ôø@ó@ó@3¬¿³þÎú;zü‰·¯}¼öíí}¯÷=eŸ²Éœ³9gå CÚ?6˜;˜ ÑFÙòëÚ§BO…ˆåGò§ò§ é\Ó¹¦sà[ð-ø òLå™Ê3`ÝoÝoÝÛ³·goφqϸgÜåÁò`y‚` €æ¾æ¾æ>ÈQrsá·¾ß|ñMb·HéÁ yÐ ÚvoÞ`ÿ «°#èQ¯iIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.9.png 644 233 144 2476 13755454066 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜóIDATHÇÍ–_LWƇùQI@iËF±Q#Æñl¦ £  1¥`jÅø¢6*>  4MÀ˜ÐjB‚Úc‘Á&lk ›†âŸa«]‘]aݹs}Øf°±ÏÜ—ÝïÜs¾ï›;÷ž¹ (Š¢( ¢¿ Øì6»m^Ûv™ñÄM‰›>þ>‚[ÄlÙúûa˜vþY€Ô ©ôG&6æ|k½¢˜üV=#®,PÌ@BGBGŒ3ŠÁöìíÙ‰é|º’®$] jPu­ê@çÅ΋| Þ;Þ;cÎ1'˜Ø˜7òzƒÏʯ{G_Q`Nל®˜HˆOˆWX\´¸hiM$áÏ¥°¹ts)À³Øg±Òâ`.s¥˜`cø,ؘæõŸÁoèú? ¤¤( l)ßRžÔ)xÔu™u™†^ø p’“ÌmB›¢‚ÈÙ@ 1`bcÞÈ7ê >ƒßÐ3ô#~”™ïöÛB(K(K‚á^A™¥Õkõ„µGHÝ­ßÕïbŽ ÁHMdè}LÍ/Š…H¹KëÓúƒcÀƒ?ª7­¯X }ÒIÞ$ïDo<¯=¯§ùK¤O‹bÞð9§8e1Ò@ U©JÕ Ë—ò¥| å(G-ù…ìcð8$El%LyžLëGýDµü»ì>2ý¼käwá–p‹©7ôÑPÚP¸–¸–¸–€{­{­{­e…„.taâÁýƒû÷Ù g6œÙÃîá¾á>“Oþî ÷˜z¦~ÄOÔ˜û\¿4ú_òËhEèᚇË.»f×ì8ëõÎz°×ÚkíµÐ›Ü›Ü›lº_y¿ò~%dUeUeUA^s^s^3¬Ø³bÏŠ= 6«§ÕÓÓé!ù¡Ñ7ü(0¯{^·ìoŽ7t3ÆÕ/®V^­„ºÚºÚºZ3¾òÉÊ'+Ÿ@£Ú¨6Z^¥+Î犃ü§ùOóŸšq‡Ïásø ySóÆæf\|jü‹è~HMIMÑÿŸêSÈëðÉZ½\/7 †*†*†*`uÓê¦ÕMàÜëÜëÜ ‘ÀH`ÄÌnnnG…£ÂQ¥K–„øÜøÜø\8ßp¾á|ƒÅØg½iý¨Ÿÿ®ØÀÌ{ðÓƒn@ò¢äEÉ‹à„8!N\\\‡©ãSÇ§ŽƒWõª^ú;ú;ú;`ÛŽm;¶í€s“ç&ÏMBFNFNFÜÌ¿™w3ϲ7¾wÅfî1᜹ÇÚ~h»Üvl¶Û¬+ZW´®ÒºÒºÒºÀ•íÊveC~k~k~+¸sݹî\(-,-,-„Ìe™Ë2—A]M]M]å‰Åq€­ïÝcïœÊŸS"Â" ¡CëCë‘/ú^t¿èuTUGaTÕGuÞÞÞ†?ß²ZVËjx{ëí­··à¹ã¹ã¹ä”|-Í6$ñkµÇ€üßSiécx„Ç<ö% ïÔwN÷€! šbŠ) N'tŲX›a¹X–Èà+Ñ/ú-},ì™ôLÂ{ú˜¥óke±e±]¸—â@€ì)"…°ì—ãr)”²ØM5Õ ýÒ/ýÀßxñÑ|G¾’¯üª¯ÒWqOÜ3Y¸ÊË•šÑùgí·rÖÞ.fí}lvÞ`ÿÙòŸñÙ¼†IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-4.6.png 644 233 144 2511 13755454066 14750 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜþIDATHÇÍ–ohSgÆOZ5‰ôºŠLR*Ž¡° NƒéÄÒvÅ ±®jUÔ¹ÒÌZE\ŵÃ)hUk-*…VDÐb©‚”mÊÔ4›ÉdÖNw‡Úd]þÜ{ßß>$77®nŸ}¿$ÏyÏyž'yï9ï‘)©O¬Â¬Â¬¼$ÎúÔŽ»*\ou&ñQ++Úù‡óL=9õ¤y߯־•ŸY/bógêYq™"vÀyÖyÖQ’Â{`ͼ5ó\Ó“øËëà>ï>ÿ—uê.tŸê>Åf¹1ràYɳ°±µoå[õ_&¿ìù—¾Lì™Øãøœ“œ“D ¨¼¨|öçÉ„_fƒw¹w9À£ìGÙ* Œ?€rT &Œµ´ lí§ò­z‹Ïâ·ô,ý¤‚¥KE ÊWåsŸHÜÿ< K/qØÇ>r@ëa£Ö¨%꺺€ØØÚ·ò­z‹Ïâ·ô,ý¤yùl[Ê`•k•+mh€Q£×è0»Ínj›jWí(³ÐœaÎÀ^Oxª:µ^­ýG=®ÇQæoz™^FŒcˆ¥øÕ*ç*§e°¥,ã(EDæ~ î÷HxŒ€aR æ~s?c|@u Ö+ŸòeÒÐÐ2ð4¦1 ÔCõP=̈Å®o{½Œ¥¢•D‘@lý¤Ÿ”±£ýP¿³~' Ìù ëºêÕ«z“Q€Ð¥Ð¥Ð%¸V}­úZµ­kö›ýf¿l~°ùÁfh9Þr¼å8 ÖnÜ`ÿ¡ÊHÔ¤mê”`¨’:Ðn¶ÛØh\KC"-Áu kvi‚mÖMÈ‚™•ÚšhlÖUÓÂ@)¬M3´ ¾``]%d˜–—™{çüöÃpæŽÛd?{¾Ünÿ)î î ?ðÆgo|pþôùÓ¼ ³ƒ³ƒó¥ó¥`Ù:®óu½ÆKÆ—cÿÃ/©Ÿ§~n» .§Ë)y/ä½ðÔÁxÂͧ`Oùžr€{)÷R”ÌÀZÖªR L=&Ù:¾š¯ë5žÆ×|š?®G ëù¬çE ÒWésÿ-^pãïPï©÷h¾èà=Þc-a# `Ö˜5¬€ ¨6l`Ù:®óu½ÆÓøšOóÇõÈ£{ûç_¡ªœUNÀˆ~æ´9 ±5ууDÕ°ZP (-9öïØllŒ9cΘõšzU½šXAb!õ¤zeÜ<yލzÚÈ2²þŠå}Æ>P«üÖVŠˆ¶c¸§ÝÓaLdLdxÉ Dó¢y,ržqÆ-Bµ ÔÐDM–Ÿ#ᨠjƒÚ\àc>NŠûc9±)‹ãÃDöD6°ì¾í¾vh=«ÂNõCÝ»uïó±_¨ßGߎ¾méè¨ê¨è¨€ïˆwÄkñ///ÁÉâ“Å'‹arzrzrÚŠÔÔÔC[S[C[Œýa¬k¬ËZqÕçKð¯êYöí[ü¨ö£ÚDúoŒ?®­±R=\ýeõ—Ö†÷™}fŸ wOÜ=q÷äæçæçæC‰·Ä[â…íSÛ§¶OAÏŽž=;  ± ± *›+›+›aó³›ó7çÃ__·]·±¢ùT^wFw†öí[é½é½êÎ Í Y3-/,/ÀÙ§Ïž-O‘§ÈSÃ3Ã3Ã3à÷ù}~”J%«nWç®Î]P[V[V[Û·-n[„ö²ö²ö2(ø¦àZÁ5øæ?×>½öiÒYì½÷ã½A뱋¤ìIÙC±¼éÌqæˆÈ?DDd.õg—³KÄwÃ÷ƒïO‹§ÅÓ"2÷pîáÜC‘Š´Š´Š4‘¥¦¥¦¥&oÐôEFSFSFSDT‡êP"ËmËmËm"W»¯v_í‘ʤLŠs²Ùù½ó{­Ç.ë‰õØFÅ4Êr±‰ˆH–üRÖɺD¡D»¢]Ñ.G£ÆQ#2eþÊü‘-·¶ÜÚrK¤âLÅ™Š3"Ù Ù Ù "K——./]É=”{(÷ÈÅ7^Ü(’z+u*uJäë÷ HÀgq8ÒéÑzì"áÒpið_âè ôDdID„×m;U¦Ê”ˆ®LKKQ‡ÕauXdÓÀ¦M"¡Ý¡Ý¡Ý"­žVO«G¤üxùñòã"þIÿ¤RÄv…]a‘ÌPf(3$²µgë'[?©9]ÝXݨñyÝþ—}ûDz~v+#«·dÚ5F­[z?Ôj…ÈÑÈÑÈQël¬ÜY¹³rîソ÷þ^Pýª_õ[q£Î¨3êàAæƒ5Ö€ù;³ÍlCé7ýÀwÿ÷V¶ƒ{Ö=vÀ¸9n&p_‚Xm¬–E–yt¬g=ëAy•W%µåS>åµ_íWûA«|•Ÿ/4ZŒÕx¢íœØ üä¾é¾ù³>–Ôù©rU¹€X¢óÍ à2˜ˆrŠ>ú¬>Ä1ši5¤†Ôð5ƒ &Mà¯ôÓR_˜yfQ>4}¦/©óUŽ*‡^©G:ÿcû¯|l_í{ìñ|Áþ’аÎ0EYIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-19.3.png 644 233 144 3010 13755454066 15026 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–ïOTgÇ8cø©öE)H[LQٺц°&BC5H$ HI UÔ;BÒfB\ÍF“ÑÕd±Æ°—Úµ¶“8%]#ͪ4TI"DÁP ; Ö©S`v8ܹ÷ùì‹™Ëí_àóææ{~|¿çÞç9ç>""’} ÄgÇgǧFpü!Ëž´;iwîå¾ C\U\Õ½vH;—v ãbÆEc¦ߌͱøcõL»¤‹eHt%ºâJ¢ø8Ôn©Ý’ôJŸ»Ûî~†¦Þ¦^€«=W{ø#üüýÏßÌ—Ì—€…M¿oæ›|±ürü7ú"°ºou_Ü 1!1ArÞÏyÿÍ?E¾ ååV=Z¥â@$“¬J€ AÌåÁ¦?oæ›|&¿©gêGêX_¼¾X*ë+ëíÝ‘„‰ÏáHÖ‘,SOs'8A2„ƒá €Þ 75¨ˆ#,lúÍx3ßä3ùM=S?Rµ•†ˆÈ_KÑ«ÃÕá•‚†Œdí í Pwô×ô×Тe<5fYÏ… ÿ ê:¤a­~ü+HÓÚ’¶„žÕ^Õ^•á‡êgÕÏ€…¨þÊV>Ùô7°OÛ§ƒ6þõãë?¾úMöpÕØdlbiEá¿jNÍG9ÊјBJ)¥H#4ˬÕ¢Zþ N¨bUÌßDù›'‡&‡ìA{0hãA¤žè»ð -M-M ÚŒwL⮚®»>D––Ž–Z‚w¯Ý½v÷tìèØÑ±¦F¦F¦F,¿qøaܰð˜wÌ;æ…38óö™·Q“¾‰ž‰ž•èwÔæ¤æ$sk/|'li…/ßûò=·¨ Õ5×52[ä–~K¿¥ÃŒsÆ9ã„ 7lܰŠÎ/:y‡óç†ÙüÙüÙ|« áƒÃ‡BúÙô³ég¡ê\•³Ê Ùã™g~Lè§¿Ï4ÿ‘:n›Û†;Rp*uOêå‚§Wž^å\¶°®l¾¸€¬ü¬ÍY›aøÉð“á'p©þRý¥z(,,´ Øúbë‹­/ ÃÑáèpXvO§ÆSŽJG¥£úŸ÷/ö/ÂïÜG ŽÀX郊 ß.| Æ@²#Ù¡\))Æ8—¿ Ô?WÚ€ÂÞÂÞÂ^èíí……Æ…Æ…F(ØY°³`'”·•·•·AÂö„í Û¡ÓÙéìtÆœ±•¢R p,p,p Êv•í*Û›v何÷ÜóNVLVà‡ç§ŸŸã^êLêŒ1/ºá6Üqã¯Uj•"²]DDÖG{C´hÝZ·ˆ­ÁÖ`k™˜˜ÉÎÎÙëÜëÜëY7·nnÝœHfmfmf­ˆêTªSäTÿ©þSý"uéuéué"žëžëžë"ê÷*U¥ŠÜÞ}ûÑíG²^dõÍÕ7EÔfý¡þ0nƒHG©Ñçggƒ§ËÓåécʘ2¦ ¤©¤©¤ ²öeíËÚŽVG«£|I¾$_¬)XS°îÜ¿sÿÎ}(*,*,*„µ‡×6®m„êpewe7¡€ÍÔs½ëzÔçæ3»Rkù¤å`ÖìJ}@€ÀÙÀW¯PËŽåÖåVk‹BÞ7äß6ß6ß6à$'9 †×ð^ð·ùÛüm \Ê¥\ åkùZ>øžøÆ}ã(}jùÓåO­®d¢%§%'¶+Y™c>»/hƒÉÅÉÅý=¼0zŒkŽñ d€*Seª,æ,娕ìg?ûcì×”Gy@]T_«¯T…ª`IÙ"ü*0929`ØAÿþ¿9&‚ŠN^U³ªf•5ùI ??.èKú’5ù9N;í n«!5Œ1ÆðŒ_øÔ¸U£+m¤ø³þƒþšêòu™“?ªúíäyÿ•/íí⥽½œ7Øÿ<€5D‹hºªIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-11.9.png 644 233 144 2636 13755454066 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜSIDATHÇÍ–hÔuÇŸÛînÞÜmm˜RXçÖ25´ ZÁücZMmÃ0&n4ñuÁФP)É\–è¡*þ¼Ull6J¹1Å0³¦¹ÁkëhÝÎnç}|^ýq÷½ïò蟎÷ó<Ÿ÷ûÍ}xžïG@DDžJý d=—õ\V~gm´óÓ–O[þ©$>d€ã]Ç»¿n‡‚/ ¾(€‘+#WÆ—Ž/«ß:oñMå—é‹€«ÓÕé„wŽ[|վ꒓ ÷JàÚwjd?ÈVY`ü ä‘§–Q¢Xž‚­zªß:oñYü–ž¥Ÿô#0cÉŒ%"°ªaUƒçhòÀðÑìf[zZ;°›ÝäÕ£F£ÑÈ#PAÀllÕ­~ë¼Ågñ[z–~Ò}•¦ˆÈoaÔéuzÚPŸéÕJ´P?>Ç–*(«ÃôšÓÍé n¨êvŒ3ÆX)󡞯ç£éi³´Y “üP©‹ã)ýôU‹ˆÌ;žÏ@ÔIÇÝ9wç€q€:ÌEæ"bi‰o8Ïy0‚FÐÝtÓ=ÅÐLØPÅTLÅ€OÙÍnµD-!Æ›)þgûûúûØ}0Óø­ë·®ßºÅMÅMÅMPùUå¾Ê}ðÒÆRw©›GÃ5“ÏL>£ÖÃ…€ÊIú>ϯɯQçàÓœ†Ä ,d!œž*r*¾m¾­¾­Ðµ kA×[ðäÌ“3OÎ߈oÄ7===™ÆÚzÛzÛzañÐâ¡ÅCv¾<\ö]Ùwpð×#÷ÜH\J\ÝÈý!÷uN Ð[è5oÓö‡ý N¦Ç€Êu•ë*×A #ÐèÈN×Í€03ëGŽ…òÆòÆòF¨ÝR»¥v ¸+\s\sàpá±ÏŽ}FŒ˜C¼ùÞ|óv–f»Ùî¸-YÚ*m•ˆTˆˆÈŒÔlˆV¨h"rY.ËeÉmHÒ†DGÀ°óÃ÷†ï ß›?6l¾H©*U¥JdåΕ;Vî)R…ý…ý"Ń%ÛJ¶É ‘øÇñEdX}­¾vÜÎg´:ZýËOò(Øìq¼&"†Â;à½ã½#ârºœ.g¦±¼«yWó®Šä–æ–æ–ŠÄ«âUñ*‘eË:—uŠx®y®y®‰L†'Óa‘]¯ìš»k®ÈÚ׋‹$Q]Påªr±A~ëhèhÉ>[[ûËOöTj-Ÿ´| YSiô=Ù99‹J\Jt'º3¯*Òi´‚V§Õiu€7n¯¯¯H®[„ĉïßÃhùhÕhJÅõ ==Åfã-rŸêM›w<£žÑ¨úö?LëÖ€yÆ<3eŽÎÿGœ8ñ)øiŠ(õ¶jU­æ˜9FL=Ÿâ¿¢Òú¿ÿg‰ R›W­Î^m±j}äèÃú0à7F"sóãÆ‰8Á N“ßJõ›º©n¦ÇH±ß4ÑÔ}T®¥øYí\í´Ç7ÿ“û­|b_Oì{ìÉ|Áþ þ¯Í—dd~IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.7.png 644 233 144 3000 13755454067 15025 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܵIDATHÇÍ–ïOTWÆ¿VE*”&øéB*bK¬ièšH§–U+QÑjúÃVIX¬)Û¤[²E$iºDŒ©´ò‚þÂíòb¨F%ÁUTp°nvj¶µ„‰‘†- Žƒ3™÷žÏ¾˜¹Î´îày3ó|Ïù>Ï“{îyî‘E±_¤ì¤ì¤´(Núc¼>oü Ïü#ŠÛ40U˜*~ü+<Ùúd+@ú—é_êÃqlÌëûEâü‰zF]I¼bK±™¬1|v­ÚµjÞÓQ|ø2˜O™O=ˆÀÞÓ{Oœüúä×ü &€ëŒâؘ7Öý_"¿ú¾|ãN6æcë~ƒÏà7ô ý¨Ì—3_mol{ÃüE´aøïðÞ²÷–záSÀG|D*D|€ö¶ö6AP—ÕeL˜ Žyc½Ñoðü†ž¡õßJ¿ˆHË«°ÃµÃúá+‘±°%le‰”DJÇœ*•¥žROAä§ÈÈ ÐºSwòÈPU@PZr(+”EX{+Ün‡H(ʯÞܾxûbÃ`Ë«ñ­Ãh™óoÌ¿¡lz?ô>íûlð³AøC}™µÌ'.ÞX¼±x#ÔÕÕAöÁìƒÙ¡q]ãºÆu0{vöììYu†:C0âqŽ$œÒã©ÇS§ÂÚçÖ®Z»*^×oÅþŒL,˜X„ÒúÒú”-)i6P(º~M¤ÇÑãÙu¡òPå!ª¦ÿ=Õ9Õ)¡ô•éyéy"kìkìkì"–ÖÖÃ"žsžsžs"=¦SI$<òi³µÙÚl"»»wwïî¹?yòþ¤ÈPÝPÝPHùïÊ—–/c„È¡Jr.ݺtKDæú6ø6\¿˱¶þY=§zNüT†šÖ€nÝî½Ý‹Òݺ[wC°?ØìO»§ÝÓãîq÷¸ܺ[wëð ÿAÿƒ~˜^>½|z9¨&Õ¤šÀûŒw™wø/ø]~ ôwõwsQ=´êúêz#ÏÚûorìB4WÔs¬RUâWsU†ÊåU^åMxyüø¦ÒÿA‚ ¨FûNûîW9¦¹4ó„y"1Ç\#y_O~=¨‹%³=r'r°kº¦¦…>úPªSu¨PW•C9@Ù•]Ùjö±Ô]5©&»ÑTe‰ö¡ö!aê´µ —á+Dbz$ÿãû­|loí}ìñ¼Áþº¥I·­²ÛIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-20.png 644 233 144 2375 13755454064 14670 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܲIDATHÇÍ–_H”YÆãN:Sa5TJM‹±›SÚU1«±íÄ !!ˆ,…¶˜-J‘Ð\ä» YÒR‚ÝuI)˜¯ÔíÛæ²Q¹” Ncˆ$ó}ßùíÅÌ™ïÛÝlo=7Ïûž÷yΟ÷;„B¬L}Øòmù6gÛjÍxö¾ì}ŸþœÄ—uȨȨxvV\\q`U÷ªnã…‰U^Í·Ö aò[õT\¬f «7«7£,…phÛ¡mÙk’øûpÜvÜ~¯Aݺ;·nܺÁ70õ`êÀ»²we`b•WóU½â³ò‹À¿ô…{Èʘ€¬eYË„€{7îÝܜ٠~Ÿßð:óu¦´€–³\–sÌ¡Æ[ VùÔ|U¯ø¿ÒSúI?V—®.ʫʫ]É‚?Bs^sžÒKÜÎqŽå Íiszµ^Mäˆ ƒ 0±Ê«ùª^ñ)~¥§ô“~Ä?÷ö‡/¡2»2;mè>óú >`t$¤[ú¤©½ÐžhOÀ1†áôŠ!¿^éí/-¢E@~+¯ÉkH0ÚŒ6&_Š?­§ô…ÕÐgÀ1嘚ûÂzXÞðíF;óò-.\À×TQe!DˆÈur\ìa{,ù" (>§’Jã¼qžyJ/­Ÿô“2vùW8Ör¬E±µò'9$‡*3¾a|ÃøhÛÔ¶©m<~õøÕãW¦ðñðñðq¸d¿d¿d‡‰çÏ'ž[Vô¥LÈÒ²Å)=¥Ÿô“2öGôÌö̦Ë“‰ÖD+qóŒyÆ<¯åkù”úKý¥~pënÝ­Cp,8ïnïnïn(:Pt è   CÔõE}ƒw´ƒÚAÅ/˜úI?œCÎ!Ù SÅSÅf¡a×FµQ÷î?ÜšO4Ÿh>aƽ;¼;¼;`{Ýöºíu°?¼?¼?læKfJfJfàêõ«×¯^7ãz¹¶V[kÙò´~ÒMˆL¦ŸB!ìA{P¨³-d®Ï\/4Ò(Dywywy·µ3µ3µ3BF #…!\§]§]§…¨Î­Î­ÎB¿¢_ѯ¤y„³ÏÙçì"‰Gâ3.â"Oä™z¦~ÊÏ¢+ö§Þ©wšøéàÓÁ§ƒãÊqå¸ P¨T˜ù»-w[î¶ÀÏÏDë£õÑz(é(é(é€]»vYø×$oíb+¶èÓ}ñX >‘r‘‚Ç9±&¬ cQ$:Ú–‹È{yoŸA„Aôt2“™É̤HýZýZýšHüiüiü©HX…UX‰ÔMÔMÔMxx#e¤Œ”Ççãwô´¾ãg§{L-©%µä}øLe¦2S ±ÎXg¬"w#w#w¡·»·»·Û·B)R¤€a†ÞÕÛá©Ô§jŠ)¦<ÝíÈvd;«çVÏ­žµ©6Õ¦ÏØ:묊M6ý|;:•;¸ÇübTPªMµ©6ß‘©Q5ª¸Îu®ûð9×Änî±ÜüúæÎ»_ÐŽúéõZ½V¯ßxß!Sãw}óïÙÿÊ=ûºØ³ï±½ù‚ý§ŒFv®4_IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-166.png 644 233 144 2741 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü–IDATHÇÍ–ïO”WÇÏŒÌ8„Bq“ ‘š¸[·R‰»4+¾04$(„Æ¡²¶`bt•ÂðÆÖ´¾(Mã²KjˆÝØ@J»¬©?–`³ ‰V@* †lQGG@K‰†¥¸ìX6Ìóã~öÅÌgÜþ>ožœ{Îù~¿÷ž{Ͻ""’ø ¸óÝùíÞïŒ{+¼¿8·OZàzÍõÚä{ð܉çNäôäôØ·[ûu|j¾ˆƒŸÊ§Ç%[œŒ/2¾p•%ì÷áõÂ× ½?‹ÛßEßÅM8РàÂç>§ ~ýðk€ÇeËÀ±µ_Çë|—Š/ïÿ¿¤}™ö¥ë>d¤g¤‹ÀºW×½º>¸·ªwTïø~Õ÷«”¬™dª2 Jý-¤ØÚŸˆ×ùOãk>Í×#°¦tM©ÔÔÕÔù>'Üþ+¼½öíµšÏ¸|ȇd‚5£ÖÖ¬€Vøpck¿Ž×ùOãk>Í×#O×¶£H¤&€1 Ö¬5 v¦Ñb´`¨«j^Í£´dõ;U§êÀ ™!3öM{ÒžL® ªAµ«v”ù؆Ø {ÖøÎø.9áQVv» ÀNð;¥y©Ó7ë›z ’É.Pi ëŒu,ó7"DB²È" Ôõ@=Hbˆ!P[ÕVµðâÁ“âÿÈ.¶‹YæÅ8>Dò"yÀ}÷}÷£­'!ìäCäÚе¡kC"¹ÁÜ`nP¤@¨%Òg÷чÈõéëîën½òEž9ÏœˆÖã±ì×-±Ìæq‰ˆÈù­äHN2QÌsæ9óœ•TR)’=== âïñ÷ø{D‚5Áš`HæÞ̽™{EkkkDr6ælÌÙ(ÒÜÚÜÚÜ*’5™õmÖ·"ÓæLx&œ„_Ã/c‡c‡E’z’{Œ3Kg–€óñšó¼yɼ¤÷”N—N—NÃ@ç@ç@§³¹wîÜ=~Ûoûm¨í­í­í…'ÍOšŸ4Cý|ý|ý<ø[ü-þ¨½[ª ÁÜ‹§O9{ŒÌÓöiÛÙc?=•±Ä)™5o™·œS¹ôÑÒ±¥c;;;ë³Çíq{ºººÀj²š¬¦ÿ´=mOÃB×ÂÇ ƒuÌêµzQ`µŽ·|šÿéSùR'øúF=p׺k%q+Á®·ëYŽ Nùh ì¨µ+ µ]mWÛAT@@mTëÕú¾ù®ù.ËêÇd{%ò °ì›òMý¤¥t~ ÀNvþ2¬·¬·0ø„a†>ÄÎsÔ¨U£ÀŸ9Á‰” \ L¥F­ Ö >±Þ´ÞLéüVÀðè•zªó?³wå3ûºxfßcÏæ öðÍ…Zd&IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-34.6.png 644 233 144 3014 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÁIDATHÇÍ–ÿOTWÆßG‡™ÂÂ&dŠÁºJŠÚî6™D-(šhœHÁª•4AQè—ý-”[61Ú¬®Nšò%+MÓ‰!LÐZcXw˲‘BLkÖ°m-L$ î´ãâÌ0sÏg®—”ÀóËÍsÎû>Ï“œsŸsDD$eá+`v˜æ_ű¹Ò˜OØž°}Í…8nŽ©ÄTòÍ;üAò©¥~¤}g`}]¯_Ü/bð/ÖÓç%EŒ «Ïê3.àFxeÃ+~Ǿ¶K¶Kÿ‹Âáˇ/\üøâǼ ?öÿØð ðA!X_×ëõ~o1¿4þB_–_]~Õt¬+¬+D «8«8ûñ‚álpítíøaÙË”bÿIT…@ ú,ÂúúB½Þ¯óéüºž®÷#þRúK"°{ßî}¶¶xÃw^¨Í¬ÍÔõæ/'8A"DƒÑ @ì@ìaP×ÕuL˜ÀÀúº^¯÷ë|:¿®§ëÇý[9'"rz+”úKý } 0ߟ_3¿Ô†hQ´ˆù§J·¬ÞV5ª4‡æÐcŠqÆ#¥Gë£õÌGæSçSAŒóCéÝÒ»@P××·²[Dd½lA[0hQš¿Ïßü € ^P/0G'—¹ xðàö°‡= ö«ýjÿ"Cᕬd%¨15¡& ÞÁYàÿí‚Þ‚>7â~„I‘æ^Å‘ÝGvëlÚsÿ¿åºå‚3›Ï8Ï8Qþÿÿ–ŒÑ®Ñ®Ñ.è)í)í)5æµ^­Wë5ð7ïTß©†Ó=Ýrºu³úÆí· =ìGÊ”cq?ûJDäßoÃgŸu—;‡3†3ÔÁ”SI9I9„KÞ/y·ä]p48 0ìö{ Á¢ü¢ü¢|(8_p¾àüRãp CÞú¼õyëÁuÒÕàj€ßíÛÙ!<Ð:^=^­§“ŸN‚¶1îÇl:üÔôSÓÏ;EŠìEv‘™+÷~¾÷³©íÏß{kL¬•*+++E’×&¯M^+bé°tX:Dš³š³š³DzúzúzúDÒ3Ò3Ò3dɸÖz­õZ«ÈHÒHÒH’H¦53%3Ed{ÙŽc;މÕQ—z%õŠ©MdsâæDÓÕ¤O’>yÞi6¬xzÅÓ<+¶3äÙf~1übX~rç»+Ü"ž“žSžS"ö{½FÄ×èkô5ŠxCÞ7$R×U×U×%rÿÐýC÷‰ˆK\â2ŒEUTE•H‚)Á”`ÉÌÊéÐ:²;²Eú[úcý1ùI$e,eLD-—R)åY‰¥Û¿µ«|©‹ÔÁÙ¿øÅ‡_À¶úâÂâBcKœÎ gälÉÙ’³åŽrG9¬j]ÕºªÕˆé¦ Mš.@d$2öÕí«ÛWCîÃ܇¹ ¾çÞÙT´©Îh:Ût r.r¢1{·½[ùDYõ3֙ߙ÷Ü¡­¡­êàï·mšÜ4I8íbš7Í eÝeÝeÝ0éžtOº O§ÇÓţţţ †`ÝñuÇׇ‰Ú‰Ú‰Z¨h©h©h{Ä>mŸ†=·_v¿ì&<ó=€:>›ÏêbÜÏBŽ5÷òy•¥Êbü%‘÷>*„ûÖ©ÐT‰ÄF–î!BÀìàìàì °—½ì…@U *PÚMí¦vT»jWí8x=ð:*v2R)XôWUeWeëÛÜ+\ùEŽý3ž+ªíq޽¦^cNýF=£žuTUGAÅTLÅ€]ìb0È ƒ@=õÔ/r~€Wy´ ²( €ÊSyÌ©ø­²C=òßòß°ÍØf‚þ¥ç˜~:Âzò–-+[ü1žÌêoÑéè4ЛŠM-M~y÷€4ÒHÆïJu[ ¨`r¡þšU³2¯z£³ÑY IOþ2K™ ýÇ—ø{W>±¯‹'ö=öd¾`ÿíVòšF@4fIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.1.png 644 233 144 2776 13755454067 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܳIDATHÇÍ–]L[çÇ›ðaAâ et­ žÉMEZ©Éˆ‚" R˜ ªÚš Gj4›áTI´‹dR¤Œ"P‡˜K£U–¢) "I´lUmm%a Á\L uÒ`ȨÛÇçýíÂ>Ti÷yoŽþÏ×ÿ9ç9ïÿ}DDdgê)`-°Xw$±õ7¦=«&«f÷ߒؓ˛–7ïýì=ö€ÜOr?ÑçMløø­ù"fý­|†]vŠiÈìÏì·T¦ðExë•·^ÉúYàÛMÛͧ4Úü)À ï /¿…‡'žT>©~#ÞÈ7êm­/Â/éÃéÖCfFf†8^s¼Vø»dÀR!¼^÷zÀrÚrš²@bÈ!GUaÂ+´þT¼‘oÔ3ê|²]»*Dà·ßxÛö×dÂüUpç»ó ¾øMà—È-¬…M‰&¢ üÊ€ ˜ØðñF¾QϨoðüÉ~ÌQ®Šˆt†úµú5P?ˆkóñçâÏî‹ÏÅ爧:Uê„jT ÝѦµiÐèô˜kƒùR ôR½”¸¾]Û«íõu²>M?š¬üÆ(ÿ."òÒ‡` ÛÂámjuq|qpP j¿ÚO„âÃJ”(IÊxºè¢ pâĹÅÞO?ýð'ü ?0¢ô‘”·mÑ¿èƒ?ÙØK¦¾˜gL´XZ,F5ýÕûù³³³³Ðý‹îÝ;QSsSsSs&ßRÃRÃRtvuvuvÁTëTëT«éW!R!P§ÕiuÚ´_i¾rñÊEÔ¿LM™|êxóRó’1ZϘè¿™n‡[Ýúîý#x9xY½SyÁó‚‡hʼnІŠp®9לk0Ø:Ø:Ø Õ%Õ%Õ%p¤àHÁ‘Øw|ßñ}ÇaæÂÌ…™ f#±“±“±“Ð8Ù8Ù8ijÀÈŸ‡‹‡‹‰¦^ãÄòÕÙ«³FcÓí’¸›ÝÝ­ú!Dá–ý³ç?{Ü¿o/n/6 ÊÊÊ ¤¦¤¦¤öŒîÝ3 -3-3-3pnäÜȹXíXíXíØò«=Þx¼ñ®¸vàÚph™³ª¶§}OûîNŠ|SóMÈ·—jjy7z3º;º[bÃÛ‡· o±ŸµŸµŸ‘ór^΋”g–g–gŠdÝɺ“uG¤È]ä.r‹Ô5Õ5Õ5‰”y˼e^‘•øJ|%n6–íÍöd{DÒsÒ¥=’XêŸ{×ò+†?CD$\®¼;)|ÜðÞûï½·“»äñ×ÁÛÁÛL ¾|üu°.Xî ÷†è£>9CÎô<=OÏU«jU-„¼!oÈ úAý ~ÐåzÛúåõ˨ØxäóÈçæ®ä«Ö퇷ìJC7LI阡31•¯ò7u\¸pÖúy¡ T*QeFɰ£ʱEÇXœXœø¿:fœ‡ùc}{};¨«IeV“‰œD¨kÚº¶Nœ¿0Î8Нðãõ…U£€/^à?<á ¨ûê;õ°°©ü'ôÄÉH”'ʾMåÏ<š DªüÏîYùÌÞ.žÙûسyƒý_¶}MÒÂIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-38.3.png 644 233 144 3054 13755454070 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜáIDATHÇÍ–ÿOÔ÷Ç_wòµÐõöƒFcÕ°‡µ¢­VRÌÁÀ4 é~`„B ÝL¶&MšéÖÍ/#ÛVY´S¨‘5˜³R]:M ["±%®‘"(ƒ¸¹£…z€áËŃ»ûÜçýØw?¬ï_.Ï×—çóu÷¾÷óý[üSÀºÑºÑú¶6šñ”’”’­ÆðÉ(XÜ÷è/á©OÈèÊèÒÇLläúÕý"&ÿj=#.61ÉÞd¯ÅÇïBͳ5Ϧ|7† R{S{jðÚ¥×.\<{ñ,­ðÍgß|0ïœw‚‰¼Qoô|«ùåÝoé‹@â'‰ŸXþ ÉIÉI"°i尿[~+¸»\å®r€¯×|½FY : ¤“®œ@€Æš[…|¼Þè7ø ~CÏÐÍ#µ'kTî¯ÜŸÚk놷6¼µÁЋôG8B:h-}5ú*!P×Ô5,XÀÄFÞ¨7ú >ƒßÐ3ôcó˜[ùàz¢zô€Èum2²%²”]+ÒŠˆÄ'Uú¢>§Ï6©ù4¨•£r0×xð)ý^$ Ñ¾Š¬‹¬µ5ÆÕ³Õ³À‚¡ole¿ˆˆýH ”>q}â:ðÊ@9”ƒ “L3 ªA5¨ ‹.ºV rŽsœ ( À «‡ê¡zü–#P{Ô‚ü5Îß׋ëó¯Ø<Â}‘“Š¦Ê¦JƒNßqë«!× <ÝcGGÇÃãaSpØ=ìvƒçççŒ?<~ØÌëz‡Þaâ[¾[¾[>ð|ß“ëÉEMøÇÎŽ5õÔ?šRšRŒ­=9 ÑŠˆÜü\þèòGp£üîú»ëUƒíwOæ<™C¨â‡/U¼ö {…½¼íÞvo;رc*‹*‹*‹`óöÍÛ7o‡ÑåÑåÑes Aÿ Ð¶ã¶ã¶ãà>áns·ÁÆ;ëß^ÿ6¡ÿyþù7Tô&ô&€Þ›ÇjiN[J[Ê{Q¤ØRlYšž~zúiKgË蛡7C’ܘßèltŠdfffffŠ,t.t.tŠDnDnDnˆwww‹$O:Ÿt^d9{9{9[­EߢoÑ'Ò2Ð2Ð2 Òø“Æ–Æ‘µYz–.ÉAïÌôÌ´¥SÄyÕyUDÒÓßI'ïÅëPÒ†¤ äJêŠoÅg‘½+/W½\%vÿú¹ÖçZ%«fsíÖÚ­"aG87œ+¢çëùz¾HÈr„"ý=ý=ý="ä‘Gžˆõ¨õ¨õ¨9XéíÒÛ¥·E vì(Ø!RWUW]W-^ûÂ>ë_¬v«]ˆ$'K–¬³6[›É•huZfZ¦òBèõÐëð§þÓŸŸþ~TVšQšanIakaka+캲ëÊ®+Pr¿ä~É}3¿íÔ¶SÛNAÛhÛhÛ¨?6{löØ,”´—´—´›ñïý,ûùìçáýg>Èû  \.-úDÿýÊ+ê¢ñó¦yÓ P  Š_˜zaŠPÆ3ª2ª ¶¾¶¾¶&û&û&û`ßÁ}÷[¢-Ñ–5õ5õ5õ0²4²4²;Ý;Ý;Ý0h´ Ú 0¿0¿0Ö¶¬­_[ÕZege'¡Å„˜xw{wƒêŽÍ#Æ) ¯9¡9Á<%á¶eç²f’ý+þT´'Úí1¿±æÒ\š f‚3Á™ 袋. ¨êÌÕÍÕÍÕº .¨ qDø§ýwüwPÑÿ„;¦cÍ›š7­:•Œü¿Qó5þÈÇö«ý•S•«rÐïé÷ô{ œÊi\8Ê®ìÊjH ©¡UñËê’ºªK}¬>P.å"¨b?B™Zœ¸9q u1u1Àß 3œ?d8ï+k^Yü<æÌꪶ -ïG§¢S¦ós’÷xTŸúT} œá g€æ™u[}©¾Œßž øUô‹èDÔß´)m 8m8\/ômç|ïÊÇöuñؾÇÏìÿxiïü…¤}=IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-no.png 644 233 144 1367 13755454070 15060 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.1/web/www/routino/icons/marker-3-grey.png 644 233 144 6032 13755454063 15711 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÏIDATXÃ…WPSWÚ~ÎÉMB¡!ìémÉðK–¢Ÿ`ÅO «bÝÙ¦[­í ¸­Ž#?* „ÖÕ¶nap•":³me]¡Kš"¬®ÁN¬T>†±T´Q*Ä$7çì$°c§Ó÷Ÿ3ç¾÷¼Ïsß÷9ç=—”•••••AY³Ít•p[¸-Üæ­eŸ”}Rö ©¸_q¿âþïby äïþYÔŠZQ»t›Óè4:üNàN"D#Ñ0€Û° Ûø!ùFùFùFR$ü(ü(üxý'ãd|_}ypypyp{oeVeVe±Šáb¸N2fy°//5#˜„$$ÑÓ¬‚U° ÖášrM¹¦&T˜*L¦ÓÃ.«Ëê²¶]u,q,q,YZ ªQÕ¨jв4}iúÒtR”(M”&JM‚&Aøæ>¿ï}ßz_¼¹ø^<¾ŸàÍàJÀxÛB²I6ɯ‘„KÂ%á_œ2L¦ Ïh‚Ú‚Ú‚Ú>>~‚8)NŠ“ ®K®K®KYÿ¤Òéy„þSý§úO…kÈ@2`çQ<ŠG!€®¢«è*wpwò2y™¼ ˆb€x‡Ç1BŒHœ§Ä Ìj ±4–Æ<–ÇòXÌ–v/Þéãúãúãzao¶7Û›³,HD"O'<šGóèýt«Ü*· H};õíÔ·‘®þRý¥úKÈX'ëdPÒËô2½ xKŒa cÀð•á+ÃW€ÆêÆêÆj`ìó±ÏÇ>dkdkdk€ÔÎÔÎÔN y]òºäuL0Á&ÒDšoüõGêÔÁ‘º.u]ê:¤7¾ÕøVã[€4T* ÝÿG*FˆbÄsÛ ü)ð'z6åÙ”gSHw·É¨™š©À1ñy‚¼Ž×ñ:àÔÂS O-ä«å«å«,]–.KÉ'9çÉ<™'ÏùùDþDþD>çräÈἯ¶¯¶¯vÞï;ä9祖~Xú!çæ«æ«æ«ó~¦eZ¦?‡çÅ÷ñññ£8€8@¢éz†ž™û29šÑŒf*¨ pg0ï‡r½r½r=P`,0° ° °  amÃÚ†µ@ýDýDý°@¿@¿@ÄîŽÝ»{~ýì@€ÀwøßÍãÓ­t+Ý à8Žã8‰¦­D+Ñòڗٗٗᖘ/æ‹ùóä<9>GX õ\ÿÂ|ÉdddšHi"ÀZX k¦4+ÍJóW0çšs͹ü·¡{C÷†î% qÓqÓqÓØÈ¬ÌʬPÊ å…òB -?-?-Hs¦9ÓœäCÌv€oå[ùV€¨`ŸðŸðŸðG@ËhËh˨¨“î’î’î@ìÄNì%l¶#ö½Î«x¯B½×öuxÇ3l[Àà‰÷nÜ»qpíqíqí)<¨ TªoŸ0 ˜L’ªÖ—Z_j}‰¯&;ÉN²rvŠb§ÀáøüÄÄMÜÄéQ˨eÔ‚†¶ø¶ø¶x<¡²ª¬*+À–±elYáAz˜¦‡Gf¼R<âÝr¾@|»ÐûK"÷N½%’TÍj׳—$‘$’´ú³¿_ýËëÎuç²]¯°WØ+Œ®Š;w8î06²~ÖÏú¡¤14†ÆÀ)‰EbäÇ"E‹ôDY—[—[—KnúÅûÅûÅW­˜Ý4yß°:VÇê„#ÞÊúzX@eeeee%쾌Âû`NC^íîõj÷ˆW»Í?Ó®Ûä6¹Å\[½­ÞV%¥”RŠG¾L´O·O·O3ÇHÝHÝHä¦_‰_‰_Io‹ó®ó®ónÉ7×Þ\{s-à%¨óuhÁ¹NˆÇì±”ÞW¼Úý×Ï´«׎kÛÙ²³egË<{…(Dá‰M¦GƒÌ×Ì×Ì×Èe¿²_Ù0Ó1Ý®a³°YØ<ý‰‰‰tÌ‹÷{ï8ý8/ ~ÁRRRRRR z§=\Æe\FvXYYáïž§[Ÿ­ÿõÆÇ7>¾ñ±gå¤{Ò=é–ì‘®’®’®Êåõ¼ž×Ú2{|I†f{={ÒWo¢ÄÇùüŠý‚v+ЊV´zʹ‘¹1e6Ñ&Út)bfÃ̆™ l‘´NZ'­£}’IŽ$çÂåȦȦȦߥX-ƒ–Aò%[Ȳ…ü¤7®ÉKÐñK<(~ÅÓ®÷¸ð”c'vb§pd‘,’õïHÞÊ[yë¾×O+žVá%øcøa€¿+þ®€(¶ãv¾]oóÅòËîÿõ%'—œt\W‚+Ar*s*ó¶[ ¿æ÷ ï¿Åÿ¯âÀøH"IUA‚ئÅ`;É·ëm>›ßîg÷·ôd>–ù˜­OFÈ-žüìæ-Þ2È ˜³îJuQªQàF$ÿŒé2]„Õ>«Ïm~ªÕN°Sìä¿ïÊûöuqß¾ÇîÏ쿘±ÛÍuIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-38.8.png 644 233 144 3071 13755454070 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜîIDATHÇÍ–ïOTWÆ¿323Ž¥+"M ]äÅ4HcŒ ¬ZI䇺hÒ "&«Û66›¬&md³Û݉®$%›uH–hÐJiLš¶YÖYŠ-Ô„ul‘ŽP‘‘™¹÷žÏ¾®—ô/ð¼¹y¾?žçIÎ=ßsDD$eé+`Ï´gÚ‘ÀöZ+¾²xeqv[7é`«´UÿV7®nXÓ¼¦ÙøÆÂfÞ¬_Þ/bñ/×3ã’"VÀÕîj·y—ðP•W•·ò•þK¸¯»¯/hpô³£Ÿ|úɧŸð<ºõèÀ¬wÖ 6óf½Ùoò-ç—~¦/ŽŽ¶ÿËérŠÀ†76¼±ñD¢àþF(+)+ø~Å÷+”ôÇ@2ÉÊ „ c®éeØÌ/Õ›ý&ŸÉoê™ú ?i;Òvˆ@ÅÁŠƒn¢á›Vx/ã½ S/~h dÐÂZ@S“(¨Õ€ XØÌ›õf¿Égò›z¦~µ•‘¿î‚}ãûÆÁ¸ïÓ‚ññ hÉ>•}*û”HGuGuGµˆcÂÑåè¹µ÷«Ù¯f%M$i2iRDUèvÝnå2ÿ±k× `òôâ®Å]ªfóîü©ü)¢©Ã©ý©ýp ï@Þ<v»‚]Pz¦ôLéHq¤8RPu¸êpÕa>2|døä?ÍšÿîMÜ›¸7åF¹Qn@ÊDÊHÊTü¶t±t‘èÌ?Ôqu\Õ@ûwíßú}˜§€®cIÇ’¬Sûó3ï3/„\?.þ¸ˆÒ/ë—õËÖO­•ieZ„"¡H(†b¨“ê¤: ÓõÓõÓõ 6«Íj3èézºž¡ùP0Dé¿‹åÄr,=F­?¶~Ù©äóŸÍ±'æŠò?ŸcÕA"j»*Q%`LÆ(¯òš€ò(ò€RCjhYü¡ ª ¨•jZ öª½DÔ¯üêþøÀø€{Þ=N"`Î1sòGÍÉ»ÅþÀ;‰É¬¾Ðæ´9àïúúÖ䧉‹\Õ¥nª›À%.q ˜c–YP#êkõ5Zªÿ—>¯ÏW]ÚŒ6\4'ÿþ¤ýI`é?¿Ä_Ø»ò…}]¼°ï±óû"ÙÌO&(œ¸ÆZm>â\Ö¤b:œT÷:CbêœI¬¥‹Ü­˜zYcÕ¨#SQ™XJÃDi‡M2׸ÀVŽÃuÐá©÷ûó}õàîw?ª‡=ñûäöþüy¿ßû}÷ùÜW@DDœÉ_tWº+Ý‘Àé¯ÙñEÏ-znÙ¡þØ€´õiëÞ |ôÀG‹¿Xü…´±•·êç÷‹Øüóõ¬¸8Å,ì\Ø™æNâ=°±tc颇øý~ÈêÊ꺥CÝɺ“'¾<ñ%[`r`r ⎸ÁÆVÞª·ú-¾ùü²ç_ú"pß·÷}›vf.ÌG×<ºfé¶DÁ¯K¡òùÊçB¡ •ÆM —\å¢D±Îô+ù >|ù“MŸlˆ¿t#ûûìïU§Àâûßosfºmº ÔW©±`•g•g•Žo=¾õøV›x¸|¸|¸V\ypåApososoƒXK¬%ÖÂΈgÄ3â™__^]^ ±wµˆa""@EâsXÐggU'ß…§ÃÓ FÿIX¶ºÌ]憞֞֞VùB¾2g3g3gÁgø Ÿs§çNφ;Mwšî4Ádådåd%\YreÉ•%³"gEÎ ðÅ|s¾9ˆüµï¯}`V'…Æ'ó&ó€1G»£]u¦Ë‚èšèš¡Kr·ÿLÿ‘´§DDØ”ÚxNuNeN¥Hninin©ÈåÛ—o_¾-¢95§æé^Û½¶{­H1Å#ÒZÒZÒZ"âmò6y›DºÎuë:'¢ö«ýj¿H÷²îGº) ôôI¼óÞO{?e“¸†^zAÄ8­‰Ö ]²§R««þ-`ÜšJ£×è…ÙgfPÚOÚ€6qoÜ÷ÂÔÞ©½S{a"<žCØ ›an5ßj¾Õ ‘†HC¤bù±üX>ܬ¿Y{³&Æ&Œ Þ>æóÂíß,½×ã¯ÇW¬©$µÇþÈú#ºFçFçR7Yæóˆ½ÇÿqÔRµ4ÅWÿÚcüc‰ ’›WmÈØw-@†~]¿œ4¦8ËY”úZµ«vP?ª5ê”:¥N^^åU A€õ4ÓŒRßè†n ©l#TG’Õ;Uï@ÂÇüÍïþWÞ³¯‹{ö=vo¾`ÿzTe3ßT2IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-21-grey.png 644 233 144 6135 13755454063 15775 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—kPTW¶Çÿ{ŸýÀ‹ Z"Q /µ”ÇèDI£ŽÃ-‰bIHH,0Ñkf$:C†D%¯T¡¢ˆŽÑ(qLD!$€z…\Ì”B.…<”g `hèîsö¾裔U©¬/»öê³×úµ×Z½ÉÌÌÌÌÌ„³2>»Ðuâñø€Wf~–ùYægÜ3{8{8{ø!Ü»q·ÃoI^’—ä¶ÃZn-·–ó<œÁœ!D ´£ív`vð\ƒ5XCKX6ËfÙì[Û”mÊ6õLx¶!Ûm(é± Ù†lCÕÿ¶¬´¬´¬ û›KKK*Â6†m ÛH2"œ"œ"œ€p÷p÷pw@Ù+¿+Ï+ç{í;ü)þ…OtDp-wå®Ü•%‘’BR| _ÁWð½uvêÒÔ¥©K>î ªT/¨–÷mlߨ¾±Ú—µ,kYÖBâTª U,xïã}haoâM¼ àY<‹ga±z[½­Þˆk©k©k©ãö›7o²}6=ÚôhÓ«Gµ¾Z_­ïïÕrŠœ"§l(à©<•§>H"  kÉ™3fÔ¡uÞÿ!–‹åbyÝ¿lÓ¶iÛ´Ïý^ô{ÑïEiMÂ; ï$¼#–èÌ:³Î ?,ÄB,„Äx€ˆt À<ÌÃ<“˜Ä$€¥XŠ¥é$¤F1ŠQˆã®ã®ã®è¾zâꉫ'¤¤îÚîÚîZñ;g³ÆYóð†/ÅKñQÛ…(DõÿB5 šMàäéäéäùÑË Ë Ë Ÿ?ú%ø%ø%Hq©É©É©Éâw:O§Î åZ¹V®ØV¶•m…-´Ðä(9Jޤ‡ô€ô‘>Ò»ä.¹ ðžÂS ʉr¢œèBt!º,Tì+þÿ ÂG¥IiRšŒ ·•ÙÊleÉ«$,HXÀý.$\H¸ *9bf1,†ÅÀU‚…`€ž¤'éI€Ü$7ÉM5¨A €ð>`…V€Gñ(ÒBZá²pY¸ p 'pUì'|žðyÂçb‰â_áQø(ä<ð²ëíz»ˆnŒnŒnÄF]‰®DWg¶…ma[àJÓãô80b1Œ€ÆºÆºÆ: ­¯­¯­ú¥~©Àø<çñ<€Ô‘:RtŽuŽuŽwòîäÝÉ{i¹Anàª;¯;¯;çè¦è¦è&lTx>*ùKþ’ÿïÞvuuEÞòèåÑË£I‘£(œéuz^ºÒºÒºÒ€é'ÒO¤U}U}U}ÀÅÃ_< œÓœÓœÓööökbM¬ èy¯ç½ž÷C—¡ËÐtTtTtTà±ÐhM£o—ë—ë—ëI‘£ð‰V“Õd5áŸ!±!±!±ÈÐÔkê5õ°0Ê(£ÐRFe@Õ¹ªsUç€EA‹‚o%½•ôV`r3¹™Ü€CæCæCf -²-²-pƒÜœ>úüéó€|P>(¼r½r½rŸ€â â À“xO‚¨)Ñ”hJ`YòÂ’–¼€Œ&S“©É„ùÈE. ¤Wèzåñql°ÁöÄ^=Èd¢:¢:¢:žè™Ä$&ê^u¯º`vfgvÀÛÏÛÏÛÈÍÎÍÎÍ‚¿ þ*ø+À²Î²Î²n(Є&4=ñO_£¯ÑלÆiœ&¢à%x ^ü s¤9ÒI–KIR’”„çÅ1ELÇ1Ã1õÓë§×O¬²BànÄ݈»@Í@Í@ÍàÛàÛàÛ„Ž„Ž„ŽÐA€qŒc …¤|_ÄÍ}„Gxô¸}q‡V˜jšjšjB£q4ŽAÕ«?V,åwytytyð/~,þ±øÇb¡E(¦q §p ˜°MØ&l@‘G‘G‘PãZãZã lødÃ'>¶›¶›¶›q¥¸R\ °“ì$;9¨­hˆŠ¨ˆjÎlgÛÙv$H˜îÞܽ¹{3`0ð‰ºKÝ¥î’ò)€„¬3b¦˜)f’ŒÙ.#û™êMõ¦zh•öQM«i5¦b¦b¦b€=Î{œ÷8k__ûúÚ×9L“ÃÙ,›e3@\ˆ q™S4é4¦d'ÙIvÎÑWÑ*Z«'ÅIqÐ~müÚøµ‘­!Fb$Fœ"2‘‰|ÖYô¼íyÛóö¡ýÃÙÃÙÃÙ¡oŒVVV½Ö]ö\ÙseÏÉ{“F’F’F„üæ‰æ‰æ XI/é%½P´´´öAû }˜ š š ¶ulëØÖ„LJLJÇ?²v[»­Ý€m‹m‹mË“ %»Én²ªòÕå«ËW3K¿Ø/ö‹ô;m¿¶_ÛÿÛì»ÁnØwœè=Ð{ À=ÜýEÇœ¾qúÆé›o5“;'wNîôIþ4úÓèOùúЌЌРr{4}4}4\X,,ƒ­d+Ù Hž’§ä ø®ò]å» pvv~ú°öaíÃZ@zWzWzðoôoôo„¥yªyªy [Kæ—Ì/™¯5ƒšAÍàÌ&.p a[„ Ýß)Ò3ô =#4 Õ¨ˆ`o°7Ø)…›Æ¦±ÝBýªúUõ«xèóמ¿öü5r9üRø¥ðKˆç¥¼”—BKÂH ›“‹ÃÆ@E|öøìñÙàü€`þEû‹ö-\oŒÝ»1&ù9=tzèôP131ïgˆE,bïïäù<Ÿç‹ÞŽ1OŽ˜ÅÌVçíÝÂ)á”pj_9÷çþÜŸ¿:|uøê°´k,q,q,Zò2y™¼ 3ób^Ì à*®â*z衟CØ~ôì»ÅnÁêкVdVdVdÊ{ÇÒÇÒÇÒÅc*•¿ÊÿrÎÒ¼¥yKóŽÞB²Eþ…Nt¢Sڠ̣.èAz¤VlÂ&l"å!gCΆœÍI}@}@}àr΄zB=¡ÇKõ¥úR½¼WqH>$’a%ß“ïÉ÷*Q‰Ê9mÒ‡ûppêNÝ©;TõÆzc½‘¯¿Wv¯ì^™ïâáâáâÑ?c+±•ØJÒµfµfµfÜÈ܈ù3P‹c½Âæ±ylæ766¶4[š--ý‹›‹›‹Ûƒ+í†vC»Aȯ|¥ò•ÊWøz¥ØEv‘]‡h>Á'ø@$" Ó#Æãˆ—«WT¯¨^ù.C.C.C‹d‘,2ý=BÐ#ý3ŽT<æxÍXå€(oîø$Q:œãŠ„üÙÜ•÷’5d Y³þ¥ÙOŽ[×í»ì»ì»ØŸ_e¯²W]·ìȲ#ËŽ žµ±6Ö- ¢A4V)CÊ2 * ( ( —­Z=´ZèP¯P¯P¯ÈÿýlÑìûޱ"V$sÜì_”ËÉÉÉÉÉY‰(ŠÇ9äÈݽŽÜ=F H)¸]6;Dì+G*R‘Jì»Á.í///†–RJ)Å„‰šéšéšifé/ê/ê/:ÔûÕûÕû[+¬ÖëÀþ£111€ÐÏqN«>î·OWçShþiHC¹r-äZȵü—Ôo«ßV¿}9gÌkÌkÌKÿ2óËÌ/3彎‰~~‹{‹{‹;Î×5Ô5Ô5$m›¶MÛ0?æÇüþü­˜(&ЉÓ/øGøGøGP“Ãß:Öé§¹üŠèõz½^ɱmáÎÜ™;“ÿ   Ƨòby±¼øßÒlµ¾|üç ?oøyƒûµñûã÷Çïóÿn¾Ð|¡ù‚¼vÒ>iŸ´ iNëœÖ9­û«7/æÅ¼øó ¨ ‚Jè† &˜Ø³Ê 8%=ÍCðò+¹›=[Ýr/çå¼\ßIKi)-ýÿ™Í3›g6³`§"§"§"z_HR…Ô›µ¥¥¥Ð;ÆNò {†=Þágv @˯qPü†<•»Žv!ga7vc·ØH’I2I¾À+y%¯üû›š%š%š%ô¾Ð#ô=KØav˜Þ5ض­m[Û6`þ{Ê`9ý[ÿÚØìL0«þQIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-74-grey.png 644 233 144 6174 13755454064 16011 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü 1IDATXÃ…—kPT×–Çÿûôé744XBS”Õ "ÅQè5!Æ`”T±QBðNp¬K¢@*†DoP4fML4>P‡A2×F†D¼€RÊ£Á¡ yuÓ@7pNŸ=è†L¦RY_ví³÷Yëwöúï½×!¹¹¹¹¹¹pÅ‚™f#û”}Ê>¥5¹r/ä^ žùÏóŸç?ÿK US5Uþ¯¼†×ðš°}s•s•s•´gqgI€]èB€}؇}´Pš M&öûŒ}öϳÄHŒÄø·²<<<úÇ)))d˜÷å}y_¿À!4Ú¹\™EÀ(D!й(ä ùB¾Ð8?3?3?³<<¿*¿*¿êbÿüðüðüpÝ/–PK¨%4ìß•ÅÊbe1ªÃ6‡mÛLr"Äâ1îîî8úŽqÇ|Çû‹þíññ<>Ö¾‚¨Šª¨JH&{É^²×·Xä+òù6œ›ù~æû™ï}ÜÜëÜëÜëlÙ›»6wmîb¸àŽàŽà²Uš#Í‘æÀ‚ð>€X`ŠT¤ð‚¼`™óžóžóÆÖ}‡¾CO¹;wîÙã[Æ·ŒoÙõ¥ÂWá«ð]/³íµíµíÝTLÓhM{šL@@Àl GfÌ™ ‡zog¶’­d+õ—ç­óÖy«Ï«~/ù½ä÷•¸?qâ~ö¢«ÙÕìj†–a–§:ª£:°èF7º8Á N¦1iþð‡?@zHé1Œa ¬IeR™Tè«øªâ«Š¯øä¾»}wûî²Í¹D.‘ÿÏ->O࢓hDL1òy‹¼{Š=ÅžGÿa¹e¹e¹åóªß6¿m~Ûø­i)i)i)l³Ë{.ï¹¼‡e|ßÄ7Âáˆp,†0„!€>§Ïéswqw2NÆÉ8@êH©°û±¬m½m½m=à’è’è’ˆeÿŽxŽøɯɯɯ‰Ÿo™o™o¹Õ¢šQͨf¨6ýqúãôǤÅõ¦ëM×›`¨™š©*¢"*¢ @€€‡Òk!ŸO`6¥šRM©J5¥šR 0;›ÍÎÄ ‰DH"^`i  ïà”œ’S± ± ± Øì:á:á: wž;χ¢{c÷Æî€.„ áªP…*—p —<À<ÜÕîjw5àUîUîUÐ(E£ÒMºI7Ðw´ïhßQ@¦ S…Á® ¨\¿uýÖõ[Xb_‰}%öl®ø¨â£Š±·Ø[ìýñ–×òZ^»6]}M}M} …«««¤Ä±.Ä™8gà¶çmÏÛžÀXØXØXÀ¶±ml ˆG€ñ†ñ†ñàµ{¯Ý{ížc¤™4“fà©ËS—§.@±[±[±´+iWÒ.`ÙŽe;–í°{°’U1«bVÅ’†±†±†1ÎÄÎÄÎÄ®MÇ¡ÉC“‡&…‹ë/®¿¸ž:lFØ)ìv.ö)g嬜•Rk£µÑÚ¸ô\ï£÷ÑûPzrêäÔÉ)J-J‹Ò¢\Ÿ˜˜˜˜˜ ôØ™cgŽ¡ô`üÁøƒñ”¶œo9ßr~iÿ5ÿ5ÿõR|ƒÁ§øŸ’æ s…¹²¨0)šÑŒæ%ɱjVͪÙÙÙÀø¡ñCã‡@mvmvm6°)nSܦ8@>-Ÿ–O;NàÂÀ… €ëN×®;µ^­Wëyý¼~^ÿMb£Kñ™ÝÌnf7€R”¢”0"H#ÒЫæHs¤9½üAþ "r›Ü&·AQŽr””£å–üÖ+êõ @·V·V·¾|?øþÒxu^u^uàÜîÜîÜ$¿›ünò»7Ì sÃëκ³îKóI-©%µ ö®h¦u¦u¦½ŒãÇøÑ«Œì Ù²/ø¢^^^zõaÙò‡e‚„ Xm‰¶D["@xÂãÆ¸1h×´kÚ5Àº‘u#ëF–N¿?ýþôû@#×È5rÀTêTêT*p£ëF×.€ž 'è @߬oÖ7÷÷÷ÓÈ42°ƒ`àaÐ0ˆc²^Y¯¬—/bˆD$æesÙ\6—äÔ»Õ»Õ»ÙüL«M«M«¡)EJ‘fÈ#G<U¦*S• èjuµºÚ%Pñjñjñj`KÇ–Ž-€V®•kå€â˜â˜âÀd2™L& 2«Ì*3`?þæè(¥£PT¯©^S½Fˆ"b ü±±“0ž?{þìùóg‡%±’XIì÷ãáãáãᢾŠ;*vزìñUövîaàÃÀ‡€æ¨æ¨æ(ÀœfN3§ºœ.§ËéÛÒ·¥oqïĽ÷°uzëôÖi`[ƶŒm€µÌZf-‚Ö­ ZªÛ£Û£ÛiEkEkE«`¼ðhÍ¢YÚІ6€è‰žèM´&Z hÕþªýÖÞS½§zOáêîêîênòŽb»b»bû캂® +¶l[ÈÀ³–9ËœeΊZP‡:Ô FQB”µ÷ŒbH1¤j€¾Uߪo¥AÞW½¯z_%?_¾| 4œ†Óp(ïôs8‡s¿ÙFb$ÆßôCI( ‚Û‚Û‚Û`ž*š*š*‚êGãÆ¼ŸdT2*eAÌÄL̇Ä#ñOÞ¥E´ˆ±ÞöËϱP7²“bRLŠÎd¢™h&:»éHG:sºj¶j¶j–Ï0ž4ž4ž„Âqõ-ÖŸ£  8pà–n,‡tRú©ð§ÂŸ mYÆRc©±”=%ñ’xI¼~(ð/ô/ô/ü²yÈC¹Œô ‡ß$Љ‰‰‰‰“˜Ä¤ &a$Œ„‘Ï‚¾ ú&è›ÿÞnzÃô†ésŒ9ÆrkÄiÄiÄÉ–Él§r*§rÌ9‘9X¨ ‚ €RH…‚’!2D†À6š Mw§àNÁæ’óJç•Î+f¹qnœOÚ6š<š<šlæI=©'õdŸýÃ9Ê ‹½½"8 N‚\Ú‡Ú‡Ú‡€ùóæúL©Vª•ê§WºªºªºªDE5oÖ¼Yó&#™$“dB*|'|'| 9ät’NÒÉÅcÍ:j5ŒðC]H]H]\”ÃÊaå0 D ‘Bä¡Ï˜ãÌqæøÀ¬]Чìé‰w\Ä‘û/‰ôÿ¦HT´ ][‰"Q$*nûÂ/GÃM.ƒËà2„¿îv »fcðñàãÁÇ‘ t B'Ì Ì Ì ˜ãsø>Ò3º3º3:›ÿðºáuÃëDݲYˆ,¤h=Qe7 %B‰PžB?úÑÏÿ›C"0/hö‹²k7Ë®ÝSvíþ'ËÄ2±Ù•HCÒ˜ÓU\WÅñ¦2S™© †a†Á¤c%ê­õÖz«`(((uËËË?®žœœ<üe÷ËÝ/w¿ Øýìï)€¾ÿWIþn‚Âîàà›7oÞ(Ú.K—¥ËÒ(0jŒ£†5]˽–{-×–e¯;]:Ü:Ü:Üð­¾Eߢo!ÉŠNE§¢ü?Áï¯ì[ì[ì[ÖÑFh#´Ì„=ÞköÖú{.þÀ워·w;¨„J¨„¼7üâð‹Ã/â¼m…m…mÅ/¼T+ÕJµ;OlÙ4²Éí†é‰é‰é ý{{y{y{¹mÃ47ÍMs¢âââ½i-£e—ª6›¨˜À„àåÈ€}¡øßóü‰ývóQƒÔØòh%­¤•1=Ìuæ:sý¿´³¯Ï¾>ûºð¢¸D\".ažˆÒDi¢´;wu×u×u×ÿcè1ôzH­°\X.,§Ž“·Êhù#b¿Ó®‹]»yÈD&2Ù’’BRþ¡£5´†Öü-U¾R¾R¾’y"êõ‹úW Ÿ Ÿ Ÿg u&u&u& €ÐÚý9 KëŸqü/‡EEwIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-31-grey.png 644 233 144 6163 13755454063 15777 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü (IDATXÃ…—PTG¶Ç¿Ý÷ó-`#2€ Q+Q\ÑÔX‘Fƒ–Jâb‹>Ý¢ûˆàØ¡Œ!ê ¥DD_…„DQ!ˆD.⶘‚`(~ƒÂÎÀÌܹýþ`,«R9ÿtußÛç|îùÑ}.IKKKKKƒÓb˜hÿˆÄ?biߦ}›ö-óÖi‡´C‚™;sgîŸýMP *Aµ<Á\j.5—²L\Â%\")D ´£í€–)Ý,Ý,ÝLRøÇücþqÃ%2FÆÈØáÜt¯t¯t¯ª–ŒÝ»3v“AÁWð|ÉÛÓâ};—’Ά"¡´@ÔŠZQ+Þ·-F‹Ñs…¶L[¦-+è³ Z-ƒ•ÿ1½fzÍôÚòÿq>ç|ÎùÊ—¯_¾~ùz’" ‘„H€+_|¾ø¼Ós¯ç^Ï=¾ÎIî$w’÷Þ6 ›…ÍoîÀ›xoê'¨\'×Éu€Ä[â-ñ>Ycºmºmº½p“ú=õ{ê÷„ÈøÝñ»ãwóuʹʹʹ˜g»i»i» ˆ[Ä-âð3 ¥¤””¤ô‘>€è‰žèò3ù™ü °8ÇâÀÛvÚvÚvÊ`e°2óúÕÑêhu´é°ïàqðm…¶B[ñö ‹Î¢³ènë\'\'\'˜¢>QŸ¨':e¾2_™*®׉ëàJ«h­Â¬PPPˆ@-´ÐðƒüÃbX @œ‰3qPŽr”l5[ÍVÏ|ȸ!Ökˆ…xQuQuQÅBÆ]Æ]Æ]H—SˆSˆSȦÊY üçV«Æª±j€ð†ð†ð¬·:‰Ñb´ WZM«i50\2\2\4x4x4xuuu€ø™ø™ø€µX‹µûž}ϾH ©!5@çXçXçP“Y“Y“9ëi›Î¦³éàªÌSæ)óàÞÞÞˆõüÁÿ/‰î#î#î#È\¾4|i8ÉÁ0†1 'ZL‹i1ðë¿þðëÀÙú³õgëéôG ämÌÛ˜·(Òé‹ô³Ž‚…`!è»ßw¿ï>PÖ]Ö]Ö t”w”w”?pNÃg¦NK5K5K5$ÇÁãà£æQó¨yÿçsÊç”Ï)¤ÈÈÈÀ$žO‹§Á;4Tkª5Õ`¹|¹|¹HMMv}¹ëË]_   €ñkãׯ¯þäþäþd 7'7'7:1tbèàÒçÒçÒ÷\êœÀ œ˜IÞaßÁãàãñ >Á'$Ñ"Z4³]JêI=©ŸÕy7ònä]@É”LÉ€¶mÚ………€ß¿~ §§§à•úWê_©N¨N¨N¨€¼¨¼¨¼(Àf 3…=ÊÀÀ4¢³öéûô}ú>€‹¸ˆ‹$çTœŠS±«ã+ÇWޝ$K…!Fˆž?ÏŸCB  Ð耩µSk§Öå§ËO—Ÿºû»û»ûu¼:^OâI<.‚‹à"´¡ m¹@. {™½Ì^~ô žàÉÌñÅ쫜±ÑØhlD7¤‘4’]¥²S²S²SBV·W·W·»Ú××àU¼ŠW1i­µÖZk_îürç—;ÀÔâ©ÅS‹Ø“±'cOɽɽɽ@ëë­¯·¾<|çá;ß™œ‘´  R"%ÒÙeq¸GÜ@€“=Q=Q=Q@WWW?N˺eݲn!‹G4¢~‰à#øˆ“GªV=¬zhSûùùq=nF7£›ãW W W p]Ó¸¦qM#…(D˜Ø6±mbÀoà7ðùNùNùNÀ‰Ù¢I¦É4 {É^²÷¹õ;ô½³ð¡ð¡ð!·Ýztë‘J"Ö ÑÍeï}×û®÷ÝOi‡´CÚWÿ:ºwtïèÞ÷{®V^­¼Zi;˜`H0$¸¬íÇ·ß~ækÊkÊkJHu©ºT]*`ó³ùÙü€ŸŸ è« ¯‚¾Ø8gã9KÎ’³€¹ÇÜcî,[,[,[f3”ì'ûÉ~HKW•®*]%šô¼ž×ó´N¡Wèú_wXˬeÖ²C_c¿ûíØoêQú—³%C’!ÉÐ}ù³âgÅÏŠÆG܈¸qƒElrÙä²É…Ü}\ó¸æq Øàƒ ~¢LP&(Ÿã>Ç}Ž”RJ)ðbÕ{¯÷^ï=@øHøHøðoðoðo€©ÉØdl2b{[[nÉäò©·Ç8Æ-ߎ !¨u/îîîÂéH>É'ùO·B9äß–”KÊ%å±+{'z'z'˜ÎsÄsÄs„ŒûEùEùEÁÏ›óæ¼9HÜ»v? 5d Y€Àe\Æe6Ø`”[•[•[FFFŒO(& Ì)8Rp¤àˆPgK´%Úi$g䌜ñpŽ𲑉Ldòóímž-dºoäÿI²I6ɾ»Ÿ†Ñ0v¨pè· oÞ*öT•AI"I$ ãâÇâÇâÇrƒ{°{L`F1ŠQ@¬«Åj˜í!w-O+O+O³KKKæ³¥þR©aÆ¢ÌE™‹2?¯F:Ò‘N® èÖ9úQgô¡}B ’„$R\\\’õ®lllOaÆXèXèX(o(N+N+N³t$ ÉB²æ™;“˜à¸LÅTLF=¨õ€ôA׃®],¢¾¤¾¤¾„ËröröröÒOY ,–‚äO[Ò[Ò[ÒÖźXÜìv¾q€šìc‘8Gœ#Î[Ó@Ó@Ó`I²$Y’’?uvwvwvTÔ^Ö^Ö^ÆeUl«ØV±E8ŠAÌóÅ|°éÔØSö”=¦«“¿wýÞõ{ +—U.«\7çAçAçA@\)®W&JÏÐ3ôŒ~Š^¢—è%.Û^koÏ\@Žò³ÿ’8N8{ˆ¸,T¢•¶ƒ$”„’Јw§9ªoZ÷Y÷Y÷‰ß%îw‰4lÉ™%g–œÁf±MlÛ  A4ˆÁ,¤)B ¤.\°-\5¸jp×![&[&[–µzºhÕ‰9bŽ˜ÃgÛ#ûߎˆeddddd`ÜáQØfrÈž»í¹›MΑsäÜÝ’é&âP)âxúE™µÌZför ¹†\(ìUÿÔቪɪɪIѤÏÑçès¸ÙQÙQÙÑ–rs¿¹ßÜôóŽ;6v@µ}ŸÂ8ÛM¾ /¼ °+ø·=woß¾|#ë]Y¢,Q–X˜1¦S©xõ´ki×Òlí´[³G³G³òjuµºZ‰Q´)Úm€¨Õ¢úï÷ùüN~çäÿÿÿ:j·÷Ž}œ|‘‹ÃˆF£Ñh4ìÓfæÄœ˜ù¯ÁŃ‹ãkÛÛÛ‚ÿÓÕúÞÃë†× ¯ó¸ah5´ZÙÿ6}ÓôMÓ7¶7žYŸYŸY¹$I˜$Löù,—å²ÜïË!…R®gúT_rDÀî(áE‚?‘?È]-*P [:+e¥¬TÓI¯Óëôú¿ü§¢¦¢¦¢ÄÅ’IŽ$‡¶rñ\<ÿÓ½€ë×®oÐtuvuvu’EOÑSôd—ízË쀦?â øy!wíÇ…-û±ûù²›ì&»kX«`‡cå>r¹måú¸>®¯ßgºóß7ж£mGÛ`þv}ŽÆròÏ8þøõÙ*Áw¬ŠIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-46.png 644 233 144 2452 13755454065 14675 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜßIDATHÇÍ–_HTYÇw´‡&KТ™²6–µÀÝ …^TZ¶ÈÑÊþˆ/ah-k‘!=X[ëƒ&,…R¤±EQC©[™¥ÕC䃙µ…Ä*ÕÈ:š÷ÞóÙ‡™;÷¶Kì>z_†ßïœóý|ïïžó›# ""sâ¿®LW¦+5»*ì|JaJáâ_cñ ´b­øqÌnžÝ v:í´ùÔŽ­qk¾s½ˆ­ïäYy™#vÂsÑsQËLJ tyéò”ŒXÜÐ Þ7ô—;®ì¸pùÌå3üÃ÷†ï¼Ë—vl[ó­õ–žS_ýƒ/3ºftiCàq{Ü"(dý›0ë×®_ ð:éu’r€ñ'àçò1ưžGlÇç[ë-=KßâYü˜ô¼ô<n nñžŠ-xzöù÷ù-ÞT8Â| écF™QÆ$¨^Õ €†vl[ó­õ–ž¥oñ,~Ì|úm¿ƒ)S†î‚qǸDÌ æ¦âJÕ¨jU æl3ÕLMT U¦¶©m ?Ôïë÷ÁüCÍT3Q`63ŤÑmtÊÒ·x_œ†¾ü¼ÃÞá±da#ÁùžI³Ô,e<‘YÅ V€Ú¬6«Í¶!¨¿Ïï³_LËHZ•´J< ^‚÷i³Òf™O`äÍÈûØ›‹Tñ©;Ÿw>ï|999P›\›\› ëF×®…ö`{°=@ Àñèñèñ(d]Ⱥu:]®N—­g ¯áu¶‹ó“,bv˜Ú½H/’¯D¤_ú%lܸí7|V÷¬îYH8…C"£ûG÷îy¿óýÎ÷;E¤Vj¥Vd¾{¾{¾[d—w—w—W¤õqëãÖÇ"ƒú >¨Ûzd¡P‰0=Η„ŸØfû½Î}8—Øìj;=Æ&­ÌÄš‰5k€ÐÜÚÜÚÜ ¹m¹m¹mv%¶vmíÚÚ>ñ‰O`SxSxS"I‘¤H’ã´júYý¬¥¯¶Ûü˜ŸÏŸJ»1(~#DÈȪ̜̜ȲȲÈ2Ç'ºaÞ0oÀHËHËH õF½Qï0ô”Ô§úÿ>•ŸïcºÕgÌÝænÆù™:@ÝU7ÕM „JÔRC \Ê¥{Ieª¹j.¨q²ÀÍh´Im«]å 0‰´””[J•d]Y" Ú„6¼Y^ÔÄuviÓD7ˆÝ-(›Hb†ØmKJÆd ÂlÂÚ‘‡E²ÄLAà÷p?ûbæ73»þÞ7¿œ{Îù~¿¿{rν""’ù $¸\ ©a;átl?é­¤·^n ÛW °ÛŠÿñ;Hû<ís€ŒÖŒVs,f[~+>>_$†ÏgíKºÄ6ì7ì7lžˆý ¼ûú»¯'ý"l7øÀqËqkQ‡ŠžŠ€›×o^ç·0óÍÌ7 žÄlËoÅ[ù^<¾|òü"ðRÿKý¶}­}­ìÈß‘¿«&ðÏ]PTXTð8ñq¢Jã L²ò!BXk>ζü‘x+ß³ð->‹?¬G`cÞÆ<x»ôíRGK8aì¯ð‘ó#§Å§Ý.pdÐCzÀøÀø€P>åÀ† b¶å·â­| Ï·ø,þ°ùßÚ6F•¬-Y èÚ}0‚FÌdí¬vMyÕœšCY’ÕûªT•‚î×ýº̇æ˜9=AÔVõ¦z¥®îY݃fŽhcZÔ¯ÝG{G{G̬”""¯~†î:‚¡5H¤_P`ø´Ú–¸M€@ŒTRIõH=Râö}øðÊT™*ø=ç9ç¿d0°¤þƇÀöÀv`É1é˜ ­±ôD„]‚ÊúÊz`À|C×>Ö>ŽýxsEsys9øÇýãþñO 'ÐèÆæÆæÆfNNNŽùnz¸éá&hJkJjJ‚‘#E#Eq'>æ#Tùaå‡Vi¯E„ÔRÓ~²ýd4ü”þ‡•=+{X)û®ì^Ù½XÁïn¸»áîЦ´)m ²f³f³fáhõÑê£Õ]]] m…m…m…°ûÄî»O@nEnEn¸Î¹*\ðwçн¡{¬X|fÏ—_|ù…%l¤6A$Õ›êýe–ìέʭŠÔWl-ê/|Ë·b?ö«cUǪDœ¹Î\g®ÈºÚuµëjENœ8-2¹orßä>‘mîmîmn‘¢#EGŠŽˆ,{–=Ë‘â`q°8(2xmðÚà5‘”ߤœK9'òÃWþqÿ¸Ø->®ç<Îy,Õ))æ(ÌOÍO ·½j7?5?•äPÇ¡ŽCà}à}à}·‡nÝ×V×V×V¸rêÊ©+§`çæ›wn†;³wfïÌÂLÃLÃL¸{ݽî^ðÔxj<5°ôÇźź¸1³îÉ“°ô$ˆ˜}fŸmT ½P/›ˆˆl”ƒ’!]z—Þ¥w‰P@"é}é}é}"ë[×·®o9Ór¦åL‹È–œ-9[rDºó»ó»óE²²³²³²EŽ{{{EzK{ßë}O$i$©3©SD‚¾ ã5ã5KO‚HÈòø¿—5ƒ¾AŸˆ<á×¶,•©2eÕ–v9írÚe‘źźÅ:‘¼†¼†¼‘ý¶ý¶ý6Ç€cÀ1 ²·~oýÞz÷ {Ð=(2wxîðÜa‘~W¿«ß%â|âüÉù“H×û;ʪló™ÿþºíë6‘¨žçºr5Ò%A}TuåÓ?=½øô"¬v¬v¬vÄJl›Ãæ0Ì—Í—Í—Ùd6™M°Ò¾Ò¾Òs-s-s-08eL0}vúÒô%Ô²-ôsèç(ÊtV¾RùÊs]ùêgà˜qÌ„ÖÀ„1aDy À€#ä=7Çâ&?%ö;`F'¿ßðv£Ê¨BãÏøðÅæ7馔Wy•¸I]@#¹ª]ý¨~D©ïŒ #MÝÐôà‚…_’X’,?7ù_Ø»ò…}]¼°ï±óû_pªÉæz8îoIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-154.png 644 233 144 2633 13755454065 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜPIDATHÇÍ–ëOTGÆg7]Œ51²!±ÆØnˆJ šj³ÖHÅX/hLX0bJLð‚ZRi㕆ØÒ J5LQ#1\Ã%ý FªT0¨å²"(² Ξ3¿~Ø=œµüÌ—Í{{žwÞ9óìBæÿ`¶™mæÉ>Ûü­áŸ¸|âòOJ}v ¦5¦5}Sò§ä„‡k-†­ÇõüÀz! ü@>Ý/„á--7ÅùíØµ!jâÇ>;×–*KÕ[/¤^N½ pñÜÅsìwƒ» ?®? [ëùz½Žˆ/rþÇ/WW›žAhHhˆ¹,rÙ¬ï| OfÁª„U AAÒ j/`Å*ã€AÑW_€­Çýùz½Ž§ãë|:¿¯Ób§Å «7®Þh9ã+hùvGìŽÐù”*à0‡±‚wÐ; &©I ƒtI&L`Øz\Ï×ëu<_çÓù}ýˆÏö築!‰!€@©µCím¢’®¤£ÈvBA¨»ÕL5T»jWí nQ“Õdà ³xt’R¦{½(šM V‚G7\Ï¿ë”u ýüÆQ !ÄÜ_ðZ:,ƒ -¬- ¸ À Õ¥D*‘¼ã:t`¬§<å)àÁƒ'À?Ì0ÃöçÄr‹Ì–ÙÚ3íïxëÇ֡Ö!K¥gp‚Þ¿±‚;°={{6Р͗?*{”=ÆŽ)¤hv6;›oewewe78W:W:WÂéæÓͧ›¡/£/£/ÃÈk¯o¯m¯…ÚuµµÈÑ@„¡í»¶ïÒ¶àŽÙ7·˜+"ÃñÜñ\.„¦h-D^“×ÄHÒŸIuIu”ª¤™ÒLBô÷÷ !wÈr‡i·Òn¥Ý¢ÆZc­± Q_X_X_(„ç¥ç¥ç¥]©§R‹S‹…8ôõ¡Ù‡f “ß="S}|âG¢#QÏŽ¹"`rÝä:YÎoÝMÝMÆG>{ïyï Ÿ^˜{a.Øl ¶¸}ðöÁÛ¡%²%²%Lv“Ýd‡„M ›6AQ{Q{Q»“{6÷lîY;ÅN±ÖV¬-_[nĵ/õOÃ=Õ=ô~„O Ÿ¤=‚¾®¾.àšïÚË2í¤vÒXÔµ¨kQÔ<®y\ó®¸þázHq¦8SœPê*u•º *(*(*¶>Øú`ëˆÍŠÍŠÍ‚½9{söæÀ’Kf,™aàJ·_f~íÛ×·ô~Œ‰yÝóÜó€ëþ‚'Úyí¼-¢E´€›/n¾¸ùšlM¶&dödödöyñæxs¼ìyö<{DTDTDTÀÌ×3_Ï|mhÀ™¬"G‘#`rÖÎØÎØ&&„w3¡l l¨)Lõ^õ^5î—£ÁÑàh€ûo쿱†. ]º Þ,x³à „U‡U‡UÃæªÍU›« ?¸?¸?Ø Î_š¿4)8;î9îÜá`?_AÙ±²cúÇ7sì­ñß’ï#ï#câyGŽÂÈñ‘ã#Ç Bå”rJ9½szçôÎ-_Ë×ò³†mÃÓ‡§ƒ'޳ͳ Ú í„.KÚüQ~?†Žaq[܃ UmUGñV€–¬%êŽÑi£l” ãe¼ŒðÇȲD–ÈCò•||Ãk µ…¼ã¿ÍÚfTK§¥sŒŽ(?‰¡‰¡€~忯ÞBÕt5…\¸tèG8²VÖÊZ ŒJÆ Lò“Ú©v¢ð‘·ÍÛ6:ïzÔÄ Ä }R(ÿ¸ý¯·¯‹qûŸ/ØÿÏåQ)ÓÅ|ÜIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-136.png 644 233 144 2745 13755454065 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜšIDATHÇÍ–ík”gÆÏL2ÇÍ‹)³º”g‰šVÓBMY„ ´ †hu²cª© ÖØ Œ Ú5KõC•’ÕÕ’Ò€ÛJbu»B‚‘¾-R‘ÔI-mßRRcì6Í B6ÄMf›83ÏóÜ¿ý0sÏ3nÿï/Ãy»®ë¹çÌ- ""‹R¿N¿ÓïÌOÚÎݶAÕ‚ªeÿHÚ'Mplvlþþ ¼_ð>@aga§õƒmë¸ÎϬ±ñ3ù´_‰ípw»»å)ûm¨{¶îÙ¿MÚ€ç‚çÂ/¼öÉkŸô|Ôó{àþ7÷¿xPþ l[Çu¾®×x™øòöÿñ‹€ë ׎pç¸sD P¨, 'îAõÆêãYãYÊ æ¿\rU9%Š>S¶Ž§òu½ÆÓøšOó'õx_ô¾(5Ûj¶y:’?üZ|->Í—¸¼Ã;ä‚5¢æ+æ+Ä@ET°m×ùº^ãi|ͧù“zäÑÞ_‡ªÍ©Í €ÄU0ÇÌ1°~“'Â$ÔwjVÍ¢´dkÀºmÝcÔ5FAý^-UKÓ7ˆÚ¡ZU+ʸ/Ž“°Æ£‰Ñô_%¶%±%X)~»•""O¿‡áóŒE³axÑð"às^2#‰@"À=ÜånaLÅT 8ÂŽØ~&˜`Ôu@e¦òôy×Zc­aŽI|~røI`Þ3â‰fk=)a'û ùPó!à€õœ:œx#ñ†­ãÔ¶S›Om†[Å·ŠoÛ<Ú>±öÄÚkaèØÐ±¡cvüÞ’{Kî-ã§Ž·o‡kºvøÚaûÆ“¢­çøOs¸9¬[{²/%ìú~ÂçÎ5¤Ów‰­Š­"Vÿ]}o}¯Ýð¾}7únÀPÇPÇPäó‚yA¨ ׄkÂPT_T_Tý«ûW÷¯†Š¶Š¶Š6ØÔ¿©S?”6”n)Ý·wýËë_Ó|VìãÉ'µ°ëû"ù_åµz<õBè…Pª¿âèPgù–oÅ|5 †DüëýëýëE¤S:¥SdváìÂÙ…"¡ñÐxh\d×è®Ñ]£"’@I Dä|Óù¦óM"#F6Œlñuûº}Ý"U¬z¹êe_ÞÒÒ¥¥âÖ|gùºòu"i=P˜W˜g ÂÔÄÔðÏ䨫sV›Õf·¤¬±¬±¬zœ=ΧíŸÞ=½{z7T¶U¶U¶AYAYAY´,oYÞ²VºVºVº }gûÎöPÔUÔUÔŸ;?þtÚ^3Ö3“…“… õ8E¬Ï¬Ïƒb"â¯üA ¥PÒg><ž‹x«½ÕÞj‘3ÖëŒ%R7S7S7#ri諒—öŠ˜½f¯Ù+2èô úDW,®X\!²çôžÓ{N‹äŸ?? ò/ã§;?ÝIÃ{Yßß/¢õ8E¢åÑò›ý’}%r%""ó""49Ö¨'Ôו999"³f=ÌÙztëÑ­GE¦]Ó®i—ˆwŸwŸwŸˆßô›~S¤k{×ö®í"À@`@$·9·9·YdEÊÚµ"¯ºnüYãÓ”uùë7¿~S$­çWSOMɘ1h ÚS9óîLëL+ÄÆÆÚ­ŒãÁx&Ý“îI7˜3bFì¸5l [Ã0õáTûT;˜­æYó, ÌCæ!`0ŧùʧßÏ}Ïýh6Ü5ïšiÜ—Àj°˜ã¿ä>Èø‚îp¥®šÅf1 þfî0wdl~³6»6[ßÔ#›ÿ±ý¯|l_í{ìñ|Áþh[À[]oIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-146.png 644 233 144 2637 13755454065 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜTIDATHÇÍ–ÿOÔuÇ_w\w܆(M·$®›Tæ¶¢%N¸Nml©ˆŠ’?Ô*ôýBòKùC`ÒÔ¹9[·’²ÉÒ‰Ìáh¶kµ9†š ››¡‚LnwŸ/ïG?Ü}øœñøúåöúú|}^ßî- ""KR¿NŸÓçÌNòÎlyfifé‹§“ü ÛÛÿü·,nÈiÍi5‡lÞÒ[öéþ"vütòdonBU¸+Ü€ EÀ˜4&ÁÌÒ>Ñ>AS*¦b(þGª^Õ«z0›Ùfvš¼Z5«f”>˜X™X‰fNjkÏp„øNm§˜)|»•""«¾A÷Nz'g]0ºdt Ð ÀÛÆͯù™£—;Üa!­cë@UªJU™&÷àÁê/u[ÝN“3KÌæx9FsGs˜wÂ;1ë²òI%vâW¨=P{x`¾ªµýÚ~ûÃÄkÂ5p=p=p=°0¿ñ‹ãÇ/ÂåØåØå˜-¿uäÖ‘[Gàè±£ÍG›áêGW¯6ÚWñ$ÓµuµuVkOüšJl žºŽšŽšyó÷õ¯âñâUTõWõÛ ï]Ó»¦wÍÂÄ6D7D7DacîÆÜ¹ mÓ¶iÛ`m×Ú®µ]PVUVUVÅ5Å;‹wÂõç. \"ná™ñS÷Nݳ¨wŠdÿ’ýËk%òJ ¥ú+ŽT;¿ó»x¶¾·5´5$âòù‡D´:­N«“y:\}¸úpµHÿêþÕý«EVì]±wÅ^‘^Õ«z•ÈXÿXÿX¿HÞ²¼eyËDJ·•V–VŠä-z¡ø…bñXxgpSp“È|>³(g‘…©¦þ~N®½ê0¿6¿¶+RÒXÒXÒ}7ûnöÝ„H[¤-ÒEEEÐàjp5¸`Ëý-÷·Ü‡öòöòörðûý~¿ŽÇŽÇŽÇ ÿLþ™ü3ÐíìzÐõÀ>3f὜{9`åã1/˜Q1ôÍúf)‡\“k²TÞɱ+“$‰€HÆhÆhƨÈpÓpÓp“ÈHçHçH§Ètëtët«Èô¾é}ÓûD¤A¤Ad¹{¹{¹[$ä yC^‘ðŸáá"cúøóãÏ‹ˆÈzY/Ky)QŸ¨1×›ëQ{Æè˜é˜~Jöœgõn½Ûšú‚¾ ºvì>hWÒ(2ŠŒ"h ·„[Â888ië÷ôìéÙÓY’%Y»Fv î„GΧœ²gŒ¬ÓæiÓž±…[™HmɤÕ£öVΛiži†D$IDÜ÷Å}ð¨ðQá£B[nö™}fL}?õíÔ·`4íF; ŒÆ šÂ³ðŸÜÊU߀÷®÷î¬ FŒc>îÛ`Ö˜5Ì%nâ‡@ETDE€ì` ££ƒšPj”ÓÔÍ4_åÓ?Ó?cN=ž¿c¯¾Ìyo{o/¸ci—Ÿ O…0S—cÐå{–Ý>Ï·žoÕèÊêʽ2Üðçµû×îWíàió´AÀÁf6C[öUßUØe϶gÃýÉû“÷'ÁYæ,s–ÁŽÞ½;zͶ,mYÚ²ÍmÍmÍmf¼ïvßí¾Û°1ccÆÆ 8¯Ÿ×ÎkùàÍsožƒ×\=®_‡¯ôÏâ â T»EþÝÝGŽt[_X_ˆÄœ–ä™){r(áP‚ˆ½ÁÞho™™ž™ž™)Œ+Œ+ŒyYÿ²þe½HÁ‰‚'DÜ{Ü{Ü{D¬»¬»¬»de¶¶¶‰@äÖå[Î[NÀCD®³ 2#ó<湈l²|dùˆ‹hz§ÞåK°(X$"¿‘õqðoÁ‹Á‹"Örk¹µ\d®g®g®GÄ1âqŒˆ666‰¬›]7»nV$Å“âIñˆ(¯ò*¯ˆë˜ë˜ë˜ˆã¸ã¸ã¸HWEWEW…HÌHÌ͘›"wKîÍÝ›“õ"ÖI뤈*Ò,š%ʹüµ\ûòò——!ªê£0Ý8Ý8Ýj«Úª¶‚–¬%kÉ05?565†ÒþÈd›S‰»:µ:uõT²âc^›×o…¡…¡…ýý,é—ôK¦ñI$Ú§ö©}«ü*M¥©4à0‡9¼*îQå§6¨ ªD•°¨2Ãüê§¡Cló¶y¿•ü‰ "ΫJ£K£Mç'6ô,ô hѵEÓù9Mu î©~Õ¸pá~fŠ)Pn5¨©Hýßµymž ºþRÐl8©µÔ acZíü¯î·ò•}]¼²ï±Wóû_fû?ø6IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-88.png 644 233 144 2430 13755454065 14677 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÍIDATHÇÍ–_H•gÇçØñO„•£‹JŽk™uFÁnÿFbbta."Ä &A4FÞ´ÌY¢“¨ÄiD­?¶.óO#/¤d ´V0¤òÂmfÒ缞Ï.Þóž÷ÝX[—>7/¿ßï÷ù=üž÷‘e±¯€wµwµ7Õ²½Ÿ9þäíÉÛ³{-»ÃÏ.Ï®Ÿ¿€¥–^X~yùes±í¸ï®qðÝ|¶_–‰ãHºžtÝS³OÁžÜ=¹É–ýÕH¹•rëî¸p³ëfµ0=:= 0[0[ŽmÇí|»ÞÆsãË©ð‹€ïžïžçWHJLJÌm™Û²ê¬„çYP¾£|ÀË„— Ê Æ °„%ª˜g{ýæ²íx,ß®·ñl|›Ïæ·ôøóýù"P±·boÊ%«`â[¨_U¿ÊæÓnM4±ôy}À¨2ªˆ€z àÁŽmÇí|»ÞƳñm>›ßÒ#?Û³ÅP™\™ (í!š1d ˜ fš©©l•Ò§ôçúsPÙ*KeÅ;†ùÖœ3ç@ŸÒ_è/@}¬v«Ý(0ϘgÐøÓ0\ø6_œ_܂ֵBÊtÊôü"xf<3€0¥`ž5ÏV:ñð%'8á!Dˆ¨<•§ò€zèqÅ»¹ÈE Ã0Oš' ±ñc|q~KOLXÇp°á`C|ßAfõ)} ð$hí Ôê õBs]s]sLvNvNv::ž”>)}R ÍÍÍðôôÓÓOO;qÕ£†Õ0ÊuÄ_œßÒ6þ9\»:/ßo~¯Uj•±}ãMãMãMèt:`çí·wÞ†œîœîœnè‘éX\\„ŠÄŠÄŠDl l l„‰ê‰ê‰j—Àí†vÃÆWû~KÏ"‘ÔáÔáO>É/Ê/‘ÇòØsIžy•W‰H™uäZP jA‘HM¤&R#Rt¬èXÑ1‘Ws¯æ^͉¼¹òæÊ›+"ÑÌhf4S¤0Z-ŒŠLú'ý“~‘ðšðšð‰/¾ó†¼!IòˆTJ¥ç’ÃoéñŠ$”'”“#âëóõÅë~—qy+o h8ކE¢‹£‹£‹E 8$"ýÒ/ý"F­QkÔŠDò#ù‘|‘ûC÷‡î‰Xqòâ+ ÅRìâ‹óÇô@êpê°ºÓ›§7;­6 ô$=ɱÛµ=j{[·4nitüyçòÎåƒÜöÜöÜv(YQ²¢d…Ϲ–s-ç´njÝÔºéýø¿¥Ç+2_0_ðã˜ÈÈàÈ`¼Ñ5Þ{Ò"-µ=ûFöìÉ8Ÿq>ã¼HZIZIZ‰ˆ_ók~M¤o´o´oTÄ—îK÷¥‹¤mHÛ¶Adíݵw×Þ©êªêªêræýFê¥ÞƧÆáéyïTÚS3Æk^;S©×ëÇa&}&}&Œ­ÆVc«³o½L/ÓË\ñ#Æ㈫1?1ËìOåÞcíf;aõ+Y *Yy”Ç5]ÕªZUƒ9fŽ™c ŠU±*vÅש€ €ú>³Óì$Ì»ºÇþåæ'v3ëÆˆ1`5¢q‘‡a€í ÛOëáýcïXpvÁÙ˜ßÂæºYŸÚ/bñ§ê™yÉ+‘~-ýšÍ›À°eÅ–sÇñ¸n¸nü­Ce{e;@ëùÖóÔ@ðAðÀ”wÊ 6×Íz³ßäKå—Æÿè‹€£ÃÑatgºSÜŸ»?_¶;^0´ ЋЋÆçŒÏQv0^d(/&Œ“)Ø\OÔ›ý&ŸÉoê™úq?ÙŸf*%e%e®3ñÿE¨û îS/z8Ä!2@ëa£Â¨ ʧ|ذ…Íu³Þì7ùL~SÏÔû‘ïíÑÏP¥ÎR' Dïƒ1fŒ¡¢Û¢Ûˆò JSè³úý åF¹Q†Ý°6P_©ê¨oÔUu¥÷k«µÕDU­^¨&ð}f6› ÓàÑÏR¶RD$¿Ý5æ §A +üÀ&ÃuGÝÌp›qƱBG›OÄ,³Ì¦`<À²ÈJÉl|o|Ï ùq~|ø˜u »†Ãi¦Ÿ„±÷ ê몯)€ØJõmtt’N|yrôä( ËÎ/:¡¹¡¹¡¹N‡N‡N‡àÂí ·/܆ÀÁÀÁÀAñøGüÐ2ÔÒßÒ##Ó#Ó¨$q ®—ÔOøIëÝÇþ¼5Y¾]?ñDÌö±}lŸÄ>>>ŠæÍ7?ÜüØòxËã-œ”œ”œ¿Îý<žçóz¼>ï÷b<$¬ Ö£NÏ„g³ž>¡ˆüˆüˆ|eÿÉë'¯Ÿ¼®Mw ¹†\CDˆ1Ž1Œa @zÐèºÏÏãy>¯Çë÷‹:ñb|d~Uèú…þž‹¼@J[J[J›œÔííöv{Ñ ŸhqZœY)QJ”@IT•D@ÉV²•ìÝççñ<Ÿ×ãõuÀAýͯêИٙH*“ʤ²ºox‚µÂZn-—³u`ïkǵãpÉuµµ€Öãíõö˜Pj”€V*‚eBQGüñr'É“hï«Cê\<ÌZa=l=,góþÇG†>CŸ¡ïWËy€¹Ô\j.Õ¢Oœ}Î><õÕq)Ǽ?xt ð·Ð¿ÊڀĀvB;8„Cÿ¯“«åj]u9ŸôDõD᩹Ôüù-šãáøDAA©ß£µkíZ»ÙRYn.7SGÖö¬Y;ØÅ!7ËÍ&ýưܰœˆ&îß½—ˆ^iº×tˆ¨¿³¿“ˆhAï‚^""ÃiÃi""–Ä’ˆˆîK÷%"26}×ôMôwôw ©QqQqDŠCÌ³Èø³¤Yf="ÍøgãgÆÏèÑÅ;ï\¼Ã6Nâ[üÄGm0<6<6<ÙÙÙ€! AF$ÿΗw_Þ Â-á„?ÔH› Ú×Ú×p%÷J.°6Ööñ®Õ½«{Dº<.>Yy8s(y(àx8>ô›*7UnªÔÆ•nïAïAƒÜ´¶lm¤¼•òVà!vÆtÆ“‹ ÎÄœ‰€g7ž€Õ «‚â·vn ˆüäî'w¥;0ãÇ'ø®TŒ!ÃaÈÐ „j¡šˆfsSúœô9DD¶¯l_n ¥V© Ò³”,"¢4-M#"² ØýêYõl€:ÕØll&¢OƒÖÑÐ`h04èWžïW-oUͪšU5èr37s3hD#4üZû^û>ð2ȯ˯@u[u€e¦e&¸—º—ǻŻå'â=–é–én»+Ü€?y#yVʬ”Y)³ÐÅñ‘-d ÙÞ}†ŠS…§ OP`*ÿøøÍÇoð$ÜN¸ Æc T6V6€wŠwJ À¾ê¾jH¸—p/ ^®´WÚ@¾'ß”3jŒãïwµêjÕÕ*ýÜÍâY<‹÷þHâ q…¸¢ø(_‘ ̪YU¢œ¹ç:Ïùׇ–önÑ»E`>d>@ë-ï-æ*s•ê;ÖïXæts:ôVôV÷¹×€w®w.<ãpÏwÏb‹c­±VUĹâ\qîÇO),#,#,ƒHº&]“®Õ÷ë ?'ëXÖ1¥pÕ¹êÕfŠ4E‡P 7¾a|Ø%v)ð2U™«Ì°pñÂÅv—/þ©°_بA>¯û¼Èo/ÚV´M׈bÁÝ­“ú´Aü„F|hˆ—¾•¾½1M¾«$*‰ wÙJ [ [‘^ýûœÌœLvM  >P Òˆq¶q61z&X Íð&{“‰ˆ’×$¯!"ê~Ðý€ˆ&†[†[ˆÈ(\®©ùj‹ÚB$žžaša¢çö±®õ]ë)wûŒâîânj޲\–ëY‡èÝøe.0€¿ïöoé÷k;³3{z-«g¯±×"Å¢Ô=ŽÖ =zàй[¤îRwœ´Á¢…¨iš]³ûyÒ_?xvð,9uQÆ¢ ù·ú$Ks¤96«>»lʦlÉ즅,d‘“ìd'Åv±}ÿýi­#DÙä<Øéîtr×›êMe©²€¦eiYÆ•f¥€C>'Ÿ´­r´ €T¤ÛþövøÛáJ‘þ¶INÉé82oï¼½óö VÁ*XÙº÷8ÌW|·Š]b—ØÅš¢Dˆ>@dÈ7äòGtîZ¬«E)âHU›jSmðÀF0‚ÿ$•%Êe‰¾5+kVÖ¬ÔÒô·Üd0LýîIÝ<5˜Šì…HWÙ—Áºyª!Þoˆwžá l%¶[‰–¦oW“l’M~@ê€: ø×NÇäoÇ´ŽiÓ:´Í¼Ž&„ aïü.¸Ÿøa>#½Ø Öpw;Ûž¾™Õ³zVÏ÷œºÇÑêhu´ú¹+·Ê­r«Ÿ¹Ïç=Ÿ÷|°ltÙè²Qe±ÎűAl8žÌ©æ£^(Àôñð~ܭ2W™«d“³ÞYï¬àŒr¤¶&[“­É¿v¤Z©VªíðýK2í¯!}}všþ2€¡ÂÞñq÷/ÿ‰»©R7¤nðsבìHv$ãÓI¿¦ŸËcy,/½8¸0Ò—Ñ)/ãîZñ¨xT<Ú“Èç•æ•æ•jŒ›ˆ›ˆ›ïèG=(Šƒ¶ª£:ª#ßÚ!ýŒô?J(wë©l'ÛÉv´ŽÖÑ:õÂ|a¾0`Ĉѕ/#Ç#Ç#ljěâMñ&»ìKÜrrÿ71éŸ2(ƒ2¤o‚Ýß4A´É‡•]úÇÏ'í‹!'ÓR÷¥Gý/ãTë–_äIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-46-grey.png 644 233 144 6201 13755454064 15777 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü 6IDATXÃ…—{TTåúÇ¿ï;›¹â0€¦Øxa.bGðà…„ÀŠS+¬&S8‹eJ…?<./e‡R!p­#F ä¶:^Òä"B Ï¦Ò¤£ÄÄuÀð§9 Æp.3{ö{þp6¶<«užözßý¾ÏóÙÏóÝï~6IKKKKKƒ÷ÍzÿB#¸ëÜuî:«O;™v2í$›—q'ãNƵAÌ“y2ÏCoò>¼ï³ìéêéêéj–…b£˜¤"Ðntxoà –%‹“ÅÉâH*w›»ÍÝþw1&Ãdø¯EésÓç¦ÏmìÈLÌLÌL$Þ—÷å}Iì}ÁèâÒÐÀXô´!d‚Ñn³Ûì¶GB3j2j2jNØ-v‹ÝÒpyâɉ''ž\öŽ*O•§ÊCí²˜e1ËbHj˜[˜[˜êêêˆcñ¾¸^Ü/ú›ñïŠ'ÆyD>ΕÁÕLÍÔL-$-d Ùâ›'ñ•øJ|/”Ø>·}nû|±—wƒwƒwƒswLwLwL7u›‚MÁ&ò¼,U–*KÅÞÃ{xJL`6a6˜ù˜‰ií´vZ‹çM-¦S s444»ï=sï™{ÏĤôUú*}WÊ[œ[œ[¢óXKbI×èj²ojßÔ¾)-hA‹vWÍUsÕ-gí“öIûäâ?éÖèÖèÖð+ Û Û Û¸ÓšQͨf:ÌÆlÌÏü˜ó‡ô €;Üá`ãàø¤—ô’^ð†ÀYÕVµUþŠO*>©ø„Oèoîoîoæ.IR…TñsÇÇñqOmÀSx OÝ£ŠVE«¢p›ç6ÏmÞß.NÔMÔMÔ-þ“Π3è üóI‰I‰I‰Ü%R£Ô(1[¸,\.؆mØ¡E(@TDET d ÷È=r Q$ŠDÂna·°œSî”;å€Ç+W0[ô¯{I÷’î%þy1¾È#òQ~œçÇcCíUö*{Uâ¼ ÞoÓÎÎÎp¢FFÙcì1öÔ4œ†ÓpgpgOâI<€¸x`ˆ@€v´£ ïÓ÷éû€dJ2%™ØOì'öÔ¢ÃÃÃî´÷:ïuÞë˜^äù( `,àƒ—‘ŽHG$u5êjÔUÄhŽkŽkŽC*£`„š|C¾!ßÌÄL̈¥î7öûÀPÑPÑPÑo@0ÂLÅOÅOÅíÚvm»èRw©»ÔkbM¬ `…¬B­9¬9¬9 iT{T{T;bD‘òz^Ïëÿø–ççç²–D.‰\I \á¤ôgú3ý`,$˜“`àºÇuë@Þ§yŸæ} ôÌí™Û3÷§Õh5ZÀѯ~}ôk ¼ ¼ ¼8a;a;aŽ8 ñˆŸÙ&]2¸dpÉ )yD>ìÙ3²gDÈ:½òôÊÓ+™h6a§°SØÉ“39“Ï̳áüáüá|Æ>Ìÿ0ÿÃ|ÆÞŽ};öíXƾ/ü¾ðûÂëʤeÒ2)c¹4—æÒßì¿4|iøcYáYáYáŒõöö²‡Í&òˆ|’ÕÂjaµðÁ¶GsÍy4Áê`u°”y3oæ J²I6É …R P^(/”³Âf…Í ø >ˆËËË€~ üø›77n¼¨õ¢@ÏÉž“='Þ5½kz×/ð/ð/ðÀ¢òEå‹Ê¡^¨ê¢'z¢í˜ê˜ê˜½}ùöåÛ—É•øH|$>¬ltùèòÑåèã“ùd>RFÊH˜xÜÔ¾RûJí+À¬ŽY³:€„ä„ä„d€?Æã²u²u²uöb/öÖýÖýÖýÀÌ™72ö:{½X­ÖFೡφ>îÕÝ«»WÐXKcÁ\خڮڮ¢ê¨ŽêX•g˳åÙ|nßܾ¹}sYYÛXÛXÛàÊääXÿXÿX?`¤Fj¤Àè†Ñ £€ÊîÊîÊn€]cר5à"½H/R UÕªjUšMŠ&^‹y-æµ`óË›_Þü2àÈrd9²€®w»ÞízwF£“æõæõæõ€ù–ù–ù>”÷Éûä}|.…Ò‹¹4.K#©›75nrêFÚFÚFÚ T„+Âá]Û·¶omà§ñÓøie¶2[™ ÐfÚL›Õ—ª/U_>×|®ù\æµÏkŸ×ômìÛØ·ñÁK6828288Sœ)Î@³Q³Q³Ó®ÛÊóÚóÚóZa131ãq'q–Hɱ'Ž=qì àNóæ;ͧþß–lK¶%ÿYë¿Æÿ箤íIÛ“¶KrŒ`c&˜`‚Ì¡uhZ`ñþâýÅ@\H\H\°jþªù«æƒo¾9ø&PRQRQRŒ;?vࢹh.é é é3è :ƒ¤òPå¡ÊCÂÄ¥¡KC—†¨R¹J¹J¹ª}ƒ£ÆQ㨠?JöÝØwcß WpW=âfq³¸YŒŠñªñªñªÅIÑÚhm´–=[[[BþÉ7ò|#˜$V+‰é´uÚ:mÀœ]svÍÙÌÉŸ“?'ÿAm³m³m³ó´yÚ< ¨¨¨úúú˜ø±éǦ›°þÔ‚S N-Ày¥F©Qj¦ža&a’eëˆ@v&SZL‹i±¤•æÐšsk»`Ì‚y‹]ùò;åw@‹w‹w‹7{ÂôŽéÓ;ø‚[Ë­åÖbK±K Y,HÌ9<çðœÃ¿9ðŸÃsxPTT–†- [68:z`ôÀè(k;k;k;yt¡t¡t!@î’»äî^„“pÞ™Œ\ä"—ÓºÚZìGUÀøìÀì ÕA•A•A•¹ëäoÉß’¿õEæ°×°×°g­ð¨ð¨ðpî’A"0³8‹³&1‰É¼l„°0ZE«hdßš¿5kfO_q¿â~Å]’«R¨*ÅÍ){©½Ô^ºç`GzGzG:ÀÌÌÌÌðp¹9!‚N¸®¥‚»à.¸Ã£í—¶_Ú~ì;ì;ì;öTyªL¦£¿ºâ½ ~¡æ’àw,22222¼khbR&eRò–Ç-[Çß /ó2½L/Ó¿rônôÝè»Ñ^•ÖNk§µ“n;Ñv¢í„sõ¸cÜ1îìp‹p‹p‹x[ËŠX+:S dIúñ+~ůÂ|±®Dñóüûíf õ¨w¦³jVͪ#{é9zŽžû—~êÅ©§^w+p+p+ ’$I’$©©Ùïœß9¿sk#ͽæ^s/ùJxDxDx„•¸üÖ¸'~ƒâØCÚuÎt¤ )Ü¿I"I$‰ýX=«gõݤX¤X¤XD;%’ÉÀ­EÂ!áphë/]º6tmîBïòWú{¥~Øþ:Å!Z#ñ­0IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-14-grey.png 644 233 144 5701 13755454063 15775 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü vIDATXÃ…—PSWÇ¿÷¾—Ÿ(°Xª%ÕZYp‹‚Z;¬‹tlÚ±Õa:B·R쎣¶•ªBÛ-Z¶:¸j1tgµXëPÓ”ÒÁb5lÇp©nÊÏ€À€c$yïÝýƒZZZ/n_Õ±ªcUõ-°.°.°’5ªUªn¼‡÷ð´pà 7€×ð^DÀí‰ôDz"±Æj±Z¬æû.ö»Øïb¥í£«GW®~õm”6JµT-æˆ9bÎÊr–ËrYî­ ôY²gbÏÄž X`‰œÉ›xo²œöŽ{ǽãOþQ¿\¿\¿\H1l1l1lá¿Ð9uNzÌÂ,Ì‚ÀbX ‹Nt¢À ÌÀ .¸à0ó0 ]¤‹tAÀ]ÜÅ]ðŽ@G #=Õ‡«W6ô\í¹Ús•¿¦Ô(5JMï7B–%d-[eX†e¨¦YÓ¬iaŠ0EØ_¯¸¿qãþæÉ?ê zƒÞ ¬ÉÍÎÍÎÍæ¯é8§ã0Kº/Ý—î,‡å°ðX‡uXQ2JF§€¦çWÉUrÀlÁðâRq©¸2‚ ˜%û×gê3õ™Â9¾Ì#óQÁ%¸WF¢÷¢÷¢÷böâPC¨!ÔÀ¢ U†*C/kÄÉ(£Œ"ì$;ÉN€X‰•Xò.y—¼ À<”PB @€€ (œÂ)œ8gâL"‰HÊþ 5†C ÿ…_æ‘ù(‹e±,vï:_š/Í—¤·¤·¤·`•®JW¥«‚Rj’š¤&â{|ïò)ù”| tÙ»ì]vàJÙ•²+eTPA0ó1ötÚÓi¤Âï@I“hM*P}bŸØ'æns·¹è4uš:M˜¶ T `sØ6 ñ$žÄ·‚nÝ ÊåÆr#ÐÕÔÕÔÕôоMØ„MPÊñe™zîyîyîás÷ÏÝ?w? 4»4»4»àı¼ì§WÛ«íÕ•›+7Wn†?þ`ø`fïÌÞ™½ÓñX‹`é'ý¤puuªK«K«K>Žããe¬2V;½OL“Ådðr|™Gæ£øâCKÏÐ3ôÌÔ>YN–“åÓŽ¢r£r£r÷+߯|¿ˆÿ*þ«ø¯÷2÷2÷²éïäË$Û‰Ô©'RÝ‹ºu/Á–`K°ðZ¼¯å¡ŒŽ`#ÓñéFº‘np ÇpŒÄR.œ çÂÙYg’3É™„na‡°CØŽvÐÚ†‹¸ˆ‹w“»ÉÝ|è9BŽì(;ÊŽ>´î¿lµµµÀÌÖ™­3[ ›7lÞ°ð ù†|Cʇò¡íû–|K¾óO¹±–±–±tS=ÕS=;KÕûÕûÕû…ݳ»gwÏfgoooÌÇ|ÌǸ´VZ+­}¨.ÊÖŠV´ÈAr¦—]E®"WÐx»ñvãmàÁÆlÎwœï8ß°ƒì ;X®Y®Y®Mö&{“ ´‘6bÜ&Ù$›Ømƒ¶A|¬îVw«»…`(ªä ùB¾\ ¹r)DÔ;žq<ãxZJ)¥N–ÂRXÊ4}›¾Mßh­£uÓëücücücÀjëjëj+­ŽVG«íÇÚµ4ŸæÓ| Ðè tº º º ð°6ÂF ­]\»¸v±”BlÄFlø”ˆD$âgJv9ìrØåv+Ó•éÊô“£‰£‰£‰\OõŽêÕ;Ämrù`ëØ:¶ÈÓïé÷ô»&vMìšUÝQÝQÝVd¯È^‘ ¬q­q­q™y™y™yÀ¸qÜ8næ/ž¿xþb°˜M1›b6AUÝRÝRÝ"¹OžÐ>Ð>Ð"ð°ý°ý°]ø‹kÄ5âá)&Љ«XË`Ÿ4°½l/ÛËGúÛ¡[±[‰é©óOêüÔo¨ßP¿ñe‰=ÌfãÕ£Õ£Õ£ÓÚ%#d„ŒÀ+¬°!BÄÔÏ’Y2KógRõƒíÛ6¶¢ùTó©æSÜg€3À90á»à»à»ðÎG­E­E­E³1³!H.Ç2¨Û?ž‘fH3¤ºqûÆí·ïVïVïÖw> ¾u¦ÃÜaî0sê^ª{©î%¶‚ä“|’•T%UIU`Ð@ Àî³ûì>@"ã#¶Ûˆ _Ö/¬_X¿ACCC€”$%IIï|DËh-˜ •´’Vr‡üW!cê’ÏÄÿ—DõÿGÄðkw›_»/øµ{á×´+µKíR;´4ŽÆÑ8x„¡@(€êHÌ‘˜#1⼡ä¡ä¡d®S½P½P½ðÀÒÉK³ýšT!UHü!ÿÉþE>±’’’’’8åŒÂ¿0¥!¿v·ùµ{ȯ݋¿Ð®Ïì3û„<‡Ñat§êî}9—Æ/_—Ü\§z·z·zwk­gÐ3èÜýIçóÏw>øõþ}Zpªn?z9ù@ëwð/¿v/üB»áöp{8ï8Wx®ð\¡¸ÍßÑYC¬!Ö·4[š-Ídƒ¶]Û®m$½¤—ôo5ò¯ð¯ð¯Œÿ!zIô’è%ôž?ÞŸüãø£\~ÅÒÒÒÒÒÒ ø§V¦dJ¦$oÅÅÅãŸâqŽ8çß‚*Z­Š~ñïwVÞYygeÈyG›£ÍÑÆþvãÄ7NˆÏº|.ŸËÇmU¤*R©;"™‘™ñTídÿÊõàîáž!Ÿ€?Q£<¿a¿¢ÝbÔ¡ub313¥uÑZCk¾žX;±vb­¯¨PT(*h—Ëår¹ß]©‰©‰©y.ÍÖeë²u‘o¥Ç¥Ç¥ÇÙg~¿f? û×8(~ÃÑ®¿\ˆEÈG>òùÿl’M²¯Ä°:VÇêv¾¦™«™«™KÛ¸>®ëœ+í“öIûòn·¯o_ß¾˜D´ßŸÜXŽÿÇÿÈ8Ê»žÁÈ4IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-0.9.png 644 233 144 2567 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü,IDATHÇÍ–ohSg‡OÒÖ¶j[2u¢”VŹU]¨ÄRØÑ.ت›# eý´YdΡsÅS·‚N‡c2gÄI瘨 k‹£ŸŠéh+Â\É$Jѹ®ÔÜ´«©&mrïûìCr{¯“í³ï—äœ÷œßó»É}Ͻ""R˜ùpÎqÎq¤cçF+ŸçËóÍý1ŸÐÁ±Î±îÆ^˜öí´oŠN6nZ±¹oÖÛûE,};ÏÌK¡X‰Ü ¹Õ™¸ÞYô΢¼Òñ‘.È¿”éq [[.¶\láCìì©©+6÷Íz³ßÔ³ëKó¿ø"s9ç²ãäNÉ"%µ%µe¥ î”ÁÚúµõfý™¥œ G.U Ĉa.Í›û™z³ßÔ3õMžÉOûp¯t¯·Ö¿µ>ÿ»tÃÍ ivÓl“—¼ä .HÅR1ý]ý]ÆAu©.8ÀŠÍ}³Þì7õL}“gòÓ~äéÿö«ðçús!}ÕÉnÐu]U›:—:G2õ‡>UŸŠR«-j Öe”Q+4ÆŒcRÃút}:JmLõ¦zI‚>¢OLý o’/vC/}ùƒùƒ±lýûOê×ñ²~X?Ìfð:¯ÛŒ”SN9PB %VZ «a5 ìg?ûmõ5le+ð¢¾Sß™¶Ô‘èëƒI~ÆOÆØ‰_`Ó¾Mû&¯÷UõSòûä÷ïöç·wßÞ Ç‹/†{á{á{aÛ/3b†u¯ÚÚÚÇV[qlܽ~·÷n¯¥§~Kv%»,žÅOûÉ»þ œ=; ª@½—é×h{´=PQ^Q^Q‹;w,î€ùÁùÁùAªªª´ÚÚÚ ¥¥¥P¨ T`Áæ›l†ÀÀ‘#“åãê3“—æ›~ ®\Q`°b°ô·yjúëÔÀ©ðÖzk½µV~éøÒñ¥ãh ´Ú¬üQ÷Q÷Q7,°üÁòVÞ£y4_àÀV^Íü–æ›~²E²Öf­å‘œ[9·"1‰fnA÷Äo}}"®VW««U&WAKAKA‹HÒ“ô$=V¾>Tª‰œÙqfÇ™"«g­žµz–H8†ƒ"Ùþl¶ßª—)&/§-§MÜ"Y ³òŠSÄh7Úa‘Ô›©7Ew҆̾¹ŸÎÝ=w·ÈÀ† D4¿æ×ü"cÇŽ=)=Yz²ô¤Hü|ü|ü¼H$ID"óÔ<5O‰¬i^Ó¼¦Y¤X«b%RÖ^ÖVÖfùrÜ0yi¾éÇ)«ŽU÷] v;EœM""¼/Æzc½LøB¾¾"•u•u•u"e‘²HYDÄ—ð%| ¯×ëõzE–-+ZV$âªqÕ¸jDâZ\‹k"–Xr`‰HCUCUC•HMwMOMˆün4M2áü"ÃËð'ý½Ï®Ÿá=;ùŸÛgåsûvñܾ=Ÿo°ÿß¶æ‘ñ€ûIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-160.png 644 233 144 2727 13755454065 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŒIDATHÇÍ–ïOTWÇŸg˜‰:ŒÕÄ@Hº a]ª¦q%1¦€i3.DC-iX‰±¨µ $kLŒ¼`“ꆛ4¸ »ÔdcU(–bcbB:b©eIºób‹…!©B•Q ÈÊÜ{îùì‹áÎ]÷ð¼¹y~}¿ßsÎ=Ï9""Xù dffùSvV£ã÷†¼¡_\HÙÝ \oºÞü×iÈíÊíX×·®ÏºíØvÜÎϬqð3ùl¿Äqäôçô»ªVìVxû•·_ñSvû(ø®ø®<5áðÐá!€Áóƒçùæ¿™ÿàIÕ“*pl;nçÛõ6^&¾´þ¿¸¿téº9ž½QôÆËM©„™—aoÍÞ€Ÿ²ÊÖY kX£«€ ìϰíøJ¾]oãÙø6ŸÍŸÒ#°¡rC¥ÔÖ×Öûþ–*¸ýwø°àÛϸ|ÄG¬3a&Ô;ê–AêQ\¸À±í¸o×Ûx6¾Ígó§ôÈïmÇëè:O0Œ1Psj¬5F³ÑŒ¡Ãú¡~ˆ¶%ëßéz]fÄŒ˜°&­ï­ïÓ+ˆ~M¿§ßC›w“É ý{3d†Òcé-õ–²v¼ž±•""¥cúæ|s‰U DÀUªÕ¨Qd±ÄçD‰:„øñã}WßÕw3ü×¹ÎuеºVׯQNyF¼Lµ©6–(MáC´$Z<óýèû1±ÊÖ³"¬û&m9Ú<°¶ê?'ŒÎÄ{÷6ô6@d*2™rx¢CÑ¡ètôvôvôÂDÞDÞDžŸn™n™ns®.£Ë€;“wï,f¬x4Å—æ_ѳ"ì»ã4}zàÓéôCæ—7-obyÿøþ¯öåløÈú‘õ#ëÁ¸gÜ3îAy¬Ÿ†ßà7óÍ|[O–H¢*Qù‡¬º1zcTDþ-"»®rý’~I’ven[n[n›ÈÓ“OO>=)RÙ^Ù^Ù.²ÅµÅµÅ%²6{möÚl‘¼ƒyóŠô«~Õ¯DJ§J§J§DJÂ%á’°È®Ù]S»¦D~;ººiãónÖ‰¯_ýúU‘´žçNerå”Ì™“æ¤s*ÿ´xvñ,$/%/%/9ÿ†5aMXïŽwÇ»AµªVÕšl=¶ÃÂÜÂÌ Xµ[»Ñ B*=¦ÇôðgÎq.c_0à ZÿSmU[1ø\WÇ3:¿ªs×¹ÿoçaïÊöuñ¾Ç^Ìì°ìÏ»óBÆßIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-76-grey.png 644 233 144 6215 13755454064 16007 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü BIDATXÃ…—{PTǞǿ}æÌƒ2 ˆáQ”f¦ÄGd¸¢b$â+ÙX$Q²¬!wˈ«—, ÉAò¨E´’È*ŠÈ(öf\CJr}Qˆ0ê’(Žapq†s¦{ÿ`nY•ÊîÓçןþõ÷üúwHqqqqq14˜0ÇDÃ¥ñwù»ü]f*þºøëâ¯Y¤ñ¡ñ¡ñáŠDÊBYè‡ÿ*F‰QbÔ‚7¼ÍÞfo3+ÃqÇqRˆxÄ#À-ÜÂ-oà ¼ÁÊä™òLy&)äðøÿ8NìÄNì«.‰(‰(‰hï-Í)Í)Í!VQ+jE-Y3ÁA/ú¹4Ü$`*R‘ÊÕR#5R#½8îw»ŸN6¶[Œ-µƒãÖq븵í'Ï|Ï|Ïüÿ¡ªTUª*qnAÆ‚Œ¤Ð 5H R 9,9,9 ôÏóïüMú÷¯X?Ààãý\ÂÔLÍÔ4›ì ;Èm¥D+ÑJ´'Ü'Ý'Ý'Ÿ ›Ö6­mZ›¯ ãVÆ­Œ[œÔ“Ô“ÔC^”Ê å…ð༃w „x¼†×ð€hD#oŒ7ƃ{Ì=æ3¾ÿ>þûxZ0²rdåÈÊ­G”Z¥V©]¤ðíðíðíX^ÉrY.˽›M@@À-!ûÇöí`†昧øf¾™o6Ÿ}æÝsºçtω©Yoe½•õ_«qi\tG8Â!²XËbÁ£ýèŒ`xŒÇx qˆÈ aƒ 6ðµCíPãNÃg Ÿ5|&fßùáÎw~à»dA² YÐÿµŠ™b¦˜¹t3–b)–Þû êêꤑÒHiä¡¿{Z=­žÖg^н¤{I÷’øbnNnNnßòfÈ›!o"\¼$^/t?ÝO÷ƒÇ†0°‡ì!{ èÈ!#YD‘E- ´¼OáSø@ÈåË!—ð¯[§[§['¾X?Àà#F“Ñd4­IïïïníV»Õnµ›éózózózI·æ¬æ¬æ,8æb.悚¨‰š¨PPP8p¼ð @9äÒ†4h Ђ´`Òh#m¤·ÛÀm€Ë±Ç±Ç±ô9FŽfp…ºB]¡Ä"3È 2à žÅ³xÿþzA%¨ž™ž™ž‰ Í#Í#Í#È„/…/…/¡ìOëOëOh2M¦Éÿ´p-jQ à*®â*0­cZÇ´ ú÷èߣÆdc²1033H]R—ÔÄæÄæÄæÌÆl̵æcÍÇšáI_¾:}52Þkx¯á=@#‘Ƽ¿žõ¢^Ôÿ%/ôLè™Ð3(›£œ£œ£$Uþ‹ä)òy ¸y!òB$`[`[`[ðWù«üU@:,–6§Íisk‹×¯-ÂÍáæp3Py´òhåQÀ=Ã=Ã=2…L!ÐÇëãõñÀö­Û·nß:hÙœá9Ãs†IU‡­ÃÖaC™;ÝîNÿKö:÷:÷:iYí¢ÚEµ‹XÀÜtÝ@7Lö™0*Œ £Œ^½8zqjܬ5kÍZÆÊ­åÖrëÔxÓô¦éMÓ;’}$ûHöÔ¸½ËÞeïb¬laÙ²…ŒÝ™ugÖYìIsx|â ’x®Ž«ãê&w&GºÐ5¥)>”åCÅÅÅÀþ®ý]û»Àù„ó ç€VR|$–ߎ¸q;‚Õ_¯¾^}½ÀlÌÆlŒú²|Y¾,€ˆD$"`l‚M®E]‹º¤^M½šzujŠNE§¢Ú´)hbH1¤€M›26eÛ×o_¿}= ” eBз¯o_ß¾É×G-¯X^±¼Xî[î[îã?···ÅrYÈBVÉq¾˜/æ‹Ia{X{X{˜Oç˜ç˜ç˜¥D%QITp<݈¸q#Pç«óÕù€¾Sߩ8wœ;΢+¢+¢+ ± ™ÚȰsØ9ì|ù¾|_> Ù¢Ù¢Ù¯ÿ±ò»˜ïb¾‹¡©ÄB,Ä‚ÿ">â#¾2.²3²3²óƒ"Yº,]–~òÞHòHòH²äNÃú†õ ë}»ýÔþÖ{=ñzâõD êPÔ¡¨C—Â¥p)›Éf²™S@«6®Ú¸j#àv »†¢‹~,ú¨^\½¸z1|(ùPò!°ÙÆÙÆÙFțʛʛʩgH9¤Rr]² Y…¬âÆfaP ÉüŸçÿ<ÿg€^¢—襟tŠE„"bÃ'œxp"ì_¤/ÒÉž×'êõ‰$78.8.8lnÍÜš¹5 ÁÛ‚·oÈr…\ЃôÊ e…²xöè³GŸ= Dˆ:u044ÒV¥­J[…Ñ닯/¾¾ëÎÎÎÈëÊteº2}l%›Áf°+_âò¹|.ÿÁ2~â¨$ÝhCÚîh*M¥©;>W)‡”C0_1_1_a³cêcêcêÉ©¤ÓI§“N#“%³d– åäþ¾ÂW$@`5Vc5 2ªŒ*#0¯v^í¼Zoãm¼ —ë€ë€ëÔçBÏ…ž u²%²%²%<&޼ˆbÖaÝÍc嬜•ó1þ2Ïg˜¨ù÷I%©$•ùÜRn)·´ yÈC÷iËXËX˘¸Ó~Ô~Ô~Jr€ àš¬?€"DˆÎã<Î(D! ª¦jªžÔ¢ºµ®µ®µÎ·Ûnµ[íVþy°(¹YÜ,n¼b¡X(Bþyì籟Çú⬠­ ­ %ýŠ¹Š¹Š¹å‹˜„I˜¤ ‹VÑ*ZÅâ?ÙœXiiiii)\ˆÂ?0©!¿vwûµû‰_»ßré\:—^ÐŒ\ä"—û´EhZq§£ÚQí¨†’ã8Žãà D¢}´}´}”zîUÝ«ºW%éW)ŠE½ç¼÷½÷½÷‹Žô¯ê_Õ¿ ðêù4à›}80Aéwð¿~ížMlJlJl*_«ÈSä)òN•Ú£ìQö(Þq¦øLñ™bßnEÒÖÖ†¯ÌÝæns7ÉVö)û”}ÕQÕýõ"¿…ßÂo]¬7è z¨þ%pC=É%ÁزeË–-[Ñßía2&c2ò¦5Áš`MÀ—¾¾¾?‰r½\/×oøô·å¿-ÿmyX“ã¦ã¦ã&ûøZ͵šk5¾%…ÇÂcA²Kš&M“¦í‰aÕ¬šUÿ÷¹‰[rðhtàüŸä!øûía‚ &_ kfͬyÙ×È5rÿ£{yìå±—i‚´JZ%­ânJr%¹’ÜïˆmŒmŒm\±Ì2`° óôiú4}šðûmñzþˆƒÃŸØÚõ§ _ ò‘|þ$‡äœ¿Ç231Óß^ š43h&wS2(” ÞŸI?¤ÒwõmîÛÜ·˜„Þï/PXŽþÇÿ¼t •Äæ7RIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-87-red.png 644 233 144 4221 13755454064 15610 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜFIDATXí—LTWÇÏ}£d#(ƒ+ÕuÔñÉÊùQL5ÐL%nm´YŪ@ð•ÒÊVÔ&³.Ù’‘§$RµÝ [4¨­5+­kIµC+Š2°̼7ï»0÷Í›Ù]Íf÷þçžsÏùÜ{¾ï^ “(hKÂä09LfÿðODŽk×:®5w‘¤Jª¤Þú=¥R*¥cn­Ž$’Hâ6lku<ž¯çùxþàzÂ’`#ßÚB[„æ`Ì/¥V©Ujmîge¬Œ•é æèèèüi录÷VÞŠ=,z¦¦¦lîçñ|=ÏÇóóz/ç!áWÁvÂQaP{Rù ŕƕƕªÛN\=qõÄUm¼ë™ë™ë"D¸1„! èAzÝöûy<_ÏóñüÁõ޾œ,QB¯Ð+ôöü™'H¿œ~9ý²²¸ÛÛííö¢þ¡%kÉZ2µZ­V«už:O¨6Õ¦Ú ¶ßÏãùzžç׃ê[¢t4ÖÌšY3‘t@: hêä ²ë²?ÌþP±é`ïk‡´Cp)M»Çh=Þ.ozU½ 8‰“|¸ƒ; Vª•2=0=0=X6ŸXj,5–m¦ó©óó^øó¸Ô½?yÜÅ] PBßÊm`#69¼ðþk¼ú±öŽöŽnºœOÎF¼°ÔX[k39ç“PzÔïû5?á G…£ÂA9 ?K˜ž0Æ©²ò£ò#—všf›f‘çnîÝ\"šxÍrÍBD4Í3ÍCD”??>‘jU­DDç^?÷:‘bU¬D4‘½ÍÞ&"-£eDâNt¢“H•_3¿f¦‰ Åi®4 W8vÍØ5ƒr6ÑfÚLD!|Z_tRtRtêúsûsûsð âùžÛ&´Mñˆx¢Š£Š±{VíXµ”uÊ:˜Ñ9£ÓèDA€ñwÆßàòÏÇWݨº¡Ÿ¬ÒŸûä‡'?œ‡óqÐV\qpÅA}[íö{Šôñ©¼Œ¼ X\¶¸ÌØÄ޼Ž<#P§·Ókô÷õíö~´æ$ÍIÐ×ßÑß¨ÝÆ¸9çóƒâóÂ[…· o$¤.õ$zk²ƒ Ì{Ì{ ± ±Ve­ÊëQëQx6úlÿf8Êe Ä qÐRÕR`Ð_p·çÏú…ÖBk¡U¿·?ç'Z²¨aQâ8FØaZÔVµ~Ã[ßìköO.%:%LÛMÛàko\ì‘ÀwÉwɺ¦jMäæà›¹åûÎ÷ ¥h‚&@ãÑé“Ó'§O†ƒó‘`l‚Íû„?uØròÈÉ# „»¿v “îOº`toõÞj#ÀÃü‡ùÆ o;Þfôïû{¿òÅ—_|ðªg<—=—õ.Õ_:xIo96°–ÂR¼OH\ .TÖòë þç–÷,ï© ÎU=Wz®è \ZVÌ™˜3°1bcØû·ç¿=´‰6@ãÓÆ§FÐÝçwŸ€)•S*¸•t%@P†2Œºáöº½@ReReR¥OÄ1FŒ9þ‚"s"s"sˆ¤©Cê°÷ê~aæ»™ïª[y6_yKQKF!‹ñb<7;ÌOÒöíž5<Ë:?u~*×›Ö7­¿™}ǽáÞðÀvKo–Þ,½ésë€ëÅõâú¿¯³#øWÏGܧ¦SŠ)¥ç$_P^½­b[…–Å*“»» ŸÍýl.×Wg¿: ÊeŠP;§0z¶îlÜžt{ ® úÂܧO œ@þ„Ö µBíH.›Ê¦²©sO„ŠÓŸÔ5¬„•,=ÆìLf2׊ï·r{óúæõuínõ%úŒ·Â¨vQ»˜ŽéFiø±³´(-* ¥^{oKo ¦lÒOrŸ¸OÜWž­£ÙÈF6É`Í  ÊöQ35S3‘Ø'>o;¯?­Ç,,³sg÷hwàúqiYúÓú >1ºá‚ €¬¨€¶ZÍSóôoÅ7ŠÛ‹ÛÕ­úÛ>$ ICòþØÍ±›c7 ÙB¶ÍÎøéÖrÌ þŸ«E‡èìÂÌí3·ÏÜNd*5•šJåýºv3²3²3ŒÚõ•ûÊ1 2dÏñÏ _õlu¶:;p¾ 6,Ô²ô·Ül2›Ì½#þ¿–ƒ;ÍÚBZO,ļl[ÂÇ´ë<ÐnyuyµA»fŬ˜@¾Ç¾Ç¾Ç-v¡ ]€ÑÑÑ¥­Ô5)D ‘oí ‘â§!|aôò ±Á Ý5lÍÒ•ÌÎìÌnÔ®Ü.·´«´+íJ{@¹Ã±Ã±Ã±@â@â@â€ú ]‹§ÅÓâéCi\j~é…N¤WŒ@OÐnŸØgÐn½¥ÞR¯˜v§Ýi0ŠQŒb€“–_(¿P~!píHǤcÒ±.ÿ¿$ ©ëŸ§ñ¯ |Á[~ížûOÚÍ\ž¹ó…ȸ–qÍQôÁÖÒ­¥î… ÿ‡dÞ̼ù—»oí¾Ðs©çßÀdÿd?À«êWÕ`ù:¯ëu¿Æ³ã‹CÿáæÜžsÛ1ééB@áúÂõEm‰‚Ñ"¨¯«¯OOSN/,²T5%ж°Í×ùd½î×x_óiþ„¹ër×  Û¶e CÝàóø<š/~8ÊQ²ÀˆQÙ,›™R!8Àòu^×ë~§ñ5ŸæOèÿÞÛ½Ðèntoâ÷ÁtšNP¿Ê%r q™&Kd J~%e#ÈLé–nP;ÔµT©*Q%`üaŒ# v©ê ÌãæqâÄd¯ìM-ø~Š/Å/삾ðCædædÔÃrX¦¶¦ÌíævbX6Í4#f*CÊp€¶j/kY äáÅ `v˜Äø[ãk>͟Гvú´îoݯÑÌ2u(î‹û,ÞgŸ?Ë{–p~ôüèùQèÎïÎï·áÒáÒáRz8ôpè!ø]~—ßOŸ>´-à75¥¦P¶-Ì2‹?¡')lð[¸¹Iµ·˜Õ3ã3ãLëHèdèdè$”7•7•7Am°6X×]×]×]h¿Ñ~£ý”Í-›[6Ö4¯i^Ó K÷,ݳtLtMtMtÙ~oÅ_µXü =²û²ûÔ5˜\9¹Ò¶¨~ÕŸø‚³Ò¬4+­l`g`g`'´Ž´Ž´ŽÀ9Ï9Ï9TöVöVöZuËÃËÃËÃÐUÓUÓUcÅeµ‘adØù4B€œy9óÌÇžOØ®ý5ªF¯> ‹\\\‡ÂòÂòÂrr@ÂTt*:…eb™X& noÝÞº½¾*}Uú*8Ûq¶ãl‡MØ—Æ c…}Ìhþ„§fÐ : al26 m¹"[¼/…0š¹fn*..o¼¼ñòF!ò³ò³ò³„X¶:mušÏ«žW=¯¢ØSì)öQ§þNý!¨j¢(X, Z8ŽG¢GôØøRüI=;c2 LËŸåUyÕZi“¿Éßä‡c]Úiÿã(G8꺧î¼å- Ì6³8R†dȆÿñÉ?kÿ+gíëbÖ¾Çfç öcZ-ØN3TIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-138.png 644 233 144 2733 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍVkLSg~ZhK3ÄÎJGtê: ËLœE3ÅL[ VÒ`Œ‹NM0Mæ¼ý—8ç-FÂ.¦E]Ј‘¨3c&LEtºÄ j‚â¢ñ.t"mÏ9ß³í×S5ÙoÏŸ“÷ö<Ïy¿¼ïù@2boF»ÑnL‹ÚÆotJQJÑÇuQ{—JJ ¥7*Éôêôj’ìì×nê¶ŒËüÄz@ÇOä“~d@wXê-õ†Â˜½,Ë-ËMù0jÿÔLZ¬ ¯rÉÑ%GIòÈÞ#{¹œ|xþáy’|Qø¢Ôm—ù²^â%âcÃ[üi:a:a¸KZÌ3@fÏÈž1ÒM¸5’tÍvÍ&Éž¤ž$a$IR}B2•©¢dAÊçi‚-ã±|Y/ñ$¾ä“üQ= mÓlÓ²ÄSâ±ú¢7#We­Ê’|‘’›¸‰©¤T‚$©ÎWç3DŠfÑL’4Ð@ê¶ŒË|Y/ñ$¾ä“üQ=xólþ’Âmv›I*$9GªÝj7©}ñF¼Œˆ‹¢OôQHÉÚuíšvTî)÷”{¤pˆ1bL¼ƒÔzÅp1œB¹Îç3">UlŠ-þÁç80W™«1~ý(À±“еÛÚL&;3:3HþN’üJmŽdG²ÙÏ#ì`‡N(B"$B$7r#7ê~Þç}Þ'Å"±H,"éçnîNˆï×ìšýœÅ';‡u#9`½k½L–zbÂv%—­_¶žä ’Ô>?DVGVë:öxö”î)%[Ç´ŽiM舴«ÆV­KÔ€P⥭¥­¥dÕ÷Uk«Ö’µZ½ã¢6Êçé‰ »¼’Þ ,ˆ§/R¶†rB9 •_,?U~J?ð³WÎ^9{… ø¾€äää$‹gÏ,žI:ŠÅŽb²~GýŽú¤ƒ:H–L)™R2…ñÙˆQ#F‘7¿¾a¸a`Hò‰ìºŒº )ìòÊd ítÚéqyø¤ ¥ %v¾0øÄ~^àÀ¹Ï™çÌZfµÌj™À?ü@ßä¾É}“ŠžŠžŠ ßïÎw[»¶vmí^ú^ú^ú€ÈÄÈÄÈD`zÝôºéu@ûãöGí€þ <€EòqïÔž©=€i—Ò.Ë3I®$Çb¹Ùn¶øðÌTi®5מ›žvO;`jj <­yZó´˜à™à™àÖŒ_3~Íx :«:«: …‹ÂE€æÕ¼šå„rB9@ScScS#@€?q·e#ð #Ì×ÍשÇhǵã†6¨Êle6À†/0ƒã…xí}í}íl.›Ëæöiû´}PÖ[Ö[Ö œ\xráÉ…€ù°ù°ù0àËòeù²€ÜþÜþÜ~àØÒcK-LwL]¦.àïíç+ÎWÄámü6|:|zŒ@°0Xxõ$Ÿi>Ó à5p±!OdŠL„eeº9Ýœn’’’€yÛæm›· xnznzn†´ iÒØ;íöN ÁÔ`j0¦S©Èœ“9's0úøèC£ó÷–¯+_'ñ¹ØXÓ2·e.×óÎT†cSÒ­´)múTönïÝÒ»… W†+ÕúÔ…agØI>¶<¶<¶êAõ zP+.Å¥¸È'Cž¤>I%Õj•ZEAªûÕý$¯ýïT:v’Ö‡Ö‡Ád²CíÐÇý+R[ -`?ÿåhM¢‰~áþ(¤vG»£Ý!E¡˜$&%ÄÊfe3ûEG|åuæ‘|e½e½õÎKØüt[Ü’Z|ó_U¯’´¨j#ÜÅ3<£ï!~Ç\AŠFÑ(IþúÖBÝÅf6Sˆ¿Ôl5›þ¢zTOÂæWÜÉîdÙ©76ÿ{û¯|ooïí}ìý¼Áþ*UT}ÃIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-89.png 644 233 144 2451 13755454065 14703 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÞIDATHÇÍ–]HTiÇŸñ#5"µ\R0‘š5(º)0ʰ, -"*ʈmˆô&T°–¹µÖJçb©„Å @I-ˆÀÊ0¤ —†Í¤/–¨ÌŒÛYuÎ9ïo/Æ3ç´Tì¥çæð|ýÿÿó¾ïóœW@DDÒæÞqËã–Ç-ŽÚq•–?¹8¹8·=jûupìqìù³R/¦^H¿’~ÅxfÙfÜ̷׋Xøv>Ó/ib9’n$ÝpÎÙ§a¯{¯;ù‡¨ÝÐ))kpôæÑ›mmü #F|*üT–mÆÍ|³ÞijãËéÿð‹@â­Ä[Ž¿ iAÒX±mÅ6§7šðÒ e¥e¥oã߯«8ÐÇE,R…ÀS˜Ï„Í6ãsùf½‰gâ›|&T@Æ–Œ-"°{ßî})—£Ï~‡êìêl“/Ò øð±´)m @? `TŸêÀ,ÛŒ›ùf½‰gâ›|&T|¹·EàIö$ ÒOD¿§ß0êŒ:"FDåª\”öF{©½•«œÊ[1ŒqcÌí£öAûªRSçP`4MDëwõ»±îñÅøÅ.èÇfHI™J€çúsPF£ÑHXi¸pg¨¡ÆB€PÕFµh£6[¼ˆMl²(¢À8kœ%Ì?&þ_Œ?ªgN˜ÿ!«;Vûîµ|ÒÞho€ Ö²6º~ö@{ š¼MÞ&/ û‡ýÃ~KÇ“eO–=Y .\(€×ƒ¯_Zqõ‡Sc(ÛGùbüQ=s«àZðZ0V~Øè‰x"fLÏ oÐ7胎?Çå£å£å£°ºuuëêV¸î¾î¾î†<•§òl¸ºáꆫà:î:î:ïZÞµ¼k± üE[©­4ñÕa‹?ªG`ñýÅ÷Õ Y?²ÞvVõ ½Â²nܸ Y™Y™Y™Ð¼µykóV(p8 pèÕ¡W‡^Áöší5Ûm[½nbÝĺ h)n)n)¶üz¡–¤%Ù¶<ÆÕ“ __F¾Hâpâ°cîäÉG”„$Ãt̆góa‘Ù…³ gŠôvövövŠ„:B¡‘Ò#¥GJˆ4O7O7O‹”J%‘¡±¡±¡1‘O‚'Á#Ö“$ù’/Ÿ$v%vI†H|^|ùq"F·ÑíÑʵòXb£ôÓoá<Íyšó4GÄyÐyÐyP¤+µ+µ+U$¥6¥6¥V¤§²§²§RdMûšö5í"»VíZµk•ȵD-Q"Îng·³ÛÂs¤C:,>‹NϷΘ k­Z«uÆB ¡†PìLÛ™¶3 ÒóÓóÓóÁãö¸=nx1ùbòÅ$ì8±ãÄŽ]•]•]ÕÞjoµ÷‹.`¸¬oÖ7÷Œ}£+Í®yÌ{Þ[]©ÒNi§`|éøÒñ¥ »t—î²xg‚3Á™ ŒVŒVŒV€šVÓjÚ&l2ª¥µ ï«]ùÝ9Öj´V“d’ *Y9”ÃÖ]ûÕ~µŒ 4‚ |ʧ|¶ø •©2Ÿ¸Ä%£Þ¨'Läͱ¯L~s2kúý€qÒ8I„ßè§¥zÕuø•󜷭Èê©5 ª‡Àc>ó†×ðA×ûô>þ·'ÿ¼ýWÎÛÛż½ÍÏì¿n˜åEÚ/IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-4-red.png 644 233 144 4031 13755454063 15513 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜÎIDATXíWmLTg=÷cY—Æ:˜¶®º«k¬É è í²¦ƒÒŠ D%nèZ4fd‰»¦­Å5[CÁ˜ÅÔ –µ*M6jýÈnKS`¢lb™ÁA†{çžý1÷½wf5›Ý÷Ï}ßçœsŸç¼Ï€Èš†˜%¯Lô$z=ÒSóAJBgBgBçšeª®êª~ë/X„EXDF¶F¨P¡Š˜ŒFq^ä <Ë'¯ŒÕ­¯5¨‘Ûc÷gÌW;ÕNµ³ý±´SÚ)í´„¤¥¦¦òÂú»ë﮿Kn¼¿ñþÆûdqnqnq®‹}q^ä “r@x‰ Í*ŸU>«\ÿèTï©ÞS½F²ÿ‘ÿ‘ÿI… 9Æ1Ž‘ôÒK/iÅæ¾8/òžÀå{í³ëƒ3U’‡ä!ïß@î•Ü+¹W´å“““ ¹Œl#ÛȦ¦×éuz©/ÖßÐß õ"½\/'õÅÚm©×iZ'id«ÕÔD¾Àø–à~gª%Mj—Ú¥v@=¤RµÞ ®FW£«Q+²„í1ö{è×ZµV­•4¼†×ð’ ÑO?íælÎ&IãŽq‡dÈÌ÷ßß“V¾‰'ÒŸàz„>8î9î9îýf‰8à¬wÖ;ë9ƒÃƒÃƒÃ|bâøõ#úýH” ?ŸX»‘妛$ù ?!ɧî§n’|ºôéR2æeHÆáùŸàz,}j•Z¥V];$6N”(;Qfì0‚Z»Ö®µG1Lp‚$ÉY­yœ-a|l|Œ$_ñê ’,ùºäëè|ý¢~Ñãðƒ‚ߪlŒ>¾ô…é Ó²ññšÇk¯±q˜Å,f‘ô[-Ž\ûÈ-íVt\YIFæInúaÓ1µ<ª%éç> -|Lð =BŸzxÝÑuG×µßLÐô’>úè³jM˜§çEÇ-wZîä+¯LäÔ#SäºýëöÇäÓE8´ñ->“_èúdóJÍw8 ÖKD*P`:¦cºù,¸„K@¹ª\€þ¯ú¿€Êi•Ó`ßá}‡`Ùíe· à ¸bFË]Ü$#@T¨Nã4NÛüŽG‡£ÃºòóM¡<7Ô;Ô;Ô‹ yBž¡(•J¥R b;¶c;€6c3H·¤[Ѽ%çJÎÀ¦²Me°ûÀîð¼ðMÂ71BûÑ „B~‚^@î’»ä.˜„âóú¼>/„>ÈEr‘\4ùÐ,qcKMKMKM”’ô$=‰$õ*½Š´Û.õ\j´ßúô­OIòÝ‘wGH2u[ê6’œZ9µ’$?ØöÁ6’Úøã_Dá¬ÒB6ߥ¦KM—š¬/àï¤)GÊ™|(KÃÒ°4|àK³Äpw¹»Ü]á×½%Þo ’•gÊ3å\Í|æ‘öàÌ…3@a_a¤_H¿Á¹Á¹à¸é¸ ò˜<¡ý¡ý&`ÀZ³t%jµZÐ8Æ1$׌ԌԌ+L–?Ëå‡òÖ¤¤¤êeõ²z¹mÈøÅ®bW±¾K¼j¸6\®å=ôÐc^… Iò;~G’áoÃßF_šåË+Hòíßþ‘ö}¢/Ö“á“á“á“4Äéòå7Êo„ƒ‚_©P*”Š•Dâ)âÖ‹5ësGŽ#Ç‘ãýR$ÔÖÕÖÕÖ«¬ùñsííÖüôëô $©}¬}-tOÖž,’înwwT«ËB¡N»ÕggFÎŒð·Ö'´Anž­‘2¥L)óW§â*7­ûµEÚ"mYÝ,µImR›ðJø÷žO§‡Ë»»ôõ£tM˜s‘æË a׋4VooZ¡¨m¨m¨ÌJÊJÊJÒª¬Jº·â®µçDŠP¤:m­yÈCžêF;ÚÑ(>ŧø>êÎfg³³YKÜ;¸wp¯Mh¬2òü(ÁB\0ü^ø=’žð†ðÒ(1šfû*n¾¾ùúæëú.ë 4¦Ž©cžƒÕÕÕ€ì’]²K:kª+2&fÒ¯ô+ýÒù9»çìž³p”;Ê垃–wó\y®¼xw$ö7€>OÏÔ3íÚ_z|éñ¥Æ*çHs¤9Ò†žEbgRl§¥î¸ÖCŠ ¯ÆÆÎ¤ˆwÏ>×»iZš–f ???°½ØÇ>ö‘ž)}Sú¦ôë-O¦È)rÊûŒ³âçqúñâÊñ8ï®™wµ­Gë±;ž1ž1žA.]0º`TŸky±CéP:þ´BXÍ´^¼À©xɲ€çy·ÉÙälÒÒÛÛÛ(~] ¥µçkÏמ·ÇŽÚ¬6«Í}æ¿$SþÇk>GòËÆ/‘ð¾éÝ¿>Ï»ùkó׿¯µ½ëYáYáYÁÓ‘}Ãê„T*•J¥«÷ÅÒÈ#q¼þËõ2ï®T”¥Á»X.­/­/­7Že‡²CÙ!íŸV«}ŠOñÕÎB+ZÑ sì(ƒq|‰øW¼wÆÆù?I[¥­ÒV…(Daø—òLy¦<“” AÂ߯f³‚YA@¹¦\S®IÍÄ’¸ÎýßVšõW P ÞŽÝÞ[&²!¤Ô-uKÝÿžyþ O\gâp_ÚêÿÈ’.ת…&6IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-20.2.png 644 233 144 3015 13755454067 15023 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÂIDATHÇÍ–ïOTWƸ éÛQâØb£Ý.ÓˆvØ ÚHÁ`µ»Än3Hm\£€!ààØèF6d©«óÂ6˜¦µBDH!Ë ±ÐVI³‰ eb 3ʲcmi¯sïœO_ܹ\Ú¿Àófò|<Ï÷νç9G€BˆE±_ñŽxG¼MÇñ3žôFÒ/|ªã³ÄmÛ:tžúð©žþøé£#&6òFýü~!LþùzF\,f`aË–¸ü®‡í/o9éŸêK›¥íWÊÚËÚ.5_jæ}¸7poàÇüóÁÄFÞ¨7ú ¾ùü¢þúB@BgBgÜ,L\˜(ù*CBÑP%J€\éWG"öˆ¢}‘‘È‘ؤR¾&_•¯‚:®Ž©c ÷Ëýr?æš&HpI™¡æ¨9DL>Jü%~@1ôWù¥Büùß`™±ÌÌüI†üýþ~àŠ@®“ëPèä W@.•KåR`#Ù8o'NœÀr–³Ü ËI9)'¿ãÆ _—¯£ðO_>ŒéÅôéÓç‰ýcg¯Éîò¸ò8ƒ.š5ºlxxxŸo\Ô¸981818a ú÷ø÷ø÷Àé„Ó §`ìÖØ­±[f>êz£^¦.]Ï7:Èï]×Ï_?oêÉÙò¢ò"à¾>ˆ¾"„ßWÂeße õOOJ·CI?›~–pÞ–¼‚¼ÈÐ2´ :†;†;†!wCî†Ü àÜìÜìÜ +¯®¼ºò*LeMeMe™Ýœ¸9qsªCu¨ïͯͯÇ{éÉéÉ„ê(þ¡Xº¡ÃÛáí†>Ðþkm´6ÊPÂJ.[ºÒºÒ ê•®J—)»6wmîZXS¶¦lMlòoòoò›yWØv…áLõ™ê3Õf¼µ®µ®µªêªêªêÌø_n½tî¥sÐôWß.ß.€ÙêÙjPµäÞä^Ù¿À™X›XK&·â¢øQQ¨($BžžTOª™·3ogÞÂ^k¯µ× QšVšVš&„æÓ|šOÌ-[³­ÙÖ,„ŠŠŠßv|ÛñmÇ…ðŒ{Æ=ãB¬nZÝ´ºI»Ïþ•ý+!v½è>å>%BB(cʘ %$)¢Rv§ì–-ð0ð07OŽ66A²=éNÒ¨ßZ_\_l>i×á®Ã]‡aUÖª¬UY033ÙDzeƒöí;Úw€’ª¤*©0X8X8XV§Õiu‚Wñþâýf~nø¹¢;bÄ÷ž½÷,p×vÞv^¶5ÍøÆº3»3áÜgmUmUÒ? „„³3²íÙv°•ÛÊmåк³ugëNØÛ¹·so'$’I8Ts¨æP ¬kÀ ëÇׯ‡£½G{ö‚¥ÇÒcé×—ÍeÛçÖ"ká ×{|=>é†.w—Ô†Ø7Æ)}@ÅÁŠƒðXÕwÉÿ¾ ^ ^Áô`:2ø^ÐtÃcËcËc p‘‹\„PE¨"T²FÖȈE‡¢CºººÊå€r¦wO¿;ý.î´€† î»ë¾ë†Gwt=¨˜­˜þÛ•º]˜>†¯Ä|,"Ò2ÙÇ>öA4 ECóüê„‹?®G ÿåü—E`KË–÷ßã7OÂ{ïX|Ú9à‡È=¢GŒV£•EP!ÀlÛŠ[ùV½…gá[|\½-½-Y5/™ÎAç ˆ¥'Mij¯‹gö=öl¾`ÿ·¹Ö'´Ž,IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-181.png 644 233 144 2526 13755454065 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍV]H”Y~FùF”ü©½©T˜…Z¢]0¤ÀmlúÄÑ!1D²mƒÊÌ»~HŠ–¶,1ôBúÙ]Ö‹Ø~ÔÕ FCíï&L¶u…b/ÆQQw¾¿óìÅÌ™o6£kÏÍÇ{Îû¼Ïó}ï9Ïw@2cOI9I9I«¢qÒÖ¼ssÏ׿Gãvƒ´ùmþ¿N‘­­$™u3ë¦ùÖŠåºÌOÄVýD>9LXÊ厭8Ÿ#+7Unr~$Sï¥Þ[ÐÉC= É»·ïÞæQrêéÔS’œ)ž)&­X®Ë|‰—õëãÜ'üiÿÓþ§í=©8@æíÊÛåª&üí"}%¾’ü˜ü1Y$‘$i„H¦3]“œç<å˜Nˆåz,_âe=Y_òIþ¨k¤ )C 9éôNzÉÜÊÜÊÜJÒ_ç¯óב®k®k®kähh44"Ö¬;Xgá^xé᥸ވÑå#;g;g¥°— )ÀªÇ«WˆüíÎíÎXa»!~ås>J)-,-†‡‡aô.½Kï"s‘¹Èà½ê½ê½ ŒõŒõŒõ çÎ/œ|_À=*zT˜™f†™!y   Êx¼/ õ$ɾd¿ÁQGŽ#@àû)Ç-Ç- êmÕ»ªwÀÚkw¬ÝhЦh  UkÕZ5 &«Éj2H ¤Òs›¹ÍÜØ ìöÀ·Ù·Ù·X×¶®m] úÔ2µ Öø7ÊØ»ì]€Ô“˜Ýf·í ½D/`¬Ád!Ë«¦jª& *…J!ðÚýÚýÚ ¸ü.¿ËÜ?pÿÀý€ýƒýƒýðløÙð³a 999  „-Æø —ée@\O|Éÿëy¶Þ£÷0"7ƒÇëñz¼dïRïRï’µ©wçîÎÝKfû³ýÙ~²ÜYî,w’ÓÁéàtÐÊóä{ò=ùd÷‹îîk™öÏï±å§R’ þFcÊÙæÙ‹³IµYmV›-B½H/Ò‹ÈÐêÐêÐjÒ8f3Ž-?•qüõ½úž‚4·š[I}ñTº[,‘¾"}Ƭ1k¸ÈÅO3,Â"L §p g¼[¸…›bBL$âøX½xý/úX‚ó³B©PHšqç1FH*Æã5¶sƒ–±ml#E¿èý$¯³•­Ë?Žï0jÚç×+R*R>ëü+ö_¹bo+ö>¶2o°ÿkƒÔG1‰ûIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-39-grey.png 644 233 144 6276 13755454064 16015 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü sIDATXÃ…—{PTGöÇ¿Ýw†yÉ0à‹ÉbËR,á焇TDQbPKKXãâJ1bI—¢Á [+¢.!ˆl@MÄ"ŽÊcP@"( ¯fîÜÞ?˜Á-«R9ÿtõ½Ýßó¹}NwŸK’’’’’’ Â„&ª===c•Iß%}—ôsNéNéNé^=Ÿ92Gæxô¯¼šWóê%±ãeãeãeìÎâ,Î’xÁ ^šÐ„&±ˆE,;" —„KÂI‚¨KÔ%êª?KúI?é?“<3yfòÌêÇ©[S·¦n%zÞwãÝÈ{ÂÏV.ôƒüh"¤)ÂϦÓˆidÆÒ”ò”ò”ò‚v“Þ¤7é«î/ùDqBqBqKV-YµdIðûŠ}ÅÀR§¥NK[ßöÞ6Þ6ߦ7©oõgóoã±ñ‰¬+¸‚)™’)…h²ƒì ;ÜNpnœçvýÜHþHþH¾«ÓÔª©US«,ûV5­jZÕDÍ µ µ µ$D’ I$Àˆƒ8ˆƒÃ#Œ¶a¶x oá-Ç]Æ]Æ]¢­ÑÖhk˜ùš×5¯k^¾Wk^­yµ&êk¹›ÜMîæ/µì°ì°ìXy‚Űó,š€€€® ‰c‰c‰cjPƒ{Q™¨LTVsÑ4j5º®uppàý"wGîŽÜ-*P ªUƒpÇ4LÃ4ðÌ“y2OˆÐŒf4˜‚)˜`Ã0s1 -¤…´€ÇK¼ÄKˆ JƒÒ ÄÓ¢“E'‹NòÑOo=½õô–èW;™ÌNÖv•çÃùðw6ἃw:‡¨¬NV'«ÄÎbg±ó—7WWW]׺opßྉٳ5f«èWÕTÕTÕTL³\¶\¶\„÷…÷…÷!š)%¥¤ í¤´äyE^¨F5ª!L ²l´l´lzzz1ͦï¾Þ}½ûz>Ŀ߯cã#)•)•)•ï-5Õ™êLuWë”CÊ!åóØÙ¹³sg'©Så©òTy ÂJa¥°JZM«i5^„ 8†c80æÁ<ò˜<&¬À ¬x=MØ,l64ŸæÓ| vvvCÈVd+²ÌwÐaÐaÐèì|í|í|×úRæÅ¼˜×áõæ@s 9ªªªÇ*+ )D ‘PÒëô:½ô”ö”ö”õNõNõN@Ë/-¿´üÇ…ãÂq³0 ³âH‰#ð²øeñËb ~qýâúÅ@›¡ÍÐf¨ŒÊ¨ 2…L!JÕIÕIÕIØÙüÛxl|œ&S“©É̾  U†*CIF¸"\® GÅ^b/±ÈÄæ}øÃÃþœ»{îî¹»ÀóûÏï?¿ÔæÖæÖæ=Ó{¦÷L|Öù¬óY<ìzØõ° ÈÑähr4@ÇôŽéÓ;Ïî<»ó    ¼Ã¼Ã¼Ã&š8ýäô“ÓO$¢aVì†Y82®׌kþòWìØ?°@8Rà_à_àÏl6bùÄò‰å“É>ûfà›o+L-L-L}ý\«Ñj´Æ¢¢¢ëE/zÁXÚž´=i{+ù¬ä³’Ï^ºâ銧+;xê੃§ë0w˜;ÌìM±ñØø(¾Àø‚xÑKô½4ùeRKjIíëœ ¹r#äÀXï4Þi¼Ô[ÿmý·€{Ÿ{Ÿ{ d‚LF;G;G;iÊiÊiÊ×:Ô:P{±{î}Ýûº÷áM“ÐÍt3Ý ÙÈ&^"NÍ©95û÷à²ÁeƒËˆÍGóј#:):): _øÂijγγ   *ŽU«8´–¶–¶–n=n=n=€‚(ˆ‚þµþµþµÀ•íW¶_Ù´ïoßß¾0 …€Ù`6˜ »Ì.³Ë“€ÌÚr#FŒ<@+ ¡!4„ý[$M“¦IÓøôÖ™­3[gŠþÙ°£aGÃ’°tÁÒK`Ô|Ï|Ï|òGwÝ}tp u u ¶õnëÝÖ :=tø<ùóäÏ“§œzp Xó|Íó5ϹJ®’«€–- Zóóó@/é%½ Q4ŠFM‚Žêbt1ºÈu/t/t/pLÚ*m•¶ò鑈DdòYQ’(I”Dªªª,î_|9ð%äâ(q”8 ƒ·\Ürq PÓZÓZÓú:FC«‡V­h £a€C¨C¨C(Pè\è\è t¿ê~Õý Ø~{ûíí·ÅŠ?”£åŒCdWh+´ZÁ舎èp†Xˆ…XÎÙ‘3 Î,8³è¾Õ}«ûVÞó‘F>ùh³‹ç5Ïkž×,{cûbûbû¸ôúøúøúxŒ¦¦¦A">,>,> XT•E,É^’½$ØÐº¡uC+Ð×ל8q> >ćø,¥³t ”åCy0ÿtÿtÿt¢GEŠ Æ{/ï½¼÷’ÊåÃòaùðÃMærs¹¹|y&IìHìHìP‹ZÔþ%CÜ-îwÿ,...r . . .aÁkí×Ú¯µ'7ºnvÝìº ¦ß¢ß¢ß¢ŠUŪbÙ‡fš} :ª£:ó0ó€>ï>ï>o m]Ûº¶u€ºGÝ£îÔ¹ê\u.Œ¿Ùÿfÿ›=6æóùF\‘uɺd]ckÇ8Æ-Ù8¡óä#.È>È>Èž«#y$ä ¬ŸÁoï‰+ÄâŠmËÚÚÚXÝ ý ý =œ1'bNæ8sΜ3±ãÇŽ²œ,'ËøÀ>¶ò––Ô9êu`_n_n_ŽÁÁûƒ÷ïcJÁÇ|ÌÿjI´$Zigà œáÀy#Á?dàŽàˆÈÅZæY|'„E‡IÉ 7⨆j¨f_ö`öÐÌ+EWŠ®ñ» jƒÚ †œÄ“xAáSáSáS`¢†0„ÙŠ`âX"`ÜšÚÊ«g®ž¹zƲ·?«?«?K”!q‘¸H\.¤ÎM››67íëëHF2’ÉE´ -üJ[=ª@;ÚÑÎ?F<âOÊæ—Î/_š!Ý.Ý.Ý~!µß¯ß¯ßOd(J*J*J²ìµ9$®Ä•¸b8pF1ŠÑÿ9'îxFoÓÛô6$wtwtwt,¸V[«­Õré G…£Â±sÌô½é{Ó÷û¿zœü8ùq2ÀtLÇtp°ªäÚ@Öö’0E˜"LCˆ /S¼)Þ¿ÿ« Ág—šÊ›Ê›Ê¹ôÊ*?¨ü€“8Gâ ò„_×ÓõÓ~2[9-"ò—-Pª Aê@¢/ù0aOØA­JV%«HÌ:Uºeõž:ªŽBÊ–²¥ldÆ$£Œ>G*•H& I$&¬ +¨’4?ÔEê"À„®¯oå5‘²60GÍѨQ¥B}¡>àC~ ê-õÓtq‰K@m´»ÙÍnP{ÔµgŽ¡Ñÿ3„Jª¤JÒB €Ú¤61Í?fù7ÏêÍês'íG‹ˆx¿Pttêt©7î>¼ã¸ãϯ<ë<ëP¡ÉÐxhœyc¨g¨g¨üuþ:ÝCkÔµ&ƒï~r×wמ?xš=ͨïþÌ ædôÔçMMúÖz¿í–ˆHà=ø´ëÓ.ø×¶Aë Uí/øÓ¢‹V¯m­=Q{lÇmÇmÇaÐ7èôe«*ª*ª*`ã™g6ž™o<Ðh 4Ârïrïr/ÔjµÑÚ(,/³Ý²Ý"œ ûÃ~µºËºË åJûÉ2xi⥉7׉T-¬Z(2ùÙÈÓ‘§†ö¦Þwx÷1¹öº\.—H~i~i~©ˆñœñœñœˆ·Ä[â-ñ÷ùûü}"EÖ"k‘UæDv";‘-÷Ä=qÈfÃæ…›ŠäøÌ7Í7Åôìú¨6ªÚE*[*[D¤,o{Þö7× .*\” ’;útôiæØOž˜hšh‚­‡·ÞzÖZÖZÖZ 5Ðh ÀúâõÅë‹¡¹§¹§¹Ê—•/+_6Å®—_/¿^KìKìKìàìpv8;à·J/—^†Û®¯ï}}1˜>5} R]‹¯.¾š f¥ŠgnÎÜ4%–ÿQþG"½úqßÇ}RÔlh¹rúÊé+§E ƒÃàétwº;Ý"jÕ<ª9;|vøì°H¸?Üñš¼&¯ID¹”K¹D¦€)`±±±éÞ×½¯{ŸHöPvov¯Hÿ®/Ç¿—"ãˆqDD9µ,-ËeÒÿ±®Š® qǶ͍ý«·¾~=LÜrÁâ³ø þZýµúkv‡ÝawfEÚümþ6?TUUÁ؆± c`åðÊá•Ãpß{ß{ß ;S;S;SP0TðMÁ7àܽ=¶=FüÉßU“jRûáü÷ç¿õ»´ÑO½‡Œ‡Œ™S2Óú¬òY%DLcc(íö@{0«bĈSSS@#4˜cÌ1æµZ­V«A³jVÍ ‘©È‘QÚÑ™3+2z½rè•9§’Ï~ÖÇþ™î+ªýy{G½Ã´Zª^S¯:¦Ž©c 4¥) ØÁv 0¸q3gEUDETT®Zª–¨]jÓê—i~5ºº `ž2OE\Ñû˜Þùãzç­_P¿ømº3«Ï“É  ]{¬=žßù9É|X°`þ“¾+UP}¥¾"³ùgµ)mŠ„êM>I>þ¦wþzc½2úÏ/ñö®|a_/ì{ìÅ|ÁþÅËS÷l|IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-179.png 644 233 144 2644 13755454065 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜYIDATHÇÍ–ëoSuÇŸÖÝŠÛd³Y* #d¸d%”kK&Ä5i†.ÊAÉ#¼`K|†™h$Œ…nÁ¹%„13GL (uØ‹eDad#; 0;Ösù}|ÑžžâüxÞœ<·ï÷Ûó;ÏÓŸ€ˆˆLN>œ¯9_sæ'|çGv{¿Ýû à±ÿ±lßÊ[õV¿…—Ž/ÿáÌ®Ì.ÇmÈÎÊÎï[Þ·Š?MÜ,†` ¸ó”Œ‡@.¹ÊD‰bÙHšoå“õV¿…gá[|B€ûM÷›"Pµªj•ëH¢¡ÿ(Ô{ê=Ÿvh¦™\УzÀ¨5jR!8Àö­¼Uoõ[x¾Ågñ'ôȳg»»UUèÚ%0†a0”¶^[Æ‹øð¡*®â ?ÕÇô10jŒ£ —‘cä€ú@Õ¨Peê}õ>Jÿ3¾$¾MmÔßÐßHýàKŒ½k¼k*Éo¥ˆÈ¬Vt×°k8šƒ“'?Pi„4¯æ%ÆOÜá¶éè ñI‹#f»JWºÒÏùŒÏÒê*Œïï‰ñjKK€1×k(šaéI Ûÿ+Ôí¨Û<0ç¨/´­Áæ99>†·nܺq þþyhÝÙº³u'¾yøæá›p´èhÑÑ"(((ƒþ+ýWú¯@kÆ^s¯ C½C‘¡*Ü“àKñ'õ$…õnãÓkO¬M•oп//e|õ•Õ?¯þÙ>ðîÞîÞî^¸¼¼ŸÛçö¹¡²³²³²2.d\ȸ[Oo=½õ4Ì™4gÒœI0¿v~íüZ(Ù\²¾d=Üm ûÂ>Æ->Õv¼ùx³%¬w›@þ/ù¿¨S´ýuù¯Ëö—>ýûéßpòõ“³NÎoÄñF «£«£«ƒ vdÝ‘uGÖAÝ@Ý@ÝòòòÀâs‹Ï->gו”?,߬hËoË·ãFÕpÓpXz ò òÌë0rwä.p61öꄹ×Ük7.ªZTµ¨ Úýíþv¿Ôò¨åQ xxx@Ùcö˜ð ú ú ³e¶Ì4 åËòeùààW¶Øf¯cUdId Xzœ"f§Ùé¸.†Ð"â·ø¤@ $eÚ m†6Cļf^3¯Ùñcþcþc~‘¢Ü¢Ü¢\‘yÎyÎyN‘ðÒðÒðR‘™ž™ž™‘àÙàÙàY‘BUhš"ÅÅ-Å-)·£W÷èKS$êúûz$ãbèbHDÆDDøÐ1_ªB‰[yýyýyý"™›27en²……úB}¡>‘`m°6XkǧL™>"2:wtîè\‘¦-M[š¶ˆ¬Y´¦|M¹HÅ¥Š]»$.¿'øœÛ»v/Ié™0•ñä” ë×õëöTŽîmm†xc¼1Þhå“åO–?Y±Û±Û±Û¿½øÔøÔøTˆ¼ D žò2/£ÀpnàQ’OÕm¯Û>a*gµ‚ëžë^4Œ#…[ æZsmú†bÜš¥glØæOa S@½­–©eiûÍ«ïÐwããÔ›68 Ð\aWxÂKÛüTgWgfjó÷}@¶±ÙØŒÆ~.rÑÞCä‘K.PO=õÿ#¸™:Pê²Qj”¢Ñcì1öXIífufu¦õ¦žÙüÏíås{»xnïcÏç ö_üæå˜zKIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-68-grey.png 644 233 144 6250 13755454064 16007 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ]IDATXÃ…—}PSWúÇ¿çæ&! åÝZ„±A¥¼ù¬ZÖTÙÂÒ¦jÛ•V³þ¨+¬.­„þƪ?”¨/)+µÖ¥€–¦Â/ºÀ* ºŽ”ò¤P)¡ „—$ÜܳàŒ;}þ¹sî=÷9Ÿçy¾çžç’¬¬¬¬¬,¸`Þôóf#ÛÏö³ý´:ëˬ/³¾¤/äŒäŒäŒüî%êJ]©ëÉ}œ'çÉy®Iž«œ«œ«¤'pq‘db%Vb%€nt£@2’‘LOˆãÅñâx’ɳÃìð¿.’ 2A&þZ”½8{qöâÚŽÜÄÜÄÜD¢ã|8·lçà›l\.Ì`"Á\åsø>‡o2̳áùÐMŽ&GsuÀ¬3ë̺šãjãjãê5‘È d¸¹&fMÌš’¹V¸V¸V„º…º…ºö±ý¹}¾ý}»¿ÿ¶õìëÛyì|¬-ƒ¨u¢Nü;d/ÙKöú|>ŸúÏ _¾2|µÌͽƽƽƚÓÓÓÍXÛÛÛI¬8Sœ)΄à|)Œ0Âà=¼‡÷,Á,qÎ{Î{αíííÔR·²neÝJ>ýÉ–'[žlyûŒÔGê#õYï`ÝkÝkÝ]@“hMꇀ€€Ù@ŽÎ=:  hô~Ž­d+ÙÊÆ¿™Mf“Ù´l›üù+òW¸åûÊ÷•ï³W]¦\¦\¦ ‡<àŽúQ?ê=èAG8ÂÀ f0`V`@zI/é‡1Œa ¬ÞIï¤w£ò³ågËÏrïOàÀZ­Ö@À¹Ï¹Ï¹vÿòy‚<‹µ¯oç±ó1Ü 7ÃÍl 5kþÖümâÿ¸+Ý•îJê«üBù…ò Ö®‘)þ þ þ 81AL022ä¹Cî¸Û¸  5¨…(Dä.¹KîÌEæ"s´ Úí=MOÓÓp²ûWÖ*k•µìU÷÷÷êkç±óáXÿ±þcýÍÿw¸ñpãáFJ[¶´li٫輬iÖ4k]0ÓeÓeÓeJÛ¼Ú¼Ú¼(ítétét¡”{{{þ‡îÝ5º‹Òû§ïŸ¾šÒžžžJ­«Áj ”™™yaº¡EÑ¢hQð*;å|9_Îwʵ̵̵ '‚"ƒ"ƒ"‰Ú)ÇœaÎ0g€©ª©ª©*೺Ïê>«¦ÕÓêi5`‰·Ä[âåƒË—IHB€>UŸªO\–\–\–""""eF™Q„ÈCä!r`§n§n§v‰ƒÄAb¢®««à ÃfÃfÃæu*š<4yh’?quýÕõW×?ŒK撹䧙)ë.ë.ë¦4ŸÉgò™§÷'š&š&š(={<öx,¥ºuë>¦´„)aJJÏÝ>wûÜí§ó?4NiFYFYF¥C¥C¥C¥ÿQƒÇÎ'ØÀoà7ðÇÞ÷ÊóÊóÊê@§@§@'0¤†Ô0$–Ä’X ¾¢¾¢¾p r r z.õ\ê¹ônêÝÔ» ˆMŽMŽM¼^ /077t§u§u§ŽFG££ø¡ÿ‡þúéAéAéA Âa‰°B¥P)T.d–é˜í˜í˜3Ü2Ü2ÜBƧÀSàI¿™ › › CŸ¥ÛÒm醀’BRjÚmÚmÚ è/è/è/ƒG ènº›îô·ô·ô·€KÖKÖKV`&m&m& ð8áqÂã` 5†C»ýwûïö?ýôc yWò®ä]@¤©Ej-hA ¨ T`x`x`x€>FÎÈ9ý†q8åpÊá—ß·¸oqßbúM[O[O[ÏBd&Qº(]”þÔqX@X@X°#fGÌŽ`ÏÏ{~Þó3@TAÀƒ“N>8 hr49š ÊeŠ2)ù)ù)ù@†*C•¡:¶wlïØÜ»w?@8“ö ö ö  Òi‡ðÿ}}}\>%”Pf_d³Ø,6‹dÖ©êTu*«|u|ê8¤7ëoÖ߬çä"¹H.’d„Œ‘#< 'á$¼óOÈG>òYo[›g];ß7²ÇH) ·R˜ÍÌffszå|Ä|ª Õ„jB¹ýú=ú=ú=’T’JR1Ågð|€b£ÀìÀƒÄ @—Ð%t À{óÞ¼÷‚ªŠ«Š«Š­iÆ ã„‘-KÅR±ôZîŠÂ…+ ÏÔ#ÙÈ&C/zÑËEÛûQ0€®©HE*©|éúK×_ºžÿ‡}ûö]ËX:±tb)«/_W¾®|5; YN–“嘃B˜`‚ééæ¼àÊT0LÄw´w´w´4ªuQë¢ÖE‚|™D&‘IÏšKÍ¥æÒCŸt|ÔñQÇGÕR-ÕÂÙæ¥Äj´]KyGÞ‘w„óÃ_þòðÀœjN5§úDæ*s•¹ö—vkº5ÝA~õ›ÕoV¿I£H I!)óWø+üPH  “t’N„#á`ÕŽjGµ¸V\\ g™N¦“é>ŒãÃ}2/½Ç³6)ÎãP[§1±nû%Û†¶ òç»!k‰ $"êó¿õ7,û-û-ûùoóoóoóÌÆÀ¼À¼À<Äó]|ß)³ŠYŬ—Éer™Ÿó;çwÎϺB® ×… z‚‚‚ó×Ïošôf^Í«y5[h«ìŸíËÍÍÍÍÍÅ”=£°ÝXÐM»i6íÚ´ûí‚v“„$æSEcÑX¸ýú"}‘¾R†a†Á¤=µ¦ZS­‰7>V?V?V zŽ8q8ÒqsnhnhnèÈ™E¢GØåöï©páLÅ3öÌ©ÍÁ?mÚ½± ]•ƒÊAu-wÂsÂs“՗e•e•eYÓl½s»[»[».7Þk¼×x¼#í’vI»^ÎËyù&ö-ö-ö-Ó˾k}×ú®eÆmëýÞ~">Ë%ÀoXddddd$8Û°Š¨ˆŠÈÿêüuþ:|a]j]j]Ú‰}žbß7>ý5ú×è_£Ý®ë;õúNzúaÉÃ’‡%Ö 3–ËŒE*Ü(Ü(ܘáM‹h-úú&ÄC,x„qŒcœ_b¯€-Qܳ<ÿÅ~C»9¨F5ª­Ù´’VÒÊÈÞù]}Ûw6n6n6Ž÷ª…j¡šé$ ’Iu ~~~¿‹Ôöj{µ½äïüóüóüóôs›_ Ðø[ þ‹=£]Û皤 …ýI$‰$ñ~´šVÓ꿾'yQò¢äE¦S0  ½ÈŸäOò'÷ÿÒµ³kg×N`¾6¥¿Uêgíߤ–q-{ ÃIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.9.png 644 233 144 3027 13755454066 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÌIDATHÇÍ–íO”WÆïy‘aŠR]›*Ð¥qŒÑÐd AãÅB–—F*¡¿(1Ý4´–Ú’º¦m“u5Jµ„êÊFmME›Ö˜Z¶«S\÷KÊ‹bµ¤”´ƒØ)ŽÌÈ^(}¡à'×O.åã0—¹j &Œµ&fÙV<‘oÕ[x¾ÅgñÇû˜_0¿@ÖW¯¯öþ#^0ôOhÊhʰø´N`/{™ zXLƒº¬.àÀ¶mÅ­|«Þ³ð->‹?Þ½•¦ˆÈß×alÐ7è3 u›s5ŸæuÕXd,BK”2ƒfôQýGýGPKÔµ{Ýã.wg,eÞ×SõT4ýWíqíqPãø°arÃ$JðÏl嘈ˆÿxðþvóùͧn>Æ¿(áŒé7ýDf¦Õ”šv³›Ý³é ƒ Ÿ|òm· © ;ÙË^U  ˆP˜À_8Ü=Ü à {Ãa7ÿ‰÷“øc­~k¨o¨µÀ̵€V­=Z‹ê-í-ê-² {îôÜé¹ûwîß¹'ÜØscÏ=vܼ`^0/Øvß¶¾m}Û eUËÒ–¥¨Û×n¾{óÝ™ì\5²Å¿Åommk@ø£ˆÈ·¯ÃÇk?^ úU[ÓýÒ–—¶0mHÀð}BÕ§‡>=ÊïGø[jIj‰: ¿œúåÄžfËàÔ’“'&!ó̦Ì&¸T{©öR-\Ÿw}Þõy°À½À½À ‡ÕauXÁâ¡ÅC‹‡àªyÕ¼jÚl>Ø|°V®]5jûŸÈý,÷38ÜÿáíoľŽ} ºñH×#]ê´SÞp}ãú†¥rÁ=åž™³K¾“ïänõPMZMšÈµ ŠhÍ£yD´­F«‰¹b®˜K¤«½«½«]„)¦˜qFQgTfV™V¦•i"Ñæhs´Y¤l{Ùö²í"ƒ%ƒƒ"sþäîpwÈ]Wž+OÄáv½èz‘¥N1ÌN³Ó1(Nm½¶^DVˆˆÈ| 8fÆŒ˜!âÉóäyòDüþ¿HvEvEv…ÈÙÍg7ŸÝ,’t-éZÒ5‘@] .P'¢·émz›HðHðHðˆHŽÊQ9J¤|Wù;åïˆ<¦Ò‡Ó‡E|#Ùog¿-óE¼ùàMS¨ƒ‰Ãÿíëœ;ùÑÉ€´øKüñé‚‚ü‚|8==µ·¢(«(«( ÒSÒSÒS jSÕ¦ªMÐ_Ü_Ü_ ¹m¹m¹mгµgkÏV(]Wº®td<“±(c4½üZÊk)L'f·–þ“Ý'»¿ZgÌšJ­á­†·€Qk*‹ÆE˜<0ùÉä'¨ØØ{±÷ìÆôÕúj}5ŒGÆ#ã0ÅS@5ªFÕÕÕÕq¹U—!ö¯Ø—±/!ølð¹às(õ@_¡¯°§’PC]CÄõ´5h̼Ao0ì†áûÃ÷gøKˆ˜ÇÍã³tìWTAPÉ*Y%ÏÒ+¿ò+?¨>Õ§úfé[ < þ¬^U¯˜ãæ8••ÀyøÞð=˜á¿õ:&‚J(¯ªtUºlåÇ£éc@«1"¶òÓJ - ¾RÕEàÇ8üFˆ¨Õ£zˆßž 8`Œ#hêŠÔƒÀ-å¯tWºí÷ÊÿðÞ•íëâ¡}=œ/Øÿåý–©{®IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-17.6.png 644 233 144 2746 13755454066 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü›IDATHÇÍ–oL›×ÆÁÔx±Ý¹UT¨  U,U¢*Šóª£$•(B®ÈÚÐ?ëÔŽð§šÔfýP*%ªJm„Z%MÐHÓ@`ÑÀ͆Ò*U4E Hàdf©RRÓ9n\3üú}ïoì{Ëö=÷‹õœsîó<º×ç¼W@DDÖg~òžÌ{2Ï•Æy¿ÉÆ Ÿ+|®¢?ë`yÁòÂì!xôãG?(ê-ê5®g±™7ës÷‹dùsõ̸¬—lÀvÎvÎâÍà#ðâ–·>–Æ€}Ø>ü¯4ÑüÀÐgCŸñ|ÿÍ÷ßüèýÑ YlæÍzs¿É—Ë/GþK_ F F,·Àöˆí(Ý]º»ü·é‚¿—CÃó Ï|—ÿ]¾ÊýŸ€‡òqâ˜+’ƒÍ|¦ÞÜoò™ü¦ž©Ÿö#à~Öý¬øöùöÙÿ˜Þpý ¼[òn‰©§ ïó>HÅSqýýVAT Èb3oÖ›ûM>“ßÔ3õÓ~²WiˆˆtíBoL5¦Ö MèhnÍ ¬Ó_×_GSð4O£R÷Ó‚úËz“ÞºKwé.P;•×<§œ¥Tsª3Õ‰–šÑŠ´"0n¤ù¡ñVã- žÑ_»ÊE‘Ên°/ØâVþ:_6_ú×Ôñ¥±ÍØFbM"Å}îóÿ× +¬äà l`¨oÕ¢ZPMª‰eøŸ M„&ìq{] þFãÿÈŸ©=S{¦6z6z6z ý£öÛ?„Ž?´¯‹‡ö=öp¾`ÿ B8a×ÏKIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.9.png 644 233 144 2566 13755454066 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü+IDATHÇÍ–mHTYÇŸQi(7XQB·è—>” EÚ›ö" ¢¹Ÿ"‰í…¢d£ØÚl K*¿ìFÑIe/ÛË,[áW†Ôš¢l+uÊm¦L­™{ïù퇙뽵´Ÿ;_îý?çyžÿŸ{Îùß# ""©ñ§€3Ë™åÃεV8ÀÂæ¼™oÖ›ýÌþ&ŸÉÓ#¯íÁB”×íuQ€èŸ ÷è=`<Ñækó‰jëcô1(5KMUS±Æ[ÞòÖ‚Æ;#d„@{­OÐ' ÔZíŽv‡(è!= ›ý½IÞ$SàÁBÛRŠˆL=)})}ƒ‰ ÖÒ,Sš^¡W0Ì/4ÓlÒB -@%•TZaVav³›Ý¶üB6³øZß®oÉ–ñ>ð.ðFùãzâÂÿ€u»Öí‚Øþ0f«pôYô™Åçêøp¨àPÁ¡ôúý¶/tøaܰ°««+-8Zp´·?¾óøŽÕOýõE}£Õ³GùãzâÂÚ·Á™7gÞ€Q ÖÄ+>´=iëlë„ÔºÔºÔ:(­/­/­‡¬GY²ÁÃÞ‡½{m‚<~ßÙUÙUÙU0·anÃܘ²~Êú)ëáEËÚµ£éÔÏ&_ŒßÔ#0öæØ›ª úòûòÁøžÆµ¥×–\[;î\¸s!\¾<|yr[s[s[¡½¶½¶Ý"âð©Ã§Ÿ‚yÏæ=›g}qòòò aqâ†EV\ÿÎ|‹ñ›zEV$¬`†ˆë¾ë¾Cœ'EDäq©° Kz‘VtµèªÈœ=söÌÙ#RQZQZQ*‰ŒDFD\Ó]Ó]Óet” • • ‰œØqblj"%%%"]·ºnuÝIô&z½V¾¸ã|âºàº é" Ó¦1Ã)b\4.:ºD´•ÚJ#V”.šs¼s¼È‘oäÉ)ÓÊ´2MäJë•Ö+­"d“M¶ˆ¯ÜWî+Ñ6h´ "Á-Á-Á-"“Ô$5I‰,¯Y^³¼F$M¥©4%’s1çBÎK—ã^œ/Î?ªçÓ=¦ö|¼Çz¯÷¶ô¶@~q~q~1¤5¦5¦5Âj÷j÷j7tŸí>Û}rC¹¡ÜtìïØß±Š ‹ ‹ !sræäÌÉP½©zSõ&ÛñëÛôm|à×Ïî±ON¥yJ®jMZ“uŠ""{#{!ø2ø2øŒÆFc#¨5jZ1{U>ˆ\\\‡`^0/˜ê½z«,ŸS¼ÖžjOõ¿§ÒæcC776û]ÏÐ3VÇT›j³ù•[¹•T¿êW6ÛÀƒ¨¥j©ZjËŸ¨–©eÀú]ý®ÍÇ¢‘ÀÈg}Ìæüx“½É€f:³Þ¥w?êôDÕeÕ£zPœæ8Ç0¯y ªSuªN`€W¼ê8ÀP·UX…Q´3™DAïÐ;}Ôùc|ÿuþ/ö_ùÅÞ.¾ØûØ—yƒýã$ê"¾FIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-29.png 644 233 144 2532 13755454064 14674 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[LTW†× rõ‚FX¥¦± `T"11( 5•L½iJLÄ/‰ØjBZ/E‰™‡š&m}À j ­AoD¨Æ"Á4ÖD` ¢†§s:çœýõaØ3§¾{^NÖíÿÿYëì5[@DDƼÜî ÷¸°íÞõ''úKØ>ekµkõû ùDò € §'œ¶»£¶Žë|g½Hßɧý2^¢ŽøÆøFWáˆ] ks׿&¤†íooBâ…Ä oMØzqëE€ó?žÿ‘/ÁÛàMá›BˆÚ:®óu½ÆsâKíÿøE ¶9¶Ùõ âãâãD`ê’©K¦}Nøs”•–•ôÆôÆ(7X/1ŒQ…À0ÃègÐaëøH¾®×x_óiþ°”E)‹D`UùªòÄÂÝ?AÍ”š)š/t8Ä!Æ€9lXV¨›ê&.\µu\çëz§ñ5Ÿæë‘ÿÎö»"ð&x"‚n°Z­V»Þ®'¤>Q¥ªe>6˜À¾gßµïF:†ýÚ~e¿ó•é7ý ¶¨£ê( ì#öB¬«ÖU~„Oó‹SÐgßC¢?Ñ?< žXO,à-%`·Pƒ¤‘|A9åQ!\á WÀ~i¿´_4Ò舱€À$Š(°ëì:ü­ñGø"üa=#ÂNýÛ÷oßùݳôÔϪMµ¡t¤grÏäžÉp,ùXò±dèXÚ±´ciTÇÃʇ•+¡~fýÌú™ð´óiçÓÎh\ý®ÔÊ1â>ÍÖ3"¬sœ:3)ßd÷…‡chO׬®Y]³ ÃÌ03Lðìôìô섬î¬î¬nðmómómƒœÝ9»svüìyÙó²aFÕŒªUÐ×Ð×Ð×àøµ9Ýœ®ñÕ¦(XÀ¸¶qmªüyþ<Ç·kv˜Q»icÓÆ¦PS]S]Sõ{F{F{FCîâÜŹ‹a厕;VîˆÆgΜ= Å Å ÅQ¿UhÆ›ñŽ‘GøÃz&Œ0Ö~ ƒ}ƒ}Žco)¿òƒªVÕÊ!¤§¢§¢§rzszsza™g™g™ºZºZºZ ¯;¯;¯Jö–ì-Ù qsãæÆÍ_¯ÎWç¶ÌœcÎq®ÍÖóþŽ=°,Gëµ>j}Ô IiIiIip0é`ÒÁ$°óí|;Ú›Û›Û›Á›åÍòf/Å—âKô¼ô¼ô<¸Vp­àZ’ùÌ|öþ޹E† ‡ ´‹Ü¸~ãºè³º™}Ö:kü£=÷ûÆ}CÄh1ZŒ‘Ë—+.Wˆ¤®H]‘ºB¤3£3£3C„2Ê(©Í®Í®Í©œ_9¿r¾HÑ­¢[E·Dä‘Ü“{"îo\\4>›£ü#zÞ{*ÛÌKæ¥è·j|dL4&ÂÀ;w ?¦?¦?ú3û3û3Á¨2ªŒ*5…šBMð"ø"ø"*¨‚*èhÌë0Ê2‡|ï>•ïØcDöØz{=´ â$L%•TPËÕrµÜqú¦ªt•ìà$'ìö„4þ»÷˜+²i%¼yE¼ Þ„]×Ä<<4oK¬ýÄ~[ û%NâÄd¦;àÈ(ùX†dH\ò—<—ç"®·®€+ž‹ Âçd’)âŠså»òÉW{Ô±ÄÆ‹Wb%&faÌBó¶ÈšÄ5‰±"çŒsÆ‘%a5¿~Èÿ•ìí⃽}˜7Ø»Ÿ(í~£IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-4.3.png 644 233 144 2425 13755454066 14751 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÊIDATHÇÍ–oHTYƶ¥CYcºD ÌÒRH } ÅFÉ(´$ –• Å¾d,ÊÆÑ"­V›”´˜µ,”(Eô’6+„vItµAwrÉÜ×ÿOsÏ=¿ý0÷ν%í~õ|¹÷}Ïû>ÏsÏ9ï{!„Nã) >=>=~yÔŽÿÒò'%}úKÔn”WWÚó ¬hXÑܜܬ÷Y¶9oÆÛó…°ðí|¦_8…åH¸šp5.ß°ÂîÌÝ™‰GíïÍÑ6­AŵŠk­—Z/ñŒ<yð&ÿM>X¶9oÆ›ù&ž_}_X|sñ͸ç°$a‰àò¸“?ªG@j^jžPâ-ñ:.Dú~†ª´ª4“/Òç8Ë@›Ô&乇0¨ûê>qÄe›óf¼™oâ™ø&ŸÉÕ#ÞÝÛº-P–X–ÔÉ„ôI€Þª·QU“jBééú*}Ö"d™z@¦?í/¹T.E©Lí”vŠÈ19Ìøª,¡,ÁX·Å¶•B‘ñ8F#“_ú% ôZ½–r¨ ÔçÊ«¼6AA‚-SiJSpŒc³ÅÝ @¨äf o1oý³þY°ø£z a¿Â¾Ãû @ÏMÓ4P?*ŸòE½ö@{ îíº·ëÞ.› §r*§ewuuA½»Þ]ïÿßþ!ÿ®Z"Í‘æØúfÇø =†°ßÂåÐåD¿E}ÁO²@Vª^Õ[„ZV Áæ¦ÍM››˜7º®w]ïºΓΓΓPÚPÚPÚééé0øvp|p<VnƒÏä7ôXÞ±¼C]…‘#Œ:šÒîhw,ºʺʺJÅEqv¶ïlßÙ>_ØíÐíÐíÔ”Ô”Ô”€oÚ7훆¬¶¬¶¬6èþºûP÷!ÛY|n¾ü†ÉIÉIú0:<: ú'±²Áƒ7!Û“íÉö@õÝê»Õw!wuîêÜÕ6‚1}L³Õ‘БÐØZ¸µpk!d¸3ÜnèMéMéM±å…M¾(¿©gÞŠÉâwWà„÷Dù‰rpL9¦Sàòº¼.¯UËçÒÎ¥K=UOÕS¡öJí•Ú+PtºètÑi gÝuÖ€óçÏž?kùåg\±÷ÎØïæžë{õ½„ç çÜsnÀ… œé<Óy¦<OÀ€à“à“àÈÌËÌË̃Ç]»wAΦœM9›`åþ•ûWî‡2Q&Ê„²BkCkmglöƒg콪ŒU‰Ñ}<å©U•sÌ1LôOôOôå”S£¹£¹£¹ ZT‹jÈúÈúÈzxõòÕËW/Aþ)ûdŸU•ôh´Gÿ[•¶>¦ùÃþp  ˜ïä°fFuªq5”SB ÐO?ý@UTÙÚÆ-uKÝÕ¬šU³Í¿DmP@Ëír»­Íø'ý“ð>ö?";d€^£×á(-´ H!‰$`*úoT½ªWõA^óø–jªAùT@P\Hˆ€ì‘=€fàÇøæuþû¯\°·‹{[˜7Øòù³‚⹯IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-57.png 644 233 144 2343 13755454065 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܘIDATHÇÍ–_hSWÇOÒÚ´k+üÓZp¥QA˜ÓDí˜8Œh‹bE BX£…½L†",C¨}(J4‘¥ZƒÖ?DÓ.µƒÂ@⇦´˜bu±%zï¹ç³‡››{·©0öÒórùžóû}¿ßû»çüî „¢®ôànt7ºkMìþÊž¯ÞV½í“>÷Jpµ»Ú zôÔ_¬¿h<µ±µnÅ;ó…°ùzÖ¼¨ö„'éIºZKø$ì]³wMµÏÄ‘A¨¨˜Ñ¡ófçM€ëñëq¾†‰‡¦[§[ÁÆÖºoå[|N~qòúBÀ¼Ô¼”k“€`;!#Ä,ã¥âýIž<ÿe¼å­A#Èl l/ë•õM?%c½¿Âá‡O”“?%¦ŸÕÏ–Ù”6¢¥µ4 ÄâqèyÔó¨çÄÃñp< #3#3#3Ðëïõ÷úá¼~^?¯C“ð$<ð$öäÜ“s6ŸúM»§Ýsè•õM?%c¿ƒË¯/¿.ç…T^èû]§“ÓÉé$øÆ}ã¾q$‰@ŽT©8R±†XC¬6¯Ú¼jó*øþ€ßÞ(Ñl4ÍÚu“Cï½;dñ«­oúP{¿ö¾JÂĺ‰uŽ‚‡äJ¹ÒÆÃƒÃƒÃƒP¹©rSå&tº]{{{ñïOÆ'awbwbw±ðœ9àÕ®Ú–¾éG@ýüúùF¦žO=·½qJ•Gí´twº;Ý ·:ouÞ‚þ3ýgúÏÀòðòðò0$SÉT2eÇ7^k¼Öx Ò«Ó«Ó«/Ügô}*¯ì½:eë›~ÜB·Û®Œú.}—°Æ"áãb¼ŒÅ›ô›ô›´ ƒ ƒ ƒBt„;Âa!|E_ÑWÂä¢ÿFÿþB,mZÚ´´Iˆ™™!Ô˜ScB¸?s¯u¯Bh"#2½²~ÉÏ÷Ø·ú}‰½Çr“¹ÉÜ$¬[?¶~ ê²uÙº,쿲ÿÊþ+vE:"‘Žœ.ž.ž.:*UeTU@‘—¼—ä¥î±œJ«1>$K¶Ô<-£e´ ä›óÍùf0ÚŒ6£Í6ðêૃ¯Âìèìèì¨c ýLŠ M'ŽÆû±Sùž>6cõ#jD™Uê   ¾T­Ö@5«fÕ ,cËFB„ÿ¯½§ó›õB—äã˜q w¸ƒR¿¨»ê.p‰8q‡n-^¼Àqºè²ý£A#ˆ2-Óþwþ9û¯œ³·‹9{››7Ø¿§åzhsŸ¾’IEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-coords.png 644 233 144 242 12610450011 16414 0‰PNG  IHDR Vu\çbKGDÿÿÿ ½§“ pHYs  šœtIMEÜ!/ ŠŽ/IDAT(Ïí! „Àÿÿ‹ÕpÁ&mÃj•n[ 85,†Œ¿áIÖ?”´H¡IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-5.6.png 644 233 144 2616 13755454066 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜCIDATHÇÍ–oHTYÆŸ;f3¦©™e„Q¨Ë.V´»ÄnßR3\ t%µ¢Ä\7†…À>l°±F„A²±ˆ¤…,– EXk¥k‚ȶ›:Õ°›™Î¨ÓøggîŸó쇹gf6Ùïž/—÷œ÷}~çÞóÞl>AZÖYÖYC±åÛȼ­ÀVÙŠÏë¤R¢” þ@&5&5’äŠK+.Ï#±\—ùÑõ@D?š'瑌Ȅõºõº’kÆ'ÉòÍå›m«BñÙ.2Îç˜ÕÈÃ7ß$É—o\f 9þdü INåNå’‘X®Ë|Y/õ¢õqò>@ÆÞ‰½£üMZ—Z—äúëwf|Jø+ƒ,Ú]´›$GcFc„…$I}‚dD.I?ý”ÃËu3_ÖK=©/y’ò25'5 ¿Þ÷õ¾¸ÖPÁó_ÈcéÇÒ%Ou<ÍÓL 5¿æ'Iý€~€Rt‰.’¤B…ŒÄr]æËz©'õ%OòC~ðßwÛO­tIé’°¡öègô3¤þcp$8BUߨ—éez¥¾_ßOr7wq qXTŠJRûC jA ã–¯åS%õq}œdÀÔ¥ÖR«4Øõ*à“ŸÉ¸ñ¸qÿ —êRÃú»øÆÈ1r8Ç÷á9Z”ƒyÎs>*Na SHñZ¼¯£æâ}Þ'ù‘~J?ʰþ?®× æ›~Lcç»Iû û ’—HÒø”4JŒRíSÇÔ1 ÇeG‹£…l*j*j*"[úZúZúHïwÈ;´pÇ^Õ¼ªyUC6\l¸Øp‘ì·÷ê?ÙP¡«Óê4É)É3ù¦Khß¾¸l¯Ý^ °”Ï‹Ãâ@pvdöÁì(ö<{¡½èHíHíHz”¥G|¾F_#ÂÃSï©÷Ô•••@··ÛÛíìóvÃnk’’¡(1±É±É ¯ä…øÒH|”øè³/œ9;~J«™a}™örÃË ÀôÁéƒÓ#Þˆ7â¼ì¼ì¼l ³)³)³)b¬c¾c¾cp/w/w/Ò­éÖt+PP\P\P ¤'¤¯J_N·*k%/Ä—~,@LQL7±·boÈxe¥ñ§ñÌxTÕVÕVÕ[*¶Tlê¶Õm«Û´=n{Üö8b,P( 6ŦØ`Ó‹M/6½®׌kÐëîîŽäócÉ3ù¦ `Ü6n+N@+ÖŠØ©²pæ·™®™. ¥"¥"¥Ø[½·zo5°f`ÍÀšÀãö¸=níhG;ÿ0þaüC ¡3¡3¡8ráÈ…#€ÄÁÄÁÄAÀ­¹U·e,CòL¾ôúØ~¯%¯ø®øHQK’âó# Œ¾uºÉ­#[G¶ŽI­I­I­du :P ÝN·Óí$³fÍ>J¾]ùvåÛ•dUsUsU3¹,¸,¸,H–¹Ê\e.ò}Œ/è ’$‡9Ì€’âK? O%ÍSòD»§Ý‹œ"Õ©>UŸ’¶ Û„"Cd"M¤‰4ÒsÎsÎsŽ4ú~£ŸWÅUq•ô÷÷'õz½N¯‹èñ¹Ö§õEñ>8• ûجËçòEú˜èÕ³ô,Ή¯Dmh7Må,‘%²H®æj®Žêå,g9iø ¿áÊ_' E!)æô=úž¨>6ïò»üÿÛÇ¢:?Km¥62ÔDÕRÒ‡HžÕ'õIªâW1&Æ(è`;ÛINq’“¤p §p’|ÇqŽ“¼Ï»¼KŠná 6몮R ë…õMÞÂοhÿ•‹öv±hïc‹óû/nÁ“R9¸kgIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-30.6.png 644 233 144 3112 13755454067 15026 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÿIDATHÇÍ–íOTWÇÃÓ00(ú¢ÁV‡`èv°Ûµ ¦í­‰6„vØÓÂdUØv³aiXhô›4îvuul#!lV£AQc$¡KV WwuVCÖX pxÐa‘™¹sÏg_ ×!ý #/iM˜Ï˜Ï˜Ëq#|˜ûanâÚHüÇ«`9g9÷? öžß{àlÇÙ>~˜sÌ9 u£ß˜7ðVâKãøE þRü%Ó(˜Ì "ðÒ;/½cûU¤áž Jv•ìø>öûXáG€«r~üË·"6êËýƼgà|D@ÆÛo‹@iyi¹åDd໿Àg™Ÿe|¡sÀ|4¿æþˆ¨«ê*&LºÑoÌx¾ÁgðGôD?墈ÈábpŽ8G@¿êׯCY¡,P´<-вR¥¶©|•ÚµQmTªQ5D×ãŒ?‹”Ú«}®}NHs‡ÒCé {"øàuŽ~ƒßø”Éù3Xü¿?Né#ý#ýÀïØ Ê®ì,ò0B¤Ž©cê°…-lY!ÄŽ;° lX‘O"‰$PcjBM¨Ýj7‹üiÓ2ß2?ƒ=‚WD¤õšb_é¾RMÿé¿Ço•Ü*#…GÞ8òj¸u¸y¸9Ê7b±Ø¡yuóêæÕ0:4:4:­ëz£Þïr¿ê~þæpÛá6ÔͪÁ¡Á¡(Iû>Þ÷10Ñ#á""ÿª… ]ºà»î½pïåJû}ÊË)/(ÝSê,u‚­ÊVe«‚ëG¯½~ š š šÁ°ìȾ’}%û LošÞ4½)*è‘ç‘ç‘ s s s äPÉÁ’ƒð³òÍÁÍAîããUãUÊÝÞn/è›#zbL{“ç“ç_ËÙž´=IäñÅÉÙÉYÓ‰_~û騧cbv=q]A‘;7vŠœ\wrÝÉu"ñ®xW¼Kä®ù®ù®Y$ukêÖÔ­"]]]òl]νœ{9WäAʃ”)"™æÌ´Ì4‘e;v6ˆyýoÓ/¦_4)°XEL—R:S:_ˉq'¼˜ð"¯ˆe))_äݘ·od¦n[]e]¥HÓö¦â¦b‘`M°&X#v‡Ýa·ˆõ¶õ¶õvTÀªŽU«:D¡@(Šæµ"­H+I4%šM"v}Ø>,rZ?m;mh„eF$m,mLDÅ‹Sœ¼§¯ MC±K©_¦~)?9ÖÛò^Ë{’Ñ£÷œ÷ˆôþº÷«Þ¯Dòly¶<›ÈTÖTÖT–ÈœcÎ1çñ¶x[¼-" ³ ³ ³"6·Íms‹„=aOØ#b·Î[çE¬}Ö>kŸHµµÚZmùúàñ¢ãE"-6H†ˆ£ÏÑ'ÂZ}ZŸ6 ‰2ÿX×¶®m0Y·T¼T¬\[Þ}Õûª—ÀšÚ5ÕkªÁÙãìqö€ÿŽÿŽÿ¸\ ®HÎOÎO·õêÔƒ·Ô[ê-…œîœîœn˜¨¨¨…ʶʶÊ6H &Í'ÍÃχ>¨û ŽÀãÿ(œ±œ±€:ѳìc­×øvÜþ¸è. þá©ã©¦c§¦P‘7°b×ùtŸîƒ™þ™þ™~Põª^ÕƒÊP*|í¾v_;è7ôú P§Ô)u | ¾j_5*|(øfðÍ»rx¿m¿Í0ÜÖkÂÅùX_ÄWÔ‰g>¶GíaQå¨×Õë *T…ª•­²UvT¨:¤©C@T¬ð±Ý”Sº_Å©8U¨ YT‘Se§z:rkä€å±å±?Ž¿>f8Àp޲زXà7gV=Ú¼6|ž OFŸ tÑêŸê¦º ôÐC0Ë 3 †”[¹ïr¯nÖÍ„Ô5í‰öh1œ¿,®,¢üÏñçö¬|noÏí}ìù¼ÁþéÒ»õèµñÕIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-4.9.png 644 233 144 2427 13755454066 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÌIDATHÇÍ–_hSwÇoël°jS •¬âÀ?4_’N,mª­T ƒÌQ[)Êtøà0Z‹”êhµeÌ¥"hû`ÑÒ+{P[ç,aš‰–"ÍLÿdmbÏr¹W;÷ÜßËÍ÷üÎ9ßoÎïžs (Š¢(K§Ù«³Wg/Nãìý¦=o[Þ¶Ï~Iã6 ²vfíüý[Xr~Éy€‚K—ô§&–ûÒ߯(f~+Ÿ´+KÓ{5÷jV¹Ož {6ä}’ÆgÀvÝvýü7ü7º;»;ùÆî݈•ÇÊÁÄr_úËx™Ïš_9ù¿¢ÀÂ[ oeý¹9¹9ŠvÝSÒvø³vxwx^-xµ@d€6,b‘(¦™F®¨Ë}Ã_ÆË|2¿ä“üi= ,ß²|‹¢@µ¯ÚgëH<ýšŠšŠ$_ê:pŠS,uZÐêµz’ ÄYd‰å¾ô—ñ2ŸÌ/ù$ZòîÙ¶TBM^M^FPˆ)­GëлõnR¢Q´‹v„¾Z_©¯Ä\“L2iB=®Çô¨o´Ú „دªƒ¤@‹i1`ÆÈOMnM®ØRi9JEQ”ÏÛ˜mlú#ka HPúiý43¸ðãñ¥ð ŸEÐ8㌛P̈1œà',~•âP¨5kÍiY@‰p<“?­ÇÖö+8~à8 ôRPUUñ“è=i+@¤7Òé…»»ïî¾»Û"È)œÂiâáÃLJC°,X,ƒçž>4ÝÅÃÔ@j SßÒ ¿¡Çö ®L^™”%_Ñ¥Uh$E›8'Ι„j…Z¡ÂæöÍí›Û™³w<îxÜÅþb±\­®VW+¬=¸öàÚƒ0Ú:zvôlÆ=)¾3ø$¿¡GÅý‹ûÅUsŽ9¿>Š«·ÕÛ&aKCKCK(—•ËÊeØÕ»«wWï\aÁ®`W° Ü/Ý/Ý/M»#êˆ:¢Ðº­ukëVÓ®}!ü† ò òõ? :ýÓLÛpóÙÍg7ŸA©§ÔSê£}GûŽö»Ð]è.œ+,²1²1²õŽzG=xxx@ΦœM9›àbàbàbÀ"¬Bò¥ù¥ž9ÓªÞ%:ã;Sw¦lq[Ü»Ïî³ûÌ^nëlëlë„x,‹Ç 4 BíÞÚ½µ{áÂì…Ù ³°Ê¹Ê¹Ê }î>WŸËÒ½+>X±÷Þ±‡òÌõ}ú>’‰­‰²D`ÇŽ‚¡`(OÄñD Z-‰–ÀºÀºÀº ƒ·Ò[é­„¢5EkŠÖ@SCSCSƒåkZ#IÚ?øŽ½×•™.1cC ™]™ A˜™™ꨣ¢®¨+êJW1oï¼½óö¼v¼v¼v€Hˆ)1ev%oÔê ëøÏ®´Ì15œ '3 ªø^ÕF™!1!&€:ª©Fah¦™fK%–±Œe ¶‹íb»eœØE•¨¾Öîk÷-s,ž ÏÂæØÿLþ”Ö¯õèÇôc¤8É5®!ø˜|òxúÛ(žˆ'â 5'&Ä‚ßôõúzR =Òš‘?Ã7gòÏÛoå¼½]ÌÛûØü¼Áþ £Í§?~²CØIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-21.8.png 644 233 144 3001 13755454067 15025 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܶIDATHÇÍ–oLTWÆß; #,Åì˜X‡Ä#u ©Mø¡­‰5d)SI±µ›mÜØØ´Ùl´É4]-!þIÆ‹éÂ6$dš`ÕTi´Ft,è`:­iÃÖ±"# ã2÷Þ9¿ýp¹^¶~Ù¾_î}ÎyÏû<¹ç¾Ï9""R¸ðp•¸J\v½áŒçnÌÝXö™…Ã&huZÝ?ÁSGž:°ôÄÒ™›¶çíüÅëEœú‹ùìq)g §7§W«^Àû¡áÙ†gs—Yøà0xû½ýÿ1 íó¶Ïú>íû”ßËw.LWOWƒƒíy;ß^o×[\_öÿ‚_²³µ!Ç“ã/­xÉÿ+á{?¼úÊ«¯ü”õS–r€yÈ'_UI’Ø1µÛó ùöz»ž]ßæ³ù-=¾*_•Ô6Ö6z;­7»áÝâw‹m>½"Œ¤‘0›ÍfæA «a44p°=oçÛëízv}›Ïæ·ô8[™ùäEÞÞµ@¿`ÜÔŸÖŸ†ÌU}BŸ@_PªlÉ™¼Ì’ÌPQœ˜f’ÉGHetc©±Ýø—^¤ZaÕ‡àdpø·Íooå)‘À!ð&½É¤[%bb€ílõ‚ztÓ ªKu©.0fÂLýôÓ¿HÐ,³Ì:PÊPð!!BªJU‘¢k¡~Íß?×,= _,ü•Ú©íÔ}‡ç¾-ŽF£Qèx¦£°£ñGü?ÅñÆãÇa¬b¬b¬ÂÏ4eš2Mûl¬{¬ÚÿÜþ^û{¨o?÷Œ{>5´3gg޽µá¯$³^D$²Ž ƒ_Ä?ެZKREá¢0óUSUUP:Z:Z: Ã=Ã=Ã=Ðk‹µÅœž::ttèèãÂ#¡H(‚•á•á•a¨3ë’uIX()a~|æç/þRµÂ@` ™7,=.þ–בױîy‘—_ùu‘[ £‡Fi¿{ÿµÎ×:%çœï\é¹R‘‚}û ö‰ŒÔÔÔ‹l‹o‹o‹‹ŠÅ‘̪̪Ì*y,ô´žÖÓ"óíóíóí"5ZÍ’š%"žnï%ï%É™;ϼgj"Õ¡êˆò7ço^÷¼;«ÜóçÖ°7u%uE“Ú™Mw6Ý‘ÄêÿFÿFñ­=¼öðÚÃ"Ë®/»¾ìºÈ® »6ìÚ ’w5ïjÞU‘’Ê’Ê’J‘tMº&]ó¸°tyº<].’&M‘³?Ûu¶K„rÊ(‘A–³\²%;–Ÿ<ãzÇõk\êŸÆvc»6®È>}@äÆ_bGbGÄ÷Û³ëÂëÂ" m8ÖpLädóÉæ“Í"¹Y¹Y¹Y±qÞ8oœÑú´>­ÏŸ®®® †GÃ"e»Ëv—íØ1°c`‡HöÙg²Ïˆ\Üúõô×ÓâqÇÝqUkºL—6.ƯílhÍÐ8ñ«[·T«ë¢ˆó+öW쇂–‚–‚è¹Üs¹ç²óUöUöUöÁ©k§®ºsMsMsM¸¸¸ QwÔuÖ̖̖ þP-ŒBí¶Í7?d>q\½­ÞV­Ðû]ïw Þ·ô­.€·ö¾µž¶ºdòRütü4ijâ¥ñRT|W¼5Þ s·çnÏÝv„Íøf|3>ЃzPØÄÑM¢|… ;n FÊ*ÈF>ã–¥ñ‚—‚5ä F7D„l­$8Šnp‚¤¸¨™ÄÂÂâ„Û (”( ÀH``fzúìL£e*•÷Ÿ®Ó§Ïs~ýžç¼}šdgggggÃÓaŸ¾Ðeü-þ‹Õd—e—e—±ÀÜÁÜÁÜÁ?-b~Ìù}ô7!H‚¢ÞvV9«œUìC”¢¥$ áG8€Nt¢ÀÛxo³kkkH¿Çß»^JFÉ(Ý]’37gnÎܺ¶¼´¼´¼42 è #«¦9ļ\¾t0qˆ£_‰¹b®˜+þàšpM¸&æ,Í5åšrM_õº\®Ú«ŽçÏ;žÚásÔç¨ÏQTG­ŒZµ’dEË¢eÑ2`©ÿRÿ¥þ€Ô–ú¥ç¥ñ’ÞŒ¾w>i~‰Gâã½|‰i™–iÅõ$¤“tÝQNÇé8]Ãç_N|9ñå<ÿ€Ú€Ú€ZÏö•+;WvRw„%Âa!‰Š,E–" ìÁì8à°±ÀSx OÁá v;ƒ‘h1[Ì3sׇׇׇ‹Û‡_~uøÕÔÕ:µN­û£Ò“îI÷¤¯8Ê2X˸µž€€€¾DöOíŸÚ?À 3ÌÁà«ø*¾Ê|Ê5éštMÎ[­_®_®_.ÄÞ5¼kx—ÿÊwÌwÌw zÌÆl̆ÀÂX .t¡ €hŒcãæc>æÄJ¬Ä ðÀÛµv­]‹žÊO+?­üTXßó}Ï÷=ßór•\%Wݾ ¬Ök^^‡—ñ2^¾ó U]S]S]d²@Yàû—æ­Öô½AHÌHËHËHã}9_ΗÃlñ¡øP|°t–ÎÒÁ#)HÈ0&Ãé$¤óQFaÄd1YLï‰ôDz"Y=³zfõ`¶¤¯OÖ'ë“…Di~‰Gâ£Â¸0.Œ¯ZêúÆõë›´ † 5”Ê å¼ä‘1FeZ²›ì&»b!bÈ.²‹ìf–\ %”(((@ÆÉ8è z‚ž¸›ÜMî&À޳ãì8´’¾¡ÖPk¨å¿ HHHf¡ÄGY8 gáÿHqÇ»ãÝñ@BsBsB3Vú–û–û–C.6‰Mb´¸„K¸ãä89XG­£ÖQàòáˇ/ †j€å³|–@„²Y‡¬Àuÿëþ×ýëÖ­?Ø€ ذ–À õ=â{Ä÷ä ­ ­ ­X)ñH|TB…ÐÿyÇïß¿ø02>2>2ž{ßTNch *P½ž^O¯0u›ºMÝ@×ù®ó]ç1R†oVܬ¸Y|ÒøIã'Àwô;úN®>¹úäjÀ¨4*J€\"—È¥™áòHy¤‡p‡H85R#5Î Påd9Yþhb]†.C—h8Ðp 8™t2éd0ùõäד_¸ˆ‹¸°2VÆÊ€D1QL_æË|Ðq¥ãJÇ ¹¢¹¢¹Э֭֭4Cãp ·p €:è  oÑ·è[NàNpž ₸ vz,f,f,†D ë…õÂz<˧óé|:l°Áµr­\ëcK\DŠHÀžfO³§Kå.ìÂ. ì^ؽ°{ÀÔèÔèÔ(P}¸úpõa »¿»¿»Ðëõz½ u´ŽÖÍ2¯ 7Ñ<Ñ<ÑŒnšHi";M•ùÊ|e¾PØ=·{n÷\vºµ¤µ¤µÀb,ÆbLŠIb’˜ôX]”¢ mhЂ´<ºí9ä9ä9´”µ”µ”S‹¦M-6¾¿ñýï;{vöììÚ_o½ýuàÆ7¾¸ñÅÌðIÛ:Û:Û:ÀÖoë·õã°²[Ù­ì ) 0ÀSÊgóÙ|6ɪó¯ó¯ó÷èíÏÙŸ³?5¥”RŠ1ÇâXÜ# ºƒî ;A"HÄc/‹Xħ֞Z{j-`þÙü³ùçGÝ¿¤ü’òK Àµsí\; Þ¢Þ¢Þ§·[ý­ß·~ßú‰qÄFlĆãÄC<Äó¹œ^ ¼xñƒ}òy‚<áË;ÃK‡—/åz*ß«|¯ò=Ï6¯€–¥°–2#gŸ³ÏÙ8 œ΂G üb~1¿xcÃÞØ4&5&5&9Ûs¶çlŠæÍ+šDïÞ½laþÂü…ùPœ3œ3œ3ˆŽ»ÁwƒïÓFùùù‘›ëܽî^wïv7Ùß·¿o€&4¡ééc²AÙ lðÕ¸iÜ4nš—±BµBµBÅ^YufÕ™UgÈE/»Ýt»évˆ/Æ‹ñ€Þ¡wèbƒIR)‡”@pp0 = = =<›úl곩p´^o½Þz-×–k˵øV­UkÕÚ©WÇ8ÆEý ° Ú7QZJKi)wÐZÐÿwÑ*ZEkºKmV›ÕfÀ¬7ëÍz¶Ø²Ã²Ã²’—B2C2C2ôÀÏ#@ Àœ¾9}sú€4/h^ÐÌŽ;8vêê«ÕW«¯ zy°¹¿O$±$–ĶoB! QÈ{yžèés#ÿr”%G/n¦ 4&l¯B2Aÿir™\&—i7Úv#Ôä'òù câiñ´x\pÀVÃjX ˆbÀŒu´ŒŒŒžm£ý£ý£ýü1…F¡Qh*òæÎ/œ_øqrƒr VXaVHçQô¢½B¶b+¶’ªEç[t®ðÏÊw”ï(ß©È   äí•ÕÕü;8a–Ç2+ƒ 2éHG:­§õ´Š+¶+¶+6öJ“O“O“Wè£òQù¨îL¹Œ.£Ë¸óƒ¶œ¶œ¶€Ù˜Ù0Ë;ϨÃ{5ŠQ#j0ëÆÝwoÜ\[][][w~àãçãçãwËØiê4uš¸Âšµ5kkÖ²WÈf²™l†B,ËÅr0¨ ‚ `ÙCö ˆ€Éû¶û¶û6TÔ.©]R»³|||1FŒcv~0m½;S^+ón雥 Ònõþ’(¤Mí­»…¨E-j=ÛH‰#q¯üyú—£á?îLw¦;SÜ’*¦Š©"]QQQ€5b‡Ø!v@MÐtœB–%dAQVVæ™?;;Ëu)—(—(—þqzÓlo‹Åb±˜?æ]Ù¿K+–—————‡1)£ðÞ˜ñ×»Û¼Þ=æõî7¿ò®Ûä6¹…L{‰½Ä^2SwJ™¨›¬›¬›wŠïß)溔û”û”ûÚªýÎ~gÿ¾»^ëz­ë5À ¨—ê©8S·ñD<ñ€Ú+ð£×»ÿù•wƒFƒFƒxû™ì3Ùg²=Û¼'úY‹¿Å'Í×Ì×Ì×Èzu‡ºC݈zQ/ê·üÀ¿É¿É¿9ùbhthth4ñÎ÷¿RUy’‹ÃoD|||||<oÓÂäLÎääÿ,Xˆ{žñ<ãy檠U„*BÿòÏ¡C+†VøŸ³·ÛÛííìÿ§?ž—ÆÝãîq7·U¶L¶L¶ì½`VÂJXÉ×ÕP@׃Œ`D|JZo¢„'y~'~û¹¨A j<9¬ŠU±ªx+=KÏÒ³—B§’¦’¦’Ä…²bY±¬˜¶s\—Qÿ}ØÙ°³agÿo³Ú¬6+ùNœ#Îç°Ï½º&/ ã·8(~'žð®·\xr°›±™¿NÒHI»6]/woT…¨BT!´ëåz¹Þþñ#ñ#ñ£Ì»ë:Öu¬¦êÕ“–“¿Çñ_صÉ; ±yIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-187.png 644 233 144 2672 13755454065 14767 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜoIDATHÇÍ–ûK\gÇŸ™Zg†\Æ©I  f™Íe*êe($A“”R¥UÑØî”ÀbÛ\\$”Æß¶”š.D¢¦I¥¸+]“Ð4m—@6iGMÓ† :Æê&Èz [ÓIâ ë̹¼Ÿýaæ3Ùýr~9<·ï÷{Þ‡ç9¯€ˆˆdÞîbw±{mÚv¿ãø½¯x_ùíßÒv—®:WÝOÿ§þO=ûŽcë¸ÎÏ­qðsù´_ Äqx.x.¸*3öGÐXÖXæ]Ÿ¶O ‚oÀ7°d»_¾û%@ÿý_ð¸ÿýýïV>¬ÇÖq¯ë5^.¾|ô?ü"ðì7Ï~ãšO¾'_6½¼éå`K:áŸAx½úõj€ÙgfŸQn°€Õ¬V•@‚úycëx&_×k<¯ù4ZÀºŠu"Pûf훾¿¤ £EG‹4Ÿ1|ÌǬ3a&¬·¬·H‚Tƒ¸pcë¸Î×õOãk>ÍŸÖ#Oö¶m/ª!¿!0Œë`ÍX3`¯2ZŒ õ£ZT‹(-Ù~hÇí8˜13fÆ@TÔP¿¨Y5 ¦a•[å(ëw©÷RïaX~c¯±ÔK¿Þ¨7€gøVŠˆ„:1}3¾™DLL_Pe ›ŒM,ÓÏ$“Ù–¡’*©’À1ŽqÌñÓK/½Ànv³;ÇŸ$I@U匷 &¯O^ð%|‰DžÖ“Ö5?8øðÀ~A3ZVGGwC÷kݯÁXõXõXµÃ7º0º0ºmÒ&mÓeÓeÓe0W>W>WÓÓÓÐýk÷|÷<œË?<DÅþ:vzìtöÜ_P“Þ8ð†nm×PFØÈû´œß~VG“ù§di²”däÇÈ·‘o†y†ÉG‡E²zþo*Sé)aÆ7Ç©||òñ'?ÔÉÔÉÔI§æNs§¹ …XÛ­íÖv'þhߣ}öÁòôòÏË?;xüÃì7û+çùŸœÊP'øîûî'ò`Òš´²U`ï·÷³œÝ<9®â*Ê«¼Ê›ã© šRSj*§à÷œàdñœ=–áÓüO챜ÍOƒ§ÁØÙÍ?j«ÙjÆ ‹AÍOŸñ¨kꚺtÐN{Ž 5„ £8jݱî`€uϺ¿ÁÛàÕ'õÄæjÿ•Oíí⩽=7Øÿ‚CmÒ¯IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-120.png 644 233 144 2737 13755454065 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü”IDATHÇÍ–ïOTWÇŸœÁ °j‰»¡‘¤›}QƒŒi3±¸¤ ¤‰ÕPÚc‰±iÚÐÝ 6цnÊÆÝÖÄ€ƒ‹]ÔÄ ciJÕ“ SgHªLP™ .0sïóé‹áήûxÞÜ<¿¾ßï9'Ïs€ˆˆä­|ì›ì›ì9IÛÞbùW{V{þЛ´?7Àöºíõÿœ€ÜîÜn€5_¬ù"á·l3næ§×‹Xøé|¦_òÄrdögöÛÜ+ö‡ðFùå«×'í“>p]r]ú¯­ƒ­ƒgÎò6Ì|3ó Àc÷c7X¶7óÍz/_>ü~p 9†l÷ Ó™éÂW _yîdÂäsP[S[ðSÆOÊÆ# ›lå¢D1×\šmÆWòÍzÏÄ7ùLþ¤uÕëªEàµÆ×]ÿLøÏÁ{ï˜|Ú%àc>&ô¨0šŒ&b |Ê€ X¶7óÍzÏÄ7ùLþ¤ùýÝ~ò2ªÞYïtmŒ‚D¶ö®ö.šº¡"*‚2%«gÕzµt¿î×ýð%F#©DíTíª¥ßïŒïDS‡uîImx”Å:£Î0~òrÚUŠˆ”|Šî ¹BÑUÌ æÿàUçj…,2À]î¦ΪY5 ìg?û-?C 1jƒÚ 6»x‰—ÒâÛŒ.£‹EJ’ø|>ø<°ìúÑõct•©gEØç7 íý¶÷ljÔGÚQí¨¥ãLë™7ϼ ãÁñàxÐâñðð€SE§ŠNÁ­Ð­Ð­t:ð™£[u+¸7qoáÞBÚ‰“|)þ=+¾?Â;}ûúö¥Ò›õ¿Æ¶Æ¶Û;¶wxï°uá#çFΜƒÐ|h>4¯o¼¾ñ:T×V×V×Âc‹±Å€Ë—'.O@ÕŽªU;`Ûžm{¶íâ‘â«ÅWáQÍLd&BÌäSÞÞÁÞASØ÷Gr¼9^ÕÏgáoÃßZ;o]þeù8_z¾ä| ÌÌÌÃèµÑk£×`Ø;ìöÂá¦ÃM‡›¬ºªÊªÊªJ¨h­h­h…ÝÝÝ+¾ýçísÛçàïÿèiîi¶üÆPw¨L=v‘ŒÚŒZÊämç&ç&¹*""Ç ç—Î/Eý?4þ ²ùàæƒ›Š<¸òàʃ+"îjwµ»Z¤%Ün ‹”M–M–MŠäÏ?ž\¤imÓÚ¦µ"FÑcôHjå\ÌȉMƈ‘rG$î¼è¼(b걋$¾J|e›C¯ÑkDÄ&""ëäEY#k,ÀØll66+’UšUšU*2Ý9Ý9Ý)R1X1X1(Òp¬áXÃ1‘þºþºþ:‘RG©£Ô!2åòNyEæ:æ:æ:D¢Z4‹Ÿ->›‚_gÓóõ|S]$ꎺǿ“U#¾Ÿˆ,‰ˆð–íêõŒÄÍʬ†¬†¬‘ìòìòìr‘›K7—n.‰hyZž–'2tgèÎБܶܶÜ6‘¥ûK÷—î‹x:=žN‘"_‘¯È'²kj×Ý]wEvznxn˜ø¼e?úuåו")=Ote|¥KBú„>auåŸ< Ðnk·µÛoŽ7Ç›áa×î‡]0Í4Ó@¸=Ün‡eײkÙ\à òçÈ‘ ñP9”†ÇðVøTÛ‰¶OteɧàšqÍDWAÀ)A¯Bb_b‹i“(föÒï–††–f⇠IÌ$fÒæß_ô°f‘–Ô+ q×”kê‰9–6ù©Ï¬Ï©É?nŒF«ÑŠÆ (Ns’“ úT¯ê5¦ÆÔ¨óªOõã4§›üʯ(õQf”¡ñ/ãˆq$mòõŽzÇÿüOí¿ò©}]<µï±§óû[ÂÙ€(N)ËIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-35.5.png 644 233 144 3077 13755454067 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜôIDATHÇÍ–ÿOTWÆß±|Qù¢6ÄÔ– ØÄPH)êB¢ ……N ÅÖIY$h%²‹`Ì&³Õ’U¢“ÄÆÐ… –Iiš°hÕɺqÚtÅÆ ,k°Jap:_îœÏþ0s‰ç—›ç¼ïû<ÏÍÉ}î‘ÄÐSÀøºñuc|ÿÞ)Š)Jëb«††·ÿ gÎ$}‘ôEà—0Öëzä¼H˜?ROß—D oD_޾lÈ áf¨È¬ÈŒy5ˆ?¿±¶XÛ‚ª¿®þ ïbßEÀч#sysyÆz]ï×çu¾H~i~A_–~»ô[Ãÿ ú•èWD ¥0¥0õ`°a,Ì%æ€ûKî/QFЦå,Wy€7úš‰Àz=Ô¯Ïë|:¿®§ëý¬~wõ»"°£rGeì…àÀ/_BÃÚ†µºžÏç8ËÁïö»´´ð€º®®`Àa¬×õ~}^çÓùu=]?è'|”‹""­°Ë¹Ë ÿøìþ _Š/Ôüeþ2|Ì ´F­^«í--]Km¯¶WÛ aÂDx âÆÒ>õžõžÅ§eøú‚Vä§|ת]«tƒ­á£Yß±îX·;Jœv§h`;¨l•Í"ÿdˆ! ˜bŠ#„54´¬P¨<É$“Àžð@½©Þd1TÝ!½~ÐØú6aJDÄzC±oǾ:[ ëçÉÍ?š¡u¬ÕÙêD™ÆÞ{/¬×WÚWÚW ³Ål1CûÍö›í7áqÃã†Ç á>ï]ï]ï]°]´µÛÚÁò¾¥ÖR‹j¿eùÞò=<þLóhž@È> êý cྈÈïû R²§dÈ¿KÇ_ͽµgëØÖ1ñÚ»ìö1m,Ê)ʹÕ}«ûV·È!uHR""vƒÝ`7ˆÌçóFy¾²²²Ejòk¶Õl¹úêU×U—ìÞ‘Þ‘^ñ>éq/u/5d‹äæŠðyÐÑP½ÌµÌõNŽH~\~œÈü7fÌ.ìüäÞ'÷$ºê¿U«Ь‘5²FD]Ž.G—È|÷|÷|·HàJàJàŠH~z~z~ºHÚ‰´i'ÂÆœÛœÛœÛD\µ®ZW­H`Y`U`•Hþº‚â‚b‰Ný9ɘd4\M¹ó¹ó"ÆÙøãñÇßÉHZ‘´"p‡˜éÙéÙðg?ÿ©k¿k?˜&‡É“7&oLë„uÂ:uÇêŽÕƒžs=çzÎAJFJFJt{º=ÝžðQ^«¼Vy­ªû«û«û¡·³·³·R2ÞH~#z—÷í;Ê ø~h[aYa ÜmuÜhܨº Þ&oœºjùÁò˜Žææ…6tlèØÐe-e-e-p²édÓɦp=G娧M§M§M Ök‡Á–iË´e‘´#iGÒ"úã7n‹¯3ª3 ÀÓééíwq÷âî©Ë¢¢ED¯¶|µ4>+xV >Þ`z{êí)<++V–®,…Ýý»ûw÷ÃèùÑó£ç!לkÎ5C¼5Þo…*O•§ÊãÃãÃãÃU™U™U #m#m#m°Ù±Ù±Ù ‡ö%ìƒ?Î}xêÃSxžþ@} ½·{oƒš ú å˜õƒ5Q5Qá¯Ò{âiÞÓ»_&kíµþÿ?k¯½f ˆˆHbèW Òi‹ŒÚ‘ëLÿ¨E£eTí“:DäFä>.‚„²„2€¤SI§-¦mìñáù"&~8Ÿá—D1±b/D8BöX½:{Ô×AûgXÝV÷G Ö_^ ötíi6CgCgÀ{Ç{˜¶±oÄù^8¾øŒ_b®Æ\hƒXK¬Eì í 'n ø&Âòï—ÐÕ¥"@ ħ@/½ëß0ÛØÅùžoðüA=) Rˆ€3ß™oý=˜ÐröŒÛ3Îàó»Ã&´^­@_«¯e”Gyˆ LÛØ7â|ÏÀ7ø þ ùôlù•gɳ€ß z»Þ8ÿ6ÿ6üªIõ«~Ÿ-µKíR» ðM 5júÝ*]¥£´†æ Íï&k)ZÊð{X©­Ôâ7RD$ëšµÝÚÞ ­‰­‰@Kußî·ÓÇu:è`äšË\æ‚Z¥V©UaB»U·êRDQXü™€-`£oƒøÐ:¶u,0`m³¶õFzBÂNþöoؼÌPý{ý{MžŠu……ðpþÃùçÔ÷ªúUõ«j¸¹ñæÆ›MóíæÛÍ·¡tgé¦ÒMð¼øyåóJ³âª2È7ÌÒÖ´›­ç χÿ¨ý48ep ƒÔÔ›~}ÖõY×gæp;Ü7,IX’°$|Ç}Ç}ÇÁ>Þ>Þ>rïçÞϽ¦M˜4a´üð8âqƒŸ²W'V'šv Äߊ¿¥.PþæÎ›;&ÑДž¨™\“U“ö{‹½®œ½röÊY3îhÁÑ‚£¦p—Ëår¹àIΓœ'9êJu¥º ¼­¼­¼ 2ïf6f6ÂÝ®ÆK—ÂzñVLJŽ`艉Zµœ©²Ùb³ØD䚈ˆ¼‹)²TZ*Eò[òŸå?I»˜v1í¢È虣gŽž)ÒPÕPÕP%r®ù\ó¹f‘})ûRö¥ˆteveveŠô ô ô ˆhµZ­V+rÃyÃyÃ)""ÊKy)Æz',,D†õ WLëœÞ9¸*®/P¨2¿h†g†g†êÝõîz7TdTdTd€¥ÉÒdi‚ô{é÷ÒïA¼/Þïƒ9+欘³[[[Lœ©L­™Z'¦ë;Ögúug{q{±Y1³Ç8ß}¾¸Z}V߈96ùɋ͋šüô@¬¾Iß„Ÿ ¼xGN~qˆC@,,aþßðàA©›º]·ã§\Ï×óM¿-/:/Ú¨Ô'“ÿ‹ý¯üb__ì{ìË|ÁþÕUïÇ~¸ûð¹ÖÀ÷/—×·çó™÷çý~Þ[@DDž‰ÿ $?›ülrF,N>dåÓ*Ó*7tÆâó:$½’ôÊhd¶f¶d}’õ‰qۊͺٟ8/bá'ò™yyF¬„½ÛÞTOÃk[_ÛšöãXü‡~pô:zç£P{µö*À•ö+íéÁéA€GåÊÁŠÍºÙoΛx‰ørúü"z-õZÒ=°¯°¯õ{×ïuý.Öð¼ôâK/|kûÖ¦’@¤“®Ê!ÌåOˆÍz¼ßœ7ñL|“ÏäéÈy!çxùÀËРܾïæ¿›oòi½Àû¼O:DCÑ€þ†þaPýª€$’ÀŠÍºÙoΛx&¾ÉgòÇôXŸÒùpúþèþè² c•æÒ\ |zŽžƒ/(õ3åQˆÞ~ýT½ªWõ<±”O-©%”n‹äFrÑôƒZ›ÖÑH _ýzßš}kLî±>唈ȦÀ1é˜ ¥ð—‰‚‰Ðÿ@W-Æ–™~Š °šÕ¬NPPH!…Àf6³9!¿ÄKß“êR®e¼*p„¡PJLئâ;vþ þWW[W ª ÀØn´նh;ùnäþÈ} þÎàÁ;ƒp.û\ö¹l¸7voìÞØ“;6Y0Y0Y­?o-n-†¶ÀÇöí¨Ï~ô©ñ©£ SµSµÆvx§å0FbzˆÈ¿N@×î®ÝmPoxý­×ß"l^‘>gŸ³Ï Z…V¡U€Ûïö»ý°Í»Í»Í }}}0svæìÌYK˜¯ÜWî+‡ÒšÒšÒ¨¾QÝWÝ·|€Âm·®t\éPoµൠDÿÓ#|Q•Q¥ºaæòÌeˆl`+[áòæÎ`gò™_–_C+‡V­„žŠžŠž (.*.*.²xž°' Ž^8zᨕÔDj"5Vܑױ¦c ìÿlßá}‡¶ö»éÜé\àLÆîŒÝª;YNÚ¾´}ÉsâM™O™I=-·ä–Ü>˜y0Sdío×¾½ömm‡¶CÛ!¢kÅZ±HzWzWz—,¯ŒöŒöŒv‘°Öš•O-I-I-yÜó¸çqHó?›o6ß9öûcÝǺ—ÛjØÖdk‘S¶aÛ0Ï¥ˆnô½Ic’¬m×¶Ë)‘s"ú(ú0úPD+ÒŠ´"××ב)÷”{Ê-â/ôú EæÜsî9·ˆsssÈlëlël«HîÉÜ“¹'E.­º´êÒ*‘v”##`Œ@‚;µ¨Õ⇵Æs ña}Húžéã:€cÚ1ý„‰ âΫ^µ½j³œ{t*:üQ_Ô-ççÏôÐê¦VÀ/^à! þ­FÔŒ÷¯ÕOé§Ð8®ïÔw&àGM¾:ÿÓû_ùÔ¾.žÚ÷ØÓù‚ý?L›ÇN;›ôIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-25-red.png 644 233 144 4265 13755454063 15607 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜjIDATXíW{LTg?ß½wìÒ…FAvct­µ+¨•A°-«ÑX©¡.D“V‘މÙ*Q|ÐC‹¢5gТV·RÜú(5¬‘6»”¤^Û˜òP@†¹÷~¿ýƒùî<6[³Ù=ÿÌœï|çœßœó;ç¢qù …ˆ”jv™]f{ê?ˆœP7¡nB]FŠ¢)š¢5Ÿ¢$J¢$`ÜÌ‹I!…¡¡:/÷…¿ˆ'â‡æ“RCñã˧|Ê—œ¡ö˜•:¥N©s°l'Ûi±DFFâêêû«ï¯¾¬ë^×½®Xk[k[k èÂ.î OÄù~I‹CõiIÃÒ°4Ü‘$*———£½[q»âvÅmþÜPÿPÿP?2dxðOð@:кß.î OÄÍ7í£_ÆGÖ祩Gêéø‹`»i»i»©.h÷µûÚ}h‡_xOà Pµ½Ú^m/ ÍÓæió-SËÔ2ƒt¿]Üþ"žˆoÉo}ހƜÌÉœDÊå€r ê[á`/¶´T3 `ïñãü8†Ôª±ò±r€wø:}Æ´R­ŒdºáÑÀŒ©šª¼CMUSµj´z´àïéÉz2†Äm{±}}š)ò <™ºL]¦®×ÿ .X ­…ÖB>ÝÝçîrwá±?ÎvØ÷“ï'@+Z@ X#oîã¾ÃFþý¾v˜çò\Cr÷¹Ï¸Ïà±µÐú¡õC>]à1ð)Û•íÊö¦Âp"ûÄæ›ùVêô]ñ] Êàm½Þz*/U^€‹W.^OŽ''J÷Ý?À¹Ôs©PÃjï¹õçÖÀùÆó€ê¼ÀùM5¦S1òb¿ò¬”Ò”Ò”R<e£l”¸€ ¸Ž?ñÞ< ê+ê+pìæ±›`Ž4GÀâ‹gWnãä“`öæÙ›àÓCŸ€5ž5^š›W5¯xâx¹…·-Êe‹Â¤L)SÊôýì?(>:ÿt~"ŒáXÙ½€7©9©Ì_˜¿€’ƒ%@{C{øi~ºnwÝ€§uOë‚ð«O_xú°El ?zôèÑ@¾¿©oªo2^Àm,‘%²DßÏ$Ï—çËó÷‰)‹ÿU·êÚ4÷ú¶Ú¶ÚÀúàK7l.ëÖð΃ƒ+8²`dŒ$Ž$ÀÔÖ©­àv ]ó|ÓüM3€? N×m«Û¯Çož»gÖÌY3uãcä9æãÇ™™™N¤ÜPn(7ª{Œ…¿öÕïÖ €¡ª¡*@wXâ-ñðÂ%åIy<æ×̯€tWºà®c¯c/7ÞÕ¢ZTKþP¨? p±uüo×ÄÖ‰­[ùjƒ“‘R¤ùæŸÃ¨X†ÏL¿| —qwÛ´l5«fÕ¬Zì9ýWƒ«ÁÕà®Ú 6¨ Q‰‰‰æ Μ3¨ýÞàb\#×_(¨æ§^8À_Ó3$pAp·Wî âîëëÕâ®vW»«xá…ƒ©ã²ã²ãr`í(åJ¹RÞêÿ—dâ°¼þszîYÃE8¼éçîÅÿÄÝ%+–¬X²"À]×B×B×Bœ·s£,‹e±¬e{BÓHÂò2ú/åYÜM•‹ä"¹¨cžœU˜U˜UÈ&Œ%Œ%Œ©7ZÝ+÷ʽŽ8ª¢*ª"ÿÚ‘ÝaùÌô?J8w÷‡êKÚØ¶…mh9-§åú,iª4Uš 0bÄèú­xO¼'ÞC$7ÉMr«÷;nëÜÿM,Æ·tJ§tåÛPóîl‰K\â»Æ®±kÿüíøù WXgÚÃâ>³Õÿ€H'*ŸIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-50-red.png 644 233 144 4225 13755454064 15602 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜJIDATXí—LTWÇÏû1 Hc@°þþÁ²R°6¢)4ÑE…b5ÝZZR²E” bJc‰BýC`Ý– Én$h,,É.¥‰Õ™©°)teÀ‘aÞ›÷Ý?˜ûæÍ$«Ùìžfνçžóy÷|ï}3DS6“|Œ_h 4š¸çžà€¦€¦€¦´?ˆ²(‹òßÏÑ*ZE«€©i¥‚DId>àë+,ž­gùX~ßzüz_-_Poô[&6‰Mb“q„;Àਠ!¡£¡£¡£økæÃ̇™m}Ûú¶õ[“¶&mMòúlžÅ³õ,ËÏ꽜‡øu¾þ‚Óü?ÆYW±š—7/o^ž|¨¶£¶£¶C ²Û‡íÃàÀ8Æ1À +¬€ê{æY<[Ïò±ü¾õœ~9é_ãûù~¾ßú7– éVÒ­¤[Ò³Ëì2»`†Ç”h%Z‰†$—È%r Çʱr, §ËérºÆ÷̳x¶žåcùU`Ÿúú×T4ÎÈ9#‘xL<&«ëf †bC±”®‚}ìNp'À.ÕMÔOÔŠUŠ•bLÊqrÈ»åÝÜ(A ¼6©¤()€buuº:©ÎyÛyP>VÖ*kaga† ÃQÃQ)Õg<ŒtOtOtO6ų}™¾L_¦,² Y†,CxæÉc—OÈÅr±À»· ài¶Æ”\%03¿XÈ'\×]×½Ù,CX€gú2ýçúÏ•EŒGåóÅ|1¿ë›¨Î­Î­ÎU>ð$pHF–«¿ª¿ €³!¡!¹FrràòÅË`üÛñoµH¢EÀ×7¾¾Ày«åV q€d”fH3Ô`GunuVu–òº³>|¤ØB£B£B£P1’6’6’Š]±CB{æ+­WZ©sbX£õÜn¬¬ó,ó,ˆ|;òm˜qgÆM¼½àvÁm@Í?eÒHÚHÐHÀx=žq2ãdÆIï“ɿɸÉx66TÙPÙ ƒ ƒ>->«œ×,×,íxFRFÄ¿ÿ®vü›7¿ySlëù´çS@6û;ãã=Gj™.U—ªKUÏX íA&2‰h6êìîì&"êë#"Zóýšï‰ˆ{{ˆˆZZ´7HÏPÏѦÈM‘Úñ´š´""ê¦n"švÿèý£DtÉçú Ô5êuê‘_æÅ_ú;ú;ú;Èìä'F'FIöŠëÄuÚí‰ ll&"Z¸wá^"¢½÷÷Þ'"š{xîa"¢wÞ "joko#">2|„ˆ(|{øv-ƒû’ûMRÅÑ£‰Ÿ'~&â›§@?¾|ïË÷`õ‹Õ/à³ÒÏJµ*½2zè}z/Ÿ:ä­w£²µ«µK}þ‰‹áb¸×o$¬V «‹ËÙ)‹˜¯ß®ß./°üñ—¼_ò¼×‡²!L “ (¶(€Â¦:êüI{¨ÚóÛóà£}í€ùç?Ôª¯v°vÀfÿcíµp:€ntQÅ+âWĻՀ&„ agŸQpjpjp*‘xS¼)Þ¬ïW/ü­)¦|(dùÝ…5›k6à “§€ƒ;ÅÒÌ8˜ás-ýð蘽dööÙ4›<Š ÷ÙOÖ~²Öû¸y÷rãrãÜp°GØóϬ)º|mÞWº]Œ.Æzž-(,9tþÐyeƒÚ¹ß÷^í½ ¸Xt±€ýfóÍfpç¸s¦j"OÃë8=pÎÝ;wsÛ¹vλ¿ cÆÅÆÅSûKðå|9_>‘ÆÍáæpsVÔú Ôó•Ãíäv¾u†«ç¹F¦÷>S›1Ò ¦N‡|н½B ¤|§|8Žãå®rðÞ” Ê å„WJýõ}}@Ä4}³¾YÊWw²T(Š *Z:¥Sº¨÷²&S2%‹¥d$#‰›ð«ðë¡f–@F¿C¿C ±6?0?ÐjW •B­hÕh×áù4)¯+¯J–«ÏÕ'[¸óîÎm;·ÉÕ7и8,›Ž„ïß¾Ÿˆ7ðÞÀ]öÐå2ÌžÏ,á±ðXx̵,*ZT´¨ˆH—§ËÓ噎¨ÚM6$’µÚuº á„ &˜<ÅS<õn´¼T^*/õj±*¡*¡*AÙÀòéBt!ºþ‰)_?Í·ÓÜ5¿Öçç¶ûúúiSÚµ\öj·°¤°D£Ý)D ñ¹Üî¯{Ñ‹^À4½wzïô^%SÕd0Ìïø³Ÿ¿òã ¤—Uíæp9oerõ\=W¯Õ®©ÍÔæÕ®Ô&µIm^å¾þ"X9ºrt娼DÕb£Ð(4~‘Ȥ摞?àïèæ ` ¼Úµ 6v+õ•úJ)ÄRo©·Ôp 'FiaKaKa‹÷ÚψgÄ3½ž¿$ÓïøÕõŒSЫý-ØáÑîÕÿ¤Ý”-)[R¶xµkJ4%šqij^Q;ÁesÙ\ö[žeø§~u9ú/íUÚ]/” åB¹5–g—e—e—)§¢'£'£'¥¨­¶ 6ÁV8ꨎêÈsí¿zô?š¿vøú)¸]Ü.n@i#mt/ççòsù¹Gqt½=Âáˆp ]B—Ðŵzfùuîÿf!ê·TJ¥T±Ûwúp.¯ð ¯Ü5îwí_žx‹M~1ûå}e«ÿ R¦/Ó/£iIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-61.png 644 233 144 2313 13755454065 14666 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü€IDATHÇÍ–oH”YÆã:ŽäN¶(hA›bl!EP¤ô‡–#J„ è‹ÛƒˆXv)”5Ù±,ª/jí*HK,Zh ሠ–®ã{ßûÛ3wÞw×-ÚoÞ/ÃsÏ9Ïópï{Î\ÉKý xŠÀÝö»íÔAt(:0˜ €ƒMÜä›zÃçæ—Æé‹@V$+’1 ÙÞl¯¬ß³~φúdÂë P¹¿r?À»Ìw™Új È%W€Yf1+æÂ&žÊ7õ†Ïð=£Ÿô#_‘_!Õ‡«çü’,xÕ /½Å{À® Ö¬5  Ž©c,€~ªŸA8ØÄM¾©7|†ßèý¤ùçÝ6í†C¾C¾´¡AfÕCõÀn³ÛXÔ§tH‡ÐÖÖ3ëØoíI{’%Ëε½¶ô =¯çÑ`·Ûí,òA=V]üi=£/nC¥?CN4':ûŒ©1̰ìbŽoØÅ.Ðoõ¸w9& zLé1PïÕ{õ衇Wž•¶|Ü>Î\ ìKë¥õ“~RÆšƒÓ—N_J—™+ÐaݧûÐ&ò¦îMÝ›:hjmjmj…‘š‘š‘š¥'Öl ¶áå¶—Û^nsöõn}BŸ@»®8¥gô“~RÆ^œ‡;ñ;ñtùI=n5X ,˜éâéâébØYº³tg)˜90s`ÊÊÊàyøyøyj7ÕnªÝä| n<ºñè†cLõ«ˆŠ¨Ûê¶á×'ý¤ÿ€@wA´ÊGy-¯]ziý”ŸO}cü¤¶ª­,0L?ýÎí>Ú}´rësësë!x5x5xâñ‚x“WQUQUQ½Ã½Ã½Ã®1òµig~Ñ7öù®äít¥öj¯öB¬%ÖkÕ¨UãÒ®Œ‡â¡xƒ‰ÁÄ +ð;L|qWþÇK¤çØeû2s|Ï5®=kÇ옫ý‹t‘.=§çôœËÀ<ó©Y¸àôöÿžcŸ™üJ=QOìsö9yÀ8ãh=¨ûu?ÐÌMn.=1²ñàZd öEû"‹X†/ÅÿéÉ¿lÿ+—íëbپǖç öoD Z>.¸IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-167.png 644 233 144 2616 13755454065 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜCIDATHÇÍ–ýK•gÇ/]¾4_–þPø²A‚`” ¢ÎX;ÂX)©¤Å*t,ˆµ‚E4X ™6qWNO¦%:ˆEvÌj¢´ =!k¦½P;ì çy¹?ûáœÛç´¿ û—‡ëåþ~¿ÏsÝ×õÜ""’} ÄçÆçƧEìø/òGɽû[ľ`AÜ®¸]} éçÒÏd¶f¶Ú[Çu~ì~?–Oû%CGRWRW\IÔ>{6íÙ”œ±ÏøÀuÕuõ_öìèiëiãKxzçé€ù’ùpl×ùz¿Æ‹Å—Sÿã„ß~û’“E ÿÃü ¾Š$<*€OJ?)xòÖ“·T<X/TRU $ˆ^[Ç£ùz¿ÆÓøšOóGôdg‹À§•ŸVº~‰lxx ŽåËÑ|ÆUà{¾'Ì °>³>c”Oùˆ#[Çu¾Þ¯ñ4¾æÓü=òzmϺQå‰å‰€ ` ƒ5cÍ€j1Ž`¨AõB½@iɪJUªJ0}¦ÏôzGå«|POÔ´šÓ²Þ·ÞGYUá£á£Vºá6Ü >ÐøeF™<ò;¥ÙØ€éšqÍW?ßôà±|F¾‘Oˆkøñã¬4ÒHõX=VcüõÔSl`büK,±  T¡¨×SÃSî +\¥õD…]‚Ã'ŸæìÍê;ãã›XÕr°¥º¥Æ&Ç&Ç&>¯¿×ß gòÎäɃûé÷Óï§ÃL`&0€Æ¢Æ¢Æ"hyÔò å´'¶´ ü:~~ü¼F±7«©C‡*ti/ E…~ÍWû:ö­è8`þ°\¸\ÈòÞ?÷ÞÜ{Ó)ø57ÖÜXƬ1kÌBѳ¢gEÏ t¤t¤t¶7moÚÞ—/7^†’’’ðtz:=ÎÏÓÍ'›O²¬ù¬—ü—üZØè×iƒiƒª‹ós÷æî9_"\¸ôjét¾×¹±s#äìÈÙ‘³îž¾{úîièßÙ¿³'dgggggCmCmCmï>Þ}¼^î¹ÿå~¯-«-«- ÊÚË.–]Œ)ñlôyvîÖÜ-Ðz2Wg®¶' 0˜"m¯:ìíý[½[½[½08>8>8׆® ]‚Üu¹ër×ASESES¬Ÿ_?¿~Üî7(¿ò+?ä%ä%ä%ÀíÂÛ…· \û¢3Qþ¨žx»Ïî‹›Ë,5KE$NDD²d‹dJ¦¬,óŠyż"‚‘Œ¾Œ¾Œ>‘”Ö”Ö”V‘o·Æ+’ò<åyÊs‘X@¤k´k´kTdmûÚöµí"Û&¶Ml›QÿØv§Hü–(Ÿa~l~,²¢gåŒÑ±Ø±tGjÎÛf¿Ù¯ÏOOOC_C_C_ƒóÆ×+®W\‡ÔšÔšÔØ]¿»~w½¯««ƒº{u÷êbŽŠö†½,G;õÀ ¿sÆþוáH—0cN˜NW.Ö/Ö-ÖAØö†½1#öˆ=æ@s ,·å¶ÜN|¡j¡j¡ B‡&CN7+þ0{ÌÀŠòiþ×»rc¸žºžWÁ”5e­xÀÞgï#³ª©¦ì ´_*Wåª\P!R¡˜üÏ9ËYXÁsæX”Oó¿6Çb&?åIåI€ ÑÉ?fIV­U‹ÁOøð9“Ÿºé5¬†Õ0pŽFc­¦ˆ"Ǭ‡ÖC °¦­iÀÐøåÉåÉúK½6ùߨå{»xcïcoæ ö?¥§W}Š{³DIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-40-red.png 644 233 144 4160 13755454064 15577 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü%IDATXíWLTW>ïÇ¥±¢ ŠÕÕU)FÕº‚:@âh*©°¤b:T—ÔnU´Ð1%VQ‚?š%Vj º¥ì º–,$»JÑ(´+éÚRk•™kБE†yoî·0÷Í›‰ÕlvÏ?oÎ=ç|ç›{¾{ß Ñ˜M¤—‡ØBl!6áß¾…ˆquãêÆÕ¥ÿFVeUV¯§…´caVF2É$sôYÏçõãö—òÑó+ *­ñ)så:¹N®³ö ;„ÂHdÔ`Ô`Ô þ–y3ófæM »;»;»ÈJÉJÉJñû<Îóy=Çãø¼ß“ùøÛ@æGâCñ¡øÐ±ïPL^L^LžúVeKeKe sõ¹ú\}$H0Œ! a€8Í÷Åy>¯çx?°ß̞̌ψ=bØãø;H¹”r)å’²¤ÓÓééô >cñ,žÅCQ‹ÕbµP©‹ÔE€jVͪYçûâ<Ÿ×s<ޝèo|F£&X«`%’÷ËûåýÕí¼ÀTf*3•)fØÛ¬ˆÁ¥T+Ÿ)ŸÌÁÀ`TýYýØ*¶ €6Ê2XÀž¯=_Jµ»ÕÝ °·Ù2¶ .žf*3í3íS̼?çÃù‘¡ËÐeèZÄŒ%Æc ›e¿o¿o¿>—zPÝ£îÑp±—ÙË€C8„dz0 `"&~Jc¦ôœ÷œ÷£ÙïÛaKŒ?`³8Ÿ¼MÞ&okÛÏ– K……½îV¬J¥R©ëàöÖyëô-›M¸Q£þq„o5ßj€ª U¸/5\j$"P¬J¸®%WX*r*rØëÚÎð#æŒZµ jÊúÓûÓûÓµB±Xƒ5\êFucÁkM×€±{ŽD‰Öǯ¿yýM˜Ñ?£Â/‡_Öå» Z ZÄ|+¥?½?¬? à|8?NôÀºCë­ópXíTª€“=ÇžÓcÙ_µ¿ q–8‹žèÇw?¾«Ï[“´& ’ò“òõëg^<ó¢®ÎùÝ{ß½¨„‡9ÎOô©¹†4Cš!M;c!”F4ÑdážpO3d½‘õÑì+³¯…f„fy=ú¼Ž:~ "Z=uõTýzú§éŸQ;µQè7û¾ÙGD'®ŸC­¡ÖP«ù¹>¢øKOKOKO uºÅ爓$éÂza=~ïË}¸ýµí¯Møv·DDÖ³Ö³DD£F…ß ¿£ïÕ5Ò5BDs6æ¬~Ý{Ò{’ˆF)‘‰èÖÈO#?‰õcD|I’Óát8ÔÉù‘hÍ¢ÙãÛ3Vö§‚“NLÒI ôÎõ;× 4.4€{ŽkŽ ÌæNýè§O˜>ªÔ*^¨z¡ ŠOŸÖ«pðôài Í´PO;æïwápc[c›öÜ"$ B‚çI‹¥ÅÒâ]¥ü”ÅÎ0f³Õ™ößu•w•À£¼Gyp±•ï¼?[í[íXž9Ï òòüUòWpå¥+/ÀæÌÍ™0sÉÌ%zõUÞ­¼ ` ÿ‚ßW~_ ÷0ÐŽv`Á®yIó’¼Ú @š"M‘¦|ò€"Ò"Ò"Òˆä‹òEùbMvág™’MÉêNŽï-dŸ³Ïá†7êê 8õ[ŽlÑŸ‡E7Š`ò—“¿àšL“ ÀùyùyÀûÉ;ËÞY6ö΀¼«–DK¢wX#˜/åKù×sÆüñN ´˜£†C¼!Þq‚VV²•Úä&|1ò >«> Àu¦ïLt¬ïXÿ˜kÔÝ[Ö[ǯ¿ ¨–f¡YðïïŸZg[gí/ –Š¥béHº0U˜*LWDPú‡v¾6 …«Ž 5BPõâÝjk²5Ùšüû©îTwú÷€ýè×ùŒU³jÀ,ØJvÔ¢®žšîÞî^ 6ÔXo¬W¶i;¹GÚ%í*4iÔÌd&³lôsM¥TJ•÷•¬d%’œ’Sr¾UόnjGG•Hû»öÝöÝþ†l¥§ÕÓ lÛhÃö=m,ŽÅ,ÇÓí醛n¸²!{C¶º“ãËCrŸÜgÛ½=z{ôv"Ñ$šD“pÊÇÎÂi†ûž9Òmé¶t[h˜U4«hV‘!ÏgȳíÕ´›jJ5¥êµë-ô l°Àü«ÎQç¨süZ,O.O.Of+9ž!Òiˆìó¡“Ξ„ ·9Ð7† †û)v‹ ‹uÚT"•H?!o¯·×Ûë×b:ÐØÆwŒïßÁ25MFˆbÄ+»ƒ¤x4ˆ_=yA*ÒnæÓ´«4)MJ“_¹¢E?ŠæÎœ?¨þJÓb­T+Õþq)—šOzÁ'ÐSÌŸÀ~I»‡‡‡•H{½Æ^À 7ÜäL   ü׎|L>&ëðý%9¨¯ožF0ØxÁ+>íþõ—´»b튵+Öúµk[j[j[Š“cq¦MBÈr…ÜU»ÛˆA}ú/íiÚ].•J¥R©c'œ[’[’[Â>ŒUþ©Ú)9%ga US5U“ïÚ‘ìAýBè´`íî ôWÜ6 ›„MePex-N§‰Óè|sìpìpì0‘Ô&µImÿ•4¹ÿ›EjŸÒ(ÒäöÀ𻑉Ld€pN8'œû×ô±õÙ¶ Étá>uÔÿ?õ•†0ÔIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-191.png 644 233 144 2527 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–mH”YÇϘã [¾QßLÃúà ½!µ ±%$e’eIHbImEm…`~‰-jéek[É d+ZV!Ò¤5Êj¦4H4–¢Z*³œuW²q¨Íy^îo?ÌÜy¦‚>w¿<Ï9÷üÏÿïåœ{DD$-òˆ›79.%lÇ}çø“%-šú{Ø>i«ÜUþçz<õ8@úéôÓöCÇÖó:>/âäåÓ~IÇ‘x>ñ¼«(bï…UÓWMOš¶öAr[rÛ[6´ohh=Ûz–ïÁÇ`¤h¤[Ïëx×ùbóËÞøEÀÝáîp=‡Ä„ÄÈ.Î.ÎÙø+ÊJËJ^Ž{9NÅ€õ/0žñªDá[ÏGâ5^çÓù5Ÿæë˜¸`âX^¹¼2ù×0àáo°#sG¦æ3Ú€ýìg<˜A3`UYUŒò).\àØz^Çk¼Î§ók>ÍÖ#ží‘…¨Š„ŠÀ0nƒ5` €ý•±Í؆¡ºÕ¨EiÉöß¶ßöƒùÚ|m¾µ^­Sëøx({¼±ÝØŽ¡zÌF³1ºàÛ¼]i­´´À# cŽRD$·3y y OÒž¤°ÄòÙF6ïhå1c˜FÕ¨v³›Ý1*©¤TêQ=`½¶ü–¸ÈžØµv-ï g <¶[Éþd0^ë‰;y6íÚ´ °g©z£ÞÑÑTÑ´´i)ô•ô•ô•8:z=½ž^›wlÞ±yð´óiçÓÎOvŒ¦Mk›ÖÂý9÷Ëï—;;®¾ óEù#z"ÂzêØÖ\Ý\ _gþ4–7–ÇØêîÕ×W_wÜky-¯/½8ôâdMËš–5 ­B«Ð‚Ü{¹÷rïAVVÔ\¨¹PsÁÁ{Nx{GõŽY—Ã|Ðhha=u)7Rn¨óœììrVÊ{?ú~Z¾nÉmɅ̼̼Ì<èìì„s•ç*ÏUB¯ÀWàspùó7æo„†º†º†:¸št5éj’ƒï¸ØÑÖÑæÄ[ÿè?¾?´ô éì0üjøp9\öªÙ>ju´´´CG_G_G¼©ySó¦fÌŸ1Æ|(­/­/­÷°{Ø= §fžšyj¦ƒŸÛ2·en ´Ú­v«#¬_·™DOœˆ}ɾäz –Yj–ŠˆKDD&ÊI—t‰ãŒqÆ8#___%2reäÊÈ‘©Ï¦>›úL¤ÌSæ)óˆdA"9C9C9CÞô›~Ó/"פS:¿¼‹ð‰¹Ì\&¢õĉ‹‚E½w%ÞëóúDä?Ö»¾Q*CBŸò(åQÊ#U«jU­È”[SnM¹%XXX,²oë¾­û¶ŠTÏ®ž]=[¤x¨x¨8FXêšÔ5©kDÜ)n·Ûu‡\³Â|"ÞkÞk"Q=ŸTe(R%æóS•†ÀÁÀAí í ítŽb¬¬¬†V ­Z*¨‚ʹ ¢#ðKà@à„n‡ž‡ž£À.´ ›Ÿ­ÊÜF§è¾¢ûŒ]mWóŽ÷1Mb“@•¨Ó>T¶ÊVÙÀf6³9&ÞÐ?‘|ÑüŸíc1ŸŠÄŠDÀŽtf¬^«H´¶X[08‰¯Ó‡ØËö€êR]ª ¸K7ÝŸl˜Šâ›¬µÖÚ¨ÚÛ˜ññz§>èü_ì]ùž.¾Ø÷Ø—ù‚ý:‘{1-0»IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-14.7.png 644 233 144 2563 13755454066 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü(IDATHÇÍ–]LW† àV\%ØDZ ^Xâ6D4’XW!4FA„¢‰ -’P{áÏ…5J´ÄÖ4QŒÆ,ˆø‡h¤PE©Ø±ñ† ±q›(‹Ø5v] °;3çéÅîaVizí¹™ýþÞ÷=ßùæB1#ümÙÑ_Yþ)+§¬L?²Oµ>j}÷>˜^=½ álÂYó‘e«¸Ê¬ÂÂäS~1CXŽ¸Æ¸Æ(gØ>S> Ùßw‚­ÙÖ<¬CÙÕ²«MuMu| ÷î¼v¾v‚e«¸ÊWõ /_z‡_˜Ü2¹%ê/ˆ‹‹RrSrÓ¾ %ü™kW¯] ð<æyŒŒão žxéüøQËa«x8_Õ+<…¯øH€™Ëf.Ö¯+¶ý*xtvÍÞ5[ñ›#!t¿î06›Ù);ˆ" ,[ÅU¾ªWx _ñ)þk+M!„8–ƒQ èã‚4sZ0-˜²Ë˜cÌ!H•!wÊr˜Éf²™Ì„%ïÈQ9Š4b³³%AWÐz „/¿ÈOÊORåX[Ù/„óŽƒÍmsû'qýIê“T0~ 6s¹€‘ ŒKXÂ[ä¹%Â?Ì0ÃüÏ’i2m/ú´> Àæ·ùý“BÂæÿc§ïòOyYyÈ}f¦‚q}éÚîÚŽ|øùÃì‡ÙiÜ­îVw+tttüG<ÑèN„ê%Õ «‚ëUM\M²áƒZ³Ö„î‘þ²þ23¶Um«óAHà3!„èÚ —–_Zú>YZ¢m-Úʘ:"mYmYmY‰Wè+ô:,­YZ³´fb¼³´³´³..\\k~[skÍ­ñsýÞTßT/K¡Å×âý§Áwö<{žl„_\„@:pñ“ó¾ó>Hy”Ò“Ò×Î];wíœEx´ähÉѵ¢VÔB~k~k~«×kô½ŒgÆ3ã™å¯ÿ¸>©> ò+ò+"ÞÀ30k`Pi_n_.$LK˜fþA«×åul?ö,ª\T¹¨Ú{Ú{Ú{@«Óê´:pd82°§}OûžvÈNÊNÊNŠè¤ùr¾œoÙ¾+¾+¾+êIõ¤zà׌»3ïÎ{Í«/O¾< J@··ÛÛe#?{¼/Ⱦ··"³3óNæèhîhîhWº+Ý•±]±]±]RœRœRlé3Ú팞ǞǞÇΩøSñ§â!ûÓlG¶Ãò›OÃ?L˜ ì7ì7dc¸ù»vrõBý…z`z¨ÇÂécÎdg¢3®¾~øúa ÐpÃ'´Ú rݹî\7¼Êy•ó*æVÌ­˜[CÝCÝCݰùÀæ›@U~ÕªªUã0c† ó^¼0Ju*ƒå»ËwÏÔ©4n7Á÷ƒï²ï22 nnOlîQFÞô¾é}Ó RH!x^§× ò©|*Ÿ‚/Ý7Û7Fnôô!ÁÜnnn†ùŒò½å{•°Ów…š`´ ú'AßPßÐ8oºÙ`6Ḏo©¤¤&5©EQôÒK/pƒŒPn0òÖ¬0î÷ßšcFŸ`° L˜cB ÓWnˆÙ£P‚qz¿Þ¸Œ€˜8ù9’H"‰ÀPè[){äùð…ó?2öû ²ÃÈ2²"ðuÅ÷îä¿•ïííâ½½½Ÿ7Ø·XÁõ£ÁIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-199.png 644 233 144 2672 13755454065 14772 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜoIDATHÇÍ–ïOSWÇO±V!YLˆ&uõGð¦&S©Œ J ‘èÈ!sã bBŒøk5›¿E—fè˜bâ”a’¨°hŠ/ S™8@`:2µí½÷|ö¢½½UÿÏ››çç÷{ÎsžçB!f„¿bRcRcCrÌ—†>>/>oîÅ|FS±©øÏÝt:é4€µÑÚ¨=2dÝ®ûGÇ aäÆÓõb†0q—ã.›\ay?lZ´iQ|JHþ®,-––ÿ¨h­h¸zþêy¾†Ñ;£wÆ\c.0dÝ®ûëñz¾èübÿ{øBÀÔö©í¦¿!.6.VHÏMÏͨ 9ü•…k ×<›òlŠŒõ90éÒL2‰¾^Dɺ=ì¯Çëùôü:žŽâ# 9;9[X_º¾ÔòS(àÑ/Pc«±éxÁà‡˜ʤ2  –©eøAvËnL˜Àu»î¯Çëùôü:žŽâ#Þ­í÷9È’Ø’X@ÞuHmZ°*XEPöÈ 9Ô)kÿh£Ú((/•—ÊKŸË­rkäÑžËd™ŒT^ e…²BYÙðmÞlT7ª€ ã¥Bˆù§P,C–¡I3ôÍè›´P vÓƒé¼æ*ylÊ 9!'€=ìa¡§šjªAZ¥UZ_¹À…({ŽÚ¤6ñšOBù¡ÏÞgÞXú-ý“fO˜Ø™ß¡²®²Ð2åàÎàNƒ‡»Ä½Î½¼ùÞ|o¾ÓÛÑÛÑÛõ êÔ/€'Ož v¯Ëëòº þ³ú¬ú,è¿×ïë÷'.ï†ð"øa>ab÷vPÕ¼¥yKÄý åˆßáwàßܳùææ›FÁ»Ô.µK…Á£ƒGBÚ¼´yióÀyÀyÀy2ïgÞϼ:t<ûûûX6{Ùìe³Á¾Ý^n/‡á†Á¬Á,ü:žl¸xèâ!ؽo%Þ’—iñŒxŒo'ÞNÀ¥O/Í¿4l›Ã怞‘ž‘žh*m*m*g·³ÛÙmÄ­ž³zÎê9°°naÝÂ:(j+j+j3ìK^,y¾ä9üרhèÕõC‡‚ÎG€5Áš =„Ã/†ßBm/›µ“ÚI#ÐÙêlu¶B»·ÝÛî…Wå¯Ê_•Ãâ•‹W.^ ùž|O¾âââ¡v¸v¸vVu®ê\Õ y7ònä݀ججØ,øñèÙgwcF-õ-÷-OŒÚ5íšé¡P•µÊZ!„I!D²ÈVa‘<<<'„¹Ì\f.b¬s¬s¬Sˆ¹Oç>ûTˆÂÜÂÜÂ\!RÜ)î·IIIB¤+éJº"Dѱ¢cEÇ„˜)gj35!2®eœÈ8IŸlº§Ø›>‘;Fóxó8p%Tsf*mJ›~ Ûžm϶Ãu÷u÷u7hýZ¿Ö® W…«lÕ¶j[5Ôf×f×føyÜ e ˦}³¿¿ž'ôÆ€íW¶_h>ß|ž¯¡ç~Ï}€߀l[Çõ~¯ñœørô?ü"ànq·$uCjJjŠx—y—ͯŒmˆÌ‡’Õ%«^º^ºT2˜}@:éÊ 3Œ^ÿ8lï×ùOãk>ÍÓ#½${‰øËý垟b ¿Â¾¹ûæj¾h8Á ÒÁ6†Ì ³‚ PwÔ’HÛÖq½_çk<¯ù4L¼}¶µKaCÚ†´„ {`Þ5ïCÖzk=Ñx@©½ªRU‚õ‘•cå$*†5h½¶^ƒñ·ñÌxêµN­CUcÕe̼iÞ”Æ×|š_œ‚Ô§ÇÓ3ü<5Ÿš ž/™°Ê¬2FžÏ)¢ÔFµQm´©A5¨cã˜íçÎrø‚Ýì°ŽXGe"ŽŸàÓü1=qaÁß`Ç¡‡ßý)Ê4m^õ£ªWõ6ß‹¦M/š ¼3¼3¼Óö?~ðøÁãp²údõÉjè:Þu¼ë¸ãU›jC9Ž8Æ—àé‰ ûý¸0x!!DmcÔ šA&ø™ APATA›Àò…|!X•¹*sU&DNENENwžwžw”>*}Túò ó ó ¡skçÖέžèåèåxÝPÛlþ˜Œ¶Œ6u zŠzŠGЯ®«ë`Ž˜Ã¦}먭¬­¬­´;3xRü¤øI1är9hènènè†üöüöüvhïmïmïuôâ ó yÐÁ—àéIq•¸J(q_u_½úÕgªBUˆ¸Ò]Ó\ÓDZž·ïÇÈhA”µŠÎ°þ,T%¸êZM*¨3°ëh¢YqÉÖ”´Ûгib‘@èJ·àbØ’²®àtÓ Q³õG°Ñe£M%ÖÍ„5+3 Ý:0Ì{s¿þÁÜ7o&®¦iÏ?3çÞs¾ó½s¾{ç Ñœ-¢(wÆ9ãœqNáßá…øyÝóºçugÿDVeUVïý‰6Ñ&ÚÌm³’I&™û@´Ïx<Ïçx?ºž¸3šž_UP…èˆÞ_–&wËÝr·cL8*ŽjD“&’&’&ð׃><ø8çùãóz/æCâO£ýÕ‹“â¤8éÙÄ;d*1•˜JÔ÷ÛzÛzÛzÙߨoÔ7 @‚ ~La S<ðÀh~xŸÇó|ŽÇñ£ë­þøÅüÈœ ‰Câç ȼ•y+ó–²} 8bacé,¥CQ«ÕjµP7«›ÕÍ€jSmªMç‡÷y<Ïçx_#Ußœ Q‚CpÉur\×ÙÇ, –KƒbÓˆgU¬ >¥S9«œ˜‡À¬úX} l7Û „h› ©!`ž +è”Î@E `Ç™‰™àãa–ËIËIÅÆës>œžžžìÝÊ̵æZs-[ëq¸G0Æñ©ª5jŽ€½ÅÞœÂ)<ÇX+4¢ˆPš3õà ‚:4÷ˆg¡g!ÆÍµæjs5[Ëùhüä2¹L.»SÇ7Ο)>SÌ~ð+¥MiÓU„ºCÝú’=žô·÷·?pÿÖþ­Ð¾·}/€À•Ž+ L+Ó€âPëÔ:-ØÏëkâGÌ›´1icÒF4Œeeek‰ R°ûøÔBµ0Šà½ž{ÀÜ=Í[š·è÷¿(ü¢¤ÓÒiHÈOÈ×ÅûrÓrÓ¤D=•2–=êuœçljþîÀ©§DFèWT¯êàeKÙR=–»È]«ŠW뉶.j]¤Ûcßc€íÛ+ôë7snæèò¼}¦> Dös>œŸ>Ri«Áj°jg,ŽJq׉è‡Â°0¬¿rßË}ˆhÝÝuw‰ˆŒƒÆA""ÿÛþ·õq9Áœ Ñ7Ò7Ñgû>ÛGDÔª´*DD[No9MDÆWï¿zŸˆÎE]?q†.C—¡K;òia¢øËPïPïP/ Ä$é—Â!á~Ž,·ü]"¢…÷Þ'"r\u\%" RˆˆŒ_¿Ö×J¹r›ˆÈ×äk""j¾Û|—ˆèâë_'¢Ù%éKÒ‰èÛ„®„."ñ£sî I^×ãõÐçG¢M´‰¶`¸g¬áÓŠöÅí‹u0~÷à»`\e\ êKõ€mÀ6 ýÊ+oÀ™¬3Y`zÍôTW놪 Z­‘<õBkQkQ¤Þ߯_×~!dBFpXF„aä·íáÿºæRµÆZãÉll¦ÒÌâD“ØSÕWÕGDq9c9cD„¥eKˈˆäT9•ˆÈ´Ò´’ˆhõðêa""Æ7ˆˆ¼ë½ëuޕޕÑþpëòâËâËhvzÎ]Pñ¬ÂXad;ÂчÅaqøÓyo·Æ[‰ä›òMù¦}H»ðs-Û,ÛÔcüQC•¬ƒu 'ö©'SO¢N}Ss“þ‹©+Ði/ÓîN©^ª—ê=›9á‚Ú‚Ú‚ZöûôÙôÙôYåŸÚ¨½’WòVš¨“:©“Â׎䎩Gÿ£Åj÷d´¿ë[áˆpD8PåPNèÇâ q…¸H n|™âOñ§ø‰¤;ÒéŽp=œ˜3¹ÿ›%j߬d%«Ü½ýA±ÈD&2@¸&\®ýëÕ¹õuÎ˜É Äà¾tÔÿÜ#ã­€(IEND®B`‚routino-3.4.1/web/www/routino/icons/ball-1.png 644 233 144 216 13755454064 14353 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.1/web/www/routino/icons/limit-71.png 644 233 144 2243 13755454065 14671 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜXIDATHÇÍ–]h“WÇŸÄÕ¶Ð&-Ô QI°7»hE‚DDAëGÁˆ(uiÇôbA&¢àÕ†8*(-+‘:¥Z4P/ÚµéÒ‹]È¢T*­íE[4f¶4oÎ9¿]$ï‡Û·«ž›äùúÿþÉÉ9yDD¤¦ô*à_ç_çcÿ×n¾bgÅÎú_Šñu¾V_ëø÷ì vÔöÔöèçnl×í~(«ïåÙy©7Q~·ü®/ZŠ/ÂÁƃ«Šñ)¨¼_yÿCNöŸìèKô%øfÆfÆÞFßFÁíºÝoÏÛz^}¹ø7¾”%Ë’¾i(_Y¾RB;B;Ö[l˜\{wïÝ Y‘Yaü f*ªLÈ‘Ã^sžØ®—úíy[ÏÖ·y6¿èG n{ÝvØhÿ¡ÊŸ‹Ï{!¾6¾ÖæY÷Ë\¦ ¹B@QGX“2)|øÀíºÝoÏÛz¶¾Í³ùE?òñÞþØ *Tï¬4h¿öƒQõªK­P ª£«˜ŠªVUª Ì6³Íls¾9´(KY`ž˜E³ˆÐ ,þTÕc秞ï¡/‚ʙʙÜðB½PŽþ.ÐGõQ\$K, <ÙG<⨔J©0ÀžºÓû‘Þ.—gó‹~JƮ©ó§Î;ÃÍE+nÅY3žZ=µ:#‘ÎtÏwÏwÏCïbïbï"Œ×××»>º6tmèÚO›ž6=mró¦Ù3Ç0ž-ôF—_ôS2öä;¸½uÆOèh>“ϰdgRWSWSWaslsls Z[[ÝÂöí7Ú¡ýtûéöÓn~àÚÀµk®1õ«Jª$€º©nÚúæ„Ë/ú †Í]˜Ù4³ÉóÕcÆÌXñ ô½Eoq«‰þD¢b¡X(]£kt Ü Þ Þ B(Їâ|||à16¯æÔÜGú¥eó‹~j«k«õ3˜{=÷Úsìß›I3 4ÓL³;ž½—½—½á7á7á70:=:=:Í?V¤-Òiƒ>ݧû´ÇXFeTÀÌšYÏáýøEôCýÐ÷L¤°¯°OìU'™•Y½J×é:'/·ZnµÜjYsaÍ…5D¶†·†·†Eô ÔƒnŸ´‚VPD†dH†Ü¼,Èù ""“2éá9ü¢¿H.š‹þñ»ÈÈЈ#ÀW¢Ì„™¼–ViuuS]©®T—Èžã{Žï9î¶I›´¹aõ«êWÕ¯DÊe²€›÷5ù| ""æ¥y)y‡çðK~>u*Ñ…l! 2ÁÆ®¼»ôîÒ»K°0½0½àÝÂzèñlù•ì•ìȧóé|ÚÓ÷SL}ö©ü÷Xtð9kÉ=Ûðï±¹ù°ÒÔ°Ðçô9,j‰Áç g<¼ý0ÿß¿\ž¯/Ïçës?ﷀˆˆ<þ°®´®´Æ‡°µÈŒÛ¶Ù¶­ú[×Áòšåµ[„ŧŸXòÑ’ôAy£~a¿ˆÉ¿PψËbbšcš-[Âø]xóù7Ÿ·ý,„«/Cl[lÛLŠÏŸhý¸õc~?^ùñ €w‹w ˜ØÈõF¿Á·_Þ}D_¢Ú£Ú-w!&:&ZžÙúÌÖg*øÏ³ðê+¯¾ðCÄÊ Áû€»ÚL1…±< °‘×ýŸÁoèú¡yžÊ~*[ò ó c? 5 6Á‘GVzZpŒcØ!0˜:ƒNæ@]V—°`y£Þè7ø ~CÏÐÍcn师Èû/CÁƒ‚ –h]m©¶ônmXF OªôÝ«{!ðßÀ÷ïA­V«ÕjÌõqÆBJŸÄâÑ´D-”3Ä““€×Ð7¶ò+‘´ZˆŠšŠTã·»nw¿ Ôzµ_q‰K ß×ïë÷VZi]0H#4ÙÈF3¬¼Ê«¼ÀŸ8Æ1•­²ññ«0ÿò°^XŸ«¡yÂÿXý·ªã€å€Å Ó× ­èïïÅ'8êfÎÍœ›9¦`oMoMo /=^z¼†*‡*‡*ͼޡwè&î;Üw¸ï0Ôm®[[·5ü¯ïÞûî=SOÝ=v ÍØÚúoE_/"òÏ28ë:ë‚[F«F«Ôþ•¾åõËë™ËúEVzV:¤Ž¤Ž¤ŽÀ©¦SM§šÀqÆqÆqvÔî¨ÝQ ÉéÉéÉéп½{ÿö0Ð;Ð;ÉÅÉÅÉŰ鯛ª7UCjQJtJ4s÷rýOûŸVûáÓÚOkAÅ„æ‘`O\M\jßœoÎÆ~ñäO‘?”e”e˜™U™U™UàLr&9“ÀÑâhq´@mvmvm6¤¦¦Â5ýš~M7ûNVœ¬8Y›G6l1ã/xÖ}¶î3øË­†?˜ïœï„@pÑ׋¾VÍÖGô;Ñï°–rß~ß~‘|îx=(J(Jqx‡G$1?1?1_ÄÙîlw¶‹¸§ÝÓîi‘΢΢Î"f˜aFÄê·ú­~ùiåiyZž&â¯ðWø+DòÊóÊóÊErJJD¢~ÙÙ(ã""6ˆX"#^xµ¢Ÿ±´TÍ0qoâü»j¨n¨%Ú†mÃp´ôhÉÑóKëRëRëR!c_ƾŒ}fÜár¸.¨ÞU½«zh.Í¥¹ ËÖeë²ÁÎÝ;wïÜ .¿ËçòÁ²õKç—ÎÃÅÉo´o4€éCÓ‡ x/OT³Uši˜iè¹.Ò½­{›È?’GGxk®mnÕÜ*™o_Ònk·‰$ ' ' ‹ØÚlm¶6‘”)7RnˆÄŸ?^dM÷šî5Ý"9“9“9“"™–LK¦E$noÜÞ¸½"~ßã÷ˆTþ¼ò¹ÊçDölp&8d~ë⬨¬(Þ’þÏ ?/‰hðíñíé¹.T‡N¼]þv9ÌB§dìÚèÅÑ‹01š4š„Ý8úâè‹0{göÎìÐíº]·ÃXÃXÃX袋. JT‰*O¡§ÐS²[uæ/Í_˜¿îÜYî,”š ¼xÉ<•x,ôð© OÓÇÀð•°ÏøÔ2µ ߣ¾¤lʦl ü*M¥©4P}ªOõ-ð·8bˆõkUªJô1} ŸJ óÿööÃÛbݱî©HîüŸ7Àû/ó炲‚2PM!gV׃ö Ôß 4\\å*Šs´ÐªC}©¾NsšÓÀ^¼ úUê ßž 8¼¼‹¦®Ü7Ðm8ÿ‘oDÚ£ÎÿøÞ•íëâ±}=ž/Øÿ0x?:âéIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-0.1.png 644 233 144 2461 13755454065 14742 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜæIDATHÇÍ–mH•gǯsì¤ÖÙÑ­>’"¬e:05$"C ¬†„QôúaŽ1V mÁŠEÁú2"je +’ÒÖùäÒÍÂ,$*Í2rôœ…ø’ç{6ìÙñ~Âþ®2ïeÞ›3áh÷Ñn€»íwÛùÂÃÞT½©ÇÖq¯ë5ž_Îü_|=¾Ï8¤/M_*y5y5ùŸ%Æò¡nGÝ€×i¯Ó”¬)À_U3Ì OÄeëx2_×k<¯ù4B@ÎÖœ­"°«aWC扂?‰Ü¹šÏ¸œã~0gÌkŸµ¨~Õ€8¶Žë|]¯ñ4¾æÓü =²øn/VC}z}:$¾Ú˲,P5æmó6†ù»µÌZ†R_¨&Õ„sæ˜c010·ýž]n—£ÔUb•`€íµ½À¬Æ¯Ï¨ÏÐ/V»®RDäÃï!3œžYÂÂèÜè\ w;Y¬ ̳Šmls )¢ˆ" B ]þN:é«ßê·úÝt»â¦Ýh72ŸÂgÔµ ÅŸÔ“vég8~úøéÔw~¬ºŒÆœzõÍ«–W-ж²meÛJ>þ|ü¹Ã§ž¨'ê ¨³ê¬:ëø¯»rìÊ1...vÒUQaT8|BORØÐ—psúæ4¨_Ô¡dE,òmäT䔕•Aq¨8T‚¾¾Â>˜ N'ƒŽ£Ò¨4*aïàÞÁ½ƒN£„ÚBm¡6'Ïú)~0~XRç!ͯõ©;. —‚õ ‹ÎÕ?®N\€òšòšòÇ¿1¶1¶1—½—½—½Ž¾z¾z¾nUܪ¸Uyá¼p^zºzºzº\¢fÐ º™üZÏ‘´º´:Ö‹ø^ú^zDfDD$šlÁœø“øÓøS·¿Ûß-©h´ÚEb'c'c'¿¯Ó×éëiÈnÈnÈi=Ðz õ€Hüzüzüº“' ’+¹)+*â»ï»/9"iëÒÖ±Þ+bí ç¹ˆ¹ÓÜ)âKÒ_´´ˆL4N4N4ŠDê#õ‘z‘ÙÉÙÉÙI‘µþµþµ~‘Ètd:2-b7ÛÍv³ÃoŒcƘˆôJ¯ôº„Í˰ §¬ͯõxEfªfªžŠôõöõŠxOˆˆpXBvƒÝ ñÚáÚgµÏD6mß´}Óv‘ü©ü©ü)‘Ú…Ú…Ú‘²Íe›Ë6‹léØÒ±¥CdêáÔé‡ÿòöåíËÛE|_Àpüž2•¥²$žìÁÚ?¥çSi&§Ä0£fÔ5E¨,•Ñè@tT³jVÍ rTŽÊHO¤'Òv¥]iW:3Ý4Ý4Ýñxo¼×Áãóùà?§ÒµÇŒÑ…Ñ×ûܲ†˜·£jµZíZçÕyu8ÂޏzØX¼`˜ž½¤ˆýöþÿ½ÇmþÄ&¶ ¹ù‡­aà½Ê^…¡~SoÕ[!‚?‰5¢FÔð’¼péðQB Š+–mÙ`X#úfþuó¿³ÿ•ïìëâ}½›/Ø¿ðRâ":Äë^IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-17.8.png 644 233 144 3021 13755454066 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÆIDATHÇÍ–L”÷Ç?÷á"¿ŽÜL…ZÀS‹V’¶Î%þXÂuh““à!¦¿\cD[ ËŒný£!]2·4›‹aI`#ub%·ÂÙŒ¸ ÓÎÅA(x:lb«•"Cô¸î@îyžïkÜ=Ü¥Ýö·ß.Ÿ_ï÷;Ï'ß÷}DD$7ñ+`]a]aÍŽÇÖÉ|ÆË/»ÏÄãf,U–ª±÷ çDÎ g›³Í¸‘ŒÍºÙŸ:/’ÄOå3ó’+ÉDº?Ýoñ$â£ðJé+¥ߋǿ ‚£ËÑõo Þ:÷Ö9€Î:?à'ðõ•¯¯<ô<ô@26ëf¿9oâ¥âËÑoñ‹@ZwZ·å H_’¾D ·n[ùÓxÃç+¡rG倯l_Ù”ô™d*!‚y¦Sb³žè7çM<ßä3ùãz\e®2ð½æ{ÍñÇøÀÓðÎÓïʈiNÍIL»Ëåƒ*ŒãCõTõð(Á¿¸Ê{""%à¸í¸±ó—[E·Š@ÿ^þj¼h¼Ht‘Bcžyþ÷‰MéFiJSð+hPeªŒ(JàÿhüòøeGĉع×cûåïDD~]/áýsûç¶ü?ïýdï'êkˆˆåRKfë›­oŠ}éôÒ/—~)}XÓÇDÚN·n;-2V:V:V*r3ïfÞÍ<[®-×–+²lÓ²MË6‰X¬«Å*2:1zgôŽÈ™>\òá±çÍåìÈÙ!{\­%-%-êþv7çnNÆ„å‡CÆa ßú9t¼Ôñh祥7.¿úö«oóؼ"½C½C½C0R9R9R ]]]PÑWÑWÑ—¼Û-M-M-MÉ/6àðx¡¸¹¸¹¸ªôªHUŠKV ¬àq(<ùé䧪%0Äõ¿Éöf{•&ÏNž…7¥”ÂÙµgÂgÂPx¿p²pºÝîÀw7wªàTÁ©¨TªÿKýªãªãª–¯Z¾jù*h2šô&ž\Ó¸¦Ï}ÖóY@¸3Ü Æ±ÌŠÌ åpf9³Œç§[§[Aµ/^{6û6û6û ÓÓééô$ gŽÏŸ9EEEл®w]ïºï »è¿è¿è‡ÊîÉî1BVÑ.£ËkÌó‰ÈFq%î†ÄܱâX±ˆqݸn\—ÅÓîi÷´{D |¾ŸÈÖÐÖÐÖÈü¡ùCó‡DfwÎîœÝ)2Ò8Ò8Ò(â>ì>ì>,ØØØ'’v;íBÚ‘+»úö=—ˆ}Â>!¢|ºU·ZBV±G¶E¶ ÷ËãàùàyËDDØŸà_Ⱥ‘u-ëšHZmZmZmRXp88©ðVx+¼ÉüÌú™õ3ëE¶4liØÒ RÞ_Þ_Þ/’_—_—_'âüÂr†DVw®|åû²ðã‰Z­Ÿý"×|\#bûÅ\ù\ùpÂÇš/;øîÁw»Æó ÷è=>îw Ž.Ô/Ô'Wôhû£í¶C4 FƒÉ¼QoÔõ0}rúäôIPÔµô|=_χ©Ù©;SwPú‘…µ k§ž'tð™ƒÏ˜†Û|)!¬¤÷÷#vÿfü›E/FGª3¡¡¥DuÔQ÷|lF=P@e¨§ÔSj—ÚET=ÇWŸŽ8f³;ëI:¿J8¯ÚmÛmK:?éÚ=íЬGõ(1“,2È~Æޤ»Å8ã þ©ÆÔ0•èo×gõYbê‚ö@{üÞtþÝöÝvˆSªó?¹ÿ•Oìëâ‰}=™/ØÿZÒØvå_ÿÝIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-9.2.png 644 233 144 2464 13755454066 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜéIDATHÇÍ–[LTW† —‰\¤A¢f¦>Øx-¼4q’1!^GÅN I#!J¨ b­1dlšÖÆ5)†´©™ ¢I¡‰O†Æ!&0¨HQ#·P°#:朳¿>ÌlÎAcŸÙ/“íµÿÿŸµ÷^g+ (Š¢,‹ý*o‹·Å§GqüI#ž²'eÏšŸ£øºqãþþ%d\͸ y+ó–Þg`9/óÍëÅà7ëɸ²L1ÉMÉMqö¾G7ݘ²<Š¿mK³¥ùÊ”=¸×x¯‘ óù‚ö  ,çe¾\/ùÌüÊÅ·ô[[â^BrRr’¢@ÎîœÝy•Ñ„?ò`_Ѿ"€á„áÚJª°!BÈ1iÂr>–/×K>É/õ¤~ÔY»²v) (9Pbiˆ.èû ª­ÕV©i­QQÿÒ²µl„8)JE)˜j5ɤE®° +¨}**= nV7‘|ÌÅø¥žÔ7¶RQå£z°ŒYÆBK„Œ­Ù+ÂÚaí0a¾¢‰&“@d˜ ‹a1 ”RŠÙø7´Ð"¨kÅ„%?ÿJ½˜~ÌOÌØõß ü|ùy  Ìj¢šhèuWuWtW€w§w§w'<<<ºº[wën÷¯ê_Õ¿ ®¬¾²úÊj|XXoð‰?#ƒ‘AàÔù‰ ¸áöÔí)ÐÇÄç1‚ÙžŽž¶ž6È-Ë-Ë-ƒí×¶_Û~ Öž^{zíi:;tvè¬a¨§µ§µ§lªMµ©`¯³×ÙëÀvÆvÆvÚ?lÏjÏšOŸÕ¿—zQ}éGôGéDŒmÛÚ§,ÞˆwÎ;;žíx¶ã™ÏŸÉŸÉŸo®7×›kÄïTÜ©¸SÕçªÏUŸ3âëz×õ®ëo—÷©÷©7ô¢úÒ™i™iz/LŽLŽ€Ø?íxÑð¢áEä»ò]ù.(ª)ª)ª¤­I[“¶ÂMÏMÏMïŒ~W¿«ß›ê7Õoª{¥½Ò^ áËáËá˦Ä%R/ª/ý¼S1}`¡@çÁÎýûÁép:œ¸!nˆVæ­Ì[™­ÇZµƒéÁéÁéAè(ì(ì(„¥–nXºêÂuáº0„ü!Èúgúqý80$| ½·b Ϙè[xÆ‚ÙÁÔ`*8J%ް²²‚Zw­»Ö £]£]£]°­v[í¶Z¸ðä“ OÀòÐòÐò V¬(Xé÷Óï§ß߯¾»¾»ÆÓ~xï{ëV»%­ªOõ·hÎ6—=— ãããÀ%.q ôF½Qo„×þ×þ×~W…«ÂU0Q>Q>Q#¯F^¼‚Ñ/FËGËa&nÆ:cE€îÑ=Àÿ{+M}lf`z`zÞÐ^–knÍMXŠQcêW9"Gä§8Å)ÓÞGˆD›³QfÍP?¡Ÿ0õ1´ ÞÓÇLgŠ3P!Öùû´>À£kãDD»x#Þ è¦“N`”F@EP#8q‚øE4‹fíbJL!D“–¦¥ák­X+žÿQ ÎY©Ñ~+íëbѾÇç ö?!à—~Š•â!IEND®B`‚routino-3.4.1/web/www/routino/icons/ball-7.png 644 233 144 213 13755454064 14356 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷Ü@IDAT(Ï­’A ìÿÿó<N Qãz…5@’¤a€Wv?X‰ºà‰Ï×`åýÅ&ʉº+Ü’_vêëß7óU/?£IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-8.6.png 644 233 144 2530 13755454066 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–]H”YÇŸ·™q4? .v1JcY—5r#ØÊEC,ФI ‹tÙˆ¨¥h»‰¶È-é"–.”ÜBZJ ì‹– Œ¨¶ Ü\D-ÝÍŠ$wmÂjl¶™÷ãüöbæÌûnÅ^wn†çœçùÿþÌ9çy€ˆˆä$¼³¼³¼Y‰Øû3¨ TÎ=‘ˆÛ,ðÔzj¾‡ìÃÙ‡rå³ï9±^×ùîzGßÍÓó’#΄ÿ´ÿ´§,7Aݼºy™‰øàuH?“~æµ Îm8ÐÝÙÝÉf¿5~ `²l² œX¯ë|]¯õÜúÒô_¦]œvÑóü>¿Of/½´àÛDŸP½¼z9ÀXÚXšò€õ È$S•"èvÅz=™¯ëµžÖ×<ÍOø˜Q:£TV¬^±:ýh¢àÞϰ#oGžæg€fšÉ3bF¬z«ž¨ëê:<àÄz]çëz­§õ5Oó~ä¿{ÛR ùB>À0~ë‘õlì7ë1Ì'V†•RŸ«¹j.Θ`‚ 'TÔzµÌß͸GÙOÌ ³¬qkˆ%õUÈòkƒ-®­)üÒÇÓÇ#‰Œ8[³L™Ök Q~ ›n—‘ãç8°„%,qÍ õX=V]ó­\æ2ð©µÏÚGTëófdjd Rü¤Ÿ¤±¶°q÷ÆÝÀ$€]Ì Óoú? ÿDÿ±þcphÏ¡=‡öÀðþáýÃû®]iWÚ•Nü`óƒÍ6CKGKGKônìmèmpô”e¼0^¸xšŸô“4v÷;8ùòäK°»Ô×IØÝæ»»îî‚ü¶ü¶ü6¨µj­Z òççÏÏŸC%C%C%Ž¡gÅÏŠŸCIaIaI!T¨>P}¬[°nÁ:èÿ¸?»?;•³ÿм_ûñŠd]˺öåW"¥å¥å"ò@DÄs4¹Ó~£ØXd,‰5ÅšbM"åÞro¹WÄ×åëòu‰L O O Kj\Z|iñ¥Å"£ÓG§NÉóçùóü"•5•5•5"y™y3óf¦ÒýžO4/ÉOúñФU§Uó…È´óÓ΋Èo""ò\WÆ£ñ7ñ7"ñ`<ŠôtötötŠðš×¼a˜a\ÆÌ-æs‹HÀð<"E÷‹îÝ9eŸ²OÙ"·Go?¼ýÐÉç3ÍKò“~¼"öû‚gHĬ1kDø[DDfèÂÁüÁ9ƒsD Ö¬-X+r¶ñlãÙF_Ÿ¯Ï×'rsÛÍm7·9 `K°%Ø"’y5ójæU‘MG6ÙtD$k k k@dÔ5F —±ÍKðS~Þ>c*’:c}ô{uðUÓ«&¨Ê©Ê©ÊÜŒÜŒÜ ¨k¨k¨k€5 µµµÂØ•±+cW ±½±½±‚ñ`<‡U#«FVÀ«´—ñ—qò˜Rï?cïÞJ’·äŽÙcö8·ÈÜin7·ÃDt":[l±ÔVµUm…ps¸9Ü v¯Ýk÷‚êR]ª Â;Ã;Ã;Á:`íµö:zÜ3ï˜w\¼÷ßÊÿécÏ­eÖ2¢* ª…®Z¨ U!¨A5¨]ý*DˆØ;bG\ù³T•ªµVZ+]}ìÍ{osu~BP0SÐ:,e) uE=UOQüDmÀ &™5¤†Ôð㌗ù…_@ÝPaFÑn–‘ÒKé'yïvþö[ùÁ¾.>Ø÷؇ù‚ý"ÎPÇŠ“IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.png 644 233 144 2364 13755454064 14675 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü©IDATHÇÍ–QHTYÇÏØ–šfI‰°)jk¶‰ÔK„®Á‘$åf"ÕZв²°>V™Ñî®e:BÖ€=˜„µSnKmEŽî”áJê@ V–u{îùíÃõ̽íf°ož—áÿïûÿÿ÷;s¾{!„X0õ+ &=&=&ÉÆ1ß:ñ¸ q¾ðÙø”O‰§¤gÌ?>ÿ8@ò¹äsVŸƒõ¾Îw× áð»õt\,N ¶5¶ÕS8…–•[VÆ¥Øøç›ßßöÖ„ª+UW.¿tžï |;|`¬p¬¬÷u¾®×|n~qð_úBÀìöÙíž¿!vNì! c}Æú%ßÛ ýK`cñÆb€¡YC³T È@"‰ªg½F]XïOåëzͧùµžÖ·ýXT°¨@ØT¶©,¾Ñ.èk†š´š4­is˜D0ÇÍqY.Ë1@ÝT7ðàë}¯ë5Ÿæ×zZßö#><Û_¾†Ò¸Ò¸¨¡[LÈÙ`5X DT–*VÅ(óŽ0 U‚JõT=UOÁ´LiJßÈRY 2I®‘kPê+Ógúˆ€´¤vW#·=­/܆¾üâÃñáñÏà±|,·xÁª·ê™P£¤’ TRFÎ:ÊQŽ‚ScjÌÇ;Þ``¸âXVSÀÕ‹êÛ~¦Œú öìß³?Zœ¯@µ¨.Õ…Ò;¡Å¡Å¡Åp¬ùXó±fèéïéï釡UC«†VACvCvC6œ83pfZb[b[b!Ø<<u§Ôï‘k‘kn=­oû™2öçpáÕ…WѺÖp¤.Rç×àýÔ­üȋΙæüg.M³ö²—½Ëÿ_sì#“?öd–!öÉ9@DµªÕƒRwT@@]P>åšh¢ Èa)K¢ÆìE¬ «‚È€ èð''ÿŒ}WÎØ¯‹û=63¿`ÿü&}Á$xIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-22.4.png 644 233 144 2742 13755454067 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü—IDATHÇÍ–mlSUÇϺÉZ;a“Êœa™„82^–a¬§DÇœA‘D^Â:ÄÌ…0I ’8II7·g´:#.5ÌÒl ÃÈcš†·±î%!{ ¬t@i³­÷ÞóóC{½U?ø•ó¥ù?Ïsþÿ§÷œó?G€Bˆôø¯S¶)Û43†MÛ¸ùUó«ó¿a I%I%×?‚YŸÏú ãpÆa­ÇÀz^¯Oœ/„ÁŸ¨§ÇEº0©Í©ÍI…q\ r7䚟ŠáO;ÀrÜr<¬@Ù/e¿üÜôsïÃØÅ±‹……``=¯×ëóu¾D~Qý/}!à±–ÇZ’nBêŒÔB@NQNѼŠXÁÀ_çÓùu=]?Ö±”w…¢îe( –A> íTz¢™ÑLÐ.D{£½DãJ9WΑs@¹¡t+Ý ù4ŸæÃÓ„ ÷cõ mѶ•»ÕVµ´'büP:Y: u}})Bˆç>KÈ ¥È»}}À»¼r¹\N„ßè ´~­_ëj©¥6¡‘j¨9!'äÿPr³ú‰ú ‘xô5Â}gú΀®kì¹Ïâ_Ìs^žv$9’t-¯wnwww7¸Ÿu§»Ó‘—ü—ü—ü†Ž?ÅŸâO÷l÷l÷lð-ó-ó-3ò2$C2²NÖÉ:#>tjèêÐUäïÚÖ¶­5ôxÞÑìhnÇúÚr!„ðí†_ø ®Ÿuºä¶ìÈ3žg߉Ãâ0¼ñSÉ®’]F^+v;™ßÌüF6 ” K†E»!?güãØ÷nò¿â–Ô/©_Röû€}§âTœÐïï÷÷û!דëÉõ@aEaEa„N†N†N‚Þaï°wòŠòŠòŠ`ïÙ½g÷ž…UY))†ž Ž_¿¸Ò¿LÿR»!´ÓÊÓÊe3ܹ7×\½ ½ ðx¦yÐ<Õ²Z«Ö@mR›Ô&¸Òx¥ñJ#X¦-Ó–i8póÀÍ7áaëÃÖ‡­ G‘0AGÐN¯Óëô‚Õl5[ͳ>§8§Ø°õoŸ8’y$ 4õO«Ëê’ÍB™­ï±Ó‹O/†£kOežÊ”ÛL…‚©¥þ¥¾¥>È9–s,çÛŠmÅ6ȸq;ã6äòy°µØZl-phþ¡ù‡æC¾3ߙ²ž²ž2ã 6xêêÁ~ý…ªªŒ=Æ“?$ÿ TÆ÷ŸÆNìØ³cDŠ’;Œ¶¶ÁÈù‘¡‘!äØž±Ê±J¸¿ýþöûÛ!°1°1°FjFjFj`TÕF5·‡ÛÃíÜÜÜ ªWõª^£±Ieòîä]䃵bB$œÊ_ËMå&Ýp=ç…î†Ä}L÷ä<9ïoßùÿ¡  $àƒä ÈNÙ%»€·´ ­‚=qþûÚûÚ|ìÎ?|L¿ê^æëÒÚÒZG¢²SMUSAžSͪ™(ر#å9Ù&Û@ž]AÒ+½Ò ”ãÀò Èp ÚNm'QªÕ ê`FŒÞL~3˜þ·ó?ºwå#ûºxdßcæ ö/òšb¿¯HIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-25.5.png 644 233 144 3060 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜåIDATHÇÍ–ïOTWÆ8­ ,†’Û4ÊA»6M—Ê›¾a\GH›1 j­Y… ‰cšlØÄ¬±ÆZd‚¤¬?ºš‰3`¥íªÛVë/0"‘¢…,¶fè´áw˜ Ý;wîœÏ¾˜¹;³ÝÀóææ9ßï÷yžÜ›óÜ#@!D~ê) {uöêìIœ]›ÞÏqæ8KÎ&q§Yoe½õíðüñç¬<¹òdâQu£?s^ˆ4¦ž±/òEzc¹¹?kC ·ÁÛ¥o—æ&ñ‡×Á4£q¨ë«ëœœ¦~ºõÓ-€ù ó ºÑoÌ|™ü¢íWúBÀ3ýÏôgýËŸ]þ¬`­°VØ“ ÿ²Aµ«Ú0¹lr™Ì}°`‘€Œ5“zªß˜7ø ~CÏÐOúð‚ã‡ðfÍ›5æ¿&õ@˪–U†žr Ä#ñ€¾Cß òº¼@YÆFÝè7æ >ƒßÐ3ô“~ÒŸrV!Žl÷œ{ä‹ÚÍøˆV @â±Ñ"h<@êô½ôßè¯è¯€¾KߥïœTRIz]%B©ÿ)Öë@ÓíZ£Öº+ÉÏVw»À0xdcúSþC!Ö} æˆ91ÉÙñ›ã7wØ ò ùK¥ƒäù C8FŒX–Hd",²È"€\+ײ”ªn†”^J?ilÝÇ©7Öùü⽬÷² ¶Ä«c«FGGGáèµ£}Gû÷Ûï·ßo&˜`‡‡‡Áçð9|èìì„ٖٖٖ ßc±±ØO»‚]à«ò½ï{ÙuÏ÷µïk˜=¤«ºšx^kx dUÒHüN!†š¡÷Dï øörøPøÜ½zé¥Î—:QMŽZG-Øòly¶<èèè€âHq¤8.Õ¥ºTØywçÝwaÂ;áð¦ÍåÎåÎåBa¨0T‚êÝÕ5Õ5°óÖvÏvêãßÎ'ær7Z­Kúúðs=÷‘ôÃ’º¤B¯ù³‚Ï  ¥©¹¬¹,-°þÌú3ëÏÀ¶ömíÛÚAQF”pö:{½p*z*z*Êÿ­ÛîÛîÛn0¹L.“ \®Wœš:Ù{²7£±,ì {€[+®8(ý‚øJóJsâ¡Ü7½}z{úØíø®ò»J°+vÅ®@•³ÊYå„ËÖËÖËV¨·×Ûëíp®ç\Ϲ°Ú­v«ΪgÕ³jZïZ͵šk5Pw±îbÝE8ß}¾û|7XíEJ‘ç-Ì@|(>ú_ò|y¾ÄC‘8gñX<Ò ?.ü#‡ÆÚÇÚ!WÉyœóÚ®¶]i»’J§\ ^ ^ ‚wÑ»è]L(—å²\±Êc•Ç*Aß§ïÓ÷A°4X,…ý%ûKö—dô¯x}ôõQðiݦn€Ú­vƒ^œû$÷‰ôgË?F»¢]ÃB 8œBÜ-zzbTKÔ»ôûOŸ:„(l,l,lb|a|a|Aˆ!ËeÈ"D^E^E^…vÍ®Ù5!¶´niÝÒ*DÙdÙdÙ¤J­R«Ô qÃÃÃ/DþÞ|O¾Gˆ—Ÿ¬½ºöªˆý¡cO|Oœ=Bô•÷• ‘=ôKñ/Å“§ê½õ^øwµ·‹§ö>ötÞ`ÿª7á•´¢¥IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-135.png 644 233 144 2750 13755454065 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍVûO“W~Z.µNƒDH37Ë5q„ib$€—ˆ”m$é‚Q£ûÁh¢ufdq1ÐØDMQœ¦ÍSƒ‰—©¤rQ¼ÀJ7Á~ý¾óì‡öðáü8¿4ïíyžž·ïÛüiŒ7Æglc‰îŸ’9%ó‹ú€]¥’†5†5í&#ŽF%É({”]{ªÛ2.ó'Ö:þD>éG$t‡éœéœ!-hï#óå/š2;`ÿÒFš›ÌMÿúÉÒ‹¥IÒqÊqŠ?’¯n½ºE’ÃiÃi¤n˸̗õo">öý Ã.‡]6<'Má¦p€´¤[Ò畺摹ٹÙ$ÙÒ"Œ$IªoHNã4‘FÒK/åy;Á–ñ`¾¬—x_òIþ€ѩѩ¹zýêõæ“‚§¿“;âvÄI>¥‰äà4Òïõ{IR-T ùm¢$i Ôm—ù²^âI|É'ùzðqo+¿¥È Ï 'é'IÅEª}j©}¦”+åTÄm1"F(¤dí‘öP{Hú{ü=þR$‹åb9ÉarTRÏ«ç)Ô¾<_õ;%KÉ"™%ñ×*k’ùõVÀW¿Ñoî3÷yCÉg‘Ï"IþA’\©¶)ÅÂ÷tÐM÷xË(>ˆâÉýÜÏýºŸWy•WIf1+@<*Uª$)>Ÿó}л’t»Ü.’4{Í^o¨ÔVu“,ÛS¶‡ä0Ij‹E…²SÙ©ë8±þÄškÈÖÖVOڕݕݕÝdWFWFW†w¬r¬r¬"åË<–IÖÜ®¨ x÷x°}°}üÞsîæšÍ5²µU7{[ÒŒ-)/R^ˆC¢.®ˆ+ðÞ)l-l…¡´±ôBéÀÛèmô6n»Ûî¶É É É €«ÖUëª2“2“2“€{õ÷êïÕ[ÅV±UÎ|ç&ç&Àetu»ºaqz7{7Ãà7$² ånÊÝ`±¤ÙÌhÑúõR$¤ØRl2`8)êØÎv˜r~È±åØ€ø¬ø¬ø,vØaF¦ŽL™ Øúmý¶~ ¸§¸§¸ˆE,btÔuÔuÔžzO½§ÐšCs+,+V$óvÌ4ÿLXà3¤O=Œë!£¦GMמoÞ¼{Ñ ÑŽè-YV´¬hYé0:Œ£î***!3:2:2:Ȥ˜¤˜¤²ª·ª·ª—ܲwËÞ-{Ɇê†ê†jҲввlÜ~fã™úšQ¶ ¶RÐ.i— O ú³ýÙ €h|ƒ¨@[g´|´|´ˆÎÎÎjµZ­Vò=ùž|Вؒؒ†¸vúÚék§¸±¸±¸1`CÙ†² eÀœ¾9/缆ýÃÃãðѰ+ï”w€Ôc¼iÞ´ûwz£íF€Q`±a©˜)fÊߌ…Œ…Œ…ë¯;¼î0066Ì*˜U0«°ÆXc¬1@ElElE,ÐÔÙÔÙÔ D>|ù°X»¬]À÷ËŠfÍ–ø,¹í:è:Œëùd*}Á)éó?ñ?ѧÒó«ççéÛíÛíÛ­·Ò—ãËñå¯M¯M¯M¤Z§Ö©uz\9«œUÎ’o¬o,o,¤vTkÒš(H5[Í&Ùä“üA=ú£ù•ù•7”t«nuw%©mÒ6ñ=ÿáGG\×ÅuRØ…]Ø'øÓEºH'5§æÔœ¤Ø'v‰]â_ú+ü|ϹÿÙ‚g HŽš{ͽŸì± ›Ÿy¦<Im|óßWï“4©6ÕF…U¼Áúæçvnã6R8…S8IÖ°šÕ¾ÁÏlf3…øSµ¨*lPmªmü>]TóBóBåM}´ù'íå¤}]LÚ÷Øä|ÁþL8§kûôÖNIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-20-grey.png 644 233 144 6271 13755454063 15775 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü nIDATXÃ…—kPTǶÇÿ½÷žÃ%€/äýP¬”‚QÑ0H4j¢F Á@Њp‰1ÞPz´‚*9!‰¢·bD®(CˆcÎ X"*Abå5ã03{wŸÎÀ)«RY_ºº{íÕ¿^½º×Ú$33333.x*ãOnµp_¸/Üg ™§2OežbžÙCÙCÙC/…2WæÊ\?ûÑKô½–¦LÕNÕNÕ²\Çq'éB‚t¢R‚–«Ø¢Ø¢ØBÒ…a@h=NÆÈû 4Ë#Ë#Ëã✤œ¤œ$2(úˆ>¢Ùð”ƒþjårá¦W`Vpå4›fÓlú«yÂo|ÞøüÒƒööö¸°4fiÌÒ’. —…Ë€enËÜ–¹¶¾mÞ¦oûÞfoÚ¾u=Ûú6Ÿ`õ`$sbN̉&Ýd7ÙíSÀûð>¼Ï¥§'NOœ^è6K3K3K#ˆéŒéŒéä,‹Û·/n'›éŠtE:Œ8ŒÃ8 Œ0Â`va€9˜ƒ90NÍ›š75›Ú›Ú›Ú›˜åç Ÿƒ~¢FÖ¬Y÷fžÊGå£òY©”vK»¥Ýk X2KfÉ÷¸H’1™1™1   Mhšç(Ô µBmS…Ùd6™M 7ú¾èû¢ï‹âŠØ÷bß‹}O(wÑ»è]ôðÅlÌÆlˆ,€°èBº8À 0À H7é&Ý1Œa Cwww½ª¯«¾®úZL¸×x¯ñ^£ð›ÜNn'·û½^Ü"n·¬‰Ç¬Ášþ'œ]³]³]3 ó”yÊ<ÿñ/c½±ÞX¿p£o¬o¬o¬¸)9)9)9IøÍÅÓÅÓų¥F©Qjh£q ‚ *€ä‘<’^ÒKz2BFÈ@ÈèËôeú2)^Š—âçQçQçQ̶Ù÷Ýæ»Íw›¸É¶¾ÇÆG²²²6,37››ÍÍõÍNOœž8=aþ©}©}©}¤Ù¥Ü¥Ü¥ÝG÷Ñ}pⲸ,. €;ÜáŽID"D! QjPƒ+±+d"™3ê4žÆÓx€«à*¸ èÇßwü]ÐcŽÇ9²p½³ÞYïL´òpy¸<|c8Ç‚X úû6K”%ʨ[Õ­êVÄXåô5ú} NÜQî(wx\÷¸îqÐÚÔÚÔÚt<èxÐñ‡Ä!q@*R‘  õ¨FCFCFC€–+-WZ®¿›7ÿn¸h.š‹hÍ prùÆå—o W·¨[Ô-ˆ±ñØøÑ_ôý—§ºVºVºV"7L¦S“륹óÜyî<Г֓֓œ:}êô©Ó€²@Y , † C°`û‚í ¶)±)±)±À?ÆñÀÉ”“)'S£›ÑÍ蘖›–›–«¬~°ú°qdãÈÆ‘iGËÃÃÃIÉ¥áK׆‘;¡žPO¨—§âîîŽæ–¯,_Y¾’ÙdB"‘ÈtŸ9992v,âXıˆ™ñ‘G~ù‘±ƒ &0v{àöÀíÆÎ}uî«s_1VøváÛ…oÏèß¶¿mÛž±Ã ‡'06tzèôÐiö¬LØxl|>Á'ø„qg¹³ÜÙé)`†晘 ¶[‚-Àš®5]kºþ+ÖÎÑsô`×o×o×X6[6[6Ã-Ã-Ã-@p{p{pûŒ¾ßA¿ƒ~Ù Ù Ù  _Ó¯é×àYQp‰\"—àŽá x/Þ‹÷bçôú} Ä1~Âna·° …(D!H´)Úmh-¢EÀ•ð+áWÂÍ+šW4¯~î~î~î€ß~oø½T=¬zXõX6ºltÙèml>OçˆCâ©Yj–š§§™µå'nLܘ¸n·‰ÛÄÎ ÊÏ•Ÿ+?ó{Ö}¬Ãé#}¤ ÙNÙNÙNÀrÍrÍr 0m6m6mÞzõ­WßzlllòÎäÉ;ð|#ßL*&“ `ÕáU‡W[ß´¾i}HµCµCµ5^­¼Zyµ’S©$•¤’nÅ[ê,u–ºŽ’Œ¾Œ¾Œ>×q×çÊ~’ý$ûéW;Ã;†w ï,LV«þVý-‹^”¾(}Q:ùeøÐð¡áC`ü~¿„Ä‘8ˆsŹâ\`á Xø0+eVʬà‰î‰î‰èÞÙ½³{'0ëÚ¬k³®ÞÞÞ0¶´´ ®,¾,¾,?ªˆŠ¨Èä:Æ3žñKãŒ`ß}‡W;ªÕŽ|3)#e¤L· °Ú6î‚»à¾+¢OèúÖ¼èÖ¢[‹n}XnXnX.ü<ôz=džk=×z®æÈçÈçÈU„*B`+¶b+ 0+Ì 3àuÃë†× À¥Í¥Í¥ z}­¾V_ ‡òÐòÐòPñ7i¶4[šÍmâGø~䃓ˆF4¢(D.r‘+̳–yRøÓºQø;)"E¤è—½|1_̨eþÌŸùsG«†ª†ª†Ä=c;ÆvŒí€Šl'ÛÉvè©õ¢^sdŽÌ@$" à{|ïìÃ>쨂*¨b:ê ë ë ¥ýcUcUcUB¡ÂCá¡ð8“øEà_ä]B²E*Ðnt‹kmõ¨=zÑ‹^ñÖaÖ‘ÚС'BOäoUf(3”grtJR§Æ«£ª£ª£¤ý¶ÉGä#ò¦H i!-žÞÆ™÷†2Ê(w»À]€â²ö²ö²–E_7\7\7ðùöööý“æ s…¹âЧw²îdÝɘ–i™ÎV3ßÙ@Öö,u ÔÎ7ÿ¸ùÇÍ?sš9ÍœvèS{W{W{×ûg;ë:ë:ëøü†×^oxE“½d/Ù -£e´ v°ƒÀtLÇt‰HD˜kkkqF³D³D³Îöƒöƒöƒ 4âЧÜîw¤’;ÎçŽó…Ömn°%bÛ¹õ—DaíZˆÏ‡h¤ýdYAVDo}úËqé¼eeeÝ÷&}“¾I¹Õ‹,>²ø¶ÐÚA; â‚¹`.Sbº˜.¦CQPP ¾0øÂà |—r‰r‰rIþʧ—æÀo´„–СÐz²ÿk;±œœœœœèm…u`:†¬±»ß»…¤€‚_¾çÔœšS¨E2’‘Ì­³ÔYê,âžñÒñÒñR¨8Žã8:›'.š.š.š¨±¿¤¿¤¿„ïR~¨üPùá S§N=ü0¯k}×ú®õ€Ð×öžÚ§ųIö•ÕÀ¿‘†4¤‘ó¡5¡5¡5ù[•©ÊTeꙜ1¯1¯1/a¼2³2³2SÚo­èÛÝÚÝÚÝp²©¹©¹©™$¨:Tª€úR_ê»ïWa‡°CØaZåîîÎÙ’ì+¶ õ,?‘¨¨¨¨¨(ˆÖn;“39““wCCCð­´@Z -¸**üþ ÿíG­}´öÑZ·šñ»ãwÇï²/o~wó»›ßI‘‹Áb°ði²Õ²Õ²Õ›ÇJY)+ýÿ P@£Å(c;«£ÄgyþBþ$v³Ñ€4HY¬–Õ²Ú¨n®š«æªÿé?¹yróäf"+‘•ÈJ¸»|2ŸÌ'ÿÜPPPýR”¶[Û­í&?Ñçèsô9vÂj·Î hü3!ÏÄ®õ¹²°{±Wh%I$‰$ý+€5°ÖðÁ.;o;o;oî.ßË÷ò½½égô3úÙž?:â;â;â§€ð·Ú³–¦¿âøv¤—|IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.1.png 644 233 144 2375 13755454066 14751 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܲIDATHÇÍ–_LSWÇe¨€$,&›q‰Y4‚Q Ñ'šh ÓMˆA«Žéć1^ֽ郱>èH j™·iB¬€¡Á™(°É&q¸Àœ)™Ù4–&ÂÔ 4iï=÷|öОދƸGÎKóû÷ý~{Îùýî „bIúW€Ëír» S¶ësÛŸ·5oëG?¤ì6 Y»²výqŠÎ(¾P|ÁzhÛ:®óõBØøN>íK„íÈíÌíÌò¦íã°{íîµyï§ìo!ÿZþµYwîv;ø¢CÑ!€Þ^°m×ùº^ã9ñÅñ×ø…€œÞœÞ¬ wAî! tKé–•_¦þZ ;¶íØð4ûi¶r€œ³Xyi¦ÑkÊaëx:_×k<¯ù4J€’š’!`gýÎúüoS¿ÿ2ÿ2Íg\Nr’Å`N›ÓÒ'}$@ ªA²ÈÛÖq¯ë5žÆ×|š?¥GÌ=Û–ÍP—[— Ìw@ÎÊYPefÀ `˜MLPÖˆu׺‹½$HI’¶Û*°ª¬*”‘²,—åf4~]^]žزÙq”Bñq+äGó£Óï5þ*ƒû‰š’µ²–8ŸršÓ!§8Å)P“jRM:ütÒ rPÊA nºqÓÚcí!®ña\ŽKÈð§õ¤…µýGŽ9–ùŸëÔ÷F›Ñ–SáÃ%á8³âÌŠ3+`dýÈú‘õ8TX…Aù•_ùm{c{c{#ŒzFËGËítµÅ¨6ªm>›?¥'-lä+¸»ëouPЃuV=XnÓmºMð¼oÜÍîfw3 †C[Hryryr9ìÞ;¼wؾ(}çûÎ÷·óäídC²DZçAͯõ(ì/ìWÝÝ–‹9«ë³®†®ð7û›ýͶõ“ÕOV?³ž³ž³Û÷Ä=q\©¾R}¥J£¥ÑÒ(ôvõvõv9„ýk^7¯;™RüZ€â‚âëO˜ŠLE™j{ÕlÕ[õvYØö…}PÞZÞZÞ Þ&o“· â-ñ–x‹ã²_µ®ZWm{ÓM6€ ´‚–CØSó¾y?cNeøÓzÞÜ±ßæîØØc7ÆnÀÂ¥ —.\ 'ä yBÂLh&4‚ä¥ä¥ä%x´æÑšGkÀ¨4*J»¾rcåÆÊ¼¼¼é6/šß¾c.!¦½ÓÞ߇…¸5pK¾B¥›6y/qïå½—B$B‰P"$DOmOmO­e”Q†m=m=m=Bø¶û¶û¶ ±"VÄ™µ¨cQÇ¢!r s s m–G©"‘LßÁCš?£ç®¼­»DҀĉªDêÙ/ÏúŸõCd"2™€ kš°`v`v`vžï{¾ïù>åcùØÞ‡XS¬)ÖÉ;É[É[vWò³2CïìJÇËÌ=g¬ýÖþÌÜÒƒôÿ¯×òçà½kŽ9&¿Y—]—­AŒ;•5²T§,êWS1”º®‚*¡‘FP1S1`ŒQF:r¨ E»´¤…2,À™Æû䟷ßÊyûº˜·ï±ùù‚ýÞÒ‰ƒ`ÿL´IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-35.1.png 644 233 144 2774 13755454067 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܱIDATHÇÍVýk“W=oj›ÖV;QK+*2º ³ˆ…êÔ´j‹ý@·-uÖł늊짦²áœ "®­âο6;Ö¹*##T¬2­v1ÎÉÔÖEkB´fy?îÙéíd€÷——sŸç9ççÞó^€7&¾ -s-s-ÓØò‘¹Ÿ^ž^>¯+ÛtRY¯¬¿ù™}8û0IÎøfÆ7Æm˸ÌO®Lþd=¹7`nXÏXÏ(Ž ì& Óg'ðW>2Ûá}¡‘®ï\ß‘d÷‰îü˜éé'ÉgŽgÒÄ2.óe½äKæ‡û}€Lý!õå/ÒšfMHûjûêüO Á|²¦²¦’$¤#I ýS}»¾ÔßÖ ôRoÐô’•\˵4×óD>i”%TiÚ"m).'øÉÚÔÚT’!©/GyÞ:DfD3¢Ñ)Âø~’­$ɵ¤(EçO¼È‹$+XÁŠ$a:õ$¬Q£–„{ØÃR÷é>ÝG²×¸cÜáøDt-µ€/à#¥~¢±·£Ðö«à–u[ÖI6ãßÿ¾Vs­†ÜÜØ ® –ËL½îªîªî*òHÍ‘š#5dÇ@Ç@ÇùtèéÐÓ!3Ï8h4šø˜ë˜û˜›â÷âÁ‚ÁSO|à º‚r´m¿ZŒ°ä{•›*7WªîæÞÍUŠVxVW÷wúúB)_\^\^ \íºÚuµ Ø&¶‰mèuö:{€_ñ+~ˆØ#öˆ“K¯Óëô: þJý•ú+€ë˜k—k”‘úÑ©£SOd)Eâ‹åñåqYµä{‹âÊ g†¥SK§‘óÆ)Ç·ö5ßo¾kãŸ##@r`°s°s°ˆtEº"]€qÖ8kœJ J J €yYó²æe°À À!q¨n©n©nì#ö‡ö‡€1—:`hì8Þ\¹qåF˜þËô_ƒœ1mÆ4ãÓCc¡1óÚGv…·†·’k× ®$ÛÛÛȶ{m÷Úî‘-»[v·ì&=ížvO;i/´Ú ÉS;Ní8µ#éÈ5kÍZ³‰K6—l.ÙLvçFÏšzzôñíÇ·IÙŘ¿¿¬ÜB,{_ö>ààÏ_û¿öc–Ss;‡ EŠ.ÜÃ=Üôì;ÙwÈ‹åÅòb@]S]S]0çÆœsn¡²PY¨ #Œ0­B«Ð*ÌѪAõŽzÀ%ÅÑÉíYx¡•ie`œ7Î+·,–ç/ _^zú{úç¥ÝºÙ8v5ä yŸ¹afõÌj`mm hÍiÍiͼÃÞaï0ݞݞݪ…j¡ T¨:PuXæ\æ\æBé¡ôPºÙXæ‰Ì¶Ì6 5+e4eTž16*¾4_DQÇõÈ[À¾¦)MSÌ[ÿò¥ã¥ƒüÇú8ö8F¡wêz§9õ´zZ=M&„I‘/òE>)lÂ&läÏÏi,5–KͺHsdod/EÜ?þãø¦kZմʼ•àùW|ìRÂÇÄñIÛ 6p\¬ëÅzÒè5z^R¸…[¸MA1_ÌóIæ2—¹I>cŒ±$Laö$c ?Ðÿ>&ÿ_é¼µ)µ)$w$œYôja-L²C¨?¤*Ù¹—­l%ÅEÑ'úHz饗ä3ŽqŒˆ›â&ÉáIço0¨2M_®/'Ù1éüÖZ+iêOþÄ_Ûåkûºxmßc¯ç ö?g›«þŸøÍIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-39.4.png 644 233 144 2747 13755454070 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜœIDATHÇÍ–íOWÆ/`wyAcÓ TÃKÚ€©&°–,+¾¥Ñ6Ä´1¼$4¦Z´bbÙDb£¤²1Ú&Z?P@@kk­ ˜¶ WãV TvQ‘Õuqwæþúavœý¼_&Ï=ç<Ϲsï„¿þzø< ‡—ó‘‘o|§áŠÊ‡öB\S\Àüãó«#Öãz~h½¨ž>/â…1an3·…åql~kó[‘¯jøàeˆêŒê|€ò®ò.€Žo;¾åSø·ÿß~€‡yóÀÀz\Ï×ëu¾P~Q÷‚¾ðÊÙWΆý f“Ù$$Y“¬ÉÛµ„[ɰiý¦õcc270—¹2ðàAS!XóõzOç×õt}­ ß[øžPôaчQÇ´‚‘°+qW¢®çïö³Ÿ¹ð<J©RÊ,ÈËò2a„õ¸ž¯×ë|:¿®§ëký[éBˆCùPâ(q€zÀ߸ëOö'ƒL ¬ ¬ÄìTªnuB€ÀýÀT` d™,“eÃË#3Z>¨Ÿ¨Ÿà—ÕÊÊ ÆjüPâ+ñt}}+BˆÔÃå‰òxæHÕÑçèl¬™.Óñr— &@–ÊRY ´ÒJkH#ùä“$@ÿÙd“ òcŦØðg×ñÄqÞqt}­±ÔÂ{BÑrERQTQ¤³¨™ƒÿü¹éÏMÐÞÒ‚¼á¿á»á3t®-¹¶äÚhÌmÌmÌ…Û·nq9*Gå(ÈVÙ*Cà<çt"ÝüóšŸ×z¼YÑVÑLjýå!„¨†îöîvø}ý­E·ÉmñbÓbÓ˜-ÜW¸»p7¤XR,)8ݺÿt?¤¤¤@ÖhÖhÖ(¤T¥T¥TÁøÁñƒãFÔD5QM4°%`™±ÌÀ»-9Y9YÌ—±M=yÒ~Òôjý5#f:fZ¶ÁãsÏÁyõ’ù’j-5Q5QÐóNOVOXÆ,c–1(»Yv³ì&Xë­õÖzCp™o™o™ìf»ÙnþÿNª=T{¨Ä7â¸8ï_¼³xgÈŠÇöínÍ;:ï¨l0?v~¬ú‘îîÆgÿhßtÕt)8Rp2â2â2â §»§»§²Ó³Ó³Óa펵;ÖîÓ Ó Ó hîhîhî0»–v-íZ ™ÖLk¦j.Ô\¨¹9 Ùs²çzòûºû:p ¾9¾YýK( £‡£‡e<Ûól|}ÞÞkï…ÕµÖ’á•Y2_æƒ4I“4´I›´…ØC’L’I@9唇œú:ê¨Ù'¯Ê«Àu»º/#Aþ/——B|Ì¥û˜¾Û³ºó~ñAð¹æÌòÇÀt`8¢Œ+ã†ócc/{A^•}²dAÀ H‡–ÃÀp0µJ­ÂOÒ«ô&ÿ¹Þ³ÿåýW¾´·‹—ö>örÞ`ÿ÷mT„¬W2ûIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-6.2.png 644 233 144 2510 13755454066 14745 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜýIDATHÇÍ–HÔgÇŸÓ©whW™•uÞr…ä…eýWƒ„"X"9nQŠ –%ýØ*ôŸÈˆYC1fAQ[ôƒ…Š^ÅdĤH[….³cg™‚z†»v¦÷ý~Ÿ×þ¸{üž«ö·Ï?wïÏóù¼ßï{~|î „bNôS@œ3Îgà¸R3nÝdÝôé/|FK¡¥ðÏJ˜}jö)€¹æ^0žšXÍ«üØz!LþX=s„HjJj²äEñqغbë ëü®¹6Íó»®ïºÐr±å"û`°}°àuÞë<0±šWùª^ñÅò‹ãÿÑZZ-~HJLJ–l\²qé·‘„¿–BÁæ‚Íýñýñ2ôa …™ ¢ÆH VóÑ|U¯ø¿ÒSú?ÒÖ§­¶lÛ²Íös¤àé¨È¨ÈPzaPM5) µ €^¬3ò޼€ ˜XÍ«|U¯ø¿ÒSú?búÞÖnw’; ø |tt@îÒîk÷ kµImi¼4|†sŒ2ʨ å'2Cf€öTCitj9ZaÐýº˜ŒòKw¢;Q¬Ý³•B‘õ#ØmƒÁ÷¾ñ¾™âÿ‚Tý ~ì#Eý^ꨣpàÀc¨_öË~`;Ø“ÿ­´‚|­çëù„¦øÇ½Ao¦ô£~¢ÆÎÜ…²£eG‹±R^ŸŸ6õ|û|¥¾R¨=_{¾ö<<Úýh÷£Ý¦®qɸd\2ñ³ÅÏ?[ '3OfžÌ„ÎÜÎìÎl“O…}aŸÚc¥©ñ5ÖYWÇ®ŽìßD &Ÿ¬ÍZ›µ6 Nœ(8¹%¹%¹%Ð%»d—4 u§v§v§‚SsjN òªòªòªÀyÀyÀy:>îHëH›JŸ0ê”^D_ù`o³·É&\=¸ô/™6® _º2éYéYéY°·noÝÞ:8|óðÍÃ7aHÉ¡cžLO¦'*ŽT©8bÆ—÷,ïYÞõë»ê»Ì¸þ¹úÑW~℈/ˆ/ [ˆ„ 7„A!„èZš6_›/„Õnµ[íB¸z]½®^!ƒÁÆ ,,,bjú ý…~!JûJûJû„ȩϩϩbáÙ…gžbçï;Ûv¶™ùñ÷•^T_ùygÅ|ÓWÌÓäiô4BöóìçÙÏÍøªý«ö¯Ú5‹jÕ,‚°#ì;àᡇ‡‚dW²+ÙU¡ªPU‚íÁö`;EÆvc;ðR6ÈàåûWì3†Úó?ô=ú&TYQsQsQ3$/K^–¼ ŠýÅþb?< < < Àºuëà˜ë˜ë˜ l·l·l·`Múšô5é`¿f¿f¿ ¿5474›gLÿéƒgìý·’~­G뉹E‰0R9R9R Æc±¤MÚ¤ -–@ „ÊCå¡r...ƒW/^½xõ¾((ƒ·–·o3`TÕÀåÿ½•1}lÒ;îéc_ë·õÛ„Œ tJgL¿rF° É ™qÆgœØ1a®;€Qb”Äô1¼ºWÿ`›Öù­n+ C´ówëÝÀ cž1°¼+Gä’‹œã0ÌC G娾Âä¯Ò#= ;ä˜CÊ&}–>‹0ßëùz¾2¾‡æŽwÇ«•šÖùgìåŒ}]ÌØ÷ØÌ|Áþ zÞR-›?}ùIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-35.8.png 644 233 144 3126 13755454067 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍVýO”W=ï8Ì0–(‘RÙI –Т,cƒ€Ê‡“qD;ÛÄ«$Úmp·¡1Ý a³Û•dÝÆk¬ÝQ6Q ÖÆ„ÚaÃJÆ[”ª`w º¶:ˆ a¾ÞyN^gâþÞ_Þœçãœ'÷æž÷‚$ÎAê^Ô½¨[ÁºßEãñeñe™íܦ’Êfeó?‘‹?^ü1I&}–ôYøfky­>¶ˆòÇêiq$"0ž6žVŠçq3iϵçÆ?Á»Hš:MCäÎ/w~I’Ÿw|Î=äø¥ñK$9Ugù5»ÙM²œå,‘T©RÁ³œålÌD! Iˆä~¶°…$e­¬å,óü¥ózóú¼™¼m½Â]¶]6.üÚµ_®Z¯ZɃÃÝÝ”á ååQÁK‡¥ÃB¶¶¶’G.¹|ä29Ù;Ù;Ùû;Ækí×N\;A¶6µ~Ðúå¿2 ¢zҵ˸˨m[¯.|~{NÁÆw6¾|gyaä%¿è_EÃEø®O]ŸB)[UVXVô·÷·÷· Ò tÙ»ì]vÀ¥¸—L7M7M7áÉêïïl^ÛcÛcÀÕäúÐõ!” G¹«Ü…ÀÍ™û=÷{”|¥¼â¥Š—Ù™G§ì|nú¹é× ’…% G_={¨Ûí|÷λw`¬»U7^7,Ã2,pÅqÅqÅçþ3¡N¨Ê1 ¸¥¸À+ –Ëë…z݆å†å\“ïŽïŽ‚ ¾"‘“…kòöäíA²Ýº­n[¨ T*ö±}@Í¡šC5‡s…¹Â\ì3ï3ï3†ã†ã†ãÀöUÛWm_ÌeÏeÏe‘ÀH`èþg·£ÛðUf2Ày¦0“ØçŽs#¿Ñ½§{+táç}>e¾Å-þøû7Ÿ¸>q!Ù²ÿhÿ¸!ÿB>À<À€ó¤ó¤ó$æKó¥ù€êúêúêz åzÊõ”ë€'Ï“çÉ‹îØ@Á@Á@ÙÙÙœ­9[s¶ˆ»çŒs—ª¾úv É€~L?ˆMÕ©:eb€+$¿XóÅr¬Ñ·Î·NjWnÈ»—wþ%ö%–%²ú\õ¹êsäàÑÁ£ƒGI³Õl5[ÉEm‹Úµ‘uþ:Ÿ¼µúÖê[«ÉÜÁÜÁÜAòFÁ‚ä¦ð¦ð¦0™x;q0q´½iñY|ôO•ݲ[jÉÓ?þ‰”}‘y Ý:ëõõúè- üu®x®˜ôïûîû(ªCu¨Žè- ž ž ž"'â'â'âIÉ É e©,•¥äƒÆIY)+e%©¦ª©j*é™ñüìù™¢î d²£zª_^¿âyó:}ÿ@j 5 Ù%Ù%ËkÃË¡tkéV€W)¯R´Ô@º˜`c1oÆ“ñ&ßÔ3õ ŸáOèX\´¸Hʪʪү$ž_ƒCK-5|ÖMà4§É{žP»Õnâ {t>|àúfÜÄ›|SÏÔ7|†?¡G>\ÛúMP™V™h«[=Pœ“ÎI,g¾³ÆYƒÖu¿îǵI&™ÆcÌ…õAݤ›ÐÎ2ë„u  à}²¾®L­L5ë7y–RDä»sMN|=ŠÏÔÝB‡“ådñ^õ¨Q5 tÑN»G ĉ÷à…RúG]¥«<ø;§Ü)OȶÀR0ßԓÖøöÛÌd;y¼µ_Ú/Aÿª¯è+‰ù¸\s¹ær   xf¦T—êRЗô%}ÉÅ_Ü~qûÅm¸_qÛýmn8ߨ‹ìEØNžËŸÐ“öø Ç‚cÀ>ýèBÜ>k·Ã®þ]ý»úÝ…ïºÐu¡ë‚+@íU{Õ^кQ7ºøF{£½Ñ†õMë›Ö7¹¸sÖZi­$΀áKò'õdvgvë]] œã›^93­9­9­9ÍŽfG¡ónçÝλn\|m|m|­ë×­?Zäª\•«PÞVÞVÞæV¢2T1H’?©G k~Ö|çÄ^Ç^{ŽýŸºE·€ê z¶Nuaua5„œrøÄ:"‘Žä•ä•ä•@ݽº{u÷`Ý’uKÖ-ñ,ý¿Î 3üžä›áOèñ‹8·œ[¾g"öv{»ˆ(Y,~‰HDD $_òeƬkÄñ…|!_ÈÅcÕ±êXµÈàÄàÄà„Èð£áGÃD‚ƒƒEúÞô½é{#Ò\×|¤ùˆˆïk®?WÄ©Mò~£ç“=FrÍCªT•gi¤¹Z( àΓ;Oî<©ü©ü©|XqxÅá‡a¨{¨{¨Ûohlhlh„ á á aÏÔ¦Ú×íëÄ[gÖ=ö™S9mÚ£ÀížÊ±cÆ€UaUX@€ˆ5Äb àd:™N¦Ë?¥¦Ô”‚ñïNjNj=§²Ónµ[=|³ŸJO›é+¦Ï8{œ=3}ø¨_™>fì g8ºW÷ê^àÊ(þNŽŸTñô1eúæ¬}l–΀Ջ£ª‡N­S‹E€U¬BsfšÉÄݨÃ:¬ÃÀ_<å©Gè)ÚhCó¥ªUµX Â* ‰Ÿ±zá³ÎÞ•söu1gßcsóû? „p ÛðÒIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-58-red.png 644 233 144 4322 13755454064 15610 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷܇IDATXí—LÔçÇ?ßÇa 2™”ÃU±â‚AeØ  w 3‰ÁY*±#™¶l*YE¦˜b%¡š)U‚v•)ËV,©‹ZG«æŠNᬧü88îû½ï{Ü=wß»dšeûüÃ}žçóãuÏçý<ˆœö3ò2~µÖ¨5jÜs×B€_½_½_}ò¯DY”Eù¦e´Œ–Îm¥”DId>àí+¥,žå³z¬¾w?~µ7š/ò(¯õÞ‰ëÅz±¾vÛÃíáö¸A‚‚G‚G‚GМ~?ý~ú}`sßæ¾Í}@FBFBF‚Çgû,žå³z¬>ë÷bâã½ýy§øQ~”5/c'–––#ï;Óq¦ãL‡òŠõ™õ™õŒc c`†fÀí»öY<ËgõX}ï~óN½˜t|?ßÏ÷›[X„« W®JqÝön{·Ýp™¥D)Qä"¹H.ä9FŽäT9UNUù®}ÏòY=Vß ìÕ_èFãj¹Z®–H<"Tw²}©¾P_(¥ºÁö;b±°JÕ“5“5€b–b¤Sòry9ÈoËopà0ÃcSŽ Ç ˜í&» ªmy¶<@Ù¯„)a°²0}©þþ”Êú3ÆGšGšGšG¿^Átźb]±Ñó´çiÏS »êXåcr¡\¨°Âêi˜À„ÚU¶)Ûe(|b!³Ã®ªÖóÔ<Ý<úb]‘®H‰`<ŒOàe^æåšw•›ÊMå¦.ñhøÑð£ádZ—½.{]6·A6:o¥¸sàîÀ]"šú"ï‹<"zõǼóˆˆî<¼óˆ¨«·«—ˆèµ¯ "òkôk$"êº×uˆ´M6}HDSO”' Ÿ±0b!‘lÄq'íÏã‚[‚[HÑVi/h/Ð?[n·Ün¹ÍýÆÉ÷úS—KðÒà¥ÁKQ:˜<˜<˜ ŠU±BB8ûΟ]ùì à¼÷ žO«}¿Y~³`0{0ÚÅv8 g€ÀÌÀLU¼5#2#p×wš4˜üÌôÌ0ÆÇ@ÿ´ñøÆã»Æåî©S+XØRÙŲ‹ûSìO^#>¥œ{¼=^½žr9å2ÄeÅe©×ÛSÚSTÀ–ΰÎ0@îög<Œw]©HAcÐÜwLK¹HG:ý‚-]ë¼ÖIDtwôî(QÜ×q_½ñÞï5n>¬~A 3 3ˆˆîùßó'"ú4íÓ4"¢J©R""Zþñò‰Èîs ¢ó^ÏVS§©ÓÔ¹¯|¤ éïèïèï n?929B‚°KŒã ô;W쨶QÛHD4×ü]DD»¾ÛõÑœ¡9CDD›ô›ôDDš4-X<@Dd­²V¼qòQÃʆ•D453jf=¬ ¬#âé<'× ’`1[Ì3u3>âSùT>ÕþÄuÄ¥çòÎ¥KSIÀ߾Ⱦúö`{n|nTOi,~,„[Â-8vîØ9˜_6¿ |{à[µ û }ÏèåK•Û*·yúý­ìÊð•a÷/àï¹h.š‹¶?!a¥°RXYXžƒð_êÞÔ½)ÏëùmoNoŽçùPÖ„H!ÄÄPØÖµ×¨/Õåõ—×À¢ŠEûUîWjõ}oüÞ ÅWߨ¾Û¸k{iaädä¤Ãý „!BÈ'Ã`0ˆÄv±]l¯éw?øI;“vÊ{Y}Gþé´Ói°Áèj0ÎàN¨÷|°çõI^ðyaB+WÌvÆ;>Y_µ¾ UH@ÎÍûwìwŒ»s…\!÷Χ?ÝzfašhM´&Ú|–%äí;»ï¬²Æ=¹¦S ª ª€µ½¡½o9ÞlÂ&¯­w²w.¬¸°·9ëËYžó½8Z[^[î<_"€/áKø’Édn67››½øŒ pË}¿²¹L.sm%WÃÕquL+Žwmµskç‚©s\ÞëXìX¬Rš•fÀ;x€¢$*‰€*TÊe¯âž¬ý5}'ûNáþºH]¤ô÷Iv »óõn´TJ¥TQçaM¤DJR-ÕR-‘`„}¬€®R·U·U êy¿ûV÷-µv¥`)ЊV•v™èŒŽ.G l±ÚGa0…) óFæÌÌ™ò^V_-¢Åx(twèîÐÝD¼ž×ózî’‹n;Ã|Õõw‹ðPx(<äš" " " ˆ49šMŽñ[»‰úD}¢Z»Ž|G>l0Â#€! aÈsÐòBy¡¼ÐsõÊcËcËc•5¬ž&H¤ êŸtú:ïIs­>£'ÎÇýÆÛ×ù;µÛsÉ£Ýü¢ü"•vƒ¤ )ÈäxìxìxìÑ¢ &˜ã4Ó4Ó4“’îÖdÀlý£+|ø´ôâ¡\¥Ýl.{m:WÃÕp5jíÛŒmíJmR›ÔæQîDèDèD(°ddÉÈ’ùu·ë„:¡î£ULj.éùN§—˜'€ðh×"XTÚ-Ó•éʤ žšžšž6Ø`Ã#ÍoÊoÊoò<;b¥X)Vš\ÿ’Lû»O_×:½ò2@_c []ÚmøOÚMÚ´!iƒG»ÆUÆUÆU8ïÜWܓಸ,.km¡w~ȧ/Gÿ¥½L»«…¡D(1Ç0à¬â¬â¬båDÔTÔTÔ”tÛ=j‹`,ùaTMÕTM®gGèñé§¥ÿÑ|µ{ÈÛOzÀíàvp;J¡Jq,âçðsø9Gqô×oÂÇÃÇÃlj„ëÂuá:wÅ•¸Ågrÿ7 r2 b§÷öûÛy…WxàZ¹V®õ_së Œ>“éö©ûÒQÿc¯ûÉ^ãµIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-131.png 644 233 144 2542 13755454065 14750 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[hTW†×L23Æsaú 5D¬¨HŠ/h5xW&&ã%h¨M*L‰hÕ7}0"6V‹!†mi@aÄZ5*Q“ Æ jb1&IMD°!šLMœ™sÎþú0³çŒ >{^†µöú×ÿï½ØÿlÉŒÿ 8sœ9α±ØYnçG-µüóßbñqEŽ¢¿öBFmF-@V}V½ÕiÇz]×'ãEìþÉ|:/™b'<§=§ùñx?”ä•äú4ÿØigÒμ6 âlÅY€à‰à ¾ƒç7Ÿßx™ÿ2ìX¯ëz×ý’ûËþwøEÀuÞuÞÑ·Ç-¹Ks—N¬Œü= V¬èKéKQN0ÿÆ0Få!Bè¯?)Öëñz×ýtͧùcz¼‹¼‹D pCᆴº óWØ=~÷xÍ=ä cÀ!³Ô,% ªEµàÀv¬×u½Æë~º¿æÓü1=òöl,A»‹Ý€½f¯Ù Ö'ÑÊh%Qu[ ©!”–l=°:¬0žO§ ¾PÓÔ4Þý”5&º=º¨ºkÔ5‰ ßàõZs­©Y’4J‘©5i½i½¡Txœù8ø€UfK47šË0AºéNb «° 8À$ m´ÑŒcãÀ|bvšÀï<á €µÃÚÁpl㬂n³ÛH{žö<”ªõÄ…o…mû¶í^XÓUUtOt­#°!P(‚öÉí“Û'Û:t|tþÑùGçCwgwgwç{'FàÛ@Y  :fuuÙ'®¾Šñ%øãzâÂîasÃæDùVã‡ð´ð4›noº¶éš=ðÖ{­÷ZïAW]W]W¤ûÒ}é>(ŒF #» wAîèªêªêª‚­3¶ÎØ:ÃÆ7þÜx¸ñpBoؼテÁ†A-ìî.§ÈØëc¯Ï˜-SúúãóGú…6ÚÄãûÚç÷ùErVä¬ÈY!"õR/õ"C£‡Fñ÷ùûü}"555"ÙýÙýÙý"¡ ¡ ¡ "§ Nœɹ“s'玈õ™5Éš¤yÄ#_ÆøD-^´X$¡²Ò³Ò­‡Ðÿ¬ÿp!víUƒuÌ:fbÞ–y[æm 3è :íü@ù@ù@9¬\¶rÙÊe0%4%4%®<¸òàŠ]7gãœs6BÐ ZAËΛÿh›‰óÇõ8E¬sÖ9ÇC1ÕÆjqˆˆˆWfI–d%v&#•#•#•"Þo·@ä¤uÒ:i‰” – – Š\¼|ñòÅË"Ìd&3En]ºuéÖ%. —†KEäª4I“—á8ŸkŒ5"ZS$”Ê¿ÿ§¤6·4·ˆÈˆˆß8f«l•-Ïpg¸3Ü"oRÞ¤¼IYW½®z]µÈ€kÀ5àñöx{¼="yÕyÕyÕ"ëÛ×·¯o·ù3k3k3kE\c].—+‘Ž8¦ÇøDš¯6_IèyïVFâ·¤×xh<´oåàOƒ‡Adodod¯=Šˆ/â‹øà…ç…ç…ÌGæ#óÑû·2¿é‰ô ÀškÍZ?x+§ÖØ>¢}EûŒµÙÚÌ0ÿ½ã˜MªI5ªWõª>)ïVnåõJ½R¯’à KŽõKôÿ %9?Åžb`%œÿ¾yð˜~ÓO”ã4Ólûß³“ U£jêxïÀT0ËÌ2ŽÞÀ(N-NÕ'õ–ó´ÿ•íëâ£}}œ/ØÿßÎÕN•Ê[IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-70.png 644 233 144 2415 13755454065 14671 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÂIDATHÇÍ–]H”YÇŸ¿#¬HÈhIZ-Š»ib+Ì0 éã¦M$dIYo"k"Vp¡Ù„¢)#² úÜ —(6t¶‘è¢rm )a J‡•Æ™÷œß^̼ó¾ûѲì•çfæù?Ïóÿÿ‡sÎ3G@DDæ'?œKK¹‰Ø¹ß³·do)ú!Ÿ1ÀQí¨h…yó:\XpA Y±™7ëíý"¿]ÏÄe¾X@Öµ¬kw2öÀÎU;Weç'â?äÜʹõ{êo×߸yñæE!Ôêxï~ï+6óf½ÙoòÙùÅó}ÈèÉèqŒBVfV¦,Û´lÓò¯ÁåPYQY0–6–¦`Œs™«Ý@„æš°Åf>Yoö›|&¿©gê'üämÈÛ UuUu9]‰†¡nh)l)4õb·€œ`.Ä#ñ€±ÛØM´_ûpà+6óf½Ùoò™ü¦ž©Ÿð#ÞÛï¾€šìšl` åTNÐ}F‘QDÌH3V+ÑÆ.£Ö¨Ãi8 èÃú°> ú}T…øoñgñg ›µOûРNª“Ę6î÷S?8ÒKé‹ÝЊï!'”Š¤Ãˆ1b¤¶f+¨½j/ÓX+JøÈG>ÚÐbŠ)±ˆE6|%.\ÀçÔP ÚU;ÓÉÞ­–ž©Ÿð“4væh8ÒpÄdS«µ'ÖkIÑëWŸ½Züj1t–u–u–Á¹ð¹ð¹0\ºwéÞ¥{ðòøËã/ÃèÐèÐèœ ž ž Âèàèàè 6"Ó1´m‹µÚÒOøI{ú5\™¼2™jß§Ü3c3cDMÄïõ{ý^(­-­-­… o…·Âk„öööp¿p¿p¿€’Ö’Ö’Vpõ¹ú\}0^1^1^a3x;¾#¾Ãä×û,ý„ÜÞÜ^} BkBkl[€î×ý‰/hPëÕzµÞÊvµtµtµ@ƒ4Hƒ@·»ÛÝí†uÅëŠ×[ukß­}·öœ=öüÙónTÅ âv=S?áÇ)’V™VI‰HÆŒ;b®°D¤@ Dd“l–Í"΀3à ˆLݘº1uC¤íAÛƒ¶"Mš4ÑõcýXdNóœæ9Í)ɽž{=÷ºH4 Fƒ.Q)”B›^J?áÇ)¢îª»ŽA‘øöøöTažäʸŒ‹¨|•§ò,¾ËÛ.o»¼MdÉž%{–ìYqzÅé§Eò3ó3ó3EB¡ŽP‡È„gÂ3á‰Ä"±HLÄp\‹ÇñT®ÊU›^J?áÇ)qGÜÏžˆô=ì{hÖñ¥zXËŒì’j©¶ý>¿Ïï©z^õ¼ê¹…—ûÊ}å>‘ÒÆÒÆÒF‘¢ô¢ô¢t‘¯7¾ÞøZ¤ûp ¦ƒÓÁé íˆ<â@/Ô õB¿ ¿ ¿õV½Uomuãæ¹Mòÿû­üs¬žzêmèArTX…UØv…¾Õmº Ø/€ò(ÓÄþÓû‡ÉoNæ¸Ñkô¨Cê1PFš–„‘¿­Ÿè¡ô¯ú‰~üÈ#hPMª‰†ÑgôÙø?=ùgíå¬}]ÌÚ÷Øì|ÁþˆÊÙПzIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-11.5.png 644 233 144 2667 13755454066 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜlIDATHÇÍ–HÔgÇ?wÚ•gŠIû£vÍeôG“¹$[‘,¥¡¤´,wE«h££?bÑ"´\ Çœã\adÔ615VLD–‘¹¸…n¹N»L¼ï÷û<¯ýq÷½»íØÿ}þ9>Ïçó¼ßï{>ïï# ""¹ñ_ççgN,w~˜\ŸûÎÜw^ý*–Ÿ¶Àñ®ãÝ_Á‚“ Nä}™÷¥º—ÌíºÝŸº_$‰ŸÊg¯K®$²Ú³ÚëãùaØòÚ–×æÄò/zÀÝáî˜6ÁwÉw x!x0Ö?Ö^^ÉÜ®Ûýö~/_ÿ‡_2®d\qüY™Y™"à-ó–îŠ5üZUUÌùcŽv€õÈ&[¯"D°c"%·ëñ~{¿gãÛ|6LÀ·¾-›ë6×¹ÏÇ6Ü»ûï_lóÀŽ fÄŒXïYï1 ºG÷àÀÉÜ®Ûýö~ÏÆ·ùlþ˜žäU*‘㱪Íj3!¨OyŒB£ôÏ–×òbÄ ÚîP5_Í= ô©¡Ñ@&&Úú,ÚmưV»Œ]`UÄð©©Î¯Î·ߘ¼ÊG""+šÀ=ê¸è|°ôÁR°º(§S«bž'è¾ã[¾«Çê±z€.ºèJ‘c`$䄞ò”§ºH%ðÊa¤o¤ÀqG"®˜°Mñ;}“I¿Ïï}@­²q¾À¾À>ôPÑÐ+C¯†@C †J†J†JR ­´Ò ÆãŽq:.tœí8 -•--è³?·t·tÃßG­YkV­‚¯ï|teL°FDd`´mhÛæ!½ck_mCm³öˆ\›¹6sm&É[{´öhíÑäLw5w5w5§ ·‡ÛÃíP*„ jGU]U¼ß¿Õ¿ÕÏìoÅaVz?~ ê~LS¶ä”甯^+ò–ï-ŸˆþZŠ¥Øq¾ÒWu¬ê˜dy?õôÑkô½FQy¢òDå ï˜wÌ;&¢–«åj¹¤Åý‡÷Þ(2Ù8Ù8Ù(¢æ«|•/²aÙÆM7IVáPž3Ïé8/%¥S¥S"Î'9Grެ^+çÉó¨a®N& [cÀºí붯ÛÁÎ`g°3ýDuTA•^ïmêmêmßeßeßeh;×v®íxW¾¼èåEЖ<<ȘæXŸ{Z<-jØ)–êPŽaq›Í"R""" ílä Œ"Ò-ÝÒ~"FÈ!GÐt“ëãgÆÏŒŸ —†KÃ¥"ù{ó÷æï©­¯­¯­y)´è‡E?ˆ< O›<& EÔ ‘³ªBU8†âŠ”EÊoËlÏÕž«"Ž7DD¨ãG=£ž{ž{"® W†+]Xö­ì[Ù·Dæ-›·lÞ2‘™Ñ™Ñ™Q‘²á²á²a‘‚S§ N‰ô¶÷¶÷¶‹ä~”ëÏõ‹,Xt£è†D?h®7ëMêE.­½´VÄ90³tféàíäTþOüŸ!{*­ëÖu˜:1õÍÔ7èèÑ®hWúUMí™Ú3µŒj£Ú¨2É$&ê&ê&ê@ïÖ»õn0˜ÌðØõ×ô_ÓhuÒ(7Ên¸ŠQÿ ÿ ÛÏNßÛ7Àý§ûψ Fž&&ÿÓL3â²·t¿î½IoÓÛô›úMžëÂ8þâ‘»#wÜaw8ââ§ù˜:fNÍœ„[ö‘e>2+jEÓŸL\¸€‹\ä"ð,ö­Ôwõ Çû›­ÂÐß›ãæ8ÐǧÆUã¢ÿuþ÷[ù¾.^Ø÷Ø‹ù‚ý›”×Á=ºKIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-35.7.png 644 233 144 3017 13755454067 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÄIDATHÇÍ–oLTgÆÏ€uåO¬ÈbƒKi,ºIK-¬SÔ±kkbÚj ´k”4‹%Û¬LRëº$›J‘ÛRÙBÄ.mÙ©š(ŽF6R²­­ËÒ±‰f+£Î;3÷¾¿ý0s¹³ÝOûÍ÷ËÌóžsžçä¼÷>÷‘‡¿)¤<’’Ç)ÛÌý´Ê´ÊG;ã¸Uˈo~YÍYÍs>šó‘þ‰¸‘Ÿ\/bò'ëûò°˜Önk·¥,Á¹Ô¹4íqü§³`óØ<1ØÞ»½ çãžyççî–Ý-q#ߨ7ø’ù¥ñgú"ðÐg}fù¬3­3E ¿<¿¼à·ñ„Ѩ^[½àzêõT•ÚNº*ÆÇXÁ$lÄùF½Ágðz†~¼ì§²Ÿõ/¬Áöa¼à»¿À› Þ\`èE=À;¼C:ÄÆcãÚKÚKüê¬: € ˜ØˆùF½Ágðz†~¼ó('EDšž#G@ÿ ê‹]æGóA=sÄD¹ €Ò~§íÖvƒö¸¶D[ÚVm«¶x’RJ§'ˆêW!Bi©‘ù‘ùDµ£G¢G ‰ó«ÍŽ\G®Ñ`Ó3æQžyì=°ÛÆÇg(}Ä7â\< j¹ZÎ$ã§€*ª¨2…ÑÐÐø?–*PL&À³ÐKèÇ{ì=áß""­Š×Ö¿¶Þ(ÖŸøÇµ¯ª¿ª†¦Ñ¦‘¦ÔhÅèêÑÕ&}½ÇÞc‡–ê–ê–j8ïû<ËòU]«FWJÄ×ák󵉥rEeqe±È¥ÎK—:Ev©]j—éwö;û">‹ÏⳈ„ö„ö„öÈôº6pmàÚ€Hg^gAgȧÿêý¼÷s±l™z9õåT‰\ô––Z–‹TÕTÕˆ¨@¼Ñ=;4;¤ºáÞ÷¾¯~ÆzÆ «ß²½eƒ¾û6÷m†’†’†’pW¸+ÜÊe„`ͺ5ëÖ¬ƒö‰ö‰ö sRú>}Ÿ¾´!mH2÷æÍ=š ?qÔ:j“Nøf`~`>àÊ|:óiÕ-0'cN†þ-icwÆî˜¯}ø¡ÚP-T U U ÁŠœ9+r õjëÕÖ«°sïν;÷B—»ËÝå†üÂüÂüB8¶íضcÛ’­X±BøDøDø,¼¹ðæÂ›pnÉ@ö@¶©§÷ÞzÿÖû`ô#Zö¬Ë³.«nˆÔGêáÏÞ–s-ç ¢¡¼¬¼Ìä/j+j+j‡Ëár¸à@ýúõf¼X«b½½½ìv;Ìø¡ôCé‡Ò¡dYÉÒ’¥I“õ'þü30;0ˆdz3½ª;%åÞTáTáð Hßù¾ó"ÎÓ¯4¾ÒÈ«w.uuIdÏÍ}NdqÎâœÅ9"®\W®+WÄsÅsÅsE$ËåÎr‹F £…Qû~û~û~‘Ro©·Ô+2Q7Q7Q'r¡îBÝ…:û"{ž=oúŒð+^•ü3þ3~™9^9^9<˜ð±ÖNc†ùVFþ8U6U·¬?Þÿñ>JëÐ:´¤ DGGÃXÚXÚXZÜT¨yjžšÁš`M°”_ù•†„ÀäéÉ‘Éè»õÝÀ—q=´ ; ?kþú3;÷õá´mR›˜TåjƒÚz¿Þ¯÷ƒjTª1É©EjGyIÏØ}„“p­vQ»ø_>¦h¶€-ìc†óÿd8ïó©Ï§u gî…b!à°vC»AÔèƒý¸p:¥Nª“€à.·¹ ê²VÃhJñKímím¢Ôi+µ•Ós÷Kèýó?¸ßÊövñÀÞÇÌì"5šº`yÆIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-34.7.png 644 233 144 2646 13755454067 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü[IDATHÇÍ–kLSgÆ_@-UDI!µj„²À4Ñ€ 1–›F‘p5:‰‰dj‚ˆšá-1ŒL³CDâü€`pÑ.nHqqKÐLœØ A¹¨(¬…öœ÷·íát²ì³ï—ö{ž§=ïûœW€BˆÙÞOþf³°'öÿZÏ® \ù“'>¯€_–_Vû·0«|V9@È¥Kê3=ÖêZ¿ï¼:¾/Ÿ–³…ž0Ôjý,ÞølŠÝ承oã ãnØÑ°£ þÇúÙ ýú¼³¼³€ku­_›×ð|ñʼnOø…€©·¦ÞòëÃ4Ã4!`Aê‚ÔEßx:AƆŒ /^HP^AI 0ÂÚzãkuo¿6¯áiøŸÆïÑ# tMè! ssæfãEÏÀ³80ïÀ<Ïu8Å)‚À=âP¶*[Ù,›ðÃôX«kýÚ¼†§ák|¿Gþ(Bq:rl96PŸ¸Zݽ®HW$ÈXw’; —W©Ô$Ëýr¯Ü ªY5«f&-yO:¥©Œ‡‡ãR¾r]p]÷¸_nɎȎОNÑe£B,.ãˆqddŠTm­¶Và$ëA.—ËqPG @e”yä‘r‹Ü"·ø(ùÀ>ð?K.’‹pxƒõàåóò{„-. !ÄùÉÎ̙ڰºô¯ÞG2à̪3ñgâ‘6»ííÝdšnk·µÛ M9M9M9ÿQ7u›ºMP¾ª|Yù2¸0Te¨2 ¯N¿¬^V¡ÝñrÇËêRØS²§ÔÇ=BùS!ÚöÃͺ›uðdžÎ9sdÁìïfFÏŒf,«4ëXÖ10›‹ÍÅÐYÓYÓY£'%&%&%ÂêªÕU««& k.h.h.€y+òVäAúïééhì“úêújY·ì·ìà¾íÑ#Ô%3†g ËZµŽZáŽzÏpÏG’áöËÛ/n¿€˜+1Wb®@OzOzO:T̯˜_1_7›lk¶5Ûª rW¹«ÜU ô*½J¯ž¯ž[Q9W³ ³ }~A_x8p28)8IÖ ™2Sý›À×o_¿Õ½ýØpáp!¤íNÛ¶âLq¦8”¶•¶•¶Áʰ•a+àÈZd-²BBDBDB„ÏNŠ‘12Fí×í×í×aaß¾…}pÿ‹–ЖPOmxuöÕYÐô%túÓéOe-ŒÁwÎÝ?wÒŽ¤ZR-:püöøíñÛ!:9:9:Ìùæ|s>Ì­œ[9·Rÿç*[+[+[¡ïyßó¾çú|EPEPE$|™›«çÕ.ï—çý3úgãÁw‚ïÈZ! Ú«K¬K„¾ƒÎgŠ,X–¶d`Éc¦zS©rssaààÀÁƒ:pYSYSY¤v§v§vÃPÊPÊP DFFÂhûhûh;äÍ?šJ²KÖ•¬›S$€,ÀymðÚ fmû½>v¾…ßvMÙ5E?•ã¥--ðÊ0èt"•.¥KébÒrâÄ ¼ïxßñ¾C·‘7–7–7]²Kv=Ò>Ï>w6‡ ê^u/ð«‡eב]G4aç[?âcw=¾"/NøØ6¹ ‡ —Q2 ä!yH©HE*ÀF6²è ƒà8Ç9î£\Á1áZ…ÊCåá¿|L±)Æ~c¿¯M\Íysr€}®Vù‹{Ø= \T•ÁÉÎÏ ¯&LÀ¨ç])ŸÊÇò1`÷öÏQŠ•b\ìSâ”8mØÕŠÛË7Éù?ßwåg{»ølïcŸç ö€lC‡Y…êIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-30.5.png 644 233 144 3117 13755454067 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ýOTWÆ¿8B  †Mk[ƒ±’¥Qâ¤JB¥[ÆX¬­Æ€eÀàËj–nLÖnbìÚº…È‹nR—dWbŒ¥­iJtkª©/µX”"Ò‹áEg233sï=Ÿýaævˆý<¿Ü|ßžçÉ9÷>÷ˆˆÈS‘§@̳1ÏÆ$‡ã˜w¢ù9¯ÎyuñÉpÜ¢ƒå Ë·öCÊÑ”£óNÌ;aüͺÙ?{^$Š?›ÏÌËSM$œN8mÉÄ@Ù²²es„ã.­ÝÖþHƒÊ/*¿ø¬õ³Vj`´{´Àï·hlÖÍ~sÞÄ›/<Æ/q_Å}e‚„ø„xx~ýóë3v…3 ØQì¸{?VÅ€>$‘¤ò>Ìåš›õH¿9oâ™ø&ŸÉÖ#öJÚ+"°ñÍoÚ> üôxoá{ M¾P;pƒ$æÓ|úÛúÛ@]R—°`hlÖÍ~sÞÄ3ñM>“?¬'z”S""¯ƒ’’0zB]Úphqh1¨EÚ*m¡ˆR¥r•]ÙAûUÒ†@íU{Õ^~¿.£¡¡ô¿ƒ„ô¬Ð®Ð.Ða|JKRKRM¯‹å7""™ `óÙ|>«2ºº€¿P*Ke1Å/ 3 ª^Õ«z`%+Y9K@YdKYÊÒYù»Üå.àÅ‹@-QK˜ŠT‹ Âá ËlÆDDZ:ÎÎ&šñÒÃ?ÿP GÖyùÈ˨;-wï4Fù²²² q~ãüÆù0Ô7Ô7Ô÷û ] ] ]ƒöÖöãíÇ¡éõ¦M;PÇ¿oú¶é[˜üPèã%¨YQ³Ôëa=1Æ}‘U_ZıűEäÚ†ŸŸùùËŠ¼¶¼Á¼A ^θüôå§ÅRôcÑí¢Û"Wë¯Ö_­)¯.¯.¯96zlôبH¡«ÐUè™°OØ'ìòÛò7øü "Uk«^«zMäÜ‚sžs±t»OuŸ’ ·Í狳¬Y»~íz> ë#;Ñ“èQ§Áÿµÿk8g\L¸˜-xßö¾ ΟÝpvÌ-˜[0vŸÜ}r÷IțΛΛŽîLN '€æÞæÞæÞh¾s°s°s¬«ÃêÇ.G£þýàÄç'>Ÿµµ9#U#U@wòÁäƒê´5æfüsñÏñ¢ØfîÍܳHáL^ / “öÜìšìIûÓ¼²Ê^ . f³Eô›úMý¦HÒ¢¤EI‹Ddµ¬–Õ"É­É­É­"Ê@e 2ºc"åÎrg¹S¤ÀUà*p‰ü¥ ¶º¶ZÄv/åzÊu™Üä/v;%Íø+\áÅcAð»àw–>™I9œrX¤þ|sWs—¤•ieýeý"ç÷œßs~H°-Ølïïïq{Ý^·Wd¬y¬y¬YÄ?áŸðOˆd¤g¤g¤‹AgÐ)â‰óÄyâDR÷¥îKÝ'²iû¦í›¶‹üa8ýBú‘‡nÏaÏaI1zŒ9n8 ‡¥OT‚ˆÈwáLî™\©Y7³NU¬,ÌË#únêŽÔPÒQÒQÒ¾^_¯¯*â+â+â!ÑžhO´Ãþºýuûë`Ô>jµÃò–å-Ë[ ÛÛííöškn¬¹)Nq¦8a«û­OÞú„Àô?Tœºuꨇa=kéäUÖ*kô« þc::ÄŽûÇý(½_ï×û£¯„á2\† &»&»&»@Õ©:U*M¥©4pppµSíT;A«ÕjµZ˜°>xôàÊ8* Eùø¥*³*Óô³–Náìc>v!ì+êÓß|l«ÚÊ”ÊT9*Ô6µMm »‘Zª©Cê°™Ílž•¿¤.ª‹ þ¨¶¨-*Wå2¥2"ø nܰ¹mnŸ•+¦™Î0·4¶4ØvfÕ¡y4ð/}D‰:?_r†3 ¾W×Õu ƒ:€‡L2 ªOõ¨`"ÒߨëÄÔ7Ú˜6ü7âü”ZK­@ðqçrÿ•Oìí≽=™7ØÿÀá冞¤IEND®B`‚routino-3.4.1/web/www/routino/icons/ball-0.png 644 233 144 213 13755454064 14347 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷Ü@IDAT(Ïcüÿÿÿÿÿÿp\2ŒŒè",Äi$d##q &Ò\‚Û…ÔvÕ ÂŒÒ-úÑ]F|:\žª6»dIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-1.8.png 644 233 144 2434 13755454065 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÑIDATHÇÍ–]HTiÇŸQg©-]Ú‹¾pÍ ÝícÁ¬[ÝŠ`?PJ¦ºpI‚–—í¢‹”’Ê…H˜‹ÈtË‚À>eµ6(#KÝÜu‡†%—Œ]mPWefÎ{Þß^Ì9žÓZ÷½7çüß÷yþÿÿy?žó ˆˆH¦õHY›²6eY§rúý»ý»sÛ“8¨ÀSî)ÿã,?·ü@VKV‹r°=nÇ»óE~·žÝ/™ât¤_K¿æ)¶ð)Ø»iï&ÿ'I|º2®g\Ÿ5 æfÍM€ŽÖŽV¾Ho¤ Z-Ûãv¼oó¹ùåÔÿôEÀÛéíôü é¾tŸdïÊÞµîh2à¯uP²§dÀ«ÔW©:Ô?ÀR–êb`†ì6áÂö¸oçÛ|6¿­gë'ý¬(ZQ$eUeU’ ¡Kplͱ5¶^â:ÐH#KÁ˜1fÔ~µŸèÝ€8Ø·ãí|›Ïæ·õlý¤y{mÏì„J¥ЉÇê¡z`ž4O’0?2·™ÛÐz@÷é>œ%JÔfœ5gÁUKÔ´Î7N§I€šT“À¼Å¯+Ó+Ómƒgvº–RD$ï,dD2"3iáX8¶ÀÿwÌ,3‹9Õcvq“›.CÓL3í@mhC@ 4¸â~fAàKÕªZ™[à…gó° où±ŒÁáºÃu ßûQã¥ñtƒ¾ /$çà|Íùšó50T8T8Tèš¡€0jjj‡¦ú¦ú¦zxþÃóºçuŽ}9L]z úI?–±ïáÊÔ•)à€þtªN%fühÔõè ôúœ…ïjîjîjfQhhh„œ`N0'åª\•+ÈÙœ³9g3„ªCûBûÂc:ÍÖ³ô-?Ë,{ ¯A¤ Rœ}[(þYèìì„ùÀ|`>ycycyc0œ6œ6œ¥f©YjBæHæHæ”Êe˜üm²w²×µÇBïÝcï9•qcÒ˜FÑhçTNÕNÕNÕB¢"Q‘¨|øðÁĉ@è]j•Z¥VÁøôøôø4¨ïÔuÄ9•ünô½.½wŸJW#¬ÂÊUÇ0šê@Œ˜ Í1çÕoôý´_ûµk¦už®Ð Ãj»Úîªcsáéðô{ëØ;*?‰Ç˜ê‘z`5’ÀǶ ¹D -À¿É£ÖÃzgŒ1à2¹úWýZ¿FÓ¬æÕ< PÃj0,þ½E•ÿƒýW~°·‹ö>öaÞ`ÿÔ.)D˜ÕIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-6.9.png 644 233 144 2514 13755454066 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–HTYÇ¿RQÔ̤¥‘ÈÍÖh­¿Êr³¢Ñ¬–ˆÈÚ?-4¤() kñ H†¬¤Åv#V¶¨,R‚úµ©K´£•‰­aXH:j5m¦óÞ»Ÿýcæúƶݿ½ÿÌœsÏ9Ÿï}ïÞ󮀈ˆ$~BSBSBãüvh¡íZµêËßüö)BÖ‡¬\ñ'âOL=3õŒõÔ¶õ¼ŽÎ±ëó´_ÄvD^Œ¼’°+aãüó£¦ûí£M}%úÊß]-º pùìå³ì€¾û}÷†³‡³Á¶õ¼Ž×ùº^p}©ü„/×"®…ô@ä”È)"0kŬ©¥þ€¿R!?7?àeØË0 æK¬Ê¼xÑÃdëù@¼Î×õt}ÍÓ|¿¤eIËD`ݦu›¢ñ'<­ƒ2G™Có|W€C" ¯á0 ÌFA5©&BÛÖó:^çëzº¾æi¾_L|·U9°!rC$ðÀ÷;˜˜€*2ZŒ|†Û3ÆPV¯Õmucï„'‡õÞ¶†Á2“Íd”*4šf|`›ÃÀ]?ÀçK° ôjˆî‹îó†3Òõ¾ëýx}'‰æ.sÔ bõzpáÂ8pà°ÝjH ©!à 9ŸÃNv_˜ûÌ}~Y€“šàô„º Ûl?0¾Þ¯Õ¯¾“¾“6¯{Gwaw!T®:]ul{°íÁ¶ Añ*^ÅÛvûîöÝí»áøÒãK/…çŸ7?o¶ÃÕŸ¾&_“ͳù~=a÷À¹·çÞ‚êP?2FÓg΄¬ô¬ô¬tÈ?œ8ÿ0,ܺpë­àŽpG¸#lAmõmõmõ0»hvÑì"XR³¤fI Ì+™W2¯^Õ¼:úêèxø¨úQóü|­G îNÜuúõ-ó;&Œººþº~˜‘>#}F:”¸J\%.(¿^~½ü:ô/î_ܿ؎¯¾Q}£údõfõfõÚþLO¦'Ó5«jVÖ¬´ýæ7úŸŸ¯õ„Š„å‡åó•HDCDƒˆxEDd0°ÅH2¦ÓE¢â¢â¢âD2:3:3:E.x/x/xEZ­ŽV‡Œg˜3Ì&2R>R>R.’·7ooÞ^‘g‡³Ã)þmøòðåv¼LѼ? 'TÄj´C:DŒµÆZùIDD’t^B}Â¥„K"1çcÎÇœ)®-®-®‰¿/þžÈ³¶gmÏÚDŒF£ÑhéÏëÏëÏ™£æ¨9JdMåšÊ5•"‰*Q%*‘ÔÆÔ†Ô[WÈcÍ ðµžO÷®À;o5‹ÍbFõƒÞ\¿¹~s=ÄÌ™3 z z z sçþÎý°àö‚Û nƒû˜û˜ûäæäæäæ€#Í‘æHƒ²Ò²Ò²Ò =Ònî1÷0ÊÏÿ¹Ç>*yitA§hŠ…x*<ž °’­d+”S9•<[<[<[üíU5ÁØ­±[c·àuæëÌ×™ >ªwê]!ã…ñPÿ{*ƒúØX×H×HPûÞ¼iÞäƒåU)*%¨=¤øm5¨Õ`Гˆõ÷;µZ­V«ƒâgù@±Ùb¶õ1Ÿæ}¶MèüQ¢Swfó‘ùh°¦YÓð©»Ê£<(ÎRK-ð†a†A=QOÔÀÀ‹#u_½QoPüaeXøÀt›îàúÞ¿;ÿ¤ýVNÚÛŤ½MÎì?lN¾j6´IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-37.1.png 644 233 144 2725 13755454067 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŠIDATHÇÍ–]LTgÇŸ„‚ 6ã…M+i½«m4Ñ ©Ìjà f´ÑHÖºÔ¤Ý^ôë¢Ä¸™M]Ü&e›”,˜¨˜Êgº.ÛNe$´+-Œ¸,d°#:ftèÌœsÞß^ ¯gÒìÍÞùÞœüŸÿÿÉyÎóœW@DDV.=œÏ:Ÿue°ó¶Ý]á®Xw!ƒ[Lp¼æxíçã°â³Ÿ¬j_Õn…l¬ý:>;_ÄæÏÖÓvY)¶ÁuÉuÉá]Â~¨}±öE÷ê >€ü®ü®G4ô4ô\9{å,oC$ Ü÷Þ÷‚µ_Çë|Í—Í/þßè‹@nn¿ã6¸ò\y"Püjñ«Ï¿“ ˜~|U¾*€ÙœÙå3 ,g¹òqâès7 kÿR¼Î×|š_ëiýL=žrO¹ì?´ÿPþ—™„Ð9øà™žÑzé.àc>f9q#`Ö™u$AT°±öëx¯ù4¿ÖÓú™zìV&DDþ¶ªÃÕa°~HéÕéÕ Þ6ü†Ÿ´ŠòÏ¡Œ´ñÈxæaóyÌ"³È,õ;åÕï €û(°Ê¬2ÒV¡ñ²ñ2¨Ñ ?ÔäÖäQ­¯[ùO‘’fÈçÇãË”  Ôµ…} 14Ð@C–pŠ©,l``dá>úè3`Ì0dMYS$–¼•á@8Z?SXI³0/"ÒòâÍýoî×lÖK7ÿ3î÷Áé¾zú*jæÓ™Of>¹‚¹‚¹hŽ4Gš#жжжç]ç]ç]0Ñ1Ñ1Ña×eUZ•V¥ÛÚüm~ÔÍ­7Jo”Úzê Ó Óºµ-߉ù½ˆÈ÷á«Ë_]†±ªé§§ŸVõ+O¾PøIߤïßPê)õ”z ½©½©½ vïÞ9 Uî*w•Ûží3g*ÎTØ…$}I_҇dzã†þÞ¿¥ ÉL”ª7gÏMœ›Ð…Ýx_¬M±‚˜ºÂ×Ö·®o]иë£üòaà×ÅEØÔµ©kSŒ÷Ž÷Ž÷ÚÂíV»ÕnAuwuwuwV `’'’'’'àâÖ‹[/n…âHñ\ñôw÷}Ø÷¡n¦f7Ìn(ú¦èuI`UáªBkwô^ôž=öþ{+öìÙ¶gÛžm°Þ¿Þ¿Þ¡¡¡jL5¦aíÌÚ™µ3p­ôZéµR[Ȫ³ê¬:PªSuÚö²#eGÊŽÀëòüåy[ÏŒß Ý ®Çi­N¦F“ò늦M"Ÿþãó‘ÏGÄSkÔÞª½%28:8:8*bTF…Hèdèdè¤Hw¤;ÒYÓ²¦eM‹ÈŽÉ“;&EŒ£Ä(¹¼¼1/˜Ì òø¤§ÓSé)–Vi}löÈ#c—±KDÄêµz“NçÃÅ ‹~é öEj‡ëýõ~Þ¸÷ïhg´SRžiÏMÏM‘ 6.ˆT¯«^W½N¤§£§£§CdŸsŸsŸÓŽÙ»yïæ½›EæËçËçËmÁÙ‚–‚‘Üå9ó9ó’ZúæÞpü>ȉ{ãÞÇDOW-;¶Ìž’Ô_½‹^ø%÷NâNe¶š­f«Ý’ØÁØÁØAHD «…V£Õw¯ß½~÷:XÛ­íÖvÛÿàON=8…J$ƒ¶×í>¶;k*éýÍÎì1õåã=V¯êI¨<õ”z TLÅT,ë#?ÊQŽòU¬Š³öá`8ø¿ö˜à¤Þ¼5959À{™Í¬†Œ˜¾0çÌ9ÒšBܸ÷x—w³t§5­B*ÜZŠÇzÝz4yæ+æ+À~¨qÕ¸ÀÖübÿ•Oìí≽=™7Øÿd©z³)IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.3.png 644 233 144 2441 13755454066 14746 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÖIDATHÇÍ–[H”iÇŸ™ÌQ:ÍLíM$IK$B¤Ýl^(‹ÂPÙt“Ál ÁÆB˶–nѲ¥,^xS"„JvXºé¸v „Gq²U·ÌtEgÑù¾ïýíÅÌ7ß×aéÖ÷fxž÷ÿüÿ¾÷yŸyDDÄúpæ8sœ‹“±³ÂÊgmËÚöuS2®×ÁQê(íú –Ô-©ð4xŒ+6÷M¼½^Äâ·ë™yq‹•p5»š%©ø,ì_»mÖWÉø·GÝšÝ:¥ÁÑ›GoÜh¼ÑÈ·0Ü>Ü0Q2QVlî›x³Þä³óËÙôE`þíù·àÊteŠÀÊ-+·¬ú. è[{víÙðvÞÛyÊ ú¿ÀBª F sÙbs?…7ëM>“ßÔ3õ“~–/+}÷̾’,è¹ 'Wœ\aê%Zsœc!h1- ô3 ©G8p€›û&Þ¬7ùL~SÏÔOú‘Ïöâf”?ÓŸ $‚> €Ñ¯kÅ$´ôú”Z«òTÖšd’I+4ú^£,¼V«Õ’}\¦SüÊïò»Lƒ7ÛŽRD$ïwÈÎŽeÇÂÖÑìTš^¦—§šVZmFnq‹[@€+­¦Õ´šª©¦ú|?ýÀQý‰þ„¸ÉÏlx:< iý”Ÿ”±úÇpìô±Óì£@Eoo,½ÎÁÎpg.]*ºTá÷á÷á÷¶/tÙ¸l\¶âÎÁÎÁÎÁðƒáA‹Oµ$ éê‚´~ÊOÊXÇ÷p-z- F €*OU̼èzw»Æ]¥u¥u¥uÓ—Ó—Ó¯j_Õ¾ªµ =Ï}žû<÷ÿñ¯g_G^GÒðUdê%õM?N‘Å?(üF¤xSñ&ùKDÄq%uҮɆÉë“×E‚ÁŽ`‡HÅáŠÃ‡E¼Þï€ÈÔò©åSË%½"¡H( >>>©8Rq¤âˆˆ·ËÛåí‰ÿ??Ÿ†»¸jê¥ôM?àYäYdtÃØÐØíÚgÆ„õ%¢•ÑÊh%ìØºc뎭W”W”W¡¥¡¥¡¥¶^zÈCBôLôLôÌ—ñÆŒ9fLý¤§ˆÑf´9ºE´½Ú^£VDD–‰æô8="õõëê׉”½,{YöRäî½»÷îÞÁ‡ŸÈý5÷×Ü_c}± ùò/ä‹ppp[xµ^­WëEÚi¯j¯²ðlIé¥ôÓ~>î1¥Ò=6È 3±c'b'À·Ý·Ý·<¹ž\O.òòòAOiOiO)666Á³‚gÏ `ã†6noÐôÁ/~ñ D×EWGWÛzlúó=öé­4oÉZ³ÖlÝ¢Ù_g«f«`dtdtdŒãÆqã8¨rU®Êa,0 €jQ-ªù‰üD>Œ¼y7òô¿õ½Çâ£K{ª=ý⭴ͱ™p<Oìħ×ëõÄU/dØæU–ÊRY †Ô²åÛT›jÕ Tƒ-Ÿ© U!¨ˆ¾[ßm›cé¹ùÙ9f›üø³üY€–žüÝz7ðƒÞ«÷’PwÔ€@ÑD#@„qÆA…TH…€1F*9Å)PwT¿êGqEG‡è]z—?¥÷é䟳ÿ•söu1gßcsóû2<.”–IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-21.9.png 644 233 144 2757 13755454067 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܤIDATHÇÍ–_L”WÆÏ ü (–ÖÖŒTGÒÒ­u%€ôÈVtKÒÐLmÆŽÙd-hw×Ý4¢½Z·é†f à¬Á4ÒÉXÆ’Nã:é’BüƒuQQJ…]$Ó€ƒf`¾?ç·ß||l½ÙKß›/Ï{Þómû”ßÃW~¸0U:U 6×Ízs¿É·”_|ô}! ÑŸè· CrRr’ðÂö¶;ÿ`üÛ o”¿Q0ºlt™Lí!Nº,„1#´›ëñzs¿Égò›z¦¾áG@VIV‰Pá®pÛ[Œ ý­pÈqÈaê)>à(GI5¬†4æad§ìÀ† ,l®›õæ~“Ïä7õL}Ãõ+'…âã×ÀõÈõäsÊeµ_Y­¬ý_ÊåJÜ©4-ëizªž ²GöȬ˜b‚‰E$õY5CÍ@Q|ÒcðƒkÚ5 L™úæ¯ü‡BäÖƒ=l‡—ËÉË—_ð:È"YD„ZiyVž•gA›Ô&µIÀ‡ßC3Ì0cA‘þÌQŽÈYB„_Æù×Äõâú\5üÄO¬©K^ÜgÛg[<‡Í÷}}}}P·®neÝJd³ÇÙãä±8í>í>í†ÞÂÞÂÞB+¯»u·î¶pïÁÞƒ½¡a[Ã+ ¯ ‡n¯•„kW¯]½vvíÞµ{×nhŽ6Gš#ð\þ³±gc˜þFùF˜=0{´±´ÏÒ>“Þy`îÔÜ©[×…èÞѽCˆo³ûGúGxwÁ·°aaƒˆµÿ¦ÝÝîÂ1ìv q¾ñ|ãùF±)'RN¤œ"5'5'5Gˆùâùâùb!Êüeþ2¿ön{·½[ˆh(І„¨ùyÍ‹5/ ±çžUžU"¶}Eqbq"/Ý_º…Xv*²'²çÖuA­ÑðÞï}óªÑ%ׂ`‚Ë‚ÙÁldð·Á½Á½‹ŽEǬ“™ÎšÎšÎÅ¥¸DIÚÚÚiŒ[Ù ±Æ.Å.ÁxÞxñx1RΫ…êbë›™Ú_¹¿Ðã]iô•5ÇÀœ+‹sÌ)Døcžyæ—àgXÅ*¿’ïË÷ô }‚ˆÌŽóÿn`f`À>n/ç?ÿ3ÇÌàã×ø‹«ÚU ²@¹,¯kéZ:H¯:«Î¢p ?~kòcC €Vc3kÜ•²OÞ”71nOüUÖ†Qäu\º ~xkù[Ëå§“ÿɽ+ŸØ×Åû{2_°ÿ™ÚNJ«~¬IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-6.3.png 644 233 144 2523 13755454066 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–oHÕWÇŸ{[WåZ^µõ¦+…à 6}Ѥ|‘ôG4²©¡8hh¡1V/b¶õgE13†QÃè‹iIÓV¤31GiÖÅ?¹e-w­ÜuŠÝßïw>{qﹿ[[ì­çÍåûœç|¿ßó;ÏyîOäWÀ™æLsÎ cg…ÏÏïû0>i‚£ØQÜSIõIõɾdŸÕgc=¯óc׋Øü±z:.±qq޼Þ›–nZÿn} ššÿ6 òJå€Ëg/Ÿe;<í|Ú ð"ïEØXÏë|½^óÅò˾7ôE`öÕÙW Îç…k®Iÿ4œÐŸEëŠÖ<žõx–r€ù'H¢Ê‚Ñ#ƒõ|$_¯×|š_ëiý°y+ç­mü(átxAß9ØéÝéÕz¡fà I#hÌ2³ŒiP·Ô-8ÀÆz^çëõšOók=­ö#¯Ÿmíj(‰+‰þý&& *.£‹ñ«ñÊx…²~·¬ì1Á6´†¬‡ÖC0~3ݦ¥–ÇŒc„À|n>¦"ü*¢Õ—XC™ß@ÂÓ„§Áw˜òOømBRÌæ&Õ0‰z¿ÔQGàŋ׫ 5¡&€à@L~+C •f‡ÙÁd”ÿ•Ê?QýˆŸˆ±“í°m϶=Ñý~ ¾ ·õ¶T T@í©ÚSµ§àÎÖ;[ïlùBcÖ˜5fã»Ãw‡ïÃÑÜ£¹GsÁÿ‡Ø?ló©¦/ä³õlý°Ÿˆ±_>ƒóãçÇA=PŸDVLeŒ-[+2Wd®È„¢ÃE‡‹Cvyvyv9t7w7w7Û†ºÚºÚºÚÀSç©óÔAq}q}q=¤õ§õ§õÃÀ«—/£éÓ*Wë…õµ§Èܶ¹mYЬ\µr•ˆú\DÄq:rÒq×;¯w_ï”A¯ËëòºDòKóKóKE¼ÞFo£DG° X,©n¯n¯n©ØR±¥b‹HJOJOJÈ䓇&EÓã8§õÂúQ?<'yŽu#0WG¯=>åS>‹–-Z¶hœ¨k´^D_ûy³Æ¨‹œùÏf•YÅ´ÞYé¥ÒK¥—À½Ø½Ø½Ê•=*{2d<È€¬]Y»²vAWNWNW,ÏYž³<RªSªSª¡DJ¤D`üýñŒñŒ˜›úï{ë­ä±q߸s‹\¨ ÔjÀšoÍ·æƒ*T…ªåò@9¨&Õ¤š ´$´$´ž=yöäÙ0Í>³Ïæ£Ç¸mÜþß[ÓÇ¢}%Òg>6oš7™´‚*M¥ÅÔRZ«Q5ªFcâ-ªEµ€ò)ŸòÅÄ]*Kezi®7×Çô±IÐ|k{­óÇ—Äf¤3cÞ3ï?X©V*!Õ®*€â, 4/yÁ P½ªWõF¾d7»Aý¨†ÔŠÓ&&„Àì1{CóGôþÝùgìåŒ}]ÌØ÷ØÌ|ÁþõdLéIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-2-grey.png 644 233 144 5730 13755454063 15714 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—P”e»Ç¿÷ýì²° ÈI¤C*´‚¡GñÄ6`ˆ oeï!²`ÈÖ8¾ïxR”†FÇPÓ4Š 0 +P2¨œIàuŽC„£ ‹‡rɕ»ûì}?ØGßiºþyæyžû¾¾Ÿ½žï}ßײ‚‚‚‚‚ø`6Æf/|µêŽêŽêÕ|QðEÁ´ h¸h¸hxmù’/ù–¼-ÊràŠ-¶Z[­­–ÞG%*QÉò†0„èAzlÁl¡÷5¯h^ѼÂòTwUwUwªd£l”îª0Œ7Š3Š3Š3˜Y–ƒå`–<Ë!Ú\\>ü!` bÃOŠ"Q$ŠD›Ýj·Ú­óWÕÕÕ°›íf»¹áêÔò©åSËWü·®TWª+Å… +V$°¼hu´:Z ¬ô[é·ÒPî•÷Êxe¾’ïa~—ž¢¯ð(|*WcÉ›¼É[¤±L–É2ƒK¥`)X ¾ô©µÚZm­^ìçßàßàßàÌMèIèIèáŽÈ®È®È.¶A“§ÉÓäa »±»¡Å¦0`36c3€'ñ$žÄ”-Èd †®Ö®Ö®Vr4…5…5…‰Üû‰÷ï'¾yX¬ ÖÿÅÝ™éÌtf¾XJ2áNåbØ#öˆÒ4MÓt—ä)yJž—ôöqû¸}|ñµÐõ¡ëC×Ë1Y¶,[–MÊž­³j^Õ¼ªy2]¦ËtZ1(Å >‰Q!*D@'é$„V“ªIÕ¤BVæ+ù”üŠž¢¯ð(|Ø×¶¯m_PôKÑ/E¿œøi§~§~§ž¨òbåÅÊ‹Žõ¤DP;[œ-Î":FÇèI$‘D$Ä€ ‰Yp"aVa%r:ƒDäOþäOãÊ8EOÑWx>.OÊ“òdòJû9û9û¹Œ÷OñOñO!}ÊW)_¥|¥R<ò€B)”BáÍ_à/ð¸ÃîdÈ2’‘Œ€íšíší çËùr>À¶²­l+ÀrY.ËøSü)þ@QEQðVò+zŠ¾Â£ðq £0 +ü›#Îçˆâ;ã;ã;‘àó¹Ïç>ŸÃM´‹vÑoÖÂZX =ôÐ0Àp¿ê~Õý*à³³Ÿýì,°·ko×Þ.`oÓÞ¦½M@­T+ÕJ€¼^^/¯ÇÃ`ï°wØ;€’_ÑSô…ËzY/ëÿ#Ë×âkñµàýgãž{6Ž•»ò¹ñVÞÊ[4¢Žã8ŽÏ žÎ9s:˜™™ÒJÒJÒJ€øèøèøh y y yh¾Ý|»ùöÜ<*¦b*x3oæÍ»)ú §²ØFl#ø,"9"9"yW<®x\Ám£m´ Zvd$! IÚІ6Àú„õ ë@ŸWŸWŸjIµ¤Z€ð¡ð¡ð! á0X5X5X˜¸‰›8ˆD$`‹Ùb¶À¬ÁÀ¥§ò(ó(ó(ÃÔ¢ç=¿èyäuŽtŽtŽ „cöa ã§ø)~êá/ÓàÎátгãæ*âççd¾žùzæë@XnXnXîÜ{Ë{–÷,ïwFïŒÞrryO:Ò‘ÀÓxO¸†k¸6§ÏÓy:Oð >Á',ŒKR H§¬z°êÁ*ôÉ;äòHì{ö=ûô81ˆ™’Ò¥t)ÿ üƒðm¬6V \N½œz98P~ ü@90_=_=_ ¬ë_׿®ÿÞd7ÙM6Ø`X/ëe½ %½µÓÚiíDá!<„N£0°0°0Ð>¼kÙ®e»–‰ý^^^w«sÒ9éœ|d¿ ¥P »½·ÿÞþ{û‰JúKúKú‰ Ý Ý Ýˆš77onÞL4c™±ÌX™o$#Ù¾E¢HœÓë{©ï¥¾—ˆv'ïNÞLÿe<`<`<`æHA RŒ•ªUª€å5ú5ú5ú9CÆ–-[-×q×áõQõhG;ÚYLO<}ðIòIòIöï)ÞS Ä?ДiÊ4esã‘|ä¨F5ªvžgça“Óä49 Úó¦ó¦ó&ÃLÌÄLø˜9™“9?uc?óñ3? · · ·|ùÖ·­o[ßN ݺ1t£3Çð–á-Ã[Ò§Ùivša“H ¤Ð˜æ™æ™æ¥[J·”n–ú.õ]ê x©½Ô^jÀÖdk²5ŽdG²#ééé’J“J“Jafañ|_Vs»ævÍm1uuâêÄÕ ®Õi‡´C¿lrÔ9êuÏãC‡.]?8~pü°ë;ÝZÝZÝÚþO{¾éù¦çéHýkõ¯Õ¿Fk@e-¨‡ÕÃêa :;:;:ð.õ.õ.ä~¹_îÜÆÝÆÝÆ•EeQYËcyì\a]€Ó?~6ülÀ_¯F^¼ɵ3‰"FĈ˜M ÒéŒtfz>›mó¤Ñ€48£Y ‹a1kÊfÛ¶KwlululÙoŠ7Å›‚¯Ž<y(ò^¡•´’VBË:Xë˜;¡ ‚ *˜í*€…Xˆ…1ˆA<˜ððð…÷‡w?¼ûá]ù“–IˤEuT=£žQÏìH dJ¦äר ©PäꞜѳ}£ªe±,–Õ¼m`؆Ü›=«+«+«+“}‚ª‚ª‚ªToøtøtøtàÈ"ÞLË´L `“˜|° Mh¨‰š¨ 6x_Ⱦ}!Û™3ºstçèNÕQÏ Ï ÏŠ¯‹õéút}úáK=Æc‘}ƒ^ô¢W>¯ô£: `ò lÇvlgµßF|ñí‘îYîYîY_ŒŒ¨ÆÎΜ9;ãÌqÍófËÙr¶6f`fØQv”Ø—ìKö%@ƒ4Hƒ Á#x4WLWLWL´¦½±½±½Q:¢ Ðè†fìÕöj{õ»ûooo2‘‰L˜çÒ9¡€N¹®§„§ðž˜wý·ë¿]ÿ °o·o·ow¿ÎWç«ó½sª§®§®§nλlÛÁv@#jD¨Á~ðhœÆiàj®æjLß3Ý3Ý3á놨†¨†(ÌÓ™uf«Ä*±êÝýü?Ä ÍðJ^É+¥£®¥¬L1·ë/‰²Xl®}÷ˆË»9.ïnty÷»?ò®èÝ¢Z¾”/åKa“óä<9š²%eKÊ–8CÍÏ™Ÿ3?'Ýrrr:ò—Ù61÷E¹(媣®/ûå‹ãRQ¸Ø”.ïæ¸¼{”•²RVÚ|ŽÇóxŸ[;ë]~¬ÎQç¨sÈ[Ç*Æ*Æ* åœsÎ1®T¢qºqºqZL •••K·ÜóÝóÝóo\°ýjûÕökþá[ën­»µp†¸æiÀ‡»‹Çh] þéòîwÿâÝÀÑÀÑ@ÕØ™‚3g œ9E(B1¯Ë¯Ë¯ËŸ·þØúcë,MÛ­íÖv"D„ˆì6Õª7ToL?¯ÖGë£ùˆKﯮëôã\þ ââââââ »n»ÈÜÈýÝn7‡ã¸s¡s¡sáUY£×è5úÿ<öû‹¿¿øû‹~ߎÝ»9v“>¸~âú‰ë'œ±“ŽIǤCÚ®^­^­^½#ˆ*¨‚*¾º 4ÐH·1‚Œˆ'•/à*”ü8ßÄx·õ¨G½ÓHµTKµq½¼†×ðšô3/ϼ<ó²W—«ËÕåü¦d ’¡©eIÍ’š%5kãL½¦^S/û1_ÌóéSWÞ:àÔqpüI<æ]×vá4b¶a›ê'–Á2XÆå%TOõT¿k³Ç"E‹øMi@~]$JD‰(Ùú[÷¦îMÝ›€Y@è]ù”ÆrúÏ8þØßTVtBÀ¾IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-140.png 644 233 144 2657 13755454065 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜdIDATHÇÍ–ÛOTWÆ×00ãX2‚±^Í$m H«ÁKib(cÒ’˜v$ÑIŒ"&45iðò¢-©––4!4i[+Qk2*Õ¶â“Utˆ6ÆŠid0¨ˆä2œ™sÎþõafs¦ò¸^&ë[kßwΞ½Î‘¼ô¯@Ö¢¬EYÞTžUkã3*fT¼z4•g‚ãCLJÿìY­³Zòæ´"v®ëº?s½ˆÍŸ©§qÉp‡Ü!Gy:ÿ >ZòÑ’/§ò¯;ÁÓîiÿ×€­§¶ž8yèä!>†¡®¡.€‘ò‘r°s]×ýz½æËä—ÏžÓœ?rþpÜ·Ëíß»¾w_ù$ÕÐ÷ ¬©\S pßyß©²À|ä’«Ê1t<ÎÈu=ݯ×k>ͯõ´~ÊÀœ·ç¼-TPíù)µ rv,ܱPë%Û/ø‚\0bF ÀÜ`n ªSuàÀv®ëº_¯×|š_ëiý”ùÿÞ6¿ƒªrU¹ sÀ+7¹=¹¤º¦&Õ$ŠçB5¨ÕVž5Ëš•¿¥¶ª­(ãn¢,QFR}jTSfb­¹ÖÔ›ßÉØJ‘¢ Ï€g – Ѽhð;ï›I_ÒÇg¹Ï}¦Ç*V± Ô:µN­ËÀ}øðóÈ#/ÝüÊüŠ ŠRü-ŒÏ<ýžþX¶ö“6öÝEضwÛ^`À*QŸ'w&wÚ~ ö@ð@n”Ý(»Q6Ý_GGœsžsžsÚxo[o[o|›ÓªZܹygìΘýÆU4¥7¥Ÿö“6v­O~ þœjßl|/ޝ¹RógÍŸö†Ÿ-=[z¶tº1—¿Ëß«¯^¼z1$Úí‰v(9Sr¦ä ,mZÚ´´ .ttÀ£Ê¡á¡aâZO?zêè)mìZƒ€÷¼÷¼ ñíàåÁ˶P¢øÙø³q8¶øXѱ"ðE|_N>}øôa»¯©¦©¦©Æ6^ç®s×¹!´>´>´V4¯h^Ñl÷¯|²òñÊÇðÃßoþ~³››ZZAûÉq®q®á5ùصȵHD:DDd8gëg×Ï"Õ‘êžê‘ù'柘Bdæ²™Ëf.éjëjëj9Ò}¤ûH·È®ì]Ù»²EDFêGêGêE¼oÀ©ð÷žôž‰÷ʼn3KÂuÜu\Dûɱ~³~sÜÓ¨4*¥XÒ-Ý2GÞ|É· e‰²D™ˆ3êŒ:£"==="½¡ÞPoHdôîèÝÑ»"O¬'ÖKÄ5×5×5W$ŒcA‘•*TŠÄrc/Å^)*8$""å Ìq\1æóD´Ÿ,‘Xy¬üú_’}¡óB§ˆLŠˆ°Åñ¦š­fKBËߘ¿1£ÈDd"2©½]{»ö¶Èä¦ÉM“›Dv?Ýýt÷S‘ÒÁÒÁÒA‘Pa¨0T(R\W\W\'RØRØRØ"â¿ç¿å¿%ò^¸âbÅEÍÏ–¬—–_Z.2ågÚ©L¤OÉ€qÓ¸iŸÊ±oÆöí‡D8N„§ÿùã â â `Ü?î÷Û¸uÕºj]…áá¾á>°ª•ƒ³Â¬¥õÔ¶=ÛöL;•E-àò Ų¡×ì5§xß+h™H ÜŒØÇ>ö «° €8qâ FÕ¨˲&­ÉŒ»ß4™ vjŽù¢> á¹ç¹7mŽeL~ªÜUnÀJOfÌëæuÀmÖ›õ$9@˜ðôÉO#43pãÎÀOÓGJým–˜%$ùÕl0t1ƬʩÊÑoê“ÿ…ýV¾°·‹ö>öbÞ`ÿ=|ã@opIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-12.png 644 233 144 2400 13755454064 14656 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܵIDATHÇÍ–]HTiÇŸ­ÑJ¡Š1£½Yc+*èÊ`£/“&SÜu»Ø,d»k½è‹uÛÒØº%p3°,m‹HÈï‰ûØhËüÀÔ•uÖ™sÎûÛ‹3ïœ)–ÚKß›áùúÿþ3ïyß9""’ÿpg»³Ý íØýµ“÷nönþô²_0ÁµÓµóÉ÷°èÜ¢sYõYõÖ€ëºîOžqô“y:/™â$Í‹]Nr’ 0¦i3`˜Õ¥ºpá'Öuݯ絞Ö×<Í·ýÈ»{ûó°Ë»Ë›0Ô‹2»ÍnÀ°öYûˆÅ Êʰ<–Tw˜]øD-QKÀ0Á Z+‚«Êª"FÔl7Û×Oð4_’ }Vi#i#Ó©ðÜ|n_‚UiU2Ão¼â˜]f›Ù4ÓLs’¡Q5ªFJ(qòüÈ1Žš`)K¬j«š"Z?ÎKðm?qcºaÕþ*­f}žØ‚ ›«Ž©#êˆÃ»X~±üb9ô¿èÑÿÂÉ”””™gVœYÁ5Á5Á5I_`ŒTRQüe CÉ<Í·ýÄ¿ƒÆ©Æ©ÄxߘÓìÎÕFµQ {úöôíés€Î†Î†Îœœœ„emËÚ–µÿ¸ÿ¸ÿ8dÊ>”},°üÁrÇ õKl}l½ÖWeßö#°°ca‡j‚‘µ#k“¶ V©"'ŒæEó¢yp%÷Jî•\ðMú&}“Ð{§÷Nïhïhïhï€Ê@e 2àÌå…òBy!¨í¯í¯íwò¦ßðž$^‚oûÈZµÀ ÁøÐxâ§eTX…ÛÜæ6¨FÕ¨™¸vàÚkœ|¨ T*€U5«jVÕ€¿Â_ᯀ™Ó3§gN'ù˜gMYSÉ<Í·ý¸E¬›ÖMWHÄØnl½‹)O婈¸ã™u²NÖ%ê2;:;:;*’ž›ž›ž+2tbèÄÐ ‘Õ-«[V·ˆÖÖÖ‰´µµ‰xƒÞ 7("o弑W®»®»I¼ßöã™öOûûé¼×yO÷ñ•¤ª×êµD%"2!âÚàÚàÚàKß¾;}·HF~F~F¾ÈÃÈÃÈÈH,3–Ëi-n-n-ñ…}a_XäêÞ«{¯î‘lÉ‘«Û¨7ê%šà%øq?=•Qûéd—¼tvbjëÔÖ©­{{{ѲhY´ ÆN;Ã)Ã)Ã)0|pøàðAøÇ‰Eb‰qůÆyãüGOåÜc$î±b«˜™¤§cÖ9«ÿk½×ÿŽÞÇî±Üü˜=f`Y¥V©só“¢,e-Üàp–³œÕ¨.«Ë úTêÕ¤ž¨'(~0Ãf˜˜ÏÌg`+}ðæŸ³ÿ•söíbξÍÍ7عè;ÝàkiIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-175.png 644 233 144 2744 13755454065 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü™IDATHÇÍ–ïO”WÇÏŒ3à°ƒÌTÍW[b•¦ÚÄnbí$[@Rh$Є*&´Å¸n«ÒWk"MlbJB &M¦.6Y¶Z&DcÔÙ¬òfWhD-22už÷³/fžéº€çÍ“sî9ßï7÷ÜçÜ+ ""¾ìWÀ¹Ê¹Ê¹$ã;?´ã‹·-ÞVúŒÿµŽ÷ïýû¯PÔQÔàïôwš£¶o­[ù¹õ"6~.ŸŸØüžüG0ë·BÝku¯-^žñ¿Œ€§ÏÓ÷>êÿ¨ ÷ÛÞoùܺ70œ ‚í[ëV¾UoáåâKëÿð‹€{À=à‡ü¼ü<¼xç•?gn¾ïV½[pwÑÝEÊ Æ}À‹W),{ã[ëÙ|«Þ³ð->‹?£G`ÙÛËÞš÷kÞ÷ü-S0úwhYÙ²ÒâÓú€#Á zJO FÏ@ET°}kÝÊ·ê-< ßâ³ø3zä×½mû#ª6¯6д(q#†Òöh{Ðø ÙˆR¨´JƒþT¢?£Î¨3êÀ(1V«@å+‡r€qÖ˜5fQFIz[zšÑ¨m×¶Û-üÚN HfùíVŠˆ¬9†î‰{â)ŒùÆ|ÀT- ˜g»ÜÅ6=#>k …ÊñãĉsÌ1GnâËêeæ³N%܈ވxRžTÊeéqeä}ºA\»¿ÙýM¡.ɲdYRm ¦¦æŒ-:ä¾ã¾#„¦CñP\dóøæñÍã"¾Û¾Û¾Û"=C=C=C"ÞoW¤`¬`¬`Ld­k­k­Kd²m²m²Mdâ·¾ ŸˆûŒ{Ä="žÞê+ÕW$¼t]ù[åo© ²rWhW¨P—É„äÓ93ÂÞü^>ÙrgËñ‹ˆ8Þ0óTX…%ÝpµábÃEq47š"3É™äLRdºcºcºC¤ëx×ñ®ã"ýeýeýe" ¡†PCHäüêó«Ï¯9xìృÇDýƒÅƒÅ"QgôVô–8æS§>–t†ßñõ[†· gÛ(o~/°äâ’‹ª‡ã‰?Úž^ûtîét¿Ú½¦{ ¦S)8=pzà4ÏYçáÎÇ¡ñ@ãÆ0‡ÁUê*u•B¥^©Wêprúä/'É)|=û½š0&Xzü…þBsL>˜™ß^}g~e~e×oªÙT³©zƒ½ÁÞ Øþ°ýa;”ì/Ù_²bî˜;æ†XY¬,VMõMõMõpêÄ©§N@ "P¨€Séþ û{Ì×§ÎNKSÄ¢Øÿø£¶GGtkº5Ýj·2¹5¹5¹æÇçÇçÇŸ?{Ú5íšv î—ßÜ€Ùaö™}(0ªŒ*àV–ÏâÏê±çž{ž{)Ü0n ¸•`î2w-Ì€g<{^4Ò˜3­.«Ëê2¨í*¨rΤú½þ¹þ9óüÎÂ[7¶xâùÙó³=ÇžŸüÔæ×ææÂä1 ߨgìCãk.q)g”âÅ ´ÐBËÿü%aÂ(uÁ4¾3öûö3ŠQëªuY;õ«ÉÿÂÞ•/ìëâ…}½˜/Øÿ?±ŽÑ™À/IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-29.9.png 644 233 144 3076 13755454067 15052 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜóIDATHÇÍ–ïO”WÇÏ ?œ2i-(JÀpe)Y¢/F]DäGiˆ)Ä„¦•ý#о`³…V ¸–bRÓ¤Ù}A¬´¶dk£6º‹Y!íà:fkY‡æ™ç~öÅÌÓaûø¼yò=çÜï÷äÞœï½""².ôˆH‰H‰ˆ ∆p|í¾µû¶ü5ˆû`ª2UÝýÄŸ‰?p>á¼>ÆFÞ¨_½^$Ì¿ZψË: bbL»C¸jrkr×&ñ©ë`¾h¾øDƒÆO?øøÃ?ä7ðýÍïo<Úýh7„±‘7êõßj~éø™¾D}õ¹ib¢c¢E moÚÞÍ¿ ÜÛ å¥å¥ókæ×¨8 µXb ãs­ÂF>To¬7ø ~CÏÐö#°a׆]"Py¨òùƒà‚É eSË&CÏ8Á , -iKÚ@->P×ÕuL˜ Œ¼Qo¬7ø ~CÏÐö>ʇ""ïAµ»Ú j#€ÿ†6áÎÿèÃþiÿ4þP§Jwë úh5§æÕ Táï1.\?!¥ÿW‹ÓâðknÿóþçAÕù¡úqõcà‘¡oå""[{À¼d^ZŠTí7ì7€Ã”€ÊWùxø‚«\Ý©;u'0À«)¢ˆ" žxâÃaåVnåþÈ N¨]j~âOé…ôùG°ŸÐŽõ}­þn3ÙL¾ýÛMããããКӠnß.¾]­­­ƒÞm½Ûz·ÁôÈôÈôH8¯ß×ïë÷ÃxìØØ±±cл³7»75ýï©Î©Î°žš±mµm5޶ïkÑóEDFšaðýÁ÷áîeG—£K½–âIîKîÃg=jµYm9™9™9 ý¶~[¿ rZsZsZ¡0»0»0²š²š²š`®c®c®cUCccÞ˜Þ˜Þ;Îî8µãd5dDgDãû®dù…åÔkp¡çB¨˜`?¸ÛÛ­Àãóø`Ð<”8”-¿o~©ù¥°€5Ök…Ü=¹{r÷@Å‘Š#GÂù³¹ms›lñ¾í}[D¾Sï©÷Lê·OúŸôß¹%2¼oxŸÈ¿R'ç&çxÝwÑ·Å·EV.Õ^zùÒË"IeIeIe"#)#)#)"”SN¹HûÆöíEê«ê«ê«Dòµ|-_)œ-œ-œ±”YÊ,e"Ë®eײKäø/ŽgÏ©ûUíúÚõ²²7ÞeâuÿìÐg‡DÖô{êãUÉ*ÏO‘$’Hu@PVùUšJSi@=õÔ¯ò·uX°€: Žª£ú¢¾ˆG¥†ø›ì?Ú0/˜–"ùÏÿù˜q¼[ÄŸª›«›A}tfu+` X@ýMûAû?çfÅ9ÎrÔõàŽ0Æc€“EAM¨Q5º=Aq:0˜Á¯nj Ú0l8ÿ+‘¯DþŸ;ÿÓ{W>µ¯‹§ö=öt¾`ÿuµ¿ÒMIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-16-grey.png 644 233 144 6067 13755454063 16005 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ìIDATXÃ…—{PS׾ǿkí¼¡!€ÃÃRÛä‚@+ÚáqÅj!¾½SN)u;ŒÒãñâ¹c•:âÀÀú ­‹Ö‘Go«¥´" ÒTbÅÛê@#2<J ” !ÉÎ^÷èètúûgÏzìßú¬ßú®ßþm’››››› æÍ4ÿ ëD÷D÷D÷˜!÷‹Ü/r¿`ùóæ?Üô,ófÞÌûý¿ó| ù†­ÁÖ`k`E¨D%*IBŠP½èE/€7ðÞ`EÒ$i’4‰d‰ˆˆü»’L’I2y¸"Ï?Ï?Ï¿¹« ­ ­ Œòj^Í«Iâ<‡pÃÅ¥¢ €±ˆE,­ò…|!_¸aŸµÏÚgý¢òõùú|}õ}Ô>jmºeyÞò¼åùÈ·Q>Q>€»íwÏw¿ïö·àßµž{}7›OäŠàZ¦dJ¦v‘t’NÒÕ¥œšSsê+ŸÎ~9ûåì—Ïøø6ù6ù69nìÝØ»±—:Vt®è\ÑI¶I³¤YÒ,XpGp X`ÀnìÆnK±Ka±Ù‚lAØÖÙÚÙÚÙÊ-¡-¡-¡ÂÁ‰Í›'6§~¤P+Ô õ™3Ý™îLßPÊtLÇt÷vе$g.g.g@+ZÑô„¨AÔ jh=k·Ú­vë3[5qš8M›²/e_Ê>QµÊ¬2«ÌÐ` –` xÂBXDèCúxžf0ƒ˱ËÒOúI?xŒcã™”&¥I‰ÁºOê>©û„ß5øýà÷ƒß‹nJä¹Dþs#ŸÄ'ñI/îÀ‹x/ŽLSy»¼]ÞˆÄâ€w¯[-–Æg¶jR4)š~›.M—¦KÝTq*NÅa‰0%L SKgé,"$#É™ d ]¤‹tý¡­%Z¢„ƒÂAá DN™Sæ”^m^m^mXâö¯yYó²æe~›{}7›äò ù†Ä({»½ÝÞÞØ®œVN+§Yðž‘=#{FH»ªJU¥ªe¾Ì—ùB‰íØŽí&ÃdÀ%\Â%f˜a „Jë°먠‚ €zè±`B½P/Ôôú }fS¦)Ó” ¡œ”“r¢ÍÞfo³71J¢%Ñ’è­Ñ”…²Pú¯dG¼#Þhokokoc£ P"´ mB”¸†k¸Sä9ôOöOöO×?¼þáõÙYv–p7p˜KKKîÝ ºô({”=J€µ°Ö°rVÎÊ¡T«ŠUÅhïjïjïb£›ÇÍGù`>˜þÏ=ÞãÞãÞã(Šˆˆˆ'e®Kh ¡1OyÊS`È9ärúý€~èkèkèkXŒÙAv€¹Ö\k®N|wâ»ßµeµeµeÀ™Ù3³gfÓ¡§CO‡HE*R^—DŒEŒEŒ‘27›‡¦MšŠª×T¯©^ÃÜ6Ë·ð-|ËB›õ ö ö 2–£ËÑåè;\v¸ìpc_-ûjÙWËØcV{«öVí-ÆJh -¡‹ý“7'oNÞd¬huÑê¢ÕŒ † † †=öú¬›ÇÍGñÞÁ;$”ÖÐZ³°3)‰#q$n1RjZ§Ö…•…•…•@ø7áß„X¦-Ó–éÅyLÏôL<¸öàÚƒk€ïß#¾G€siçÒÎ¥™Af»w%îJÔÝênu7 ƒ`X\Ÿ¾F_£¯(G9ÊI(å¹@.3ǘcÌ1à3ùL>í¥½´ q®ƒëà:þpÄ'ÉIr`),…¥,ö[?¶~lý0}núÜô90œ=œ=œ °×ÙëìuÀÔlj65Ÿ6þÙ80Ñ8Ñ8ÑÐDšHÁ\n¸ÙÛ³·goc€j¨†jØ9‘ìÙ²ø’ÿÿÑÿvTtTtT¬ÈâÈâÈbX…p!\‡‚Ì2³„.t¡ @"‘¸Ø-[)[)[ ÈCä!ò bUĪˆU@B_B_B`SÛÔ65ð¶ßÛ~oû=kzÖô¬Ön]»uíVXÛÛÛ¡0ÎgŒ3øP6  ð%)HAJ^¥(W”+Ê%YÍ>Í>Í>Ni•i•i”RJ)Ì,–ŲØE ú}‹¾Ð+ô ½ò‡þbZL‹ÀÒÀÒÀRÀHŒÄHÇǦƦƦg†3Ù¨vªvªvÂæV|ômзAB,1#1âq'q~*¡W®\}/[¢•h%Ú/G&¢&¢&¢¸ÁºÌºÌºLç—%KfÉ,yÁ!löaÛ00÷äÜ“sOâ1Û’¼%yK2`3™Ç€ì³Ìþ¨x¡â…Š€¨w£Þzì¹üçòŸË‡ô|Éù’ó%‚å¾â¾â¾‚Þ”““»»Ã1är tœáœáœamhCÛ“ÇÅÅÅoÈgô3úý3º ò ò r¶>±6±6±–\uß™ŸÛ~nû¹ Dˆâ„8@cÕX5V€˜ÿF³Kg—Î.ŒÓÆiã4àQèQèQ¿üfð›°t´t´t´`{ÕSUOU=…o*…J¡šÛÌ8Æ1.r;†°îpÚ'´OhŸàÚI©"USÉP@EG¢ø‚ø‚øÂî˜{›ïm¾·™µû_ö¿ì™˜ýüüð^I^I^Iû û û °Â +@ÄDLĶ` ¶’}’}’}@ÀDÀDÀàsÊç”Ï)˜Í…æBs!<«gªgªgø›ÎõÎõÎõt÷ ÷ ÷ËáÓØ„MØôÍq¡E¢ W™çŒž¯Eÿ"¥¤””^Í Zª¥Úƒ ÐA=¡·ëíz;¿×Tcª1Õ@A~"?‘Ÿ`Î ç„säC,TO—q—d! Y€ ”‚rA:ÊÆšÆšÆçÉÑÉÑÉQÑq©§ÔSêùuÁòcË-?öÑä!yä,úÑ~~ƒ»õÀ†0Äwa?öc?ixöü³çŸ=_ò7ÙÙÙž¯ &&&D¦º‰º‰º‰Eí’12FÆ`C':Ñù‡3wkdŠM±)0z‘^¤!ýÁøƒñ#[ßæÙæÙæÉ•xÈ=äò‘9{½Æ^sè½®¼®¼®<€™‘áårsÆ jq=kOÁSð„×ûwîß¹Ø÷Û÷Û÷zÏÃÛÃÛÃû^M¯¾Wß«çJ ¯^5¼ÊÖ“ ’A2 ª„*¡ ÌY OxÂÃ:f3ŽñuÓʦ•M+áå1ê1ê1 1BŒsè=z”¥GGæh%­¤•Üq×6݉Oº°w×/‰Ô}©]y·MhB“ó‰%±$výßæ9®\pìuìuìþ™*¤ ©]·â芣+Ž"Ièz„(h £a°ñY|ŸéÉ“!'CœËGW®]ÍõÍçÛ’5ó—æàM¡L(ÊDÇ]'û?î+(((((€ÙQ¸:4äÒî—v»´{ñ1í:ô½ƒßkª0U˜*òî”;ÍÖfk³U°Œ”””q}²lY¶,»ë’íWÛ¯¶_³?êKèKèK\€w>u.äçGóß#.ÿçÒî…Ç´88(2ÕæÖæÖæ:¸*z¯NŸNŸNœnmomom'»=ŠE h ùç ÑNÑNÑNë ÁÑÁÑÁÑôw×zÿåþ?ÊÅáO,>>>>>¼«ÙÉ$LÂ$ä¿GÃGÃGÃñ¹s™s™sÙ-^, –¿râ· ¿mømƒÏyS·©ÛÔ͊sæÎçÚÇŒcÆÁí¯¯¯Ë b¬‚U|u RH!åñ;~ÇïÂR÷ ¸Å?ÊCðö'Ú͇œy¬5°†ø~ZOëiýµà¹—æ^š{I—‰ËÄe´›Óq:N×ò}H}H}Hý¦xc¿±ßØO. ~‚ŸàÇ>uùÕ»-ÆAñöˆv]陇 d Côo’FÒHÚõf`f8¼[þ´üiùÓ´›↸¡_ŸÞÞÞß{¿gGÏŽžÀ< ‚]þÜ…¥õ¯8þfPÒ~Œ‹¸IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-23.9.png 644 233 144 3070 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜíIDATHÇÍ–íOTgÆŸÁ™òR+V­¥ÑIPBq˜ ÆŠn µ µFöƒl\vSEûi³Å S:‹Àn@“wi¡ ÍSI­¸‹F”%l¨S¦€Ž sÎy~ûaæô°ý <_&×ýr]wæÉ}=!„ á_))q!q؈›÷˜÷¤^áLïšÞøÄ×Ç×$º]Ú}ëy½~i¿ÿR==.„ˆii5í ãSð~Úûiæ•!\}bÛbÛž)PòUÉW_6}ÙÄoáÇë?^˜Ý9» ¬çõz½_ç[Ê/NýB_ˆêŒê4CLtL´°~÷úݯþ.TðàUx;ïí<€"ˆ” NV¬r'àÇþy—`=®×ûu>_×ÓõCóx)ç¥!àïˆý[¨áþçp"ùD²®lª¨Â ŠOñ¨ÕAäUy&0°ž×ëõ~Oç×õtýÐ<ÆQþ$„Ÿ½ 33 _ö(÷‚IÁ$ÐzƒcÁ1‚áI¥6¬ h üWWÆA¦É4™†ñ=Á‹÷g$µ§JœGP™ ® ®éñCÁã‚ÇÀ¬®¯å7Ba«…X_¬Ï·Lþ4Ò3Òü€·@fÊLü|î€6­MkÓ@m´-¤ƒ:FXÎÉ99ü‘*ªdŽÌÁÏ®0ÿš°^XŸ…æ ÿc ßË–šJM:¶e8ypppjVÔDÖD"o¥ÞJ½•jÞ¹yçæ›àLw¦;ÓadrdrdÒÈkÝZ·ÖmàþãýÇûC]vÝëu¯#Çþ3zzô´¡'ÇKm¥6ýh¾Z¦BÜ.‡öÆöFèrŸqŸ‘‡RükÖ4°¯¶ÇÛãÁÖbk±µ@V£Õh°ÖµÖµÖûlûlûlò åAÊuºGÝK²ö[û­°¡dCɆØþ×íÕÛ«aÓá×¢_‹&ðè­ùÕó«å!ø¢ö‹Z1¡y„Úg©±ÔÈVðühýzÅ×+àÄïËß(ÃØV·­n[ä7å7å7sÈ9ä‚K[/m½´6wmîÚÜ·«oWß®6úÎ6Ÿm>Û ÙÙÙF<ûåâ–‹ð—ócçÇ»»AQ—»ü[Ù*Pccµ{òätÑt‘±öÃŽ¡Ü¡\H¯M¯M¯…œc9ÇrŽÁÂÌÂÌ øTŸêSaoþÞü½ù`ÛaÛaÛwKï–Þ-5xØø°ña#d82È;™w2ï$DgE½õ œKt}âú/¨~Õªx!î…8ížÐþa=b="[aîÑÜ#¸{f¸n¸–¯2™Ç âtEUE•!ät:N'äççñMÅ›Š7C}w}w}7B¹ÇÜc†ý…û ÷Bã|£¿Ñ/g&-&-ÂåÇß¿ <-{Zê#K³¥Y¶FȲgçžë»!DïžÞ=BÜ\wâþÚ©T±Øùiç©ÎSB¬Ì^™½2[Ó¬iÖ4+„jQ-ªEˆ{‚=Á.DfKfKf‹»¦vMíš"«2«2«RK…¥ÂR!ļwÞ;ï¢rsåÆÊBü•ãEÇ‹bqw¼=ÊÅb°ã@Ç!"ÏùúöÝT‡¶>üøÃaA mÉÔ¿Ý—Ý—Áé^ç^‡tot¯w¯‡@Q (PJ²’¬$ƒÇéqzœ •ieZÈCò<ÞBo¡·0d·ò*,^YìZìO†Çî±#å‚’¥d[Éì‘ÃGZx+Cëiøè¾ö™§2I&áÿÙ—®ÉkòH—tI×¿Š–Ñ2䤜”Kl+fÌ -?’hSÚ~¹.ÌtäÉÈ€XO¬Ç·Œ‡ÿçcú ðÙ›ü© ¼ äç!g–7T«jùweN™#ÈyzéEòiÈ0åEÙ.Û \à0Ç 3 eŸì ßž ù³:®Ž”×âzuçoÙ{Ë€à/ÿù½+ŸÛ×Åsû{>_°ÿêU6É¿{<IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.3.png 644 233 144 2744 13755454067 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü™IDATHÇÍ–ÿOÔuÇßœÝàšá8ØlI“ÑÓæ¯÷ûõz>Ÿû¼?¯çû-@!„5ñ`²™l¦Ìxlz՘ϨȨxì«x܃”ê”ê+Mµ'kÀ¬ƒ³j#Ö×õüäz! üd>}^X…11Ã=ÃâHÄÛ ¦¸¦8ã‘x¼ÓfÙsW…Úok¿ø¦ó›N6Á_çþ:pÛqÛF¬¯ëùz½Ž—Œ/¶ý_HïIïIùf<4ã!!  ¬ lÞñ„_çAåó•Ïü™úgª4@, X°H0ÁúIŠõõD¾^¯ãéø:ŸÎ×# §4§T¨z±êEóxAà0¸ò\y:Ÿâ¶³ ¨ê@l}l=Ó }Ò@ )`Äúºž¯×ëx:¾Î§óÇõ[9*„¯ç˜s 䣊_ (s”9 õ+7”( ¥R—,ß–oÉ·@³i6͆1"„ ÿImX‰*Qõ†’«ä‚|,Žΰ3 ŒëüúVžBˆ'>ó„yb"MŽù‡üÀˬY"Kˆò-´¹ä’ ÔRK-ÈY#k’…ÿ#©JUªÀ‡lg;€,•¥Dù._—àKðŒëI|±öŸäɺ”ºN{újÞÀÀÀ´æ·f¶f"û—õ/ë_Æ}cøØð±ácpÖyÖyÖ™$È*­ÒjÄ—¯_¾~ù:ì²ï*ÚU„ºè t|òl]F]†¾µí? íY!„èo€®}]ûàÊéPK¨En°Eç¶ÏmgÚÑèxÓñ&ج6«Í þ^¯¿× t´9Úm°|ÿòýË÷ß/¼¯»¯»¯¬»­»­»¡zOõGÕmpî{sßcú·/n¿~ûu¹ØâÛâÛâ{®=מkÒÆ´1m,©š#Í‘fXU¾ª|U9<±¬p~á|¸r}¨r¨’¸»óîNЮdþ‘ù‡6(´£–zK½tÃøÍñ›ðKËÕO¯~ 3çd\˸Í[››š› ‚=;zvô€9`˜P`/°Ø/·7ooÞÞ<Ðr´-ZŽ·o9mmmÎüÍ/z||^ØñLÇ3÷Vß[ jlæ3n¡fëÿØÉ¢“E°ÿkËã’Lç„‚éÅëW/®†¬Y³6B‡Ö¡uhAë¦ÖM­› l¸l¸lÂÃḴ¸´¸Î÷ï;ßK—,]²t ÌÞ8û•Ù¯€S­:Pu€éH€ÜîçÜÏ<œøÇØïxíÝ×Þ…)5Þ%Ÿ Pj(?” mÕ‡êaªdªdªÄ6udêÈÔ¸¼¼Ö±Žu0b±ØAž'ä P( ”p+tkðÖ 2víÞg÷>3º’@}A}ARWÆ_ ÝW>£Ê|™Oôß™£å(H¿ôK¿!„ A‚€ ®$Û8%OÉS Ê.Ù +e%Q™Ç—‘¡þ¡~sÄ™HãÇÿø˜~|¼’œ ·ãÎ,ûb–˜¤[T'Qønº çg+M4Ùd“ LÆÏJ9 /ÉK0[Éû±Ÿc?£H¯zS½ |©;ÿ ©/¤Óÿwþ÷¬|`oì}ìÁ¼Áþ†ßXΨ#«‹IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-47.png 644 233 144 2273 13755454065 14677 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜpIDATHÇÍ–]H”iÇÏXã8`S‚{gLÁ²B ”ËšP™ƒYfE‹A°!IÌÎͦPÛúYP&šîKI«±Ý,{±­"[L0âEYæÎÇó>¿½xçýh[—…½ñ¹y9Ï9çÿÿ¿çyÏyY—y d­ÏZŸ0í¬Zg?§,§lS·ißPà)÷”ÿþ ¬m^Û w'ïŽ1æØ–ßŠwç‹8øn>k_Ö‰³á»ï»ï)ÉØW rkåÖœÏLûÛ§àïõ÷.¤ádßÉ>€‡mÛø¦žM=x_ò¾Ûò[ñV¾…çÆ—+ãï wÐ_¶/[‚¥ÁÒõfÀŸaßÞ}{â«â«t¨7@.¹º˜ck½uÙ–?oå[x¾Ågñ›zòwåïýUû«üß› cp®à\Å—ê®r•\HÏ¥çTµª&ú©~ €8¶å·â­| Ï·ø,~S||¶Ñ¯ œα‚Q#À¬QaTÊ8´>©ëã`T‡Ã •VZA:™N¤ «° ƒ ¨ ¡õ—éît7)P†2À¬jjÔá³øÅ-èóïÀ?埚[ jBÙG³‡„QiT²hïSDècú˜>†³X`Z nÓ¨1jl¼=ŸÅoêÉ»ñ3Ô]¬»h'¢ÓÒl4­[u³nvà_…^…^…`TªQñÓñÓñÓp½úzõõj¸»»ƒ._—¯Ë/~xqëÅ-Þ/©¡Ô‹Ïæ7õd™uÛÖ/²óìγ™2Šç YòÜóÜ“¤tÈM¹)1dµ¬{Õzk½µ^‘¦‰¦‰¦ ‘éÍÓ›§7‹t6v6v6Šôõõ‰IIIгc‹±Å˜« ?1È  2xáÚ•Ëϱ4{Àh0X¤‰G<=ªëÇÀArgœqà2—¹ìRGuæ;ü9ö&ʨ1jœÉO#—¸øðâªrÉÎÑ@ƒ«âv~ÏÆ_vò¯Ø劽]¬ØûØÊ¼ÁþCl}ˆÏ8ªŒIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-1-grey.png 644 233 144 5365 13755454063 15717 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ªIDATXÃ…—}P”ÕÇ¿ç<ϲoмÜQ`yQDëò¢\s¬«Žâdâ0:â[L£\mË¢«¦W,»¸pÓÊ|M‘6YÔ¤4Š•Qp••D`!XØÝgϹð<ÀXÖùçÌór¾ßÏžó=çù-ÉÍÍÍÍÍ…†šm¨£³Å{â=ñ7ç~šûiî§Ü/ÿ×ü_óM‰âÞÜ›{ï^'ùKþ’ÌZG¹£ÜQÎw¡%(!D"‘šÑŒfk±kù.õ"õ"õ"b‰ÄG?—nÒMºß4æMÈ›7¡êVAFAFAi—B¤)„¤q°oe./: ˜€$ÐÏY>Ëgùì[g¿³ßÙ?>6ß”oÊ7}Þêlw¶;Û+kí/Ø_°¿ó/}‘¾H_„ó1É1É1ÉħŠSÅ©€XŸXŸX@¹Vž+ï+ã½a}ÙOñWx>QžÁ¹'÷äž,¬!kÈš"!DB.–öí?Ú4ØÇ·Ò·Ò·Ò½%¹9¹9¹™º¢££ÉËjƒÚ 6ÀŽ·ðÞ‚vØa° «° @»#ÐèÄË555ÜUYYɶtÎëœ×9oÅ>]ˆ.Dò{{{ÍÜ"žÉ3yæ½tú"eo³·ÙÛì;>Àø@àXaŒ0Fs1ÌÙãìqö7D,ˆX±@JXïXïXïÞš1Ò¯^ª^ª^ ‰É¿ä_BÇãxØYv–Ümî6wÀ¯ð+ü tê%ê%ê%”ñŠž¢¯ø)þ ÂGµuÚ:m òSù©üþý½Â^a¯^ššš&½œ™‘™‘™!~ï¥óÒyéð7öûý éH‡HêH©Èr\èGô#ú „ ¡B(@ÌÄLÌVb%VBTÆ+zŠ¾â§ø+< •ú¤>©/5ÖyÎyÎy.ãï¾i¾i¾i<,íXÚ±´c¢’‘^>™Oæ“áIgÐt€"¡à§ø)~ €?üáØìöàᤇ“N ‚ *Û° Ûe¼¢§è+~Š¿Â£ðQÉ#yäŽ%®DW¢+HªOªOªG²×¯#^GàÁ~d?²áI.“Ëä2 $8àp‡qÃíZõµêkÕ@ŦŠM›Fî#P†2”Šž¢¯ø)þ ÂG¥0)L ›±Þû‰÷ï'Ø5-qZâ´DR,Ë{ÐZCkFÀø~„ †jÀÒ`i°4ÅÏ?WüP=³zfõL`láØÂ±…JQŠÒQÀ"Dˆ#zÃú²Ÿâ¯ð(|¢£ËÑåèÂÿ¢R£R£RaÐ^Õ^Õ^…gñ,žÙCö=#`O7×××@ý±úcõÇÀ¸­ã¶ŽÛ ¸ƒÝÁî`™ÈDæïÇ ëmÀld?Q{P{P{ö‰³&Κ8 †ú®ú®ú.ì¦xïâ]IOÒ“ôä(™s8‡sôÐC?¢O2I&eõRÔKQ/« W®.Æ@#àôqú8}ð×MÉpÐ0âOWÒ•t%€C8„C$’ þ‚¿àÏOõÆ÷Æ÷Æ£EÊ‘r¤äkò5ù|XɤÒËOãÓø´Q×ëø:¾@0‚ü'€JÖ;щN€Xˆ…XÀå§B}}=Zh( ¥¡üÕ¼§yOóž´¿eBË„– üÔ ã ã #€©˜Š©`),…¥ŒZ*„Q3|“Ü$7G]‰‘ÜÇ}Üÿ@6’U¾š¯æ«t ¸»ðî» ëëëìÑ´hZ4-Ò~Š4¤!-¯DÌsÅ\b¨ò©ò©òq‡Úž·=o{:ª§zªG/‚„ Q›ƒƒÿ>»dY@äUò*yõO@â(ŽÄDLć”.¥KéÐ}eýÊú••%+±+þKÜÄMÜ¥Ôï’ß%¿K;·{$y$y$mëŒíŒíŒî~‘óEÎ9îͲ¼'7p7ÀF4¢qd鸅[¸e„Ãát8NÀav˜æ?Ä Àx¸œQuyayay!³·o;Þvœ~ïñ¾Çûïß\îjuµºZ·¸h[E[E[àºìºìºüf™>EŸ¢O¹_Ú|¢ùDó a¿y™y™yŸC²HÉ‚š}Æ>cŸ €”‘2R6Â~(üPø! (0(0(ð&t>›Ïæd™Cæ`à†á†á†¯ÔF×F×FSÖ_ë¯õœÇXKXž,œN §Æ“¡2O¨C%*QéŽ# $$Ì98T¶]|ݵѵѵ‘½±‚­`+½7zoô^,â±<–ÇBG~"?‘ŸFmާ£1TU`8:¿àü‚Þß¼óþÍž>úðч¤M}Oúžô=¨UƒªÁœdžÊSy꾋|ßÁwˆr™çŽªÅ¤ˆ‘¢KY4‰&Ѥ-åCç ýÀDLÄD¤¶wlïØÞì…üà7js4ðÞðZ^ËkÜÂ-ÜÞÝÊyáy>û|öùl÷æîmÝÛº·‰Ôáêpuøñ‚ˆ]»"ví»ˆ<ä!œ€X¤¹Bbbbbb"ôèAz˜7‰!1$†ìœZ:µtjéµÅ¶e¶e¶e“iototoôôŠÇ¾}ûº7ÇÄÇÄÇÄÓÅ\Çu\Ñ-ÑB$Á$˜d™D&d‘ ’A2ñªõªõª•Ï©ÞS½§z=66flÌØ˜¶A××׆åÿìHïHïHï•H©"Ud­üö*…³]îO²1l ƒq×^xý!àÌvf;³·îÔ{ë½õÞ÷N6›šMͦ?É®'<á ðÞÃ{â".âÂ@‡µÃÚaÅñÊé•Ó+§cœ¾]ß®oX<‹gñ[wÒ½t/ÝÛ6HKh -ȧrªò JÈå¿$ÊA#/‘°_Îîf9»‹åì–=+»¬‰5±&èèd:™N†C2HÉõÁðƒáÃÝí3Ûg¶Ïîh¦k¦k¦ïÿ¸À…-ß³bVÌŠÅhE+Z%¥œñ,(((((@¯2£o gHÎîf9»äìžû]v]&—É%m´mF›:J)¥=ÊLT T T 0{[q[q[±pG³]³]³ýÖyÇÇǃíûîÌ¿3ÿÎ|@ •Çé@…oô)`å,ð²‘lRu6êlÔÙý‹5ë5ë5ëtûwûwû‹¶Ó¹§sOçº7#ˆÀ¸FŸFŸF©©«©«©#éº&]“® `¡,”…¾ñ­øšøšøÚÀ¬°¸°¸°8Ú%û½"÷Os xF“7™$_6rîÁ=ÈëíSÚ§´OÁaw;ÈT+©ÃÔaê°¥<žûxîã¹>gm·m·m·ù®rý“럸_ìsõ¹ú\B¶j¶j¶jvN 7r#7;?ôEî¢ ]èbÊ È%=ÍCðíÙ͇f˜Ýy¼œ—óòD =CÏÐ3—Ã.\Ȧ¨ŠUŪbz[È2…Ìê+ágÂÏ„ŸII´Z¬«…\`ãÙx6ž+•ªI´?‹ƒâ/ÚSÙ'g7YÈB–ø3É $ã›pnæfn~s•v¢v¢v"½-´ ­B냉l7ÛÍvo|Ø´¼iyÓr`a²žRXüÇÿô`}Ú Ô‰-IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.7.png 644 233 144 2415 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÂIDATHÇÍ–QLSgÇ/(""}Q‰DlLÔE^Tx€©hűh!!sÄds‰ÙÌpêÔ³MÑ¥QbD‡úP#1Ab”açP“>,¦Y+‘:´¨i6³½ßý~{h¿Þ‹ø²7îKsÎwÎÿÿ¿ç;çôj iš¦å%5H/H/HÏMØéŸ›þ¬õYë‹®$ìfiUiU}³\³\ù—ò/½¦­ÎU¼5_ÓL|+ŸòkyšéÈtgºÓÊ“öؾtûÒ¬¹ û§{ÝžÝþN‡† 7®·^oåKz0ô`´|´L[«x•¯ð¬øÚ‘ø5 2nfÜL B¦-Ó¦i°pÝÂu‹¾Jô/‚Í•›+^L{1M¦€øÈ!G–cŒ¡ža‹­Î“ñ*_á)|ŧøz4˜S6§LÓ`ËŽ-;²/&z…ý ö/P|ñvà8ÇÉ}L»Ä.Þƒ¼'ïF˜¶:Wñ*_á)|ŧøz´‰w{r-²ÚVmâñû ‚"Æ€^¦—×ÿ3Ä ¤\*íÒΤGþ.ïÊ» ¦é†n€¨ÇÄ1¤Èí‹í#.?Õ3õÌÔ ßgÜ©;u%ðäZËUjš¦Ù†ì¡ì¡±éDcój6J]ì;‰rŒvÚ- :è h ‹?FŒØ­ïyo5:£Ž¨Â‡€Hñ'õ$…5ÿ{î9‰þ0>‘áø`|Ð,„ï¹/à À©ÒS¥§J!ð*ð*ðjrÅ   ÁµÚµÚµ.Œ\¹0m™mZ›þ_ü]þ.d ¸'Á—âOêI û󸹣 @~¦ÞÖ;àõ{ý×”×”×U®*W• ú ú úáiÉÓ’§%¦0Ïãóø`å¶•ÛVnƒM7=ÜôÐl˜–ç-½-½f5E—âKð+=äzr=Ò CÅCÅ`ÔN¬ÀÇ w6@ãšÆ5k 3ÚíŒÂòÛËo/¿ >‡Ïás˜ññP<™öåù—ç_žÎ6g›³ÍüRº¥øQ9üJù3ógaøåðKËØO7FQ'r8r8rŽ GØKí¥öRðgø3ü“¯4r-r-r C…¡Âô,éYÒ³ÄÒiWÄiqÚ—âOè™T1áœHp¦øÌŠ3+ ¢±¢±¢Ñô/®[\·¸Îž<;#Îçˆ%÷\ιœs9P²¬dYÉ2‹ çFÐ}ò¢¼æ LªØÄ“ßOì±Pw¨#Ôŕŕŕ0»yvóìf¨±ÕØjlÐçíóöyÁþÈþÈþÆW¯_µ‡jÕ‚[Ol=±Õ"Ì&„À¿â¼8¯æõ£=öÁT’œ’[º[w›Sû!v4v^¿yýæõ0ö{½ ëe½¬‡áúáúázÏä3ù "E‘¢HD»£ÝÑnËtÑK/¡‡õ°…ïãSiÙcï‘@$³Qþ&æ‰yDå%é•^_Ú¤MÚ@†eX†-ÄQ¢©-ð»ÙmmŽÿµÇ,›Ÿê¬ê,@‡äæ,ߊ'â qÙ)ƒ2ˆä ­´aÞò¤_ú¥ˆ& Ìc.s¯i¡ ÆãqâÂ#<©¾Ÿâ›¼ù§ìå”ýº˜²ßcSó ö?†·w•¥7fIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-29.2.png 644 233 144 3020 13755454067 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÅIDATHÇÍ–ÿOÔ÷ÇßàŠGÀ/U‘x2Ù‚ë8È §ÕŸN ¥rMªÍ±Ò‰Ùš«ž‚é¶xGa©‚q)+ñšêѸÓ¬]ÎÚŒ‹¥i“²H S¢XŸûüþœÂ“õRÖKßü ß)|`íûkß×BÖóz}f¿¦žk„XXȪNã3ðrÅ˹Rø­!0õ™úþ¥ÂÑOŽ~ðqïǽœ€¹á¹a€…ê…j0°ž×ëõ~/“_œù}!à©§²þ «sVç%Ï•s÷à݃ÒŸv|ÚÉ¿§æÉ›æns· @<O@¿)¸>¸¼¿öØ<6CÀn¶›íf¨ØW±¯bh:Ðt ÉÈïXÞ±¼c|Û|Û|ÛŒø•WN\9Þ6o›·ÍˆÿôÎ3—ž¹¾_ø_ó¿°Ò²Òj2/d@ ®5­5iwdKôPô±tÃwkïÖ‚uÆ:cýöýöýv˜N'‚Pª U…ÀÑæhs´AÎΜ9;¡§³§³§“ÿ{ÂáÆp#Tž¯<_yª_ßÛ°·â¿W”¾ƒ…ú…z±5bÐîí£ücùÇdggáö¹°/샼M¹S¹SО×nj7¶KÛ¥í‚ÑÑѨ/«/«/ÿ´Ú? ›K7—n.…`C°!ØK÷–î-݃ëu×ë®×Ùj¶š­ÐïXêX‚Øð÷]ßwÖžüþÜÆ¹ÀtÁå‚Ë2 Ôõú»Z~µ.}ØçíóJWö°B°µ5Úa]ûºöuípaüÂø…qpz^§ŠVŠVŠV ÕÓêiõ@äfäfä&ìiÝÓº§Nœ9=¦AÓ ilE¶[üÅì0;H|4:èôK]A¨]é5Æ[©]Çß8þ,«©]òðëÈç‘Ï!²*²5²ùqdkd+$š͉fPú•~¥L>˜|0 œå,gAëÕzµ^˜žž†øÉøÉøIˆ‹¾}f§g“³Idä7Ó®iü{*¥ÇWޝ‡Ò»2e†î+i[–Ų˜øãÈ6°d¬“u~U"Kd ÐD›å±-§*Keéc>‡¡§ëÿ—é'@W íNÓòƒ”3ËÑd~2ä‡ê¢ºˆÂ{Œ0‚ä=Þå]Cò+ù0Î8ã@„YfA.ȇò!ðs:è@Ê¿ªI5‰"¿Næ%ó ~þè|Óù¦~4e:ÿ“{V>±·‹'ö>ödÞ`ÿíPK2ò#ÞÕIEND®B`‚routino-3.4.1/web/www/routino/icons/ball-6.png 644 233 144 226 13755454064 14361 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷ÜKIDAT(Ïcüÿÿÿÿÿÿ°€¬¬­[±ÉL›æíÍȈ.ʈ0—FBb0鱯ÿÿ33·l!Ç%¨€j.¢¦AØcx@ýÀ¦N:òÎ-»K€lIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-4.1.png 644 233 144 2366 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü«IDATHÇÍ–MhTWÇOÆj0ÆÐTQÔ)va)hRQC:U4~`¢Q+Úè¢f¥.üD–Bã¢*ò¥¥4‚’1ä”$L›€.c1“!’"†2A“˜™yïÞ_óÞ¼WKm—¹›áî9çÿŸ{Ï9ï ˆˆÈBëWÀ³Ü³Ü³ ‰=ß:öŒÍ›?û5‰«MHÛ™¶óó}=û:@NCNƒp°½oû»ãEœün>Û. Å1¤ßI¿“Vdá˰wõÞÕŸ$ñAÈ d¦ ¨h®hhºÕt‹ï ÒéxSô¦lïÛþv¼Ï_.¿Ç/sÛæ¶¥ý éóÒ牀×ïõ¯¬L: ­„íÛ¶ox5çÕís˜Ï|]L2‰½¢.lï[þv¼ÏÎoóÙüI=¹›r7‰@IYIYf}2`à8µìÔ2›/®p…ù`L“f¹YN tPH# lïÛþv¼ÏÎoóÙüI=ò÷»­ú ödìÉH êeÂl7ÛT“j"¡Oê:]‡VËÕbµgM1Å` á˜U–Z§Ö¡õc3ÏÌ#Ê£<À;+ŠÏæ· Ï‚ÌHfdò#›aˆ°Ôê¦) ‚ Ðßè2]æ4Î8ã.ÜJ+­`Í :i¦Ùµo¨}jÓÚšâKñ'õXªƒãŽ_4€ÊÃ0 Ð5º]·'­ÃÃÃн»{w÷na6Ùdƒ>­OëÓŽ¹öXí±ÚcÐÿeÿšþ5)³Öþ„/áKk~ŠßÒc {|ÇÇ!ù_ô~6‹ÍbbºZ_ÕW¢b£Ø(6`C݆º uŽ]êQ= F¹Qn”ÃþGûíäJçÎ7³;~8~غô‘¿¥G`AÏ‚}"k#k1+ðq߸ï$ªª¬ª¬ª¹)7å&ìêØÕ±«ÃUK‹Ô"µbÏbÏbÏà¶ï¶ï¶¼oĶ{m÷Ú-F‹ëÄm~K@NVN–zÑ‘è¨OSmŸ,™­/Z_@¾?ߟï‡3Î<8ó —.)\â:±Ý @û´Oû{Á¡‚C‡ I5©&åöÊxb&‹,à]òÛ¨õ B 0àÒ1—<òÐÔšÊT$À4ÃÊÿï“Ö~+gíëbÖ¾Çfç ö/ÒˆŠÇ{¯ñ9IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-82-red.png 644 233 144 4255 13755454064 15612 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜbIDATXí—mL”WÇÏó2Ž(îÀ´+¨ƒÆàË*c×ê èEj£MDZ0…¸¡k[0­&dU‚²•Uj«6v1X‚3øR¢¦Z,Q£fÛFSZ‰0ƒ¢GDFæyùïæ>óÌlV³Ù=_àÜ{î9¿çÞÿ=7C4lQbüB£Ãè0:¸gÈ#G4fÌeQåÿA³h͆§ÕJI$‘ù@¨¯V²x¶žåcùCëñ Cyô|ÅTLż=t>fºØ(6ŠöÇÜn·A1™ûÍýæ~œYÞ¾¼}y;s7çnÎ]`EÊŠ”)AŸÍ³x¶žåcùY½óÿ§PòçüSþ)ÿÔ5‹íЄ … eÛÁË/¼¬Žòôzz=½àÅ0À\€ææY<[Ïò±ü¡õ&þb>²Œá»ùn¾Ûu–%HiIiIi‘æwú;ý~t"`j¢š¨&B’Ëä2¹ g˳åÙ€œ-gËÙ:?0ÏâÙz–å×€Cê[Æhhœ³sv"±B¬+ê~b ¬•ÖÖR¶¶IÝ£îGªªªT—¿Íß`H¾"_T¡ €‚PRú”>@uù»ü]€Tç›ï›¨›”^¥f­´n³n“²Y}ÆÃøÈpÇpÇpgÉY€¥ÜRn)Wãœwœwð$Ç#êïñ÷ná,¡}ÊZu-`?ö€ºUÝ ¨@Å¿ÇËŸJ»¥Ýšëq>rMvMÆK¹e³e³Ïx4>q¸N\wµ‚Mì+ØW°¯@ýK W²ûÛýíº ¾ßK€š%5Kà¬ý¬¤V©ðôHm­m­PsªæßÉoN~ϯ=¿Hve¦2S ö²úÚΆð‘ê6'˜Ì ¨|œñ8ãqàîABûæ¦ÑM£@Ø+ì€1ycò€á>o—¾]ª<u. ø÷ø÷À¼Ç¼èày½ëõ.qŸÇ§-’gô&÷&Œ‡ñ1п-Ûµlײ]Á/“;‡ò†ò¸ÙPfjf*Ìß0ƒèâØ‹cõÀ¶d}”õ,¸¿à¾>þvîí\]¼û«›_ÝäN} ¼Œ‡ññ+5ÝnH7¤kwÌHEtƒnÑïÙPfkf+Ñ-Ó-QíÒÚ¥DDûïï¿ODôZÎk9DD¯®~u5Ñ‚ v•>+}F:SN('tîHãã":Ò~Œ†Cƒ¡A»ò¬¿ªùóªçUÏ«FÇ 7È rŽÉr#Tü™½]±+úK2'™À°É° Þøá`hîÐ\ýæøm~ìnÙÝÆIÆI|©£RGøq°r°P“†o$[•ÆG|6ŸÍgû*×ì­Ù«“ÀHo«·¢nGÝàÛZ¶µLr7ën–þj•ZÆ Œ€Ä”Ä0~gü€´Ë¾køòý"ýÈG•éÊô`½ Uª.Ti/à.‰Kâ’üI˜#ÌælÙÁnYÜ$ˇ–åÉΕ®K®KÁö¡.Š9s>ˆø Bÿí?Wÿ\­=¹ýäv(~XüÆñãxèªìªà ,{s`ËÀðÇøcàóbpüàx aK‚5Áªh€#Ä1_>¡ÈôÈôÈt"ñ¢xQ¼Xß­5üiï§½/od8Jɱœc9ðÁ!Ä q¼ÜgÜgzÀeo-{ z¦öL€hs´ø(> €Ç˜eÌð„·ñ6@ù’ˆ*p¤îHPx}cÞÆ<Å« EBÑÍÜa?ÂM¡6á C’!Éäªa JÊl›m›ÕEZÿˆîø¤ã¨À×3¾žÀóý’ï—€Ü#÷€¿ÅßÇ Ç |µßÖ~ ‡_9ü º~è:o?Þï‘§•ñ•ñxS{Bwp+¹•ƒÜ8n7nÆÁ0@áŸÚýZÅåsù‹põœƒs0­(kÍö"{šv7†4jÀ§žWÏ&b¢^Ä  .Ríª=(¥îz÷ ÷ nä”ô)éÒ:m'·‰cű%V -›²)[´YS)•RÅmd';Ù‰·ð@x`;¥=­,k,k$“óãN_g°A{ÔEþ{þ{€ZÔPñ+~à•m² €Cj–š5WŠ—âá†4 ïÚ;æwÌòFí¢Ó±=v}ìúØõD¼•·òVîh€®€aŽüÍ:„¡ƒ;___Jd(4 Û5í¦ZS­©zí*%J |pÀ€>ô¡/¸Ñò4yš<-¸¿Õs«çVÏUio¹É`2˜º‡}ËÈГæšÂŽž¸0÷R¨o9¬]çÑ vKÊJÊtÚ5I&ÉR(”Á¶Ó†6´Žˆ¶ˆ¶ˆ6u¹¦ÉH>’|÷¯aRü"ŒÏH/ªuÚ]Å­Z¼œ«çê¹z½vÍŽæ v¥æá£fÊ}û<öy,0³fÿÌ~yª¦Å¡Ah̤ؓ^8àïè% ` ‚Úu nv«,U–*Éä¬wÖ;ëøàƒýŒ´ätÉé’ÓÁ¶#ˆÚ?I"®„Õ ŒÓ¨—†[ðn@»'ÿ“vÓ–¦-M[Ô®#Ù‘ìHÆááyU; .ŸËçòo -Ã÷…Õåè¿´—iw¡°CØ!ìpÍfÀùåùåùåê߇‡‡¤ÚQ»·à.™@uTGuh;‚3¬ž‘þG ×îöP?í6·š[Í­(“2)Sù?žÏ8∣ó—â¼qÞ8/‘pU¸*\åÎæ†ÜÿÍLÚé”NéâO¡Óð*¯ò*À5qM\Ó½‰ÃãSa'Ó–÷¥Gý/%5cé÷è×ÒIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-35.2.png 644 233 144 3076 13755454067 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜóIDATHÇÍ–ýO”WÇÏà ƒ•E¢ ÈKØc¶.u7ˆk³Qt(BÕAJh¥í¦¬­t“jSÒdÛÕXK,CSjµJ” “"XV¡M1ã|©ñB× ÛÈlœgž¹Ÿþ0<άÝ?ÀûË“ï=ç|¿'÷>÷{¯€ˆˆ,˜ù D¥F¥Fý,„£^ Ï›óÌyÇC¸IS‰©äÆÛ××ÿiü§Á[alÄüÈz‘0¤ž1/ $<ÝÝfÊ™Áu`}Òú¤ùñþKÄØcì÷ðÒ/}ÐþYûgü¾?ÿýy€‰œ‰c#näõ_$¿Ô=¤/sºæt™þ Ñs£çŠ@ZnZnúk¡„át(*(*™52KE€îæ3_å^¼c,ñ™|£Þà3ø =C?ÔÀ¢µ‹ÖŠ@ñ¶âm1-¡‚[ŸCmJmŠ¡§Ùwy—ùð¼z¹^Î}P}ª&c#näõŸÁoèú¡~Â[éÙ÷{Ø<´y‚×4Gà¶–¦¥ú]à™À3hL ô?é¯ë¯ƒþ+}™¾ ô ½B¯ È'Ÿ‡‡R¿¬ ¬B ÜÒ´ö…ø ½°¾±•½""¿<1Þ¯w¶ 9†@=ù ²T>þF/½À6°!BRGGÀ>|ø":Scj ¨ ’JeQ|¼âWž½}úBýÿi:§Ø^¼½Ø  þæÚ¿¾-ú¶ö ïÚ7„¶ ¯^l/l/l/„CE‡ŠAsss?Œß¿9~ó'+Æ`Ò`â`"øùÔ©¨+ÙýGú„õ”{þö|0ú‰ Žˆˆü¶Ã$Ï<'r±ð»äï’MYkZ× ¯¿ã¨ãcÇÇbÊËÎ[•·JäòñËÇ/Ù¡v¨J¤ÛÚmí¶Š8L“Ã$âiñ´xZäÁ¸Ñx£ñF£HîܑܑSU§ž?õ¼˜ŠW–¼RòŠøÿ^?X2XbÊ2Í-xªà)£ þú1ÏcÕ“_N~ g‚ßD »Ö¿óV t>ÛYÖY«w­ÞµzØ,6‹Í±žXO¬6nÚ¸iã&8|ïð½Ã÷~ºRöIû¤}jw×î®Ýž_6ðÄ'O|–ÙªlUþ7ýoB@Ÿ×;¯Wµ ÄÇÆÇ0»ïºï†ý÷x^õ¼ –+–+–+M·›n7݆š½5{köB«­ÕÖjƒ´Ì´Ì´L8Qs¢æDÍÿÙÊòÁòÁrX~pùÁå!çµµ¥kKÁ·W›Ð&ƒ‰-[@yÈ D÷_ð_0 ÈtÜûqï‹|pö#ÇGYd XV§È™¬3Yg²Dh ‘žc=Çzމ¤L§L§L‹”U—U—U‹$^O¼žx]Ä•äJr%‰hZ†–!r©ñRã¥F‘×V\[qMdë‹[+·VŠtlëXÙ±RÄìœ?'^ÉÈýs÷ω˜<êˆ:bˆŠšœÊœÊ¼Ú/Òy¾ó¼ˆõ«ÊºÊ:ªî^v·º[Å¿°táÓ ŸYš°4ai‚HýâúÅõ‹EìN»ÓÅÙâl"™Z¦–©‰ä›óÍùf‘u{ÖíY·GäôÅÓO_QûÕ~µ_¤#£#¹#Y$e$é뤯ÅßöÆÙæ³ÍTIêÕ«…"ú_½ÞŠ«ý3>ÖtŽžêÙճçÄÿÞTÎTüíšvM£ô£úQýhxk´“ÚIí$¸Ín³Û *]¥«t:ƒÎ ƻƻƻÀ·Ó·Ó·ÜÕîÜ/ÀèQ}TGýûw*ïTÂÔ?Bzð²ÿe?ðl¨áÔC>öUÈWTË+U¥øT®*Q%ìv»AÕ©:UáWKÔµH&™äˆŸkši¦ÿÇkÓUú§Ë‡‡| ÃÇ ç¿o8ï–Y[fo„œYu<Ьê£h;¦žzP½ªGõvìØpáuW¹” ØJ (ÕÐ:šº ÏÓçú|Æù÷o~gó;ÆÕéüî]ùȾ.Ù÷Ø£ù‚ýº¬ñÑ©þùIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-190.png 644 233 144 2666 13755454065 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜkIDATHÇÍ–ÿK•WÇ?W¯Wo™V$ƒÐÓr:£ÀA’ —)~C]$í’T#²H‰­Be –kƒõem¸M)2¨Ù¢Â ¦n5ýeS×LÓйîèeæ½÷yîyí‡ësŸÛ¶? óËÃçÛûý>Ï9çsŽ€ˆˆ¬^þ D¥D¥D%„쨃¦?®$®dãÕ}IËNËÎß›!ñ|ây€5ß­ù.øÈ´¸‘Y/bâGò~Y-¦#özìu‹cÙ> »svçÄ%…ìOûÁ~Ó~óo ênÕÝèîìî¤fÎ<˜sÌ9À´¸‘oÔx‘ørú_ü"s7æ®ebm±6H-N-N;Jx’UUÏ£ŸG«(Ð_ñÄ+àÅ‹1ܶ_Î7ê <ßà3øCzÖ®+wï:í߆ ]¦ä¦dƒ/pøˆˆÍ«yôZ½¨~Õ€ ˜¶7òzÏÀ7ø þyum?+BÕØjl€xú”>Á•££Ô ZP (CrðàLp4æÑ< œê=õ^ø¢òÕ!u¥Mú üÔq­D+ Oø‹»ô]º!𳢈¥ÉüÍ>eŸòZatõèjàåz 5Ê"ݸpE.¨µ´ÒJ«éçÇ8ªH©"àòɈ¿¥¢Â"™!|Ý4º X²ÛǽVCϲ°K?Áá–Ã-À@p«ú0p"pÂÔÑ^Ó^Ù^ ÃeÃeÃe&Ïн¡{C÷à\þ¹üsù0Ö2Ö2ÖbÆ]Õ®jW5\X{aå…•0121?1oþq5â ó/ëYök#G»öví §Ð>öeù²ðíÜóãžÍïÓûô>&ÏNž< Ò7¤oH‡¼ýyûóöCöRöRö ¯^?¼òóó!gGÎŽœÑ—Ñ“Ñ/*f<3|Ÿê½zëê-Cد ½ ½ê:¦¦Ì™ú³––àÚ›×2¯eBrVrVr NNNÃeçeçe'lïßÞ¿½ß¬+.-.-.…Ü+¹Wr¯@yzyzyºÏý+×놯¿ùêÀWL¿þþÔù©ó`艉®Š®"[l)¶éOL³­ÃÖ!â|ä|ì|,’|&ùLòÛãö¸E*ã*ã*ãD^¶¾l}Ù*RÚ[Ú[Ú+2’3’3’#"c2&c"+¶­Ø¶b›„G„î„nß>Ânøm7l7D =Q"ÁÛÁÛ–ѵ ­BD,""²NÞ–5²Æ t:"ÖZk­µVdîþÜý¹û"Ç7Žo©¾X}±ú¢HüñøãñÇE Üî·ÈDýDýD½Èlçlçl§ˆ7àõ{ý"2:3:Ãðë,ƒÚÚ"a=á=F×|×<ð}hÍY«ÝÑî{ 7n.Ü =í=í=í||| Ž:G£R¶¤lIÙMéMéMK·¯a_þX•¶*mUœl㵂KwéaÜrî îe‘%^I$‘ªL•©ˆö¡Ê¡ \Ê¥\ UœŠ‹ˆ·iÓÚ4‹ ÷±ÔÑTÀoŸ´Oþ§Et~jbkb`¸óéC@¬^¯×à}ô™}ˆÓ|À Ô€~á!#&p›1ÆPê7}«¾•?èzcDç×kbjbþ·ó¿¶wåkûºxmßc¯ç öÐûÿ¡Tn;IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-156.png 644 233 144 2732 13755454065 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ßOTgÇŸ™N‰v˜!n¬5Ëî²M•d„l¸2t›"jZ"pC¶ëïx˜hëEIZkÜ4m(‘hJŠÕ¶ÖDCCÅc…µ`‰J¤aÎyÏûéÅÌ™·ÿ€ïÍÉóëû}Îy~œW@DD¼±§€s…s…Ó•ÿLèÓÞI{ç/­Qù˜ÇÇ–þ ½!½À×ìk¶²m·ý“ãEøÉ|¶^¼’P¤žM=ëÄä὜÷rÒþ•v‚û¼ûüs>øîƒï¾ýæÛoؓݓÝOOm»íoÇÛxÉøòñÿñ‹À«?¾ú£cRSRSD`ÕÛ«ÞÎÚuø_”—Œ¿2þŠv€z,f±aÂØg*I¶í1;ÞÆ³ñm>›?šÀ’·–¼%›+6W¸¿Ž ž‚}™û2m>ã<𠟰̰P•ª’кHȶÝö·ãm<ßæ³ù£ùÈ‹µý÷ztYJY `×@©1°ÒŒÆN ý )¤  Ô>U«jA­V«ÕjP[Ôfµ8L=õ èKúÚ¼YY‰a¿¿Æ_ø A#hVŒ?QJ‘7¾Ät¹ÇÂ.ö{‹©Nc•±ŠyþÃc$Î#ŒÏxÆ3ÀÀÀH²gAèú¾¾Ÿ¤ÿÜÊ·ò™çoQ|^>¼øÍ=ê »ì|b‰û¶Úvx `ùu½QgÔÅáô‰”ãúûû<çž{xî!4–6–6–BÓ®¦]M» Üî ÷ƒŠ*àèÙ£§Žž‚ÞõÖ÷Ö£ãÀ Q>f¶íÙ¶Ç.í±Ÿc‰ÝªeO[u[uܽÆüláÍ…7YØÚ³µckG¢àWó®æ]Ík»µÝÚ---P²®d]É:¨)¬)¬)„›Ó7§oNC@T@ÁÆGm|¹Õ¹ÁÜ ü÷õ[í·ÚY°ù¬…ÐãÐc;±[µ.ÏOžŸÖæËß Ò ÒbõÇ×ú$7¸!RÒR’_’/ÒUÜUÜU,âò»ü.¿ÈPh(4™éšéšé1N'Œ"›"›"›""£Ý£Ý£Ý"ƒ§Ož :‚Ž C$çÝœ÷sÞÉìY™»2WRm>‡3°>°^$žø^ó½f ÀÔÄÔp):öºÍúÂú"Q²ü‰ü‰ü h¿×~¯ýÜ)¿S~§jkk!4š M‚?~ ¨®¨®¨ü;ü;ü; aMÚ†5u&ëLÖ¸èü~úûéÄš±Ö<ö=öSÄúÁúÁ1 Ê,6‹EÄ!""KäâŸÄ™ifš™"ŽtGº#]d®g®g®GÄô}A‘Êe•Ë*—‰,Ý»tïÒ½"Ê©œÊ)âÉñäxrDv÷ïîßÝ/âé÷ôyúD~1GîŽÜÃ/ᯑÚH­H<ŸxÑ6Û6 œ‹Öœ ó¢yÑî(è.è.è†Ë.¸|æ.Ì]˜»kgÖάo·Î[ÕWª¯T_ˆ7âx¡ªµªµª5/j^Ô åCå·ËoÃ3çth:”è1·Z­V¢Çþ8•‘Ø”Œ™æ@b*g?Ÿ=<{"G"G"G%6šŒ&£ žd?É~’ Ö~k¿µ?a·Æ­qk¦ŽO}5õ¨Ãê¤:‰uHb|6ÿ‹SùÆ—àžtO†]0¤†T·¬j«šyžóÂÑ×õu}t¡.Ô…Iú zƒÞú >¨‚þ³^®—'ÙW˜š2¯ŸÇ÷XÞp0ï¾ï¾ÿ‡=–´ù)K-K¬øæ¿­n©j§Ú‰Á1:éLì!>ãS>Ý¡;tp’Z’Þà ÃGÝuœ;sî ŸÂoý¿õL—L—€†Õ¼Z¯ÎWùâùÅWÒ^ºøÒEÝ#HÒ'é…€ÜwrßÉûþÁ~öÈbYÌ,çcüõ1½˜>w£ý~Bˆã½’z[½M¥SVÿTñS8,“ļº÷ìÞ3MphùÐò¡åptÝÑuG×ÁƒÁƒµ¼r]¹®\×ððØðØð8þêxÃñÒå=3zFÓ“×ë õui÷ŠÈB1¸z:z:à?›ï/½¿TîÌ8˜özÚë·íÝÖ¸­LMM¡«¿«¿«̃æAó Þ-¼[xLv“Ýd‡q˸eÜ¢5t«öVí­ZÈ8œq8ã0T¶V¶T¶@ÎÈÒ/—~Ið—“ÓŸL"wBgbg"(Ñ~t )þÿš·„Ø Û Âïv¿â~E×n¿ýYð³ Hª½X{­öšÙg³ÏfŸâÒ’KK.-"çJΕœ+B ˜Ìf!Œ£Ãè¢ÛÖm붉çcÚ?íŸö aïµ÷Ú{…¨û°Î^gb‘k±²XI³ÎI÷¤[×.DÉå’ËBˆÔÔ¦Ô¦5o ÈLËLSF0Lý1õ‡vì}{gì3v°¶YÛ¬m°*}Uúªt8ßs¾ç|YŠ,E(ÛU¶«lè ôúhkikik‰Ûci2M¦oŸoŸo”m*ÛT¶ ÌëL+L+àö˜«ÂUžzz”Û /|¬ŒˆHUÊË)/K'?~ Ç®žºyê&”•¿›ùn¦&°znõÜê9¨7ÖëÐÐÑÐÑÐÇÖ[l=dåeåeåÁ…G]xÊ å„röì=Ø Ö#Ö#Ö#ߊ¿½–ÿZ>´™¾YóÍ€ùòùrGŒWW¥SÈsês¦8S °@îüˆ‚‰‚ ‚™Å™k3×Bµ¾Z_­‡‡[n}¸¬ýÖ~k?,Û²l˲-д»iwÓnð<VWWaàÎÀ;PTXTXT‹ì‹>XôT…mí¶v‚¾Ä¨8×:ׂü6ÚPOÿnHlHÔNÉ|Ë\É\ L&yžyž!#­‘ÖH«öÆAÐôƒ'ß“ïÉp€ Œ)cÊx½ÞFNé”NYB–‹?¬Gþy¶ß~e e QA¿4:Œó”yŠ)µP•¨”þX ?óW³ÛìŽîf¿ùÔ| úŸºO÷Z¢ÊU9 Ìæ ¦øË¸iÜT?Êgñ‹S§ý‰þÀ,0 àŸƒYoÖT£¤‘|A¶npƒ`Ž˜#æÐFmŽø´Ò 좞zó€y€ “~„/ÊÖÖø3ì>´ûPtÝyÖ¨ïT§ê ¯ ?£?£?êRêRêR '»'»'ÛÖñðþÃûïƒ7×›ëÍ…W¯^ÙqÕ¢ºU7ÊqÄ>‹?¬'"ì·¸4~i›t,šœ´ðÕ›?¬Ç%’Ô™Ô™ÿ©HáÚµ‘ó­IjÅZ±Ä[_¾/ß—/²­f[Ͷ‘ÛþÛþÛ~÷°{Ø=,rëâ­‹·.Šì[±ož";“w&ïL™ß;¿w~¯Hðpðpð°D?.¸º\]¾ÖdóGô@òÜ乿c}9úÒÑö†ò+?¨jU­ªí•öWöWöWBnCnCnî-Ü[¸&ÞN¼x #` ذqÃÆ Á³Ú³Ú³úRúRúRM2e CÎ1cñ‡õ$u&uª+à_æ_æ(|`œ1ÎØö£ŽG:`vÚì´Ùip¤öHí‘Z;îõz½^/WWWÙþœêœêœj8×x®ñ\£í7Šôx=ÞÑ$Qþ°žiï˜Qzzcß±¦ö¦ö¦vpõ¸z\=°Ü½Ü½Ü ©+SW¦®„“OûÃÌuØþž_î<ï—çy3çžçI?Œkk¿acY$÷FÜŸ…p} †‚á?ªºUu‰—/k#¬çõúåý"þåzz\$ˆmŠm2ìãSPüJñ+q¿ á{ þjüÕù¼ÓúN+@˧-Ÿò[˜ê›êðìðì€Öóz½Þ¯ó-ç—S?ÓèöèvÃ!6&6FÖ½¾îõ—~*øî%xëÍ·ÞøqÅ+”‚&µðâE_Ó˰ž×ëý:ŸÎ¯ëéú¡y’r“rE ¿$¿$þo¡†‘F8¾æø]Ϩ¤¼/@д²ªGõ`À¬çõz½_çÓùu=]?4Od+gDDξ… Jðß 8ü/ú_íßþïýßãOª´yÍ£y 0ø!ð¨,•¥²ˆ¬Yf˜yŠ”æ$ñ&ý©þTPëBüPè.tu}}+¿ɬ…xo¼×¥fÆnÝö°Ôµ_ò_öP{¨=Zh¡eÙ 4ÐlcÛ"a5¯æÕ<ð!•T¨\•‹†0ÿoÂza}Bó„ÿ±ú^ÕqØpØ Ói¿]c·ÛíP³ê>uwçÝwwFkkk º¼º¼ºFOž=ÉkZ§ÖÁCŸ 55BõŸªOVŸD~äˆqÄDôTÇáØÃ±úÖÖ÷жEDä?`;o;î*W•*]ëK­O­gqû¯·goÏó¤yÒ< uuu`¹b¹b¹yµyµyµžžž ö${’=)2PMM ¤×§×§×CA°À[à…ô̵߬ý†EÇ“ŸºêV¥`Ë´e‚VšG‚÷ž«y®F5oÑ·¶UŸ§|žÇVäTäD¶Vm­ÚZÖ4kš5 ,Í–fK3ÔæÖæÖæ‚yÄ2}dúHÈlÔ¦Sƒ©àžuO¸'PÁß/e-eEN%ŽwÓÞM[v*C?">º¯„}Ƨ’U2¾§¾äQå§âTÜ2¿ÊT™*Ô TƒËâ“jBM€ŠSÉ!ÓVûÔ>|ÊâWßõõÄÏÆÏz£èü?Ó¿g_ãÊ P!gVw‚¦  Ô?ñsžÛÜFÑJ3Í :Ôê à—¸<ƃ”]ÝS÷wh>þœ ÎâW×3à/ºó¿õv°øsçv¿•Ïìí♽=›7Øÿ5ùûª¨,IEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-reverse.png 644 233 144 271 12610450027 16607 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.1/web/www/routino/icons/limit-14.2.png 644 233 144 2644 13755454066 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜYIDATHÇÍ–íOSWÇ @A«‡±AáÍ$V‰!b$qV‡&51Î:Ëà…¦NqYÌ¢`âS|]â`3Š &e AEID C„ÉR²8à 3p‹ ŠVʘ´÷ÞóÙ‹ö¶Uþï›æû{ø~¿÷žs~=„BLü ˆ4Eš"~ùu(».v]Êe?.S!⋈/þ< ÓJ§•̸0ã‚ö(„õ¼^Þ/Dˆ?\O‹é"ˆ©‰©‰°ðqØbÞbŽýÄ‹ÛÁPk¨ýWu;ê®W\¯à[xÞñ¼`È2dÖóz½Þ¯ó…ó‹ãè “oN¾ñÄDÇD IYIYÉ»ý%ÆõÖ<‹z%#@}LaŠ´<è; ëù@½Þ¯óéüºž®ï÷#`檙«„€Ù³ ?ûUAÁ¼‚yºž¯8ÉI¦€âQ<j®šË8ÈvÙ@Âz^¯×ûu>_×Óõý~BK© !DÉç¨6Ŧ ¹´©¾d_2ÈNuº_ !õ ™/÷ʽ ™4“f‚°o7À@I¹@ÉP2ð)|³|³@k÷óƒ­×Ö ŒôƒKÙ/„ŸžCŸ¡Ï3‰†ÇóÏõW¬4iKµ¥Œñ᳂¬¹Un•[Ãâ/yÉË”né–n`+r­\˧üüòm¯«×`ð<žI´ûý¾XÙo¼ÍÛ‘·äa-M'vnwîqîA>øìAæƒÌ öèkìkìk„6[›­ÍŠkZ‡ÖÂ=s{f÷̆ÓóO›N›é÷*ïU«Ó¤w§u§xá÷#HBˆÎ|¸ºúêjPHGŽË¾Ó¾“qýˆ4-kZÖ´l¢±5Êe+ËW–¯,Ÿ˜ïŠêŠêŠ“bRL XŠ,-ÁôÍܸ¹qŒwïÞØ½Q: ¾¨¾Ô?ü~?­F«¬Õ/ªÁ›‚3T/¼<|y’%u%uA}U}U}UHðTΩœS9 .Š‹â"ljÜÔ¸©q¢±±7boÄBÁ¡‚C‡BñÔ‡ Ë–ÃÙ¯Îo?¿À»Ï»5îNÜY#`ÆÔSµ‡4ºn'ÈKÁc@FaFaF!´tµtµt«ÂUáªsª9Õœ Z´hÌ9™s2ç„-¥]³kö°¥ÌíÉíÉ…ÅgŸY|,»WÙWÙaì˜oÈ7„†6mé™.¦ í¡@1¶[d ¿ ¸Ü {ßã´ö´»iw¡­¶­¶­œ)Îg DwFwFwBRvRvRvhL—+;WvF³G³G³áþ’ûKî/øEñ‹âAÑXÑhÑ(x:FJFJ hþéóÄç‰Àc¥±RÖ6g>uW*¯TÓü{,P>n1Y, Ðp¢áDÉaÕ¬šU3œuuuAV_V_V –––ÂòºåuËëàhëÑÖ£­`h64š!}vº1ÝÆ«ñÖx+ãÕ÷šÏ7Ÿ—¸å¸å¥Dßcú©ôåíÏÛ<ÕO¥z[½ Ã? _¾†ôº¼­ÞÖ‰{èïxŒttt‰$’¯‹_¿.†±ü±ü±|x•÷jÛ«mÐÿ¤_íW‘ß=q1J¿Ò8U¯ê8ù90’@ Àoxò”ƒÀ—Q„” Šª¨øäïjœ²*Àÿ£íˆíø}„Oþ÷¿ò£½]|´÷±óû?o|Vlâ.YIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-7.6.png 644 233 144 2450 13755454066 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÝIDATHÇÍ–mH”YÇïŒk£a¦ÑB8Eƒ[`P!k ­låbD Q¨Ñn/Ö–ÊÆ²öÅ2ªµðÊ$F ¶b˜Eöbb}‰m[-©e¡uƒ±pkfigJóå™ç>÷·fžyžVú°ß¼_fιçüÿνç¯ôÊþ&0v»·qNE@£k‚ &lö<æ1Ôsõ\=·ùë¹Ím`©¬‘51¼MLzǼc`ñGôD…í…²#eG@U™&Þg(w(ÕøYcVc4›ƒÍA¸àºàºà‚ÖÖÖé{Vñ¬âYÔ5×5×5CYÿžþ=VA• „G€7&_„ßÔãŒÔ-§Kˆµ•k+…àg!„p|-¨6üípÁpp´»ÛÓÛÓ…èììb§¶SÛ© ñÀýÀýÀ-bëUðUðUPˆ’;%wJîÑì ö…(›(3Ê !§=Nyœ"ޏø”ø¡© Éáéä»ÉwUø³üYïÝ’>ÕF®±ÚXmyϻϻϻ¡°³°³°sz¥ÚÖ´­i[ ²d/Ȇòúòúòz¨ºZuµê*¼^úzÉë%6–wæ?“?¢G@êœÔ9Æð|ÀÛhÛç«•j¥0zeôÊèð¼ô¼ô¼„{Ëî-»·lº°Õ¢Zxr<9ž8Sz¦ôL)¤_N¿œ~ºÝÎn§o¸Í1åêù`Åä—ºG÷XöéÉÓ“§'!7;7;7ÛòO&M&M&Aðaðað!t¤u¤u¤Áò±åcËǬ¸ÌêÌêÌj8eœ’§¤çóVL!~­„‹£G@}-»µb­Øê¿â†â†â¨=Z{´ö¨ì[å[å[2dß ß ß ØÛ´·ioÌÖfk³5(ö{‹½ð6nTÕ"}ÅSJEøbüQ=Óº#Ú%?éºu‡ÔÈ÷#‡GÃxÏxÏxí(‡ŒCè t:Áè7ú~P—Ô%u Uª@ÈZyL³ðx¢?ÒÅP¦uåÿŸcåìcŸíR… ¶Ù»ÙÍn0BFȰ>U¨Ej£Új\ÊBÛ›ð†¼!øÀ³M~¢“XßùT>Re¥¬$Ìwœã*Æ8ˆ/(¯ò*/ð7~üÀmnq T¯ ¨Š&–a ä€¿(¡(Á¬Ô{“Æ~+gìëbƾÇfæ ö_ªn~R*Æz`IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-111.png 644 233 144 2134 13755454065 14743 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–_H”iÆÏL3ŽŽ9¡^-‚+AÄ’KB$T’d*ì®-EP]¹]´I’D Áº Âh¤©Dþ™0ÚDd1È]´Ä]A¦!mæû÷Û‹oÞùF´î|ofÎyÎ9Ïó¾ïœ3¯€ˆˆ¤>ܻܻÜù¶íþÁñçÉ=òÕï¶}ÏW•«ê¯Ÿ`ûíw‚‚Ì7Ž­pŸ™/âÔÏäS~)Çáëòu¹*Rö58µçÔžÜ"Ûþ% þn÷G5>ˆ<Œ<äGXx±ð`¹b¹[á*^å«z™õåÚ:~ðöyû\³àËñåˆ@èpèðîóvÀß»áXå±J€ùmóÛ,7ÿyäY@œ8j-eØ OÅ«|UOÕW|ŠßÖ#Px°ð œ8}â´ÿW;áÍopyçåŠOë®s<ÐãzÀ8cœ!VÔŠàÂŽ­p¯òU=U_ñ)~[¬½Û[‡°ªsªs@cΘ3O» ]@³^[+Ö ë–0f¬×Ö+ëÕz+?®·émé ññ¤qÒPoʸJ‘Ò6tÿœ.îé‚é €£FT i!Vèe–Ù ªzè#jD(ÐKo*g=þÔx 0Ï<€yѼȊ½qŽÂ[ã­à_ð/Ä=JOJؽçpöêÙ«À2€¹×úY»¢]qvn ׇëa²d²d²$ëD7…›ÂMâ á˜Ü?Y5Y圸õ­Í—æOéI ¿ÄùŽºŽºtøwzK¢,QF¢öÚáÚaçÂWWWš–š–š–ÏÇîܸ™†Æ›:b1%lü’@þHþˆÕÅÝ÷/ß¿t &Ë>}øô:¿î,í,…Ps¨9Ô ýeýeýeN\{q{q{ñgà‹¡ÅÐ"ôõôu÷u;¸ñ¯ú¶°oa(=Á@0`NÁÒ»¥wÀ»í­ó¶yÛ)P^_^_^‘ÞHo$ó·ô¥¸1#f†°l¾4J[Ä|l>vM‰¡Wê•"â‘BÙ/A JziA-¨EdDFdD²Ö¦x‘V¤‰È<“gÀJŠOôãúq¥Ç-¯ˆWLü)žÑèhTDVEDøÞõµÃÚ!I•˜ ÌfD¼¯ÇëÉ&ÞŸL¦E¼ù^¯×›v']{m>‘Ñ¡Ñ!‘´ž¬®L¦ºdNŸÒ§œ®ŒµÆnÄn@r89œξªXk¬5Öº!nç%g“³X`0Ï7ìÊÒ6gލ¹¢æŒYgÖ±’Á‘ Á—¬uñkêm6Ç2&?Õ¾j`BjòO€Ï8gœC#ÌcÙ“>|@˜ûÜÏB-'ßh0”[C¯öT{ÔI­™ü[ö¿r˾.¶ì{Ì~1nµìÿO1^ôÕIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-62.png 644 233 144 2571 13755454065 14675 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü.IDATHÇÍ–mHTiÇÏqtìe,q¬Æ¢%¬4z¥…$zÛ(,$¡$¦Ú¥•Ô‡… 2(Š^f—؄¨ÝUÊÌT‚­Ì¥‘Å Y¥6É,W‘šÝœÑ;÷ù퇙;wvÙèk÷Ëð?ç9ÿÿÿ>Ï=g™ý°yl›+‚m…VܹƹæËŠ. ƒ–¯å·†”ó)ç&^žxÙè°°™7×Ç׋Xüñzf\&ˆHªJªÒVDq)Ì)˜ãü"‚O7ArMrÍß:ÕÕܼró »¡ÏßçZ1´,læÍõf½ÉÏ/¥ÿÑÇmÇmí$%&%ŠÀÔÕSWO/‰,øc:ä­Ë[ðÆþÆ®lþÇ8µÀ|â°™®7ëM>“ßÔ3õ#~Ò–§- ›7lN.tü§œbêÖÇ9Î8Ðz ¼%¼…¨&Õ€†6óæz³Þä3ùM=S?âGþ}¶g¾†ÎΘ¡G áã²q™QU¤Î©s(½MoÑ[Àè4:ŒŽØŽ¡&©t•úïúSý)­Æ°1Œãˆq„QFÂÂåé™úohæ÷Ü—ÜH€çáça`€\0Îçø@*KY ª[½P/,#4ÑD¨T•ªRœàD\þÇ8jˆtÒŒ“ÆI>XüQ½˜~ÄOÔXÙ¯°óÈÎ#&›1Ï<õ£º¯îGÞàåî—»_î†3—Î\:s ZƶŒmkùètwº;ÝàKñ¥øR uAë‚Öq;ÚO (Þëoõ·ñz¦~ÄOÔXë¨|Wù.V¾]½Ð釙‘Áƒ3g@ÎÌœ™93a}Éú’õ%³'gOΨȭȭḙ̏™[3·Â²¢eEËŠÀ³Ï³Ï³š3š3š3,ƒÆ£‹G›üj»¥ñcq5ºç%²|ÕòUÑó­\–«rU’ÌÈÿÿ¿H—tI—ˆLž=yöäÙ"ykóÖæ­ ® ® ®ÉïÉïÉïyxñáŇEÆ/_,ò¤îIÝ“:‰=TkÏ´g&¿VnéGü$ˆØóìyd‰8:šY7(‰[Ü’fô4=MOqºœ.§Kdîã¹ç>9]zºôt©HY[Y[Y›H.¹ä"’]Ÿ]Ÿ]/â¾ç¾ç¾'²cÚŽi;¦‰È<™'óDìlý¶~±ôÄQ稓4û,û,²\®FU} ûZ[îÖ+õJ ×TÕTÕTAVWVWV—_R°¤`Ifffƒ§ÙÓìi†£ûî?ºþ€?àÃkx /ÐC7ÝÀu]]k’˜~ÄÏG¿1¾ ÏÏ'Äo<àUî­öV{«Áy×y×yŠÛ‹Û‹ÛÁ7èô Bâ˜Ä1‰c`ÑÙEg×-×-×-¸Öp­áZCÜ‹WŒ¬Yóñoì“]ÉÊêJ•¨U" x¼^0|†ÏðA¨2Tª„þòþòþrèµ÷Ú{íл·woï^jããVsò³~A¿ðÉ®üŸ96›cÇŒc|àNq Œ€1` ĵ¿Gy”TPU0îd†ŽÎªÕÛÆ6c¢à£sL‹MZ‰L^‘ÎοˆÜÞê~1Œ&£É‘#v­V«]êm»l»$Ýt‹¦ iïµ÷"òJ^Ëk&‘NºˆL— É‘™ ­K¹•[Âò­ É8D·gÚ3u¿86%oJväˆT‡ªCgWG|¼÷9ÿW~¶·‹Ïö>öyÞ`ÿ2Ìk Š#IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-15.7.png 644 233 144 2747 13755454066 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜœIDATHÇÍ–_LTWÇÔaZœbJ.Òaч®Fm*ÉÊ&¥©‘!­Vâ®›˜ºŽ·6)ú@jûP’Zw·ÙÄ¡ø' TV"EKh¶uwuaÿð`H¬K„ÍØÄ2e¬ŒSØíÌœ{>û0sçN»oûäy¹÷w~¿ß÷û»¿sÎ÷)H?rŠsŠs\);gŸ=Ÿ·-oÛêî”}Rñªñê—ïÀS­Oµ,;»ì¬9nۖߊÏαñ³ù¬y){ÂÑëè5*Óö{P_V_–÷LÊþÃ08ûœ}óIðö{û>ýøÓù-„¯…¯<¬|X ¶mù­x+ßÂËÆ—÷~Ä/‹?_ü¹ñ8–8–ˆ€{«{kéÁTÀ¿J¡®¦®àëܯsu¨Y Ÿ|] ĈaH–mùÓñV¾…gá[|ªÂ _Wv½²Ëy&•0þ'8¼êð*‹/ѼÏûäC2–Œ¨Ýj7߃ÖÃ`ۖߊ·ò-< ßâ³øSõØKiŠˆ|ø2jGrG2SЈéL<›xtPmPH¤ZVoª7A­SkÕZP{ÔµøTd:ˆþ‹žÓsh•__ABý*Ñžh‡d<…¯¹}åö•V¾l/唈ÈsÇÁyÏy/¶ˆ?O–L–€ú;Õ\67šYÈ0Ýc’IàxÄÿ1t©.ÍàUÃÄÈÄ€3æŒÅ¥ {îxºc'Ì5x¼ ß07X0í‹ÛŸn}»íöñÛÇmøK¡K¡K!h«k«k«ƒÓ£§GOB¤>R©·ã‚ëƒëƒë¡õç­Ï·>í:ôù':ÍN¾\˜òNyÍ ðÆo|æXªžyADdógRP¬ Š˜""blÚ}mWî‰{“Þo½ßŠ1{v¶k¶KD7êFÝ(²pÿàþA¡¿Ð_(2bŒ#†È\ó\ó\³dÆýÀýÀý€HwQwiw©Èg“ý_ô!Ưÿýzî빿­­06‰T5V5Šèpº~ïªvUë^˜¾0}â«)£ .ü¬;Ú…âšâêâj:2td茻ÇÝãn0ÖëŒuPs°æ`ÍAèœïœïœ·;e5šGAÝR·Ô-{þ\ѹ•çVÂŽóÛl?µÂ¡ðŠð  Åõ’ë%Ý+°lé²¥æ?¹i´ƒ>Ÿ9ö”O•O•Oÿ®ÿ®ÿ.ÜÙygç°·moÛÞ6èéèéèé·Çíq{ g_Ͼž}Y„8 z1z1zJB%¡’ücm 0PhËŒÙÿÍGß|V=BÒuÅuE÷ò×P$=ñíºI6²˜˜˜†Å7Šoá™C3‡fì¸r]®Ë5øü>¿Ï‘®HW¤ËöŸÈ?‘"¶¬ßR¶¥,«³ÁôËÝð“á'¸ËïòëÞYÛÛ:6*ß_¾,blá7é-_zÍ5èÑ>íÓ>ÏãóøD®:®:®:D : : :E< O“©=V{¬ö˜H…¿Â_á™ošošo¹Þt½éz“HíšÚ¢Ú¢ÌŒóÓ4Ÿ{(8‘%±m±mc£ö©L4474÷­S©ÔDÿý$ú :þ»xK¼ÅþÒĩĩÄ)˜Í›Í›ÍK‰€.½\/×Ë!ÒiŒ4‚ê BtutUt,ümaba æ[æ[À@šO5¼Ýð¶¥g'bé8gœ3±E0ñÝÄwþjæÍ3æ[ÇôuÐÐUºJWe©Ó½F¯Š(¢(k/ü‡(Ñ,û€º©nþ@ÇÔ„p†áÿÑ1tZyõk¹¯åfú2‚#9•œNªµ`+?Çh¡ô ¾¢¯}ôÑ<ä@ßÑcz ÒEi~¢ÞUï’ ImV›³ð“ß•ÿñýW>¶·‹Çö>öxÞ`ÿ œ"r´‘ˆ IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.0.png 644 233 144 3063 13755454067 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜèIDATHÇÍ–ÿOÔ÷Ç_w(põä, Âb»åWËþYÅDµRj-…RêAu©û¢¡Y¢]ÂÒY ±gF¶%g”mÃæØCIõŒxMXÄ3¡wXró<¼Ÿ÷c?Ü}ü°þ~~¹<__žÏ×}ÞŸ÷óý‘ôį€ÕiuZÓâØºÛŒ§nIÝò³Sqܳ–W,¯Üø8<ÀªÏW}®ß2±‘7ê—ö‹˜üKõŒ¸¤‹H9›rÖR‘ÀÀk…¯¦þ$Ž?Û€mà¡î/Ý_œë=×Ëoàþåû—T<¨y£Þè7ø–òË?Òå_-ÿÊ2 )É)É"»9wsþ{ñ>To«Þ0“4“¤¬°ø=`Ç®*€0aŒ'¸ùD½Ñoðü†ž¡ŸG`MùšrØþúö×mŸÅnõA[v[¶¡:èÀZX ,Ö-Ö±jD`Á&6òF½Ñoðü†ž¡ŸÇ\ʈHçKP3W3ê§±1íV,+–úpÌóKLªÔ[ê õh×´ mô»ú]ý.,yw÷¹ÿ)µYkÔ‰iwc+b+@í‰óCM¸& ÌúÆRþEDäçGÀ¶…ÃËThjlj h`+¨RUJ„¿1Ì0(Q¢$¾PÆÿ ‹.º€rÈYÏ'Ÿ| ˈ«—ÕËD(Hðÿ"¡—Ðç_ñyo¬gT 6[š-›þËÛÙ7oÞ¼ Ýk»Ó»ÓQã¾q߸ÏÔó×úkýµÐÙÕÙÕÙã-ã-ã-f^÷ê^Ýkâ;‡îºsŽfµµ¢¦o}÷ñw›zê‡æ²æ2ci{FE/™h…óŸžÿnü5ðaàCÕäŒ<Ûól åo•×–×BÞ\Þ\Þ\h¹Ðr¡*Ë*Ë*Ë ÊYå¬r†ú õêáúÌõ™ë3æ@³îY÷¬Š Š Š  h°è\Ñ9Xw)ÿÍü7Yø>]›Ö¦Uôì?êWñydñúŠîÝê,D" pÞöõê¯WCÛ¾Ö’ÖS`“w“w“ʶ”m)Û®!×kš'›'›'¡}°}°}f«g«g«Í¾ã§ŽŸ:~ 6îØ¸cã3^2W|±ø"+üâÅ/^x|ðñAX\ùÌÄ3ê¬5© ùýä÷q±?ÒiÙþhkhkHB»çvgìÎqù]~—_$Ë“åÉòˆÔ·×·×·‹DEE‰¬?±þÄú"gÂgÂgÂ"WÔuEÉ“'Z-ЉØûì}ö>3žÖŸ6™6)ý&Z-”HrUr•ˆü7©"©—Uyµ­Áâ³^~xùa‘œòLyd͆¡z^èÙYº³dg‰ˆwØ;ìÉÌÍÌÍ̱9l›Cd¯g¯g¯GÄ1êuŒŠø×ú×ú׊!BDÄ™áÌpfˆööö‰¬ V‰„ca_Ø'².²îȺ#²F$òmä[ùúD}bñ‰¶ÚøÆ]ƒ.8ñç¶6Õd½,"ÂBiviFi¤H;vúwõïêß{®î¹ºç*¤L¤L¤L@ÝtÝtÝ4Ü.½]z»\']']'á^ö½ì{Ùàîpw¸;ÀžnO¶'Ãþß¶®j]ÅBÂMšàôs§ŸÞK|c|ßðîþw÷CT‹ï’Ù..A )ÈAv¶¶A´-ÚmŽqŒcÌ æó@ÏÔ3õLP•ªRUB°7Øì½QoÔA ª‹ê"„†C×B×PúlìùØóæ®$ÔòvËÛ€žØ•ñíiú¾’ð™Ç*[eyi ÐÃzX7"”S9•Ô¼šWóK|ÌÍ;¼zH¥ªTåP"ê ~÷ÔôÔ4€-d …—áÿ?3N€Î—ø}MkM+¨¾¸3«oí‹vP§µymžbŒ1WaÔßÕz饸<åS“jî¯ø‡¾R_ILý[{¨= çuÙ«Ë€Ç?vþ§÷¬|joOí}ìé¼Áþ¥NæÓäW IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-115.png 644 233 144 2573 13755454065 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü0IDATHÇÍ–íK•wǯcGO2=R¤Üì¡hj,ˆôjÂFÑÙÐ2jº¡ëÆ zxåzQ°flDÙN&¶X©DZÍ& qô -76¢fVVFæ)Wáô”ÎsŸûþ}ö✟÷)ÿ®77×Ó÷û½¿ë¾DD$3ñHÉIÉI™÷S¾tâÓ—O_þÎé¸_cëS×§‡2øŽùŽÙ½Ž¯óº>¹_ÄÁOæÓqÉ'à9ã9ã*Hø»aõ¢Õ‹¦ÏŽû߇ÀÛìm~ƒõçןh:Ñt‚¯àq×ã.€á‚áp|×õº_ã%ãËî×øE õbêE×ð¤yÒDÀøØøøí¯ãw߆B¡àÑ´GÓT XOÌP@„Úž%ù:Ÿ¨×ýOãk>Í×#0ëÃYŠÀ'k>Yãý)ÞÐû3ìÈÞ‘­ùÌfà[¾eÄ"±€µÎZǨ àÂޝóº^÷k<¯ù4\¼:Û>B§§1³¬kìæs ¦úS©1¯™íµ½¶Ô}uOÝ‹‡°ÁÚa5Z(+/Z-Æ´>7W˜+€¿È,2üÎ(ED$æðDÜЗٗ ´°Ò ™†i0F x¤äç8VÈ Y! •VZ“òýôÓŒ2Êhò+¨·Ô[Œ%œ•p§óN'€7âDÜZOBXÍo°qׯ]À0€½Xí1wš;´ºõueuep}þõù×ç3ÅêÒêÒêÒàFàFàFÀ‰Ÿ Ÿ Ÿ C 0°<°j»kkQÏ{†®]<ïÅÌÛP»¡V¶æ·„°¿¶óu}i}餎òXÕDîD.k»××_¿4~iÜ!.©*©*©rò——\^ry Ø›ìMö&È:™u2ë$–––C饥pÿû¾E}‹˜Ð|jÛéŠÓZØ_Ûf¶ÏlWgø1|5|Õ!Œæþ7úß(4¼×°°a!•F¥Q ­¹­¹­¹NÝ©9§æœš9þŽ:*;*;*¡×è5z på¹ò\yàßêßêß Çÿ9þäø“¤£~?ñü=l‡mÐz|é¾tû&<|6ü¿öªÞ>`pú—•-+[VM-M-M-SG¹tpéàÒAh»Ýv»í6ô¬êYÕ³ Êåò4m<ÚxŒ|#ßȇÆm Ÿ5|欫g¨m¨ ´žûû×M±bþ˜_D\""2K>ŸødÒLŸé3}"Ò.íÒ.S,–ËŽe‹¸2\® ‘Ý/º_t‹øŠ|E¾"‘’Š’Š’ ‘¹sÎ}(2¾5|k²}–3Ÿ›ÏE´ž‘HA¤àÚïâîu„Dd\D„ ×R•¥²$ª;ÓûÓûÓûERÝ©îT÷Taé]é]é]"ªZU«j‘üêüêüj‘ 'è zD|a_ØY0¸àî‚»"_,+›]6[ãS1­»soç^‘I=Sne4qKb7c7[9²仑ï Œ£Á©£Ù?²d?D÷E÷E÷9qóˆyÄ<O<5ž`²›ífX~ËÜKðiþWoåƒà}ì}qÃëŽ5‰»ìR»trïLè»ôнä%/“¶ÕuE]µBè€z7¶'¶‡1æiü¾¼¾<`ÜÛïퟲǒ6?Åžb`Cbó_³®k³µ“::霺ùñàÁÔp˜ÃIñ*.p¥‚–a˜Ô[›­Í“çÙ‰Uì.vë“zeó¿±ßÊ7öïâý{3ÿ`ÿy\ ®…òIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-29.7.png 644 233 144 3017 13755454067 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÄIDATHÇÍ–ýOTWÇ` ŒL±¤Ðe·Å›L•JÈúÃT‹R‚åŦ«d[Å2ën¶¢ý·‰%©hjj E ö´»›`c VSt­  Zq€¬ƒ¡8cµÊȼÝóÙf®wºîàùåÞïóœçù~sî9ß{DDä™ðS :#:#:1„£·ñøòøòå áÎ DUGU_ÿ+,m_ÚôyÒçšÝÀz^ŸY/bôäÓãòŒ¸Þ¸Þ¨õaü¼–ÿZ~|JpL'M'°ãÔŽS'¾<ñ%×w®ï~ZÿÓz0°ž×çëõz¿ÈþòÞÿð‹ÀSýOõGÝ‚¸Ø¸XÈ*Í*ÍùShÂr ê•ªWfbfbT4Ý€³ZÌ3>îF`=ž¯×ëýôþ:ŸÎÒ#üròË"ðê믾nú,T`ÿ ö¤ïI×ùü'÷y3æóÁ­Á­xA]Pˆ" ¬çõùz½ÞOï¯óéü!=Ƨ¼'"r¸jï×Þ• ࿸áÎÿhC~‡ß?¬Ti÷µµ!p/à¸AmWÛÕvjP-ªET0Æ—êKÅÜâ?æ?_¨¿ú}¥Æ¢ <\b|ÊoDD^øLó¦ùù_©{“—&/ T*ÀÃ7œçÓÀ³Ïž?7½Ôô’A`M°&X ¿8¿8¿65njÜÔhäW/®^\½iiiFÜWê+õ•¸gY¥Çµ_רjlKët¥ºR–ÄâÄbÕ+’LI&í†ÚëÞâÞbû‰­ãeãe7“7“7¬¬¬060606ö{*öUì«Ø±kcׯ®…îæîæîæˆuHR‡`îøÜñ¹ãíÌvf;៿½˜|1ÙàÓNÍ~<û1@ÒÓIOk7Dû‡y§y§ê…·܆ïN´M´Á’_Ç;âв¤ÅÔb­P+Ô a¸¸¸êrërër¡kºkºk,9–Kœi=Óz¦\õ®zW½!ð¨ù¨ù¨Ö­Z—¿.߈kŽðË„+Á•øÏ&žU½Ñj×B÷B÷è°ÈPùP¹È¿3í?ØàMïIïrïrñÞzºætHJeJeJ¥ÈHÆHÆH†UTQ%²?uêþT‘mÕÛª·U‹¬ñ­ñ­ñ‰X'¬Ö ‘…©…©…)‘Ë»/ï¾¼[¤òùÊe•ËD>~#"›’5ètˆHì|ù|ùè°ðAèÀ[ï¼õ,B§rö_ÎsÎsàŒqf:3QÎç™ÎLðÚ¼6¯ ü}þ>Ü™¼3yg8À€vK»¥Ý‚»Íw›ï6ƒº©nª›0·|.}.<ç=“žIhokoçB|w6ïlÖý¬ó¢è¾aøˆî+aŸYTi*í‘ï@ )¤€Ú¨6ª{)Ke©, ‘F"~~æçl ‡~ácÁÉ €Éer=æcúàp -µMµM ¾ ;ópÐ4ƒú{àAà~>aˆ!ŸÐA¨ jP ׸Æ5ÀÍ,³ n¨Q5 Ì…t“|7ø.~v ƒ…T_"PSóÿœÿÉýW>±·‹'ö>ödÞ`ÿ ¶×6œ\Kü=IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-150.png 644 233 144 2756 13755454065 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü£IDATHÇÍ–íOTWÇ—‡'A˜!±GÙð°<$¤jL|¤8n'’ºd%&+m£¡áÅF¦ØÔn¶kÙXÈvw[IcMðaµ6úÆ X¡˜Ø5q#Ú!Bœf†8²X™¹÷žÏ¾˜¹3ÓuÿÏ››ßÓ÷û=÷œó;G@DDœñ¯@ZaZaZvÌN{'é_áYáùÕÙ˜}Úm‡¶ã_G §7§Àõ¥ëKs"i[q+?µ^$‰ŸÊgùÅ)I‡}Ð>¨ÕÆí ¹ª¹jŪ˜}b——ux÷ò»—.ž¹x†÷ 8x^û¼’¶·ò­z /_>ú~Èü.ó;mì6»MÜõîú¢ŽXÂd4x¼?§ÿœ®ÒÀYd©Z Lk5>e‰²>øJ|%À Ç”c*œaé‰ ;} ö~°÷à9€Y­þ==˜€Sµ}ÁÀý¾û}÷û’<Ð×Ð×Ð×ý‡û÷†ðõðõðu˜ê˜ê˜ê€Þõ½¯õ¾Ó¦ç¦çP `_Œ/Á×öã~:¾ÙýÍîDz›Þµ\¾\Îò®ñ]C»†’ ~cà 76€¹ÏÜgîƒÜÜÜØ^¹½r{%´ílÛÙ¶îxïxïxa‹¶EÛ¢AU~U~U>_+¾!op68˲ŧnž½|ö²%ìÇýÙ7³oªAN~üü‘òó/æáܯϕ+ƒBo¡·Ð ÃÃÃ0ážpO¸A«Ð*´ ðŒyÆáPCjH _3À@Ê ®0É$JýÓ¨6ª‰òØM‘èüFSfSæÿíü¯ì]ùʾ.^Ù÷Ø«ù‚ý/K Ãì]"†”IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-84-red.png 644 233 144 4211 13755454064 15604 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü>IDATXíWmLTW~Ͻwøv„d+Ê`uq­C6~$+ $Ž$šK+¶·tmº"‚µÕ„®H¥lÕ¤v\²4m ;ƒ6!ÖDË‚­&F­Ú¸ #3€˜RæÞ¹Ïþ`Î;Ó¬f³ûþ÷¼Ïsßóœs2D³6—BLXi´GÚÙ“ÀBlD[D[D[ÎI‘I¹ý7ZE«h0VkI"‰$ZËóy=ïÇû‡â ëCùèùí¡=´G°…Æç½ µImR›í1+ce¬L#bLOOÇù­÷¶ÞÛzØö`Ûƒm€üŒüŒüŒ Ïã<Ÿ×ó~¼?Ç{:~ê/n&„ a¢oŸPRqRqR±RÞx¥ñJã5ÆýÈýÈý€"<˜Ä$&ô¡}€æâ<Ÿ×ó~¼(Þ↧ó#Sœ0( ƒ}xƒŒË—3.Ëk>‡ÏáƒSSÕT5²R©T*•€’®¤+é€bQ,ŠEçâ<Ÿ×ó~¼¿F8ß§Qc6fc6"éˆtD:Ò|‡˜kÍš?”-±wÔOÔOà–›gZfZµÏ×åë0£\S®Žã8?¯€>3˜Â ö©PÈÍÞZo- ¾ãöGÃÍ“Íµæƒæƒ²…ãs>œ †M¿ã ¦jSµ©ZMqŽ8œ ôq+ù~öý èA„Ð>e¿ºðÞÂ/Í­¾¤¾ø?ÊG~Ñ/£ÎçˆscŸóÑøI»¥ÝÒîëGxàdÑÉ¢“Eê <²ÍwÏwOèíNíN€¦MM›àBë…V¿—¿¡ö~ÿyÿy}}gOgtwww²-¤ÆÃñµÉ†ð#Õ•°2aeÂJÔ>Îyœó8ð!#™sûœö9 žO@Üö¸íÀì=ùiùizLER$½ßy»ó¶.ßÝ0Ö0hý¡Ž«ã9>çÃùq¢ÙrtËÑ-Gƒ_¦8f¶ÏlàâK¹™¹™°¶lm™žÀ¥ìKÙz·^¿õº>~ß}ß ‹Šéó?kü,Ø_q̘gÌA|·óGêC¶!Û­±H*¡»t—ˆ~Í—r¯æ^%"ê1ö‰ˆ¾Èû"ˆÈªX"¢ôÉôI"¢ÅîÅnýMòrãËDDKn,¹AD55DDäùÉóEÒ¾¤nêâZ ­†VíÈóûU-\S·¦nMz§Ù4›fÎ(mJTüo½Íoóë'’––†× ¯@ÎÜœ¹úI–:Jy+ó¸œ.'„¼Ö­/¸Øø4_­¯*¯ÎˆÏˆÏˆG/çG‚E°ßp`¡öó=M'šNè$å¹ê¹ sïϽÀ{¨òP¥žP¿«ßlÛ¼ÿÁû88);Sv€Åaqi-€äeÉËåô©ÔS©A¼ëxÒñD{w±4–ÆÒ|Ãa#läPS`ξ©ê©êñÿ¦¯ ÿJÿЧcÖǬ§ lŒ¼y‡ˆ"‡?þ˜ˆÀ·e£ "v »ˆˆâ7Åo""Ú_»¿–ˆ(—r‰ˆè¹ÒçJ‰È'•ÎQ^RCR‘Xð¼éyÍL‘§ÆQÌžÑ2k™U]hþWaX†? ØìØìØl"é’tIºÔ2¨]øùYof½©ìåŸê¯8³íÌ6xa“ÅdVÏêõRع9¦=ÓüÒÜ““Æfóý§Þnx;¸ÕÅ7w|»ã[¿‡ã‹%b‰Xò¯‚Y?šŸznIŸÒ i†´¾&^PQY~ ü€º7”ã{ßë}*ðÕò¯–pwØ;ì —ËåzfòMù&¯Ò¡t€¡DJÑéy§ç@w7<Ÿøºþëzl֞СF¨™ÎaóÙ|6ycAñ–v¾v°BV¸ÑÊZ˜Ù¹Vü²wÚJl%°kÚÝë_á_¡ãåU/ª ±Î Ó˜Ô êêÁù¶ Z­@rTòœä9ònm’Ub•XUaÖ¨YÈBÉäšI™”)U‘ld#]â8Tþö´ZM»L»d£ó]‡×á ª´§µõ:‚Œa €hÔµYm†@%*í7^™xeBÙ«½@“’SrÚ'–&–&– fÁ,˜Ùé»"NsNàoØ+öнì\ʾ”})ûˆ ņbC±ý°¦ÝLs¦9S¯]…¿^Øa‡À(F1´²TYª, ηnuÝêºÕêÞÏ`4 ÆÁéYßE!ÆÚöžX˜û]¨oŠšÕ®ótP»••:íe£l òù‡üCÁk§ ]èìÑ]Ñ]Ñ]êVM“±B¬ûêŸÃ¤øi¿Hzú‚X§Óî¶cãVÖÂZX‹^»öN{gP»r§Ü)w•;•8•8•¬_1¾b\ù­¦ÅV±Ulýd—Z@záEϰ`oÔ®Kté´{ÌtÌtL6:[œ-Î^xáÅ8gZq®â\Źàµ#Y%«dí ü$‰¾†X§˜g 7^ðj@»gÿ“v³ò²ò²ò‚Úµ¯³¯³¯Ã—³qUÛ VÈ YáÆƒ¡0Âh.£ÿÒž¥ÝõbX#Öô¥sÂ…Õ…Õ…ÕêñÔ™Ô™Ôù®¶Õ.Ñ%º*’¨™š©™׎è ˤÿѵ{8ÔϺÏv²l'@¹”K¹þeÂa°`ĈÑÅï’=Éžd‘x]¼.^gÿ„íÜÿÍŒÚÙ”MÙÒÐð»E‚*¨‚ °vÖÎÚ.œ]_bÛGXßgnõ¿LyMÃŒ±IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.6.png 644 233 144 2552 13755454066 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–íKTyÇÏL5£6>R/¶U*—…(vsi_ä £q…1i’*Ѭl_m,=²¬ !¤ô„°T$‘kQ¬D²½q7Q«ÙIm³,ÒqÊ]gϾ˜¹ÞÛÃÐïÍåœß9ßï—ßïœs""’•ü 8óœyÎŒ„í¬²ü)Å)Å_\LØM:8Êå}?Afcf#@ö…ì ÆCË6÷Íx{¾ˆ…oç3ý’%–Ã}Õ}Õ±&i…ŠåËS&ì_îAjkjë[ ª¯W_¸Ör­…Z½?z`bÍİlsߌ7óM<;¾}_æý6ï7Ç0¸]n—,^¿x}þ÷‰€P>øJ}¥#sFæ('èã€ZD‰b®°Í6÷“ñf¾‰gâ›|&BÀ‚¢E"°qËÆ-©ç …¹rM¾x+p‚x@‹jQ}»¾P÷Ô=8À²Í}3ÞÌ7ñL|“ÏäOè‘wï¶~Êïò»€8@üЇõa0†´"­ˆ¸ö>_ŸRË•Wy±ÖcŒY¦ªV;ÔÐþÒbZ e<ÓÖi눃>ª3I|åwûݦÀúu¶«ñž‚ÔÑÔÑè\¦ƒÑ u5ß)Mߪoešã´ÒjÒFm@€›ßƒ¨§ê©zjó7p‡;À—úqý8Ó&>ÿßßÀ,RORXS'Ôª9‰ú0¾R“ñgñgÖô>í öádáÉ“…|||iñ>Ãgø,ûIí“Ú'µP¶þlýYè®éÞÙ½ÓÂSz|2> L$øfù“z’Âz~€K‘K0Te`¦k¨«¿«²²² ¼±¼±¼òBy¡¼„úCý¡~KÐxÍxÍx ¬ö®ö®ö‚¯ÎW竃•••èý¬7³7s6|ÆøÛäKð›zœ"w3î~ý­HÑÚ¢µ"ò§ˆˆã|ò¦ÝSµS¦ˆìkß×¾¯]¤ª²ª²ªR$g(g(gH$Úí‰öÈ캵âÖŠ[+DÓÓÓErݹî\·HqYqYq™H®'waîÂÙp·c‘É—ä7õ@vzvº1áçáç¶¶ŸkLÖIDGGCɆ’ %À[è-ôƒÀƒÀ[‹‹‹Á’UKV-Y§«OWŸ®†ü+ùWò¯@›³ÍÙæ´•Àçæ˜1ùzœ"Æ ã†c@D+ÓÊD ¿ˆˆ,Í™íÌ9õÍ©‚S"Z…V¡‰Ü¼}óöÍÛ",e)KE:wwîîÜmXÚž´=i{D<žO‡ÈÞ3{Ïì=#’Ñ—Ñ—Ñ'2¨ ÆãV<ùI¾$ÿ¬ž÷kLy·Æ^t¼h{Ñ¥¥¥Ó”Ó”ÓÛ\Û\Û\ð(ð(ð(ËF–,‘ÐHh$»šw5ïj†´XZ,-›ƒ›ƒ›ƒ05'‹Äbˆ¥>^cv%É.¹¥]Õ®Z]û9v,v ^½{5Æ~c¿±T¥ªT•® ×…ëÀè6ºnP—ÕeuÂÃÃA¯ÓèG,<j]Z—ïã]i›coƒ‘`Ä6Ç~×鋘VT—ê²jC¹”K¹@«q5n›W~üøÁˆQ#j‹ÏS%ªÔ´¾Ißd›cÿšsó£sÌ6ùñ§øSmvòèÀúcý1qÕ®†Õ0Š‹´ÐLòš× Ô€^2Ê(p‡vÚAuª° £hÖãzœ8èýz¿?É÷áäÿdÿ•Ÿìëâ“}}š/Øÿ JÈ™ËIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-26-grey.png 644 233 144 6315 13755454063 16002 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ‚IDATXÃ…—kP×¶Çÿ»»™†‡#(5Æ0gx©X¹  /!h*êÉhT’Q#Þ„‹çJAb‚Æ€¡J4ñA@ÑDB8(¢@“9ʉ†”ÈkÄ‹„ÂÌa`¦»÷ýà´ž²*•õe×Ú½{­ß^kíÝ«Ifffff&Tx,ãfwŸ»Ïݧ5™_e~•ùõÎÊÊZ1—N§Óéô¼ÿâ}xÞgáö©Ê©Ê©Jš‹b£˜d ЉNtØŽíØNså«å«å«I÷{È=l)&cdŒŒ½2kVÖ¬¬Yõwsô9ú=äýx?Þ$<æpp©˜'€‹±‹™21[̳Ål›ÅfñZ”]•]•]UÖk´ Úëþ5ñÂÄ /,|×åˆË—#¸¶0vaìÂX’êêê,òXä±Èté¹´^z_²÷ľßä_â‘ø8G#¨;u§îb"ÙF¶‘m~GX?Öõ»~ÊòµåkË×Ï{xÖyÖyÖ é±±±Œ}~Ûü¶ùmd•77·éÒOé§ô[¢¶ Û„m1GhM¢I÷ ˜²wrïäÞIMhB“Ú«ä*¹Ê¦³6«Íj³>¿Ró¢æEÍ‹übÝÝÝ®LeR™T&h030<õ§þԺЅ.®p…+3Ì0@ÒMºI7xŒ`#àÆÝÇÝÇÝÑsáø…ãŽó‰===\³ÌYæ,sþßj~5¿š_½|–c9–÷ÿã|Ûù¶ómÀÉÛÉÛÉû“LTOTOT?¿R£Óè4:~U’>IŸ¤çšUÞ*o•7fB£ÐˆëÅõâzpPB %@‘Cä@zI/éÈ(%£‰"Q$ ÓÅt1œ ‚˜vkÚ­i·0C²¯Y«Y«Y˯’üK<Ûy3oNXd»l»l»¬ÿO§ÎSGµº]‰®„“jÄ$Æ‹ñb<ÜÙ`6˜ ˜Ï™Ï™ÏÒ@H€ZÔ¢ÀœÁ°´ -³‡ÙÃìØIv’è¯ôWú+Ü%ûºëºëºë\™çÏ5žk¨Vâ‘øHi྿Ú#í‘öH ª%ª%ª±ª2U™ª 2q­¸V\ wæsŒ9 W W W-M-M-M@G_G_GÀòƒüà¿ÕæYœÅY`róäæÉÍ@«ºUݪ:Ü;Ü;ÜÚ@h@OÐôÜUùª|U>dQ­Q­Q­ˆ•x$>†×òZ^ûŸoM™>2}¹!Q!Q!Q¤Èq(dÌ%æs ¸—z/õ^*p|×ñ]Çwßö}Û÷mPšWšWšœÞszÏé=€°[Ø-ìÌAæ sptÑÑEGç‹Î/J,%– p&ðLà™@›° › ‰,d8d8d˜I<vwwÅܲ%eKÊ–PI,ˆ@žè´À­À­ÀÒa'ÂN„=½6zmô¥ï®}wí»kéãŒRJ¯v^í¼ÚIiþìüÙù³Ÿ®kkk¦47<7<7œÒž ž ž ú¬X$‰ÁÇø“@¦œ)gÊŸìLl°=Ñd²Ùå]Ë»–w=¯ˆWÄ+€âœâœâ`Óþ¦ýM`àþÀýû€gggpNNNÔ(j5 1!1!1ðk÷k÷kıF¬yêŸyyyÀ œÀ Ȱ>¬ëCÏ™ÂLa¦0ÜãßáßáßËt2L'(’‘Œd Úm¶Ÿ|ð p3ôfèÍP `fÁÌ‚™€6]›®M4s4s4s€¡÷†ÞzèoéoéoèVº•nÆëÇëÇë/F¾ùb­­­˜&Iu€²–Ÿ-?[~Æ=FÃh =GöùìóÙçc²zY½¬^Üé×z^ëy­‡d,4-4-4aÂñ¢Òh3ÚŒ6 ìJÙ•²+ÀÈñ‘ã#ÇEŒ"F,ݶtÛÒmI#i$ ÈŸ‘?#b ±„X€ø®ø®ø.`ªgªgªØïµßk¿°$aI ¢5¢5¢†õ†õ†õPž6Ÿ6Ÿ6#Y#‹‘ÅØsè ƒ.«˜Ëä2¹L’QzÔCÐ<ºñèÆ£PJ×GSÇÔ1€%Þo‰vÊvÊvÊ€ˆk×"®¶¶¶úЇ>Àw‡ï߀aÀ0`xZ*ÃÆaã°R„!PmTmTmÄ”«ê«ê«jq111 D Â))œW8¯p0Ô8Ô8ÔXÚgî2w™»^WÏž<[HK”%ÊeìáýÆýÆýFL‘äy¹Óf§ÍN›ûöí?Ö—­/[_Þп¡ChWjWjWŸ­ûlÝgëK±¥ØR p1\ ,è^н T§ÑitммŠR@ HÁw)l![ȦWR-ÕR-sìÂÐ…¡ C|òØÆ±c¡$¯’WÉ«0‰>¢èP7êFÝD ÿöIMCÒÑ]tÝŸÔ¢{uyuyu¹668686È•»Ê]å®ßä|ðiÀ§‡®# YÈ"gÑntó1R?ê‚^ô¢—¿‹8Ä!ŽTÎ=5÷ÔÜS‡×(ö*ö*ö~“cTF7~1òbäÅH!MrH>$’1E~"?‘Ÿ<>O„NÒI: Ê\f.3—!¿a¸a¸a Ñ·\o¹Þre»8»8»8÷OÚÊmå¶ò]îfÝͺ›P5P¦9Ì”H Ò5T.ºŠ®¢+¦Ý¸3pg°¥ÚRm©»¸Lw™î2ý~ygUgUg{¸f]ͺšu4𤒹X*–Š¥ p†3œj¤FjOxÂÃ:l6 ðMÝ‚ºu 0ÍeÐeÐeÃÄ01l׿ s9Ø?É3ÅL1{Ô±Íé@¤;~IäÕ‘"ö0êP‡:!,&‹Éâè59®_²'Û“íÉâß6‰›ÄM"³lþÁùçÄj±Cì; d‚˜ &S|ŸÁg@^à_à_à/ †††³]ŠŠŠ‡—P–²”Mo‹Ä"±ˆ;êÈìÿHËÉÉÉÉÉIŠ(OjÈQ»iŽÚ=JŽ#äÈw—™(&ЉJ¯D’Ä«²WÙ«ì|òøÉñ“ã'¡d†a¥HÔ[ë­õVq¢¿¨¿¨¿ˆíR| ø@ñÁÝkS¿Mý6õÛ‡ºâ»â»â FºO%@‰ï è3ÀÒ¥ÃÀ?‘ŠT¤’Ks+æVÌ­8¼Fñ–â-Å[ßäŒùŒùŒùpãç3ÏgžÏÒý´666œiºÝt»é6ITv(;”€¨5¢æo?p¹ÜFëRm¨6TÊÅŸÒ#·-o›Tí«Úçü9U0z ÚVµ­R|ÚMà§È=®ÇŒýÆ~æÀ ˜2ÈËWq•¯êžÂW|Š?¥G>ÜÛ3Û1k³k³@{Ƥ1 †©Ð ñ%”`š˜ 3ú{ýþŒ=ÆcÞÔ3¹Ä0 Œo6£ Óð&šMhÆrm»¶Ìo~V£3i~k+EDÖCwN:'ã™0îw¿Pa´­€Y~gŠ),ÓÑSâÿ¯™Ef³i§ž>xúÀwÆã™JOfJޱ͒Ùp¹á²K—ؚؚ˜¹™~B?a -9™õ<ë¹Ðý²{²{RdëÄÖ‰­"î°;ì‹ø†|C¾!gÔuFEÜ·Çíqä:r¹"‘G‘G‘G"¶Õ¶U¶U"K¿[*KEœ›.¯ïZß%w¾jØxxãas3ãõûê÷¹ôŒµÝÒ-Ç‚éŽ ·r¤¿¾¿~þ­õçŠçŠ™«û³îº?¬ ‡ƒÃ0R9R9R %y%y%yPá¨pT8ÀÞiï´wBÃñ†ã Ç¡\+×Ê5Øuz×é]§-œŸÂ—Ú/µ3§øŒ—ׯ¯«on¸U`Ù½e÷L¦N?´ž(~ÿöý[¸þåõu××AÁLÁLÁ Þ¼5xkñõæ÷æ÷æCM_M_MßâxÏž=7 ¦¯æjÍÕéç™iÿ´”\W®+ù^½xõ¸“:öfòlò¬U_ZUZUZžÏ€ÇZÝùºóu'ŽŽŽÁý£÷Þ?jÅ£ÕÑêh5NNNC°8X,¶âÉ«j̤ùÓz¬Žé‘‘Àoéæ>Kö&{-€-­[Z·´‚o¥o¥o¥µ~näÜȹ(k.k.k^Ü© ¡ ¡ !(k,k,k\ è¹Ñoôcj‹""¬ŽÙD➸'ô—dúþ€ˆ¼á`Æ×æ s…$Ò‡W\£®QרHVsVsV³Ì[ B"Þ:o·NYànànஈ÷ ÷ ÷à‚ÀÚ¤-i“„¦ø$ÛôEæõ¤ÿe÷áÐÉC'@r“úcý±uÆßœysêÍ)Ht$:Ö›ÇÊcå±r˜ φgË;kµÇÚavböÉì »ú€>i>ÅŸÖcÍ1œg$ž O§Æ<@$ë“õós`N¥¬…Zø”¥ò[è¢ >«°øJÏâÉO­½Ö$!=ùCF°-F ñãÇœ§u‘CÐFmŸ•K)¥˜´£Æ(a# h ¿ÖQëPú`ò¶ÿÊÏövñÙÞÇ>ÏìwY-ÇìíÙIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-25.3.png 644 233 144 3030 13755454067 15026 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÍIDATHÇÍ–ýO”WÇ//­Œ-›Ùí(µÚêØµJи&Ž‘2"‘@hšZãÒˆº›õ™¥ Ùde7&T\Ô ë"²Õ  fº`w³6*`} ȋܥ[§Q@À)“žyæ|ö‡™'3kÿï/ÏsÎ=çû=¹÷žï½ ”RJŇ¾ ¢—F/^´£÷‡ýqŽ8Ç Úµ:DåDåÜÿ-¼züÕã gÎö1oÄGæ+Æä3ü*^…óšæ5Em ÙeðÁÚÖÆý$hW\“ËäšõÃ'—?¹ ÐÜÐÜÀ¯àûßߘÚ6µ ¶1oÄù^$¾*{Ž_)x©í¥¶¨ü—罬Xß³¾—üë`ÀH2defe|ó]ŒD€>˜1Ë6ÀƒcLDØÆ|(ÞÈ7ð |ƒÏàÖ£ ÉždW ²?ÌþÐTLlççƒOs‡9Œü¿@ߣïÁrM®E„mcÞˆ7ò <ßà3øƒõ„·rR)¥*Ó ÷iîSŸh×ý}Z¢–‡šGó 1€è¥ºSw‚¾Z[ô<=OÏv’AÏ üKój^4ÿ´×´×@ÞâCîxî80mð[ù7¥”zë`ò˜<žX™¾>|ø;A¶È¼Tq‚ ½Ò+½”sÌ1a{ñâ¨È/~ñà0‡Ä.v¼ü5„_â ñ3¬'´bµ_Ë•‚¨‚(.°îÁ’þþþ~¨úgÕåªËÈÝš»5wk€QF…æ#ÍGšÀIûIûI;œî9Ýsº&oNÞœ¼ù££w¬w¬w Žþü蚣káǃ ƒ a>ùGA\Aœ±µµ_«À¥”ºS -§ZNÁýw¹»\ö-õ.®]\‹Ï~À¾ß¾’$/H^mÝmÝmݰ̳̳Ì™¾L_¦öÞÚ{kï-Y>²|dy¸ î­Ý[»·B|U|U|äÏù<çsX:°ø³ÅŸáýÓÔ§SŸÊ>pźb!à Ö£ô{¯T¿R-Màõy}ÐbjOlOçâ”â”0Aê¹Ôs©ç`wÍîšÝ5`é³ôYúÀÑâhq´@ýlýlýìWªc¤c¤cJ³K³K³¡}¶ý‡öàg®wœï8¡7m(k( `úêôUtšKÍ¥Ò¤ð'˜LùÍøGã…ÛþÁž¡ô¡t°Yl›v9v9v9 ÃÚaí°B‘­ÈVdƒóçÏ7‚ÕfµYmpáà…ƒFœ± © ˜94shæd¤g¤g¤Ã[[V­\µî g g1³³¸¿ðÛ…ßT༹Ð\(M0ýhúô•?¨yPó-qãBÙղβÎ:y ÕÕêjuAɳ’g%ÏÂl”²Q :¡:¡:!ì/7—›ËÍà8æ8æ8ö¯<ðfÊ›)pzUý»õïÌíœÛ ~}þWó¿’&åO4ÎØ•5WÖÀŸ¿p9]NÙ}C)¥ð¥ÄnÐ6h”—”—”•u•u•u°=°=°=æ4sš9 ò}ù¾|ŒöŒöŒöÀºõëÖ¯[]…]…]…°yÓæM›7Á¢_.úxÑÇëϮˮÃ7 û )µ)¤1tƨv••ÀýÁ.yÒåîtw‚;ÆýºûuÄâ^ë^ >»Ï^¤éEðäÒ“KO.$K²$ƒXÄ"˜ÈŸÈŸÈ¹(å"h«µÕÚjxì~<ðxÑΘ;îJ ­…Öˆ® þ„u ] é̬XÄV&¹-·å6ÈÙ!;"ÎÒ Y!+€xâ‰ð·I«´‚œ•i,ÉÂ+±A|™¾3|À4cšñÄò÷ÿÓ1ã¨Lã÷¹Å¹Å Ae–ݬ›A¾ðOû§Ñ8E] œá ÈùR¾\¸pS<å)H¿Ü“{oO~§£ƒ&íþGþGÀCùßy?ð=¯ü/î]ù¾.^Ø÷Ø‹ù‚ýïGT ¶±¥„IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-65-grey.png 644 233 144 6272 13755454064 16010 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü oIDATXÃ…—{PS׾ǿkí¼ÑVÒËXHyhkK…(W9ãµgl±´(Zê*½öàÀ€ÐÚÚ+õQLj[j}KÎ¥r)µxŽ2V½ŒòØ8*±* HvÖº`§3þþY³ö^û÷ûìßúîßúmR^^^^^ ÆÍ1>З$·%·%·¹©üëò¯Ë¿æ•*T>Xòá!<äÓ·E­¨µsóÇêÇêÇêùÂ!"%ˆG<ât¡ ]ò‘|¾Cž%Ï’g‘I¿¤_Òõ±;±ÿ½¦bjÅÔŠ©çoVåTåTå›-F‹ÑdÙ8»èçÒÐ À¤ …g•¬’U²‹—Çåq=•XÙPÙPÙpÜê±yl›ù_#sFæŒÌ™ûŸA{‚öíAãÜŒ¹s3HI’4Iš$CCCÀð|Àß„¼@üO€OâÏ`*Ws5W³l’KrInô!Zˆ¢8ìúÆõ뛨Ð0s˜9Ìì+ÎèÊèÊè¢ÞY³:fuòy‰¼#ØŠ­Ø F0‚oâM¼ ài<§1299‰­­­ÜÛßßÏŠ¿üøåÇ/¿¶K­ŠVE/Pør}¹¾ÜÅ{xÏãy·³ h*)--ЊV´FN–ÔKê%õ­§Ø † CÀ›åÍòf:«Îª³ú«k”5ʾ5|køÿ üƒðÑ,šE3 ÕH5R ðžö=í{Z@9ä€,¡!¡!¡Zh m¡ØáÒ»ô.ý¼lÜ2¸eí8¾àø‚ã xÀ\b¾˜/æOÌùÙ®³]g»8¯¦Õ´š>¹no³·ÙÛ8ÿøõ_ÿøuÎûMý¦~çíQíQíQœXy`å•OÖó|_Á9³0 ³pÎ.³Ëì2çì+öûêIüO€b;¶c;‰§§éizzBArª  ªx"©þ ýú/a[ö†mÎäœÉ9“˜&…Id'e'e'K#–F,ºÊºÊºÊÛ~Û~Û~ fC͆š @P#Ô@·¶[Û­H2I&ÉæÃ|ø7ñ×Ñut€ƒ8ˆƒ$ž ZA+hùg²3Ù™Œ^o—·ËÛì%{É^p÷z÷z÷zÀqÀqÀq¸Sz§ôN)À×óõ|=à¨wÔ;ê£ùGóæ® W†+P†)Ôa@¨=Ôj’ÓÓÃI•“*'UG†Ž úÛûÛûÛZH i!¸TpýìúÙõ3z©Žê¨ŽŸ‘(>S|¦øL¬îÚ;µwªäÈîÝ7ºIIb|b|b<ܲbY±¬*e‹²EÙ$ÌL˜™0ÈìËìËìÆBÆBÆB€íiÛÓ¶§×~¼ö㵕Å+‹Wì{Är£Ü(73ãfÆÍŒ:ã:ã:〾É}“û&ÚÚÚp[²-Ù–l¨,v‹ÝbÇ?½Š^E¯XM±k°¦â¤\R.)'%ÍÍÍ>Ý@Î@Î@TÂla¶0N­AkЋҢ´(ŸHâaíÃÚ‡µ€o—o—o 6ªj#`è5ôzs‹¹Åüd½McÓØ4€OïÓûô@è¦ÐM¡›0æ¿­ú.ú»èï¢Y ± ±àññ–ш–ˆ–ˆ–OJez™^¦ÿæîãÔÇ©S…¾º´º´º4ßf¿u¦2S™©ÄØ qÐ8hJ¯”^)½Ô­9Zs˜kŸkŸkÞHx#á àÅ%/.yq ÐZÚZÚZ l›³mζ9€a½a½a=º/u_ê>ð©3Rg¤BnŒ6F£ÙÈý°ûa÷Ãh›ì Ù²/þo­×êµz­Å^Rv§ìNÙWpWþm¯ôôôÁEå°yذ)l ›2¡EuScScS£o³Ýb·Ø-’½rµ\-WŸ¬Š«Ž«Ž«Þõ*P r =èA¸8ÐÁ +¬âÍñ3›Ô?g|Îøœ±ú/Š·o+Þ>YeŸfŸfŸ&qœ›wnÞ¹yO´Kž%Ï’g1)¤pà ÷oÎö…Xˆ…àÔDMÔù%Ë%Ë% _tWpBu*H¤º;ê9å9å9µå“›7+nVÜÂ-Ü‚`œÚèˆ<Í&±Il‚¯ß¿~ÿú}ÀSä)òmù$($($(äö鮆®†®¡ÚôŠéÓ+|)$…¤rvŒcÇÀ¡„J€òA>‘ˆD„û¡å¡å¡'ͳͳͳd ²Ù–Ì’Yò–OÆ¥wwÔ/Žã8|Yà ²áÿ%‘û§þ-ªa†fßf’BRHÊ¢¿ŒÿrüðOïFïFïF¶é5ö{Ñ—f휵sÖNd±NÖÉ:¡¢Óét:cb‰X"–@¾?vìþX_œm¾m¾m¾Ð­˜­˜­˜]½`ü£)ncf`É^ÿÎþ-°cUUUUUUp2 ÿ… ùµ»Ù¯Ý½~íþ÷„vó‡<º¯ÁÛàmðŠ5ŽG T”RJ)™8ï>ï>ïf#w w w B·¢TQª(½Ù8voìÞØ½Ò]ݙݙݙ€P¨§Àßèï€ T~ÿë×î?'´[ (Pœ¬²kíZ»Vâ8[~¶ül¹o³¿£îííÅW­í­í­í$[Õ©êTuLÇtL·é¢äUÉ«’WÝ/Æ$Å$Å$Ѽ÷îßs øKOOOOO‡èŸvp—qyÇ6Ã6Ã6ÿ囿›æ›ö/Q#‘ÇüǾ_ÿºø×Å¡FÇ-Ç-Ç-þùõÚëµ×k}©ÃÞaï°W(’¾$}IúÒû‘¼†×ðšã}Ð7^ØÓð'Jü=ÁŸØh·&˜`òUðz^ÏëÓ{h­£u?ÆŒ®]5ºŠÍ¤©Þò„AžÁÇxàlÙD6‘M¥ªU„*âËJW•«ÊUµ x®}®}®Ý·+µ+µ+µ‹zcÛbÛbÛÈ3Ú|m¾6n¼7ðôpà 7€—ð^0ó0î©°©°©0<Óæhs´9¸÷|ôùèóÑl×­'n=që‰ÞÓGè#ôËu¾M¾M¾M«JyÏá9×6ÐÇÈ>Ï>Ï>p„Í…F¡ÑQ+NŠ“âä‚§Í›7?.%fnÍÜš¹U¨ºt'èÌ0À$všf§!à2.ã2€@"ÀÆ0` –` @×Ñut$¸à‚ ÂèœÑ9£sÐk=n=n=.mèýª÷«Þ¯„o5~?ßOÿ-eHRÆÊõX‰•XÙ‡¸xàâ‹€(J'~p­u­u­Ý¸$êXÔ±¨cÒ39é9é9éB“<3㬖ղZÐVÚJ[lÇvl A‚@€@AA bƒfÃl )4…¦`7q7PÙ\Ù\Ù,=Ó½£{G÷¡ÉpÆpÆpæäeaLÆþ´”JÒ„4‘'6ˆ bÃÆ%s3çfÎÍä–ÌÏ2?ËüLP42ÎMÜÄM +éJºà›ùf¾Ý¢[tb‡Ø!vâ„8!Nb¥X)VžO‡§ÓÄ41m–›§ðž‚Å¿O‰¯ð(|æÑ X«cu)!%¤ *¢"*@½G½G½Ð_Ò_Ò_¶½¼íåm/šZM­¦`kضA A A p'?•üTòSHµ¾i}Óú& S‡©Ãö¯¥’E²H–G7‡ÃÆaz8éᤇ“H™Ì£¡ê qgAçHs¤9œœ d d d k~YóËš_€§ß}úݧßÜGÜGÜGK²%Ù’ hª5ÕšjYÈB@MÔDM3n5J|…GáÃî±Ýc»ÇØ¡êåÕË«—sÅ\ìUö*{•s>Á'øÿ}óq÷qΞgϳçg»íáöp{8ç%þ%þ%þœ{>ñ|âùä®q9<‡çÌúŸ‰'ÇWx>Š8€$šž¢§è©™Ì´h@ywÏnÅêQz€ÝÏîg÷¤–Ô’Z`蛡o†¾ìÚµ? ¤%¦%¦%Úlm¶6{F›˜.TPAàGüˆgãÓé‹ôEãc|L¢©Ê¤2©Lüôxüxüx<®JyRž”ù‚|A¾ŸöÁß] f˜ah*M¥©³Ý¶{l÷ØîæKó¥ùkµÇÚ$  © ¤€xŒ`#é!=¤\v£r]v]v]ÆUj¦fjæ§©î°î°î°Tr5ôjèÕP~úJù•ò+åÂCx“,¥±4Zh¡à…^€‡ðàS|ŠOÁìÁìÁl kAׂ®@ M¡)t6Ãcx €D €:èžÍ³y6€! a“½«{W÷®œ×××qDwUwUwU*¡ÈD&2 +„¡@( ùç‚ÏŸ ö™G.] =5P5`áG85ÔPˆD$"gA¾û軾û0ž4ž4ž"­‘ÖHëì{E¢H"DU¨B@lÄFl˜’6H¤ ÐîüÜù¹“%'q'>">â#¾J ½ïÂ}î»pp¯&Y“¬I®ê¿w+îVœª×šgͳæùvÊqx>Ïçù˜ÂÁ€¸ˆ‹¸fAÚkÚkÚkS¡©ÐTh ?ÌóÃrƒœ»fxŸÇçˉkßn|»ñmæî¯é¯é¯¡ßjÞ×¼¯yÿ×{û¼}Þ¾]^²ïç}?ïû@ ZÐrÿ1õ zP=xÑoÂ6a›°-ÈYå·Êo•OI¯K¯K¯#˜š©™œz©—zAD‹h-@=­§õX|{ñíÅ·˜á˜á˜a€÷ó~Þ0FÂÁ#x@®‘käÜWò¯ä_ÉǺªÒªÒªR|î÷“ßO~?yžà*®âª¥ë° ±°ã/”VÐ Z¡ºDÒ£ôèõ¬‡õ°žM¢Þ¡wè€Ãì0;Ìü¡¶×Ú^k{ 52à$ãq<Ð85NÈêÎêÎêbÎÇœ9?[2@ÌÇ|ÌŸ¿c¼c¼c„¾iÓþ¦ý’YÝ­îVwdœŒ“ñ½Œ$’Ðñ” %B˜,wß²é{£°Ÿ”’RRza+M¦É4yWãô’ѿڈ؈´e´x´x´zò=ùž|q¥¶ó<žÇó<‹gñ,€P„"˜¹¬ cØR¤Ô”Û”Û”ëÛ9òúÈë#¯ Ç´‘ÚHmdMqÔ¡¨CQ‡Þû…(D!©EzÐ#­Rö¥}èCŸÔŽ\ä"—4>xæÁ3ž)Y£Û¬Û¬Û\SØ^Ø^Ø^p'wr'e7'P·ÜžbþÌŸù#°õ×Ö_[Ä\1WÌÝ}Ð`4 Æk§ºl]¶.›ª¤ù¹æçšŸã)dÙF¶AˬÌʬàð‡?ü>ÆÇø@$" “CÎ!ç5öEöEöE4  ‹gñ,~÷Áiéõ{d)“ÓLW Q2—I´ò£¼DªØa‡Ý·“$’D’˜²fº¢|ùwïïï¶ýö{ѱGcÆEëd¬zº.¤ 1%åKùR>´Ç#GôE $ $ $¨ºu‹t‹t‹J–Ooš]ß²2VÆÊ„còÊîPV¬¸¸¸¸¸ã3G²Ü1£!Y»;e퓵ÛðoÚõÚ¼6¯´e´|´|´zJ)¥cÊLœ›<7yn’¹ûËúËúËTݺ½º½º½íMS×§®O]ßû^÷“ÝOv? È€fyœ^TøîªÿXù@/;ø§¬Ý¿ÿ›vM#¦“0ZWPWPWàÛ‰(D! mÁmÁmÁø/Ç%Ç%Ç%²Aß©ïÔwÌÌÌ̼ý¢%d Y“ÿaYfYfYFoËñþSn'Ë¥ÂïXRRRRRÒÌ5¤k¸†kÈ«111ø›/Üî ÿ—¤µh-Z˳½¹ê檛«‚ÏŒvŒvŒvðw[O´žh=á{lÂ;áðªrÕ+Ô+Ô+òÂx9/çåŸ5M—dU/nã6n³yÊ È%ý–‡àìw´[„f4£ÙWÈy#oLê¡õ´žÖÿųڳڳšÅ¨ËÔeê2Ú¡ÊQå¨rÎYYYŸ–äìqö8{ÈYÂBX¯”ýÚd@÷ïqPüýF»òqá+ÄVlÅVᲑl$ÿÉ›y3oÞó’ß~ø=@;T}ª>UßõØ;ìöΖ_;×w®ï\LÂ"ûS.–“ÄñÖ>i!K=ŠIEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-centre.png 644 233 144 216 12610450011 16404 0‰PNG  IHDR Vu\çsRGB®ÎébKGDÿÿÿ ½§“6IDAT(Ïcd üg````b øOŠ¢ÿ¤˜Š¡˜‰ZÎÁ q˜ÀHŠ•x@r<¬…Ô¨ ”q†1IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-79-red.png 644 233 144 4231 13755454064 15612 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜNIDATXí—kL”gÇÏ{G)î¸cSg4D‘Ä+¦+¨ƒZ‘¨‰£¤b+5j\ÛuhJ ¬*²Öum0¡/ÝБÁlŠ‚ÅhX°5®]Y!E 3EL¬#ÊE‘™y/ÿý0ó¾óÎdW³Ù=_à<Ϲüæ<ÿy òÛ$ 1v±Þ¡wèÌóÀBä¸úqõãê—/äE^äÅö”B)”ø·årâ‰'^ñP_.Wâ•|¥žR?´»8”GË—Gy”ÇÖ†îGÅóõ|=__û„ÙÃìaö¨ ãqÈ8„¦uw×Ý]wØpÃý ÷kš5Íšô•}%^ÉWê)õ•~/ç!ö·¡~l;ÂŽ°#®eBSs§æNÍ÷UµUµUµÉÃÃÃ8pà0Šgx†g\pÁ¨~`_‰Wò•zJýÐ~±/ç#ÓD¶Ÿígû]•i-i-i-Bj¯¯××ëC/&'ÉIr±H,‹qŽ8Gœˆ™b¦˜©ñûJ¼’¯ÔSê«À!ýMU4¦–©ej‰øƒüAþ`ÍJ‚¥Ü²ß²_ÈTÁ>”H 0,ÔŒÙÇì€ì’…d^? r"@’®K×4¯Ô'õ²ËwÛwj<×<×ùCy¡¼ÃJ˜¥Üò©åS!Sé¯ð(|¤ëÓõéúVÍSL¥¦C¦Cò çcg»³ƒ:Ãâaé‘ôH0 !8ÀÆ´®Ô*µ>Çç@Éoâaßw¾ï‚Õœ]¼‹Ç ©ÔtÀt@ž¡ð(|+²"+Ú?oÉ·ä[¦ôCæ² e¨kåæ·¦½5É/¶¿ØN‘üïŒ F"òvwÑk¯w¾NDÔ™Ô™DDt'ñN"‘§ÐSHDd*0ý¸åÇ-D¤oD"ò>ë~ÖMÄ.‰‰!R¶”MúɩƟ?“¬?­¯ÖWÓ½‹;/v2kü|qÝÆDc¢1åO–ä䫟T€ylÇØñ3cgþï=°Ë@Ĉ;ÚõrW¹ šêšê´ë† C…ÆÞaÙa`´ðdù€4  §€þqígk?[û™š0*öŠçÅóÜÊ’gœg ¶ ¶hk—7”7@BIB ürà—`J4%À¶ÓÛNkã¯Ü¿r_ì¾á½áÄÞàQ…Gá €âœµÝÚnmJH\&.—iså(9Jë÷ìéÙL, _}=¤Ýç¾ç¾€ÃöÃvíú½Ò{¥Б_ø ÿ*aë\ë\ë\õÞ>Ç~ùk[[õzXãaˆãvq»¸]ÚF+i%Èñrð:&¢âˆâ"¢•­+[‰ˆÖÖ´ûû û DDï¼CD”UUMD´þúúëDä „ý$#Ûà ¬rn—ÛåvQ¯ÂGl&›ÉfúF\~*ïTÞ©<Æû&ú&j>«§ûýî÷µÚ»Ðt¡)dòMr\ÅE}1H‘‘‘Dü5þÍÞ¯^øVË$Ë$q/€8Ä’Í?O8æ5Îk0ºfáš…Z0ï7Þo´~£©ÑMц™éÌtƒþúÒGÅ£"d%:÷Ö»Wß½*ª€Û¹íÜöfûý n µ©Çuɺd]²ë¤’`+ÊOÈOÎSøuÝ—u_B:b;b¡¹Èåsò9€z­TîµÜk€““ONÄ-í;Ûwç{fäÌ´3Ó°Z}BËØ2¶ll93…™ÂL™]ÈýC}R73›™ÍË*;cgìŠV¤ÍŽRG)ªv÷J¬Äâ!$HZ©ÊVÙ 8€¼T. ‚Rê·÷›ûÍ€y¼é¶é¶ð{u’Ÿp…\¡Í¢¢eR&eò¦ k:¥S:ÿ ÕR-Õqnî÷`_ƒú´VšV›V çG=•=•ZíÊoÊojá…ÀhÀwHÕR5 gû¾õ} ¶éo:.îUßögü ?è(‰Þ½;z7ka-¬…9 Û¢`¾ø™Íõp=\Ó8#FþŒ|"]®.W—ë(Qµ›nI·¤‹{•†’M²I6xà€OñO5â,q–8+¨Åc Ž-8¶@^ª¾åAgèóû¦ñ¡'Í\ ;zbÂÜÖPß4Þ¯]çÙ vmE¶"v ‚A0¤‡ÒCéaP‹]èBà˜Ð5¡kB—¼NÕd$ÉF¾} LŠÇÃøôôòîX˜v×ýí6;šƒÚš…f¡9øUzý"úE40”0”0$Æ©Z¬ã긺?/R¤^8à¯è P µëæÜí11 N»Óî´ðÀÔÇÔÖhk´5¯¾’¯ä+»ÿ’L¸Ö7°N¯ 7%áí€vÏÿ'í.ÉZ’µ$+¨]Ç"Ç"Ç"üÅ¿/«'Áä09Lβý¡mاa}ú/íUÚ]Ì•qe\™kŽœSšSšS*ÿ)É›äMò êQ»97ç¶M¥ª¡ \;œ3¬ŸžþG ×nI¨¿ä'f+³•Ù Ð ZA+¤ß°1l 0ÄCk5šGÍ£DÜMî&w“¹HÌ;¹ÿ›ÿ>Ê  ÊàÝþh +³2+Ì%æséÁ4ÿúLGØÉô†Õ}åQÿ olY¼×n¡šIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-68.png 644 233 144 2523 13755454065 14700 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]HTiÇŸ?Æ!ÍÍ-#T kPWºØ Æm¢ÚÄÆŠ¡ Åèb[·Úî*¢ ¨Ü†£¡¥6’2“‚¶¤P+6b7ÜCkÚVc u-§ õœóþöbæÌ™Ý¥íÖssx¾þÿÿû¼ïyÎ+ ""³coûû»+jÛk-Úê´Õy£vP[…­â÷}ðIã'™Í™ÍFŸe›q3?±^ÄÂOä3ý2[,‡£ÕÑj+ÙÁ_à/Hû,j×ßg»³ýÛ®m»põÜÕs| ážpÀXéX)X¶7óÍz/_þ‹_Rn¤Ü°ýŽTGª,\µpUî7Ñ„§¹P¾®|ÀPÒP’²€> ¤“®JÌg$Á6ã±|³ÞÄ3ñM>“?ªG Ë“åßfßfgS´ ïìÉÞ“mòM·‡9L:h- oÕ·2 Ꞻ€ X¶7óÍzÏÄ7ùLþ¨ùçÞ~ï…Mi›Òâ‚Ñoê7Œf£™iµMT¥ýª=Ô‚ñÌxjxÆøA/Ö‹™ägºè²Ê+Û*Û*Û`VͬšY5°Å±Å±ÅƒÁÀ`ÊÊËÊËÊ!scæÆÌà«ôUú*aôñèãÑÇ g¬?ñ ÿ÷ŒÅ„ïÃöýÛ÷ǧÑçñÁ8„BE§€JU©*FNœ9 z…^¡WX„šOói>ž3<Ǧâsìqˆ ª8ÊQ0"ƈ1’°r¿ò+?/—ÆKPåQž„x¾ÊQ9 H!À8eœb‚wÿ?Ç>>ùuý®~ÀØiìdšë 0€RT—êNÐHcBG‚œä$¨NÕ¡:€tÒ‰c·±›i4Æþ+gìíbÆÞÇfæ öoV͵±'¥IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-77.png 644 233 144 2271 13755454065 14700 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜnIDATHÇÍ–MhTWÇÏLŒ33`Äàh`(~@DÁ±à„ÄhtÄ!*1’P’ú¥F¨.„Z1à¦)h5`+15‚Šâ"Y¥'Ð.J„Ò$"2Áè,’43÷Ý_/wÞÓJ]ålfÎýŸsþÿ{î{ç] Lÿ x ¼Þ|Û÷~å¬ûËýå…m¶Y'î‰ÿõ,¾´ø@ðzðº5àø7ñî|§¾›Ï¬K@œßßOtÚ? ûÖí[çÿÌö›w?ïþ?8øàà€{-÷ZøR}©>€Ñèhßà&Þä›zîúrö~ÈmÏm÷$Á7ß7_V”­([õðtìÚ±kÀHÎHŽö€z,d¡ŽL`ìµË7øt¼É7õL}Ãgøm=K¶,Ù"»«vWåýb' ü '–ŸXnøÒ÷sœc!d&2ê€:À;Ð Àƒßà&Þä›z¦¾á3ü¶yÿl,…=þ=~à @º,¯åýHªBÒ*G­UkÑj§*Wå bj§Ú VŽ•cå€úBmV›AÅÔ6µ T¾*VÅh]’iË´‘e) 쮦{³|Y~q úü'ÈKå¥&æÁõDe¦¬«†I{Ç;þ}ÿ^½ ‡ÏðÛzæÙòÖ‹Ô^®½¼(#n 7êõ4fNfNzû=ßç¶æ¶ É•ÉeÉe"Ë:Vv¬ñmômôm ”J%"þ ?èФ§§‹x ½…ÞB‘• *TŠý\t±è¢Èš/×´®i•<~Ïtf:¥ÃS. —iÿ¹" =Óûó[¸5~kÜìJ×YÑ©‘©g¯‰ ‰ ‰ P¼·xoñ^¨ðWø+üà;ï;ï;µÇkׇ­é­é­iØÞ´½i{“ó \¾6|mØé›ê:4uÈÔ×u¿­G ¿+¿KßÔ†ÔwËuŸî³ÿ ÁŠX+â 7 nÜ(€Ê›•7+oÎ<¿–Û-·[nÁ#À:®ãî Ãoë. .²þ†×/^¿p½öoôSý(¥”R'}üîøÝñ» †¡ûX÷±îc>Æ!ô2ô2ôzV÷¬îYízÂÚ¬6« @¿Ò¯ÜcÆðÛzþ³cj¿ªRUÎjóÛæ·Ío!r$r$rdf§šû›û›û!R©‹Ô¹ [ÃÖ00ÈÀ”îÒ]³wÌ+2ˆöÿ!òèᣇbÞÕzQzHÉ”TK\â’µÄÕÄÕÄU‘Xu¬:V-3,Ñ™èLtŠÄêcõ±z–°„E$$Ke©ˆÌ×Ïõs™Êòeù§õL˺áðéç³û+ÂÊŒgÆßbm±Æ±Æ±F˜|6ùlòÙÌŽ;3v&““Éɤ è¤v@M?·Îàµù²ü¶žOŸcG9ÊQf7ÿ¤96ûä ÝKFu©.ë”uŠ4A6± Í høˆ  ð®I[5V iP=ªÇUöÉ?g¿•söv1gïcsóû/ eBFFlRIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-159.png 644 233 144 2770 13755454065 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü­IDATHÇÍVmOW~fY6QX(&ýÀ‹¡ÑZ°I1)¦• a£Ñ‚d #-mjbÕÄFl”´RÒÆ*uã¦M©±iH¬5¢¨11,TñåCCB³˜®baé²m¬ ìÌûôÃî0kû¼_&çíyΜ3çÌ pÆŸ m9¶[ZL¶½oéS«R«^ù1&Ÿ¤²IÙô[™þuú×$™ÑÑmŒZ²i7ýã ?‘ÏÔà Ka?c?£”ÇåÃdýëõ¯§.ŠÉ_ ’ŽsŽs3:Ù|¾ùåÒ®ÚU€Ì{'ïüc÷òÉ ® .’œLšL’6’$E˜ä.å$#ŒÐ<%Ȧ=îoÆ›x&¾ÉgòÇò™U–UÝÝŽïb£?{³÷f›|Ú9’Ÿñ3. õˆ!IÑ(9GÊA9H’T¨–lÚM3ÞÄ3ñM>“?–žïí—•”ujJR'Ií)‚"H©ÚNm'59F•*%Iƒ)öŠ=b) D( Eƒp 7ÉV6±‰”/Ë5r ¥þgtMt 5Ù¬—ê¥ó/|ƒOkE­ )ãüV+`Ùqꎠ#I&΀“äE’dÔò´<Îò2ƒ Ò:ø€HNsšÓ$ç8Ç9Ë,g嬜%ù ÷sB\¥8-Ns–/ÇðÉÀ«WI>uŒ9Æ"Éf>ñÄNþB¶l=HòIoÈvmŸ¶ÏâùVý†ßñŒxF<ÏÙÐÙÐÙé)ñ”xJHï}ï}ï}rºbºbº‚ôoóoóo#ׯ8^AŽý:656E9|'Æ7ÏÏÇ«[q/v­_= ”†*/ÉKˆ6Þiô5ú 4k-J‹„»ÃÝán@î;ä åZ˵–kÀ•Ì+™W2áÍÛ‡7¾E¾E¾E@m 6PzÎö\ì¹Ô|W³¿f?”'X,FT)ŽñÑSšZšo#Š{A¦ùÒ|ò O„n…nY•ˆ<›~6Mö¼Ö³¬g™ãÊqå¸È£y£y£y¤R¨*…dUoUoU/Ù—Û—Û—Kzs¼9Þr•ºJ]¥Z¸E…‹Â¤§êDÚ‰4K/6? ~Jšù$I’6°¨wÕ» pðwJ›ú½ú=²Ü î»î»À±Ð±Ð±‰ÎDg¶—m/Û^T–V–V–»'vOìžšœMÎ&' v¨jP]R]R]ø5¿æ×€äºäæäf³Bø©êUõ*²€¤Î¤NÚã‚qAñCè.Ý@dáMdÄÚ;z¶ž­gJº’®¤On?¹ýä6Q›Q›Q 48œ N ûPö¡ìCÀ½‘{#÷F€%»–ìZ² Xï^ï^ï2e¦‘iùò¿Êÿj>Kù5†oæc"å‘òá;Hðøž²RfÊLDÍÈ…C ‡²KvÉ.`y×ò®å]@¿½ßÞoœ>§Ïé¯]¼vñZ }²}²}¯¯¯:Vv¬ìX ly{KÑ–" òFå‘Ê#ˆb$Ægk»þÖõ·€ù|þ7•Ñø”u¿î·¦òñÑÇ;Èhg´3Úi}šWój^2¼4¼4¼”4ªj£Ú²ÏisÚœFN½;åšr‘ò_âK”¤ÈY$ÿ‰óÉÖ¶Ö6k*­=FÇCÇÃH2ù»ø]ÌãÖÆVc+g9Ã玼)oÊ›¤\'×Éu úzY/ëI¹B®+Hù±üH~”`ÏÓê9Ëó{,7KRsL8&þ·Ç6?ëìuv’ÆüæÃ$íb§ØI'9ÈAkñsáRöË~ÙOò4OñT´ó'þD)o‰Q@wÄQq4aóu)u)f¥žÛü/ì¿ò…½]¼°÷±óû/òr’¶B•IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-23.7.png 644 233 144 3012 13755454067 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¿IDATHÇÍ–ýOTWÇŸåeÊ!¾,+›u² Ø„†!‰m¡¶R›.† i—ÚXÚqûCcmÂÖ´NP¥]»ÒÚ ÁUÌSãk]4n•‚šÑ†: ÈËd– órïùì3×;]÷ðürï÷œçy¾ßœsŸï=""’~ DeDeD%†pÔŸÌùøòøòìÃ!Ü®åeËËûaIÛ’6€äŽäý¦‰u#>2_ĬÉgÌK’˜q=q=–õa¼^Íy5'~yr¬½ÖÞ… Ô«;p´óh'oÃä÷“ßÌ­Ÿ[&6Öx#ߨY_öþ¿ÄôÇô[îB\l\¬d>—ùÜêwB·WË/¼øÀÏÑ?G«(Ц6µðàÁ#°±Ž7òzF}ƒÏàéXV²¬D^zí¥×¬ %Üü v¥ïJ7ø½@MØ è z´mÚ6| Î©sX°€‰u#ÞÈ7êõ >ƒ?¤Ç<Ê‘ý j¶jT @àbðF`E`èƒgÀI ¬Técú°> ÁŸ‚wƒwA娕ÃcCU‹j¥EûSü)´êÀ¡À!úCõÕ¶¤nI5îß`å·""ö°z¬ϯÔÌøÅñ‹ÀxTžÊÃË·œæ4èÓú´> ôÒKo„‚œàPGuó~üø!uµZ7 ž‡0_˜?$ÌÞÞ±öóêŸoZÞ´Éú3cé####м´9º9u5ûjöÕl³üõ+ׯ\¿Ž\G®#ƧƧƧß±;Yw²îdAÛº¶¼¶<84óEÜq¨¯ŸúRÿR‡aコ{uú3PÿQýG _ é=ODäßÐ÷Yßg0<àÚçÚ§^Ïð®l_ÙŽ¯8µxIñ°wÛ»íÝЬ7ëÍ:¤u¤u¤uÀfûfûf;dÜθqnÞ*¼Uh ;3tfèÌl-ØZ°*.U|WñÝ£ÈwèÇ£]G»ÔëÐïîwCðdHhךšUx}^ôYO.=¹v½Ûølã³&AAkAkA+TvVvVv‚cÔ1ê…ãùÇóçÃÚµk`hÓЦ¡Mf^Àp\&îJëJíJ…ª¯·ìز#bk]“)“)À‡‰¥‰¥ªG&[“­ú õçéêéj³íǶ––AnKnKn ”4”4”4Àâìâìâ,x4æÑ`cåÆÊ•`/²Ù‹`$f$f$æñ#uqq,W–+Ë~~Ùùe&Ÿ~ìÁ§>H~:ùiý†è·m·mW=0oþü¸o¬u¬žúu¼3Þ {þ²§iO“Iàp8”Õ”Õ”Õ˜ókjÖÔ¬©&LÀLÕLÕL•¹~ÐvÐvÐ…¹…9…Ý«;Ã/c“ “ €?q q@õD©ú…Ï>¿vYd°|°\äʪ›7'xÃ×ëËöe‹¿ÿãþ½ý{E–./\^(b™³ÌYæD´-AKI*N*N*ÉëÎëÎë)**)Ú]´»h·Èº…u ëD.í¼´óÒN‘ŠßV¤U¤‰1üüFD„7$ó¬ó¬SDb=åžòk—…OB]o½÷Ö{° u價N¹N+ڵʵ åú+Ó• ¾j_µ¯‚éÁô`:ÜwÜwÜw€^¯×ëõ jU­ª…‡µkÖ‚r*§r‚;ÛîNïiï¸wzƒÞœ ñ¡mûû†ŸµŸÃ7L1|%ì3ÿQ+ÔŠG¾ƒº .¨  :T‡êˆp§X«bAÍ«y5ñqy™c.ïеÁ_ø˜6®X'­“ù˜ñØ¿««A}væËšM³ú&8œ'À_dÅÇ4ÑêªOõ‡9Ìa`žYfA¨Ô€;¤›•ÚÚØ©åkùzö"ÁW¢_‰þÎÿäþ+ŸØÛÅ{{2o°ÿˆB­TX¡IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-16.png 644 233 144 2356 13755454064 14674 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü£IDATHÇÍ–[HUYÇ¿³Ï4ÇËé¤])Žó0ÅLPB/)MFšÐÅ)” ÏH >”½5=Å F)2”¤’»˜r¬C2­ ŒÁBºØ¤c% ¢22zöÞë7g¯³÷ S½º^6ßíÿÿ¯µöúÖ‘ ç+`dYF(aå®?%?%ÿ«ßv¾b_ñÀ/°è좳™™ös×Öqï­qñ½|Ú/â:××|yŽ}v¯Ý½6eYÂþµRo¦ÞüË„H{¤ õRë%~†±‡c&ò&òÀµu\çëzçÅ—ÿá·Üòý /_ŠÀê­«·fW&þȆÂm…ÛÞùßù•Ö HPåÓL£Ç¸ÇÖq'_×k<¯ù4BÀÒÜ¥¹"°£dGIêÅDÁó&8>Ö|ñ›ÀiNsÚœ°öYû˜Õ£zðá×Öq¯ë5žÆ×|š?¡Gþ½·Õ?ÀΔ)IAPV¯Õ ˜v™]FÜ (;hì¨nuWÝM®êGU¢JÀì7ûÌ>°ßªt•Žû”}Š8³V—Õ(?ɧùÅ+è›ZHK›þ­A 0(û°}˜:f¬ëŽuh£6W!B„@¨5âñ×% |M1Åàœáoïð%ùzau½Pq¼â¸F³¿KnÁDb!ÔIuLsù" ‘†ô¿ìÙÿÒõ¿jÕþªªªªàqÅãŠÇžµXÁ æó—Oó'ô8Â~¯‚æÉæÉdùA~²V€Yí1ϘgÌ3°÷ÑÞG{¹?@×’®%]K >BÎûœ÷9ï¡0Z-ŒÂúÒõ¥ëKáéʧ+Ÿ®tÚ#ñ“ñ“_tùz ‘Pw¨ûû‘Ü-¹[œýßEùÖ(6Š% =ꊺ¢®ˆl?°ýÀö"áÍáÍáÍ"iUiUiU"ååå"Ãë†× ¯ §…ÓÂi"ùEùEùE"á`8Jrø–ù7ù7i|ßE—ßÑ™ 3ÚÏ`|t|Ô{ìÕõ¸ÍmnƒjVͪÙñÆ–-[ ûI÷“î'ÐÖÛÖÛÖ Y«²Ve­‚ó‘ó‘óȾš}5û*tF‡áY±ÕVª•êåÓü =†ˆ³c¾g"f‘Y”œÐR±ä…¼Ãñl ²Á±yݼn^¡€ D2b±Œ˜Hzczcz£È¡úCõ‡êEB¡Ð€È9d™n=Ù(”‡/Éïèùè?†uÙºÌ,­4Ñ,f1‹ÝçååA¬6V«uý{:÷tîé„`e°2X »w î„)ÿ”Êï9­>³Élúø?öùS9—¨ä-¯yíâNÖLÖLÖÀ\Ë\Ë\‹g‹úì>»ÆëÇëÇëÁŠZQ+êôœ)¦PžÆû©Sù?}Œd+µK™ñ@Ï2 Ì1çˆNŒ2Ê({Úž¶Ý+ •¥–«å fXÃûœ}Žñs}ìë¾u°íýö~·óÀÀ.PGG`+7¸ês#\ ‡ØGì#Ä1­{Ö=/þG;ÿ¼½+çíëbÞ¾Çæç ö8 µ[L÷áIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.8.png 644 233 144 3101 13755454067 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜöIDATHÇÍ–_L”WÆß``„®ØÒˆ“"JE$lôb‹K2’Zÿ¬FERÚ+‘‚©©ºmÝ®fcl7KWDS. MÕí^™1*‹X@R D¬P¨ --Sa¦Ðf¾ïüöbøÒdï=7_ž÷Ïó¼É9çùŽ€ˆˆ$ÎÌ)æóïÂØ\‰Çm‰Û’ñe×i`r˜ßü ×.®Xòù’Ïõ6òFýÂ~‘ÿB=#.‰ Ä6Ä6˜ æñÇP’S’÷rÿóX¯Z¯Î„àkï\¸òÅ•/8?wþÜ ð´àiD°‘7ê~ƒo!¿|ü}ˆiŽi6}±–X‹¤¾‘úFú{á‚Gé°sûÎí?Eý¥Ì =HP€Æz²ùùz£ßà3ø =C?<@ÒÆ¤"PôfÑ›ÖúpÃÀ%øð•_1ô‚W“œ$B¾@{[{›¨;ê&LÁFÞ¨7ú >ƒßÐ3ôÃóD¶rVDäÔ&Ø=´{ôÁŽÐH0=˜*=ôZè5‚ó“*•¬^R/A¨?ô0ôô½Gï!²f˜bêRz0´$´„`èÇ -h•æ‡ÝžÝ`ÊÐ7¶²EDdõY°ú¬>_´Ò‡:†:€Oø¨,•Å,nÎ|œùš²›²›²aÕ¾UûVí{§½ÓÞ )‡R¥‚öíÚDê¶uÛºm°¢nEÝŠ:phŸÃ+V§ÜK¹G z¬u¬U•AãêÆÕ —‡ç=7~*~J5À/®_\pCo‹m‹…c¯µµ‚SwjN ì.»Ëî‚Ã'†O ÃñÔã©ÇS#¬Y3²fÎäžÉ=“‰·ßn¿Ý~–­\¶rÙJ8§ŸÓÎiðjwæÙ̳Ð}­ïfßM€é+ÓW@?•°#a‡jˆ6ß·,·,'[¬þü?˜d³ß°dâù¹rHRéæ·¶¼µEdlÿØþ±ý"¥¶R[©M$.>.>.^$§:§:§ZdéÈÒ‘¥#"e×Ë®—]—gKój^Í+2Çsˆ´\h¹ØrQ„µd!"Í$“,R33$I’f>h>H¶Yy®k®ËÔ/þÅŸ.þTäÌÍÏ:>뤒PÉ·%ߊ¸Z\-®‘Eõ‹êÕ‹ÔöÖöÖöŠäïÉß“¿G¤ØYì,vŠ8·:·:·ŠD™¢LQ&o©·Ô[*Òw¤ïHß‘ŒÃ‡3‹4îmÜÛ¸W$f8æVÌ-‘Î]wŸÞ}*I"Ñîh·ˆ*ÒÌšÙÔ/*Ö8c—ó/çƒû/þMþMªlýæÜ±Ü1‰kÓÓ z^ÄæÖÓ}I»‘ОÐîÈÔõphë¡­‰«ÂõÅnHº—tïªîWݸ{ãî NÂxÏx€?ߟv­÷5^Ïk¾h~©ÿ¾Ä=Œ{èx ñ ñ"¹'sOÖ÷aÀ_YPZ\Z ð6æmŒr€9$“¬òôòEÕz?‚×óšOók=­ö#¾;}·ì?¼ÿpÒ/áÁ[P»¦vÖ ÝÎsžd0FÀš"5g00Gí´G) € …Rì¶šVÓj¨£Žº%øSœ¾4Ïšgö€"†f‡faQ?â'bìêïpüÜñs€ÀÚNšgÄÙzÞjïIïIhÙÕ²«e ÷ ÷ ÷E}C£Ö¨5j×Þjoµ·z ¾w¸×æS†ºCÝ‹ÓÛõ#~"Æúj m¦m¬qõMdâcÿýÝýݰ¾j}Õú*ÈmÍmÍm…'6žØxÆêÇêÇê£ •y˼eŸÇ¿k}wñÝÅEøGõ£Ö ëk?+¯x¬Úa†¦«¥h‰ƒ€±\Z‹ µØ¦š1D#)h­D[f2Î\ÎÙ«3§3±Àý2Yûû¾µVÎÎ^³Af~AêêêbüX·=¸••³¤ÁkRZ/­ÿãc2¶:¶š$ã¾ûV½ÄZ]ë‚ü¡zÚ>f!¸ù]äwRz—“Ö•Ö•Qsýø‹KdtktëcYòCÉ$Ùrªåw£WF¯ä£ôGédku­_›×øBùQþ„>@†Ÿ?/Ý###"#rQÖ¢¬¤ü ƒI¤%Ï’G’ôôBG’¤2FÒ@ƒH'颋Úr„`­è׿5>_ÓÓôý~@Æ¿ÿ@®Û¼nsôIÿÀ­ÓäÞ„½ šž·•d%+i }.Ÿ‹$•¥€nR\—H’%2ˆµºÖ¯Ík|¿¦§éûýr e’û7ö“jIzí¾?½‹¼‹Hñºoƒo½|D’Ê>e·²›TV(FÅH*[•­ÊV’yÌe.Ÿ\Bdù }…ôúî{gzg’â]??¹ÑµÑEr\Ó׎ò"<_EF»¢]®0¡öÛûí$+H’¹¤H)œâO¼È‹$×p ׄH*T¨„`™2ål¤‘F’Ï2‘‰$)ÞosŠ/ø_èôyÍï|5—Kו®ÓØÔ—nÞ¿a¹a! ê?ÔO1˜=øæà›A½s‹¹ÅL³³³Ç¯¿zü*éìuö:{ÿ÷Å8p`àÀÀòè죺£:Š{·î|yçË ž˜(5•š´£­¹¬SÀkç$体÷pÍ|ç¹;ÏI)iiƒiƒðØëìµöZH9¯æ¤æ¤×®7\ov‰]b—Ú­íÖv+`—ì’]&+&+&+ðßlͶf[3PÛPÛTÛ){8û÷ìßáqÄ)CÊ”"ÍÊÊÉʘé÷£“JfNÌœx9Ș‘1˜üqd|d\:ù^ÇûCï!²ønñhñ(° °@W]W]W0Ù0Ù0Ù¨Mj“Úd3ŒF`Iã’Æ%AcmÕmÕmÕ€>YŸ¬On®¹¹áæ ö•¸ü¸|D~¿°~sýfé$`€¸6£kF×Ë©aºîˆÄˆD®@´<$IÈ–ÓÜin8SW¯Ú±jâ­–üâübÀ“ëÉõäìd';¢ª¢ª¢*À´Ö´Ö´ØoÚoÚo„ ?dddÓÒ´4-†Ó†Ó†ÓAÃ1M1Ý1Ý€|U^)¯„ˆ0G˜ôéút®Ð©s=žN©rì籟_ýüý;â­>ëmëmàBÊ…” )ò õõõ@‚œ 'È€­ÌVf+æ÷Ìï™ß8;;BªPÄɇ#;GvŽìo9Ì3àòºú\}À²©eU˪LõLõ_‹¯¥>ˆHèÚC6¯n^MŽì“3åL±í•ìUW=¤{¶u¶y¶™´³³#{Oôžè=Aš,&‹ÉBÆÔÄÔÄÔÅîbw±›¼;pwàîiÜbÜbÜB›‡ÍÃf²¤²¤²¤’4Ì2D"È}î‰ÛGw M¶‘g’Ï$“üÀïÚ-`GYXYXð–x>›NŸN'ÿŽüKþK¦Pê”:¥.x˼g½g½gɱ¨±¨±(R$‰$‘DŠ9bŽ˜C:ŽFR-T ÕBR´‹6ÑF:sÞpÞ Pÿö.÷.êÑYVTVDRõû|"Ç~ñçŠ8ù_Žå‹|N‰,±^¬'Õvµ]m'E¹(å! ºT,KIÎã<ΠɉRnçvRuŠ(E’"VÄrJ|à/é¿×$£ÑNWµÓ’ß­%ï&ý&=ÉüÉ,Ú}¾ ’Ç•ae˜^Í?e+HqQtˆ’­le+ÉGç8)úD·è&9èÿU}F}†^qÝ÷Ø÷˜d«–ü›Â6…‘ô<™üOïåSûºxjßcOç ö_40œ–7 IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-28.2.png 644 233 144 3043 13755454067 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜØIDATHÇÍ–íOTgÆoÆm`‚bY%Ô¡ëKÑ)n*±nü Ä‚Jk±¡­]'Y+nÕMÛE쇺it± ¤dàƒ ©b×dhkZŒ¶¼Ø`(âh%dØ:âNæÌy~ûaæxØÝÀçËÉu¿\×sÎs=€ˆˆÌ=,v‹Ý’Å–?šqëfëæeŸEñ‰Ľ÷Ú÷…y5ój’’ô!y£~v¿ˆÉ?[ψË|1s=s=q91|Þ|þÍç­¿ŽâŠ.ˆo‰oy¨Á;Þ¹Ðüió§¼ W'®r9`b#oÔýßl~9ú?ú"ðTÛSmq?Âܧç>-Ïå>—»ôýhÁKáÕ—_}às”"~À†MåA‚ëþ,läcõF¿Ágðz†~t”ì”lØþÖö·âOF†¡tqébC/Ü|ÌÇØ@ jA€ˆ+âbT—ê Ž80±‘7ê~ƒÏà7ô ýè<æ§œ9þ>(|* |E»^^zwx8um˵-×¶˜‚׫®W]¯‚Ê•*€÷˜÷˜÷˜™×·ê[õ­&ö¦yS½©Põ›*{•õ]VÏ©žS¦žšÙ›¿7øWtÑ׊ˆ|WçkÏ×Â÷_úÊ}åªÈJ;‘v‚éë7fnÌǘcÌ1555à<ë<ë< îw–d.É\’ ƒyƒyƒyæ@6 l»f×ìä”å|˜ó!Øÿ”––ÀôÕ£7·ßܮРµ¬µ "½Ñy$ÒŸX•X¥<šMÃùøögÚŸÒ?—d•d™ëÊו¯+Wº+Ý•Î&g“³ ÜÙîlw68†CŽ!è¾Ü}¹û²ÙwnäÜȹ(=\z¸ô°_u#£>£ª_»§vÀÌ¡™C E¾JøJy-9>9^¿¡ùwúwšÛÞ뺙w3VûWûWûa›w›w›::: ¥!¥!¥ Μ)8+zWô®è…¾“}'ûNòËëòº¼.Ètgº3Ýó~öŽì:„܇Àë×AçË|Ñoˆ~ֶ϶Oy`j|jʽÕÞjHXd¶ÑGŠ›ÕŽjGµ²vgíÎÚmƵÎZg-TäWäWäCض„-Ð{°÷`ïAHt&:P*û¥ì^ýùøÏÇAß#›X8±M:•tJy,꽇uëú{Dº7woéMcÏtËô²ée2Ó–Üfm³Š,^0¼`XÄÚbm±¶ˆ,ï[Þ·¼O$ébÒŤ‹"«ºWu¯êÉ-Î-Î-ÙÔ¹©sS§H{M{M{ˆªT•ªR¤uYë³­ÏŠ,¾›Ö™Ö)3ž¿\ª»TDZ÷¿ÒÿŠH¤)¸+¸«¿G¨ˆîØÿÁþà‘Ý%÷¾õ]ò]ß_º/åûïß ðèΣ;î€nÓmº îÕÝ«»Wºè¢ ¨5jZ“žIϤB%¡’P ø÷ùßö¿ ã£ã‘ñÊWfœÇ_âo…%…% £Î¬z"¶ˆ Ô?´)mŠ0µ|Ã7(.ÐD¨ÏU‡êê©§¸?¨ê'õðe”¡Ô?µˆ!¬¾$DL~* ?*üÈ8šf;ÿ“{V>±·‹'ö>ödÞ`ÿ8–?M¸[§IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-8.8.png 644 233 144 2507 13755454066 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜüIDATHÇÍ–]hSgÇŸ¤¶M-T°¢hiC;iA¼³C‘*ÚKý¨ø1'‚sÔ9o†±àÅð‹a!Â6­nz!ÔjU˜®C2–Šdf³@D¨XÚYœ©‰69ïy»HNNª»õ½9yž÷ÿüÿÿ“÷á9¯€ˆˆ”çžÎyÎyÎÙØù±w­v­ö^ÊÆ>ŽVGë£/aæ™™g*ÎUœ3£vlí[øÂz›¿PÏÊK¹Ø‰Ò+¥W¹ø(´/n_ìš•û¡ìjÙÕ¤»¯í¾ÐÛÓÛÃ'0…TlDøPõ¨R?±d, yýœgÖ^çR‘m¾m¾é†¤k¦×L×Ke–r)—ÜrL)º\tYÊÂÞp"œ9uäÔ‘SGDbC±¡Øˆ Ê  Šè;ú޾#âp;Ü·HØö†½“ð}±>ù¹h{Ñv)ã’qÖ8+·¤´Æ]ãÖ¶¾å'ëðÁçpùÅå`öèro4ñàØƒCÇçñy|ЪZU«O§ÎS‘ÊHe¤Òþc‚§ƒ§ƒ§ÿ¿Ä³Ä³¢;££óð =ÅÒËê[~fÜqW_áúáz0¿bÒºwëÞ{7 jvÕìªÙЭ»u·†Úhm´6 ÷›î7Ýo²ñ†@C ªV-¬ZÝf·ÙmBm°6X„àhp$8RЋ7¬_Y}ËS¤h}ÑzÞ)¾^|]D~‘±\ J:•~~-’žšžšž*2Ð3Ð3Ð#B’$Iúé§_ò+½.½.½N$Mš4". \ÉŠ‹Èr[nÛxY`éåôs~œ"f¿ÙïøCÄh6šE‘J«.â‰,ˆ,©ÞZ½µz«Hßξ};EJB%¡’ˆßï÷ûý¶NÈr†œ"ÞýÞýÞý6¾8^/Ž‹ ž<9xÒÆ³×ÒËêçý¼Ùcz<ßc!BL$Ž'Ž&ŽBSySyS9T¸+ÜnhßѾ£}<Úõh×£]P÷²îeÝKÇÃñpšÍf³Ù„òxy¼<-[Z¶´l±ßÇc‚‹þg‰ˆø~=‡÷ΟüÜ7Œ{ _Œ0šM¦ÀSLÝ©;u'<Û÷lß³} ëu½®5GÍQs`41šM€úLíU{m>ÂFÀèåõ³~þŽ©5j )íÒ º¡`^-Ò‹ô"ÐõCý° ?¤‡ôh—vi×$ü½tL-SË æX*–ˆ%ÞžcoO~Ú\m.ÀÈOþˆŠß(­4ý“~ªŸ¢ù>àožótDGte„àÎsòønõJ½"“çËóçôÞžüïì·ò½]¼³÷±wóû>äâ;3­IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-10.9.png 644 233 144 3047 13755454066 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÜIDATHÇÍ–ÿOTWÆßa‘: Bfƒ5téLѺŠòU`5+Ú·i«i‰ðS+²]³±k0!k5X“ºY£ÕÚÅlCjˆÄP"±)iC]°°±q»„v1®jÙvÊ ,ddî{>ûÃÌåÎö/ðüró~9Ïóäžû>÷ˆˆÈÊøS 鉤'’ÒbqÒ^+¿¼zyõS]±øBlÏÛžÿ² ÒßJ ãÝŒwÛVlÖÍþÄý"~"Ÿ™—•b%R®¤\±íˆÇÇàÅ/n\þÓX|jR{S{èÐxµñ*Àûïw²¾ùv`vÇì°b³nö›ûM¼D|9ö#~Hþ ù›R–¥,œªœ*Ïïb ÿòÀ³µÏÖ|cÿÆ®’ : 8qª@ˆæ $Äf=Þoî7ñL|“Ïäépmwmçêž«KýKlÃíKðZökÙ&ŸÖ œàNÐCz Z­gÔÀ† ¬Ø¬›ýæ~ÏÄ7ùLþ˜ë( ‘?VÝ¥ïÒ— ?Ñ<šÔ`Ôu¡Å JýB•¨Ðïé_ë_ƒ:¨ªƒXkŽi¦—"eÌëizš>£eiY êcø°kn×0ç_:Ê)‘ug õ«Ô¯B®M>9ù$Dÿ @ WõÆz–(ÖâÁd‘EV‚<òÈrÈ!ÇJ«5£f€?p‚j»ÚÎÞ8þê‰á‰a€ÔPj(äào1=ñ7váÿmjljÕ`˜À/ºx5úŸÑ{£÷,Â;#wFîŒÀ¹Ìs™ç2Á7î÷[u#d„ ëÛc¬e¬e¬În=»áìÔÝL¾1ùÆRwòí[·oy´n%""Ÿ‚îgºŸ½ @½¼gø¥}/ícÑ‘÷€{À šWój^Èäò°©Sÿ¦~X3¸fpÍ øËýåþòAmcmcmànt7ºaËù-§¶œ‚§÷æ.Ë]ÆâTMøñðãêeè9ÓsTJLðfZMZºß]þî2Džb#áòÏ»æºæ »"{[ö6¸¹â抛+ ÇÛãíñBqQqQq‘% d±d±dÎ÷ï;ßgåO»N»N»`ëý­÷·Þ·ò…‚¾‚>8÷eÇÝŽ»‘ë‘ë Gxl@]I’ßÛ?µÊéw&_Ȭ»½'}OºÈê߬~uõ«"Z¡V¨ŠhÅZ±V,âìvv;»ei¥u¦u¦uŠh«´UÚ*+_;V;V;&>>>"²óðÎÃ;‹Œ×Œ? ’¼Íñžã= ŠØËìe"6‡ýû lpHÔè5zmã’¤h²^6‹ˆˆËÖgõ}FD+ÒŠ´"ÏqÏqÏq‘©ü©ü©|‘@^ /'2Ÿ?Ÿ?Ÿ/âîpw¸;D¾°/ì™.™.™.ÉU¹*W‰xy_÷¾.òù/oµßjqû<6M\"[¶ˆÈ”z[½mOG¨*T5ú™,}8ô¡ˆ­TD„Wâº"é¿N¯L¯ g„3Â"e)e)e)"åGË–ñL{¦=Ó"ÕáêpuX¤´´´´´T¤,£,£,CÄYé¬tVŠ„á@8 Òžß¾¶}­HCY}f}¦DªÒ+’+’yEþy­îZˆýÏ £ŸYS©5µ6µ÷Í©Œ~ýæÞœëšëBE®Gú#ý S7iL“‡AµªVÕ Ê¥\Êæ@s Ô Tƒù$òQä#ðú+ü(õP߬o¶¦’Ù¦½M{!æ§nÄ…­;©þTÈóóKü5hÆ%ãR‚`?ûÁA#˜àW'ÕIuh †[‰'¨_©fÕ `|o|Ï‚úYÿ·?LüKüÿþ?AÅWí¶ï¶[ÎOŠ>¥OïDÃѰåüôÑC¨¿«[êÐO?ýÀ A‚ ÆÕ¨ÿ=Añ§¨/êCS#º_÷7MçßíØí´;ÿ£û¯|doì}ìѼÁþÛÅÉddœ£IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-23.2.png 644 233 144 3031 13755454067 15024 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÎIDATHÇÍ–ÿOUçÇ?æ•Ë%€Q‘[74õv\"±ÆøÌJ •Ʀv6s»*Ëìû,QC\\êåFüA²8Ät›XÔXLûS²J¬3z•‹+ò¥½îÊåž{ž×~8÷xÈöx~9y¾¼ßï<çy>ç‘ÌÄ[ ÉäNJ7qÒ¯íxÊ)o¬ø«‰OÄA{[{ûÎï!ãxÆq€­ Z{6¶òVýÜ~›®ž—L±óÛç·kÅ |ÞÍ7?e‘‰?ég§³ó?:|pþƒómmüFúFú¦Š§ŠÁÆVÞª·ú-¾¹ürèôE`ÞÅyµG0ß1ß!Ë__þzÞ‡fÁƒQoõ[|¿¥gé›~²Š²ŠD ü½ò÷œ6î} u¹u¹–^¬8ÌaÒ@ëa€xe¼’(¨^Õ €†6¶òV½ÕoñYü–ž¥oú±?儈ÈÑŸÃŽÉ“ –Ä®éwcÙ±l0¾Ž ņˆ%œ*#hÜ1î€þ/ý‘þT¾ÊWù0gíFyŽ”ú‰þšþ1ý^lql1½&?ìÜ1D,}ëS~!"â9ΰ3þ‘š¼6x ø%¥ ÖªµDø‚¯ø ŒqcÜ:é¤sŽ‘ \àPI%•vX…TH…€_áÅ  JT þhò«é„^BŸ^ÓObÅNü]]Þ­íÖ,:ãgÁÜ@ ÿB²?ucÅ7VØ‚·úoõßê_¯ÀWƒ£ƒ£ƒ£vÞ(7Êrs‚K‚KÀÿc¿ÛïF}SxýôõÓ¶žšÝ]º»5ýˆ±VDä›Zèjéj;=¡#¡#ÊëŽäœÈ9AtËÒ-[2ÀsÖsÖsü†ßð°¬uYë²VØîÙîÙî÷÷÷¸ÿðþÃûmC·÷ÝÞw{¸u·îÖ¡¸±¸¾¸Ü¿ÉIÍI%Úwh | \yáóÆÏ!Þoú‘ø?]~—_µC$‰B—óÒÂK ¡îwµ…µ…¶ÀúæõÍ뛡¬­¬­¬ |¾ßt¯ë^×½Öô¬éYÓ7Ëo–ßœ³R®W‡ êêêìøOï¾rò•“Ðü‹–÷[Þ˜Ý?»ôxê—©_ªvA_à\à4îªýããöÖ V” ”@Á±‚cÇ ¨¦¨¦¨f&g&g&!ÇÃqØV¶­l[x6z6z6B 3Èäÿž`e°2XióX´³h'DƦbS|SïL½*œ)™bÜãLÚž´=ª¦‡§‡áö‘`s°R§ ¥ ÁÁ?<|ð°-àóù|>”T•T•TÙñUU«ªVUÁñîãÝÇ»a60˜ @MM ¸V»V»VCc¤ñiãS÷ýpô‡£`ìLü{${$xœ~:ý´j}¡µÇ.¿zùU8ù·ÎºÎ:åMê!Z˜Yè(t@Ö†¬ Y ©¡©¡©¶Vo­ÞZ ›36gl† G…£Â¥¥¥°iѦE›Á•VX Îg³ —¦¦Cúg®RW)Ñ3×{ZzZ”.y/yA?šØc|bž¨þ¸úc˜ÑÍSòä¡+¡+J½z z9´<´¢ÑŠhè¹z®ž c¾1ߘŒ½Æ^c/¨<•§ò`âÜʼns©ÔFja|Ïø®ñ]0üx8>G…>zì}ì…gC¦TÏVωSiŽ {Ž5Wsì©ÊVÙDžÏ¥«êªº ªUµªÖ9óÊ¡ÊjZM«é9›+BÄîÓúóH©­gé›~’Ì1üHd&}&ýOEÒXßUß%Â_DDôzî©gꙤr&þ}ü{ѵmž6OÐ&´QmT„nÎs^D;¥ÒN‰hºÓb"Lñ„'"²Kš¤Iàb܈¢óµSc’jñKSý•ú+"Ïõ-?/ð¿ò…½]¼°÷±óû_Û£x"¿6¼IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-173.png 644 233 144 2615 13755454065 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜBIDATHÇÍ–kHTiÇ_ÍÔa­Õuª ’‰„˜ LÙ” š0CeÅRbº¸ê¶´ô)Û…HHw­…• é¦Ñ¦A¬©Ešfµ_$-MÔVËKi3ÙÑ™9缿ý0sæLµìgŸ/Ãsûÿÿó^žó Bîý¸ÐãþhÄC7‡nŽ®öø*l Øòä|yêËS••ÚSÃ×óz½¿¾?Ÿá„\ ¹`óú…°-f[Lè"¢Lu¦ºØsmÏ5€Ú‹µù ^Þy`Ò6iÃ×óz½Þ¯ãùã‹ÂOø…€ùó† $8$X°l²lZqÀS0°ÒÓÒÓFæÌ“ ¾Â“6`šit{ãçëyo½Þ¯ãéø:ŸÎïÑ#À¼Á¼AȰgØM< Oÿ€üeùËt>wPL1a L+ÓêNu'N­²€Àðõ¼^¯÷ëx:¾Î§ó{ôˆ÷öd2+8+PÜí «Ã Jw®;7_@R"]Òʬ2£Ì€º]Ý®nÕ¤†ª¡ ¿—viùµÜ(7"•nWœ+·ŒQ)‹|¸™L%S¤—ߨJ!„°–¡˜†MÃÓAÐÞ4ª¶º-n n2†)(ñ^sàÀa¸R‘ŠT€_9¿ºm©¶{<øÐ¿¸1à2=7=ŸÒõx…U´Á¾‚}À$€'‹Ü‡Ü‡ ž3ãg^œy½ƒ½ƒ½ƒðêö«Û¯nCÙѲ£eGáÜй¡sCpiöÒì¥Yè+ï+ï+‡Þµ½k{×ÂÉ Ú ú^õö"}À5>¿WWXÇAÔd×dûÊP~w®r®Â¹ã¯Í;š ¿×q¯ã^t¦w¦w¦C‚9Áœ`†Ô]©»RwApipip)ìmÙÛ²·,ñ–xK<¤ÛÓíévˆˆêŠê‚gξ³}gqê|2«zSõ&]XÇA [¶È«”={h¬¸kÕì‡Ùpå›+Ö+V°Œ[Æ-ãÐXßXßXÏgVYPYPYy¹y¹y¹ÐÛÛ ‡­‡­‡­ÐTÔTÔT±u±µ±µÐõKgbg¢Ñ¯½]€ˆ ´x3úfhò\{Y£•j¥F㺌uë2 ÖVk«µñw%ïJÞ•Àò±åcËÇ muÛê¶ÕF~råäÊÉ•’œ’œ’ ÖõÖõÖõÐùX>öm(o伉ñ‰qÐõ ¡]×®ôUISÒ„B!Ì"ADˆá3w´;Ú-„Ö­ukÝFü²í²í²Mˆ%K– ‘ؕؕØ%D‰¹Ä\bÂc±ÇqãÖ[7n !¿•q2Nˆû¿=Èyãƒ1Ëï\ç]ç…ðéñ1j¦j¦€?={ÎWJƒÒ Ÿ°¥ØRl)P_P_P_`¬ÈÖª­U[«àxêñÔã©F|¸}¸}¸Ö$­IZ“‘ƒ‘ƒ‘ƒ%2g2g`*öm×Û.ãŒTí¨v|tÆ>¹•.ï-Vz”ãVNœ*ž*W¡«ÐUhxŸü>ù}28†CŽ¡ÏÏžë˜ë˜ëL„Lˆ êߪSu"A=­žžüï­´–é¥éåtô©}ª7´l-ÛBá4ÖÑÏrÈ!ÇoŽÝ‘w䕲BVøÅƒ•ÝÊnò½oŽÅ÷ÇÓ3Ó³Ïæ˜ßä'+$+ÐÀ;ù©€u¿º7Üå®1‡X@a@>ùäÿ‡àŸ©¢ )oªKÕ¥¸¹ æ©yzÒÝŽš”¤¯ÔG“Î~+çìëbÎ¾Çææ ö_"PJÏÁâÁNIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-5-red.png 644 233 144 4074 13755454063 15523 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜñIDATXí—}LTWÆßû1|téRH,(3k¬»~a0¨¬¤ ê€I©F¢£TQA#îÆ,¢M«©H$,²]’j°F­[‚3˜5TMkmX«¥É6q“ ±uf¢c5ŽRgÀÑ{æ>ûÇÜsïɪÙ잸ï9ç}Ÿß=ç¹ç Dñö%4q^ª;Õêžj)=)=)=å¿—™ÌdvãÍ 4ˆ«-$“L2ÄXmáóy>¯Çë'ê‰óyÌ| Ô@ ¢+qŸçóz¼>×{9‰sã ŸˆCâ8äŸÁW(¯6¯6¯–½´ïhßÑ>õµðãðãðc$Hˆ`Ãà‡~@µq>Ÿçóz¼~¢Þ„O^ÎGÖ×Å€þ ¼@É•’+%W”9ÞQï¨w^hM®–ª¥PØn–ÃrV¨¤+é«PŠ•b€*9JÀv+;•€:]ÍSó ð|ï¨7êÂËëëÀ úÖ×u4Á%¸‘|@> èü'Ø[ì-ö¥BÛ¡îPw ¬t*J' úU¿ê0‚ñ1Œƒ EÀˆ–ïÇ:¬”Nå°rPw¨ª"ÌÓ¸×ç<œ,w,w,wÞ™Å'X›¬MÖ&u¢ï‘ï‘ïžhu¬•µ²V.1Ú8Ú¡É¡Éð´ìi¹^®—ëûðÃ5‡kרÐ D—âR\&À(ûˆ}dŠqlç±@ü3ñsñsBRÈÜÿÙן} ª£Ö³z ©~„ëë+›ÀGj0;?;?;-ƒåƒåƒåz¢l°#_E¶-4ƒ.]¾t9Œß;~/|ùö—o@÷Üî¹phÌ¡10àð˜wDݤnôúš×ç<œƒþyéÁ¥—4ÞŒy™—yDð€ýÈ~4ƒ–_*¿óÖÏ[×Ö^[ ׇ¯›çáS| øß›zƒxˆ‡€®§ésΧâ Ç Ç Ç ÃBlaòÊ! Yæ0’ɀܳ¹g@œ N€”Á”Aó–OÍšš¢@‘9_]§®0„! lÛÃöúޙޙޙú¹ý…¨=ü=Ðè ô‘7*FŨH’´YÚ,m&ÐFÚH‰hˆÞHº¿6Ñ&"¢Âpa˜ˆh_Þ¾<"¢ÐêÐj"¢ËÛ/o'"x2ð„ˆh¯g¯Ç”=¢Ö©uDô]¥«Dâ9ñœxŽ40’‚þ ?è'/ç#±B¬+Fò«îDɆ & ¤±4–ÚA® Ñöh;Œœ9i^©„¯À’ì%Ù0§pN!`œ¤øßì4+bÆJG.µ]j»Ô¦¯ä…¡@(}HÒli¶4{W3ÿÊlãmãmãÙßJßJßJ“õ('3z5÷j®y‹Ï9sÄ ø|ÖóY0åÞ”{Py¢ò€ˆ6ü.‹?`Ñ"ˆÈß•¿+WL¿¤)GÊ9ò„2Ê2Ê2ʈäËòeùrW@?ðv‡ÝÁ¶qÙ˜“…XQ¸q§M‚(«.«ª¥Z¨(ª(€1c2 íç´Ÿ„ûËûË~2ÇŽ(uJv5¨½V{­öZ,¢ÖIuRÝ¿ªâqz[Þ!K¥ÀRà?Μ»»»Õ¼ ’5ºlt™!€päVä´¶¶¶ÀÜUsWÀúqëLjÞ\rs‰É5Ê[Ê[ÆVŸ::»úÚ,6‹ÍÏË…±ÂXaìÔ£I€ÒuýJ]#¬Ö,캄.¡‹{%ö'w¯û‚ûܺw·)Ê ©fïÆ¿bÓ«œÁ@]Àî³ûÆëºÇÇ[š-Í–¦Ôë+Ù(5JN»ŽVAT![ ÖR*¥R¹‘\ä"‘”‚RðýsúÕÚaí°v(™¾|õ¾z³wcU±*`ËØ2*ÛÇöˆ°ål9w¬.V¨UêVu«ñ:«¯®î_Ý϶é7а<,»÷çnÉÝ’»…H´‹vÑ.œÖèj8毴¿UÒmé¶t[8?qûÄí·Yj-µ–Z÷~Ý»¥öR{©Ù»1g̉(ÜèF7€_pÆÊMb“Ø$c}Û‹Ú‹Ú‹Ôú]žiÉ´džk¿–ÒwZ¸˜´õ$$…ß%ÆÖ´¸w}§_èÝL%SÉ4€bbb /zàp§{Ò=éµR÷d†˜!f¬Ú›dÅCI|©ôò©=É»•ÿÁ»½î^ûJ¯Ò«ôê€Ñg¹ÏrŸåÓBÓBÓBìwº»¥n©û¯ÅÜjšõ’M¯hÆ^àEÞm³¶YÛ”L_—¯Ë×…ø¯Ð(BœÔyÞyÞyÞ8vä¹Cîðhÿ’¤ÿ3IWë§×^˜ÜxÂ*Í»g_äÝù‹ç/ž¿Øð®»Ø]ì.Æßâ㪾BµP-T/Ü•(#þ’¤+ÐÙ^åÝyR³Ô,5û 9puSuSu“ú—é#ÓG¦(7õ­JA)èÌ£Nê¤NÒŽÉ—¤—JÿcKöîþÄxþOÂaƒ° E´ˆŦˆãÄqâ8@ úÇw¶ˆ-b‹IýR¿Ô/|£%V%íÜÿ­eêOeTFeò‰ÃÔˆª¨Š* \. ïý&Þÿ[wÒÎx“ê¾r«ÿ 0%´Ã¢Ã?IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-8.png 644 233 144 2067 13755454064 14614 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜìIDATHÇÍ–ÏK\WÇÏŒ8#bŒZPHc ZJ0 JC°ã@ÁÈ”†,¤ i6B#$èÊP¬)†ÄjB4‰‘`S‘A´Vü µ*Q:E}ïÝOïÝ÷ž]iVÞÍpîùžï÷{ß½÷Ì‘LçW x&x&˜aÇÁï¼ùð•ð•/ºì¸Í„@,ûãG8Ùr²àÔ“SO¬Y/Öy÷׋xü~==/™âM¤v§vŠø!Ü8ã|øs;n†HO¤çî¾¼ûàÅÓO©‚•‘•€­â­bðb×x]¯ùüüòðú"zzø RO¤ž³—Ï^ÎÿÞ,æCÙÕ²«ïSÞ§¨ ˜ë@:éªØa=þöÅ:ïàu½æÓüZOëÛ~r.å\ò›å7#ívÁì¯pÿôýÓZo¿¨§žt0vŒó–y‹]PÃj€ðb×x]¯ù4¿ÖÓú¶9¸·_Ãõðõ°kèw0ß™ïeݱî°Ï>J#¬}k×ÚcÙX6–A}© U!Þø×Á++nÅÙwù\~­§õÅo¨ð'ˆ¬DVv>ƒysÞti¿ë¶u›$I e(CÀ#ñÈ—è ƒ „J|ó»îRl>—_ëi}Ûc¬í7¸÷àÞ·ø‚o ìoñ@9äxzS]S]S]ÐTÛTÛT sususu¾tªNÕéXÛõñà·.xú¶ÇXâxþñùG·î[0Ÿ™ÏØûkY}VŸÕç &êõ‰zˆ¶EÛ¢m3cfÌ„hQ´(Z³ñÙølÜg0¢"*šÏÇïèi}Û@ÆÛŒ·ªV.®\<°Y#jDŸ°­F«ÑËŽõõõC^n^n^.´Z­(˜(˜(˜€‰µ‰µ‰5oõ[ýV¿Ççãw†Ö·ýERÊRÊøJ$ô*ôJôØ‘srNDD‘„$$áæe/¹—ÜKŠì¥í¥í¥‰ ¶¶¶‹Ø""2 2àá%*Q‰úø<~GOëÛ~‚"ÖkëuàOãšqÍæˆÈ¢,Ú÷Ca•UV=™èLt&*’_™_™_)Òï÷ÆEBK¡¥Ð’Èhóhóh³‡§Š*ª<>¿£§õ?‡=c*©’Êw3·¶¶ 4³4³4²bY±¬”W”W”WÀÆäÆäƤï`Ì«y5¤3vÈ[©oÕ8ãŒ{‚FQcÔÀzözöz6˜ÕfµYí;:ÓL3ýÉ·òúئÚT› Â*¬Â¾ùB»Áªµ |ný‘úØ!:?Nç6Ü/h_xÌcPCjH ?ÓB‹Ï‹?rç?¶ÿ•ÇöuqlßcÇóû³ÉLŸgVï¾IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-21.7.png 644 233 144 2646 13755454067 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü[IDATHÇÍ–]l“UÇŸ®ÈÖ­NgPÆ,»˜ˆÉar³.è2™˜ ‰‰“‰"šÈÐ ã.4¨‘Œ¹…iæ×†¤Í $%H£„âD0N@¶¹Å ‚®K`S›²b÷~œŸí»·ºÄ ¯xnÚÿóõzNÏÿYþÈZšµ4+?…³¶Ùþœšœšå_¤p—Ž'O^y î鸧 àÓ‚OÍa+?³^ÄîŸÉgùeØŽl¶ßáKã·áé•O¯Ì¹/…[#à º‚Ó:4k:Ð÷yßç¼ ßN| ð‡ïØØŠ[ùV½Õ/³¿¼ý/~¸+tWÈq ²çgÏe,{ÄûJ*á/<ñøüæüÍ©²À¸ ¸q+'Že“ØŠ§ó­z«ŸÕßâ³øSóVV‰@]C]ƒë“TÁp/ìöìöX|Zx—wqƒ×ãÆVc+IPÀllÅ­|«Þêgõ·ø,þÔ<öVN‰ˆì_õ¿×ÿª@ëׇµ…ÚB0Юk×ÑÒ“*kd3ÏÌ5sA ¨5ÀSgTR%Q†s¦h¦ÍØ¢ukݠϤú«g6-Ú´Èpÿz{+¿)kWÜÏSS£ý£ýÀ³<ªRU’àzéuHR‡À˜2¦Œ) H`Æ$:::ÿaÊ«¼$Òà1Hó¥ùSƒ•µ§W¬ë¬:ù‚ãÇì:<4â„¶’¶m PÞï€w.MwCwCw\^}yõåÕsãWK®–\-އ;Ê;Ê¡{êãì³Q‡s?3?3áJb¼i¼É|v¾¿ó}0/¦æ³\Dd Ž~xôC¸r*º7ºW5.M,îZÜE²j²êzÕu(¾T|©øDŽDŽDŽ@ÓhÓhÓ¨}¦Ovžì<Ù9w°ÈÈÈX»yíæµ›¡ö\íWµ_ÍÖ%»êëéëQŠ…b ŸHÍ#ÆÅ¼¶¼6å‡D2‘„£®÷ž¸v¿Ú\Ñ\a¬¨[Q·¢ZõV½U‡ðéðéðið”yÊö#[~ôçGaUûªöUíàóú¼>/L—O—O—Ûý*·Un«Ü}fŸÙgÚ~£Ì(3Êl ı”DK¢%QøæÁ³…g m>óØÎwÜm‰yĽݽ]ùáÏñ?Çá§½#Œ|¹ sÆrÆ`σ{ØóÄ[â-ñ0ÖkŒ56aEiEiE)ýAÐoû‡ú‡ú‡úm|Ð}Ð}Ð ëV­[¹n¥í7ÇÒ_F&ò&ò€™üSù§”?Kíœþhú£‹DÎל¯ù¾xø×á_y>L.O.—™ãÏo8Þ â¹æ¹æ¹&èt:dÖröåìËÙ'’[š[š[*’lL6&E666D¾„/á9·ëÜ®s»DjKk—Ô.™-Ÿá~ž—egÆÎŒ‰ÈüxM¼æâ¡5u àÅ7^|þÒS§òÆwÑp4 Qg´8ZŒŠ¾mŒ6ÂíñÛã·Ç3¶¨0V+­^«×êyÌcLnœÜ8¹Ô˜Sc[óÄ<ø:1šEùšùNñalsû›–žuK7l±teVÇ2uçÿX’dÚaœ7ÎÿCÇŒQÀ5ᚘ£cÖ °=ïÔ7×7ƒêÐúÕÃm¸Aùõ[ú-4Þ#DÈV~ô¦˜[©»R ªÕ@ Åb£ÅhAcWæTëGÊù”ÓZ©Lå¿sïÊ;öuqǾÇîÌìß!øQ *@bIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-6.1.png 644 233 144 2472 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜïIDATHÇÍV]H”Y~ftœ1ÝÛ¬›‘Z¥­f7¨.ìB±”¦ WLq‰~ «Â.„5°‹ X –„¥vÙ"Û¢ð&·ÌÂ$ÌlÉŸœØe/qg§õû9çÙ‹™3ß×ÂÒ^zn>ž÷¼ïó<‡sÎû€¼Ô¤³ÀYàô&±ó÷Tx*>ù)‰/™¤£ÚQýké»è»H’+¯¬¼"Æ-¬æU¾½°øíz*Ž@ºîºî:~#ÝYî,€,ÜY¸sÝ×É„éud¨*TE’o3ÞfH'I’æ,É\æÊ2’qÆ©FÔ†Õ|*_Õ+>ůô”~ÒÈüÒüR€ÜS·§.ûr²`üGòtàt@éé·Hžã9æ’F܈“¤Ù`6p‰”r€$é ƒ´°šWùª^ñ)~¥§ô“~ðþÞvì kÜ5n’‘¤þ˜4i’”‡!cˆº1jh†F)þ¡5¹ÈE’:5jVX|$¶Š­”rÄ šAê¤p 'ÉwŠ¿ÆSãQ;vضŠ¿#³g²gâ™\˜z7õ.Í[ÉÍ“æI&äïÌUë%I^à^ ¹–k¹Öïa{HsÀ0Hö±—½¶yCìû˜HósÊœ2É´~ÊOÊØ¥Gä‘3GΤ×ù¹üAïÔ;Ót2r,r(rˆìèîèîè&Ÿ5=kzÖdéɨŒÊ()OÉSò”ïnênên"ǶŒmÛd¥Ëú6}›¥gé'ý¤Œ´WcWc¤œ Iy U±4÷éœÎO–——“¡ó¡ó¡óäæÆÍ›Éí/Ú_´[F´f­Yk&ë‡ë‡ë‡­ƒÒ×Ù×Ùg-”æ/Ú~m?—R>(}åÇ xx|± (-/-ä7ผÚiwß“¾ç}Ï7xƒ7Y¬@PQ_Q_QVVV =d»l—íÀ®»Nì:ÎÎÎÂ/üÂoåa“s¯s/ÜIฬô•'Êñ3ÀuÛu@0§ê|cµ±ðx=^Ø0±abÃp=~=~= µµµZz™‘ÌHf¨{Z÷´î)àoõ·ú[-¤…´ÍØ"¤Ñ\Z?åÇ ˆ;âŽã`ì6vø¯*ò~λ‘wȹ–s-çÐÜÕÜÕÜø}ƒ¾Aàuùëò×å@L‹i1 0FŒcÄÒ×§õi}@?úÑo3–ÀÆÒ(?­Ÿòãâeñ²ÑaàaÿÃ~ ãð †ÅQqZõ—ÕµÕµ@p48r‹r‹r‹€õ-ë[Ö·U U U Àöðöðö00«Ï곺¥ŸÎ ç„—×åuy­¸c‹ôI´Ô<¨ôÓ~þëVò­ñÊxe»EY‚‚d´-Úm#űF¬!e¥¬”•d4 Gä(%¢Ä:ä±ã±ã±ã¤öXë×ú->÷Œ{¼•¶>¦M-L-ØúØWæ}ó>". d­=$±LÈ„LXq.p ´%u÷R&Eãÿîcïuþd'6Óÿ¥ù’äm±J¬¢.ɨŒR2Ì.v‘ü“óœ'夜”“$'8Îq›ƒ R²Û¦ Nš“æ$IãƒÙþ+—íëbپǒíj¹½`ÿ©{Œ$+MZIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-39-red.png 644 233 144 4245 13755454064 15613 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜZIDATXí—LTWÇÏ}ïMÄg´Ä-¬@ T’•jD²ò‡.RŒ†M\Æ@M¥ ‹l—K‘›¥Ñjµ¦5jìte¦ÀZ#*0² ̼÷¾ûÇÌ}óf’ÕlvÏ?ù÷žs>ïÞï¹7¹-”|LXk´­F+û—g è½î÷ºßë^Ÿ$É’,É÷OR%PàžVkI"‰$î¾¾ZË×óxžç÷­'¬õåÑóí£}´Oèð_-uKÝRwÇ+¶Ÿígû5°É°É°I\Èy”ó(ç°mdÛȶ`kêÖÔ­©^ŸÏóõ<žçãùy½·óð{_?²Qx-¼^Ûø--ZZ´´H.m¹Ñr£å†:ÏñÒñÒñ€"¦1…)L°Ã; ùžy¾žÇó|<¿o½ÈÆ·ó‘)XF…QûEž õzêõÔë®ä!çsȉ!xLSãÔ8¸äJ¹R®äD9QNä,9KÎÒùžy¾žÇó|<¿ìS߬¡±ÖÁ:ˆ¤j©Zªn{À,µ–K+KûX­V«ápµÍ•Ï•ªÝù³ógsòmù6 uøÚœ2¡LªÝùÐùpµÍ^›½¨«Ij|™¥Öò™å3W¯Ïy8† ÆáM«øS•©ÊT¥®°½°=µ=Å„'C®s69›N88àòî¨Õj5 Í Œ*£€zÔ^$·ÉuΛΛšë°½°Kv ¦*ÓÓuçá|¢ ² ·ïQïªwÕ»¦´cæc¦c&ØX°qÇÆ,[¶ºz]½$ýÉgÈ#¢¹þ_û%¢ù=õ|DDôüæó›DD‘q‘qDDÂ*a‹bQDDƒ'O‘ñœýœˆæ¦§‰„ôȈÈ"Ùªä*¹d\˜öKØ/¤¿2ž0ž ÇºØ±ŸýÁÍ÷Á Ô±°Ø°Ø°XÔ¾Zÿjý«õ€~ôÃ3ÿæ3ö3vÀÝ÷::£÷sbrbô{ÖÓ£Ÿi iÔùŽÝ–Ý@Ëï6׫õ/•— Ày8ýË–ã[Žo9®LËC®lW6€1>”²*e‹ŒúÜß.ÿv¹h f ÞßòþØ9²sD¿¾o¤oD·~ìÖÜ­9@òžæ<œOð´T´!ÓiÈÔzÌH»XK#¢E|èHð‘`"¢ƒ+ˆˆÎWœ¯ "jíjí""JšLš$"Z¼(˜ˆhìû±ï‰ˆ¢z£zõ7‹ù´ù´Î 8;p–ˆôcDFC§¡ÓЩµ<¿_Õü¤†¤†¤`ÖÖhkÔŽŽë¾>úõQý|][]d\͸ ÀU‘\‘ †hC4 wJ>•ì­×Wyðò ö–°xÏâÏI\-®W®á×y¹)Á” GÚþ8\<\ r·Ü ‡šXX¥¥úo¿t/Hze÷•ݰýÃí@áxá¸^}™™6Ï‹ž áᘆR¢”±‡W¶¬lQ´@\,.9AA™A™A™DÒ5éšt­}T»ð·¦¯M_+àù•²Öù­ó1 «hš%²D=`á³Âgúü.ô»P}—³ål9€ ·¯|ù¹ü¹ìýÜ¢»…W ¯*Óà.q—¸ëï¹n?w=·¥M†xC¼!ÞÞÊÊ*KûJûÔ íþXð æA TàTñ©b޾;}w@epçu¼³¯?¾­ [òŽû%÷K¼û{æõ™eg–a³ö„Ö5BÍ›õl [–¬lñïiýUÀòXÞºfÖκX׊²ÇÚÛÑ«¦ÝÊJe¥Hݫ€ª~¢~ø_j†zH=¤­vŒ¶šGÍ€9ÀôÐôÐõgm'?+ÄŠ2‹†–EY”%™¼¬i”FiÒ§ÔAÔA$މOŧ¥çµ§µÙ´É´Éb;8ôÍÐ7Þ‚j†Óåt?¥mhÓiwÚókUN('5×ù£óGÌòÀ¼;yMyMòímŸ’&¤ ëÑð½á{Ã÷ Á"XX—‡nÇœïùÍŸˆOÄ'¬gEùŠòåD†"C‘¡ÈzTÓnš%Í’¦×®R¦”aVXa0ŽqèšGŽ’£ä(¯Ö4¬iX£fð|†Cˆ!dôÛ7øž4»äwôÄüÜ|}S€[»¶.¯vË*Ë*uÚ q…¸B¼@Ê3å™âm®é `°¨9š&ƒ„ !hû?)6ùñéíbƒN»¬`]kgí¬]¯]k¯µ×«]W¯«×ÕëUîLøLøL8333) i±Sì;ÿ–¥摞?àoèæ]Àxµ;&Žé´[oª7Õ»Blí¶v[;€YÌb“œ´¬§¬§¬Ç{íHÍR³Ô<àù—$ð–_]Ï8Í{ ¿ñ€íížûOÚMÏNÏNÏöjךbM±¦à´{^ÕN‚å³|–¿î°oaܯ.£ÿÒޥݵbX#ÖØ9p~U~U~•ú׸¹¸¹¸9×OÚQ‰câXÙRj£6j#ϵ#Úüêé4íõõÓÿÁŠY1+hm  Êï„!Bˆ1btåó´yÚÁ½ƒ)Üûq?–E²I6É«„IÂ$a—¾ÿrüËñ/ç«‚š‚š‚š\[Wö¬ìYÙC§u.ê\ÔI2äEò"y&ð>ÀPb˜ðÞÀÃcx Ž9Ž9Ž9ÈèlílílåS£.F]Œb[<ûàÙϾö™2L¦ [ªpe»²]Ù+*xÏá9·²h Ù>¹}rû$€V´¢uޝP/Ô õ­5N»Óî´Ï_«yFóŒæ1y}þúüõùÂñ[€-À ÔPC ‘Gð`àøÃÆD"‘é%½¤"îã>îC°øYü,~¸yæó3ŸŸù\̺Ùr³åf‹ð½ÌKæ%óº}^\'®×-ÏÄr,ÇòQÉê5«×¬^5Qõþï'>œøpâÃÔåá[·„o3r^Éy%ç¡Yn‘[äH\Þ.o—7äˆ@"@I-©%µTPAËä2¹ ±À«y5¯¸š«¹Ôåt9]NÀË×Ë×Ë’ø÷âß‹æßæ·ùm.f˜˜˜¨v(r¹ŠÜà5ò[ò[ò[u:R¦/Ó—é×,q¶;ÛíçÛýFýFýFyø¦¡MC›†H{À‘€#G@yOâIð#WÉUr€8È!‡ÿi“˜Ä$Pü—õ8Ä!ÀOø ?ÁfI¶$[’Á*WW®®\Íl2›Ì&#FY‚,A–°6A’¶3mgÚÎcù•CåPÍy&£&£&£¿ò¿=ÿöüÛó¡è¡è¡èÿâj5„$‘$’D€ñ1>ö(?}¾N_P‰JT’(* •„JBù)[¢-Ñ–ˆ>1OÌó ¡±4–Æ‚{Þ¶ Û„m@Ð`Ð`Ð ¨NT'ªŸ"Ÿ"Ÿ"àpþáüÃùÀHæHæH& Ü¨Ü¨Ü¨UªÆó/ó)ó)=< µµµ4æÑ¼™|’ñÇÿ}TC5TÃO ŠOŸ(>µ}³úfõÍwTtTtT¢%Âa‰;£Œ2 åjÕjÕjàUçUçUH/J/J/1!1!1!@÷ûÝïw¿tÕvÕvÕÏg?Ÿý|6ÀÔLÍÔ€ü¤ü¤ü$ tGvGvG7}oúÞôB¿ ý*ô+ØYÆ,c”ÆãˆqWô)ú}¢–b=Öc}é!¡D(JHÑ…K.]¸äÒX“¬IÖ$()£Œ2ØtŸê>Õ} \*½Tz©ôQ‰‡.]º °\–Ërÿÿÿ@7¨Ô ÍÍÍÍÍÍüM¦SàJs¥¹ÒÕÕÕ8ÜËʳagÃΆ±db$FbÄÿq×2:»yvóìæŠei²4YÚ—><øð äæ)ë)ë)««ÐÀ/ýZúµôkp´X[¬-V`GüŽøñ@å•Ê+•W€¥âRq©ÄÌ™3xzôéѧGÖ]­»Zw;âvÄíˆtoêÞÔ½ ¤ìOÙŸ²<:%:%:òº°º°º06q7ènÐÝ ú½l¯l¯lïÏ™SýSýSý[§Èö;Ûïl¿à®áÚÿì“K‡¥Ãm^cõcõcõósÒ+Ó+Ó+yúÚÇ×>¾öqÒlÖšµf-øÀìÙ³A;;;€yÑó¢çE$ŽÄ‘8OâI< <¸ñàÆƒÀî;Ýwº‹¿Åßh²5ÙšlL\¯¾^}½>–v,íXÎ*J…R1ù,—p —Äÿ ° ºÞ¦ô=DIÚ麇îü 303d;•ß)¿S~´ímÛÛ¶—Çü|ôç£?ʼnàÂàÂàBØãîÅÝ‹»Ìß=÷üÝi$¤@úÐÀ¾ð‚„ !HžÚõÔ®§vÍÚl;m;m;¡<ç:ç:ç5²`Y°, fb&æbF’HIêzZh¡æ¸Û²¯9.£Ëè²­õÈG>òéþ³ßœýæì7âfK¬%Ö %) ¤6VÎÊY9€r”£ÀKx /°Â +ÀðüÀ‚Y0 žÑ¢ßùsçÏ?ç*1ŽGŒÂ>¹ŸÜOîw¢77'Xμsæ3ï<Òît3ÇÌÝn‡v˜î~À©žê©òoß¿5òôk¸†kh½•ÞJoåÀ¤³ÆYã¬ÙöÑÒ¥7JnäFn„¿;OµtÂý<É|˜óÇÝŽ»wg³ÀY°í#ï@ï@ïÀ['{zz$ZýËú—õ/ót’GòHäì;ÆŽÃ ^ð¸•[¹ "‰»Ùh6š8ÑÛÛ o“·ÉÛ°D–È·}4-½I·÷Mãð5ž €xŽ ÷/‰§r—H¢EšÐä*$É$™$§¿8}c]úÇÔæ©ÍS›Ù–רkì5F—-Ú³hÏ¢=XǺY7높.  è8Ä"±H,‚ü@Ĉ®HS’)É”$1(b±ŠXíÒéfë÷LÇtL'ìsWö/žŠ•—————ÃæÙQ¸'f4äÖn¡[»ûH© Í_Ó4šFÓ¶Ö#9È¡û¦¦¦ÄÍ–*K•¥ JJ)¥VÏN\°_°_°³‰Ý€n@'1(ŠÅŠâ烎AÇ`ñg†ç Ϟ܀ÏyêôðÍ€þØã t¸âÖî?Ö-¬[X§}Q±I±I±éDùHèHèH¨`9]rºät‰«ÐÝÑûwª:U*imomom'YÊne·²`¦aš-m«««ö§ÃÂÂèCw>O[iÿ-—¿c©©©©©©ÝÃN.ã2.#MѦhüŸk®k®kîUQ.—‡¿´ÿÞŠ{+î­PÕYº,]–.þiGuGuGµ+eljljlJR ]&]&]öÞ^Å«xÕWç¦û:ÉM<ÄCô´.E—¢K‘¶ÓŒiÆ4ñŠVÐ ZKØ›`Oçé<"¶a¶dŒŒ‘1€4ÒÌkµèXËcy¥ËÒeé2°xï⽋÷b‰Ï¿îÝ3ºg¤-¾ø>ɯ˯˯KŠuµ¸Z\-g[4“šIÍ$ÛcÝcÝc%-Úrm¹¶”ò@ ¶c;¶d ’Aµ¨E-'œpP@þØÖ` Ö¸†k¸»MoÓÛô`'ž:ñÔ‰§xœ]n—ÛåÄ"“ÇÉ㞎£<’GòÈÃϹ nƒÛl¾ºùêæ«HôÊY3kfÍÐà.à@>"‘€ÞñÞñÞqàbêÅÔ‹© €R§Ô)uׯ7^oÌQæ(s`î6w›»sŽ9Çœ˜cͱæXÀºÚºÚºíííÈ †C}<>>*…IaRØîñõõÅ‘U†U†URâ=·œÆÓxHT¢<ž`ê3õ™ú€î7ºßè~c!QüþÿøvÕ·«¾]œŠ9s*¨¼Vy­òðå/ï|yø¤ü“òOÊ®à®à®àù×åÑAÑAÑA¤ÄÇããÉ&Ø‘“ëN®;¹ŽûlZj”¥Æù9ïéïéïéç<ǘcÌ1r~°ä`ÉÁÎ?_öù²Ï—-ìcœqÆ9wßrßrßâ|æÒÌ¥™K ëM¡M¡M¡œ¿?öþØûcœ;F£ŽQ~¯Mûx||oá-¼E"éizšžž?™‚l"›È¦…L…C¡FàͲ7ËÞ,¢¾Šú*ê+À±Á±Á±á.í£Å€à/ø þ€r½r½r=0þúøëã¯ßd}“õMða‡ ª@U *ðT{ª=Õ ñé.º‹îp'p‚DŠBˆ"„ð3öx{¼=ž¬’vJ;¥xXLÓÅtpX`DhÚ„¶rœ'Çþ ?x¨vØN8ᘫƒ@ƒºAݠ€è•Ñ+£WÜÂ-ÜÐgé³ôYp¯aúêôÕé«è£[躅Ÿ¡Êw•ï*ß• û‚ú‚ú‚ø™¶Ò¶Ò¶R+±+1Ã’Y2K¾«.ú¬舚¨‰ú.j¸†k*§r*Fù(å@kHkHk /Ôê ö3;³3;@(¡„b¦?¹?¹?° Y†,Cø›²OÙ§ì“ )R‚”¼21WÌsIvC@C@C€Gg[m[m[ 5¥”R ;×s=×/ ¯ÐWè+ÙKö’½wj¹–kæfYcÖšLM¦&ËËËXXÌ‚Y0Ã)¥J©R*Ô_[¾¶|mazb!bÁGÄC<Äó±\ >|>øüÛ‡FòGòGòWþïXìXìXì®þªmUÛª¶y²Œ0¡?ÇŸãÏÁéÓsÐ9è\÷¹îsÝw—$ÌÄLÌ ó¶]m»Úv!‡<ò0@ãh<žO¸°[Ø-솢fcÍÆšÌa´NZ'éµUmU[Í;Ü&·ÉmÚÿÉÌÌÐŒf4?X$‘ÈF.©¦LS¦)ÓCÆU‚*AÅKªLªLª$ç}‰»Ù|³ùf3303:‡Î¡s¸Žë¸ Õ¨:¿ïü¾ó{ Àà pAç‚Λ?‡£í`ÛÁ¶ƒØ^QTQTQ„¯U7U7U7gŸà¸°v;V`Vtþ™kó„Ô£õž8¢'z¢ìø\Ûvn¯;ÃáÎ`z½À^`tCôÑè£ÑG±•ÇòX 5ù‰üD~ A‚@„@AAïz>·Ï>¹drÉähŠ­ÅÖb«ôç©Ñ©Ñ©Q±H6+›•Íþ%‘'ñ$žôÞ9~˜æ‡Å¥Þ6Ï7×7ЇÉ1rŒ;ŸI7ÓÍtóþa„‘~`r™\&—”a;m;m;=hggØvæ7 €x¾œ/çËædNæœ—Ž¦ö¥Ú—j_òd¿:þêø«b‘"\®?Uq$âHÄ‘÷Î!yÈ#ÿD/zÑ+%øúQ? `Röaö‘šG¾xä‹G¾(ܦܣܣÜsª` N½ž¦Ù:žÜ¯ó5žÆ×|š?¡GÀSë©×[^oqý!‘pçðaчEšÏ>áÜ`ÆÍ8€Õjµ²jRMA8¶Žëý:_ãi|ͧùzäùÞþö¨æœæÀ0®ƒ±"`»Œ0TH-©%”–¬~¦^S¯ùÐ|h>uFu©.àQ¢`²¬”U±Ñ¼ÑŒa6Œ Aã¿i¼iÿIò;­Ùù9¦+âŠÄ³!\.Æ8`MÅF1«ŒpŸû8k;ØxñâMóWQEU¢‘º>‰"a`¨UÂjÒ{î]¿wÀwÅãÙZORع)x÷£w?bö«ªÛ8eœJÁªóíçÛηÁìâìâì¢Ã77=7=7 =c=c=c0¿{~÷ün`˜a†a°s°s°Î6­?[½3½ ½ ¨è¿ß||S£Ø¯òò;½ïôêÖž›J ûú$ïÁ@JÇQóÓõòõrÖÍš84á4|¼d¼d¼Œ:£Î¨ƒ]Ow=Ýõ*/V^¬¼å‡Ë—†¹µ¹µ¹5ð}A_=žFþBðð³pe¸’uͧ~}éíKoka_ŸÈÿ*ÿ+5Àïo.Þt*±Qþý³ïŸÁåŸ^Þyy'í-Ú[´fòfòfòàJÝ•º+uPS]S]SíäÕ^­½Z{Ž´i;ÒÞÞÞPªÕ‡ ïIßw}ߥµxWòû·E{Ñ­'S$«)«‰ y/g[Î6ù«ˆˆD7uäôåô‰´Üi¹ÛrWÄwÌwÌwLĨ2ªŒ*£Æ¨1jDÜýî~w¿¤Vþµükù×DV£«ÑÕ¨ÈÑ£…G EÛÛÛEºêºöwíùÓÉþ@@Dþ‘à³ó²Æ³ÆE´žL{Ô͸-–é7ý"’!""Ù#[d‹ChÆÌ˜1ªj£Z¤´»´»´[d¡q¡q¡Qä‰ç‰ç‰GdÅ¿â_ñ‹xzzЏ§ÜSî)‘V_«¯Õ'R)œ/œ‰™±»±»)x\0¢FT$¥'uÆ.—+‰žó#sÌÓgj#µ‘ÚŒvŽvŽv:h ¶[ƒgåYyt”u”u”ÁBÙBÙBìÙºgëž­PpºàtÁiÄaíòJÃJƒsÆøy°"XñÜûÁ­ÜHÞ’ˆyÛ¼íÜÊåß,¼ü1lLlLlL8Âì°¶ÃD#ÑØÃö°=œ6%BFÈÁÒö¥W–^»Ç²‡P`ù-?ð ɧùŸ¿•;?×#×£x6ܳîY)Ü`쫉”¶Np‚`Gí¨uÜꆺ¡n€ªPªÔ¯T»jO‹ÿÄì6»Yåe®Wk®o\ßüßK›ü4ç6çvjòÏZ³@®uÜ:ŽÁï™dÒ™üü…F@ÝR·Ô-àÏ 0ö>e”Q”š°Š­b ‚Öqëxªž×±š³›³u¥ž›ü/ìå ûºxaßc/æ ö/²þú¶kw–IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-77-red.png 644 233 144 4056 13755454064 15615 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜãIDATXíWmLTg>÷ƒÏEG©”uŠ_+**Kº‚ R£fƒš ‰Ä-Í&Ý 8Ân…J±²-M›Ð]mCQÒR‹uÆ5RlÔ,¦Újv¢ØXP‘‡aæ¾÷>ûƒyï½3qµ›Ýógæ|?÷œç¾ï ь̡×G9£œQNáiÐÙÙÙµ9Sf2“YÿŸ)Ò)˜qk$“L2×P]käñ<Ÿ×ãõCû‰ëCñ˜ñ•S9•‹¡þ„r—Ü%wu<*„ ¡Bb‰ÇÅwvÞÙyØuo×½]÷€¢ì¢ì¢lCç~Ïóy=^Ÿ÷{>ªÛ?'Ä qb(O(©4©4©”l½Òz¥õŠëyäyäy@‚ ^Lb“†0„!@׃~Ïóy=^?´Ÿýãçã#ë,qX‡‡þÊ d÷e÷e÷)¿ DP´T-UK…ÂjY-«Øj¶š­X+`&=èçñ<Ÿ×ãõuÀ!ý­³thB‡Ð!tÉÇåãòñ¶|q÷ÅÝDäWÚ”6"š-” eDDø ?‰_ˆ_-ºµèÑC÷C7ÑÓä§ÉD4[l[‰ÈO[i+‘t7pƒˆ9_¶¼l¡Ùö½Yž,MuYrd å½Mè…áÓFãSâSâSÐøxó£ªGUú“*°ùÞô½ Àc_j_ ̼÷ J¢±R¬d¶WMTMÀ+e¯”=3þûØïx‚v[͵škF¿Ç›G~ùàx8>ôÄŽ“;Nî8©'xÙ ;ÏÎå¦éÈéHxÒ÷¤Ï¼ÄïœxV¨+T;=vX=«€±Cc‡ž¿2ee €ÑÇ—_Ø 9^އã ÅWEýEýEý…Ø&¶‰m2çj Z‚YwU¸*@L“ ³¦³ÆìWlŠígÄOþÁÿ®ÿ]£QFQFQ†~nÅ'ZœÙœÙœÙ —Oð‘t¢Ðð[ä#€‡å°sã’ê’jØâÙò¢¨?ª?[–„Ä×”ÔÀ–‰-¦ƒæ~õ;õ;@KÓDM„Æ£³çfÏÍž ÇGbX FøUwªüTù©r¢³³Lý¦o¿uû-3÷.ô\è ™d’’dÖo¼}Я\øæÂ7†—ó÷ù *y/5]:yI_9~'¤ iBZ`„¤µÒZimu?l‹m‹m‹™Ý½Û½Û½[/àÑ6ò¯uéué´ùGçå5åµ ÍJ³Y¯[^·æWϯàU²•l…z@*0í…7à )Õ)Õ)Õª~H R‚”ðéŠË‹Ë‹Ë#’/Ë—åËíÃú_”;'w«° ËÕ13O8×t¯éàÝž¹=Ó ˆ¥²TÐVj+Íöµ1kcx¶glÏøÉ¬~ˆD«.½^z½ôºêÕ–IeRÙ­=3z ë¹$}‘‘‘6ôžà¨­ZUµÊ˜§2÷ìgg?ƒÜ´ß´ÃtkåZ¹ ^ÂK¦¿lü²nι9`ûBb¼g&ÎŒŸG¡~…6ˆ bƒo³°@X ,øek@éŸú•Z"”%›Z„v¡]hç\QïìuÖ;ëáÔ¹[©Šªx€¦—РÐÀÀ DÚFm–fpÝ3Ü>Ü9Ü Ø¢mQ¶(åm}’ǤcÒ1G®­€ ¨@¶Xs(‡räcÔAÔA$J÷¥û¿Ö¯Ök¡µP±¸»Z\-fîj¯j¯šfÄ—é…>NVÈ mËgùÆãì½¶·wo/«ÔïöIyRžtÖ%HóÁÏ=’KrI.¡;¹*¹*¹Š(¢4¢4¢ÔY§s7'7'7‡Uò†ªCu¨Là 'œÆ0†1s—³ål¹ÁÅæuÍëš×iõ»Üa‰° û‚¿–¢C7-ô„­ž„0õÛPÝ=Ã]÷9ƒ»ŽZG­‰»Å¢X @êõúÀàâ08cbb´:'ãÄ81îõ?†Qñ“0|Qô|ƒÔÆÝÏàn¯³×à®Ò«ô*½:Àé©Ä©Ä©D`ÕøªñUãl™ÎųÒYéì‡YœjAê…œM/#€0¸;*š¸Ûdm²6)w»»ÝÝ`Ó˜Æ8Gêèvt;ºcGn‘[ä–à_’˜„õ Ú)öEÃ…'¼äîùÿÄÝ Û6lÛ°Íà®3Ë™åÌÂç3~Mß„P, Å›ªCÛˆca}ú/åEÜ]/5H RÃÐj¸¸¾¸¾¸^ûSª?ÕŸêWnê«•F¥QGµQµQðØ‘Üaý¢è”pîÖ…êþ%ìö ûʧ|ÊWWŠ Å…âB@ úû·6¯ÍkóIW¥«ÒUáoÁÄ=a›û¿‰Eÿ–Gy”'ßuÞ'j¢&j€Ð#ô=÷ÍØ—:Ã63V÷…«þ7Ê!±/(µ¦ÈIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-85-grey.png 644 233 144 6315 13755454064 16010 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ‚IDATXÃ…—mPSW·Çÿ{ç侦—Q¾ÔQxÄúB[+­´½ôÅã ñF‹tP{âhA°­–kKkË‹v®–båA±\Tn±r•^Aa´pA•ª@ &‘䜳ï}¦3®/{ö9+kýfíÖ^‡ääääää@‹I³O.tw»ÇÝcu9ßæ|›ó-›™7œ7œ7¼&š³`üé¿ñ:^Çëo™¨™¨™¨a‡p ÇpŒd#‘ˆÐntØ‚-ØÂÉ“åÉòd’Í=àpn#cdŒŒ}P–;#wFîŒKùiùiùiÄÆëy=¯'¯Nrˆ?û¸´ô`âG+Ä<1OÌö8=Nsú’¼Ú¼Ú¼ÚŠÍcóØê¯»¹¹-þ÷€¢€¢€"\Xœ¸8qq"ÉŽ‘ÆHc¤À’%!KBÿÞÿÞïïÿ½?Þ³ø¾|þü~?ç«àr¦a¦7‘t’NÒõE½D/Ñ_>îüÎùó»9!Sê§ÔO©v%v'v'vSïüŽùó;H’<[ž-φ {°{ ‚ .¸lÆflð^À pM„N„N„"©£±£±£‘yŠü)ò§Hq×ÈË#/¼œú¹J¯Ò«ôËBº.¤¯.bfffæ{›èr²ïé¾§ûžhD#CÕ\ WÃÕ4žö¸=n{Î:Ã*Ã*Ã*>.e{Êö”í\…Ö¡uh0`*¦b*xfdFf‡»¸‹»ˆ@OðOD é!=¤<á³kì»}gŽž9zæ(¿©ïjßÕ¾«\³L)SÊ”ýùd>™O^¹+±+ïSe«²UÙ HgJgJg~rÅuÑuÑuqÎ:CŠ!ÅÂ'™ÓÌiæ4®Y;S;S;S…ëÂuá: ¾)¾)¾ îH©"U d I$‰$¬5°@üHüHü¿Æ_‚Þ z7è]LõÇ7¼nxÝð:ŸäÏïçñ󑼺¼º¼ºW—xZ=­žÖ‹­šq͸fœ…[-ƒ–AÒª­ÐVh+@ÅL1SÌ„†î§ûé~ÀWÑç‡8ÄØ‹½Ø `=Öc=H ù'ÿEX„E~Á/ø{œ=αtméÚÒµ,Æ!sÈ2b•ÅÈbd1ëb8É"Yäþ·¼Þo`Ê7å›ò‘¨ýQû£öGÈD³hÍPÑãô8=üo–àªàªà*Z`Z`Z`"%pÀx?`ï´Þi½Ó€å'ÊO”²NY§¬pÉ]r—X`]`]`R‘ŠTý_ôÑÿPöbÙ‹e/SœSœSœ_Ï×óõ€T+ÕJµÀÝÝ ‡r@¶ vAí‚ZRÒ@hÅ!§ÉiršþfÁîÇ»ï~,ªXV±¬bó›“ßÇïã÷=Û³2®Œ+ã+^V¼¬ø¹ëééalgÛζmŒ½4öÒØKŒÝ¹1rc„±âœâœâœçþ,‰%±$ÆD«h­Œ‰7Äâ ÆÄâ ñÄóü~?‡ñ1>&‘´’VÒÊg ’C 4Ï%õZÔkQ¯WÜWÜWÜÀ­¢[E·Š€uºG ?1~büÐfj3µ™@_z_z_:`£6j£@ÙÖ²­e[Ÿku•n•n•ˆ ‹ ‹ ıEl&Ûäôú}@)JQJ"©D'ÑItìŽXG¬#½üûüûüûÐ&ÚD›Àü Aƒ=ÜQî(wÐt¯é^Ó=àvØí°Ûa€²SÙ©ì…,d&aL™=eö”Ù@ìÔØ©±SÀ¼À¼À<à›ñoÆ¿´>h}Ð Ð šA3žå“8o9o9o¡—¨Ø?8E¢@QÀöÎèÑ;ƒû¦m^Û¼¶y${ÉgK>[òܼ’WòJ¨ª?¬þ°úC`õÍÕ7Wߪªª‡Áap€ƒC‡-¬…µ0 ¹;¹;¹`¬€òBy¡¼˜1/b^ÐÑÑô©ûÔ}j@wJwJw në&ë&ë&¨¬cÖ1ëþCÑ«èUôò…)HAJî1.‡ËárHö%ã%ã%£`°·ÛÛííPqnÎ͹áÞ–Þ–ÞƻƻƻžKÂÙälr6ÒRi©´àq¸G@éÑÒ£¥GËG/½|ô¹¿MkÓÚ´€`L‚ É É ÉÄ„ïµê¼þ¼þ¼^Œ#Vb%VD8.#ÅóŠçφ¯_¾Zþ«s«s«së;¡Ævc»±]ع¥{K÷–nIáí’Û%·K0Q9^9^99¢hÀ+x¯Dí‰ÚµHëHëHënVÞ¬¼Y œi:Ót¦ 6H¤ oá-¼X^°¼`yغþuýëúAªõÕúj½èj~¯ù½æ÷¨J©ŠTEþßo­·Ö[»ôK²opßà¾A-hAË¿‘K‡¥Ã?+Ÿ\xráÉ…9æ„ °„u‹Ö-Z·ˆ4Œ £Â¨ö«òWå¯JÀáÀáÀa@ÿƒþýÝ@7Ð ”PB ŒtŽtŽtƒ]ƒ]ƒ]@=Èd é†tC:\í'ÛO¶ŸÄßËMå¦rΫ*…Jñôe&a&YüwÌÅ\̽³UbR›Ô&µ¤•”“rRþø­Éí¯JÏIÏIÏmŽí—÷Ëûå¬uzàôÀéÄ1gÖœYsf!l†f†f†ÒSˆ)ÄÃä09 à!â!€µX‹µ€Ê¢²¨,€n‡n‡n\\\ ‡ã€ã€ã+Ôê 5ß,,– Ki’dH2$úà‘ˆÄÿ:‚C8„C\¨oÌb&çFn?9BŽ# “7Ç®X`…~yþëó_Ÿÿšßf_c_c_É"Y$ ßÕ lÇvl‰Ld¾ál”²Q@œ&N§=Ó¢æâ…‹.^vŽYǬcVîˆ\#×È5ßçGFF~~¹ÈE.9ô ‡_íŸG0€ ð“í…ÔDŸ‹>}®ð …YaV˜¿Ï›;6wl.g?“r&åLŠ°ÓŸD“h ¨¡†€n¸ÿén_‰•X Fëh­ƒüšõšõš•%´ -¨TªûO=§=§=§wìÌíÌí̘•Y™A¾<'ý .ßZ)Šb ‚Ú~kû­í7À“åÉòdí>|¯²»¶»¶»VRX÷vÝÛuo³’A2Häb¹X.–ƒùµÉ³Çì1@xÂî‡Ö‡Ö‡V|_¿°~aýBØl6@ŒcÅØÝéaz˜¾ÿ”£Çè1É‘Iöªÿ"þ¶áû$‘û¶¾#’¢õ¨v’8GâÞ˜üä¸|λͻͻMÌLSÅT‘®˜xþáù‡‘,v‰]bTt.Kçb‚Ïæ³ùlÈ¿2~eüÊ(DØ–Ú–Ú–Jî***.›üÓìjKı„;â;Ù÷ü'–ŸŸŸŸŸ‡¿¢ð=x¦!Ÿvwú´{„‘"RÔð5Q5íªf˜é—µÞZo­—ßf/³—ÙË ¢”RJñØ_‰KîKîKnÑu¿ä~ÉýÉ]Å^Å^ÅÞÎ CCC{?¿ûÊÝWî¾ø þ~êôó=ý°ßAå ð¿>íž‹®Ž®Ž®.|CaQX–ïóÇtcº1g¯Ê©Ê©Êvúé ŽŽŽœhlmlml%›T]ª.U DƒhÈü™ÛÈmä6º_ ¡£¾|¯ùV÷¹$ø‹ïÛv0“1y×e‹²Eá?…YÂ,aÖu^.—‡ÿë—¿¯þ}õï«CªíwìwìwØgm'ÛN¶–?ñ>ñ>ñJ²¤+¤+¤+Þee¬Œ•º09×Iú0ŠQŒŠ/øOÀW(þ<a¢Ý<Ô¡uB.«a5¬&¾‡ž¥géÙÿ ºþéú§ëÅ(i‰´DZBïH̳ÄüÓUãYãYãÙ5ñÖkµ‡ü·8]œ.NgÇ}qk}€®?ã ø ûƒv}íBÈE2ÁÝ$i$¤]1²:VÇê>جœ­œ­œMïH$’¡Ùâ§â§â§Û~ëÚе¡k0 ˆp_<ÿ`éþ+ŽÿA<;‡øyIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.7.png 644 233 144 2666 13755454067 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜkIDATHÇÍ–mlSUÇÏ:çV©{I1¬¸nI0 !Ä2BeS#DdsCøaqÌ5Â&!d‰1[ÉÐ&¡Ê'&Û¢Äbñ…d!qs/1›Éä.ÊFÓÑÞ{~~¸=Ü*ÆÏœ/÷>Ïsžçÿ¿ç>çŽ!„¹É§›Ûæ¶e›¶íMËŸõBÖ O|eÚm:¤­O[ßß9­9­y_ä}a Z¶Š«ù©ùBXõSñ”_ä Ë‘È ¤y“öPµ°jaÖc¦½/ö.{×Ôœ®9 p²ýd;[aââÄE€›Þ›^°lWóU¾ª—Z_|ð/|! £;£;íÈ|8óa! ¨¬¨lî;æ„ßçÂËk^^ðgúŸéÒú5ÀCzI&QãzŠ­âÉù*_ÕSõžÂ7ù˜¹jæ*!à•×^yÍþ¹™0ø%ÔÔ(¼xðá€Ädb@ߤobdPH# ,[ÅÕ|•¯ê©ú Oá›|¬_Bˆý¥Pq£âÈ|€x(1ŸŸF_|<>N<ÉT*Êr»Ü&·á6܆›û†ü^Æd ©§ßÍ¿›O\ß?? ‰»f}ùz¹«Ü¥î/µ~å7BñäÇ`Ÿ´ON>$Ã#¡‘ð/,‘%DÙK3Í€ . †j@VÉ*Y•Âäw¸Ãÿ 9WÎ%š4^‚$^ß$öäÇÉk» ÏlIÛ’¦’EÃÐRØ’Ý’ì[Ñ·¢oÅý0cÇÇŽ‡óç+ÎWüGÜ9æsBë³­KZ—Àá°?ÓŸ‰ì|äˆqÄ€þ蕚+5Æ"x»éí&0.›|„±D!úêàÔg§>ƒþ³Z³Ö,«ÝÑÙm³Û˜öîò¾ç}ܹî\w.„zC½¡^ Ø{À{À{VúWúWúï'¬V«ayåòÊå•°öǵ߮ýö^MþõdÇÉY Ý‘î$zL>B¿<£eF‹ @t:: §ì=Î'Ô¿[÷LÝ3ÀüKó/Í¿áŽpGÚmí¶v›%6å½å½å)„þ„?á}\×Ç-Çã®Tt–ûÊ})_ MäOä{³ŸË~N‰<{žÝøM¾mãµÖ¶Þ4ôüÐóPÜSÜSÜëV¯[½n52 X\\„ÁÁAð¸<.+¥“ÈreGNDNDNÀmŽ6Gƒžº0óÂL Ï8}õÓ«Ÿä=š÷¨ñ›0Ž9jµ2·®Üº¿62ü <2+k4kw7646XMÝMÝMÝ`´Ú¡ÈSä)òX+w(t(t(Ú°6¬ [yàyڳгÐò£É—á‰3€»Ùg³ÏÊ€H8U)>S þ£]õ]õ²ÚvÑ쥛–®_ºr|9¾1̦U£ekËÖ–­P6V6V6áÒpi¸æùæùæù`ªªª6ïÙ¼góh*oz±éÅ{éÓºÕÄŽþuô/%}u‚}æ.€·v¼µb sW^ýI;§-]+Ô ‘Ú»Z­V ±’XI¬Ä"ëŒuÆ:áöÐí¡ÛC@%•TÂuïuïu/ÈQ9*G!òD¤ RÑï¢#Ñ$ÛŒmÀ9½vWí.E¬í‚PºaéˆÒ•¤Î$d¡,¼§;pŒc’!6° ÀC 4Ò˜ÒÔ:Ñ”lðé?ë?ÿCÇôÀ>aŸ¸OÇÔ °¿”½uu ¿ˆ‡ä/ºCw€ $¦SÄù¯ùÚR~vÓ@àĉ˜2ÏJ9 /ËË@ÄÜ ÌÖw뻉³]_¦/SÉñ‰WÓ_MW+•ªüîYùÀÞ.Øû؃yƒýg¯‚ElIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-90-red.png 644 233 144 4211 13755454064 15601 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü>IDATXí—LTWÇÏû1€ˆË.‰eÜ–*º*AQp©+? hw–D›ê‚ÒnŒˆ:¶%¶ÄV²Ê" ZPSKØt-U’ÝhÐÊÔ°v%®•6þ`¦‚ íTä—È0óÞýîÌ}ófšÕ4»çŸ™óιç|Þ½ßs'C4c¿$×Z­Vá±çAH@k@k@kÆY‘Y¹~œVÐ ZÌ„Y%É$“Ì}À×g•<Ÿ¯çõx}ß~â:_=_1S±hñ‡/‘[åV¹Õ2,ìv »5аѰѰQü}ÓíM·7ݶ lØ2lNÚœ´9Éëó8Ïçëy=^Ÿ÷{:‰¿óõ£jÅqq\·¯à;™™™¯ìmèjèjèbÁcÇŽ= A‚„IL`ì°Ãh¾'Îóùz^×÷íUût>2ÎÅAqÐþ^ ©#©#©ÃýÛ~W¿«ß…~xŒÅ°·Rª”*¥€§Ä)q€bRLŠIç{â<Ÿ¯çõx} ا¿qކ&X‹`!’ɇäCM½|AZeÚi¸MØ›¬šUcÌÝ4]?]0»ë†ë€i5B\ÄE*T¨ðÚ4[ÏÖÌîúÒõ%ànrv;»ö&[ËÖbŒ§¥U¦•§•»M¼?çá|d¸o¸o¸ÿûÕ<ÁXfbްåaËÖ£r8c8c8CÛ97ðw¶ì°ìfæBkCkõþö¢íEzÀ[Wn]€ç-Ï[`öÕÙWuùcÅÝÅÝ€VÆÜÃÃÁÃÁçá|ôÏl<²ñˆ÷Í”~Ä#€ÃuÌu Â?ÿ …}íËöËv=ð¸;qý û¬ì^Ù­Ï?ûÒÙ—tùޝK¾.”~àIÎÃùDÏH-1¤Ò éÚŒR!•QÍUͪ™ˆh乑爈¢Û£Û}n Á(èýÎÂÎB"¢;Î;N"¢W‚_ ÖÇ3>Îø˜ˆˆz©—ˆ‚¾*ÿªœˆNù\?†C‹¡Eù%Püm°k°k°‹úâÔøÔ8IÒõ¦z“@Ûƒ\A."/^]¼šˆ¨$·$—ˆ(³1³‘ˆèµW_{Ußc¤j¤Šˆè»ß "ŠìŽìÖÇÕSê)"š¦U´ŠˆîNÝ™ºC$žŸñ$I»Ãî°S?ç#Ñ$šD“ëÏWž,>¹óäN‚T«j€ÇgŸà¬Î®Î€Ô/R¿€wN¾sæÌ€O> €øùñóàÝßýP¯ÂÑ3£g€¶Ñ6@9}"øD°·ß媋={´_À? ±B¬ëú¤x)^Šß_Á§lÁóFfdJ”íw¯ß½î½>Xê†Î PPPP€ñPmfm&. \  °í̶3µ!jƒ^} ß7|à\Ó·n5À9 ô¢X¾éꥫUí@ —Â¥ðF($=$=$H¾"_‘¯4jþæ”Ò”Re¯¯šÏEŸ‹†VOƒI!ZˆÖQµR­èçáöÖÛ[`nùÜrcsi.‘_”_ÔÞZûÖZïëæ_Ë[•·JÔ ¥B©ðfÖŒ?ËA¾yÌkˆ5ÄÚOðæÒ½Û÷ng©ÚÉýêÓ7&0àDÔ‰(c7o4êÕOÔOt®sèÈÐ8~íø5@Éë:ïþþuܲȲhf‰±B¬+¦2„yÂ"C¾!ßo=¨i79-9-Y¯]Õ¬šá„VX<Â#<òr+‹•ÅÊb¯kjjX*¯g5„B§‚Œ›7§48pûÀm€–¦–&¾€W¯:Æ×¯y£Þè7øRù¥æ=}H»›v×òv‡]l\°1ÿËxÁ@>”m+ÛðÒöÒ¦¬ ÿ ÌaŽZL2‰±ÆR°‘OÔýŸÁoèúq?9ërÖ‰ÀÎ=;÷d\Š7ô\#óÌ7ô¢7:ê˜Ú¤6  ïÕ÷2 ê‘z€ ˜ØÈõF¿Ágðz†~Üü{oÏm@yì;ˆþ ú ýÄ¢Ú^m/QíO=SÏD©ej‘Z„¹‚ š06ë‹õöG¢~•vA»@ô7ú œàW‡Ça<·!e+ED–~ ¯2^MÎ"Ô?ÙonÍV¥é^ÝKˆ´Ð’bä2—¹ SL±VSjJM'9ÉÉ”úd8 ?Ö2ø‰ô‡ûÃÔOøIkl‡ƒÇÆb…ähÍaêu_íöuû ¾º¾º¾újûjûjSþ¡‹±‹±‹&îêê‚ú’ú’úèÿ«¨ÈäSÍQ_Ô—ì.Lê'ü$Œ=ý ®M\›€X €ú<Ñ1ý´îé±§Ç ¯1¯1¯ܺ[wëWWWþ°?웆:G:G:GÀyÞyÞyÜ îwäääÀóÈó·Ïß&˧U‰¡×7üXEæ>œûpõg"ëJוŠÈsË¥ÄN;¢…Ñ¢h‘ÈtÍtÍtH©µÔZj±_·_·_ / / /‘äššš©j¯j¯j©¬¨¬¨¬Éögû³ý"¡êЩЩd¹ƒ+†^B?ág–ˆ­ÌVÆ ‘´Þ´^‹È¯""ò:ј EÞEÞ‰DfGfGf‹´5µ5µ5‰°’•¬±ÖYë¬u¦±ÍÍÍ‘âÂâÂâBï.ï.ï.‘H8Ž„El½¶^[¯ˆœ–3rFD>5ôÒZÓZ%GĶ̶ŒV‘ØØËo"Úm‡#qC†P /°0°P$_þ¾ü}"·*nUܪ±wÙ»ì]"\\\¦±Óe§ËN—‰ìvîvîvŠÜ»ïþ½û"Ê¥\Ê%ÒQÛq¢ã„YÏFC/®ŸôóþS“É3ÖEÓÁ³Áš` lqnqnqBVfVfV&”ï/ß_¾žŸŸÁåv¹]nètv:;°¶hmÑÚ"ȮʮʮxÄ#0Q0±xbqÊ üŒ}x+[ò‹Ö¦µ™·H;ªÖÃhh44‚˜Ä$& ©CêŒyǼc^PͪY5Ctytyt9Œ ƒþ»Þ£÷˜|øµ'Ú“ÿ½•ÿ1Ç^ë[õ­„TºZ£Ö¤Ì«¥j©Z ªKu©®”x«jU­ |ʧ|)q»Z­Vƒz«o×·§Ì±¤ÞGçXÊäÇ“îI´ääèà;]銨úI «aßÓH#ð–qÆAT@€1F¾á(GAý¨Õ ŠK::DA÷ëþTþ„Þ‡“Æ~+gìëbƾÇfæ öAFÐX§Z`IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-0.3.png 644 233 144 2546 13755454065 14750 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[hTW†×dŒItˆ1¤Õ‚! ªÆx‰ˆ/ JEMd0‚µ¢XK1Uš¤Jë %­—Q4DJ¥DL£5#>©5Ñ<ÔAbcsÁ8šÎ¨!Žc2gÏþú0sæ-ÒW÷ËÌZ{­ÿÿ÷e­³DD$+ñ+’›’›’·S>·üéËÒ—Mù%nŸTà(s”ÝÝãjÇÕŒ¯_»gÙæ¼oϱðí|¦_²Är¤5¤58'ì=°vÆÚéÄín@FcFcØ€MM›š.Ô_¨ç ´Zž/~¾,Ûœ7ãÍ|ÏŽ/{ÞâÔË©—=6:m´ä•ä•Lþ2Ð5V­Xµà‘ó‘S§€úpáÒ‹!†0GÐf›ó‰x3ßÄ3ñM>“?®G gQÎ"(]Wº.ãL<áÞϰcÒŽI&_´8À\` Cj½ZÏ0èú`Ùæ¼oæ›x&¾ÉgòÇõÈ›gûã'àNs§A|ÕÑPJ)Ð%ƯƯD>5FAëíz›Þ†5dÐ2cݱû±û`ô©±j,ZÏ0ŽG‰‚z¦ž‘¾Nð%ùÅ.è㟠#ÅkØNâÊ4uHâX› (òÈ#Ïrë°ë0°}ì³ÅÿN7ÝÀ&uSÝäUÄñG ɟГvòؼ{óîäzgéߢg£g-¾ß?¨zPdzgφžŽžŽžÛùb¾˜Ï²Û{Û{Û{áð‚à /ÿ¯¿×ÂÓç£uÑ:‹ÏâëI»ó5œ<7ú€þ,‘1ܬVCQAQAQ^)¼Rxò¯ç_Ï¿Oúžô=é³µk;Öv ²ŽdÉ:eµeµeµÛ•Û•ÛG¾xø">¬˜|q~S@æµÌkºE"Pkxcœ~|ºÿt?Ì+™W2¯ÄòÏž;¨}±¡>óšGó€ºcdh ¥~­ŠU1ècú÷ú÷ Ž«ãê8ñ5Ã$“‹H™šîÒ]húš[sƒÊŽñþ‰}ÀÏ ú‹G9."²î"89…ìüc$g$ŒÏØÍ5óóž.J¬ÅƒXÁ V$4² l²É&;Vój^Íg8Ç9µ]mç)WøK‡û†ûœ!g(dçß±~¾Xãü\W[W ê$€ù’E|¹öò‰Ë'PƒÇÇâ‚ûö?쇆å Ë–èoÔ7ê‹çÍysޜ㡖¡æ¡f¸ð‡ \øõð¾%¾%‹Õ/)ï!Ç!‡u´_Å""ÿ:­¯´¾úIu°ºïÍCo"bHwnwnw.h¥Z©V ›››°Ñ»Ñ»Ñ k³æøñãOø÷¶ÜÛro ä6æ6æ6B¥Qª AîºÕ_¯þšˆoÆÛ[„®u]ëÀ¬‰õ#|”¶;m·jÿUÿUˆæQ@\]ß2Ó2™Û2_Î|î.»»ìî2h/m/m/…¢Â¢Â¢ÂxÅ‘âHq.—ŒKF<Þ;Ø;Ø;«òWå¯Ê‡³Áh0àùµ×^„kC7‡nÌtÌt€ùqêk©¯©6›ü.¹7¹—ÅkŸ·Ï‹¤œ–oå[ îP^.â>ì~×ý®ˆ¶YÛ¬mÑŠ´"­H$µ5µ5µUWZSZSZ“Hä~ä~ä~<ÍæGóE¢D‰"Òý·î+ÝWD€<òDä+Y)A‘”')OD$Çöží=^´‰avšI>±iZ…ˆüJDD2,b}ZŸÒ§D´B­P+ñœñœñœß3¾g|H *P¨™›œ›œ›ɉäDr""’%Y’%2T3T3T#’w,ïXÞ1‘®]ºˆ¤ï}Þ Ê>‘}Â|àÃl6›Ä©¯×׋HžˆˆLφè9ú}ŠˆÜrC&˜þX¬?qGÀŽ+‚Á ‘^­WëÕDºººDÎ?[¶^äö³n£Ûiôø§û§ËTÇ{Ó3¦‹˜+¢ZTsð‡•on3·¡³Ïè2º€´8?q½ÈÛ›ÿÝýV¾³¯‹wö=ön¾`ÿij&ÍÍt”fIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-1.5.png 644 233 144 2467 13755454065 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜìIDATHÇÍ–kH”YÇŸÍVJ Á­ÄºÛ•² ?%$ÅŒ…]¤° mèÃb”A±µK+„d74jMF¬ub#o &DXÈ®E“M¥2™™:ïåüöÃÌ;3­õÝóexÎyžÿïÿÎyÏóɈü ØÙÙç„cûÞØ|ÊÆ”_ÿŽ/`ÛbÛòø˜{nî9€ÌºÌ:ói,¶Ö­üøz‘˜~<Ïš— ‰M${’=¶üH|¶/Û¾,%+ÿÞ©M©Mã:¸›ÝÍÞzo=?Aà^à@0?˜±ØZ·ò­zK/^_Nþ/³ZfµØžCrRr’8 ‹Ëà ÿ,—Óåx™ð2AÙÀÒIWùÀcXc8.¶Ö#ùV½¥gé[<‹ö#0ýüõ"°¹xsqê•pÁÓkphá¡…OkNsštÐÇô1c—±‹)Píª6ˆÅÖº•oÕ[z–¾Å³øa?òéÞVn€­)[S u¡mF€yÂ*ãúX´¯X}擾0ÅT\4Î8ã±Pù”Où@mR›Ô¦¸ùlU¨ ¯Œ#Æ‘¸>6Ùÿ¡ÿÃûØg:?Z¦Ñ~AÍr³$V°Å5ê¨>„¿ê‰z¢žC¼á PÍY΂ú[½R¯P4˜)f ŒG€Ñò¦uþû­œ±·‹{›™7Øÿ¼;D#VBIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-23.5.png 644 233 144 3152 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍVûOTw=wy8A¤?PE¨è¦E[ÑRc«¼Rbƒ¡­SÅ:_©m¨Û˜TÖ`lu‚ ¡bÂâÖI:¥‘d«¶VÍŽèFZg dQ‰e@ž£¸3÷ñ=ýaævØöðûËÍçuÎÉý~ï¹_Kè Òð¼áyCl06ìç£ó£óÓÚƒq£JJoIoÝ=BÆÕÇÕ“ä‚Ö­Zo8ÖëzÿÜy Œ?—OÏÂp"Êe—6†âj²$£$#:1Ÿ¼FÆ8b3 ùAÇ$ùÍÙoÎr/9|cøINmœÚH†c½®÷ëó:Þ\|Tÿ çuÎë”Q‘Q‘¹$wInêþ`ÃSɢ¢B’üÕø«QH’TÇHšiIú裾ÆçÄz=Ô¯Ïëx:¾Î§óõ€\øÆÂ7rë;[߉i ô¶‘'œ¬óÉ’5¬¡™T|Š$Õ÷Ô÷è'Å5q$)Q"ñ^×ûõyOÇ×ùtþ žðVNÀ©²x²x’Ï‘¤|]ù¼H^Dj.ùž|rH©Ðú´»Ú]RT(H‘!2Dÿ¼œT¨P¨ŸÎÎPV_’÷ËûIµ0ˆÏmÅ Å ºÀS9á­üV|IÆøb|¾1ѽÿ:É$ÉRdŠLÎò{þÈImLÓÆH:è cŽ€ ¼À $ws7wÏÉp€$Ÿð Ÿ¤X&–q6T- C|!þ °_†ÞXc—øçi¤£i/÷%»Ýn7Y›Pk¬5RÜN»v;-Ì×ÓÝÓÝÓMÚVÚVÚV’ý#ý#ý#~ar·Ü-w“޳Ž&GÙðfCeC%EÓ톟~"'N¨~Õ¯½Lî]½w5)Þ ê1ˆ5ðêwÒæ-[÷¥áχ?—Vçöç9óœtDv˜;ÌJ—/=œ§Åiº Ý…n Kî’»d g&g&gð x<ø}ù–ú–ú–ÖMÖ-Ö-ÀÅċދ^H×7¾¾ñ5OÎùæùæI«M¹›rž ê1°ÙTkª}% È{?ï}``kÏÉž“RËÛ}·åÝD]¾úøêcÀ2jµŒWÚ®´]i­;´îÐ: <¶<¶<ˆ¿?þ>0íšvM»ÂÂúªûªûªo¥·Ò[ h&-AK6½³9g3¢R^`X`Z°öµÇ¯= “±5±5¯dE_Šü4òS¾ÈªÙ[³·$l}Z0Q0‰¿”¦æ§æc᪺Uu«ê€øÁøÁøAÀ~Ä~Ä~Pâ”8%(I*I*IÇÇÇãã㎰0-EKÑR€¹;swæÙãÙãÙãÀ'ÙUU@Ì`Ü­¸[˜x{ºhOÑ,ÔNÐE_„ö³ÕlvÒ;ä"9ÑW×WGÎOо}??t··hâgž/7ç9çüÿÿûœ{Î}DD$æ)`÷Ø=ö¹iÛ¾ËÚŸýÄì'w¤íl›m›<y'òN¸?th Y¶é7ã³óE,ül>s_òÅÚpžužµUÏØG`kÅÖŠÙóÓöÛpwŸÒ`÷§»?~üˆgáfÏÍ€ÛÕ·«Á²M¿oæ›xÙørä_ü"ðÀ….Ø~gŽ3GJÖ–¬]ô\:à§E°Á»Á ðÛ¬ßf);èÀæ¨j NsÝʲMÿL¼™oâ™ø&ŸÉŸÖ#PXUX%›¶oÚî:•NúšŠ›ŠM¾Ôyà5^chq- ?­?MTDE°aË6ýf¼™oâ™ø&ŸÉŸÖ#÷Ööøã(_Ž/ÐRß‚>¢€1;Õj ¥~&‡``€Þ¤7ê —éezèOéÛõíÀ^v²”]U¨ ”M®L®$¥*´ùÚüÌ Ë_µZ­¨~«”""¥ï¡¹F\#qÄòcùÀç¬×#©’T Ó|Á#Xë7¸L2É$ AÂr+MiJŽrˆCYyŸEFÓìNãCìÁ؃@Òõ«ë׸ÃÔ3#¬åkØûòÞ—ÛÆrõJêÅÔ‹Ï9'9 ‹§k¬k¬k Uª@´†ZC­!˜ì›ì›ìƒÁ+ƒW¯ÀñõÇ×_Ñßcö˜•>æËðÏè™v¹‘çNï8½#^¯½™(K”‘¨ë« ×…­‚_ª¼Ty©Œ}Æ>c´´´ƒ7áMx°ß±ß±ß‡;w†þþ~Ø8µqjãx~ò\õ\…áDôdô¤yƪ^ù:Öv¬5…]n˜ûÕܯÔYÞûnì;ë$’eOþ= u–v–‚Çëñz¼Ð}°û`÷A***ÛRÛRÛR¨é¯é¯é‡`G°#Øáâpq¸4h:Ð###°ìü²à² \}é‡Ç~xÌâ3&F=£0õ¸sÝ¹Æ Ü½5 \L·½:m¼k¼k%®]5ºjB×C×C×áÚ–k[®mú@} >gÚδiƒ…+®X¸ºZºZºZ¬üu¹ër×åBéêÒÕ¥«áÚ¼5)(·Ô¬ñ?ÆÿS]ÄøÌøÌ6(ºæÕ¼"b‘ByTÜâ–ÌÒŠµb­XÄ–g˳å‰Üí»Ûw·OÄ]ë®u׊lóoóoó‹”7–7–7Š=wôÜÑs"u•u•u•"¡x(Š‹¨GÔrµ\¤çÕÞgzŸÉÀª'“mÉ6S]$^¯îÿ^ݑü%"‚ß¶J¨Iš™¹=¹=¹="ªY5«f‘òæòæòf‘°3ì ;EòòòDŠ¢EÑ¢¨Hpqpqp±Èð¼áyÃóD Ý…îB·ÈÃÍoU¼%²­Õ×äk2ññϺðÍóߪAÎ;9ïÜÜ+ÚW´¬ülågúflÔ |v¿ˆÉŸ­gä¥PÌ„½ËÞ•S¹ï…†õ ë—>•‰ÿ<ygóÎ>NCË—-_|ÑùE'Ûáþ¥û—¦+§+ÁŒº7ú ¾l~Ùû }°öZ{sÆÀn³ÛDÀõºëõâßg£ÅP³©fÀxîx®²€6 8p¨J F cE³b£¾€7ú >ƒßÐ3ô3ó8_s¾&µµyŸf~< <óÁ3†^ê,ðá€t,ÐÞÕÞ%j@ C˜±Q7ðF¿Ágðz†~fs+ã""©†ºp]ô©Púnj]j¨5é—Ó/“Z˜T©Ê£<¾“KÚ¥v©]˜ë1ÓLé t¯î%¥/O¿”~ Ôå ?Ô[ë­À¤¡olå?EDJ?¼X^,¶DéáP8ìà-Pnå&θË]PGÔuØÀ6d âÆ(¡„’¬|7Ýtƒ6  h@P¿­ß&¾P}‹tx <†~f°ÒO„ˆˆÈÑoïÕ¾Wk°é¿þþî`Í` úÍ¡W½‚ºuô–ÿ–ßÔ »Ãî°ü«ü«ü«`lxlxlج«A5¨AíSûÔ>3¢åÄÞ{Qß{®½píSOmim5¶öè7¢ýKDäÚn8ßs¾®n}zôiÕ\x`ùóËŸ'Q»¥¶®¶Š[‹[‹[áÊá+‡¯¯ßë÷úÁp'Ü (é/é/é‡s”7åMyaóÕÍW7_5= ø×ÞòÞr £Y?ùÃÉŒÁ®í½,ÿaþCÕ³f/Àßõ~{¿þTõaÞ‡y¨ ¼xª–U-«Z;Ní8µãTÌUÌUÌ™”'Êå 8f9f9f1óñêxu¼ÎxÎxÎxÀußõ³ëgè=÷UÛWm&NKŽ»ÇÝ}}ªk‰åºíYÛ³¼(yó?Íÿ”#oÌW$*2åÙX¶½l»8»²á¹†çD’ë“eÉ2íºv]».âXãXãX#"^ñŠW¤ ³ ³ S$Ñ–hK´Éâ²v[»­Ý"………"íMíMíM"É¿%&.¦$ií²v‰Sl¹ž\/Zô§’—“—s†e~ÅÇ+>9r±#ÔgCºa¤aDäâ΋;/îIžNžNž™šš™~4ýhú‘H¤#Ò陜œYëXëXë‰ÎDg¢3"ºO÷é>sÐÔhêv궈|-ÇåøbÚ)ÓUé*= r†EÙ3Ö³±g#Üûã|õ|µjÞðFY¤,BbõîÕï¯~ê‚uÁº ÄnÄnÄn@³­ÙÖlƒ|O¾'ß{|{|{|é‹ôEú Ô_ê/õâ;EwŠÌ-«W U AàÛs­çZÍ3¦ÿês×箬3fÜþ±mɶ%æ-Iœ«œ«„¹³³(mDÑFL=ªGõ(L…¦BS!P>åS>PNåTNˆöF{£½÷Ò½fßÌïfÌ@%Cñ ñ ¦ßn«ÞVu+ üÂÇ¾Îø˜útÑǶ¨-ÄU©*Wå šT“jU¢JT–_©ýj¿Úle+[³|,EjÑ–3H—reùáKáKÿÏÇŒ œ0œ·>·>øCÆ™U0ý0ý8®ÝÓî™ÎÏyzèõoõú$ü—)¦@ÝR7ÕM`dÑù›ô&RØ´WµWc‹Îo¯·ƒ©¿øb¿•Oìëâ‰}=™/ØÿÌBHíåýIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-82-grey.png 644 233 144 6246 13755454064 16010 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü [IDATXÃ…—}PUÕ×Ç¿ûœs_!^ÄR{˜Š+7”‡G!% ÉRGò×…1e0‡ËF¿dÔèG#ƒB“e¡Ì f‘R‚oO>ùŠB áB¤$Èá^¸÷ܽŸ?¸gœiZÿœÙçì½Öçìõ½Ö&pÃŒ™fÜ*¡OèúX]Æ·ßf|ËægeeEú2wæÎÜþ¸@\ .Xš0]9]9]É>E1ŠQLÒàøèBº$  ìSE”"JEÒ„{Â=á^k1#cdì?Eûæí›·o^Ãͬ¸¬¸¬82(z‰^¢y}†ƒ6;¸Ü¸YÀX\)ͤ™4“6['­“ÖÉg–eVeVeV•ö[­ƒÖÁú+æ@s 9péûN¹N¹N¹¨Yºf隥kHZ,H$–ÍY6gÙ@KߥùÒzÉ߬G<)¾Ä#ñ Ž\É\˜ s¡[I<‰'ñ^¹¼ïÅ{;:ùÝäw“ß½0Ç£Þ£Þ£Þ¾{Mך®5]œÍ¿Ã¿Ã¿ƒ¬W¤)Òi0ãC|ˆ¡†f˜¼·ñ6€gñ,ž…yÚsÚsÚë;š:š:š˜íŸ_|~ñ¡»G_}uôÕ-‡Õ^j/µWˆÒo·ÇGä2=Ó3}ßVn%IŸJŸJŸЄ&4y>%T •BeÓ)«Åj±Z^X§ Õ„jBźwuïêÞJÝÆÝÆÝÆ¡Á\ÌÅ\ˆLË´L ·q·8ÃÎ&0 /âE¼nÒMº!b#`r1¹˜\Ð{ú‹Ó_œþBÜÚÛØÛØÛ(\–«ä*¹êZ1JŒ£^ÙŒWð ^¹ûˆS]U]U]dóeóeó\0ךk͵/¬Óè4:N\¯ÓÇéã„ËnóÝæ»ÍÇ\ûûû€n¢›è&³ •¤’T¤Ÿô“~€Œ’Q2  õ¨h ¡1ìnv7»àzÑõ¢ëEÌ•ük6i6i6‰ë¥øÄljâ„8ñú2ëYëYëÙ¸ÿöÐyèÀ›xoØa#p‘üë~ÕýªûU(õˆòˆòˆbÞÄÇ1æÃ|öÿËf ³…á­á­á­XãVêVêV 9ÕS=ÕÃ…Ëãò¸<`佑÷FÞZ·n= tttô$=IOð‡?ü4¢Àðà ÿ´6µ6µ6†>CŸ¡ ù4Ÿæ,‡å°¸¸p;àvòðŽðŽð¬‘x$>Nô½Eï—ÝGÜGÜGði@x@x@8)Ä8Æ19w”;ÊŒOŸ6> änÏÝž»¨!5¤†Ç”ǔǔÀ)ã)ã)#5ÔPÆ0c˜1 È{9ïå¼—Ÿïü|çç;@É¡’C%‡€cÇŽ¶R[©MÊ ÷¯õ¯õ¯%…ćԇ©SÒOKCJCJC˜d“bº˜.¦ÏŽY‘P$ Œ„„<žÇzoöÞì½ÉØîÈÝ‘»#íííe¬ÈPd(20V`*0˜Ï­­­a샘b>ˆa¬å@Ë–ìI›”x$>ãc|L|¸2®Œ+›ý3\à2« ‹7,Þ°x0úÔèS£O×s¯ç^ÏZJ[J[JíííÀé}§÷Þ´ñÚxm<º?tèþÇ~¨HE*òhy´<U˪eÕxÒ\,ËÅø _á+â#ð øüöÃxðxðx0 ·Š[Å­XÈ÷ñ}|˜c!qvv,Á–`K0p©ïRߥ>`(v(v(X˜¹0sa& ìv »€°Ua«ÂV4Ò@àRÐ¥ KA@Ã@Ã@ÃàuÙë²×eÀo¯ß^¿½³€R<~òúäõÉë0rë¹õÜzö§üLù™ò31Ç8Ï8Ï8ýÐæ×æ×ærRNÊaU¢JT*6Tl"îFܸ $ç$ç$ç{ÞÙóΞw€Î¤Î¤Î$ =¡=¡=°6[›­Í@~I~I~ ÐàÚàÚà DŒ8qØÎoç·óƒ¿ÁߘµônìÝØ»èèèÀçJ£Ò¨4Š9tÐA·¯XÈ2„ ’Ö mÐ6híS»©ÝÔµ`,‚ã²NY§¬xdxdxdxœ#³Ü,7ËÙ›²7eoj¹Z®–õNõNõN€9ÖkŽvÊwÊwÊ•ÛVn[¹ /ŠÅ‹M¤‰4Óâ}ñ¾xêê Õª/Ф‡ô;±ûQ9)ð+ð+ð†‡‡KîL&M&M&ÅzjÛµíÚvû®„®„®„.>§³°³°³ÓeÊ•=‚¾ð…/`ÛiÛiÛ ø×ù×ù×Q÷¢îEݲ·doÉÞÐít;ÝȾ–}-û°5ÛšmÍ€ÙÅìbvÛÖº­u[+È@Å@Å@5Ÿ;tîйCœÚù¼óyçó¿o¶UÙªlUËóHúŸé¦ÿ  -hù¯#²!Ùl¨Y5Q3Q3Qó‚~õG«?Zý[½.p]àº@rþýýìŽêŽêŽ Ä¹Æ¹Æ¹Ðü¤ùIóÀî³ûì>`(3”ÊëkÖ׬¯D v]g×…^¡Wèayi䥑—S[\[\[ŒjÅïŠß¿O½ÊŠY1+^ƒEX„E·’„™ Ã_)uAt9]N—Ç©nT7ªÏ¡¹´¹´¹”ùyZ<-žr2 $ $ Qîþ9Ô$’D’HÇqÇL‚I0àû½ï÷¾ß!BƒĨE-j1nþÆüù¸Ôn®Ý\»YÔð6ÞÆÛpÜ7±—ÎpÜJš)‚§£Í³ÍôÂ~r„!GÎ's¡\(º»‰HD"—W__/î0Eš"M‘P“’BR0N“i2M°{°@â°el[ÐnÚM»êA=¨¦Òv9Ûp¶álƒ}×PæPæP¦pD!SȲ“Y~I~I~I‡Ïaöa9…nt£[ŒúQ'ô£ýâÍ™šM*}Ïøžñ=“ó†R¯Ô+õ'³Æ-[$˜NëNëNë커€ÄŸøLC€áq÷D®‘kä@H sôŠ‹={.ö°Õ׌׌׌|Žs‹s‹sËÝ)kª5ÕššúÉèÑ7¢ÖÃzX\qNH fdzŒ:Sgê ×¶¿Úþjû °¦XS¬)©Ÿ8¹;¹;¹÷•uUuUuUñ9uÑuÑuÑl5I&É$ ZBKh TPA°‡ì!{‘ˆD„e¸g¸g¸'ë—Ô/©_W§A§A§A€Ó`œú —ÍesÙw§R<â8V_— ‘ŽÇ•Dá:RÄçÌh×¾‹¬ +ÈŠÕoÌ\9αí°í°í ÿÞB·Ð-”[åŸíŸíŸ(j j€š[Ä-âaZLÓÄ4(¾Ô~©ýRkqpùàòÁåümååå’œÆ3žñ»/ÓBZH …#ŽÌ¾'e,+++++ ãÒŽÂñbVCíîrh÷É%¹$÷üY.œ çÂwWB=ô\^•­ÊVew˜ŠLE¦"¨9Žã8¥h°4X,Ô|·ðnáÝBþ¶r¯r¯rïÍšéé齇o¯½½ööZÀ¨q¬SK€ß,èÀÒµÃÁ¯ížñ­ð­ð­ÈyC™¨LT&žÌ[0¶`l`ú1ãÇŒ3ì»´kÇœŽ9sp¼éjÓÕ¦«d«Ú 6¨ ÕP Õü»YxKxKxËò²www÷ÀoƒT¡žäâñ7Ñ1ì`r&gròÎàâÁŃ‹ñý9ûsö箈 o…·Âûͼû÷#îGÌ©0Ý2Ý2Ýb‡ÚN´h;a_9a›°MØøÙ*Ù*Ùª=ž¬ˆ±¢ïk € ¾ðè³R%>ÉCðö7ÚÍDêPgßÇ*Y%« ëæÊ¹r®üÿ¼§6NmœÚHË e…²Bî¯çõ¼þ—Fm¹¶\[ÖÓÝÓÝÓMþ—>CŸ¡Ï°£¿U@óßqpø{B»Žã¾ÉHF²ÐJâH‰» eu¬ŽÕýçmÕóªçUÏs·ø~¾Ÿïxž¤éÁ6663€ðvø“KË?qü?')Lsù—êIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-10.png 644 233 144 2420 13755454064 14656 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÅIDATHÇÍ–mH•gǯsÌŽ’i†+#RNL·ry ݧ2ѤW$E-W0¢b}Ë(…˜´A­×Ë"ë½f-Š¢òX 5? -S2­„Ôr˜îœçyîû·ç<çy6ÚöÕçËáºîûúÿþÜ/×¹DDdJâWÀ;Ó;Ó›½[œ|Ú²´eù?Çã µKíb”_yÁ °š­;Ö ‘FCÌas€éLgº+ÿ1~ü@•T¨zUÏ(Úú ^’÷“0Öð¶îݺ×VSŸ$· _]§÷è=ïdõÉê“ÕÐþ¦ýMû'ÿ¬õYë³V86õØÔcS¡·£·£·Ãµ¢/´¡ ´k‹<›÷“0öäk8;rv$Y¾™/-Ÿå#jgÌz³Þ¬‡õmëÛÖ·9àî컳ïΣÜ(7Ê¡h¨h¨hæÝšwkÞ-ð‡ü!+++\͵æZ[_ovøq?™M™Mú" ®-8¢ƒ:脱ÂXa¬Îœ+8W¹‹rå.‚¶Im“Ú&ÁåòËå—Ë!P(;u Þ-x·à?uüÔñSNÞZmN3§¹xI~ÜW$eeÊJ>I½–zMìoX¶Ë9""7å¦ÜI­I­I­ v;ƒ"3¶ÍØ6c›ˆ1ߘoÌ1FÀˆdœÏ8Ÿq>©#™—2/e^‰vG»£ÝN^¢’+¹.^’÷3AD]W×="æ*s•ŠÈcy,9bÉSy*"ÞDéBY( ]3l†Í°ˆQlÅ"yuyuyu"¯‹^½.ªªª‰LŽLŽLñ·ø[ü-N½ç‰\ É0'ÁÛW$R)k$ººgÏã ™ _ê—“1 KXÄSâ)ñ”8ÂY+²Vd­ËËË)ñ•øJ|"¥ûJ÷•îÉ'Ÿ|D–ô-é[Ò'²¼eyËr—1o'è J,ÉKò~þ÷VÆâ§“~zèqNÄÈÁ‘ƒ#!v?v?vßÉ«çê¹zÃýÃýÃý Þª·ê­ë( &ô´9bޏyuïéc$ûØFµ‘Q—t”(``$Û-Àv°Ô°VîÛ÷Þ¯÷[8ÌaU«jMÔþ_ûÎõÐz(µImr:?>¼xh ÁeðZ¼ñêßô#ýø….ºÐ vªXVÈ ¹õÿµóÛÿÊqûº·ï±ñù‚ý à€ÝÎcæIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-188.png 644 233 144 2701 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜvIDATHÇÍ–mH]uÇׇ{¼$æMƒ!ÓË,È)Æz÷¦óÖÛE.Ê Ec0%½© QkZQ4ÆH—ͽˆ¶¥k1Øæpՠе‡;mÌ-¡Ûܼ’Û=OÿO/î=÷ÜôzçÍá÷øýžÿïáüDD¤0õÈ*Í*Í*HÊY¯ºú¼Æ¼Æ§F’òn <­žÖ‹oÁãŸ=þ€Ð?h_qeÇîøgÆ‹¸ù3ñ½Š«Ð¾Ñ¾ñ¬MÉïBGuGuÞ“Iù£ ðòúÛ„-ßmùàྃûè†ùsóç»\Ù±;þN¼“/3¿¼û/|Èý>÷{Ï Ð¼šW/^*ïI:\+‡ ÍšneßÊVY`Å€|òÕZ`‰%œç¯ Ù±§üx'Ÿ“ßÁsð“|Šë‹ëE  G|_&®| o¬|c¥ƒgÞç}òÁ\2—¬.«‹¨ 5€¸²cwüx'Ÿ“ßÁsð“|äáÚîzÕîm÷&€q¬9kìÇŒ£Cý¬â*Žr(Ûwí{Ì›æMó&¨§T¹*OŸ v\­T+QæM½F¯ÁP«Íb³8ýÁgyÐf¶™€Jụ©øÓ7ç›[ʙ™BàMÖ„0,si¦]@•P •v°ƒ®ž \à¨:U§ê€ý 2˜a¶KíR–iH懙’™àï†ïÆRŽÃ'El÷iØúöÖ·»öµÃè5z]{Û÷¶ìm©æ©æ©fg26›ŒAOOD÷D÷D÷¸ö©¦©¦©&è§ÿÍþ7áê{W‡®¹'®†’xiüŸ±__§çÀ¦›Ò&*•$:îïw ~Z;­Ö`64š AYGYGYl<¼ñðÆÃP5\5\5 ûe¿ì¨\S¹¦r „½aoØ «ž]õôª§áÊË==$<))tˆýúzŽHÁ©‚SÏ噺¼º¼T}Åó¥æ'~iùª%Ø9Ó{¦÷L¯ˆZP jAÄ5GÍQ‘D<OÄEBÁP0¹¿¿¹7toèÞˆÐz@¤AoÐt‘hq´(Z$²\öàˆæà±ï…[/ÜñHÁ/¿<ÌÉÞ½*éö–zKE乓û–wÈ;$¹‰F¢"% % % "†fh†&btF§ˆž­gëÙ"Ç»wï‘crLމXÝV·Õ-’¨OÔ'êENŒŸ?1.""ÇdVfƒ;²Êû›÷7‡O–ˆ=fy.‹e6›Í"â‘by^üâOŠnë¶n‹hA-¨E.U\ª¸T!RÞZÞZÞ*2¦icšH~$?’Ü5¸kp—HõŠêÕ+DFwŽîÝ)’{=÷÷ÜßE~8·íܶtúb¶ë§ôS"i>éãÀâEàÛdÍyÂÐô}À%fÖšµf-ÄŠbE±"°j¬«&þÞ\o®‡XQ,?–ÖkV¿ÕkØ.üïTV| ¾yßüRL[ÓV:oØ›ìM,³ÌCOr@å©<•—¡ß¬6«Í`Ÿ·ÏÛçA½¨jUm†½ÂüÀü€e5ÞcÁ™ ð·ïšïÚöXÆæ§]k×;½ù'­I@³¶YÛ0ØÍîb7_ð¨“ê¤: |ÂÇ|œñ)uÒ X >·"V$có›í9í9ÎI=´ùÙå#{»xdïcæ öžVÁÕIò¨IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-132.png 644 233 144 2736 13755454065 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü“IDATHÇÍ–ßOTgÇŸd`\§Ád›€lÙ8ÑÁ&Äh61$t¢Mµ”t ÖF/V I×éﳱƮµ]"®uÙÔ )Ù*Aƒ‘)åÂP*Yô´[!ŒMh Œ dEfΜó~öbx9Óõð½9çùõý~ÏyÏóœW@DDV-^œEÎ"çÊ´í kÈ5F—ø:ÆkÆk`-òÛ[)"²î,)÷¤{2¾ » ø€WÍ~£Ø(fžN"D2*¡À NpÂö%JTµªVÕÀ_ù˜3â ÖFk#ój6w×Ü]Ì»ÇÝãñeZÏ¢°sa¨û¤î`À*S3>2>²u4ïi®n®†ÛÞÛÞÛ^›GÛ§ËO—Ÿ.‡±Æ±Æ±F;>:8:8:gþpæù3ÏÃÐÆ¡ª¡*û«hšxÝ»uïê­=^6ôÁ û.ì[Jÿsêï _ÂGbï½}{ûì ‡‡ÃÃ0Ö2Ö2Öy•y•y•°ëÈ®#»Ž€wÆ;ã®Ò®Ò®RX{`íµ b b bŠÞ):TtþSî ÷‘Ð|Ö•oÚ¾iÓ†>XùÃÊÔEþŒÚOšô-<\xíëÛ×µ¯ƒ¢íEÛ‹¶Cøpøpø0Ül¿Ù~³êËêËêË d…¬===p|üøøñq8V|¬øX±ëñÝñÝÞ:ûÕÙ¯l¿¹{ò³ÉÏ@ëðäyò¬x0õ` ø.Ýöê‚õ¥õ¥]¸eÿ–ý[öC§³ÓÙé´ý³g΄[wlݱ¼—¼—¼— ’ˆ$" ˜ðMø&|°¡qCã†FðýAæO?®\Ÿ1f–ÏÌÍÌÖã±BVÈ1"fjgj§ˆ8DD¤@6‹G<²´žŸŸE ª ª ªDÚ¬6«Í©ÕÆjc"=½=½=½"Ë[–·,oinn)¯)¯)¯ L¦S"]{º^ïz]$w(·#·CD&ù"æzs½ˆÖã‰ûãþ[7eÙµþký"òDD„Ž?©çÔs’ÔÂò]ù®|—ÈBÖBÖB–HMCMCMƒÈlölöl¶ˆ§ÔSê)ÙÚÚ)9Urªä”ÈôÕé«ÓWEºWw¯î^-R8S8Q8!réŽÍ›%)kÒ|ÖýïÏ^dIÏS]™\ì’ÉÔHjÄîÊØ?b_ľ€äÑäÑäÑŒo±2Y™¬„ûƒ÷¢V}‰¾DL7O7O7C4kÊœ2!úv´!Ú€ZpÄÅ-MÃ2:ê¼uÞ§ºrÝYpßsß‹/ƒˆ1—x_kŸµyñ›¥zU¯êÕªZUk†ß¥\Ê*¦b*–Q0Ï<óªD•¤ïÒø‘ë‘ëî¸;þÔ˘ür9€µ4ùo™·€ó-ó- Îqköâ}Þã=P!R! D]@#Ÿó9¨ ꎺƒR7LéÁPSs©9à¤Æd²€…§&ÿ3û¯|fOÏìyìÙ<ÁþÓM=EVé;IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.png 644 233 144 2065 13755454064 14604 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜêIDATHÇÍ–ßK”YÇŸÑüYB‹ Ž¹íÍ"4ˆý½°l¡æîFëÎÍJWvQL,²‚hHWF±n’&$äE˜ëޏ˜ ¸)FÁ‚:‚3 í°®oÎ{Îg/Þ9ó¾v5ÝùÜÌ<¿¾ßïyΜ3G@DDŽæ>ŠBE¡¢J×/úÞ‹—ž-=ûåo®ÏÀÅÀÅ¿ºáÈÝ#wªîWÝW+žoò¦Þß/âáûùL\ŽŠ() X9ÿ\>yùdéç®ÿË ”•ý›…kO¯=xòàÉ~€Íøf`ÛÚ¶ÀóMÞÔ›~ƒçÇ—[ñ‹@ðYðYào(9TrHŽŸ9~æÄnÁÛpþÜùsëÅëźœPA…¶€ Œ¥}¾ÉçêM¿Á3ø†Ïð»zŽ>vZ.\¹p¥lÈmXùºêºê ßÞp‡;T@6“Í8­N+6è=@€x¾É›zÓoð ¾á3ü®Ù¿·½_Ã¥ÒK¥yA€3ę̈ÕÁ;hS¡¿Ð º²+Ù•ì ¨EõJ½Â³¹z­®ª«ìyxßð~ñ úªÊ6Ë63ŸÁ瓇ýTDEØÉ Ê›Në´Ní´ÓîKôÐCèm½­·}ñÿÌ—^ßð~WONؽßáúÍë7óÍM¾-0²±Aëa=ìñ­Ö®Ö®ÖB_C_C_,6/6/6û°¥·ôð)R~!«­«­«­î÷‡ûÁê´:­NØéÝéÝéõõ ô Ù‡Ÿöø]=…O,¡Ê7¥©¥©¥)(¯.¯.¯†X8Ž…!ÏÄ3qP-ªEµk¬±¬³Îzá+ÉX+ñ§ÈË/_ˆ9«ß‰èwú|‘]Ù¡›nº%o ö‚½`‹Ø“ö¤=)2™ˆLDDêRu©º”ÈhÛhÛh›ˆ„$$!5«fÕ¬ˆÁóáçø NOÁ§ršç<÷Ögר5v lÍmÍmÍA²8Yœ,†d4MFa7°Ø ø2ÌCŸ|* ¸Ç|šÌY*Ð>ªÿ¤{¬€›OET„½üŠ»¹Á Ð#ú±~ z^ÏëyÏçgnsÛ7¡|Á7ÿý¯<°¯‹û;˜/Øÿˆ—¼^£ÜsÌIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-7.5.png 644 233 144 2533 13755454066 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–oHÕWÇŸkn÷:šSRÜPÚˆÅÚØ’[µi$ ¯¨¡­XÅ‚›ÅÒdÅØ¿7Mæj”w˘1²ŒÆ0ÚÖõª­W±V’¶ üÇÒ‹æÍÐ{çw>{qïñ÷k±{×ysyžóœïçË9¿óÜ# ""É_”çRžKIOÄ);œ¼ïß;Ï·&âox6x6ü¹ži|¦ óûÌïí~'6ó¦Þ½^ÄÑwóL^2ÄIxÛ½ížÂdü)¼ûò»/û²ñW!HëH똱 êLÕ€SͧšùÆzÇz& ' Á‰Í¼©7ëž[_>ý_ž8÷Ä9Ïð>é}Rr‹r‹–ìLÜ\¥þR?Àð‚á:Ô8°…ºˆÅŒ Wlæ“õf½Ñ3ú†gø ?YY"P¾¹|sÚw‰ý?ÀÇÏ~ü¬áÅ;€/ù’…`E­(€Ú¢¶0:¤Cxð€›ySoÖ=£ox†Ÿð#Ÿmý:¢ñŠø¼¡}ÑúÂúÔ‚ØŽØâê=õ¹ú­ÒUšJý–^£×àŒŸù‰Ÿ@}¢êT¨—ÔFµ­Þ…b!âøU†Êpô™­ c°~ë(ED^l€´±´±h* ¨5){›½.ôs®H£Ñ®xˆ!†€i¦™ÀÂrÍ?¬Wìð ?á'iìÛn¨>P}ô~ûU#s;ïöªÛ«Ðo6æ7æCS¤)Òo‹·Å × ®\+p°±C±C±CÐÑÜÑÜÑ ‡K—.…£—ví†ÈŸ‘©È¸Ãà)ÃKðŸ”ľ½Þ)òvíÛµ"ü*"âY‘ÜÐØðGÃþa¿xZsZ—´.éììÙÛÛ¹tðÒÁKe~DoEoEo‰T¯­^[½V¤+«+«+K¤ÇÓãëñ‰LwM7N7ŠGDò$Obl0¼Þ¤ÿ–þ›n‡±ü±|÷–ë^Ý ö*û û '{"çDΉ¨8]qºâ4Œ¾ì¾ì¾lHõ§úSýàßéßéß Çï¿{ü®«ðU{Öž~7 ÃOøÈ|:óiû:LŒLŒ@ò»˜`~E¿âèÜ;yï体7š7š7 áeáeáe 7„ PÕYÕYÕ mÁ¶`[r—ç.Ï]m5m5m5N½ê6m&ÉOúI±ÏÚg=×E¬2«LDÒED$Ëζ£vÔ9¢–’–’–‘œòœòœr‘Õý«ûW÷‹ÌŸ;?w^düÈø‘ñ#"“+&WL®YT³¨fQȦÀ¦À¦€Èâ¡ÅC‹‡D&­ÉødÜÑ•`‚7ÏOúI‰F ¯\¹øËÅ_DD‰ˆ÷ôJ½Rbf}èXèXè˜HIqIqI±£ D‘€HQ¨(TÉf³ƒ"áöp{¸]$cwÆîŒÝ"KG–Ž,Ùþæö×¶¿&"BM[ðG’gøÆÏ¿o%vò–\°N[Î7¤§>›Ú7µ„„„\—¿Î®³ë`¢a¢a¢ô.½KïkµÇÚã©ã©ã©`7Úõv½«Éüe]±®Ì«6;pàþö1Wç§Ò[é…DSŒ÷€º©n™ªVÕ§† AWKd€Ð7ô }çoþ¾ák¾}AêQ4?Ú>ÛGÔUuPF¿ÒWé3;õPçlÿ+Û×Åcû{<_°ÿ1"÷9:å!IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-22.0.png 644 233 144 3027 13755454067 15026 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÌIDATHÇÍ–mL•eÇooçxŽ B‘L"iA*àËqÒüBX®M8§‹õÂk­>ÀøÐrBŽ#Î27e±±râÄ&0’\‰áÙ)V(HщÎ9ÊŽåœó<÷¯ç<>Ô§>zyö¿^þÿkÏ}_×} Bú 0$’ +‚ØP¢ÛÏŸ{ü³ nV ìù°çyV~´ò#€ØOb?QoèXókñKó…Ðù—êiv#tCtGtGXN×ÂþŒýƇ‚øý~0uš:PúEéçÚεñ:L_¾ p+çVèXókñZ¾Æ·”_ÔþG_ˆìŽìs@tTt”¼3ygÊ›Á€_S wwîn€¿Âÿ —Pæ ™xð -ç¬ùCñZ¾Æ§ñkzš~°ñOÇ?-ì=°÷€éT0áF;T­©Z£éù;:ê°@Àð(/(/°²_öFèXókñZ¾Æ§ñkzš~°}+]BÑø,¸ Ü ðnøü  ~ëõâU*åù°|×ÃaPíª]µ£/7ó÷}$åÎÀË—ñþô›ýf¯ù¡ÀSàÜš¾¶•_ !Ä“‚Écòx"¤ëæÀÍàEv´J+^.ÑO?¨cê˜:ãÇ–Ò@ §å´œ^b_ËZÖ <Ê£2Oæá%=Ä¿.¤Òçû`=¡?Ö|Eö–…•…ilê¦Ñ5ÃÃÃÃ`{Ìc‹A^¹6rmD׉‰‰[œ-Îö-ö-ö-º_=©žTOêx¬f¬f¬N¬:a8a@:nüöÁoèzòvÙSeOi[Û|E¨V!„°WÂù–ó-ðËÅ©ú©zY”äMlNlf1ûµì—²_‚ÔC©‡RAk^k^k¬3¯3¯3CöêìÕÙ«!©"©"©fffô‚fggÁšnM·¦Cfoæ¹ÌsðD_JaJ!‹s1GÀ!‹àì᳇A>¬G(?™mf›ìï¢wΛzâzâ ê­Ê­•[uíãÛÇ·ÃŽ¬Y;² ÞPo¨7èþõë'ÖO@“¯É×äÓí-ó-ó-ó°-[þ¶|ݾÕmí²vÁÉŒO³>Íðöeù2û2»ì0„§G½õ6¨öy‹„Ø{w—k—K¸JÜ%«JV ±±icÓÆ&!"e¤Œ”B\̽˜{1Wˆüëù×ó¯ ‘Ù’Ù’Ù"DBcBcB£ÅãÅãÅãâþR•AePK»¥ÝÒ®ÛWœ]1´bHˆ{ƒ÷2îe—Q{¢ö!î„ç„ç°A¨§-å–rÙ·'oOÂÏõ£ÇGòã¸qje­Z«‚Ò¦´)m0Ô:Ô:Ô &ŸÉgòÁÇÇÜé¹Ós§îÞ¼;Î4gš3 ºŽví: iÅiÅiÅ0·gn÷ÜnØzÜzÀzzœ_y¿ò,œZ8Êæ6s›ì8íŒõnèÝÞYÕY%‹ W…‚ÅÍ#›í›í|&ùLòȋϋϋ‡Ø™Ø™ØØäÜäÜ䄸îøîøn°ÍÚfm³U“U“U—'.O\†ÒºÒºÒ:°ÄX¢,QP]Q[ËbhšÁéÔÓ©À›¡3ÆûÁ.€W«_­†{`—Ì~7Õ7Õ“W&Ÿü9]=]1]ó%ó%ó%à<è<è<“ “ “ 0¥N©S*,\Z¸´p Ü…îBw!¨‘j¤ ²WvÉ.p]výèú©ÎúÓüizWâ*¥ü@ ue°=õ9Ú\¹?ÇRd ^þïòã¿?†*xƒ7@uI£4È•r%^ù^ˆ¿ô¦ã¦Àä2¹<üú¯9¦ÝÏònAeA%Èöàd–J´ òŨñK6ÙHùì“} ¯¯ yA^€rÊ(yKÎÈàÏà^ñµº\]Ž_þX,Úäß±/ðýwò?¸wåûºx`ßcæ ö€ø/•ÍKIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-14.4.png 644 233 144 2556 13755454066 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü#IDATHÇÍ–ÛOTWÆ7 2‚Øɨ¼é$Ä4jÀ H‰h„àƒÆVHh´õÁÛƒÒh+bćQÁ€7‰e"Õ:š¾ƒ t4™&Å[¤0b€™sö¯3›3HÿöËd­õ­o}³×ÞëlB!C¿"S#S#ÍA;ò;÷.n]Úå }Nƒˆ¢ˆ¢ÞÃ0ï̼3I“.ê/ [Å><_ƒ?¼žò‹Da8b[b["òBöQØbÝbû"hÿüL­¦Ö±ì¼¹ó&ÀÆ|o¿} 0œ7œ†­â ¯ò_8¿8úY}!`Îí9·#þ‚ؘØ!ÀR`)Xº+xµ6nظ` j JF€6Ìe®Ì|øPËf«x¯òŸâWõTý  Ö,X#l.Û\fºLxÑûí[¤êù[j˜ _À mÕ¶2ò¡|@`Ø*®ð*_ñ)~UOÕê1Z© !ÄɯÑJ%)A.=Á¿Ô¿d·¶D[‚? !÷Ê=rè©zªžŠ±>1Â0¢ðúv};~¹W»£Ý=!È%ã%ãÀ‡Pý©V¾BˆôÓ`ò˜<¾hÚ^.~¹´ß(¤C_¦/㟯l²É¹Mn“ÛÂücŒ1L0ÁÄÿá5»fŸâ+dÌ}Ï}Àä3ù|ÑAaé§C;vîwþ­ÜY¹äa=Kñ9¾uØ6dÏêžœžœòð´{Ú=íÐUÒUÒUÈ ƒ µ²VÖNÃ÷xz][:×w®W^=‹/+Z*Z€÷A=‚¯„¢{/\[{m-Èå®ÒŠÒ &ÔéXÞ±¼cùLaùü@~rÏçžÏ=oøõL=SÏY%«dÕ4ühþ(äžËY™³Rí©Ü¡77Ÿm> < êüd.4ÊxwõÝU˜LÊ®f\¹<––>KÜjºÕt«É(p¢üDù‰r ¢A4@q{q{q»Ÿ85qjâ”aŸgŸ³\®FW#X3­™ÖL8à<à<à„œ…9 sÎÜѶÝm»ÛvCVAVAVA8>;:;z 敟 >Ž'Ö'ÖëϳÓì”-Ü}ã}ãéžNœõ0ëAÖèjíjíjGš#Í‘1Ý1Ý1Ý`)³”YÊŒ1]?¿~~ý|ðÛü6¿ ìOíOíO!>.>.>,›-›,› ü…„¦”¦ß o´?âÇ—-¡Ãß½—›W.]¹Ì ö\u$/5/9/ÚŽµk;fÖ¬šU³B«ÎUç‚O§ÀC)C)C)nK·¥ÛÀ]ì.vyuçêjëjauïª}«ögŒùW¢®D?¨3¦n¥¿rå~àou+µN­F~¹>r9éš¼?yf«ÆgíííJ)¥¼ÕÞjo5èfݬ›Ãðñ¡ñ!äèúa1,ÂnåÝÊÈÊHPz„š`zozï‹÷G÷Ç)žBz³Þ6Ç~ÄŽ¤Kº¤ËB?ýô‡8Ä¡0åÕTS Ò%ŸÈ'@©¾KßÅ'^„ø¸¸ÀÔûgÚš¼ò›¨o¢«ßElàuà5àÐ&µÉ™“Ÿ£áL2ÉÀÇà·Rþ){e/Чðz•^…Ÿ£Ú#íâ'ToòóÉ?{¿•³öu1kßc³óû-#`K—bIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-25.8.png 644 233 144 3034 13755454067 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÑIDATHÇÍ–íO”gÆoFäÅŽ+Tš"¾ iEv’M5¦ÆHƒS¥t›jãB*éfm6ik6iâÆØ®ñ½°"3$RÙRÒ(Ñ Àj€¡Ñ»í–¡™:ˆLfž9¿ý0óìÌÚÀûËÌuîs®ëä~¹ž[RJ©´è¯CŽ!Çð«6TÇâ)%)%k[#¸Eƒ„²„²Ñ?Á²¦eMéçÒÏ…¿a}^ϯW*Ư§ÇUšŠ’Û“Û¶Fq=¼m~ÛœòRzR©Žù¼×ù^'@Ç…Ž ü¦oMßx´õÑVˆa}^Ï×ëu¾x~UÿŒ¾R°¸kqW¿!9)9I)XõÚª×rÿIÏ…7Jß(øqÑ‹ÄÚÏ€£l|øÐÇÃ8¬ÏGóõzOç×õtýH? 2,¥`÷;»ßI=)øö2Ô­¨[¡ëÀQŽb„/äÐÞÕÞ%rCn@İ>¯çëõ:ŸÎ¯ëéú‘~b[éUJ)[1”ϔπdo†F‚˃Ë!<ô}ùÑkuZhëµ|-´ ­B«vð:¯óìp0”J'úO0;˜ ²*Âåžr0«ëë[ù¥”ZwR}©>_¢xÜ|pø;@^•WñÓH3Í Ã2,Ãq’ ,°‡ýøñÇu’„€O8ÊQ±ˆ?—¢üÛ¢zQ}îFú‰®XKŸtH8 Ó…s…ËårAãõÆÎÆNä®ý®ý®˜`‚ è8Þq¼ã8œ´œ´œ´Àé;§ïœ¾Þ>oŸ·ï+ÆpëðåáËÐðç†>Dîÿe,i,)¦'Ý’$ë[ÛÒ§Â…J)õÏZpžrž‚ѯÜÇÜǤ*ÇŸÝ’ÝBÀrÈRm©†Ü¥¹Ks—B×í®Û]·aµoµoµJ¥ÒìØ7°oÆ-ã–qK¬¡A÷ {Ð kZÖ´¬i2­ÌWæƒ5ërrŒ=þ雟¾‘*p®s®ƒpu¤¥Ý{á³>“vðüp.û2ëË,¨;T»¡vCL`ãÅ7^„=ö=ö=v0˜FL#Pâ,q–8áüüùùóó¿\©þ’þ’þÈÊËÊËʃæp³Ö¬Á+ƒ/Ÿxù v÷ ÷<îxÜa›q§q§´ý:épÒa °ú«üUJí~¼czÇ´òVÏT¿Xý¢RæLs¦9S)S›©ÍÔ¦TeCeCeƒRe{Ëö–íUªr¾r¾r^©#›l>²Y©¶¡¶¡¶!õ¿ñ$ÿIþ“|¥"GQ©Þ‹½—z/)¬e­Rª‹L2•W©ÅÓ‹§•R« ‡ ‡(Pá¿J;ÌNÍNÁȱûöûvXbJ™L™„ú¯ë{ê{¢îäƒ«Ž«Ž«°ÎYç¬s±•Ù$›d“@c°1ØŒÅm­¶V[+555Åâ_ÿÁúà¯×>¿þùu€…>‚¶¤wI¯´«ÐrýŒutÀ¹¥Î ç„Tn)¥ ‰…Á dTdTdT€í¬í¬í,l o o ƒ±ØXl,†ýýý˜Ü2¹er ˜]f—Ù£E£E£E°+¼+¼+ iÿJs¥¹`÷ow>Ýù”€÷Œ¼/ïK´×þÈÇÑ3Ƨ‘[5Ö+<í‰ÜO¿»ÇÝîEî•{ƒÛì6CÀ°, Õh5Z x®x®x®€äJ®ä‚˜Ä$&xh}h}h)”B)-[ËÖ²Á3çùÁó¢ýq!!?v+;¸òàʸ[ùó1Ð}%ê3óbSÌ™dH†dd»l—íq~•'y’¤“Nz\|J¦d $E2#¦-oÊ›øå•¿Œ?|0:—:çKä«ÿó1ý `+æ“òÚòZËg–;šQ3‚´…fC³9E?ý8Ãn¹&×À#f˜“{rðDúã mN›#(_‡¼!/`×ÿ­Ä·À³Îÿü~+ŸÛ×Åsû{>_°ÿo2{PìIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-54-red.png 644 233 144 4176 13755454064 15613 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü3IDATXíWkL”W~¿Ëp©tg—dêॸ^ †*+­ š8˜H\/Ø@ fW]DHSºA"ÁŠYjRm ¨†‰7f·Z7jÕÔm(µufÄÙh‹·`dà»<ûcæ|ß7“®f³ûþ÷¼ïyžç;ç9çdˆBñkŠ~U¬#ÖëàÆÃ 1=1=1=k/Ê¢,Ê·>£¥´”–¡²Ú@"‰$²ˆÌÕÖÏæ3<†ÉǯŠÔcÔWATÁÛ#ëI ıGì±?åöqû¸}šs¢/Ñ—èù»…w ï›lz°éP”]”]”­ç¬ÎúÙ|†ÇðßËõ¿22ŸÛÌò£ü¨g)[¡™¥3Kg–ÊÚÚÚÔ×üOüOüO €1Œa €x-×Y?›Ïð~$ßÜæ—ë#Ëë¼—÷ò^Ïy}%ûJöi…kÊ5åš‚ áPÓÔ45 ’\#×È5€œ!gÈ€l•­²Õ‡ë¬ŸÍgx _Áoy]“ÆÙ9;g'‰‡ÄCí·Ù„¼†¼ê¼jɪ «R2•Lø¥ö‰Ž‰@õHR€IùMùMËä2 ã0ô˜„>@õ¨PHíÁ†` V)ñJ<ü¬ñ1~¦‡é#Ó°iØ4¼~k°ÔYê,ujªû±û±û1ž‡qüòGrµ\mà‡_§ùÅxÆ~õ]õ]Àwø?REЫŒñ3=š>±\,˯b…c%ÇJŽ•¨ $;Ãò6y›;3;3 ‹ëâ ó½Î÷ »µ»ÆÕqÕ¨W™­Ì6¤Aç÷Îï`hhhÐñC|Œ_[Ù}¤Ž$.I\’¸ O×>]ût-¨~Õ )웿¸ôÅ% tî@l[yÜq?ÀpÕpÕ/-°ó–ó–¡ßßü¼ù9 áCõ©>HŒŸéaú˜ÐÃl<²ñˆþe²krÙä2#l¨±³±2ÊüÉ(@mU[@¹©ÜÉ-¹u·Õm€9%sJŒÖöiÛ§:¾ìšÌ›ÌÓù™¦©¦|S¾)_;c±´…($¢ß²¡«·¯Þ&"úvôÛQ"¢_®ø’ˆè­ª·ªˆˆÎí9·‡ˆHœ+Î%""3™‰ˆŠví "šw}Þu"¢¸Gqˆˆ‰(. ІhHç7u™ºL]Ú‘_ŠÓÞï€w€\A~Â7á#AØ-®W¨,Ü;ÛÛKDôÆî7víþz÷×DD3î̸CD´ñÆÆDD÷ï5}0ñÁQBMB ‘ý‚ýÑ”4%Ñd\_\ý¾){¹ ®‚Â+HˆgÄ3â!ÓG¼•·òÖ©ŸÃKÜp²âdÁɃâ¦N-€µjÇããÖŽ:GÓÓ ÕgªÏÀô;Óï@êÛ©o€ÕeuhÍ€”…) ¹ûxÚñ4ïïýãýãÚ ø'.KçÒ§~&a¹°\X^]ÏNYÊlËËy®û÷Kï—.—ÕIR’••´“}Õ|ÕlôÞ©²SeptèèìjÚÕ¥¥â7â7 ²ú³úàüúóë @IP€%Õ‹Ž,:¢h€$$ IÇŸSB~B~B>‘xY¼,^îðj~Qî®Ü]ò~í’±µ´ GXP€;Ê5 ´eÛ²@ñ)>À‡øÐ°ðþ±á±aÏCýÊñæ=Í{ôÏ-½±ýÂö J@¸SØ)ìüçæPÏN=‹™Ÿ˜ÒMé¦tÏ 6ÁVsàÄêj(ýfðìàY¨À畟Wð_>sù (åJyhûÉ#yå~¹ä9Kº“º“àþÐý!:GO|úchOh=_Ï×O¬å¦sÓ¹é‹Ú¢ 7µóµÛÆm[ÓÂup]\óŠòg‡Ó>Ë> Ìy¿²HYd¼ÈÕ~µðÞ1Z“˜ÔÕj™Z¦¯¯·ÃÛâmRâR¦¥L“ʵ•¬j…Z[ž&ÍJV²Š]kåPŽXKv²“H ôjOk‹e«e«dv¿ïºéºiô®”(%.á’A` ôÆÃ6´êfµ]mG@ j€m×·Œn•÷k/ИèÝŽƒÉ{“÷&ï%âóø<>ë«+a2§…ÿnî ÷„{\_jejej%‘©ÔTj*uÔ¼›“—“—cô®bSlžážé -Ï—çËóõõmÊlÊlÊTW3<“Ùd6™½¡ÜGÁ]ŒÚzâ¢Ò¯"sK\È»înÝ»¶[Á»fÉ,™uAÊ#å‘òH¿v1ˆAÀ???¨jžLàø„­‰²â'QúbéåB“Á»Û¹ík ¹®ƒë0z×át8uïJNÉ)9uç¾H~‘ü"Xì[ì[ì“§y±KèºþšÅ¬¶^´À_Ñ+Bo`ºwG„ƒw-–FÉìîpw¸;D>¦ÔÖgë³õé׎Ø"¶ˆ-ƒáŸ$ñÿˆâ Ók¯lÂÖ°wÏþ'ïænÈÝ»A÷®#Ë‘åÈ©P]Õv‚+抹â5Õ‘4ü³(^ŽþËx•wW õB½PïÉ`‚‹ëŠëŠëÔ£i“i“i“Òm«G„aÄ6“Ú©Ú)|íî(¾Xú#Ú»#óܹÜn@ëh­Sò3øü €#Ž8úÛW)”@J€H¸&\®q—Â7GíÜÿ-ÌÚù”OùâíÈòû%¼Ê«¼ p¹‹ÜÅÍ ÏsDíŒ+ ÷•[ýo§CI‚ûÿIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-38.png 644 233 144 2523 13755454065 14675 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mH•gǯsìñ(…™Ç}SÂÖË©C5•ÇRa…/½¸@2#HÔd"{aå2”6-â˜l3Ö”ô"¤ic~p0–-Ì,œR(¹Òr9ô<Ïsÿöáœç_®ëº¯ÿÿ_7×uß""ú 8“Éθ í,±ý19197íZŽ‚?ÁܳsÏÌ«›WgöÚ¶·ÖGæ‹Øø‘|–_âÅv¸š\M_È>…Ë —Ç|´¿¹±Í±ÍouØ}m÷5€«õWë)…á®á.€1ߘlÛŠ[ë­| /_Žý_´Ú ÇŸàŠvE‹Àü¬ùY ¾.x²r7ænxõ,J9Àæ0Gù€ &°¾¿"l+Zoå[x¾Ågñõ$f$fˆ@þöüí±þ`BïP–T–dñšœ`èú€Qd1Ꞻ€ض·Ö[ùž…oñYüA=òß³=½¶Æl@àÆ]ã.€Yn–0”K¹Pú þDÊ£«ÅáŠa¾6ÇÍqЇô§úSPKÕfµf…YA€Œ;Æ|‹/Ì/‘‚<Õ;;<1  `€ÏÀ£Ï°uÜ/¸_p¿*W®< }ÇûŽ÷·ãêGÕ¡:PGä óõ„„ýö%\z}éu8½Øü.Hí èèè€ø3ñgâÏ@^v^v^6xòë"P•¢R@õ£¡˜çÍóLòöƒæØ;&?¡É¬F€Yf–à+.r¥n«Õœçç"*RK 5 ÚU«j¾¥v˜ÌÐN£3ÿý“ÆÞ•3öu1cßc3óû/~_ÐÈVE‰;IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-16.6.png 644 233 144 3023 13755454066 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÈIDATHÇÍ–ßKœWǟѱ㌿1Í…Œ´¸,Z©¡‹P!1M‹0¥CZmL´YH‰Q[zeÓ­b/rQ$]¤ÐØHŒqÙF]bÄ6†Hˆ"¡ñGâ(jkÉ”h§&8ó¾ç|öbæõÝ¿ çæå9Ïó|¿_ÞsÎ÷ÉŒ}rrÒ£qÂ1{>¹<¹ü/ÿŠÆ§Mp¼çxïçÈø&〬î¬nõÀŽ­¼Uß/bãÇóYó’)ö„kÀ5àØ‹OÂÁW¾šüb4þÇMpº7 ¨ª¸Øs±‡Oà×ñ_Çžì{²ìØÊ[õV¿…/'ÿ_’®$]q,‚ë× "ðÒÛ/½÷i´àaøßñ¿°’¸’¨À| ¤’ª÷!BX#[ùX½ÕoáYøŸÅÕ#°£lG™8tàûl´áÁ?á3ïg^‹/2|ÅW¤‚2BfYÃè›ú&`ÇVÞª·ú-< ßâ³ø£zì¥T""moaVƶ [*-’É}ÃÌ6³‰ÄZÖ•ºŒ)ã®qÔ²ZVËØã1¿ðËv¤u­Ñl41îE²"Y f¢øP±X±„büÛK¹*"’ßî€;rryþåù—Á¼€Kêõ O·)Òñཤ—ôRœvÚirÉ%7nÞ7è%½ªWôa}˜§´ÇðwÍÝš»à¹C!'Q=±?vzŒõºÚºZÐ-ê5 ·«¶«±«=5;uê¾Í7?4?4?m]m]m]0Y7Y7YgçÕ9uN³ãGŸ<ªTm]mmèÉú‰é‰éíê×ðÿðø‡ÀRTðºˆÈÐ÷fß›`´èªoU¯:ΖuD®g_Ͼž ‘ÕÈjdJÖJÖJÖÀßêoõ·Âî#»ì>S›S›S›q+êzìzì‚ÒüÒüÒ|ð·ú¿ô »…‹ÂlÝûn¹~¹^—Ö.­*ŠêIƒé¾t_q‰ÈÞÚ½µ"ú‚I‘ã컵þ¯ý_‹Ë»×»Ç»GÄÓèiô4ŠŒ96rL$P( ‰x]^—×%R^]^]^-’S“S“S#ÛãjïÕÞ«½" i i i"^—7Ó›)R^ékò5‰+÷ïYÃYÃŽ³"o¤¾‘*⸒֛Ö[\’ 'HüùsÓ¹)’tR~’Ÿä÷Cª3ª3Drr>ÎùX$ì ûÂ>³Ùl6›E’“’“’“D g g gDúCý¡þÈmu[ÝV¶°È‰È‰È ‘dG²#Ù!R8S8[8+Ò¯úóúóDÆ;ÇÍqS~É\Ê\ÑIR!$ˆ©Õ cZ""Dä¯""²Ã6þm "øðáÉÎÎIéNéNéi8Óp¦áŒHÆXÆXƘÈÃÀÃÀÀ-̳߳߳_$u4u4uÔ®Oÿ9}0}P$°h 4É•Q^TjÂ1Ûü?62ôýùïÏÑ=Û"[e e÷ËîÃpÇpÇp‡½wªFªFªF eWÊ®”]P³X³X³³Å³Å³ÅPp¹àrÁeXYYYYY£G;v‚'ìY÷¬ÃÓïþþçlmÌ[|î7è‹Q=ö©ŒÔ}Q÷°lJóšy 6Ú7ú7úÑá¾ðùðù¸SwGÝQw Øl ¶€Ú©vª }Ú§}<<<jRMªIÐô}‚MÁ†`Úl ï ï‰;•³uyuy–áž‹ Ëï÷oîßBN˜ûsîÏm~aÕ«zã|ìoTS *¤BʾŠÐ¹:Wç‚^×ëz=ÎÇ> ’JP!íÔN]ªKyª£·ŠO?›»;wÀ½áÞ9¹ñ?>&‚Ž9¯®L¬L´—±j¬æ3ó™íü\¤>Ðc±+¨‡z€užðô´¾§ïk±úkÊ¥\Dô˜ñ‡ñð­åü•ÎJ'D)ÞùŸß»ò¹}]<·ï±çóû_ðÁÇ9iNdIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-38-red.png 644 233 144 4210 13755454064 15602 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü=IDATXí—LTWÇÏ}ï@D‰[Q·V+«,¢.ÍÊØŠ¦× 6ÄýCEDbc!¶R(þØ,U(†þ 8ƒÖÕdýQ–hMcp«´»ŒY™©°ÖHE\`˜÷æ~÷™ûæÍdW³Ù=ÿÀ¹÷Üs>ïÞï¹7Cäµ`Òê[ˆ-ÄÆþéŸÖ9­sZgæ*ES4E»u”–Ñ2Zx§y)¤"| Ðçu"^¬ùDþÀzÒê@#_)•R©d œŸ§t*J§u„mgÛÙv$2j4j4jʹ›s7ç.°apÃà†A 7%7%7Åï‹y/Ö‹|"¿¨÷|’~èÏ?,IcÒ˜c™Ø¡˜¢˜¢˜"mGóµækÍ×øKÎÇÎÇÎÇdÈ1Žgx†gpÀè¾o^Ä‹õ"ŸÈXoþáçó‘9B’†¤!Ç‘ åjÊÕ”«ê¯Üî7à3Ïãyš J/”€zH=„cw’î$@ËÚ–µ\N^8 ê„:¨V­F«ÑƒÇ   ùf}gøˆG-Zµu#™#™#™€Û¸ ±â›O9N9oßÀŒ‰F?'1'ÑxñÖÅ[ ¿"¿yy†xgn\n ç÷š:’ù¸ïq xŸÝ—} û@öÿ—iêzu=€a1”œ”œE!E!ÆÜ_üøÅFà‘÷GÞ€wìïØ`åæ•›ñWÖ\Ycˆîé´àqÁ#ø$_KÅ™2L¦ ½ÇB¨„¥²T"ú¹Ú±'‚ˆhWå®J"¢s•ç*‰ˆZû[û‰ˆ^/y½„ˆ(j_Ô>"¢ô’ô"¢»3îÎ ":¾îø:"¢&µI%"Z~hù!" ÷ݼïˆèDÀõbê0u˜:ô–÷+Ï_U¿ª~U=îM²I6ÉœÁœÇoù¾ÅØ £óGç€å¦å&°xiÍiÍÆM9½èô"ãN'D%D€©ÂTÀõV÷[ÝnM5L5<Çq\¬N™™23e&î >’²¤,)ËýÈ7P×ZÚâiñ_1ãZèDìD,œ8|â0—ýˆýˆhhÖÐ,#Psks+¼šýj6T~]ùµQ…ƒƒþxítSAS¿^÷ÁËO/?Õ_Àß±–ÀÜH^!¯Wì®]û s¢9Q›oÿÍýwï¿ Ú#íœ<=¬?¬ÊÆÊÆÿ·óÁ7AÏ^?{Ï]<J>+ų̀¾omßÚ¬ñm7ÚnÀ5î›^º;n2nÒ£?òly¶<ûÈS ÏÏÏ R®(W”+íCú…Ÿ›öFÚZ™Èï)o‰k‰ƒ 6_q¶œ-7 4ÄÙÛgo€*‡p²jV à©7ÞsäícoÔµ(úKqEq…g\,‘Kä’¿môúa¢ë…Å4˜L ¦G‹XP^µ£{G7O×Onfï’Þ%à@kqk1gwOwháZ8À›×õÃä“p2éd ^|ùâËþý=5f­·Ö{÷—j¥Z©v2“ÍasØœÅÍA€òM½¿6±<–÷fkg¬ChųÅÖe]h]¨#ŒkežÅžÅF ^ƽû¿ ›pžîû¼c8ðt}œC탟~ ĆšãÌqêV}'?’·ÉÛÊ-:ZeQ–bö³¦R*¥*‘•¬d%’‡åòƒçô§µÉ¼Ö¼V´ïø|àsAžîVÝÞ§´ mí ÑÙÚR˜Aÿ@%Ù „õQ­ÖZ“݆D³ ÖÇ G~¿ßýîÌýÍo&YÍf÷ü3œ{Ï=çó»ç{ï D“ö&˜¸<Äâ q Ï}aSZ¦´LiÉJ‘UY•ÕŸNR%P09ÍêH&™dî>«ãñ|=ÏÇóÖ—òùvÒNÚ):ç#çË-r‹Üâv »„]:ˆ9|$|$|ι›s7ç.°®o]ߺ>`mÚÚ´µi~ŸÏóx¾žçãùy½Wó¸,Пý…8*ŽŠ£½ |‡¢ ¢ ¢ Ô’×N\;qMs?s?s? A‚Æ0†1½èE/ û¾yÏ×ó|<`½Ù_¼š,oˆýb¿Øßûž íjÚÕ´«ÊÒî‰î‰î tÃgl[ÄAQ«Ô*µ PÕD5Píª]µ|ß<çëy>ž_¨oyCG‚CpÉûä}ò¾†Û|µÎZa­Pì:اZ²– ·Òð²ñe#Àz•D%À¸š¤&€ºMÝ@C5ªá·q6ÈÖ«ÌPfJƒwžwÀ>Õ<šnf­³V[«;¯Ïy8™˜˜¬ZÌ,5–K ›Ó3Ð3Ð3€a_·ú¹Z¡VÜpûËè#cU¬ ØIvŠ…ú¹ò‰ò‰mÏ@oDo†-5–JK%›Ãyt>y»¼]ÞÞ¹OÍ?š4ŸýÞ—À£8x®þúþzÞ¦ä¦dhšhÚÒ´Ξ<{žôü##ÒÐ/C¿@“½ÉÀ{Þ|Þ ^—×(-SËÔƒ=¼¾¾³|Ä\á Æ/DÝ`Ö`Ö`07sCA ÿæsíçÚÉsòqù¸ÑY² Oy<ž^z,×-×@.—Ë ñîL)S£Ej‘:¨2˜õì̳3çá|tÿšk¬9àÿ2µ{|ñøb.>t°é`$?I~Ðâ¯ØW0!LÆñ­ý[û`þ‘ùGŒã÷—Ü_ïF¼ Àu)úR4 vcàá<œOô©ù&›Éf²ég,„Šƒ"ú ºqûÆm"¢ŸG%"Zzyée"¢Ô¾Ô>"¢öÝí»7Èù?æ½½ûíÝDD¹m¹mDD%%DD­å­åD4ÕúÐúˆ¾Q÷¨{üõMͦfS³~äùýÊòRêSêSêqï¥ðbøÅ0€sê%õ¶òÖçÎÍ q¶8|½ÿëýðÁýî%p9ör,̬œY ¡ËB—Àú÷׿‹ß[üohuh5€Ÿî¦ÜMXüd{ø–¦MO›ž6÷8‰vÑ.Ú'žúêNï<}:Û ©±±ÐWÝW ÀûÜùÜiìÒXÑXˆ?ˆ?ÀáïïT¼SÅIÅI†pÅãŽzDõìáÂÃ…þz—¶w¶wê/à„x!^ˆŸxJÒi‰´¤¢–Ÿ²˜ßZr-¹êìžõ÷ îø¯¶"R‰T ,±,Ñøí7nÞ¸iÜѫ˯.€måÛÊ !$!Ĩ¾NO§@6?7íÜ4x=¾é…±±šþH‘R¤ùå0…ÙÂla6"ùŠ|E¾Òد_øk3>ÎøX-æùµÒãÙdzá…ÓWÀ#‹³‹³ @¸3xgÞºóÖn_Üðä¯öå–·|h»´]@ÁÍÂ…… 5X$IEÿÜ0釺(Т˜âMñ¦øÞS|AiUÉ©’Sl…Þ¹é]º.€gÊΔp_¹xå"hùZ> y^ï“Ïž|ߦ|›¨ùmÓÚ¦ù÷·iÔQ騜Ü_"@¬kÅÚ—Y a†0cÁ‰ @é–~¾6 ›„M™Ç„F¡YhæZÑþèìpÌrÌW§G-Öh Œ@ì<;Øýkgí€$$l«eµ~)õ7öè;ÄLµØ,6e»¾“ÕR±T\jÕÑìd'»lñ³¦S:¥ËÕä 9ˆ$—ôHzTrQZY6Z6*æžòî[Ý·ŒÚU•p@;Ú Úå¢s²8° ðò…›þ¾ij±þÉ.Ùåܵ#jGÔ"Ñ*ZE«pÖG—Ï1åûÝ Ý“îI÷„Ö9esÊæ”™ L¦ç^]»éÖtkºQ»Z©V /œp `Còo´:O§Îó½úäúäúd¶BËÍ&³ÉÜÿrÒ·L ì´ÐÔz‚Üï}ËÔIíöœõk·´ª´Ê ]³bVÌ~ í±öX{ì×bºÐ8C»B»B»XŽ®É01L Û¸'°žt$ˆ/„^= Õ´»YØœ™#4 B£Q»Îg‡_»J‡Ò¡tø•û"êEÔ‹( n$n$nDý®Åf©YjþS*—šOzÁ€¿¦×˜?€'ðk×%¹ Ú=h9h9¨˜{{{xá…#œ´´µ´µ´ÕíÈÇäcò±.ß¿$¡ ªë§i¯ 6¾`£O»þ“v3Vg¬ÎXí×®3Õ™êLÅ7“óLï„'ä y™eÄ¡ ºý—ö:í.—j¥Z©¶7‘çÕäÕäÕ°C‹Æ/Wþ¡·Ú%¹$Wi45P5ïÚ‘z‚ê…ÐÿhÁÚÝègüK( …B€VÒJZ©ÅŠ3Å™âL@ úë÷1žOŒ‡Hê”:¥N¡Ý·pCPçþofÖÿ²‘lòíÀéò|‘‰Ld€Ð&´ mgMŽÏuu¦;(ïk[ýo-¦jYÓøìIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-19.1.png 644 233 144 2704 13755454066 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜyIDATHÇÍ–mH•wÆïãk’ºIù)S—A/Tdè’CÌlF¥4’K’UV&µ ‚bX`Tt¶1X+¤¤&µp“tR¢ ôr–®ü *½l9KKwœzv–¤ÏËÿ·ç<ç9 ö½çËá~»®ë<ÿs_ç/ ""ï?"F,ŒH ÄûíüœMs6e\ Ä58ŠE«àïÞù érÒeó‰[u«?|^ÄÆç³òò®Ø‰Ø†ØG^0®†W~¼rNr þÊqMqM¯u(k.kh¬k¬ãSxÕùª`2o2ìØª[ýÖ¼…Ž/Õÿáè–èÇ#iÓ6.ú<Ððt|TøQ!Àpäp¤ŠÃ įò?~¬g<,¶êÁ~kÞ³ð->‹? G`þúùëE`[ñ¶â¸K'W¡"¥"ÅâÓš€Sœ"t¿î0JŒf@y”°c«nõ[óž…oñYü=öQš""_çcl×·ë!Af¼öžö¨ûÆcZ° ÌQó…ùô ý/ý/PûÕ~µûyÍS@Ké4hf‚ž©g‚ºÀW´+ðùCG9""²ô[ˆŒôGqs } Œ;Ðh.5—2mñ©¿Õ„šŽsœãaBòÉ'H&™ä°| 4€á1<†h3Ì^z¿§ßçóû£–~|c5¿0U^V^ª À\máÖºjKkKQ½[zó{óm¾ž¶ž¶ž68»î캳ëàY÷³îgÝv]ÝR·Ô-P'Ô uÂÎ×–ÕV×V£úÖv/ï^neÍÕꓲ§eO­£­ùEÈé>?nøqèUjïÎŽv`ÆZ‘»Æ]ã®ÏÝÏÝÏݺ8uqêbpžwžwž‡%‡–Zr†õa}X·…h Z‚–;»vvíì²= ílKVK3Á¯±×¾úèê#KX÷áËÄ‚ÄÕ£õ£õ0›ÁJVBý²k¾k>HYž²,eóñAÍvL·N·Ú[ɯåùåùá[IÈÇÆâÆüQÐÿOÿ?!œÞ˜ufíc$“D¨-j‹Úfi*M¥9ÈÁ0ÓÐB¶ê ó1ú;û;ÿ×ÇDPAçU®HWdµƒX}DjŒicÚv~ª©¢ Ô¯ªCu}ôÑxù“?Aõ«‡ê!ð[Èùw›»Ñˆ1>0>.„œ?Ö c wþ·÷¿ò­½]¼µ÷±·óû/.ÆØq¨š%IEND®B`‚routino-3.4.1/web/www/routino/icons/ball-2.png 644 233 144 220 13755454064 14347 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷ÜEIDAT(Ï­’Á B£õÿ¿ü:tʹÂMŽ:EÀH!åbm9ÄߦC´ÄÏbž“Úõ e)TÐzì+þè¬òGz »¯]ÆIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-4.8.png 644 233 144 2437 13755454066 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÔIDATHÇÍ–oHTYÆÿgÈÊØ–(ŒYÛ 6É \ –ŒÔÜÀÀ4¥JXv] Zü°A±ŶD9Li`qSw5¢0ŠUÙÚHZ”>ˆm­¥K#¬eåø'ǹçžß~˜¹soYûÙóåÞ÷=ïû<Ï=ç¼ï=„B¤EŸâׯ¯_±ã¿1ý¶]¶]·El„¸Ò¸Òïayýòz€W\ÔMÛ˜7â­ùB˜øV>Ã/Ò„éH¹’r%./jŸ„}›÷m¶}±ÏÝû5ûµ ª®W]honoæ[ëëx™÷2LÛ˜7â|ÏŠ/N¾Å/$u$uÄ@JrJ²à(t®«Žü³ŠwïMMPñ ÇTRU0ÅƘ°ØÆ|4ÞÈ7ð |ƒÏàè°rÇÊB@‰«Äeÿ9’0ø+I?’nð…¯§9M*hSÚ€< uWÝ Ž80mcÞˆ7ò <ßà3ø#zÄ›{[»Êm嶘 ‚²Svèíz;auX5ªF”¾V_¥¯Â“L2išzXŸÑg@ûW.‘KPêíœvŽ0È€ ¯£øª<¥<ÅX»Ó²•B±±ìcö±©DðJ¯B~F?Ã,ŸSE¨/•K¹,‚ÆgÜ4•¦4¥§8Å)KÜ/Üç>/›e3³Qo!ïŒwLþˆž¨0ÏŸp°æ`  ô- išê'Õ©:#^_—¯Ë×wÊî”Ý)³ÊQ9*Ç´¶=l{Øîîî0üÃpÍp®ZÞ°'¶¾[büQ=Qaý‡áÒä¥Iˆ|‹úšY )r+·IX hloÜÞ¸½‘£ßÙïìwB†'ÓáRY*K%ddededÁàWƒÎAg,<¤£|T€eÝ˺ÕËËÑ:šÖni·LÂÚêÚêÚjM¢I4ÁÞ®½]{» »Wq¯â^¬^¿zýêõР7è :lèÛз¡úü}/ú^XÎâoÆ[”?ª'^ˆ„â„b2…Hº‘tCõ™Bˆ@Bjbab¡O:žt<¢u¸u¸uXˆcéÇÒ¥ á¯ôWú+Å‚1?2?2?"Ä<óÌ#Äí–Û-·[„ˆ !~7ÅMKÂG>ƒ?¦çí“Eo®ÀY×YçY'اíÓöip¸.‡Ë¬å É’/$ƒ^©Wê•àÎwç»ó!§>§>§ÞÄɼœy9ó2Ô}Z—U—eúeî»Wlá»oì¹^¡WšûbnÛÜ6Àœï9ßs¾ }…¾BLäNäNä¦ÑM£›FaÀ3àðÀ}¾G‡4_š/Í%ûKö—ì‡À_Þ@¯åŒ ¾÷Œ½U•±*‰6ÆNðÀ¬Ê9昂CÁ¡ààĉ&Š'Š'ŠAe«l• r\#×€?èúƒ ¿“‡ä!³*ù[ëÕz­|ï¬JKÓ¼!o(PÄò©|ʬêQ¯Ô+ÀI %ÀC G9ÊQKÛð+¿òƒ²)›²YüU™*å•[åVK›õ½Á÷ö±ÿéüaÙ-»ôãúqœä*WQ|ÀR–Ó‘£z¬«Ç€Ÿç<Zi¢ Ôê™z†¢A¾–¯ ƒ|$Z?Æ· ó/Ú墽],ÚûØâ¼ÁþÔmEõSÊ{IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-23-grey.png 644 233 144 6266 13755454063 16004 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü kIDATXÃ…—TTe·Ç¿Ï9g~0à00.‘.3‚ˆˆK~ø¦i1â+…­ÔœP¡Pƒ®šycé½(%‚ݬ¥Q¨þhWçUP"¥ë…"_eÁÒH~C((3Î 0sÎyîÌѵ|W«ýÏYû™çìýyö³÷ž}Hfffff&4˜’±©³”ëåz¹^Z•y:ótæi:3{({({èïs©õ¢^ÿ'ïËûò¾oMVLVLVЃ8‰“8IÒŒ`hG;Ú¼…·ð=¨X¥X¥XEÒ¹»Ü]înÓI2JFÉèžY>Y>Y>5·r’r’r’È ¯ãu¼Ž¼4Å!þäâÒ0a1¥b¶˜-f‹?9l›Ã6#2»2»2»²´Ï1èt Vÿ˾À¾À¾ âÜóÜóÜóp)byÄòˆå$=J%‹’‘Þ‘Þ‘Þ€¤K¿Kû¥÷%{ì»üIþ%‰sEp US5U‹‰$™$“d]«cu¬îÊ)[‰­ÄVà­­ÖVk«…]ËÛ—·/ogœóZæµÌk!+éŠtE:ìxïá=¨`‡v›° ›<…§ðì“~“~“~XÙRßRßROµÁµÁµÁ⮑#+FV$|ªÒ©t*Ýb¥,$ É1y4…¦Ð”ÞDf ɘȘȘPzÔûMã*¸ ®¢þ¬cÜ1îˆÓ¿ Aÿ¿ÈøŽñã;\©Æ¢±h,Ðc:¦c:xDƒh8t <àVXa0³1 ¤“t‚Ç0†1 nL=¦S£çü±óÇÎã{êzêz긫r7¹›Üí÷Ëü*~¿êùõxÏãùÛ·F·F·F@6S6S6óÿi¿l¿l¿§7êz#¿2%)%)%‰»ª™©™©™‰éBP'Ôb¼/ƃƒ *¨r˜&‡ÒGúH@FÈ`‚ &@\#®×€„0! ðìñìñìÁtɾ~~~ ¿Rò/ñH| oå­¼õ¥HÇEÇEÇŤp­QkÔi ±ÈXd,⤱ˆ±b¬ 5†°!óóó@jI-©P‹ZÔøŸàþð‡?0U4sœ9ÎØ_Ù_Ù_Z@ hÔ’}cµ±ÚXÍ•j×h×h×Ð@‰Gâch0 ¦Áû_uF;£Ñ€¡ÉÐdhÂrM©¦TS ¹+jæ(s”9 ܯ¼_y¿hªoªoªÚúÛúÛú¾—ïå{ìÆnìÐ~ô÷~¿÷û½ß&ï&ï&o óçΟ;ðÞÀ5P5@­ùLó™æ3È 7 7 7±\â‘ø8>äÿ¶Åëœ×9¯s8f3„H¡«(xæs¹t§v§v§§KN—œ.”yÊèâtqº8ÀÃîa÷°èE/zè ƒ æuæuæuÇqÇI0Çú²¾¬/ý‡e¡e¡e! ãùD>³¸d.™KÅÁeãËÆ—b¾˜/æ¿DýõKP3P3P3èuºF ” eCY€[À-àïO¼?ñ>P…*Tèèèôz½^¯˜¦†©yH]çgmͶf[3º™•ÌJf%ýÙï»ßw¿¯ch|ÆøŒñÜ—ëzÖõ¬ë!é–K„v׋*³Ãì0;€ÒoJ¿)ý>6|lø<·ù¹ÍÏmè>ºînênênꀀ .š»š»š»ÀCÍCÍC pàøXç³Îgi´GÚaïZßµ¾k=T_Z¾´|iÁ6yŒPÿ}ý÷õß?N•‡¯>|õá«Ûʶ²­€j‡j‡j&¥€|ëõ­×·^â"ÒEºH ˆ@"œ’“‚ЂЂP`¨n¨n¨®øk‡µÃÚñº_ÈÓ!O‡<-ìL”'Êålîóó3&I?é'ýPÈ6Ê6Ê6ÎkÎkÎk€ýšýšý°ùðæÃ›ì×ì×ì×@Ñî¢ÝE»¹¿Ü_îž‚§à DÔGÔGÔƒ®­Y[³¶¤ÜXn,7Šö«áWï†3*U¸*\þëzg¥³ÒYùìQ’ÑŸÑŸÑà:®ãú‘}'ûNöÝOnÖ­Ö­Ö­)†¯ _¾¢ËBÓCÓCÓÉÃiÃiÃi ¬?ëÏúƒxOâÞƒ÷à=€k€5À h#´Ú`(~(~(¸Ó|§ùN3 þ@ýú`V¬„Y °ßlºÙt³ ñÅêbu±ߪÔ*µJ=±‚²”¥lD<æ`æ´n嘓ÌIæ$ÛˆjT£z JÜ(n7&ç»9ÜnŽ+hoo§¡³Êg•Ï*'g"K"K"K°Š–Ñ2Z‰ $ÿ.Zh¡|Z}Z}ZŸXŸXŸX H@,–––P_Ò^Ò^Òòzù›ò7åor ݤ›tﱫ±ºu+Í¥¹4—ósyBÔÔÜÈí'ù$Ÿäÿ°-` Ø‚]4Ò@æèù¡óCç‡øm£F7Œn€Š¬%kÉZXD_ÑWô¨œÊ©@4¢ `#èEz‘^D­¨µrQ}ÙtÙtÙ$ìàŽ(< 39³sgçÎÎýô ²…,rèD'#Í£îèCúø[XXA*æžš{jî©ÜÕÊ e†2ãLŽYiVš•ÜXYtYtY´°SrHö‘}d&Ii"Mx܇$yoãmP¦–©ej¡hèjèjè¢Ë®»_w¿îÎæº»¹»¹»Ýžp˜&‡)í£[Y·²ne´‹vÑ.xº¬I R2‰¢‡èÏwnܹqp¤:R©i¹{¹{¹{õšÚ+Û+Û+Ùܪת^«z.#ÛÉv² ±X,‹Aá7¸ÔLÍÔ žð„Çøý®û]÷»p¦z~õüêùðtttÄ…âBqaÚGÌ!æsèö„+LáЗ¤? "ÜõI¢p©®+bs§rWØI‘EdѲÕSŸW.8·9·9·‰;Ä1Ad–Î;4ïмCX%¶‰mbTÌf3“|:ŸÎ§C‘””$Ì|vðÙÁgÙå|å|åüÜÅSE³ëªX(Š…Ü×Íþ—tc999999°H…káQ¹rw§+w<’Gò~¸ÈcØU¤ …9Zé¬tV:ùmc'ÆNŒ€Ša†a`–"Q3^3^3.ÚoÞ.¼]Èv(÷*÷*÷Þº490909°÷ÓŽØŽØŽXÀ¨—ú©(ñ=}XÚ rø©HE*¹0·|nùÜòÜÕÊ-Ê-Ê-grF}G}G}¹±s™ç2Ïe ;]½g‹w‹w‹7¾®o¬o¬o$‰ª6U›ª õ¢^Ôïø‰ÛÀmà6Œ?Å%Ý€+Pü“<!’»ÙSÕ-dÑ ZA+¢;™2¦Œ)û1p╉W&^Cd…²BY!Óʦ°)lJm]PYPYPÙߣ»:»:»:Éwâ q†8ƒžrÙ­tÚÿŒƒÁ_ȹëjB¶c;¶sM$‰$‘¤Ñ*ZE«ölr{Æí·g˜V¶ícûž???Þv§m}Ûú¶õÀ ]ö¤Árü¯8þÏü)ß.†úyIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-42-red.png 644 233 144 4202 13755454064 15576 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü7IDATXí—{LTWÇ÷1TêTÌ Â°«Õ]¡ã‹våÑÓm4¥R¨YãÖú±ijJ RÍ(n¥©Fƒ«-Î R¢&*†5*&F­6]SÚedã€ÈÈ sï=ßýƒ9wi5›Ýß?ð;ç÷øpÎ÷ün ·W(ÂÄÅF§Ñit ÿ.ľÔúRëK­ eUVeõîß)“2)ßfv’I&™û@¤Ïì<žçóz¼~d?qq$O8ßÚB[DGä~ül¹Un•[O„­ÂVa«bŠŠŠÂù]+ºVt«®z¸ê!P˜]˜]˜òù>çù¼¯Ïû=Ÿ‡Ä?Eú3¿Ÿ‰ÏÄgîL~BIeIeIeê¶ÚŽÚŽÚ6Ñ;àð A‚ÃÆ07ÜpºÜçñ<Ÿ×ãõ#ûÍüòù|d~YìûÄ>÷^ ûjöÕì«Ê¢î@w ;€n¥³t–E­P+Ô @«ÎUçªUµªÖ0?¸Ïãy>¯ÇëëÀýÍ/ëh‚Cp"y·¼[Þ]ÿO°Ø-v‹]±ê`±íl;¼J½ò•òÀÜ ÆÔµXË !ÒÆ´Am`î@O Pêý‹ü‹ö‘6  ÀËÃ,vK¥¥R±òþœ‡ó‘¡×Ðkèýó<`®2W™«XŠ«ßÕïêÇÓ`¯ºO­T+ül%[ ¨F5~ÁX +ìÃ> „4nê>åsåóP5W¿{¦{&žš«ÌŸ˜?a)œGç“7É›äM7wóC¥‡J•²õÁ>Å¡Ô*µaüZ«ÖÞ²ÝÕ~jø%àÎë×àØÙcgøÏ|sæ¹5r PÚmŽìãýõ“à#æ‰K‹K‹KƒýIÁ“‚'z¢‚d,ÅR^µD-‰¼Û~ŸðÅë_¼¾þÂù ~+~ qâ5S3ïk=¯õHöú½þP¿'YYçá|tïòêåÕËCWèS»UêàaÓØ´p×{®÷`FéŒÒpÐ#G2Âã²g=€ì•Ù+Ã×ïÝ/ Ëó½wô v‡ÇÀÇy8Ÿ|R³ ù†|C¾þÆŒ´—p‰ˆ~#<‡O†Â ? "J½•z‹ˆ(¦!¦ˆhô•шφe¹e9‘í‚íBøºÖ¢µ„¹1ÆóÆóDT1~Œ†&C“¡Iò³ƒ 8Ý×Ñ×Ñ×AÝ~qÔ3ê!IÚ ¼-¼M ¿cŸm~óûDD“¿Ÿü=‘ã¢ã"Q 7KD33Þë3Óg&"¢·æ½5ˆèÀµ׈ˆ2“3“‰h,gbÎD"º_DED$ž &K·ÇíqS7ç#Ñ*ZEk xfÌ~|˱)Ǧ„I æç{?߀˜13øgygyÀÚmíJ¥TH*N*€º;uw`àÄÀ x5ïÕ<0^4^ T;ª ü ü¨§´ÙÚìP¿Ëû/_ÿþUÈ2„ŒÀc’æKó¥ù;öðW–ü;ó*ó*u¦kuoMo Œ””ÁËò>üt6º6º°2k™ä6¹ ÞXx®ã:`ýâõ‹ ±&±zì=v¾ ÒÒáÃ; ˆ‡ß‡ÑÄÑD mGš%Í¢é)^Š—â<¥ØüØüØ|"ùŠ|E¾ÒاüBË˵œÿ©š`'à‡“ÿíýý©öHøäÖI­ ö‹ý¼Æ7ox*n·Ú""0àdýÉz ìvùšò5šO\'­“ÖÝ+÷'x(Ò’2 é†t÷1ž`«°ÕÚjYž>?¦Œ6Œ6€êTu*oËÞ–½ðc×]À޲£Ð\Ø\Àÿuó×ÍP7µn* –¿}ü6œî:ÝßÉgö{ –êŸÐ=Âjaõh0]˜.Lÿcm tG_%B‰PòÆa¡Qh¹V´Îvg»³=tžj¹Z:o~øáóYĸËcæÐ]o_£§ÅÓ$Ç¤æ§æ+›ô“¬”§ÉÓlÍJV²ÊækåPŽ\IrƒHòHɳí,/`>l>h>¨˜\»vºv†²¼À•À`²Ã}êu§Ò®´¬HIQRà‹\`Í­wâÞ‰SËy}yXvÉ.ç®„Í ›6‰Ñ"Z„SAºRŽ9)ø³Hz =çR¶§lOÙNd(3”Êœ»tíæXr,9áÚÕlš ~8á„À 1:Iu–:K:ßš5 j°<^Ï`2˜ ¦¾ÑqßyÓB[ÔÕ“å^‹ôÍ1† C†!Ãu*L»¶Š0íš“b i´GÚ£ÐØéD':ç„Î :Ù ]“±b¬ûîÎ()Œâ3Òó¤š(í®x‘v•öñ«æÊIIIæ Íš3¤þ^×b“Ô$5ÈâR J/p2½ÀB¼À¯iw¿y¿y¿br5º]ú£⤶s¶s¶s¡±#–ˇ;ƒÿ’L¸Õ7¸N_m<áÝ vÏüšvs—å.Ë]Ò®3Ë™åÌBÝø>ÓoB(Š…â7vD¶£ú ô_Ú‹´»XÚ#í‘ö¸çràâªâªâ*ö·ô±ô±ô1åŸúU{$ä±%Q=ÕS=ÇŽäŠêg¤ÿÑ¢µ»+ÒϽ/¬Ö kZBKh‰ö1QLè×’}ɾd‘tSº)Ý.‹¢nîÿf&ý·|ʧ|ù»ÈíKE&2‘B›Ð&´ýë·ãë©Î¨›éŽªû«þD£4W«®¡¶IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-13.4.png 644 233 144 3022 13755454066 15024 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÇIDATHÇÍ–íOTgÆï™áÅaeðeÚhZÒÖ&d²Y»[@"Zwi°%V4Û†m¦Œ$ˆ_ŠM4jRkš¬Ýe“†´ ¤LÁdH`Ä—Ý‚¶Ù~ЂøÂÃÖÅTt:2ŒŒÃÌœóüúaæpf»ÿ€Ï—“ûíºîç<ç¾Î# ""ËROk¾5ßêHÚÖÓ¿¤rIåË'“v»–ZKíøAÈkËkXÞµ¼K¿eÚFÜÈO¯1ñÓù ¿,Ó‘}*û”ecÊ> u…u…KžIÚ{¿½>Þ¯¼_ø¾ð}Ánøé›Ÿ¾x´ñÑF0m#näõ^:¾þ¿ddXþÙYÙY"ð‚û÷š=É„É5°õõ­¯LÛ¦mÊ ÚC`)KÕF LcÒl#žÊ7ê <ßà3ø“ý8787ˆÀ›;ßÜiïLÜꆽÏï}Þà‹÷ó1K!N„´·µ·Y5¬†°`Ó6âF¾QoàøŸÁŸìÇ«Ïjî<Øl6À–Í[6oÙ ®rW¹«ÆJÆJÆJ̼Ó§'NO@±»Ø]ì†ýö_ØÖ­.Ë(Ë0eF^xøë²Ï—}®ßÌMï×û-7Å/ŽËoå""â4vüdÏ“ÝOv‹8Ãΰ3,rB?¡ŸÐEºCÝ¡îÈÅ¡‹C‡D\õ®zW½ÈðáÃ7DФHŠDd¬t¬t¬Td2:ŒŠÌþf6g6Gäîý»Ú]M¤Ëѳªg•8=á7ÆßÑ7$‰°å¦U2Âî°ûûïdaøìðYËEDx/ÕW,/+Oå)‘¨-j‹ÚD¶Ý~tûQ‘`f03˜)²òØÊc+‰¬í[Û·¶OÄÝìnv7‹Þ.¼]x[¤®·®·®Wd>:Š´T¶¬oY/R1^¾·|¯Ä<áwfÞ™á=Y9°z`µˆíËȾȾï¿3§2Þ¸¯qð_c*µóÚyý#ÔêCÅÆ>ˆ}`Q¬&V«™3f€Þ¬7ëÍ <Ê£<ètºAwèÝaÖEÑŸ£?£æªÉ#I›ÊsÖF«!¸í#bèØgì3á ð?ö?^Ä©æ±Þ©w¦éØEuNÕ¥ºTWšÍ4ƒTj8ÉIN³ ‚šPãj¸±¨üMzqk—µË@–¡ü)¾Ø¯•ÿéýW>µ·‹§ö>ötÞ`æÄæ³hÒ¿5IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-12.1.png 644 233 144 2677 13755454066 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜtIDATHÇÍ–]LTgÇŸáS2H1Q/ ´­ŒY.¦ÕT©56ÅjW .’F1bâ…7FIÐ]ãb/È–lcC] A@B³Âf f'¤Ý2ŒõƒB™ŒŒaÎ9ïûÛ‹™Ã™lÒ«ÞøÞLž¯ÿÿ?ç9Ïs^ÉMü ¤ä§ä§äÄí”?9þUŸ¬úä½[q»Å×ç®Ïÿ{Þùú¯Ö|»æ[tl;nç'׋8øÉ|¶_rÅqdvdv¸< û"|YúeéªuqûÏ>ÈêÊêZ2¡®»®àÎÍ;793þ?À¯ž_=àØvÜηëm¼d|¹øü"Þ—Þçz ™™"P°³`ç»§â ß…½Ÿîý`*u*U§€5d“­=@„ö™O²íx"ß®·ñl|›ÏæëX[¹¶RöÜw0ëïñ‚`4ä5äÙ|FÐH#Ù`F̀嵼,ƒöi.\àØvÜηëm<ßæ³ùãzœV*‘¿ìÀúÂüÂ\4¢²"£ô}k½µ#Ðz½ÎÕ¹`ÍqsT@Tç,óš×¨Ð *T†Zm–™e Äñ¡:½:˜Kð¯´2$"òA3dý’õK$»“…“…` PÅõ¾zŸ¨Í§gõ”žj¨¡&IÈ®pôœžÓsIþ:èËgù,0 &Õä ^æ„oÂÉŠDÒâÂ>hN<±–û,Ö×Õ×¾ ¶Ø¸­u­g[Ï¢Ç&Ç‚cA‡/x4x4x®^/¼^­­­N\?Òô#Ð ºA78þÖºÖ‹­Ñ?nŠm¯Ú¢ÿX÷¸î±ÝÚ–ûÂ6‘ÀY¸ýÑíÀ¼ k8~à8Ëöˆ · · ·Á‹Å‹/aÃà†Á ƒà¹ä¹ä¹ù§óO矣¿Ñßè‰mŒmŒm„C£‡F:;`àFß¶¾m,'þF­5ÕösÛ϶°ÀYájNUN•î€ÙöÙvˆ½G)¥Ð¾éVøVòóò`d`d`dî ݺ7g¼g¼g¼Ž€âçÅÏ‹ŸÃòå7Ê´5ŸÝ*Gå`ðW~à´þ‡þNúök?è^Ý«{zŽstXÏëy৸P5ªƒ ëCëCào |ª3«3!¾˜’7ÿÛû­|kooí}ìí¼ÁþJ*û«·IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-9.1.png 644 233 144 2440 13755454066 14751 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÕIDATHÇÍ–[hTW†×Œ\ÐDS“<©ƒÉƒ}Ñ5F‹"Ò/ÁTÔàÝ(^úR“·¦ ¨Ö—ƈHˆJUÑ"a¢iµj,c5u^ 2äÒŒ!É̹ì¯3{α¥´Ù/ÿöZÿÿsö^k¶€ˆˆ,Jþ x—z—z³Ø{̉glÍØZøc_³ÀSé©üýkXxeလ97ìë}ï®qøÝz:.‹Ä ¤·¥·yÊ’øì^¹{eF^× ™w2ïL›PÓQÓÐÞÚÞÊiˆ<Ž<ˆ–EËÀÁz_çëzÍçæ—sÓ_—¯ËóÒÓÒÓDÀ¿Å¿¥àËDÂ`l¯Ø^04ohžò€5 ,`*&™D¯1ÖûÉ|]¯ù4¿ÖÓú ?¹›s7‹ÀÎ=;÷d¶$ ~€Ú%µK´žq¸ÈE€9iNXÕV5³ zU/<à`½¯óu½æÓüZOë'üȇg{¹U•V•Æ#°ÞXoÀž2¿0¿À0Ç­|+¥Ž©ƒê ΚfšiÀÄHÔ&–e¯·×£T¿Uda€íµ½À”æ¯Ê¨ÊÐ/—»ŽRDä“ï!3’™üˆXx2ìÍç*fí²vãÚhs)§œr <ò\ñ¶DžÕkõZ½@7t¸öM{¯½—˜æ‡°¶ ¥Ÿô“4ví'8Q¢ˆØ«ùØô™¾ }:: 76n„Wý¯ú_õ;z*¨‚*ê¼:¯Î;ñæãÍÇ›C¨$´*´ÊIW[ŒR£4õ]W§ô“~’ÆúÏÂ͉›`GÔ‘dÅì³_Ÿõ>ë…å5Ëk–×@àjàjà*¬8µâÔŠS0d™C¦cÄÈ2²Œ,Ø×·¯o_ŸsQº›º›º›œ<«'~(~ˆÙ¤Ï#Z_ûÈ~ý@µAdmd-XŸòÁj4ãqØð|Ãó ÏxñLñLñ 4µ7µ7µ;ñXI¬$V·Jo•Þ*ÄñG ën×Ý®».cšf§[)¡¯ýädådÙ/`ìÝØ;P;RmÀë–×-¯[ ¸º¸º¸*ê*ê*ê ­$­$­®7\o¸ÞàúbQ#jD888ív»Ýn»Œ ™Oͧ)8¦õµ¯ˆÝiwz^ˆ˜;Ì"|+""¹ÉÞhW´3Ú)R8R8R8"²­a[ö‘Åã‹Ç‹,3–Ë ‘Ñû£÷Gï‹Øõv½]/©e ƒÆ ˆ%(A'.1 I(…rµ¾öã™,›,û­OäaðaPÄc‹ˆp4Y/x\,ŠLäNäNäŠ\¨ºPu¡JäpåáÊÕ"kd¬‘Mµ›j7ÕŠŒöŒöŒö8úó[ç·Îoñeû²}ÙNÜS¢ª…OÞÁ£Z?åç]©»äžyÛ¼ítQ|iá—ðcï½ó牼Qoô|ù¥þ}ˆìŠì²L@”5Ê*ÉÉ)¿ Œ¥À¡ÂC…3á3á* ‚ó@ 1*Xfãx7`#¿^oô|¿¡gè‡æغoë>8|ìð±èC ?üj_©}ÅÐ ÜÎsžЖµe€ 3èdÔ=u 0±‘7ê~ƒÏà7ô ýÐ<æ*}""¿Ë‡##GF@ÿ'@ G› ¤R@¥iokoXŸTéóú¬> Ú5¯æåR.åÂù€ 63¬Ô‚Z~ÃyΨ}j>ëüÛÖõÖõù:4ð‘–¯U‡«túŽÁ釂Ké—ì—쨇‡þ‡~Sp i i šö4íiÚã}ã}ã}f^ŸÒ§ô)ž<9xšv7½Ùô&jüÁ¨{Ômꩉª´ª4cµ-_Ið;‘¾SÐq½ã:Ü/Û6¶Mß|!öØ7X->[\W\v‡Ýaw@{o{o{/¤õ¥õ¥õAÎpÎpÎ0Ø«íÕöj˜®Ÿ®Ÿ®ß0Pñ`ñ`1l¯Ü^¹½rÿ”{1÷"Ø]©ÖT+«ÞYI\ITÇázãõFPQ¡yDÏ|qñÅEu ž~ñô ¸­wGuGÁ¯ïG¿ ¿èÌéÌÇŒcÆ1®Qרk Üî·9@–?ËŸå‡ÆòÆòÆr3~9ârÄåØ=½{z÷ô†zðÇïÛÆÛÆÖ¾\û´à w^¸£® ÄÇÆÇêClš_˜_0¯ý“³‹Õ‹Õ°¿uëþVÈ´eÚ2mÐÙÑÙÑÙ¹é¹é¹ép æ@Ͱf[³­ÙÐ2Ö2Ö2f0:;:;: YÎ,g– ë ë ëÀšùZäkÐõìÕ³x!è ú (±q±qúP˜þÒÚ7kßX†ÄoûÈö‘Èþv¥çJl-ÕJ‡K‡EnUݪºU%bé·ô[úEºÊºÊºÊD222DŠú‹ú‹úED’.$]Hº â«õÕújEæµym^IU©*U‰¬?øáÁE¶¨ø‘ø‘í)¤| [Eüïùß‘Gꊺb {ºòÖÊ[ý÷EnöÞì)½{¼þx=ï.ücþÓùOe-ávB{B»ˆÝg÷Ù}"§§§"“‰“‰“‰"îXw¬;V¤¢¤¢¤¢Dd§¶SÛ©‰äLæLæLŠÄÅʼn¬xW¼+^‘s™ç^?÷ºHùÏ[œ[d­À¶7ro$ïÊ¿n»yL$¼ÕWî+ï¿/Æ-àï'"ND˜·dí·+y+y0åñ{ü¨`s°9Øl®huiuiu <»<»<»7nÜ Oê“ú$xOyOyOêVݪÖî®Ý^» ž,Ï^Ï^”òkÙZ¶©Çã®.@_¿•t>ãcwC¾¢>þÉÇÊT>•£òU>(«²*+¨Õ 6øU²JVÉ@Tlð·ÍÄꀪQ5úœ>‡O%­óW,,D{¢=ËüÛð1ÃùW ç=~48rfõWmQ[Zƒ‚Lç§3œõµêQ=À ƒ óÌ1jH ¨õ¿'(~œNP½šGóßÎ4âhxÖùŸßåsûºxnßcÏç öÿ÷Ï Å¿ úIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-8.4.png 644 233 144 2420 13755454066 14751 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÅIDATHÇÍ–]H”Yǟѵ1'Z(˜p­‹Ü6)È«ÀÊ>h³uE /6–.– *h-³)XÉ.*aªUÓ>1™hÍíf¥h±Â\ÉÜ‘¥‚×°'uÞóžß^̼¾o_{í¹yy>ÎóÿŸó|¼G@DDÒâ_„… RcrÂ÷¶Þ³É³iñå˜Tà*t>®„9§çœð5úÍ~[¶ì–¿s¿ˆ߉gé%Ml…ûšûš+7. $«$ËóyL>~’¯'_7`Ç7BM¡&~€Á{ƒ÷FrGrÁ–-»åoí·â9ãKà=|HjOjw=÷,÷,Hߘ¾qÑ®˜Ãß‹ Kþ€‰/u¨Rt.0ÆÖvÈ–=îoí·âYñ-< ?ÆG`ÞÚykE  ¬ ,¹!¶¡ÿ"ì÷ï÷[xÑëÀ1Ž‘Ƙ1 ÊU9“ ï껸p-[vËßÚoųâ[x~Œ¼›ÛÚ èâYų€(@´Ôsǫ̃Qn”5þQ^åEë/õb½{½å-o7¼æµ­Öût½®G› £G¢Gˆ‚BDâñu±»Øm¬ÝàH¥ˆHæIHLûŒÈÀØ€š\«XÅ*Ðßê2]æÐ›EfQŒj@Á4~œOœXðØyxça`À\Á<Ãm¸íƒ÷^îmìm„U'ªNTAøhøhø¨ãfB:¤C Ïésúœ­vëÙ­g·àö7··ÞÞj»ó…1ט ±z4WLãÇùĉõìƒ+o®¼3 ¿‹˜ì9Ös¨çd3‚A(T…ªPAÆòŒåË¡¿´¿´¿Ô&¢šU³j¶åõÆzc½«ëWׯ®·õæÏѥѥLÒkáÅð->©wRïèk0¸rp%˜5ïfäÁon>¸ æ/˜¿`>Ôé:]§aIÿ’þ%ýÐÝÒÝÒÝòa&kÖ¬=r^ÎËy(j-j-juÛ¨RT ðÔÒÄð-> "‰ù‰ù|%’ôkÒ¯"ò§ˆˆ¼Š— LE¦&¦&D¦fOÍžš-ÒÑÔÑÔÑ$Â8㌋˜~Óoúezµµ·µ·µ‹\ê¾Ô}©[¤Â_á¯ð‹ íÚ=´Ûös]tÝwÝ‘6 /ŽoñyÿÆTλ'¯ë®{X÷²«²«²«lý²3ËÎ,;5]5]5]¶¾ÚWí«ö×ãõx=^^^`÷~à 8R¯>~cÔ˜›®±Gॕ&ª×/õK4õ ¯atX‡uèã1D´ÒŠÆ«v©]DA…UØÿ““Æþ+gìëbƾÇfæ ö?øôe=¨?D*IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-12.0.png 644 233 144 3055 13755454066 15025 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜâIDATHÇÍ–[LÔgÆ_fed8tÃjB8Nc¤ÖÁ][½0Œ+ÛHYÛª©Hœ‚@̺Uc7é…Fv\[j¢ÄØCˆ•` (µ4*vÈSJÓ“@kY‘¡BPæ?óÿ~{1ógØ&{ïw3yÞÃó<™oÞw>I~ ˜2M™¦ä6íŽÅÞLxóåË|> qïÆ½ûïCòiʧ/}öÒgº'†¼Q?·_$Æ?WψKªÄóç7Æ9£ø¼çxÏ‘ðûþG'X›­ÍS!¨l©lhú¢é þÃ]Ã]OOÃFÞ¨7ú ¾¹ürì7ú"ÿuü×q0Þüy"]”]dÿk¤à';lzkÓ[ÍÍÊá_6å0Γ9ØÈGë~ƒÏà7ô ýˆ´Â´Bxgû;Û­—" žzø0ãà COk>æcl „áÒp)3 :U'qÄA y£Þè7ø ~CÏÐø‰]¥."rjá-¡-¡YCnݦåj¹ î…†¢EJ-T©*BžÐƒÐÐ{ô½‡Øc„‘Y¤TQÈr¡…µD-Ôž?l l cQýÙ«Éû¬¿X XhíÏéÏðŠiÒ—èK˜žUQÕc`»Ø5ÇH 5Ô€VÃjxN<—\rEd‘ ÞVo3Ͳ(ÿ+}î>7€5` ,Üø‰~cçï1^]Y] ꀾÂà½XyñàѨÞþ^O¯'¦çqy\œÍ9›s6zVõ¬êYËëuz^ÃýGûö…s¿;g:gB x~>ýóéÙêj¼êª7Œ«=OxMD¤ç 4¬oX¡Cª|§{[Õ¶*fŒ¹[·þn= ŽŽŽCzGzGz8;;Cæ¾Ì}™ûÀísûܾ˜¡ÑôÑôÑt(XV°¬`ä·å7å7Áâ{™½Œ™_SC¡UW\=ê?ÂÉäâäbÕ#WF®@ðe8àÊ+—'.O@ÆxÆXƸÛÜmî6¸}çöÛwà@éÒ¥1K-}´ôœ ž ž Æâ&.L\˜€Õ›Wo^½9m¬ µ êŸ¿þùëÁ#Á#NZг G5šäoæoÍßòª´Y¦,S"ñÇäGùQüÛ=;Sv¦ˆdíÍú ëß ß ß g¡³ÐY(²Û»Û»Û+²¼vyíòZ‘E§ZtJ¤âaÅʇ2{ÂÝáîp·ˆ­ÞVo«Å“¯&ÿüƒÈóîçŽçñ‹Ì+™W""“f§ÙÉ« ëÍzsÜ1i+´²Tþ ""iÁÌÈÌð̰HâÚĵ‰kE†N :!²²eeËÊ‘ööÃ6‘ýíûÛ÷·‹˜'Í“æIž?ÏŸ'’íÊve»D¼ÞFo£È“Ñ'¾'>‘ÀŸI$‘ÅÓ‹/-¾$ibn˜n‘ÿ¨ZU÷À$–@Q ¨·[f:¿éüF$nµˆQ_ÁÄm‰›7‰Ø6‡Í!rÿÙýg÷Ÿ‰h©Zª–*rmãµ×6ŠD†O¤.§.§.G¤dGÉŽ’"ùkò×ä¯Yg_g_g±»í7í7EÖ?,l/l—`qÚ†P!ÒZÓZ#b>=íšvõvǦR«þ¨ú#`ИÊpG¸&þ<±gbJûNëÒº X,–ÃèÉÑ“£'aÈ;äò‚W÷ê^¦nMÝšºcecece Çëñz<¨6ÕªZÁ×ÿ½ÿ{”>ª-іĦõûÕïCdŸž¿5–÷ X}V_À}“}“³¿ÑbÐô†ØB„øÿGC›]ÃûØË^Ðý*A%¨•´ú{”¿²o oÀê·ú~úŸ=&‚Šn^µÕ¼ÕÛü˜C¡ EOÖ“Ñø'7¹‰R_©/Õ— þ¥ºT¨ë꺺TSE¨§Ê§|Æ  ¸­'éIhê»ÐTh h66ÿVËV üíæqÿ+_Ø×Å û{1_°ÿ¢ÿÕ3HæIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-91-red.png 644 233 144 4130 13755454064 15602 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXí—LTWÇÏû1€J;.éÔa7QWXŒYÜ¥ággÔ8µ‘&¸V°©´ÛFE›6V²Á ”EÖ’ÁX%Z‚3ØmQIÜbX*ÐvënÖFMhcufг q”Ÿ‚Î÷Þwÿ˜¹ï½™u5›Ýó9÷ÞsÎçžû½÷ Da[HQÆçÅ;ãñNn62××׳î×¢$J¢tõ­¦Õ´O+ $’H"óh_i`ëY<ËÇòG×ãó¢yô|ÕTMÕ¼#z>y…Ø#öˆ=Žqn/·—Û«‚“¦’¦’¦p±øfñÍâ›À–;[îl¹”ä—ä—äk>›gëY<ËÇò³zOæ!>7Ú_ÚÂÏð3üŒg5ëÐ’Š%K*¤ýLJVæOߟ¾?}€æðð€xÕ̳õ,žåcù£ë-my2™žá½¼—÷zþÌäææ†~ã º‚® \ˆ˜’©d*™I5RTHk¤5Ò@²JVɪó#ól=‹gùX~8ª¾éspÎA$Ö‰ub]ç·,ÀÜ`þÀüAȪ‚½£UŽb:Ôh´Š'x-x @@N‘S—p €Ì"0 H¼Gš•fP§ÿ+ÿW€òŽÒ«ôbš-67˜Ì !+«ÏxF £†Ñ¿b LvÓaÓa%Í}Ïíu{1É3-577…› •P·²VY øŸ1R£Ô`Z9¦ÓVKÒ!éêN»ï¹ï¹ïaÒd7ÙMv%ñ¨|ânq·¸ûJ›h+oÛÞ¶]y3’`.ä6›u<þïK¿/€žøÏ žå”r І6_“_ÓoäbÉÅ~{£½Q 9ççTw®­¼­¼­\ySíl)¾¤Œ¤Œ¤ 4Œ¯_7¾Ní\©lÏŽ·oá{Æc‹Þ¯ºVuM6ûéì§0ôÜÐsþ~úû`YlY¬;‘Ti‡´Cãfõãc Ø|dó‘ÍG´I.d#€/Øl€äsÉç ÊWåÓ ŒŒêGjGj`¸c¸C?Îþ¾’÷Jž.Ü'¯”W’K´úŒ‡ññ‘+µÂ`1X õŽÅSÙÉND?•m²ˆhòùÉ版ÒûÓûõ/EêÇ©ëýo¶}³ˆ(ÿõü×õææDDã_­[ž@ )DtšNÑ)­¾¡ÛÐmèV¯ü 1¢…?y‡½ÃÞaî—þìGË-£´„³q7ânhgB0!H5WªDôì{¹ïå ÍÍÝùòΗzР1h¤Ç˜&¤77Q 2|‹~ ˆø ü?F {x±Ïãóø<äb|Ä[y+o Þ´¸¡£ºcWÇ.d§ìÔiδôh)}QôÊ=” †8Cœî8ÝÇØúÎõBy¯æ½ª»ýg®€K«7Ð4Ð4Ф~ÇeqY\Vð. ÙB¶}°žÝ²ÔŸ›“"-uÿöÖÕ[WµçC)Ú0´a*+++(lªåå–—`þíù·àÇ…?.|èÆºuæ M…&/±qy‡¼þ9̹çÜ@ÆÁŒƒeõ $ ÉBò±IJ´$Z-Dâeñ²x¹Ë«>ø%…5…5Ò>5í|úùtøáŒènŽKçÒõ—¤Ù×uÉ‚oßÒ¹Óh˜Ì½{ÃoªºÝŠ¿W8+œòœ X%T U7¶†ýy¾-i5d² Yž“,ÀV³çþJ‘ú~üä;ëwV(ÀÉ¥'—˜¾öѵô€J«Ò JŸÒÀÏÆ-ƒ@*ÿ¼øóbí¨ÏÌtMtMà%õZÏ×óõÖq‹¸EÜ¢_ú?ÔûµÛÎm±ë⺸.¦y—³ßñ™ã38Uíî“säœðƒ‰Y~ååÀu\×÷ 2d@)Rv*;µþz»¼íÞv 5!uAê‚Ðnµ“µB­Pk3«hV²’U4i¬T@b-9ÈA"Á'Œ cû/°¦vÓ¦7BF÷»®Qר^»!GÈ¡o(Û îâ.'F0([¥t)]ëoéßJo–Þ”ö©_ âŒ8ã<œ²'eOÊ"ÞÌ›y3w6BWÎ0Dþnn ·…Û\oÚ´iˆ † C…ó°ªÝs¹@¯]Ù&Ûà‡N8þ)2¡»ÕË¥åÒr­¿Ík›×6¯UŠX>ƒÑ`4½Â¾)!ú¤¹¾ØGŽ‹q‡¢}SBX»î³švm5¶v!cȨÉcò˜<¦iq$ÜX缑y#óF”bU“‰|"Ÿ¸í÷1Rlá‹§'Í1Ú-þwí:ûýšvCý¡þP¿ è˜ò0åa °jjÕÔª))]Õb·Ð-t˜Ã¤‘^,à³ôÓ°šv}‚O§Ý&S“©)dtw¹»Ü]üðÃ)FjëµõÚzµgGlÛÅö‘È¿$óþS72NóŸk,`[D»çÿ“v 7n*ܤi×™ãÌqæàtx^QO‚+ãʸ²F—á'bêrô_ÚÓ´›'Ô õB½g .³—ÙËìÊ3™Ì@èºzÔ>Á'ølK¨“:©“"ÏŽàŽ©Oÿ£Åj÷p´_x‹«ä*¹J€ÖÓzZ/¯äó‹ùÅGqô—¡Ô¹Ô¹Ô9"áŠpE¸Â]Šn9¹ÿ›i¿‹,d!‹ømôô»å¼Â+¼p}\×÷ÏŸ…Ç—9cNÆ“÷©Gý/ÕŒLñ°õ¢IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-53-red.png 644 233 144 4174 13755454064 15610 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü1IDATXí—LTWÇÏ}ï H—.J²eÐ4¸ÖC%]°ÙÑTJpý TCÖ&‹‚`ÚéF‰TT’Öø#ŠmÈ0ƒ¶ddýQ[7ìfJ²Ršú¨°ÑäÇ€ƒïÍûî3÷½7“¬f³{þsϽç|Þ=ß{o†(`3)Ä„•‘ÎHg¤“= DG´D´D´ä.—I‘”ïÎÐRZJK@X­%‰$’¸„új-ŸÏ×ó|<h=ae(‘oí¢]‚#4÷†Ô"µH-ŽaVÆÊX™;;;†¿äÝË»—wØÐ¿¡C?PYY©û<Îçóõ<ÏÏ뽘‡„ß…ú¯*Œ ãÂxßR¾C Å Å ÅÊîÓ·Oß>}[}ÅóÔóÔó€"¼˜À&ô¡}€æã|>_Ïóñü¡õ^ÿôÅ|d~U„¾+·?·jŸœ*§˜RÞRÞe»²€6Ø Û”ÿŽÿ öMÿ0ý 7úÊ}债GMPàáÓ,µ–Klåõ9ç#Ó#Ó#ӣߧñ æs¹FMêêêÂh0G9¤T)Uä>dÜœa×° ,n‹X2Kà³³ðÝdËd  ¦ÚÃWeÎÊœ•9 9 VÁ*X§ Ô6ìjXÛ°Ö Ó §@ÿ¾þ}|ϜϜF ç„D&28l:l×6×6¸ÿàþ£ ††õSΟ=röˆ^ïz][G[‡öî`),…¥LÿBâ2q™¸¬ÊÆOYâ<ó&ó&åõÞ?üTüS±~}¨«âä8*S+SßþíзCÆu¸.˜“;'v¶íl3ªÏäN°–Ï¿øøâcø¼Áð’ª…l!ók€'Ɖq'G):':':‡Hº)Ý”nÚ´ ¿ ûƒì”ržß_qjí©µðÁ,àeGØ#`Ùº²uÆ>÷ιwŒ§œÍgóŒ|ÿÉ¢·‹Þ† àc| ÿãý[ïßò{5À±D,¹»1àGñSÏ-á3SŠ)Å”Òw–/¨¨Þ}v÷Yu•Ö¹YÝ—º/AÎUž«à¹éºéÿ*`Ö7øÆÀë»{òîIh(k(”¢ki×Òôýmwœqœ ì/ Ø›`{žËf³Ùlö¢Óa€¢[;_[Ù¶eõ fgͬ™kÅÿ'g»c®c.¸:½J¹‘‘H½¦^¼‡÷¨j¾šèD' ®RKÔ]Jöþ£ýGÄf«Ù*—j;¹O,Ë+,š•¬d•Ì:keQ–´ä ‘8(>ᆲ=­'̛͛å˜Þ{Ü=n£våX9pW ÚõŸX§ÿ]ÿ»€ºqúûéïáã ·ü}Ë‚- ”r횆¤!çþøñ;ãw Á"XØù ]ÇüUðïFñ¡øP|È\I•I•I•D¦bS±©Ø¹_Ón–%Ë’eÔ®¿Â_œp `#Ñ7ZY ,PèG¯>½>½>]]¥½å1¦SÌÀó€ožÚiÖÖzbaîס¾yF@»½çuíVTWT´#ÇÈ1:ÿ‰ÿ‰ÿ‰®Ånt£pFuGuGu«yš&£…h!zóŸÃ¤øY_$½x@¬7hw+Ûº:Ù™ÙÚu¶;ÛuíÊír»Ü®+w2~2~2X<¶xlñ˜ò[M‹Íb³Ø|,ƒK-(½pÀ_ÓKLŸÀèÚ Ú­3×™ëä˜^{¯½×À|㤮 W…K¿v¤Ò éDwð'IÔßÂêÇé•—†_°9¨ÝKÿI»Ùë²×e¯ÓµëÌpf83ðE ®j`…¬®® -#Œ„Õeô_ÚË´»R´‰6ÑÖ—Ê k k kÔ#ÉSÉSÉSò?µVŠƒâ`E5R#5RðÚ{ÃêEÒÿháÚÝêg?`ÛØ6¶  5´†Öø s„9€#Fý:Ñ›èMô‰b‡ØÁÚ‚ 7†uîÿf1Ú9”C9RghøÃ"ATAX+ke­ÿšŸï ëLOXÞ—¶úß‹Ñv›*Ó—0IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-17.5.png 644 233 144 3010 13755454066 15026 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–LÓgÇ?”2¨gšýQ7†‹'ó‚dÞaf]Ä]ZÒ°@†s»Íƒc5þ"î]È’Å\ŒÉ‹!jÌœ7w›&Ì¡KØ×UÈiÂ0q˜¡Lo µZ°ƒ ßÏëþh¿´Ùîþ÷ù§yžÏçý~çûäy÷‘¢ô¯€íIÛ“¶Â¶ý!S/x¹àåU§Rø¸9¯ä¼rå}xüÈãGVœXq¼šÁÖ¾ÕŸ=/’áÏÖ³êR$™B~(?”ãIãýðêÚW׸Rø/pô9úæthhþˆðýð÷à OÂlí[ýּŗÍ/û¢/yƒyƒ97!ÿ±üÇD ´¾´¾|Wªáz9ø}~Àw¹ßå*wå,W Ikų°µŸî·æ->‹ßÒ³ôS~J^,yQ77nvü=5põŸðîÊwWZzZp€,=©'Œ××YQrÈ ¶ö­~kÞâ³ø-=K?å's”¦ˆÈ¡Mz“¾dè‚V¢•¿0Þ2ÞBSPI%J˜4¶¯¯Qh… 6¨Ô dÖ'$H Œ.E3žÑvi»Àð¥øin*n*¶ Ú˜9Ê[""«»ÀqÃq#iç_×Ê®•q/Ÿ˜Õf5óKB:yÈÿ_ …ÊÂ1bÄ€<à€ªPK|^˜¸0qÀ‘t$“ö”±Õ]vq‹ˆt¬“Ù7¾yЩs±âfÅMµ.÷O""¶±¿Ýî‰öD… 77\ßp]¤è›¢o‹¾ ‡†CÃ"Ëv.Û¹l§ˆÃíp;Ü"U5U5U5"•ç+ÏWžÑ´m@äláÙü³ù"ÓáéÓÅaÿ@>—ÏålÓgš@ZW¼¯µ¶µÖ©ã?&Ǥ#*<+"2úG¾| ô÷Të– -o·¼Í‚uE¢£ÑÑè(\ö_ö_öÃú’õ%ëK a¤a¤a$s·»/u_ê¾”ù`ñŽxG¼\1WÌ«³3ünxK`K€…o~0¦j…ð¾ð>0¿Nùþ\è-ôªLŸž> ‹«XËZ8ý«S³§f¡ôvété4 öööÿüäNºOºOº¡©¿©¿éì¸F\#.°ûì>»|»|;|;àwNôŸÈîv*0† P!ÎNsœsñîx7¨Þ¥k@mcmcm#„=aOØ“á¹øþáû‡¡lªlªl ¢k¢k¢k~n,ÚíŠvAû™ö3íg Øì ö@é3O=ñÔ\î w}Tã ó˜ó˜9nÃì3ûrÆÅ¦UiU²FÖ‹ˆHIúnˆ¶J{Z{ZÄüØì5{eiõzz=½w£»ÑÝ(R7^7^7.²0´0´0$’œLN&'EÕ‰êDµHñÖâ­Å[EZ&[&[&E¿óáó>/r?1S5S%%"f¹Y."5}¦/gÜ&öd}²~ì¢,DÎEΉäüFD„¶´þ¢óªóKç—"yÛò¶åmË‹ŒEÆ"c" Þoƒ7S¿×v¯í^›H}¤>Rqõ¸z\="ÑP4 ‰í) D~ùŸŠO+>•ÅßmÓÛtÚDžxNÄ6úcÙecÓ9vü ´À{÷€€YÆ1³‡fƒ³AÔâþÅÎÅÎÌÍlšÙ4³ æ#ó‘ùH¦nvšf'Ä»â]ñ.P»Õnµô½ú^}/ܵߙ»3‡2h^Í»4UÅÀêÀj+ÏŽ!Vn€ã¶ãvÒ?Lü°¤ã3h³r tô,´ílÏÂsÌ1—k#jX ƒú­zC½ êTóª<Í¿r⫉¯ G"içß)?™äWéäU͹͹™ä'_¿¥ßŽóÆ<ÚRŒ:) x‡=ìÉ2v &@}­®¨+ÀÝtÿQ#fÄÐÔgú´> ô¦ùi¶7ÛÅŸ&ÿ£û_ùȾ.Ù÷Ø£ù‚ý/ƒyÞ[º}ôšIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.0.png 644 233 144 2770 13755454067 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü­IDATHÇÍ–ÿO”WƃEFF@鯥q ±ÙŽU0¨m¢˜N¶¤‰ªL&6 Gª„~Yˆñ UÚ +IKp©‘n‚» H#[›hi0›š¥š­ j l”ÑÀ¼Ô82;Ã̼÷³?̼¾lý¼¿LžsÏyžgÞ{ï¹W@DDÒã¿»ÅnIaËn3žüzòëÏÿ5†[¢°#aǵöyÚçK¾\ò¥>bbcÞÈŸ_/bòÏ×3â’.f`a÷Âîg ŹŹɿ‰áOÁÚk퀻ÏÝÐÓÞÓN%Ü»rï À/Î_œ`bcÞÈ7ê ¾ùüòñ¯ôEà™þgú&`aÒÂ$È.È.XQKøin-Ü p7ñn¢²@t°aSNÀcøæac>žoÔ|¿¡gèÇü<û곯ŠÀöÛwZOÅ F: fyÍrC/Ü ÔS "þˆ º+º‹¨A5@ `bcÞÈ7ê >ƒßÐ3ôc~Ì¥ÔDD>{ \3®P¿EFÂËÂË@ß ß!wª ËêêCõ!èvÝ®Û1Çw¹û)U)”ŽÜ §„S@íñƒËïò3†¾±”Yùg°ú­~ÿ¥Ýº5¼ ÀPù*ŸŸÐ@I&™€7nPŪXÏ3¤¡¡ÍëXÅ*`Yd¨7Ôȉó¿׋ës5æ'þÅZ¾S{ö$lúK7—߸qã4e5¥6¥¢†7 oÞÄcüÌø™ñ3pÉuÉuÉeÆõkú5ýš‰o×Ý®»]'–ž°œ° &F~nü¹ÑÔSö¼²çci[¾=ODd¸Î}qî øñkoƒ·A•Ùϵ<×BÈyÈùó°§ÛÓíé0äò yLAçqçqçqØÜº¹usë“Æ}%¾_ äåäåäåÀš5=kzàwW¼µâ-BÓ鑉Ȅ*ƒ³GÏõû˜‰^KiJiRÝBpÎz!ãBÔ¼W½®z)à¸ê¸ê¸ §µÓÚi Ú-í–v‹ÙlŠU>U."…R(…òxÌ Ì Ì ˆØ:l¶3žz6õzêu‘à÷ÁÜ`®h"IÛ’¶‰È£Dg¢“Õ¢wÙ*lªL>˜„5Ül¾Ù ‹–%%AÝGuµuµæ?=Ö¬ÿX?XG¬#ÖÈÞ˜½1{£ùåNÞ?yÿä}­ ­ ­…¾Î¾Î¾Np”;Êå0½mzëôVXל·3o'\ð}ø&0{jöDÿ“ÒžÒ®º%’aì±Õ«¡õo½5½5ªÌrED„Ðú]ëw¬ßiûÒö¥íƒ6½MoÓM£M•M•M•P0^0^0¾1ߘo UŽ*GLöLöLö€»Þ]ï®[º-É–û߯^R½„P¼›”A× ]/Uñ=Ƨ±Sïîw?#±S2õïEïEð&z³¼Y(ï{Þ oóƒùÁ|ÓX°3Ø섇£GŽ.\¸ÀwÄwÄwôR½T/5 Î«ó }«ý ý€Ò§ÂްÃ<•hïT¼èñS[³ÑWâ}&¢²TÇ‘.ºè5¤†ÔPB %À(£Œ‡9Ìáy»¿’½ì]SÉ*@¥©4êOq~÷­‰[VͪùðÓÿõ1ãøì5>qU»ªAuÄ:³ú>j‹Ú@uGEæ|ÅWfçç#j©2È x»+Õ¿Õuu¸¿).é‹õÅ„Õ?#³‘Y ×èüo.xs0÷ëÎÿôÞ•Oíëâ©}=/ØÿÙ—ìñ›ÜIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-19.2.png 644 233 144 3007 13755454066 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܼIDATHÇÍ–ÿOTgÆ_‡ZĦÆÎˆ‰b"ÑS4&Î4´DH+leËK§"UC›$ˆ×LÜí®‘ÆˆKí‚]«ÕHh š&Š-n‚ ,tw\a@©âÀNufî½ïg˜¹3³ÝÀûËÍsÎyŸçÜ{ßóÜW@DD–‡ïñ¶x[|jÇïÆ—.-̺Âgtˆ{'î¿7BÚ§iŸ¤žþ¹q/ŠÍ¼Y»^$Ê«gÆe¹DÉ—“/Ç9Âø¼»ñÝK_ áß÷ƒ¥ËÒõLƒÊîÊn€«W;8xD±™7ëÍõ&_,¿û…¾,éYÒ÷/HNJNŒ73Þ\[*øÇZx»øíbw‚;AÅ€þXÆ2å¼x1¯'1ØÌ‡ëÍõ&ŸÉoê™ú¡~VØWØE`WÙ®2˹Ђ{_@­µÖj껀ZXšWóèåz9~Pýª€8⠊ͼYo®7ùL~SÏÔõý”†ˆÈ'è%Z‰ihÀXÌ f‚ú^M`8¡ŒGÆ´1 ÚSm^›µWíU{!æÝ=äa)•©½®½NP»|5ø*ý!~(™,™|aýȧœY ,÷-÷½‰|óãš×€~€"®ëõø" ÿVOÕS ‰&šb) € 4Ò¢aåVnå~ƒ'€zK½…!~µ0909`ñZ¼ÞDúCý„ߨ™[,TUVU‚j06™Äí¥íï·¿Ý9Z0Z¹>r}ä:´noÝÞº\îa×p4oÔ5FMO¬šX9±N®9i;iC çÝî¼Ý©Þ¤ûŠöBýy""Ã5péKo€Ö œï ìÙ·g~sDnê7õ›:L˜:1uVg¯Î^ ÛNo;½í4¬;°îÀº0}xúðôáhCc½c½c½`ÓlšMG³£ÁѶý«RV¥à<öîv)'|Ýüu3è õ#ü.µ(µH]†G]„@Ùs.,^XëkŽ5†f‡f‡fá|Ùù²óeߟߟßm`óóÍÏ7?‡ÖÌÖÌÖÌhüÊÁ+¯„Ú#µGjDãÆs>Ëù ZÝöAÛº@hzÊw)ß©Ëé/§¿lŒsíIû“vP‰Œ=ùÝùÝùÝÐ3Ú3Ú3   »#wGî(®+®+®ƒ¤-I[’¶ÀÙ–³-g[ø¿k¢|¢|¢rOåžÊ=Žjûûðý6è zxžRO)(ïrY.Æx¢èF—Ñ7.ñÁMÁM²A¶ˆˆÈŠðlHðÏÁsÁs"‰ÿL¼Ÿx_ijàYð,ˆd%d%d%ˆÞ(¼QxCäNöì;Ù"Ö1ë˜uLä™ë™ë™Kd¢z¢z¢ZÄî¶»ín‘ú?Õ·Õ·‰|<ú‘ö‘&²´uIú’tY!nÿ-ÿ-‘8T§êŒoþếìü²B¥œáõÛ×Ùmv\k¿Ö~­ —á2\à¨tT:*ÁºÛºÛºjjj`vdvdv¶6lmØÚG‡ŽKŸ¥ÏÒy+óRóR!õÒKE/á¿x»¯­¯M9¡×Ùëís™S¬ª¯ª¦Í©Ô¿Õ¿…Å?.~µø*Ш ÄL™ÿÿÿÌåÍåÍåÇ9Îq0:Œ£æççÁwÈwÈwW=®x\3S3úŒŽšýxÊ9å„ÿ¸L½€÷Ì©$âcs–9o"Lþ<ùsD¿ˆçF‡Ñõ1^!tP;ÕNµ3Ư2T†Êö³Ÿý1›+H0bˡʵjm„¯~ácü‰ ÂΫJJ¢ÎO²6£ÍgtŸî‹:?Çh¤Ô_Õ€îr—»À,3Ì€ò¨ŸÔOÀ¯h¦¥¾ÑtM'¨¾×SôP_„ùÿPÒTÒ¡>bÿÅýW¾°§‹ö<öbž`ÿ ñ::º5kÅIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-145.png 644 233 144 2614 13755454065 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜAIDATHÇÍ–ýKTYÇϨiYºµ”\j—¥Õƒ¨È~°©µ¤1)V,¬qaµ‚¢‚^v~Ù~ȱkYzY ‰-AEVɦE"È”ée"JSœÝuɲ´ÂÕé͹sïùì3Ç;æ?ÐóËáyÎó|¿ß{^ž{!„H‹22¦Gý„r+>uíÔµ_\Žúç °m´mìüfœq ýbúE³ÛòռʯÂÂçSq‘&¬@JcJ£ÍóC±£Ø1õó¨²ìÍöæ·ØveÛ€¦Ú¦ZvÁóÛÏo ;‡`ùj^å«z…/Ä/L¹6åší_HINI´<-oþîhÂ_ó¡ÐUèxšø4Q&€ñ˜Æ4éB„Pö*ÎWó±|U¯ð¾âSüQ=f­œµRذyÃfû¯Ñ‚î:80÷À\ŧ7G8Â4ˆ„"!c‹±…1í²6°|5¯òU½ÂSøŠOñGõˆ‰{ûÓ7È¢ä¢d  Àè7úÁœ¦ïÑ÷ Ëûò½|ä#“{å^¹L‡™efEÙÑÁøÁh4‘FV¸(\„n|§çëù@¾ÂÿVÿVþ‹ñ[[)„ N±÷ÛûCIL ¦~Öíº¦k¼£•§¹ïrÙå2%ìþ~ÓÛ¦·ÉF~¸;p×" g~ý0 õ_×/¨_Z·Ö­uCK]K]K•WURURUb /õ”zJ=ÐéîtwºÁVi«´U‚«ÐUè*„KC—^\z÷EÙ±ñsÀ¥G@zjzªù^={õ ø=zí¥ÏÅ?ñV.8 öçöç¡$è5zqÜu`ºM7ï¢ 7ÎŽr”£ 2 @Äu«Y @n–寏ø—‘ŠHðƒYÁ,ཽÏÞ7©Åu~ŠRŠRbÿñH1v;ѹ@€ÀäÎ/^ …d’ãâÇi¡)oš¡¡ã3v;Ç×3€Q”T”¤VjBçÿdÿ•Ÿìëâ“}}š/ØÿÁI}ÛíBIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-174.png 644 233 144 2610 13755454065 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü=IDATHÇÍ–ÛOTWÆ× \F@A© ‰J¢/Ö5Fl‚‰2i½D $Ö`HÔK¬µ©­Ø¨’(ÚD ÕhJ1¡¢ÆÒô…Øy@4*VªŽ‚éD…QpæÜ~}˜ÙœQÿ÷Ë̺}ßwö:{- "")‘_˜É1“cƆ혯mÂ’„%Ó~ Û' p8 î|ãŽ;z&õŒÙiÛ*®ò£ëElüh>å—±ñuñuWÄ®€•™+3> Û‡=à¼è¼øF‡u—×]¨?[–o ·­· à¥ë¥ l[ÅU¾ªWxÑøRñ¿Ä6Ä68|'‹2MÝNøw*ä-Ï[Ð3ªg”Æ@I– @-”­â‘|U¯ð¾âSüa=i9i9"¿*•ót¸ óW(›T6Iñiýì' ô€0V« ‚å±<8p€m«¸ÊWõ Oá+>ÅÖ#ïö¶ò ¬¢¸¢8@ÐZÁè6ºÁ°´5Ú4É" Ë Y!ÐßêÃú0ÅF±Q ÆX#ÙHk®5Ëš5²“–µ^÷è4s²«ÅŽÕêé©§pÿñýÇ÷C_c_c_#Tí­Ú[µªýÕþj?Ô¤Ô¤Ô¤Àì;Ùw²m}¾´óÑNhZÑ´µi+ÖH`R˜×¶mئZ{âzDXû¶Ô–Ô–ŒèX«ÿœœA°øïâ¦â&»á-í-í-íp+ïVÞ­<ÈJËJËJƒÜ«¹Ws¯ÚyÕ»ªwUï²…å¸sÜ9nXðË‚c ŽÙûkV„ù¸[ÛZÛª„µïÛ<¶Ùªãçç7žß°B3Þ¾„󟞟~~:dôgôgôCÃ¥†K —>ìà¹Äs‰ç!ÿdþÉü“¶¿²°²°²$S2% /¬+¬³ãæç‘?{Ç÷Ž¥G 595Ù¼þgþgÀŸácoÕšGÍ£Q¯J~v~v>Ô»ê]õ.ÛÿâÈ‹#/ŽÀ”1SÆL·å¶ÜhžÓ<§ydú3ý™~ØÝ¸»qw#ÌOŸŸ>?Ý®·z#c昧'(=1"æóŠãžúr}¹ˆ8DD$M²$URediÓ´iÚ4ó®y×¼kûk\5®—Hú…ô éDf2“™ˆx¼ Þ‘‡O>yøD¤Ö[ë­õŠ´õµõµõ‰œÙ}:çtŽˆ#=Ìg}ô½"JOŒHÀpuxe´ÛãöˆÈ°ˆ¥ŽÏ¬ñÖx )ÉÉÉ"±c7Æn´…y:<ž‘_¯Àgû7OØ\ëYÏú(û 9V«uͺ|É>ö÷͹æ\†øAáw%u%†³ÇÙóÁ‹šüÅÅ&D&‡ÑÄ›ŒMhœÀ;j%“DPFeQ†`ÀÞq~4zŒ4õ.½K¹µVŒ¢QE£ÔN½3ù?ÚoåG{»øhïcç öñM6qªIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-93-grey.png 644 233 144 6317 13755454064 16011 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü „IDATXÃ…—{PS×öÇ¿{ç$!R(*„—"8¢(Jµh}Tê¨m-X®W½ãã÷c¤Õ µ­¶ÜÒÑZ‹ÚN¯¢"*rP:€— ˆ:2qÄŒ k*/%’HrröýƒDgœétý³gŸ½ÏZŸ³×÷ì½6)(((((€Sfšjè"îw»Çê Nœ(8Á^ÖjµƒK£˜ób^û?æýyÞÞÆÉêÉêÉj¶Çp ÇH>"‰HwqwlÄFldû¤Ë¥Ë¥ËI>÷ˆ{Ä=Ò#£d”Œî:ZèWèWè×p§(«(«(‹ ð!|BÞšâZ]\jú 0 H §­ ´B«Ýb·Ø-¾óµ5ÚmÍ©~û€}À>PÝ:×:×:wÞÿ+((àâ¼%ó–Ì[BòãÄqâ810ß{¾÷|oÀÝw»ç»ßwû{æßÏßÍãæã\+ø*S1S ï“l’M²CˆBD!¢Ë?YNZNZN{O«ŸV?­Þ¹sÉÝ%w—Ü¥Žh}´>ZO2¤ùÒ|i>¬øŸàÈa…Vë±ë °NMM!CߢoÑ·0Gcdcdc¤°óñë_üúºoå!òyH¢‡3Û™íÌ^|€å°–sï}ú*ÙótÏÓ=O´ -A᪹j®ºåŒÝf·ÙmÁéš×4¯i^ã2·dnÉÜÂR›ÕfµøÀ>àY8 gáàÐntPB %€ L`@"ÒCzÀc#gR™T&úÎ:èü!þý¾æ¾æ¾fîšD&‘Id÷/ñËùåüòä5HF2’ŽSY»¬]Öˆ_¿,~ùËÿZ/Y/Y/§k25™šL>#'+'+'‹»¦öSû©ýàãlv6;›a™°LX+°+r\'×ÒOúI?@“Çä1€ T V +…•àœ1Îg àÙçÙçÙ·ÍJÍJÍJ>ÃßÍãæ#Ú:m¶î­ùöv{»½ýR»Ê¬2«Ì,,÷aîÃ܇¤]}R}R}T˜.L¦CEoÑ[ô/xÁ ÏÍþðЄ&4Xˆ…X  mh0 ³0 „½Â^a/@÷Ð=țí¦í¦íŽˆˆˆYœYmV›ÕÄ ‰“ÄIâÒã(‹d‘,òï:R)Ž U—ªKÕa‰ P"$ ÉB2Tô}@#ÚíˆÐÍÕÍÕÍîß¿?`.æb.àÒ*0†1ŒCÝCÝCÝ€Î[ç­óz®ô\é¹àC|ˆ–ÊRY*TêïÔß©¿ƒ$µ#µ#µKÜŽãÃø°…¹^ç¼Îyþ˜´˜´˜4RŠQŒb8>8>Xyxåᕇ¾ƒïà3§Ïœ>sPR%URÀ’nI·¤ÑÝÑÝÑÝÀÚ¦µMk›žåE#‰‘ÄHHéå‘Ë#—G°Ï’jIµ¤.ÌEÞXÞXÞ˜°ïTâ©ÄS‰Ìm¶—íe{swwgìËà/ƒ¿ f¬ê몯«¾~6õùöùöù2–ÿKþ/ù¿06˜>˜>˜ÎØá€Ã‡;;ûìì³³ŸÏ×—éËôeŒíJÝ•º+•±Ço>~óñ›ìE³¸yÜ|_à |A"i­ ϾLŠÕXÕ€pG¸#Ü&‹'‹'‹ŸbŸbŸâçÒôTz*=•)&Ťxø ñA"ðNý;õïÔÉ’7$oºÚºÚºÚ€›å7Ëo–!é!é!é€2A™ Lp÷pïy|úý€~àŽà‰äDþ"‘?;k^`^`^@bøUü*~BE7E7E7Á¸6®kI’'É“ä@m`m`m p?ï~Þý<ÀtÕtÕtpŒ;ÆãË`,ú,è³ Ï[Š-Å–Ô}\÷qÝÇ@¯±×Øk4F£hm  B‚0¨ÈrÓrÓr½4ƒfÐ vV´´ciÇÒŽÝ C~C~C~ô¤O“O“OYÐÐÐ »Ê®²«Ïè›Ñ7£PÞPÞPÞ†µÃÚa- ˆÄb bfÄ̈™Àxåxåx% y$y$y$žM<›xˆÛ·+nPy¨òPå!À'Ë'Ë' ذ;`7l†5†5†57Ž4Ž4ŽàS©Zª–ªùý™ÈDfá1®€+à H~m  Ô©yòèÉ£' '‰$‘$Â\Εså0Ô0Ô0Ôl¸²áʆ+Ï*‘N¤éM£¦QӔŗŗŭºV]«î¹TÆßwü]@Ô)êuò­ò­ò­˜t Ëk½j½j½„b bÀÄIœÄù“„ü8ûÇÙ?Λ››Ë~³äZr-¹…÷…÷…÷9wlÔmÔmÔ‰Jºººººº0yÂzÂz ) $$`'Ø vx{ËÛ[ÞÞ$É’dI2@—§ËÓåç«ÎW¯¸eÜ2nàôtz:=y-óZæµ€­jXÕ°ªäBæ…Ì ™‚õZìµØk±T.•ÇÊco¯qÔ8j5ñß“=ö<ØóÀ ÜÀÀƒâAñ x°U6Q;Q;Qœ“öiÚ§iŸ²´ô¤ô¤ô$òŸáÞáÞá^°ß~þíçß~ ü&ð›Ào?»ŸÝÏ000Sg40Ä qC` 6ƒÕçªÏUŸ¡ëB×…®ƒµCסëÐau™ªLU¦B­\%WÉUO_g"&b¢y«131³ó¯”£Çè1Q;-¦Å´Øøw¡Gèz²íòfy³¼h­m­m­e³oܹ=‚ò—B_ })¶ØWb_‰}ð›ð›ð›ˆ@d ’Áç'•¯Ñ×èkb•±ÊXå3@³y¯y¯y/ä¯_¼~ñ:¯‘I‚$A&Ãdx·@âI<‰ïü+JP‚.ÈUæ9ã¦êFîä9@üg3M¡)4eg5>ÂGøˆ~_»½v{ív~“)Á”`J€œl"›È&˜…ÛÂmá6#Œ0ðƒüô£ýû•ýÊ~„iÂ4aÚ3-ª.U\ª¸TáÜ1j5޹ƒR¥T)U–E”D”D”|{…(D!9ƒô ‡_ì®GSŽù;؆mØFª£ª¢ª¢ªJVxäxäxä”FFFq¦óëϯ?¿Þ¹ÃÐUŒLB=ôl°Á@ $²‘l0ÚHi#¤m†6C›¥ÝPÜPÜPˆJ2…L!{øÔ^a¯°Wä}u§ðNáB€˜àéŠsÜ juµ‚RP JxÞúýÖï·~ìÛìÛìÛò¾Rx)¼^÷*îÖÜ­¹[#*©{¯î½º÷XÙL6“Í eB™PdlŒ±1€ð„'Ÿéá?„ÿˆˆu{Ìñ˜ã1§$qê§ÙyM(J…Rî +³wg¬¨¨¨¨¨f÷ŠÂõà™†\ÚÝáÒîA—vÿMSi*MÝYä ‡~_ã¨qÔ8øM¦£¦£¦£SJ)¥s¯Dƒ­ÁÖ`¬K–>,u{ìöØí±ûÎÅIã¤qÒ¸ûÛî7ºßè~íi^ãÞOÝ€n¾g /»'È]®¸´[u!êBÔ…’¹¹¹åE£þ£þ£þœé\Á¹‚sήŠÞSï­÷Ö{ã_-í-í-íä}y—¼KÞA#h¶¶rk¹µÜZ[RX\X\X}âŠ÷¶«µ½È%ÂXJJJJJ xWWÏ$LÂ$äo³f ÌÂ/ÎéÎéÎé×yi˜4L¶êû¡ÅC‹‡{_0uš:M쟷Žß:~ë¸óÕ Ç„cÂ!Ú&^$^$^ôAì(;ÊŽž¾)¤ŠúðOðDpgÀµPü‹<b ]-êP‡:g!«fÕ¬:¥‡VÒJZÙötÙÓeO— ³Ä¥âRq)íåˆrD9Íá•á•á•KS =†CùUð|_ö“Ëo ÐúGb/h×µ]8 ±›±™Ó‘,’E²þÎêX«Ûµ^6C6C6ƒvŠúEý¢~ã a¿°_Ø¿é÷®5]kºÖS€sùs–¶?ãøœ¨H"_ÙIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-81-grey.png 644 233 144 6076 13755454064 16010 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü óIDATXÃ…—{PÔÇ–Ç¿ÝóçòÒˆd ‘ aË ®°!Q)¥IíÄ’P`}7F¼DR$¹æwjI¤$He£ rIDE‚lÐÜ\0!•à1 @pf`øM÷þ1óƒ”[©œºº§Ïùt÷ù>Mrrrrrrà§L8%ô }B¯Í9s:ç4_š7œ7œ7¼Qǽ¹7÷þà?D?ÑOô O©š©š©âïã$Nâ$ÉÄr,Çr]èB€T¤"•¿¯Ø¡Ø¡ØA2…{Â=áÞ“dœŒ“ñ#%¹¾¹¾¹¾—;òóóÉ(Šd³“ƒ]uqyÑ9ÀD ‚–±<–ÇòØUû”}Ê>µdu^u^u^u™É>d²Õ5YWYWYW…ÿŭЭЭ5áÂ7„o ™käkäkäÀjŸÕ>«}©/}—ô¥ù’½9û.’‰Gâ\;ø4÷à܃½H’I2I,”Êeß•N}9õåÔ—Ë|Õ-ª[TçHßе¡kC m m m#[™ŠLE&¬xoâM¨a…VIHB€Gñ(…uÆÆÆ[ÛÚÚøì•åW–_YÎÒÇ6mÛ”ð7u :P©t$;’ɱ…<…§ð”¾ èÓ${:{:{@Ðà¿P¨ª„ª†¿Ûmv›Ý¶l‹æYͳšgÅý«úWõ¯ e^f/³—,Æb,†Èµ\˵Ðntp‡;ÜX`À“xOä6¹MnCÄ(F1 aÂcÂc½gŸ=~ö¸øbo}o}o½ðÓÕÕUÿ%q‡¸CÜñÌ.<ƒgðÌÀ$U]S]S]äKåKåKÿúOë%ë%ë¥e[4z^£·¦$¦$¦$ ?y-õZ굋MŽ&GÀžgϳç!Ì\$ÉE€˜ˆ‰˜2@È@I#ix2OæÉñŽxG<à¥óÒyé°X²/ù“üK<-¢E´l^m¿`¿`¿øÔ"ý"ý"=ÒŸÒŸÒŸ¤1³8Çâà!{Bö„ì €ž¤'éI€|N>'Ÿ8ˆƒ8à ®à €û¸ûæÑ< m¤´²rY¹¬à„Nà!ÙןџџÊ$ÿć·ûÞî{»ï§wßhx£áΛ65mjÚÄöp§L9c†ÏÉHüHüH<ç×]?výç݃݃݃œ;ú}޾y=VÀ XÁ|¿;¢;¢;‚óï~ôû£óãb³Ø,6Ïu§šâšâšâ؉Gâ£b$ýëïQïQïQ¼CŠa†f, ¥´”–=ô<ÒóP¸»pwán †Ô|¦øLñ™¨`¬‚aNœé 0ý`úÁôPÝSÝSÝt×t×t×ÌëÑCcæº Â¢Ã¢Ã¢I±Ä#ñ!ãAƃŒìý²È²È²Èù•‰Ùb¶˜=¿ò¡D(8?y"òļïëëã<éHçcdŒŒÎûËûËûË9Ï È È àüHñ‘â#ÅœŸ 8p&àw;o`fàœ%°–0ï_â‘ø(ÞÃ{x,§´‚VÌ­LxÌE€m!ÛB¶c ÇŽ-Z [ [ æ Íš/Z‹Ö¢µ*‹Ê¢²ýüØÏý ¼kz×ô® ¹r1ä"`²FY£æí‚ƒƒhA ZæýÓ—èKô%ŸâS|J–S™ŸÌOæÇ¿2¯5¯5¯ExX<,†Œ6ÒFÚ.Íôññl!¶[ÐØ×Ø×Ø´‡µ‡µ‡êÔ‡ú@ñ£ñGãF¾Þ™e7_7_7ßi{™½Ì^–q´#·#·#àFnäFxºüœ’@­®¶‚¹3wæÏÖ»­w[ïöƒöƒöƒGݼݼݼû*ºª»ª»ªe†Új_¨}¯'i$¤AÁ¾`_°/À¡‚ *€?àø€ˆD$"l#Æãˆåu+ëVÖ­„§ÛÛÛÀÖ²µlmÆQZ@ hÁÀ´+?vÝ›¥ €HiÂõ$‘2ÜŒ+ë8D"H‰XÿœóÉñÝùÙ}³ûf÷± ,%0ZZZ€¬“u²N¨i0 ¦Á˜3ÅL1Š"m‘¶HëxrhÝк¡u²nåJåJåJC¤ó§Iÿ‰³bV,|ì:Ùÿ”N,?????fiGᘑœãóÍ#|L I!)üÇg‘^…¤ …~R=[=[=+î›(™(™(šRJ)Åi'.Û.Û.Û˜u x x XÖ­ÌRf)³:jfgg³þÖ×׸5®yj p.ß>œ˜RP» üàŠÝóºsºsºs†ç”{”{”{ÊóÇýÆýÆý„‰¯s¾Îù:ÇqÈUH{¶ù´ù´ùàó†k ×®‘ÕêNu'À4LÃ4® ñB¼oû· 5Ak‚ÖÐû.Û\­ía.þ@œÙ¢«ÛÆð|Ù?22‚ÿv8M¢"H¤ú÷O~‹ý-ö·XŸs·&nMÜâÇZOµžj=åxÚ2k™µÌÊÊ£äQò¨Ãþ¼„—ð’35P@…¬×Y`³G¥pm”ø0ÁŸÈÄnjQ‹ZG.¯âU¼*ú6­¤•´òû éíÓÛ§·³y±¼X^LoÉRd)²”+õÚJm¥¶rc´ñ¶ñ¶ñ6ù¶„-aKx©Ënµ ÐúG"Å®+]8r‘†4¤ 7H"I$‰ÿÔòZ^Ëk$©W=®zœÞ’™d&™iðqöû€}°ïnç®Î]»' ‚\ö¤ÂÒögÿeŸ`NÈ”5IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-82.png 644 233 144 2604 13755454065 14674 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü9IDATHÇÍV]L“g=_Km1F )¡$”?ùQ"ÑD.ˆQ’Œ€ ‰p#Cc–é…&Ž04¸ $+³“ /À?^,›üÐS± ™c2-®l«BVlûõ{Ï.Ú·_·dî–Þ4çù9çôûÞçé ùi°ì†aløP[öYömê ãž©TÎ|J&t%t‘dRoR¯6«c™—õ±ý€Î«'ãH„0÷›û•’n!« ª ,Éaüù8=þú_*Ùp³á&I^»|í2?"''IÒ[â-!u,ó²^öK¾X~´üK MæaåҼμ 3öfìÍþ8\ðS6Y¶¿l?I¾4¾4 I’¡%’¸A”\á åç÷,ó‘zÙ/ù$¿Ô“úa? ­{¬{²¢¦¢&þëpÃì7äé´ÓiR/xdÛ¸TWÔ’ ¦Ÿãbœ$©P!u,ó²^öK>É/õ¤~ØþùnÛ? «,U’‚$ƒ †FB#$©5kÍ jA±Il¢PÔçêsR¤ »°GŸEª° ©ºÔGê#Rsj«Ú*…ìg Â'ù¥^T±†r¿ ããWâÈg¡g!’>’d)©µkíô •9Ì!ÙÊ&6éF袋.RlÛÄ6’-laKLþ3¶²•^¦2•$µóÚyú¸*ù#zQý°Ÿˆ±ž;䱿cÍ’M+¤W]PHZYÈÂðï#Éé¾é¾é>²ãlÇÙŽ³ä\Þ\Þ\žîcvtvtv”ìÌìÌìÌ$ÛÛÛcž¨‡qŒ£à²úJ}£Õû‰sž"¯¼½ò6Ú~Dû.X¬¢_FœmÎ6g™Õ“Õ“ÕC–¿(Qþ‚Ìß•¿+Ùïèwô;ÈÍ7_Ü|‘Ü}a÷…ÝHûIûIûIònúÝô»éºAíËàÎàNÉ/Žèúa? 7ŽnýäâŽÅ1í¡ÊP¥ŽïݺwëÞ-2Õ–jKµ‘³Ãì0“E3E3E3dSESESyÎzÎzΪ÷å»ò]ù.Ò1å˜rLéñP‰jVÍ1¯<ªöËŒeܘæLsJääá8±ŒeXe à ø> °>°>°iii¼G½G½GêÕªI¯“^'½ Ž/8¤˜RL)& >³>³>@! Q' ƒºLƒ¦AXcž1[ €6¤ ).@-WË£…VþÆ ND1žd=Éz’d×f×f×7n4ÜhKKK®§]O»žÅgŠÏŸª,U–* 0X3X3XXœ§Å à%°`^ù^ù^×ÓõÃ~ ÀJÉJÉÔ}`ìöØmYÇzÃ0:щ€ŒÔÕÕÉŽdG²HèMèMè¶NoÞ: ä<Ìy˜óðyŠú"~}¶IR«Óê"™÷ì1%ºiÞ¼áÓqê`àÝÀ;u!m\7#NR† â+C¥¡q´ó ß@Q–Ÿâð n¸¦ÒF€l¤#À¯HD"¨ü,RD Bø^xa‚jÌ1樓0Š?o*®ú¯ú;ö†}œþq-ÿW®ÙÛÅš½­Íìßýó˜Â¹‘g¹IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-37.3.png 644 233 144 2777 13755454070 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü´IDATHÇÍ–ÿOÔ÷Ç_‡XŽR¡5KSª‘¦BhŠØXdl °P\.×\U:ICÌÀ†fKÚ™.K1m–‰Ú.¦¨±l1§Ì•5¥P4k$Á/Лt»ö2ÐÞyÞî>Ÿ{?öÃññs³ÿ€ï_>y¾Þ¯×óùÊûýy?ßoY¿úH{>íù´ì$Nû¥·ÖXk^øsŸÒÁòºåõ¿…§>xꀜžœžÄ´‰y#?µ^ÄäOÕ3â²^Ì@†'Ãc©ZÅí°÷å½/[7$±{2½™ÞˆMM}gúÎðÌ9ÿ%À÷UßW‰y#ߨ7øRù¥ý}XûéÚO-ÿ†Œ'2žM¯mz-ÿWÉ„Ûù`ßmß XX£Ò@_²ÈRU@˜0ÆXJÁÆüj¾Qoðü†ž¡ŸìGà™Êg*EÀQï¨ÏìNL‡òåzq/p”£dÖÂú~}?+ FÕ(,`bcÞÈ7ê >ƒßÐ3ô“ý˜[ùc58}N$®Äǵ›ñ ñ  ÞÑÚµvâj‘ÍlFiq-¢E@ÿ…^¯×ƒž­gëÙ ªT¥ªäÑ¡ÿŠGãQâÚwñgãÏ‚z!ÉÎEç"4ô­)<™áÌp8]%|ã¾qàwÔÚ®¶åo\âÐDM)’1bÄRp”(Ñ”Ž4¥) èà(GT¥ª$ÊÅUþæU½U}f’ýwDDN}¡hv4; ºDÉÔw“öI;¸?s»‡QþãþN'ÌÙæls681bþÄcê©Ïš­ÍVckO}‘–ˆˆ”þÕ"»v7ˆüãç³ÏÍ>gy¥â/·+nKlìGcëÇÖ‹¥î÷uï×½/2Ô6Ô6Ô&âñÎxgDòòòDb ±†˜ÈD`"0‡ãJï•Þ+½"Þ o…Wd¼~ü­ñ·ÄR}¯z¦zFbßt[‚-–W,U»ô]ºˆêOö#‰m¶û¶ûÊúôÁPÉç埗ƒkëæÖÍ0x04‚­Þ­Þ­^˜¼8yqò¢¹=‰žDOœýÎ~gÿWêr÷åîËÝàr¸. F >€­ÞâCŇ`ªzÆ>c‡!1”åÊr)@κœu‰[Xï-Þ3}¨-ØlÚ²Ú²Ú2(h/h/h‡é=Ó{¦÷@ÌsÅ\°Ñ¿Ñ¿ÑcEcEcEfCºG÷臎„Ž„Ž@íÎÚµ;¡ð§[ ¶À ¿Ïî³³wÄ ‰Ùßf›¸%ºÓö´íiå•·WÞ†?tMtM@mÝ®œ]9&q¾?ßŸï‡ ³f/̹ÆsçaÇá‡w6ó–;–;–; ¨‚*¨À}Ö}Ö}jŽ×¯9næmùõ‹Û_Ü|¼íãm±ºXhú“#OŽ(¨>‘k¿Ícƒð^uàÇ?{uîÕ9Vrä¾™û&8î8î8î˜ÄõÔSk=Öz¬ÕŒ …B(.).).«¥WK¯–ByYyYyä¶ä6æ6‚Sst;ºY ¥'õÀSê)õI²1NÃÓ¦›§$ö‡åªå*øïÚ…èB¥ŸÖOë§Í‚û‚û‚û :Žšñ„+áJ¸`©c©c©Ôyu^‡xQ¼(^ ÿY¸µp ¥û0ö¡©ÇôÁM7™§R¸þÿ>FyÒWÔ×}ì€:@TYU®ÊTALù»i¤1GˆIñ±5¬†Aõ¨~Õ ìÊNT%¡N…|×|×2C™¡p:7|ÌpþÃyßXóÆཤ3«KZP ésúqCuX±ïñ.ï¦4öO|ø@}­®«ë$oOP´é_é_WƒÚœ6t%ùê­<êüï]ùؾ.Û÷Øãù‚ýÁ P>c¡älIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-5.7.png 644 233 144 2417 13755454066 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÄIDATHÇÍ–]H”YÇ_ÍšL²‹µ0ThiK ŠjC—¢%cÈOjM?ˆvj ºhki£*“Š¡1­µŒdƒ0ÂÉ0Л\l™JMÇtÖÔ÷=ïùíÅÌ™y­ö¢;ÏÍðÎsþÿÿû<çœ9hš¦iK"¿įˆ_ŸÆñU±¸}‡}GÖ0¾. ® ®à¯Ÿ!¥.¥ õfêM³'†Õ¼Ê·®×´¿UOŵ%Z,`k¶5ÇåEð)(][ºÖžÆÛ!±%±eÒ€êß«¸ßx¿‘aèÙÐ3€Ñ¼Ñ<ˆa5¯òÕzÅgå×N} ¯i°ðá‡q¯Á¶È¶HÓ c{ÆöÌšpÂ?™àÈwä ,X ã@ I$É<`œqÔZ°šä«õŠOñ+=¥ö£ÁÒÜ¥¹š»÷ìÞ“X^Ðó]~t¹ÒÓ[€3œ! Œqc@”‰2f@¶Ëv∃Vó*_­W|Š_é)ý°mno/mÃ(N(Nˆê CœçAü2Û7Û‡.¾%¢)ö‹½b/ð [Ø­ò‘l•­ ¦a‚ø^œ§‘"yöÐì!tù­a3lþ‰"£ÈP/m³´RÓ4íËZHJO@öê½zTg'ýf®™ËÿFcŸ3f˜±B³Ü,g*ÊO¯èÕø‰»þ'8qàpÀü̳ôN}PD¶4¶8[œpÕqÕqÕÎNg§³‚¥ÁÒ`iL6È ä@ݦºMu›àÆÈ‘#ÐdkÒš4ð7øÛümÈh…½J/¢ñ1Öuî†î†@¾êkG›GG!­?­?­Ž G”?/^þ^v¿ì~Ù3æ yBžl,ÙX²±vùvùvùbÆõÆÕãê‰US´)½°¾ò£A²'Ù#›ahÝÐ:0÷Ï탯Ý÷Ô÷¶&lMØ ù5ù5ù5Ð0Ù0Ù0iiÐYó¬yD—è]±ø­ô[é·Ò¡¨©¨©¨ÉBüV6Ëfà‚ „õ• R§.6_@ðmð-˜¿F=ÞZo­·ªT?¨~n—ÛåvAÆšŒ5kÀ]å®rWYmذAè^è^è¬\9¸r¼«½«½«-rG\—£0¨ô•Ÿ+v9£µ¸µ°µŽ%K>–‹oä W_y|å1oooÇæ¯%]Kº–›s6çlαzc¾6_ËzYÌþoÅ>ØcGæî±w¬ï[ß·¾RêSêSê¡r¦r¦r^å½Ê{•«ÊV•­*ƒ‰Ã‡'þ“ûNî; ç Ïž+´[$„À´p §:¯ŸÜcœJ"§ä™ñÈxå“ú ½[ï†aû°}Ø2SfÊLËä2¹ ‚ƒƒAd@ ”Ê eÁÔ“©'SO,-h£‡$Â3Æ,zŸ>•–{l²7ÔŠÒì”>‘-²™’ßÉ#ájFœfËl™ ¤“NºExši¦-ø*©´nŽÏºÇ,7?Åöb;„/Q½„_ø‹â½x.ÿƒrI nÜÀ(#Œ€ôK¿ô!ƾ 4à'\¸`7££ ð(“zGTïã›ÞþWÎÛ׿}ÍÏìùJ³Õ«-ÇöIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-69-grey.png 644 233 144 6227 13755454064 16014 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü LIDATXÃ…—kP”ÇšÇÿÝ3ÃÜä"hÌd'DF‚.…õ‚‰ÑD1db ±HAŽk±wW0?æÇüøwIÉ !E¢Qˆ(äêãeãeãesƒêƒêƒê=9IIIԽششØD^“æJs¥¹p`öapÀ€÷ñ>Þð^À pLª'Õ“j¼fj25™š˜»1¼1¼1œÏyòÊ“Wž¼’z\¢Q„ÄË<ž OFbÓ1Ó=x—€€€® &L˜Ð„&4©}Å5âqMÓß\N—Ó圻A³Z³Z³š‹Ó~ ý@û¸<À`°CƒY˜…YàX ca£è030ÀÆ0`>æc>@ÌÄLÌà0ˆA Bló³ùÙüpÿÒ©K§.âÞ½ýþõû×Å?øÈ}ä>òîZ.™Kæ’WmÅ*¬ÂªG£T~[~[~B|Gàs¡\(º,kfÕ̪™U8‘‘‘@ Þ‘rô8=NöZ{­½8Óx¦ñL#0j5Œw²;Ù Ì»7ïÞ¼{€:è˜¶š¶š¶å¹å¹å¹ÀŒÈ‘3"ÑÚÑÚÑZ .;.;.ر9bs󉎎&†«ƒW¯âðøšñ5ãk–eaïÈÞ‘½#üáòøòøòx&Ø8—Éer™ÓuVÕQÕQÕÁ˜žê©ž>ý>œ>œ>œÎØ‘”#)GR3÷˜{Ì=Œ}üið§ÁŒUVV>mÅý÷W0¶ïô¾ÓûN3öÐýÐýÐÍžµqGàãc|ŒI8½H/Ò‹Ó#“R•QÙt¯=¾öø´/h_Ð> 2­2­2 ð8<ØödÛ“mOUº*]•Ø}í¾v_`vÿìþÙýOýøSêOìÁìúÚúÚúÚ€‹^,z±èÿÅßF·ÑmÎà Îp*R‰T"«´ÇÚcí±èrw¸;Ü‘ä9æLw¦;Ó[±­ØV <ÜÿpÿÃýKgé,°EÙ¢lQ@Éé’Ó%§gŒ3Ƭž\=¹z0Î1Î1ÎÊö–í-Û TTUTUTîVw«»`j¦fêi@æ-Eã?ÿ<þ3º¨†j¨†URÙQÙQÙQNß5§kN×VÙÚÙÚÙÚ9ÝÑé“ã“ã“Èß“¿'ˆ]»(vðvÒÛIo'ÛS·§nO< žOКؚؚ$š͉f`ãÐÆ¡C€»ÙÝìn(((åLåLåL€¦ÒTšú4žEgÑYt€¥×ÒkéÅɺd]².NO¡…Úü³âð|ày ª9ª9ªyÐnÿÉþ“ý'(®´\i¹ÒÂi$V‰UbˆØˆm?O–“ådyÛŸ¡‡z±Ú›æyb¦òFñARDŠHÑ?vÑ5t ]“S3•Ñ“Æhc´1šÛiÛnÛnÛÉ&Ù$vþCþCþCçpç¼7ð†äSÇ"Àžð“^iûÕ××{ö † Ãñ ©Zª–ª/Î?:ÿèü£Ç¯"ùÈ'ƒf˜¹D!U¢=èáî!ÙÈ&5/W¿\ýrµ~³l‡l‡lÇ…Âáàáàá`±íÒ²KË.-óì’yd™‡IH €N8Ÿn6¬À ¬£7éMzÒfK³¥ÙÂÖÞ2Ý2Ý2‰ôS»ÿÑ„«ÂUáªØûɽü{ù÷òfaf¿×K©êð–ùü ~üïüvç·;¿®lW¶+{ï'S\ì0v;Œ"}Ý[uoÕ½ÅÖ’]dÙ)ÿ ÿ ÿ ˜w÷‚°6Žp„ƒsÀ2`°àB}d}d}$ü•V¥UiøX>–ÝûÉ”ôMx¥xÂ{¬®." Üû$‘z«Þ%éQzÔ{ö8GâÖnžzr\ý»{§{§{'¿;•OåSyºrñ±ÅÇC2ßηóíPÐt]€I.—Ëår!=v:ìt˜g¾u¹u¹u¹¨S)‹”Eêã§6Mμ7ðñ ïÊþEX±ÂÂÂÂÂBØ……÷ô†¼ÚÝãÕî ¯v¿Ö®:èèI£Ûè6º¹¶[‰­ J)¥#ÂL48œ NÞñÈðÈðÈ ê”í—í—í¿we²w²w²wÿñÎuë:×^@·ŸBø¦AŸ(¼nzµû÷iífɲdY ‡Uêa•ØV•W•W•çÙãÍèýM¦@S Î7ÝnºÝt›¼«hW´+Ú^ÃkxÍîâwÄïˆßqþ[hLhLh òÆ{]¸¡žåáw,!!!!!œ·jb>̇ù·.´.´.Ä9O°'ØüON* •†¾y²?±?±?1°ÚÖfk³µ±Oï”Þ)½SêY1æs¹EÙ’•’•’•ªY +a%W …RÑ} aCü  x'Š{–‡àìw´[0•É{òY «a5 fz™^¦—ÿ'tbÓĦ‰MüB‰Abh›H'Ò‰t×Ã.‡]»ü§‹Ùb¶˜ÉóÏñÏñϱ/¼~^@ÇïqPü=£]ïqáÉÇ.ìÂ.q I#i$íZ«cu¬î¯ïË_’¿$‰¶‰zD=¢žÞ—ø#üþÈÎßÚ·¶omß L"ÔëOH,ÄñC6íÉ­]IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-63-grey.png 644 233 144 6240 13755454064 16001 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü UIDATXÃ…—PS×¶Ç¿{Ÿòƒ4ü*6cM±- €?_m¹Ué.5Þ*¥L-Aj­wíSñGA¨½ÚŽO¬¶Ķ>K‹(·L tÞ ÔÑÊ jFAxø Š@$’“³ß$øÆ™N×?{ö9+k}öÚßì½ÉÉÉÉÉÉ/¦mtz +ù¾‡ïau9ßç|Ÿó=›•7˜7˜7ø—ç™óc~Ÿm‚…`!8:cªzªzªšÆiœÆi’0„! €f˜d ì°4Iš$M"Ùü=þ¯õ4!#ddwqîÓ¹Oç>];?-?-? A#hÈÚi±ÙÍåKg—c9–ÓR1OÌóÄf‡ÍasØ‚bò y†Ô}È—úZ}­¾Vhˆ@B`¡,”…‚G':Ñ @ %”Æ1Žqó1ób!b€x€àGU£ªQºÏuþ«ó_ ow7v7v7òW¼ä^r/ùÿÔ IB’ôÒ¼„—ðRß#*o‘·È[É,É,ɬ\²×Úkíµsµ:­N«^Õ§éÓôiü_µ¯ÚW@qµ¸Z\ ˆ;Äâð˜^2ÈIr’œH/é%½&Ãd@*PˆÉb²˜ ÞáŠpE>Ý>Ý>ÝôÄ×&k“µÉ«žüÆ…qa|mŒãGÇŽÓ¢tº ÑÑÑá=±ŠëÄuâ:¨h ÝK÷Ò½¹L.“ËшF`„ dŒŒ‘1€ž¢§è)€»ÅÝân¬²B¨<ñuFQgäK’’’Yˆ‡ÇÃGY caÞtÆ:c±@\k\k\+|Ë}Ë}Ëá宜ФéA`ráäÂÉ…À-õ-õ-5Ðá×á×á¸ú\}®>¯ãu¼`C†º‡º‡ºVÿVÿVÀò«åW˯ÞÁ;x`q,ŽÅAå{Ì÷˜ï1xÅÝŒ»w /„!BÈÒL¿J¿J¿JŽˆˆˆ%Eî• ô(=JÖZk­µ8ÕpªáTð¨èQÑ£"À™äLr&óÚçµÏkôÐCÀÄ™8”…”…”…Jª¤J Øm‰¶D ¼3¼3¼ØøËÆ_6þyExExEx‘¢‹.>¸ø‡mq¶8[ÜÒLìÛ9¶sL<\º¢tEé æ1›!d3sVi®4Wš+ ´€>~>R2R2RÂØ¡øCñ‡âëÛÕ·«oc'GNŽœaìœâœâœâ±¿©ÄTb*alwÜî¸ÝqŒ ¯^3¼†=i6‡Ç§øŸ’0ZA+hÅÌʤTFeT63ǽK÷.Ý»ì Ø°8—v.í\àJq¥¸R€T}ª>U<“úLê3©@¢„E ‹ß|?ðýè¸Üq¹ã2p½üzùõr@“¨IÔ$J»Ò®´èAzh RšJSi*€S8…S$ŒrÁ\0ÌÎY—X—X—àŽÓì4;ÍàÈ r‚œ›Ø4±ib0Z8Z8ZÜÝwwßÝ}ÛÄ6±MÀhûhûh;ðÝoßýöÝoÀðúáõÃëжжÐ6@¹S¹S¹¸j¸j¸j:û;û;û©Vª•j:@èÀ s×…³]·]·]Ǫ¥Zªeçp ø@ð`Çàî…»î^(j©n©n©þ¸!Ün0v䨑cGŽ1ö³ægÍÏšÇ{4Y:Y:YÊØÇæÍ›knnfÌ<Ë<Ë<‹±aí°vXûØßêcõ±ú0¶ËºËºËÊX‹¼EÞ"œÏò–å-Ë[ŒíY»gížµìýÜÏs?ÏýÜ1H¡ƒºÜÓ|ŸÃçì†Ì†Ì†L—öaÚô‡iPp‘\$ kpQpQpÐ%ï’wÉKâ~Íýšû5€¸T\*.|:|:|:€² eÊ.ͳ›g7Ï~ìÿèÍGo>zàÚ¹v®PlSlSlÔûµâ'¿Ÿü~ò—“.ÒEºPH\ÄE\ßx‘ _(|lll,ù_[¦-Ó–™ª]º&tk{ÆæŒÍ›¹‚1bÄ`ª¸¬¸¬¸ Òñ±ñ±ñ1€_ͯæW‘'#OFžtuu¶À¶À¶@ âzÅõŠë€¤@R )\>.—ÝÝݶ®~]ýºz*]•®J'Ú¯D]‰ºEŠ(E”"êÖ§Áip–}IößÝwÿ]×p מ9!” J›åãÆqã¸q®>~[ü¶øm,>qUâªÄUäß;ßÞùöη ªªªÀܽs÷ÎÝ Ð@HpàÀC²!Ù èW÷«ûÕ€êÕ'ªO€y)óRæ¥À~³õfëÍVü­DU¢*Qá'…J¡R¨&_aãý7,À,hŸÒÓô4=͵Ð#ô=ÒÿwÑ"ZDKºCQ¯¨WÔÍ Í Í ìÓÓÓ”?UõTÕSU˜XxváÙ…gíÚ/´_ô5ú} ÀœÁ`:ÔÔÔD)£”QÊ@«õ õ õ 5Wk®Ö\´^j/µ— ÷É}rŸH–‘edYûû(@ xµ»Ís-žîùä89NŽÿ{+£q4nGõtD¿4Äb 1–Ñ÷Fß} ’E²H¬âGâGâGŠQŒb<>ñÛІ6€™‘1@ f´¨ª­¨­¨­pméééçOH•R¥TYž?¿`~Áü‚£‘‹\ä’ ,Â*O?ê^ô¢W¸,d!‹T?_õ|ÕóU•m–m–m.Ï™32gd?z~éù¥ç—º¶{’yd™‡)H À&0@dÒ‘Žt0Ú@h¤—».w]îbñ×¼¯y_óæ ¼åÞroyߤ£ÂQá¨ØyèvîíÜÛ¹ëb]¬ >îìqP¸üêÖî¿f´›)Ë”e–çó£•9•9•9®íîŽÞÇäoò7ùã¿›ZšZšZÈÛŠE‡¢µ¢VÔnkæ7òùÿ²8dqÈbúÐï5÷8ñ$‡?°ØØØØØXy1/æE>xnà¹çpÆ5Ç5Ç5çª ‘†HCÖ}9´jhÕÐ*ÿªé»Ÿý׳7ÎÞ8ëzqÜ9îwrY’•’•’•©Y1+fÅe5B )ׇxˆ‡¢çî’º %<ÉCð'öÚÍCêPçÊeÕ¬šUÇZèz^ø%dòÉ7&ߟ“IŠ$E´ÓszNßÐz!ôBè…¿ÄvYº,]ò³$‰Aìw\ƒÐþGbOh×}\¸r±[±•o%i$¤] eu¬ŽÕí~Wþ¬üYù³´ëåz¹ÞþgÅÏÄÏÄ϶üÞ±¡cCÇ`!îxžÆrâÏ8þ¤Søø™»ŽIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-12.3.png 644 233 144 3002 13755454066 15020 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü·IDATHÇÍ–_LTgÆ?ŠLNÇØš@ BM¥ÅÀ¶Ä4ÑîcTÄÉIm– )] ¤ºÆHÒ†˜Ôfâ"Š±Æ¸d­ëJˆR±üÙ€UPˆ©Ý)1fÆ »UA)Îd†!Ì9s¾ß^Ìífïýn&Ïûçyžœ/ï;Ÿ!„¶ä¯SŽ)ÇdM`ÓŸxFiFé†K |6)•)•Ãë§_? °æüšóš×Àz^¯_Ù/„Á¿RO ›0«ºVu¥Ø“ø+ø¨ð£ÂŒ7¸uÌÝæîê®Õ]¸záê>ƒ§cOÇ^Ø_ØÁÀz^¯×ûu¾•üâ«ßé ¯ô¾Ò›òV¥¯JÖïX¿ã­ý‰‚¿Ž GÀtêtª4@ü9`Á"í@˜0ú™[õ|²^ï×ùt~]O×OøðFÉ%B€ócçÇæ¿%¼¡)»)[×Sº£ÅjX Ä«ãÕ,‘#¤Öóz½Þ¯óéüºž®Ÿðc\¥&„Ç·ß­îV— j%OÉy;¾.¾%™r´I¨^Õ£z@sknÍq\FR{¤D•(Š:¥d*™ 7$øa÷óÝÏ`Rù*ýBñÎ)0?2? §ñýDîD.ÄoPÎU-_Ë'º¬0#§å4°—½ì]a¤…Z@ú¥_ú° ˰ .Žr@–È¢\Oò×ûF}£æ°9NãaÂOò‹½M°¡®¡äaí=¸£®ãPÇ!äøÄ¸wÜkzk¼5Þ8™{2÷d.¸‹ÝÅîb#¯ù4Ÿæ3ðý'÷ŸÜm¶mjÛ„ôÍz/x/,W¿'oÖgÔgèW{ö¶`³B¸Aç¶Îm µÝS¿§ž%}D†/_¾SÁ©àT²³³Áî²»ì.È9s çÜé½Ó{§×0t·énÓÝ&°°°€ÊÓ•-•-ãÉú<ës–þó×/e-t§u§Öð#8f-·–Ë.˜¹Xm(˜,˜,˜„vS»©ÝdÄû«ú«ú« ÙÙìlvBßB_¤/è.j*j‚ûÛ::‚CÁ!Ð-Í–fÙ%`Íkk^Ó<ôÏuÌu€üûòذµzkõÖj¸²ïʾ+û AO‰§ÄSE§ŠNû~û~û~ˆ¶EÛ¢müÏ   ²e;ËvÂ;Ìߘ¿<ñ9|æ`¡u¡´ÖIë¤æ¨Ö!ëì⟹ÀHßo ‹·Û‹í0pfàÌÀ˜vM»¦]J¥‡ÀwÅ]qˆôEú"}•Q•2‡Ì!3´o=ÞzJÛKÛKÛ Þy{óÛ›á\þ7ïó>@¬¢çמ_…H½¼¸}qûøÆT* _4|LéSŒBhW¨1ÔˆTþ¥Œ)c«ÕÆjáÙ±gÇžÀð  ´€ à à Ã0Ÿ9Ÿ9Ÿ Ò)Ò JR Àl`Ö3ëAƉ}ûÚ˜J¼ ëÖ¯œJ–÷جy6œ¾ˆ/²üÅËAëÔ:=¨¨üÿ!‚Ѽ!‡äÈóò;ù€tHQ™–à—!ŸÛç0‡Ì¡p?üf Ln^Y•Z•ªÓ*£¤ªÕÇÀ5ͪYQhgˆ!¤ü‡üV~ ò®“c ¯Ëëò:Ð@=õ ç匜ž&üñeü§øO(²Oõ«~ CßüI½¥ßoþ—÷¿ò¥}]¼´ï±—óû_(U$ÑroIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-28-grey.png 644 233 144 6231 13755454063 16001 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü NIDATXÃ…—{PWöÇ¿·»ç­8€&’A<65€.›_EIF cD«$‹¨›P>P,„2ƤDª0¢øŠ?EV * HvÁ #>Ê,ÈSÈðÓd7a˜éî»0[n¥rþ¹soß9çsÏ9÷ôi’ššššš -&dpb`–r\'×IËS/¦^L½Hg¦w§w§wÿyu¦ÎÔùË¿òn¼ïðÉxéxéx)=Œ38ƒ3$s1s´ ->Á'ø„V¬T¬T¬$ÉܯܯܯÏ2@öœN{=íõ´×+ŸdÄfÄfÄ3ïÉ{òž$j‚C¼ãàÒ2“€!A“/¦‹ébºxÇf±Yl–×ÓËÒËÒËòM6³Íl3W­oYß²¾°K“­ÉÖdãfÀŠ€+Hr,H$]]]i.=—öKÿ—ôMêwØ“ìK<çðàêD¨“¸Žl"›È&ÏlÖ“õd=«ÎZ.Y.Y.Ívq­p­p­v¬hYѲ¢…±û7ø7ø7÷ÉŠdE2¬Ø‹½Ø 5¬°Â `#6b#€7ðÞ€uÜ}Ü}Üï5Ô4Ô4ÔPûí¹·çÞž+îè‹è‹è‹øè¨ÚSí©ö\¬6 ›„M˳i£që˜%$e,e,e @ jPã>•+åJ¹Òš+¶QÛ¨mtö_tïêÞսˇ¶¶¶qùÚaí°v:LÇtLO½¨õ‡V´¢ÀLÁ#Áoxà m¤´G/zÑ nÐiÐiÐ ׎_;~í8¿®£º£º£š«“«ä*¹êç[üJ~%¿rY –a–=ûQÝWÝWÝd3e3e3ýÓzËzËzkö_tAgàß‹‹‹‹åê´3µ3µ31]¨ª…j@\#®×€ƒj¨’I2I&@LÄDLé#}¤@5ªQ ˆÑb´ Nðü`ÚÓiO§=ÅtI¿.Z­‹æß“ìK<Ãð#üHT íºíºízì"Wƒ«ÁÕ@õ† † † œ”#Ãb¤)F‰õe}Y_€9Áœ`Nä6¹Mn¨D%*d#Ù¢…(€Ô’ZR 0g˜3Ì€m`Ø€fÒLš 'I¿¡ÒPi¨äò]£]£]£©^â‘øp ó@çꃻkv×쮡ÔaŒ0FˆñtB,Â*a•°ŠNÊ‹s/ν8GéƒêÕª)mêjêjê¢Ôb±‡Ðÿ’žõ=ë{ÖSú óAæƒLJ[M­¦V¥‚E°JÅwÄwÄw&·[Œ‘ÆHc¤/ñH|¯çõ¼þOñÎ…Î…Î…8_1_1_Ar«z«z«zqØf ³„ý)ICICICâáüÅù‹ó¿<™@"—žÉ™š35g*¥§‚OŸ ~¹ÞWÚWÚWJ鮄] »(m45šM”æqy\GiŽ!Çcx¹¿£¿£¿£ŸÒ…; wRú¼àyÁó‚ÿ „Eâ‘ø|ŽÏñ9™Ë0LÁäɰÁÛä>v»XÖº¬uYëËuQQ××׆0„!€ÏŸ->[€>¿>¿>?àQö£ìGÙ@}I}I} àµÙk³×fÀ¹Ø¹Ø¹¯Š‚ù˜ù˜ùÀ)œÂ)2—aÝX7Ö^ÆS~'¿“ß –iaZ˜P$  @øhøhø(à}Èû÷!ànÐÝ »AÀ‰-'¶œØxFyFyF>³|fùÌ”F¥QiÆRÆRÆR€»w;ïvóç7ÎTTTy®mû´íSJ÷FíÚE7§}•öUÚW¶n`H;Ã¥r©\*Iž¨2‚®¿¶¿¶¿j©|T0LX"-‘–Hà3ùgòÏäÀ’ú%õKêûAûAûA€¥GéQ@ž/Ï—ç¿ÝøíÆo7^ÆÔ:Ã:Ã:í–í–íÇÇÇ1îx¬¾a¹a¹aCH;i'í8I"ᬜœô;éwÒè®î®î®Îûÿ‘Ö‘Ö‘ÖÝ}gùÎò%l_'_'_'g³:8„qÒEºH² ² ² €ýžýžý`ýÙú³õg`ãðÆáÀf¹f¹f9ðÍÀ7ß ÌÌÌ€Ú©¾ßú~ëû-èúÊõ•ë+AJN”œ(9!ZëJëJëJµ:Z­ŽþWŒ½Ì^f/{ûk’Ò•Ò•Ò õ¨ÿŸc²ïdßɾ»£Ù<²ydó츰óaçÃÎÓp¿d¿d¿dòCoRoRo(ëÁz° d5YMV¼;ïλ³ gÎ.\·¹nsÝ æææ¦¦¦€F­QkÔ€¾Gߣïõ§ºŸê~ªÃšM›¹‰7{¨@Åó qƒ¸Aܰ)GeSÙT¶*Ô.ª]T»ˆúÍ)žS<§˜\¼x)ðVÒ"ZD‹ &$ @° Û° € *¨­QkÔ­ŸÖOëàîᆇ >§›¸‰›àuò]ò]ò]H i!-ûD|€ðAÓfšE³hçîhó„ ‰¾‘;@rHÉùa+{’=ÉžÜQJõTOõÌ×׺¯u_ëæÖ¬X 5ù|H>İè&º‰nUQUM€QŒb Zª¥Z@tÝE÷É\tºuîÖ¹[ç„íÖ뀕;¦P+Ô õå ïcÞǼ­BÒF®  mhã—Ký¨&˜`⟠ˆ ¥óÎÎ;;ïlÖ*eŠ2E™r9cH9¤RrƒE¡E¡E¡ÂvÉ ÙOö“ý'ÉCòÀ÷øßÿGEÔA(SÄ1EPÔ¶×¶×¶Óðúõ3êg°Y•F¥Q=³Ø lI_<Ùÿdÿ“ým§í´ÓZ.H VÇX N§ˆS0íñ/yü `K´%Ú“¾Ð8kœ5Î-e-e-elVùêòÕå«i8ÙJ¶’­Pˆybž˜*…œÑ!:žð„ÇhO{O{O;.W,¨XP±Ó4fYcÄ`1X Nú‚9ÂaŽ<s¤â± %½ˆtpÇ'‰Â1u„ˆÍšÈ]a; !!$$|ÕÄ'GU‰=Áž`Oÿö‘ø‘ø‘È,õ?âÄÿVŠÍb³Ø 5ãÃø0>ç“ùd>Н¯/ÁÛü¶ùmóÛl«rrrAÖâ‰K³£NÌsÅ\î˜#²ŸJËÈÈÈÈÈÀ°äQ8&sÈ‘»Û¹{Œd“l’ýÃu&Œ cÂv”"qˆc¾.³—ÙËì|ÂàéÁÓƒ§¡f†a Iž¨­­­ÏrŸå>Ëe[•û”û”ûžÜ>þ|üù¾£­‘­‘­‘€P'ÕS Pâ›}XÚ v(ø‰HD")™W<¯x^qÖ*e¼2^9cÀmÀmÀ,L-L-L¶;:úi . . .ø¿šû5÷kî“uêfu³ºu¢NÔýí·–[Ë­}G¤Ò1ý{ÿëG_åbñ; Þ1m r*§r²Åìkö5ûâ¼à!xF^¡Wèú¿~±üÅòË]Š›››hæã /<¾ ,±ØGìl¢l©l©léNwzšž¦§ÿ~ ( `;Ð~ô‹oHp8Š•‡àäwr7å(G¹FKi)- m›¸Õÿн?öþØû¢¯,W–+ËešØ86Ž»]íUäUäUôçÐö¶ö¶ö6òøšøšø=ëÐ[æ´þƒ?Wr×Q.„4lÅVlå’XKbÿéEËi9-ß³Qõ¦êMÕ›LkbM¬éù›â—â—â— ¿4Ç4Ç4Ç€Ð;ôIåèqü½‘ŸÄ¤ŠÙôIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-171.png 644 233 144 2440 13755454065 14751 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÕIDATHÇÍ–kHÔYÆß1G“u ÷S— ý¸!‹B» t,S²CËÝÒ¥š¾m” ÒÒÆ–t‘ÁV!ðBNeå˜Ñî±0ZHÓ4w»Ù”æüo¿ý0sæ?å^¾z¾Ì<ïyßçyÎ9sÞ9""’ùˆ[·8.%Œã¾µãó×Ï_ŸùkŸ5ÀQä(êÿܧݧÒêÒêÌA«y•[/bóÇ꩸¤ŠH¼”xÉáà*Ø–½-{þ§aüS’Z’ZÞé°»mw@s}s=ßÁøíñÛ¯¼¯¼`c5¯òU½â‹å—ªôEÀéwúC˜˜ žµžµû d@A~A>Àè¼ÑyVÉ$[^ H5žÇ`5ÉWõŠOñ+=¥ö#¾:}µn/ÜžôK¸`°|‹|‹”žÖTSM2èA=`ì0v0VÀ àÀ6Vó*_Õ+>ůô”~Ø|x¶'Ö`'':€Öƈ1†¥íÒv¡ñ 9ä`YX!+ú{}ZŸ£Ä(1JÀpÉF2X_Y¹Vnt'-­\+G³zõ½&ºàÞm1¶Êà‰51G)"’Uƒž4’4Œ‡G©Rv6Í£y˜¢ƒQF±‡Ž6ÿ/¸vÚÁW«`×›ÌLEr7ÀCã¡4ž4ŒW~"ÆÎvÞÃ{¯ÌÖÚ!í½âó矜?xüà1<»öìÚ³kPs´æhÍQ¨}Qû¢ö4L7L7LCFF†íóÂç–]X÷rîÝ+ŠÖ‹êGüDŒõd_cici4ýkýÇ™å3Ë™)ù­äFÉ ûÀoõÞê½Õ w îÜ-€œôœôœtؘ½1{c¶w®â\Ź ¨Ø_±¿b¿ï8Óq¼ãxÔïŒq%¬““ÊXïA”›)7­Kœ»3vÇ^ahùû7ïß@ÓgMYMYà™ðLx&Àßêoõ·2kÔ·Õ·Õ·ÁÖ%[—l]fª™j¦B“»ÉÝäÏãóøÀßêoñ·ØuÆŸêÛøÊñ• ü¤¹Ò\æ<úü)p%|í­Fó”yÊ&È+Ì+Ì+„fo³·ÙkÇ_ž|yòåIX:¶tlétwwÏ6žW–W–WÍf³ÙlÆVm&¢ñ'b^6/;ÄÐóõ|qˆˆHºäHš¤Ith™Z¦–)bÞ7ï›÷íøEïEïE¯ÈÂ# ,<"²Ê³Ê³Ê#bvšfgL½[skn¹.—©ˆžè›õÍ"ÊOœHÐôöý.ñ]®€ˆL‹ˆðã kµ@BªÞ5èt Š8÷:÷:÷Ú¼¾@_ OdSù¦òMå1‚eR&e6t »†]Ã"ΧÓ錆CŽa=‘®ë]×E¢~fÝÊPä–Œèú€}+'OLVOVC¨*Tª²âõº×ë^¯ƒ©¡©¡©¡˜³«£Ž:Nþ¹^ÅfÜÌ·Ö‹Dù­zæº$ItÁqÓqÓæ ããðÃÊVÆ}§{ ¾-¾mJƒ²;ewn7Þnä'ïïð»ü.ˆb3næ›õ&Ÿ•_ŽÿK_æÝw×ö8æ;æ‹@úæôÍûC #°µ`k€7ÆcØ@M X`¸€Ìç­›ñp¾Yoò™ü¦ž©ò#²1e£l/Ü^%Tð´/=¼ÔÔ ¶'8ÁÐZ@íQ{˜£ÇèÀ† ¢ØŒ›ùf½Égò›z¦~È|º·g¾ƒq;ã Øê‰zôéYzAõ‹º¡n`¨oU†ÊU¡ö«ý@I$úU5«fP™*M¥*Q§Ô) T›j#êµz ̘üa½ˆ¾X eWCüxüx ž©g 0Øz©^Ê4žpó&™`‚ÿ>ÊGsaêÅ”oÊ'R¾©|Sù&‘{%÷Jô~èýÐ+²¨xQñ¢b‘]£»FwŠ¤æ¦æ¦æŠŒÙÆlc6‘oŠ7Å+²»nwÝî:‘%ž%ž%¿æ×üZ”O®ÈQ9jÑ‹è‡ý„^¶G•Ðú¾õ}äÝ,5ª´T-5zž¼>¯ÏëƒÜ—¹/s_BbQbQb¸›ÝÍîfqŽ8Gœà|î|î|I‹“'-†â@q 83×f®Í\³ì\Ž6¤ ™üFiT?äç˧ÒŒý¼àExxÁáàpp&²&²&²@/Ô õ¨^°#Øì°Äkô½Æbh”Yf1,ƒ÷³§òËsl*2Çêô:¦#`ÀÈ7\æ‡Àpnà ú˜>¦QeTU–ø7Fš‘|Myúý Óüý¿æØg&èÿ÷¡©ûê>€^©Wä4tb¿]FÐÄU®Z:rŠ“œ„H¼•Ç<Æý ~ Êä óyòÏÙo圽]ÌÙûØÜ¼ÁþÁQ9ÂÎCcIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.4.png 644 233 144 3020 13755454067 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÅIDATHÇÍ–ûOTgÆ¿3ˆÃìL5.  dmp½„˜Æ º°š´²ë*º]´¡¥IÛ(1d½@4ÅÖRSÒriSÝmBS-ñÖ‚ÙÔb»‹7)4 b,ÈPG†™áœó~ö‡áôÌÖÀ÷—Éó½<ÏwÞsÞç¼""2gæWÀþ”ý)»'‚í·âq¹q¹‹þÁõ:Ø l={!þ½ø÷æ6Ïm6ú,læÍúè~‹?Zό˱ŽG‹-{ïƒMK7-›Áo]çIçÉI J¾(ùàó?ÿ˜Wáî·w¿ðeû²ÁÂfÞ¬7ûM¾h~Ù÷}ˆ={Æö#8f;f‹@RNRβHÁÀBxþ¹çŸŽŽQvÐG7n• øñc®±(lægêÍ~“Ïä7õLýÈ<Of=™%7oÜìlŠ4ô‡ŠÄŠDSoú$PM5nÐüš@ߪo%ꢺ€ XØÌ›õf¿Égò›z¦~dëQÞ©} Ç ÇAý`ú’Ö9íœv‚rk)Z Óêæ1¥ZH þW}³¾tîÑ= þ¬²Í}à Œ—Œ—˜VåúYý,ODø¡0XÆM}óQ~)"òô»àô;ýþYê~ÿ¥þKÀvòA­Qkp˜·y”Où”/JxŠ)¦xt…ŠÂdêoú~}?™h>“ý_õ¦~d°§ßÙ±úoÔù¶6“ÅXq+ÑëõzáÈ'GêŽÔ¡zzz`8}8}8êRëRëR¡a¨a¨aN8N8N8ÀÛìmö6[ó;ŒÆ º>tõŸMmÚ6XzüqgËÎà^džYj¥ˆÈ3­öïóêóêe·íîệméùýëã×ÇK8åzjZjš8»»»E¶ïݾwû^‘ ç/œ¿p^ÄQå¨rT‰œ Ÿ Ÿ ‹4®j\Õ¸Jd‰,‘%"¢4¥)MÄ.v±‹HINIrI²Ø´ŸB¿„~‘p¶äHŽØÒÕîµckÇDìʇòL«èW]ï¸ÞQ-Bp*þlÂÙ¨x½|eùJ럦õ¦õ¦õÂQ×Q×Q—oÚÖ´­iž*uïrïR-0qgâÜ8t«îVünAÜ`Ü \vpéÁ¥0‘<‘<‘l »}ìö±Û°:auÂꄨ³P9U9U ãÅãÅãÅPÝUÝUÝ®8Wœ+’6&½ô‚eëMO_p|€Ô? z§ëëj±«×&?˜üàj—Hgng®È÷Õ7óoæórèdhQh‘„[·´´ˆ$®K\—¸N¤½ª½ª½Jäš÷š÷šW$ÏçÎs˯Ëö…}a‘ÌØÌØÌX‘¢©¢©¢)‘Éàdp2(Rž[¾¶|­ÈŸz2+2+$¼Ã_|¯ø/˼3 gDb> ìì¾Ú%¼9ðÊ›¯¼ Á¶È)ùù¿#m#m0bIID,II…PM¨&Tæ?˜ÿ`>J%’¨w¥Ò¨4*aìòØå±Ë`x á±òA-x?xõ`ƒO|u*¿Üeße7 ·þ1}Ãò‘3}µP-üÕw]¥”R…54´(\C 5 .©ïÔwÀ‹F™QF€¾þöÝÿu”ýü>f~jŸeaya9¨ãgVº[wƒú·6¡M0ÍGtÓ⤼NeQƒÜ¦Ÿ~P?¨>Õxˆó—¥L³OïÐ;€Ù~(Š)Š¿uþÇ÷[ùØÞ.ÛûØãyƒýÅçH’4‹IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-16.5.png 644 233 144 3102 13755454066 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü÷IDATHÇÍVíOTg=3 …0¶ÄÌJJ@ ¶öÖZšØp1Ú1%m!ÊŒ0µÛ¤Ô 5Yý`šÚBCt¥©h°/v0¬Ûî:µ• Ži­TD T†Pé Ãë-fî½Ï釙Ëíþ>_n~oçœä—{ž$ 5úiN7§›m‘ؼÓÈ'nJÜ”õI$nTIÓ ¦ní'Sޤ!É%'—œÔúŒX¯ëý±ó€Ë§ç‘ #‘p&ጩ $·>ºõÑć"ñ;—Ik«µuF!+ÎUœ#ɳÍg›YEþâûÅG’¤ëu½_Ÿ×ñbñqð/üÿyü禙ð@ÂùðƇ7fVGng’E[жäÏq?Ç 3I’ê(ÉE\$ HÊ”©Ÿ`L¬×£ýú¼Ž§ãë|:DÈóÌÈçKŸ/µžˆ ô}DÖ,¯Y®ó…[Iâ!."Y‘IR-SË8OŠËâ2IÒDiÄz]ï×çu<_çÓù#zŒUjðn!Õb¥XYtE[Î g’¢]]ª.e8Zâ¢D”Ê ååRÖ†µaþÿéd˜a õŸ¡£¡£ ««ÃÕájRÝÁgIñÒ⥺Àw UÞ€ìÒ:h”-ü÷@Æ@©¶“$lÓÑáì‘IL"ÅC1êYÏz’+¸‚+bòàÉiNsš$ÅJ±rÏAú¯ø¯¤U¶Ê²%",»ÁŒ¿À«¦¶¿µý­Å ¿[XR\>à‹¦ÿœtœtÀÚíïþ±ûGÓ˜Å,p§ûN÷n ®©®©® ¸î¿î¿îp·q G (%´µµyÚ<À±¢ÆÂÆBX?è:öͱoðÅøÛYOf=)$`GþŽüÅ ‹"zÌXO}†Ô‚»w `z¢ÌWê.u#Tq¼¢®¢¦ñõãyãy€2¢Œ(#€+וëÊ:Æ:Æ:Æ÷œ{Î=Ü´Ü´Ü´Âä¹GîÜÜϺŸ¼y'½“0] ù<>BÓ§åx9Þô°aã†ß‰è±`«ÍasH¹@ž+ψOñ3xîlQgQ'БçûÉ÷´)isÒfÀ»Ó»Ó»ìììÖî]»wí^ Ç™ãÌqvÍ®Ù5C˜Ö?ëŸ&wMîšÜh™Z†–lXQXXXˆ„Ì›KÌK̦X÷ôÔÓS€¹ÁvÈvHÊ5ã¸Î¸Næà¿–Ë =èÁXiŸ3Å™ØwÙ_±¿„!GȨûÔ}ê> 1>1>1XÝ¿ºu?Ð"·È-2puÍÕ5W×ĬRR$EÊ+Ë+Ë+×—ä’€?ðò—–Å­o¶¾‰1|ŸV™V hLe*s@ÅvÑvQœá…‘àHþÿý©¤béEéEò’ý’ý’l¯i¯i¯!³/d_ȾÓW%UIUäá¾Ã}‡ûH­Z«ÖªÉÖäÖäÖd²6«6«6Ëèϵ­ë]×Kþ+Üdi²ä|Ó|©f$ % ‰3Q»èzçNŸ:}Šd IŠÑùùü»ù½ù½äù†ó ç àmÞmÞm^2yUòªäUdY ,P û—õ/ë_FJÇ¥ãÒqÒWî+÷•“ë»Öw­ï"S^K©L©$]Î÷œïq~®^çóÜòÜ"ÅxDOTXcÃîZw-Éa’Ô'Õ/Õ/É©ú©–©Š't*tʦ]Ó®i×Èàþàþà~RKÓÒ´4R8„C8È`U°*XEŠÝb·ØM*{”=ÊrÔòûÌï3Ú‘°#ìX@{œƒîlw¶îgÐ}ƒ´þfýM¶þ?ü,ð;Ò>Ô>Œñ±ítÒIj²&kÆUD‘.ÒE:)FŨÉ-.Š‹¤Ø,^/‘¤xF<ÃY‘Å_îïõ÷’¤uÂ:![ømDáü"ê¼¢$®$Îp~&(÷”{$ßWçÔ9Ãùy–zHѽ‚šÙÌf’“œà)zÅ qƒäh´ÿ¨:¬3,¾R~U~%ùqŸ%– ÉÐ_ÿþ½+ïÛ×Å}û»?_°uÏ©Ä*ö·×IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.2.png 644 233 144 2465 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜêIDATHÇÍ–OLTWÆ “ $J˜j©‰Ä4â&V!Rj„)1ijXTjÒÖP%¤1-(²`ÓÒFCPдÁ´16B‚ 4ÚÁ̈¢ (L'¾ óÞ»¿.f.kîfæœ{Î÷}9÷Ü󮊢(Š3ú«@¬+Ö›±c?7ý ûö}p9b·êSSò××°¶em @ò¥äKÆCÓ–û2Þš¯(&¾•Oú§b:â;â;bÜQû ÚqhGBjÄþîØ»ì]¯48zãè €Î¶Î6¾€©þ©~€9÷œL[îËx™/ñ¬øÊ™7øV÷¬î‰‡x[¼MQ`ãÞ{3ª"£p°ð`!ÀÓ¸§q"ô` k„B®Y‹-÷£ñ2_âI|É'ù#zHÉKÉS(>\|Øþc$ááÏP“^“.ùÂ]@ ¬-¤…tîaÄq€bÀ´å¾Œ—ùOâK>ÉÑ£,?Ûï?B”ÚJm@ |ôq}Œ1-OË#¬MèÝ;D¦ÈK­f™5Mñ¾Hé =ÔÐ@CZ––EXâ±Å—|’ß~«bË{L|³¼Ç¿ºÝ]˜]˜]ëZ×µ®k…r[¹­ÜÞ Þ Þ ›š›š› u›ë6×m{Ÿ½ÏÞ»×ï^¿{=$]OºžtÚi¿Ö~Íì1ý‡wöØ·’è-ùUëÐ:Ì[´xnñìâYx>ý|úù4ÇŒcÆ1"CdÀ‹«/®¾¸ jµZ­VÃLåLåL%LNLNLN@àË@e ^ǼNŽ£Áh~úß[i™c¯üApIÐñ›ž¦§¡ŠKbP Zæ•MØ„ ļ˜ó–³WQ—¦T´*,XM£Â¨°Ì1üº_‡wÌ1Ëä§4¡4Ð :ùGôà+ݧû‹^1.Æ\¦6`†i¦A¼/ÅKàJ)Ñ-ºDˆA„èÐõDÂ|«éERdø.Zi\iœ¬Ô²É¿b¿•+öu±bßc+óûƒœ¸_oâÐIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-194.png 644 233 144 2641 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜVIDATHÇÍ–ÿKÕWÇŸë—ì²»–áý¡Ð‚XBR°$¥·%˕Ù4I‚¨¹b#”Ūµ1VkŒM®²¢[¸Õd¹‚~0 ÅÛKaËM‡_òΛÌ2¯­ÝëçËyí‡{Ÿ[ý_><ç<Ïûý>ç9Ïó9""27þHÊJÊJš³“Þqæg¿>ûõÅçcv½®·\oýö1¼T÷R@ú©ôSv¯cëuíŸ/âà'òéy™+ÎDZSZ“Ë·Ãæå›—ÏöÆìcíà¾ì¾ü¯ UÍUÍ—/5ò>„:C¾ 8¶^×þ:^ã%âËá§øE µ%µÅ5i³Òf‰À¢¢EE/ïŽ9üõ2¼¹áÍ Áä`²JëÀƒGù€)¦Ðc<ÁÖëq¯ñ4¾æÓü1=……"PZQZá> è={3÷fj>ã2ð9ŸãsÊœ°*­J¢ ÚU;.\àØz]ûëx§ñ5Ÿæé‘'sûÕ:Tù¬òY€ `t€5b€ý‚±ÛØ¡*¬Â(-Ù¾g‡ì˜ÌæPï¨jO¥ö˜·ÍÛv–‘j¤Îl¸ƒÿ6› @ÅùTŠˆ,ýÓ=â™Jþ¹ýs+¼aµ‹ŒE<æ}ô%0…UX…ƒä`‚„Õ¬f5PDEÀ»lg;¨·Õ^µÀ²‡xÌ¿1|è{Ô÷À=æ›JÑzâÂêoÂÎ;ö õ©QcÔ8:ÊJJ §¸§¸§ØÑÑ}­ûZ÷5¨Í¯Í¯Í‡ÞÞÞgNŒÁ«ƒ? þ­›Z«[«'3ÆÇ£ìü@§¶þf\د{Øíßêß:£c»y$šÍ!º%°¥uK«“ð6«Íj³àîÑ»Gï……K.Y¸V[ulÕ1Èöd{²=¬V«ak­=´ö¬ù~MíšÚ™é¨}8ÆÇïþ‡öë97æÜPM|7Ú5ÚåMçD‘0\Xvaé…¥™“™“™ÑÀh`ÎVœ­8[yíyíyíN\îpîpî0œ œ œ @ãÆÆ•ýPÖTÖäøÛ¯é# Í Í­G ýÅôí;0þ÷øßÀ/±²W~ûû ¯9¯9¯ZzZzZzàᶇÛnƒÜ‚Ü‚ÜXbý‰õ' ÓáÉð@éñÒã¥ÇÁwÞwÞwö%ïKÞ— ùóóççÏO¸«¡x›©ÿpüCÐz’DìŸíŸ]wÄ27˜DÄ%""òª¤KºÌ ã´qÚ8-’R™R™R)2q}âúÄu‘ыД„JB%!ïïï‘ȺȺÈ:‘Þ¶Þ¶Þ6ÿÿÿ‘Î{÷:úèdáÉB×üŸÚ½½%2£gæŽáŸôO?Æs>ϼb^!ªwV˜]˜]˜ W®6\m{À°ÀWå«òUAÖ®¬]Y» fYͲšeµ¢VÔrª·îbÝź‹PðgÁí‚ÛÎ#5ÎWï?â?òÄ{ª*§ãU2bÞ1ï8'>ùõä“_ÀôþéýÓûTD‡£ÃÑa+++QîsŸû ~™QoÔ áõáá(°¿´¿ÔmÉ^1ÃÿdU.ýÜ!wh*ú¬>kï °·Ú[yLä©ú÷âÅ ªX«„ö¡Vª•j%¨I5©&A…ÔÊ8ÀàûûsHã÷{ú=€åºƒÏô±„ÎOyZy`Ç;3V·Õ ¤YïYïaPOm }è0Ÿð ¨.Õ¥º€[<ÓÆŸYA+ˆÁ f¿Ù¯§¬òäòd}ROtþçö_ùܾ.žÛ÷Øóù‚ýËíSØâf%IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-9.3.png 644 233 144 2521 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]LSgÇ_pPÊ…%‹„D±~$»D’ªa­HB¢É”˜`v3l›¹ù1M`~d%Æp1YfL‰q‚ñFÃj2¹¨bƒ”ÎV$”†ozNßß.ÚÓst[vË{ÓþŸ÷yþÿÏû¼O!„æø§€ä‚ä‚ä•1œ|L§íIÛSôs _W!©&©¦ÿÈjÍjÈîÈîˆêXÛ×òõBèüF=-.ÌB¤ºSÝIåq|j7ÔnH[Ã?ô@zgzçŒ wîܾqû'`´w´ T*kûZ¾V¯ñùÅÙô…€”{)÷’F Õ”j wîZ÷e,ahì­Ü[ ðfÙ›e2Ô÷@²˜b m°¶Ï×ê5>_ÓÓôc~¬Ú¹j§P]W]—Þ+ü NæŸÌ×ô"À.Ê”2 Ö«õ,€ì‘=$‘:Ööµ|­^ãÓø5=M?æG|x¶—lH»Én"‘ßAQG :­TQ&Ô<5)É#òú &¬Ã¨?ú2ú”?Õê ¤Ü \U®uBæâüÒžjOÕ ^²ŽR!Š„ôÑôÑ©O˜õMùô£ù\ΪÔÌò-nÜ#6lØ€,²ÈÒÃrZNËià<ç9oÈÿ?~ A}¬>fVãgÑ7盃„~ÜOÜØõßàøéã§@t9JŠ’¢ëy¾òœðœ—ÕeuYa¸o¸o¸Ïð„FFêØð<¸l½l½lß_¾€/ óÉ_"‘ŽDõ¦„~ÜOÜX_Ü ß Ct@~¯XxñÇ‹ž=°¶amÃÚ(»Vv­ì¬o\߸¾^—¼.y]¢zvôÙÑgGÁ|Å|Å|jZkZkZ¡`¨`¨`^-¾š|5™H_VM/¦¯ù°òÑÊGÒ £[F·€ú,WĵèZ„ÞÞ^=n™·Ì[æÁåt9]N=Þmï¶wÛÁYí¬vVC×L×L× ”v–v–v‚çkÃã0<éí[L_ó# ;3;3:ãoÇ߂ܗ¸öøÛýíþv°Ô[ê-õPé¨tT:À´Í´Í´ ÚšÛšÛš =–)3e&„ττÏ@ÅîŠÝ»¡ØZl-¶‚7×›ëÍ5[ÐôbúšŸd!¢w£w“„Pö)û„ E!ĪøÝ¡{¡»¡»B QÕ\Õ\Õ,DîDîDî„kj×Ô®©B¶É6Ù&DKWKWK—‡Ì‡Ì‡ÌBt?è~Ðý@¹Yn–›…èý¾÷\ï9‘XìÒôbú ?÷˜ü°ÇBy¡ŒPØêlu¶:Èߟ¿??8›œMÎ&¦Ó‚i°qùÆå—ÃSïSïS/”m/Û^¶rssÁ.ìÂ. \þ4ü©¡Çæþ³Ç>º•Ú-éRn)·ôZ,XÌ[̃àÖàÖàVà"¹Ñ@4 À¸cÜ1îé–né†HI¤$RÁwÁwÁw «ƒê ÎG¿òDyò¿·Ò0Çæ}Ó¾i}ޱZmR›˜•Ò! M+ e¡,s˜Ã†ø}y_ÞÙ!;d‡!n’i9©V©U†9–˜›ÿ:Ç “{š= P >ùc¿ô‚TƒDä9)'‘xxÎsà=cŒra¾ã§@vI¿ô#iWQ!j¿Úoäëýsò/ÙÿÊ%ûv±dßÇ–æìߥH^Àé@µIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-151.png 644 233 144 2543 13755454065 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]H”YÇŸ™ÔIÈt¤ Hh¥Ú4$¤›%£(² Í"K·Z‚¢ºj»h¡Ï­¥l‡Ê­ee7­H7̶ÌœÐ>."jKÒek™TØQ«Í™÷¼ç·3gÞiƒ®;7ó>ÿçÿÎá;µO(p-w-ÿãH?ž~Àû“÷'»Ë±MÜä'âEœú‰|Æ/â8<<\E1{”Í.›=vbÔþ.©M©Mo,Xiý%€ÆŸækèïìï,,Ç6q“oð¦^b}Ùó?~HnInq½OŠ'E| } §m‰&ü9 ŠýÅ~€—c^ŽÑnP¯€qŒÓEÀ#˜5`›x,ßàM=Sßðþ¨ ó&Ì/W}¹*õLÐõ ìÈÚ‘eø"MÀ^ö2¬k@•«rFAu.pl7ùoê™ú†ÏðGõÈûg{xº4¥4°" B*öØÈæÈf"ú/RHA66¨j»Ú*Wåª\PjZ,f>óã;©í¤È†È"úuÌ:o¸ƒ7%ªD‡$¥ˆÈÌcX©¡ÔÐHôdôd—X¢‚_ÄÇ[~'Dg=ç9Ïa†4¿Ìe.ƒ ªêp•—¼°·Ú[ymœ%Эº@jjÿH’Ñvâ6lܽq70`çëo#;#;ŽL©¥xxxpø/ö]ì»Øâ@q N];uíÔ5(((sòjwÔn©Ýæw¦†¦†¦† arÃä†É øœÂœÂh´íF;AØßfÌÄøczÜ"v³Ýìz*Êò[~q‰ˆÈ™#^ñJ|YYV–•%âJw¥»ÒE^ß{}ïõ=o‰·Ä["²²zeõÊj‘I½“z'õŠ æææ;øps¸9Ü,"7¥UZ¿¼ñ‰µÌZ&bô¸EFŠFŠÞ—¤ö`{PDþ¡ÚU¨3u¦„ >­3­3­SD×è]#’W“W“W#Òæió´yD¼}Þ>oŸÈŒž=3zDÖn[»mí6‡?ã|ÆùŒó"Éã““““½®ü(ŸHûÍö›"q=ÜÊpì–„¬§ÖSçV}?´h?„††:G999 ¯¦¿šþj:ØGì#ö>Xq|GøEøì¹ö\àöGoåÌcÎ1sÅ̻®à-oÞ'Òwô}ôb½X/NðçèLa SïÌG¬^¼þGçXÂä§ÔSêìøä¨µYm& ‚Féö±t›nÓmÀY~å×6LÇñ?ªJUßï¬Ò¤Ò$³SïMþOö¿ò“}]|²ï±Oóû¥ 0­ašIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-163.png 644 233 144 2640 13755454065 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜUIDATHÇÍ–mHTiǯfNj¥M 8DnĬnöEQA+*zAÉVq¨-3Ú^`3öË´Tn¬IÒ›«E¨ƒä 9»”“bµùR›ä¨ì`¦™•:¬å̽÷ù퇙ë[ØÏÞ/—óœsþÿÿ=ÏyÎ}$$I’ûß›ƒÍÁ>;xŸ¾¾` _Uùì« íÚñâ'XtqÑE€%×—\W{t[ókñù’¤ãòiëÒbI_0ÔjƒÒýö)عzçê&Ÿýk ëõÿÈPÐXÐPw£îßÃðãáÇÓ?¦ƒnk~-^Ë×ðñ¥S_ðKÌ·Ï·ý †PC¨$ÁòÌå™q‡}}q°uóÖͯ罞'‚@y„&Ò7n´g,ÀÖüþx-_ÃÓð5>ß§G‚¥iKÓ$ ¶ïÚ¾ËxÍ—Ðs Šb‹b5>o=p†3„ì–ÝJž’Ç4ˆÑ@A Ûš_‹×ò5< _ãÓø}z¤Ù{[’ÈÍdo(ƒÊ ¨aÞ#Þ#x…CŒŠQ„&Y|+v‰] wÈr¨ýjŸÚ7SAÔ$‚²Ë“ìIÆ+VË&Ù4óÁm|Ê’³d@øùõ­”$I²”!ƒîp.v.𨤴x—{—3ENœ:!DÂ%\°þ‡<'âDPË-nø›Ôh5š) |øà\æ\xŒ.£Ë¢éñ »Ú …' OÔoÄÏÞãÞã3p¢² ÒZi…ÎW¯:_é<ÎFg£³JJKJKJ¡=§=§=G÷w t t Àù„ó+ϯ„Þg°38 âÕ>¾~¿¿°gÇ8\_?þüËtüt<Ó¹æ6ç6ëþ êAÔƒ(ðy‡¼C°ndÝȺØbÞbÞb†”ò”ò”r¨ ¯ ¯ ‡èñèñèqØV´­h[˜ûÌÝænèŸî­è­`ZãÙU™U™š°gÇ$ˆpD8D-—Þ<}óTÿROüçÉÏ“Póu¥Æ±©±©±©ðä쓳OÎBÓÆ¦MÁd2™L&(œ,œ,œ„âÅŠ@ÍÑš£5GádÔɨ“Q`ÿ`ÿ`ÿ‰õ‰u‰uÐýcWJWJ@/¾2™AÓ#Á’ð%áêK~÷{Q­^P/è‰I¶$[’ ]Ž.G4´6´6´‚9ÆcŽ+W ®ÀŠúõ+êá®ù®ù®Dƒh °~ÿúýë÷ƒ%Ù’lI†¿¢ž‹ç3ʘ˜7úvô-hzôŠÉÉÉÀþâö©7Õ›º°5Yk²ÖdAsLsLs 8ŠEŽ"°Ü³Ü³ÜÓã2"3"3"!Þo‹·AnBnBn‚î_udÕ¡U‡à·«åùåùúº²}ðôàéYó÷ÕÕÀmßž)7ÉMZ@Ú@Ú@ÚÜ)»Sv§L̹Ÿs?ç>,œ\8¹pòöåíËÛ=zõ<‚¤sIç’ÎA¤+Òé‚l)ëSÖ'˜H|ßý¾[ï1Bª¦ª¦fõاÒã?%ƒòKù¥~*'J'Š'ŠÁcóØ<¶€ÞhWÛÕv«««%UIURzu·g·g7ŒF¥Q ”eZ™F€rY¹ ¼øßSi)ã°qؽJ¯2ƒ» Ô|5Ÿ)Ÿà€ÇŠ+¨nÕ­ê¿$„UX…T»jWí ^ŠÑà•÷Ê{™ã3sl­s-0eì7öÿgŽL~² Ù@ÿäïT:ƒrP9ˆ—rZhÑçuÜæ6ˆ6Ñ&Ú€K\äbÀü@%•qW‰V¢ñrMÙ£ìÑœÞ6”ìì­R³&ÿœýWÎÙÛÅœ½ÍÍì¿wøzL—aRÖIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-84.png 644 233 144 2374 13755454065 14702 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܱIDATHÇÍ–kHTiÇŸµÑÖt*­ †´‚\–ÀHX¨(Íí¦ IÕ—ØêâЅ.´Êº‹°`^ÐH'³IQ»4ÖbÂRRîv1–Z²rw¥çœóþöÃÌ;çìºÆ~ôýrÎsûÿÿç½<çoâ)àö¹}íþÒö§oL߸¸+n·™àò»ü¿~ ÙÍÙÍ3Ï͹{¬c± ¢ÚÓ_ß_ß_ùmùmùmàûÃþ0ä ä ä ÀÓ%O—<]bó¯K[—¶. Öt¬éXÓaû­ï­Z«øÅ>]äÖ“[On=ñy‡¼C"ÝåÝåÝå"3:gtÎ9Úx´ñh£È»êwÕïªmW§ë‚낈ü Ï幃/ÉŸÐY=Y=ꌬYaO¹Ybx m·_ý¼?ïçç- ""yË¿iO¥=•–›Ài»“ñLK¦å™þvè m×¶_ÿ#<öþcïäŸÊ?Ob#oÔ§ö‹$ùSõŒ¸äI2áÌpjæeÜÍÏ7?Ÿù³îº YCYC÷bðÆ'o|0xzð4¿…ï?ÿþs€»æ»fHb#oÔý_*¿tܧ/]|è¢öoÈx8ãa0½dz©èw‰‚‰"°nµn¸µâÖ •úCŽ2!Bk>ùåz£ßà3ø =C?1ÀªªUU"а£aGVo¢aücxçÉwž4ô¢CÀ±P, ·è-D@]V—ÐÐ ‰¼Qoô|¿¡gè'æIneXDäðhò5ù þ5@ÔóGMQ¨_ÅcD¹ €Òÿ ¿­¿ úZ½D/}—¾KßÔSG÷/÷GÃÑ0ÑØwÑÂh!¨güÐ4×4 }c+‡EDžû d…²B¡t÷¹}n €zP¥ª”0c˜a –ZjS$utô&L8e¢˜Š©ð'p@U©*Â\Xæo]Ö[Öçfbá?""ŽEkCkƒA_í»/­_ZáðÄaßaj¢fâʼn“‚ƒÛ· nƒãÖãÖãVèöt{º=pgôÎèÑÿ{b\›º6um ŽüâÈÚ#kQ¾ÙñÓã§“zê­™­™ÆÖ:FÒâ·DD6}ªÉÖW·¾*òÏm“OL>¡•Vž©œ¨œ%wŸûC÷‡¢YÊ,å–r‘«ýWû¯ö‹ìU{Õ^%âjv5»šEÜš[sk"–@K E~Zž*O•§J¤r¨r¨rHĽÃýšû5Ѷ,l¹¹å¦,}Ó°ìZ©f®Õkuu>1OšÖ–½˜½¸¡\¤Z«ÖDgfžžyZëµ_+òVD2l7mS¶)‘B­P+ÔD¼}Þ>oŸH°?Øì‰Äâ"Õ%Õ%Õ%"Åþb±?9ØâÉÅ“‹'Eì#öûˆÈî_ï¶ï¶‹¬ô­Š¯ŠKFØy{æöŒÖ+bv™]"’“ónλÊòÍ4~ƒÌ¹…¹…ä±¾°ìPã­ñÖx¡¬ ¬ ¬~‡ßá‡=í{Ú÷´Ã™gNœ9¦u¦u¦upvßÙ}g÷¥¼c]ªKuA°=Øl‡ºšºšºxî—kV¯Y ×§|VŸ•y¸×u¯ â×s¿Íý6~Cô¦ìdzWNˆ¼yŽ÷ŒöŒB]}m~m~R`ã…6^€ÆÎÆÎÆN8´ÿÐþCû“ùrU®ÊÍ?š4¥ï`ÎÁœƒ9`9f9f9–Œ¯ÞólÙ³eÐ½æ£ mXª_ª‡˜þÈð#ÃÊ)jPDÄû{pf;³!Ô  ~óóê¦_˜&’çÏ˃Ó;§wNÃXÏXÏXTX+¬VÈuä:r`‹Ø"¶Lz&=“X_º¾t})\i»Òv¥ 6Wl®Ø\+í+__ù:4Åzz‰ÓzàÜäÜêãĽ/ù£ç¢ç¢ç`.s.s.T‘*RE  T*€yÛ¼mÞj@ ¨ˆ–DK¢%0;3{cöJÿf郥’zŒ·™ÚLÉS)|ý¿>Ææ„¯¨ýäc¯¨W+‹Ú®¶CÜwÅ] :T‡êHy—ŠU±*òÈ#/%~Q}¦>uJWç”UY «ÄC¨WAŸ×çÈ fCéüÝð1Ãù#†ó¾¼âåÀ¾„3+W, Ýú´>MÔÐã t‚V—Ô%`ˆ!†€»,°jL}¥¾Zþz‚â=ý ý ¢ê¯±éØ4Ðc8ÿ²^ä~çp¿•ìíâ½=˜7Øÿà‡*Èê¿'IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.2.png 644 233 144 2757 13755454067 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܤIDATHÇÍ–LTWÇÏÐma`B5bU:SDI]X%פ‰¦†é´±i4ãªY\Ôu×n²`ÿ¨ ©«6•¢ÔÄ_µÖÖî6:¶dwÕ4a•­6È2ਫ…¡è óÞÜOÿ˜y¾iûWÿóþórî=çû997ç¼+ ""SR_ W†+#7igüÞÚÏZžµ|î§Iûˆ¶Õ¶Õ]oÀãï?þ>ÀÔ§~˜è±lóÜôO±ôÓyæ¾Lk#³)³ÉæNÙ»a킵 ²¦'íw[Áî·ûÇt¨þ¼ús€Ï>úì#þýmýmwÄ –mž›þf¼©—®/»ÄG¿|ôKÛÿ!ó±ÌÇD à…‚æìH:Üš/­|i%@ï#½¨ 0å¢D1×`šmž§üÍxSÏÔ7y&?™@^Y^™¬Z¿j½ýd2 ç¨uÖ:M^ܼÍÛ8@êQ£Â¨ ªUµ`Ömž›þf¼©gê›<“ŸÌǺÊ!‘σ÷;ïw fÄ/ëWâö¸”C/Ô ‰«ÿ1i(=¡Çô/ëõ`ä¹F.¨ç”Û¬SÚRªPF†¸ÞŸŸ‰Ö¤>xoxošÉ7¯òŸ""¿<ö¨=ý…ºqùÆeàw”ƒzV=‹Æ;¼Ç{ "*¢"iÈqÆO³54´´ŒÕ 6QE€Z¦–¡ñNR_ §x)>­É|R;òoõ-¶-6S.ñë3 ¡þãúÆúFT×­®[]· waïÂÞ…ÐXÔXÔX'sâœÉ<“y&‚§‚§‚§~R1Bù¡™¡™Ð0»ÁÕàB][tõôÕÓOMn)ßR|›ÌG¿¹VÍG›B׿ÂûÃûU•KË?’„ØÒÿ,½¸ô"Ÿ->[|öù÷ù÷ùÁSí©öTCùÆòå­Þ>Þv¼íx›•Pçxçxç8¸t—îÒÁís¿î~\ÈÏÎÏ&Ö¶ûúªë«T|ß$ó£#§!§A5ÓbÐlo™Ö2 j_­YT³È”t—t—tÃÁœƒ9s¬ý“•'+OV‚·ÙÛìmþi¥ü-þ ÔîªÝU»+]¯øƒâ ñ壛n˜Ü9¹t#ûböEÕ$èSíSí‰nµs`ÃÀ«íC×—]_¥¾R_©Êe²L´O´O´Ãè¼Ñy£ó `°`°`.•\*¹Tb<#ÏÈK»ÊŠPE¨J•*=îeëÊÖöf<0‘5‘5 ¢SdŠ$º%ñ7ÇVÇVÕÃ}Ã}ðßý¡ÆP#dÏȺuö”îY°g Ïž=<Û¾yøæá›°dÖ’YKfYûú„>¡C¿§ßÓïöâöâöbÈ™Ÿ3?g>ø4ߨo¢m#F@b]*ð^ÿýOwsOçžVMêOcÇÆŽu\¹²üÊr‘ožê¹×sÍ1lnl®L6VV‹8=NÓ#r¡îBÝ…:‘Î`g°3(²Â±Â±Â!Öý±ûc÷ÇD¼•ÞJo¥È9Û9Û9›ˆªWõª^$07ðdàIgoþWù_ÉdÓ_Î;ŒÍâêx±ãEãïÑMÑMW…w“]Û^ÛöLèÉ.¹ÿuø|ø<„mag؉ ÿ*\.‚ØÞØÞØ^™>2}d:hÕZµVmU,±8±8±†º†º†º@«Ñj´Ø:ðÊÀ+Ðw·Ïè3Pá?ß­º[ã·“<Ø6¹mØêÊd?Ys ̹ò`ŽÍQsÒ'ÓÖv¶³Ÿ±~ WnñLþæ˜ù8ðˆ_VW ‡áõW}X&Î)®q ÅÓR¼Êv¤q» 5’¬¿Å‡¥¾Ð Ý ®¾6²lKŸzo·ð­ŸøCû¯|h_í{ìá|Á~3H¸×‡IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-1.2.png 644 233 144 2427 13755454065 14746 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÌIDATHÇÍ–MLTWÇÏ€3‰ 441†)ÖnÊËǤ “hL”à×`ˆDM‹†j;«ÁÒ6ÕÔÄD+!5E% BA7ŠQÂB ¤b Õ'ò;u˜÷Þýu1óx?štÇÝÌœsÏùÿÿ÷ž{Ï»""²"þ+àIð$¤Äì„2ËïÚâÚòÙo1ûœŽŽ| ËÏ,?ZŸZo<¶lsÞŒ·ç‹Xøv>Ó/+Är$5%59|qûìY·gëã˜ýS¸›ÝÍkPÞZÞ h4ð5Ìøf|`Ùæ¼oæ›xv|9ö¿,m[ÚæxIÎ$§dlÎØ¼¦2ðç(ÚV´ àyâóD•ú°ŒeÊ„aŽI›mÎÇãÍ|ÏÄ7ùLþ˜´‚´ØQ²£Ä}1–ðøT§W§›|Ñf –Z–ÒBz©^JT—êÀ,Ûœ7ãÍ|ÏÄ7ùLþ˜YXÛ›Àïò»½¦ßÕï5F Q#ÙÈ7òQªWõ¨¬1Î8ã–©>Ué*´Ç(£WËÒ²ˆ‚þLÌÅñ•ßéwšOl²•RDäó:pÝÁдáÈpd+7T#•°Þ¥OéS@­´Ú½â¯l‚&Õ¤šp€¶¸i£ ÔŒ^¨žÇÿg84‚yþ¸ž¸°s÷ âHÅÅÈfFÑF@}§.ª‹±ý¸P~¡üB9 ä ä äY¼ú¸>®ÛvlhÕЪ¡Upjõ©Õ§VCï½k{×ZúÕxôIô Äed[ü1=qa½UÐ8Û8 ”¨¯@%ªD"ÚÚQí(ìíÙÛ³·Ç*|ÇÙŽ³gyg<Úðhã àÑ<šGßqßqßqðôô„îOºÓºÓæÃ#ÆÏ&_œ?®G åNÊÕÁœ`P·hÎ;—9— —3/g^΄Œ`F0#m·Ûn·Ý~WX‹·ÅÛâ…êÃÕ‡«[~ï wÐ;§ûO÷î³íô—æ¿8\@jrj²1“c“c¶kß®T¨FÕ¨- û7î߸FÀ–_Û¥íÒvÙJY:T:T ëëÖ×­¯_¥¯ÒW á“á“á“¶•,‰óÍóÇô$ˆ7ŒŽAm»¶]DtI“y*OE$Or%WæGt4:qGÀò¿ ½ ½ ‰ôg÷g÷g‹ä ä ä ˆ———‰\/¹^r½DÄÕëzèz("ϹÊUù+Îgò›zÞ9cÄkЋô""|„ —µÀg³À }}}ðºõuëëVÈoÏoÏo‡o·Æ î[î[î[»2weîJHiIiIi+¿_¹våšuÆô_>xÆ>p+ç´)m E¡¬[9{höÐì!ˆîŽîŽîÕ­ºU7LŸ:?uÂUáªpLTLTLTÀØÈØÈؼøæEÅ‹ xãx“þ&F­Q üúŸ·ÒÖÇÖ‡u[ÃØgì›ï;"üŸñVü¼­ß{ûØ{:?Ñûú=ý€QiTÅIY(.QO=0Ã4Ó ¦Õ´šŠñãuS5«fPÝjVÍ¢T“ž¬'å{½P/´ákþD¢¹S :ÿ¢ýV.Ú×Å¢}-Î쿪rm/@ÑIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-37.8.png 644 233 144 3013 13755454070 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÀIDATHÇÍ–_L”WÆ_Æ™ ¨X1Ru)¦UIÃ&6é ÐÚ’ˆA,’í¢I›%ØmlÍF›¨»XLg;ˆ)©boˆ2ÖELEMi°d!K`g†Mº¶àPê¬#SÇùó}ßùíÅðu&šìµçæËóþyž7ß9ï{Ž€ˆˆä.,,,«’ØòNÊn¯´W}‘ÄÝ:dÔfÔzÿ «?]ý)ÀšÞ5½ÆL ›~3>=_$ÅŸ®gÚ%WR[¿­?£b…ú—ë_¶¯Kâ“#àp <Ò ùRó%€‹Ÿ_üœ÷ p+p àAŃ HaÓoÆ›ù&_:¿}B_233þ¶,[–lzcÓ/ü1p種ª®˜[1·BY@ÿÈ!GUa˜ë~6ýËñf¾Égò›z¦~²¼ò¼rp68Ÿ%fúàƒç?xÞÔK Ç8Fha-  ¿­¿M Ôˆ ƒ HaÓoÆ›ù&ŸÉoê™úÉzR[ùxÔÍÖÍ‚ño€Ä¨æK¬K¬õžvT;JBýB!…(-¡=Òþ½Ao}•¾J_ªB•«rž\ÊHhk´5$´Ÿ‰P›’üP·X·„L}s+¯‹ˆlq#쇭ʘ>`'¨WÔ+DøW¹ 4ÓLsšdœ8ñ4!B$­"MiJ>âÇT¹*'¹eþ×—õ–õ™LÖ#,ˆˆt£ØïÜï4éŒßOÿ4Y=Y 'ož>9ŒºûÉÝλ0Ÿ=Ÿ=Ÿ ®€+à À™à™à™ œ···ï”ï”ïÔSŒé/¦û¦û ó/v~ˆúþ¸?ËŸ•ÒSW÷ÛöÛÌ­íþFôq‘ý ¾¼ðåøgÕ‚;ª)÷¯+·®ÜJ¬Ú_=Q=Ûò¶åm˃ގގÞ(»Qv£ìTÙ«ìUöTo÷¸{Ü=îTAã;ÇwŽï„ÂîÂîÂn¨Õkõa(ܲa|Ã81ÿÃ…› 7Ux¶x¶€ñN²1J²CÙ!Õ¿ý:__Û¾¶Áá×Ûm¸½òøÊc(((€ÉË“—'/§„{^£×€:O§ÎóôŸsŒ9Æ¿9sþfpnÝ­ÃK/º^tÁÄ¥ékÓ×^|xŒsvåìRýËTÖÆ¬‹#újôU‘7-e±²˜•j<Ô(â®p¿æ~M$æyc^{Ÿ½ÏÞ'’hO´'ÚEŽÌ™;2'ÒÚÞÚÞÚ.O­øÙøÙøY‘äQ¹~öú¹ëçD€"ŠDdõ¬— Hf 3 "¿³´XZ(¶ëâcñ± ¿DWw¬îùäZ×hרäÕkõßÕ'246464&¢Uj•Z¥È̉™3'D<OÀÉïÎïÎï)õ—úKý"Ñ–hK´Ed©f©f©FdÊ5åšr‰µµµŠx=žF‘Ì2‡3‡EníþöÁ·$OÄzÏzOD9u‹nÉð‹²™gìBé…R¸w(º#ºC5m³d¡dØÚÛk§ÖNsÐ9èLmQ 4ÇÛŽ·oKÙçNÏž; ÅÞbo±|VŸÕg…£Æ¨1 ÷‡\_®œoíŠîŠ žQïªwUôßî¿ ªmùŒ™]ÀðëkªKâ{\ñ¸3ŽüAé=zÞ“* ´7´7´"#‘‘ÈHÊn6‡á~×ý®û] ¶«íj;èz^‹K‹?.þˆÒÆ·Æ·¦ôðØx`cZWrù‰9v#9WÔg¿Í±&ÕDDe©çÔs B*¤Bi§{ûØ÷æØUPAÙÕzµ@íV»‰¨—’üêÎìÄì€cɱ¶ò•9ÇÌF™“wÏŠ=+€÷““Y]ÕBZ8­Ïëó$L=VbǼÏA¦v›YfA}¯¼Ê ,.ǟחô%jX jAàïæäßcÝc…”þo—ø3{W>³¯‹gö=öl¾`ÿa8Z…IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-66-grey.png 644 233 144 6271 13755454064 16010 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü nIDATXÃ…—yPT×—Ç¿÷¾×ô¶ ¨,¿ÖHÛ¤Mt@P£‘M—Žå;. ã SF+¸j‚F¥J“ &FCˆ?Ä`` [GÉXü¢åJdkPÔD”¥Yºî~ýîüA·¦2•ÊùçÖyï¼s>çÜóî;deeeeeA…aé^èlþÿˆβ¾Ëú.ë;˜ó"çE΋¹o3_æË|l‚„ !("Õ^n/·—³<Çq'™ÐA€F4¢@*R‘Êò¤ÉÒdi2ÉäŸóÏùç· ±Ë'EÙÙÙ—ær ¹Ò.„!BIævs©è+À˜´DÌsÄñg‡ÍasØÆDæTäTäT”´9ÚíŽöê L˜:05âcï£ÞG½â§ˆ„ˆ„ˆ’9M2M2MDúEúEúÝsßcïyÞãï•wUŸªŒÂ(Œ‚ÀBY( &4¡ €|àÀ +¬ÞÄ›x ͤ™4C@':Ñ ¾GÙ£ìQ¢õì—g¿<û¥°ºõzëõÖë|­—ÜKî%\)$ ÉBò»+ð.ÞÅ»Ïú©ü–ü–ü ”J?½6P9P9P9~F¯ÑkôÂÂCŠ!ÅÀתÔ*µJQb¢˜(&b†˜!f€ÇpÊ ¤€¤´‘6€t‘.ÒXKb_Û»d.™KŒ¼9òæÈ›åñ¯Y¢Y¢Y",ôÄ÷ðxø¨`¬‚5)ÒqÑqÑqÑðoþz½¿žiõßê¿ÕË{z¤O\&.—AIÃh èNº“îÈ rƒÜ`‚ &¿àü` –` €»¸‹»¯í¹!nˆدìWö+”ÿú+ú+ú+|‰ÿbÿÅþ‹™ÖÃãá£LÇtL·g©3ÆãŒboÇÞŽ½ÕiÕiÕix¹+¡¤ûè>ºš24eh ð@ý@ý@ 4ø6ø6ø®nW·«@4¢ à.à0´fhÍК?Ø+” J€™˜‰™VÈ Y!”ªÃªÃªÃðŠ}û ö<<>^Ð ZAæ[æ[æ[†¼°˜°˜°btg*Ð#ô=ôUöUöU…¦BS¡ è7öû€s‘s‘s0áã OøHA RôKû¥ýRÀÈy#ô—ö—ö—Îdg²3Ðê´:­X¿jýªõ«à¯°Ž°Ž°b¼Òy¥óJ'òl±¶X[lt¶÷nïÝÞ+æ•Ì,™Y2“yÄ&¤ ©Bê+•5–5–52–Oói>}}ÝRk©µÔ2öiħŸF0Ö~²ýdûIÆ~¬ÿ±þÇzÆ<|ððÁÿoŸ7=ozÞtÆZ'¶NlÈþ,6‡b?öc?ÑÑRZJK_e&¥2*£²W:ž_{~íù5À‡ÿÿÀÃÃPuµêjÕU`͉5'Öœ>ø ààqÜã¸ÇqÀè§£ŸŽ~ú{Y•¬J¬NZ´: ©©©Ä*±J¬úCü÷éûô}…(D!ÑQ.ˆ â‚Ø™¾¨¾¨¾(´8ÎFpä9FŽ ®\7¸è)è)è)žìz²ëÉ.€­cëØ:À²Ù²Ù²8©;©;©žíy¶çÙÀe²Fm{Ûö¶í}mßs¹çrÏeàDç‰Î@WeWeW%@“hMsƒr¶;¶;¶;h¡ª¡v†—””ò[ZZøoî7ÝoºßD2#u‘ºH½2¼2¼2 _•_•_Â&…M ›$¶&¶&¶öýöýöýÀþèýÑû£¶„¶„¶@¹^¹^¹ÐÄhb41@Òݤ»Iw{ˆ=Äì³o̾1@Ã̆™ 3Y f-˜µƒæåæåæåP˜­f«ÙŠÏe-²Y‹O¡‡úìã|ŸÅg‘LSš)Í”æÒtº Ý(¸p.œ G_1ÈdÌr³Ü,ÝIII€c’c’c¼3xgðN ðeàËÀ—€yžyžyÞì{;z;zWº+Ý•¨VªVªVÂî¾­¸¤¾¤¾¤g313 ˆ‹¸ˆëk/R0©`RÁ$àÅõ×_\/~jK³¥ÙÒÞW‡Î:ßµ-ucêÆÔ\~gdgdg$ìE?ýPô¤Ö^k¯µàùD>˜8%pJ °¬~Yý²z {D÷ˆî€±ÌXf,¬J«Òªøx>ž›ÛÛÁô½F¯9àüóÄÚÎÚÎÚNªP¼£xGñ΃Î g…³búd÷“ÝOv?p7qóÇ$/$/$/~–[«­ÕÖêñ)q[â¶Ämaq âÄ/ˆ'Wû—ö/í_ ÖòMË7-߀(³•ÙÊl`üçã?ÿ9@ïÐ;ô0æc>øÃg‹³ÅÙ°SPP@YYZYZYêÚfYlYlYÌóñññññ9«]§]§]wäJcvcvc6ù'šÑŒfá’gõFÚÐ&<ÄVlÅVRþöù·Ï¿}>±l£l£lãé\Ë8Ë8Ë8¾çlôÙè³Ñ®mîç”d™@&À\¾·Ü[î-6ä(u”:J·ö0ûaöÃl€™™™™1Òíæ”tÀ½–Š>¢èƒ‘÷~¿÷û½ßÇVÇVÇÖíŸyûzûzû>*m¬h¬h¬àò«Þ«z¯ê=GÒI:I‡T,‹Åb0È!‡ü ˆ@"`°ÃÜaî0ãtuxuxu8Fz·{·{·b”%FmÿŒ¢‡è¡gCô8=NsÇÜi&y>Ä“¹û—DêVÝÇ—jT£ÚµÌ 3ÈŒ¸ÅÿW.879797‰[V‰«ÄU"=ùÐäC“!YlÄ(èD:‘N„]È2…LH¿ ý*ô«P×›íÓÛ§·Oçšdá²pYxþÌá—&£V4ŠFÑÈsïìyv,77777}žŠÂ}Ásž¹Ç/×6wï#GÉQrôêEKcilFùðôA¿¨pV8+œÂ¦ž¢ž¢ž"((¥”Rôz*qyðòàåAqà™ñ™ñ™‘k’í’í’ízø“ý7ûoößviJlJlJÜ€Ïyêôð½ý°Ç@ávð¿îÞ½ðªwÓdi²´Ó¹– K%ˆï)Ë*Ë*ËrmsOô#ëüêüêüp²æVÍ­š[dµ¢AÑ hD¨5[~æWò+ù•ƒïh§i§i§Ñnw¼w¯ƒæâðÁ­Ö1/æÅ¼È¶¿ÕþVû[øÖ5Î5Î5î_‚T+ÕJµË¾xÿ2þe¼ßùžúžúžzvøÞ©{§îrͲ:­N«“Û*™-™-™ý‘š±"VôÃOB )׊nt£[ ö쀻PŸyþFþ¢wsP…*T¹²Y9+gå1Íô=GÏývhÑТ¡Eâ[£Ä(1Òz.…KáRL×CÏ…ž =77ÆÜln67“ÿLjcÄ1ìk·ß 7àÀ_qPüü©wÝÇ…+éHG:›ˆ®…²*VŪ>Y+Cþ†ü Zϵqm\ÛooˆÄâM¿7¬hXѰ„ÖíÏ3XþÇÿ ÷)~g! ¥IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.4.png 644 233 144 2713 13755454067 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü€IDATHÇÍ–ýO•eǯsåJØZý ŽÚÓ~à¥bvLj‹—Ó°i«¦! 'í5_hãeNZ0Œ6ø¡Rœ¦î´(Äps„^ܘKOÀ™ƒ¶ gp4<ÂÎñœóÜŸ~x¸}Nõxÿò캮ï}}¿Ïs?÷÷¾DDdùâSÀžeϲ§š±ým+ŸôbÒ‹O~iÆ=1°UØ*®6BÚ§iŸ¬8´â1fź®ññóE¬þñ|:/ËÅJ,ó,óØJãf¨zºêé¤GÍøc/8ú}óQ¨þ¶ú[€¯{¿îe'ܹ1p»äv X±®k¼ž¯ûÅ÷—æÿð‹@bb¿íwX¶tÙRÈqæ8ŸØe®=¯¼üÊË×®'(;Äf€RT $ˆ³q±®/âõ|ÝO÷×|šßÔ#ðÈó`?ûIh0ˆmm% Ê«¼Ø°ëºÆëùºŸî¯ù4¿©ÇZÊ€ˆHû àºåºê1€Èpt,’Éc4òGä"‹J•–¬ÞSnå#ËÈ2²°ÆsÌso¼e¼EDÕÇb`Ÿ:³;S;SQ£E£E£EüoLœ:9u.¸.¸.¸â kXÃPªCuÄáÏNý:õ+êBÕЦ¡MOíðìð7M=vµNDä™S¶M¥=¥="¾¡ÝøÈ–ïôo¼¸ñ¢Ü;ýúém§·‰­ÜWî+÷‰Œ Ž Ž Êý±ýæö›ÛoŠ4•6•6•ZyeS6e‘I™”I+_í¬~¼úq±5•4Ï5ÏÉ=3kËW»Ÿ}vVD®™z$v9¹3¹Sy`!¼†oééÐPW¿®~õ¦«/­¾´ú   @¯½×Þk·Ì¦òlåÙʳ>|0|0|ЊÛ÷¶ïmß rXÉ!¨üªÂ]á¶êFÅõý×÷×R?KýLy„è Ç ‡ñ›zfËÌkÛOlß8¾òòò lCÙ†² àIô$z!ß›ïÍ÷Ânïnïn/fffþ©ÏÔ©;Skkk°çüžó{ÎCafÁ’‚%Ÿº5seæ ж¼{y·ñ›'RjRj”þþóï?áJÛD×D<”‘4™4 M6565ZDúôèǘcÌ19…9…9…Ö—ë^Ù½²{%DÜwÄ -—[.·\†ä¤ä¤ä$È)Ï)Ë)³ð_<|4ãh@p&8±Ÿ“Û’Û”G¢é""£õ0˜7˜ŸïkèkPÛì#""„×o]_±¾ÒjÓjÓjá°qØ8lXB;wvîìÜ Î)ç”s Œ@äºsݹnðWú+ý•¾«§«£«ž»ZÔPÔ ÷­ÚÆÊã Ç€wM=ÂÇæ.€w>xçEÍ]ò×OÓCÓC00=š®›®™®Pq¨8Tl…Ž…Ž…ŽÁñ;ãwÆÍlf3̶ζζ‚‘j¤©qøh(  îlº-·%nWž«±×صáöü Ú7,Yô1í3Q•­²ïûœà'@ «a5l aœqÆ}ìc_ÜOÖJ+­ †ÕêG`³±ËØÅc‹ý›üßû¿ó±¿þåcúhW½«ÔQÓ™Õ/±”X (Oônô.Z9Å)ËùùFtÒIîšg¥šPWÕUÀwßùkZ"4Ç.Æ.Kµó¿šðjpï¿Îÿàž•ìíâ½=˜7ØTÈ ¨­Ö8IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-25.6.png 644 233 144 3062 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜçIDATHÇÍ–ýO”WÇï ÊK‡u¨ÑÖLÍÆ*Øf}Mhš±Ò¨)Õˆ­ " µÙÆBZBY£5—VßJ„H„1‘Ö]¶‰«‘àÛ²J¡ÅÝ!ËhÀ}fæ™óÙfžÎ¬ûxyò½çœï÷äÞç~ïU ”R*>øU± bAÄo8¢04½>zýkg¸NS¶)ûÇ ˜ýõì¯朜sÒÿSq#?¼^©¸ž1¯âUh"ª%ªÅ´6ˆ+aKê–ÔèßðWW ¦-¦mÊ».ìºÐzºõ4Ã÷OÖ>Y !lÄ|£Þà çW•Ïé+3Ûg¶›îCÔ¬¨YJÁ«ï¾ú®õ„[!+3+à—¿ÌÐf̲pãÆ#a؈ózƒÏà7ô ý@? ’lI6¥`ÓÖM[cN ~j„Òù¥ó =op€˜Áçö¹ôôÐ@®ÈL˜ „¸‘oÔ|¿¡gèú må¨RJU¥CÎXÎH2€÷š¯Ç›èMÿ€×íuãeÑËõR½ô%úëúë çéyzI>i‹Ó§-†¬/³¾Èú~¿u™g™íNÃâÅRŽGŽGà_èGéÿ|Éþ’]Z`Z›ÖÀ1û»—¿{J?)YQ²"$°ê̪3«Î@nmnmn-Xz,=–XïXïXï€SS§¦NM::z¨®±¢±¢±’W&¯L^ {jöT渚ÏÏöégŸÂXüä¼ÉyÓÓ â¾ûVZ"f¤Ì*ŸUÎRʦ ¦ ”Úô4ãaÆC5Z8V˜P˜ Tjrjrj²R–&K“¥I©üêüêüj¥²·eoËÞ¦TþTþTþ”RûÖì[³oRg/Ÿ½|ö²úuhµÚF¥¢MѦh“R)?§ô§ô+uÎÎzΪTg}§Þ©«Q¥âã•’™*Gå°Tù›ÍEæ"iñ¡ñ!è9Ô_Û_ ±–èè¨ü[eGeGÐÜp±íbÛÅ6(›(›(›­ÌjY-«ì ö{ÐL3Íд¿iÓ~H™L™L™ å¿YñÆ;o¼G³³xŽxŽ€Oý!öiQ¾Dã»´ôÒR8çp:œRÑ©”Rh+"—{—{!)/)/)ªNT¨:ëüëüëü`N7§›Óa§¶SÛ©Á@ß@ß@,Ù»dï’½0”8”8”;êwÔ輻XOìxì8lî{¯ì½2´§ÿh‰i‰i þc|8P\V\ÿ霒á.W‡«\3\¯¸^A\+\©®TÐlšM³^¬ëÅ0|~øüðy«XÅ b‹X`Ä>b±ƒÿ–ÿ–ÿH³4K3Œ|>òÑÈGˆþ¥çmÏÛa§²¿ÈZd5 ·îjÐ.B>†¯}fJ,baúW§¼-·å6ÈÙ Ât‘,’EÀ\æ27Ì'¶°™ÍàwK¤DHš¤1-[%CžÝë¾× ó4æ©;’ËÿãcÆ P•ΟrJrJ@Î,7t³niòûÆñRO]§9ÎqKò½|´ÑFð„1Æ@úäŽÜú¦ÃåÂ+W}¾ à˜áüïG¾ hÏ;ÿ‹{W¾°¯‹ö=öb¾`ÿ @ˆ(•2SIIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-38.9.png 644 233 144 3111 13755454070 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜþIDATHÇÍ–ÿOUçÇ?÷r/„ªTÖN"60[/*1µ$xÓ!® _‚ “*Mf×´¡YL\±ÙÂØN…ƒ꺒PKêh0Zl°…‰ë¦°¬ŠÖVðÚ Âî…{Ï=Ïk?\Nñ/ðüròþ|y¿?çM´rSLa<îyØÈÏÕýŸÁoèú¡yb7Æn¢²¢²È÷C ƒƒ×—½¾ÌÐ ´G8B4hSÚ@°³~Uý*Ô«#cê©[{{ÆÒžøR‚ÿùÏoá왳gàJÞõ¸ëqªbñžHz"‰ÙÂM… 7€³ÐYè,„–º–º–:pâÄ eeeAÂê„Õ «¡Kÿ–þ-ó>` w w***!ãXFMF ¬Ü³"|E8³w_ò-õ-Upæè™£ ¡yD_55¡Z`º}ºÎëŽN¼õbUdU$´U·½Ýö6dîÎܹSSS!±'±'±êGëGëGaåàÊÁ•ƒpY¿¬_ÖÍÁêªêªêª óNæÌ;f<ͽöìÚ³ð×oÞ»ñÞ ÿþ/@ .èXСZlÖÞðåáËY%‘3£3£Ù4“=›=+^ذfÿšý»}Yi|i¼ˆ…ÿYÿ³"zºž®§‹Ì&Ï&Ï&‹t4w4w4‹Fi"VŸÕgõ‰H´DK´H~ ?9UuªêT•H~\~\~œÈ@çÀNjؿµ½l{Yˆ'ì°7$Öb [¶”UŒ]п _µ€ÿMÿ›ð—óǾ:ölz+Ç•ã2¿0£$£$£Öµ¯k_×¹÷rïåÞ3ó) ) ) PSZSZS †@C º"º"º"`ÛŽm;¶í€_ƒ·Á ?_÷”ÿ)?\˜ì t¦_~‚w£>ŒúPµX­Ó¾_ʵ+"mÝmÝ"Û/V®8Ì+?þûþG÷?ÿ’þ%_/ùZ$~$~$~D¤ÕÞjoµ‹ØÛۋĄDŽDŽ‹$÷$÷$÷ˆlžÜ<¹yRd½e½e½E$jWÔ®¨]">·Ïís‹T¯©~®ú9‘/”?Yþ¤øseÛ³í¼"ýmeme"aÞÞ×®ˆ± ø|ŸmŸÍÜ%þ?ú\>Œ;ÆfÆfPÁæ`s°ÙüCZV À¸wÜ;î]tÑÔu@w™»Ì]²[u üýçýça,m,{,¥f´çµçM=<ûöìÛès»’<âcC¾¢ÞÿÉÇÊT^•­òTè7õ›úMP.åRó–Z9•S9Aõ©>Õ7Ïߢpàõ+õšz @×Çñªåsü¿~8ü r,rlÊÆ·†Î?k8ïÖ°­aÀÁ3«sÚ„64ïïšÎÏ ê©õ¹º .'9ÉI`Pýꚺ6wz‚âÏÁ[Á[T·6¦=†óoµmµGÿñ=+ÛÛÅc{{ÙÙÙèÛ¾¢cEÇŠêM°$X,dµ<_ž/χoá-¼%œp àU¼ŠW<ŽÇñ8œîYîYîYXmi²4Yš¸÷lÜÙ¸³qlûгCÏ=ûòGJR£Ô,Vø²}Ù¾ìåû¸¸áæFšF ]…®B€&4¡iÖc’:I¤®é˜gÜ3îâyíRíRíR15óÍÌ73ß” s„9ÂÐb¦aDÃcx $èD':„ !F1ŠQ±ˆE,@ºH邈{¸‡{ØUv•]…žÚOj?©ýDÜØs±çbÏEÉY,HôÛi1CÌ3–¬Ç,Á’¾û4¨%¨%¨FI£¤Qï^pžvžvž~âym¦6S›)®6d² Y’+aB˜&`a#làÙ<›gC‚µX‹µ"Cd 6b#6€¬!kÈ€Ÿççùy€½ÃÞaï@"^/‹—Ð7Bß}Óþµk´k´kÄÕøž)i(i(iXµÐÓâiñ´œnQÝWÝWÝçÑ›ú6õmê#-aÕaÕaÕ <’GòH¨°ë° ½¤—ô¨G=ê¸á†€rÈ¸à‚ € (ð¨%"‰~Á/ø{ª=Õž Vù\ås•Ïñd‡Ì!sȈU–,K–%?ŸLyãq»×zu^Wè¯ê¯ê¯b…PÆšY3k† ßã{|OɧäS k¸k¸k¸P~¡üBù€~s¼ëx×ñ.p}Æõ×g–BK¡¥¸þäõ'¯? üºà׿.Üz·Þ­‡*ìJØ•°+é tº¬ðø¨-F‹ÑÙ~/ü^ø=¼?O7O7OGŒþx2šBSh R‘аùl>›0w›»ÍÝ@g]g]gÝ£ ³UØ*l@åâÊÅ•‹š±š±š1àXã±Æc@ÍÞš½5{×®]?NN“Í3Ï3Ï3c€'À‡]#»Fv°÷,>²øÈb°1ñ¬xV<;yÏ;{:{:{8/4 œçóŒyFÎÎ>:ûèlþˆýñCÄœ///=0°š¯æ«9gVfeVÎÙOì'öçì öûb*~€'ÀGQ†2”‘8zœ§Ç'W&'KÉR²t*CƒÆ 1{ªöTí©⿉ÿ&þÀ™îLw¦ÿ?õÚ¼6/000˜6›6›6&Á$˜ SÝ©îT$…¤€òQ>:Ÿ¾B_¡¯¨D%*IÔ‚ZPóŽGŠ#Ýâq‡¸í ´_ãk| ­B«Ð:B’ƒä À+y%¯|Tò¶ämÉÛ@ddd?2-eZÊ4 ¤$¤$¤øüþç÷?¿ ´ ´ ´4—æÒ\pÿtaìêØÕ±«è¦Zª¥Z~B¢øPñ¡âC±¢{f÷Ìî™’Ï[M­¦VÉOÚ›´7i/ÆY<‹gñP’Q2JF iCÚ¤#d”f‡Ùa`¥a¥a¥PnPnPn¤ßI¿“~<ûtìÓ±@{l{l{,ÐóXÏc=ê£ê£ê£·n´n´n„Ò:l¶ã¿ÝŠnE·XA‘‰LdWIŠ$E’"’&âLÄ™ŸÖþŒýû3PRJ)¥pðTžÊS§€èNº“ª©zê9å¡<0•™ÊLeÀ¹¼syçò¦ÆÃÃßާ÷éˆ-["¶ÀíV~«ùV󭆥+±+>%>â#¾Ïd4ê|Ôù¨óïÈô2½LÿeßС…C …žÚµ;jwø¶ù¨øZ¾–¯tw¯»×Ý ¸ò\y®@„ !CÈ–½¸ìÅe/µµµÀîÄ݉»ãkÆ×Œ¯iÒ¤O‹O‹Oƒü”æ”æ”†9û#û#û#éÙDze__ïµym^Ûv/)ì-ì-ìÐŒf4ÿÇ~éméméíKA£æQó¨ù Ãò åA˃ø²U5«jVÕóÄýÖü[óoÍ LÇtLhZ§Ö 1ˆÐ….tCmCmCm@o{o{o;jµ‡Úm¶6[› gë¡ÖC­‡°®Z_­¯Öã[¥B©P*\Ïr \HZ‡¹˜‹¹76SZE«h•ÐBËi9-¿õÖźXW¶GÙ¤lR6MÚ&m“–?mÙiÙiÙ‰¯ü ãsræäÌÉyÐ /¼S€ÜÍÝÜ DÊ#å‘r`AÙ‚²e“€ÇÇÇ(ë}õ¾zŸ¨•M—M—MÈ]r—Ü-`dYDÝØŒ T B2Ëßæù’'úFÉn²ì#ûÎçR=ÕSýö:`€0{̳G̱··‡’üL~&?ÃÁN°ì)¤N¥DNäDð;ü¿°él:›>)ÕéúÓõ§ë}Û†­ÃÖa«d¿\%WÉU_•ÆVÄVÄV|tÅ(F196±pqy  † 6ØÄ6lÅVl%uOzêÔS§*þ¦Ø¤Ø¤ØôUépÔpÔp”Ä^;T;T;4¥Ý‰ À ,°```T‡%X‚%à´6ÐÈ/[/[/[ù²f4£BE°2X¬ìsyŽyŽyŽíz¯­¸­¸­àVnåV„ú½ €:ý×ã,„…°„^ë¿Ö­ðlõlõlÝõ^pxpxpøÍãæs‡Y¨hx©á¥†—ø2’KrI.䬚U³jp!Aá#| "‰ˆñ»Ö»Ö»V|Õ8¿q~ã|„,…¥°”]ïMH¯Ïå—â~ÿ§°jò ,ÜÿKh+ü[$T hôm#©$•¤.ûÛÄ/ǹzs¼9Þ¶åeö2{™Ñô„ò„ò„rd°vÖÎÚ¡¤sé\:n1_Ìó!?s0æ`Œ/vpÑà¢ÁEB§b¾b¾b~Åâ‰fûfdFf”ì÷ïì?;VZZZZZ G £ð?˜Ô_»ÛüÚÝï×î×h×köš½bŽÝd7ÙM“uw$‰3ãgÆÏŒ3gŸ±ÏØg:ŠEA[½û–û–ûVÁG+;Wv®ü€Ú@= NÖ퇾‡^Púüà×î?Ñ®zX=¬–ØkŠjŠjŠ|Ûü}¨%Âa‰ÀM-M-M-d£²]Ù®l˜–i™vË%ÉÉɆñÿŒNŽNŽN¦¿ûãýW ª<Ì%àL§Óét:ˆþ[ —q—‘7ãããñ?¾Ù¾Ù¾ÙÿåÑòhyô‹î,¿³üÎòˆSööö|ïµC×];äKõŽzG½ÂViº4]š¾c7q7­Ÿè_…üŽßñ;{<°þD‰óü‰ývKЀ4øŠy¯ãuº.z’ž¤'¿v½àzÁõ‹—¥F©‘Þ ‚A0œ½s2ædÌÉ¿ê¬]Ö.kù_6ƒÍ`3øg~¿f? ó8(þÄÒ®¿\øŠ‘‹\äJþM²HɺÃxoÈ{5hNМ 9ô†`l‚íÖöû€}Óß¾¾}}ûz`Ñ~ÆrüÏ8þK@ ÂÁ°ÏIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-17.png 644 233 144 2270 13755454064 14670 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜmIDATHÇÍ–[hTW†×“Ø$HñAC‚©¡V‚">8¥*x‰ ^‘±õ‚¥ˆÔ7+˜Š m@RA Z«tAˆŠÄŽ£Ö>„Í$H%‰FcðÃÐXgÎ>ûëÙ}ÎѪ¥oY/úýÿöeÍ‘é¹_«Ì*³Š]ßúÂç¯È_QÙêúÇ„êBu|ÓŽN; Prªä”Óëû&oêƒý">~ÏÄeºøð¹ð¹P$ç7ÂÆyçåèúß' à|Áù¿lØvqÛE€öÓí§ù†oߌFÀ÷MÞÔ›~ƒÄ—Æ7øE /ž @xJxŠ”/+_6û+·àÏÙP³ªfÀФ¡IÚõ(¤PG€4iŒ= ø&Ÿ«7ýÏà>Ãïê(]ZºTjëkë ~tz†½³öÎ2|ÙóÀ!QvÚN¨Mj¯@'t€!ð}“7õ¦ßà|Ãgø]=òúÞ6}ëó×ç{‚n Õuu°ÍÎf²¹„V¨ŒÊ0•© ÑhÀþÛ~i¿Õ 6¨  ŠÕ"µ­?µ[íV² 倻ªÙ>Ÿá—  š¡`¸`8= °X ÎgãüB?ý ªCuW¸Â|³±s=oÚ+^]'êDÏ9+=>ßÕ“vü:ìØ¿c¿×ü±·£î éoõ>½Ï‡oii¾þ¾þ¾~xÜù¸óq'4h>Ð|N<;ñìÄ3ˆ…cáXz~êiéiñÚµþ-Û‘íò~WONX××Ð6Ö6æõme» «°ÿ­öaû°}n7Ün¸í€dW²+ÙwjîÔÜ©êÒêÒêRX}kõ­Õ·üº“ƒ'Oú¦nd¶g¶|½Õçwõ_+¾¦ÏÁð‚áÿA×ëzßÍTeª2UpvîÙ¹gçBùHùHùÄ/Ä/Ä/ü{ÿΔ);SëbëbëbÄC†¾Óuº.Øaø]=%E%EN ž>|ú0xíõý¸Ìe.ƒnÓmºÍ‡Y\»¸vq-´GÚ#í?þüÈó#Ï@Å£ŠG Y•¬JVNX«Óê´‚‡ïñ~W%â\r.…R"öZ{­+%}Ò'"V.R-ÕRíå%[™­ÌVŠ8=NÓãÇc‘X$™ypæÁ™E–¤–¤–¤Dô}}_ß±>±æ[óE$+)Iø<~W%’ޤ#Ý¿‹üzõ׫¦ŽÏe²Ôƒ’‘—2*£"¡…¡…¡…¾€¢Þ¢Þ¢^‘¼y;óvúñDw¢;Ñ-²&º&º&êÇeŽÌ‘9"R!3d†ˆLÑôÉx|NÏÞÊŒ{:yÀ=îù[2Ö4Ö4Ö™ÆLc¦Ñ¿Xþbù‹å0>0>0>8Bĉ*‡çÞ÷ÝÊ·Ì1oμ6wÞ2—Þa»ØÅ®·Õÿ¯9öžÉJª$à8[œ-þä'Œ…çǼERìe7»½¨&ëD(YÏÃç䟰ÿ•öu1aßcóû/º>GÛ¸˜gIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-47-red.png 644 233 144 4141 13755454064 15605 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXíWLÓg¾¿ (в¢¶§FO=!=¹s9ù±‰ÅL²nbFg4sFDV·e8"H lz9–áÜÈ<³1hq·‘ÛÝt='cÉM͹L7bÜläC¤b¥ôûíû¹?èûí·ÍMs¹{þiŸ÷ùõéó|ž÷M‰¦dʼn¸>Ù•ìJv w£©I=I=I=E¿•5Y“µ‹ïÐ*ZE«€)3k!™d’¹Ä묅ûóxžç¯'®ÇcÄWMÕT-:ãís—Ë=rÜãö û„}:´ô±ô±ô1üµôjéÕÒ«@ùõòëåײܲܲܘÎíÜŸÇó|^_ü†xG¼#Þñ­âZ`_`_`מoïoïoïgÓ···H !ˆqŒc€>ø]Ú¹?çùxþøz‹ß¸?>2χÄ!qÈ÷7ž ·/·/·Oý'ì {Âð *,‹e±,¨ZV§ÕÚjmµ¶ÐlšM³ô¨ûóxžç×ÇÕ7ÏС NÁ)8‰ä&¹Inêø†X[¬-ÖÕ¦{ígûP;Ôê €ùLj×´kÀgˆð­F«0©ej™ó©kÔ5€Ú1Ñ9Ñ °"9‘¸·µÅZk­Um¼>ÇÃñ‘2¨ *ƒ~ÃÌæFs#[â½é½é½‰ÛÑ<í5­Ak@LQ`Àa†QÔXߌþñªöÛÁvĬޛÞÞ¸mn4¿n~-áxt|r•\%Wk↣•G+V²g£ ‚ªSmWÛ B‘žH±¤ûe÷Ëpµüj¹ñüdéÉRèÚÞµœ_8¿r&9“ ëû®ïÕùõ̯gêAÁ£•m Û²gõÎÆá#æOÏLÏLÏDËHÑHÑH‘¡;” @@Û¦m‹xÑ}˜ºàÍõo®7Ú-/Z^4ÚEI”`ÚwÓ¾ˆž[œ?p>Vo¤høÊð€ãáø8ÐW7ÞtxSl„AÍ£ù5??›ÃæxŸö> ‹*U´ïjßeô»[u· n÷Ýî3ž¿Zÿj=¬È\‘ À?rvä, yŒ>r<Ÿ]©åJ¡R¨ê;–L;q§‰è°0l¼Êž+{Žˆhéù¥ç‰ˆL7L7ˆˆ‚6ú%mHÚ@D4+V>‘§ÆSCDtàøãDD¥¥DdJ/H/ ¢wÃMá¦X}¥[éVºõ•_Š?õõõ“'$Nø'ü$I»…'„'´#ê{gï3{Ÿ!"šùíÌo‰ˆœŸ9?#" «a•ˆÈô¹és#P6ÆÆŒzýôúéDDÅWНÑäææÍÍDô#»Ä.‰+õJ=E;H’ßç÷ù}äáøH´‰6ÑŽöŒµü©úøìã³ 0ýtù§Ë`ZdZ ´,°,6Í´”–€%Å’o·¼Ýbœâ€gÀc ˆúɧŸ|jØþ““}“1jÏ9søŒ>rì²…l!;+Ÿ•Ïvé~™5Çš£Õðl{½‡\ü·Ž—©-½-ÿAÖ¦¬MxlÍck~3GÞ ›Â¦©7ììì"AàNi§´óò–)=ÅOñ² MÉV²”,ßqà¨s´;ÚY~Ìžxâ}0@{H{@àÑG` y Ù0Â" @裺êàÒ¬K³­2~»»îtu¡DB›Åf±y¢H˜'Ìæýº= ôO}¿¶ Û„m:…N¡“s%²Çåv¹]îX?µšèÉ%„BAƒfP Ø 6CWCC }XL–dK²Z¥w²AjVšld“Í1¬y”Gyr9ÉIN"É/ù%ÿóëOë1s›¹MMó¾ä=è=+È Â_…¿ö${ЇÄ0†¸´­`[´b­8öS¶žßêÞêÖjôh\—Ç]‡2öfìÍØK$ZE«hNFÑUr˜Ó£Ÿ[¤kÒ5éšÐ»dÿ’ýKö)vÅ®Ø]‡tîæYó¬yFîFBpÁ€QŒbÔ°ÕË´eÚ²[sZsZsXϧ¤)iJÚÐÄ”n6ÅOZ8•0zÔ/ãu³IÉV²•lïIwëuijZ PäFäFäFŒ‹ÀàJHH`¥:'SÅT1õ©ƒ TlKÀ—L÷?Z¸[ú îªnÕ­ºc̽—q/ã^°rlåØÊ1íW:»¥n©ûë8Õ¢ÔK8“ 1žàç¸{Ä|Ä|DMóvz;½úRq¤Ž^G¯£7víÈÇäcò±è_’”$ÔžÓ´LðT”»ù9îæoÌߘ¿1Æ]×:×:×:¼;egú$„ ¡B¨x´6¾Œ8šPW ÿRÄÝõR³Ô,5ûVsÀìY“Y“Y“ê%}Ô~É/ù ¨ƒ:¨ƒ¢×ŽäM¨—Lÿ£$r÷P¼žÿ£°]Ø.l¨˜Š©8²Bœ/Îç $Ðß¿´-AKH:'“Î §£[&÷“4ý[!R¡üM¼ù¥J‘‰Ld€pJ8%œú×/§Î—º&ãIÈûÀQÿÍUIŸ1"u‡IEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-loop.png 644 233 144 262 12610450027 16105 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.1/web/www/routino/icons/limit-1.0.png 644 233 144 2431 13755454065 14737 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÎIDATHÇÍ–]HTiÇŸwüˆYSi úPhX]«?®•Š 6û’"ˆ¥¡‹%k3¢‹ [’¶`#!B“B¶ Ð5Wvª‹m´/6 …©\ÉpBg ?š9ïo/fŽç´®÷¾7çüŸ÷yþÿ?ï{Þç¼""’“z ¸×º×º³“Ø}ØŽgnÍÜúå¯I|Õ×n×îg`ù•åWr[s[Í![óV¾³^ÄæwêYqÉ;q'㎫2…ÏÁ¾õûÖg~‘Ä?÷@VGVÇŒþN'@ûö|á§á§*?T‚­y+ߪ·øœürî?ú"àéöt»F #=#] ¶lYw4™ðjTm¯Úð6ímšr€1xñªJ F kDØšOå[õŸÅoéYúI?+*VTˆÀ®š]5YדCmprÍÉ5–žÖ4Òˆô˜0ˆƒêQ=¸p­y+ߪ·ø,~KÏÒOú‘O÷öâf¨Î¬Î€öÝA³Ál@3?7ËÍr”z¦úTöxÇ;ÞÙPmQªô7Æ2cJý ¿Ð_ 1eL³)~ª3ª3,ƒ7;¶RDä«ËÎ Ç>CÅCñyþmünæš¹Ì=FÔˆ:étšfši.¢ˆ"`%+YéˆSC Ph\0.$mÛøš ÍÀ¼~ÊOÊØÕ^8R¤Þb1¿áƒþFêGu]]O®@³¿Ùß쇲²2[ט1fŒ¿lxÙð²šòšòšò`dp¤¤ß^Põ6  8ôæõ“~RÆžÕÁ­É[“Àaõ¨4•F\ÿI?«Ÿ…ý}ûûö÷Ùh 4šX0"ç#ç#硤¸¤¸¤666Àô}A˜Ø>Q9Q9ŸWí–^J?åG ûQö#uÂ%áàò§B‰¢Da¢nÞ.¼]á‚pAºv?ì~¸ÐXKGKGK”ï)ßS¾ÇŽ—¾/}_ú®µ\k¾ÖìXéo­·”~Ê[$­*­Š¯E<÷<÷D¤VDD¢ò7¹)â9ã©÷Ô‹Ô Õ Õ ‰¬>½úôêÓ"‰M‰M‰M²`$< OÂ#âmó¶yÛìxöÝì»ÙwEâ¯â¯ã¯Sz–~Ê[Äì2»\ƒ"úN}§ˆ""²BÜ2,Ã"R&¥Rjóh£Ú¨6*âjwµ»Úíøxþxþx¾HþTþTþ”ÈXíXíX­HdGdGd‡HL‹i1MÄ÷Ä÷Ø÷Ø®sýÒ³ô-? ¾1R{ÞnTUÄÉ#“L{é+Ò+Ò+Òá~ÿýþûý0§ÍisøNøNøNÀت±Uc«Àßèoô7‚7Ç›ãÍSu§êNÕ97Ý!âü²è7¶È©LèQ= Œ¢Pö©œ<>y|ò8h{µ½Ú^À7D.E.E.yÈÁ4z^ó¨yt6²E­´ÓÉ£Tƒj3Æð'xê/5«fQüfæš¹h`<7žFŠ^oAç_²ÿÊ%{»X²÷±¥yƒýìµ$h}Ø0'IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-4.7.png 644 233 144 2334 13755454066 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü‘IDATHÇÍ–_HTYǶ5¨%ÑVŒdKT½„Fäêl`æd ›±`+‹[/ÕE´…kÄ&nS&k=(FPú¨ë:õ¶K ë$[S”ú°3äè(cÞsÏgæž¹·lƒ}ó¼\¾¿s~¿ï÷Þߟ{!„Xf=¤¯M_›žÄéßÚöŒ;óï$ñu i{ÓöþK—6äÜʹeÛXïëóN!ìøN>mË„mpµ¹ÚÒŠ-|öoÚ¿)cEÿÔî{î{ÓÔܯ¹Ðq»ã6ßÁøãñÇo‹ßƒõ¾>¯ýuÍŸÔ#ÞÏmC)ìËØ—‘dRvÊN³Ãì`NS@™kÍ•æJæ-õ›êU½ ¦a‚üZž—çQ2ûÝÑwG™S_.Ãåˆ÷>C l(u¤R!¾øÜãîñ©Ï`DŽH`€20/™—˜¡j@}£üÊïP2Í4Ó|jÍZ±¬e21c²_Š?©Çvýw8rúÈi@˜`†êÕ©:“V€pW¸+ܽ¾^_¯o¾Špn87œ ………p#z#z# ­®VÑ*`¨y¨{¨Ûާ4ŸÅo鱄ýq îÆîÆ ù.ªšY"K˜U×ÕeuÙ&.1JŒ¶¶¶æ ë¯î¯î¯†­•[+·VÂî'»Ÿì~bLàU`80lMÙmñi~K€ì¾ì>Õã[Æ·Q«âÆ#ã‘MØP×P×P¢Y4‹f¨èªèªè²÷€0 _Ë×òµmoYݲºe5øZ}­¾VÇŒª6ÕÔkƒÅoé“•“eþ‘ÑÈ(˜y©¶àÁóÏ<‡o·À 'ºOtŸè†¢UE«ŠV9Š~£Ú¨6Ú8ÖkµCÞXÞXÞ lØ0°ÁQiwäy%#š_ë™÷ÅdÙû©©÷ר?î¸;Çïñ{üvjš‚MÁ¦ Œ={6öÌö»–y-óZ&m.Ú\´Ù!è•ùÒ| „ÔMux÷Ÿ_ìƒûSçܬ2«˜M|•Ø–Øxðà«Á«Á«Að†½ao¢¥ÑÒh)¬¯]_»¾âƒñÁø T©:Su.V\¬¸Xá¶DJ)„l’Mº_?Zct%©®LÆNžòÔî¢ Àdh24*©¤"Å‘âH1¨ê…z±üX~,fzfzfz)èf˜aÒ˜0&œ|íJÇ3FfGì¹SÆrTŽ2£‚jBM(§"œå,gĉtàZsØYÿkŽ}bòÏÉ>Ù`ž4O2Ç9ÚiG‘KY@<ùoTCjH 1&˜>g+€ï @yÊ<ŜϊŸâ›7ùì¿rÁÞ.ì}laÞ`ÿ+¿²8ªÐIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-36-grey.png 644 233 144 6276 13755454064 16012 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü sIDATXÃ…—PSWÇ¿÷&!!@È(¸´…ÀZ´­â‚ÔJ@í ;¢ îø£2ZaÕÕíàZ´Zœn±#âhií¨mê"‚F‰h×Á’Ph Í~$/ïî$0ãL§çŸ;÷½ûÎùÜs¾ïÝóHnnnnn.ä7óø@Ÿ Ÿ Ÿ2mî¹?äþÀ‚óûóûóûÏd,€þ'Â…p!s²ÆjÇjÇjY!Nã4N“½ˆF4¢t£ݲ…,V(N§ŠSÉ^ásásáóÖÓÄDLÄ”s*oZÞ´¼i  2 2 2ˆ‘ ç¹p’2ÎÁßqsÉé`<âOÏóù|>ŸÏßqØv‡}êÜ|M¾&_s¾ÇatÆú{Ãï ¿3üΜO|Žû÷9ŽksÍY4gÙ+ŠÅŠ€¹sçž¹ç¾g½çy¿ ÿîxžøŸÐÁ÷˜ŒÉ˜Œ_G6‘MdSøqA¸ \~ã;ûöí?†N©ŸR?¥ÞµkQ÷¢îEÝÔÓÓÓI–‰÷Š÷Š÷bû°û Å0†1 `6`€é˜Žé   ŲΦΦÎ&ælŒnŒnŒæw .\2¸díQi¸4\>_âÚäÚäÚ”|œe²L–ùt}=0z`@šÐê'¬Ö k›.8F#Ž‘°¥Š…Š…Š…\|úöôíéÛ…çåV¹Un…AB8É"Y$„x„GxÀ¾ð`ƒ 6QˆB@ôDOôà0€ @h–™efžT•T•T•pëžÜ~rûÉma³—·—·—÷³:.•KåRß_÷ñ>Þï¢Þ:o·‹‚EÁÿ¹5\7\7\¶T‘¦HS¤qË232323„Íò)ò)ò)r]v]v]ø•üJ~%„ µ¤–Ô¤‡ô€ ’A2QÀïâwñ» tI\—ðoñoñoAÇ¿b¥b¥b%·ÌßÃãá#ùÚ|m¾6e®CçÐ9tu:ÙlH6Ä”›û6÷mî#:¹Z®–«Aùd>™O†Œ6ÐÚ€I£  ÀøÎœÅYœ°;°€:Ô¡nò1þ‰¿Ð4šFÓ`5ï6ï6ï_FÊHa±Ök€5€¼b½b½b—ÆRÍ¢YôÁ¿;‰ÎD@ÕªjUµb‘ЋOçÓùtÈè zƒÞ^Ô¼¨yQ´¶¶úf}³¾à‹ùb¾@"à ®à 0º~týèz #´#´#è’uɺdkd¬`e¬Œ•A&/’É‹à¥êPu¨:°ÈÃãárJNÉ)ÿº9 2 2 …³T³T³T¤/ð/ÀÑ*ZE«€Ž+W:®å-å-å-€/õ¥¾°/±/±/b¦ÄL‰™¬y¶æÙšg€õ[ë·Öo²£eGËŽC¥C¥C¥€3Õ™êL”ÑÊhe4ðÑÚÖ~´v"Ñ^³^Îz9ë%)½1pcàÆ í*»Ê®úëfì±ì±ì±ð…ç矟~>ó˜Ýõ‰ë×'svÌrÌrÌÂXeAeAeÁäõNu§ºSÍØž„= {ùiä§‘Ÿ«‰ª‰ª‰b¬ÈYä,rN®75›šMÍŒÆÆÆ1ödÆ“Of°WÍîáñðQ|/ð‰¦´‚VLìLLZH i™ÔÔ²›Ën.» ,d ÙBtÝíºÛuhÛж¡mq.â\Ä9€öÒ^Ú ô…ô…ô…AÎ g¸˜q1ãb •h%Z °.e]ʺ üaøÃð‡¯åµ¼v2>ý~H?P†2”‘h*„BØEë<ë<ë<<ævs»¹ÝRBJÀ‹XÄ‘+"WD®ü>öûØïcàžæžæžè.é.é.¤Ò i0V4V4V˜Ä&±I ôõõl#ÛÈ6æsƒ¹83pfàÌ0X7X7XКBSÀÜ {›½ÍÞ†ÇTATÁ.â`ÈÁƒ!Žþœ·sÞÎy›ÿRשëÔuN–À1ìv 3Öv½ízÛuÆLÓLÓLÓ&kd¹f¹f¹ÆXÎõœë9×ÓÕÕe¬äVÉ­’[ŒÕ½[÷nÝ»“ëG>}ÌØ¡C†»s'æNÌd<ý*ý*ý*Æö¥ìKٗ¶ä}•÷UÞWŽ~!Ò‘Žô¼ÓÂ$a’0é?Ÿ5´7´7´»Ê e…²BðÄßîo÷·ÃzÁ|Á|Á YB[B[B°˱€­ÜVn+ˆØˆ Òéƒô@ðÏÁ?ÿ  †„I ½´¼´¼´®ƒ®ƒ®ƒ€||| ÆÜ·¥WC¯†^ å㉆hˆ†6“D’H¿3““o|ëä[@ÿíþÛý·Õ½ö-ö-ö-†FÖGÖGÖ»vf™³ÌYfAqëç­Ÿ·~ޱÊÏ*?«ü bQ¨@T¸ä.¹KÌÁÌ–“–“– ¶¶¶e–2K™° mB›& “…ÉÀlýlýl=Xº"]‘®©>\}¸ú0?Ü<Ð<Ð<@¥Òi‚4¡cµSãÔ85q_“¿øåÀ/ZЂ–¿œõ‹úEýw¼mU¶*[UXfRuRuR5KZê·Ôo©¹ùüÖó[Ïo××׃ȳäYò, ,?,?, ÈòÀ ÌÀ À>Ý>Ý>0 † C€Ï!ŸC>‡ååå ·7¶7¶7âê×Ô¯©_ÃU©\*—ÊG—00ÁœŒûy¸E òSù©ü:¢&j¢¶üÞð†w{ŠèšèšèÚ†yφž =bº©S¦kÄòˆåË, È È È™F#ÀÏãçñóö|IÐ#ôHß(=MOÓÓ‚îm¦L@ž»IÄî©»D‚bÔ£õ®$žÄ“ø¤ã¿7.;·:·:·òÿ^˯å×òtAÌ‘˜#1GÊwñ]|¤tAg`ŒÛËíåöBüMä7‘ßDº¢ŒqÆ8cœà‘d¶d¶dvñüñ—fW3_Ê—ò¥ÂîÊ~ì©XAAAAA¬žŒÂ}aBCníîtk÷9NŽ“ã7k¨Šª¨jW-2‘‰LúµÆ©qjœÜVó)ó)ó)H)¥”RX<™hiiá‡ûJûJûJ$û%û%û\ûuì×±_÷}ôÁ£}¸žï©p²›|Å^Y u;øŸ[»—gVϬžY]¼B²Y²Y²¹¼Àb 1…Í•¹•¹•¹®îFÚ¿3°3°3çštMº&Y'í’vI»^Á+xÅ¿ï××׌$(c•±ÊXú»;ÞßÜãÈ«\ü%&&&&&‚sO;™ób^ä_Æ7oßÄY×ë®×]¯ßãÄJ±R¬LûúEò‹äÉÕæ‡æ‡æ‡¬èþ÷÷¿¿ÿ½ë=›Óæ´9Ù¢¢¢»CÙ)vŠúï5ˆ!†Xð¿ãwüÎO÷TÀ(îU‚?±?Ðn>´ÐBëÊcµ¬–Õ&êé%z‰^úI9º|tùèrþMQ©¨TTJ 2™‚ÌÆÛ‘—"/E^ZœhÐô=¹ÎOå§òSÙwn¿7àðqPü‰½¢]÷畇m؆mÂV’A2HÆ­H¦eZ¦ÍÙàý†÷ÞoЇ‚A ç×7øÃüaþðÖߺVw­îZ ŒBéöçi,GþŒãÿ/fsJ™ÎÚIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-31.2.png 644 233 144 2742 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü—IDATHÇÍ–oLTgÆÏ Ê?‘6UÒ ®&ZÌV¡ˆÚl±T1!SGAˇmn ZkSS›ýÐ4]”˜l»5.­© †¦†4­FÓkM0ˆº eq[‹–ÂàuGfæÞyûaæz‰|Úož/“ç¼çœçÉûÞ÷™W@DDÒc¿qÎ8gܼ(Ž{ÓÎ'¾šøê’o¢ø˜ Ž×¯ÝøÒ>Oû 㫌¯"·ll­[õÓûEìùÓù¬¼¤‹H8•pÊáŠáPöBÙ ‰ÏDñ?Û!©)©é¿T6W64~Ýø5o×þ¸0ášp­u«Þê·æMŸ/žàÙ?ÎþÑñ+$ÌI˜#9¯ä¼²øhÁÀb(ÝRº`pÖà,æ(0—¹ÊèèX16 [ë±z«ßšgÍ·ø,þ¨ùæo÷÷ޤúhíxÿ¹÷Ÿ³øÂMÀ!1 ÝÐÌ ³‚ ¨vÕ€ØØZ·ê­~kž5ßâ³ø£zì£ ˆˆ|º<ýž~ˆ\w¿‡—„—€ú³á2\„cJ•%927’IÕ¥ºTvŒ0Èàc¤ÔŸŒ5ÆÂÆ­ð³ág!ÒoñÙüÖQžy¾’ô$]W‘þŽþà % òT.ó ¿ YÈB0o›·ÍÛ€/Þi‚ð€6TcjLECPŪ˜Gç+Œ/ÆO{T0$"r좢Ê]å~¼y=¿w—v—Âá¿~éðK¨þ[ý7úo0#ŽW¯:^=…=…=…vÞ1GÌû²} | àÈ¢#Î#NTת«'®ž°ùT¨ª¤ª,=bþ[D¤k?xO{OÃÕ-ÙÙJKÿGjnj.AwÈíwû!g]κœuà;è;è;Z¾–¯åÛwúìѳGÏ)¼7¿7¿7œ†Ópàªq}àúœoe'g'¼t ÏÝçVxk¼5`é‰sT¦øSüùkDŠ’‹’E&¿¿7~oÜQ¿ç§½¿íýM*k+ë*ëD2Ç2Ç2ÇDôEú"}‘HéÉÒ“¥'EœWœWœWD"K#K#KeF „B!‘òêòêòj‘ ^8táHêÞ´ÏÒ>“„._{V{–£^d“¾IáÅäóÉçó×d¤f¤Fn’8:>:n_ûÉ¿û÷ø÷ÀæâÍÅ›‹a™¾L_¦Ãõs×Ï]?gïÈÚkw®Ý ‘ÆHcÄÎ[­ÆÖiGYá«ðUÀŠÚµ+jÁõΆò å¨O„'ƒ‰mÛ@éé’.‘›q‘gB—C—7e*í“´ODþu/:d~™QÖWÖ'r¦íLÛ™6 ( @¤³µ³µ³ÕÞ‘`n07˜+âht4:íü°>¬ë"×ò®å]Ë)è)è)èÙþævm»&âÝá-ôŠ$öÍΘ!óe0x1xQÄáW'Ô ÇMQ Ö7vúåÓ/ý¿MmœÚ¨´‚â•C+‡fý'«7«}*ÂÂGàõ5¯¯‰YÄ:±§cOÏù¡v v ÿDÿ êàΗw¾¸o¹oëãz½>_ç ç—#Oè‹À3Ÿ<óIÄD/Š^$……ËëƒãË¡¤¸¤àfÔÍ( i eܸћ3 ëã¡z}¾Î§óëzº~Ð@ÚËi/‹ÀÖŠ­±ÝÁ W{àígß~V×óZh!ün¿ °#°/¨óê<D€õq½^Ÿ¯óéüºž®ôc,¥GDäÏ`³ö €oØ÷·Ô¿ÕoÅrªtËj¿zK½šY3kfŒv›Üü)Uè¯òWáóßðÅûâAí òƒÍms3º¾¾”çDD~Ú±îX·Û¤´±á±aà÷üÔzµ} 0´ÓN;°mlµ]mWÛà ¹pá ëXÅ*àÇ<ÇsêUõ*V‡ø³Cz!}.ý‘®Ï»·îÞª³i?»|ãbÉÅhûy[^[jìÁØý±û,h“C“C“C`·Ùmv›Ñ¯]Ò.i— |­ùZóµf8ú££‘G#QSW¿oû¾ÍÐS³»_Úý’¾´]ŸKà‚ˆÈÈ~ììƒÿ§§«ÉLÌNÌÆ[ÚZÚTÚæCæCæC0Þ3Þ3ÞcZó­ùÖ|Øt|ÓñMÇw–;Ëå³:guÎjX{fmÿÚ~Xùïå•Ë+ñN'û§üSj'|Øôa¨ÍA?‘µñ³ñ³/æ‰Xã¬q">º=s{&¢{ßÙ7¯¿y]¢kvÔÔÔÔˆ$­LZ™´RÄtÒtÒtR¤+£+£+CÄ>l¶‹¤¥§¥§¥Ë‚6˜;˜;˜+•••)rù—_»üšHRNJyJ¹DÿÃÜ[Ñ[Ñ-R"%"¢.Äļ˜'’˜’¨]!fzfzÆxÑM³ûf÷AQ]Q]Q䦿¦æ¦BëHëHëlX²aɆ%Ð8Ô8Ô8—n\ºq)°…-l1¾XGAGAGX=VÕö¥ß³¼cyþú¨³¦³'ð_A@'.Ö®H -ïÔ)xÜø¸þò¯Ž/:¾€¢ßZ -Q^u^u^5doÎÞœ½Ì•æJs%,;¶ìزcFLw::ð®ó®ó®ƒÞÞ^ÈÚ•µ+kLÿjºxºÖÿ-§"§þé<ë9ë˜ëžë†Àõøñ'Ô)QÑúëËïË‡Û óójgNÑ ŽxSûS{R{ ì\Ù¹²sàhp48 Ãíöv{» ' ' 'Á9áœpN@V}V}V=Üê¿Õ«j[j[j[ !9aQÂ"høõþ”ý)xCi²>Èü ¨úýpviÉ8%[YYà^ôÝù»ó¨ÀD`"0±psÏ3Ï<ðpôáèÃQÀ† 8;;ƒV¥UiU Î¨ÕÇàúÌuÑu¥Ýóeù² =\{ª÷TZèTòÑ9öi0WT÷9ö†zú‰z^=ê€: € ¨€ „í©QFrƒaÎëØË^Ð\*FŨ$•„Gý!Ä_;656ëŠu¹MŒë9¦ï¯ž¼eQeQÀo‚É¬Îøgý³@wànàîÂäçÍ4©¤’ ü/ø¯TWÔ×êkàN¨Þ®%j‰øÔýsþ9à´žüe¦2ðøÉäzÿ•Oíí⩽=7ØÿD}Ž9ÜÁ7IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.2.png 644 233 144 2376 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܳIDATHÇÍ–_LWƇEÁUA©ÛH,[ÿ41 þòÚÄI$j%  i Ä ¦fcõ¡_ij‹4 /­šÒDÓ®M|)µY¶>+f‰¤ØÝHV¦ÐÙ™ûëÃîe©MúÆ}Ù9ç~çû¾™{ïÙ«€¢(в6õ«€Ãíp;²“±ã3+¿âÀŠ|ŸŒ› H;švôXs}Íu€œ97ÌçV,ç%Þ^¯(¿]Oæ•µŠ•ÈlËlKSSñ%ødÇ';V¼›Œ¿|ÎgÇLNÝ?u ýVû-ª Öë˜T'U°b9/ñ²^òÙù•Koè+ ,,¤½„ÌŒÌ E… ·T'/¶@ñáâãé£éÂÆ8°šÕBâÄ‘cÂËù^ÖK>É/õ¤~Ò®}®}ŠGÊŽ”9¿I1¦éCÀtRÏÒOúIëýnOÝžóOq2E0÷l÷³­Ï¶‚;áN¸ Öªµj-¸½n¯Û AGÐtX†úCý¡þ ïWýªÜgÝgÝg!ô~ÈrÍÃç’/#NJ}éGì®ì.ѱ½±½`ÚD:Otï<>¯ÏëóZùüáüáüah¼Óx§ñŽ•¿[u·ênøÎûÎûÎÛðùùpí÷k}×ú¬¼ñ‘|JêK? ädåd™0™ˆFòØ ¯Yf–Ù–¦"\®€M;›v6zF=£ž­^«×êY4á«Õjµ´+ÚíŠ ¸,©7¯Ÿò³ø‹õ,xúÎÓœ§9°rýÊõ+׃ßð~^?xýàõ˜=7{nöÄŠcűbè[×·®o¬Ú¾jûªíà×üš_ƒxw¼;Þ æ§f¹YŒˆVÑ Œ¼õ‹-Üc†ºpµ¼héoéG£ÇÑ………à ¸®4Ül¸Ùp¡æIÍ“š'à|è|è|¹¹¹Ý™Ý™Ý ­?µÞk½gí1ãë·î±7NåÏò”º¡ƒþ‹>¤!ÆBc]c]‰F¢‘(Dͨ5aæâÌÅ™‹0yzòôäiÐrµ\-Æ=ãžqD†#Ñaˆz£ž¨fÓfófó`Ö™uÀ·ÿy*m}ŒAcаúÓf‰Y2ßwæ˜ãÿŒ7ðæ1ó˜­Íëýk³uþDiziº$у|e”å ÚŒ,# ]ü&¦ÄBü ÚE;p’œ2È 8J % ~¢D(…OÕó…QdÙøçõuþ%û_¹doKö>¶4o°ÿìw €l`¸ÓIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.5.png 644 233 144 3042 13755454067 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü×IDATHÇÍ–ÿOTWÆ8 ŽAÁtÓH!P‘VÛl‰_¦µU'E‰¤1¶ý…I‹ÔÍn£v²º‰Ù’E°Ñ 1R—fw‚íLÄ”µn¦É®Hœ˜º…:…A…A†ûå|ö‡™Û™ØÀóËÍ{Þ÷}ž'÷¼÷¹G€BˆŒØS@rvrvòŠhœ|8¾¿ô¥o¬ýg4nÕ ©"©âÖŸ ýlúY€•W^ÔGⱑ7êû…ˆã'òû"CÄ7R;S;“l±øcx륷^Zº:ÿõ:Xº,]aª¿ªþ ÀÝîn§~öýì˜±ÍØ y£Þè7ðñÅÇOñ )Ý)ÝIÿƒTsªYÈÙ™³3¯.Zp7Êíåv€Ÿ–ü´D&€6 ,g¹´³Ìb¬©„ØÈÇê~ÏÀ7ø þ¨Y¯e½&ì;°ï€å³hÃÈßáÃ5®1ø”.à§Xê¬:  ½­½Mäuy€$’ y£Þè7ð |ƒÏàê‰å¼B4í€ýýÐÿ  ÜPG•<%džúªú*JL©”¿‘™2ÔÛê°: º_÷ë~~½úQPZýâ¹Ås(Z‘R§ÔfâS¹?s¦!°iGü({…bý§`™µÌΚ¤¸¸ü€= 7È Ì$Dd…¬€'Î4ÒrZNËé„ýÀcó@æË|æcÙ=ã‹ñG…­ÿT0.„­ý’š}5û 4½ø?cß—_§7Ÿ.;]†¼Ót§ñNcœoäæÈÍ‘›Ð’Û’Û’ þ‰¿ä×/LéUz•^èjï:ßu\oºÞs½‡«²fÍ> >‹Ïâ³Ä…=°>°>°Âê±Õc«Ç ¼ªü@ùx×wÐqÐA䇗gô]Vû¸û8èw¢z„¾é¹‡Ï=”0×3×Wõ¾Ô¾TpnÿÈò‘¼ºWój`í±öX{ á^ý†{p2çdÎÉœ¸€ÂÑÂÑÂQ8“r&åLJˆ õõÉn²›ì`¯³×Úkáo¡‹_^ü2áÕþ6è:ߊS+NÉN+ÓV¦é·Y:9=Ÿ©Gõßø>ìÞ¾{ûîíPp©àRÁ%D‘@F G G ¡¨©¨©¨ lu¶:[ÌeÎeÎe&kíoío…jOµ§ÚmmmSôâó/>ËÝN·“)Pýª´¿¤¹Ò\úm¡e-^6,;añøâqh¹êp Àëζ¶8Añ®â]Å»àÈà‘Á#ƒ]Ÿ]Ÿ] Û¶5lƒ¹+sWæ®ÀBéBéB)„ÚCí¡vð¸=nN¬=±öÄÚ8ÞïV¼2üÊ0¸”6S› Òi-wÙË~”B¦3vyËå-<¶°ca‡¬*}}Óø¦q"…¹¹pX9¬V ¹¢¹¢¹Ìeæ2s”ZK­¥VÈêÎêÎê†æ¡æ¡æ!ØêÜêÜê„ó€yÀ ›ý›ý›ýþûôšôxwæ`ËÁ"OšdtÜê¸r:6c±Y?_;LSü«\l|b{bƒ‰Á‰ž‰¤Ôƒz"×"×"× t!t!tîïï!¨õ á¾p_¸¦×M¯›^r•\%WzL=¦ƒIS( #õ³ÊeOœ{ŽõŽõ†Ÿµö ¼OùØ¿¢¾"?ûÅǪdóÒ%ä#ù(ahç™ÿŕ„ ÇC9(}Òr—|G¾ ·È-Ì˼þšÀp`À2c™™5ñoÃÇ çÎ[¹¤r ð‡¨3K¯:¥N^M×tš¸ÊU¤üB~.?y3Fì•^éÔPrZNÈ ÕÇ9mLC‘½ê¸:ü#æüTš*MÀâÓÎÿìþ+ŸÙÛÅ3{{6o°ÿ”VT ¬ˆ€ÙIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-75-grey.png 644 233 144 6210 13755454064 16001 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü =IDATXÃ…WkPT×–þöîCwÓ äÑencJ)@ÅQ^>"×Lp”5–&%2Ä)£†ШѤœ`ðQÓ‚©Hß‚—ê ¢wÄ1Dáú¢G«¡J¡Åmhè>gïùA7¤2“Êú³kïuÎZßYë;k­MŠ‹‹‹‹‹¡Å¸ØÆºPx$<ñ†âoŠ¿)þ†‡ŸŸŸ.‰â~Üû}ö¯¢NÔ‰º¸Mcucucu|ªP…*RˆHD"@ºÐ`6aß§ÈPd(2H¡Ð/ô ýÿ¨"ƒd T–——7u”­/[_¶žXE½¨õ$}»æÆ¥¥‘ˆDz‚™‘Ù5ç°sØ9o4ÍFó‰^§ÕiuZ‰‰‰ûu…ºB]ú¸Åq‹ã“¯¯/ Þ?Þ?Þðì=zÏóž÷=ö&ì»ýyü{ðxð î.à®áöÙH6’ú ™^¦—é/þnø»áïþâÐÐÐ(m_ܵ¸kquE·G·G·“åŠBE¡¢#Ø‰Ø F0‚ïã}¼`*¦b*FÆBÇBÇB±¼½¹½¹½™»~Œü1òÇH¶ýÅÒK_,]û…J¯Ò«ôó•ÒFi£´qQÏæÙ<ûÑ{tùdô“ÑOF4£Í¡¾BP'Ô5Ÿv:œ§ã/ KKK3?Ìü0óCá„Ö®µkíÃLÁˆ<œ‡ópèF7ºøÀ>†0„!ˆ@@zHéˆçxŽçl›Æ¦ÁÃó‡Ï>X|ïáÕ‡W^ZäÞro¹÷/Å 1CÌHZ$$!éñ¯²eéËÒ—¥d ™B¦jÙ=²{dwJ’a‹a‹a‹¸<;+;+;K¸¢°)l d’ZRKj(0Ó1”4’FÒp ·p @ h-H>É'ù?ÌóÃâA<TrJNÉ xûzûzûB·#nGÜúá/üþ —[XXø—*7)7)7¦+))Õšˆ±ÁØ`lHw¶:[­[5ÚaÍ07ätätätVíííPnçvn‡†hˆ†h000¦ÿVF1ŠQJ(¡üô±ˆE,€Û¸Û°Ûm‰¶D°£ËŽ.;ºŒ'Øåv¹]N,òy‚<ᯠä‘<²t¥KíR»Ô@jFjFjk_j_j_BîúÚõµëk¨ºv/ì^°xÏâ˜a†ÀIœÄI€Góh ï Þ¼ð ò ò D?ˆ~ P9•S9ÀOò“ü$@“i2M ©†TC*4Úm‹¶#)ÎgŠ‹knÔܨ¹x…z…z…–®Dƒh ssüÎùó;‡}³T³T³TÄäþn‘ø_â \ ¹r)x÷<îy Ün ·¯¯¯àÙ†gžm²ê²ê²ê€ Ü Ü \À”dJ2%€Ø(6Š€—ÖKë¥>Ò}¤ûH( €Ï2Ï2Ï2Óz…^¡Ø7œ:œ:œ:7ù¯ò_å¿bûNÌ?1ÿÄ|î‘a¶Š­b«&öÜåp9\Î×××&Ï›õÍúf=ç˜<ÿiÃO~ÚÀ¹)Ôj <çËùr¾œsfafáœÝ`7Ø ÎÙqvœŸôïÁãÁ'`ö`‰¤gèzf‚A ´ -“”ü?Á‚Cpƒ~<ø1ðÃö¶ÿ°x—¾Kßý W$F#ðÕ¯_ýúÕ¯@kk+@óhÍw¿.¾5|køÐ0FÃøY”êJu¥:çÓ‚Ù³ f³½m¾m¾m¾“)‡Ä!qh2sϜϜϜœUUUqޕٕٕ9©—J¥ƒœÛD›h9w.u.u.Ô;ÃáÎp΋ß*~«ø-ί­¹¶æÚšI=k{Öö¬å|gúÎôé|sÉç%Ÿ—|î|J‘‰Ld–T ÅB±PL ›ü›ü›ü¥0ÛlÛlÛl¨dj™Z¦†Ý©{Á÷‚ïšÕ}ªû ´‚VRµT-Ut ]B—iYiYiYÀÕ°«aWÃ€ÒØÒØÒXÀôéÓÀ‚C -8>sÁÌ3@Q«¯Õ×êÙH_@_@_m‘¸·ÚÕëêuõnwÉbÛbÛbÛv]g×S+ƒ•Á«îõë?Ö̧"…H!<Íeˆ2D‘lŸŸŸð˜ê˜ê˜jŸu>ë|Ö´”–ÒR˜š65mjÛÛÛèÞн¡{˜/Îç‹ÀÜãsÏ=ÇÝê»Õw«ñ/õÆzc½‘| ŠSÅ©âF—òi|Ÿ¶ôŸÇ¹ÛŸ"Ð*ZE«d­hD#Ÿ$°D–È7Qõ©úT}—Ñ|«ùVó-þFèÙг¡gÉ©èÓѧ£O#ƒÇóxÕDO¯E-j'SÌÇøŠ°'`OÀmhCìö]ö]ö]ÐÔ‡Ö‡Ö‡Šaò@y 1N (QQ|€ð€²@8ÁEÍÅú‹õë¥mƒ–AË E8¨Ð(4 Í©²ˆòˆòˆò/.£%(!§Ñƒôˆ‹<•O^ô¢WìÀVlÅVRUUUW¾B¹A¹A¹áTÙà¼Áyƒó[¼F^#Ÿä./âE¼chG;ÚÓã=’„$$ÓÚ@ ¸n¹n¹nái7q7!+W«Ô*µêñ¨ó´ó´ótþÞŽ’Ž’Ž’‰!ç5·•jÐ÷z†ù0æƒ×îôÝé»Ó8·:·:·æïUû©ýÔ~Ît™»Ì]fYyÃ; ï4¼ÃÓHÉ#yP°oÙ·ì[pxÃÞÅ_ñW‰HD8žYžYžYpª1¦1¦1¯©­j«Ú °9l›“¿—î§ûéþÇ£n*t§'ÝÓ€ˆçÃÝW…çïv×ÝòqîJÛH"I$‰i+Ư—/¸r]¹®\¶e-[ËÖ2º0zôþèýÈ`¬“uBEgÐtÆÄB±P,„âHø‘ð#áR„užužuž¬[£ŒQÆ”Ïç2.ã²í-ÌÄLÌ$tgöß=++++++ƒ}¢é¹&8äæî67wº¹û7šJSiêö:d#ÙôÙev™]b®­ÒVi«„ŠRJ)Å+O$šMŽ&ylzlzl’u+‹”EÊ¢Žú±'cOÆž}Ñýf÷›Ýon€ažzêèÁ÷&Éß= rø7w/DÕFÕFÕ–¯Pæ(s”9§ÊuƒºA`;W|®ø\±´Í=Ñ¿ÖîßîßîãÍ­Í­Í­ä=U§ªSÕ °0ÆÂ¶\Ök„5Ž2$ ô¥Ûß[îÕñ{\2ü¤¤¤¤¤¤@toÛ¹œË¹œü›u¦u¦u&¾–¦IÓ¤i?‹ ƒÂ 0¬:4°h`ÑÀ"ÿZÛ}Û}Û}þŸwªïTß©– ¹†\C.ÙV¯…^ ½î啼’Wž¬Ÿëdñ/ñ’yz›Â(ñ÷xþDþ€»F4  R ¯ãu¼.¥‡ÖÐZówÃèÛ£o¾Ífz™¼L^&z_–-Ë–eÿx5¼&¼&¼fIŠ¥ÇÒcé!?° Ä‚ø1·]³àÈá øùwÝåB*Aò'üƒ¬'ëÉúÿç ¼7¼ïýº÷ëÞ¯Óû²^Y¯¬÷Éëì3öû,·¯suçêÎÕÀ8@Üö<ƒ¥ãÏpü/¨¿#5 Ñ IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-69.png 644 233 144 2420 13755454065 14675 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÅIDATHÇÍ–_HTiÆßñïȄ⒠…‹4$ÅJ7 fCVZÑØ‹þ²ŠT4tQ8-]تìfC`%±¢AŒQ]ZFC[d$bYnÔ å¸!ºn®çœï·3gÎÙ¥b/=7Ãó½ïû<Ï|ïùÞó ˆˆˆ;ù+¶8mqZn§í³Ö~§ÿ›Î>¯ƒc‹cËа°ua+@^{^»ñÌÂfÜ̷׋Xüv=s]Üb-d_;ê¨Hâ l_±}…ó«þ©r®å\ûSƒý×÷_è¾Ü}™:ˆEb€*ÀÂfÜÌ7ëM>;¿ÿ£/™73o:Æ ;+;K–¬[²®¨>‘ð¢ª7Tox“þ&]¥€>,`ª¦˜Â|â6lÆ“ùf½Égò›z¦~Â@Áš‚5"°yÇæ9—Ï: à xL½¹kÀiN³´)m @ß­ïfT¿êÀ,lÆÍ|³Þä3ùM=S?áGþÝÛ¦JØæÜæLºÏ”~K¿`´íÌ©ýªEµ ´'ÚCí!£Æ ãEjÇ0&Œ¸mB‹i1Pûù`4ÍÌ1£ßÖoÛøSz¦¾Ø yœXNl*žëÏuà/ªÀh1Z˜!>P¿«5b¡—^zAy”Gy€.ºè²Å+u|M%•F£ÑȌşÔKé'ü$¿O<™úßßš-P¿ª^Õ‹2#£u£u£uÐt¦éLÓxtüÑñGÇ-O==ôôœ-9[r¶^¼x9`ÅÕõ^½GÙZœÔ3õ~’ÆŽB×d×dª|ÑNh'˜5W&Š'Š'Š¡Ì[æ-óÂÆÀÆÀÆ”EÊ"eèˆvD;¢°<²<²<«­>¶ú,«]V»¬Þ†Þ†Þ†lÔŠµb“_í±ô~rïäÞQW!¶*¶Ê*Ô·kÍcáŽñŽñŽq(ôz ½p`èÀÐ!h~Ýüºù5÷÷÷Bygygy§UW/—Æ!äùC~…–­eÛZžÒOøII¯N¯¦D$óFæ 1Ÿ ™–E²(…E+Ð ´g®3×™+²2º2º2*rñÂÅ /ˆ¸}nŸÛ'"Q‰JTd}h}h}Hd¸j¸j¸J$cmÆÚŒµŸdK‰”ØôRú ?i"FÑãÑj´šTbœ—£rÔâq‡ÝawXÄuÅuÅuE¤Î_ç¯ó‹äÉ;’wDäñàãÁǃ"ÞZo­·VdÓ«M¯6½ÉWù*_‰õõõX|ŽAé–n›^J?éçsï?ë¥z)³üF}Ö†ï ï ï ƒËïò»ü°3¼3¼3 cKÇ–Ž-Èò‡ÀÓæió´A >P¨·ul<.éåzùß±/ŸJÞ PÖ©TY*KeA¼-ÞoݧûtŸ¥;;=;=; ï¶¾Ûún+¨ê£úh3öG‚¥Mj“v½OžÊO̱¿Ssì”qо£‘F0¦4e´FÕ¨P.åR.PATA[|‰*T…À÷œã€Ñ`40ÃÜÿšc_˜üº~W¿ `63Ç FA©ûªOõçh¥Õ¶#§h ÔuOÝ2Í4 Œz£ž9t½_ï·ñ~òÏÛoå¼½]ÌÛûØü¼Áþ…^ðÏ vIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-8-grey.png 644 233 144 5771 13755454063 15727 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ®IDATXÃ…—{PUåúÇ¿ï»ÖfÃÞ"·3!Å0\Œˆ"†¨G!3ÊÐt˜Fñ2žò(ÉÍ2jøå šó#©~•H*7 ‰€4Ãòð0\·0/@rusÙ{¯ý>çö‚¦¦éùgÍZÏzŸïg=ïw½ë],+++++ Θ‹ñ¹_+÷É}rÕe}‘õEÖ´$w(w(wè¯äB.äòÞßÅCñÝkª6U›ª)Å(F1Ë@ Ýè°{±—òµ±ÚXm,ËÈä7‹Ùcc‡Îd»g»g»7vä%æ%æ%²AÅ[ñV¼Ẏ¸nãræó€áG8?'rE®È×ÍSæ)óÔc«rkrkrkÎ ˜̓æÁ†Ó+¦WL¯ý‡¾P_¨/DmèÆÐ¡YF˜&L¦V¹®r]å ¨çj^½_¯Ö›¯oÓSõU•O¶u0‚ÓbZ,v²=lÛã](yKÞ’÷•§J¦J¦J–ºº5¸5¸5XßØØ½±{c7·µµµ³-Ú m†6Ó8ŒÃ8 ¦1i¯âU¼ àq<ŽÇ1mò4yš<±¥½©½©½‰,ß|ðm€xcdÓȦ‘M¯| óÖyë¼×Ø[÷X÷X÷l(¤$J¢¤¾ <‚‹#âˆ8"þI34C3žŽÒ"i‘´èНy—‡.]"?82828’ÙžÔŽ7ñ&Þ hð)>ŧ˜ónçÝλî<ºóè°Ëk—×./ <0<0<¨J®J®J:K;K;KÄ"±¥P ¥óõmzª¾Ê£ò!}"}"}BäŸ[sn͹5¤Æ”Ø/ö‹ýDd$#‰(Ò)}>Of/³—Ù‹èHó‘æ#ÍDUº*]•n!?Õ?Õ?ÕOtô“£Ÿý„è»MßmúnÓB^<-žO/ԟ׳ WyT>ïà¼Ãø~_˜2-.á.8Ó8 àm¼·ÚM»i7 Ð h€èôèôèt q¶q¶q˜l›l›l&&&§CN‡œÁ}Á}Á} 3Áî²»ì.2d?á'ü´ Ïwñ]|€ð>b\ò<$º8¹zrõäjÜV*•ƒX=«gõ yà[¸…[{‚=ÁžX½?zô> _”/Ê:Oçé<`.3—™Ëæß5Ìœ=8{paõS?õÅ(FÖËzY/È––¦~œúqêGÜæ>܇ûÐEäxäxäx˜‡… 9"ÞýÁñǦÀj´­F¢¹õlaênWÞ®¼]Iôzå땯WÝÜqsÇÍô»(¬-¬-¬%*Ž-Ž-ŽýUBCÒ _á+|ôno½½õöV¢Ã1‡cÇÐkÙïg¿Ÿý¾yˆ#qˆË.–³ä,9‹e4º6º6ºZ}ÆCÆCÆC ãz®çzLR0SðBGdI–d à+ùJ¾‚¥`éWy54¥šRM)ÀâY<‹ÿUGGh„FVÎÊY9LÊNe§²ºË†Ë†ËÎ ÌÀ ø?feVfýØNJ˜J˜J˜º~e6w6w6×oïDëDëDkÈÑáÝû‡w[ÓBCBCBCø‹8Žã8›e³l²Óv§íNÛ‡™3fñññÀÐËC/½ \ÝvuÛÕmÀ¨nT7ª¶H[¤-àèèÐq:NÇA,%°ÈU+«VV­Ó±±±|¿ý³öÏÚ?ûïxK‹¥ÅÒ²#†½uç­;oÝЂ´WA§mÇ b‘X$Á©í~Ûý¶û€9ÕœjNMWï¢wÑ»ô]è®é®é®‘NÔm¯Û^·Ö³–ÂR gÅYqG8  š  €Y˜…Y0ó‹áÃ/|Ù°¼ayÃr8éõƒúA@¬«Åêôwy/àwgmVjÓ{Þvœù-—„?ˆÈÈÈÈÈH(¶Óv²#;²cûŸ|jð)ü¿ÕËêeõº¡h}µ¾Zß—O oÞ0¼Áµr¼s¼s¼“þ·íó¶ÏÛ>·F-F‹Ñ"¥jÖjÖjÖô¤3t†Î”ÖB -´Òæ¾õâqulR~ËÃð'ñÞÍEêPgͦjª¦êÈ^^Á+xÅw¾³/̾0û‚xJS¤)ÒñN)IJ’’¾ýޯ¯¯⯑†^C¯¡—}#‰Çèc[ÝàôqpüIüÆ»¶åš¤ E¾ÉY"K¼æGuTGu‡^uxÒáI‡'y§4 H÷žï‰÷Ä{É÷»â»â»â9@øÚê©Ë™?ãø/¡Ûfµ%÷2IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-33.1.png 644 233 144 2762 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܧIDATHÇÍ–ßOTgÇŸ„‘ŒPpIè4î`ÅÔJbÅiã+þˆŽ „¨ TéPwô¢í¥É“&nV.JCH—@T¢FØRÙšì61Ó¨ &V«Ã”)Š•‚°t`âÐæœ÷³ÃáL7ûøÞLž_ßïsæ9Ï÷¼""²zéWÀZl-¶æ¦l«×ô¯¬^Yýçó)»CË{–÷œ€—¾|éKG·£[™¶7òÓëELüt>Ã/«ÅtØ.Û.[ÜKv ԕו¯\“²ÿ€ì+ÙWž'¡é릯ügügø <½ùô&ÀoîßÜ`ÚFÜÈ7ê ¼t|iù~ÈìÏì·<[–-Kœï:ß]{,•0¼öíÙ·`,c,CY@›V±J¹(QŒ3“fñ¥|£ÞÀ3ð >ƒ?Õ@Á¶‚m"°ÿÀþÙ]©‚P|VôY‘Á·xøœÏYÉh2  ½¯½OT@°`Ó6âF¾QoàøŸÁŸêÇeLDäôv¨ ׄA¿°x#ùdqíâZP¥É·“o³¸Ô©Òõ»ú]H>IþšüT¹*Wå˜'F„Låƒ^©W²¨ç$7&7‚ú!…µ™µ™À´ÁoŒò;‘Ò/ ;š®PzøFøp€Ý Ö©uÄx U£jºé¦;­‘«\å*p„#Ióûñã- ´pMÿEÿ…ØRt7Ép ƒ?ÕX餈HÇ÷Šö´ß@ÓßøiôÇ}?îƒÖ ­¯·¾Žúy(84ùî¾wúÞihuµºZ]ž O†'͸êTªÔIuR4ýM--¨Ÿ6ßYwgɧꛆ›†Ñv|/Úm‘;ŸB_o_/ ì~eøÕ¸úTNYNqO©çUÏ«P¶¦lMÙ¸0zaôÂ(...€'è z‚P<\<\< ?<üð°ÙHâvâvâ684phÀÔ€kmýýÄ—£Që öÆî|jµ4Ûçíó7‹TYª,"ó¯M¼fé:úÀ÷ÅÅæ-ó¾é}S¤ ® ® NdâñÄã‰Ç">åS>%âµz­^«HÞHÞHÞˆÈóÏOÈÊéÙéYsíçþ99 »vìÚ±k”¸KÜ%n͇æCóð$< T»«ÝÕn(u•ºJ]ÌæóÍL;«ÕΚveCeCeøõÞÉ^sô3Zt*4£Ñjìùö|uâÇ?†öï:ouÞ‚]»w:v:Ò‹*‹*‹`C`C`CŽ?8nÆKêKêKê¡}¤}¤}"}‘¾H,´-´-´™y[*Þªx üÿêmémI{€§c/½ {=÷ººlµŠÍÆfïˆ|ÓóMHý?¼[¼[øp.>û`ö$ÿqŒ:FEœçœçœçD.®¿¸þâz‘Gƒ Šäµåµåµ‰lº´éÒ¦K"U‘ªHUDÄUè*tŠLG§£ÓQs´ö3ö{‡H檌ɌII,½sZv²Y""QwÔ}w@Œ-àßÍ+šW˜[’øÛ‚{Á ÏlS¿OýŽÒÚµv­=í¥nH4$`êÙÔ³©g ûtŸî3åd¦k¦k¦ ô­úV}«Y7ç›;5w •¸û6ö­ÉÇ­æíÍÛÓ¶’ûÔ1*S:¦†–u¬NÕS;Uªݯûu?¨ ©PšöbÞ`ÿ ӠĬ‹ÙIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-20.1.png 644 233 144 2770 13755454067 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü­IDATHÇÍ–]LTgÇŸwÀ (’²éjD–’Jh²¸Ẍ́̅ÎÚÓ­ fib¥°nw Á¹Ø®%!¬n€šmLŒ1"h¥SØ5»Áiñƒµ 0:x‚£ufT228ž3çýíÅp8“&{ï{sò¾þÏ9ïyþï+ ""Kæžö|{¾}q Û·[ö…ž…ž•'S¸# ¶÷mïürŽäÈý2÷K#`aÓoƧç‹XõÓùL»,ËÙÙm«œÃûàƒ7>xcá/Søs?8Ï:ÏÎèÐðUÃW½Ç{ó'xpéÁ%€'•O*Á¦ߌ7óÍzéõeßÏøEÀásøl™‘™!55¯ý9pç5ØøîÆw¦L-PvH†l²U%#†¹"iØôÏÅ›ùf=³¾Égò§úȫȫ÷>|ïCç?S °kù®å&ŸvøŒÏÈ=¦Ç’[“[I€ò+?6l`aÓoÆ›ùf=³¾Égò§ú±¶2*"ÒZ µkƒú€6¤´WµWÁðk-€6שR¿S.åý®>¡O€jVͪkÍð„'€žŠÃe¸ÐŒEz©^ êJª>lrlra“ßÜʉˆ¼ÞΘ3û…Ї‚C@=ï€zS½I¸j©Zª–UTQ•ÖH %”EQ”f?ÃÎ@ÒŸô'ýÀ€1nŒŸó¾ƒôý`ò§{½}î‹u|«>±}b3«¿¹½|tttÚ~ݶ¤m êÚäµÉk“_pGpGpuuuÀÄØÄØÄ˜åW7Ô uÔ~µ_í·ìÇŽí;¶õãÚëÅ׋->õ‡†; wÌ­íøVŒßŠˆ\osç:aäß¡C¡Cj[~|YDz+ª+ª¡0Y˜,LÂùÑó£çGÁ]î.w—CɆ’ % èbÑÅ¢‹ð¨ïQߣ>«Í¥¹4Ô × × [0ðw_™¯ŒÄÜklKN=1j6v½E’7³Ú²ÚT7Äñœs~óÊ7¯À®¿´”µ”YîÕîÕîÕPÚPÚPÚëƒëƒëƒ–¿,Q–(K@—½ËÞe·ìñêxu¼N­=µöÔZ(xPp¿à>øÎ}½ûëÝV\òÅTÉT ÀâÁŃª[Ðs¹NcLíׅ묱¿½õÖÛ·Þ†âñâñâqØÜ³¹gs´z[½­^¨i®i®IûÙ«:«:«:¡}oûÞö½i_ì©öT{jaW½«ÞU½FÏÞ‡_2öSà§@î¢ÜEƘ]õèõz½mÌvØqØqXdäoÁ#Á#’·ú?¥¥"[önÙ³eHwmwmw­È*Ç*Ç*‡È½Á{ƒ÷E"ë"ë"ëDž…Ÿ…Ÿ…E ³ ³ ³E"Ó‘éÈ´ˆá5¼†Wæ—vGׯEä¿ò…|1oΓý-ý-£Ïè³ÙÕ§3]3]7‡E®z®zD¾_˜ Lòqâlbeb¥¼ðýà»â»"’Ó˜Ó˜Ó(2{wöîì]ÏÏÏ‘½+zWôŠxf=³žY‘5åkÊ×”‹¸OºOºOŠ„ûÃýá~«±¬ãYY"Žì<”sÿÜǶßû3ü""±ÊXåÍaáóÔ@Óž¦=ð\OMÉ£+¡ ¡ pŸÐ²Ð2Tè¡m¡mðÜùÜùÜ œæ4§!ÚmŠ6ò*¯ò‚ÊSy*"¾ˆ/âK©—á²¶rúÓéCÓ‡P/†âýñ~k*¹ÜXÝX6•¦nX:2§c¦Îh*_åÏëìd';ÁˆQ#š&ÕAuØÎv¶§é˜†6/Ë©ÈU¦c//ý_3O€Öjö×¶Ô¶€:‘Rf5œÌNfƒ:¥OëÓhüƒïøÅ÷ 1ꪺ¬. 0<&JÔm5¢F€[óÊÿ‘ñIwÒ tÍ+æ¦L ñsåyÏÊ—övñÒÞÇ^Îìÿ‹Ô=}õIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.9.png 644 233 144 3125 13755454067 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ûOÔWÆß/3Â*m´°â ¦ÖÆp‘B£¨5; \â`-jª{ :©¸ÛÖ5TŒnÚMl³^YI]cCº®AF›&]k·^­j•K3)Ö:.·é°\æv>ûÃÌ×!þž_&ÏyßóÚëÚë·÷BB]BÀó_<ÿEðÇÖëzÿÔõ"þ©zú¼<'‘‰˜s1ç´¼0þ6flÌ0½Âí{>öüÿü°õÂÖ Í Í TÁ¯×~½0œ7œ¬×õ~}½Î7•_>yJ_¦}=íkÍ 1Ñ1Ñ"0¿`~Á‹5ô¾%Å%Å  * ÿ¦3]å<èc` Öëá~}½Î§óëzº~ÈÀìÜÙ¹"Púfé›±§B ~ü'ì2ï2ëz¾óÀ~ö3ü¿ P(g”]ÙÐÐ ‚õºÞ¯¯×ùt~]O×ù‰l嘈ȡ|(ë.ë†à>‡¿ß·Ð·Ô|ÿRÿR|a§JU¨j#ø;üíþvöûƒýD†‡!†ž õÏôÏÄçò%ù’@•‡ø¡Ì]æ†u}}+/‹ˆ,þÄzb=£ v;ºÀ_°‚JSiŒñ .\ v«Ýj7¨€ ¨À#G8ÂÀŒsdZ ©!5ü™ýìP¹*—1Ö„ù“Ãza}þò#<©¿ªØVº­T§ ¾ÒÕß^Ò^‡_;¼âð Ôý÷?»ÿYD°7©7©7 *ïrûŒãŒØò#ú)àß6£Í9%Þ¿ŽççÁãׄk°ì{ä {‚=ÁØ;°w`/ƒ‰ÁDPVeUV¨¨¨Å­²ƒ÷;ï%ï%pe¹,. JMø—ú—Fô¶UÚ*`ÈðÕS9ö](WÔ©'9V¡*Si*Gå€*Q%ªTªJU©Sâ!E¥¨PƒjP NÉ·é˜0Z«>P3¦æ…ù·wÿÖý@¬+Öå1ҧ瘞ü“zò®7¬7;Cɬ¾ñøG€F’Ÿfiu5|5Ð@0Â0àî¨Õ¾=Aq$à 8ñ©k~—ß\ד½q½ð=üÏî]ù̾.žÙ÷سù‚ý?*¢¿âa.IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-15.5.png 644 233 144 3044 13755454066 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÙIDATHÇÍ–ïOTgÇÏŒC‡id:DÞˆÐa‡ˆvú¢IËPPIÑØÆ¬:Nˆ‘ĈJš&MMLkÚl(Ôtq—™hÚ˜åGUtIjL]l7ZÃBA§Ø03÷>Ÿ¾˜¹Üi÷ðy39ç|Ï÷{æ>÷ùÞG@DD\‰_k–5ËêŒÇÖ}f>uSꦼKñø¬–÷-ïÿ÷cxíôk§ÒϧŸ×4c£nà“ûELþd=#/.1öN{§¥$ ; v¤¾¿èGÐ\ŒïŠï @×Å®‹€Ÿ‡~˜+™+36êÞè7ø’ùåÓ?é‹@Ê·)ßZ~û+öWD »,»,÷`ð¿\¨ÚRµ`|Åø emXÉJU„ c¬Ù¤Ø¨'ðF¿Ágðz†~|Œw3Þ÷jÞ«q´Å~üÔ¯®_mèEƒÀ N°báX@Û¥íb T¿êÀ‚ÌØ¨x£ßà3ø =C?>¹•ºˆÈ—¥hÛcÛcË êŽèšèP´B­h¢ ´z­N«í¯Z¾–Únm·¶ØD9嘫—0a”öIäLä QÍ==Ú–8?ÕÛWm_e øe©¹•""ëÁñØñ8l㛇9s@»@%×ô"½ˆËByÈCà9ÏyÎÿ/…B%ÅcŒ1–ŒWëÔºe¾J †aG8l‹¶¾1ñÄÎÞbÞïóû@}  ¼-)-«ZV¡îî7Þo4õ.O^ž¼< ª@U  š‡›‡›‡áiýÓú§õ&.2ŒBðb°9Ø mÚ@-ªùûÀÀ xú¹¶¤-é…p ø@1¨mñy¬²QDäÍ«â*yTòHDKñ®¡_"¾˜ï™ï™XfÎÏ|5󕈪UµªVdßþ¾ý}"ÝÝÝ"ƒ–AË EdÁº`]°ÊòZ,^,^,ñ{ýþ ‘î×»ç»çÅ2êêÈó†SÂ)–bo™·L„/âóØd§³ÒYYäyçÃw>Qÿ’7ä KÛ¶®ªª‘-·'nOˆØ mE¶"‘P{¨=Ô.2?0?0? ¢{u¯îñæ{ó½ù"y'óNæ4 U„*B"óµóµóµ"z®ž£çˆx×––––Š=÷‡tkºÕÒ&ßZxkAÄÚè<á‘ÎÎN×!—ßåùË“u½ëz%ò·3{c{cì¹â¹â±Þý-ç·œ{Ãæ©Œúü À˜q*µ­þ¾ðõÂרÈÉÈñÈqóGÏEÏEÏÁLêLêL*¨\•«rAeªL• ³‡fÍU§êTÄŽÆŽÆŽÂŒí—Å_Qúéhe´Ò`Ó yì_ï_oøÙÙ[bø8¦Óa„~ ýº¬_É¢Þ¦·™>¦n«[ê¨Íj³Úœd_kÕZµpá•”¿®¾SßÚ¬>P¨·ÕÛ¼P¹ þÕ¡‘ЀcÎ1¶ñŸ?ø˜*ἪzEõ Óù±Ç&bÀYí…öÂt~>ç8ÇAõ©^Õ  æxÆ3PÔ=u˜IàÏhcÚQÕ›ŠMí ~ªmÕ6 ògçy¿•/íí⥽½œ7ØßÀàýpIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-134.png 644 233 144 2633 13755454065 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜPIDATHÇÍ–ýKTiÇÇtÒìÅ¢¨)h!,Œ„¢‹ÌÜJ*é)Ú¬ ,‚Þè•1H–6¢Ú–¬¥~HÅ’Up3ƒ-û%Ì1£¢´ÚÝÚF)Im¨C§gîÜû|ö‡™Ç;å?ÐóËåœçœï÷{ÏsϹ!„Ã"O»Ån¶-[Mÿृ—~÷{ؾ CŒ#Æñ÷H:—t`xéðRã¹i«}/„‰ͧüb˜0Ö*kULfÄ> k§­6xTØ>åÛUÛÕ!ØvmÛ5€ê²ê2v‚ï®ï.ÀûÌ÷™`Új_Å«|…/Ž~Å/Ä]»ÓÖxk¼0qñÄÅ“v‡Z'ÁÊå+—tÄvÄJ èÿ $ÈLÀµº¢lµ‰Wù Oá+>ÅÖ# yaòB! w]î:[I8áy9p¼âÓ®Ç9N„ü!?€ž§çé‘bˆÓVû*^å+<…¯øXøòlùéŒwÆ!­ôv½Œ!Únm7š¼/{e/RI6þ2žO!ô:ô:ôä4™*SùzI¹?ÔjF3ìZœ×ÿÂ|^­­Öá7R!RŠÙÚmíþAÐ2¬eð'Ët6Q›È'ªñâb È€ Ç8Ʊ( W¸Â ˆ"Š€58p€üAº¤ Àh3ÚøÄÇ0>x?x?ØÞÚÞú)=a`{áöBà=€‘&Òi‡L×]t\tÀ“ÉO&?™lêPöéôÓé§ÓÁÛãíñö ¨¯j_Õ¼ªºÕu{êö˜g|˜Û÷nß«ŽöBCDXÓvWl¬ØØ¯cKèçÀÔÀTëﯯ[_gxCsCsC3¼(yQò¢sssÀáv¸n°Ú í…ÐZÞZÞZn [4ÑüEóaAñ‚³ Îö»ÆÑ0ÿT4V4*aM ½=ô¶¬â·7÷ÞÜ3‚Sûzûz¡rJeJe سíÙölhØÕ°«a<¨|Pù \i®4WÜè¼Ñy£R/§^N½ m+ÚV´­€óÎO8?Á|±U¬ªZUeòYª¤¾¾ ôž8<Ñx]]ÀpÛË ãŒqÆHß”¾)}T[ª-ÕÓß½µ{k÷VX²sÉÎ%;aÖÈY#gw“»ÉÝsGÍ5w¸j]µ®Z˜7vÞØyc£¾U_dÌœíru¹@é1+òM÷Mj# ­Æ%ã’ ö0íaÚCðäzr=¹P¦—ée:d9³œYN3nöæÙ›go†)YS²¦d}ƒ}ƒ}Œ{4îѸGfåJ Š3Š3¢*—б°c¡Y1‹þLæãbP½§Þ#„ø,„äÇÌ–#äŒ4¯HŠOŠOŠ¢/¶/¶/Vˆ5î5î5n!ºãºãºã„H®I®I®žgϳç Q7£nFÝ !ÚËÛËÛË…(˜S0§`Ž/2š3š…Ør"¿>¿^E|˜ÏrêNöl!úõ èÊ`¤KÚCÏBÏÌŠ÷üÚs¢çD}‹9Áœ`¼³¾³¾³‚þR©¿Ø•{`t`4ôf÷æ÷æ#Á8iœTcÉHëçÿ²+SŠÀæ³ùüƒÀ«{õ~¼e`l46ò‰_É[ò–¼²T–ÊÒ(ÿ9FŽY dH]~–Ÿsø×˜iÌä?*ü–„–@·uØ:̱¨ÉÓê´D&ÿcý1`Õwè;и@=õQsh?ûØò¦¼)o%S< `’cz‡ÞÆPK¨E¹µFtg¬3VUê‹ÉÿÍþ+¿ÙÛÅ7{û6o°ÿ­8Ds´ìhIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-71-red.png 644 233 144 4050 13755454064 15601 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜÝIDATXí—LTWÇïû1þ„EISPfÖD]!±¦2 Ã:ÚJ“Q[±]mMº vhšÒâV'PT¶KR ÆìšnÈ8£¤AŸeÃR©i6ìvi¢ I0D11‚ü˜Á‘wßýîóî{o&]Íf÷ü3sν÷œÏ;÷ûî!$j‹HŒ‰ùsýsýsýÂS-0§}Nûœöâ<™ÊT¦}$¹$—äÑaÖHd"™û@¬Ïù|¾žçãùcë‰ù±\v—Ýe7|>Îçóõ<ÏÏë=Ÿ‡ˆ›býô/ÄCC¹¼Ci•i•i•ôýó·Îß:‹-> > > A‚„0¦0…)C ûÚ8ŸÏ×ó|<l½ô/žÏG¬‰â°8,ý…'°÷Ø{ì=ʯggg1ÍX6ËfÙPh­£u]C×Ð5uR'uš|mœÏçëy>ž_Ž©oMÔÑŸà|„Èõr½\ßú_àhtÔ:j§öºAÝ€ Ò:íölHÉQrÌDÁ*S€ªöª½0lF[?DŸÒ§€Òù.òÀ>`¬A>ÍÑèht4*N^Ÿóp>b¹o¹o¹¿uŸ`õX?³~Æ2£¾@&´6¡ýÑfb|?ü@?§Ÿ²sìœ1HOÑOè'F¶Àh`40Š «Çê±zXçÑùäÃòaùpo=8[qæÙ™gì]-AXñ…„@[g['€ÈÅò‹åàûÆ÷ ø}‰pñòÅËðý¡ïágì†ë† @ÄsÊsʈ*¾™+3Wt7|¶âlÅÙ ö®ÞÙ>ÂF’³’³’³Ð8Vü¤æI‘¶éw¦ßL_ž¾ˆ¾÷ J¢ ~\ð£9~lÙ±efÀîPw2?ÎüŠ–-ôM·Ñ}tŸQo¬x¬x¬à<œƒžÜqzÇé§'£ƒô*½ `„‡"s"s`¢g¢Ç ròÓ“ŸÀò{Ëï-¥¥Ð%uIæàŸoä¿‘oZ>¢®RWtvÓn£>çá|(®¸ú\}®>CBt ÝB·˜X K1ûÕÕ ¦‰iЖßfÀ”oÊgöwwÀ.ØS8¤®PWô}›¾mÔw­u­u­ÕÏí+¼£åyÍyÍy͘¦É4І6´á7(A € - æÂ{k÷ÖÀ«¡WC1$2èKô%s¼$\€|g¾@D ÷©D%Ëa‰,ŒÏ¶/¶/¶/Æç#¢StŠÎÙÇüª»Pu¡êB•IófgMõ"?½÷Ó{æ­¼Þy½Ó ¤®TWF妌ŀ¶–´PòßÌÓˆÒË3ƒ3ƒF½î¦î¦î&½“‡„!GÈ™}L¤õÒzi}mËlËlËlËhz`W`W`—ž È6ó¯'rOä`/ôòG ”*¥f ¼†×€n£ÛÌá­õ[ë„ ­…Vú˜ºO݇Há@8dÕfÕfÕªú ¥H)Rʹ ’P”P”PDˆ|S¾)ßôë¾Ë±È±ˆ‰L@uGû ÿºŽu¯罞g¡Õ´€~žÆiRZì6Ö?¿~ÿü~V¦k2ALÞú]œÏÄñÍ%ÏHÍqÚ-ûívù» í*]J—Ò¥Fž¥>K}– ¬ž\=¹z’fêZ¼$]’.ýa#—š&½xÀ_˜1'0´;"˜´Ûdm²6)IoÀðˆ ‚&9©»ÃÝáî0޹En‘[úµ¿$óÿWW‹“/Œ7¾à-M»Wÿ“v ·n/Ünh׿ѿѿŽŽ3}'„r¡\(ßR«+ÿÒ^¤Ý|©Aj†ÖpàrO¹§ÜÃ~Ÿ=“=“=£ÜÖ·zD‘FÜi¤•´’V¢;R ®Þ\ò?Z¼vOÄú…÷„ýÂ~a?@JH )QW‰KÅ¥âR@ Èß¾µ…ma[˜©Wê•z…¿j wÇíÜÿÍ’ôoE¤ˆÉ?ÄX!2‘‰ :…N¡óá/£ñåþ¸ŒËû­þ7êúã»:üYIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-7.png 644 233 144 2046 13755454064 14610 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÛIDATHÇÍ–OH\W‡Ï¼©ŽÔ(¤dH7u dá¢ÅH ‰¨!³HiˆXAwi.b›…(”¥3Y(1ã*‹ÄÚI%Ðnj#IÁ þY¨g¨ǹï~]¼wç=Ó,"í³νç|¿óÎ=sß‘÷WÀª°*¬bÇ·¾öÖ Îœý,îø÷êu¿ ûö”Þ/½o¿ò|³oâýù"߯gÖ¥D¼…Ðhh4PãúÝpùØåcŸ:þwÓÿ…o<x8üp˜o`5±šx[ó¶<ßì›x“ox~¾t¿§/yOòžþ‚P~(_Žœ9ræh»ðçQ¸pþÂy€¥àRP[ Ö€B u "…±uŸoöÝx“ox†oôŒ¾SÀ¡êCÕ"péÊ¥+ᜄW?B×á®ÃFog¸Ã !›Ê¦ÔUu•mÐÓz€ð|³oâM¾á¾Ñ3úN=²ûl¿¯…†‚†‚\A?ƒšQ3@Ò®·ëÙq7´~®Ÿê§ ‚ÊR¨fÕ¬šA«"UúK}JŸÊuR“²ìvr¼ßè}ñôy„Wë©Oàµz­rÀs`_³¯±…gÛl³{/~gôzÜÂîý7oß¼K>î;§CÝú–¾åá" ‘…ôWõWõWÁÐÆÐÆÐÄB±P,sÃsÃsÃ^¼þ%wäNwñíãž¾Såôíä„ÈéÎÓn%ð…HàQà‘dD伓ÏyÁ ÉÙRÇRÇR‡H¼<^/™x3ñfâHK¦%Ó’™­ž­ž­öâµ­ƒ:(bx>¾«ç×?9!Pü¬ø™…Õ«'ü-× pŸNÿû|쨵£ž?R1R1Rõ±úX}̸Ì2Ë@/½ôúy9¾kFß©G ´¨´ÈþÖ—×—ý{½¦×|yI’$Zj©õ–7Ç6Ç6Ç ²Y‰¬ÀLåLåL¥ïâvÜŽhôvñ×=}§ž=wL5©&Õäùéô@¢­ÑÖh«¯ E{Ñ^æ™gÈ!³§Ž‰ˆüÚ 6læŠú ÔˆaØb È’% jRMªIררר=‰žDOÈηóí| Mšô®V9<ïê}§wø_^™¾;}× ¿‰PG„Dä€Ä’¬dE‚á`8ö†z09˜LŠ´—µ—µ—yëÖ”5eM‰HžäIžˆˆdÜQwxßÕó뿼øÿÝcm´Ñö¡YúO÷ØGÜüØ×íëìuçÄX)%”]tÑåÓß1GfâÝü¿ù÷í»rß~]ìÛï±ýùûj™`Ø0'IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-21-red.png 644 233 144 4157 13755454063 15603 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü$IDATXíWmLTW>÷c­°#$[A†5ƺB!fÕ¥•ëÔFl°T±‚®¤&­"[²U²È*IK0XmÍ„AÒR¡Z5hEÛ®®‘6kË *Û˜" ƒ ÌÌ=÷<ûƒ9÷Þ™ÝÕlvß?÷¾ïy?ž{Þç=g†I™A"DÌ4{̳G b¦´NiÒºj™Le*Ó®I:I'éÀä2«&2‘‰Ìu RgÕÜŸÇó|<d=13_))%¥¢;r}æsr«Ü*·º‡„ÝÂna·Ä???‚³y·ónçÝ6ÜßpÃ} ?+?+?K×ù:÷çñ<ÏÏë=—Gês>GÅQq´/ïPRqRqR1}§ñjãÕÆ«ìß oÐ7@‚ ~<Æc<Ї>ôš^çþ<žçãù#ëÍùðÉøˆ5VìûÅþ¾¯x‚¬Î¬Î¬Nå÷½¡ÞPo½ Ke©, -§å´ ‹ébº ê ƒ^çþ<žçãù5Àõ­±4Á-¸7!r¥\)Wº¾ç¶jÛAÛAÅ¡{—aGàS\Á†`ÀúBwCwi­Øa ò b@0ßGÇ蠸߾ػ¬µÃÇmÕ¶j[µâàõ9Ž˜î™î™î­ùw°VX+¬l®÷¡÷ž÷…óøhMèçÐÏ€ntz íS¾f_b;¹i“ûO+i%;ÊŽêÞ´†¾Oß×TŸ÷¡÷¡÷!ñú†OÞ)ï”w^¯ä õEõ[ê·°7à üŠ;t&tÆ€'Ð}±û"o;Þ§Ïœ>㟌bNÇé¸Q?›6@ ¢¦¢F·*îàÁ/4Õ__T_T_ÄÞÔv6añ)ñ)ñ)¨Z5´jh•Ö:Éü›/츰Ä›âMˆ?H i€v½° ÆòÆò àø s}çz˜ÿÞü÷À>Ë>ËБdº•nÕqóúÇÇþiÝ¡u‡ÖÒ¿Œö†ö†öà¦ÌÊÌJÈz5ëUãNõô“œÚxj#\;}í´ÑΟë3×gÂÔ…êB€öÒKô’^ŸãáøÄðH=g²›ì&»6cfR"B~ÍM+Ÿ]ù,!„8¿q~c<)ÔÏÔÏŒzp{p;!„däeäAÚnÙnBÈÐwCßܧF!ä$ù”|ª×75›šMÍÚÈóó•.«[V·¬w&„ aBЂ´€áìGö£qx”•àpçáN0Ï6Ï€ìÙ3`âÂÄ`óØ<ãÎçúsýéÈt„Í]*Q ÀÒX,‹ãÞYqYqYq¸ÃñÑ!:DGè—°¡úDé‰Ò¥ Lå¯÷_¹ÿ €@zWz˜Ï™ÏÀ¡–C- ´+íF`ÊÊ@]¹.Jæë™¯FîT°7ث׻T{©öR­vîÒ„4!-ô ‘–HK¤%ûªø”%϶ªV•Îñ¾ÖóyÏçZ[±¥lKX?°~€Ý=x÷ ÈØócÏ@Ðô€ú–ú–q}MåšJþkŽÀËÜ®nU·"à‡ßë÷)ûRö¥ìSµ @š)Í”f}Dbì1ö;!òeù²|¹©_;ðóW׬®¡e€ÏåsªÓ’lIF±D,à7¿d~ Ä.±Ë8,Ç â_Å·š¬&-o[Þ¨“gªÖêâÅžbê×–H%RÉ­‚I}Ú‰”¤Liòò}Çy€³¼´£´ƒ­®à %®‘6R0àdÜÉ8>×—®/à˜rL€ŸNütÂsöN;@‹ÎåËÓ[ý—Ѧá¦a¼¬]¡Ub•X5±JH…Äß6F”njóµYp î• B“($„s„9êÛžŽ¶¾¶>x4î–©ÛÕíÿPXX”º‚mgº¿¯¿©¿¡¿Hžš<=yº²SÛÉýÒ~i¿Ó¦AsqÈVk6É&Ùò~â&nâ&DnH7ÞiÓ®Ö†$)IR,Þ½==Fî†ì!;ÐDš€± VÀöð஬€Î§óõÏÙô·M·7ݦeÚ ôX•G=v%ìJØEˆhm¢M8FWÄaN? ¤;ÒéŽÐ>wÏÜ=s÷b*6›Š=4îfÛ²mÙ´L§êTÀ<†1ŒaÃT/  è}ë–Ö-­[ÊVhw¹Åd1Yú'&uëÔÈN ç£ZO„(õJ¤njJ3¥™Ò¼§tî:Ëål…vY‹bÑ©Ôê‹Ý“¿e<Óº§uOëfy'cÄ1f㣨øQ>3y²Aª3pw³°yežÐ$4 MüœSßötx:<:w•¥CéЙ;ž0ž0ž,Y4²h„Î׸Ø,5KÍG28ÕÂÔ‹ø+òÑx»Ò€»µÖZk­bñ6y›¼M €ŽÔÙîlw¶ëÇŽÜ 7È Ýá¿$ÓþU7l'Ï< `´ð€aîžþOÜÍY›³6g­Î]O†'Ó““ëLë„P( …+÷E–‡£ê ä¿”§q7Sª’ª¤ª¾ÅpaEaEaûsj05˜Tþ®µz@œIÄE\ÄEÂÇŽäªg&ÿ£Ds÷@¤žÓ#l¶ Û’KrI®ºPœ%Îgˆ@.^Iö'û“ý„H×¥ëÒuáB8° ªsÿ7±hovb'vùûÈå½E"™Èá¼p^8ÿßLÚçy¢:Ó•÷©­þ'Ž9™ÕÕT  IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.3.png 644 233 144 3033 13755454067 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÐIDATHÇÍ–ÿOÔ÷Çß|i¹³;]Í]4hÃ¥ÝpÒ\œ‰˜XˆhìJƒlcV®L×_8K$K&[ŒñpµŒºU‹1[#Ø£Å¦Ò ‚_&¢sXË5z|»^„»û¼ûáîÓë_àç—û<__žÏ×}Þï×ëýV ”R*=þ« ÑšhML‹áÄ_vS¡©ð¥¿ÆpKJJoý–_z`Ù©e§´ë~=~q¾Rÿb=ݮҕaHiKiKØÇõðæ+o¾búQ é³Çìyw>çs€ÏZ?ke|wå»+3›g6ƒu¿¯çë|‹ùUýô•‚g¾|æË„qHy6åY¥`õë«_ÏúM,àno+ÞðmÒ·I’Q?Jªl‚ÑŸÉEX÷Çãõ|Oç×õtýX= žÏ>_)()/)7ŸŒ%Œœ—ÅeÑõÂà I…H0ˆVD+˜é“>Hë~=^Ï×ùt~]O×Õc,å”RJ5nÇ´cäÇáþÈHxex%h½aoØK8^©È[²SvBäZd(2Úíöã™cšéï‘hÿ ‡Â!‘áÂ/€¼ã‡ßáfu}})ÿ®”R/ÿÌAs0˜,ScýcýÀ.Š@ò$—è¥D‰[(ýÿàÆ°`Áb˜eNædø9 ù’OˆÎ8U\/®Ïh¬žøkùZº«ªt:íg·-ÃÃÃÃÐô“¦ô¦tdÐ;èô‚wËî–Ý-ƒFw£»Ñ ƒÎAç ÓðkSÚ”6eà›÷oÞ¿yŽþâ¨í¨ {8Ò:ÒjèÉ?ªLU&}i[¾VÚÏ•Rj¨:>êøn]ðö–ÝÖЪ–U-Ìç¿•_–_™Ó™Ó™ÓÐéìtv:¡À^`/°Ãvëvëv+¬«\W¹®®y®y®yŒ‚.\¸ éîtwºJ—6”6€Õ»ªvU-óÿùóLõLµìO²'4O¬½þ\ÓsMÒ¡ùÐÚ­´oҾѼJû4Õ™ê”6˜˜€¾ýÁí`ÉJÓ=Ó=¨_ZŸVŸfµ··ƒ­ÏÖgë3ì¹{r÷äî†Ó §NöCþCþC~(<‰ÄºäÑ€ï¢ï"ø’|/ú^D|¿ômómƒ'®'®'.à'8“™“™“™ ­ÐVh+@ФHŠ`²r²r²¤]Ú¥Â9áœp<ô=ô>ô"Ñ{ .|ht%#ÎÕÎÕ‹º2öbÌ1ÐçJ|Î,ˆE,„¾·ìb»@ jAÍ8Š«XÅ òHÉ£EöNùB¾9%Ò ÅRLH’cü0Ì`2_ýßÓO€Æ-üÞQã¨9›Ìò¯hj4äÓH  ÌŸè§áŸôÑò•ôHÐJ+­À,3Ì€ Ëu¹NìôáwÑÁè aéŠLD&€¿è“ÿ¤7’€ùNþ§÷¬|joOí}ìé¼ÁþÝN´Yω¤IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-30.8.png 644 233 144 3114 13755454067 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–íOTgÆïF„ 5†T^¥‹é¶ÚeM*Õ¶ÉjÄ’ÆÆ'øRíVÝ6[61›´‘u·»DwK vcÃâ–†Jm4dÅm´Áꪫ ¥85¥‘ApÎÌœ¹ûa8ΤÏ—“ë~¹®;ç9ÏuI{ ؗؗØD°½&Ÿ÷Ƽ7ò¿ˆà&l•¶ÊÞƒòiʧiŸ§}þ!Š­¼UÛ/åÕ³â’*Ñ€ó¤ó¤­|ÕË«—Ï{6‚ÿrO%žš Áޝv|ðeó—Íì…áK×&Ê'Ê!Š­¼Uoõ[|±üòÑÏôEÀqÆqÆ6Îg‚d¿–ýZÞo"wò`ú ë~Šû)Ní`ŽÉ$k9àǵÆb°•Ÿ«·ú->‹ßÒ³ô#ód¬ÎX-oU¼•x<Òðà øà¹ž³ô‚§€:êH†/ä0ß6߯½¨°aƒ(¶òV½ÕoñYü–ž¥™'º•³""] Už*„o»BƒÁü`>hN¨8TLpnRÕUZ¢%º €Ðz€èzÄ(£O†ƒ¡´PÁÐ`03˜ šᇪ‘ª`ÒÒ·¶ò¼ˆHáß Ñ—èóÅkØÓåé>à× .u1Ë]=ªGõ(°’•¬ŒÄ… M6ÙѰÎèŒÎSG€®ÖÕÌÒ2Ç¿fNoNŸ‘y¯ˆHÓ·ÊΊ]ø—=ƒ76ÜØõ¿ª¹þeôvÓí†Û QAËãò¸ aaÆ…0Ð7Ð7Ð͇gÂ3á™(îù¢çDÏ ¨ÿCý‡õ¢·ÿؗЗÕÓŽÎNkk›¾óªˆÈÿÞ‡Óm§Ûà¿ëîdÞÉTw꟞YöÌ2ŒŠ­UU·;owÞn¸räÊ‘+G ¬¡¬¡¬\†ËpPp¡àBÁðâÅó"¯_/¾^ ¹M¹M¹MPiVú*}[¸äê’«}¼ßx¿Q7´¶B¸&2ݶ#i2iòÅ‘Wç¿:_äÑ×C‡ÚŽïé|÷Þ»÷ÄéžrܑܖܖܑÖE­‹Z‰8Ü·Ã-Òëìuö:ERJSJSJEÚÃíáö°IùDäè¹Æ®Æ.ɨU÷W÷‹œÛwnß¹}"Ö@k UäÁÍ7Ü™˜š˜š˜ñ6z½"Ó£Ó£Ó£"9FŽ‘cˆH–dI–HOMOMOHþþüýùûEÚ··ooß.â¸ëèttŠ\ÚôÝÄw’!??$¢¦Ý´ÛúDÖ7Ö¶ªm ýοֿVÝ+_/òy1ÒßO'ý¨ê¨ê¨êß-ß-ß-p'¸Ü T’T’TkÖ¬…á³Ãg‡Ï‚+Ý•îJ‡ÞÆÞÆÞFØÞÞ†Ô»©ß§~o®÷¯÷cŒÿC÷èuÃÉOþúûÈj, ,‹êÑ·+kWVÌ©äëŸùØ"¾¢ÇŸøØVÝʬêKúè6ݦÛ@ ´@ büê°ÖÃÀ¶°%&îU¯zAçéb]  ›t³ú‹¿Þñ\ó\HœJœòÅóoËÇ,ç7,çÝ·9ømÄ™µ#4š>3‡Ì¡¨ósš6Ú@¯ë5½tÐAðqÆAû´[»‘¹ú™SæAí ‡Æ¿[ο9~s²<²H3I’Ú?$‡s¸Ì!©P¡>‚1±>­×ûu<_çÓù#z@&g'gä’¼%yöc‘†¶È­®­./\Cr/÷r8©*ªB’Z¾–Ï7¤¬—õ$IM¤ëóz½Þ¯ãéø:ŸÎÑcl¥€ƒŸR[¦.S‡5Šá á ¤¼¨ÒF1ò3¹\.'Õ›ê õ)Їâ!ñ&ºrý‘zR¬«–Ú9í)FDðÉeƒËI>òmåc˜\BÚ»ì]Jéß1žÔ.’$ÝüYLSøzˆÐÁ&ò¾¼/ïÇ9ÄC/) IRL×ñü^¿€òfûÍÖ›­OGmGmG-yÐÐÐO6ùš|M¾!VZi%å~¹_î7Ò]¿vÝêºEùÇŠóóÏÏ׳b:Ó×U­«"ù4¢ÇŒàãÓpæÜ͹ €éÃü+y¾<B^¿·Ø[ ÓóOžg=ÏÔnµ[íVe®Ê\• 4ô4ô4ô¾߀ohv6;›Â# È>Ù'û04¼ó¼ã½ãaÚSÔ_Ô¢|rÛœàœ €Îˆ3V8Ü÷ŒL Ë›åäÈ@†éØBÀæÊrÍqÍ   €ºµukëÖ]]]€Ëæ²¹l@®'דëRÛRÛRÛ¤"©€eŸeŸeP¼³xgñNàBù…ê Õ@rrÊÌ”™°E…CuVV?€1¿Ã?#ÓŒo,—-—9¿Å½Š{X‹ÐŒfôäµy’w}.àßèßèß¶¶¶[×<ºytóh s°s°sèKìKèKüý@{ ¥Žò1åc¼FYܲ¸Ùª¢*¦ÛÑŸÿ¯ÖV¯8N2‰$åýÐgßÍnÍn%Ï”œ)9SbüÄ+ëVÖ­¬#'%NJœDæßË¿—lßܾ¹}3™^‘^‘^A¶×·×·×}‡.>\LfµÌÞ:{+ßDÝg ß«°TXH~ÑcœÊ°o›oɇú©ÔÎkçÉþCý•ý•”¡S¡ã¡ã¸.®‹ëd°0X,$EŠH)¤tK·t“Á“Á“Á“¤p‡p}ƒê`Ï`å‹ù½èEÌ©üÝgö™uÃ=ÚÝ7HûSûS%Ž ¼ ¼Âq3$Nˆ1>ö9=ôBŠ0®"Ê4™&ÓHùB¾/blcwq)åUy•äJ±Ilâk¶Eñw..ÅøØ³ÿø@u^¹Ü²Üb8?mêcõ1Éï´mÀp~VóO‘²!z•±Œe$ûØË^R¶ËÙB²uÈù7ˆ ³H»¬]&9Lwþ(_èmçwïÊwöuñξÇÞÍì¿@¶©²‡øMIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-37.5.png 644 233 144 2773 13755454070 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܰIDATHÇÍ–ÿOSçǰÚVtÐ,YÞa•l²ìºh¢›évµYÃböHÈlD½Û]Dš›,,Ñ»é6Wµ1 ëLæ’†@5Ĺ +ĹAv/•Œé½—„Ú^…¶çœçuhÏNãþŸ_NÞŸ/ï÷ûä<Ïç<„B,M=d>šùhfNg¾nÄ-/Z^\ñEŸP!ã北ÿ¹Çr,ó.ójCÖóz}z¿ºžK…0·™Û2ÊR¸ªž¬zÒbKâÃ=`õ[ý³ Ô}Y÷%@ÇéŽÓ4Àxïx/@¸,\Öóz½Þ¯ó¥ó‹æûô…€…] »2þ æEæEBÀò-Ë·íNÜ,‡Ýa]0º@f€:,a‰,f˜A_ÓiXϧêõ~Oç×õtý¤ù¥ù¥B@¹³Üiý4Ù0ô9¼SðN®—ð8ÀPf”õõb {dd€õ¼^¯÷ë|:¿®§ë'ýŸ2*„n†ŠáŠaÐþ¸ª¶„ dƒÒ¬4“S<ÆcH%¡Ì*³ V«NÕ jŽš£æ€|N>+ŸÅX FªïÆÇ“PŸHìNìÕžä§²"¯"O7øáfãS~-„«Ü`±Î̘¤6|uø*ðÛ@®•k‰ò¹ÔQG]špœ8ñ4,‘È4"D¸Ç=îÈÇåãDSÙmÒKé'­r &„âÄÉ®ò]å:›öÔ?CŽþæð¥Ã—#ŸŒ|4òŒeee{Ü=;-wZîÀóó3Kƒ¥ÁÒ4ßGãGãGÁÚÒ´}h;Ä]qWÜ…#…#…#(Šÿh,à¸n¨ë¬ë¬ë_«¯Õ× ËŸ(|¸ðað-épu¸˜¥_éõÙžlvC¨ù‹ƒ‹ƒ² âñF8Òí xð‚kKÙ–2C èZѵ¢kÐ~«ýVû-ðÕøj|5°®q]ãºF£n¾{¾{¾&=“žIt:Ø¿bÿŠý+Œºu9ÏŸ ‚'Ñjj5ÄZc­ þiñÈâÙ&¤YßcíÛ7Âí}ó›ç7ËÚ?¿P2Q2A,ï—¼Ÿò~‚ò®ò®ò.ƒØ‰'p°é`ÓÁ&#>Z0Z0ZkªÖT­©‚¾};ûv†þ ýú!÷¯¹»rwÁkáê#ÕGˆÍ} kÁ7èy7µÇRÿ²+\ª7Õ›ŒSÿ`®l® &þý5ŠTO©§ÔS†ÈŽÈŽÈˆöD{¢=F\si.ÍÓîi÷´ä¹GîeŸ²OÙS¦ÉÙÉY¤v,±-±ÍÐã?õ«êWéóìÄÁ¹ûæØåä\‘Ÿþ>Çje-Q¹H>$‘IÛD5ÔP“†g™e6m¬õÉ^Ù ò/òUù*€Ü(7•E)þ‚áàpÀ¶†gL\Óç˜~Ðcúä­\P¹x;9™åE%¢D€“ê˜:Fâ÷1š ð6oñVš±_fäÏrPS©úãjH ‘_+Êp&É•¦J¿ò?¸ÿÊövñÀÞÇÌìÿÞÙg×à3«IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-116.png 644 233 144 2647 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü\IDATHÇÍVïOSg=--åF(TÅ,BâVtL¢Á,Mü"$3šš1DQ„dsjÀÀ5ÑDIü­Kˆ&›¡ÉFœ€`ˆ&,"nsÊ'ZPÃp,vühoï½gÊÛ[åàùÒœç}žçœ{ß÷ž¾  S¿ ÉÆd£5„ßëù˜U1«>ý9„+Ұΰ®{?&þ IÚªlUê‹uQÙèó#ùD ЖZK­!k "7¤oHI á“Rª“êÆ‚ä¶†m $yõâÕ‹ÜI¾¹óæIŽff‘:ë¢^ô‹y‘óqè#~€4_7_7ô“–hK4@¦¬LY¹ 8Tð|™½&{ IF FiF’$•¿IÆ2VË"é£"F"°XŸªýbž˜/øHȹ™s3rmîÚ\éÇPÓŸÈÝI»“Ÿ\Gò03– ú‚>’Tò”<úIÍ£yH’H‹uQ/úÅ<1_ð þ|¸·§¾¢–M2H’r© (¤+—È%”µ?´qmœ? 5VUcI­MkÕZõ¼¶I;¬¦ì ¤R)«ò+ùUø;è_/¯—IªSüúVÀ¢ ¥iÀg"½ Þ’M$I—â‘Sä޳‰ýìPRÏzÖ“ŠGñ(‡ÃJ+­¤öRëÕz#ò?¨NÕÉq:BóI¯Ýk'9!õKý>“Ð3%¬²Üq`Ç’£$©.ÕÊå=òýÁÝÛÜîò¡ã¡ã¡ƒÓ½ݽݽìzÚõ´ë©ž÷6x¼ ä)÷©³§Î’÷¶ß+¿W®¿qÍâã¿;Šw‹­­lŸv‹kòkòÃåßùÓüiôoþusëæV}ÃoLܘ¸1¡o<¶ñØÆcúzËœ–9-sHyH’‡Hç[ç[ç[2ûhöÑì£dF~ÆúŒõäÃOîß¼“~Á§ú«‡«‡…°û»@ZÛ¬mZ-Ͼ¾ûú®NH›|?ùž¼ôù¥E—‘)e)e)edsZsZsš^W=¯z^õ<2iEÒŠ¤dç‘Î#GȦÕM«›V“‰‰‰‰‰‰dQEQEQYúKimi-ùcddd$â,ʯÓ_§“BˆÊŽÊæØ  ðμ?úBô ÷InOn0pþàüA`òøäñÉãGÞpÞpÞ0`/´Ú €+à ¸eŸ²OÙĘcÌ1f`ñãÅ?.«—y™@ç‹Nc§1<æ3LC¦!@è1j£Úhø JpMp `.¾„ 6]€l“m² @ÚІi¼¼¼ÐE]@BcBcB#0«jVÕ¬* ð|áùÂó€µÛúÈúxìëéë ·Ïåg]]€Ðc|Y¾¬®ß`ºå¹å0Üjpj³µÙˆÎ¸¾¸¾¸>Àl2›Ì¦éÂâOÄŸˆ?ŒíÛ;¶È<™y2ó$°Ä°Ä°ÄĕĕĕŽ|GŽ#øÖ\ð²à¥˜Ï­Q-·Ko—BÏÅïßžÓžÓÀ×›Ê7•óþÄ,0X„«ÔgÕ/¯_ƒ´TrJÎé®5\k¸HvÉ.Ùõ|­ÆVcFÓGŽ.lu¶n[7¥â9žÃ‚'Àø¯ý`ûAÂzÂ>FéôÆg"Ÿ)Ï”ð™t‘j¾šÏñgð‹oéƒ0À@.` Hէލ‘‡<9X,ã¸6ö±eÞe$Ç¥^©wšE8?s,9’jØù»”.’¥H)¢L7;Ø1Ýùi¡…’çXÉʈüUö°‡šÖ¡¤*©”yNÙ¢l‰p~%Ç”c6ñóÏØÿÊ{»˜±÷±Ðq¦Ý`ÿ,etõoêuMIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-50-grey.png 644 233 144 6227 13755454064 16002 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü LIDATXÃ…—{PS׾ǿkeçAx?Š`UJÊCaJÐÓZ¼­¯uÒÒ¡ŽÀEÁs‡ê--Ž ^ikKj½=U žâó4 r‡‡÷HµZŠ "5J@ž I$ÙÙëþAgœéô÷ÏšµöÚ¿ßg­õÝ¿õÛ¤°°°°°>˜µÉÙ†&p¹‡ÜCV_ø}á÷…ß³ õ°zX=ü—(æË|™ïgÿÁóÁ|plæŒvF;£e%8Š£8Jò‰HD¸û¸ ™Èd%ÒÍÒÍÒÍ$Ÿ↸¡ö£d‚L‰*‹-(ZÐx·8­8­8øP>”%¯Ír?9¹|èà¬ÁzJP jA-üd3ÛÌ6sàJuºN]wJo3Ø 6CÃMË Ë ËŠØÜËÜËÜËp)vCì†Ø $?N'Ž+ýVú­ô\}×s×|×û.sþñ\ñ]<.>ιƒë˜ób^B*I'é$=´L* …63W›«ÍÕ/øù7ø7ø78ön¸¿áþ†ûÔ¾¼{y÷òn²Iš/Í—æÃ‚}؇}à ,¶c;¶Xˆ…XËÌ¢™E3‹°©»¥»¥»…Ù›"›"›"…½c¯Œ½2öÊ;_ÉCå¡òе2Gº#Ý‘¾¾Œe° –ñ0•€€€®#O ž<Ђ´,òä´œ–Ó¶ÔØ¬6«ÍúBŠâeÅËŠ—ù5[woݽu7wÊÇècô1B < gá,zÑ‹^ð€€iLc@">ÒGúÀc£7é5é5é…çŸ;|î0Ÿúàꃫ®r7$n7‰Û£Ëüf~3¿9Q…D$"qÀDÝÚÜÚÜÚq8Hôßÿ´\¶\¶\~!EñºâuÅëü¦Œ´Œ´Œ4î†w¶w¶w6øëüuþ:  …Bá¿#ÁùŽ|G¾È#c d6 …à*‡Ê¡¼Ç½Ç½Çàò¯Ø¢Ø¢ØÂorÅwñ¸øˆº^]¯®m¥­ÍÖfk»Üæeò2y™XXÖPÖPÖió9ásÂç([ÍV³Õð"7ÉMrÀ f0@ )¤l°Á@ $¢h©HE*à”Æœ *A%¨ZCkh Œ“ٓٓÙ*<+<+¯)=¯çõ<0== Tî¬ÜY¹¨ÐVh+´@MMÍüüѮѮÑ. ²6²6²v~üÅ^üàÅq‡¸CÜ 4 4 4àY“Òwé»ô]¨@‰¤¢`Q°(˜1Æãñèçsø>"Cch ˜ëM.ËãòÿAÿAÿA > > >ð|Éó%Ï—€ã¦ã¦ã&àᣇ>L™¦LS&à9ì9ì9ü/Ñba±°À6lÃ6À1âqŒÌ=vÅ™;ÌæôSUP;ÃÉ>—}.ûœ/í_п ÷·Î²Î²Î2’¿’[É­ä`¨@ ùF¿~ý· nÜ.â&q“¸ ˆJ‹J‹Jz =†`xßð¾á} 030300­5­5­¥í´¶¬”•²R€Œ2jÕ©t* rQgÔñ…¬_Ö/ëçK)¶b+¶å ¹B®ä767676;S«§VO­†œ T Œš/5_j¾š‹š‹š‹æ§§§öeöeöeÀóíÏ·?ß,ܱpÇÂ@{c{c{ãüü®¬®¬®,€Y².dfœå—Î^:{鬰†èˆŽèð?ÄAÄqLBƒ®] ºrp¿D)QJ”ÕãGÆŒ=83ufêÌ”c+=%·&·&·bæêÔÕ©«SÀرbM¦&S“ $~œøqâÇÀ’ÇK/y $J¥‰R€Ÿæ§ùi ¤©¤©¤ ¨3Õ™êL€rP9¨{Nÿœþ9=¤ç=Î{œ÷,ƒ/^¤7$_K¾–|Ý¥²ëíz»~¯<.x\ð@+ZÑú|¹xX<,þÉmZ;­Ö¾‘\‘\‘\Á’S§,NYL®<)}Rú¤l h h Ä·Ó·Ó·‰ ‰ ‰ˆ˜ˆ‰ÀlÁ`ºzºzºè=Ý{º÷4àÿ‹ÿ/þ¿!C!C!C°Ü.»]v» ÛªTUª*.ʉœÈÉÓW˜ˆ‰˜(v–b)–ÞÛ)Rz*=•ž¢6REªHÕÔ¸Á n·_׊kŵÛãg4k   !ÆÐ¡;CwâÅ æ æ fˆ} | | ¢&j¢°ë±€j¨‰¿Ä_âÿükð¯€ÏmŸÛ>·a4jZ£§¢NEŠâo8ŽºI4&}tÉHFrm9JP‚n‘³ÌsÄÍÖÜRNÊIù•š@hÂ^-vc7vÓo.Ö^¬½XË™Œ™Œœä’\’ £P, Åâ H@Ã1ð!>〠¤‚tN‹^—Ë/—_.wì™87qnâW.] ] ]ðCqÄ_D|ñU3ŠP„"Rƒ>ô¡_ïªGÝ¡‡zþ.r‘‹\¢ú1êǨKß”íííø¡xbÅÄŠ‰Üä¹ìsÙç²çµKH À ¬°Â ̵®|ceVf£—è%z Òëºëºë:–Ü:Ý:Ý:-*u÷p÷p÷xj«±ÕØjòÞ-º[t·`:¦c:x;ÝœtZœíiÁCð<àÝù{çï¿¶\[®-7ï »¯»¯»ïÃÓ÷ëî×ݯ•Ö¿UÿVý[,™ä’©P%T U`³ÒØ›bSá OxXŸèžèžèðCCLCLC ¼Ý îw Ä ñB|ÞAzˆ¢‡žÒ£ô(=**w.ó5×@\+wþ’H]ç‰JÑ€48ö5d Y“üæìÕüû.û.û.á¯ïïï4aù¡å‡–Âf¡Gèz §KéRº3|>ŸÏçCúmø·á߆;" « « «E½²YŒ,¦tíìG³÷† 4‚†+wžìºN¬¸¸¸¸¸F׎Â90§!§v÷8µ[NÊH)»ò#UR%UîÕ"È ßÔÙëìuv~×dådåd%ä”RJ)¦\;Ñhm´6ZË€f@3 õÊöËöËöß½438383¸ÿ«ÞW{_í}p*\ùÔ8wQ<{É>3AîtpÍ©ÝD]ˆºu¡ôMY–,K–õCñDðDðD07y¶ðláÙBÇgEïÝí×í×í‡-m-m-m$UÞ#ï‘÷‚BPŠ¿þĽͽͽm}),.,.,ŽŽ;ãý›ë†z–K„?°¤¤¤¤¤$ðÎn7“0 “lÃ2Ã2Ã2w,q,q,¹ÉKäaÒ°ÿfdýÈú‘õ~&ïMÞ›¼Ç¾ì<Ùy²ó¤cÝ´}Ú>måŠÄ â„ÿZÄ*Y%«üû¥Ù‚[ôãǸ°ÐuÎâŸå!øûíªQzÔ;Š˜–i™6©ž§çéùÿ {úÆÓ7ž¾!,kı†Þeˆ2DMWÃχŸ?ÿ—$]Ÿ®O×GþW…@vÌé·Î hù#Š?±g´ëLŽ"ä 9\;I#i$íŸá¬žÕ³ú¶»…¸…¸…Ð{"½H/Ò†Ÿ Ÿ Ÿíú½GÕ£êQ³€sús–Ö?ãøüš'’––`—IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-14.8.png 644 233 144 2735 13755454066 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü’IDATHÇÍ–ÝOÔgÇϼ1a›Eäb© MÑjÑ)%M¬‹ VŒ\$éÆFkkkbšúB/Øe“Ú‹¹@š"S¶5-˜h$­Â®íŒ&m¦§C“1-V:@,ŒZ˜ßËóÙ‹™3-ÿ€çfržsÎ÷|3Ï9ßß# ""y©_{‰½Ä¾4éÛ[ÒçK^ZòRùÇIßg€­ÁÖpó(ä~ûÀ²—}hÞNûVÜÊϬIãgö³Î%OÒî³î³6oÊ?Û+·W.ùkÒÿçðô{úêÐz®õÀç}þÿ€{Á{A€ûÞû^HûVÜÊ·ê-¼L|9ö§þ"àºàº`»î,w–”֖֮؟LøqÔ½\÷2À¸cÜ¡ì`L9ä(/'ŽeS¾Oå[õž…oõ³ú'ùl,Ø(õ;êwxº“·{áâ7Š­~Z?ÐN;9 Çõ8€Ñl43ꊺ€ ¤}+nå[õž…oõ³ú'ù¤¯Òù׋z£¾@(`þE[¡­2ÊŒ2´T@Yêz]½f‰Yb–¶&™\ð”©éËôehúÏZ‘Vª4‰±Æð[ªÿÂUÞ©x·ˆjQ-ªE$ä¹Cn‘òåʈ ìØ=°[Äu]r] n½zÿê})qþâüEDÕvÃnM èçúzúz€Ü䌥FdÞ[âÍ÷æÃù“çOž?™ž£Ò¨4*áTàTàTj£µÑÚ(L­ŸZ?µVޝ_97}7}7}°ÅÜbn1!/šw+ïÔ¿²ynóóÓ]êUõªÚgÇÎŽ:’ä“ÞJ­íí¶·Ÿ­­4¾4¾„™Ï|:ó)*H %†÷s̳áÙðlh¢‰&˜ª›ª›ªµZ­V«Á(2ŠŒ"ˆÍÆ~Šý„2&žL<™ÞJFÛžh{"s+Yб_=¿Æyy°Ðwºé7ý:öÇ9* *&B˜0aà0‡9œ!1S1PKT¡*P[ÕV©¿%ñÕ‘o#ßxf=³q'_üAÇDP)åUÛÛiåÇ­ßÕï]FÂH,V~Žñ.ïùä“#.³$HlNlŽËÆðvöÛÙ¦g"øÓN0Ÿ1Ÿ™ ÃÎÖ­--ü³Ï7Cô ôïð*¨•ƒŸKtÒ ú >¨G8‘5ÔPj\«ñ˜øSLýAêµÿ4x¦ù¦ù#žÿlzÅl]ꟻâvÅÅú ÎŒ¾¾¾>¨]T;«vêšãšãš#ÚÞ1Ã1Ã1jSkSkSÁ¾Ê¾Ê¾êÑž=<{x6Ô¯­Ï©Ï£_%~•ˆúîÉoôot¸áwítíÔ_€=Ÿìùôë=¢çˆˆØKáìg¿€ÝÕîjõ~¦žmž€õOÖ÷¬ïÁ²òeåËÊ¡aCƆ °<ÿ GNåݹÛÝíàêr »†QžžO xwxwxwÀýÍ÷7ßß ®W«ܺ[wë0yyòòäe[0¶`l¨JU©*Á›åÍðf€ÿÿ€úÇúÇ@{„­¸¬¸Ìð3[—¾õÃW~÷±XßùF€@ Ú­]Õ®þÁÇ´ Àì1{ñ1ã8ºžÊ¢Ò¢RPß„zT–¨%‚êÐLš‰)X±¢T‡jWí º"W:¯Î«ó@1»ØjT¨`4âªÌÓʵrBìÓ^Ò^2T†z¿•ðV‚±R±ÎÿøÞ•íëâ±}=ž/ØÿÐÔKa\)\?IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-96-red.png 644 233 144 4174 13755454064 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü1IDATXí—LTÙÇïû1ü*Û© (Ãv b­ðNÙT~͠騫ÙEÉÈT×fW$®Ø€‘E±8 ²‚’.Á5+X] uý‘ØÐ¦llÜ°Ê ÒèîˆÂ€£Ã¼÷î·0÷Í›ÙTӴ矙sï¹ç|Þ=ßûî !sö3büêHg¤3ÒÉ= ÄFtGtGtEY”Ey°d’L’ ÌMÓ"‘ˆÌB}ÚÀâÙz–å­Ç¯åÑòU’JRÉ;Bç~!v‹Ýb·ã)WÅUqU*ˆ>n*n*n —7 oÞ4 l~¸ùáæ‡@QNQNQNÐgó,ž­gùX~VïÕ<„ÿu¨¿°™Ÿæ§ùéÑL¶CIIIòî¶[m·ÚnÑÏ„gÂ3@€^Ì`3F1ŠQ@õó,ž­gùXþÐz ›_ÍG oðãü8?>z…%ȹ‘s#ç†ô«ÿˆÄŒ¦ÓtšI®‘kä@^./——²E¶È˜gñl=ËÇò«À!õ o¨hœƒspBÄ#âñHç7l©Áô™é3É¢‚í¥M´ ©s¶u¶ £þ;þ;f•D%pW(µY:Cg:*Í—æR§o±o1@÷*^Å  35˜jMµ’…Õg<ŒèÆtcº±ß¬d†Ã†:CMq=q»Æ1Èã‘ù×û×ÏmF€` õQ2hàýœ~ô=õãxù˜ô‰ô‰êz\OFãGã1i8l8h8HSÊ'îwŠ;ް‰–ò–²–2º=À+9üv¿]SÁ÷mÉ·%Ð~¢ýÜèºÑ´“v}Di‘&÷M–³¾}|nŸJR {[Ê[Ê[ÊévugCøuǥťť¡áiáÓ§…êÎIHfÏìøØñ10wî@߬oÖú[û¶öiǪƪ୔·R@Ü/î×Ä{ „@²’ $¨‹¤§…ãa| ôèÆÆƒO& YÜþ“þ“ГÐÛÜÛÜZ kcׯ´ÀßmønT6V6@jDj„6þAÖƒ,ˆ'þîkI×’yD/ãa|Pô   %$à ®ÀKÝKDÜŽ¸ ÇÎ;«Í9<=<­mŸhŸ€o`:íÀ’ø%ñŠz B‚pj’ÄšcͱfBÄëâuñz׸úÂ/ʫɫ‘«Y~Åv)õR*|p x¹T.UÛò&_“O«Ý»uwëàMã›Fž@ÜäܧrêÃ÷?|Pª”* âoÖ4kšâU· Û„mÿ,žó£Ù©g–tR—¡ËÐeŒžf l5»·îÞJóÕÎÍ»k¹kN/<½€çNÛ6- Ò®´k\ß÷¶ïmð…ñ # —÷ÅôÅ÷÷ì´ã ãàÜþðõ|=_ÿ²›ÏÍçæÿ²- Pø»z¥–qe\YA+×Åuq]L+Êg¿ã¢ã"œªv«•l%ðÏøÔ›iÎ(í #ŒÍ§õ´>(¥ñ®‡ä(ƒÙ`–vª;Y+T Õ6“Šf!b AÖ\’KrÅZâ â Dp …Ç»ÿ¤^­­† Iz×þ‘±‘1­v%‡äÐÂ&:']J—´ØÿÄÿª8JþZ²¨d‘\­Þ@3¢[t;ëw%îJÜEoâM¼‰; +g˜? | ÷…ûÂ}®7eOÊž”=„è*tº gªÝ\S®)W«]ŦØàƒN8<Ã3< rË‹åÅòâàѳ¯²¯²¯¢ùê]®×éuúñ—_KQ¡æúÂZO¸0÷f¨oˆšÓ®ë|P»¶[F»zI/éƒ@Êcå±ò8¨Å! apFEEÑMª&cùX>öƒß‡Iñd_$yõ€`Óî¦k×ÙïìjWê—ú¥þàQz‘ø"ñE"°tjéÔÒ)9UÕâ9áœpîD6“Z@zá€?%¯±`KÔ®[pk´{ÜpÜp\Ò»º\]®.>øàÃ#µõÚzm½Á׎Ø*¶Š­C¿$Ñ «'1¯ 7¶àƒ€v/ý'íæ­Ï[Ÿ·>¨]g¶3Û™?ÎÍSµ\)WÊ•-Ã? «Ë‘ÿÒ^§ÝÕB½P/Ô.gÀ¥‡K—¦HŸMŸMŸ•þ¡¶Ú-¸·-‰t’NÒI¯ÁV/’ü®ÝºP?ïg嬜 kȲFYÂ/àð Žp„#¾™ìMö&{ „a€»XXÖ¹ÿ›éÕofb&fñ›Ðéýå<å)O®ëãúþõÖÜø"gXgFÂò¾¶Õÿ, ÂQrHûûIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-37.4.png 644 233 144 2676 13755454070 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜsIDATHÇÍ–ýO•eÇo^ô:rŵœÉ¢ V;lµÉ¥¤ä A¤²Ò…,d³¹f¸gm…Ì|Y¡S—è©MjŽ͈” ¦±˜/x¶“/±$4ÞNž8À9ÏóÜŸ~8çöy¦ÿ€Ï/Ͼ÷u]ßïµû¾®ë¾!„HŠþÄ>ûL¬3‚cß5×í«ì«žû:‚ëSStí#xòÀ“’=ÉÃkbeWþÖx!L~«žZIÂ\°5Ùšbr£¸Ö¿¸þEûüÞÓ - -“”Ÿ.? pò«“_ñ ÿ2ü ÀDîD.˜XÙ•¿ŠW|V~Qó¾0«}V{ÌŸ`›m›-¤æ¥æ¥m‹8ÜHƒ‚ü‚|€;qwâd,è#ÀæÈ\ @õZ°²GýU¼âSüJOéGò²Å¯ô”~$ó(ƒB±w%ûŠ}`\÷jáùáù ßÓj´Âr„gy©…µImô·ô½t§îÔ _•¹jŸ@‚Qj”–•z‡ÞFb„Ч‹§q¥¯ŽòG!„x¾ @¼4|½¾^`'kA¾,_&Hg9 ”SN¹E8Dˆ~3Ì0cÁÙd“ ò}§¾“`tu-“¾s¾s ô#‰=_/¸+„‡–l)ÜR¨XŒÌ+õôÀžŸötîéD~>¸op 9†C¨®®††±†±†1h´5Úm0àð xÌ|Œ2£Ì(3ñí3·¯Ü¾‚üiý«Xmêñ–¦-MÀ½H>BÿM!~¯„ïš¿k†Kù7ÜX Ë’v%¦'¦3Sp½ ¯ 2R2R2RÀ³Û³Û³–u-ëZÖùö|{¾Ýìí£Þ£Þ£^3m“¶IÛdâÚŠû+îÃ+‡—f-ÍR{*ËŒÆÆƒžH>Âp9ü¿l‚ÿÎüwÎllà^QPÓSSàjqµ¸Z ¿µ¿µ¿ÕòÃc@ñ©âSŧ, ¹4—æ2ñ^÷^÷^7ˆ/…Gxào‹¶m·ìlÑÚ;µÀ gƒ³A6 HNLN4®c7Ûþßý[ý[aMÖš¬5Y°¸fqÍâð®ó®ó®ƒ;ä¹aÑà¢ÁEƒÐ“ѓѓñh©µÝj»Õv 2ó2ó2󠺳º³º–>ŸoêÉñ‘«#W]I‡’×…žòÄÀ² BU¡*øìÜÁžƒ=ðš;/7ÏÒ]iÓ.¦]„æ›Í7›o‰Ò¥'JaIÕ’ª%U¦ß”{Ê=å†ñãÇ7Bí¥ÚKµ—ÀawØvH-L}=õuóè%êøS‘Àè»»d“6UcÍ9Í9ð÷‡Ó+§Wʲ—^sÝuÝefÞó.Ï» …í…í…íf%”PÔU×U×U[¦CåPåP%¤oNßœ¾|ç}ç}çMûþÃû÷íßË®åìÈÙaÖs¿‰û&x?ZcÑ»ìg:+â+l­‘út*w*þ™u/x/ˆÔèGô#¦€ƒƒ»ƒÝÁnK­¸ ·á†Ñ¾Ñ¾Ñ>0œ†Ópšöimzlz yõ„˜–®ü¾"¶"T>‚Ö‡æXWdŽÉcæX™,#(g˹r.H¿ôK¿¥ˆJ)¥Ô‚544 ®£Ž:½òWù+°ÁØfl#ˆ7Êÿ‰ï‚ï‚eŽý£æ˜:í5yߌ{3ø Ü+Ïj~Í|¡éC„£r’DìØØŽ¥»ø>7¥Wz¨?ÆVc+ajô½˜á zxò?¾wåcûºxlßcç öÅ‹p¾M À!IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-6.4.png 644 233 144 2460 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜåIDATHÇÍ–mH”YÇÏŒ«3¢ŒYÖ—CÒ ëÃBAin¸XˆµÑŠÒ.,½½ d¨´‘²&ôFiĦ†V’KÔ—LŒ©d[¬MGVs)ÚËémšçyîo?ÌÜž§­¾{¿Ìœsï9¿ÿ{Ï™+ ""³bŸîLw¦ÛµÝ›m¿·Ø[üU{Ôn6ÁµÎµîA-¤œH9z6õ¬5dÛz^¯wÆ‹Øù<í—Yb;<]ž.WaÌ>m\äµé‡ÄîÄîWl¹²å Àås—ϱ&nOܘ*œ*ÛÖóz½Ž×ùœùåàÿø"5þªk< žÈZµzþ®è‚¿çCéšÒ5OâžÄ)7˜ÿÉ$«B D=‚[ÏÇÖëxOç×<ÍêH+H+²ò²òÄÖhÀÐyØ›±7Có"ÝÀa“ FȘ•f%aPýª.°m=¯×ëxOç×<Íê‘϶ñØàÙà¦"~01µÅ¸kÜ%büi¼3Þ¡¬ÇÖ¨5Š=„ /xÎsÛ­ö¨Õ‚²2#"ˆè|¼ŽåW1Þ{¾8åƒÄ‰Ä‰Ð¼y9òò}Þf›Uf¯Õ?$ëýÐDM@6ÙdóñXÆ2–úQ•«r‡ÿ•µÞZ•”Àˆ9bÂ{~LOLXó-ØV·­NG[‹Õ¯‘“‘“öÆGwŒnÝ gÏ4ž­[¶:€ñĪA5¨ÛýèÚ£k®ÁÍïn®½¹ÖÎÇ—Ælc6Dï£µØæGõÄ„ý±:^t¼5  ~Ò4™=™>™Ës–ç,ÏÒúÒúÒzX²iɦ%›`0e0e0ÅbV›ÕfµmEF‘+ZV´¬h±ýV}dad!a5/Ê×zÜ"¾>__þ×"EE"ªFDÄÕ;iÏõÛ×ï]¿'2&c2&"   "ÅÅÅ"éCéCéC"’.é’.w$îHÜ‘£5GkŽÖˆô¶õ¶õ¶‰¤¥¤¥¤¥ˆ=zÝÝÅ#Éšåk=n‘¸Ò¸RrEâ{â{D$$""“:ÞH3æsE¼>¯ÏëÉÎÎé u†:C"þUþUþU"òTžÊS‘«Çê±DÚÚÚDögìÏØŸ!òl÷³ÝÏvÛº\ç]w\wDä7Í‹ñµðõùúTL,X ¦³Ò€î®îÎîNÈË˳ýù;ówæï„†S §NÙþC©‡R¥B’7ɛ䅬²¬²¬2»ö[«[÷µîs½©¿EùZÏGwŒ¦Ø™ÿnn7·Öa—*.U\‚¤I ’@åxåxå8ªU*ÈëÈëÈë€@ ?Ðoƒ7o>Þ +++Ž{ŒN£“0Ç>}Ç>[•<1í*R ¬ ÖkÁšgͳæ*Q%ª‚íÁö`;X>Ëgùlþ[ó­ùÖ„éo§ § UyÕ¸`\pð>]•Ž>önäÍÈGûÁ¼aÞàµR™*Ӫ̨­¦Õ´švüuÔQʯüÊ|OeÀplþgsÌsô1s$<þlû ó{7x!Úž#~0ï›÷kŽ5‡ˆº¥‚*ˆâ§9 m½m+Ú–üc$¡ÿg8´øÐbà ^Žs„ÆCãj‡Úô]}€8âÀ²Í¼‰7ù¦ž©ox†Ñ#o¾Ûï>’Ä’DˆíŽqŒc¶øŸxÈC`ƒjP LÄêû /Êê‰ «ÿöVí­Š=ïǺ)Øl´xO¾}Rñ¤jçÖέ Ïúžõ=ë³­/²Bfô\ì¹ØsjŽÔ©9«W=®²êé Áú`½Å³ø=Qa¾†K£—FAßПG3üžjÏaÏaÈuæ:sÓ–Ó–ÓËï,¿³ü 3̰maºòºòºò ³>³>³ŠU±*V™“™“™ý»úKûKcá~=Ýð"|£G åvÊm}\¹®\PŸñÆ8ûâìÐÙ!È+È+È+°üküküküP§êT²ü÷ºïuß놅٠³fCm¸6\†+:WtB§»s¤sĶҿ˜¾Ñ/2mó´Í|$’p=ẈŒ‹ˆˆ7º%ð0Ðèq4;šÍ) ) ) "þ^¯¿×ò²Ùl‘ˆÜj¼Õx«Q$‘ßä¦Ü´â%Ãð¢ü¨žx‘pK¸%®O$T*‰{*""i&/ë›¬Š¬ ‘¡íCÛ‡¶‹xJ<%ž‘WîWîWn‘Œ@F # "Ke©,éÙݳ»g·HÖ¬YDšv5íjÚ%’0˜0˜0(rÿûû5÷k,]ì3¼?¦çí=Æéè;ÿU•ªRüf¡wžÙyfçp¬s¬s¬ƒÊòÊòÊrpµºZ]­àœçœçœêÕ=ªƒÂpa¸0 ©ƒ©ƒ©ƒPTVTVTÞno‡·Ã¶Çúß¹ÇÞ:•¡è) †¼!¯í½¯gëÙàm÷¶{ÛA—ër]:M§é4ðT{ª=Õ WëÕz5¨Ej‘Zî1÷˜{ ÔAµOí³êñg¨#øÎSiëcÁׯm}ì+õ@=`"ìÕ ô[¿:¡Oè@e”ÙüÃzXƒNÒI:Éæ_©·è- ÔZµÖÖÇ&ÆÆÞÙÇÞèüI%I€ŠvfTêZÃóÃó ê.=©'Ñ´ÑB ð/^¼ ûtŸîÜŒ0\à<çAÿ®_èhjÕ¤š$ªWõš7lñþßù§ì·rÊÞ.¦ì}ljÞ`ÿf—% eë½IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-66-red.png 644 233 144 4157 13755454064 15615 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü$IDATXíWLTW¾ï"ˆ; 6 Ìh ®º@QPY›•_ƒVgm4ŠÒŠŠ5ÝÄU„Ñ4Hœ²ÕšiŒnc ÎS›Â®Ín±hü‘hF]›î64¡+3¶U•ÙÑaÞ{÷Û?fî›7³®f³{þyœ{¿sÎwÏýî½!A›D"Œ_+ÅJ±÷ÏÐ@¸Îqã:—把¨ˆÊ­cd™GæÁiÚDD"‘ù@¤O›žÅ³|,d=~I$=¿*REªx{ä|ò±Sì;í¸Ün‡FÄèIô$zð§Õ}«ûV÷ëÖ ¬JòJòJòÂ>›gxÏò±ü¬Þ³ùþW‘þÌùGü#þ‘këPjEjEj…RsôÊÑ+G¯Ðxï}ï}ï}ða£à‚ .@óCó ÏâY>–?²ÞÌŸÍ'òƒü ?èú3Kw)ïRÞ%ù—ýþ@ýͤ™4²R¯Ô+õ€’­d+Ù€bQ,ŠEç‡æžÅ³|,¿F8¢¾q¢F³svÎNˆxP<(lÿš˜›ÌMæ&Ù¢ÛEÛh¼r{àXà@]òTy*€1e¿²ð*^ "ÒÆè( ãåvÿlÿl€îR}ª^37™Ì ²…Õg|?s'æNÌ ÀØhl46Ò4ç°³ßÙ‘P¯ò®yŸ¼/\¿$§$§$G»·»XGËr[r[r[pû çö 8v¦_Ÿ~€çÐÎ!}çQŸÃçðø5߉??ƒdì™›47IÕ!YH’?! Å Å Å„ˆÅ‹âÅŽAíÂ/)\Y¸R©fùUëw+¾[?¤)£SFøX!öÝäØäÐwº¯»¯¦|1å Þn$øU?Þ´vÓZP@Ý¡î*nTfTf¨>àa‹°åo¥A?Žzf©ÅdÅdÅd¹Ž³k}ͺšu´PÛ¹É?Š?Š À å„ÀÛsºç4Ȫ|•>À:¾þ{{ïí€Os?Í”òîøîøpO>²×Ùë‚ý%àm¼·=YÊMå¦rSq4Š ðíIÝÈmä6µq\×Á´¢þVê‘ò¥|°‹É§T«éjºž}ƒ¾°Â €Òóô< Ù-¤6j Ki°càÐÀ!À4ÞXl,–·ilª…j«Y£f!ba®ù$Ÿä‹ ÄNìÄNˆà†„¡š?jOk›±ÞX/œµÎÎzí| ÀNà„N»LtM§é- †ág®o˜µa–R­½@£¢[tKR¶§lOÙNoæÍ¼™;bWÎhN}K…ÛÂmá6w6mgÚδ„ÄTÄTÄTH4íæ›óÍùzíªVÕ ?$H<ÄC< 7Z™­ÌVf‡^Ë¢–E-‹h¡ö–b 1†Á'¡_Kã#wšëŽÚzÂE¹—#}ãø v§ÃÚµÖ[ëuÚ5ÈÙ&¤ÞUïªwÃZìE/z)®7®7®—®Ö4™À'ð ¯í’âGQübɳ„–(í®~Šv{¤ž°vå¹Gî +÷qÊã”Ç)@º'Ý“îQ~®iñ”pJ8Õ¼˜I-$½h‚?#ϱ0€%k×-¸uÚ=lÛÆ3ù¶ÞâY|Ëgù=«ÊW•‹ÀîÚݵá§àÉoprÍÉ5–o!\ä"yžKϨ:UG Ì @<ÛÆm¾­·xßòY~G|º·-[ :§:Ç”uWÝfõ>½…LÀ˜æ˜9ú½Z¯fÑÒy:¤C`š÷æ=t§îd·ê¦ºéÇ·|–_ü‚¾ýÂS᩹¯`\+;)]£k˜w=¥S ¦ÎÔ™:Ÿ’zè5¤†ÔÐO?ý¾xÚ•\¯ë]¼íŸåwôd„Eÿ„£gŽžq‹‹0é™ôŒ k̯¦Õ´z<7&nLÜ€ÁÊÁÊÁÊÅk?Ø~°ý <*yTò¨Äó›-æ9„ñm±Ãçò;z2ž€î™nWˆùžyUQR\!JLÔDMÔ#¨<\y¸ò0”™2Sf<íÞÚ½µ{½ÒßÖßÖßæÅÕ J¨€º¢®rù\~G@þíüÛæ*LOûþò+Ógú@½UsÊ»u´4´4´4€”H‰”@õúêõÕë½xWcWcW#DîGîGîCâZâZâšOØ+5­¦̰ö÷Øò;z –,×aúÅô 7kZ¯Sù*ß+ë{Ö÷¬ïUUUÁé[§o¾¥£¥£¥£‹·rÓ›Mo6½^Ý«{µOؤšT“æ¥yéñyüŽž ˆŽëxà±HzWz—صŠïÈ&Ûµe¬i¬i¬Id<6‰tttˆÜÛxoã½"û;öwì÷òSRRDd@dÀó˼¼“w""òTžz|FÏgÏØ¨jTö À‡­¶~Ø Dˆ¶Ü¶Ü¶\(k.k.k^ܱòçåÏËŸCüAüAüç×Ëu–Îú¢3ö™[ùÉ­Áð1bAª0U˜*„Ùͳ›g7/6siæÒÌ%ø˜ü˜ü˜ôî2ÁÄßÊÿ˜cÎÜÙú¸>Î<ÍĉƒIš3à€1ÆÎqŽs> …3S^ßáα/˜ü º^×{“ŸŸ8ËY —0áÅ#D ÐN’$ô)}ŠÒꎺãÇÿìä_²ßÊ%ûºX²ï±¥ù‚ýÁ²‘’ï(IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.4.png 644 233 144 3030 13755454067 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÍIDATHÇÍ–ýO•çÆ¿‡#ò¦¼L3@ ¨±‚µÀRÔh”-”-Ó¿q”yæ]ˆðDx<Ë”>zmôÐ@1¨L•ÉÿeŠ)P‡Ô!u”¦4¥ 9Á NëXÇ:þå’K.¨_hZ#sl1?Œ^½ ¿_Ø3ï EDZ¯*ö•î+5Pô¬;·Kn—@Ë -[[¶¢¿w49šLž±Ä±Ä±D8Þv¼íxÜ´ß´ß´ %”PPͪY5›éû¹çþÔ?Ê?ßñù“ûºöuS~=!ú‘ͶÈÎÊ•"7~öuÒ×I–œ¼Î¼±¼1YÌÌÌKñ¿‹‡‹‡EnäÜȹ‘#b¯·×ÛëEú7õoêß$bŸ·ÏÛçE†b‡b‡bEÄ+^ñŠ(·r+·<^5¶š´š4±¼]Ð0Û0+Kþ¬%GzÑõ¢KDÆüzB,5Qî(wö‘—"_Š™ýdrzrÚÒ^Û÷Æ7o|#aÕÿ©vV;ER3S3S3Eº÷tïéÞ#2^4^4^$’|!ùBò‘Â]…» w‰$$$ˆH’$I’ˆµÉÚdmi9Ür¸å°È•?]é¹Ò#Ÿ°5a«„„µKOÞlÞ¬ˆü$º-º-{‹@Üʸ•úW„;§Ó浟ý»Ö] ¶“¶“¶“““ukëÖÖ­… ¡B7„ÂéªÓU§« ýbúÅô‹Ð»¾w}ïzóèzµ^­Wƒ,[–-Ëõ}õ}õ}ðÂêÜe¹ËL>5írÇb?ˆý@ÿJ´øÈ»‘wU,½µôüñòûƒïÂË¿µØ L‚Í·6ßÚ| Šò‹ò‹ò!¯0¯0¯Ð¬gïÏÞŸ½šÏ4Ÿi>cæããã *<*<*RKS_I}Å´õö•çÏ%xœ'hÿŒ:uLu‰ ¹õ&toëÞ“¿Yؾ°]Uÿôåç>÷ÅU¿\µwÕ^(»^v½ì:xÎzÎzÎÂîÕ»Wï^ ‘i‘i‘iP1^1^1ŽƒŽƒŽƒ°±scçÆNp 8¦ÐS­§ZNµ@Þð¶ºmu,ܧšuZ;­À¯üz>Öz•>û2ûã­Õ³–šç æ à»°©…©”6  hAú=ýž~\G\G\G@OÐôPŪXƒë¼ë¼ë<èÑz´mÎ-ø¾_øõhÇŒÌHЭü›=ÄbnëUá“'|ìŠßÇTûc«T•Ì©LµEmU¢JT ¨ •¡2LB•¢RT ¨Gê‘zdG9ÊQP×Ô—êKàçúýsŒðßííò±ï 3N{ÑpÞ׬¯Y_ûYýÕçö¹µImÒt~zø˜A] ü‚:è p3à (‡VÃÀÝÇÎ_«×â¥AÔå†óø–žtþ§÷_ùÔ¾.žÚ÷ØÓù‚ýúê Gq‰IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-155.png 644 233 144 2754 13755454065 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¡IDATHÇÍ–ßoSçÇŸã¸1V ‰+#@Mdµ™BXRµT´ˆÝPK«ja©j•¤ „”‰?ª–h¬E*-bL]HDR˜iéH& QÉšH($•CBn²Ȳֱ 3È#¦´óñ9ïgö‰ÍøxoŽž_ßï÷¼ÏyŸó ˆˆHIö)`+³•Ù–dlÛ;9ÿ¢×½V~:c3@{S{ó¿ƒâ£ÅG\!WÈœÌÙVÜÊϯÉáçóY~)‘œÃqÆqFófíá­çÞznÑÒŒ}xœ=ΞÒ°í«m_tÞý9¿[÷†Þ„r¶·ò­z /_>ü?~xâë'¾ÖþŽBG¡x^õ¼úìîLÂÍgáuÿë~€Ù‚Ùe#,f±òI’XëNžmųùV½…gá[|F€û÷+"ðFýõÎ?e &¿„}¥ûJ->½øˆX éd: `4 üÔ@CƒœmÅ­|«Þ³ð->‹?£Gîí-¬-ÒzŒˆs‘ÔƒèêŸRˆLL0öïÒXi¬c¯±ÛØ ”ð$O‚ñgcʘBå)ÊnlÑ}ºðYø5zü'ËŸk¥ˆHåI;#ÎHÒ7Jn”`ƒ1¤{tø"äÖ 3ÌóÌ3Ï£+’Í$®žQÏð kl€ëáëagÒ™LÚ-=YaǾílÿH˜/¨z³ÞœC;^øŸãmãmãm9šs±s±s1hM´&Zp¼òxåñJ˜ Í…æBÐ{¤÷HïhÝÜZ×Z£ÑŽ(êîÄí‘Û#ŠùO:Vk}cËìÛËçeÏúïÖ'".íE³Põ©>I5\i¸ÔpI´mz@ h"ñP<‰¨j§Ú)¸¸¸(Ò¿¥Kÿ‘ïˆwÄ+kµÇÚE‚«‚«‚«D.l¿°ç‘°-<žmþïÉ@2 © ¿ö"¿Z?¶~,ÛFyù¼À’KK.©3´ÆFb#¹Hýü§ùŸæ¡kUWeW%”ùËüe~Ü?¸p?Lz&=“Ъ´*­ |ã¾qß8œí;Ûw¶ÆN;{ öìÿ:ÿ:ÿ:8ùï“s'çò:û|öy%fÆL°ô¸Š\Eæ5¸½ú2Ç^ušŸšŸæê×F×F×F¡ªª &ê&ê&ê`kÛÖ¶­mÐYÞYÞYUŽ*G•v­Þµz×jhžmžmž…ÓM§›N7§ÚSí©†¿¼×µ¹ksnÌ·ûo÷ƒ¥Ç&böš½Ú51Òþ´_D4qËKâÊ´5³Ò¥éÒt©ˆV¬kÅ"÷GïÞqÕ¸j\5"§7NoœY±fÅškD¢ZT‹j"îY÷¬{VdÓ‰M'6YYþýòïEéÄ·‰oàÝÒïêwE,=6‘¤7é½zEìƒCƒC"ò£ˆMÚZõ”zÊúDІ‹†‹†ET‹jQ-"Õ-Õ-Õ-"ŽÇ€C¤¤±¤±¤QijóóCä°ý°ý°]¤ÛÝíîv‹¸–¹–¹–‰TD+nVÜùõ/Þ^úöR Ÿ¦‚ÑðÁðA‘=œÊTö”DÒ×Ò×r§òÞî}|ïcHJJʵXo×ÛõvˆWÄ+â`Ö›õf}^¼WïÕ{!^÷Ä=`5{Ì~ÃLgù,þ¬žÜÃyËy+i‡ëÆucw˜f#øáá1¥.«Ëê2(Ÿò)_ž¿I5©&0£fÔŒ‚ú­zW½›ÿYú@úxÚ¿Qu£ øÑ9ãœydŽåM~jµÀ\˜üW«€ÃAtŽ1ÄjérÔ€PÀ)¾à‹¼7ø„óœG©ÃcxÐé4‚Fpa?õöZ»µSMþÇö_ùØÞ.ÛûØãyƒý!~×(T•÷§IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-73-grey.png 644 233 144 6220 13755454064 16000 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü EIDATXÃ…—{PS׾ǿkï –G›i!òP jxÅšªUé­T‹Újé@/ÇRÏXíuD¡PRëñ­sû¸>¨½iT®à®#£B£`ˆxq€F&¦$dï½î$xÆ™Nÿ¬Yý[Ÿ½Öwý~k‘¢¢¢¢¢"aÂl“Ê=äri}ѱ¢cEÇhxÉã’Ç%—ÄS5USõ×ÿÆGð|ÄìÆõãúq=Ý#8‚#$qˆC€û¸û>ÂGøˆî–¥ËÒeé$ŸûûûíÖb%VbÝ^UVVÖx¯tCé†Ò ÄÂGñQ|Y>Á!6{¹‚˜IÀ¤ …©KıDlv;Ü·#4©ÄPb(1T÷º-n‹ÛÒÐêœåœåœ5ûß•””p~öâÙ‹g/&ùÉ’dI²H N N |u_¿o¼ï{Ÿ¿IÿÞù|óûx||œwçSUQ•øÉ&Ù$;êÅF±Q—¿wœpœpœˆ iii¶.¾¿øþâûŒ'Á˜`L0’·dù²|Y>œØØœp YÈð"^Ä‹pŽkÆ5ã¼el26›¨çRÜ¥¸KqâÖ‘7GÞysÝ7Š(E”"jž\Ȳ…ìEhÍ¡9ß# `擱±Â1MhB“&€ÓszNßô·Ëír»"Ó´¯k_׾Χd|’ñIÆ'\u=Èd‡S0SÀÓCcÀÁLüá£Å(€XÄ" ݤ›tƒÇ0†1 Φ²©l*ôÔ~Wû]íwü{=×{®÷\çZ¤~R?©ßÿ]àÓùt>}A&`ôýÎøµùµùµ’pI¸$¼üšó‚ó‚óBdšömíÛÚ·ù·r6älÈÙÀµ~øqàǘÂßàoð7±P, Áa¨…Z¨À5\Ã5€Œ2àŽá ®WŠ+Á ‰B¢ööö`ŠÏ¿v¥v¥v%ÿ–o~”Ô—Ô—Ô/Or·¹ÛÜmÚT•Cå Ñ¹÷rïåÞ#mAgƒÎCíÔNíPQ"D 0°`ÁþSû]ÜÅ]`òyÛÅ2±L,˜B¦)„Ýö©íSÛ§KKKh²=Èd"fi²4Yšœ–ÌÑ8Gã¾XåQz”% K×¥ëÒ±8èIГ 'z~òüäù Sª)Õ” ˆIb’˜À ªQj­hE+|"øDð à%ñ%ñ%   ú„>¡OΜ 8L]?uýÔõÕQÕAt5èjÐU8uËtËt˰¸öóÚÏk?$‰F¢ùbÇGóÑ|ô_rÕ§Õ§Õ§±;Q‘¨HTJïiãI ÀÅð‹áÃáÙó‡gÜîw I†$CÀК¡5Ck€ šA3(à¼â¼â¼üðã?þð# úPõ¡êCÀ‘æHs¤ ¦S‚ X{uíÕµWá3i¢4Qš(%•—‡/_Æn‡Î¡sèþ’‹mO·=ÝöTÜ]=¯z^õ<ê3‡ø®ø®øîdz\—ÇE©«ÙÕìj~Ö~]¸.\(ÝçÚçÚç¢T˜/ÌæSz0ñ`âÁDJO™N™N™ž777§t»n»n»ŽÒ‘e#ËF–ÑçÍáãññqø_âKÇÔ05LÍäŸÉЂ´LÖÁ©95§8çâ\€u§u§u'p‘^¤)9+sVæ,€ifš™f`iÌÒ˜¥1€úgõÏ꟮%]Kº–·OÞ>yû$•••ø;ýþNñD! Q1ï3ï3ï8ŒÃ8Lâ6‚`#è)ûûû<à?ã?ã?K.’‹ä"(Žâ(ŽÔC=Ôó ¼QѨhT1ëcÖǬ222ºƒî ;€ØîØîØn `cÀÆ€@«¡ÕÐjLý¦~S? ÓÊ´2-ÀX c™¤^÷¬ã¶ã¶ã60ZFËhé)F¾G¾G¾‡¯xö ìA=ÕQÕQÕQàU¼ŠWá2„ ! <á  {†=à=¢=¢=HY›²6eí³„0! ¸£¿£¿£ÆfŽÍ› d•g•g•Ûz¶õlë:—u.ë\´m?Ú~tòs—9ÓœiÎÌýæ~s?þ.  ÀW0È@2ŠpE\WDòƒƒƒ­m¦m¦m&¬’U²JØ}ž~ û5ì×0@•§ÊSåщщщÏ@ÉJ²’¬jV׬®Y 4ÝmºÛt÷Yÿï«~_õû*€íd;ÙN@±I±I± ãÞnÅ9õ9õ9µ˜BÌÄLÌøO"ßK™ð+áW¯|U ÕIuR݉¾‘¤‘¤‘$¶§vUíªÚU¯•·ïˆïˆïˆ"Ê#Ê#ʦš©fª¡R¨*6’d#5Yk²Öd-+ZV´¬Š·o-Þ Š<y(HÞ™¼3y'èô=Ó÷LßÙ™Œ3g2Dç€f@3 aZ¤û¤û¤û~Íôôzz=½[=¤ðQá£ÂGnâ&n¾tPòXòXò¸ÙotÿèþÑý‘9‹Ê•-*£o,_½|õòÕäŠ±ÙØll}¡ü…òÊA·;`V`€<ä!@Ò Êåƒr _Ó¯éת]ª]ª]ÀÔuS×M]gÇ­Ž[·°æ¸ê¸ê¸ ç*…J¡{“²”¥ìì5˜†i˜ÖùW†9ÂaްmÌ^f/³·ÿob·Ø-vg»ŠÅÐt»évÓmúª1Ó˜iÌÄɄԄԄT¸B“B“B“þ)§ÿ‚_ðË3@„ !@è£ÐG¡€×ü_óÍÐn/³—ÙË 8ßz¾õ|+¯•j¤© Cdˆ ˆd.™Kævþ¨@§ñ^ó„ä‰{#÷9@Wò˜ÌfÁV=r‘‹\æ[ØaÌ0Æo´î·î·î‡‚ì"»È.Ø'Sãóf€ÖÓzZˆ!bˆ2©EÕ…š 5j„-Ö~k¿µŸ;(ó—ùËüO–ÆVÄVÄV|sÅ(F1ùºÑn~‘ï>ªD/zÑËßÃflÆf¢×ÇëãõïÈ? ÿàd©u®u®u.g«“ÖIë¤Ï´K h-À8Œ0ÂÀ\$@ ÙÈe.1—˜KÝ0ß0ß0Ó7n*o*o*Ù ¥ŸÒOé×7æ®q׸k¶}u¯ø^ñ½b€š©™šèç¨Ôé-kDÑ_ôG`û@û@ûàÞìÞìÞ¼í+¥Z©VªÖÜ7Ü7Ü7°õ«ëWׯ¦o<’Gò ‹ÇÅã ðƒüú”>¥O'ÚkȟχìPÌ¡˜C1B¬e®e®e.k’ÏÏϨ˜7qh¶¶ˆ•b¥XÉôîìß|;VZZZZZ »oEám˜ÔW»[¼Ú=èÕî3:FÇè¶ê‘ƒä0ß<ÁÃo´UÙªlUP0 Ã0 žúV¢ÑÕèjt‰Î¾Ê¾Ê¾JÖ$/È îïïï/øÆ´Ô´Ô´ðj}ñÔèã›}Ø7@áuð¿^íž?&þLÅ;ò\y®<÷d©5Âaàl§‹N.¶xoôÆ`c°1ÿÕÔÖÔÖÔFÞSt)º]€¨µ¢vS3·–[Ë­uýKtrtrt2óÄ;ß¿ú2Ôó\,þÀ.\¸páBðÞª‘J©”JÉÇ–é–é–éøIxYxYx¹•—EË¢eÑï~;¸hpÑà¢à3¶N[§­“þÇDjæzF=£v³$U’*IýLC«h­úùž_©oY¬£1s0‘T)UJ•­ý|µÆZm­Vrt°2í¬v3J«·ÍÛhN߀o€W½¥ÞÔ¢€¡æõ«~5¯´zŠ=Å€V¦Åiq˜áaÖk¹µ\Éáõ9ç#Ó¸iÜ4¾s#°TX*,ZÂØƒ±ñ±qLǫ̀ú¾÷}Â,¡Êíà<΀V®•ªQýïñê‡>ø‚îÌØç‹Î1e©°Ø-v-óè|ÒQé¨t´¯’Oœ/8_p¾@ûu [qø†}Æ žÁ¤Á$hÚÙ´.Ë—ePz”üˆ nÜhˆ÷\n¹ÜÊSå) 8ÔJµRvóúzgCøHsE¯‹^½5²e=ÊÜÃ=(ˆçßܽ¨{ˆõb=,Î[œÌß°ïȾ#FÀ®/»¾1ALø‘ø™ÜÄÜD@Ï?oÊ£¬‡ÎÃù8èo÷œÙsf쪈ѩ£Þ!p¤M6“ÍdÓÏXѺCD?áCÙ7³o ™‡ÌDDÍ»›w5úýDD)§SNÅÝ‹»GD”¾!}Ñpæp&Qó®æ]DDJ£BD´¡~C=-\ñíŠo‰è³ë'ÂÔnj7µëGžß¯Zþ–º-u[ê02ÇæØpQíT;¡áW|ë~‡ßعäèäh0•™ÊÀÖgë36¥ÝÞnF¼ç•«¯\ðµ·ÁÛhÉhF34¾:miÚÒ´¥á|$ä9BŽï‡À@ÍŠ›ê›ê Xè¾é¾ Kî.¹ Àó¾ý}»hüíñ·@ % %°²ieœ~púQ…¶ [0^íh|­ñµ`½«µW¦®Lé/àa–Ì’Y²ï7‰›ÄM§ªø)‹ÿ©å-Ë[êʱ_:¯;¯¯-3¦#¦ÞŒ|3~{¿¿ßlˆ @KGK¬IX“EµEµFõ}##ØÅ?¬õvëmxÜéu§ççüú ƈ1bÌÇSe‹²EÙˆ¤^©Wêm›Ô/üÜŒ72ÞPóüþÒ‹û//Æp³s윱“;¬;¬ÆNQýE5·…ÛfX«05ïÿxǧ;>…( JPø·Ce‡Êün°H,‹þq`ÞtQ¨Å5˜’Mɦdg_Pj?ñÞ‰÷´L}ç–Ž¼;ò.4 eMË3_}þÕç ¼®¼øŸx=ßÍ}7-[6jA×Ë]/ûûÇYG£n¾¿D€P%T UsYl[Æ–­¹(þ]?_Y>ËßÞÈÚ˜Ìd®ÿ¹ÇQä(‚¬k÷¸­­HëÒº©H iÙZ6  M€–©×ôýÁÌdÛʼns@üBK¢%Q9ªwòñ˜x¬Ôª£åPåH– k:¥Sºô9ÈA"Ñ%ÞïŸø³þ´6Z[+æ±wF=££võ§õ,δËE'ûýƒ€vÀ7ë›…€^ ïvÞKy/©Çõè‰ä’\ryì±Øc±Çˆ«`¬¬#@WÀ1~GÄq„]J8™p2á$‘©ÐTh*”Ëuí¦[Ó­éFíúKý¥ð@† Àc<Æã`£ÕÕêjuuðèÕm®Û\·YËÔßr³Él2OÎÍû–…¡;ͺöžX˜{=Ô·,œ×îXGP»¥öR»A»fŬ˜ƒ@þûþûþûA-`€999 íÕ5%D Q¯þ&LŠ a|ôì±Î Ýƒìàö½¬µ±6£vå¹'¨]¥'äÏÓØ§±OcµÓk§×N««t-¶‹íbûÙT.µ€ôÂ_¤çX0€'j×%º Ú­µÔZjóXÛXÛX<ð`š“–^*½Tz)xíHR£Ô8ø—$òVXÝÀ8½ð<Àpã ^ h÷OÿI»»3vgìjWN•SåT|6?¯é;ÁòY>Ëß~*´Œð8¬.£ÿÒž§Ýmb•X%V9×sàüŠüŠü íwIÞ$o’W¹£oµKt‰®Ò8j¥Vj¥Àµ#Ž…Õ‹ ÿѵ[êgÜe‡Ø!v lʦlÿÏ…åÂra9Àˆ£¿^wÇ»ãÝDbŸØ'ö±+…Âvîÿffý7ÙÈ&õ‡N¿S h‚&hëfݬûÞŠùñŸÉa;3–÷¹[ý/A¿oÍø¹IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.png 644 233 144 2530 13755454065 14671 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–mHTiÇÏÌh£hšTJ1e¸E[R¬-H ÖФ Ù‹.¶5lAÉRDl!µ¶$ ®†YȉIYD©³ÕeK12kÍÍìE(Í6½÷>¿ý0sçÞ–ÚÏÞ/Ãyûÿÿ÷<÷œyDDdFðWÀ9Ï9ϰßYþˆœˆœ/~ Ø5:8 …= ödìI€¸Óq§–mÆÍ|{½ˆ…oç3ý2C,‡»ÉÝäÈ Ú‡ hYѲˆÙû'D¶D¶¼Ó`ûÅí.œ¹p†R¾3|àMÖ›,°l3næ›õ&ž_ý‡_¯„_q €{š{š$f'f'}HèO‚ü¼ü<€g®g.åý5M´Êüø1Ÿ›mƃùf½‰gâ›|&@À¬ÌY™"°nóºÍ‘õ‚Pæ)ó˜|“-ÀŽ š_óèÅz1@ù”°l3næ›õ&ž‰oò™ü=òñÙV~#6F `ò6“z›Þ`”åL*·r£´Aí±öÔ5_Íu õ­*VÅ ý¡uj`ü¥¢T ŒÃÆa&ù ßÐoØðM¾¿Ø}Y‘ÑÃþ0èÓût`€\0*JÆ•Æb?r€–†bÔ>µOí¥+]é¶øÏTP,¢B ç?Èâè «ù ¼åÞrÍø ¿6¤ zKQ÷¸ÿôþÓûOáøªã«Ž¯‚‡Ç{xÌÒџПП•§*OUž‚»Þ»Þ»^[GuH@ñFÔm|!þ€g o+/‰dìÍØl£8RU#ëY/ŽòNÞ‰£k k k@$£%£%£EäVÊ­”[)"¹÷rïåÞéJíJíJñî÷î÷îéXÞ±¼c¹ˆ÷½÷½÷½H÷Üî¹ÝsE.y)/Å¡üœå¬L˜|ó¯¼ä‰iiOùZ$sMæš°zér¾u¾·é+++ÙyuçÕWEJKKE“““Eš·5okÞ&2°v`íÀZO“§ÉÓ$’SSS â‰öD{¢%ô8f»Ò]é&¾£Þâê¸éqÓ^²½z­^a„fÅèÁу£!ûDö‰ì›› e Ë–-„%áK—„CõÖê­Õ[!é|Òù¤ópÙyÙyÙiá‰z¤iç3ùzœ"F«ÑêèÑ ´‚Ð Í26iFšˆh¢‰&Rµ¢jEÕ ‘"­H+ÒD®ï¾¾ûún½MoÓÛDz=½ž^HüêøÕñ«EJJJDbzbzbzDžhO´'šÕ1’P(‹Ïâê |l¿ï…s£çFCŸh‰:¬-ÒñÁô<¿ùüæó›–—–—–3wÍÜ5slèÜй¡üµþZ-l™³eΖ9µ#jGÔØÔ·©oSŒ¹Æ\c.Û´:´F­ÑÄW%@Ïç§Ò\Œ×è¦ÛšÊ‰£G'ŽÂ+÷+÷+7è>ݧûlGôÈxd<‚‘º‘º‘:Ð+ô ½Â&ècŒ¡l‹÷“Sùù=öwhÕõŒ«ê…zê´ªQ5¶ñOVÉ*T¾ÊWù –ª¥j©->OÅ«xPã,`€QmT3níÉÿÝcŸØü7³¦·ëíF™QÆ$?Ð@J]S­ª¨£–Z[G.ÐL3¨ÛªMµ¿àÇc±‡I4½Cï°á~óOÙÿÊ){»˜²÷±©yƒý¹Öd¡©´IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-17.3.png 644 233 144 2745 13755454066 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜšIDATHÇÍ–_LSwÇŸ4B‡‘]¶Àf²9{’íÂi  âd†t({5û“½ZDz‹-^,Í’aÔ›‰1‰1D£±D‚¡Œ Ym¦1Ë2‰“Â[ Î (°6-öôœßgíátn»÷wsò}þ|¿O~OžçüDD¤0ý°?eÊîLaûÿ,{Þ–¼-ëºRø¸¶×m¯ßøo¼`õ©Õ§Œ ›~3>3_ÄâÏÔ3íR(–!·'·ÇæJãý°½b{EÞ)|8¿Ã¿”„ÝŸïþ ÷tïiއ߮üvàw×ï.°°é7ãÍ|“/“_ö?¤/99¶Ÿ!÷±ÜÇD dsÉæg>HÜ|ê_« `&k&KÙ@¿䓯\@”(æ™ÏÀ¦?oæ›|&¿©gê§ê(ª.ªw“»Éq2•0qö=¹ïISOó‡8D>$£É(€¾SßÉPÀ† ,lúÍx3ßä3ùM=S?UÕJCD¤µ½!Ù\)hDG+ÒŠ€Uú[ú[h Ê)G%—S‚úõ7ô7@wêNÝ Ê¥ªU5eÜÒâZ-ù«¶V[ j]Šî7ÜÂiý•VÞYߎ[Ž[Ñl¾œ**ýu|eT•ÄW$’,³Ì¿Ÿ8ñŒhTR%U8À!¨jUMœ/Òü{B#¡GÔf3™ª'}cÇ¿#ìÙíÙ êãE“øÄì‰ø‰8jòÖäÔäÌÏÏC[K[K[ t.t.t.€/×—ëË…ñcãÇÆý½Þ뷯߾~޼r¤üH9*47qzâ´é5^TßîÉÛ“g¶öøwvyIDäå~)tM»¦E ±Uî¼ÒäiòH³ֳʳJl á…ØBLä^û½ö{í"¾_‡¯C¤ªªJdWbWbWBdtftftFVÎUßUßUŸH•¿Ê_åiysäM±Õ,ÖLÖLJbº3Ün¶UÚ\¯ê¯ê"ª/]Ÿ9ëœuªfÏÍžƒÄ:*¨€sÏwEº"P2W2[2 }}}¿‰3ÅgŠÏCC_C_Ã?ø‡N: ^·×íuÃ…¥ ± 1øÿ…}/ìƒë5“õ“õááð0ó½ù^Õ#°º`udp¾s¾”oeìØàÞàÞà†^W¯«×e .]<ºxJï–Þ-½ —Ë.—].³üzÞ£÷X8Òi‰´ÀÖÚ­µ[kaýÆçž}îY¸q;Tªg–/ã†óç/FÐ.ºá7ü¶ Ø5·æIµVŠÌVhë´§µ§EŒqcÜ·Zäsù\>—H±»Ø]ìÙÜÜY>¸|pù H¬1Öki=Ûz¶õ¬ÈŽÂ…; E‡‡‡DT¥r*§Èè–Ñ™Ñ)ɹ”sID=¯ßÔoÚ‚vÉŽnŽnû^ƒ"¶—EDx7­Ÿ(˜(¸VpM$goÎÞœ½Va±ÀX`Ld[ݶºmu–}±k±k±K¤ª²ª²ªRdSǦŽM"±îXw¬[dÍûkÞYóŽHÅ‘ò÷ÊߓĎ鷯½}wEúúD²ÎýQóGÍØ÷ÖTjž=¿šS©_Ô/B¤5ÒéF%ö'¼ ¯Õšpm¸6\ ñ@<XvÃkx /̘?0Ôyu^­L+ÓÊ`îî\p.ˆÒ§‰k*™ð”xJ¬©L¶¾ s޹h6„b¡ØŠNÝFwæf"I25ÓLs^b‰¥Œ=öµVàN©>Õ êU=q•âW‘СG$šÍ7Ùc"¨ôæUYY&­6BnòNòp\ëq4SòÈ>âC>Ì(lŠ!PÿW?©ŸVÆHñ©þƒþšºæëLó“Ö{ððætÿ•ìëâ‘}=š/Ø?WòeŽwx*IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-8.2.png 644 233 144 2521 13755454066 14751 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–oH•gÆo=þÍ2G:µ>dyâÔòCBÂ*4‰$'9‰b-ü0¶(ý2\†3áZ̃5G!¢Vä2¡’Ôæ¦«f¦MÈJÍD;SÏû¾ÏoÎyzOµúìóåœë~îûº®óü¹Ï# ""1þOàÄàÄàhþÔŽGìŽØ½î’ך””û×W°òüÊó±u±uÖ õ¼Î¬±ùõt\bÄ„7…7eúq9äoÊßñžWÝ‚ÈÖÈÖ 8zõèU€–ú–z>ƒ‰®‰.€™Ì™L°±ž×ùº^óòKùkú"ÚÚôÂÃÂÃD igÒεŸûþ^ {÷ìÝðÌñÌ¡‚Àœ–³\enÜèñ<ëy¾®×|š_ëi}Ÿ¸q;D`ß}"ô þ% % ZÏÛ TRÉr0܆À,4 YuKÝ ˆ °±ž×ùº^ói~­§õ}~äÕ½ýöCT^X^àðÞó±ù,¯Qhâ5žšQfJmPëÔ:ì1Í4Ó6T)*A%€1h`€²ú —á«ùXôók=­oo¥ˆHê÷99áÁ3ì¶·&[fY€‡¯i¡%ÀH 4󯮦CcjL‡8Ä¡€ü3´ÑjÆÌ1sðh~þÕz~}¿¿±ÚN(:Yt˜°6g„á¶Þ½K÷êîÕÁÙ²³egË`èôÐé¡Ó¶®•eeYY6Z3´fh œK>—|.ú>èKëK³ùÔ¤wÄ;Ìùõ´¾ßßX_1\ž½< V €úÄO°ÐWÙWÚW )µ)µ)µkæš¹&¤¸R\).Ø5°k`—mèþöûÛïo‡D#ÑH4 ³"³"³%K<ÝïwÇuǽL_°¾Óz>}íG úFô Õ['¶‚u†WFÏÏ=×{®ÃêøÕñ«ã¡FÕ¨ë×®„;w:ïtÚùͣͣͣPRZRZRjÇ7>Øø`ã¨þ³º¿ºßŽ›ú›O_û qìuì%M$ôaèà ‘?DDdÚã=‹ó‹ó"‹Ë—-.é¨ï¨ï¨Á‰§ˆcÄ1â‘ É ‘ýIû“ö'‰8G£ÎQWµ«ÚU-²jdÕȪ‘#ÉG’$‹ÈfÙ"[D=Z/ôZè5‰qlpl í³oÔü^Ó[Ó éeéeéevÜyÁyÁyª²«²«²Áì öCïñÞã½Ç!ÊåŒrB…§ÂSáw—»ËÝÖÇVU=>=¢¯D_‰¾¿4676Ûg̼øÖ3öÚ­ÄK~3:Œû_'Œ0é™ôLzÀK,åR.å‚é¦é¦é&ð{Š=Å0U4U4UcOÆžŒ=ñ/ƋƋ`>h>a>V¥U 4¼óV¾£M›Ùf6¡ÒUz@¿JU©*Ô#õH= Ø{ž—]Ê¿*,Bë u0 1l›oícŸ¼ˆ¼Àç0€Le*¼êW5®ÆQ\¤–Zà9SLz¡^¨ÀGä‘êºjU­ ºÕ¬šE©&s…¹/ߘ9fŽ6齑çÈsè•z¥ó/ÙÿÊ%ûºX²ï±¥ù‚ý%þN ƒ4 IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.5.png 644 233 144 3165 13755454067 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü*IDATHÇÍVûOTWÿÜaä1£S(¬1`e‡ Nix"ÃÚÀb¬)ø˜º³î¶ˆ©v7&[Û`5Æ+Iƒ¤%M6jE QÉ” 2X Å¥S½+™{ïùì3·—¸ÿ€ç—›ïëóùœœ›Ï9 ÑÁ/HS¢)Ñ´*›öùð¢ð¢Ô/ñY•”^—^:BFŠ:E’1ŸÆ|ª±^×û—Ïþr>=h‰°Ka—¤¼`üYùråËáñø£n2¢3¢ó©BîýjïW$y¹õr+ëÉ_ú~é#ɹ¼¹<ÒˆõºÞ¯ÏëxËññÁ3ü¹â›ßHãdXhX(@&&¦4%¥%$ù äAˆ0‘$©Î’\É•"¤L™úò,‹õz°_Ÿ×ñt|Oçè—— ¯½ñÚ#Ÿ‘ï$¼“ óù;Içq®$Y‘IR­V«¹DŠnÑM’”(‘F¬×õ~}^ÇÓñu>? Ç8Êyø¸€,w—»Im$ý½Ê¤?ÕŸJŠ$%KÉ¢?¨TˆQ)*Ie@ù^ùžÔ&µIm’ÿ¿zè§ŸB=ê;í;M¿ºÉßào Õ’>+ÊcËcuGù-lü„Œ#dÙ,4w¯»—äßI’R¤‹tÎó?|ȇ¤hM¢‰ªP…ºL@3›ÙLr=×sý²üÇ8Fò Ÿð IŠ—ÄKœVd/ȶñ“cÀ?ÞãʺѺѭ-’ôæ»o¾+lƒ)eeÒÍ/JÚ´6 æÕÊêÅÕ‹âÞ;w ¸o½o½o.F_Œ¾ „……Ö«Ö«Ö«øm).Å¥¸€®þ®Þ®^àúû×-×-0lèìDuòg…öB»°Y²g^y5|Š¥ýÓýÓf¿I{[¾–PRSRÜùÃ/üø‚”™óeνœ{ðõdö¤õ¤Arüàr w2ïdÞÉœ‡‡‡›ol¾±p.8œ À]ó]ó]³!L”åAÀ™ï,vWâ¯x¯x!õúúÚûÚá{ò¥¼B^!eù…ù…? è1I{#½‘^›È·ä[€Ç]S¦Iþ|í퉷'V÷sÝlÝ,”ž”ž”tìîØÝ±///ÚÚÚ€¢ª¢ª¢*ÀºÓºÓºÓæžwÏ»çï~ï~ï~@‹ÔbµX }ÁŽ‚K¹cŠ1IõÊãW¦G«Ž¯:n³›M?„¾ú"Ó±8±8!aûbÎRÎ~µggÔgÔ#î1•*7¾£¾£¾£ãÏx ü`øÁðƒÀ¦êMÕ›ªf¹Yn–{†=Þ”¡ e›bSl@­­ÖVk¶y¶y¶y€CÛßj| ˆ˜ˆêêǯ;ÿ[º¯tâ´òo1jœeØ2,.‘¾C¾CäÉ+gzÎôÛß+Ì+Ì3þá-®-®-.²8·8·8—Ì)Ê)Ê)2ê¶z[½­ž<1rbäÄ©5h ZÙÙÙI6¥6¥6¥ýöUYÃYÃ䋹ÅL’K-K-¤šl™°LˆKaàúÙ‘Ý‘MN5.,ˆºßoϘΘæRìØ=±{ÈòÛå·Ëo“ò9ùœ|ŽÜµn׺]ëHK²%Ù’LVWW“£kG׎®%mçmçmçɾھھZr«k«k«‹ŒúKÔ¾¨}äŸæªNVäÒB3IŠ:²}¨}ˆz‚>vö&¯9ÍN³¾íw¾òòÈ™°‡‹)Ônµ[í6v¬icÚé9â9â9Bjk´5ÚR8„C8HO½§ÞSOŠâ€8@*J£ÒHΚgžÎ<¥ÐNù~‡ÁÇŸœu?;{ìzÆÇ¾ øŠ¸ð›Õˆ΋tavR”ŠRQJŠ4‘&Ò ¡"Q$ŠDRÌŠY1»,ÿ¸&®‘b‡¨5$)²E6çEJ?Á=ì&Ɉ¹ˆ9ÙÌ[=†ó/éÎ[RBò¯gÿV¼Š—ä¿Ô)uÊp~^f;ÛIq3xµ²•­$½œã)†Å€ 9ì?­Nª“ô‹o•iešäçAçg…¹ÂLÒ÷¬ó?¿wåsûºxnßcÏç ö}?“ãP¢¬IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-43.png 644 233 144 2374 13755454065 14675 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܱIDATHÇÍ–mH”YÇÏXÍ(Ô¤èfP“`’•Ño"Ñ€ÓË•4I!Al+ ‹•m ‚!-DFnBAѲlQ[Ch"n¹¥}iYD›iÐZz3Ò¥uÝæåyîo?Ì<ó<-Ûn}¾ çÜsÏïï=÷Ì‘Üô¯@–+Ë•åLÙY_™þìÙWÿ˜²ýØjl5#m°´ki@Þż‹zдq#Þ:_ÄÌoå~ÉÓá¸æ¸fó¤íãP»¶vmög)ûÔär&¡þfýM€—n\âk˜œxçyçÓ6Æxc¾‘Ïš_Žÿƒ/‹n-ºeûv‡]мEÞâ¦TÀX1lÛ²m ÀË/¨,Ð&Å,V`†ŒoÊbãéxc¾‘ÏÈoð ~J@Áú‚õ"°c÷ŽÝ9R‚?À‘•GV¼D8Á Cr&9 ÕiuÄ@ ¨lØÀ´q#Þ˜oä3ò<ƒŸÒ#žmG5ø²}ÙA@»¯Ý¦õúN饫&Õz¡¾L_–Ù1ôQ}DäóäXr ÔZU«jQ ŸÒO‘à/í¶vPF~ƒgðÅ*¨ä;șș˜Ya-¬e8_ÓkõZæ2žJ*¨µKíR»LA*ª¢* ´ÓN»é§‡ë\êé¤@oÕ[™#žÎŸáü”ž´0ÿ/Ðp´áhfÝe¨d45¹ê¼êR]&ïÙÕgWŸ]…þêþêþjÓ?l¶ Ûà´û´û´ÂoÂoÂo, øI=TQ–#Nñ2ü”ž´°_¿ËÑË!êKæ4¿æ'Æ÷øñƒò+¿ò›O§§ÓÓ ›ƒ›ƒ›ƒšM‡¦ÁYè,tBM}M}M=¸Æ\c®1ÇÇãžÄ‹Ä b^†ŸÒ#à¼ë¼«®ÁDÅD…åþP=ª´YmF3oMMMfeîkØ×°¯†ž =z-'[N¶œ„Þ`o°7î€;àÀpËpËp‹¥ŸkW´+^†ŸÒ#·$o‰þ¦^M½2¯½¾ZsjNK©Œ÷Œ÷ŒC™·Ì[æ…Ö;­wZï@åªÊU•«Ì¸Hc¤1Ò›B›B›BPRURUR£ù£ù£ùa íµöÚÚf ~JÏB½[ï¶=InOn—ÏEä‘<’J±c—Ìj µ…ÚDÂp ™ŠLE¦""³fÌ©ÚSµ§jÈòÜå¹ËsEúJúJúJDÖ”¯)_S.2X7X7X'R*¥R*"l¤˜bùYb“‚4_2z>Zc¿i‡´CF Àû ï7¼ßQDœ=söÌÙ3àÝïÝïÝ“““Pî+÷•û ¿9¿9¿|âŸ@ÔuGÝ–‹'Ï'Ïÿg}äV~pkPô `&޹b®˜ ¦eZ¦ÅôÇ×Å×Å×Á[Ç[Ç[hOµ§ÚSK)!òÉ·ò_úXÒè3úAý s|K7Ý ¨~Õle+[-;P­ªU5¨€ (Ë”]GT„¬ÐÏéç˜KwÆÿëcŸÐùú^}¯ÙùiçÇvì–9L3Í úT·ê.0Ä ôf½™IížvÏšÿ£ÞþWÎÛ׿}ÍÏìß{&t`%ód‘IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-19.6.png 644 233 144 3045 13755454066 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÚIDATHÇÍ–ïOTWÇŸ±0f*`bÚQZ ëØªÑ&F aZ”*imÑö UäGÓJK” ÆÕ¸kM°Qq‰•²±²R“m41!ˆ…Õ¸¡¬¸‚#`aD™¹÷žO_Ì\fºçÍÍsžçù~¿¹çœï9""ú D-Zµ$Gí ÏÇfÅf¥\Ægt°¼oyÿ¿Õ÷MÜ7 ß&|kÜ ÇfÞ¬ì ãGò™ó/ቘ–˜‹+†Ö|°&vi0þ[ØZm­O5(ºTt àbÃÅ>…ߺ~ë˜rM¹ ›y³Þì7ñ"ñåðÿñ‹À¢Ÿýdy1/ż$Iï$½“üY°àÉónλ#Ñ#Ñ* ô ÀŽ]¹>ÌáˆÍ|¨Þì7ñL|“ÏäêHÌHÌ÷ Þ+° 6Üù|áøÂaòZ¯ø ;h>Í ¤Ä<¨Õ€ „c3oÖ›ý&ž‰oò™üA=á¥4DDŽg¢çiyÚ‚ NÃx=ð:¨ú«ú«B eŒÃÆ0hµImÔµGí!<Æad!RªH«Òªh½„@¿ñ!ïAÞÀâ_XÊQg-؆lC>+ÿº÷Ú½×@o ›‹†Óp2·ÀðD=Vj¨‰’I&™@ $DÌÛ°aåV£j@íT;™ãDÿO6ŸÍç³r#¨'ôÇÎ\gº¸¨¸T5€±Îĭϯ/¬/DõnëÍìÍ óݾrûÊí+prËÉ-'·À`÷`÷`w8o”åFy8¾ÿéý’û%p¼þxÝñ:ÔJnôßè_¨^Çâ½ïýpõDDº+à‡·~x ´jõÉ®Î÷~¸—yóˆ\Ó¯é×txxì᱇Ç`EêŠÔ©°ùÔæS›OÁʲ•e+Ë`dßȾ‘}aA---æLs¦9!çhÎÁœƒð炵þµ~æ{Ï— —¨OàDZÇÀXÔ#üuIö’lÕcMcMàOa k iÕ…™ 3àxñʱ n>ºùèæ#h,h,h,€M›:6u„¬¾þùúçP[^[^ñ§ÎÏŸ;?Ë6.Û¸l#”(ûºìk8ðÏýŸïÿÇϾ2û €gÖ3 jøåÆ—UK”|ýsôϼ)W¬O­OE–_ä™,¸³+nWœˆãˆã¨ã¨È¤wÒ;éÙ»#vG¬È³šg5ÏjD¶Wn¯Ü^)ÒŸÞŸÞŸ.b-´Z eaè¹z®ž+k‰µÄZDVÿºúîê»"ÍFsrs²HW]—ޥˤH¼;Þ-¢Ižäñ¦Ut£ÕhµôKT`]`¼!ED$Ñœœ œ±Þ·Y‡D¦¦§¦§¦ER¢S¢S¢E²Ú³Ú³ÚEzR{R{RE’N'N:-¢ù5¿æ±ûì>»OÄÞfo³·‰”ÚKí¥v‘¿<ûöÙ·E†lC†H¢ˆ«ÍÕ&ÂRÃcx,ý¡Íß]Á¥ï¿ûþ; .¸ÇB+1Ÿ±2cyÆr¸\¹þr=ƒÆ 1®"W‘«¹Ž\G.TUTUTU€'Ñ“èIçVçVçV=4zhôÖÖÖÁbÿâéÅÓð—þÜÊÜJægî™|-¶¨‹æ3Oe xñ~`Ø<•úUý*Ìœ˜ižiFù«üþŠðÞ™wÏ»çÝ0¾a|ÃøàG8†Ûpnð6x¼ `Ü2n·@5©&ÕÞÞRo)J?êO÷§GœÊ»ÅÉÅɦឹæ¬Û¸mÜg…ÙÙþlž FCØÇXô)µMmSÛÂBU’JRIÀnv³;ÂÇvR@>eUV•¦Ò˜SÁ[%[=èè°ÍØf|VÚÿàc"¨óªüèüè°ó£j£À}NŸ ;?‡©¦Ô¿U§êú裘ÀƒÔÕ§ú€±PýU#ƈ! ®kO´'ÀiÓùó­ùVS¤ó¿¸wå ûºxaßc/æ öw ¬ýòӨާIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-4-grey.png 644 233 144 5621 13755454063 15715 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü FIDATXÃ…—{LTWÇ¿çÜæ¥ÈPbhÊ£*«¸R1ЬQ»*±ÔÔQdI·ÄGk…Æ-V¶$ˆT7>×EÄ)bQ—Š5UIA¥Èc|Uä¡#È 3sçœýƒ{ÁØmzþ¹™¹ç|¿ŸüÎ÷žû»$----- –¡ £¸¯¸¯¸Ï+ÓŽ¦M;ÊÇetetet-˜Ìõ\Ïõ»7ˆ>¢è3}½½Ü^n/çY(BŠH*‚Œ`ÍhF3€õXõ{ZÕ‡ªUB”×Ëz²¾ì'ûË<2ÕÔjj5µ€rœrœrÜ?~´ž³ž³ž›¸È…ÿ ÿâ{Æc‚1Añ³‡ÖCë¡ÅXv]g×Ä#ñPjRMª¡Ìd=YOÖô<=OÏ4”†ÒP‹±‹¡×Ëz²¾ì'ûË<2ɨ̨̨Œ™á¨uÔ:jÏÕº÷»÷»÷ó€ÄŽÄŽÄRëqØã°ÇaPÉ#y$Üe0 bƒÔPC  Õ¨ ‚ *À™äLr&hA Z¥MiSÚ0<$=Hz}–µ–µ–µ`|øðáa}£ûF÷&f·0·0·°Ea”ó`üÅ_§Ái"ë"ë"ë%º±ì»ñ "%”PÈE.rD"‘€xL<&ò²ó²ó²²Ê>(ûà%À8Çã†!ëË~²¿Ì#óQ1@ þ’¨¦¦†¬©†©†©R éºÑZCkØa‡ @€030ÃHeVeVeÐz¿õ~ë}€ŸågùÙ‘ûx€xà^à0¬/ùÉþ2̧°÷Ø{ì=ø×ä˜É1“cª¹ª¹ª¹ +OæÉ<Z²‡ì!{FÀ € €çãùx€¶ÓvÚÔ­¬[Y·ø5ú×è_£_ƒ¯Á׸&º&º&¾ªš‘ˆ`#6b# ù)4ùš|M>¬fO˜=a6Rëzêzêz°›bva ¦'éIzrXN…38ƒ3tÐA7oxÃ í¤´=¿õüÖóp¦éLÓ™&`NìœØ9±€ïǾû~ ØUv•]õh7ºÑýRtäÔ£õ#þt ]C×8€8@‚©à#ø>üTß̾™}3qWÜ"n·@ ?ÈàÃÀ§p §t¡ ]#¾'wÜur05vjìÔX B¡Ðƒeƒeƒe€Ð-t ÝÿTÎz/zÑ VÒJZÁ¥YÂ@Ý@Ý@îRêOýù)ªþZýµúk1ç®÷]ï»ÞüÔ­Â[…· LÁL-` Ø€oâ›ø¦¿Û%·Kn—ááá@·µÛÚmŽ5k8Ö<‹}û,xtôÑÑGGÒˆÒˆÒÀåïòwùìS1SxЧx Û½%÷–Ü[˜››cú®ú®ú®˜C±+°"½H‘¦HS¤‘Ô žÅw«ïVß­äxHvHvH6–òi|Ÿ­´E ý¤Ÿô°Á}%úJô•@xÁ ^€ðDx"¼Ž×ñ:€ÑÑ#ç$?Îóã/æÅ¼ÀXŒÅXØ%l÷ДДŠצÞm½Ûz·)öªUªÀã™AYAYAYß\B:Ò‘NN ­hçËý¨ñÅF¤ )¤|òéɧ'ŸÎY¦NT'ªgöê{õ½z…å»±ßýn¬K~þÝù¾ƒï€·q·GzGâHÀWóÕ|58шF¨®¶^m½ÚÊçÝ8ãüóBŽÎ[ç­ónt;ŠÅŸ}Õ˜Þ˜Þ˜p37s3ÆH>GdP«|,²Ql…17Ûo¶ßl)ŽGÊg_éô:½Nÿd³©ÙÔlú?Ù-fŬ\nRøsþœ?(¥”RØžšŸšŸšq¼*´*´*ctºN]'Àf²™læg_ÑlšM³Û¥(î•#¿ˆ!é“D~‡H[$ä e×µ‰„“p>oÙÐ'Ç¥²¡îˆ}²š­f«#g—5±&Ö-}‹¾Eß‚]LSÅT¨òóó]A³:guÎZÔo«ßV¿ó.¸À…Í?³VÀ {¥ý»¼c™™™™™™è“+ éá IÙÝ$ew¯”Ý3¿Ë®Óä49Å$K¡¥ÐR­TÁçr%.Ø.Ø.ؘµ­ ­ ­@hQïTïTïl¬°?¶?¶?ÞùMKtKtK4 úKë´2àðy‹WÆ+´’ÀORvË~—]Ÿ^Ÿ^…¥$­$­$͵ ABÆ4x6x6xâpMmMmM-‰×6i›´MógþÌÿ“+Š8Eœ"Î6; , , ŒöH~‹¥«íU.0 ƒÁ`€(ýlànÜ»‘¿uNêœÔ9 ‡\o¸Þp½qMT¨TËóžÌ2ÿÉ|ÏÓ–;–;–;üŸ7Üò¶¯ÕLÐLÐL w„‡ÂCááã l7ÛÍv'µ7­jZÕ´ D€¤'7–¶?ãø7<Ï {ð÷IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-12.5.png 644 233 144 3016 13755454066 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÃIDATHÇÍ–mL”WÇ0 Sq:Bµ‰ ‹kŠ1ØÖÄ4‘15]!’6’úB7º¸81HŒ±±¤1Ù4Äìê6Q¢B`]ëJ&[¥#/2»[Ä+d‡M}§H‘Šð¼Üß~˜y˜i›ýîýòäÜsÎÿÿϹ÷œç ˆˆˆ3úHÌLÌLtDìÄ?Äö—¾·ô½œ+»Ö€„>ø÷)xùÂËV\ZqɌٖߊωáÇóYûâ”ØÆïo‚+jæ}˜·teÄþK7Ø›íͳ:”·”·ø}TÀþü“®IÄlËoÅ[ù^<¾|ö ~Hþ&ù›„°$eIŠ¬Ù±fÇÚÊHÀ×BqQqÀHÒH’JãG •T儱Öxœmù£ñV¾…gá[|DÀ+¯ˆÀû{ßßkÿk$að2|œñq†Å§5§9M*èa= `”¥ÌƒêVÝ$1Ûò[ñV¾…gá[|DOì(M‘ÏßÅØ­ïÖõš©Z¶– ªÇXe¬B‹:”Z¥œÊ ú > €0f€_¯44”ñÇ…‹ ÑŒ7´J­Œ¢>%»Ów§[?7v”EDÖ×€ý¾ý~ØÆ×CYCY`tPˆÏÌ5sùÉâQ£jD8À8g8ÃPjBMÄí žñŒgjZ·ˆWÁÞ`/€=l‡maëk¢«íaÊ]î.u ÀÜdá֗ן¨?êêìŒñ <8xÎeË:—ü@~ ÿ×Óni·´[ÐÜØ\×\ž]ž#ž#¨º>O§§žþÙ˜7æÍMP‘_‘jWDð¦ˆHà4moÚú)U¶¿wÏá=‡™·Z¤ër×å®Ë0<5<5<«ÛW·¯nWµ«ÚU ™Ç2e¿Ýo÷Ûcžn{ºíé6X9¼rxå0—ï-Þ ¿óïwïw3ÿýÆIsÒTeàûÄ÷ ˜ÿ‰èÎ: …Ê £WG¯ÂByäÁÕß\™¾2 SÐÛÖÛÖÛ·;owÞî„ã¥ÇK—Ælx´áцGp>ù|òùä¸+Ö×Ó×Ó¶"[‘­Š*‹*Š*àoc—¾ºôU\iß ¹CnÀï8í8­¼+–¯Xnps¼~¼Ô—‹mÀÖÒ­¥[KáÚÑkG¯á   ÀÆš5kÀUéªtUÂLúLúLzœ°ÚžÚžZ(o-o-o…¦†¦†¦XóÆk¯¾ö*4¥ú>õ}Ê8è=ÆŸ–{–{ÌAwt8:”—oCã¡qPÁŸß‘üíù®|´yÚR¨wÔ;ü¤ÖFñ3‚÷‚÷ì“öɰýlމ ¢“W•$•$-N¡^’ôú Åt˜4ÎÓAJý]}¡¾õÏ(ñuu]]Üæ0¨ õD=B}\4†a4uKÕG/£ø”ØJlÀÂ/'ÿ‹û¯|a_/ì{ìÅ|ÁþILìÉ:IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-51.png 644 233 144 2372 13755454065 14672 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܯIDATHÇÍ–_H”YÆß™2Ê4’ +![X]Ü ºÓJ’"+ R2]ébY(’Ø‹¥‹®Ü³ˆZ§5¶ JM†ÞhÚL.ÄbdE£ 0¹£VΜïüöbæ|ßìV°{ç¹ÞÏóœsæ}¿# ""ÙÉ_÷:÷:wVÂvãø3¶el+¸–°/(píqíù–·.oȹœsÙzâØ&nòSëEüT>ã—lqéé®ò¤}ª‹«‹3rvódvgvÏÆ¡ñVã-€®ö®v¾…É“"å‘rpl7ù¦Þà¥âËÉñ‹@ZOZëOH_’¾Dò+ò+6|—Hx¾ªvTí_4¾H»@…¥,Õå@”(fM¥Ø&žÌ7õÏà>ßÐ#°²le™ìÞ¿{¦/QðäWhZÛ´ÖðźSœb)Ä£ñ(€: ðôÀ… ÛÄM¾©7xßðþ„ùçÝþ´öfìÍâ± ¨5­B«˜úQu¨´úRªBPµªFÕ•TRiŸÖb¥•ýH¿ÓïÐ`µ[íĘQ}ªÏÞpÐæ³ù%UÐ-9™9] cjL€í`Õ[õÌJbýE˜0 ÑɜĺÃî€RCj襗ޔxÜ–\kÕ2—4¶Û|6BORØ…ûpøÄávq ¿ÄÏÆÏÚ°:ö{, @w{w{w;œ¯:_u¾ .ö]ì»ØSÕSÕSÕŽŽKM—š.5ÁãÒÇ¥K¿Þªët:åŠ|6BORØ£cp}úú´]^¯Ãñæx3Œ'ÒéŒtBn(7”‚Ã;‡wÃÁ¢ƒE‹`,w,w,ùùùœ?Hï¹Þs½çaj@õ¨uE]1øºÞáOèq‹dÝ˺÷µW¤lKÙ–äýŠËÇ÷.ŸË'éÆótÕÓUOW‰¼­y[ó¶FDoÒ›ô&‘ÍÞÍÞÍ^‘‚7o ÞˆT T T ˆäûóýù~+ÏʳòÄY_‰W¼""nÛcð]>‡?©r–å,³FajbjÂi{ë”:¢Ž8; ´Z-Ðx»ñvãm¸Ùv³íf¬­­Á57ÖÜXãä{=^×]V—Õe¥œØ¸Wã:¬Ã©cÆð'ô¸E,¿åwŠÄwÅwÙûZ)钳љÀL`& ²¢vEíŠZ‘} ûö5ˆ¬žX=±zB$R)‰”8ùóþyÿ¼_Dú¥_úSNlNfeVDDžËó>›?¡Ç--–ÿ1,2Ø?hÐàšâ!eÞxŠ[‹[‹[EúGúGúGDr^ç¼Îy-²ñÙÆgŸ‰Ô­;ZwÔáÏîÈîÈîIËJËJËrü®RW‘«HDD¿Ð/ > RÏg»ÒtÍ^ñÊ ±ÑØhlÂ…áÂp!X§­ÓÖi>ZÓg¦ÏLŸùà|p>˜ð’—ÿ¹+?1Çfí9Öfµ1§ÓQ]©Ë͇@{´G{€<òÈKðž÷¼àƒÓÛÿ{Ž}bò›ÉWƒjÀ:f#F3w¹‹ÖºO÷׸ÊÕOŒtܸŸ DƒuÜ:NÌÁKâ~ò/Øoå‚}],Ø÷ØÂ|Áþ Ô«ãƒ1 ¦½IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-37.0.png 644 233 144 2777 13755454067 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü´IDATHÇÍ–ïO”WLjÌP~(f#)4ucщÊ& ‰ªKXZ ¢H¶¼ ÄÑlØ´6$˜MmÐ]\iU¶b¡ÉºiBZAÈÖµ‘J%[WÒUgšÑ&FÊŒÍÔfžyîg_Ì<}&úxß<ùž{Î÷{ž{ï9÷ ˆˆHvü+œŸœŸœÃÉ{L»µÂZñëÄpw’^JzéÖ!ëý¬÷rzszu·‰yÃ?1^ÄäOÔ3ì’-¦ÁÒoéOrÄq;Ôo¬ßh]ÃGÇ m màÎOŸœÿèüG¼Þ¯¼_üäøÉ&6æ #ÞàKä—ö‡ôE`ùðòá¤)°¤ZREà©íOm_óFÌáª®øaÙËT2Dç 2”ľlÌÇýxƒÏà7ô ýX>¹Ïå>'µ µ iÆÜ‡wž|çIC/2tÐAhA-}9ú2K ÆÔI$‰yÃ߈7ø ~CÏÐåcneHDä¯Û ÎSçý&@d\»YYê5­]k'¢æyš§QZD{ =€èï£ ÑˆfF3£™ Ê•ÃX§„¡Ôv­Ik"¢}I¤ƒúCŒê‚uAྡolå¿DDÖuAZ0-LQºgÜ3ü €ßÚ¬6bˆQF'Nœ ’a„ð"‹,&`;vìÀ¯( @Õ¨Blˆó¯ëÅõù:–pOD¤ûKÅÞÚ½µ›þ›ÿ~?Y=Y G¿8zéè%ÔôñécÓÇ`&}&}&º¼]Þ./ôø{ü=~8k9k9kÛ}·ûn÷=²bÜ9tçÐCpbʼnäɨ)÷wǾ;fê©ÀÞ’½%ÆÖv)ѯEDn€ÏÎ}vþ]u7ïnžjÎþ³m½m=KÕ®êëÕ×ÁžkϵçBogogo'l½¼õòÖËPe­²VYÍÚîéïéïé7š«œ«œ«„â ÅŠ7À¦ÑMç7‡µŸ¯i\ÓÈÒ|¶6¥M©fø¤í“6PÏÇò½(=PýðóÈÏ#ðOýŠåŠ>ßšÖš/.\\€¢¢¢˜¼0yaò‚)Ü«÷ê½:Ô Ö Ö >ºRgJÏ”ž)…-;¶ìزôo¾_â>â>"2èôzEVw¯î^Ý-Ræ*s•¹D–j–j–jDüùþ|¾H¯ÀWà™Ý?»v¿ˆïEß ¾D‚‘ +èYZÛµ¶KrEB7C7EdZ½§ÞKr‰²gì\Ù¹2˜mYܶ¸M5ÿ¶è^Ñ=–VÞYùÍÊo v¸v¸vØüãh·n=ÜjÚgJgJgJa]ãºÆu0›7›7›Îg‡³2²3R3R¡åÍ9rXŠw“føø™ŸÞˆŸ1£ ¸´/e_ŠY%á¿,8ðãò¹Ð\===m&ØØØ ¡±ÐXhÌ´ë-z‹Þ¾k¾k¾k 7éMz¨Q5¤†ÀÅ?éŸDé?F #…¦þ}¯ì{ÐãUÉ…‡úØåX_QþÒÇšU3!•ªV¨ *  ‡¨‰&šp„‘ü&¯ó:è~eUV•¥²©Ãq~§gÊ3æOóS¸kô1£Ð—ŒÎ»sÙÎeÀ۱άFµ€>ˆÎDg~‘TذbÞæ-ÞJlXxð€ò¨[êàû¡ÛtõŸØÁ@Œv¦ìLÂwþÇ÷®|l_í{ìñ|Áþ‚e=NJ‚xgIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.7.png 644 233 144 2425 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÊIDATHÇÍ–_LTGƨ.@1qDMC"1š£/l#1Tb4 !ESZ«&­%†Ò'ÿ$ >hM’ȃhÕ®<¬A¥‘DC`µ(µ±›&–Ò%MP#‹± ,Öìî;¿>ìÎÞKiÓôyÙ|gæ|ßwÏÌœB!Å$;“É™1œü™OÝžº=ÿF 7KHÚ´û×ã°°ia@Ö•¬+f¿…õ¼^oÏÂâ·ëé¸X$¬€Ããð$¹âøì]·w]ê’þæ!¤ÝJ»5mÀÁ;ï´]m»Ê0üxø1À˜kÌÖóz½Î×|v~qêoúBÀ¼»óî&=Ç|Ç|!`eñÊâU_Æü± vîØ¹àUÊ«• òO tå&™DÖóñõ:_ói~­§õc~de »*vU¤]Ž%ôµËk—k½è-à gHcÒ˜•²’0¨‡ê!I$…õ¼^¯ó5Ÿæ×zZ?æGÌÜÛóÛ ÜQ@NËiPyF½QOÔè70@™>ó‰ù„YCyU·ê™b˜† ò#Y'ëP23r4r”¨úÀpŽÄ?bªÌ(3´ÁóÛl[)„ï7BÚpÚðä{„&&:ªY"Kñ1ç8gsp–³œ5¦ÆÔ˜-þŽw¼›á5LØÍýæ~Bš䀄„~ÜOÜXópøÄá‰äõÊmŽ6[…ðçø³ýÙÐÛÛ ¾ ¾ ¾ ³+6¸xpñàbhÚÒ´¥i \½4ziÜ·p èû¶¯³¯• î‰éYú1?qc¾¯ 5Øs@}ª¿¶o}ßÚ¾µà4œ†ÓW½«ÞUÎjgµ³zªzªzª,cÞ5Þ5Þ5°yÏæ=›÷@ioioi¯u`Z^´ô·ô[Õ”Z/¦¯ýÈôfz•†7o3yfnr»êvÔV×V×V[ñ‚—/ ^Â…ë®_¸nÅ#Å‘âH±…¯å\˹–eî2w™ÛF<¤<ÊÖñˆék?²2²2Ìß`dhd±k¯ªÍ ³ÂâñWú+ý•PØXØXØ®#®#®#:::9{Kƒ7ƒ7ƒ7!7È @OAOAOí¤Ý ²!Gúq?³+öóLg÷ŸÝ{v,]°tÁR¨“u²NÂTÇTÇTDZ#­‘Vðûü>¿ÏÊ»˜~1ýb:l-ÜZ¸µÐfè…ùÜ|ü®.«Ë@äŸ+–,ĤkÒõËOB<èzÐ%_ !â—6ò4ütüé¸áŽpG¸Cˆö’ö’ö!òÈ#!š=ÍžfûÚ÷µïkbâõÄë‰×BôÖôÖôÖQººtuéjaµ8q !r•TRDÄ|­ÓOø™u+»õ-‘Q…ð²ð¦ð&Ô›Þ7Þ7^ †0fÀ„éîéîénx»â튷+@V§Õiæóƒùê u…ºl[ÐI?ý(¤1nŒ[]à_n¥­%úŠî33úÌêKÿ1>çìÿÕÇlß(O)OÑ$ÑG—E²”GfÈ ¢êGTA”ú^µ©6à0‡8jTªQ`”F€e,a PC -(0™Çˆ•^éµñSžZžª+5£óÏÙÿÊ9ûº˜³ï±¹ù‚ý ΈSÂåY7IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-65.png 644 233 144 2471 13755454065 14677 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜîIDATHÇÍ–mH•gÇ/oǵq†Â4¡í„­¢7ˆ „ì¬3+ˆ ÍmÄÊ6è ²ZDô²ƒm9‰ -K(•¬ˆ¾¤5Kª…›EΚJ’g¾í<÷sÿöáœçœgcÉ>zyø_×}ýÿÿç¹ïûznI ?YŽ,GJ;¾ŠÆùÎü á bVǬþõH­N­˜T7©Î|ÅVÞšo¯‰òÛõ¬¸¤I4x!ñBL^€µ3×Ît~ÂßÞ‚¤¦¤¦A6]Út  ñlãYÊÁwÇw ?¯?¢ØÊ[ó­z‹ÏÎ/þ¥/ñWã¯Æü‰ ‰ "½4{锯C~ŸEË‹–¼Š}« zd’u €5úlØÊ‡ç[õŸÅoéYú!?®Å®Å"°jýªõIµ¡‚'ç`gæÎLK/ØTRI2# JT £ oé[ÄQlå­ùV½Ågñ[z–~Èüsm½ŸÁçgÄÐmꚺ`Ö™uõ&]¥«ÐÆ/F»ÑfÀ0>| *Ô.µ Ô§Ê­Ü ¾P‡Õa4ËU“j"êz ‡ù#z–¾Ø å|I¾$_ ž©gÊ*¤Ì*³Š!> —\Ð=ºKwÕTS 8qâ´Åƒ 0ʨ-ŽYj–2½ˆ~ÈOØØ‰Ÿ¡l_Ù¾Hñlk ôú†¾¶2ÝåÝåÝåà]ä]ä]Ú´?hj¨¡kkk¡&·&·&NÞ;yïä=ðÿæèq§I1Ä»ž¥ò6öpœwþ]¤n£î2ö{£ïêwûÝ~7,ÌY˜³0Vl_±}Åv˜¯æ«ù ZÛZÛZÛ {Iö’ì%Pè)ôz ô~éýÒûðÜûÜûÜýnúKÃa8,~½1ªò#ÒšÒª/€ožo^´P­52Ì(>×{®÷\/dädädä@Ù`Ù`Ù TVTVTVÀ•Á+ƒWÁ™âLq¦@Áæ‚Í›áÌÛ3oϼµ­älf1 ¸«écö%¶ôC~âDb‹b‹˜.ÿ4þiLxç‰_þ”tI—0\†Ëp‰„„EfŒÌ™1"r:ùtòéd‘¶¶6‘òŽòŽò‘¹Ýs»çv‹ìñìñìñˆ$-KZ–´LdÝ£u×=1ÛÍf³Y$Vâ$NÄ/ßß,.‘Øi±Ó˜î1/›—c:EŒ•ÆJˆ¸ä„ì,i i i "ë'ÖO¬ÙâÚâÚâIu§ºSÝ"==="é/Ò_¤¿)ö{Š="/3^f¼é7ú~#Ê'µ²[vÛô"úa?ïÛc|§æ¨9Œr—Z¢¼¸¡¸¡¸&¼žðzÂk(9Zr´ä(tï<ÞyL^0yÁdHõ¥úR}P( ”`¸~¸~¸Þ¶rsŒ£cÌ=6ö©ä=•:A'èè;Õwªï¨BU¨ m]âbðbð"ôNíÚ;Ìj³Ú¬¶êf”Q´­ñŽu*ÿ£ýéc̓ ñ9G8fÀì3ûl§kƒÞ 7€Ùj¶š­ ÷ëýz¿-ÿ‰ÎÒYÀGä“`zM/CŒü¯>6FçWꦺ `n5·¤™.ºÐú¶nÑ-ÀákÃâè}]_ÎóˆGh0·™ÛFùÂüïïüãö_9noãö>6>o°¢ìpP+pfIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.8.png 644 233 144 3012 13755454066 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¿IDATHÇÍ–ÝO”WÇóÃDÂKÂ&†Vtàb‡4Å6î†pa Ζ&Z•Q:54M $]·º¡M»‰1ÑÈöb—šµ\øRÄ¥KMÉj•tð%)) kØ`­e"30væy9Ÿ½˜yæ™Ý¿Às3ù½œï÷›9ç÷}Ž€ˆˆ¤~œëœëœyÉØùžÏy#ç²îdÜa€#èÞ= ùŸçPx¶ð¬9mÇVÝêÏÜ/bãgòYy);á¹à¹à¨IÅG!ôrèåœ_%ã¿ ‚·×Û»ªCÓ¥¦K;/vò{x|óñM€¥š¥°c«nõ[û-¼L|9úü"u9ë²ã?àÉöd‹Àú×׿^ú‡dÃ÷¥°cÛŽm?¸~p)' @.¹ªˆÅZO2b«žê·ö[x¾Ågñ'õUU‹@Ýžº=Þ3É ÓçáÃ?|ÑâÓz6ÚÈ=ªGŒwŒwˆƒTƒ8p€[u«ßÚoáYøŸÅŸÔc¥)"ò×ßaìÖwëiA7Ì\ͧù@Ý6^0^@K”¹dΛó ?Ôçô9Påª\•c¯‹,¦#ejz¡^ˆ¦?ÔŠµbPë“ø°;¼; µüÓ7?}£¡Ïßç󽤷„ò¶æm}µRäµw_{WDýC*¤ÂqfûÅÃ;†E†?º•w+ODý¬–Ô’ˆÞ¯÷ëý"ñH<ˆœgÀ)2Ý3Ý3Ý#kµÆZ%½´n­[ë‰/Ç—ãË"æ@S IdúüÔí©Ûâyöï…ò…rÇÙYÓVÓ&"þÜ/r¿xµÒ)¹†]ü$_»WÝ«"YGeB&dqÏtC~C¾Hñ–â@q@DóhÍ#¢5h ZƒH•p%\""¬²ÊªýôÓo KlOlOlI ÈÀ¹®. Œ2¹ÌZÖÊ¢HÖã¬Ç"²Áùó^rŠaöš½Ž)qjuZˆüVDDŠÒÀfÂH"žJO¥§RdÒ?éŸô‹”Kƒ¥A‘¾}}ûúö‰dffŠ   ÙÂF£ÎQ§HÙ¡²Ce‡ìþ¬Ù¬ëY×EntkIŠDÜ?ºQu†Óp:¦R—ÿ»V.}yîËs@~òŽ¥®H¼:P]U]Wž]yvå™}wjKjKjK pMášÂ5ÚÚÚ w÷ßÝw?l\Ù¸²q&f'f'fa§¹ÓÜiBÁlÁdÁ$Ô½õæ/oþB|ñ”z_½¯áÂý ÷Aý)©ÇžJ­å“–O€‡ÖT׌k°üÙòWË_¡Ÿ%>M|j Ó7ë›õÍŽ…cá˜bŠ) ªƒê <9ðäÀ“ 6©MjÅF±Q áHx.<‡2þ˜(O”ÛSÉTKIKIæT’ö±yï|Ô 3+3+iþ­Ä̳æÙ ûYÍ«yP9*Gådø•_ù•Ô¸Wãù‡jNÍÊQkÕZµKí"¦~ÄWßό̌x#ÞHÔÍÕÿñ1TÊyU½«Þe;?ý‘þè0bFÌv~:8ÉIP×Õ5u 8ÍiNOYb Ô¤Sc@8Õÿw#bDÐÔu}Q_NZÎ_ï®wCÒ˜2ÿùýV>·¯‹çö=ö|¾`ÿ ºÛ’ìJ¦IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-20-red.png 644 233 144 4242 13755454063 15575 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜWIDATXíWmL”W>ïÇ8€tg!±‚ nD×®J ~!euÛµÑ4¸¤b¨¤þ¨"Ž­­ Y*ò±ê*I ´TMÌ”AÒÁî FÔ°Vhv…¶µŽ _"ÃÌ;÷ÙÌ}çcw5›ÝógÞsïùxÞsŸsî;Dsòs q£Ö¦µimÂïBø¼†y óÒ“dEVd¥ë%R"%sÛ¬œd’Iæ:¨³rnÏýy<?0Ÿ¸1?¾|ʧ|Ѹ¿ð%¹An¬£Â!ápH¢‹ÇŸwôíèÛÑìÚ9´sÈHÍHÍHõé|ŸÛsÇçùž‡Ä_êK>'ÅIqr0‘W(&7&7&W9\s£æFÍ 612121@‚ Ә¦ bƒ€ª{÷¹=÷çñxüÀ|K>z6>Ò¿ ‹Ãâðà_x€Ô¶Ô¶Ô6÷†×€kÀ…x…ųx·R¨*…€²ZY­¬“bRL~ºwŸÛsÇWä׿ B¬‚U°É%r‰\b鿆rC™¡ÌmR½Ãβ³˜p[f«g«6èºçº`V©P*Fx(³l+Û °A×·®o·ÅÙáìØ;,…¥`‚›Ê ' 'Ü&žŸãáøHs_s_sÿ7k¹¾X_¬/fKíì÷í÷1æ3¡œtýàúЋ^À—B}•fÖ HB°*VÐBû¯öÊIW««UU'ìì°cúb}‘¾ˆ-åxT|òù€| ³„oTæTfWf³·¼¦ÝV×W®¯ü28{[{[à|ãùF¸|åòxúùÓÏño¤¿½¿>»öÙ5榶&À¬ÜV÷|÷|Õxº2§2³2“½¥V61GäªÈU‘«P>š>š>šÁ܈åï|uÿÕý Þo@äÙȳ@õTɡɡàŠsÅ@_H_,Z<óoο ÌÍ ùù€NÜ£é£a£aÇÃñq Ø~jû©í§|o¦ ¸ŽºŽpð¥%K õõÔ×*–ÑŸá a a3“3‰­‰­þö_¼üÅË~öŽ;ïÝyPOs<Ÿèm©—4FQcT{LKyâñ -àK[^Üò"‘¹ÃÜá?)””¹Þ”I&"šÊŸÊ'"ê)í)%"2™L&ûôOÓ?%"¢nê&¢ïN|w‚ˆ.Œ­¦NS§©S[žÏW–•T‘T‘T»3ÂŒ0#¨G=êÁ°—Ýawü›ÁâN€3mgÚ`^è¼P0ì3ìǤcä'ò¨Ú^µÝ¿X£‡Gpz+ÚUÕSÕ°„¹ŽäV©©©¸Ëñ‘hM¢ÉõлP~!ÿBþ…|? „ðǡ׆^àLìJìí×Ú¯àTø©pP¾Q¾ñWWEiEiþ,¯¯ÚK{åÒù°óa¾|×N_í¼Ú©Þ€û…!AHp=$i´NZw¬”wYì/ô½GYbÿ]ÿ—ý_úÆÛœ]]ú"}v¯ì^™?°ñ÷Çß÷×ßÌ~3âÆ=ôg_ÍO5?ø-çtOMO œÓ@7ºUÇV¬]±Ö£^ÒBi¡´ð“1 7†ÃDòuùº|½vXø¯œ|å¤RLX&,€Ç¬‹ÕÅ ›˜'æ˜Ö¾ª}Ä.±Ë¿™,-à‘ã‘"Æ"ÆL, `LŽ“ãÏ'寮›â;êÜ[9krÖx¦U€yRž”÷÷Ì9=ÔAó±&Aþ^þ~ð* ×=zĆèõîj%?”ŽIÇÌš‰Ld’õ>¬i”Fiò‡d%+Y‰$‡tKºu¸Q½Z«c¤É­³íŸéŸñç®Ëè2€­D`ìö€i¯…E²H€eº†\CprÇ]ݵs×N¥@½¦äyÄv<ê`ÔÁ¨ƒD¢A4ˆá’]‡9ßû›)Ý•îJw…¦¥G–Yz„H“«ÉÕäÚŽ«ÜM3¤Ò”žÐcö˜=f8aƒ 6ñ}…U–+Ë•å>.V¬¯X_±žmVïrF§Ñ ÏÌéúÀ“šƒŽž„ µ=Pׇh4 šû%wÍ…æB¶Y::·Î­óò<ð<ð<ðq±wî[ÆÚÚÚËv¨œ ÃÅð7~DŃðiéÙ R…ww »·ìj…Z¡–Ï9ÏÛ¶[‹­ÅÇ]w‹»ÅÝâcîÓ¨§QO£€•ã+ÇWŽ+¿T¹X'ÕIug“9Õ¼Ô ø3zŽø xw’û§õ§õ§Ý:{­½Ö^ À 'œçHÍMæ&s“oìÈÕrµ\ÝëýKz3(¯wž0X¸Ã^î^þOÜÝ´mÓ¶MÛ|ܵ%Û’mɸ8·ÏÔ“²„,!k˱À4âã ¼ý—ò<în”J¥R©tp5œUœUœUÌþ???ëþ›zÔÉ!9Ì1d! YÈ;v${P>-ýÌÝãú¦~a°GØÐVÚJ[=¿‰‹ÄE€@ ÔÚ;;;M$uJR§pÕë˜trÿ7Ñ©OF2’QîÜ>š#2‘‰ š…f¡ù‹çÖ—Ù‚Nf (îsúŸýhvûŠ'IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-11.3.png 644 233 144 2644 13755454066 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜYIDATHÇÍ–kh“gÇOÒô—Övv coë6EÑÑnàæ¥¢+K‡‘ 2§m±2'Ì1750„Epc­%u[]£îRZj¡lU‚kGtvZµÄVjšÚÒ¼—ç·É›·[ÙwÏ—ð?—ÿÿäy8ç}DD$?õ+àœíœíÌKbç.ÛŸ³>gýüo’øŒŽJGå­Ã0ýÔôSç Ι½6¶âVþäz›²žå—|±Ù³/:JSøSزxË✗’øx¸›ÜMÏt¨þ®ú;€àùàyöÀÀõëåå`c+nå[õßd~ùô?ú"y9ó²ãoÈÎÊÎï:ïºy%î̃Šd<ÈPN0U ĉcÙÐ$lÅSùV½Ågñ[z–~²ÂÕ…«E`óÖÍ[Ýg“½`ÿ+û_±ô´&à(Gñ€×ãÆ6c ÚT`c+nå[õŸÅoéYúÉ~ì«4EDN¬Å¨Ò«ôtCf®6O›êwÃkxÑRee˜¹æ æ  ºU·êƶaó8”Ù§ichz¿6K›j~’ª«§)ýôU>yýKp÷¹ûâ.šoϹ=ŒVÊi6—˜KKK\¢‘F0ÚŒ6£ "4©¡F±¡Ò•®tà3Žr@­V«ã‡M¤#ÒàŽ»ãq&ûIØ™vžÖV×Vƒ: `.µˆÕ}}¨ð«á¹á¹L±@M &Pá’pI¸Äö›%f‰9 ‡ï…ï…ïÁÉwN.:¹‰öžï=ŸÎ^ª~­É©É±®öL»P,"Ò½ê×Ô¯ý0€úðý_¯† kD®Œ_¿2n ùŽùŽùŽÙ3:::=µñ®¾®¾®>È÷çûóýPyªòóÊÏavÏË^>ÀÄ__ ïÞ­>„&W“ ̦d?NÙ’WžW¾ìm‘UÕ«ªEÔ·²D–8Înª®ø¢â Éö~ì=ä=$¢ŠU±*–´mòoòoò‹x¼Þ³È,2‹dŠ‹Ôµ×µ×µ‹ìÚ±«nWÈ‹‘B³Ð”챋=~ä8+R* ‰ˆÇsÈshÙÛ¹¹f-C¡¨¯ÓcÀòíË·/ßÁæ`s°yꉤãfÐ š¶_êQ=jãØ‘Ø‘ØØP¶¡lC¼þîkE¯Á­{‘ŠHCðìø³ã`ÞÊ»ŸwßìqŠa6™MŽqj›µÍ"R"""…Ö?Ö ´éÚti•Viz"Z¿Ö¯õ‹8‚Ž #hûã3ã3ã3EN4œh8Ñ âË÷åûòEZ®¶\m¹*¢ÞTy*O¤s}çƒÎR(’ÙšÙ*¢Þ0îw=NqÅ×Å×Ýì’‰¶–¶Ç[""ìLñ'rûr{s{E2]™®L×ÔÆ<žNO§È´ÓL[ 2>8>8>(²²leÙÊ2‘þþ~‘ÑúÑúÑz‘{f옱CdñÉE»í–„ïî7>¸ÁN‘ïŸ|ÿD$ãÛñµãkovÙS©Õ¬=ô[Si\3®AÌkˆ5 ¿&B‰ÐÔ«Œííí­J«Òª€,²È‚¡ò¡ò¡rPªQ5‚¶P[¨-„è£hO´eÜMœN¤‡Å\Jo­·Ö;y*Iﱨ;wAd42šÖ-³Þ¬Ÿ´Ç@Gçÿm”QìzÔÏê'õ¨sê’º *TcÊ•äW±Hw¤ÀsÇâ.~ù×A¥6¯z/ã½ ‹Vë [¨?FÂHLÝüdáÂ\à€Ñä·Rý¡nª›é1R|büfü†¦~´øRü¤ô&þ»ùŸßoåsûºxnßcÏç öÓçÝžêQùcIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-23.3.png 644 233 144 3110 13755454067 15023 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜýIDATHÇÍ–ûOÔWÆßÊE&8Š—ALIe¢¬Ò¤ñ’ ÔF”Ðôa£`±RwµÛf›MwÃjKÇQlBí 5!ZÁKec·©ÑfÑjÅe@F‹RË( rÙfæ{>ûÃÌ×/Û¿ÀóËÌó^žçÍœ9Ï9""b } „%…%…ÅqØv#›r"ˆk`Ê7åwþf™}`NÝœ:­ÛÀz^¯ŸÙ/bðÏÔÓãb#ÕÕhÊá}ðZÚkiÑóƒ¸ê"Ä4Å4ûá­¯Þú àËã_çxðýƒïF²G²ÁÀz^¯×ûu¾™ü²ïWú"ð\Ës-¦{)É/'¿üüïƒwž‡¼Wò^ø%ü—p`Ƭ²/^ô54ëùP½Þ¯óéüºž®œG`^Ö¼,ØòÆ–7bjƒ Ýõðn⻉ºž¯ ¨¤3ø½~/@ (PĨ‹ê"&L``=¯×ëý:ŸÎ¯ëéúÁyŒ­|$"òq  ƒú €ï²¿Ë·À·´v_¯¯_hR¥õhZ'øûü÷ü÷@¥©4•†±þËCO‘Òîú&|øü÷}‹|‹@¥ù¡ÀSàFu}}+¿±†oŒ×¡¹.».¿`#¨ •Áßpžó y4æšh¢iÆ g9ËY ˆ"ŠŒ°šT“jø•T¨,•Å_‡øËBz!}nç ýb5mê\™©Ì¤Ói¿íIt:NpÄ;Âá¨k)×R®¥‚W;®v\{º=Ýž®‡®‡®‡F^;¦ÓŽøfß;›}`_k_a_r tï>nè© eÑeÑúÖÖ´‰–!"r}/œùô̧Ðù/÷÷U’4‘P“PÃTæ¢ÌÙ™³ÁÚ`m°6€Csh ×-®[\›­›­›­t'éNÒ¸í¸í¸í0j_Ú¾´})XZZBþ‘üó?„¤®„÷Þgê§ÏFvŽìT%ÐÑZSpž0ŽÅ:b+_±mµmùiKGUG•©öõ?½Yûf­Dµ>hk± Z-ƒ"ê/Ô_¨Ù³zÏê=«EJãJãJãDæÞ{wî]‘ñ„ñ„ñyºF£ÎQ§Hy[y[y›ÈömÛË·—‹ÌuÍÓæi5Ñ8èt›jE²ÏeŸ³ùó+_üsbæÄh]êžBO¡qì{ŠnÙnÙ ýpúáôõ;kwÖnx2üdøÉ0xÞ€7ë7­ß´~X×Y×Y×3Þñßk¥•V«««€ ¶ ¶ 6°®K]–º :û\y®<†`¼j¼ ´Î¸Ÿã~ÖºDû¼üC5Âhÿh?üç@OuO5ÌZÝÝ ¯¨¬¨4tìv»Ýn[±­ØVlÄS‹S‹S‹¡zMõšê5F|¿g¿g¿råÊ=dÄ—ýá…_xަ~¾òó•Ó§7‚?0ë»Yß©Æ0µküèøÑWDÚsÛsE®.é¾ß}ŸÒ©¦©”©™nù¨e_Ë>‘ùk篿VÄ4b1ˆb±XK¦%Ó’)’ÑÑÑ ’³0gaÎB‘U'W\uR$Ë–e˲‰<>õøÔãS"ñïÄo‹ß&’f_±sÅN™~½wë[¤T¤ùQó#‘ð/&s&sn\ª‚§Þ~ïí÷à‰?xJÿíþÖý-¸ÃÝKÜKPîeîdw2LNN‚?ÑŸèO„û€}ÀÚ.m—¶ T‰*Q%0T4T4Tê´:­Nƒo¹o¹o9 ¸ººPÞéO¦?1N%Ý;’w$Ï8•Á/†î+!Ÿy¬¨L<õ¥Kê’ºªNÕ©º~©"U$¨~Õ¯úgÄ¿VͪT:£Î¨<•Ç„Šò«1×u×u€˜±˜1oçÿÏÇôàãþZ°·`/¨ú 3«+sÀ ê¤Ô?ŠÏh§ÅGAÃTÍ!Áœà0Ê0àœê†ºº=Añ—Àð©úûýýÀ?tç5üÕp`ê×ÎÿìÞ•Ïìëâ™}=›/Øÿµó gß±¾ÐIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-22.png 644 233 144 2417 13755454064 14667 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÄIDATHÇÍ–_HTiÆ¿9jãXZ3¹ˆØdÛBlat3Ml +8Q–ÄRlD,±v·s¡dë¶ ¶¶!‚[¤PvAVv±9)•Í¤ÔÆæmFØæÌ9çûíÅ™sÎldì¥çæð¼žç™÷;¼ó B±,ó x¯Rd`å[;ž_•_õÅwjàØéØùðXzvéY÷y÷yý±Í¼YŸÝ/„ÍŸ­gÆÅ2aœ}Î>G ƒ›awÅîŠüÏ üó ¸®¸®¼SáÐÕCW.w_îæ;H %†ÞÞÀÆfÞ¬7ûM¾l~Ñü¾w-ïšãOp.r.Ê·—o_Ý`L¬†šêšj€9/r¤Ú+` KdH’Ä|¦²°™ÏÔ›ý&ŸÉoê™ú†Å[‹· µuµu®ßŒ†Ç=д¢i…©—¾´ÒÊP“j@«×ê™9(pà›y³Þì7ùL~SÏÔ7üˆÿžíé¯`Wþ®|ËÐf´Ú ½Cï -?—Õ²©Ž©£ê(è·õ[ú-kbȲL–:¦Ž¨# GõY} zH‘&¥ h€Ìð[z¦¾È6ôå/àJ¸É\x¢=Ñ€w| úý 3rŠJ€o¨£Î6ÂMnrôq}\NqŠSYùŸh¡äJ)ÐÛô6f˜5ù3z–¾á'c¬ó™lz¥yòw‘ã÷ÄËâeñ2h_Õ¾ª}܋݋݋Ù>b¹±ÜX.´/o_Þ¾¢¾¨/êËšè?ä’‹ä­:©Nfë™ú†ŸŒ±è÷pqúâ´Õ~PŸLŸLŸdÎŒ<ª|Tù¨¼ªWõªà?â?â?kBkBkBÐì vaíⵋ×.©¿Ô_ Þ£Þ£Þ£pwåÝ•wWÚõséMéM&¿¼>¼> þ ÿ„ÔVµUm…ñØxl<h4`&<ž gùÈÓ§õé,=Kßð3ÿÄF´sÚ9?ð<ð<ð@AIAIA 4ËfÙ,AëÖºµníííWÊ•r¥à„ç„ç„’CÉ¡äèûô}ú>à/žóx!{eï''öñoL«ž{=÷ÚþÆz&z&z&@V†•aØÛÛƒòÞòÞò^‹ƒÅà~é~é~ >ŸÏçóAQQQ?\º~éú¥ëYGy!U•ªšÿË5–ÆA!ÃaŸboËÞîç4å å 9œBˆQ#Øó÷žg{ž ÇŽE; w ¡Îª³ê¬JT‰*Q! j j j…P©ÇÔcB¤Ž§Ž§Ž áˆ8"Žˆž³îÓîÓBil©” ÎÌÒºoè;„ågÞ=†µÇöëû™á­›³çø¿žê3|ÿ'÷ØG6ŒÍ¬Åµ8ð«ö^{OZöɇò!RÞ‘rdÄxãÆÛÆV>SÏÚ+íi‹ÏâŸwó/ØÿÊ{»X°÷±…yƒýLbK€¸£IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-19-grey.png 644 233 144 6035 13755454063 16003 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÒIDATXÃ…—{LT׾ǿkí=ÌËò4zQÊ”§¯„ŠÕ …ÓmÑp¨±@¸6L¯rÕ‚sh5p í­r¸%ñÚ܃ÐV±8n¡Z¥ ‘NÇð TÞŒS˜™½÷º0Ʀéµö^¿ßg¯ßwýÖÚ$+++++ ®X6ãrCwóƒü ?Èê³®f]ͺÊdgåûåûåûI&ÿ„Â?i/!sdŽÌý½8{]öºìu]¹É¹É¹Éd\ð|_³Ì!ýlçr¥+€áG8ýZÊ‘r¤égë‚uÁºðâö]Ž.G÷õ°uÜ:nox`ÞfÞfÞ’¡>¯>¯>Úèèh’* •…Ê€íîÛÝ·»޾ã¹ã}Ç|‡¿ÿöxŽøo_Á]Ì™93g)‘¤’â{žóå|9ßÛ_.”/”/”¿ìîÑàÑàÑ žŒî‰î‰î¡¶ÍúÍúÍz²Ož)Ï”gÂŒð>‚ f˜ap‡qÀKx /Álñ¶x[¼±OߤoÒ71Û?þ(œykæ­™·¾Pùª|U¾;bŠ˜"¦DgZ¦eÚÁDº‹œY:³tf @šÐäý_Ã×ð5M׬‹ÖEëâË{5{4{4{„ðøãñÇãó_»š\M®&h°k±ógþÌÒÓ˜Æ4x£³ÑÙ茪KU—ª. ‰÷î Üãï;)”NÊ¡:a¿°_ØÿÆ!¼7ðÆèoTÙ¦lS¶2O™§Ìó¿ïšëÌu溗÷jâ5ñšxaŸ6Y›¬Mæï»r®œ+‡µÒSé©ô`),…¥€Gâ2CfÒMºI÷jhD# ÅJ±R,xñ xP<¸L¹L¹La­Ã¿&N§‰ö9â;x|$§>§>§>f»µÍÚfm«ksþÍù7çߘߑÑ#£GFI›k™k™k(ó`ÌÎ8ˆƒ82BFÔ¢µ°€j¨¡Ø`™$“dXÖVLJ’’¤$€–ÓrZ“ñ¸ñ¸ñ8¤+ê+ê+jjr1¹˜\ˆÁ)Ô)Ô)to(e,þ#Îa‹°E‘‘‘ˆ¶:I­R«Ô gü„Ÿð@ I!)úæúæú总ywóîæ=˜Á2X@4DC4ÀtÅtÅtо­}[û6`È8d2TI•T H¥‹ÒE8»^r½äz N‘í‘í‘íˆvð8ø¨à'ø ~¯q›v›v›ÆÙ-["¶D"û‡;Ñ0Fà T À°8,‹€®_ׯëzu½º^ÝêJ‘|’Oò_„_„_  º º ¨O¯O¯OŠêŠêŠê€ïÒ¾Kû.  'è zbeºÓ– [6lÙ@Š<>Þ2k™µÌâ«1c6Æ SÙ¢lQ¶À,Þo‹·¡â¢¸(. R ©†T@éÑÒ£¥GÛ§¶OmŸžë=×{®_÷Š{Ž€î¾î¾î>ðÚǯ}üÚÇÀÃ8 îÜ=¸(N*N*NB‚C‚C‚õüz~=^ù•ò+åW0û¼îóºÏëÈì˜í˜í˜Å9ŠÏð>#ô:½N¯¯Ä““=dÙ³ à«õÕújOJ>)ù¤¾|+ø`0˜žÑ^³Ô,5–|K¾%X›¿6mþêsêB](€t¤#˜89qrâ$ž79M¢I4 À\ÁÈs^œçÅ*La¦0SÙ"$ ‰B"^áSø> `á:¹N®ó™_&—Éeð€Çê¸Ì$3ÉLÀNìÄNߟýþì÷g¡SC§†NÆJc¥±°mF›`7ÙMvse:³·ÜBÇBÇBúé>ºîcT‘§ÈSä ýëú×õ¯cÅÅÅ6a6aÑ^VVë¢ÃºÐ….€¸WâúÌx*R‘ DùDùDù±ƒ±ƒ±ƒ€­ÅÖbk‚ÔAê 5 vS»©Ýš@hÂÊìEƒÖ 5hØaÌ0†*úýŠ~¡€"ñˆÏ.á³ø,>‹d6º7º7º‹ã«ÆW¯BE)¥”ÂÄÂY8{¦¼Ð šA3’HIâ3 …(D!pM¼&^‰[·&n4ÐüA3 þAýƒú€r”£àWíWíW ”PB U­¾V_«—‰ˆ…D$"¿tâ=ïxÞñ¼óù鉜‰œ‰œMÿ>³}fûÌö¤ªUªˆéZh¡WÀâX‹ƒÅ¡!ˈeÄ2X¬ Öü΄={\}åê+W_ÚÚÚÖÂZX ðî½wï½{Ì¥À¥À¥òªèªèªhÉ<6=6=6Mï«æUóªù_Ùt6Mwò"93rfäÌ€V´¢õß.È&d²‰Ÿ•óºyݼîem”2J¥doÆTÆTÆT’;- µµµ‚HR„hÌ³Æ 000Ëg40<< ½3ôÎÐ;€×¤×¤×$àUêUêU sç /t¾€ƒåærs¹ß+Ÿ(Ÿ(Ÿ,½Å8Æ1.ä ‚„ ÇG)-¡%´„k£ù4ŸæýMê“ú¤¾«ªIÕ¤jš4Mš& Û¤ÏÐgè3ð­CK>©>©>©«€X–V—îeîeîe@HKHKHË  ÉôÐôÐôªÚöÚöÚvA#—ËÆb$Fb<-‘dÙñø( P€ÞÛ~ÍC—ïü?Èyržœ¿sŒFÒHy²Zh¡¥uVUgR××ס"ÉCò&©Bª*( €bÝèF7À&0ˆD$²"çºÂºÂºB1}®h®h®ˆ¿ ÷–{˽¿Í È È Èûâ6²‘lr }èCŸ帪1Œa ]HCÒHÍÆêÕ« (Ž(Ž(Ž|›;ç9ç9çÉ«fªfªfÄtG@2E¦È,ÐC=Vsï°]Ø…]`´™6ÓfÈ[ -†{³UߪoÕsË»tÉúõë7§>ïÊîÊîʘ˜.v/¥P³½½.­‘ÖHkàòè×G¿>ú°¦YÓ¬i§>_v8x½G×£ëÑqõïÕ¿Wÿ{“#ÇÈ1È¥2©L*³ï^°§ì){ DÀâ”aÊ0eÀ· [¶6l…‹z\=®¤0)L ;õù²ôF—ìR¼`ß 1+ãÃí¿$r{מ"® h@ƒ˜NÂI8 óÀò/Çí›¶T[ª-U:‘ %H ݽ9sþæ|ì—º¥n©*Dƒh,B¦)dB~Ùÿ²ÿe1`|ÇøŽñ\¯b«b«bkÁÎåMsò¾T$IEü{fÿæÈXnnnnn.LŽ…}`ECví¦Ûµ{Á®Ýï~§]›Î¦³ ©Æbc±±x¥î>u¬Dãbãbã¢d---âz§§§»j-c–1ËØé/zßî}»÷mÀ¨±ÏS9Wêöóõï¹TvÍvíÞüv½æ¼æ¼xceVeVe–˜n¿Ñ»èÝõîzwü«©­©­©$ªºUݪn@ÒHIsâgþ}þ}þýÅ×ýBýBýBé¬=Þ;Žªò<‡?°ˆˆˆˆˆö®ž91'æDþsCŸ¡üŸô¢ô¢ô"ûÒîWg4ÿÅŸØsÚµ— 1Çp Çøv’L’Iò]VÏêYýß+}”>Jú˜憹á1éœtN:—úk÷¡îC݇€e@øÙý9.–‹ÆñÿÆkÍΨ¸IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-19.4.png 644 233 144 2743 13755454066 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܘIDATHÇÍ–íO”WÆo˜)8]AÙØ¤¦ƒ´£Ó¬M*…¤-b”lc–G6fÓ I%Ä,M4ëj7) 8‘Zµe™d)n5®P§®_PÀ·LYXP¬ ÂÀ´80óœóÛ3Ïlûx¾Lî·ëºÏsÎ}Í‘•±_ÄôÄôÄÔ¨¸ßò/+YV’y>j·PžP~§V|¶â3€´Ö´Vu߲͸™_/báÇó™~Y)–#¹=¹=¡0f7Àî »7,{%jŸìG§£ó§¸½n/@ÇÙŽ³ü~øî‡ïf g Á²Í¸™oÖ›xñøÒð3~x©ë¥®„ÿBrRr’dg¿y0š0ô&¼SöNÀ#Û#›Nã)°œåºÄ\Sq¶å›õ&ž‰oò™üÑ~V¬*÷*ß«tœ‰Üÿrrš|áNàÇX‘`$`¼o¼Ïè^Ý @ `ÙfÜÌ7ëM<ßä3ù£ýXG©DDNaTD*"K ùÔòðá7@ÿÛxÍxp, ÕõP=„ÈtäYäèýz¿Þµæ™e˜‹æƒªRU„u­ñµñ5¨”(>T„*BÀtŒé(ÇEDÖ ŽÇHÐÎ?¾ýû×Á¸@)j½Zϼɧçô´žŽr”£qQD°šÕ¬æ—+—\rAÿÞøØøx ¯”Ÿüßø¿pÁ =ÚØúOc_¬å[Õîj7èz•mâyvy>ð|€îßÑ_Ô_dñܾtûÒíKИߘߘÃ}Ã}Ã}V\?ÐôЧõi}Úòt Œ  ÿµûòöËÛM¯Êæ7Ú´Ñ~„Í""}µðåÛ_¾ ‘z½ïw¾=ö`Á‘£Çè1`ìÄØ‰±°&kMÖš,ÈmÊmÊm‚u5ëjÖÕÀøÉñ“ã'­F”S9•Ó²·E¶Ím›ƒß¶äåäå°ÛÆ>ÕÖÖÔÖ\ö#ü%µ4µT·Ã“‹O.Âb&Ø]çgÏÏ‚ó-§Ëé‚›o>¾ùÎUž«>#bÿ}Ä>"2˜ ÌD2m™¶L›Hɵ’k%×DneÝʺ•%’îJw¥»D"Ï#Ï#ÏE}ƒ¾AŸÈPÆPÆP†HàW—/‹Œ=3Æ ‘ÖÔ¶WÛ^•Uû‚ïÞy÷Žˆ*ˆ#Á„{±ËßW‹÷¾VDÏ<¶“…‚uééÐíéöt{@ «a5 …îBw¡œ;;;¡®¶®¶®&+&+&+À•çÊs寯¯õ[?iü¶ÞÉ?”Ⱥcüú‚í‚ ø£yÇÌ© WTýðМJã²qfÿ:ûÕìWèźÅÚÅZ‹`atata&6OlžØ ç8ÇAªQ5 SW§®N]•¢R¢š]¡HèYèznûŒÌHÜTþ³:±:ÑÜ–oÅÔ pL8&‚vðÿèÿq §”:«ÎZ:Æ+¤‘z‡Þ¡wÄÉC†ÎЀ7î¸[ß@  }ú†¾ìQÕAæ¹Ãÿ“¿Çß§c“ÿ§c"è˜òê]¶]65ì#92ZŒycÞR~¨§ô íÓ>`€€§L2 Ú¯ïê»ÀÝX>ªFÕ¦Á¸n\’bøÄø®ü/îå ûºxaßc/æ ö¼vH÷Rc ÄIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-93.png 644 233 144 2423 13755454065 14675 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÈIDATHÇÍ–mHTYǶ¾AoîÔô!§RA„H7ýÒË@M(± i1ˆ $Ä}Xj2L² (ˆ-›Ö  0‚uKÚš)×eA(-œú MZ Nm¯c®Û$îºëÜ—óÛ3gîÝe‹ýèýryÞþÿÿ¹ç9Ï=„B,N½dº2]™ “væ–?wkîÖâï’ö92¶gln‡EgÈ¿˜Ñ|bÙ*®òíõBXøv>å‹…åȹšs5Ó²@Ú†5¹K“ö‰;Ì þ¡ƒï†ïÀõK×/ñ%ı0@Ü÷€e«¸ÊWõ ÏŽ/Žü‹_ÈêËêËør²s²…€•Õ+«‹¾J&ŒÁ¶Úmµ¯æ½š'3Àø˜Ï|香F=“6[ÅSùª^á)|ŧø“z,Ù¼d³PßXߘו,xò-´´(>-ãóAŸÖ§Œ&£‰Ywä2ÈËVq•¯êžÂW|Š?©GüsoOV7×› Hm͸mÜ0›‡ÑÌße,@ê¿é1=²Yî”;Ó_ sÄ6‡A¡Gõ(È5²A6 ÁfRO¦f¯Ù›ñX½N¯êYÂ×øð¥mï‹÷Åû„(ž(ž(ž¢ÆQã¨qQ( ”„¸Ùs³çfÞwÞwÞwBôïéßÓ¿GY!+d…á£á£á£[)¢Èâ³øSz>ÔcrT?¨´z,îŒ;ãN¨j¬j¬j„W«Àm³m³m³0Þ=Þ=Þ •+*WT®G»£ÝÑ^á^SåSåSå¶Kèçõóí±œJuj~$BÄ:• W•pÁÛow¼Ý2$CÒ6­‰ÖD+LdOdOdƒñÔxj<µµÒ0ïyÿ¿Oå̱¿Òs,`˜a)< ?—[äÛÊ›e³lY"Kd ÈA9(mñlïYÎró¬y–kN~tŽýÇä@B7Œ³ÅlAã!BHy_Þ•w{ 1dû"ûR÷'Ù+{.îq æ^s/º1h Úð?<ùçì¿rÎÞ.æì}lnÞ`ÿ¨÷d·ê²IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-10.0.png 644 233 144 3022 13755454066 15015 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÇIDATHÇÍ–ïOTgÇÃ(Œü&CK¹ ÛÖŒ2,°oXXú[Mkll»Hic›ðÂ5éšvW“¶Ý[BDD¢tRkº`!ÑmÓ Dh·hE+Ì`Éå‡3÷Î}>ûbærgûø¼™œs¾çûýÎ<9gÉŽ ¸s=æÊŒÅ®¿:ùÔúÔú';cñ‰($½’ôÊ@ÖgYŸä|žó¹5îÄvÝÆ'ö‹8ü‰zv^²ÅI¤t§t'UÇãCðjñ«Å©kcñßÁÓëé]4¡éBÓ€óíçÛÙ ÷†ï <¨~P Nl×m¼Ýoó%òË¡ßé‹ÀªþUýIS²:eµÔÔiïÆ?jðâs/>p'ùN²r@tH']U::ö &Äv=Ž·ûm>›ßÖ³õc~ò6çm—w¼¼Ãs:Ö0Þï翟oë½À‡|H:˜º©D_¾NÔ  ‰$pb»nãí~›Ïæ·õlý˜ç*-‘ÔÝfn3W Y†fh ¢yÑ<ŒxA©?©2Uæmó–y Ô>µOíÃ93ÜáÎJ¤T¹ËÜ…aþb¤i öÄøa›¾Mæâú+W9-"òô'àùÙó³î¦oò‰É' ú/¸`m°6°´"ñ44`ëX—`Ä‹/PH!… ymÿ8¨—ÔK,áó?3141àÑ=ºîæß1?ñ_ìÄ~knjnuÀÚhóžj:µÿÔ~ÔèÝÑÛ£·½›Ã7‡oC[n[n[.LMM9uë˜uÌ:æÄ“'N„¶Ü6W› 55þÓÑŸŽ® 7ªßvWî®´¯öÄ¡LDäú~èÚÒµÌê­C¯í~m7a{D.^.¼\FQcÔ€/è ú‚P( ” h h hfÖάYëš-Ÿ-Ÿ-¿×ïõ{¡$Pr¾ä<]ÒÞÐÞ <›mN™Sê-8×z®TMÌðqfCfƒê†_Ïüz"ORL1œy¦s¾sòÿœ_•_WÓ®¦]Mƒžšžšžð—úKý¥Ž²pY¸, LJvò'9ÉI |kùÖò­ ø9Ÿ¿þYüEÅ‘ÖH+D3Ö\_s]u»äƒäo“¿åY ¸Ý‹"«Éòƒ„vŒïÌÚ™%²þõ{Öï16›ŒM"†ßð~‘ô®ô®ô.Y9™í™í™í"a3l†M'±"VÄIïHïHïHÀŸË¼‘yCäᵇÅ‹%$²úùÕÏ‹ÈBrur5Ϻ%jõZ½Icâ26eƒüQDDòló9gΉ¥F©Q*¢Ök‡E¦}Ó¾iŸHÐô½" ¾ß‚ODËÕrµ\cΘ3æD F F FDîž½{öîY‘àLð~ð¾ˆþ=CÏ)Z*:]tZòijԵÔ%"·Ô§êÓ¤1—¸õ:½nôš„¿üR$©\D„·í/œõBVmV­ÈrÎrÎrŽHEJEJEŠHekeke«ˆ6«Íj³"õËõËõË"•ݕݕÝ"¾‹¾‹¾‹"ez™^¦‹TiUZ•&¢ i_k_‹lùïæ¯6%‘†¼Ú5µkx[¤ï£¾D’.íZÚ5zÍ™J£¹¥¹øÅžÊè¥è%˜ÿx¾s¾ù&ˆ¦nÒš´&!4 jQ-ªT¶ÊVÙìöûÁj´­FPÕ§ú 4  ¬ã)ã)g* 5¿Ùü&Äöé‰+qcOžûžûº&&Vô0¬«#a½Ç^ö‚²BVÈ1ªŽ¨#êÐH# {lÍ4ƒR©*@e©,–ÔßâüMSSž'¤»ùñÿö˜*¾yÕöäíÉÎæ'Åœ6§“Ñåè²³ù¹H= ¾Wß©ï€À!B ÆÕ u¸ÇceXê{sÑ\zíÍ¿Ý½Ý D~¿ùÝÿÊGöuñȾÇÍìÿpÈÍ2Š>ÇIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-9.0.png 644 233 144 2544 13755454066 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–KLTg†¿á" ‚ f‚JÄz‰ÂBmɨ©/ˆ†ÄI1jº°£.L%º@“ÖEEë%AÁh•ØŒnpðÒMt¬tR¹„pÄÑfÎ9ÿÓÅÌáŒ6ví¿™ùÞÿûÞ÷ÍùÎ/ ""Yñ_¤9Is’2cqR­…§¯M_;ïJ,>­ƒm³mó“`ú‰é'²/d_0z­Øœ7óëE,þD=—,±€´æ´f[y<> Û–l[’>#ÿÔ73n¾× îVÝ-€—n\b7 =z ,–ƒ›óf¾Yoò%òËáOôE õNê›Ò¦¤MÇjÇê¹ßÅþš ÖoXПܟ¬’@vìªÂ# ±9Ï7ëM>“ßÔ3õc~rËrËD`Sõ¦êŒó±‚Þ&Ø›¿7ßÔ‹ÞhÀZH èÛõíL€jSmذ›óf¾Yoò™ü¦ž©ó#ïí1'ªjJÕ }ºO÷ñNÛªm%ª½Öóô<”ªU5ªkøñã·BµZ•©2ÐþѧêSQjöD{Bô·ú[ lòW¥U¥™9¶RD¤è8d e …R{C^kkÖ©°¾EßB˜zšiN0âĉÈ&›ì¼€ €™Ìdf¾˜jª…úQýh̰Žqï{ï{˜Ôû‰;ývÜqËÈÑRµTkº¾ïÚݵW5®j\}}}–®QoÔõVüâЋC/ÁÉœ“9'sÀ×ãëôuZ|êïhW´k²zÙ¤~ÜOÜX‡ ®Ž]c@}¯˜èþ£»­» ê ê ê`Å©§Vœ‚»ìZ° úkúkú¶4Èd@ñââÅÅ‹a©{©{© =…žBÖÊå“éꆩÓ7ýdÞϼ¯ša¨x¨ô¯ùh4F#XùtåÓ•O-|ùøòñåãp|Ïñ=Ç÷Xø™±3cgÆ ´²´²´ÒÂK^—¼.y g9{îì9 ×+Ì1}ÓOŠHò†ä ,I}–úÌ&I9""2?‚¹M—+.‹\l½Øz±U¤bvÅìŠÙ"=žOG$å|Êù”ó29"Ó"Ó"ÓDìMö&{“…g^ϼžy]dÂ7á›ðY¸Œ›z©·SoK®HòÂä…,J1ZŒ[ˆ¶QÛ(_ñ£´K»äÚâuÁ;Á–`‹È¼wóÂóÂ"Î&g“³I¤s~çüÎù"ŽçŽçŽç"‘È@d@Ä‘îHw¤‹ ^¼2xEdÄ?âñ‹„Ö„Ö„Öˆ>*|XøÐòeû3¶q}™ôóéS½Ÿ±`^дƒ³ÚYí¬†üÊüÊüJ8à:à:àÿ,ÿ,ÿ,(*-*-*…»wîB]C]C]سìYö,ØïÚïÚïJ<$ºW÷2ÁÏŸ=cŸÜJó–ü¦]Ó®Y·(2'’Ƀá’á’áàG8ÆKã¥ñFÜ#î75FQÊ­ÜÊ £žQϨ ¿ñÊxeñÐú´>@ýï­LècãÞwÞwVc†îÒ]„Õ7jŸÚ—Ð@Ê¡@-µÔ&,ÄNv²ŒQcÔMÈ?ªZT P«?Ð$ô±¨÷ƒ÷ÃgûXBç§*½*Ð Þù{õ^ AÖ‡‰ªßÕõEí´XÇW½ªWõC 2´r{ ÚUX…QüjdÙDAïÖ»Ýäëý·ó±ßÊ/öuñžǾÌì¿pé7Ʀ٧IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-15.png 644 233 144 2410 13755454064 14662 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܽIDATHÇÍ–]HTiÆÿg,G!µƒ`•v¶4Šº)aÃhÀjûd[ɵˆe‰²›p»h¡(6ŠU¦* –5‹k+2ÊÒЋZ³bÝ6L¥¦Ò¬uæ¼çýíÅ™3ç´l»{é¹þ_ÏóðÏûÌ‘éÉ__¾/ß—mǾ¯Ý|FIFÉÇ?ÛñQÆjcõ¯ßAN]N@ >Poõ»±Swú½ó".¾—ÏÉËtqþóþóFq2Þë箟›1ÃŽè€Ì¦Ì¦qªš«š.ž¹x†o`¤k¤ V+7vêN¿3ïàyñeÏßøE`ê•©WŒ?ÀŸîOà²à²YßÚ ¿Í‚ÒpiàYÚ³4í¦1McŒáLxCëKëKÞ&ƒ)¾¿­')ìèmز{ËîÔðüÔÄì éïu®qáO¤ŸH?‘÷#÷#÷#nþÂð…á Ã)”FJáxÏñžã=ðªïÕ½W÷RmšlSLñò9ü¶Ÿ½·E—D–T/©N®QŒÏd‹1Ø!q Ø +Ýʲ²DÊ{Ê{Ê{DªU‰ª„H´>Z­Ñ[õV½UdóÍÍ77ßiÉmÉmÉé4:NCdôúhÛh›¤øB|â“xŠï=þE—²Û²ÛôyY0²À³ñZ]¦ËÜ0>'>'>ÎÎ>;ûìlÈç‡óÃÐ^Ó^Ó^ýÁþ`Œ£À(€ð¶ð¶ð68ýâô‹Ó/<¸ó™Ç< [Ö‡½GìðÛzY,ë¼z9ä½ö:ª£ÀU®rtƒnÐ .LÑPÑPÑ´‘±â±âÞ‘ö[í·œ>*eŠ~ªŸJ\ÞILb"F‘Qd¹¸Y]Y]Y]"ºV×êZ‘ÂÚÂÚÂZ‘V«¿Õ/ †EBC¡¡ÐHÅâŠÅ‹Ýù´^9'çœwŒJ—?©ç?oeôúÄÄĸùııÄ1ˆ†¢¡h¬:«Îªó¼JL0öï?ÞÊûXÊgÞó×—ÆgÜMê»ú®¾ z¹^®—{òŸè||D %ÖAë oùóùØ¿8?ꎺXV…Uá:?~|ø€£áˆGö~ö±t«¾®¯ ôÒ‹Nu¥ÚU»ÿƒÎ?iÿ+'í׍ý›œ_°7ÉèæÍ™IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-4.png 644 233 144 2016 13755454064 14602 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÃIDATHÇÍ–OH\WÆÏLšŒc‰.‡‘¸é& d¡ #tŒ& ‰†(„ )•ÁÕd¡ÐÀ‰‹© k„€`H,ÍB‰IðÏF0Øè²¸(†Ê´0GBfF3S}ïþºxïλ¦‹Ú®<›áüû¾ïžûî+ ""ÇÝ_Èò—:¾ÿ[/^t®è\ÕOŽßß%ߥ_¿ƒc÷ŽÝ({PöÀ~åù:¯ëÍ~ßäÓq9.^ 0÷Õ»þ¸rêÊ©¢/ÿûN'·v¡óYç3€'Ÿ<ä&$—’Kïëß׃çë¼®×ýÏÄ—;Ÿð‹ÀáéÃÓ¾? p$pD‘päd·SðûIh¾Ð|àÍ¡7‡”¬  „UdÈ -eø:ïÖë~§ñ5Ÿæwôœ8{â¬\l¿Øu^ý·*nUh¾Ià.w)ÝÌnÀºj]%jA-àÞ¯óº^÷k<¯ù4¿£GöîíÀ×p¹èrQAÐ"X/­—öuû:;nB‘f“ͤPQUQ°Cv…]áÅÙvë•î×x_ói~1}ù“Ádæ3xm½¶ °çÁ¾f_sáò¤IÄ5ÔPªCu¨#¾Å[nGÞˆïÅ;ïñi~G+ìþÏpãöÛ…æjc Ü“#gLhD¨ÏOÌ&f³0ß:ß:ßj訤’J CŠ”·ß®öø=~gngž‹ÔEë¢îÅ÷•ˆï©ï©ü%"壸$'J”ˆŒÉ˜Œ‰ˆ-¶ØR°ÎHg¤3"kŠ5Åš¼¸êR]ªKDþ”wòN¤€çá»|&ÿ™ç¥/J_¨qHžNž6G®–ÔRaZ°é|SVÖÊZY¯j { { ÁÐ2Ñ2Ñ2al\ÄŽØ A‚„çỦù=eGËŽÚ¿Aêmê­yìÕ†Ú0ªì*»Êó§Ö¦Ö¦Ö :R©Ž@ï\ï\ïÔ–×–×–Ë[WëjdÁ= 7ñS¿£gß³š­f«ÙËÆÛãíñvfƒÙ`Âñp<÷ÎøhÏhÏhWoaayßë~&&"òKxü¡ ê°YÈÛlË,³ìÁär ¹ L˜0 CÝjÝjݪÁ @bˆ!(àyø.ŸæwôìÿT~zìg˜aÆsó¡|(‚tcº1ÝhÔM3Í´Sbôÿë©Üÿ=¶Ë^ë§Ÿ~P‹jQ-m´Ñ¬°Â #F̨/`þ§{ìÜü;zK\ë£>àsŠ)þ‡ åõïûæ?°ÿ•öuq`ßcóû7V¤£y¢ØÃ²IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-69-red.png 644 233 144 4221 13755454064 15610 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜFIDATXí—mL”WÇÏó2€H BQg •UY õµQg4M4©ŠŠªRMº¾Vk%¤R «n%EJCÕÖd&¸µÝ-–UªÁEwZßf¦0ÛX¦*ŒìèÌ«Çê³~¿ÎCüÜp| ÿ˜Ì?vLc+4®h\Ѹ"¹¤¾«¾«¾Ku?p?p? @€†1Œa8à4?góY>«Çê‡÷_óë|d|ŽwòNÞéø3+ݑݑÝ!Ͷùm~›6MÍP3Ô Hr™\&—r–œ%gržœ'çéü`œÍgù¬«¯‡õ7>§¡qM\×D$оe æ*s•¹JÊÓÀv«ujÜRƒÿ¸ÿ8 :¤1Ò>¹\.ä#€‚pó)ƒÊ  :ü7ý7©Á{É{ Pw«³ÔYp³iæ*ó{æ÷¤<ÖŸñ0>2ôú }‹§³ Æ c…±BM³ÿl·Ùm Öqˇ¤() ÔŸÔŸ€P íSn©·%(e@ÆáŸ/ò_ñ_Ñ\·ýg‡è1h¬0–ËÕ4Æ£ñ‰[Å­âÖîƒ,P[X»¾v½º9XÀ#5ùŸúŸê:xwî€Ó‹O/€³Ig“ÀÛéíÄ/Ø÷¯ÿ:?zü(oÇ'Ÿ€Ú£öR“4Wš«MöÔÖ®©]£nÖV6ŒTWâÔÄ©‰SQõpáCóC³–(Áľ¹¿§¿RÞLyÄ=â p@NnN®Ð:Á:A¯‰¯Ñùî7Ìo˜­~°ßÃ…” Àxýý²ÃË/;ú2ÙæKõ¥p±¡om| Ò­éV}mÇfÇfx±úÅjøêöW·`bÅÄ Ø(lôó/ô_è×»®ú®úÙìa<ŒO ©tƒÅ`1X´3MÅÂeá2]dC×®'½TöRÑê„Õ DDþeþeDD_îür'Q–’¥ý`ùÁBDTU¥¿YL§L§tnLoKo {åµW^#¢Š@C³¡ÙЬùô (>sv9»œ]Üo½3ž¤âóø<>Ï?\⪓ÛO|}âkb|×|× åZÊ5Þ]»ô»äNu§M  P“_“¯j8Ô¹s/öÏÞ? é†t@>sröÉÙ¡~Žœ¿uþ–öná2¹L.Ó?@ a†0c_%;e¦TS’)Io_uÇsÇ¢Qs_=úêQxyÕË«¨,Ômï¶ëMÛ¡¶C°úîê»PH…¤W_¥Æ`Ilzl:ô%ô%Àë²EÙLÝ7¹~r½¢=Âha´0ú£AгÄYâ,Dâ%ñ’x©Ñ©]ø+r—æ.•w²úJéw‹¿[ /¬/ ¿0 ÀÃÀØï:¬ ;_¼óÅ;úSÎ¥r©¾òÑûòûrès‹þºþâú‹ŠG,Š…â¿çüìÔ3wÌiÈ4d:N°„Ò²’•%+Uíâ‘Fý(þ(BNɧdîö–öÜRàRÿèx½w:îtÀ‰¤I€\xcË-¡õ=ýøtÊé,ÑžÐJ¾’¯|ºÃáÆL®®kçk·Ž[· Žkä¹F¦åwÖvkŽ5ìbòÈ;•)Ê=ºIÝØ€ Tµ\ <­µ¨Ô\u¯º7$%g£Óä4¦ãMãMi«¶’ï û…ý¥f -ò(O4†Xs(‡rÄw©‰š¨‰Hp Â@ÉçÚÓZg,3–Iñö=öéöézíú=þ€–?ŧ:í2}[••5ßÙ^–¸öÚÚckÉ;µhX­’·%oKÞFÄ›y3oæÎé æÈào¾pO¸'ÜãÎ¥íJÛ•¶‹ÈPd(2YhÚÍ1ç˜sôÚUJ•Rxa…VðB -O’'É“BZ¬žY=³z¦šËêâ ñ†xçÓ€oŒ ßi®-b뉋p;Ã}cL@»ö3!í––•–é´/ÅKñ! å¾r_¹Òb/zÑ XGôŽèÑ«.×4ÇÇñqkÊ#¤x,‚/š~}@¨ŽÐîò_Ðn»µ=¤]©]j—ÚCÊ}’ü$ùI20ehÊД!y¢¦Åf¡Yh>:‡I-(½HÀçéšÀ „´ë\:í11‘âíöF{#/¼ðbˆ‘–ž+=Wz.tíˆubX×ü—dÄÕˆ¾ÁqŠ}`¤±„5Aíþñ?iwþÒùKçëî]ëëëœ ÄUm'¸®€+X°/¼ ÿ(¢/Gÿ¥=K»ó„J¡R¨td1à‚Š‚Š‚ õ¾ _†Oú›¶Õ.Á%¸JÇQ5P¯ÁÑ/šþG‹Ôîpþ]n·ÛÐ"ZD‹”ßðcù±üX€#Ž8úK§Écò˜ûÃÌuØþž_n¾ÏË÷ûäœû<爈Hrä+“““Æ1{¢öøòøò5 ãÖX^·¼þàOt.éÀ Ÿ¾ð©1Ŧߌ_˜/å_¨gÚ%Y¢†Å‹;-¥ü¼™ûfnüŠ0þðغmÝ3:Ô~^û9@W{W;¿ƒ'CO†~,ý±¢Øô›ñf¾É·_Þû™¾Xû¬},Ž['™›37Ûÿ·Ã¶W·½ ð8öq¬Š€H A•>|˜Ë»›þH¼™oò™ü¦ž©®G µ$µD¶¿µý-Û'ᄱ8¼úðjS/Ø ¼Ïû$€îÓ}¡ªPP7Ô ,X ŠM¿oæ›|&¿©gê‡ë‰¥&"òQTNWNƒú@pP ¦ÓÀ¸ ŽŒTªÔ¯Õ+êÐ't—îuHR‡ˆ®)óøRj³¾[ßMPŸ . .µ/Ì•¾J0mê›Gù¥ˆÈKgÁæ³ù|‹”æt»Ø ªPâ§@­T+ÕJ`›Ø´ @Yd-°Û±cÒÈ @½¦^Ã#¿6¢ÑçN¸žÈ޵~­ú÷ZöZL6ãWÿZ=222Í¿lNnNFݼ;yw2ªçÜïÜïÜ-Ök‹\£®Q×hÔoœ1Îg¢øá±‡Çƒ–å-1-1(ר§8ÕSÿÝ[´·È<ÚÖ¯ÅȹחÛ.·Áƒ+îܨštÿªÖU­J¶•”•”AV(+”‚ž‘ž‘ž(ÞX¼±x#8*Ž È¾ž}=û:L­˜Z1µ"Z§ÐSè)„|G¾#ßëú×u­ë‚ìûÛö· x’u—îR5pé襣 ~®GB÷—6/mVàøpÙöEÊ)pø@CACAT xCñ†â W›W›W [œ[œ[œQA  P€óCç‡ÎEím´Ñî(ÜQ¸cAüt~o~/\ÈýìåÏ^˜?:BË–Ü[rOuÆÄ:âšâšÈ¡Ñ_ã¯Ù>»UÛª‰¶gzÏò=ËErÆsÆsÆEÒšÒšÒšDªRªRªRDBm¡¶P›<[‰í‰í‰í"= ô¨}Þ˜7æ ‘„ބބŽñ—‡‡EænÏåÎåŠ&WW!"OcKcKɉQ×wé»,£–SÖSÖS"N:Ï9ÏIê†䵿µŠìüãÎÆ"•••"k­k­k­"®=ºö蚈·È[ä-yêyêyê±{ì»G$8œN‹d^ͼšyUÄ}À}À}@Äû[o…·BÄôúFE²ýÙg³ÏJªˆÿ{ÿ÷"2¡>V[FcÔïg.Ì\¸[äVù­r‘;c“c“¼è¬ ¬‘ù¾á¾›}7E’ê’ê’êDf'f'f'DÊ—/?.’ѕѕÑ%R>[>[>+RÔYÔYÔ)²¾g}Ïú‘_¯À'Rl/¶ÛEìƒö¯ì_‰lúwÉ•’+2¿5µlIÙÞé=Ù{R$ö´·÷ýÛ‡á.€úÆúF˜ÓÃ]2uÓ=à€ÿà^å^…rïs׸k`Î6g›³¹ÈEÐêµz­ÔuD•¬’U2xû¼}Þ>0ªj£T¿êU½ ]×¾Ó¾CSÁƒ/F»­îºw#Ò•áöŒÎ10çJdÎUºJÇÿÌrƒC34C‹þÌê„:¡NÕTS½`Ží£Ž:04¯âT’J¯þá¯uºœ.›fÓ|‹ÿ¿9fÞ•ñçʆÊPáɬn‡B  þ¦ÿ¤ÿDó|Ã7(î0È ¨[ê[õ-ÐO?ýÀ4¨15¬†'ẹj,3–TÿÔgô Ûœüo,zc0ÿóÉÿüÞ•Ïíëâ¹}=Ÿ/ØÿÿºÛ¸×Ù´IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-17.0.png 644 233 144 2727 13755454066 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŒIDATHÇÍ–ol”UÆÏL[Û¦€™Í~¨ýã¢VJL+(H§K1Ôn;RâÿĪ”"ëbt 1¦ %ÆMÜ•°U°KŠV²%45mM¦H“]‡Ö&®[J¤™êR£”v©mFÞ¥óþ¹¿ý0óö…ÝïÜ/“çœsŸçɽï9sDDdEúWÀ]è.tç§°{—Ï{$ï‘U'S¸Ý×c®Ç.¶Àò÷—¿°ò£•Y—lçíúÌý"¦ž—âr{r{\4>—=^–÷‹þc<}ž¾ë4}Úô)@ïǽó¸öŵ/~ üÛy»ÞÞoóeòËÁ›ôE g gÀ5 ¹wäÞ!ÅÕÅÕþߦ ¾ñCÝ£uüõC–r€ù#°Œe*$H`¯X¶óéz{¿ÍgóÛz¶~Ê€¯ÒW)Á'ƒOz>Lm¸ôxý®×ï²õô>àmÞf #`>c>è° à¶óv½½ßæ³ùm=[?åǹJKDäÝ­˜ Fƒ±hhØD÷é>`©ùœùº‚û¹eÜH šO›O™O™oæ›ù ªTÀ>§Œ¥TµÑh4¢ßëKõ¥ ^JñCC¢!̦õ¯òªˆÈ½mà¹â¹’È&4Q2Qæß¨áŒUn•£-JÜàÿݸ)_J)¥À/)¢@Õ«z4Ö¤ùï‹G‡< O"‘ÍßS~Ò'Ö~Ž¹æ¦æ&P-Ö6ï±écÚ1 uùÊå‰Ë0=8=8=m­m­m­ÐïˆwÄ¡+·+·+Æ;Ç;Ç;oõ;Ñ:Ñ:Ñ Gî<â>âFM^úöз‡ì¬õ€šÛýðî‡í«m?'<("2ú;è®ê®£@½ðôð»ŸØÍ‚Ý"C£C£C£p¡îBÝ…:Xç[ç[çƒÚ‘Ú‘Ú§·;z:z:zC3Ûg¶Ïl‡Š5k*ÖÀÚ3k{×öÂê³þgýϲðã cÒ˜T/À'>9êW)?ÂòkòkTLŸš>ÉU”Q§î;9rŠgЧ‹§a   ÿÖ“8Qp¢àD4ô7ô7üüñ Ç7ßëw¬ß±~‡p¶"T‚ceu><<¦wÉè’QÕ#°Ò»ÒkE8ëˆu€êZl{677¡7ÐèÍø¨gÏž= %S%S%S0T:T:Tz«±£¡£¡£!¨Òª´*çK¥êÏ·oÁŸþýÁ®v¾â+0Å›ïÍ·"n1­>«Ï·Ôƒ"²NDD|éÞ}•~·~·ˆ5n[㲸º]®€HA° XÙÙÙY¨_¨_¨‰Æ ã…"E±¢XQLdjßÔ¾©}"±_Çjcµ" =IDDVk«ÛV·‰ODûZûZD¾Sï©÷\·d'ªÕc_ÊBøtø´ˆk½ˆ/¦õ“ÞKÞóÞó"9{röäìqŒ…ÇÂcá1‘ÚšÚšÚ'>›ÍÆD6Wn®Ü\)RÞRÞRÞ"²Å¿Å¿Å/âöúEªþYùYåg’¬ñm]²u /Š„Þ ½#’uHkÔǾtºRo~£ù à{»+ͳæY˜w¾{¾•<˜|3ù¦ssÛæ¶Ím-¬…µ°·ö[û­ý‰ÄFÀj´­FPgTH… þyü|ü<Êú—~~Ó•Ä›Ÿo~Ró´ý\ÚØ½mà™ñÌ$²!úsôçE°º­îŒ9FÚË^öf`=¿Â˼ V\å©<µ\-GS¿Oó7E'£“ž¸'žÈæ›ÿšc"¨ôäU;³vf-ª “k\5®í¦fj‹’ /yä¯ñ*¯f,¢DAEÕEu¸–®ÿ«åµ¼èêÆuã:ЗæggöÎl yóä¿}ÿ+oÛ×Åmû»=_°ÿ1ð[³÷îIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-15.0.png 644 233 144 3047 13755454066 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÜIDATHÇÍVíOSW~n[…:^ÓÄ ˜ªqø2Æ'#‹US ó…(΢‹ûä—ˆ$[æ65‚A‘E‚:Åf ‹!*ˆ‹,ó%LI@Q£‚¬-/­ØÛ{ϳíå2÷x¾4Ïïåy~9§ç¹$ .ü Ò”dJ2Å„°i»\¹jNSר¤´NZ÷××dlul5IÆŸŒ?©õXÏëõ“ûƒ²žGŒ@ĹˆsRvï#7Ú7Ú#?á:H«ËêòÉ’_J~!É ?]ø‰_C7†näËì—Ù¤õ¼^¯÷ë|“ù±ï-}€œò۔ߤÇdÄÔˆ©™âHqØv… ØÈܜܒ|f~f&’$U7É(F‰l’2eêË3 ëùp½Þ¯óéüºž®šdâòÄå¹6m¾µ>ÔÐÛHîžµ{–®§¸H~ÃoEå L’êu ߢCt$%J¤õ¼^¯÷ë|:¿®§ë‡æ1ŽR€WPÝÜœ¨K³*ÉJ2)Ô 5ƒJ8!ÔÝê—ê—¤š¦¦ª©¤ºUݪn%™C'|{ á ©Ÿ*ï)ï‘bGˆŸÜ oIŽ„õ'Žò9|t˜´>²>’-léŸÝ?›T¯’$¼¨-ÒÑ?!ñˆýì'ùНøŠÿ_ãçø$œÊT¦’œÁd&“¤øL|F?ÓÃü úºúºHÒ*[eÙÂ?Bó„w¬¦“ÿ”•”•âk’Ô2tÞãSŽ'O è9Ús¸ç°¡×<Ø<Øs}æz#¾tdIË’²ÖÞðIÃ'$ØØKªÑÓnM»%Ιð•ùºù:ÓpÉâ³ø€)ûЃxó{?ý<˜Y;³nf( ‘)2E&P´³hgÑN `aÁ‚…@EVEVEÐtµéjÓUcÇ^K¯¥×ÕÕÕhÄcÎÇܹ ŒwÛÇíðS×L]`ÌœmÎfšªæÒ\Ò}˜” %©¡£E¢Nœ¥|¨|H/¤ai»9vsì&___ lš±iƦÀ¡âCŇŠÏ€gÀ3MhB’&L> º݃nÀó·gØ3 È+åh9˜çŸW?¯‰°úÏúÏx"ªD•tß‹ìwºñ¦ãbÇE@Ên ψ¾ÓÓˆ*Q%ª€ôªôªô*àJÄ•ˆ+@\C\C\®¤+é Ë\æ°Û‹íÅÀRÇRÇR°Ì¶Ì¶Ìغlm¶6àÓå­Ë[p&®˜¶b·-û[öæþBánãV*eåeå$Ÿê·R½¬^&GŽþ<ú3E` 2PiüG”cÊ1åéŽtGº#Ia6a#E‚H ¤ç´ç´ç4©j…Z!).‰ÑBz¯yo{oSh+ó•ùÆ­¤·¬¨¬ˆ ùiMgx°“Öaë°l!ûÆúÆ&ôôiõZ½ácâwÑ):I±Z¬«'9è\1WÌ%9Ó9}’O”r;·“šWDŠH’±"–~ñm˜¿¤ïqßc’´z­^ÙÂÿñ1€"ì¼"Ïœg6œŸÁçÁç$kT¿ê7œŸß±’•¤hm¢¤‹.ºH¾äGHq_ÜwI…ë¯hÑZ4ñgÐô‘téΟgɳ ¼íüïî·ò}]¼³ï±wóû/'¨D]=IÂIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-10.6.png 644 233 144 3056 13755454066 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜãIDATHÇÍ–ýOTWÆ¿c‡‘‘C#!4Åk$¬åM^V6·t0$4%mp[´MÜ´‹€f³µvh4“†¤k›4ÕU×,!54”j¶)‰‘­XP«»…tƒ¼¬¤ly™Qé “™{çžÏþ0s™Ùý <¿Ü<ßï÷<Ï“{sž{DD$%òˆ{.¤0Žû]´žPP½¥+ŒO‡ÀöšíµäÏ’?HíHí0ïF±Õ·æc÷‹Dùcõ¬º¤H´à¸è¸h«Œà6x=ïõ¼„gÃøOƒàìsö=6 áRÃ%€/:¿èä ü4üÓ0ÀÃʇ•ÅVßš·ö[|±üÒöú"°î«u_ÙfÀñŒãx~×ó»´ß‡þ­Aí˵/üÿc¼Š€Ð2àÂ¥*>¬å‰ÁV?2oí·ø,~KÏÒûH{1íExµþÕzç_Ã÷3ßÏ´ôô>àC>ĆÏð„Þ ½IÔ À† ¢Øê[óÖ~‹Ïâ·ô,ý°Ÿè§4EDNTª3êŒ5CCæ]Ó5P×Bi¡4ôHC©_©UÆ}cÖ˜uHR‡ˆ®Eæ˜[CJ5 £zªž æx˜êfêf_DíS΋ˆä| Îiç´ÏÎߦ²¦² ô 5\2·™Ûx²&‘†lb›bŒä’K.EY1õõ¬g=¨Y5¯æÔµ‡'|áÏžšpúœ>Ÿ›a?‘7vú:@0 -Þs çŸ;ŒùÏÈý‘ûQ½‰á‰á‰a8¹ñ䯓aflflf,Ú7ÛÌ6³-Šï¼×t¯ Nœ;qæÄÔ¦›c7׿ÍBÖïkÿ[ÀlØP""òÏÃÐóRÏK`Poïzcÿû XGäêæ«›¯nÝ­»u7x <ÈïÏïÏ׶^Ûz –²—²—²£†–Ç—Ç—Ç¡<§<§<jÛkÖ…¢úü`~ÀèÙ¹¦¹&õ6|¹ðå˜ùa?ÂGI5I5ê",t/tCp yäA÷/ºVºV ó×™;3w­Ä[‰·¡×ÝëîuCqQqQqQÔ@I $P€S7NÝ8u#Zï´wÚ;í^š^š^ >9ðñ¡µ·å½–÷àAÊjÆjÀÒêÒ*¨¹ Ÿoø\]Œ“?Æÿ-/H¿ý±ý±Èº6ùA~oýݽÉ{“E2š2š3šEôíúv}»ˆ^¬ëÅ"®W«GÖVRgRgR§H@è=Z7܆Ûp‹$Øl 6‘ÜñÜ‰Ü ‘ æí‚&2|f84¯HÊlʬˆZ'uRÇ v ™}fŸmLâôB½P¶I©ˆˆ¤­?4Dô"½H/ÑŽkǵã"óóó"ž\O®'Wdµ`µ`µ@DÕFµQ‘Ðxh<4.âzäzäz$âp ¸Dš]Í®f—È_ŽžuŸu‹L;§[§[%M¤r r@„gÍ%sÉ6'vß.ß®‘ï$0øõà×"¶_ŠˆðNÄW0ù•äªä*ª?ÕŸ*²Ã±Ã±Ã!Rv¬ìXÙ1mY[Ö–EªýÕþj¿HÙbÙbÙ¢H^z^z^ºHEEEEE…HiWiWi—H¢ž¸’¸"²uÏ–’-%üíošßm~—wD.·^n‰¿ì¯òW|=•zcKc „³Ç,„ЕÐXùh¥k¥ ü{°?Øsê¦Ì)s ¼CÞ!ï¨Õ¢Z@¥©4•žO‡§ÌÛæmó6¨nÕ­ºÁÓêiö4£BíÁÁ1§r¢QkÔ¬À=}=b,çSp.:}v˜\\]Ó¯A7Ï›çcrìä ˜^Ókz£FU»jWíÀ>ö±/&ÇöPO=˜>eWvU®Êy¢Â•åŸü~ò{çŠsÅgç›ÿÉ1T$yÕîøÝñÑäÇaÌóÀ™?ä&?—é¥Ô?Ôuè§Ÿ~à^¼ ÆÔ¨"óWL‡é@WןŸ?[ɿ۾Ûá`ŠMþ§÷_ùÔÞ.žÚûØÓyƒý/?hÉÉ/·‰IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-8-red.png 644 233 144 4076 13755454063 15530 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜóIDATXíWmLTW~ïÇT*–Ô€2£1ºëб«»$ʇ€­”"?PS0X©];ZSS»QdÂ*›%i éÚ„Œ†®$54RšZÖîšîšX™™èh¬ƒ #ŒÜsϳ?˜sï‰Ùì¾à½ïyŸç¹ç<罢ɘN1!¯Nð$x<ÒXôAò”Î)S:‹~«2•©ìŸ_Ð2ZFË€É2o$•TREÄæ¼Q¬ýOàÇòÉ«cõXõÕR-ÕÊîØzÚµSíT;Ý¥:©Nª3„¤¤Ž¤Ž¤Žàë²e7Ênno¸½á6PžSžSžcæ¢.Ö‹~'ðß‹õ¼*6Ÿû©üX~,?ö/;”QQQÍ>8Þw¼ïx%ô ô ô€ ÂÅ(Føá‡0òh]¬ýOàÇòÍýôÅúÈþªrÀ^äôæôæôj¿óNx'¼ð"| _ÈBcX3kØríŠv`ÅZš–°åZ©V °ÌÉœ_³x4Ñ/ð¾!8†ßþª!MrKnÉM¤6¨ jCë5ÑPÐXÐXШÂöò½|/BZ«vL;p?2‘ `œ§òTÐ{ôºèÀe\0®'éI÷óùÇ€Öª]Ð.|/¯ãu‰Å‚Oð =BÙnÙnÙn­ûX`¯·×Ûëù<ßoÈ7„á(Nˆa.æ‚!ä"×’C›ªM€PG¨"9‘œ˜õ›±ÙLÙv„1«‚Oð =†>u§ºSÝÙß ÇªŽU«âÛ¢aÍ­¹5·…0ÂßâoYþ¼êçUœ L^7° ØÀ5ä²öc&ѽðqøaÁoìlŒ>âÁÔÌÔÌÔL4>,zXô°ÈÜ&8à€@á#ÀE\´ ]ñÊ`~ûüv8Sw¦>¼ÿá}«ðÎmÛ,m!ö-û0ð£|‚_èú„Ð?­?ºþèú£æ›1/ó2/€ ‚ÄYŽ•• Ó0¼—þ^ºµ>t}è:H×¥ëp8ûp¶µÎêY½‰oðEù…¡OŽ^©¶B[¡­Ð¸c TC5TCD3hÍ "’l’ˆH¿¦_#"šzvêY"¢†S §ˆˆ¾üåË_ˆˆÖ]Xwˆ(¿?¿Ÿˆhæ™wˆˆ*žV<9Ýr7%R%ÑI:I'M~[‡­ÃÖa\ùQ¡8è ôúÈ‘#rD&EÙ®lW¶h+m¥­Dô˜Ú©ˆH^*/µªƒ*QÒëI¯ñ2^FD4ötì)Q8+œED4|ø¾¥m½è%¢›4HƒDò9ùœ|Ž¢;HJÐôýäúH.–‹åâ‰(oMŸ "J—î^ºkõà‰'và±ôìÒ³°ææš›€9Iy9/Øiö>{ßä»Ôt©éR“ñü½”%eIY÷IY¡¬PVìw‰[æ˜ã˜ã˜Ãæú6ú6ú6šÖçùÚÍ*„wú»ÓV¡§ÎŸ:ÿ,¡o”¾Q 9_å| }ü¶>¤ONƒñ#"a„¹?sæ~Ýø(iJš’öù0%&&©—ÕËêå¶€1ðË Ê ÊÙnA§;™ÎtDàÁl±¢¤¶¤Ö*øÍ†7`Qé¢R˜ž7=@¨kO×@Lfýsm¶6\ T_­¾Z}Uk”¥æß›&ó¤ ÅFÆg¶,[–-ËÿWÑà<à<à<ÀóùñÚDíD­I€Ð“}Oö@SQS¬ÎX½½"W~ºò“å®WiG4sЇÛ·‡ÚCxÛø„ºd—ìzZ$Í”fJ3¨üø_›¥ÍÒæ5-R›Ô&µ ¯èðôxÎ{ÎÃcxw·æÓ|À‡øÕ»Ã`y•xð|6ÎÆÍ× ´Z­€#Ñ‘èHÔv;yP9¨tÒŠ©˜ŠU»©5—r)W=Hnr“›H *A%øÁ9ãÓÚbo±·h)¾}¾]¾]VïêÛõíÀJX Î>aŸ³Ãì0ž¡g|‡¿c¾NÅß+¾¯øží6¾@£ê¨:ê9”¾+}Wú."¹@. ¤ÓQuUBæÔèßMÊ 2¨ J]óöÌÛ3o‘­ÚVm«ö2¼›[[kõ®îÔˆÀƒtx„»¸k9ê_³l¹¿Í+›W6¯äùÏ–bK±¥¢Öž{ÒRwÜÑ“—~›Û'½ë;ý\ï¦h)ZŠ)H¿§ßÓï™^ÀOÒ@Ò@ÒÀä¤%äd9YN~÷qVü,N_½øÒçݲgx·ÇÓczWëÑz´C`äIú“ô'éÀâ‘Å#‹Gد /v(JÇ_²…Õ¢Ö‹8^æð<ï6Ù›ìMZНÍ׿kAŒ¥Î.g—³Ë;j‹Ú¢¶ D’$]‰ã>§W^&0>DûQïþíyÞÍ+É+É+1½ëÉöd{²qr²Î“*¥J©rÍþXùQ¯Dÿe¼Ì»«—âR\þåBpe}e}e=ÿó’ñ%ãKƵGT‚JЙA­ÔJ­;Š/Ž/þLj÷î¡Ø<領EÚ"mh-­¥µúBy–±pS?¤_O¿þ§ûnì»p­ýZ;0ù`òÀTÙTØXûu¼Î×õœõÅÉñ )=)=®qHõ¤z„€Â…—~cŒ-…Í•›+B B ”dðâUe@”(zEXûñ:_×Óõ5Ÿæ·ôÈÝ»AØZ³µ&ýG+áiÍ;š§ùâ×ÓœÆ FÔˆÈ]r³ úU?.\`cí×ñ:_×Óõ5Ÿæ·ôˆží÷åPV–4HTÞ’·Ì6³¸Ú§|ʇ2ú;ÆPEªP‚ © !¸Y+«e5ÈL¹Z®F©/ŒN£“8HSš`íj|ÐæÓüÂ)¨¤Ò'Ó'£Á3ùLP¦ÏôãcÖ±Ô„U£ØË‡PL1Åû 3Ì0ˬÎYoÖK€Š$_’ßÒ“Öò8qàD2ù3}êguWÝEiÏóÆçÏ¡© © ©g=Îzœ/#/#/#à_å_å_Æ.Œ]ƒ@j 5 O~zÒú¤5©N©¡øíøm'Ÿæ·ô$„ Ëï.¿KæíU£Æqã¸ý­oŠß¿)†5%kJÖ”@åÃʇ•a}Ëú–õ-à¿ê¿ê¿ e½e½e½PÑUÑUÑe7Êʼn‹'ì}“ƒï÷¿ß¯ë«½6¿¥G@æ½Ì{ª&WL®p$î0òŒ<w„;ÂaXT²¨dQ l>Ø|°Ž!¼;¼;¼ÛŽoÏmÏmÏ…íííÇI¾"DøNU©*çk~K€œ…9 ͈¼Š¼²¯½üÒXa8„¶©6Õ¦ heÑÊ¢•p~çùçwÂ’©%SK¦ ·¼·¼·Ô¨Õƒ)))0°l`ÙÀ2G‡ušf'€ «°sÌh~K[ó¦yÓ5"„±ÅØ"ôÊ-âˆ8’Ä";˜Ì ‘ѕѕÑ%DÕ†+ W„Èxñ:ãµÓL3ÝÃÝÃÝÃB,,,±vdíÈÚ!Ô õB½Âý¹»Ô]*„ˆ‹1âàKò'ô|¨ÇøA–ÊRfù>úì/® Öë‚àmð6x`›o›o›Ïö×<ªyTóÎ :3äØ)é1=À oy /ÉKsöØÜ·’ eßJåQåHk¤5Ò ²\–Ër[Àtítít-ÄÆcã±qG ýJ=€´Ê8ï\·ò?æØ{=gÌSæ)b|ÅY΂5#fÄæSù*_僊©˜Š9„ìa{€ÿ7Çæ˜üRÞ—÷ÌÃæaâüÂ(£(5¨úTp?~ïB¼x£â­Ÿ¸YoÖ9 õ?<ùçíå¼}]ÌÛ÷Øü|Áþ |qç¶t¤IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-22.3.png 644 233 144 3051 13755454067 15026 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÞIDATHÇÍ–oLTgÆß¦e†N¨üi-‰Íllª *V«²kC¡ÒdœÒÔšlc¡icú˜®Ô‚0‚µÉtÝÕbLwIÑF7¨[q1kBgWW`fPD` È”2˜,Ü;÷ý퇙ÛËv¿ìGÏ—Ésþ<Ϲóæœ÷ „bEòW€ùyóóæô6ï3üÖ2kÙ ß$°'¦·LoÝ= OŸ|ú$@Æ™Œ3Úõ¸ž¿¼^ƒ¹žî+„áHíLí4'q=¼÷vžõ™nî[—­kA…÷/¼àÛöoÛù¦nNÝø©ø§b0°×óõzo9¿¨ÿ…¾ðD÷ݦQH}2õI!ÀñºãõÕû ÷VƒóMç›))Ò ñÀŽ]Q¢è^†õx2_¯×ùt~]O×Oô# {{öv!ÀõŽëÛéDÁÐ9¨]U»J×Sº€°ƒU£ñ=ñ=,‚약˜0õ¸ž¯×ë|:¿®§ë'ú1ŽòG!„h)ŠÙŠYÏ(}ê²RY Úß”€@Iv*å*ù¬|ÔAu@ͧù4†-0ÇÜÏHj”˜CQÇ•%ä ~¨˜©˜æt}ý(ÿ"„/[ÔZäÁ¾`ð[ÊA¾"_!ÆUzémXÖ†cãØ²Fšh¢ dH†dÈp˨ŒÊ(p”äv¹“üUI½¤>þD?ÉÌsC^®2U™t:m}`ÕÀÀÀ´þªuEë d¿¿ßßï7ý¿ÅoÖ¬Ö¬Ö,ðmðmðm0âZP jAßyxçá‡àþµ{{28=Ô>ÔnèÉ¿VY«¬úÑzn¤|Ú-„ŸešþêðW9¥=é×Ò¯‰þ7š_{ôÚ#ÓFÃö°]XÎŽœ?;.„õ„õ„õ„ÆŒb"m"m"MO¹§ÜS.Ä&m“¶I±ձձUˆ[o¼uPˆ’PI¨$$DÊË)y)yÂÔøÜçŸOˆ%ç…½]{»Ä?2+,ß[¾7í’ç;d‡4Ÿñ>ÕúT«ì„ØblÎÛ¼YÞ,¨ý¸fcÍFã‹ G G G`Çæ›wl†Fs£¹ÑlÄsÇrÇrÇ ÍÜfn[æ¿Ty©òR%Ô¹ê\u.ð.xç½óðrW~m~-Ü)ñ;ýN€¹+sW@ë±×Ùëd§@ͰeØ´AypæÝ™w±ìñ—úK!ßïÎwCѽ¢{E÷@mPÔöû‡ýçÉóäy xñþâýsÇÜ17ÿc‘#‘#‘#°³tgéÎRxé7k׬]wA'aXh^hínúXú˜6(´?Û«íÕ²æBs!øWcà‹À¶Ò:bzY¯Õko·ÇÛáö©Û§nŸÛ’mɶGGŽ…yï¼wÞ 1“1 [ıAsKsKs ”µ•µ•µ®ùøÅ/n„߯ýºà뀥ò¥rPãiWÓ®ÊN¡f !„¯.¯»¼þø§®Ú®Z¹×|S!X,ðø |àèpt8:`Wö®ì]Ù111 ëÃëÃëÃÝÝÝ ÇÇǰ­r[å¶Jè»ßw¿ï>n)ÜR¸2?Ì|/ó=¨P]§]§YŒXä^è|µóUçýšSúàü[MLÉ£¿OöLö@èFèAèrêÐÔ'SŸ@d_d_d„w‡w‡wC¨)Ôj‚ImR›Ô`áúÂõ…ë0›3›3›Ò%]ÒJ®’«äÂôäôàô 2>²ôåÒ—ÆT2Tí¨vS™\Æ}¯ü¼ÇVËÕÄømžyæ—í±«òмòŒ¶¯‹Çö=öx¾`ÿ9@‡ï*ŒIEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-search.png 644 233 144 371 12610450011 16373 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.1/web/www/routino/icons/limit-15.4.png 644 233 144 2702 13755454066 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜwIDATHÇÍ–QL“WÇO¥ Zpc!KÆj˜›h$ 3:’‘‘’0˜Ó™ø Áâ\x1Fš˜¸ÍÍèhPÜÆP†»L P³¡C{*]2a° Ð~ßýí¡ýúuKöî}iþ÷œóÿŸÜ€ˆˆdÄ~’²“²“ìQœô¾¹o}ËúÖKQܪ¥ÒRyg?¤™þ%ÀªöUíú°‰¸‘ŸX/bò'êû’!æFjwj·¥8†›`ëú­ë­ÏEñg×ÀÖc뙀Ëãò|ÿÕ÷_ñ!üuã¯3Å3Å`b#näõ_"¿4ýG_–]ZvÉò¤.O].ŽGINm4áA”—•—[È ¥D{ùXìÄZ¯ó¸ÆUãµ@Ï3øÚ–µ=Ûö,j¨yèØÐ1SçÂø…ñ ãÐ\Þ\Þ\'oŸ¼}ò6L M M ™yz—Þ¥w™ØwÅ÷»ïwÔO[ûKûKãYy¬«î®î&£ý$É«""¯ý Å‹Šè""b)Ø~c[ͶYrE\Ó®i±øÛýßø¿Q»Õnµ[¤újõÕê«"}™}™}™"ƒ–AË E$è z‚‰/*¨ ÂÄ®×j×j±,nšmš•%‰é©½"ò ÖŸÚv§ê†‰sç`é%Ö³νÒ9Û9 ÙeÙÎl' 444°cØ1ìK®%×’ eµeµeµpfþÌü™yódÂáÆp£‰ì;²ïÈ>3Ò.íðÎùÊ+?N8ÙÊG‡ØÛìmª[`ÕÊU+õ{\ ´Ú@}{ Ç Ç Ç o¤o¤oîn¹»åî¨j®j®j†®S]§ºNccct¶t¶t¶˜‚žO‡§òJòJòJ ÁÛàmðÂëÏ¥¥˜6£¦ýCþ!àpFKF‹~OˆØ½v¯ê¦w<05úï;\ ùäýýýp+ûVö­l¨›¬›¬›4ó U¡*Tp4õhêÑTsß]à.p@š5ÍšfG…ãmÇÛ¦­Ÿ^Ù‘Õ‘ò‡ü ýšv8í°êŽ]þßêðœýúì×@:€ª2fkÓMÞM^èmèmèm€¹‹sç.BþãüÇù!½=½=½v-îZܵ¾L_¦/r«r«r«`$8I˜Þã­Ç??þ9lº³¡~C½1·ªŠgÎ&ŸM>ŠöcNe¸foÍ^àOc*µ~­f¿˜ýnö;ÔÒ'Kî%wÂ:>>~«ßê·‚ÊQ9*T–ÊRY888º]·ëv³n!²0µ0… –ÎÈŒ$LeoMRM’a¸­×Åð °MÚ&C)0:7:çq2¯ŸÖO›>¦nªëê:¨RUªJMAµF­Qk€,²ÈJ¸ 8ÀPƒê¦º ¼§×êµ­ÛÜ]ÏMxÏó¾Ïó|çÏ›# ""›ª¿­­ˆ>óæk÷Öîýè''¾¢À:lþí+Øxiã%€èµè5û‰ÜäûëE<~¿ž™—MâM„n…nYmÕø<ÝqtGmƒ“…ºÛu·_U ûN÷€T_ªÏa~r~`©m© ¼Øà&ßÔ>?¿œG_‚é`ÚúBëCëE ¶'¶gÛNÂÌ68°ÿÀ~€¹usëtÔK`tP¤ˆ‹¾ØàÕ|Soø ¿Ñ3úŽú]õ»DàPû¡öºœ‚'?™-g¶½òmàØ•b¥ Ž«ã¼ÕY,,ðbƒ›|Soø ¿Ñ3úŽy{o¿Ý GjÔº†rh5®ÆŠÝiwR®ÚÛ!;úýP?dÕpñGzE¯ Áî³û(ó—RC>~WÏè‹ßÐÇßAÝ|Ý|±ž©g ¨°ìÓöi^3H¨¬z ƒ 2ès2À ²*«²@† ^q-Ÿ°Oðºìsõ\}ÇOÕØ•q8uîÔ9·øw –œÒ_ë^Ýëé$»“ÝÉnÈ7æó«W,Ù“ìIö@>žçãÞ¼Þ­»tÚ·ÅU=£ïø©{ô%ô/÷/»å'éQ!âûÁ‰J¢’€Ž©Ž©Ž)ï ­ ­ ­xÂÇÇÇž¹œ¹œ¹ìájD¥U@]W× ¿>éé;~"£‘Q} æwÎïô}ò÷º]·{a©¹Ô\j†›M7›n6A¬7Öë…ûÍ÷›ï7{y76ߨ|c3Äb ±H¤Ò>cªEµ 'õ¤¾ãG ކíǰøbñ…ÿÚë—ú%p{Üݯûu¿GÓÚÙÚÙÚ ©ÁÔ`ÊÖÞÅ픲}ÆæÔœš—ßÕ3úŽŸ€ˆ}×¾k=©¬3êEÉSy*"êL\âwq)GËÑrTDFeTFeÕ(7”Ê "2,Ã2ì^Ë+y%""32ãÓsõ?‘b[±íןEƆÇ\>•ý\?—’¬È’,‰X-V‹Õâñ‡ áB¸ ¬ ÖkV O‡§ÃÓ"ÁH0ŒxóVÜÚnmѳzVJ®ž«_õóŸ·²äœNþ`–YoK–/._\¾¥‘ÒHidõVºx®”+å|À |+ßÓÇÜ>óVßxãÝÕïäÿ¯>ö/5¡&Ûî²»¼ÎOˆ ÉU®¾ÇއçÈ¡Á>kŸ¥LE©1?ÿ?vþ5û_¹f_kö=¶6_°<4:z_r³CIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-38.2.png 644 233 144 3065 13755454070 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜêIDATHÇÍ–ÿOÔ÷Ç_ÇW9)°bˆW&[³ƒ‚7¦ ~áf T0|Éu`ÖFnŠÝtYœÍšDš¬Q¢£i ‰*1˜‹5µk](ÌH«] ±a–Ø6ǵ|QÄÒ^9¹»Ï}Þýp÷ñˆï_>y¾¾<Ÿ¯|ÞŸÏóý‘ôèS Îg‰K‹à¸Ý±øŠÊ•?¹Áa0Õ›ê¿lÕo¯~๞çzô;1läúåý"1þåzF\Ò%Hv'»MŽ(> E E+~Á'‡ årÊåE ö|°ç€÷ß{ÿ=öÁÌÍ™›ß:¾u@ y£Þè7ø–ó˱§ôE ñ£ÄLÿƒä¤ä$ÈÝž»=ï‘‚‰<¨©®©ø&þ›xá9`%+•ðáÃX—a#­7ú >ƒßÐ3ô#ód½œõ²ÔíªÛ•Òi¸Ó o¬}c­¡º œà+Aói>€ðká×€RC˜0A y£Þè7ø ~CÏÐÌÛJ¿ˆÈ©rpÞuÞý6@è†æ å…ò@Y5»f'Téßéõ‡ yµImT¾ÊWùÄÖ<3Ì7|.¦§‚ÍUÍU`Ì#á‘[áÊ¥+—`¸z"g"G¹Òÿº*U>ÚŠÚÒÚR°ÖZk­µà>ã>ã>V¬X:{½ÎëÖ¯[¿n=ŒUŒUŒUĺ½õöÖÛ[Á¢Y4‹Ž6Ç!Ç!°ü.Çœc&póØWu_Õ)\i»ÒÆŠ)¦X$~"~"~BDìb»ˆ3×™ëÌ)œ,œ,œ±uØ:l"ÙÿÉþ<ûs‘ßþÌÕéê”y‘ÅæÅfÉŠœTžTÎKÎ2™Ç”‚oß„Óýï|öÎgPqh»c»#¶%[œ[œ[œ°áꆫ®Bålålål,_ØUØUØ'«NV¬‚P\(.#FŒ€ÔÂÔÂÔBhó·ýÐöøn~êûS 7F ¾žy~æyÀ›v.íœr‹J6¾±K¥—JaúÏKåKåʵ¡Â6k›%ñeÆHÆ455wÀ;à€‡wÞyÒÓÓ¡¡©¡©¡ FûGûGûÁ~Ý~Ý~Ž$I8’)ý)ý)ý°qÍÆ´iv1µ*µŠ@ßpW—rÁÇ®] ŠÌõ±ÎOØ›°7!ö—ßzìxì€É÷—î/¡Â}á¾p_ì i5ZVüüü ‹.º€²)›²Á¼{Þ=ïÿAÿAÿA˜Û;×4×SÞ©ðT5ýG¯Ëë‚ÇÿèÁëÁ׃À¯£%>åcÿŒøŠê~âc»Ô.üj›ªVÕ ßÓïé÷@9”C-ÛjeUVe5®ÆÕø2óãÇ¿ £òTÞ“H<åc>f8ÀpÞWã_þqfõmA[Þ O…§bÎO't€PŸ¨O€³œå,ð9æ@=R÷Õ}àW´Ñ†R×ÂZ˜úWØ6ƒê:»³ÕÙjMËÿÙ=+ŸÙÛÅ3{{6o°ÿÊŽæÛœÈëaIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-142.png 644 233 144 2651 13755454065 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü^IDATHÇÍ–ïoSeÇO·ºQ3‘¢fÆl”ŒÄ`“±±D 2k HHCt…H`Ë ddCP’A–©€y153Ë\À°¸±Á‹!³z òb![~ͱ±FF\æ•®ôöÞçã‹ör«û8onίï÷ÜçÜsî# ""‹²O¼Ò¼Ò¼…=¯Î±/xeÁ+Ë:3ú \¯¹^ûýxü‹Ç¿ð~ëýÖŠ9ºí·ãsóEü\>Û.‹Ä1ž*<å dõfx£üòOeôÖxº=Ý÷ÒPÿcý§ÛO·óÄ/Æ/Ìfàè¶ßŽ·óm¼\|iþ¿<Ò÷HŸë(,(,ß˾—Ëvg®—Á¦W7½ 0™?™¯òÀœŠ(R@GÇ–»9ºíÏÆÛù6žoóÙü™zž|ñÉE ôfèMÏ7™„X¼[òn‰Ígt‡8D¤õ´`†Í0÷AET.ptÛoÇÛù6žoóÙü™z俽ý$ˆª)¨)Ò†æ„9V‘±Ç؃¡†ÔœšCñ?QMªI5µØòZÞûÓ*¨‚¨ôHÊŸòcXCF̈=xa ãuãu°²üN+ED–'í™ðLèn¸¶èÚ"à ̈á3|$8Ç$“Ì—5¬a ¨Íj³ÚœSиWãÀÛ„ çÄ·XUV õW®-¹¶HxÆuaÝÊu+m´z.T§ørêÒÔ%çMSþäßÉ¿¡ë¹®å]ËÁóÅ|1èéèéèéÈéLmKmK­ó¥î8³ãÌŽ30H $`oßÞ¾½}N¼Ä?ì†Ï¯ÿêøWŽÝ M|4ñØõxó>fÀÝÛwoý™±Wß[ǬcN⪃«®:ÃÃàµkíZ;”ûËýå~Øwnß¹}ç`õ‘ÕGVÉiep48„e+ÊV”A`w`w`7$>½÷þ½÷sÖÌ£Ó3Ó3`×ãœX:^¯Îf{ÝúÎúÎ!¨ŒTF*#p¡ûB÷…nh[Ö¶¬m   Aimimi-¸£î¨; ]]]Pì.v»¡¹¢¹¢¹ô‹º¦k`ÕšKÍ¥À­,Ád¼8^ìœXžˆÐW.‹ûçÈÏ™a§k•Z¬KÊîºw«w«w«H"–ˆ%b"u7ênÔÝ™Û>·}n»H“Ùd6™"]]]"UýUýUý"ÓÑéètT¤o¶o¶oV¤dºäVÉ-‘Þ:ùüÉç%%K2|ÖŸ?uþÔ)ò žyS™ÊNÉDz$=âLåìg³Ï~ )-¥¥´ùS™¼™¼™¼ zHé!0ÂFØÃýwößÙSù·ÍÛ&Lí™j™jA%]ú?ú?v¶UÉɆgžu¦ÒÙcx➸æUóß°¶YÛHdnŽæ0‡AiJS°…-lFe褓Μx@•©2þUíªàÑ=ú¼=–³ù©)¬)¬ìfƼb^ Í]æ. ÚÐÐæo~p€ÀR|ø€c´Ò ªK¨”úÍôš^ u*=“žÙø5ù5ù@rÞæhÿ•íí⡽=œ7Ø­(#mˆ€µRIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-35-grey.png 644 233 144 6307 13755454063 16003 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü |IDATXÃ…—{PS×·Ç¿{ŸÂ+ UÓë(DU„ŸXE‚ø@q,þÆGëØŠ^ü9øF«¡õ–:ÞÒñ5"¶½ZêE~ ?iT:P¹¯ƒ%*©"DE/Ô`UB ÂÉÞ÷é8Óé:ìÙçì³×göúžµÖ!YYYYYYPaجÃ/>‹yeÖwYße}ÇÇåtåtåt- ç<~ñ‘¤–Ô’:"u°b°b°‚çá,Îâ,Ù‡0„! À<À©HE*Ï“'É“äIdŸøL|&>kÁyÜŸûs¶žl"›È&Í1A#hÍõ¯íßÛ¿·4ªjTÕ¨*×ÎøñâСi¦i¦i&’(ß'ß'ßöc?öC p؈Øàm¼·á?8~p<Mu¦:Sú)ì§°ŸÂØÎ—‹_.~¹xÝ—JR£ÔÌU¸6¹6¹6-<ÆSx Oy¼ž€€€Î#P‡:Ô÷+Ä ±¢î¢³ßÙïì^² dAÈ):ykòÖä­â•MeSÙ‚ÑѸŽë¸"ZÑŠV¾ð…/€>ô¡À$LÂ$€´‘6Ò /ð/ Zý­þV<*;Yv²ì¤´þQí£ÚGµb½—·—·—wû5)IJ’’bÖ 1ˆéè–&,MXšÑd4}¢Þñ™ã3Çg±1ÚÚÚRbJrJrJ²X£8£8£8Áì vC:|‘@Hr˜&‡rŒ#Çb"&bx/ãeâA<Ôåt9]NÀÛÏÛÏÛBÄ®ˆ]»èÖvÞÎÛ¹”h9e9e9tH‘ªHU¤¾• ,,\^@r*s*s*f;N£ÓxÍèßëßëß˵iiiĨ*R©Š@ÙB¶-„?­¦Õ´#6 ,Â",°»±@€ýaÇfb&f¸Û¸ ›5Úm;³ôÌÒ3Ky¤ÍËæeó"f¯H¯H¯Èe‘”‡ñ0vhÕPìPìP, oÔ7êïôbÉ,™%ß^§×éuàùåç—Ÿ_ƒƒƒ€¶ú¶ú¶z€u²NÖ9h[c[c[4k×<044šC›C›C_gý:ë×YÀ ~P?¨‡¿ª^U¯ª‡WìØ±ïáñð‰’VÒJÚ¿¥–––"oº~º~ºžà9žã9$ZFËhÐüCóÍ?Å Å Å €/õ¥¾°/±/±/†? ¬Çz¬Ð~®ý\û9 pBá„ À(û(û(; UIUR SÉT2°]½]½] È!‡ðšn˜n˜n 5´†ÖPäÙõv½]ÿ·4ìéÙÓ³§‡å]˜{aî…¹Ücv×n×n×î×sþUÏW=_õp^š[š[š;rßTd*2q¾ç£=íùˆsÇ}Ç}Ç}ÎoeÜʸ•ÁùéêÓÕ§«GÖóDžÈ9gffffÎÙ/ìö çì;ÇÎø÷ðxøDÆa&a´„–Ð’× ’“Ò@F$•X“X“X¨¸Š«8Ðr³åfËM ©¸©¸©Ð$i’4I€÷dïÉÞ“G«­~´°[Š-Å@aIaIa `zz Xk` Àp:‚œ¾Oß§ï8ƒ38C¨ Ô‚šÿÓe‹²Eá¡´KÚ%í‚@N’“ä$8"‰H@·R·R·ðÛæ·ÍopËpËpË´š[Í­fÀ^›Ø!vˆÀ¨Q£€¨ÑQ££F¾9¾9¾9À7½ßô~Ó <3>3>34¦Ótp÷낽ÉÞdoÂCBChÿ'©©©]™ïd¾“ùûÜh2šŒ¦‘8N‡ÓÁyÓM?6ýÈy÷Øî±ÝcG"ÙÃ{xçQ¥ªRU©ÀĽ÷NÜ P/êE½F>š—÷^Þ{yxÚò´åi ` °XM!›B6Áq÷üÝówÏãïEú"}‘W” ¥B©XÌ.p!âɘ|³ ÷Óûéý#)"E¤¨g¼á ï» ²«²«²«£Ú{Û{Û{¹qÌ‹1/Ƽ ¶Ð¡+BW tœ0N'@˜˜˜ CbþPëçaæÊÍÊÍÊÍ€z»z»z;x:ðtàiØlŸÚ>µ} ß ~ü.øIõ®9®9®94Qè:…ÎÌsˆG<â8Ž<ä!Oï.j®Èá¾QT|¨ø°8·;º;º;Z´–e•e•e¹vx’`L‚1è 5úÑþ?ÔöÄ œVÒJZ ùMóMóM3k@ äû(}”>ÊŽçEçEçÅ=Ÿß˾—}/àfnæf¸ýœ÷€:Üc óe¾Ìw~»óÛßg†3Ù±çsŸ@Ÿ@ŸÀÇ%   B~åêÊÕ•«yI'é$rVÄŠXø°t€á¼‰HDBÿïæßÍ¿›Q\5£jFÕ øX|,>€E±(µçsz”¥G;èYz–žŽãð„×È“ Ý¿$r÷Ô"!U¨B•k‰&Ñ$:nåð/Çõ mÚ2´…ýc[ÇÖ1:ÚÑiG§Eka-¬J:™N¦“1(í“öIû ?¥;¥;¥sM²Ì±Ì±ÌZ333òç4;ëY+`âqwd·y"–››››› ÛëÆË}㵆ÜÚÝáÖîñá>³æ2ÕS=Õï¬@ RBO† C†!i‹µÐZh-„’RJ)Eç$ªû«û«û™££ £ £@hUPP¸wu°s°s°óÀ—­KZ—´.Ü€!ž|êé&ß°7(Ýü¯[»ÿ ///Ï_©HS¤)ÒŠs»ÕÝênµh-Í*Í*Írípwô¦ S)çêŒuÆ:#Y¯lQ¶([ÂBXÈ?nˆkŵâÚþwµ‘ÚHm$}åö·Ü=ö¿É%àO,66666’{jâ^Ü‹{‘·L±L±LÁ¹&¸&¸&Ü’äZ¹V®}ïÄó…Ï>_Tn½o½o½ÏÿóÎù;çïœwÍëêê2dóeóeówç…¼þ÷Õá¾Nx„Wx…WìmOÜ%½ÉCðö'ÚÍA%*QéÊæ¼‚WĶÑKô½ô?Ú+V°)²Y¬€ÞR„!å§ZÝ%Ý%Ý¥E±æ6s›¹üÈÆ°1l ÿÚ½¯Á èø3Š¿°7´ëN®l¤#éb#Ù@6 ?ëx%¯ä•™½'zOôžHï O„'“Ήì öûbËo-kZÖ´¬†¡uïçi,ûÿŠãÿ¼ÔJ».cÀ†IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-24-grey.png 644 233 144 6226 13755454063 16001 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü KIDATXÃ…—yPTWöÇ¿÷½×+NÓˆÁ @ËֈưüÔDÓ #q2Q“t(Ф"‰òÃIˆf,I‰0PÆ@b$… ›Ë¸ã„%¢˜é6D â6D¶CÄè@ݯï?è–ŒU©œn÷Þ=çóÎrßy$33333jLÈàÄÂ-î w…»¬6óXæ±ÌcÌ+ûAöƒìẽyä½#z‹Þ¢wøÛãÕãÕãÕ,pH:‚Œ`mhC€·ñ6Þf¹²U²U²U$]øEøEøåú2@ÈÀÖÒ¬éYÓ³¦_¼““”“”“DzEÑ_ô'+&8è'—š{ ¸ ±+£Ù4›fÓ+¶Ûˆm䩈ìšìšìš²n[¯­×Ö[wÍ:ß:ß:?üïnnn8¾,|Yø2’)‰”DJ€ˆ©S#¦.Ýußõ¼k¿ËÞcûN.ÿ.ŸàŒàóLÅTLEÈ:²Ž¬ó/àýyÞ¿þàȉ‘#'ü¦zÖyÖyÖ96/k[Ö¶¬³‡5‡5‡5“—dé²tY:¬øâC(a…VoâM¼ `f`¬ã>ã>ã>x©ÙØll62û¥àKÁ—‚éæGË-´|ín¥¿Ò_é¿HîXçXçX·´€%³d–|7€€€{ždŒeŒeŒ0£ϟ„j¡Z¨6þË6jµúýEó‚æÍ âBýFýFýF¡LmQ[Ôh0 Ó0 " d,ÚÑŽvS0S c„ €tÒýèG?„AÕ jP…®³ûÎî;»OLè2tº ÂU©Bª*~N‡Åá¶/l_ؾHzÖSï©÷Ô³ýQýQýQÁU#Kci,T¼–×òZ€+ä ¹B€\"—È%—q—d xðàH @9ÊQðÕ|5_ À>ðÊe__¡¯ÐWe.ÿ.Ç‚Y0 þÇ«v]g×Ñ×£¯G_Ç2u™ºL])}…¾B_ŠÛËíåö}5}5}5Àuãuãu#Ðz¯õ^ë=@ì»Ån;°;ÜÆmÜX ka-€«4ºJ»J»JGáÂ…Ã%*õõõH£oD߈¾e.'ˆbÀÿ­÷è÷è÷èGîÜè¹Ñs£I±³)¤\WÅUiiiÀ¾-û¶ìÛ\¸wáÞ…{Àñ¼ãyÇó€Ã±‡cǶz[½­ÀU\ÅU€h‰–h»îwÝﺥ¥¥@GcGcG#&å-¼…· «›«›«#Å.Ÿ0n7›q(tEèŠÐHW4( °RŽr”ƒ’£å(páð…ÃO‡<òtðNÂ; ï$fµYmVyeyeyeÀ­Y·fÝšD­Zµ0W›«ÍÕÀÙܳ¹gs‰f¤ÁÒ`ið$§cccEŠ"E‘«ïs¾Ïù>‡ôææfäqøá#ÌâNq§ï“Ál“†Bì!ö;°¤}Iû’öÉëT¤")•R)¤ÒiÁäýck­=¶P¿¦~Mýàaô0z›Ñf´Ñ>ô¡oÒ?—È%r‰JP‚ÌñÞ¼7ïÍN[¢,Q–(tŠˆˆ€çÚ¸6® )HA 333 í Ú´ø.ò»Èï"ÂÄÂÄÂDÀ/Ì/Ì/ xæÚ3מ¹œ_y~åù•€J«Òª´@†„ {¯½×Þ ž‚§à9ÉI¾&_“¯Áœ*?rcäÆÈ trNÃiØiAþ‰üù'b~çôÎéÓ…C·Ko—Þ.%éៅþFQ„"A9d² Ù€²éeÓ˦ýª~U¿ ˆé‰é‰é»/v_ìXµV­U  †FÀ[í­öV•#•#•#ûœ}Î>ŒWWW `@Ô•¨+QW0j¢&j¢Pšî›î›îãSy§¼SÞ)æsÐC}Ö!SÈ2IúEåEåE¥CcÎ6g›³¡tõñõñõñÀHûHûH;ðÞÌ÷f¾7sP,ËÅr`b+b+b+€Ùf?šýP~ªüTù)À¥r©\* ²¨,*  ®RW©«0ÎúXëƒòܳçž=÷,]HLÄDL("â ŽƒRR4§hNÑàáááø½á®á®á®Dí˜vL;æØ”x:ñtâi>ÇÎ;wìÄ8 QˆBÈ$%’I `ÿÆþý`ìűÇ^âÇŽ? DDFDFDN¦Öîc÷±ûÛßÝþîöwÕm«ÛV·-:´èТC g.œ¹pæµ6ÎjœÕ8‹S*;•ÊÎÿÄÛkì5öš{IÆO?eü h|z¤VR+©½¢~øýá÷ý’£·FoÞÊbæÄ͉›G.÷7ô7ô7€ñ*^Å«@H‰#q€$‰A€ß¨ß¨ß(àéåéåéÐô=` Ö` p‡¿Ãßá™Ûfn›¹ Öžz~èùqGܸqÇW‘[ÎxÆ3><!AHË;ÀàðM¨CêîGÒ7èôuûƒŠAÅ`=âââٜٶٶÙ6r2¢(¢(¢«X%«d•P’(E¢~Ó½îp‡û¤ú¸{çc>æa7Ãn†Ý„å×ü_ó͇êË/¾5Ò>iŸ´O± ±l£XXѲå³|–/ø8Ç$’ ƒº ]…αÉål'ÛÉvŒ“ïÉ÷ä{µ¨Eí$'Ó1Óá&nâ&d ¦Sƒ‰Å4•7•7•óùn7‹›¥gÌ^e¯²WmùøNÖ¬;Y313=ÎÍQ¨Õ¹ž¢Sè:î·~¾õó­Ÿ[š-Í–¶åc777»§ÚjÚjÚjøüÚ×k_¯}ÅT’JR!£Çéqz ( ØbC‰HDŒö™úL}&œ¬›W7¯nÜÝzÝzÝzE£hÔ–¹]Ü.nWϘ³÷8_s…ë@\oîü%‘ýoŠøü‰Úul" ÉB²0fõÄ/G}•=ÅžbO¡[K×Òµ”[¶+lWØ.¬¢­´•¶BÉ…p!\ÆÅt1]L‡làþÀýŽ Þ½ zðíòyòyòyù‹&šfóUZL‹i±°Ç™Ùw]ËÉÉÉÉÉÅQ8/<®!gínrÖîR@ HÁå/¸h.š‹Þ\d$#™Û[c¯±×ØÅ”ÁÒÁÒÁR(9Žã8C®H\½8zq”Z{Š{Š{Šùvù6ù6ù¶;çÆïß¿¿mw{l{l{,àÔ8÷)]€›OÈ(¾EÒFªB+C+C+óWË×Ë×ËןÌðððÏdžÉ<“éØäœèÝ›§6OmžŠ#Æ&c“±‰$([•­ÊV€j¨†jþvEX#¬ÖŒ>É™þþê\GŸäâñ;¢Óét:D§Ṳ́Lʤäÿ{µ½Ú^-þé˜å˜å˜uM”Èd¯í}¸ôáÒ‡K§V¶ ¶ ¶°Ïn½uôÖQÇóÃöaû°O“,–,–,þÀ‡•²RVZ~2È ã»`†f:Õg Ä'yþ@~§v³'ºÛ‘ŪY5«Öup\WñMÀØÊ±•c+©VR,)–s-|2ŸÌ'_2VVVüYgê0u˜:È×ô)ú}ŠtÚ­qZƒÃȵë<.YHE*R…ë$‰$‘¤²ZVËj·¾©ðUø*|¹¾›ïæ»ïûÒ<šGóR~noo&à´ç,Gÿˆã¿ðÛÞ1k)¶qIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-28.0.png 644 233 144 3057 13755454067 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜäIDATHÇÍ–ïOTgǃÅFЩ-¦Qͨ “¦3¡nLv54… iLh6üÔnìnM0¾h6‘nì†ÚL­ìš@#X«¦fml‹U+i… @p©c†!g ÌÌ}>ûbæzÙþ>on¾çÇ÷{î=9ç>""²:ö0m0m0¥D±©Â°›÷š÷fü+Š›#÷NÜ;¿üR›R›Ö|±æ mÄÀº__ž/bð/×Óí²Z ÃÊ®•]q¹1ü1¼›õn–ù•(þì$ö&öÂPy¡ò@Ϲžs…'ß=ùÀ—ëËë~=^Ï×ù–óËǿӗ^ˆ›„• +Dàõ=¯ï±ý50fƒ·÷¿½à×ø_ã• "3€‹ÊüøÑÏì2¬ûcñz¾Î§óëzº~´µ9ksD àPÁ¡ÄöhÂH'_|½®ê>á,ö‡ý‘âH1‹ n¨ÄÖýz¼ž¯óéüºž®­Çh¥WDäóÝP8W8j@èfx8ôjèUÐC¡ B±J•Ð|šÂÿ ? ?µUmU[1Î yü)µ'\.!ž %‡’Aý%Ê…þB?0§ëë­üZDdK$úýþÊûàæƒ›ÀŸÈåR.‚|Í7|ÚŒ6£Í=ôг¬:èv°ƒËìd¤‘N:€ÊWùqÄø·Æôbúü­'öÅš¿U—ÇŽÓÙ´7F×ß¿ÿ>Ô§ÖQêξ;ûîì3ô†ê‡ê‡ê¡öXí±Úc0zjôÔè)ïiEZ‘V?¬~X g¬gLgL¨É‘ñÚñZCOÍÞ~x»ÞÚæoEs‰ˆÜ­‚¾–¾øåЧÆS£Ê6_k~­™Å]Ûw9w9Á>eŸ²OASgSgS'8Î;Î;ÎC~C~C~ltntntÂpæpæp¦QÐtÝtÝt¸.‡ËÎËÎgl¾j{Ïö‹3«Ã“áIUÝ'»O‚úS´‰ÜK®O®W]\ .B_⥗/½ ÇÿVå®rÙ5Ù5Ù5Pœ^œ^œŽnG·£rrrÀ>b±À uÐ:h5òÎVž­<[ Ù³f4ìî9W¿«Z³¾|ëË·–N.„Ȫ¤»IwU—)Þ‘ðQÂGdr"X,)ø-Ï›çoÅ\…µÂ*â˜uÌ:fEÒ Ò Ò DŠŠŠDž>{úìé3‘ë×+®Wˆ @@„QF•çgióÒæ¥Í"–NK§¥Ó°§t§ ¥ ‰,ÜZÈZȯH„"ò,>7>—LÑÎ[ŽXލ.˜<ÿ~®mm„¤4ó„yªUXý¡ñ¦öF{£Ü¥îRw©aw´8Z-pºýtûévPcjLAŸ§ÏÓç{¹½Ü^3föÏìw£ëë\š½¼´Ú!ò(ù\ò9ÕeRZ­÷n‰ îÜ+òcúÈÔÈ勽‹‹²4°fÀ<`±NX'¬"æ^s¯¹WdÓíM·7ÝI¹˜r1å¢È¶ÁmƒÛEò*ó*ó*EœÎg‡ˆ;ÕêNÙiÛiÛi±Ý´]³]ùãDΕœ+²”·vwÒî$ÊEú?íÿT$¾6X,¹wKø,:ðþ‰÷OÀB8:%Ó?x®z®‚'Þ“îIGyþàyÓó&,Œ/Œ/ŒƒfÑ,š¦[§[§[AM4uTUGa¶m¶m¶ ´­D+uYõ«~ðþÇû“÷'”6²‡ìÆTâ=Rz¤ÐbSOc¾Wb{&¨Ö©uŸoJŸò)(³2+³ÑJµEmQ[@ «a5¼lUPFh^=^¥ªT‚êŸ1þÊ“&½‰^ÿ Æþoé€ÏwóªÂ*PÑͬnE, ¨‡çÃó„há{¾GqnºA]V_©¯€6Úhæñá5¬†Ôð$Z7×µUÚ*BêN8½úæ/ZQ´Xúýæqÿ•/ìíâ…½½˜7Øÿ6âûv.³BIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-94.png 644 233 144 2407 13755454065 14700 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܼIDATHÇÍ–KLTWÇÏ@u 4 Ñ0ñÁº”ÈŠñ5dP*>p0JBܨ¨IƒM‰†:Ö4&MÑØÂBM„`b$>b¨ €FRÓ(T§šFJ‚Xì¨dƹ÷œ_3gîm}¤KÎfî÷úÿÿ÷žó}s!„˜›øâNq§ÌŽÛ){-Ú†´ 9mqû¬ ŽmŽm¿~sç4d4g4Ë eë¸Î·× aáÛù´_Ì–ÃyÅyÅáMØ'`ÇŠ+Ò²âvýH¿–~íµ•7*o\m¹ÚÂê õ„½a/X¶Žë|]¯ñìøâÄø…€3:€s¦s¦°¨hQÑÒªxÂïKaKÉ–€áÔáT•柀 —ò“L¢×˜ÍÖñD¾®×x_óiþ¸™ë2× ¥å¥åéMñ‚`+Ôd×dk¾Ø5à$'q1iL˜fQPwÔ8À²u\çëz§ñ5ŸæëÿÞÛS>Øž¶= P±{ÄÌ.³ @d€˜ü[e«l”ñ—1bŒ€Ú«ö¨=¼µTµªRU Ýr½\Ù$›ˆ1eÞ6oÛð5_’_Ø}ú¤‡ÒC“ÁSó© L°ä)yŠ)5ÅbŽpĦ`5«Y QD°}ìµSíT;my¯õƒÜ%w%Ðac’/Éדvö.ì?¶ÿX²ø3ÂÆ1|B.¹ñ÷è?Ô¨ÿ444À³à³à³àÛ_lðÖà­Á[ÐUÖUÖUf ,ƃŤñÂxaãKòÇõ$„ýR íãíãÉØ-Çb§c§‰jÏÀýû÷aIå’Ê%•PP_P_PË\Ë\Ë\0|pøàðA‹¿ðxáñÂã°æÂš k.X~ù­ È0`V›Õ_í¶øãzÌîžÝ­®@heh¥`z §á´ì†XC¬!žGžGžG–?w(w(wZûZûZû eS˦–MÖÉõwø;ü6aEÒ'}À º¤.Ù¿±æë1+c–| cÏÇž[m¯¶ÉUr•mkš›› ¯"¯"¯ŠÏŸ/>™®LW¦ JÏ•ž+=Þ6o›· jSkSkSÁ³À³À³ÀÖ£jTß«:UgñYüq=)BÈ›ò¦ã±ÆVc«Ð+“﨤2i‹pg¸3Ü)DÎËœ—9/…ØÚÚ"kaÖ¬…BD|_Ä'D°'Øì¢ýbûÅö‹BôŽôŽôŽÑ|´ùhóQ!óóó…_ÊYbñYü =ï;cê©QgÔYg,±í˜SI%3ßÌÿà{OWêÁø#ýô[]ùÆýÆýÆ £þQÿ¨TDETxÅ+^YüÑìhv4&Š'Š'ŠmÂ:yÀ”mð~¨+ß1Ç"zÎÈ3ò SdáÅ êsU¨ mg&Oå©úÞžc|C€ð1ùä£@ÖÊZb˜fÙcÃÿ䟶ÿ•Óöv1mïcÓóû 7oœz bfIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-78-grey.png 644 233 144 6166 13755454064 16016 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü +IDATXÃ…—}TTU¿Ç¿ûÌ™w’€¢¦0â¥ø€Ì̦¡ËÊ…µÄè¹¹”ì¡ ™,2¯W3E´Õ5õ*"x‰„Ð'¸†" !È€áy™abf`æÌÙ÷f åZ­~ÿìµ_ÎoöÞß½¿Ct:N§ƒ7fÍ<[0KÙ;ìö­Õ}£ûF÷ õÏÉÉYJ•TI•Ÿ¿Íp\@ÔÖ™ª™ª™*ºÇp ÇH6B‚=èA€­ØŠ­txxx Éfcc»qŒ˜ˆ‰˜þQª÷Óûéýê»òSóSóSÉ0ÄqAdÕ,ßäæòfæã‡8æ4ŸÇçñy|“Ãê°:¬DçUçUçUŸp ;†Ãu×lÏÙž³=õ¾¼X^,/FMTRTRTÉŽÆc„@´O´O´à©{ú=ã=ß{üÍùwÏç™ßÃãácÝ;OTAüd ÙB¶ ‚A‚ †ãÖSÖSÖSOù<\÷pÝÃu®I=I=I=Œ3¬3¬3¬“¬g‹³ÅÙ°áC|ˆ!ƒ 6ؼ‰7ñ&€Gñ(…m&p&p&«;;;©ó‡B~áwŽ¿0þÂø ¯ï—É‚dAK$®-®-®-‰Å4¦Ñ´;o0ñ$w:w:w@#Ñø[ÅV±Ugv‡Ýaê%ÕóªçUÏsq)寮›ò.{ÚÛâmñ¶@……Xˆ…ਆj¨,nã6nX€X` S˜Œ`¤—ô’^pÃÆÀšf…Yþó‡Î:ˆ{£ÿÇþûd›ER‘T$ýõ"·†[íY¶˰ ËîýÎH[¥­ÒV@è/ôúüËvÑvÑvñ©—T/«^V½Ì­NKMKMKe›½ÞñzÇë,ä®rW¹«ŸËçò¹`1„! t„ŽÐWpW2NÆÉ8€:Ô¡à×òkùµ`]a®0WàÕçÕçÕ‡…ÿªµªµªµÜjÏüɫͫͫ]íhu´:Z/¶*¬ «ÂJÕé]é]é]¤Õû‚÷ï `¨…Z¨ ¢ ¢Àƒ€€N8!„@8ÂàŽà€xÄ#sÆgóÙ|6Àìaö0{`1ï0ï0ï”=ÊeiŒÅÛâmñ&FQŒ(FóR CCh ùç:g‚3Á™hhh É (r~íüÚù5]÷»îwÝ ƒÆ  ½†^C/`Ðô=`XmXmX º]ƒ.`F§G§G§ûo쿱è½Û{·÷.tÐ4žÆÓx(¼ ½ ½ !Òvh;´HòðxøXNÍ©9õßÒ•åÊre9ö„ËÂeá2Râ^8G"‘‡€Kþ—ü/ùcQcQcQ{“½ÉÞ„£ÂQá(0úÖè[£o)WR®¤\ð6ÞÆÛÀá¶Ãm‡ÛI‡¤CÒØä6¹MDª"U‘*`ãðÆáÃs- ‡‹ÃŤ¤a¬a¬a {¬Z«Öªý[:vMîšÜ5Éï9½äô’ÓK¨Ç¬ü«ü«ü«suê´;íN;¥ö&{“½i¾½ññÆÇ§´E(Â|ûqíqíq-¥‡‹.šoïŸèŸèŸ 4«<«<«œÒÁ²Á²Á2ú Y=<>ŸâS|JB˜2¦Œ)›[™ÍhFó¼¦X%«d•€$^/‰L™>2}|Ÿõ}Ö÷YÀò©åS˧æÇkvkvkv555@[q[q[1Ðr¡åBË@³M³M³ PV*+••xÐÄÌ&f³ ÀQÅQ‚zβزز}\—ÅeA@.‘Kä(NàNÔIÔ9ï©^V/«—ššš@„¿>¿>?z®£´£´£À³xÏÂîJq¥¸RÂŽpÀ˜sÌ9æÚÚÚ€XU¬*V5È•r¥\)P™T™T™$Ž'Ž'Ž™…™…™…@VzVzV:е¡kC×àzòõäëÉb‹XØïß3¾ƒÆAü§¤OÒ'éã ¤ )úc¬ŽÕ±:’]ïSïSïãR™#Í‘æHÈr\ ‡Åbð3øüE¦"S‘ hô½Fÿ‰8Y'ëD­¢VQ+ðûÍßoþ~s¾ßækóµù„?ććć0ãî–}gýÎú•#Fb$F!.â"®ã"Æÿ²ÿeÿ˟刴"­H{êÞxôxôx´ ÿüºóëίsíp;P¸Ë™ŽÐŽÐŽP      `ö2{™½€«ÒU骉LdÉ+“W&¯®Ÿ¹~æú@_¡¯ÐWÅéÅéÅé@ðÓÁO? ñbÄ‹/B\ùmå·•ßò¶!fˆb˜fQ‘¨HTdØèp8v:IîÝÜ»¹w´ -ŽG„#MÒ©S¦<•–øIâ'‰ŸÐå«Ö¯Z¿j=¹ÜÙÔÙÔÙê[à[à[âWãWãW`6aTPØÝØ L&O&O&¿6üÚðk —Éer UªGaëhîhîhƆ“Þ'½Ozã;™ÌGæ3ýPDmÀ",¢[ÛXæsŒ9&h uƒ1|ÇÇmùR6$’ 5 ±­±­±>x.ð\à9r&ìlØÙ°³XC£i4†l.¦ŸÂ)œúý•B )àuÍëš×5 rkäÖÈ­~ÆÏøK¥ÀRE jPN%z_ô¾è}¤‡ôžë°ënm£…´²î4Ï3›7²ÿ$Ť˜_Îd–1˘e;«Žt¤3_TOWOWOs¦¦¦‘Ýd7Ù Ë\þé1\p°Ã;@ý¨õø@>œÓ¢ââW¿ºø•k‡Éf²™lìA±L,ËÎä >|pôÐCO΢½èå=ù¨À×…íØŽí¤*´*´*´ªðÉfÉfÉæ3ù¦XS¬)–5Wˆ*D¢yíÒšCs0ƒNt¢€8þþÃc LSÁT@|ÕxÕxÕH—·ø¶ø¶ø åR¹T.½7í(s”9Êv}Öõq×Ç]ÔHÔ/·—P›»,ãð øðjjjÛÛÛw}&WÊ•r岞êžêžjAaíúÚõµëér’I2I&ÄüIþ$Ôsät’NÒɹgÍ>j5Žq¦.¢.¢.^òaù°|àó‹ùÅ»>cö1û˜}÷¦ÝR<8‹CWyñ,ÜýK"öÜn÷»[8«]×GâHÜòWf9.83œÎ þï¯ó¯ó¯óÌÒ°}aûÂöa ßÍwóÝ1‹˜EÌ"ÌpÙ\6— ñ—š/5_j\Áñññ‚Û’I„$¢pÉì¥ÙÙÌ—ð%| {Ð}²ÿá9±üüüüü|X<; w܆܂ÛáÖîA·vÿ—Ñ2ZF»³ iHCóEµ³ÚYíä2Ì¥æRs)d Ã0 ƒIÏNÔÛëíõvÞv¯ä^ɽÁmIŽ$G’ÓU338383˜³ÿöÊÛ+o¯Ü€žÐ!ózøæ@ö ¹üŸ[»B+C+C+ _‘¤KÒ%égòM¦Sk.וëÊu®îŒÞ«Ó§Ó§ÓÿÝØÚØÚØJÞu˺eݯâU¼êïMìkìkìköSǨcÔ1Ì„{¾w—ö¹øKHHHHHç®vRQygø™ág†ŸÁ×®'\O¸ž¸Æ‰ÕbµXýê÷ï'ÞOô©4ß2ß2ߢÿÕ~¢ýDû Wü”sÊ9ål...Í ¤¥´”–þO ÄC,èÇ&0Á?ê9÷Fqòü…ý‰vóP‹ZÔºô´ŠVѪ„ÞÙ[}E=<<Ì?#,–K˜[‚4Aš í‡5š MÅŠc¯±×ØK¾çáá¡ÇÝ~«Ý€¶?ã`ðö€vÝÏ…K?*Ù$•¤’Ôih-­¥µÿxSú¤ôIé“Ì-Á€`@00ø$ÿ9ÿ9ÿyÆP÷ÆîÝY@¨Ýþ<‰¥ý¯8þÖ‡?ù†IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.0.png 644 233 144 3012 13755454067 15025 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¿IDATHÇÍ–LTWÇï - 3 ®š®Í(:²e¥B0¶Æ@ÐpC«Ó4¬â†G[W»àò—Q»X¤¥u) fk»f¡dj¬ÒlÖj­ýš2P•tŒeˆ#ÏæÍ»ŸýcæõÍÖìÿÞ^¾çžóýžœûιW€Bˆ™ñ¯€¤ùIó“Òc8i³aOY“²fñG1ÜÓ:ÓºÞ]0ãýïÌjÕªõXß×ýã…0øõt»˜) C²;Ùm*Šã7á圗sRæÆðÛÀÜnnŸTÁõ©ëS€Ó'NŸàÏpç«;_Œõ}Ý_×ùùÅ›¿Òûì±ÏLÃüxòãB@ÆêŒÕö1‡!;”¯-_ 02mdšL€è(`Å*‹€ AôåOÀú~Ü_×ùt~]O×å#`ŽcŽCx±âÅ sK, ÿCØiÛiÓõ"íÀ[¼…Ô ˆnŒn$ ò‚¼€ Xß×ýõxOç×õtýX>ÆQ„âUàsŽü-@ä’z%bŽ˜AZÕEê""ò³™T55¬†!úÇhE´¢éÑôh:ÈbY¤×)aI¹Z­R«ˆ¨·#–ˆäë1~pA`L××òs!„øýßÁ4ƒÓe`àÒÀ%àO”,(â]Þ9.Çåx‚äð ‡JÀÙd“ <ÁÈä (,ó/‰ëÅõù6–O¼bM_ʳ[L[L:›öÌu›×ëõBý?êê½C½C½C0’7’7’ ™ ™ ™Ð|«ùVó-8™|2ùd2xÛ¼mÞ¶‡*ÆàÞÁ½ƒ{¡ñ7IIÈáþõ7ê =9±å¹-ÏéGÛô¥Ðò…¢»:Žv…Þs¾ƒ¾ƒòÕùÊ“MO6.¼\øEá°äÔ’SKNÁöíÚ¡ÄUâ*qAYeYeY¥ÑÛÍîfw³ÛHènéÝÒ»¥¿4iþRÈ=›{:÷4üî¼½Ò^Ixt¦:¬ËWá“=ŸìYËGD¯ZÞ³¼'Ý „•0t˜ÏÌ>3v¾Q³¬fY‰ôe÷e÷ÁaËaËa‹aoÙÔ²©e8;œÎއ+u|ÅñÇWÀòõË×/_oØ—å{ò=p,§íÙ¶g¦öLíhZjwj·t ÔYæYf­OþutÃè£í¯oüñùŸ‡ÜºÜºÜ:pt::ê õ„zà~Öý¬ûYáÏðgøáböÅì‹Ù'vÄsÄsÄÅJ±R¬öâ£EuEupøÁ›?ØŒøŽï *ÒÒÓÒµ>¡ýÓºÕºUºa⧉Ÿà‡ƒ×®7@ê)7Sn¾Ü}9ûr`báĉ…qã`ã`ã ¬œ·rÞÊy ÿ~y¨›Ï†ô=íËôeBxxx?Ü›{oî½¹ ¸—â2*¦ÕjµZ-ø/û/û/ƒV¥UiU ÏJô@àßž@Rû9’É2º’ÀÖW¶¾hñ®Œõ“1Ç@Ÿ+¿Ì1»´£ðÿÖ6¶±-GˆIÀa;ÛA È™ gÈ(rœß50<0 `˜Áé ýÏÓo€wVñ7g³䇱É,¯D­Q+ÈÕ u‚mtÓä)±xƒìHX 0r@öÊ^à’iiZù½:©Ní1~xiúKÓ©_OþG÷®|d_ì{ìÑ|Áþi'5ÝäÍÉIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-13.0.png 644 233 144 3076 13755454066 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜóIDATHÇÍVíOTg=3wx Œ/´~(CË,R7u° *ý`¬Xˆ •©TʼnCÑ‘¬R?´ÕôƒI5¤›Ð]šXˆ˜˜!5Öj˜­ÁÅb×Ýå¥f% i0Tp *0CÅ+#ÌܹÏ釙Ëí_àóer~/çüæ>÷9÷ Xûi´­Æô(6ÐãÉÛ’·ýáB7GHC™¡ì§ã¤¥ÑÒH’Ë[–·¨·t¬åµúø~@ç×ÓâX=ôMÒ7†Â>I–ÛËíÉÏFñ_ºI³Çì™WH×·®oI²ýËö/y˜¼ÿÃýHò×Â_ Iky­^ë×øâùqòwú™p9á²aœLJLJÈŠ_(¶½-µ‘Ž·o‘ä„4! #I’‘’©L…$eÊÔ–?kùX½Ö¯ñiüšž¦dÆ–Œ-¹Ã¹ÃivGn'?Êü(SÓ {H~ÊO™J*²"“d¤"RÁERt‹n’¤RÇZ^«×ú5>_ÓÓô£óè[©À_‹Ù©ìT–êSSÃÙálRü'ò|äy†c ¡©ê©üO¹«Ü%…]Ø…úšæ$'—ÅJ•RŰòKø™ð3¤øS”ŸÜ)ï”IÎÆô—¶rÖœ"Ícæ1ÙÄŽ‘G^$#ÿ"I–°]]£®apIaQÌ‹y’u¬c]Ü ì`ÉJV²2.žÃæ\Å,f‘¤x[¼Í ׯøÿèëóõ‘¤Y6˲‰ýÑybO¬¹‡k\5.R'Iõ÷¬ó¬ë¬‹Â›ëµymºž7×›ëÍ%65ljØDúøøèyµB­P+tõ|êy=ž~1Ý›în,Øì‰Û·x,J…|ÙˆˆêQ=†aÃ;Â;ldhOÞrøÉa ÑáÈpçÔsê9(Ÿ+Ÿ+Ÿ:»:»:»f3›Ù@okoko+@=ô™™™À½#÷ŽÜ;øKýÛýÛ9,ËÃÀêàêS«O!‡Ü_ˆ/ ÃF˜äb¹øÇXìîìî €ûµ?lI´‹¤iAv×ï®ß]Ì&Ì&Ì&+Ϭ<³ò ß–ß–ßUUUö{Ž=ذnú ë€Í¶Í¶Í6ÀÖgûÞö=°õΖ®-]•d¥¥p?ÐQßQH Áª`Õ7ôS®ù¸æc’¿h§2r5r•œû|®m®"tæâ~î'Õ€HÉ$), øsŒßå÷“¤9`È&ŽþŸ1绤]’îüLR&•I’Í‘`$¨;??`-kIñwqY\&yxäCÎr–ÃÂ+¼$ïÇêÿ©¦©i ‹ÿ*óÊsóý<Ÿãq|k=q•Oóý<Ÿãq|^ïÙ|H\kõ_l§Ä)q*°Šw(§&§&§F}»}°}°}Í === A‚„0¦1i _óý<Ÿãq|k½[ŸÍìóÄQqT \âEýEýEýÊ/|³¾Yß,|Ðå³|–EmTÕF@-T ÕB@uªNÕçëq¾Ÿçs<Žo¶Ô·Ï3¨ Á#xˆäCò!ùPÇç<Ááv¸nÅi{‡íb»R:” e`õ±ú@TËÕraš†)LÅùQÌ``@鈸#n€½£¥j©ñm·ã€ã€âäõ9Îl#¶ÛÈ/Æ7Ø›íÍöf–ç÷ïÿtœúA¬C€úú €;ÅN!ÞBfYˆ4£ìUö*à+|¨h’&™Qÿ¸Ü?ŽG¼>çcð“÷È{ä=×ñÀÉê“Õ'«Ù. ¬xâíœv@„c_|íâkÐ|¼ùxj}ø`“l ¯Ïùp~œèá-G¶ÙrÄ<™ê‹~ý@/]r_rÇ2>_YûÊÚxBÊnew¼ïßîß‹ªUÇçµÔþ‘‰¯ú¢Ž¨Ã¬Ïùp~¢>RËl¥¶R[©1cÉT+½+½KD?âK%Y%Yñ$··ˆˆ&>øÔò”,Æûåo–¿ID´øÆâDD)÷Rî…ÇÂcD”¢o;CÃ4lÖ·uÙºl]ÆÈ/Ó‰âÜèàèàè ù"bDŒˆ$I»%¯ä%ÐNÚI;‰h*éDÒ‰xRž”GD„BZˆ¾'¾GDT÷rÝËDDó¿˜ÿ‘ç²ç2Ѭ2«Q4¥'¥‡ˆ¾Õ³..ÁEààÁ@0 ó#Ñ):Eçì}½ÅîÓ®Ó®Ó®8 ¤¨Yj¨Ùjvü0•u”uÀKxÉ2cê˜ É_& K#K#àô9}ZD‹ wyîr@={*ÿT¾YïoG{÷>6þþF( „‚Ùû¢0.Œ ãøXoñïš.4]hº ý$P¨TÐé‰4&Ñ6°Ö@DÉú™!H#DDr\ßÑÔí©Û‰ˆ®6\%"*ó—ù‰ˆ^¨{¡Žˆfåóòy"ڜӚÓJ$U,´/´St†Ø<6æ¸îmÛÛÆÖè`ï‹÷Åû§“(­4­4­”H¾&_“¯uŽ~¹£ÜQ®î3f¹>úIôDàågß$o’`mÿÚ~ËÔ;4°ÏØgqË¡é‘ébøÚ©Ö·ZßãášT]®º¬…y}©Vª•joU臒ÕrNØ l¶‚ÀÇ<¡¾±¾±¾‘•3ýÃØ[ôoëß ÔëëõÅegØPóÔ<µWí5IMÔê³ Î.€ï†¿Fø/S玟;Ž_ñzb‹Ø"¶<Ù(d YBÖOÛJÿ4æ«J¨ª6´ B§Ðɵ¢ýÖÛçíóö™ýT÷©ûÌ~ˆ bê7v ý¶“í4û;Ú9Ú6Úä¦äÎÍ«ì1:Ù$5IMõƒš“œä”í&×b*¦b¹‰<ä!‘”‚Rðí ÀÞf?l?¬¤ûüþ³ +Qj•Z ÁØMa„àE;ÚVÁ:X"ÑüúÆëS¯O©û8¾<-ûe¿÷`f]f]f‘è¢C8«³«æ4çêŸÒéŽtGèÉÛŸ·?o?‘­ÆVc«ñ4´[ì(vÇkW«×ê^x<ÄC<4y«KÕ¥êR³¿ÇV[}l5+áx¶t[º-}ôIÌ·§Å„+ WOB‚;`õí)1íúÏ>U»éJº’nÒîi÷´{æ³3„! ÞÔ¡Ô¡Ô!¶ÕÐdš˜&¦½ñû)žHà—LÏ^Ž%hwëó´«ô)}JŸ©Ü™Ì™Ì™L`ÅäŠÉ“êC‹]R—Ôõá.5]z‰çÓsÌÜÀž¦Ý£ö£ö£Jº¿Óßéï4†j’3­ï©ï©ï1Ÿ¹Mn“Û†ôŸ$©O¨«¯ÓœçL4žð†®ÝóOÓîúÍë7¯ßlj׻ƻƻgbqfÜ„P)T •Xˈê ô_Úó´»Nj‘Z¤–@!'\Ù\Ù\ÙÌþ˜ÍæG•W”‚R°>‡:¨ƒ:Hv$B½dú-Q»­þúo…Âa@eTFeÚr1[̳诹áÜpn˜Hº.]—® WõÄŠ„›û¿Yºñ­”J©TþÜn¨™ÈDW„+•ÿ8¶¾Ø›p3¾Üç^õÈ­³ëÇ‚IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.3.png 644 233 144 3051 13755454067 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÞIDATHÇÍ–íOTgÆŸA Ly) ›,¦DBVÄ—¾]ÅÑ­LÆ™@LM¿° в¨‰%iC6îÆDƒnìÆì¬MÓM3VZÛ4²‘—ìÖ©±–‰¶ 팦fæÜ¿ý0Ûý|¾œ\÷ËuÝ9Ïy®ó(PJ)•ºúT“““Å1‡xBYBÙsGñÙ˜ì&ûí?À3gž9v.íœ6i`=¯×¯íWÊà_«§ÇUª2ñÎx§É²Šßƒƒ… ~Å×ÀÜkî]CÝçuŸ\<ñ<¿‡{£÷FZZÀÀz^¯×ûu¾µüê½_è+O <5`úÄÇÅÇ)_ÝøjΑhÁ°î·îøiÝOë$"ó@IbüøÑ׃5XϯÖëý:ŸÎ¯ëéúÑydìÎØ­Ø^·½nî‰6L~ÍÏ6?«ë…zœ Âþ° òFä ‚ ×ä&L``=¯×ëý:ŸÎ¯ëéúÑyŒ­ (¥Tço¡Ò]éí[€ÐHx&”ÊÉ …‹­N*òkY/ë!<þ.üh.Í¥¹0Ö2‹,>F¢ý „„Â?†2C™ ÏEù¡r¾rXÔõõ­TJ©çÿ f¿ÙïÍ=âþ@ÈfÙL/sÌØÅ.v …ZÖ ÒN;í ñˆÇ‹_üâþÄ NÈnÙM€þUþúU½U}þGq_)¥Î õ¶z›N§m½õã7Öo¬àxÅQì(F¦:§Ú§Ú ÁÉñÉñÉq8•}*ûT6¸¶»¶»¶yÍ­¹5·oMßš¾5 ŽWŽÄ=;y~ò¼¡'Wëêô­=;¬"ÿRJ)×ÛÐ÷iß§ðÏýw6ÜÙ 5©'“7'o&xàÝG…¼ù¼ù¼yè+è+è+€ÜÚÜÚÜZ(--…¬cYDzŽÁõë׌ƛǛǛ!µ+µ+µ ìgìíövÈšØðΆwÞýÛ÷¾%5ÐÛ ZotžSCâ£ÄGÛ^VjiI©G^o¶7ÛÔÓx»)ØTñµ­µ'kO*•y#óFæ ¥n^ºyéæ%¥ <4¨ÔPÉPÉP‰RÉÇ“'WÊeuY]Võx-N/N/N+Õ8Ü8Ü8¬Ôáßn<ܨTº;CËÐT|À9çóšz”²|iùR)•”Ô’Ô²íeiÉiÉÚ ó ó Æ±÷µ.6.6BùÞò½å{!ïBÞ…¼ ຃î ÌäÏäÏäÖÎ-[:ÁrÄrÄrŽ€#ààÿ–¯Í׿kƒò}åûÊ÷Áó¿Ù”·)nO»­n+`¹c¹´Û)3)3Ú„ŠT&®O\/N¾|þ2Ø=Ö=寥½–fo­ÞZ½µšÆšÆšÆ «5«5«ÚvµíjÛK——./]†€$ à3ûÌ>3ttvtvtBÙé²Óe§ ¾¼£¹/ä¾ÝôÁ¶¶¬T¬T@8òôàÓƒâTrQÿÆœ‰ÎDðšâ=/z^ôLéOù$å¨+¬+¬+„.{—½ËqÅqÅqŰ£tGéŽRÈÈÈ€®©®©®)ØYµ³jgŒÜ¹;rJŠJŠJŠ ½1½:½*ö[A_lTœ/9_ù(:ÒOWbbS²Òþ³åg ÌŽÍ~1û¢y5¯æ…àÕàÕàU˜ëžëžë×ãõxÁ«y5¯ËCËCËC°¹¹ b›Ø ”Êåìwvbv‰|¿òþÊû†“ 6®9•|û¿>FIÔWdê±ÕH ItIñ‰O|k>žkðK,­ñ±A¹"W@ÎÉgò€XÅJ@¢/¡B|n—Û`ö™}þXþ¡û˜îüAÝy«ÖU­ŽGYúÀþˆÑÑÉW|…ÈßåCùd\Fe¤_ú¥h žz¹/÷{Ñùh|ùš\{ [wþU½à/ÿÉýW>±·‹'ö>ödÞ`ÿ pŠ(°‡KWIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.3.png 644 233 144 3033 13755454066 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÐIDATHÇÍVßO”g=óÍÀ0‘À`Ü iÅBc2jJ(Ùј‚lÑhvÂ3(M4R7mm/Œ ®Z›]H¶’¬B¨îv)F@·jd­D°pш0+õG©b3 ÅaÊ™ïÇsöbæã›í_à{39Ïó¼çœÌû>Ï÷‚¸¿ •UÊ*%#Ž•w­xÚÖ´­/ÿ3Ž[tÒæ³ùn$3Odž ɬ¶¬6#`a3oÖ'ï,þd=37¬€³ÓÙi+MàÒÿŠÿ•´ßÅñ_®“®.WׂFÖöÔöä¹ösíüùów?G’s¥s¥¤…ͼYoî7ù’ùÑð}€Lù&åÛ¤3Õ™ «ß\ýfÞûñ‚»y¤w‡wI>²?²‹B’¤>K2éRJ2Ì0Íõ$ ›ùD½¹ßä3ùM=S?î䊒%Y±«b—«5¾!p†üðÅ_4õÔ.’Gy”é¤ÖÂ$©¿­¿Í()×å:IÒFia3oÖ›ûM>“ßÔ3õã~¬£4௠^©UjK†néj®šKÊþ‚þÕDBŒ9#hIí¡ö“ö)ke­¬¥µæù”O—Ôˆ¡ª=TWª+Iy9ÎOVÎVÎ’|–Ð_:Êiðüt=p=;øï^úá%Rï#Inç9ÃcxYRˆÊ‚,<ÌÃ<œdä4Oó4Éb³Ø ËB¢þÏ<Ê£$)%RÂ/$øë&oLÞ IWØ;øß¸ŸÄ?ÖÒÏgõµõµ¤$I£À$>¹óäÞ“{)£;FËGË-Á‘ّّY²ñPã¡ÆCä#wŽÜ9båf£Ùh¶ð­©[S·¦ÈÆMë×S&ƒö@ûRu\«K«K3¶¥ü=Üü€ìØÒ±…Ô’¤ì­¾QUWUǨÙ"ýÎ~g¿“¼Wv¯ì^™ãÏñçøIŸîÓ}:™›Ÿ›Ÿ›OÞ^¼½x{Ñ24 Iw“»ÉÝDúNø>÷}N®šÈþ8ûcFïý}î½¹÷d/ÙåèrFWÜþŒíÛ_-Þxçwùò‘okýã9ï€wøh0c0_dNæí¼v^;Dç£óÑy L)SÊ Ðèt‹k×,®0iL¡©ÐTh Ø×¿¯_?°é›Îl:<è½ßp¿ÎHçÌã™Ç¶VÔ–^.½ =½/½ïÕ"Ùì\ËŽÇÒ€1Œáé®@ufu&½%»,» PªSujµZ­V1{̳WÛ¯¶_m¸À.Ê1å˜r KkÛø¶ñmãÀ‚ €æ·š+›+XSìBì œR O”Ñ”Q+•z¥žëèF—Ñe›€¢V¨^¬0‰cFL逳ÈYä,Æ=ãžqçËóåù€î=Ý{º÷©Ã©Ã©ÃÀµÂk…× -cǽǽǽ@•»Ê]å.]¹tåÒ@ %C2€Á­ƒaÒ—ÒÈZý®~×6‘¸ü7?`ÏW_~õ%ÉÌøK\‘hIYIqI1yqñâ⍻SžSžSžCf-ËZ–µŒô×økü5äØüØüØãçH—I|=Iá§ú÷ú÷Tåb‚ï¤9ùzÑßNþç÷[ùܾ.žÛ÷Øóù‚ý”ÓäòK¿IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-30.2.png 644 233 144 3112 13755454067 15022 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÿIDATHÇÍ–ÿOTWÆßa„A¡bHÅÐmÓ!Ø…v„5ii€6˜¾h¶›»ˆ¸º1ÚfCRuѸíÖàRµ‰ Ú,»i()Ý6Ë!Xu«U!wäK™E„u˜™{ç|ö‡™ëÿÏ/7Ïyß÷yžäÞóÜ# ""«ƒO°”°”°Ø« í¯|cåÿÀÍXÞ²¼5P qŸÄ}ÿyüçþ;!lÖÍþåó"!þåz澬–ІõKë—–ü >™™+Ÿ à?õ@T{Tû#ö|½çk€¯Z¾ja?ü|ùç˳ù³ùÂfÝì7çM¾åürì }ˆø6â[ËX#­‘"V˜V˜þ»@ÃÝtضuÛV€ñðñpÆ4CŒÊܸ1×ýeجûÍy“Ïä7õLý€Ä×_’%;¢Îî|ï=ûÞ³¦ž¯8Á b@wënãmãm< zT,ÂfÝì7çM>“ßÔ3õ~B¯rADäã(u–:ÁßàëÓÇ|}A­×_Ñ_ÁtªÔåPÐïé#ú¨Cê:DhM3Éäc¤ÔÝ¡;ðéw|I¾$ð÷øM½¾ù*»EDžÿ3D¹£ÜîÊïìsö ”]ÙYà?Œ1ê´:­NÙd“½Ìˆ;v •TRCÛj\«q`7€*RE,ða€_Íõ‚úôüS""Í½Šª’ª“οéöØOÛ~Ú§~u*÷T.j¸y¸q¸1$è´;íN;4®i\Ó¸FGGCu¿Î_ÂÃÉÃë†×Aýúú”úÔœkç® é)oUqU1˜~Äø§ˆÈw¡£­£ ®m½›|7Yi«ÿ¸ê…U/à)ÙURZR éÕéÕéÕpµþjýÕzÈkÌkÌk»Çî±{ ãRÆ¥ŒKàÚäÚäÚ2Ô?Ö?Ö?)zŠž¢C~]þûùïCʾäèäh<— • •( :ê:êÀôfÙc›³Í½äy=úõh‘ÿ}3ù`òåìo¿?0z`T¬ÚCÍ«yE6œßp~Ãy‘Öµ­k[׊DhZ„&2`°XEâ6ÇmŽÛ,Ò^Ø^Ø^(—óŒóŒóŒÈö£Ûn?*r±ö≋'DVˆkˆkëáž„žËY‘7ÝoºEøetwt÷KŽa·"S#SyQ¢–F—F-R´ôªçUÌ8¶díÏÚ/‰åñÏU<'âÍôfy³DŒ[Æ-ã–HÌú˜õ1ëE$Oò$O$¶%¶%¶EDGG'd¬ìxÙñ²ã"™;3wfîÉjÈjÈjIúWÒI?ˆüæZ³Ö,3"ªUIbøbdAd/†ùŸñ^ñ^± ÊRÜGq‰œ¾ÐÔ×Ô'‰zÅPÅÈ…ƒ^8(âmõ¶z[E\7]7]7EfÎ>œ}(2Õ4Õ4Õ$2?=?=?-’6ž6ž6.²˜°˜°˜ r½èzÑõ"‘ìÛÙ·³o‹”W–kåšHÇŽŽ—;^Y9/‰2îéõôŠXæÔ9uÎ2(Êj~cm[Ú¶Àäï— – ”–]”5•5…'áÝ„} û ´³´³´Üýî~w?h‘Z¤ 6‡Ías@mMmMm LØ&l6ÈÍÍ…#ÝGºtCTWTWTä¬Ë‰Í‰…ؿيmÅxþz­ëÓ®O•ßißi ð̱æ^¾ß»bïŠÐ)ñ~¸˜¿˜ÿ wÍ»æQÆ1d -;u÷ý÷ý÷a¦o¦o¦TªQ5àðø`¦w¦w¦/^8 Ó{§ß™~&îMjòà=íž‹ÿèAµ·Ú ü:x*ùæ‰ûG WÔÙÇ9¶KíbA=¯rT¨Ýj·Ú *Ce¨ŒeyuRT'J*©\–o>|c9Й®ÒY‚bx"Ç0sÌL~™¼eáeáÀá@2«N}NŸ>3&ÉPòÓAm ®«Õ@'t.¦˜õ@¹” (§Ž:”ú»nè>uň6¢A}LþS¥”~`þš–'ÿÓû¯|joOí}ìé¼ÁþQ¶Ä@§ä_´IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-9.6.png 644 233 144 2533 13755454066 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mHTYÇŸñ%5Í2iA‘²HØ‚ííK¶Q0QmfeFDiI¤,áZ±mE”´+F%Å–PÛ‹TTÔ— ÂØ‚^d±lÂÝ,YcVut§4gî½ç·fŽ÷Ö¶ß=_î}Þþÿ?÷<ç¹G@DDÆEŸ1™1™1É;f«íO\š¸4û—ˆ}Ò×ךçßCʱ”c©gRÏX^ÛÖqבּñ|Ú/ãÄv$4%4¹Gí°n溙‰#öOÍt-éÚ{Ê®—]¸Úxµ‘ ð=ð=,,ÛÖq¯ë5ž_|Â/ñ·âo¹Þ@˜„1"µ$kÉ”o# Lüù+ºb»bU ˜½€·Z  ¢—ßaëx4_×k<¯ù4D@Ú¢´E"°ºxuqÒÏ‘ï9Ø™±3C󅯇8„Œ 07˜Õ¬špáÛÖq¯ë5žÆ×|š?¢G>ÞÛZªpLá þÌ7æ°ÞEFa£ÏL7ÓQj«Ú¤6a¯nºé¶MU‰¿!#„²þ4<†‡0˜>Ó GñUaBa‚Xëql¥ˆHN$ù’|Á8ÛƒíöÖ|£͵æZù&šBÍÕÖR. €åP¥Q€ágOž5?k†Ée“Ë&—ÁüãóÏ?Ó˧—O/‡®];ºvØ‚z›z›z› 7'7'7òkòkòk`öÆÙgo„Ö/ZSZSFÒ‡­ß5_„_ëH¾—|O5oŽo˜_óѪׇêCÛ–Û–Ûfûg}˜õaÖ¨«¬«¬s|©³ƒgϤy“æMšåGË–…ê+ÕWª¯@ß´¾©}S½ø^¿Eøµž‘ØüØ|¾‰¿C$f¼ˆˆümAÉ;—w>ï¼ÈPÍPÍPHÞî¼Ýy»E^,|±ðÅB‘¸’¸’¸YfY`ˆ$º]‰.‘/g¼œñRä²uÙºl‰<ìxøúák;Ÿéš/¯õĈX7­›®"Æ*c•?ŠˆHš. Ü Ü ÜÉîÉîÉîYydå‘•GD&ôMè›Ð'’u"ëDÖ £Ô(5JEÜAwÐqßußußÙ~jû©í§D’Ÿ'?O~.Òat„;ÂaS4_„Dϧ=¦¼÷X =à¸ÁSì)öCFAFAFì©ÚSµ§ zÒzÒzÒ gYβœeðvßÛ}o÷AICICIŒ AQ{Q{Q;ü;ðš× +õ¿=öÉ©$zJn—ŒKv+„2Cé¡tèžÛ=·{.p˜Ã«Óê´:Áßèoô7‚õØzl=uQ]TÁ_í¯öWƒYcî7÷ÛxxGÆ#ßçO¥cŽÌ•蜙hV™U ªåj—ÚåhÚ,•¥²€-la‹ã´¬g=ëÁ ZA+èÈÏTËÕr™‹HÏÍÏÎ1Çä§0±00¢“ÓkzCf·ÙMX=TýªE+Oy ôÒC(¯ò*/ð>|ÀnsÔ}åW~ fØ ³ÍlsâGùþ;ùGí¿rÔÞ.Fí}ltÞ`ÿCèŽÿR(ÃIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.5.png 644 233 144 2612 13755454066 14750 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü?IDATHÇÍ–oHÕgÇϽÙíºUj9ˆ¶0·AŠj޽IÐJËvÁ™fM•Ì",‚dájôbÌáB+aÔDÚeÍlÜp„wWX†…Õ•.“¹™šÒô¦•÷÷üžÏ^ÜûóÞ&{ßóæÇ9Ï9ßï÷ùsÎï‘ÄÈWÀ¾Ì¾Ì¾0lÛ÷EýÎÍÎÍï] Û5 lÛlÛî Õ ÕI’.˜]QÛš·âcóE¢ø±|–_%ê˜×8¯Ñ¶>bŸ€‚U«œo…ío[!Þïž4 äç’Ÿ~ªÿ©ž/` m  `lýØzˆÚÖ¼oå[x±ørâ?ü"0÷ÚÜk¶˜ç˜ç”œ”œw„þ|ò\y.€GsÍÑvPÃÀ|æëõ@ Ö‰±­ùH¼•oáYøŸÅÖ#œ•œ%ŸîütgüùpB×pä#ïX|!7pŠSÌ#hÔnµ›— [u+6lµ­y+ÞÊ·ð,|‹Ïâë‘W϶*ïÈw!€Têó/#ËÈ"dü£ÞTo¢õ*¦Ó˜=~Ç‹T¥ªP >P;Ô´ú|ºuº•.•¨gìãÅv¶c ¬ÊŽ9J‘´3??Œc* Dæm¨"UÄ_ãÆ# ‰&š€}ìc_Œ¿›nº &˜ÀÀˆUn›ÅLYøP3ü=a5^(=^zÂ÷Ã\£Ÿ†zC½3hºóïÎ@gNgœÎ8ÇÇdz7,Ôjµƒ»Þ]ﮇ³ygóÎæÁ¹[ç¼ç¼ðäþ“§Ož¢z€7Â|3ü=öð¾}|U$ópæa]'"bûЖ8wÙÜe2ÝÞÓîo÷‹-ÓÙœÙ,â+ôú E²'³'³'Eºû»û»ûefSƒ©ÁT‘Ò ¥J7ˆx’=ÉždŸÍçô9E&<ÕÕb‘å²\¦Ùæ³øgôÀ› oêFHHó³WwàÆ–¹7r¡bcÅÆŠÐ<Õ<Õ<«=«=«=pçÊ+w®Dã}e¾2_Ĺâ\q.ppp€‹C‡.ů1_˜/€?,G˜ßÒ#´ i金¾‘¾˜²3Ç̱(Îxåxåx%lÙ´eÓ–M–‘–‘–µµµÑ¸ÖªÖªÖ*(¹Zrµä*4Ô5Ô5ÔAÊÊ”•)+¡¡¼¡¼¡<¯¼V›±øÃzì"æ/æ/6¿ˆ±ÕØ*b拈H²ö${’șΤŸI)0 ŒCäºçºçºG„TRIñú½~¯_D¯Ð+ô ‘ÑÊÑÊÑJ‘Åå‹Ë—‹î-Ü[¸WdIï’Þ%½"cÆXh,=z©‹ðEøgô„/[Ça¸<~yôWzOdA/ûëoêo‚tWº+Ý‹jÕ,ª]Ž]Ž]èÊéÊéʵ·×Þ^{ÚŠÚŠÚŠ`]ǺŽup(áPÂ!(‹ƒðüÇç矟еº–—¬¶øÂü–žÙUI¤J~5ÆhUN3}rú$   Yf–™e ÷è=zŒìÙ?²ôA}Pã¨qÔ8 ÃqÃqÃq`V›UfUnã®q7†ï?U9»MÆã1}¬E-UK™Òô-}+z7´C;´tŸîÓ}1þÝ¢[@çê\ã_oÕ[·Õ1u,¦½< <ûß>ÓùÉwæ;!ÜC>P~厪‡ê!!ݬ{tšKÔSïóœïð>ß H¿Aš³ÍÙæ´Xln2òkÊ×”çþ‹¯k¤©ÆTó÷ÒyÍy$3nfÜÔ_±\—õÉxÀèŸÌ'óH‡‘°ßµß5•Äãó¤o›oÛšÏbñ~2µ7µ÷ƒJî;ÜG’=·{nó9;2;B’ % %¤ËuY/ñ²_rœÿˆ ­¬LS¤Ýf·dNYN™ûx¬àµ›¬ª¬ª$É·)oS„™$ImޤƒQB2ÂåJŠåz¼^âe?Ù_òIþ˜k‹×ä×u_×¥Þˆ^üBžrrI>¥—äE^¤ƒT#j„$µz­žË¤ð ?IÒDiÄr]ÖK¼ì'ûK>ÉÓƒÿžíÕýµ¶ZI•$•aR hRw(-J 1$æÄ…”, …GxHuZV§IqB´ŠV~üˆþ™Ú¡v$6<Ì´šxuÒQÀ–ª©Ô@ÄBN¦O¦“ü$Y¡ù•%‡‹ìãk¾N¢ÚÌÍÜLr×q]R¾˜Å,&ÅñF¼!µÔ‚$ïI¼~B?ÁÅØÆYA¾Ò^i$™:›:±H=qaןGÎ9Kr$õ¢M9­œ6vÜu¸ëP×!r48 :^޼y9Bvfvfvf’SÃSÃSÃ+¾»¾ïjìj$ÇöŒÕŒÕ$}ñ¯b| þ¸ž¸°g'y¼»¡»!Qþ­úÃòÖå­\>øçÁÁƒƒÆlØ0°TJ•R¥”ÜÚÚ"·¯ß¾~ûz2ÏçÎs“Áñàxpœllolol7ð;^yx%¡wYû=ÆGv‡»ÃRس“f íqÚãüä55ÇϦâg>åSؽßx›½Í€«ÈUä*sŽ9ÇÐ~ô°”[Ê-åÀØôØôØ4à,s–9Ë€ž÷=ï{Þõ{ë÷Öï\…®BW! ®oÔ7JØñeŒ(.-.¤3R•RÅ/pÌ–mËð`ÞzÆvËv ¨{Q7Q7dÍ:šuPò•|%Pv+»•Ý€ãŽãŽãN‚ŽwŽwŽw€ð Ÿðež2O™ÈjÉjÉj¢UÑêhµQb|€õ¾õ> õ˜½_ï7CS+ÕJ&ÀZìA2 ¼º .¨ €²KÙ¥ìÜmî6w0ãñÎxP[¨-ÔD”ˆQ€MÑMÑMÑ$|@ ¨0€$a‹q>¨Õj5 õ˜HI¤dô/X†üC~KÀïL"Sd"ÑÚéuz^`)c)c)(°Ø ì€çœçœç›’›’›ì›Ø7±o¨È®È®È6ø>§Ïé¬iV«ÕšHGM;c|ÀУ¡G@BÏŠ©ŒÆ§$ Ž«ãÆT†¯„/„/ÑÁè`tИ6}RŸÔ'ÉùÀ|`>@ê3úŒ>³r*ÃíáKáKdt8:¢ õB½ä“ONå–ÃG¤¯HŸÑô.Rùˆ©•­l%õy}^ŸOrÒËⲸL²‰MlJªOàãýý?écIÎÏZ{­¤žpþQm”¤]kÖš©ð'úé7|ˆ÷ÙÇ>R<ÏÅs’÷ØËޕΟÀwiZc’ó«µ–ZËÿ:ÿªýW®ÚÛŪ½­Î쿯(…hò"†êIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-8.5.png 644 233 144 2560 13755454066 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü%IDATHÇÍ–]H”YÇ¿TR0¶/m!£Â¨®êF±/“R “MÛðb±Â £ÚZŒºXRbÉÚ2Ij!жr¯v œ”VYL-qC2”üÈrZSç=ïùíÅÌëLµíµçfxžóœÿïÿ¾ï9ωõý /^<ßëÏGn‹Ü¶ü¦7®V””ýôˆ¹s ®&®ÆìñÇÖ¼U¸^įȳò+þDÄíˆÛA龸r×䮉LðÆç›ÀÖ`køÇ€ƒ¿ü  ¾¶¾–ï`¨e¨`<}<ü±5oÕ[ë-½@})ÿ„/aaAý.K·,Ý’\â-èK‡Ýaxò*D€æ1O§nÜXc4 ¶æ}õÖzKÏÒ·xßëG >->MvîÙ¹ÇvÍ» §Ž.:ºÈây€sœcnà  òU>Ó ›tA?¶æ­zk½¥gé[<‹ïõ#ÛŠÍèÝá»Ã€§T¿êÓcäùxŒ­¢Ñz¥^®—óùxˆ ¨Õ uÔ*•£rÐê›™¦™&<ØU¬Š}àf¦v± Ë`Åæ€O)"’ò3؆lCîP&{ݽþO³Cj¯ÚË$g¨§>ÀÀ npH'ô€|}ôL0€èÜ,0 ˜´ô¡Wõ*˜åûüøŒU» øTñ)`À\K¼aD̪é'7ŸÔ<©ÊÓ•§+OÃó³ÏÏ>?ûù ó´yÚ­ó-ž—où˜ÿ`þ}†Ö­ó§ßÀ£ßÝt&.L\˜UºJWiXѳ¢gE´.i]ÒºÄ_ߜ֜֜¡öP{¨ì%ö{ \¾>|}8@x­9eNZ /ßò*âq°J$ìYس ‘¿DDdÌ·ãg&g¦f¦Df¢f¢f¢DœµÎZg­«YÍj±‰Ml2;Ì3ÅL)Ì,Ì,ÌÉÍÍ9–q,ãX†ˆm«m«m«HÞã¼Ê¼Jó¡—"awÃîJ¼HÈÊ•¬ 1ï™÷‚ºEŒ,#K„×^C¨+©kY×2‘ä}Éû’÷‰Ü)¼Sx§P$¼#¼#¼CÄõÒõÒõRDçè#ò¦îMÝ›:‘¥ J”ŠäÈ;w@$q q q@dÜ÷Œ{ü"W-ž—?ëçÓ=¦Ý³{¬ƒ¦'ÎO”O”Cflflf,ÄEÇEÇECîþÜý¹û¡s°s°sÖ•­+[W-[6¶l„Mí›Ú7µCÌ‘˜#1G À]à.pÇ_?\ûp @_ÑW˜&õ‹{ì“S‰ï”´NÃé?•Æq£Ô(…áÉáÉáI0ÅS@Ö‡õa---}HÒ‡À(3ÊŒ2   ó¢YaVøõøÛxl<àý÷©üŸ>6¦v¨LêH½Aoðï]¢St èÝ¡;òNíÔNÐÛõv½= ÿµÎÒYÀWê¸:ÐǦzß÷¾ÿb èüìŽÜ Þ¦èiÕ¥º€_”VþCêA4W©¦xË8ã »t—îFxÍk Š \íôÕß2#ÍH< :U' ,}ïóÎ?gÿ+çìíbÎÞÇææ ö_ÿ›Iqj¾îIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-13.5.png 644 233 144 3075 13755454066 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜòIDATHÇÍVÿK”wÝyj×Ì/à\é–C‡«VƲ´ü‚²ÈRh³;.Ó‚-FC"¶6݈’¾˜GQn*SŠZäBSp1ɶ”n»¹–:5wž>šy÷<Ïçµî×þ>¿<¼¿½^¯çóæóþ|@¢ƒ_Æxc¼12`mºÑŽE;^¯ØgÒ°Ó°ó×£dÔ©¨S$ãŒqªýº­Åµü…õ€Ž¿Oó#º#¼)¼É´+É=©{R½°¿j'Í-æ–™´_µ_%Éæ‹ÍYNþÝõwINdLdº­Åµ|­^Ã[ˆÊø2ôFè ßdxXx@®ÌZ™•x0ð{"YWG’ƒ!ƒ!ÂH’¤ò”d#DI‰µ5¾ÀÖâÁ|­^ÃÓð5>? dì–Ø-ù^ñ{Åæº@Aÿeòã¯Ðøü-$ó8#HY’%’Tö*{9GŠvÑN’4Ð@ê¶×òµz OÃ×ø4þ€½•*TeRÙ%ï’çuªþ)º•åÊrúƒ¡þ¢ö¨=¤ü—üX~LŠT‘*Rùÿu—2e å3ßißiú•ÿAÿARÉ à³p—e—EX•©·r¬'Ió€y@2ñúo«~[E*wH’¹lV­ª•Ï41'fÄ Éc<Æc \çu^'i£¶~7Ýt“œâ§HR¬«çñrIW§«“$Í’Y’LaÖ“Á;ÓA¯Ãî°“â(Iªinmq­½ÖNћԛ؛¨óõ&õ&õ&‘ÕéÕéÕé¤kÄ5âùÿ†ùïùïùï‘-[εœ#kòkÊjÊ(Îý\s§æùÏÊœ2§¦‘åkÊ×"? Çˆw`ý5Dgü‘ñ  köv;ŠðÙìµöZ¤é{é{Àåt9]N`sòæäÍÉ@gQgQg9“9“9¸‡ÝÃîaÌ/)AJÇVGŽ#h}µÕÛê…¡Ó×ÕÐÕßÔ·R¨jXlÍÚšð«€#öDæFæ¾½x×þ®ßá-¼e¨Ë·|Yð%Âã³ãwÄïà„N`jñÔâ©ÅÀÁƒ[©­ÔV ,X:°t˜îžîžîÖ…=ª|Tù¨ð–y˼e€úŠjQ-ÀÖ72³3³žø Æc4Ôá“'£'òxäñ·7€ŒY³DíãÍñÚñZR\™?ö$ÉM%›J6•ÍÆfc³Qo‘Çæ±yldÎöœí9ÛIkº5ÝšN>8ÿàüƒóz^{U{U{i¿f¿f¿F6\h¸Ðp\™òZÜkqdCDó‘æ#'幇T>_R³¤Fí3AQ[ÔCŒþ4Þ ´±ÚÏœ-Ÿ-b¥X)V.©—ÔK*pyòòäåI ­µ­µ­°–XK¬%@G_G_G’œ’œ’ x†=ÞaÀ²Ì²Ì² (r¹‹ÜÀ7Uo¬Þx&¼iÞ4Äj¢šàœš§æúŒ0IYRÖýŸ0×~³ý&`XÜÔå‹ ‹Qxò<äy°ûÄî»OžPO¨'°œµœµœÖ6®m\ÛlëßÖ¿­XW¿®~]=WWWÜmºÛt· ˆþ0Úí’¯¾½ú6|œÞ'¸ºáêÀØ3»jvÕýŸôSéw|êø”äíT*?*?’“_O6N6RøŽú>ñ}¢·È—ïË÷å“£c£c£c¤Z¡V¨¤(¥¢”ß?¾|?)‰Câ)–ˇɧ¦±™± õ”?ן«¡©ipXVmžé€67Hó¨yT2‘®i×ô<.§Õ:µnÁk·Ä-R8…S8u¡"L„‰0R ‰!1´Àß&n‹Û¤Èï‹÷IR¤‹t>‰Aü®‡®‡$iž0OH&vÿgŽÁÉ+ C CôÉÏpyH"yFy¦<Ó'??b+Hñƒ¸!n¬g=ëIz顇Å}qŸäÓ`þiå‰ò„~Ñ&È#$¯ñYh*4‘ô½8ù_Þ»ò¥}]¼´ï±—óû/u®ã¨}iIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-38.0.png 644 233 144 3072 13755454070 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜïIDATHÇÍ–íOTWÇ3ÀŠò Í& ؈ —ðÂaí°>l ËC%@B)Ì.­›¬M_-Önd³Û] ZS³ Cíê–ÒÄ(î¦VšR ZG@‰@)‚ÒŒLçáÎ=Ÿ}1s½Ä¿Àóææû{ø~É9ç{€ˆˆ$E¾Ötkºuc[›Ìxܾ¸}[ÿƧC`©²T}ÿgHü8ñc€äîänýމ¼Q¿¶_Ää_«gÄ%IÌ@lol¯ÅÁB£Æ÷RÿãÄ_Œ¿¸ªAóçÍŸ\øô§´ÂÃo~ðÄùÄ &6òF½Ñoð­å—ŸÓ˜/c¾´LC¬-Ö&¯ìyeOÆ»á‚{P^Z^ 05¥¬z$ œ€ÆZZƒ|¤Þè7ø ~CÏÐÏ#úzêë"PYWYï 7Ü9 諒—fè/í´“šGó„êCõøA]S×°`y£Þè7ø ~CÏÐÏcn¥WD䟻aÿäþIÐo‡´Ù`F0”]+ÖŠ F&UúOú’¾Ú¬6£Í€ÊVÙ*s=âž!¥öh ZAí‡àúàzP¿óÃ~Ï~ðØÐ7¶òªˆˆýÄ{â=žh¥OMà P9*/³Ì3ªQ5ªF ›nº× r†3œv²“kâ[ÙÊVàlf3€ªPxÉ‹ðgGô"úŒ„çDDN­h©l©4Øô_Ýüa´|´:r:ìvÔDh"00õƪƪƪ ãHÇ‘Ž#0qlâØÄ13¯WëÕzµ‰ï½{ôîQ8•rÊzÊŠš¾3Õ1Õaê©•–×Z^3¶öô×¹qúÏ÷Ÿ‡áÒ{/ß{Y5&ýmCö†lü{+Š*ŠÀ^a¯°W@ogogo'رc*‹+‹+‹aKþ–ü-ùàÎuçºsÍ/_<…y…y…y)ÿBþȼ’ñVÆ[ø%iÓÚ´j„¾ú>õ›ð‘M)›R6¥ˆ¬¸V\+.‘àpp88,Rr¶älÉYÛ9Û9Û9‘§ Ož.ȳÕ?Þ?Þ?.•••%ró·7ß¼ù¦Hbarmr­Äþ'ý³ºÏê,.‘r)5²îƺÛ£­c¶Í¶ÍäJ¼oÆ7c‘½¾]þ]~YÞ^´­u[«¤Ö¤Õ¦×¦‹~È dŠè;ôúŽ?ÇŸ#rµçjÏÕ ( @„ &˜0 d†û:::ÍøÆ¾cÇD|Ã>‡Ï!Ë"¶2[™¤ÊÓ(g”“\«þRàÛÀ··ø?JüH¤óÊ'CŸ IjV3^3.rùÀå—ˆØúl}¶>Wš+Í•&âð:¼¯HKK‹ˆmÔ6j¹>p}àú€SL1%’VŸVŸV/2hþÐü!‘¥ß-•-•‰x‚·Ç-’éÍ<‘yBRE¼·¼·DdFT'-nQ±Æ;_t¾æß÷íöíV…{·-l[ÀŸò}ÊHÊÔ:jµ˜œœ„²¶²¶²6HŠIŠIŠš†š†š¸m½m½m…¼¶¼¶¼6˜[[[…æöæöævHHJ°%Øàý?N>œŒ?â&ГՓ¼žGŒ[ÀàÁèƒÑæ- üýgçÏNXŒýÑ÷£ê õ„zÌC­•kåZ9,z½‹^ÐE]@µªVÕ K]K]K] 7è z¨Kj@ ÀòWˣˣ(}1øjðUSåƒo|Ð#·’/žó±ÿ†}E¹žùXªÃ«v©RU ú}ý¾~”S9€²+»²ƒr+·r¯ñ±&i}YÅ©8•¨ñª¿Fø›'§'§â—ã—=ÑÜ3|Ìp~¿á¼ÕQÕQÀŸÂά.i+Ú ð¯ÐƒÐÓù9ÍIN‚TWÔ ‹.º€žð”[©1àa¤þú}Aõ¶ª­ 篎®ŽÏ;ÿ‹û¯|a_/ì{ìÅ|Áþœ­¼Ëà9õmIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-34-red.png 644 233 144 4176 13755454063 15610 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü3IDATXí—mLTWÇŸs’n@™ÙÕ`}¥|[ÚÐAGõ¥S¦nkª"bkb$F‰Åvi€BˆšZ@%5«‰Ö…5ZÓlp«¦» h— ¬5â 88̽sþû9÷Þ™Íj6»ÏxÎy^~÷œÿ9'C4jã)̤EQ®(W”‹= ÄŽ97æÜ˜sK*š¢)Ú­ã4‡æÐ`tš—B )ÂÂ}^"âE¾¨'ê‡÷“…ó˜ùò(ò¤†ðù„éÊ9åœr®á)ÛÅv±]:H\¼7ÞïÅÅÕ÷Wß_}X׳®g]°6cmÆÚ Ãó"^ä‹z¢¾è÷r’~îO)—¥Ai°kŽX¡$g’3É©í®¹^s½æ:màÉÀ“'dÈáÆ0  ]èt?4/âE¾¨'ê‡÷›Rþr>²Ž“z¥^©·ë’(q-ãZÆ5õ7î€;àÀñžÂS j…Z¡VhiZš–hÍ¡9L~h^Ä‹|QOÔ×Ãú[Çéh¬5°"å°rX9\{[$ØKìÅöbÕ¡ƒ}ÌóÃPkGöŒìxW =Ð`DkÕZ¥( `Ãx ÖúKü%ÿ8ŒÁ€¶—Ø÷Ù÷©Ñ_ð>²t[º-ÝËç‰k‘µÈZÄ“==<Ъ3  T*LPõþ)ÿ|ü» ð5|  í€v4(ecÖóØóØóý¢¿àÑù”ÊeGëa1Q™[ù~åû|k¨€Om4šM ýwzîôÀñUÇWÀ¥¼Ky ~¥~†v · x1xÑœßr¯åttttjCXޝ2·2·2—oÕW6Œx_üìøÙñ³QòtéÓ¥O—îâ.TØÄ7Ÿî:ÝŒž{?<~Øì¯y¾æ¹¹§fÕ¬f¿åVË-Sü@yy? ×÷r/TÑ_ð>zdUéªÒU¥Æ—inu¥º@ŸJŸ—>œQÎ(3@Ó“¦'fà{_ßûÚ<ß¹¾s=LΜkŽ«ù¢æ £¾æ±Øþ‚GðI¡#5Ý’mɶdëg,ж°L–ID¿CÆGD´wÿÞýDDç÷ŸßODtòîÉ»DDsÝsÝDDI?&ýh¾IÖm[·ˆhê©7ˆˆ¢F?$"òýìû™ˆ¢Ca§¨ƒ:Œþ–FK£¥Q?òâ~å9 Ë–-,Cç ö‚½`Îâ,΂ãw|;ßçÓ;Å;ì7í7€½Î^€¬î¬nóJæÉ;™2/@Ÿ§ÏRÔÀ_õfÕ›À¨Žž( ”€‹ìŒ 2& Sð‘ä’#ð(4Pr2ïDð„qÅø´èaÛ° N•Ÿ*à÷T{ªÍ@=•=•æ-=Út´ &VL¬€ä·“߇Ûá Òdš ¶¶€v¦:¥:ÅèwåXóóæçú ø{–ÊRYjàÉóåùòü}Åâ”Ù~mM³¦iS<ë»ßé~´GÚ# ðÅ1í1í?˜?ßþýÖï·šA¿ìù²>s~æ€mÛ·mç ç >åå+Ò›Ó›àÒòKËá÷!Œfï›Y:³4¨?r‚œ 'T÷Slvlvl6‘rU¹ª\­ïÕ/üµYoe½¥é7b°àÄôÓá‡+äcsÙ\3àuÔ€z_½ðÀcZø¡î¡ný£ñÁêòÊ?2>×ù×Mßlú&èÓ·È[ä-ß0êÇôQ¸%UXR-©–Ô®"¡ p÷•ÝWøbQPp{ÖíYàÀÉÍ'7¸òÝ•ï@³i6Ô;ê~­YkmŒ6ÐrÏ$œI€Ÿ:~ê€ïô`ÓçMŸc…þ„KÅRñ‹¥l"›È&ά‰”oêçkÛÈ6.©bõ¬‘5 ­·»Z¦6L…K×n~pfp¦‰ËÏ?៖`‰YðÃðÅüCþ¡±¾½õ½U½U€-Ú6Ö6VÝ¡¯äAù |°À®£9ÈAÅj°fR&e*©¨Hî“ÈvŸ×ŸÖ*ërër5γ×]ç®3òÅ50ú”Ö¡Îèƒ^.Ô àx-¯…@! 7Þ|wPË×_ !Å£x\‡w&îLÜI$Ù%»dggBt¹slèï¹Sî”;Ù…ä=É{’÷Yœ§Åé:¤k7ÓžiÏ4k7X,€.¸àð ÏðÌXhmš6M›f¬oÙ‚²e øbý-³ÄYâz_ŒúÖh 3v9bë‰E¸ß†ûÖèQízÎÚ-(,(4i7NSã  àÃàÃàCãÚiCÚWL[L[L_­k2VŠ•bß;!ÅŠ¾(zù€\fÒî&¶iÉjVÏêY½Y»®W‹¡]µEmQ[ }'''³¼³¼³¼ÚºåF¹ñéBj!éEþ‚^aF€(`h·Oî3i÷˜õ˜õ˜ç©÷Ô{êCGǯ -¸Pp¡à‚qí(UJ•RÕúI󗈾¡qzíU€‘&Þ i÷ÿI»Y+³Vf­4´ëJw¥»Òqjtžë;ÁrXËY²/¼ô,¢/£ÿÒ^¥ÝEr±\,w¥ àœ¢œ¢œ"þiÊHÊHʈú7}«ûä>¹¯ ‰j©–j)tíÈžˆ~Qô?Z¤v…ûYÿ`›Ùf¶ e´Œ–gH“¤IÒ$€#FþÖæ³ùl>"¹Un•[ÙŸB‰"vîÿfqúÙ”MÙÊíðé½¹—¸Äv™]f—ÿù«Ññ©®ˆqGÔ}åVÿ Ùªƒo–jžIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-5.4.png 644 233 144 2407 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܼIDATHÇÍ–_H”YÆf͈6f(³¸^,Y ¦”ƒºÖ­t±xeàV[mB› %˜‚X“CbvÑҟ̓ Öþì ˸¨©¡)*FÓ÷ïüöbæø}Öz﹞÷œó<Ï÷žó¾s!„Xÿ¸)qS¢'†´ãîýîýßvÆp³„„²„²W¿@Úµ´ké7ÓoZom¬çõzç~!l~§žŽ‹u¸º\] …q|o=¼ÕÃWžBrwr÷‚ Õ=Õ=wÛï¶óŒ?0S8S6Öóz½Þ¯ùœüââúBÀêû«ï'ü ®5®5B€·È[”][ðO6øJ|%£«FW©D“@*©ª˜g=¦XÏÇ×ëýšOók=­ó# £ £@(­,­LnmxÛ§6žÚ¨õŒnà—HsÞœGåQ¢ žª§$6Öóz½Þ¯ù4¿ÖÓú1?béÙ6ììHªHZ4ÔGŸ¼,/ƒ¼ðyøó0†Ì•‡ä!”<.È#@ Åc÷L0aCU«üʲ6Œ  ‘ãüªÂUáÒö9ŽR!¾k‚äñäñù$TØ‹¼ÅŒXV™[Œ™˜|=¢D‰:ð.v± ÔqU©*ñ«Ü*ÙŠ!,Ãõã~âÆšÿ€“çNžnXy`•Ye` cƪ»½»¥»®û®û®û e e e> ~ü0hëZ+`l<Ô;Ô;Ô ¾tðÑA;‘|c®7×Cì>Zy‹úq?qcÖ­Ù[³ &T•ÎÃL×LûL;dŽdŽdŽ€¯ÊWå«‚c/޽8ö"õ‘úH½mDFeT:2·×Ükî5!ߟïÏ÷;>à²±ÙØL”¿´^L_ûàyìy¬º`|ûøv°Ž/=¡þ§ýOúŸ@R~R~R>”Ô”Ô”Ô@ÛBÛBÛ‚½Î8kœ5ÎÚ¸áLÙ†3 ÚD›hƒò`y°<è0V$Se*Ñ‘˜¾ö# }múZë L½›zVýbÙð¬éYÓ³&¨¾W}¯úüÀÞ-Þ-Þ-Ðy£óFç [°§£§£§òŠòŠòŠàôÃÓO?„ÝvoؽÁQï­AkhÔz1}íçëŒý¶4c½½å½åPç©óÔyìøNµSíTÐèjt5ºìxý¶úmõÛ ÅâNqƒ·Ô[ê-µk¿õçÖºÖ:ÇÑËe3öÅ«]zÇF'F#£Ø1¼cxÇ0¤µ¦µ¦µÂ‰è‰è‰( e e e@nUnUn„æBs!»‚¹Ú|µùj3ì í í 9¾ØeÞ1ï¥iÙ;öEU¯’çæóyãñÒx “îI÷¤T¶ÊVÙ ²T–Ê‚©àTp*–ÇòXŽÌ~’Ÿä' sæ ç Uyß¼mÞvèýU:úØBx6<»HP¬úeŽÌá£: jcÙŒ3稕d‘E–#ç9ÏyP}ªOõ?PJ)ðw|þW‘G“áh8 Ëô1Gç§Â]á†X5ú@¾–¯+rZNc¨ßÕ˜CÑM€0Ã4Ó B*¤BÀk^ñÊaô"A‚(Rd¬Á’!'ÿ²ÅþW®Ø×ÅŠ}­ÌìÖô¬¹ïW«øIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-19.7.png 644 233 144 2752 13755454066 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŸIDATHÇÍ–ëOWÆ_.·Zš¸Ba¹$¢‰Æ{6Ɔj (#Š•¶1‘V$R›xM› 5±±6´M“J‰1[«x¿BRª‰±qQJék¬ÒÊ*ÊMQ˜®"ìîÌùõÃî0Ûú8_&ïíyž9ç¼ïy=üˆ~3úÍèĽÁòO*˜TuÓ/¯‹åˆ?&jIØÞ ïÌ|gæ¤7Bö×-`k´5> BESE@Ãá†Ã|ý¿öÿ 0¼dx X¶7óÍz/_vÿ_^i~¥9ê.ÄÇÅlj@z~z~æÇ¡„¿3aEÑŠ"€1bT4è€ÉLVK>Ìg(Â6ãá|³ÞÄ3ñM>“?¤G ùíä·E`eÙÊ2ÛÁPÁŸGaGêŽT“/Ð|ÁL† /èÐß×ßgT‹j Š(°l3næ›õ&ž‰oò™ü!=ÖV""ß䡯®Nj5&2 ~ÓSôá€2ŒûÆ}> >>µAmPxáQ5¦ÆPzŒŠ ý½€;à† ?„¯Þ]e_e7~“gme¯ˆHÎw`óÚ¼¾X~úËñ—ôKÒ`ä9ŒNý£ž¨'À.v±+BAyävìØ#üÏyÎóÿHÍT™x…ÐÕÚÕ `óÙ|¾Ø°œïÂ+¶ÿ2#•• ªŒÙ&Œ»Ô]î.Gu.ïÌë̳à;Îwœï8ûï[¼o1t_í¾Ú}õÅó:¼¯jÕΫîÇ?Äÿ:öê!ã7F{+z+ŒÙ°ùËÍ_‚ÑÒ#̹ºN-=µ‚Õêƒ÷Z×n\»‘q³E<ºG÷èÐSÓSÓSiÙiÙiÙ°¨nQÝ¢:˜V5­jZôÜê¹ÕsËæIö${’Á¹Æ¹Æ¹ŠÛŠ/_œ8@ãî?êêÕЬ5kü9¤Gø*±0±P“'ÁŸÅLfÂÉéǵã¤ÎHž:ÚûÚûÚûàHÙ‘²#eàlq¶8[,sÆæŒÍƒº©uSë¦Z~¾?ߟoÙõ)õöz;¬>¶ªjUUÄÒöõOéŸ|ž¸4q©:#””`ÜäÜ{È êØDÛàlr69› ¹³¹³¹FÖ¬Y³rgåÎÊ…¢E;‹vBÜ‚¸q à€ë€ë€+âDÕ¨UÚYí¬v}Ž>G\™q9ùr²5fŒ¦‡ß?üL=±¢FcÔM‰ÌÌ–²@DD’ý!Cƒƒ"±wb½±^‘á‘á‘ᑬ˜¬˜¬‘‚K— .‰\˾–}-[$-!-!-Ad`ÝÀºu"ö£ö£ö£"'N$œHIÉLÉHÉY|ó­¡·†D”7Äc|b|""žh‰õåûò;~—ñ–s-çD¢ŠˆðaX—?ñvbgb§ˆÚ¢¶¨-"Ž+Ž+Ž+"Ú2m™¶LdOéžÒ=¥"å%å%å%"sýsýsý"¹·soçÞyæ}æ}æiÛÖ¶­m›HqvqJqŠùÙâ'#Ì—îéöt‹Hœ¯ÀWÐñ»Õ•ÊO+?î›]©_Ð/€ö­vZ;ò»üÛýÛ­-¿7~oü Μ?8ØË^ö‚q׸kÜ…!×kÈꎺ£î€–¥¥j©0úËh×h Œ­ÆVàB˜O¯tUºÌy¶ÿ²˜slƒ¶A_,t=íz:Á_ȘqØ8lÍ1Þ ‰$PËÕrµ<â,¥«t•lb›"u€§<°«ôv½ý?sLïÒlý¶þæ˜*jM~vSM5¨6ÕªZë\ç:ðˆ‡<uSu¨@ çOÕ?Ó?#À6}¡¾0?hòýò¿¼ÿÊ—övñÒÞÇ^Î쿤" šm§R…IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.png 644 233 144 2345 13755454064 14674 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜšIDATHÇÍ–]hWÇÏîf3*~$Ö1‘¤&¥ â“5Ð@ÌJËŠbB­¢«O‰ŠAAl]¨VEBƒÖVA‰_5 ’k„iíFÛ˜‚BÀ4 !˜°»sçþú0;;ÓR­¹/Ë9÷žÿï?s""²8ý+àÏ÷çûÚ±ÿ37ª U~ôƒ_Pà û¿6ⳋÎ,i[ÒfÅÝØ™wÖ{ëE\}/ÏÉËbqÆu㺯,ƒº5ukBÚñ—½s3çævßÞ} ýRû%öÂØã±ÇSeSeàÆÎ¼³Þ©wô¼úrì_|Þ Þóý F¶‘-+7¯Ü\´Ï^ðGTWUW¼ ¼ h?¨q` t0Ã ÎøË;óéõN½£çè;<‡oûXZº´Tj"5‘œoí‚ø8¸âà ‡—º œà Àœ1gÔvµè^Ý €¸±3ï¬wê=Gßá9|Ûüso¿Úµ¡ÚPÆÐOhÕ§úÓÚií$•žÐÖV¶• z@÷ëþÌÚ²&­I0_š/Ì Kô6½ Ö)ë)æT—êtZ?Ãsøâ5Tü5äŒåŒÍdÁsõ\&Ÿ‚Õh52ËŒ2 ªW=P€vÚiw é„NèÐB -nžïh¥(g?û¬£ÖQfI8úi^†oûI»Ð{ï9œyîO2[0esu‹nÒM.¯µ¶µ¶µžT=©zRåæ‡Æ‡Æ‡Æáô‘ÓGNgÇŸvÜóßënÝölqšçðm?ic?W§¯NgÊø\ÊH?`ž4Oš'!:ˆ¸ Ïè3ú ©©©€‚º‚º‚:«° +(\[¸¶p-ÄëãõñzÁœÔÔ G_7¸|ÛÀÂî…Ýú:Œ­[çÙ‚3:¢#n˜\\\ ×J®•\+üCù‡òAOCOCO ç ç çÁ²¬eYË²àœœ“s«W ®„Á׃¯_{Îb‡jVÍ^†oûñ‹ªÕ|,¼¼#Θ}rFΈÈ}¹/÷E‚ÍÁæ`³H$‰Gâ"ËË——//I)#eˆ¤¢©h**’ $É€HW[W[W›ˆ ‘Né”NqG¡l’M^†oûñ‹Xw­»¾ßDÌ­æÖÌÂ¥¢dX†Eğά—õ²ÞÕMZI+i‰Œ Æ‘§ÅO‹Ÿ‹…‹ÂEa‘[õ·êoÕ‹Gƒ£ÁQ‘þX¬?æÖ³—J*=¼ ?íç­g uY]&A;W¸ä’K®ûâK+J+J+ c®c®cÎÍo)ØR°¥rùáÜ0ÔDk¢5Q˜ššòœ±çf“ÙôÎ3ö?_eÒ®ä%#Œ¸ÂÓ±éØt ’±d,sóæFs£¹ÆóÆóÆó@5ªFÕè9J¿0ÅÔ{•ÿÑÇÈô±Öf=Ò À,³Þ¬žÔ“ztH‡tÈ“/Ö…ºôï X­‹Ìòæ½úØ;:?ê‘zXÖ.k—Ûù1ðã.pžóÛéX?Ôºø†‡ž_©ozNCì‚]°ÉGå£òÑ¦Ïøs­¹Ö\«X4°7Ùv¥I9§œ˜‹À„ú@},›eð#Ô&ؘK‰Wâ¥É—ìKØ›~¯ß 3ך«ÌUŠ…×ç<œ ½†^CïÏÊLÕ¦jS5[àp80ÈãQßR«Ô*€‡ma[u¨ÃŒU²J`gØ ˆ4eê[Ê.eW0›sÀãŠÁ°©ÚTaª` 8Æ'ï‘÷È{:ò‰†â†â†b¶3À«Ø•F¥QWÁçoñ·èK¶»Ú]ðUËW-x‚ W WÀEËE _«±Õ>·Ï (v¶?[ öòúÚΆðsG§D§D§ v0w0w0W[¨ °€G-R‹B»Ú»€©sŽï8¾C?ïšëš I»’v€\.—ëâ=ÙR¶ Ñë ÖÌ}tîÑ9€óp>ú›Mu›ê6[èU{T·êàfsØ=€s»s;Ì+žW¬=õå©/õqÅ÷ŠïÀ"Ç"‡~üÁŠ+ 楘—¸¯'\OÔ} ¼œ‡ó@њוו×”š­\P.<©•é·Òo@î¢ÜEñJÄ+PŸTŸ¤Ky!åxyÎËs àjÁUØòÁ–àVë­V£‚‡”CÊ¡`ý¼åyËó–kçv«øòÇþŽþŽþêñ‰ãîq7IÒ¯…­ÂVý2ð[F÷¾¾÷u"¢YŸÏúœˆÈ~Õ~•ˆh¢|¢œˆhfáÌBýQ×ßODôiç DD8…SDD}}D4‘{;÷6}}oõ½ÕDâ‡rµ\M0’Ü.·Ëí¢ÎG¢E´ˆ–ÉïùU÷û}ggŸ­“@Ä7w¾¹ó"æð%{’=`é±ôè[ŸôQÒGðnλ9°$iIìß¾»n£O¢'è[úP/¿]òvI°Þõc×:¯uj;ù+!MHÒ&¿'i…´BZq°†?e‰?6å›òÕùÎ_ôÖ÷ÖÀcëc+-4 ÍB3׊·£ÝÑîhî§Z¦–÷€ƒÔùŒ`'ÈØ:VÃj´YOs_]_aÊ1å({´¬’ʤ2›YC³…,²)ÈšEY”%W‘ìd'’Ü’[rïÿP»ZO›NšN*Fg¹ó°óp° [7ùÉä'À¶±mÀÔ .:[Ê–¬`r`r>¾pÛß·-ܶP-Ón 1Ù-»GâöÆíÛK$šE³h.èŠ9æÌÀgt_º/Ý®,8°àÀ‚D«Áj°:ŽhÚÍ2g™³ôÚõÛü6øà€CÂPpcÕd5YMÖðQ¿²~eýJ¶N»Ë£ÁØ?x[Ší´ÐÖzÂÜC}S„!ÍfHs^Öi·ÒV©Ó®Q1*Æ ÿ¡ÿ¡ÿaP‹ÝèF7à˜Ñ=£{F7Û¬i2JŒ£^=&Å“a|ÓééR}˜v7?K»J»Ò®´•û8îqÜã8`éÈÒ‘¥#êO4-^’.I—~—Á¥^8à,z†x‚Òî1Ó1Ó1Åèlv6;›øàƒ#œÔvÅvÅv%xìȧåÓòéîÀ_’ «§Èg†_ðj@»ú!í®Ý¸vãÚAí:2Ž üajži …B¡0û`hq(¬®@ÿ¥=K»k¤©Fªq¥sàÂêÂêÂjöÛÔ‰Ô‰Ô å¶Öj·ä–ܶj¢&j¢À±#9ÃêM§ÿѵ{$Ô_ûµP"”%­§õ´Þ¿Xœ+Îç $Ð_?Nô&z½DR§Ô)u × Â:÷3£ö-‡r(Gþ,tº¼Xd" ´ mBÛ¿’¦Æ:Â:Ó–÷™­þÁ”û¤l%IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-94-red.png 644 233 144 4176 13755454064 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü3IDATXí—{LÔWÇÏï12(J%YAÙÕ > ÆøXZåÑAM‹K+$"vcUÔ±iCB7J¤lq•CÕØœÁØ¢%YQѪ$ݨY4Á©Á™gSâ òæ÷øîÌýÍo¦YÍf÷üçwÎ=çsïýÞ{hÂÞ ã×Ä8b1n,ô!nRÛ¤¶ImkW‰²(‹òã´”–ÒR`"¬ÖH"‰Ì"}µ†å³ñ¬«Ù_É£ç+§r*çí‘ñÄb›Ø&¶ÙŸq»¸]Ü. $>a(a(aßø`ダM7=ÞôÈÏÈÏÈÏû,ÎòÙxVÕgý^ÍCüêHn=?Âð#ž¥l…f—Ì.™]"ïiêjêjêR'?~:ü€üÅ(FxàÐüPœå³ñ¬«Ùoný«ùÈ4•÷ò^Þë¹À d\ϸžq]ú£+è º‚p!djªšª¦B’+åJ¹—ÉËäe€l•­²Uç‡â,ŸgõX} 8¢¿iª†ÆÙ9;g'ˆÄÍ?³–Ë–/$«ö‰zH=„a©y¼q¼P=Áî`7€q%II\Â%  €q¼À @õ¨PHÍš@  ~¢Ä*±fÉ–K…¥B²²þŒ‡ñ‘¡ÏÐgè[¿œ%˜ªLûMûÕd÷€Ûëöb0TgXþ2˜Ì›X ¸€p m*«ÕÕ€F4â·6¬¾§¾¸û€ü¥"(B8êp¸0hª2U™ªÔdÆ£ñ‰;Ä⎛X ¡¸¡¨¡Hý(TÀ/ÙƒuÁ:]Às³s3?|ü0\?}ý4¨§ÔS€Ôè •sÊ9ýøÎ_:§Óé${Ätü Å Å ÅêGÚÊFð‘êKX’°$a jž­}¶öÙZmå$˜ÙœíÛìÛ€‰sñõñõz«u«UßS"‰ô~çÎ;ºüáúÁúA@«uH‚Äú3ÆÇ@ÿº¡vCí†ÚðÌdV`_ðHð$žK<e¾2Ÿà꣫ôÀ?­þiµ>Þ{¥÷ Ì)žS¬Ïk:Út@¨–ì·Œ[ÂýããCGj!ÇcÈÑÎX •QUÑï›b#"œ18ƒˆ(¥3¥SS˜›ÍÍzßyÛy[ïç¿›ÿ.Ѽ[ónûýDDþ_ý¿‘1”ö-9Éîoh5´Zµ#¿ гÞ.o—·‹\þåÈË„mÊ=å¶ƒÆ ”//_NDôYÑgEDDyßä}CDôþÙ÷ÏêÁŒÆ"¢Ï;>ï "šúdê""{‡½ƒˆ((%"7¶Û‰¨7tSþÀ•såZA|ŸÇç!ã#ÞÊ[ykðIh‰kN–ŸÜ~r»NFÅ¡8`ì»±ïm>´²Ìþ*<˜|jò)¨-¨-€$’’s“sÀ겺H4‡æ€y¡y! Ÿ9–z,5ÜïêÁËc—Ç´ðÏ\—Æ¥Ÿ°BX!¬¨¨f§Ìü“jRå¹î?õÞé½£»\²ß¹ñÎ (--- ²Ð×Õ_WÀ´Äi‰p/õ^*TϨžÛ”m ”ä–äð‹Ýb7€ÜôËé—àÂú ëðC‰Sâ€%‹jÕ*Ú $ ‰Bâ±AŠË‰Ë‰Ë!¯‰×Äk-^íÂÏϪ̪”wk—Œí|Êùà?—Â¥èG¯.â)Ó•é:wx´o´ÀàD¾r¬þãúÃÓ-¹]ÔQÔ¡ø5À2¡L(»W0áÇú(Òf1¤Ò ižl€­rÏ–=[ÔlíÒ™~ßzß 81÷Ä\ÃÝG»êÕUê*ß’ßÛåv'É“¹øLâ™Dxä|ä„ÿôÈÙ¯Î~…\í ­æ«ùê—k¹™ÜLn梦(@áŸÚù*⊸¢·¹®…kaZQ¶;:íßÛ¿‡CÓîn%]IŒa @@}S}pwõÒ€P³Õ-ê–ðúz[¼ÞFÀl4O1O‘vh+¹OØ'ì³Y44+YÉ*šÂ¬™”I™â>²“ìD‚Oèú÷ü =­¦­¦­R¼ûSWŸ«O¯]Éñº0@è¯'šÐ¨j³ÚŒ€JT›o}0òÁˆ¼[{FE·èvìOÚ™´3i'oá-¼…;¢+f˜SB? „‡ÂCá!מ¼7yoò^"C‰¡ÄPâØ¯i7Ó’iÉÔkW±)6à€ÏñÏÃÜò|y¾vššJñîw‹»@0ÄHmí¶v[{øÚÅF±±'ô/Iì?¢ú†¾Óä×FðaH»çÿ“v³ò²ò²òÂÚu¤;Òéøv"®j;Ár…\áÛ‘møçQ}9ú/íuÚ]#T ÕBµg.¬*¬*¬Rÿ–:ž:ž:.ÝÕ¶Ú'øŸm65S35SèÚÜQýbè´híîô³z¹R®”+h­£uÊB~?‹ŸpÄGWn˜ýf¿ÙO$Ün 7¹K¡Q;÷³xí·Ê¡ñçÈð§Å¼Ê«¼ p¹‹ÜÅý~âû¹˜]¥úIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-38.7.png 644 233 144 2775 13755454070 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܲIDATHÇÍ–ïOTWÆ¿€0Ž"•È& qºÑ€ÛÓ)Ù[™¤¤wûÂHך°õEÙ&MuëFjÓÝlÉZhAJAÛj°»¸lˆ?‚²«nq ``q+X@a22:?î=Ÿ}1s½ÓúxÞÌ<ß_Ï3÷ÜóÌ‘¥‘OØôØôؤ0Žý­_è\è|þ«0®× ¦,¦làð\ÝsuÉÍÉÍú ‰¼QÝ/bÎæ3â²TÌ€¥ÍÒãˆàý°5gkΟ…ñ_.€µÝÚ>‚§vž8Ùr²…ßÁäåÉ˳ŽY˜ØÈõF¿1/z¾ìÿ ¿ÄŸŽ?ó_°$XD`Õ¦U›l»Ã·mà*r|÷}œŠmH$Q9/^Œ5…|¤Þè7æó >ƒ?¬G åå”—E t[é6ëçá†Á£ðÎÊwV|ÁvàC>$BÞ@{]{?¨ ê1Ä€‰¼QoôóŒùŸÁÖcn¥ODäãW |¸|ôï‚—Bw‚¶  ”=”Ê'Qªt>£Ï@èNh<4*SeªLžZªG=VQZ\`y`9Aí7ÁÃÁà „ç«_o^±y…!ðãWÌ­<+"bÿ¬^«×»@é׆/Õ¼ *KeáãL€ªPªh¦™æ(G8 € ¢â~üø$Õ¦lø"àUˆðEøÃÂìŸ÷DDê{o–¾Yj4ë/üû×]×]P“Uc¯±£†´¡ÀPÀ³ìfÙÍ2¨ÙW³¯f :0tàé'6–1–1–uërëráðý&K“õå¢/ô/tðÝÝyw§þ¼õÑ[~#¬G´k""ÿú=|ûÍ·ßÀÕ¢Û©·SUÅÒ?-É\’‰¿¤°ä¥’—À^b/±—@ÛÁ¶ƒmÁŽ;Pš_š_š«×­^·z 8:pÔv¾ñ|ãùFذeÖ [ øJñÙâ³O^ ÿáïN¶žlUpÚsÚ¡¿‡õˆþ‹Ås‹çT<ì|Ø gôKöüê=ë{Vè8ÐñAÇ·#oGÞhÈiÈiÈ[Ÿ­ÏÖµãµãµã°vpíàÚAèïîïîï6…»‚]Á.·¦µ®h]å_n®Ü\õh'&—O.ª“ ’ T›@ò’ä%úX8ý`úyì=œ«œ«„––ÂX|ýñõÇÁÝènt7Bª7Õ›êWƒ«ÁÕk®­¹¶æô×õ×õ×=½¥žžž1‘1‘1³zSzSL>ýÔÔ§SŸ‚¡G´”E·ÝRmx7ð.üõÌg?»…{6969ÌÁË7–o,‡ÜÎÜÎÜNpÞsÞsÞ3óÙ‡²e‚š½5{köÂýêûÕ÷«Í¼;ÑèN„¼uy9y9f\|š\<¹$I:£Úbc>Ê~”}ãªHÇåŽË"[ÏUì¯ØÏþ9ýõô×XvkYÿ²~‘ô‘ô‘ô‘öøöøöx‘xw¼;Þ-’œœœ ’Õ—Õ—Õ'âœuÎ:gEòýùþ|¿È|Ú|Ú|šÈ•ª+UWªDŠ^œVœ&Æ °ZD„7dUÏhϨˆ$x^ç««ï¥{ׂ] ÌSøó#Ç#LY~xüÃc”vL;¦3iÈr…\0å›òMù@]tµ[íV»afûÌö™í FÕ¨Ï󞕞•à;çö £@[è ó¡íÚ³kágõ½Âß~âcç¾¢>âcÛÔ6|ê—ªH>¦éc Ê¡¢¶ZÙ•]ÙA¨5õrÍ3Ël®Ôú´¾ù˜6¬X'­“Ñ>öäàÎûZÜkq@UÄ™ÿš Í Ú]í®éüÔSK-¨nÕ¥º€&šhæÂBÔ-u]]<‘úTí}í}‚Ti/j/>9³—Eøžrþg÷¿ò™½]<³÷±góû€§>ÉTKÂ’IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-0.4.png 644 233 144 2433 13755454065 14744 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÐIDATHÇÍ–]LTGÇg¡¸‹¬ „V046’"+1A}0Q\-±~„ða”DcMSãCÕ¦ÑD ]S£IIŒ j…hý"¥`,ühV_¬5ÆbY%‚ [„•õÞ¹óëÃîp/Rß™—›sæœÿÿ?sfÎB!¦&¾’f&ÍLJÛIߨ~Ï ÏŠÏ~ŠÛõ\e®²Gµq,ãÀ´ÓÓN[m[Ïëxg¾6¾“OûÅTa;Ü—Ý—]þ„€us×Íõ|·¼ ©-©-Ã&liÝÒ ðsãÏ| ½wzï¼ñ¿ñƒmëy¯ó5ž_ÞãR®¦\uuƒ{’{’SœS <ò?±ˆE ¾R•ªÒá¶Ê­ò¸,`„eXÂ(BOBXýo°uÏÖ=:Ûš§~1šŒ&{áOö=©~R Ç3gÏ„îÎîÎîNÇμR¯Ô+P§Ô)uÊö?kÖþ¬nTÜXscΧf¦™©+cͳùãzÂîï„óç@ÝP_'bý?ô×ô×@¡¯ÐWèƒ‚Ž‚Ž‚˜}kö­Ù· ÏßçïóÛB¬•ÖJk¥m/7—›ËMX\\tÄ2æsˆñPóÅùµé7ÓoªËÐ[Ø[²|lE‚=ÁÁ°°xañÂbÛ??6?6?'7žÜxrãøJÖÕÔÕÔÕ€8#Έ3PÞ\Þ\ÞìV,½Ò <Õž8¿Ö“$DrIr ùB¤´¥´ !†„BDGP¼ûã݃w„ð¶z[½­bt¤7¦7¦7 -ŠE‹l[n[n[®çî»wîžÕÙÕÙÕÙB¼ÞñzÇëvœë¬ë®ë®âŠæKðk=ï3vå× ®ù®ù ·$·$·ú*ú*ú*`A`A`AZ:[:[:AæË|™û{ö÷ìï4Oš'Í9¥9¥9¥öÝo¨jØÝ°ÛÆ—òÿwlÜãX¢æír½\OL§m:±éĦà]ì]ì] µUµUµUðòðËÃ/C^S^S^„ËÂeá2›øhýÑú£õPÔUÔUÔåX±Û¼d^"Æ‘ž±÷n¥™¸%†1#ö-RŸ¨ •‘P$ ªRUª T–ÊRYнÿzÿu°¦XS¬)6ÿˆ‘#¿ôÚ—DqÕ¼`^°»Àn¥£á‘ðÈ(À*¾“÷å}¢VDÍP3íá :¨›ÙÌfÇNR!ÖSJ)ðWb~Ÿ|*Ÿ:ú˜ ÇÂ1ø@Óù=k=oÏFäCùøÕšnMÇP¿«·ê-Š®pø—PaVaàOñhŒÐfšQ¤Éír;È.Ù¥+c„Fÿ4ã;ÿ„ýWNØ×Å„}MÌìÉŸYq}Ñ4IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.9.png 644 233 144 3064 13755454067 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜéIDATHÇÍ–ïOTwÆ82‚‚@1µd‘U(’"$#nµÄD$Mxc‰këêvkw7±Y*Â*»šV1mÈúB©)2 -%Ø ew“!ºêÔE‚)ˆP`d˜™ûýì‹™ÛKü ¼onžsÎ÷yNrîyîW@DDâÃoȔȔȸެ6â+ÞXñƯÿÂW‚QQvÿO°ºeu @Âõ„ëÚõ¼^¿ô¼ˆÁ¿TOK¼óMó͈¢0> 99+Ö„ðù;};úö|j¾¨ùàóO?ÿ”ßÁO}?õ<-zZÖóz½~^ç[Ê/gŸÓåË;#FÀeŽÔ×S_O?*x˜{K÷–ü¸ìÇe*‚À*V©"`–Yôgr Öóázý¼Î§óëzº~¨¤I;E`ÿ[ûߊn jƒÉ'’u=ÿmàçXÙÀ,@°2X‰Ôu€"ÀÀz^¯×Ïë|:¿®§ë‡ú1Féi,ÎNÐþ à·FýéþtPéׯáwªÔZõ’z ƒïßæÐšã™gšé_Òæq8ü)ÿËþ—AU†øáÀÌà©®¯²[DdãEˆžž5)ÍiwÚ¿ð&¨Mj^ÜŒ3ªL•©2à§8µ¤‘håR.å2Âê‰z¢ž§9Ç9µSíÄKq˜]X/¬Ï·¡~„1‘+ß(j÷×î×é´­÷ìØ  .ä_ÈG=h|Ðð Áêêê‡æ´æ´æ4plslsl3òZP jAß;~ïø½ãp©àRö¥lÔðÀþð¡¡§Fj7ÖnÔG{å þGDÄñ{èhïh‡—>\÷pªŠÿkì¦ØMøöýqßÛûÞ†Ì‰Ì‰Ì èÈîÈîȆ ‡7Þp,}–>K¤K9–r ì1ö{ŒÑÐÝCwÝ=ëkÖ׬¯ÿØq~ÇyøMuFTF>×›Ï^yöŠª‚ö‹íA™Cýˆ¶eåôÊiuæls6èÒzͽf8Uü~ôûÑ`Õ¬Ak,6‹ÍbƒúGõêÁéÔÓ©§S²F³F³F¡ÉÕäjZ2ÊfS³©Ù <6⹓[;¶vÀßï2üÉ0ÀbÏb‚1Ý1Ýê¦@BlB¬6ÈŠ‰©‰)cígÎL™>»‹wï.†Ì[™·2oÓçô9}0š5š5š›77nn„¢£EG‹ŽÂÜÈÜÈ܈ÑÀpÛpÛpäVæVæVBéÉÒ“¥'!*oyÚò4ø8áú™ëg˜„ 7è… ÄÆÅÆiƒ‘ÚšÅþÅþˆAYXýÑêDþöåeûe»$U*¾¯ø^ÄÖmë¶u‹Ä´Æ´Æ´Š´ ´ ´ ˆ,gŸ̾t>YŽöüx~¼ú‘zG½C$>?_6_æè N½›|7)9m'Ú:Û:EÜÝÝE´2­L+ñöx{¼="%#%#%#"f¹Yn–Ëšßßß. ‡DýæPðPPÄ.2‹LÉIô.Ì/Ì;ºD<ž)(ø àƒêW6nظÁœ&wñ§ÅŸì¶} Fƒ°¯a_þ¨Ð*´ &/O^ž¼lW¤®¥®¥®BfÈ ™¶Ýˆ#bãØ‘Ø‘Ø›ïÅ_U”W”ÃÔݰ7ìe Ÿx|̩¹Â9s:ËܯgëÙŽiyRøaá‡"ùú“ëŸ\—¢–Ñ–O[>¹xé⥋—Dh¢‰&‘áÁáÁáA»"ÉÊde²RÄr„!Û®mÒ6i›DNöœì9Ù#rÐuÐuÐeó©—U¡*Þ;|ø¾‰¬ÿfý7"ª25›šuL‹ YÿXo~o>hTëŽúš5Hºî7Ýo‚Î?矃h}´>ZoWb·ì–݃ãƒãƒãXH,$ ª¡ª¡ªFjGjGjagÝκuàºßr¿~Ã×åë"s¦õ ·¶·Tw:±º€+íÎv§Ý%OÿìùÙ 9‘'‘'¨ÔÍÔÍÔ͵?wìpìpì0è~ݯûl²É†¥Æ¥Æ¥FPÔuô­úV}+Dæ#Ó‘iTêöÓΧ¶3í¥í¥]ÉäÿÎ1v¦çŠºµ:ÇZU+ •«ÜÊ *ª¢*š‘Y‚‰ üˆG<ʘc_©+ê ¨sêsõ9€ò*/ •.B£Š…ÇÂcy±¼˜æäkkŽY Ÿ´&ïþuû׿KOf5`D(Ð•Š¤"k'?Ù8qÝtÓ ^×ìç?d ~¢~â/zžô<4þˆo 7Ÿ›ØJn%ÁæfÝô›yà óåö.}¨MÕ¦œ?!z0zPZN·œ>ö­ß°| Î=w`õÀêµ4Р“@&6B¹Yúͼá¾Ñ3ú¾¦SM§Dà• Wêò^ÿ 7ÜÏò=£ïû‰ˆ’…ä￉<Ÿy^ò•ˆ~«ßJYD>È©‘©‘’”¤$â´;íN»U‹-Å–bK"µñÚxmÜÖ„“pUÆ|žåzF?ð³ç_e™2e`…VìÁäòù(Ï•çÊs¡Ë’%ûŸ•ÿâ³±ë^úÇø?÷Øn~óÄÞ.Á(Q¢À0xª»f‡ö|óïÛÿÊ}ûv±oßÇöçìßÞ·h­xIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.0.png 644 233 144 3106 13755454067 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜûIDATHÇÍ–ÿOTWÆß(ßDÔb$׌‘Vg¤‹„ÐfM ¨¸®,¥ÅPhÉ.U“µ!þ`R» Û]V Sc•h7Ô:Ø–61¡»f!ÔftEtƒ¦É¸ * ™u:03÷|ö‡™ëÿï/“ç}Ïû.>N²6gm¶ì /pY |[ù6€‰˜‰e€Ð# ™dU xñ¢?žXïGÖëó:ŸÎ¯ëéúa?Ë‹–‰@ÅŽŠ‰gÂwÎÃûæ÷ͺ^àÐB Éô½¡šP s úT Åz__¯Ïë|:¿®§ë‡ýD·Ò'"rtTŽVŽ‚v 0¬ ¬•,ˆ8UªVU©*Þ AׯµqXðîîsÿRjs°.XG 8XXê÷a~¨ôVzǺ¾¾•ÿyõ8$z½ÞX¥Œà· ¬ÊŠ{<ä!¨Cê:*¤B*´ÀÈ1Žq È$“Ìu ,À ½®ÞRoáÃá_Ñ‹ès-ìGx "r²_±·bo…ΦýêÖø`ù`9´ýºí¶7P#­#|Õs­p­p­€£§ž>z®7^o¼ÞíkÍ¡9¢xìÈØ‘±#pbé ã #Ê}çç¶ŸÛ¢zjfïë{_×·öd¿„®‰ˆÜ8ß8¾q€s›+Ý•®êSþ²xÍâ5ÌUì«h¨hKµ¥ÚR Îßa8#R.å"¢®%ÝHº‘Wh4ÅeÆeb•D¡¿P¤ÔøæÜ›s2ݼ¡ywón‘Ž’ŽEæ[ç[ç[Eh§v‘[‚-Á&b›µÍÚfE.x/x/xE®ª«êªŠóçúsý¹"Éç“Ï'ŸÖ—\\2´dHÄïô¯ó¯“i‘¸²¸2ù_LqL1V£öòüó?†Åoj5µŠ´÷~2ðÉ€,¯ VýTõ“HïÞ½DBWBWBWD†ÍÃæa³HZIZIZ‰HÓÙ¦³MgELý¦~S¿ˆ+Û•íÊÁ‡ŸHÆÒŒ¥KE&÷OîŸÜ/âù§ÌS&â x‡½Ã"«}«¯>.ËE|·}·Eä®úX}l¯ÿÇ`²Ù¿É¿IÕç—¾öàµÌ-Û¿lϲ=Pé¬tV:Á{Ê{Ê{ v­Üµr×JHÊNÊNʆw»Æ ###`=g=g=÷Ì÷Ì÷Ì`o±·Ø[ 9%9.9šL=˜Ê\$Mê¡+§+Øö#ú)àûÆØÆØè)™ÿë/Å¿ÃTüCÿC?*Ôê õ-8ucÚ˜6žÃžÃžÃ ¥iiZ¨RUªJÁÓééôt‚V§Õiu .«oÕ·0ý¯éÁéA”6x%ðJTéÆÝ»-r*éy.ÇþÎuæYŽÕªZ|ʪ U!¨rU®ÊA­UkÕÚ¨Q•¡2T¨Y5«fä˜@›V *@™” Ÿús„ß>êu$N'N{cqé9¦'ÿœž¼Ûc¶Ç '³ºœ Ο†&C“Ñä§›/øTäÔI'À OxjX ©!ˆ¤¿âжX[L@ý;ø4ø¸¤'ÿöØí±ÀüóÉÿâ~+_ØÛÅ {{1o°ÿ´5µÛ>IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-8.1.png 644 233 144 2465 13755454066 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜêIDATHÇÍV_HTYþæº3£éj…B aÚ‹ÛRÓBÿ ÅB(š²$4ú³Õöm-mRô°õ°*ø ÉÐRAdY>¬VºE k1ŒÎ޹Pl4lî0ë˜÷ÞsÏ·3gîÝÿûèy¾ßŸïû˜sÎï€ù©_Úbm±–›ÄÚ§v<³*³jéÕ$n¤«ÚUúŠÌkÉk!É :­°U^Õ;û›ß©§â˜;à½á½áªHáFr÷òÝË3 ’øë~2ëVÖ­i“<Ô}¨›$»]~FFŸDŸäTÅTic•Wõª_ñ9ùÑø'}€tßsßs½$½¯ ‹7o.ý=|š,i+i+i#«Eµ¨d‰¯ÄWâ#GŸŽ>}jÑ›õf½™Ü3´ghÏ}PzZ{Z{Zí:ñ@ß§ïãlÊ祯üh@îÃ܇Ÿ¬Ê+Ë+ü®Ë©ö+uÆ:`¶q¶q¶¨Ô*µJ ð\÷\÷\f.Ì\˜¹€ô²Y‹¬EÀ¶cÛŽm;G‹£ÅQÀ*´ ­B»+´ÚNx“Àu9­Ÿò£þ ??ÜwÜwüx§úõ„þ^èóôyú< 7Ðè œæ4§ìÂ.ì²õ ›mZ45Â#ÿÒæ*sÕ? äÕäÕT^­¼Ê0Ð<Ð 0’:’ †¬ëu{Ý_ç_þ _ª ª øB‚C‚…€Ùi³Óææ{ ^Ì…µ™k3^My5E€ú˜Æ4™ L0¾ÞùɺÞk¯ûëñôø:žŽïá#`fÊÌ! +;+Û|Éãðüwؽ7ZÇsWG8Â4P&” 5GÍÁ ²Q6@²®×íu=ž_ÇÓñ=|ħ¹ýõ;¤-Ø (î&PûÔ>оrç»óqËV9.Ç‘:emPÐ@V†•a¹r«Üê»A´§H¥×•äJÂ-)J„ïÀM|بlTéÅ7R)„q§QÌ}æ¾ t†v†·ÈPݳݳ™¤’: @9.Çå8pƒ4ö) €‘2RFÕTPá§¿¥EiQL’牑‘€ËÜcî™0é|¼ÄÎÿ;ì<ŒhKäOîBw¡ÁÃn³¯±¯Gº#Ý‘nà´Ýi»ÓvÎ$œI8“]÷ºîuÝ3ôŽjGµ£N$X~b9t vv7.Ë=x>|//±G{È/ßR¾Ågþ½rÌïŒÇ¹¹uóýÍ÷„7¨ jƒ ½Ç{÷‡˜ù1ócæƒu¡u¡u!$–&–&–BÕ±ªcUÇ ² ² ²²feÍÊš––vK;t9;.t\À©ãI[YZYšNìÑ3Ìx oð[K‹qRWüÇñãpýÛëq×ã :>:>:Zû[û[ûáZöµìkÙ`m´6Z ¿äŠäŠä X§¬SÖ)prÎÉ9'ç@íŠÚµ+ ¡*¡2¡Ú‹««üjñíkËk è|„M›®=ƒw¯ß½þô´½,×Ni§ GkµÆZuŽ:GF·nÝ‹“'/N†ÌÂÌÂÌBZ´2h%Ø›íÍöfÃ?­$­$­â’â’â’àiøcùØ—PÞÉ)o†Þ Î'P­V« x&T%SÉB!„˜)–‹0&|Ë}Å}Å}ESŽ)Ç”#ÄHýHýH½ó^Î{9ï¥áááBÄ–Ä–Ä–q³âfÅÍ !lïmïmï…¨ß]¿»~·2Q.‘K„hþùaîÃ\_ø™rë¢ë¢>>¾£|¬| øÃ“s¾Qn)·ô€”) RÀmûmûm;hÝZ·Ö ©y©y©ym‰¶D[`ŸsŸsŸKKKaiÌÒ˜¥1^^^ 6±ñÃÆ0–0Ü>ÜnÔ¦²É²ÉOjì³®ty»¤Oy¦<3ºrìäØÑ±£àÚïÚïÚo¤ÈÙãìqöÀІ¡ C@VËjYíW«E®"W¼ bP»U§êD‚zN=<ùß®Œ; æóÀ„ :ÔÕ7´-Ú&ùȧ+‚"@¦Ëté7>d®Ì•¹ ce¬ŒÙ ïÊ»~ú`e‡²ƒI9ê›cË:—“æ.s׿˜ßäÇb 4ïdFmSÛ€u—º 7çi Á˜Cæ‡@¶ÈÙ<¤‰&¿ìá"‘òŽ¥Fáæ’º]Ý®+ÝM¨6“ͤßÔ'“ÿ‹ýW~±¯‹/ö=öe¾`ÿ‡Þ>¥ 8IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-30.4.png 644 233 144 3050 13755454067 15025 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÝIDATHÇÍ–íOTgÆï„y³:%¦j«Œl§é66€HGi«µµiÜ&‘NêKݺ «1ý°˜4îv—`!±«A—僕¦•í´6¨´µe·*SÄ ‰T:ƒ¼ÎÀœóüöÃÌñLÜÀûËä~»®kržsG@DDæÇ¬K­K­™±Üú¶YŸûÒÜ—rÿË›4°TX*¼‡ «>«à±SÒo™¹Ñ7æ÷ELüD>£.óÅ,ØÎÚÎZœñ¼¶<³å™¹Çò¿]†Ôs©ç~‰Âö Û/´7·7óøù«Ÿ¿wŽ;Á̾1oìx‰øRó¿$’ü‰el)¶xê…§^ÈÙÈÍ›6oø)é§$eí>NºrA‚1’ýø¼±oàøŸÁÓ#`_k_+åo”¿‘z2¶p런oɾ%ßì9à}Þ'¢Áh@{S{“¨Ëê2,`æFߘ7ö <ßà3øczÌGù{¸|.è½³ÝÑ{³¹³¹ –E ¢ÌÆ•*U¢ U!DïF£ƒ ªT•ªÂŒ“LS±yÐ+õJfÕ^íSíSÐ3bøà »ÂÀ˜Áo<Ê/DDV~©ÁÔ`pŽÒ}ݾnà0/ƒr(!îp{ Žª£ê(°ŠU¬JâÀÈ'Ÿ|þ?Š)¦Ô6í°v˜P¼ú2¿ø>ó}LØÊ¿ˆHÓÅŽòåŠþÛ›÷¾ßüýf¨]S»ºv5êvÓí†Û &Ïásøа aAÃììì3û* *ê„:¡N˜õ;ïܼsõåÏϓǎ³;ΘѾùï^èhëhƒo7 <1ð„rÏÿKF~F>‘ò­å®räìÊÙ•³ ®Õ]«»VÅ Å Å àˆ8"ŽäuåuåuÁ}ç}ç}§)DߨoÔ7šùúèú©õSð»¦5EkŠˆÄÿ†[oi9Þr¸ÓcµlO›H›x®PdݼuóD&?³œÜýù»?¾û£ØÜSî÷ŒÈò3ËÏ,?#Қݚݚ-’ìNv'»E¼6¯ÍkÉ*Ê*Ê*9¿øüâó‹åAX/Z/Z/ŠÔ¬=X{PäRË¥öKí"v{öêìÕb‹MYNJ{éd餈,Êü(ó£ç ­Ö)O¦<ÉÓ’. мh-”FdtÉþ·ö¿%R¿®¾¬¾Ld¦j¦j¦JD»¡ÝÐnˆ¤_O¿ž~ÝٜٜÙ,* •†JÍzÇŠŽ+DZzZzZzD,9°ôÀR‘á?××?µüÃöªíUi·F­Qžž£?>óÍÌ7–¾¤pÖYÈoŽz_i|EìÑ ýúE<ïyŽ{Ž‹äääˆr¹\‘qç¸sÜ)âoô7úE¦Ç¦Ç¦ÇD–¹–¹–¹Dt‡îÐ"½]½]½]"¹¹¹"ió&æ‰ÜõßÕîj"§2[µ,»;øš÷5¯ˆ¾6Œ-}¢lÆk+i+¡ýá²p™r¯zñYÿ³~" ÷.|gá;àêtuº:!Øì ö‚;ÅâN´Â´Â´B8T}¨úP5øëüuþ:È?:ÿ4ø*|¾ óŒk:V{¬J½%ûJö™gŒ­I­IÀ{1=qkºÂç;çìœc¾%3ýÕù«†“Ói”Ö¯õký ‡zDÑG`´{´{´TµªVÕ ìÊ®ì0âñŒx@ÏÐ3bž‹p4<EMm—qIx+ÿ½ÓºÓjnÓáã‡|ìRÌÇÔÉ>¶Um%¤VªçÕó ¶©mj¨<•§òìáˆ:¢Ž•TR™à_5ÔPª[}­¾~¯ïÑ÷âVÿϾ._W‚ >f8ÄpÞד^OþsfÕˆN'´!mÈt~:h£ ÔTê:é¤c”QP>åU^à‡ο[ßÍ,5ÚUí*b8œoæaçt¿•ìí⑽=š7ØÿEÊñl±†ÆIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-21.4.png 644 233 144 2654 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜaIDATHÇÍ–LÔeÇŸE<±hdCh—sXæÜ dSÔÙ†Ð9cþ(ÆDÍf­A9]náıcàs2©‰ÉvÃM <7•DË-T„Œ›bsr­$=Á»î¾ßçÕß{üRþÑ¿~þùîóãy¿?û>Ïçý<„B$F¾¢fEÍŠ²~Ô&3»"vÅkß¾CK‘¥¨ïK˜~`ú€M3šô[¦¯òª~âz!Lü‰|*.…˜âœâ´äEüJXûæÚ7c_2üš.ˆsŹÆÂPvªì@ë7­ßð1ü~ù÷Ë£y£y`ú*¯êÕz…7_Tþ‡_˜Ü>¹ÝòL‰™#¤å§åÛ¶·mPðnÁ»÷£ïGË(Ð|@ 2ðãGÙð_å#õj½ÂSøŠOñýHÊMÊ ‹ ‹ãŽ n5CEJEŠâ ¹€*ªH€°?ìÐÖkë ‚ì’]X°€é«¼ªWëžÂW|ŠßèÇÜÊ!„¨]öö _u‡o…’CÉ ÿººG(Ò©T-ëñúT}*ÈÙ#{0í1£ŒT½^¢—’åÚí èÓ |°ìàâW[Ù)„éõçóû'ÉO·§ø€U ³d㣙fÇåqy´mD\¸pMh(L˜0$HpB<›l²A~¨íÑö0‰®bÌsÖs¿ÑXz}ä9~›-›-Oÿ”þþþ~¨{µ.±.Ùcë±õØxÆ‹‹‹¡7³7³7ÓŒËY @•GåQ3~÷û»½w{‘ç׺WºWš|ÌÛìÜìþ0úúB!„è)‡¶#mG ï¬·Ú[-Kg¿âxÅA0w8÷^î=H½‘z#õtµtµtµ@™§ÌSæ1gºã`ÇÁŽƒfZ‰V¢•€tH‡t˜ñ¥á¥–>‚·KÞZò–ú§²T?qâЉCÀ%£¡]¯‹¯“NŽ¡mú™™gfBÅ'åå&à¼Ây…ó ¡&\® ƒû¼û¼û<¤¤§¤§¤C»»ÝÝî6냋ƒ‹ƒ‹M¿vWí®Ú] ¾M¢ Þû®è³¢Ï̼^t¿ê~pÛÚhm”NAxFÜŒ8ýù¹oo9öë]þër˜_?¿~~=äÙòly6[8¶pl¡ ˜µ)kSÖ&hÕ[õVýÙ­>=xzðô ,È_¿ vžÛynç9X23{Rö$“O>ðÝôݪ'ÖzK–„-Ò  ý57«`jrì`ì ì}}ïܽsÁ¿Û¿Û¿´EÚ"m‘Iœ1;cvÆlp9]N—ÓŒû6ú6ú6BÕõªëU×!>6>6>Ò ÓV§­6À±iÍÉÍÉ~ŸßÚOñÕñÕÒ)Â/ª3ÖñFÇÐ4­íNÛYuY!fÖdVfV‚uƒuƒu´\m¹ÚrÕl §5§5§:¯u^뼌@F æì˜³cÎð\ð\ð\0ë ûöÃ;}99æã…“Ñ'£O#gŒc `ë[¿€€Û˜’?ôº½nðF{S½©HïGÞRo)<z2ôdÈ$z˜ô0éa„ì!{ÈÄC 7 7 7€nÕ­ºÕ¬„#䣕£bTL˜ÊÎ-Q[¢@©„PºaêHDǔΠmÒöTwþß”Ž)ÛÇ>öì–Wäà}}»¾qnEð¿ò\ô\„§üþKÇÔ P»Œ=ör{9Èf€P·¼ª%h áÇáÇ„ØG;í¦òcA €fC€ylÜ•r@öÉ> ßØ+зéÛQ©]Ò.1>¬‰^ üý_å~ïÊçöuñܾǞÏì?ms¦ÑÍDLIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-73-red.png 644 233 144 4213 13755454064 15604 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü@IDATXí—aLTWÇÏ{oÐqQ¶”C@ÖQ”RWPG£¦AM…Tê†f7­M#·•ŠZµ’´ –([CX­¢2Ñ`‘6ݸFš Ш CƒØa†™÷Þ?ÌÜ÷ÞÌîj6»çË̹÷žs~ïÜÿ»w†ÈksÈÏøUÁ–`K°…û‡o@?£qFãŒÆui:Q'êÄŽ³”B)”x§åc¤#é˜øûò1¶žÅ³|,¿=~•?–¯ ©¯÷Ÿø®Qרk¬ÉqE\‘>>>ŽëÛm{´í°ýéö§ÛŸ999ªÏæÙzÏò±ü¬Þ«yˆÿ¿û5?ÁOðý)¬CQùQùQùâþê;ÕwªïÈ3í#öû80‰ILèG?úÅ÷ͳõ,žåcùýëÅ~ýj>2Ìæø~ ÿKÑ–Ñ–Ñæy«ÏÝçîs£>““ä$9 ±L,Ëq©¸T\ ˆ&Ñ$š4¾ož­gñ,˯ûÕ7ÌVиz®ž«'ÒÑÑ©ý™K¥“ö±´BZ»§ÖYç¬ä~O²'À´ Q I?I?Aµi©Ujä~÷/î_O­«ØU ÈËQrìl™ñ˜±ÜXî1±úŒ‡ñQГ 'AO6¦²†rÃQÃQ9ÎöÂÖaëÀ˜/]üR’†4vxÔþx‘0­uåP9p—ÿu½ø¥gžgžšÍö¢_߯ǘ¡ÜpÈpHŽc<ŒOàE^äźä{ò=ùž!óht…µÂJ=ò²c²c¸Í¢eª`ª€ôº?^ ¿NDÓŸu~FD³ºßè~ƒˆ¨;¹;™ˆ¨+¦+†ˆÈuÉu‰ˆ(ª5ª•ˆ¨ëa×C" ¶´$¢é¡ö¡v"~uÜé¸ÓD¢ h à_¿n ·’üçàóÁçéñÎ7:¹-^¾E/|‡ÃÃÃqì庑’‘åI=ˆv~àü€=6>6ð¾÷À ¼3»fviLJ€ë1×c´ãssßþÎè;£¢ývÅórÝȃ‘ãa| ôøÖ[Ol=¡8Ä>ñªxÀ0rÍpÍ€±¶±6mîãéÇÓ áÛ„oÀuÉu V]YuÞ»õÞ-íúïG¿Õ?Þûx/ öù;ãóâJNGNGN‡*!q­¸V\ë§¹9Bë÷õ7È ÀÅ/þ¨·n°n€žòžr¸zðêAØØ¾±R?MýÀÄdüd< B+ZÕú9Ër–å,SÎí+¬£¹i•i•i•èurNr€‹¸ˆ‹ñ{¬Çzv1SÌÔ‚ä•æ•@öDö„v\ÒKz­?9 ÆûÆûÀ%qI\ÆÓÆÓ:¦§9ÙÛ •17cnÆ\ô2>âM¼‰7¹‡ØUWSXSXS¨‘@ˆ{¶{¶¦®ëá‡?ÔjÏšmÍÖ‚9ßv¾ ç¿8ÿتmÕZ¼x©Æ‹Î:wJ­×zòæÝ›w•NþKæ’¹d÷ Ë…åÂòÒ vD/Œ^½PŒµí°í°íPØå5ìëá”Ã)äyæwž;Ï´ÙÙ ³Þœõ&ì§ý¤Ußý¸ûq6±½7ÿ·Õ€Â}åJÍãò¸¼µU\WÇÕ1­HYZ,å–rXíK¼Ä1À¥—!åD9Ðn@^#Ȫ”êž~õô+ :Ä`2˜<{•N~. Åf£‚f"™t•5“2)S÷9ÕS=Õ ÃÂ3áÙþkÊÕZeØdØä ³}Ò[Õ[¥Õ®¼R^©é {o˜Â‹´EÚÈ;ÝÝînõqvýmW®±X¹Û'u/t/,‡#÷Eî‹ÜGÄy#oä.øèv3ÌY¾ÏB¯Ð+ôrMq%q%q%DAùAùAù–Êv3™ÆL±X9ŒÌ’Y2à ,°Å(FUn1ALÔc§rEåŠÊòå. pú~-…øï4×°õĸíþ¾!Ä«]ÛU»æ2s™F»až0O˜ $=—žKÏU-ö =€%´'´'´GÞ¦hRÏëyý» â7|Áôê¡2@»Ûþv[,-ªv=-žO‹ú*MENENEKÆ—Œ/)Zl„†ÓéLj>éþŠ^cê–@Õî°0¬ÑîIÃIÃIO˜­ÎVg«à‚ .Œ3Rs“¹Éܤ;º*]•®ªÇ÷—$ô¯u}ã4óu€ÆÞõi÷êÒîêÍ«7¯Þ¬j×’nI·¤ã¼w^Vv‚Ëår¹Üµ¥þeøÑ€ºý—ö:í®*„ ¡¢)Î-Ï-Ï-—O%M'M'M{:•­†…asÕR-Õ’ïØlõ‚é´@íö÷WÿÛÃíáö´žÖÓzi1¿€_À/8∣[íÑŽhG´ƒH¸+Üîr7};vîÿfaÊ·,Ê¢,ÝÏþÓŸìæe^æe€kæš¹æg1ÞñxKÀÎôä}íVÿ$§\Ÿ®eÛIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-22.1.png 644 233 144 2724 13755454067 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷܉IDATHÇÍ–]l“eÇO ÛZWe*Î0&,!2Qè2Ý…µÅ( ÄȆ(cÅ]0¸ Ò%ÛtYċʈf’eƒ›èbÅU]HÃÐ±îƒ dÝÐι٭I?Þ÷ùyѾ¼‰w^ðܼ9_ÿÿyÎóžó<""²,ý°Z ­KS²u¯©·m±m)þ*%{5°¼nyý×àÁÏü ï˼/õ!S6ì†f¼ˆ‰ŸÉgèe™˜Šœöœv‹;-{àÒ7Jm§ä}`?k?»„ê®ê.€Î¶Î6Þ‡)ÿ”à/÷_n0eÃnøñ^&¾xþÅ/YÝYÝ–[““-E/½°zÊal5¼úÊ«¯L,šX¤¬ …å"D0Öt†lØÓþF¼gà|*‡žèyxíÍ×Þ´‘ : u+êV|‰³@=õ8 IF´*­Š(Ÿò`Á¦lØ #ÞÀ3ð >ƒ?•y”Šˆ|²¶ÏlŸõ(@¢/9”XžXú‰áÄ0‰t¦J­P¨G y#9˜= ôæŠ1Ï<¤#èz }IòéäÓ ~JáÃŽ¬Y@Øà7Žò[‘'>{ĉ,VŽôô»xÔFµ‘(ßãÃú¨>ªM4Ñ”‘H#4‚ «° gèÛi§4ŸæÓ|ÀE}T%š¶¾LrÄ7âƒ?•ØŸ¦+æ½¢.î³ì³húSÃ+¡åñ–e-ËPWƒWƒWƒ&_pqpqp1´ä·ä·äC`C`C`ƒiWÃjX ƒªSuªÎÔŸ¬>é9éA]/”JL>õVõXõ˜q´Þ+¢o €sŸŸû~ýn²a²A½]}Ìû˜—˜ë=××XsdÍ‘5G u[ë¶Öm°6wmîÚ\p¸ \PX[X[X þz½¿ÞL$¾2¾2¾*û+û+ûÍpñx·³ÛI,½·µ‰Óƒ§ÄD»–Û’Û¢Ú!‹Æàœ½'¿'ê><à<à4 *Æ+Æ+ÆaSù¦òMåÐ`m°6XM{É’;%wàxÙñ²ãe¦>Z-‹–Á™ò3ågÊ¡hª(T‚îs_üú é§Å'žœx`饥—T»Ì³çÙõê`¸2\i¶ýpUðÅà‹°¾y}óúfp¹Æ\c¬OÖ'ëa48 B©·Ô[ê÷~÷~÷~ˆ6G›£Í&¡Þ¡wèÜ]±»b7têw;îš|Zä÷¡ß‡ò–ä-Ñoˆ~ÆQã¨Qí0š ÁõÛÁp0 ,·ÛÆÁ£<ºG­MkÓÚ` u u ìq{܇c·ŽÝ:v æ{æ{æ{ ~*~*~ n®»¹îæ:H8ÎDFåÏ:Ÿq>½žOFŦ& & ÌŠYÕ 'N\ëùyËÏ[D®Ë¸ÜÏ;±³±âX±Ä»FººDŠíÅöb»ÈÑÃG=,b›µÍÚfE:ŽN‡È*V± ïyïyïy‘ª­U[«¶Š„ôÒåÞÊmËõæzE²‹î.º+ñô?÷Žå%_¶/[D$⎸¯õ §ºÞ=ôî!Ht¤ºäŸ&{'{!t%ô[è7ÔÔ¡©Ú©Z˜Û;·wn/LïœÞ9½B¡ÆP#Lê“ú¤ —./\†™]3»fvv[»­Ý6+3÷Á\Ã\*Þý&úÙ•üX³¹fsFWsãÞù;=ÇŒ9ƒZ­Vß›;ÿÃREª(cŽ1âñÿç3n€O6sb{Óö&P§}ªOËÑr@]Òlšy¸p¡Ô%Õ«zA]I]Aꂺ .5ìc¨95­¦_RÙ€¾GßC‚lí9í9àD väìÈbÿžü÷ï]yß¾.îÛ÷Øýù‚ý}\S·× ‰IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-15-red.png 644 233 144 4071 13755454063 15601 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜîIDATXí—mL”WÇÏó2‚]ºìÒy™YÓ²¾¬ŒYQŒÒhœÚJ+j*&PÁè*Ú±5±!›J!X1jŠÕŠ/iÈ8ƒ5![R­-BŠa·+Éjù uf*³up”AÀž—ÿ~˜¹Ï33AÍf÷|sÏ=çü¸÷îˆ"ö;Š3ÞœäJr%¹¸±èBÊ´ŽiÓ:Š—ˆ²(‹òõ´ÒB V›H$‘Dæñ¾ÚÄö³|VÕïÇ›ãybùj©–jyg||æ\±Cì;œn·ƒÛ¡¤¦¤¤à|é­Ò[¥·€µCk‡ÖeeeºÏâl?ËgõX}ÖïÙ<Ä/÷_þ”åGùQïBvBY•Y•Y•ò{Ç{÷ïU_>>> @€€q<Æc<à…^@ó£q¶Ÿå³z¬~|¿—?}6_ä}¼÷y/°W ®\•–º'Ý“îI¸55GÍQs Éur\È‹äEò"@¶É6ÙãGãl?ËgõX} 8®¿ñE srNÎI$6ˆ bCÛK°4Yš,M’M{_­Qk”Ú¤€T¯<&+&ÅÝ-£Gí–dIT¯d–Ì€ÔöÄñĨï+yJ‚l·¥É²Ç²G²±þŒ‡ñ‘á®á®áîÊ?³ Æzc½±^Íö {~ñü‚GÑ:Aù“È òmù6€ zL=†X êm´ìH4ÎäOÔ*µJz†=§=§ñÈXo0ÆÇ@÷­Þ¿zÿêýú_&»ÃÃøÙÒ…¦ M±ÙÏ·Ìo™§mnhn€¼_ó~]W[ÕVPº•n~å¤rÝÊÊzÆÃøøèHÍ5X VƒU›±$ª>> ¢l©(£(#ÒrÃrƒˆ(Ðè£)¬o o€ˆèæèÍQ"¢¥ß-ýŽˆh™}™ˆèüŒó3ˆ(™¯â«ˆè 5 ôþ†vC»¡]ù¹QPœóõúz}½äñ!>Ä“ l\‚‹@UTEUD4:­eZK,ˆ-da –LšÔÔMDôÊÖW¶mùaËDD™÷3ïQxuÎê"úi t ”ˆÿJ¼&^#°â~¯ßë÷’›ñoãm¼mò~ôˆ›NÕžª=U#d9CÎ9SÎŒ¦’¶’60ç›óc¯VZ#­€¡ÅC‹`¬c¬#6<öÒØKÀ-ã–òÙÐû]i¾Ô©_ûnær¹\.wò> ‹…ÅÂâ=lÊL³L³L³ä—=ë<ë<ëôçC-š<<;ÝêÊW~ …› 7Å‚†w‡w@FkF+ìš·k^Lx¼ïzßu¯3ulîØŒÐx4¼`ϼ9óæ(Ú@˜)Ìf{D)ÖkŠ•Hì»Ån‡O{ðË,e–2y'«¯ØÃ_‡¿F.Öð5ñ5–_Y~eªajý¦õ›Ø)çöqû<ŠøÊ±?îø*Û]ùw+Þ­PÆ5Àj¡Z¨¾±>âO÷'è*«ÅkÈ5äzO²{½Î^§i7÷ûÈyW×^] øíзCqSý¦úfŒºmºm€Ó{OïäŠËY—³ôó=3ê,q–DΗàùF¾ñI1—Áep:ž(üS›¯ÜFnã«G9çàL+Ê_\]®.W—~žòNy§~ÞB˜ÀD,¯R"z¾„K€Z¤nU·êRò9†öíLÉÆ Æ Ò6í$?ì‚ÝnÑÐld#›hÔY © ÅÈINr ~Á/øßûJû´5î3î“R=»==žžXíJÕRu, F1 €‰Î¥|¦|¨ë'Ý“n}7ü}CÁ†y§öz,‹Ã®½éÛÓ·§o'â-¼…·pg£t ó7ÑŸë…;Âá×™½+{Wö."C¥¡ÒPéÚ«i·ÐRh)ŒÕ®bWìÁ\â!êÜòyŽU»©Rª”ª)÷”{Ê=]‹ƒÄ àš>8}pú Zªi2…OáSÞùk‚[ø’è٠¡í–>O»R—Ô%uéÊHŸHŸHæÌ™?"ÏÖ´Ø.´ íó™Ô¢ÒKü-=Çô ¬ÀÓ´Ûll66K©‡Çáq!„F©½ÓÞiïÔŸñ¨xT<:ý—dúµ„¾Ñuzáy€‰ÆÞ‰j÷oOÓîŠU+V­X¥kוïÊwåã‹H\Õn‚+çʹòW÷Ä·á&ôåè¿´çi×,4 B£w.¯/¯/¯Wä„sÂ9aé_ÚUû¿à·gQµQEŸÁ“Ð/‰þGKÔîÞxÅOÜ&n·  *¡eŸÉgò™Gqt¹Ç4n7 ýB¿ÐÏ]Š&®O¸¹ÿ›¥j¿YÉJVq >¼»‚Wy•Wî"w‘»øï?DÖÿèJ¸wBÝç^õèðK] Çä5IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.7.png 644 233 144 2750 13755454066 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ÿOÔuÇ_wÇ5TtÚ‰6=Ýtm•¸[bF!kà*úÁA“â‡ÌVkæ–Zn•µ‚Í# ¿–ºeº5á2"Y ¡($´ é¤Ûu·îîóù¼ýp÷áså?àû—Ûëýz½žÏçÞïÏëyoÉNü Øsí¹öÌxlÎÚO/I/Yt(7ë`«°U l‡¬Æ¬F€­3ZA+6óf}r¿ˆ…ŸÌgîK¶Xޣޣ¶Õ‰øM¨\^¹<}v<~· œÎ޵'jO´Úþ)/ÀøwãßL­žZ VlæÍz³ßÄKÆ—7ÿÇ/wœ¼ã¤íp¤9ÒD`áÚ…k â?ÀëžXð{Êï)Êú ƒ µÄ\“I±™OÔ›ý&ž‰oò™üq=9ç<,åO•?åü8Þ0x¶Íß6ßä‹uoñ µ €þŒþ P]ª 6°b3oÖ›ý&ž‰oò™üq=ÖU""ï=‚¾AÛ M :gdÄòcù ¾×]º‹X"¡Œ)ÃoøAûMûUûÔRµT-å–¥:Õ?ꔞKL¯ŠybТq|õôúyëç™ß{ĺÊ1÷‡àuŽSùr8o8ô³”Òn¸ 7ái¢ˆ ©°“ìLR°ŸýìŠ)¦8i?B„Ȥ¨‚i¼R:7tÀtƒ©qaî'Öì㯺ںZPÛŒ{MÏFO§uaÝ…G/\}¸ZÄõ¸ë1×c"].š,šQ£q>»ÛxÕxUDbÆÆ¶ËvI ® ®íÿA"]§ºN‰ØVŠˆð¬©+ûƒì·³ß U†*C•"UõUõUõ"³»gwÏî™™13cf†È²že=ËzDJ¦J¦J¦DŠ"E‘¢ˆHÈr…\"Ý[»·vo)»§ÌUæšÖ%?Á·°s¤sDDÒ‚%Á’þ¬©ŒÕ½V÷ð›9•ºW÷BàýÀçÏQÑ÷£{¢{¬«ÑŠ´"­&Âá‰0bˆ! Tƒj€ÉÍ“›'7ƒQ#j‹óó!üMx(<„ã%ã%À›àÓë^¯{Ýô³fŸ˜¾N¿ÓL…¡¿‡þžæ/%l´­I>vSù•TºJWéIîäVnå5¬†ÕpÒÇbŠ©¤¸^ïÑ{þãcúàwŽßâc"¨„óª)S,çÇ¡ic@³ÖÖóÓÌG|êŒò*/ÐB -À_q!ê’êS}@ Q·þ†þ1¶ê+õ•IøšÉ÷ç¿}ÿ+oÛ×Åmû»=_°ÿ{ª9 %%IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-83-grey.png 644 233 144 6274 13755454064 16012 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü qIDATXÃ…—kPT×–Çÿ{ŸÓï¶y”„R»¡_\tÒŠ1ê”FÓ¹Q2¡¬_cLɱb ™˜”#–¨€U£!=\|†‹Ê-䂉Pb'ò†F”(”GÓÐÝÐ}úìù@·VY•ºëË®}Î:kýj­ÿÙµ6ÉÊÊÊÊÊ‚?¦Ì:µÐ7ùüþ«Ìú.뻬ïØÌœœœ•Ñ,€°€¯¶ !Bˆ²pÛdùdùd9;Šb£˜db.æb.€Nt¢À6lÃ6vT¶^¶^¶ždòOø'üs1!#ddQöŒìÙ3ªÛrSsSsSI¿ ´‚–¬žâoy¹üésÀ%X‚%Ô$æˆ9bŽxËewÙ]öàE999¦^W¿«ßÕ_Õà˜ï˜ï˜¿ð¿T'U'U'q}aòÂä…É$s±d±d±X¸(pQ àÛûÞûü}ßûâ=ïÍçËïãñññÞ &0 Ó0øÙJ¶’­Ú“œ–ÓrÚš³öïíßÛ¿ŸTTTåÉHîLîLî¤î˜–˜–˜²V–)Ë”eÂ8€P¶` ¶x¯âU8&C'C'C±¶¥®¥®¥Ž¹oν9÷æ\1cè­¡·†ÞJ9®Ô*µJíR¹g«g«g늓,¥±´ÐrpâàÄÁ u¨C]è4¾œ/çËëþærºœ.çœ5ºeºeºeÂãGÆŒñ&›¿Íߦc:¦C`z¦gzðèBº¨¡†À8Æ1 ˆˆ…Xˆ1ˆAðVUcÕ çÒéK§/>è©í©í©åë¥ ©BªxxCX/¬Ö'nB"‘øxŒ*ŠF@2S2S2ó¿ÿé¸á¸á¸1gΨ3êŒÂÚ´Ô´Ô´T¾Þ¦ÿLÿ™˜îið4xqƒ¸AÜþ9H9)'åé%½¤ Cdˆ (CÊ^ø{b=±žXÀ¯Ç¯Ç¯Ó}ñutt„µ¾ü>Æ…qa|õ"×®\?¤.2ƒŒ,ÜxÞxÞxž÷iÄ&®W‰« á¸0.  Å´˜ä9GÎøŸàµ¨E-à­8È(%£ý–~K¿¸f®™kX+`Ðøâ«ŒUÆ*Þ´!hCÐîãññQ6—Íesmt'¹“ÜI€Ál0ÌHö7ù›üMŠibš˜ =EOÑSÀàǃ~ ˜››–>KŸ¥M¢I4ˆG<âo‹ñ´çiÏÓÀh4–Ÿ-?[~ð!>ć303@ãÂÿ„ÿ H M†&C’}<>>^Â…ð¿ì¸p1à"ŽÆb ±Rl°A géYz¸ÿÊýW+9Wr®¶IÛ¤m€Cî;ä@l}l}l=¢Oѧèæ#ÍGš¥5¥5¥5€šª©šö5ö5ö5@LWLWL°ù§Í?mþ >“ÆJc¥±RRX3X3X3ˆ£vƒÝ`7üeöîÝ7*5-5-5-e>³ …ƒÂÁç{VÄñE>.ALÄC½vìµc¯CdŒ&F£ewÙ]v”&К8ÍN³Ó ´ÓvÚNõˆzD=4·5·5·ªbU±ªˆkkk‚ׯ ^D#ŒFàQë£ÖG­€¹À\`.TɪdU2?#~Fü €›ÍÍæf@@Û&Ú&Ú&@Ÿ4@¦“éd:€öÓ~Ú@ -´Ïóqö_í¿ÚÅ}ª£:ªcp(äPÈ¡×Àþ7ö¿±ÿ ñËÆ³gϾh[î–»åŒå~‘ûEîŒÕkŒ5Æ=²º¬.«‹±ÌK™—2/1VOêI=a¬#¿#¿#Ÿ±¡„¡„¡„þ6?›ŸÍ±ÏlŸÙ>³1Ö¨hT4*^ä³¼oyßò>cVX}`5Û™ýuö×Ù_»(Œ0˜]ÌgñY|ɬÖWë«õµÉÚdm‚’wòNÞ ›¤UÒ*iÆ:Æ:Æ:ž‹Ž.G—£ ¬¬¬¤AÒ iPº½t{évàÖØ­±[c/üÇ6ŽmÛpí\;×(÷(÷(÷`ÒûZy-àZÀµq é&ݤÄC<ÄsVJ ^/x½àu` v v ¶ä‘}§}§}ç„ê›ôMú&ÏÞmÛ:·ury­…­…­…˜,++ƒ шF4àfnæf@TzTzT:ÚÚÚ üÿ[üoñ@Ùé²Óe§‰Ib’˜ŸÇÏã,¬[X·°ìÝêw«ß­¹b¼b¼bõ êÔ/ Jåå傿Mî w…»"þ9øûÁßþàîàÎkù’É€dà–büúøõñësÒ–^~xùa¶|Íü5ó×Ì'?{†=ðGŠGŠG õ€z@=h/j/j/t;ÝN·¿¨àSùSùS9ÐÚÚ hkka)a)a)p4™›ÌMfüµDS¢)ÑàšR£Ô(5o1ŽqŒ[øWD"‘í;9Ã4Ã4Ã4®‘”R2º ( hZ-¹*¹*¹º%î¡ì¡ì¡Œ5«ƒÕÁjb›3kά9³6C3C3CI !ÐhÈ r‚œðñÐ7Þª»ª»ª»@È… !€ÀÓ§OÃf;b;b;µiØ4lê=Iž$O]Ë=æs÷ŸC2’‘ü÷|ÅQåC½cžgñT`þÉ'ù$ÿÇÝt]F—e”cv`=uí›kß\ûFØe]i]i] %I'é$6q¸GÜ`7vc7€ d À]ÜÅ]€U³jV ˆAbô\‹še7Ên”yöŽôôôñù2µL-S—æFäEäEä¯A6²‘Mþ ,°+|ó¨ ½èE¯Ð†t¤#”G_¾}5ïyš.|\ÈuÉ?—.ÿ¼íúdßdßdßçÇ»Vu­êZxu¾óÔèã{ú°ÏAé ð³W»W£¯D_‰¾’÷Ž|‡|‡|GiîHÈHÈHo½˜u1ëb–g¯wök l l ĹºÆºÆºFò²CÙ¡ìD¨u{nñ›ùÍüfç¿…/_¾˜{óý»wu¾ÌÅáO,))))) ‚wÛ¤Lʤä?û£ú£ú£ð¿žYžYžY ‚,\. ÷ÔÓOW<]xÅÚnm·¶³ÿ¹wþÞù{ç= ãîq÷¸›K—¼)ySòæ§¡¬ˆ±¢ÿ»dq=Æ0†ÅW}ðJx™‡à_ØŸh7•¨D¥'›•³rVžd¡—éezù§ð‰uë&Ö‰Q’BI¡¤¶si\—v³VYYyeR·¥ÛÒm!ÿƒÅ`1˜õÆ­ð:þŒƒâ_ØKÚõžì©s“7“T’JRÿ©g•¬’Uîߢ˜­˜­˜MÛ¹^®—ëí›-~%~%~µëŽM›:6S€÷Æ+û³V¿lÿÿ^dT €tIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-97.png 644 233 144 2425 13755454065 14703 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÊIDATHÇÍ–_HTiÆß׿¤&V9XJ²ÅÎÎEBF¬Ö…¬XPN"˲^DmADm*!”F9A¥‹ )•ÝŠ½Èm YÐD“jh ·1=¾ß^Ïœ³ îÅ^yn†çýÞ÷yžó}ï¼ç‘å ¿^Ÿ×çͳ°·Ñ‰gíÌÚYµp§ž'ôÇÏß‘ßPpµàªùÒÁöºï®qøÝzv\–‹ȼ™yÓS¹€OÁ¾û6f­´ð/ ûvöíÏ:„ï†ïܺvë?Àôðô0@¢2Q ¶×í|»ÞæsóË©é‹@z_zŸg2323D xGñŽ’­„?K &X˜L›LS^0ÞËX¦*f°Ÿ¸ Ûë ùv½ÍgóÛz¶¾åG`ŶÛD`wÝîºìn«àeZ‹Z‹l=í6p†3,}FŸ0êzæ@=RðàÛëv¾]oóÙü¶ž­où‘žíù*¨ÍªÍ€6„f<4˜'Í“hæ_ªH¡ôq}TQ=ªT\ÅUôy}NŸã{£Ö¨#Ï(7ÊQj»Õ£h`˜† Ö®jC)½”¾¸ }ÝÙÓÙÓ3_Á¨1jIªÁ2¿(ö‹ýb¿ûo¼@Öõ¬ëYוåÎ)ç”s NŒ¥±4–E­P+Ô @]¢.Q—ªUµªVƒˆóý<Ÿ×ãõuàþæu4Á.Ø;‘|L>&kºÃ,Õ–jKµbÕÁ±ƒì ¼J“Ò¨4ÌÍÀ`R} >¶”- éŸ³ÏL*ª¢Ì­d*™€Ò4Ñ<Ñ °CZ†–/ßm©¶”[Ê+ïÏy8™zM½¦Þ?.åÌ•æJs%›ët ºñ$PÇ«¾¯Q h^ö:{PƒM Ì퉞 ˆ4mêûlÛŒº]®F<1WšOšO²¹œGç“Ëä2¹¬ëœ*>U|ª˜íð)v¥Ai0tðk­Z«±e‡»Ã ?”ýPf\ïKíK€‹™3 Ehø/n¸¸.}sé@±´´éI¾SÅõ7ëo²údCøˆyâÅ-Š[„ê¡ü¡ü¡|Ãt’±kxÕ-ê–ÀÛ·éwêrêrŒqG´#Ú—ÏÉç ¾7ª;ª@òƒvû åž<pÎÇA¯«YW³.x„>Õ©zT{™½lp½ézRŠSŠ §=§=Æ}Ç£G@ÆÏ?×Ù‡ìCЮi×x´ Ú@uj¯i¯ûsÎ'®Ô|Sž)Ï”§ß±HÚŽv´ÑLa@0¾ …o¾ED4ïÖ¼[DDQ¢ùº}ÝÆ}7"nDu?ì~HD´üËå_­´­´]žyy&E‰ÛÄmDôbCÁþ¦S‹©E¿òó øKgg'9ýâ„gÂC’´KxCxƒ@Û{G÷”î)%"zé»—¾#"²aÿ‚ˆhj`j€ˆ(º6ºÖQQADôÊ»¯¼KD´ëÛ]ß%$Ñ亴uiDôÓ‚;DâgòMù&&H’Çíq{Üää|$ZE«h ÌŒUÿyï…f$õðîû••ÀŸêMõ€Õiu>Ùžl€sMçšàqÏãMM4¾ OãŸÆ€°RX ¨—Nœ8q"Øïïµí]í]úp§.¤ éS$-“–IËÊ«ø-Kþ­y½y½:ǵ¡·®·ÆKÆKàe¹ï ¿7 »]»]X‰µÄ òLy&¬*_Um¥m¥Ò•Òrä@}7n߸ ` ÿ[w¶î„ß/*_º UÓ?Ò,i–4ëìŠÉ‹É‹É#’¯É×äkÍýúƒ_hɰd¨ûy}ÍÆ>fÃo8Ö;ÖkœèÉC'/ÍÙ¤³IÆ[.Žx2íkg÷}¿ïûéo”ü£´¸´Xóé€Û¥íÒö»§ýh…ZR½)Ý”fJs_à ¶ [ƒ­é3QfL|2ñ  Æ«ñ¼Ÿ}:=9=!ÏSÀü?ÆÿGjñÕ¤«IÁù^µ¯¶¯žž/ V‰UbÕD¾0[˜-Ìþ}C ôOý~m¶[^=#4 ÍB3׊¶ÛÑáèptç©îW÷ç ÀqŒ_!ͯùíhX.{›½­G½ýÍ}5}5@r”y³y³R¦Oòˆd“l6‹Žf%+Yes5›²)[>Bv²“HòHÉsà3ýÓzÆ\o®Wb]︻²Ü©¯§¾¶‰môÃôa£Úií4À6N9§œðóÄÍ·6gmÎR÷ë_ 1yPtMØ“°'a‘h-¢E¸ +昿 üÜ(Ý—îK÷…¶¹çœ{ÈTb*1•8ŽêÚͶd[²ÚÕlš ~8à€À0†1¬šª¦ª©A-ÖeÔeÔe°\^ÏkŠ5ÅöOLûæ¨Ð“®„= aîW¡¾9Ê”nJ7¥».´[a«0h7V‰Ubƒ@Ú#í‘ö(¨Åô pD÷D÷D÷°]“1bŒ³ép˜ëÃø"éÙ R]˜v ž§]¥CéP:‚ÊOOOŽ,Y8¢þN×b‹Ô"µüi—Z@zá€/Ñs,¸ø%íÖšk͵J¬«ÙÕìjà‡~ŒpR[›­ÍÖ|vä3òùLOà_’è›a}ëôÂóÃ'l h÷¯¿¤Ýœµ9ksÖµëXáXáX¦ãL? ¡H(Š^-m#‡õè¿´çi7Sª’ª¤*÷\TYTYTÉN¤M¦M¦M*ÿÒÚ#y$-‰š¨‰š(ðìH®°~‘ô?Z¸v†ú9? […­ÂV€VÓjZ­-ÅD1H ®~•ìKö%ûˆ¤.©KêÚ‰ÃNîÿf±úoy”GyòÐð;Å"™ÈáŠpE¸òïßL¯Ïs„Œ3¬îsú?‡BIÿ#š%IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-186.png 644 233 144 2717 13755454065 14766 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü„IDATHÇÍ–ík“çÇIc“ díQqt¶B=Ö²cᜎQúBÖ4®…ÅJ‹M)í‹M°ÒW®¯6…†Â´¬NÖ1Ù“SÁqZ沘âFÚÌ "u[ÛÐÚ­,BëªmY$¹®Ï^$Wî¸ýÞon~ßï}ýîK@DDJrow¹»ÜÈÊÞ×ìkÞ~!+[àjsµýø:<ñÎï”~Xú¡=ãÈÚ®ý ãEœü…xZ/%â(¼Ÿy?ssòÐQÓQãÛœ•ߊÔ?ú‡ ‡>?ô9ÀÈÇ#Ó w¿½û-Àýàý 8²¶k¯óæ—7þ‚/ë¾\÷¥k¼ÅÞbØöü¶ç+û²w*a_x_à×¢_‹”¬%`TXc ýÜ+µ=ç¯ãu>_ãiü,M ›D µ³µÓÿA6`æSxuë«[5ž1 ¼É›lsÍ\°^´^$ *¦b¸p#k»ö×ñ:ŸÎ¯ñ4~–zø(pÀþ·0ú~‡ÇÙö³-g[àvøvøvØÁ™\š\š\‚SÇN;u ;;;û’;%wJàäÙ“gNž›ÿ½9psÀ9q•Îâñàpßá>]Úáñ±[Gè»Ø}±;ïþ’y"ýtúiÒ]7º¾îúÚ)ø¸wÜ;î…ùÐ|h>Ð:Ó:Ó:;FvŒìñèxt< ¡X(ŠÁÞÓ{Oï= µÝµûk÷Ã÷OÞúêÖW¤5ž>¿x~Q»uÄ#ø&ðÍêdçs¾ç|¹úŠëuŽïøN¤å“–º–:‘‰þ‰þ‰~µ¬–Õ²ˆyÙ¼l^I¯¦WÓ«"AWÐt‰,†Ëa‘Ñøh|4.²Ð³Ð³Ð#Ò4Ö4Ö4&Rs¨æåš—E¶Þ¨¨­¨¯Æs¹ƒ{‚{D4·HѾ¢}üKz‹Ë‹ËEäÿ""òûº×‹?*þH¤s¦3Ñ™)k,k,k1¼†×ðŠ]F—Ñ%’)ÊeŠD®]º:$‚‰‰)b¬€ñ5ú}"»R»R»R"—ìK\BäúO×Ý×Ýú äwj=¿y~Ñ|Ü"öö®i±Ì°—ˆˆl’g¥TJó’±3vÆñÖyë¼u"SÕSÕSÕ"•m•m•m"Ñ-Ñ-Ñ-"ž^O¯§WdúÊô•é+"›n>¸ù HïDïDï„HàÇÀD~2NüœÈ§ßÄ?3G2GDò|ò=ÆÅ•‹+Àÿ²5çfԌꀆPC¨!cÇŽ=t𻩢©¢©J“¥ÉÒ$´noÝÞºÔ?¨P=ñžxOÖ7¯o^ß ‘ÙÈddVÝËç—Ï;=Ɔ öÛ鱿Oe&7%IsÚœv¦repåøÊqÈ f3ƒ1s·¹ÛÜ K—6.m+bE¬ˆc·gíY{î½ï̽3`·ÎYçP`µŽÓ9<ÿèTVÿ®ÿîšf­Y+Ÿ÷°»ínR¤xäÉ(Ÿò)_¾Eµ¨Põª^ÕƒªQUªªÀ^n¾f¾FJý‘ßcÏÌ=¤üóþù¿í±‚ÍO»·Ý ØùÍ?iM^ëë †‰söü˻ ®©kê0ÄÛ¼]ð#$H Tܪ²ª0xÏ:`(ØüV»§Ý£Oê‘ÍÿØþ+ÛÛÅc{{âøW·¬nùËç»Ï׫®WêŠO*>X;°v@Ýql;nçç׋8øù|¶_*Åqx†=}¼tà¥ÕÏeìÓQ()Y6!8¸¹á]x8ùpàqÓã&pl;nçÛõ6^>¾œø~(¼RxÅõ+xФ Ì”™°:¬ž‚Žê(.\àØvÜηëm<ßæ³ù3ý8G©DDÎìÁzÍ|ÍÌ5t]­1jŒÐV•U…‘ hý†n×í`Θߛ߃º¯î«û8ëO~çwÈVhP ªC­1·˜[@—Á‡öÂöB`)ËŸ;Ê‘>†âùâùÔ*.ÇŸ?Ö~.©Õ‹¬äË)¡ô=}OßËkä,g9 ld#óüà 3 VÔŠZQà+Wñžs.:(N§R«2½ðqvÇúbü †‚ {ÔË6n8î w¡g~™¹5sËá‹ÆGã£p&|&|& 7C7C7CN\'tB'@ÓÇô1džO„O ¨Ÿ®®µ½êe}(x7x×>Ú¾˜°MDdº _|ÌýVàúëï¼þOí¹Vu­êZ Æ‚±õ‹õ‹õ‹Ðv²ídÛIØzhë¡­‡`¶w¶w¶×i$Ý™îLwB`*0˜r4à«\ÙveO³Ÿñ–õà­ ·ìƦ»Ür Ü_îßR/²;¸;(¢¿:©sßl;ÕvJ<ÞÝÞ]Þ]"%]%]%]"W\=rõˆÈ|Ý|Ý|ˆ×ãõx="-–@K@Ä[â-ñ–Hné^Ý«{EöÝwtßQ‘ê‡Õ Õ "ÊGMâÉd¹ÎËúƃEDÊ'Ê'¶Ô ¬]³vºÍx"œƒþwnìØ>¸}pû LÌNÌNÌ¥إإø6ø6ø6À¹à¹à¹ Ô Õ Õ Áe÷e÷e·³cæ¤9iN:vÃá†Ã ‡á¢úrñËEGf¬Ô£;î€Ý[,5¢F\·Åmì7ö‹È_EDdýÅæÌasX?~ü"•c•c•c"¥¥¥"ýýý"±ŠXEL$ÞoŽ7‹$ÓÉt2-bN›Óæ´³ƒÆ]#nÄEäé—þœ{,›Íf³ˆˆSc®ÛnY•Ú›Ú;3%O£ãÑq×vÞΤ+NU|PñÈòñåãËÇEO7žn<-²ÙµÙµÙ%R¶©lSÙ&‘ÚîÚîÚn‘ÖŽÖŽÖ‘‘‘‘%cÉX2œÆJ#¥}¥}"…e‹‹’ÎþçÞvý-Z-I5¥šf¦œ©4Bï‡ÞîÛSi}m} ɳɡä:=˜þ4ý©s$ꆺ¡n@¢'Ñ“èµ^­WëAûµ_û!IDP;ԵéK¾—ü(ù:}}e|eÜ™J¾ í íÉŸJr:ö¨øQjÌý1÷GÇOZ}¦>ËӱÀJ©”r®"´Oû´ôŠ^ÑN6‚a=¬3ü›Iš&ÓÄtf¥Š *@öÈÙ3×UTQõüýbÂ&œáÛìêYý´ŸYcÑÛ°ïØ¾c™âr$5™št7@~GW'6ˆ À`x0<žë/v!v!vCƒ¡Áø„jª©—©—½Œ~ÚϬ±¡8?y>cD>cZGu”$?% •¨D]þºx]¼.@ Ì5V7T7T7ÓÓÓîºùÖ´™6à7Ý¢[Hfô2úi? nÜ‹0V1VáaþGú¤ô”Nh·ëèŒtF:# N©Sêl?³ýÌö3.~²ÿdÿÉ~Píª]µÃ®ž]=»z<Æ‚f£ÙÄ䜜ó¾ŠÕOûQP¸¬p™ù&F'F3Yf­.ÐnYß³¾g}Ï Ïçý}!„˜ú¹ rAd\G¾fÄÍ/˜_xò³ >.!⥈—zÞ…•3*fÕ̪Ñz ¬¯ëùáõBýÃùô¸˜)Œ€©ÁÔ‘Âe°eÅ–æ9A|¨,M–¦±^(¼p®ö\-o€ë+×W¦ÿ™Ö×õ|½^ïÞ_”ýƒ_˜Ú2µ%â70M3MžØðÄë[Á„ÛVÈÌÈ̸u7JE€bˆQéÀ(£èÏpÖ×Cùz½ÞOï¯óéüA=âÓâÓ„€¬Ü¬\ËÉ`Aï§ðöü·çë|þ&à}Þ'£Qùª|• Píª€"ÀÀúºž¯×ëýôþ:ŸÎÔcl¥W!¯‡GŽ´þÎÀMÿÿPoÊeøÕ‹YŒ øc1y2W悌“q2ÔJ•¬’'ß ê¢VÃ(å›ë›‹_æù«ýÕðû«W²²t‡×M!–U€eÔ2::EiŽNG'°€M Vª•x¹Èe.…RhãÇÿñ(«²â Mâ ñ…-«ÜBˆãŠ×³^ÏÒ‹µg~ú½;³;]?tõÐUTÿ‡ýGú€3Ú팆 W…«ÂÕ#Õ#Õ#Poª7Õ› ÇÚcí±2úûû¡2µ2¹2ªGN˜N˜PõÓOi§4èñ: …Ú3ðfù›å ýÔ#ä·Bñý.ø¼ñóFø&ãö¼ÛóTÁ̱OÅ>ÅDæÏ™ße~‰ñ‰ñ‰ñPs°æ`ÍAXÛ¶¶mmd˜3Ìfc¶«¬UÖª0a×m×m×mbK±¥Ø`ó×›¯m¾6™?Q}ã\ݹ:U-žZƒz„–íŽv«xpéÁ%¸¢}iúҥϕXJ,Ð:Þú°õ!$5%5%5Awswsw³A\£Õh5äœÏ9Ÿs>lÃRUªJyT•GxÝãu u SŸ]”]¶Ã®¹®¹À¾¸uqëTƒ€Y±³bµŸ1ý1ô‡1öž÷ÜEî"ؘ²1ec ,-[Z¶´ zm½¶^øJ}¥¾RXØ¿°a?Øí‰öDƒGÉ!9d`ÏYÏYÏYX4°h`ÑØ;â;â >íÂýîº!ã§ßœ~S5€¯ØW G¯|lÿØÏ—nHßn4¶vY»¬]ÐØ×Ø×ØgòÏäŸÉ‡UÅ«ŠWyþåþåþåpË~Ë~ËnÄÅ‹9«Ÿ^½bõ #®Ý ý¹åŠvE¾¸+qWTƒP&ýŒ5®i\_¯ ’ŸOº—t‰Ù¿ÎþqöÕ’Õ’Õb4Ì%—\`Éþ’ý%FÜYë¬uÖÂ’¼%yKò`,m,m, ¶íݶwÛ^(Ï.±üÅÉô ©Tã§Oê¶ñý®ïàêö)Û§SéûàaúÃt¸?uÐ;èEÉ*Y%« î­î­î­àm÷¶{ÛÃÞÀnm·¶† >ꎺ£î€çIÏ|Ï|ð¶y^ ´Úà‹ r{éöR]ØñAó?|¬-è+ê䤨¼jšzL=Ê­ÜÊvhóÉ'ÿ?k‚‰0T$»d×ß|L:$€Åeq…ûØäàêÎûrÔËQÀN§ºpÜÀ'Ò)øõ¡#3f`';ØFü+ ~Q7Ô ÀÊŸ'÷È=øÙ)Ÿ•ÏNžÈN!¾9ÿ£û­|doì}ìѼÁþtRu”ýHn¯IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.2.png 644 233 144 2775 13755454067 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܲIDATHÇÍ–ïOTWǸ- ±‹ L Ó7­PS]HyA"$-$h»Sje¢6Ó–Ñhwck¬›º,ib…hʉÛ@š®Ûi ¥¥ Ó@«¬± £Æ…qå§ítGaîÜç³/î\/Ûþž7“ïóãû}îœsžç(PJ)•ÿUèHt$Ú œø†eO®H®xòAÂK /ýô7XúáÒ–}´ì#ý²…M¿¿8_)‹±žiWéÊ2$u$u$”Åq¼òÌ+Ï$ÿÑÀ °uÛºÿ«Á›Ÿ½ù@W[W»àöàíA€¹²¹2°°é7ãÍ|“o1¿ªû¾RðÈ—|™0I&=ª<ñÂ/8ß2®;áÅ /n_2¾D 6¤‘&e@˜0æš^„M<ÞÌ7ùL~SÏÔ7êQðXéc¥JÁ¦W7½jû—‘pùcðåørL½h7ðï‘ZX ÄÜ17ó  @XØô›ñf¾Égò›z¦¾Qµ•3J)Õø<¸f]³ +¢ÚåèŠè Ðû££ÑQ¢ñJE¶KµTƒvAÖ†A¿¥ßÒoa­YîpçÉÓžÓž#ú€/`ðƒëªë*1õÍ­üJ)¥ž: ¶°-þƒÌ\¸:l ¤HŠˆð ýôƒ(Q¢Œ2¿€&šh²É&Û2˸ŒË8°)—r"¼oðËݸ^\Ÿ€QOü;úôÔ$Ô$˜tú³Áœ‘‘‘hÎmNoNG†F‡F‡F-ÁëU׫®WAcScSc y‡¼C^˯·ëíz»…ƒYÁ•Á•МÛìhv Ã…çÚϵ[z²PSYS üǨGéRJ©áZ8Ýzº~ê  #’u4ë(ó¥ÛK«J« o6o6oü^¿×ï…òâòâòbØèØèØè€u[×m]·.ȹ VA—2.e\ʇæÐ”Õ—½Sö8vf¥d¥0?XweÓ•MâÏë?¯‡Øy£û1µ9µY: 2™‡Ó¶3ËÏ,ß_j k -’S%§JNAqEqEqä÷å÷å÷AÍÅš‹5aÏþžý=0)“2¹¨°îÜîÜî\ððð°ì«GŸ>þôq8²¥õõÖ×ö.ì-–Ò—Ò' m™m™M•½SÕSÕÖµº¯”_)‡Õ×V_[} \ë]ë]ë¡¥¿¥¿¥œ~§ß釖Ý-»[vƒó¤ó¤ó$øñãç÷+躃nXsxÍá5‡¡ì­ÒÍ¥›!ò÷è\tŽi˜{yîepºJWú¨ÒO¤yÓ¼Òw'îNÀ¥CÁ#Á#²"ùFò ¨[Zg¯³[cccÈä,ûÚ]kw­Ý «V5¬‚hv4;š ç÷œßs~¤¤¤@}¤þ×ú_!<øKã/ oŽܺy;¸io··K‡Ò–›g¬'¿'Žÿ»Û×íOâ RJ1_”S”Q”ö}ö}ö}й¥sKçØyvçÙg!i8i8iÜcî1÷ŒÌŒÌŒÌ@I¨$T‚ƒ €­×Ökë…•…öB;Ø?M­L­dþĹÞÖÞVñÀÏhñ3Fƒq `ÇÛ;Þ†ûšqK&}úBKB‡GBmm€û¾û¾û>àÇ8ÓyÓyÓy gê™z&ˆMlbƒ™®™®™.ˆÔFj#µ0åzmê5˜¸9›ˆ!¡¿ÞôÜôÀ½†ìXرTÇo¥Ñ.¬>f_‰÷±É‘",ÛØÆ6ÐÃzX·Fâ‡8@"‘È¢Ãu{Ü[|ÚÄ)Î|•–ž©ÿ}ÌœÏóW­«äc£3˹XZ, ä„ö³ö3QþÉß ò­ôIÐFmÀ“L‚ÌʹTQO="_h1-FT~ˆ¥ÄR,~>p½ëz×M‹;ÿÃ;+Ú×ÅCû{8_°ÿFðNZ["çIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-10.1.png 644 233 144 2733 13755454066 15026 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mH\WÆÿ3ã8§ZÔ@b±NqiS“Ô—Ô¬·Vƒ‹%’RiÅR m¬-iYÒTJ (””n¿´ ¸©lDµnÖˆ%ÛdZm•6‘mj6N iV7if&î0¾0s_ίfîÜaa¿ç|¹üßžç™{îy戈ȃ™§€óaçÃ΢tì ù5?¨K†Ïð¡e Jý^ÕªZÐoé¿è¿€:®Ž«ãØkƒ5Ö€4–³Þ¬G3Ыô*Pߥñ¡ÝÝî"þìV®Šˆ<ö1ü\ðs"óáG€q€VΙ»ÍÝlf ‡?°ƒìÈRI%•@TääÇgŒ2B@Ð ›á,^+úrh9P(H$òÒÂû8óÆú¿æ¿Ý]Ý] N˜OZ¸]'N ÿ³xkñ–Íw}îúÜõ98³ýÌö3ÛáæÒÍ¥›Kv]]QWÔP}ªOõÙù®Þ^Ô?ë.ï¾¼ÛÊšOª—»ntݰ¶¶ÿk¡VDäò }fôÐO¨W;g_|ýÅ×IZGäBù…ò å 5iMZì‹î‹î‹ÂÞàÞàÞ T\ª¸Tq îNݺ;e Ñêµz­:::l~2];]K2ó3^5V†~úÉvù„ðaQkQ«ƒ;#wF õ({Ø#LJãPú‡Ò†Ò˜/œ/œ/„‰¦‰¦‰&¨©®©®©¶Ô&k“µI8ë<ë<ë´ó›Í›Í›Í0R7R7Re·ËVËVaúoç{Î÷Ø}Fj¥r¥ èbÑE5æ”×7®oxB‚yy"î^ùQ~”XǵÎâÎb‘oì|sç›"Z•V¥U‰h5ZV#âõŽzG%»Š‹‹E’=Éždw»ÇÝã"óóó"»»ÞÛõžHª-õNêl[LRî1÷˜ˆˆ«ÍÕÆN1ÌIsÒ±$NíˆvDDö‹ˆˆÏšÐ×ô{ú=­Z«ÖªEü}þ>ŸÈêáÕë‡E¢íÑöh»Èzd=²)÷–{˽"Ñx4‹˜3`l¡Ú -¬…Eäò™|–MûdCoÒ›DDÌ)sʱ䔼ġġÅI†fB3"ާDDx-3*>\Ü\Ü,²U²U²U"Rç©óÔyDœ:pêÀ)ÄñGDZ¶Z¶Z¶DöÜpÿA‘†á†á†a‘ÈLd&2c +,ì/ìq{]w\w$•ùæ^sü1”ÊI4&ìS©uºÀ¿­Si|i| ñãÃñaTê«T0´¿ 3l†Í0Äfc³±YPPP>åS>ˆNG§£Ói÷2ëí¹ø[ñâ R³›3›3ö©äÛîæîæÜSIÖÇ~-ø5‘ËëËëYœV4sÈÊñ±?qŒc`ÆÌ˜˱‡Óê´: å(Gs|LCËÚrº³L•åøËsËsÿ×ÇDPçUí®v—íüxôU}ø‹±elÙÎÏß™`Ôê{õ=$H¸GŒ¨ëꪺ ü+ëü¯˜¯ ‘o4 ÀÙ¬ó{Ú=6¦\ç¿ÿ+ïÛÛÅ}{»?o°¿lÎh—‡ÄyIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-32-grey.png 644 233 144 6347 13755454063 16004 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü œIDATXÃ…—kP×¶Çÿ»»‡™á9€ +Ê0‚¢^Ĉ‰ƒ¥$âc0* 1%^ô๡ôÆ8BUDÅĈ¯ äxIÐ œ ¢  ^… 8 R‘§J| ˆ0" ÌLÏÞ÷3œªT¥²¾ìÚݽ×úõZÿÞ½6IKKKKKƒcf¸Âáð€U¤ý˜öcÚÌ;£'£'£çoA̹3÷}ÿ)úˆ>¢OÈFS©©ÔTÊö"yÈ# ÚІ6±Ù^i¬4VK4Â3á™ðL—GÈØq2Ý+Ý+Ý«ê·Ì„̢̄}E_Ñ—,ã µ6.7†0„qghÍ ´Öm©r•r•r•“˜˜˜ Ô)<ž OL°ž·ž·žè º‚®€0¢%Z¢H7é&ÝyA^*Q‰J€®¦«éjV…UaUn7ÝnºÝÄ»å å å 1ÆßÎcçãÄ!qHZ2Ǭ5kÍÚ„ÿðT{ª=ÕL¥>­>­>-Ø52H}©/õ…+ËÇò±w‚;ÁH>É'ùR‘ŠT:è Æ2ÑÀçŽsÇÞÀxÀúX냫ݿúgõÏꟅ3ž±ž±ž±Leç±óq,€°€Ý+-á–pK8¡‹ÐEè¥(P( à@ÕTMÕp媹j®èÕöj{µ€ÎCç¡ó:ê:ê:êšE³h€`#Ø.%àùÃçŸ?t5º] Ðú õA뀧Çéq€dÙA¸*ö(ö(öÀ!¢%¢%¢Qv;'ªD•¨z+ɽϽϽ{ƒ#‚#‚#H.zÑ‹^8p%\ Wܽp÷ÂÝ À¡úCõ‡êËÜeî2ä/Î_œ¿(ª-ª-ª  ky×ò®åÀ‘ùGæ™\ytåÑ•G@Á×_| œ >|*°œ±œ±Øë8Ì(ŸQ>£œäÚyì|œ©ßÔoêÇ?§îŸºê~hä_È¿#ͦÙ4‚ÝCuxuxu8"‘‡Èý;ûwöëv¯Û½n7ÐÛÛ ¿4~iü¨v®v®v^‹{-îµ8@¯‰×ÄÛÞÛöÞ¶÷€ÎæÎæÎf yUóªæUã ‚#çÈ9r0Úyì|¾ÂWøŠpÅ\1W<¾@JêI=©Ÿ#æZ̵˜k€‚)˜‚­7[o¶Þóóó¿.¿.¿.ÀÁÕÁÕÁðWû«ýÕ€×l¯Ù^³ÿ퇊T¤"àççHr$9’À¶½Çç>ä>ä>p'p‚¼ïÃû° Μ;8—‹ñb¼?á¨pT8 †P„"Ä¿Á¿Á¿]8ºpt!p)ûRö¥l KÖ%ë’Êhe´2À>ìÃ> "+"+"  ~Ôú¿ýRôKPõ¤êIÕÀ·Î·Î·˜ž:=uzê8 ³üpãpãp#º¸.†‹aÿÂnŸÝ>»}Ì=;f혵cÍjhihihav6ÍF³‘±ÆË—/36à5à5à5~Ÿ ººº3ö¹ìsÙç2Æš^6½lzɘ9ÈdbìHÕ‘ª#UŒe.Ê\”¹ˆ±ÚüÚüÚ|Ƭ¬¬£{èºçßñºÞïz¿ë}Æv.Ù¹dç¶)}úþôýæj¨¡NÏ"…H!rÏUÍUÍUÍV¥ªXU¬*æï» » » c°ÈPd(2ÀõíÆ·ßn–a–xõ*êUÀ%qI\àrßå¾Ë}àÊ©+§®œŒÉÆdc2ðéÄO'~:pûØíc·s±¹Ø\ ðI|Ÿëe½¬Ž¯_¼~ñ: #^Ä‹xqu$œ„“ðï üÚáµÃk‡k«G3F3F3ü7fffÏúRFFƺ5¤:¤:¤š[îQïQïQÓ•è+ÑW¢!ÜH»‘v# ¸uèÖ¡[‡€yÏæ=›÷ ˜5qÖÄYâÞâÞâ^À¤2©L* ¡°¡°¡¸ºòêÊ«+ŠÀŠÀŠ@°ÉºÉºÉ:MÇ›Ž7§Æ¦Ê¦Ê¦Jîïò@y <ðîK½¥ÞR¿z Ùõû®ßwý õ¨í°¤GÒ#é©•• • •LKŒ<y.ò‹\ê²Ôe© ¹öìú³ëÏ®ƒé?Ò¤ÿD¢Q„Ó4Ó4Ó4ûŽ}ǾZ [ [ s”9Ê`6fc6ÀY#k¤‰ÒDi"Œ}oõ½Õ÷V—ç•ç•çá¢ô®ô®ôîh4Ëcy,/d5ˆÀ{›ø——¾Rðr%äCÞ¼DrIrIriý܇¯¾zøŠ5Lê›Ô7© ú-ó[æ· ~Þ¼7ïÍCâþ­û·îßäòù q$ŽÄK&–L,¼×z¯õ^ xó>æ} ð¹àsÁç~uúÕéW8k5ZV#Ö™ÚLm¦6.Fx*<žîÈûÚ/Æ^ìÅ^aŠ­Í³†ŽõÂnr˜&‡¯%s ¸Ü‚m¥Ø‚-ØÂ¹Xx±ðb¡¸Ùàcð1øÀ‘¤’‚AúýŒ~ ùȃÄl›Ãæ´¶Óv€zROê “í«vÕVi«´UÖ­===Âa©D*‘J 3§oš¾iú¦oª‘Žt¤“"t â"{?ê„nt£[ü )HA ) Òiƒ´—Ë>‘}"û¤0s l l L0”¤•¤•¤Y·Ú%Q%L0à 3¸À ·Émr Á$˜ƒqy\—éÍΛ7;Yäí®Û]·»øƒÎõÎõÎõGÍÛÍÛÍÛ·g5Å5Å5Ŭ“u²N¸Ùâü`5ÚÆbêL©3Üî<½óôÎSÀœbN1§lÏrrwrwrPÜVÖVÖVƬˆ«ˆ«ˆc‘$™$“dHi- `cÒØKö’½ˆHD"bäyçóÎç(¬œY9³r&ÜœôNz'=@çÒ¹tîö,îw€;ðxtì…øÃ¶muÉøȾÓÚŽ$RÛÔV"þàX›fÝJÂH ‹\>vä¨>oÙlÙlÙLÿ±Ž®£ë(·`Æf@,m¥­´Ž\ ÈÂ$jD¨ô˜ÿ1ÿcþÖ7ôóôóôóøvÙLÙLÙ̃óÏxÆo«£¹4—æ ‡m•ý/{Å2333331hÏ(lÆ5dÓîV›v“’Cr®i¹.‚‹ØVŠD$"‘;Rf)³”YÄ͆“†“†“pä8Žã8¼´g¢j¤j¤j„ç>Î}œË·ËRe©²Ôß.™ž˜ž˜ž¤~Ó¾¸}qûbÀ¨´­s´ÚùÆAÿlÀÑæàg›vÏ :tîàrY’,I–T˜9à3à3à#~Jû)í§4ëV[#íÖâÑâÑâüš†š†šïØêØêØ P%URå?j…µÂZaíÈÛªPU¨*”ë·Å{Ï6Žü‘‹ÇŸXxxxxx8DÛ´…90æ@þ®Sÿ¦þMüõuëëÖ×o‰R•T%U­:Ò»¨wQï"s†{†{†{ìë;?ÜùáÎÖw†,C–! Ÿ"Y Y YðßSØIv’üßKB )ýèG?l¯€-QâyþÂþD»¨@*¬é¬”•²Òðî,w–;ûªÑe£ËF—Ñ7%¹’\I.wOäùÄ«7üÏúŸõ?û·ðÎŽÎŽÎr™N¢“è$ö½Ío™ ÐøgþÂþ ]ÛvaMG2’‘,èHI ×ýY«`;Ö˧ʧʧr÷øn¾›ï~2•î£ûè¾ÍO[×´®i]ŒBeógo,GþŠãÿQÌ8´¹ #IIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-74.png 644 233 144 2326 13755454065 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü‹IDATHÇÍ–_H”YÆß™¶5MÁ¬¨›½hb)/bJÁþVfMÅFD±ÙÅI4´ÉÖ ë…®E)ÅÎ 5ÑvU’ºè…KµRkTX ”Š†Íœs~{1žù¾¢ºØ+¿›ùž÷¼ïó<ç|ç¼sDD$oêWÀ[ä-ò榰÷'î[ë[»ø>§À³Ù³¹ï'˜Ó4§ ¿5¿U?r°·ùîz‡ß­gã’'N ãJÆOé>ÛÛ¾¹)ükd^ϼ>ž„}7öݸvñÚE~„ážá€·¥oKÁÁvÜæÛzËçæ—Ÿè‹ÀÌ[3oy!cVÆ,X°zÁêER OÁÆòåC3†f/¨7Àlf›R`Œ1ìwa;>•oë-Ÿå·zV?åG  ¤ D*wTîÈlI<újæÕ̳z‰ëÀ)N1’cÉ1µSídL—éÀƒlÇm¾­·|–ßêYý”ùøÛÖ—ÁVßV0 èíÕ^0j±ZLBÍPKÔŒú^…UT®ÊQ9`ŠM±)N¯¦Úì1{@é5z t‹n!Á„º­nÆòOé¥õÅmèÛFÈÎû«Ç*Í¿ô.½‹ G’I&?An$HÌn³ÛìvÅÇíËG|ë=«Ÿò3eìÜ_°ÿøþãéâï̉DM¢ÆY€…þ?4›‚MAhŽ7Ç›ãÍ‹æEó /Øì :>žÕ>«}V w·ÜÝrw‹ËàBB„0Œ%_&_:zŽ~ÊÏ”±¿CÛHÛHÚÇ^]úaèó] ] ] °"¼"¼" íííÎFh>Ú|´ù¨£_ÒYÒYÒ +/¬¼°ò‚×uºV×ÿ¨Ãê°å7{ý”ÜŽÜs†—/wÍ ÓczR/Ð!Ò!gôRö¥ìKÙPy¾ò|åy'^_U_U_€ *V«Š¹Œ­Öeº 0QuëYý”üœüýâ/â/\Ç~Ô<1O€2Ê(sÊGb#±‘ÌÏšŸ5? Èy б¬cYÇ2Äñ@"w"w"w äùC~×t_›×æ5Ð`Ž™c.½´~ÊWDßÔ7=E’›’›Ä>’+o䈞« tA:.ÑŠhE´BÄÕÕUd)KYŠH¯¯××ëyúüéó§ÏEÚzÛzÛzEz^õ¼êy%Òi´FD<…žBO¡ˆ>¨Ëu¹K/­?åçK{Œ¤jQ-Lª?ÕeuÙ™q¸1Ün„º³ugëκ݆ñ ã€B )„3Yg²ÎdÁªþUý«ú]_,Ãh£ßT±*þêûü©D'G’#@;ýô§ºÀ»“ïN¾; ƒƒƒ.ÁCâ'‹&‹&‹`tÝèºÑu®¼[ÜãÆÕx¿v*ÿG«¦šjWô4§9 ¦Ût›n`;ÛÙüË}î?# èL ,ÿWûØg:?‰n’ªCu舎 Ÿ A 5ä ËØ{ÞóÞ…¡–Z ›bŠ1 è#$PªSuºø¿Üù§íå´½]LÛûØô¼Áþ÷”qw™Ÿ¸IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-97-red.png 644 233 144 4141 13755454064 15612 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXíW{LTg?÷1‚,v”tuf©q±®ŒÏ¥Ñ:@ÛÁVÒꚉ„•Öߣi%‹(VW±`h¨´梩ԵÝVE›¬bVƒ[¨™¡È&Æ©(Žs¿ýƒùîÜ™v5›Ýóœï¼~ß9¿óÝ Ñ„L¥áWÄH1RŒÄ=ÄOê˜Ô1©#w™¨ˆŠ¨\;B h-&ÌZ‰$’Èt R×ê˜?‹gùXþÈzüŠH–_Qß2E‡Æ¹8ç"kı¦å: °×Ù?²$;t`»´Úøä–ñ¦ñ&@ö{Œ«/ª/ºÑ @Åu\¥B©0®¤*©€6 /’rËÓÖ§­€¶K]ª.…å·×ÙËí岃Õgx>2 šMƒo,f–jËËmŽçGÏgBy|ÊÇÁ•Á•Í€—Я²\[hBS„A†üSåcm½¶^W}ž=Ç=ÇñÈRm9d9¤Íaxt|âfq³¸ùJ 3^w¸øp±ö~(_vëƒõ† ›…7 àÈÁ# +³+Óaüíñ·à䯓 ­¸­\ç]ç\“\“ ­·­]—_¸ü‚ì?¼®1¹1Y{_ïl>Ò¼ © © ©¨ÎÎÎÕ;'ÃÊîìÚèÚLì=˜Ì F}á ‡…(€ä«ÉWv^àˆû.î;¾Ð¹µ¢»¢;ÜýáÜû7ï߆ݻjߪ}«ö…o¦¸±KxƒÁFHü*ñ+(ó–y<7xnÐèò­Ë·Œöáäád£¾·joÌK— À;|aø ¸>ð3< Z©—M9¦S޾c1TFÕTMD¿Tª“ˆèÑôGÓ‰ˆR:S:/…õ ëF½÷Vï-£žðCÂDDîíîíDDG+ŽUTQlBvB6}¬ Ö„ë›ÚMí¦v}åÙûª-«_V¿¬ýO¹'¾'>'•½Ê^hø=ý®À®€±sùÍùÍ–—–gúú(€@èøšÚ£öZºÆk<4æm›f›f›†~†xïàÁû¡ƒºc[m:¶É@XUR%xüåã/(€ìóÙçàÃå.S¬)Žrü#ÀÞo{¿5\Dþú›¯¿1lÿ‰ñ®ñ®p½sûÏí;§¸t.KÞ'a‰°DXR^˶̚lÑ,š2Ûó»;×î\ ?Zök_»¥¥¥¥@øî o6¼ qýqýÐÿNÿ;F U«ªVÀôòéåü²M¶È×¶a~øƒþ ZžZžZ®ê!QH?}Dñ9ñ9ñ9Dâñ‚x¡uHðWgUfU*ÛY6Õy:åt Bñs)\ŠqäõR½ôs#_<°x€ï­Eo-ØË¬~Œ Ɔ¯[rµäjÉUÕ¯,Ê„²®Ð'{)Rf5šÒMé¦ô£,ÀY¹cýŽõZ¶þ~LûÞñ½ptöÑÙ|=Ÿõ|,Þ/á%SU§ªàÆÔSe]äv·¶´ _ÿ„Öòµ|íÓ\n7ƒ›ñ›æ(€Â?ôý*抹âW›¸V®•ke\Q7I®S®S`=ó+ÛÕ 5ð´W´W7pÃH Ѳµ)Ú”0•†Z‡N¬±ÖkŒ¼Yïäna·°Ûiס9ÈAÑÆšI™”)î&¹ÈE$x…{½Ò?­M–÷,ïÉfÏîA÷ ‘»²Kv±«„. )ùJ> ­Uò”<}×QØ]ØYØ©l׿@câ˜8&íIÚ’´%i oçí¼;B·ŽÁüEèïZ¡_èú¹3svÎÙ9g'‘©ÄTb*‘öèÜÍ´gÚ3ÜUªH xˆ‡xhØê¹Ê\en¸¿õKë—Ö/Õ²õo¹Ùd6™‡žNè–ØÈIsg£FO\”z1R·ÄNp×s"Ì]g¥³ÒÀ]³l–Ía@ê=õžz/ÌÅ>ô¡&÷Mî›Ü§蜌çãùøwÿEÅÆ(|1ôì¡>Š»?å®Ô)u†¹+wÊr§0ð$éIÒ“$`þÈü‘ù#JŠÎÅv¡]h?˜Á¨¢^4Àè9v` ÂÜõ ^w÷[ö[öËfO«§ÕÓ €aHgœgœgÂÏŽØ$6‰M}¡Ÿ$“ÿU7tNqÏ-,àÝwOÿ'îf­ÌZ™µ2Ì])CÊ2ðù„]Ó'ÁqE\Ñ«å‘eø‡Qu9ú/åyÜ]!Ô µBíÀB¸¨º¨º¨ZûcÚxÚxÚ¸|CµWð ^ç,j¡j¡Ð³#x¢êÅÐÿ(ÑÜÝ©gÝáJ¹R® <Ê£wÔÿ!‚1¯Ì‘ÆIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-39.8.png 644 233 144 3100 13755454070 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜõIDATHÇÍ–ýOTWÆ¿3Œ“Ò_š(XÅtP$®/IÙH­¨FG^ÔÅ~p1#›mtmm0f7%w»%YAKÖM›.Ú˜kHkÕ­µ‚ͪ³tŠ`dŠ3Š KçíÞóÙ†ë%ý <¿Ü<ß—çù&çœçI˜þ X“¬IÖ_D±µÜŒÏÞ8{cêgQÜ ¥ÈRÔsâëãëæ|2çýy£~f¿ˆÉ?SψK‚˜{“½É’=߇âŒâŒÙ/Eñ_¯‚£ÅÑò¿¼uî­sÍŸ6ÊïàaÇÀ'ÙO²ÁÄFÞ¨7ú ¾™üòþÏôE ¦-¦Íò_°ÇÚcE %/%oÉï£w—@þ–ü-C³†f)+h€8âT6àDZFg`#?]oô|¿¡gèG瘿aþ(|³ðMÇÇцNÁ;/¿ó²¡nŽp„8ˆø#~­T+%ꪺ € ˜ØÈõF¿Ágðz†~ts+§DD>Ì…í}Ûû@ÿ@¸=ò ¼$¼TZäµÈk„§'Uú#}X†ÈXd42 ª\•«rÌõ”QFŸ!¥‡#s"sGÉáDP)Q~Ø>²}7ô­¼,"’v ~‡ßoSz_{_;P ÀfPËÕr¦xÀ0àJU©*Nr’“3É%—\ žxâͰšT“j¨æGÔµ)§ùs¦õ¦õ¹GðŠˆ4|«¨(¬(4èô_¹oçß·ÚåµÎZ'êNøNàNÀìNîNîN†º¬º¬º,¸×y¯ó^§™×‡ô!}ÈÄîÏܧܧ öµïÕ¾‡ºSã‰õÄšzêË {…ÝØÚ†oE»!"Òy>?ûùYø÷–»‰wÕî„?¿¸ìÅe þTðnÁ»àÌqæ8s µ£µ£µÒ:Ó:Ó:!³7³7³œ•ÎJg% nÜ4¸Éè–ã–ã–7,nXÜEZ‘¿È‹Ó’n$Ý èyêýÚûµÚ ­i­i —Gç}å ã/Œ«&˜übò øJÿÆþåT9ªpþ×ç3ÏgBÎPÎPΔ÷—÷—÷C^M^M^9ÀªÀªÀªÔ©;SwÆŒ_»ríʵ+°péÂ¥ —Âqý¸v\çÍW޽r nžs_t_xÚü´ôã\q.ÕdµvÇ&Ç&“.ŽÀ«WEÞ°¾|=(c³–,9ñÛe'ÊDÆVŒ­[!’ߛߛß+2uzêôÔi‘Íû7ïß¼_ij޳޳^ĶζζNž­ÐšÐšÐ‘!Bˆ\þçåÆË"@*©"ÒÆȘHÌØ‡"òKëÛÖ·I·ê/…¾ }gñH þƒøDþvñ£öÚe~q¤¸·¸WäBÅ…Š "–.K—¥K¤­¤­¤­D$£:£:£ZÄÕåêru‰Ì{<ïñ¼Ç"IÞ$o’WDù”OùDÜ{Ý{Ý{ER÷¥îKÝ'ÒZÖZÖZ&3s)æ’HǶëO®?‘ù"¶aÛ°ˆ*Ô¬šÕâe7ÎØÙ¬³Y0|0ÈU»×¼±Ò»ÒKpî…¹-s[`gÏΞ=0°u`ëÀVØØ±±cc,r-r-rÁ¡‡:¾*_•¯ Ò›Ó›Ó›¡§±§±§ ô½@‡„„ヌÂ߸®Á±¨JU©vCSS?¨ªé3fÜ.í±í±™·$ô—Ÿ²ʆ»/à  ´z­^«7ÏNp"8œßZßZßZ †j@¿¯ß×ïÃèÑÑ££GA­V«ÕjеD-F&FŒ<@iûCËBËL=<{’÷$ϸ•œÿ™ý+ê+êãg>V¢J˜R™*W傊U±*TµªVÕ3ü*E¥¨`»Ø5#îU^å5[-P Ô6µ)åŒò«»}7ûn8&~_>f8ÐpÞ³vÌþufõed<2ü]ûQûÑt~ª9ÌaP×U»jܸqa”Gu«n`dºþ´6¡MV—"c‘1 Îpþ¶60õŸýÄŸÛåsûºxnßcÏç öÿùÿÎ,“jIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-31.0.png 644 233 144 3001 13755454067 15016 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܶIDATHÇÍ–ïo“×ÇíÄIˆ!? „ÆA §K(Q„h5Pêí4˜“Ö(Ej_kÚF)‚*¯&•"2mÝ"-­U¤¢T•Ò©¢¬i+Ú2*š.)†`( ¥2:ÔàıýØÏýì…ýðDäྱ¾çžs¾_ùÞó}®€ˆˆg¬åÖrë¢ ¶þÎŒç?›ÿìªfðá4Xž³>>u5u5u5°¦MÏšp}¶ò¥•/‘ø©85‘šP>8öÚ±×@mÊè±Zü…‘ÂHíz‘† Dî~ººcéúÃ绯ï¾.yþNÿ;þwDJÃ¥áÒ°HtEtEt…ˆç¨ç¨ç¨Hù¹òsåçDôJ½R¯”y«¯º¯º¯ZÄVi«´UŠŒþzôùÑçEŠêJ^(yAòþUþþŽ÷wXºD<â5´`xÁpíz«õ¼Ýiwò¸Ä×Ç׋a8ïvÛv°/ã̪?IE€®ôíôíùÎr€nºé¦3ßJ5¦¾Uß7³ùÿÖê ÑÔS3© ×pþí9Ûs€äƒÎÿð~+Ú×ÅCû{8_°ÿ5‡½æ|}KIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-95-grey.png 644 233 144 6314 13755454064 16010 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—PS×¶Ç¿ûœ“$‹jM„`QÔ*XD) ·µbÕi­ck‡±RJô=Fª\¨¶V¹2ÕêˆX翽*>&(·Ðr/X‹•b•EŒŠ&Hr²÷ûƒD;étý³gŸ³ÎZŸÙû{öZ›äçççççC…q³ŒÜ"áŽpG¸ÃjòåË?Æ&Þ/¼_xÿo‘ÌŸù3ÿ/ÿKT‹jQ=wƒ£ÊQå¨b»pGp„ä!ˆp·qÀlÀ¶K¶R¶R¶’ä ÷„{½–#ÄLÌ塞 ¸ ¸ ¸®­(¥(¥(…˜D¨5äqzÅÃ¥âžÆ"±ÜIZH i!½â´9mNÛóó õ…úBýÉ>§Éiršj¯ÙçØçØçÌýå>å>å>\š»dî’¹KH^´$Z-æÌ ˜xçÞ÷^ï÷ÞxOã{òyó{y¼|‚g2_æË|é:’JRIªf¯á5¼æûol'l'l'¦ÖÖÖº7/¹½äö’Ûœk¦a¦a¦$Ëòdy²<Øñ)>ŧPÀ;ìÖc=Ö˜ŒÉ˜ »#ÔêE²¡ÑÐhhd®ï"¾‹ø.‚n~ôÚ£×½öÞ^…F¡QhÈÝ©îTwêâ},¥±´;븅dûØö±ícшÆÐç„*¡J¨j<ãuŽ:G§.Ó¾ª}Uûª»úãÕ¯þX8©²ª¬*+´B‚ ²pÎÂ! è00ÀF0@té"]¤ "†0„!_‹¯Å=çœ?pþ€¸®§¡§¡§Ah’úH}¤>½—Å•âJqeüZÄ#ñÜO³O³O3 ™$™$™ôùì—í—í—§.Ó®Ö®Ö®“ÓRÒRÒR„&U°*XŒ wƒ»ÁÝÐt]«° «ÒHI#@úHéH2I&É«gõ¬ ;躂xU¼*^ü>òûÈï#yãkßÔ¾©}SLöæ÷òxùHaMaMaÍóœÍÎfgóåf_«¯Õ×ÊÂÒÒÒH³ê„ê„ê8:…N¡SàËÝänr7øÃþxf¡E(€JT¢@ b€‚‚àÀûÿÌÁ¿àü«%Ök‰=¼ôðÒÃKY´Uj•Z¥Ä(–FK£—Es,‚E°ˆ¿¿åJp%¸€Ä–Ä–Ä,ñJi<§ñðåú¹~®***Zæ´Ìi™ô÷÷ì+öûê 5ךkÍZ'¶Nl¶¶¶­ÓZ§µN~}ù×—}p$:‰ðU5©šTM&lKØ–° K¼<^>A ÃİùéþçüÏùŸÃ®¨¤¨¤¨$R 3Ì0Cä¹F®0È 2ƒ 8r*äT ,P( €aý°~XÌŸ=öüÙÀ[x oèêêÊ&•M*›Úm6@¬kÅZ@¢’¨$* G£ÎQ2È ¤Qú(}”ž”Ösõ\=‡]¶D[¢-q~:rŸä>É}Bw\prÁÉÌk6¶ƒí`;sW¸+ÜŒ}>õó©ŸOeìâî‹»/î~êÇzâzâzâÛR»¥vK-cC{†ö íaìúòë˯/gìPÖ¡¬CYÏüY2KfÉŒQ#5R#cô'úý‰1ZNËiù³ü^/‡Ø‰$‚;ËåÎ>U k°kÚFÛhà(v;Š â â âgRóãýx?@ R˜&›&›&cccÀàÞÁ½ƒ{²eË6e|_ÆêNu§ 1$†Äl„°‘gù¹÷¹÷¹÷Æa&¯æÕ¼šýÓc±Æ(ñmñmñmLãoð7ø`ÂUáªp$N§ˆSÕ!Õ!Õ!@onono.`9f9f9ˆEb‘XКCsÏ÷ä¹@ˆ Š Š Ú3Ú3Ú3€£ÃG‡9m9m9m€:S©Îó€ò¶¶¶èæ’¹d.™ýSï–ï–ïKºƒ»ƒ»ƒ…£·*nUܪ ys‡çÏÆ(û‘ýÈ~„"iQÒ¢¤EÀ„o'|;á[ saçÂÎ…Àôœé9Ós€¡¦¡¦¡&ÀµßµßµX:¸tpé À¶²­l+ +—•Ëʺº: CסëÐ=Ïõ<×ó >¥>¥>…Qã:ã:ã:(Œf£ÙhÆy·¼[Þ-–pXÕX]pDÈò…|’WÇÕquœ[ûøÞã{ïAAd¬§…ÓÂixP÷ îAðÁüðÁ€2K™¥Ìx¯ãu€æ€æ€æppãÁ7õÙõÙõÙϤbR™T&àNt'º€¬€¬€,8<¯ÕšjMµ†Æ#1#7q÷7RrhÆ¡‡f÷î7Üo8þ›-Ý–nK?4¼'¼'¼Ç½iCˆ– -|IGGGGGÇìÇìÇì‘BBVÎÊY9°.5¬9žx<ñx"ªr…\!{ñŒgüÜ5˜Žé˜Þ¾QàŽpG¸#|3jQ‹Ú»Ñ4–ÆÒØÔƒŠEƒ¢á{\™}eö•ÙlF¨.Tª#§£¦EM‹š†•A/½ôd„Œj¨¡Hi#mÀø)* pgàÎÀ~ÆÏøVëgÖϬŸÁ÷Rè¥ÐK¡¢V:Q:Q:Qé!=¤g/ÍíY +a%B¨§¨¹£ÇûFáïdÙGöÕgr \—°¹ âC|È}]SS#fxJ‚d ’+m¥­´À=ÜÃ=*¨ Æ»€=dÙC€N¤éħZô½|éò¥Ë—Ü›ÌF³ÑlöË|e¾2ßÓEº]‰®dï÷(@ Èt¡ ]âboõU¢}èÛld“ªÈ‹‘#/–¬’§ÉÓäi§‹Ì‘æHs¤`9¿þüúóëÝ›¼ É5r\ƒ`0†1Œái<âÆÕp5\ dWWW,é:®ã:ø¥B©P*Æœgœgœgr¿h+h+h+˜‘™~ž<^P»g¾ï»û"ý’~I¿ÌìXÛ±¶c-0ˆ0OÇ¿Àåt9E ·<·|à ã`׎];"©‘T•FXÅ*U Ĉa­é$ÛŠ/å[õV?«¿…gá'ø¬{cÝ"°çí=o§š(¸sš^nzÙÂÓ.ò!«@é1£Ö¨eT@pàÛ¶âV¾Uoõ³ú[x~‚½•q‘¿–Á[á·Â`þ  ê?k´  òô×ô×Ж˜*3j>0€þ}ZŸU§êTözÆs€žÈÓkzÑL·^¨‚º‘èUiUi@Ô·¶ò""yCz,=[¡Ìð`xhàMPù*Ÿ8?ó€ jU­ª:é¤3‰He”Ùd“ä.0FÀýæ˜9F|)ú&z8€…Ÿ –÷±0)"Òþ­¢aOë›ùë‘ÿ°ë‡]p*ÿ”ç”uW»;wÞÆ»™s3çfœÞzzëé­p/t/t/dÇÕ€P ZT‹j±ýgëÏ6ŸmFl å‡òm<õ»úñúqkkÛ¿ãŸ""¡÷ ÷bïEÚ1þÒøKêÀšîWݯ²°ûƒÝGvÏãóø 'Øì B^(/”‚’Ñ’Ñ’Qð4z=Ñ#zD·‰hnÍ­¹aïÐÞ¡½C¶ôŸî+ê+baé5‘ó?ÿÉ"zOÌMssª ž^yz¾4¿q}ã‚?ûÞO?ü¿ñ—øKÀñE|¨««ƒòÖòÖòV›@á|á|á<œé>Ó}¦ÛöÇ‹ãÅñb¸°å– [ ÷aîýÜûÐ×sùÈå#vž±ÙÙ°úëÕ_«.µîµnó6+£3Ñ{ì0×8×°)sSæ¦Lð÷ú{ý½àÍ÷æ{óaûá퇷g±³ØY ';NvœLúb³Ú¬6kÛÞ}Þ}Þ}Ðm^œ¼8i㱩;SwÀâ“bf/ÞX¼á¸-ó™e~$ò·kŸ ~2(ëªõêÑêQ‘« W®6ˆ8†ÃŽa‘¾š¾š¾‘‚–‚–‚‘Ã;‡w‹dÍdÍd͈äh9ZŽ&½½½&b7›ÇeyiãÚ˜6&"Ò)ËîuòL÷é>Óoú·SRž>ßø|ãðÈåàå HõÀæͼ;ó}ôóè粘õeVOVˆ'î‰{â"G}G}G}"ë'ÖO¬iu·º[Ý"û+÷Wî¯ÙìØìØìÙÖ´­i[“HôzôzôºM,ã\F{F»HÚªÔÉÔIY\úçÞuü6à 8EDb¥±Òá!±¦€¯®8¸Âž’Å“ÏKŸ—Â#×ÔüÔ<Êh3ÚŒ6{Kž,]Ö±UC\•¨2UÊ©œÊù¿2 rU®ÊqˆCI:¦¡-Ëòrf’ކƒÿOǬ^°”·*µ*øSB™U¿>§ÏÆ}ã¾­ü´pŒc ¾Sƒja„ Ê# «[ê0º¬üï˜ï á4^7^:–•ßUåùaÏÊövñÂÞÇ^ÌìIù<1âI¯IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.4.png 644 233 144 2777 13755454067 15051 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü´IDATHÇÍ–ÿOTWÆßD ÐqЮ¸ŠÒ±‰6²1,)%éˆÅ¤•Ne«$¶i‹îÚ0[³&…ÄDR ) ¢éÖ’iKQëÒ"mf*ºn»Á’J"Ó28)ÎÌ=ŸýáÎõÎvÿÏ/'ï·çyÏ99Ï9""bÍÖ,k–Õ¦ÛÖ?šþäâäâ§Név[,¥–Òëƒ%.ù ýDú í†iq#?¾^ÄÄç3übÓ‘Ô™Ôi)ŠÙuPöLÙ3É¿Ñí÷¼ÒÒýK*z*z>kÿ¬j¸sùÎe€™¢™"0m#näõ^<¾ÔýŠ_¿HüÂ2I‹“‹@¶#Û‘³OOÏ—¶½´ `2a2AY :¤‘¦Š€ AŒˆ³x,ߨ7ð |ƒÏà×ûxâù'ží¯m-åc½àÆIpgº3 ¾p7p˜Ã¤A$ DË£å,€ò*/,`ÚFÜÈ7ê <ßà3øõ~Ì£œi|œwwA­Dn„3 y£áQ±N•z]íR» òïÈPd´ÛÚmí6æXˆíÜœžÚÚ„UMôBôhëøà 9CÀ]ƒß8Ê/EDžþR‚)Áà"5=606ì TžÊcž‹xð€%Jôƒ2Ö@M4kXÃþä“O>¨×£õÑzæcÞ~ûjì+0øõÆžþ ¶cmߪÞJK¥Å@Ñ6ø2GFFF yU³½ÙŽ5yÆwŒïßMMM0èt ºâI$‘DP ªA5˜î[ÿ¸õÝ­ïPß”õmíÛjò±¾²³²øIïǪ6‰ˆüî¬eë‹m/¶‰ŒôÝi¸Ó`yÖ1¶åÒ–KòàláYÇY‡XÊV”­([!r¾ê|Õù*‘êÉêÉêIO³§ÙÓ,âºïºïº/2l¶ÛE$,a ‹¨Y5«fåá¨pT¬ªX%–w‹êæêæäîµ<«þú\เˆŒëýHô?©Í©Íªææàó” Ë.,÷Ÿj6Õl2WZp¦àLÁØ\¼¹xs1äöçöçöCåµÊk•× ¶·¶·¶¦ýÓþi?°’•¬4ë6l<ò‰œðJWéÛ¥o›q­tòðäa`Üö‘í#Õ)DÒSÒS´Qõ—©]S»Ìkï+ÿ~Ë÷[`ÝÍu7×Ýg¡³ÐY­žVO«rÎåœË9­{[÷¶î…œÓ9§sNCÏÚžµ=kMžhO´' P{±öbíEøýoóå/2ùÔÝ©á©aàˆý¨ý¨6*Ú§i®4—ê„Ùg„á#¾_ <–‘üCòP·¤ÎVg3‰º&º&º& ×›ëÍõšþÕ«7VCñ†c ÇL}z}z}:¤&§&§&Cööì—³_6eýãÇOfœÌN§ z5õHêÕ)‘e""C5Лۛ ïèvw»Õ›ÖË"",äeæ-Í[ ¶¶¶е³kg×NØsuÏÕ=W!i(i(iÊ'Ê'Ê'À·ß·ß·Öw¬ïXß>¯Ïë‹[@K[Ëû-ïCáõw›…˜ú¼ÉÒŽ„ŽàÏz?Â{ú-€ªwªÞPD¿%?ÿÓßçï‚ÿIÿ“(ÿ+þmþmr‡Ü!7pœã‡ÀêÀêÀjЖk˵å JT‰*À©À©À)ÐlšM‹ÛñP$4šFÝÛ:#3w+¿tY]VCpÛ¾C7L‰é˜¡3T¦Ê|¨;°›Ýì-¨5ó)Be©,•Ꞻ§îÅÉÆ!qÔ€º¢®Ðöiû˜çF ÿÝ1Ϙ'NÇ~þ3^€Æ¨wÖ8k@Ô•Yý+šMõid.2G˜£ 0€â ^¼ ¾Výªh§v`–f@ùÔuuy¨üoio¦.z)z Xl(ÿ« ¯&~­üî[ùÈþ.ÙÿØ£ùƒý/n¶(ò-VÛ0IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-143.png 644 233 144 2602 13755454065 14750 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü7IDATHÇÍ–[H”iÇŸQs(Ó-;@“Ð^4ë2шeJÇ•¦(Cª5QZ:A]”VvÛ¬6‚NH¡’lRYx!-“íMÔ”ÍäÔ¶­6-Lmµ™ù¾ïýíÅÌç7%ìuÏÍðÿÿyßçy¾W@DDÒã¿IÎ$gRZLOZoÙGÎ9ÿ˺˜~\[‘­èÁNstÌQ€Œ3gŒ€¥›~3>1_ĪŸˆgÚ%],ƒ½ÑÞhóÄõݰ½Â=23¦ÿtMަ5(»XvàBí…Z~€W·^ÝèñôxÀÒM¿oæ›õëËîOðE`Ä•Wl=Õž*Y…Y…S7ÆO…¥‹—.xžüÐ;õN0FE+£•DÕ5¨Q|"j³Ú¬6ƒ1ÁoŒ·ìF»Jû;’É#ªÜZ¦–9ô‡} .Ó–i€Šã[W)"â:Œæèttö§@(=”4°H¿ÍŠf1@ ÏyÎpÉ%—\PËÕrµ„ƇÆÇ3dzþ“OœØñß¡|Wù. À˜®öD·E·Y8'ן,9Yþ|¾?8¿§çŸžz®\+¸V`Ùý6¿Íoƒƒ9]]ÐñO()”d¸ªá áÇùĉÝÙÂÆú’ú’¡ðïµÃÙálÂÅ_/¾n]xˬ–Y-³†óÔxj<5°0°0°0Á¾`_°Ò&¤MH›EeEeEeà|ìô;ýð$Üq¢ãaOyë ë Mbw¶¤ÝH»¡ùõåí—·- Hö‡¾}ÐðUƒ«ÁY¬@V.»tîÒ9+®º¸º¸ºØ"¾¶|mùÚrh{Ôö¨íl¯Þ^½½®®® §)çBÎðo¿7çÞœ„^ì~á|á“@ÆèŒÑÆCxóâÍ àjlìU½QcÔX‰³÷ÌÞ3{´¶·¶·¶ƒ¯ÖWë«w¶;Û ;Zw´îh…Ü)¹Sr§Xyï*ÞU¼«€ÁÁApå¹ò\yÐ>ö¾ºoЕÜõºë5˜|RDŒËÆeÛCѵÅÚbɛܓ{2N¾‘ É!‰äGò#ù"É¡äPrH$X¬ V‰t4v4v4Šôdödödм¯|_ù¾R$oUÞª¼U"Ó'¦OLiqµ¸Z\"ÓfL›>mºÈ­ÕmkÚÖˆ|-î³î³2N}99%’lòê1ê{ë{ßbwÎZ³Ölöxœ§Ç Í{›÷6ïµNDwënÝ G9tä–––BwEwEwÌðÎðÎðÂØMc7Ý^Y6¸lzsÞúßú­#¥n nà£ûd*#ñ)éÔj¦ÿ—Þ½ â‹ø"¾áÍv†a'ôIŸôIB¯ÎÌÌ….{—t èêa=Œý˜~ xð¿Sé: ŽWŽWý)СwèCuQb”0[¸ ²ŸýìåS>å–°„% {¬@¨PMªA5$ØSµR­”õnhÍ ÍOO†í±„Í×îµÄ7ÿ]ý.`×7èˆr¾á›Ÿ*ª¨줒š`ßÌ)N¡T‹>IŸD”Óú:}éŒúн)Þó¤>ÚüŸí·ò³}]|¶ï±Ïóû‹G‡ð½ñ9IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-13-red.png 644 233 144 4051 13755454063 15575 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜÞIDATXíWmLTg>ï½wÜé¢4[ù¶1¨u…` ê¤3Ð8k*iQR1jˆþXD[S•š:•`ý´FB”ÄœAd5Õ ìVðdžµ´É¢´Ñ•™ÛÁAF˜™{ç>ûcæ½sgâG6»çÏÌsÞ÷œóÌ{žó¾¢°Í¢ œ Î'{qgtÍèšÑU²\R$ER~8E‹i1-ÂËjI$‘Ä1‹Õ&¾ŸÇó|<l=¡ –ž_ÕQàˆ]ŸóŽÔ%uI]Ûζ³í‘ä”ɔɔI\)»[v·ì.°ndÝȺ ¼°¼°¼0Šù:ßÏãy>žŸ×{5VÆâ¹_ O…§ÂS÷b~BÕÕÕÊŽÖ›­7[oª3½½½ˆ!‡gx†gÜpà h8²Î÷óxžç­7÷ëWó#Ó¨0*Œº¯ò…½…½…½ò‡ƒÃÁá †15GÍQs + JƒÒ(K”%Ê@±*VŪÑu¾ŸÇó|<¿F8¦¾é s0sI¤Òöy€¹ÉÜdn’­±OÔ-êxåvÙ#{Õ­˜${J>8Î=¸öÐÚCkE™288`Œ»®6]mÒæŸe¾2ß‹ˆæ¿™ÿ&T'V'êý&.LèâÇîÕÞ«”á˜`çÃù ‘‘zÇ`1X mƨFüTü”ˆ~Ç]ÅiÅiz’æAó ‘çgÏÏú›C-Sˈˆö÷‰ˆvíÙµ‡ˆèÒÞK{‰ˆÚn·Ý&"ÊÛ›·—ˆÓºÓº‰è }GßEë: †NmäùýªV.o^Þ¼¼÷§Ù4›fÎã<ÎCÅflÆf^%OÉÓÿèR_© ¬V½_)P ôxrîä\0˜€å°~ó1ó1?LuMujnxyTáìÂÙ…³qŸó#Á*XkðQÄÑÔV×V×V§“@¢’¦¤€’®¤ë‡©´½´VޝŒ™öéŠé 8Ss¦\­®V½ G=£žhë•s§œ>­÷·Ã×ú¯õk/àV–ËrYnð‰KÅ¥âÒÝ|Ê2ßÎ|;óme®k½k½k½–À«ë ª«¿\ý%­(Z#¯N_'Ì Ì ÀÚAúå¬,â2ºøëÅ_áç2ÏÞ½-d!íçˆsÄ9-OÈh1ZŒ"é†tCºÑ1ª]øåærs¹RÏó‡loßÂ'/øžôž+{Wö¾h˜ÚŽ·× —Ícó< ãPKÕŠªP|†Ï€ê[÷~Üòikıf°"Œ“Æ(Ö2¾1är ¹îÓ<ÀÖ`k°5¨ÅZçfs-õ®ë]À{}äúˆž Z§Öé °e°Ú¶·m”ªëy×£Z÷}ê8å8>_"@h…Æé–ÆÒXÚZãŠÚ|mdÙÆwO²ÖÁ:¸VBvö8{œ=ÑóTê•úèyð#€€ž¯š­fîà «5jMTJ£#GGŽ™‰&«É*×j'ù…X/ÖÛÌ5+YÉ*™¢\‹¨ˆŠ¤/ÈAr‰câ˜8¶ã’ö´ž44”“]»\}®>½vå¹FOÏñ€>ø8Cï‡ÞÔŠààè(nøÇ†(õÚ ôL—ÆûS·¥nKÝF$˜³`fç"ìª8ÍßD>+Äûâ}ñ>»œµ3kgÖN"Cµ¡ÚPíܯi·È\d.Òk7d Ùà‡N8L`QÞÊe² zí4/k^Ö¼L-ÖÞòdC²!yt:ŒM‰±fÝq­'ûb±)1¬]×¹—j7YN–“£„BCC£Z†gÒPÒPÒPøI £`Œí‹“â7qüèÕ±9N»e¯Ó®Ü#÷È=QåN¥N¥N¥‹&M.šTækZì;ÅÎcù\jéÅü-½Æ¢x‚—i÷°é°é°œìêpu¸:øá‡“œ©í²í²írôÚ‘NJ'¥“C‘¿$I«ñÓÌ׌7ðQD»y™vW­YµfÕš¨vùÎ|g>΄×U­¬’U²ÊwwÇ–&âê2ú/íuÚ-ÅF±Ñ½„®´WÚ+íꑜ@N ' ÿSkõ˜8&ŽÙ2¨Ú©"׎芫—@ÿ£Åkw,^õ/¶‰mb›*¥R* -Ò…t!`ĈÑ_û2}™¾L‘Ø/ö‹ýìZ$°"®sÿ7KÖ¾YÈBéÇØå]U‚*¨‚ °nÖͺÿýû°ž3®3Ãqy_ÛêÿJ”©0²vIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-92-grey.png 644 233 144 6321 13755454064 16003 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü †IDATXÃ…—kPTW¶ÇÿûœÓOï"ð ˆñ"H+@Ç”zK €¥1…$¶×Wf :c  Tå¡!¡ “…h®Ä„q|á†V¯€ˆ…iÔt)„ˆò²íðhèîÓ{Ϻ*«RY_vísöYëW{ý×ÞëÂÂÂÂÂB¸aÁŒ — ƒÂ k*¬*¬*¬b>ÅcÅcÅcŠ`î̹úq‘¸H\½Ã\g®3×±OP‰JT’|„! azЃ;°;Ø'²TYª,•ä „GÂ#m%yBž'¯(ò.ò.òÖÜ-É.É.É&£b (’u ´ÍÎåÆ=TA÷=-¦Å´˜¶Yf-³–Ù–×××?dµŒZF›o˜–™–™–Eÿͩܩܩ£×D¯‰^Còc$1’ °Üc¹ÇrÀ1w¼w¬w|ïð÷Ô¿=ž#¾ƒÇÁ'Øw0ž¹0æB·’íd;ÙXÎò|àåofOÏžž=ý’‡g³g³g³mÿšž5=kz8ëÝÝÙ Ë—åËòaÂûxïC L0ÈArøÂ¾0™ýÍþflеêZu­Ìz)ìRØ¥0ºÿñÚÇk¯}óse 2P¸RnÛnÛnÛ¾ºœ©™š©·pñäàüÁùƒóZÑŠVÿç„:¡N¨ký§eÎ2g™{i}ÐkA¯½&ª2ßÍ|7ó]á{·)·)·)Á ^ð‚ÈBX €^ô¢€3œá `3˜ŠP„¤ô‘>ˆ˜Ä$&!]Œ.F œûòÜ—ç¾·´ ´ ´R…T!UÜoSÅT15q3‘ˆÄÓœâ¦â¦â& ñ‘øH|>ºjj45š_Z”””)nPg«³ÕÙB‡›·›·›7¼l-¶[ @7Òt#¤! i¹An"Cd Écò@3šÑ ÐMtÝÁæfs³¹®í®í®íðrøJJJ78â;x|œ8#Έ3ë–[j-µ–ÚìÿòÌðÌðÌ`Á™U™U™U‚C#SÔLÍÔ >Šâ£î$w’; |’OòÄ#ñ†1Œa`AcÑ-ÑÜQî(w༑7l’M²I¸8üg^˼–yMøÞ3Õ3Õ3•;x| ca,ìoX“¬IÖ$ Y›¬MÖbÛi·Ón§!¥‰4‘&Â…憹a`²x²x²Ð.Ó.Ó.îOߟ¾? `9–c9€\ä"@:ÐLôOôOôÚVm«¶èììèQz”X+cepqûÈí#· MÖ%ë’uXãàqð‘ƒüAþ OÇÎ:u:K¾É»›w7ï.ò{{{ Âîp‡ “éd:ðƒß~?øNENENEÀ´tZ:-â´qÚ8-þiú§éŸú&}“¾ ¨RU©ªT€â¢â¢â"0Ó>Ó>Óøøø9µ9µ9µ€´SÚ)í„h¢&j¢ÊëÊëÊëðÉlÖlÖlS fƒÙ`6àDĺˆuë¯hW´+Úa‡øBIÓÅt1ð£ï¾?ú+ö¬Ø³b–“–“– ǕǕǕ@‚&A“ ®J¯J¯Jßjßjßj`×Ö][wm îwƒ;pèä¡“‡Nw2îdÜÉbƒ@PrJNÉÁp8àpÀaäwº ]â€Hw†;ÃÃdØ„MØлô.½ ˜KÍ¥æRÀ«Ô«Ô«ôé:¸Î¹Î¹Îý§h†ã†ã†ã€ÈùÈùÈy 1!1!1á?ë©HE*Ò,i–4 4H$ xÖdÜ[Ü[Ü[Žã8Ž“0_Ä/â±MÅNÅNÅ’(1CÌ3ð2ßÅwñ]`B»Ð.´ƒ¬R®R®R ~ ~ ~Àý÷Ü?»Œ]Æ.@œ§ÅiÀ6m›¶MªÛªÛªÛ€xI¼$^®Ç\¹hF4#š °#°#°ˆ,ˆ,ˆ,x Èì#?Û5Û5Û…~n·ÛÀþ%ÈËË‹eýÞýÞýÞ‰;§îœºsŠäGOGOGOcŽ]g×Ùu(SRR矜rþ èïïŸ .ü9`ÂgÂgÂuÈ:d€¥ÆRc©*|+|+|ƒ«ÁÕà ¬Î]»:XɯäWò¹En‘[Öc=Öcn`ãÀÆPêE½¨ñ©¼_Þ/ïË8d"™E•B¡P(’| §á4œ-ÈðÈðÈðJ²’¬$+1U-T Õ0®׌k€·¯½}ííkÀB¤Ÿô“~ ´&´&´hhhL±¦XS,+Í•æJømñÛâ·b»Ø.¶t'ÝIwÂ,Ž‹ãâ8” W®6\¥*¢'z¢Ç×ÄFlÄö”|ùuäבÀXËXËXËw¿ÎîœÝ9»ó-ÿÛ¾ÚÚZ¾¬»»»»»æ*S•©Êñ#~Ä Ôƒzéõéõéõ@tbtbt"P’[’[’  ($k%k%kk›µÍÚ˜\L.&°mÚmÚmZ‘ #F.PÓåÏ.vù3Né|ÅùŠó•_6[ë­õÖú¸/ÈÁáƒÃ‡t¢~G$c’1ÉX›b¦a¦a¦á%uÊ)¤|ÀRÖ¯Z¿jý*rÅ~.²_Oüzâ× ¾[|·øn|¢|¢|¢Û¶7lo===€EiQZ”xZÖ¬‹u±.@¦–©ej˜&WL®˜\M•••hý"ûEöËüZVÉ*Yeô&„#á÷v \%WÉUò7ªv$†ª¨Šª¶¥lQ¶([.£íÕ¶WÛ^e‘þ¡þ¡þ¡¤:ê娗£^Fª×‹^/z½% 'á$üió{"Â;Â; dhD#1eúÖô­é[¸4nnÜܸY â­¼•· àf¸n¦€Ò8GãîíZ¸{›g‹Yè…rRNʯìå’¸$.iÞÁ;x‡û¢á½†÷ÞwUF•Q%ÙMv“ݘ¢·è-z ÀC<ÄCf˜aX,‹e±í¦Ý´ žÔ“zÂl¯j—ZM­¦VcÛ7Vô¡O\íèG0„! ‰w‘‡<䑺ˆšˆšˆš²4¹Z®–««KžD<‰x!ÏåœË9—cÛçH:I'é„:è ð<žÇó€ý9H‰"Q` ™ƒ¬]ß®o׳”Ÿûîÿ¹Ÿ/sîtîtî|0o9`9`9pàã[Y·²neLÏôLW{œSP“}˜·KñˆýX]縈㤵ÿ’ÈìS{Šø²íÚöQUJÚÂ/Çåënënënúç7é›ôMÊ%,)]Rº¤©öT+¹p.œ ‡YÌóÅ|Ⱦ ù*ä«[èhÜhÜhß+_*_*_Z¶’ñŒgüþzŒ£Ç„#öÌþÅ‘±’’’’’L9vöO5d×î>»vص[Ë%sÉ\òþ:¨¡†šû¢ÞZo­·Š»Æ c”Çq‡ß;¡™ÓÌiæ¨éÁ±Çã{åòyÁÝ‹æóˆy¤àóÞ×{_ï}°Ù¿S:|OAŸv,PÚ\³k·&âBÄ…ˆ eiòòòÕ%O=Yôd‘`<[x¶ðl¡mŸ½£wÕyèÕ1)“2)Ù3úÊè+£¯à[ÛbÛbÛâ¢,X, Îøb|õøêñÕŒ÷Œ÷Œ÷Øg·OÝ>uû”-~Æ:c±òy’I‚$á¯þ¬‚U°Š.Bdü 0À@}°o”ø,ÁØïh·MhB“­ˆÕ±:V—ÔÇçÎsçÿ?x~ãüÆùôÉ1É1É1î¯æÕ¼úRKÈùó!çÿ”¤ïÓ÷éûÈÿÑè ôöÝo½Ðô{þÀžÑ®ý¸°a/öb¯ %Ù$›d_ aM¬‰5ý=G Pp÷ø!~ˆ  ‡è!zh÷ÃîÍÝ›»7 €¶ûs4–sÄñojà&­¢óþIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-16.0.png 644 233 144 3040 13755454066 15023 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÕIDATHÇÍ–ïOTWÇŸ™†‘qÝ„ –°‘Ö€“Vkè« ÝU6S;µ• uC­#¡¦öÅt7!©¾`MºÖ„ÖÄD‚ØVP¡›ŒÙ®Ôš«¨+*Ðe ŒZ;³J®P`îÜóÙ3—™í_à}sóüú~Ÿœsžï9""’›ø X ­…Öœ¸mÝ‘ôgVeVý}8–7,oü»\Ÿ¹>ÈkÏk7n%m3næ§Ö‹$ñSùL¿äJÒa?i?i©LØû`ëê­«3·ÿ~½ŽÞü}þ>€žŽžvÁýïîð¨òQ%$m3næ›õ&^*¾ìû¿¤þµ%ö {†<³á™ ÅïÅÆ‹Á÷ªïU€)Û”MY ö3àÄ©* ó §Øf<‘oÖ›x&¾ÉgòÇûXV±¬B6×n®uÜ:¸?p›|Ñ^ …œ kº«Õ3ꂺ€ $m3næ›õ&ž‰oò™üñ~’[iˆˆø±-ú}±¡‹Æ’hq´Ô7±üX>ÑD@©?©jU ú°~U¿ Ƥ1iLBÊÚÝçþ¢¥Ô½Ao ªOF³£Ù šâø°EÛ¢ÿMð/neHDä¹VpL8&´4ÎŒAì¼|e¬2V1»H‘CY îª»ênJ#9ÈA`+X‘â/¦˜bà·¦_½®^g–²þªÑ‹£šCÓÒŠ÷“X±Ãƒõûx?VÙšãÍñ¾P.²Þ¿Þ/¢NˆG<–£¯ù}û>»{½ûe÷Ë"Y¬@V@d`ÇÀŽ"ž Ï„GÄmwÛÝv‘ªºªºª:‘‚]» vÉâ×_Ñ_Ñ_!b+±•ØJD®ÿñú›×ßq­Í«É«ûW…Ÿ×~^k9*⟈¨¡¬+YW^(·Ê_lßÚ¾¥TΦ͈ͤ¤ï“rC"µ·ê\u.‘‚¦‚w ÞYð.x¼"±=±=±="™é™é™é"e·Ën—ÝéÖºµnMä’º¤.©dcsž9ÏœGÄyÜyÜy<éÏ9•s-çšÈÜ÷s«çVKD$cSÆ&yb«´URj•˜ÑkôZFÄÝÝ,"ëDDd™  ŸÒOê'EðâÅ+’ÛŸÛŸÛ/’ݞݞÝ.Òt¤éHÓ× kÐ5(2^4^4^$Â,³ÌŠ.-\Z¸TäÞî{»ïí ¿ÞÞ$¢EµmDdåìÊÖ•­²LdöÆì ¹«>UŸZF‡ÿJ€¾/}y pÅÏXâˆÌWü§âfÅMèoíoíoMžšššÈ.É.É.ú`}°>wÖÝYwg”v–v–vBÈr‡Üàoñ·ø[À™ëÌpfÀ_ßäò˜O¨Év8Qr¢x/ÞOr*£6~LšS;;Ó§»§»Q ] ÇŽ¥LÝ1d A¸9Ünc¹±ÜXj£Ú¨6B¸#Üî£Áh0@UgÔˆü+r5re<Œ>}69•Dßn|âzzx0ÑØs­àøÉñ“–£OFŸ,ò{Y0:Îû3uÔ¡š‘¼ŠP…ªP‚šVÓj:EÇü¼Ã;`DT¦ÊP.åbVý-ï ŽGDKcüÿtL•P^Um«¶%•»ÒCÀ?b¿Ä~I*?=tÑj0quÐAð˜G<5¢®©kPÅ?%Æ¢ê}FŸzMå¯N«N~­üOï]ùÔ¾.žÚ÷ØÓù‚ý|E½Y 9Ú-IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-7.2.png 644 233 144 2416 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÃIDATHÇÍ–_L“WÆOA­DAIض³“›á\FH²ÄN 6FÓâ?FL¦†d 3Ü¡®â²Læt7g Ä¢o–í´$»MÑhThŸ(4|TúïüvѾ¢n‰wœ›~ï{Þ÷yžïùÎ9=„B,Mý Èpg¸3r’qÆA;¿pë­ù¿'ã³;;{ŽÀ’¦%M¹r/XíXÏëúô~!lüt>K…p¶:[ÞT| v­ÝµváÉøÇ0d…²B“&ºvèÀÕ–«-| ÑH4ðÒûÒ v¬çu½î×xéøâØüBÀüŽùާà\à\ ¬Ø²bËÊêdÁ£•°}Ûöm/2_dª #Àb+/#†£i±žOÕë~§ñ5ŸæOê·1o£°cÏŽ=Y¿$þµ®Z—æK„€zêY fÌŒÈ YÁkPaÀìXÏëzݯñ4¾æÓüI=bö·=¹™˜?áO̺§î˜ÇÍã 3§N$!÷É  ¢dŽÌ’Y >W^íKúP)—rùÐÄeu™ëÌu$@>•Oé$>*° °@ <¹9íS !ÄÇÍŠÆæÁ€3øe`UZ•iœ¯yé³jTªQ`?ûÙŸV÷t€z)}Ò7ÓQÆÔ@l 6ROJØÙ¿¡êhÕQPG¬O4ÞÏ“Ò'¥¨¦’¦¢¦"87vnìÜ\r^r^rBoKoKoËÛŽõ/ë_Ö¿ NyNyNy ëÓ®Õ]«mýj8ñ8ñ˜Ð|I~­'%¬«._«@}©Ý ÿ>>ëË×—¯/_§¯Ó×i/€æHs¤9b z0õ`êÁ¸M·é6Áô½Apvv†Î;ó:ól÷­Ÿ4_’_ës;ç¶j…hQ´hÖ*‰¨X¥Ökƒ½¸üâò‹ËÁßîo÷·¿íTèfèfè&ÔÖÕÖÕÖÙùU}«úVõÁéû§»OwÛyù™~ÒüI=r³s³­>ÔÖ2ÊfU¨ m€ñ¶ñ¶ñ6ð y†k¯µx®®¨+Àów;–!DÌóÞÿGˆ;·îÜBH!„à€Ø§ŠU±˜Nm^n7‡›…ð•ùÊ|ebf OOO á¯ôWú+…¸á¸á¸áB5¨Õ Äõüëù×ó…p¸F\#B´}Ñæoó !ÜŽÝŽÝbÚú3ŧùµž7w%Vj—üe¶›öR¯¾{U÷ªŒ°6¶cV‰Ub•ÀXÏXÏX5FQ#U#U#U0ølðÙà3úf¨j¨ ⎸+îBUoÕ¿þï®|sì+p€÷³Ï½Ùxe6ß;ϱ´“Ÿ€3àL€Ä=ä# WÖÈ|ËyΣfxúè¥Ô„šP@9 þP!Õ©ÆÕ8JµÊl™M‚ï¥Oútsâf 3©šuòÏÙÿÊ9{»˜³÷±¹yƒý]9{OEcšÓIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-23.4.png 644 233 144 2746 13755454067 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü›IDATHÇÍ–ÿOUeǸz…@¾i&Ħ[ÞMAL2E b6BÂYÃQ…²ÒƒÚÔܔƊ#ã¶Â鸱¡6i‚ßH/Ζ¢eΖ½µÍnÚÅ+q“îíÞsžW?œ{:·ú|~9û|yÞï÷9Ïó¼Ï#@!DJä) 6#6#6Icß2óq/ƽ8ÿ°·©SS6ø!$šü)@ª#Õ¡ ›±Q7ú£ç aâGóy‘"ÌÄŒ®]1k"ñ^Ø”µ)+îi=þäÄwÇw? CõñêãÇ:Žuðüzù×Ë×<\flÔ~c¾/öþ‡_˜~zúé˜;0Ã:Ã*dfÎÛ®7ŒÎƒ—_zù%€»–» ªH$Q®üø1ÆxTlÔ#ýÆ|ÏÀ7ø ~]€´‚´!`Ãk^‹o×' wB}z}ºÁêi$Âþ°@ݬn&ò‚¼@ 1`ÆFÝè7æx¾ÁgðëzÌ¥| „Í/@¹¯Üò€Ð¥ðÍЬÐ,Ю„n…nŠ(•šKÔ!üsøNøÈ,™%³0ÇŸL2 ü®÷ƒö¦ö&!Y§öª½ ÍÔñ¡ÚÓ¸§Ñ$REQ(ª,ª,ª4ó *T.¨ûRûRûR3ßÚÚ q q q¹!³4³Ô´õö™³;gø½~/¨Wššd—?eì±3 Ï,ÇÌž±ž1Y{Y!æ¤äXs¬–—–—–ûvíÛµo¬­Y[³¶’W%¯J^Ö k…FÚGÚGÚaÑð¢áEÃàrºœ.§)ÔÞfWì ¬̯ϯ7÷O±±ïEöŸè§j>¨ù}ú)ùí{OŸ§<Ïsžçžç=™žLV+‚N§‡Óá¾r_¹¯€¶MÛ¦mY%«dŒwŽwŽw‚–¤%iI¦°@8ð ð9YüP<Q§òìÖØ­±†á¶]†o˜>ñ1Ãgþ³ä¬|Ù/ûe?H‡tHG”=X¥UZAŽËq9µëw³›Ý /ÉïäwÀ«Úvm;S Gð÷¸¿uåc¿ýËÇŒ?@ó 4”ו×ìÔYþ &ª‰ „'„8À® ù˜FAž=²8ÌaøðtÉA9 éºA{[{›{Õ~µ°êø°Ñ²Ñüõ_ç|ÿ•ííâ±½=ž7Ø¿R±Y`Ñ”õWIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-98-grey.png 644 233 144 6316 13755454064 16015 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ƒIDATXÃ…—{TS÷–Ç¿¿““Å U ÊC­¢<”j:>˜Z‹­µ´ÆAÆÞ[Š*V 7¬Ö¢e¤ «-jíårU ÊäÖ`U –B! Xá &9ùýæœåZ]ÝÿüÖïœ}öþœ½¿çœ}HVVVVV˜0ãÄÂ-ãïòwù»¬*ëdÖɬ“ÌWÛ«íÕö® a^Ì‹yíÿwaš0M˜¶p›µÜZn-g¹8Žã8N2Œ`¸ƒ;¸`¶aË•®“®“®#™ü#þÿ¨é8&Ãdx×±le¶2[Ys+gKΖœ-Ä ø þ‚?ye‚ƒ^qr)¸IÀ(D!Š;CµTKµôŠÍl3ÛÌÏ.ÒVh+´gzl›Áf¨®·,°,°,XøŸòy¼®X¸bá ’!ŽGˆEÞ‹¼y®½ë¼Ëßu½+Þd|g>W~‹wVp)ó`̃¾I¶’­d«È_ä/ò¯ýÖ|Ú|Ú|z–÷3ÕÏT?SíØ¹âΊ;+îpö°Ö°Ö°V²Zš)Í”fÂ‚ÝØÝÁ ,’‘ŒdÓ1Óa±úYý¬~XÝZ×Z×ZÇì—‚/_ ¦;_|qðÅ7Êüeþ2ÿh7ÇVÇVÇÖåLÃ4Ls÷Mn)Ùûxïã½Ô¡u~ÿ—óå|yÝßmã¶qÛø¬UêÔ/¨_¢6¼·á½ ïñg&…Ia‚>ðÄ‚Xx´£í¦` ¦ÃÆÌÆlÌHé 0€ €7z=Œè:wøÜás‡…7»t]º.]â.q—¸w_Ö ë„u±IˆE,bïrîîî€ØWì+öÝwÙrÑrÑrqÖ*õõõaµf‹f‹f ]¡T(Jø8tCеt-] ë±ëROêI=@zHéÈ $ƒtÐAÐDšHÁ;ÂaŽ0À³Ó³Ó³>®øêDu¢:QXíÊïâqñm•¶J[õÊ"[£­ÑÖx±ÑÃäaò0±À”û)÷Sî“FÅiÅiÅiptAgÀƒ»ÁÝànð‚¼ðÄ”PB àWüŠ_lÂ&lð¾À–a–=q§™4“f\.—ËåÂdL7¦ÓAòGù£<‹0)L “‚è%’IĪŽ³`ü·³ÇÙãìq@|S|S|V8%4–ÆÒXxp÷¸{Ü=`@; ÐM š4-ºG»G»GÌÇ|Ì …Z×p ׀ÇM›6:îuÜë¸ YÈØR¶”-…‡"_‘¯È‡$þfüÍø›XáâqññB (.Iñ:ëuÖë,rÃÂÂH!†1Œa\WÇÕ­ÒVi«øAõƒê Ï–gË³ÑŠÑŠÑ 24242HÌOÌOÌôÉúd}2P[[ H¬«Ä Xä¹EÌWÏWÏWI†$C’a²Ð’pi¸4\J kjjkŽ7Ǜ㗤 c$c$c„枉>}&š¹ÌÌ>eŸ²Os9ŠEŒí›µoÖ¾YŒ•(;Pv`Òu-éZÒµ„±]Å»Šw36øúà냯3ö}ø÷á߇3v¤çHÏ‘žÿç?Ô5Ô5ÄØ‡g?<ûáYÆ”<(yPž6³‹ÇÅÇá3|†ÏH0W•p%“w&ÅFlÄF€Þ¢·è-Àšgͳæ>y>y>yO´æÉ{òž<€f4£xXû°öa-örØËa/ƒiƒiƒi@sAsAsÐPÖPÖPmÚ´ð*õ*õ*ÅÓ&å6s›¹ÍŽâ(Ž’`^4M4M4ýôشش˜„ ¯ ¯ ¯"@Ô,j5ƒñWù«üUYŒ,FTª*U•* ;£;£;0–K¥€.¤ éGçÑy€‡ÒC顯Õãêq5p­ýZûµv wsïæÞÍ@ÀÛo¼ H´­D  õ¨C$" ‘¹ÙÜlnF'·š[Í­fÿ­¼¹òæÊ›{jú”}Ê>%wÚçgŸŸ}~&˦wNïœÞ‰qv]c× žÙ5³kf0¥aJÔ _Û¯í׿s€èû©ï§¾Ÿõnõnõn ê»ªïª¾b$1’ ôeÒ—I_‹Ö,Z³h p>ã|Æù @¡Qh@µWµWµãú÷õïë߇øR÷¥îKÝøXª*¤ a?‡ Ø€ ÙÇù,>‹Ï"™5\ WÃ9ÔC† =‚ŒD“h S1_Ìó@_M_M_ ðÎ/ïüòÎ/€¼EÞ"oÈer™\~ÒR”¢¥ÀXýXýXý“žZ¦Z¦Z¦âĉ?¤‡¥‡¥‡auž–Uš+Í•fEôDOôø†8ˆƒ8¾•oB¿ ý&èÕõêzu§~7§˜SÌ)›ý‚º‚º‚ºéÛš¶5mkå·µµµµµÁzÒrÒrÒ)QQì$;ÉNk´k´k´@ôhôhô(ð[Áo¿%sJæ”Ìyò¥²3;³3`îsœû#Ø[5oÕ¼URöuÙ×e_SËõòëå×Ë9™,Q–(KlI²WØ+ì‘_‘½÷öÞÛ{@Р:$î÷Š{¯¸UŽUŽUÎÒ$|œðqÂÇ,aU̪˜U1äŸýýý`¿ŸøýÄï'@TTT¥]iWÚv•]eWCbH 0²jdÕÈ* [×­ëÖr™\&—ýýý°Ü¼~óúÍëØxJqJqJJ™·Ì[æýøE&b"&Z¸s0snoç¸ãÜq‘Ëãò¸¼¥´ƒvlµÉt2L\©¼Ry¥’…¶ ´ ´  xjÀÔ€©þ¹çŸ{þ9@iVš•f¾ð…/@dOxÂðÌõÌõÌæ‡Î: h2í3í3íƒìBí…Ú µ‚Z¢–¨%j€ô’^Ò»‡’HI"ooG>ò‘Ïû9ǹõÉ­O¦gz¦‡§3J‘ Ôâ\Kè:…Nç‡7ÞxØÒli¶´ŒÏå^r/¹×Ý’;w*îTˆò«^«z­ê5–@vd¤ô=EOÁîpØa#ˆ@Œ÷ëûõýzWÏ«žW=žrƒÜ 7t1]Lg|>!½ûR<4Ã^q}ˆëÆ¿$RçÖYQ>ªQjG:‰"Q$*aýÄ/Gm™=ÕžjO¥yƒ¾Aߠܲ°¼°¼°<¬£m´¶AÆÍáæps`2…L!Ò#AG‚Ž9f" ‘†HQ»Û<·ynóò£'š×i!-¤…ü!ggÿêêXNNNNNL®ŠÂy`RCNí¦;µ{È©Ýÿáâ¹x.~g94Ð@Ã}Ua¯°WØ…Tã1ã1ã1È8Žã8#®JԌ׌׌SËýÂû…÷ Eín{Üö¸í¹uÁúÀúÀú`ÏÁö—Ú_j pª]ïS ‹oô)`—ƒÌà§vËBJCJCJó×»¥¸¥¸¥ç Ož6<7žÍ:›u6Ë‘îœè=[½[½[½ñ}]c]c]#ySÖ&k“µTMÕTý—+ü&~¿i<&0"0"0‚ræûWç:þ4—`qqqqqqœÛV&a&!ÿa˜k˜k˜‹ÿvÌpÌp̨¤Ò@ià«_õ-ï[Þ·Ü»ÔxÛxÛx›ý×¢E7ŠKÇìcö1»(M¼L¼L¼ìC?vŒcÇ~¸)¤Šº0„! Ñé®8 %<ÍCð'öÚÕ¢ U¨rd³rVÎÊã:&žêŸ¯}¼öñZ:W\(.r·E‘F¤¹¤ :t>èüÊ8}‡¾CßAþ—>KŸ¥Ï²oq+œ€–?âàð'ö”v¯ G6v`vðMd ÙB¶\bU¬ŠUíJvŸé>Ó}&w[Ô#êõ<˜I÷Óýtêö¤¶¤¶$`Îx®ÁrüÏ8þ¿ž/ž·1©IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-11.8.png 644 233 144 2656 13755454066 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜcIDATHÇÍ–mlSeÇO»®¥:Ø–`B6±ŒE‰ˆ]­Ætl2Òñâ¶D£™Aq*1Á¤Ô‘¨$ý°`€ ò’mH:…€“¡‰:¤º‡ Æ1ç sn…½Ü·çç‡ööV§ß9_nþçœçÿ?÷>Ï9÷‘¢ÌSÀ½Ø½Ø½ ÝÏ;þyÏÌ{¦üpÇLpU»ªÚ …~ PüIñ'ÖUÛq;?w½ˆÃŸ«gû¥H‡ï¸ï¸+˜Á»`Ó#›™w_¿ßþNçN6œè8Ðq€aäÒÈ%€ñàxlÇí|{½Í—Ë/»þ¥/ùgòϸ~Ÿ×çÀÓ§—¾”Nøe)¬vý³7ònä)7˜7 TH‘¶[9ØŽgòíõ6ŸÍoëÙúézV.¬ðæðfÿþô‚«íðêý¯Þoëé@”(`¤Œ€YoÖ3 ªGõà¶ãv¾½Þæ³ùm=[?]³•–ˆÈOaÖ5F¶ ^k¾¾T_ ê{3`Ð3egXó­{­{Aõ©>Õ‡cã$If‘²t£Ø(F7†ô½T Í5Éš$ðWF?»•Ã""‚ÿºÿzÊÃékK®-ók9m­´V2••èâ'Àì1{Ì NœxNA“L2é@e(CÀ;D‰¨JUɇ2ü¡ÁÞÁ^ÊŸJy¸œ®'óÅb_ñWSCS¨Ö£6q[CÛö¶í¨Äƒ‰²Ds¬­±­±­kkk¿±"VÄÁ‰Ã‰öD;´¾Ýúzë먟ßðx³Ùªx£¯Ñgomì+aµˆHßv8úäÑ'ÁØ  ¶Ezë뙵[¤{º{º{ÚªÛ]·»n·ÓÓñ}ñ}ñ}s ï‹öEû¢P+‹•Å Ú¬NU§ ¬bñ·‹¿ev`âóœWÛ «¢«¬çÓõ¸eÓ‚µ Ö>ö¸È O4ˆ¨Ïd¥¬tí¯jXÿÞú÷Äx+ðfàMµZ­V«%kU{«öVí ŒF#"Ö2k™µL昮隮‰Ì¶Î¶Î¶Š„\¡{B÷ˆxÛýßø¿ßô—7Í›¦k¿H0ŒŠHEÁº‚u=î–×ò.æ]äa‰{îxîˆäï’åGÛ|5R))½Q:\:,2³gfÏÌG°>YŸ¬OŠ”¶”¶”¶ˆh!-¤…榭ÐVh+D444DÎÿÇAe&¯ªÍ«Í³iõ^|ư1 ´™š©ÍüxñàÚi§¸þWª~õƒú2Ó_ñ©9iN¢«³Æ˜1|dOþZO­Òƒ)wòß½ÿÊ»övq×ÞÇîÎìßCKÐᢵ2IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-83.png 644 233 144 2425 13755454065 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÊIDATHÇÍ–]HTiÇŸ™ÉƉ0\HjRÈ“”oÊÜ7Ò‚I¢º £B6Э i\l()”CX좭è V‚Õ’,–4[‡Á"*œÈÝ-•Å3çœ÷·3gÎì²Æ^úÞž¯ÿÿÿ~=ç‘ìäWÀésúœY ÛÙhû3weî*HØ=8ö9öM~k.®¹s5çª9eÛVÜÊO¯±ñÓù,¿d‹íp_w_wT'íh(i(Éü"aw>Ï-Ï­?u8zûèm€›ý7ûi‚èhtàcõÇj°m+nå[õ^:¾tü‹_2îgÜw¼÷J÷JðïôïÌÿ&‘0u»ëv¼s½s)'³ÀjV«j`¬ñ[šmÅ“ùV½…gá[|B@nUn•ì=°÷€§/Q0õœÚpjƒÅ¿ ²ô}À8dbÔ#õ°m+nå[õž…oñYü =òϽ=÷2™€ˆ?&n Cf›ÙFÜŒ«U€ÒßèÓú4¨•¯òS+†ù«ùÂ|©x‰jP (0;ÍNâüe<0¤á[|)~Iôex¢žè ˆˆð5˜çÌsÄ”N!…À÷œáŒ-„ &˜U©*U%0Àiñ{Üàp” \0[ÍVbh~’/şГÖ3ÇÚŽµ¥æ]ÊGýþÈ¥”ÒÄü&&& Ôj5Cøtøtø´­c<8Bh{h{h;DÞGÞGÞÛqõ£zªž¢Ò¶8Á—âOèI û®Í]›K•1ïÅñ‹–g,8 ÂÆž={ ¾«¾«¾ 6ŸØ|bó èôúW˜W˜Wõ}õ}õ}à›öMû¦á¥öR{©¥ ¬Ž¿¿µðÕ›?¡Ç)’5œ5\V.RUSU“Ü_qôIÄ©œJÜ–'^/—Š,v,v,vˆÔŒ×Œ×Œ‹xü¿Ç/}}}-Ò4Ò4Ò4"Ò˜Ó˜Ó˜#âôNz'Ebí±öX»¤ýÎQ稅ïè³ùzVˆ¸ê\u‹d„3«îw“y™—\ˡŴ˜ÑVi«´U"C;†v í™+›+›+©õÕúj}"Å-Å-Å-"{FöŒìÑüš_ó‹¸Â®°+,"g嬜‘<© ±ù$ãNÆÉq¹Š(ÈÎV×!º5ºÕ^j£ZwënÛ¾ôìÒ³KÏ`[û¶ömí¶¿²¢²¢²J<%žôôôÚñM'7Üt.÷\î¹Ü³4¾ÍŸÐ³äS1½[ï¶ÏØ|ç|ç|'Ôf×f×fCöTöTöìŸÙ?³ž‡ž‡ž‡ ¼±¼±¼¼ƒÞAï $ ¹-s[涤1M¿¢_YúŒ-}+­[ó 3ÌØ·RoÕ[õV˜];»vv-EF‘Qdj‡µÃÚaøàþàþàã•ñÊx•¶0“|âÓÿ¾•ŸícÝf71õëX*S9”#mæÇÕquÌ^³×ìQI‹¯41õ‰õ¬ ÏÆÿlûÎO²3ëÆCã!€Ùb¶§—ÇàB*C*ƒ‚¥¥`Oµ§Žú6Ð0 Òç¤Ïðöòö’Á µ “€vÚQã¹ÉVñž|5_á)|ŧøz ™>dº0Éü%¡Gî•Âæ‘›G*¾î“Ànv3üíþv-KË¢d¬ ˆ 0lWùj¾ÂSøŠOñôKÙ!„?¥@¦'Óúm€îZÿãîÑÝ£ANð'û“éîQ*•d¹In”A·é6݆1ÞÒJ+àWùzœG·æŸäŸòÏ>8Cœ!@‹âWKyQ!ÆAh{h{{o©{j=µÀÌ#cèÀÅiNEQ,d! A.•KåR“ 6Úh3ÙTPZV£Õçõûú}:z¢³ñ{j<5 øÂÆ š„âàeÉšùkæ+4ý‹[o¤ßH‡½q{{HO›ç•çFw£»Ñ U™U™U™¦@8ᄃ̕¹2×pÊ9Tp¨yËQ7¾n¼Á'¿ÊiÈiPK{ð²ÐþBˆºMpÆuÆ×ç4 o.W ÚEgFaÆÎŒ`ÛnÛnÛ ¥ ¥ ¥QrBrBr$N<œxØðËÙ"[ÀŸåÏògÁ²ëË®/»nô€ó¿TÆTÆÐÙ“½Jó–Þ-½«„ÕmúÄþ­ý[e¼q¿qýÚRmm3¶†n …sOÎyÏy!úXô±ècðpîùçÂÈ‘" ¢îînC˜>L¦ƒÎÛ·;oÃ Ç Ç ØŸÚŸØŸ@å©ŠÜ S%µ.o´7`ॗd™€ÁaƒÃô¿éÛò²å¥qìÛv¶®o]iÒ6¤m€)Ö)Ö)V(¬+¬+¬ƒØ¡±Cc‡B¾;ßï†øˆøˆøSÅJd‰,éé0üqÙqÙqÙP®»š\MŸÖÞ|¯ù(=BÒïn¿»² ºò»òáç û¯ì¿iÛR“R“ @ÇJÇJÇJˆš5#jؖۖۖÈâÅ#ŠÊWWWóÉÏ&?› ¾ _†/ÃÀ‰‰™3Ês¸ L{êðF˜*&-j¹\ ðož/Å—"W}™6±ibÖrk©µœ¡)¯)¯)Ï,ª*ª*ª‚ÔÆÔÆÔFx1ëŬ³`ì걫Ǯ†G‘"EùÓ<ÓnN» g¯Zwj±ÇôÏÛÛM{L~_Û{moã”t¾Kz—Ï,;fR{ =Ð||*}øð¯ë_׿®³˜Åð|ÇóÏw€¯Çëñ¦nòMÛž¶=È®Úw‡ÛàãÚÚ”µ)¦SÉÙúØ>&¼ïcÙ2›ù™#Ç€Ü"·È- 5©I ˜Ç<æõÔSìb»LÊ544ó¯H»´›úž«ž«ÿ×ÇÔîèT×ÙËÙ ø »Vž÷·ú[#Z³Öüqç§ Gˆ+VàMà®”ÿÈ;òP¯òõú ºé£%j‰@qœ§ þ÷—ø'{W~²¯‹Oö=öi¾`ÿè¯n×§% IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-0.2.png 644 233 144 2570 13755454065 14744 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü-IDATHÇÍ–[LTW†×0" ãà…b@¨Ä¤"b⃉Ѥ/Í oIÅðP[S‹ ŠÆ4ÚÔÔú` ¶iƒ¨ÜJ%&&*Aú4¨()ꌨ0‹rqÎ9ûëÃÌæ &öÙýrÎZ{­ÿÿÏÞ{­³DDdbè)‘‘áÚ…¶?zIô’Ô߃ö ««nï†Ø£±G&žtÚºcÛz^Ç‡ç‹Øøá|Ú/ÅvDUEU9rCö>X±:#ú£ ýã5ˆ©Ž©~cÀ–Ú-µ*.Tðô\ï¹ð2÷e.ضž×ñ:_ã…ã˾wøE ²!²ÁÑ Qc£ÆŠ@r^rÞô¯ƒ¦Ãò¥Ë—x^§Š³páR¹@?ýèÑfëùP¼Î×x_óiþ ¸q D`eÁÊ‚˜_‚ w~ƒâÄâDͨpýF?€¹Î\Ç0¨kê`Ûz^Çë|§ñ5Ÿæê‘Ñ{{xx¢Q‰*Œ;(«ÍÈ42 €ÙmvoCøÊ3Ö3V <¼(l+ED>ýbzbzúÇ0Ôù¦óÍþ礙‡ÌC ÏB† I't`Ó˜&È«¼Ê lb›Ââ P/Íeæ2Fð;û;ûa„?¤'$ìDí)Ú£Q¬,U88cóÝÿþþÎû;áØäc“M†îŽîŽî›×*³Ê¬2Û¾7õÞÔ{SáHÊ‘”#)ÐöYÛ¬¶Y6žzè tÿùlþ ž°¶ïàW¼Õ ¾  ÷íïÛÕ· ²Ó³Ó³ÓavãìÆÙ0ãꌫ3®Â³¬gYϲlA·ßz|ë1$IF’¹e¹e¹e´-i[Ò6h™Ö×7>lý¤ù‚üZ€ûŠûŠª‚žìžl0¿`Ô8õä”ï”ææÍÍ››gûs†s†s†áøŽã;Žï°ýçJÏ•ž+…âÒâÒâRÛŸÖ‘Ö‘Öå7Ëo”ß°ýæ|ýä×zƈ8—;—3K$ònä]‡H¿ˆˆøCG0îí·7ßÞqÕºj]µ22Üî w…ˆí÷ì÷ì÷ìÉXŸ±>c½Hfyfyf¹H|W|W|—Èæ”Í)›SD$KæÈçßš/².²NâDœ33™!bÕ[õŽc…±BÄñ (H¥–¦îLÝ)â[ë[ë[+ÒçéóôyD^?ýüõs‘do²7Ù+28epÊà‘ÖÅ­‹[‹d·g·g·‹äææŠÔÔÔˆD·E·F·Šˆ—³œ‘4_DÏ»gŒ£¡=¿h®1×0¬zãÉ'7ž×|×|×|Ø]²»dw øÆûÆûÆÃ¼‡óÎ{{/ï½¼÷2Ä\йs rrrÀ]ã®q×@åÅÊó•çí3fžzï{§*P• ¿á«¢U¬Š³¿Ùß ªD•¨°n[·­Ûàoò7ù›``ûÀöíÐ[Ô[Ô[¾G¾G¾Gðä›'EOŠ`È1”8”ˆë€uøõ«2¬:‡:‡ÂúØ6³ÍlcÀò«•Ö¯ªƒê PH!…aÕ @`Tý Ûë`m°6„õ1:ÍNó½}lTçöD&„:»ÙüeÅ[ñT«Tƒ(©§xÆSž‚z¡^¨@>< þTÕªT‹z¥^¡T•9Áœ@€ƒæ2sÙÈW4cxœ§^©QÿƒýW~°·‹ö>öaÞ`ÿ6 ævêäIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.1.png 644 233 144 2747 13755454066 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜœIDATHÇÍ–mLTWÆÿó D©Š¤H¡i5mâ.I ¤ˆ– &D¡dšM#]JbwcÒjbc±/Ù]»)-¬!C;Ql*ÑÄu£CU F±£Œ¦k QÄ.Lg÷íüöÃÌ;»É~÷|™üßžç¹sîyî‘Âô¯€»Ä]â.HÅîß;ùܺܺO¥â>\®Æ©Ã°ºguÀsÇŸ;nEœØ®ÛýÙó"~6Ÿ—Bqþ?äªIÇв¥eKnQ*þsò†ó†´Ýþ5À™Á3ƒ¼®=º°T³TNl×í~{ÞÆËÆ—Îÿᜑœ׿ÀïóûD tWé®ò?¦î—CÃî†Ýsž9r€¹䓯j€8qìõ4+¶ëé~{ÞÆ³ñm>›?¥G`Ýëë^=­{Zóþžˆœ„ÏxÞæÓ‡øˆ|0âFÀ|Ë|‹PaÀ… œØ®Ûýö¼gãÛ|6J³•–ˆÈ_vb6MFFÐU+_/ÓË@™Åf1zº ¬%kÁZãGããP›Õfµg%‰RX ¬×¬×Э_¯¯‚KáCsNs°˜æÏl弈HàsÈû>ïû¸—sÑ¢/€y€zÎX+@ÒæS+*¡@]te 9Á NÕTS•?ÍiNƒ6Ãf¸`E­h¯c6<È‹çÅãÞ”°Àçé¬o”Ÿ;Ú;ÚA°^±qû›ûÛúÛP·wß~ãößäâäâä";rìȱ#pïè½£÷Ž:uÕ£zT¨.Õ¥² ¿½¿³¿õ]åÍŠ›vÖzEý®ý~û}{kûF…m""7?€/w|¹ŒÃª-xõÍwß|—ûˆŒúGý£~xPû öA-llÙØ²±ÍF³Ñ„²­e[˶ÂÌØÌØÌ˜#DëÖºµnN'‚Ž\èÙ6²•ôc´™s'§ONÛÂn~ ü© ¾ ^…àñÐã!Ð^d [`hó©Ø©”,9Pr®´]i»Òw×Þ]{w-¬÷®÷®÷B¯êU½ 6E6E6EàFÆ ްåÐrh9C•C•C•Pú¨t¾tFΞ;xî Ógjs/Ͻ Pp¹à² ¹å ç[Ï·¼$¼ oB$§SîÈù©5\\-²aÇ†Ú µ"º_÷ë~=¨õ ˆæÑ<šGäÒà¥ÁKƒ"$H‘&i’&É,ß”oÊ7%Ò:Þ:Þ:.R|¨øÃâE´í}íýLÛO¢å„rB""žO/¹Å´†­a׌¸õ=úùµˆˆ¬³'4K35SÄ_é¯ôWŠL¦Ó‘òÆòÆòF‘³{Ïî=»WÄwËwËwKd42ˆÄÆÆŠèEz‘^äÕïëQ=*"ÿ”/ä‹Lz$ŒZ£VDÄúÆúÆ5ão|W|×䄬„χϋ¸~#"Â;¶®Â¿~\ø±H¢%Ñ’h î î î)º^t½èºÈšü5ùkòE*Æ+Æ+ÆEê–ë–ë–Eªz«z«zE§§§a«Wõ­êÉÉ÷<ö<-ýνãúmØö‰ˆÄkâ5“ΩÔ;u~´O¥yѼ±Ïb_žBiŸiŸhŸ8ï„QeTUð$ù$ù$ –Xb ¨ýj¿ÚOž<k»µÝÚîÌÅþû4ö)J»š<Ÿ<ïœJ®wììØ™}*ÉøØBÞBÜ ³¿Ìþ’Á©'i·ŽgùؿՂZ•«rUn–=T@@EUTEÿËh$²bT©*Íò1f¯Í^û¿>&‚J;¯jö4{çÇoÌó@Ÿ™4“ŽóÓG7Ý þ¡.ª‹À ?³Ä¨{ꎺÜÍ8ÿÛÖÛèøÌj³ø[ÆùýÍ~HS¶ó?»ßÊgövñÌÞÇžÍìà÷ÑPH˲qIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.7.png 644 233 144 3023 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÈIDATHÇÍ–ûOTgÆ¿ÃÅq„BMX/‹5©cµ•¦4U¶,7K¬4¤nçJ—ŽÅ6k ¦bl66!fwÁµj²Ó ¦ÕŒ†Ò‹q·¦\ÔxYaWmãH±eV…Œ 03缟ýaæx¦õðýeÎó½=ϼçœç¼""òxôW .#.#.%‚ãþhÆçÍ-Zv(‚h`yÉòÒå]Ú’Ú0ÿ“ùŸè?šØÈõ±ý"æüX>#.‹°vX;,Î(Þ •«+WÏýMÿ­lÇlǦÂPÓYÓ p´íh[ÁwÚwàžóžLläz£ß˜;_vÿŠ_¿NüÚò3XçXçˆ@faf¡ýíHÁ ÊËÊËnÆßŒWq É$+'àDZÆb°‘ÖýƬëÃ<´Ô÷jFÍ ´øà¢à"BÚBžÂÁÈ|µyÓâM‹ M/˜·ò;‘'>›ßæ÷'(Ý{Ê{ x€RP«Ô*Üâ6·AíP;ÔPšÒ”£`/{Ù ¬`+bâ3Ì0ó ©ve'¥å‹òG„=ñð?‘½Š76¾±ÑhÖŸþïpy94¯o~¾ùyÔÕ¿^Ýsu9~páàÂÁ…Ðäiò4yà‚û‚û‚ûỞz=õz*´¬ky¦åðŒdýÈŠú|Þ§ú§:\ܪ¹U£? oíykè=qúM‘œ/-Ræ*s‰œßðSúOé–ì¼ÃyƒyƒìËîsô9ÄRúŸÒË¥—EÎgŸÏ>Ÿ-ânp7¸Dº×t¯é^#âžvO»§E\®—ìû°~¿³ÐYè4çç\̹˜sJòKòKò!¯(¯(¯È̯ݺvëÚ­Ð\Ò\Ò\ãžqϸÇÌïOÞŸ¼?Ö¯Y¿zýj3®E/®ú’|I@0åDÊ ÕwúÉé'Ή|uú«Ó"•'«wWïæõ»ÿ=Ù=«{ÉOæ7æ7A½¦'!"ï—\諎U›*02odÞˆÌåS±]lÇõÄEI½I½0×ݨÛ]·hïjïjï0†1Œ¾v_»¯¨Ý_»¿v?ð¨ùQó£f@ç×ùu~ #ÔÁîÍîõîõ@W gWÏ.˜Ñ¸Î“óæ È\˜ª À¨ññ䢾E}€)SçÚô@bIb çc£¡ÓЩnÞ'ÕNN ÍUéêtuÎ8wàÊe‡²%_ÉWò“Ëä2¹€ù§æŸš ¨«¨«¨«Æ,c–1  Ò釀ÛÕ·«oW´ÐB €[ðÁ *‡9†g†gHÓô$ªWõê^@KÅR:@~D*R]₸ .,f1‹«×êµzdO²'ÙTÛ«íÕv Ý‘îHw7C7C7C@¶/Û—í¼…ÞBo!ô:ÉŸäþrßßpC>[BÍ¡f ª'Úclm%y1Rs~%®Š«Zv¿Ýo÷“ÞƒÞƒÞƒ±ŸlEãŠÆdòšä5ÉkÈJc¥±ÒHÜwÀM:J%Ž2µ,µ,µŒt®t:NòýÓ·[Þn‰ë±ÁúÎúÎXM ;r\¿cý’!’T`@¼/¢ürÔ=ºot:::7§ªՇ代;J*¥J©Ró §p '9<}Ø2l!•_•Z¥–’TN+§IvLòiü“zbsŒæAó`POv)]J·˜TW««9·ªXÅ*R ªA5v$QVÈ YAªýj¿ÚOJ»Ì“yqþl±Wìå¸ìŠÎ1[·äGs¹'6Çþ?ùYn,7’T£“ÿ©ò”¤QÙ l`˜°…-±ÉÏK¼È‹¤l•­²•äa⡸8‰—MJ¦’É0+.Å7ùE¹¾\¯}©Ï&ÿ{V~±·‹/ö>öeÞ`ÿ¢–fw·OIEND®B`‚routino-3.4.1/web/www/routino/icons/ball-4.png 644 233 144 231 13755454064 14353 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.1/web/www/routino/icons/limit-122.png 644 233 144 2731 13755454065 14750 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŽIDATHÇÍ–mhTgÇÏLÒ$“Ll’Öe¢!‚h ¶d·ù2™°¥ÅRwJC­«t7(­± ­¤A¢Iqµ­µÈJÄF©ÕÐÝ€ØÉKÇíV™Fh'Ó™ ‹S3v0š¹/Ïo?ÌÜÜÙí·ýäýr9oÿÿÿžÃsî# ""%™·€³ÜYî\¶¶ý/¼´¬7mwàxÍñÚÓGž<Pz¼ô¸9fÛVÜÊÏ®±ñ³ù,¿”ˆíÈ?“ÆáËØmðFõÕ Óöþapõ¹úèÐÔßÔp®ç\ïÂäåÉË3¾ض·ò­z /_Úþ‡_ž¸ðÄÇ¿ ?/?O–¾¸ôÅÊætÂx%¬}eí+99Ê Æ]À[ù€$I¬g:˶â™|«Þ³ð->‹?­Gà麧ëDÀÿ¦ÿM×_Óc'áCχ‹Oë:èÀ zROF#s †Õ0`ÛVÜÊ·ê-< ßâ³øÓzä¿gûéP y y€ Áˆq0ÝÚvm;šQ¿¨_P–dõŒZ¨‚ÖÃzÌoÍsd¾ƒ(zY½ŒÒéªTšÒÆ´±ù¢½®½®f†ß¥ˆÈŠÃ许+žÌ…XI¬8ÀcX[ª-e–süÌÏY„wÔuØÄ&6Ù~.q‰K`ÆÌ˜öñ ŸdÅÿbÖ˜5̪{i|ˆ-‰-f]7\7’¹–žŒ°®ØÒº¥˜0ŸW»µÚ[DZ¦co{ Fc£±Ñ˜Í3¶ylóØfè¬è¬è¬€«‘«‘«;ÉäFr¡ó©Nw§B5¡µ¡µY¿æ#¹åý-ï[£íÉ }@ó©§6Χ¿­ï«š«bnÃ?76ì:9tâ‰x"ž€Å_\|¼[½[½[ayëòÖå­ÐíïöwûaeÑÊ¢•Eà]ä]ä]åï•7•7Á?<#‘sŸÙÿå‰/OXÂB,\0¨Îðùíïngiªêѯ~…Ó+O¯8½< O“€à@p 8ÁÀ``Z[[íºÚëµ×k¯CýêúÕõ«a¯s¯s¯ÓŽW…«~ªú >=üÅá/l¿á·ÇÛÁÒ#PZ\Zl†aúÖô-àoéc¯N™‡ÌCY„µµpvÛÙmg·Ùþp]¸.\«®:¸ê xǽãÞqÐ;ô½b‘X$ê®ê®ê.ð5ûš}Í0{àÁG>ÊZ3…wgî΀¥Çî˜>ùÜäsÀß3Í7O˜'l5õ5õ5õ0ptàèÀQ˜Ø3±gbäÝÏ»ŸwÚT›jS`ô=F\ë¾Ö}­\)WÊ•‚ö²ö²ö2H^N“A07Fp3C01ùìä³vÇœ"I_Ò7ú½ä  ‹ÈCþäX­ÊT™¤2‡WŠÖ­+Z'â®vW»«E®<¼òðÊC­D+ÑJDú£ýÑþ¨È2×2×2—È®»vîÚ)R(H$Dú*ú*ú*DP#òêúÝëwóƒ\“J©tä[[åü…ó}çûÄQø»ÂŽÂ¦˜bJdjßÔ¾©}"ú´>­O‹8CÎ3$Rè/ôúEô½EoIíHmOmq :n9n eGŠ—|Q""üs#øNð‡Èï3zæ÷®I×d2¢FÔ˜Ÿà07š™ÍÚDsÖYúÿU©*çñÖ@4 ¸’®äoöXÖæ§!¿!0!³ùGQ Çh2šÐè'JÅ!ö³Ô)Õ«zAUPA ª€ ¥¸qƒT÷Ô=” ÅF1š:£Ïè3@‡…ßÓ<úÍælÿ•ííâ±½=ž7ØÿôþA×ëxÞIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-141.png 644 233 144 2362 13755454065 14751 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܧIDATHÇÍ–]H”YÇŸQs±Ò¥½i›„öÂVؽØÑ¦²/m*kh)‚–"°.‚ JÍ7–$¡‹ÁpWvˆX#´2'Œ± BD6G(Ѱeƒ2©˜™÷ã·3gÞ©YºöÜ ÏÇÿùÿÏyÞóÌ‘Âä¯@–3Ë™µ"ag±üy[ó¶~ûg¾¦ƒ­ÖVû÷ϰòêÊ«E׋®–­â*?/bÕOçS~)Ëa¿i¿i«NÚ`ŸkŸ+ïë„ýë8n9n½×àèí£·zºzºø æ‡ç‡ÞT¿©ËVq•¯ðª^z}¹ð¿,»³ìŽíØsí¹"P¼¥x˺‰„éu°³fg À\ö\¶™ú¿@f5°È"j½N³U<™¯ðªžª¯øBÀªªUU"°»~w½£3˜è†ÓkN¯Q|ñ[ÀE.RÚ¢¶ ûtQ0‡Ì!lØÀ²U\å+¼ª§ê+>ÅŸÐ#ŸööòfLo®7Ðâ!ÐgõY0 â'ã'‰›#æGó#&Ÿ-³Ñl4ÁøÆXm¬&#láµv­=µáï÷è{t%ðòæ´VŠˆ¬oGsÌ:fs R)úئÅ‹ãÅ| Ÿ9æÈ\•TR ¦Ïô™¾4ÿ npô!ý¾~,¼qÊ8ŇįÙSú”à˜wÌ/æ(=Ia×Á±sÇÎoŒï̦ø™økÇþ#þŒ¹ÇÜcîL}Ïï=¿÷ü=AOГ÷ð×ùë`lÃXíX­uâæ ¾RORØH#' †TúÚ/ÑÒh)уO­†÷oìߨ¿1“ØsØsØsܦÛt§5º¾®¾®¾. ßÑßÖß– Gõ» >,”°‘Æ‘W<,+—wž;/Ù_±uš&,²ã÷å;ÊE†'†'†'Dâ#ñ‘øˆ¤V›¯Í׿œœœñ–xK¼%"‘ˆDD¶¯Ý¾vûZ‘p8‡EŒŒWÆ«Ü.ß'øDªIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-33.0.png 644 233 144 3072 13755454067 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜïIDATHÇÍ–ïOTgÇÏÌÀÆŽ1i€VtAŠP[¶¶klZÜ5µÅ€CùQ ݳImöÕ&µ›°ÙÍÊ Ù4«M°£%Øׯ”jiJV ­ 8*?:£0@³ü˜™;÷ùì‹™ëeûø¼¹ù>çœï÷äžû|ï# ""éñ§€5Óši]ÃÖFs?ùõä×׊áãQ°¼eyëÇ?CZ{Z;€³ÓÙ©˜ØˆùËëELþåzƾ¤‹¹‘Ô•Ôe)Žã ¢ ¢ yu ÿ£RΦœ× éó¦Ï<'<'Ø÷¾¹÷ ÀÏÅ?ƒ‰¸‘oÔ|Ëùå£_è‹@âùÄó–1H²'ÙEàéíOoÏ>KðfCiIi ÀO¶ŸlÊ ÑJª*‚1ÖÌ2lÄãùF½Ágðz†~¬×k®×D`Wå®Ê”ŽXÁÈIø ムC/rh¥•TЂZ Z­!ªWõ`Á&6âF¾Qoðü†ž¡ëÇ傈ÈáßAùhù(è?D®j‘ìH6¨ Ú+Ú+Dâ*}Xÿ^ÿ´ m\U  TæšÆ‡ïRj»V¯ÕÑ&#ŽˆÔïcüP,s†¾1Ê/ED6”`J0˜ ôÑ«£W¿ð&¨gÕ³,0?(·r+7ÐI'Ë顇 –Zj—í¯g=ë5d‘ ÊT lŒóçÅõâúôÇúÿZ±o×¾]›¾ihr t Ú ÛòÛòQ7oܼ~óº©7xxððàahÛÚ¶µm+ŒÞ½?zߌë5z^câ[‡nºuŽ®:j=jEÜn»Ýfê©û^Þ÷²1Úã_K´_DäÚAèþ¬û3ø®Äû”÷)åNÿÛŠ¼y„Ê6”e•eAÞê¼Õy«áôäéÉÓ“°fqÍâšE(»^v½ì:dz3½™^ð^ñ^ñ^Y6Ѿé¾é>(ÚX´±h#^(ôzàWÿÎ~'ûBtmLSn8óá™Aý6ÖÕÒìxèxøüK"Û,Û,"ýþgüÏX:þðcK¨%$Iy/4¾ âªpU¸*Dücþ1ÿ˜H‹jQ-J¤ÑÚhm´Š¬º»ê"Á;Á;Á;òhu÷w÷w÷‹Ørl9¶‘¡C»‡v‹¤9ßv¾-Iç2?©ü¤ÒÒ!R*¥"¢úŸ¸öĵç_J°Ø3ìäKÊÒøÒ¸E¶/½ºûÕÝ2»ùÐsûŸÛ/®ªo«oWß ŒF#"%›J6•lYW³®f]Hi°4X ka-¬‰ØÖÚÖÚÖŠÈ^Ù+{EÂYá¬p–HêÉÔ“©'͆WžY9¸rPd黥‚¥™±ï´ï—ü×Vl+&_¢åŽ'Oª.½zŽ}ùqßÇ}ðÆ›;œ;œæH¶dlÉØ’…½…½…½På«òU™§ŽÜÚÜÚÜZhOlOlOåQåsþsþs~ÈmÈmÈm€ÀÎ@I ~ýϢʢJøbæÒÂ¥€ùŽùˆŽ;N8N¨.Qãërt9 X Ü¿Ùö¢ïE¡ô™ô‰ô ¨º\u¹ê2 Ï Ï ÏÁæ‹›/n¾Î#Î#Î#Pm¯¶WÛá†û†û†ò‡ò‡ò‡Àçò¹|.hjmjmj…ÔôT{ªþôǃ΃NBq7qç9Ÿæbýˆq ¸ÔœÐœ`ž’ðß‹‹a:ijij ===f¾¡p]¸.\SÓSÓSÓ ·è-z ¨:U§ê`¦c¦c¦ôz½^¯uAõ¨˜ýjv`v¥OGr#¹¦³Íï6¿ èñSÉÿïcl‰ùŠºùÈÇ*T j‡*Wå {tî5¢FÔˆÙ¨²+»²ƒ ¨€ ,ó±&h}V%«d•¦ÒXPó7ŽŽ¤Ì¦Ìð>f8ÈpÞ=¶=6àý˜3« Úíð¯¨/ê3Ÿ÷9ÀP_¨óêÏÉ}ï}î‘„ðW j]Ôº¨U!U‰Ç½÷毾 Ꭰ˜Þ2½u÷(¬>·ú@â…Ä úhy£~é|‘ÿR=#.  Ä:b¦­aü!TæVæÆ¥„ð§×ÀÜkîý¾9ð ÀåîËݼ ü´õ§­ÁFÞ¨7æ|KùåÃ_è‹@Ì·1ßšBìòØå"þFúCÿ΀²Ò²R€©eSËT=€‹Ú xñbŒÙ%ØÈ‡ëùŸÁoèú¡~’_O~]ʫʫÌ Mýš×6¯5ô½ÀG|„4¯æî îÅꚺ€ D°‘7êùŸÁoèú¡~"¿rND¤­¬óÖyP©ÚHà•À+ ß L&„;Uú¼þDÚœæÑ< êTª#2ž0ÅÔ ¤Ô­Uk%  ‰ ÿâëCëCÀkè¿ò;‘¬3`öš½Þh57vcì°€] 6©MøøŽ~úA÷èÝ8pàXÒH %”‰$’¸$nƌԤr)€Ú£öàãT˜?3¬Ög0ÔOxÅ:®«+6“Íd°é¿¹¿öÞ½{÷àôêSœu{ûíí··Gô†ª‡ª‡ªálÞÙ¼³y0qgâÎÄH^oÒ›ô¦w¼~¼ÚþØÖÙÖ‰úGýàÈàHD¶j[50êGôM""wìàìtvÂÝ¿¸?q¢j×ùÒ:Ò:ðÿ¾ØVlƒÌÑÌÑÌQ8o;o;oƒœÃ9‡sÖì-Ù[²acãÆÆ0uhêÐÔ¡HC‡Çáq@aVaVa”}\öAÙðZUÞbÞ"þ¡óêÕ«ZpN;§AÏ õ#ÁÆŸŽ?­àóûüà\Ý÷jß«Ðü;{½ "P__¹Ûr·ånƒÝ »v7Dòù ù ù p¦éLÓ™%+uÑwÑwÑ©›S7§n†ÆSŸ5~G¾~ÿ½÷߃ù„çiÏÓfžÏ<õhå+¿Pލe9Ë[—·’M‹¯ÖW+Rþl×ã]e®n¾.©.I$וëÊu‰˜ Ìæ‘{½Ç.â:è:è:(Rz´ôhéQ‘‘¢‘¢‘"‘èšèšèy1‚ÁŠ`…Hœ)ÎgÉù1ç~Î}‘Kú¥ŒK"Á Ì‰$L&LЍ±Š•ì(õµ¶OÛg1Œ9sRäîÆÎ“ä×þšß‘ß!R¹±2³2S¤o¡o¡oAć"Ê7”o()³•ÙÊl"kæ×̯™IoOoOoÑjµZ­VÄâµx-^K¿¥ßÒ/ÒÐÕÐÕÐ%²êîªÞU½"&ypD’E¤_úEHÑõAÓˆhkŒ=v%ûJ6\XéwŽ«Ú¨ü öì…¤ãIÇ“ŽCûpûpû0X›­ÍÖfH]L]L]„V{«½Õ3É3É3ɵ#kGÖpssƒšÎšÎšNX±¸â銧ðÛ‘Š–ŠüÏþ jÁav˜A]ï1> ¨o©o…«¡S23è¾ê¾ îeîõîõ(÷¯ÝëÝëÁßèoô7BÀpœ0=6=6=œà'@ŸÔ'õI˜ížížíý–~K¿ªGõ¨˜=2Û0Û€ ~¼X´X´äTÞ'ã Ãp;®‡í"âc`øJØgTšJÃ÷"’B ) vªjgd“«t•®ÒýìgÿÛCU {U´ŠP…ªŸ Ý*»ÔÇ~ûÀüÌüÌÍßþÏÇŒ ­„ãV»ÕêË3«¿-A ¨?kOµ§èâ&7Qtñ9Ÿƒº¦¾Wßà 3 x˜aÔ¨VÃÀt¨o®ê±z,u]ûYûh7œÿíè·£ÿ/ÿå½+_Ú×ÅKû{9_°ÿwBî/T#¡IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-8.7.png 644 233 144 2520 13755454066 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[l”E†ßní ›ª„&àBèbF¸ ÛÐ4@ƒ6-F…†T4$’¦ê…A!Z ñÀ…”¤ T,´ô¢¡<Ä„¶ ‚@ËB1<´)¶lKÝÝýÿÇ‹Ýé.Ôxás³ùf¾yŸwæŸùv’¤Çã¿Ï Ï ON,ö¼žèÏ,Í,-<‹\H)O)¿ü>Å_N…c ~¶,éSJÒœÏ!«?«ôB½£½‰O³Â8î+î+„øˆvÚ“ìg?ûbŠ)NêcŒ±û¼>G«¢U„¬>ôº½.Œóã~âÆN†6|¢Ï2%ye˜K.í½´vlÞ±yÇf¸¶õÚÖk['îØÍ¼›y7ó ~qýâúŰghÏО!hÉhQ‹À÷¥¯Ã×þ!γü¸Ÿ¸±óoCëHëDÛÌkvµç·ßt~ä7ä7ä7@¹[î–»??~þ|¸Ü|¹ùrsÂX÷îîÝÝ»aÑêE«­†²ž²ž²žÄi¼Ýèoô'vÓí°¼ßúätçt›6è_п¢ß¿§¿=ýõé¯aÚÔiS§M…]f—Ùe`¶¶¶Îužë<יȋ‹KÄû¼û¼û¼PÑRÑRÑ’$ü‡i3mÀ'¶#Æ·~Ó'é]Ë‹óã~ã3>`„a†'É%¨¥‘F D7E7!âv»ÝãwøÔ8obåhÿ+Ú×ÅCû{8_°ÿÞïÁÞ mÿIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-48-grey.png 644 233 144 6177 13755454064 16015 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü 4IDATXÃ…—kPgÖÇÿOOÏ]gÐH4ŒÃEH®F.’„eÕåÍd‹H…¤Jòzc×ktÉ«á1„HÄ•0ã›h4‹+!H ‚Y *^ƒNa±1 ÌÀLO?ûiL™JíùÒÕO?}ίÏù÷éÓ$33333L›yúÀ¬d{ض‡ÖdžÌ<™y’ÎÍ~”ý(ûQüêFݨۇÿËÍãæqóÂÞ™ªœªœª¤Q‚”  îâ.îxïàzPºNºNºŽd°Ù‡ìÛ%d„Œ‘¿ËòÎòÎò®kÍIÍIÍI%œ/çËù’„i¾ÉÅ¥af£…(æ4ŸÍgóÙ|“}Â>aŸð Ϯʮʮ:Ýk°Øj›­¡ÖPkhØ»ÊBe¡²Õa«ÃV‡­&âq„www„sẰ_¸_ð7ãßOˆ/ð|¬+ƒ+¨Šª¨ŠO!ȲÁ·Pä+òùÖŸøj⫉¯žs÷¨õ¨õ¨uîZ}wõÝÕwG1Èd$‰Ò i†4V¼‡÷ð°Â +€·ñ6Þð žÁ3°NùLùLù ÑØhl46RÇ÷ß|Àïzüòã—¿¼þÂWá«ð].snpnpnˆ+¤i4¦õ¤0+ÈþÉý“û'4¢>³ÙJ¶’­lü§Ýf·ÙmÏýQ»J»J»Š‹Ò§ëÓõéìiEcÑX ÅÌÁpÔúQ?°è@:ÌÂ,Ì0ŽqŒð‡?üÒI:I'8 aC`Í*³Ê¬B÷¹£çŽž;Ê¥t7t7t7°W$r‰\"¿w[Ç­ãÖ½”Œ—ð^z0ÆÈ¯Ë¯Ë¯â¹â¹â¹¹ÿ¶^°^°^xîZ½V¯Õs‰i©i©i©ìB£Ð(0‡oæ›ùféHG:X„#áQ%Q¤—ô’^€<&Éc h@À'ñI|Xg3Ȩ»Ô]ê.Ìük“´IÚ$.Qˆ/ð| 7Îsã áöóöóöó©/xè=ôzªÓŸÑŸÑŸaXè"ºˆ.‚Љd"™Hgpg²ž¬'ëÜÇ}ÜÇ F0‚r•\%W¦„)aJ‘Qdú1ý˜~ •à__§¯Ó×±§=’<’<’¨Nàø@hÀÿqD;¢Ñ@Ì­˜[1·°Zó…æ ÍðM|ßù‘üH~¨‘©JÝÝÔÝÔÝ :†Óq:N÷âF·!·!·! ŽŽŽ&W8 s¹ÇÜh ¤ "A$èQ÷¨{Ô@aqaqa1Бۑۑû„³SÛ©íÔ…o¾Yø&PMªI5N(O(O(³Ú³Ú³Z@H€/X, –ƒÀ#ðaÏèžÑ=£üÁÓËO/?½œ 6Áïàwð;(¥2*£²™u:R4R4RDéGE}TDéîøÝñ»ã)½Zyµòjå“}† /^ ´8ª8ª8êÉz÷p÷p÷0¥»Ëv—í.£´¯´¯´¯”>mÀ'ZÁ¯àWðÒççÏÏŸŸÀ U*H†zPê†ä‘<’@ $Àg²ÏdŸÉ€Ù³#fGÎ]Î]Î]À³{ŸÝûì^`ׯ^˜éRímímímÀ,Ë,Ë, p§çNÏ@±M±M± ˆrD9¢€X/Ö‹õ3™eZ'['['Á|$ë’uɺ¸zè¡Ï*acÙX66÷ÿê”uÊ:¥S«kѵèZDÝÊxe¼2–xŸxŸx¨&5“šI 0urêäÔI€égú™~@U¤*Rn^n^n^»œ]Î.ÆÆÆždÚêiõ´zâ½â½â½€´XZ,-Æ”ë²âÛ‰o'¾à£ˆ‰˜ˆ‰¹B¢I4‰>nfæ^œ{qîÅöIb$1’˜¯ — — —ˆºËÊÊœ;ÙAv„*Îçˆs`*ÑœhN4k¶¬Ù²f `[h[h[,^³xÍâ5€_º_º_:ð]Âw ß7OÜ‘|"ùäN²£×ÑëèÝå ûïï¿¿ÿ>€k¸†kóˆÄâ&ùøùñóãçŸK‹ó‰ó‰ó¡± ÇŽ''¹:®Ž«%ˆD mmm€çÏž;ÏO=?õüôIGFF€{÷ï5J…R¡TºAÝ nÖÛWn_¹}9¥9¥9¥Á· w…»Â}òe*¢"* û ˆÀ¶MÌôCtÉgò™ü¾¿ñ&ÞÄ›6Ø———FFFú¼ñ]ã»Æwñ5ÏÆ³ñ°a)–b)°DºDºD xö<ìùë†/‡r@§ÎSçKŸ_úüÒçg-–\K®%ŠêúêúêzN+ÑJ´-@‘GäÑ>žD’HÙ¶ (@ëãóœÓs#{€’BRxq+ÃÄ01»*‘†4¤1ÿ¨BªÀm644„‚Ü 7È Xø>…OŠP„þ ÔÕŸ¨7õ¦ÞïÃûð>3ZT]øüÂç>wXG¬ì©Bª*¾Îñ?âÄÿÈ¡zd! YäŸèD':¹8aU¢½èåZ±Û±T.©XR±¤¢àϲ²²_猸¸¸³æsêsêsjçN! YIV’•˜B)JQ Àl¦ç3`>æc>(SΔ3å^2]2]2ÑØkž×<¯yŠ ”r¥\)0i/µ—ÚK÷|Ðú~ëû­ïÔDMÔµ+ΗÌÌóO[)?‹ŸÅÏ‚º¥¿¥¿¥°o·o·oßóÒMé¦të)½[u·ên•¨ æõš×k^§±d+ÙJ¶BÊŸâOñ§@…’ÓQ:JGÂŽp° šMƒ&|]RRµr@9 øeü2~Ùž¦¥÷`Ò%Å#Ó8Ô5éCJ„J¹~I¤®SW‰D¨E-j;I‰"Q±žþå¨ÿ—c³c³c3ÿ×õüz~=Ϭ ÊÊÊÇ:¾oçÛ¡`™@&S\—Áe@ZäWäWäçôˆˆˆuÈBd!²‚åÓ/Í®+¼7ðöˆ«²*–“““““‹Q¸f4äÒîN—v¸´{þ7ÚuT9ªÜfó1ó1ó1(†a£B&êlu¶:o}`x`x`uÈöÉöÉöµVOõMõMõí;ÔñJÇ+¯.@­ÐOÀ™o*ž²§6(\~ti÷_¿Ñy#óXsYfYfY¦s§k¢WÝîFw|Ñx½ñzãu’¢hW´+Ú^Ëkyí_›Ø7Ø7Ø7lÐEè"t̰+ÞŸ\GÛÓ\"üŽEGGGGGƒs©„J¨„lX<°x`1þß¹À¹À¹ ™“ê¤:©îµü÷KÜ/qîæ6s›¹~ÜòeË—-_:WŒ;ÆãÑvñJñJñÊÝ>ô=F©†RHEÝÆ0†ùg„ ¸Å=ÍCð_ìw´›Ô Æ™E+i%­Œîœ~«ÐM®\;¹–_,6ˆ bÓ&J¥‰Ò¾oð+÷+÷+6uš:Mä;Þ‹÷â½èq—ß* õ÷8ü{J»®váÌÂVlÅVö&I%©$õß~´†ÖК¿¿-_(_(_È´‰zE½¢Þ¾…ü‡ü‡ü‡›ûÛ“Û“Û“i@sVéï•úiûð=êôY²IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-56.png 644 233 144 2504 13755454065 14674 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜùIDATHÇÍ–oHTiÆÏŒšŠ1MÒ&F‘ImKEMcÃÚÈ*,›ÊÆ@¶Y-ņ…±. Û’h]ûc¤˜¤I6kÍ‚²² ;*hèöÇIÛœ{ïûÛ3ïÌm)v?z¿\žóžó<Ï=ï½ç¾""âŽÝœËœËœ®(v~ˆ§§¯lŽâË&8Êeï`Á…6.l´ž%°^×ùöz‘¿]OÇÅ-‰@jkj«£(†OÞü=ùiŸEq½ÒÛÓÛ§ 8p÷À]€;Mwš¨†±'cO^½*‚Öë:_×k>;¿œþ—¾¤ÜK¹çøRç¥Îå[–oÉý&šðG.”l/Ù0š4š¤œ`N󙯊€0aô5iÃz=–¯ë5Ÿæ×zZ?êG`Qá¢B(-/-Oÿ9Zðì]zt©Ö‹´g9Ë|0ÂFÀ¬0+xʧ|8p@ëu¯ë5Ÿæ×zZ?êG>ÜÛ¾„]i»Ò òÌ€[yV³Öl1[PæZ3Ï̳Ì,5K:ê¨õ½:§Îñ›á3|`¨ •ëŒu†ïÍn³Pš?¦×»¡Õ?AúXúX8†Ì!SòXUV3ŒÄš7Å@„W&™d‚ © Ùâ?F ³Š2Ê fp†¿5L/®õ3vùWðžòžÒlÖübœ7ÎÇéU¤/Òé…ö¦ö¦ö&¸Tr©äR 4T7T7TC¸?Üî‡Py¨•IY(^ÃÆ°M/®õãŒömc‡È¦šM5±6ŠcÛeVfeV¦CÓãÓã"ÞÍÞÍÞÍ"]¯»^w½é öû‚"ÏsŸç>Ï©¼Yy³ò¦ˆ¯ÀWà+ñ¾ó¾ó¾X2°d`‰ˆ#I^È q¨0׸¦ùë>Ôߨ!àêqõ¨V[?¶>ñdV•¹Ú\À~Ÿßç÷ArArArû‹ýÅ~èèéèéèÛ·;owBÖÞ¬½Y{áྃûîƒm'ÚN´ÁËU/W½\eëÜŒÕmuÛ¶<®õãI*I*a­HJGJ‡v,ÉJÙ*[ãX¬§ÖSë©HeMeMeˆ'Ç“ãÉ©-¬-¬-¹Þ{½÷z¯H¶;ÛíY3°f`Í€H‹ÕbµX"þ ?è&øøœì°éÅõ£~œ"V§Õé1v;㉋$UFd$Aô¶÷mïÛ^‘LO¦'Ó#R‘]‘]‘-’u8ëpÖaÓi:M§ˆ+ß•ïÊ988q\W@$h a3–‹BÙôâú1?Ñ—í÷¸õæÖ›x£«Ô·F¶‘Í{‡ Æ7 ƒû˜û˜ûxxxÀ¬{Ö=ë†ýÍû›÷7CFcFcF#ìÚ=´{¦’¦’¦’l;ç0n74¿ªJèGý|ú«Ôƒñ !B±áD#ƒ‘A˜È›È›Èë¸uÜ:n{7G­Qk&¯L^™¼fYgÖÙ =cŠ)”mð~ô«üô›ŽÏ±«ÖUf”_…UÔVU¤4j›Ú¦¶:©Nª“ V¨j…m}™Z¬ƒš!‡ë¢u‘fþ×ûÈä'6™ ó‘ùÀª±jˆPÏ}î£ÔCÕ¥º€ë\ãš­#í´Ñê±z¨ øð¡À:b!’àûÏÉ?gÿ•söt1gÏcsóûaªÝNÿÓr”IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-92.png 644 233 144 2513 13755454065 14674 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[LTW†×Œ\/…`© 8^IÅÄñ2cZPÑEÐ'J iàa$ÆÄb"‰•tLô 4)¥ƒŠˆA¼”Ð&N D©R‰€ ´H¡ Ì™³¿>ÌlÎØ”ö•y™ü{­õÿÿYgïu¶€ˆˆ|ú°'Û“íkƒØþ¥µ³7foÚA|5¶ƒ¶ƒ}_úËë.Ä5Ä5˜Öq^/bñ‡ëéuùH¬…èæèf›3„ÏÁáM‡7ŬâÚ‡{+öÖ_”Ü)¹Ðr½å:_ÁX×XÀ”sÊ Öq¯ë5_8¿œû‡¾Dz"=¶ß :*:J{{RË‚ ¿¦Âþœý9oV½Y¥ì˜V³Z9fпÉ0¬ã¡|]¯ù4¿ÖÓúA? »v‰@^A^Al}°`à{¨HªHÒzþ[ÀyγŒc P(bÔCõ6°°Žë|]¯ù4¿ÖÓúA?òỽ ù1ù1€ðÿ„?p?pÀýbÇbÇf"àEàE˜à 0/˜˜Ss¤œå4§-#œâ§@EªH ÔRKmXüª¨5Å6˜5f sÌkþÞ’~ÐOÈØÕGp¢òD¥f3?cÊxm¼âÉ #ø|½®^W¯ ÜYî,w¼t½t½tY>|¾Ô¥Ô¥Ô¥€7Ó›éÍ ë¨"PüiŒ#azKúA?ö`ß¶¶Šì<¹ód¨bËT&-´È¢ü!½Ò+¶¾'}OúžˆäÍæÍæÍŠ4íhÚÑ´C$?*?*?J¤½»½»½[dßü¾ù}ó"­ã­ã­ã"yÛó¶çmévt;º"¶ÅClª‘C’E­÷¡þÖVµk;U3ŒmÛb=YÀiDÑvûÝ~·¶=ÛölÛ3kÝ9ëœuÎBöìÙ7 &·&·&׊§÷§÷§÷ƒ»ÇÝãîYžßÒúˆ[·Æì‡É‘É¥Ö2©šYf–U6T?T?T›‹6m.‚WŽ+Çp­ìZÙµ2ðÝóÝó݃ôÁôÁôAp–9Ëœe0wqîâÜÅ0‘æ´9>f´~Ð]ļkÞµõ‹Œº•’À·”P²„eÊ3å™òˆ¤ùÒ|i>‘ÜK¹—r/‰l,ÝXº±TäùÎ|gŠdx3¼^‘#åGÊ”‹´´´ˆÄxc¼1^y#Ã2,"C¶v[»¥géýØEfœ3Ξ_Dt<èÐyÛƒ ê= ’Ú•Ú•Ú%200 R5R5R5"R\X\X\(w&îLÜ‘ÉÄÉÄÉDϰgØ3,’4‘4‘4!róØÍc7‰H²8Ä!b>2ŒÍO±¥ò³ì©Ôƒ±^z­S¹˜¼˜¼˜ ãñãñãñÖ›YÈZÈZÈ_›¯Í×£öQû¨FËGËGËá½mÞ?ï·'ÆãÊò§rù9ö~iŽÕ™u̱'NPŸ«ÝjwØñw(‡r¥”R¶‡üø Y`!|“›ÇÍã¡)ùÿsì_&?¡Él:f…YŸóÜæ6J=Vªâ¯€jª©õ£jRM ~VÕcPͪOõ¡¨L&ðCàyà9Mÿçä_±ßÊ{»X±÷±•yƒýB*÷yIUˆQIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-60-red.png 644 233 144 4231 13755454064 15600 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜNIDATXí—{PT×Ç÷±¢@º–躈ÆWU‚Ú+,8BÑL@Œ˜@´N:µŠº>2NˆQ”Ù¨L”é CE›!•™6´ 8i#Έ² dÒ•eïÝóí»çN§ýýs÷wÎïñ¹ç|Ϲ³D›H&®±„XB,Â?½áãêÆÕ«Kÿ¹¬Êª¬¶¦xЧxÀ3ÍÌ$“L2÷@Ÿ™y<ÏçõxýÀ~âŠ@¾* ±&p~Ê<¹N®“ëj„Âa‡¢ŠŠŸ×Þ[{oí= »;»;»ÈJÊJÊJòù|žÇó|^×çýžÎCâ/ý™'ÅÇâcñ±-ž¯Ð´üiùÓòÕ]åMåMåM,t¸¸¸€ ÁFØ`ƒ Ð|ï<çù¼¯ØoæÉ§ó‘á9±Gì{lá’®&]Mºªü¢ÓÕéêt¡^c±,–ÅBQ ÕBµPÔ5P3ÕL5ÓÏ÷ÎóxžÏëñúp@ÃsšP#Ô5Dòùˆ|¤ê6O0šf£YÉÔÀö°2V†a¥ÊuÚu`6%J‰0¦PÖc=7mŒ­d+fs}íúPªœ×œ×¶‡-gË1ÌÃŒfãaãa%“÷ç<œt]º.]WÆb`(2ŠØ,ëÖNk'½u†Õ£Ê8e°‡ì!àk¡½Êv`†˜™™¡ý÷xõ¨ë’ë’æ[°Â Š ïÞc³8Æ'o“·ÉÛZð‰Ò¼Ò7Jß`oy 8”רkÔ¯ƒspÏà8“q&¾˜üÅdp6;›ñ#v¿ñ~#|zùÓËœWë¯Ö‘(5J˜¦;JóJsJsØ[ÚÊð³G,ŒX±æôã€QKTÍß¹ûf÷M˜¾uúV÷ÉûÏ=)/¦¼èx·ýn;ÄdÄd@XKX‹_üpÁµ‚k€VßÛo } t à<œƒ¾¿æØšckŽùÞLí‹‹`çC›÷nÞ ó,ó,þµ¿Kø.ôè?€o²¾É€•+`Ñ»‹Þõÿü¥Ï_ò¶ûö·ojg°ƒóp>Ù{¤æéÒtiº4팅ЩYj&¢¿ò¡[oM$"šQ8£ˆhýÄõ‰ˆ”¥ƒˆèËU_®""Š7Å›ˆˆZ¶·l'"ÊsEÿ›%ý“ôOˆˆÈMn"3öf,Š¥X"¢"O]­®VW«ùyÞøcOSOSOu:Å'ýOúI’~+$~=6FD»^éz…ˆ¨ùýæ÷‰ˆð>""êšÓ5‡ˆh•n•Žˆ¨í³¶Ïˆˆì÷ì÷ˆˆ¢š¢šüAÝ•îJ"£DJ$¢û££Dâyˆ7H²Ûì6»:9‰™b¦˜éêó.±ù_U|å'ñc×Ç®ÀôëÓ¯pîîÛÝç¿KC‡‡€pK¸&|˜KF–ŒÀ;ß9è¯Â¡sCç€6Óf@=[ZêëwùøÅÖ‹­Úð7Bœ'ĹúHZ"-‘–ì/æ§,:&úùèçÕ™Öuއïú`©¯žxõ$®K\€ñ©VÖÊüÕeýe=l­ØZ1-1-þê+XþÀ¯xüò;åp:€Û¸ ,Ü?ñüÅní M‘¦HS>¤ð´ð´ð4"ùŠ|E¾RÝ£]øY©«SW«;y}·énÆÝ 8a™42i€ƒ7âÏ×Û^oó_é%J`&ÀðdšLåä÷Ç{—ï]î{Ýüy‰y‰n‡¸EÚ"mù{ŽÇŸ`§@›vJ§‹ÓÅÙ*x‚©pWö®l–ªíÜO¿—¿—Á€JµR0Üp®á(.Å(E©¯³÷dïI8}ãô @Íkßúžy\3»f¶g}‰±X,‹GÓ…(!Jˆš_(ÝÒÎ×Fa£°ñå2¡Z¨ª¹VÜ¿³4X’-Éà“CÝé^à^àÄÞdoL0`¬yVx,•eG}Rê©îîíî¢ÇÎÎ+Û´•<(í—ö›ŒZ&eR¦lð±&S2%Ë©†j¨†H²K}Rß®óÚ§µÌPh(TôÖ}ÖÅÖÅþÚu9\-W¢ÒO»\ß6ƒÍXŽ«ÛÕ 'OÜp}Cö†lu§ö‘ûå~Ë¡Èí‘Û#·‰FÑ(…³^º<Žæ}æH¤Ò¡~ÖîY»gí&Òåëòuù–Cšv“ÉÆdíºMnœ°À €Gx„G¾…VçªsÕ¹>-–,-YZ²”¥òz:½N¯Ó÷Œz|ÃøÀ.m= Anc oïÑ®õ¬O»¦BS¡ŸvõŠ^Ñû€Ü½î^w¯O‹íhG;`™Ð>¡}B;[«i2\ Ã_;$ÅSA|!ôô©$H»kD» –Ÿv•¥Aið)÷Iä“È'‘À‚¡C †Ô9šk¥Z©öÄ2.5¯ô‚BÏ0_/àÓ®]²ûi÷¸á¸á¸¢·V[«­Õœp‰!Njª7Õ›ê}׎\&—ÉeíÞ¿$Z‚úzÇ)ôY€ÁÆ^ój÷OÿI»)«SV§øÝ»–e–e–e¨ôÌ3m'„\!WÈ}y`ñQP_þK{–vWHÅR±TlKàÀ¹E¹E¹Eì÷±c±c±cÊß´­¶KvÉnšFUTEUä½v$kP¿ú-X»‡ý”ûÂ&a“°  •´’Vº&N§ŠSèRc´#Úí ’Z¥V©U¸èMÌ Ú¹ÿ›éµ_i”FiòíÀé}y"™Èá‚pA¸ðéžñÙ– é ªûÌ­þO›<¡´ýzÏIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-6.5.png 644 233 144 2566 13755454066 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü+IDATHÇÍ–]HTiÇŸ¿Æk³ˆV1LbÁ ¶‹.*-Œ+j+”)\J5#ª-¶.ºiÅX샔BvÙ£†‚ „DœÕÚ%J²ÒVqÙHb&3§õkÎ9ïo/fÞ™)wï;73Ïó>Ïÿ÷?çÌûÌ+ ""ó¢Ÿö{ŽÝ‰íûãyG‰£dÙÏ‘ø¢ ¶í¶íOŽCfsf3Àü+ó¯XñX¯ëúÄ~‘¸~"OçežÄi×Ò®ÙÖGãS°k宕ޅ‘øûnH÷¦{ÿ1àÀÍ7n´Ýh£F{G{Þ¬³â±^×õº_ë%êË©ø"r;å¶mÒRÓRE wcîÆ¼ºHÁŸyPº¥t À‹¤IÊfÈ C­B„ÐW0!ÖëÑzݯõ´¾æi~Ä@Öº¬u"°m϶=é—# ?Á¡ìCÙšö§9M!#`–›åÌ€êVÝØ°A<Öëº^÷k=­¯yšñ#ï¿ÛÆ °3mg0îPŒûÆ}ÂFŸ1kÌ¢¬¿­!kˆ¹×¯øðùyÌ<fùµù5ÊÜ7Û=ÛM˜-æ~ÓoBŒõ5vÑU'ªNÄš¿P?†Ï…ÏÅÔÔPÍÐþ¡ýÐØÚØÚØ *T>¨œûÀÂáŽpxÛ¼mÞ68_z¾ô|)\úý’ï’^?y=þzŒ0|áÅù?öÈsûê–ÈÚ†µ "ü!"bûÒæI©I©‘Ù±åcÙcÙbÛ×¹¯g_ˆoÌ7橚®š®šyœü8ùq²Ä®P¨?Ô/RUTUTU$Ò‘Õ‘Õ‘%Òcëqô8D&:&š'šÅ&"Ke©Ì²=ÂÓ|íÇ.âêru¹W‹¬+^W,¢¾±]ŽV¤Ýé½óèÎ#‘a–aÉNÍNÍN))+)+)Y²{Éî%»ãÆü“þIÿ¤Èxõxõxµˆå´œ–S¤(·(·(W$¯!ïDÞ q«5#i¶:Í‹ðµ»HRiR)")·Rn‰HHDD^k‘e,4Š8\—Ã%²bpÅàŠA‘öP{¨=$r¯ð^á½Â¸1Ãm¸ ·HEeEeE¥ˆ§ÐSè)9Y|²ød±H{C{C{ƒˆôÙv‡ˆÖ¼(_ûW—«K]ƒÑU£«Àü`§y¯yÛ½íP0\0\0Ï»kݵîZ83pfàÌXuVU^§×éu‘eG–Y¯_íZíZí‚ uj/ÔÆóæ^ý-Â×~¢?þ‡ põíÕ·@€ú†ßÌj³šÝVv½ìzÙup.w.w.‡ò‘ò‘ò\<¸xp1¸[Ý­îVè­è­è­€5×<\ó2ë3ë3ëÁò„‡O_ˆÖFkGªgèÇýÄÝ«‚K½—zÁîÐ_Å+Þ>h~Ðø ¼Þ o,8¹àä‚“W™W™W Ï–?[þl¹c¨%µ%µ%¼µÞZo-”ªRUªÀ;Ë;Ë; Ú7·¯o_?’þV'½˜¾ñ#0¶alƒ®ƒ®ü®|PŸñÎðE}_ Z Z Zøœ7sÞÌy¾Ë¾Ë¾ËNüNÆ; 0yÚäi“§Á û„}†¼æ¼æ¼fh5›ƒ®/ý«y‹é?‰"£VZÅ ÏuÏu‘Äñ""Òß‚Rt¾èBÑ‘áêáêáj‘¢ÝE»‹v‹´-j[Ô¶H$© © ©@FF$?’ɉ!‚Èí³·ÏÞ>+‘ßå–Üròå£Ó7~Eìö„6«Ø*á™hêÂ7Ã7Â7DrC¹¡ÜÈÊ#+¬<"2áÕ„W^‰dwgwgw‹è ê ˆ›››HîŽÜ¹;D®n¾ºùêfO‡§ÃÓ!r÷Ç»5wk_T½˜þˆŸ÷÷˜nw…3Ãiá4(,/,/,‡¬ÕY«³VÃÞª½U{« ¸'¸'¸fÔϨŸQÏ=<÷ðÛÅv± P²¡dCÉèù»§©§ÉµÇFô>ØcïJsJ~³~±~qNQ$;’É„à¼à¼à<à0‡9 öSû©ý^V¿¬~Y z®ž«ç‚𢦍)ê õ…ú@}£*U¥ÃÇ«Éjréý÷©tõ±7À€Óǘ¤ªTCú ½Kïrõ«£s€MlÂÕhu·îÖÝ StŠNqŧë5z 耚¯æ»úØP /Ð÷¿}ÌÕù)K)K¬xgFµ«và ª Q}W¿Ö¯Ñøi¡xAˆè6ݦۀA‚ÀNsôú¹~Žæ„VÃDAµªV7\ïÃÎÿÑþ+?ÚÛÅG{û8o°ÿþë#…ÄÖmIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-27-red.png 644 233 144 4212 13755454063 15601 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü?IDATXí—mLTWÇÏ}]ìm Ê ±º®+•õ-]q@]´jšqIÅ(q5õCpll ¸"TØJS ¾4–ÀŒNZ|ßjF+šf«FÚº–T *Û”‡æž9ÿýÀœ;wfw5›Ýóeîsžç<Ïïžó?çÜ!d´M aML×Ûõv½]xìˆÓ2¦eLKö|™ÊT¦m‡I*I%©À¨›í%2‘‰Ìm Üf{y<ÏóñüáõÄôp-_) ¢-Ü÷¹En‘[lýB¡P(ª †ØØØœ_}oõ½Õ÷€5×<\ó°˜,&‹)ds?çãy>žŸ×{1nOýTÅÁîT>C ù ù ùt{õ†k ר8wŸ»ÏÝ@‚  aCºÑn@µƒ~ÏÇó|<x½©Ÿ¾˜Ç‹=bØÓýWžÀÔjj5µ* ºü]þ.?ºl,™%³d(´”–ÒR€Î¡sè€æÐš£±ƒ~ÏÇó|<¿ Vß8^El‚M°"WÈrEã÷|€y¯¹Ê\¥ä¨`°ìÜJãHýH=Àºý÷ý÷ŒÐZ°À €Ntý~`„&Ñ$€u+iJ 4z›¼Mû 0/0nžß¼×\l.Vrx}ÎÃùˆîîîÁ~ÇŒåÆrc9›æzâzàz€gÁÇ3c¹ñã'lçQùä­òVyëõ î8¸áàúƒëÙ{ÁÅæ?ç?§©àk¿Ô~ Žœ>rN­<µ|K}K@ÉT2À!9$hÞØ¼lߨ¾à³±€æŸšÛw¯|÷ŠšÝspCÝ”º)ì=ufÃøëMŠMŠMÂÞþìþìþl@ú  ‘¿óÅ-·€xK¼±b£ç¤ÏNŸ OÞxòLuú«Z¿(‰Œ»3îw°?±äFÉ TéÏ~üóãŸÎÃù8è¾UÕ«ªWU‡ÞŒvùwúwèå]éé`zÇôŽv;r;rµ@‡O>¥õ÷ÅõÅií}»÷퀙I3“ôö_é¿Ð.m <œ‡óAqÒÒfi³´…$DS‰JÚ±»í:'_;ùš¶ÿ®xWÔ‚~Q÷EþMë,ì,1ALG‰£À`°à®‘F> Õ·¤YÒ,iê¹}’ÏhÞüÚùµókÑ鼂Wà€0ü‰Ýaw´›AyKy >ný¸ô“õ“ #&#¼‡½‡€¥²T-躒u%°lpÙ _°»-ðcàG€¥0‘‰`<ÚcŠ1Å “ó1GÌsüùUw´àhÁÑ¢øã÷¾ À—Ú–Úú¯õ_@µ£ÚÊ9å°rV6ãÛïn×̸röÜYÍæ¤'FZGZCõ.×\®¾¬.9¶)BŠâL¤¹Ò\inq%ße‰SŒc€Nuý±ã«Ž¯Ôn–¹¾h}ww`÷«îWižÏ~>† /Ðö—¹ËÜðzñëÅ<ŠI1X®¢><~H*N*N*¨€'ÅIqŸ=#ÑYÑYÑY„ÈWä+ò•¦õÀ·,Ý¿t?-ÜîF `5$áƒ]Ü,nàÑ/Ó/±MlÓj´!¡!A úæŠ7Wp¯L[™ð“9ð™?ÊZêü›ù7óo<*àfi³´ùï¹£öX¾ëyK¨Ó¥È?È?tᬥÎ'Ë®â*%¦6P0àX̱îÆ³gàÐùCç cyÇr §ïËé_N€ÛnO膰æilhÀrõ ­+ÅJo¶0Q˜(LümC tK½R× 6Á¶¸^h& B„©ÂÔÀûvçéîÓݰ«Ú- l lÒElr ª13Ùx6>$¥ž¦GHŒJÔ'ê•­êL–IeR™Õ¬¢å’#C¬$ƒdÈeÄFlÄFˆÔ+Ý”nn?­^­õ R‚¤\;;¼^­výYþ, q4cU¬ €'a§é4`¹t ]zµ7Ö:×:i‘z ÉCò}Oü¶ømñÛÍ¢Y4 '‚t8毂¿¹R§Ô)u g¦í˜¶cÚBtùº|]¾}ªÝ s†9ƒñ‚kÀ°Â;ì°xЧxªÙÕ3è :#¤ÅÚyµójç±Lõ.7è :C7øµ¾ÒÂ…ˆ¥'B„y5Ü6FéRt)º׉v­¥ÖR–ɃbP ! À£À£À£ÛG¿eìcÛǶmg«UMF‹Ñbô»Žb]Ÿž¼¸CªÕhw°nñj¡Ihšø9xßî´;íÎv§âTœ!åÇÇdzf Ì ¿Vµx\:.?°K-(½HÀWÈKZ(€'i·WêÕh·ÆXc¬Q ®&W“« €>ø0ÀI­g¬g¬gBÇŽ\/×ËõíÁ¿$cÿQ7ØOƽ 0²ñïµ{ê?iwÑŠE+­i׾ооÇFýL] !OÈò‡—ŸFÔÈÙ^¦Ýt©Rª”*»çpà¼ò¼ò¼rö—ä‘ä‘ä嶺ԽR¯ÔkM ¤‘4’à±#¹"êéÉÿØ"µ»'Ü^Ô!l6 ²„,!K3ÅIâ$q äÒÕDO¢'ÑCˆt]º.].æF¬Üÿ­Ô§,’E²äïÃÝ;7ˆLd"„ ÂáÂ?&öO·G¬LWDÞ—.õ? ðáõ²ÜšIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.png 644 233 144 2062 13755454064 14602 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜçIDATHÇÍ–OH\WÆÏã(£hw‘@ºq1¨KÅ I!“RÉ¢tU‰ 4 iD$›DJ³P"!FEQ‚MgᢠÑD*‰#:ÛTgÞ»÷×Å{÷½7ÍF»òlçžs¾ï»ÿλ""’ï~2Š3Š3ò?ã[<».»îË_ÿ¡ ¡ÆPãÒpvðì @ÁpÁ°zçû&nòƒõ">~ÏŒK¾øá‘ðH¨ÚõïCsisiöŽÿÓ<äŒåŒýmAÛ‹¶ÏŸ<Âw‹Ä"«?Vƒï›¸É7õ/ˆ/÷ÿÃ/§_~úÂYá,8åü• ß; «àjÃÕ€÷§ÞŸÒ`ï¹äêj`Ÿ}ŒÅ¾‰»ù¦Þà|Ãgø=E—‹.‹Àõ–ë-9‚w¿@û¹ös†/5<à¹`í[ûö û‡ çõ<!Bàû&nòM½Á3ø†Ïð;z$}oþ š²›²=A¿ƒýÆ~huKÝ"E m2TT­©5°6­Mkt©¾¨/âÛ?n¾V·ÕmRž‡oø ¿• @N,'¶Ÿ +öŠíÁ~ ꦺÉ'>‘fÚÒ–¶€nºéÆgh£¶ÀxÒ›Šƒçá>Ãïèq…=ü îÜ»sÏ+¾ØgÆûĉƒÞÓ{zÏç[ÜXÜXÜ€¾ª¾ª¾*XÙ^Ù^ÙL`TêQ9 à¥á«K>¿£ÇöÇð,ñ,áÕ}öSû)‡à¬–RCjÈ'\ˆ.D¢ßŸßŸßƒƒƒP¼Z¼Z¼ kɵäZ2 °ZW»WÁ]}ßå3ü޼×y¯õÄ*bi›Ñs>@µªVÕêGgêgêgꡳ¦³¦³&&& l¬l¬l ;;;ü|µ©6Õ¦ÀwÍð;z ΜQo!þ!þÁËŠƒÞÕ»|n™d’黉®DW¢ êkëkëk¡¤ª¤ª¤ – — — ÂR*¥RiâÇ}~GO†ˆz©^†ÞŠX׬kb¬HDVeÕ¹‚ˆjQ-ªED,±Ä¨¨¨i¶š­fKdrzrzrZD—ër].é‰ôDz<<¡Ž:ê|¼¾Ëgø]=G=cºG÷è¾[s[s[sPÑPÑPÑ…ÑÂhaš¤Iše‰²DY`}’:©“Ç:cG¼•æVM1Å”O˜ìMö&{a'¼Þ ƒ½n¯Ûë[b‰¥ÿ}+ÐÇþJ?jzVÏêYÐÃzXƳt–Îú¼­ø}ðX}ì·s[Þ :v—vÚAOé)=<悼ücwþû¯<±¯‹û;™/Øýi·ìJUIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-10.2.png 644 233 144 3031 13755454066 15017 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÎIDATHÇÍ–íOTgÆïáEY(ʆ†‚è·«Eavq¿t¡`Ih·±m]ûÁ†ј­Q!’bj³uYj,­Ýcˆ)‘””Ä+²ºÝÊ6[ÀÁB`´d s^žß~˜9sfûø|9¹ß®ëÊ9¹¯óˆˆÈ3¡§@TfTfTR0Žª²ó«KV—lj ÆàxÝñúýüaò‡)Ÿ¥|fŽÚ±U·ú#çElüH>+/ψˆkkw†âSðƶ7¶­þe0>×ññOt¨¾Q}àó–Ï[8?þ8ð¸ðq!رU·ú­y /_NýŒ_b»c»“·*n•díÊÚåüs°á?Nxí•×^ðD{¢Uó@"‰ªðáÃ: ±Uõ[óž…oñYüA=©©"°{Ïî=ñŒ^…ÚŒÚ ‹OëÞç}A÷é>ã-ã-V@õ©>8ÀŽ­ºÕoÍ[x¾ÅgñõØŸÒùk1F™^¦‡ ˜¿ÐœšÔm#ÕHE ”úr+7èÓú”>êˆ:¢Ž`Ÿyò0)µQÏ×óÑôQ-MK³/ˆeãeãÀrˆ?ü)gDD~ý7ˆÿ!þ_ _Ll˜ØÆ×”rÃÜjne9Lñ+œ84ÒH‹’M6ÙÀzÖ³ÞN+ò(° *ÔËêe–ùK_ý4>0>ï‹÷ùbè ê ½±úù©¦º¦Ô 3Ǿ\}ùØåc¨¡‡CÓCÓ6áØàØàØ \\{qíŵ092929b×ÍF³ÑlŒèO{vìY¸°áBæ…LÔwî»Wî^ wç¨ÀþÒý¥ÀlPàùî´½Ôöè'TÅÞ7÷¿¹ŸkEz7önìÝZ‘V¤kÁµàZ€í=Û{¶÷ÀæÛ›oo¾ s9s9s9¶ áÆ@¦ž©gêPØXøná»y0=!=•ÁSßïþ~·ª€®Æ®F0þÔ#|TšTªÚaöÚì5lbÛàÚ–ÖÅÖEÈø}Æ‹/Â5wÖÜYEEE—›—›—k p¯¸WÜ+p©îRÝ¥:;½ázÃõ¨m¨m¨m°ó[G¶|ºåShúSses%@ .Pº‘ЛЫڣ¤.ú›èoxAzbžÄ<‰=%Ã2,Þ=£{“÷&‹¤H?˜~PDÛ¡íÐvˆhyZž–'’ؖؖØ&á“Ô’Ô’Ô"¢££cçËÏ”Ÿ)?#R5U5U5%âjr5¹šDÒšÓ¾JûJ¤òùŠsçÄ+²<¹<)í_U¼ª˜bÄ0;ÍNLjDi9ZŽl•߈ˆHª¬?ÖéD´\-WËqžvžvž™q͸f\" Ù Ù Ù"K®%×’K$Ë“åÉòˆø×ù×ù׉Œæææ‰ÌÌÌŠÔRß\ß,røßïèïè"«›bSbS$U<+ý+ý"ÔuÅ1%1¾]¾]Cwe¥ï˾/E¿¡2¤+ü‡äâäbŠ?ÅŸ"’——'²óäΓ;OŠ8çóÎy‘‰¿Ä/âîvw»»EŠïß+¾'Ò}¼ûx÷qu^WçEº6u=×õœH†'ýVú- ´½ùñÍ©”Ì¡W‡^1®ûöùö ݵ·R«©¯©X[iÜ4nÂâ‹­‹­¨À­@O 'bë&Ì s¼Þï¨zU¯êÁ¼oÞ7ßÛïí‡å£ËG—Â|ÍüÛóoÃÌôŒ1c ž®˜®ÿ-¾`¯µ•„}l.~ÎãKãKaþR4óªy5ÂÇsˆC`zM¯éð«³ê¬: TQEU„¿iha[v:•3ŒW ?ó1þÏÇDP!çUåÑåѶó§Ïè3@³á7ü¶óÓE þ¥¾Uß=ôÐÌ1Ë,¨GjNͤ‘F”úB7tMýÃH0@] áŸ/{¯ì=ë×éüOï¿ò©½]<µ÷±§óû?–Ý®ã gÈIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-31.4.png 644 233 144 2726 13755454067 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü‹IDATHÇÍ–ÿO”WÆÏ;P¾TADÚ`S‚© –¤M!jЍ‹ X­É„f¶¦‰KHACkjZScÜdW’šnwIVŠNÁ4‘%Ñ8¤ÔVù²®UÝm$aPqB°M+e ƒoKg˜yßûÙ†Ë;ÑÀóË›sî9çyrî½Ï{DD$ká+àÊså¹2ã¾ë'žöZÚk«ÿ÷½ooŒþ–}¶ì3€å§–Ÿ²ï8¾^×ù‰õ"NÿD<—,q©gSÏå þQ¨~¹úå´gâþ߯@zWz×o1¨û¢î ßç¾Ïy~ºöÓ5€™ò™rp|½®óu½î—Ø_Ž>‚/O}õÔWÆwš’š"ù•ù•/ì'Œ¿î]î]?&ý˜¤\`MKYªÊmÁ_¯/äëzÝO÷×x?ÎG gKΨz«ê­ôöxÁÓpðùƒÏk¼hð1³bf̰޶Þ&ꊺ€ޝ×u¾®×ýt§ñã|œ­œùÇ6ð<°ýÑÁØÑÕÑÕ ^Š•Çʉ.0Uš²½Ô^b/uSÝT7qìWf˜ê|»Æ®!ª>´¾¶¾;#ÞÛgûìÇ·úüÄù‰óPTYTYT ‡û÷î‡+K“K“<5=åŸòŸdÌ:ißvÙÏÌ_Ÿ¿nÜ–ð²O—}*òϾ“ƒ'%§:V=V=&r¡÷Bï…^Ö²–µ"C=C=C=Îd"…‘ÂH¡ˆá3|†Ï‰÷÷÷ˆøM¿é7EÆÆÆD:Ot¶t¶ˆ\{0d Y"§2;r;r%ÇÈNËM˱·Ä̘iÜ•ªÏعMç6ÁýÂÛÂÛTíÚí¯ˆ+³º ÅB@»5iM>®ü¤L2pšÓœ~ÿ+Õ]5ªF[:ßn°ˆrÔ°€”xÿE¼ùG•ÿÉýW>±¯‹'ö=öd¾`ÿMÜÏ€´B‰IEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-left.png 644 233 144 244 12610450011 16057 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.1/web/www/routino/icons/marker-95-red.png 644 233 144 4230 13755454064 15607 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜMIDATXí—{LTwÇÏ}Œ Kwvi,(Ãn‹Z%â £<:`ã,$õ‘ H «¢ŒMS²)DŠU‘,TÒ˜h©’ØjðIZÃÚÕ¸VÚXq65"oæ>¾ûó»sgšÕlvÿÀ¹çwÎùÜóûžßÍM¯?PÐâW‡ÙÃìavnÜÿ bFçŒÎYËEY”EùÆ1ZL‹i10íV«I$‘DfÁ¶ZÍö³x–å®Ç¯æÑó•R)•ò¶`Ô|±Sì;mƒÜ.n·K1FGGãlÎÝœ»9w 7<ÜðXŸº>u}jÀf~¶ŸÅ³|,?«÷|âWÛquü(?ʺ³ÅÆÆÊe===ꬑ'#OFž @ÀÆ0†1.¸à4ÛïgûY<ËÇò׋«{>™^âݼ›w»¾a R¯¤^I½"­pø>‡ø—š¨&ª‰är¹\.äd9YNd‹l‘-:ÛïgûY<ËÇòkÀAõM/ihœ³q6"qŸ¸OÜ×r“˜«Í™?’,Ø»jZƒ©eªaªP]¾[¾[¦”h%p'(ZÄEõ"€)I–d@uI«¥Õ€Ô2Ù:Ù ¨ï*Ë”ea»ÍÕæ½æ½’…Õg<Œ ý†~CÿÚ%lƒ©ÒTaªPãN·Ó!žùc_¶/{ºpØ*u  A Òo÷Ë«Åj±fŽ8œÍÎf ™*MŸ˜>QãÆ'îwˆ;z÷1Ç‘‚#ùGòÕ-þ’ÍWë«ÕUðþœûs.;|ì0\i»ÒÊfe³Åá΀¶åmË kçxÛ6¶m€Žï:¾$Ûp×p—4q¤ þZý5u‹ÖÙ >R=‘‹"E.Bõ`Ö`Ö`–Ö9 ±ìmÛlÛ€é¹c±NoÕÕéA; : ô~ñsñs=þcøbly°E ’³Ž ãc û×Xw`ÝÀ›É,ÅR_½¯¢¾ŽúJ<%=ÐÅþ‹ýz »î>€£çž€%k—¬ ’H“ÚÊeå2r\9Èå å@}ÆÃøxÿHÍ7d2 ™ÚŒ…Q UR%ÍV¬Š•ˆhè•¡Wˆˆººõ7Eì—±_êí;‡ï&"º¾ðúB"¢Û}·ûˆˆV\Zq‰ˆh¥u¥•ˆèìì³³‰(œ/拉è uP Ô7´Ú íÚÈÏ÷ƒâ¤»ÇÝãî!‡—Ÿ%AئÜVn¨8Üî#¢ÑÒ%¥KˆˆÞÏ?Ÿˆ(»)»‰ˆèÍ3ožÑƒz“½ÉDD3g4ÅUÆUmûaÛDDsÏ}LDSë×%ѽ›97sˆø3â5ñù;H‚Çåqy\ä`|Ä[x oñ=ö·¸úDé‰í'¶ë$®Ø;ŒŸ?À[“[“ —2.ÀÑD€¡ÍÐͧšOÀØÆ±0B#¤¿Æ_¸•ÜJ@î8tèС@½‹Ï÷žïÕ¾€[¹$.‰Kò=&a©°TXº·ŠMYìŸMªI•ãœïݸw#p}¨¯_}ý*P™ëÓýŸî€ˆ_#~€û–ûˆ‹‹€²œ²èÄ÷7¾¿à¯LÓ[;·Â;áw/Ú»`Þ‚yŠö¢„(!êèEdFdFd‰—ÅËâåV·vá¯O/O/—w³üŠõtÂéxa÷˜à¸ýÕ̪™¥šF®‘ÓO9·ŸÛ`hÚVŽîº³ëNàu ¯o.Ø\ Lh€%B‰Pr{Ó´=ÓCÁ+¦ÞdH2$¹Ž³kyYqY±š¡Ü²üd ;`äVÓ­&= âVÜ:ÓûËì_f@sEs \ˆ¹èoÛ¨mmÍt‰¾Š¯â«&³¸9ÜnΫ!€Â?´ùÊçò¹ü׸V®•keZQ¶Û»m_Ù¾‚]Óîn%EIŒc€W]¡®8á ª‚*¾Å·€š¡¾£¾’»õᇀØpS®)WÚ¡uòCÁ*X­f ÍB²ˆ¦k¥Qšø!ÙÈF6"Á#<•Ñ>­ ¦·MoKFç{Ž~G¿^»’M²é¯I¨PL@À®|¦|¨›|Ÿ^¶-÷﹩¹©òní 4&ˆöŠèÑ;£wñfÞÌ›¹?]Ãüÿï&á¾p_¸ÏuÅï‰ß¿‡ÈPh(4Ú+4í¦™ÓÌizí*VÅ /ì°Ãà)žâi€[ž'Ï“ç´X»¬vYí25ƒå3 FƒÑ=9m›ÂƒOš;rôÄ…˜WƒmSø´víZË­å:í%£d )”GÊ£€ûЇ>À>³ofßÌ>5GÓdÁG¼õ·)Ö‡ð…Ñóµ!ÚÍù­víÝöî€v¥n©[êŒÒ³ègÑÏ¢…à ‡Ë šÛ…v¡ýp “š_z¡€¿§¬À–  ]àÑi÷ é é dt¶:[­¼ð‹aFjí²vY»×ŽØ 6ˆ }þŸ$3¯…Ôõ?§Y/ ],à-¿vOÿ'í¦g§g§g´kO±§ØSðÅ´_ÕN‚Ëãò¸¼×ö—ំÔåè¿\/Òîj¡J¨ª\É 8¯2¯2¯R=”8•8•8%ýS;jà<Öj¡j!ÿµ#8Cê…Ñÿ¸Bµ[l§ß㊸"® 5´†Ö( ø¹ü\~.ÀG]¸;;;A$ô ½B/wÞ¸)ääþo˨ý—I™”)Þ v¿WÀ«¼Ê«wŽ;Çûן¦ŸÿÅr2޼/<êMü6—½¿FsIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-36-red.png 644 233 144 4240 13755454063 15602 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜUIDATXí—mLTWÇŸû2",2³†ø‹"«]AÐ8µAãkÅÂjº‰/ˆØ˜ZˆUÑ¢]%£´pm‚J²eQë‹k²ÛbBVf*¬µŽ" îà0÷ÎùsçÎdW³Ù}¾ Ï9ÏËïžó?碀M¦0—FÙ£ìQváŸÁØ íÚ'´d˪¬Êê÷gh>ͧù@`š!™d’¹„ûìçù¼¯ÞO\Σç+£2*máó‰säv¹]n· {„= Ä???‚?­é[Ó·¦Ø0°a`ð>g}ÎúœÏçy<Ïçõx}Þïõ<$þ.ÜO9!ŽŠ£â¨s>_¡ä’ä’äuïéÛ§oŸ¾ÍbÜÏÝÏÝÏH Áƒ—x‰—œp h~pžÇó|^×ï—râõ|dš$Šƒâ ó*/s+çVÎ-å·ý¾~_¿ýKgé,ŠZ¥V©U€š©fª™€jU­ªUççy<Ïçõx} 8¬¿i’†&Ø›`#’k书ù>O°±ÔZj«ö«a5p+ÍãûÆ÷Ìé{à{`\íQ{u¨àG¸³—ì%ÀœÊTe* 4{g{gì#¿ÇYŽXY)VÞŸóp>2<2<2n(¡õö)ûp×€5±&`¬!LýLÙ¡ìÐ\·ã™3Á™€aSµ©ÒTÉfpOÞ%ï’wõÔð‰†â†>` x›ïºïº®ƒ÷‡àLá™B¸Zvµ ”V¥ÿƆ+‡+à¼õ¼€÷’ñ’¼.¯ Plþ<žìi(n(n(fj+ÆGÌŸŸŸ†#CCC€ñ#˜ù7Ÿwžws“Ç&éýµÛÖnÓ8æqó8Èûåýºxwž”'0ûý‰Z’2Tðü‹ç_œ‡óqУ…u…u…u¡/Sû•ÕÊj.>´xáâ…PU¥úúÅ×/ôÀC7†nÀÎ);§À¬/g}©ÿ)ë§,HX’°€«;¹;Pûõ1ðpÎ'ÔC¾!߯±(Ú.ä ¹DtƒœtpÑôÊé•DDW*¯T5}Óô Q–9ËLD4áÒ„KDDw®Ü¹BD”²9e3Ñæ¤ÍIDDÊåQ‡Ø!ÑÄ·×¾½–ˆNªÕƒDT-WËÕeh3´Ú´#ÏïWV”]Ÿ]Ÿ]‡¯„WÂ+ÀE\ÄE0üžíd;õ‡a$e$,÷,÷€)Vö­ì€'GŸ€8Ç æ»˜ï`ã»ß€…+®à>}À÷}Ù}ÙËœHÞ%'.'.'9‰VÑ*Z}OùS×TvÖ6tÅxÔ‰cæ13œ;qî¯ã”ã”~—ssô[ßÔÒÔo-}k)”/(_  WÜf·ègúP/|^úyi¨_÷±k=×z´ðB†!døž’”%eIYjù)3O7eš2ÕÇÆGë­õ©ún¶<úAô(-Õû½”{)zЛ]7»`ÛÆ c0cP¯¾OÀ;<þbÌÅx=Áé´sæ&øµ@J”¥ÄSÛ››O$ß”oÊ7[µ ý²%Ë–¨å¼¾¿â윳sà…=ØÀ#,è‹/_Ö¯t_a_!L¹3åw0n8ðë?õþº÷×þ=þ=@É_JÓJÓü p»´]Úþ·M?šŸznÉ' † C†ó,O¨¨ÚÛ½·›-×v.î~êýT0 ©´©€»ûn÷]Pªpz`ï/Ÿüò |•ýU6 wÆtÆ„Ö÷ü¨­ÒVX_"@¬kÅÚWÂTaª0uÞé@éžv¾¶ [„-yB«Ð&´q­øwÚ»l3m3a×´[îŸçŸ§b;Xà¥ù`¬‹u2‘ °å¬–ÕjÑîÁÖº:À<Ñ”oÊWvi+yH*—Ê+,š•¬d•M!Ö\Ê¥\ùÙÈF6"É%=–ï½¢=­¦U¦UŠÑ±¿¿¥¿%Ô-÷)¾ÀSÚ‚v¹èì,•¥l“ï™ï¼åË÷ç÷‹Ld"„N¡SèüÇoã3í;ÓQ÷[ý/Dgl‡¾ß¼IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-0.png 644 233 144 1367 13755454070 14603 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.1/web/www/routino/icons/limit-107.png 644 233 144 2653 13755454065 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü`IDATHÇÍ–ÝoTåÆ×Œ´Ó È0†ÒÐ¥òQpZCI ÆHSSÓF /4ÑØ&ŠpsJ#F0ê¶|h*¢P§I¦V½ ’Úë…Ô‹í@ÏᴆÔ'–vöÇûóbæížžóðÞ쬯çyö^Yk¿""²,ýpç»óÝKS¶{¯ãÏy:çé5ߤìS¸žs=wíŸàkô5ø¿ôi_wl×ù™õ"~&ŸöË2qžVO«+”¶ßƒç{þ±œ¤ì»ÁÛæmûË„}íûÚ.~uñ+Þ„‰¾‰>€©ÐT[Çu¾®×x™øòÞÿð‹@Ö÷Yß»þ žlO¶¬zjÕS·R 7ðlù³åc=¤Ü`Ý–°D…€ ô‰gØ:žÎ×õOãk>ÍŸÒ#°üÉåOŠ@å‹•/zO§ ®Ÿƒýyûó4ŸÑ|À,3a&¬—¬—˜Õ­ºpáÇÖq¯ë5žÆ×|š?¥Göö“¨êìêlÀ0®€5j‚½Ä¨1j0T—º£î ´dõ„*Q%`^3¯™×@µ«6Õꮺ­nƒ™´6[›QÖîäÛÉ·1,Ÿ±ÓØ ê _eTÀí4¿ÓJ‘uŸbzG½£‰E]]|À.«ÛXe¬b†vnpç¬e-k¬`E†¿B õ¬g}†–YfT@˜I{wÁð•á+Þ„7‘X¤õ¤…ê×ë^¯¦ìÍê°ñ®ñî<¬jÚ×ôrÓË0ˆ ľ¡¾¡¾¡>h8Ñp¢áLÔMÔMÔÁXÖXÖX4ä6ä6äBÓdS¬)ÍÙÍæê÷¯;þÛqboVï½ðÚ ºµ§zÒÂ~}‡·"{"{æu¼b~8W0WÀÜîþÝ»;†_^}yõåÕ`„°†MñMñMqØÜÜ„-É-É-I8óüÍó7aGîŽÜ¹P~°ü`ùAç‹‘Ïë?¯gNóYÿ==ÕÂ~}G`éOKR­ýûÙùÉ‚Ù?gÿ„–õ-ëZÖA^Y^Y^ô/î_Ü¿.„/„/„akÑÖ¢­ENݶ»Ûîn» '‡Nrü§kOמ®…ªæª³Ug3Z<ž~~ëŠuÖ#àØÿ°=ññø8ðCjìUÄ>fsêƒ-Á–` ô”ö”ö”Bä@ä@ä”EË¢eQ'/4 @ã¥ÆK—þÆüù¡· · ·ÀñÛgõšIó§õ¸Eì»Ã5(–Yn–‹ˆKDD–Ëãâ¿ÌsÊœ2§DŒ"£È( ¯¯¯‰‰‰™öMû¦}"Áþ`°_¤ùLó™æ3"++WV®¬),,Qÿ±[ì÷ãi>Ã|Æ|FDëq‹$B‰ÐÀ/²¨«»«[Dðª«X=¢‘¤æ«ðUø*DîûïûïûEŠ=ÅžbHI}I}I½Ès¹Æ ooo   é(ì(ì(©®®v^TÖÚnÛ-Iy4Å'Ù]½]½"ózþo*“©)aÔ4©¼÷ѽ÷ï½ÉÎdg²3£Q;jGaòÖä­É[`GìˆqâÓ5Ó5Ó50ó¯™?fþpðøÑ¼h^¬4Ÿæ_8•ë>ï„w"±†­ak`Ø{ì=Ì`°ðÔRK-Ø“ö¤=é¸ÕQuTö²—½ùû8Æ1˜ÇsöXšOó/Øc›ŸjOµ°õf¶¬Àc½a½ÁgtÓíl~¾¥vPWÕUu8O+­‚–RL1ŠýÖuë:X#Ö¤^Ô¸Õ9Õ9úK-Øüì¿ò½]<°÷±óû7U3ªôlöëIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-64.png 644 233 144 2362 13755454065 14675 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܧIDATHÇÍ–HÔgÇ?wN=ÙqÖ¸Ñy4Z‘!Ñ,aeÙ ¥°(‹þ0K,$¨l5ÂÅDæ¤Ò‰Íô«£" „´Fʨ†±A?nÚlÑQS¢n9œßï÷yí»ç¾ßÍÕö§Ï?wŸ_ï÷ûžçù|î‘iÉOwÀpû¶ûSÛïYíYýaGÂn6ÁUæ*ûé d7e7LoÞjݳm×ùÎzßɧý2MlGfWf—+˜´@ù‚òž÷ö—7 +’ymÀŽ ;.œo;ßFÄúb}/‚/‚`Û:®óu½ÆsâË‘ð‹@úåôË®_ 3#3Cf­œµrve"áçÙZZð$íIšr€ùàÅ«‚@œ8z8lOæëz§ñ5ŸæOèðû‹E tS馬p¢à^;ìËÙ—£ù&"À1Žá#nÄÌ-æÆAÝP7páÛÖq¯ë5žÆ×|š?¡Gþ~¶õ%°Á³Á“t“¸yż`µZ­L¨ªA5 Œã–q ¬_­ÇÖc&-U­*U%Xk•µ VØ 3Á˜Ùmv*‰ŸâÓüâ”ÛY±¬Xüxh>4?X VƒÕÀﱌe †UTE ꨣ(£Œ2`ÛØj£Ú¨6:ò^ë/ÖVk+cIcmŠ/şГÖüì<´óPªø#}ê[uM]Kü>€ÁŠÁŠÁ ¨o©o©oÛU·«nWMÞ±G:u@Ïúžõ=ë(¤EÜxj)YYY"R­‰ÖDEžï~¾ûùnÇÕî:ã:#"—ä¾Üwð¥ø“zÀ×ëëU][[lo¹9lt¶éŠtEº o(o(oÈqd{‚{‚{`Þ®y»æí‚@{ =Ð3ï̼3óŽÝóáýáýáý|Œ~£ßy+5BÏï_™ùf>ã|O=vùæs›Ïm>Þ¥Þ¥Þ¥P~¢üDù xVú¬ôY©×ämò6yaùƒå–?pðg*KYÀ×fYðæ;öŸ]ÉÊîJ•¡2TŒ´Œ´Œ´€YgÖ™u“»r<0À«5¯Ö¼Zã\f€”cð¾­+ÿeŽý™šcG­£Œñ Ç9VܱFlµP-T AV‡ÕaP†2”„îs—»Àgœå,€UiU2†ù¿æØ[&¿i^7¯XUV\$J¥nªÕ|C3Í“wŒÏ©¥x— P`ÕX5LØxIü7Oþ)û_9e_Sö=65_°pžÆ”åIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-7.1.png 644 233 144 2332 13755454066 14747 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–OLTWÆÏŒÅ¨ ®Ð@ìŠ A\@£!'ˆB4Fü“´vS])šXÿlê¢ &&B͘&„ „M©NÚ*•N" uL•NK2Ì»÷þº˜¹óž&M㎻™|çžó}_Î}÷Ì‘Õé_ÿ:ÿ:n ûºñìÚìÚÏ»Røºßßžß[!¯-¯ ÿfþM=éb»oó½õ".¿WÏÆeµ¸ÀÀ_M_€}÷mÌ^“ÂßE ç^ν8Öw¬ 'Üæ+ˆÆFÞÕ¼«Û}›oë-Ÿ—_.|¤/YY¾i,,¢E;×Jˆ®‡º]u»^.{¹Ìø@Í+Yij€8qìšõ`»ŸÎ·õ–Ïò[=«Ÿò#PP]P-õûë÷çü˜*˜ü N¯=½Öê%ï—¹ÌJpâN@5«f`"&€¸ØîÛ|[où,¿Õ³ú)?òáÙ^ÝA¼!ÙÌzd:—œK –-]ÝóÝó +ÌÛÈ÷‘+‘+°uïÖ½[÷Bh,4s?€ŽÚŽÚŽZO;ëu‰:hoowó†® ]ºææ©_/¶½7G¬¾õ#û ÷¹±²X™§å˜Q3 ºJoÓÛÜè­Â[…· ¡¡·¡·¡×“>È ƒ8Ÿ8Ÿ8·+nWÜ®€¢XQ¬(½½ž|5çô;ý^=«Ÿò#¿*•~³¯f_¥¯ý³É¸­gþîüÝù»PüºøuñkÙ0²adƒç›u³nÓmºM·¯FœAgðoå'̱/i¡…OYνùþoŽy&?Ƥ†fò¨¨Šùê”:E’oè “Ñù“)¦ÀDMÔD?˜dÒã#‹RJ1´+­4IPÏÕs/ÿNþ%û_¹d_Kö=¶4_°ÿ'Õ9ªµ´IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-35.6.png 644 233 144 3124 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–ýO”WÇÏ íð® ‚¦,’͆µé–5jÚn-TÅ™ø‚Ó’šËâˆíºÛ¸¡ÙdEÓ¸[ɺ ƒ›†_ ©Äéˆ[Éâ*Æ*S—F³€t‘édy™™ç¹Ÿýaxœ‰ûxyò½çœï÷ä9¹ß{DDdÉÂW jUÔª¨¤ŽúUx?&?&MkÛ50í0í¸û{X\»¸ ù‹ä/ôïÃØˆù‘õ"aþH=c_–HxÃ|Þ|Þ”»€«Áú’õ¥˜å!|üĶǶÿ7å_— ÐöeÛ—|{ö<Î}œ alÄ|£Þà‹ä—ê§ôEà¹KÏ]2ÝóóæçE cKÆ–Ì_‡†2ÁRh)]4ºHE€6 $ r>Œå‰ÀF|!ߨ7ø ~CÏÐõ#°ìÍeoŠÀöw·¿{*TðýßàãôÓ ½@;ð)Ÿ’A_Р½§½Ç<¨kê&LÆFÜÈ7ê >ƒßÐ3ôCý„G9#"R³v îý@Àt2 ~ÜÜI€Ç(íö‘öh?Ó²µlÐJµR­(¤€ž^J•? ~B x;Hý^ˆvÝßuðúÆ(¯ˆˆüô¯ë‹õù¢•>ètG(•£r˜á2W¸lcÛ"$54´<Ë,³8…R@=Pcj @•¨føóÿOôôé õ#LˆˆØ{û¶ïÛn°é?ÿîß·,·,P3T3X3ˆÚ:ôÖÐ[a½¶¢¶¢¶"¨³ÔYê,pòúÉë'¯Ã£Gþï1üÁðþáýPÓTÓPÓ€º±¿ÏÕç ë·oϾ=ÀƒP?Qú¨ˆÈú‹&)ÜS¸GäEÃ/ ¿`ÊÙtzÓЦ!ñ;›ÎF1å¯Ëß¿AäfëÍÖ›­"•ªRU*‘Nk§µÓ*â49MN“ˆ·Ö[ë­•'ËsÌsÌsL¤´»ôÛÒoEzõŒ÷Œ‹ÉæµeÙ²Äÿ]ãhÅh…)GfÞ>þöqe õe*ŸŽŸ~eƒH^\^œˆ·c|j|Êtê€ãÃ>sÙHÙò‡"+e¥¬‘þæþæþfo«·ÕÛ*¢_Ð/èDò²ó²ó²EÖÔ­©[Sn¬k¶k¶kVd$q$q$Q$Ýœ¾$}‰H~qAUA•˜Wý.¹#¹ÃtJäÕ„WDL—››_Ù œ˜œ¨»ˆ™œšœ {ï¦L€­ý[û·öú´uiëÒÀî¶»ín8xøàჇátÃé†Ó ±6cmÆZhq´8Zá6õ6õ6õÂêõ«×¯^õåõåõåyîÅÏ_ü:Î^N½œŠüwýwA›HœIœÑ]QúrŸ¿Ï䒹ş-þLä/ßÔ;ë²Ì´Þ³ÞéÊéÊéÊá(G9*âhq´8ZDÒçÒçÒçDJl%¶›ÈŠ;+#âq{Ü·ˆœ•³rV$þjüÕø«" Ý Ý Ý""Iw“Ú“ÚEÜ#î*w•,‘néa¹Þ§÷™\¢Ì""ý¿…¯^ÿêu?4·yn³zÿ[_žxy‚ùkJQJ”\,¹Xrššš`£e£e£’ìIö$;”Í—Í—ÍÈkÄ5â‚ìÊìÊìJ[:¶tl)ìmØÛ°·âüqÓqÓ°ÛµóÐÎCÌ{ÿ Þ‡ó±çcAµ…úYð1{[´-:|JüšÍÍ…ÿ˜˜ûa¥5kÍZsxDsss033*SeªLPi*M¥ç„ç„çè7ôú PgÔu­¢Ôkê5fTèV)P³ƒ·oÄzc½¾hþnø˜áüó†ó/*^ü&ä̪38œNjcÚ£þÈŽ€º¢Ê´ÓN;ð˜)¦@¹Ômu˜XÈÿF7ëfª'øcðG Þpþâèâhë?¹ÄŸÙ»ò™}]<³ï±góû?bÝÑcI'{IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-34.3.png 644 233 144 2761 13755454067 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܦIDATHÇÍ–ñOTWÅ¿ƒÓe€ñ Mm±Ø’¬‰£€*FÔšÓ íØ6é–ˆ6kÄ6&‹‘Ø•¸Š5!û£RÙtÑdÝI$´†­´±Ø •Z+‡8 ³R†™÷îg˜y}´üÞ_^νß{ÎÉ»÷ž{DDÄû Ä9âqK¢8®ÎìO¨H¨Xþ÷(n×ÀRc©¹õH9‘r õlêY}ØÄƸQ?¾ˆÉ?_Ï蛘ñîx·¥$†Á¶¼my K£øè5HìNì~7/½y à⹋çØ¿|ùË—þ ˜Ø7êùß|~9ô}xâ‹'¾°üñOÆ?)ÙeÙeϼ-}ª6WmøyÑÏ‹Th> ™dU b´ÉyØÕó >ƒßÐ3ô£~ìÅöb¨~µúÕÄŽè„áNhÌjÌ2ôÂÝÀa“ ‘`$ ½¦½FÔ5u 0±1nÔó >ƒßÐ3ô£~Ì¥œùäepz^п÷G‡—ƒÊ‹”FJ Çœ*òú@½¯ÞÝ¡;tf àÃ÷RúXx&æ0‡T±*f†Äøëcz1}F¢~„û""í}ŠúêújƒNÿÓÍ»ßT}S­…­­(oÀë÷úYÐÆzÇzÇzÁãô8=Îy†lʦl&¾yçæ›w µ¨õ…ÖPÞ‰ásÃçL=å©O¨O0–¶½O´ÿˆˆ ~=z.ÀÀæÑÌÑLµÛvdqîâ\B5-5k‚ã€ã€ãŒvŽvŽvš‚¥ëJו®ƒõgÖŸYf¡ñžž°³³ƒš5-5-àÊlÊl"ôÃßüoûßV»¡ÛÚm½;ê'ÎÒ44½ª@¤ÔRj™züiK‡ëÖ;¡wB_·µnWÝ.‘”œ”œ”k—µËÚ%Ҟݞݞ-âé÷ô{úEì™öL{¦,h "®>WŸ«O¤î:WK$Ík×íºÄϸŒ?·tˆ”\.¹,"ÉÉ&¸ª@ uqêb}ˆßCßCóØN¹¦\P¾§|OùÈOÏOÏO‡–Á–Á–AX»tíÒµK¡©·©·©Š2Š2Š2Ì?¥?Ôê&æ@s 6•o*ßTϯ[‘³"nÝñVy«˜„GGýÖ’Ÿ–ü¤‰æLJOJWn½z þzõôW§¿‚M•¯¤¾’jì/Ø_°r7ænÌÝŽŽŽ°ìÔ²SËN™1}2ëdÖÉ,Ðíº]·Ã‘®#]Gº âxÅñŠã&_Î{Ï­~n5œZñÙªÏVÌUÎUBD{êêSW•[ÔEc¹“ÜIÜ v¯-}éÞK÷¥å§½˜ö"Ôúkýµ~¸¿÷þÞû{M6O›§Íecececà»á»á»yÅyÅyÅp}àúÀõ(\S¸¦p ¤¹Ò^O{œ‘êŽêBkTÜùî|PQ?bœþÕ`m°š§d®å×’_KàAüÄìÄ,J»­ÝÖn/ÜܳÌ2 LLLÛÙÎv˜,š,š,u^Wç!¼2¼2¼&Æ'†&†PÚí¹Oç>5õnÈnÈžw*ùî÷9Fa4WÔ˱]j3*S=«žµOíSû@iJS°…-lFah¤‘Æy±qE]QW@UŸ«ÏT•ªbFEB¥ x½ƒ‰Ä@ÐÊ¿3vGÈHÞÚEµ‹€?G“Y]ŽLE¦€mB›X˜ü¢™f tÒÿEïJõ½úV} ±°UÔ¾Ö¾&¬þ¹¹œ6’?¦úcò?¾wåcûºxlßcç öÿøø!ù¯”ŒIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-11.1.png 644 233 144 2473 13755454066 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜðIDATHÇÍ–_hSwÇOÚ$5¶©œOJju°…vB±þÁRE”+Êti¶Pq¾(ˆe“S(k˜­¶ZSÅ„V ®DZGaEê´[+:°¥‹.¤þIîŸßgÉͽ¬ÛÓ^ü½\Î9ßóýî¹çÜŸ€ˆˆ,Ì>ò–æ-Í+ÎØy_ØþyÛæm[~%c·àÚíÚýÛIXpaÁ€’K%—Ì1Û¶âÞ™/bó;õ,¿,ÛQp½àº«:kŸ‚=«ö¬š÷QÆþ.¾_Ï‚·‚·Â—×ù¦‡¦‡^W¿®Û¶âÞÊ·øœürêú"à‰z¢®?¡À[àÀÖÀÖ²¯3€'e°sûÎí“ù“ù*Œ—@EªH’Ä:3ÛŠgñV¾Ågñ[z–~¦Em]{wíõý”Ik‡£KŽ.±ô´à g(=©'ŒýÆ~R b*€ ض·ðV¾Ågñ[z–~¦»•¦ˆÈ¹-uzž+hÐôkeZ¨_€@Ë”…0ýf¡YjD¨ì“ä¯Ý›Ufšé××êkAý’á‡zO½x™ÕϵrJDä“óà{æ{–t™((c€Z"æjs5os‚7馌˜3b@}ô9 zÏ{Þ;ì"N¼9aNäøjÑÇcã1_Ò—Lº3…}r>ûÆZïñWS°)ê$€¹Æâ CÍ¡fÔèÇ£ËF—1ç„C¡F­­­´ýªBU¨ P§ÕiuÚ†N…N¡F×””çÞûõyðIð‰ÕÚÖ{B…ˆÈH3tmêÚúIuhß`CcC#)kDî¼»óîÎ;[ ¡¥¡¥¡Åžé¾‹}û.: +U¥ªô½Eo}Ãû†÷ ;ð?D+¢¤²èCÆdû£öGVa#Í·ŵŵê:Ä;ã^Î*VAç§WWø&p"pzË{Ë{ËmáŽÅ‹;C`:0˜†h´?ÚoÇ»Æ]ã.¤fS³©Yè\×¹®s¦S)ˆÞŒ‹sàÓ“+'W¨ë%þ¿ù˜Þ™ÐLTGnì¨:Pu ê„#áH82·•¹¸6æC¨Íh3Ú@]UWÕÕÃ߈߈ÛkÆH¾{1V=yb˜=fë±äi»´]"R)""‹²³!Z‰¶@[ "2 2çhϵçÚsWØv…mÿÓ³OÏ>=+btÝF·ÿD›Ð&Dä®´I[νHÞè›õÍ""æmó¶ëqž¸“[“[ K*Öëq}&"ÂálBÚÿÌ?æñ¸=n{naE÷‹îÝ™¿bþŠù+DRÁT0ÙQ³£fGH¼*^¯²ñ…— [ [Eq-q •þ9Ý—î›ÛÊđđÄÐê´:­ðâÅ 3çfÎÍœs½¹Þ\ïÀ•hI´ Òƒo{ßöÚSÉý¦-M[œSIn½ð½Hºa|v|6ÇS f—ÙåØc £ó?Ž ¨€c1>4>ÿ±ÇDPÙÍ«êóëó-m}JŸBFÚHÏÝüxqãÚi§˜Íü+Õê¡züná̓æA4¼Æcðc–Ÿú‚úÈ,&çæÿpÿ•ìí⃽}˜7Ø¿%ó&DÌIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-33.3.png 644 233 144 3022 13755454067 15026 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÇIDATHÇÍ–íOTgÆŸAÊKA;S•ØÔŒ4-ugi☭(& „†‰¦%Shgq?t›4i6©Ýqâké*Ô¤Ác¡µÚ³®b«»UëÌÔ‘®©&@çíÜ¿ý0s<³ý |¾œ\÷ËuÝsžó\ó(PJ)eN?d•g•g-Ká,§ÏkÈkxv …%ÁÔbj¹ýxêÈSG,ý–~Íg`=¯×gö+eðgêéqeVF ×ë6ÙÓø#h«i«É[žÂ{‡!(h>o}ùÖ—ƒ'OòGøå›_¾xhhëy½^ï×ù2ùÕG¿ÑW ž8÷Ä9Ó}ÈÍÉÍQ V¾ºòÕU;R£« iKÓ€Ÿ—ü¼D² 9R(v B}Mg`=Ÿ®×ûu>_×ÓõSó((Y_²^)h~½ùõü¾Tƒï3x¯ì½2]/>ìb…ˆ$"ÉŽdQaÀ„ ¬çõz½_çÓùu=]?5±• J)µïÐêoõƒö@üJb<¾*¾ ¤2ñJââéIEój7´OŒ%Æ@j¤Fj0ÖÓL?B¢Ý‹/Ĉ'&âOÇŸy6Å­S­S@X××·ò¢RJU‚üH~$’-šÿŠÿ ðWAª¥šÆ é”Néúé§?c³œå,ÐAFXeQ¿±‹]²^Ö³ÀWiþ®´^ZŸSó((¥Ô±¡«¹«Y§ÓÖÞšø¾éû&è]Óû|ïóÈïxîx Á›ûnzë{ë{ëÁÿÀÿÀÿÀÈk'´Ú ß»5vk zŸâó‡|'}' =¹Ô•ו§oí±•üRJ]ÿ3œùüÌçðï-£¥£¥ÒiþûÒª¥UD•ŽgÏ@ÕòªåUËáÔÄ©‰S°bqÅâŠEpx‡ÊGËGËGáî»î0ºVq­âZ˜÷›÷›÷CË‘–=-{ Ü[ú~éûDúÇÃw¾#0”=” ÚPjž,SwÁ\Á\íËJm0m0)5 V+L}®Û=Ñž¨ÊuV9_p¾ TI[I[I›RÁûÁûÁûJõHôˆRÎ,g–3K©¢{E÷Šî)5_:_:_ª­°'ì {”r¸F\#J9ßtºœ.¥Šü%Z‰¦rÜ“ÁÉ ©O)ûyûy¥Taá…Ô¾¬À²Ô²Tó’7535cûÙî° 6oܼqóF°Ú­v«|s¾9ßÄ1GÌ ö{ƒ*ë+ë+ëÁSì)ög|{—¹Ìe˜Ý9»sv§ÁWYo]m] ·ÇüMþ&¦a~ïü^Ðn/_6®yU²µ ¸ XÜ};ú6½xüÛãßÂæÆM–MƒßVf+³•Ášá5Ãk†¡=Ðhyë6ë6ë68l;l;l3â»§vOíž‚†ƒ ñÕzîÅç^„O¬ŸÖ~Z kŒ5B"ùäÅ'/Š[É þ¹ ÜiÎßmx)ðR€¨yÚ¶·‹Çö>öxÞ`ÿD,'7»IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-20.5.png 644 233 144 3066 13755454067 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜëIDATHÇÍ–ÿOTWÆ_pPƲ@ËjĪÔº , ICXtifK0˜FKÝDE× %tÍ‚ÑhRÒ ‰ë’t7$ ˜@ÜÚ&å›Uq6v$ŽÄ…L6à@+¼ÌÜ9ŸýaævØöðüró~{žçž“ûÜ# ""ñ¡§@dJdJdl0Ž<ÎGÛ¢m–ã6"öFìýæ/w9î2À«×^½ÇFÝè_9/Æ_Égä%^‰5]kº"v†â&xçwÞˆ^Œ?³ÃìXðCeoe/@wgw'5ðÝíïnÌíœÛ áØ¨ýƼ·_š~Æ/Q}Q}“°fõšÕ"ðú[¯¿µõD°ab+”—|»êÛU*ô †µ˜gc=[õP¿1oàøŸÁÔ#TT ¥ûK÷›ÿÿNo<½Ñàó9€óœ'üóþy½\/G5¨ˆ ±Q7úyÏÀ7ø þ žðQzED.BÙlÙ,¨_øFüã¾d_2}ã¾q|!¥Jý^½©Þÿ”Ò? ê”:¥NñË5Œ?JÿërËr >=ÝwÂwôâ >ûÊË — ÃGù/‘yޯܭêµ*‘ÀñÄ“&Ocì1vÕ?<ýá)<¸øèãGÃÚäè'ÑO ioSiSiøÅúÏôŸé?Û2¶elË€™Ü™Ü™\È9›s6ç,ô&õ&õ&V©Uj•à˜tL:&¡ÞRo©·„qrcsœ9Nhõ]5]5hWµ« o^;µvJuEªã  c÷DîÚîÚDF7»ÇÝÖšE³Èrßúîô݉³ÇÙãì"KSKSKS"¶s¶s¶s"›º7uoê±-Ù–lK"V‹ÕbµˆX³¬YÖ,‘ä„ä„ä‘á®á®á.‘øSñöx»È¶©ÔÏS?—åC-‡ý‡ýéÍí͉üzióÒæ±{‡Á¯ªëªëà…?øUNßñÜòÜ‚§x6x6 õ…ÿ{ÿ÷À?BÎÏ>Ó>°üsçyÿ•/íí⥽½œ7ØÿE6êUùUÐIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-60-grey.png 644 233 144 6233 13755454064 16000 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü PIDATXÃ…—{PÔG¶Ç¿Ýó›'8ò0.g1‰¢W5‚€l4zK¶ÈİF (z[F¢µ,*Ìz!<Ñ<ˆ¸‚‚À¯Á«Ùˆ¤¢  Pa˜™ßüúþÁ Þ²*•óOWÿºç|ÎéÓݧIvvvvv6¼0-£Ó âîs÷¹û¬!û›ìo²¿aþ¹sæ>üóóÌ›y3ïã»ù>€X±kªfªfª†åã4Nã4ÉD(B @=ôvav±|i‚4Aš@2¹n€h?MLÄDL+ÉñËñËñkº“§ÍÓæiÉ ¯âU¼Š¼<Í!\uqyÑÀÕXÕôœ+ä ¹ÂUû„}Â>1wenmnmní¹>û }Ð>Øøoërërëò‡<Š<Š<ŠP·"~EüŠx’.‡‹•>+}Vúî¾{Ü=ßý¿[ߌ~—=·}7›sEp-S2%S )$•¤’TU‘H%R‰T-g&Ê&Ê&Êøø6ú6ú6:3âõñúx=u,é\Ò¹¤“l–fJ3¥™°âŽà°Â +€ØæaæÁ:88ˆÍ­­­ÌÑÚÚ*d ¿4üÒðKÉ •B¥P­‘9S©ÎÔõE,¥±´û)t-9:ytòè$€V´¢5pWÃÕp5­åv›Ýf·-ؤ^§^§^ǯּ©ySó&wÎËìeö2C9˜ƒ9àY a!àÐntð„'<X`À",Â"€ôÒC¸Qå¨rT‰{?½øéÅOù”{ßßûþÞ÷ܹD.‘ÿRÏ'ð |Bt¢èþq*o“·ÉÛ±¿Ø_ìÿþk½µÞZ¿`“Z£Ö¨5üæ4mš6MËýàèèˆ9Âaƒ°2„ !¦]9IN’“é#}¤ Ãd˜ d€ @Ø(l6‚s&9“œIÀì‘Ù#³G0Ç­_¨NT'ò›ÝöÝÊ[x oyy¥ý[û·öoµÿá«ñÕøjX°æ+ÍWš¯8wŽ˜…W„W„W ¤KéRº ïÐwè;¹F®‘kZЂ÷ʈCâÜ›  e´Œ–¢rQ¹¨`ÛØ6¶ J·~Íwšï4ßqç|}}Y°›ÇÍGY( e¡Ç1ŽG ÛÛÛŽx¯ó^ç½ÎC⊜’¾Kߥï“Ë&—M.:;;.ï.ï.oÀ9âqŽÓKà2.ã20:: ܼ~óúÍëÀ/ö_ì¿ØGãh Ž G¡ôúÜës¯Ï!‰½{3ö&âÝŽæƒùàÈtïJïJïJä/Y³4†è\žò´€ÐÀ\o®7×§šO5ŸjÆuãºqàHp$8€…[nY¸HCÒ E E E¥ ¥ ¥ €uÈ:dl‘¶H[$õkÔ¯Q¿›†7 o†[$K-]´tѵ µ µ !"v"v"62‡ÇòÏ­9·æÜæ– ~¿‹ß5Óg•úJ}¥ž±BZH é“ï¦ë¦ë¦ëŒ½õ~ÔûQŒ <>xœ±ò‚ò‚òÆŠÛ‹Û‹ÛŸÌÿÙãgŸ=;’r$åH cË–=,cOË„›ÇÍÇá=¼‡÷H(­ ´bÆ3)•Q•Íô1peàÊÀÀ÷ˆïß#Àíí-àT;ÕN5 íÒvi»¿V¿V¿VÀØbl1¶aª0U˜ê‰ž…‡ZxWˆ+Ä@¿¤_Ò/æ¦ÌM™›òÿìo£Ûè6§p §H(ˆDì‚9ÂaŽ@¯CïÐ;ô‘bRLŠÁl;m;m;Ñ“£'GO²d=ÈØN¶“íL‡L‡L‡€¯‡¾úz0¶ÛŒm€ÙÇìcö”AÊ eÐPáYáYáY[±[ç#ç#磙aæjE?Mü4ñz©šª©š] ²eÊ>ä {ýzýzýØ…ÛÝ·»owÏüh“dH2$€|»|»|;ñBÄ /¯Å¿ÿZêHrô9ú}rôÁÑG¸¸ñ§bñCñCñërK£¥ÑÒ¸ -nÜþ¸ý,nÓúMë7­'—ÇÇÇÁz¿èý¢÷ å1å1å1`Aþ‚üùí ´@$" XÊ,e–2 »¢»¢»ðýÑ÷Gß   XoÝ.º]„­g“Î&MÂ%Q™|‰‰˜ˆ‰VlÅb,Æâ»{(=MOÓÓ¢6z‚ž 'Œz„¡'Õ®hR4)š€«ÍW›¯6³:#:#:#p~Võ¬êYÕ°-+]Vº¬P¬þXý1@WÑUtL0ØÝØ xš=Ížf`…e…e…eÐl®1טk ¨{±îźyµD,KÄÀtù—%UdYuw QˆB.ÐU=9ç¯:îI'é$ýò>²™l&›3þ4]|R;\;\;Ì{¾øFàÜë^_z}éõ%ÌÂÛÂÛÂÛPÒRZJK,Çr,°±À,ÌÂ,@ˆ¢…hLQPP@Y_\_\_ìGŸ£Ï!åèAzøKîzÔ}èCpHÍóÕÏW?_]øÙnÙnÙîóy¦ù¦ù¦ùÜèÅÈ‹‘#Ÿä.YH’…˜l°=Ù<ÌÆlÌFëh­ƒôšášášÅݰܰܰˆ =<=<=<û'íåör{ùáîäÜɹ“030f»Ô”ºA­®¶Bð<O̾õÛ­ßnýØØØþÀÃÛÃÛÃû~…¾V_«¯6¼Úðjë,Žì#ûÈ>H…³ÂYá,äC°16ÆÆÂžð°=6<6<6à|cXcXcf{ z z B„!Dþ`:õú']©Xìróe÷@Üž»ž$RW×u\ˆ шF4:’Õd5Y÷—é'GË?{{{…ýÉB²,Ш%'–œXr B—Ð%tAAÓÅt1¦øL>“Ï„ô³ÏB> q.\5¸jp•¨[& “…®™Þ4?:A'è¸b×ÊþÕ½byyyyyy0»# ×÷yæ*¿œ]¹[LŠH)ºü-¥±46£fºú ŸÔ:jµ~ïhÉhÉh ”RJ)ÆÜ‘h²5Ùšl‚µ_ׯë׉ºeY²,YÖº)ã”qʘUн¡{C÷À¨vŸ§nÀ™‹OÉS.ÿëÊÝÎänº,]–~>Ï` 0p£•ٕٕÙ΃®Š~v§O§O§¾nmkmkm#)Š.E—¢ Ô‚ZPï¿Ê½Î½Î½n{18<8<8œŽ¸ìý§û†zšK„ß‘˜˜˜˜˜ð®n'“0 “ÿ|nð¹Áçð•s¾s¾sþ¿yi°4XüÊ'Ö?Zÿh½OõèÝÑ»£wÙß*½Uz«Ô¹Öâ°8,Ñq”8Jõv +a%¬äuB ©èF0‚až{\âŸæ!øùÜÍEÐàÌa5¬†ÕÄôÐ*ZE«þ'xrËä–É-ÂsbX'ÖÑ»¢4Qš(­ùûªªª?Çz =†ò/a®0W˜ËθôÖº­¿ÇAñòT göaöqíDK´D{%„5°Öð·ò y<ˆÞõ‰úD}Æ á¸p\8¾÷·®¤®¤®$`Á.}îÂÒöGÿ,'L‘ùyÄIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-5.0.png 644 233 144 2532 13755454066 14746 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–]H”iÇϘ僚}^ô…)ìÚ'(ÑU(-YS†kEL_f],ËDt±±v!EìRÒ—I¹%˪eA±Ûn¦Á˜n¨‘3J™Ó;Ïûüöbæñ’öºçfæœçœÿÿÿ>ï9ç}DD$#þ+4/i^RZÌNÚçøÝëÜë]‹Ù縊]ÅÏ‚ô3ég¦]žvÙ~áØfßÄ'æ‹8ø‰|Æ/â8Rn¤ÜpÆícPº´t©{fÌ>Ù ©u©uÃQ(¿]~àVÍ­~€¾‡}  Á±Í¾‰7ù/_Ž}Æ/“ïN¾ëz)SR¦ˆÀ‚µ ÖfUÄ^f·È[Ð;©w’NÕxðèB`ˆ!Ì %Øf?oò žÁ7|†?¦G`FÁŒؼmó¶ÔK±„WáÐÜCs ŸUTQ…¢CÑ!µCí ºY7àÂŽmöM¼É7xßðþ˜ùôÝžZC´$¹$y\P -ê„:êçÝ»±Ôbõ½ú­v©íj;PÄzÖ3a鵺@@´[MUSÑúÇèóès,PïÕ{`$ŽOIJIŠxjM«ùæWHíKíJF¬€5Ž¿ž»À.`„÷ã¾(ÑcŒ1–`ç’K.0›ÙÌNð/aÛ€oÕqu<& XÏX`80 ãüq=qaçï㎗ì`ÛÅ`=¶‚V]WSW]W ç¼ç¼ç¼Pý¸úqõc·…ÛÂmO¬£²£²£ÎfžÍ<› ¯Ú_=}õÔ9Pý¯õÌzfL{Å8\O\Ø_~¨}Wûô½7ž¼1X3X3{föÌìï^ï^ï^ð=ñ=ñ=ÎÒÎÒÎRGÐÛàÛàÛ ä-É[’·–5,kXÖ9M9M9MÐ_Ô_Ø_8Ñ· _ŒßèHkLkÔ7 /¯/ì]Ÿ>ù£æGMš yuòêäÕPTQTQTW†¯ _ åÄ_4hÉôeú2}"[˶–m-™Ó:§uN«Hhahah¡ˆ¶µ­m‘ù§çŸžZ$x0x0xP$´1´1´QdȲ†,‘œ–œ9]®¿ _œßè™PcþOk¬÷MoWoäwçwçwCú¥ôKé— ,R)‹@WGWGWäîÌÝ™»^ox½áõ(¯*¯*¯O†'Ó‡ý‡ý‡ý‰E¢*@„_¾XcŸu¥é’‡Ñ†hƒÓEV»õÔz ýî~w¿t–ÎÒY §ëéz:„jCµ¡Z°wÛ»íÝ tƒn€pS¸)Üö[»ÇîqðèvE»ý¿]™0džïïœ9¦©l•͈þNûuÂël­³YÌbVÂAìg?ûÁÛa;œ\×ëz`Ÿº¯î'Ì1+0ýâK˜ü”¸KÜ¢V ¨6ÕœTjKÿ®ƒ:ˆ¦Žë\`t»n×í@A‚ÀÜãè?õˆAó›=Íž†ªUµB¬“­–q¾‰“ÿ«ýV~µ·‹¯ö>öuÞ`ÿc úñòuIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-13.1.png 644 233 144 2724 13755454066 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷܉IDATHÇÍ–]LTgÇŸ™‘‘¯*t½h'71¤ MvMpÒ õ£Ò ‘)±©UÊ”D©ýHzÁš&µ»nÒå·“!×li:¤A–Ö¦¢mÑ`©E뀡íB!t†#(3sÞ÷·3gÎì&{ï{sò|ýÿÏyßóüÏ+ ""džN¯Óë,NÛÎVÛ¿z÷êÝ<—¶»Lp48~ꀒΒN€µÝk»ÕMÛ¶âV~n½ˆŸËgù属O=Ÿ:j2ö1hªjªZýhÚþsòûòû–Rø<ð9@øLø GàÎå;—~¯ù½lÛŠ[ùV½…—‹/Çþ‡_òò¿€Çíq‹@ùÎòÞL'Ll€úë_˜rM¹´Ì9 B]Xk>Ƕâ™|«Þ³ð->‹?Ý@Ùö²í"°·yos~(]pó,¼óø;[|É>à}Þ§RFÊ0_1_atDGpàÛ¶âV¾UoáYøŸÅŸîÇ>J%"ò—˜/¥^Jeº¤ “É Ðß›™‘Ì´º®FÔ¤~Kýšút•®ÒUØk™1 ¥AU«j’ª(µ)µ ôwi|hÌkÌæ2üÙ£œ©üò'ó'Uœbü 0/PGXUªJ–->½¢—ôp‚œÈiä<ç9â‡rüa„ÁŒ˜3|¡ÆÕx¯ŽT4äù†±*ÝXåG™ë"Öh €îPO[¸Áæ` @nÝ0ºÁæÝ8ºqt#œòòòAt&:±ã:¨ƒ:ú¸>®Ûþ` x,x ýãÖ‘'Gž´¼êiýj`"0am×°EDdämø¤ö“ZHuè–ý—^~ãå7X±FdèÚе¡kp+t+t+Eþ"‘:::Á;áðNÀ탷Þ>h7’¸’¸’¸û‡÷ï¶5à‹¿ lØÂJæ5ZÌ©³cgǬÆFÞvJSq]qݦ­"Ïž ˆèÊSò”#äÔXÿ¡x¼/xw{w‹H·tK·ÈâšÅ5‹kDOž:<%ÒÚÒÚÒÚ"²nrÝäºI‘¥Ž¥Ž¥É.U  Tˆÿ¨ÿ¨ÿ¨Hùòéòi奆ñ¤³!ùÃöæíÍ""Å‹/nÚ*°¶hm‘ºÁà|p>úÙ± ú@õêv†a§½ ­ ­ ­°gמ]{vA¥¯ÒW郱ұұR;Ïì1{ÌÛÎâ©Ïf>³~Þ4foÎÞ«§˜ªOõ9nˆ3¹7¹WDž‘2ëï¿yÿÈý#"eõeõeõ"=ªGõ(‘¦xS¼).2xaðÂà*¨ B$r5r5rU$Þï÷‹$“‹ÉE{“Éñ丈|#ËÇYw™,¥žO=/"¢úU¿ã†SV;? ËJd02(âø“ˆ¯g %î]¢E¸¸¸DöÜwrßI‘…¼…¼…<‘ÒÓ¥§KO‹lîÝÜ»¹W¤6V«‰øÖûÖûÖ‹ÌsÆœa7Vp¦ « K$¯Ð5ãš‘Dæ›{ÝñBÄq‹ˆ5FÍÃöT&ÛÞk{ø·5•æWæWÿk¼7Þ‹Nt$ÞM¼›óQûþ„fïÎÞ½ ª]µ«vÐ-ºE·À|h>4µMmSÛìºx{üƒøèÄ¥åÁåA{*ù¶mGÛŽÜ©$«c³ù³Æ*ˆÞ‹ÞËâÔqO…T(GǾÖ_ê/AwënÝ#níÖnÐ1Ó±ÿÚe»@—ëò#z9zùÿê˜:£¼ºÑÕ貕Oj:5 t™Ëæ²­ü¼E;í ÿ¥ôpŽsœb,°ú–¾®¯?g•ÿ5õIÜæ³æ³Àß³Êïiô@Z˜r•ÿáýW>´·‹‡ö>öpÞ`ÿHàÜ!~–IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-XXX-grey.png 644 233 144 6125 13755454064 16242 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—T”պǿ{¿ó‹aŽüÐLI㇢Œ€W]¨(i7$WÂêæ1:g±Ôð &Õ•º.ûuk™¿®—OÉ9 (EGÉ‘a™P”)@f(fxgïû3تÕêùg¯½ßý>Ïg?ûûîý¼¤     Þ˜2ËTCWHL“ÄÄë Nœ,8Éý‹~(ú¡è‡µá܇ûpŸ·^Ä1`ÉV»Î®³ëx ŽáŽ‘|„! aŒ0Â`+¶b+/‘o”o”o$ù’É€dàßÇÈ!#¯(ô+ô+ôkì,Î,Î,Î$f1H ƒÈú)vÉÅåM§ãxz†±"VÄ.9ÆcޱGcŠjŠjŠjÎô9̳ÃÜÐf‹¶EÛ¢—¼êyÔó¨çQÔ.I\’¸$‘äk¤©F ÄøÆøÆøî¾û¹{¾û}·¿iÿ®xîøn7ŸÄ•Áå|ŸÁg°t’E²HVÐQ!H‚.~4vzìôØéy¾3f6ÌlpîL4&t2R©Ô“§äùò|y>l؃=Ø%l°Áà¼€ÌÆl̆Í>Ç>Ç>Oé[ô-ú>ùUØWa_…±Ãë†× ¯{þe2H´LáÌrf9³ÖåÙ<›g›Ò èr ÛËö²½ì2ZЂ–9’¨$*‰êbˆÃê°:¬ó®«7¨7¨7ˆñZV§ÕIÎxûzûzûâ®æj®†è´8-N ”D$"¢!¢0 Lü{þ=ÿJ™(e"ÄEŒ"FAÆæOÌŸ˜?!ôVm¨ÚPµAŒïmîmîmžw]¦’©dª‹uâ¸8.ޝüßË÷ò½ý—©G»G»G; õ—úKýÿë_¶:[­nÞ†`m°6X+>•™™)¹ê­ôVz+1‹é™žé¢ ¢€DX&,–4™&Ód€ôÒËä2¹ Ð(E£ÎçvnçvÀËêeõ²b–Û¿;ž;¾›ÇÍ'$<›ðl³ëcMŽ&GÓÛ…>ó}æûÌç!™W2¯d^.(R©ŠT88880ƒ¨Ã~Ã~Ã~Àâoñ·ø3Ì<2ó )HZ‡Ö¡ôf½Yo‡‡‡ï$ï$ï$È] ~=øõà×iš!Ökˆå‘6“Íd3-:Hf‘YdV[ ˜˜˜®¾±»ewËîÎÛ’Ú’Ú’Ø6>ecÎZg­³–sÖÈY#Ÿ¶ú­õ[ë·rþ }…¾B97Äâ qü7öÅÚ/Ö~±–óÝ»#vGpn¼c¼c¼óð¹ø¢ø¢øâtwÌßÍãæ£bˆ"†ÄnóòòBITBTBT)s­TæÎ "CdÓödÅ“OVQCQCQC@åÉÊ“•'–ÃrX`j5µšZæáæáæaàéš§kž®ÔsÕsÕs~…_áWa¶0[˜=íVæŽïæqó q–8Kœ¥pæ‚—¼¼àe’¿øøâã‹ÃÆsxÏœì!{È‹±‹~‡ßáwâE¼ˆ0ï¥y/Í{ h¶6[›­€åååÐ.¶‹í"ðˆêÕ#* í@Ú´‰%±$ d€ È@2¾“ïä;A¥%Òi lw³îfÝÍÂêþý7úoà=Š7ñ&Þ$a´’VÒÊé•Éñ9>Çç<á O"Dˆ $$`fa`Ö©Y§f´'´'´'€¶€¶€¶À~×~×~ؾ)|S8@ŒÄHŒà<@*R‘ @9ä®ã:®?ŒO·Ð-t €r”£œ„Q!@ø§£KG—Ž.Åmq—¸KÜ|I¾$_‚OÛa‡ýáÖÃÞÓ÷Í¢Y4@ŠH)à?ø’xI¼$þἩã~छt“npר0vmìÚØ5ܦÁ4˜óO©âmÅÛŠ·ÅÒÛ~·ýnûñO¿«ø®â» ˆ@ÆY"Kd‰3ë:AAA j5ƒ úãê«?bKcKcKøÂ¾@¥P)T ¿sÃLÏà<À 1ˆñÞäÞäÞd ç^Ͻž{øoÅmÅmÅm±”B -´…Ç$’IÉoômômôu[YYAIUTEUå7ø ~ ‘ÇÈcãV›«ÍÕf@Õ«êUõi¥i¥i¥@Š>EŸ¢n¦ÜL¹™´¶µ¶µ¶¸û¸ðDžÈ¢#:¢ƒ]LÓÅt(Ï÷œï9ßÃâ]çñÿ'qçG2êßäßäßtpŸl•l•lÕéþá˜á˜á¡·jWÕ®ª]Î.ž<‹gñ,Ø!…RàB×…® ]ÀÍ•7WÞ\ h[µ­ÚV@0 &Á„;vXéµÒk¥P™W™W™ôûŒ}F€ô’^Ò TPA®{C÷†î fë?Û¶ÿ,½*;";";rã¹É¾É¾É¾“Bô·ÑßF °VÖÊZÛ‚~ ?…_ÚsçÎùîWˆ+Ä|µ:O§Î#Ù‹&M,¿F®‘kDóŒæÍ3@ljljl*À/ð ü@BH ¿ü:ðk`ôêèÕÑ«€%F‰Q@Р…A 1ÞQÞQÞQŽgê–×-¯[Nþ¬”)eJÙÄ:ÈyວiÍ¡9 zŒ£Ç„v4  ÷4,žÅ³ø¬”-ÊeËE\zÿÒû—ÞçsísísíäldGdGd6nNßœ¾9Jòy¼`¶a@ÊI9)ÐŽv´ªQÕ¨jÈÏϰ[°£?)Rþ¤ÄŒº‘º‘º1X6(” J@&È™ØÇ°ë±Þð^ÊKy©dŽ«Ìsj¦êFÉr”%G›rè*ºŠ®Ú©C6²‘Mß«A j n·|bùÄò ”ä 9CÎ`”gÇÙqÅ(Fñ/> 4а +ÀÂX ›>7fÔî¯Ý_»ß¹cäÕ‘WG^•¼+•‡ÊCÏ«KÔ%ê’w.¢…($ÿ‡nt£[\ã®G=ч>ô‰ÈE.r‰.ü\ø¹ðs¥)ŠmŠmŠmg‹GüFüFü$–ª±ª±ª±‡Ú%Vb%VØ1„! Ç8Æòò&ÞÄ›Àé‡ôCú!ä­­­|õ7ºotßè„ROOOÿþ ÇiÇiÇ鼃………ïá=¼^.7'Ü 6W[ÉTLÅTðê¸ßq¿ã>àÈuä:rózúxúxú˜*ççç…ÒúMõ›ê7ñÕ$—ä’\ÈÙ)vЇ<àp+·r+à*ÿÆ{{{p¶AÓ iÐÀËÓìiö4l)[ʖ椇è!z¨Â%Åw]Ë\ネ{å®_w5ãÚ"¡tJ»Î$žÄ“øÕ)S¿ÿ1¹}rûävö×çÙóìyFWDŠ<yYëb]PÒt]»˜/æ‹ùúAè¡Nµ9ÎgŽn)**–.㸰ó*+ce¬Lò®kgÿæÞ±âââââbŒº3 ×À´†\ÚÝáÒî».í~þíNÖLÖLŠÛ-– K””RJ)¬îL4Ž7Ž7Ž3[YY™pK±O±O±¯³Ö~Ï~Ï~oß;·’n%ÝJ\€Á®÷”n@7ß4诀Ý”.—]ÚýÇo´00 ±|VðYÁgÎPC 5¼ô¾z_½/>iioioi'éÊ.e—² `Á,˜ÿõ’d³d³dóø„hB4!úÀï?]íø¯¹üŽ%$$$$$@tuõ\Æe\F^6?a~ÂüŽ;ÎÀ6Q"‘‡¤½÷ãš×ü¸Æ÷œÅ`1X üpljŽ'œËžüyòçI!WºBºBºb×^Á+xÅÿÖN#BïÔ]ÏÜ…žÜ•(ñ×<`¿£Ý"Ô£õÎB®ã:®Kè¦Õ´šVÿ3d"y"y"™=!-“–I˨AȲ…쯚C«C«C«×&ôt÷t÷t“ ìQö({”äò[ã´ýÅد´ë:.œ…ÈAr$ÿ&™$“dþ+”×óz^ÿ÷<÷xÜãqjú„>¡ïÞãì-ö{kûý®çºžëz˜DˆËŸ»°ÿ#Žÿ‹Óù>Ž‚´IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-17.2.png 644 233 144 2672 13755454066 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜoIDATHÇÍ–]l“eÇOs²É’ÌF³72aš,\P"3©ËRS…ÌŒM 1ÈL Y¸P!ËôÇT\a™Ùæp`FS¶a0aeF 2,lc›•Bû¾Ïûü¼hßµ~]xǹiÎ×ÿÿÏóôœ÷‘ù‰_4Wš+-7î§mOÆ3_Ê|iÉɸLãÇ+WÀ=ñ@ÞgyŸY×’¾·ëSûE’ø©|v\æK2ÑžÑîp'üCðê²W—e>÷?ðCVgVç}v|µã+€ŽÏ;>ç ø­ÿ·~€)÷”’¾·ëí~/_ý_Ò{Ò{¿@Æc‰@áºÂu‹wÇ ~Z /W¼ pkέ9: Ô80yÚ „ cÛDŠoçõv¿gãÛ|6\€ssx7y7e}o¸öÔ-¬[hóÀa3̰P•ª’(h¿öàÀIßÎÛõv¿gãÛ|6\Oò*-‘#/¢|¦ÏœÔ§0œ†x\U©* Ïð Ú|'T[ÔfµT®ÊU¹ ×j·}N)¦õ"óó óš±ÀX–?޾Qß(IðÏ^嘈ÈÓu#ëFx.__/º^ê{<|c=g=Gd–Âä!ùo‹I©FOè =TQM5€.ÓeDx/ޝ§GûFû²ÂYáð\üq=‰;véš5;@°žµ›BM‘¦zøÆðõáë:::6„æÉæÉæIhÍhÍhÍ€¡C'†NüSïHþÈS#OACQƒ«Á…Xu©åR‹µžÕ±ž ×#¬Ø mkÛÖ‚y@WoéÛ¸sãN¢öˆôôôÀ`Å`Å`”8Kœ%N(¿X~±übr¶÷ï?ÞŸ4ø`ðÁàp™.Óe‚»Þ½Ï½\¯çgçgí?4ìöêjè®ï®õc\ð~®'×£Û!t*t bKXÆ28µôäÌÉ(¼S* AOWOWO×?O¢¥ ¥ ¥|]¾.ß¿ä;Ïtžé<uûëö×íOÆ‹ƒK?Yú |¸ùãmoˆ½{L•ýmö·º] /'/Ç rv¢y¢tëìØPê-õ–z¡ÃÝáîHùSßk¸×p¯ŠnÝ.º ½Å½Å½Åɼr*§r¦\eåHåH%,o\Þ¸¼Ü»×l\³")cŠ ˜Z?µtx¾Ì+˜&Êê´:AI3¼†WDJDDÄ™˜ 1–‹ŒE"Ö5d ɬµº[Ý­n‘o·À+²:¸:¸:(UQU"ã+ÆWŒ¯ ŠÅ"+¯¬¼²òŠÈ†íª7T‹toê.é.ÉNÏKϧ܊^ˆ^qLëÝâ¦ÉÜðºðºÀ%‰úÏúÏŠ8ža[‚?–s-çrÎe‘ôÚôÚôÚ¤0ÀðDÊ=åžrO2~÷þÝûwï‹ø¶ú¶ú¶Šœvœvœvˆè£ú¨>*Ò½¤» »@dá­üïò¿“Xû[çšÎ5±M\ò@¹ˆú2\® \JN¥QóNÍ;À¯öTªsêÌ™i›iCÇÅöÅö%¯fºlºlº "þˆ?âOÆ­R«Ô*…É«“W'¯Bdodod/Œ×Œ¿6þŒÝSc }ûÍ›Õ7«áÁÏ6_m¬6l±§’Ù=v'ëNx.Œþ1úÇ,¬6«-u3ab¦x»ØÅ.þ‡éÅzñ,žþ¶ÇøËA'6¯^?gýÄè#Ã3Ç€c*¢"6:9d’ ¼Åö¤ðbôï‰ÅºzêÑúkS™ Cÿ ²U6è/øG}ïúÞ…¸ŽÔÍÿè~+Ù×Å#û{4_°h-ñ 9"IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-25-grey.png 644 233 144 6354 13755454063 16004 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ¡IDATXÃ…—TTU»Ç¿{ŸùÅ 8 ÐBcÆd¯ #þæ®Ô7òG”æ/pÉ$%×Ki Df-n¬…Š"¨¥ˆâ«à%BÒ{¥k¨dY¤#jùf„Á™9gïû3ú®ÖjõüsÖÞgŸçùìgÏÞÏ&999999Ð`ÄFt¦¬[Ö-ëæ 9‡råâÿ–×—×—×77œûpîóÙˆZQ+j#ÖÚkíµöZ¾å(G9ÉF(B  íh°k±–oW.V.V.&Ù²{²{²{WÊI?é'ýÿ(Ë}.÷¹Üçš®å¯Ê_•¿Š˜E¨udáûÎÅ¥¡O£hZÉòXËcß9†CŽ¡€iyuyuyu•=³Ãì07^´MµMµMx߳سسõs"æDÌ!Ù‘òHy¤˜æ;Íwš/àn»ß»Ç»¿wû{êßÏßÍãæ“¹2ý¹7÷fI$™$“d]± t‚î쾡ÃC‡‡ùŽiÓ8¦QÚ8§}NûœvêœÔ6©mRIPf+³•Ù°á|€ † 6ؼ·ñ6€çñ<ž‡Íh´"¡­¹­¹­™;¿ ý6ôÛP¶ñἇóÎ{ã µN­Sëf¨¤d)YJŽ/æ)<…§t'вåÉ–'[žhF3š½dµ²ZYms•cØ1ìZ¤ÕÇêcÅèÄwßI|GV©±j¬+ôðƒü ò`̃!C:Ð`Fa€A b@BNÒI:!âàdÞÞÞè:±ëÄ®»Ä¤®ó]ç»ÎËZ …Ç­Sâbq±¸xÖ ÌÂ,̺óXX°pÁ âGüˆßÎ[­ÀV7ËeÈ2d‰ )‰)‰)‰²sªªª¤—¤—¤— %Vb%V€d’L’ RA*ò ù…üðj^Í«îË}¹/¨ä’ððòðòð‚‘‘‘Eß¹Åoñ[\L0—˜KÌ%¾[UkUkUký*»•ÝÊîšR’×××°pš£ÕÑêh=ÕêýØû±÷cnHíMíMí%­šJM¥¦”­cëØ:xÓ\šKsøÃþxfk°k" P€N8á ‡ò?S1ÀOø ?Á:== ¶wÁÞ{ðH«Âª°*ˆI©ˆTD.Š”ñPÊC·þÝééôtzÆ|c¾1s4g4g4g `KÙR¶jz’ž¤'ûm¸m¸mÔAê u0Þ8Þ8ÞÈ×È×È×Öxk¼5èiëiëiH*I%©?Âð#¥±40 FƒÞšM‹¦¶8Gœ#Î9Õ—ª/U_äò@yàÖ¿ËDƒh Kõ9îsÜç8¶O6N6N6’R×O!ºofÞ̼™ :|èð¡Ã€ªXU¬*«««€±/Œ}aì @Ò wAï‚Þ@é¶Òm¥Û¿*¿*¿*@lÅF@®‘käà=í{Ú÷´€J(ÅäºÉu“ëHé9zŽž£Ø>d2ÿ–ŠM–M–M¶½rFåŒÊÜmC‘ˆDž¶y‰W‰W‰ç{£öFízÖÿ°þaýÃzÎßÿðýßÿó_~ ø5€ó+ú+ú+zÎwwíîÚÝõl°^±^±^ĬY³ú¤>©›Ä&± (_]¾º|5pö­³o}ë™T̳Ƭ$£d”Œ€ï:ßu¾ë`w'äÝ7ºot,š˜ˆ‰˜°‡HD"Ò>Ù3qÏÄ=¾ó}çûÎWÜìììx30llØØ°±Ò†$E’"I!X ,ØI/é%½PÊWËWËWÎg‹³°µÙÚlmÀšõkÖ¯YÐpNÃCU‡ªUÊéÊéÊ逘*¦Š©@Ìç1ŸÇ|¾èÖ¢[‹nÔèjt5:fky·åÝ–w©ZªU‡þ²ÂYç¬sÖMßI¶ônéÝÒ à2.ãò ;ä§å§å§¿óLLL J1~iüÒø%Ÿ=1{böÄlrîÁ¦›lÆ ã„q dYF–¢è#úAÝAÝAÝÀ˜ø1ñcâ‡ú‡ú‡z ·°·°·=0z`ô OÖ'ë“aûùàÏ>ˆeÆ c…ߨUj•Zõd¸À…ˆe˜€ ˜p=MFËi9-ZшF4Þd«Ùj¶:¹ÄÃááðpœÅ…—/¼|áe>q|Íøšñ5äè´ÃÓO;ŒÅ®£QM"H‰ÀÁÁè ƒàvnçv`¤˜Æ,³|Ìr?àü«õcëÇÖá]XX(êþ …¿ ¤‹t‘®Í K°K®§ñ"^Ä‹d®2OŠ©e[I )!%ç2„=ÂaÏÆZnàn ;Oôè;Ñ'¦÷¯ì_Ù¿jòy¼+Ó2-Ó\É•\ ±ˆˆ’(‰à·ùm~`þÌŸù?Õ¢÷©úSõ§ê¥ ý¦~S¿I¶Cé­ôVzÍ) ) )úâ,r‘‹\R…Nt¢SŒw×£žèAzÄk˜‡y˜GjÃ÷…ï ßW´DµEµEµåh¾EeQYT²ê¸ê¸ê8iƒ; ùˆ|D>‚\!Wȧq§ÿåLŸ‹¹˜ Nhm€ò‚é‚邉ϾŒË¸ ¡ÈSí©öTßyâ¨rT9ª6}z-÷Zîµ\€›¸‰›0Úåå Ô½ c£Ø(6 £¯þvõ·«¿ŽLG¦#sÓ§ž>ž>ž>ÝÇÚëÚëÚë„¢†×^oxÏ&$ƒd@É*X«‡<àp ·p @D"Ã÷M÷M÷M8Ú8¥qJãŒö4{š=Í‹bQ,jÓ§´ÒÂ;O\RÜ1‚ú ➸ëJ¢t5]K$hWÚ@¢I4‰ž½däÊqö¤3Ý™îLgëÞ`o°79©pRá¤B,f7Ø vj:N `³Ål1Ê’à’à’`)Ä<Ý<Ý<]èPMQMQM)š1òÓlla¥¬”•Êv¸Vö]÷ŠåçççççÃêÎ(\O5äÒî—vwbRLŠÏý75R#5n¬E RBwÖ9ëœuN1} l l  jJ)¥w&š†›†›†™íNéÒ;¥B‡j³j³jóµzû]û]ûÝÍ_tÌï˜ß1pêÝû©ÐÍ÷ôÀîj—ƒÿC&2‘IN†×„ׄ×-Q¥ªRU©GóûµýÚ~­làxÎñœã9ÒWE?ºÍ·Í·Í_5·6·6·’$õ õ õ €é™žé×}'[)[)[9üŠ!Òiˆ¤\ñþÝõþ#—€?±¸¸¸¸¸8ˆ®fWpWÿ4‡™ÃÌaøR'“Æ]•¥Aixmçïñ¿Çÿï[3p}àúÀuþ_W^=xõ 3èt:…LùLùLù̬@^ÆËxÙ‘ú‘ºNèÂ#<Â#ö¼{\‰ÿÈCðö'ÚÍCÐ åòZ^Ëkã:i5­¦Õÿcxòê“WŸ¼ÊÂä¥òRy)½.¤)Bʷ烫ƒ«ƒ«çÆ™:M¦Nrš°À÷¹üÖ¹mÆAñöíº¶ )È@†ì YEV‘UÿÌxoøÇÛ/z¼èñ"½.ô=BÏÝÙgì3öYúo7VÜXqc0ƒËŸ»°þ+Žÿ6×ÍýIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-12-grey.png 644 233 144 5770 13755454063 16001 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ­IDATXÃ…—TTåºÇ¿ïÞ{f˜øéJWÆæå‡q®ò#8µ<¶Àlpi´°ãU“KN&¦ „JÒ,Ö”éÖ-ò¦‰a ŠI3Š0D~8K~ ($ 2pa`fö~ßû³Á¥«ÕóÏ^ïžý<Ïg¿Ïw?ï3$/////Þ˜3ëÜ…[-Ün7X]ÞçyŸç}Îü F F Fþúóa>ÌçЉb€½Å^m¯¶W³wa€’‹P„"@7ºÑ ` ¶` {W•®JW¥“\áwáwá÷«2NÆÉøžòüÅù‹ó›®fff‘a1H ƒÈš9ú£‹Ë››ŒG<⹓´€Ðú£cÚ1í˜~8¦ÀX`,0žp ;†Ãõ—m+l+l+¢_w/q/q/Á×ѩѩѩ$7V«ˆU1¾1¾1¾€¼–—Ÿ—ýåxóñ]ùäü2Ì'¸vpódžÌ“f’l’M²ƒJø >ˆºðñôÓ_Lñ¨¯_½_½_½”“ÚÚÚÍ9#Í‘æH3Y«ÊUåªraÃ^ìÅ^h`ƒ 6/ãe¼ ` –` lö¥ö¥ö¥Xkn07˜˜ó»ÐïB¿ ¥9cÏŒ=3öÌ‹h‚4Aš ¿¸IÙR¶”RÂôLÏô72 ¸UdÿìþÙý³Ѐ†¥ ÕBµPÝpÊ1ã˜qÌ<ú7m¢6Q›(Æë^Õ½ª{U8é=é=é= -aAd!,„…@@zÐÀð0…)Lxãq€ô’^Ò £Å(«§ÕÓê‰þÊc•Ç*‰™ý?ôÿÐÿƒÐ¤T+ÕJõÍZ1]LÓ6" H¸õœúŠúŠú  ðWø+ü^²ÕÚjmµþM«Óê´:q­>KŸ¥Ïš¼yoÞ›Ç":A'èÀ²Y6ˆ€õXõ#cd ]¤‹t-¬QzÔtÝ@7@¼%oÉðjôjôjÄ"9¾öyíóÚçŵr~™GæãÄ)qJœZã8ç8ç8—õ~:?ŸŽë*tº AÖÈ$ãÇ8x’=dÙ313@Þ o7îÙA5ÔPˆD$"ÒFÚHÀ•r¥\)À[y+oØ(e£ð”ãë~Òý¤ûI8é—î—î—΂e™c¡,”…XïLr&9“€äÖäÖäV¤zWxWxW@I›i3m†'¾Ç÷ø ‘ÈG@ïxïxï8pé½Kï]zo¡ä¬ˆ±"f˜aîôßé¿Ó\m¸ÚpµèºÑu£ë@Ki)-X1+fÅðô>è}Ðû ”Éæds²©2ÌljÁb°¼r«Ï¨Ï¨Ï(ÞJŠJŠJ"e®7Urq\ˆœÈ‰0 H`ì3öû€žšžšžÌÙKö’½@ß–¾-}[€c9ÇrŽåßþúí¯ßþ T¼_ñ~ÅûÀ'QŸD}8O:O:Oλ+#k#k#kI™Ì#óqö»ö»ö»øïe‡—^v¹ê7Õoªß„Mº ].@#ÜÔÜÔÜÔ†m†m†mÀÈÛ#o¼ €àØW“q“q“q$JÌ3ÅL<&d ÙB6,°ÀÂwð|Ç=%>NŽ“ã d,pá>Kci, H©I©I©èAz~Žý9öçXÀ4d2 AMAMAM@ľˆ}ûÜ]W~ºuºuº}ÜZn-·–}Źv;ìvX,î[Ü·¸o1ûª£¼£¼£@"šFÓhÚ=_µl×q×¢!¢¹çjH ©&®M\›¸”––&/“—É H9”r(åð ÿ ÿ ðm|ß6ï>ÓŸÖŸÖŸX†,C–!¼çÖçÖçÖ'sÐA]¾AÈò„<’kò5ùš|%­õIë“Ö'¡á8Žã8L²xÏ‸׹׹ײ‰l"›,½ÉiršœÀtÂtÂtðšò5åkJ`ÕæU›WmÄF±QlèVº•n…]¼-ÞoCsþÒùKç/Ñxb!bÁGD"‘>V þý/ú_,Ú7R0R0R±y,f,f,æ¥þÊu•ë*×I»ôÐC¾˜­gëÙzØe ÙíƒöAÀÞdo²7-Î$Î$Î$ŽG‡`5¬†Õ%í%í%퀳ßÙïìl)¶[ Øæ–Í-›[ ªªª¢¶ÁáÁáÁa®Éã¢ÇE‹×6:N£Ó˜ó!Ù?¸pÿ €f4£9ð¨bD1¢ùQ=eœ2NÕ§¨SÔ)jöôš3kά9C.ÊZºÙ|³ùf3ˆä!yHÀcá…?HER‘TtŸê>Õ} p,q,q,°+°`­¬•µ*½J¯ÒÃ6ºrtåèJl¨5Ôj 8¯º¦º¦º6û 303Do@ÂÖ¹Ìyü•¹£NŠ%ñ$žÄ?}|nl»ðwçvçvçvúé‹ôEÊ­Ž<y$òÒY ‹a1ÐÒBZˆ! ,4µ{ÌuÔ¢ U¨Â¤íSÛ§¶OáYZVZVZ&þsÜ9îw G•SÊ)åÔ¿RçºÃØv€–ºÆ<)vnnRBJ.îà’¹d.9§zè¡ç>4:Œ£CÜn=m=m==8IOÑSôÔ=€s]l%[ÉV´“vÒN€úQ?ê7/Ïs¦s¦s&iל䄣*…J¡R|Y±-b[Ķ. ùÈ'§Ð‹^ôŠ)ò<êŽ `@¼ŽØ‰¤ú‰ª'ªž¨*^ç¶Õm«ÛÖ/ ÇýÇýÇýkåXåX嘴KNè>ìò‘‰@" ¿_È/‰"Q$ Œ3pÎU£¥ÑÒhaO·ôµôµôñÅÍÍÍ·f»»»wµe´e´eÌÂ,Ì/WžÏdP›ëzšzPê¯ößÚkÿ pìtìtìÜ]äîãîãîsãt·±ÛØmä‹ë2ê2ê2ØÓdÙAv@E+h­“‡6Á&Ø@D"3w,w,w,ø²~yýòúåðrvvh£q»‹¸#ÜîÈ­Ù¹âº>…5ó,!×_•ké*_ìÒî.—v×¹´ûï?Ò.í¢]´ .Œ ãÂ`sÅ\1ªã!ÇCއH?5üÔðS|Ûr·ånË‹ÿÂxÆ3>§‰–Ñ2Z&uUöŸrÅ 1)ï(\7æ5äÒî.—vº´{îí:N£SÜn-·–[Ëçû¦ÓŒi†Ún•Ý*»UÆ÷¸ísÛç¶ïú×ö!û}hß=Ïö<Ûó,àÔºü42à|ß¾ÿã¼ï+ÀO.íþû파Ö3ygòÎäI»\½—Ù×ìköÅÿ4\i¸Òp…djº4]š.€j©–jÿñ£°IØ$lšùÏàØàØàXî®+ßsr;¾Ÿ‹ÇXRRRRRD×ÒÌ”LÉ”äïÃáÃáÃáøTzDzDz䲨 V«‚_øðvÊí”Û)¾UÖNk§µ“½ßþYûgíŸI«¦œSÎ)'¿S±Z±Z±ú_KY9+gåÿû5TPAÅ÷ã.îâ.]"WÀµQâý<b ÝÔ¡uR>«fÕ¬:©—;ËåÎ~<›6›6›FÃeŠ2E×Éëy=¯ÿ!gCÎþ5ÉÒkéµô’oèÃôaú0ûØ×è´ý‡?±û´ëjR>v`vWIÉ"Y—BX«cu{^V/S/S/ã:ù~€ZFÑCôÐöߺ6vmìÚÌ"ØO,gþŒãÿ¤›ôå"c©ÎIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-37.9.png 644 233 144 2755 13755454070 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¢IDATHÇÍ–ÿOUuÇ? pïõ ‰b–‘Õ4´!3§S7¸ sv·;’¿0&ºimIÂ2‡›¬¤H(§á¸s‹šc7LÜ)ÓÊYׯL¯¢^Ü{Ï9ŸW?Ü{:wúx~9{?_Þïgç9ÏóùB19òû|ìó±Ia»Æ´[—[—¿ô]ïÑ æí˜·/~ O}õÔWÉîd·ÞgbÃoÄGç aòGëv1Y˜K³¥9ÆÁUðÎkï¼fÆ5`k±µƒßÐ3ôÃõHÉIÉò ó mᄾoaSê¦TC/Ôì`“@QG´"­ˆÈÙ@ 1`bÃoÄùŸÁoèúázÌV*Bñy.ä{ó½ _u©½¡i¡i 7¨Uj!y‡4ÒjH}¨>í]­P+-IKÒ’@:dŽÌáÑGê£j’šDH½šš²(Ìùò÷ }£•'„bvØFl##qR÷vy»€í¼òuù: ?q”£@)¥”FI ŒÂ JTEŠT¤|ÂvÈ™ƒÂþ½ˆ>¿…ëÜBˆ=¿JÖæ­Í3èôyçov»º]Ps²æxÍqdÿ®þ/ú¿€Aû }ÐuCuCuC°ïî¾»ûîB“¥ÉÒdÞÚÞÚÞÚǾçËΗ/ƒú%õsêç ¯u_®¾\mêÉkg¯m´vϯBûC!þúyyàwç•WfÈ’ÉŸ&¾šø*×%ן®?!#%#%#Ü;Ý;Ý;!»-»-» œV§Õi5g»álÃÙ†³fAçvÛun¤•¦•¦•ÂâÝ‹k×À¬5/'¼œ@`ð­±gÇž•%à©óÔ´„ëz¦Ýo÷Ëfýyôg8¦·[Ú-PùF…­ÂGÆŒƒÌ–Ì–Ìè>Ü}¸û°)ìÖݺ[‡üƒùó!B„L½«ÞUï‚%7—Ü\rÓ´g Ï;4ï|}±áZÃ5€àÉàIPµ‰'&žÍ’“õKXïÜ»sÏûÛüëýëaÅ¢‹V,‚YU³ªfUA_A_A_+ƒ•ÁJ˜Ù?³f?tftftf<ÞÂëׯ7BVQVQV87;7;7C‚øã_„o’ÝÛÜÛMÑÐDbRb’~Ih){'öÊf–ËáËc»;ww›•Ë˦@ú™ô3égÀsÕsÕs(>P Ë–/,7ã–€%`!ïwÈ §ÛO·Ÿn‡‚Õ« VÃÞ±½Ê^ž™ÿtðé üò =Ô}oô=ÐíMö&Ù,Œž‚g©g)üóÑxîx®,™ÿfæ­Ì[¦^žÚ3µòZóZóZÍ )¤¨®¨®¨®0í[¶l…¹[æn™»zj{j{jÁ™ëÌuæBê+©Ï¥>›Öo´o´ˆÌn ¿ïú¾ ØùÇŒ)àøº¸uqæ”?sŒ9àv¼Oñ)H­AkÐÌü«ü«ü«@éP:”Ó®Wê•z% oÞ>¼=¼neÛ‚Ç‚ÇÀ—åËöe#帺@]`êqÝšuk=2•~dµ…÷Šlü•È™ §È) ýÒ/ýQ?Q1ÅGáqÆÂÓ˜Â+äòý¶~EÎŒð¯÷þëýÀæ³ùFâ¸jì1cÐÆæ]9aå ,¼™åQÕ¯úo´Amðÿy“$bÅ ”±‘Q…\Æ‹äßò‚¼@øôI­vC»AHžR}ª8懕q+ã€Ð£›ÿÉ=+ŸØÛÅ{{2o°ÿûbæ2T÷ðyssžsÎ÷ûÍ=÷ùÞG@DD"O[š-ÍŽmïD÷í¯Û_Ï<Ž j…7>€ø–ø€Ä‰'Ì©hlå­úµý"Qüµ|Ö¾$Ht#¶7¶WˉÄÁ›»ÞÜeÿE8þË08Ü÷J*¿©üàëϾþŒßÁO—~º°³ÑØÊ[õV¿…·_>z‚_búcúµAì†Ø "ž›ž›Q.øgäçåç̬›Y§l`ø€MlR9€?Öš[[ùH½ÕoáYøŸÅÖ#´?i¿””:ºÂ S_@ý–ú-Ÿî>á6AÈòeFA «a44ˆÆVÞª·ú-< ßâ³øÃz¢£4EDþúkŒ¢PQhUШéÐ_Ð_uÛØcìA$”QoÔu`ì4v;À(7Êr 'Nž\Jý2”ÊFMéÏëσ9Ƈ¢é¢i á_¥WDäÅ&pÜqÜñ¯çÛ[[omã{œœ7_2_"°Jq‡[Üò‡<½ÖT£æÔœšÊqáP¯©×ði_-NN8ü¿=Ãa=‘7v|„ÅêÊêJP˜{,àŽ˜Žç:žC·Ž77E ÏÜ;sïÌ=hÍoÍo͇ö±ö±ö1˜Ÿ˜Ÿ˜ŸxZ¯'Å“ìI†c[¥KCýãWc'ÇNZYs V9«œÀý°›ìy¥OrnçÜ1EDD{¹ìRiuiµ+C•*ˆæ;áûÜ÷¹ˆªQ5ªF¤j°j°jPd i i IdTÕF5‘ŮŮÅ.Y]7Zn´Ühɽ›;“;#r¶âì[gß­`_aMahôz µ—µ y¯æ½*bÎDôðç8gœSõÂýÓ÷OC0“]ì‚ÓÛO-Z‚´¼4gš.6\l¸ØSéSéSé íÔvj;!¯6¯6¯ºWºWºWž~Sîe÷²{êêê¢û;&·wnï„æß´U´Uß ¾!cãàÆAÕ+¸9q³9Éù¹Ž¹P_=öd{³½Ù^ð x<0Q?|^D{ED„Šˆ®àæKqƒqƒ"ªY5«f‘¬æ¬æ¬f‘¡Ø¡Ø¡X‘„î„î„n‘,=KÏÒEœv§Ýi9päÀ‘GDÎ]9wåÜuTUGEú2ûRûRE¶Ì¤ ¥ I°÷Ú/´S!i×Þ¸ö†ˆñ•¿Ü_~m,z*õê÷«ßþmJã‚q–þ¶ôåÒ—¨à§ÁÆ`ct4z›Þ¦·Ïî³ûì 2T†Êó¦yÓ¼ óýóýóý888 ¾jßÛ¾·Á{×kx Ô½ßßuÝuÁo[|ïß ¿ ë‰{± ³ŽYÿz˜^ž^^åw²bv™]QgR?¨5ê :¨®ñ«mj›Ú¤’Jêšëxô3¯ÍP«xNxÂÇø™‰ "Ϋ­;´.êüü!/pܨóó'i5¨¾Sßnܸÿ0Ë,¨jVÍÅ|ÌÇ(õmÈèêGc£±Ôü£E}hýšÖ:ÿ³û¯|foÏì}ìÙ¼Áþdéëí1ZÖIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-85-red.png 644 233 144 4256 13755454064 15616 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜcIDATXí—LTWÇÏ}ïBÅŵ±¢ÌìFØEE‚1êªY~è©S[ùÃ)˜@ Ö]«Ö„Z%P[4ŠÕb­¬mÍ8nJ”Vƒ?VüÑv»š¸JªÅ™)`bAut˜÷ã»0÷͛٬f³{ÿsÏ=ç|Þ¹ß{o†hpŒ ¨!d u u u±'ቄ!MCš†4åÿAR$ER®¢É4™&ƒnmI$‘Äm ÚÖvðõ<žçãù£ë YÑàî@†…s˰–a î÷Àð¢áEÀà=…› 7A•+3ú¥Ï¤Ï ¶?îzÜu–Ÿ—ÿ¼\’ûòïºà<œƒ~4¿f~ÍüšÈ—)î¢">>US3Êg”Z Z Œ@]B—u5u50õý©ïGIäsísP[ÕV>µ^­·úºúz¤>çá|BøH7å™òLyúJËè]#¢Q|ªàrÁe"¢›‰7‰ˆ¾˜÷Å<"¢:¹N&"ʼžyˆÈò­å["¢ó9çsˆˆn¤ÜH!"šq~Æy"¢YöYv"¢“£NŽ"¢8¡L(#¢/µ>­/RßÔ`j05èG~|é¹Ôs©ç¹ƒBP $Š«Ä*±Š@eáµÌŠY!"òWú+‰ˆjÛkÛ‰ˆŽ§O!"ee""b6f#"’:¥N"¢”ΔN"¢U?¬úˆhì½±÷ˆh`~Æü "ê¼ZxµH8!µImî ‰>¯Ïëó’›ó‘`l‚-t/Üâ^[¿·~¯AqËË0¢sD'€àT·²;µ;Õ¸õ®¸ç<žþWü¯–ËO^~ò2°Yl 4îÚµ+rÝyºýt»þ®`™,“e†î‘8Mœ&NÛRÍO™å·æUæUÊ8Ï"ïEïÅÈõ¡ÍÝ8ºVƯŒ q×ÕÞ«½ l6Àá®Ã]0qãÄPþMù7ÐÀ÷W¾¿à5þaM+šV »'m™6!MÕq´8Z}à!%ä%ä%äI­R«ÔêèÑ/ü¹oç¾­¬ãùUû±…Ç"—h-¬–Õ;ùêøWÇ;]¿­~›ñ”³ØGÚêòå7"Ÿ[ú÷·JÞ*Q:à2q™¸ìŸ‹íx~êùHÞgÊ4eš2½õ<À^±þ½õïi³õûõíÍ·7C¾šøÕDþ3_Ÿùä7ä7½è5ð²üd€ÃÛo”’sÉç’#ý=úÈYà,ì/ T ÕBõ³|6†ac&Œÿ¡Ÿ¯%¬˜Ï©cæb.®õO®³ÎeÎepéÚ]§¦«éF íŒvŽt𖦥Nà ÍÖÞÑÞ‰H©ÇÑ]Ó]XâÌEæ"yµÞÉm¢]´Û­:šld“ÌÖÊ¡i9ÉIN"Ñ'Þï®?¡?­uæær¢g“;赫?­»±Û Ý@øét©ŸªŸÚâ;ä†Yô·¢ì¢leþ=–îK÷]Û“Ö$­IZC$X«`eaºŽ9,üw±x[¼-ÞfÍ©R7¤n 2•šJM¥®íºvs¬9Ö£vU»jG.¸àðð Òh%MISÒ"ZÜ3}Ïô=ÓµÙ<Ÿ)Ñ”hJìy6h›ã¢wšµÄl=±ób´mŽÔ®§1¢]{…½Â ÝD9QNŒ©wÕ»ê݈;ÐÀßßß¡êšL„„7·ÆHq_ ßPzþ„¸Ç Ý%lÉœBæ`æ0j×uÖu6¢]ù¬|V>QîÓ¤§IO“€ôþôþô~å÷ºÄ±a÷L.µ°ôbE/‘ÑgÐîNóNóN9Ñãð8<AD?'µ7Û›íÍ‘kGª“ꤺŽðO’ø¶˜ºáyzéE€±ƒ¼Öîñÿ¤ÝÜy¹órçE´ëšéšéš‰/ýš¾¬˜³â9[¢Ëbê2ú/Ç‹´›%V‹Õbµw .®,®,®Ôve d d È×ô­ö‰>ÑgO¦#t„ŽPøÚ=1õ†Òÿ8bµ»=ÚÎídKÙR¶ * u‚0V+Œ1btî¢%` XDb»Ø.¶³ÓáÀÅ1;÷‰úy”GyÒÕh÷¦A4AX ka-w~38ÿ;WÌθcò¾p«ÿR‡3ÇÚ›IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-12.9.png 644 233 144 3036 13755454066 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÓIDATHÇÍ–mL”g†0€ˆ@¬µ¶`IýhpÅÔn‚?dºKªRÍŽ‰„ ¤«Æª5mR³­›(Yìnµ%5mf]"lÔÒ.‚Ú­YЦ…véD:|Îûñ\ûcæåe›ìŸ?“û|Ü÷yæœyDD$%ò)ÆÑ»íø¼Wæ½òÜù0>c@Ô«Q¯þp|¸àC€Ôs©çÌn«~n¿ˆÍ?WÏŠKŠØøKñ—¢\|^Ëy-gÞSa\ÕÎzgý„e e W>»ò{àAûƒv€Ç®Ç.°±•·ê­~‹o.¿ý…¾Ä~ûE”âãâãDàÙ‚g –î ü{)l.Ú\p?æ~ŒŠã!D’rA‚Xgx¶ò‘z«ßâ³ø-=K?ìG`aþÂ|زcËç§á†n¼•þVº¥§ÕÇ9NèA=`¸ 73 ÚTQD­¼Uoõ[|¿¥gé‡ýØWiŠˆüéw[õ­ú¬!¯™¤eiY n‹ŒEh‘„R‹TŠJ½[ïÒ»Àì0;Ìì3Á(£³H™ãz²žŒ¦hOkOƒr‡ùaëØÖ1àqDö*ý""ËkÀù“ó§ ƒ«½™½™`Ü +æ2s“³ u_Ýv±‹]sŒœà'@ù•_ùí°z¤©GÀ9Îq•¯ò™ä·þ%=Þ/€3è |öùÆÎÜb´¢¬¢ ÔsµE\[V{¨öª³·³»³Ûì.é.é.êÌêÌêLèXÓ±¦c7 Ó0 ß=x÷à݃pzÝéN¿€êû¾÷ƒÞf«W+_ùòòåÖÕž¹%¼("Òq.¾|ñeШÒß{·—o/gÆ‘VO«§Õý£ý£ý£°¤yIó’fpssƒŒýû3öƒ7Á›àM° Ý)¹Sr§²Ê²Ê²Ê ï¯yUyU°lwv\v3þ©g¦žQ¥PWSW*>ìG8™\˜\¨.AàBà„ž#‡¸°âüØù1HMIïuïuïuh¹Ùr³å&pppÛVÞ[yoå=8å?å?5ç*«ÕŽj¬ë_׿®ßŽç¯n\ÝùᓾOúB-¡Є¯¾V—Rç§Î7»¸6\;\ êo³c@ž;Ï熺½u{ëöÚÄ]ù]ù]ù°ªfUͪpísísíƒq߸oÜg×õyú<}ÈuçºsÝPt¸èpÑaˆ[›› §ž{ïÜ{ ƒ1iL‚!ó“ç'›]Ñb˜õf}T—Dk[´-"²VDDFfCf3fˆ$®H\‘¸BÄ_é¯ôWŠä6ä6ä6ˆï)ÞS¼G¤iCÓ†¦ "Ããðˆ‘‡ñãÆ‹d«l•­D6Ýôþ¦÷EÒTjOjH–oé»Kß•…"ÓoO¿-"~õ‘ú(ª+ZÁ‚`Açw2Óv­íšHÔK""¼ñJÜž¸9q³HRNRNRŽÈí©ÛS·§D´-EKiÜØ¸±q£HYd!röòÙËg/‹ß(¾Q|C$®*®*®JdjxjxjX¤òוÏW>/²ó7î4wš„ ¬]ËëòãÕWwˆÄ|<¹srgçwöTjïT¼ô[Si4Í0¶iì±7PÚ¿´v­B¥¡ÒP) :9tüþÿ ˜æ€ ­­­0²xdñÈbPåª\•Cè¡/C_Â`îàúÁõ(5­¯Õ×ÚSÉãŠÝ»!¼OÏÜŠ[^ÎAç`Ð=ã=ã³?‘B0/ší=èèüÿ3Í4ÓsðS¤‘j£zS½ `™CLª_EøÿÐósÏÏ0«ÿŸÿÙc"¨ÈæUÛb¶ÅØ›Ÿݧû€3ÙLFãÏ|ÅW(õwõ¹úÔ·ª]µƒjRMª ¨ œrP#* @ ¼g9eø šj×õAàŸÖæßæØæ´_nþ'÷¿ò‰}]<±ï±'óû_ï9ÞPUIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-7.4.png 644 233 144 2372 13755454066 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܯIDATHÇÍ–oHÕWÇuvÍ2Ú‹¨PÚ›T‚åê®Äa—0µæ*Xlôf­[ÑZé‚ Û°ÔÕŠµ/ePô¦õç. $ÆX9§+Ý KÆ,Ó‹z¯÷w~ç³÷¿ _ìçÍåû<ç|¿ßß9ÏyÉ_ÔÅ©‹Ss8u·Ï(Í(}ï§>­ eKʖLJaNÓœ&€Ü–Ü»ÛÁ&oæ»×‹8ün=—¹â<­žÖ_ƒmË·-Ïx7¿ CæÕÌ«cì¹¶çÀ•óWÎó v v û†}à`“7óÍzÃçæ—coè‹@úô)ƒg–g–ä•ä•,Ù—˜ðd lÞ´yÀ@Ú@šNõ/M¶ö"˜1äÂ&ŸœoÖ>ÃoôŒ~ÂÀüõó׋@yuyufsbA÷°ÑþEF/~¨§žl°"V@íP;ˆë0)¤€ƒMÞÌ7ë Ÿá7zF?áG^?ÛÆD*ã•ñ)CíúžuÂ:*mr÷änâj»:®Ž£UŽÊT™ ?Ð>³/==o‘·È[äÄ'‰¼ÜùrçËPßYßYß YYYWžWžWî}óÍš¸t¦.Úë;–*ñE|¿uŠÜ»}ﶈ(vÉv]¤‹d2yy%|&|&|FÄ_æ/ó—ÉÔžžžY“¾&}MºHÕDÕDÕ„ÈXt,:©+­+­+Y׳®g]Hí×µ'kOŠH†jU­2™öCRÏè?oÞJìä-ùÙj³œÒ¯¾zuèÕ!‡ÇîZ Ø;C‡=;Çαsœ|TEUTÁ臣¾Q§ßinX—­ËS,ÓÝÊÿÑÇ>e»\Eeaa¹p 4€n×íºøˆrÊ?“ù/UŸêsõ1ÕëÁ4}ÌÕùIvb Þê‰zäª:UGœÏ DOù‹^zA?ÕOõS ‹Ç›gñl=ËÇò³zÏæ!þ7áþ¼ø1~ŒëOc;”PšPšPªì=~ýøõã×Õ)Îaç°s€\Ç8Æô£ý€ææY<[Ïò±üáõæ}ôl>2LãùA~°ÿKy-óZæ5ù×}Þ>oŸ}˜š¢¦¨)‹bQ,€²DY¢,”|%_Éñó,ž­gùX~ 8¬¾aš†ÆY9+g%«Ä*±ªå6[`ª1Õ˜jä| ¬BmTá”[¼'¼'µ_ž-ÏàQ*E(àC¸y|ŠOÔ~¯Íkäw¹»P+Ô5Nfª12’óY}ÆÃøH÷@÷@÷ /* •†Ju¾ý‘½ÏÞ‡‘@§ò¾%G€ú“ú,¡}J¯Ú xo€zX= ¨Fõ¿Ç+ï{á ºNû£þéýÓ1b¨4X u>ãÑøÄâNqgw›h(iØÚ°UÝHà’­Þ ïDH÷HÅHœÉ;“/v¼îw~ÆzÓ{Ó )¯)€ûÂé §@~*?d«R¥TiÁ®†’†’†u‡¶³a|¤:âÇ-Ž[ŒšÇk››´…2Ù7|=ð5$½™ô&ˆûÅý€ÿc®17°ófçMà‡ùa˜¶yÚæxgArA2 åÔ{¼fØ6lãc G6ÝptÃÑà—)}ž¹ž¹lhû[Û߀d)Y Í}?å~ èÏëÏÀw ¾[±±°¬fYMhüÕœ«9!ÀŽÛ ·¥/ ØÅxŸ8Rɺl]¶.[;cÑT&ÜnÑŸÙЭ·f½lyÙBDôúŒ×gÉÙBDôùàçƒDDiwÒîeÑå»—ï5¯m^KDtQ¾(-ýpé‡D4)©8©˜ˆêe*ýõumº6]›väÙýªgÔeÔeÔáÞçzäzàþ‚í£SF§pêmzLýtê§°iý¦õž›ž QµQµðcÓMБՑ*Ô¸Ô8ÐUè*¸s¯ä^ð§ÞS¨©hF3T¶¥™±™±™±¸ÇøˆÏçóù|ïP` ædyÓM_„H`’§ÇÓI=I=Üû†ö …vi4g4„w„wà¨ù¨^9òÊx÷Æ»7BU8=üålãÖÆ­ÁzWj/\Ñ^Àßr©\*—ê"a™°LXv š²Ä¹‰/$¾ Ì³oºëºë ^jÖkÇ^;K7-Ý¿½{}÷úÐks´9`áW ¿€2©,TÓ®o¥o%kY|KOKܬÔâÉÉ>íf ³„YPLvLvL6‘xU¼*^mÔ.ü‚¬uYë”=,¿Ïü}Þ÷ypCš9>s€‹b¿[\[\!@øÌø™xïàä*¹J#þxßǯ~òê'P¹^®Jÿ²­b[…Ï¥– eBÙߊüþdvê™%ÔëRu©ºÔþ&¶ÀlÙ[¸·PÍÒ:ûƒøƒ8¥œR8»ÎvÙ+ûoðÃ8Âë¾?qN§ŸN”’‹/]|)¸¿gƬuÖ:ÿþ|5_ÍWO¬áfs³¹Ù¿:(ÜÒÎ×n ·eu#×ʵr­L+¾ßI]’Q2‚5Ñ¥ìñ-ò- Rwž‰BPÕÕêjÀIœÔ,uªõÎÁÖ>'’ ÉòNm'ßv »Ì& -Ÿò)_4Yd$£øYÉJV"Á! C{ÿ¤=­‹Á"ëíûíéöôPíz]^˛Ѣ]&É×ëëÔ"ï˜w nx€Í=›gnž©ìÑ^ qÑ!:¤Cñ»âwÅï"âM¼‰7qgt% sjà·H¸'Üîqçæï›¿oþ>"]©®TW*Ò´k4MÆPíúÌ>3Ü AðOð$¸ÑÊe² xôê–×-¯[®fio¹^§×é'ü¾aRx§¹ÎˆÖá~î&ùµk?Ô®Ùb¶„hW/ëe}È÷Ð÷Ð÷0¨El°ÒdÛdÛd›ºQÓd ÃǼq0BŠõ|Ñôì¡.B»F»]RWP»r—Ü%w•û4þiüÓx`Ñè¢ÑE£Ê/5-¶ mBÛ±LjéEN§çX0€%j×!8B´[k¨5ÔÊz{«½ÕÞ À 7Üe¤æsæsæsÁkGlÅF[à_’É7#êÆiÊó#-x# Ý?þ'í®Z·jݪ{WZ!­Và”^Õ:ÁsÅ\ñêáeø'u9ú/íyÚ])T ÕBuÿ\\Y\Y\©þ>Å“âIñÈÕZí‚Ü@-ÔB-¸v{D½hú-R»‡ÂýUç¶qÛ¸måPåøòsø9ü€#Ž8ºüe¢+Ñ•è"º…n¡›»XXѹÿ›éµ¿²)›²ÅÛáÓûKx•Wyà:¹N®óIþñ_Hé‹ÈûÜVÿ yœt¸Ÿ_IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.8.png 644 233 144 2452 13755454066 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜßIDATHÇÍ–LSWÇE¥ (˜.Ff£ˆ¢óG1þˆ‰ÉºŒ4щ‰Y¶ Mœ#YÆŸb¢âê Høk€›C‚’ —%«ÙŒ'ÈHÙG[e€Úé»ï~öG{ûnþÏýçõœ{Î÷û}§÷œw5Ð4MÓ²O lN›Ó¶5ýöýöýymq»I@JIJɳ³°¢aE@vsv³1dÚj_Å[ó5ÍÄ·ò)¿–¥™Ž´ö´öwÂ>G·Ýn'n_}é·ÓoGt¨è¬èèhíhå3õ„z^¹_¹Á´Õ¾ŠWù ÏŠ¯ƒ_Ó`q×â®”¿ mIÚMƒµEk‹Öøs=:xè Àhêhª´€øXÆ2é„QkÜb«ýD¼ÊWx _ñ)þ¸ …ŽBMO™§,ýëxÂзPµ¦jâ‹Ý.q‰e ‡õ0€(åÌ| B ˜¶ÚWñ*_á)|ŧøãz´ùÿíWBiZiˆ=¹z^CLÒÑA}Æ#ãæŠ‰çÄ—3"Fô¿ÅR±)ßÓ¯êW‰˜ÀL_&ø’üšUÐæzH¥‡Â‹ˆOO'ñÈqQ,ЉòW¸br™Ë\0Ý2,Ã2 \à,ñßð„'À¢U´UøÌ G†#äOèIkúNUŸªN¾ïy#Ök2ùüïú~Ô®«]W»úvöíìÛi©4¤!M»¿­¿­¿ ®»vîÚ9ð×ø«ýÕ&Þ||c‡ÉדÖ÷%Üœº9Æ€ü$‘17¸c00œºSwêà®q׸kÀYé¬tVBwww¿)È—ãËñå@nSnSn”ˆQ" וëÊuÁÐÇCdžŽ%Ãçä"ÅçWz4Xî]î•íÚÚ†yëÎÉ;w* ª²ª²ªÒôoy¾åù–çPWPWPW`ú»½ÝÞn/¬Þ°zÃê Ðh4lòmòmòoÌ÷Ò÷ÒRéïÕ¯8¿Ò£Avfv¦ñ;ŒÆ€ˆ·½¬4ÊŒ2À_î/÷—ƒ«ÞUïª÷÷÷‡Â¡pÈŒóvz;½°2oeÞÊ<ð4{š=Íÿ8ÿqþcð]÷]÷]·{¦ÆL‚?¡ç¿ë_±î ܃ŒU«2VÁEqQ\ðúî뻯ïBôEôEôL•M•M•AÝÆºuaOÞ†= &ÎÖ[[om½õõ®z—é￵bóϘpÏ?c-Ž–Œ– °õÚzm½°»hwÑî"pt9º]P[\[\[ ûf÷Íî›…§íOÛŸ¶Ãaã°qØ€¬‘¬‘¬ð÷÷‡‰ß&z&z,glè­gì®üIu‰ˆ‰Ìþ1;3;ƒûeÌ;æ…@0 !h ‘û‘û‘û0¹mrÛä60ü†ßðƒÈ9"ƦǦǦA|!N‹ÓfW2 ÷èIoíJËcX ‹$À0N'’s`Ž9‹%jÝ•“rRN‚´K»´[ü›åyä°Ø+öZæXrnþï³L~½4µ4UÁÅrVŠBí"Sd“¿Ê)9…”ßÉÙœâ$'MAe¸A - ”ADÒ(fÄ 1ƒbÐø”ÚKíªRó&ÿ‚ýV.ØÛÅ‚½-Ìì¿À®Ý<=FóIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.8.png 644 233 144 2521 13755454066 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–OLTWÆ/(Ä@ìB"1#FéB1™&nX@ý%‘!TèBH‰•Ħ¦ S´ÒºhɬШРЈH°­Jíà¤Ó ÂÈH2´"#D†0çÝw]Ì<ÞÓÖ=wóÞ9÷;ß÷åÝ{Ï»„B¤ÅŸ³³×ÇâÄÏÌ|ÊÁ”ƒÙm±Ø%!¡4¡ôÉ×°¡iC@zKz‹î7ccÞÀ[ë…0ù­zF^¤ 3‘ܞܞP/BùÎò)ÄâË}Ú™Ú¹ Á‰['nt´v´ò9„Ü!7ÀlÁl˜±1oàzƒÏÊ/.¾£/$ÝIº“0ɶd›°eÿ–ý[kb€Ñ­p¨øP1ÀøªñU*ä?ÀZÖª`žyŒ1m‰ù8Þ¨7ø ~CÏÐù°1c¾à<ê<šúC¬ÀÿœÝ|v³¡í.q‰µ Íkó²RV²ªOõ@˜±1oàzƒÏà7ô ý˜ñöÚ^Ù‡*³•Ù€(@ôwcr ô –¯åÕþ–kä”Ú©rTæ&l†zT_Ð@{Ǩ]Ö.9#g€Å8¿*K.K6 ^ÙgYJ!„Èi„ÔPjh~5‘À|À\šO”&ÉcDø–N:-Fºè¢ ¨¤’J3­Õ¢Zꨣ΂ÿ/^àcÙ*[‰ü, °¬÷7æú NÖž¬…ØþÐw«×ÑçÑ禞ï/_À€ú¼ú¼ú<¼ ¼ ¼´|¡‡úCý¡ûÚ|m¾6¨?_¾þ<Œ|7R;Rkò©ëQWÔµ\½{Y?î'nì/áÆÜ9ÐTu¼bi 8040i i i PÚTÚTÚY£Y£Y£ð¬ãYdzÓ§ßÓïé»Ëî²» T–ÊR ö]ö]ö]à¯òñY†/©Õ†^Lßð#`ýƒõT;„!èŸòÖ¸Wt¯ð^!œÛ{nï¹½ÐéŽtG ·7·7·¼O½O½OM¼û¸û¸û8lÚ¶iÛ¦mЬ7ëÍ:ìðìðìð€gÊ3é™´|é.ã-¦oø¾.}> Ó/¦_XŽýj}VŸ5 æ.Ì]˜»EŠ€œ¼œ¼œ<ðÕøj|5&î~Ûý¶ûm‘‘‘ Îg‹³¶?Þþxûcð\ó\ó\³{b´C?æ'Qý¶~;aX­D+B/B±Qh‰é‰éB4~ÔèhtQ®•kåšw{ïöÞí;vìBôõôõôõˆåá zƒÞ Ùg²ÏdŸâfÕͪ›UB$“‚IA!úúëûëM<§âzqýe?ïî1õÍÛ{lâ׉®‰.p;ŠÅáÊpe¸ ÂVa«°ÿ‘ÿ‘ÿäææ >¨êP¢—è%:¤Ó‚iApV8+œ0óçŒ{ÆmÙcþ÷î±wN¥qJz´v­Ýö‹Ì”™DT‹P–~eS6eR!²äÇÕ¸•¢RTŠ%Ÿ£«Ã rÜcéc‘@8~o³t~ÊRÊR âX_É9BTu«15†¢VZ×¼â¨!5¤†€)&™®s•« ~VjE³\”‹DAÉ!+\ï¿Åþ+WìíbÅÞÇVæ ö_ bpo)w°«IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-7-red.png 644 233 144 3741 13755454063 15525 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü–IDATXíWmL”W¾ïÇ(VtVšfPfVñc?€Œ©+jºòá€fÁšŒ’Š¢1»MTÔ±i%Ñ[ÙHÚ,±4+g„¤t—dW¶,Õúcƒv±QK»2ÅDEf†‘aÞûÞgÌÜ÷c%›ÝóÎ=çžç¹ç<ï½@HÂ~BL&nœëŸëŸë¦’ észæôÌé)]'S™ÊtèYMV“Õ@"Ìš‰Ld"s0û¬™çóý¼¯oÆ7šùùÕ‘:R'úÌqÛÏå¹Gîñ= …ƒkÆdÆdÆ$þZy§òNå`Ûým÷·ÝÜîwîó8Ïçûy=^Ÿã½œmö³?ÃbX WóeÕfÕfÕÒÃíWÛ¯¶_e¯„ÆCã¡q$Hˆ"‚"‚"h~2Îóù~^×7ãeôr~ľ@GÅÑàßx‚+W ®(ëGâ#±‘F4–DzXzL9ªèëŠM±´LÉWò ~2Îóù~^××›ðí 4j‚Oð >BäF¹Qnì¼Á7¸š]Í®f¥L#ö.{Ÿ½Ò©œQÎ,ˆä˜áˆ!@Õ|ŠgAÜÂ-@éT.)—ö.«cuñdŽÇñ9ÎXîYîYîýæW<ÁÞ`o°7°'''˜HÖ Ñè!zº…Ôu¦¬SVˆ\\€©ùSó ²3²&¡pC¸Ðn€~@/ÑKz5ŽÇñ9Ÿ¼_Þ/ïlä35gjÎÔ°ß& DŸâS|ÀlÌ Ækÿðæo€Ô'õ‰Ï Èz²¤ ©æ7ÿ;XÖ¾¬@,ücøGý¼Š/ÞïÕÜ(Ç×:kâGØXFnFnF.šŸ–>-}ZjŸ8„°Ë ÅÄã‰Çp®ø\1|’öItätäÀ‡>|d<À;§ß9mœdƒì6»­ãq|·óãDÿPqªâTÅ)ýdt„ŽÐcÃ^fqÄ€~M¿6.8:Ë;—w@èÕЫÆ8û–}«××ð’øœç—$Š/ÝCî!÷–Hé&º‰n2šÆ´É¯A Ä]q—qùûñïÇì>Ù}Ò§^ê5¸aL` Çéqz\Or¯q¯q¯Ñîí/yG«×µ®k]׊»Ó´0-$%ß †=؃=Béß(à<Λa3Æå-[Àù†ó Sϳó€¯ð€X‚ †0„!€9™“9ÁxvÁ¢‚E‹p—ó#b™X&–Å󧮣®£®£Î 4šFÓ x1DõúÀHäö®Û»Œ¼¼4uò½†Ä¥¥V»híÒñZZZ´NþNp NÁL¤µÒZim}ÿÊKKKiv`{`{`»V ÄŠY1+66ˆ–Ð#‘}…û ൮׺ Òé7M`!ˆb“ÊQŽrýøÑäùsësësëUíl’M² é%é%é%„È—åËòeï¨vá»]n—[¿9UêQ=ˆÁl@¢«F˞ʞ€-+·¬4®«¹j.€nâ&€‰ÄÈÕ³êYõ¬>êÚëµ×k¯«Qà^i¯´÷VUŸǿznY[œ§Åü”oðóóÓ{©,ŠçÅót„ÂÃà­]oí€/–}±Ì(õ†zÃ0êZCkôQ___£\{B›Ä&±iºTX,,ÿ²=… ô/íIÝ)ìvnj¼‚Wðr­¨ûüýþ~?üšv¥¼TÚC€Ïñ9–x25¥³"V¤oÔ;êõŽ4Gš#MÙ¯uò„tB:áqiÔÊH)“í:×BRH åÄG|ÄGˆ4&Ic‡ÿ¢=­mö6{›b ¼ð<&í.` €>£Ï0VÎÊ Òðã3|°*VŪôã츶ãÚŽkôöEäˆñŸÌIDATHÇÍ–oH•gÆïcÇÌ“VB«pNYƒ%$F¹ O«ÀÆpÌ–Pa©«i± ýiÑ ús¶±°¨Ç:)Å s4&rXš6Ö(Z–Ù[†çýóüöáœ÷¼n~Ü—î/‡ë¾ïçº.Þ‡û>€ˆˆL‹ÿ $y“¼ISb8i›“Ÿ´zÒêyçcø¤ ®\ý¾¦Ÿz ãÇŒ­NÛu»ìy‡¬ž—iâ$RjSj]ùq|Ö/\¿pÒ[1üuRëRë^Pv¥ì @ð§àO| }·ûn å僃íºÝoŸ·ùÆòËÁÿè‹@rCrƒë/H™˜2Q|+}+³vÄþÈ‚×|¸ gBÏ•æ 4•hhØ18Ûõx¿}Þæ³ùm=[?æG`úòéËE pCá†Ôb:k jvÕl[O¯qˆ404C0KÌFA…U.p°]·ûíó6ŸÍoëÙú1?ÎUZ""ß¼é7üFÂP‹•®géY ~3}¦=^Pv‡•nM¶&ƒjSmª 'ÓCO)5×Xj,E7:õ™úL°Â1~ðwû»‘¸~â*{EDÞ=©RhnêïϹ?Ì›PoåX9Œ$$.s‰K`†Í°šh¢iŒ¡¼à…Õ TƒÀfJ)P«Ô*Fø2Ưžw·t·¤j©šæ&óÿb'oñ¼¢¬¢ Ô~+×&”*•¨È;‘¹‘¹Œ‹@y x¯ð^¡*…Pu¨Ì_c~„¯¦L)PµÐ¡ÿDç±…paÁùáóÃàÛçÛëÛ ÙÙÙŽà¹çfœ›¾>_Ÿ¯šššÇ»œ}9ûr6Tí«ÚWµÏÉgw,ø~Á÷ðÝǧ¶žÚ ÝÝ †é¹î¹®j2Ò3Ò­ƒPçcÀ²MË6-ÛÁú`}°~¼p¢n­ å䵯Zc혫,é*é*œc9ÇrŽAþŽåÅË‹aä }Hb†Ö ­¥M“ibu$‰iÕYu®IÒ õBÉ‘éñÙ=CŸªO‘›rSnʸÐéôG"® +è :ùm@ÐDÚsÛsÛsEGGGDж••Š„6„òBy"“î%g$gÈté½5zKÄõ\Ug]IâÖVj+ÛïÈh¸1Ü(âzOD„­qþhúƒôÎôN‘dw²;Ù=ÞXZkZkZ«ˆg¾g¾g¾È«Ð«Ð«ˆ———ÈUãªqÕQGÔuD$4/ôvèm‘Ù=™72oH´öóæÓͧÙ*ÞöÚ?1/i›µÍíwœ©Ô+öTìÙSi6›Í0üíðÏÃ?£¢7¢MѦñW9¼sxçðNÐýº_÷ƒjU­ªžžyzæé©©©„'O¶<Ù½{Í^õ÷gK–Âë?m½íÑíQ`£=•$öØ@ê€æ†î—Ý/º`]´.ŽÙc``ð?Be©¬_ügñ¯=&‚Šo^µnº 6‰ÞBŠÑkô3jFÇo~&âÆ ÔPC 0Ä3žz¦úU?PD5Õ(Uo˜†‰®~1=¦TMœÿˆÿ€ÿÄ|ŒÝüoîåûºxcßcoæ ö‡"!~{×{IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.0.png 644 233 144 2600 13755454066 14740 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü5IDATHÇÍ–mHTiÇÏÌä¨5ø2¸¡…mFaF‹K}éƒRR$½ ˆøB/ˆT,EŸ6°‰e+6 üdHE–™ ¾XV`ì¶Le6‰Îö¢5j/iÎÜ{Ÿß~˜¹soµ»Ÿ{¾\þç9çüÿ<ç9ç>""’•ø 8óœyÎŒ8vÖ[ö´uië¾<Ç-:8|ßýï ³9³ ûTö)ã¡…Í}Óß/bå·ó™vÉËz>õ¼£4AeQeQÚqüãuHoOo§AÃå†ËO_<Ín½5z àuéëR°°¹oú›ñf>{~9ô¿¤\M¹êAª;Õ- Ê”-ü&î0¸6•o*xæzæRNÐÇU Dˆ`®q6÷þf¼™ÏÌoò™üq=9%9%"°¥jKUzk<àaìÏÝŸkòÅÚ&šð€Ñ"z­^Ë ¨ëê:`asßô7ãÍ|f~“Ïäë‘k{t-ªÂ]áb±› ‡ôÃZ‰VBL{¢ÏÑç T‘Z¢–`­0aÂTeªD•€öDŸ­ÏF©oµûÚ}b Oê“À”™¿"µ"Õxt­­”""KN@úhúhdSÁHÐ*Í¥éÕz5S|O;í6!tÒ le+[möE,b0—¹ÌµÙ—QE°T?¢‰Ë6ð>ø.ø’ü = a-7`çÁ!~?ŒêMìiì©u¿Á@Ž­>¶úØj¾¾¾°xZ£Ö¨µðãÆÇá¤÷¤÷¤Bý¡»¡»V>5 ÄÉèIþ„ž„°?÷ÁÙ·gß‚q@Õ%"fú†ûô=€¬ãYÇ³Žƒ¯Ù×ìk†¼Á¼Á¼AìììµUôvøvø6/+^V¼ –û—û—û¡ § § ÆÊÇJÇJ“î3ê¢Éç7õ8E2~Ïøý«U"%kJÖˆÈ]Gk¢Ò©“»'÷OîÙÕµ«kW—H}]}]}ˆwØ;ì‰ E†"C’\w:îtÜq-v-v- ¬¬¬É,Ê,Ê,¹ä»Ts©&鞪~6ùü =³D\›\›(IHpˆ³MDD&$E½Qo$§L+ó—ùEV6®l\Ù(Rí«öUûD¢ÓÑéè´ˆ+ß•ïÊ‘í²]¶‹DçGçGç‹xÚIéHé×R×R "Æ㊣_DÛ¬m1*DD$G4g¶3[äÄ×'ŠO‹Tj•Z¥&r­ûZ÷µnòÉ'_¤÷\ï¹Þs"´ÓN»HîªÜU¹«DFöŽìÙ+2¾q|ãøF‘H,‹ÄD nôôZº%øüI=ß1Õøáùu¤s¤ŠË‹Ë‹ËÁÛâmñ¶@»Æ]ㆺº:(  ð<çyÎóhhjhjhO–'Ë“öØw`Ÿ­Kуz~ú÷;öiWš]â×Îkç­.Šþ== /Ã/Ã/Ã`ì1ö{@mSÛÔ6oooc‡±ÃØʯüÊ===`„§†­ËÓ†´!@ýoWÚæØ»àÛà[ÛûEŸ§ÏcJR}ªÏ6@ÝÊ­Ü ÆÔ˜³D 4€1aL6ÿ#ꊺÔë7ô¶9 N§ÿsŽÙ&?ii€–œüýz?p@¤?"¦ºTH…Pœá4§7¼â¨~Õ¯úQF~£›nP¨)5…â’‘mdýž~Г“?Î÷éäÿlÿ•Ÿíëâ³}}ž/ØPIÛ}™õoIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-180.png 644 233 144 2716 13755454065 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷܃IDATHÇÍ–ÝOTçÆ×€3ÃÄ 8•¦Æ*¤4SIMl£!%‚´!„ˆ^˜VÒV.*…+kR“†“¶L\Z{NĤ+R½QkÄrSÑøAM=Œ‰ã€0)vö×û;3{öôxþß›õñ>ϳ÷ZïÚ¯€ˆˆ¬H?rÖæ¬ÍÉOÙ9ï;þ¼ê¼êWO¦ì>\ ®†[û¡à›‚oß¾µî:¶·ó³÷‹8øÙ|¶_VˆãðþàýÁU™¶?‡æ7šßÈ{1eßß™? øàìgO žàc˜›˜¯œ¯Ƕãv¾½ßÆËÆ—Ïÿ‡_Ü?»v=¯Çëâ÷Šß+éH%Ü+µ;jæ>ÌU9`Æ?~U $H`¯ÇY¶OçÛûm<ßæ³ùSz + +D ¾¥¾ÅןÚp÷ßðéšOר|úà ¾ÀFÂH˜mfIP!À… ÛŽÛùö~ÏÆ·ùlþ”ù{m¿~Õäiò€~̈k¹Þ¡w «qµ¨Q¶dkÞš³æÀˆ#jzY½œù‚¨wÔµeüGÛ¢mAWŸÕFuæ…¯²Ôh6š¶À¯ßÍ*¥ˆHé _ÄI,ƒ©S+€ajÌ^¬³Ä aÂY„I•TIà 9èø¹Îu®ƒêPªx›·x++¾ÞüÒü’%JSø0õÚÔkÀ_¾?|$–ÙzÒÂúF ý³öÏ€ykƒ:¨wé]ŽŽãMÇëŽ×ÁÚµ7jž‰ØDl"‡:pèLnœÜ8¹Ñ‰‡ƒá`8G_8ºüèrxpçÁƒç‹«©_†?­'-ì÷N:vì̤ï6þ™|=ù:ÉÖñÖ_Zq >âñŽxá~ÕýªûUPÔ\Ô\Ô õ×ê¯Õ_ƒà¥à¥à% ŒF°ylóØæ1XZZ‚à¯Á Á «ÏÆIÚ|êÊɳ'ÏÚÂ~ï\&’%ÿÊ›e²nKÞ–¼t}ÅÕ¯þÅoü&R÷}]Y]™Èh×h×h—ˆšSsjNÄ2†Œ!‘äbr1¹(RéªtUºDß||óñM‘S}§úNõ‰¸×¹×¹×‰ÜZykå­•"›æ7Å7ÅE~j8×}®[¼{¤½¿½ßÕ¯¾/XþP$·"¥'G$wGîþ!{Öz֊ȉ»÷{¾ó|'Òr·e²eRdõÖÕ[WoѽºW÷Šè­z«Þ*¢åj¹Z®ÈÅÞ‹½{EdZ¦eZDkÓÚ´6ÿŒÆ?#™•:0P$y/I’Œ;.šç´ç´ˆ­'GÄ:gsÝÓ¨5jEÄ%""…²Ip5K³4KÄ[æ-ó–‰Ü.½]z»T¤¤¡¤¡¤AdxÕðªáU"4ÒH£H4 GÃ"s…s…s…"Ññèxt\$¡'´„&¼<<‘/t//‰dôdzŒ…àÇTÍyÁ6†í€ŠªŠªŠ*8ÿôüÓóOæÞV´­h[¢h õú@}žì{²ïÉ>Ø=´{h÷øwùwùwAwg÷‡Ý˜£æ¨ÓcèèqzìÙS©¥OIĸcÜqNåÂá…ž…Ðk‡µÃŽ0£Ü(7Ê!V+ˆ€¹×ÜkîuâÖ#ë‘õâ‘ø½ø=°)·r£À¬6«XšOµïoßÿÌ©,=¾Yßlb„Ͱ™Á­k§µ“%–øÛJPy*OåeùkTªµ]mWÛA•ªWÔ+YñcƘa‰÷3s¬xªÐ|Ó¾égæXÖä§ÉÛä¬ÌäŸ0'¯ù‘ù:}„9sˆ>Žq ÔeuY]ŽÐKoÖ 1ÅJ]77˜ÐùÉì4;³&¿ÙänrÿßÉÿÜþ+ŸÛÛÅs{{>o°ÿÇWÔJH¹IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.1.png 644 233 144 2762 13755454067 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܧIDATHÇÍ–LUçÇŸËOQi%YšâIÅÛl5[fJo°©V£’"iÄÚ†$ݬÉJ“Õ,N–@…¸JR²3M]9ÛèÔrn Í.M;¥\‰N(\B%®»?Îû~öÇåpH³?ö§ï?'ÏÏï÷ä9Ï÷¼""²~é)”›”›´6a'ýÚö¯zmÕk?ÿkÂn7ÁQî(ÿç`]Ûº6€ìO³?U#¶mÅ­ü•õ"vÿ•x–_Ö‹íHïJïr¸—ì¨|¾òùU9 û´2®d\YŒCí絟\>wù¿¾>€Ý?ºÁ¶­¸•oÕ[ýVö—†Ÿà‹@j_jŸã_ž–ž&ÎW¯æK$Œåþ=ûöL$O$ë$0ƒÀÖh7"„ufWØV|)ߪ·úYý-< ?ÁG`Ã+^ox3£3Q0r꟭Ö‹]id ÄCñ€YeVíÕ^8À¶­¸•oÕ[ý¬þž…Ÿàc2,"Ò²Þ¼õ=@l >ËåƒÎ¿‘ØS­¦ŸÖOCüvüVü(¿ò+?ö‰°À,UhP%ª„˜ÊŠ¿ô`¢?T¤V¤A ßåu‘ç>‚ŒPF(”¢U` 0ü €×AoÑ[3Å 3 Ëu¹.Np‚+ˆ4ÓL3è êà ]té5½¦øBÝQw/E_'ð¼`á'ˆ=÷‘ðPD¤ý+ÍÑGXÝÔ/¿û÷ð¾á}Ðú«Ö—Z_B¶Œ66Ûx#ƒ#ƒ#ƒpfÓ™Mg6›››×£zT‚®×õºÞöwÔv4t4 ¿Ûî/ôÚxú­Ú±Ú1k´í_‰ùˆˆÿ=èéî醡=cÏŒ=£«×7emÉÚBdÿï÷¿»ÿ]( ‚гµgkÏVØ\³¹fs ”úJ}¥>È=ž{<÷8ø}¾F›Htctct#:4thÈÖ€/ÎöõYzjsâü­ó·,bþ÷Dý"óQæ#Ý ž\Uýéýép¢ìƒŒ2ÀP†i˜Pê)õ”zàÔ½S÷N݃“ΓΓN›@áxáxá8œ->[|¶Øö‡‹ÃÅáb¸¸ýâö‹ÛÁùÀ9霄¾¿õ¾ßû¾gF'\.€µ_®ýRw dgeg©Û¬ Îç쵟ÿã£w½»Ëv—í.ƒ‚K— .A ˆ"0^8^8^®W‹«ÜÇÜÇÜÇ Ün ·Ú€ª[u«nÛ.9Rr¤ä\VÝ»Úxfhzdz,>I*':tÜ–ÿ¬ûp݇"¾öñÀDz¡2^ùCå"žëžëžë"«;Ww®îinnÙqpÇÁE*Œ £Â1v»Œ]")9)9)9"w]w]w]"ªI5©&Y>±±ØØ¹!ŸÈ'Ëî ²/‹—‰ˆ(CŽÛII ]]߉ôúz}"•7ªª¨™ûGðBð‚D³·fçeç‰EF‘!’:ÿtþi‘™k3×f®‰ô:z½‘<òÈC¤½§½§½G¤joÕÞª½"“jRM*›Xæ¹ÌöÌv‘Ô5É“Jt雫qìò¦yÓDDBîûÛ!±¶€¿×¥Ô¥Ø[m~ì~ì†é¯§=Ó´šRSj "7#7#7a¦c¦c¦&§&§&§`JM©)‹ý‹ý‹ý0wxîðÜa0ï›÷Íûö(ç;ß4߄ބ=aÇ×u;ëv®ØJŒŸèØ„ŽéÎe«ÖÕ„uš~J?z^Ïëù:&¼¬Jÿ×ÑNí\¡c|ßÿÒ1k#–òV$W$¿K(³6â³ñYÀ0•©ˆÑÂU®¢õý™þ ô öihCÚê8ÊQÐózVÏß/+ÿÛêmb¤™/›/YVþôŠt°ñ—âOì¿ò‰½]<±÷±'óû_‰ø¿1£ IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-19.0.png 644 233 144 3027 13755454066 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÌIDATHÇÍ–íO”WÆofF˜)ÈÆfc:2E°`+FK‰1†éâ-öIKlŠa$uÓl ]Ó‚úw·›@5¸!T«¡X Ä„FŒªXºën„n BATfxÙ„yyÎo?Ì<êã>ì÷ï÷3Qþ•£ôˆˆdÖƒí¾í¾ßBÇðËÃ/Cø&{iÓ2µLWþ«fÔ PC 5«„P@L2É«ò©¤’ üšRÔÛêmÙÅß<Ô=Ô `óÛü~ ÿŠè‰~±ÆÛÌUº+Ý ª´m:nSISyS9ªoO_A_Áw·ónçÝNhØÙ°³a'ŒöŒöŒöu­F«ÑV >1|bøœþÕiÓijlpä‹‘/Vº·©¹Cy‡òô£m¼-䈈ôTÁ¥7.½¡juð@÷û‡Þ?IJ>"·Â·Â·ÂððÔÃSOAJzJzJ:ì8³ãÌŽ3q8ãpÆa///3MÛ¦mÓ6ÈÞ’½%{ líÜÚ¶µ 6ÝØøáÆYž^ ©ƒpåø•ã ~Ñ#ü)qoâ^už´>i…@YdAëæ–ù–yp¼êØìØ w&îLÜ™€ ¥J/”B^W^W^—!`ûÒö¥íKP¤þHý#vþìüÙyÈ-Î-Î-6ò93ÙÙð·¬s¯Ÿ{ pw|.âóú¼>¯È>ë>ë>«È³šg5ÏjDŠŽ-:*2°k`×À.K¹¥ÜR.++ˆÄ‹Ø/Ú/Ú/ùÄ+‰}‰}"Kÿ\ÊZÊŸHlQl‘ˆ<5»Ì.^³HXk×ÚcÄÜÜ&¯ÊoDDd<l6‹XF,÷-÷EfçfçfçDÒÌiæ4³HáÍ›…7EzÓ{Ó{ÓEœ÷œ÷œ÷Dž€'àqZV§Ud¢e¢e¢EÄ;åôNŠøçOð'ˆlZÜÔ¼©YÖ‰mñÒâ%y TCÌ@ôò÷Tqõ›¯¿ùHŠÜ±è_ÎÏÈß¿®5]kºÖÚ¨6ª‚Ëír»Üà(v;ŠáXÕ±ªcU0µ~jýÔzÈÌÍÌÍÌÏuÏuÏup׺kݵ`_kµÇÂÑ?T%W%³õƒÐúJë+À'úÓ§2XùYågÀ#}*Ã7Â7`þ¯óß΋  TªŒ;²ü`ùÁò˜Ì™Ì™Ìꨣ´mDo§·ÓÛ Z™V¦•êTª|·|½¾^”6ÌfS‰¯²¼²"~Úx;*,³l“¶I¿†ž=]áßË’v^;oø/F|JíQ{ÔC¨r*§rT°Úh?¦’JÐ|ʪ¬*I%±¨ê¢øî¡±¡1›Ïæó[øùÿ|Lu^Ub.1ÎO\ÈòáÅð¢áüœ¤šjPWݪè§Ÿ~`š)¦@ ª~Õ<Žö¯%h Õ¿C ¡ ]wþK‰üÒùŸßÿÊçöuñܾǞÏìÿZCösA_3MIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-114.png 644 233 144 2455 13755454065 14754 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜâIDATHÇÍ–ëK”iÆïÑtšVˉV’–ÀúÐ4n´$EÉ0ta3„–$è„ÛÊ’v°v‘‚[H¶¸k–Ój )ÆHT"ëa…-‹B-mæ=ýöÃÌë;:ÿ€÷—á><×u½÷ó<÷<""’ýHÈLÈLXñJ­øòíË·ñ[į×À¶Ç¶çïaÕõUל·œ·ô!Ë7óf}ìz ?–ÏŒKšX{³½ÙæúgaöþìåŸGüŸ{ÀqÏqï£ ‡ï¾ÐÒØÒÈ÷0Ñ;Ñ ðÞûÞ –oæÍzs½‰‹/gñ‹@Ò䇶Q°'Û“EÀµÍµmÝÑHÁ¿ë`Wþ®|€ñÄñD#´ÿ€R /0à ¦MÆøf>Zo®7ñL|“ÏäèX“»&WvØ}Àq3²`¨ N¬=±ÖäSîç9O ¨3ê €vP;HŒ£6°|3oÖ›ëM<ßä3ù#zdáÞþò5FArA2 (ÐÆ´1ÐS”r¥Åxn̳,2=UOÕSÁxa<7ž/ÎbÇÕ>µEÏT’”¤ù0·OÙ§F”ßÚJ‘¬«¨Ž1ÇØÌ2¦Ó?;´Å¥¸˜ÅÏ(£1T­´Ò ZÖ£õtÐA¼m&‡0¾5*J}Te–|ù0òÀñÎñnf™©'*¬þ ”U–Uïô F•rR9i}qÃᆒ†è_ß¿¾}<CiCiC)ô{ú=ýžøü«öW­¯Z¡k_WyWyLÇ×FøøPv¬ì˜¹µõO¢Â^稯ØW<¯ã;µ&ä¹ ýUÔUÔemø£¹Gsæ,ššÂ+ߑӑӑ/,OÍSóTØúëÖk[¯Í‡CúÙ¾€/` {q\`e÷Ên£™º7Oß<µ€ÂîOÓŸ¦áî—w³îfëŒëŒë ´»ÛÝín«îNúô;éàr ¹†àAÓƒ¦MVþRÑ¥¢KE ·å¶Ü†½¿ïmÞÛs6óÌ–N¬žX ¦gª3U„Éד¯?#×ÞðéWô+1G¥dsÉæhñ·ø[üñÙTµ©jSttt@ 1Ðh„lw¶;Û °%cKÆ–Œ˜[1áãÚäéÉÓ`êIÑÛô6Û hj¾š/"6Y#_‰Sœ2oŠSq*Né–né–8 {ž°G$1˜L Š WWW‹Œ444‰øú|}¾>‘Þ·½o{ߊܪ¸™{3WÄ–á3~= =™×3ÆðMù¦€?¢{¾Zõ«~Bæ—ywzwzwBÛ©¶Sm§â;æÍôfz3ÁÎÎΊkÙZ¶– u+êVÔ­Ï?ž—ž—Ö#)ÊWï«ñÕ,8c‹ne8zKÆÔAuÐêøTíÔÅ©‹î w…»â…MÕNÕNÕB8„ñùPf(=”ÓßLš>„úeý2ѱ¤o˜ç_x+³®‚cÂ11³ F´moèÅz1³±VcLE å¨]àÀÇ@!UTÃúF}#³üdâS‚)€æwŒÇͱ˜ÉO½Àèü}Z`׎hGPh @ ~òcÇŽhà7â²ÕÚ¸6ŽÂgjP ša%€VXhvjÁä_²ÿ•Köu±dßcKóû?5Ál˜X´ IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-96.png 644 233 144 2511 13755454065 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜþIDATHÇÍ–[H”iÆÿ3£Í˜£kBÐÐAŠma+ R‚¦ì°[fJ¹2Q±ÖÅ"­AÑ&…ÐæÊfàmD²AQvÀnJ<‘mT˦SkC'°\WIW;|‡÷·3ß|ß.ë^ûÝ ÿÓó<¼ïŸg^Ɉÿ ¸î€;=»¿´ó¾5¾5Ù?Çâz\Å®âÈ·0¥nJÀÔÓSO›íت[ýÎyßÉgå%Cì„÷‚÷‚+Bini®oZ,þ®RSGu(¿R~àÒ™Kgø ú:û:†BC!°c«nõ[óž_þ‹_’›’›\OÁ;É;If®š¹jNE¬¡wlX·aÀKÏKr€ñàǯBÀ#X߀#¶êñ~kÞ³ð->‹?¦G syærØX¶±,å§ØÀ㨜Q9ÃâÓ#Áúˆ>`l1¶ðT»jÀ… ìØª[ýÖ¼…gá[|LüónÀ&ß& ´[hF‹Ñ`V™Uhæ_j†šÒõWú+P_¨RUš81ÔVaÐÓïêwÁ|¡RU* ÌÃæa4ÞÍF³ßâKð‹SÐÇ?@J_JßHô=0Àç`31¦Æ˜Å, Š½ìµ…°‡=ìTAÒH#ÍQÿžjª¹S qc¼³ðã| þ˜wLÞ× D¶Õo«OÓEæyæyÔù`<7žËuùÈ}Ö}VR\“å©<éíÖº5‘ºeuËê–‰Dµ¨ÕD\WÄy’û$÷I®HÍ©šS5§Dî÷Üvÿ™ˆü.Ò(‚é®s×Iм3^/äz‚/Á×Søë7pî͹7‰ Ùnh5Z ï­L÷½î{Ý÷`vùìòÙå°t×Ò]KwANNN?<¸ùàæƒ›J ¥†R¡Ð_è/ôí ·.Ü ]Ó»¦wM·Ò|¦ÒYøj»ÍÓ#ÞšÞª.@ߢ¾Eö Ò½º×Žkǵãä?̘ÿÐίìXÙ±²òóòóòó è zƒ^ØÙÙ}÷]ÜwçΜëØÅ1³Ùlv\y‚?¦Ç-âÙàÙ@ŽHòÕä«b}º3܋݋±¬oXß°¾AämõÛê·Õ"kÛÖ¶­my´úÑêG«E’ò’ò’òD’k“k“kE‚½ÁÞ`¯Èyó¼yÞ¹½½µñø„B m>›?¦Ç-b^3¯¹‰èEzQ¢1“£”Sn 5 5 5‰d÷g÷g÷‹•••ˆdÍ8šqT$'œÎ ‹ønønønˆTWW‹¤GÒ#鑨գºCØÊæ³ùãzÆÛ1Õ£ï×÷Û;6”5”5”eee˜˜˜•K*—T.±/$\® W²²2lîÙܳ¹†=Þaãæ\zƒÞð¿;&"Rß;ì–ð³Ö¬eŒi„úL­P+K\  T¨;ꎺ*SeªLG= ²T$|ó„y‚1Û'ÿÛÇÆw~âά­F+€YiV¢q„Ë\F©_T‡ênÓI§ãD¹Ä%P·T‹j~¤v˜»ÍÝhèF›ÑæÀßù'ìå„}]LØ÷ØÄ|Áþ ŠûÖ>_?»IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-58.png 644 233 144 2517 13755454065 14702 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mHTiÇÏŒÎê •Ú¹f¡¹+ɆAŸ ]’†Œ²¤5'Ù0¨m)ƒýPÑAÔ&„bkZXKAJY’a„knfа[ ºP©`:+Òj.1÷¹Ïo?Ìܹ³Ë¶ûÕûe8Ï9çÿûÏsÎ}DD$9ò+àLu¦:g…cç×özâºÄuK¯…ã ››_†¤ª¤*€”Ë)—Í^;¶òV}l¿ˆ­˳Ö%Yì…„Æ„FG~$>ÅË‹—'Î Çg;Á}Ë}ë½»nïº p³áf{`øñðc€ñüñ|°c+oÕ[ý–^¬¾ÿ_\w]w¯!á“„OD ­ ­`É7á‚ß–ÀÆÂ…CqCqÚ *Ì`†Î&˜Àz~‰­|¤Þê·ô,}‹gñÃ~ææÍÍ¢íEÛÝ—Â ½?ÂÁEY¼Ð-৘Ƅ1 v¨|Ý©;pà;¶òV½ÕoéYúÏâ‡ýÈßßí÷ka[â¶DÀuz¡^]f¦™IHU7Ô ´ú\e¨ P_©íj;PN9å ?Õ©:Œ>ã¥ñôgz‹Þ‚óŒy†ªê -ý/Ê—XCYçÁ=있‡>Õ§¬FÖƒYf–1Å`dóþ HøÀ>D_!ÚІ6€œà„½ÎU꨾dûÌ£æQ¦"½ë£¼(?ìǶ÷í ‘v^˜iˆdÆeÆérEU©*iq^r^·1bt]"ÍÍÍ÷šï‰ÔÔÔˆÔ¾®}]ûZd2g2g2G¤7¹7¹7Yä\å¹Ês•"}ƒ}£}£"Ò.çå¼×yŽ7Ÿ›ÏEüþ …ˆ/ä ùB"ÇÔ1uL‰4lmØÚ°UÄ3Ó3Ó3Sä~Ýýºûu"a¨ˆ´I›´Ùz’.kem /ÊûqŠ˜-f‹£GÄØdlŠΕ”A[gòÑä£ÉG"³}³}³}"%îw‰[$­4­4­TäIÇ“Ž'""-[.¶\q½r½r½é®ì®ì®´õØÃ:ÖÅð¢üˆŸž±ïŒ…ÆBûŒ ½z;ôV¬X9IýIýIýà_ì_ì_ #¹#¹#¹Pè)ôz ådÊÉ”“PTRTRTcÏÆž=‹9c}Æ!ãО1‘ ?Cù‘ò#ÑðEt0>æ o"Ãõ„zB=Ì f3Áô™>Ógb£Ø(†àœàœàPûÕ~µ?æ(ýÊ8ãè˜ÁáYü°ŸÏ±÷Ñ9VoÖ3¥»õ„žíÕùÖ‡@û´Oû@{´G{@¯Ò«ôª˜|–N×é ûqá0kÍZ¦lýŸcŸüD&³¡ª‡f…YAˆ³´ÒŠÖ?é6Ý\å Wbväj¨ÝÉWÓN;ÌæB¶ÞÿNþiû­œ¶·‹i{›ž7Ø¿«ÓÚph#ôIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-11-red.png 644 233 144 3716 13755454063 15602 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷܃IDATXíWlS×>ïÝç$@ºl‘¦%ÁAê2~ ¢ 4±!‘„`"C"UƒÒ’T ˆ4 5-ÚÚh )Q€¬P”µ¨%Êü‚Ò%*?Ö ‘DebhCR¤B±-ⵇ„Øà`çÝ÷¾ýáwßóótÚÎ?ÏçÜsÎ÷ùÜïÞg¥ì»ä0¹<[ÍV³Ué±ÈÍêÏêÏê_÷S…+\áÿ–ÓrZ¤–NRH!Eø€Ó7:E¾¨ýD'ž\îä“ί…Z¨Eö;×°XéWú•~ÿ¤´WÚ+íµˆäåOçOçOã|Í­š[5·€-ã[Æ·Œµµµ¶/ÖE¾¨ýD÷l>$¯vú/¾/Çä˜ -šß4¿i~ýÔè©ÑS£ÆÜèƒèƒè q<Â#<B!ÀòÍu‘/êE?Ñ߉÷âûÏæGîä°–á ¢AÅpÅpŰö³Àl`60‹L3JR£oå­¼à+ø ¾àÕ¼šW§ùæºÈõ¢Ÿèovà»_°¨I~É/ù‰”CÊ!åPÏ Qàéôtz:µj‹ØÆNc'¢Z6©MFˆ?æ$õb½¶éˆ!æ3iÖ›ùZOâ‹Ä€ñ†1h "*ÊžÀ|?rÝuÝuÝÝø‘ànw·»Û’àDðëà×xhö‰ò#© ü6¿ j|`|€t›À„ÃW¡—¿ûïùü›¿m¹ÑàDp"8‡_ð±ø)»•ÝÊîk‡ÄÂÉÆ“'fƒ¸æ×üšôsú9 ÑûüËç_€ö÷ÚßKçgä9 ïÑ÷¤ÇÏמ¯h?Ò~ÄŽjþä§ÉO-7.ð­É:ø‘É_–¿,:'×M®›\g÷ØÖèLöL6Œ4Œ4À·¾Þ"o‘ƒèEã"ÄcñØ3òŦóm|›'ðÁO=¼ùèæ£›Úߌ’Ç’ÇDDèBç…N uA¥?_*©ÿÁ.캰ë[äGô%ú€øe~ÙÆ|?ÙëÈ/6‰â\x4<¥@BNÈ ™ûS™J ´ƒvQ,ëDÖ‰tB¬„•a#6:ˆ~‰/‰ˆ²ÎdyF~Ò E·é6‘< È‘ EB‘?’«åj¹zö¾9âÎÓ-§[N·¤I ‡òBàE¼(ý0­ïYß寕¿–¾åºW÷€vC»‘7óµòWÊ_I;ýg“dÀÆ»Üu¹ër—õÜ%•IeRÙì}Yš&¤‰ß~dŽøWmmmúCu¡ºPÍeOØ7ìŠa­qÀ8@DÙbpì.»KDÄ®³ëŽ·Æ,ÍIÛ¤mމ޳q"šeWÙU"ÚdFë”w”w(9C3¡™Ím™j™j™2V™E¿—ïË÷åû§³(×›ëÍõ)W”+ʕްuá×zj=µ|Ÿ5'_ò³ägH¤îFñ ÊV¯vLÔ£{€/à ÒÂÑ ´<\=°zÐSwª!–›®7©Mªø¬™5³æ›u)N„œ6ÿ„«ÌUæ* }$ |­¾V_«QeÝßÃ[†·ˆ~>þù¸ãzâãŒq&]*ÃÞa/À/Ö\¬±·ú±Þ©Þ)ü\àÉr‡ÜñdT(J…?>•AýÍ:_ RƒÔ°¶[ê•z¥^¡ý—ê:¤Ùóäûø>{ÞHؤÒgeºUÆc‡=ßpo¸;Ü çÏ+ž§í¶&ÙÆÚX›ÏcQ«¦jªVÜ6×Jª¤J¥üä'?‹°‹¼> ¸»Ý‡Ý‡µ¼ààHpÄ4ª´f­ÙA0õ«)n¾RUŒa 0êøB¾Ðþ*[ÿºõÖÖ[|Ÿè¯Öwl•š)½L‚ß¡ç˜ `¦‰‚WMíþñiÚ]³iͦ5›líª«ÔUê*|’Z7¬ê¥z©~í¯0òT®Dÿ¥=O»å¬ƒu°ŽÐ A¸¾½¾½¾Ýø]i²4YšÔþamu„EXÄ7Ÿz¨‡zȼvX0/›þGËÔîA§¿æ+i»´]ÚÐzZOëõ%r‘\$I$ÑŸGŠãÅñâ8»Æ®±kҟ̺Œû¿YžõÉK^ò*7œËeC6d.I—¤Kÿ\ŠÿHÍØ™@Fßçnõ¿¡; ýV}FIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-130.png 644 233 144 2725 13755454065 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŠIDATHÇÍVíOSW~ÚÚÖ*‚š¿X˜,0t5qΗÄh¢ÁIJ "i4Ä _SC ù„œ1Nçk g@t‘3(scPc÷A‹3Ê[‚"¾€„vC{{ï=Ï>´§·Îýž/7¿·çyÎ9ùýî ˜û‚4»Ì.srÔ6o7üSó¦æ}q)j×k¤©ÈTô¤šL©I©!ÉY³õg†-ã2?±0ðù¤3a8ì¿Ú5åÄìƒdÉÂ’…S?‹Ú?uŽ+Ž+ÿ¨äŽÖ­$ÙÒÔÒÄ=äÈý‘û$9ž3žC¶ŒË|Y/ññqð?üi½n½nzNÚmv@¦¯K_—QMèÏ ò òIrØ2lf’$µ7$“˜$rH†¢\£ ¶ŒÇòe½Ä“ø’OòGõ€t®q®ÈBo¡×Ñ-xö Y9·r®ä‹\!y˜‡™Dª!5D’Úm äè$IM¤a˸̗õOâK>ÉÕƒïöøZŠb[±¤J’‘{¤6¤ ‘úôHy¤œáA¤’õ?õÇúcRTÕAR|.ÒEzü)VŠb'…ú—²ZY͈¨PóÔ¼ø†ïqr£¶Q“¯M¸JÈ>CÕ1ä M!ûföÍ$ù;IrƒÖI¤s’-ìeoaX„E˜ä!â!ÃÏp€§Åiqšä7tÓwkÇ´cœdvŸìËêË"ùÞ1àM‘zbÂê;É]v 9N’ú"ñCdd¿¡ãœ÷\ѹ"²+«+«+Ëà‘ö‰•'VžXIöÔ÷Ô÷Ôñ^w¯»×MÖή^;|þôùÄó ãÄE_”/ÎÓöpË›K›Kãéeêáá oöo¾½ù¶qá:u>"{zzÈžž²°´°´°”ÌØ±;c7é?å?å?E®¨]Q»¢–t‡Ýaw˜ÌlÏlËl#ß䌌1,ùÄK­—Z¥°‡ûÌ@òä;_/Ç—«}«}±û…©A\ä>€ÝóÇçñ®õ®õ®õшF 8-8-8 ð û†}Ã@Y°,Xæ]œwqÞE 9µ9µ9°–YˬeÀûû;²0eiÊRàjѵªkU°Çù.¬^5 H=fÀR`)àWØcsÙ\ÚcÖjÛyÛyÀûÌÛíí\©®TW*0Z7Z7Z,ó.ó.óUKª–T-jrkrkr¥B©P*­KëÒº€¤@R )€øJ¾œÜ’Ü„ûà 3îƒb»l» H=f@¿¦_3=…¦æ«ùL'–bf€ïÊß•¿+œÎgpA¿ _Ð’‰’‰’ àæÞ›{oî”f¥Yi^^^€ñàxp<¼ô¿ô¿ô¡HH )@æ½Ì¦Ì¦8¼ÓäWç¨s©Ç „rB9?0¥½£½À;à6Ór1[̆"+Sl)¶ðÞòÞòÞl:ºé覣À[ë[ë[+à¬tV:+´º´º´: édÓɦ“ÀüÂù…ó ¬¶¬¶¬6 w0·'·øö^^g^§Äç6óþ»‹ï.âz>êJ%Ö%CêSõ©Ñ•''ŽL!•j¥Z©6ºNñ(ÅC¾¶¼¶¼¶Z·Ö­uq}TÕGɱ¡±þ±~R-¬ÂJAjyZÉ71>±«zWõG]™}†tŒ8FBSÈ^­W‹ãn õR½”“ü›,qKÜ·HÑ(Ec‚?[d‹lRl[ÅVRdŠ4‘–?¢¾P_p’Ûãs,½/¤ât ~4Ç&?‹íÅv’z|ò´I»æÓ|Œ°žíl7æ¿g+HqCÜ7Hþ̳<›°ƒßØÏ~ ñH[¤-b„Wµ}Ú¾„ɯ[‹­ÿ;ù?Ùå'ûºødßcŸæ ö_ƒ”ˆ^’q]IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-139.png 644 233 144 2731 13755454065 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŽIDATHÇÍ–ÿOÔuÇ_wÈG"ç–_mÞí6fþÀ"–ƒ†Š‡YÈTÔU~[ר4ks çÄYi%mJ†6ý¡†&âçJLFþ€PÍ‹/Ρ†ƒ+ðî>ŸÏûÑwŸûœùøþåöúö|>?ï×^¯{ ˆˆÈ¼Ø¯€=ÛžmŸµí[,ÿì²ÙeÏŠÚGu°­¶­þ½ÒÒÒ›Ó›?,ÛŒ›ù‰õ"~"Ÿé—yb9œß9¿³Çì}P•_•?{~Ôþ¬\g\gþÕ`ë[hmimá=¸Ûu· àañÃb°l3næ›õ&^"¾ìû¿$·'·Ûþ§ÃéÜ×r_Ë«‰&ü™ååcIcIÊú}`sT1$ˆy$Øf<–oÖ›x&¾ÉgòGõ¸_u¿*¯¯}}­«)ZðÇ·ðAÖY&_ä p€Ì-¨ôj½š¨NÕ € X¶7óÍzÏÄ7ùLþ¨y¼·Ÿ—¢*•@ˆ\}Tã™HM¤†ˆúEM©)”)ÙøÍøÕø´amXåU‹Ô¢ø bÜWnåFi‡W„WQ[µ—µ—ã|™7õ7u@Åø­VŠˆx¿BsºFƒ³`pÞà<à<+ôÎHn$—iZ`À"T!R!`?ûÙoùa„PÕªZUßÐ@CB¼T?©Ÿdšg£ø0èô3®!×Pp–©'&ìè5ؾgûà!€ñ¼ª‹|ùÐÒq|íñÕÇWCߢ¾E} 7bÚ‡|‡|‡|ÐéôGâ9}9}9pä¥#G `¨gh|hܺqu#Êçé‰ ëÙEÍé§7ÆÓßÑ> ùB>BëYÿãú­†_»yíæµ›ÐßÔßÔß©þTªVí]µwÕ^ð”xJ<%p¶ël×Ù.ðöx{¼=Px»ðvámð"ÜÐë‡6¿Q™\™lÞÔc›ÿ©ý¯|j_Oí{ìé|Áþ½ Z¾ÿ IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-40.png 644 233 144 2425 13755454065 14667 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÊIDATHÇÍ–HÔwÇŸ¯wç)ØYpS"CÖ0ÖZ0vÑ ýaÆ2˜ae’…DXACrþe‘¬\0Á ’ºµ"£óG.(jÕöÇ0;ZÊ ¤ò´¼M¼î¾ŸÏkÜ}ïûuÛŸ~þ9žŸ÷ûÍó|Ÿç>""2?õ+±8cq†/igÔØþ¬õYë?ø)iŸ4ÁØllþ½rÛrÛœ]pV=´m+nå;ï‹ØøN>Ë/óÅvx»¼]FIÊn‚­+¶®Èz/iw ²CÙ¡¿°«gWÀåŽË|cwÆîL–L–€m[q+ߺoá9ñ¥é_ü"àé÷ô£àÍôfŠ@áºÂuKj“ —@yYyÀ3×3—Îó%CŽ.¢D±Î¸Ã¶â©|ë¾…gá[|R€lÚ¶i[ö÷É „ýû ,¾x8Âr MDÌj³šè[úض·ò­ûž…oñYüI=2»·-_@eVeVZÐ ˜·ÍÛÀ”Ú¢¶O´®×µºÔ|•«rÓC®WëÕø3ñ8ñô׺]·£AµªVâL›×ÌkN|‹Ïâ§ CöXöXÔ a3l¦y¾$¦¶ª­L§=« ]¥«t•-ˆB )òÉ'ßáÿ˜"Š€eTR  Žª£L3“ÂOóYüI=)a'=ö°ÐÔ'èÄëÄk»º]·é6›oäêÈÕ‘«0àp ¸l¸3ÜžrTtDÇuíhq’/ÍŸÔ“‘¬Ûª^‘âúâúTÅøTfŒ Æy#?È)9%†(q‹[Ò§&·&·&W¤yióÒæ¥"ñîxw¼[¤Ê_å¯ò‹´n?Ü~X¤t¼t¼t\d|Ãø†ñ "Æû†ÇðˆA¯ìò&Í7‹U¯€ï†ï†î‚±ÀXÀÑ‚ˆ¾¢¯€ù—5í©£¥¶¥¶¥Öþ2w{w{w{¡k{×ö®íh ´Zìü•+'VNÀé3§Ïœ>cûÍM‰¼Džƒ/ÍŸÔãq•»ÊY.âö –äˆþLWëjñ»þpM¹¦DúŸô?é"rîѹGç‰4¸Ü n‘pE¸"\!2¹wrïä^ß"ß"ß"»²¾K¾K¾K"±ÑØhlÔöKL ¤ mED<½ž^ñ‹¸–¹–±Ü-¢úTŸ1$’ؘØ(‰È}¹/~–“I¦3Ü8Ü8Ü(…CáHäzäzäºÈ„šPJ$3/3/3O$Œ£A‘çeÏËž—‰Ds¢9Ñ‘¢Á¢Á¢AÏx åbÚô§ø%­'Ù”õpþõùôÇ®wò›YgÖ³<3¥3¥3¥öôµu´u´u@qkqkq«Ý`g°3Ø óòçåÏˇ†ú†ú†zÞ>ÇÍ€°ðõN›?©çÝS9kjÐüLˆ[[[Sk§ÖN­µýꞺ§îAäiäiä)¨ê…záô2…7kêßžÊwﱄµgÔ>µišé£ô Ð@T1bÄ@¿Ò¯ô+PJ)¥ëá[}Hj8Æ1Õ¤š˜N­êÿÚcÿcóÇUPíÍÏ7ä …¯£"½ôÐúW}Wߺ FƒªSuÄ1Í›æM'þ;7ÿœý¯œ³¯‹9û››/Øž³ä&(êXªIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-35.4.png 644 233 144 3013 13755454067 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÀIDATHÇÍ–íOTgÆïa¬3ˆNÕ°5m3 õCƒ6¥h˺¥C B¦ˆ Ö´‰ ,š°Õµ[SÖõea’&®+1µQM;D¡lÚ¥ÝT6ëFšˆÔ8¡;Û¬õ¥ÃÛ0)aæœç·†ã!î?àóerÝ/×uçÜy®yDDdùü¯@Æ“Of8Ò8ã·fÜ^j/}:Æ~ ,[,[®„G?xô€®øP¿ab#oÔ/ì1ùêqY.fÀÖc뱸çqT?[ý¬ýiü׋ٟÙÿS êêú>êûˆßÁ¯î|0åžrƒ‰¼Qoô| ù¥é}xäÓG>µül‹m‹EÀåqyrv§ ÆrÀ[î-¸e½eU E€¥,Un F ãŒ/ÀF~¾Þè7ø ~CÏÐOÏ#ýRöK"PùZåk™é†]°ï‰}OzÉ~à=Þc)¤b©€öºö: PÕE,XÀÄFÞ¨7ú >ƒßÐ3ôÓ󘫜9¶ ¶†¶†@HSá¤+éõ›TUªŠ$S(í]ímímÐÖh¹Z.h;´Ú œÍlÆ<÷Òõ ¿©¿IR½£}¦}ú²4?lo“†¾±Êó""ϼ™±ÌXl‘ÒCÁPð°T¾Êg–Ï9Ïy Œ2ÊkhhüÿI ±RH!¨šOó1;ÝÌO¡s¡s`è§{æ}ᮈˆÿ’bgåÎJƒEÏ»ößo¼ßxáØØ±Ð±j¬dìå±—M¾Š¾Š¾ hñ¶x[¼pêÊ©+§®ÀÄÈÄÈĈY§ŸÖOë§Mþ{øZøêÕ_”}Qfê±vgÏÎà^zž ý–ˆÈ¯ÎZ¤üò7DþUñÝãß=nÉ/ê.+“¹`g°-Ø&–Òõ¥¥"WWW"{Õ^µW‰ VVV‹-AKÐ"230303 ÷•TRiâ:OÝSuO‰¥ÑÝmŠÊ\:jÉW|qüÅqKÏ“a©ËšÎš~¾@¤xIñ‘è'·'oOZ:ê‡Þúþ­ïÅVûïÚ;µwDVÉ*Y%"ÃÃÃ"Ñ@4 ˆè½z¯Þ+Rœ[œ[œ+’s(çPÎ!‘ÔÁÔÁÔA«Íj³ÚDš4h> ráoú.ô‰dg?öÂc/ˆm~°é+ŠEEä—ŽvGûó+–­X¦‹=2™4¯}ôÏÓõÓõP2\2\2 ëëëàûÃþ0ìiÜÓ¸§ºOvŸì> ®µ®µ®µh ´ZÍÕ t t tAž'Ï“çýCû‡öÁ¯W.*\dê©ÉÈHd8²¼uy«þ­hÙKF—Œª˜k˜k€ãçZ.·\†’?yÜ·)°®m]Ûº6¨òUùª|p´áhÃÑ3_  T‚ã¶ã¶ã63îË÷åûò!Ëžeϲƒ«ÒõŠëÓÖ;–u9»œ±H,Ú?³ŽdQ=¢l""ÃïÀÇ?Þ·ßoŠoR5ëJž»ûÜ]+«WV¬¬€íg·ŸÝ~FÛGÛGÛaƒwƒwƒ~‡ßá‡ÚDm¢6áìpv8ÖÔ¬©YS7gnÎÜœ1=á?Ñ|¢Š®oÜ·qŸqoU +»­ÝVà÷éyæ}̉¡]‹vÝÿ´zÞÜ_~vÿì†m÷â÷â(­SëÔ:Mä™ä™äˆØ#öˆTŽÊQ9 œÊ©œ0Þ;Þ;Þ ºCwè³/žŠOÄ'P3eS2% nåç»2ve†ë¿$|ò€]Hû˜ê¸ïcÛÔ6f•GmQ[@ÔõAPMªI5™‚jµZ­VNœ8ø×asTP}­¾¶é»õÝÌrcž¿1ôeèË>ö£ácƶ†ó¾j}Õ ü!íÌj05šNi?h?4æà>| Î«!5ôÓO?0Å$“ nªëê:0zßùëõz’4i—µËÀbÃùçõætþ‡÷¿ò¡}]<´ï±‡óû?¶äó©-ôaIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-62-red.png 644 233 144 4246 13755454064 15610 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü[IDATXí—mL”WÇÏó2Ž ÝA4:`)Vv…bDEZe°ƒZÑF’*X1B4¤›ø‚€ÖhBŒN0³Ê*I%+FCpE©šº¸²®Ö6PÛdMiµÊ€²eD`dG†y^þûaæ>ó²]Íf÷|νçžó{îýßs‘Ï¢)ÄøEz»Þ®·sÿôDk×:®uI¦(‹²({‚fÓlš ø¦U+‰$’È| ÔW­,ž­gùXþÐzü¢Pž`¾2*£2Þ:›"¶Š­b«í9·ÛÎm×@ 1Ã1Ã1ø’ÿ ÿAþ`Í“5OÖ<Vg¯Î^ðÙ<‹gëY>–ŸÕ{5ñ Cý¤Ïøü þEÏl¶CÓJ¦•L+‘+Žß:~ëø-5Ò5àp  @€#Á€ô Ð|ÿ<‹gëY>–?´^Òg¯æ#ã|ßÇ÷õü‰%Ⱦ™}3û¦´ ÛÛííö¢~SÓÔ45 ’\%WÉU€:ÁßÞÑÝÑ Úv«í”,;ñ‰ñ‰Ðkíµ`9WŒìÙÞXo,­á¯^¼rñJ¹œá(•?,ÿa9<°O™<ÀÍÀØï&l89'Ñ·£o¿ˆ_À¥ÿ@ÿ€!¾‚¯”cDDP3g’ÛåëÊ×)n °T(Jïúüvë™M;ªK×¥ëÒ{؂ʪŠ5kÔÅZÿ˜ø³ø³8-Ÿ–¸Ú—µ/Å¢XÀ{Á{Z"["xN}yêK8=éô$@.>yûämhyÐòî3/¬ÉÖd¬ÐžÐ\W0º„‹çâ¹øßîj÷k=·ž[ÿ~=×Ä5qML+Ê{»Ýd75&·\Ò¨ºEÝXˆ…ÁÒ€@]¬ÚT[@J}MÎóÎó@Âø¹3r¥­ÚNS*ÍZåQžh °šÈD&qÙÈF6"Á)ô ý—´§µÞXe¬’ Ž]޹޹ÁÚõº¼¾çñ".PÑ….n¹B®`—Ú¥v@-”’¥dxä X×¹6fmŒ\®½@#¢CtØ÷Çm‹Û·ˆ7ófÞÌõÓ3Ì þßBá‘ðHxÄ]NÞ‘¼#y‘®DW¢+±ï×´k2›Ì¦`í*•J%<°Ã;€A b0°ÑòLy¦<3°¿µókç×ÎWko¹AgÐúF}¾q|èIsWÃŽž¸0÷«Pß8Þ§]ÇÙ€v+«*«‚´k ’!¤_ƽŒ{Ìž5‡Pø‚KBÊĨ‘*D¢¯â„^/ƒBàb® $‚a¦Á djèúôÙ÷ݘ²*•õåÔîÞ{­ßYë¿÷^‡¤¥¥¥¥¥A…yÓÏ?è*®ŸëçúYeÚÕ´«iWÙâŒáŒáŒáu¾Ì‰91§¯ÿ›wå]y׀ݳ¥³¥³¥ì.â".’xÁ ^ºÐ….»±»Ù I´$ZMR¸çÜsîyÓE2A&ÈÄßòÓ¥/J_TÝž——G†xwÞw'ç9„ûV.] ABh!dÂý¹é¹é¹é·3Ê2Ê2Ê æ†æ†æ†ªýþFÿ€ÏÙŠlE6ÊÖ¬ XKR‚ÄAâ 1èèè ØÆ¶ÿmómëmþü[ãÙâÛxl|œ5ƒaLÉ”L)ì$ñ$žÄ»g‹ÜEî"÷»—¦¯O_Ÿ¾þ®óUoT½Qe9´¶km×Ú.j^Ѻ¢uE+‰’¤HR$)0âŽàä0Â#€ñ1>ð6ÞÆÛ0κͺͺ!ªµ¶µ¶µ–™ðúÁë/áÐØú±õcëcÏÈÝåîr÷P©%Þo‰_“Í´LË´ý; hIIIP‹ZÔº9p¥\)WZû÷9ÓœiÎôî&Õ«=Vó!1ûcöÇìç T•Ae€\àðLÍÔL ÝèF7{ØÃÀ¦0`–a@zHéQŒbœ^©Wê•è+:Wt®è¿³¯¦¯¦¯†ûÙNf'³“=ªà£ùh>ú½xïá½'“TÖ(k”5âÅâÅâÅ_Þ3V+Œïnòˆñˆñˆá£´qÚ8m÷³j±j±j1\,,,á}á}á}p ¥¤””d€ €Œ‘12 Õ¨„­ÂVa+8ËvËvËvÀqÄqÄq.6ÿx|àñe‹oã±ñ‘ŒÊŒÊŒÊsssÊIå¤r’y& & & ’FUª@U* ¤Çè1z °fô•!A²‘l€ù2_æ 6ÒFÚ„! a¯¦ »„]Â.€^§×éuôûõûõû!\P\P\P° ƒ£ÁÑàHtvAvAvA›‚(ób^ÌëØæps¸9ˆhŠhŠhÂZ+  ´‚JšCsh0zpôàèA éLÓ™¦3@ÏÓž§=O¡H(Š,Á,ˆŠ¨ˆ ---šü›ü›üGúGúGz€Ê¨ŒÊ!GÈr TSSƒ-¾ÇÆÇñž¼'ïù×§B§B§BœÐDh"4$`O/ÑKôÐûfo—¯]¾vù`×n×n×¥F©Q hê4uš: 6:6:6ø­ã·Žß:€)7Rn¤ö~ö~ö~ÀdÅdÅd’’’lÓlÓlÓ,$ÚN³T³T³”äݽ;zw'¦#¦#¦#þš€ä—É/“_ ' B B B™Í¦ùT>•O]³|.ŸËçË Í Í}5õï;Þwœ±Ïê?«ÿ¬ž±ÇñãÇ3vjäÔÈ©ÆJÖ—¬/Yÿ»ùa}a}aŒ9äü‘óŒ š̓föºMÛxl|Çqlj½EoÑ[ o&J(_iÊg³ÏfŸÍÀ˜Ã˜Ã˜ð0ûaöÃl !¿!¿!PÛ«íÕö€ò°ò°ò0`4 FàààðÊ#u¤Ž@’ >4|¯›„è.pˆ'r¹Š\Ù? Á†`C0Ñð;ùüNü‡¨_Ô/ê³.$Ö] S°)Ø üÔÿSÿOýÀðÕá«ÃWw©»Ô] (ÕJµR „Ô…Ô…Ôw6ÞÙxg#0<< è õ…úBÀ¬7ëÍz€Ýf·Ùí@[<ÑôÃé‡ÓÑK£hbÿà¤'¥'¥'ù¬ÞE½‹zqÿ×¼¼yyór’øMà7ßÀÄËx/ƒ¼äó’ÏK>Ö4­iZÓDFF†@C !ø2àË€/€Æ„Æ„Æ`C؆° a€ÂKá¥ðz\z\z\o…·Â[Œ2BKciì¨I§ÕiuZÈuÏtÏtÏpJÚ+í•öòY1ˆALúE.KãÒHJµºZ]­¶xè[ô-úÈ9gâL0ˆÛÄmâ6`²s²s²óUl›‰áF¸Àá°Ãa‡Ã@á’Â%…K€áæáæáfà“ºOê>©ß+¾W|PQàYâYâY‚YÈ ƒ òòÖòÖòV!„舎èK,ÄB,—ìHîòÜå¹Ëášášášk§÷Lï™Þ³ËMÝ¢nQ·X’vwíîÚÝ%ÊjËkËkËÃì­É[“·&!/|á ˜™™™àsÒç¤ÏI î^ܽ¸{@÷ƒîÝ€ËÍ—›/7d ÙB¶,‹e±,` ¿…߃…f…f…fµµµ Æ_Fýe”ÊåSò)ùÔo;Ìeæ2sÙÊ’:˜:˜:  høËYñ°xX<|_6U>U>Uþ®6ò‹È/"¿`‘›ü7ùoò'?Ž[Æ-ã°Ç²Ç²Ç2û!û!û!À½Â½Â½ ª¡~ðƒ0î3î3î<Úühó£Í€ë ×®/×+®W\¯ÀØâÐâÐâ€í××׸#{.{.{>³ž‰˜ˆ‰¶ÃÞðîØÃÑ‹ô"½(jDªPõ4HX)¬VÆŸ—×Èkä5wq¿à~Áý¶ÜÍäfr3‘›šPM¨&ÑN§œN9‚œ8gâ   e(Àƒà â àüówÎßÎIÎIÎIêQz ¿~5ü eySySyï!V‰Ub‡ùö切(D!ªcÏ|87k›g šï¹cä,9KÎþ¸®¦«éêC¥H@hÎoï|{ç[~¯~~~ä$‘$’D¬W+ð)>ŧ¿ëšîáî €@"ÌZ¥­¬È­È­Èµ$MäMäMäqg%n7‰ÛÍÌe'—\vòÌ]¤#éäïèAzø5¶~T `€oG"‘HJ}oûÞö½µMª•j¥Ú›™ÞÞÞœ¾(¦(¦(Æ’d H|‰/ñÅ,à&˜`ú݉8Ç3ZGëh$õºz]½ŽE6´6´6´Š²N '…Ó“™¹s7æn$ÕžÞžÞž0Ó1­^®Ø@Öç-Á^°ìáØü¬ùYó3`.q.q.1ù«y‡ý·ºÊºÊºÊDY•V~Xù!‹$ûÈ>²ášpM¸fݽ`/ÙKö <á ÓˆnD7¢ÃÍ*¿*¿*?8*†CŠ!@‚…àä¯èizšž~2c•âY뱺ÑvÛ‹[?I$Ö¡µD¢¬yíZ’H !!‘Ûæ?9îÞ6ï5ï5ïÄ ±B¬@W­8½âôŠÓˆ:…N¡rêM½©7fù>…Oä¼ú¼ú¼Ú²lhåÐÊ¡•¢n©ŸÔOê—:¿iý,ä yBwÖZÙƒ¶ŠefffffÂ`Ë(¬?,hȪÝ$«vÏ’l’M²üA#hÄ¡Rh¡…–æ”™ËÌef~¯>_Ÿ¯Ï‡œRJ)ÅK[&ªMÕ¦j“`|’÷$ïIž¨[zTzTz´½|öéìÓÙ§GÏtoèÞн°zX×Ém€6¾Ð×€mäVuVíÞö-ñ-ñ-ÉÚ&M&HnfN¸N¸N¸rú´´Â4K’µ‘vlununuÆåÚÆÚÆÚF²SÞ)ï”w‚‡à!x¸Ï}Ä}Ä}dúOÏ Ï Ï :n·ÙvC½Î%ÂXxxxxx8xë°•Ù1;fGþgÈgÈgÈßY–Z–Z–>à%žO‰çå¼XóbÍ‹5Î%ú}‡¾ƒ}Ó|¥ùJóKØ”yÊìÃ>®‰Ä‘8wOÍ*Y%«üÛDzwdïÈÞ¡¢Ñ€hàé;Â×Â×Â×{ŸuîèÜѹ˜„§ÕŸ­±4ýÇ¿Wû%뺭VëIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-64-red.png 644 233 144 4234 13755454064 15607 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜQIDATXí—{LÔWÇÏï1<„..vtP ¾%_»¤ †#‰´E¡‹í«év} €’ØRƒDB«[m(bˆnB(Î`L¨%QYf7*±Øjën‚ÔêÌðØA‘—ƒ3ó{|÷æþæÑ]Íf÷ü3œ{î9çó»÷{ï DÓ6“Œßj µ„Z¸gÞÈ–––Ì_‹²(‹òs´’VÒJ`:¬V“H"‰Ì}µšÍgù¬«ØßÈãÏWDETÄ›ã1KıEl1p¸Ü $*z,z,z WrîçÜϹlëßÖ¿­ÈMÍMÍMõù,Îæ³|VÕgý^ÌCüú@A ?ÁOðŽ•l…æÎ-œ[(×wÔwÔw¨3ÆŸŒ?@€NLb“pÀh¾7Îæ³|VÕì· æÅ|¤…àøÇUV õFêÔÒol›Çæ ^S“Ô$5 ’\.—Ë值J^%¯d£l”~¾7Îæ³|VÕ×€úë_ÑÐ83gæÌDâqñ¸x¼ñ[–`¨6Tª%£vH­Së0.5zÎyΪCŠ“â¸å£òQ@>ò(,.¸¸1…)@u¨PH®jW5 R•pŒ³É†jÃÃÉÈú3ÆGº>]Ÿ®/k › ¯ÔWê+ÕDûc»Ínè·Î¸ü‰"…€úH}øZhŸÒ«ö²‘ŸÛ¸ú†úàîò'Š ¾¨ý±ý±ý1FYÆ£ñ‰ûÄ}â¾Îã,Pkª}§öõ=o§dö<÷<÷kè=4z.d]È€/g9\×]×Ð.ã2(W”+þùÖï­ß@OOO ™rœµ¦ZS­I}O[Ù>R‡£WD¯ˆ^ê‘ÌÈAK”Ͼ¹ÿ›þo`Þžy{@,Ë€é{6ÍØ4ÔEê"Pf+³ý¬w¬wüæ×ŒÖŒZ}¨cꤑ̑̑L€ñ0>úñÖ[Ol=áû2Ùæžïž`˜ ½{øÝðIJÄâлºw5ÌÚ⼑7z†¼K\ýÇ¢óíçÛý$æîrwÀ¼®y]\¥C¥Cþ[;úõè×b 1ÀT@ܸ;øZâk`´m$J ˆ_¿/žM:›äë÷—“íÏÚŸi/àï¸d.™Kö ‘°VX+¬=RÅNYüüøYñ³äöí?8pú].éožzó¬Þ¾z;•…:S:Süµw>ä||öi¼ÿÑû@á–Â-œâ]ñ.€-)í)íp5ëj\N(‘J$°âȲËN(Ú Ä1BÌÙQŠÌˆÌˆÌ ¯‹×ÅëMÚ…Ÿ›žž-d8Jɽ¬{YpÁòêä«“œ Œýš¬&+¸ïºïâç6>Ù7Ù`tz¾r¶fOÍßçþmǵ×§¸[Ø-ìþGÞ´ÎN=³¹Ÿë’uɺdÇy–PR^¼­x›š®ÝW¿üQüQ„ 4È 2€qëë#ä2é;é;.¹]n9DdÓŘ‹1ÐÛÓÛç…‰KŸ]ú [´'´Š¯â«žgrq\·¬>P¸­¯ÜnǦ:®‰k⚘V”½«%Í’v19åƒÊre¹—KÝ«î¬ÇziL?¥jººKÝå[ߦº: >,>">BÚ§­d…P!T”44#É(ê}¬i”Fib™ÉLf"aX†Š¿ÒžÖ:}¹¾\в—Ùר׸k×ãôLk¹ ~€NŒb€õ¨Ô<µQm„ @9ÊßvåOäOȵhR´‹v˱Øý±ûc÷ñÞÀ¸‹^:ÃŒðþæ …‡ÂC®5±4±4±”HW¨+ÔZŽiÚM3¤Òüµ«”(%pÁ ,žâ)žúZ^,/–ûÖ÷ôºÓëN¯SÓY=]”.J5ð|ÚׇQ€qmA[O\{3ÐׇMk×~ѧݒò’r?íFIQR”HT•AßµÓnt–ðîðîðn5GÓd$ÉG¾u4HŠŸñ…Ò‹„ÓAÚÍù7ÚµZ¬>íJVÉ*Y}úœŠŠŠ–-[>&/Ò´Ø,4 ͧR˜Ô¼Ò ü½Ä|XŸv‡…a?ížÔŸÔŸ”¢ìMö&{“÷è¸0ÆHKZKZKZ}׎X'Ö‰uÝÞIÂÿÔ×;N3^l,á-¯v/ÿ'ínÌÞ˜½ÑïÞµ¤XR,)h˜Ž«ÚNp\W°éH`þiP_ŽþK{™v7UB•PåXÅ€ * * *Õ?$¹“ÜInéïÚV ÃÂpÉ\j¤Fj$ïµ#؃ú…ÒÿhÁÚ=èo|Àíävr;ÚL›i³²”ŸÃÏáçqÄÑŸoÆ;ãñN"¡Sè:¹?yó‚vîÿfQÚ_”Aâ·á2¯ò*¯\ׯµýsÞôøBKÐÎØ‚ê¾t«ÿ¼“@pšÊ IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-39.6.png 644 233 144 3131 13755454070 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ÿOTWÆßG†¡ƒ‚Â/•/ ›,S v»k¢)”–J‹-°¡?ì€"Øn kËbcJR»Û•Í®F¤46¤ëÆHth dÕ.Ùh™¬–àÀ*HÊ÷"“EfîùìÃuHÿÏ/7Ïyß÷yžäÞûœ# ""QkOc¼1Þ¸)ˆ‡BûáÙáÙ?ùkŸ€ámÃÛý'`óÙÍg¢¿ˆþB»Âz]ï_?/â_¯§ïK”„6Ì­æVCæþŠR‹RÃcƒø·Àâ´8ÿç‡Ã_þ àjËÕÞ…ï]ß»~Èü!BX¯ëýú¼Î·ž_>ú‘¾llߨnxæ0s˜$¾™øfÒ¯ƒ ÷“ÀžkÏÛ0¶A 0X±ªLÀ‹}Í®Ãz}­_Ÿ×ùt~]O×úˆy=æu8P| Ør!8pï/ð~ÜûqºÞªø˜±‚ßë÷J¥ø@ÝR·0`€Öëz¿>¯óéüºž®ôz•K""§³ `¨`´ÿ¬vù¿[MZMeó¿ê•Õ5§J›Ñ&´ ðÏùgý³ ©Cê¡5ÅcO‘R‡ýuþ:Vý½«Ñ«Ñ y‚üPð°à!àÕõõWùwÛŸÁâµx½&¥ u uõä€Ú®¶³ÄwL0ªT•ªR ™fš×É"‹, šh¢×í[°`5ªÆÕ8€*Q%,ñÇ5þŸ®é­éãú&EDÎßVT¨8 ³i?ë{t×~× Û’’Qƒ«ƒËƒË!½Þ„Þ„Þ8“~&ýL: www‡êZµV­U‡ðƒwT>¨„ÓŸŸn:Ý„úw¥{À=Ò#¢âŠw€Ñ  Üé>__ùú ü+÷þó÷ŸWeQ¿‹|!ò|ûOîÿ`ÿ¼'yOòhsµ¹Ú\`ë¶uÛºa·g·g·’&M> cÇÆŽ šiii…4[š-ÍöOìÚ?„ŸïXÙ±‚¯÷³G•*U´M¶M‚¶#èÇh8üÜÂs /ïy#â‘Ç×&æ'æ Ž~óÞè{£b.¿Yþmù·"q-q-q-"±±±"ñ7âoÄßqÛÜ6·M$¢!¢!¢AÄitFyº:r;r;rE†#‡#‡#EâÌqQqQ"Ù…9µ9µbŽÿmôµèk† "¯X_±ŠÚ#¿Œüòå]FcoXBX/Šey×ò.‘·Œ¯ù^óÉ\Mz£Æ!rîWçç"s)s)s)"vÝc÷ˆ,]\º¸tQ$§:§:§Zd c c CÄä09Lޱ@~ ?/n7„DR<)ƒ)ƒ"—µËI—“D\M®€+ s"Q£Q£"j£H/µØ÷ŠÛ0 Ë›?Ýü©ÈŸn6v5vIL‘¿ÈSä¹^q½âz…ˆ¡ÇÐcèi/i/i/I­O­O­ÉëÉëÉëÙ:¿u~ë¼Hbcbcb£ˆ¿Ì_æ/±z­^«WÄÚií´vŠT5W5W5‹lêßäÜä©©•é”Nb5·æ6 ˆ2ëߨ•ô+é0Q³œµœ¥Ê~ñÖK“/MâÛr}‹s‹öì?Ø#ûFöìƒlW¶+ÛÛò¶åm˃ºãuÇëŽÃtÌtÌt ØöÚöÚöÂøÉñ“ã'ÁÑähr4AÄJÄBÄür ¿&¿ßãÿ¨2hµ´Z@] úY˱ó·ùæˆéˆ)ô—¬üþIæ“L˜6O-O-£gggCµoÑ·è[„©S;§v§8Å)ÐFµQmf[f[f[@»£ÝÑ¤.©K0[;[5[… |²’±’±î¯<’t$IÜó·…k?ʱÎ`®¨ Os¬D•°¤v«,•*L…©0Põª^Õ‡ŒªD•¨rÊ)_—c%S šW™” @¥©4–TðTÉQO†îݰ<¶<öšø‡žczòûôä-ÜP¸øM0™Õßü þà³Àx`<”üÔs‚ þ©ºTÐG}À ÓLƒº§úT0¹ÖS3kfVÕmÿ¢hÔ“¿ÐTh‚þÓCü™=+ŸÙÛÅ3{{6o°ÿ`2·¿bçDIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-29.3.png 644 233 144 3062 13755454067 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜçIDATHÇÍ–ýOTWÇÏð&#ÚØ‰Jl7Ðå­¥`CÜMF E±É8d6ÅÆ—iaÓÍ& m2n²Ö¦`Å,´RìjLÌö‡Évh6¬vµµñ…M%Ë„™¡—.•NNîÌ=Ÿýaæö²ý ¼¿Üû}^¾ß'÷œç9G€Bˆ‚Ô[@Ú¦´MiyIœvH·gïÊÞõìß’x †&CÓø!¿?¿`íùµçÕ€Ž5¿¿2_¥žfB7¬r­rv¤ð»ÐRÙR™½>‰O^£Ûè~‡ÃŸþ àÓ Ÿ^àwðÓÍŸn<ÚñhèXókñZ¾Æ·’_¼û }! óóÌÏ ÿ…UY«²„€â—‹_~æ­dÀÝgÀòŠå€éôét™‰K®Ü,°€ö̬Àš?¯åk|¿¦§é'ë°nûºíB€õUë«ÆsÉ„ÀEpltlÔô7pœãäB|!¾hM´y]^À€t¬ùµx-_ãÓø5=M?Y¾”…âýz°ÍÚfAnPnÄýÊSÊS Ž(“Ê$JªR©Îªa5 ñ‡ñH<ò<$¡?óÌ0ó3’ê÷JT‰¢Äï)O+Oƒ|6ɶˆ-ÌiúÚR~!„ÏýŒ Æ…… ù0x#xh`ÈYC”/¸ÊUP#jD.\¸VRO=õ@>ùäëf¹(å"ðgŽs@n—Û‰ò¿=¥—Òg"YOê |#/Ù vƒF§¾ðÝFŸÏçƒÓù½ô‚¼Óp§áNƒ.8¶lÿØ~è«ê«ê«‚ÉÑÉÑÉQݯ^S¯©×tìòNy§àÔoN•Ÿ*Gà ºž¼f϶gkK;ðPk„b´†>úÆ/‡Þ ½'lŠšLÄÌ0ÛÍv( ”J0h´Ú¡¢«¢«¢ êÊëÊëÊ¡´£´£´î•Ý+»W¦4rpäàÈA(è-è-è…¦þ¦î¦nØä7½cz‡ØÎ>jÔ.€;ê;YHü;çtÎié‚h,ƒ!£§ÈSŽßwÖvÖêæsŽ9*wVî¬Ü {Û÷¶ïm×ýÕKÕKÕKÐçìsö9uûpópóp38­N«Ó žÇžEÏ"<ï®rT9À[?a™°Ì}9÷%¨Wr¹NéÄ××U¿ìмyMoûïZ'& bºbºbv›w›w›Áçñy|¨ Ôj°çÈž#{Ž@ÖÖ¬­Y[a°{°{°{Å[#×È50tþèüQhlhlhl€ç~[ZRZãSAKР<>ùø$¨ãy?äý úÓäßãmñ6ƒßГٓÙ#Äxw°?Ø/Ö½øÏêê!ZJ[JZJ„ð,y–@×K®—@^Lí1N&»Þ|ûÍ·a)žì’·CWBW ”ÚÚŒ ý*´9´b±ŽX(CÊ2÷ƒ÷ƒ÷ƒÀ NpÔ)uJ‚™®™®™..é’.PÊ”2¥ ¡°?ìG&&—?Xþ@ïJo¿Q¼¢+“úm®¤æÌ’4IÑŸ-ëYÏz²Q6®ØKŲXm´¥f`Ò~IËaçåi!*3’ür>80Îç2¸úsL;ޯ瘭ÓÖ òbr2Ë%r¹ ?‰ÏÅçP8Ë#HÎò!‚¼.¿–_^¼xxÒ/ÇäXêôÉŸß&¾E‘žøñµÉߜޜÄ~9ùŸÜ³ò‰½]<±÷±'óû?iQ"h ÈËIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-89-red.png 644 233 144 4236 13755454064 15620 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜSIDATXí—{LTWÇçÞ;QÜQÌ” ÕÊŠcVÁDy8V¤«Mu©`”j0Øt}a#5­TdÕU|´–â š†ø¨ËН֍Y«nJ‚Ly$|²è<î½ßýcæÜ¹3Éj6»¿†ß9¿Ççžó=ç"Ÿ¡ æF‡ÑÁþå«þ­ú·êÓ%Y’%ùîQšA3hà›VËH"‰$îÁ¾ZÆãy>¯Çë÷æóèù6ÐÚ Øƒç#c¥z©^ª·?cÙF¶Q1E D D àÂ’‡K.y,ëZÖµ¬ Xš¼4yirÀçó<žçóz¼>ï÷zæû1 á…ðÂ9ƒ¯Pt^t^tž¼¹úzõõêëêÈÁ§ƒOŸ!BÄ0†0„!N8á4ß?Ïãy>¯Çë÷‹©x=™G ÝB·Ðí¼È $_M¾š|Õ›Ôîi÷´{п©ñj¼¯\,ËÅ€Á¤b 6ƒÍ`ÓΘ‘òé= ¢ßó¡Œ7ˆˆZL-&"¢¯³¾Î""ªºWuˆ(јh$"Šž=…ˆ¨wwïn"¢©O¦>!YNXNèÜͧ›O‘~ŒÈh¨3Ôê´#ÏïW57±<±<±m¯Ø+öŠ8-×ËõP±†o½]±+ú•KˆHˆC¾!lßÚ¾Õ/ÊÖ¢­A+½¨zQ5ÄgÄgpùÇïV]¨º¨ ¾ɳ“Ç&M‹6ÎGB¦)dzzýeÇ7;|ì°N#†o ߀1Æ<àÚY¼³XÔ•Þ•®:úÁÑôó{oï½ iMiM¼Û“¶'€!Ö ȧŽ'O ô»¼ÿRË¥í,` ,%xzIœ%Îgm+å×e’ùcóÇrLǟל×ׇšy*ò¬ [¦ÿö{‡îÒƒž]xv!,Ÿ»|.¬ìYÙ£W_…­Â`ÑÈØ‘±Ð9¦s \ÃP ”`ú¶iÕÓªí#ÅH1òË~ ·…ÛÂmDÒéŠt¥¶[»ð—¦®M]+oâõ•ÂÓËN/ƒ Ñ"Z ³C,ðÝ÷Þ}O¿’篟¿®?ål› ßç+_ÈÏÍ»³²ie“2¬æ‹ùbþ?³}~?õÜ¢+ †C‚óO(,ÞüÙæÏÔ4íþÛVÔVøfÚ7Ó þðÝ߀÷C“8©ãuµ^m½ ÇÆÈ«îÜ-¬ïÉ''žœˆEÚZ*” ¥¯ÒÙx6žŸV(þC;_+X.Ë_Åj™ƒ9¸V”Oö|{>šv7)qJœHý^ýŽtªZ¢–*Q ¨ij‘ZRwm·¥ÛXF˜ï›ï{ÿ¢­äçâvq{¡UCˤLÊ”ÌÖJ¡és²“ìDbŸøX|¼ù¬ö´V™ Ì^SÇÖvW»K¯]íi=ˆƒ:íûÊå f{~ôü-3çvNeN¥¼I{Û‡¤~©ß±+j}Ôú¨õD‚U° VvÊO·ŠcŽòÿf‹mb›ØÆÎMÞ2yËä-D†ß<"x§YCÈÖ q¯ûæ>ívœ h·°¸°X§]“×ä5€”ÇÊcåq@‹ÍhF3àkkkV—hš Â…ðå;B¤XÂg¤×ˆå:í®`+æ/aµ¬–Õêµëht4´ëmô6zÊ}õ2êe777 ¿£i±N¬ëÎáRóK/ðwô ðíö‰}:íî7ï7ï÷š:j;j;j¸à‚ œ´ð\á¹ÂskGª’ª¤ªfÿ¿$a7CúúÇiä›C',÷k÷ÌÒnjVjVjV@»Ž9Ž9Ž98á›Wµ`¹,—åÎßÜFxÒ—ÑioÒî<±T,K39pnInIn‰ú·xw¼;Þí} muŸØ'öFS ÕP ù¯±#¤Ÿ‘þG Õî®`?õ[ÍV³ÕePe(&„ #FŒþ~Í2l¶ ‰·Ä[â-vÉŸ˜²sÿ73iÙÈF6éçàé­«UP` ¬5ôLôOq„ìL{HÝ7nõ¿Qû+ü¤­„BIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-0.5.png 644 233 144 2573 13755454065 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü0IDATHÇÍ–oH•WÇ^5¯!jf»ÂŠ@WiKìUVbxáVËJYé²+†‘n1‹EÁ„Y¹2Æ¢„œIÃ7‹Ôl,Yu!3“®÷¦¥Õýó<ÏùìŽϽ·ÉÞwÞ\~¿ó;ßÏ÷<Ïs~÷ˆˆHjèWÀ²Ä²Ä’Œ-_DòÖkAÖÏÁø¢1;bv |)çRÎ,¸²àŠñ8›óf}ôz‘ˆ~4ÏÌKªD Í Í1y¡øì^¹{¥uQ0þ¾[[^k°¿u+À­¦[M| &LåMåA$6çÍzs½©­/'þÃø;ñwbF!a^Â<Xš¿4?óP°`$œ§àiìÓXe}H"Iå3Ì`wTl·êÍõ¦ž©oòL~Ð@úÆô"°½x{qâÁ‚#‹,6yà§HmF›ÐKõR| :U'1Ä@$6çÍzs½©gê›<“ô#ï¾Ûú-P”P”Á]ºA×uT¾vC»A@ûGŸ¯ÏG©*uPdî¸O] «×êµ gë»ô](ýs§¿“=UO o¸ïNvb¬ßõ*ED>þ''fâð½zÆò‰~F?ÃllbS”rÈV°‚Qùa†^ñŠWhhÑÎ2£Œ7a}†ô!ÂüŸ±‹]pàøãáÅkÔ/kka55\7\3\ i i i0:8:8:8÷z=hijiji‚óÎóÎóN¸ôðR×¥.ð x¦=Ó(`”Q`~áý„Œ=ª†ë/¯¿õ;€*q|îïܵîZÈÍÉÍÉÍUí«ÚWµÃ²ŽeË:ÀewÙ]öˆ±¥/J_”¢±Ec‹ÆÀYî,w–CYOYOY<©ròÉÉp¹O•š¼ ßô#|/ùžj†‰Ü‰\Ð?{÷ 4>ko{¾=ßžɯ÷­÷­÷Á…þ ýú#ù®‘®‘®ˆsÄ9âà8ä8ä8W]W]W]QÂk ¯áþ0A¾éÇ"ëŒu’-;þ¶ˆÌˆˆˆ'ô Šÿ/¯¿W$©5©5©UÂ#¹)¹)¹IÄ—íËöeGò"û*÷Uî«)[]¶ºlµHÝæºÍu›EnV߬¾Y-"½«Å*bL^ˆòc1ÚŒ¶˜Am›¶M$fDDDÒMPÖ×Y5Y5"ã%ã%ã%"î"w‘»HdÖ5ëšu‰dÚ2m™6¥¿Ò_)2??/²ððÂà ‹ì©ØS±§B$c,c,cLdJ› L"‘F“ä›~,"3y3y½E:îvܱ¡BÚb£Xü}" 7n(ɜ̜̜)ðx ¼"ö,{–=KľξξNÄ–fK³¥‰Üo¾ß|¿Y$µ*µ*µJdùøòñåã"{?Ý»vïZ.sYü±}!^ˆö3çTj¡SÐ<š'r*Õ*E¥€§ÛÓíéuLSÇ@¥«t•î:w»ÔÁ`ÓŽjGµ£077Æ9£Þ¨èñ·Ö«õFºÀÿœÊ¨>òy£úØWú#ýo ÊP‘oWV§Õi „J¢òÁί¶ª­jkTþ#µMm>Ôkôš¨>æššýß>öNç·Y=Üùûô>àWÃfب?Õ[õE;m´/ðà5¨Õ 0Ésž œå,¨ßÔ3õ ÅuÃjX €Þ¯÷Gë‡xs;ÿ{û_ùÞÞ.ÞÛûØûyƒýÍÂäR,™‹òIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.6.png 644 233 144 3115 13755454067 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–áOTWÆßÑa¦ #ŠÁdcj‹MCZL[À–ˆfB %ÐPÒ®Éne¥±ºIãÊ¢aC¢¨±6ŠAÚªÉZl ™%‹ì6T R\¦uèD„™¹÷üöÃÌu&ý <_nžó¾çyžäÜóœ# ""ñ¡¯€9Ùœl^ÄæƒáùèÜèÜ-ÿⳘÞ6½ýýqˆkŠkHø<ásý‡06êFäz‘0¤ž1/ñž°\²\2e…ð§Pô|ÑóÑ‚ø¯½`í²v= À¡¯}p¹õr+5ðÓÀO³fAu£ßXoðEò˧¿ÑÕ×V_3Mee¤¼™òfê‡Á†‰Tpîqî˜]5»J™@[bˆQY€/ÆpG`£ê7Ö|¿¡gèý¬cý"¿/ŸõbpÁ‡ìÙ =ðŸoÀ  •h%¬€êU½˜0Au£ßXoðü†ž¡ôÞÊ%‘†]P0^0úüýÿÿP)—/ã9UªT©"Ü †AŸÑgôÂc9æž ¥>|Œ?0âOð'€~;ÈSS€×Ð7¶ò[‘­«×êõF)}¼¼ø3y ÊÁ÷yÀPÇÔ1u ”¦4¥E9ÍiNÉ$“1oÅŠÔ´º¯î¨÷Ô{,q:Äÿ»^HŸÁ a^DälŸâpþá|ƒMñ?3ÃÎa'œÊ<õÊ©WPcõc'ÆN„õ&6NlœØ .4\€¡Ê¡Ê¡Êp]oÑ[ô–0¾[s·ên4\hhnhF U Žކõ°.=\ Lýˆö/‘ÿ¾îüº\{&’&’Tyü_bŸ‹}Ž•üó+ò+ µ8µ8µ\é®tW:d7f7f7Â^×^×^ìØ¿cÿŽýpëÑ­G·Eì¨eÁ²`Ì­™[3·‚ó„óç'°cßvßv+#çfªfªT9|9ÿå<èÛƒ~̦CÏxžñ¤gˆdÛ²m"‹Wæ~™ûÅtñýo>˜þ`Z,å?–/”/ˆ¤8R)‘ΊΊΠ‘©ÝS»§v‹ØÛííöv‘ÜâÜâÜb‘¤’¤’¤y2®·]o»Þ&r/ö^ì½X»ÅoÉ-̫˫KòŸ®$\1]y5æÕӵضضô ³ydͳkžÅ!ÖåŒå ‘·Ì¯¯¼¾"?×î¬-«-iÊnÊiÊñÕûê}õ"4ÒH£HtZtZtšHÚbÚbÚ¢H‡·ÃÛṩßÔoêacþ£þ£þ£"ѦhS´I$ívÚXÚ˜H‡Þ‘Ú‘*2Ð<  hò³Hütü´ˆZ-R€Ã¬oð úM£²WW/ÒØ}¦ÿL¿¬/ Ý.º-Ò}¤ûH÷í†vC»!2jµÚE³³³EjZjZjZDâúâúâúD&&'&'&ÃÆl9¶[ŽHLOLOLHõùêóÕçEÖ~¿¶km—Èä½ÉºÉ:Y/"=Ò#Â}P4вÿXçÎÎ0W»¼ky—*é­æ_˜geÝï×\w \®xÏyÏyÏÁM6ضͶͶÍP2U2U2cécécéà¸ê¸ê¸ ³³³³³³PÖ\Ö\Ö 6ŸÍcóÀ»£ïÔ¾SËÊâU—¬—¬ .ý„rìlßTFUF…O‰ïäã¬ÇYð?˃åË(­WëÕz#NÝýŽ~ÜÇÝÇÝÇAOÔõDPy*Oåû¤û¤û$èCú>ª]µ«vp×¹«ÝÕ(í„ï5ßk§r¬2µ2Õܳ}•ßäXO0WÔÅ'9VªJYR•¡2@9•S9AmSÛÔ¶°Q•¬’U2(ò(OD޽K!… {U”ŠP™*“%¼UòÔãñáñaë¢uÑÅwFŽÉ¿b$oáªÂUÀ‚ɬþð<ÀymN› '?—ù‚/@õ…® VZi<<ä!¨Q5¢F€ùP·nÑ-øU_à×À¯À#ù £ £ ¬ÿäjïʧöuñԾǞÎìÿ(ºI¼€X)IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-8.0.png 644 233 144 2527 13755454066 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–]H”iÇό댃áÒQ*…Z-t£XTF–0ˆe¶(]Ä›,­‘KÒEìRàÅ–+I…™H¬l–u±P.SZZ¶²‰¶~àæ4S3ïÇóÛ‹™wÞÙÚíÚçføŸçœÿÿÏû<çÌ# ""Y±_ççgF;ëìxÊæ”Í—¢¸ÅG¥£òÉwy6ó,@vkv«ùÔÆÖ¾•ŸX/bó'êYqÉ;à¾ê¾ê(á&¨*®*Nù<ŠOÞ…Ôë©×ƒ:Ôߨ¿ÐÑÖÑÆ~˜|0ù`®t®llí[ùV½Å—È/Mè‹@ò­ä[Ž1p»Ü.Xºié¦ü¯£ /ò¡b[Å6€ñ¤ñ$åcðàQ¥@€ÖšIÀÖ~,ߪ·ø,~KÏÒúÈ)É)Õ;«S/D ž¶Ã¡ÜC¹–žvh¦è=`Ô5„AÝUwpà[ûV¾UoñYü–ž¥õ#ÿ>ÛSQ>—ÏhÚ}0ÆŒ105½F¯AÓ_éF:J­Tª{M3Í´ Õ&U¢J@ÿÓH3ÒPêý‰þ ŒycYü>·Ïm<µ1á(EDVü©“©“ÏFì£)Wº±ËØEˆïé #ÁÈE.rØÀ6$Ä ( XÌb'Ä‹¨¦Xiœ0NDmå¼ Ž!®ó3Örö5îkæÌ5äènÝmÿ%«¿N=}ôôQ>>||ø¸­kúLŸé³ñócÏ=?ç[tnŒ Œ Ø|êͯùãÕkâú1?1càò›ËoÀìP_Å*šytòZòZòZ Ò¨4* È[·:o5 Ú†¦ÎL™:k‹Ö­-‚U=«zVõ€·ÏÛçíƒémÓ¥Ó¥ñô°ŠëEõ-?N‘Œ;w¾øR¤¤¬¤LDFEDb'íÖÖhëµõ"á¦pS¸I¤ÌYæ,sЏ®¸®¸®ˆ¼}ýöõÛ×_]Ϻžu=IZž´îJ«K~Ó{õ^»‹ôoõƒúA˜ M…¦B`Š)¦€Ú¯ö«ý0s~æüÌy0kÍZ³TêQ=0Û7Û7Ûæ”ùÊ|eó1­¿Ô_ê“]ù‰96k”å„TŠZ§Ö% Ðj…ZjH ©¡„QGu`Κ³ælBþ Õ­º:ãžq/aŽi#ïFÞýïK˜üøR|)€ŸüƒÆ ð“¡ …¦~QjÅyZhþf޹ƒ“L0üÊmnƒz¨B*„¢ÓÌ6³ÑÀxl<Œøäê}<ùìå‚}],Ø÷ØÂ|ÁþÁPÑóê”IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-22.8.png 644 233 144 3035 13755454067 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÒIDATHÇÍ–kLTgÇ_Fn#ì •-2‘RoTÀŠ—¾ n›Fknƒi²M…n7+Ù`l·Y7¡Æ XtPL!ljXÝf×Ic –Í&° d¤EÃv¸-P†‘ ÌÌ9Ïo? ÇÃöÓ~ôýrÎÿ¹üÿOÞËó¾ ”RJ%¬|XR-©–Ÿ†±¥Ä´Ç¾ûú–Ïø^ƒˆüˆüo~ëêÖÕ$^I¼¢?0±á7âWç+eò¯Ö3ì*A™†gŒ3âà ®„·^~ëåØŸ…ñ'=`½i½¹‚wo½{ àFÓ&~ ÷&îüpð‡ƒ`bÃoÄùßj~Uù#}¥ ª%ª%â1ÄDÇD+i¯¥½¶ù7á€o7CÞyo|¿æû5bí?@<ñrðáÃ3«°á_‰7ò >ƒßÐ3ôÃõ(H:t@)8Vt¬ÈúY8áÁ58¹ñäFC/x8ËYâ!ä ù´·µ·Yé‘"ˆ~#ÞÈ7ø ~CÏÐ×c.å¬RJÕ¼ …s…s ‚wC‚ÉÁdÐ{ƒî ›àJ¥"åyyBC¡ÁÐ è}zŸÞ‡9™gþ)=J % ý;h Ú@ÒÂüP8]8 ÌúÆR~©”RÛ/‚Õgõù"eöá݇w_pd¯ìÅO'=ô€>¢è#À9ÎqnU!ÕTS âxL³øÄ'>àcÎr@Èü\]áÿùŠÞŠ>ÿ ׳2cõw¤­4¢4 Ów¹7‚ãEG‚#q »†]æàpäpäp$8Ö;Ö;ÖCßž¾=}{L¿.ºèbâÏ® \ƒó8ÿÁù÷‡¢‡¢M=i+)1–¶þŽÒ÷*¥T_4747À7íãUãURœê·ÕÛêYÎýUî;¹ï@úéôÓé§¡ÑÞho´CF\F\Fä¦ä¦ä¦@jyjyj9ôÞï½ß{ß,ÈesÙ\6ØT¿©~S=äkù¾|lÚžúuê×,y'¿šüJŠ¡y{óvÐKÂõ(í_qŽ8‡8Á¿ì_†æu­)­)pòDÅ+¯˜9£9£9£phÿ¡ý‡öC•¥ÊRe1ý™c™c™cP›]›]›mÚ{»z»z» ekÊÖ”­pY¿¬]Öà%WúÅô‹àº5Ð1Ðà½á½zMüÑø£â´¬ÙýQôGdqÊ_ì/Vê˜÷ÈÄ‘ 5[2Wò\ÉsJe_Ⱦ}A©(‰’(Qª=¯=¯=O©‚¡‚¡‚!¥v6ìlØÙ TrMrMrRÅmÅmÅmêéдmA©(ÕùçΫW•¶°E)ÕÂ6¨Y¥¢&¢&”R/ZNXN¥ô¿Æ—Å—‰æ=ó¸_å¾ä¾k“cGcG¡R*õJ´&­Ik‚þÆþÆþF°¬kÎ<>óøÌcxÒú¤õI+ø'ý“þIðy‹¼EP»­v[í6ØW·¯n_9“YË,Ï,‡Ú/>íþ´ ðaàCik;×vŠS…Ö{¬-«- ®ü¤ù»æï¤ØrO)¥XÞ=¼»ow¤]O»žvìIö${$N%N%NÁ®™]3»f ©%©%©‡‡‡!g)g)g úýÎ~'Øu»n×!áQÂ` ûÅÑ¥£K,ÏþIÞ—÷¥œ#Îß­ì1> ŸxïÔ{§`©#|J¦ÿ1Þ1Þž;žGžGÈÄ©‰ò‰rð–xK¼%0s|æøÌqðT{ª=Õ0®ëã:,v/v/vÃÜŽ¹s;@wënÝ šM³i6˜^˜›C´ß2æ©d¨ì…²VÊðÙÇÀè+OûØfÙŒŸÿwøñ¯Ž–9™•YXÙnÚR øå¥0¿|ûÐõÐ`]°.ø"iÿŸ>fÜ5¯òqaEaȵpg–»ZŒÒ¥Åj±I$—\Dº¤C:@ ¹-·å6PF)¥ s2%S@¸Ù Ñ´‚ò÷Ðlh¸dtþ7#ߌ–ÜùŸÝ»ò™}]<³ï±góû_`ð1S§“ IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-45.png 644 233 144 2371 13755454065 14674 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü®IDATHÇÍ–_hSgÆßSÿ4›¶ØáÅ ;eR‹ÅIÑ@Ó‚-E§„@IRÅe¹™‚D§v…2‹• ¦Â˜-²–jx³Õ®*óB»)²â.*ÅÔ"6ý“ï|¿]¤'ç¸QÙeÏMxÞï}Ÿçá=ç}ó ˆˆHÑü¯@ž7Ï›çÉâ¼f;îªuÕ–þ˜Å—»ÝÃ_Aaga'@ñåâËæ[çV¾³^ÄæwêYq);=ÿºáŸÇ§ X,w}Åß ‚»ÏÝ7ýýûûz¯ö^å »7vàµÿµll[ùV½Åçä—SÿÒe·–Ý2þ†üåùËEÀðÖ´dþZ u u£KF—è<PãÀ Vh?$‰õ¼r`ë|>ߪ·ø,~KÏÒÏú(ÙQ²Cv…v…Üßg žü­«[W[zé>à gX™d&  U#)Ѓzll[ùV½Ågñ[z–~Ö¼ûnÛ«a¯k¯+gè.¨!5Lš{Ì=¤ç´>¬éC`–›efY®c¨/U«jU¦Öªµ >WçÔ94uªOõ‘õR½f-~KÏÒ§¡¿÷˜{,¹ž©g*§³“”4ƒÌä"ŸRI%è&ݤ›lC<å)OI&™Äù¤H9¡6Ã9¾¶ž¥Ÿõ3oìÒopðÄÁ¹â tæMæMŽMëït§î´éŸŸŸa >ˆÛñÞÁÞÁÞA¸è¿è¿è‡ØƒØƒØ˜øcâáÄC›OF2âÐËégý,Íömó ‘íÇ·—ª,66ÉœÑmtË[ùIDDòÅ”¥2Ÿ-"ÒÜÑÜÑÜ!b ©š©š©š90t`èÀȶémÓÛ¦E B£Ð©¾]=P= ²²l妕›Äà3É“v½Gêˆ:bÏÓ\Í\Í\ àÇ.D/D/D!p>p>p[[[¡2Q™¨L@Q¤(Rp2œ 'a¶{¶{¶Ûáã“ÌãÌc‹_ï³õ³~žJ{1f§ègúèsìoÊ›òÂdÁdÁdO·¥ÛÒm0¾n|Ýø:0;ÍNÓ1ÍŒ"…~—ÿ¿S¹ðËX{Æû¡=~™ìðüÒ¼ç¼ïó<éû}Ÿs!„˜üj 5…FâÐúþ˜¥c–Nÿ&WkRRðà#ÿåø/bNÇœöÿ®Çê\å¯BÇΧöÅ¡oDÔGÔ‡dã°zöêÙc&âÃ×ÀpÞpþ”](»p®ö\-[áï›ßpf9³@Õ¹ÊWõ o8¾8ð¿0úûÑ߇t@DxD¸05oj^âû„ÖDXa^ax<êñ( Z70Žq2 è§µÃbuÌWõ Oá+>ÅÐ#`â’‰K„€•ï®|×P(ø½vÅïŠW|ÞóÀA2|ý¾~­T+eä5y €B@Õ¹ÊWõ Oá+>ÅУ·Ò-„ŸåB¡­ÐþûÞf_§wºw:ÈÙ¾l_6Þ R©$Ër»Ü~“ßä7¡¯^ºé~I¿Ëí‹Æë{æ}ÍûÈÒ>ööNůZÙ(„3-`è7ô÷‡I¿­ÙÖ |À; ß’oᦠ\,X°ÅS ²D–È’a‚ºÿ#é–né>æ ä¹79AüÉA¾ ?·z]BQ}]²i妕 Î?ï^çwVÀ‘ô#iGÒ¶^›ÓædÄj·¶[Û­ÐTØTØT8LPªL•©z|oǽ÷v@UFUrU2²í·þ8¤óÉŽM37ÍT­­¾.´_…âöN¸Øp±~1·Nn,7Lø4*)*‰¡‚Ê‚Š‚ 0í3í3íƒÖºÖºÖ:0;3;3;ZtjÑ©‘Âï×ܯ¹_ e e e~4ýpúaxsãŒðá =yg v Vn€KƒdD@ðÏì‰ì‘õ಺¬pÙ5âj|˜óá\zréñ¥Ç0ë쬳³ÎBDzŽeËàØ”cSŽMÑÍf•u•u•u¤°ª3UgªÎ@FgFgF§¾Ÿâ˜wqÞEøêÁɶ“mž&Oø´±ce½€˜¨˜(ÿ#Æt?ë~¦}oEÏ–ž-¿5kþVX`\`\`„ÊÛ•·+oÃÂI '-œåÖrk¹2b3b3bÿ§ÕsÚç´Ï”Ò”Ò”R0ï6ï6ï†ðù£§ž'bNWœ®Àš[sƒ&¢¢£¢ý„6qìñe=xÊ=åðÅå£7ŽÞ€üó²ò²t‚´õiëÓÖCRNRNR˜ÖšÖšÖB܉¸q'ô®º¶º¶º\N—Ó儿[Í·šoAqIqIq 8î>î†×S_õ¼ê{¯z¯z\ï¹ÞíIäב_Ëz¡z ™ ™ðמÁÜÁ\¹!5n×Ü.†ŒçŒuÆ:(j,j,j„®=]{ºöè‚-M–&Käµçµçµƒ#Ñ‘èH„äÊäÊäJ¸›p7án˜s͹æ\ˆ#>.>vmÙ¹=’¡à¨làÁ·Íß6û‚ߘš~Ú¶9LŸOå@Ö@<°Ú‘Z›Ö¦µlÕ ƒ }-}-}-ÀÖ°éŽtGzÀnå5ð\ñ\ö\{Š}±}1Rúæûæë|87oܼð§’ï^ð±+_‘5Ï}l\‡[¾.gÈ ÷ʽr/HMjR–³œå@ -´å”S>Lù+D òm¹Mnð?õ?Å-§ñ·Øúl}»ÁÞÆŸÊÇÔ×1¤œ·hTÑ(`GÀ™å¾_P£Ù5ûHççûÙ1b\»R>”¿ÉßÜž ù\ëÐ:ðÊ›>»Ïü¬œ¿(¬( ð¾èü/ï]ùÒ¾.^Ú÷ØËù‚ýyÃV|[ãÙ>IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.0.png 644 233 144 3101 13755454067 15020 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜöIDATHÇÍ–ûO”Wƿ܆‹ ¥qCŠ ¨ˆÈF‘,É”Ô[VWD‘Ô–ZÐØBR›fk6J7a³tÖbªÆÐK̶‰·”‘LcËl` M™X·PÑF냒)üóžÏþ0ó:Ä¿ÀóË›ç{yžorÎyÞ# "")¡¯@dzdzä² Ž<ŽÇm‹ÛöûñéD”G”ÿï¯Ü‘ܰü“åŸè#aläú¥ý"aþ¥zF\R$ˆ½{!¢4„?€ÊüÊü¸çƒøŸ7À|Å|e^ƒÚ¯j¿¸üÙåÏ8 ãýãýJ•By£Þè7ø–òËOé‹@LwLwÄÄšbM"±%cKÖÛÁ‚»Y°kÇ®¿Fý¥" 0$’¨JŒ5½ùP½Ñoðü†ž¡œG õåÔ—E`÷«»_5wFÎû/¼û‚¡ç¿4ÓL"hÍx=ð:>P7Ô "ˆ€06òF½Ñoðü†ž¡œ'¼•^‘›aïèÞQÐoøû4‡?ËŸ*KÛ¤mšT©ß©çÔs  k?i?>¤éC„× L80!"rú;EÝîºÝ›þ‡ØwÙwAë[‹[‹Q·OÜn¹ÝÖ€öÌöÌöLÚ0´ahC8¯ŸÕÏêgÃøNÓ¦;MpjÅ©ÈS‘¨±‘_Zi ë©Çu›ê6[{ú; |/"2tº.u]‚ÁwÓê”$å&åâ+ûKYCYäLåLåLAW^W^Wd×d×d×€¥ßÒoé‡ôÆôÆôFè›ì›ì› äJs¥¹Ò p]áºÂu°þëõ—×_†ìo²ª²ªðM¥hcÚ˜ª†‹Ç/õJpÑ '-X<¾xIñCñCêBtäMÓ*Ó*òļpá~„l]°ø,>q•.8,©û·¾¶íµm"'NÙŸ¶?mšH\B\B\‚H~k~k~«ÈJÇJÇJ‡HÍ¡šC5‡D$Wr%W$0 Š$žO<Ÿx^ž¬e—Ý\vSdap!!_Ü"¦¦’*sQ¥Q¥äEêÏ/,D ËBò‡ÉŠüë›û>î“ÔJ­òçÊŸEl=¶[H|g|g|§H‡½ÃÞa)ÙW²¯dŸH…µÂZa±n·n·n‰™‹™‹™q¯q¯q¯ɰgØ3ì"Îgƒ³AdúÏÓ;§wŠxüžaϰH¶7ûdöIIñÞòÞ‘ûê#õQݨXãŒ]*¹TÎ÷6/lVÕ…[ & &ð¥¬MÉLÉ„þþ~h+o+o+S±©ØT …–BK¡R»S»S»¡ÝÕîjwAQSQSQ8z½Ž^¨m®m®m†Ä”DS¢ Þk<²üÈr|!7©†/s¾ÌÞ1ãðm}t}tø–,¶üVú[)LþwÒ6iCéNÝ©;ÁwÝwÝw\ç\ç\çà¡ó¡ó¡œºSwê0ß3ß3ß3U3U3U Çè1z ¨¯ÕUuܽn»ÛŽÒ]þý/†õp׿Yÿ& ‡n%Ö§|ì?A_QO|¬ZUãU&µB­5«fÕìŸòâÅ»ûñ?±a€FÞâ-ÐÝ*NŨd•ŒWý=Ä_;:6:`v›Ýžhî>f8¿ÏpÞŠ¨Š(à 3+«6­MÖ€Ðñs‚k\C©/ÔçêsPª_õƒ²*«²õÔQꑚT“Àƒà^q]OÒ“ð«´ym¸b8EtE4°ø´ó?»ÿÊgöuñ̾ǞÍìÿÜ3ó4a=‚_IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.png 644 233 144 2530 13755454064 14664 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–oHUgÇG¯zí]¡á©åPǵ`¤‘`âBœ *BÄ Œ^ ëEÁD²›ìj˜,_„lEdÿ”º£fVc&½°CÉÉ\.¯¥‚»s»v½çžç³÷ž{ncµ·ž7‡ß¿ï÷{žçùýÎ# ""Žð[ &-&-&)dÇÔZ~{‰½äÃs!»#Z…VñóAXѾ¢ ùLòcز͸™]/báGó™~qˆåH¸˜pQ+ ÛG¡z]õ:û{!ûë{x%ñÊß:ì¾¶ûÀå³—Ïò9LöOöÌÍe›q3߬7ñ¢ñåè¿øE îzÜuí7HˆOˆŒ-[2ëB £™°µlkÀ‹Ø±*‚ÓÀ2–©"`Ž9Ìg&Ê6ãá|³ÞÄ3ñM>“?¤G`åæ•›E`[ͶšÄÎPÁð·p`ÕU&_à ÐDË@ŸÓç‚ÛƒÛñƒº§î ¡e›q3߬7ñL|“Ïäé‘7÷Öõ TÚ+í€üD Øì0FƘJP (}\ÕGAeª5jMdÅPï«•úþX Æ 1oÌ£ÌzÂx&¾Éá—hAµAâdâäœ F‚#AÀÀ§`¸ >¥“Cð%9h Áƒ¨ U¡*€hˆŠ7sŒc fI%À8nÇǼ‰æ‹ð‡ô„…uü{÷4šhÆÇÌéú¨?XÊÒÐ÷("/d\ÆEdL»©Ý´ø,þ°ž·1õ•ž¥gYgÌsÛsÛsòÊòÊòÊÀát8N¨ ÔjÐZÑZÑZñã7Æo„ü¦ü¦ü&Hºšt5é*\p_p_pGmå¹…’…’wž±·t¥9¿ç)O­®\h^h^h†W¯^ €á1<†ü}þ>Lž:=u<±žXO,xözözöÂkm>0°š“ïôSú©ÿíÊÿ˜cEæX§Ñ‰Oõª—ê%¨3ªCuDµ¼ŠWñ ¼Ê«¬3>|áYè·ÖÀØaìGÞ1ǴȤ•Ðä©´WÚ÷ÿ ÒõºëµÞ/Aã®q7n“Ø´Ú Ñ勘ܘ\±Q@I¢i¢Ù4›ˆü"£2*¤’*"™’.é"ò»8Ä!h¿ª•"A©—Y™•8Ñcsbsô~‰«J¬JŒÛ$rÉÉß²%¤ã@ïbþW.ÚÛÅ¢½-Îì?i%N®S5IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.2.png 644 233 144 3032 13755454067 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÏIDATHÇÍ–ýOTWÆ¿ gÅy™àŽþ°µ‹k%uIdˆHAChp¥uÉ Òõe7®dk ©ºÄt»¢bkc­±4_¦²m6¤®ÉXÍf4°Y—ÚQÜP@ym§;sï=ŸýaæöNÜÀóËÍó}yžorÏyΑ¤ðW ÚíˆNáèíV|^ɼ’¥ á3:D½õÆ¿!ñƒÄ|²à㞅ͼYÙ/bñGê™qI+{9ör”+ŒÀæ—7¿<ï'!|̶+¶+ÿÕ`Çg;>èhíhe7<¾õøÀ¤kÒ6óf½ÙoòEòË‘çôE æó˜Ï£ú!ö¥Ø—D «8«Ø¹7TÐç„ò 冿 ÍQÑ ó™¯\€?æ‹Àf>\oö›|&¿©gê‡æXT¸¨P*Þ¬xÓv>ÔpïShÈlÈ4õ‚W€£e>h~Í ×è5Ì€ò(QD…ͼYoö›|&¿©gê‡æ±~e@D¤yTÞ¯¼Æ]€àMm0¸4¸T–öªö*Áð¤JmQ›ÕfÐþ©õh=` ƒÆ Öš`„‘‘R?Õòµ|‚Ú½`j0 OˆßÔ³ôÍ_yMDäg§Àæ·ùýs•qÿæý›À(•£rð($¤¨ê(]éJä'8dA†VCjH ¿Æ@­Wë ð^ˆ_M…õÂúxBóODDÎÜPì¬ØYaÒ?ÿ×`OyO9ÿåñ׎¿†òýÙ÷®ï]K°/µ/µ/šÏ5Ÿk>wêïÔß©·òF›Ñf´YØ—î[ì[ '—œtœt ºWyÛ¼m–žšÝY¶³ ÌyD¿-"Ò½®¶_mô¾tåNúS|v|63{+ê*êÀYí¬vVƒ7Ï›ç̓¢–¢–¢ØèÝèÝè…•[Wn]¹zTêQÖ@wÞ]xw!84‡æÐÀÕä:è:Žß¤ÛÓíÌÜ:òMÅ7Ê W›®69OtÔŽ¸©¸©¼|‘"{‘]ä»Îá‰á‰¨ó»¾Üóížo%Ö=àuŠdådåd刴׵׵׉ô—ö—ö—Šd^ȼyA¤¤º¤º¤Z$C2$C¬õ0áaÂѪÃU‡«‹\o¼~ôúQ‘ø=‰ï'¾/±Ý>O²'9ê¼Èëþ×ý"¬´_³_ËËX¿ Þøšy££Ö±ÿîÐÔ®©]PÜRÜRÜk×$®I„†e Ë–AvLvLv œ®=]{ºœ—œ—œ— “N:ùÿå«ñÕøj`Å©§Vœ×ÞªÂ*N'ƒÉM“›@ù“$IŒ¯E_dïµ÷ªË0ûöìÛp²ëï>ü Ö,v»,âÕÝ«»WwCiaiai!¬-Y[²¶ÄÊçíÎÛ·Ž¥K;–ÁŒ`F0n﻽ïö>ˆËËË…¦@ÓM?€ÿÖ÷Íß7ƒQ&|œò8HhKhS—EÅš{¬½ ½†ÿðlݳuÊý‹õ¯væ_ÖÏ­Ÿk’Ù÷¦]Ó.x;òläJ÷èÝqêŒ0Ö8Ö8ÖFŠ‘b¤€²)›²ÁxÇxÇxöööÃhýhíh-<x¤?ÒQÿp¸aú?!=xkö­Y :|*é|ÎÇþòuþGÛ¢¶P9*_åƒ*WåªÔrµ\-ð+‡r(¨€ ¨@ÄæšfšéÈݦœÊ‰YQÏù¦™Î?c:ï¦9›æ¿9³ú›6¥MëÃú°åütp‘‹ n„¯ VZiFyÊSPjD¿¢‰&”ú«¦k:AõÝ®ÛA}vþã•ïT¾c^M‘ÎÿâÞ•/ìëâ…}½˜/Øÿ­â&ö’¡vIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-33.7.png 644 233 144 3006 13755454067 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü»IDATHÇÍ–íO\UÇÏð0SŠL¥©EP‚/j ¨ ƒ‰C´Ð‡t*X"µ%„ˆvúÂê+S»qÃn^¤Í‹Z-/¦ÒÔcpÙV°¶v eJJgx(¥ t˜™{Ïg_Ì\îtûô¼¹÷{~ßoî9ç{!„)‘§€˜Œ˜Œ˜ä0ŽyWŸ_Wº®ô¹Sa|\Û†7o†'ZŸh0w˜;Ôkq-?º^½4Ÿ6/R„>aršœ[ •¹•¹ë6†ñ?ú áL™ÿ† îlÝY€®¯º¾âÏ0õëÔ¯÷m÷m c-®åkõZ¿èþâÓÿãâ»ã» wÀd4…€gßxö¬ƒá„±,ؽs÷N€?bÿˆ•1 Ü’H’6`‰%´1…µx$_«×úiý5>?¬G@êk©¯ {ÞÞóv‰pÁÈ7ðQúGé_ð 👡¥Ð€òŽò« ûd  c-®åkõZ?­¿Æ§ñ‡õèKéBˆ¦×¡Â]áõ:@ðbh"˜Ìi ½z•`D©T‡Õ!uB¡ßC¿ƒÌ•¹2—G†üY®È¤x*ðAe_°=Ø¡@¸¿¬*ß\¾YØôº¾”½Bai„¥„¥¥8©º/º/`È-r ~&ðâY+ke-ÐAQ ÎqŽs@uÔEÍxHj–ÌÂ; Âá ³´¦…âx¿ä½=ïíÑŠÕük“ƒ»wCs^óóÍÏ#GoŽºF]zû«MW›®6Asqsqs1¸§ÝÓîéG¿Øxæxæx&´µ¾Ôú´ßûÂô… ù퟾T¿Tá†ßSç©SóÁÑèhu(¬G(ÿBˆáûï¾ÿ®ìKK“µ)[Ÿ³>‡U»ÅþŒýÈÙ˜³1g#tNvNvN¦åMË›–Áî²»ì.ÈË˃[Ö[Ö[V]Ø…k®]¸[÷nÝ»u/캴«wWïÚZm¿Þõu×ײº}Ý>ýÖg¨O\L\|á1XÒ[Ò+Ä¢w s Óp¢á†cÚ1-DaNÑ‹E/ q4íèÓGŸÂ{Ç{Ç{GÇÇÇ!òcòcòc„8<~xüð¸+É+É+ÉbmXS­©ÖT!.;/;/;…8™~2ídš¦o Æaz7·¼º¼ÚpBLMožÞ,DÜ@rIrÉ ¯0¯7¯W‡Ywwþî¼~ì}YhXh€íÛ¶oÛ¾ ²mÙ¶lŒ,Ž,Ž,BÀ°ìPj+µ•ÚÀRl)¶ƒ+ÞïŠtI}§}§}§!Ó›éÍôÂ/[úSûSu>õìì糟ƒ¦G(‰O&>)°úþêûÐÖÛ~©ýlßQf.3ë‹Ò‹Ò‹Ò!¯/¯/¯ª} û´M¶M¶M½Š{÷*ôø±¤cIÇ’Àšg͵F^õväet*q*$÷$÷H§]Ús&:a©@Ö–¼ìyÙÃjÊ\ÊDÊT¯:_u†ç‡ç‡ç¡ § § Ì-æs ì3î3î3ÂÍ+7¯Ü¼–!Ëe>(|Pûì?²ÿ4–7–5–­éZUd˜•ΙÎÍ6>ŒøØñ~þUW§ŸÊÀß—mË6˜5̬ͬ •6¥Mi‹rê@u ffgfgfAu¨Õ²FÖȘ«™«™«y[Þ–·Á÷œ/Ý—þûÝ~7ÔÔ€ŸÂ|(õ׬ ;Þ/¸þ°Qö9ºæc•²¿,“²Ô.µKí9"GäH”;¥QA.ȹµ¹üÜç~nP~S~{ÈÇ·0•0íckWsÞ·bߊEœùÇÐBhø§âQ<ºósˆƒùƒì–ÝÀ)Nq X`žy.9(_$?MùDù„ ‡”¥@S¼H(Â÷ˆó?¾ÿÊÇövñØÞÇÏìÿ¼.Ñ£ IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-12.6.png 644 233 144 3073 13755454066 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜðIDATHÇÍ–mL”W†ŸaÆÂ,oqL¬0»e­øYI¦•4B–´Á­”Õ€|ÙÝŠµ›H#?Œ’FwŠ[›¬²fk[âf¥àÖ!Ø!¦îRšn â*(γ:…a>Þsí™—™Ýdÿ{þ¼¹Ïó<÷}ç=ç<爈ˆ-òˆKKK ã¸=Ñù„W^]ÑƧB`zÝôú?ÁÂ~°èãEëƒQlÄüØz‘(¬ž1/6‰NÄ_Œ¿h²Gðax#묄çÂø÷=`m±¶L¡¼µ¼àÒ'—>á-xÔû¨àûvˆb#näõ_,¿þ}XðÅ‚/L#ÿLü3"ð|Þóy¿ 'ü+ ššU„þ hhÊøðaŒÇ1؈GòzƒÏà7ô ý°Ź‹sEàµí¯m·þ9\0xÞMy7ÅÐ ´õÔ£AÐô„ŠCÅÌêQ=˜0Aq#ߨ7ø ~CÏÐû‰.¥."âØL¨(Xœ7äÔµ@z ÔВБ€RK”MÙ 8€Þ§÷é}DÇÆ›GJ•ß ¾G øm`Q`è߇ù¡h¤hðEôç—Ò%"’ù!X‡­Ã> »“v' B]äsIA™y…1õP=v±‹]1FŽqŒc ÜÊ­Ü1óV¬XAÝW.åP;ÔfhˆðÿlÈ9ä°ú¬>Ÿ…›a?‘?vê•å•å èk Þ3ågœ9€ê¿Ó?Ø?ÕÜ=¸{p7œH;‘v" úÖ÷­ï[ëÝ¡;¢øî[w«îVãŒã´ã4êïU7nÌg¯å'oV¼ Üû6ˆˆô€ó/Ÿ‚‡TéNç¶ŠmÌG¤û\÷¹îs0:1:1:ÉíÉíÉí`?b?b?©ûR÷¥î§ßéwú£†<žOädædædBáû…u…u°~ûjÿj?sß6ŽVV©Rø|ìó1ÐW‡ýÇ“ò“òÕEkkÿ ²È‚æŸ7M6MBÊDŠ7ŠΫΫΫp½ëz×õ.Ø_¼¿xqÔÀÊ+¬| þCŒ±³3ggÎÎÀ²ìeÙ˲aoÃÞö~µ=øÎÁwÀk›JžJðLy¦@>ûÙ³Ÿ©‹qò;óWæ¯xQ®Z¦-Ó" Ëwò<Ù>¸sáÎ…"˳üíåo‹Œ_¿2~EÄžkϵçŠìqïqïq‹¬9¹æäš“"KKK"e÷Êî•Ý“ù 6‘S‚)Á$²êûU·Wݹ _ȸ!Ò{º7Ô’'"¶û¶û"jI/Z$¤·è-¦‰ ¬ ¬••’-""‹ â¹±¹GsD7%nJÜ$â:ê:ê:*²®u]ëºV‘:­N«ÓDj®Õ\«¹&bn3·™ÛD¼!oÈÑ”¦4%¢ujZ§HµV­Uk"ªk|¥ñ‘aëpíp­,±wÚ;ExN÷èÓ@œX|y¾¼þ¯e®çËž/EL¿¡,âËŸ¸-±0±PDËÒ²´,‘[³·foÍŠl[À&Ò¶¥mKÛ‘tÒIG¤±¤±¤±D¤ » » [dcýÆúõ"ÙMÙMÙM"‰ÄÉÄI‘ŸîX±aÅñïþUuMu e"mµmµ"æ¶Ùͳ›û¿ŽžÊ@åÁʃÀ¨q*Cí¡v˜üådõd5*ð@o ü¥þR)xŽ{Ž{ŽƒËír»ÜàÖݺ[‡éîéîénðæyó¼y ×è5z ¨fÕ¬šáqíãêÇÕ¨Ðûþ—ü/ÅœÊÛ••FÃ=u#b,óC°Ž[Ç}šššß»ù Ÿ×ÏGû$Èÿ~üÄl~~M % û”EYTŽÊaF…o•|5;ôÍÐ7ÖIë¤ÏB×õ1T¤óª­æ­æhçÇ Ž­z’žD€?ÐAJýE}ª>uSõª^P—Õeu¨¤‚ P^5®Æ@Ñ®ÇëñÔàÁ?«e«Â)¶ó?½wåSûºxjßcOç ö?OeÛÇ}E¾IIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-59-grey.png 644 233 144 6240 13755454064 16006 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü UIDATXÃ…—PS×¶Ç¿{ç„üR‚Vè¥U2 ø‹a|Ørmk«Ø>µj¯J¼þÀë0øJÅÑÁiK}¶iñÇÐ7,þV,¢ò â»"XGÄARAˆŽ@…ð+!ÉÉÞ÷$xÇ™N×?gö9{¯õ9k­½öÚ$33333>p‰Ùõ  …§ÂSá)¯È<™y2ó$÷ÏîÍîÍîýë,>…OáS¾ý» ˆ‘›me¶2[ÏÅqÇq’P„"Àc<Æc›±›y®,I–$K"BÐ#ô4'ƒd î.Ìšš55kjÕ£œõ9ësÖ“$‰AäC»íæò¡€1ˆA =ŲY6Ëf·ícö1ûØ›ó²Ë³Ë³ËOuÚMv“ÝTy×a‰°DD~¡ÊSå©òp-21212‘dDI£¤QR`žfžfžðŒ=ß=ó=ë=ú&ô»íyì{x<|‚Ûƒ±Ü›{soö9I&É$9(O$ ’UŸ+++™®ñ­ô­ô­tîJ|œø8ñ1uÌ1Ì1Ì1d² Y,؃=Ø%,°À`6`€·ðÞ‚Åh ´â#C¡ÆPÃ7Bo„Þe»^.~¹øåâµß+ƒ”AÊ rg²3Ù™¼(븎ëž~N@@@cɾñ}ãûÆÔ 5“…2¡L(«9k·Ú­vëô%Ú÷´ïißcVìX±cÅá”ϰϰÏ0´ðƒü òÂC  ­h0 “0 À(F1 `f`@ÚHiƒˆxÌÞfo³7Ú/½xôâQñóö[í·Úo ¿y)¼^ŠŽëb’˜$&½»ïâ]¼û|„*êõŠz@ê/õ—úýOËuËuËõéK´KµKµKÅtëuëuë…ßÔÛÕÛÕÛá'Ö‰ubÀ2Y&Ëü7À Ť˜ä%yI^¨@*¶Œ-cË 8W9W9Wê~u¿º~ýÚOµŸj??òØ÷ðxøHvEvEvŇóìõöz{ýõzïïï¼¥gKÏ–RïSäSäSÊ£y4†7¹Kî’»l°Á@dDˆ ¼·óv€ô‘>Ò¸rÂÖ±ul@Kh -Á°y‡y‡yXª@U âQÃêaõ°š½¢¼¢¼¢–DQÊCyèþOqŽ8Gÿ þAü$º½Üz½G¶ŒlÙ4iš4MÀpÀpÀph i i ~ÿä÷O~ÿpm€h‰–h^lx±hˆhˆhˆ:Ìæ3@TA;ÂŽ°#ðö9êsÔç(¼âââèáñð‘}’}’}Ö§º º º@N¤>J}”úŠFE£¢"Îâ,ÎBhòoòoò ¢ ¢ ¢_­¯ÖW ˆ;ÅâN@8'œÎ»U»U»U@‡Ø!vˆÀɪ“U'«€IŸMúlÒgÀˆ×ˆ×ˆ3'fNÌ`ùÜås—Ïp´hM¶&[“!ü˜ôcÒIÈ[9¶rl%×!}(}(}ˆåžZpjÁ©Ü#c¢^Ô‹ú‰1¯ÕÖjkµœç×ä×ä×¼zÏž±gìçÜÂ-ܹx@< àüë5_¯ùz ç—÷_Þyÿ«ùí±í±í±œï9¶çØžcœ?s±Oìµk7Öª_U¿ª~¨„J¨. . .… ( €òšášášÅ#1#~"Nâ$Î^‚ÿMÿ›þ7¿Ùۛݛݛ=ûoºÝ€n]ûù¡óC燜i›±›!Ñ'ÜK¸—p¶RM©¦TÙÈ;‘w"ñ ñ ñ vcìÆØ@Ц MA›ÇÇÇ ¨¼¨¼¨¸ß}¿û~7Àëx¯–ÞZzké-pµ^­Wë!»˜x1ñb"³t½èzÑõ‚þ¦UŽ*G›V;ÊåŽò]GȾgûží{àîáÞ_K{¥½ÒÞۊѲѲѲ麄‚„‚„ž°äí%o/y›Üì×÷ëûõàÏýŸû?÷™Ò8¥qJ#0mî´¹ÓæDNäD¸" ̘90èø¸ã㎀¾€¾€>  8 8 –‡“N~8«J,%– ®*z=ŠžñÅ\Â%\¹ aCXóVJÓãô¸¤ž¢‡è¡®¬•µ²Öd»òŽòŽòpû‡Û?ÜþÏn:Ùt²é$μ‘öFÚi°FôEôEôÓs§çNÏH)#e¼á o±ˆE, )ÒiŠ€ÈºÈºÈº ÀááûÃ÷‡ïCy­áZõQ+5IMR@ÌÄLÌ{‰&Ñ$ºy+ôÐC/ºÛºfë²uÙºö~ßú~ëû­ïn@­{Òèá›} Ø3AéVPëÎÝ˳Jg•Î*Õ/—o‘o‘o9“300 ˜/d^ȼéLswôjƒÆ 1hPTS_S_SO>W¶([”-Ó2-Óþã¶°FX#¬±þGpTpTppÛûØsB½Î%ÁH\\\\\D÷ÐÀ½¸÷"ÛM3M3M3ñ¿Îwœï8ß¹+Ê‚eÁ²àÿ<Ò·¨oQß"M©¹ÙÜlnæß577;cG£ŽQ‡$UºPºPºð¿y!/ä…§¯¹nI;0€ö–'nG‰¯óü‰üAîf»®Î,^ÆËxY\›«kúÿàñeãËÆ—±™Ò|i¾4Ÿ6KtDwãVÈ¥K!—þgl3¶ÛÈÿ±7Ù›ìM~­·Ü hù#Š?‘×r×].œYHA R„²ž¬'ëÿÂ+x¯Ø½A1M1M16K:%’ήiì[ö-ûv[wËê–Õ-« ‚Ýú<¥õÏ8þ38BG¤0öIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-31-red.png 644 233 144 4134 13755454063 15577 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXí—LTWÇÏ}ïM‘ ‹’lDvkü ÅP,­üÐiœšH-®­ØnMýCEÅÖÄBŒ(þØ,‰RŒQ£œA›Ò•D«e‰ÔÔ k²ZLÈÊPe­udÐÁaÞ{÷»0÷½7“®f³{ÿι÷œóy÷|ï½htŒ£ˆ!eÅxb<1ö4ìˆ{©å¥–—Z–,P4ES´ŽÐšCs€Ñi^C )¤ˆ´yX/âE>‘?²ž”Écå+¥R*•Ü‘óR”¥Eiq÷³Íl3Ûl€$$&&âl~w~w~7°òîÊ»+ïÙÙÙ¦-æÅz/ò‰ü¢ÞóyHZiO9 ICÒPï±C“‹'O.Ö¶¾tøÒáKüeÿ#ÿ#ÿ#2dÈà žà €^ô¢0ìð¼X/âE>‘?²Þ”Ïç#{¼Ô'õI}½çD‚ìŽìŽìõ=¡žPO=žÆÓxT­B«Ð*-CËÐ2Í¥¹4—ÅÏ‹õ"^äù àˆúöx¹™›¹‰”*¥J©j¸.5ŽjGµê2À>æU¼ ~µadÛÈ6€÷†n…nÑ:µNÀ>ì ‹ô£ÀH8¾W{ª=Ô†à÷Áïþ1oå­ð‹ÅŽG£Fu‰ú‚Gð‘íŽíŽíÎÒ¹b½Ò^i¯äS½½÷¼÷ð8œÇ¯í  „à‡jîðÏøg€*T®à h{´=üü?d®ÖöjåZ¹aú½½½ñXÔ<Ÿ²QÙ¨lì¬uEuÔ}À? '¨îз¡o-<Á›woÞ€#Ë,€s¥çJ@ýBý ®¿¢¿bµÏœ-¬Ü[¹×ôªî‘¯G¾6Ì@]Q]Q]ÿÈØÙ>â¾ÄÔÄÔÄTÔô/é_Ò¿ð#~„ŠdñÍ'{Oö£çÆ ¶Ú+ÊW”[ÁNèðuø`ú§Ó?ç$ç$Àhz²V¢•˜Ü¢¾à|tÏò}Ë÷-ßgVÑzÔeê2>áÊœ›9ŠcŠc¬@_|9`þeè—!¸˜r1Åê¿og½e ÷é3õ™€Ö£µkíf}Á#ø¤ð‘J±9mN›Ó8c1´Žå°"ú­píŒßOD´½|{9Ñ™ò3åDDÇn»ID47{n6QÜú¸õDDo\xã‚ÒqÃqƒˆ¨ÿrÿeËE3†8q":AÇé¸YßÖlk¶5G^ܯ¼pAí‚Úµ¸ýŒ=cÏ€Ó8ÓàøßÀ7XZ…Á)ƒSÀqÍq XKÇçŽÏ`ø§áŸ€¿Ïß·î|^ /Y®,€`ØýƒN:<Çóxp±:{|öøìñ¸-øHrI.ÉzvÔ+=ª5¯˜€6f8y8N8q@Ð{È{È Ðçïó[[{|èø~eä5ä5P³ÞÍz×ôj§FzFzÌzíûÛ÷·ï7^Àõ,¥³ôÐ’çÉóäy;ªÅ)Kþ½=Þ¡MñþñÎ;wÞíö~¾(öVì-Ø2´e0¿ýÚ«×^µ‚~uù«Ë¿º´ji€@®=×à-á×Kôx^ uGêŽÔºñÈä ò„C)ÎçŒs)•‹ÊŦ>ãÂ/È}=÷um‹‘®ìhÊÑá Økì5+`IcI#¨Ýj7èóõùNÿ›ô&x¼ðÌÂ3€>Úãs‹¯{Š=zÀ\'¯“×ÝX5jÇú(rL>hK·¥ÛÒ{Š€²Š­í[Ûù"ãþ}öõÙàÀ±µÇÖð·_m¿ ZŒqð|…E‹èpv8­è›üoòÍVŸjhÀ[ÆZ-UKÕÏ–°‰l"›8ëp |Í8_kØj¶zq=kbͬYhEßàisOsOƒÇÐî}–>ËÂäŸðO‹±ØºW"ðEüCþ¡¹¿}M}õ}õ@ò˜ä±ÉcÕÆNî’wɻʚ‹\äRì&kåP޲‹Üä&7‘ì“ïÉ÷¶ž1žÖzûRûR5Á»½§±§Ñ,È…ÔÐèSÚˆF `?ãgt¡ à«´éÚtsW_Yݽº[Ûb¼@O”!eȳ;iSÒ¦¤MD’CrHv*LW$0džWÉ·åÛòmÖ:uÛÔmS·ÙŠmŶbÏnC»9ŽGŽU»z™^† <ðÀ`°œêÚ m†¹¿µókç×Î狌·<Á–`Kè{6jÛÇDvšj=±(ó»HÛ>fT»ÞS¦vË*Ê*,ÚMPÔH¿¯ß×ï›ZìÝXOlWlWlÏ74'ÅIqï팒âÁ(¾z¾C®µhw [³8Ÿ5±&ÖdÕ®§ÍÓfjWmSÛÔ6SŸÃIÃIÃIÀìÁÙƒ³µé†›åf¹ù/™BjaéEþ†^0Ì"©]Ÿì³hw¿}¿}¿šàmò6y›ÂG'ˆAAZÖZÖZÖj^;J½R¯Ôw…ÿ%‰ý{TݰŸ^~`ôï…µû×ÿ¤ÝÜe¹Ër—™Úõdz2=™81:ÏN°BVÈ ïˆ,# DÕeô_Ži7K®–«åêÞ \XYXYXÉÿœ6’6’6¢þÃhµOöɾ²ÉÔ@ Ô@ákGöFÕ‹¡ÿqDkww¤ûO¶–­ekÊ£<ÊÓgJ“¤IÒ$€#Fû.9HÉr§ÜÉ.„WEuîÿ6Œ¿œä$§r=rz{‘Ä%.q€gçÙùýnÔ?ÍÕ™ž¨¼/lõ¿Çè”A)¢XIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-54-grey.png 644 233 144 6203 13755454064 16000 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü 8IDATXÃ…—}PS׺Ɵµ÷Î_!@ùºX„ËW©0”+"Ð~ U[µg¬tEzñ´ŒÞCK §·Xmqbk‚g®lQ‹XéPåcÓC½"*D,Rj $;{Ý?ȆÞÞétý³f'k½Ï/ïûìµÞÊÊÊÊÊJxcaX&&{À=àÐÎÊ/+¿¬ü’VWW¿KUTEU‡þâƒø Ä·lí¶v[;­AÐ@ÊhD¸‡{¸à-¼…·hl“l“l)çÆ¸1nìŸ d’L’É÷´UUUߨóÔyêŒä,p×\\ÞÌ"`*R‘Êœª…j¡Z¸fŸµÏÚgý“ª;ª;ª;NØMv“ÝÔuÝš`M°&$þÍ]ã®q×àÛĵ‰k×’òdI²$Y$ù$ù$ùâ³ø½¸^Ü/Æ[ŒïÒõE‘sep5õ¢^ÔKÈ%»È.²+LƱalØ•³M³M³MË}|»|»|»œûÖÞ[{oí=Ʊ¢EÿŠ~²^V.+—•Ê÷ñ>Þ‡¬°Â `v`€`#V[ˆ-Ä‚õýº~]¿Ž:.G_޾-ì{üâ㿸ýS·0·0·°Urç.ç.ç®5Z@ hÁƒ\f5Ù?¿~ÿ<tÐ…xrí\;×®k¶ÏÙçìsË×…?þ|øó|êÖ=[÷lÝÃöžöžöžF8üà?ð4’FÒHpÄ xÀžà žˆB¢2D†Èx<Â#<gñ²xY¼0Üúyëç­Ÿó¹ÃW‡¯_åz¥ ©Bªøù¿‰ßÄoÊØ† d ct†Qèz…J%ÿùë%ë%ë¥åëÂ7„oßÀ¯/È+È+Èãz•»•»•»áÇ÷ð=| T •Båoƒ„ €4‘&ÒÇä1y nÒMºìÁìç\å\å\(·*·*·ÂOŒ/ê‰ú"ÈGª;«;«;s’ìz»Þ®¿¤÷šñšñš¡…c…c…cDï}Òû¤÷I0t%]IW‹\'×Éu6Ø` ƒ 2üÿÁƒ€n)³ø?à€j¨†jr$1mÙaÙaÙ¡>¨>¨>ˆ&O{N{N{ƒ4Yš,M^—ÌÐhM£lvd:2™@V_V_VÖº¥.Y¯™Â™Â™Bà–Ï-Ÿ[>@ÿÁþƒý[Q·¢nE·_¹ýÊíWG©£ÔQºHÓÃô0 f~X;¬Ö'>N\üY^¢ž¨/òˆ| ÁGðÿV¨z¤z¤z„š¸Ì¸Ì¸LR‡m؆m‹ ©©©ê3ê3ê3€–ٖٖY ¹³¹³¹h9Ýrºå4`]n]n]¾”XRFÊHð@ù@ù@ h´­F ݺ1tã7ÈG>ò!õE‘³™mf›͉͉ÍA¹¢GÑ£èÕyÔyÔyn,X°fÜgÜgܸ²¸²¸2 0½0½0Àz¬Çz€ÖÑ:ZÐ\šKs—ô-ŸX>±|´Ö´Ö´Ö /+ –FK£—Ö9W:W:W‚S+Šۆ¦…¦…¦¡¼ÏÜgî3ãƒñ!>$ÑÌæ sfqŸlá_ 4Âð#<077h‹´EÚ"@ËjY- êuƒ:€ `˜€¥}§RO¥žJ¼·xoñÞ¨t*JØuv]÷›Œ>ÄC<\ÒgÞdÞdÞPzÔ“h† bƒØ zv:e:e:÷ù¾„/ËÄ3ñL<¨¸“+ãʸ2À×èkô5)~)~)~€Ç»ïz¼ œ000fj¦f tè:Ñuðhöhöhr‹r‹r‹‡Éar˜Î—óå|c‘ïÈwä»E=v¶o¶o¶÷™p&œ §g9ùÇòåóµ÷îÜàþ~SsSsSCÊ“¸$.‰ÃœÀŒÀÀíeŸ—}^ömŠ6E ¹,¹,¹ Ä–Å–Å–CLJŽ~|ûÇ·|è5ö{€g“g“gÐæßæßæУô(= èzu½º^“˜Ä$r-åZÊ5̃`àf0Œ#ËïËïËïóµlÖάY;yvb'v¾ð¾Ñh4Îð¸Ü¸Ü¸\æoŠQŨbÓšM€&2ëkÖ׬¯¡¡¡€1Äb ôÁú`}0Ì$3É °Ìo™ß2?@ATAööö`bËÄ–‰-ÀSÚ§´OieŒ2F ›OˆOˆOM«›V7­RgÇgÇgÇÉy.Kà´&°;°;°û£ i–4KšÕ4jþÂü…ù vøìÔÙ©³Sνâñ‘}#ûFö Ø®N]º:Hd­}­}­}‚ÕØll663½Ò£Ò£Ò£·¶9F#Ž‘}²ÿ—ý¿ìÿÀ ÜÀ9&—ŒKƯ)ž´?iÒ¾¼ »>»>»žf¯[¶nÙºe¤ûaíÃÚ‡µ £££ ª>UŸªÍÍÍHÉ!9€`Ì‚ ¥¤””´‰6Ñ&`€`X`YŲŠe°ŽÞ½=z9©<©<©ÄE·Ãn‡ÝÏ¿HYÊR6ñ/ˆA bî±YžYžYž¬ž4’FÒ8µ ( øŸÉÉÉ…)?Û¶ÿl§zÿ ÿ ÿ 2VVV„ ¼x%ð $ªT¨>ˆš¨‰zéF"©$•¤d3ÙL6$‰$‘$À¿Ø¿Ø¿ÓŽŽŽðhÔ7êõ|¯3Õ™êLeÖ³³ì,;ûÞId! YŽ¡5¨áB\mž3y¡oäcä9Ö]¤3éLú¾ö…;šùìâ…‹.^à‹-ñ–xK<Ü\™šÔ‚ZPPC 5€íØŽíæ1y?á'ü´ørÛD+]¬¹Xs±Æ¹w²~²~²ž;& –Kƒ¿VGÕDÕDÕ|zU¨BiƆ0įûQwŒ`#üJQŠRÒûMì7±ßÔ¾*Ï—çËó¿VO&L&L&p–ÖÝ­»[w/y—ø?âæ0‡9`q–C9àê¨ XÖcè1ôh¶þ+ýWú¯ØZ÷i÷i÷éÑyÇyÇyÇù²ªªªj j€R<ŽEP«k>#x‚”7½ùëÍ_{©½Ô^Zö‘»Ê]å®zpæ^ǽŽ{lmçë¯w¾N³I )!% B£Ðº`€NÑ):žð„ÇÜCÃCÃC¾îŠïŠïЇÒÝänr7BŠ"¤”}ÄaŽ0GF癦i`-àÐñ bM\Idÿ·Dl-ºÐ….çÞÏe¿ºpc]9ï(v;Š…¿n¶ Û&}Å‘GVÁ&á®pW¸ 7&†‰ab`ãËùr¾²ã‘Ç#G:£L+M+M+ÙAy¼<^_»já¥Ù×+Ô uBwÌUÙ·ÅŠ©ÕjµZi1£p}°è!—w÷º¼{Œhˆ†hº¿a²˜,&k_; P€æ³G‡£ÃÁ[´­E 7†a†Á”˜‰ï羟û~N°ŽÖÖÖ±ƒò y…¼bà[›Ñf´+>|ið¥Á—`¸kŸ›(ò-‚þX\àæ ðƒË»çcÛbÛbÛj_•Ê å…_«'ƒ&ƒ&ƒ8KKeKeK¥s¯«ïTöûôûôûà¤N¯Óëô$×í®Û]·»€.„ á½Æ½Á½Á½1—‘‘‘̘]z¯¸æ¹ßs±øƒ‘™™™™™ ÞõØO¥TJ¥d·éÓ3¦gð_ΧO;Ÿ¾ÎË"d²ˆ-ŸM¬™X3±Æ§ÍrÇrÇr‡~róÔÍS7O9W?qÇkfÛåôIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-20.7.png 644 233 144 3020 13755454067 15024 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÅIDATHÇÍ–íOTgÆo˜åeê,tËàëjjÀ *¨Qá™h‰A)M·$ý@¡°¬»ˆ5Db v1©†\Øm!í¦‘ˆVq%Ý[Š(mh 'ŠÊ@Vǧ 3gžß~˜9œéº€Ï—3×ýv]óœs®óˆˆÈòÀU 49494ÊCKŒx¤5ÒºîŸ~Ü¢AÈþý#' º9ºàå_þØ7f`=¯×÷‹óƒùô¸,#ÑÑ’Àuðæ¦77EþÖ?¸ æËæËs^(ý¢ô €®ö®vþ ÓßLðSöOÙ``=¯×ëýú¼àùR÷?ü"ÖÖ2áá"°êµU¯­ý‹¿àþZØ÷ú¾×~4ýhR¡ =,XT6àĉ¾ža=¨×ûõyú|Oç÷ëx%ë•,È+ÿ-ó?ü cŸÂ‘¤#I:Ÿç2ð>ïc¯ÓëЊ´"Ü nª›„Öóz½Þ¯ÏÓçë|:¿_q+""gr¡àiÁSPñž~ï˜'ξ›ž1Ïž€R¥þ vªà}äðN€ªRUªŠç–êS j¥™ããñho{.x.€wÑ?_ýñ@Â]à™\ãVþKDäÕÁì4;¿Q[¿­x€½ ¶©m¸è¦—^P *A%9ä¤ •TRldcP|~%u­Z‹+öB€/Àïöê‡kùJ]/ä½½Ù—v/itttW7.o\Žššš4ÆÛ*l¶ 8v.ì\Lܸ;q÷ù{¸úáꇫ¡ygóÖæ­pÁñQÄG¨Ï^úÄ÷‰F\S¥S¥¾48Øp°|Ã~=âÛ*"ò]5\i½Ò #7ì§í§Uq²+±%±wÖ¾¬Ü¬\X£­ÑÖhpuôêèÕQÈܹ;s7¤æ¥æ¥æÁú¾õ}ëû`æìÌÙ™³†°¾ì¾ì¾lØQ¸£pG!ä ä}™÷åÒä¾ðCWGW‡*†îÙîYðöøõˆ6¼¬qY£ê—Ûå†+æžØžX8ò×êôêtƒ sKæ–Ì-°¹tséæRØcÛcÛc3òéîtwºÚ*Û*Û*øbábáb¡;Vt$t$@Ág*Tm­}:~:¨Ê‰ÊQ¡¦ÔðšðR8ê*v‹äÏïuìuˆ£äiILIŒHÊý”û)÷EâjâjâjDŠb‹b‹bE´V­Uk•¥ÕÕÕ.âö¸=nËËËyvéÙ¥g—DNÞ9ùíÉoEýíPç¡Î¥2‡20‘ZÓiˆñ}n)³”©Nøyêç)øáô½¦{MðR\äxä8Ôí¯Ë¯Ë7þXOmOmO-lHÛ¶! o¼ýñvȨϨϨ‡k ×®5ÀLÓLÓL“ÑwÞrÞrÞ»~¿kÓ®MFÜ7øqozÙô2`1êFÔ Õªε͵ ß´ZE›ä]÷e÷:÷:Yìþ¾ûV÷-‘è²è²è2‘ùGóæ‰XOYOYO‰¬ìZÙµ²KÄ:o·Î‹d¤g¤g¤‹dFfFfFŠÌÌ̈ 8ð¿P~´ü(,xýoånÙ{í½0…=Ñžˆ²ÿÉ^l/†ó‚yÁ \ä"ÁQî(w”ƒ:®Ž«ã bTŒŠ'Çž{r Ôõ@=€Ùu³I³Iàú·Ë没ÀWå«zý|he5e5ºŸµ|%ºo>¢ûJÀg<*Y%/ùTRI%ø>‡ÏäN ªA5%”PôP{ø…_‚p…6¨ þÊÇ4›`ž6O?çcúàL.õÕÕ > 8ómÍ¢Y@}îõÎâáï|Í×(îÐO?¨A5 €ë\ç:ðP£jX ³~Ý$jµZ-kÛ´mKªûñ¾azÃôÿœÿÅýV¾°§‹ö<öbž`ÿ VÍœh¯ª¹IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-49.png 644 233 144 2351 13755454065 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜžIDATHÇÍ–_HÔYǯŽã8 µÛ5 -‘P‘æÃ’5iö_$ j)'[†dׇ¶Èj-X'X(\6{(’þ¸/…Äô‡ðÁݶ¥(Ä5uÅ×Áßïw>û0sç÷kYw÷Ñû2œsÏ=ŸïïÞ{Î\J)¥>Hþ*H÷¥ûÒç$ìôC¶?«<«üãö„6!mgÚÎ_¿„¹¡¹!€y—ç]¶^ضž×ñÎõJÙù<íW(Ûá¹æ¹–æOÚPµ²jeÖ‡ û›x;¼pøæá›7Ún´ñ >| 0î÷ƒmëy¯×ë|Îüªño|¥ÀÝéîL{žLO¦R¿)Ó’`" w Tn­Ü ðÖõÖ%é`ŽÙd‹ˆEQ‡­ç“ñz½Î§ókžæ'ô(ÈÝ»A)ØQ½£Ú{)±àÅа¨a‘æMwg8C6Q# `Ö˜5ÄA" 4°m=¯ãõzOç×<ÍOèQïŸmSìÉÚ“•ô̇æCàwk·µ›éä„Èç” XYó­ù©Ãzg [Ã`ŒCÆÈ!¹ °Î[ç™fʼkÞuæ×<ÍWNAß‚wÐ;Í€Wæ+3Å© nUYUL¥<%S ²WöÊ^[ŒÈˆŒ'9ÉIÛOëX, Œ2ë¬u–)þLæOñ4?¡'),ü''Rß]ˆƄ͕ï$$!›÷ºýuûëvè tº¶ÿièièišW5¯j^}=}=}=ŽøIÞÉ;ÄqÄ ^ŠŸÐ“Öó\¸š"Ÿ2e†Í0q¾'L$,a ÛÿÈ?[\[\[\ÐßÝßÝß ‹Ç/‡’#%GJŽÀ²£ËŽ.; ---§¥ÆRâ)^ŠŸÐ£`Îý9÷å ;Ž`LîÈ0'ͨiWMÁ¦`Sо™µýµýµýÐVßVßVk®Y¸f¡_4Z4Z4 -å-å-å¶ßôÃãà¥ø =éJ¹*]•,WÊ}Ë}Ké1&ŸHÔ(åÊvå¸r”êìëìëìSêÊË+/¯¼TêxÎñœã9Jõf÷f÷f+å_í_í_­T¬ V+Pj›g›g›G©çÏ+žW(•±1ccÆFeZ®–Û<›ŸÔ3ÓŽ™•F®‘kÛçªÏUŸ«ï¤wÒ; ¾Z_­¯ÜwÀ€º±º±º18Xt°è`´¶¶B^q^q^1Ü[{oí½µŽê]`¼1Þ̼c3ß±ŸÍz³^߈mŽmŽmòÉ'ššš ôzéõÒëD#Ñ”(=Pz|+|+|+ !Øl:ø¿ð„'À%s½¹þ_ïØ Uù^Õ üHvþ¸/î‹û`B&dBþgñgñg0¼kx×ð.˜Ä$æö[2ß{U?cUþC3tŸ±ŽYǘâknsä‘tI°ílwTY«´J+È>Ù'ûþ|É“< Ž‹\°NY§˜J¶êÿêcÿ£óO[û­ývççt²‘zÈ$Ó±#_ÑH#Èy €n&™DÀ ZA¦1͈q柱óÏÚÿÊYûº˜µï±Ùù‚ý q`` ™‚IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-43-grey.png 644 233 144 6126 13755454064 16002 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—PW¶Ç¿÷v3?qÀ!2™‘ÆÔ&Dˆš(yÖ0Ù"PT \Ñ2&Z’h`!¿ŒqC‚‘Áª§Aq•…"J t]D”`¦ø9 Á'qD0À3=}ßLCÊ­TÎ?]}ûÞs>}ηï=Mrsssss¡Å¬Î^h,ßÇ÷ñ}¬>÷›Üor¿aäßÏ¿Ÿã æË|™ïg„! ê͙ڙڙZvå(G9ÉA(B   ]èð&ÞÄ›ì€îçßàßàßà~gC׆® ]Ôf3‡™É‹òyŽ<¼‡÷ðTpÀ€t¤#À£xÂ188ˆÍMæ&ss] ½z1T|gøùá營OùB¥SéTºµ w†;ñ¾ˆe²L–Ù—J@@@Ÿ!û§÷OïŸЄ&4.àkùZ¾¶éÎ)ç”sêñý:ý:ý:!ÆmÈ6dó§´v­]k‡ ± !°`Ì‚Á£Ýèà ox˜À&„ !é!=¤†0„!ð£šQͨÖ³GÎ9{DHµ^±^±^á¯Ë”2¥Lùó!QHŸMƳxÏÞ§Êe‹²ðzÄë¯G>ù·ã‚ã‚ãÂã zƒÞ 7/f¦e¦e¦ñ×µ*­J«ÂB±Yl›d#Ùà± «° j¢&j€ô“~Òa2L†a„·ˆ[Ä-àÝáîpw8àcõ±úX±Pò¯ß¢ß¢ß"¼(Å—x$>*LÂÄæUÎg³&-Òßàoð7° C¥¡ÒPÉK±³el[ ¦Ñ4@%*Q ’BRÜÁÜÁ¼QPP€L 2Уô(= p?q?q?¬„•°h$ÿ†Cƒ¡?å¿Å‹ÿ$ñH|”…²Pú·—]q®8Wßßߊ ÚãÚãÚã‰&Ñ$š !WÉUr`ffff@*µÕd5YMÀБ¡#CG~*B„ ö ö ö·ünùÝòz®ö\í¹ àu¼Ž×ÏâY<4Ú/µ_j¿„,þvüíøÛØ ñH|T‚„ ÿ~ËwÈwÈwÂãÂãÂãH©'œŒþL¦?l9[Ζ$Œ„‘0 Ï§Ï§Ï(*)*)*ºßï~¿ûýyζËm—Û._]ÿêúW×ïèwô; O8žp<0*Œ £ —Éeryn™,\. —‘R‰GâÞ±=c{ÆÄ§ÖžZ{j-“lR|[|[|›1¦` ¦˜g#Å#Å#ÅŒ}^üyñçÅŒ½ônлAŒÝ0Þ0Þ0ÎÏ+\Z¸´p)cg Μ)˜7W˜+ÌŒíß¿7ž±áMÛ†7±‡mRâ‘ø(>ÆÇø˜„R#5RãÜ›ÉY*Ke©àÌgêDì‰Ø±€6I›¤M´-Úm ಺¬.ëü¼K‚%Á¬›^7½nè¼Öy­óÐzºõtëi@— KÐ%Þ1Þ1Þ1úЇ¾ùøô5ú} ÀQÅQJ¹.€ `Uö5ö5ö5貄,! ©"U¤ LÚnÎ'O:Ÿ,h_о HÍJÍJÍNààí¼·Ïƒ†z…z…z v/ؽ`7Ð\×\×\tttr½\/×ÔFmÔ@t`žåÜdëdëd+z©žê©žUQÅAÅAÅA¡°wIï’Þ%¬ªm¼m¼m ÉArSãÖqë¸0Q5QÀžlO¶'Õ]Õ]Õ]Ka),0U™ªLUÀ5?ÔüP´sí\;8,‹Ã¤’þIú'Àëë+б©cSÇ& íDÛ‰¶sï7eI¶$[’Ë€eÀ2€Ï½Š^E¯PHa€†¼r>—ÏåsINczczcº[?Ö6Ö6Ö•2Z­Œ†}cïÆÞ½@°6X¬TUUº’®¤+Í%Í%Í%@¡‰ÐD•ŕŕŀ)Ìf ›ÏôøËã/¿ p\ר¶«¶«¶cÆóXõ­ï·¾ßúŠ1ÄB,Ä‚â&nâ>&#%O–Ô|¨ùX–²,eY ·oݾuûþ\¡©ÐThð­J£Ò¨4ÓÏ3ŽqŒ‹ú3–c9–wdQZNËi9×BÑCôÐÀÑ"ZDK†Sõ½ê{Õ÷@“““?{Ò¼Û¼Û¼§ùüF~#¦°+±X![![!XtbѼÖøÃX|oñ½Å÷€HïHïHï9@»ý#ûGö :ß|¾ù|³ —Êey@ûDM¢ItG QˆB>ÐÓæ¹WÏöüßH)"EÿÚFãi<§™ÈD&ýºu¨ƒ°uôÀèÑP‘›ä&¹ »˜*¦Š©ÂŽð߀ö£ý«gõ¬ýEÑN‹š Æ Æ F÷®‘‘‘þ°Ü[î-÷>]RRRøÅ%ä!yäèAz„õR?ªžu,´c'vb'©]Q½¢zEuáŸo)ÞR¼uº`ÄoÄoÄ=ësÖç¬{—Ä’X‹©ùÀ¦0õ›.*È£éEzòk–k–köÜ õ õ 5W¨Vª•jåÝi§Ñit÷|ڞממ0 ³0 |¤í[ux®FÑ[ô½áÓöKÛ/m¿ÎÎÎ{>Uûª}Õ¾}Æ®º®º®:®°þ•úWê_aÏ‘mdÙ¹X!Vˆ`PB %ÀÆØˆ@"`êåå§"""ࣶ©mj ®׈kö|:+½»Ó)žÅa›¥€H•òü’È=·žq…h@Ü»H ‰!1Ïýiö—ãÒ?][][][Åí)bŠ˜"ÒØ°Ca‡Â!Qì;ÅN¨èrºœ.ÇŒ#ä9»ClѶh[4×­ˆPD(" ×Î~4ï\KÅR±”?ì©ì©b°K…g`NCíîòh÷°G»5ÿ¡]W«Î%l---ƒŠRJ)Ř”‰Æ©Æ©Æ)Ñq·ônéÝR®[±O±O±¯ýüÌÀÌÀÌÀ¾/º_è~¡ûIÓ‚^ÚO%Àù®ñ!{h‚ÊãàªG»ÿü파ð£grÏäžÉuïòtô>f?³ŸÙÇ›ZšZšZHªªSÕ©êD½¨õÛMü«ü«ü«SO­Z´šþê‰÷?Ò õ0‡ß±¸¸¸¸¸8ž[3“1“‘¿Úž°=a{ÿë^ê^ê^Ú,ȃäAò ¤¯×®\ïW=Ú1Ú1ÚÁþ>{4ºŸ™pM¸&\ÜN¯X¯X¯ØwY+ce•ç!‡rΊ_ñ+~•*àI”ð0ÁØïh7õ¨G½;Õ²ZV×CÏÑsôÜå é—¦_š~I|«ԫԫ”vp™\&—yñJð¹àsÁç6ÆYz,=–ò¸X\,.fÇ<~ë<€Žßã ø{H»ží‡m؆mü-’FÒHÚ¿ƒg÷˽éÊÇ”)£\?×Ïõ<&~&~&~¶õ—ÎäÎäÎd`ARc9õGÿ÷o_Ø7çIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-195.png 644 233 144 2710 13755454065 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü}IDATHÇÍ–ÿKÔwÇßê­ëò݅AèÍc«¨éÕü¡… B…‰š-\;†¤×bË Šú²@¶0al±/L\„Èr´Ò!S,]²jj9Ý`(´:]iÝyYœz[K?_Þýp÷ösnÿ@ï_>¼¾=ŸÏ{¿Þï×½!„pÅ¿’ŸM~6yeÌNÞoû—-/Z{1fŸ5!鵤×n¾ÏÔ?Sà>ç>gýnÛ*®òë…°ñù”_¸„íp¶:[“ âö)xcÓ›–¯ŽÙŸô‚Ö®µÿm@UGU@Û×m_sBý¡~€HA¤l[ÅU¾ªWx‰øâÔø…€§ºžêJº ÎeÎeB€·Ð[øü¡XÂÏîÒ]¥wSî¦Èd0§¬@”(j=H°U<ž¯êžÂW|Š?¦G@Z~Z¾PV^V®}+øý8æ9æQ|z;ð!²Œ¨0+Ì æAöÊ^’HÛVq•¯êžÂW|Š?¦G,íí§¯ ýËüË@¿æ¤9 ÖÓú!ýº”sr©$[SVÈ q߸oÜyL•G¦™ó=³ÕlEšÙ þ?ºù¦^¬Å ÿuýu˜‰óÛ­BˆuÚ¤6uÀ¨kÔt°ÃìÕ½º—G´1ÂÈbËsrNÎ'9ÉIÛO %”€4¥)Í¿ŽŽ Ÿ“Ïñ(îÝ#7FnhQ-u(=qagûàÝÞýˆX9²V?®·u4ú_m|†K†K†Kl¾¡î¡î¡n¨««ƒÛ¾Û¾Û> L˜0´n;ÜvÎì:St¦î5ÜC>ü-<XÜ÷2Þix§Aµöl_\دG9Ôh,êxËøx>k>‹ù=ƒ{®í¹f7¼Çì1{L˜8=qzâ4d®Ë\—¹¶Õl«ÙV>ͧù4¸™w3ïfdôgôgôÃΩS;§ ðK 'Ð㟌nÝļâ“G.¾}ñm%ì×£Vþ¸òGÙÊ—Áà€½ YçÏAË -[6‚'Ë“åÉ‚Áà`p0çËÏ—Ÿ/‡ÜÞÜÞÜ^»n{÷öîíÝP©Uj•¬ñ¬ñ¬ñ@Ñ¥¢KE— é~ÓTÓTB‹_ŒZA ”îTwªu Ü{pø>víe³õ…õ…]ŸÛ‘Û‘Û]Ã]Ã]Ã0³ofßÌ>Øœ·9osÅF±«\«\«\¨T*à„ë„ë„ .//Áëóú¼>øöHKeK¥=fÌßÂ?„¥Ç!„uÙºœtK˜F©Q*²D’Ã"M¼$ÜÂ-—Þ¤7éMB8ÆcŽ1!"3‘™ÈŒkSÖ¦¬M¢°¯°¯°Oˆñ²ñ²ñ2!Ò¶¦mMÛ*DêúÔõ©ë…¨H¯H¯H¢~²~¢~BˆˆqFœ‹ðiâœþP(„ø,®gñŒÑ<Û< |ë9«ŒN£SÈß¿!\i¼Òx¥¬qk܇‚ª‚ª‚*ð¸=nª3«3«3!”J¥Ã–Î-[:ÁUëªuÕB ÂðOË_ÅÛgŒ—›³›³—œ±ÿÜÊ…ø-™4n·ì[9ûùìG³ÁBõBõBµÝâù;ówæï@xwxwx7È«òª¼š0%®ë×õë0½~:s:¬z«ÝjG‚Yj–cq>Å¿ôVn¬-¤…¢1Gìù³¬€àYºV³šÕ Kd‰Lr¯Ü+÷‚Ì‘92äA¹_îOˆ¯3jZ‘¡ðG³G³´?µ?ÿ7Ç&?~§ß X‹“Èœæó:gé¡Çžüœ¢†r@?ÑOÂ8Íe.#å5ÓkzÑi6˜÷ó¦ßáw¨Z2ùŸØÿÊ'öuñľǞÌì¿ù–8á–ŸLIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-66.png 644 233 144 2421 13755454065 14673 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÆIDATHÇÍ–HUgÇŸ«Ó{۵\Fý†i-ˆþ ½²I‚FŒÕMÔˆ "°?’BLÅF£˜”2A1IˆþJ»wýpÛ G ·‹µ@Lgäuº›ç¼ïgÜ{î9¹íOï?—ïû<Ï÷û=Ï{Þç¼""òqì_ aMš„´(NøÚ^÷ìöìþìû(¾j‚«ØU‹ßÒ³ô£~äýmøJ<%ž¸¡‡„Í»æ]ÕªZ™×Gu£nD¿ƒÆ ¨_ÕŠw }X—é20~6žO@ý¦Su*ÔEu‘y"æ=ó cüq=K_œ†²›!e,e,ü ›Ã&0À— U#³|ÂNv‚~©Gôˆm?~ü wèzàÁƒÇo¤–Z ‹bŠ!fp–?-þ˜^\?ê'fìêà;ï;o±©ïÜï½w†°'QÆ/Ž—â¥x‰ûWäAb\K\K\˲QQéj$sÉ\2ÓZ"‘ˆÌ¢}ZËâÙ|–å®Ç/ŽæÑóm#ÛÈ6Þ=>q¦Ø"¶ˆ-Ž!n;·Û®‚“=Éžd.®¾·úÞê{ÀÚÞµ½k{¢Ü¢Ü¢\Ígã,žÍgùX~Vïù<„_íOûœÂ?៸ç²¥–¦–¦–*Go½uôë}ì}ì} @€>Œb£Üpà ¨~dœÅ³ù,Ë]oÚçÏç#¦—ø>¾ïs_b roäÞȽ!ÿ±'Øì ¢£4ƒf@Vª”*¥ Pæ)ó”y€bQ,ŠEçGÆY<›Ïò±ü*pT}ÓK*çàœƒqŸ¸OÜ×ô=›`®5ךke‹ VIh¼rS°1ØP·¥O?7³&³^O=Š¿-þÖìZ³ ¾óç×Ç_Ì¿˜ÎÍÎÍpþãó@áÍ›ýIö'žŒN(»q ×´úEYEYEYê¹}Žu´$§.§.§žq¾Aß €3႞±ž±¼F§Ñ ãÎŽ; Ö7¬o@öŠìP›P ?UüT¡6 ›ÀÜiî.ƒËà76Ðõ´åi @3#õ"–›”›”›„ŒðÞÂ[‚ýìª;¾íØÕcWuètÀ”Ž)ü;úwôëA<<€oá[`÷þnhµµÚ û~÷}½ û†ú†´¥WN;xì VïÚ+íWÚÕNná2¹L.3ØO„ùÂ|aþ®¶ËÒ¦¦MH› LsY»}Ý>5—æ¿uø­ÃeͲêß½}Bûý¦i²6Y`råäJØ*mÕkÚ×™Þ™àO,þ›_¾ù~VjήYÜ,.¤^ÂDa¢0ñÈI,H,H, D¼.^¯7÷©~QþÊü•J9˲ß-¼[?¤—G_àc…ØçúŽõúNôu’nÜËMç¦ û¡#¶×l¯ø¥ïÆ{7B>p“°IØt§8ì'°]Ï,õ C¦!Óé>Æ&Ø«*ÖV¬¥ùêÊ%ý,þ,‚'” oÛ™¶3 »d €€Ž×çÈ#p|ûñí€b»š}5[ëïÉ'ŽFGc¸¿„| _Ã×<[ÆMâ&q“þp4PèT¯ÔõÜznýÒ®™kæš™VB–Ú¤<)l}Jyhvh¶ˆ–Ñ2À",@©•Z]èh>ÝD7iRêkî=Ô{Hc²˜,r™ÚÉO…r¡ÜnVÑ,ÄB,¢IcÍ#y$Oü”8ˆƒ8„~¡¿â‚zµ6˜ªLU²ÑµÓ•íÒ:â¥ùA_0,°¯ð•N»>xà …Þ ½ ÐâàÁ¡`ë:ÖÍX7C)Wo QqP”ö¦lMÙš²•ÞÌ›y3w:Bgc˜ã"ŸÅÂáð€kMß‘¾#}!†RC©¡TÚ«j7ÏœgÎÓk7dÙᇹӇ1Œa­ÑÊ e†2CÛzu êÔ- ùê]n4 ƾg‘_Kc¢Wš»³ô„‹qoFû¦1aíºNkÚµWÙ«tÚ5ÊFÙ¨………iZt ' %8œ NºZÕd"ŸÈ'¾½'FŠ_ÄðÅ“ç?êb´»ú7´Û&µiÚ•Ûä6¹MSîÓ”§)OS€ÙžÙžÙå÷ªO §„S‡2©E¤ ø;òÓXM»€N»LLd£«ÙÕìjà‡~x©½ÕÞjoÕŽ±Alœ‘¿$ ‹©yNƾ0ÖØ„·#Ú=ÿŸ´»då’•Ktç®´PZ(-ĉð8UW‚+áJ¸’¥»¢ËðÃ1u9ò_Ú‹´»X¨j„÷<\R]R]RMf2ùêR€=•4‘&ÒD"ÇŽàŠ©OþG‹ÕîÞhÉ}n·Ûåd9YšÅOæ'ó“Žp„#½™æKó¥ùÚ…v¡»™X³rÿ73ªß H)¿Þiã)Oy p—¹ËÜåN ?Ÿ.ŬLOLÞ.õ¿€ÓÏ=<IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-112.png 644 233 144 2553 13755454065 14751 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü IDATHÇÍ–_LSwÇOùßQ”G¢)²°h¤£&f OÔ̘h$ 8˜qC'N£Æçƒã¿mÊ\ô`4"& âÔ˜X(©Ó 1X‚±ògbXÛÛ{ïgíåvömOž—æüû~¿íÉ9ý ˆˆHfôS !;!;aVÄOøÚŒ§­I[ó镈^ËFËÆ?¿ƒÙggŸ°_°_ÐúLßÈõ±ý"&~,Ÿ—L1©M©MWÔ? %ù%ùiGüS^°^·^†Š–Š€æ‹ÍùFŒ<w»Àô¼Qoôx±ørø=~H¾•|Ëò RSRSD guÎêܪHÁ_¹P´®hÀ‹Ä‰z¨c€ ›î0ìUŒoä£õF¿gà|DÀܹ…"°aó†ÍÖºHCßeØçØç0ø”ëÀQŽbƒp Pݪ› è^Ý € ˜¾‘7ê~ÏÀ7ø þˆùïlø½8¥8(>Pýª4›²KÙ…¢?ѧô)tÞ3ͦÙ4è3BгôUú*ôp_hIh ŠÖ¥ô)}3_؇²IÙ¤Z”ߥˆÈâÂV¿ÕH‚ÌL  €µªWÉQr˜¢g<‹QrƒÜÕ«zU/ÐL3Í1‚FõQ}ø7Ú mSú?|X0°˜²ZI†ž¨°óPy¨ò0 -Ó¿Wö+ûMžÚŠÚòÚrxºðé§ ‰³ÚíµÛk·C÷@÷@÷€ïÛÚ·µo+œþäô¼Óó kEWQW‘ù‹ëÃ>•»+w£=ßÖµ—ª†²†²™òmáãAgÐIpË£-ž-sàw§ïNß6‰K—/=næ;.w\î¸ þ ÿ„æß›oþ=pqqìo³+²+àwG§§ÓCÐàÓZê/Õ_2„uí˜Õ>«]oâ—á‡ÃMÂóÝëw¯ájÞÕÅWCÎÁœƒ9á¶ó¶ó¶Ó¬«ÏªÏªÏÇ„cÂ1¾;¾;¾;ài÷´{Úa{{OÌ(½ÎgüÜ]s®æœW7ø«ýÕ`è°gØ3´^x5ôjø-²özƒvF;c6”””Cs[s[s[ü( Üî7\Ûymçµf¼·°·°·–Ö,­YZ®*W•« ¦~|{àí˜3óÑØøØ8zD´›ÚMK¯¨áuáu"b‘¹²Rìb—SìŠ]±‹H»´K»ÄYp48IÏKÏKϪªªYÞ²¼ey‹HI]I]IHëæÖÒÖR‘´®´Æ´FñGùúÕ<5OÄГ p\ÝHR‡·Ã+"Ó""|eùLŸ£Ï‘Aœ1˜1˜1(’œ”œ”œ/,½4½4½TÄ–oË·å‹<ž~<ýxZDÉT2•L‘Ö²Ö²Ö2ǘã¹ã¹È¯_4®l\)!YáÓþ¾åþ‘=q[Šn‰?Üî5·rò§Éc“Ç ä yBžøQN®Ÿ\?¹”'Êå „¶…¶…¶ÁË“/O¾< ÉCê û†O Ÿ@g ¼ ¼™¹‚Ëh¬\T¹(n+×€uÄ:H‚~µ_á[ Z™VÆTŒ† ±KÿÏô\=wo-ôûú}Ö€5wÇb.?ũũ€ÑËß­v©êu µøðÅ_~I$h‰^ÎpŠS 7è=zºþHµ«v½)<޸ʼnʼnÀ»¸ËÿÁþW~°¯‹ö=öa¾`ÿ¤ÐØ>x mIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-15.3.png 644 233 144 2767 13755454066 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܬIDATHÇÍ–íO“÷ÇEta<8NÌ’±.èÔîP²‰ñ,&P’†…¹ÌE4z¢/”—牉;̩و܃“¡+nêbmjª¤YÌâXç6M+¶šÐöîõÙ‹ö¦Lÿ¯7w®§ï÷ú=\×ýS ”R*;ñU’—’—’×Sþ´§W¦W.:×h`xÓðæµ÷!듬OrºrºbÃI]÷ëñsó•JâÏåÓí*[% i½i½†ò„þ¼½âíéÿˆëmçÁh7Ú§£Ðt²é$À7G¾9ÂàÏ‹^xPþ ’ºî×ãõ|o.¾úà~¥`þéù§ ¿BÚSiO)¦7LoäoŠÜÎkµàyÌ“м@R ¢‹oŽ®ûñz¾Ž§ãë|:¼¹e¹eJAm}m½±3ž0ü´<ßò¼Î±»ØEDƒÑ €Ö 50r^Î`ÀI]÷ëñz¾Ž§ãë|:¼žäQÆ”Rê£ ´ºh]t¶ gÌy!òȨV¤I8DkÑ6k›A+Ô ´ÐÖië´u€…jªyT$v7Š„ˆD<ydQê¼u^ÀŸàŸ=Ê1¥”Z¶Œwwƒ©œºõâ­Aû ßÇÌ13¡YŠ»Üâð‡<äq šD%*Qàìb€”I!¾Kà7»n'€1h S‰×“رðÛšlM ïÄŠtàŽùÏv<‹\m¿ºÿêþ$á‰ñã'Æ¡ÝÚnm·Â!×!×!Ü¿tÿÒýK×{åÞ•{WîÁží)ÜSˆ¸=ÃG†èÞX‘ü؜ޜ®í )ê5¥”Zù­Ê.-U*¦”RÊPÜp±ÞVoSá¦hÓdÓ¤2x»¼Ÿ{?WJ6ÈÙ Tó`ó`ó RŽ\G®#W)§Áip”ò7øü jV\e®2W™R¥öR{©])g½óç;ÊP1Y1R1¢Â£þþ†bCy•V¥)%}‰zø¦%Ó"½0qlℱ‚pì壣ȫɳäYàÜösÛÏm‡aÓ°i؆BC¡¡j6ÕlªÙÝÓÝÓÝÓï”ã¶ã¶ã6´Ö¶Ö¶Ö™é3Sg¦àŸöWZ^i+#Ö+€À?±þŒÖŒVéUóLÎ3±|ïëðu€|9Ûö”Œ•Œ•Œã¦ã¦ã&\_{}íõµ°¾}}ûúvè9Üs¸ç0˜–›–›–CÏ–ž-=[æÜ±6i“6ììì€ê5Õkª×À²×—.Yº®Ýs[ÝV|0Ý6ݱk™¿eþ»¡ˆfdH/gÇ}ã>÷ßW\¬Ì˜þ‰þ‰þ ÊÊʃ­ž­ž­žd\‰”H‰ÀÞœ½9{s’öÝ»3vg@å¾Ê}•û’ö%›_zõ¥WáÐÒns· l [ ª==øô ô&.ÿå­œü곯>²d}"¦ôbé@éœÝvvÛÙm0Õ7Õ7Õf¿ÙoöCVWVWV4Î4Î4ÎÀ××ÃmÈ6dƒÕ«V¯Z½ l\ðî‚w¡.ZÛYÛÉL Uçë]Ù»ä‹x=É®ŒØÞ³½ü®w¥Ö¯õCàãÀׯ‘ð‡ááÉGFF‚7Ý›îMÉ—|ÉY( e!ø}¾Fãr\ŽC¤ R)ϸç†ç¢†? šìJ†m&›)Ù•‰Â–í£Çè ¦‚{Ê=5Ëoa:ÖëLN&¹$äH•TIÕœ»´XËb ›l²çØOË)9Ò%}Ò V±’Ô8¾Ü—Ý—Œc ˜Ê›cJ!‰É+oÍ{kÞì¾8I‹ŽEÇ€ZH %'?»ÙÉNAÀŽ;ð€I&A®Ë/òËl ÿÕ~Ö~&"gxúäOðÍ<:ùŸÜåûºxbßcOæ ö/²÷MÍ™µQIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-52-red.png 644 233 144 4323 13755454064 15603 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷܈IDATXí—{LÔWÇÏýý~襲bV‘@}A°TQšu@gÐ.¥­O •jlÖÆ[³Qª¢¢’´ Õ®¯PœÁGŒk|V­ÔÄZk" (€#Ãüßýcæþæ7“¬f³{ÿsî½ç|~÷|ï¹"ÿø… aªÙivšìeÀq,âXıœÉ’")’òëßiM  €Z«$‰$’¸ „ÚZ%_Ï÷óx<~h>aj(‘¯˜Š©Xp„ÎÇŒ‘ŽIǤcŽN¶š­f«u¨èîèîènœÊ»›w7ï.0ÿÑüGóó¬ó¬ó¬A›Ïóõ|?Çãó|¯ç!áO¡vâ7BÐ#ô´Là'WWW¤”ì¾¼ûòîËÚ w‡»ÃÝ@„ô¢½ZЂ@·ó|=ßÏãñø¡ù¿y=YÞÚ„6¡­å4`m°6Xä);f_³Í -UKÕR!+ë”uÊ:@IWÒ•t@ÉUr•\ƒ˜çëù~Ç×Cò[ÞÖјƒ9˜ƒHÚ(m”6ÖÞäl•¶r[¹œ«ƒ}¡f¨p˵}u}u€Ö"§Ëéú•÷”÷@Y¦, âk|àèWŸªO­Å×êkäZïï@ûBíP;àæËl•¶õ¶õr.ÏÏy8™ššþy"_`©°TX*´$×s×s×st⸕­J¹RnpÃLðÀc4µB­°[°µP¶Ê;äÁh®ç-‰-‰è²TX¾²|¥%qÎ' Š JÝJíºv]»nÉÚ¿9~s<5Í,œY8³ÍVœþ[)­x|ûñm"ê?Y|²˜ˆÞºS|§˜ˆ¨ñ~ã}"¢ßŸýþŒˆhÔÇ£>&"Џq…ˆèÎçw>'"ó‰¸qDÔßÖÔÖD$d'¦&¦)Nq¦8“ÌC§ ¹7äiæ}æÌ?нӷNß:}‹Íñó½ó< ­=:%:%:•999 ¹57dÄóo>|îð9Àï@Ú%í2Ú  Ð9±s"4|Úð)°d– Ñ;£w¦ÃÜï·¾ß Þíu{õ“•;s:2;2ÎÃù8è–¹Ûæn›»-XF¥¹bÿDíÜUu°ê d<ÍxRâ•ÚJË‹þ©=S{ÀjµZþû ï/4|`û÷ß7J³q <œ‡ó +5Æd7ÙMvýŽ™i9òGDä®+7¯Ü$"ºÝs»‡ˆhÊOS~""Êü$ó"¢3Yg²ŒdÚgÓ>#"*¹PrÁèWªG æó)ó)":Ò~̦zS½©^¿ò¼¿j“«'WO®Æƒ>öªëU€ÃÊEå"4,ã¥_”¼(ÆÛÇÛ`ÿ–ý[à#ÏG£ntßè6Ž÷ï/°£aG˜Ì ¼Yƒ²øµ¯²¯ÐÒüåỬC¬C¬Cð€ó‘+ä ¹¾gGåÞâ½³öÎ2H`€o¬o,.ù‡þ´ÖX[ËQ®µÍ7šoµ+–®á hàQJ”Nù¼|ÐÊIr¼²‘ ä_[½(ZY£¿í½’Kr97 _5|ÕðUD‚M° 6v(@·„c¾ø»P| >°IeIeIeD¦"S‘©È¹A×n–-Ë–eÔ®Zª– 'œpxxQŸ¨O‚m§ Mhœ›6 lÒòtMF ‘Bäâ¿…IñÛ0>3½Þ!V´[È §ç±:VÇêŒÚužwžjW>ï/5Wî«á¯†¿Œïß=¾[yG×b½X/ÖïÌäR H/p0½aðAí¶‹ííVYª,Ur”«ÎUçªà…^èoSé‰Ò¥'‚mGª‘j¤š¦ÀO’ÿ ËðÓ 7†¾aq@»Çÿ“v³ggÏΞÔ®3Ó™éÌÄÿ¼¦W‚°V0½<4ð",/£ÿr¼I»SÅMâ&qSK:.¨(¨(¨Ð¶§ö§ö§öË·ôR·‹íb{iÕR-ÕR íˆ®°|fúG¸v7„ÚÙ÷ÙR¶”-hÍ êX!VˆbFŒ]ø9Þï‰÷‰WÅ«âUv.°qaXåþo#JÿÏNv²K7C§×.4A4€egÙÙôû“a•i‹ûÆRÿ¦M,PßQVIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-43-red.png 644 233 144 4122 13755454064 15600 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXíWLÔ羿 ttÍåpZ:!#2Ó Ø;Lvšj Î(¦\]Él"=S5J$¬*bÔÒ^Ô¦¥x‡³^&É –­þh²àŠM†ÒÆŽk-‡œœì΃ï÷ÞÏþàÞï}ïb5Ëöüs÷¼Ï¯Ï=Ïçyßь̢W'¸\ .áß‘ƒägÜϸŸq—Èš¬ÉÚ­Ó´Œ–Ñ2`ÆÌI&™d®±:käþ<žçãùc뉫cññUQU‰ÎXûœÅ²[vËnç¸P-T Õ:”´‰´‰´ üyãÝw7Þ6oÞ< ”––Funçþ<žçãùy½'ã!ñ×±úÂâCñ¡øppïP†-ÖaÓÞpÜpÜpÜ`Ïúïûïûï AB“˜Ä$€A bÐõˆûóxžç­·ðÄ“ñ‘é9qDG/ó…× ¯^S50=0=0D„å²\– U«Óê´:@[®-×–šU³jVƒ±sÏóñü:à˜ú¦çth‚Sp N"ù|H>Ôú%07šͪUö&ÛÃöÀ¯¶ª¨lÀ”ö­ö-°bV ŒX™ þ`ƒÓ_M¨­¡šP ÀÞd,~îfn4×›ëU+¯Ïñp|¤ )CÊÐoVpS½©ÞTϲ’  :U‡ê0Ô…Ýa·P—§Ë_·~Ýú8À·GoÀé §7]Þyy'¨=j :µ&­Iwðúzgcðó¦å¤å¤å q¼d¼d¼DT‘‰uXÀ¯m׶ǼÕu ˜¹àø Ç_0Ú[óZóŒöYYƒîßäÛäó«Ôñ’û½÷{އãã@ÿ°áð†Ã¢# hšWóð²Ùl¶1—çÏ+° |A¹ÈûÒû’Ñ/ß‘ï[¢-Ñx~ÁwÁgˆó~SùM%  Äp<ŸY©ÅŠE±(}ǨWp…ˆ~&Œ £Æ›¡ôõÒ׉ˆÝ\t“ˆ(±#±ƒˆ(x=xÝè·ß²ßBD´·joÑ¥ÚKµDDgoŸ½MD´¢vE-%ÎíœÛIDÒgôY´¾Ò®´+íúÊóû••444£ÿ‘ Žø£Ð`ø§{¥­ÒÅï¿ ^×â°8 -ù-ùãèĉ…`î1÷€+ä™™¸tÝË›Ù@U˜Z˜Z˜Š~ŽD«h­Ó‘ž±Æ³UgRϤ(ø]ïw½¸ q€P¶?ÛÖë€qôóýóýpêÜ©spA¹ @¿Ò¯Y82>2ÓΟ9zæh´Þ_\é¾Ò­¿€;…´çµçø?ÿdú ú CÑPoSoœ­>[ h埮øtE´¿ç:O;OÏô—ıáQ‰0W˜+Ìý¥# Ô£ï×va»°ý¥¡MhÚ8W»\]®.WW´ŸZVí7€¦0eÐËa9€;¸°5¬‚UèVÿHÛpÓp™h²š¬j¥ÞÉRTc7ëЬd%«lŠb-¢"*’“œä$’¼’Wò¾qIZ[L'M'ÕÏ^Ï~ÏþhA¶fúóéÏ€me[ {Àø€+ürøe€m™¾3}!¸íæ¶ìmÙZþMÊcò˜ë`úîôÝ黉D³hÍÂùºró'‘Ï-R¿Ô/õ Y{²ödí!RlŠM±¹êÜ-2™‹ŒÜ ÛÃv„à‚ .>øà‹6VËÖ²µìèµÓ¼²yeóJ¶FËS”%eäÑŒnJŒ´Ð7zâÔ뱺)QÉSò”<Ïywëìu)jJPø^ø^ø^”‹}èCàJêKêKêcuN&‹ÉbòÖýqT<‡/ž| 5ÇqwãÓ¸«v©]jW”¹Áô`z0X:±tbé„ö ‹íR»Ô~l§Z„zñJO‘¨OðcÜ=b:b:¢¦xÚ9I ‹ƒÅÀ <ÇÜñÜ¡ïxßaoܾݟÿƒÇÁ'²GðmêJ]©«°‘l![È¿\Öõcý.}k>k>k>ëëáÙèÙèÙÈïY~gùåw˜Ñ9º9º9:²Z’&I“¤Á‚ýØýà ,6c36˜†i˜ˈψψVëZu­ºV:Ú<£yFó aÏó•ÏW>_¹á+¹ŸÜOî·HÊoá·ð[–åÒDšHû60o“ƒ¯¾:ø @+ZÑêã"ªÕŠj[ËlV›Õfõ]¥ZªZªZÊ…ÄïŒß¿ST¢R)‡ Â$LÂ$pTC5TzЃÎp†3€a c€?üá=Ñ=8<Ã3<ƒÈèjt5ºâ^å‰Ê•'¸÷ZîµÜkµ9ÉœdN²ûõ\ ÃÅ,Y%X‚%_2²Y‡¬{‰½Ä^‡¯Xê-õ–zßUª8Uœ*Ž[˜˜˜ jSz*=•ž˜ÄWóÕ|5 Ä ±B,Dã 5¤†Ô¤Ÿô“~€<'ÏÉs-hAË„>?‡ŸÃÏÜîºÝu»‹IûªXU¬*–[íðïàqð1Ü07Ì G-°ÕØjl5 AžñžñžñT6þlüY‘£F†?ÁOðƒ+ÃÆ°1SÀ09CÎ3ุ`)–b)@ÚHi˜ÓÌiæ4ÀêX«èQz”…«Ã~|S|S|“¨Ä3Ö3Ö3–ª<>döeöeöµýï¾Ö}­ûZ)Õ®Ô®Ô®¶Ò11óq|GÇe j j ŠÒën×Ý®»QÚs­çZÏ5Jù¾…o¡ÿ%O7=Ýôt¥×^?zý(¥=ý=ý=ý”òfÞÌ›) ‹…Åãêfm¤6R)luð8øDœšSsê¿mu¯p¯p¯À‘ÀðÀðÀp’'x‚'à˜J¦’©~=ÿëù_Ï¥í¥í¥í€3ãÌ83€9ÒiŽf§ÍN›lX²aɆ%@¯¥×ÒkЦM/š8'âD‹Â¢°(€yªyªy*`½a½a½q ”J%$ÿÒ³KÏ.=Ãs¸9Üþ·­H1¥˜RL‘’E%‹JMìŒÿ˜ÿ˜ÿx"2_›¾6}m¢´"»"»"{b]÷ƒîÝ”¦Ä¥Ä¥ÄQj-²Y‹(ý~í÷k¿_KéÉ “A'ƒ&ôク÷âÞ J÷Vì­Ø[Aé£òGåÊÿ+fƒO„Oñ)>%3˜r¦œ)ß™„´“vÒ>>ÇêË«/¯¾ (©’*)Ð}µûj÷U ³¬³¬³ ð«ö«ö«¤NR'©à¿Ö­ÿZàòõË×/_:s;s;s½‹ÞEïhR4)šÀ=Ò=Ò=À:¬Ãº ÿÌûÌûÌû P€2ƒa½YoÖ›þsháС…¸Ëíåör{Á’ä9Š`#ЬѬѬ\v¹ìrÙhë´uÚ: ÇÐcè1ÒÒÒsÛè¶Ñm#` µ†ZCk}×ú®õ¿þø[ û@öìÀ)ß)ß)€ZhAí¯³æNs§¹w£bTôŸÈôÎôÎô¶ ¤ÎK—:Oø¬CסëÐM¤Àf±YlJ;êü©ó'J§Nœ:‘#ÓÓÓJÓ‚Ò‚Ò‚(ýåö/·¹Mé—õ_ÖYOiSbSbSâÿÓ2™‚(M½šz5õ*¥Ú0m˜6lŸ~—~—~¥û£öGí¢Û2¾Èø"ã Û€ñˆG|ÆiQ„(Bqø“¦®¦®¦.^¥.W—«ËÙ{nf7³›CeÆ2c™®‹;w.î¢hà 4üÀ43ÍL3à|Üù¸óq@Ü,n7/W¼\ñrÅD¤-“-“-“ñ>ñ>ñ>@rJrJr #öÇò æ æ f!„ô’^ÒË´‘0F¾5’S³OÍ>5hhh)þ·y›y›yÛû>šFM£¦‘ßdL2&Ùc7Ý8tãF*>©ø¤âHÄÙâlq6À+y%¯柘bþ îA܃¸À-ó-ó-3P–S–S– Fé(¥@Àù€óçA75mjÚÔR}²údõIÁÒVÛVÛVËÈå±òXyì¯ëGëFëFëÞ:N>8øààíhGûkyâñ€xàgÙpåpåp¥obĹˆsçhÄ*—U.«\ÈåÇW_y|԰ɰɰ D™¤LR&¾™¾™¾™é"]¤kÌmŠ6E÷/Ý¿tÿ +ä 9 ~ª~ª~ KW[W[WÖ+‹•ÅJ\{È=ä¯VR–²”¿313oocÃ]Â]Â]ØRLŠI±i-dAÖ%¾(¾(¾¸yáý—÷_ÞI;¦<›òlÊ324=zzôôhL÷b½X/b÷T÷T÷T€\$ÉE@€(D! H ¤€—ÖKë¥<ôz=††: ç’¾’¾’>®‡‡‡YÍö³ýlê¬À ¬8Ÿ‡#8‚#"{›Çõ¢L’GòHÞåL(Ê„î©ÅNìÄNæø…Ò ¥J¹íFo£·Ñr’L’I2†„}Â>a€B¢«yð:N£ÓÁGð|Ækѵþ»úïê¿ãwZ-ƒQžD.‘Kä¥Ùþyþyþy_]B2AÊ ‡zn™£U ýèçn!ÉH&µ³jfÕ̪9¶Fú¡ôC釥ك!ƒ!ƒ!"cezeze:¿Ûáø_â‹°`Á°Â ëÄáÁkx ¯2ULSÉÕÞ«½W{iDûäöÉí“Ùc ™B¦=|e+·•ÛÊS>»uèÖ¡[‡ÚK{i/ÜìVŠ ûX.8 ΂3Ünþ~ó÷›¿¶d[²-9å3…»Â]áÞW~§îNÝ:öXû ï6¼K#Ȳƒì€D(Š…bбÒ¨‰š¨ áëÓÞ§½O{QÚ8·qnã\¸) ƒÂ ……”Ϙ&‡Éyøj¬yaóÆphÔøȱqû/‰Ä>µ§ˆ=†F4¢‘ßMBH ‰X3öËq©ztûèöÑíÂß7„ :'gNΜÄÝB·Ð 93“™ÉÌÄ—Æ¥qi|£ùFó†÷7¼exËðÛ#++{lÑØ¡ÙÓ&ä ùB¾(ÏžÙ]ŽŒegggggcÈQØÆkÈ^»»íµ›GrI.ɽ\Ä3áLøžZ$"‰ÌñºÑºÑºQn»±ÐXh,„œa†a`rD¢ÉÚdm² –‡ùóæ³=ÒÒÒ·.Ž<y4òèÀW=‘=‘=‘€På¸O€¾qÐ?;ävÿg¯ÝêYçf›uîØéVéVéÖÒìAïAïAo‘±"½"½"ßmo¤Ýt:δv´v´vòny·¼T‚JPýýgÑ{¢÷DïY«ƒÕÁê`æ…Ýß;öÑúG."aaaaaaàìSu¢NÔ‰|d0ðÿ:ÿ:ÿº–“¨%j‰:îø“eO–=YæqÎxÛxÛx›½Yt³èfÿöðèðèð(›,‡ŠC÷úÐBZH ÿqH aïá^à…0Í‘{ ¸?òü…üIíf¡ hà3h-­¥µaú±Sý/õ«èWѯ¢…q¾8_œÏÜfÙD6±¹ES¥©ÒT­ëÕ÷ê{õä'aŠ0E˜B¿µÛ­³ZþŒƒÁ_Èj×~]ðØØ!ºAHI¸¢¡ ´6¤n–½!{Cös{ìâ~ô†ð¹ð¹ðùöß»×w¯ï^ŒBm·çh,­Åñ¢š÷³•T]IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-18-grey.png 644 233 144 6033 13755454063 16000 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ÐIDATXÃ…—{PTG¾Ç¿ÝgÌ ÐJb˜ðÐÈ#Q¹àÅAMÜláâ-“THª —å’]"JJ2Uy^")\-Lr7Aãò\ɹb”<4ˆFœðš„…2L`f˜9súþÁHi¥ö÷Ï©î>ýëÏùý¾ýë>D§Óét:¨±`–…Ý$’ I†X³î ݺ/XPÑxÑxÑøÖ'™óc~üÌóÁë^ŸoœoœodïãNáÉG$"  }èð:^Çëì}ùùù’/¹'¹'¹wý™&Ódúpea`a`a`kwqzqzq:ãCùP>”l_à¾õp©é"`@ÏEB‘P$|ëœsÎ9çY_d(2Î ;Çœcα–«¶§lOÙžZwPU¦*S•¡iÝ–u[Öm!ù¤¤¤Àzÿõþëý±-Ž‹ï‹óE‹þ=ë‰ë‹<"ŸÄÁDæÃ|˜ð2É $#´Œ åB¹Ð¶OæNÏž;ý¸@K@K@‹ûÀ–¾-}[ú¨+ÊeŒ2’äùò|y>lx oá-(aƒ 6¯á5¼`V`ló!ó!ó!xÁØnl7¶3×…È ‘"…SÛ¦¶Mm{é˜2Tª ÝèåÎpg¸3RÊX&Ëd™C/ÐDRà(p8´£í!ÿ&i”4JÛÿá´;íNûãÐlÖlÖlæ´ohßо!9£¶ª­j+4X†eXž…³p úÑ~Þð†7€YÌb@"1xLb“X|,> Ö¨;Qw‚yðòàåÁË’+2…L!SÜ>Ïïàwð;žÙƒgð ž¹ó+U\S\S\¤AÒ iл—lçmçmçÿƒF«Ñj´ü ™é™é™é’+jNÍ©9,f„a`,ƒe@‚؉™"Sd ½¤—ô.µq—qÒ„4! w”;Êøøø`™è_“¦IÓ¤ñ/ˆë‹<"ågùY~vûzç9ç9ç¹ô§´Ú- ÓVi«´UQ#VFe>ä09LÄHŒÄCä9ô›* €@4¢ ÉäG€ž¢§è)€3rFΰØGì#øˆþµ­ÚVm«äL@Z@Z@ yD>Ê"Y$‹<ºÓ•äJr%É7’o$ßÀu•ºJ]™Ð!tðÁ7øߤœ”“rÀ4mš6M—J.•\*YJ9«`¬À-ÜÂ-`²|²|²¸~ìú±ëÇÓˆiÄ4@tKd‰,>êRu©º²ä®ä®ä.lyD>ʇña|Ø¿gùMúMúMâýè¤è¤è$¢÷|©ŒÆÑ8ð”§<†ÝÃîa7`0 €þÆþÆþF,É"Y$ P ¨T@Ù+e¯”½4‘&ÒD€ÏTŸ©>S5šM ß‘ïÈw‹ÓeÑòhy´œèE‘y3y3y3Âûg6žÙxf#mŽ¿À_à/,¶Yÿ`ÿ`ÿ c™™™ŒÖÖÖ3öåŠ/W|¹‚=d³³³Œ•'”'”',õÞ¼?xŸ±ÜÚÜÚÜZÆF«G«G«š>'òˆ|\¢($ GßXY²²de VGùDùDù€âQ<ŠGA %”PÀWë«õÕ[ë¶Öm­FŽ= 8ÃáÎpàé]Oïzz×RdÛÛÛ€UªGxO{O{O·†n Ý”{•{•{W‚+ÁHµR­T»8v;ºÝÐ{Wï]½w•LR.˜ æ‚Y5ÎgßËçò¹àhí£}`8‡s8p]\×õ›Ÿ$'ÉI€f§ÙiŸÏçC~2üdøÉpwÄXüXüX<×ïããSºqaÓ¸"è½ —÷dö¯bÆŠ‹‹‹‹‹a# OÇ¢†<ÚÝïÑîqvÏ=¤]—ÁepñÙ–JK¥¥r±îΈ‘hµ·Ú[í‚íŽþŽþŽžë÷:âuÄëHwÓüèüèüè‘cýÏõ?×ÿàÔˆõT\¬Û}¼ ô8øÎ£Ý>¤Ýàéàé`‰¥VW««Õ¹÷{nô¾F£¿Ño¿Ö~­ýyYÙ«ìUö‚FК¿|+yQò¢äEû„mÛ¶Þ÷¬÷G±ª<ÈÅáw,))))) ¼§id2&c2òßckÆÖŒ­Áÿºs?æ~ì*/“‡ÉÃþóo¿¤ü’òKŠƒ¥ÇÒcéaÝüüæç7?w'κf]³.nŸt“t“tSn«d•¬òË&È!‡œÄ}ÜÇ}a…˜O øyþ…ýŽv‹ÐŒf4» Y#kdI¦…]ýM˜#Õ‘êHÖHõR½TO{¸L.“˼p9¼>¼>¼~k’Ùd6™Mäÿ„G„G„GØ'¿ í÷8(þ…= ]O¹p"9È‘\'é$¤_ gͬ™5~M±J±J±Šö,œù£«„„„²ïöîéÝÓ»XD˜Ç_õï¥úAûµÉØo FIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.8.png 644 233 144 3071 13755454067 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜîIDATHÇÍ–ïOTWÇŸpRVÀuùF:Å´6³ [•„¾Àl+ ’ Rj-FB‡Êf ˆ„f³I›°éZ„¸cœšu«ÛlDtŒ±a‹lY·@#¥45Å PfæžÏ¾˜¹^¶çÍÜïsžçûýÎ=÷<爈HjüWÀl3ÛÌ[bØ\gÄ7o.Îû,†ÝQ0•›Ê'~)®@Ú…´ Ú}ëózþÆzƒ£ž—T1I]I]¦}qü!¼õÊ[¯lþE 2ÖëÖëÿÀ{7Þ»píⵋüæîÌÝXÚ·´ ¬Ïëùz½Î·‘_>ü‰¾XnYn™@RbR¢侞ûú ¿%̼oxãÀÃM7)3DÉ$«}@ úlÀú|<_¯×ùt~]O×ùØV´­HÊÞ.{Ûú×XÁýËМӜ£ë…¯m´‘ ‘`$­ŠV±j@ `ÂÖçõ|½^çÓùu=]?æÇXÊ‘ö× b±bT&@x(r?œέ?ì ûÇ*õ®zG½‘ÑÈHd´YmV›ÅAY|Š”ޤEÒGfÃÙálP¹1~¨˜¯˜~Ôõõ¥ü§ˆÈÎÓ` ZƒÁµ0=4=ÔPª@°Êmúé%J”ÄJÿÿtÐAC9FX=VÕcà#ÚhPEªˆU.Åù׋ë3ócîAÕã49M:ö«¯s&'''¡óùÎÔÎT”×çõy}†àLåLåL%´w´w´w€·Þ[ï­ß`(M¥©46~yü2œúé–S-¨¯ÿèKô%zªÇ™äLÒ—Ö=(Ún‘‘&ð|êù&¾ðìÿXÕÚV³ÝÙnÖŠÞ-ª,ªû¢}Ѿ7ëoÖ߬‡ý…û ÷B©­ÔVjƒ]Õ»ªwUÃèÈèÈèˆaÈëô:½N°»ín»Ê£åÁò ØwÚ¾²}Åšoù‡/øRÕ‚g§g'hu1?{®ó¹NÕ«k«kàIù<ëó,h>Þ´§i!°·{o÷Þn(,.,.,GŸ£ÏÑÎ{Î{Î{ÐÚÓÚÓÚÚµ=j3ꆛ‡›‡›!kGÖŽ¬pF;=…—¼/ž~ñ4xoŒ÷Ž÷,_[¾Z{rir©ê2oúeâ‰ààÄjíj­HÙrÉ\Éœ,Ô-Öm­Û*â˜qÌ8fD2\® —Hukuku«HèIèIè‰HþùüóùçE®¯¯E†§†§†§äéU†*C•"묳ŽHßßú.õ]òÈ‘[d’) "–9Ëœˆn>ŽÃ¬º#5‘“ÏtÒrÒrRdâOÓ®i—lÛÕ÷ªûU·Èá‚Ã{ïéîïîïîIÏMÏMϱ¦XS¬)" ®WƒK$e0e0ePd:::ß06Ö;Ö;Ö+’טט×(â9ê9ê9*bùÎrÛr[äΡá¥á%Ù&’àOð‹¨²¨9j6ù$òsýëqô8àÂÏ<ßz¾Uµæ;""¬äl-Ø [Z¶´li«G®¹zŽÝ=v÷Ø]HIIªUªÀÔÙ©³Sg!?3?3?&,– Ôj5Hý.u2uÊ*KC¥!Öþ¢Tƒª…®oº¾ÕÿÆø$¶ àýPol—ÌÿÛßëïÿ&ÿvÿv”ÿÿ€ÿ„šCÍ¡fàç8{À°ƒ–®¥ké JT‰*@c 1Ðj·Ú­vC4;š͆ù•ùïç¿GE·þòúËÆ®ÄW¿½~û†]{0úè}%ÞgÖUŽÊaõi¤†j@ jAÍ8ŠP6eS6PP ñ‡jV͂ڬ2cM[R‡XU/ÅøÕÌ´wÚ `]±®øâÿú˜~´¿ÆGMM .Ç:³úO49š ê‘åÈ2aÎ2ÄŠaõ/Õ§ú€‹\ä"ð#K,šTcj ˜ùãïÑ•è au;²Yþ¬wþ7ÞLÖ~ÚùŸÝ³ò™½]<³÷±góû?F%íAé ÞIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-90.png 644 233 144 2414 13755454065 14672 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÁIDATHÇÍ–]H”YÇŸ55Ì))/¡RvqG6´ S¨)%Wé‚‚H‚d)S"È"/ÂØ-,+¢hC *ú0Ü‹nÒBw‰hÉ6ƒAY‹ÀüjÙ5íý8¿½x}ç}w·–½ôÜ Ï×ÿÿŸçœó¼G@DDÏý xý^¿7ݲ½{ʦ”M9?Zö%<[=[kßyßy€%×–\3_9¶·óÝõ"¾›ÏöËbqÉ7“ozBsv3ln¦,³ìïAêÔ;êP{¯öÀíöÛíÔÁHßH@4 cÛq;ß®·ñÜøÒü~HêJêò Cò‚ä"°¢lEYö·VÂ`6TUVU¼Mx› ¼`Œi¤©#†½&\¶ŸË·ëm<ßæ³ù-=K×/]/[j¶Ô¤þ`¼ê€Æ¬Æ,›O»œä$i Çô€±ÓØÉ,¨Gê<àØvÜηëm<ßæ³ù-=ò÷½=] Õ)Õ)€ÐzÑŒ‡ÆCó¸yÍüCe©,”>©¿ÓߪQ;ÔŽxÇP%j­Z ú}PU¯®¨+(0[ÍV4¦ƃøîóÅùÅ-è‹s:’:K„ˆ1€i*À‡ßÒã1ï›÷="zXÇ—òµÔ:8Ñ®hW´K$g,g,gL$|1|1|Q$­>­>­^dÝĺ‰u"Ãû‡÷ïmmm‰i1-¦‰z½^ÏóLnÈ ‡ÏáŸÓó¹3¦"úQý¨sÆ¢™ÑÌh&”Ö”Ö”Ö€?ߟïχÆÜÆÜF×ÖíªÛU·«e/Ê^” ‡7nàßëœQ`üçûÌ­´oÍOôÓïÜÊþþ~ †Gàb*¦œÉJT‰*&ßL¾™|æ˜9f޹[i(}JŸró}òV~bŽÅçŒÙj¶2Í2B„@}£6¨ .!!R!PQP>åS>W¼EP'€½œå,€Ùl63ö¿æØ'&?Z/ºÑmt˜f#'¹Ë]”úE=VŸé£ÏÕ‘ûtÒ êWõD=î!‚ó y Ãè1z\øŸŸüóö[9o_óö=6?_°gIÂcÒIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-9-grey.png 644 233 144 6004 13755454063 15716 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ¹IDATXÃ…—}LT׺Ɵµö ÃÌ€h„±b3J,W¹@EŒØè©¥jkCL zÅpc” Åj†m-&ÞÒ‚¡¡éÕEªÜ)Òz< ­E_„™Š4HAA†çc¯uÿ`oìmÓtý³²öÚë}~{½Ï^ïÞÄd2™L&è0׬sSô+úý¼Éô¥éKÓ—Ü7$$d}÷â^ÜëØn—Þ¥wé#Þ±7Øì ¼¨@ÉE0‚  ½èðÞÁ;¼PµEµEµ…ä*~Qü¢øå_dœŒ“ñwËó|ò|ò|Zº R R Rɰ+Àà ç8X»Ä¥£ó€k±ki5Ëgù,Ÿµ;l›Ã¶$2ßœoÎ7W8†ÃŽáæë3«gVÏ¬Žø/m±¶X[ŒÆˆÄˆÄˆD’¥ŒRF)HïHïHo@Ëóòýòz9Þ||IOÖ—yd>…´ƒ±|_À°$¤‘´€b!@.}n«²UÙªü½5/j^Ô,LìMìMì¥ÎÐÎÐÎÐN²I•«ÊUåb‡p‡ Á f0`va€¥XŠ¥˜±/³/³/æζζÎ6îl n n fÇ’Æ’Æ’ÞúX  Ðĸ‹ibš˜¶®˜§ótžÞ¿“€€€ÆRö{½Ç®òY>Ëg—y ‚‡àqÉà˜pL8&üo%%%»Öî±ï±ï± ™s;Flª×T¯©^ƒ‹_áWøhX?ëgý;ÁN°«cu¬àùE~Õëª×U¯Ã%¯—ãÉñe=Y_æ‘ù¨ú†ú†ú ôUú*}^™¹8sqæ¢r`J`J`ŠkSzjzjzªâF§Ñi°˜µ³vÖ ùȇu¨C@ŒÄHŒ=BÐ#ÕS=Õÿjg7`6@Án³Ûì6 SëÔ:5Ëñe=Y_æ‘ù¨kÚ5íšÞé¸à¸à¸úò¢”E)‹R¸!å«”¯R¾RÈ™äFnäF, q4ŽÆP@@¼ˆñø~†Ÿì÷ì÷ì÷q»¸]Ü ’A2Ìåt5]MW<ˆñ ,ãËz²¾Ì#óQ̃yðß¶:ãñÎx áV­„[HÔÒÒ‚ë`¬ Hi#móž2 àIø“ð'áÀÉ©“S'§€÷¯¿ýýëÀÑ£…G Ž´Ž´Ž4U¨B€XÄ"ã±ÙìG,õd}™Gæ£.ƒËà2üÛ¯Q¯Q¯Q®Š_¿*ž”IOêFÛhmð>Ãg†0„!€'ñ$žœö;íwÚ°§ÙÓìi@*R‘ àåΗ;_îΜ;sîÌ9À²Û²Û²ÀU\ÅU€çðžÐvÚNåCp“õe™ÙÙÙ¬°:¦:¦:†ËÍÆ2XËàœOói>Í9KfÉ,y~žß¿vÿÚýkœ000pÞgè3ôøïZIfIfI&ç•[+·Vn}~…²PÊ9çã|œóy=I_æ‘ù(>ćøÓ³ô,=;ÿd*\À\ …Z9ÈAÎü<<ë=ë=ëJ)¥¥£t”>Ÿ»4viì0¾m|Ûø6ÀYã¬qÖ<Ÿ'œpÂ<Â#<p·qû¹>}›¾Mßp'q’+½ ôüÜdôdôd4YåÚéÚéÚ‰¿(¾S|§ø\&ÄŸø[°[ßßß`°FX#玞;zî(Еٕٕ XÍV³Õ ØBl!¶@H…DYÈBoxÃÀF0>ÒGúÀ%PÁvËvËv ?ÑMtÝÄÏ ë﮿»þîá–Ç>}ûЪŭ‹[·’8}‘¾H_„YæÇü˜”Äø?«° «,Á,V­,ZYèCõ¡úP`4x4x4ˆù4æÓ˜O§åOËŸ–î“î“î“@xTxTx0—r¥(E)@zHéÁìƒÍ6?Ø eËDËDËÞSéT:•ÎuŒ")HÉ«P˜&…‰ä¶x·x·x‹Öpk¸5ª¥ZªÅ$¯æÕ¼@(B 8n:n:nb…X!t;ÝN·©±©±©±ÀÒ©¥SK§€ÑšÑšÑय़^ú饟ž§^ªd —Éerv)“šo,ßX¾±°µÄB,Ä‚¿‘ˆDüÜú^ö½ì{ù£Ãn n n Uƒc‘c‘c‘ƒº¬º¬º,ñ€vä!»T‰àéé ,4-4-4_d‘ýE6Pùjå«•¯¥ºR]©x!ä…B€01L hDƒC %”P5|ÐðAÃlf°f°f°†þàö‰Û'nŸÜÛáp8:É‘Ÿü|ägè@Ç %Êåˆr¤]=mž6O›ýÓשששù+k7Ön¬%—™‘™œöÑ>Ú"&‹Éb2ðýîïw¿è©è©è©M¦@£‰ÑÄhu˜:L°³ì,;;Ÿ™»¹wsïæb[UqUqU1¾Q?T?T?|–Ä.p!bV`Vtÿ‡à™à™à)Ü •¤’TNl…hînTžWžWžßÝŸÔŸÔŸÄoø4ù4ù4‘I³ÙÇŒ¿p×q”4ŠFÑ(`ù¡å‡–"R"R"R€ÿÿ@Y¡¬PV|ˆñ!€î ;èLNyNyNy£º±º±ºÑõƒ˜.¦‹ét“`l‚íÝSH@þ·…(D¡b™t ˆQsߊ¿‘bRLŠ/ï£ 4&l@:Ò‘NO˜©™š©k¯5Ïšg̓†X‰•X1Éwñ]|À ÜÀ çñ<à‘<’G¨E-j’KrI.첕³³³Äã9ã9ã9Š•QeTk ‚ ƒ ƒ ?¾„<ä!œAúÐçZ'Ÿ|Z `®.ìÇ~ì' !_‡|òuÑ_Ý÷¸ïqßSS0î5î5ÖùÖùÖùþÊ»ÝèF7ìä<9OΤ•´’V€Ü$7ÉM€ßã÷ø=p<ÄC<„êšåšåš…¿ÒñmÇ·ß EZ­Ögð™£ÊQå¨Êþ¨+¯+¯+àná,”tNË 3R–y0æ…w†î Ýûûû³?Òzi½´^ýg{ͽæ^³PÔôFÓMoðWÈ>²ìƒŠU²JV xÀà|‚OÄE\Ä…Ù'–'–'Ô4‡5‡5‡a¡vX;¬X4‹fÑÙÑãô8=>øŒVÐ Z!”Ìáðr òK(ý’¨¤¡”"¡ÍhF³x€¬%kÉÚWþ:÷Ëqé¼s¯s¯s/Ë|‹½ÅÞb4.ôxèñÐãØÂzX놮 +è Ø]¹®\W.T¥ÆRc©Q ^3¼fxpß=Ì=Ì=¬(fî¥9ø+ce¬LQ"eö?åŒ`r¾èIæ=$y÷€äÝÉ»~ç]§ÙivºöZË­åÖrh¤’:!ïDËlËlË,›,,,î»v?ì~¸«ÑþÈþÈþèðÇ÷7Üßp Jë42 Ì÷«êüÿ€å4R€«’wÏÿλúqý¸^a­5ÕšjMâ!AXØéÝéÝéSm7Ún´Ý ;5=šMÀY ÌlW¼©xSñæì¿¢ Q†(úTÒ{UêgË%àZ|||||<\Ò°“»q7îF2†W¯^‰ÿ—‹ËÅå×]*ƒÊ 2¼~âñºÇë¯óþÚÚmí¶vóÿ¾súÎé;§ÅØiç´sÚ)ìWÆ)ã”qYËx9/çå_5BTÂ<ÅSšÐ„&17ðÞßGëi=­ÿ‡áÙæg›Ÿmf+•eÊ2eíÒ…t!½õŸÆzc½±~}¼¥ÏÒgé#ß²%l [Â?—âš%À™?â ø“öïJÇ…˜‡}؇}Š‘T’JR¯yoâMïîR¿¨~Qý"í„aàÑ‹ì;ÆŽíêÙѳ£g0ƒOþ°œý3ŽÿŸ ÊèãÓIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-31.png 644 233 144 2374 13755454064 14671 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܱIDATHÇÍ–_HUYÆ×½©WÉœ+8Aa4‘ÈYAJÿ¨À Ê Â¦ežFzR¢†lJ|Ë&(0J$­Æ´+Šé:dY¦ šQRÞnÞ{öÞ¿y8÷Üsf,˜ys¿ÖÚk}ß·×9k- ""ÁøSÀ¿Ð¿ÐŸaÛþo\êÆÔ_ülÛ |Û|Ûþ¬†Ï>kÈ¥¹¥¹©ŸÛö7!íbÚÅ÷ì¿´ÿ@kKk •0~küÀ›¢7EàÚξïä;x^|9ò/~HnOn÷@ %"Ùë³×/þÖx²Š·o3:Çø@½ÒI7E@„ΚðØÎ~<ÞÉwð|‡Ïá·õdfŠ@É®’]iÍvÂÀOPµ jûãé`E¬€*SeLƒ¹inàîíì;ñN¾ƒçà;|¿­GþùnO¬ƒí©ÛSë%¦n¨ºF×ÓÃ&`ë/kȳÔ,1K˜±tºè˜{æƒù€Ý¢[ˆñNuªÎÄ{| ~ñ ú²ÒÆÓÆ#I0¨0ÀfÐ'ô ¦ŒE9À÷TSíQp‡;Üæ3Ÿù žª§ê)p™Ë\öÄY É{ôž8:lNð%øm=qa¿ÂÁšƒ5‰ä¯‰XcÖ˜Iæ2×®@èYèYèœ\}rõÉÕ0808080³bMš4€PA¨ TàúÍ:³×ìÅx^±Í—à·õÄ…ÝûÎ…Ï…éåúÇØòØr¦Oßpßpß0ë‚uÁ:(‰–DK¢½&{MöxtôÑÑGG¡<¯<¯<Ïý@:Nuœê8å S7T»jPgÕYß”»ü¶ž$‘ŒîŒî¼"…k ׊ˆÈ]¹ëk–ßý“þI©°)ÞV¾­|[)R«ˆUÄDV©Uj•©ž¨ž¨ž‰,Š,Š,)>_|¾ø¼Èõðõðõ°ˆ~®Ÿëç⮯d…¬ñ?ö?–€íô5»üq=9/sž~ccÞ¶7¯Ì+ ‰$’܇‡‡æ ›6lÚ9‘œHNú¯õ_ë¿æÆ­Ü½r÷ÊÝЪ[u«öTlTªQHà'ø~[_D·é6ßk«µ5q®,½Kçë|±ÄK¤~Yý²úe"¥V©Uj‰\¹zåê•«"ä“O¾ÈíÎÛ·;ÝÂL—M—M—‰H—tI—§bSò^Þ‹ˆÈyâò¹ü¶¿H¤(RôGŸHOWO€}þ\I•T‰:žÇwßq\äuèuèuH$k$k$kD$·6·6·Vdçý÷wÞwùƒ Á†`ƒHrFrFr†ë÷ø–ú–Šˆ˜!3äà³ÏåëùdW:]ÓA?ýnWFk£µÑZxxxõP=Tgve¸.\®ƒho´7ÚëÙøa†ÿsW~d޽ḴfÝÌ”ùż0/Àœ6¦ÑÓþ)&Ť€™4“fÒ#`Š©ø´šv{ûϱL~g2[ª[uè*]EŒCœá Æt˜6Ó4ÓDÓÌŠÀh¢—^ èCú1,Õ£z<øŸžü³ö_9ko³ö>6;o° „÷°ÞÂåIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-36.8.png 644 233 144 3106 13755454067 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜûIDATHÇÍ–ÿOTWÆß†¡T ZD2ˆÂ‹BâiH³&°5*A% ¨  h«ìncÝÄlÒ&lwY1ì’@\c¥ºÕ ´I]pI!ˆ‰PW)I©¸ˆ0È—qq¾Ü;ç³? ×Kúx~¹yÞóžçy’sÏsŽ€ˆˆÄ,~¬‰ÖDëò¶4ëÛ"¶¥|ÂM:X -…÷OBtCt@ì籟4±1oô/]/bò/Õ3ê#fÁ~Å~Å’½ˆ?â7‹ßŒx#„ÿÚ ŽkŽkÿÓàÐׇ¾¸Ú|µ™#ðäÖ“[3Ù3Ù`bcÞè7Ö|Kùå“_è‹€íºíºeìáöpHz7éÝäC #É¿3'Àãe—)+èS@Q*ðàÁî%ؘ_ì7Ö|¿¡gè‡ü¬Ü²r‹¼_ð¾ã\hÁá#çGNC/p ¨¡†(Ð<š@/ÕKñêTX°€‰y£ßXoðü†ž¡òcn傈ȩ­P4T4Áÿºµ±@J T’ö–öE§JíSŪ´~­OëƒàXp,8†9<<ãÙK¤‚-V‹%   ’BüP4Y4 ÌúÆVÞIý8<'L‡º‡ºOØ*M¥±ÀyÊSP'Ô u”®t¥/1ršÓœœ8qšeõ\=WÏO©¡@mQ[XàÂ"î¢Þ¢>}!?„ˆHS—¢² ²À  þúÞX_~_>Ôý¦îíº·Qk~öð3SpdÕȪ‘Upê쩳§ÎBoUoUoÕC±*VÅšøÞ—÷.Þ»u¬û¸îcÔÃ? „„›zê»J{¥ÝØÚ¦.ÑÜý=|ÓòM ¸vŽ$Œ$¨ò˜?¿¾þõõø >,¨(¨€ä’ä’äpeº2]™SŸSŸSy®^v¼L¤!§!·!WÄ_ë¯õ׊PO=õ"ééé"ésésés"—=—=—="=ƒ=ƒ=ƒ¦1ï^ï^ï^?~üˆÜüâæ…›D€RDä:ñÄË´ˆí‰í‰ˆ¬µµ%Í|ÃÛÛ2 ÞèÚèZ‘ú¶ÆîÆnYY¬Š´k;ÖvLDïÐ;ô‘ç€sÀ)———#räü‘óG΋DwEwEw‰ e e e˜ÆúÛúÛúÛDRªSªSªEZËZËZËDl?ÙÚmí"·v÷ÌôÌÈJ‘°ñ°qU [u«e@”ÝøÇZ6·l†ñãÞ­Þ­ª|Ó{øV]qpÅA(r¹Š\à9ã9ã9VX}`5D®\¹JGKGKGa°q°q°2â3â3âá¾í¾í¾ vww!様1 `ož7Ï‹oú¬:¬«r¸2|eÔB~Ä8´W…U…™§Äÿ—Ù/²aÒþÔûÔ‹Ò;õN½Óü©ƒÃÁáà0¸OºOºOB0.ŒµCíP;À]í®vWƒÚ¤6©M 'è zLÎO>š|„Òë_ï_oê1Pµ¦jÍ’SÉ·¿È±‡rE{™cûÔ>TšÊRY òU¾ÊµAmP–ÄC¢JT‰ ÜÊ­ÜKêÕ˜¡âU<€Ú­v³ ~âW#C½C½ŽyǼ'Œ9f$¿ÏHÞ=Ëö,~Jfõ6«ÍÿÐÇõq3ù¹ÊW|ªkñ j¦™f`–f@=Pýª˜\ìÿ§>¯ÏPíÚ´6 üÝHþ=a{ÂÀÔy‰¿²wå+ûºxeßc¯æ öÿ£Â^Ɉî¦IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.5.png 644 233 144 2501 13755454066 14744 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜöIDATHÇÍ–ohSWÆoÓi±ÿ´E˜†::œ:±¢DlÀ¢.P«J¦+«~X[ÄÑ¢ µ~ÐkqZ«mZ ­vTpPVÛÎI‚P4lNÔ¦þÑ6‰6æž{~ûÜäVé÷Þ/á}Ïû>Ï“÷žóÜ£€¢(Š’ýUÀd1YL™‘Øôm?¢GÜÂÜBE¥;JÓš# O†š…5 u¾p;pšÓÌÕ¯úD™(#²Gö@Äc}]¯×ûu<_çÓù#z”éï¶~3”¤–¤A€p/ˆ ‚üT­Së«OUTš[{ =àãÇI= ~µ¢Äb·Ø{ß÷¼ï!ŒMd‹ìØîej»ÐÖo6¼JEQ”Ï!m8mØŸÄ[Ϥg2Fó•ÛÄ6Þ²—³œ58Ã΀—ãrÜ÷àÁL2IGE5*×ìš·:>x„G@Œ?ª'*¬É Ž8k^- 7…›bhrpÁ`î`.4,jXÔ°ÜkÜkÜk>X¸+Üî‚vG»£Ý‹/_,†Ë]v^vÂØã±7coÀsžé¾8DOT˜û{¸1qc´ÿdy”'ôdõ“¥O–‚Eµ¨¬uÖ:kXª-Õ–jè3÷™ûÌqac›Æ6m‚¼—y/ó^Bqyqyq9ØÚÚ³úg'ŸŒ•‡d™Îá×õ(ÙÙ-[a¸`¸4Óô ÜúæÖ¾[û ¦º¦º¦:ž_þbù‹å/à|òùäóɆ-ærºœ.H²%Ù’l`«²UÙªàºïºïºÏ¼Z›Ò¦€Ø>ðëzÈÉÈÉÐþ†Ñ¡Ñ!@D޽¬ÖJµÒ8Î`Ù`Ù`¬j\Õ¸ª¬•ÖJk%æææ„59›œMPÑQÑQÑ-W[®¶\…üù+òW@Ë¡–C-‡âõ©ÛL”?ªç㉹¦Olà÷»w!}~úüôùpJœ§îîîÀTÁTÁTø>‡ÏmmmpdÉ‘%G–ÄqÖg®Ï\Ÿ —ª.U^ª4ûzƉMßcÂ:}5w4ßl¾ &—ÉerÁÚ¢µEk‹ ·3·3·ιιι`cíÆÚµp?å~ÊýØàÞàÞà†¬ƒY³‚Ýo÷Ûýðîæ»æwÍòмBˆ/gÜcœÊ?ôS"Â" ¡OBëBë¾~_·¯†¼CÞ!/x5¯æÕ x/x/xÆ—/_r®œ+ç‚zX=¬†‘¤‘¤‘$Ð.hõZ}ü”ó¯úH}wN¥ÁÇb¾¢ûÌ4ß2DA‚3Ž2öË~Ùr«Ü*·òŸÉír;°@G >6å x0ƒœ_-I,IŒ¹R/ÇD¡(Ù*2Daù§œHù›l“mÀö³ß`´^†~¢]Ò+½HnhfÍLÄ€ÐY¸JÌ%f}RÓœÖ~+gííbÖÞÇfç öÞ‘ 9oëÒIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-97-grey.png 644 233 144 6223 13755454064 16011 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü HIDATXÃ…—kP×¶Çÿ{wÏ[yIe$Â">Jád ž$*BrB,MR^1‚Ǽ׈bTÄp¤‚‰¹¨IîA1£è¥@I@ÉC°¤@ÂCDa`pfº{ßÌ@*·RY_víÞ«×úõ^ÿääääääÀ Sf™èJþ&“¿ÉªrŽçÏ9Îææååý9œy3oæýÉÛ‚Ÿà'ø-ßb/·—ÛËY>ŽáŽ‘l„"¡ºÑn[°[X¾"E‘¢H!Ùü=þ¯ù%£dt÷QƒÖ 5hk:ò6åmÊÛD…@!P$«§8¤+../: ¨‡zzRÊ•r¥\éŠcÂ1á˜xbEnEnEnÅÉ[ŽAÇ c°úªm™m™mÙòÿÒiŠ4E¸°|ÕòUËW‘ìHY¤,R¬ðYá³ÂpÏÝën÷ýîxÓñ]ùÜùÝÞµƒÏ2æÁ<¤×Éf²™l,â¹@.ðòW¥¥¥ |æTÏ©žS-î\Õ½ª{U7uF´G´G´“µŠlE¶"6ìÁì6Ø`†4¤xOâIØìö{Ö¶×·×·×3ç¥ÐK¡—B¥ŸøüÃç_;¨Tª£•âfq³¸9±ˆ¥³t–~óuú,ÙÿxÿãýÔ£õ³ùr¾œ/¯ÿ—cÒ1é˜\°&蹠炞ô©ÛR·¥nãOzY½¬^VÁ¾ð…ÀtLÇtàq7pÀ,ÌÂ,ãÇ8€„  =¤‡ô@À0†1 Þâañ°x ïìg¿8û…ðz_]_]_ß(WÉUrUÿE!EHRb7 ±ˆ5QU“ªIÕÈæÊæÊæ~ôoÛEÛEÛÅk‚RƒRƒR…µé›Ò7¥oâ½´^Z/-|Å:±N¬¤d)YJd$# m¤´¤‘4’F:è ЉNt’A2HðBƒÐ 4žïx¾ãù|ÝñƒÖ­ Z'¬uçwó¸ùHnUnUnÕêŽ&G“£éb“‡ÕÃêaeÁ[Í[Í[ͤɫԫԫTš'Í“æÁƒ¶ÒVÚ ÀÞðÆŒ ÎáΈB¢H    ¿ò_†eXà:®ã:¬½EoÑC:ò⑼È"­r«Ü*'&y¤^‚…à?mõ>ã}Æû ò',NXœ@Š1ŠQŒB õ´žÖíŠvE»øÖÿ[ÿoýAcЀ1ØaÌDÇFÇFÇ)I)I)IÀ©?¤þ Ïž=<à¯ó×ùë€lD6"žxxâá )>)>)~º òm„6BKŠk‡k‡k‡‘???ÿ§­Øõh×£]¤ü“Ñ'£OF3·M°ØìÆÄ±D,aì£-øhcçœ?pþÀ´ë‹é‹é‹alaa±;Ûîl»³mfݶݶݶ}f^XXÈØg?{øÙCÆlöaÛ0û­M¸yÜ|âC|HBéizšžžVë±ë©Cê:{½À^øøøÌHÍ“óä<9ùÈG>0¨T ªfÖUEª"U0ºwtïè^àû¬ï³¾Ï¿Lü2ñK@5G5G5ËÄ2±l&?}ƒ¾AßpGp„„òœçÇù±ï¬QÖ(kY,¼"¼"¼‚§¹®…kãø¾$F£ŽQ•þ•þ•þ@ÿ®þ]ý»ËËËÀ9îwŽì"»È.âÿYºF]£t‰ºD]"±(bQÄ"€™˜‰™ú2}™¾ ærç&Z&Z&ZÐK×Òµt-ûŽ*((…½Ú^m¯–}×VÒVÒVÒ@0É~f?³Ÿ„• +VëzÖõ¬ëœ Îg6;lvØl@#jDprNÎÉghhhV¿V¿V?@_¨/ÔάKVÉ*YB %“}É}É}É€iÀ4`À§Ê^e¯²W(¤HE*R Çø>‡Ï!Ù5´†ÖP1häÞȽ‘{P“hM¢a=ÅŸâOñÀýšû5÷k€7zó§74—4—4—î]î]î] ðpàáÀÃ3 F…QaT™™™@pFpFpÆÌ:g䌜va£°QØu¥©ÒTi’ôÄDLÄ„ÿ&"‰ø•œŸ[;·vníÇû†r‡r‡rýÇÔ‘öF_YRYRY’˜µ¥yKó–f®0ê`ÔÁ¨ƒ°···AÑ4Ô4Ô4°.Öź€dU²*Yx·x·x·ü 4ÊeŒüô~z?=@#i$ıCìãÒ¸4. ŠòØòØòXÉf3™Çh£Ú¬6«ÍÆ Î g…³bççdÿíý·÷ßp ×pÍÿlH6$º¢¯¯¯\ž°7aoÂ^–°&fMÌšRû ÷Aïƒ^°;_ßùúÎ× þŸúêÿ) uhZ€oð ¾` ³²³²³ð‘|$ Ð^Ö^Ö^ž~[Ûî¶Ým»±¾ôPé¡ÒC¨Tõ«úUýŸgã·|=†°Î¿òô=FqM¨F5ª"%½¤—ô›«ëÔuêºË¸²ôÊÒ+KÙ¢€€€rjñÓ‹Ÿ^ü4R|Ÿò}Ê÷)¨É™ ÓÍЂ´ÐB -°0kaÖÂ,›Ïæ’]²KvØ] Þ¾ðö…·Å¬Ñ÷Gß}Ÿ?¤Ð)t Ý©¼üüüƒ—a€ò/ô =B¢ûôÕàná–ÐØ¤<ü|øùðó…/)Ó•éÊôSy£á£á£á¼ålÚÙ´³ib–;!¹J®’«°£íh0‰ILC9€ `Œr”£ ¦Sƒ‰%\ûñÚ×~ä 5ZV£5?v”:J¥»>î0t: ÓŸ-OWž7¨Í5ž–fI³¤Yðl½Ûz·õ.àØáØáرëc·Æ[ã}ótwEwEwWXõjÕ«U¯²’I2I&Ò é„t *¨ Ø#öˆ=ˆ@"`òéé §ª—T/©^OÍ fP3HQR”µëcZ@ hù±KЇ¦pØj÷@Ü¢qý’(\SW‰¸Â)íŠYDOôDŸðÒÔ/ÇåóÎ g†3CúÛkÒkÒk]QQQ€©Kê’º ¦a4Œ†Á.d ÙB6‡u‡u‡ubÈà3ƒÏ >ÃÝP.Q.Q.)Œžziv6JÅR±TÌrUv»»byyyyyy°N7^® Óri7Ë¥ÝC.íþ/§ñ4~g9Ò‘Žtúy…³ÂYá2,G-G-G¡¦”RJñȽ5“5“5“’Í\l.6s7”û”û”û:.Øìö}o¼pã…/.À ×}j7 ›ï×â¯ÝjW€Ÿ\Ú=~.ü\ø¹Â—”[•[•[Oåúúúñ–39grÎäˆY®ŽÞ³Ý§Ý§Ýÿ¬oªoªo"¯«»Ô]ê.@ ’‚¤ ¿]á7òù“1Á‘Á‘Á‘tÄ•/É5Nþ–‹ÃïX\\\\\×´É™œÉÉ;ƒ .ÄÿˆóÄy⼫‚"X¬~åóû‰÷ï'úœ³tZ:-ì­%­%­%â³ãÎq縓Û![)[)[ùŸì(;ÊŽ~{ ( àú0‚ŒHOº+àÚ(á·<`¿£Ý\T¡ U¢•³rV×CËh-û1øqòãäÇÉÒBY±¬XVL;¹t.K¿T§+Ó•éÊþgê1õ˜zÈ÷ÒÒÒì+WÜ  í÷8(þÀ~£]×çB4 ™Èä›É&²‰lú·ŽU±*Vµ;M5_5_5Ÿvr·¸[Ü­ùÒ'Ò'Ò'w»6tmèÚL"ØÏÝXNþÇÿ: ï°‚%IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-9.4.png 644 233 144 2412 13755454066 14753 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¿IDATHÇÍ–_HTYǯ¶:#j›QÂÀÈl.ÑJõâ´•4ÒnFÙ8µ‚D°4E/kÒ&Û¶Å‚ÂÒ„¡,ÛÅj{‰ Û—Õͽ,Zˆ“¬¦5¨÷ž{>ûpçx¯µ¾{^†ßïüÎ÷û½ç÷gŽš¦iÚªÔ¯ééé+m;ý˜ã÷îñîùü7Ûnv0íà‹àÓ+Ÿ^È»‘wÊ;¶ÚWñîóšæà»ù”_[¥9O›§-­4e×Ãá͇7{×ÚvCdÝϺÿÞ„hg´ ãVÇ-NÂØó±ç“¥“¥àØj_Å«ó ϯÕÀ¯iñ0ãaÚKðdz25 e²ÂSvÀ?…°¿|9Àë¯WÈto€rd)0à jM¸lµŸŠWçžÂW|ŠßÖ£Áš]kviTTUTeµÚâ¿Âiÿi¿â3î¹H˜3æ €¨ÕÌì’]¤‘Ž­öU¼:¯ð¾âSü¶mqnCÈHf$0Œn/ÅK°Þ™‡ÌCæ¿"_ä#å1yTÅYI’$i¦˜rܲF¶È¤U`œ7Îc€@Øñ6¾Œx"%°1äJ¥¦iÚ—!k,klæ’úŒî¤f¯LŠJQI’i£Í%$DˆàÇW %”€<*«d•ËÿÞ [a[°t¡ XàOéI kþŽŸ;~˜°ŠXmf˜·÷}×w²ï$ĶǶǶÃpïpïp¯ëfå y]^—×ÿÈ£‘G#àiåÓ}O÷9á|f®6Wƒ]VÑJOJXo Ü~{û-XcòÛÀ\ÿ_ý]ý]°.º.º. %M%M%M°áĆNÀhÃhÃhƒ#Äò[~ËïØ»ÍÝænv´ìhÙÑâŠûÙØdlbŽ>Ågó+=¬|¶ò™lƒ±-c[@|¹8#1#6›‡à@p 8àø‹g‹g‹g¡ÉÓäiò|œÉƺƺÆ:Ðnj7µ›n·‡Û]ÂÊDŽÈ†•ÇæWz4ÈËÍ˵þ†‰Ñ‰QÚÞNEëHëH+WWWCymymy-dnËÜ–¹ ®v\í¸Úáv®ï\ß¹ŠÊŠÊŠÊàìã³Ï>† /è ºjQŽ[ýV?ð‹â³ù•žnÌÒyÏÁž= Š„"!¸&¯Ék|…¾B_!<ˆ?ˆ?ˆƒ‘4’F.$.$.$ Û›íÍöB "P¨pz¿õûÖ3­g|!–¼±Å5&ã‹kl22g2BU¡ªPøÃþ°? u5u5u5¨LT&*acpcpcô#úýˆ«šcͱfØ9´shçë‹=æ=ós\^²Æ>èJR]ò»y×¼ëÜü|Á|þ|>Œoß:¾¸Ä%.õÊze½‚‰'O&ž€•kåZ¹ÿ¬˜³¦¿š..uuåCóŽyÇÅ÷ÿ]éšc³ú;ýÝÀ^ÖŠQCR~-ke­«F2 @”(Q×MÔSO=ÈnÙ-»o¨ Líÿ$†Å°kŽ }NŸƒ%æ˜kòñF¼€ ©Éqà¢ãòO9%§ôÑCð† ºÔ¥ ð‚‹„¶ÓŽ$[œ§0@ ‰!7þ’“ÙþW.Û×Ų}-Ïìö GÉE>èIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-5.1.png 644 233 144 2445 13755454066 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÚIDATHÇÍ–_HTYÇ3ýq$Ë ÅÀÂP·²…¶ Ò4’"ËÐÊjÚеÖí¡z؇¥… ¨‡¤"Ä aY³Âݘµ– l'w«MM#Í?«Iν÷ÜÏ>Ìܹ·"v=/Ã÷œßïûýÎïœó»G@DD–Æ~Ü+Ý+ÝK¢Øý­=ïÙîÙžýk_3ÀUê*ýóGH¾œ| åFÊ ÕkckÝŠwæ‹ØüN=k^–Š=‘p3ᦫ †Ï¾5ûÖxÒ¢øBý‰þw:T·T·4767ò ?~0^0^6¶Ö­x+ßâsòËÙôE`Áw\C„…"¹-s[Ö÷Ñ€¾,(ÙY²`pÞà<Ó ÆD’YL1…5FØZÅ[ùŸÅoéYúQ?©ù©ù"°çÀž‰ Ñ„Þ_àôŠÓ+,=ÍœãI OéSÆ!ã³`Ì.\`ckÝŠ·ò->‹ßÒ³ô£~äý½X„^6¿l~ÜÐ}îçó`üéô£_åF9¦ñQaT;ÙÁì1ýAQ‹ÕµÓ|läyh ÜÊ LÇø)ó”y,ƒ‹[)"òE-$'OÍÇ ka-냕¯ò™áŸøœŽî0¢„os›Û`Œ€Úh¡Å¯*T3q~ÂFØ€¸~ÌOÌØµßáø™ãg€j¨RU Z—6¤ aúýuþ:¸Zrµäj ÔuÕuÕuÁÛàÛàÛ £B—Ô%uÉÆõÇêÕƒž¯{Öö¬O›æ6m£¶1žµ.®ó3öø4M6M‚ùÀ¬ŒeÌŽßoo„´´´(©,©,©ï#ï#ï#x6ýlúÙ´m$ò&ò&òvì:Øe”¶+mWÚ®ØqÆo‘£‘£ÌÆ|VZú–·È’{Kî}µQ$¿0¿P„DD\ ±N¥‡V…V‰Lž8½•Ö-y ·émö-ÒžjÝZ7ŒxF<#0³Ì,3 Ìt3ÝL‡Ñ¦Ñ¦Ñ&P›ÕfµÙ60Y3Y3Y‘û‘ŽH‡ÍG§~W¿ûŸ·ÒÑÇÞ…'Óv3ÿ0rŒfÌbóT´š1æ3ÇÌ2È ÃѧÞóž÷8ǬU—˜ ¯òþï>æèüV'Ö!Ú™ .cÆšÙn™C˜øñáÆc Ì2CÀ_ôÒëð±€<ò0©7”¡ÐÀ!'ÿg;ÿœýVÎÙ×Åœ}ÍÍì¿.M'ãúºSGIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-34.4.png 644 233 144 2740 13755454067 15036 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü•IDATHÇÍ–ýOTWÆ¿w y±¬R‚©DÚ´°)‹º*Ôš·ixi°ºa5*a“å%5šÝIƒLLCÓD×D²¸nlÙµ®“j§Ífk”­t"°I­•ŽÃ,tÆ™{Ïg˜9Þiý<¿L¾oÏód¾9Ï=""²8ñ+à(t:2ã±£ÉΧ¿–þÚŠ?Çc ÆëÆë#¿‡¬²>Èþ(û#ë–ëºîOž±ñ“ùt^‹HL4ªq7ìX½cuú’xüÇ+q.ãÜ\ šÏ7ŸúxècöÀ_þð%@ :P v¬ëº_Ïk¼d|éþ¿<õÉSŸÿ…´i D ÈUäzvo¼áö³°eÓ–MwRî¤(˜SÀBªj D}¦“b]Oôëy§ñ5ŸæëÈ{5ïU¨{£îŒøÀ­Spà™Ïh¾è9à=Þc!ÄB±€ù¦ù&PWÔ °c]×ýz^ãi|ͧùãzìU΋ˆüiÔûëý`݈úbßEWDW€Z«‰ÕM(UZ²Ú¯ÚU;X…V¡Uˆ}æ ‚ºßzËz‹¨Úo~j~ Ö¢8>Ô‡ëÃÀ}ͯWùO‘â>Èe„B©Êòûü> € ^T/2Ï_8Ïy >ú€ílg;¨]j—Ú•$hŽ9æ€"IùJ*©õ³Çìa>‘ÝÈœÿ¢ÿ"hþ¸°â>ឈˆçª¢¥®¥N£X¥7¾ûzË×[À]é.w—£üAÀà±31<1<1 Þzo½·>©PB % ÜÊ­Ü?ë¿1qåÝñYígµ6«Z[ɸ‡uGD¤ìo†ljÜÔ(òï_Œ/T©º]u[ú¶új}µb¬s¯{Ýû"c§ÇN–G§éHÓ‘¦#"]º6tm°óÊP†2Dd\ÆeÜÎ7»š—7/£«º;Ø”‡ñ¬ñ‚:üÊô+Ó"r;®Ça´:g³Ï—‹Ô5†ÈìÝ»Ëï.7ÚFÞ¼‘´¦íM»›v‹d­ÌZ™µR$õlêÙÔ³"ž"O‘§HÄëóú¼>‘¼eyËò–Ùb-±–X‹ˆqÂ8aœqwº;Ý"—O_º<$’—÷tÅÓ’–6 CUÁª ˆü*óÃÌŸ/È^”½Èú†ô©ûS÷íküöm°~Ïú=ë÷@YnYnY.»vìÚ±kP±¤bIÅ84|høÐ0¬Yºf隥¯ú¾ û.ìƒRW©«Ô—:.u\‚5K+S+Sm>uêæÔMàèâþÅýÖ7bÖ;s¹j"ïDÞÏ_.\„ k³k³m‚òŽòŽò(Y[²¶d-666BÁÉ‚“'m›îÏéÏéÏh{´=Ú=×{®÷\gº3Ý™EuE[‹¶Úý‹NåŸÊM…¦Àü—ó¨ó¨5$"rm? :Ú Þ®¨yéû—¾'’S–³*g4 ¸wðÞÁ{mÁ}Þ>oŸ\® ×ÌäÏäÏäCq{q{q;ø·ù·ù·ÙýÇ=ÇÝÇÝP5òò—è{«Þ&çLÊ™à·q= ó\åRkj룿Ö*}xì§êŸªáÇ´ÉðdeŽ›ãæøã« & ÌŽÎŽÎŽ;ÙÉN˜îîî+ÓÊ´2“úcá™ð j¶6 Iº•ÿhu´:´áz® 7îcTÇ}L}ûÈÇv«ÝÌ«eê9õ¨Ãê°: ÊT¦2Ílf30Ê(£@'t&)綾^P>õ•ú Øiíµö2Ï­~—ÿsÿçI>ö£ö1½íˆvÞ†”†àwqgV=ˆ=ÌIsòqç§›.º€\rÉþÿVªoÕˆþóÈùÛ¬6¢t›_˜_ ´ó'øþÒùŸÜoåûºxbßcOæ öÿ©åþ}ñ¶IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-29.1.png 644 233 144 2751 13755454067 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜžIDATHÇÍ–oLSgÆOa€Ðd1F ΂"ÑðaŽ¡2ƒ0 YÐaܤìO–ûâLÔdFÝ23uéªÙbb6"²0G†[°Ø¨¡ÔUCfÖU´ š††zoïûÛ‡ör›%ûîûåæœóœóœ{ß{ž÷‘gO”‚”‚”¹q;e—埳~Îú%ßÅmg l ¶†ÑO`Þ±yÇr¿ÍýÖðY¶7ñÉù"Výd>Ó/ÏŠåÈèÊè²U%ì}ÐXÚX:'?næ†Ìs™ç¦uhù¡å€îSݧxî^¾{`ªjª ,ÛŒ›x3߬—\_öý‡_ÒúÒúlAFzFº½ZôêóÄ·Ÿ‡º×ê^¤RU ÄB@6Ùª Æ\’l3žÀ›ùf=³¾ÉgòÇû˜ÿòü—E þú72¿‰'øNCÇ¢ŽE&Ÿvø”OÉ=¬‡bÛbÛˆ‚r+76l`ÙfÜÄ›ùf=³¾ÉgòÇû±¶ò¡ˆÈçÕ°erË$¨Ú%}L{N{Œam\GKtªŒIãžqô‡zHÚ¥v©]XkšG<ô8ŒJ£ÍÈÑËô2PWâõakÚÖ4 dò›[yADdÙ—Î ‡ŸQý—ü—€fjA•«r"\`ˆ!0BFÈ]tÑ•ÔH5ÕTù䓟äOàbî˜;æŒ[Æ-"‰h-ºßíwƒÉolÙ—‰/æüM 8l›YÍxñÏE^¯× Gæ}Á ®Ö\­¹Zcñ]ß~}ûõíptåÑ•GW¸gÜ3î±âjH ©!PûÕ~µßòŸl9¹ïä>Ô5žåžåŸz³åvËmsk¿‰Q."âi‡ž¯{¾†ÑŸ‚ƒÕ[‘…Î…N¢ö컊}žb¸.‡Ë%%%°vÅÚkWÀÒ¶¥mKÛ  ô€n5¢åh9Z444X0p´oußj¢‰×x+8í=í5ó´KìZÖ‘¬#ª "ÑHz2ûóúó ãÃöÕí«-{–=Ëž¥ëJו®ƒÍ­›[7·Zñ²™²™²8Þ}¼ûx·åTD*"pfÍ™5gÖ@ÑÝ¢Šþ¾ž;ì´p±'’@ ÀÜ_æþ¢º=737ÓS¡¦P“5ön»Ys³J%’l°o°o°ƒ·ßÛïí‡r_¹¯Üµ»kw×î†ôŠôŠô prrJúbSÚ”6eٕ͕͕ÍÐmœ8;añÅÂ÷|÷|¹9¹9ÆXŠ:«7ëͶ1Ûá´Ãi‡EFùùÉüU?—9Ëœ"K‹‹EúgúgúgD"Dˆ ²¸~qýâz‘:G£Î!’7™7™7)R¨j…šHh041ö{Œ=2»´ÛÚ-í–ˆ É 91ëž/Óú+ú+""F¯ÑkKQïO»¦]×FD†×¯ù£Ð÷·ïoÞŽž‹.‰.‘'½Ûz_ï}]$Sþ¦üM"žO§@„:ê¨Ù»` Dv6ìlØÙ ²Ê¶Ê¶Ê&bï°wØ;DBCC­Æ²Ne9³œ"iÙ©©ò$ñϽmÛàNw§‹ˆ„«ÂU×F„ÏâSï~üîÇ0£Ç§äþ•à`p‚©ÁÂ`!*øB°0XѶh[´ ´­Gë ÿ„ÂàÀ¸cÜ1îÀƒâêeTZ[ùøýÇD=¹99oM%¿¿SýNuÒTšºaéHBÇL™Q ÕÂYÝ™Õ)µQmT“ä¡H©" •V’† mV–g‘I:†ÿ²ÿòÿê˜y|^Íþ-í[ÚAŽ+³‰eDzA}¯?Ò¡q‚a†Qœà+¾åV¿ª_Üàâ>÷AùÕ¨nÎ*ÿcé±—b/®YåÏØšDÿ«üOïYùÔÞ.žÚûØÓyƒýf8§(ó½IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-16.3.png 644 233 144 3041 13755454066 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÖIDATHÇÍ–ïO”WÇÏŒÈ0€€ÂšÔ ±¡‘ªMI1Y vS ±R¦YBƒ‚én'²ÙWÔ¤iHÖfã «˜6ºqb»Û…12ˆ­Í4ÙE'ø#‹F~ì`@ŠÐ€2„ÈÌóÜϾ˜y˜ÙþÞ7O¾çœûýžçÞ{ν""’û ˜s͹æŒ(67Åí))oü3ŠÏk`úÈôÑ£VÈü2óK€­[;õ±86üF|â|‘8¢ža—,‰,n‹ÛTßÃá·¿ò›(>}¬½ÖÞpô9ú®t]éâÏðË­_nrwäîÈÝçççדד××Ì×Ì×Ì glVͪYžžž€Êƒ•+Âîß½™ÿf><šöWù«À‹Ó/Nƒþ(ã猟õQ³hz¯Þks¸:\-ÝZÉ1þ8r9⎸E°cÇ.’ÕŸÕŸÕ/’Ö™Ö™Ö)rì± Ç.ˆdú2}™>‘±‹cÇ.ÆWìTò©äSÉ"µYµYµY"×½×½×½"jŸÊP"·+n?½ýTrD6lQ{´ÇÚcÓhìðßo¡ïÛKß^2ÔŸb?ü²l²l¤lúÛûÛûÛã+Që­õÖz!-?-?-ž4†šHuGu/ƒI†ž»È]ê›h>ñª ;?u~ ÌU©ý¨ýÁ³Áž`j½{ýÒú¥„ª»§ßÓïA 5Ðh}»¾]ßÊ®ìÊÆ@c ÔeuY]†ðÞðÞð^˜Ÿ›Ei“ë_­¯JÆœ;;ãUKlw;Xç­ó¡$ð¯øW6ôí¬ë_ë_'ô±#ÔSzHé¡„³”«rU.¨µ ìýꪺ ªSy”@U©*VUR”_ý÷ý÷¬Ak0”Ä¿ÿ¯‰ bWÚthS¼óc‰ÌFf¿kkÚZ¼ós…nºAùbWP]tË<ç9¨5¬†7ÊHñWmH"¬¾ñ¹ŒÎÓ{ùëÎÿêÞ•¯ìëâ•}½š/Øÿ=ÓÝ–¥–ÜIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-18-red.png 644 233 144 4061 13755454063 15603 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜæIDATXí—{LÔWÇÏï1¢.8.qËkFcXe«cÅÕA:-£©6EMÅ1·›U´£mbCÖÊ#XÙƒ1ÕV);?Œ ±¦¾J@“ nvm×dbme¦Â6¶S^ƒ2ÌÌïñÝ?fîo~3ñ‘Íîùg8÷Þs·s¾÷El.Å¿&IJ’’$îqt!yF÷ŒîÝ%¿Q•~DËh-"ÛZ‰$’È| ÞךØyÏò±üñõø5ñ' Š ÃýÃýÃý4äƒ|'Aø£ vÒNÚID“3Úf´s ÙBDò¯ÑkOµÎ¶Î&"ò×û뉈ZoµÞ""º˜1ŸˆBórçåÑ÷)])]Dügt–ÎXrŸ×çõyiñïà¼#üs´ÅMgjÎÔœ‰jJ™©d( d*™ÆËTÚQÚ‡ § ŒÀÜcsÀ¡úCõFÙ‡ì±Ñ+çÛ··oÕ»Ñ|}üú¸þ ø.ËãòÂ?“/ä ùÙ-³.°.°.Pz6{6{6Çž­8Ü6Þn­¬¾¬ŠœEN#¨R¤@FYF¼Eo‘Q}_K_KÖ1uÜ긅àTt{éÁœéœiUÿÒ„4!íä8%Û“íÉv"ñ¦xS¼Ù9¬?øå¶r[¹²Otœ¡ÏCŸ#‰|E|E€‚Þ‚Þ']¦ 7.ÜáSáS~®Ž«0ɯž|õãW?†ÈmrPõ÷vP§tÀj¡Z¨¾³%âÏò%è*«Í”gÊ3åyO³g­³ÖY«ë“ûu¤Ÿ@ï¦ÞMü_<øâP•UÙà˜þaέ8·P*¯¾põ…Xÿ:éjqµDúKð|#ß8]Âep\Æ‹§…è÷k·Ûör;×ÉurL+꟤©Gê‰õSÙ§ì‹õ@0úGˆ. -MKt¢Њµ}Z켸s¨u¨°Î´äXräÝz'ßö{œ6ÍArˆ–kQ‘ø>¹ÈE."Á'øßÛŸ±–vËËÙìy×Óçé3jW®–«€Ç8&:I½«Þ´-áÉð$‚B[om·už²Oÿz$úDŸt8}Oúžô=D¼·ñ6î|”®’aþ*ú¹E¸/Üîs—²÷gïÏÞOdª2U™ª¤Ãºv‹lE¶"£vU§êD$HÆ0†1ÃÕZ¬,VCc~ËÊ–•-+µb–Ïd6™Mæáéˆo™?iîZâ£Ç%¸}ñ¾efD»žóOÕ®Y6ËæúP}¨>ŒiÑ 7Ü€4Ë=Ë=Ë­mÔ5™Ì'óÉoþ9AŠm |Iôì¡%A»Ÿ§]¹Gî‘{bÊ ¤ÒéÀ’‰%K&”Eº»„.¡ëØj&µ¨ôçÐs,v€%xšv›-Í–fÙìéôtz:DŒÔyÉyÉy)öìˆíb»ØîŽþK2ëo u£ë4ûy€‰ÆÞŒj÷âÓ´»výÚõk×Ç´+­–VK«q6²¯é“à*¸ ®âåƒñeø±„ºý—ö<í®…F¡Ñ»œWÔUÔUÔiÉ å†rCò¿ôQûŸàsfQuPEŸÁ“P/‰þGKÔîáxí÷Ün· R*¥Rõw|&ŸÉgqÄÑ—}Ö)ë”uŠH„îz4pKÂäþofÖ²“ìâíøíw+y×x à®q׸kÿžYÿ­”0™Á„¼ÏõßëAÃOk ¼IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-28.7.png 644 233 144 3014 13755454067 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÁIDATHÇÍ–ÿOTWÆ_`+3uŠÅ²]Düu$M!Ä]cDb‹i±´R›®$5¶km\ÝZqûCÝ&–Ø”¤RÓ(K‹°kAZ±Æ/µ,:n5€tp·KF:L&LfæžÏþ0s½ÓuÿÏ/÷>ï{Þ÷yrÎ=Ï=""òdì)¸ qAbJ'þÁˆ›ŠMÅKþÅõHx%á•Á¿Àû;@jsj³6l`=¯Ï¯1úÇóéqyRŒ@r{r{Âúþ^[õÚ*Ó¯£øÓK`î2wM…aÇ©§:¿ìü’?ÂØwcßx×{׃õ¼>_¯×ûÅ÷—þ‡_ë~¬;áß<+y–,|nás‹÷D'ük1¼ôâK/ü”ôS’J€ˆ°`Që?~ôq?ëùØ|½^ï§÷×ùtþ¨´Â´Bxùõ—_7ÿ5Z0Ü û3÷gê|¡.àc>ÆaØ)”uI] 0°ž×çëõz?½¿Î§óGõ[9!"rx”ý\ö3¨t€Ð•ð­ÐÓ¡§Aë¹B.B1¥J›Ò¼šÂÿ ÿþÔrµ\-ç¡¡.ªi5Š$ͤϤŠl  ƒðL´¿úýæy›çéo0¶òk‘œZ0ûÍ~ÿ¯ÔÄÈ•‘+À¼*OåàkÎs4æÑ<@'tÆ)8ÎqŽEQ$ø ©‹Õb1ðÄøbüQa9µ±«¿¬¾z;áí½X{Æ™94445s>ã3P×7^ßx}£ÑþfÍÍš›5P½·zoõ^prrzxÅîfß;› ößÙóìypl¢)¹)ÕöøÚ îí¸·C{v²ûÐnDõˆ–'"òÏ 8Ùp²Ϻ«ÜUêÍùõóë ®[½.w].XG­£ÖQ°·Ú[í­`;a;a;¥µ¥µ¥µ°(wQî¢\lll5„]8záè…£°zËê-«·@I_É7%ß<ø€‚Ç:[:[Ô›ÐíëöAøLTDnÌ®™]£Ú! á¤ùÌSgž‚ýªÈ¯È7 ª ª ª <«<«< l¶[ÔÖÖ‚uØ:lÇ9Ç9Ç9£.Ôê õ¸%£e^Ë<(kÛ¼k󮸥u¥¥•)E)Eª]§šSÍÚ-õgÏVÏVãØ;Ëxþ‡ça¥g¥g¥697979¡g g gÒšÓšÓš¡´­´­´ –][vmÙ5pØv‡ýá-õuø:|íÎvg»áÛ—Ó.§|Ú©ñÏÇ?H}"õ í–h',;-;U;LÞ›¼UÎ:g<þ“Ë䂃{¾{ð]ƒ ÎZg­³BþöüíùÛ¸­ÁÖ`k€êÕªÀDåDåD¥‘?b9b9b5¹kV­YeÄ5WìÅ96{l60“r6å¬jOT»§§o\é/î/¹–5<:<Ê[Á®à’à™éNí6u›DæºæºæºDL]¦.S—ÈRÇRÇR‡HÊé”Ó)§EVô¯è_Ñ/Rì-ö{EÖ××E¦2¦2¦2DúöõíëÛ'R²´$£$Cô1Ã"Þ’…]]"2Ë_ì/¾qUø4z à÷ßy¦ÃÑS9þw¯»ÜIî,wÊý[÷³îgaúÎôé; Y4‹fñÆñÆñFÐDM@íQ{Ô¸¿íþ¶ûÛ@¹”K¹À·Ä—éË„ÀùÀH`Ú{Ú{@o”ÈÎv~ ûYýeÑ}ÃðÝWb>Pé*ýʫ¼ LʤLqrT¨Û궺÷qMáŇwEú#ý¿ð±ÈHÀŒ|Hˆ}‘‚HÁƒ3{…ð«I¯&ý?çtÿ•ìí⑽=š7ØÿzMC/pe;IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-4.5.png 644 233 144 2463 13755454066 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜèIDATHÇÍ–HÔwÇŸ3Ësä/æˆXq¡ûc°d²`Á Êè–z`š-Êc—ĺˆ”HY¬þhDb¹’ÂR6Ö$ñ(JÁZ™¿b \Q˜ÉÄ LòÙyæé}¿ßÏkÜ}ï®ÝÚß~þ9ÞÏçù¼ßožÏ=Ï÷# ""©¡_¸•q+ã’ƒ8îëHܺٺ9ó× ®ÓÁRl)~ø-¤Ô¦Ô¤]H»`<Š`sßÌ>/áÖ3ã’*‘@Â¥„K–Ü> Û³¶gYß â:!Ñ“è™ÑÀuÙu ¥±¥‘o`´w´àeîË\ˆ`sßÌ7Ï›|Ñürô_ú"°øÚâk–'°$a‰Øì6{†;˜ðw: Ï=[¤â@–²TåÓLc®‰(lî‡òÍó&ŸÉoê™úA?éÒ7ˆ@‘³È™x>xàÑ/P¹¢r…©ðÇ8ÆRЦµi}‡¾ƒ9Pª ˆ`sßÌ7Ï›|&¿©gêýÈ›w[³ ¶Y·YÆzðê­z+€Ñb´Pª^Õ£Œ•Æ2c±«›.º@ÿN¯Ö«AÿHÿBÿ¥ïšïœï$€COÕS£øý%”`¬Ùu•""þ‰£‰£Óñ0¨êÀ`7ŽóšÏpáµK9•3ʈ¾(ü”§<¼xñ ¡E;7ÊŒ2^‡@AX/¬ô2V×å‡Ë ÀÈMÓ4PçT«j F†Û†Û†ÛàVÉ­’[%± Ü Ü ÜO£§ÑÓ§ Ož.„³ží:Û“'§&§PÀžï˜z!ýŸ¸`Ý>½"²¾b}…ˆøED,ŸÈÏ–þ·R­T+ÕºŸ²bVÌŠu"±qqqøÛÚûkﯽ¬ë\×¹®°Ûì6»Íðyž¯çõ¼ïÏñ^͇„%¡~ÒWÂ3á™ð¬#O(±0±0±PùôÈÍ#7ÜÔÆ>|2ø€"|xŽçx èt?˜çëy=ïÇû‡â%}õj~d't ]BWÇeÞÀvÃvÃvC^Ø>Ú>Ú>ŠvMKÑR´ÈJ™R¦”ÊeŽ2Pr•\%×äó|=¯çýxp¾eœN¹™›¹‰¤}Ò>ißé_xAÖ¬Ò¬R9W'ö'uºƒòéa×° Ð:äT9ÀH€ ÉCT-J‹ÀˆÜ'÷Z‡¼T^ èõÁ~¼?ÇãøœçG#F<üÃ<¾ÀRaÙoÙ¯Móöz½èöT¾P«aØ dc>/µ~½:°>Ä”/´µ¬·×{Ò{ý– ËaËamçÃù‰‚"(‚âúD»­ÝÖn[2ö[—œ—¨å÷+§¬œÂV+ž¡mCÛ(FÚq1îb4íiÚCDo4¿Ùü&QsZsÑGw!™DD¬›u]|ëâ[Dõkù¯åD4r§åN ‘°ìÞŽ{;ˆ¥ÉÒDQ&lLØHZÔÉHD‚Z/7ýxâÇlM€ßŒÞ ´ž¸Ùq³ãfãÀÓOJž”èO*Ã:üÑðG“¦'Mï=¢ ÀØ»cïšãU[«¶@½¿ÞoŽKßKß›üÁè»ÑwX|üàcïéŠÞc½Ç·óãD+óæÌ;¨ø”vå‚r@ù#ý‘Уÿ†y+÷Tî€é{§ï5ÇO=<æŸÜ׎jG@½®^УWJ»ú®ú®Ïùp~A¢øÁÞho´7R2•L%3 ^‹7ûmÅmÅ $ ‰à¾ê¾jί)]S Ñ­Ñ­~-ý,ŒYuÍuÍžÿ,/–øö¹ö¹ö¹ú¹ýŸh~zuzuz5Ú†Ù0 €ó8óа9È0¨d(f"¥¥°òÁÊ/{—6FnŒ€ä%ÉKàTå©JxÏ÷ž€?(ÆÆ¼Æ<@K LƒWÛ&Ø&Ø& ó#!WÈrGó«îDщ¢E& DŽgÂ÷ßÛyo§Y{—¾¹ô™ œ.§@§½Ó/j_ÔšÓ/&¾˜l1[ (窪ªª ¼k‡êoÕßÒ'¹¥²T–:ú˜Äùâ|q~©“Ö©Ö©Ö©J’w½w½w½Þ`P[ο–§•§ÐÞþüíÏ`´b´"„¨SvÀ¤Ë“.@ɬ’Y¦´ïçÆŸ¬âZ»½v;ü¾`zv鬙³fªú Æ‹ñbüwý“““M$]—®K×]]úoÏŸ5^Ù `fª#0OxæÕÍ«à[“¾&ÝLp¤z¤Úìm=Újšü «d•ú¾ú]qsq³±Õ…·?ØüÁfÕ§Ü&n·ÝÙðÇð·ž[âש©©Çy£¬$¹$Ù˜§<á쩳§ MIMI0äÚí yf©´Z[­p²üd9 l¾šx5јï™gîwN`¾D€àœ‚sx›Ä&±I¿;FPü§~¥°VYÃ\ÌÅ\\+ê'žO…§]»»UAÝèà{—4Õ¯bõ¨´åÚNm§!¥.WçÁ΃€5ڲɲIþ£>ɽ¢Ct8²tj¹”K¹’ÅàšA”!í%7¹ÉM$öˆÄGŸ^Ô¯ÖË*Ë*9ÖûY[M[Y»Ú;Ú;f‚P à¢ó¨ßªßÚ†ÑöÑvãq6ýc“m“MÙ­ßíÏ¥^©×Sž°+aWÂ."!KȲع »ÍœæÁÏ b›Ø&¶±ºi%ÓJ¦•EFFzÊuífdede(»9 êPª~xà@úÐgðVf*3•™†«T/¨^ -×ïò؈؈خá௥èÐfW¶žX˜ûS¨o‰h×{ÎЮ£ÌQfÒn¬+Ç„Ônµ[í6´Ø‚´ž1-cZÆ´hkuMÆ1BÌû “â×aü¢èÕ±:L»k_¢ÝOƒ¡]¹AnŒWi(a(a(HHHPfèZ<+žÏ~¹ˆK-(½p‚¿¡×˜±€70´Û#ö˜´{ÈrÈrHŽõº¼.¯ €~ø1À™:êuŽ:ãØ‘j¤©¦%ø—dÌßÃpƒqû:‚áÆ Þj÷ÂÒî²ÕËV/[mh׳ȳȳ ä5}'X>Ëgù™¥¡0B_.£ÿÒ^§Ý¥¢StŠÎŽ9œp~E~E~…V•2’2’2"7é[Ý#öˆ=ŽD:M§é4цEÿ£…k·<Ô_ö/¶…ma[Ê¡ÊQg “…ÉÂd€#FW²ú¬>«H¼%Þo±ú`ᆰû¿Y¬þ-›²)[ú%4ýÙfA4AØv…]y4%Ÿî Û™ö°¾¯Ýê¶íªJ—›RIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-20.3.png 644 233 144 3115 13755454067 15025 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ÿOÔ÷Ç_wpÊY´°0ˆÈ¬1™‚0ÒÎ šSkìšRCbZ¾c·… ¹,Yºi¬´Š L躲ÏñÍVÚ m)b‰=pîÂ:¾èU§àð¸/ïÇ~8>ë_àû—Ïçùúò|¾ò~çõz¿DD$få+ OÒ'飂X_²G˜"L›þÄM~Ðè îü¢¢^<ÿâù€=„5¿¿:_$Ä¿ZO³KŒ„ k­k­º+ø}xkÛ[Û"~Ä^c‡±cÑe]e]í-í-¼ßýý×w>Þ !¬ùµx-_ã[Í/ïÿ@_ =†Ý¬]³v$¿žüúË¿Œ¿ yoä½p/ì^˜Ò€ˆ$Ríæ™G[³«°æ_‰×ò5>_ÓÓôƒõÄåÄåˆ@þÛùoÿL°·BÍúšõšž·8Á "Á7ï›ðù‹ð€º¦® C!¬ùµx-_ãÓø5=M?XOè(]""å‚ù‘ù¨x}vo¼7×¼v¯ïJ¥JíP¯©×À7é›ðM€:¬«Ã„Ö3Ì\¹ƒŽAà{A½ª^ÅMýôƒJP *ØÅ.v­*$•TRd’I™Õ¢ZT‹À8Á •£rpsi…¿|EoEŸ»ÁzVv¬éKu¹\W®ÓèiÿZ?::: õ?©©ALLL‡¡ÑÐhh4ÀÄØÄØÄXȰl[ßž¼=y{NÿâtÊé”㡽ÅÞÒSÿ,(ÐŽ¶éK ü\Däf5t6w6Ã+Μ¨â$wbSbžœ¼œÜœ\Øèßèßè‡îÑîÑîQÈÞž½={;¤îKÝ—º6_Ý|uóUx0õ`êÁT¨ á³Ãg‡ÏBÌ™˜31g  ¡àTÁ)HK<šxÏ¿ÿü¸êq•*†ŽðŽptë¿í…úê•Ü·:½±½±Pó›êÌêÌ@vFvFv¤—¥—¥—ÁÇÇGÈŸéÉôdzàœíœíܪê+é+é+K¾%ß’½‹½ ½ ð³ŽWj^©Û¹wóîæ<ùüÉçè´DZ”U–ºÆ²ÆB µîbw±HþÒ^×^—¸J•¾Tú’HÊxÊxʸH¼%Þo)Š-Š-Šñ7û›ýÍòlEµDµDµˆøÚ|m¾¶}÷ÅÝw_©M«M«Miüe£¹Ñ,²|fùÒò%ý_ô¢q‰nn‰H‚¾B_AŠ^ýÝwÀw@7¦«3ÔêDîœr48$.ã‹ô¦ô&‘£…µ…µ"V³Õl5‹l1l1l1ˆL L L ˆÌfÍfÍf‰,Ì,Ì,̈$U&U&UŠ`ÆM¤®«®«®K¤0¦0¦0F¤ïJß•¾+"*CE©(‘!Óн¡{'b0 ˆ¨-þqÿ¸nL¯~µøñâǶ"æa“È7ìÓöiJ<žMžM²Üs«çzÏu‘èŠèŠè ‘¥É¥É¥IÓqÓqÓq‘ íÚ7´‹˜–LK¦%‘¬Ò¬Ò¬R‘´Ö´Ö´V‘ëv¬Û±Nd¡m¡m¡M$ö½ØwcßÙv:¥*¥J– ¿{çÛw¾¥D¤ÛÕí ût)w)×vCø0ØPY[Y O}Á.ùïug¿³îãLt&¢œUÎbg1<5>5>5¸ÀpUº*]• Ž©cê¨8§â`öÈì‘Ù# ¬Êª¬àÝêÝêÝ ÇŽ¡üß-7.7†º{ErEòª® þ„æhseeÎxU’JÂýÌrˆC‚€+à ¸VÍ«“ê¤: ìg?ûWÙûTŸêu^uªN•§òp«ð ¿šsÜtÜ0ÎçæÃùÇÿÍ1íø(—ß›«ÍÕ Zƒ“YÝðGú#A}ê›óÍáåO|ÅW(¾aAPÃjH —¹Ìeà.\ Æ”MÙVnOPüÎ?âÁ«z}÷}÷O´ÉÿfØ›a€ç‡“ÿù½+ŸÛ×Åsû{>_°ÿíuá9SIùÔIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-70-red.png 644 233 144 4171 13755454064 15604 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü.IDATXí—kL”WÇŸ÷2 #.HbEÖ"¨«x-+`hv4Õ¤"©˜@¬´»Štè„JA/›µUCKÕÔœA·%J³ ­ˆ©¡v%q-I½0êåâ ó^þûaæ¼óÎdW³Ù}¾0ÏsžËoÎùŸ3Èo±büšH{¤=ÒÎý3ˆŽhhhÏ_)Ê¢,Ê7ŽS:¥S:à_VI$‘D桾ÚÈòY=ëÇú‡ÎãׄòèùÊ©œÊy[èúìEb»Ø.¶Ûq»¹ÝÜn $&n4n4nÛx{ãí·ÂÁÂÁÂA`Sö¦ìMÙAŸ­³|VÏú±þlÞÓyˆÿ}¨Ÿt„çÇùqg:Û¡„Ò„Ò„Rù­æžæžæÕ86<6<6 @€<Á<à„N@óë,ŸÕ³~¬輤#Oç#Ó ÞÅ»x—óÖ »;»;»[Z5àð ø0€€©©jªš I®–«åj@Î3ä @¶ÈÙ¢óë,ŸÕ³~¬¿2ß4CCãlœ³‰õb½XßÒÇ Ìæ*s•dÑÀÞVV(+0&µL¶N¶ªSJ“ÒLùÁY”EŠrI¹„ M©«ÔU€êô}çûZ¼W½Wõm5KÍÂK37š÷š÷J6Ÿñ0>2Ü7Ü7ÜÿÃ2–`ª3í3íS“¿:n8n`$ÐgL> Ê®®Ô %$N¾>ù:€±¤”¤Àï€xŒ·Œ·ôñºñºqøyËÏ[ÀToª€éצ_Óå•_-¿ 1d£¥GùŒŒãa| tÿ†ƒn8üfò€|N>ÀÍBÞoŒttë{ïÿ`ÿ²'e>þŠå dÆgÆëã_¾ðå :`÷­÷n½È!ÀÆÃøøÀ•ZdÈ3äò´;Ieô1}LD³X(bfÄL"¢ØÜØ\"¢Š "¢*¹J&"jœß8_ÿ‚ÜX|c1‘Åj±êãùŸæJDD}ÔGDÓ~ØûÃ^":òüDÚ m†6íÊ/ €â¯®W«‡¼¼—ór$;„Âm§—è%"W©‹ô½jŒ5F"¢‚²‚2"¢ÂÒÂR"¢ñìñl""—Õe%"Jø"á }rJ9EDS”I™DtwòÎä"þ¼$$¸n§ÛIŒx oá-¾‡-n¯>¨E¾Aß ¼,mË÷[ ·ÊÚ/ÐqX¶×ÆïŠß¿‹ˆ7ófÞÌ Ð•0Ìé¿EÂ=ážpëH®L®L®$2”J ¥öZM»9æsŽ\¡Ýq«bU¬ðÂ;ìã1t—J^(/”µxxÅá‡W¨kY?CŒ!Æãšôû¦i¡'Íu†=qaî•Pß4ͯ]Ç™ v­ÕÖjvc¤)&¤ )CÊPP‹ýèG?`êêêW7jšŒæ£ùèW÷„Iñh_$== ÓîÆ£Ý.{WP»R—Ô%u¯ÒDüDüD<°dtÉè’Qy¦Å6¡MhûËj&µ€ôÂCϰ`kÔ®[pë´{ÈtÈtHŠq´:Z­¼ð‹QFjí°vX;‚ÏŽØ$6‰MýI¢®…Í ÄÉø,Àpc¯´{î?i7w}îúÜõAíÚWÛWÛWã”]ÕN‚+抹â«BÇðÃærô_Ú³´»Fh„g.®+®+®Sÿœ:•:•:%ÝÔŽÚ-¸·5Z¨…Z(ðìްy‘ô?Z¸vkCýÜ»Ü6n·  * åwü\~.?àˆ#Ž.^Iô$z=DB¯Ð+ôr…Ea'÷³íSåQžØºün ¯ò*¯\'×Éu>ø­?žb;™°¾Ï<ê©)ÓµÎì‹IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-118.png 644 233 144 2573 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü0IDATHÇÍ–]hSgÇŸ¤IŽÁêR[ Vc°[±ëØØÍèUaÕÁ b5Ô’¢Lʆ/ªƒ}([+cS/ÊZq~ P;ÜAÖ6®V§“ú]­…;•[›ó‘÷·‹ô͉víssx¾þÿÎ{ž'¯€ˆˆ„¦žÞ°7ìö½»ñÌøàÕCiŸžjOõµíðʯüךךºéú:¯ë³ûE\ül>—¸ã˜qÌS9å5oÖ¼9cnÚÿ.ÁãÁãã6løuïíûÛ÷ó Ü?{ÿ,ÀãÊÇ•àú:¯ëu¿ÆËÆ—/^àÿïþß=C`Œ€DÞ¼_¼)]p§–U-«ÉÉQ^pF\rU% ¶³|Ÿª×ýOãk>ÍŸÖ#PðnÁ»"°¼vymðçtÃÍ_`ë‚­ 4Ÿuøš¯É;a'œ:§Ž$¨¸ŠàÁ®¯óº^÷k<¯ù4Z<¶ß¿‡Š¢À°zÀv†!•km¶6c©¿Õ„š@ñ‚¥f¦f¦f‚:¯zUoVü±š§æ¡ìa³Â¬ÀR¯ÛvAæ÷0¹Ò^ijŠß=J‘Ò°ƒÃÁá„B!à7>tâVÄŠ0Áo 1”¥¤ƒ:À‰;q'´ÓN»›VI•TIàK¶³=«ï@*œ 3Á’4>  “Á¡àP§õL Ûw6îØ¸x z[}i5X .Oˆ–5-kàJÉ•’+%L³–hK´% —«.W]®rã}£}£}£ÐôyÓ¶¦mpë«[m·ÚÜ7®ÚÒ|þ)=SÂ.maÓáÕ‡WgÊ×Ù;“eÉ2’±ó±ÎX§{à§žzvê™K¼j窫vºù3ÆãŒƒK—.……5 kÖ@µSíT;°è­E¯-z n~tÍsÍCRó©È¡Ð¡vi‹Àì®Ù]ê?Ý;wïœKh–M>™|G^?Rz¤"‘ÆH#œ,;Yv²Ì­;Xx°ð`!„ áè^×½®{ôç÷ç÷çC¡¯ÐWèƒ=²Gö,¾¸øÂâ pñÁ…Ž Yßb×ÈÓ‘§ õxEr–å,ã ù$„E䤈ˆ<ôo´ÚDjoÖö×ö‹Ì™?2Ddr×ä®É]’±ºuêˆ-)ZR´DÄ2,Ã2D¬˜³b"fŽ™c戜n=ÝzºUDDNÉ  f`Ê¢ÀÕÀU­Ç+’:‘:á¹!Ž]eW‰ˆGDD äÉ“5»Ì.­Ç+’¨LTöý%¾îxw\Dž‰ˆ°ÞS®æ¨9bêÎYwgÝuWÄïóûü¾éÂB»C»C»EÆkÆkÆkDbõ±úX½ÈÜÞ¹½s{EòWä¯È_!Rr¢ähÉQ‘ºý±ÆX£Æg½wïŸ+ÿ\)’Ñ3m*Í©)¶oØ7Ü©kûvì[0;ÍN³súTŽ555ƒÙl6›ÍnÜ®°+ì ÍÍÍç3§ÉiBsÀ9\ùß©,ý‚÷ƒ÷>¸íÜv2¸Bjuj5Y’z–ž³ &²«Ô#õH=5Cy”'+^jcĺÙcååÀxðNðδ=–µù‰QHe6ŸÓN½SE =ôLßüÀ>ö²7+¾8q”úÉ8,~rjZ´z°£¾¨O¿©ç6ÿKû_ùÒÞ.^ÚûØËyƒýùÚ½\SBIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-24-red.png 644 233 144 4224 13755454063 15601 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIIDATXí—{LTWÇϹ÷•îífWã£>(Ĭº´ âŒVG[­‘Õ.¶-©MU´cccJŒ(‹(4”bðÑ)Ë ¦T->qã£ÍF4Ým*2¼¶šŽ( 80̽÷|÷æÜ;3Íj6»¿˜ß9¿ÇgÎùžsBFm, 1a¾Ñitôq` :¢!¢!¢aÑ\I‘Ii>DRH IF§Y1‘ˆD$î¡>+æñ<Ÿ×ãõCû óCy‚ùòHÉêBçã^”¤©¡î!ÝJ·Ò­ˆ)¶?¶?¶§WÞ^y{åm ³;³;³X¶:mušîóyÏóy=^Ÿ÷{2æ…ú+„a@èHá+”““£|P}µújõUöŒ§×Óëé B„/1ˆAè@ ùyÏóy=^?´ßÄŠ'ó‘Äg…¡Gèé8à ¤]N»œvYþc»¿ÝßîG;Æ’XK‚¬ä+ùJ> ÌRf)³Å¦Ø[˜çñ<Ÿ×ãõ5àþ‰Ïjh´ŽÖÑ:B¤B©P*t|Ï,Å–O,ŸÈ6 ìCVÆÊà‘#U#Uëðwú;Œ(åJ9À +•gÀ€ a` €ìðûŠö¡¥FÁÃ-Å––²÷ç<œº ]†®¥à‰‰‰l’ë«ËÕ…¾@RâÿÙÿ3 -€ÞBû*߱üÚm¶F[ ‘.I—¤Kµ=Ú…¿úÕ’WK”m€ÇáqªÝd6™áƒSÈrxKŒK@h‚O3öìůÍ3Ø5Ø o4N=Pñ~ÅûúVçÜXwvÝYÕ«抹bî?׌úQnj Ÿ’¥f©¹ã0O°çç}œ÷1Ë®|tå#@Ž9øüÁçÁ€šèšhGƒ£ÅŠ€;w2‚}òZy-(J d;­­ðþuàø§Ç?Å2í -Š„¢áEtGÇM¯ojçkuRçÂ*ZKãh@Ag¨›œM'='=pjÚݦ檹Á@a+ÈÂÜ ö{G_ßžÚžªž*Àic#oÖVr·¸[Üm·hh6b#6)QgM'é$]ÚMêH©#Dt‹7ĜԞ֪1A”M®mÃmÃÁÚõ[ýVPÆ)ã0VÀ xN”¢`k˜ƒ9à|àÏ×׬P¶i/Рä’\Î=ñ[â·Äo!D°ÁBè²9æ˜Àß5â]ñ®x—žš´}ÒöIÛ 1är 9Î=švÓ-é–te'Uíª]µÃ'œpx„Gx¤¯¤2U™ªLÕ×·|Nùœò9,C{ËM“ÁÔ3<ê'F’£ç¶žÐ0÷J¨ŸiH6$’]GuíÚóíùLS£l’M²IRï«÷ÕûúµÓ2ú[ÆÕÕÕÂVjšŒ¢…è7w…Iñ³0>#yò€X¤ÝutÝ•´–ÖÒZ~Ï©›œMÎ&g“®]¹In’›tåÅÅÅ3úgôÏèW¦hZ¬ëÅú²T.µ€ôÂCžbz/ k×-ºƒ´[šXšX*›\µ®ZW-F…úÐÏIí§ì§ì§ôkGª’ª¤ª–À¿$Që'Ï< 0Üx›ížøOÚ]°|ÁòËuí:S©ÎTÔŒÎ3m'hÍ¢Y w†¶…õ¥ä¿´§iw¾X$‰E³8pVAVAVÛ—4’4’4"ÿCÛj·èÝöâ â kGt…õ3’ÿѵ»'Ô_ÐF×Óõt=@“Åd±:M/ŒÆ”PBÉÅ+f¯Ùkö"^¯‰×èù@âš°û¿™Iûd%Vb•¾Þ‘-0  çè9zî_¿Ÿì Û™ö°ºOÝêBê}—€n@IEND®B`‚routino-3.4.1/web/www/routino/icons/ball-3.png 644 233 144 213 13755454064 14352 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷Ü@IDAT(Ï­’A Ã6ÿÿçzâDˆ×+¬!€@ [²{$°[‰¦à‰¯×à„Ëù+ŠM”MW¸%¿ìÔm‚/õï{”–IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-49-grey.png 644 233 144 6177 13755454064 16016 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü 4IDATXÃ…—{PTG¾Ç¿Ýs`^Ê ¯(ÙQÃñ QXA `RÄD-%ÆÅ%å¸àÅÝ¢ðÆZRX°P•¹Þ &¼LnHÊC6„7 Þ•Gb‰X°SòHID@˜™3§÷f$åV*¿ºÎé>¿ßçüúÛÝ¿&YYYYYYPbÅ + çF¹Qn”µd}•õUÖWl}ΣœG9ö0WæÊ\Ïÿ‰÷â½x¯ “æsƒ¹å¡å('ðƒü bƒNâ$N²<ñAñAñA’Á=är{ÊÉ™#s-Ë^—½.{]ÛýÜÄÜÄÜD2É{óÞ¼7‰]á:ì\Jú0¡¥ß9BŽ#tX-‹–Åçvæ4æ4æ4~3n™´LZ&[o›M¦À wå…òBy!š‚b‚b‚bHF°S°S°°Óm§ÛN7ÀñìèwŒw|ïð÷Ô¿=ž#¾ƒÇÁÇÙ3Æ\˜ sâÉ r‚œð.y‹¼EÞ7./V.V.V¾àæÞêÞêÞj;333H­Û´Û´Û´d¿8Cœ!΀ ïá=¼L0Á IHð<žÇó0™Uf•Y…ýÚvm»¶Y¯û]÷»î'œyüÊãW¿rü#™·Ì[æýG‰í„í„íDt!Ó0 ÓŒÆÐ0rnùÜò¹eíhG»j-×À5p íW-K–%ËÒ ¯©#Ôê>4îtÜé¸ÓÜ7J£Ò¨4B xÀ<óe¾Ì†0„!k°k,` 6c36d˜ “að˜Á fÀ\ .èë.Õ]ª»ÄÇëoéoéoq?9K¥ÎÒ±fþ ?¸÷öb/ö>˜§Òni·´pZï´Þiýÿ05›šMÍ/¼¦ŽSÇ©ãøýšDM¢&‘ûI)SÊ”2x·…ÛÂm§q§Áa'vb'@äDNä'ãd Écò@ÚЄÂp¶£¶£¶£€bZ1­˜†‡Ã¿ú°ú°ú0¿ßßÁãà#9-9-9-±;-Ý–nKws·Ë¼Ë¼Ë<óI~˜ü0ù!éV~©üRù%( ca, .¤“t’ÎÕLá |/„! axjLÏôL)2E¦€Í­ö B‚ÐJZI+a4œ6œ6œ†P*/•—ÊY°QaTDçììüZ0e~Ìùýí°5Òi¢îEÝ‹º‡; ³Ð!t«€LË´L 8¦Zß®o×·3¥3¥3¥« DMÔD ÌÔÌÔÌÔ===À˜aÌ0f¨”J©Š„"¡.ÊKÊKÊKpŽê‰ê‰êAŒƒÇÁÇñ>¼ï³;ÙµÖµÖµyÛ#·Gn$%öx<£ct `'ÙIv d€ £ŠQŨ(t+t+tÞškþ­yÀ#Ù#Ù#èsïsïs®*®*®*y¶<[ž Ì7Ï7Ï7¡i¡i¡iÀ¡í‡¶Úþôÿœ·oܾqûFRrcæÆÌä-F-F-FíNæÌ³æYó,>ˆ ˆ ˆE†´KÚ%킉¥³t–)&Ť Kd‰,†Ï Ÿ>êòêòêòÑ~Ñ~Ñ~@2$’ ­fô»°ï¾ vïݽw÷^àPÒ¡¤CIÀhøhøh8P–P–P–m Ú´ØÀmà6pटK?—~Ó¦=›ölÚƒŒ{³÷fïÍâ<Åûxï?ZM«iõÓ8bÏâY<€iLcz "¼"¼"PQQ\ë\ë\ëë)ë)ë©Õqæ+æ+æ+€Çx|°ú^ATA¤#éÀ£3Î<:ƒgMLhMPŠR”?*òy‰¼Xq—q—qFø>…OˆÔRæØnšŽ4i:¬½¿öþÚû@|J|J| À'ñI|€ë¸Žë«‘öDï‰Þ |ïñ½Ç÷@åÙʳ•gªÚªÚªZÀÚgí³öLÅTLµºí­hñÞâ½Å{¡jª¦jVC%ù’|I>_0²ndÝÈ:VÓ;ß;ß;|’Oò±4¯Ÿ×ÏëÚA;(`÷ó¹ŸÜÁÜùÃE§I§I§Éé· ß.|û‚&Z­ŠV±—c/Ç^޽Lnòm|ß&ŠÅŠbAúMý¦~à™ê™ê™ x–{–{–¯juöÅÙg_Æ; xMyMyM^^^0õ­í[Û·G+M•¦J¾—>”>”>\~…‰˜ˆ‰‚ŽÂþðïO¡´œ–ÓrQ7½@/Ð t‚NаÈ~”ý(ûhwowowg[µïjßÕ¾‹+Ü>n·Kx /á% À9À9Àð,ò,ò,úÕºõ‡?ü·j·j·j ¨+¨+¨ë) Ñx×x×x²¦ž¦ž¦^½’ €ˆ2BBHH P€Ne/ólÁ+u#÷7RH IáÍTE£hÔ™h †5¢àOò y†<ÈÈ]r—Ü…Qˆâ…xABЯ@0€€ñŒg< f{¯Ksqsqs±-}®d®d®„»(V‰UbÕ•ÜÍù›ó7çtÙÈF6¹Ša c˜vÔ£rŒcãü}¤! i¤! > > ¾à$Y’,I¾’;ç6ç6çÆêuŠ:…-Ý„“p3ªQjKXÂÒ¯€WjF;i'털K×¥ëÒ±—ïhïhïhE+«ÿÁ²¥ÊRe©:ûáýìûÙ÷³¦c:¦ƒÂ±};@Mö¶ZX#¬Ö@ÑûKï/½¿–4Kš%íì‡+G«E-o¶¼Ùò&{™¤’T’ ±ðµðµð5˜}õ‚=aOØ€ð„'<–¦uÓºi®´îhÝѺ ù¤|R> »„]®³®HïÁ²]ŠíÛj¬ã Ž·_IÄŽƒÅ¾ï ­hµ¥“PJB_>´rå¸ñ÷•“Høóqá¸p\ áÛ.l»°í €0õ§þÔf>ƒÏà3 þÔ÷SßO}m›'C&C&CDC’’’\Y4g~J„¡„»hŸÙ¿8f,77777FGFañTCví¦Ûµ{Ñ®ÝoÿM»ÖFk£•?e(3”Ê £”RJñÄ‘‰¶¥¶¥¶%Áô äAɃÑ$S’)ɼßdž0O˜'2?zuèÕ¡W; ÚþÌèà{ ú °c€Ìî Ó®Ý¿ÿ›v½æ¼æ¼8CmVmVm–-Ý^§*´nZ7­¾lïnïnï&ñ²Ù€lÔ‚ZPÿ¹ƒ{›{›{{iO°O°O0µÇ{ÝqB=Ë%ÂoXddddd$xû£–93gæLþsrËä–É-ø_ÛFÛFÛÆÛ¼ØGì#ö9R4==íVoè7ôúÙÿôVôVôVØÂ¬ Ö«(Í)Ü)Ü)ü¿T¬Œ•±²ª&ˆ!†X¤Ç,f1+<ï˜{¢øgy~Ç~C»9hA ZlÙ¬5°†Èaz^£×þßgùÀòå§§§Ú/Òˆ4"Íõ[¾×|¯ù^Û©Ö ë†Éÿ Ï Ï Ï±Ëv¿v@ÓoqPüŽ=£]ûvaËF*R‘ÊõD’HÿáËZX kùk’t“t“tí‹ÆE㛄óÂyáü©_Ž 8¬ÂÇîÏQX.ýǿƓÌFçîýIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.0.png 644 233 144 2565 13755454066 14751 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü*IDATHÇÍ–mh“WÇOÒem¥Ö)gií¨8窴Rð‹42‘øZ¥ŠEenvúAë¾¹¡Ð!êPæ nnঠTmQŠ£ÓªqS\»iØjçª&Ø6éjL]ú¼Üß>$7OÜÛgï—'ÿsÏ9¿?O¸ç¹""òRê)à.r¹ó“Ú]ïÄsæçÌõÛ¤Þok™kY×÷ù¸ÏÆȾåh½¯ó3ëEœþ™<——Ä dË>æò¦ô6XùÆÊ7r^Nê] ÷D ïžz÷@Ó×M_³ —׆¼C^p´Þ×ùº^÷Ëì/ÛþÆÏiÏi×=È~1ûE(žW<¯ô½dÂRX²pÉB€Y²”¬ <åbÄÐk0CëýT¾®×ýtÍÓü¤‚ê‚j¨YU³*÷ËdÁ­ÃÐ0©a’æ'€Oø„<0cf ÀZm­&ꂺ€ 8Zïë|]¯ûéþš§ùI?òìûé›P›]› ÄŒ Xq+j²Ùh6b˜·LLPv‡}ž‚³¢D‰:RÍSÕªÌ>kŒ5¥Þ7»Ì. °[Ý?ÅKó%ÓÐÔÏ 7œ޽ÀH÷ãîÇéþ Ô å³|Œð;Ù™ad;Ø*¬Â*œŸÌd&…R˜ŸÎ*V¯YÛ­íI[ÀþìŽwÇ!ÍOùIÛ6~´ñ#ÝÅž©¾1öûpû•Û· `OÉž’=%ÐQÑQÑQáp퀰ŽîÙÚ³µg+ì›°o¾ pï×{÷:~ê7ãºqÝá9ü¤Ÿ”±ŽàÈð‘a°Pï¤*7gÞœrs ™Ef‘ ÞFo£·ŠüEþ"?9†ú'öO쟕Ó+§WN‡òÖòÖòV(k/k/k‡…Þo:=¡š4/É×~òÏçŸWÇ \®ÛÍ3ëäÛ'×\ þƒß‰Oë›Ö7­vîÝ=êÄ >0 UË«–W-wâ³¢³¢³¢ø"p0pЉ[‹ô¯$_ûq‹d-ÉZÂë"žfO³ˆÛ‘›Uª©9TóUÍW"õÑúh}TdÆÞ{gì)ÜU¸«p—ÈúÞõ½ë{%½¬«ÖUëªHÞá¼Ãy‡xþñüãùÇEwww¸ü™äi¾öã±[ìׯ"æRs©ˆúEDD \Ÿ¹ºŠt}×u¶ë¬HE[E[E›ÈŠM+6­Ø$ÒâkñµøDÛŸ¾BÔ¤Ô¤aÕ Ú¤6 z†Ú 6  ø(>"øl‰FÑ(A·èfÝL,¾ ‡‡Qu‹š¬&/|°›Õjµ ˆ¨¾q”Š¢(ù×›&M“³+À›éÍúØ® ©9js âÃGüÚ¶€¨u¢nI¼„u¢I4èús|ˆðÃØû±÷¦·¦·³+d>ÑÄÚŸ@}S}ð@/Íê õ„ñŇ:ìvxQú¢ôEi¼þøÀøÀø¸ì.»Ë¾þÛøñ;àªv5¸b*nŽèñ¾þXý1y´íO¢‰y9ê´;Å7áË¡‚P¡Ú¿j]µ.ãÀKKKâ…+‚ÁŠ Øl6›Í¶î©ðTxÀvÃvÝv}a;¤Ÿ‹è1ât;Ý21O£«¯~,zøåͳ7Ï ¢ù‚OÁOA¸ûåÝü»ù3š3š3 ºt?è6üZk[k[kA¹¢\Q®Àî[»oí¾ƒ÷·ö·öƒrV9«œ…}¿ïëÙ×càz…,©­-È|ÈZ•µJ 3S3SÀ3©_Õ¯››77on†G#F€»ËÝåîkµÀZ''NNœœ€ª@U *§N=œ‚¢Â¢Â¢B8½óôÎÓ;aëú­ë·®¹þˆ×gNÍœ™Q±°¿È_ü x¥ßÖoÅCÅCÅCàêuõºz¡#·#·#R<)žlÛ0¶a Ò§Ó§Ó§¡²°²°²²_g¿Î~ æ6s›¹Íh‰›ßß(½Ó«z†¯ÌW¶¨bÑÃp€?¢g¾6Üî#$Ë-å–r ôï;ßwÞ Ô¬šU³‚Ãëð:¼Pæ(s”9@¤‰4‘"Oä‰zK&Ã/Ã/Š~\ \‚y÷¼{ÞßÜ!KȲ@°*X¬ZÏeC°*x0xz›ÞFt,éÅ ú‹oeþ50ùMþÙ0¦i |ÛA·ëvæ"7f]ä"A¸…[¸jª©¦™fÈ#<#Â#<@ g8ü£oÒ71ÇÉïÍðfšÉgòÅͱ˜ÉOMjM* Ctò?מ©Úí*¸qÇO~Zh¡H'´8TТù4*éaoØ+·U7ZMRM’¬Ô¢É¿lÿ+—íëbپǖç öH’ÝÌy6AIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-161.png 644 233 144 2573 13755454065 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü0IDATHÇÍVHÔg~îÒNKïG5é±%X—SéÇ¢%ÝÄ*mJÔP‚ŠþYAƒ`¨AѰё4Ç®²ÌÓQhç‰Ñ¶rw±Št fbË@âÐÐï÷Ùwï}o5ö·ßî>?žÏó¼ß—÷ù¾ öØ/H³Óì4[£±¹Öȧ¸SÜþÏi¤©ÜTþç7¤í¬í,I:Z­úS#–uÙŸˆŒù‰|2;Œ„¥ÝÒn*ŠÅ'ÈŠœŠœ”¢qSL½žz}F%ëüu~’ì¸Øq‘_““÷&ï‘ätÑtiIJ.û%^ÎKœïðdòä¦QҲز 3·en˪6ü•E–•”•ä‹E/ 3I’ÚÉ4¦‰"’F(Ÿ× ±¬Çú%^Γó%Ÿäê¹¢pE!@î¬ÜY™z! xúyxÕáU’O¹Nò$O2T#j„$µ=ÚΑ"(‚$IM¤˺ì—x9OΗ|’?ªÿÞÛæ­žÅžÅ$U’THm\'õ4¥Ai "â•xE!%‹/D¥¨$ÕRC¤>¦ê£|÷zšR¯ÔSƒêõL|ÁœÙ¥íÒ¤Àæ­ [ Ÿ¡š:ž:I"‡íÃv’¿$‹µ ’©dr–æp••VZI1&ÆÄXB¾ml#ÅC¤ö·ö\{Nxý ~³Ñ…³˜Ò†4’LLŒ$I=1açúÉ}Çö#9M’z®øV9¢1Vì­óV{«ÉггÐ3CǰØ?ì'›½ÍÞf/ù âAŃŠ÷Þ½Ÿ{˼eä£ Ê•'¼ñÏ¢|qþ˜ž˜°ÁC¬÷Uùªâí_ªßÍeÏesn÷¯»ïî¾klxÏòžå=ËIeB™P&H×K×K×K²tºtºtšÌ äòäö‡mÛÈÚµµkk×ø[ßßj¼Õ×;§ÝŒò‘¾7¾7RØà¡$À°>qᣂ”‚”ØþÂtA´ñ>ï¥?–ºJ]@AA°Ä½Ä½Ä Ü®½]{»òly¶<°Î¼Î¼Î ddgdgdÛÃÛÃÛÃÀÉ;“w&=¬‡ôäŸFù€Â-…[€¸Ò‘îHן¯'^O¼=ö§ŸÖO[‘9ÿrþe2„a²³¿³¿³Ÿtf83œdK]K]K™U“U“UCv]éºÒuÅÀ»Ž»Ž»Ž“z‡Þ¡ymLÚLŒ?¦Ç èÝz·é 4µD-`¬À8àˆ¯ êUõªz`1‹Y Ø»íÝön`iëÒÖ¥­ÀþóûÏï?X[[#¹#¹#¹~>>>@/zÐcä1ヺCÝH=f R) ý†¤¾`_À[àW&—X&–a^âm¶F[#0stæèÌQ °©°©° XoZoZoÒÒÒ€5ž5ž5`ïæ½›÷n6øí^»×î’­ÉÉÉɆ^Sn”èëíë¤s´þû x*x @)ð„‘…,X¤«ø»üíþvÀ½Ò½Ò½Ò ô9|ŸÍÍÍ.)—”K `›²MÙ¦Œ>£#àÖܫݫA@l›`1÷Æø$¿Ô÷±¸H_‘>£WéUœåü;翚լ&õˆÑO…S8…“³bVÌ&ô¿•bóâóÿ×ÇœŸ‹ÇBR;H ‘´h´Tøƒ >Ä^ã5R ˆ1@ò[Øò¾óÇñ^­F«Ip~Õ“äIúOç_°ßÊ{»X°÷±èi^h7Ø´Ž€ pIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-21.0.png 644 233 144 2746 13755454067 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü›IDATHÇÍ–LTWÇÏÌ‚ŒˆëÓÍlh­‚¶E,Møb‰µ–: !JvlI[›ñ¦‰º‘¦+%D$ÁFû#’–wÆip'#fÖAD1;¶ KëØÐ[dÞ›¹ŸýãÍó±õŸýÓóÏË÷ÜsÏ÷äžw¾÷ ˆˆHaæ+`/±—Ø lÿ³åÏÝž»ýO_¸/¶×l¯]ÿV_y`Õg«>Kß´°¹nÆ/Ý/bå_Êgú¥P,DzÁeƒ¶Ú > õåõå¹k Ü9y¼À¼¾¯}_ø¿ðÁÛpçÊ+¿ÖþZ 6×Íxs¿™oi~9ü;~ÈʲMòœe9"ðä¶'·yÞ5¾÷À®—w½ ð“ã'‡²@êÀ‰SÕqâ˜]‚ÍõL¼¹ßÌgæ7ùL~£W«Fêêò>56Üì‡öâöb“O tà=®ÇR©FA¨lØÀÂæºoî7ó™ùM>“ߨÇjeLDäã—À{×{ÔÚeý¦¶V[ é1mF›AËTªÌ’Óùéåéå B*¤BXö33ÌZxôHôHôT”U”U”ÁÆáþ~( z𶝋Çö=öx¾`ÿ œ¡öñöí\ÇIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-6.8.png 644 233 144 2513 13755454066 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–[hTW†×$ÎdBd’Ô(¢l”JJÕ´úàƒ/¦©rA­2Á‚Å Q )õ­FP*š€(¦D¢ÑzÁûÁK¢6± &hbÆ¡1)ƒé ÖL.&söÙ_föœÑê»ûeX{¯õÿ9{Ÿ5[@DDr¿iùiùi¾xœ¶Á™÷–zKçœŒÇ \•®ÊÎí} û@î‘Ü#v·›u“ŸZ/âè§ò̼äˆ3‘q6㬫8ï„oç;ß;5ï½™3/ŽX°ñòÆËš/4³ZZ^¿*'6ë&ßÔ½T}Ùù_Ü×Ü×\}áÉðˆÀ¬e³–Íþ!žð×l([Q¶ ?½?]§€ú˜Ìd] D‰bF8%6ë‰|SoôŒ¾á~Ü@ÞÒ¼¥"P±¶bmfS¼ û7Øæßæ7¼ØE`7»™ VÔŠ¨*UÅ8è;ú.\àÄfÝä›z£gô Ïðã~äí½Ý÷ ¬ÊX• Äþ…ôFë¾uŸ˜ÕaMXhû¹Ýc÷àŒè[o;fØ#`=WY* ­?·öZ{‰Š¨0–Ð× ^’/©† ÷Cæ@æ@tc¡áÐpR9Ÿ¨Uèþ›Éæy¨§žzÀ¿3­‡õ°v±‹])ùÇi§øZ5«fF“úã¡‘Ð$ù ? c wasíæÚäó~©ÇÆ:¼ž­=z6À¾Ãûï; 6=Øô`SŠ¡\«søÑÉG'„ºu;êvÀÓ_žÖ>­uÒõ‰XC¬Áá9ü¸Ÿ„±‡?Á©×§^ƒèïã‘Ï"3#3aIá’Â%…P¶§lOÙX¸nẅë ýaûÃö‡Ž!c¸ ¡ ¡ *U¥ªTP° `AÁè^ß½¦{M2}\O2¼8ßøIñÝöÝþj±ÈÒ’¥%"úgWSb§3®·^o¿Þ.òLžÉ3ñ{ü¿G¤4P( ˆøoøoøoHrX>ËgùDÆëÆëÆëDJ\%®—ˆ§ÉÓäiÝ3ºt2=ƒK†ç?i"éeée|!â¾â¾""Q‰$AyÖTkªˆ×çõy}"ó‚ó‚ó‚"g¢g¢g¢"mÁ¶`[Ð1öfõ›ÕoV‹L0Á"-ÇZ޵‰¿ ¹!7妓/Ÿ^‚Ÿð“&b_µ¯ºžˆXåV¹ˆü*""y¦.ç|ιœs"Y§³Ng©n¬n¬nɾ—}/ûžH¨(T*r8·:nuÜ™S3§fNÈ¥õ—Ö_Z/âîu÷º{EÚêÛêÚêœ|¶^‚oü¼{ƨOìùŸªZU3nCà|à|àöjQ-ŒÚQ¯óSÚC~<ÖaÖá”ù~ݯûA{µW{Sæ õJ½tH-V‹SúØhh(4ôÁ>öVç÷®ò*Ùù«ÇÀ{Š=…˜¾«Ã:Œ¦™FyÅ+Ð]ºKwƒ¼ä%p‚£ý»~¡_ 9¨ÆÔ1P]ª °Œ~‚÷ÿÎÿÑþW~´·‹ö>öqÞ`ÿ\?Ìäi¥IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.2.png 644 233 144 2770 13755454067 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü­IDATHÇÍ–L”uÇ¿€JTŒuƒh²@R§nÅjž7„¸!7]VüQ¦™’[‘:cmÝ:¹Yk¹YkýÌÅl·ÌEÝÁlƒi)Á\¶å\‡ž÷<Ï÷ÕwÏÍÿúÏï?ÏÞŸï÷gû~¿ïç+@!D^ò+ ÝœnNÏMàôF|áÓ Ÿ~ä«þD…4[šíCpïG÷~°äó%Ÿk#Öóz}j¿ªžyÂdufu¦Y“ø0<óØ3-¼??èÓiÓé› ¼üýËß|÷Åw_°¦üS~€°5lëy½^ï×ùRùÅá;ô…€{zîéIû²2³2…€âÅK—K¡vK퀉Œ‰ ™jXÄ"i"DÐ×õ¬ç“õz¿Î§óëzº~bë Ö uÏÖ=kú,Ñ0ò%4=Ôô®? ¼Ç{,%¢DÔzµžÈ~Ù@i``=¯×ëý:ŸÎ¯ëéú‰yŒ­Œ !„klÛ6ÚïqŸˆ—ÆKA–*O(OON*e¡Ì—ù \R.*AÒ†´!Œ5Ã4Ó·‘”++WFâÆ­?Á¯ëúúVžBˆG‚)bŠDHmÌ7æÞ d¹,'J0!$mÒ&m@3Í4§ âĉ䄜FXŽËq9¼€;€Ü$7Å™à—3I½¤>ý‰yW…â“_$»êvÕétÚÊ ãõõpäÉ#UGª£®Qç¨Ów‰»Ä]C«†V ­2òZ»Ö®µx´h´p´Ü%n³ÛŒZs®ã\‡¡'çwÕìª}¡þ&„Co@÷©îSpnËå¢ËEÒž÷þâòÅå;½õµ­¯AY¨,T‚îeÝ˺—ÁÒ†¥ KÀâ·ø-~0ï7ï7ï_†/×a taàÂÀ…0+fŬ€µÍÚlmóž¢ì¢lbþÃÖýY'íÐÝÖÝúKŸ¥Z¯´^i½-Å-Å-ÅÆŠ@EÜ'Ý'Ý'x×Þ®½]{¡é`ÓÁ¦ƒ)õ—Ê?-ÿ>|îXñ€ù7çßEÍ>“}Fv X²xÉbí Cÿ„þ1®ý ÇÌ«3¯Âæõ›×o^e]e]e]0‹Å P¨T@¥«ÒUék£µÑÚQgÔMÙòÛ[Y?Z?ZË.?ºü(X×íX·¢­ñp<ÌuooÉyB»$Ô‚ì‹Ùe'Ì¿5ÿ¸½ÿúñ¯°©y£u£Õ ^Y½²ze5ìØ7°o̳Ãì€Öµ­k[×Âlïlïl/̘;0w¦j§j§ja888r*s*s*¡-Ú6Û6 ÿ¿®] íH ŒO=0õÈíÈíBfégìÔS§ž‚๠s¤}õ¦WW\%–W‘W’W;ã;ã;ãÐnk·µÛ ³*³*³ V[V[V[  § § \'\'\' ÚWí«öÁ¡ó‡Î:&¯ÉkòšÂ5¹kr!÷Ûœšœbßœóó“vèµ÷ÚAq%ÏXò_ö ?î^°{qKæ·¬·¬pmàZßµ>¤Ô‚Zbgcgcgaúøôñéã0œ N!¨µ 777ÞÞÞÑÂha´B»C/†^„ÉÀ¤:©"ƒûö€ný•ЃWæ_™žOÞJyÈò†¼‘rx¢D‰ò?–,•¥·;jàC÷1ÝùcºónÏØž¼žpféQ®+ת©q\xñ"åײCv€”~éé‘éì¼ÄK@&Øpà@ÊUQ‰ËA5[ÍùeÒùlkÙÖ¢ÿšRÿîýWÞµ¯‹»ö=vw¾`ÿIT²¥~ƒIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.4.png 644 233 144 2757 13755454067 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܤIDATHÇÍ–ßOTgÆ_Àò£ˆE;Mw›FRQ"Ñ@ãt‚´XaÖÆmÒ‹­(CâJM[³]ÈFÑdŒd±4– ¢ÛF× ´¦œYê®A‘qÛ„n´:qb†ũ2t‡™2ÌœóýìÅÌñLì?à{3y¾?žç{æ}Ïs^J)¥ S¿ 2‹2‹2W$qæ>+žûvîÛ«ÿžÄ½:d83œ?þ^úü¥ÏVž]yÖðYØÌ›õéýJYüézf\*+ÓŸÓŸáHᣰ»bwEî+Iü×kw9ïr$Íß4ðõ—_Éá§ñŸÆæs°°™7ëÍ~“/_}F_)xað…ÁŒÿBNvN¶RP\W\WÚš,¸_ ;wìÜ05%™ å,&Œ¹fÓ°™OÕ›ý&ŸÉoê™úÉyØÞ´½©4¾×ø^Þ™dƒïzýÐë¦^ü2àÆÍrH„aý}ý}b ×äd€…ͼYoö›|&¿©gê'ç±¶2ª”Ržm°Ë¿ËÆm€øÄT¼4^ Rš¨JTOM*òyY^†ÄÝÄÄ0&Œ ck-!Ì'ëÁøÀø€¸|¢éC`$ùa×â®E dê›[ùO¥”zã3È ç…ÃËÄðßðߎðÈZYK”3Ì€8Å)N vÚÓ餓N9™“9~½j¨¡äú1ýÑTô"þÿ˜úÉÁÞøLñP)¥z¯ ®FW£ÉbTÞúß;Ø ]›»ª»ª‘{ž{÷:-ßMßMßMè.é.é.‰'6Zy KX ñˆÇŠOOÞš¼…\Ýýmý·õ–ë]ý®~àQr¥¯”RŸÀÀ¥KðÝŽû¯ÝMš O¬-XK¬áÏ 6|eÁ²`YÖ ¬Xkö®Ù»f/ØÇíãöq(:Xt°è xm^›×f ¢Wèz……kµOjŸÀÖÞÍU›«ˆ¥£É8þôùÓÀXrelÈœÿXúaaxaFŒÑœÑh¯mËkËÍÐtMû°}Ø> “““p¸øpñábK°|ª|ª| zº{º{º½“žvO»§ÔßÔYu~wÑù‘ó#+o8§ÝÓnàþо}Ò¯`eÁÊã.¹ÁP0d½öóGï¼¶×n¯Ý^ eË.–]ÌóÇ`ª|ª|ªÖ{Ö{Ö{ÀÑêhu´Bx <°µimZ›†ÊºÊºÊ:h»Òv¥í lþmͲše–ž„‚·ƒ·…_~aÜUºíÅ;/Þ‘~XútéSè9=vz Þj¯sÔ9,ÊúÊúÊz8à=à=à…¢#EGŠŽ@ÇÖŽ­[aahaha¢‘h$+ä ¹À­¹5·ù¹ù¹ù¹PÜXÜPÜ`Ùú™‚s¯ž{  Aÿwþ‰üÒ¯$ǦÙ¦ó§ô–žuþç÷[ùÜÞ.žÛûØóyƒý?e[b1æIIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-25.4.png 644 233 144 2737 13755454067 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü”IDATHÇÍ–ýKTYÇZ©ëhµ¹Ü-ª ·j **,v'Ô”¤×h{¡5ìMZj ]¡Zb¤,iJ-B+¦7,G!{Ñ`éý¶ÅÑJIÝ…šHSÃAñ6sïùì3·;Ûþ_.ßç<Ï÷ûÜsÏùÞ#@!ĘÐS@ä¤ÈI‘ A¹ÉŒÇdÄd|s6ˆ+5ˆÈŽÈnù F}`lõØjý¹‰y#?¼^“?\ψ‹1 D×D×D, ábX5cÕŒ˜¯‚øÀ-ˆuǺ°¹~s=@í©ÚSü oî½¹п¨˜Ø˜7òzƒ/œ_¢/ŒlÙñ7DŠ%XÓ­éIÛƒ /“`YÖ²,€WQ¯¢d$h=€‹\øðaŒwaؘåõŸÁoèúÁ~$ÚíBÀŠÕ+VÇV ž» pbáDCÏïö± |€¶N[‡ ò–¼@`bcÞÈ7ê >ƒßÐ3ôƒý˜Ÿ²W!JÓ §/§ä×þ»œè~Ÿß‡ŸÚn­P+í[mº6´\-W˲XÂÌñ6˜ú}~Y ]Ñ®€䇜áœa ÏÐ7>åu!„˜vb}±>ßÙÛ~·ý.ðK@.” âG9 ²Y6Ëæ0á|àÿ**jN!…¹šCs0Š.a°½±½ ý`cÓ‡V¬ò¶¼¶%bK„Á¢Ïl›ØÚÚÚ ‡nª?T|ê|ê|ê:è j÷×î¯Ýåör{¹Ž?:þèø#èõôzz=f?úý‚~ÁÄ]W»š»š‘¬jÊlÊ4õ°m©ÙR¼ ö#ôÙBñgÔ«;-Þo‰Ì›44¡rB%ª}‡}“}$Å'Å'ÅCÃÆ‡ aŠoŠoвÔ,5K…õ×?^ÿ:ŽN‡Ùˆ¦jª¶r©ÔÔø®rÁüó5•yú™3ågÊ;Á~„öW\Y\™¬!uH…ºÑWÆ_…; æÌ1 çžž{zîiXã\ã\ãÅ£xdÔeÔeÔÁÉÁ“ƒ'Í|ÿÿÿ—î.Ý]ºÄIQ-ªá‡‹Ù;³w†­lö«}¯ö/N$œ5‚ÀØØ±±ú3ùkÏÚžµæ±o[÷bñ‹Å`SlŠM¥K3–f@£µÑÚh…|[¾-ßç]ç]ç]`µYmVœ­8[q¶Â¬wÕ»ê]03}fúÌtØuc×]7`Áø”)#L=Ù×ãéñ%c*ÆTèÏ„~Þ²Õ²UÖÀû×ï_ƒ§¤ÍÙæ„/”˜Î˜N(¾QÜTÜr'\v_v_vCÑ@Ñ@Ñ€ÙÀ<9OΓP]]mƳ³³ .&.&.¬+¬Ë­ËM[¯Šw).À×ãëía\I\‰¬qÆ»–|-ªãë:ê:d^ä=!„@3b¶¶sss¡´ª´ª´ RõT=UKš%Í’ÕêFº»»!9/9/9ÚÚÚÂ^ÀYé<è<ß·,,\Xhî1¾<u. ø%´Ç8<_”_ÃMÁSÒýÀÛämo”w²w2Ò;Ç;Ã;T»jWí åkùZ>t_ê¾Ô} d’L’I ©HÞ]|wñÝEÐô=Áll80Ü;Ü‹Èìý"ìT^ß¹5Ò0ÜÊÛÂð ÓGB>öÑg¤"•¾ƒ|"ŸÈ' 3e¦Ì4åT9UN”0ÿÚË^ö‚¼+ïËûÀúv};C<ñÿÞ~³ýf˜uÿÇÇŒ?@iŽœ‚œ® 3ËGšE³€<xxŸc<à’SœàÈkòª¼ ¸qãúé£d›l‘-@ëGçߦoÃO±vG»Œ2œeÔÊ(àçÎÿùþ+?ÛÛÅg{ûÈø@ð{‹ó‚fÂïy°yÓæMƒéƒé* Œ×À\æ*?#†õ:l+>oÕ[x¾Ågñ›zd¯Ë^'ÊeîŸÌ‚'?áŇ[|ÉNà(G™ zLF“ îª»hh`ÛVÜÊ·ê-< ßâ³øM=âݽm*‚í™Û3S‚îÑcôoå6¹ät@©TAÊ,™•êê•£r@èô û䄜@¬“u$™2n·eá[|¿p úìp»‡c.xf<3R<_0)Ke)ñ”çs )µCíP;‚Ô€v³›Ý¶Ÿï9ÂPoXÄ"Ù ˆ31Ÿâ³øM=ÓÂNÿ ûêöÕYhÒ‡ÒÇô1›Wý¨ZT‹Í÷²ûe÷Ën¸9ysòæ¤í®Ž®Ž®† O,<±ú ú ú  Á… Å[ý•þÊÁ—â7õ¤™}[yMˆµ5kk¦Û(´‘ÐÚµv1%ZÅqFhB —p‰Ô·'Oþž|!C¡Æƒ¾Aß Oˆ¢E‹6 ZZZ/D`M`M`÷½÷½÷½Bh ]èBSçÙÊV1•â{‡å5ž;ž;ª† ‡ [ð— «0ãF̰oMÁ¦`SÐ>™UáªpUnÄoÄoÄá`×Á®ƒ]v~~$?’“ý'ûOöÛ~ïg辿©G@Ö¼¬y2£¯FS­eT.1<†Ç. ???_±¯ØW µ×k¯×^‡U «V58¶²(Z-‚eyËò–å?èúƒ???îÐ1GŽIû¨ŒÚü¦ž;flÖ³õlÛ>Vv¬ìX¸ÇÝãîqÈ-Ï-Ï-×C×C×C¨n¯n¯n‡WŽ+ÇõËë—×/‡Xo¬7Ö ²\–ËràOÕ%ué½Bˆ¾¸0v!µUE¿QmT“:Ö‰ ‰ ‰ €/^h.m.m.…À£À£À#hÝÕº«uh-¢E`…w…w…ßé·Òoý¥ÁÁÛoô\ë¹Æ·0?0?ðÑýÑ ¦­âj½ÊWxV|qú_üB@êÝÔ»¶Ip¬v¬6ïܼsËwñã[`Ïî=»Þ¬z³JÚ@¬e­ta¨oÁb«xb½ÊWx _ñ)þ¸ÙåÙåBÀÞº½ué]ñ„À¯Ð”Û”«øb·€3œa-ha-  ï×÷ó d¿ìÀ† L[ÅÕz•¯ð¾âSüq=âŸgÛò Ô¤Õ¤ ö˜˜Þ«÷ÍF31cB:¤©MiãÚ8H—Ì—ùÉÃ1ü†´éD|«¬•µH0Î牱¤?ÐXð_’_X¹~†ôùôùp Œéc: Œ£…ˆÔ( ø‰œ0…0Í4Ó dƒl|øðYâp“›ÀA.rÀ8f#BTá'ø’üq= aàPó¡ædÝ_ÖfµY‹¬aM¼>€¡©¡©¡)h-j-j-‚Ñ—£/G_š:ž·`Pø¶.“?¡2×e®3F`avaÖÚöò½|¤BŠYiðTðTðTíªÚUµ Üî7BP QOÔõ@…»Â]áW™«ÌUÆ7 o°4ILŸÓç¬|Š?®G@F_FŸ¼óÛæ·™‰ú/ZVgÚíÅíÅíÅPU]U]Umú·çnÏÝž EýEýEýP?[?[oHþÑü£ùG¡³£³£³Ã‚ïÖšÃÒ$Iþ¸žeï6íºvݼcáãáãáãPZYZYZ Îç‚sê{ë{ë{aäÃȇ‘Pr¿ä~É}ÈÍÍ…Q#j‹ƒÅÁbË‹jW´+Ëß±å»RuÍ=^ðÂìÊè¹è¹è9xçxçxç½MoÓÛLÂèèèKüµþZmÙ?‹,þï®üÌû”œcg³D(ŋ䨒C–Ê+e¥¬£Çè1z@d@,ñÕ ÙÄ&£Ýh'bÎÉÿœcŸ™üÄ£é}z€Ñd4ãG®r)ïÉ;òÐÉe.[vä{i„d¼‹'PZŒkÕXíøª0 µ£("3ó{|÷™û›ßL²šÍîùg8÷ÜsÎgîýž;(`(Ìø)F‡Ñatp/ƒ Q}Ž÷9ÞçxÆDQeQ¾ú7Gãh«å$’H"óp_-gûY>«Çê‡÷ã§„óèù ¨€ øªðø 8ñ¸x\<^ÕÁ­âVq«4“¹ÓÜiîÄ?²ïfß; Ìm›Û6· ˜3uÎÔ9SC>‹³ý,ŸÕcõY¿×ó?9ܶ›ïâ»ø.×8vB1ù1ù1ùòšýMû›ö7©ý=Ï<Ï<Ï  ÝèF7\pšŒ³ý,ŸÕcõÃû Ûýz>²¼Í·óí|»«ž˜z~êù©ç¥ä‹¿ÅMWãÕxHòyƒ¼åD93åL9Sçãl?ËgõX} 8¬¿åm «âª¸*"q«¸UÜZy%ØÊm%¶)SûDIR’à‘*{í½v@uI‰R"ŸüžüÈ‹åÅlÁ„̧m}Úú/‚u<òv¹D.Ñxà µô¢Wï*” €Ïñ9±òv³¿9T­õ©Kt‰xa)µl´lT‡3Æ'ð2/ó²ýcõ²zY½lIÙfÝfÝf%猼y3ò¸™²#0•âòG7Ý$"ßwßÑ[· nݸwãÑíîÛÝDDCã†ÆGGÝn Dd¬­©­!"_÷î;D|ê°!ÆÉ%GÉ!ãÀdóóR‡Œè^ýOõ?×ÿÌý1À7âiPªÛ<Ö<Ö<å zT$XÙw®9Us Ì=ˆûÄ}z¿Ï€> ãÓŽOàëÅ_/ÖÇM»M»u¾ç#ÛG6@«0©#ã™òLãc ™µcÖŽY;´„¹Å7Þ7€›-U­8 IO’ž„]ñåŠÞ÷æyó :6:–ÞZzK?Ûv¶Mì¾è»èä–0àÆÃøøàHÅÒ é†tmÆŒ´ÙÈ&¢ß±¥ækÍ׈ˆnvÝì""J>—|ŽˆèýÞÿ€ˆèdÖÉ,""1JŒ""êXÒ±„ˆhÄ·#¾Õ¿,Ö#Ö#:·¯³ÆYCDú5"£¡ÚPm¨ÖF>.Š¿·7µ7µ7Q‹—ïíìí$AX!N'hIpo—±ÖXKDôîŠwW­øqÅDD17bneÌ:IDôàñƒÇDDë¬ë¬DDÅÅÅÅDD3Ì<@D4ûûÙß‘/X÷É,™‰øÚHpUp»Ü.·‹Zñ™|&Ÿéÿ5xÄå‡ eÊÒI ¯”´mjÛÀûÒñÒ¡¿¥—ï¼|¨˜Šà‹Í_lÖÇ·Wn¯€´siçHë“×'€!ÎÈÇ%Jõ;[qêΩ;Ú/à2.Kàü¿’0A˜ L()cÏu¨ežež<¬õOò䇞5m4H€¢Ä¢D* 5×7×ë‡æÌ£3`^ͼXh^hÖ«owúîtYýãúÇÀÃÀÛe™² [2zÿèýŠö  ƒ¾zAQéQéQéDb£Ø(6ÚÛµNêòÔåòjmd ÷eíË‚Ž P·“Û©\µyUØIÖ}S÷~ʹ¡ÜP/¾òÕgògrèëæ_þð܇ç” p©°TXz#'à÷cSÏ,f!Á`Hpd …Ö\sPMÓÞß:O8O@.ài¬m¬e¶2‡<ý#pïü½óppàÁ€¼ð겫ËBç{´ëhìÑXdi?¡e|_Ö›Á æsƒGï®hó•Ç-àLÛËÙ¹j®šiEùØqº*¶*L=òje´2Z¤Ö©u€µX @Uשë_âK@MS‹Õâ”ÚííÖv+`ík¹n¹.ýY;ÉMÂza}¡MCˤLÊ-!ÖJ¡qUQU ná‘ðhM-+`Ùk™o™/™Z×¶\i ½›5M2K 6 A§Ýžà§C9 Ôÿþàe‰ þ¹`Ï‚=òjV_ì_ˆ/›£WF¯Œ^IÄÛxoãŽé2Ì·‚Ÿ9Â}á¾pŸ«^4¼hx‘!ßoÈwlÖ´›bK±¥èµ«*…ðžã9ž‡Z)”G†´¸+iWÒ®$5Õ3˜ &ƒ©½7à[ú†ß4×qõÄE¸Â}K߀v[…´[¸¡pƒN»&É$™B@Êcå±ò8¤E'œpŽ~Î~Î~N5[ÓdÅGÍß!Å=|Fzý‚°K§Ý<.oZ6gçìœ]¯]ÇiÇév¥ÓÒiétH¹¯¢_E¿ŠÆtŽéÓ)дX-T ÕĤ”^$àoè ÚÀ „´ëÜ:íVX*,’©ÕÞjoµð /:ia]a]a]èÙ÷Š{ŽÎà¿$ý.Fô ®Sÿ7FK˜Ôî‰ÿ¤ÝÔ™©3Sg†´ë˜ä˜ä˜„#¸ªÝ—Ëår¹ÓJÂÛðÏ#úrô_Ú›´;E(Ê„2W"Î-Í-Í-UwÆûâ}ñ>é'íªÝ‚[pÆP%UR%Ÿ¡5¢Ÿ‘þG‹Ôîæp?õn·ˆ[ÐtšNÓ•Qü~?àˆ#ŽÎ\°öX{¬=DÂ%á’p‰;L̉¸¹ÿ›™´¿Ò)ÒÅkááµ y•Wyฮá_±õß;"n¦%¢î¯úß.ºö«}¬˜IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-15.6.png 644 233 144 3065 13755454066 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜêIDATHÇÍVïOSW~n)k+?J…©q°-•,Ê’©™‰ 3#ÔŒ¨Ees„0Vj]¶˜Ì¹±ìƒš,nh4†0+¢.N1Z3STd23ã˜u–Ùj&8CÑ–"¤?î=Ï>´—2÷x¾Ü¼ç}ßçyrÏ9Ï9 Y‰/HMž&O“5$çõËôËfŽÇ{eRZ)­üãKÒØ`l IS‹©E¹•ŒÕ¼Z?±HâOäSç‘…ä„î˜î˜Tœˆ·’k^]óªþùx¼ã2ip\Ob¤í”íIž8pâ?$t?è&ÉÇÅ‹Éd¬æÕzµ_Å›ˆ­Oñdê™Ô3Ò]R÷œî9€|iéKKÍÅ þ2“eËË–“äý”û)BC’¤•?®dΛ9o䊊†æxíïÈM¹›rU¾¨‹äWüŠéd, ‘¤¼N^Ç0).‹Ë$I‰™ŒÕ¼Z¯ö«x*¾Ê§òÇõ$—R€oQ¶Æ¬±qA]Š!úbôERxåyòö±ä0‡9Ìÿ1ŽqlB<™“9™÷D¿è'IñŽx‡£Ü•ÀÅÓåé"ICÈ iÙדøc{;°Ûì6R|I’Ê<wêþìýÙ½½{z÷$ùŽ8>@6–5–5–‘û®î»ºï*9tsèæÐÍÿë½óáõwÖ“;÷ïtîtR\[ßãîq«Ye'Õ¾WûÉ{q=¼ó@V±·Ø (éµuÝö ;"¶˜í‘í¤Á–ÁCƒ‡ááj/Ö^¬½´å´å´å]R—Ô%Á†`C°ãÿݿݿ¨j¯ú¹êg s¨s s’=hÏ·ç#ò{Ó}Ç}‡ôFKw”îDY\k2-™–Â@‘­Èˆ#˜ƒ9RóÛ¶²ú²zèò–çYò,€¶D[¢-P(iJš’,)XR°¤˜Ñ8£qFcRXÛXÛXÛàÍðfx3€\]nVn°¬ÜRg©ƒ.ï3ÓiÓi©x#ýt@:“q(ãPá >Mù%åÎÂYíí u+zÑ‹¡Š[ïß5Ó÷MošÞD*#•‘J@ÌóÅ| zCõ†ê @åÜʹ•s- ·,ܲ8Üq¸ãpGRX¸4\.ô’^ÒKÀì?gßž}hUZÍ­f ÛÙ-w˲îeÝD*¬°r–²âR\’šèŠè ¾´ÈQc¹Ñ¢/’Q2JF`äÊÈ•‘+€Éj²š¬ÀÚšµ5kk€i½Óz§õ~Ÿßç÷8Š£8 ¤]J»”v HoOoOoMŽ&GùG¦+Óø¼¾:_r´£àóJÒ#¹›ÿ·Oxêûƒß$i$Iñ~bW†‹º‹.] ÏÕ«;WGŽœ99r’,  ¤±ÅØbl!kÂ5áš0éu{Ý^7Y°±`cÁF²?»?»?›¬vV;«ä¤È¤À¤¹Ú½jóªÍ ûT¾c†cRœˆëIžÊ¨ýsûç$ÿVO¥|^>Ow[ƒ­‘o"Û"Û’§,êŒ:£NrP?¨Ô“Â,ÌÂLŠ©bª˜Júwûwûw“Ê5åšrGÄq„ô×ù~…¼=²8²x©¼m7ÛͪáîíL›¹‡4<4< iIψgdœßÂ'J³Òœô1ñ«è¤(%¢d‚ƒæ‹|‘Or §pÊŸXÃÕ\M*!¡Z’‹Ä"ŽŠø­bcžëžë$i‚!-;þãcEÂyEyJyJÒù©‹õÇúIî•GåѤóóknã6R\Ä’.ºè"ù˜øˆnqCÜ ùO¢þ¼¢StŒŠÎØpl˜ä·ªó—k˵$ÃO;ÿ³{W>³¯‹gö=öl¾`ÿ!™¦yUÅjIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.6.png 644 233 144 3047 13755454067 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÜIDATHÇÍ–áOTWÆßAtŠˆ¶k˜¶°ÉÆ8TŠ[LƒM+ ´"”bQ$ݱ˜öMLÕRpK"˜u•Ьd@¥Ñ6ìº4j3AÉÖ±ãB3 Ž™¹ç×3×Ëö/ð|¹yÞ÷¼ÏóÞ{îyΑ¤èS ÆcIŒà˜ÝF<./.ïOÿŒàÖ0˜Þ5½ûó§°¬eY Àò“ËOj· ¬çõù ëE þ…zz\’Ę»Ì]¦QÜï½öÞkq/Fð—ý`9g9÷8{¾Ýó-ÀÙö³íTýÁ{ƒ6>ÚÖóú|½^ç[È/ ÐÅß-þÎäóóxåWÞIû(2a$ 6l_4¾HÅ@ø@‚Úøñ£ß¬ç£óõzOç×õtýH?/ä¾+ÛvnÛiùG¤àÖ7P›R›¢ëÏ9H„ü!?@¸$\¨~Õ€ XÏëóõzOç×õtýH?ÆR>i| ' 'A­„n“ƒÉ ] º‚.‚ÑN•úP½¯Þ‡ÐõÐPh´1mLÃðâ}Š”Ú::@04\\Ú/~(ôz¿®¯/å¿DDÖü ,~‹ß«Þ¸=ì T–Ê"À¸Ä%P¢DId¡ô÷ ‰&š+V¬ â,X@ÝQwÕ]U¬Š ÐåÿsT/ªÏÕH?Ñ/ÖzYõV˜*L:›öº;åæÍ›7¡ùÕæ¤æ$”Óåt9]†ÞHÑHÑH465656Óî´;íF^;¥ÒNx´z´r´ÿÞØÖØ†rV^u]uzÄW|Pñp'Òhªž¶ž6øùßÞCÞCªÜXݺº•¹Üs‹r‹ u2u2uÎÛÏÛÏÛaSö¦ìMٰźźŠëK×—®/…o<¾ñxÁŠš˜˜!gMΚœ5PðEÁgŸÁúëæ×Í37||¬r¬R•CÏýžû ­‹ô#áÏ5?׬º 0˜ƒžeß¿ôýKPûך7jÞ06œÙpfÃÈÎËÎËÎ[Ÿ­ÏÖÃÃÃPß[ß[ß ['¶Nl5ê:ެÊZ•µ* ö6íýjïWPæ“?ù&“fVϬ˜˜™˜5¶´ci‡êŠY”¾äÀ’ب ”ÊE¶MçßË¿'wOî^±{…ˆmÄ6bInInIn)­/­/­™}2ûdö‰HƉŒ'D~‡ßá¹¢]Ñ®hòt÷÷÷‰Ä™âLq&‘ô_ÒÝén‡æHs¤‰ ¶ †ÃòP$éNÒµX ¥›h ö»ê‚©»SwῇÜ_»¿†øä¸_ã~…†e ‰ ‰Æèöt{º=`ë·õÛúxfufuf5Y{d푵FütÙé²Óe>“>“>cÄ_ÿ4ã­Œ·àèÁcÍÇšæÎ…P8¾/¾OuIèyýëµõÚàäҞўQU3("Â\VJÖŠ¬¸?qâ~è.î.î.†ªkUת®yÈ~*~ Š\Ûë¶×17ý?U]–. ¨³ÑŒ/#»*ë*ë`öbd—L\õ^ô^ï"ïËÞ—QÞíÞÍÞÍ0[;[;[ ç8ÇÁ—êKõ¥‚¶R[©­•¯òU>øûûƒæÔœšT§êTà«÷UùªPá/æßœsÁ®tÛÓìiºá¶^ŽÚ…ác ûJÔgæUŠJ!ð4²‹]ìͯù5ã(BY•UYAM©)5µÀÇŠØÁÐü*VŨ•C@EN•|õäöõÛ×,Ó–i,?þŸé'@ãÛ|^XSXꛈ3«ŸÂ áP¡éÐ4AŽ1ÀŠ+ôÓêÕ§ú€vÚi¦xÄ#P.5¬†û‘¾¹¨™53Au9ô[è7à˜îü;bwÄstþg÷¬|foÏì}ìÙ¼Áþ/µ"À~‡óØIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.8.png 644 233 144 2761 13755454067 15047 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܦIDATHÇÍ–klU†ÏÖÊvéZZh›ÖRh)m1`5’mð’TRZW øZ 5Õ˜â‰R.FZK»iB%‚J6² Š®„”›˜6 ewµÄh]MiéeqÛegæ<þ˜Ž³BâoΟ™÷œï{ß7çÌ÷Í „"uê) !+!+!EÇ Uæ|ÒÓIOÏûLÇm*X*-•þwaFËŒ€´ö´ví'ëF||¾&¼ž1/R…9au[Ý–Ò)ü¼°ð……I³uüá°ylž¿¨>V} àèÁ£yþ¼ð瀑ґR0±±nÄù_<¿xï}!àþ÷Ÿ°ü ÖiÖiB@ö“ÙOέÕúçBù3åÏ Ü7pŸLõ`Ç.K0aŒ1‡õ©x#ßà3ø =C_÷#àAǃ! beÅJÛ=á§C°)sS¦¡óÛÙŽ”°PW©«ˆ‚<#Ï`Á&6Öx#ßà3ø =C_÷cå°Bì~œ77A> ;¯ü³Ål íJŽ’CL^c³Š¦D•(¨/ª+Õ• ¦¨)j ÈRéîR‹)iJ1å÷XF,d¶ÎÎAç 0jèGùB,ض°-N”ýç{Ï/Pòqù8> ‘F#rDŽÄIN0ÁDŽ!çH‘ŠT€÷ÙÎvé"|:Å¿lJoJŸËºŸ©k;+O®·¬·tÚ£=™@ Ÿ6474#ýýþ~? ,X<°šs›s›saÿõý×÷_‡ÃÖÃÖÃV4wíÝŸuê> [Þjx Ù³#8-8ÍÔ“'×[×[£m;+´%Bq©¼{?ÿ·¡]¡]rmV$£-£èÒï—žZz Ž)8;=;=;=°¬zYõ²j([]¶ºlµYÛû\û\û\¦¡Î²Î²Î2ÈiËiËiƒJµ2\†œYYDƒcþë´\ ÞÞ Ué~„úcòGÉI7D¢‘(xg|•þU:lzµî±ºÇLÂ`a°0MÉMÉMÉæü5ÖXN¯ÓëôÞ½Smmmž›ž›ž .Í¥ºTÈïš¿gþè:ÖíëöŒ; Únûrûré(i¶4›”oÜxéÆKfÙ÷¬úù©ŸŸ‚EÛm[´ ÇÇÇaòòäåÉËp+ÿVþ­|ÈÊÊ‚s…ç ÏÞm¬ÃÝáîpÃÌy3çÍœííí0¿3ïDÞ èªºrõÊU† ÒiíË_ŠO í ûûé†Ñ?Fÿ€«»zš{šaúCI¿$ýõ‹êÖ/„Ñ9£sF瘂®>WŸ«JÒKÒKÒãj¡v¢v¢ÆÊÇÊÇÊ¡©¤©¤©Š[Š[Š[̸¢#…¯¾M_·v´vÜ~ûöÛ ¨ÓOM?%ÝB™e|c'‹NAûÞkÞkrmÂ!„ Z¼«xkñVH^—¼.yø¶ø¶ø¶@•§ÊSåú¼ú¼úfüv?ÁûÎ:gÈCzg–?¨vÕòseT%Æ'\â’ùä¼J-µqÆúè¥dôK?0¨ûã°:®Ž“ß)ÃÊ0ЬóÃs‰Ï%Ñ;;ÿ½û¯¼go÷ì}ìÞ¼Áþ3Yq¶:„IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-30.3.png 644 233 144 3131 13755454067 15024 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍVûO”g=ß3&Ü2kb+56®RKµ\œn‚x%¸!T,Jz±N,±ÛHk²Ûݳî’`JÔl‹!a×&cºéB´[q*²¬—Nh;,Ž3t€A”™ùæ9ûÃÌç°ý |™œçrΓyóœï H‹þ‚Ôeê2u)¬;‹'îKÜ·þï|^%•ה׆O’©§~L’éÓ/†GcXËkõ+ûÿJ=-Ž4Ä›Á¦GñGdå‹•/&þ"‚ÿ|ƒLjOj"ßí|·“$¯´^iåqræÛ™oIÒWì+&cXËkõZ¿Æ·’ýL ¾LøRq‘½AY{²ö¬ûM¤`|Y¶¿l?INÅMʼnŽ$IÕCÒH£“ôÓOíxW`-­×ú5>_ÓÓô#ó€4í0íÈòÃ凓Z" £mäûkÞ_£éÛIžâ)É?ä'Iõ õ .“rCn$*d ky­^ë×ø4~MOÓÌ»Ê%øËn²ÂYá$ÃC$´‡&ƒëƒëIÉå‡òŒN*ò+)2ôß+ä"¥Nꤎ±3O=O‘„ .— MWW“²>ÂOVx*<$ç4}í*ÿÏ’Iþ$¿?^ÂN»ÓNò$ÉRRr$‡Kü‘“œ$¥Iš¤‰ä6n㶃ä0‡9$³˜Å¬XXÉ#yDò<ÅS$);d—ø(uT/ªÏ±È<à8ß#¬.¯.×蹃“wËî–‘¯6noÜN¹wþ^ó½æ˜ 3Ç™ãÌ!›3š3š3H׈kÄ5ˇaGØÃƒƒdã«›7SœîÑÖÑÖ˜ž\¯N¬NÔ®ö|.<ù_(Øÿæþ7ÿúûç¿^ÙZt©h¼h›ën>wó9(¥ƒ¥ß•~ô5õ5õ5GkÖ­.Ì\˜¹0ìõîõîõîI÷¤{Ðåêru¹@ßÙ¾³}g¢ö¢ö¢vÀ~Øþ¶ým(»Ú=¶{ >™³ÎY•­Jq‰Z¢Ò™G§Ô$/$/¼\ìTv*ÀÂôtöt¶Òb~où½e,^Ë¢eXÛ¶¶mmpiÕ¥U—V –K‚6 † @jajaj!Ðáëðuøðôø†}þaÀÚcí±öÇŽ³³NS؆aÉöpúá´Òww0?0~ðrA¼î®~~ 7#éÉÄ“ {ž(:€Ùüß¿tü¥ã0½žWùBå @`[ /¨ê€:³ÙÆlf˜aRZSZSZ+ä ¹ä"¹@Éå’Ë%—s½¹Þ\T¨ª¨ª @÷7ÝFÝFÌ  0aµ®FWÃͺðÁ >¨WFð$åÔs_Úûi/LUýUŸU}\;qíĵ@àzàzà:àv¸nà[ð-ø€çœ{pXô,z=@fmfmf-@tg:Ïtžé¥J;”t]íºÚu­’")À­}·¦nMÁ$|“ð ¿TÇÕqerîü–´%Û’I%IŠeûμûy÷¹œ®¦ûÓý‘¥®ðþ!ÿˆ´è-z‹žL.H.H. O6œl8Ù@ÎìšÙ5³‹ÜR·¥nKÙ{»÷vïmÒ\h.4’ÖŒw2Þ!+Bå-å-\žè‘¶|[>)m‘y m¿ª‰¯‰mIàO‹“ãÜ‹îEŠ:¦Ž©c+¶Îö†½ä¬}Ö>k'¥A¤“˜ÄDzë½õÞzRlbÜÜÜDº§Ý#îŠúC 9ÐÓãhMVMVl+Á¡ÿ÷1š#¾"÷žúØ[ò—d“¼"¯rDŽÈR6Èٰ¯NËi9M²ŠU¬Zï’.é"å¢tHIJ™”qI"B©Ì;ï8ïdÒ|Ò¼?ž_k>¦9ÿ²æ¼ãÆ‘¬8³t‡æBs$ÿªN«Ó1ççüœŸ“òé—~’Ýìf7ÉŸ8ËYRFÄ!ŽèדþNíWû”†î‡î“üDsþ¨ÞòÏÿÙýV>³¯‹gö=öl¾`ÿ1Ö±aö½œIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-76.png 644 233 144 2440 13755454065 14675 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÕIDATHÇÍ–]H”YÇŸ™ÙLI§ û0 CX¨p)ðÂ.J0‚-JÉ$ …ÈÁjÙ\Êi ŠÂ —…Å(™Ò­¶.œ¾ìëNs&òb)Xè ³s-©,³auË÷¼ç·3Ç÷m+öÊs3óüŸçùÿÿœ3ç™# ""SŸÞ€7àõÇco¥ƒ'/O^>÷t<>¢ÀSâ)¹ó#Ln˜ÜÞœÞlßwb“7õî~‡ß­gp™"01<1ì)LÄû lAÙ‚äiñ¸> )çSÎÿeA°5Ø pîø¹ã|ýýƒ…ƒ…àÄ&oêM¿ásó˾é‹À„+®xz`bÒÄ$˜½lö²œïãs`ÕŠU+ú|}>íõ H%U1b˜5àŠM>Qoú Ÿá7zF?îG ciÆR(^W¼.¥)Þpÿ7¨É®É6z£çƒ$¬˜PÔÞƒŽê(<àÄ&oêM¿á3üFÏèÇýÈÇgûS”&—&ïFo€íµ½ #j®šË¨ò©ùj>Z­WkÕZP%J@ïÕ{õ^пêfÝ Öu«ÝjûO=IOBƒ}À>À(ïU›j´áOèé‹ÛÐ׿@JJì+x ¨±£ùìr»œaœõž÷À#Œ¸Ð©Le*è§ú©~ꦎ: —J ap˜¿ ¿Ñ3úq? cG®CÕžª=†ÍþFï­­£×Oæ<É|’   pôõÑ×G_ÃÉðÉðÉ0t7v7v7Bo´7Ú…úÊúÊúJ¸Yu³êf•ãS+f0Í Õkõ:zŽ~Ü7¾oùE–ìX²#±âYH„jªåƒú~èÛÕ·KätÖé¬ÓY"­W[¯¶^©(«(«(¹pë­ ·D6§nNÝœ*yyy)R5R5R5"r{ÖíY·g‰x|òB^ˆGÇ8Á ÃïYø±~þE‡¿C‡¡Qÿ"× ;ugü ìÅöb{±“mÚÙ´³i'wwwCKWKWKÌL›™63 ¶foÍÞš µgkÏÖž…7¹orßäºØ‡í6»Í­gôã~ÒÓÒÓì{0ðlà™ëÚ¿ÓõC ˆ"Šœö¡3Cg†Î@ /ȃ»ê®º« \. —BàQàQàBNKNKN \ö^ö^ö:<öl•¢RÜcÆèÇýxEìKö%Ï=kµµÚl¥dˆ_^É+{šagŒárjå©•§VŠdefefeŠÌóÍóÍó‰xó½ùÞ|·¿Ûß-²%´%´%$â¿ã¿ã¿#òØzl=¶rÐh—Þ˜~ÜW$V+üãw‘H{¤}¬m“(Ý¥»äƒ¬—)q£¡h()öû‹ý¾æùšçkž‹ä æ æ ФmKÛ–¶M$·<·<·\dcÒÆ¤IN½/"Çä˜ù±ÉÑOøùҭ͆¬! .ºâSàíþ·ûßî‡ážážá>YÚ§}Ú¡Ð@TªSu®‚û¼ãÚ5x?{+ÿÿ $èB+¨ ì˜³c.£=]O=ÌæØ‡ìC 'ÿkŽ}fò“˜Ì–êPv­]Ë(éP€¦†jª?Ý1.ÒJ+èúš¾4%Š{»½Q,Qÿ—'ÿ¸ý¯·¯‹qûŸ/ØtÍßêÞ*IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.9.png 644 233 144 3101 13755454067 15034 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜöIDATHÇÍ–ýO”WÇÏ0¼ ‚Œµ]hÍ`—Z»ÆÙÆ—–ˆ/QÌVÉŽ¤±Òi´€M,0Íên!DÈf6Ú@ ÀîÛ¶›F¤Z,‹K¦Á..p¢e uØaŽÎÀ¼ÝÏþ0óø°ý ¼¿<ùž{Î÷{î½Ï9÷ ˆˆÈšØW .3.3.-ŠãJt»)Ï”·áoQÜÃk†×nÿÌ-æ€'>|âÃÈ„ŽµyÍe¼ˆÎ¿RO³ËÑ II†ý1\o¼øÆ‹¦ŸEq’/%_z‚ÒÏK?ø¬ã³NÂ׸°°a?èX›×üµxo%¿ÔüD_zz Ó”˜”(ÏxöÀs¿:L>¯zõÀ÷Æï*ÂÿRIUû/^´á^µù˜¿¯ñiüšž¦ÍGà©Ü§rEàðÑÃG“ÿ ˜ø*,M/x 8Ç9R!ä yÂ…áB–A9•б6¯ùkñŸÆ¯éiúÑ|ô£œ© <POBÁŒ`DúƒãÁq‚±L•zK½©Þ„Ðpèfè&Df"3‘ôáŃçR‘¡´PÁ'ʧ £üP°X°,húÚQþ]DdS${“½Þx5wàîp¨l•ÐO?(Q¢$zPÚúh À‚‹nVåQàœã€ÊU¹øøUŒ]L/¦Ï·Ñ|b;ÖúºZf(3ht‘­w,ccccÐøóÆ5kPCãCãCãºà¤}Ò>i‡ú†ú†úr 9†+2+³2ëøÖé[§o†æÝÍÖf+jjø»÷¿{_×SÓe›Ê6iGÛúD^¹Y—Û.·Áí^W­«VÈô­k]×Êrî[¹ö\;dy²gW4óäz9ç»ýÿÿµß·—€ˆˆDMý ¸Ü îËvô‡e…e%7XvWŽ+çï!²:² º.ºÎ|´í¸ï¬ â;ùl¿DIÐz+ô–+cÊ>{–íY6ײ/<„ð¦ð¦¿ 8Ð| àÎÕ;Wù†º‡º|¾ ÚvÜηëm<'¾œúˆ_Bî‡ÜwõAèÌЙ"´)iӒfflK`Û–m[f ÌÐnPÃÀlfë `Œ1ìõÎaÛñ©|»ÞƳñm>›ßÒ#»1v£ìØ»cox­UðôG8ºðèB›Ïßœæ4³Á3ÆT¾ÊgôCý.ÚvÜηëm<ßæ³ù-=òáÝVd®°]aÀ(€¿ L·éÝ©’U2~5C¥©4´Ú£rT¨D• @‡êP ê'Õ¦Ú@%ªj¨BuVE³E5©&ü Þ¨7À„?Åà§ ¯ª |(|h̽ªW®&̳€q‚k’I@£Ño?ýô£ŒZ›ú(?°>ÀËòÙü–%¯x…Ⱦš}5s ‘ÔòÔr½‚rã˜qÌíuýRR/ô-î‹ë‹ik]ܺX$,7,7,WdÖóYÏg=YêYêYꬬ¬y5ïÕ¼WóDBZBZBZDv~±Ó³Ó#óuL}L½„K¤r)—´Êh*©hÿE¹(Å¿º-akîŠl8²áÈÔ1Šk%S,ÿØŽ’ãÇEâââEšSšSšSDò/å_Ê¿$Ò¾¨}Qû"‘ÒªÒªÒ*‘Ñ¢D‹t¹º\].‘ѶюÑ +nqÛø®•ò¯¹+ÑÑ¡oÁЪ¡UÎ#×ݺÛúƒs¹Î\ŒÖ¬;Yw K K KàqëãÖÇ­àIö${’!ÛÈ6² ¸òöÊÛ+o°é,g9ð›®Ô•N>›ßÒ#='zŽùÞ ¾t´ý¨~¡_™d’,¹=r{ä6$J<”x¼¯ÇëoŠ7Å›EyEyEyÐx¹ñrãeHJKJKJƒÆÃ‡qT·Ñl4;ÇŒÍoéq‹˜÷Ì{®'"Ævc{à¨c%B†eXÄœkÆš±¿\Ûzmëµ­"qçâÎÅI7ÒtCäuäëÈב"1•1•1•"yEyEyE"óûç÷Ïïñ>Ãgq¤VʤÌÁàŸÒcuÁïGàúÈõ‘À5îÇPµª–IÕ¢nª›Áî®Ú]µ» ά?³þÌú ÿ¥ï¥ï¥V÷®î]Ý QƒQƒQƒP0V0V07&nLÜpÜÜ £Çè±ûUïò[z¦„ÕüO<hétLcÄÚyƳà`x_þ¾ü}9Œ÷÷÷ñÉò÷ø{ü=0œ:œ:œ fµYmV;þd’I´cðZ|~KÏÿŸc…Rèh•Gú‘~z³Þ¬7;ü_êÄ“E€YaV0Îßÿ=Ç>?ù­ýwa¨Õ`–™eø‰f-kÑ¥˜âOOŒ œç<èŸu›n®ãÅ‹³Ô,ÅRªÓÿùÉ?m¿•Óöu1mßcÓóû/¿†é¬Íã¡ÇIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-23.1.png 644 233 144 3004 13755454067 15023 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܹIDATHÇÍ–oLTgÆÏÀP!øg·‚K²™4×bÔ)`m5m¨­’¦Á” ]Ú&¥›´Ÿö &&.íHÐÄ© Ƹ#Ðh©Í2U·€iÀ›Òv( Î2:̽÷ýí‡árg›ìwß/“çü{ÎÜsÏs_ÉXúHÈIÈIXà ¶ì+v¯Ø{1†]:ØÞ´½9üWX}jõ)€ÌÖÌVcÔ¦ߌϱêÇó™vÉËr9å²­l 7À[yoå­Xßz µ3µsAƒÚ/j¿èhëhã#xxóáM€¹²¹2°°é7ãÍ|³^|}iø ¿$õ$õØ@JrJ²Ø_¶¿üìDZ€ñgáõ×^ `2q2Q%€ÒIWe@ˆ晉æ)ÞÌ7ë™õM>“?ÖÀšÒ5¥"ðÆÛo¼z.–0zgÎ6ù¢À1Ž‘ZH èôD@y”6°°é7ãÍ|³žYßä3ùcýX£üUDä³]°vÿ,¨ßDoh#ÑuÑu`ôGŒþHt©SeÜ3†aÐ~Òh@å©<•‡u Z,ŒB£¨±RÛ¢mõ]¬>T$U$“ßå×""ŽfH ¥†B¿S¿únønU¼ ª@æk®q Œ€0@'tÆ5ÒM7Ý@5ÕTÇÙ;è tîÑ=@¯q߸OxÉû*šÏãó€ÉkÌѼôÄ\ߪÞ÷mïÛÌjÆŸîe{½^/4e5%6%¢nçÞνkñ   ‚3ß™ïÌß”oÊ7eùU‹jQ- Žª£ê¨eo©mihi@}¿ýÎswž³øÔ;µãµãæh]ߊQ "r§º>ïú†¯úû«šœð3®g\DJþP²ºd58ÚíŽvh2šŒ&6´nhÝÐ {{{3ž3ž3'N´Y\\„ÊÊÊKzOölíÙJdéoÔ蓼¼fcwêE¿›Ö”Ö¤.C8Ž@Wê—Y_fÁá¿Ôo­ßjì8¹ã䎓PÞVÞVÞÎ1ç˜s ÜÛÜÛÜÛ`óÕÍW7_…¡‰¡‰¡ +ïñÈã‘Ç#piû¥í—¶ƒý¡ýû/ÐÓÕ}¤ûˆ§/N>?ù<Àª¾U}ê² e¦f¦#êH 2Pi­ý½c¯Œ½ùÍùÍùÍPz¨ôPé!x2ûdöÉ,„ôÒaOùžò=åà(v;ŠÁ›åÍòfÅž×Ïëç-\XUXUXÆ•©+ÖègôÐôèô(@æÊÌ•ÆH‚º¢UiU¶[cRcR£Èðß|§|§dÍ ÿÜâÚâÙÞ·°oA¤ïD߉¾"§ÛN·n©¨®¨®¨éu÷º{Ý"lb›D<·<·<·DæÝóîy·HôQôQô‘,Ÿèxô~ô¾ˆ\“³rvÙ¼F´—´—DD ·á¶$¨º…3 gîˆôïîß-2¸qôçÑŸy/ÒÉäÊbOcOCOƒÈÚ¢µEk‹Dls¶9Ûœˆž¦§éi"%%%"ííí";ƒ;ƒ;ƒ"Åë‹×¯ „¡@Èj,­-Í•æIJOœJœ’Å¥wî=ÛO²'YD$T*»; |Ûøð“?'ZlKþýÿÿ7àOôoôoDùÿè·ûí©ŒTF*AËÖ²µl˜vN;§`ÔuF¨U£j`æÜ̹™s`EF‘5ÊùºùãóÇQ‹7Â_…¿²¶’}°ëƒ]q[iꆥ#K:fêÌÔ:µnYwP×ÕuuT«jU­qò¬’U2¨  ªàÿmØÊPveÓ1|7}7ÿ¯Ž™_€ÏvqtýþzPbʬôt=Ôßµ $ÊYúéGÑÈ1Žú‡êR]ÀE.r2Ë,¨{êõ0¶¬üïï%YQ8³¬ü))@ä·Êÿô~+ŸÚÛÅS{{:o°ÿ@¾(S3IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-51-red.png 644 233 144 4125 13755454064 15602 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXí—LTWÇÏû1‚•–]’ ¨ƒeý ‹Aeµ‘:#ÆÑDLpQ±ŒÆm³þš&´dƒ‚Š]’¶AìjÛÐaº R--–”»QÓµ%­3S™ÖQFfx?¾ûÇÌ}ïͤ«Ù잆sï¹ç|Þ¹ß{o ŠØ/(Æø¼W‚+ÁÅMF’ftÍèšÑµáw¢,Ê¢|ã/´œ–Ór 2­6’H"‰Ìb}µ‘ųõ,Ë[Ï‹å1ò¢CtˆwÆÎ§.»Ä.±Ë9Âæs‡5ä”±”±”1\(¾]|»ø6°}xûðöa $¿$¿$_÷Ù<‹gëY>–ŸÕ{:ñkcýùoóãü8?î]Î:4·bnÅÜ ùè™3gÔç ˆ L`€^xÍγx¶žåcùcëÍûé|d~ž÷ñ>Þç½Èä_Í¿šUZížvO»§áFÔÔ,5KÍ‚$×È5r çÈ9r Ûd›l3øÑyÏÖ³|,¿Sßü¼†Æ99'ç$ëÅz±¾í&[`i´T[ª%›öš’«ä" µM9¦€ê•r¤ay…¼ä½ò^ Žã8t G×{åIyÚB_…¾Ô×Ôµfi´4Z%«Ïx™îšîšînZÉÌuæ:sšáyèyèyˆÇÑ<ù„\-Wèe¢HáßÈoÉo¨§ÕÓú¤|B~S~SÏÆê±úŒGãˆÄ×êÙÄ»åï–¿[®î&JN–Ë×ìkjÏmÏ€®ƒ€ö—Ú_€ÎÖÎV&““˜4r_(¹P Tw¢î„>*9ß„?ÑÜ «¯u6†TJfJfJ&G6ŒlÙj@ @B:ûæ/}| ˆœ{[ÅV£ŸX™X ׇ/€B @ÿ§ýŸÀÂ7¾Ö9Ö9€¶ér¥\©s³úŒ‡ñ1Ðã[On=¹õ¤þe²;¼2¼€Ÿ 5µ7µ@îO¹?;¥¾§¾ÓG¦Ç/>¹øÄø!ìw[Þ¶¤è½¾©ÃÔaêÐŽüb1ª…¿ú|¾î·¡US ¦PFb猵3Öho$’šºº‰è…_/øšˆèÕ¢W‹ˆˆzô< "Ú:kë,"¢þ~"¢­øÈ.dDDÓ›¦7Q8:ü}OßñÝü}þ>ê"Á~¯ßë÷’›ñoãm¼múA´ÅçÛ|n³A‰ÓK¦—Àpíp-€Ð¤kÒeÜâÉÔÉTàR¹ThžhžÀÏXQ[Q)oGÞÃéï »Ãn½Þ•¦+MWš´ð\6—ÍeO? a•°JXUÝÀNYú¯Í;Ì;äùžßÿXñc…~}¨ëR¥T ªrªr¨ljð»ÁïŒìÚØµñç@7Õoª,4šhÍP*•J„‚z‚ ³:³:³ZÑ!UHRO?¦$k’5ÉJ$ö‹ýb¿Ã§]ø%…¯¾"kÇC±·nnÝŒ\Q  wŠ;e´çÛó@SÆ@þVþÖÀØH ÀãµÝk»%r§jŸ[ñ W…K j€û„}¾[¥¦Ÿbmî;¦lS¶)Û{–-°×={ô¬ºN»?~9t~è¢,U–¸Bêçêç€mØfìUäÅRש{Õ½z}_‹¯HOLŸ•>K: u²V¨jí ÍF6²‰fµ€ ¨@¬%'9ÉI$ø…{½£ÝÚÓÚbÞiÞ)%{^w_w_7jWJ‘R—pÉÄ=Üà†µT^(/Ôû»ëï»nïº-Ñ^  q\wK;˜v0í oá-¼…ëŒÒ•3ÌYÑßRáŽpG¸ÃõdTeTeT™*L¦ ×1M»–KQ»Š]±#WômÅ(F §z‘¼H^¤÷·9·9·9W]Çò™’MɦdßTÄ7'Æî4×·õÄŹ_ÆúæÄˆv=ºví5öƒv“¥d)YRî+÷•ûº‡"uÍš94sH-Ö4™Ä'ñI;ÿ'ÅwâøèéB³A»»¹Ýë‹9çàFíºú\}ºv¥>©OêÓ•û$íIÚ“4`ÙØ²±ecòBM‹B‡Ðñç5LjQéž@Ï0=€%еëüí6™›ÌMR²ÇáqxB!„1Fjï±÷Ø{ôkGl[Ä–¡è¿$3ÿW7:NÏ= 0ÞØ‚QížÿOÚ-ÜR¸¥p‹®]×××|™Wµàʸ2®l}ul~4®.Gÿ¥=K»yBƒÐ 4xspY]Y]Yz*+œÎ KÿÔ¶Ú/ø¿}.µQµQôÚM233333¡ÁS3?=ÐÕü}þ>ŸÕd~“ùMæ7Ì;ûIö“ì'kB™ó`‡ÿ]ð|Ÿ%{§*§*§*Y.Nã4N“t!A:щN{±{Y®4^/'éücþ1ÿ¸é411}\”5'kNÖœºöœ„œ„œ2 BY÷”CüÉÉ¥¡3€+°+h™˜-f‹ÙâOÓÖië´ÕkivUvUvUYßôÀôÀô@í­‰Å‹'/ùOe¾2_™«Kâ–Ä-‰#éË$Ë$Ë$ÀRÏ¥žK=×ÚuÝåïºßo&¾3Ÿ+¿‹ÇÅÇ;w0‚©™š©Å7ɲ‡ì Èç¸.àÚë·Öo­ßÎóœU;«vV­#-®3®3®“Ú¶.l]ØJ6HÓ¥éÒtLà|‚O À&0`va_øÂS~S~S~ØÐÚÐÚÐÚÀìõAõAõAbÚðkï ¿¶ó¸"@ X)sìqìqì‰Íg‰,‘%Þ“€€€FŒÉŒÉŒI h@ƒß |%_ÉW6ümÚ6m›¶Í[¯ÔFj#…ú÷ôïéßãË4Ec³1³!°@ÈÁ£ ]è ‚ *ãÇ8€ù˜ùé&ݤ†0„!ðfµYmV£÷ÂW¾ºð•ðfïÞ½7øF7¹›ÜMþ{µ/Ä ñ¯nÇ«x¯>£ò;ò;ò;€Ä[â-ñþ¯ëÕÕÕóÖkõZ½V/lHLHLHLà5Þo7f;n9n9nâfq³¸ü Èäò@úHéÈ0&É&Ñ$ÓÄ41 ¼Cæ9d€ûm÷Ûî·1Û_»Y»Y»YØàÊïâqñQa\Æ×-¾<}yúr¿ÌÒÏÒÏÒ3¾D_¢/á]±ˆkŵâZ¨¹W¸W¸Wzšž¦§RLŠI1€d$#ùÿ5Q<âà7ü†ßú)ý”~ p“Ü$7 °6ÖÆÚ vÅ×_Ó_Ó_ãËfmšµiÖ&¦sñ¸ø( bA,èó-ö({”= ˆnŠnŠnBœ¦LS¦)ƒ›˜(&ЉPÓZ@ €¡C†MÇ›Ž7ºu?ê~ˆb…XÌt}%*Q L¾=ùöäÛ@‹_‹_‹СîPw¨VÏêY=ÀN±SìÔšcšcšcp‹n‰n‰nAœ‹ÇÅG tÿºÏcÈcÈc¹‹¢E/Š&X`nô =CÏ=/ö¼Øó"¿;wþnà*¹J®à¬ÛY·³n@yJyJy fÌ’kɵä999ÀyÃyÃyPb-±–Xâ â â ;±;gns[4¸hpÑ 1¸x\|88zpôਘ[¶²leÙJæ2«!d3kVÄñEóc½Ã½Ã½ÃŒ¥~—ú]êwŒ™µf­YËXeieie)cÇêŽÕ«{æoj45šË Ï Ï g¬7¸7¸7˜=oV‹‹#Äñó÷^:úÒÑ—Ž"x¡z¡z¡”ýÂ~a¿€ÒA#[“­ÉÖÜ£÷è= ¨L*“Ê´œl9ÙrP>V>V>–¬Z²jÉ*àzÄõˆë€ÆGã£ñºRºRºR€îÈîÈîH`£°QØ(þçýÏûŸÄ±F¬ˆŽèˆ´}²}²}ôñ­Ç·ß"C”óá|8ö½e¹e¹e9z„……ÁÑ›ô&½ 檉û û û ` ±…ØB€›÷oÞ¿yh3¶ÛŒ€ò”ò”òàˆtD:"íˆvD ôWõWõWl7ÛÍvæ:s¹8;tvèì0\=\=\ Ðut]7“³þjýÕú+z¨–j©–}OeGdGdG„¼ž9=szæ°ïï.¸»àî€\$ÉEع ä@ÅÆŠØ±bIyIyIy@Ú¹´si瀶¼¶¼¶< Ý·Ý·Ýð|ßó}Ï÷¥5Kk–ÖÛâ¶Åm‹ÞÙòΖw¶ö\{®=èø¨ã£Žf4j3n5n5nŒñß²Y¬GÈ£ÐC}Öi>“Ïä3Iz]`]`] Ckn67››¡àm¼·Á"i“´IÚ€±Ž±Ž±ŽgMcK¶%Û’NÃi8àQíQíQ x{{ƹƹƹÏüGGGG’#É‘hvhvhv`ÊyYqÅïŠß?q1#1¢8ˆƒ8θ‘Â… On<¹ñäFi¿õ]ë»Öwßò lllv¤îíÜÛ¹·“Ëk3´Ú ˜*++ƒ¡E(`gvfg@ˆ9Äbüüü‘#F†4Cš! ×ëÆuËÇò±@XwXwX7˜^«×êµ ‡+W'‡‡‡¨B±J±J±ªe»½Ê^e¯ / dü‘ñ€Û¸Û/<‘<‘<ùI>~uüêøÕy‰1‡bÅb1ë¯_¼~1ùqÄ1âq€õËûåýrÕ€j@5ÔÔÔ4ˆÑ aC`õµúZ}ã˜qÌ8())ºtè>ÀDs}s}s=¶–¾\úré˸¢Ð(4 ÍäkŒcã–lE0‚|ï].ú…è¢_àîRRJJG·@9äÍë$—$—$—v-ÿ]ú»ôw)»ã¥òRy©ˆeÞÜysçÍÅ+sÔsÔsÔxÆxÆxÆ$‡ä^ð‚€#8‚#€Û[no¹½x›¼MÞ&À³Ð³Ð³Ë!Ë!Ë!¨ÊÆËÆËÆ…FGŒ#ÆC7pý\?×ÿq1Ö` Öüp¹ÈE.ïçóËžÎüçä9ANü˜D#i$L«Ä>ìÃ>Zpåë+__ùZØo^c^c^I!)$1YL“¤"©¶a¶(F1Šd €¨Õ¢zF‹êêòêòêrGªiÀ4`àOHUR•Tu.gþ—ó¿œÿåñkÈB²ÈßÐnt ±®yT‰>ô¡OhG RB*C/…^ ½”·I–(K”%žË1›‚MÁ¼ù‚þ‚þ‚Þ‘êJHBI( ÅÔÌÔdƒ ¶gÍÃFÙ(£—éezÒŸ?6²˜ÛªÛªÛ*.O)WÊ•ò“ÓåÓåÓå¿hÏjÏjϘ‘™îÎ0%.Ð ç±\T‰*Q÷»î>ºû˜N™N™N9ø…ÒCé¡ô¸_ÞYÕYÕYÅåÕ¼QóFÍ,†$‘$’©X*–Š¥`O¥3"° ƒFœ« « « ƒ»r@9 ÄåârqùÁ/èQz”}0ùtØáN8Ó9éCJ\Oîü%‘:—Îqy¨E-j©dYAVÄlzúËqí’}¿}¿}¿˜¼SÜ)îéê…G]xñb‡Ø!v@Aƒi0 Æ”.¤ éž <x2Ð1 | | œë’…ÉÂday+Ÿ6MZ£h ¢?á¬ìWÅrrrrrr`qí(œ'f4äÔnªS»'H>É'ù?^¦Ñ4šF§U"‰H¤Uö*{•]Øo.2™‹  ”RJ1êÚ‰:[­Î&N<0<0<0p]²ÏdŸÉ>k¿:õpêáÔÃÏŽw­íZÛµpj]ïS ‹oô9`—ƒÂàÚ½ZZZ‘·I¶O¶O¶ï\ŽÉÇäcòáÍç3ÏgžÏt¤:i÷VÏVÏVO7Üi¸Óp‡¼©èPt(:Q+jEmòOü~¿Ã¶J·L·L·ŒŽ8ómt}GžçâðÁ¹len̹‘ÿÁÿ8æ:æ:æÞ¤:©Nªû·‚?cÿŒý3Ö³Â|Ï|Ï|»[r·än‰#bÜ>n·s)’Õ’Õ’Õú±"VÄŠ¾» )¤r½ÁFD_Wœ%<ÏCðOì/´›Ô Æ‘Å*Y%«Œê¦éEzñºÉ×'_Ÿ|] ‘$‰Þã¹D.±þFàÅÀ‹×D»ÝÆnòwÑKô½ØgÜ*'àÄ_qPü{N»Î×…# IHBßDHI¸ÈjX «ùx—Ü_î/÷§÷¸>®ë{è/‹‡÷?êØÞ±½c;ð:g¼ò¿*õóöÌçA3á*é=IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-72-grey.png 644 233 144 6235 13755454064 16005 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü RIDATXÃ…—kPTW¶ÇÿûœÓOÚZ+@BBà6`h@‹‡âB`LÔQ| eå£$ƒ†Ì¥wÌ5Hi4ׄHÚ")‡$L| †j…HƒBD)•‡£`+M_º›æœÞû~ SV¥²¾ìÚ§÷^ë×ëü÷ZûÂÂÂÂÂBøa¬—,Ün ·Ymá—…_~É‹=(zðç(æÏü™ÿ¾¿JAR÷š«ÚUíªf{qGp„ ‘ˆЉNtx ¯á5¶W‘©ÈTd’á¾p_¸ÿŸ#d˜ “á”í Ø°+À|½xMñšâ5Ä"…J¡R(Y0ÁA/y¸ü¸IÀ$$!‰«¤E´ˆÑKãöqû¸ý©ø"S‘©ÈTygÜ2n·Ôýè˜é˜é˜÷wŸRŸRŸRœ‹ËˆËˆË  ²Y‚ ˆ×Åëâu€wîýݻ޻ßëoÒ¿'ž7¾—ÇË'x28—i™–ii6Ù@6 ¡¥|(ʇ6”Û¿¶mÿúyÝÔº©uSëÜ[3:3:3:91º#º#ºƒ,R( pàm¼·¡†8¬Ã:¬ð4žÆÓp¸‚]Á®`,êhêhêhbb}d}d}$Ý:8pþàüW?R‡ªCÕ¡s”î î î é¥,—å²ÜÛÙÜ\²slçØÎ1MhBSð¡Z¨ª›Ž;ÇãÎç†Í ›6OJÊz#ë¬7„J?›ŸÍφ0LÃ4LƒÄÂY8 ‡€.t¡ €hŒb£"€t“nÒ ð XµV­U‹ÞªÏª>«úLÊîý¾÷ûÞï…¹J®’«~©‘2¥L)3e5R‚”{ÿÇ©ZU­ªV@( ”î¹è¨qÔ8jž_¶8lqØbiQîšÜ5¹k„ß×}_÷}Ó¤f©YjèNº“î„€~ô£`Øö@#ÑA2H˜`‚  «è*º ‚ÛÏíçö|›}›}›1Íë?lYز°eÒ"o|/—ÕÕÕ.ˆooo­iÕÚµv­éó®ç]Ï»NZýÎøñ;ŽÙ˜Ù %Z¢%Z"D2È hD8„C8 ÉHƤÑFÚH.KãÒ`³n·n·n=ì:ì:ìb 6MgÓ‘y‚x÷(îQ \®WÙ€l@6 ¬X?°ÈjËjËjpq0.4.4.ÔwÕwÕwÑc£ÇF!1!1!1ÀºÊu•ë*ùùùÈ£k¢k¢kˆ±¡º¡º¡{íiö4{Ú¬»±»I$wœ;Ο”-hAËcM þ‚¿à(ç*ç*çÃÛ‡·o¾ÛøÝÆï6¿dü’ñ €^ô¢Ð'èô À¼âyÅóŠ£M‰JTä+å+å+ÙYÙYÙYsÚÚÚvvvL2ÏÈÛÛìmö6Üâq‹¸Eì§ü@ùò©äVÀ­€[ìÄÕ²«eWË`€Nw–;ˉHD‰ÄG"ÐÔÔ$H:tàq*HÉ"YÀÈÝ‘»#wcˆ1Ę};f_ }_ú¾ô}Àz~=¿žø+üþÊävgï’Þ%½K€ž¾ž¾ž>ü¯ò–ò–ò–TÂ! YÈÚuD( …BR`Ö™uf;Ì:Ã:Ã:jÞ‡÷á}`ózºp-àZ Í׿kó}¶>[ŸííéÍ.³Ëìì)ö{ ð¦üMù›r`îÚ¹kç®&ëqÍ£ypI¥‡ÒC¨Ï^<{ñìEšDzHéÁ!â&nâ.— /^xǃ¢EŠ kãããsz«bªbªbÜ[r‘‹\ð%žø®«QW£®FA´J¥"¹šM„&,¶"¶"¶D“£ÉÑä<Î$gà œÔj5@ÄùˆóçÈ‘ "Ó˧—O/u‰ºDœC3†f ÍÀ²úÎúÎúN²^uPuPupl>Ëgù,þb.ŸËçòï§ Üîw„oEêP×—@“hMÚð¹º_ݯîo@S[S[S3Ÿ>|‚|},úXô1d²xÏ⡞ìéžÏ99'碅¨ßžãåXŽåjPƒØGGG¡­Y]³ºfµÆ‹¼È‹¸Qn”ÝAél:›Î¾±‘•°V"{®yî„ ï’RRJJ/äs)\ —²µyÈC÷©iÌ4f“6 >0|jòy¼ÂŽðßÝÁÜØ,6‹Íè zƒÞèT:•N…˳Jû­ù[ó·f÷– É Ÿ(d ™BöM±a£a£aãG Ø…]ØEŽ¡Ýè–ÒùÔÔÔÔÔTø`#¡þ$ŽÄ‘8ò¾á Æ/~Xj]f]f]6³¥ÚRm©±5555î-q‰q‰q‰ÜR¦fj¦†‹¨ˆŠ¨ àY<‹g’OòI>€ !ŒkåZ¹VÍ=Í=Í=ìņò†ò†rî_S4S4S4÷ÆÄ¥âRqéêÅ–ù–ù–ù6‰˜‰™˜‰÷xnó^œžñ8ÕP ÕÀ·½¿½¿½ß<¾y|ó¶÷}ü}ü}üoï4uš:M|IíÊÚ•µ+Ù‹ ýŠ~E¿ƒ *¨6ÂFØÈdYsô ô ôà›ºØºØºXøúX|,>€&ÒDš¸í}n?·ŸÛoÌ#ÅO™Žôß^‰ÃæÍ(<&5äÑîv?ñh÷Û‰r´µ¹ÈE.÷©I4‰&QÚd-³–YË æ8Žã8Œx3avšf'uÜ3Þ3Þ3ò]ÊÊÊ×Ϲú\}®¾u½ÔõR×K^mKaž}j/àd5y²É>±@íqðolÆfl&g¢NGŽ:]²T™§ÌSæ}S<44$XOž,EŸbå¿& ã÷88ü=¡]_vw!ùÈþCÖ5dÍÅpVËjYí?Ö©BT!ªî‡¿Ãßé ¡ûè>ºoSÿÍÕ7Wß\ LBïñç½X:ÿˆãÿh/ 챸ÝåIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-47-grey.png 644 233 144 6135 13755454064 16006 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—{P“WúÇ¿ç¼oÈMCm ¿L‘4€D+¸âEZ±[Ý.Ö±¥ã:cªXÝ«­ÕV:Ý¢uKÅÖŠíVÅe½ 0aí°:ÒU*åA:PcQAIÞœóûƒ:ö×éóÏ;çö<Ÿóœï¹¼$+++++ ZŒ™}ìC“Ä.±Kìâ•Y'²Ndà¡æûæûæû©3yâAû6JaR˜6ï5W™«ÌUÆsQˆB’݈F4¢´¡ m^ÃkxçÊWÉWÉW‘Ýâ=ñžxï¿…d€ ]G³uÙºl]Msκœu9ëˆMŠ"¤’6ÆÁê|\Z:˜€$ÐSÌÌÌÌÌêÜÃîa÷ðqærs¹¹üT·Ûæ¶¹mÕ×sssç½¥ÎWç«óQ1oÙ¼eó–‘Ýñ²xY¼ ˆ Ž Ž üe»¿¿¼ß߸_<|?ŸOôe0‘k¸†kXÙ@6 ùB„!D\:6\4\4\4-8¤:¤:¤Ú»cYÛ²¶emÔÓÓÓDž—ï–ï–ï†ï༜p `=Öc=€'ñ$ž„Ó¥wé]z<ßdi²4Y¸§6º6º6šíxøìÃg>ûÊǪU„*b¡Â»Á»Á»!%Ÿ›¸‰›º2h"Ù;ºwtï( ,°è'‹eb™Xfù·{Ä=♶°ذذXJX½uõÖÕ[ÅSZ‡Ö¡uÀ€)˜‚)x$ä‘ÑŽv´˜„I˜àá€(D! ¤ƒt@Â<Àˆv]c× óÜgç>;÷™”Ñy¥óJçñZ€2@ ¼{QZ%­’V-Z‹EX„E=CTÙ lP6²PY¨,ôïÿq^t^t^œ¶Â°Ú°Ú°Zz޴δδN¼¦UiUZ¦°ëì:»`+¶b+D<ƒgð @BH H7é&ݦa¦hA Z–ͲY6DéªtUº ¾øzàë˜â÷oxÁð‚áéy|?Ÿ˜+Í•æÊ´8wƒ»ÁÝp±A3¤Ò qã¦{›îmºG´_i¿Ò~Êy"O„†Ô“zR?‘)|‰/ñ%€D$"@AáßÿŸÍÅ\Ìp ·p {‚=Ážvdù‘åG–óxG€#À@¬ñññ+âEÍ£yô{ö¨=jXòþ’÷—¼eÚ*m•¶ ¬ŽÕ±:¨h=­§õoâM¼ í¤´k:×t®Ïž <„|òIÈ'ÀQ?Dý0 LppÀ œÀ qˆC4'hNÐhôúF}#œÉEÉEÉEXV^^Èô2½LÿÞŸ©d”Œ’ñ›‚=z€ÜÙɳ“g'“ß¼è]z—Þøt>OH ‰!1@W`W`W pÐtÐtÐtÌë˜×1o"aUUU@qlqlq,pöÖÙ[go¥ý¥ý¥ýÀ'¿8ùÅI 5´5´5t|X@Œ.F£#~?vîÜ9ÈrO-<µðÔBî·aö{ƒ½Á9WpWŒ×óÇsþÑát˜ó7ÓÞL{3ó†} ûöMôsÝF·‘󑺑º‘º‰zK„%ÂÁùÁ‡|ȹóóó܆ý<~>Šð> Ñô4=MOÏLÎ3xÏЇ>ôMdêxÒñ¤ãI€6]›®M‚,A– ànw·»Û'ú ³…ÙÂl@‘¨HT$ï¼;ð.Pµ½j{Õv åó”ÏS>”!Êeà-ñ–xK&âÓWé«ôUGpGH4„0!ŒŸqÌwÌwÌÇ)SÊ”2!3ä 9î?n*Ò+Ò+ÒÉÍ“›'7™™™€Çæ±yl€¨u¢n”wñ.Þ5Q®QÕ¨jT@dJdJd ³'fOÌ€[¹•[ú"}‘¾îŸçðÍá›Ã7q‡¨øªØ¯Ø¯Ø/åÝÑÝÑÝÑñ3CCCÙOö“ýêêêêh­£€c­c­c-p¾í|Ûù6€çó|žXÊ-å–r ¡¸¡¸¡n 7…›@_i_i_)ÐÖÖ$ä%ä%äML€9˜ƒ9B %#+;Wv®¬½Ö^k/>RÜQÜQÜ‘òD¬Æj¬Î.—ŠKÅ¥·F]£®Q{ ÆFc£±QèT§ªSÕ©p¤êSõ©zhFµ£ÚQ-à:á:á:Ð%t ]hä¹FL–O–O–O€ÜÞx{ãí€fP3¨ŒõÆzcý/$r[¸-܆KÚ/í—öCõµõkë×V–@$"‰^#É$™$³‹¡—C/‡^þpÏ}ó}ó}ó¬¿ôgögög¾ÚyvñÙÅg{·›úL}¦>!/%&%&%.Øa‡rÞ£÷èë…× ¯³âfÅÍŠ¢—D/‰^ò ÐôÛé·Ó°§Ãž{ ñ4žÆÞfo³·\X/¬ÖC^¶¨lQÙ"æìêê¢×T=ªUÏíµžrO¹§|ǧdï{Üû#€¸ÿsHf“Ùd¶:å£ÒG¥J§™Rô)ú=_šv,íXÚ1rYª‘j¤p!MHÒ@Zœ-Î'0uÅÔSWSk§ÖN­¸Ä%.­Ë[—·.‚y0æ€î’î’îÒø<œßïú~×÷»°¦èPÑ¡¢CøZyWyWywôY.p óÖ`:¦czK&¥…´ ô=@ôþY™•Y7¸Uߪ¾U} XB,!–>«é­¦·šÞB±˜*¦Š©ÁÌÁ`fÀÌ€™ÀÔª©US«&2éÓfÔΨQ è®è®è®Œ7;†¦ MšU…¹Â\a– ²vY»¬ â Ž=Œ, È‚–Lä!y¢ÞwÉyãÇÞâ{$Ÿä“üË[Æ´·£ &˜`¢Ÿ–£å6Ûsí¹ö\¨Èwä;ò,ƒe° ±ˆEì/®ÈŒ`àá<œ‡ÌÅ\Ì—¯US±±bcÅFïö·Þx[<$”GÊ#‹s¢r£r£r?¾„ld#›üè@‡”â¿ÕèF7º¥flÃ6l#e3ÏÏkŸÅÕ±Õ±Õ±TÛÔ6µ `óÙ|6ç‡cÒëõIñï4Nó_Ä¿R¾_ÿÁâ["!Õ¨Fµw;I $aéŸÆ~9.]ðlölölf}…½Â^a4)æ@̘XÅZY+k…ŠN§Óét¸¤ÝÒni7ä‡#GŽôFÙØØíŠXE¬"6oáØ¦Ùq°V ò­ìßü+–“““““ÇøCÌW1®!Ÿv·û´{ȧÝÒ_i×Sî)÷H›íGíGíG¡¢”RJ1èÏDÍHÍHÍsöôôíŠ=Š=Š=Í®^W¯«wÏÇíϵ?×þà4øÆ©ü€~¾_½ë ò9¨÷i÷¯´66&ÚÏfÍ:›åÝî{§677ã+Kƒ¥ÁÒ@2T­ªVU+À ÌÀ ­___ù_c¼1ÞOû}ñþ8¾3¿aÉÉÉÉÉÉ|Å&ÀxyÝ6Ã6Ã6ÿô>å}ÊûÔuIn”åÆôONù9åç”àóö{‹½…ÿ£ñxãñÆãÞÄGžGžGa›,I–$KzSÏò£üè¿* ‡r¡ýèG?{Ò¿¾DIóüŽý†vͨD%*½Ù¼Œ—ñ²äZBKhÉ7ÆÑ•£+GW²²Y¬€¶&Á$˜j¯D–D–D–¤&[;¬ÖRÅž`O°'ø1Ÿßr ó·8(~ÇÓ®ï¸ðfc ¶`‹ø_²Ž¬#ëþÉ+y%¯Üµ^® W†Ó¡[èº{ÃÙ>¶íÛüSëÚÖµ­k1@}þüË‘ßãø?`¯þu7‹;˜IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-19.9.png 644 233 144 3024 13755454067 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÉIDATHÇÍ–íOTgÆï¤Á›¦[Ê‹L*¶Ñ…(»Ý ‚€©%’–>H ’¸1!P“fClI躩®%-Ñ5v­©„F¢iÓ­ ØÚ4È.Í‚EB™ã¸Ìœsžß~˜9sfûx¾œÜo×uå<¹¯óˆˆHJø-ó\Ìs1ŽPSoå×”®)Í>Š»u°UÚ*h…ä÷“ßH=“zÆøÑŠÍºÙ=/báGó™yI+‘p1á¢mg8nƒW7½ºiÍS¡øÄ $ö&öþWƒ†¾†>€Kg/åÏðËÍ_n,î\Ü VlÖÍ~sÞċƗ¶ßð‹@\\¿í$Ä'Ä‹@FIFÉúC¡†;ëá劗+~Žý9VÅ€>$‘¤v>|˜'*6ëá~sÞÄ3ñM>“?¤G`ÝŽu;Dà•êWªO‡~üÞJ{+Íä öG9Jh>Í ×è5¬‚TƒØ°›u³ßœ7ñL|“Ïä鱎Òù[1ú>mŸ4d$³‚Y ¾ÕŸÕŸ%.(ã¾1cÌ€¶ ýªý ª^Õ«z¬Ç‹O$RÆ#Í¡9j Á§ƒOƒª áÃ>ï>/°æ嬈HN'$ÞM¼ë³sy"s"ôk”sÉÈ1rðGªµáG¢„SL1L2ÉVZ-Dúr@íP;ð³+Œÿ»ñ¡ñ!€D_¢Ïg盞ðë¾ÎRcCc¨V#×î©ê©ë©C¹Ê\Å®b‹päêÈÕ‘«Ðµ½k{×v˜žž¶êÆ´1mL[ñhóhóh3tmëz±ëEÔä퉎‰ŽHw®ºw ç@Žy´Ý×…­""Ã-ðÉKŸ¼Z+€zãõ¡×¼v€UsEô}@‡éãÓǧCº3Ý™î„ÂS…§ OÁ†ƒn83m3m3mQ‚öŽîÝ Y Y Y PxªðDá ØPïŒwƳ:[¾üÌò3ê ø¬ó³NP !=Â_åŽruî_¸Ùlb\ØxÞ{Þ i/¤mLÛ·ænÍÝšƒsÕçªÏUCÁ`Á`Á % o%o%o:k;k;k­üIûIûI;l›Ù6³m&ªß“ûyîçð÷>šüh ðuàkÐô'¾zâ+uQ umêZcŒ+žO¨FÖ€‚¾‚¾‚>èwõ»ú]°´iÿÒ~Ø\´¹hsT®8\qâóãóãó¡ûN÷î;–€‰¹‰¹‰9ȫɫɫ‰îˌ˄Sϼsæ< ûu?è²Ö±ÖaŒÙE7z^Û˜Äsƒ¹ò‚䋈ȺðnHðÁÓÁÓ"öŸìwíwE———D²c³c³cEJ¯•^+½&rÛyÛyÛ)’~,ýXú1Š?ÅŸ"2hþÐü!§r*§ÙÕ¶ëÝ]ïŠ ÿéûöïÛE²î­·­·É:‘•æ•f™U¨lc1b÷•øJF¾“ÕÁ+ƒWDláͰ®€ã?—Ã%¢šT“jɼ‘y#ó†ˆw·w·w·H{U{U{•H]e]e]¥Èm‹¶E)˜*˜*˜IÚ“´'iȲgÙ³ìiÿ}ûóíÏ‹Ôþ±æÉš'%P’\WÇ›òïËÕ—«Eb?ô×úkG¾³¶2ØøvãÛÀŒ¹•ú—ú—à}Ïû©÷STà/–@‹uD«S«S«SàÞêÞêÞ tÐASÆ”1žO‹§Ô€PøWà‹ÀàÎs¹‹PjEË×ò­­d±±¾±B~Ú}=,,§݉nŸÆ?Šð—³bœ5ÎZ>ÆS¤’ ªL•©²(¿ÊP*¨£Žº(K!‰$PeªI5ŒøUzÿàøÃñ‡áÿéÿ|Lv^U[k9? Ú¬6 të~Ýo9?m´Ò ê5¤†€QFæyÀPcÊ¥\‘5R¼§ßÓïT75·æn™Î_e¯²Áß:ÿãû¯|loí}ìñ¼Áþ •_™Ð‰gIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-10-grey.png 644 233 144 5772 13755454063 16001 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ¯IDATXÃ…—kP\U¶Çÿ{÷»yCä¡Q¤å‘hˆØ„DEo%‘‹)4­‡`œ©TÖ P0`1Ɉ%pêª$IúyÛQ'@¨$<š(W:MÓMwŸÞ{>ÐR±,×—Sçì³×úíµÿ{uHQQQQQ|±h¦Å Ý(½)½)½ÉuE_}Yô%.™,™,™Üò0÷ã~Üïý? !Bˆóš½ÉÞdoâe¨A jH>¢…(}èC€×ð^ãeŠmŠmŠm$_:.—Ž_©!³d–Ìþ­º8¨8¨8è\OiFiFi™„0!Œ¤,r°Ü\¾t 0ñˆ§'X +a%ìǼcÞ1¸®D[¢-ÑžvL8&­ÿ±>f}ÌúXLžG…G…Gšc6ÇlŽÙLòce±²X°Îÿ:@¼ÇÅ÷Åù¢¿%ÿîxb|‘G䓺3¸{soîÍv’L’I2Ã*$a’0IØ…ÏæÏŸ?þ @k@k@«kÿæ¾Í}›û¨sM÷šî5Ýä9E¾"_‘+ÞÂ[x jXa…À«x¯¸÷â^Xí+í+í+ñ\·¾[ß­çÎóQç£ÎG±ýƧŒOŸzéu˜:Lö'¥+Ó•éÊL®àY<‹gÝÜI@@@7Â…Â…Âzè¡_é%m’6I›ô'6‡Ía{ðYM‚&A“ ħ½‘öFÚÒ¾f_³¯¬À ¬€À#x€ýèG?Ox€XD"‘ dnánAjò6y›¼q£á“†O>vÞøþÆ÷7¾—þ,WÉUrÕP‹°MØ&l{2OâI<9:GUíªvU; –Ë‚ÿqÉÚbm±¶<ø¬&M“¦IžËÊÈÊÈÊþì+ñ•øJ°‚Ýf·Ùm€gòLž )R‘ŠT€‰‘ò ù…ürÇý8'ã{†=ÞԕîJw¥>3>3>3X!úפjR5©Âsb|‘Gä#%º]‰.e£ÝÑîhoi÷žóžóžãá٣٣٣¤Ý·Ö·Ö·”ðoìÀìÈ!#šÑŒfs˜Ã/xÁ @4¢ `'vb'à–Æ’±t–ÎÒz’ž¤'a6½nzÝô:Ø1¯c^Ǽx¬ÙÇìcö!y¬Šwñ.Þ%Q´ŽÖѺ¥ ’@HÂrà°¬°¬°,àšwjÞ©VŸY}fõÀ:m¶N/¿ÇËx/ŒÆFc#ÕÕÕ²<þPÞCyå²NY§¬mmmýÍ:tÝEw8†c8F¢¨$D" á§Ìqæ8s…\!WÈ…„öÑ>ÚŽoñ-¾$]’.I×[\I*I%À_æ/ó——Ÿ/¨T *ÀXh,4>>>w¢ûÙýì~@<”®)×”kjyî«d¾s¾s¾ƒTC5TÃOQåAåAåA¡|0h0h0ˆŸêªîªîªðÁ#°±­l+ÛzG]­=è†4¤-?V&+“•É€ÿYÿ³þg¹Ës—ç./Ó+ô ½ð^À REª–N`3¤Ò é€aÌ0fÃ!å rP9(”ÓÅ@Å5Ò"i‘´ˆäŸó?çÎߥ1=jzÔô(Ô”RJ)Ì<žÇóø;æÑ<šPÕQÝ™Ž&Ñ$¸÷á>Wr¯ä^É]¿–}-ûZ6 ¼"¼"¼„nݺv÷°º¹¾¹¾¹žÅ1>%.â"®Ïä4øbðÅà‹ïÈ“äIò¤ã£ÆuÆuÆu’ ¹ ¹ ¹®}nÞ<•§òÔ%‡°ØGì#ÀBàBàÂ[+Ú–œ-9[rÇGŽeçËΗ´sÚ9í4–4–4~Ïð=Ã÷ CÑèÙèÙèɬcgÇÎŽ¥?Ë?”(ÿðZºsØ9ìÞï$…#…#…#ÚІ¶ûŽÈ&e“²ÉT­EkÑ>˜•¬JV%«ø¦”ú”ú”zrQÔÒPÛPÛPK` ,ÐØ46 ÀÀÀËqËqËq ¿®¿®¿¸p9à2:::kWEWEWvԦצצ㬚¨‰š,<Å%\Â%1;° «°êúnJkh ­‘´ÓÃô0=<öW6ÀØ@¦C­WëÕz@¯ÑkôþHw^w^w¾µšššs  6Ø–±Û±ðœ÷œ÷œb,1–Ë ÙÜdn27AÝüDóÍO¹L.“Ë€Åö¯€‘õd=Y}7ÊQŽréJw›çŠ]ì¥'¤‚T\ÜC“hMÚß„,d!‹~¬uhZ‡cª3Õ™ê &¤ƒtÀÌN±SìTPKÝ“»Z ¹È˜‚)˜bI:Þ-GZŽ´qí›m˜m˜mQ)‚A_—FŠ<yèƒ (F1ŠÉI `B²Øz`Ãz°{±—4=üÍÃß<üMùve¶2[™ýuélðlðl°ÔÔ`l06—µK¦É4™†ÝèF7€Å¾l¹ÞظÛÀi3m¦ÍPühøÑð£oj³´YÚ,’rOOÏÑÇIÇIÇÉ7ßë)î)î)¸¸>n7_ˆ V÷µŽy2Oæ Ÿ«¿^ýõꯀc¯c¯cï›ïyøyøyøÝ¬ëÓöiû´’rÝ ºt/ðMdÙCö@ÁjY-«3ËoóÛü6@"¶iôaÚ€¯[×¶®m]  €Å±8÷æ{‹Ò]pKñˆ{™)K qåî_…x¨Ýu·­hE«k‰'ñ$~ÓöÅ_Ž §9ÎgûËKì%ö£×^sxÍalc½¬—õBMWÑUtìB¾/äCQQQኜX?±~b½¤_¹V¹V¹¶üO‹‡fÿϬŠU±*é÷ÎþUܱÒÒÒÒÒR˜ÅŒÂý`ICníîsk÷ˆ[»ßþF»N­SërLÕ¦jSõRݽ-fâœíœíœYG«F«F«$ýÊe² §Ù>f³|ÐÿtÿÓýOn@XOEÀ¥º}wý»ëµÛÁ¿ÝÚ=ýí†Ì†Ì†HMõEõEõE®}îŽÞ§Û¿Û¿ÛŸëÛõíúv²SÝ«îU÷LÃ4Ló—¤/J_”¾h{"<6<6<–θãýXUîæ’àw,11111‚û¶›Ë¹œËÉë«'VO¬Æÿ¹p=àzà?‚"\®ÿß§’§’§’ý¿1]7]7]çÿ¼úÅÕ/®~áÚ`qZœ§d¯l£l£lcîJ^Í«yõWÍP@…äf0ƒv¯¸îD wóüýŽvK ƒ:W1oâM¼)q€6ÒFÚø]øÂÖ…­ [ÙjY•¬JVE¯K²$Y’¬óßG4F4F4nI4  äÿY dü3·_­Ðú{`wi×].\ÅØƒ=Ø#½B2HɸÁu\Çu{Uª U…Òë’aɰdx,”½ÏÞgïçüÚ›Þ›Þ›,"ÜíOl,mÄñ__òÁÏŽ˜ïIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-74-red.png 644 233 144 4147 13755454064 15613 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXí—LTWÇÏûÁOA”? êÌ*ÁßþZÒÔSMƒRˆÑvã/°CÓ”ˆ«)V7Ú Å]SCpFjB-É* »•’t‹Û¥©Û š23꘢# Ìð~|÷æ¾÷fâj6»çÞ¹çÞs>ïÜï»w š²füšGŒ#ÆÁ= $D·F·F·¬eQåÞ?ReQ0VëH$‘Dæá¾ZÇæ³õ,Ë^_Îcä+§r*çíáñ”Eb«Ø*¶ÚŸr\W¡$%$$àÏ[în¹»å.°õÁÖ[E¹E¹E¹ºÏâl>[Ïò±ü¬ÞËyˆÿM¸ŸVÏò£ü¨;‹uhNÙœ²9eòûÝÝÝj¼oÈ7ä @€?Æ0†1n¸á4?góÙz–寗Vÿr>2%òÞÃ{Ü×X‚ܮܮÜ.é×ÎIç¤sN„LÍP3Ô Hrµ\-Wr¶œ-g²U¶ÊVƒгùl=ËÇòkÀaõM‰gçìœH<.7ýÀXê,U–*ɪ} ¬RVÁ'5M4O4ª[Ê”2§ÀY”EŠÒ£ô@· á ºU¨¤¦@] P?Pâ”8øØ4VÕg<Œ¢îGݺ¿q›`ª1}lúXMw=qõºz1Êã“?Q+ >Hz^hã7ÎWßRßÜÆm@þDAºž¸ž¸ž`ØTcª1Õ¨éŒGã÷‹ûÅý=ÇYà\éÙñ³ãê{¡~Éîßåß_´Ñ p©äR Ø¿¶ öD{"\j¹Ôß—|_bä•«ä*ƒè¼ÓyúûûûÉörþs¥çJÏ•ªïi ã#Õ›¼,yYò2Ô=-ªªÔJ0O¼;ñ._Úü´ùÀÔw¼À ÿSüOÆñCý‡ú_ÔàÎÞÎ^Ã<_ýpý0³&®uÒÓ‚§O ÆÃøè‰Í'7ŸÜ|R3Ù)_•¯ðj­ˆDÀp×p—àÄá‡`ñêÅ«`ˆâŒqçLçL˜W:¯ÔøBŸ5~¦ç—AKТ×g<Œ/Š/‹z‹z‹zõý’×ËëåõÆ‚jŠšbô**€ŸÍÏ€––c\Ù®l€ìo³¿€‚E‹ v0vN:}Àh¨àáà¬à,½~Ñò¢åE˵sûK>ôpÅÓíéöt“3À¸G‚°GØ#ì!Ð.zƒÞ ¢Qu‘ªÇDt$þH<ц® ]DDÅéÅéÆxÅ£ŠGDDÓ¿›þ‘ýºý:Ѥ4)Q0¶-¶ˆ~”_qå\9…ÀHðº½n¯›œŒx+oå­“C-®»P~¡üB¹A±“‰“‰ÆáÎÞ;{[ØöNÛ;ÆNþrï—{33  `uZ$šGóÀ¼Ø¼[ÎgœÏÐëýíTÇóŽçZ'Çer™\æäcV +…•Uµì+3Ï5Ï5Ï•Ó\Û\Û\Û´>u{<–u, €úÚG¯}“G&A}{|{àpËáØw{ßm(+,+àP˜Ó‘Ó×6^Ûˆ€J‚’,«ZrrÉIE»„!EH9?L ù ù ùDâ ñ†x£Ù£øE––òA °PlSý„cEÛŠ6þ7W¿¹Ú(WÈ€ ‚ zU¯‘ìþØ}ÃSù•óõ{ë÷Beá²츾ãºâ×w »…Ýÿ*žòã¼nsÎFeFeFeºÿÄت+—V.Õû)ͼüùåÏ¡·Òn¥úÝ¢ÞTo.â"È™r&€€Ü!w€-GriKJK Üë¿×ÿ¥Ñ+Ÿ^ù…ÚZË×òµÜ,n7kIc ðOíJÝÁíàv¬oàš¹f®™iEÙçètÔ8jàд{Pá0ˆAýx€ è½ ®Sw©»ôþzš= žÀkžfž&í×:yT8*µY44+YÉ*štÖ<Ê£<ñ(ÙÉNv"Á+<¾ÿ•vµ6˜ M…R’ëÆ£vÕ×Õ×D!P?üðp €Z¬6©M¨F5ðÛ›o¾=*Ôn 1Ñ%ºÇR¤H=@Ä[x oáZBt¥ sZèo±0 \[zezez%QTYTYT™ã˜¦Ý¨–6ŦØ€8<Ã3<3(w¡¼P^¨÷÷̪3«Î¬R×iwyRTRT’g"ôk)6|§¹öˆ­'.Âý&Ü7ÅNi×Õ¢k×Vm«6h7IJ’’t ePTõc§}èq}q}q}êM“ |Ÿ°ý÷R<ÁC/ÎDhwË ´ÛéèÔµ+uJR§~êŽ§Ž§Ž§KG–Ž,‘hZ¼,\.ŸÎaR I/p:½Âô ,®]¯à5h÷”é”é””äjv5»š@#ŒÔÖfk³µéÇŽØ 6ˆ }¡IâþQ74Nñ¯Œ4¶`{H»Wÿ“v×nZ»ií&]»ŽGŽ#§âª¶\ W•¬¯ /Ã?‹¨ËÑi¯Òî¡V¨jÝÙ ¸¤¦¤¦¤FýCF0#˜”ni[í¼‚×6‡š¨‰š(t쮈z1ô?Z¤v…ûkævr;¹m  ´AYÌÏžúUÅGýõ³ßì7û‰„¡GèáþZX±sÿ7KÒžò)ŸòÅÂÖò*¯ò*Àµsí\ûÃ_MÏwDìŒ3"ï+·úß †¡á:\FIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-54.png 644 233 144 2461 13755454065 14674 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜæIDATHÇÍ–mHTYÇŸ;:©¬8n)- Æ[‰ ½ æVÓ ö6DP&ÉŠË.¹„¡~ØZc ‚D؆腦È K ,*X­mÆ [RTÊÚJJºYš‚ÍÜ{~ûaæÌ¶‚ýèùrïÿ9Ïóÿÿ9÷œçÉŽ?yŽS²¬*«Š)þŽ+Ž3ˆm€i¦™NÂËYÎrP•ªRU&Å'õ‹UaU0z ý˜Ÿ¸±“¿CÍÁšƒ‰â/ø%z¦0ÿWû@ç'Þ™£æmó6€UgÕá׸†Rꆺ\ •Ö÷WŒŸ8Ä!à )DUoÕÁÔ|qþwþû¯œ±·‹{›™7Ø%HËmÈŽw§IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-16.7.png 644 233 144 3021 13755454066 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÆIDATHÇÍ–ëOTgÇÃPq, šŠA.+;JD»¬Ò°øBR.)Á4-˜Æz‹Åe'Ålškc_ÔMmR ISƒ›°k -0*`Q+Y)S%â 1im:¬µ½Ì¨Óép™9ç<Ÿ}ÁÎØý|Þœùþnßïä9çû<""²8öHÈNÈNpÎá„¿Zñ…›nZÙ1‡ë`{Ùöòׇ õãÔ–œXrÂøÖÂfÞ¬ï±æÇó™qY,V ©;©ÛVÃïÂ+ù¯ä/L›ÃG‡ÀqÆq&¬A}O}Àé¶ÓmìƒÉ«“W–=, ›y³Þì7çÅÏ—wÇ/O}þÔç¶ HZ´@VT¬¨pý}®à¿.x±úÅj€ì?ØUè¿É$«2 Dsùã°™Õ›ýæ“Nµ•†ˆÈ‡/ ×jµÚ¼ +FJÔuÔŸÑŸ!K(õªÚª¶‚6ªÝÐn€qϸgÜãÿ–T3j¥Û#é‘t¢úöhk´´ÈÜ|õjÍòšå¦À_°¶ò¾ˆHÞGàøÞñ}(‘sc9c9 PÅYc±†©y&'‹Xꎺ£îÄ)h¦™f —\rãâ3Ì0ó˜T—rÍÏ«ïïGÈ %Î Ëû(Q2EDÞ(àî÷w¿Ÿ¢1’;‘;¡ ìÿIý×ßNT¨ ×Þ*¼%²þ×õSë§Dn÷Þî½Ý+Ò7Ð7Ð7 Râ-ñ–xE Ç Ç Çd~M¤O¤O¤‹ô?Û¿ª•ÈÂ>‡Ïá‡ãveWÒ¿Î_Ñ^Ñ® þ´h¯k¯+ES7É1yã«ù‹ˆHQ¯,./1DDÄöÜŽ«ÛÜÛÜ©o­oªoÛƒJ”ˆh>ͧùDvmصa×OÀðDÜÓîi÷´ÈèÎÑ£;-awëîÖÝ­éÈìpu¸DzÇzú{úŶsú5ûkv‰\))¶='Rùzåë"j2¦‡œUÎ*Õ ?žüñ$DV’O>œ\ÓìBVIÖóYÏÃð‘á#ÃGà\å¹Ês•––––– Í Í ÍpðÂÁ /@`60˜µ6N‹jQ-jáöÌöåíË¡ö³š†š†¸öM¦O¦‡åÎrÕ-°$eIŠq‹óþV+¨Ïæ?{Š:‹:‹:aðæàÍÁ›pÖsÖsÖÙÙÙÐRßRßR®.W—« úÂ}á¾páö°‚§‚§‚§ Ç—ãËñÁWk=K=K-›1z~>öó10õšsÀ9 º¹èóûü ¼Uµ55p9ãrÆå lll„¼‹yó.ÆÕí+ØW°š67mnÚ Ö@k ÕÊ·$·$·$ÃÆ?oÌߘoÅñØï&Ÿž|ˆ8¿p~¡º$1Tª‘Ù¡óCçElE""ì½"‘ÔR§ )=Zz´ô¨È:Û:Û:›HòêäÕÉ«EÖ6®m\Û(R][][]+RœXœXœ(.—‡ËE†÷ïÞ/²eÕ–Ì-™ó¯`„?ÆøV|9þ师,m m‰ùØqQ÷[î·€{ÆzÐ/é— Øì v¡"‘öH{Ü?½n\7®ƒÿÿÿËŒeÆ2P•ªRU‚¿Î_ç¯5®ÆÕ8W³‚Y0õŸ)ï”ƛƛÀ¥Ÿî~Ûý¶égÇ=bú8~rüJïoÞßæù«ˆŸŸÄùØn¶³Œ2¬£•­²U6¨)5¥¬j˜ââpƒ~M¿ö˜é^À1阴|Ìr~s^µÕ¾Õn9?IÚ}í>ðO}ZŸ¶œŸÓtÒ Ê;‚Úh£ xÄC‚úFÝP7€`¬>CG‡(ûõ"½(n¾fòýÞùŸÜ³ò‰½]<±÷±'óû?K缈å ûIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-99.png 644 233 144 2425 13755454065 14705 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÊIDATHÇÍ–_HTiÆßuG)2%£ S ûƒEQ‘#cº&NBÐB$²mÞÌz!´Víf±SÒE$l…Væt¡†-á’®±Å Å8f;ˆ®šsÎù~{q›ßÔã1:N׈ˆÐ‰Ä|O 56N¬+ÖëÉÏÏ©*­*­*ɺžu=ëºHzkzkz«HŽ–£åh"æ@s Y$SeªL%’×™×™×iã¹¥]Úm>›AÏbgL½ÔNh'ì3[[[ þjµ¿²CÙ¡ì477ÃdÒdÒdø ý…þBðnõnõn…úºúºú:ÇŽ ÒO?pCß­ïþÏ3¶HWZ]ó3ƒ Ú]9ï÷Î{!º?º?ºT‡êP6ïü’ù%óK Œ£APsjNÍ9„ýi*Ai“Ú¤“ï£]ù‘96—˜c—ËÌ…¨/U‰*qtWPUÔ)uJu\WÇñµJ­¾æ*WŒÓÆifˆÿ¯9ö‘ÉoMfMïÑ{Œz£ž8ç¸Ë]”êWÕcà }ô9Vä,M4A"þ ÓL£À¨3ꈣë½z¯ñÉÿÉþ+?ÙÛÅ'{û4o°Ô _á˜ÞIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-38.6.png 644 233 144 3054 13755454070 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜáIDATHÇÍ–íOTgÆïA`˜©lt¿4ÐF6Ù t@º~0ò¢¢N"f€‹4ôƒ_èc²Û`4ŤIw]Q¶¤B³BLE‰ÚÖ¦ÑJŒšZv2¬o RŠ´DfæÌy~ûa8Ò¿ÀçËÉu¿\×}òœs=€ˆˆ8žqéqéq¿‰á¸mf<É“äùÝç1ÜK™¥làx¹å倔ޔý{y£~q¿ˆÉ¿Xψ‹CÌ€µÛÚmq/à¡"»";é·1ü+`;k;ûTƒí_nÿàÌgg>ã=ø¡ï‡>€'î'n0±‘7ê~ƒo1¿|ø+}H8ŸpÞò¬‰ÖDxmÃk2vÅ îd€·Ø[ 0¾d|‰Š€èc`)K•ÄXÓ‹°‘_¨7ú >ƒßÐ3ôcó,sù›"PZYZik5|ÞO{?ÍЋœid)hA-­ŠVuE]À‚Lläz£ßà3ø =C?6¹•s""‡ÖƒoÄ7ú"×´±HF$”S+Ô ‰,Lªô}ZŸmLÕFAeªL•‰¹¦gü9Rj»¶OÛGDë¤DR@Žñƒïï4ô­ìqþlA[0¯ô‘k#×€¿° T–ÊbŽ1&˜U£jT ÐA‹餓N <òÅíØ±ƒUÔ#õ¶z›9/ðÿ~AoAŸë±y„I‘Ö«Š¥;J 6=÷?o{o{¡)«ÉÙäDù£þ°?lêõ—õ—õ—AÓþ¦ýMûÁÀÀÀÌëÝ£{L|÷½»µwkáпµjCݪ½>t}ÈÔþãy$zSDäÛ¿ÀW§¿: 7Šï¼rçUãø[rfr&¡’%%à,q–8K »¹»¹»œ8q¥…¥…¥…°"gEΊÊÊÊ7zœû8÷q.ä;óùNð~ämð6À*sÂ9aBýŸ>¬}X«jà‹É/&AωÍgÙþRà¥À«EŠìEv‘™s?OüliÿSOÝhݨX·­ÝæÙæY–º,uYªH =Ðh‰ÜˆÜˆÜ):^t¼è¸HâÉÄ“‰'Efý³þY¿<_×\\sqȽä{É÷’EÒ¬iŽ4‡ˆ§|ÓÞM{Åš¾'å\Ê9K»HÞÒ¼¥"–óÉÉo¬Ž‹ëO|5ñU^ÛüêùÕ"ãÖ…Ö…ä§ú‚úêúj‘–´–ô–t‘°'ì {Dô]ú.}—H(+”Êé½Ô{©÷’OyÊS†fØL«Óê´:‘$K’%É"âvù]~‘Sú©ŒS"}m}Ѿ¨ü$âuŒŠ¨ñ‰×%ºÜ>hTÝÞÞG.}òÍ'ßÀÆ}ÜÜæ–äùò|y>XuaÕ…UÀ3é™ôLšyW›«ÍÕ«V¬2ã'ªOTŸ¨׬kÖ5kÆs?XY´²š9z Ün-jïµ÷ªnQVã;]pº&êç×ϯW5«6®œ\9I(u õfêMØ’½%{K6ŒõŒõŒõÀæ†Í ›À‘àHp$@ÅÖŠ­[a@Ðtpvv†ñžñžñ¨n«n«n{ذàCoÕ¿UOh檺mÝ6Pgbó,øXëUzvÆïŒ7ÿ’ðߟ¹Ÿ¹aÊúãüó¨hW´+Úe¾±æÕ¼š¦æ¦æ¦æ@]tµ[íV»aºqºqºô[ú-ý¨.Õ¥º`zïô»Ó…׆×.ú+ý;3vf†ÛzU8÷+ûwÌWTûs«T•Ì©uªXƒ~_¿¯ßåVnµh«•S9•Ô Tƒ‹|¬>Ѓ*^Ũ|•ÏœŠ*›Ô³‘Û#·l3¶™`<_>f8ÈpÞò%åK€?ÇœY]ÔZø4ú(úÈt~Zù˜Aõ¨Ëê2pŒc<á ¨!õú˜\¨¿¬[u+uUûEû8j8y|y<˜úÏñö¬|ao/ì}ìżÁþUñ¸S0IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-72-red.png 644 233 144 4227 13755454064 15610 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜLIDATXíW{LTg?÷1ŽR\­  ’)¢+>ftPY4j”VH$nlÖ´Š•†Ý*ÇÇ*I›bl×U)Î(6¨ÐµlX#•dã’¥ PLŒˆÀÀâ s¿ýcæ»sgÖÕlvÏ?3ç|çñ»çüîùfˆ¼2ƒ„_a´íF;÷OŸ!tJÔ†) «ÓDY”E¹ãJ¡J¼Çª•DId:¨«VæÏâY>–?°¿"_1S1o <\(6ˆ bƒí·‡ÛÃíÑ€„EŒFŒFŒâÏ›îoº¿é>°ùñæÇ›yyy~3Ïò±ü¬Þëñÿ«@Ýü?Æñc})¬CÑEÑEÑEòÞÓ·Nß:}K q9‡œC0qŒc@úÐhºïœù³x–å¬gþâõøÈ4àø¾ë,AFkFkF«´¼×Óëéõ >Q“Ô$5 ’\!WÈ€œ*§Ê©€œ+çʹ:ÝwÎüY<ËÇòk€ꛦkÐ8gãlDâ!ñx¨ö'`±ZÊ-åR®ìe™² N©ÖUçªÔ>)YJ0éÈ‚,P”6¥ ~™Tú•~@íóô{ú©Ö½Ü½P?Q†”!8™›Åj9`9 å²ú ÃG†G†G†G¿^ÂL•¦Ã¦Ãjœã¹£ÃÑ_§|Ty¦<ÓpBò÷0 ½ªª…€£8 ø!yE>*Nø³9ž÷™ûÌ1Ušö›ö«q Ã'ð2/órÝÇj»Ú®¶›2ÇT5U5Q÷Úœy9ó¸õ²ý厗;(TÜy-âZMv~Þù9½Õ5«kQWrW2Ñ]ó]3‘Ûæ¶EŸŠ>EDÔÝÖÝFDƦá¦a"šèè&â³ÌIæ$"Ù.¬Ö’qæòðáH5þÉø­ñ[zp½ózçõNnƒ_üsÔÁˆÄˆÄˆDX_¬**ÓžTBŒëCׇœæùæù€÷½^à¹rWo·~eý nÛnÛôöˆ“'€ê©€óÝþwûÄ8ÝN·¿Þ‹ÕCéCéÃÃð1 G6Ûxlã1ÿå^ùª|À 3¹§¸§ÀHëH«~ˆGÞ;òÄ·Å·€ü¶ü6¬ÄJÀ à ƒÞÿaþÃ|Ý ~}çë;€Ü«÷ÁÃÃðù€âJ^G^G^‡ŸBò*y•¼*€s‘j¤^ïÙÓ³¸Ÿ¹Ÿ >£>CþÙùÏÎÀ•YWféí÷ø{¼èØyëy+ ÿ.Ây‹óç-ÖööÖÑ‚´ê´ê´jô¸8¹@=êQ¿Á¬à”3åL}®ÂòÂrÈËÓÛ•2¥L¯K©R*œh=Ñ ÆXc,wfHf€—ÕeÔdo7XTFxFxF8z>âsù\>×óŒ]ugŠÏŸ)ÖQ`ªgºgº®®ûÞG÷>Òs¯©¹©¯Ç±c ¥+¥ Œ? ³³€Ô%uò%e¡²Ð_ïÆñÇo×:ù[.™Kæ’=ÏHX*,––W±u+›[[[´Nu%ûz0å` uöþÙû@Š—â@•Ô€uU”P”¦OMŸ@¿µß h+lÝxùx9x"=‘pOÀ5×5H,O´$Zí"…H!òÔ…f‡f‡f‰7Å›âͺmáçYfXfÈ%â(¥Þ~¾¤qI#€‰ iÒ^ÕÉÑE£‹ lWØ.àŸóÏ89Æ#ü^~/ œ""‚ \¨½P µ—l-ÙªLhw;„wò½ú4öÖ3‰þÒlH6$÷ý‘”V”%”%øû)…_<{ñ,T ÓÜiÆ¿-rÀóŽç¸¼óòNî³ßŸýÎÍ<7·i?Ó—ï_¾‰ cÖ8kÖiWh·…ÛâZÍÍáæps(üC»R ¹B®pU WÇÕquŒ+ÊÇö{¥½v»% ¯ð€§x À¿ U¨ú×Âg\©ÚT›ŸJuƒß ~ÄLŸ=?[Ú¥uò€8[œ]jÑ åR.åŠ&?ÖLʤLñÙÈF6"aPx"<Ù{M»ZkLëLë¤0Ǿžšž=wÕ4UO·p À„¼OÞÀ.µH-€š/ÅIqpÈB°õïïG¼!—hwû¸èöƒQ»£vGí&â-¼…·p—|è¶1˜où>ó…¡GèáãÊâÊâʈ E†"C‘ý ÆÝLK¦%S.Ñ–Q©Rª” ;ì°Æ0†ý¸åòy¿¿Õ˪—U/SWjwy˜!Ì6àòýZš8i®9hôÄ©?ꦩ^î:.ù¹[ZQZ¡ãn˜&…ù)O•§ÊSÿÚéF7ºû´îiÝÓºÕM'CùP>ôƒßQñË |Fz½A¨âî¦Wp·ÅÞâç®Ôâ5Ûº/£^F½ŒFFFåx‹…‹ÂÅ“éŒj>êü½Aü,Ÿ»ƒÂ Ž»ÇMÇMÇ¥0G£ÎQÀ 7ÜeHKKKýkG¬kÄšnß_’i ªë³SÈ› øÀÇÝ«ÿ‰»Yë³Ög­÷sמnO·§ãœ÷\Õ&Áp\ÁªòÀ2üpP]ŽþKywWUB•PÕ—ÊTTTªHšLšLš”:µQ ƒÂ`i4ÕR-Õ’o펠zFú%˜»õ¬‡Üvn;· 5´†Ö(¿äçòsù¹Gqô×c&b&b&ˆ„ÛÂmá6÷_`~Ðäþo¦}˦lÊ <Þ·Wy•W®™k暟ÌóÚçÛƒ&Ó”÷£þÜ¡T{Ô´ÄIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-87.png 644 233 144 2433 13755454065 14701 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÐIDATHÇÍ–[H”iÇŸ™¶A-KIÁjL%˜Èí¦‹µÀ Ë¢“µY°,BÛM´^´`»‚‡¨!lÝh.„ì°Ñv˜Ö ‘Š‹Ú‹É4Ù,;ˆ’~‡÷·Ÿß|ß.[7{ã{3óßçùÿÿïéù^™7ý+à]ä]äͰ°÷+§ß·Á·aiÄÂa<•žÊ?¾ƒ¹'æžÈlËl39Ø·ãÝù"¿[Ïî—yât¤t¤txʦñ1ØØðe[øÇ;Ú™Ú9®ÃþKû/\8{á,_ÃðÝá»oÊÞ”ƒíq;ÞηùÜürì_ú"0»kv—')sRæˆÀ’õKÖû¿±þôæ›6 Μ¥¼`Œi¤©2`Œ1ìöÊ…íñéx;ßæ³ùm=[ßò#UšU*¡í¡í©?Y ~Ãy‡ól=­¨§ž4ÐÇô1c—±‹IPwÔ¥O±Ã¨2ªÀÈ0V«Qª\è40LÃkUµXR/©/nCÅÍ:œ:<ö<1žÀ`6˜ L("Š€ï9ÊQœvŽsœÊ)§ÜÕ?É$“É®fV›ÕÓìP‘ÔKê[~¦…‡uê’É+y£è@+Yi­ÀÃÈÃÈÃ4Hƒ4$‰@"C%C%C%МhN4' õuëëÖ×ОҞҞñŸã§ã§“î”êÑ®k×]zI}ËÏ´±¾oáü»óï’y{Í_µ*­Ê™k_}_}_=ä‡óÃùa® ® ®…ÀÁÀÁÀA¿¿¿‡ÒÑÒÑÒQ¨xPñ âsPÎ<;óìÌ3gÝŒØTÍTͯö:ú–ŒÛ·U ¯^åZðc³±ÙÁ=W{®ö\…ܜܜÜ8é9é9é¢{E÷ŠîAoAoAoßo‹·ÅaKû–ö-í®bAàU©*Ý[lë[~2Ó3ÓÍ~x5ôjȹöæc±ÎI‹vD;¢0ß?ß?ß¡¦PS¨ 3 3 3 o°o°o´ãÚqí8,¾±øÆâн¼{y÷rׄ#fÄŒ¨5â.3¶¾åÇ+b^1¯xúEô »eñ1bI,ñüx~<_Ŀۿۿ[äbíÅÚ‹µ"Þqï¸w\äqËã–Ç-"¾N_§O$w4w4wTdMÿšþ5ý"j@ ¨ïÞo‰ˆhÒ/ýŽž£oùñŠŒ••Ýï‰ÞŒÞ´ãØçí’Fi”)»§:Z­ŽŠd·d·d·ˆ,..Š,K_–¾,]d§§§_ärÞå¼Ëy"¡¡¡ÎĤP ¥PD>—…²PDæ¨çê¹ÍÏ>GÚÏGo¥]{yÁ çVêGô#úÉÉÉc…±ÂXálÕÛ­o·¾Ý ‰‰ÄDÂu„~£‹.À°N»«ð~êV~²Ž2O1¡FÉ!”Oy”ÇÑSŪXƒzªžª§.#{ØÃžÿ]Çþ£ò ÅШ0™‡Ðh%F ¥nªkêÐD#.ÝtÒHSK­ãͬ6«ÑÀè6º]ü¯ü3ö[9c_3ö=63_°td!¨Ó½IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-38.1.png 644 233 144 3016 13755454070 15026 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÃIDATHÇÍVûOSWÿ´Ø[_,f‰n&¥:’%ÄhñÁ2"@Xã² `2&Û~\L0‰™Rf$ƒHÄ™_1%0è6Š ”ÄÕù†)MgKoï½ç³ÊåvËþÏ/Íçûú|šsÏç€Å3¿ Íiæ4óÂ(6ï4âsóçæ¿õC7ª¤©ÄT2ô¹¨~Q=I&6'6k#Öóz}l?`ÌåÓãX #`m³¶™3¸†,Ï,Ïœ›Å_»ÉøŽøŽW Yu±ê"I^8}á4w“OzžôäKÇKi`=¯×ëýú¼Øù¨ù?@Z.[.›þ ­’UÈô-é[V|-_Aäø‡qÂL’¤:Ar>ç ÉÔ×d Öó3õz¿>OŸ¯óéüQ= “7&oÈbg±3Þmi!¿Lý2Uç‹t<ÄCœO*%@’êÇêÇ “Â-Ü$IM¤õ¼^¯÷ëóôù:ŸÎÕcle¾ÙL–ޕޑÚ’Œt+"+"+HaSr”Ff” ͯMj“¤ò@ñ)>Rdˆ ‘Acé§Ÿ¤­'µµÚZF´J–’EŠÞè|²ÌRf!9¡óë[ylß’ñø@`ŽÐƺǺI I~H »°3È|ÌǤ¨•¢’d3›Ù#ä Ïð É\æ27&ÞÎv¶“ª[u«n’W4¯æep&û!•1÷˜›Ôù£Âlß‚O ±K°º¸ºXŸ¦½wûÏÂB²Ö^k«µQŒª£ò¨lð – – –µûk÷×î'GŽ=häE½¨õ¤8 ˆFüTÕ©šS5·³ûíývƒO|R5^5®omcÔ_ ÿ ²³½³ôŒ¿9þ¦¨\|dAÆ‚ †‹¶­/ZOÚŠlE¶"²íxÛñ¶ã¤6ÚHçççËW-_µ|9Ü;Ü;Ük‘ëä:¹ŽÜîÙîÙî1<àJÝå÷/¿ÏðÌߨT¶Üm¹« ëÿÂlªJ˜J˜ÊÊòæåÍü—¿xüÂäúôú߬;swæïÌ’–$-IZL¹¦\S. â‰x" ¯%¯%¯ÎIç¤s@èpèpè0f—¶T[ª-¶íݶwÛ^ ýIú£ôG€–F°F«L.¼±Ñ¹Ñ o-¼••=Ç<(-“–ñÄOû¦}&lÞÞÆ_ÙëWï^½Éå©¥}”ÈoË+å•€¶F[£­Âö°=ln´Þh½Ñ 0‹YÌPŠR”¤!iHœ}Î>gP_Q_Q_ÈßËG壳eA¶´YÚ ).;.›ï˜µ¹Wî5 czѱEÇ€ã׺º‘\®”ß+¿\­¸ZqµÎKç¥ó€+Õ•êJ2ƒ™ÁÌ ÐYÝYÝY HÒ€4ttt~Ÿßç÷‘”HJ$Åx#^7q'gÃÉx¥lR6€vI»d6›ÿ½z÷wðcÏ=@ùÍÊšÊîxñÛÄÙ‰³“î&ýšô+æMó¦yK‡¥ÃX, – QJ”%ÀÞgï³÷ù¡üP~È9‘s"ç014141dK8ИÐXæÇ={ yæ›ÛaúÀ-¹%8Žß=ÐO¯ïš³kŽqJä£!GÈA>·>›~6M¡¶ª­j«ñQ+…J¡RH>>>’4h Å>±Oì#'›&›&›Hm¶N[gôù÷øøPÈÝÁŸ‚?|üy׿]›cN%/ýÇÇnF}L¸f}Ì)œ Š ¢@Ú}í¾vŸáÐ/’6a6Rx…Wxÿe´¯ø*S¤‹ôãXÏXÏÿù˜~€Ãºó–ŕőü<êÌâŠ2¥L‘üN}¤>2œŸ¬c)®‹kâÉ&6±‰ä_ò%)FÅq‡ä½Yç¯Ð*¡¤æª¹$¿›u~k™•4øg/ñ×ö®|m_¯í{ìõ|ÁþÆ· Ë/†ÉIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.6.png 644 233 144 2545 13755454066 14755 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–oHTYÆÏ̬;*%±›C®»~¨p- Š%‡±ÀЬ±?Ëšl%°/‘A¡aµ²öJˆ,ØÝ"ÁˆM£-Ð Ûí²äºâdµYŽàŽ–Žf3sÏ=¿ý0s¼Ó¶}÷|¹÷yÏ{žçáÜó¾÷B1+ú`wÛÝö¤¶kÅãsãs?ÿ9‚OK°m°mø³fžœy ¹!¹Áì±°ž×ù±ë…°øcõt\ÌVÀÙèl´y¢ø l^¸yaüìþþ6$\N¸Í¯õ´~Äx÷ÛÖ®†g˜·ƒœ >3ªjÂFÊì4ï™÷°Æ0à [P•¨mj!#„2_«Õ„AÊA åWQ½)}k(ã8$ & >âwÌ;6Å¿FùežÌã Û8ÊÑ#G8ÂP>åS¾˜x $€z®ž«ç1ñ¸Á àKY%«x£ùyë÷ŽÃ”~ÔOÔØé;Pº¿t¿f13ÕOáÓáÓÖôÎíMéMº´º´º4èÌêÌê̲tÍZ³Ö¬µð“²'eOÊ öLí™Ú3ð°ôáö‡Û->%ïïW=K?â'j¬³.Œ^ó€ú&JìÎìžß=܆Ûpà©öT{ªÁ]î.w—C{°=Ø´ ݺ9tVd¬ÈX‘ù5ù5ù5UœUœU >y4óÑÌ©ô ùXëEôµ»ImIm_-"{Uö*!ÄBa;ýÒξ¥}+ûV ±¥bKÅ– !Z÷µîkÝ'„«ÂUáªâííMLk˯-¿¶\ˆ§®§®§.!R©ÎT§¹ër×å®"uFêìÔÙSéNÛ§Z/ª¯ý@²+Ùeþþÿ #e¯ÊÍB³ÐÚ‰Þ¢Þ¢Þ"Xt|ÑñEÇÁ³Ë³Ë³ ÆzÆzÆz¬¼†¸†¸†8H[š¶4m)œ*9UrªÒ/¥_J¿WíWíWí1G`®n3Qý¨ImImª.³ƒwFׯ]×»®CâœÄ9‰s JVÉ* ã-ã-ã-0Y3Y3YÃ]Ã]Ã]Ðèht4:`Áø‚ñãOfefef%3ÉcҊ˯õ[D_ûyïŒIÏ»gì\ʹÄs‰`ï°wØ;`IÎ’œ%9ÒœÒœÒ uuu°ìIJËN@ÿáþÃý‡aGýŽúõJ %†`“w“w“Æ£¡ÑÏxFP©ÿ?cïWe«®–axûøíäÛIÔÐoCmCm0àð øÀgúLŸ ·&nMÜ‚‘œ‘œ‘0w›»ÍÝ .ª‹ê"ø÷ú÷ú÷‚¬‘ä«*é1î÷­.ðªŒécx¥×Úê5`›ÅS} HL"D(oe+[Á ˜ÓúU¡Ü*Oåz#7Ê1}lÒð>ØÇb:¿Qà(phºp;•2[fƒj”.é"¬~W£j¥~QMª (e';A¨5¼ Ÿ~à-´€º£üÊ¢^†e˜0ÈnÙ Q~ â âõN½Óù§í¿rÚÞ.¦í}lzÞ`ÿY’U/bù4´IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-11-grey.png 644 233 144 5507 13755454063 15776 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü üIDATX×}PSWÆŸsîMB‚bˆ¶@uŠdAÔZ[?XéÖеcÙÁŽ›v´t;Ð-”~X?PZm(`Wê²¥£­#…ªhÉDd‹b•®m ›A>—E…")’Ü{ÎþA.0v»Ý÷Ÿ;÷ä½ïóË9Ïyï¹Äb±X,è1Ή ]-v‰]b¯´|nùÜò9ÎêÏêÏêj1ä<ðƒ?K!Rˆ²üe·Õmu[y.ŠP„"’HD"@+ZÑ àe¼Œ—y®fƒfƒfÉo‰·Ä[õEdˆ ‘¡Ý…™A™A™Aš³³³IŸ&…IadýûÆÇ¥§“€ÑˆF4-aY,‹e±o<£žQÏèý+²lY¶,[I§ÏÓçé«úÞõ¨ëQ×£Ëwúô?èË×._»|-ÉX©Z©Z©VVVå^ù]ÉWžWêMÖ÷é)ú Â'úfðqÀxK I$‰$…„0!¬ú³Ñã£ÇGÏ7Ì®š]5»JÞ¾¶umëÚVê]b_b_b'qš M†&.¼·ñ6tpÁ€-Ø‚-Àx.÷<÷<÷<ÄÙkì5öî½y1òb$Û>¸npÝàº>Ô…éÂtaùÉIr’œ{'ódžÜ•@@@@'{Ç÷ŽïPƒÔÌ›)ZE«h­ùÂ3æóŒÍƸƸƸFŠ6¿f~ÍüšX¢Öë‡aÄÌÁH<‚GðˆhCÚÌÀ Ì0‚ŒX€XvÒNÚ!á6nã6Dg€3À€Î²OÊ>)ûDJè¼Òy¥óŠøZ«ÖªµÝç¥ ÒiÛðžÀ½?Sm¶N[¨‚UÁªà¿\vwwŸÿŒÑl4ÍR\rbrbr¢ø^Ð zsØ]v—ÝxOâI±± ƒd NÜ"·È-€|K¾%ßNåË›åÍòf@¿X¿X¿s”úŠž¢¯ð(|T‘F¤‘õ+<åžrOyâ²ÙæÙæÙfn.6›‹EÅ#ÜrÊ)Èn²›ìˆØ‰ »È.² ˜\r5ÔPÊ óXËc§ò…R¡T(8á„(õÍ'Ì'Ì'ÄE_áQø(ä‘<ò½^“×ä51 1 1 X«/Öë‹¡fµ¬–Õ"_ãk| #ä9´µµ—ó.ç]Πƒ:à]¼‹w¤šT“êiù¹—s/çNÍ´\'×ÉuÐÕÕ…ZÑWx>*…KáRøï_ ¼x;ð6r6=lzØD |ÿTM£h$*Q‰=rÜ#¶[‡­h³¶YÛ¬˜ŠhD#‚¥`)ø¿äW´U´UL¥ÓCc&oÕŠ¾Â£ðQ÷÷÷ü=ô@èÐÈо£}Gû\rµ\-WCT*tëºuÝ: (¥(¥(èß׿¯0³gfÏÌži WqWn¡[èþü}؇}Oà <¢¢¯ð(|"ÞÇûxŸDÒ“ô$=9ù¸†¬!kÈš©zaÉaÉaÉ@NuNuN5p4þhüÑxÀµÚµÚµzšðCxaš0M˜ȩϩϩÿù@Ð0¥O_¤/Ò|ŠOñ)‰…!Dᧆ£†£†£ÈÃR‚” %àwb’˜$&à B“Ð$4MÕ'‡Éaràsù\>wšnOãi€°KØ%ìúí| bSÝ‚ûF…ццÑtÐ8Gãø)êwÀï€ß)¿#¨#¨#ˆŸj*l*l*œœ™1ÏâYü´¾¨D3šÑ ÑÝ´q-´Ð¼™7óæÿ’¯!¢™f/±—ØK$H0Ößß8n8n8nà¯~~~R>…f˜3‹D‹h-$ã‚á‚á‚A6:q>â|:J)¥Ã<šGóèi›`'ÝIwäUò*yu 2@–‘edÙ´ütšNÓ’BRHÊ´ñ¯èWô+¸¥8)NŠƒîœãœãœƒEqŽ™ÈDþLMƒ/_ ¾´:F£Ž9Þ;¸bpÅà ¡³lGÙŽ²ò6_½¾‘oäáVÜ×Ý×Ý×ñûÆï¿oèø?¼…·ð–©aw§»ÓÝ ŒÆ ã†)§4’FÒ ±æXs¬9ÌÕ[Ú[Ú[J¿S¤þHýÑ¿7y{¼=Þží^²÷úÞë{¯¨E-jçRõ«úUýßhGl#¶ÛüäXm¬6VËŸ\zýéõ§É%E »¶»¶»„™˜‰™£Ëè2º¼‹wñ.€&4¡ @9ÊQt_é¾Ò}Þ’Þ’ÞÂëÃëÃëájmmÅó%³Jf•ÌÂ9íMíMíÍñu\à–?…Xˆ…×R(-¢E´H¨£y4æÝxƒµ³vÖžäÑÕèjt5@±ÆXcäÙwÚwÚw¢Ô:ššš: pÂc@r3¨Äü7ç¿9ÿÍIÀáŸu?ë~ÖAw^›ÿ¬ß+~¯ø½Rš=<<,:ËË˧¼KÈ€vØaŸÚLÊ+•‡ðN Ô@ Ð\u\u\uð'kËkËkË…|ÿ ÿ ÿ ÞqO‰§ÄS’¾¿9³9³9àîàÌòéS@]¾ëI6ƒÍ`30«ñfãÍÆ›€g«g«gkú~ÿ@ÿ@ÿÀ®“­¶V[«Mȯ|®ò¹Êçø“Êf`Ŭ˜ƒO¶§»ü.¿ ‰HDÂØ€cÀ1à@iÕÒª¥UK1˿ϿϿ`Q,ŠE¥ïŸ°^ï¸ÏЇ|[aýä Hñï“Dép¾%òQ…*TÉÛH4‰&ÑO>;ñÉQý¥7Õ›êMe¯¿À^`/0ºzIÞ’¼%yØÀZX kŽ.¤ éB¸¥ )CÊ€æpÄáˆÃò‚¾U}«úV m~Ký–ú-ÍlbÓlÿްV ò­ìÊŠegggggcX™Qø&=äóî6Ÿwù¼[þ ïzm^›WJu: …“}÷®2Æ.Œ]c®Þ‚Þ‚Þ¡Íoß¿=Íîîî{>l{ºíé¶§ Ñ÷œNœì·¸'îIÐù üËçÝ/áÝ¡¡ÑyÚrÚrÚ"oóègÙ vƒÝ€£5u5u5u$A×¢kѵÌÈŒÌøú7âfq³¸yìá+ÃW†¯¤w|zTºÊ½\~%L&“Éd‚仵s5Ws5yµoQߢ¾Eø‡ü ü üà÷ÒÄnýÓÇ?ÅþûS¬á¬óšóšóÿ[ã±ÆcÇäÇG¼#Þ¯°UµZµZµzÇ<^È yበh FèÄÜÁö€²¾‰’îå!øøïf¡•¨”3¹•[¹ÕÔNÏÐ3ôÌ×áãñãñãñl‘ª@U * ×„d!YH¾x%âLÄ™ˆ3O™íŽvG;ù'»ŸÝÏîçŸùêÚ|€®_ã ø¸Ç»¾v!g" iHëI"I$‰—#x%¯ä•»·hCµ¡ÚPzMèz„ž¡ìöû õf˦–M-›€ @„ûê)˱ßâø.EµX:&XŒIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-1.6.png 644 233 144 2450 13755454065 14746 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÝIDATHÇÍ–QHTYÇ¿·QSêaw ËÅð%Út¡^” i#-´X -—† ‚ ØÂ¶Â…a)JE6Ö¨˜,Œ J)°¤1ƒÙmÚ4Ás§Õ¹÷ÜóÛ‡™ëÖz÷¼\þßù¾ÿÿϹç»G@DD–%Ÿî•î•î¬vpâéé_ü–À¸vºvÿÙç²ÏätätX/lÏÛù©õ"ªž—eâ¼×¼×\eI| v¯Ý½6}EÿÜ72nüc‚¿Ûß è tÒáGáGÓeÓeà`{Þηëm¾T~9õ?}XrkÉ-×_àõx="¿%KÁáDŸP¹­rÀ›´7iÚ jðáÓe@”(öˆ¤`{>™o×Û|6¿­gë'ü,/]^*;¾ÝñmF{¢àÅe8šw4ÏÖ3ng9‹̨P{Õ^b ût.\à`{Þηëm>›ßÖ³õ~äý½m.‡šôšt@1ÕõÀj´1¬L«Ä*Aë§z@àŒ0aÂÔ~½Oïów3nÆÑÖ˜Yn–c€ «0Kòëo×6Ø\ž²•""E¿@F8#ý3 Ææù¿¡Çʱr˜U}jJM½tÓb(úÞVB.¹ä‚~­_ë×)ñîr(T§Õifçùÿ ¾ ¾ƒyý¤Ÿ¤±‹ýpðÄÁ6‹õ%Óæ¨9 úGÝ®ÛëÐæoó·ùa¨x¨x¨ØÑUjBM8øeÈ— ÐÜÖÜÖ܃÷îwT+ã­ñ˜NêÍë'ü$=ýºfºf€ú;Ði:˜ù“yÒ< {ö ìp6¾÷|ïùÞó,S…S…S…°©hSѦ"¨lªlªl‚õµëk××ÂЧCÙCÙóé1ë[/©ŸôãɺŸuÿ«¯EJ7—n‘µ""®v—r)ñê_õu}]d{ýöúíõ"ùáüp~XÄZc­±ÖÈ‚ÑÛÒÛÒÛ"Ê e†2Eò¼yÞ<¯HEUEUE•Hž/oEÞŠùt¯ë3[/©oûœÌœLk"ã‘ñ”c[wêNÐ]ºKw9+²±ncÝÆ:X+`-\±Ý¡;4¬*YU²ª.ø/ø/ø¡àjÁÕ‚«Ðãîq÷¸|ës»ÍØú ?në¦uÓ5"bV™U"¢DDd¹¸%$!)– ²ÁYcÌ3ÆD\WÀpâ“O&ŸL>ñ­ö­ö­ñÝóÝóÝ9téÐ¥C—D²†³†³†EBfÈNI=[ßö³à#¹çU©*‰‘K:éΖzJ=¥¸óìγ;Ï`nvnvn Ïž)<ã£ã£ã£PßZßZß KãKãKã°+¸+¸+§ÍÄgâ¼â1­?ü}üTÆÍ)s C£S9sdæÈÌ0ªj£ðàÁ‘c‘c‘c` ZƒÖ è+úо‘ã‘ã‘ã šT£jtN%/ÌÇæã½ŸÊ”>FPUJêµjçû@ŒX Š'ž‚먣¬¨µRú›^©·ê­ gUµªNécsÁh0úÑ>ö΀ñKõ«~ë°uëX‡æ2tï Vè=L$ÿw¹ÍmÐý:¢#hZ•¡ PÏÕsÀLòÏë-èü‹ö_¹ho‹ö>¶8o°ÿC.!Aø $-IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-78.png 644 233 144 2356 13755454065 14705 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü£IDATHÇÍ–mhSWÇOãjSPk­…ª«âËð­hA©ˆfT JZj­«ï[StAP±èÛÖFœ uÝDŠ‚+m†ëeT6 qû¡°b­ÁÌ6÷ÜóÛ‡äôÞÍéÆ>õ|É}Þþÿÿ=Ï=OŽ!„ÓÓ¿\s\s\ÓR¶ë Ûï.s—-ø!e_”Q™QùÛqÈiÉiÈ æ­ˆmë¸ÎwÖ aã;ù´_L¶#ëzÖõ OÚ>5Ëk–»óSvc²oeßzcBýíúÛ7Ûn¶ñ%Äzb=ÞaضŽë|]¯ñœøâÔßø…€Ì;™w2 krÖd!`Þ¦y›æ•J蟛+6 Nœ¤\ ‡€)LQ N½^8lOçëz§ñ5ŸæOé0sãÌB€·Ö[›ýmª Ò¾_æKÞÎp†)`ÆÍ8€¬“uŒ‚ «0d€më¸Î×õOãk>ÍŸÒ#þÚÛ¦R¨vW»×Éû`¹,¨n¹@. )'ÉerJn“Õ²d¶tK7¨j§Ú ªX­R«À|l>2úDU©*Xg­³$ùCÞ“÷¥ñÓ|ãüÂ)hI3dDzcñà‰|"Ç[SÖk ì5Ê( áô*S™Êh Á‘ýÀ§à€uÒ:I‚Q¯ù4JOZØÅŸa߉}'4šU¤N%}IŸÍûôã§³ŸÎ†–’–’–ôúýÐ^Ð^Ð^ÑD4M@ÄŒ˜šÊšÊšÊ z:z:zÚñß«.Õ…r´°Šlþ”ž´°_¾†+#WFÆË÷Zž±Á±Áô{ásásás°vËÚ-k·@ù±òcåÇ ³7³7³ö×ï¯ß_Eë‹Ö­‡ŠpE¸" …+ W®€ÈžÈžÈ‡Àìd(Òøj¯ÍŸÒ#`Z×´.ub«c«-@õ¨žÔ ¬uÖ:k †‚¡`vmݵu×V0FÀÀ,9KÎ’àoô7úa±±ØXl€ñÜxn<·ë­åqyÜɧùSzäNÍj=†Ï^«Ÿ ©¢**ÆÄg¢RTŠñn ·†[…ðÎðÎðΰýÛcÛcÛcBäwäwäw‘W•W•W%ÄÂŽ… ;„¨k«k«k³ó]ߟð‰±q¾qþ´ž÷J,sÄ~"J45u^5¼jxÕ‰Ä@b€w–yĦì’]ÖQë(Ir)¡…ƒ|wÇÐJ+¨NuWÝütÒ‰ë°u˜$¦ó£ÿà䟰ÿ•öv1aïcóû'üní¤}…IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.1.png 644 233 144 2445 13755454066 14750 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÚIDATHÇÍ–KL”WÇ£¼‚ò4&FB´6ª$: ðMMT$¢Õ V]”®jº05m•„`¢ Á`5’€A‚)Õiu1­“e‘VͨP˜qêæ{Ü_3—ï³MÓ.=›Éyýÿÿ̽ç|W@DDr“¿žBO¡';á{>qâ[3¶¾)៳ ¥:¥ú—/!§-§ ïBÞ{Ìñu^×»ûE|7ŸŽK®8ô®ô®”ʤßµ%µ%ï%üo}Ù“Ùóڄý‡{º;»;ùBwCwæ*ç*Áñu^×ë~çÆ—¦¿ñ‹@jjʤ§¥§‰@Ñæ¢Í«>KL¬‚Ûwlxºèé"åkXÂU D‰¢mÆåë|²^÷k<¯ù4B@AEA…ìÚ³kOfG¢aì;8¶âØ Ígô§8Å0£fÀÚgíc”OùH!_çu½î×x_óiþ„yûlOoBÕ¤Õ¤€q¬)k ìÇf…YaþneYY(U¢ŠU1ŽÅˆLŒDoÂì¥öZ{-J=°J­R °=¶øSã×dÔdh§7¹ŽRD¤¸2C™¡èbbÁhÐ9š”iÕYuÄøŠz\B®sëÀArÐ鍊n°|–ÏòƒôÒëÊ›v]GLãCÐ Z°ÀŸÔ“vîG8zâè HÜ{µ OŒ' p*ð[ Âïï/ŸŸŸ;|ª]µ«vPͪY5;ñö#íGÚ@`MàƒÀN¹Úl”å ÿëêþ¤ž¤°ŸÃåÈåØ-ª!Ù1ïìñ@nKnKn T·U·U·AáDáDáLÖOÖOÖ;Bâ÷â÷â÷`¯¯¯ß¹(ƒgÏžuê¬âõñzæ“:4¿Ö#}+û–ê‚PY¨ ìyËnVÝÜvsßx|ãñ0ˆ Ä t¨t¨tM>š|4éÔ¿}3úf®”_)¿RE¡¢PQú¯õ_ë¿æö‡Ùgö¹™üZ@ÞÒ¼¥ö(Ì<›yæûÅöœ=ç´ENFNFNBÕ–ª-U[ Ø[ì-öÂHþHþH¾‹ð¢uѺèøë¬;°îtÛÝv·íª{j>4ºøøz<"vŸÝ—2*bî4wŠØ5""R ¦'Ï“'ÒúakYk™H­YkÖš"7†n Ýa%+Y)â»ï»ï»/é‹ôEúDŒWÆ+ã•,˜1aL"2,Ã2ìÄ%& ,xš_ëñˆD+£•?ûEnßñ”ˆˆp(ÙßýÍî¦ÝM"³ÙÀl@$ÿ|þùüó"eWË®–]ÙÞÞñ.ó.ó.™ŽNG§£VgVgV§Hjvjvj¶OY£rTŽÄ“wðæ_Ðó©ÔS2hv™]ÎÅ¿Ž7Ç›áÅË/_¼»Ñn´A5¨Õ333`¯·×Ûë]W 1Òi„øøp|ØÁã'sÀøÏ©tí±×ÁH0âÚcß[Ë­åÄÔåW~×zHSi* TX…UØu‡õ¢ul^Ï^RÄ~{ÿÿÞc®Í¯7± ÉÍ?j_XãÖ8†PSj Å%:éÂÌ2 j\«qàWÆséH¥”Rí–mÙ`[ãnüÝüïì·ò}]¼³ï±wóûj£FLÖTGIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.png 644 233 144 2324 13755454064 14666 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷܉IDATHÇÍ–[HÔYÇÿŽk:n¥‚‹ˆ ³Û>´”=ÙmèJBwLb!Ö‚ça•°‹aE¹° ÍÑK¦±m—‘.‚ö M²„R©ëN»à>Ô ºJ”(#ó?ç|öá?gþÿíâ³çeæwû~¿ó;çüæ`†aä§> py\×BËv}gûs6çlþú7˾$ cgÆÎÁãw!ï@Á•‚+rضu\ç;ë ÃÆwòi¿‘oØŽìPv(ײOBå²Êe9_XöOapßqß™2¡ú^õ=€Û­·[ùâOâOÞøÞøÀ¶u\çëzçÄ7N¾ÇoÕ‘Õ‘ñdÏËžgàÝèݸ¸ÆJø{1l«ØVð*óU¦r€ø˜Ï|å&™D¯q‡­ã©|]¯ñ4¾æÓü– ×®3 ØQµ£ÊÝl ÿ u‹êi¾äà g˜æ¤9 üÂÏ ¨° AضŽë|]¯ñ4¾æÓü–ãÿ{û󨓳''-(´èò¼ÙÇKý jT HÜ$7¡@6Ëf’L‹‡â! Røi>Ío8}ó ¸ãîøägðR¼À[Aei5NEÀ·TQåPpŠSœŠ)¦¨¦šjP•ªRU:ò¦ô¹Oîc:elMó¥ù-=)a—zà`ÃÁ†tq©ÞuMu«në÷DK¢%Ñ8ç=ç=ç…þUý«úW}ر‘›#7GnB×î®Ý]»/)§Ť3cN>ÍoéI 믅ëo¯¿MoÄ~ù:y6y–í***é1=&øŽúŽúŽ‚'ß“ïɇȃȃÈ›ßô}AXsyÍå5—m¿üQž'€Q+j5¾Úoó[z Xؽ°[… ¾"¾Âeö™Ž³s÷ÀÝw@] .P°ýKž.yºä)\¸:quZ]­®V—}rwµíjÛÕæÀÝ(7È Àˆº¦®9{¬ù-=,(X ÿ€ñ×ã¯×^¨¸Šƒ ¨€r‰ú£þ¨–Þ_zé}ؾ~ûúíë!”Ê eÁòðòðò0Ô‡ëÃõa(/././v\ŠQ5ªF :¦Ž9øÒü–žOw외(.Úö@ç@ç@'äååAcCcCcƒoêhêhê÷°{Ø= Þ€7à Øk®o®o®·óf¯Ù;kÇ>~ÆDÅÌÄÌ„}ÆZ [ [ ÁÕçêsõÁJÿJÿJ?äÊ;”wZd‹l‘6M°=Øl‡µÑµÑµQ¶’JçE™(›õŒ}âVv›íf»½‰¿ƒ‰Aëëë…Xf,3– ±@, @bububµÍŸèIô$zàÝ–w[ÞmqëàÏPŽÁ;Û­üȳÖÖ÷æÀ 3€‰‰éðÞà7@ETDE€½ìe/ð'Ïy4ÒF€¬‘5L#4þ¬sì#“? ÖdQŽ‹1BR…Ô D©ßÕcõTHÝR·€Óœæ´Cè Žpøœ2ÊP ËÃ$â‘x¤“füsö¿rξ.æì{ln¾`ÿ©ð®¯ä*§`IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-20.4.png 644 233 144 2760 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¥IDATHÇÍ–ÿO“×ÇOË€2 :eé0®[$#e‰:Ð…¾¨ËÄ9G/‹[‚Þ"ÈXЈA¢Ém#ÉXÈPº;†‘m#Œ.³?,8p_.Y–/±AeQªR‹ÃfM{Ûç9¯ûÃÓǧwû<¿4Ÿoï÷çô|Îû9„B¬Œý 0g™³ÌVÍ6ï7ü–×-¯¿ð¹fw)`r˜SÇ`Å©§žéy¦G5l=®çÇ× aàÇóé~±RŽäþä~SYÌvž—ö¼dyV³?¼ ))D¡ö«Ú¯.÷^îå¸{íî5€‡eËÀ°õ¸ž¯×ëxñøÂù'~! q8qØ4ÉIÉIB@ökÙ¯=ߨ%Ì=»ßØýÀ„; Ò ŠH#M–èëAœ­Çcùz½Ž§ãë|:¿Ö€ŒÒŒR! âÝŠwS>Õ f/@óÚæµ:_d8Á Ò ˆ”*¥Š0È«ò*&L`Øz\Ï×ëu<_çÓùµ~Œ£ô !Dûv¨\ª\ù@d":±El ^ÌFf‰Ä:•²DÊBˆþ΃<,ËÃ+È2ËÀ#-ÔjµšˆlRF”PÓ5|¨ U†€%_?ʯ…âÅ!%<%ýž Ïðv‚Ü,7d7n™2Sf[ÙÊÖ¸FòÈ#È%—\þº )¤ä{ŠKqŒywò‡çŠç èüZc/~ûǺ¾•£u¦:“Ž¢n¸¾vzzz:þÖ±²c%ròöäíÉÛ§ÁÓài€Ó‰§O'ÂüÌüÌüŒ—÷å}yä9yNž3ü·þ}ë—[¿ ¿ÙãÞáÞað‘W×_×Ü×úêËBñS vvÃÔo›·MÖd×t­é"\º»t{évX§¬SÖ)04=4=4 ÅEÅEÅE·+oWÞ.X?¶~lýøÊ|e¾2£µ\-WË {[tÛ£m ¸ëÕW^}…pl5j_ß™¾3À¸ÖP~NíHíý Ã0¸b$s$š6å7å€Å›Š7o‚µk7ÖB¹§ÜSî1âùáüp~Îî=»÷ìÞ¿žd{k{k{+ˆÏDè¿_rvÄͤê¸sâÎ `Îú‰õÙoNÈKjMjÅΑ`M°FˆŠåwwÞþýKûWí_%„}Î>gŸÂÖjkµµ QµºjuÕj!”n¥[é—µ×Úkí"X, –þ¡œ¡œ¡!ú&û&û&…8ºöhÖÑ,!.žZ<õ8ÍoúWò›Éo !.›£æ(v¡~™v í€ì‡ß~_€_Û®w^ï„§m–›–›àt8+œÆÎFŽ99r6älßßß(p¸ \003030Š]±+vpy]^—R-©–T dWd¿•ý–!럦_°]°|(?¤¶¥¶É~]­Ïب}Ô=éƒ7oÈó5!„ \°®ÀV`kµÎZ—ö]Úwi477ƒeÁ²`Y€c-ÇZ޵À½Ž{÷: ÷|îùÜóàqx‡±±Î®Î:?‚’©¢æ¢fcÆXõE À¡ØŒñ¡v  þHý¹µ[²ø½×íuÃÞ5Þ5HïûÞo „RB)¡à"¹þz½¿d‹l‘- 3d†Ì€îînPÓÕtM³´Іü!?òÑŽ‡â¡ˆ»•_00ë‚Ûõ­ÐuÃБ˜Žé:‘Y2ë±îÀ!qT¿êWýqòpRž”'jª©Ž›z'Nœ 'äwò;àµQm$Èl ÿŸž1ÏXœŽ-þŸŽé_€öí¸*›*›@^ДYþ¨¤)i ¿Œ.G—‰p†qÆ‘ü‡ &@þ#e”Q` ?~9%§€éÇÊß 6Á©Œ+ã@’®üo'¼ü÷ÏÊÿä~+ŸØ×Åû{2_°ÿÔz4jI©IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.1.png 644 233 144 2647 13755454067 15040 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü\IDATHÇÍ–]LTG†‡µÛ" Áj׸lÒ^Дڨ…`YÁn”Ö´I1Ø@Љ1Úš¶Hc4`c$± þ\P£EŒ4˜ Š--Ö5‹bªÈ‚?4Š‹¨ –ìv÷œyz±ŒçĦ÷ÎÍÉ÷÷¾_¾3óÎB‘4ó`qX–ĨmùÔðÇ¿ÿþk?Fí: bòcò¯W‚íˆí@r}r½ÞoØ*®òÍõBøf>åIÂpÄyâ<1î» .Š9jð‚õ¬õìß(=WzàLÙ¶ÃH÷H7À#÷#7¶Š«|U¯ðÌø¢ú~! ¶-¶-戛7[pæ9ó^ý<špëUøèÃ>ž5“¯êžÂW|Š?Ú€¹ïÎ}WXûñÚ­?D úOÁÎ…;*¾ðY`ûH€ÈTd @+ÖŠ ôJ/1Ä€a«¸ÊWõ Oá+>ÅíÇø•ãBñÝ*(ø«à/¯„}‘þðüð|Ð{Ã÷Â÷Ït*UËò+ù¥üt‡îÐëo&˜"*_ÏÖ³ ës"K"K@^ŽâÃúØõ±À¨âW¿ò!„xýX§¬SS/ÈñAß (à92‡iöRC `ÇŽ(¥”R…²Pššd’I“ÝJ+­ y5¯æ:õ›úM¦g¢ôzAñG{ýÐÌÄê.ÊÎ-1[bš¾x`a___Ô¦Ö&Ö&"{—÷.ï]ÎÖÐé¡ÓC§á|Áù‚ó¦€ 6²BVîc¥ÇªU#Ïê}£÷ ƒO~Rz«ô–úµu…þ¶Bô–CË÷-ßÃõ_5¹É1½ nA!÷7î/Ü_€#É‘äH_‡¯Ã×a¹ººBîñÜã¹Ç ¿•£r"Å‘âH1õõõÐy¸-£-ƒÐLö&møTß©>ÕXo¹Ð®¾TûR­ôÀth:-¶v{»vî(Ï(Ï0ˆÒ®¤]I»'ÇOŽŸ‡Kƒ¥Áb­ëX×±ÎÔ°>OŸ§ÏƒÐµÐµÐ5hÊjÊjÊçˆó¾ó>´µ´V´š&©ý3üæð›‰¿%þ&=‚H²5٪ߣE£EƱ(ö¿çÒÛÓÛÓÛaÍÊ5+׬O¬'Ö K½K½K½°Ë»Ë»Ë .»Ëî²›&V/ëe=È,™%³ vIvIv œÑ›4?0ø´©?ûÿìHž“Ì|˜ Áü`~0ߨÏx'cYÆ28ÓÕ\Ý\mšØÈ°}ØnšX$Eí±ÎôÎt¨ŸÓr»å¶ÜdéBB™Å™ù™ù`ÛfÛfÛ'ôú ݬÝ^»½v;ä å å ÁøêñÕã«!msÚæ´Íp7õnêÝT#ÅàŠ«+®ÂÏ—Z¶¶l5ö˜þV£³ÑiÚcˆžØúõÖ¯!Ø=%/º]˜H ¤";e2æs‚9Q°1Øl„ÇþÇþÇ~`Øc{ÆöŒíÝ¥»t—IM>›¬™¬Aþã›î˜~º'õÅ\*[U¶Êt*•n:2£cOuF¦ÊÔ§ºM4ÑÒ'}Òg4‚?~ Š*ªL²¡¡¡™F:¥Ó¤c vvÿ¯Ž©à»Uì-(/(y ì“=Z‚–ÒyyB˜où‰Ÿ åg7•T)¤<‰Þ•r@^—×´Ð7ê 3[ËÕr£Q|X·>=«üÏï]ùܾ.žÛ÷Øóù‚ýô¹jO•ÔºIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-6.6.png 644 233 144 2446 13755454066 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÛIDATHÇÍ–]H”YÇŸÑÕ™Ñi´Mƒµ‘ ¥V¨`íf/ºI,$ƒ±(#ÚjÉBd!غˆ5("*V„¥ 1úÀeû¢OŠØˆj³ Ù¤ÌlVÇb\pBkRWßóÛ‹™ãûÖÖ½ïÍðœó?ÿßæ¼ç™# ""ùéOŒâŒâŒ`ªÎØêŒû*|_þšªYàYãYÓÝyGòŽÌ<9ó¤ýÜ©õ¼Ö»×‹8þnž—|q¼g½g=eéz¬_¼~±¯0UÿtüýGM¨½T{ àÂé §©‡Áƒ†Ë†ËÀ©õ¼ÖëõÚÏí/û>à‹@Öµ¬kž—àÍöf‹ÀÜsWÌû>%è›áUáUñÌx¦ÊkPe@’$úI¸j=ŸÖëõÚOûkžæ§ò,+X&«7¬Þà?‘ZðüØÚÒ<ã"p€ÀLšI+bE˜uWÝÀƒœZÏk½^¯ý´¿æi~*¼¿·Ëawx `ü j͇æC ³Ëœ4'Qößv¿Ýó 1ÄSªZµImGo.7—c€5h i•æMñŨägðú“Ÿ1}}7å_ÉçÖkcêý}h¢‰& ˜bŠ]ã~üøA½R¯Ô«÷ô·¸Ì·ö[û›òÿWóÒütžt°c÷`ûží{´‹ýµj5ŽG ¿¾kÿVh<Þx¼ñ8tnëÜÖ¹ÍáÚ§ìSö)§î¯ï¯ï¯wé·wnîÜìø)Ë1F€áÏá§ò¤ƒýùœysæ ¨^õ]Ú`âõü×s^Ï¥%KK––@øPøPø,Ù¸dã’Ð5Ú5Ú5êÚQïwÈëÒ  tôO¾x’÷$oJ>aÿ¥y)¾Î“!¼¼SúȲòeå"êGωôN{o<¸ñøÆc‘˜Ä$&"¡ìPv([¤¢¦¢¦¢F¤(R)ŠÈÔs³õfëÍV‘ØŒØŒØ ‘7ä yE*ª*ª*ªDBPa¨pJîõi^Нódˆd†3Ã,ɺœuYD’""òZ¯4 ÌB³PÄô}A‘E½‹zõŠ´'Û“íI‘»Ãî°`Æ.c—±KÄçñy|—Þn·Ûm‘ŽXÇ@Ç€£ç+ÍKóÓy2Dì+öOˆYeV‰H³ˆˆè…ùçóÏåŸÉmËmËm©k©k©kÉ»Ÿw?ï¾Hß@ß@Ÿ ”SžSžS.¸¸¸íèƒÝÁî`·HÌŒ1Ãlžæ¥ù:χïMé=ÿê³êR‡ æ|Íùšó» wAŒ¼Œ¼„¥/J_”« ¯.¼ ñx<Öæ-Í[š!g2g2gª£ÕÑê(¼Í|3ùf€˜PêãïØ'O%q³Çìq¢lH4$ `϶gÛ³AUªJU ‰Ã‰Ã‰Ã`wÚv'¨6Õ¦Ú ±;±;±¬ƒÖ^k¯ãÇsó‘ùÈÅûø©tõ±ÉèxtÜÕǾµ~³~cÌNªbåêWª8U«5¢F\ýªšjªÁNÚI;ùž~¥Z jÌZk­uõ±ñh2šüd{¯óûÖùkªó?µž—íYö, uO%TÅiZhFfTêQ=À? 2Üâ:×aJßl–Ö3ë`jÿ4ïÿÚþWNÛÛÅ´½MÏìå¶Ç‰ãrG8IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-30.7.png 644 233 144 3077 13755454067 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜôIDATHÇÍ–ýOTgÇÏ0¼8‚X‘&(–ÂÝbh BêÒPªRƒ„X¨¦»ÒˆÖ·®†Z4¨i“†l·P|é ¶… %hÚ’â6ñ…¦RmµTг²ÐÅ:Ìî ê̼Ýû|ö‡™ëLë?àóËÍ÷<çœï7ç¹÷{y$ôˆz,ê±¨Ä ŽÚŽÏxaÆ ™íAܪéEÓ‹?5ÀìæÙÍs>œó¡þsûF~d½H¸$Ÿ—G$ˆ;wÒTÂoÂÚÅkÏx4ˆÿ~,]–®ÿ`c÷Æn€ÏÚ>kcØ¿±0Yàï Œù3ý™ Òù|ü!¥JªUF£ jU­ªå¥Î*ò 4³/Å—‚_û³ÿ¸ÿ8|ÁþêOó*æß]>ʈˆ,|,.‹Ë­t[Ÿ­x €RPÙ*›)Fc T“jRM@.¹äF(È&›l`‹X÷àÁó©Vee*J!Äâ [øž0."Òz^ñêêWWÅúS?ŽýPþC9øãg<ƒºÞz½åzK¸½-Û–mˆ–¤–¤–$|pb#é#é#éм´9·9ŽO¼÷~êÓ™ééðÓÔ¯ݨ?¯5¾Öú• ž(ý¦ˆHþ)“¬ªZU%ò]Ùpêpªé颎¢E7ÄwÁzaþ…ùb*ý±ôZé5‘þ¦þ¦þ&‘êÍÕ›«7‹±±±‹”8Kœ%NÇAÇAÇA¹¿Æ2Æ2Æ2DÚSÛ­íV‘Sÿìþ¢û 1UMW›«Íâ»ø¯þÂþBÓÓ"+·¬Ü"¢ìA=¢çÄ߉¿£N‚ûK÷—ð•~6îlìY¶Û²Û§ËO—.ƒe3—Í\6¶·ooßÞEÓEÓEÓáÉäyó¼y^8ºã莣;Âqßßßš0>‘zbÞ‰yPùiÅÖŠ­£½eO±§o%>Ÿø¼:u56-6'ÅâùÅó‹IJPõª^ÕƒJRI* œuÎ:g¨a5¬†ánæÝwÀÔ×S¶) ôZ½è ò¡mÚ³i!¬õ¼púw>öuÐWÔ÷}ìõ Sj¡ÊSy Ö«õj=¨,•¥²"Ü©Q5ªF`ØñRûqãŽÀ[µ‹ÚÅßø˜fÓ,v‹=ÒÇ ç÷Îû’ù%3ðzÈ™{ww€cÚ-íVØù9E' .«KêÐC=Àm&˜uM]QW€»¡üùÚ^m/~^×òµüûªû„øpþ‡÷_ùÐÞ.ÚûØÃyƒý?ròØZŸŽ«IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-22.2.png 644 233 144 2742 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü—IDATHÇÍ–]LSgÆ_ŠJ ƒ”)6—˜á„øABâM­Ùœa h0óƒdnS‰a\ˆ\L# ehãv#ÛÄ-Ën²9ˆÃ˜\qq¦3´ÃR:…­j±zÎy»8=¶ÝîÂ÷æäù<Ï“sÎû_B!²“O‡ÅaÉÒ±e§O)ý¥g?×q› )›R6ýržüàÉr>ÉùD»fb#oÔÏíÂ䟫gÄE¶0iÝiÝ)®$n„WŠ^)JJÇï €õ¤õäÞüæÍo¾îüº“½Œ D]Q˜ØÈõF¿Á7—_4þK_x¢÷‰Þ”›6?m¾PðbÁ‹Kjô‚K üåò—ÆSÇS¥ÔI “LébÄ0ÖÔlä“õF¿Ágðz†¾îG@îÚܵBÀÆ­·Z?Ö®}u‹ëz‰“@Md‚Sbj•ZÅ È9@ )`b#oÔýŸÁoèúºóSþ!„­/@埕‚ÌHø•k‰…‰… ý%B$’N¥\,È \U†•aÐZ@ `®»ÜáÎ#$å3J©RJâ߀Ε×+¯qCßø”ß !ÄsGÁ³Æbóä×ý×ýÀ«”\-Wç, €6¢h#@ -´Ì1âŋ丗ãfXÞ’·ä-`nÜr½\O¯Î/ï&õ’ú è~’o¬í¼<½+eWŠA§­-ßÓ¾l_6òRðRðRРΠΠΟÝg÷Ù!°*°*°ÊÌkG´#Ú‡òCy¡<ð=ísøÈ@ÉÅã›zrvWÙ®2àwÝÐV !D`ô´÷´Ã/ýÍÍÒíˆç·å·1ã¬vîp‡–Zz:*:*:* ÐVh+´s‘s‘s8jµŽZð§úSý©¦¡+®\¸rŠCq(àò¸Þv½ ŽêüŒü fƒƒ¥¾õ|ëõ'ÝP¶ùl>Ù ñ™ø ôXûì}v¨{k_ɾS`ÍèšÑ5£°®t]éºRh¶4[š-f~ÙØ²±ecàëòuùºÌø‰½'öžØ uêÔ˜Sµð£Âàýmío´¿0»v?(jÆÙŒ³²[ äXs¬ÚU¹rûävsÛ‡ª‚ëƒë¡øpñáâÃà¼á¼á¼J“Ò¤4ÁHp$8„¢¶¢¶¢6pÕ¸j\5÷ƽq/ÿY¡ªPU¨ Š-> ®šµ[Önø»‰h"ÊD7G7ƒŒe‹l¡]Ú™»3wËn¸¾†+¿'ƒ“±0}4}e£Ö¨Ú©vª0Ô1Ô1ÔÖYë¬u<7=7=7aºoºoºÖ?¬X‘òHy¤.Û/Û/ÛÁ¶Ü¶Ü¶ükøWd¤>R©…{;ïí¼·¦¶Mm›ÚaoØö„6¡Mhð áAÈVG«£ÕÏ‹çÅó`r÷äk“¯Ax,¬†UäDí˜{Ì êz°gvÏ,°=¹+õqaÎ1îsåÑ["—ç[ÿà+ƒÍ1þ1ÇŒ õ>¬l©lù™>™¥_MSÓ@žSÓÕtäàĉ”çäyäyý’§ä)y pó:¯ó` 4 åwŠª¨$äj†šaòs¸òÊwà‘¾yˆ?¶gåc{»xlïcç öoàáVî­ûãIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.5.png 644 233 144 3121 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–íOTgÆï§…‘a)qTª"VÆÆP«€ ’°uÇ6®“-K¦« ÍF—5ÄØ´¾l]M+b› ­±»šI&•X ]KG\º bV°àË.¡’ aäe˜sx~ûa8Îlý¼¿œ\÷ËuÝ9OÎu‰™{ ˜Ÿ5?kŽbóïBùȂȂ”¿ñLÛLÛn„…§žˆ={nöNu£?|^$Ä®gä%FB‰g„Ó”3‡ß†W×¼º&2>ˆO´õ²õò„eeõŸÔÂ^ø±ýÇv€ÑœÑa£nôó_8¿¼ý3}xêÊSWLÿ…ˆ§#žÄ͉›“˃ ÷’¡¸¨¸àûyßÏSfЇ6•øðaÄp6êsýƼÁgðz†~pg²ŸÉ—w¼¼Ãz68pçìOØŸ`è.G9Š 4ŸæÐwé»ðƒjSm˜0Au£ß˜7ø ~CÏÐî:Ê‘“y`ÿÉþ¨_®kkÀ ʦ-Ó–P÷‰#¥Íj~ÍúoôúУõh=Ô&µQm$We¥¿5S3SC@>P(½(ÈÏv{œ=ÎXðd^è(?I­«ÏêóYÔHßõ¾ëÀn¶‚Ú¨62ÉqÞã=P£jT† O1ÅTV(T`€`œqÆÔrµœÉ¹êV˜Ó›Ó.–Zm‘‘73ù¼daÉšiË µB©Ì¾ôôôô˜»š.4¿ÒüŠÿëüÂüB‘˜¼˜¼˜<‘_ƒ¯Á'bm±¶X[D¬«¬«¬«D2²2²2²DV_[}mõ5‘@c 1Ð(ÒÝÑ!2X?˜7˜'VË[ò•|%Mö/YŽ,•÷ç×_|ýÅŵR+oºçº""òÎ/Ì=øáÁçw·Dý¥|»åÄ&ï&¯i‹WNNËùÞóÎ?1å˜rL9"Wõ«úU]ä^ë½Ö{­"Ç»ŽwïÉtf:3"k—¬]²v‰ÈØÅ±‹cE wî.Ü-2óíÌg3Ÿ‰i(Ý{ß{_f²ÞÍ-Î-–›±¿7õ›úM¿b­³ÝÙn>-zWÔûQï+'Lú'ýÐ`mŠkŠƒýûÖí[:‘´ž´ž´8u*êTT(¶älÉÙ°7Øì <7âoÄ߈K‘¥ÈREåE{‹öÂÇÞs çÂû×yÐ}4ú¨r Z¬5Ö:Û£þ4´shgè³ïÝõ]þwù~8ýpúaÈve»²]0}súæôMx¸òáʇ+!q8q8qÜiî4wÚ㋹«ÝÕîj(s•¹Ê\p©îRÝ¥:H|~颥‹à’­¾ª¾ŠaÐ:µNÐÿ² vAílÌ^´9l儱Æ~€¿ÛûAï0QäƒÈp$ýÈš#k`,i,i,)$Xs·ænÍ]ذxÃâ ‹CùéæéæéfðÖzk½µàr»Ü.7H9r %Ô·>ú…6Pg©³øëüu 'ÍïŸß¯œfõ‡‰&>êúF¤£ £@ä_Kï Ü ÔÙŸâO‘×N×6×6‘„܄܄\‘ÖC­‡Z‰Üê¾Õ}«[¤ÐVh+´É£)))Ùܶ¹ms›H|]|]|ˆÛévº"1ŒqÄ8DVô/o]Þ*3¿­)ÕJ5JE×7®1wN%M%u}#œ9ó5¼QùF%Lk³ÞzZ<-à1y< (ÏjÏsžçÀÌÌ ÆãÇãÇãa²l²l²,ô&f«f«f«`¸z¸z¸T…ªP Uj•Z% Y¼Þ ÔìéÀÖÀÖGSüÇ‘êH5üìÌ×bøFÈG _yäcÉ*ù‘ï<{ØÃž0<Áa¶vCµ«vP[Ôkê5õ’z‰I•<ÇŸÐ×Ý× `µŽú,t÷‘ÿÿ«ŸÌãû>û>P‚ά:t›nõwmL#ÀÇtÒ‰bËXTPNyØbwé£T¯º­nCs¶[£èÔÚ 6|:çül·l·3?wþ'÷_ùÄÞ.žØûØ“yƒýš¯òAösIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-99-red.png 644 233 144 4234 13755454064 15617 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜQIDATXí—kLTgÇŸsAKÅ…lA4‘UX…D¹tM§då.©˜JQˆÛ°¢ŽÆ@¬R‘õÂÚ`J‹ÆœÁn¥”d †õ-Æ5k‹¦4x)Ì&¦£ÜtfÎå¿fÞ3—f5›Ýç <ç}.¿ó¾ÿç="-¡ã7„XC¬!VnÎû lAç‚ÎùëDY”Eùî_(Ò( ð,«õ$’H"ó@_­gñ,ŸÕcõûñyüùª¨ŠªxKàzT’Ø)vŠ– n·‡Û£„GLGLGLão… >¶Œoß2eeeû|¶ÎâY>«Çê³~¯æ!~} ßÈ?çŸóÏmil‡bKcKcKå}ÍýÍýÍýꢙg3Ïfž @À«Çêö‹o|5éßäí¼·Û®°Ù7³ofß”2GÜ#î7Fà55EMQS É5r\ÈérºœÈ&Ù$›ü|ï:‹gù¬«¯ô׿©¡qÎÂYˆÄcâ1ñXÛw,ÁPo8n8.™4°Ôµ3R›«ÉÕ¨6÷ {€K‰V¢=è  Ð\Ê”2å‹—Úœ7œ7õ#uº3,ÌPoøÄð‰dbýã#ݘnL7öΠ¯ÕÕUFŸŽÚGí˜òÖ™‘O¸ ÜžÍÀàk¡½Êu  ½ µ‰6SúZýaýa5ñ0>—y™—Û+Õ;êõŽ>çxÜñØã±4´iÛ¦6}ÀÈVéSéS ÿ kÔ5‘k¸r¸’ˆÞèï'"š}<û˜ˆhyærÏ~Oßñ[ø-DDß FD!Þx×ìðì0ŸC$[•b¥˜B"3#~Šø‰Ôó!-!-ôðʽ+?\ùû‡/ñ©Wª#"9"9"õùùùÚÎIˆcïlùÐò!à™{o oô÷w|¼ãcÿ=»¸øââWÄÏT* €VßcÒDþ3å™0ÆÇ@ÿ´ùäæ“›Oj óò2Àá>ë> Q_E}åŽr‡ík‘×"€&húzúz a av˜v˜âǯû;n¹n¹y$xžñ0>Þ;RI:£Î¨3j3BåTKµDôkŬ˜‰ˆ¦Þšz‹ˆ(±7±7à¦8 ?@DD‘IDtO¹§ÍïßKD”p>á¼|Ü…¸ ~nèÐC_‘ÿ3¢]‡®Cס|’èí_íýö~{?÷[gÆË/WPBè¥÷Ü'ÐÎPw¨›8:SåªrÑâƒë®'"ê›ë›#"¿<~Ù¿‡——vÇìŽ!"ª^Z½”ˆh y ™ˆhü›ñoˆÈå $EHDüת%""ÁasØ6a|Ä›xorÿìÝâúsUç*ÏUúI T±*V˜ûrîKΆ­ [ ïzÞu¨ÎªÎ±B¬€¶”¶ÿS<Ñ}¢Û/^ªÎ¬Î]’. /Ë<—éëwíÔÕá«ÃÚp—Ê¥r©îŸIÈ2„ŒCuì:ˆ[®Wõª?úûGwÝõ]jÞ¦¾M}PVVV@eKÉÉZZ“]“]Pè(t@é‘Ò#þêk46¼»(iQŒ-[ç<”]Ê. ùЪæUÍŠö¢„(!êó) 3†ÃŒDâ ñ†x£Ý®]øE¹5¹5ò^V_1w%v% «wæ¹D.ѪÒÒüw²ËØeôŸrn9·À”ÇW>odßë–Þyÿúûוy °\(Êï{ü…lê™ÅžÕ¥êRu©¶V–`®Ù·sßN5O»?~õ£éGT 5¾5ÀÌ`Ë`‹? Òª´ú¹Î‡={ 5²5·ßÝuw—o/>¿¸ìâ2¼«}Bëø:¾îe>·”[Ê-]Õ(üS›¯mÜ6nÛÛM\;×ε3­(•Ö^ËeËeX5íîU²”,Àæ8Õt5݃'U-UKÍhÔ<õ zÐ'%{»=ÎÄ…êõƒÒµ<"T Õfƒ†f"™D½5‡r(Gz`dldÌ_»’E²øí  €y¯oUZ”@-vëþN¶õ[Ïn=+ïeõÅYqJœ²Þ½;z7oà ¼»ä¥ÛÎ0ßðþ- …Ç\wÂþ„ý û‰t¥ºR]©õ¨¦ÝCŽ!Ç_»ŠY1à +¬°˜Ä$&}ÜòJy¥¼Ò§Å3kϬ=³VÍcõtáºp]¸ý¥÷N å‰òDyâÓâ†0X-Z8¤jš ãÃø°÷Iñl_½úp&H»…¿Ô®µ×ÚëÓ®Ô+õJ½¾Qzý"úE4°zzõôêi9QÓb‡Ð!tü9‹IÍ+½`ÀÅôó°>í:‡ŸvOéOéOIá£í£í£íÞQrbš‘š»ÍÝænßµ#6‰MbÓ÷'ÉÂ[A}½ÏiÑëƒ%¼çÕn×ÒnnAnAnO»Ö,k–5 <ëªv\ W•¼}(° ?Ô—£ÿÒ^§Ý BP'ÔÙÒpImImI­z:Å•âJqI÷´£vÁaŽ¥6j£6ò^;ÂhP¿ú-X»GýÜG\WÆ•´‘6ÒFå7| ÃÇqÄÑßûâæãæã扄ÛÂmá6wÕ›Xtrÿ7 ×þ3’‘Œâw˶ó*¯ò*Àõp=\Ï¿–yž¯°ÌHPÝ×õ¿L˜ö‰œFIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-91-grey.png 644 233 144 6100 13755454064 15775 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü õIDATXÃ…—mPTGºÇÿÝs˜f7©  ¼IÄX   kJ1h]‰¥&EA «\³Ô % ,hb¸’Òĺ¨IÝ@X£Dp6 F0…‚ॗˆÎ803s¦{?0–»©<_ºNŸ>ÏóëîÿÓý’ŸŸŸŸŸWÌ›n¾¡±Â]á®p—«ò¿Éÿ&ÿ¾¬p¢p¢pâOaÜ»q·Oþ,z‰^¢×ê·M5¦S /ÆiœÆi’ƒ„ @/zÑ àm¼·y±l‹l‹l Éî ÷„{í§‰–h‰öà©ÏÏÏÆî¢”¢”¢2.ú‹þ¢?Ù8ÏÁ®Û¸\é`¢E+Y!+d…ìºÙ`6˜ O­)¬-¬-¬­Ô˜ÇÍãæñ†›ÆUÆUÆU«ßSSSCýêõ«×¯^Or"""€5îkÜ׸ögû{ûxû÷v þmñìñíÁ¶‚/sgîÌÙ$¤“tÿc‰¿ÄÿÊ—† C…¡ÂÏ}iÃÒ†¥ Öë{×÷®ï¥–]+ºVt‘DYŽ,G–#ÞÇûx a„@*R‘ ài<§a4ù˜|L>Hìjîjîjæ–Ë!—C.‡°6<Øð`î£ …¿Â?ZnM·¦[Ó×ã<ƒgÜ}ƒ€€€¾Lòæòæòæ4£Í>K„¡F¨iþ‡yÖNp‚€Ì`@0‚ ~ÒOú!b S˜‚ sÖ9ëœ1xî‹s_œûB|c°i°i°IøEê(u”:]·ˆ[Ä-kw`-ÖbíÈ4ulslsl–9,sXöÑ5ã%ã%ã%¿MÉÉÉbbFJFJFŠð‹«§«§«'<¬MÖ&kÀ’XK‚€­ØŠ­¹En‘[Ñ Ñd”Œ’Q€Ü 7È €§ótžÁºÓºÓºp s s ƒ‡Ý¿=ž=¾ÇÎG U…ªBÕÆ5æ6s›¹íR›³ÞYï¬ç»Gvì!m®®® Ì—ù2_8ÓNÚI;¸Á nX4/xÁ @#Ñ@ %”Oãi< ¢ õ¨G=À£y4^˜ˆ^—ªKÕ¥‚ô:éuÒ‹Gè—è—è—µ4B!ØAyá!ÿ/Kœ%ÎÄ·Ç·Ç·c½ PÊÖ²µl-œé0¦ÃÀTáTáT!оª}Uû*`hzhzh@$" À ¿Åoñ[ù‰üD~úµýÚ~-p­øZñµâÅ•¶¶YÛ¬mpvýÚõkׯ!ïˆïˆïÀz;Šb øân·)·)·)‡'„'„'2h¡…RÚL›i3Ð%ë’uÉ€ÒšÒšÒ@µ_µ_µ(«-«-«.l¾°ùÂf/âE¼ˆï‰ï‰ïš^M¯¦¨¨¨úêûêûê7‚ÆÓx¿ð( #ev;²e?Ê~ÄŠ+£+£+£¹Ý ü0?Ìsn-·–[Ë9ÿÈï#¿ü8?äü‘óGÆñÁ˜Á˜ÁÎNœ88Áùä¶Ém“Û8×H5R”ó\§\§\'Ζ,;XÆùw¾ßù~ç»ø=+e¥¬”s¶‹íb»ãÛyì|âC|HBèz†žY˜™ Û±ÛÖͺY7`*1•˜J’Åq‘¸H\$á„ «†UÃ*À×äkò5‡§Ož–_\~qùEÀkŒ5Æ>¦m èXŒOߤoÒ7œÄIœ$!‚ÄKâ%ñâßë#õ‘úH.n·‰Ûðœ¤CÒ!éZ„¡$F£ˆQuÞuÞuÞÀPöPöP6 ;«;«; ˆÓâ´8 °2VÆÊðoFNäÀ½¹7÷~ìÅ<Àƒ…ã‹Ûz%†C‡¡4‘&ÒDþ=•‘‘K<<<ù÷·Ëo—ß.H i!-˜å7ø ~HˆMˆMˆ^ë­ÿµ~ÀÒbi±´¡KB—„.”V¥Uið¬Ý舌Ȉl±›¥±4–@„³ƒIƒIƒI€zT=ªŧòù€|@,¥HF2’ N ùB¾Ori#m¤Ö€‡÷Þ{x M¢I4ôUB•P%“““@ÚÏi?§ý (/+/+/’,I–$ 8p(àпsÒlšM³²‡ì!{ëÿ‘þH„ILÅD(êÔuê:5‹"j¢&jü/±+±~)¥Ë®.»ºìêǹÒxi¼4¾bdþJ“ Vo®Þ\½ÙºßæÏ9òhäÑÈ£0µº·º·ºyyyÀÅž‹={€ Ïox~Ãó€K¯K¯K/Àœ˜sZ2 šMƒÀœûœûœû¢BÉ^²—ì…¬æPÍ¡šCÌ8R5R5RE‘~&ýLúÙÿï°h,‹æ€…ä ç ç hE+Z½;L8L8L\wœ©›©›©óËHø Ⴤx¦˜M1›bÈÕû÷î€ÿöÕo_ýöˆ÷§ÞŸz xš=Ížf±,ÅR,P TCMCMCM€¸OÜ'îÛÛÛaì4t: Ø^éRéRé‚:Ç1Ç1DZ¹ \Â%\²z;BŠÐ;{zšž¦§%mh@F#X‹bQé'MŠ&EÓ\áú ×_àÏûûû“ªðçŸ [<žñxÆã(ˆˆa¡øXÌ^OxÂs1«ýÞõ{×ï]¿âWü ý´bZ1­€ó%í%í%­à0ä0ä0$€è‰žèsÙü„ïì᥼”— >¶2Ï1_7 'ÇÈ1rìê^Gãhܼ…·ðý¼n_ݾº}b¦.J¥‹‚‚d’L’ =»Ín³ÛÆ0†±Çm7”­»Â®°+0Ù¥TŸ_Ÿ_ŸoݯÍÖfk³…ã²@Y ,°ª(¸8¸8¸øè äèG?úÅuözT 4ЈÝÈB²HMØù°óaçK·Ê3äòŒª"m˜6L&èÎ¥žK=—º¨]r“Ü$7aBºÐ`³˜}ì®÷â^Ü œºSwêY‹ºEÝ¢æ ­Z/´^”*=•žJÏ‘9s¥¹Ò\™ýqwAwAwÀÕ\ÍÕp±Å)·ƒmí[¸tŽuŽuŽæ,s–9+ûc¥›ÒMév÷Lomomo­¤TõºêuÕë<Áž ì[ö-ûŽp„#ÀñGü@D"³÷Õ÷Õ÷Õ¨jXÙ°²a%\”ãÊqå8À"Y$‹Ìþ˜–ÐZ22g“âq[®m´_Äž~¶_û gÛ"Ié¼v­ûI‰"Q [ç9®œ·dZ2-™ì/»Ø.¶‹ÑØ%+JV”` ëa=¬ JCi(LbŽ˜#æ@v"èDЉ kðøKã/¿$铯”¯”¯,žOš¿Ì_ÂqÛÎþÕ¾cEEEEEEÐÛW¶Ž Ù´»ß¦Ýã6í^˜/"Ô È Ÿ×Zj-µ1SwJwJw J)¥ì+Ñ8Û8Û8ËŒ#e#e#e’>y®y0?1@asð³M»çÃ~û!ì‡Ò­òÝòÝòÝUEZ/­—ÖKÐÍ?›6ߺßVÑ»t¹w¹w¹ãëæ¶æ¶æ6ò†¢GÑ£èX `¹.ìv ;gc###èC[¼Í¶vöI. ~Çââââââ Ú»¸”K¹”ü÷øòñåãËñV_«¯Õ÷¦8Ÿ­Û>Ÿ\7¹nrûº;º;º;ü:Ë;Ë;Ë­/ÏXf,3I–C¬C¬Cìß|ø)~ŠŸú®2È “ â!â!{Ú¾¶…Ÿä!øûíBTÖ^ÃkxM\?­¦Õ´ú§À¹¤¹¤¹$¶Ü¡Ì¡Ì¡ŒÞ‘dH2$—›‚ªƒªƒªÿ§îW÷«ûÉ?ÙSì)öÿÒæ·Öhü=Š?°'´k;.¬Ø‹½Ø+´“’BR®qWqÕÁTÇgŸu|–Þ‘h$‰fôYö û„}’9Ö³£gGÏ`6öÂrö8þyAñ-¦åIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-1.9.png 644 233 144 2467 13755454066 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜìIDATHÇÍ–[hTW†×Lt’‘x‰¡ Ó€¢¦ƒÆÂhÑÐ5Á F}h R‹(6âKMMÑÒ ŒIH##ÑN Á$˜+/0„XaP'޹4—™sÎþú0çÌk}Ï~9ç_{­ÿÿÏÙìµ·€ˆˆÌ3ŸÎÅÎÅÎ9 ìÜoÇ36flüô÷¾¨ƒc‡cÇ£aîù¹ç²³§6¶æ­üÔz›?UÏŠË<±é×Ò¯9 M\»–ïZž‘Àg:À}Ý}ý *[*[üMþ&¾‡pW¸ Z-[óV¾Uoñ¥òKÍôE`f`fÀñ7¤»Ò]"³!gCî¡DB_.l-ÝZ ð2íešr€þÈ$S£ŒbH ¶æÍ|«Þâ³ø-=K?áG`ÁúëE`{ùörwC¢àé¨ZTµÈÒ‹_NsšLÐFµQ½B¯` T‡êÀllÍ[ùV½Ågñ[z–~¼¿¶g‹ ,£,Pñ;hz»Þ`œ4N7f«Õ(õ@õ¨ì%JԆƘ5¢ ½Õê Qj¿Ö­u=ªGq“Ÿ²ô²tËàÙ¢”¥ùì¸Ãîðè ´ÐTh*É_ÂF–‘ŸޡéC@+-´¤a„ªq5®Æjª©NÉ+â0‡Oôãúñ„- „ÉÐXh ’ú¦ÓØÅN8pâÀ‰ä÷~AT{¡½õ³jP ‰ÿp¹òrååJ ‚)¨Ü(7Êm<<< ukëÖÖ­…þýÝýݶõW¼#Þ‘¢—ÔOø1=øš‡›‡ýêPi*)íW­Z«†Ý=»{v÷Ø ßz¡õBë>½÷{ï÷Þ‡%•K*—T‚¯ÞW難¥—\zëÏ žI¦O©Ÿ,=Sßô#0çöœÛê„W†WçÞŠ}óÄ4V×Y×Y× kÖ ¬°ãÞˆ7â@ýÆúâúb;®e½™ú¦¬ÙY³'Œ ¦lû?U“jÕ¬šU³MäÛçÛçÛ~Ãoø=kxÖð¬¼Þ o”+=Vz \®W\ª½T{©6Ũצ^R?áÇ)bÜ4n:žˆhÛ´m"¢‹ˆÈqJ¿ô‹H¬’U’ñø@|@Äáwø~;>Ø7Ø7Ø'òÚóÚóÚ#’§òTžÙR³¥fKÈ|5_ÍW"¹7soäÞ°ëL=Kßôã--|xO¤½­½MDfˆˆð­L¨  JÌñ¥c…c…M”ÙÙÙ-2+oVÞ¬<‘Éu“ë&׉ŠÅw»ÇÝ#2™ˆLDDNåŸÊ?•/²Ç·Ç·Ç'Rt§¨«¨KDz*£JbÎ_L=KßòóÑ]Ó†´!`…²wåð‘á#ÃG ¾3¾3¾pá‘M‘M‘M‰öª: Ök‹µÁ+ï+ï+/¨I5¢ì¶¢x«=מcöËîÊ”>FHé)} c¯±7Ùw¦˜JA“L2™‚³É&ÔfµYm¶Ã*G•¨à;ý®~7¥ÅC¡‰ö±ÿéüÄï`èz'€qÈ8Dù䣸B#ÀXâlTÕcõˆð†7ÀoÔR ªK½SïPÜ3–ˈƒþPè&RïƒÎ?mÏÊi{»˜¶÷±éyƒýE :¯}`$ŸIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-94-grey.png 644 233 144 6247 13755454064 16014 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü \IDATXÃ…—PS×¶Ç¿{Ÿ“„ A˜R¥D~X.øµ Jj;ÐW¥×ÔÑÚa°à«÷Å÷œK« 3}”Wf°vŠÑ¶h)ê- È/ joâZP_Š Å*Q‚INÎ~è{étý³gçì½Ö'k÷:ë‚‚‚‚‚(1gs]Ëòƒü k)8Yp²à${I;ªÕŽnˆb¾Ì—ù–ü«( ±;mõ¶z[=+Æ1Ã1’HD"@/zÑ `'vb'+–m’m’m"ùü#þÿ¨ó131ÿ]WPPÐÖ]”^”^”NF„P!T%)sâ—’>ŒG<âéw¢VÔŠZñŠ}Ú>mŸ~q…¶AÛ mønÈ>b±´Þ°.³.³.‹ýÏrÏrÏr4Å®]»žä¯”¬”¬”+æ­˜·bàž»Ÿ»×»÷»ý=óïŠçŽïæqóñ® ®aÞÌ›y‹ÛI&É$™¡å\(Ê…^:>]5]5]õò<¿V¿V¿VçÞõ½ë{×÷RG´1Úm$oÊòeù²|Xñ>ÂGPÀ +¬2 AB¬¶`[°-o FƒÑÀ#/F^Œ÷>yýÉëO^÷3E¨"TºÚÙéÌtf®+gY,‹e n'  kÈÙ³f`€!ø¾ž¯çë §í3öûÌË©ª×T¯©^â5¹š\M.ÿÒ¢´(-PÁþð‡ÀÂY8 »¸‹»¼à/S˜Â€D  }¤ôAÀc<ÆcðÞÞÞ¨9Rs¤æˆ°}@? Ðó?IåR¹Tþk³°IØ$lJÜŠD$"ñÁ$•wÈ;ä€ä%ÉK’—þëŸÖfk³µùåT•F¥Qi„7³Ò³Ò³ÒùŸ”Êeüz§Þ©ÄâFq#x¤! iù™üL~È"C11DOôD ¹Èï\í\í\ øh|4>ø»ý«ÞR½¥zKxÓßÍãæ£Â”0%L¥¬°×ÙëìuéËý6ûmöÛÌÂ4'5'5'y·F,¢M´‰6xs1\ Яé×ôk€ä“|’@ 5ÔÚÑŽv€HT£ÕWÏÕsõ‚Œ`x»ýkÎjÎjÎòßùiü4~ææqóQÉ"YäÁ¿:ÔµC $u&u&ub½²JY¥¬‚TLÅDxÓûô>½<Ö>Ö>ÖË:—u.~üuò×I±ˆE,€YÌbÏŒ™‘·4tºð$öIì“Øg˼••ÊJe%¤I]I]I]XïæqóQ!LÂ^ýÀ÷±ïcßÇ(ŽIŽIŽI&0à 3¤Ô@ ÔeF™Q”Õ—Õ—Õ-y-y-y@ECECEPWRWRWÌi óÄ<1 Ñ$šDƒ>ƒ>ƒ>@¹®\W®úÚûÚûÚŸÿ!¼÷ñ>¤1êuŒšT¸yÜ|¼mÜ6nÇWQ)Q)Q)È—_“_“_ƒŸà|…¸P\(.Î:¼ºûÕݯîÒ2Ò2Ò2€Á5ƒk׺L]¦.Ó]Ž€à † æ$s’9 ¨)®)®)æ.+ ”FJ#Ÿs:ãœqÎ8ðòly¶<Ö„„äwww£„ΑHz†ž¡gží“a ¶` v‹Ýb7`+µ•ÚJÿRÿRÿÒç|8·Ø|6ŸÍFÓFÓFÓž?¯<^y¼ò8 Ü¬Ü¬Ü ø| ¾Àn°ì†ÿ“QL0=OߣïÑ÷ÅQ%‘” ä¹@öË*Ë*Ë*Ür…\!ÛÁv°`ü!þHHOHOH½½½ª}UûªöÕßTSý à¸î¸î¸H·H·H·—N\:qéðÂä “/LÛwmßµ}àqŒ8FÞ÷ãýžs’ 乿šrÓ]Ó]Ó]¸GUTEUì܆Ûno¸½¿m,`,`,€Vùÿèÿ£ÿdmн {A÷0î³ëì:$!!!€W»W»W;`Òš´&-°¨eQË¢À”jJ5¥A·‚nÝôùú|}>€s8‡sÀýÉû“÷''Ö'Ö'V`T?ªÕüÛüÛüÛ@pnpnp.fúÅ~±_„äâ—¿¼ø%>–)eJ™R(¡Ð@Má1¾€/à H~m£mÔ©4þhüd5YMVÃrŠ?ÅŸâ±¶±¶±6`ÇÕWw\<½<½<½’L’I2¡‹ÐEèu³ºYÝ „“pNŧŠOŸ4‡æÐÀÛâmñ¶ÊZe­²6fb&f‚¢iyÓò¦åb<é'ý¤_'qçq)·mzÛô¶é+—fµ³ÚYmøÎ§ÝO»Ÿv/ýϱ#cGÆŽ8óbwÅîŠÝEÓd+d+d+`kæ›ùfüez™^¦@ïDïDïz!õBê ²)²)² XX¹°ra%QQQ„­ [¶øÿÿ%‰’D ØÒƒK.=¾æjÍÕš«¢µggÏΞt·GœGœGÜÿlu´;Úí[RÈûî¸ï.ÔóKF%£’Ñ+ò©Æ©Æ©Æ—³’?Nþ8ùc–œššš@.›î™î™îýöÕo_ýöÈüâùÅó‹g€3À ˜ÈD&>/Wì4;ÍNÝ\7×Í ö/Ø¿`?¬~yð˃_°¥Ò§Ò§Òs™Ÿ}qŒc\ì,Æb,¾³‹§Çè1zŒë@+ZÑúp¥/Æ‹ñ™_(ô ½B W–^Yze)ûKpDpDp9³(fQÌ"lò_à¿Àd–Ì’ÙgÍp7q $€```YN–“å@ôÍè›Ñ7a™,›,›,ƒ÷yóyóy³ ’š¤&©‰± ±ì‘‚¤ÜÙÅÊX+ãƒ]mžså\ßÈ$夜”_Ρjª¦ê½õs…˜~Þøa㇠ÙñññPl’M²ao‹·ÅÛ†1Œa@;ì°èD':Ÿ]n›ûMÔXÜXÜXìÌ355åKƒ¤AÒ SEÅÅÅŸ]B! QHN£}èÖ¹ûQO aCB7ö`öú¨Ú¨Ú¨Ú²4,,¬SEæ(s”9ŠŸ¨É¨É¨Ép湒乌0Â`3˜ …R€Å±8æÊ´ìZÿµþký,¹£º£º£š+ó´xZ<-fµŽZGí¾CÝ…Ý…Ý…ëgý¬>®8'Ü V×xFô½D/øÜ¾5|k°ï±ï±ïÙwÈÓ×Ó×ÓwðLoCoCoWÖòNË;-ï°d’CrHdâ·â·â·`C9Àž²§ì)@"3¦~S¿©§Z—´.i]ÏÏÏ@\%®Wí;DKi)-}0ë’âaW§â~÷™¸>Idÿÿˆ¸²9í:óH<‰'ñÉisŸ—jÙŽlG¶ø·wÅwÅwEº6º4º4º›Ä±Gì‚.¦‹ébØ„|!_ȇì‹ð/¿wFŒÄÄÄqw=–x,ñXR¶zîÒìýI¬+Ä þ°ëdÿÍ}bEEEEEE°¸3 ×Ï4äÒnžK»‡]Ú­£I4‰&í­G²E?op48Bö„nB7¡ƒ‚RJ)ÅSw&ÚfÚfÚfD냊*¸»û=ö{ìïn²=´=´=ÜÿÙÝ7î¾q÷ À¨ríS¸Ý|Ï@ì^ p9¸êÒnmÔ¹¨sQçÊÒ<>ðøÀãƒSEæ@s 9Ÿø¾àû‚ï œy®ŽÞÇ8Ï8Ï8•†C‡¡ƒlWô(z=€¨U¢êoWømü6~ÛLBØÊ°•a+é¸+Þ¿¸Æ™ßsqøS«Õjµ‚kjdR&eR²{ä•‘WF^Á7Î…Î…Î…7Y˜,L¶ùó±ucëÆÖÍ;7qgâÎÄöß·NÜ:që„sÍ”cÊ1åàöHÖJÖJÖþ{0Ó1ÓU7AdÜÆ1Žq1È}®D ¿ç!øûíjÑ‚´8 Y=«gõê>z–ž¥g ›Ý8»qv£øŠ¤BR!© w¸,.‹Ëº¨?~6üìu__¹ ¾(¾(¾ÈŽ»ü6¸­ÄAñ'ö;íºÊ…³9ÈAßIÒI:Iÿg8ka-¬åïòyˆ<„Þᆸ!nèaˆX"–ˆ%ÙÃ=[{¶ölææòçn,gþŒãØ×Z ´IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-61-grey.png 644 233 144 6115 13755454064 16000 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—}TTÕúÇ¿{Ÿ3¯(¯®tŒ ˆ 5_º*©W„++ù-½Ë¦›Z¦^õf’$ŠP¾Tþ¤Ô\M¨% ò¢D ¸ÆË%ï‚¥‹$äe@§@!D`€f朳ïÌ–wµzþ9k?gïçùìg?ûÙ{“”””””xbLÆ>t9‡¿Ãßa¥)_¦|™ò%›–Ö“Ö“Öó—ÙÌ‹y1¯÷_t‚NÐ-Øl/²Ù‹ØQœÁœ!IB‚´ -6c36³£ªµªµªµ$‰¿Ïßçïß8CúI?éß›™:5ujêÔò¦ôèôèôhÒ-ø þ‚?y~ŒCªqqyÒqÀ%X‚%4[J“Ò¤4©Æ1âqŒ<¶0­8­8­8Ûìèvt;ºËþc}Öú¬õÙ{ÜN¸p;« "D,ˆ I‹‹‹ÀBï…Þ ½¹-ÿ—ûËãe{ãö]þdÿ2ÌÇ»"¸Œ¹3wæ.½LâH‰ó?Áùsþœÿ¿ÎŽ|=òõÈ×~Þ>e>e>ebBDKDKD uÎiœÓ8§‘D©’TIª$X±û°ZXa…@ b`:¦c:¬v_»¯ÝQÕÕÕÌYTT$%ô­ê[Õ·jãq­¿Ö_ë¿T-Ɖqb\ø ÏâYü— è2r`ôÀèQÕ¨Fµïd¾ˆ/⋪/8l›Ãæ·: $ $ DXbØaØaØÁg{Z<-ž` ¦` ¦gz¦V´¢À$LÂ$ÃÆ0€§ñ4žHi#mððü€û€û€;:ò?Éÿ$ÿáåŽªŽªŽ*þºR£Ô(5wK„µÂZaíŠõXXÑ9D5õšzM= ˜¦˜¦˜v¸ÒZb-±–ø­0 BT|t|t|4ÝÓ×Ó×ÓS¤H)RФ)AJ±)ƒ|J>%ŸÄLÌÄ _È/ä€ü@~ ?,ŽÅ±8ðâqƒ¸ðœí9Ûs6¦Èöe²™Gæ£Â°0, ?¿ÐqÅqÅq%úO>ƒ¾0|aø‚—sÄ"½ ½ ½w:—Î¥sºŸî§ûRKjI-€JT¢@! QÀ , a!, ¤‘4\.—ËåŒ0ÂÜeû†CŽ!‡Ï–ýË<2eA,ˆ\ç u†:C°a7Ân Â3×3×3JWäÜé{ô=ú0:tþè|à–ï-ß[¾@³W³W³ öˆ=b€uX‡u;ÍN³Ó©"U¤ hëoëoë*V­<:i±^¬ëáîyÞó¼çy(Ãn†Ý »‰™Gæ£B (>·Åëׯ8:7tnèÜPbtÍTIÓãô8`)±”XJ€S§*NUyÆÃgøŒñœŽÓq:vÉl ¶“¹Îïß;¿ÇSГГГ`¶M¶M¶M ·n Ükkk}­¾V_ ”””Ÿ»îþ¹;°£aGÃŽÀ'Ô'Ô't‚‡œ&§Éi€=Îgÿ´}è/_Ì¥åFnŽÜ¹‰vE£h»DÕ¨?P d´OmŸÚ>•]ú±õÇÖ[ÇÍØ” Êe yMóšæ5 ø™àg‚Ÿ^Šx)⥠Ökˆ5Î=Î=Î=@Ë-O´<ÿ•&4¡ *¢"ª µ´IÚ$m @€[ÇšŽ5kS—©ËÔ…Õíêvu»Aa€†Ô3| ŸÂ§¤Š-[*¶ˆ£F?Œ†–›ÇÍãæÁ¢3êŒ:#`Ò˜4&Í„£ÞáÞáÞa@l›Ä&ÀãœÇ9sÿËIi"MÈV²•lýþ;úýv!Jˆ¢ ýÖô­é[“´„˜ˆ‰˜ð)‰HijJ:íÚ´kÓ®IV†)Ôa_wö-ë[Ö·Œë())w»ì¹Gj"5‘Ø   äºäºä: sEæŠÌ@ðÎàÁ;™±3cgÆì"»È&rö{‡½õõõžÈP²l'Û¡*z·èÝ¢w%kgngng.½®üHù‘ò£[ëf§ÙiNp’?øùÀÏêP‡ºÇO*z=ŠžÍpÙpÙp™_üÊ+w®ÜÉV®_¾:œ\Z7´nhXû¹ösíç@ܺt?øö;ìw nÔºÐC=€6´¡ ¸[u·ên ¼)¼)¼ Þ¼xÖ†‘†‘†ü-Û#Û#Ûßjîiîiî®bã·ào˜‰™˜y{+¥gèz†«§Çè1z¬ëR›Ô&µÅ9´åÚrm9PSQSQSÁži n n FîäÂÉ…“ a›Ÿ5?k~ðqÀÇ4„†Ðgqg']¹¿7üÞð{cÐ2¤Òi¡-áKø^PÜUÜU܈…Xˆ%Y"‹Éb²øöVd ¼/Ê>C8ÂΤèz #‘®¢«è*Ëñmñmñíçw›Íf³Ù,,Ÿ“?'N>}GsDsDsé-é-é-¨È;äò€(D! À†04q9‘b¥X)v¢!¢Ûeî2w™wß)¸Sp§€ÿX£ÑÆä¦ë-z‹Þ²ç󾘾˜¾r&˜`’ù>ê3Ì0 MØ…]ØEŠfÎ.œ]˜ñWõëê×Õ¯ç¦÷ÏèŸÑ?ƒÈ.ÿ¹üç&r—À÷QßG)+„ $¨<À‡cM,ÂF>Roô|¿¡gè‡çHÞš¼Uv¿·û½øÓá÷—Pë¨uzÁKÀQŽ’šOó„ÊBeøAuªN,XÀÄFÞ¨7ú >ƒßÐ3ôÃó˜[9'"rb;€þ@°K ®®•®½¡½A02©Òûõ½´íöT¶ÊVÙ˜k† &ž"¥ÏjKµ¥µÉ`J0TY˜Š?¦ }c+¯‰ˆ¤×C¼/Þç‹Vú@×@ðvÊT™Ì1‚¨rU®Êfši^4È®p(£Œ23¬¦Õ´š~ÇQލ­j+sü:ŸÑ‹ès3<0&"rê[ÅÝvtúúÞ‡· oBݺº¬º,ÔÝÿÜí»Ûg Þ>qûÄíP·¹nsÝf3óz‡Þ¡w˜¸·¦·¦·NþêdÖÉ,Ôo ~:ø©©§†¤H7¶öÔ·ú—ˆÈ¿_]üê"ü3(u(U•'{.ã¹ üEéE+‹VBÆòŒåË¡åaËÖ‡2Ÿ2Ÿ2E}E}E}6”6”6ƒžAÏ gÑ@ ½ ½ °ªrUåªJÈmÌ=ž{ÖV¼j{Õ†t×üŠùª.Ö_¬žÇj©²ÏØg6¼.²Í²Í"2ãñ¼âyÅrºúŽËïòKlEFÅk¯‰$—$—$—ˆx†=Þa—r)—©°VX+¬"Ëî/»¿ì¾ÈlËlËl‹<]×›®7]oI=’z$õˆHwuwmw­È’?&\H¸ ±—?;Ûu¶ËrZäíì·³Eô¹%×–\Ûðz´õ–Ías%ñ XdÇ–w·¼+?nú}ÎÁœƒ’ìü{é½Ò{"ÜÜÜ"ùëó×ç¯YS¶¦lM™H¡¯ÐWè h- ‰ÄdÆdÆdšƒ<)xRðDäÌá3‡Ï)H-H-Hé¿Ñ¡ÿ‚H̽è÷£ß—e*êã¨%Ùµ"jY*¶¿`Aµ‚ÿÿÐxíó›Ÿß„·víLÚ™dnI®#בë€uë:×u‚sÔ9ê5ók÷­Ý·v4t4t4t@°:X¬†®¸®¸®8ØëÜëÜ넦ù¦¹¦9øÙ/^ ¼€¯ßÞ̺f]µŸµŸU­¢ÚŒo¬ÕÞj_ €*ÿå¶£Gñ'N$Ž$Ž€³ÃÙáì€þÉþÉþIØÔ¾©}S;$Õ'Õ'ÕC©­ÔVj÷y÷y÷yșʙʙ‚žc=ÇzŽAþöüíùÛÁñsÇKŽ— ¶ú#ûGvü‘³[Ζ®–.àHx1NßTEWE›§$ðÙ|Þ|ŒÇz¼ ¨Pc¨1Ôh¾¡ÀþÀþÀ~ðŽ{ǽ㠻t—î2ídÂ9áœp†íVuBàoö@;x7x·x· Ô‚¶QÛhê1UUQUè‘SÉwÿïcä†}EÝ}êc%ª„9µS«bÐÛô6½ ”[¹•{‘_Ù”MÙ@©1µÈ6H Ž8Po©Õ‡ú¸>ΜZᯘ˜ˆ÷Æ{}ÑÜ3|Ìp~¿á¼{¢öD5agVÕ¦µiàÏ¡ÑШéüÔpˆC þ¢®ª«À9Îq˜f’IP}ªGõDþž øSh84LPuk^Í üÃpþ=Ñ{¢àOÿÙýW>³·‹gö>ölÞ`ÿf÷𷈟áIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-96-grey.png 644 233 144 6315 13755454064 16012 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü ‚IDATXÃ…—PS×¶Ç¿{ç@B‹©¨ Jä‡E@Gñ ¨ÔvÔ[Á'µ‚†*>®ïüQGZ¸Ûb ÅѶӈýñü}ñ7?ó ñrZGe!D±ZÁ œœýþ Ág:]ÿìÙçì³Ög¯õ=g¯Còóóóóó¡À„™'ºœ{Ä=â1Mþ©üSù§ØtÕ€j@5°:‚ù0æsø¿øü ~Æ¢íã•ã•㕬'p'HÂŽpñlÇvlgÅâdq²8™äqϹçÜóöÄDLÄ´¿¼À¿À¿À¿áAaFaFaéçƒù`>˜¬™àZ\\ : ‹XÄÒ³‚JP *¡Ånµ[íÖi‹UÕªjUõÙ>{¿½ßÞ_˶жжpÑG²£²£²£¨]´jѪE«H^ŒGŒGŒ°Øw±ïb_À=wßw¯w?ïö7éßÏßÍãæã\\ÆäLÎä²l#Û‚Š‚EÁ¢àëß[ÏXÏXÏÌñZ?µ~j½sϪ‡«®zH‘‘‘d8Oœ'΃ ãc| )l°Á ™È031¶ñÀñÀñ@¬ëhîhîhfm¸6\.ì|{ðíÁ·Ó¿’Kƒ¥Áqç6ç6ç¶•GYËbY¶ÐeäàØÁ±ƒcšÑŒæÀÿà*¹J®²ùŸöQû¨}tÎZå[Ê·”oñ±©;Sw¦îäÎ*, ‹Â%üà?ð,”…²PpèF7ºxÃÞF0‚aC@zHé#Œ0‚3ËÍr³úKß\úæÒ7ü}“¾IßÄÝôôòôòôz\Ç'óÉ|òŠÍXXñt˜zµyµyµÓ=¦{Lÿìß¶:[­nÎZeª2U™Ê¯ËÊÈÊÈÊàn*üþ ø9›œMÎ&@X/¬ÖƒC RÛä6¹ >ÒGú2HÉ @I"I„=Âa8§Ä)qJ€)­SZ§´ÂÏí_¹A¹A¹_çŽïæqó•F¥QiÖ,¶·ÙÛìmumr‹Ü"·°ì§ÙO³Ÿ’6ÅÅÅP!H‚ §wé]z€|àƒWöÞÀzЃéHG:€‰Úµ¨Eí«åÂeá²p éFºó^ó^ó^ÇÉqrœ°‹ÅÇâCtž1ž1ž1kc( gá,üÿéHp$8€ÄöÄöÄv¬rz +„ Èéú„>Œ*£Ê¨Ú¶/l_<~<üx@<â@TêP‡:`,m,m, ¸x?ð~ Ð%ï’wɦeZ¦Øqvœ‡\Qª(U”Â3ñ~âýÄûXåæqóq|‡ü%Ûç¢ÏEŸ‹(ŽJŠJŠJ"j˜`‚ Ðh´ÀÔî©ÝS» 2.d‰F¢‘[ÖlY³e ÜÜÜ A#h^ŧÐèŽã8Ž“pN4C4C4ƒ]°,±,±,!QüF~#¿sEwDwDwÀ¸Ü îH¼4^/jjj€Çûï{¼0ëÌ:³¦ Ó„i€­ÑÖhkLC¦!Ó0¦S©°ŸÂ~ û 07˜Ì ÀÆ?u;ëvÖS×N];u-˜ Td½c½c½ƒ^ºŽ®£ëØÑê{«ï­¾w á…ÿ ÿþôŒ_£_£_#Y>³wfïÌ^Œ²_Ù¯ìWxÌÖÏÖÏÖÞ­Þ­Þ­€AePTÀÜ÷ç¾?÷}àù¢ç‹ž/¢lQ¶(0p{àöÀm`¾÷|ïùÞ@JQJQJ5=jzÔt 1¥1¥1P¤)Òi@PNPNPFu›t›t›à¡Ôjñ‰X!VˆüaŠT¤"µà—Ïåsù$¯6ÐêT¾|þòùËç’8Gâ`9ÏçÎsÀ‹† /€ùð—d¾2_™/€´ ˆÌŒÌŒÌüöúíõÛ ôÚ{í½öWR1 † C€3Ç™ãÌ™wÝ–ÖÖÖ ±DGtD‡ïˆ“8‰ó{OòÝüïæ7hhh:ý›5ÛšmÍþ 0TªÕ;wooßÞ¾½]TÖÕÕÕÕÕ…ñS¶S¶S6ˆI ;ÅN±SÀ»Æwï¸â¸â¸bÀ˜kÌ5æå¥å¥å¥ÀHëHëH+À­äVr+èžèžè°Teª2U råð•ÃW ¶›Æ›Æ›F*•ÆKã¥ñ÷7;ªÕŽê¥_“ƒO>9ø@+ZÑpÌcÀcÀc Åk¤f¤f¤fNVÒ'IŸ$}Â’ÖÆ¯_Oþeè5ôzÁ~ûá·~û$àË€/¾üíþv;ÀZY+kȲ„,¬Ó¬Ó¬ÓݨnT7 ÈŠdE²" dWÈ®]°ÝÓÞÓÞÓbÓéY§gž…©Bª*ÆÞf"&b¢E›0ó0¯óo=AOТ6Ô£õÏb„X!VˆÝö­´IÚ$mºŽ–- Z°ùaaaä|Ôܨ¹Qs‘ì7Ëo–ß,H‰•X‰õÕÉD Ä@ Öc=Ö²C²C²CÀ‚s Î-8`va,–"K‘¥òZŸZŸZ^é¹Ìs™ç2%? `6`CçßX+ce\ «ÍsÆLôÜ?ÈQr”ýWM  4aO%¶b+¶Ò¯kvÕìªÙÅï0Çšcͱ’dÙ‹pO¸'Ü`€©Ey]E]E]…s·©ßÔoê玉½ÅÞbïó…aGÂŽ„ùê: P€òω#™_éîGeèCúøÈE.rIeÄÕˆ«WËR$Y’,IÖùBS„)ÂÁ™/e^ʼ”éÜíHn‘[äÆÑtpÀÇ«—‡ ±!6F¯ÑkôÄ7t7t7t,©Õ»Õ»Õ[T&ó’yɼžŽÙ+ìöŠ}Ÿ?(xPð `:¦c:Lq¹9éµ¹Æ Á[ð¼1åîïw¿û;`ϵçÚs÷}.ó‘ùÈ|U<¬~Xý°ZT¦yOóžæ=–DrHÉX8-œNƒÁ ^ðšá OxŒtA‡óõÑõÑõј"ë—õËúa‰°DX²ïsZBKhÉÓ1—¹¶¹Æ}÷Î]¿$b×ÔU"QÙ„v»I,‰%±I)¿ׯ:v8v8vOÒ…t.,‰,‰,A²Ð%t ]Òyt‡q>Ïãó þ6ôÛÐoCaýKû—ö/uK¢%ђ貸‰—fÏMA-¨5wÌUÙÿqW¬°°°°°wFáº0©!—vw»´{Ì¥Ýk4‘&ÒÄ=•ÈB²è×ÕŽjGµƒßa.7—›Ë!¥”RJ1äÎDÃhÃhè`{ª~ª~ªuKHH<¨6þlüÙ¯ºßé~§ûÀ¨tOÝ€n¾IÐ×€Ý ¤.¿¸´{5âJÄ•ˆ+e)’lI¶$û|¡i†i†ig¾˜1ÿb¾s·«£ŸÒáÛáÛá‹ÿmnknkn#[¤]Ò.i (¥ ü{ —Æ¥qi£ñ!1!1!1ô¥+Þ_]ãèë\"ü%$$$$$€wM;˜'ódžä¿ûßì³ÿMüä r9ƒnñâqˆ8dã×/V¾Xùb¥ïs§¹ÓÜÉJïž¼{òîIç²LjcÄ!ÊõXî±ÜcùÞ@VÎÊYù¹Zˆ!†X¤ÇK¼ÄKa¦»®Dñ¯óü‰ývUÐ@³€U²JV™ÐC/ÓËôrcÈØú±õcë…7=Ôj5íe‰²DYÚ¦ÐË¡—C/¯NÐõèzt=äÿ&šö½Ëoµ ÐöGb¯i×õ¹p 9ÈáÚIÉ ÿe¦ašý™^³½f{ͦ¢>QŸ¨ïÙlá°pX8¼ã÷®Í]›»6OvY!.îÆrôÏ8þæ-9ü?×IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.5.png 644 233 144 2764 13755454067 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü©IDATHÇÍ–ïO“çÇïÖ2©C:ÉÀ‚Y4ACd{QHæÜj³ Öà¢n/ô@‡Dr68„,,c[Œ.3k6% CÌÜlj,ÀL3Åõlä4&Ç ’mœ… '?ÄЂ”çiïÏ^´Ï6öx¿yrÝ×u}¿ßç~îç{ß„B<•| 0f³é‰ØøO}>õ¥Ô—Ö}™ˆÝ10”Êo7å¤å$Àš¶5mñ!=ÖòZýÒ~!tü¥|Ú¼xJè+½+½†-Éø}¨(¨(H}&ì³Ïì›S¡òëʯ.¶_l§îîf¶Ìl=ÖòZ½Ö¯á-Åïÿ…_HéJé2üV>±ò ! ·4·4ïH¢à‡{Ž Mà‰íú§üF!6| æ°96Éé‘‘à v‚,‘%ÌóÇ9d‘EPI%• +d…¬X"$B„È’xŒ1Æ€Yf™ÏÉç˜OfwB’/ÉŸ¶áÓ䊹ûdO•¡Ê ¡Å7Ý] …BàÊq¥»Ò‘Áâ`q°xù‚ŒzF=£¸î¸î¸îXžW®)×”kàk÷ö†–WZª[ª‘§ÿÛÒÛÒ ÓÇcÑX4¾ j k A¾’Ðc”›…âùNÃË6·Í-Dèê½î}d(,ÙÑ¿£_,^:péृÂP* •…„ôz=âqèþ¡û‡î Ñlk¶5ÛIJ1×;×;×+„s«Óæ´ qå™+¯<†Å€'à‹³_…SÂ)†B!¶–n-‚zDìÖ“®']Ò óÑù(tXº³º³ ¾¶nsÝfýÍ×®\?g§ÏNŸ†vc»±Ý¨›ÍîË»/ï¾¼|ÅnV߬¾Y &»Én²ƒýˆ½Æ^g&Ú:Ú:–nwŽ;@úÑô£Ò+Pטטãwä¿'÷MîÓû»û‡w ï€üîüîünصm×¶]ÛÀ›âMñ¦@¡¿Ð_è‡F£¿ÑÖ,k–5ëoö~^^TvVvVv‚§ÕÓêi…Ü9™9™àI»øÎÅw˜5¨!vluËê–ø?ŸæLsJ/<üõá¯ð¿ãw?»û¬ÊLý)õ'h~·¹©¹I':Öu¬ëX˜‡ÌCæ!ȵæZs­úʹËÝåîrxtáÑ…GÀ7èô BãºÆuëtœÒ‹BE!hQZM­&€hk´bÏ®úyÕÏÒ+Ô !„ÖAO~O>´­îø±ãGyÐB¢Eû‹Ê‹ÊÁrØrØrÎÄÏÄÏÄuW«ÆU¥£¥£¥£0ycòÆä (¨*¨*¨‚@$ DÀ´­A°üËRe©‚×gö¹ö¹ˆ>ú@ÏmÏmz’›ÍÝo6¼Ù WåÄƯŽ_…ñã9ã9ÈñÚÄX(Y(Y(Ñ…-œ[8·pf‡g‡g‡½ìe/LÙ¦lS6µ²VÖ‚Ú 6¨ 0iš˜›˜CÆO*;•º 0êÜàÜ ù™»Oh¾¡ûˆæ+IŸQeŽÌùÃwà<ç9r@È]à 3 ÔSO½.\öË>Ùòey@Ų˜y™—Ä_; ˜gÌ3aßýÉÇ´àÄv>pÔ9ê@~‘pfù},-–Ò«FÔ ÒI§îü¼KM@d‘ÄY)ïÈ[ò0‘<)NÅÆbc(ò[õ7õ7à\ÒùÙcÚcÿêüïYùØÞ.ÛûØãyƒýUE,6å¸QŒIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-169.png 644 233 144 2715 13755454065 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü‚IDATHÇÍ–íOSgÆï"šV–ÅÔaØËÌü`41 \¶TŠo›d¢‹dC#Äi2æ¢X|‹ó% d 8tÐ:R–%$:ú‰Á¹:T˜U&ΰ:gÛsÎóÛ‡öôÔùø|9¹ß®ëzÞî󈈈+öHš•4+)=j'}bùÓpœvœþGƒªîªn€SGN¡îÜx¸èá"°l3næ›õ&^"¾Ôÿ_R¾OùÞv Rí©vÈy7çÝÜÑ„¹°¬tY)ÀÓþ˜¦’@¿LgºZ bŽÉÛŒÇòÍzÏÄ7ùLþ¨¬â¬bXQ¾¢ÜñM´àÚ1¨u׺M¾Èi`;˜ZP èêÕ§ú°aË6ãf¾Yoâ™ø&ŸÉÕ#OïíÞwPeö2; DúA×ÇÁ˜ù4ò)uNý©þD™’ÕjU®ÊA»¬]Ö.ƒñ»qø_AŒêEõ"J{. —QUÚ[Ú[ñ ÷óïJ}¥¨¿µ•""ù hŽqÇx0ü.¿ èÀ«÷Er"9<æ;üø-BÒI'Ômu[ÝNðŸå,gA¹•[¹s8!þŽ~T?Êc^Šâƒ?ÏŸüëuŒ“M=1a_ýë·­ß<0ÞT_D>|‡S­U­­0t}èúÐu‹ÇßíïöwÃÞ={÷ì݃uƒuƒuVüʦ+›®l‚Æ×_m|F/NŒN$¬ø/Q¾8LOLØ¥ÏØØ±¶cm<ýcmw¨ T@hÍÏk~\ó£µág2ÏdžÉ„ÈÈȘoþ½ù÷`Ií’Ú%µ°p`áÀÂ888€‚‚‚X°eÁ–[ ¯:àNÓØ¼±y„L>ÕÔ¾£}‡)ìÒgéçÒÏ©“4..X3 <ùûÉßpüµãùÇóÁ]ä.rÁùçwžß =‹{÷,†ìììììlXwuÝÕuWaߨ¾±}cP_Y_Y_ EíEíEíîÜɹ÷çÞ‡fOSzSºå×WŒoߦž$‘i˦-ãu©±Ï²Ï‘DDäAÊVûaûa‘òkå¿–ÿ*2sÃÌ 37ˆ„½aoØ+¢×éuzHZJZJZŠÈœÀœÀœ€È¡ÖC­‡ZE\…®BW¡ˆ$ ‘’æ’æ’f‘ïHéH©HòÛÉUÉUbŽ’fïµ÷Š˜z’D Ÿá³ˆ®•j¥"b‘,™'’/­SëÔ:EðâÅ+âò¹|.Ÿˆ³ÍÙæl©ñÔxj<"›36gl¹8|qøâ°H~u~u~µÈÒ›Ko.½)2CÍ0f"¹¾Ü¹âðY¶Kš[s‹ÄõÄÏSS@WtÏ™¡õh=æ€âÑâÑâQð5ø| Ö¬ê]Õ»ªœ§ÇéÕ]«»VwÁ­Ù·fßš žfO³§Ü-îw Ôn¬­¬­P»ÕnB Çø¾íhìh|êŒýïV†c·d\ÑF¬[9µj×Ô.ŸŸŸHèSƒÆ 1“-“-“- ê…z¡= = =‚‰÷'J'JA=!“LèYzðWŒO­ßº~ë3·2¿wwƒÉð›þ›Çõ‚±ÖXËã¨à„QA` aý’PËÕrµ”S9•T½ªS íCåhÛ´m¤êÕz5¾¦>«qŠ.º@õ«~Õ4qƒ ø‚N:Qê‚^ á}¿¾?¡óe)e)æJ=ÕùŸÛåsûºxnßcÏç ö?èü§0?•çIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-86.png 644 233 144 2432 13755454065 14677 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÏIDATHÇÍ–]HTiÇŸ™ÑS¦‘´¬(qÙMp»YìJschË/p"кà ٛ¶›h ”Ä mûD—¤ H©,ˆj­±)ˆEüˆÁÄÍHÝ­FvXsÎûÛ‹™3çì²µ·¾7‡çëÿÿŸ÷¼Ïs^ñ&žÎMÎMNOÜv6Z~·ßí/è‹Û=:8jµc?ÀšskÎd]ʺdLZ¶7óíõ"¾Ïô‹W,GÚõ´ëŽò„Ý {‹÷»sâvgÒÒþÔàÐÍC7ú/÷_¦æžÎ=xWþ®,ÛŒ›ùf½‰gÇ—Öñ‹@êÔ;ŽH[•¶J6ïܼ3ÿ»xÂT>Tí®Ú ðÆõÆ¥œ Ï™dªr`‘E̵`³Íx"߬7ñL|“ÏäëÈ.Ë.š}5ûÒ/Æ &¯ÀߟÉÚi'´Em@¯×ëYTA8À²Í¸™oÖ›x&¾ÉgòÇõÈ?¿m×7Pç®s "¦éCF‹ÑB̈©U€ÒfµWÚ+PŸ©jcrÇP ª^Õƒö‹ö\{ƬÊP(0N'ˆ±¤?ÔÚðM¾$¿Ø}~ÒçÒçS ¬‡u À·`t]D•FE@Ç8f aœqÆAT@'Nœ¶øtÐRK-$FùËÄOð%ùãzÂz†¡©¥©ÅD3Jx§½Ö^Ù”P?€Ñ¾Ñ¾Ñ>8yüäñ“ÇáeÑË¢—E–Ž)ï”wÊ ]½]½]½ð¢éEÓ‹&ÛŽê¬g=*‰oò%ùãzÂF¾‡«®~H–4cu±:–LÏHûHûH;äõäõäõ@ÍdÍdÍ$öööÃðàðàð T+‚AØsvÏÙ=gaÛþmû·í‡Ñ £F7X_cm±6_´øãzœ"žGžG_}-RVQV‘ø¾â¸(a§r*I3=±’XI¬Dd©u©u©U¤¼­¼­¼M$;šÍŽŠ ‰Ìxf<3ß]ß]ß]µ¿Ú_-âËôeú2%¹9®í®í&¾ã¢Å×ãqU¹ªøR$õVê­dÝï2"‰X@ËÑåèrTdyõòêåÕ"N=8õà”šˆîÑ=ºGĽýýCdktktkTäšq͸fˆ<›~6ýlÚÂã *©´ñ%ùãzœ"Æmã¶cBD«Öª“‰ÙüFˆ4ž7ž7ž'’ßßß 2˜;˜;˜+’ҜҜÒ,2qâþÄ}‘œÆœÆœF‘æ'ÍOšŸˆxÆÂM=¦SÏ“áÌù1¿÷^ƒÄ 1hþ«ã•ã•ã•ìá‘,„! anánx¯âUv@±V±V±–d ¿ ¿ ¿^=DúI?éß]–£ÍÑæh-M¹É¹É¹É¤[Ô‰:QGVNpÐo=\¾Ü$`4¢Í£&j¢&ú­Ëár¸,0U™ªLUÇ]Ý®îÚËÎ(g”3jþ?}ò}ò}òQ=?a~Âü’e”eF°ÀÿÀ«{×½û½Ï{íMÚ÷øóú÷òxùO3 Ó0 M")$…¤èòy¯ãu;ÊåŽòÿµ3jgÔJ;n%ÜJ¸Å¹###É*E–"K‘'ÞÄ›xj8á„À+x¯xâA8ǃǃǃ±ª±¾±¾±ž¹Ï‡;Fwö.ï]Þ»üÅÕ:µN­[¤”R¤)%>Ÿ¥²T–z;‰€€€[LöŒíÛ3 õ¨¾O¨*…Êú®Qרk4äéÐe¡ËB—‰Ñ‰Û·'nŽùùù!@Df`f€€´ À4LÃ4#Á€Ù˜Ùi%­¤"ì°Ãa@3 Р½¢°¢°¢PLj¯k¯k¯¾—«ä*¹ê§³âZq­¸vé,ÅR,íæTV•Ued²@YàÿüËyÖyÖy6äéÐÄÐÄÐDqUjrjrj²ð½o o o ¤:©Nªèzºž®‡%”P¤ˆ‘"€\#×È5à< ÍhhÍ¡9ÄKâ%ñ0}ÛômÓ·!Àk?tuèêÐÕâ*¯/—˜jL5¦š• \V—Õe=kÕ k†5ÃL¿¥cKÇ–bõ=æ{Ì÷8ºƒî ; ár¸.Àý¸÷cJ6c36F0‚ìÇ~ìà†n2È ûÝþ(D! Àu\Çu DDDƒ–>UúTéSÌ8$’ɉMn”寧 ca,lßßÜ>n·›››‹߯}¿öýrºŽ®£ë æÎpg¸3ÀÝOï~z÷SàgýÏúŸõ€Ú®¶«í€¡ÆPc¨ˆ‰˜ˆ h65›šM=NÓãÎà Î8‚#8``à÷˜ßc~AÜÜÜgLyLyL9̳̳̳Y°,X¼ïo‚¨õ¢þ/[üNûö;Æ>ûh,)ñ Ñ Ø–Þ–Þ–)?R~¤Pæ+ó•ùÀHòHòH2r"äDÈ é¡¤‡’,V‹Õbz¾èù¢ç @v]v]võÉúd}@ïÑÞ£½GgbŸ‰}&v2òHm¤6RKJ.Ú/Ú/ÚqÀëˆuÄþe 233éc‹Ž-:¶ˆyÅ!‰HdRgE÷ÝWtc¥ K–.œšï­î­î­flײ]Ëv-cìŠóŠóŠsjÝqÛqÛq{J¯×ÕëêuŒ}ÔûQïG½Œ9íN»ÓÎÇËÇἃwHw’;Éœ¬ \pÁ5URsÜsÜsÜÀÒ–¥-K[¦æ©HE*òíòíòí€lµlµlõÔº:D¢úßê«ÿ-à\ƹŒs@ü'ñŸÄ¨f¨f¨f’Y2Kæ)ÿÜKÜKÜKJQŠR&ðA|ÄN -Z8´<*&‰IbR„! (@HÜhÜhÜ(@‹h-¾3~güÎXº,]–.@gÕYuV "0"0"˜ @!„µEmQ†xC¼!ˆŒˆŒˆŒ˜Ù˜ àÖqë¸u`PÞqÍqÍq mÜ*n·Šâ”ï+ßW¾/æµiÛ´mZvêFÙ²e"Œ¢Å(]ƒ®AP¢-Ñ–h‹Æ¢±h€øâ?ˆÿØÜ¿¹s? ìö {§íÌÎì hjj¢ó¢ó¢ó~—‘!:D‡ÂŽpm_Ó¾¦} `ë²uÙºð²MÙ¦ló8$"‰9‡„l![È&YX`Úw©ïRß%¨=ö†j¹Z®–+++€7äoÈß‹_^üòâ—éqéqéqÀ}Þ}Þ}~ äÆðáÀ&M“¦Iô[õ[õ[§Öùùù1.n7Š¡þÊö•í+&6b#6‰HD:,'ÅÅÅ@O]O]OÝÑŸGZFZFZ^ žûð܇ç>,e$É“äIr>oÿàþÁýƒ'¤ƒt@!Û$Û$Û¸pÿàþ3ŒÆ À –,/Xã"ã"ã" /7/7/P¨T@rfrfr& 5IMR·óá ævs»¹:/_¾<Ì©ÕêNuçÜUî*wÕ“={:öt¸‚+¸òPìœìœìÜ·ª‘×G^y=$5ö³ØÏb?cqYYYä¢=ÓžiÏãgò3ù™ d=YOÖ¢Ctˆ@wJwJw ðÏ÷Ï÷Ïš › › 3*fTÚ Ú Ú “uÞØ}c÷ÝX_^P^P^€¯T?©~Rý4¶œñŒgüüõ˜ƒ9˜Óü:™hóx+jQ‹ZÉH6‘MdS\‹bQ,êÂ6©Yj–šéŽdg²3ÙÉ- Û¶=l;Ö23333Ôä9òyÿ-"Dˆ€¦°³°³°Süûˆ}Ä>b dc²1ÙØ?ØJ¶’­üðÛÇö±}B°§Í“Œ}£°oâξ˜ÆóÅ|ñÎJ¦gz¦ç>®è©è©è·öoìߨ¿qpˆÑ 09“39€8Ä!n ²@Ðq:NÇ1îy MõkÕ¯U¿&eôïêßÕ¿K(P…áxîì³Ì>ðáä 9äZÑŠV1ÞÛúàîàŽØ„åXŽå¤2üpøáðÃyÏ*÷(÷(÷ÏT*•€9ÆcŽ‘2¼É^²—ìÅ8¹J®’«ªQêßEv¢[bÏñÅ%Û%Û%‹»òÍ•o®|Ãçùh}´>ÚÎ1W¹«ÜUžùnSNSNSÎägkºÇÊç^P§g®rW¹«ÜâÖ²²2¨9Žã8ƒÞHXF-£–Qêì,é,é,á[”o+ßV¾ÝT=Þ5Þ5Þõö‡-+ZV´¬<€¡Þ›× è国ػAí1ðo¤#éäLø—á_†™÷¬r‹r‹rËñÜþ þ þ aàtöéìÓÙR†§£ŸÞèßèßèÿ«·Ö[ë­$I}S}S} ¡4”†îøVØ(l6ŽþUoÔõF®ÏãïÏ8z/?˜˜˜˜˜ˆµqâT“mÝs»çvÏÅgÒLi¦4ó²¨Ð+ô ýsÿÿ[üoñþ_444³ÿmø¼áó†Ï¥Å#î÷ˆ›O—-‘-‘-ùG0+ce¬ì‹j( €‚oGúÐGôfÀ(ñ^‚?‘?¨]jPƒ)‡U²JVÓÊ™93gþF?¶flÍØ:WV"+‘•pÍ|*ŸÊ§ž¯3˜ fƒùÉ[«­ÕÖJÎÑèôvØc·Êèü#"÷Ô®çs!å iH®’d’L’ÿe`5¬†Õì~E5K5K5‹kæïðwø;]³è{ô=úÞÖ_nn¸¹áæ`z=oc9úgÿäáülïÓZIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-34-grey.png 644 233 144 6236 13755454063 16003 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü SIDATXÃ…—{PWöÇ¿÷vÏ 300€A!Daâ»À1ˆ±Ôø˜l1”FŒº¸¥ù™à *1øØ˜`L@LjQʊƒâÊd-,(ðA”ǨÁ0€<a`˜î¾¿?˜Öý¥*•óÏ­Û}ï9Ÿ>÷Û}N“´´´´´4è0nƒãÏ?äòYUÚé´Ói§Ù¤ŒîŒîŒîE3˜7ófÞßüÁ?|“Ãä09L, 'q'I*†0­hE+€MØ„M,K¯ŠWÅ“T¾‹ïâ»O’2@>ÌKŸ˜>1}âå»™‰™‰™‰Ä* ÁB0Y2Î!ýàâÒÑg€ÑˆF4ýVÊ2¤ 釱á±á±a¿ˆŒòŒòŒòo;ƬcÖ1kõ û+öW쯄ÿ¯{¶{¶{6.†Ç…Ç…Ç‘ÔHE¤"RDøDøDøò\¾/¯—÷ËþžùwÅ“ãË<2ïÊàkÌ“y2O)l$ÉÆàl.˜ æ‚k¾... òñ­ö­ö­wƵƵƵRç¬æYͳšÉ2Uª*U• ;vc7vC;ì°XõX €ÝètbY³¹ÙÜlfÎ+aW®„I;ûÞè{£ïµŸj‚5ÁšàynâFq£¸qa6KbI,éa}ìÝ7ºo€f˜µ¼‰7ñ&óÙ±‘±‘±‘ ¥úúúB´q›q›qÿ­Î¦³élÐc&`ÊBY(x´¡ m<àC€©˜Š©i'í¤ã1ƒôôôă’ã%ÇKŽ jÔ>¨åë”j¥Z©þ©Rˆâ…ø××àu¼Ž×;ŸRuƒºAÝ(&)&)&¸f¯´WÚ+ƒ–êWëWëW Ë’““ù:¯ÎWç‹ b©X*–ÒJi¥´ü31@:HéHé!=©%µ¤À6lÃ6ðâÉŽt¤¨BªpàÀP@€"¡àLœ‰3D á)û7ž7ž7žç¿•ãË<2ea,Œ…ý}•Óà48 @LcLcL#âtº]”’Q2JFxÒZCk€ž²ž²ž2 Ñ§Ñ§Ñh¯k¯k¯¤Òé€%X‚%ºÐ….€Ýc÷Ø=@–ƃ¼yò€¾ð¾ð¾pÈæ©Ë×åëò¡ŒiŠiŠiBœÌ#óQ!DBþ´Ùû±÷cïÇÈš3;fv ÉEzÐ%-¡%´¸óÝïî||^ÿyýçõÀ%z‰^¢@þâüÅù‹b}±¾Xÿ,0˜žé™ ÓÉt2xèõÐë¡——´×·×·×?_wñ.Þ…r¶a¶a¶äÊ<2uô;úýøfÊ¡)‡¦BªzzzìÒaé°t¼ì§ÆPc¨1áêpu¸ØÝ¿»w?°ö«µ_­ý ¸¹î溛뀾Í}›û6d„Œ`à³Ï>J²J²J²~?Ÿ(Ôaʰçœb”%F—ãË<2ÅÇø“0ZL‹iñ³}*ROêÉ=ñ²«Ë®.» ,` Ø´\o¹Þrh*j*j*‚Ÿ? ~ h'h'h'<ßwºætÍé@·Z·Z·ð6{›½ÍÀ˜yÌ8rœ'ÇÁ‰HD¡+BW„®´ÛµÛµÛå7Êo”mmmmmm€r¢r¢r" < < <T¾Wù^å{€Öªµj­@–„- [§ÕiuZÞ—÷å}Ÿs’K乿šrÃMÃMÃM¸OõTOõì_Ü¢Û‹n/º½÷rÏÄž‰=i¡ïG¾ù~DæÌ ˜0#ÎDg¢3Š;Wï\½sðXä±Èc]]] D4D4D4¦S‚)P6+›•ÍÀuñºx]˜‰™˜ xäxäxäúì}ö>;Ð]Û]Û] ð+ù•üJ p[à¶Àm±HÉ"Aq%çJΕìQéT:•N8Ha„Æô“|ŸÆ§‘ÔË·/ß¾|[Ô?I’þ$Å~Å~Å~ØÎŸ->[ ˜›ÌMæ¦ç™:5tjè@_ /Ðí í í nwÜî¸Ý@HlHlH, 9¬9¬9 ÐdšL“O›§ÍÓèJu¥ºR8X/ëe½Ð\|õâ«_•¢‰…Xˆ9D$"¿V’œ™93sfÊOXðóð–á-Ã[Ö†V‡V‡V‹;6 nÜ4ÈmÜ߸¿q?çöœÛsnTŠLE¦"u¢NÔB„!+sVæ¬ÌH©#u^Ä‹xp:Àþíû·ï߬h]Ѻ¢lÞ7ó¾™÷ ȹïÏ}î{É^?¹~rýdªÑÜ×Ü×Ü¿³ÆYî,w–G}Aö=Ú÷hß#õ¨Gý‹ÇÝŠnE÷ê¡’¡’¡’ ¤Ø ±b/°Ø¥Ú¥Ú¥ZrµëZ×µ®k`Öw¬ïXßÑmÔmÔm‚ :ôüm—~–~–~È.²‹ìX!+d…À]î.w—^ÚûÒÞ—öÂÞùcç?â/ù^ù^ù^¨ÏüèŒcãÂÿ‚i˜†i÷¶p1ÚmŒ–k ¤€“´C®DYYYâŽ'NðÇ”ÊeÀ™Ì©YS³¦f}Z3^’ÉY´£íÂB¹uG:Ð!ÜE RBL3Êf”Í(;ºÂmƒÛ· g2¢¢¢ùÁ’´’´’4q‡‘ (((€Œ`€Üà°(Å¢À\Àªë–ë–ëÛPÔPÔPÄu·¹ÛÜm£ÎRg©³t×'wÓï¦ßM˜…Y˜^®8§dP»k,–<$É^·~½õë­_±”±”±”]Ÿ¸{»{»{?,n-o-o-çŽV½UõVÕ[,–$“d’ •T H`ãÒØö„=ˆ@"`¤×ÒkéµàLõœê9Õsàånu·º[i®4Wš»ëz„¡G:GéIz’žä޹ ñ’gH>×/‰êÿwÕ¨Fµ¸ƒD“h»bü—£¦Ô¹Õ¹Õ¹UúÛZi­´V¢óg™udÖÄK-R‹Ô F§Ñip©Bª Õ—¡_†~*NµFY£¬Q\›Û·9nsŽÎivÖI¹R®”ËsìvùÄ233333a“3 ×…griw‡K»ÇH6É&ÙWËh ¡1;MHB’èåÎrg¹SØ:˜7˜7˜ ¥”RŠ'r&.\¹<"Ù;s;s;s¹6·½n{ÝöÞ½èøÅñ‹ã—½Ÿ¶-n[ܶpÊmF”ùžþX^ q9øK»¥3.̸0ãÂÑn›Ý6»m>“9à?à?àÏžK;—v.MÜáj¤½š}š}š}on07˜H‚¦EÓ¢i$½¤—ôû››{äB"C"C"i¿+ÞŸ]ãÈo¹8üŽ ƒÁÁ5mfJ¦dJòWëtëtëtüSœ,N'ßT!ªUÈê/zö,ìYèsaðÞà½Á{ì·NÝ:uë”øÚsÈ9ääRóóóßdy,å]„ *¨¸èG?ú¥ù\‰~ËCðö;ÚÍïäÅôñZnh§çéyzþß!£ËG—.—¦+r¹Š\zKâ’¸¤+µ¡çCχž_d°´[Ú-íä’ä'ùI~ìk—ßr ý÷8(þÀ~£]×çBLG2’‘Ì7’D’H¯…²*VŪ>\¯ž¢ž¢žBïq\×ñËé tP:¸õ×–5-kZÖã€qù“Ë‘?âø?o;Òð% ¶lIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-18.4.png 644 233 144 2773 13755454066 15045 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܰIDATHÇÍ–ïO[ׯ¿¶I.n2S&&U)¡…uY Ò&š” ‚W%­—ÈDTe-Aê”åER©QP4PªJí¨T¢ Ëh$“ƒ­¥ÉZ Í^DUB 4mÔA~pí€}ï=Ÿ½°/×mÿœ7Ö÷×ó<ö9çñ‘ÇSŸÎõÎõNO2vþÁÎg¾”ùÒÏÿ–ŒÛ pø¾`dÈ:Ý•Ýe†ìت[ýéó"6~:Ÿ•—ÇÅNhç´sŽ­©¸üEþ¢ÌŸ%ãw‡ÁÝïîê°ï¾ î@7„o?ÿös€ðÖðV°c«nõ[ó^:¾4ÿ€_V ¬pü´ÕÚjxêŧ^,8l¸U;·ïÜðë—r€qXËZµˆÁZ÷Òb«žê·æ-< ßâ³ø“zr*r*Dà•=¯ìqŸN„þ ‡sçZ|‰~à-Þb-è=`¼j¼Ê2¨a5 €رU·ú­y Ï·ø,þ¤{+M‘¿üc—¾K_tÕ\›ÈOäƒúñ¤ñ$‰TA™asÖœýk}FŸµAmP°×CY’ý`Ö›õ$Ô!cÐó'I|ص´k xâ_ÙÊ;""…ïƒ{Ú=Éà_=ýÕÓ`| @5³Ð,$fñ©eUQ …ZÒ„œá g€J*©äÇk3›Ù ê÷F‹Ñ²‚WMtêã©Üw$’‘Vø~êka¾q_ã>PMæF ¯swgCgêæö›U7«lžwoܽqZµk=“Ç'O·ë* *ê¤:©NÚùéNM¡þíÚ6´ÍÊšynÿ¹ýç€Ù¤áW""_‚¾Ê¾JЛTCíÕšý5ûY¶®Èˆ6¢hpÛ{Û{Û yþ<ž|†Ïð_œ_œ_ ¡šPM¨Æbô=F{uï¢w~ÓþÂó/<Ïrêk4˜½½ô~Œ&õdˆßSí©.))­ü5õw)–bÇé£;GEFß¸æ¹æQTX…Eô‹úEý¢Èòâòâò¢ˆ×éuz"¡¾P_¨O$ŒcAYY®:W«N¤õhëÑÖ£"W~qå™+ψü.Ç·É·I´d—ã´ÊÊDäO§§³¤Ô)o¸F]£<+ÿʈfDEV5Ë—ò¥ÜߪͪÍYW¹Î»Î+’ÐZBIÔ&jµ"qWÜw‰\î¾Ü}¹[„(Q¢"f®™kæÚÂ. \¸4 Ò{½÷zïu‘#¹GÖY/2÷§¹s'VÚî;Ni;´"pêNg3Ä0ûÍ~Ç„8å—òkɱ&âf܈"Z©Vª•ŠŒÇÆcã1‘_¯À'r~ïù½ç÷Šuuuˆ — — —ˆ”J©”ŠÈXÝXÝXÈ­¥[K·–Dæ×Ì?6ÿ˜ÈÌÿfŒC¤ËÓûDï’Óy9ørPĬÐ#zÄ1‘:ü_âÂÙž³=@VrÏSGb¹Â[±©b >|8øÐ>+UyUyUy½&{Möð×ûëýõ0^6^6^EÍEÍEÍ0Ù1Ù1Ùaϵµ·µ¶µBy°ìpÙaûŒñÓ³®³.à`R}+o6¾ |mÝJcÈ‚…÷>\ø/þvüm›@ߢoÑ·À\l.6SL1ÔAuP„{=÷zîõ€é1=¦Çž[Ò—î/ÝG-n KXÒnåGÎF§e¸í#bù¸gݳ‘ ˜ún껜jbf—Ù•æcÔ¬š•©2Ufš=ªBUjBM¨‰4ÿj¢‰&PWÕ5u ¨1˜ˆJáÿy곩ÏÒ|lî{>&‚J9¯ÚíÚí²M¿£ßÚ˜³ŸvÚhõ‰RCÀ)Nq ˜'LÔ¤ ª 0¾âü¯›¯“ Ù5FÕ–ó§øâ?tþG÷¿ò‘}]<²ï±GóûÇúß›ûÇ¥IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-67-grey.png 644 233 144 6243 13755454064 16010 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü XIDATXÃ…—yPÔǶǿݿ߬xG+H1l"´ Þ˜€p݈z“‡7n5Ár š²ÀKÄÈ¡’+É5RH¶³ÜÄí*Cˆ’pž¥å6D”<ˆ–˜af~óë÷3²*•óOWoç|úôéÓÝ$?????Þ˜óTA—óøüV—ÿMþ7ùß°y… >þËB6‡ÍasÞß)ø þ‚ÿ’t{½Æ^ÊqÇqœä"áЉNtHG:ÒY±lƒlƒlÉåñøG71ÓþŠ¿¿¿ú{EÚ"m‘– ABDÖLqˆÍn.o: ‡8ÄÑSb¡X(ŠÍŽ Ç„câ©èÂÚÂÚÂÚS½ŽÇ€c@úغغxÉ?¼Žyó:† K’–$-I"¹1’IŒˆö‰ö‰ö¶ö4ö4ö4ò×¥ ©BªxxQØ l6¼¸ /âE¼Ø7F­ŠVE+ ™'™'™÷ϫ֋֋֋kƒS‚S‚S„ä4mš6MË_÷ððÀ\q•¸J\ˆÙb¶˜  _‘¯ÈW¹En‘[B‚íhG; ˆbxášpM¸Ì~sö›³ßÄ\þàuÁë‚× Éû)¬+¬+¬[íhu´:Z/¶ªÆTcª1šñ0ãaÆCÒê}ÆûŒ÷P1OÌó ¢6j£6âC|ˆÙ‹½Ø `)–b)€m؆m\pÁ€î7ãc1¸Û¸ ‹9ÎgŽƒX¾º|uùjc‘Z¤)1Jc¤1Ò˜µ1”…³p~èUg¼3Þ$ÜL¸™pIn@©Ûs*ú.}—¾ L.š\4¹0 @{w{w{7 6ˆ b B„à§Ã?þé0`Ð4 `è4t:Cž!Ï¢ цh oQߢ¾EPy_÷¾î}Òø°ø°ø0$yx<|¼*„ ¡K3æTΩœS‰âç⟋.žèÜëèQz”,--ò†ò†ò`L7¦ÓŽGƒ£;v4ì( mѶh[ýeýeýe`°k°k° àoó·ùÛ€dD2"†O Ÿ>¼œðrÂË @H5~?Ñ]º:>:> ð«øUü*`±e±e±Xß¿¾}?ÀÏãçñó€RïRïRoÀç ÏAŸƒ€6G›£Í™^ãr ¹… Õ=Õ=Õ=¢õÆØ±cT©ìSö)û ›œµÎZgí󑼟ó~Îû@ ZÐò_e’Ç’Ç’ÇÍŠqý¸~\˜¶bÏŠ=+ö°k×&®M$—Ç^{uìU°î/º¿èþDuHuHuL L Lh¢Q¶` ¶í¦vS» ðqø8|€ß%¿K~—¦j½»ÿîþ»ûñ·“e'ËN–áÅCÅCÅÃÉ•Œcã–ü ° ÚÿÎÓãô8=εB=ôý1bœ'ÆíøDY¯¬WÖ_BsDsDs‹|fÿ3ûŸÙOÎhZ4-šlXTº¨tQ)”¤””’RшF4€Ld"ÀiœÆi ˆ<øi@ËØÜ±¹cs¡ºÐw¡ïBŸ,yKò–ä-ÄB,ÄrPĬÁšö¿³VÂJø.>>>>>ž•#‰HäÑ<šGózrèJº’®´,q½ízÛõöš¬ÞÞÞÞÞ^a¹¦JS¥©¢ÿ£8¬8¬8 ‹¸OÜ'ä‘<’ ÉH`‡v€…°°!6Ć`w¯ó¦ó¦ó&WÖƒ .<¸À—*·+·+·Ÿ)R[Ôµå_§§§’ÿÀ#Œ¢àyz¡½èîMÝÙ¤fá· ¿]ømÉ_å;å;å;쪾ݾ›æó檥UK«–º²ÜóT$„„Ø!6Ø` ƒ 2ýèG?å(G9È®¯¯ÙŠ–+-WZ®p%^~^~^~}“ޓޓޓ9‡ïÜ+¸W0¶f»í|íµºË³â,q–8 ³ïürç—;¿Ž½Ž½Ž½9‡½æxÍñšóàlgmgmg-WR·±ncÝF¶‚d’L’ ™xB ³½¼¼1VŒcsÓ#ô=Ò7éŲ)¶ÆsOи¿$2wÕîN%S±ëÊ"q$ŽÄ­øëÔ—ãÒyç.ç.ç.qÏq‹¸E¤Ë5G4G4G°Aì;Ä(麀.€]Èr…\È>Q¢þDí x~àùç¹.y”m>m>øwSkSkS+ÙªìPv(;1X ƒ÷4ó›ùÍüfÛŸCcBcBcèˆÛÞËžñI.¿#SÙ‚»ÚƤLʤä͈ˆ|åšïšïšC…ÊBe¡ÿýѯ‰¿&þšèó­¹ÝÜnngÞùúÎ×w¾v½0îwŽ;¹½’å’å’åûX«`§/L6®#Áˆø´gÜŽžä!øùØ-DêPç*`5¬†ÕÄß§Õ´šV_ \?¹~r½!ÑItmçÒ¸4.­¡Q]­®VWÿ%ÞxßxßxŸü(>%>%>Å>wë­uZƒâ䉨u§ WÁTbço-ÑíU5«cu¬nªâYųŠgi;×Ëõr½ýÏŠï‹ï‹ïïú¥cSǦŽMÀ BÝú<KÛqü?lå1‰ËÈIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-127.png 644 233 144 2624 13755454065 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIIDATHÇÍ–_LTWÆÏ".l@E#}0”šªk@CLšjb@4&KêŸ@ĂС I«6D}« jý— BŒR­ºŠÆ‘Ô–DX•¢.ÈRÛ\¬Å°°ؽ{÷üú°{¸h_úèy¹™93ß÷e&3÷Bþ ˆ˜1=bbÈŽ(4üÑ+¢W||9dŸÒÁ´Æ´æé·0é䤓“ÏM>l7lu¯âÇæ aàåS~' GÔµ¨k¦ô°½Ö&¯MŽŽÙGÁRc©ù'E7ŠnTŸ¯>Ï×Ð{·÷.@z:¶ºWñ*_áÅûÞãÆßÓôD™£ÌB@âòÄåIÛB]I°2se&@ϸžq2ô¿Xbe:àÅ‹:}cluŽWù Oá+>ÅÒ#`jÚÔ4!`õºÕë,gC ívØ™°3Añi5À~ö oÀ  çéyø@6ÊFL˜À°Õ½ŠWù Oá+>ÅÒ#ÞííÑeÈls¶hÍ wë݌նkÛÑäùF¾A*Éò#/ã!Ðh ´€Œ•12äo²Cv@ ¨/Ô"õ/üÅþb4}’¶L[ò3…Ÿ¥eiÀ_a~£•B1ç8K·¥Û ®8Wð6½QKÔ¢šç<mò•|%_ùä“oø9Ä!ì—ý²Œ˜a†d’Lb(ìµAgsg3€Åkñz#•ž°°Sw`Ëî-»~€àù¶KÛeè¨,ªÜX¹Z]­®V—Á×¾©}Sû&8f?f?f‡§]O»žvAOjOjO*œ˜ubÖ‰YPù{eGe\2_Jº”„|v¡­¼­\¡ÈÎÍ9›sTkOÝ {´ƒmUª6Œê(|ï³ú¬ør[rësë†;ì»ÃÝžnO·¦ÝšvkÚ-Xroɽ%÷`îÕ¹Wç^…ƒ5kÖ@FaFaF!ØÖÛÖÛÖ8?¼8½÷ô^|ŠOmwÙ]JØ£&6Ll×(wßwß7*á·Ž Ž Â•¹Wæ\™ žO‚šëšëšë ¾¡¾¡¾ŠóŠóŠóŒ<«Óê´:¡,¦,¦,ÆðŸÍ?›6².e]̺8¦Å/Ãߣn‡ÛJ€É&O:¡ïeßKàçÐØËª`Y°ÌÈ_”·(oQ\ßz}ëõ­†ß™æLs¦AJIJIJ ¤Õ¦Õ¦ÕÂÈã‘Ç#áíì·³ßΆľľÄ>h²6Y›¬F~ð¢Z3aþ°£bÞù½ó_ÂÅí ^^0R—¦.M] uuuÐSÒSÒSæó€yJSJSJSÀ3Ã3Ã3ÃÈ+w•»Ê]°8sqæâÌ1‚þÔ«ô* Cµ¨7¹7Ù¨X„Þtozë¯"ÒÑèhB !_š>•SäᯈɉɉÉ"69696YˆÃ† ¡ÅiqZœµ¹µ¹µ¹B$d$d$dq{Ïí=·÷Ñö¬íYÛ3!l3m3m3…q> F#„_Ìñ ³£ÉÑ$ĨžÿL¥?4%tœ§1•Ÿ¬XÚCí¡öüþ¼>üúðëÃà6¹Mn¸ç¹ç¹çï€ï€ï ÆÆÆÃPéÐî¡Ý·Õj@ó)þw§rÎq°ôZz½‘Щwê£6nnÝ;>5Kÿó„â¿¢‚ xÏfð)þwöؘÍOvTv„ðæoÕ[qz‘^„Æ :éDRÆŽ€¬’—åe-²E¶6?r†3À'¬b’oô'ú4Ð_è/MágGgG«J½³ù?Øåûºø`ßcæ ö_âºWghs@IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-192.png 644 233 144 2734 13755454065 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü‘IDATHÇÍ–ïOTgÇÏà 3]K¢¦M†Áˆitšbbv^È$4•BMIA‰‰©kÝŒ‹¶µ·¦’$m—j7õ…ii-j°Ñ`‹Ñhj±–}1d Ö¢P†uÄ`eæþx>ûb¸Üéúø¼¹9¿¾ßï½'çÜG@DD–/<²ò³ò³rÓvÖŸl¿ëe×Ë…§Óö ¯9^ûç_á™Ïžù Àó¥çKsж­¸•ŸY/bãgòY~Y.¶#ç\Î9GpÁ> o¼øÆ‹®•iû£0¸/¸/<ÒawçîN€ó_ÿŠ?ÃÄO?ăñ ض·ò­z /_ÿ¿dwew9îBÎÒœ¥"PðRÁKkBé„­-[*~[òÛ•Æ`ËTHÀ:“¶_È·ê-< ßâ³øÓzV”®(­5[kÜ_¤ ¿w¼ïx->íp„#,=¡'ŒZ£–$¨° àÀ¶mÅ­|«Þ³ð->‹?­G~ßÛËPUK«–:€vŒ1c Ì?h!-„¦zÕŒšAY’Í›æèõ‡úCPÛÕ6µmñ ¢žUeª ¥¤^H½€fF´Ampñ…o¢½®½®æ¿ÝJ‘uÇÐÝc†—/¾à#¬hÌqž!†2gÔŒšqˆC¶Ÿýìg?¨l•­²h¦9#Þbn070§þ“Ƈaß°˜s¸GNKÏ‚°7 îýº÷8€Y¬š´wµwm'«N¾zòUè/ï/ï/·yú.÷]î» ÇKŽ—/;ûî컳ώÆcƒ1h]Ýú\ësÙÙÙbqMó‘¨k¨k°Z{âÆ‚°ÈÛ„Îì8³c1ýMýhÒŸô“ÜÞ»ýúöëvûn£Û€Ñ–Ñ–Ñð­õ­õ­…@c 1ÐÅŠ€+·®Üºr ïÞ-¼ ¥®RW© òÿ’¿;7ÜòÞ¸~ã:I‹ÏìlÿºýkKXämÜsTçø{ôçèÏö›¦üó3ó3pvýÙug××ïõ{ýÐíöFáTÍ©šS5°]œ Îg¡¬£¬£¬ŽV­û,=ž§=O›09>9\J½:c~j~j:NèêïêïꇩS;§vBѦ¢ME› boÅÞŠ½àlw¶;Û¡-Ôj AìZìZìø‡ýÃþa†‚¡`æ>yôÞ£÷2ÖÌSââ`éÉ1¿3¿s ˆ¡Wè"⑲Q<â‘Å£µimZ›ˆ³ÖY묉___)))©l­l­lñÕûê}õ"Sæ”9eŠEŠ"E‘ê=Õ{ª÷ˆ\¬¹X}±ZÄqu¸:DdloÈXo¬±ôd‰$‚‰`ß?ÄÙî‹ÈEDØåø£ÊSy’²„åÞν{[D5¨Õ ²ºguÏê‘éÍÓ›§7‹477‹ìªÝU»«VÄsÐsÐsPdrÕäªÉU"]£]£]£"ÞÞQï¨È·Û:6vl””øÒ|æýNÿpZdQÏcS™Z˜’1}@°§rúoÓÍÓÍjL5¦í'ï%ï%ïÁý¼ûy÷ó2ü%É’d Ä.Å.Å.A4k\×!º'ÚmAÍ;³‰ÙÅmXLGÝóuÏ?6•ëŽ{Â=‘pÂ1d,â¿æssÌóû³’•¬U®ÊUÆúPª@õÔSŸ‘¯¡¡¨5j s6þÐÍ¡›î„;ñØËØüTåTåæâæï3ú€ã-ã-4NÐM·½‡8Ì|ªGõ¨`„_ùh¦‰&PgÕ€@©^ÃcxÐÔ9=®Ç#~Õ’ª%Àüc›ÿ‰ýW>±·‹'ö>ödÞ`ÿD'}t¦#UIEND®B`‚routino-3.4.1/web/www/routino/icons/ball-5.png 644 233 144 221 13755454064 14353 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷ÜFIDAT(Ï­’10¡/óçú3:9YÓ6ñV…(JI’P #€Z‘̲ô§Q'¼‘ÆëWØAÀý¼ÜcÍuWxe>ì©?Ú’.wq@0IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-3.4.png 644 233 144 2413 13755454066 14746 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÀIDATHÇÍ–OLTWÆ/¨3C@dˆ]h$4v!1Q% APÄ@bQkšÕ•¦ÖI JcÒ¦H“FIˆ! Ž ØjlpÁ¢‹ñ¼Zÿ v"ŒÄQœwßýu1óx-{îæåœ{î÷}÷ž{λ„Bd$¾’³’³’Óãvò7¶ß³Í³í‹‹qÛ/!©"©âÁ°¨eQ €÷¼÷¼9`ÛÖ¼ï\/„ïä³ü"CØw‡»#©0aŸ„=«÷¬ö|·¹ )])]o ¨½V{ àjÛÕ6¾…Ñ{£÷Æ Ç Á¶­y+ÞZoá9ñÅÉø…€7ÜH·Ëí²‹³‹—Ž -‡]e»ÊžÍ{6O%€üH#M“Lb°Ã¶æñÖz Ï·ø,þ¸‹ åÕåÕ)ø‚v8ºìè2‹/Öœâi`L“r¿ÜϨ»ê.I$m[óV¼µÞ³ð->‹?®GÌÌmãVT•«ÊÄb} Gä˜ÃFQ@ÌøG¦ÊT”Z­rTöxÇ;Þ&˜°ÝêˆjU­(3+V«' Mà«*w•ÛظՑJ!„È9 )£)£“ó‰ê“ºšÊ{å^¢üH]!ÝtÓ ÔRK-ŸŽld#¨¯Uµªvøßš•fe\°t©K˜æOèIóÿ ëÖAü~˜¹j"ö4öÔÞxèïÒátþéüÓù ¿Ô_ê/'TAuNSçlÿðÍá›Ã7áöîÛ;oï´ÃùÜÈ42m¾iþ„ž„°¿ŽÀ¥È¥˜Mª&0Õ?Üÿ°ÿ!d4e4e4AEKEKE d e e Áã‰Ç©“ºÔ¥nÛEF‘QdÀæÖÍ­›[m¿ùSlel%S„,¾8¿¥G@úô;ªFóFóÀüjfFzK{·÷n_‘¯ÈWÁh0ŒÂšž5=kz ´>´>´þÓL6ú}>Äq*;+;+;ŠešLžXž8¿¥G€w¡w¡ùÂÏÃÏe?ß7Çm H}¤>R¥%¥%¥%“Ÿ“Ÿ“¡ ¡ ¡ vÜuíºv]ƒÜâÜâÜb8~ëø­ã·`Ó’MK6-q¤~̼oÞ~MðMóÇõ|rbr÷ÌŸÉ;³îÌ:(ñ•øJ|¶ÅV€æµÍk›×Úþoƒ·Á ©žTOª²Ë³Ë³ËíÚ|88æH½œõÄfÞ1ubæ{ñÇ‹îÝW–W–W™þL¦ö¹ö¹ö¹`00 ÀªU«@ëÑz´›¸ÙßìoöÃm‹¶EsìØm\1®0ÅÙYïØGUI¢J~3:Œûä?üü¡áCŒ½{5ö ÌCæ!ó¨U£j Ün·ƒ™n¦›é6ÿ{ù^¾—ðfû›Â7…Žª¼a\6.;øþ¿*}ì­Ñ#Ó;Ôïr©\JTWýªßqG\Ê¥\ Â*¬ÂŽ“¨£Ž:P}ªOõ_RN90˜˜?!ŸÈ'Ž>&õ)} fécŽÎO•§Êèüä#à;©I˜ ª5‚â"m´¼æ5(MiJò€¡'é¤Eª<,©I͉?k石ÿÊ9ûº˜³ï±¹ù‚ý®äÄáBpIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-172.png 644 233 144 2705 13755454065 14756 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜzIDATHÇÍ–]LT×Ç×0ƒãXF`ûÂW¼j(Q[‰ÄÂ$­”HÓ Ñ6E£áÊU„èËõM{c§½©–æbÉ­GQŒôúTë´Õ„Ì$·L*µ 2QˆŒ:3çœýëÃÌáÐëK]/'ëëÿ_{í³×Þ""’›ù dee-OëY»-ûÒ7–¾ñ—3iý¤¶·loýï°â“Ÿäõåõ!K7ýfüâ| 1Ÿi—\± NŸÓgódô.x{ýÛë—®LëøÁuÉué‰{÷  |1ðƒÈhd`Î3çK7ýf¼™oâ-Æ—®ÿãì¡ì!Û=p.q.’×K^_Õ–øiÔ½Y÷&À”}Ê®²@ŸrÈQ F Sfé¦?oæ›x&¾Égò§ë(¨.¨úwêßqý;útvš|©K@=ä€Óbz³ÞÌ<(¿ò`ÖnúÍx3ßÄ3ñM>“?]üqo?| Õ¸¤q  ¤F@ëaÐUê½Ô{¤xJ*Q •TIÐÚSí)èMz“ÞºC·ëvP‡T›jլީc(íV²8YLÊK…R¡…jH5¤#Ãom¥ˆH™Ív…c˜ÈÈ®P£ûS%©â\cŠ),ÑÐÒÅg$Nœ¸¥ªY5«fwi¦yQÜq£Â¨ ®¥ña¢x¢ˆ»~výs˜õ8ÒåØ(Ž]ŸïúÜ­ItMtMTm$ ÖgìG³ÉþEè}Øî ‹TÝ«ºWuO$÷nîÝÜ»"¾QߨoTdÙþeû—íq^s^s^ْؒؒ±çÛ_´¿(283858%R}¾º°ºP\‡+¤Bä+"k&×Lª6÷®ö]ínMä3ùL g:6ÖAÛÙgw.¬÷}íØ|ù|9óMß7]oºnmøðØðØðë‚uÁ:¨,¨,¨,€š 5j.€c·c·c7´ç·ç·çúþuýëú¡jGÕŽªPt hOÑø¶ðæõ›×™7ùŒÁ/û¿ì7ÿ¹±åß,ÿFùø×ôwÓßYO–'~Mü ç^>Wv® J”<(yC—‡.]æé[Ý·ºo5´\l¹Ør®Ö^­½Z V\ùxùå?ÀÇï§ÞO-»^îwƒY@ž;ÏmŒÃìýÙûÀWéc¯ÎY‰Ûê·Õo«‡Ï€gÀcÙxtâÑ ( —†KÃà?å?å?eùC¶-dƒ Þ Þ ^ð´yÚsï÷܈‚6›"L\ãŽqǸ…§¡ø3:gt®Ï’UY•Õï/ÐJZI+à4k&™d’¹Dú¬™¯çñ<ÏYO\Écä«¢*ª]‘óIËäN¹Sît ÕBµP­ƒ˜&&&peË-w¶ÜJ†K†K†âÜâÜâܰÏçùzÏóñü¼Þ«yH̉ôžŸˆOÄ'C+ù¥–§–§–«ûÏß<óüMçõúFH ÁILbÀ†0è~hž¯çñ<ÏYoáéWó‘å qDG†®ò¹½¹½¹½ÊÚÁéÁéÁi "d,¥³t(ªSuªN@]¥®RWªCu¨ƒšçëy<ÏÇóëÀõ-oèh‚Kp ."ù¨|T>Úú°5ÛšmÍŠCûíf»áSZ•1e `CêSõ)€)ͪY6 ^x þ›d“RR”@i , ,؇š_óÃÇ—Ùšm ¶ÅÁësÎG¦û¦û¦ûWó–FK£¥‘-ò<òüìùã¡<>õ“àê]õ.;ÇÎÁh#1ºÌÉœÀ.° @)hê'Êeîú<†‡1ni´Ô[êÙ"ΣóÉ{å½òÞþ£|âLÙ™²3elw(_q).ÅÚ×Ú×<÷•­W¶@ã©ÆSF­T+5úãõãõpÉqÉ ðù3¼/ ¸´B­P_ìçõõà#æMHKHKHCóØú±õcëõ@üX}ÏbžÅ@ßξ°äÐ’C`O¶'ã6|uø*Ìß3Èur¼7ø ¥B €UKÒ’ÂõÆÖ~1úÀy8=¶ùøæã›‡™:8urê$ÖÛÕæ«Í†Bú÷Ýuï®{è®’]%°Ì½Ìmÿ)ó§LH|;ñmÞë©×Su0"ØÏy8Ÿj©e&»Én²ë=C•ÒGÒGD4—¤¤!m·m·‰ˆF׌®1Þ¬šUÝš}k6Ñ›Î7DDïu¿×MD´ÿàþƒDD]u]uD4ÓöÀö€ˆ¾T«‡ÃõMí¦vS»Þòü~e¥Y-Y-Y-¸÷\x.<t `Ø…]ØÀ§®VWt‘¿È9™9™Æñ±»cwÀ|Ó|fuÌê€mïl{VoX½@ ¶!¶À÷w²îd,#Ø+Ð/ô  ^þ´âÓŠp½ë'®õ_ë×_À? B†1ýI™R¦”y°‰w™uuuºÐ³Í³Í³MOàcÓ§¦ÝÍ6~¼ñcÈOÉOy‘FKÒKÒà­Íom6ª¯ßßïð.£Ž¸Ž8ü¡é´ƒË—'jú %IIRÒ¹qŠ·ÇÛãíDò ù†|£mD¿ð‹mŶbµ†ç×j§¾úðÆðo7ÈÓ›Óû"Ð×þ¸æVÌ­à ¿Ú¹¶~° Ъµj üŸiiš_¬”*¥ÊÛÛƒ~¬—"-õ3S†)Ô1ô9¨uÖ:k¬@?¹9\K½%½%|ßÝÿî¾™˜Éà~=ôë!ø*ë«,@-ëŽëŽ ïï¥'®zW}p‰±Il›ž¯R„!å÷磥[zív ; Ï mB›ÐƵ¢ýÉÝãîq÷„÷S­QkÂû €1ŒyÙivl€°&Ö–ÒHÛðñáã€u¦Ån±+{õlj¤šZ›Žæ 9dK˜5ò(On ¹ÈE$y%¯äÝÿWýi=k9f9¦˜=už>OŸQ»J¥RiÄ(Fpѹ٠¶`Û§M? ·âŽìX¼c±Z£¿@“²Wöº$ïKÞ—¼H´‰6Ñ&\Ñ•qÌY¡ïvéžtOº't-:°èÀ¢D¦rS¹©Ü}D×nž-Ï–gÔ®V«Õ"7ÜpxŒÇxæV—ªKÕ¥ák§eMËš–5¬@ËÍ&³É<ò<è[fFž´Ðuô$D¹}‘¾efP»žË/Õ®Y1+æ0öP{¨= kqܱ±±l‹®Éx1^Œÿpd=é³(¾zõ€Ô¥Ý-¯Ó®Ò£ô(=aå>K~–ü,X1±bbÅ„ºD×b»Ô.µŸÌæR I/ðwô /à ^¦Ý––ŠÙÓæió´ €&8imWmWmWøÚ‘ÏÊg峡IbÿU74Nq¯Œ6ð~H»y™vó7åoÊßÖ®;ÛíÎÆ—Áy¦Ÿ„P*” ¥…#ˈ£ê ô_Úë´»Nj’𤦡U¸´±´±´‘ý9}*}*}Jù—~Ô^É+ykS©•Z©•B׎䉪Cÿ£Ek÷H¤Ÿÿo¡B¨**¢"*Ò–‹óÄyâ<@ ú[ŸÕoõ[ýDR¿Ô/õ ×BÛ£Nîÿffý/;ÙÉ.ÿ9]W&2‘‰ º…n¡ûÁüàøbwÔÉ Få}íQÿ³ˆ£êì‡IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-25.0.png 644 233 144 3031 13755454067 15024 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÎIDATHÇÍ–íO“WÆO ãEŠo0ku¦sc"5KJ€ûP"dYˆ:•Ž7Y–m Ę%Âã@²ƒf20DLP 86L¦.Å(SÆŒò–šEb×JiŸçüö¡}ÖÎýž/O®ûœûºîœóÜ×9„B¬}è7ê7êW±¾<ËË}ã|·* +Ôþö¬úvÕ·k¾_ó½ú0Œµym}d¾aþH=-.V‹p ¶;¶[—ÂõPl.6ǽÄ__‡xG¼Ã€Š¾Š>€žŽž>'7ŸÜxšý4ÂX›×Ökù_$¿¨A_xeà•Ý4ÄÆÄÆ¯ï|}§éÓà‚ ¼—ÿ^>À_QEI=(s€ƒÌÜ¸ÑÆ|ÖæCëµ|Oã×ô4ý`=’­ÉV!`÷ÞÝ{ãÛ‚ ;¡fCÍMÏïhÀwÀ  |¨|ˆäuy:cm^[¯åk|¿¦§éë ¥K!s h¡häzÿÀ¨?ÉŸê”ßíwãç¤rT©Qj@IU¶*[A)QJ” Ÿ<òxqH¹3` Øðþô'ø@~ä‡"w‘XÐôµ£üQ!ÞþâÝñnw´t=¾ñøp€<ïÊwñr’Z@>äƒÉe–YŽÀK,±SI%0²‰Mò}ù>^ÒBü[Cz!}îë íXë/r°RW©ÓØÔwmƒ“×NöìCŽØGì#v`’I&¡çDωžpÊzÊzÊ g†Ï ŸטkÌ5ö¿c¼n¼n¼ZÖ¶è[ôÈ釓M“Ma=¹X™U™¥më/Bµ!Ľjè=Ý{~ûÉyÜy\–nô¾ÖúZ+>ëgÖrk9˜M‰¦D¸=p{à6lvovovC¾/ߗwÞ9x&‹'‹'‹ÃÍ:g³N°¤YÒ,i°}p{ÏöxsÈtÀtßÜêÀt`Z–ÂÅcܬG(¿&4'4Ënðú¼>远t9 j>«N¯N dœË8—qöÙ÷Ù÷ÙÁ8j5ŽBnonon/´{Ú=í@AA ç=röÈÙ#±'cOÆžp<}ÁÒoé‡3æöÌöL€åcËÇ@I\qoÅ=Ù­J‹9s”mÔzK½¥Bì~žçÊs WùBùÚòµB˜×›×›× aì2v»„°5ÙšlMBî/Ü_¸_›Çæ±y„¨ËªËªËâüÕóWÏ_ÿŽçºçºç:! †NCg8¾òâÊû+ï ±4¼d^2 —11Bˆ¿£²£²Ù&Ô †Ã†Ã²gg`ôø#û#;¬0ÆMÅMAý•ú¡ú¡;¹¡ßÑïèw@í³ÚgµÏÂ;)3e¦„æ‰æ‰æ PUQè‹í‹í‹…”²”²”2˜+˜ËŸË‡t»e¯e/\ž¿â½âð´yÚ@ù#¡#¡Cv‹@’ö nÜg»5ŽYª¿)„øÒ£-~‹’K’K’K ±­±­± v¨;Ô*r 9†(ó•ùÊ|05>5>5©‡R¥‚™‚™‚™¨h¨h¨hÃjCŒ!j?¯^S½_ÈMJáÂ[Þ> ýc|쨪­ª…¥@°Kfo9‡œCàŒrnrnB:Óf§|VŸÕg¥J©Rª`öÒì¥ÙK MÒ$M “d’L‚ù®ù®ù.PmªMµ”ý²\×\#®¤:ëOñ§„»×ᨡ® ¶gØÇ@ó•Ïx¤Qñþë”wå]yä.¹KîŠpÐ-r‹Ü¬cë"|¢’rÊAuÉ8 WÉUxåW!þŠÇÓ§â]ñ.w4ÿñ1íhÌáË¢ê¢jAg–ÊA1€ì ,ñsš[ÜBÒÁw|rPþ 8pOY`äïò¾¼< ÖÍÏj¢šˆ_Þ xÀ¡9ÿÑDË/:ÿË{W¾´¯‹—ö=ör¾`ÿaÀ¼Z¤~£IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-83-red.png 644 233 144 4175 13755454064 15614 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü2IDATXíW{LTWÿνw TØQ¢apcp­‚±>ÓÐZgMµ®l nèÚfQšŠn+‘bE¤V#1`l ÎE[Éj²e}·†ÝRPQ˜ bjEyéŽsïÜßþ1sîÜ™Íj6»ß?3ßù^¿ó}¿sN.‘OÆSKÂä09Lfÿô/D¾ÔüRóKÍ %UR%õÇ:šCshà3k•$‘D×`]«äþ<žçãùƒë K‚ññm¦Í´Y°Ûc^•š¥f©Ù>È X+И£G¢G¢Gð×UÝ«ºWuk»æ.°:euÊꔀÎíÜŸÇó|tùÐeíåÑG£F!B„ OðO8á„Ðu¿ûóxžç®7õËçã#K”Ð/ô ýÎÓÖ9Ÿ”/åKùm;¹á@Μ9Úý \ŠÝÓíé6àqÿ”ôSÔ/¯_§åÓ2(—•˾¢Á›¸ñàÆ¨[Y·€ûôÆÓ@iWÚÅ®V«Õº³‹××;„´èÙѳ£g£r0c0c0p÷  ï¹e\Ë8÷‰û *+* ðÝðvöÛÙF€GwÝe´wwôÑw†Þôü>Q3]tàx8>t×ÊÝ+w¯ÜØ™Ú;–5–`€/e¦f¦À¢‚EÆÜçµóšPwxw8¤Ç¥ÇÀ»õïÖý¿úfÈà?p;ÿv> övq<Ÿà?R¯šÒMé¦týŒ…Q]£kD4‰/e^ɼBDtË|ËLDtdÅ‘DDµQµQDD¯Ý~í6ÑÄȉ‘DDÛJ·••|[ò-ÑÉÒ“¥DD‡o¾AD4¯t^)…On™ÜBD_Ñy:¨oj25™šô#ÏïW-{aÍš…5èyÆž±g ÀqµYm††?ðÑÛ½v¯±sÉÑÉÑ`ÚjÚ o|÷Æwàîpw›3¼nxXÛ­íÀ’X·u¯u/€Ÿ6?m´d߉äQ)R&¤L@ÇG‚M° 6ÏÿBåáÍõûê÷(îºâºãÀýIÙ'eF }]}]Æ ìïÚß'‹NÀv‡YØ?Ø?ðWÕï©ß¨w®êLÛ™6ýÜÈ’Y2Kö< q¾8_œ¿½‚Ÿ²„_[>´|¨NuüÞyÉy)p}hKcŽÅ€">ˆ0î½ãûŽï@,K nbÝDˆ»w6Umª2²¯=±=ÀïøÆNü|âg¸]~óìí3Ø æÕ1FŒcj‡)2=2=2Hº ].4öëþê´÷ÓÞW y~oññ5Ç×À YL¸Øì c'ßœôæ$c§d1Þ £l›`ا{ks^Ïy€”¹ÿxïâ{½.`ž˜'æ]_ëÓ#(Xâ÷›’Mɦdg=(.+*)*іꓛг­g4àë™_Ï0zöÄÙ d(øwq_¯½^ ‡ jÎÙygçú{ô±½Î^çë/ TBų 6™Mf“g (¶ëçk=ËfÙ˲F&3™sÅû'¹Õžgσ¬s·Ð;Ë;ËH;§LÁš–¥eÚÑhKµ<-/@¥þÆ»Õw«„p‹ÍbSòõN~*Š…ÅVšld“,¬©”J©Ò§d';Ù‰Äñ¾x¿è¤þ´´l´lTÌŽzݽn#wõ§µÕîº0‚²÷-ï[€¶ÖsÓszdÖß³¦gMW õè‰ôPz(ïˆÝ»)v‘`¬‚•ó£Ëá0Çù׊=bØÃN%nIÜ’¸…È”kÊ5åÊ;tî¦ZS­©Fîz‹½ÅpC† À†0h´:]®N½š5 jhKõ·Ül2›ÌýÏ|º%fÌ™5¢þFçb“Ø$6í]Ì©æ§^(À_Ñ $àÀ¸; ¸[e©²T)fG££ÑÑÀ 7ÜáH‹OŸ*>¸v¤ƒÒAé`§ÿ“$âjH]ÿ:½ü"€¡ÂÖù¹û—ÿÄÝ´i+ÒV¸+/–Ë‹ñ•Ï®é“`Ù,›e/Û\F ©Ëè¿”qw‰X!Vˆιpvyvyv¹¶'i,i,iL¹¦z@Šã©¨ü׎è©Fÿ£„rwG°žv‡m`Ø€2)“2½3„8!Nˆ1bô·K ®W‚‹HlÛÄ6vƸ6drÿ71ëÿÒ)Ò¥Ž`óG9‚&h‚°ÖÂZîMñ­O“C&Ó’÷…£þÜ…t™'×OIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-5-grey.png 644 233 144 6116 13755454063 15716 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—{PTG›ÆŸî9ãÀ 0$A.рܒEQA! ²Ñ”!¨q­€› ¥!àñFHMÊ/Và+"(U^³~‚BÄ@4ëh²_P¢Y †‹ ŠÈ`”K˜fæL÷þÁHå«TúŸSݧû}~§ß§/‡äçççççÃSetêAã„ûÂ}á>oÊ?“&ÿ Ÿ]`(0V¾Â=¸÷øì?EoÑ[ôŽØj©·Ô[êùaœÀ œ yABt¡ ]¶b+¶òÊµŠµŠµ$Ox,<· #d„Œì9®õÒzi½Z: 7n.ÜL†DÑ_ô'ÉSìºÄåN§£hZÍ X+`×­F«Ñj|aqACACACu¿uÈ:djþ§i¡i¡iaÄ©ŠUŪb4F$E$E$‘¼Hy¤IøIî—Ý/»_Æ,ÖÊZY+”ô{ú=ýà1<†ÇäGò#ù¸m¾m¾mjíµöZ;@?¥ŸÒORDŠH`¾e¾e¾lX²aɆ%À",Â"P@ ÅW»Ÿr?å~ ¦„×^Kx I5×|\ó1 ÷“ûÉý®£b (.yÏãW_=~ÅáùñóãçÇ“2éKgQÕQ ,°èF7º1]ôÏéŸÓ?hÊ5åšrà„wÞIÖû®÷]ï ¤žI=“zx‘¼H^$3㦠0_Òsè;x|Ø=¶{l÷;\SSÃÅȶ±mlç|‚Oð 鉛¸‰s–ŲXÖt?~jå©•§Vr^á\á\áÌùÀÝ»w9œ?8pþL?ÞÊ[y+缟÷óþßµKñ§õ$}ƒO@ŠPDBè9zŽž›þ2êP‡:¥(E)€C8„CùŠ|E¾D•¨UÀ@õ@õ@50!ŸOÈþØþØþXÀxÉxÉx ˜›17cn°eÕ–U[VêHu¤:@  mhp·q{FŸn¢›è&å(G9 ¡2o™·Ì›ÿcÂGøÈLÆÄ81NŒã\¼!ÞoÌ´³ÂBfꕃ•ƒ•ƒœ—¯(_Q¾âw)ïå½¼—s¦b*¦šÑ»ûÆÝ7î¾ÁùÞä½É{“ùûÚϵŸk?·(R‘ŠTí !_ÈòI^‹¦EÓ¢±Œ†††CIUTEUgz¦gú™jjjò—ç/Ï_tôuôuôDOôDˆb£Ø<[ólͳ5€‹‹‹Ïïfô8?Τ›t“nXÄâFq#”ßô~ÓûM/‹&½¤—ôâ±;±WÌ’¥ÓéÆëW& & & ‚¶ŽÝ»9v3üãáw‡ß~מNßćøÂB|‰/ñ… >¦>¦>b-±–X €ýØý:Ѐgólž Ð/é—ôKŒÿæú›ëo®P7>i|ÒøD ï”ï”ï@ÆÉ8ßÏŒd$w¾Ïò£ü¨à']óì‘S÷Fá )&Ťøêvš@hBn=2‘‰Lú÷¡AhĬQí¨vT %õ¥¾Ôã<˜ó`€Ïãóø<€'òDžð@È®çz®ÈYr–œ…E²¨ºqWã®Æ]öœ‘F>ùH(Q)‚A_>|ø‹+ÐB -ùoô =b¢ã>ªB?úÑ/v ÙÈ&õ¯\xåÂ+޾éôžÓ{Nï}]8â1â1â!ŒÖÌ®™]3ÛžãÄ3<Ã3XH©#ui"M¤ †4¤cÆâ‡Þzè寶^n½ÜzYvTå¥òRy LZ«¬U֪݇:´Ú-0µ+ÀMÒ9í5IÏsÌ…¹0¸Ý¼3xg°f[³­Ù»©ÿ|¾=ÁF0ÜÚ5íšv Nénênên’J½R¯Ô,€°€×…t!]H7/ Œ Œ Œ¤Ï$½—žæ?rÉð'%>>>>>¢Tmç³ø,>‹lzyèå¡—qÒ>Ç>Ç>矢"P¨|ëïÃ‰Ã‰Ã‰š £££üowNß9}ç´=vÂ6a›°É²åqò8yÜ.¿©élãÔ}Tvoj12Ç™¥&Jü#Á_”?ñnšÐ„&»–×óz^ßCki-­ý>prÍäšÉ5ìey™¼L^F;e™²LYæwׂjƒjƒjWÆ÷öôöôöËìö{WHq$@ÓŸqPüEùƒw¥í®ÅvlÇv¡l&›Éæÿ âM¼‰7íÙâ<×y®ó\Ú)ë—õËúÍeŸ±ÏØgYƒú4}š> ˜D Ïq±4ÿÇÿ̺‰=æÆnIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-2.4.png 644 233 144 2415 13755454066 14747 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÂIDATHÇÍ–]hTGÇo6µ›O5²E¤.I H D‚ú šÅ.Ö$¦Á‚ˆ¥ªûbÀ*гRm &>ä%1B[Å„ø±D±‰–˜úXšÚtÓbŠäƒÚ˜]7f½wîüúpwöÞòžy¹üÏœsþÿ™9sîh iš¦-O~5py]^×R »¾´í;2vþhá&iûÒöý~ –]^v ïJÞsÐÆj^ù;ã5ÍÎïäSvm¹fÜmî¶4_Ÿ…ýÅû‹3>°ðw ófæÍ¸ÛÛW;®òŒ? 0å›òÕ¼òWñ*Ÿ3¿vö~Mƒ%K:Óþ÷ûî÷5 òýùþ5G-‡¿×ÀÞÝ{wŒ¤¤Kˆÿ€r¤ˆC VóI¯ò©üŠOñ[z4ð”zJ5 Ê*Ë*3[¬€Áï¡fuÍjŧßB„È#fÄD•¨"ò‘|@i`c5¯üU¼Ê§ò+>ÅoéÑæžmÝ'Pá®pq½D\ÄA~dÔµèÆ Òì7Ÿ˜O°Ç[Þò˜æ¯l³<&›e3Òôêgô3è 3Éü2É—âל‚>n€ÌñÌñØ{Ì E‡¢©¼»ä„Ø)v2ÃA.rÑ!ä¸rJNÉ)æÍlf3ȃ²RV:ìq³Ü,·d»`H Hñ'õ$…5ý ‡O>­¢ÍùƒÞ¤7Ù |ñDðÓÀýûµ2keÖJ8'Ήs^ß}}÷õ]˜‰ÏÄgâ0Y=Y=Y ¡p( CvFvFvä—å—å—Ùw¿åë–ã-ÇG/ܱ¹5&|sk¬ÕÓšÕš®>WŸ«6ú7ú7úÁÓééôtÂ¥ÂK…— aShShSƒÁ€MÜØÔØÔØÛ"Û"Û"Ž»Æ 4,XcïÜÊ.uK„.t˜ýköÍìäËÞ—Ý/»atltlt ÆÌ1sÌ„øÃøÃøC˜<4yhòˆ°‹°Í?+fŬ€è§Q_Ô縕ÆuãºÝ¸•Ž>–ê+ìó€y Õw$ÈÀÀpàóœç<ÈÙ#{€Ï)£ ø39ÿx.ž;ú˜J %`>æèüFEzEºbÑ{8%JE)È6‘+rÑå/rZN#eXvÈà0ÕTƒŒÊ¨Œ¿ò”§¡gi§I¶8*Ž¢ƒˆˆX‹Ñ{RšùÑþ+íëbѾÇç ö0+±ÑŸaIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-10.3.png 644 233 144 3044 13755454066 15024 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÙIDATHÇÍVýOSg=-e¥¦£ ]Œ‚vqÙ@Ô.KDSâ‘ADÝ/sãC0ËâÇ”£‹1cÓ¸Hâ2§!!Æ7@¶Ñ¸¸) Œ‹s3e‚›Âĉm­¤@CïÇ{öC{¹Ýþß_nÎó<ï9Ͻožs_€´ø¤1˘eLacOq¥¸^<çÒPa¨¸}´²"ÉôséçÔ!ky­>q? ó'êiq¤A˜ÛÍí†â8>Ln^¾yyÊ 1üI/ié°tLËdmWmI~Ýúu+w’ÿ ü3@’¡âP1©c-¯Õkû5¾D~þŸ>@&›ü­á>i~Îü@foÈÞàx?Vp×A–¿Yþ&I>Hz$Œ$I*~’VZE1É0ÃÔV kùx½¶_ãÓø5=M?ÖHûZûZ€Ü´eÓËÙØ†¡6roæÞLMOê y”Gi%å°&IåmåmÎ’¢Wô’$ 4:ÖòZ½¶_ãÓø5=M?Ö~”*|ZB¥R®”çêWŸ—’ƒ×»b§OñºX-V“ò˜<*’b—Ø%vQ_“ôÓ?‡„zOš‘f(ÉK‹¤E¤x1ÆOVú+ý$ŸÆõçŽr^þŒ´Ü³Ü ›øÍÈ⑍r•$¹‘]jŽšÃ™9‰—è ƒäB.ä„F–q—‘Ìf6³õ°˜ÓbšäG<Ê£$)ÖŠµœawœ¿n¸¸Ÿ$-aK8lâ±~â_ìtŸÖ×Ö×’â Iªùñ™Ú3{Îì¡ð>ôŽyÇtÁ;wî -ó[æ·Ì'ïûîûîûô¼êU½ªWǃ£ƒ£ƒ£äñ7ŽçÏ¥žjj«Î?Ö¥Ô¥hG{º\ ·öîuîu¤|$Å»Ûú«ëªë8«È•%W–\YBJë¥õÒzrE`E`E€Ìóäyò<äÒkK¯-½F>{4ö(ánœ¼qòÆI2íDÚ‰´dÅ©Š+>&³|û3ösöÏ/B ¡ñ.Ùaê0‘jG¬#6§nLÝXPÕÕâòg8[V[Þ\Þ sfQæšÌ5€Õoõ[ý@7ºÑ Àä2¹L.`°t°t°°9mN›è u†:C˜[¡Û¡Û¡Û@c_c_cP³½¦±¦˜?lWí*Ì3í>~h8 {Š=¬ÖÖ…F|˜ôSÒOÌ…Ç4mš’ãwüŽà–¡m¶m6 cGFCF HR ­’VI««Û궺õR[S[S[Ù-»å„xéÅÒ‹¥}ùûò÷å-oµT¶TÑÑîh7`üÒ#’Kþ À"c½±ž¹F(j‡ÚaðÁ(m’6x`׈åüD~H+¥•ÒJÀqÄqÄq///Uª@0åŸòOù¬Y;²vôÒK/ÐÜÕÜÕÜT§U§U§=—{.÷\ÄJ‘*Rë®ë®?€H¾š|¯(w•»Ÿ¦ð†ðïϘííéí ¯ß‹÷µ•ÙJl%@$=’I Í…æB3à<ä<ä<8ü¿Ã¸"®ˆ+8kœ5Î ¿-¿-¿ (šW4¯h0åžrO¹;l_°X~<·!·Ñê¿Þùõ_ùp)x)$]ˆ”DJ¼?ëS)Õ7Õ7‘ü[›Jå{å{r²yòüäyŠèQOÔ“0u#êˆ:BûƒýÁ~R4‰&ÑD »° ;ØØØMŠvÑ.ÚI)GÊ‘rȉ‡¾ …òW´%Ú¢O%‡ê³ë³§’s>6a™›Èá©á©9ý”Ô6µ-ÁÇ>àNî$Õ Tƒ ~uLÇHnåVnMˆ÷ˆÑCŠs¢St’¤(圦¿˜¾5|‹$-“–ɰ‰?üÇÇŠ¸óŠª¤ª$Ýùi–Çåq’Ÿ+%¢;?/ñ+~EŠ_ÄMq“¤‡zH>aARø„WxãORðrS¹II|ç;£9\oöÿÎÿìþ+ŸÙÛÅ3{{6o°ÿhm ëˆíVIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-21.2.png 644 233 144 2640 13755454067 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜUIDATHÇÍ–]LTG†g±*»-Dª†°h·^(¢Ö¸`H¼`Ôƒ®U*¦5+ø“ÆöôB«‘ b5‘ú•44›²`º!Æ„44…jD4¦RX ¿Êâ8çì<½8{8¨·½pnNÞoæ{ß73çûf!„Hˆ~Ä8b1vÇšñر?ùYÇ4°l±lyø-|xîÃs‰W¯F›Ø˜7ÖÏÌÂ䟩gÄE‚0s}s}w—ÂöÛWÄ~¤ãò°ú­þW*ÕÕÔ^«½ÆWð¬íYÀ˜{Ì &6æõF¾Á7“_”¾¥/ÌÌXþ¹sæÎ­_´ÞyP_ð·6oÚ¼  Vÿ,ÚO¼t!Bcx6æ£ë|ƒÏà7ô }Ý€¤ì¤l! /?/ßzEOx\ %)%)†žâNqŠxPCj@+Ð ˜Ù"[°`óÆz#ßà3ø =C_÷cåˆBTä€gÔ3 r!€Òª>V( ò§Ò§ô¡DJÃr$.b‹Ø@vÈÙ9é§Iù±ºV]‹2Í×¢óƒ§×Ó „ }ã(o !ÄÒ³` YC¡äHoko+ð¹ ³da®PM5Èò†¼Úˆ6¢~üøggœqÊa9,‡/ñâäÂ|¯óËQ½¨>-ºŸèŽ]ø]6îµìµLïç=)]]]]P¹¸2¡2Ùáìpv8yg\Ê¿”)d<ÈxaƵAmP4qOrÏž…P¹¸ÒQé@v¸Ú¯·_7õäÔÞܽ¹Às݈¬BˆŽb¨«ª«‚‡MÁÓÁÓÒë'_H¾Àdöpv_v¤ÞO½ŸzZjZjZj ¨·¨·¨×¬éÆóçÏ¿k¼ku×ê®ÕàPªCw™ûˆû8$Û’mL¶•vçuçI/Ü,»YÚº¡ýWW)}ž OBµa^Ã<(ùºØUì2ÒóÒóÒó \-WËUh¾Ó|§ù¤,MYš²Íæ@ó»ÆêÒêÒêÒ ähÉÑ’£f<íѲËË.ßWí©Ú0uhꨚí¶í¶ô ÔDk¢5òHÚ9´Ó,ûž‚î Ý`åÙ•gWž·Óít;áÕšWk^­1² ³ ³ ¡6R©˜qu«ºUÝ:ã( z z fðÌÞ‘½Â'”1eŒaÛ6¶ d(A$ˆÈ#©‰ß¿OúàÅÀ‹xð´{¨{l bŸÄ>“i'—\¡c¡c¡c ej™Z¦)èZâZâZ~Ÿßç÷™ñþœþœþè\Õ¹ªsĥǥǥCY¸l¢lBmããÙMø÷Ùügó>ûuûuéê<ãk\Þ¸n< Ôê¤7¦M!˜Ì(Ï(Í(û.û.û.¨i¯i¯i7 ¬«]W»®nuÞê¼Õ õõõÙÙÙ'ÒN¤Hk“µÉÚ®….»Ëö_ârãr™¬ioªjª’^hð6xA­ˆþc”ëUûï? ʯz• Þ 6›!8+˜LE½A/¼x=ðzÀ4ö2éeÒË$P<ŠGñ€¼+ïÊ»0rqäâÈE‡‹ÃÅ0´oh÷ÐnèÐ4dð›>oŸ^?Ñõ`ÿÔþ)`g´*õº2ûãF_™îcNé$Ìÿ6ÞàË…·úoô1ã¨Èá'ÏÏÕJ«l×âµx>uB@á;ÌΪõÌ£Œ‚•Ïåsà3Ê(CÊßTMÕPä=ͦÙL~~ð÷‡i}óoïÊ÷öuñÞ¾ÇÞÏì¹áp<‚`s¶IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-51-grey.png 644 233 144 6133 13755454064 15777 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—kPT×–Çÿ{÷iènGC!Aºx+…0h‚ä&AIî%·D-Ƽ(è•à ¹¤°šÛ­Ž˜1Á`b `¬1FâD[D&(\Á ± D ‚<„DyCcwŸ>{>Ð-§RY_víÓg¯ÿ¯÷^kíuˆF£Ñh4pÁ’M/ 4š{È=ä²ÍYÍYÍYæ©׎kÇÿÌ\™+s=ú^Å«xUøN“Þ¤7éYNáN‘\ zЃ;±;Y}¢}¢}"ÉåF¹QnôÞ)2E¦ÈÔßJó=ò=ò=nvéRt)º2Æûð>¼IXâîØ¸\è2àZ¬ÅZZ&h­ î˜Ì æ…—×h«´UÚª²!ó˜yÌÒOðOÀM;M;M;a â›Šo*¾á· 4 4 4p?ÙÉíävòÁ|"ŸÈ'®ß‚õXõÃsTÞ*o•·RO©§Ôó?oooo¬Ü¨~Oýžú=~SZJZJZ ÷“s†s†sÜù&¾‰o 4Ϫ ‚ çÈ9r d‚L¤™4“f€¥²T– ΚlM¶&.Á.Á.Ápý«“ÔIê$~“¨/òˆ|D[£­ÑÖ$¬1·š[Í­7Zæœæœæ˜oúhúhú(iu9ãrÆå (‹bQ, Nä.¹Kî0Á{ØÃ€VXH @':Ñ °}lÛ‘€jT£`ëØ:¶nùÌNï˜Þ1½B‰ªDU¢b³+fWÌ® »»»ˆ”°ð÷?Zb,1– ¶-¶-¶ ñ6@;[0;ͥϥϥÊe‡è<Øy°ó Ðáßáßáüœøsâω€åS˧–O1ûI©#u@ßTßTßp»àvÁí‚g;mmµ¶Z[á$ê‰ú"ÈGy_Þ—÷ý×t×'®O\Ÿ  $&$&$†c ¶`Ë2(†ò†ò†ò€’õ%ëKÖå å å À…š 5j€òŒòŒò `±~±~±XJ`ÈoÈoȨê¯ê¯êz«{«{«±l4–ÆÒØå©¨/òˆ|œiÒ4išÄéà„à„àäÊ›äMò&­Ç­Ç­Ç¡OrÎaÎaÎÉ É ÉÒ£Ó£Ó£¼‹wñ. Œ#Â@ïÓûô>`ð0x<€3ñgâÏÄ–XK¬%PVV~ŠC8„CÛÆ¶±màäeò2yŒÞ¯{¿îý:rÛ&Û&Û&q”â0ã0  éEzqy¹ýRæoˆâ‡x`4d4d4(ÝUº«tP*)•”J€¾ú~èûáÙûÞG¼x–,;X] ºt 0F£ÑÏ200mhCÛ3}ºn§Û” %$€JT•DÅ.ÍFÎFÎF¢ŸÏä3ùLHh( ¥¡`âJ.‡Ëár··· Ò=Ò=ÒpÔ:jµÀé—N¿tú%`tdtdt¦JS¥©ÏxÈIr’œØYv–}t˜X._¢žd¡m¡m¡ ýTMÕTÍ.q²ÏeŸË>ç û=ú=ú=¸ÓíEíEíE$w ·†[ÃaQ (ï(ßQ¾£ä•òJy% ½%½%½¬ \¸*èvëvëvÕˆjD5òPºÐ5Q5 ,°ÂGÂGÂG€äää6lØ …7ðÿ%ë—õËúùBŠ$$!)ÿ§á4œ†äÞ¬»Yw³Îªž‰š‰š‰‚‚ T f‹¿(þ¢ø  .¿.¿.ÿ™þ˜Û˜Û˜`­°VX+—+.W\®àÿÍ¡94 »È.²ë¹ç?Òé0ñ›øMü&(®®®„µÄ@ Ä€ÿ&Vb%Öoí8ÏzÏzÏú#yãÚqí¸vÕ¿M¦M¦M¦m¸4siæÒŒ5{'vb'$…q-q-q-0U*+••JØ7‡7‡7‡ü^~/¿ˆÎÎ΂îÝ º0æÂ\Ò@H`0 ˜óæÌ<‹P’I2I&ìõQú(}”`憹aŽþ¤V +†;¶Xª,U–ªý_“¿øåÀ/ZЂ–9!—ŽKÇïÈçõóúyýÊ´¸’¸’¸·ñÕ¯n|•Ô?.|\ø¸lØsØsØĵݵݵðóóH2I&ÉB‚è@0Ø0Ø0ØðŸðŸðŸ¾÷|ïùÞƒ±}¡}¡}.s.s.sÆuù#ù#ù£§o1 “0IøŸˆ@>ØÅÑSô=%iE-jQ;!D QBTêIE³¢YÑ\‡;Çï¿sœ­ò ó ó #çC²C²C²‘èþ•ûWî_AA H)°Û±ý¹,¶Š7ÖÊ}+÷­Üà>îã>fçsŠ9œnLݘº1Å«¥ƒÒAé 2KfÉlž€$ áÁ.VÈ Y!çekó¬K}#÷wr‚œ 'ê3i4¦Ñûõ؃=ØC¿¾~íúµë×øÝÓ¡Ó¡Ó¡P,’E²0+è  ƒ:[±[Ìas&1‰I@¨ê„:˜Ä›®ZS­©ÖX³§r¦r¦r¸ö¾ö¾ö¾çuþþþ_Ö!ùÈ'Ї>ôñÄ~ÔCÂß…,d!‹èƒ¯_ ¾Zø¾ìcÙDzÏë¦Â¦Â¦Â¸éŠŒŠŒŠ k¶(H܉;q‡ ‹XÄ"°<®À ¬˜Š©˜ Œ*©’*aßdh24X\ËÕ–«-W%…ÃOÍeæ2sYΑ®ü®ü®|€˜àlÓùN5ÚÆ‹‚£à(8¹ýQû£öG€9ËœeÎÊ9âàêàêàúðbOUOUO•¤°æÃšk>dqb2ß ß ßƒA9ä›a3l <á ÅdždžÇœ¯ ­ ­ …³Ã˜Ã˜Ã D ‘BdÎzŒ£Ç†ŸÚBñ„-×Ä €ˆégû$±·MmG$)\Š]k6YKÖ’µqï/ÝXuW,»-»-»…½[…­ÂVF¯>¶úØêcHº…n¡ Hi L|.ŸËçÂþ¤ßI¿“~Vÿ±¨±¨±(I¯,T* -\·”4ûŠ…b¡˜;a;Ù¿Š'¦Óét:fÅ…íÁr Ùb7Û»'H)"EõW—šˆýz¤! iôë*K•¥ÊÂïž...…‚RJ)ÅŒ¸7o.Þ\ŒÃÅÃÅÃÅ’^Yž,O–×Um1˜Fò¾ì}»÷íÞ· Ú¶N!.×Û ó /(lþi‹Ý+Á•Á•Á•…ïËÒeé²ôóº)Õ”jJÅM—kÊ5åk¶­£wîTv*;•8ÓØÚØÚØJ¶)ºÝŠn@P jA½÷—Ì%sÉ‹¯ûFøFøFÐI›Þ»¶qñE. ~ÃbbbbbbÀۦ̎Ù1;’144„ÿ±¾f}ÍúÚ]~)[ÿôõ¯~ÝðëeåôƒéÓØíßµ×þõy˼eÞ"É’FK£¥ÑÿîÅJY)+ý¡z©á– ,UáñlÅ¿ÈCð;ö±«E jPcÍgz¦gú˜>z™^¦—ÿáûtóÓÍO7 AÒbi±´˜>¤IÒ$i·ü.û]ö»ü‡CŸ¡ÏÐGþWxYxYx™}kó[e4þÅïØ ±k+Ö|d"™Ü=’BRHÊm?VÃjXÍßvȽåÞroú@2$’ x G…£ÂÑݺ·toéÞ,Â׿Ol,ãÿ§¥ÒØN’ÅIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-128.png 644 233 144 2742 13755454065 14760 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü—IDATHÇÍV[L“g~ZJ¡¡±…Ô™ ˆ:<–y±c2¨Ù¢™ñ@¬Bh<ŒILðõŠíÂE–MÇcÙ–‡J€h"© 6â‚èì›Ë̪pLiÿÃ÷ì¢ýÚº%»ö¿ùóžžçù¿7ïû öè¤1Û˜mœ±{âþÔu©ë^oŠØßk¤¡ØP|çcÒVo«'ÉôÓÔã¶ŒËüÄz ŽŸÈ'ý°#îH¹rÁàŒÚÇÈíùÛóSçFì“=¤¥ÕÒú\%+<’¼xæâî#_|$§œSN2n˸̗õ/ÇþÅÉíÉí†dŠ9Å 9ïå¼·ø@$áþbrÓ†MHòaÒÃ$a$IR{BÒJ«p’ 2Hùü`Ëx4_ÖK<‰/ù$DHG‘£ ·”n)µœŽ 6’G²ŽdI>¥•d5«i%Õ $IÍ­¹"Eè!Ih ã¶ŒË|Y/ñ$¾ä“ü=x¹·_¾Ká2»Ì$U’T®‘š_ó“ºU9¨¤"®ŠI1I!%‹×Ä\1—TïªwÕ»¤îÕoè7b'Hý¹È9ê_á5á5TÄ Õ¡:b|³[Õ­*Iå·–×Qµø-þ ‰±ØIþD’|_ëQr”Îð"‡8'cbLŒ‘ÜÅ]Ü÷³“ì$õ'úý É‹laKBüœž­gs†k#øäHæH&ÉYË˃ Iê‰ ûþ*¹÷“½Ÿœ"Iý-ñ©rT9×qªâÔÎS;Éþ‘þ‘þ‘8ÏàîÁ݃»ÉZ[­­ÖFö­ï[ß·>¨¨¨%kÕTÖT’CLJ†N¼!Âãê‰ »}˜šw4—«Ÿ‡V†V2Tæ-ë*ëŠ7¼»±»±»‘ôOû§ýÓdæåÌË™—É‚‚Âr™™™Ÿ¬o¬o¬o$óZòZòZÈÍu›ë6ב‹Þ\”»(—Ü}ÇpÇÀä9Mö&»vû°˜seΕUXVXYXí/ §Å9Þà ¤lü`cåÆJ k:k:k09L“ð ø|@ÉÙ’³%gno··Û ØšmͶfÀ[å­òV0Á°öÒÚKk/æÓæfs30óÅlël+R$ϼóð‡€Ôc’6%mâØgÎ6gø0™ü±¹ÁÜ”–Þ+½,Ø¿`ÿ‚ýÀxÇxÇxà,r9‹€=== o2o2o˜W<¯x^1àîpw¸;€ñgãÏÆŸ]å]å]åI:áƒO&±Èü‡ù@ê1z›Þf¸ MÝ n`8ð6Ò‘+Dh,4ÒV¤­H[<:þèø£ãÀ*Ï*Ï*°­z[õ¶j miÛÒ¶¥€Ïåsù\ÀÂÞ…½ {Ûãö¸ä?“G“G_¿º^y=Ö!8x(|%|zŒ@ÐtöÿSwOw€À "Cd ,+ÓJÒJÒJk¾5ßšÜ|qóÅÍ€bWìŠhOoOoO2F3F3FÔÖÔÖÔV ÷Vî­Ü[€-l ÛÂÀ’¶%ç—œÜgʪʪ$>?4~×»µw+ÓóŸ© G§ÄÙKržn|ºîé:RéSú”>2\.—“'&NLœ I¤@XXXMÎúf}³>R·êVÝJNü2á™ðÚGZVCAjç´s$ÿß©\^GZ[Mä°6¬Å½Oê;ôœIØD!9K/=3œIÌSbJL‘"U„!Á¿\ýLýŒ3b8¶Ç F H>·Ü·ÜÿÏKØüt¥¸RHê±Í߯õ“LÒ*´ *ôp˜Ãüš'y’Í¢I4‘Â+¼Â·ù¿á7¤ÌÚ|m>~«•j¥ ›_u™\&yR/mþWö_ùÊÞ.^ÙûØ«yƒýìHsç딘IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-33.2.png 644 233 144 3026 13755454067 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜËIDATHÇÍ–ÿOTWÆßA ÂÎ(%Lë²&@+dk¬f $ŽÙb"Ó`¡Ht› U׳ûSÓT]b²ÍB %ÆšFRÓèn°˜ú-²†dm£‰­K‡q,:ƒ€ËÔ¡3sçžÏþ0s½³ÝÀóËÍó~yž7÷žûœ# ""¶ÔS ÑáÈÈKâŒ63¾¬vYí¯Ï'ñéXÞ´¼ùý°¢gE€½×Þ«ûMläúô~“?]ψ‹MÌ@V_VŸÅ™ÂÇ¡©¢©bYAÿÕ Ù—²/=ÕàÝ/ßý ÿ³þÏø#LÞš¼0çœs‚‰¼Qoô|éürüú"ðµ®YBVfV¦¼üÆËo”JŒ–ÀÎ;wü¸äÇ%*3Àr–+'&Œ±§a#Ÿª7ú >ƒßÐ3ô“óäoÍß*®·]ogŸM6ø?‡÷Šß+6ôâ—€œ`9ha- hM´åU^,XÀÄFÞ¨7ú >ƒßÐ3ô“ó˜Ÿ2""Òù;hi} ~S—ÄK@•iÕZ5ñÔ¤JÖ¿Ó¿m\ûAûT…ªPöî&™|†”ú•¶YÛL\óÇ ã… {“ü†ž©o|Ê""eÝ·—*}äæÈMàÏÔƒzE½B„qB„@¹•[¹^zéMä*W¹ ´ÒJ«V!R!à÷¸q¨UC„’üj>¥—ÒÇ›œGx$"rú+Å>×>—A§ÿæ_ßîüv'tUv½Úõ**p?à øLÁ{÷:ïuBWUWUWŒ<y4òÈÌë.Ý¥»L( ¬¬†“kO:N:Pw7Þ>wûœ©§bûê÷Õƒ1$Ü=—¿¸üÜÞ1Z4Z¤Ü¶¿ä–ç–m(kx©á%(/(/(/€ &.L@ábábá"4ø| >pŒ:F£ð`ìÁ؃1s ¡ö¡ö¡vphÍ¡³Ãù¾ó}pü¡(§(‡è­ã÷]÷]Ê —;.w€1O†e¿uÁºðÚf‘m–m‘…Phmh­åìÁï=QOT²ÚÊÛ6´mÉoÊoÊo = = =ñ(ò(‘¶Œ¶Œ¶ ‘•c+ÇVމÖ|LdðƒÁƒ'Dr=+>^ñ±dÝ xWyWYΊԅëÂ"lȹ‘sãµÍö\{®>̲™Ù™YsëþçèüÁùƒ°½f{Íö(u–:Kà_ð/ø Ökˆ5@­³ÖY넲ª²ª²*ðÙ|6Ÿÿ[Ö@k *»+»+»ÁyhkóÖfˆ‹ÏÅçx s»æv ÛÄ&ú°$­«¬«TDDÀ©Ÿ~ýé×°½¾Î^g7‰·o)ÞR •ÞJo¥Z‚-Á– ™/ÝSº§tô\é¹Òsb¾˜/æƒ;‡ï¾s¬ë­ë­ë¡#ÒñSÇO¾µÐ¹Ð zsŠ`bòÅÉñ¼syçTŸ¨~cõYû¬nPîßn{=øz¨í±mÜ6-ƒ-ƒ-ƒ0<;<;< ›6 l{·½ÛÞ »3wgîÎßßߨ.¨.¨.€£ëŽ®;º²²²`ãêyó ïïÖzk=Ñ¿Ýødàå†ëîënÐ:“ó¤|ìôWüsÿÒýKÍ¿$öÑ¢sÑ ÓYS?OýŒJœJœJœ2ßPlolol/LMOMOMƒîÑ=ºT‰*Q%ðäâ“‹O.BäHäHäÌìŸygæŽÁ*ô§q÷¸ÿÔƒ±1`wê¯dè}Œ-I_Qg>Ö¤šˆ¨:Õ¨Aï×ûõ~P~åWþ4¿ÊT™*Ô¼šWói›+B„HúnS%ªäY¤~ác>f8ÔpÞ]Kv-ړάþ¡ÍkóÀ™D04ŸvqÔuuM]ÎsžóÀ ÓLƒšUSj x‹:PꪖÐÄÕ7‰œD¨ÏSÎßÕøaã‡ÆÑ”îüÏïYùÜÞ.žÛûØóyƒý/ !òÝÇœIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-183.png 644 233 144 2670 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜmIDATHÇÍ–_LSgÆßVäÐÌ Å? f…„ňF3·Ìô¦S’ÄJŒ¨“­f‚!ÑMîf͈K¶:É2MÆ d¦\,—©˜¸¢n7¦- ²8Ùd‡C²bÛsÎ÷ÛE{zê–ìÚï¦yÿ=Ïs¾÷ûÞ~""RþpzœçÒ”í Øþ¼ª¼ªC)ûŒŽzGýÍ÷!ÿ³üÏÜÝînsÔ¶­¸•Ÿ]/bãgóY~)Û¡}­}íØ’¶AƆ y+Röǃàêsõý­Ãþo÷ p®ç\aêÚÔ5€G[mÛ¶âV¾Uoáeã˱ñ‹Àâ‹‹/:î–«åŠ@ÉÖ’­¥­©„»¥ðFõÕ¿.úu‘r€1,a‰ÚÌ3µfÙVø* Ûõí: Òüv+EDÊ:Ð]“®Éù//.ðº1˜,I–ãcŒÙ„*®â*ç8Çm?Q¢DAU¨ U„è¦;+~Á,2‹ˆ±?…ã+ÇW ×/®_æs,=iag†à£ï˜Õñd[²ÍÖÑéï¬é¬Hu¤:Rmó„gÂ3á†Ûm·ÛnÛuDÚ#í‘v–77ÁØïãÎq§½ãª7Å—áOëI »ñ­½{z÷dÒßÒ?Н‹¯#¾ë§]ßïúÞnø6¤ i0á›ðMø ¸¡¸¡¸j;j;j;`}óúæõÍÐãïñ÷ø¡hMÑš¢5PÛUÛUÛž»ž¨' ñ±/ƾ nñ)hkh«%ìÆ{N‘¥?,ýáe¯¬©h©hI÷W]ê+~äGÑjšjZjZD¸´piáÒ‚½“ÛŠ·o+†‚ттQØñ`ǃ`88‚7à xP8P8P8~Ù¾°}æ^ú3úgÔ>cä„b¡˜}Æþ{+é[2©è#ö­œ;9wbî$N&N&NÚÂôÍúf}3Ì,›Y6³ ŒµÆZc­OìNìNì†imZ¦ŒŸ¸Gñ¹ñ9póoeY¸¦\Só90fŒÜ×ÁÜcî!FŒ§–šU³jTžÊSyYþê€:f§Ùiv‚SÃj8+ž«¿­¿MLý•™c¯Ž¿ Ä\®‰ÿ̱¬É_ók€™™üa# hF‹ÑB’3 2hÏ!ÎpšÓ ®¨+ê pŠOù4ë Þ¥“N”ê7ŠŒ"’tMFSÖä7ü9þk§žšüÏìå3ûºxfßcÏæ öÔ×F Ï$IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-178.png 644 233 144 2652 13755454065 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü_IDATHÇÍ–]hTgÇŸI3&Ã&æÃ´Dk£©Ðe.At–ÖB„0ÕPcüŠmCuJ¡KS/¬SÖ²T ]?©S²YöB¶qš¤Ñ¸hƘPÓ&mü"j§“™sÎûÛ‹™wÎX—½ö¹9<_ÿÿÎ{žg^)N?rå,Ê™›òsÞ±ãù¯ç¿¾ôtÊ?b‚ã Ç×öAÑ—E_”t”tXQÛ×y]ŸÝ/bãgó鸋È;—wÎáKûMðæËo¾œ??å7ÁuÁuá7¾nø óxçqÞƒ©©€¾>°}×õº_ãeãKÓïøEÀÙãìqŒCÞœ¼9"àyÍóÚ ï§ Æ^€êõÕë&Ÿ›|Nå€y( @ù€1´ÝÏòu>]¯û5žÆ×|š?¥GÀ½Ö½VüµþZ×ßR Ñ“ÐXÖX¦ù’€ Œ˜0·˜[˜TA8Àöu^×ë~§ñ5ŸæOé‘'϶åUTÍœš9€ìsœS%ë“õ$ù•T¢*¡`ÌÇ`n67››Át™ùf>¨íªVÕ‚zEmWÛQÆp›ð’T/nÃùÁýÌl46€JóÛG)"RÑŠášpMÄra´x´øUf0éIzˆó/&™Ä6#%>mqâÄmWÊPð)ûØ—UwÂZd-"ΟRø0úüèóÀŒkÜ5ËÕzÒÂŽ| ï~òî'ÀË«>M~”üÈæ9zçèG„·nܺq n_¼}ñöEhÝߺ¿u?´µµÁɲ“e'Ë`$>‰CÔˆQZÖµ¬mY #96r •>–âËð§õ¤… }Èûg¶Ù–)ËøëìŠÙÌÖ]®û¦îûÀû†ú†ú†àjõÕê«ÕPé®tWº¡joÕÞª½à¼â¼â¼†@C ¼«½«½«¡:X¬Â’?.yqÉ‹­¿æ¸æ`Vó)ÏéâÓÅZØÐ‡s{çöªs´ý<øó ýÆ+f~™ùξt¶âlxîxîxî@OWOWOOYÇùŽóçaǦ›vl‚p{¸=Ü ÌæÚšÛšÛšayxyhyÂwC]¡,«wò×É_Aë(),)´†áþO÷þ™{uÆúÂúÂn\å_å_å‡N_§¯ÓgǧMš>‹×,^³x DGGC˜0a èrÑå¢Ëàïðwø;`YhYhYÂ5‡ší5cýpwàîh=9"V·ÕíÓXo¬‡ˆˆ¸¥RJ¤D2–\š\š\*b]·®[×íø)ß)ß)ŸÈÂÀÂÀ€ˆw·w·w·È`ç`ç`§HùÁòƒåEºvvíìÚ)â¼åüÞù½Èw Œ›½‰^­'G$æ‹ù"W$÷RðRPD‹ˆð¶c¥*U¥’Ð…ÑÂhaTĹ˹˹ËŒ#Áˆˆ¿Ô_ê/µã[§¶Nm™ß=¿{~·È¼ ó6ÌÛ RÞ]þUùW"[Ž×}\÷±ÆçíœÃ}û6Šdô<5•‰ô”LÃÆ°=•ZxtM‰¦D“}”×=\÷pÄÇããññ§¿=c±ÇØ÷æÝ+¸WæŸÍÏÍÏQ`ž0Oÿù¿SYÑ ®)×T,nš7Í nXÛ¬mÙŠY=KOX=õÔgí±i5­¦Aå+‡rdÅ+ŒÏŒÏˆ«›™=¶rt%ð›kÌ5öÔËÚüÔäÕäVfóGÌgÌIŽp‰Kö¢ €Fiü‚Ûé§¥þmzLIÚÌZ³V'“ý5¹5¹úM=±ùŸÙÿÊgövñÌÞÇžÍì­= úܯ2rIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-40.0.png 644 233 144 3002 13755454070 15011 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü·IDATHÇÍ–íOTWÇÃÀ”aD‚ÈÆVâ4TlI†`›}aÁum¶¦¶HLKhí)³µ6†&Ú좱RÍ|Ø&´l­€¤PÒgé‹]*³îÐÆÙx˜¡á*qfîÜóÙ3—;Ûýõ$ÀtêtªJ€ØàÂ¥* sÍ'a3Ÿ¨7ûM>“ßÔ3õãóä>žû¸<ýÂÓ/8;â “ÝðæýoÞoêEûZp®é@ìÅØ‹„A «alØÀÂfÞ¬7ûM>“ßÔ3õãóÈÿîmëoÐvFwF—QûôMú&0²£oDßÀÌ(õkU¡*@ÿРöª½j/Öšešée¤ÔVýeýe¢úµhf4Ôkq~Ø©íÔ€PBßÚJ‘¢¿vœÍSë§Öð;õ¼>¨²´,Q@>ùÀjV³:ibŠ)Ö±ŽuIq<ÀjÖ²@íP;X¢8ÎÏÿˆÀ©95ÍÎ?âó†ˆÈéï ñpãaPíF™É{õ³«W®^A}úU쫘¥çïòwù» =­=­= ‰À„•7ŽÇãž:4uhê´ç´§´§ “?½óÓ;ËÕeêç†G5·öôw‚&"ry~tê£Sæ`jw¢#\5ZõeÕ—°eÖ [6@¤?Ò釲Á²Á²A(=Zz´ô(^*¼Tx fWÍ®š]e 4W1W1WÞbo±·J‡J/”^€Â/±ùÄæÖVÔvÕvÕvA¦/Ó—éƒÍš4íš[5·j ¨£¨£¨®÷]ï»Þõ-õ-õ-àÊv9\ØÿÇ}+÷­$œp“Ýpî¡s{Ì3Æò­|¢ñ `À¼•j»Úá_…a'j±j±j±*éÖcÆG‚#ÁPͪY5ƒÊVÙ*æææÀ¨3êŒ:PCꢺÁKÁñà8ʘ®®·n%ÁÆW_Ó%„ë ÃyÍyM³sd*g*Ôß>S{/öKËÿíg5£fÀ0 Ã0¬AÕuDꨣ.ÉÇ^£‘F0‚*Ce¨jKêp‚¿ÞðœAgP³ó£éc¿t~½&µ&Õr~þÛÛdÄšbM–óó)}ôú^©1`ˆ!†€A‚ &•Où€›‰úoŒ,#‹¨ú^¿£ßúMç¯±×ØÈÿ9ÿ=û­¼g_÷ì{ìÞ|Áþ/ôòœ¼dIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-91.png 644 233 144 2300 13755454065 14665 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜuIDATHÇÍ–]h“WÇOÒÕ¤P?ZÔ«íMÔIQ{ÑHEf¡~ (Bé–ŠŒÝØ(‚Sð›Í*«‚…R©Œ)ˆ5R2*øQu)«h/âT±+Tb5k(Ñ:û¾çœß.Þž¼ïVw×sž¯ÿÿŸsÎó¼G€BˆE3¿üaØ¿À±ý߸þàÖàÖª_ûœßNßÎ?¾‡…gž(;_v^=um7ùÞz!\|/Ÿñ‹EÂu..û"3öqسzÏêàÇþñ.”\-¹úΆصØ5€ÞžÞ¾…Ì`f ÉEÀµMÜä›zƒçÅÇÿÃ/'‹“¾?!0/0O¨ØR±¥ò;'áy%4646Œi?È7@)¥:äÉcVÖc›øL¾©7xßð~G€Åu‹ë„€ÑÑ’n§àéÏÅC†Ïº œà¥`çí<€l’M|}WßÀ‡\ÛÄM¾©7xßð~Gø÷Ùž¬‡ÝÁÝA@X),y[ÞPÇÔ1,õV‡tmOدìW ¿Ö-º…YK•ª€ €Öïõ{4¨ÕƒÅ[y]^/üáT¯À/¼‚ª‚’LI&ÿ<“Ï$0À6P'ÕI¦ô+Xã0‡= ¢D‰‚ÖÃz䄜@‚ Ož]¼WíA‡m¾¿£gFع{°ïè¾£…â/ÉÙ£ö(PÎÖ8û>>>µµµðâæ‹›/nÎÞ±®Ö®Ö®VH¯O¯O¯wýº^7ëf´çˆ¾¿£gFØp\œ¼8Y(oQY«ÝjçƒñÕç{"„½ÝÞ.ÌZÌĈl‘Kæ’¹¤U¯«^W½¢±¿±¿±_ˆrÊ)GˆÊñÊñÊq7ßÎØ;#„¸%n‰[®_L‰wâBˆçâ¹ËçòÏèùÔÓÏì#ö÷Žå–æ–æ–B}´>Z…pg¸3Ü ñeñeñe³/]¶.[—…¾¡¾¡¾!Ï™¯ŠTÑgݱOt¥éš_I“v»r:<žÃø®ñ]ã»@çu^çg ›lŸlŸl‡éÔtj:å üÆ#ŸÝ•™cÎ;­N3Å"D@¥7ëÍžö¯ÐºØÏ~ö{XXX|p÷þçûÈäwÐSØr@¨¸Šcq‚ ´þ]ßÓ÷€û 1ÄìÀè"E ê:„…-ïÈ;üOOþ9û­œ³¯‹9û››/ØîŽ'ËAÚ—IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-20.6.png 644 233 144 3066 13755454067 15035 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜëIDATHÇÍ–ýOTWÆ¿ƒŒ0t±Ò DRe£Á05 )†Å—¦ÑB;ÝŠ¡j$BÆ5Ã"±?°IC×Ò’ºÌº)!m6 V¦&4ì’%¾”—]ÍvMäÅYYA ²0C¡Ã²ŽsçžÏþ0s½lÿÏ/7ß—ó#/‰b&âÚãÚ-;¢q=¼ýÒÛ/Å¿‰?¾¶[Ç4(ûªì+€+­WZyõ=êø~Ç÷;ÀŒºÑoÌ7ð–ãKýøEÀÚií´ŒAÜʸ•"ðâ«/¾š~,Òp? _/|à»ß­P1žìØÕ @cø–ÅF=ÚoÌ7ð |ƒÏàèH*H*¢â¢bÛg‘ Ã_ÀÉõ'×|¡àC>ÄZ@ „KÂ%AÝP7°`36êF¿1ßÀ3ð >ƒ?¢Çü•~‘ÆÝàšsÍZêÕ†CÉ¡dÐo„†CÄ¢J•ú¹zE½Ú¸6¦:¡N¨˜ãßL0ñ4RªL«ÓêiwBkBk@‰àƒkÌ5 ~ãWþID$ã·` ØXå÷öz{Cìõ²z™%:é¦TŠJQ)ÀNv²s™'NœÀ6°aY>@«I5  ¨,ñis”/ÊÏ@DOtÅšoª®rK¹Å@Ózoýààà 4mhJlJDÝž¸=qÛ\¼UÞ*oœ³ž³ž³ÂØÐØÐØY×ëõz½ÞŒGß­­€Æ?4ºݨÛCC& åŒGôˆþ3‘¿WƒÇíqÃÝ?O}4õ‘*M[JmNm&XPX°»`7l o o ÃÕÁ«ƒW!{þöüíàÜçÜçÜ›®oº¾é:ÌlžÙ<³Ù4;2;2;yyyPØPøAá]¼õÉÖ'ïü~¢b¢B•‚gÚ3 úÖˆ ÿ㹦çšT;,—‚àYýuÊ×)pò—Õ9Õ9&A~v~v~6d•e•e•Áïï¯YÏ æs‚p¾ÿ|ÿù~3ßÛÛ ër×å®Ë…ªO«>©úN}Yû~íû0—¸˜º˜ 0³8³jbÕç«>Wí1+œ+ëVÖ‘IÍRéR©HÑÂÞG{‰ÿèÜÑç>/’y?ó~æ}‘äºäºä:‘’µ%kKÖŠ„ÝawØ-O‡£ÕÑêh †‚¡`ÈÌk»´]Ú.‘xK¼%Þ"âqÞsÞiÓÛÒÛÒEúÜ}á¾°øEÇÇE”U\â"3F}©ÒY†,g¬g¬gDîþÆ{Ö{V’²ÿ’ÕœÕ,²ÿWûkö׈´»Ú]í.‘-Ö-Ö-V‘‡×^{xMÄ·Í·Í·MdqvqvqV$ýRú¥ôK¦pû¼}Þ>/bï±÷Ø{D*/T^¨¼ â¸ëèptˆ<ø×ƒSNI’ˆôH/èú€eH´µÆëÊìÊ„–UžQϨ*é!˜»1797åŽrG9\>xùàåƒp¬óXç±NˆŸŒŸŒŸ„Óµ§kO×ÂtÑtÑtdx2<˜¬ž¬ž¬†#î#î#nHx’0Ÿ0¿z³æÍ‚ ÿP¥Ðnk·ºÝc|9PQSQ»#§df`ª{ª&™JJEMUN•N•ÂcÛcÛcÐFmà¯ðWø+@ÕªZU *I%©$ðµøZ|- ßÒoé·@]TÕEðòUú*Qá†'ùOò—Ê{樂›nnóͨ]˜>†¯D}&¤ÒTKO3Ç9ÎqÐýº_÷››\5¨Õæ0‡—ùØŠ)= bU,€ÊSy,©È­²Wý×û­÷[Û‚m!˵ÿó1ãhÜͯ]Õ®jP_DœYý-lÛA]Ô´Bœç¾Aq‹^zAýUõ«~ ‹.º€9üøA ©;ê0ÑM·§ÇR7µ´€ßÎÿVì[±@ðÇÎÿìÞ•Ïìëâ™}=›/ØÿùîЮMLIEND®B`‚routino-3.4.1/web/www/routino/icons/waypoint-remove.png 644 233 144 345 12610450011 16424 0‰PNG  IHDR Vu\çsRGB®ÎébKGDùC»IDAT(Ïѱ Â0…áÏ,ÁX‘¨é™€:NÍL;ÀàZèyym­÷×â~Ö ¸ó›Ì¼ÔñJIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-79-grey.png 644 233 144 6207 13755454064 16013 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü {Ÿ‹N,:IýKFJFJFÖDP_êK}¿û3¯á5¼&úÓ™ú™ú™zºÇqÇI†0=èA€Oñ)>¥{%i’4I)`Ÿ°OØ'7Ž“I2I&ÿQYìWìWì×ÒUºµtkéV2Ìò| Y;Ë!´»¹|˜9À8Ä!Ž9%”%B‰Ðî´9mNÛK1%†C‰áÔCç°sØ9Üü/ûrûrûòè¿+(( !:9:9:™hÅZ±V ĨcÔ1jÀóìùîéïïñ7çß=Ÿg~‡uG0ž*©’*…L²l#ÛˆE¢À‹'lz›Þ¦_¬žß<¿y~³+?¹'¹'¹‡á"M‘¦HI‘H $°cvaä°Ã;€ñ1>ð2^ÆË°ÏÌÌ ÅÔfj3µQî—°_Â~ òŸ¾õô­§oe|/”ÊWJ]Û\Û\Û’PÕQÝýL&žNNNhCÚ¼Ùz¶ž­o«v:œ§cñ»Ao½ô—¾#}Gúö”ÕÇêcE`€§!4„†€E/zÑ `æa€)La @(B >ÒGúÀcãkQZ”%úk×®=Ìgö·ö·ö·²W½d^2/ÙƒF>OãÓVmÆ*¬ÂªÇ¿1²NY§¬û‹ýÅþßüÓÞho´7.~7h]к u|Šn«n«n+{Uõ™ê3ÕgXÀwð|  …B!X aC¡#tÀe\Æe€<%OÉS`„T!UHëÚäÚäÚ¨ÆTcª1,ðøÚ´!hŸâ™ßÃãá#%Æc‰qmŒ³ÓÙéìlìTÚ”6¥gwewew‘NŸ >|.€¡Vj¥V(‰’(‰€ öžZyjå©•Ôc6á}á}áý¹gÊ98ç ÔÑîhw´?ßjl5¶)=(9(9(¡tJ?¥ŸÒSºwËÞ-{·PZ7P7P7ð¼||<¥»Žì:²ë¥Ü7ÀÑÍæáñð1ø_ãkÆœeÎ2gçV&ÁU\ÅÕçšb}Y_ÖÆKã¥ñÀä“_L~4miÚÒ´HJHJHJ™ŠLE&`o··ÛÛ…Ú…Ú…Úç~TŒŠQ1ò‡<`$$$/š„Éb²˜,Çp ÇH+Òˆ4" =gµÆZcIŸÉgò™ø/¶‰mb›@Q…*TPŽr”fóÐ"o‘·Ècˆ1ÄDÄDÄDÄ<ŸéõÞ×{_ï~ý9ôçPàÁÎ;ì,5–K ÀY8 gèz^˜FÝ­ÈvÓvÓv÷˜&…I¡çi™´LZÆ—ßó»çwÏž»Sy§òN%€¥XŠ¥p¸Ò]é®t€ð„'<0Îsãp[s[s[Ä;wô?b‘ dIÚ$m’H}”ú(õÀup\®W„+…¯ÂWá 0L“17ÚaÖ™uf`4šñßÒ{Ò{Ò{|9ƒt¤#½ø8[ıE¤ EÝ¢nQ»‚,¯Y^³¼¹H!Rˆ°z<ýê÷«ß¯~€2G™£Ì‚³‚³‚³€Y 8Ó8 TsÕ\5Œü4òÓÈOÀ'W>¹òÉ@ѤhR4Œˆ1" ¸.¸.¸3Aä ¦SƒIˆ#fb&f%.â"®^¬ÿ%ÿKþ—¾Ý=R2R2R²ô£§1OcžÆdõ×FÕFÕF¹òtÐAQ¹›sæNĈ;h6h6h6L"“È$.›Ëæ²"ˆ {=özìuà¤ïIß“¾@ggg?@;híÖµ®k]× ª*W•«Ê!©M®M®MìƒãƒãƒãÌUù”|J>õëfÎÀ8Cþ!R8P8P8à®áÚ+Å#âñH»ljÿÔþ©ý‹uI_%}•ô}síÆµ×n$—Lí¦vS;èÂo~³ð¿¿¿à| ‘ˆP„"K&–L,¼÷à½ïšQͨfÐTiª4U°ßñ¾ã}Ç›ôv½]oÇϲ'²'²'ÓoQQQô&„#áwÿÂ2Ç™ãÌqQ'šÑŒæA­'Ä qێȇäCò¡‹h»Ùv³í&]p.à\À9r&²:²:²i4†ÆÐÈçîôjT£ÏO[8¨õj½Z¨?W®þ@:Ыõºõºõ:” 7n4ÜàƒÄ>b±‹Ùòo·€¤ åî_h9-§ål€»ÌsigëFv9@—r˜UÌ*fU~=²‘læaÚ0m˜æ·OîŸÜ?¹rò%ù’| ë\ýétÁ€nt£ <å)D ÁŒ[BÊÆ£Gºò&+&+&+؃’I€$àLihYhYhÙ÷QŒb“jô¡}|’§Uà!â!ß…\ä"—ÔGÔGÔGÔ—¯—~$ýHúÑ™ÒÉ“+&W°–ó^ç½Î{¹ò<ÒÝt7ݘ`‚ €N8ÿ# Ä#ñ Ìæ s’s‡¹ÃLß¼fºfºf•ÏžþÇÓÎÓÎÓÎÓ;¿í*î*î*¨™š©*·—*¨ÝÝžæ ó„yPݺ=t{pæ:s¹;¿uxÿl¡ÇÐc•777Ò7IÉ!9? ? ?‚ºO/è3úŒ>›KkŽ1ó˜yÌŒ3ÍËš—5/ƒJ1¬V B¬+Äîü–ÙÇìcö=žvKñ ;­®õ\ijp÷/‰ÄsºÝy·|V»®<GâHÜ›ëg9.^à¶sÛ¹íÂ_3„ !C`"÷Eî‹Ü‡4¡[èº!g™p&3|_À@r$äHÈ‘WèðŠáÃ+D½ÒeÒeÒeå+gMþU¡B¨*؃îýܳc¥¥¥¥¥¥°z" ÷‹9 ¹µ›çÖîA·vÿo6å×CtÌ!gà ¿ÝRi©´TBÎ0 Ã0xæ‰D‹£ÅÑâì+W<®õJwKwKww5Ì Î Î îþ¾÷íÞ·{ßÜ€Aîqr ‡oô`O¹ÛÁ·v/DÔEÔEÔ•¯—fK³¥ÙgJ'5“šI k©)ª)ª)rå¹+z•ImR›Ôøß¶Î¶Î¶N’)ï–wË»!H‚þÚÎ~È~È~èx=X¬ Ö2îùÞóÜP/r‰ð;¶zõêÕ«Wƒw?š¨õ¢^ä³á%ÃK†—à×"×"×¢ñ’`I°$øýC£I£I£Iê:Ë]Ë]Ë]ú?·«nWÝ®rÅOqSÜ'Ê'ˆÄ   •´’Vžn€HDý˜À&„—=;àÿ"ÁØïh·FatÓzZOëW÷1ç™óÌùËÁÓ©Ó©Ó©Âq…¸B\ÁÜéD:‘î—Öó!çCίYmî3÷™ûÈÿ / / /Ñn¿7 ý÷8ü½ ]wºp#9Èao­d+ÙúÏj¤FjüÇDzWe¯Ê^eîŠŠŠ¾*|'|'|·}¨{s÷æîÍÀ, ‚Ýþ<…¥ã8þ ÖT%RƒP¢IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-189.png 644 233 144 2702 13755454065 14763 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜwIDATHÇÍ–ÿKÔwÇ_§çÇB3­Fønf 멠´,¼¬Ü‘Ñp“XCÔŸ² IlÙ4§ŒÚlµ%+×`„[F£í‡ÐX&9eè¶[§L»û|y?öÃÝç>×úzÿòáõíù|¾¿½>oYÿ ¤ä¥ä¥dÄì”wmúîôݯõÇì^5ŽšßZ!ó\æ9€¬Ï³>7Ú¶·ò“ëElüd>Ë/ËÅv¸¯¸¯8vÄí“P[R[’¾2f8žAÏà¿:4|Ûð-ÀÕ‹W/ò><þùñÏOw<ݶmÅ­|«ÞÂKÆ—“ÿã´ïÒ¾sün—Û%» vyc ¿{aŸoŸàÏÔ?SU A`ËÔ`¬ñO’mÅãùV½…gá[|L@NYN™¨;Pçù,Vðð+hÎmεø´A v–¾ /oo5¢FpàÛ¶âV¾UoáYøŸÅÓ#ÏïíG;Q~—ßèÚ0fY0_ѵF4õ‹šWó(K²ùÔ ™!Ðgô}ÔkÊ«¼‰Ä ª•j%J­ŠV¡©}»¾=1á;,½i¼i*Îoo¥ˆHQ'ºgÖ3»à„Éå“Ë!ªŒ­@+`‘«<â‘M¨"*¢"@m´Ù~îsŸû ¶¨-j p‘Où4)¾ÓøÒø’E^áÃdád!°ä™öL/8-=qa½·áðñÃǧæëªMkÑZlçýç«ÏWØoÌ7æ³yFƒ£ÁÑ œi<Óx¦&z'z'zíøØê±Õc«¡kkWiW)Lß›ž›ž³W\ýãKðÇõÄ…Ýk¢qààÀÁDz½~:R)&ø%ðcàG{Ão»o»o»aªbªbªòkókókaÿÜþ¹ýsPÜSÜSÜ—K.—\.ujZ§`sßæ¾Í}Px¤ðí·á¯î™Ò™R"Ÿêîoïo·„ÝkÈø)ã'u…î¿ïþ}מi´øÙü³y¸´îRÑ¥"ÈkÉkÉk[õ·êoÕÃDöDöD6¬r®r®rBgygyg9lululuÀ¡©CS‡¦ òXå±Êc6îÆ67á“ÝÝݶß80{jöXzRDR÷¥îc½¼ïÊså‰È÷""ò$­ÕÕçê©{X7Q7!²¦|MùšrÍ­¹5·ˆÐZ@$šM¦Š ŠÌ_˜¿0AÄWï«÷Õ‹,Þ\¼¹xS¤ªºªºªZd¼jÜ7îq–;œ b'’îúÁõƒˆ¥'Eļn^wŒ‹¡ûtŸˆ8DD$GJ%K²…5£fÔqororoyPô èA‘ˆ·Æ[ã­¹–y-óZ¦ˆ§ÕÓêijjjÙп¡C¿ÈÞµ{×î]+²B­0W˜"ÞëÞ³Þ³ øÇ==WÏIèIœ1Âaà›Øž³BÒ‡¬3eeepcéÆÒ%{ *ó+ó+ó!k}Öú¬õà/ñ—øK`24š Áž£{Žî9 ¹M¹M¹MÐÜØüNó;ê´:M„ûq¾/ººž;cÿ»•Ñø-™ÕÇõqûV†;„?€hG´#Úa Ó·éÛômÌf³Á(4 B; G‘0̽1ç›ózF6Ù(0rŒ çS‡[·¾p+‹:ÁóØóxÁ ŒGF· ̃æAY乡B*¤B ÒUºJOòT@À ›a3 ª]P'’âúqý8‹¼—ècù“ù€æ™ñ̼ÐÇ’:?~·ß ˜‰Î?jŒnãˆq^F±û½ôÐjX «aàcÎr6im|Í×(u×(6ŠÑøÕè0+®ÝÁô§ùÓ¬•z®ó¿´ÿÊ—öuñÒ¾Ç^ÎìGï;g®ä¥IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.2.png 644 233 144 2720 13755454067 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü…IDATHÇÍ–ÿOÔuÇß¡0ÀQ(̃²Ì0m†Ó qÞ ÛhóÛlÕ®ÓU蜢b·¦í4Ü Ò†»¥àŒ–n׎5u¬µÃ5)3ä›ãèîóù¼ýð¹Ÿ+ÿ?¿|ö|½_ïçó¹÷ëý~½ß„B¤Fþ,6‹Í’¬cË;f<þ•øWžýZÇõ*Äl‰Ùòk¤Ô¥ÔÌ;3ïŒÖgbcÜÈž/„É­gÄEª0s=s=1ö>E/½ÿ”Žk¼`½d½ô·emem›.6±îwßï·ÛÁÄÆ¸‘oÌ7ø¢ùűÿé qíqí1¿ÃÜ9sçÙÙ‹ÞÓ~[_Ýø*ÀŸ±ÆJ ¨Ã@IÒ b|#QØäó >ƒßÐ3ôu?ž\÷ä:!`sÉæë—ú„¾sP¹°r¡¡¾|ÌÇ$T‚j©ZÊ4H¯ôC ˜Ø7òùŸÁoèúº³”£BQû28Æc „}J_x~x>h=á{á{„#N¥aY~(÷ʽ Ù4›fƒ¨µ ˜ER>£¬RVžåóêüà¸í¸ „ }£”ß !Äs§À´ƒOÈÑÛ¾Û>à AæË|B|Ä Nd”QFÈ"Y$‹¢ =àL(GäˆÞĉ@nñ‰Î/Fô"úxu?‘«ÿQ^Ù³#Æ Ó^ì_ØÛÛÛ î,w²;Ù³¦gMÏù. \¸×××f\ëÖºµn÷gö/è_î§Ý6· Ù“{½ùz³©'gvî(þÒýí%!„è©€Ö†Öøµ+p"pB:m¡ÌúÌz¦íí{ì{À–jKµ¥‚¯Ó×éë4í'í'í'amãÚÆµïíí›bSl Ø]öƒöƒ`{73!3éîcþÍþÍÒ —]—] ÞÐýõçDw¢[z 4š†VkGZGT¾_‘[‘k ,¾±øÆâÐ<Ú<Ú< M–&K“Ål6[;·vní|ÔXk|k|kkŸµ²ó²ó²óÌ•«?]ºþ4L–L–L–ÀÍå7—ß\‰K—&.WÈ5éš„`÷DíD-Ìš¿w?ý~:p7¹9¹Yz„’fì±+9Wrà«?Ú[Û[¥ÓÒ-„L¯,]¹eåHÙ•²+eœÕÎjg5Ó¨{·{·{7   ÀPÝPÝP¬n[ݶº Ž^=zõèU°vY»¬]» 797’/$&2Ýr½«¡«A:¡ÃÙá¥6²Ç¨ÑOìÜ¿s?„¿ÑOɃŸß¾‡@l +… ¼(”ÃTþTþT¾ilêüÔù©ó0áŸðOøtÒI‡ÑšÑšÑU„*B0\>üÖð[0xwPT‘î:ï:áŸ;ºìœÙ9lœJ½fcÂè+‘>¦È,™Eh6ÒB - }Ò'}@1Å~üøjª©ŽÚý**jôq‹ä¢Y¾Bø_ã?}̸j_æ ǧŽOAžÓ;³¼®&©I =ʤ2I—¹lv~SEFiÀ8cŒ“Crx .¤üVQ•°üIMPL~>sqY}ólïÊÇöuñؾÇÏì¿°†U H(¸ýIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-14.9.png 644 233 144 2652 13755454066 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü_IDATHÇÍ–ïOSWLj`Uª §cÂp“Ô€NMÚDE%f„&$q.QÔ¨‰›JÔ„¹˜X·àVEˆø‹(‘hpŠ20W³7LQ”àfMmÆJ»*í½÷|ö¢½e€çMóüú~¿ésžçB!Ƈ~D&E&EšƒvdIØ?jñ¨Åi'ƒv•Ë"–ÝÛ ã; WW­?ÛFÜÈZ/D(ŸáãEØSS‘²÷À*Ë*˨ƒö605˜þU¡ôBé€ó5çkøžß|~ /»/¶7òzo(¾Øó¿0òÒÈK!&:&ZHÎIÎIý&˜ðg*,É[’ðtÄÓ2´WÀXÆÊlÀƒ㸆ØF<”oÔx¾Ágðõ˜0Â|!`iáÒBÓ±`Áƒ°%qK¢Áhö±± zT€V¬3²M¶A„m#näõžoðüA=áVêBñÃ"´|5_¤è±Ô@*Èv-EK! H#Cn–å²ô$=IO"|ܼâÕ %u¯jVÍÔ¿““@ñ!ßïúBüƒ­ìBˆôC`ršœž(.>œòp h¿Ëe}†>ï+V¬ ×È5rÍÿ«·!}Ò'}Àwìc€œ/çãcaÿãn¥[0yLO·‚zBÿXÕ þ)+-+¹@Ï4€_9696!;æuØ:lÃäálr69› %¿%¿%ˆ ™r¦œ¶;Ê;Ê;ÊÁn³gØ3þx¸ÿá~#ªgÊÇëÒ×¥­­º!øB!Ú7Ùg€º@®-R Ö¬cÀ‘˳/Ͼ<{¸°…êBu¡ sÎ=:÷èðøÝcwÝ=)¥)¥)¥`ýÉzÀz>+™=5šžÜ× ¯äZ8wèÜ!1A=‚ï͹æ\Y/N¿8 þ4,Xàôç'Ý'Ýü ¹3¹O4žh<&¬,ª,ª,q\ÇayÓò¦åMÃ…ÙkíµöZ°=±=±= û³\™™ðã½_ýòÀßâoU}mô5Y/ .6.V¿O“Ëár€¬{æTÌ©˜SÍÍÍ Ô(5J X¦Y¦Y¦ÁŽæÍ;šÁ–`K°%üO«§;§;§CVqVqV1ämÍÛš·¢gœ2r üW½«z.Ð|š4kŽ5ë÷ª¹ÙÜ,ëùõ™ë™ d÷ÛÀ™m™­™­ÐÒÐÒÐÒŽ4Gš# ¢Û£Û£Û!¹0¹0¹0¼¦«jªjªjÀÛçíóörK¹¥Ü‚•«W®^¹޼>â;âƒfNôOôÃUwk 5àÝàÝZϘº1u²>tùÛ7sáTí©Z`\ðŽ…t d'eÇgÇÃŽ÷^ܬY4‹f»bWì ä8sœ9Np¥ºR]©Q™Q™Q wRî¤ÜI¼Ey‹òA⧉“'Öõ›ÆlÃ@hTÖrï”rJ¾5î˜1•²íeÛ'ÆTjWµ«à>è>ë>‹ô+þëþëÃ[õ†7¼ú»ú»ú»€ (—ÕeuYƒëV¶ÿºÿŠÿ ôfõÎ뇔oÔYê¬ðTÒWVRVÁ}Zu#$,ý˜zM½ž(èöv{ysQõ:½nÈÛO ©H%,„.ºè¶±mC”€3È/åF¹@©¿Ä'? á¯ïîïî‡Aþ¿ÞÚcB C›W®±b„PˆQ{ÔÀ¡ù5ÿðÍÏv³ˆ'žxÀüVÊNy[Þ#ÉAí±ö˜€¼©öª½Àï!|VD­ˆïnþ÷÷[ùÞ¾.ÞÛ÷Øûù‚ý±zP_Ó?7IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-11.6.png 644 233 144 2704 13755454066 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜyIDATHÇÍVmHTi=w'güû¥1i)B%µè•}(I1nZÖ²ÔŽÄ‚PÛª[?ú}¬QlmRDj¡}ÒDኖIµfZ¶ee¢•ÒNSݯ÷ì™ëL+û¿çÏå<Ïóžs¸ï}Ÿû‚Äž MÓMÓMÑ~lú1˜\¹ræi?>¬‘ÒiÍÃdÌÁ˜ƒ$w<î¸ÞÄFÝè]ùCõŒ@†_¿,='-–€t¬p¬HþÉßðw2™Ÿ—ŸG’¯Â^… I’Ú[’6ÚDI/½4b4õ@¿±Þà3ø =Cßïdü’ø%¹ºhu‘õ˜Aß)r[â¶DCOi&¹›»i#U¯ê%I­X+ægR´‰6’¤D‰ b£nôë >ƒßÐ3ôý~‚[©@ÍrjNÕ©Nº©Û•d%™iÍA%PF‡n×£ô(Rt‰.ÑÅ` ó%_N !\jµZME½¯Ä)q¤þÈÏO:Ÿ;Ÿ“ôô'¶rÒÖë€×ÌKOf<™Aj­$É\^ÒÓõt~š8dzf} ð*a(aß7¾o|_P°øMñ›â7@BeBeB% /“—ÉË&SóÔ<5ˆ”"¥H ˜óhÎã9F½1¹1è8Ò¡uhb_ľD8œpr¶ šÞ¬7K½0)«•Õ2ñ±§Ä(1ZÑŠÖÉÂÊ 2¨ R“Ô$5óoï¼½óö`K²%Ù’[‹­ÅÖ”-?Z~ˆ~ÝÝ <¨¨B<€´œ¦wêR¯ fï ïŠîÛøÜv¥í } Üà—íö>{n7‡›'³Ý²Ý²Ý¦Ìš2kÊ,`Ü7î÷ ¯/¼¾ð:ÕžÕžÕdžÎŸy¿ó~~Þ""òlä+÷|ÜóqÉa·;:ŸX˜Xøósaܤa»aûÍßÁüær*åTèë(Ö×õúØ~‘(¬ž>/ÏJt"ábÂEC~×5Ëš•ø\ÿù2ÛíƒðÖgo}ÐöIÛ'ü¾¿òý€ÉüÉ|ˆb}]¯×ûu¾X~©{B_f1û Ã$ÌI˜#é›Ó7gü&\àÌ‹Ùb¸?ëþ,š˜Ç<•L1…>Æc°¾©×ûu>_×ÓõÃ~m\´QJ_+}Íøq¸áëÀÁ´ƒiº^ 8Æ1æAp*8 •kåÌ€º¬.`ÀQ¬¯ëõz¿Î§óëzº~ØOô(½""õ°Ã±Ã¡!€€=x7Hõ«à+ÁW0 €ÒÞÑökûA[©½¨½Ú.m—¶ (¦ˆ"ž*4L&NR© ÊÃü°ãÑŽGÀ¤®¯eˆÈŠ¿qÊ85¯B»Ã TŽÊÁË?é¡ØÂ¶ÄHjhh1Ø‹oŒ#¯ò*/ðŽq @mTñ²)¿$¢Ñçßa?¨ˆHSŸbOéžR.´vðÞ Ë Ô;ëõ”ÓäÜäÜl+i+i+ã–ã–ãh¹Úrµå*<ì{Ø÷°ïÿvŒÁƒ@CnÃʆ•¨áß~ðíQ=5²gÅžúÑ6õŅü²Ã æ7Ìoˆü·äÎÒ;K 9y­yÎ<§øígì'ì'ÄP¸®ð¥Â—D®»vîÚ9‘jU­ª•H—µËÚe±ì»AÄÓééôtÊOc(k(k(K¤tºtºtZäüëçß<ÿ¦Š‹k‹kÅÿÙ·Ä·ÄcXnzÛô¶‰a?Z3×3×£.Âtçt'ØB½ ½ P³é=ã{F¸ôú¥²Ke[“[“[ͦfS³ ’ýøôc`”QF£;ÕPßPßP¹÷rïåÞ‹Îg¯íXÛ¿ybøÄ0€ÿ+ÿWÔžéy¦G]HIJI Ý&Ñ=ឈ^ûG‡={={ÁtÝtÝtÖ¥®K]— Mw›î6Ý…}µûj÷ÕBksksk3¤¯J_•¾ Zí­öV{Ô€³ÒY鬄ìòìòìr022‚9ëg/Ÿ½ZRN>u˜qмš4IJNJÝŽ =çï÷÷n‹oþ‡ó?ùë¿ívYd Z¿±~#b˱åØrD8ÊQŽŠtŸí>Û}V$Í—æKó‰”U•U•U‰,Z<´xHÄ=ètŠl[À&2Ö?Ö?Ö/’©2U¦ÙZ·µvk­È•âHqˆül$ãýŒ÷e‘ˆï]ß»"ò@5ªFÃmQ ""× Ÿ¾üéËðÝ;¾_ªø…iÍèšQfX”,(²Ž²Ž²¸uòÖÉ['aƒeƒeƒ’›’›’› r¦r¦r†— /^«kV׬®ÞÞ^0˜ ÌöBÚÒ´¥ppïþ¹ûç2¹»ÜŒìôïÃ~D¿tWÅWÅGo‰ÿO?æÿ˜c .ŸË‡ÒÎhg´3Ñ# \\\w¢;Ñ*Ce¨ P©*U¥ÂxÅxÅxE8nÕeðé·ùmàÊvå¹òPÊ\\Õc²jwÕn ö#|þDŽ}ÎõñO9öªz¯Ú¬¶«íê u…º@Õ©:U“W™*Se YȘœHˆT‘ªVÕ¡±Ð^µ,¿×ñƒã£Ë蚊玞czòÏèÉ»sÖÎYÀp2«® 'èZ´ÚºþÈŽ€êQݪh§v`’ &@ÝRj ò÷Å_´m„€ºt]Àôäß¿3<™üOï¿ò©}]<µï±§óû?œuªÌHZfIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-93-red.png 644 233 144 4166 13755454064 15615 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü+IDATXíWmL”W>ïLjvqGIVP†ÝXD]%£²Ä•Øt4Õ4º¦`ÅÒ’Fµ©…n*B±U¤UJƒHÒÙ´¿²Ëªè «Ø([Q :[mùup˜÷ûì™ûÎ;³YÍf÷ü™9÷œ{ÎsÏyν3D~™F!"®ˆpD8"“ÀB䤖I-“Z²’eUVeõZ-¢E´ð›YÉ$“Ìu TgUÜŸïçñxüÐ|âŠP2Ü3Ü3Ü{e w0•›v›v³ø¾Á>gŸ£8.õïjïj1Ð ShGYÆ–Îà °Ù‹€c8À%XO@ýD™¡ÌÐTWß`d$FMå¦M²xŽGÃ'ÉErQG7ÔæÖn¬ÝÈÞ p+vo·F‡ÇóCöÙÐp á´ÛÚmÀêX°fÖ¬?ÀMçM'4¬iXÀs¶ðl!(J' ØÕjµZsv׿ֿֿ²w´Ê†à#6µ0jaÔBT g g gi•SÇÏl×þ.àŸ{04Ôë›vnÚ©h«°UèíÓÜÓÜ:ÝõÚÈk#€ß/ÊpÖP×PÀñp|èÞ5Ÿ®ùtͧÁ“©½XŠ¥¼‡¼‡ úDô ((ÐÇ>ßp¾AèÆƒ Ë’e€7 ß(Ôû=òõˆÎ §¨§P{C»9ŽO ŒÔõë¦É¡ZÃZOB˜z)T7Mös·ïh»Ö2k™Ž»FŨƒ€|}}ƒ\ìF7ºÇ”î)ÝSºÙZ“‘b¤ùúŸÃ¨x( _={Aª ãîÚ箣ÍÑä®Ò¦´)mÁQŒ-[0¦&h\l–š¥æ)œjê…ü5=G‚<@»Ò€Ž»ûLûLûcŸ­ÏÖgàho“õ´õ´õtðÚ‘ëä:¹®;ð—dÊßÃòÖé…ç ¾áõwOþ'N_¾:È]GŠ#Å‘‚¯üv¦uBÈr„œ—v…¦GÂò ô_Êó¸»Bª”*¥ÊþÅpNyNyN9ÛŸ8‘8‘8¡ÜÐZ= HÖXj¢&j¢Àµ#õ…å‹ ÿQ¹»;TO¿#ä ùB>@+i%­ôÍg‰³ÄY€@ ô·Kqî8wœ›Hê:¤á\`ㆰÎýßĨ}ˤLÊ”¿ 5¿—+2‘‰ Z…V¡õŸ¿õ¯Ïq„u¦7,îs[ý/ŸPy“Ç$ç7IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.6.png 644 233 144 2767 13755454067 15053 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܬIDATHÇÍ–mL”WÇïPÚa`PÑÚ‚á¥X•6.ø…”€ö%¡ i;mƒšø2JiäC±¦%¥I+Š›‚²”"6b«;YgjÓFM6¾U#m:P©V™©/ƒŒÌtdfžyî¯fž>³5»Ÿ½_žüÏ=çÿ?9÷9ç^B!æÅ¾',N˜Å ›u{Ò‹I/>ùEwGÀðŠáç‡0÷³¹Ÿ¤õ¥õ©?éXÛ×üãã…Ðùãõ4»˜'tƒÑf´Êcøcxcå+“Fñ§§Ád7ÙSÀú•õ+€£Ÿýœwà×󿞘.Ÿ.kûš¿¯ñÅó‹ÿ¤/<úͣ߮ñ1ãcB@ÖóYÏçn‹:\É…Ê—*_˜|dò™‘;€³,|øÐ–'kû1-^ãÓø5=M?š€ÇË/^®z¹Ê´?ðS?lÏÜž©é…íÀ.vaŧø"ë#ë ‚<-O`À:Öö5-^ãÓø5=M?š~”SBÑúXîZî‚\>§ †MaH³’£ä–,`RQ• „ȺHU¤ "s"s"s@®‘åZâ–”V¥Qi$¬üN §z9Ê–k–k€OÓ׎ò„BäÿL>“Ï—(§ÆÎÞ ä³òYü½ì9-§åtœä}îsÿÿàùÌg>È_¤Kºä:¹Ž{cüOÅôbú\ˆæ«X÷y|‹a‹AcSŸÍ†¶ƒmmHççç˜\5¹jrtäuäuäAïÕÞ«½Wáññ† >ð@Řxg¢v¢Z{[{Z{k/Œ\ÑõHÞR½¥ø%šPÿ*„—ÀÑãèç¿Ý{Ü{äÆÅŒîŒn‚¥ß•ž*=ËŽ,;²ì´Ø[ì-vXk]k]k…ŠêŠêŠj½·{Oöžì=©'tËsËsË%ù%ù%ùPÙRÙTÙ«ª C…!‚?üãFíZ¹77A-Œæ#"ß§ìKÙ'm‚à˜ûmú·é°½¾¡¨¡H())ö”ö”öݾ¿fÍþ°8,‹ãÁJõ—ö—ö—¢âEŋСno][]|ð¯÷ß}ÿ]¸;ÏŸáϸí¿íy#õ`êAi(i¦4“:"ß»óæ7õ¶]ù…Ë/@áÎÂ…;¡ìXÙ±²c0;4;4;þ¥þ¥þ¥åÉòdyàlÁÙ‚³&Ö'ûdŸ„ìÕÙ«³WC—µËÚe…ÜætætÂ×GNð¼íyi •†JãºrtkîÖ\màvŸ‰ }Ž6Wþ˜c¹2—ÿkÕQG]&‡ß¢†P}2Q&ÈYB@Fo• ylhlÀtÏtÏ—ÈþkŽi7@ës|bi°4€ìNf91GÌ ¿T¼Š—0¸Ä%$O‘CPÏ6¶Å%2Îc ǤS:›HT£j$,Ï(3Ê Ðå‡×_K‚žüï]ùо.Ú÷ØÃù‚ý¡:ZT0Q¥jIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-23-red.png 644 233 144 4250 13755454063 15577 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü]IDATXíW{LTWÿνwíRGIVD†5׺B0FñÁÊkж³6£k*VÐ-©‘Ž©·•€® i ZBpm$¢®Õâ*ÚdÃZhãƒ&ŠÌ(Ø‘×ÀÃÜ;ç·0çÎ#»šÍî÷ÏÜïœïñ»ßù}ß¹C4)3(D¤ÕF‡Ñat°ú"¦4NiœÒ¸f¹¢)š¢µŸ¤Å´˜“Ûü)¤"t TçG„½ðñDüÐ|ÒêP<Áøò)Ÿò%{è~ÔkJ£Ò¨4ÚûÙ¶‡íј"‡"‡"‡ð× ÷7ÜßpØÜ½¹{s7°)eSʦ”€.ö…½ðñD|‘ïÅxHú}¨>ïSiX–†]‹E…brbrbr´ªnVݬºÉ_q÷¹ûÜ}dÈ1ŠŒ`€ .¸]÷ï {á/â‰ø¡ùæ}úb|d~Uê‘z¤×% ¥%¥%¥E]ÑåíòvyÑ¿ðžÀ j…Z¡VhK´%Ú@³jVͤû÷…½ðñD|pH~ó«:4fgvf'RŠ•b¥¸îá`9b9l9¬Zu`ò2^·Z7Q9Q p—÷‘÷€ ­\+d €¡2áûÞ÷=À]ÞŸ¼?j§ÀSðy [˜YŽXŠ,EªUäx>2<6<6<~s©00™‹ÌE<ÎùÜùØùƒþ8ní¨÷gïÏ€tú«\ã×QˆžÎÓõ¨à†¨' Ug©³tÕí|îŠpE`Ð\d>h>È㟒§ä)y­Åb£"»b{Åvþž?À¨j÷^ô^ Âãé¸Úqª›ª›àÜ…s`¬b¬ÿFî>»û N®?¹€çÒ®K»@mSÛÕ®•j¥ºñhEvEvE6O¯l>⽑ñ‘ñ‘ñ8Ò¿¦Mÿ@ú "V¼ó•]Wv€Ô&µ@dYdÐ:+"WDVb%4´7´“sfŒÎ ÒÝ6züIQû×ôÝé»<Ÿú—õÇÖ[,ðfZ—wŸw€^±´ºxu1¤lLÙ»ÓÔi têú©ë`}ÇúlËÙ–lÿõÀ×Aö½òäZWàQGà“ü-õš!ÓiÈÔ{ÌH¹R©TJD¿K³2fÙ¾³}<)´kÚµ}H"":8rp„ˆhß—û¾$"j:Ðt€ˆ¨ænÍ]"¢¥– ¢©Ñ—£/Q-]£@£¡ÁÐ`hÐ[^ÌWžµ¼|yùòr<gãlœ8ƒ38Ž?ñ»ünpó¨Éj2”¶”¶€q®q.¤ÎHc7Çng0y0,m–6` ,€ÇRf)Ð>Ö8ÖðÄÉŽ^)3Sf¦ÌÄC$«d•¬Þgþ…#5ù5ù5ùA˜*»ßê~ €gqûâv0~cüŽ­:¶ |Õ¾jðÖzkà+÷WnpV9«‚YØÓßÓ8zítõ‰ê|;~¥õJ«~îb‰,‘%zŸ‘¼L^&/Û_"º,v®Ùgöióœì<Ûy60>xúö‚í`þØü1þèð£ÃÁ•_5¾ †w ¤ˆ$(¸Up+˜}mqmqþ 8}ö—³¿À3êߎ߿-d>ý£ä(9êóAŠÈŒÈŒÈ$R®+וëõ=úÀßôúÑ×j€»Î]øl¦XS,­—B%æ3C¢ò£ò£«Z8Ø ó›ó›y:p7¨3«´* ¨Y;€»îBÝøâÉOàÁôÓƒ*è¹t; jöÔì´ìo—~»4PßSÃö“ö““õ%¤©D*_âY4‹þ]U@¹Mï¯mÌÎ앬žE³h€ˆÍcó|ï;š›\M.8tîøÞõ½ëoÀƒPá<žÇîáÀÓy.Ï P©§¾»´»ˆj¶š­jž^ÉOä¹ÀfÑ¡YÉJVÅÀšJ©”ª|Bv²“Hî•oÉ·>hÒ¯ÖÊ9FVMÎ}ããÁÜõfz3@‹Ò¢p^Ä‹Ò9|i¾4€oñÞóÞ ¼ÎÖl]°uV ß@#Êså¹ãÐìݳwÏÞM$Y$‹da§ýè²Ì_ù·Èå‡òCv>noÜÞ¸½D†CŽ!ÇqHçnª%Õ’ªˆ„>›Ïæ³ÁpÀ…Õh ´±SžTžTžÄÓõ»Üd0L=㓺yjèI³ËaGO,L½ª›§ ‰†Dçéwm…¶BÿgÕ¤šTSï©ï©ïi€‹“ß2ŽiÓ:¦uð :'#¤)âí?‡Qñ³0|Fzñ‚\ÄÝml[ÆVÏêY½˜s¾÷ÍŽfGs€»j³Ú¬6ZilöØì±ÙÀ¢¡EC‹†´ßê\l䆲•‚j~ê…œN/‘€àn¯ÜÄÝãæãæãªÉYï¬wÖðÀ†RÛyÛyÛùÀØQ*•J¥²Ãÿ—dÚßÃòú×é•— áð¶Ÿ»çþwÓÖ¥­K[à®c¥c¥c%j'÷¹~,‹e±¬Œý¡i¤°¼ŒþKywWË%r‰\âZ"geeñ   êmý¨{å^¹×CuTGuä;²3,Ÿ‘þG çî¡P=­“íd;ÙN€ÖÒZZë[(Í‘æHsFŒ]½;;;J$·Ê­r+»âwÜvrÿ71éO™”I™Ê¡Ûû²%.q‰ì2»Ì.?ùÍäú|GØÉt…Å}éQÿ $*zªñ ™IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-41-grey.png 644 233 144 5733 13755454064 16003 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü IDATXÃ…—P[UÇ¿÷¾GB’ÔÒ8Œ-J‹XÝþVQ~Öa»¶;(ÔWj»Û]qëÀBéJ»]qpÅbqg- ´@+4+ˆ¶¡´if3”!‡jJ"?’¼¼»LÇóÏ›{ß½ç|æžï9ï>RXXXXX ;ø qü?ƱöššÂ¶¶ø‡âŠH‰b,žø£ ´‚vË+®W‹«…•¡Õ¨&ˆD$" aC^Á+x…•ÉwËwËw“þ{þ{þû[ÕÄFlÄöÆ™¢¢¢Î’¬’¬’,b„0!Œ¤.rˆÝ>. ]ŒE,bi­X,‹Åb·{Þ=ïž_³µX_¬/Ö×ZÜV·Õmí¸áxÌñ˜ã±-¯«*Tª ´nIÞ’¼%™lóÛæ·ÍØ´5hk ¥÷Òzi¿äoÉ¿/ž_â‘øxß >ÉÔLÍÔb&É&Ù$;¬‚ 㸰®æ?ÿtþÓõAÁÁÁÞ#ÉCÉCÉCÔmŒ6FÉNy¼@^ÞÄ›xJ8à€ÀKx /xà8\¡®PW(v FƒÑÀ<_F~ùe¤xä;îîØûŽ2L¦ û­¿7Û›íÍNª`9,‡åŒeÐ'É[ o-¼µÀ ¡÷ñ-| ßb8çvºnçúß…?þtøÓBlÚÁ´ƒiùZÍŒfF3ƒp¬Æj¬†À"X‹a cÀ*¬Â*s˜Ã€ Ø€ !#d¦0…)ðvµ]mWÃÜô~ÓûMï ™æ+æ+æ+üu™B¦)ÆÛ„ÝÂna÷Séx OᩉYªèUô*z¿µ~kýÖþý²£ÍÑæh[ÿ»ð´ð´ð4agNVNVN]£Ô(5J¬oˆ7Äâ ‚ÇVlÅV€¨ˆŠ¨b!bÈ8'ã¹F®‘kËfÙ,¼7ÛáÍ4Qš(MVKþ¥xR|‰Gâ£Âœ0'Ì¥nu7»›ÝÍY¿ N N Ncº´º´º´:^ÒÈ {ˆ=Ä‚šÆÐ u¨È^²—ìð-¾Å·X6 ,°,‰%±$€‰‘®ž«çêFajÉ¿OŠ/ñH|”E²Hù·ç<ñžxO<ЗЗЇdÍÇš5C&v‹Ýb7Ôä*¹J®ÌÈŒÌH©6w›»ÍÝÀTÕTÕTÕ2'Ke©, ]¤‹t#¶Ûˆ ¸\v¹ìrÙòI{{½½Þ^¨¥xR|‰G⣂NÐ ºÇ_ œ œ œBÙ#ñÄ?O¤2:NÇé8À6²l#@¢I4‰ÆÆÆ€ŠÓ§+N#u#u#uË îw»°x-^‹ÐêGõ£Àpëpëpëò:š@hÂÒP&Å—x$>Þ5íšvMãßQ©Q©Q©(Pô(z=p°<–Çò $§Éir Nâ$NÀþýû@SYSYS°X|ßÀ7ð +2e‰²D555€§ÔSê)´ÇµÇµÇWH¤¥(X&Ëd™àµŠZE-ëžX÷ĺ'PÐ7Ý7Ý7ÇqÇI$=OÏÓóKÛå¾À$&1¹ì÷lÜÙ¸³q€fffh4á9á9á¹åuë‹Ö­/ŽU«>V lº´éÒ¦K€#Îçˆ[ÊÀÀô¡}Ëñé>ºîð!>ć$’rZNËiYÃÌö™í3Û1*ä ¹B.8Ò@H˜ÔnZ÷´îiÝÜ7pßÀ}@fnfnf.à±z¬+À?Î?Î?¾ŸkãÚ¸¶å1©$•¤`5¬†Õ¬½‹»¸»Ô¾˜´}¾o¾o¾£4œ†ÓpÖ@ýOúŸô?)”†Œ†Œ†°†þÙþÙþY€œ$'ÉI8gͳæY3ÐM»i7fÒgÒgÒ‹C‡.¬‚U° ÀpÉpÉp ¸Ù|³ùf3Àuq]\×   ` r"'òåiñeñeñepšw™w™w¦;¦;¦;ø‡ÿ¨ÿ¨ÿ¨PÎ# iH+ªæùD>ñïíTuª:UÞp]¿®_×Ï™U)ªU fRBSBSB¡^Ð,h4€«ÆUãªY.µ\-WËõœzN=‡Ÿͧù4 ¹$—䮘ÿ‚~A¿€K8$AùùØçcŸ‰±D èuOâIüGvºö«µ_­ýêí£²Y‚,áÓ‰éêéêéjÎÜx¥ñJão?ÉOò“P'y’…OâQ< DÉ¢dQ2àþÊû+ï¯\Q<±$–Ä®è‡ÖZÐÝÒÝÒÝÂ̬rV9«„²oãÛx!ÜoÜoÜo 3d†ÌI ‰!1·sQŽr”ó¡¾äx·-Þù¿‘ RA*¾:°¨½#-ÈArè¿ôÐCa¿½Ì^f/ƒ’Ü$7ÉM̈™b¦˜ HàKfƒ ¶åö&v‰]b\¾·êÖÂÖÂÖBož-ß–oËçß“ëä:¹®¾dCÙ†² eït¡E("ç0‚ŒI’ŠT‹ßfa‡q‡IKÔŨ‹QËÿàÿªÿ«þ¯Ö—Ø‚lA¶ ÞÞÐÐàÍ“’8GâàÂ9œÃ9N8áˆ@LË´L Fƒh ‚¼ÇÔcê1±Äoš¿iþ¦™+W…¨BT! îZw­»6ÿí¢¢"€™˜‰™ µo Ôá{žW‰«ÄUèÿ®ÿ»þï÷a÷a÷áü·Uª@UàØù%í>ßþ|ûó,Q*ñññ0( €`?±ŸØOÀbõÂ9iš4MšPß±¹csÇf¨¬*«Ê ˆÛÅíâöü·¥7±à“â{¾ZK•>DÊ”ï—Dêp¾qåè@:¼y‹šKüÃâ/G×gžýžýžýâŸöŠ{Ž"‹>}*úv‹ƒâ 8%ÝH7Òp BPyeDeDe„wƒ5Æcá†ý7ûoöß\þ[Æ1ŽqG®‹Ub•XÅ¿çË쟥Œ•”””””`f©ø&–4äÓnžO»ïù´Ûü3ízô½GØo?c?c?%¥”RŠŸ¤“ètv:;¢c¢j¢j¢Šö?êÔÿè@«ëŽëŽëÎÑw†Ÿ~føø®…B¸oŸR\ê"÷6æ{(}®ú´ûÙÏ´«µimZÞÞXØXØXèÍóÝèŒAÆ c>6ôz ½$S9¨Tb¸.†ÿ©›Ïà3ø çºmºmºmtÚï÷RÛº—‹Ã/X|||||<ßÐÈdLÆdä5ë&ë&ë&üÇû ÷Aïƒ7„ÅjÝó¯“~Lú1)è¢ý¶ý¶ý6ûgÿÙþ³ýg½OÎyær¿ê~#–:K¥†-àxt|òVy«¼õF=7´–µnlÝÈ6L(³¿ÙÁ×_Ò_G=WíWíÀ±CÀ¾cß!õ¿Ùÿ&+8VÀwþäù“ L*“€âPëÕzÝy¢µ¬µ¬µŒmÖ+†˜'fqÌâ˜Åh|’÷$ïIž^9 üÌŽ¹óó£¾i尿F€çÏž? R‘T3Kf–ü½ÅÉÅÉ€? Ê“¼Ç®Ç.€ãáø8Ð}kö¯Ù¿fèdêÒÀãoñ·@ì™Ø3Pé©ôc_º{é®ð]ù® ï¬{g¤õ¦õý¯ä_É7ø{zã{ãu ðÇÃñ‰Á‘J6åšrM¹úŒEQ%ÕQýR³i6"¢‘9#sˆˆ’z’zŒ7EÂW _õ¾Ë}—‰ˆ çÎ'"êï'":Qx¢ˆ¨MiSˆˆ–^v˜ˆ¦Ïï›ßGD_†]?Q¦NS§©Sy~¿²Ò•Í+›W6ãþsaÒ;épZݧîÃ&Þúj_µÏX¹ÂöÂvHÉO1Vöx{<\Xa½q=5&5LÕ¦j¾Õ—V_pkªeª`©8`¼¤³3fgÌÆ}ŽD«h­þŸ‚ Ç«Žo9¾Å@éšSsÀ³ož}À×TÒTÙ—³/ÀGå•@TOT|^ðy$žI<»>vY8”;”:€zªí½¶÷Bù.¸8rqDÿ ¤ ©Bªÿ'’Ò¤4)mOŸ²„_Y˜…©‰ƒëïݺw+t}°ìÕ×V_€ŠŠŠ töÃí‡Û º ºÜ³Ü³àõۯ߀ÍÉ›“ìûÞù½@!¯tÇÍŽ›ðMÍ‹÷$?O~®é€+ÅJ±ŸPtntnt.‘|E¾"_±ë~qVMVºƒÇ×lg“Î&Ág0Á„$$[Û”Ô”dœ‡ÓQ§£@Ú#íàê„:#í³·¿xû 0@iQZ€ò¿WTWTk:ÀJ©Rª¼½! ÏàSÏ%¾Å”jJ5¥ºñ ¶šïï|Ÿeë›ýƒõ+p,ñX"o_{_» vX;lP}?Žü8'—Ÿ\¨eæ\˜ªï×cŽfGs ¾D€Ø 6ˆ Ïó„¹Â\aîoÛ#JÿÐçk£°QØøV›`ì‚sEÛâìq|ëøN»;´t-ð ÏøXK<Â#Œ½ÁÞt `ÙlÓûï°}èÐÐ! aº%Ù’¬lÕ+ù‰´MÚfËÑ¡YÉJVÙšI™”)BrƒHòH¥‡;ÿ¬?­m–,(æÁݹ«8‡¡‚ œtN­_ëØÿ˜ >S˜Jn–¼VòšºCÆeìqÖÆm‹Û·HÌsÄáT]‡ù‹àïé¾t_º/œ[°kÁ®»ˆLå¦rS¹³VçnfNfN¦‘»šM³Á'œpxЧx­.Tª C£×¼¢yEó –­¿åf“Ùd~Ð-ÓÃ;-tG´ž„õZ¸n™àîà©wm5¶wÍŠY1‡iµ‡ÚÃ]pÁ8g¸f¸f¸ØZ“Ñb´ýî#¨Ø/Š^¼ 5GpwíϹëìqö„¸«ô(=JOh”&ã&ã&ã€E£‹FªI:;¥N©ó`:§Zz‘_¥—HÈq×#y Ü=`9`9 ˜íƒöA;|ða”#µ³³ ];r›Ü&·¹‚Ÿ$3þ‘7¸N¯¼ `¤ð ï¹{ö?q7«(«(«(Ä]gº3Ý™Ž/v¦wB(J…Ò·ö„§ŸFäè¿”—qw•Ô 5H î¥pi]i]iûSÊTÊTÊ”òO½ÕÉ#ylñÔAÔAÁkGŒÈEÿ£Dr·6\Ϻ'TB@ù”OùÚoÄyâÎÁ Ì90á5²‡ì!{üNˆüD~"¿¯Î-T-T-T=éâÚìÚìÚl9´µwkïÖ^jW‡«ÃÕ$I’'É“äÁ€wñ.Þ…`…,dX‰•X ƒÑÛèmôF’ºMݦncæ/ƒ¿ þ2X84ûÜìs³ÏíúXî'÷“ûÅJ-{,{,{¶œ`J¦dÊÁ×èräᑇGhCÚ¼Ÿàê¸:®®íŸ¦EÓ¢iñÉíþ›ü7ùoâcÒ¤H?À}î¤wÒ;éá7¸Á < d,îã>î°‡=ìÌcó‚„ €ô‘>Ò3˜Á 8ƒÎAç€Ë§.Ÿº|Šm u u •ûÖNf'³“ ]ãSùT>uãNlÄFlý…Ê:d²@¼B¼B¼âƒÿ®®®=¹Ý?Ý?Ý?ORf*3•™Ü·NNNp³´ZZ-­€"¤)à†4¤ä¹End˜ “a€Ì’Y2  -hy¤oÙaÙaÙ8N;N;NÃÍfßÿ%ÿ—ü_â“lþm<6>RØTØTØ´m­©ÃÔaê¸Öá wÐ;èYÀ¾Ñ}£ûFI‡S•S•S¨°JX%¬‚í¢]´ €3œáŒG²+°€ *¨fÏì™=@4DC4⇸GêB†!d´ŠVÑ*èutt œQœQœQ°(½£ÞQïH4vQvQvQÛ£( fÁ,ø/™Ì æ`sçæÎÍØj´6 …p #t„Ž3…3…3…@çšÎ5k€!ý~H`=Öc=€×ñ:^ˆ;q'îÀÌ…™ 3~¥¯Ò é*£2*„R¡T(…ƒÓ)§SN§`góoã±ñ‰âKãKãKÏÔ8$;$;$““©ö©ö©öä˜8\.!ûÉ~²T-QKÔ |¼|¼|ÉÉÉTªÕ0ÿËü/ó¿!C.†\î¤ÝI»“”Zþiù§Àˆ|D>"TƒªAÕ °ºº „¦„¦„¦,š¸|íòµË×$­Ë§Ë§ËGñÆxc¼×Ÿ8£Ö¨5jq>l[ض°mÈ“©d*™ ¼÷ñ>ä֔㋕_¬üb%°îÍuo®{HËJËJËî ܸœ“Ÿ“Ÿ“Ï6<ÛðlpÝ|Ý|Ý ¬‹^½.x±ãÅŽ;€ÁøÁøÁx <£<£<ˆ |8·';/;/;ƒoœoœoònkokokqŒ.‘`z^ –ßL‚Ø€pW¸+ÜŒÅÆbc1àVìVìVü¨Öggg¸ÃîÀXìXìX,ÀåòG×Y×Y×Ù_éSGêHä 9Àä¡ÉC“‡ð¸HhÍ Îà Î`Nä)òy²‹úh}´>š<Ϳ̿̿Œ§D·E·E·Á8§âT qò8yœhðjðjð†r‡r‡rÝ[º·toÆÝÆÝÆÝ€½½½ëëë 4¬nXݰÉÉÉt—t—t—³Î¬3ëv•]eW—™u-Ü^¸½pý4‰&Ñ$v‘JKKó%ýýýìbwEwEw@TDETXdß°oØ7@b|b|b<ܗܗܘUf•Y„¸†¸†¸ö/Ø¿`ÿ` ²Y‚€MU›ª6U)?¤üòïô!Š pV8+œº‹î¢»–A5JR£444ð‘´_Ú/íçK(Ò‘Žô‚³\>—Ï哼ÚB[¨Å_;®׎CNbI,‰…¾†«áj8`ªeªeªØ}s÷ÍÝ7E­¢VQ Ð<šGó€ßß_ º¯º¯º˜º4uiêÒ¯ô¯+®+®TDETÔÔÔÂdAÞ¨nT7ª…ë±všXˆ…XÎÙ‘Ó«O¯>½˜lllýì§…} ûöexXrövîíÜÛ)*éééééé±ÒPi¨4@B¼ˆñX%«d•@òÉ$Äjcµ±Z WÒ+é•ÓÓÓ™'ód`%¬„•É|2ŸÌƒÅ–Ä–Ä–€\þñò— ßÍ|7óÝ •Ëçåóòù;;ÍõæzsýúRrdäÈÈ‘íhG»×Iñ¤xRσä“ÀO? ´M¬ŸX?±^t_!F”Ä.5Í¡o…2¡L(ãNZ3û–-cEEEEEEÐÛ" ëË5d­Ýkíž´Öî¿èfº™n>T%”PÒÒzs½¹ÞÌgëÊuåºrÈ)¥”Rül‹DËbËbË¢`---Ý—––¾Ûh|`|`|pøãûÏßþþó€ÐßúœÜhã[} ئ ·¸i­Ý«aµaµaµ%iÒ}Ò}Ò}5EsžsžsžœîRþ¥üKù–ëDï¨vQ»¨]ðÿmmmä5y¼GÞþ‚¿àÿ—ܫܫܫ‹qQQQTkõ÷GÛ õ8—¿! à­[5³cvÌŽ¼9::ŠO-«,«,«nñ’I€$àåÒ©-S[¦¶¸Ôêîéîéî±ÿëªèªèª°l˜7Ï›çÍ¢ƒâxq¼8þ¯Þ¬œ•³òêFH D4-´Ð +m°Šœ‡àwä7j·MhB“¥€Õ±:V—ÐG¯Ð+ôÊ×S¦4¡F£Ð§C‹µ!:í£¹÷žß~˜9¹Ó–ö³çËç=Ïû>÷ÌûÞ#$=š} ‚OŸ .Êà`“/ØX°qÅÇÜíB .P÷í»ðÈG|ðØÑÇŽzã>¶û–Ÿ›/ùõsõl\ÊäÏ?¨ÊâxõéWŸ.X’Á¡ðDá‰{4Úü)@oOoƒÉ¡É!€DU¢ |l÷-ßæÛz¹õÕñ+} œYp&p òóòó$XþâòKÿž!|W [^Þò2Àó~˜g‚àÞŠ)6UÀ 3ØÏÁv?Ë·ù¶ž­oõ¬~Æ`ñó‹Ÿ—`kÃÖ†ÂÿfÆÿ{žØó„ÕKŸö±bpfœw»»`Í àc»où6ßÖ³õ­žÕÏøÑ/ÏöýjL}^}Hî5÷xig»³´sÝ-r‹0æOf…Y¿îp‡;>ôîz /ÎÏîãîãÓäœwΓ7á&€Y[¿>¿>ß|¿:ç(%iÕ‡P8Y893ŸÙ‰™ ÿhÂÆq·¹Û˜åŸôÒ›cäÇ8¬cëü°I˜„Ií´ÓžÃ¯¦…`™û¶ûvÆæþÄ݉»0§Ÿõ“5Ö}Þxï÷€€÷ ‹|'ß׋~== Û¶l‡+W:¯t漡>¯Ïëóq´5Úm…® ]º6ÀÕ‘«ç¯ž÷ë™KéÁôà\ö3súY?Yc#oÁ'ÓŸLƒ× `^Ëf<Ù7òÎÈ;êu‡º¡Î­së\•‡ÊCå«ÕÆj}C—Ç.]ƒPs¨9Ô •‘ÊHeÊv—í.Û 7"7Ü80G`þaõ2úÖ`Ñ—‹¾4ÇaòÙÉgÁÛÏ/Öðçß Ë–.[ºl)6‡Íaeãeãeã0ì {ÞÏ?Ôv¨íP¬¿¾þúúë~¼"^¯ˆCdcä¥ÈK~Üý‹ý•Ñ·~‚Ò¼-ó¶ðgiÁ©§$}-Iú)ûTj6u?u_J-L-L-”ú{ú{ú{$îq{R0L“š[5éštMZJ¶%Û’mRÍÞš½5{¥±ðXx,,Íÿëüæ¿àó•gõ²úY?AÉ;íŒIÎ+Î+S’¤Å6/Š={J*m,m,m”Nî:¹ëä.)ïRÞ¥¼KÒ¹¦sMçš$çˆsÄ9"ME¦"Si¥YiV©¶£¶£¶C*1%¦ÄH¥§KO•žò}¾µz}ë'(ÍTÍT^”Μ‚ŸK¯KÕ¨R;ÎîèÛÑ'-éZÒµ¤K*).).)–V_X}aõiÓô¦éMÓÒÚÀÚÀÚ€T´³hgÑN)OÆ“q©³¼³¼³\j¬l¬l¬”ª¿ªª’ô·ÇÛ£Tð_V/£?çç7]i»ä¢Óïôû]ä´9­N+Üœ½9{s¯œ|å$ÀâÿhÞ·m ·âóEìú‰|–_ÒÅv$_L¾èØ8o·Â….z5fÝ îËîËÏt¨ïªï¸töÒY>…ɾÉ>€Ù³Á¶-ÜŠ·ò­z‰õ¥õ?ü"t5éªã1$»’]"ýNö;9ŸÅ†s`KÕ–*€±c ”Œi •TµÆ3 ¶…ÏÇ[ùV=«¾ÅgñÇô,)[R&ïÕ¼Wã>K¸ÿ3ìÏÚŸeñi—#!ô°0jZ" zU/`ÛnÅ[ùV=«¾ÅgñÇôÈ‹{{üm”×åu:€v Œ€3UkÔÑÔojZM£,Éê-U¢J@ÕGõQPõê#õQ|QT½ªGé£ÑÒh)šú\¯Ð+â¾ÅÜVc«a <þvÂVŠˆäƒî¸á…àO÷§Wx×èÕ²µlæèb˜a›<òÈ2É$3Á¿ílåU^å6± øÆ1ãsäÇêƒ?ÏŸhËhËhË€‘Ã#‡GÛøÐ®¡]C» -£-¥->=%¬¸?ÆçŸ×3/ì¯&>óíô팇ïÖ¿ŠD ˆìèßѳ£ÇÞðë+¯¯¼¾´r­\+‡Õ3«gVÏ@akaka+TTTÃàÁ;ƒw`}h}h}    ÷·Ük¹×`ºj28$bñ©›çºÎuYÂþjðÜôÜTi›øsâO{¦Ñ‚çOŸ?…ó«ÎçŸÏ‡¬Ò¬Ò¬RèOéOéOÎòÎòÎr(.*.*.²ó6Wn®Ü\ %‘’HI*Ç*Ç*Çl|Ý“u3ëfàûNí>µÛöNN‚¥Ç)²`Ë‚-¼.ŸºV¸VˆÈ5 &pýäúI¤æ~̓š"Ë–7,oÑÖjkµµ"Z±V¬‹¤^H½zAâÃsÂsÂsBäYó³ægÍ"žmžmžm x‡ç’ç’Hd8B„¸;(QW‡«CÄÒã1»ÍnÇ z•^%"Y"oÊbYlÔgõY}VD+ÒŠ´"‘œC9‡r‰ŒWWW‹LµOµOµ‹Á{â},ÛŸ DÝ£îÑÿõ±„Î7Ù› ˜ñÎ?` ÉÆ'Æ'hœ¢—^»ñ+]tº­n«Û@'t$L ›a†Qê¶±ÆXƒÆ/F“ÑdÚ- o’7ÉZ©:ÿKû¯|i_/í{ìå|Áþ ë| Rç\ˆ3IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-55-red.png 644 233 144 4233 13755454064 15606 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜPIDATXíW{LTg?ß½w[ºt±„e«¨B•U¢€Ñ®¤ñ ©ÑTmWÐaÓ„„l•ˆZ!Ú´©ÕФ±8ƒnC„ÖŠÁ-–ëZ%Q­–™Q0Z‘·<îã·Ì|wq5›ÝóÏÌùÎëwÏùïæ¹åUòaA5Èdeƒžƒq5ãjÆÕdüYR$ER®£xЧxÀmÖö‘DI\üum÷çñ<Ïï_OXàÇ_>åS¾`ñ·‡O—j¤©ÆÒÍ X+Є†õ†õ†õâlÖ¬;Yw€Uí«ÚWµ+“W&¯LöêÜÎýy<ÏÇóózÏÇCÂ|}ê§B¿Ð/ô;ãy‡¢ò¢ò¢ò”G›Ž6mÒ^ê{Ü÷¸ï1"D aà„N@×=vîÏãy>žß¿ÞÔOŸŒ¯B‡Ðáüž'H¾˜|1ù¢<×>f³Áh±Z¬ Y)VŠ•b@IP”@ÉT2•LÝcçþ<žçãùuÀ~õ¯èИ…Y˜…HÚ#í‘öœháiûÒŠÒŠäLØßÔD5}ò‰áªá*@sÊ r€Qå-å-PV+«¨ø?€Ö¦µ•ŸÊOÍ)/z¼'ÏÏëñúÇG†û†û†ûKgsc‰±ÄX¢E;º]Ž.ôxòô)+EJ¼Ò‡>o™gJíö÷åcm“¶Ékut9*•è1–?1~¢Es<Ÿ((‚"(UhW´+ÚcÊ^Ó^Ó^Ù–ä.É]’Ë–+V÷VJ[¶>l%¢Ñïò¿Ë'¢—oåßÊ'"ºÑv£ˆèÖ7·¾!"šÞ=½›ˆ¨óµÎ׈ˆêêˆ(èvüíx"½a»a#RÝúëV"Åj¼n¼NAæF¬XKZPå8ŒÝýþú¹ã玳¿¸ñ½Ùå!€æ ›6+löugtgtg€Ö§õA†‰?óéó§Ïî½éˆtÄW7D¢ Ÿú jëjëžãßÜÜ Àtï½{ïé•»3ºŽu8ŽÝ¿âÀŠ+èCŠ}töèl.~Tv²ì$$þžø»ïµ/µ/`lâØDßóò å ñfâÍgù«j#—Z¡VŠ]}[}Û[ŸãáøÏJM7¤Ò éúŽÑfd!‹ˆ&ò£æ–æ"¢ÖþÖ~"¢¹?Ìýˆ(Éœd&":ËÎ2ßä'ãOF"¢Ö®Ö®gúO<;‘ˆ‚…MÂ&"úJëÖº½õ Õ†jCµ¾òÓ=@ñަަŽ&²ýý$ŠÛ¤ùÒ|mòøöÕÕ½±ímDDÛ~Ùö QäíÈÛDDï¸ÞqÙ“ìIDDaaDDS^ŸòºŸgd'®ˆ]KD¿µdµd µÒ%éy:H¢ËérºœdçøHÈ2…̱NO‹÷Ï?¾ìø2 ÅŒÅ@û®ö]F­ƒVßQ  ;ÇÎÀAá ƒ ƒ ÐÛÓë»ýòà„Á À’X œ*///÷ÖûgÙùËç/ëoÀ-,ŽÅ±¸±NçˆsÄ9E¥ü:0M1®5®U¦:VßË»—ç½>´…ár¸ … … 4njkó]šÓþbÄ<€‚ö‚v CÍך¯XÆýk¶ÔlÁÈÇ<«(fZÌ4Uˆáb¸þE…¤‡¤‡¤IR£ÔXÕ¡_ø+S·¦nUvðüªùȲ#Ë0«§À+gå¾ Ö¬÷íô±íǶûn9ÛÏöèqëê7 nz7ïÊ»ÞÝ é7‹›ÅÍ7Ö¸õñ|ë¹D}fˆ3Äâœ<À\¼³bg…¶PŸÜmglg •…•…úëë@]ª.|¯}ðŽÜ5Ý5@åîÊÝ€²áBÔ…(oOö[[»ûK¥B©P:œÁ&±IlÒŒ£Å«ú~å²l–½è0«bÕ¬šsEýÀÚ`™l™ ÎÎ!e‡:Cá H«×êë±€¦MѦ¾Å·€¶P{_{ßK¥ŽªöíS°1Û˜-ÿUïä.Ñ,šÍi:´LʤLÉèÅšB)”"í" YÈB$ºÄ‡âõú«õ°qqêøÐ~Õ~Õ—»r˜¨G½w‡ C`U?W?´5cö1;Fx`ö¿²“³“•<¿4 uI]ÖÝÛ#¶Gl'Ò„4!ò ÛÀa¾ìù]#¶‰mb«‹.Œ.Œ.$2äò yÖÝ:wSÒRÒR|¹«šU3F`…VOðO¼V¦)Ó”i^.J<”x(Q[ÈóB ¡†ÐŽa·n öŸ4«=±õGÝìæ®ã”—»æbs±wCåP9Ô H}¤>Ry¹hƒ 6À:Þ6Þ6Þ¦eéœ B„u âgø‚èùâ!îæ²ÜEY¬ŠU±*_îZ¬ ^îÊ rƒÜàeîÓˆ§O#€™½3{gö*oê\¬«Åêƒó8Õ<Ô øzxx/w]¢Ë‡»eÆ2c™ê¨rT9ªŒ`#èåHÍuæ:s÷Ú‘K‡¥Ã6Ï'ÉøKu=çôÒ‹ Xçáî™ÿÄÝÔå©ËS—{¹kgg‡¯ÜvMŸËa9,gQ‘áI@]Fÿ¥¼ˆ» ÄR±T,u&pÀ9%9%9%Zyìhìhì¨|]µKt‰.s t‚<׎è¨Dÿ£rw·¿žúÛÈ6²-¦Å´X"…H!`ĈхMC¦!Ó‘xY¼,^fç=k&÷“Pý_:¥SºÔâoþpƒ  š ¬žÕ³ú“Ýç²LÆ÷…£þ7³ŽÐq…›^IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-56-grey.png 644 233 144 6217 13755454064 16007 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü DIDATXÃ…—PS×¶Ç¿û$!!ÁcÁ‡Úäñ« h•­(¿´^k{ wüÑ¡NÅоAíeÄ!Ó+vD:R;&Й‡E^¥ü¸"–T„¾+È`ÉÜ…J€€¥ù~%ääìû Üqn§ëŸ={ŸuÖúìµÖÙ{’››››› –efy`"øOøOøO¨6÷«Ü¯r¿¢Þyãyãyã{7Q9•Sù¥ÿf}XÖgÛ1K½¥ÞRO Q†2”‘,"úЇ>Çp Çh¡p¿p¿p?ÉâòGù£ÿ(#Fb$Æs¥ª—T/©^ºÿ8?9?9?™Œ± VÁ*HÜ2׿à’1+€;°;˜J.Ëãò¸6«Éj²šÖnÏkÈkÈk¨¶ŽYǬcMÌ[Í[Í[·ýErUrUrßn‹Ý»-–d… Âa`»Çví€sî|îÔw¾ï´·bßáÏéßÉãäã;"¸‹J©”J¹Ãä(9JŽ*®ò<OÑò¥é¦é¦éæËžMžMžMö³±}±}±}Œ-¸'¸'¸‡$³„YÂ,˜qçqb˜a†ÀÁë°ë`¶øZ|-¾Hèiíiíi¥¶æÀæÀæ@îìÔ¾©}Sû]+Ä ±b§È~Ô~Ô~4æ*M¡)4åÉafÉYÊYÊYЊV´ú®á×óëùõ­·¬‹ÖEëâËñÊ=Ê=Ê=ìŽÄ“‰'Oò+es²9Ù”ð‚¼ÀRêOýÁG?úÑÀ np°€,@2@ÈXLb“àÏHg¤3R Õ\«¹Vs=<ô`èÁÐ~‡‹«‹«‹ë/ì~v?»÷ìÆnì~:ϸê\u®:@à-ðxÿõïæFs£¹ñåxåÛÊ·•o³ )É)É)Éü÷î'ÜOÀ‹mgÛÙv€Ëår¹Üô|RNÊI9@¦È™H‰ w–;Ëß.²‹ì"À½Ó½Ó½^NûÊ÷”ï)ßcœþ’§ÍÓæiã¶[uVUר“ÎKç¥óÔ/u4u4u”èdå²rY9NÃi8¤äyD°À !„þ›y"@dЀ¬WËÕrµó>ó>ó>æf>žùxæcp¢!BÃæäsò991¸„¹„¹„Ň14ÒÀ ²EÚ"m‘@ÔQ?FýˆX ‹Ã®t>u>u>èöèöèöz z z €î€î€îàçÄŸNlll´¡ mÀÒš¥5Kk€nßnßn_@/ÕKõR€6ÓfÚ P ÕP ¤²"Y‘¬.QÝQÝQ݈uò8ùÖõcý^O•OÊ'å“( ‰ ‰ ‰$jÀXÅpöpöp6 Ù­Ù­Ù T›ªMÕ&à–ö–ö–¨î¯î¯î,!–K`Ž4Gš#’Ð’Ð’P Z]­®V7L7L7L@y`y`y €C8„C+v ™™™ j'“™³™³™³\aåÎÊ•;©SLl1[̯ÌéCåCåC%¥êVu«ºuu&К@)ÛËö²½«Ë5òyœÒ+KW–®,­®;ŒÆJ à à Ã)   ¢/ŠÉÉãäcð >Á'$©bª˜ª• —ðÕšf‡Ùa   JÓJÓJÓ€Ò{¥÷JOž^Õ¼2½2½2o’¿Iþ&Њ´"­8w8îp èUô*zNËi9íªæææh !¼=I{’ö$©xâ#â#â#dë–¡-C[†àÉsç¹óÜAI"I$‰ z^ œçÅy;wîæÌsæ93p/ü^ø½p@ѧèSô]ßu}×õ0½ozßô>ÀóUÏW=_ŒíÆvc;ððÙÃgŸÁ$˜@/‰—ă:@™4?h~Ð`púõé×§_§×pÁç‚Ïëø¹-ç¶œÛÂ]ÔÙt6m5vb'vBé¬ç¬ç¬'¥ÖkŒ5f5GEgÑQªòTyª<)m›n›n›¦ôZóµækÍ”6†5†5†­ê/ . . Rš3Ÿ3Ÿ3Oi[p[p[𪿤¤$JÏÇ;GÓTŸª>U}jgˆD$ªÊø¹ü\~.ɺßr¿å~‹]9>>1Ã1ÃaN]¤.R-ªU‹j5Åãiãiãi€Øˆ¾E¾E¾E€÷¼÷¼÷<`H0$Võ'f'f'f{º=ÝžÈÊÊÂâx,¾ë{×÷®/·ƒˆp؉ؿt!×7_ß|}30þ`üÁøƒŠßL)¦Sʾþ½þ½þ½ö3ÇôÇôÇô¼bÝ)Ý)Ý)XêÞª{«î-*J ØSì)ö°«}Wû®v ¾,¾,¾ ˜*Ÿ*Ÿ*4›5›5›Û‚mÁðcø1ü t t t4Q™¨LT‚Ô]ª»Tw‰3wLvLvL2bñâ7Äot°5Øl ៓œ_s~Íù@':Ñù%‚qÁ¸`¼Íu¡~¡~¡þå”hM´&ZC£ã×ǯ_O¾Ÿ(ž(ž(}êýÔû©7ˆ¼KÞ%ï6†m ÛB!Àr¦Ó:Ó:Ó:À0o˜7Ì’I¤ð;íwÚï4Ì?5ÿÔüS3þ\±¾b}ÅzÜËÄ2±liåQåmû3‚„ Þ4^Ôš¨5Qkx:RA*HÅìŸà W¸þ'¸#¸#¸säµ_¬¿X±RÝÚçkŸ¯}NæiŠ4EþӻŻŻyŽtùÐåCÀÛèmô6×=®{\ÇÜ\Á\Á\Ü***Ø{´=ÚÍ$ð~ãýÆûí\9öb/öÞ)A! QÈ÷u´yö°å¾‘”Rò}:ÁD0gëq'q’ùüî»wîÞaτ΄΄BL2HÉÀ—Ïåsù.â".þËÕy7q@6²‘ pRNÊIWjQÚXÕXÕXe?c3ŽÇø%B7¡›Ðíëü€Ï> øìJ TPAEna`cœý¨ÃÆ0ûÈ@©ßt{ÓíM·‹ß}$úHôÑ×ùÆ­Æ­Æ­ü™š5'jNØÏ8/âE¼`Á"±¬Œ¡³t–΂2·™ÛÌmÛ í†vîtëtëtãK\%®×§KÖ*k•µ*óâcÕcÕc@ Ô@ pw˜¹á5;Æ*ÎsãÜàÞõ¬ëY×3ÀšaͰfd^”È%r‰üIU_C_C_¯X›¤MÒ&Ñh’NÒI:„\WÁU€.—Î KXÂbqÂ0a˜0àë¦Ð¦Ð¦P¸KÆ$c’1€{{{-ó"s™¹Ì\~ºÄ”1eL¯Ä±Í8ç@œ;wü’SGŠxÅhBšìgȲƒìˆ~wùÆjù›í¸í¸í8wêwˆ;Ä1Á—ƒ/_Æ~NÏé9=ÄLÄÁÂf±Yl„_øáÿ…¿=`,|,|,œ×/ …ŠB‹w.4g;85§æÔüGfÿÇ™±üüüüü|Ì9# ÇÂJ 9j÷Œ£vKÈUr•\ýþ6ÅD1Qgë‘‚¤0Ÿ7Øl 6öøLéLéL)Ä Ã0 ƒYg$î/Þ_¼¿È™ŸªŸªŸªyý¢lQ¶(ûñ·–ˈe$ûJÿ›ýoö¿ 8•ÎóÔ èä[}Ø© vxè¨Ý¿mªÛT·©®ø]Qª(U”úu¾ÑÇècôáÏTçVçVçÚÏ8:z÷”·êZu­:rX¬ëÅz€SrJNyªpñ ¿0¿0¿0fÚáï¿ãâ‹\<üŽDFFFFF‚uL{¨ u¡.äÄØ+c¯Œ½‚ÿµo°o°oxÄ ý„~B¿÷?ó<æyŒGÝLïLïL/-êºÑu£ë†}×òAÏËD"ûÒRZJKÿïÛå›7„iLcš[çÌ€#Pì‹< ¿S»yÐB ­]Eëi=­`j™Z¦öÿý–ÞYzgéîZ ¨™^^ /…—ÒüÀ¿Ö¿Ö¿vo¤aÀ0` ßqk¹µÜZú¥ÃnƒÐü{ þ@^¨]ÇqaW!éHçÿƒ$“d’üwª¥Zª=wÄu£ëF×L/o˜7ÌÙÈ]â.q—Ž?ÓÐЖáç°çl,ÿˆãŸdújmŽ9±qIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-58-grey.png 644 233 144 6256 13755454064 16014 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü cIDATXÃ…—PTåÇ¿ïÙ³¿ Ø ”26È4„ë/ ü9bjÞkXƒNb€¨‘v µ(5&ˆÆ¢«7Ôu»­¢ Ìu(dQ !A`vawÏž÷þÁ.Üq¦éùçÌûžç<Ïç<Ïsž÷9$33333ž˜’Ñ© Ív³Ýl7Õf~“ùMæ7Ô7{ { {`õ<ª  ªøäÎóãü"vY«­ÕÖjš‹” „d Áp÷pÀ.ìÂ.š+Þ$Þ$ÞD2ØGì#öÑKÈ!#éÅYÏf=›õlýÝœ„œ„œbà¸.€¬›âào8¹<™iÀÅXŒÅL9ŸÍgóÙü ›Ùf¶™g-̮ͮͮ-ïµl›¡®É²À²À² âŸò|y¾<W#VE¬ŠXE2"…‘ÂH!°P¹P¹P ¸Ö®û.}×ó.{Óöþ\þ]<.>ÖÁeÔºSwþM²“ì$;ò‚A@ÃWæoÍßš¿}AéUçUçUç8°êÞª{«î1öжжÐ6²^œ!ÎgÀ‚C8„CÁ ,v`v˜Ù˜ ‹ÕßêoõÇú6]›®MGí?ÿüc0àÉš'kž¬Ùö™,@ X"qìtìtì\™Oi"Mì~“€€€YFŽL™<2 @tþϰÕl5[­;o›°MØ&^ˆS½¢zEõ ·xËž-{¶ìaË=Mž&OTð†7¼ÁQ5US5Xt¢Üà7ãÇ8€ ! z¢'zp†ÀŽºººãAUaUaU!÷惟üüàgö¶H*’Ф=׸MÜ&nÓò­XŽåXÞ7ÆH[¤-Ò@è+ôú~ôË5Ë5˵âTTT¸õ‰ ‰ ‰ ìmÝ»=vÛkä¹F€Ïä3ùÌÿôƒürŽœ#çò„]Ÿ®OŸÑI I IžÈžÈžÈ€;ùwòïäÍ—›/7_ÔÉêdu2 ¸¤¸¤¸„§E̼żż E("ÁŒÀOà'ð£LQ¦(Sîs©\*— ΄3á ®'ÙƒìAö àÕïÕïÕDyGyGynÇÝŽ»JÙR¶”†O Ÿ>øtútútÎÂY8àV÷­î[ÝÀoa¿…ýH·K·K·"H#ÒhBš¦ý ÌwÌwÌwpŸQ1*FE/àC¿ý>ô³ ¤ÏOŸŸ>Ÿÿ¸ÅÞbo±Ï¤ÀAÄA(5z½Œ^”ÚVÚVÚVÎäȪµj­ZJ³NfÌ:I©N­SëÔ”ž¬9Ys²†Òú¤ú¤ú¤}ãËÆ—/SšÞ˜Þ˜ÞHiSLSLSÌŒ?ý>ý>ý>J­;´îÐ:šœõiÖ§YŸÚlÁlÉ*a3ÙL6“dÔ7Ô7Ô78TÆEÆEÆE1<Ã3É'ù׿gb™X&ö@5‘ˆDæ‹Z{­½ÖÎ¥ŒCÆ0 Ã00º"Q?Q?Q?Á[ú4}š> SrXrXrøîUk¿µßÚø³Îµk;×N@•«Ÿº]|Ó O»dN7µ{yÞ¥y—æ]Ê{M’$I’$}—3â7â7âÇŽVfVfVf:ö;'z6e›²M‰³º]‹®…¼)ëuÈ:^Å«xÕÞl<ÏÆO, Œ Œ Œd†þ\cåÄÓ\ü‰ÄÄÄÄÄÄ€s.Û¨ˆŠ¨ˆì6¼dxÉðþåxÞñ¼ãù&N(þã‹Ç+¯|¼Ryi´}´}´žn=×z®õœcÙ¸}Ü>n¤ £…ÑÂè÷ýi1-¦Åÿ¾:5p `Ãæg»2à ÷4Á_ÈŸÔn6´ÐBëÈ¢Õ´šVÇè§¾êŸ'7NnœÜÈ¿$Ô5B Ó.H$ üY}Q}Q}quL—¾Kߥ'?ð³øYü,ú•Ón­Ðòg þBžª]g»pd!©HeÿKHIøšj©–jÓwHçJçJç2íS».ÿ ÿ ÿIÊ[;¶vl¦è´ç,'þŠãB(Qž_%ÁIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-35-red.png 644 233 144 4167 13755454063 15611 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü,IDATXí—mLTWÇϹ÷"Ð¥‹Ò¢Ìì†èª(à B–7LœZ1uÔŒ ÖhZph𨲛J ¾‘¥ªµ 5fÀ&ÔŬÑñ%­a­¬‚‰]ÖAdæÞ{þû9wîL²šÍîùÏyÞ~÷œÿ9™sIÀÒBí¡öP;}囈˜Ó6§mN[N²¤HФôÔ‘D’HY7;F$"‰Û@ ÍŽñxžÏëñúý„´@=_)"E‚-Ð?©Ô&µIm¶1ZL‹i±åŒrF9ñ·Í7?ÜüØ:´uhë`I·¤[Òý6÷óxžÏëñú¼ßëyˆðÇ@;ö´0!Lƒ‰|…b c c •Ãçn»uî{ËõÂõÂõ€"ܘÄ$& bƒ€fûü<žçóz¼~`¿ØÓ¯ç#†·…aaX¼Â ¤ßH¿‘~C^;àðx1ß`ñ,žÅCVÊ”2¥ P’”$% PÌŠY1ëlŸŸÇó|^××€úÞÖШڨ©Bª*{y‚阩ÒT)›5°OX«€Knœ))Ø ÷÷€¥[锡 €ªet²N3²"+”Óä4@nœnšnØ'êu \<ÚtÌtÄtD6óþœ‡ó‘'!OBžlXÅ å†rC9[äuÂF¢VD­ˆZcc9c9c9€>ôA†‘só`ó 0{î`îÔÜ)½›‘›¡½øùÅÏõ~ékékí »v€ññ¾Çû´$y,g´n´à<œƒÏ=™{2÷¤ÿË”y£¼ÀŸJY•² C Cõ@ß}?¦Û2¶j³k³`ÕãU$ò ûÔëêu#j½Z(ê{ê{þþœ‡óù@ñƒ¥ÇÒcéñKHY§œPNè\ɺ’ýåýåpé³KŸÀ†›n@bgb§>ÞrÙrBï…Þ€ä®ä.X±6ÚûÚûLøþIN•Sýý-+-+-+µ{û¾¢ùÉÕÉÕÉÕx4M§é4pq {Øv@œ±ÎX0Ý5ݺ.€ÌÖÌV=hÞ¦¼M·+n|{üÛãð¾û}7ozzr{r–0»Ü<;}^ú¼ôyxÄùˆ`Ì‚Ùûœ?uç‹êÕzíŠ[ ›2NàÂé §xggMÏp~ë„&_M¾ç¸s\.¿zçÕ;@Si* ´VUUUùûuºÖ}­[[Éý4&Ðïs"®W‹«TòSfü½!ɤÄ:¶=Ùòd (Ï•çp±¬ðá d¢dBÿí¿|ôËGzÐVÖÊ î@Ü(î*îÒºîù¹À»<¾mÛ~xÜ>÷Š#Ë–,[¢j€8_œ/Î?;N"²#²#² ‘®K×¥ëMÃÚ…oÉLÍLU´QµÖ/­_ ì¾nº’®Ôî¼µó–~¥ëzëzu~=NŸµÕ³Å}Å}þÏ-¼³«`WêÖ÷Š{Ž÷¶ÏÚáüÔóS’’’0XϬe‡»w±,mçæõ.ï]œß}~7W×®; ÏÈ3€Ìèx=¿5@Ãц£€RÐÓã_ßæ ÛzÛúÙõ%*…J¡r:‡.  肸sA€â]íIÝAóhÞº3´‰¶Ð®õ€½Ã¶Ø¶vM»%jœ§b¥¬° ›0Ëb—q`Yìcö±ín:9t0†ò yòAm%¿­¢ÕjÒÐÌÄLÌ’ÁÏšA2H†ô±±"ŽˆOŧ‡ÿª=­g  äHǧß |çoȲ¼²wö)mD£N»nßÓiW¿R¿Øvï€wíNø{^z^ºR¢½@“Ò¨4j?}(úPô!B“`L´ÕGWÀ1ãû¹]|$>ÑöE¥‹J•RRRh?ªi7ÔaÊÐkWµªVx`‡v/ñ/ý ­,Q–(KüZ¬^S½¦z ËÒÞòÈÈÈáiß_Ka;M¯m=¡AæÍ@Û6«]G«_»Ö2k™N»‘r¤éRŸ©ÏÔg~-ö£ý€=¼?¼?¼ŸmÖ4!Dü9HŠ5A|¡äõbµN»;èŽu›im¢MzíÚ;ì~íÊr‡ÜáWîTôTôT4°Ü¹Ü¹Ü©üAÓb‹Ø"¶ü%…KÍ'½`Àß’7 /à×îˆ8¢Óî)Ã)Ã)9ÒÑähr4ðÀœœÔÚnm·¶û¯éŒtF:Óïû—$üvP_ß1Øìö!CƆ1ŒaL?2/âE¾¨'êÇöK«y09“z¥^©7p\È9“s&猖Ýî w†Ñ‰ˆñ žÁ3 é[ô-ú@Ÿ£ÏÑçºG÷è‹™ñ"_ÔõMà˜þŽÇL4æc>æ#R¶+Û•í?ˆW¥«ÂU¡yL°wøn¾A­q¬v¬àðÍðMczµ^ pÁÀ@¬ƒÆ ÀáËáË€Ö:: ðwxÏBP„¹*]¹>Ò<¢¿à|¤v«Ýj÷‹ÏŠG™£ÌQÆÓ»îtuwuc0R'¨ïÿþІ6 ÚÂü*_ó¯©H#d„•¨ü÷x}Gøûð÷¦ìºP eŽ­Ž­<]ð>YÒ%]Ò›ÞäùE~Ñ‘[á¬pT8¨mÉê%ë–¬cËt¿vL;F‰ÊŸÕgÕg‰hì—+¿\!¢G^=z•ˆ¨÷Zï5"¢ÔÛ©·‰ˆÔµˆˆ)L!"j¯o¯'"ÛáÀá ··I Ò¦¥M#ÒýÆ*cÙ&g'ÝLºIÜö7Û^Û^ºvü§ãW_eç›~'"Þ—4+iVÒ,TÞ]twÑÝE€~ôCƒS|ç“Å'‹@º$]€¤ÝI»€š©²Ù€v8øÊÁW€ñ{ì5ö‹|Ãõ† 0ë›vwQ¿Ño‚Gð п.ß¹|çòfˆÞÞÞ O Íß>;伜ó²µöµÊk•V O?ùôxªý©v(r¹¬ñßô|Óc‰ï;?v~ Ð;c€Gà“"Gj¦êVݪÛÀoVܬ°‚›‚MV߳߳ŠÒ‹Ò­ê«q׸,8sâLè~¼ûq„F`ÅÀ¬÷ž®{ºÎ0yŠŠµ”=j¦ò£òc`¿Hðn)i)iáyÀYœ MªÓëtp aRÃ$ÁÆ/¿€½÷÷Þ€_‡Ï²‚¡Ž5k`ÿäý“}mkqkqt}?¿÷ù“Ÿ?‰¥æZ.•K壋ØT6•M}º.P¾dž¯ÕÌÇ| kY›Ê¦D,¥oú[ŽŽà7µ[j¼n¼nÂ(F->çù<°ûžÇßåïFuÒÛÔëìuÎ ŽËŽËÚ_Ì•üPÞ,oöºL4yÈ£8¢¬¹”K¹Ê‡ä#ùˆä>ù¢|ñ­#æÓZ›"§Èš½kÓõÑëQ  Ï »ÃnГõdœ¿Ïß0‰ð|Uø»ðw‰Ä×þþÚž×öè¥æÛ>¬ *ƒþmÉ’7$o ’\’Kr±ƒºµóÑÈßUò ù†|ƒM;ýíô·‰ÔBµP-ôo3µ›ëÊuåꥢ¡á5¼†!øá‡À0]X}†>CŸÕbõóÕÏW?ÏóD=Õ®ÚU{ïè¸ï˜»ÓìDÜÖ‹sÏÆúŽ j¦š©fvŒj׻Ż…ç™·«]³kö(q˸eÜŠj±mü·Œ?¡-¡-¡¯05™(%J‰¯n“âž8>=x@®¶hw5[½pkbM¬IÜsÆ›þ‹¿%ª]­EkÑZ¢Ê½Ÿ|?ù~2ðÌÐ3CÏ éÓM-ÈvÏR‹H/ð7ô‹ˆQíöÉ}íîrìrìÒì]M]M]MB!„!Aê=ê=ê=½v”Z¥V©m‹üK’p>®odœ&> 0ÞD«íþOÚ]°lÁ²Ë¢ÚõÏõÏõÏEÃø<7w‚°V°ð½Ø6Ò@\_Fÿ¥=L»óår¹\.ÌÀeeeü㌱Œ±Œ1í's«ûä>¹Ï›BÔH¹v䮸~6ú-^»Ûbý×Y+bE-¦Å´ØxJš&M“¦Œ1úú¬sÄ9â!’/Èä ìd$qUÜÎýßÌn~r“›ÜʱӛÖJ\âØ v‚øÇ“ãã¿óÇíLg\݇nõ¿#¾8,öR‚/IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-72.png 644 233 144 2364 13755454065 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü©IDATHÇÍ–]h“WÇO>´ øUq…~¡^©2ü¨ *b-b±JÁVGuuÖ ‹2ÇV°Ö©TÔn‚ME/§5ÖÊJI¨´¶Vl KÓä=ïùíâÍÉ›Éı«ž›äyÎóüÿ÷=9'G€BˆéOÎBg¡sž;ëí|îæÜÍK~³â ÕŽêçßÁüöùíyþ<¿¶c=¯ë³û…°õ³y:/;‘Ó•Óåð¦ã°kù®å¹_XñAðÜôÜüË€·Ü¸qùÆe¾†±¾±>€÷Þ÷^°c=¯ëu¿ÖËÖ'>â ³îκëørfçÌŠ7oZÜ`¼\ Û¶nÛ 0âq)'Èq`s”ˆC‰¬Xϧëu¿ÖÓúš§ù–‹6.Ú(l¯Ý^ëùÅjwBSASæ¥n§8Å0bF @î–»™TA8ÀŽõ¼®×ýZOëkžæ[~Ä?×ö§ ¨É­É>¤é4 È%r )é’e² %}²FÖ€tK—t:ªŽª£ v+ŸòñÄè5zÁì7§Ì)˜Íf3)’ò¾¼(­Ÿæeø"ÛPixÆùæió4q¦´¾æi¾å'mìÂC8Ø|°Y«™_ª©¦T“Í}]ò:ÿu>´—·—·—Ã¥w—Þ]zW»¯v_톡ΡΡNxÕøªñU#´FZ#­è_Ù¿²eÖDpãFñÁxk¼µy6ßò“6Öÿ-\‹^‹fÚ÷›ÞäHr„i ž ž žµ;×î\»*•ʸëÝõîzh\ظ°q!”])»Rv6lÙ°eÃ(¨—ê%PAv{4 DP2\2\2 Á‹Á‹Á‹ö|Øv„°¢mEÛŠ6ð6x¼ o·Æ[³|Ì2£f4‹—á[~>ûÆäW²VÖÚÙs‰s‰s X·fÝšukìü³ŽgÏ:À3é™ôLÂÉÒ“¥'K!Öë‹õé3}¦æ o€u]]ÿôs óƼO„xpïÁ=¡÷jjP Фð‰jQ-2#ØìvQ5T5T5dçŸ=-zZ$D2” %CBÜ®»]w»Nˆ‚ñ‚ñ‚q!{{{„…¢X a>4ü†_$3¼ ?íçS»ÓˆQàw´N€É–ɖɈûãþ¸ß~ÞD8N„!Òéô¨kÔ5ê‚Ñã‡GCÂ1•šJÙËÁ¯Æyãügwåÿ8ÇqˆCü—1mïmøHïsçØ¿œü¤aÈÙ`7“"rÊQ|ó‘±cã¨.ë·£þP½ªT—z®ž£ø^ŽËqR å Jëú䟱ÿ•3öv1cïc3óû7Ú:|²„u’nIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-200.png 644 233 144 2772 13755454065 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܯIDATHÇÍ–áOTgÆ£Lj­®„´Ä• TaéêHª‰aR3ND–6|pW!£nÔlĘ%6i#Í&ÝJÀ”MÄ5Ùš °P5l? «¥›RÓ.¶`P Â@èdfî½ïo?À;3Ùîàûåæœçœçyî}óžû ˆˆÈêå§€-Ó–is.ŶÊx>Õ“êùÕµ¥ø3’&üñ<¤5¤5¬¹²æŠõ0k\×'ö‹Äùõt^VK<±²uekRñrü!¼“ÿN~ê/–â?ßG‡£cÞ€ªëU×Ú¯¶_å÷ðôë§_ÌÏC<Ö¸®×ýš/‘_>ü}°wÚ;“žÀÊ+WˆÀ†=öd\*Ê‚’}%ûÉdes XÅ*U „¡×tB¬ñåzݯù4¿ÖÓúK~Ö­+ïx×ѼÔððoPýZõkZ/Ú|ÄG¬#d„Ì ³‚0¨»ê.I$A<Ö¸®×ýšOók=­¿ä'¾•JDä“·X(–Fc†ºU–‘b¤€ñ0⊸ˆZw­ik¥+ÔnU¨ Á1FŒPUê¨:û‚¨ªJU¡ŒÑÈîÈn¢ê†ÇðÄùY(5KMmð“·¶RDdS=óŽ!ÇP(ß|ÔosؼmÞf!¦ÔI;í 2T†ÊܸqÇPN9å ÊT™*ÜìdgþkócócØ´ÌÏ`Î`°èv ‡R´ŸecŸÝßû¾÷AýÀÚ¢y^xsàMTÝ/ë2ê2àþØý±ûcqÿ ÿ ÿ h´7Úí0\;\;\›€öö†ÆW_j| žô?™{2—ðŵޒ¾ö³lì»3–ùùÌç3±ò#}¿é}Ðû€p¦‘ùSæOPTRTRTÍæFnôÝè»Ñ…» wõyëóÖCîþÜý¹û¡¿·¿·¿¶ÏmŸÛ>ùÇòåƒìe™ý%Lí{|$¬õT×µë×®kcßpv9»T«õJ`O`OüM¿ø]Çë¯Cõ©ê“Õ'ãùBW¡«Ð[«¶Vm­¯ßë÷úãø^ï^ï^/ìïïƒ7à xq¼`¦`º`þr¹éHÓ‘xÞüíXÃXh?6‘ä’äòlS©—S/‹pRDD‚®88 R9S9[9+’7”7”7$’^“^“^#R±¶bmÅZ³Él2›$¶œuÎ:gÈüÙù³ógEœ‡œ‡œ‡ð6g»³]$<&L,”ÈŠ¶m"1?"ÖMëfR¿zÉ‹ä‰$5ˆˆÈºoýðÁˆ¸n»n¹n‰”Ÿ+?W~N¤µ´µ´µTd³}³}³]d´k´k´KdòâäÅÉ‹"3§fNÍœq[nËm‰<¾óøÎã;"“͓͓Í"¡h(Šˆdwg_;3¶.é#ÝHÑ~l"¡âPñzhîz¯ë=]ÇÑû =zH$üÏp{¸]¤³·³·³W$Í—æKó‰<y>ò|DÄSë©õÔŠdddˆl l l ˆÔ_ª¿TI$÷Qî£ÜG"959595"îQ÷€{@ÄÛí¹ç¹'­g;û•ë+—ˆö?•÷|E¾"½ãÖ–ð«ó/Ï¿ ÏþýlìÙjœñðx&ŽOŸ8‹ŽEÇ¢h¡…^^^kÜ·Ææ˜MÙ” ‚£ÁÁà XÏ”]ÙQ`zL0µ|*•ï¼ïüÏNå¦zp„¡P ø»ýÝ1Þ·Ae©,ˆ%ä4§9 VÐ ZÁ#-ªEµ€êS}ªÔjåPŽüOÆ„1Á•±9¶apqŒ:F6ÇDXÔ“·,¹,øãòäo5fYPߘkÌ5DÕßU¿êGq‰Oùø–z@õ¨Õüƒ6Ú^à&C ¡Ô÷æs Q¾0Ϙg&¿Yf/³ÿßÉÿÂþ+_ØÛÅ {{1o°ÿüØÛüCó#IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-119.png 644 233 144 2573 13755454065 14762 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü0IDATHÇÍ–íK•wǯ㎞¥ë˜Å^˜†¶‹ùBf²j£‡RëP’%²-j"(aô0hØ*6ìɆ¬Âõ…%é* Ô3Ý2XhE9´´lRÌŽ‡©çÜ¿Ï^œs{Ÿvþ®77×Ó÷û½ï×uÿDDdrì)4=izRZÔOúÜŽOXÿ`¨h¨lßÊ[õV¿…/{þÇ/ÉMÉMŽÇàJq¥ˆ@ö¢ìE9›£å@‰¯Äðô­§o©$0^“˜¤Š€!,{ç[ùX½ÕoáYøŸÅÕ#ñQÆG"°¼ty©ûÇhß`{æöL‹O» ìe/“@é!£Ì(# * 8p€í[y«Þê·ð,|‹Ïâê‘×Ïöûb”?ÅŸèZ;ýF?˜“´-Ú4õ»Q#(þgæDs¢9T‡úMýÿ[¥«t”þOdYdšZ¯/ÐŒ¿p;£+• büöQŠˆÌ9Œîîw÷‡œÐ=¹{2ÐÀ2# ekÙŒÐÈcÇ)¹Â®€0F¨§žz;­†Õ°¾æ+¾Šë+6êŒ:Fx'ŠݹݹÀ¨»ÇÝrZzbÂNüvoØ ˜ï«o´J­Òæ©]_[^[÷fß›}o6 Vë¯õ×ú¡ki×Ò®¥v¼ózçõÎëpäÃ#ùGò¡çnÏ`Ï ýÅÕ(ß8LOLØÝml>¿îüºñòOõýaoØKxMÇšæ5Íöß½1zcÔ&^½õþÕûí|«Ñj´Ðw ï@ßÈš•5+k+{ù ø9:öê¼yÈqˆˆH†ä‹G<2nšGóhi‘i‘ÓNk§µÓ"Î2g™³LdèæÐÍ¡›"3{göÎì)¹Ur«ä–HºJ7ÓM‘œ«9sŽ·g8îê™z¦ˆ¥'I$T*ê¼#ÎÖ@k@DFEDøÌñJWé±:S{S{S{E’ÉÎdg¢°´‡iÓЍ­j«Ú*2£mFÛŒ6‘à’à’à‘ªU«6Ь-\›·6O¤¸½øÛâo%"Dù’vµÍk›'2®'a*#±)é×ïë÷í© V÷÷A¤9ÒiN<Ê`u°:X ‘‘‘v<ü$ü$ü?ô ú@1…)(02Œ àŸŸÚ°kî„©œsÜÏÝÏCNxd<2Æq—¹Î\ÇHœ†°5K¯ÙcŒÅùS™ÊTPKÕÇêã¸ý–­ïÖw3Âã{,«; ÐÜ}=·ùñ»ü.À„Øæï4:—±ÉØ„F-í´'n~\¸p'8Îñ¸ø.q ¥n^ËÆ£Ú¨¶’Z;¦?ÙŸl}©×6ÿû¯|cooì}ìͼÁþö1 ³1’gIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-21.png 644 233 144 2331 13755454064 14661 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜŽIDATHÇÍ–_HTYÇã¬:Ö%µÛXíìË¢øÐ›EPa‚Äf)Ëú²ÒS=ô/.”Dˆaín‘¡Ó„QIþÛ4v1ÙÄŠ‘Bü52«2Î=÷|öaæÌ½ýÙ¥}ó¼\~¿óûý>ß{Ï9¿{DDd}ú)UU•—²³j¿o¯oï·¿¥ìË <=ÇOú–u-ùWó¯Ú/ÛÌ›xw¾ˆSßÍ3~Y/Ž#·#·ÃJÛg¡rGåßW)»iü]þ®E êîÔÝèlïl瘞xzÇ6ó&Þä›zîúrö¾dwgw{¦ 7'7G¶îÙº'øc*àUö—ï/˜öN{u¨·ÀÖè'Ž1—mæÓñ&ßÔ3õ ÏðSz6–m,ŠªŠ*[*áå/Ðh^² 8Ç9Ö€·âªZU“=¨ðàÇ6ó&Þä›z¦¾á~J¼¿¶?ï†C¾C¾Œ !–ÔCõÀ¾h_$©¿Ñåºm½´Æ¬1°ŸÚ#ö ûK;ÇÎ=ª—õ2ìv»$«ê«~†gøâô]3øçüsñ/`BM(`€}`_°/°¤clbð=UT¹´ÑFèëúº¾j^Í«y ‹.º\qVFòûKic_†—á§ô¤…]þNœ9q&“\d–@ÿªûu?ÚÌD7G7G7Ãùmç·ß£ÁÑàhðã/ÖZÕZÕZc¥c¥c¥Ž_ïÖGõQ´k‰Ó<ÃOéI ý n,ÜXȤ³g’ÉFÆó¼èyÑó"(° ¬ Êbe±²ly¶åÙ–g0xsðæàM¨›¨›¨›p6ÈýK÷/Ý¿äS}ª[u¨kêš©¯9ü”¼þ¼~Ýs%s%®=’m=µž:v¸&\®†ú†ú†zÇ_XQXQXMV“ÕdAO_O_O¶¶¶Cw¸;Üv ›W1ÐÃzØý ?¥G mþZûÄfb3®c¯ôœž]¯ëµKH´:Z­†Í;›w6C( †‚°X²X²èz±]µ»jwÕB§ÝiwÚ.aÓjZMè·ú­‹—á§ôd‰Øwí»ž"Ö뀘±Që°‹xš=Ížf‘ñžñžñ‘âGÅŠ‰T^©¼RyE$R©ŽT‹ø¼>¯Ï›É+nÅ­¸ˆôJ¯ô:~Y’EY‘WòÊá9ü”ž,‘x(úëO‘ÞLŽsZV‡eÅxF#‰‘„Hâ^â^âžH¤&R© L¦S"·[n·Ünqøþ6›¿M$;/;/;Ïñ{J=…žBýZ¿6õ9îðÓzþõTö[+â¦Ä׉ ‰ ðæÉ›'ožÀ¬wÖ;ë…Ù“³'gOÂòÌò̲³X(^(^(†•¡•¡•!×VzÌ$“Ÿ}*?ÑÇ2}æ½¾pÎêgâÿWûDçOBª3«¨Š§Õ¤š$©;ô¸Gë?ôcýt‡¾¥o4Òèâ{µ­m •!†Ð`Ÿ²O‘ÄRjÀýgç_µÿÊU{»Xµ÷±ÕyƒýR»F9 ÃùIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-126.png 644 233 144 3012 13755454065 14745 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü¿IDATHÇÍ–ÿOÔ÷Ç_w€ÇÉ÷!Û%Š#ÖEbŒ;’U²¢M+¤4RÎÌNIíb$ØùCÛ™Ž…±ÍÔ5M­Éi(ÅØªáŽ–®Îà—• ¬Ú+'aWzöRàîóåýØÇçîÜþß¿|òúö|>ß_>¯÷[@DDò—¿ö{‰=7nÛôgÖfÖþèlÜþ«¶l/Œþòºòº Þ-x×OÚVÜÊO­Iâ§òY~É—¤ÃÑëèµÕ,Ûo‹•/Vf®ŠÛCà¼è¼øƒ{ûöö\xïÂ{ü~þðs€ïj¾«¤mÅ­|«ÞÂKÅ—7ÿ‡_22l÷Á±Â±BJŸ)}¦üÕxÂT9Ó—XAÔnÕ¡:Pú­˜+æB3Ú×Ú׉ ­×ê5À\æOn¥ˆÈÚ?¡;Î@$&ó'óxÖÒJµR¸À]î¦ΪY5 ìf7»“~®r•« D‰ ›L2Sâ'ÍMæ&pÅña²h²XtÞwÞ¤[zìqy¿­’tÏ;žwrt »Â®°ªâ¶þºþº\JÛšñ ã8O|úíÓo‹Ü™º3ugJĶƶƶFdÂ6a›°‰t–u–u–‰Œ‰Ø°aCdú—Ó;¦wˆœøã‰c'މŒÜ½Uw«Nœ2)""—ˆ¹‚® ª’˜ç¤çdŽžÐWxó ¯ö4÷4'Öc~,Z­ ºëú®Á]ƒÉ ÷ŸñŸñŸ@8„¡èJÑ•¢+àö¸=n”Í—Í—ÍCKK l«ÞV½­¶—l/Ù^š7Ôo¨‡­¹ùÉÍOˆZ|fôƒ¹æ¬3wó @®/×§zùsð‹àÉU,}¿ô=œ[wní¹µP.‡aøòðåáË0èô úà@Ó¦Mɺ-Þ-Þ-^¨®­®­®…õ×Ö_[ öîÝ7 íÞöÞö^˜w…B¡PÊÑЂ•ÁJ°ôää˜cš ͗⿽ê1;ÍÎdáæ¦ÍM››ÀÛêmõ¶&ýcî1÷˜*¦*¦*¦ Þ]ï®wC·¿Ûßí‡òþòþò~ènínín…òóåçËÏÃGöç?œO¶ó'ss`鱋˜ýf¿mL ½N¯›ˆˆÊϤ@ $1¢³ÑÙè¬HÖº¬uYëDfŽÎ9*RÕWÕWÕ'Ò¸±qcãF¯ÏëóúDV—®.]]*âÌsæ9óDöwíïÚß%’;šûeî—"ÿÖ¿šøj"_ÈccE,=v‘HM¤æö?%Ý?ä‘E^±mRO©§$fUf5f5f5ŠdWfWfWŠÜX¼±xcQDË×òµ|‘œœ‘¼Cy‡ò‰Èa9,‡E¶:¶:¶:DV®,\Y(âjv5¸D~•áyày`áóJÚµÏÚ?kIèY¾Ë>…–#-G€€ùSú˜>–<v<ª}T Úˆ6¢@lOlOlÌŸ;>w‚iÁ´`wwwÂRÛRÛRpŠSœ‚ÐÏCÕ¡j0~o¼o¼ãˆq[æ³ø—õ$û··‘t¸gÜ3‚ž³Ùlf!¥E­é±#ŸÔòðàÁfÄ ™©‡¼DCƒõC¢==ù4°àœvN'ûØÿw~ ÀLtþÛÆm ÍØkìE£{ÜCÑI zÔYuÔuu]]uNõ¨à/tÒ üƒ0a”òeF3^6^NéüFCzCºµRuþ'ö®|b_Oì{ìÉ|ÁþdÍÅ’˜Z¨IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-29.5.png 644 233 144 3067 13755454067 15046 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜìIDATHÇÍ–ýOTWÆÏà¡‚‘)H ¬h"`hB5,–B£¬‰/0t³”šºFK¢kRSSt‚4¬kÒ}1“0¨l·Ý†ŠšÃDÜŽSÆ »Èt ‚‘@î{>ûÃÌÝ˶ÿ€÷—›ïÛó<9'ç9G€Bˆ„È_@TjTjÔòpuÄÈÇìˆÙ‘ù§pÜS…©âÛßBüåøË+®­¸¦yŒX¯ëý‹ç…0ðóéy‘ ŒÄRÇR‡i[$þÞËy/'ÆŽ?¾§Å9«BÍÍš›×;®Ó?Üÿá>Àô¶ém`Äz]ï×çu¼Åøâ£Ÿð ¯t½Òeú,^-¤¿•þVƱpÿ2 ¼¬¼ À·Ä·DF@(Ä'·3Ì “‹b½é×çu<_çÓùÃz$¾™ø¦ðÎÞwöZ~ð|ÇW_­ó)NàçˆuFíí'ò޼€ ±^×ûõyOÇ×ùtþ°c+Ÿ !ÄÅb¨œªœ™  ÜS+¯)¯Ö§ +Ã(¥R›ÒƵqPŸ©5òˆ<"ðóï.**2tfáÊ”P¶rL9¡²0>U•++Wê/[ù…B¬ÿ,3–™³|æ½ç½ d¾ÌgŽ/øš¯A h-8pàX$ ˜bŠd’I^”÷âÅ ¼à/äZ¹–¹Hµ"|þ°°õŸFV¬µWþµÖTkÒѴׇV»Ýn7\Šÿ„O@” ” ”|ƒÕƒÕƒÕÐ’Û’Û’ îa×°ëç ¦Ÿx¿éý&˜Wçrâþ/ý_‚‰?ÍŸ†ôÿŸæOƒ`}°>XJ§Ò©t˜wÌ;æÎsžó h#ÚL6O6O6ƒ<*Ê£ 6©Mj̳³Hí²Rª”.À¿mëmëu?kíºo>¢ûJÄgæeŠLùŸï€+V»ä.¹ËØ™.Óe:p€$r|#¿¹SVËjù†|ƒ9™Á_íu{Ý–iËôŒ™¾ÿó1ý¸XLsece#ÈÏÃÎ,ûCq¡8VŸ«ÏQøŒ>ú|†»AÌ#ñ0ÁÈÇrP°>®„FC£(òïê˜:ü1âüT™«ÌÀÂOÿå½+_Ú×ÅKû{9_°ÿ +I ÒIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-65-red.png 644 233 144 4203 13755454064 15604 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü8IDATXíWmLTW>çÞ ¢ÒÛŠ2h•­Ÿ£(bdÎb$v„TL¡Z£©«¢%1a V 4ÕÒR¨3~$¸%Ù­­i n—¶»•6²2 lƒ€ÊŒ82̽÷<ûcæÜ¹3»«Ùì¾fÞó~<Ï}ÏsÏ™!Äo¿&!&¤sŒsŒsЧ…èÈæÈæÈæU)’")’Ò^G’…d!à³J"‰HÜB}VÉóy=ïÇû‡â i¡|ôüö=d`O™#5KÍR³ý-¢E´H#bˆqŸb\øcÎÝœ»9w½{7öV“Õd5}çù¼ž÷ãý9ÞóùaE¨?óCá‰ðDxÒ½O(®0®0®PÙW{³öfíM6ÁýÐýÐý€"<ÁFt£Ý€æâ<Ÿ×ó~¼(ÞÌŸÏ_ú„>¡¯ûO¼éºéºéº¼¬Ë×åëò¡ c‰,‘%BVÊ”2¥ P)‹”E€bQ,ŠEçâ<Ÿ×ó~¼¿F8ßø’FÚ©Ú ‘K‡¥Ã ßñs¥¹Ò\)[4b%¬†ÕÀ-7øê|uë–§ÊSŒ)” ,T­¢•µ“YX·œ&§rÃhãh#ÀJÔ¥êR¸y¶¹Ò¼ß¼_¶p|·ó#÷#îGÜ_›ÌŒåÆrc9Kp9»œ]ôq+ïË‘r$°ì„Јõ°@6²Ccû×|å}ö{GsÝÎ!ç)ç) Ë?` œÆOÚ%í’vµæ“'ß:ùÛhà‘í¾QߨÁ;\2\Mk›ÖÀÅW/¾ £Gê©ôö÷ö@SZSœ¥g)oSnS.œûúÜ×€lwµ¸Z´"ÏÉ‚·NÜb۵Ɇð#l0fAÌ‚˜¨|´ê‘ù‘Y+”ÏŸ¹÷ÛÞo`úÎé;@*•Jÿ9&«Éª'z¡äB‰>.}"}¢óÝQ?Fý ¾g{Ïö Þ£UCuCuçÃùq¢GÖ]týÑà“)]c3ÆfäK[ßÛúÌqÌqè õ,éY†*Cü@ P[Z[ É4™†HäSö)¨×ÔkÕzµPºÔuêº >çÃùˆâ¢µÝÚnmJHY©ô)}z€¤Š¤ X“°&ò¾Èû64oh€®.}~NqN1D}õ¤\M¹ Ë¢—E@Ë–;ž//——ñ­‹­‹­‹µsû"Ÿh~JuJuJ5îRÏgÀyÿãc«k‚k·¡ÃÐ/L¼¹ër×@rrr2DÖEÖÀƒ×¼…; wÀÜŒ¹púÈé#°Á³ÁÀ@{ûúöõK àÌ4É4É4 ÷8?"X‹`ñ ð«î³=õ_Ö©“@ÔØí±Û0ýöôÛ¼ÅÅúɹ˜‹ÝF·@ÕÏU?ÀÓ¤§Iàv ëÒå§“ŸNºœ.”sÇ?Ä»zìrÛå6m’;hM¢I¾".—ˆKöWð·,~FüäøÉÊLgn§§Ó£5p³Ì7ªÞ¨€Å¹‹sõÏÞ¶¢m…þ¥±Ï²Ï€y¯Ì{о/ú^GÔóMû7í~Ëó›w4C-Ø?wöÜÙªvˆSÄ)┇ItVtVt!Ò5éšt­±O;ð­™Ù™ÙÊ^Þ_µý´ö§µðÂñòÈË#<ˆnîÜÜ©Ÿt}j}ª.î¦GèÃ~_ý¸èNÑàãþùí‚· TFp›¸MÜö·<¿?ž¿õÜâND$E$E$u×ó[Ù¾û6²Lmç&ý"ý"g”3 wëùÖó ÷Ëý€»¸«ãëíŒïŒ€S‡N”‚+qWâ‚ómzb_m_íŸ/!€P!T£«èT:•NWFPü‹v¥n¦›éæ•5´‘6ÒF®õwŽVGº#ü`ò({Õùê|=!ö.{°k06‹Í´ `™l'Û”R_cïÑÞ£@|”q“q“¼K›äAÑ&Úlfš…XˆE2¹¦“t’.$vb'vBÄAq@Ø÷¹vµÖËŒe²ÁYêLv&ëµëóøü;Ó:ízàƒ€CýHý`y¾._¼¼pÓíM¦M&e¯vHCÒãPìîØÝ±» Ì‚Y0ÓsvœæÄÀgžxO¼'Þ£- Å Å Å„DFF:iÚM7§›ÓõÚUmª ^8à€Àc<Æãà •ÙÊlevP‹ÕK«—V/e™Ú]nˆ0DúF¿–¢Bwš^ ÛzBÃÜ¡¾1ʯ]ç¹ vme¶2v ²A6 ©ýj¿ÚÔb:Ð8ÆwŒïßÁr4MF ÑBô›¤x"Œß8òü±:L»9ÿF»­ŽÖ våV¹Un *÷Yì³Øg±À|×|×|—òº¦Å³âYñlU*—Z@záE^`ÁÞ ¨ÝAqP§ÝcÆcÆc²ÁÙèlt6ð /´ËÔÖbk±µ©Fª‘j:IÆß à ¬“ /"n¼àÍ€vÿ🴛‘‘¡;w©ŽTG*ÎøãLÛ šOóiþÊý¡0Âã0\JþK{‘vÓÄ ±B¬è^Ä ç—ç—ç—³ã‰c‰c‰cò_µ­ÅA[i ¤ŽÑ†7Žü®ÝC¡~Æß麅nÈj²š¬Vç Ó„iÂ4€J(¹r#Þï‰÷"¶‰mb½(Ì Û¹ÿ›´oY$‹dIß…†K &0ô½D/ýcºý7ްé ëû­þ'ˆ!ÎW×äš¡IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-64-grey.png 644 233 144 6171 13755454064 16005 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü .IDATXÃ…—PW¶Ç¿·»‡Ã!CMH˜€ÄD~(`#E‰ë è:©2Á"Š á¥®Œ*yKŸT@ ?ÔBE` a ‚HöÉøˆFÔ)e`à3‚üf™ž¾ûÓš—ªTÎ?·n÷½ç|î9ßê{šäæææææB3. ÌJn€àhsî¹Üs¹çè‹ùOóŸæ?]ó:u£nÔíÐ^É+yåò´ù†ù†ùªÅIœÄI’ƒ@"€zè¤! iT+M”&JI7Ä qCwN’I2I&?.ÏóÎóÎó¾z¿ ¹ ¹ ™ ó~¼ïGÖ-p×í\ æ`$"ÉT ùB¾/\·ÌXf,3^aùùùUƒ–a˰e¸õælèlèlèò¿:99¡iyÜò¸åq$'\. —aîaîaî€8ß‹ëÅý¢¿gþíñÄø"ÈÇÙ3øu¡.ÔEH"ÛÉv²Ý¯ˆõcýX¿ïNÍœŸ9?sþwVVVÛž8}œ>NÏX—v/í^ÚMÖKs¤9ÒÌb?öc?ä˜Å,flÅVlàø`v^5¯šWa}·®[×­£Ö¶À¶À¶@aÏøÚñµãk?8*÷“ûÉý¢d¶í¶í¶í«‹h*M¥©IÌ[äàÜÁ¹ƒstÐA§zkà¸Ýß-f‹Ùb~åÏê·Õo«ßæ#5Yš,MW¥0)L Ôð„'<ÁÓ@À¡½èà g8˜Æ4¦,Æb,Hé#}à1†1Œ3º]Œ.xxéø¥ã—ŽóIÛ¶?lçn88:8:8þ|™OäùÄè͈F4¢ÿ‹qìtìtì$/J^”¼ø_×f/Ï^ž½üÊŸÕµF­á×§&§&§&s7*…J¡‚§/Ä ñ€°GØ#쇅#ƒ”RA2H2BFÈ@ÚI;i…,d³EÙ¢lQ€«ÆU㪧è_ý®ú]õ»üz1¾È#ò1ü4?ÍO¯ ³|cùÆòMò2‡ÆCCý5š M'jÄ$l6 ›àÂ1ALÀ|Â|Â|ÒA:\Çu\pçq , $¨F5ª¶m`¨ ‚ .¢M¦NSÇU‰ñE‘¡4þí/ÖkŒ5ˆ½{'öâ5ŠE ì™sa>c>c>æBæBæB€{ª{ª{* Ç­Ç­Ç °=±=±=°[°@zÐÐô}ˆÒxXþ°üa90¾||ùørˆæ¢8£8£8‡Ø»±wcï"NäùÞŸ÷çýßLwssƒ6(&(&(†”Ú80G™£ÌQÀtÙtÙt8Öv¬íXP[Z[Z[ œ555gbÏÄž‰pq ´‚Vd YB–®®®@QyQyQ9Ðw«ïVß-<·¤ b|‘Gäþ©}Sû¦mUTUTUm†OãÓø´gsZ«¯Õ×ê)-d ™BæùóÉï'¿ŸüžRm´6ZMi||üó÷¾¾¾”>qøÄá”î]·wÝÞu”vVtVtV<_ÇÅÅõ<¾È#ò1øŸãsÈ\`.0žOÊÈ#{~à¡kC׆®û=ö{ì.&_L¾˜ 4;6;6;I¦$S’ P·¨[Ô-Ï÷«:Wu® PlRlRlÜtn:7`ÑYtݯ2:ŠQŒþ*þf ³@ÊPFVÉ*Y%½hZaZaZ~«Þª·êÁ’bRLŠAÍÛÌÛÌÛc‰±ÄX<:ðèÀ£ÝF·Ñm€±ÞXo¬Nž<=LNNWv]Ùueà<à<à<$}”ôQÒG€uØ:l8΃óxÎIZH iµOÙ™»3wgQ3jFM/²k~ZóÓšŸ\ñññfÎ{†x†x†•>>>0/,„ä¶ëm×Û®À²—}¸ìC ñËÄ/¿‚ví Ú èŽëŽëŽCüZá¦ô¦ô¦@&2‘ <²<²<²ã³ã³ã³ÀÓö§íOÛn#·‘Û¨²TYª,˜ ‚A0´•´•´•à©Bª*øC 4Ð@“w’Ëår¹\’Ó–Þ–Þ–nSO$O$O$CγÁl0LÊRe©²08 Ž¿ªXÜhÜhÀ×ð5| àÑäÑäÑÄÅÅþ þ þ €ü°ü°ü0Àd2™L&àbr1¹˜E½¢^Qy:JGé(äMËš–5-"‰ˆ%ÄFlÄvÊ”¼QòFÉâ +ÿo&}&}&}‹*à€wÞ±íNÛ‘¶#m[866†ùòêòêòjH§§¦§¦§.ž‹çâPÏPÏPO ñFâÄëÁz°¿*­UeUYUÀ§»>Ýõé.`ƒ~ƒ~ƒ4êtÔé¨Ó µWj¯Ô^foùÞò½åËÈåýò~yÿ½ÍÖFk£µ1âz;ôvèm@è:„Ž›j™—ÌKæµéÞPËPËP‹û~~¿ˆ_DW…hC´!Z’šššªLQ¦(S@"Æ"Æ"Æ€ÈæÈæÈf€•³rVƒÂ 0 ȈŽèˆPF+£•Ñ€ÿþ?øÿsqq166õ6õ6õ’mò ò ò sk©/õ¥¾kß]¨ÀP ûBì ±/°¤’T’Ê©¿@9ä?­“ÔJj%µ[Wü¼èçE?/¢Þ9Þ9Þ9ÄôRÛKm/µáUï2ï2ï2HÜ Ü Ü FÂH8€¬"«È*€l$ÉF€„“pxexexeÀdM°&Xà\ÙYÙYÙÉß°EÚ"m‘Ìzv†ag>>ƒXÄ"öÅÐB -§²·y¶ð…¾‘û)"E¤èŸ™L,ËÄîiX肘caaa|†1ŘbLœd“l’ “°WØ+ìp §p @*R‘ `s˜Ð….t=SÀ¼x}«ýVû­Ö¶{²l²l²Œ+vðqðqð©)X¬]¬]¬=úò‡<òwô¡}üj±u 1ÈßG6²‘M^ÿúõ¯_ÿºpƒl‡l‡lGMÁ¤ï¤ï¤/g¼ôæ¥7/½iÛ-$¯’WÉ«˜3 3Ì0A@#hÅø?BÚaè0tèªÎêÎêÎj¶ÐÉädr2=ž³Ö[ë­õû¾¸Ÿw?ï~@ Ô@ pµÇ9+‚ÎÚÇ ‚³à,8õëIד®'€%Û’mÉÞ÷…“›“›“ÛÀ}£¾QßÈ6¿×ü^ó{tÉ$™$R¡R¨*AáG8tŠNÑ)€ð„'<Ì£†Qè5­Á­Á­Ápuvv„ až/˜#ÌæÈã9æ$s’9É/àÐuâ@ÄšØI¤ÿ¿Dl!ZÑŠVÛnI"Iäª ¿ßÕ[3¬Ö aç³ré‘¥G–A¢Ð#ô=3¯1¯1¯ažÏásøHOœ8`[<11ÁöÊ‚eÁ²àÂ(ÊR–²{n¥B©PÊÛ+»K¬XAAAAALbFaðLCvíî¶k·Ø®Ýoži7©HeŽ5Z­V>ÃXn,7–CÎ0 Ã0˜3qÕ|Õ|Õ,Ì>.}\ú¸”핸ß4ÿËü/ó¿8ÚßߨÕö}rPä{ú`qÜîàíÚ­¦ÝtYº,½¦`R9©œTrÆÚÜÚÜÚ\Ûn{GïÚíÞíÞíŽ3ºN]§®“$É{ä=ò@P jA½ó:÷>÷>÷¾ùOþáþáþáÌ„=ÞØGóo¹XüŽÅÄÄÄÄÄ€·O»©u ä?‡— /^‚ ›¯Í׿{“—úKý¥þ›Ž¬Y=²Úýkãããúß]g»Îvµ½5m¶N[ÙlÉJÉJÉʽ*ZNËiyu¤BÊ>Ä&0!øˆ°'Šÿ-ÁØïh7ÍhF³-6ÐÚÓÇÔ1uLÝÿøÏ%Ì%Ì%K$¥’RI)ó€MeSÙÔ¶ö€º€º€º51†>CŸ¡´^‚—àEOÙý6ÚgƒÁØo´kÿ\Øòš îI&É$ùZm¦Í´ùã­Ž/;¾ìø2ó€dÙÁ_^ ‡„COz6÷lîÙ ,ÂßîOl,ÍÄño°Š‡Mù]IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-98.png 644 233 144 2505 13755454065 14703 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜúIDATHÇÍ–]H”iÇÏŒ;;ºDb¡VFÔbŲ}ÜDä …¸–™T R µâE¬Ð4PeD…Ðf¡-XÈŠøÑ… åG ˆi¶º,æš}­´a é¶“Œæ¼ïûüöbæwZ6v/›á<çœÿÿÿœç9ç}DDdqø_ÀždO²/ Ùöï¬õØôØô5õ!»BÛ~Ûþá3°èú¢ëKª–TO,Ûô›ñÑù"~4Ÿ¹.‹ÅZp68l®°}m<´1viÈþá>Ä5Å5½× àNÁ€ÆêÆjŽÃxßx€Ïåse›~3ÞÌ7ñ¢ñåü?øEÀÑæh³ýÎÏŸ‹ÀÊÝ+w§| ø=²2³2^ǼŽQvÐ',P.Àó÷g”múÃñf¾‰gâ›|&H@BZBšdçeçÅýJxR ÞDo¢Él.q‰ ù5?€ž¯çóÔ}u6°lÓoÆ›ù&ž‰oò™ü!=òñÙ^ÙbÄ ø3Aýž~À(6Š Ó*Q%¢´·Ú¸6ê[uD‰T cÊxg¼mLÕFA}©rT ŒËÆe‚Ìèzg¾Éá—hAëË n˜øa¾HOXXE/ž-<Ù÷Wø´WÚ+ žMl í`È3äò@yjyjy*ŒŽŽŽY:yyy¡´¸´¸´ž]|vñÙE˯êT·êFEqˆ/ÂÒcÕm[³ÈΓ;O†Ë(¶¯•A#2'É ‰møáðÃá‡"ÙÓÙÓÙÓ"·’o%ßJ9¨Ôj"­[Z·´nÉuæ:s"ììì"   "O>=úô¨ˆ-ß–fK_ÐA‡Ì™|óokXؽ°[5ÀøæñÍÖÎt—æÔœ–],–aûãí·?¶ÖwTí¨ÚQ‡Ý‡Ý‡Ý°!°!°!eî2w™Ö ¬X7Qwñ®~F?uäþ»HLVL©"ŽfG³©XÞÚÛ·Ú·FlÙS»§vO­ÈLÉLÉL‰HÆ`Æ`Æ ÈHÌHÌHŒˆªT•ªRd¶t¶t¶T¤³¾³¾³^$D*"íÒ.힬–]²Ëâ³øCzì"F‹ÑbÑöiû" \¦€ Ç׿k󵉬™X3±fBdoÝÞº½u"+N­8µâ”ÈLÇLÇL‡HrQrQr‘HëòÖå­ËE///Eú¯ö_í¿jáqœtÒ->‹?¤Ç.âwù]ƒ¿ŠôtõtEÒŽÙ/xaÞ‘”¾”¾”>‘©„©„©‘’Ä’Ä’D‘Ì ™2/ˆÔŒÖŒÖŒŠ8ýN¿Ó/???%²¶emËÚ‘üêüêüjK˜ý†xÅkâsÌâëùdWš]s—!†¬®œKšKšK‚79orÞä€êU½ª×º)Z¡V¨Âdüdüd<è'ôú‰¨«ô>|ÿÝ•Ÿžc³‘9v͸F€¥¸pÊPnåŽjÿ<•§ò@åª\• *U¥ªÔ(ÿzµZ­õã¦q“ïÿ×û—ÉOx2kz·Þ `x /A.q›Û(õK¸RýôÑU‘TPªKµ«vàGºèBá1<Ñô½' ÿÓ“Þ~+çíëbÞ¾Çæç öo¥¨0·tuIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-158.png 644 233 144 2740 13755454065 14761 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü•IDATHÇÍ–]LT×Ç×à00ÆRt°­^Ä´ÐÊ¥^mj;j¦.e’bn#™ÚÆFû`b‹·´¦Ú¤öÓ2Pñ¡Zm°i4ñ‚\ŠøÐÆ\ "X1b –ù’Èœ³gÿú0s挷IŸÝ/'ëëÿ_g¯½ÖÞ""’ÿ ¤ä§ä§dÆä”ÚúôWÓ_}¦3&UàxÃñƵ}õeÖ—Þ¯½_G¯Û²e·ü“ãElüd>K/Ùb+Ò¾MûÖ±!.ÕÏU?—þdLþ¬ÜgÜg˜ðö÷oð]ø»0ïÀdÿd?Àý ÷7€-[vËߊ·ð’ñå£ÿãÔRp܆4WšK|¯ø^yúݘÃͧa››àî²»Ët ¨) ƒ ½˜gkýž$[ö¸¿oáYøŸÅËG ç圗E P¨q ¸þ ìÉÛ“gñg€ù˜ 0çÍyõ¦z“%нº°eËnù[ñž…oñYü±|äÑÚÚ„®rU¹Àø Ô¸‡hº2Bú.\h JÔµ[íU¤ŠT¨¨Uì`;ÛA?¥_Ó¯¡Í‘È ‘0ôZ3ÇÌIüðO<¬4+M@ÇùíRŠˆ~éwÏ;a4{48Àëª×ð>ù‘qƱ×cŒsÌ1,±Ä’mÖ¦6µ 4²}IqÑüh>‹ü=†£¹£¹ÀC÷m÷íy§•O<±£ÿ…îø¸-ÖÆÆ6ÏqW+­À`ó`ó`³ÍszâôÄé h.o.o.‡–±–±–1˜[;·vn- :2t>Ôt¨ nüëFÛ6t¸-Æ—àçOì—ݼ{2x2˜pßn~ºT´TÄRí•ÚîÚn»àK/–^,…hC´!Ú+ÚW´¯h‡-+·¬Ü²ÊÊÊáÔºSëN­ƒÂ…; wB .P¨ƒUϯzvÕ³pý­kŽkkõvíëÌî̶ûe·S$³'³§¤LþV‘^‘¯¯8¾Ò 0 ²µ}kÙÖ2‘>Ÿ¿Ï/â,v;‹EFNŒœ9!2Ó7Ó7Ó'¢&Õ¤šÙÞÞ)˜.˜.˜™½4{iö’ȦÆM›E†Ãï ¿'²øÔɇ’fñ~éîKwE’ùsæÏ%e)"˶-ÛÆ:yÇ•ïÊ‘EDd:uŸ«ÍÕ&Rs½f¸fX$÷Xî±Üc"‘`$ Šèõz½^/RªÕ‡D‚FÐ"ûÕ~µ_‰„+ÕáJÏrÏrÏr‘ Ç/¿p\DDÎ˯ò«µ2-«\ƒ®A+Ÿ‘hW´Ë1$Êô›~qˆˆH޼(^ñ&ÅÌ3óÌ<G–#Ë‘%²peáÊÂo¥·Ò[)Rë®u׺E|u¾:_È@Ï@Ï@Èê;«ï¬¾#ÒÕÚÕÚÕ*’:–z+õ–ÈåÏûCý¡|»"=‘‘D>‰3ÆÉÙ“³ÀéXÍYaž3ÏÙ}VÑ_Ñ_Ñç÷žß{~/,œ]8»pJfJfJf k4k4kê ê ê à^é½Ò{¥à÷ø=~xxx@ 6`úêo»~Û•tÆ&;‡;‡í3ö箌ĻdÜ2‡ì®œý|ö“ÙO r0r0rÐîJ£Åh1Z`jÍÔš©5 FƒÑ m7«Íj³¦ž˜Ê˜Êõ¾:¬£Au¨àÙ•…_€{Ò=9ï„5¢¸¯Ç¨Xä,}Y_Ö—AoÖ›õæ$}Pu´G{´t™.ÖÅIöB³ÉlbQ$æXÙhðÀ}Ó}óOs,iòS•V•D“ÿªº ¤© ap”^zí9ħ4Ѻ[wën ƒvÚ“þ %æ¯ÿ£|ʇÁ¿ã7ƒ5ùÍ*g•ÓÚ©G&ÿc{W>¶¯‹Çö=öx¾`ÿCÕ»Þ È+‘IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-1.7.png 644 233 144 2361 13755454065 14750 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܦIDATHÇÍ–_HTYÇ3cþ ³„zY%eQ¡Z¶lCzh¤ˆ6Ëb¶£ K‚]q{k‹Ú–ݠ '×È&P&¤uQ³÷!Yd±-«yX%ÛYfî=÷|öaæÎ½­í.ûæy~¿s~ßÏwî¹çw€ˆˆ¬Jÿ x‹½ÅÞ‚Tì=éäswåî*»›Šo*ððøå+XÙº² °½°Ýštb{Þ^ï®qôÝ<;/«ÄIätåtyüéø"Zh}îšTüÝ0äÝÏ»ÿ‡ M=M=áŽp_@ôIô Àÿ?8±=o¯·ëm=·¾\ü_–õ.ëõü9Ù9Ù"P²³dçºÓ©¿®ƒ}{öíxé{éÓ^P¿ùäk?°Àö˜uÅö|z½]oëÙú6Ïæ§ü¬Þ¾z»ì?¼ÿpÞ­TÁä8³öÌZ›gÜ.s™|0ÌuD!zXàÁNlÏÛëíz[ÏÖ·y6?åGÞÝÛ+;à³ÜÏr `<ÆTCjÀº`]À°VX[¬-hýTêQ =¤õ (Ÿi™¨uI]B«‚ds²Cך9fNæ?æmÀ ˜¶Á+;\[)"Rqò¢yÑ…,Ì©ÄT"Ãù”¬B«¸Vsj裇—“ îÐ:j%žÑgJM)ÈðÓ~ÒÆn>‚SçNËÄó…ùô×ú–¾•z~mMmMmM0V=V=V½ØÅ³Òg¥ÏJ¡µ¦µ¦µÚæÚæÚæ 3§S:Æ¿ïïwôôHš—á§ü¤=ýB±P 8  Aû´„ùyÞ< £ £ £ÎÆ÷Ýè»Ñwc±±ákÃ׆¯ÁÖƒ[n=u‘ºH]Ä© >N'§©úm^šŸö#P0X0¨» º)º ¸þ.(Y•¬LV½Ê{•÷*¡$Z-‰BïÃÞ‡½];ZkÖšµ`ù,Ÿåsò·‹nÝ.‚@g 3Ðé~¥»tð­HóÓ~ W®°&`öÕì+×±ÿQwèÐ!Ò!G¯æXͱšc¶ÂVØròªBU¨ 'ŽuǺcÝPúºôuék©©©r½iwÕUuÕÅËðS~¼"ÖëgBĬ7ëED‰ˆÈjñÊ´L‹Hµl–Í’ÆŒ1c̈xž°'ìä§‚SÁ© ‡Ž‡Ž‡Ž‹í.Ú]´[dÛ͉m"ú…~®Ÿ‹x?öx DÄHól~ÚWdÁ¿àÿù'‘¡¡Éá„ü©Çô˜$=Ÿx6x68ÀüH~$?"²¼|yùòr‘Dc¢1Ñ(²·{o÷Þn‘¸?îûE"-‘–H‹H]y]y]¹S/RL±ˆ”j¥•$%;ͳù¶Ÿ<•IsΜfÐhçÅšcͱf0FÀYd‘³õ³õ³õ §õ´ž†XY¬,Vñø@|Àõnõ3É$eΛó.ÞûO¥«eúŠÝgÞé;ïéKÿ1>ç'܉ÿÕÇÞÓù0c©Gê€uÚ:A6Ùˆæí´oSßF=®Çõ8cžyàÖ°h!H ÖYë,†Tƒ.ý oQç_²ßÊ%{»X²÷±¥yƒý Ù9Ì›¦Ñ%IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-7.3.png 644 233 144 2441 13755454066 14752 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÖIDATHÇÍ–_LÓWÇoqXˆŠ¢î „E&ŽH0@‚% EÝÔ§Æ„efšEÔ «Æ4Jª1F!êÀˆE¢<˜9Æ}ÙŠ¡2+L‡JפýÝÞÏÚ_?GxØ÷¥=çžóý~{î=§W€Bˆ%‘O1+cVÆ$„í˜Ã†?®8®ø‹Æ°}C‚e—eWßiXìXìH¬O¬ ¶¾¯Ç›ó…0ðÍ|º_,†ÃÚdm²Fìs°{ÝîuqŸ‡íšˆwÆ;ýyxä!Àƒ;îð-Œuu|(üP†­ïëñz¾ŽgÆçþÃ/Ä>Ž}ly ÖùÖùBÀª-«¶¤|x‘;Kv–xæyæ© Y¨ >ô5n²õýH¼ž¯ãéø:ŸÎÖ#`yÁò! toéÞøºpÂÀÏp|Åñ:_Ð \à Aói>¹OîcT‡êÀ‚ [ß×ãõ|OÇ×ùtþ°ñéÙ^*ÂW, Fu©_µóÚyó‡‡ ʯ¥]ÚQ2AÆËxP…ª@0c…Ü¡ÁÐ hÊrJ­Ó®hW‚|/ßSa|”Íj³ê/™ŽR!Rk!~,~Ì÷¸¤KFñ·Cè@è“&Îi¦MÖ$“æ]¥)Mi€;vSÜ#ܸ#²SvF3¶pM¹¦Àà뉻ñ=sô ¨Ó¡LÏìÎuç¢9Ž,GÜzwëÝ­wÐ`m°6X¡ßÑïèw̬XïHïHï\λœw9\¹F\#†~Õ¬ÖG뛩óëzbÂuËn"¿2¿R~BË—‘‚<ß{J<%ÂÒ˜Ô˜Ò˜"DëPëPëûûûBô¼êyÕóJD׳†g Ï„Èwæ;óBtíéÚÓµGˆ"‘V¤ 1ö{…Åb‹={Pجó…ù£z áiÂSÕcYcYæß¬ºU7„rC›B› ïݤ»Iw“ ¬¥¬¥¬ef¥žÔ=©{RU¥U¥U¥Ðæoó·ù!ÙáÌpBï½'zO˜îâKý›ÎÖ# qQâ¢Ð0þzü5ðO¤í‹TºJ7¼ÍÞfo3$&&BgZgZgš±/›d“l2ÅŸõžõž…m[·mݶRóRóRó Yÿ²þe&aÓú˜‰ðGôÌZ1ù•–¬%öµ×>^û¹r7än0üSö)û”&Ô„šPPs¯æ^Í=(¾Z|µøª·æØšckŽÁÍ7¯ß¼nâÙ­G뙽+ÿÿ«à‡L·Ý¿©eÚU»jU¯êU½É?_­WëAMÈr‡iŽMº|.Ì2ÇL“ŸÈ$Ö‚] _È@¢¬”•ùÛÜFE‡pá5¨Õ 0Î[ÞÕœä$¨6åVnu A}²ÏŒo‹³Åé•údòÏÙÿÊ9ûº˜³ï±¹ù‚ýöŒŠê·§þIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-26.5.png 644 233 144 3121 13755454067 15032 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ÿOTWÆßG¡€JXhmb2%tÌR›P³Õ[!mì¢l‘b‹± d‚i"Am7YÙ¨i•0±È"’înU´Æ&.jSPpÝPÚ¨ŠØ…@8Ê·;sÏg˜¹¶ý<¿LÞoÏóÜ{î<爈HtàWÀœhN4Gúcóî`>ôÐ7VÿÃ×úÀôŽéÛ†¨ê¨j€e§—Ö»ƒ±Q7ú΋ñòy‰–`"ä\È9ÓÆ@\¹)¹)¡Ïúãc­æ s=ñ‡_ø5@SCSnn˜Ø8±‚±Q7úyo!¾TüŠ_³øS„, Y"/d¾™\êoèM†·³ßÎ\4¸H™À7 D¡6<klAlÔýƼgà|¿_@Ìë1¯‹ÀÖw·¾vÊ?Ðý”%”%|š 8Ìa"Àëñz|ù¾|æ@µªVL˜ u£ß˜7ð |ƒÏà÷ë n师Heä<Ìy*@kóvkqZè-Z—Ö…PªÔûj‡ÚÞ¼ÞNÐô}€ß®khh(ß_æOÌŸ@󽤕j¥àËöã³-gEÎ C`eFp+ÿ%"²ö8„yÂ<‹ïiëiv*M¥1ÍeZh%J”ø7Êx~ª¨¢ XÃÖ,Èßã÷€G<â€zQ½Èt š¾¿_ØÚã7V{U],2™ 4ýå» n·Û ÎUÎhg4ª£«£«£+È×»½w{ïv¨¬ª¬ª¬‚{‡½ÃþÛ¦5kÍZ3¸\u®:¨y«¦¤¦U÷}Íw5ßÁø§¾9ßœþ28Ö9Öz˯Ǭ~'"òÊyÓ›[j·ÔЏ/ 6ü™i]fÏæk›¯ÉüùߟÏ<Ÿ)¦ÜøÜøÜx‘ ÅŠ/‹8ƒŽA‘g‹³Å)bŸ±ÏØgDnZnZnZä—å¹å¹å¹%bßdßbß"Òülódó¤˜ÚæÛÏ´Ÿ‘ùGÿô,ö,6­Ù”¹)S„c~=êÃáNÛz‘Ílþ@ä~nKRK’éÔŸÞÏ{.ï9‘c ••"š64mh9Ò¤ÿH¿ÈãC=>$’““#’2’2’2"²R_©¯ÔƒÂz¦{¦{¦E&K&K&KDôd}•¾JdÓšŒŒŒ I¾¹Ì¼Ìl:%i¯N½:%b>y8ò°m½yÑKK>^ò1VʧwMïÙ:•5œ5,ã»î^¾{¹ˆµ×Úkí‰«Ž«Ž«)8Pp à€ÈìÌìÌìŒHj}j}j½ÈYÏYÏYÈõÔë©×SƒÂ¼6¯Ík),*,*,)H-°ØDþá`ñÁb‘³Ï¸>q}"ãÒ[[$¢_%šh¬¢a°«s0ùóäÏpëÓ»Ÿßý–Æ…þúTDUDVD¿™Æ¾Æ¾Æ>°¶Z[­­Á¼ÍasØp´ûh÷ÑnÐKõR½\á®pW8ì_½õþÕÁþõ‘iî47Ôhõ–z À\ý\=øV-í_گΉw…ˆHç^¸h½h…ÓÏ|uÿ«ûj—¹]D„¹´„´åiË!r_ä¾È}Иטט%7Jn”Ü€ÎÎNÈïËïËïƒ;ñwâïăí¤í¤í$´¶¶Bzgzgz'D}UU;œ;œÌÍT¨]pæö™Û úõ>¶Ú«P\^\³—üÿÊÿº4t † =?ô3¯TÂ/¾;ÙÉNÐ=ºGE¨D•¨AªQ5º ÿ­º¬.ƒzS½§ÞP¯©×˜VÉü„w l"lÂcáÆÿù˜qTfðל½9{A}áwfõ_„/Ô—Þ)ï£6×i¥Էꊺ4Ð@0É ÜêGõ#à©8áð  ©+Þïð÷€ó³Í²ÍÌÿÚùŸÞ³ò©½]<µ÷±§óû?ÊOÊ“Y¢s·IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-80-grey.png 644 233 144 6252 13755454064 16003 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü _IDATXÃ…—{P×—Ç¿÷vÏ{FPÖˆ oåúH4aÔh*w¢)4åâS&–X!ð+’©‰tk5À*?T‚ˆlaÌ*Ù£b €<å1 Ì Ìt÷Ý?œÆ*«R9ÿtݾ§ÏùÜs¿}û4IOOOOO‡OÍöôBWðwø;üV“þCúé?°é™}™}™}k¢Ùd6™Mþâ=!@¯dÙ8Š£8JRDhG;ÚìÄNìdÙªõªõªõ$•Ä?â5%Cdˆ í/ÊðÏðÏð¿Øš•˜•˜•Hz…`!X&¯?å~ñréàR,ÅRZ*eJ™R¦ô‹Ûáv¸ÓeVeVeV•v»{ݽîÞÚ«ÎÎÎ ?Öåêru¹¨^¸záê…«IêbÅbÅb°Èw‘ï"_@Ëó²¿ü¼o"¾7Ÿœ_æ‘ùxo—330ƒ´•ì ;ÈŽà\.˜ æ‚/s”8J%³|ýjýjýjŽ«ÛW·¯n§ž¹Ís›ç6“uªTUª*NÀ€N8á°Û±@ çøŒñã3°®¹®¹®¹Žy~Šø)â§iïÀ«¯¼úÎam°6X¼L-îwˆ;Vå2 ³0Ë­t9IKKP‡:Ô͘ÄWò•|eÝ)·Ëír»f­ Y²2d¥°Ôüùó|©Ñn´íÁLÁ,Œ…±0ðè@:衇À(F1 áH'é$Ð~ôƒ·l›·O{úÛÓß [o_¹}åöþ7¥F©Qjî^Ö ë…õ¯Ä㼂WŒPÍuÍuÍu@1]1]1ý?.;/8/8/ÌZb1‡˜…u–DK¢%‘ÿÍ8Ý8Ý8SÄ«âUñ* ½%½%½~ä9GΤ›t“n€ 2GäyH¯I¯I¯ãÅx1ðôôÄ9~ÈÆ!…ur~™Gæ£Â¨0*Œ¾¾Èý£ûG÷‰ÿêgö3û™Y¨ù„ù„ù/kÄ.ÅIqR Üln67 GéQz ÇÉqrÀìÁMhB€Ä À{xï´„–Ѐ;ÅâN,%°äøæsæsæs|©ßF¿~Y¨Ì#óQÁ"XÄ?6zb<1ž ¶!¶!¶«¥ÆRc)”’E²Hh>ͧù@ÿ‡ýö4n8Üpè|Øù°ó! UHR€ `Àe\Æe`0|0|0¸Q£þF=p×}×}× P5Q ¥IiR Æ#Æ#Æ#PÆÞˆ½{«e™B…P!ôŤÉå“Ë'—#{^ì¼Øy±¤vØa‡@ÑcôÐ5µkj×TàxññâãÅ€²UÙªlœ*§Ê©毙¿fþ`Kë–Ö-­À“óOÎ?9o+ÞV¼ püáøÃñàzÑõ¢ëE`Åý÷WÜÖ¬X;Ù”óÂç…Ï '…—ú/õ_êG¶#Öëˆ}1 û†÷ ï–²K—•.+]ÆdsiBš61fE|_Ä3V°¬`YÁ3?v»ÿvÿí~ÆR*S*S*³él:›Ž±“ 'N&0–OòI>yæß¢kѵè;°õÀÖ[ë+é+é+aÏ›Cæ‘ù(>ÃgøŒDÐ2ZFË&V¦‚† ˆz#ê¨7€I“&7soæÞÌ®½{íÝkïÎg„PÆ)ã”q@ßÔ¾©}SÈÄÈÄÈÄgqf<ûãÙЛЛЛÀƒÚµjñ¼©hM  ¾Ç÷øžDP.€ àØ?íKìKìKÐ%|$|$|ŽÖÓzZ&?éóÄç‰ÏÀåŠrEõwêïÔßZzZzZzý6ý6ý6€U³jV ô³~ÖÏÃÃÆgÒ Ò Ò 6a6âcñ±øxbZÎÇ9n:n:n¢‹†ÐÂþÉ«¿T©þRÈéòïòïòçÿ³qNãœÆ9$uÑ׋¾^ô5\‚FÐhÏ~zöÓ³Ÿ«V5¬jLå¦rS90Ü3Ü3ÜdoÎÞœ½ˆ"„¼x/ð0b1˜000€6ÐÚ°–Ãrò˜<&Ï@]Öxk¼5Z«Ýj·Úñ•ºKÝ¥îr(Ì0Üq”OçÓùt’z1ìbØÅ01ÄÖdk²5AË»xï‚]Ñ¢hQ´#m#m#mÏ*äJr%¹’ºn§Ûã˜qÌ8úúú7¾¹ñÍožùÿ™ôgÒŸI€°MØ&l‚–-ZŽqï´¶º¼º¼º\ZJ¬ÄJ¬( "‰xLI æÌ)˜ô]é»Òw¥ø¾ã}ÇûŽ÷f„5…5…5‰);Ûw¶ïlçrZ [ [ 1^6R6R6¢hÀÃ<ÌÀ({”=Ê$ú$ú$úCÎ!ç(¨/¨/¨È:²Ž¬ÆTcª1ðò—¼|,®.®.®äŒþŒþŒ^r^-¿Z~µœjµ¢VÔŠÆ{ª9Ü××xCäóT”ù&@Ÿ–´ÞÿçÕnEôÙè³Ñgs6¨“ÔIꤓYCCC¼­<½<½<]Lñ6Ò>;;;8^w½îzÝu²UÛ¦mÓ¶Rˆ"…ìù…ßÂoá·¸^]º8t1ôæ{CþŽ<ÏÅá/,&&&&&‚wØÌ”LÉ”äß{£z£z£ð_âLq¦8óª  U…ªBÿ-ÿñªÇ«¯ò=k»e»e»Å¾n<Ñx¢ñ„¸|Ô3êõpÉŠŠŠÍ`E¬ˆýw5TPAÅÝÆ 1(Ê;à-”ð<Áߨ_h75¨A˜Á*Y%«Œé¤gèzæCÇÞ{sìM)JQ¨(TÒ[œ…³p–Ÿ®„ ;vfMŒµÓÚií$ÿ#M“¦IÓØ1oÜ*/ ó¯8(þÆžÓ®÷¸3°»±›o ‰$‘$^c5¬†Õìß® Òi‚è-®›ëæº{‚¤/¤/¤/v=l‹o‹o‹ž"ÔOn,]Çñÿîš(Ê×ÙþIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-38.5.png 644 233 144 3116 13755454070 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–ûOTgÆ¿3ÂÀ€UŒI#­bÙ ”J©!Tk/¨¤¢¤—ÄË”¥jv·³Ù¸q£‰!k«xI€Ý-†Ô‰m‰›šF‘´E»b3Ht‘ÖR.2J¹ÌÌ9çýì3§Cì?àûËÉ÷ö<Ï9ï9ÏyDD$!|°¦XS¬ B±ug$[[¸âß¡ø”–RKéí¿ÂÂã $6'6ßGb³nöωàÏå3ó’ ‘DLkL«ÅŽÂÖW¶¾»8½vÝ3¥Á®K».\<{ñ,ÕðS×O]Î 'Db³nö›ó&Þ\|9ø¿D·E·Yþ1¶›¼¸áÅ ©{B ©à*rü0ï‡yÊ ú(0ŸùÊ L2‰¹ÆæÄf=ÜoΛx&¾Égò‡ô$¿‘ü†”T”TØ›Bߟ‡–~°Ôä z€Ãf>h“Ú$€þ¶þ6~PWÔ,X ›u³ßœ7ñL|“Ïäé‰lå´ˆHÝz(ë/ëã¿ÁkÚƒ`j0”CË×ò †•*ã±1fŒö@ÔA¥«t•ÎoW'A‚(ýoõÌàžàЋBø”—%•%™ëÖG¶²CDÄñ!Ø'í““QÊè¿Ö ø;[@e¨ ¦yÀC‚ªT•ªh¦™æ9ÎqŽs€'Î9ùžð„'*M¥1®n0_˜?$Ìñ¡0,"rêªbwÉîÍxõ»¡^W¯ ê3êõ”W÷¼ß­Ò[¥·J¡þ@ýúà=ä=ä=ôÛ¼¼¼ž³ž3ž3ÐðfCUCêÌ7 _7| ãGt¿î7^…êת_õfHè×ED¾ý3|úɧŸ@OÑÀóϫʄ#Ï¥?—Ž¿xcq^q8ŠÅŽbh=Öz¬õ8pàJòKòKòaùÊå+—¯„;EwŠîE„···Áâ¡ÅC‹‡ÀUéªpUÀ»]o¹ßrã¿·r˜0T%\¬½X †7¤ÇjÙï‹÷eçŠÄĉ<þìᣇ,MhðýA‰Ùùû…; E’%-JZ$âkò5ùšD‚=Áž`HÁù‚óçElllD¦nOÝžº-¿.o·Î['â«òUùªDŒx#ÉH)xiý¦õ›$&õ»Dk¢ÕÒ$9¯?~ý±ˆõтà gçFYoÙ^°½ÀËbŸœ´ÈÆÙµþµ~ÏÍ˪Ϊ–ä­K·¥lK ¼H ¤‰«ÕÆj†?ß!ÒÑÒÑÒÑ"B6Ùd‹ˆ]ìb3†Ãpˆlß¼}óöÍ"ëÆÖ­©]Wó^Í{"öÁ…7Þñm¿¸v»vK²q„nºyYô举¸>Õ Ú@-üó‹†Î†NØø— Î s^â5ekÊÖ”ÁªË«.¯º …ÅÅÑzæéÌÓ™§áhìÑØ£±`”åF9xâ=ñžxØ¿bÿŠý+"ý¹ rúrú !ØÕàoô7‚¾,n0nPµZ­¿ÌdÎdÞìù¼ëó.‘­_U¬<ÈŽGߌ~<ú±’ú’n$ÝI¹›r7守'Ú퉉>}2ú¤H¢-Ñ–hÉèÎèÎè)¼Wx¯ðžHNjNjNªÈ’¬%YK²D:[;[;[Eþ˜àNp‹ün0­=­]ÛOìÐvhì¹”{)WÄúí̲™e7{Â>vê*íî(wTä« ücÆ9ã„‘˜ŸgžEé-z‹Þ¹cÍ¥¹4ŒLLLƒ!†jŸÚ§öÁ˜{Ì=æµWíU{A«Ñj´™™Bǃ[‚["|Üw;ÜÓÏN]>{ÊǾ ùŠjúÕÇ*TÓj­*RE`Ü7î÷A9•SÍÙjåPåÕ«zUïœ|‡úR} j“zG½ òTÓ*5Œ¿´¿¯¿À>aŸ˜Œ¢Ûô1Óùý¦ó–Ï+Ÿü)äÌê?šOógôõ#ÎÏ)>â#Pí!bi¤ð1Á¨>uSÝFÃý'ô!}ˆ êІµaà_aç§<ª< <íüÏî¿ò™=]<³ç±góûR¡Î69‘7IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-184.png 644 233 144 2645 13755454065 14764 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜZIDATHÇÍ–ßo“eÇO×umãÀ±%:`î¢bL¼Ð@û¡hl –e™rƒÉ SÔ‰ÆHT–l,öb‚&›#‚f€ ÌmÙ¢^È–HÂʆLG¶â°}</Úgo€ç¦9ç9Ï÷û}ÏyÎé# ""™_œ@N giÚÎyÝñû^ð½ðøwi;b+ì ÿñuOÕ=å[ž¶¿ÿ)ÿ©MØõã®N~{ò[Þ€é‘é€ÛU·«À±õ¾Ž×ç5^6¾¸_ÄîÄîøÿòÿ•ÈÕz2Â"C°§eO pÀ~Z4šfGGgmç–Î-0 …£3£3£3p¸åpËá¸Üz¹õrëãêOW¸úôoïoêor2ÎÊ4wö¼µç-]ÚÈPFØïï°·gGÏŽE;ÍCɵɵ$~mèoèw >äòyáJÍ•š+5PZWZWZáD8NÀê±Õc«Ç Z-–;ª=ÕžjlüzcûÆöEwÒ>æãbÏpϰöû;K^ú³ê¥cê—©_ ÔÚÿæÿ›‡ãOB 9Ðh†;vÂxÑxÑx”ä–ä–äBÇlÇlÇ,”””@¬?Öë‡Hq¤8Rì|ضÛz·õ:9ãÙåÙ%¢õäˆØ}vŸ+*–2C"â‘byV–É2 e§ì”-â]ç]ç]'r1x1x1(R. —…Eú*ú*ú*D|¦Ïô™"ÝUÝUÝU"ñÆxc¼Q¤{C÷†î "#7GnŽÜ9öÁÑÊ£•"®ÇÒ|êÃäoÉßDõ,Þ1zæzæ€ï35/4O›§Iê”WÖTÖTÖÀÙ»gïž½ë”bséæÒÍ¥P¸¦pMá///‡%7Jn”8qíSíSíS°éò¦ ›.8w O†/Òs¨çÐ=wì¾®LeºdÒŒšQ§+çZç>›û R­©ÖTV×™f…Y3E3E3E`í³öYûìÊd Y’,ùç_› öçöçz,ÙO/òßÛ•Á6ðOû§¹³bÖ"ÞK`ï°w°ÀÂ}sVͪYP>åS¾,ÿzµ^­µ[íV»A‘™w[xŸ÷qûûøXãOäOä–?î?0Dz&?µÞZ/`g&3Ö¨5 x­F«ƒƒ fÍ¡_ñ¨óê¼:tp„#$Lñ‰·âþ¾Íz$ʯÞY7{ÝlËàç¯ÚWÙ+"òb8ºÝá)|+óV&äSc¾`¾ÀؤP¿êQ=Àf6³9ÎÁpÔ°VÃqñqÆÄêµ`’/ºZ»ZaG8<%jìŊ؉Uµ0RZRZj/€¹Ô¢ñ•øvùv¡Úoµw¶wÚôEEEp(óPæ¡Ld²ÙŸX÷ôîéÝÓ¡rEåË•/ƒïþW)_¥ N<ý­ù­ Žõ–ô–˜K¡ìÓ²OÁlú^ ì‚3¹grAß  Šßmݸeã&¬i:Þt¼é8ܹ7roæÔÏ©ŸS¯ÇëñBÆŽŒ;àZѵ¢kE¶±ÆE‹Áò Ë7,ß× ~*øiò4áû£¦º¦ZåХè—£~„ƒ®|W¾òCÿéþÓYˆ7œ~édèdÒGÒ‡Ò‡ µ®µ®µ¡¼°¼°¼Ð6°øî⻋ïÂác‡>fÇ#y‘¼Hž«çVÏ®ž ëO¬Û¶n[ÜÑûfõÍö»r]¹Ê/0í™iϘ\ô ú@˜l{V®(\QçÊΕ+³y:r:r:r`IÅ’Š%àÙîÙîÙcûÆöí{üJCgCgCg!3˜Ì µÅ-3ZfØcƼ0ðåÀ—`ùt×U×Uåç‡à`pT×£„Ù¹ÙžlÔ©;Rwz¼=Þ/$‡’CÉ!ð^ÃkÀèåÑË£—!r*r*r nnnÆuéQçQçQ'¬\²Ò½ÒmÇÍÛ±/7ûRûRˆëG×ÊŸ(SÂyá¼ößd¢ùJó‘„e""¼kÚHêÆÔ5©kDœn§Ûé¹1~cüƸˆ–¦¥ii"µ«kW×®É"‹,DªüUþ*¿È¦ÚMµ›jEô?èÐ/r}çõ×wŠ<_0·`®X+BVLo~Óí¦Û"’^^Õþ›Ý•ZéžÒ=À=«+z£B¯‡¶†¶¢´ßµ6­ "Å‘âH1 88pzƒ½ÁÞ Í 4áaÃÆ‡ 04ohÞЗßyßÿóž Ѹý’ÂŒ_j”Œ’QâF¢'œšpj©e EETDåÊ_hÍ¡9Àø²VG"‰$2÷µ:ÏòY=V?¼¿4œ'”o m¡-¼=|=v–xJ<%ž²÷q[¹­ÜVÄ333€Ó7 nÜÖÜ[soÍ=`uæêÌÕ™AŸ­³x–Ïê±ú¬ßãyˆ_î'5ñCü?äšÃv(¡$¡$¡D©Øwiߥ}—´Iƒ½ƒ½ƒ½àÅ0†1 À\€îÖY<ËgõXýð~IMç#ódÞÍ»y·ë +y!óBæy‘Ãïð;üp `Z𖦥AVª”*¥ Pæ*s•¹€bU¬Š5Ĭ³x–Ïê±ú:pXód³svÎN$îwŠ;[¾e –:Ë.Ë.ÙªƒUj Zå–±æ±f@sù¯ú¯SãÔ8@:¨·1µ_í4—¿ÇßÈ-¾E¾E€V©öª½da–:Kµ¥Z¶²þŒ‡ñ‘á®á®áîÊy,À\cÞaÞ¡%;8ÝN7ê *ïùóýùã›l¡¿Ê³Ú³€¯ñuàÕ*µ¨ýy¼òžÜ 7èî ó+É•„‡æó;æw´dÆÃø^á^i-Óº´.­Ëœµ+qW®êÎ[—÷jÞ«\¾"ÉÈP´øC“¡‰ˆÆ~(û¡Œˆžj»×vˆhØ1ì "zú™§Ÿ!""/y‰ˆ¸J®’ˆè†|C&"cûwíßј»ÛÝMÄg'¥%¥)’'ä‘qê¢)·¦Ü"ÍxÈø©ñSºuæÚ™kg®q¿çKy€æ‰IIIE]ß²¾e}Ëô“‘ÈÞپɾ Ÿ{05™šBý×_k ݳŽèŽhàwò; ¦1¦è3ú ÀàâžÅ=}ƒ>=Iî[֛ћ0ÆÇ@ÿ¼j÷ªÝ«vë ^Åù˜Àãßëß ±ŸÇ~==¡@ç¾<÷e(pwAw¬Ü·r<×ö\[hüíÂÛ…!ñžý×÷_Gh ¼Œ‡ññ‘šeÈ5ärõ3ÒFª¡"ú•jSmDD§=œFD”Ò™ÒzS$Ö'Ö‡ú]Kº–­°­°UHRèºzB=âFOOÑá°ëÇh8j8j8ªü¬(Ž»/¹/¹/‘ÃÇ‘ lR¯«× ´!Êå'¢¡-ó¶Ì#"z{ÝÛ눈ò÷çï'"zÉø’1´Çè•Ñ+DDå#å#DD/f¿˜MDÔx±ñ"ÑœÄ9‰D4–5)kÝ.¤B"â¿ <.Ëã"ã#ÞÊ[y«ÿ§À×Ür°ì`Yˆ¢TI•`äÄÈ ¾†¢†"Èù*ç+xwÉ»K@(ŠÀ~Ã~†“†“ mfÚL0ž5ž ï¶ï¶€ü½ü= Sg©³‚ýÎÕŸ«?W¯Ï¥sé\ºÿ'æ ó…ùÛkÙuø´Y3kJ’síí+·¯¯-'ïbÞE(--- ±¥¦Ô¦Tˆš5ú~ìûÞøø þPü!è©ë©à ¤½0¼}x;øcý±ðy1?¤nOµ¤ZTý Ä ±BìG):7:7:—H_ë¸uܺ盹V®•keZQˤNûIûIHºvËÕ 50‚>m±¶p ×B¥* åhvÍ”’»ÕsÂsHŒš‘;#Wþ£¾“Õâ4qšÍ¢£YÉJVÑdÍ¢,Ê«ÉNv² á¾p¿â VÀÜl~Ýüºlr¾å¸ë¸ª]¹En ÙP ßà^¥R© Ér' ÊÉr2|²‘ ýã嘗c”rV_¢SÚ·9nsÜf"ÞÂ[x w,@·ža>ø[(Üîw¸öämÉÛ’·J %†i‡®Ý,K–%+T»ªMµÁ $ýèG[™©ÌTf÷wÏ‚= ö,ÐrX=ƒÉ`2˜Ü£ã¾9*ü¤¹Žˆ£'.½Ƶë<Ô®­ÊV¢]“l’MA õ¾z_½¼vºÑn@šØ=±{b·V k2šæ£_ùS„÷Fðéñ„=Ú-ø¹v¥N©3¨]¹sü¨Ùd=Š{÷(˜=0{`ö€’¢kñ¨pT8Ú˜Á¤^$à/è  `‚ÚõžíÖ›ëÍõ²ÉÙêlu¶ðÁ©­ÝÖnk^;b³Ø,6w~’Lü{DßÀsšô$ÀHc ¯´ÛöŸ´›ŸŸÔ®”!eH8<¾®é'ÁsÅ\ñóÛÃÛðý}9ú/íIÚ]*Ô µB­k..®)®)®ÑÞOKK“¯éGí<‚Ç–@-ÔB-¸vgD?#ý©Ýá~öm®”+åJZNËi¹ú>žçãŽ8âèo½‰ÞD/‘pY¸,\æþH,Œ8¹ÿ›™ôÿr)—rÅo×ßZÏk¼Æk×ÁupÿúõøóRx爨ûÄ£þ7ÁCéµõµ‚ýIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-28-red.png 644 233 144 4234 13755454063 15606 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜQIDATXíWkLTg~ÏeíbGH”AcØ•]%Å ©‚:ƒ´Ñ4¸¤b€¸%åGéHLLˆVÊeÑÚBhˆXuÂÎ ‰T‰ë —&Fhw›IkFaSŠÜÜáœ3ß³?f¾3—ÝÕlvß?sÞï½=çýžïýÎùe…‰¸Æè4:Ná…¨iÓ:¦ud­”5Y“µî”J©” øÍ¬†d’Iæ:®³îÏãy>ž?¼ž¸&O(¾*¡ÑnM’;ä¹ÃñRØ'ìöé@L1£1£1£øËö'ÛŸlìèßÑ¿£ÈÉÈÉÈÉêÜÎýy<ÏÇóóz¯ÇCâêp}á—â¸8.Ž»Sy‡â ã ã µOšï4ßi¾ÃÞ A‚^á^pà 7 ë;÷çñ<Ï^oá—¯ÇGæ™â€8 ¸/ñ·2neÜRWõ*½J¯‚^„%³d– U+×ʵr@[ª-Õ–Z¶–­e‡è;÷çñ<ϯ«ož©C‚CpÉ•r¥\iÄ,5–jKµš­+cu¬cª}ªiª `nå™ò À”V¯Õ,°ð!\¦|šO˜[q).@µ{K¼%+cñ,cÜÍRc9b9¢fóúÇG†ç†ç†ç›Ó¸ƒ¹Â\a®`‰}¿ô=ï{Ž‘@ž1­VùIù à‚ –Ð_å»X„EÀY# ÿê¯Õ*P‚êXß/î·ÝocÄ\a.7—³DŽGÇ'ï‘÷È{îUrCcAc~c>û(À£:”‹ÊÅ ^×u×uh¹ÐrÎ_<&ê&êðo䇴Ò esËfÞKg.uBT‡V©UêΞƂƂÆö‘ÞÙ0|Äc–Ä,‰Y‚š—Y/³^f†0 ü¯_-ñ¡øbêbê€Ú©V%®J6̆àšrM±Z¬€™;gîüsÀXNRN ç÷‹ú2kÈ5ä8Žýã¶£ÛŽn;|3­W9 0È—ÖT®©€Œ÷3ÞÍݳ­g[œë=× ¹Å¹Åv7ín¨ÿÍ 77„ø>Šh½a€=Ç'ŽT’Áj°¬ú3R‘x\maßï{Îõœ ޶.¿4¿͇̇°gÕϪÃhÕìi¯Çë€y•ó* øAñƒP·ÇÎÇN[x§í÷í÷á°ä`ÒdÒ¤O¿¤X)VŠýj„¢¬QÖ(+‘|S¾)ßlÐ~ÎÆÚµZ)0f³>›)Á”/œb‘XÀcÜdÜb·ØºÅŽ6G\o¾ÞzÊ… ¡Àˆ_÷}µéëM_ƒjƒÚ>Ø]¶»ÌçÑIERÑßrýúŒA —øCŠüX~ìná¶ò’®’.¶¸ÛÔèf­YNGŸŽ0fï´wÀ :Að¤åIKH½îFw#œI;“h—ç\žìïŸÇõŽz‰±J¬«&³„¹Â\aîïš#JõóµKpŽõMB«0W˜  ……¾]ÜÜpêÜ-õ}èû0®0Ëb­hØ:VÊJƒThíÿ¼ÿs aº9Éœ¤îÑ;ù©´WÚk³èв)›²esk&eR¦ü)9ÈA"iPz =øä‚~µ6ÅKñ’jê;Ð3Ù3Ê]ŪX@‹Óâ0vˆÀIçôÝ÷ÝX®2®ŒÃ ` SÀÎû;ßÙùŽVªß@¯äAyÐy$noÜÞ¸½D¢E´ˆál]‡ù«Ào®ôTz*=:÷'îOÜOd(4 GtîfZ2-™šÞŸÍgóÙà…N8 cÃÁÆj‹´EÚ¢àØ©_Q¿¢~[§ßå&ƒÉ`˜ôëæéá;-\‰Øz"ÔÛáºyº!ÅbHé;ä®­ÜVÎÖéSǤšTSï…ï…ïE‹.ÿ·Œs†k†k†‹m×9%F‰QŠ bC>#½~Aªáî.a×úíB«Ð*´ò9çûØÙåìrv¹«v©]jW¹qqqÀâÑÅ£‹Gµßè\l“Ú¤¶ºtNµõ"¾Mo Oäî 4ÂÝcæcæcª©¯µ¯µ¯€^x1Ê‘Ú:m¶ÎàØ‘›ä&¹ÉøK2ãnDÝÀ:½õ&€‘Â>p÷üâîÚ­k·®Ýä®3Ý™îLÇi¿é;!ä yBÞúƒáeÄሺý—ò&ª¤*©Ê½”Ϋȫȫ`JžJžJžRÿªoõ 4( ÚâÉNv²S`ìH}õŒô?J$w„ëk{„ÝÂna7@hmðýVœ'Îç $ÐõÛ žO‚Çÿm%Ý®s#vîÿ&&ýÉJV²ÊÂÍ D&2‘ÂáŠpåïóýë¿vFìLoDÞ7nõ?ót 5^IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-78-red.png 644 233 144 4204 13755454064 15611 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü9IDATXí—LTWÇÏ{oÆQ Eg­  ŠŠ«¢(5]ADv4訩%nhÖ´+Ú´%ÁµP+›¥- éª+§6¥J³TËZ­M¶jTںŒ‚‰‘_.̯÷îwÿ˜¹oÞLºšÍîùgæÜ{Ï9Ÿwî÷Ý;C´aâj“l’M²ð¯Ð@Ì”–)-SZÖgƒbP:>¦ Ê  8ÍêÈ@2pˆôY_Ïãy>ž?²ž¸:’GÏWFeT&:#çãS -†C‹ó±°OØ'ìÓ@âÌ£æQó(þºåΖ;[î[û¶ömí ³ ³ ³Ã>Ÿçëy<ÏÇóózOç!ñW‘~ò‡â¸8.Ž»3x‡KKK”7Ž]=võØU6}lhlhl€ &ðOð€n¸ÍÍóõ<žçãù#ë%øt>²ÄŠýb¿Øïnã ²¯d_ɾx©×ßëïõ£!ci,¥! T)UJ ,S–)ËŦØ›ÎÍóõ<žçãù5àˆú–X Mp NÁId8d8d8ÔÜɬuÖJkeÀ¦U¨+Õ• 4{ÀÜô@:_ P$E ªßªß"l>uX˜ÛßíïÍÞ2oÀ*X"KÄ_f­³V[«6^Ÿóp>2Þ7Þ7Þÿu&_`©±¶f)®G®WFByÆ”÷Ôu@0†@¸?€ILê]¶“íÔ£#MyÏ¿.›ë‘ûy÷ó±ÔXª,U,…óp>ITDET¯³ì»aÉ9œTûEíÔ½¡8^þòÖ‘·`sS?nûÊöd½˜õ¢~ürÞå<ð`gbg" ôFOpÎÅç………a )ë”uʺÍųx½ß³¯gˆ/ˆ/€\*—êçëLu&ˆ;wNØNØ`ÛÚmk`ùË?0>ôhè ˆ”páòÂå…˵sûsÞÑ¢¬†¬†¬ôxyÀYœÅY0üyÈ0¦ä(9ú\ŕŕ?ž?ŽŸ1§ÛéÖK"Ýœnc…±€wÃ¥ —tø}KÇIœãÑÙ3³gfÏDç#Ñ&ÚD›€_uÇËŽ—/ÓI`ª?Ö««ïý鵟^Ó´Þm½«œ¼9yf|6ã38øîÁwõ*ìËíË Ç+gšv6í ×»TqäâˆÖÉß éBºî i…´BZQY˃¤ùIó“æ+É®m®m®mZ‚1¶–­Î¨ÎÀf¿=ûmð7ú#$RÀ `NéœRØC{H¯¾ïåïeùƒ6_o¾ïDhzieª'Õ£j€/ÅKñPLnLnL.‘á²á²á²£_;ð ­3¬3”ýb! Úƒý„œÙšÙ `¢ « Kè;ë;«÷?½÷é=>‘>0&Ô5F‚ùÕòOäŸF äÆîŠÝê„X*•J¥7·ýiü­ç–ØhL7¦ÓÝâöªò%åKÂý Ì<}òôI0 +¹+ºƒœ]d€)LÑKåžçžNežÊ”]_Îþrv¸¿w68‚ý%ÄZ±V¬õ¬æs„9¿<(ýC»R‹…b¡x]“à‚ƒkE}]n—käÈšv÷«¢*â!oԻĴSÂÀÖ²ýlXJý޾÷ûÞ’¦ZR-©ßi|GÚ+íµ[54ÙÈf°„Ys(‡r ä$’¥Òƒ7ÎkWk“e£ec ÎõfOSO“^»ìeö²Á»‘‹NVTØvÿ¸^>ø€×wÌÚ1KÙ¯ÝíO ƒ†A¹:aoÂÞ„½D¢U´ŠVáLˆnÇ|.ô¹]ê‘z¤¡5¥<¥<¥œÈXb,1–ÈÕšvs¬9ÖEëjWíª^È!Æ0†ÃÜÊ"e‘²(|ì4¬lXÙ°’­Õîò8cœ1®ßúµ45r§… Q[OB”ûM¤o™Ô®ëLX»ö*{•N»q¸@\H}¨>T†µØntò´îiÝÓºÙM“1bŒóÊØÅg¢§H QÚÝò3Úm—ÛÃÚ ´ÚíáWi2a2a2X2ºdtɨ²PÓâié´tú«¸ÔBÒ‹|žžaá7ßÜ|c¶XÊ÷²NÖ‘Ó …êì:»Î†í]Û»¶wyyU©*U%è£ú¨>ú?ðmV¥UIŽ_]=£ïúP„ɧ“O'Ÿ†ü”#â}Âwª}ÏOÄëÛÖ^i[Û¶6¿²¾¬›ÖMý)iNs²H²Ÿý*Œ™×3¯g^K-;Zv´ìî%î%î%¤Akд¤é»Ów§ïùì§‘FÉðB|_/¬¿µWPz¿ô¾{ƶŒm ·Ür‡ü§sÁivšæ`5ÓŸéÏôCQMQMQ $[“­ÉVèzßõ¾ë}SEUÀð à…øþ0úžŸ")šŠ¦¨”ŠŸ?·ŒåIIªPB’%KR¹ÊUtÀyⷸʮ„ Ù&߯_øÉ¿hÿ+ííbÑÞÇç ö/Ù÷ÂCNÜÑIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-39.2.png 644 233 144 3007 13755454070 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܼIDATHÇÍ–ÿOUeÇPÁ{Q@g¥’·@f¢ :šÞ2ðMëfüP»$®åk\]$ –K焱ÄYùVCÄ ¨X¶EqKsä·”ë7_."Ä¥ë½ÜsÎóê‡{çÎþÏ/gïÏ—÷û³ç<çý<„BćÞ"##cƒ8²ÈˆÏÌ™ûìçAü‰ /E¼te/ÄÕÇÕÌùlÎgÚ5ëy½>¼_ƒ?\O‹xa¢›£›#¬!¼^yî•çf>Äw©ÕÔú¯o}õÖW§šN5±†ÃN€1ë˜ ¬çõz½_ç çûÑf|3㛈¿ :*:JHÊIʱ¼,¸iMë7­œ68MF€: Ìb–´<èϽ0¬çCõz¿Î§óëzº~póÖÎ[+¼ZðªéÓ`õPþtùÓº^ ¨¡†Y x€Z¨âÙ%»ˆ  ¬çõz½_çÓùu=]?8ñ)½Bq ¶\ßr´Ën¥?` X@¦(/*/M*µQÍ­¹A¹¯ÜSî,’E²ÂÖn˜á‡HÊÅÊ Ê ”k§OÖä×õ }ýSžBˆ”Ã`ò˜<žéR»Þ}½¨ dªLÅK?nÜ e¡,Žr”£aƒd“M6GqFXÊA9¼Ž;€\'×áe_އôBútçÜBˆO~–ètÚòKlúcL=˜|0é ¸|.Ÿ!xqÑÅEA]f]f]&Üî¹Ýs»ÇÈkeZ™Vf`W‚k¾k>zæPâ¡DdOú¹ãçŽzrª8¿8ôy„ú»Bô”A[K[ œ[3áf‚´Ç4{Éì%ø7WnÞ½y7$g%g%gÁiçiçi'¤ô¤ô¤ô@FoFoF/$—&—&—Â@Å@Å@…1ÐåŽË—; QIT°V[V$nO0'˜ñ;÷õôH;´U·Uƒ>ÐÒbÆcÆe3L~;ù-tj?Eÿ ެ S… ÚWµg´g@Ö`Ö`Ö Ý(ºQtrjsjsjVøVøVø nqÝâºÅFü䎓;Nî€ò=å{Ê÷ñÔ«KŽ-9uÛŽ¼yäM€©ÝS»AQÍgÌgd³€9³çÌÖ®2sôïÑ¿­ûOåxéx)ä6æ6æ6BZ\Z\Z´·µ·µ·ÁêÔÕ©«S!ogÞμµ2jeÔJh¬i¬i¬á«ÐUè*„e‡—^v¬ï¬µ­µ÷ÃÀX`Œ{0¶ul+HO¼ˆÚU¡Î3ÿiþS6ÃÔûSïáΆ_~uŽkŽÕ ^Þ·¼oy›‹ÍÅf(i)i)i†5 kÖÀËË tØ:l6˜¼5ykòœÏ;Ÿw>b–Æ,Y ÕÞêÉêIð8'LÍ~røI ?öxìqÙ,d´¾ÇZ2[2Áýž/Û—-íϯK»“vÿÜïç¶ÎmÛÛÛèÛØ·±o#ä:s¹NX¸aᆅÀQæ(s”û‚û‚û¬r¬r¬r@åÙʳ•gÁÔiê4uBúüôØôXˆý2&?&ÿç:t‘vè°wØA9Úc¡³ìg~(™^2ÝøK¦ö?°>°ÂÝè߈©Ö«õj½±‚þ ÿ„FÒGÒGÒZj©­IkÒšà¾ó¾ó¾¼»¼»¼»`´dôÑ7`¨HR‘îwûíývxp;¨oO½=¼ú+iÄÇ~ úŠüô¡m“ÛðÊ ™-³AFÉ(²JVɪ0¿J’I2 ØÎv¶‡m®‡¶¬´H ÞȇG| ÝÇtç÷ëλuÚÖiÀ® 3Ëï”qehT‡Ô!Ãù©b/{Aþ*»e7p‰K\Ü 1rLÞ•w—©¦)¿VTE% Sͪä‰óÜòÁ–ô£)Üùß³ò±½]<¶÷±Çóûh(N~ÜIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.9.png 644 233 144 2741 13755454067 15043 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü–IDATHÇÍ–ÝOTWÅ£|Œà¥­¢ ÚF“IHyaDšJR«S±–¤FÄ mT°š[ÛFÅhŠb¨A…”ª™(Ö°š–tšÑ¶&Ô/µê4È Ó˜;÷üúpçö¢öð¼Üì}ö^kåî³÷9„B$„¿LV“ÕdÑlÓó8fñËßjvM"–E,»^ñã$I<¢v¶¾¯ÇÏÂÀϧûE‚0Ñ®hW„#l …¯¾ó‚fïuƒ¹ÉÜôÅßpªþT=ëáï _t :À°õ}=^Ï×ñÆã‹OŸà"›#›#î@tTt”–Ÿ–Ÿñ¾ðG¼YðfÀ_þš Mê∓`˜aôågëûáx=_ÇÓñu>_Ó#àùÏ/Þzç­ẇµ„Îo <¥RŽ(ÙJ¶Ñ• –¬)Y¨á®ÔŠ`Ì1ÐçJxÎ(2U¦øÏsœãé‘é1„ÐE]ÀV¶²uÜ!{ oÈr#€zO½G@¦†ñKo Ý0÷™û†'òçcsL¿öåñ™³ÌYòm2ËßBq¡8.ůø ò9g8cL~¶SADI€_»+e‡¼,/£Ýž ù"t't‡ ¼ ô)}À¯úä{âÛà““ÿÙ½+ŸÙ×Å3û{6_°ÿ¼QèH^õIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-29.8.png 644 233 144 3071 13755454067 15044 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜîIDATHÇÍ–ëOTgÇ3rq» jD`)lFÌ"¼01u©õ.Ò%M4 N ›A‰Ù¤$j×jhÚÍš.n—„,Ž/$¶hk­Úu+î2!¥-]+ ÃUaÜÉ\ÏóÙ3ÇÃö/ðysæû»|¿¿ÌsžïyDD$=þ0ç˜sÌ¿Œasƒ_øÚÂ× >‰aGL5¦šþ£v.íÀ¢K‹.iƒÖózýü~ƒ¾ž—t1Éɦ qüÔ×/\ÃïÝËË•ÿF`ßÕ}Wº>îú˜ßÁؽ±{O6<ÙÖóz½Þ¯óÍç—w~¦/‰×¯™þÉIÉI"÷jÞ«/ï|ÿ2Tn«Ü0²`d2@tH%Um|øÐ×Ô<¬çãõz¿Î§óëzº~l%ë—¬ê7ªß°ü9Ö0xš—5/ÓõÂW€c#"¾ˆ º3º“ ¨Ûê6&L``=¯×ëý:ŸÎ¯ëéú±yŒ­œ9Uµ3µ3 2Âw#îðKá—@»ŽOª´m\‡Ètd22 ªA5¨Œ5ËSϑґE‘E„#ÃÙálPy1~¨¨žêúúV~*"²â,X|Ÿ/AMݺ ì`+¨RUŠŸOùœÏA›Ô&µI “N:ç RA@i¤aõL=SÏ€VŽq @­WëñÓçÿM\/®Ï¿bóÄÿ1ÇWêºÍd3étÚ¯¿]6000gÒÞç}P½›z7õn2ûvõíêÛm«ÚVµ­‚á‡Ã‡ymDÑF ìúÄuÙuNÿáôÛ§ßF}{ÜäN2ôÔu[²-YßZÇW¢•Šˆ<´ƒóCç‡Ðÿ™ç]Ï»ª>ÇŸíÈv,?Xn+·Aá`á`á \´]´]´ÁÊC+­<k¬k¬k¬PÔTÔTÔ7?Þüx³1P¯¥×Òk|G¾#ß5Ñ_òWä|“ó A÷¬÷ 煮+œ+@kˆÍ#ѧœI9£:ÁôÁ™ÖÕÍìeö2C <¥<¥<Š7o,ÞUUUF¾$P( @[G[G[‡¿sëέ;· kyÖò¬åp^;=…¢…g σ«®WÀl×lh§R·§nWæ+“Z’Z°rØ_ﯩžÝ:¶uL¦f22DŠG‹G‹GE,e–2K™H‡½ÃÞaÝ?ºt¿È¶£ÛŽn;*â^ç^ç^'’°6amÂZy¾B¥¡ÒP©Hˆ!DnþåfûÍv €¹F&™2-’8–8&"¿20ÀjVìŽì6¹M'O&žéÿãй¡s²dõÍG‰C¤®¨®°®P¤;ÐèˆøñãG$¿:¿:¿Z¤ÒVi«´‰,žY<³xF$Ç›ãÍñЍq5®ÆE\®FW£HÁÁ‚ƒEœ{{{EL¼‘xCäÞŽ¯Ÿ|ýD–ˆ$x<"ª:jŽšMn‰,Öß±ëÖëV¸ô çÎT½ùžˆÁ²}e;ËvBFkFkF+\p]p]pAmsmsm3d†2C™!h±·Ø[ì0~düÈø°vY»¬]ÐßÞßÞßUZ•V¥AúééPýÛíí‚ÓRMªIÕCçwß:Çx/v à­Ão†@Oì”LüÃÓãéÏO®'åYîÉõäB°)Øl‚°3ì ;Á;äòÇ9ÎqÐi´G0ubêÄÔ P«Õjµ¢ÙÑìh6LÌMü4ñ*úûÐ+¡WŒS‰ûÍÜ7sçÊØÃÇ@÷•¸ÏT¶ÊÆÿ<²”¥,µEmQ[æùUžÊSyÀö°g^Ü«¼Ê j¡ÊŒ™¶Ú¡vàWE1~õýЃ¡–9Ëœ/ÏþÏÇô/À© ZkíµvP—cάþM¦‚ú[äiä)a>â>÷Q|Ä|ê¶úR} ¸pá&™`”[õ©>`"6ÎEç«‘éÈ4Ц;ÿë ¯'ÁŸ;ÿ‹û­|ao/ì}ìżÁþz1ù“ÅèIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-45-grey.png 644 233 144 6223 13755454064 16002 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü HIDATXÃ…—{PS׾ǿkíM!…^¦-”‡XµŠp€ 4iÍá¶8WëØ¦ã´T,=g|PçЫ‚õV«·´h™F°½¨µõ‰e(rZÏ5`=J¥¦<ÃËQI¥šðJH²³×ýƒfÚéô÷ÏšµöÚ¿ßgÿ~ß½öo“ÒÒÒÒÒR(1g¶¹fðÃü0?ÌšKO•ž*=ÅÂË.ÿ¹üçì¥,„…°CoB„‘Xàlp68ØAÔ¢µ¤ñˆG<€>ô¡@ PÀJs¥¹Ò\RÂñcüØ¿j‰•X‰õo5e‹Ë—-ní®ØR±¥b ±QB”Etsb›—KIçS‘ŠTzF,ËÅr±Í5ãšqÍ,Z]ÞXÞXÞxfÔeqY\––ÚWÚWÚW&¾­¨RT)ªÐ”¸6qmâZR’ä—ä—ä¬V­V­V¾¹ïºo¿ï~Ÿ¿yÿÞx¾ø>ïÍ`: bA,HÔ“<’Gò¢ª¸(.Š‹úöÄÌç3ŸÏ|þ¤*´%´%´Å³kmßÚ¾µ}Խ̴̴ÌDr¤%Òi ìxïàÈa‡v¯á5¼à1<†Ç`wF:#‘È1MF“‘¹¿‰ÿ&þ›xq×Ãç>÷ð¹W>GÉ£äQi2Ož'Ï“—UÅòY>ËÖÐt²wvïìÞYFaŒ äø¾ÁxÖåp9\Ž'ÿýlô³ÑÏ ©ßÚøÖÆ·ø3ÊIå¤rÑC °XËbÁ£ý耘Æ4¦Ä!q d~Á/ø¼-Èd ÂÐÅ/~|ñcA?tmèÚÐ5þ†Ä_â/ñ¹"ä ¹Bnæfd"™w§¸uºuºu:€„‘0vì†ý]û»öw5™1Å1Å1ÅBNþÆüùù«²dÉ>'fŠ™b&¤$„„P(¡„ ½¤—ôä¹Gt’N€]f—Ùe€©˜Š©@=.ËãüýýÁ%''Ó·FØaBŽ¥ÚRm©Ví“È djtX:,®7òæòæòfÝjW‡«ÃÕq¥#h*h*hŠÅlÛ:¶uŒt(ë”uÊ:P–ÎÒY:‚H;i'í ™Âgø ŸHG:Òˆ!pÁdá·¶+±Àø?`Ò–jKµ¥B<¾îøºãëXÒ¤dR2)!fI’$I’ôç$ÊâY<‹ß÷Ÿn[ãÖÚNm§¶k½€±MlÛ™‰™˜ ð•z¨m¨m¨ ŸŸŸ@AA ë„u Ü^t{ÑíE€i¯i¯i/pû©ÛOÝ~ øiÕO«~Z8µN­S‹ å å å H4{4{4{°ÖÇããã…!FˆùÓÖ !B.ààrÍrÍr 1xŸ[ #t„ެ€°‚…Uª*U• Ø4½izÓ4 Þ¯Þ¯ÞŒdŽdŽdµiµiµi@èLèLè ´-B à§ôSú);"vDRH!$Ë—7.o$†«ô*½JqpF;£Ñþi+vOìžØ=!<“v&íLóÙŒ¸CÜ!î`ŒÉ˜ŒÉæ×™µÚZm­fìpõáêÃÕŒëŠuÅ:Æn¶ßl¿Ù¾°Ï¸Þ¸Þ¸ž1C›¡Íж°ÎrXËaL4‹fÑ̘xS¼)ÞdL¬ëĺ…ø>ÅÀOÏÑsôܼ‚¤LÏôL`ã_ÖÉŒ“'3ååå Äb 1®zW½«~aßhøhøh80;; ÔÖÖ5\ WÃýýýI&É$`ÓlšM/ħ¯ÒW髎ã8Ž“xÊEp\;?™<™<™ŒA¡P( Á‘óä<9æ;nš64mhÚvvvúB}¡¾p»‡ÝØ?Ì^åõ¼ž×¡C†>’ÒÒÀ€ò€ò€ràÓ©O§>Æ:Æ:Æ:ZD‹h˜÷vn¦s¦s¦ƒ4šFÓhvž—½/{_ö¾P9¸xpñàbþÓ®©®©®)R²Ú°Ú°ÚÇÔÐÔÐÔäm´¶Q`ñæÅ›oê÷Õï«ß°Cì;´+Úí €KáR¸ ÷“ÜOr?|•’žŽ{:îé8 7®7®7   "¾ˆø"â 8Ìz³Þ¬‡Ül5[ÍV– ÊeƒB%؈eµü~ ¿æ¿ÿ«UѪhUx¢cºbºbº¸!E¶"[‘ÉìÈìÈìHÍ*g•³JÀyÊyÊy  ƒtÁ~Á~Á~@ $P( × × ×%K:—tº4]š. °(-J‹ðh=ZP¥©ÒTipz3)ÿ:ê먯£ÄTr‹Ü"·è ¢!¢9a£áWï†_}oD+ÑJ´Ÿß}Tû¨öQ-7táÚ…k®yvòãü8?Ž ,w–;Ë gŽ-Ç–c^xó…7_xpÄ9âq@BoBoB/ŸŸŸ ¤ßL¿™~0†ÃáÀ¾•ûVî[ ^7¼nxH?–~,ýXBzBzB:¤õQõQõQ¢ý~èýÐû¡ô†äCɇ’oovºGÝ£»Üdï½wöÞp ·pëߎúYü,~–6ÿ鯦¿šþêÉü¬È¬È¬H¶FwBwBw‚\Z…V¡ŒÓq:NÒcï±÷Øõê7Ôoê:uºnA«»v=ìî Þ¼3Û‚mÁ6 :/:/:öOþxòÇ“ØtZ{Z{Z‹¯å2¹L.›}ŽqŒc\â&,Á,é)¤´–ÖÒZ®ƒ¡Gè‘{;6ò\òïäßÉ¿Œ¡ÆPc({Úô¶émÓÛø’Ïæ³ùl8ð žÁ3ÀRÉRÉR  ®Uתk™“9™   VXu`ÕyÀÉÉý“û'÷CÞäiò4y„h‰Z¢–¨2NÆÉø‘¤’ÒSˆJT¢’ô¶yž¤¹¾‘ßGªH©ºZDµTKµ»|äÓchD#„m¶ƒ¶ƒ¶ƒ“ïÉ÷ä{LŠzQ/ê¸Ï満=`Ø@T‹jQ=¯Å +MWš®4yvZÍV³ÕÌ•Iƒ¤A_VÄUÆUÆU~ð-ÊP†2rÀ€åëGÅ(F…nlÇvl' Kë—Ö/­¯\/Û*Û*Ûúe…UeUYU¼íbðÅà‹Áž¾€$ƒd 8qçp€80ÿ©™ë~Àh3m¦Í^7_7_7³5·p ·ÀU*ä ¹B~wÖuÖuÖuv÷{ÝeÝeÝe3333#Øw|û@íÞñœ ˆîºßu¿ë>àÚîÚîÚ¾û=Eˆ"D2|®¯±¯±¯‘«l~©ù¥æ—ØRDŠH¤âiñ´x þð‡?À&Ø›ˆ@"À1n7›ñeËŠ–-+¬°(, &‹Ébòî÷æ¤wwÖ+Å£^é|â+•÷—DêzKÄU¢-hñì$©$•¤®Y?÷Ëñíe÷6÷6÷6ñ/¯ˆ¯ˆ¯ˆ4cÙ‘eG–A®Ø+öнÓ%t ]§P"”%VÇVÇVÇzâ,)–K ×/[![![Q™6÷Òìº!Dƒhàz+ûW_Å******0éË(¼ óòjw§W»G½Úýê7Úu7ºÝÂ6[­ÆV9¥”RŠ _&Z­ŽV‡h¿k¸k¸kàúe{d{d{º›œ÷œ÷œ÷ö|Ðÿ|ÿóýÏ^Àhßyêôñ̓þ Ø·AîuÐîÕîåßh7ÂaàmJ/”^(õìôö©Á&•IeR¡ÎØaì0v½¼WÞ+ïÄh1ZŒþKÿ2ÿ2ÿ²ãßc’b’b’è#o¼ÿðŽŽ_sqøÓh4‚wjb&aò¦%Á’`IÀÿz÷<îyüŸ‚4F#ÙpìAÖƒ¬Yªz[­ÇÖÃþ§ëd×É®“žôi÷´{ÚÍm÷ËðËðË(Žd5¬†Õ|Ñ4÷²qCx„Gx$>æ«€7Q¯yþÀ~G»åhF3š=e¬5°ͽD/ÑKÿˆ™}qöÅÙÅ?ƒŸÁÏ@{¸|.ŸËÿæZì¥ØK±—²5æó€y€ü]\$.±^¿^@ûïqPüýJ»ÞãÂS†"¡ˆÿÙB¶-ÿËšY3kþÛkþOø?áÿíáF¹QnôÞâ!ñxhÛýÞͽ›{7s€ˆñúó5–Ž?âøÓ¯ }º£IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-113.png 644 233 144 2550 13755454065 14747 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜIDATHÇÍ–mhSgÇOÒ´1h­ÙbA0JWè,Cˆ‚…ù6i±,Öâ°c«2جàtøÁîÃÞ˜º)ºnv,«(S BT¬v Ò.]í&lÚº)¶:»Õ—Y¥.ƵÍͽ÷ùíCòäF ûìùr9oÿÿ?÷¹çä‘)é§€;èº'§|÷Z'>aÉ„%ÏJùM¸ª\U¿5@AcA#€ŸŸ}Åñu^×g÷‹8øÙ|:.SÄ xx¸ÊÓþP]Z]:ajÊÿ, ¾£¾£ÿš°îøºã‘ý‘ý¼wÎÝ9ð üA98¾Îëzݯñ²ñåƒ'øE ÷dîI×xó¼y"P´¨hÑŒúTÁµP¹¼r9ÀÍœ›9Ê Ö=`“T9'޶ûY¾Î§ëu¿ÆÓøšOó§ôŠÀŠš5¾æTÕï`óôÍÓ5_ò(ð Ÿ0 ̸°^³^#*ª¢¸pãë¼®×ýOãk>ÍŸÒ#Ÿíç/£By¡<ÀHv5h ‚=)¹!¹¤úE¨O˜=ÑžhOõ³êVÝYñK¶mÛ(ó/c±€¤*5§šS3?¸‹ÑWÍWM@¥ù£)Þƒéô Æ=Ð?¥ Ð À+V4Y”,b„VÈRrŒc+jE­(!BÄI«„J¨ð 4dõµÚÓìiŒ°.…ý…ý…€áûÓ÷gÜ£õ¤…5uÂ[ï¿õ>ðÀ.S&ßK¾çð„×…kõÐ;³wfïLÆY¸&\®žY=³zf9qísîιÐ÷w¿»ßí¼qu8Å—áOëI ûuõ‡×^“)ÓÜ–(I”XýóêöÕíΟ==zzÔ!^µmÕ¶UÛœ|ç…Î àjóÕæ«Í_‘_‘_UUU¼ì öÂõDß7}ßÐ|*thÑ¡EZد›&wLîPGøòöO·r’±‡c¡åù–â–b(ÚZ´µh+´•´•´•8u ,„àÒàÒàRè\ß¹¾s=œo9ßr¾¶”m)ÛR§ÆNƒÙGgGfG wKÏ‚žYßâ½[Á[AÐzüùþ|û2Ü¿uÿp*5öê°½ÛÞí4ΫW;¯"­‘ÖHëø£ÌäÝwÄíćׯ^ Ë/[¼l1Ï/ž_<~ö’ºäŒÐ}•3twè.h=nû„}ÂuY,s¹¹\D\""¹â¿d,éOú“~ééq6Z?Z?Z/¨ T*EØì¶Hu¬:Vi;Óv¦íŒˆzQ•©2‘sw¿Þýz¦= *ŒooE´·H¼<^~ñ¼x~ˆþ‘Qê\/©gÔ3bèÎüù7òoˆäzr=¹žñ ò ò òDÆrÆrÆrDVn_¹}åv‘áÜáÜá\‘À@` 0 òÂ¥;Jwˆ¬ú:´9´YãS—sòÇ?nÉè7•FzJÍËæeg*c»bŸÆ>£Ýh7ÚÇelWlWl Fƒ‘µŒ £Â¨€!ï XX +ë+ë+à·ÿÊâ=à»ã»÷@ŸÕgep_{½†‘, =KÙ#ñ(kUgÕYPûT“jÊŠç™uf#êŸÌ›Ó?ñ]÷]·Ç²6?!oÈ ØÞü­‹€×zÛz›$aºè¿ùñâÅ 4±—½Yñw F©ï­iÖ4’4[oXoèd² +ä yô›zló?µÿ•Oíí⩽=7Øÿúê Ëú^&IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-12.8.png 644 233 144 3032 13755454066 15030 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÏIDATHÇÍ–kL”ÙÇŸ¹ N$€ õ2„ŬâjXýbbÂlKV]»‚—]•ê„Kvm½Ä5»&¦‰U›h1¨kBÓÍ"õ’I¸„bHÁ2°M–R….a 8Ã¥af!03ï{~ý0óòÒ&ýîùòæÿ\þÿ'ï9ÏsŽ€ˆˆ¤Æ¿Ö k†59†­%¦}ù‡Ë?̹ÃUXŠ,Eÿ¼)_§| °ò›•ßè>~#~i¾ˆÉ¿TϰKª˜†DO¢ÇâŠãKðÉ–O¶,ÿY ÿá)8êu³Q(m(m¨ý¶ö[NÂh÷h7ÀטØðñF¾Á·”_.ý¾$4%4Y^Aâ²Äe"°®`]Á;¿‰üø|üÑǼ¶½¶)+hÿ’HR. Dcý{ 6üñx#ßà3ø =C?V@Z~Z¾.<ìøS,ÁW_¤‘nèEꀫ\% ¢¡h@+ÖŠYõT=À‚Lløx#ßà3ø =C?V¹•ºˆHÅ/ÑDD êÒ“"Ù‘lPÚ*m‘¸C©U*U¥BÔˆ€Þ«÷꽘k–i¦‘Ò#ѕѕD¢#gÄ j]ŒL˜¦ãú‹[éÙx //Cvþ2”5”Z;{¨Õ7è˜[TS¯ÕkàÇ8¶¤k\ã(¿ò+¿iV!R!àw\å*€ÊWùÌq/Îÿ‹Á®Á.GÈ ÙùG¬žø«êdº¼´¼ÔEý}ƒønéÝswÏ¡ž =ó=󙂾ã¾ã¾ãP™U™U™½Ûz·õn3ýºÒ•®LÜw¿¯¦¯nüöÆ—7¾D½øýÀ²e‹Ñï«æ²Ä²Dck«:…í""½çàÑ>€èEå>ÚõiÙ§e,-ÒQÓQÓQ#Ó#Ó#Óàlq¶8[ÀuÙuÙu2NgœÎ8 Þ~o¿·ß,¨ÇÙãìqBvUvUviE¡¢doÌø>ã{fÆÚÆÚ”ê7Öo½$Vp=yOò屇c!œÃ¶ÀÃÜû3÷g }:}*} ºš»š»š¡­½­½­ÎŸ->[l°ixÓð¦a¸™w3ïfži÷¶{Û½í°výÚõk×ÃýŽvGƒ =ïÞz÷ô4ôµôµÌÔÎÔ‚^‘´7i¯òXå¼Íkóòž4Ûgí³" —¤_úeò°ïhÊÑ‘Ì_gžÊ<%2þxüñøcW¾+ß•/R( ”DònçÝλ-²ºbuÅê w³»ÙÝ,‹K jA-(&L‘'ÕOî=¹'ä#"M¬aLŠ$Œ&ŒŠH–õ”õïYEÓëô:Ë€X#…‘Bù¹ˆˆ¤Ä c £ £"+rWä®Èñ_ñ_ñ_ÙÚ°µakƒÈ¡“‡N:)Ò¸«qWã.›Åf±YD‚G‚G‚GDúÎ÷ï;/’s&çLΑúõ'êOˆ$¼LhMhéÞÿÝ›ïÞHšˆ=`ˆ¨BͪY-ñÃß{ކÕª”Ø‹ïÄÂÎ?î¬ÜY ÞNo§·j/Ô^¨½`ÞÛ ¶l/€´¦´¦´&¨Ü]¹»r7ì˜ß1¿cž{ž{ž{`Ÿ¾Oß§CêËÔR€ÂC{ç÷γ0yW}®>Wnð y†@]0Θѕ‘ò¯Ê¿FŒ®ÔZ´˜ùÕÌg3Ÿ¡"tGº!ì»Ãn˜¸>q}â:øþ€?= t˜í˜í˜í€©ÍS›§6ƒþB¡¿Í©95'L'†'†QÚÙpn8×ìJÊ3Ë3—v%‹slÜ1²ÃàOƒ?-žÝ= ?Ò™s ˆåÿ¯9æ–F«)5©&A-WkÔµ_ígNmˆñ«{{AG0dç¯ÿ5ÇDPñÉ«ÚÚÌÉ-ú*ú hГõd"ܤ•V”z ªU5¨¿©nÕ ªQ5ªF œ2Ê@M©q5Ć­âÏZP Q­ÑÉè$pÛ˜üííLK'ÿÛ{W¾µ¯‹·ö=öv¾`ÿÂÑ 3•› ÂIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-27.1.png 644 233 144 2702 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜwIDATHÇÍ–[LTW†÷`a˜2¢DM‹Á*)JÕT%ÑB$PT*¢Á ^í¨±ê êƒ1$Ôw4AƒS­¢ ´U3Š(MP[P›8ŽXPÐÑÑãœsöׇáx&6}è›ûeò¯Ëÿ¯ì5k-@!Äàþ_a#ÂF„EqØw¦=2+2kô/A\¦e®enË&´Ð~€˜Ÿb~ÒÛLløøÐ|!LþP=Ã. Ó`­´VZ2úq1Ì?|ä° Þá[•­ê• γγgŽž9Ê÷ðøÚãk½½`bÃoÄù_(¿(~O_¯ ¯³üÖk„à˜á˜1jM0 säæäæxxÈ0к;v™øðaœžløûã|ƒÏà7ô ý`=†¦Mæ,˜³Àv$˜Ðv ÖÅ­‹3ôUÀV¶bÕ§ú´­¤Kº°`~#ÞÈ7ø ~CÏÐÖc¶ò©BìœyÏòžü РÞØ6vu¤:’€¼Ç† U]UT´oµÚТµh-ä×2ø'z §è)ôêDu"ÈëA~˜>/è6ôVþ*„cöÍgóù>’OÛÚ€Ådƒœ&§áçGv³d¯ì•½!¯yÍ묢¢†àZj©Í¥¹4p^ïÐ;ð÷{³QÛ]í.0ôƒ…Ù×ceWäùå–åƒMÿònœÛívîŸw•î*E¶t¶t¶t‚g’g’g”&”&”&@ùƒòåà¸õ¸õ¸Üî w…Y—ž­gëÙ&.w–—#ÿ˜ÒœÔœdêÉEÎNg§ÑÚ²+BŸ,„Í…P}°ú ´üæ-ñ–È¥#üÈ—¡¤5¦]J»cO=5öl¯Ú^µ½ 2™ÎL'd/Ì^˜½ÐœíÃY‡³g™…(¹J®’ ùMùMùMfÜùÒºäºd”`”\ªy޹¹Âš …v+jOÔY ~ů@µ­~HýX·¶0¹0ÙHjMjMj…½Q{£öF™ö#‹Ž,:²òªóªóªCZXO=õ )EJœœrrÊÉ)àxìxäxuÕµëk×›áÚ[Ï8Ï8€èËÑ—e¥@±ÅØôV¹¾;¿;ßû»wfÞ™ 6OØ ¬`…r˜g&›ùh½Ùoò™ü¦ž©ñ#ðÒŽ—vˆ€s¿sjK¤áÑ—P¿¦~©¾ |Æg¬- ôJ½’%På °°™7ëÍ~“Ïä7õLýˆëU""gw¡—ieZÌÐmcEx]x¨è«õÕ„£ e<0î÷@Ѿ׾•¯òU>Ä=»qÆcH©uÚÚ„µGáW¯€á‰ðC™¿Ì£ú±W9*"’wR‡S‡ËèZ;´ô¿PŒÛÈ3òÆ–Ô3õ páÂg¤‡z€J*©´ÂjL©1àUT¨"UD3~5ï¿í¿ H –á‰ø‰>± }Ì×T×Tƒ:`˜ÄÍû›«›«Qrr-Á 6@CaCaC!ø'üþ +o8 §á´°/Ç÷ªïU8·öœýœuïuïEïÅXu ->Z LDü¯‹ˆÜ;_½ùÕ› PUïÝ®8Zq”%sDúúûúûúÁ×âkñµ@FIFIF ”6–6–6‚ý±ý±ý1   [†Ô=¨{PvÍ®Ù5p¸Ÿ8>ûosÒrÒXºsú;çwNUÝ®nèw#~„?fg«.˜è˜è€ÐzòɇŽMí í `ÿµ}}ôÕöÕöÕ‚·ÃÛáí€' N@o°7Ø„­7¶ÞØzúýÎþ¸'åNw§»Ó¡þdýÉú“Vü—7}±é øËoš7}ú4=íVÚ-Õ%°2ce†ñk3Í3Í þ{¶Ü~pûApÛÜ6·Í"ž=2{döì-Ú[´·ò ó ó a0{0{0›ÿ;¾J_¥¯¶œßr~Ëyp|¸£bGÿž Ï1såså Ù’-ÆCAËü&óÕÅõ±™±PþŸü³À[àÓãô8¡MoÓÛtØY¾³|g¹U·ñÀÆ@ã•Æ+W 4 ÂÝcwÝ=é›Ó7§oWеèZ„ÀÏþxŒŠ(Áã/¿ Œd^̼¨ºl²,°;°û¾W–<×<×D~%"ÂáèІ²’³T–yžø<ñy¢È¾3ûÎì;#2›4›4›$²ªiUÓª&‘mÛ:·uŠ8j5Ž‘]Ž]Ž]‘ÞžÞžÞÕ TƒH÷úîÕÝ«EÖ<Éù6ç[ uÕÝüüæçûý·ï¿-¢_  ºïµ¦2\óqÍÇÀæTê7õ›°ðç…Î…NTèTä0O¨$T*ɩɩÉ)0jZ£T®ÊU¹ðôÒÓKO/Aðxðxð8L×L¿?ý>ŒŽŒê£:jì÷#U#Uðß›z„>ï™SIlM¦N–Ñ¿Ó/fÑh1ZâöØ-u]]ÕªZUkܾJVÉ*Ô¼šWóqßB Õ ë±H1ülñ“=&‚Šn^UžXžhm~R´Qm¸ õ µù©£–ZP½êªº ´ÓN;0ÍS fÕ¤šöáÂ…R=š®é„Õßõ4= Ô—Qþ†²OË>…ˆøÍÿâþW¾°·‹ö>öbÞ`ÿNÌJ¤ÏòåIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-24.8.png 644 233 144 2756 13755454067 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü£IDATHÇÍ–ëOÔWÆ¿Œ:0v*X»Ñ!¬Õ 6ÙÄÎ+Å8nIkP˜L4}ÁEÌÚºІn¬+I%(¦I]ÅK£™D± W–`iƘbXÃrÓ^0•ÍÈXaÜÉ0—ßùôÅ̯?ZÿÏ›™çœó}ž'çüÎsŽ€ˆˆd¥~Lv“Ý´$‰MÕFÆo¬þ<‰Ý H+M+n‚ÌöÌv€¥§—žÖÆ ¬ëóç׋üóõô~É£#Ý“îIs¦ðGPþjù«JâOúÁrÅråÿq¨¹ZsàrçåNöÀÔÍ©›¿8q‚õq}¾^¯óÍç—þ /‹ºu§Ý‡tsºYr‹s‹_ú[rÂw/AÉ›%oL.˜\ LxX±*'"„Þ¦ça}<5_¯×ùt~]O×OúxqÓ‹›D`ûŽí;,ÿJŒ‡ý+÷¯ÔõbW€#Á ñP<Ø™ØÉ¨~Õ@i``}\Ÿ¯×ë|:¿®§ë'ý[9ö:¸¹ZóÅÇbËcËAŒ=ˆ= –rªtËêïjŸÚš]³kvŒ6ÃCþ†”‹//%ËŽeƒÊMòƒ+à u}}+ÿ-"’,!K(´Pïùîù€wتHæ0Í46lØ€j¨U®ÊUù¯!è<î<î<Om<µñÔÓÆ+++`•{•{•J¥¡Ò¬Ê·Ø˜ù¹ïç>U ]ù]ù U'ýHâÎs­Ïµ*„çÂsЕù¥íKìß[ÿZýk†@Þ@Þ@Þœ ž ž B§©ÓÔi2¦Ì[æ-ó>mìÖ®[»níÛÛÛ8©LœL@Þí—O¼|n_ê꘹<Ôt¨ÉX£ÝG»vƒeÌ2fƒÜõ¹ës×+×aî0w˜A«Òª´*hÙܲ¹e38ÚíŽvƒ§ðRÁ{ïÁqoÇW_D£O,î]Ü«<_¦c× ¯Âé绾ïú^UšnŠˆ0çØé(u”Bf]f]fœÑÎhg4C uOëžÖ=P™Ìꛄ5aå‰?‰?!ÆÇ|ÁFòó!M4ËXÆ2àIò®T£êŽºR7Å…Älb–˜úO<mzò¿µð­…ÀÜ“ÿÙ½+ŸÙ×Å3û{6_°¿G(ò´ÜþIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-XXX-red.png 644 233 144 4033 13755454064 16042 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜÐIDATXíWmL”W¾ïÇ Vʬü¨(3NŒî®ŠBuÝ•DAm¤ù1JÐhwKWQ±±µÅU©dÙhÒZ(qm  †¿ ©A£6»)6¦ÎŒ:›ÚŽ‚ÌàÈÀ{ßûì™û~LlÍf÷ü™÷¼÷œó<÷œgî!$f¿"&—NðLðLðÏâ/R’Ú“Ú“ÚWüA¦2•é­ã$›d“l ¶Ì\D&2‘¹˜}æâñ<Ÿ×ãõÍxâR3#¿*REªÄVóú”ßÊír»ÜÞ:(ìv;4"Ö´á´á´atß-¾[|X÷pÝÃug®3×™«û|Çó|^×çx¿Ì‡ˆKÌþŒÅ°ÃþlÞ¡ŒŠŒŠŒ º«¹¯¹¯¹½zzz@‚ Œ`#üðÃh~|Çó|^×7ãÍøø—ùÛ«b@ ˆÿy^ ÷jîÕÜ«Êbï¸÷¹÷9¼ˆ›§¨PhÍØûcïtU¢-¢NêèZH ZC%*lžúL}…ç{ǽQo^^_#l·½ªQZ…V¡•ù|H>Ôr›'¸ \.¥H#ö.«bU)-J—Ò0?îã>€1 `X=« ò ô¡À+a%óÇ^*-ê¨: °wY>ËGˆs<ŽÏùp~ÄòÀòÀò`Õïx€­ÖVk«e3}}}ñ4^'DëÕéêt@*R„ÚÞn{ο~þu`“Ùd€  „„Zn¶Ü€¯Z¾jh½1!ŽÇñ9Ÿ¼MÞ&oë?ÄŽ•+?VÎþ/QZ•ýÊ~Pݪ@”×ÞÓµ§ ˆ}½ ­·­/°wúßé7ÄE¿ìþ²[_UZ£Þ¨&(D8¾ÖY?‚i™i™i™p ®\1¸B¯;ì°aÖ½ˆÈ’ýKö@ê…Ô 0¶fl \þüòçÆ¸2]™ÆªŸªŸ°3…):Çç|8?Nô¯k¯=¼ö°¾3ê¥^êÄøÑHL½¡Þ0úw²ïdùš| ¥ÇKÀœç|‹*U€Ò¬4ÚÐØ„M‚xˆ‡€†Çç|8¿8Q|á¼å¼å¼¥Rºœ.§ËM­‹êcå±òØè7ÍošoìàÔü©ùðå;‹i£ƒê Á cÃÝG÷Ñ}:¾s¡s¡s¡vn!ÆÎú}>âŠQ1*Iª”*¥J²…l![!a&aãQ&Ìf}šE³Lg]É!„ä7’ß0åÍfBÆâî÷ä¹GˆØ!vˆ$NŒHAÐô/çGÄ"±H,ÿ)Þb׉ªU'ª H¦I4ÉØWõšzÍØ¡oßúö-c'K¥p„aÈsä9Œƒ`±—q gèIzRÇ»Ôp©áRƒÖÉ? YB–5þ‘I‹¤E{ëø·Ìî°;ì:÷޷޷^—>ËWϪg €Œ?,®_\ÖÖ0zaôtÌï0IáHäH@$žö&ÝD7éÛ ‚€Ì½™{3÷ªÚ M‘¦HSšž’”Â”Â”BBä+òùŠ; øÎg“îÔ”U=~ü>¢ðð½¿×õžùxz­í5¼À6Öo¬ŠÇ=íÍíÍÔ&óv+nT\¯¸®F4‚[¥­ÒÖ•Äü‰Ab¶ŒO,Y–,K–ÿï<¡ºf×g»>cùÚä&:ggíKÚg”ÔÔŒRy”ú(VmXµ å5?Ôü úTؽĽojWhX'Ö®¦ S…©sšJ75©o6 —7 nÁ-¸¹VÔ?{z<žN½Ÿt'½H/ ±Ûì¶IMhv†X>s1—.¥€;ÐhìÉöIöIÊ6­“¤ÒêZ)"E²MçšGòHž|€´’VÒJˆ”‚RpW‡vµ6ÚÛ+Vßß9ß9£v•5ÊÀ7øÆ0L®E;ÂŽ¬Dq(ý€Ûp}à wèNí‘GäÏÁôíéÛÓ·"ˆbp&ήœÓœÿ,‘îI÷¤{BçÌÝ3wÏÜMˆ¥ÂRa©ðÔ´›W[kÔ®Z©V" Nã4€! aHo,ý EgéZ<úû£™G3Y¾v—[-V‹50ómÉæI Ý £'B‚ÛkömÉ1íúÎèÚ­®©®1hתX«NH}¤>RéZˆýÈòL˜80q€kšLSĔҿ$Hñ“~È/¿Ž&h·øÚíñôèÚUz”¥GWîóôçéÏÓ¹Ãs‡çÓ_kZ<-–NÉáR‹K/‘`*y‰é¼ÀÏi·ÁÖ`kP¬>·Ïí‹ýºŠ"Šaδº³º³ºS?väF¹Qnˆÿ%™x-7þž¼ò2‚‰ÆJãÚ=÷sÚ]¶zÙêe«uízr<9žœŒ­3mB™P&”-ßk†‡pò_ÚË´»Tª“ê¤:ÿN¸¬¶¬¶¬–ýmÞØ¼±ycÊ?µQ¥ ¬Î -¤…´ø±#ùð&ÿѵ{Ðì/û^Ø,l6d%YIVª³Åiâ4q äb¯=bØ#„HýR¿Ô/ü#žX’0¹ÿ›Yµ§BRH åÛæå=å"™È¡[èºÿ==ö~–'a2Þ„º/õË ±ÅúÙ04IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-63.png 644 233 144 2416 13755454065 14674 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÃIDATHÇÍ–[h“gÇßÄÙ´Òv6º ©AíT‚AœÝ…[¬Êªx€R¥…"¥Ñ‹2±[oŠPð¢X‹££ÕJ‹n¬HV£słЃÃê6 =Œ6 +*.bkYÄäûÞ÷·‹äÍ÷mÌÍË~7á9ýÿÿ÷ðþÜŠ«ïÕõe;â$ŸæOèI ûåKèœíœM•W© ã¸qœ·ÚórÍË5/×Àfïfïf/ìöìöìö@ÁÅ‚‹árÖå¬ËY°lfÙ̲Ø[··noxBž'“±ÉØdÌ&°(þ8þXã«*‹?¡Ç)DvvÿÆO…(ÜV¸-y¾ÂÑ®Nˆ«âªpiOÏ`Ï`Ï aa!DîHîHîˆ%C%C%CBdVeVeV á_í_í_-„¿Þ_ï¯Â=ìv ===%RWœƒÎAïh·ø“z '+'KŽBäiä©ÕöægÆ&c“µÂÕ¡:¬Ì_™¿2Zü-þ?¬ ® ® B§ÇÓãuCÝP7`Çá‡wïïïY2²dd‰­Iâæ3ó™}Ìhþ„ÙýÙý*Ó›¦mBÌ)£Óè´ì` Àö…}aË_ì.v»aݵu×Ö]ƒr_¹¯ÜgÅ×]{tíQ¸Ôz©õR« ¿Èp.[“¤øzÞyǸ`n47ò–Ÿé£Ï*/ï*ï*ï‚E¯½^ô*ª+ª+ªal`l`lòòòÀ=åžrOA©(¥f7Ìn˜Ý`»c1£Íh{÷ûß®ä eu¥JSi* "m‘¶H˜[Í­æV‹0v(v(v^¸^¸^¸À ›aÓ¶Ã 3ÃÌ{wå¿Ì±Ôœ‘gä¢TÒ@È9‘ÛÊ+U¥ªÙ-»e7¨Q5ªFmñ4‰Ô ¹äÈÙB”è{ͱÿ˜ü¦9`Ècòq~`‚ ”º§úTð5Í4Ûvä j©Õ£n©[@;÷¹Y+k‰ch¼$þ»'ÿ¼ý¯œ·¯‹yû›Ÿ/Ø¿LeaÊÿywÈIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-17.1.png 644 233 144 2573 13755454066 15037 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü0IDATHÇÍ–[HgÇÏjt•¨m`ûdšäÅÚ¹6`Bqs³lÙ ä¢4¦Æ¶i("!>J[¶bMs!Eª†h $”0õR|°¦T ®@5YÑ\d“%ëÌ|óëÃîì,-}è›ßËð?—ÿÿ0gΙO@DDÞN<ÒÖ¤­IË‹ã´O{VYVÙú¶8n2ÁµßµÿÏzx뇷~XuyÕe5é`Ûoǧæ‹8ü©z¶]ÞÇàîtwº| ÜŠg½ÇßjÝÝýÚ€š›57º®v]å3x:ôtà…ï…lûíx;ßæKå—†è‹@F_FŸë1¸3Ý™"àÝëÝ»î‹xÀô:(ÿ¨ü#€™ô™t+ Ìy ‡ËDˆ`Ÿ…lûñv¾ÍgóÛz¶~¼O©§T‚‡‚‡²Š'L^‡3«Ï¬¶õônàÈ#bDÌj³šXš¥à¶ýv¼oóÙü¶ž­¯Çi¥ùnf…Qa$ 4Ñ=ºXi5¢[ðïaoâ‚f•yØ< fž™gæµËòÙï €X JT ºÊ56›Àú-Ε•À|B?ÙÊY‘ÂFÈ~”ý(²‚ÞPA¨Ìûø¹£6«ÍD“BoxÃ#÷ÒK/˜š©™pG…T(ÉçǘҦ4€ìHv$²"^Xacâ5ýÊËÚšÚ°êÔF›·9ÜmŽb=|ô0ô0á{á{á{Ðx¾ñ|ãyhyÖò¬å´º[Ý­n¿2~eüŠS—ò+¿ò;¸¥¦¥¡¥ëí£E£EɨÖÇ5Ó5Óvk›~¶ŠˆŒž†Ž]»À¨°>©‘ü`~0?(²sbçÄÎ £Ð(4 E=z<$b¶™mf›“§Oë!=$"¿ÈòcÒì‘ׯnc·ˆˆº¥n¹&ÒdEdodïØˆÄ´~­_Äõ¾ˆÇ K¹“¹¿çþ.’q"ãDÆ G@ÓÆ´1‘€?àøû|ý|ý|½H`K`K`‹H¸4\.uü+¯®lZÙ$’‘“NËRâ›;æúPËÔ2ED"¾ˆolÄ™J½ö«Ú¯€¿ì©4ïšwañ»ÅŽÅ¬¥†¥º¥:§%/÷½Ü÷rDµ¨ÕRZX§êT, / / ƒÚ¡v¨Žñóů¿ÆZŒöGû©d¸vOížÔ©$¹Çæ²ç"+`êÕÔ«$T‡êHÙcücOä$'ùÇòZÞ”=ÆÔÐÔÐî1¬Äæµ*Ó+Óm}·1kÌMfÔŒ¢Ûìä’Eð%§8•¢bŠ)°¦­Ikx˜ˆGUGÑÉ4?0?šüTº+Ý_L©›ùþ+—ííbÙÞÇ–ç öo .ÿYÍ/«IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-57-red.png 644 233 144 4164 13755454064 15613 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü)IDATXí—mLTWÇŸsïEPÑbeP©/‹B0  ÍŠ(ƒ©`} ® &W“m²U¶V(n‘JP±‹±‰Å®ÚAFIK]ìnµ,Ášv£FL]%Æ. *›RQ„fæž¹ÿýÀœ;w&»º›Ýç <ç_ì‹x‘/ê‰ú¢ßËyHú¹¿sB”¥Á®Eâ„¢ò£ò£òyá©ë§®Ÿº®M°?·?·? C† †0„!]èB ûÞ}/òE=Qß¿_̉—ó‘y’Ô-uKÝ]Ò®¥]K»¦.ítwº;Ýè„×´x-^‹‡ÊËx/x"Oä‰ÏâY<Ëà{÷E¼ÈõD}د¿y’ŽÆêY=«'R)‡”CçŒªŒ’Œ5Kû'Ù“ »zn´n´кÔD5€‹'ðàż€k±x-¯àâóø<@ëR“Ô$@Ï÷ÖõE?Ñ_ð> zô8èñêÅ"À\a®0WhslÏlÏlÏÐï­cçGx /Ïì°ûÚüËh;µ¾]Û3ÛYÛYô›+ÌÇÍǵ9‚Gð)¨F5ªË7ŠÞß±¿cYb¦ÆL™J㸕ˆˆ&(ûz¦õL#"×õ”ë)D4Y¾-ß&"âÃ|˜ˆ(øÍà7‰ˆ,U–*"¢Ö×[_'"½5z‹ˆ&KCÒ¹h5­&’÷áîqëk¦×L49&7Õžj§‘ýïÎ~w6Yަݴ›ˆø´Þð¸ð¸ð8Tõeöeöe€f×ìP-ž¹ájÃU`ì½¥V©5úgOœ ?<±3cg÷%Y’`½ ÷ؽëÑ¥7Koê'«öe>}ðô xŸ=¼î躣ëŽê ÞéZìZ  W,UŸ¯>É?%ÿd¢ö‰ö xNxN€öžö8ßq¾ýŸõfŒ?üþá÷ 6.6@o_k_+À;1pÁçÅ9m9m9m> ñ•Î g…1wCñ†bù!äHiIi€¥¡KC é~Ó}?Þã÷Œ~GAGHQR4”6”ôFp}àúÀ—œ“”“”“¤ßÛ_ˆÍK©I©I©AÇ(ééÐÀ[x 4üRŒ~ËÜ-s`¡e¡>=üéaØ8¼qØ8â¶m;ñ/l[é¶RxcðANïr›ç{Ï÷€– IšMD§…¥…¥…¡Cð‘”%eIYî§âSwfÏ™ì3Ù „¸cݱð¤üI9ç°uØjŽŽ6M€{>ì1îß¿|ÿ²áAÔË_^þÒpî]×\×|ýZª[޶è#ǯXK` î§$/‘—ÈKJ*Åu=˼ż…ÇØ~ñ(ÿQ¾^À®­ˆP#T(N,N|Ïþ݃ïO´áHÃ#èGÀ´’i%jššÀw(€Ó‡ÛáâJâJâJ<ú@Ž#äˆû)Ôj µ)­J«ÒZ×­_ø9éo¥¿Å÷Šjž¢ÚìÚl8aõ9Ø1vÌXè.tŸÅgA\|€}mÒÚ$@ÜÌžÝ!îßãæßÊ¿•ËãÐwÉ»ä]Û<æo½°¨‚‚‚ºN‹„¢²ÂÓ…§µ¢ Ö~©ý4àlñÙböÖ¦Ö&ð„yÂŒ€Ú·Ú·œŸW}^w§Üðí~Âuœßw¾5É5É5ÉÚ ý[n 2™ºG½-…øOš] =±÷ß2¦]ÛEŸv‹ÊŠÊ Ú5©&Õäòôxz<¾kÊÑŽv´ÖñíãÛÇ·këuM†J¡RèÖßHñ£¾`zù‚\cÐî6¶måzVÇêXQ»Öfk³O»j³Ú¬6û”;99 ,X8°p€ÏÓµxA¾ _ø]ªšWz€“éæ |Úí•{ Ú­6W›«U“­ÎVg«à„N Ò¢¦¢¦¢&ßµ£œTN*'Û½ÿ’Œÿk@_ï:Mx` ‰„­^í^úwÚM_“¾&}O»ÖTkª5Û×ôI°<–ÇòV–ø·‘^ôeô_Ú«´»L®”+åÊ®DœW‘W‘W¡‹wÅ»â]ê]}Ô½r¯Ü[Eçè#ïµ#ÛúÓÿhÚ=èï§ÿí`;Ø€VÑ*Z剕fH3¤#FŒþòM´#Úí ’oÈ7äìª7qsÀäþofÒ³…,Êÿí}Û%MÒ$ `WØvå3ÇÖçZ&ÓP÷•£þ'Îv¦y{:)IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-86-red.png 644 233 144 4206 13755454064 15612 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷Ü;IDATXí—l”õÇ¿ÏZZËNЦ`ï¶”iiŠ@­˜ÑB[j81lml14u¨£´T‚?¨Š ]GQ+bJÈ:ä¼¢EˆÓ*3ˆFÓ-³%ûÃ#xPèÁN®}ž{^û£÷}î¹Û&Y¶Ï?×Ïóýüx=Ÿïû¾ß«SvH0uIj 5Pþ{qM÷5Ý×t//ÐMÝÔÍ¿óÅ|1¦–­6¡ ]èÒ‡Dßj“ñ2_Ö“õû©Kyœ|ıAõ'®gý\ïÖ»õnÿ˜Ò 4( 6ˆ+s*+*+¸³áÎ'б²ceNà‘ #ê×Ô¯¸eÉ-Kœñßä“0ó®™wÁ²?ÊsÐCXòH¾(‡ÊO”Ÿ(?—Y<‘3‘ãÌmWÚ×s®çöÞ³÷€Šw*ÞX”¿(`,,`á©…§ÊΖ¨|¿ò}€Õo¯~à³CŸ.Å>k$'Z]ÐQÐQÐÁÀåŠrEšÝf7¿”[ïú£ÎÉåeæeè5z ÀÊi+§ëƒõ3*fT¤¤¡zU¯êü^^u¿ßе³k§CÓŸ†?¸îëë¾"Ï7?ßìœôÈ®‘]Îؽi÷&€ùÛçoh¬j¬r„!OÈ ¾ßyà¥Ú—jãý>ÚñAï½ö$×)yJž’7ù½Ðòµ|-ÿéVù-óüÌý˜û1󦡆· „¬eY²<šöhšóÝ¿ð}ás‚¾»÷ݽu©u©yýyÎS#Üî ÷ÈøƒéÓ‰„cËóž¾uæ­3£ö eiYZÖî‹"£4£4£Tý˜~L?æ;møåKYúˆÙ(ëG›V¬ B@óh ¬¼¢¼â\qÊyðsJœ×·]ß„bq§>£»ºÿ¡û± Úm€š¿ÔΫ Û€uZV÷÷Ê)?M~ë¥eïJÉKÉKÉî’ MÍŸÚø”µÌÞ¹O<‰ûnÛwúð­ß06À‡Ï1ÁÈÙgÎ>°¯`_˜k{Ò{Òãó}ã’‹ËÔ|…µUmU[¯,Wf+³•Ù·íIÔþj_©k”j¥º¸Sñ)% µýuਿÎ_GÀÖnc4'ê<"Öaë0•T–uÜš’ÎíÜÖ2«ÕjKé´o´}´<ÓÜ¥îRc½=É­Z£ÖØTb£y…WxuwœµH‰"}«ð ¿ð ¡µ3Ú™‡í«µÓ½Î½Îp mŒ FœÚµ¯Ö:Ú•¢ X9VX•“ç&ÏagVý¹ê檛ÍFûº¬õ`à…Yõ³êgÕ ¡–¨%j‰r F·Vb^û¬Ô´m@92ç‰9OÌyBˆ”š”š”šÀ ¶v‹JŠJŠœÚ6E›ˆ @¸À.ÄmÎ5çšsã_½Ž;:îè¸ÃZfßå®WŠëô•د¥i‰;­ô$m½P’Ü㉾{Ú”v‡ĵÛÔÜÔìЮËp®8PôLôLôL\‹}ôÑ´¾´¾´>k•­É 5CÍxð¹$)îJâK?þ@ëphw²¦x•âS|ŠÏ©ÝÀÑÀѸv£ÆQãh\¹?ÌúaÖ³ g_Þ]Ï}?×uíyžû~Yû ØŸ¶?mwF±ýk>eGÊŽu£ø¬¶b[ñµðØÇ} °ºiu“î·°7óã׋Xüñz漬k"¹5¹ÕæŽáS°;kwVÊQü‘íŽöE}s耶/Ú¾à]øóç?˜sϹÁÂfÜÌ7×›|ñürê}HêJê²ýÉ+’Wˆ@z^zÞÚÊhÂØZ(ÜU¸ àvÂíÃÚ]`%+ 7$ˆ9¦ã°å›ëM>“ßÔ3õ£~\[\[D hoÑ^ÇgÑþ¯ ú©ê§L½H;PG+A ªAí í –Àð^lØÀÂfÜÌ7×›|&¿©gêGýXG©‹ˆÔ¿ŠV¢–¨Ë†ú4"®ˆ xT;¨$bÀzÖc¨JTPÛ¯íÓöæÔœšŒ­†ÛÜ'&0@K‹ˆQ¥}«} zj”J”˜é/夈ȳ àwŒéÍÍíGòùNAÐ²Š‚Âÿ%–XŠÃ9äÆAí}íýe¾|G.\pÁ`bÔØ³ ±;ûóå‡Êq@Ï6ùÎÎ…Î…0nŒß½1 Þ@o N6œl8 333àIö${’ázÓõ¦ëM–½L/ÓË,<Þ=þÛøo?ìîÙÙ³s9+›ç·n¦¢~„EDª ekËVPOeûûöÞs˜%³D|¾ß\-¼Zxµ6º6º6º  ¿ ¿ ßªíóþóþó~ˈz@= °ð6uÛ½m÷`óÙM/ozÙÜS£L÷x>ñ|ø¢~„ùÎ|£Íf¯#‹,h~îâÂÅHŸJ¤ «£«£«ã¿'v!íBÚ…4(é(é(‰‹«Ô ê ××Ö×Öׂ|.MÒ¯]|´øhÜÎß®»]Œ9F«ÀêÔÕ©ú0ÝÓÓ`x–Ë>z5ŠrŠrŠ ÍÝæn‹»Ô³gfÏÌžŒ;w2î€/Ó—éËü¯ñΛ7;oBv^v^vë=Ö{¬6­ÉIÌI´ÚŒ1{wèîðÁªOW}ª'Ц·ëí¶a±G²#Ù’)EDÄ« ‰¬‹<yFDÿR÷èY·Çíq‹¤¥¥‰äçç‹(Ç•ãÊqeB™P&D†*‡*‡*EÆ|c¾1ŸÈü£óÌ?"r+pK»¥‰49=OzžWYðµk¯]Ñ·¨A5h¶Kb0/˜7ø‹,y»½Ý"¶—DDx;¦Nõ§þšú«HÒ‘¤#IG,cÞAï wP¤ ¿ ¿ ßšŸ Ï…çÂ"¹I¹I¹I"¥÷Kï—ÞYT•EE¤jGÕæªÍ"¯\˭έ–pYðÍ©7§x[ïZÓµF$¡9TªüŪÊHyMy 0aV¥Ö£õÀBýBËB FøT¸6\kÑüöùíóÛ!ä yCÞ¸»R«×êµ0}eúÊôкSwZqEUf”Œ{;çdNâªòûr{¹L?bö pL9¦‚‰0ò÷ÈßË<ù ·è-q} TÔ8TADãã§9Íi0úŒ~£Ø£Wê•„ðÇøOŽ\¹×ÇþúWÁˆu^£4¡4Ádô‘¬Nª“ÀY-¤…ˆÄ©¤¼ÇQ⪋QFãwÃoøë±|ô ½‚§4ŸæVÄø‰é…ìüï¿ò¡}]<´ï±‡óûTO.û²mlIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-7.7.png 644 233 144 2262 13755454066 14757 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜgIDATHÇÍ–_h“WÆß´Ó4P«½Y,†VÆT,c]&š¡m%EœÖ+a£ ­‚P½p*È&ȈXðß”57­uÞ¹®f±þ¹ÚE]kë¿aµH#6Ëlòïüv‘œ|_Õy×sÞ÷<çyžï=ï99""2¯ð+PRURUR‘Kv8ù²µekkbù¸Sg£gãà~˜¨|ñðÅà FƒÑà4¼t ÜûáÞõ{×ÑÅ 'Œ^^ßø)É×íó^‘•í+ÛEøEDÄói¡ Ù±Ýccâ‰ùcÕ±j‘ÞÑÞÑÞQ‘–lK¶%+r[nËmqÆÓÖ§­O[Ebþ˜?柆—¹¾ã¿ãá×SF/¯_ôýýºÆëÆëÜ%×zì½Â^ád/ø/ø/ø!Òé‰ô¸ÐAÔAPÇÕquüø®HW¤ËEÿLwënà[“0úy?•s*çØ¿CòYòðgáØ¯ÖµºÖáI]L]L]„ÀóÀóÀsH,I,I,qæÕ„šPÿ_šXšXêê´Ø´Hõ ~þµbêK+`œøÄë¯O¼†P}¨>TïäsËrËrËà~â~â~ÂÉŸ,?Y~²Bµ¡Úëí?ì'ö`XŸÕgì»+V"’§Ã¿Ý¹Ñw£OD”ˆÛe‹®×õ’5»???%ÒÔÐÔÐÔàôÔÄÞ‰½{EÖu®ë\×)’ g™°È­¶[m·ÚDš7-nZìj¨¢JDZi%Y™]Ð3úÆÏ›§»pJ~¶z,§‡ôä7““‰g♸«ûì}ö>HMMýH?Ò U“ªIÕ@¦/Ó—ésõÖu†B£¬Ik²ÈòÖ©|ÿ{ì+¶³ÿ?Þ¿×=æºùiö6{ wÔõ¨TíªmœáŒs1Ê# ‡õ°RL2 |È€ƒ·;ìräT¿ê/vèMh.k.3•švóÏØÿÊûº˜±ï±™ù‚ýÞ,E° éÀIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-16.8.png 644 233 144 3112 13755454066 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÿIDATHÇÍ–ûOTéÆŸ‡¼†ÐÁY‹YWmÛ¬°vc2k/Åh¢ñmº¥q›lIcb²-nì&ÒX%ê¶[¥Q u[Q²[YeS/@T$ãZpÕE\VÆ3çœ÷ÓfCúøþ2ùÞžç™sÞó¼¯@’”“øxó½ùÞ¬xìݒ̧-M[Zð×x\gƒg…gÅÍ=ýQöG“ê'Õ;·“±[wûÇÏKIüñ|n^9J&ü þOY"Þ k^[óZÚ´xüû‹88ýÔ‚­g¶ž8uôÔQ~÷/ß¿ 0\6\ÉØ­»ý7_{ÿ_ßYßYO/ø'ø'H0óí™oÏùE¼á«9PþNù;ý)ý)Æ öC “LSDˆà®¡q±[Oô»ó.ž‹ïò¹üq=‚©¥SK%¨XW±.p$>pûcx/ø^Ðå‹j¨!¬ˆ°×ÛësÑ\Àƒ’±[wûÝyÏÅwù\þ¸žä«t$é?Á^e­²Æ]r&ÆæÄæ€ùÜžbO!–(ó3Si*Áê°Ú­vpúœ>§äŠðßEƉY“¬IĬ¾X^,ÌÌ8>¬\5|Ÿà{•’Tx=žH*ÿ¸3ëÎ,°? D£3ϙdz1Š,ÒIsÏÜ3÷Æ ÙÏ~öA‚“ióÄ<1O€ßQC €)5¥<ãxIøRø@ ˆDRiëñê’ôËb=Þ¸o㾉ÿy¥÷•^SœR*Iúôð?ëCõ!:Ã]]’FôLϤ»w;ïvJµ‡k×–®…¯…¯…%õ«_ý“™ÌdÉ“éÉôdJ7 n̸1CÚÿÛK>,Q ÷?>ùø$&z"z,z,)̹â\q®ÀО¡=C{À™îLw¦ƒ ™ ÁPõPõP5˜Ef‘YvžgçÁàÈà׃_cì_EçE硽N×öÛg¸†[ךVxß¾¤BøIøÉˆ¨sÜ9>ÎÇ6RE8'â$"L¾É7ù`†Ì—ï7}¦LšÉ5¹f¥YÉ3óÃ8¾ù*|5| 0‰¤Òדt~“p^S™R™’t~üÖ€5üÉ~n?O:?§8Á 0­‰#è(G9 |Ï0Ã`n™Ó &úÿbØ#ÄÌë‘õø£ëü•©•©7¦ñÎÿòž•/íí⥽½œ7Øÿ‹þ‘ÇW5"ŸIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-197.png 644 233 144 2654 13755454065 14770 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜaIDATHÇÍ–ëKœgÆï™zšjl’!ƒIJ:P‰HÉ‚©`it¨(©D$¡­[I›æƒlm³I醖ÅÚ„PfÓ´Nª0HcR°3Õ  …]cLÉÁÃØt]< k⼇ç·fßqûäùòrŸ®ëšçæ¾ç‘õɯ€;ßïÎNØîwÖëY¯oÿ!aŸ·ÀUãªùç_ ç뜯r¿ÍýÖ¾íØ:®óSëEüT>í—õâ82/g^v•%í“pà¥/emJØ_DÀsÅså¿&4ö4öt×ýïÃìÙóeóeàØ:®óu½ÆKÅ—“ÿÇ/é½é½®™‘™!¯¼Vx$‘ð[!Tù«üÓÏL?£Ü`ýXÇ:UĈ¡Ï\Š­ãÉ|]¯ñ4¾æÓü =_ÝøªT×U×y.$ n‡àxÞñ<Íg\>ã3Ö3cV½UÏ ¨ˆŠàÂŽ­ã:_×k<¯ù4B¬íí—å¨@F 0ŒA°¦¬)°Ÿ5ŽG0Ô°ZRK(-ÙþÝžµgÁ|`>0€ ©ÕjNͪY0ãÖnk7Ê:ÿ þ†•c”å ^ÑøµF­æìÝê¯ÆGÆGŽŽ` øFð ­­­pøFúFúFú ­¿­¿­fNÌœ˜9Ó¥Ó¥Ó¥Ðîi÷´{ øŸ`4…K— /¢þõýèÙѳ«÷¾[M¼ûæ»oêÖžÿ%)ì×9ÒÙÐÙ°ªã-óo+Þ/+‡öìw¶ÂVØ‚É3“g&ÏÀÖ[wlÝ{Æ÷Œï‡’PI¨$;;wvî„R_©¯ÔþJ¥¿ÒÁùǽo>ùæV4ŸõGènè®öë‡Ù?gÿ¬.s6:rn"î}²ôd º^ìÚÕµ ò¼yÞì0+D´·H¬,V6rSÒ‘pDD‹ˆð¶kz^=/q-,ûNöì;"ê¨:ªŽŠlØ6°m@dqÿâþÅý"§O7žni8×p®áœHqkqkq«ÈUëªuÕ©ž¬ž¬žt~¨¼`»m·Äe[‚O2Âá‘U=šÊxbJ˜2ÇÌ1g*ÿ¾øùâço‰·Ä[œV¬<\y¸òÕ<ªyTꚺ¦®9ñ…c ÇŽÁòýåñåqŸÌn³°’|šíTîú <³žÙXLXÖ*@%Ø vË£þÑAXubÕ €ÂHaÄŽ»¶ZWñÞ|Msñ½|ʯh®ÃÅ%£zÉî€]ëv­ |äØ]·!g gào Z¯·^¸vþÚy¾†äÝä]€7ÕoªÁµÕºŠWù Ï‹¯uü‡_Ó ;š͘¿ÏïÓ4X»eí–Òo€?K¡6T˜Y1³Bf€˜òÈ“ÕÀ<ó¨ç¥ÇVëKñ*_á)|ŧø=o*Þ¤iP×T×”sÖIˆÿ m«ÛV+>s8ÌaòÀš·æÄn±›· oËÛd®­ÖU¼ÊWx _ñ)~Göï½=ö94€0Ç0ň°ÛívL{Jú¥i=²Æ­qßÈýr?ÈY9+gÁ2-Ã2@|!Dˆ|Q%ªò3«ßêÇa œªšci¾4¿æôIä$s’óYðD<ÀÛÁ>fcAZ”SüÀAâ>7¸Á  •VZ=~€·¼õø±›íæ%tØžæKó;z–„õÞ}íûÚÓÉŸ2o%¬È¹ä:õx ?ÐèÐ5Ò5Ò5z·Þ­wC"7‘›È…ždO²' §_~uúôùûü}~x|îñÉÇ'Óê¤üÍ2‡<|i~GÏ’°ß¿ƒ‹sçÒy{ìŸÌõæz÷[ïOÝŸº?Ç Ž‡Ú‰Ú‰Ú ¨(®(®(†Hg¤3Ò ‡7o†P ÜF9£ŸÑÏènÝƱר«ðå—ßÑ£A~,?&¯@2˜ z þ¥(e®=T3T3TáÍáÍáÍpsñæâÍE¨¨¨€ñÁñÁñA7>B„°£oGߎ>ÏN&˜aè”õ²Þ»ÅŠßÑ£AáÊ•ö¼L¼Lx½ÓÌd‘E–›>whîÐÜ!¨©ª©ª©‚òŽòŽòˆïŒïŒï#l„0¬Ñ×èkt­­­ð|p¿Ýo÷C?ͧø=ï­˜h´J¬×îv»ƒ°5¼5¼5ìúKï•Þ+½W'¯N^„K-—Z.µÀ†Ë.o¸ì¤Ûº­'2&c¬Ø»{Lþh•Yen=~6ül‚¡`(‚¢§EO‹žB]´.Zuá›h¢ 8;;â!¶}¶Ïö‹¼æ5€¸ .|°ÇÞs*Õ`¼ÅCº§Ò8j5ŽÂ‹ìÙ/²Aœ§Ä)W@ª1Õ˜j„…é…é…iOA~!JŽÏàýЩ|Çû pæØYû, òWù\>‘½²×å“>é“>)™’)Zhþß{ÇäÀÃ1°Ûì6L¾ççò–”ƒÀIzñe%yämà€«Ón¶›1AŒŠQþû'ÿ²ýW.ÛÛŲ½-Ïì?‚qÁíô6åIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-28.png 644 233 144 2463 13755454064 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜèIDATHÇÍ–mHTYÇÏŒŽÎˆiÂ,.”†-4-N&$QôÁ”"I-*¤!c«±bä·Š*¢]±Q"*Öju+2{Þ¤kYkif1,e,Ùe-FED›Á{ïùí‡;wîÝ¥b?z¿ ÏÛÿÿ?ç9ç™#@!Äüį{ž=Ïž¥ÛöoL¿s½sý?éöYl›m›_‚ìÖìV€œ¶œ6mд¸‘o­ÂÄ·ò~1_˜Žôëé×me »¶/Û¾Ìù™n÷\7]7ß+°ûöîÛ]—º.±½á^€É²É20m#näõž_4þ‡_pÜuܵý éiéiBÀ¢u‹Ö-þVOx³*+*+Þ¦¼M‘vPÇ€L2e0Í4Æ7n±x"ߨ7ð |ƒÏà×õp¯u¯ªkªk\?èƒíа°a¡Á7{8Îq2A™V¦TŸê#ò‰|€ ˜¶7òzÏÀ7ø ~]øwo¿ÿ ¶:·:“‚~%ªv«ÝZ‹Ö¬,²© (}Jh¿iÏ´gÉC{¯Íh3 ü¥¼QÞ€üRn‘[ ÒN1Ëßê#õ øI>ƒ_X-õƒ+ì O§Â:¤ïØÚií4Q9N.¹À×ÔPc á!yÚ˜6¦]tÑe‰ÿÈ.åÔQ ÑŽ%nà'ø’üºž„°³¿ÀÞÃ{'×]l´@vÈÙ£¯ ´ ´ ´š³›³›³!¸!¸!¸ÁÔñ¢ùEó‹fhªoªoª‡Ð±Ð±Ð13nâ%[œà3øu= a¿€+SW¦’å»´w³'fO$Ö¼*~Uüªò”<%OÒU¥«JWgÄ3âÖöÖöÖvð^õ^õ^…*•¿ÊEEE0X;X;Xkèšíœí4ðå.“_×# «'«G^‡ðŠð ËYq(A%hÚ·öÜÚsk4Ô5Ô5Ô™þ•'Wž\y|ù¾|_>x;½ÞNð—ûËýåà xž"H bÁ¿§RYZžä×õÈ™—3O€ñwãï,×^•aY'ë¤EHÈò…|P8V8V8›B›B›Bp¿ÿ~ÿý~p·¹ÛÜmPÕQÕQÕKž/y¾ä9...[„ ªÕÇÖ1cðëz>¾c}êõŒi÷w÷w÷wCFnFnF.­?Z´ÞŒ·xZ<-(©-©-±´¬ðZáµÂkà_î_î_núÕ2%]IÿäŽ}øŒ©ñ‰ø„yÆ.º/º/ºÁ´íA(i,i,i„œáœáœa8?p~àüÔxk¼5^ÈŠgųâP½£zGõ˜è›è›è³œ±!å rð“gì#·²G¹£Ü1qb¯c/c/!ò4ò4òFSFSFS`tõèêÑÕŽ džAËÔ2µLˆ<ˆ<ˆ<u¿º_ÝoÙ˜~&™üß·òsLÿ6‚¶SÛIÔ'D‰Z½rRNÊINé”N‹©, _ãÀ ÓÎ5çä‡ç˜-9i…>y…ØêÜê<ðH(±Î˜Ò+Ú6äX#‹4‘&ŠìQ{T¤Š|1%¦„Mü!FĈ¶iÛŒmFñ¹È¹Bà$•T!lö [†@ì“÷ä=¡ •J*…C¤¦”¦”*½Blsms9Öq#~#Þ´N×Ñðó\þ¯œ³¯‹9û››/Øžl¤qì«IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-32.6.png 644 233 144 3067 13755454067 15041 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜìIDATHÇÍ–ÿOTWÆ_¾È0 Û±e£!¥6£1”`˜Ò55A)¶‘´ÝFZ[m¨’Vé&ÉàÚThLkÛÍ®q‚¶LÄêºhÉîc­RX¿B™#P錃óížÏþ0\gÒ¿ÀóËÍsÞ÷<ÏssÏ}ÎÓìS >#>#þw¿-:Ÿ¼>yýþÁíaˆ++ÿáxêã§>˜ÿùüϵÁ(Öëzìz‘(¬ž>/&‰Nl[\É,þ^Í{5/ù÷ü—‹`h?Fø¡ânÅ]À£ëëŸò¼ˆÈ’¿‚Ñcôx•6Ü7Üü€—@-UKñáÄT¹*Wå@ 4Äi¦™fPNåTΘy#FŒ î©15 *U%>ZgùÏêÍêÓñ#¸DDÚ/)j6×lÖÙ´ß^)»R-E-…-…¨!ëPóPsTo°°°Ú²Ú²Ú²``åÀʕѺfÕ¬š5Šo½u«îVXY;¬¨ÿÖõßè¿Õ#¥æõš×{?þˆÈÀ»ÐÕÙÕ ÿÞx3ýfºª6š·tÞRü›önzgÓ;°øþâû‹ïCWNWNW,²,²,²€Ùav˜±+cWÆ.è ôúQCîsîsîsP´¤hIÑ(k*û°ìCX¹uy`yÿÕOGëFëT5|íúÚÚòˆÑòS¤>P6ðöx{à¬Ökè5@Ã÷÷Á®ÙÃö0˜{Ì=æh¼Óx§ñìÏÜŸ¹?3j`ÙȲ‘e#Ðh ´Æ;î;î;«®^¸v´îhÙÑû:÷îÙ»¦LÞto:€Ûëö‚÷Õ¼¯”->þjÒsIÏ‘#ÆG DÖÅ›ýf¿LÖ¯©¯ª¯i_×¾¾}½ˆËçò¹|"•é•é•é"–TKª%U$¯%¯%¯EduuUÄrÛrÛr[L˜0‰$Ç%Ç%ljäþ˜;”;$rR;™}2[ÄÑá;Â2)bºgº'¢æH…T#á´”ë)ו ïÞ‡¶³Ÿ|÷Éw°®¡´¤´$úæ+6¬Ø°bì¼¼óòÎËq ã@Æh,n,n,ïïï˜išiši‚Ék“×&¯-Á–`K€\o®7×Ã÷Aþ‹ù/ÂáƒGÛŽ¶C(œr>å¼²‰2è{¬sMçpÖ?Zûh­ª^µ.ß•ïÂoZfÊ2eÁ¶à¶à¶ ´–·–·–CRaRaR!¬2¯2¯2CZwZwZ7´µµAÁ‘‚#G`äÐÈ¡‘CPÕQÕQÕ)”)à•/׿\úªlF›Ô©Ù=6{–]â\mbmbô/ 4ϔ̔Àøåñžñ”æÔœšüüüÀ}Ì}Ì} ÆœcÎ1'85§æÔàaïÃÞ‡½0U:U:U Únm·¶Ô uB€‰}oN¼‰ 7ŠÅ1åPmvm¶¸í—ûor쟑\QŸ=αjUO%©§ÕÓ ¦Õ´šŽÉ)>|18@€˜ÍÏŸxƒ7@ó¨D• ŠT>9U^R3ÃW†¯§ÓžDþ¥ç˜žü~=y·$lIöD’YÙC¡ ÀÖÂA¬œå,JýC}©¾Õ¯ÊÊ®ìÊÔRC ¨)5®ÆÑHòó­fÐ եЯ¡_£zòoIÜ’QýLJø{V>±·‹'ö>ödÞ`ÿf\$D×EÓÝIEND®B`‚routino-3.4.1/web/www/routino/icons/ball-8.png 644 233 144 213 13755454064 14357 0‰PNG  IHDR °ÚSbKGDÿÿÿÿÿÿ X÷Ü@IDAT(Ï­’A ìÿÿó<N Qãz…5@’¤a€Wv?X‰ºà‰Ï×`åýÅ&ʉº+Ü’_vêëß7óU/?£IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-32-red.png 644 233 144 4265 13755454063 15605 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜjIDATXí—mLTWÇŸsïG\X”&Š:¬!XQ¤ß1 耩£‰4U±b uC»Tl›©Q a•U¥*XCqŵÕjYµÉFš®£Ì ¬±RDv`˜ûòß3çÎIV³Ù}¾ÀsÎóò»çüÏ9"¿§–™f‡ÙÁþˆÓ2¦eLKÖ"I‘I¹sœæÐšø§µJ’H"‰û@¨¯UòxžÏëñú¡ý„e¡t!`Z²–¬%CVJ•R¥Pæ*s•¹€bSlŠÍàæy<Ïçõx}8¤¿%JGcvfgv"©\*—Êîòk¥µÂZ!Ût°µr­n¹atçèN@sùîûîUn(7û±€ŠPUûÕ~@sùº}Ý€Üà]ì] h«}jÜ<ÌZiÝkÝ+ÛxÎÃùÈôØôØôxÕ|`)³”YÊ´çoΧΧx¨ãVöûŽøŽ|ðpC®h_h_NàhŸkŸÊQ‘ü¦ì—Êu×íüÍïŠÇKK™å3ËgZçÑù¤mÒ6iÛr>Q“Wó~ÍûÚGÙîûÑ÷£¡ƒ÷—'¿<€ãk¯€KÛ/m¹V®õçÀcDêü©ó'¨;_w€÷Ü·ç¾€á›Ã7Ù®&©Iz°§&¯&¯&OûH_Ù>ÒzcfÇÌŽ™ÊY/²^d:Ðqü›O¹N¹ÿ¹€ñÃã‡~ö’ì%FÀ+3¯Ì!WÈ€˜C1‡€ÎÐî%ÝKºĹ½n¯ž$¿ÈêKíK8çã ^{`íµ‚_¦tÉkä5zùPêüÔùoÎ7šÛ›ÛÀ¿^ûõ¬LX™KmKmÆø‡9s ñ½_Ýûê tcàá<œO ©DS¦)Ó”©Ÿ13°t–NDãC{¢öDMÛ=m7ÑùÝçwÕ‹õ"Ñü´ùiDDÑ«£W-ýyéÏDD)óRæoõ¬zÖàŽ5_4_$¢#ô½EDeþþ¦&S“©I?òü~ÕrU/ª^TG#l„0gpg áÚVm«ñ0 ÄÄ€õ¶õ6°d– Ö/­_Àð;ÃïÇ·Ñ·^=xÌÓÌÓxÓÇ¥pg¤r¤ÐRü'’g¥MH›68 6Á&Ø|Ï•õ…uj]ðŠñ(c‡ã†ãàäᓇxǜnj =î·qëíÉödjj€ä‰ÉÀüƒùòû;Èr œVÕÄ`¿¶ª¶ª¶*ýüKa),Å÷œÄâqÁ® ~Êâ¦YæZæ*ñÎ ß}ü.(Ï•çpkË#îGÜ€¢Á¢Aã·ß޼im=Ñz » »`rääHè®ì®ôaõЮ¡]à›ä›¯#SF¦³wͶζªú N'‰“޽¤ÈÌÈÌÈL"©]j—Ú{ô ]Æ’Œ%JÇQKêëá…#äaóØ<#`Á³‚gÐÑã?ÿÙB6·ùmóÛ^ ÅB1 #"‚œj8Õäß*ÚT´Iõè€bXp/ÇïGðSÏmêSŠ)Å”âªã %¥ÅmÅmÚrýþ˜p7én4 ~Kýî¶Û>µF­ßßhŽjŽàýúû¯¿€“oœ|PòêoÕ߀æÍà95X™P™€ÕúZÁ6° #Yl2›Ì&Ϫ oëçk3ÛÄ6­8ÊYkâZQ·:ZíÓíÓáе[¤ÎRg¤êÕ>Ñ>¬À £4à…ЖkvÍ®¹{{ÏöžâÆNÏœž)oÓWr¯4QšXbÕÑld#›d ²¦S:¥K{ÉNv²‰½âSñiñyýi=jYeY%G;?íú¦ë›`Cm¹oÄ7øßÐÐ¥X)à[åV@Ë‘äxd ØtscÌÆ¥H†$§ätì‹Ý»=v;‘`¬‚•ÐåqÌßþæˆÄGâ#v!agÂ΄D¦|S¾)ß±O×nº5ÝšnÔ®Z¢–À pèG?úƒ ­ÌPf(3‚ë[½°zaõBm¹þ–G›¢MÑ=#~ß26t§Ùå°­'æ^ õ-cýÚužj·¤´¤Ô Ýh9ZŽ©ÏÔgê³àµÓ‰NtŽˆÎˆÎˆN-[×d¤)D¾·'LŠGÂøÌôê±Ú ÝÍlóŠlÖÈY£Q»ŽVGkP»r««¹>‡c‡c‡c¤¤¤åM]‹Mb“Øt(•K- ½pÀßÓk,À µÛ+ö´[e©²TÉÑÎFg£³1pt¼à¤%J.”\^;ÒQé¨t´3ð“$âïa}ã4îu€áÆÞ h÷ÜÒnÆšŒ5k‚Úu¤:R©8éŸ×ô`¹,—宨ÚFèëËè¿´×iw™X!Vˆ®¹8·,·,·LûKòhòhò¨ü}«{Å^±·d*5P5PàÚaýÌô?Z¸v÷…úÙ¶…mh%­¤•êLaŠ0E˜0bÄè¯×âoN~·ï÷{ò<ç{Ɉ?¬¹Ö\kz,¶n3ó)î÷oÿ‹[5°TYª†Às-ϵd¶g¶ë#flÔþÄy?‘ÏÈK†˜ {·½ÛâŠÇPSXS˜ò›Xüç«z!õÂB¶½ýkï—Þ/ùüúý¯ß̸f\`ÆFÝè7æ ¼D|i|Š_’z“z-ÿ{²=YòÖç­_Ñk¸»ÊËÊË~¶ýlSVÐKX¢\€?ÆšNˆz¼ß˜7ð |ƒÏàéÈ~;ûm¨ÜR¹%µ-60Ò {röä|‘ Àg|ƈú£~í}í}B ®ª«X°€u£ß˜7ð |ƒÏàé1·2 "ò—uP=Z= ú"ף㑑 Ñâh1‘¸R¥ÏéÓú4DÇ£÷¢÷@å«|•¹3Ï<0ë½N¯#¢>Ö¾Õ¾}i ªƒÕAà‘ÁolåeÇçêOõû)}ôúèu  €w@¨Œ3Á¨zU¯êvÚiOr†3œJ)¥”ÿ_EQê÷Z“ÖD ž}‡…ѾÑ>0øcŸ “""­×;*wT(úïnÿôcùåà)ð8<”Oó…}a“çVÕ­ª[Uà9ä9ä9¾Ã¾Ã¾Ãf]y•WyAR§Ô)3?vqìöØmÔ?k.m¼´ÑäcåŽîÝÀý˜Ñnˆˆüûcøæü7ça°ìîKw_RõG–æ/Í'T±¡ÂYáG…£ÂQÝǺu@eqeqe1,_µ|ÕòU0R;R;Rk Ñ:´­ÃŒ×F×ί‡·Zß|ýÍ× Å_£^ïê:Þuˆé±Z¶§Í¦Í¾¶F¤tqéb‘¹ž‰G,m»ú?¼÷á=±o{k›{›[dYÖ²¬eY"³m³m³m"‘ÁÈ`dP¤´³´³´S$ù\ò¹äs"ÍÍÍòdÙ¶Ú¶Ú¶Šxö{ö{ö‹\éºâ½âÉÎ~þçß{¬ËÒ&Þ’¹’9y1ý‹ô/^[cµÞJ~9ùe^‘Ôàšà‘ Ö’PIHîuîý`ï"-9-¹-¹"awØv‹è zƒÞ *„ D.÷]î»Ü' ,ˆè9zŽžc ëéíéíééºÙu³ë¦È¾œ}¹ûrE¦>šj™jyÒöÐrÚþ®ý]ñZ£Ö(¯ˆ–½xxñ°ê†ð'áOà¯}ÇŽÀ†O×»Ö»ÎnuQuQ5¬¾¸úâê‹àžtOº'ÍúÊ+O¬<G4óM™M™M™–’–’–y•yy¦­·-í|¡óÿÿÐþ•v$íˆêe7ÎØyçy'Lì ® ®Sõ«7¼:ùê$¡¬¡¬Y7 ¶°¶°¶ÆûÇûÇûaÓÁM7„Œ¤Œ¤Œ$¨©«©«©ƒaç°sØ ………à;é;é;i mnmö4{ dȹǹÇï×~¾ïsÎgI^^^^^tX\ŽÅMà¯ó×ùë¬)ïã¼ó>f« îÜ)¸³;в@xü/Bˆ"„l~y¡a¡a¡¡•¨$¹ˆ@" `^ÆËx™)ö(ö(ö\þ6›¿ý¯J2I&ÉdNEþªüUù«Zú Ó Ó ÓˆM„0’¼È!¶ù¸tt 0ñˆ§ŸŠbX ¶¹gݳîÙ•±æsùÓ·ÍmsÛš;æ6ÍmšÛ´ù?4¥šRM)7'mNÚœDr·È¶È¶È€Ø Ø Ø @ú,}/é¥ë¥zKõ}~’¿Ä#ññ¾>Æ´LË´b*9@a¥\Æ…}ûáì™Ù3³gî nnnöIHH žèÞèÞè^ò”"W‘«ÈÅ^Ãkx jÌasÒ‘Žtk°k0·ººЧz-½–^ ó|ñMÄ7â‘»OÜ}âîûÞQ‡©ÃÔaÛ”ÞÞÞ»J™‰™˜éz*}Œ¼1ÿÆüó,°ÀêÏ7ð |ƒå¬Ûåv¹]÷ÿA¿]¿]¿]ˆ744ä?Õ9uNz¬À ¬€À ÌÀ àq ×p €üà`3˜°ë± ƒd BÀ8Æ1Þ¡uhZ מª=U{JHnnnå/ËUr•\u㢰GØ#ìy<ãq<>:MU]ª.U [-[-[ýŸÿœ»8wqîâýÐõF½QxÊ”fJ3¥ñ—ujZ§Æ ±Cì;ÄAXÄ" ¢!€Œ2[ä¹VÒJZ—õÞmÞmÞm@€1À`Ä ©¾þiýÓú§…§$‰Gâ£ÂŒ0#Ì$Ǻ?wîþ<-&Øl 6²pcµ±ÚXÍKq²Øìhi£qªQj€ì#ûÈ>7q7ˆ!àÀ ƒ ²e=×À5p BŠPh¥úÆ:c±ŽÿTò—x$>Ê"X‹8ögO¢'Ñ“ìèÞѽ£Iºté>‚\lÛÄ6hÉ÷ä{ò=ÀzY/뤭nnnÆËÇËÇËPPP¯ãu¼°«ì*»z¾b¸b¸¸»ùîæ»›!-­ä'ùK<Â…p!ü‘WÇÇÇQôPâC‰%’r_9½AoÐÛÀ6° ‰&Ñ$¸p=àzPZVZVZ ŽŽŽ.Ã{É{É{ ‘$’DÞ£¯(­(­;;;—õØýعä/ñH|üÂÄÂÄÂþ+*9*9*¹ªvU»ªs,›e³l¨I)#eqqŽ8>j‹j‹j‹€Å›GÉ£äQ˾\'×Éuþ?úy„<âžçóÆWeª2U™˜[÷èºG×=ŠÜî‰î‰î §xoâMAÏÑsôÜÒu –ÊRY*;ì°/¬J¨J¨Jt{u{u{@K %и¹¹ÝÓ¡2”¡ ¨z¤ê‘ªGþ½Åmq[îÑÿ»‚¾@_ /8Ó8M"(Â…p!ì¼s«s«s+†„ !CÈGΓóä<˜ô¸iÜÛ¸·q/àßçßçߤf¤f¤f«Ç걜’SrÊe_ómómómÀßêoõ·Þ£·ylÀóÁ|ð²ž|E¾"_I2Û=Û=Û!ª§zªg穲XY¬,J†V ­ZÅÎ÷L÷L÷L¤˜“b¸¦‡§‡§‡6ÚFÛ(àLq¦8S€ . ¢]´‹v ýfûÍö›@kikik)ЩëÔuê€)ÿ)ÿ)ÿe={—½ËÞ,—-—-—ÎÉÎÉÎI€¶Ñ6Ú—U´ŠV°ŽYǬcx[9¤R %Fa̯äóø<>䶤·¤·¤{õS=S=S=P«âTqª88wíÚ=tA¨‹ÕÅêb€kæš¹f@£ÑÆA~A~A~@Ò}I÷%ÝÒ é†t@ý¶úmõÛÍ¢Y4 Ð:µN­ÐÕëêuõX`vfgv¨cccÄxb%VbEñ/ñ~(çW_Z}iõ¥·ŽÞ)¸Sp§àÁ—&2&2&2^®Ù^³½f»7Ûd7ÙMv®dWô®è]ÑX€8 ð„zB=¡@GeGeG%ùEä‘_Ñk£×F¯Ä1G̨کXÒê8Ôqx0æÁ˜cÀ û û û¡¨ùºæëš¯Å¹±³cgÇÎÒËê!õzèRò½8zqô"àùÎó络zÍNÍNÍΘÌf®¤ÉÔdj2±èE/z¡Z„¡Œ·ñ6Þ¼”øRâK‰@xIxIxÉ=7‡ZhfdFf¸n„^Ìy1çÅ *$*$*®ŸžýéÙŸžÅ8óÙÎPµ*H¤ šBŒãÅø”$®†«áj\+Éâ˜Çu¡Íhön!ñ$žÄï|qlûö¯žLO¦'SüÛ>qŸ¸O¤ Ñ'¢ODŸÀËbY,Ôä ¹B® @Àƒ_¯MØ„M~ÄøÎiõ´zZ í©ÉS“§&…C3öûŒ?)›—ÍËæÿžÄ’Y2K~ç[vŒcÇøPߘçݲ87òÇH))%¥—²èºƒî8ÒL0Ñ÷Ì0à !ÓQä(r-:ÅT1ULð0ÆÃ÷€ICÉ\Á•¥³ R¿¿,ú²èË"oöäéÉÓ“§ù“ò5ò5ò5Ÿ®/Z_´¾èo‘|䓳Ä …]Ò<ªÁF0"ôá0ã0iˆºu!êBÉŸ”¯(_Q¾òYádÐdÐdï¨ ¨ ¨ ðfK†$$,à,Îâ,\p-OQ,ŽÅ±80_'íÖvk»•íìªîªîªæJ4NSã÷Ô{ê=õ¯¾Õ—ß—ß—0+³2+¤Ç·:ç;žýD?Ñ=·znõÜ܇݇݇_}K¨ Ô^?·”ÝçšžkzŽí$Y$‹dA!~"~"~TPlŠM±)€D \v«Ýj·â³æÍ›7"@cÓØ46@Ü*n·¾ú=AOУó´’VÒJîä"K–^DÚß_Å¿oWâËn¶/»òe·þ·²+ö‹ýb?ÔtÝ@7`AÈr…\(Þ7¼oxßà]o‹³ÅÙâ¸kÊÊÊ%ÛÇ8ƹ,–‹åb9Ò·³Ò;N[XXXXX§ÔQøN,eÈ—Ýl_vOú²ûù¯²ë1{Ì!ÓQá¨pT@M)¥”bJêD‹«ÅÕâçFËGËG˹kʣʣʣ} c c cGß¹öäµ'¯= øõ¾ëÔ Ä·ú `I öøÞ—Ýú_e7d2d2„wÔäÕäÕäy³}}@oPoPo>²tYº,]$UݯîW÷¢^Ô‹ú¿µñÏóÏóÏ» ß¾%| ðùýÑwtý’‹Ão¬ÄÄÄÄÄD¾½LÎäLNþj‹´EÚ"ñßÞµÞµÞµ‚"\®ßûÞÏ»~Þõó®  Ž«Ž«Ž«ì=U=U=UÞÇf<3žwX– K%ü=”U° VQÝPpØÀ&Ä5Òø%ü’‡àwÖod·MhB“7Ÿ5°Ö8Hëh­û.|þ™ùgæŸ#eå²rY9½Ê™8gú¦ÕPg¨3ÔíN´Z­ƒä+q¥¸R\É>ôÕ5ûç~‹ƒâwÖ/²ë{\xó‘…,dñÿ"i$¤ýÓÀšXkÊIW­S­S­£WßDcëÄãâqñxæ­þ”þ”þ`á¾zÒ`éú=Žÿ”‰Õ·Del£IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-7.8.png 644 233 144 2447 13755454066 14765 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÜIDATHÇÍ–]LWÇïÂ*»AŒ}ð+‚”©‰ÚMh4&hp ¬ZŒšV‰ iZ}Ò"~=h „(¡mi F1QŸÚF¶ºš°©MøŠ[Œ" èBaçÎýõawvF‰}ã¾ìœsÏùÿÿsW€Bˆä诀¸åqËã’"vÜ!ÓïØæØ–Þ±k$ØŠlE?À‚êÕ)õ)õz·iûF¼5_ßÊgøE²0 Í Í¶ü¨}v­ÝµÖñIľèçmçíq ß9|àVí¾~¿àMþ›|0mc߈7ò <+¾8ý¿0çÞœ{¶07a®°b늭+Ë"ÏWBáöÂí½ñ½ñ*ä¿À<æ©|`Œ1Œ5d±ýh¼‘oàøŸÁÑ#`QÞ¢DX–Ê3ò J&I§t‚ÊWy*Këãú8h¯d¢LD©Lí¢v‘0Èa9 LFðQ% % †ÀK[,G)„kªÀÙïì³CPe ¿ô}ú>&,œSLY¬ &¬»JSšÒ€ *¨°ÄýÄSž_ÈÙË(`*8“?¢'."ïÛõBì¯Ù_3_ãTF|F¼ZÕ}ÿEÚËž—=Âéuy7x7Q7R7^7.D“£ÉÑ䢫¶«¶«VÄ–Ín³ÛìB´§·§·§ q¹ürùår!‚¯‚-Á!Äñâ'MÚUíª¸/23UŒ?¦'¢ð¯cðkè×蟨¯êø*}ç}ça“g“g“v<ÞñxÇc³j½µÞZ¯Y˜¶‚¶‚¶H«I«I«"Y$‹$¤e§e§eC÷WÝ»»w›ÕWvƒ/Âoèô éj†þœþk—(¿òƒîÒ7ë›MoãÒÆ¥K¡¸¥¸¥¸efo=q>q>qÂâU‹W-^^Ý«{uXXX€À`` 0`éŻƓÁÑ# e~Ê|½ †^½F£Ÿý•­²M€ÐÍÐÍÐMHíKíK탇™3fÎÖÚÜÚÜÚ Ó¦/Lw½»Þ]mmmh 4-Â:Œ1åêùhÅä—Zª–jÚÞwÞwÞwàÊuåºrMÿdÙdÙd„ C…¡B¨tUº*][[[mÆeÝȺ‘uª>­Ê®²¼°üü£{¿ÇÐ"g.ïN{¦=æ÷ç©òTyªàBù…ò å&pïµÞk½× «#«#«:íöN;ìÔwê;uHîIîIîw©»Ô] Ãû‡ý–ëþh !DÍŸpäÔ‘S€ ¯ãw­E3{H½­x{òíI˜ðMø&|–£8¡ŸÐOÀЕ¡+CW@娕r‰\"—Ààèàèà(ÈïäQyÔÄ£]ók1úºTÏÿŸcG9ÈAKS}8ÇFÔˆåP尸׍bU *(7Ê–96 ŽÂ‡slæä':‰5€ð#Ïås E“Çó=uÔ¡bŒÿ$ê™z¦žƒ 0üÂu®ƒúMõ©>^9)' ƒì”VüG‰Ã¨Ô{“ÖþWÎÚÛŬ½ÍÎìsüpîF—¿ûIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-80-red.png 644 233 144 4233 13755454064 15604 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜPIDATXÃ¥—LTWÇÏû1"¿v\RʰÖêêª+êj] M4–& ]ZkWQ±Õš’¥"”õGD-µEÙÔ’ÙyÀ"¤Z,ù‘ÖîÒº–¨f˜`§¢Œîè̼7ï»0÷Í›ÙlM³çŸ™sï¹ç|Þ=ß{ß Ñ„M¡ ãW†IaR˜ÄýÛ?5©yRó¤æŒßŠŠ¨ˆÊ?ÏÒBZH ‰iµŠDId>ì«U,ž­gùXþàzüÊ`=_1S1o ž+6‹Íb³uŒÛÅíâvi Ƙñ˜ñ˜q\ÜpwÃÝ wœáœáœa ;%;%;%à³yÏÖ³|,?«÷Ó<Äÿ.ØŸyŠÌ?æÛ²Š/Œ/Œ/TöÔvÕvÕv©ÎÎÎàÂ<ÁvØa4ß?ÏâÙz–å®7óÔOó‘)šáGøû%– ¥#¥#¥C^6èôz1¿©‰j¢šY)UJ•R@Y¤,RJ–’¥dé|ÿ<‹gëY>–_ªoŠÖÐ8+gå¬Db…X!VÔ÷²æ*óæä, ìmõ¸zN¹ÞcñXÕîíóöð(וë€c8À‡`ó¨™j& Ú½_y¿äzw·»PßVW¨+àdaæ*ó!ó!9‹Õg<Œ C†!ÃКÅ,ÀTn*7•«³l?Ú†lCxäÏãT{ï{ïîà(¡=Êvu;À ¨Õƒ€HDþw¼rØ{Å{Es¶m°Lå¦2S™:‹ñh|âq‡¸£§‚MÔÔÔ¨oø¸d«÷®÷®®‚ûvâíD¨[S·.I—$¿•¿”¡LÔßÙß g®ž¹ ÀÝÑÚÑ HF2 [åH9R vÕÔäÖäªoh;ÄGª#fAÌ‚˜¨ËËËÜÃ=ÈH`ÏÜÙ ÂIá$DçEç÷lܸq£°¯»¯f”Í(€Èë‘×uñÎâîân@Ë?aòXÆXÄXÀxýóú#ë¬?x2eГçÉà`C™©™©°lײ]úÜ×Ò¯¥ë‡²‡²`Óç›>€W<¯xôñç_=ÿª.Þqkÿ­ý€2ìb<Œ÷©¹†tCº!];caTD7é&MeC™Ý™ÝDDwŒwŒDDŸ®ûtÑG›?ÚLD´ø‹Å_E‰›÷Ù<Î/Ïyä-ò@t;è=5z ÎÞ8{P :¹N.°¿}lm=±¿D_ÉWò•Ï2¸iÜ4nÚ¼Ú@áÚùÚÌåsù«OsNâ$¦ß¥vk‘µLm.e·o¾o¾HmQ[¹È ª7Õ›€$$ê*õ°z8 ¥Ëðèð(0ÙÔbj‘wh;ù¾p@8PbÖв(‹²DÝqL¥TJß'+YÉJ$8„QatO K`:mÚfÚ&mû݃n½vµWk5ªuÚuù?%õEõE@Íõ{‡¡­Ìû{^N^޲[{=ˆ¤ƒq;ãvÆí$âͼ™7s~º†éÿÌ„a€kµwÖÞY{‰ …†BC¡tPÓnª9Õœª×®¯ÄW7$H<ÄC< l´2G™£Ì h±ziõÒê¥ê*–Ï`4 Æ‘g¾irp§¹¶Öâvû¦ÉÚµ5´[RZRªÓ®Q6ÊÆoÔ7ê h±}è¤ð¾ð¾ð>uƒ¦É(>ŠÚô§)~ÂF?= Të´»™Û¼zgá,œE¯]©]jhWn—Ûåö€rŸÆ={ÌŸ?>\ùµ¦Å¡Ah8¾œIÍ/½PÀ_Ðs,À´ë:í55•6‹Íb³pà 7ÆiIkIkIkàÚO‹§ÅÓ}þ¿$á×CêúÇ)ây€¡Ælòk÷ÂÿÒnÚº´uiëÚ•–KË¥å871¯jàò¹|.õà2üúýL{žvW •B¥Pi_Ä€óËóËóËÕc‰žDO¢G¾©µÚ!8GI<ÕS=Õ“ÿÚl!õÂèÿ´Pí öÓú¹­ÜVn+@™”I™¾ßðÓùéüt€#Ž8ºÒ™àJp%¸ˆ„¡Gèá.û²ßU?»ÕÏ3£ö-Ò)]ì žÞWÀ«¼Ê«×Ƶqm÷~51>[ éÌ`HÞç¶ú?V‹0"«EIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-53.png 644 233 144 2437 13755454065 14676 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÔIDATHÇÍ–KLTWÇÏŒè@"ˆdbMl$¤‰¡øH7.@A&ñ• è ij¤šP“b5Æ,D£¨,´ÖE¢V­º(ZDMÜŒ¨¦ ^afî¹ç×ÅÌ™{ÛHâ’»¹ù^ÿÿÿ~çœïB!RcoÎLg¦Óµ–?qKâ–Ï~‰ÚM;;‚ßCʉ”içÒΙÏ,[Çu¾½^ ßΧý"UXW›«Í‘³CñêâÕ‰Q»þ>$u$uLà¿ê¿ p¥åJ _Ãp÷p7ÀXþX>X¶Žë|]¯ñìøâðÿø…€ù7æßpü ®®BÀŠÂ…+¿‰&ô¯„­Þ­^€¡yCó”ä(°…*˜b ý|°Ù:Ë×õOãk>ÍÕ#`qÞâÍÕ#þ»¶ àKô%@äÈ  Ì,3‹ˆüA^–—Qòs¹J®Y*Kd PEU œÊ¡`ôA#jµ*VÅ(0ëÍz"ü#ïÊ»€Òø1¾8¿° Ên„¤á¤á©è“}RRf™YFˆÁXó&e˜a†™ø¢ e(8ÂŽX~~£vÀÏ1Ž˜Ì„kü_œ?ª'&¬éO¨ª«ªÓhæüh7Ž[¼‘¿"]‘.èhéhéh“y'óNæÁé;§ïœ¾“'O>†Þ'½OzŸ@CQCQCôôôØ>àWõH=BÙ–8Êçê‰ ëÙ&.LÄËËÔ¨QoÔ[=kkkƒŒÁŒÁŒAðÎxg¼3PPP]¢ µ µ UOÀð„(K+K+K¢²§²§²GˆEÁEÁEA!BCCEü¡ÅÙíìÖøŽf‹?¦Ò’Ó’Í^øðöÃ[ëØ›Gå^¹×ú®ƮƮFð_ó_ó_ƒKKKXž»iŽ}dòGûóCÞ“÷Ì}æ>"Ôs“›(õ‡º­n?ÑJ«­#ßRC ¨ßÕuuhæ!Q`Ö˜5D,¼þì“Îþ+çìíbÎÞÇææ ö_=>a4€A IEND®B`‚routino-3.4.1/web/www/routino/icons/marker-home-red.png 644 233 144 4172 13755454064 16307 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.1/web/www/routino/icons/limit-35.png 644 233 144 2500 13755454065 14665 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜõIDATHÇÍ–mHTYÇŸ™¬QJÍh)XEh×ZØ¢V‡j1i3ÃÖˆ! bÃËF/$I‰+„H¨„Ù›öŠZ Õ–µl‘D®E¡«Qfi1Úlù2÷ÞóÛ3wîm)Øž/—çœçùÿžsÎs€ˆˆÌ }œ ÎgLÐvþdÍGfDf|U´+tpä8rþÚ±å±åq'ãN-Û\7ýíñ"–¾gÎËL±&\—\—i!»¼‹¼‹"¿ڿ݆¨†¨†÷lkÜÖPªþ?ÃÀ;¾4_X¶¹nú›ñ¦ž]_ŠÿéW¦^qôkškš$¦'¦Ïû%èÐ=²³²³^Ly1E9@f0C¥~ü˜ãÍ6×Cþf¼©gê›<“ÌG`öÊÙ+EàÇ?nŒª<> ññ&/Ðâ3@ók~}³¾™qP·Õm8À²ÍuÓߌ7õL}“gòƒùÈÇ{[úlˆÜ (€@;ý¦~À(2Š½Ê¥\(íoí‰öÔ÷j…Zøðá}¯¾Gßú·z’žúýˆ~E–Þ 7ýµþ 雼0_ì }SQQþxª?Õ¬£Ô(åƒÒXÀ „ýìÇ­´Ò ¬f5«mó:::ãŒÛæ1òŒ¼:¬ óÂü`>¡Ä*þ€ü¢ü¢pðüZ¿Öj˜éLÖà᳇Ï>ƒÒžÒžÒèöt{º=¶~mýÚúµp<ûxöñl¨º[u·ê.¼ízÛñ¶#즈ÑD/Ìæã Ömi“HêîÔÝ¡2Š#Ye=ëeÂ1SÞË{qÜë»×w¯O$µ!µ!µA¤ýtûéöÓ"î w†[ä~íýÚûµ";ÔµC‰´x[¼-^‘vG»£Ý!ò®õ]Û»6 X/NqÊ„Éû˜¿´I ¦-¦M]‚”[Á·ψ9®e^˼– …« W®‚Ë›.oº¼ –./\^•žJO¥¢‡£‡£‡!3'3'3jkkm;¹„Å,þTÇÔ1û›ü`>qÑqÑÆ#xÓÿ¦ß~íÕ"ˆ  90r`äx:<žpÏqÏqÏŠÞŠÞŠ^Ø~pûÁí¡®²®²®&.L\v]Øua—íÞѵF;ÏäóqŠÍF³ã‘ˆ¶N[.õlc£‘b¤ˆˆ&šh"eî2w™[Ä«y5¯&r5ùjòÕdJ(¡Däú¹ë箟‰‹‹ÉÍÏÍÏÍ™û|îó¹ÏE|šOóibjÙ'û,žÅå…‰lXpTtE™¢­ÿŠ™ÕúgàÖR¥jl»nÖl‚«Ñh̽÷|öœÜ«s{ö¾„ß9¿ß÷óÍ9÷üî‘‚ô¯@VIVI–/gm¶Ç=µžÚNŇMp­s­»· òå˜vlÚ1ë¾ëyבּõ<=.b¸Ï¸Ï¸jÒñ^ØPµ¡Ê3#w rÏåž{i@ðBðÀÙö³í4ÁøÍñ›ÏjžÕ€ëy¯ëµžS_ö¾Ã)—¦\r€;Ç#ó–Í[Vúu*a°êVÕ­ÍÍVY`N^¼ªˆC?G¬çÓùº^ëi}ÍÓü”"‘_ÖÖ¯­Ï=š*¸vï(Ö¼ä9 …¼`ÄŒ€Ù`6uM]À… ìXÏë|]¯õ´¾æi~ʼ½·¾€õîõnà9@ò˜˜€ ·Û$>ãñe=¶†¬!p¬U„ˆªeʯü`üeN5§¢Ô7Æ=ãI0Ÿ›Ï¸ÖOó2|qªørÇsÇcñ*ü"ü"£¿’Bs»¹¸ú¯þ¿ä ¹Ìe®c¼”RJYÌb–c¼’zêOÌ}æ¾”-`%¯Ã/Ã/!ÃOûI;|¶îÞº[«XŸªãÉÖd«½CMC›‡6Ã#Ž8w¶ÜÙrg‹Íµ:­N«ÓŽíy´çÑh-l-l-„‘‘Þ‘^[Oý‘ìOöÛ<›Ÿò“6ö{3œœ<9 ê€ú*]‘ˆ–EçDçÀ’Š%K* nÝþºý°pã 7BßhßhߨmèiðiðiU.ª\T Õ¡êPuʺ˺˺abÕDÍDM&=¡Îj^Нýd‰ø®ú®~ö¹ˆ©©ˆúVDÄu4½ÓîÐÍPo¨WdX†eXDŠsŠsŠsDjµÚ€Èì¦ÙM³›$ótù»ü]~‘ìòìòìr‘þý+úWˆäWåWåW‰œ_w>p>Iw«Ÿ4/Å×~²D²ë²ëX 2å┋"‘¨®4ŠŒÆ ÏãóøD*T>¨| r:v:v:&rKÝR·”mìuõëê×Õ"ÞÞÞö¸¯Ã×áëI &†Câ(м4?í'KÄ겺\"Æcˆü(""Eº® ³ £ C$ïTÞ©¼S"mmm"ù=ù=ù="ƒóçÎ!Nœ¸HIaIaI¡Èض±mcÛD"«#«#«EbÉX2–)»QÖSÖcûrõi^š¯ý¼ûŽq0½ç¿šf# ý2:NÈ+Ï+Ï+‡†‘†‘†x¸øá⇋aÁñLJ'ÅOŠŸC°%Ølo·À[;›w6ïlvœR̰&Á÷ïÇþóT2j ŽS”ca‘]‘]‘]`Í´fZ3A-WËÕrˆ´GÚ#í`m²6Y›@…TH… ÚíŽvƒõÔzl=¶õ˜0†a@ýï©tô±7áWáWŽ>ö¥yżBÜŠ©Uâh %©XMªI5éXˆ A‚`E­¨uäïS]ª Øl^7¯;úXRóÞÛÇÞêüžõÀÌtþ»æ]à¢5ÝšNR]WAÑNmÀß<ã¨5 €qÆ~á2—Aý¦â*Žâ¼5ÍšF2£—ÑOóþÝù?Øoå{»ø`ïcæ ö]ų…½¥IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-31.5.png 644 233 144 3007 13755454067 15031 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ܼIDATHÇÍ–ñOTWÇÏŒS"ŒÄµ‘bt«íVjLiÔXµ*é„f¢mc2î@P4ÆmlÒlÒÔÄl×­Û%BÕ*‰n‚Ä!¥imM£ºvƒ 01tÉ4…eÎ22¼yï~ö‡™çù¼¿LÎ=ç|¿ßœ;÷û®€ˆˆÌMü Øóìyö9ñØþÇäþìwf¿³äŸñø˜¶÷lïõþ²ŽfÈþ&ûó^2¶òVýô~‘$þt>k_æJr#µ%µÅVœˆ?ƒÊW+_ÿvÒZÓZ'bàýÖû-€ï´ï4»á·Îß:BÅ¡bHÆVÞª·ú-¼éøòÙ3ü"ðÂ÷/|oû¤¦¤¦ˆ@þÛùo/Þ/¸¿\e®2€_gý:KÙÀ2ÈPÅ@˜0Ö[ùD½ÕoáYøŸÅ×#0ï­yo‰@yUyUZS¼áÞøháG ->½8Ä!2 Ž…Œ÷÷‰‚ºª®`ÃÉØÊ[õV¿…gá[|\Oò(#""_”‚;à€y@ïˆõ%úP+cűbô„ReI63Ìt3”_ù•ŸéK¡€bÄPƧS S èÆJ}¾Œ²8>n§Ûi ü¢4y”?Šˆ,¯‡´pZ8ìPf #Ð` ¨Ujnð3? XÀ0Ach£¶irtô§ò‚ yÌcõŠz…H"»| þ¸°åõ°ˆÈ±kŠêòêò§sXÕìvu»àÈÚ#oy¸è ô2c¬>Y}²zÖô¬éY3-q–³œý–~K¿­§[O´ž€ÆwkkQ'þÝøSãOðßϨ5WÁî×w¿êݸ1n‰ˆøÿmçÛÎÿÊî¿tÿ%å™ûyfAfÑò©r­\ƒüõùëó×ÃÀÁƒÁSè)ô&ïôņ‹ f µ„ZB-Ì æÁåqU¹ªàÃÎí5Ûkˆþ!d†LåßǾÁˆë±Û¼éZºVø†HÉ‹%/ŠŒ÷`ìÁ˜­i×uCuC’ê­÷~íýZ$g4g4gT$¼(¼(¼HÄuÎuÎuN$ïfÞͼ›"æRs©¹Tf¬¡¡!­V«ÕjEÌtÓi:EJ~_º©t“¤.îɶgÛmM²¦h¼h\Ä>6çМC…odgfgšw™=262–¼öãŸj»´]°yãæ›7²ð²ð²0ܹ|çòËɉm+ÚV´ |¦Ïô™3'v½þzýõzð¶yÛ¼mÐ|ªùTó)È_ùòü—çCs†ïß'ŒBÌóƒñ—ÌÆÌFó®Ý̺1uÃvW&³gùÇå¯:¾êy•±ÊþÊ~‘ —.\ºpI„Õ¬fµHW{W{W{r"Ñ‚hA´@Äæ³ùl¾äþðñáãÃÇEBE¡¢P‘ˆs¿s¿s¿ÈÖ[wnÝ)ò»àü+󯈌…´ÃÚa™'bÞ6o‹È ³Ì,³Ý•jýÇί;¿˜,,UžÕ_~m˜¨ógŸ³Ü­îVw+h%Z‰V’œÈÙ Ú»Û»Û»!2Œ Šºu+ê kG׎®°Ö¿Ö¿ÖYû²ª³ªáÃÐö/·IôÉß”š{›{AÅõ$|ìØ5~¨qÔ8’·rê¯OŠŸãԇ“'QF¿ÑoôÏ<ªñ}ãûÆ÷îÖݺH!…­­­µWíU{!v v vF&M Ì£ú}K’_j–×,·üìØ5á»g|ìJÜWTÓSó(•¢rT(MiJ›¦,Bä©+L0ÁÄ4—íRªÔ&õú@­S눨Šü…¾@@Z(-vpÓò1ëÂG-ç­˜U1 Øwfu1¦Å4 Éxh<œéü¤àÀœá g€ÿÅ¿•ªOÝV·‘D}ƒ4‚èêÇØpl8›p~*`êYç~¿•Ïíëâ¹}=Ÿ/ØÿA Ftoê[IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-22.6.png 644 233 144 3040 13755454067 15027 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÕIDATHÇÍ–_L”WÆß@fס²EŒ„ ›ÿP@­!‘¤TRÒÄ&`¡ÛHú/"ÚìbŠ!­)¬1€2.Md–Í*iÓ&«4âŠ& …xa¦%](bgv ÒÇeþ|ç·3ŸÃöj/=7_žó¾ïó¼9ß9Ï9""b‰~Œ™ÆLão"ØX›7½nzý÷_Gpg oÞüáSX÷ź/RÏ¥žÓîÆ°×óW׋ĸWëéób‘ØD¢#ÑaØÅÍðöKo¿dúm6æKæKOBpø›Ãß\ì¾ØÍ‡0727ðóÞŸ÷B ëq=_¯×ùVóKó¯ôE ¡/¡Ï0‰k׈@VIVIö# ÿʆÒ7Jßø)î§8e€ð¿RÔ^À‹}xVa=Í×ëu>_×Óõ#ý¤½šöªì?°ÿ€ùï‘‚»_ÁñMÇ7ézÁKÀ)N‘!oÈ ~'ü+ Õ  Ãz\Ï×ëu>_×Óõ#ýÄ~墈ˆõ5¨XªXµ 8ºL¦ƒömp28I0Ú©R›Ô‹êE‡ÆBc 95§æ$6yÄ£gH©Ã¡¡C£ÁÔ`*h~¨˜©˜¼º¾þ+ÿ)"²å/`öš½ÞxµxoøÞ0ð>û@íR»ðsAA»¯Ý×î§9ÍéU´ÑF(·r+÷ªy3fÌ (—r¨JU‰Ÿö(ÿæ¨^TŸ[‘~¢+Ö9¤®Ôj :›–?¹illl l¿³YlÔí‰Û·'bzñññ`[o[o[ÎÎα¸fÕ¬š5†§>œª›ªë߬v«u»îÖø­ñ˜I5ïÖ¼ <ˆô#Ú.gôÚ{íðÃUw«»UUeú7vnìd¥èHÑEÀæ¦ÍM›› «¬«¬« ¶&oMÞš EEEYŸYŸYÃáÀp Öе…k × pKá–Â-PÚRÚTÚ;är¬ŒþõaÝÃ:U½z–éGÂß'Û’mÊþÿ ô®ëÏèÏ€ãjx¹áå˜Àžé=Ó{¦¡¸ ¸ ¸Z­ÆVc,¾mvÛì¶Yh´ÚW5vÞÞÞvoؽa7m?úùÑÏá“|üÑÇÁ’Å·Ñ·`Á·àõpí—k¿Tc\ΚkN°F•¿Jdÿò¾¹}s²X½TýBõ "yíyíyí" *A%(‘«¥WK¯–Š”——‹äÚsí¹v‘tkº5Ý*rhúÐô¡iy6°`Á"b2˜ &ƒHÎDÎdΤHÖ“Ý“-2b „eQÄòÀò@D%H…T°]´ )µ)µÊ]]p§u²c²’ÒMÓ¦ihVÍZ³áîpw¸F»F»F»À0Ì89sræä øú}ý¾~xÚò´åi ,ÞY¼³xqŽ8Gäør|9¾ØJæšWœW gNµµÎÎ@(œt=éºrHh½¾Ç®l¿²έíêRUÆVvLìpîpBVOVOV”¥•¥•¥Aê|ê|ê<ä{ò=ùHëKëKë›Ëæ²¹  £ £ f[g[g[á ý ý ’I“ÃÆËËYY¾ ªÀav˜A]Œî1>‹œ¨k¬k„ÿ DNÉÂ-÷€{\C®]?¢æçêçêa¹z¹z¹<•žJO%¸Ú\m®6pknÍ­Á“›On>¹ K%K%K% ÓŽiÇ@]PÔð|â9â9‚ ·^ ¼²êTNÖf×fë†Û9µ‹˜î+Ï|,[eãçÿ¬Úü¼Ï{¼šWÅ«xU¨ ñ«È­²O=½÷ݽïÌËæeo<7þÇÇôÀú®h¨hõUÄ™Õp81œêFØ6$•"ŠPê†P †"Wº¬.«Ë@-5Ô€ZRójxq~´D-‘  ýú8«;ÿ[ñoÅ+¿vþç÷®|n_Ïí{ìù|ÁþÝS(-ôA«IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-23.6.png 644 233 144 3070 13755454067 15033 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜíIDATHÇÍ–ÿOÓwÇßÖRVÇÝÍ2&³ Òm§q "ÙиˆÛð<Åõ2ð.ó~Pw^œ[â.á07j…-Àî¤YFÔ“DØ© žÙ<ž_–æ€W³Z‘2«ÇÙöÓÏûq?´?½ý¾iž¯oÏgúþ¼Ÿï·!„Ù‰_)ù)ù)óâ8å7z<}múÚÅGã¸-†× ¯÷¿Yg} ãÉñ¨ßèXËkõÉýBèó“ù´¸ÈzÀÔeê2¬IàasÑæ¢ôŸÄñGÁÜmîþu_Ô}pò³“ŸñÜ»rï À÷k¾_:ÖòZ½Ö¯ÍKž/>ü¿ðÄ™'ÎÆÁd4…€…¯,|¥à·ñ_T¾Zù*€?ÕŸ*S ,Xä DmM%a-Ÿ¨×úµyÚ|Oãë[–[&¼¶åµ-æŽxÃ7ð®õ]«ÆíhÀJH ĶŶyQ^À€t¬åµz­_›§Í×ø4þ¸}+¿Bˆ¦—¡jºjäÏ¢—•Áh^4ÔkѱèÑ„R©«ýj?(w”qed‘,’Eèk?þGHÊ:å=å=¢Š7šÍu(>ªÆ«ÆÆ¯måY!„°5ƒ9d…Òäw#—G.¿`=Èersœå+¾5¨Õ ÐM7ÝIBNsšÓ€ޤ¸ wä]y@n•[™ãPbþs ¾?WãzÿXÛ%ٻðàMS_¶ €û)wª;ysñÍÅ7ë|ÞëÞëÞë಻ì.;ŒLŒLŒLèyµR­T+u<úΨsÔ MijojGÞp^¼:¨ó‘±ãÍowâz„ºL!nížöžvèÿ{à`ࠬ͟{ºíé6«¾:kuØNØNØN€[u«nxxx`£m£m£ ò}ù¾|ø|¾]P°>X¬‡[‰­Ä••T~¿ØbØ#„½Ÿ~ëüÖ)k¡g¢gT{\O Gžt?é~ñ%!*ÞªxKˆÑÍÞfo³¡ãWû¶vlí¦ ÷.Ì^˜"{2{2{Rˆóç;Ïw ±{åî•»W ±}ÞöyÛç 1ÿöüÛóo ººº%­^{¯½×.ÄXæXæX¦V“5Ûš-ÄÚMë÷­ß'Lù¿Ï9•sÊÐ!D±¥Ø"„áLæç™Ÿ¿ø’@É1ç˜ÕAù»`u°Z?öÃÛ†*†*ÀÞlo¶7CÙ®²]e»àáôÃé‡ÓŠ…b¡¬Û°nú `[e[e[^‡×áMúÆŽDŽDŽD`ÑŠE+­€ÖºÖºÖ:(8ñì'Ï~§þz6ïlSéôCl"s.sNêqK½¥^vÁÌÝ™»ð¯ƒÃ-Ã-ñÓô±ô18ðÇ t"—Ëår¹ ÂQá¨H°Ä±Ä±Ä-}-}-}züXͱšc5°ôÁÒKèñÞ¾üùr8ÜÐênuDGƒËø2ãKÙ%”§´o¬·°·<™=£=£²6åŠB^ž½Ü¸Ü¹Å¹Å¹Åphÿ¡ý‡öC¹³ÜYҬҬR¨6V«0är 9 Ð_è/ôƒßç÷ù}PÓ^Ó^Ó‘Œ™Œøåà{ߨKxöß²ºÌ]f'ãzÅO8÷:÷ÂÃsñS2y5p.p©gÏ ÏB¸:\®ŪX+ÜwÝwÝwºSÝ©îY+ke-L5N5N5‚zC½¡Þy\—ÇajßÔÛSo#c‘ÒHiÒ©®/¨/Ð ·íRÂ.tÍW>ó@æÉ<æ9eŸì“} =Ò#=úÖH£4J#È  Ê`’m¢Š*PC2M¦ÈYœŒß*ëåG¾ùÀYÅYÅ"°Ý»Ý›Ò+é€]º,<Íå(i ‡õ0€±ËØETêÀlߊ[ùV½ÕÏêoáYø1>öQΈˆœ,…Š{÷@=  ]ÕG´-Ìoµ;Ú´8SeQ6—›©f*¨€ ¨KM¡€«èè(ã‹M‹MhÆ Ú>mÛbý©¬XQ±Â"x²Ô>Ê¿Šˆä7@J8%NP3cWÇ®¿`+¨"UÄCÚé ÔYuVcƘ1f?~üKèhhè îsŸûjZÃÃxt+Äñâø1bù ñkùF]yÏñžãÑ>¼4ê‚úÕõõ¨€'à xxÌN{O{O{áFÁ‚Kç8Ç9дmügü­þVh~½¹¶¹Õúmsws7Ì3¢FÔ| ö¾²÷P¯Çøˆ¹^D$p¾üüËÏỿ…Ž…Ž©ª•Ÿky®…hñtñâ;àtº¡ç|ÏùžóP=V=V=fßé+MWš®4=N|Ö7ë›õAv0;˜„òªro¹~Ý·³fg Ñ›ëfÍYSUAçG9ãã¤myýòú— E6½³é‘¶ž<áhÿÕÇoµ¿Õ.IÝYÝîn·HúáôÃé‡E***Ev„v„v„D\ù®|W¾ˆ¹Ö\k®•Çlt|t|t\d®v®v®VÄ\n®0Wˆü2¯tKéIòÜÈtf:íRðêü«ó"Î{éGÓ¾\(è™)™)æ°úÝÔΩöµÝõý¦ï7Áº†u ë ÄSâ)ñ@d}d}d½½#E{ŠöíN³Óì4ß±Þ†Þ†Þ¨îªîªî‚ mÚ.´ÁªÜ9î¸ÖùIç'LƒÐ`üùéæ§›Ía1ϧդÕ(ÌMÌMÀ¿Ž~6ú¤æ$ßL¾ G~qäù#ÏCøPøPøÆFxCÞ†¼ yà÷ù}~Ÿ½>Ù2Ù2Ù]ý]ý]ýp0÷`îÁ\;^˜^0T0ÍZ[B[@´-ÚÆêÔñÔqåsª"­‘Öëý"×6_Û,2à ŽÙõGs£¹²Øõn—·Ë+âºíºíº-r±ñbãÅFû¨’'O>.’š—š—š'²pkáÖÂ-‘²á²á²a‘ìSÙ§²O‰ôúz}½>‘ŒßfÔdÔˆ¬_óõš¯eñݦÝúnÝ"— /Š8 «V_ïNÄn¼_÷~üGÝÊ»ÿ }ú BËBîª U…ª`ababaÂþóù¬ù¬ù,Ð*´ ­H$‘D˜öN{§½ ö«ýj?èuz^S w#w#(³QÛªmµU€[5ù5ù–žµ|#–nØ:béÊ#ó(Ï#Ýùÿ!Bd‰ÊþCõ©>P[ÔÛêmõšz‡ÊïïH™M™ 'pítÌš'KùcÅŠ :bʬú4# ”O ?@ãO\æ²­ü8èˆ 0b³R ©ëê:0ŸMFТ©¿ë?é?çâÊOeBe°øsårgåûºxbßcOæ ö¿öË…YûIEND®B`‚routino-3.4.1/web/www/routino/icons/limit-17.9.png 644 233 144 2736 13755454066 15050 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷Ü“IDATHÇÍ–L”÷Ç?ÇurrMÓÑÒ9™4cKÐD®4$×`Z[Lš´"ÆeIëªm¨YÑhÿ˜ ÝJ€¨5ÃHL6—Ö®Ë š5QÐtw›XìÁÎôÜÞóãûÚwÏ=7Íþ÷ûÏåýùñ~¿ó|óùÜW@DDMý d=•õT–/‰³6;ñ¼çòž+;žÄ]&¸žw=ÿÍ.XúÁÒ Ž±®8ØÎÛõ™ý"¦ž—GÅ xNzNº)¼^Xõª¼Ç’x¼ƒÞÁÿÐòIË' |Äoà»s߸¸Ûy»Þî·ù2ùe÷}ú"àv»¦Á“ëÉâšâše¿Müs4Ö7Ö|›ým¶ÊóßÀ–¨'Ž}bØÎ§êí~›Ïæ·õlý¤µ¿Z‚ƒ½‡“ Wþ o>ùæ“¶ž>ìcKÀˆq³Ùlæ¨ à¶óv½ÝoóÙü¶ž­Ÿôã\¥%"òþ¯0›Œ&#mhÔD÷ë~àæ+æ+è V²e,&Í—Í—Ì—Àô™>Ó* ªU5÷eÝ5|†ݸ¥?®?ª9ÉMóMóÀí”~ú*gDD–w€wÊ;ÏáT¤$Ræß¨ã/Ö3Ö3hi ƒEùÿGC˨FiJSð{ö±@U«j4~™âÿax4< à{ãñÎ'ý¤¾X×Yî´¶´¶€Ú`­¶‰»£ÝZ·†º:u5r5Ñ3Ñ3Ñ3ÐÑÞÑÞѽ7{oöÞ„>OŸ§Ï&LxÐïåí—·_Þk:Wv®D]‹¼yÏÎZ«Õô–å[–ÛWÛuVø™ˆÈÅßAÿ³ýÏ‚± @½úòè‹[^ÜÂ={DF.Ž\¹—/5^j„J¥¿Ò çÎ7œwf»çBÏ…ž Ž¡ñCã‡ÆAiKiKi Tý©jÕ~øñæòÜò\îÍÔ-<±ð„z>îø¸”'éGøƒ¯ÎW§NBôDô$ÊXÅ*8ñ“ãóÇç¡x¶8Z…á¡á¡á¡¿Ä±¢cEÇŠ i¨i¨iÐÑÑ|gcgcg#¬¹¾æúšëN¼"¶úÓ՟¿é¹Ös ñeâK0ÌG¾xä uR  ¿ ßšät¬7Ö ª/=öT«‚UA ñ­ƒ·Þ:%7Jn”Ü€‘#+FVü=¤õÿõ?{L•Ú¼jCö†l›UÅcÌ3@—©™ZzÞùä‘lç ÞÈ0!LÔ?Ô×êëô)˜Óæ4º:g̳ÀßSülÈÙè÷oþ‡÷¿ò¡}]<´ï±‡óû_ÛÓµ: .IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-16.9.png 644 233 144 3037 13755454066 15042 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜÔIDATHÇÍ–ïOTWÇŸaf„—ÁElj‡m¥¬«Q£5kˆš(vmêHl%ÅÝFœÈfÓV][(»©/Äd5ı»uY‚nT`‘¥cCÃÒHÑM¬ ËìZ %–¥£"3÷ÞóÙ3—;Û¿Àóææ{žç|¿ßÜsžçI’²’²’Òb8i¿5ŸòzÊë/_ˆá³:ØÞ°½q¯ ܹ?XX¿°Þ¸oa3næ'®±øõÌyIk"¹9¹Ù¶5ŽÁ[«ßZ’Ã'¯«ÕÕúXƒ²¶²6€Ë —ø |{ýÛëS[§¶‚…͸™o®7ùùåØôEÀù©óSÛ $ÏKž'/¾öâkÙ¿%ü; ó ó¾±cWI ÿXÀµÆã ØŒÇóÍõ&ŸÉoê™ú1?‹òå‰ÀÎÝ;w»þ[pÿopÄsÄcêE[ãgha-  —ê¥Ì‚º¦®`Ã6ãf¾¹Þä3ùM=S?æÇÚJCDäÔ6ô]Ú.mÎP·ñ£hv4Ôçz†žA4PêWªHÔîhwÀ2†Œ!¬f’É9¤ŒGZš–FT›Œ>}TiŒvMâús[9,"²Ü®¯]_‡\ ½z ôÏðòc…±‚'siÌg>¨‡ê¡z˜`¤†j<Ö´šT“jøÇ9 òTOøEœÉ@÷@7€+ì ‡܈ù‰ÿ±³]|ç+ó•ª0ÖšÄueu‡ë£‚ÿ ö{-ÁP[¨-Ô§êNÕªƒÛ¾Û¾Û¾CnåVn ß=t÷ÐÝCpfÓ™•gV¢Ü U‡ªÍ¨±V X~`¹¹µg»„Ÿ‹ˆ|y_m|´*µ¯¤»ø@ñfÍéÈèÈèÈ€èpt8: ¹#¹#¹#Px¢ðDá X·wÝÞu{!è :ƒNËPOKOKO ,-[Z¶´ 6þyãÉ'ágûsæåÌcvØ;óüÌój´ø[ü ’c~„?¦yÓ¼ªF.\‚Èˬf5\ZqaúÂ4x¶x6{6ÃêÕ7ªáÊö+Û¯l‡ÌÌÌÌÌL(¯)¯)¯Š«W+®Â؆± c,cþv»¿6 mÚ”p__ûÉÚOàO÷jÔ>ˆtF:AÓçwÌïPÍIò;ûö/X)WEœÇä+ùJ&vß/q—¸E–\R¾¤\$âx#^½R¯Ô+ERœ)ΧȪþUý«úEšÂMᦰÈMÏMÏMÌ ¯Ýk÷ÚEf*f*f*D Ž-8*Òçí{»ïmçfÇyÇy™±çÚsElû›ö7Y™$ºÑj´Úú$)º3ºSDÖ‹ˆÈ"“Xû»Ö¬5‹àÅ‹W$=Hˆ¤Ö§Ö§Ö‹¬=X{°VÄÝåîrw‰„zB=¡- ´€ÈXÁXÁXHŽÊQ9JdDZîøPäÇjáÀ‘¥ƒÙd ‹Dž¾÷ô=V«m}ñÃÿåaÚ.ž»xpÇÎXüÏæ=ÈëÍë…€?àø­­(n/n/n‡Ôe©ËR—Aé`é`é ôWöWöWšÎ5k:!x:x:xò·åoËßžŸz^ð¼GÊßM}7•Ùx©ìãÞÅî‹ÝÀïÍ3fVeÔ÷¾ï}`ȬJý3ý3˜®™nšnBE#ç"ç,cÆ-ã–q ƫƫƫÀXl,6ƒò*¯òÂøžñ=ã{bíV]ƒÈ?#í‘v}etËè”zª­×Ö[UÉ”o¿o?ÄúéÙ®¸±å~pºFÃx4ðhNßKÄ8oœOèc¿¦„0ÂFذ®"T–ÊRY &Ô„šHèo H!Ô/Õ;êcÌã‰úIœ¿|àûïaNÿ?ÿ×ÇDPñΫŠìEv«ó“¬ kÃÀ_ô}Æêü\¦‘FP]ñ+¨€ï˜b T¯ ª ±Û5ú >HT]×FµQà¦Ùù‹E úÃÎÿìÞ•Ïìëâ™}=›/ØÿÊÿ‚AçâIEND®B`‚routino-3.4.1/web/www/routino/icons/marker-49-red.png 644 233 144 4147 13755454064 15615 0‰PNG  IHDRŽE¹®bKGDÿÿÿÿÿÿ X÷ÜIDATXíWmL”W>ïǺÔQt+êP%~° Á˜õ+Q˜8šH*®Q Œf©ºQQǦÆ@ŒR [ÜŠbƒ ±g°m&[·Ö/´V·Ú°&ÄÚ:3E–Fæ}ç>ûƒ¹ï¼3±šÍîù3sî9ç9ÏÜóÜ{3Dc6‰"L\ãˆqÄ8„‡âÆ9Ç9Ç9³—ɪ¬Êêƒ:ZD‹h0få$“L2÷HŸ•ó|^Ïñ8~d?qU$=¿"*¢"ÑŸ–,;e§ì´¿ö û…ýcü@ü@ü®ä<ÎyœóØôtÓÓMOÜôÜôÜô°Ïã<Ÿ×s<ŽÏû½ž‰+#ý¤*ñ¥øR|éYÄwh¦u¦u¦U=XÛVÛVÛÆ&øz}½¾^$H 1À<€æ‡â<Ÿ×s<ŽÙ/©êõüÈô–Ø%v‰]ž¿q€ôé7Òo(Ë]WÀ€ !c©,•¥BQKÔµP«‹ÕÅ€jQ-ªEç‡â<Ÿ×s<ޝŽèozK£&Ø»`'’OÈ'ä ?ðs¹¹Ü\®X4b°Cì|Jƒr^90€Qõõ`™,@‘6ìöÌh´Jƒÿºÿ:À>`ËØ2øxš¹Üü‘ù#ÅÂûs>œ: †Îµ¿ç ¦RS©©”Íq÷¸{Ü=èáøÔÕcê1{½¨@^aÁ›Á›€Ó8 „)™úqàÛÀ·a4wGöÈè7•šŽšŽ²9œÆOÞ+ï•÷Þ=Á555lg`H±+µJ­®ƒ?è :õ-[]­.xä|äÄ+ìÑöGÛ îTÝ)þçoœö=ûPìÊJe¥–©> B€Šû÷ óZæ5Jñòâå`H6$ê¥sËÏ-÷»z²åÇ–µp—&¤ iç$-‘–HKŽ”ñS–8Ë´É´IMrÿ¡³²³†­ÃVøXfq_qìqïq`V‹Õr³Ü ˺—uÀíïn9§rN€õ õ ^}UYUYÖMHž “:'Á?„à®à. åȂڵAí¦IÓ¤iŸöS\V\V\‘|]¾._oìÒ.ü\óRóRõÇÚØgì3øáà ;;#N}íiý5g¾3(ø„YÂ,ýcùÁO?Q?QÇÞ °þ#ÿZþµàF°P*” nóÇ{)ÒfVÒ ©†TO=/°•Øjmµ,S»?&|>ò9 NQ§ð}ÕûU/t¬íXûŠkÔÿÓ•Ÿ®@ý”ú)€Zð`׃]áý½øòâ;ßÁ:í -ËIJ‘laº0]˜¾ 6Š t_;_Û„m¶wÏB£ÐȵÜãhu´:ZÃû©P„÷€ÐùŒå²\@ê–ɳÃZÔ×ÕØ•Ø•$ÆšÚMíÊ^m'IÅR±Í¬Q³…,²)Ì5ƒ2(C>Fv²“HòJ^É{ðk`:cª6U+F÷‡î£î£á†,3p+p ØV¶І9útÏÏlsàvà6ü¼pë½­Õ[«Õ_”ûå~Çñ„} ûö‰fÑ,š…K!vœæoBŸ›¥'Òé‰pyΡ9‡æ"2X VƒÕq\Ón†9Ü¡×nдÁpèCú«ÎWç«óÃZ¬\Z¹´r)Ëäx£Áh0vŒù¦ØÈI ÍQ£'!ʽé›b i†4Cšû’N»%¶vŠQ1† ŸŸŸ…µØtŽñã;Æw°M“qbœ·åh”«£øÅÐë¤Ê(íæ¼I»J«Òª´†•;œ0œ0œ,X8°p@§i±Ij’šN­àR I/šàDzƒ…8À¯i÷¤é¤é¤bt7ºÝüðÃ>V¶Ë¶Ë¶ËákG>#Ÿ‘Ït„þ’Œ¿Õ7´NÞD0ÚxÁ–vÿúkÚ]½~õúÕëÃÚu¬p¬p¬À…±8Ó&!ä yBÞ»G"Ûˆ}Q}ú/íMÚ]%•IeR™g1'œWšWšWÊþ’:š:š:ªüSµWòJ^ÛLj j Ðµ#¹£úÅÐÿhÑÚ=é¯þYØ!ìv´†ÖКàïÄâ q @ýýfâPâPâ‘tWº+ÝZB…›£&÷3£ö-‹²(Kþ!2üaÈD&2@hš…æ½3¶>×5WîGýÓ%9ç}žsDD$1üˆÊŒÊŒŠᨆˆ}‰y‰yÅßC¸;º×u¯ß= §N$}œôqp*‚5¿¿8_$¿XO³K¢D qqº a|Þzõ­W—ü"„_ÃyÃùg~hü¬ñ3€Á¾Á>~?^ÿñ:À“ O6@k~-^Ë×øóËáŸé‹€~X?¬³B\l\¬doÊÞ´ü¡€{ËakÕÖ*€¢ˆVQ˜ŒÕÀ‰mÙaÍŽ×ò5>_ÓÓôCõ¤–§–‹À¶Ûv> %L} û–í[¦éùÎG8‚üN¿ P¨Å ꚺ€D°æ×âµ|Oã×ô4ýP=‘£tˆˆ|P5s5s –øFýS¾4_¯ù¦|SøÂ•*U¦JT øø­~+¨=jÚCdÍ3Ëìs¤‚Oýñþx|þ¹Ÿª ñCÍ|Í<ðDÓ׎òŸ""«N€Áip:c”Ã2jvP ªPâb˜Ë\•®ÒU:°‘l\THyäÙd“1«95§æ€?s„#ª\•ãâ·aþŒ°^XŸ¡zÂ;Öýµº¸K·K§Ñ×ügÙÄÄÄtý²+±+ugúÎô鈠e·e·e7œÖŸÖŸÖƒuÒ:iŒøƒÎ 3ù÷ß;¾w|/œ\w2÷d.êþ¿¾ïû÷"zʺkÕ®UÚÑv-Á߈ˆ|×z.ôÀÝK3ïϼ¯ê3]ÝÝxË·–W”W€)` ˜041414¥ëK×—®‡¼ê¼ê¼jX9²rdåØŠmŶâE?4~L¦FS#”œ)9^r~Õ›‹÷Q¥;Ý®êá܉s'@Å…ê‘ÀØË]/w©py]^¸`ø"勨÷§¶‚¶‚ˆ@éÚÒµ¥k!¿1¿1¿6[6[6["þo·À g†Î ŠØ»R»R»RaÝôºéu‹v<ß¾fhÍœ¾Û{¿÷>ÀÂW _?ðÒ•—®¨¨è¼ØŽØriwÕ»êE¶¹+•q4Ì5$7$‹äÞ˽—{O$­#­#­C¤6¥6¥6E$Ðè ôÈóßßß'â[ê[ê[±WWW‹¸ººŠT·W·W·‹LVN¶L¶ˆèKc>‰ùD"ÑEÑE"º˜è7¢ß 7JóïôïÔMêŽéé‰Üý«å”唤®½’ßß-²}ÿööíí"555"«õ«õ«õ"¯>¼ú𪈽Ø^l/y:ûtö鬈©×Ôkêq÷»ûÝý"³žYϬG$Gå¨%²åð–w·¼+’¬’,I“uù;Ëß‘TÏ~Ï~y¤>Tê&£Ôž}vvì¶È-ó-³È·YSÓSÓ¼í=ï]á]! Ãÿ¾9|S$¡)¡)¡IÄýÀýÀý@ÄÜiî4wŠd f f Š˜Ýf·Ù-RXXXXX(R”T”T”$b¬0V+DÜv·Ýméüuç+¯ˆÔÕ&×&˦„2}™ž·eâóŸï‰>ëªsÕÝއºšÛ›ÛÁãuÉã›3—g.Ã#f2f2P3¿›©Ÿ©Ácð€~úéG³£ÙÑ ê€: €JU©*ì­öV{+¨5¢F`áË…K —À–o+³•¡”ÇÿšÿµHWò¤©¡©†»2Ôž‘9Ú\ ÏŸÊT™¸ž[Zh¡‚Ž #èX4¯Žª£ê(PGu‹æ["FŒ 6«VÕ ||ŒKe…ùw[~²ü`°lÎþûsL»>¨à/5m5m > Mfu;` AýÃ?ïŸÇǾáß2Ê(¨[ꆺ\ä"98@Mª15¾=Añ·€5`ŧ®ûm~pK›üoƼø~>ù_Ü»ò…}]¼°ï±óû?ÑöÖùÀL)IEND®B`‚routino-3.4.1/web/www/routino/icons/limit-59.png 644 233 144 2472 13755454065 14703 0‰PNG  IHDR"ÀêbKGDÿÿÿÿÿÿ X÷ÜïIDATHÇÍ–kHTiÇŸñ6 ‘” ´ÀÐl%X«Ef Y¦•­!2Ű-¡°[«»D„[`5ä‡je— ƒèƒ5y‰\’˜",Ê V¶+^Òä\Þß~˜9sf—Zö£çËá¹ýÿÿsž÷}ÞW@DD’Bo¨Œ¨Œ¨åA;ê˜í/Š/Zû[оf€£ÌQöä;H¼’x ùfòMó©m[q+?²^ÄÆä³ü’$¶ÃÙâlq¸Bv=Tl¨ØŸ´üЖÐöA‡ãíÇÛZ›[›ù&ú&ú¦\S.°m+nå[õ^$¾Ôÿ‹_b»b»¯ÀçŒ5»×ìά& gBé¾Ò}cÑcÑ* ŒI`Ë” ˜eëya[ñP¾UoáYøŸÅÔ#º3u§|åþÊp#XðôW¨M¯M·ø´6àçXú¬> `6³ʯü8p€m[q+ߪ·ð,|‹Ïâê‘öö§B(/t­Œ'Æ ×Ì6³ÑŒïÛÆm”ñ…‘edQi¸ 7àÅ‹ÔJµB­}\¥¿uL]R—P`^4/¢1oÜ3î…?¸7Ìæ—HA90‘01Ïç (Ócz˜g4„5Ã$“À"‹,†[ˆšWój8ËYÎÚ~ ÙÎv`…˜Ì ̳`á‡øÂüA=!aׂ÷Œ÷Œ…f~ÉÏúeý²Í« h=Z´5·5·5ƒ/ß—ïˇ¦M/š^ÀÌ®™]3» p4p4pKKKàåàËÁ—ƒð‡z§Þ¡"Zä óõ„„ ÖÀ­é[ÓáršÔôûŸLµLµLµ@ÚhÚhÚ(ì/Ý_º¿¼yÞ‹}æ­<ùSÖÊ^Ù+©–Ã|l>6‹TÕTÕTÕˆ¸ \®‘S#§FNˆx’=Éžd‘¸óqçã΋ççç‹´€ÐDbÊcÊcÊÅ~œ’+¹bóIlGl‡¤ŠD¯^On”ˆÙiv:"úAý`81Uœ2*£6Î\Ï\Ï\HÊ‘”#)GD*“*“*“DÒëÒëÒëD†‡†‡†‡D²NfÌ:)rÀ}À}À-’¢RTŠÉìÌìÌì´ñCÒ*­|aþžÏ®±oõUú*{½{3ö6lÙ<‰Ý‰Ý‰ÝPÕWÕWÕã½ã½ã½°§lOÙž2HHH€ÚêÚêÚꈎ ñˆGÀ c‡±ã?רgv¥µkúxÍëÐð´€Ð0™=™=™ f±YlÛ¼‹Ú¢¶¨ÁÛCo½=ê£ú¨>Fû+¨¥OëÓ‘|ŸÜ•Ÿ˜cÂsìºyyÕ¯fÕ,¨½Êe4ªBU¨ PÕFµÔiuZŽˆ¯Q+ÕJàk®rÀ¬3ë˜Gû_sì“ߚ̺ñÀx`Ö˜5h4p‡;(խÀ/4ÓñG~ žzPÔCõø9æP`V›Õh†ßðGà~ò/Ù³rÉÞ.–ì}liÞ`ÿ³õ cp §IEND®B`‚routino-3.4.1/web/www/routino/router.html.sk 644 233 144 100710 14402424654 14354 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.1/web/www/routino/visualiser.html.es 644 233 144 53063 14402424657 15207 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.
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.
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.

Router: Routino | Geo Data: | Tiles:
routino-3.4.1/web/www/routino/profiles.pl 644 233 144 20051 14447777043 13705 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.1/web/www/routino/router.html.pl 644 233 144 100513 14402424652 14351 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.1/web/www/routino/visualiser.openlayers.js 644 233 144 76266 14441354752 16444 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.1/web/www/routino/router.html.ru 644 233 144 104031 14402424653 14364 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.1/web/www/routino/maploader.js 644 233 144 4224 13715301754 14000 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.1/web/www/routino/visualiser.html 777 233 144 0 14402424666 20144 2visualiser.html.enroutino-3.4.1/web/www/routino/profiles.js 644 233 144 15601 14447777043 13713 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.1/web/www/routino/visualiser.html.fr 644 233 144 54157 14402424660 15206 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.1/web/www/routino/index.html 644 233 144 3240 12520735533 13467 0 Routino : Route Planner for OpenStreetMap Data

Routino : Route Planner for OpenStreetMap Data

routino-3.4.1/web/www/routino/maplayout.css 644 233 144 3734 13532500144 14217 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.1/web/www/routino/router.openlayers2.js 644 233 144 162051 13756466616 15677 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.1/web/www/routino/visualiser.html.nl 644 233 144 54372 14402424663 15212 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.1/web/www/routino/router.html.en 644 233 144 77606 14402424642 14337 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.1/web/www/routino/router.cgi 755 233 144 5706 12767517350 13522 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.1/web/www/routino/visualiser.html.en 644 233 144 53047 14402424655 15202 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.1/web/www/routino/router.html.it 644 233 144 101317 14402424650 14353 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.1/web/www/routino/visualiser.openlayers2.js 644 233 144 103711 13755535130 16526 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.1/web/www/routino/results.cgi 755 233 144 3456 12767517343 13705 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.1/web/www/routino/visualiser.html.pl 644 233 144 53532 14402424663 15211 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.1/xml/ 40755 233 144 0 14450044533 7154 5routino-3.4.1/xml/scripts/ 40755 233 144 0 12324523025 10637 5routino-3.4.1/xml/scripts/ride.pl 755 233 144 3656 12306667762 12171 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.1/xml/scripts/drive.pl 755 233 144 3616 12324522764 12343 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.1/xml/scripts/walk.pl 755 233 144 4214 12324523025 12152 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.1/xml/routino-tagging.xml 644 233 144 112466 14435432052 13101 0 routino-3.4.1/xml/routino-translations.xml 644 233 144 160644 14402424666 14211 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.1/xml/routino-translations.xsd���������������������������������������������������������� 644 � 233 � 144 � 15101 12572577346 14164� 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.1/xml/osm.xsd��������������������������������������������������������������������������� 644 � 233 � 144 � 13460 12042033044 10520� 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.1/xml/routino-osc.xsd������������������������������������������������������������������� 644 � 233 � 144 � 13542 12051456376 12225� 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.1/xml/routino-profiles.xsd�������������������������������������������������������������� 644 � 233 � 144 � 7431 11523232407 13232� 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.1/xml/xsd.xsd��������������������������������������������������������������������������� 644 � 233 � 144 � 5261 11506610624 10511� 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.1/xml/routino-profiles.xml�������������������������������������������������������������� 644 � 233 � 144 � 52066 12634332507 13266� 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.1/xml/osc.xsd��������������������������������������������������������������������������� 644 � 233 � 144 � 13507 12051456324 10522� 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.1/xml/routino-tagging.xsd��������������������������������������������������������������� 644 � 233 � 144 � 10176 12156135452 13054� 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.1/xml/Makefile�������������������������������������������������������������������������� 644 � 233 � 144 � 3725 12531654133 10640� 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.1/xml/routino-osm.xsd������������������������������������������������������������������� 644 � 233 � 144 � 13477 12051504736 12240� 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.1/xml/routino-tagging-nomodify.xml������������������������������������������������������ 644 � 233 � 144 � 2736 11663245320 14661� 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.1/ChangeLog����������������������������������������������������������������������������� 644 � 233 � 144 � 1305315 14450044466 10237� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������2023-07-01 Andrew M. Bishop <amb> Version 3.4.1 released. 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.1/Makefile������������������������������������������������������������������������������ 644 � 233 � 144 � 2620 13366130255 10032� 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.1/Makefile.conf������������������������������������������������������������������������� 644 � 233 � 144 � 10406 13713563154 11003� 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.1/INSTALL.txt��������������������������������������������������������������������������� 777 � 233 � 144 � 0 12031126065 12562� 2doc/INSTALL.txt����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.1/README.txt���������������������������������������������������������������������������� 777 � 233 � 144 � 0 12031126065 12240� 2doc/README.txt�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.1/NEWS.txt������������������������������������������������������������������������������ 777 � 233 � 144 � 0 12031126065 11676� 2doc/NEWS.txt�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.1/agpl-3.0.txt�������������������������������������������������������������������������� 644 � 233 � 144 � 103330 11506610625 10412� 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.1/extras/������������������������������������������������������������������������������� 40755 � 233 � 144 � 0 13333077163 7666� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.1/extras/find-fixme/�������������������������������������������������������������������� 40755 � 233 � 144 � 0 14450044533 11710� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.1/extras/find-fixme/fixme-finder.c������������������������������������������������������ 644 � 233 � 144 � 25310 14437671755 14507� 0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************** OSM planet file fixme finder. 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 <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); } else if((p=strstr(filename,".o5m")) && !strcmp(p,".o5m")) { if(ParseO5MFile(fd,OSMNodes,OSMWays,OSMRelations)) exit(EXIT_FAILURE); } else { if(ParseOSMFile(fd,OSMNodes,OSMWays,OSMRelations)) exit(EXIT_FAILURE); } 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.1/extras/find-fixme/web/���������������������������������������������������������������� 40755 � 233 � 144 � 0 12216114770 12464� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.1/extras/find-fixme/web/bin/������������������������������������������������������������ 40755 � 233 � 144 � 0 14450044533 13235� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.1/extras/find-fixme/web/data/����������������������������������������������������������� 40755 � 233 � 144 � 0 14450044533 13376� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.1/extras/find-fixme/web/www/������������������������������������������������������������ 40755 � 233 � 144 � 0 14450044533 13311� 5�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������routino-3.4.1/extras/find-fixme/web/www/fixme.openlayers2.js���������������������������������������� 644 � 233 � 144 � 36520 13755517227 17277� 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.1/extras/find-fixme/web/www/.htaccess��������������������������������������������������� 644 � 233 � 144 � 2166 12640720765 15137� 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.1/extras/find-fixme/web/www/paths.pl���������������������������������������������������� 644 � 233 � 144 � 2172 12153665547 15017� 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.1/extras/find-fixme/web/www/fixme.html�������������������������������������������������� 644 � 233 � 144 � 13252 12625131677 15356� 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.1/extras/find-fixme/web/www/fixme.cgi 755 233 144 6531 12767517341 15144 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.1/extras/find-fixme/web/www/fixme.css 644 233 144 3133 12260524267 15153 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.1/extras/find-fixme/web/www/fixme.openlayers.js 644 233 144 34114 14441355012 17173 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.1/extras/find-fixme/web/www/fixme.leaflet.js 644 233 144 31417 13755516501 16442 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; /*++++++++++++++++++++++++++++++++++++++ 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; } } /*++++++++++++++++++++++++++++++++++++++ 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). ++++++++++++++++++++++++++++++++++++++*/ 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). ++++++++++++++++++++++++++++++++++++++*/ 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). ++++++++++++++++++++++++++++++++++++++*/ 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.1/extras/find-fixme/fixme.xml 644 233 144 3547 12156135452 13571 0 routino-3.4.1/extras/find-fixme/fixme-dumper.c 644 233 144 26645 13327116556 14536 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.1/extras/find-fixme/Makefile 644 233 144 12727 13712516240 13414 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.1/extras/find-fixme/README.txt 644 233 144 10537 14437671700 13457 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.1/extras/plot-time/ 40755 233 144 0 14434674723 11610 5routino-3.4.1/extras/plot-time/plot-planetsplitter-memory.pl 755 233 144 5416 14242154252 17511 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.1/extras/statistics/ 40755 233 144 0 14450044533 12054 5routino-3.4.1/extras/statistics/create-image.pl 755 233 144 13720 12660125354 15000 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.1/extras/statistics/dumper.c 644 233 144 34011 13160524366 13553 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.1/extras/statistics/Makefile 644 233 144 5010 13712516522 13526 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.1/extras/statistics/update.sh 755 233 144 6374 13347430563 13731 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.1/extras/statistics/README.txt 644 233 144 2207 12660125417 13571 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.1/extras/statistics/create-basemap.pl 755 233 144 4301 12660124550 15276 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.1/extras/errorlog/ 40755 233 144 0 13347425221 11516 5routino-3.4.1/extras/errorlog/summarise-log.pl 755 233 144 25220 13347425221 14677 0#!/usr/bin/perl # # Routino log summary tool. # # Part of the Routino routing software. # # This file Copyright 2011-2014, 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 . # 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; "; if($errors{$error}>100) { print "too many to list individually."; } else { my @ids=sort({ return $a <=> $b } @{$errorids{$error}}); my $first=1; 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"); } } print "\n"; } } print "\n". "\n". "\n". "\n"; } routino-3.4.1/extras/errorlog/README.txt 644 233 144 1532 12152437721 13232 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.1/extras/tagmodifier/ 40755 233 144 0 14450044533 12154 5routino-3.4.1/extras/tagmodifier/tagmodifier.c 644 233 144 63462 12574075134 14667 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.1/extras/tagmodifier/Makefile 644 233 144 3600 13712516541 13632 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.1/extras/tagmodifier/README.txt 644 233 144 3213 12574075511 13672 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.1/extras/Makefile 644 233 144 2657 12313271770 11351 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.1/extras/README.txt 644 233 144 3004 13333077163 11375 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.1/python/ 40755 233 144 0 14450044533 7675 5routino-3.4.1/python/setup.py 644 233 144 4146 14402424512 11424 0# Python interface setup script # # Part of the Routino routing software. # # This file Copyright 2018, 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 . # import os import re from setuptools import setup, Extension routino_router = Extension('routino._router', sources = ['src/_router.c'], 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'], 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.1/python/src/ 40755 233 144 0 14450044533 10464 5routino-3.4.1/python/src/database.cc 644 233 144 33276 13372620415 12607 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.1/python/src/__init__.py 644 233 144 0 13351656656 12535 0routino-3.4.1/python/src/router.i 644 233 144 7657 13657511227 12220 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.1/python/src/database.hh 644 233 144 26010 13372351011 12576 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.1/python/src/database.i 644 233 144 14037 14376704415 12454 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.1/python/test/ 40755 233 144 0 14441357437 10666 5routino-3.4.1/python/test/run-router-tests.sh 755 233 144 1543 13364653553 14527 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.1/python/test/run-database-tests.sh 755 233 144 221 14402155001 14676 0#!/bin/sh # Python build location PYTHONPATH=`echo ../build/lib.*` export PYTHONPATH # Run the test python3 ../database.py # Finish exit 0 routino-3.4.1/python/test/run-one-test.sh 755 233 144 3172 14402154753 13575 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.1/python/test/Makefile 644 233 144 2325 13372030354 12330 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.1/python/Makefile 644 233 144 7124 14405342572 11361 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.1/python/router.py 755 233 144 32435 13657511237 11645 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.1/python/database.py 755 233 144 20403 13372623265 12060 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.1/python/README.txt 644 233 144 4036 13535224522 11413 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.1/python/pyproject.toml 644 233 144 121 14403103334 12570 0[build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta"