From 953599970e9d16c8b28b1087d8a6fe02a9db4baf Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sat, 5 Jul 2008 23:45:15 +0000 Subject: [PATCH 01/58] Capitalise German message correctly. --- app/views/notifier/diary_comment_notification.rhtml | 4 ++-- app/views/notifier/message_notification.rhtml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/notifier/diary_comment_notification.rhtml b/app/views/notifier/diary_comment_notification.rhtml index 9d000e9d3..4d5cd1d15 100644 --- a/app/views/notifier/diary_comment_notification.rhtml +++ b/app/views/notifier/diary_comment_notification.rhtml @@ -4,7 +4,7 @@ * Use the OpenStreetMap web site to reply. * * * * Bitte antworten Sie nicht auf diese E-Mail. * -* Verwenden Sie die OpenStreetMap Website zum antworten. * +* Verwenden Sie die OpenStreetMap Website zum Antworten. * * * * Por favor, no responda a este mensaje. * * Utilice el OpenStreetMap sitio web para responder. * @@ -33,7 +33,7 @@ or reply at <%= @replyurl %> * Use the OpenStreetMap web site to reply. * * * * Bitte antworten Sie nicht auf diese E-Mail. * -* Verwenden Sie die OpenStreetMap Website zum antworten. * +* Verwenden Sie die OpenStreetMap Website zum Antworten. * * * * Por favor, no responda a este mensaje. * * Utilice el OpenStreetMap sitio web para responder. * diff --git a/app/views/notifier/message_notification.rhtml b/app/views/notifier/message_notification.rhtml index 55e464e15..7192e3884 100644 --- a/app/views/notifier/message_notification.rhtml +++ b/app/views/notifier/message_notification.rhtml @@ -4,7 +4,7 @@ * Use the OpenStreetMap web site to reply. * * * * Bitte antworten Sie nicht auf diese E-Mail. * -* Verwenden Sie die OpenStreetMap Website zum antworten. * +* Verwenden Sie die OpenStreetMap Website zum Antworten. * * * * Por favor, no responda a este mensaje. * * Utilice el OpenStreetMap sitio web para responder. * @@ -31,7 +31,7 @@ and you can reply at <%= @replyurl %> * Use the OpenStreetMap web site to reply. * * * * Bitte antworten Sie nicht auf diese E-Mail. * -* Verwenden Sie die OpenStreetMap Website zum antworten. * +* Verwenden Sie die OpenStreetMap Website zum Antworten. * * * * Por favor, no responda a este mensaje. * * Utilice el OpenStreetMap sitio web para responder. * From 9c580277efbafe68e31d675e0b2f71e100665783 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 7 Jul 2008 08:06:56 +0000 Subject: [PATCH 02/58] Sanitize user descriptions properly. --- app/views/user/view.rhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/user/view.rhtml b/app/views/user/view.rhtml index f27ce6f0a..c5fc6388d 100644 --- a/app/views/user/view.rhtml +++ b/app/views/user/view.rhtml @@ -33,7 +33,7 @@ <% end %>

Description

-
<%= simple_format(@this_user.description) %>
+
<%= htmlize(@this_user.description) %>
<% if @this_user.home_lat.nil? or @this_user.home_lon.nil? %>

User location

From 1e98eb99504836794fbfce1cacc6bce93a8e4983 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 7 Jul 2008 23:26:41 +0000 Subject: [PATCH 03/58] Allow users to remove their image. Closes #1010. --- app/controllers/user_controller.rb | 10 ++++++++-- app/views/user/view.rhtml | 7 +++++-- config/routes.rb | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 5d26708fe..fd58145c4 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -2,8 +2,8 @@ class UserController < ApplicationController layout 'site' before_filter :authorize, :only => [:api_details, :api_gpx_files] - before_filter :authorize_web, :only => [:account, :go_public, :view, :diary, :make_friend, :remove_friend, :upload_image] - before_filter :require_user, :only => [:set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image] + before_filter :authorize_web, :only => [:account, :go_public, :view, :diary, :make_friend, :remove_friend, :upload_image, :delete_image] + before_filter :require_user, :only => [:set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image, :delete_image] before_filter :check_database_availability, :except => [:api_details, :api_gpx_files] before_filter :check_read_availability, :only => [:api_details, :api_gpx_files] @@ -167,6 +167,12 @@ class UserController < ApplicationController redirect_to :controller => 'user', :action => 'view', :display_name => @user.display_name end + def delete_image + @user.image = nil + @user.save! + redirect_to :controller => 'user', :action => 'view', :display_name => @user.display_name + end + def api_details render :text => @user.to_xml.to_s, :content_type => "text/xml" end diff --git a/app/views/user/view.rhtml b/app/views/user/view.rhtml index c5fc6388d..3ee8ecb86 100644 --- a/app/views/user/view.rhtml +++ b/app/views/user/view.rhtml @@ -20,7 +20,10 @@

User image

<% if @this_user.image %> - <%= image_tag url_for_file_column(@this_user, "image") %> + <%= image_tag url_for_file_column(@this_user, "image") %> + <% if @user and @this_user.id == @user.id %> + <%= button_to 'Delete Image', :action => 'delete_image' %> + <% end %> <% end %>
@@ -28,7 +31,7 @@ Upload an image
<%= form_tag({:action=>'upload_image'}, :multipart => true)%> <%= file_column_field 'user', 'image' %> - + <%= submit_tag 'Add Image' %> <% end %> diff --git a/config/routes.rb b/config/routes.rb index 854e7f003..2ff56af39 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -81,6 +81,7 @@ ActionController::Routing::Routes.draw do |map| map.connect '/user/go_public', :controller => 'user', :action => 'go_public' map.connect '/user/reset-password', :controller => 'user', :action => 'reset_password' map.connect '/user/upload-image', :controller => 'user', :action => 'upload_image' + map.connect '/user/delete-image', :controller => 'user', :action => 'delete_image' map.connect '/user/forgot-password', :controller => 'user', :action => 'lost_password' map.connect '/index.html', :controller => 'site', :action => 'index' From 6644f115c9064c70273252f69963af8a88334f19 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 8 Jul 2008 09:52:08 +0000 Subject: [PATCH 04/58] Add bounds to map responses. Closes #1011. --- app/controllers/api_controller.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb index 9cf8977d3..8b735600d 100644 --- a/app/controllers/api_controller.rb +++ b/app/controllers/api_controller.rb @@ -126,6 +126,14 @@ class ApiController < ApplicationController doc = OSM::API.new.get_xml_doc + # add bounds + bounds = XML::Node.new 'bounds' + bounds['minlat'] = min_lat.to_s + bounds['minlon'] = min_lon.to_s + bounds['maxlat'] = max_lat.to_s + bounds['maxlon'] = max_lon.to_s + doc.root << bounds + # get ways # find which ways are needed ways = Array.new From b2515ec75ebb24ee21c1a28b2ea218013a5fde19 Mon Sep 17 00:00:00 2001 From: Shaun McDonald Date: Tue, 8 Jul 2008 13:43:56 +0000 Subject: [PATCH 05/58] Sorts out a problem with the description field and adding users. --- app/controllers/user_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index fd58145c4..f2378f36d 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -14,7 +14,8 @@ class UserController < ApplicationController @user = User.new(params[:user]) @user.data_public = true - + @user.description = "" if @user.description.nil? + if @user.save token = @user.tokens.create flash[:notice] = "User was successfully created. Check your email for a confirmation note, and you\'ll be mapping in no time :-)
Please note that you won't be able to login until you've received and confirmed your email address." From 62a1ec47483803a32c038fb2907afdf45a61b5ee Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Wed, 9 Jul 2008 22:19:48 +0000 Subject: [PATCH 06/58] Potlatch 0.10 --- app/controllers/amf_controller.rb | 1173 ++++++++++---------------- app/models/node.rb | 4 + app/models/old_way.rb | 29 + app/models/old_way_node.rb | 3 + app/models/way.rb | 18 +- app/views/site/edit.rhtml | 6 +- config/environment.rb | 4 +- config/potlatch/localised.yaml | 621 ++++++++++++++ config/potlatch/relation_colours.txt | 3 +- lib/potlatch.rb | 7 +- public/potlatch/potlatch.swf | Bin 140596 -> 148900 bytes 11 files changed, 1128 insertions(+), 740 deletions(-) create mode 100644 config/potlatch/localised.yaml diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 11ddc3f7c..4ec4e660e 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -1,20 +1,33 @@ -# AMF Controller is a semi-standalone API for Flash clients, particularly Potlatch. -# All interaction between Potlatch (as a .SWF application) and the +# amf_controller is a semi-standalone API for Flash clients, particularly +# Potlatch. All interaction between Potlatch (as a .SWF application) and the # OSM database takes place using this controller. Messages are # encoded in the Actionscript Message Format (AMF). # -# See Also Potlatch::Potlatch and Potlatch::AMF +# Helper functions are in /lib/potlatch. # -# Public domain. -# editions Systeme D / Richard Fairhurst 2004-2008 +# Author:: editions Systeme D / Richard Fairhurst 2004-2008 +# Licence:: public domain. # -# All in/out parameters are floats unless explicitly stated. +# == General structure +# +# Apart from the talk method (which distributes the requests from the +# AMF message), each method generally takes arguments in the order they were +# sent by the Potlatch SWF. Do not assume typing has been preserved. Methods +# all return an array to the SWF. # -# to trap errors (getway_old,putway,putpoi,deleteway only): -# return(-1,"message") <-- just puts up a dialogue -# return(-2,"message") <-- also asks the user to e-mail me -# to log: -# RAILS_DEFAULT_LOGGER.error("Args: #{args[0]}, #{args[1]}, #{args[2]}, #{args[3]}") +# == Debugging +# +# Any method that returns a status code (0 for ok) can also send: +# return(-1,"message") <-- just puts up a dialogue +# return(-2,"message") <-- also asks the user to e-mail me +# +# To write to the Rails log, use RAILS_DEFAULT_LOGGER.info("message"). +# +# == To do +# +# - Check authentication +# - Check the right things are being written to the database! + class AmfController < ApplicationController require 'stringio' @@ -23,312 +36,214 @@ class AmfController < ApplicationController session :off before_filter :check_write_availability - # Main AMF handler. Tha talk method takes in AMF, figures out what to do and dispatched to the appropriate private method + # Main AMF handler: processes the raw AMF string (using AMF library) and + # calls each action (private method) accordingly. + def talk - req=StringIO.new(request.raw_post+0.chr) # Get POST data as request - # (cf http://www.ruby-forum.com/topic/122163) - req.read(2) # Skip version indicator and client ID - results={} # Results of each body - renumberednodes={} # Shared across repeated putways - renumberedways={} # Shared across repeated putways + req=StringIO.new(request.raw_post+0.chr) # Get POST data as request + # (cf http://www.ruby-forum.com/topic/122163) + req.read(2) # Skip version indicator and client ID + results={} # Results of each body + renumberednodes={} # Shared across repeated putways + renumberedways={} # Shared across repeated putways - # ------------- - # Parse request + # Parse request - headers=AMF.getint(req) # Read number of headers + headers=AMF.getint(req) # Read number of headers - headers.times do # Read each header - name=AMF.getstring(req) # | - req.getc # | skip boolean - value=AMF.getvalue(req) # | - header["name"]=value # | - end + headers.times do # Read each header + name=AMF.getstring(req) # | + req.getc # | skip boolean + value=AMF.getvalue(req) # | + header["name"]=value # | + end - bodies=AMF.getint(req) # Read number of bodies - bodies.times do # Read each body - message=AMF.getstring(req) # | get message name - index=AMF.getstring(req) # | get index in response sequence - bytes=AMF.getlong(req) # | get total size in bytes - args=AMF.getvalue(req) # | get response (probably an array) + bodies=AMF.getint(req) # Read number of bodies + bodies.times do # Read each body + message=AMF.getstring(req) # | get message name + index=AMF.getstring(req) # | get index in response sequence + bytes=AMF.getlong(req) # | get total size in bytes + args=AMF.getvalue(req) # | get response (probably an array) - case message - when 'getpresets'; results[index]=AMF.putdata(index,getpresets) - when 'whichways'; results[index]=AMF.putdata(index,whichways(args)) - when 'whichways_deleted'; results[index]=AMF.putdata(index,whichways_deleted(args)) - when 'getway'; results[index]=AMF.putdata(index,getway(args)) - when 'getrelation'; results[index]=AMF.putdata(index,getrelation(args)) - when 'getway_old'; results[index]=AMF.putdata(index,getway_old(args)) - when 'getway_history'; results[index]=AMF.putdata(index,getway_history(args)) - when 'putway'; r=putway(args,renumberednodes) - renumberednodes=r[3] - if r[1] != r[2] - renumberedways[r[1]] = r[2] - end - results[index]=AMF.putdata(index,r) - when 'putrelation'; results[index]=AMF.putdata(index,putrelation(args, renumberednodes, renumberedways)) - when 'deleteway'; results[index]=AMF.putdata(index,deleteway(args)) - when 'putpoi'; results[index]=AMF.putdata(index,putpoi(args)) - when 'getpoi'; results[index]=AMF.putdata(index,getpoi(args)) - end - end + case message + when 'getpresets'; results[index]=AMF.putdata(index,getpresets()) + when 'whichways'; results[index]=AMF.putdata(index,whichways(*args)) + when 'whichways_deleted'; results[index]=AMF.putdata(index,whichways_deleted(*args)) + when 'getway'; results[index]=AMF.putdata(index,getway(args[0].to_i)) + when 'getrelation'; results[index]=AMF.putdata(index,getrelation(args[0].to_i)) + when 'getway_old'; results[index]=AMF.putdata(index,getway_old(args[0].to_i,args[1].to_i)) + when 'getway_history'; results[index]=AMF.putdata(index,getway_history(args[0].to_i)) + when 'putway'; r=putway(renumberednodes,*args) + renumberednodes=r[3] + if r[1] != r[2] + renumberedways[r[1]] = r[2] + end + results[index]=AMF.putdata(index,r) + when 'putrelation'; results[index]=AMF.putdata(index,putrelation(renumberednodes, renumberedways, *args)) + when 'deleteway'; results[index]=AMF.putdata(index,deleteway(args[0],args[1].to_i)) + when 'putpoi'; results[index]=AMF.putdata(index,putpoi(*args)) + when 'getpoi'; results[index]=AMF.putdata(index,getpoi(args[0].to_i)) + end + end - # ------------------ - # Write out response + # Write out response - RAILS_DEFAULT_LOGGER.info(" Response: start") - a,b=results.length.divmod(256) - render :content_type => "application/x-amf", :text => proc { |response, output| - output.write 0.chr+0.chr+0.chr+0.chr+a.chr+b.chr - results.each do |k,v| - output.write(v) - end - } - RAILS_DEFAULT_LOGGER.info(" Response: end") + a,b=results.length.divmod(256) + render :content_type => "application/x-amf", :text => proc { |response, output| + output.write 0.chr+0.chr+0.chr+0.chr+a.chr+b.chr + results.each do |k,v| + output.write(v) + end + } end private - # Return presets (default tags and crap) to potlatch. - # Uses POTLATCH_PRESETS global, set up in OSM::Potlatch - def getpresets #:doc: - return POTLATCH_PRESETS + # Return presets (default tags, localisation etc.): + # uses POTLATCH_PRESETS global, set up in OSM::Potlatch. + + def getpresets() #:doc: + return POTLATCH_PRESETS end - # ----- whichways - # Find all the way ids and nodes (including tags and projected lat/lng) which aren't part of those ways in an are - # - # The argument is an array containing the following, in order: - # 0. minimum longitude - # 1. minimum latitude - # 2. maximum longitude - # 3. maximum latitude - # 4. baselong, 5. basey, 6. masterscale as above - def whichways(args) #:doc: - xmin = args[0].to_f-0.01 - ymin = args[1].to_f-0.01 - xmax = args[2].to_f+0.01 - ymax = args[3].to_f+0.01 - baselong = args[4] - basey = args[5] - masterscale = args[6] + # Find all the ways, POI nodes (i.e. not part of ways), and relations + # in a given bounding box. Nodes are returned in full; ways and relations + # are IDs only. - RAILS_DEFAULT_LOGGER.info(" Message: whichways, bbox=#{xmin},#{ymin},#{xmax},#{ymax}") + def whichways(xmin,ymin,xmax,ymax) #:doc: + xmin-=0.01; ymin-=0.01 + xmax+=0.01; ymax+=0.01 - # find the way ids in an area - nodes_in_area = Node.find_by_area(ymin, xmin, ymax, xmax, :conditions => "current_nodes.visible = 1", :include => :ways) - way_ids = nodes_in_area.collect { |node| node.way_ids }.flatten.uniq + if POTLATCH_USE_SQL then + way_ids=sql_find_way_ids_in_area(xmin,ymin,xmax,ymax) + points=sql_find_pois_in_area(xmin,ymin,xmax,ymax) + relation_ids=sql_find_relations_in_area_and_ways(xmin,ymin,xmax,ymax,way_ids) + else + # find the way ids in an area + nodes_in_area = Node.find_by_area(ymin, xmin, ymax, xmax, :conditions => "current_nodes.visible = 1", :include => :ways) + way_ids = nodes_in_area.collect { |node| node.way_ids }.flatten.uniq - # find the node ids in an area that aren't part of ways - nodes_not_used_in_area = nodes_in_area.select { |node| node.ways.empty? } - points = nodes_not_used_in_area.collect { |n| [n.id, n.lon_potlatch(baselong,masterscale), n.lat_potlatch(basey,masterscale), n.tags_as_hash] } + # find the node ids in an area that aren't part of ways + nodes_not_used_in_area = nodes_in_area.select { |node| node.ways.empty? } + points = nodes_not_used_in_area.collect { |n| [n.id, n.lon, n.lat, n.tags_as_hash] } - # find the relations used by those nodes and ways - relations = nodes_in_area.collect { |node| node.containing_relations.visible }.flatten + - way_ids.collect { |id| Way.find(id).containing_relations.visible }.flatten - relation_ids = relations.collect { |relation| relation.id }.uniq + # find the relations used by those nodes and ways + relations = nodes_in_area.collect { |node| node.containing_relations.visible }.flatten + + way_ids.collect { |id| Way.find(id).containing_relations.visible }.flatten + relation_ids = relations.collect { |relation| relation.id }.uniq + end - [way_ids,points,relation_ids] + [way_ids,points,relation_ids] end - # ----- whichways_deleted - # return array of deleted ways in current bounding box - # in: as whichways - # does: finds all deleted ways with a deleted node in bounding box - # out: [0] array of way ids - def whichways_deleted(args) #:doc: - xmin = args[0].to_f-0.01 - ymin = args[1].to_f-0.01 - xmax = args[2].to_f+0.01 - ymax = args[3].to_f+0.01 - baselong = args[4] - basey = args[5] - masterscale = args[6] + # Find deleted ways in current bounding box (similar to whichways, but ways + # with a deleted node only - not POIs or relations). - sql=<<-EOF - SELECT DISTINCT current_ways.id - FROM current_nodes,way_nodes,current_ways - WHERE #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "current_nodes.")} - AND way_nodes.node_id=current_nodes.id - AND way_nodes.id=current_ways.id - AND current_nodes.visible=0 - AND current_ways.visible=0 - EOF - waylist = ActiveRecord::Base.connection.select_all(sql) - ways = waylist.collect {|a| a['id'].to_i } - [ways] + def whichways_deleted(xmin,ymin,xmax,ymax) #:doc: + xmin-=0.01; ymin-=0.01 + xmax+=0.01; ymax+=0.01 + + nodes_in_area = Node.find_by_area(ymin, xmin, ymax,xmax, :conditions => "current_nodes.visible=0 AND current_ways.visible=0", :include => :ways_via_history ) + way_ids = nodes_in_area.collect { |node| node.ways_via_history_ids }.flatten.uniq + [way_ids] end - # ----- getway - # Get a way with all of it's nodes and tags - # The input is an array with the following components, in order: - # 0. wayid - the ID of the way to get - # 1. baselong - origin of SWF map (longitude) - # 2. basey - origin of SWF map (latitude) - # 3. masterscale - SWF map scale + # Get a way including nodes and tags. + # Returns 0 (success), a Potlatch-style array of points, and a hash of tags. + + def getway(wayid) #:doc: + if POTLATCH_USE_SQL then + points=sql_get_nodes_in_way(wayid) + tags=sql_get_tags_in_way(wayid) + else + # Ideally we would do ":include => :nodes" here but if we do that + # then rails only seems to return the first copy of a node when a + # way includes a node more than once + points = [] + way = Way.find(wayid) + way.nodes.each do |node| + points << [node.lon, node.lat, node.id, nil, node.tags_as_hash] + end + tags=way.tags + end + [wayid,points,tags] + end + + # Get an old version of a way, and all constituent nodes. # - # The output is an array which contains all the nodes (with projected - # latitude and longitude) and tags for a way (and all the nodes tags). - # It also has the way's unprojected (WGS84) bbox. - # - # FIXME: The server really shouldn't be figuring out a ways bounding box and doing projection for potlatch - # FIXME: the argument splitting should be done in the 'talk' method, not here - def getway(args) #:doc: - wayid,baselong,basey,masterscale = args - wayid = wayid.to_i + # For undelete (version=0), always uses the most recent version of each node, + # even if it's moved. For revert (version=1+), uses the node in existence + # at the time, generating a new id if it's still visible and has been moved/ + # retagged. - RAILS_DEFAULT_LOGGER.info(" Message: getway, id=#{wayid}") + def getway_old(id,version) #:doc: + if version<0 + old_way = OldWay.find(:first, :conditions => ['visible=1 AND id=?', id], :order => 'version DESC') + points = old_way.get_nodes_undelete + else + old_way = OldWay.find(:first, :conditions => ['id=? AND version=?', id, version]) + points = old_way.get_nodes_revert + end + old_way.tags['history']="Retrieved from v#{old_way.version}" + [0,id,points,old_way.tags,old_way.version] + end + + # Find history of a way. Returns an array of previous versions. - # Ideally we would do ":include => :nodes" here but if we do that - # then rails only seems to return the first copy of a node when a - # way includes a node more than once - way = Way.find(wayid) - - long_array = [] - lat_array = [] - points = [] - - way.nodes.each do |node| - projected_longitude = node.lon_potlatch(baselong,masterscale) # do projection for potlatch - projected_latitude = node.lat_potlatch(basey,masterscale) - id = node.id - tags_hash = node.tags_as_hash - - points << [projected_longitude, projected_latitude, id, nil, tags_hash] - long_array << projected_longitude - lat_array << projected_latitude - end - - [wayid,points,way.tags,long_array.min,long_array.max,lat_array.min,lat_array.max] + def getway_history(wayid) #:doc: + history=[] + way=Way.find(wayid) + way.old_ways.each do |old_way| + if old_way.user.data_public then user=old_way.user.display_name else user='anonymous' end + history<<[old_way.version,old_way.timestamp.strftime("%d %b %Y, %H:%M"),old_way.visible ? 1 : 0,user] + end + [history] end - # ----- getway_old - # returns old version of way - # in: [0] way id, - # [1] way version to get (or -1 for "last deleted version") - # [2] baselong, [3] basey, [4] masterscale - # does: gets old version of way and all constituent nodes - # for undelete, always uses the most recent version of each node - # (even if it's moved) - # for revert, uses the historic version of each node, but if that node is - # still visible and has been changed since, generates a new node id - # out: [0] 0 (code for success), [1] SWF object name, - # [2] array of points (as getway _except_ [3] is node.visible?, 0 or 1), - # [4] xmin, [5] xmax, [6] ymin, [7] ymax (unprojected bbox), - # [8] way version - def getway_old(args) #:doc: - RAILS_DEFAULT_LOGGER.info(" Message: getway_old (server is #{SERVER_URL})") - # if SERVER_URL=="www.openstreetmap.org" then return -1,"Revert is not currently enabled on the OpenStreetMap server." end - - wayid,version,baselong,basey,masterscale=args - wayid = wayid.to_i - version = version.to_i - xmin = ymin = 999999 - xmax = ymax = -999999 - points=[] - if version<0 - historic=false - version=getlastversion(wayid,version) - else - historic=true - end - readwayquery_old(wayid,version,historic).each { |row| - points<<[long2coord(row['longitude'].to_f,baselong,masterscale),lat2coord(row['latitude'].to_f,basey,masterscale),row['id'].to_i,row['visible'].to_i,tag2array(row['tags'].to_s)] - xmin=[xmin,row['longitude'].to_f].min - xmax=[xmax,row['longitude'].to_f].max - ymin=[ymin,row['latitude' ].to_f].min - ymax=[ymax,row['latitude' ].to_f].max - } - - # get tags from this version - attributes={} - attrlist=ActiveRecord::Base.connection.select_all "SELECT k,v FROM way_tags WHERE id=#{wayid} AND version=#{version}" - attrlist.each {|a| attributes[a['k'].gsub(':','|')]=a['v'] } - attributes['history']="Retrieved from v"+version.to_s - - [0,wayid,points,attributes,xmin,xmax,ymin,ymax,version] + # Get a relation with all tags and members. + # Returns: + # 0. relation id, + # 1. hash of tags, + # 2. list of members. + + def getrelation(relid) #:doc: + rel = Relation.find(relid) + [relid,rel.tags,rel.members] end - # ----- getway_history - # find history of a way - # in: [0] way id - # does: finds history of a way - # out: [0] array of previous versions (where each is - # [0] version, [1] db timestamp (string), - # [2] visible 0 or 1, - # [3] username or 'anonymous' (string)) - def getway_history(args) #:doc: - wayid=args[0] - history=[] - sql=<<-EOF - SELECT version,timestamp,visible,display_name,data_public - FROM ways,users - WHERE ways.id=#{wayid} - AND ways.user_id=users.id - AND ways.visible=1 - ORDER BY version DESC - EOF - histlist=ActiveRecord::Base.connection.select_all(sql) - histlist.each { |row| - if row['data_public'].to_i==1 then user=row['display_name'] else user='anonymous' end - history<<[row['version'],row['timestamp'],row['visible'],user] - } - [history] - end + # Save a relation. + # Returns + # 0. 0 (success), + # 1. original relation id (unchanged), + # 2. new relation id. - # ----- getrelation - # Get a relation with all of it's tags, and member IDs - # The input is an array with the following components, in order: - # 0. relid - the ID of the relation to get - # - # The output is an array which contains: - # [0] relation id, [1] hash of tags, [2] list of members - def getrelation(args) #:doc: - relid = args[0] - relid = relid.to_i + def putrelation(renumberednodes, renumberedways, usertoken,relid,tags,members,visible) #:doc: + uid=getuserid(usertoken) + if !uid then return -1,"You are not logged in, so the point could not be saved." end - RAILS_DEFAULT_LOGGER.info(" Message: getrel, id=#{relid}") - - rel = Relation.find(relid) - - [relid,rel.tags,rel.members]#nodes,ways] - end - - # ----- getrelation - # save relation to the database - # in: [0] user token (string), - # [1] original relation id (may be negative), - # [2] hash of tags, [3] list of members, - # [4] visible - # out: [0] 0 (success), [1] original relation id (unchanged), - # [2] new relation id - def putrelation(args, renumberednodes, renumberedways) #:doc: - usertoken,relid,tags,members,visible=args - uid=getuserid(usertoken) - if !uid then return -1,"You are not logged in, so the point could not be saved." end - - relid = relid.to_i + relid = relid.to_i visible = visible.to_i # create a new relation, or find the existing one - if relid <= 0 - rel = Relation.new - else - rel = Relation.find(relid) - end + if relid <= 0 + rel = Relation.new + else + rel = Relation.find(relid) + end - # check the members are all positive, and correctly type - typedmembers = [] - members.each do |m| - mid = m[1].to_i - if mid < 0 - mid = renumberednodes[mid] if m[0] == 'node' - mid = renumberedways[mid] if m[0] == 'way' - if mid < 0 - return -2, "Negative ID unresolved" - end - end - typedmembers << [m[0], mid, m[2]] - end + # check the members are all positive, and correctly type + typedmembers = [] + members.each do |m| + mid = m[1].to_i + if mid < 0 + mid = renumberednodes[mid] if m[0] == 'node' + mid = renumberedways[mid] if m[0] == 'way' + if mid < 0 + return -2, "Negative ID unresolved" + end + end + typedmembers << [m[0], mid, m[2]] + end # assign new contents rel.members = typedmembers @@ -336,491 +251,297 @@ class AmfController < ApplicationController rel.visible = visible rel.user_id = uid - # check it then save it - # BUG: the following is commented out because it always fails on my - # install. I think it's a Rails bug. + # check it then save it + # BUG: the following is commented out because it always fails on my + # install. I think it's a Rails bug. - #if !rel.preconditions_ok? - # return -2, "Relation preconditions failed" - #else - rel.save_with_history! - #end + #if !rel.preconditions_ok? + # return -2, "Relation preconditions failed" + #else + rel.save_with_history! + #end - [0,relid,rel.id] + [0,relid,rel.id] end - # ----- putway - # saves a way to the database - # in: [0] user token (string), - # [1] original way id (may be negative), - # [2] array of points (as getway/getway_old), - # [3] hash of way tags, - # [4] original way version (0 if not a reverted/undeleted way), - # [5] baselong, [6] basey, [7] masterscale - # does: saves way to the database - # all constituent nodes are created/updated as necessary - # (or deleted if they were in the old version and are otherwise unused) - # out: [0] 0 (code for success), [1] original way id (unchanged), - # [2] new way id, [3] hash of renumbered nodes (old id=>new id), - # [4] xmin, [5] xmax, [6] ymin, [7] ymax (unprojected bbox) - def putway(args,renumberednodes) #:doc: - RAILS_DEFAULT_LOGGER.info(" putway started") - usertoken,originalway,points,attributes,oldversion,baselong,basey,masterscale=args - uid=getuserid(usertoken) - if !uid then return -1,"You are not logged in, so the way could not be saved." end + # Save a way to the database, including all nodes. Any nodes in the previous + # version and no longer used are deleted. + # + # Returns: + # 0. '0' (code for success), + # 1. original way id (unchanged), + # 2. new way id, + # 3. hash of renumbered nodes (old id=>new id) - RAILS_DEFAULT_LOGGER.info(" putway authenticated happily") - db_uqn='unin'+(rand*100).to_i.to_s+uid.to_s+originalway.to_i.abs.to_s+Time.new.to_i.to_s # temp uniquenodes table name, typically 51 chars - db_now='@now'+(rand*100).to_i.to_s+uid.to_s+originalway.to_i.abs.to_s+Time.new.to_i.to_s # 'now' variable name, typically 51 chars - ActiveRecord::Base.connection.execute("SET #{db_now}=NOW()") - originalway=originalway.to_i - oldversion=oldversion.to_i + def putway(renumberednodes,usertoken,originalway,points,attributes) #:doc: - RAILS_DEFAULT_LOGGER.info(" Message: putway, id=#{originalway}") + # -- Initialise and carry out checks + + uid=getuserid(usertoken) + if !uid then return -1,"You are not logged in, so the way could not be saved." end + originalway=originalway.to_i - # -- Check for null IDs, short ways or lats=90 + points.each do |a| + if a[2]==0 or a[2].nil? then return -2,"Server error - node with id 0 found in way #{originalway}." end + if a[1]==90 then return -2,"Server error - node with lat -90 found in way #{originalway}." end + end - points.each do |a| - if a[2]==0 or a[2].nil? then return -2,"Server error - node with id 0 found in way #{originalway}." end - if coord2lat(a[1],masterscale,basey)==90 then return -2,"Server error - node with lat -90 found in way #{originalway}." end - end - - if points.length<2 then return -2,"Server error - way is only #{points.length} points long." end + if points.length<2 then return -2,"Server error - way is only #{points.length} points long." end - # -- 3. read original way into memory + # -- Get unique nodes - xc={}; yc={}; tagc={}; vc={} - if originalway>0 - way=originalway - if oldversion==0 then r=readwayquery(way,false) - else r=readwayquery_old(way,oldversion,true) end - r.each { |row| - id=row['id'].to_i - if (id>0) then - xc[id]=row['longitude'].to_f - yc[id]=row['latitude' ].to_f - tagc[id]=row['tags'] - vc[id]=row['visible'].to_i - end - } - ActiveRecord::Base.connection.update("UPDATE current_ways SET timestamp=#{db_now},user_id=#{uid},visible=1 WHERE id=#{way}") - else - way=ActiveRecord::Base.connection.insert("INSERT INTO current_ways (user_id,timestamp,visible) VALUES (#{uid},#{db_now},1)") - end + if originalway<0 + way=Way.new + uniques=[] + else + way=Way.find(originalway) + uniques=way.unique_nodes + end - # -- 4. get version by inserting new row into ways + # -- Compare nodes and save changes to any that have changed - version=ActiveRecord::Base.connection.insert("INSERT INTO ways (id,user_id,timestamp,visible) VALUES (#{way},#{uid},#{db_now},1)") + nodes=[] - # -- 5. compare nodes and update xmin,xmax,ymin,ymax - - xmin=ymin= 999999 - xmax=ymax=-999999 - insertsql='' - nodelist=[] - - points.each_index do |i| - xs=coord2long(points[i][0],masterscale,baselong) - ys=coord2lat(points[i][1],masterscale,basey) - xmin=[xs,xmin].min; xmax=[xs,xmax].max - ymin=[ys,ymin].min; ymax=[ys,ymax].max - node=points[i][2].to_i - tagstr=array2tag(points[i][4]) - tagsql="'"+sqlescape(tagstr)+"'" - lat=(ys * 10000000).round - long=(xs * 10000000).round - tile=QuadTile.tile_for_point(ys, xs) - - # compare node - if node<0 - # new node - create - if renumberednodes[node.to_s].nil? - newnode=ActiveRecord::Base.connection.insert("INSERT INTO current_nodes ( latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES ( #{lat},#{long},#{db_now},#{uid},1,#{tagsql},#{tile})") - ActiveRecord::Base.connection.insert("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{newnode},#{lat},#{long},#{db_now},#{uid},1,#{tagsql},#{tile})") - points[i][2]=newnode - nodelist.push(newnode) - renumberednodes[node.to_s]=newnode.to_s - else - points[i][2]=renumberednodes[node.to_s].to_i - end - - elsif xc.has_key?(node) - nodelist.push(node) - # old node from original way - update - if ((xs/0.0000001).round!=(xc[node]/0.0000001).round or (ys/0.0000001).round!=(yc[node]/0.0000001).round or tagstr!=tagc[node] or vc[node]==0) - ActiveRecord::Base.connection.insert("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{node},#{lat},#{long},#{db_now},#{uid},1,#{tagsql},#{tile})") - ActiveRecord::Base.connection.update("UPDATE current_nodes SET latitude=#{lat},longitude=#{long},timestamp=#{db_now},user_id=#{uid},tags=#{tagsql},visible=1,tile=#{tile} WHERE id=#{node}") - end - else - # old node, created in another way and now added to this way - end - end - - # -- 6a. delete any nodes not in modified way - - createuniquenodes(way,db_uqn,nodelist) # nodes which appear in this way but no other - - sql=<<-EOF - INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tile) - SELECT DISTINCT cn.id,cn.latitude,cn.longitude,#{db_now},#{uid},0,cn.tile - FROM current_nodes AS cn,#{db_uqn} - WHERE cn.id=node_id - EOF - ActiveRecord::Base.connection.insert(sql) - - sql=<<-EOF - UPDATE current_nodes AS cn, #{db_uqn} - SET cn.timestamp=#{db_now},cn.visible=0,cn.user_id=#{uid} - WHERE cn.id=node_id - EOF - ActiveRecord::Base.connection.update(sql) - - deleteuniquenoderelations(db_uqn,uid,db_now) - ActiveRecord::Base.connection.execute("DROP TEMPORARY TABLE #{db_uqn}") - - # 6b. insert new version of route into way_nodes - - insertsql ='' - currentsql='' - sequence =1 - points.each do |p| - if insertsql !='' then insertsql +=',' end - if currentsql!='' then currentsql+=',' end - insertsql +="(#{way},#{p[2]},#{sequence},#{version})" - currentsql+="(#{way},#{p[2]},#{sequence})" - sequence +=1 - end - - ActiveRecord::Base.connection.execute("DELETE FROM current_way_nodes WHERE id=#{way}"); - ActiveRecord::Base.connection.insert( "INSERT INTO way_nodes (id,node_id,sequence_id,version) VALUES #{insertsql}"); - ActiveRecord::Base.connection.insert( "INSERT INTO current_way_nodes (id,node_id,sequence_id ) VALUES #{currentsql}"); - - # -- 7. insert new way tags - - insertsql ='' - currentsql='' - attributes.each do |k,v| - if v=='' or v.nil? then next end - if v[0,6]=='(type ' then next end - if insertsql !='' then insertsql +=',' end - if currentsql!='' then currentsql+=',' end - insertsql +="(#{way},'"+sqlescape(k.gsub('|',':'))+"','"+sqlescape(v)+"',#{version})" - currentsql+="(#{way},'"+sqlescape(k.gsub('|',':'))+"','"+sqlescape(v)+"')" - end - - ActiveRecord::Base.connection.execute("DELETE FROM current_way_tags WHERE id=#{way}") - if (insertsql !='') then ActiveRecord::Base.connection.insert("INSERT INTO way_tags (id,k,v,version) VALUES #{insertsql}" ) end - if (currentsql!='') then ActiveRecord::Base.connection.insert("INSERT INTO current_way_tags (id,k,v) VALUES #{currentsql}") end - - [0,originalway,way,renumberednodes,xmin,xmax,ymin,ymax] - end - - # ----- putpoi - # save POI to the database - # in: [0] user token (string), - # [1] original node id (may be negative), - # [2] projected longitude, [3] projected latitude, - # [4] hash of tags, [5] visible (0 to delete, 1 otherwise), - # [6] baselong, [7] basey, [8] masterscale - # does: saves POI node to the database - # refuses save if the node has since become part of a way - # out: [0] 0 (success), [1] original node id (unchanged), - # [2] new node id - def putpoi(args) #:doc: - usertoken,id,x,y,tags,visible,baselong,basey,masterscale=args - uid=getuserid(usertoken) - if !uid then return -1,"You are not logged in, so the point could not be saved." end - - db_now='@now'+(rand*100).to_i.to_s+uid.to_s+id.to_i.abs.to_s+Time.new.to_i.to_s # 'now' variable name, typically 51 chars - ActiveRecord::Base.connection.execute("SET #{db_now}=NOW()") - - id=id.to_i - visible=visible.to_i - if visible==0 then - # if deleting, check node hasn't become part of a way - inway=ActiveRecord::Base.connection.select_one("SELECT cw.id FROM current_ways cw,current_way_nodes cwn WHERE cw.id=cwn.id AND cw.visible=1 AND cwn.node_id=#{id} LIMIT 1") - unless inway.nil? then return -1,"The point has since become part of a way, so you cannot save it as a POI." end - deleteitemrelations(id,'node',uid,db_now) - end - - x=coord2long(x.to_f,masterscale,baselong) - y=coord2lat(y.to_f,masterscale,basey) - tagsql="'"+sqlescape(array2tag(tags))+"'" - lat=(y * 10000000).round - long=(x * 10000000).round - tile=QuadTile.tile_for_point(y, x) - - if (id>0) then - ActiveRecord::Base.connection.insert("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{id},#{lat},#{long},#{db_now},#{uid},#{visible},#{tagsql},#{tile})"); - ActiveRecord::Base.connection.update("UPDATE current_nodes SET latitude=#{lat},longitude=#{long},timestamp=#{db_now},user_id=#{uid},visible=#{visible},tags=#{tagsql},tile=#{tile} WHERE id=#{id}"); - newid=id - else - newid=ActiveRecord::Base.connection.insert("INSERT INTO current_nodes (latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{lat},#{long},#{db_now},#{uid},#{visible},#{tagsql},#{tile})"); - ActiveRecord::Base.connection.update("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{newid},#{lat},#{long},#{db_now},#{uid},#{visible},#{tagsql},#{tile})"); - end - [0,id,newid] - end - - # ----- getpoi - # read POI from database - # (only called on revert: POIs are usually read by whichways) - # in: [0] node id, [1] baselong, [2] basey, [3] masterscale - # does: reads POI - # out: [0] id (unchanged), [1] projected long, [2] projected lat, - # [3] hash of tags - def getpoi(args) #:doc: - id,baselong,basey,masterscale = args - - n = Node.find(id.to_i) - if n - return [n.id, n.lon_potlatch(baselong,masterscale), n.lat_potlatch(basey,masterscale), n.tags_as_hash] - else - return [nil,nil,nil,''] - end - end - - # ----- deleteway - # delete way and constituent nodes from database - # in: [0] user token (string), [1] way id - # does: deletes way from db and any constituent nodes not used elsewhere - # also removes ways/nodes from any relations they're in - # out: [0] 0 (success), [1] way id (unchanged) - - def deleteway(args) #:doc: - usertoken,way_id=args - RAILS_DEFAULT_LOGGER.info(" Message: deleteway, id=#{way_id}") - uid=getuserid(usertoken) - if !uid then return -1,"You are not logged in, so the way could not be deleted." end - - # FIXME - # the next bit removes the way from any relations - # the delete_with_relations_and_nodes_and_history method should do this, - # but at present it just throws a 'precondition failed' - way=way.to_i - db_now='@now'+(rand*100).to_i.to_s+uid.to_s+way.abs.to_s+Time.new.to_i.to_s - db_uqn='unin'+(rand*100).to_i.to_s+uid.to_s+way.abs.to_s+Time.new.to_i.to_s - ActiveRecord::Base.connection.execute("SET #{db_now}=NOW()") - createuniquenodes(way,db_uqn,[]) - deleteuniquenoderelations(db_uqn,uid,db_now) - deleteitemrelations(way_id,'way',uid,db_now) - ActiveRecord::Base.connection.execute("DROP TEMPORARY TABLE #{db_uqn}") - # end of FIXME - - # now delete the way - user = User.find(uid) - way = Way.find(way_id) - way.delete_with_relations_and_nodes_and_history(user) - return [0,way_id] - end - - - def readwayquery(id,insistonvisible) #:doc: - sql=<<-EOF - SELECT latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,current_nodes.id,tags,visible - FROM current_way_nodes,current_nodes - WHERE current_way_nodes.id=#{id} - AND current_way_nodes.node_id=current_nodes.id - EOF - if insistonvisible then sql+=" AND current_nodes.visible=1 " end - sql+=" ORDER BY sequence_id" - ActiveRecord::Base.connection.select_all(sql) - end - - # Get the latest version id of a way - def getlastversion(id,version) #:doc: - old_way = OldWay.find(:first, :conditions => ['visible=1 AND id=?' , id], :order => 'version DESC') - old_way.version - end - - def readwayquery_old(id,version,historic) #:doc: - # Node handling on undelete (historic=false): - # - always use the node specified, even if it's moved - - # Node handling on revert (historic=true): - # - if it's a visible node, use a new node id (i.e. not mucking up the old one) - # which means the SWF needs to allocate new ids - # - if it's an invisible node, we can reuse the old node id - - # ----- get node list from specified version of way, - # and the _current_ lat/long/tags of each node - - row=ActiveRecord::Base.connection.select_one("SELECT timestamp FROM ways WHERE version=#{version} AND id=#{id}") - waytime=row['timestamp'] - - sql=<<-EOF - SELECT cn.id,visible,latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,tags - FROM way_nodes wn,current_nodes cn - WHERE wn.version=#{version} - AND wn.id=#{id} - AND wn.node_id=cn.id - ORDER BY sequence_id - EOF - rows=ActiveRecord::Base.connection.select_all(sql) - - # ----- if historic (full revert), get the old version of each node - # - if it's in another way now, generate a new id - # - if it's not in another way, use the old ID - - if historic then - rows.each_index do |i| - sql=<<-EOF - SELECT latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,tags,cwn.id AS currentway - FROM nodes n - LEFT JOIN current_way_nodes cwn - ON cwn.node_id=n.id AND cwn.id!=#{id} - WHERE n.id=#{rows[i]['id']} - AND n.timestamp<="#{waytime}" - ORDER BY n.timestamp DESC - LIMIT 1 - EOF - row=ActiveRecord::Base.connection.select_one(sql) - nx=row['longitude'].to_f - ny=row['latitude'].to_f - if (!row.nil?) - if (row['currentway'] && (nx!=rows[i]['longitude'].to_f or ny!=rows[i]['latitude'].to_f or row['tags']!=rows[i]['tags'])) then rows[i]['id']=-1 end + points.each do |n| + lon=n[0].to_f + lat=n[1].to_f + id =n[2].to_i + savenode=false + if renumberednodes[id] + id=renumberednodes[id] + elsif id<0 + # Create new node + node=Node.new + savenode=true + else + node=Node.find(id) + if (!fpcomp(lat,node.lat) or !fpcomp(lon,node.lon) or \ + Tags.join(n[4])!=node.tags or node.visible==0) + savenode=true end - rows[i]['longitude']=nx - rows[i]['latitude' ]=ny - rows[i]['tags' ]=row['tags'] - end - end - rows + end + if savenode + node.user_id=uid + node.lat=lat; node.lon=lon + node.tags=Tags.join(n[4]) + node.visible=true + node.save_with_history! + if id!=node.id + renumberednodes[id]=node.id + id=node.id + end + end + uniques=uniques-[id] + nodes.push(id) + end + + # -- Delete any unique nodes + + uniques.each do |n| + deleteitemrelations(n,'node') + node=Node.find(n) + node.user_id=uid + node.visible=false + node.save_with_history! + end + + # -- Save revised way + + way.tags=attributes + way.nds=nodes + way.user_id=uid + way.visible=true + way.save_with_history! + + [0,originalway,way.id,renumberednodes] end - def createuniquenodes(way,uqn_name,nodelist) #:doc: - # Find nodes which appear in this way but no others - sql=<<-EOF - CREATE TEMPORARY TABLE #{uqn_name} - SELECT a.node_id - FROM (SELECT DISTINCT node_id FROM current_way_nodes - WHERE id=#{way}) a - LEFT JOIN current_way_nodes b - ON b.node_id=a.node_id - AND b.id!=#{way} - WHERE b.node_id IS NULL - EOF - unless nodelist.empty? then - sql+="AND a.node_id NOT IN ("+nodelist.join(',')+")" - end - ActiveRecord::Base.connection.execute(sql) + # Save POI to the database. + # Refuses save if the node has since become part of a way. + # Returns: + # 0. 0 (success), + # 1. original node id (unchanged), + # 2. new node id. + + def putpoi(usertoken,id,lon,lat,tags,visible) #:doc: + uid=getuserid(usertoken) + if !uid then return -1,"You are not logged in, so the point could not be saved." end + + id=id.to_i + visible=(visible.to_i==1) + + if (id>0) then + node=Node.find(id) + if !visible then + unless node.ways.empty? then return -1,"The point has since become part of a way, so you cannot save it as a POI." end + deleteitemrelations(id,'node') + end + else + node=Node.new + end + + node.user_id = uid + node.latitude = (lat*10000000).round + node.longitude = (lon*10000000).round + node.tags = Tags.join(tags) + node.visible=visible + node.save_with_history! + newid=node.id + [0,id,newid] end + # Read POI from database + # (only called on revert: POIs are usually read by whichways). + # + # Returns array of id, long, lat, hash of tags. + + def getpoi(id) #:doc: + n = Node.find(id) + if n + return [n.id, n.lon, n.lat, n.tags_as_hash] + else + return [nil,nil,nil,''] + end + end + + # Delete way and all constituent nodes. Also removes from any relations. + # Returns 0 (success), unchanged way id. + + def deleteway(usertoken,way_id) #:doc: + uid=getuserid(usertoken) + if !uid then return -1,"You are not logged in, so the way could not be deleted." end + + # FIXME: would be good not to make two history entries when removing + # two nodes from the same relation + user = User.find(uid) + way = Way.find(way_id) + way.unique_nodes.each do |n| + deleteitemrelations(n,'node') + end + + way.delete_with_relations_and_nodes_and_history(user) + return [0,way_id] + end # ==================================================================== - # Relations handling - # deleteuniquenoderelations(uqn_name,uid,db_now) - # deleteitemrelations(way|node,'way'|'node',uid,db_now) + # Support functions - def deleteuniquenoderelations(uqn_name,uid,db_now) #:doc: - sql=<<-EOF - SELECT node_id,cr.id FROM #{uqn_name},current_relation_members crm,current_relations cr - WHERE crm.member_id=node_id - AND crm.member_type='node' - AND crm.id=cr.id - AND cr.visible=1 - EOF + # Remove a node or way from all relations - relnodes=ActiveRecord::Base.connection.select_all(sql) - relnodes.each do |a| - removefromrelation(a['node_id'],'node',a['id'],uid,db_now) - end + def deleteitemrelations(objid,type) #:doc: + relationids = RelationMember.find(:all, :conditions => ['member_type=? and member_id=?', type, objid]).collect { |ws| ws.id }.uniq + relationids.each do |relid| + rel=Relation.find(relid) + rel.members.delete_if {|x| x[0]==type and x[1]==objid} + rel.save_with_history! + end end - def deleteitemrelations(objid,type,uid,db_now) #:doc: - sql=<<-EOF - SELECT cr.id FROM current_relation_members crm,current_relations cr - WHERE crm.member_id=#{objid} - AND crm.member_type='#{type}' - AND crm.id=cr.id - AND cr.visible=1 - EOF + # Break out node tags into a hash + # (should become obsolete as of API 0.6) - relways=ActiveRecord::Base.connection.select_all(sql) - relways.each do |a| - removefromrelation(objid,type,a['id'],uid,db_now) - end + def tagstring_to_hash(a) #:doc: + tags={} + Tags.split(a) do |k, v| + tags[k]=v + end + tags end - def removefromrelation(objid,type,relation,uid,db_now) #:doc: - rver=ActiveRecord::Base.connection.insert("INSERT INTO relations (id,user_id,timestamp,visible) VALUES (#{relation},#{uid},#{db_now},1)") - - tagsql=<<-EOF - INSERT INTO relation_tags (id,k,v,version) - SELECT id,k,v,#{rver} FROM current_relation_tags - WHERE id=#{relation} - EOF - ActiveRecord::Base.connection.insert(tagsql) - - membersql=<<-EOF - INSERT INTO relation_members (id,member_type,member_id,member_role,version) - SELECT id,member_type,member_id,member_role,#{rver} FROM current_relation_members - WHERE id=#{relation} - AND (member_id!=#{objid} OR member_type!='#{type}') - EOF - ActiveRecord::Base.connection.insert(membersql) - - ActiveRecord::Base.connection.update("UPDATE current_relations SET user_id=#{uid},timestamp=#{db_now} WHERE id=#{relation}") - ActiveRecord::Base.connection.execute("DELETE FROM current_relation_members WHERE id=#{relation} AND member_type='#{type}' AND member_id=#{objid}") - end - - def sqlescape(a) #:doc: - a.gsub(/[\000-\037]/,"").gsub("'","''").gsub(92.chr) {92.chr+92.chr} - end - - def tag2array(a) #:doc: - tags={} - Tags.split(a) do |k, v| - tags[k.gsub(':','|')]=v - end - tags - end - - def array2tag(a) #:doc: - tags = [] - a.each do |k,v| - if v=='' then next end - if v[0,6]=='(type ' then next end - tags << [k.gsub('|',':'), v] - end - return Tags.join(tags) - end + # Authenticate token + # (could be removed if no-one uses the username+password form) def getuserid(token) #:doc: - if (token =~ /^(.+)\+(.+)$/) then - user = User.authenticate(:username => $1, :password => $2) - else - user = User.authenticate(:token => token) - end + if (token =~ /^(.+)\+(.+)$/) then + user = User.authenticate(:username => $1, :password => $2) + else + user = User.authenticate(:token => token) + end - return user ? user.id : nil; + return user ? user.id : nil; end + # Compare two floating-point numbers to within 0.0000001 + + def fpcomp(a,b) #:doc: + return ((a/0.0000001).round==(b/0.0000001).round) + end + + # ==================================================================== - # Co-ordinate conversion + # Alternative SQL queries for getway/whichways - def lat2coord(a,basey,masterscale) #:doc: - -(lat2y(a)-basey)*masterscale + def sql_find_way_ids_in_area(xmin,ymin,xmax,ymax) + sql=<<-EOF + SELECT DISTINCT current_way_nodes.id AS wayid + FROM current_way_nodes + INNER JOIN current_nodes ON current_nodes.id=current_way_nodes.node_id + INNER JOIN current_ways ON current_ways.id =current_way_nodes.id + WHERE current_nodes.visible=1 + AND current_ways.visible=1 + AND #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "current_nodes.")} + EOF + return ActiveRecord::Base.connection.select_all(sql).collect { |a| a['wayid'].to_i } end - - def long2coord(a,baselong,masterscale) #:doc: - (a-baselong)*masterscale + + def sql_find_pois_in_area(xmin,ymin,xmax,ymax) + sql=<<-EOF + SELECT current_nodes.id,current_nodes.latitude*0.0000001 AS lat,current_nodes.longitude*0.0000001 AS lon,current_nodes.tags + FROM current_nodes + LEFT OUTER JOIN current_way_nodes cwn ON cwn.node_id=current_nodes.id + WHERE current_nodes.visible=1 + AND cwn.id IS NULL + AND #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "current_nodes.")} + EOF + return ActiveRecord::Base.connection.select_all(sql).collect { |n| [n['id'].to_i,n['lon'].to_f,n['lat'].to_f,tagstring_to_hash(n['tags'])] } end - - def lat2y(a) #:doc: - 180/Math::PI * Math.log(Math.tan(Math::PI/4+a*(Math::PI/180)/2)) + + def sql_find_relations_in_area_and_ways(xmin,ymin,xmax,ymax,way_ids) + # ** It would be more Potlatchy to get relations for nodes within ways + # during 'getway', not here + sql=<<-EOF + SELECT DISTINCT cr.id AS relid + FROM current_relations cr + INNER JOIN current_relation_members crm ON crm.id=cr.id + INNER JOIN current_nodes cn ON crm.member_id=cn.id AND crm.member_type='node' + WHERE #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "cn.")} + EOF + unless way_ids.empty? + sql+=<<-EOF + UNION + SELECT DISTINCT cr.id AS relid + FROM current_relations cr + INNER JOIN current_relation_members crm ON crm.id=cr.id + WHERE crm.member_type='way' + AND crm.member_id IN (#{way_ids.join(',')}) + EOF + end + return ActiveRecord::Base.connection.select_all(sql).collect { |a| a['relid'].to_i }.uniq end - - def coord2lat(a,masterscale,basey) #:doc: - y2lat(a/-masterscale+basey) + + def sql_get_nodes_in_way(wayid) + points=[] + sql=<<-EOF + SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,current_nodes.id,tags + FROM current_way_nodes,current_nodes + WHERE current_way_nodes.id=#{wayid.to_i} + AND current_way_nodes.node_id=current_nodes.id + AND current_nodes.visible=1 + ORDER BY sequence_id + EOF + ActiveRecord::Base.connection.select_all(sql).each do |row| + points << [row['lon'].to_f,row['lat'].to_f,row['id'].to_i,nil,tagstring_to_hash(row['tags'])] + end + points end - - def coord2long(a,masterscale,baselong) #:doc: - a/masterscale+baselong - end - - def y2lat(a) - 180/Math::PI * (2*Math.atan(Math.exp(a*Math::PI/180))-Math::PI/2) + + def sql_get_tags_in_way(wayid) + tags={} + ActiveRecord::Base.connection.select_all("SELECT k,v FROM current_way_tags WHERE id=#{wayid.to_i}").each do |row| + tags[row['k']]=row['v'] + end + tags end end diff --git a/app/models/node.rb b/app/models/node.rb index abfa44d67..d61293e82 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -20,6 +20,10 @@ class Node < ActiveRecord::Base has_many :containing_relation_members, :class_name => "RelationMember", :as => :member has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation, :extend => ObjectFinder + # Atomic undelete support + has_many :old_way_nodes + has_many :ways_via_history, :class_name=> "Way", :through => :old_way_nodes, :source => :way + # Sanity check the latitude and longitude and add an error if it's broken def validate_position errors.add_to_base("Node is not in the world") unless in_world? diff --git a/app/models/old_way.rb b/app/models/old_way.rb index 1abb23bbb..63265d6bf 100644 --- a/app/models/old_way.rb +++ b/app/models/old_way.rb @@ -110,6 +110,35 @@ class OldWay < ActiveRecord::Base return el1 end + # Read full version of old way + # For get_nodes_undelete, uses same nodes, even if they've moved since + # For get_nodes_revert, allocates new ids + # Currently returns Potlatch-style array + + def get_nodes_undelete + points = [] + self.nds.each do |n| + node=Node.find(n) + points << [node.lon, node.lat, n, node.visible ? 1 : 0, node.tags_as_hash] + end + points + end + + def get_nodes_revert + points=[] + self.nds.each do |n| + oldnode=OldNode.find(:first, :conditions=>['id=? AND timestamp<=?',n,self.timestamp], :order=>"timestamp DESC") + curnode=Node.find(n) + id=n; v=curnode.visible ? 1 : 0 + if oldnode.lat!=curnode.lat or oldnode.lon!=curnode.lon or oldnode.tags!=curnode.tags then + # node has changed: if it's in other ways, give it a new id + if curnode.ways-[self.id] then id=-1; v=nil end + end + points << [oldnode.lon, oldnode.lat, id, v, oldnode.tags_as_hash] + end + points + end + # Temporary method to match interface to nodes def tags_as_hash return self.tags diff --git a/app/models/old_way_node.rb b/app/models/old_way_node.rb index 85a6f3c1c..a6e65da85 100644 --- a/app/models/old_way_node.rb +++ b/app/models/old_way_node.rb @@ -2,4 +2,7 @@ class OldWayNode < ActiveRecord::Base set_table_name 'way_nodes' set_primary_keys :id, :version, :sequence_id + + # Atomic undelete support + belongs_to :way, :foreign_key=> :id end diff --git a/app/models/way.rb b/app/models/way.rb index 64b11cf67..59988d88b 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -236,13 +236,7 @@ class Way < ActiveRecord::Base # delete a way and it's nodes that aren't part of other ways, with history def delete_with_relations_and_nodes_and_history(user) - node_ids = self.nodes.collect {|node| node.id } - node_ids_not_to_delete = [] - way_nodes = WayNode.find(:all, :conditions => "node_id in (#{node_ids.join(',')}) and id != #{self.id}") - - node_ids_not_to_delete = way_nodes.collect {|way_node| way_node.node_id} - - node_ids_to_delete = node_ids - node_ids_not_to_delete + node_ids_to_delete = self.unique_nodes # delete the nodes not used by other ways node_ids_to_delete.each do |node_id| @@ -258,6 +252,16 @@ class Way < ActiveRecord::Base end + # Find nodes that belong to this way only + def unique_nodes + node_ids = self.nodes.collect {|node| node.id } + if node_ids.length==0 then return [] end + node_ids_in_other_ways = [] + way_nodes = WayNode.find(:all, :conditions => "node_id in (#{node_ids.join(',')}) and id != #{self.id}") + node_ids_in_other_ways = way_nodes.collect {|way_node| way_node.node_id} + return node_ids - node_ids_in_other_ways + end + # Temporary method to match interface to nodes def tags_as_hash return self.tags diff --git a/app/views/site/edit.rhtml b/app/views/site/edit.rhtml index a3896bc48..9c3c78fda 100644 --- a/app/views/site/edit.rhtml +++ b/app/views/site/edit.rhtml @@ -65,9 +65,9 @@ fo.addVariable('token','<%= session[:token] %>'); if (lat) { fo.addVariable('lat',lat); } if (lon) { fo.addVariable('long',lon); } - <% if params['gpx'] %> - fo.addVariable('gpx','<%= h(params['gpx']) %>'); - <% end %> + <% if params['gpx'] %>fo.addVariable('gpx' ,'<%= h(params['gpx'] ) %>');<% end %> + <% if params['way'] %>fo.addVariable('way' ,'<%= h(params['way'] ) %>');<% end %> + <% if params['node'] %>fo.addVariable('node','<%= h(params['node']) %>');<% end %> fo.write("map"); } diff --git a/config/environment.rb b/config/environment.rb index 495f94d80..6cf8b261d 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -78,4 +78,6 @@ end # This has to be after the above block for some reason (doesnt pull in /lib/osm.rb?) POTLATCH_PRESETS = Potlatch::Potlatch.get_presets() - +# Use SQL (faster) or Rails (more elegant) for common Potlatch reads +# getway speedup is approximately x2, whichways approximately x7 +POTLATCH_USE_SQL = true diff --git a/config/potlatch/localised.yaml b/config/potlatch/localised.yaml new file mode 100644 index 000000000..f61bdc18a --- /dev/null +++ b/config/potlatch/localised.yaml @@ -0,0 +1,621 @@ +a_poi: + "de": $1 einen Ort von Interesse (POI) + "hu": POI $1 +a_way: + "de": $1 einen Weg + "hu": Út $1 +action_addpoint: + "de": Am Ende des Wegs Punkt hinzufügen + "es": Añadir un punto al final de una vía + "fi": pisteen lisääminen tien perään + "fr": Ajout d'un point à la fin d'un chemin + "hu": pont hozzáadása az út végéhez + "no": adding a node to the end of a way + "ru": добавить точку в конец пути + "sv": lägger till en punkt på slutet av en väg +action_cancelchanges: + "de": Änderungen an $1 abgebrochen + "es": Cancelar cambios + "fi": peruutetaan muutokset + "fr": annulation de la modification + "hu": cancelling changes to + "no": cancelling changes to + "ru": отмена изменений к + "sv": avbryter ändringar på +action_createpoi: + "de": Einen Ort von Interesse (POI) erstellen + "es": Crear un punto de interés (POI) + "fi": "POI:n lisääminen" + "fr": créer un POI (point d'intérêt) + "hu": POI készítése + "no": lage et POI (interessant punkt) + "ru": создаю точку интереса(POI) + "sv": Skapa en POI, "punk av intresse" +action_deletepoint: + "de": Punkt löschen + "es": Borrar un punto + "fi": pisteen poistaminen + "fr": suppression d'un point + "hu": pont törlése + "no": deleting a point + "ru": удаляю узел + "sv": Tar bort en punkt +action_insertnode: + "de": Punkt auf Weg hinzufügen + "es": Añadir un punto a una vía + "fi": pisteen lisääminen tiehen + "fr": Ajouter un point sur un chemin + "hu": pont hozzáadása úthoz + "no": adding a node into a way + "ru": добавляю узел в путь + "sv": läggertill en punkt till en väg +action_mergeways: + "de": Zwei Wege verschmelzen + "es": Combinar dos vías + "fi": kahden tien yhdistäminen + "fr": Joindre deux chemins + "hu": két út egyesítése + "no": slår sammen to veier + "ru": соединяю два пути + "sv": Slåsamman två vägar +action_movepoi: + "de": Ort von Interesse (POI) verschieben + "es": Mover un punto de interés (POI) + "fi": "POI:n siirtäminen" + "fr": déplacer un POI + "hu": POI mozgatása + "no": flytter et POI (interessant punkt) + "ru": перемещаю точку интереса(POI) + "sv": Flytta på en POI, "punkt av intresse" +action_movepoint: + "de": Punkt verschieben + "es": Mover un punto + "fi": pisteen lisääminen + "fr": déplacer un point + "hu": pont mozgatása + "no": flytter punkt + "ru": перемещаю точку + "sv": Flytta en punkt +action_moveway: + "de": einen Weg verschieben + "hu": út mozgatása +action_pointtags: + "de": Attribute (Tags) für Punkt zuweisen + "es": Parámetros (tags) un punto + "fi": pisteen tagien asettaminen + "fr": Paramétrer un point + "hu": setting tags on a point + "no": setting tags on a point + "ru": установка тегов для точки + "sv": lägger till tagger på en punkt +action_poitags: + "de": Attribute (Tags) für Ort von Interesse (POI) zuweisen + "es": Parámetros (tags) en un punto de interés (POI) + "fi": "POI:n tagien asettaminen" + "fr": Paramétrer un POI + "hu": setting tags on a POI + "no": setting tags on a POI + "ru": установка тегов для точки интереса (POI) + "sv": lägger till tagger på en POI +action_reverseway: + "de": Wegrichtung umkehren + "es": Invertir dirección de una vía + "fi": tien kääntäminen + "fr": Inverser le sens du chemin + "hu": út megfordítása + "no": reversing a way + "ru": ищменение направления пути + "sv": Byter rikting på en väg +action_splitway: + "de": Weg teilen + "es": Dividir una vía + "fi": tien katkaisu + "fr": Scinder un chemin + "hu": út kettévágása + "no": splitting a way + "ru": разбиваю путь + "sv": delar upp en väg +action_waytags: + "de": Attribute (Tags) für Weg zuweisen + "es": Parámetros (tags) en una vía + "fi": tien tagian asettaminen + "fr": Paramétrer un chemin + "hu": setting tags on a way + "no": setting tags on a way + "ru": установка тегов для путиs + "sv": lägger till tagger på en väg +add: + "de": Hinzufügen + "es": Añadir + "fi": Lisää + "fr": Ajouter + "hu": Hozzáadás + "no": Add + "ru": Добавить + "sv": Läggtill +cancel: + "de": Abbrechen + "es": Cancelar + "fi": Peru + "fr": Annuler + "hu": Mégse + "no": Avbryt + "ru": Отмена + "sv": Avbryt +createrelation: + "de": Eine neue Relation erstellen + "es": Crear una nueva relación + "fi": Luo uusi relaatio + "fr": Créer une nouvelle relation + "hu": Új kapcsolat létrehozása + "no": Create a new relation + "ru": Создать отношение + "sv": Skapa en ny relation +delete: + "de": löschen + "hu": Törlés +deleting: + "de": löschen + "es": Borrar + "fi": poistaminen + "fr": suppression + "hu": törlés + "no": deleting + "ru": удаляю + "sv": Tar bort +dontshowagain: + "de": Diese Meldung nicht wieder anzeigen. + "es": No mostrar este mensaje de nuevo + "fi": Älä näytä tätä viestiä enää. + "fr": Ne plus afficher ce message + "hu": Ez az üzenet ne jelenjen meg újra + "no": Ikke vis denne meldingen igjen + "ru": Не показывать это сообщение снова. + "sv": Visa inte detta medelande igen +editingmap: + "de": Karte editieren + "hu": Térkép szerkesztése +emailauthor: + "de": \n\nBitte maile an richard\@systemeD.net eine Fehlerbeschreibung, und schildere, was Du in dem Moment getan hast. (Wenn möglich auf Englisch) + "es": \n\nPor favor envíe un mail a richard\@systemeD.net con un informe del error, describiendo lo que hacía en ese momento. + "fi": \n\nLähetäthän sähköpostia, jossa kerrot mitä olit tekemässä, osoitteeseen richard\@systemeD.net mieluiten englanniksi. + "fr": \n\nMerci d'envoyer un e-mail a richard\@systemeD.net pour signaler ce bogue, en expliquant ce que vous faisiez quand il est survenu. + "hu": \n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time. + "no": \n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time. + "ru": "\n\n Пожалуйста, отправьте сообщение об ошибке (на английском языке) на электронную почту: richard\@systemeD.net, с указанием того, какие действия вы совершали." + "sv": \n\nVänligen e-posta richard\@systemeD.net med en felreport, som beskriver vad du gjorde när felet inträffade. +error_connectionfailed: + "de": Die Verbindung zum OpenStreetMap Server ist leider fehlgeschlagen. Kürzliche Änderungen wurden nicht gespeichert.\n\nNochmal versuchen? + "es": "Disculpe - la conexión al servidor de OpenStreetMap ha fallado. Cualquier cambio reciente no se ha guardado.\n\nPodría intentarlo de nuevo?" + "fi": "Yhteys OSM-palvelimeen epäonnistui. Tuoreita muutoksia ei ole tallennettu.\n\nHaluatko yrittää uudestaan?" + "fr": "Désolé, la connexion au serveur OpenStreetMap a échoué. Vos changements récents ne sont pas enregistrés.\n\nVoulez-vous réessayer ?" + "hu": "Bocs - az OpenStreetMap szerverhez való kapcsolódás sikertelen. A legutóbbi módosítások nem lettek elmentve.\n\nSzeretnéd megpróbálni újra?" + "no": "Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?" + "ru": "Извините, соединение с сервером OpenStreetMap разорвано. Все текущие изменения не были сохранены.\n\nПопробовать ещё раз?" + "sv": "Tyvärr har vi tappat kontakten med OpenStreetMap serven. Ny gjorda ändringar har inte kunnat sparas.\n\nFörsöka återansluta?" +error_nopoi: + "de": Der Ort von Interesse (POI) kann nicht gefunden werden (vielleicht hast Du den Kartenausschnitt verschoben?), daher ist Rückgängigmachen nicht möglich. + "es": El punto de interés (POI) no se puede encontrar (igual usted se ha desplazado a otra zona?), por tanto no se puede deshacer. + "fi": POI ei löydä (ehkä vieritit siitä liian kauaksi), joten peruminen ei onnistu. + "fr": Le point d'intérêt (POI) n'est pas trouvé (éventuellement sur une autre page?), il ne peut être restauré. + "hu": The POI cannot be found (perhaps you've panned away?) so I can't undo. + "no": The POI cannot be found (perhaps you've panned away?) so I can't undo. + "ru": Точка интереса(POI) не найдена (возможно вы отошли в сторону?), поэтому невозможно отменить. + "sv": "POI:n kan inte hittas (du kanske har flyttat den utanför bilden?) så det går inte att ångra." +error_nosharedpoint: + "de": Die Wege $1 und $2 haben keinen gemeinsamen Punkt mehr, daher kann das Aufteilen nicht rückgängig gemacht werden. + "es": Las vías $1 y $2 ya no tienen ningún punto en común, por tanto no se pueden dividir. + "fi": Ways $1 and $2 don't share a common point any more, so I can't undo the split. + "fr": "Les chemins $1 et $2 n'ont plus de point en commun et ne peuvent donc pas être recollés : l'opération précédente de scindage ne peut être annulée." + "hu": Ways $1 and $2 don't share a common point any more, so I can't undo the split. + "no": Ways $1 and $2 don't share a common point any more, so I can't undo the split. + "ru": Пути $1 и $2 больше не содержат общих узлов, поэтому невозможно отменить разделение. + "sv": Vägarna $1 och $2 möts inte i någon punkt längre, så det går inte att ångra delningen. +error_noway: + "de": Der Weg $1 kann nicht gefunden werden (vielleicht hast Du den Kartenausschnitt verschoben?), daher ist Rückgängigmachen nicht möglich. + "es": La vía $1 no se puede encontrar (igual usted se ha desplazado a otra zona?), por tanto no se puede deshacer.. + "fi": Tietä $1 ei löydy (ehkä vieritit siitä liian kauaksi), joten kumoaminen ei onnistu. + "fr": Le chemin $1 n'a pas été trouvé, il ne peut être restauré à son état précédent. + "hu": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. + "no": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. + "ru": Путь $1 не найден (возможно вы отошли в сторону?), поэтому невозможно отменить. + "sv": Vägen $1 kan inte hittas (du kanske har flyttat den utanför bilden?) så det går inte att ångra. +gpxpleasewait: + "de": Bitte warten, während die GPX-Aufzeichnung (Track) verarbeitet wird. + "es": Por favor espere un poco mientras el track GPX se procesa. + "fi": Odota. GPX-jälkeä käsitellään. + "fr": Patientez pendant que la trace GPX est traitée. + "hu": Kérlek várj a GPX útvonal feldolgozásáig. + "no": Vennligst vent mens sporloggen behandles. + "ru": Пожалуйста, подождите — GPX-треки обрабатываются. + "sv": GPX loggen bearbetas, var god vänta. +help: + "de": Hilfe + "es": Ayuda + "fi": Ohje + "fr": Aide + "hu": Segítség + "no": Hjelp + "ru": Помощь + "sv": Hjälp +hint_drawmode: + "de": Klicken um Punkt hinzuzufügen\n Doppelklicken oder Eingabetaste zum Beenden der Linie + "es": Clic para añadir un punto\ndoble-clic/Return\npara terminar la línea + "fi": klikkaa lisätäksesi piste\ntuplaklikkaa tai paina enter päättääksesi tien + "fr": clic pour ajouter un point\ndouble-clic/Return\npour terminer le chemin + "hu": kattintás pont hozzáadásához\ndupla kattintás/Return\na vonal befejezéséhez + "no": trykk for å legge til punkt\ndobbeltklikk eller enter\nfor å avslutte linje + "ru": кликните для добавления точки\nдвойной клик или Enter\nчтобы чтобы закончить путь + "sv": Klicka för att lägga till en punkt\n Dubbel klicka för att avsluta vägen. +hint_loading: + "de": Wege werden geladen + "es": Cargando vías + "fi": ladataan teitä + "fr": chargement des chemins en cours + "hu": utak betöltése + "no": laster veier + "ru": загрузка путей + "sv": laddar vägar +hint_overendpoint: + "de": Überlappung mit Endpunkt\nKlicken zum Anschließen\nShift+Klick zum Verschmelzen + "es": Sobre punto final\nclic para unir\nshift-clic para combinar + "fi": päätepisteen päällä\nklikkaa sulkeaksi\nshift-klikkaa yhdistääksesi + "fr": sur le dernier point du tracé \nclick pour joindre\nshift-click pour fusionner + "hu": végpont fölött\nkattintás a csatlakoztatáshoz\nshift-kattintás az egyesítéshez + "no": over endepunkt\ntrykk for å koble sammen\nshift+trykk for å slå sammen + "ru": над конечным узлом\nclick для соединения\nshift-click для слияния + "sv": över en slutpunkt\nklicka för att sätta fast\nshift-klicka för att slåsamman +hint_overpoint: + "de": Überlappung mit Punkt\nklicken zum Anschließen + "es": Sobre punto\nclick para unir" + "fi": pisteen päällä\nklikkaa yhdistääksesi" + "fr": point du dessus\nclick pour joindre" + "hu": pont fölött\nkattintás a csatlakoztatáshoz" + "no": over punkt\ntrykk for å koble sammen + "ru": над узлом\nclick для соединения" + "sv": över en punkt \nkicka att sätta fast" +hint_pointselected: + "de": Punkt ist markiert\n(Shift+Punkt anklicken, um\n eine neue Linie zu ziehen) + "es": Punto seleccionado\n(shift-clic en el punto para\nempezar nueva línea) + "fi": piste valittua\n(shift-klikkaa pistettä\naloittaksesi uuden tien) + "fr": point sélectionné\n(shift-clic sur le point pour\ncommencer une nouvelle ligne) + "hu": pont kijelölve\n(shift-kattintás a pontra \núj vonal kezdéséhez) + "no": punkt valgt\n(shift+trykk punktet for å\nstarte en ny linje) + "ru": точка выбрана\n(кликните с нажатым Shift на точку\nчтобы начать новую линию) + "sv": En punk är vald\n(Shift-klicka på punkten för att starta en ny väg) +hint_toolong: + "de": "Zu lang zum Entsperren:\n bitte in kürzere Wege aufteilen" + "es": "Demasiado larga para desbloquear:\nPorfavor divida\nen vías más cortas" + "fi": "liian pitkä vapautettavaksi:\nkatkaise\nlyhyempiin teihin" + "fr": "trop long pour débloquer la situation:\nscindez le chemin en\nchemins plus courts" + "hu": "too long to unlock:\nplease split into\nshorter ways" + "no": "for lang til å låse opp:\nvennligst del opp\ni mindre veier" + "ru": "слишком длинный путь для разблокировки:\пожалуйста, разбейте его\nна более короткие пути" + "sv": "för lång för att låsaupp:\ndela upp vägen\ni mindre delar" +option_background: + "de": "Hintergrund:" + "es": "Fondo:" + "fi": "Tausta:" + "fr": "Arrière-plan :" + "hu": "Háttér:" + "no": "Background:" + "ru": "Фон:" + "sv": "Bakgrund:" +option_custompointers: + "de": Stift- und Hand-Mauszeiger benutzen + "es": Usar punteros de pluma y mano + "fi": Käytä kynä- ja käsikursoreita + "fr": Utiliser le crayon et la main pour pointer les éléments + "hu": Use pen and hand pointers + "no": Use pen and hand pointers + "ru": Использовать курсоры пера и руки + "sv": Använd penna och hand pekare +option_fadebackground: + "de": Hintergrund verblasst + "es": Atenuar fondo + "fi": Himmeä tausta + "fr": Arrière-plan clair + "hu": Fade background + "no": Fade background + "ru": Обесцветить фон + "sv": Mattad bakgrund +option_thinlines: + "de": Dünne Linien in allen Auflösungen benutzen + "es": Usar líneas finas en todas las escalas + "fi": Käytä aina ohuita viivoja + "fr": Utiliser un trait fin à toutes les échelles + "hu": Use thin lines at all scales + "no": Use thin lines at all scales + "ru": Использовать тонкие линии на всех масштабах + "sv": Använd tunna linjer på alla skalor +play: + "de": Ausprobieren + "hu": Kipróbálás +point: + "de": Punkt + "hu": Pont +practicemode: + "de": Übungsmodus + "es": Modo prácticas + "fi": Harjoitustila + "fr": Mode d'essai + "hu": Gyakorlás mód + "no": Øvelsesmodus + "ru": Тренировочный режим + "sv": Tränings läge +prompt_accuracy: + "de": Fehlerfreiheit ist wichtig - Trage nur Orte ein, wo Du warst + "es": La precisión es importante - Mapee solo zonas en las que ha estado físicamente. + "fi": Tarkkuus on tärkeää; muokkaathan vain paikkoja, joissa olet ollut. + "fr": Précision importante - Éditez seulement les lieux que vous avez visités + "hu": A pontosság fontos - csak olyan helyeket térképezz, ahol már jártál + "no": Nøyaktighet er viktig, bare kartlegg steder du har besøkt + "ru": Точность важна. Составляйте карты только для тех мест, в которых вы были. + "sv": Noggrannhet är viktigt - kartera bara ställen du varit +prompt_addtorelation: + "de": $1 zu einer Relation hinzufügen + "es": Añadir $1 a una relación + "fi": Lisä $1 relaatioon + "fr": Ajouter $1 à la relation + "hu": $1 hozzáadása egy kapcsolathoz + "no": Add $1 to a relation + "ru": Добавить $1 в отношение + "sv": Läggtill $1 till en relation +prompt_dontcopy: + "de": Kopiere nichts von anderen Karten + "es": No copie de otros mapas + "fi": Älä kopioi muista kartoista + "fr": Ne copiez pas d'autre cartes + "hu": Ne másolj más térképekből + "no": Ikke kopier fra andre kart + "ru": Не копируйте информацию с других карт + "sv": Kopiera inget från andra kartor +prompt_enjoy: + "de": "Und: Viel Spaß!" + "es": Y páselo bien! + "fi": Pidä hauskaa! + "fr": Et amusez-vous bien ! + "hu": És szórakozz jól! + "no": Og ha det morsomt! + "ru": Приятного вам времяпровождения! + "sv": och ha roligt! +prompt_help: + "de": Anleitung für Potlatch, diesen Karten-Editor. + "es": Encuentre cómo usar Potlatch (éste editor de mapas). + "fi": Kuinka käytän Potlatchiä, tätä editoria? + "fr": Découvrez comment utiliser Potlatch, cet éditeur de la carte. + "hu": Nézz utána, hogyan kell használni a Potlatch-ot, ezt a térképszerkesztőt. + "no": Find out how to use Potlatch, this map editor. + "ru": Узнать, как пользоваться редактором. + "sv": Information hur man använder Potlatch, den här kart editorn. +prompt_introduction: + "de": Wähle unten eine Schaltfläche zum Editieren. Wenn Du "Start" anklickst, wirst Du die Karte sofort direkt bearbeiten - Änderungen werden meist jeden Donnerstag sichtbar. Wenn Du "Ausprobieren" anklickst, werden Deine Änderungen nicht gespeichert, also kannst Du hier das Bearbeiten üben.\n\nDenk an die Goldenen Regeln von OpenStreetMap:\n\n + "es": Seleccione uno de los botones más abajo para empezar a editar. Si pulsa "Empezar", estará editando directamente el mapa - Normalmente los cambios se mostrarán cada Jueves. Si pulsa "Jugar", sus cambios no se guardarán, de esta manera podrá practicar la edición.\n\nRecuerde las reglas de oro de OpenStreetMap:\n\n + "fi": "Valitse haluamasi tila. Jos valitset aloita, pääset muokkaamaan karttaa suoraan - muutokset päivittyvät pääsivun kartalle yleensä torstaisin. Jos valitset harjoittele, tekemiäsi muutoksia ei tallenneta mihinkää, eli voit harjoitella editointia\n\nMuistathan OpenStreetMapin kultaiset säännöt:\n\n" + "fr": "Choisir un bouton ci-dessous pour commencer l'édition. Si vous cliquez sur 'Start', vous éditerez directement la carte principale - les modifications sont visibles sur celle-ci généralement tous les jeudis. Si vous cliquez sur 'Play', vos modifications ne seront pas enregistrées, ainsi vous pouvez vous exercer sans risques.\n\nEt gardez en tête ces règles d'or d'OpenStreetMap :\n\n" + "hu": "Válassz az alábbi gombok közül a szerkesztéshez. Ha a 'Kezdés'-re kattintasz, akkor közvetlenül a főtérképet szerkesztheted - a módosítások általában minden csütörtökön jelennek meg. Ha a 'Kipróbálás'-ra kattintasz, akkor a módosításaid nem lesznek elmentve, így gyakorolhatod a szerkesztést.\n\nEmlékezz az OpenStreetMap aranyszabályaira:\n\n" + "no": "Velg en knapp nedenfor for å redigere. Hvis du velger 'Start' redigerer du kartet direkte, endringer blir vanligvis synlige hver torsdag. Hvis du velger 'Lek' lagres ikke endringer, så du kan øve deg på å redigere.\nHusk OpenStreetMaps gyldne regler:\n\n" + "ru": "Выберите кнопку. Если вы нажмёте «Start», вы начнёте редактировать карту. Основная карта обновляется по средам. Если вы нажмёте «Play», ваши изменения на карте сохраняться не будут и вы сможете практиковаться в редактировании.\n\nЗапомните основные правила OpenStreetMap:\n\n" + "sv": "För att börja editera, klicka på en av knapparna nedan. Om du klickar på 'Start' så arbetar du direkt mot huvudkartan, och ändringar sparas automatiskt - ändringarna syns normalt varje torsdag efter huvudkartan uppdaterats. Om du klickar 'Play' så kommer inget att sparas, ett bra sätt att träna på att använda programmet.\n\nKom ihåg OpenStreetMaps gyllene regler:\n\n" +prompt_practise: + "de": Bearbeiten üben - Deine Änderungen werden nicht gespeichert. + "es": Mapear en prácticas - Sus cambios no se guardarán. + "fi": Harjoittele - muutoksiasi ei talleneta. + "fr": "Essai de cartographie : vos changements ne seront pas pris en compte." + "hu": Térképezés gyakorlása - módosításaid nem lesznek elmentve. + "no": Øv på kartlegging, endringer blir ikke lagret. + "ru": Тренировочное редактирование — ваши изменения не будут сохранены. + "sv": Träna på kartering - inga ändringar kommer att sparas. +prompt_revertversion: + "de": "Früher gespeicherte Version wiederherstellen:" + "es": "Volver a una versión previamente guardada:" + "fi": "Palauta aiempaan versioon:" + "fr": "Revenir à une version sauvegardée plus récente :" + "hu": "Visszaállítás egy korábbi mentett változatra:" + "no": "Tilbakestill til tidligere lagret versjon:" + "ru": "Восстановить ранее сохраненную версию:" + "sv": Gå tillbaks till en tidigare version +prompt_selectrelation: + "de": Bestehende Relation zum Hinzufügen auswählen oder neue Relation erstellen. + "es": Seleccionar una relación existente para añadir a ella, o crear una nueva relación. + "fi": Valitse olemassa oleva relaatio, johon lisätään, tai luo uusi. + "fr": Sélectionner une relation existante pour l'ajouter, ou créer une nouvelle relation. + "hu": Select an existing relation to add to, or create a new relation. + "no": Select an existing relation to add to, or create a new relation. + "ru": Выберете существующее отношение или создайте новое. + "sv": Välj en befintligrelation att addera till, eller skapa en ny relation. +prompt_start: + "de": Kartographieren mit OpenStreetMap beginnen + "es": Empezar a mapear con OpenStreetMap. + "fi": Aloita kartan muokkaus. + "fr": Démarrer la cartographie avec OpenStreetMap. + "hu": Térképezés kezdése OpenStreetMappal. + "no": Begynn å kartlegg med OpenStreetMap. + "ru": Начать редактировать карту OpenStreetMap. + "sv": Börja kartera med OpenStreetMap. +prompt_taggedpoints: + "de": Einige Punkte auf diesem Weg tragen Attribute (Tags). Trotzdem löschen? + "es": Algunos puntos de esta vía tienen parámetros (tags). Seguro que quiere borrar? + "fi": Joihinkin tien pisteisiin on lisätty tageja. Haluatko varmasti perua? + "fr": Certains points de ce chemin sont tagués. Souhaitez-vous les supprimer? + "hu": Ezen az úton van néhány címkézett pont. Biztosan törlöd? + "no": Some of the points on this way are tagged. Really delete? + "ru": Некоторые узлы данного пути содержат теги. Действительно удалить? + "sv": Några en punkterna i denna väg är taggade, vill du verkligen ta bort den? +prompt_track: + "de": Deine GPS-Aufzeichnungen (Tracks) in (gesperrte) Wege zum Editieren wandeln. + "es": Convierta su track de GPS a vías (bloqueadas) para editar. + "fi": Muunna GPX-jälki lukituiksi teiksi editointia varten + "fr": Conversion d'une trace GPS en chemin (verrouillé) pour l'édition. + "hu": Convert your GPS track to (locked) ways for editing. + "no": Convert your GPS track to (locked) ways for editing. + "ru": Конвертировать GPS-трек в путь(заблокированный), для редактирования. + "sv": Omvandla dina GPS spår till (låsta) vägar för editering. +prompt_welcome: + "de": Willkommen bei OpenStreetMap! + "es": Bienvenido a OpenStreetMap! + "fi": "Tervetuloa OpenStreetMap:iin" + "fr": Bienvenue sur OpenStreetMap ! + "hu": Üdvözöllek az OpenStreetMapon! + "no": Velkommen til OpenStreetMap! + "ru": Добро пожаловать в OpenStreetMap! + "sv": Välkommen till OpenStreetMap! +revert: + "de": Vorherige Version wiederherstellen + "es": Volver + "fi": Kumoa + "fr": Revenir + "hu": Visszaállítás + "no": Tilbakestill + "ru": Восстановить + "sv": Använd denna version +start: + "de": Start + "hu": Kezdés +tip_addrelation: + "de": Zu einer Relation hinzufügen + "es": Añadir a una relación + "fi": Lisää relaatio + "fr": Ajouter à une relation + "hu": Hozzáadás kapcsolathoz + "no": Legg til i en relation + "ru": Добавить новое отношение(relation) + "sv": Läggtill en ny relation +tip_addtag: + "de": Attribut (Tag) hinzufügen + "es": Añadir un nuevo parámetro (tag) + "fi": Lisää uusi tagi + "fr": Ajouter un nouveau tag + "hu": Új címke hozzáadása + "no": Legg til tag + "ru": Добавить новый тег + "sv": Läggtill en ny tag +tip_alert: + "de": Ein Fehler ist aufgetreten - Klicken für Details + "es": Ha ocurrido un error - clic para detalles + "fi": Tapahtui virhe - klikkaa saadaksesi lisätietoja + "fr": Une erreur vient de survenir - cliquez pour plus de détails + "hu": Hiba történt - kattints a részletekért + "no": Det oppstod en feil, trykk for detaljer + "ru": Произошла ошибка — нажмите для получения подробностей + "sv": Ett fel har inträffat - klicka för detaljer +tip_anticlockwise: + "de": Geschlossener Weg gegen den Uhrzeigersinn - Klicken zum Richtung Ändern + "es": Vía circular en el sentido contrario de las agujas del reloj - clic para invertir la dirección de la vía + "fi": Vastapäivään sulkeutuva tie - klikkaa kääntääksesi + "fr": Circulation dans le sens inverse des aiguilles d'une montre (trigonométrique) - Cliquez pour inverser le sens + "hu": Órajárással ellentétes körút - kattints a megfordításhoz + "no": Sirkulær vei mot klokka, trykk for å snu + "ru": Замкнутый путь против часовой стрелки - изменить на противоположный + "sv": Vägen är rund, riktad moturs, klicka för att vända rikting +tip_clockwise: + "de": Geschlossener Weg im Uhrzeigersinn - Klicken zum Richtung Ändern + "es": Vía circular en el sentido de las agujas del reloj - clic para invertir la dirección de la vía + "fi": Myötäpäivään sulkeutuva tie - klikkaa kääntääksesi + "fr": Circulation dans le sens des aiguilles d'une montre - Cliquez pour inverser le sens + "hu": Órajárással egyező körút - kattints a megfordításhoz + "no": Sirkulær vei med klokka, trykk for å snu + "ru": Замкнутый путь по часовой стрелке - изменить на противоположный + "sv": Vägen är rund riktad medurs, klicka för att vända riktning +tip_direction: + "de": Richtung des Weges - Klicken zum Ändern + "es": Dirección de la vía - clic para invertir la dirección de la vía + "fi": Tien suunta - klikkaa kääntääksesi + "fr": Direction du chemin - cliquez pour inverser + "hu": Út iránya - kattints a megfordításhoz + "no": Veiretning, trykk for å snu + "ru": Направление пути — изменить на противоположный + "sv": Vägens riktning - klicka för att vända vägen +tip_gps: + "de": GPS-Aufzeichnungen (Tracks) einblenden (G) + "es": Mostrar los tracks de GPS (G) + "fi": Näytä GPS-jäljet (G) + "fr": Afficher la trace GPS (G) + "hu": GPS útvonalak megjelenítése (G) + "no": Vis GPS sporlogger (G) + "ru": Показать GPS треки (G) + "sv": Visa GPS spår (G) +tip_noundo: + "de": Es gibt nichts rückgängig zu machen. + "es": Nada que deshacer + "fi": Ei kumottavaa + "fr": Rien à annuler + "hu": Nincs mit visszavonni + "no": Ingenting å angre + "ru": Нечего отменять + "sv": Finns inget att ångra +tip_options: + "de": Optionen ändern (Kartenhintergrund) + "es": Opciones (elegir el fondo del mapa) + "fi": Asetukset (valitse kartan tausta) + "fr": Options (choix de la carte d'arrière plan) + "hu": Beállítások módosítása (térképháttér kiválasztása) + "no": Sett valg (velg kartbakgrunn) + "ru": Задать настройки (выбрать карту-подложку) + "sv": Ändra inställningar (välj bakgrunds karta) +tip_presettype: + "de": Wähle die Art der Voreinstellungen, die im Menü angeboten werden sollen. + "es": Seleccionar que tipo de parámetros (tags) preestablecidos se ofrecen en el menú. + "fi": Valitse millaisia pohjia on tarjolla valikossa. + "fr": Sélectionner le type de paramètres proposés dans le menu de sélection. + "hu": Choose what type of presets are offered in the menu. + "no": Choose what type of presets are offered in the menu. + "ru": Выберете какой набор тегов отображать в меню. + "sv": Välj vilka typer an inställningar som syns i menyn. +tip_repeattag: + "de": Attribute (Tags) vom vorher markierten Weg übernehmen (R) + "es": Repetir los parámetros (tags) de la vía seleccionada previamente (R) + "fi": Toista tagit viimeksi valitusta tiestä (R) + "fr": Recopier les informations du chemin sélectionné précédemment (R) + "hu": Az előzőleg kiválasztott út címkéinek megismétlése (R) + "no": Repeter tagger fra siste valgte vei (R) + "ru": Повторить теги с предыдущего выбранного пути (R) + "sv": Kopiera taggarna från den senast valda vägen (R) +tip_revertversion: + "de": Version zum Wiederherstellen wählen + "es": Elige la versión a la que volver. + "fi": Valitse versio, johon palautetaan + "fr": Choisissez la version vers laquelle revenir + "hu": Válaszd ki a változatot a visszaállításhoz + "no": Velg versjonen det skal tilbakestilles til + "ru": Выберете версию для воосстановления + "sv": Välj version som ska användas +tip_selectrelation: + "de": Zur markierten Route hinzufügen ?Route or Way? + "es": Añadir a la ruta seleccionada + "fi": Lisää valittuun reittiin + "fr": Ajouter à la route choisie + "hu": Hozzáadás a kiválasztott útvonalhoz + "no": Add to the chosen route + "ru": Добавить в выбранное отношение + "sv": Addera till den valda rutten +tip_splitway: + "de": Weg am markierten Punkt auftrennen (X) + "es": Dividir la vía en el punto seleccionado (X) + "fi": Katkaise tie valitusta kohtaa (X) + "fr": scinder le chemin au point sélectionné (X) + "hu": Út kettévágása a kijelölt pontnál (X) + "no": Del vei i valgt punkt (X) + "ru": Разделить путь в текущем узле (X) + "sv": Dela upp vägen i två delar vid den valda punkten (x) +tip_undo: + "de": $1 rückgängig machen (Z) + "es": Deshacer $1 (Z) + "fi": Kumoa $1 (Z) + "fr": Annuler l'opération $1 (Z) + "hu": $1 visszavonása (Z) + "no": Undo $1 (Z) + "ru": Отменить $1 (Z) + "sv": Ångra $1 (Z) +track: + "de": "to track: Weg aufzeichnen, the track: GPS-Aufzeichnung (Track)" + "es": Track + "fi": Jälki + "fr": Trace + "hu": Útvonal + "no": Track + "ru": Трек + "sv": Spår +way: + "de": Weg + "hu": Út diff --git a/config/potlatch/relation_colours.txt b/config/potlatch/relation_colours.txt index 03398fb71..557563fe2 100644 --- a/config/potlatch/relation_colours.txt +++ b/config/potlatch/relation_colours.txt @@ -4,4 +4,5 @@ lcn 0x0000ff 50 10 rcn 0x28c9fe 50 10 ncn 0xff3333 50 10 -ldp 0x228022 50 10 +foot 0x228022 50 10 +trail 0x228022 50 10 diff --git a/lib/potlatch.rb b/lib/potlatch.rb index 4dfba12ef..cf8f5903d 100644 --- a/lib/potlatch.rb +++ b/lib/potlatch.rb @@ -83,7 +83,7 @@ module Potlatch when 'Hash' a=3.chr n.each do |k,v| - a+=encodestring(k)+encodevalue(v) + a+=encodestring(k.to_s)+encodevalue(v) end a+0.chr+0.chr+9.chr when 'String' @@ -195,7 +195,10 @@ module Potlatch } end - [presets,presetmenus,presetnames,colours,casing,areas,autotags,relcolours,relalphas,relwidths] + # Read internationalisation + localised = YAML::load(File.open("#{RAILS_ROOT}/config/potlatch/localised.yaml")) + + [presets,presetmenus,presetnames,colours,casing,areas,autotags,relcolours,relalphas,relwidths,localised] end end diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index 721840fe4ec4d006d7b62d134313f7e90fffee54..63a04bf51c6f3451bdb6b88bad6110028a887549 100755 GIT binary patch literal 148900 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 C(O_Eu From 0283bd4f1ae426175933973bdcad09d1ec2d3f69 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 9 Jul 2008 23:27:33 +0000 Subject: [PATCH 07/58] Branch the rails code for Potlatch 0.10 support. From 50c0333ea6ae96ecbed574c2e2704e1005037d05 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 9 Jul 2008 23:31:00 +0000 Subject: [PATCH 08/58] Revert Potlatch 0.10 from the trunk - we will keep it on the potlatch_010 branch for now until it has been reviewed. --- app/controllers/amf_controller.rb | 1173 ++++++++++++++++---------- app/models/node.rb | 4 - app/models/old_way.rb | 29 - app/models/old_way_node.rb | 3 - app/models/way.rb | 18 +- app/views/site/edit.rhtml | 6 +- config/environment.rb | 4 +- config/potlatch/localised.yaml | 621 -------------- config/potlatch/relation_colours.txt | 3 +- lib/potlatch.rb | 7 +- public/potlatch/potlatch.swf | Bin 148900 -> 140596 bytes 11 files changed, 740 insertions(+), 1128 deletions(-) delete mode 100644 config/potlatch/localised.yaml diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 4ec4e660e..11ddc3f7c 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -1,33 +1,20 @@ -# amf_controller is a semi-standalone API for Flash clients, particularly -# Potlatch. All interaction between Potlatch (as a .SWF application) and the +# AMF Controller is a semi-standalone API for Flash clients, particularly Potlatch. +# All interaction between Potlatch (as a .SWF application) and the # OSM database takes place using this controller. Messages are # encoded in the Actionscript Message Format (AMF). # -# Helper functions are in /lib/potlatch. +# See Also Potlatch::Potlatch and Potlatch::AMF # -# Author:: editions Systeme D / Richard Fairhurst 2004-2008 -# Licence:: public domain. +# Public domain. +# editions Systeme D / Richard Fairhurst 2004-2008 # -# == General structure -# -# Apart from the talk method (which distributes the requests from the -# AMF message), each method generally takes arguments in the order they were -# sent by the Potlatch SWF. Do not assume typing has been preserved. Methods -# all return an array to the SWF. +# All in/out parameters are floats unless explicitly stated. # -# == Debugging -# -# Any method that returns a status code (0 for ok) can also send: -# return(-1,"message") <-- just puts up a dialogue -# return(-2,"message") <-- also asks the user to e-mail me -# -# To write to the Rails log, use RAILS_DEFAULT_LOGGER.info("message"). -# -# == To do -# -# - Check authentication -# - Check the right things are being written to the database! - +# to trap errors (getway_old,putway,putpoi,deleteway only): +# return(-1,"message") <-- just puts up a dialogue +# return(-2,"message") <-- also asks the user to e-mail me +# to log: +# RAILS_DEFAULT_LOGGER.error("Args: #{args[0]}, #{args[1]}, #{args[2]}, #{args[3]}") class AmfController < ApplicationController require 'stringio' @@ -36,214 +23,312 @@ class AmfController < ApplicationController session :off before_filter :check_write_availability - # Main AMF handler: processes the raw AMF string (using AMF library) and - # calls each action (private method) accordingly. - + # Main AMF handler. Tha talk method takes in AMF, figures out what to do and dispatched to the appropriate private method def talk - req=StringIO.new(request.raw_post+0.chr) # Get POST data as request - # (cf http://www.ruby-forum.com/topic/122163) - req.read(2) # Skip version indicator and client ID - results={} # Results of each body - renumberednodes={} # Shared across repeated putways - renumberedways={} # Shared across repeated putways + req=StringIO.new(request.raw_post+0.chr) # Get POST data as request + # (cf http://www.ruby-forum.com/topic/122163) + req.read(2) # Skip version indicator and client ID + results={} # Results of each body + renumberednodes={} # Shared across repeated putways + renumberedways={} # Shared across repeated putways - # Parse request + # ------------- + # Parse request - headers=AMF.getint(req) # Read number of headers + headers=AMF.getint(req) # Read number of headers - headers.times do # Read each header - name=AMF.getstring(req) # | - req.getc # | skip boolean - value=AMF.getvalue(req) # | - header["name"]=value # | - end + headers.times do # Read each header + name=AMF.getstring(req) # | + req.getc # | skip boolean + value=AMF.getvalue(req) # | + header["name"]=value # | + end - bodies=AMF.getint(req) # Read number of bodies - bodies.times do # Read each body - message=AMF.getstring(req) # | get message name - index=AMF.getstring(req) # | get index in response sequence - bytes=AMF.getlong(req) # | get total size in bytes - args=AMF.getvalue(req) # | get response (probably an array) + bodies=AMF.getint(req) # Read number of bodies + bodies.times do # Read each body + message=AMF.getstring(req) # | get message name + index=AMF.getstring(req) # | get index in response sequence + bytes=AMF.getlong(req) # | get total size in bytes + args=AMF.getvalue(req) # | get response (probably an array) - case message - when 'getpresets'; results[index]=AMF.putdata(index,getpresets()) - when 'whichways'; results[index]=AMF.putdata(index,whichways(*args)) - when 'whichways_deleted'; results[index]=AMF.putdata(index,whichways_deleted(*args)) - when 'getway'; results[index]=AMF.putdata(index,getway(args[0].to_i)) - when 'getrelation'; results[index]=AMF.putdata(index,getrelation(args[0].to_i)) - when 'getway_old'; results[index]=AMF.putdata(index,getway_old(args[0].to_i,args[1].to_i)) - when 'getway_history'; results[index]=AMF.putdata(index,getway_history(args[0].to_i)) - when 'putway'; r=putway(renumberednodes,*args) - renumberednodes=r[3] - if r[1] != r[2] - renumberedways[r[1]] = r[2] - end - results[index]=AMF.putdata(index,r) - when 'putrelation'; results[index]=AMF.putdata(index,putrelation(renumberednodes, renumberedways, *args)) - when 'deleteway'; results[index]=AMF.putdata(index,deleteway(args[0],args[1].to_i)) - when 'putpoi'; results[index]=AMF.putdata(index,putpoi(*args)) - when 'getpoi'; results[index]=AMF.putdata(index,getpoi(args[0].to_i)) - end - end + case message + when 'getpresets'; results[index]=AMF.putdata(index,getpresets) + when 'whichways'; results[index]=AMF.putdata(index,whichways(args)) + when 'whichways_deleted'; results[index]=AMF.putdata(index,whichways_deleted(args)) + when 'getway'; results[index]=AMF.putdata(index,getway(args)) + when 'getrelation'; results[index]=AMF.putdata(index,getrelation(args)) + when 'getway_old'; results[index]=AMF.putdata(index,getway_old(args)) + when 'getway_history'; results[index]=AMF.putdata(index,getway_history(args)) + when 'putway'; r=putway(args,renumberednodes) + renumberednodes=r[3] + if r[1] != r[2] + renumberedways[r[1]] = r[2] + end + results[index]=AMF.putdata(index,r) + when 'putrelation'; results[index]=AMF.putdata(index,putrelation(args, renumberednodes, renumberedways)) + when 'deleteway'; results[index]=AMF.putdata(index,deleteway(args)) + when 'putpoi'; results[index]=AMF.putdata(index,putpoi(args)) + when 'getpoi'; results[index]=AMF.putdata(index,getpoi(args)) + end + end - # Write out response + # ------------------ + # Write out response - a,b=results.length.divmod(256) - render :content_type => "application/x-amf", :text => proc { |response, output| - output.write 0.chr+0.chr+0.chr+0.chr+a.chr+b.chr - results.each do |k,v| - output.write(v) - end - } + RAILS_DEFAULT_LOGGER.info(" Response: start") + a,b=results.length.divmod(256) + render :content_type => "application/x-amf", :text => proc { |response, output| + output.write 0.chr+0.chr+0.chr+0.chr+a.chr+b.chr + results.each do |k,v| + output.write(v) + end + } + RAILS_DEFAULT_LOGGER.info(" Response: end") end private - # Return presets (default tags, localisation etc.): - # uses POTLATCH_PRESETS global, set up in OSM::Potlatch. - - def getpresets() #:doc: - return POTLATCH_PRESETS + # Return presets (default tags and crap) to potlatch. + # Uses POTLATCH_PRESETS global, set up in OSM::Potlatch + def getpresets #:doc: + return POTLATCH_PRESETS end - # Find all the ways, POI nodes (i.e. not part of ways), and relations - # in a given bounding box. Nodes are returned in full; ways and relations - # are IDs only. + # ----- whichways + # Find all the way ids and nodes (including tags and projected lat/lng) which aren't part of those ways in an are + # + # The argument is an array containing the following, in order: + # 0. minimum longitude + # 1. minimum latitude + # 2. maximum longitude + # 3. maximum latitude + # 4. baselong, 5. basey, 6. masterscale as above + def whichways(args) #:doc: + xmin = args[0].to_f-0.01 + ymin = args[1].to_f-0.01 + xmax = args[2].to_f+0.01 + ymax = args[3].to_f+0.01 + baselong = args[4] + basey = args[5] + masterscale = args[6] - def whichways(xmin,ymin,xmax,ymax) #:doc: - xmin-=0.01; ymin-=0.01 - xmax+=0.01; ymax+=0.01 + RAILS_DEFAULT_LOGGER.info(" Message: whichways, bbox=#{xmin},#{ymin},#{xmax},#{ymax}") - if POTLATCH_USE_SQL then - way_ids=sql_find_way_ids_in_area(xmin,ymin,xmax,ymax) - points=sql_find_pois_in_area(xmin,ymin,xmax,ymax) - relation_ids=sql_find_relations_in_area_and_ways(xmin,ymin,xmax,ymax,way_ids) - else - # find the way ids in an area - nodes_in_area = Node.find_by_area(ymin, xmin, ymax, xmax, :conditions => "current_nodes.visible = 1", :include => :ways) - way_ids = nodes_in_area.collect { |node| node.way_ids }.flatten.uniq + # find the way ids in an area + nodes_in_area = Node.find_by_area(ymin, xmin, ymax, xmax, :conditions => "current_nodes.visible = 1", :include => :ways) + way_ids = nodes_in_area.collect { |node| node.way_ids }.flatten.uniq - # find the node ids in an area that aren't part of ways - nodes_not_used_in_area = nodes_in_area.select { |node| node.ways.empty? } - points = nodes_not_used_in_area.collect { |n| [n.id, n.lon, n.lat, n.tags_as_hash] } + # find the node ids in an area that aren't part of ways + nodes_not_used_in_area = nodes_in_area.select { |node| node.ways.empty? } + points = nodes_not_used_in_area.collect { |n| [n.id, n.lon_potlatch(baselong,masterscale), n.lat_potlatch(basey,masterscale), n.tags_as_hash] } - # find the relations used by those nodes and ways - relations = nodes_in_area.collect { |node| node.containing_relations.visible }.flatten + - way_ids.collect { |id| Way.find(id).containing_relations.visible }.flatten - relation_ids = relations.collect { |relation| relation.id }.uniq - end + # find the relations used by those nodes and ways + relations = nodes_in_area.collect { |node| node.containing_relations.visible }.flatten + + way_ids.collect { |id| Way.find(id).containing_relations.visible }.flatten + relation_ids = relations.collect { |relation| relation.id }.uniq - [way_ids,points,relation_ids] + [way_ids,points,relation_ids] end - # Find deleted ways in current bounding box (similar to whichways, but ways - # with a deleted node only - not POIs or relations). + # ----- whichways_deleted + # return array of deleted ways in current bounding box + # in: as whichways + # does: finds all deleted ways with a deleted node in bounding box + # out: [0] array of way ids + def whichways_deleted(args) #:doc: + xmin = args[0].to_f-0.01 + ymin = args[1].to_f-0.01 + xmax = args[2].to_f+0.01 + ymax = args[3].to_f+0.01 + baselong = args[4] + basey = args[5] + masterscale = args[6] - def whichways_deleted(xmin,ymin,xmax,ymax) #:doc: - xmin-=0.01; ymin-=0.01 - xmax+=0.01; ymax+=0.01 - - nodes_in_area = Node.find_by_area(ymin, xmin, ymax,xmax, :conditions => "current_nodes.visible=0 AND current_ways.visible=0", :include => :ways_via_history ) - way_ids = nodes_in_area.collect { |node| node.ways_via_history_ids }.flatten.uniq - [way_ids] + sql=<<-EOF + SELECT DISTINCT current_ways.id + FROM current_nodes,way_nodes,current_ways + WHERE #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "current_nodes.")} + AND way_nodes.node_id=current_nodes.id + AND way_nodes.id=current_ways.id + AND current_nodes.visible=0 + AND current_ways.visible=0 + EOF + waylist = ActiveRecord::Base.connection.select_all(sql) + ways = waylist.collect {|a| a['id'].to_i } + [ways] end - # Get a way including nodes and tags. - # Returns 0 (success), a Potlatch-style array of points, and a hash of tags. - - def getway(wayid) #:doc: - if POTLATCH_USE_SQL then - points=sql_get_nodes_in_way(wayid) - tags=sql_get_tags_in_way(wayid) - else - # Ideally we would do ":include => :nodes" here but if we do that - # then rails only seems to return the first copy of a node when a - # way includes a node more than once - points = [] - way = Way.find(wayid) - way.nodes.each do |node| - points << [node.lon, node.lat, node.id, nil, node.tags_as_hash] - end - tags=way.tags - end - [wayid,points,tags] - end - - # Get an old version of a way, and all constituent nodes. + # ----- getway + # Get a way with all of it's nodes and tags + # The input is an array with the following components, in order: + # 0. wayid - the ID of the way to get + # 1. baselong - origin of SWF map (longitude) + # 2. basey - origin of SWF map (latitude) + # 3. masterscale - SWF map scale # - # For undelete (version=0), always uses the most recent version of each node, - # even if it's moved. For revert (version=1+), uses the node in existence - # at the time, generating a new id if it's still visible and has been moved/ - # retagged. + # The output is an array which contains all the nodes (with projected + # latitude and longitude) and tags for a way (and all the nodes tags). + # It also has the way's unprojected (WGS84) bbox. + # + # FIXME: The server really shouldn't be figuring out a ways bounding box and doing projection for potlatch + # FIXME: the argument splitting should be done in the 'talk' method, not here + def getway(args) #:doc: + wayid,baselong,basey,masterscale = args + wayid = wayid.to_i - def getway_old(id,version) #:doc: - if version<0 - old_way = OldWay.find(:first, :conditions => ['visible=1 AND id=?', id], :order => 'version DESC') - points = old_way.get_nodes_undelete - else - old_way = OldWay.find(:first, :conditions => ['id=? AND version=?', id, version]) - points = old_way.get_nodes_revert - end - old_way.tags['history']="Retrieved from v#{old_way.version}" - [0,id,points,old_way.tags,old_way.version] - end - - # Find history of a way. Returns an array of previous versions. + RAILS_DEFAULT_LOGGER.info(" Message: getway, id=#{wayid}") - def getway_history(wayid) #:doc: - history=[] - way=Way.find(wayid) - way.old_ways.each do |old_way| - if old_way.user.data_public then user=old_way.user.display_name else user='anonymous' end - history<<[old_way.version,old_way.timestamp.strftime("%d %b %Y, %H:%M"),old_way.visible ? 1 : 0,user] - end - [history] + # Ideally we would do ":include => :nodes" here but if we do that + # then rails only seems to return the first copy of a node when a + # way includes a node more than once + way = Way.find(wayid) + + long_array = [] + lat_array = [] + points = [] + + way.nodes.each do |node| + projected_longitude = node.lon_potlatch(baselong,masterscale) # do projection for potlatch + projected_latitude = node.lat_potlatch(basey,masterscale) + id = node.id + tags_hash = node.tags_as_hash + + points << [projected_longitude, projected_latitude, id, nil, tags_hash] + long_array << projected_longitude + lat_array << projected_latitude + end + + [wayid,points,way.tags,long_array.min,long_array.max,lat_array.min,lat_array.max] end - # Get a relation with all tags and members. - # Returns: - # 0. relation id, - # 1. hash of tags, - # 2. list of members. - - def getrelation(relid) #:doc: - rel = Relation.find(relid) - [relid,rel.tags,rel.members] + # ----- getway_old + # returns old version of way + # in: [0] way id, + # [1] way version to get (or -1 for "last deleted version") + # [2] baselong, [3] basey, [4] masterscale + # does: gets old version of way and all constituent nodes + # for undelete, always uses the most recent version of each node + # (even if it's moved) + # for revert, uses the historic version of each node, but if that node is + # still visible and has been changed since, generates a new node id + # out: [0] 0 (code for success), [1] SWF object name, + # [2] array of points (as getway _except_ [3] is node.visible?, 0 or 1), + # [4] xmin, [5] xmax, [6] ymin, [7] ymax (unprojected bbox), + # [8] way version + def getway_old(args) #:doc: + RAILS_DEFAULT_LOGGER.info(" Message: getway_old (server is #{SERVER_URL})") + # if SERVER_URL=="www.openstreetmap.org" then return -1,"Revert is not currently enabled on the OpenStreetMap server." end + + wayid,version,baselong,basey,masterscale=args + wayid = wayid.to_i + version = version.to_i + xmin = ymin = 999999 + xmax = ymax = -999999 + points=[] + if version<0 + historic=false + version=getlastversion(wayid,version) + else + historic=true + end + readwayquery_old(wayid,version,historic).each { |row| + points<<[long2coord(row['longitude'].to_f,baselong,masterscale),lat2coord(row['latitude'].to_f,basey,masterscale),row['id'].to_i,row['visible'].to_i,tag2array(row['tags'].to_s)] + xmin=[xmin,row['longitude'].to_f].min + xmax=[xmax,row['longitude'].to_f].max + ymin=[ymin,row['latitude' ].to_f].min + ymax=[ymax,row['latitude' ].to_f].max + } + + # get tags from this version + attributes={} + attrlist=ActiveRecord::Base.connection.select_all "SELECT k,v FROM way_tags WHERE id=#{wayid} AND version=#{version}" + attrlist.each {|a| attributes[a['k'].gsub(':','|')]=a['v'] } + attributes['history']="Retrieved from v"+version.to_s + + [0,wayid,points,attributes,xmin,xmax,ymin,ymax,version] end - # Save a relation. - # Returns - # 0. 0 (success), - # 1. original relation id (unchanged), - # 2. new relation id. + # ----- getway_history + # find history of a way + # in: [0] way id + # does: finds history of a way + # out: [0] array of previous versions (where each is + # [0] version, [1] db timestamp (string), + # [2] visible 0 or 1, + # [3] username or 'anonymous' (string)) + def getway_history(args) #:doc: + wayid=args[0] + history=[] + sql=<<-EOF + SELECT version,timestamp,visible,display_name,data_public + FROM ways,users + WHERE ways.id=#{wayid} + AND ways.user_id=users.id + AND ways.visible=1 + ORDER BY version DESC + EOF + histlist=ActiveRecord::Base.connection.select_all(sql) + histlist.each { |row| + if row['data_public'].to_i==1 then user=row['display_name'] else user='anonymous' end + history<<[row['version'],row['timestamp'],row['visible'],user] + } + [history] + end - def putrelation(renumberednodes, renumberedways, usertoken,relid,tags,members,visible) #:doc: - uid=getuserid(usertoken) - if !uid then return -1,"You are not logged in, so the point could not be saved." end + # ----- getrelation + # Get a relation with all of it's tags, and member IDs + # The input is an array with the following components, in order: + # 0. relid - the ID of the relation to get + # + # The output is an array which contains: + # [0] relation id, [1] hash of tags, [2] list of members + def getrelation(args) #:doc: + relid = args[0] + relid = relid.to_i - relid = relid.to_i + RAILS_DEFAULT_LOGGER.info(" Message: getrel, id=#{relid}") + + rel = Relation.find(relid) + + [relid,rel.tags,rel.members]#nodes,ways] + end + + # ----- getrelation + # save relation to the database + # in: [0] user token (string), + # [1] original relation id (may be negative), + # [2] hash of tags, [3] list of members, + # [4] visible + # out: [0] 0 (success), [1] original relation id (unchanged), + # [2] new relation id + def putrelation(args, renumberednodes, renumberedways) #:doc: + usertoken,relid,tags,members,visible=args + uid=getuserid(usertoken) + if !uid then return -1,"You are not logged in, so the point could not be saved." end + + relid = relid.to_i visible = visible.to_i # create a new relation, or find the existing one - if relid <= 0 - rel = Relation.new - else - rel = Relation.find(relid) - end + if relid <= 0 + rel = Relation.new + else + rel = Relation.find(relid) + end - # check the members are all positive, and correctly type - typedmembers = [] - members.each do |m| - mid = m[1].to_i - if mid < 0 - mid = renumberednodes[mid] if m[0] == 'node' - mid = renumberedways[mid] if m[0] == 'way' - if mid < 0 - return -2, "Negative ID unresolved" - end - end - typedmembers << [m[0], mid, m[2]] - end + # check the members are all positive, and correctly type + typedmembers = [] + members.each do |m| + mid = m[1].to_i + if mid < 0 + mid = renumberednodes[mid] if m[0] == 'node' + mid = renumberedways[mid] if m[0] == 'way' + if mid < 0 + return -2, "Negative ID unresolved" + end + end + typedmembers << [m[0], mid, m[2]] + end # assign new contents rel.members = typedmembers @@ -251,297 +336,491 @@ class AmfController < ApplicationController rel.visible = visible rel.user_id = uid - # check it then save it - # BUG: the following is commented out because it always fails on my - # install. I think it's a Rails bug. + # check it then save it + # BUG: the following is commented out because it always fails on my + # install. I think it's a Rails bug. - #if !rel.preconditions_ok? - # return -2, "Relation preconditions failed" - #else - rel.save_with_history! - #end + #if !rel.preconditions_ok? + # return -2, "Relation preconditions failed" + #else + rel.save_with_history! + #end - [0,relid,rel.id] + [0,relid,rel.id] end - # Save a way to the database, including all nodes. Any nodes in the previous - # version and no longer used are deleted. - # - # Returns: - # 0. '0' (code for success), - # 1. original way id (unchanged), - # 2. new way id, - # 3. hash of renumbered nodes (old id=>new id) + # ----- putway + # saves a way to the database + # in: [0] user token (string), + # [1] original way id (may be negative), + # [2] array of points (as getway/getway_old), + # [3] hash of way tags, + # [4] original way version (0 if not a reverted/undeleted way), + # [5] baselong, [6] basey, [7] masterscale + # does: saves way to the database + # all constituent nodes are created/updated as necessary + # (or deleted if they were in the old version and are otherwise unused) + # out: [0] 0 (code for success), [1] original way id (unchanged), + # [2] new way id, [3] hash of renumbered nodes (old id=>new id), + # [4] xmin, [5] xmax, [6] ymin, [7] ymax (unprojected bbox) + def putway(args,renumberednodes) #:doc: + RAILS_DEFAULT_LOGGER.info(" putway started") + usertoken,originalway,points,attributes,oldversion,baselong,basey,masterscale=args + uid=getuserid(usertoken) + if !uid then return -1,"You are not logged in, so the way could not be saved." end - def putway(renumberednodes,usertoken,originalway,points,attributes) #:doc: + RAILS_DEFAULT_LOGGER.info(" putway authenticated happily") + db_uqn='unin'+(rand*100).to_i.to_s+uid.to_s+originalway.to_i.abs.to_s+Time.new.to_i.to_s # temp uniquenodes table name, typically 51 chars + db_now='@now'+(rand*100).to_i.to_s+uid.to_s+originalway.to_i.abs.to_s+Time.new.to_i.to_s # 'now' variable name, typically 51 chars + ActiveRecord::Base.connection.execute("SET #{db_now}=NOW()") + originalway=originalway.to_i + oldversion=oldversion.to_i - # -- Initialise and carry out checks - - uid=getuserid(usertoken) - if !uid then return -1,"You are not logged in, so the way could not be saved." end - originalway=originalway.to_i + RAILS_DEFAULT_LOGGER.info(" Message: putway, id=#{originalway}") - points.each do |a| - if a[2]==0 or a[2].nil? then return -2,"Server error - node with id 0 found in way #{originalway}." end - if a[1]==90 then return -2,"Server error - node with lat -90 found in way #{originalway}." end - end + # -- Check for null IDs, short ways or lats=90 - if points.length<2 then return -2,"Server error - way is only #{points.length} points long." end + points.each do |a| + if a[2]==0 or a[2].nil? then return -2,"Server error - node with id 0 found in way #{originalway}." end + if coord2lat(a[1],masterscale,basey)==90 then return -2,"Server error - node with lat -90 found in way #{originalway}." end + end + + if points.length<2 then return -2,"Server error - way is only #{points.length} points long." end - # -- Get unique nodes + # -- 3. read original way into memory - if originalway<0 - way=Way.new - uniques=[] - else - way=Way.find(originalway) - uniques=way.unique_nodes - end + xc={}; yc={}; tagc={}; vc={} + if originalway>0 + way=originalway + if oldversion==0 then r=readwayquery(way,false) + else r=readwayquery_old(way,oldversion,true) end + r.each { |row| + id=row['id'].to_i + if (id>0) then + xc[id]=row['longitude'].to_f + yc[id]=row['latitude' ].to_f + tagc[id]=row['tags'] + vc[id]=row['visible'].to_i + end + } + ActiveRecord::Base.connection.update("UPDATE current_ways SET timestamp=#{db_now},user_id=#{uid},visible=1 WHERE id=#{way}") + else + way=ActiveRecord::Base.connection.insert("INSERT INTO current_ways (user_id,timestamp,visible) VALUES (#{uid},#{db_now},1)") + end - # -- Compare nodes and save changes to any that have changed + # -- 4. get version by inserting new row into ways - nodes=[] + version=ActiveRecord::Base.connection.insert("INSERT INTO ways (id,user_id,timestamp,visible) VALUES (#{way},#{uid},#{db_now},1)") - points.each do |n| - lon=n[0].to_f - lat=n[1].to_f - id =n[2].to_i - savenode=false - if renumberednodes[id] - id=renumberednodes[id] - elsif id<0 - # Create new node - node=Node.new - savenode=true - else - node=Node.find(id) - if (!fpcomp(lat,node.lat) or !fpcomp(lon,node.lon) or \ - Tags.join(n[4])!=node.tags or node.visible==0) - savenode=true + # -- 5. compare nodes and update xmin,xmax,ymin,ymax + + xmin=ymin= 999999 + xmax=ymax=-999999 + insertsql='' + nodelist=[] + + points.each_index do |i| + xs=coord2long(points[i][0],masterscale,baselong) + ys=coord2lat(points[i][1],masterscale,basey) + xmin=[xs,xmin].min; xmax=[xs,xmax].max + ymin=[ys,ymin].min; ymax=[ys,ymax].max + node=points[i][2].to_i + tagstr=array2tag(points[i][4]) + tagsql="'"+sqlescape(tagstr)+"'" + lat=(ys * 10000000).round + long=(xs * 10000000).round + tile=QuadTile.tile_for_point(ys, xs) + + # compare node + if node<0 + # new node - create + if renumberednodes[node.to_s].nil? + newnode=ActiveRecord::Base.connection.insert("INSERT INTO current_nodes ( latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES ( #{lat},#{long},#{db_now},#{uid},1,#{tagsql},#{tile})") + ActiveRecord::Base.connection.insert("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{newnode},#{lat},#{long},#{db_now},#{uid},1,#{tagsql},#{tile})") + points[i][2]=newnode + nodelist.push(newnode) + renumberednodes[node.to_s]=newnode.to_s + else + points[i][2]=renumberednodes[node.to_s].to_i + end + + elsif xc.has_key?(node) + nodelist.push(node) + # old node from original way - update + if ((xs/0.0000001).round!=(xc[node]/0.0000001).round or (ys/0.0000001).round!=(yc[node]/0.0000001).round or tagstr!=tagc[node] or vc[node]==0) + ActiveRecord::Base.connection.insert("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{node},#{lat},#{long},#{db_now},#{uid},1,#{tagsql},#{tile})") + ActiveRecord::Base.connection.update("UPDATE current_nodes SET latitude=#{lat},longitude=#{long},timestamp=#{db_now},user_id=#{uid},tags=#{tagsql},visible=1,tile=#{tile} WHERE id=#{node}") + end + else + # old node, created in another way and now added to this way + end + end + + # -- 6a. delete any nodes not in modified way + + createuniquenodes(way,db_uqn,nodelist) # nodes which appear in this way but no other + + sql=<<-EOF + INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tile) + SELECT DISTINCT cn.id,cn.latitude,cn.longitude,#{db_now},#{uid},0,cn.tile + FROM current_nodes AS cn,#{db_uqn} + WHERE cn.id=node_id + EOF + ActiveRecord::Base.connection.insert(sql) + + sql=<<-EOF + UPDATE current_nodes AS cn, #{db_uqn} + SET cn.timestamp=#{db_now},cn.visible=0,cn.user_id=#{uid} + WHERE cn.id=node_id + EOF + ActiveRecord::Base.connection.update(sql) + + deleteuniquenoderelations(db_uqn,uid,db_now) + ActiveRecord::Base.connection.execute("DROP TEMPORARY TABLE #{db_uqn}") + + # 6b. insert new version of route into way_nodes + + insertsql ='' + currentsql='' + sequence =1 + points.each do |p| + if insertsql !='' then insertsql +=',' end + if currentsql!='' then currentsql+=',' end + insertsql +="(#{way},#{p[2]},#{sequence},#{version})" + currentsql+="(#{way},#{p[2]},#{sequence})" + sequence +=1 + end + + ActiveRecord::Base.connection.execute("DELETE FROM current_way_nodes WHERE id=#{way}"); + ActiveRecord::Base.connection.insert( "INSERT INTO way_nodes (id,node_id,sequence_id,version) VALUES #{insertsql}"); + ActiveRecord::Base.connection.insert( "INSERT INTO current_way_nodes (id,node_id,sequence_id ) VALUES #{currentsql}"); + + # -- 7. insert new way tags + + insertsql ='' + currentsql='' + attributes.each do |k,v| + if v=='' or v.nil? then next end + if v[0,6]=='(type ' then next end + if insertsql !='' then insertsql +=',' end + if currentsql!='' then currentsql+=',' end + insertsql +="(#{way},'"+sqlescape(k.gsub('|',':'))+"','"+sqlescape(v)+"',#{version})" + currentsql+="(#{way},'"+sqlescape(k.gsub('|',':'))+"','"+sqlescape(v)+"')" + end + + ActiveRecord::Base.connection.execute("DELETE FROM current_way_tags WHERE id=#{way}") + if (insertsql !='') then ActiveRecord::Base.connection.insert("INSERT INTO way_tags (id,k,v,version) VALUES #{insertsql}" ) end + if (currentsql!='') then ActiveRecord::Base.connection.insert("INSERT INTO current_way_tags (id,k,v) VALUES #{currentsql}") end + + [0,originalway,way,renumberednodes,xmin,xmax,ymin,ymax] + end + + # ----- putpoi + # save POI to the database + # in: [0] user token (string), + # [1] original node id (may be negative), + # [2] projected longitude, [3] projected latitude, + # [4] hash of tags, [5] visible (0 to delete, 1 otherwise), + # [6] baselong, [7] basey, [8] masterscale + # does: saves POI node to the database + # refuses save if the node has since become part of a way + # out: [0] 0 (success), [1] original node id (unchanged), + # [2] new node id + def putpoi(args) #:doc: + usertoken,id,x,y,tags,visible,baselong,basey,masterscale=args + uid=getuserid(usertoken) + if !uid then return -1,"You are not logged in, so the point could not be saved." end + + db_now='@now'+(rand*100).to_i.to_s+uid.to_s+id.to_i.abs.to_s+Time.new.to_i.to_s # 'now' variable name, typically 51 chars + ActiveRecord::Base.connection.execute("SET #{db_now}=NOW()") + + id=id.to_i + visible=visible.to_i + if visible==0 then + # if deleting, check node hasn't become part of a way + inway=ActiveRecord::Base.connection.select_one("SELECT cw.id FROM current_ways cw,current_way_nodes cwn WHERE cw.id=cwn.id AND cw.visible=1 AND cwn.node_id=#{id} LIMIT 1") + unless inway.nil? then return -1,"The point has since become part of a way, so you cannot save it as a POI." end + deleteitemrelations(id,'node',uid,db_now) + end + + x=coord2long(x.to_f,masterscale,baselong) + y=coord2lat(y.to_f,masterscale,basey) + tagsql="'"+sqlescape(array2tag(tags))+"'" + lat=(y * 10000000).round + long=(x * 10000000).round + tile=QuadTile.tile_for_point(y, x) + + if (id>0) then + ActiveRecord::Base.connection.insert("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{id},#{lat},#{long},#{db_now},#{uid},#{visible},#{tagsql},#{tile})"); + ActiveRecord::Base.connection.update("UPDATE current_nodes SET latitude=#{lat},longitude=#{long},timestamp=#{db_now},user_id=#{uid},visible=#{visible},tags=#{tagsql},tile=#{tile} WHERE id=#{id}"); + newid=id + else + newid=ActiveRecord::Base.connection.insert("INSERT INTO current_nodes (latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{lat},#{long},#{db_now},#{uid},#{visible},#{tagsql},#{tile})"); + ActiveRecord::Base.connection.update("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{newid},#{lat},#{long},#{db_now},#{uid},#{visible},#{tagsql},#{tile})"); + end + [0,id,newid] + end + + # ----- getpoi + # read POI from database + # (only called on revert: POIs are usually read by whichways) + # in: [0] node id, [1] baselong, [2] basey, [3] masterscale + # does: reads POI + # out: [0] id (unchanged), [1] projected long, [2] projected lat, + # [3] hash of tags + def getpoi(args) #:doc: + id,baselong,basey,masterscale = args + + n = Node.find(id.to_i) + if n + return [n.id, n.lon_potlatch(baselong,masterscale), n.lat_potlatch(basey,masterscale), n.tags_as_hash] + else + return [nil,nil,nil,''] + end + end + + # ----- deleteway + # delete way and constituent nodes from database + # in: [0] user token (string), [1] way id + # does: deletes way from db and any constituent nodes not used elsewhere + # also removes ways/nodes from any relations they're in + # out: [0] 0 (success), [1] way id (unchanged) + + def deleteway(args) #:doc: + usertoken,way_id=args + RAILS_DEFAULT_LOGGER.info(" Message: deleteway, id=#{way_id}") + uid=getuserid(usertoken) + if !uid then return -1,"You are not logged in, so the way could not be deleted." end + + # FIXME + # the next bit removes the way from any relations + # the delete_with_relations_and_nodes_and_history method should do this, + # but at present it just throws a 'precondition failed' + way=way.to_i + db_now='@now'+(rand*100).to_i.to_s+uid.to_s+way.abs.to_s+Time.new.to_i.to_s + db_uqn='unin'+(rand*100).to_i.to_s+uid.to_s+way.abs.to_s+Time.new.to_i.to_s + ActiveRecord::Base.connection.execute("SET #{db_now}=NOW()") + createuniquenodes(way,db_uqn,[]) + deleteuniquenoderelations(db_uqn,uid,db_now) + deleteitemrelations(way_id,'way',uid,db_now) + ActiveRecord::Base.connection.execute("DROP TEMPORARY TABLE #{db_uqn}") + # end of FIXME + + # now delete the way + user = User.find(uid) + way = Way.find(way_id) + way.delete_with_relations_and_nodes_and_history(user) + return [0,way_id] + end + + + def readwayquery(id,insistonvisible) #:doc: + sql=<<-EOF + SELECT latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,current_nodes.id,tags,visible + FROM current_way_nodes,current_nodes + WHERE current_way_nodes.id=#{id} + AND current_way_nodes.node_id=current_nodes.id + EOF + if insistonvisible then sql+=" AND current_nodes.visible=1 " end + sql+=" ORDER BY sequence_id" + ActiveRecord::Base.connection.select_all(sql) + end + + # Get the latest version id of a way + def getlastversion(id,version) #:doc: + old_way = OldWay.find(:first, :conditions => ['visible=1 AND id=?' , id], :order => 'version DESC') + old_way.version + end + + def readwayquery_old(id,version,historic) #:doc: + # Node handling on undelete (historic=false): + # - always use the node specified, even if it's moved + + # Node handling on revert (historic=true): + # - if it's a visible node, use a new node id (i.e. not mucking up the old one) + # which means the SWF needs to allocate new ids + # - if it's an invisible node, we can reuse the old node id + + # ----- get node list from specified version of way, + # and the _current_ lat/long/tags of each node + + row=ActiveRecord::Base.connection.select_one("SELECT timestamp FROM ways WHERE version=#{version} AND id=#{id}") + waytime=row['timestamp'] + + sql=<<-EOF + SELECT cn.id,visible,latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,tags + FROM way_nodes wn,current_nodes cn + WHERE wn.version=#{version} + AND wn.id=#{id} + AND wn.node_id=cn.id + ORDER BY sequence_id + EOF + rows=ActiveRecord::Base.connection.select_all(sql) + + # ----- if historic (full revert), get the old version of each node + # - if it's in another way now, generate a new id + # - if it's not in another way, use the old ID + + if historic then + rows.each_index do |i| + sql=<<-EOF + SELECT latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,tags,cwn.id AS currentway + FROM nodes n + LEFT JOIN current_way_nodes cwn + ON cwn.node_id=n.id AND cwn.id!=#{id} + WHERE n.id=#{rows[i]['id']} + AND n.timestamp<="#{waytime}" + ORDER BY n.timestamp DESC + LIMIT 1 + EOF + row=ActiveRecord::Base.connection.select_one(sql) + nx=row['longitude'].to_f + ny=row['latitude'].to_f + if (!row.nil?) + if (row['currentway'] && (nx!=rows[i]['longitude'].to_f or ny!=rows[i]['latitude'].to_f or row['tags']!=rows[i]['tags'])) then rows[i]['id']=-1 end end - end - if savenode - node.user_id=uid - node.lat=lat; node.lon=lon - node.tags=Tags.join(n[4]) - node.visible=true - node.save_with_history! - if id!=node.id - renumberednodes[id]=node.id - id=node.id - end - end - uniques=uniques-[id] - nodes.push(id) - end - - # -- Delete any unique nodes - - uniques.each do |n| - deleteitemrelations(n,'node') - node=Node.find(n) - node.user_id=uid - node.visible=false - node.save_with_history! - end - - # -- Save revised way - - way.tags=attributes - way.nds=nodes - way.user_id=uid - way.visible=true - way.save_with_history! - - [0,originalway,way.id,renumberednodes] + rows[i]['longitude']=nx + rows[i]['latitude' ]=ny + rows[i]['tags' ]=row['tags'] + end + end + rows end - # Save POI to the database. - # Refuses save if the node has since become part of a way. - # Returns: - # 0. 0 (success), - # 1. original node id (unchanged), - # 2. new node id. - - def putpoi(usertoken,id,lon,lat,tags,visible) #:doc: - uid=getuserid(usertoken) - if !uid then return -1,"You are not logged in, so the point could not be saved." end - - id=id.to_i - visible=(visible.to_i==1) - - if (id>0) then - node=Node.find(id) - if !visible then - unless node.ways.empty? then return -1,"The point has since become part of a way, so you cannot save it as a POI." end - deleteitemrelations(id,'node') - end - else - node=Node.new - end - - node.user_id = uid - node.latitude = (lat*10000000).round - node.longitude = (lon*10000000).round - node.tags = Tags.join(tags) - node.visible=visible - node.save_with_history! - newid=node.id - [0,id,newid] + def createuniquenodes(way,uqn_name,nodelist) #:doc: + # Find nodes which appear in this way but no others + sql=<<-EOF + CREATE TEMPORARY TABLE #{uqn_name} + SELECT a.node_id + FROM (SELECT DISTINCT node_id FROM current_way_nodes + WHERE id=#{way}) a + LEFT JOIN current_way_nodes b + ON b.node_id=a.node_id + AND b.id!=#{way} + WHERE b.node_id IS NULL + EOF + unless nodelist.empty? then + sql+="AND a.node_id NOT IN ("+nodelist.join(',')+")" + end + ActiveRecord::Base.connection.execute(sql) end - # Read POI from database - # (only called on revert: POIs are usually read by whichways). - # - # Returns array of id, long, lat, hash of tags. - - def getpoi(id) #:doc: - n = Node.find(id) - if n - return [n.id, n.lon, n.lat, n.tags_as_hash] - else - return [nil,nil,nil,''] - end - end - - # Delete way and all constituent nodes. Also removes from any relations. - # Returns 0 (success), unchanged way id. - - def deleteway(usertoken,way_id) #:doc: - uid=getuserid(usertoken) - if !uid then return -1,"You are not logged in, so the way could not be deleted." end - - # FIXME: would be good not to make two history entries when removing - # two nodes from the same relation - user = User.find(uid) - way = Way.find(way_id) - way.unique_nodes.each do |n| - deleteitemrelations(n,'node') - end - - way.delete_with_relations_and_nodes_and_history(user) - return [0,way_id] - end # ==================================================================== - # Support functions + # Relations handling + # deleteuniquenoderelations(uqn_name,uid,db_now) + # deleteitemrelations(way|node,'way'|'node',uid,db_now) - # Remove a node or way from all relations + def deleteuniquenoderelations(uqn_name,uid,db_now) #:doc: + sql=<<-EOF + SELECT node_id,cr.id FROM #{uqn_name},current_relation_members crm,current_relations cr + WHERE crm.member_id=node_id + AND crm.member_type='node' + AND crm.id=cr.id + AND cr.visible=1 + EOF - def deleteitemrelations(objid,type) #:doc: - relationids = RelationMember.find(:all, :conditions => ['member_type=? and member_id=?', type, objid]).collect { |ws| ws.id }.uniq - relationids.each do |relid| - rel=Relation.find(relid) - rel.members.delete_if {|x| x[0]==type and x[1]==objid} - rel.save_with_history! - end + relnodes=ActiveRecord::Base.connection.select_all(sql) + relnodes.each do |a| + removefromrelation(a['node_id'],'node',a['id'],uid,db_now) + end end - # Break out node tags into a hash - # (should become obsolete as of API 0.6) + def deleteitemrelations(objid,type,uid,db_now) #:doc: + sql=<<-EOF + SELECT cr.id FROM current_relation_members crm,current_relations cr + WHERE crm.member_id=#{objid} + AND crm.member_type='#{type}' + AND crm.id=cr.id + AND cr.visible=1 + EOF - def tagstring_to_hash(a) #:doc: - tags={} - Tags.split(a) do |k, v| - tags[k]=v - end - tags + relways=ActiveRecord::Base.connection.select_all(sql) + relways.each do |a| + removefromrelation(objid,type,a['id'],uid,db_now) + end end - # Authenticate token - # (could be removed if no-one uses the username+password form) + def removefromrelation(objid,type,relation,uid,db_now) #:doc: + rver=ActiveRecord::Base.connection.insert("INSERT INTO relations (id,user_id,timestamp,visible) VALUES (#{relation},#{uid},#{db_now},1)") + + tagsql=<<-EOF + INSERT INTO relation_tags (id,k,v,version) + SELECT id,k,v,#{rver} FROM current_relation_tags + WHERE id=#{relation} + EOF + ActiveRecord::Base.connection.insert(tagsql) + + membersql=<<-EOF + INSERT INTO relation_members (id,member_type,member_id,member_role,version) + SELECT id,member_type,member_id,member_role,#{rver} FROM current_relation_members + WHERE id=#{relation} + AND (member_id!=#{objid} OR member_type!='#{type}') + EOF + ActiveRecord::Base.connection.insert(membersql) + + ActiveRecord::Base.connection.update("UPDATE current_relations SET user_id=#{uid},timestamp=#{db_now} WHERE id=#{relation}") + ActiveRecord::Base.connection.execute("DELETE FROM current_relation_members WHERE id=#{relation} AND member_type='#{type}' AND member_id=#{objid}") + end + + def sqlescape(a) #:doc: + a.gsub(/[\000-\037]/,"").gsub("'","''").gsub(92.chr) {92.chr+92.chr} + end + + def tag2array(a) #:doc: + tags={} + Tags.split(a) do |k, v| + tags[k.gsub(':','|')]=v + end + tags + end + + def array2tag(a) #:doc: + tags = [] + a.each do |k,v| + if v=='' then next end + if v[0,6]=='(type ' then next end + tags << [k.gsub('|',':'), v] + end + return Tags.join(tags) + end def getuserid(token) #:doc: - if (token =~ /^(.+)\+(.+)$/) then - user = User.authenticate(:username => $1, :password => $2) - else - user = User.authenticate(:token => token) - end + if (token =~ /^(.+)\+(.+)$/) then + user = User.authenticate(:username => $1, :password => $2) + else + user = User.authenticate(:token => token) + end - return user ? user.id : nil; + return user ? user.id : nil; end - # Compare two floating-point numbers to within 0.0000001 - - def fpcomp(a,b) #:doc: - return ((a/0.0000001).round==(b/0.0000001).round) - end - - # ==================================================================== - # Alternative SQL queries for getway/whichways + # Co-ordinate conversion - def sql_find_way_ids_in_area(xmin,ymin,xmax,ymax) - sql=<<-EOF - SELECT DISTINCT current_way_nodes.id AS wayid - FROM current_way_nodes - INNER JOIN current_nodes ON current_nodes.id=current_way_nodes.node_id - INNER JOIN current_ways ON current_ways.id =current_way_nodes.id - WHERE current_nodes.visible=1 - AND current_ways.visible=1 - AND #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "current_nodes.")} - EOF - return ActiveRecord::Base.connection.select_all(sql).collect { |a| a['wayid'].to_i } + def lat2coord(a,basey,masterscale) #:doc: + -(lat2y(a)-basey)*masterscale end - - def sql_find_pois_in_area(xmin,ymin,xmax,ymax) - sql=<<-EOF - SELECT current_nodes.id,current_nodes.latitude*0.0000001 AS lat,current_nodes.longitude*0.0000001 AS lon,current_nodes.tags - FROM current_nodes - LEFT OUTER JOIN current_way_nodes cwn ON cwn.node_id=current_nodes.id - WHERE current_nodes.visible=1 - AND cwn.id IS NULL - AND #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "current_nodes.")} - EOF - return ActiveRecord::Base.connection.select_all(sql).collect { |n| [n['id'].to_i,n['lon'].to_f,n['lat'].to_f,tagstring_to_hash(n['tags'])] } + + def long2coord(a,baselong,masterscale) #:doc: + (a-baselong)*masterscale end - - def sql_find_relations_in_area_and_ways(xmin,ymin,xmax,ymax,way_ids) - # ** It would be more Potlatchy to get relations for nodes within ways - # during 'getway', not here - sql=<<-EOF - SELECT DISTINCT cr.id AS relid - FROM current_relations cr - INNER JOIN current_relation_members crm ON crm.id=cr.id - INNER JOIN current_nodes cn ON crm.member_id=cn.id AND crm.member_type='node' - WHERE #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "cn.")} - EOF - unless way_ids.empty? - sql+=<<-EOF - UNION - SELECT DISTINCT cr.id AS relid - FROM current_relations cr - INNER JOIN current_relation_members crm ON crm.id=cr.id - WHERE crm.member_type='way' - AND crm.member_id IN (#{way_ids.join(',')}) - EOF - end - return ActiveRecord::Base.connection.select_all(sql).collect { |a| a['relid'].to_i }.uniq + + def lat2y(a) #:doc: + 180/Math::PI * Math.log(Math.tan(Math::PI/4+a*(Math::PI/180)/2)) end - - def sql_get_nodes_in_way(wayid) - points=[] - sql=<<-EOF - SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,current_nodes.id,tags - FROM current_way_nodes,current_nodes - WHERE current_way_nodes.id=#{wayid.to_i} - AND current_way_nodes.node_id=current_nodes.id - AND current_nodes.visible=1 - ORDER BY sequence_id - EOF - ActiveRecord::Base.connection.select_all(sql).each do |row| - points << [row['lon'].to_f,row['lat'].to_f,row['id'].to_i,nil,tagstring_to_hash(row['tags'])] - end - points + + def coord2lat(a,masterscale,basey) #:doc: + y2lat(a/-masterscale+basey) end - - def sql_get_tags_in_way(wayid) - tags={} - ActiveRecord::Base.connection.select_all("SELECT k,v FROM current_way_tags WHERE id=#{wayid.to_i}").each do |row| - tags[row['k']]=row['v'] - end - tags + + def coord2long(a,masterscale,baselong) #:doc: + a/masterscale+baselong + end + + def y2lat(a) + 180/Math::PI * (2*Math.atan(Math.exp(a*Math::PI/180))-Math::PI/2) end end diff --git a/app/models/node.rb b/app/models/node.rb index d61293e82..abfa44d67 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -20,10 +20,6 @@ class Node < ActiveRecord::Base has_many :containing_relation_members, :class_name => "RelationMember", :as => :member has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation, :extend => ObjectFinder - # Atomic undelete support - has_many :old_way_nodes - has_many :ways_via_history, :class_name=> "Way", :through => :old_way_nodes, :source => :way - # Sanity check the latitude and longitude and add an error if it's broken def validate_position errors.add_to_base("Node is not in the world") unless in_world? diff --git a/app/models/old_way.rb b/app/models/old_way.rb index 63265d6bf..1abb23bbb 100644 --- a/app/models/old_way.rb +++ b/app/models/old_way.rb @@ -110,35 +110,6 @@ class OldWay < ActiveRecord::Base return el1 end - # Read full version of old way - # For get_nodes_undelete, uses same nodes, even if they've moved since - # For get_nodes_revert, allocates new ids - # Currently returns Potlatch-style array - - def get_nodes_undelete - points = [] - self.nds.each do |n| - node=Node.find(n) - points << [node.lon, node.lat, n, node.visible ? 1 : 0, node.tags_as_hash] - end - points - end - - def get_nodes_revert - points=[] - self.nds.each do |n| - oldnode=OldNode.find(:first, :conditions=>['id=? AND timestamp<=?',n,self.timestamp], :order=>"timestamp DESC") - curnode=Node.find(n) - id=n; v=curnode.visible ? 1 : 0 - if oldnode.lat!=curnode.lat or oldnode.lon!=curnode.lon or oldnode.tags!=curnode.tags then - # node has changed: if it's in other ways, give it a new id - if curnode.ways-[self.id] then id=-1; v=nil end - end - points << [oldnode.lon, oldnode.lat, id, v, oldnode.tags_as_hash] - end - points - end - # Temporary method to match interface to nodes def tags_as_hash return self.tags diff --git a/app/models/old_way_node.rb b/app/models/old_way_node.rb index a6e65da85..85a6f3c1c 100644 --- a/app/models/old_way_node.rb +++ b/app/models/old_way_node.rb @@ -2,7 +2,4 @@ class OldWayNode < ActiveRecord::Base set_table_name 'way_nodes' set_primary_keys :id, :version, :sequence_id - - # Atomic undelete support - belongs_to :way, :foreign_key=> :id end diff --git a/app/models/way.rb b/app/models/way.rb index 59988d88b..64b11cf67 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -236,7 +236,13 @@ class Way < ActiveRecord::Base # delete a way and it's nodes that aren't part of other ways, with history def delete_with_relations_and_nodes_and_history(user) - node_ids_to_delete = self.unique_nodes + node_ids = self.nodes.collect {|node| node.id } + node_ids_not_to_delete = [] + way_nodes = WayNode.find(:all, :conditions => "node_id in (#{node_ids.join(',')}) and id != #{self.id}") + + node_ids_not_to_delete = way_nodes.collect {|way_node| way_node.node_id} + + node_ids_to_delete = node_ids - node_ids_not_to_delete # delete the nodes not used by other ways node_ids_to_delete.each do |node_id| @@ -252,16 +258,6 @@ class Way < ActiveRecord::Base end - # Find nodes that belong to this way only - def unique_nodes - node_ids = self.nodes.collect {|node| node.id } - if node_ids.length==0 then return [] end - node_ids_in_other_ways = [] - way_nodes = WayNode.find(:all, :conditions => "node_id in (#{node_ids.join(',')}) and id != #{self.id}") - node_ids_in_other_ways = way_nodes.collect {|way_node| way_node.node_id} - return node_ids - node_ids_in_other_ways - end - # Temporary method to match interface to nodes def tags_as_hash return self.tags diff --git a/app/views/site/edit.rhtml b/app/views/site/edit.rhtml index 9c3c78fda..a3896bc48 100644 --- a/app/views/site/edit.rhtml +++ b/app/views/site/edit.rhtml @@ -65,9 +65,9 @@ fo.addVariable('token','<%= session[:token] %>'); if (lat) { fo.addVariable('lat',lat); } if (lon) { fo.addVariable('long',lon); } - <% if params['gpx'] %>fo.addVariable('gpx' ,'<%= h(params['gpx'] ) %>');<% end %> - <% if params['way'] %>fo.addVariable('way' ,'<%= h(params['way'] ) %>');<% end %> - <% if params['node'] %>fo.addVariable('node','<%= h(params['node']) %>');<% end %> + <% if params['gpx'] %> + fo.addVariable('gpx','<%= h(params['gpx']) %>'); + <% end %> fo.write("map"); } diff --git a/config/environment.rb b/config/environment.rb index 6cf8b261d..495f94d80 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -78,6 +78,4 @@ end # This has to be after the above block for some reason (doesnt pull in /lib/osm.rb?) POTLATCH_PRESETS = Potlatch::Potlatch.get_presets() -# Use SQL (faster) or Rails (more elegant) for common Potlatch reads -# getway speedup is approximately x2, whichways approximately x7 -POTLATCH_USE_SQL = true + diff --git a/config/potlatch/localised.yaml b/config/potlatch/localised.yaml deleted file mode 100644 index f61bdc18a..000000000 --- a/config/potlatch/localised.yaml +++ /dev/null @@ -1,621 +0,0 @@ -a_poi: - "de": $1 einen Ort von Interesse (POI) - "hu": POI $1 -a_way: - "de": $1 einen Weg - "hu": Út $1 -action_addpoint: - "de": Am Ende des Wegs Punkt hinzufügen - "es": Añadir un punto al final de una vía - "fi": pisteen lisääminen tien perään - "fr": Ajout d'un point à la fin d'un chemin - "hu": pont hozzáadása az út végéhez - "no": adding a node to the end of a way - "ru": добавить точку в конец пути - "sv": lägger till en punkt på slutet av en väg -action_cancelchanges: - "de": Änderungen an $1 abgebrochen - "es": Cancelar cambios - "fi": peruutetaan muutokset - "fr": annulation de la modification - "hu": cancelling changes to - "no": cancelling changes to - "ru": отмена изменений к - "sv": avbryter ändringar på -action_createpoi: - "de": Einen Ort von Interesse (POI) erstellen - "es": Crear un punto de interés (POI) - "fi": "POI:n lisääminen" - "fr": créer un POI (point d'intérêt) - "hu": POI készítése - "no": lage et POI (interessant punkt) - "ru": создаю точку интереса(POI) - "sv": Skapa en POI, "punk av intresse" -action_deletepoint: - "de": Punkt löschen - "es": Borrar un punto - "fi": pisteen poistaminen - "fr": suppression d'un point - "hu": pont törlése - "no": deleting a point - "ru": удаляю узел - "sv": Tar bort en punkt -action_insertnode: - "de": Punkt auf Weg hinzufügen - "es": Añadir un punto a una vía - "fi": pisteen lisääminen tiehen - "fr": Ajouter un point sur un chemin - "hu": pont hozzáadása úthoz - "no": adding a node into a way - "ru": добавляю узел в путь - "sv": läggertill en punkt till en väg -action_mergeways: - "de": Zwei Wege verschmelzen - "es": Combinar dos vías - "fi": kahden tien yhdistäminen - "fr": Joindre deux chemins - "hu": két út egyesítése - "no": slår sammen to veier - "ru": соединяю два пути - "sv": Slåsamman två vägar -action_movepoi: - "de": Ort von Interesse (POI) verschieben - "es": Mover un punto de interés (POI) - "fi": "POI:n siirtäminen" - "fr": déplacer un POI - "hu": POI mozgatása - "no": flytter et POI (interessant punkt) - "ru": перемещаю точку интереса(POI) - "sv": Flytta på en POI, "punkt av intresse" -action_movepoint: - "de": Punkt verschieben - "es": Mover un punto - "fi": pisteen lisääminen - "fr": déplacer un point - "hu": pont mozgatása - "no": flytter punkt - "ru": перемещаю точку - "sv": Flytta en punkt -action_moveway: - "de": einen Weg verschieben - "hu": út mozgatása -action_pointtags: - "de": Attribute (Tags) für Punkt zuweisen - "es": Parámetros (tags) un punto - "fi": pisteen tagien asettaminen - "fr": Paramétrer un point - "hu": setting tags on a point - "no": setting tags on a point - "ru": установка тегов для точки - "sv": lägger till tagger på en punkt -action_poitags: - "de": Attribute (Tags) für Ort von Interesse (POI) zuweisen - "es": Parámetros (tags) en un punto de interés (POI) - "fi": "POI:n tagien asettaminen" - "fr": Paramétrer un POI - "hu": setting tags on a POI - "no": setting tags on a POI - "ru": установка тегов для точки интереса (POI) - "sv": lägger till tagger på en POI -action_reverseway: - "de": Wegrichtung umkehren - "es": Invertir dirección de una vía - "fi": tien kääntäminen - "fr": Inverser le sens du chemin - "hu": út megfordítása - "no": reversing a way - "ru": ищменение направления пути - "sv": Byter rikting på en väg -action_splitway: - "de": Weg teilen - "es": Dividir una vía - "fi": tien katkaisu - "fr": Scinder un chemin - "hu": út kettévágása - "no": splitting a way - "ru": разбиваю путь - "sv": delar upp en väg -action_waytags: - "de": Attribute (Tags) für Weg zuweisen - "es": Parámetros (tags) en una vía - "fi": tien tagian asettaminen - "fr": Paramétrer un chemin - "hu": setting tags on a way - "no": setting tags on a way - "ru": установка тегов для путиs - "sv": lägger till tagger på en väg -add: - "de": Hinzufügen - "es": Añadir - "fi": Lisää - "fr": Ajouter - "hu": Hozzáadás - "no": Add - "ru": Добавить - "sv": Läggtill -cancel: - "de": Abbrechen - "es": Cancelar - "fi": Peru - "fr": Annuler - "hu": Mégse - "no": Avbryt - "ru": Отмена - "sv": Avbryt -createrelation: - "de": Eine neue Relation erstellen - "es": Crear una nueva relación - "fi": Luo uusi relaatio - "fr": Créer une nouvelle relation - "hu": Új kapcsolat létrehozása - "no": Create a new relation - "ru": Создать отношение - "sv": Skapa en ny relation -delete: - "de": löschen - "hu": Törlés -deleting: - "de": löschen - "es": Borrar - "fi": poistaminen - "fr": suppression - "hu": törlés - "no": deleting - "ru": удаляю - "sv": Tar bort -dontshowagain: - "de": Diese Meldung nicht wieder anzeigen. - "es": No mostrar este mensaje de nuevo - "fi": Älä näytä tätä viestiä enää. - "fr": Ne plus afficher ce message - "hu": Ez az üzenet ne jelenjen meg újra - "no": Ikke vis denne meldingen igjen - "ru": Не показывать это сообщение снова. - "sv": Visa inte detta medelande igen -editingmap: - "de": Karte editieren - "hu": Térkép szerkesztése -emailauthor: - "de": \n\nBitte maile an richard\@systemeD.net eine Fehlerbeschreibung, und schildere, was Du in dem Moment getan hast. (Wenn möglich auf Englisch) - "es": \n\nPor favor envíe un mail a richard\@systemeD.net con un informe del error, describiendo lo que hacía en ese momento. - "fi": \n\nLähetäthän sähköpostia, jossa kerrot mitä olit tekemässä, osoitteeseen richard\@systemeD.net mieluiten englanniksi. - "fr": \n\nMerci d'envoyer un e-mail a richard\@systemeD.net pour signaler ce bogue, en expliquant ce que vous faisiez quand il est survenu. - "hu": \n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time. - "no": \n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time. - "ru": "\n\n Пожалуйста, отправьте сообщение об ошибке (на английском языке) на электронную почту: richard\@systemeD.net, с указанием того, какие действия вы совершали." - "sv": \n\nVänligen e-posta richard\@systemeD.net med en felreport, som beskriver vad du gjorde när felet inträffade. -error_connectionfailed: - "de": Die Verbindung zum OpenStreetMap Server ist leider fehlgeschlagen. Kürzliche Änderungen wurden nicht gespeichert.\n\nNochmal versuchen? - "es": "Disculpe - la conexión al servidor de OpenStreetMap ha fallado. Cualquier cambio reciente no se ha guardado.\n\nPodría intentarlo de nuevo?" - "fi": "Yhteys OSM-palvelimeen epäonnistui. Tuoreita muutoksia ei ole tallennettu.\n\nHaluatko yrittää uudestaan?" - "fr": "Désolé, la connexion au serveur OpenStreetMap a échoué. Vos changements récents ne sont pas enregistrés.\n\nVoulez-vous réessayer ?" - "hu": "Bocs - az OpenStreetMap szerverhez való kapcsolódás sikertelen. A legutóbbi módosítások nem lettek elmentve.\n\nSzeretnéd megpróbálni újra?" - "no": "Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?" - "ru": "Извините, соединение с сервером OpenStreetMap разорвано. Все текущие изменения не были сохранены.\n\nПопробовать ещё раз?" - "sv": "Tyvärr har vi tappat kontakten med OpenStreetMap serven. Ny gjorda ändringar har inte kunnat sparas.\n\nFörsöka återansluta?" -error_nopoi: - "de": Der Ort von Interesse (POI) kann nicht gefunden werden (vielleicht hast Du den Kartenausschnitt verschoben?), daher ist Rückgängigmachen nicht möglich. - "es": El punto de interés (POI) no se puede encontrar (igual usted se ha desplazado a otra zona?), por tanto no se puede deshacer. - "fi": POI ei löydä (ehkä vieritit siitä liian kauaksi), joten peruminen ei onnistu. - "fr": Le point d'intérêt (POI) n'est pas trouvé (éventuellement sur une autre page?), il ne peut être restauré. - "hu": The POI cannot be found (perhaps you've panned away?) so I can't undo. - "no": The POI cannot be found (perhaps you've panned away?) so I can't undo. - "ru": Точка интереса(POI) не найдена (возможно вы отошли в сторону?), поэтому невозможно отменить. - "sv": "POI:n kan inte hittas (du kanske har flyttat den utanför bilden?) så det går inte att ångra." -error_nosharedpoint: - "de": Die Wege $1 und $2 haben keinen gemeinsamen Punkt mehr, daher kann das Aufteilen nicht rückgängig gemacht werden. - "es": Las vías $1 y $2 ya no tienen ningún punto en común, por tanto no se pueden dividir. - "fi": Ways $1 and $2 don't share a common point any more, so I can't undo the split. - "fr": "Les chemins $1 et $2 n'ont plus de point en commun et ne peuvent donc pas être recollés : l'opération précédente de scindage ne peut être annulée." - "hu": Ways $1 and $2 don't share a common point any more, so I can't undo the split. - "no": Ways $1 and $2 don't share a common point any more, so I can't undo the split. - "ru": Пути $1 и $2 больше не содержат общих узлов, поэтому невозможно отменить разделение. - "sv": Vägarna $1 och $2 möts inte i någon punkt längre, så det går inte att ångra delningen. -error_noway: - "de": Der Weg $1 kann nicht gefunden werden (vielleicht hast Du den Kartenausschnitt verschoben?), daher ist Rückgängigmachen nicht möglich. - "es": La vía $1 no se puede encontrar (igual usted se ha desplazado a otra zona?), por tanto no se puede deshacer.. - "fi": Tietä $1 ei löydy (ehkä vieritit siitä liian kauaksi), joten kumoaminen ei onnistu. - "fr": Le chemin $1 n'a pas été trouvé, il ne peut être restauré à son état précédent. - "hu": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. - "no": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. - "ru": Путь $1 не найден (возможно вы отошли в сторону?), поэтому невозможно отменить. - "sv": Vägen $1 kan inte hittas (du kanske har flyttat den utanför bilden?) så det går inte att ångra. -gpxpleasewait: - "de": Bitte warten, während die GPX-Aufzeichnung (Track) verarbeitet wird. - "es": Por favor espere un poco mientras el track GPX se procesa. - "fi": Odota. GPX-jälkeä käsitellään. - "fr": Patientez pendant que la trace GPX est traitée. - "hu": Kérlek várj a GPX útvonal feldolgozásáig. - "no": Vennligst vent mens sporloggen behandles. - "ru": Пожалуйста, подождите — GPX-треки обрабатываются. - "sv": GPX loggen bearbetas, var god vänta. -help: - "de": Hilfe - "es": Ayuda - "fi": Ohje - "fr": Aide - "hu": Segítség - "no": Hjelp - "ru": Помощь - "sv": Hjälp -hint_drawmode: - "de": Klicken um Punkt hinzuzufügen\n Doppelklicken oder Eingabetaste zum Beenden der Linie - "es": Clic para añadir un punto\ndoble-clic/Return\npara terminar la línea - "fi": klikkaa lisätäksesi piste\ntuplaklikkaa tai paina enter päättääksesi tien - "fr": clic pour ajouter un point\ndouble-clic/Return\npour terminer le chemin - "hu": kattintás pont hozzáadásához\ndupla kattintás/Return\na vonal befejezéséhez - "no": trykk for å legge til punkt\ndobbeltklikk eller enter\nfor å avslutte linje - "ru": кликните для добавления точки\nдвойной клик или Enter\nчтобы чтобы закончить путь - "sv": Klicka för att lägga till en punkt\n Dubbel klicka för att avsluta vägen. -hint_loading: - "de": Wege werden geladen - "es": Cargando vías - "fi": ladataan teitä - "fr": chargement des chemins en cours - "hu": utak betöltése - "no": laster veier - "ru": загрузка путей - "sv": laddar vägar -hint_overendpoint: - "de": Überlappung mit Endpunkt\nKlicken zum Anschließen\nShift+Klick zum Verschmelzen - "es": Sobre punto final\nclic para unir\nshift-clic para combinar - "fi": päätepisteen päällä\nklikkaa sulkeaksi\nshift-klikkaa yhdistääksesi - "fr": sur le dernier point du tracé \nclick pour joindre\nshift-click pour fusionner - "hu": végpont fölött\nkattintás a csatlakoztatáshoz\nshift-kattintás az egyesítéshez - "no": over endepunkt\ntrykk for å koble sammen\nshift+trykk for å slå sammen - "ru": над конечным узлом\nclick для соединения\nshift-click для слияния - "sv": över en slutpunkt\nklicka för att sätta fast\nshift-klicka för att slåsamman -hint_overpoint: - "de": Überlappung mit Punkt\nklicken zum Anschließen - "es": Sobre punto\nclick para unir" - "fi": pisteen päällä\nklikkaa yhdistääksesi" - "fr": point du dessus\nclick pour joindre" - "hu": pont fölött\nkattintás a csatlakoztatáshoz" - "no": over punkt\ntrykk for å koble sammen - "ru": над узлом\nclick для соединения" - "sv": över en punkt \nkicka att sätta fast" -hint_pointselected: - "de": Punkt ist markiert\n(Shift+Punkt anklicken, um\n eine neue Linie zu ziehen) - "es": Punto seleccionado\n(shift-clic en el punto para\nempezar nueva línea) - "fi": piste valittua\n(shift-klikkaa pistettä\naloittaksesi uuden tien) - "fr": point sélectionné\n(shift-clic sur le point pour\ncommencer une nouvelle ligne) - "hu": pont kijelölve\n(shift-kattintás a pontra \núj vonal kezdéséhez) - "no": punkt valgt\n(shift+trykk punktet for å\nstarte en ny linje) - "ru": точка выбрана\n(кликните с нажатым Shift на точку\nчтобы начать новую линию) - "sv": En punk är vald\n(Shift-klicka på punkten för att starta en ny väg) -hint_toolong: - "de": "Zu lang zum Entsperren:\n bitte in kürzere Wege aufteilen" - "es": "Demasiado larga para desbloquear:\nPorfavor divida\nen vías más cortas" - "fi": "liian pitkä vapautettavaksi:\nkatkaise\nlyhyempiin teihin" - "fr": "trop long pour débloquer la situation:\nscindez le chemin en\nchemins plus courts" - "hu": "too long to unlock:\nplease split into\nshorter ways" - "no": "for lang til å låse opp:\nvennligst del opp\ni mindre veier" - "ru": "слишком длинный путь для разблокировки:\пожалуйста, разбейте его\nна более короткие пути" - "sv": "för lång för att låsaupp:\ndela upp vägen\ni mindre delar" -option_background: - "de": "Hintergrund:" - "es": "Fondo:" - "fi": "Tausta:" - "fr": "Arrière-plan :" - "hu": "Háttér:" - "no": "Background:" - "ru": "Фон:" - "sv": "Bakgrund:" -option_custompointers: - "de": Stift- und Hand-Mauszeiger benutzen - "es": Usar punteros de pluma y mano - "fi": Käytä kynä- ja käsikursoreita - "fr": Utiliser le crayon et la main pour pointer les éléments - "hu": Use pen and hand pointers - "no": Use pen and hand pointers - "ru": Использовать курсоры пера и руки - "sv": Använd penna och hand pekare -option_fadebackground: - "de": Hintergrund verblasst - "es": Atenuar fondo - "fi": Himmeä tausta - "fr": Arrière-plan clair - "hu": Fade background - "no": Fade background - "ru": Обесцветить фон - "sv": Mattad bakgrund -option_thinlines: - "de": Dünne Linien in allen Auflösungen benutzen - "es": Usar líneas finas en todas las escalas - "fi": Käytä aina ohuita viivoja - "fr": Utiliser un trait fin à toutes les échelles - "hu": Use thin lines at all scales - "no": Use thin lines at all scales - "ru": Использовать тонкие линии на всех масштабах - "sv": Använd tunna linjer på alla skalor -play: - "de": Ausprobieren - "hu": Kipróbálás -point: - "de": Punkt - "hu": Pont -practicemode: - "de": Übungsmodus - "es": Modo prácticas - "fi": Harjoitustila - "fr": Mode d'essai - "hu": Gyakorlás mód - "no": Øvelsesmodus - "ru": Тренировочный режим - "sv": Tränings läge -prompt_accuracy: - "de": Fehlerfreiheit ist wichtig - Trage nur Orte ein, wo Du warst - "es": La precisión es importante - Mapee solo zonas en las que ha estado físicamente. - "fi": Tarkkuus on tärkeää; muokkaathan vain paikkoja, joissa olet ollut. - "fr": Précision importante - Éditez seulement les lieux que vous avez visités - "hu": A pontosság fontos - csak olyan helyeket térképezz, ahol már jártál - "no": Nøyaktighet er viktig, bare kartlegg steder du har besøkt - "ru": Точность важна. Составляйте карты только для тех мест, в которых вы были. - "sv": Noggrannhet är viktigt - kartera bara ställen du varit -prompt_addtorelation: - "de": $1 zu einer Relation hinzufügen - "es": Añadir $1 a una relación - "fi": Lisä $1 relaatioon - "fr": Ajouter $1 à la relation - "hu": $1 hozzáadása egy kapcsolathoz - "no": Add $1 to a relation - "ru": Добавить $1 в отношение - "sv": Läggtill $1 till en relation -prompt_dontcopy: - "de": Kopiere nichts von anderen Karten - "es": No copie de otros mapas - "fi": Älä kopioi muista kartoista - "fr": Ne copiez pas d'autre cartes - "hu": Ne másolj más térképekből - "no": Ikke kopier fra andre kart - "ru": Не копируйте информацию с других карт - "sv": Kopiera inget från andra kartor -prompt_enjoy: - "de": "Und: Viel Spaß!" - "es": Y páselo bien! - "fi": Pidä hauskaa! - "fr": Et amusez-vous bien ! - "hu": És szórakozz jól! - "no": Og ha det morsomt! - "ru": Приятного вам времяпровождения! - "sv": och ha roligt! -prompt_help: - "de": Anleitung für Potlatch, diesen Karten-Editor. - "es": Encuentre cómo usar Potlatch (éste editor de mapas). - "fi": Kuinka käytän Potlatchiä, tätä editoria? - "fr": Découvrez comment utiliser Potlatch, cet éditeur de la carte. - "hu": Nézz utána, hogyan kell használni a Potlatch-ot, ezt a térképszerkesztőt. - "no": Find out how to use Potlatch, this map editor. - "ru": Узнать, как пользоваться редактором. - "sv": Information hur man använder Potlatch, den här kart editorn. -prompt_introduction: - "de": Wähle unten eine Schaltfläche zum Editieren. Wenn Du "Start" anklickst, wirst Du die Karte sofort direkt bearbeiten - Änderungen werden meist jeden Donnerstag sichtbar. Wenn Du "Ausprobieren" anklickst, werden Deine Änderungen nicht gespeichert, also kannst Du hier das Bearbeiten üben.\n\nDenk an die Goldenen Regeln von OpenStreetMap:\n\n - "es": Seleccione uno de los botones más abajo para empezar a editar. Si pulsa "Empezar", estará editando directamente el mapa - Normalmente los cambios se mostrarán cada Jueves. Si pulsa "Jugar", sus cambios no se guardarán, de esta manera podrá practicar la edición.\n\nRecuerde las reglas de oro de OpenStreetMap:\n\n - "fi": "Valitse haluamasi tila. Jos valitset aloita, pääset muokkaamaan karttaa suoraan - muutokset päivittyvät pääsivun kartalle yleensä torstaisin. Jos valitset harjoittele, tekemiäsi muutoksia ei tallenneta mihinkää, eli voit harjoitella editointia\n\nMuistathan OpenStreetMapin kultaiset säännöt:\n\n" - "fr": "Choisir un bouton ci-dessous pour commencer l'édition. Si vous cliquez sur 'Start', vous éditerez directement la carte principale - les modifications sont visibles sur celle-ci généralement tous les jeudis. Si vous cliquez sur 'Play', vos modifications ne seront pas enregistrées, ainsi vous pouvez vous exercer sans risques.\n\nEt gardez en tête ces règles d'or d'OpenStreetMap :\n\n" - "hu": "Válassz az alábbi gombok közül a szerkesztéshez. Ha a 'Kezdés'-re kattintasz, akkor közvetlenül a főtérképet szerkesztheted - a módosítások általában minden csütörtökön jelennek meg. Ha a 'Kipróbálás'-ra kattintasz, akkor a módosításaid nem lesznek elmentve, így gyakorolhatod a szerkesztést.\n\nEmlékezz az OpenStreetMap aranyszabályaira:\n\n" - "no": "Velg en knapp nedenfor for å redigere. Hvis du velger 'Start' redigerer du kartet direkte, endringer blir vanligvis synlige hver torsdag. Hvis du velger 'Lek' lagres ikke endringer, så du kan øve deg på å redigere.\nHusk OpenStreetMaps gyldne regler:\n\n" - "ru": "Выберите кнопку. Если вы нажмёте «Start», вы начнёте редактировать карту. Основная карта обновляется по средам. Если вы нажмёте «Play», ваши изменения на карте сохраняться не будут и вы сможете практиковаться в редактировании.\n\nЗапомните основные правила OpenStreetMap:\n\n" - "sv": "För att börja editera, klicka på en av knapparna nedan. Om du klickar på 'Start' så arbetar du direkt mot huvudkartan, och ändringar sparas automatiskt - ändringarna syns normalt varje torsdag efter huvudkartan uppdaterats. Om du klickar 'Play' så kommer inget att sparas, ett bra sätt att träna på att använda programmet.\n\nKom ihåg OpenStreetMaps gyllene regler:\n\n" -prompt_practise: - "de": Bearbeiten üben - Deine Änderungen werden nicht gespeichert. - "es": Mapear en prácticas - Sus cambios no se guardarán. - "fi": Harjoittele - muutoksiasi ei talleneta. - "fr": "Essai de cartographie : vos changements ne seront pas pris en compte." - "hu": Térképezés gyakorlása - módosításaid nem lesznek elmentve. - "no": Øv på kartlegging, endringer blir ikke lagret. - "ru": Тренировочное редактирование — ваши изменения не будут сохранены. - "sv": Träna på kartering - inga ändringar kommer att sparas. -prompt_revertversion: - "de": "Früher gespeicherte Version wiederherstellen:" - "es": "Volver a una versión previamente guardada:" - "fi": "Palauta aiempaan versioon:" - "fr": "Revenir à une version sauvegardée plus récente :" - "hu": "Visszaállítás egy korábbi mentett változatra:" - "no": "Tilbakestill til tidligere lagret versjon:" - "ru": "Восстановить ранее сохраненную версию:" - "sv": Gå tillbaks till en tidigare version -prompt_selectrelation: - "de": Bestehende Relation zum Hinzufügen auswählen oder neue Relation erstellen. - "es": Seleccionar una relación existente para añadir a ella, o crear una nueva relación. - "fi": Valitse olemassa oleva relaatio, johon lisätään, tai luo uusi. - "fr": Sélectionner une relation existante pour l'ajouter, ou créer une nouvelle relation. - "hu": Select an existing relation to add to, or create a new relation. - "no": Select an existing relation to add to, or create a new relation. - "ru": Выберете существующее отношение или создайте новое. - "sv": Välj en befintligrelation att addera till, eller skapa en ny relation. -prompt_start: - "de": Kartographieren mit OpenStreetMap beginnen - "es": Empezar a mapear con OpenStreetMap. - "fi": Aloita kartan muokkaus. - "fr": Démarrer la cartographie avec OpenStreetMap. - "hu": Térképezés kezdése OpenStreetMappal. - "no": Begynn å kartlegg med OpenStreetMap. - "ru": Начать редактировать карту OpenStreetMap. - "sv": Börja kartera med OpenStreetMap. -prompt_taggedpoints: - "de": Einige Punkte auf diesem Weg tragen Attribute (Tags). Trotzdem löschen? - "es": Algunos puntos de esta vía tienen parámetros (tags). Seguro que quiere borrar? - "fi": Joihinkin tien pisteisiin on lisätty tageja. Haluatko varmasti perua? - "fr": Certains points de ce chemin sont tagués. Souhaitez-vous les supprimer? - "hu": Ezen az úton van néhány címkézett pont. Biztosan törlöd? - "no": Some of the points on this way are tagged. Really delete? - "ru": Некоторые узлы данного пути содержат теги. Действительно удалить? - "sv": Några en punkterna i denna väg är taggade, vill du verkligen ta bort den? -prompt_track: - "de": Deine GPS-Aufzeichnungen (Tracks) in (gesperrte) Wege zum Editieren wandeln. - "es": Convierta su track de GPS a vías (bloqueadas) para editar. - "fi": Muunna GPX-jälki lukituiksi teiksi editointia varten - "fr": Conversion d'une trace GPS en chemin (verrouillé) pour l'édition. - "hu": Convert your GPS track to (locked) ways for editing. - "no": Convert your GPS track to (locked) ways for editing. - "ru": Конвертировать GPS-трек в путь(заблокированный), для редактирования. - "sv": Omvandla dina GPS spår till (låsta) vägar för editering. -prompt_welcome: - "de": Willkommen bei OpenStreetMap! - "es": Bienvenido a OpenStreetMap! - "fi": "Tervetuloa OpenStreetMap:iin" - "fr": Bienvenue sur OpenStreetMap ! - "hu": Üdvözöllek az OpenStreetMapon! - "no": Velkommen til OpenStreetMap! - "ru": Добро пожаловать в OpenStreetMap! - "sv": Välkommen till OpenStreetMap! -revert: - "de": Vorherige Version wiederherstellen - "es": Volver - "fi": Kumoa - "fr": Revenir - "hu": Visszaállítás - "no": Tilbakestill - "ru": Восстановить - "sv": Använd denna version -start: - "de": Start - "hu": Kezdés -tip_addrelation: - "de": Zu einer Relation hinzufügen - "es": Añadir a una relación - "fi": Lisää relaatio - "fr": Ajouter à une relation - "hu": Hozzáadás kapcsolathoz - "no": Legg til i en relation - "ru": Добавить новое отношение(relation) - "sv": Läggtill en ny relation -tip_addtag: - "de": Attribut (Tag) hinzufügen - "es": Añadir un nuevo parámetro (tag) - "fi": Lisää uusi tagi - "fr": Ajouter un nouveau tag - "hu": Új címke hozzáadása - "no": Legg til tag - "ru": Добавить новый тег - "sv": Läggtill en ny tag -tip_alert: - "de": Ein Fehler ist aufgetreten - Klicken für Details - "es": Ha ocurrido un error - clic para detalles - "fi": Tapahtui virhe - klikkaa saadaksesi lisätietoja - "fr": Une erreur vient de survenir - cliquez pour plus de détails - "hu": Hiba történt - kattints a részletekért - "no": Det oppstod en feil, trykk for detaljer - "ru": Произошла ошибка — нажмите для получения подробностей - "sv": Ett fel har inträffat - klicka för detaljer -tip_anticlockwise: - "de": Geschlossener Weg gegen den Uhrzeigersinn - Klicken zum Richtung Ändern - "es": Vía circular en el sentido contrario de las agujas del reloj - clic para invertir la dirección de la vía - "fi": Vastapäivään sulkeutuva tie - klikkaa kääntääksesi - "fr": Circulation dans le sens inverse des aiguilles d'une montre (trigonométrique) - Cliquez pour inverser le sens - "hu": Órajárással ellentétes körút - kattints a megfordításhoz - "no": Sirkulær vei mot klokka, trykk for å snu - "ru": Замкнутый путь против часовой стрелки - изменить на противоположный - "sv": Vägen är rund, riktad moturs, klicka för att vända rikting -tip_clockwise: - "de": Geschlossener Weg im Uhrzeigersinn - Klicken zum Richtung Ändern - "es": Vía circular en el sentido de las agujas del reloj - clic para invertir la dirección de la vía - "fi": Myötäpäivään sulkeutuva tie - klikkaa kääntääksesi - "fr": Circulation dans le sens des aiguilles d'une montre - Cliquez pour inverser le sens - "hu": Órajárással egyező körút - kattints a megfordításhoz - "no": Sirkulær vei med klokka, trykk for å snu - "ru": Замкнутый путь по часовой стрелке - изменить на противоположный - "sv": Vägen är rund riktad medurs, klicka för att vända riktning -tip_direction: - "de": Richtung des Weges - Klicken zum Ändern - "es": Dirección de la vía - clic para invertir la dirección de la vía - "fi": Tien suunta - klikkaa kääntääksesi - "fr": Direction du chemin - cliquez pour inverser - "hu": Út iránya - kattints a megfordításhoz - "no": Veiretning, trykk for å snu - "ru": Направление пути — изменить на противоположный - "sv": Vägens riktning - klicka för att vända vägen -tip_gps: - "de": GPS-Aufzeichnungen (Tracks) einblenden (G) - "es": Mostrar los tracks de GPS (G) - "fi": Näytä GPS-jäljet (G) - "fr": Afficher la trace GPS (G) - "hu": GPS útvonalak megjelenítése (G) - "no": Vis GPS sporlogger (G) - "ru": Показать GPS треки (G) - "sv": Visa GPS spår (G) -tip_noundo: - "de": Es gibt nichts rückgängig zu machen. - "es": Nada que deshacer - "fi": Ei kumottavaa - "fr": Rien à annuler - "hu": Nincs mit visszavonni - "no": Ingenting å angre - "ru": Нечего отменять - "sv": Finns inget att ångra -tip_options: - "de": Optionen ändern (Kartenhintergrund) - "es": Opciones (elegir el fondo del mapa) - "fi": Asetukset (valitse kartan tausta) - "fr": Options (choix de la carte d'arrière plan) - "hu": Beállítások módosítása (térképháttér kiválasztása) - "no": Sett valg (velg kartbakgrunn) - "ru": Задать настройки (выбрать карту-подложку) - "sv": Ändra inställningar (välj bakgrunds karta) -tip_presettype: - "de": Wähle die Art der Voreinstellungen, die im Menü angeboten werden sollen. - "es": Seleccionar que tipo de parámetros (tags) preestablecidos se ofrecen en el menú. - "fi": Valitse millaisia pohjia on tarjolla valikossa. - "fr": Sélectionner le type de paramètres proposés dans le menu de sélection. - "hu": Choose what type of presets are offered in the menu. - "no": Choose what type of presets are offered in the menu. - "ru": Выберете какой набор тегов отображать в меню. - "sv": Välj vilka typer an inställningar som syns i menyn. -tip_repeattag: - "de": Attribute (Tags) vom vorher markierten Weg übernehmen (R) - "es": Repetir los parámetros (tags) de la vía seleccionada previamente (R) - "fi": Toista tagit viimeksi valitusta tiestä (R) - "fr": Recopier les informations du chemin sélectionné précédemment (R) - "hu": Az előzőleg kiválasztott út címkéinek megismétlése (R) - "no": Repeter tagger fra siste valgte vei (R) - "ru": Повторить теги с предыдущего выбранного пути (R) - "sv": Kopiera taggarna från den senast valda vägen (R) -tip_revertversion: - "de": Version zum Wiederherstellen wählen - "es": Elige la versión a la que volver. - "fi": Valitse versio, johon palautetaan - "fr": Choisissez la version vers laquelle revenir - "hu": Válaszd ki a változatot a visszaállításhoz - "no": Velg versjonen det skal tilbakestilles til - "ru": Выберете версию для воосстановления - "sv": Välj version som ska användas -tip_selectrelation: - "de": Zur markierten Route hinzufügen ?Route or Way? - "es": Añadir a la ruta seleccionada - "fi": Lisää valittuun reittiin - "fr": Ajouter à la route choisie - "hu": Hozzáadás a kiválasztott útvonalhoz - "no": Add to the chosen route - "ru": Добавить в выбранное отношение - "sv": Addera till den valda rutten -tip_splitway: - "de": Weg am markierten Punkt auftrennen (X) - "es": Dividir la vía en el punto seleccionado (X) - "fi": Katkaise tie valitusta kohtaa (X) - "fr": scinder le chemin au point sélectionné (X) - "hu": Út kettévágása a kijelölt pontnál (X) - "no": Del vei i valgt punkt (X) - "ru": Разделить путь в текущем узле (X) - "sv": Dela upp vägen i två delar vid den valda punkten (x) -tip_undo: - "de": $1 rückgängig machen (Z) - "es": Deshacer $1 (Z) - "fi": Kumoa $1 (Z) - "fr": Annuler l'opération $1 (Z) - "hu": $1 visszavonása (Z) - "no": Undo $1 (Z) - "ru": Отменить $1 (Z) - "sv": Ångra $1 (Z) -track: - "de": "to track: Weg aufzeichnen, the track: GPS-Aufzeichnung (Track)" - "es": Track - "fi": Jälki - "fr": Trace - "hu": Útvonal - "no": Track - "ru": Трек - "sv": Spår -way: - "de": Weg - "hu": Út diff --git a/config/potlatch/relation_colours.txt b/config/potlatch/relation_colours.txt index 557563fe2..03398fb71 100644 --- a/config/potlatch/relation_colours.txt +++ b/config/potlatch/relation_colours.txt @@ -4,5 +4,4 @@ lcn 0x0000ff 50 10 rcn 0x28c9fe 50 10 ncn 0xff3333 50 10 -foot 0x228022 50 10 -trail 0x228022 50 10 +ldp 0x228022 50 10 diff --git a/lib/potlatch.rb b/lib/potlatch.rb index cf8f5903d..4dfba12ef 100644 --- a/lib/potlatch.rb +++ b/lib/potlatch.rb @@ -83,7 +83,7 @@ module Potlatch when 'Hash' a=3.chr n.each do |k,v| - a+=encodestring(k.to_s)+encodevalue(v) + a+=encodestring(k)+encodevalue(v) end a+0.chr+0.chr+9.chr when 'String' @@ -195,10 +195,7 @@ module Potlatch } end - # Read internationalisation - localised = YAML::load(File.open("#{RAILS_ROOT}/config/potlatch/localised.yaml")) - - [presets,presetmenus,presetnames,colours,casing,areas,autotags,relcolours,relalphas,relwidths,localised] + [presets,presetmenus,presetnames,colours,casing,areas,autotags,relcolours,relalphas,relwidths] end end diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index 63a04bf51c6f3451bdb6b88bad6110028a887549..721840fe4ec4d006d7b62d134313f7e90fffee54 100755 GIT binary patch literal 140596 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 C(O_Eu literal 148900 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 Date: Tue, 15 Jul 2008 18:05:22 +0000 Subject: [PATCH 09/58] Move Potlatch configuration to a separate initialiser file. --- config/environment.rb | 7 ------- config/initializers/potlatch.rb | 6 ++++++ 2 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 config/initializers/potlatch.rb diff --git a/config/environment.rb b/config/environment.rb index 6cf8b261d..e6af619eb 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -74,10 +74,3 @@ Rails::Initializer.run do |config| # Make Active Record use UTC-base instead of local time # config.active_record.default_timezone = :utc end - -# This has to be after the above block for some reason (doesnt pull in /lib/osm.rb?) -POTLATCH_PRESETS = Potlatch::Potlatch.get_presets() - -# Use SQL (faster) or Rails (more elegant) for common Potlatch reads -# getway speedup is approximately x2, whichways approximately x7 -POTLATCH_USE_SQL = true diff --git a/config/initializers/potlatch.rb b/config/initializers/potlatch.rb new file mode 100644 index 000000000..880947148 --- /dev/null +++ b/config/initializers/potlatch.rb @@ -0,0 +1,6 @@ +# Load presets +POTLATCH_PRESETS = Potlatch::Potlatch.get_presets() + +# Use SQL (faster) or Rails (more elegant) for common Potlatch reads +# getway speedup is approximately x2, whichways approximately x7 +POTLATCH_USE_SQL = true From 6fa8647855b81a2f518c4995969113038187759c Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 15 Jul 2008 18:18:37 +0000 Subject: [PATCH 10/58] Rename unique_nodes to unshared_node_ids to make it's purpose a bit clearer and rework it to be a bit tidier. --- app/controllers/amf_controller.rb | 4 ++-- app/models/way.rb | 22 ++++++++++------------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 4ec4e660e..28e2e4b2b 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -295,7 +295,7 @@ class AmfController < ApplicationController uniques=[] else way=Way.find(originalway) - uniques=way.unique_nodes + uniques=way.unshared_node_ids end # -- Compare nodes and save changes to any that have changed @@ -415,7 +415,7 @@ class AmfController < ApplicationController # two nodes from the same relation user = User.find(uid) way = Way.find(way_id) - way.unique_nodes.each do |n| + way.unshared_node_ids.each do |n| deleteitemrelations(n,'node') end diff --git a/app/models/way.rb b/app/models/way.rb index 59988d88b..958944200 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -235,11 +235,8 @@ class Way < ActiveRecord::Base # delete a way and it's nodes that aren't part of other ways, with history def delete_with_relations_and_nodes_and_history(user) - - node_ids_to_delete = self.unique_nodes - # delete the nodes not used by other ways - node_ids_to_delete.each do |node_id| + self.unshared_node_ids.each do |node_id| n = Node.find(node_id) n.user_id = user.id n.visible = false @@ -249,17 +246,18 @@ class Way < ActiveRecord::Base self.user_id = user.id self.delete_with_relations_and_history(user) - end # Find nodes that belong to this way only - def unique_nodes - node_ids = self.nodes.collect {|node| node.id } - if node_ids.length==0 then return [] end - node_ids_in_other_ways = [] - way_nodes = WayNode.find(:all, :conditions => "node_id in (#{node_ids.join(',')}) and id != #{self.id}") - node_ids_in_other_ways = way_nodes.collect {|way_node| way_node.node_id} - return node_ids - node_ids_in_other_ways + def unshared_node_ids + node_ids = self.nodes.collect { |node| node.id } + + unless node_ids.empty? + way_nodes = WayNode.find(:all, :conditions => "node_id in (#{node_ids.join(',')}) and id != #{self.id}") + node_ids = node_ids - way_nodes.collect { |way_node| way_node.node_id } + end + + return node_ids end # Temporary method to match interface to nodes From 34d9360bee4c1f277bb908280ca3daa6f3d88aa9 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 15 Jul 2008 18:23:00 +0000 Subject: [PATCH 11/58] Minor tidyups. --- app/models/node.rb | 7 +++---- app/models/old_way_node.rb | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/app/models/node.rb b/app/models/node.rb index d61293e82..cec755f47 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -17,13 +17,12 @@ class Node < ActiveRecord::Base has_many :way_nodes has_many :ways, :through => :way_nodes - has_many :containing_relation_members, :class_name => "RelationMember", :as => :member - has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation, :extend => ObjectFinder - - # Atomic undelete support has_many :old_way_nodes has_many :ways_via_history, :class_name=> "Way", :through => :old_way_nodes, :source => :way + has_many :containing_relation_members, :class_name => "RelationMember", :as => :member + has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation, :extend => ObjectFinder + # Sanity check the latitude and longitude and add an error if it's broken def validate_position errors.add_to_base("Node is not in the world") unless in_world? diff --git a/app/models/old_way_node.rb b/app/models/old_way_node.rb index a6e65da85..7420b5cfc 100644 --- a/app/models/old_way_node.rb +++ b/app/models/old_way_node.rb @@ -3,6 +3,5 @@ class OldWayNode < ActiveRecord::Base set_primary_keys :id, :version, :sequence_id - # Atomic undelete support - belongs_to :way, :foreign_key=> :id + belongs_to :way, :foreign_key=> :id end From c878da25cf42d98f1666760549fd015c09f5dabe Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 15 Jul 2008 23:15:53 +0000 Subject: [PATCH 12/58] Remote Potlatch projection routines as they are no longer needed. --- lib/geo_record.rb | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lib/geo_record.rb b/lib/geo_record.rb index 025bbe4a8..f1a923c42 100644 --- a/lib/geo_record.rb +++ b/lib/geo_record.rb @@ -37,15 +37,6 @@ module GeoRecord return self.longitude.to_f / 10000000 end - # Potlatch projections - def lon_potlatch(baselong,masterscale) - (self.lon-baselong)*masterscale - end - - def lat_potlatch(basey,masterscale) - -(lat2y(self.lat)-basey)*masterscale - end - private def lat2y(a) From fb27023d418fbfbaac937639483be86ef70156c1 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 16 Jul 2008 13:04:05 +0000 Subject: [PATCH 13/58] Remove no longer needed PHP extension. --- public/openlayers/OpenStreetMap.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/public/openlayers/OpenStreetMap.js b/public/openlayers/OpenStreetMap.js index 69e8840b2..1e65f5c76 100644 --- a/public/openlayers/OpenStreetMap.js +++ b/public/openlayers/OpenStreetMap.js @@ -143,9 +143,9 @@ OpenLayers.Layer.OSM.Osmarender = OpenLayers.Class(OpenLayers.Layer.OSM, { */ initialize: function(name, options) { var url = [ - "http://a.tah.openstreetmap.org/Tiles/tile.php/", - "http://b.tah.openstreetmap.org/Tiles/tile.php/", - "http://c.tah.openstreetmap.org/Tiles/tile.php/" + "http://a.tah.openstreetmap.org/Tiles/tile/", + "http://b.tah.openstreetmap.org/Tiles/tile/", + "http://c.tah.openstreetmap.org/Tiles/tile/" ]; options = OpenLayers.Util.extend({ numZoomLevels: 18 }, options); var newArguments = [name, url, options]; @@ -199,9 +199,9 @@ OpenLayers.Layer.OSM.Maplint = OpenLayers.Class(OpenLayers.Layer.OSM, { */ initialize: function(name, options) { var url = [ - "http://d.tah.openstreetmap.org/Tiles/maplint.php/", - "http://e.tah.openstreetmap.org/Tiles/maplint.php/", - "http://f.tah.openstreetmap.org/Tiles/maplint.php/" + "http://d.tah.openstreetmap.org/Tiles/maplint/", + "http://e.tah.openstreetmap.org/Tiles/maplint/", + "http://f.tah.openstreetmap.org/Tiles/maplint/" ]; options = OpenLayers.Util.extend({ numZoomLevels: 18, isBaseLayer: false, visibility: false }, options); var newArguments = [name, url, options]; From 911e0309116d418c216d03a4d765c3057234bd36 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 16 Jul 2008 13:21:16 +0000 Subject: [PATCH 14/58] Disable JPEG exports from Osmarender as they are not currently supported by the MapOf call in the new tiles@home server. --- app/views/export/start.rjs | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/export/start.rjs b/app/views/export/start.rjs index 47cf9ce6b..923613c18 100644 --- a/app/views/export/start.rjs +++ b/app/views/export/start.rjs @@ -276,6 +276,7 @@ page << < Date: Wed, 16 Jul 2008 15:27:25 +0000 Subject: [PATCH 15/58] Remove SOTM advert. --- app/views/layouts/site.rhtml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/views/layouts/site.rhtml b/app/views/layouts/site.rhtml index 52e7b6b24..4b41e5e9e 100644 --- a/app/views/layouts/site.rhtml +++ b/app/views/layouts/site.rhtml @@ -95,12 +95,6 @@ <%= yield :left_menu %> - - <%= yield :optionals %> " - end - @output.puts "
" - @output.puts "
" - @output.puts "
#{h(example_group.description)}
" - @output.flush - end - - def start_dump - @output.puts "
" - @output.puts "
" - @output.flush - end - - def example_started(example) - @current_example_number += 1 - end - - def example_passed(example) - move_progress - @output.puts "
#{h(example.description)}
" - @output.flush - end - - def example_failed(example, counter, failure) - extra = extra_failure_content(failure) - failure_style = failure.pending_fixed? ? 'pending_fixed' : 'failed' - @output.puts " " unless @header_red - @header_red = true - @output.puts " " unless @example_group_red - @example_group_red = true - move_progress - @output.puts "
" - @output.puts " #{h(example.description)}" - @output.puts "
" - @output.puts "
#{h(failure.exception.message)}
" unless failure.exception.nil? - @output.puts "
#{format_backtrace(failure.exception.backtrace)}
" unless failure.exception.nil? - @output.puts extra unless extra == "" - @output.puts "
" - @output.puts "
" - @output.flush - end - - def example_pending(example_group_description, example, message) - @output.puts " " unless @header_red - @output.puts " " unless @example_group_red - move_progress - @output.puts "
#{h(example.description)} (PENDING: #{h(message)})
" - @output.flush - end - - # Override this method if you wish to output extra HTML for a failed spec. For example, you - # could output links to images or other files produced during the specs. - # - def extra_failure_content(failure) - require 'spec/runner/formatter/snippet_extractor' - @snippet_extractor ||= SnippetExtractor.new - "
#{@snippet_extractor.snippet(failure.exception)}
" - end - - def move_progress - @output.puts " " - @output.flush - end - - def percent_done - result = 100.0 - if @example_count != 0 - result = ((current_example_number).to_f / @example_count.to_f * 1000).to_i / 10.0 - end - result - end - - def dump_failure(counter, failure) - end - - def dump_summary(duration, example_count, failure_count, pending_count) - if dry_run? - totals = "This was a dry-run" - else - totals = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}" - totals << ", #{pending_count} pending" if pending_count > 0 - end - @output.puts "" - @output.puts "" - @output.puts "" - @output.puts "" - @output.puts "" - @output.puts "" - @output.flush - end - - def html_header - <<-EOF - - - - - RSpec results - - - - - - -EOF - end - - def report_header - <<-EOF -
- - - -
-

RSpec Results

- -
-

 

-

 

-
-
- -
-EOF - end - - def global_scripts - <<-EOF -function moveProgressBar(percentDone) { - document.getElementById("rspec-header").style.width = percentDone +"%"; -} -function makeRed(element_id) { - document.getElementById(element_id).style.background = '#C40D0D'; - document.getElementById(element_id).style.color = '#FFFFFF'; -} - -function makeYellow(element_id) { - if (element_id == "rspec-header" && document.getElementById(element_id).style.background != '#C40D0D') - { - document.getElementById(element_id).style.background = '#FAF834'; - document.getElementById(element_id).style.color = '#000000'; - } - else - { - document.getElementById(element_id).style.background = '#FAF834'; - document.getElementById(element_id).style.color = '#000000'; - } -} -EOF - end - - def global_styles - <<-EOF -#rspec-header { - background: #65C400; color: #fff; -} - -.rspec-report h1 { - margin: 0px 10px 0px 10px; - padding: 10px; - font-family: "Lucida Grande", Helvetica, sans-serif; - font-size: 1.8em; -} - -#summary { - margin: 0; padding: 5px 10px; - font-family: "Lucida Grande", Helvetica, sans-serif; - text-align: right; - position: absolute; - top: 0px; - right: 0px; -} - -#summary p { - margin: 0 0 0 2px; -} - -#summary #totals { - font-size: 1.2em; -} - -.example_group { - margin: 0 10px 5px; - background: #fff; -} - -dl { - margin: 0; padding: 0 0 5px; - font: normal 11px "Lucida Grande", Helvetica, sans-serif; -} - -dt { - padding: 3px; - background: #65C400; - color: #fff; - font-weight: bold; -} - -dd { - margin: 5px 0 5px 5px; - padding: 3px 3px 3px 18px; -} - -dd.spec.passed { - border-left: 5px solid #65C400; - border-bottom: 1px solid #65C400; - background: #DBFFB4; color: #3D7700; -} - -dd.spec.failed { - border-left: 5px solid #C20000; - border-bottom: 1px solid #C20000; - color: #C20000; background: #FFFBD3; -} - -dd.spec.not_implemented { - border-left: 5px solid #FAF834; - border-bottom: 1px solid #FAF834; - background: #FCFB98; color: #131313; -} - -dd.spec.pending_fixed { - border-left: 5px solid #0000C2; - border-bottom: 1px solid #0000C2; - color: #0000C2; background: #D3FBFF; -} - -.backtrace { - color: #000; - font-size: 12px; -} - -a { - color: #BE5C00; -} - -/* Ruby code, style similar to vibrant ink */ -.ruby { - font-size: 12px; - font-family: monospace; - color: white; - background-color: black; - padding: 0.1em 0 0.2em 0; -} - -.ruby .keyword { color: #FF6600; } -.ruby .constant { color: #339999; } -.ruby .attribute { color: white; } -.ruby .global { color: white; } -.ruby .module { color: white; } -.ruby .class { color: white; } -.ruby .string { color: #66FF00; } -.ruby .ident { color: white; } -.ruby .method { color: #FFCC00; } -.ruby .number { color: white; } -.ruby .char { color: white; } -.ruby .comment { color: #9933CC; } -.ruby .symbol { color: white; } -.ruby .regex { color: #44B4CC; } -.ruby .punct { color: white; } -.ruby .escape { color: white; } -.ruby .interp { color: white; } -.ruby .expr { color: white; } - -.ruby .offending { background-color: gray; } -.ruby .linenum { - width: 75px; - padding: 0.1em 1em 0.2em 0; - color: #000000; - background-color: #FFFBD3; -} -EOF - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/profile_formatter.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/profile_formatter.rb deleted file mode 100644 index 3784f3ac7..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/profile_formatter.rb +++ /dev/null @@ -1,47 +0,0 @@ -require 'spec/runner/formatter/progress_bar_formatter' - -module Spec - module Runner - module Formatter - class ProfileFormatter < ProgressBarFormatter - - def initialize(options, where) - super - @example_times = [] - end - - def start(count) - @output.puts "Profiling enabled." - end - - def example_started(example) - @time = Time.now - end - - def example_passed(example) - super - @example_times << [ - example_group.description, - example.description, - Time.now - @time - ] - end - - def start_dump - super - @output.puts "\n\nTop 10 slowest examples:\n" - - @example_times = @example_times.sort_by do |description, example, time| - time - end.reverse - - @example_times[0..9].each do |description, example, time| - @output.print red(sprintf("%.7f", time)) - @output.puts " #{description} #{example}" - end - @output.flush - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/progress_bar_formatter.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/progress_bar_formatter.rb deleted file mode 100644 index 8d0e50432..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/progress_bar_formatter.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'spec/runner/formatter/base_text_formatter' - -module Spec - module Runner - module Formatter - class ProgressBarFormatter < BaseTextFormatter - def example_failed(example, counter, failure) - @output.print colourise('F', failure) - @output.flush - end - - def example_passed(example) - @output.print green('.') - @output.flush - end - - def example_pending(example_group_description, example, message) - super - @output.print yellow('P') - @output.flush - end - - def start_dump - @output.puts - @output.flush - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/snippet_extractor.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/snippet_extractor.rb deleted file mode 100644 index 41119fe46..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/snippet_extractor.rb +++ /dev/null @@ -1,52 +0,0 @@ -module Spec - module Runner - module Formatter - # This class extracts code snippets by looking at the backtrace of the passed error - class SnippetExtractor #:nodoc: - class NullConverter; def convert(code, pre); code; end; end #:nodoc: - begin; require 'rubygems'; require 'syntax/convertors/html'; @@converter = Syntax::Convertors::HTML.for_syntax "ruby"; rescue LoadError => e; @@converter = NullConverter.new; end - - def snippet(error) - raw_code, line = snippet_for(error.backtrace[0]) - highlighted = @@converter.convert(raw_code, false) - highlighted << "\n# gem install syntax to get syntax highlighting" if @@converter.is_a?(NullConverter) - post_process(highlighted, line) - end - - def snippet_for(error_line) - if error_line =~ /(.*):(\d+)/ - file = $1 - line = $2.to_i - [lines_around(file, line), line] - else - ["# Couldn't get snippet for #{error_line}", 1] - end - end - - def lines_around(file, line) - if File.file?(file) - lines = File.open(file).read.split("\n") - min = [0, line-3].max - max = [line+1, lines.length-1].min - selected_lines = [] - selected_lines.join("\n") - lines[min..max].join("\n") - else - "# Couldn't get snippet for #{file}" - end - end - - def post_process(highlighted, offending_line) - new_lines = [] - highlighted.split("\n").each_with_index do |line, i| - new_line = "#{offending_line+i-2}#{line}" - new_line = "#{new_line}" if i == 2 - new_lines << new_line - end - new_lines.join("\n") - end - - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/specdoc_formatter.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/specdoc_formatter.rb deleted file mode 100644 index f426dc948..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/specdoc_formatter.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'spec/runner/formatter/base_text_formatter' - -module Spec - module Runner - module Formatter - class SpecdocFormatter < BaseTextFormatter - def add_example_group(example_group) - super - output.puts - output.puts example_group.description - output.flush - end - - def example_failed(example, counter, failure) - message = if failure.expectation_not_met? - "- #{example.description} (FAILED - #{counter})" - else - "- #{example.description} (ERROR - #{counter})" - end - - output.puts(failure.expectation_not_met? ? red(message) : magenta(message)) - output.flush - end - - def example_passed(example) - message = "- #{example.description}" - output.puts green(message) - output.flush - end - - def example_pending(example_group_description, example, message) - super - output.puts yellow("- #{example.description} (PENDING: #{message})") - output.flush - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/story/html_formatter.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/story/html_formatter.rb deleted file mode 100644 index b70ac153a..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/story/html_formatter.rb +++ /dev/null @@ -1,125 +0,0 @@ -require 'erb' -require 'spec/runner/formatter/base_text_formatter' - -module Spec - module Runner - module Formatter - module Story - class HtmlFormatter < BaseTextFormatter - include ERB::Util - - def run_started(count) - @output.puts <<-EOF - - - - - Stories - - - - - - - - - -
-EOF - end - - def collected_steps(steps) - unless steps.empty? - @output.puts "
    " - steps.each do |step| - @output.puts "
  • #{step}
  • " - end - @output.puts "
" - end - end - - def run_ended - @output.puts <<-EOF -
- - -EOF - end - - def story_started(title, narrative) - @output.puts <<-EOF -
-
Story: #{h title}
-
-

- #{h(narrative).split("\n").join("
")} -

-EOF - end - - def story_ended(title, narrative) - @output.puts <<-EOF -
-
-EOF - end - - def scenario_started(story_title, scenario_name) - @output.puts <<-EOF -
-
Scenario: #{h scenario_name}
-
-
    -EOF - end - - def scenario_ended - @output.puts <<-EOF -
-
-
-EOF - end - - def found_scenario(type, description) - end - - def scenario_succeeded(story_title, scenario_name) - scenario_ended - end - - def scenario_pending(story_title, scenario_name, reason) - scenario_ended - end - - def scenario_failed(story_title, scenario_name, err) - scenario_ended - end - - def step_succeeded(type, description, *args) - print_step('passed', type, description, *args) # TODO: uses succeeded CSS class - end - - def step_pending(type, description, *args) - print_step('pending', type, description, *args) - end - - def step_failed(type, description, *args) - print_step('failed', type, description, *args) - end - - def print_step(klass, type, description, *args) - spans = args.map { |arg| "#{arg}" } - desc_string = description.step_name - arg_regexp = description.arg_regexp - i = -1 - inner = type.to_s.capitalize + ' ' + desc_string.gsub(arg_regexp) { |param| spans[i+=1] } - @output.puts "
  • #{inner}
  • " - end - end - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/story/plain_text_formatter.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/story/plain_text_formatter.rb deleted file mode 100644 index 424e27cc6..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/story/plain_text_formatter.rb +++ /dev/null @@ -1,128 +0,0 @@ -require 'spec/runner/formatter/base_text_formatter' - -module Spec - module Runner - module Formatter - module Story - class PlainTextFormatter < BaseTextFormatter - def initialize(options, where) - super - @successful_scenario_count = 0 - @pending_scenario_count = 0 - @failed_scenarios = [] - @pending_steps = [] - @previous_type = nil - end - - def run_started(count) - @count = count - @output.puts "Running #@count scenarios\n\n" - end - - def story_started(title, narrative) - @current_story_title = title - @output.puts "Story: #{title}\n\n" - narrative.each_line do |line| - @output.print " " - @output.print line - end - end - - def story_ended(title, narrative) - @output.puts - @output.puts - end - - def scenario_started(story_title, scenario_name) - @current_scenario_name = scenario_name - @scenario_already_failed = false - @output.print "\n\n Scenario: #{scenario_name}" - @scenario_ok = true - end - - def scenario_succeeded(story_title, scenario_name) - @successful_scenario_count += 1 - end - - def scenario_failed(story_title, scenario_name, err) - @options.backtrace_tweaker.tweak_backtrace(err) - @failed_scenarios << [story_title, scenario_name, err] unless @scenario_already_failed - @scenario_already_failed = true - end - - def scenario_pending(story_title, scenario_name, msg) - @pending_scenario_count += 1 unless @scenario_already_failed - @scenario_already_failed = true - end - - def run_ended - @output.puts "#@count scenarios: #@successful_scenario_count succeeded, #{@failed_scenarios.size} failed, #@pending_scenario_count pending" - unless @pending_steps.empty? - @output.puts "\nPending Steps:" - @pending_steps.each_with_index do |pending, i| - story_name, scenario_name, msg = pending - @output.puts "#{i+1}) #{story_name} (#{scenario_name}): #{msg}" - end - end - unless @failed_scenarios.empty? - @output.print "\nFAILURES:" - @failed_scenarios.each_with_index do |failure, i| - title, scenario_name, err = failure - @output.print %[ - #{i+1}) #{title} (#{scenario_name}) FAILED - #{err.class}: #{err.message} - #{err.backtrace.join("\n")} -] - end - end - end - - def step_succeeded(type, description, *args) - found_step(type, description, false, *args) - end - - def step_pending(type, description, *args) - found_step(type, description, false, *args) - @pending_steps << [@current_story_title, @current_scenario_name, description] - @output.print " (PENDING)" - @scenario_ok = false - end - - def step_failed(type, description, *args) - found_step(type, description, true, *args) - @output.print red(@scenario_ok ? " (FAILED)" : " (SKIPPED)") - @scenario_ok = false - end - - def collected_steps(steps) - end - - def method_missing(sym, *args, &block) #:nodoc: - # noop - ignore unknown messages - end - - private - - def found_step(type, description, failed, *args) - desc_string = description.step_name - arg_regexp = description.arg_regexp - text = if(type == @previous_type) - "\n And " - else - "\n\n #{type.to_s.capitalize} " - end - i = -1 - text << desc_string.gsub(arg_regexp) { |param| args[i+=1] } - @output.print(failed ? red(text) : green(text)) - - if type == :'given scenario' - @previous_type = :given - else - @previous_type = type - end - end - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/text_mate_formatter.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/text_mate_formatter.rb deleted file mode 100644 index 4c0a9c7de..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/formatter/text_mate_formatter.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'spec/runner/formatter/html_formatter' - -module Spec - module Runner - module Formatter - # Formats backtraces so they're clickable by TextMate - class TextMateFormatter < HtmlFormatter - def backtrace_line(line) - line.gsub(/([^:]*\.rb):(\d*)/) do - "#{$1}:#{$2} " - end - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/heckle_runner.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/heckle_runner.rb deleted file mode 100644 index 7695fe794..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/heckle_runner.rb +++ /dev/null @@ -1,72 +0,0 @@ -begin - require 'rubygems' - require 'heckle' -rescue LoadError ; raise "You must gem install heckle to use --heckle" ; end - -module Spec - module Runner - # Creates a new Heckler configured to heckle all methods in the classes - # whose name matches +filter+ - class HeckleRunner - def initialize(filter, heckle_class=Heckler) - @filter = filter - @heckle_class = heckle_class - end - - # Runs all the example groups held by +rspec_options+ once for each of the - # methods in the matched classes. - def heckle_with - if @filter =~ /(.*)[#\.](.*)/ - heckle_method($1, $2) - else - heckle_class_or_module(@filter) - end - end - - def heckle_method(class_name, method_name) - verify_constant(class_name) - heckle = @heckle_class.new(class_name, method_name, rspec_options) - heckle.validate - end - - def heckle_class_or_module(class_or_module_name) - verify_constant(class_or_module_name) - pattern = /^#{class_or_module_name}/ - classes = [] - ObjectSpace.each_object(Class) do |klass| - classes << klass if klass.name =~ pattern - end - - classes.each do |klass| - klass.instance_methods(false).each do |method_name| - heckle = @heckle_class.new(klass.name, method_name, rspec_options) - heckle.validate - end - end - end - - def verify_constant(name) - begin - # This is defined in Heckle - name.to_class - rescue - raise "Heckling failed - \"#{name}\" is not a known class or module" - end - end - end - - #Supports Heckle 1.2 and prior (earlier versions used Heckle::Base) - class Heckler < (Heckle.const_defined?(:Base) ? Heckle::Base : Heckle) - def initialize(klass_name, method_name, rspec_options) - super(klass_name, method_name) - @rspec_options = rspec_options - end - - def tests_pass? - success = @rspec_options.run_examples - success - end - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/heckle_runner_unsupported.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/heckle_runner_unsupported.rb deleted file mode 100644 index 02aa37953..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/heckle_runner_unsupported.rb +++ /dev/null @@ -1,10 +0,0 @@ -module Spec - module Runner - # Dummy implementation for Windows that just fails (Heckle is not supported on Windows) - class HeckleRunner - def initialize(filter) - raise "Heckle not supported on Windows" - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/option_parser.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/option_parser.rb deleted file mode 100644 index 09cedccac..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/option_parser.rb +++ /dev/null @@ -1,229 +0,0 @@ -require 'optparse' -require 'stringio' - -module Spec - module Runner - class OptionParser < ::OptionParser - class << self - def parse(args, err, out) - parser = new(err, out) - parser.parse(args) - parser.options - end - end - - attr_reader :options - - OPTIONS = { - :diff => ["-D", "--diff [FORMAT]", "Show diff of objects that are expected to be equal when they are not", - "Builtin formats: unified|u|context|c", - "You can also specify a custom differ class", - "(in which case you should also specify --require)"], - :colour => ["-c", "--colour", "--color", "Show coloured (red/green) output"], - :example => ["-e", "--example [NAME|FILE_NAME]", "Execute example(s) with matching name(s). If the argument is", - "the path to an existing file (typically generated by a previous", - "run using --format failing_examples:file.txt), then the examples", - "on each line of thatfile will be executed. If the file is empty,", - "all examples will be run (as if --example was not specified).", - " ", - "If the argument is not an existing file, then it is treated as", - "an example name directly, causing RSpec to run just the example", - "matching that name"], - :specification => ["-s", "--specification [NAME]", "DEPRECATED - use -e instead", "(This will be removed when autotest works with -e)"], - :line => ["-l", "--line LINE_NUMBER", Integer, "Execute behaviout or specification at given line.", - "(does not work for dynamically generated specs)"], - :format => ["-f", "--format FORMAT[:WHERE]", "Specifies what format to use for output. Specify WHERE to tell", - "the formatter where to write the output. All built-in formats", - "expect WHERE to be a file name, and will write to STDOUT if it's", - "not specified. The --format option may be specified several times", - "if you want several outputs", - " ", - "Builtin formats for examples: ", - "progress|p : Text progress", - "profile|o : Text progress with profiling of 10 slowest examples", - "specdoc|s : Example doc as text", - "html|h : A nice HTML report", - "failing_examples|e : Write all failing examples - input for --example", - "failing_example_groups|g : Write all failing example groups - input for --example", - " ", - "Builtin formats for stories: ", - "plain|p : Plain Text", - "html|h : A nice HTML report", - " ", - "FORMAT can also be the name of a custom formatter class", - "(in which case you should also specify --require to load it)"], - :require => ["-r", "--require FILE", "Require FILE before running specs", - "Useful for loading custom formatters or other extensions.", - "If this option is used it must come before the others"], - :backtrace => ["-b", "--backtrace", "Output full backtrace"], - :loadby => ["-L", "--loadby STRATEGY", "Specify the strategy by which spec files should be loaded.", - "STRATEGY can currently only be 'mtime' (File modification time)", - "By default, spec files are loaded in alphabetical order if --loadby", - "is not specified."], - :reverse => ["-R", "--reverse", "Run examples in reverse order"], - :timeout => ["-t", "--timeout FLOAT", "Interrupt and fail each example that doesn't complete in the", - "specified time"], - :heckle => ["-H", "--heckle CODE", "If all examples pass, this will mutate the classes and methods", - "identified by CODE little by little and run all the examples again", - "for each mutation. The intent is that for each mutation, at least", - "one example *should* fail, and RSpec will tell you if this is not the", - "case. CODE should be either Some::Module, Some::Class or", - "Some::Fabulous#method}"], - :dry_run => ["-d", "--dry-run", "Invokes formatters without executing the examples."], - :options_file => ["-O", "--options PATH", "Read options from a file"], - :generate_options => ["-G", "--generate-options PATH", "Generate an options file for --options"], - :runner => ["-U", "--runner RUNNER", "Use a custom Runner."], - :drb => ["-X", "--drb", "Run examples via DRb. (For example against script/spec_server)"], - :version => ["-v", "--version", "Show version"], - :help => ["-h", "--help", "You're looking at it"] - } - - def initialize(err, out) - super() - @error_stream = err - @out_stream = out - @options = Options.new(@error_stream, @out_stream) - - @spec_parser = SpecParser.new - @file_factory = File - - self.banner = "Usage: spec (FILE|DIRECTORY|GLOB)+ [options]" - self.separator "" - on(*OPTIONS[:diff]) {|diff| @options.parse_diff(diff)} - on(*OPTIONS[:colour]) {@options.colour = true} - on(*OPTIONS[:example]) {|example| @options.parse_example(example)} - on(*OPTIONS[:specification]) {|example| @options.parse_example(example)} - on(*OPTIONS[:line]) {|line_number| @options.line_number = line_number.to_i} - on(*OPTIONS[:format]) {|format| @options.parse_format(format)} - on(*OPTIONS[:require]) {|requires| invoke_requires(requires)} - on(*OPTIONS[:backtrace]) {@options.backtrace_tweaker = NoisyBacktraceTweaker.new} - on(*OPTIONS[:loadby]) {|loadby| @options.loadby = loadby} - on(*OPTIONS[:reverse]) {@options.reverse = true} - on(*OPTIONS[:timeout]) {|timeout| @options.timeout = timeout.to_f} - on(*OPTIONS[:heckle]) {|heckle| @options.load_heckle_runner(heckle)} - on(*OPTIONS[:dry_run]) {@options.dry_run = true} - on(*OPTIONS[:options_file]) {|options_file| parse_options_file(options_file)} - on(*OPTIONS[:generate_options]) do |options_file| - end - on(*OPTIONS[:runner]) do |runner| - @options.user_input_for_runner = runner - end - on(*OPTIONS[:drb]) {} - on(*OPTIONS[:version]) {parse_version} - on_tail(*OPTIONS[:help]) {parse_help} - end - - def order!(argv, &blk) - @argv = argv - @options.argv = @argv.dup - return if parse_generate_options - return if parse_drb - - super(@argv) do |file| - @options.files << file - blk.call(file) if blk - end - - if @options.line_number - set_spec_from_line_number - end - - @options - end - - protected - def invoke_requires(requires) - requires.split(",").each do |file| - require file - end - end - - def parse_options_file(options_file) - option_file_args = IO.readlines(options_file).map {|l| l.chomp.split " "}.flatten - @argv.push(*option_file_args) - end - - def parse_generate_options - # Remove the --generate-options option and the argument before writing to file - options_file = nil - ['-G', '--generate-options'].each do |option| - if index = @argv.index(option) - @argv.delete_at(index) - options_file = @argv.delete_at(index) - end - end - - if options_file - write_generated_options(options_file) - return true - else - return false - end - end - - def write_generated_options(options_file) - File.open(options_file, 'w') do |io| - io.puts @argv.join("\n") - end - @out_stream.puts "\nOptions written to #{options_file}. You can now use these options with:" - @out_stream.puts "spec --options #{options_file}" - @options.examples_should_not_be_run - end - - def parse_drb - is_drb = false - argv = @options.argv - is_drb ||= argv.delete(OPTIONS[:drb][0]) - is_drb ||= argv.delete(OPTIONS[:drb][1]) - return nil unless is_drb - @options.examples_should_not_be_run - DrbCommandLine.run( - self.class.parse(argv, @error_stream, @out_stream) - ) - true - end - - def parse_version - @out_stream.puts ::Spec::VERSION::DESCRIPTION - exit if stdout? - end - - def parse_help - @out_stream.puts self - exit if stdout? - end - - def set_spec_from_line_number - if @options.examples.empty? - if @options.files.length == 1 - if @file_factory.file?(@options.files[0]) - source = @file_factory.open(@options.files[0]) - example = @spec_parser.spec_name_for(source, @options.line_number) - @options.parse_example(example) - elsif @file_factory.directory?(@options.files[0]) - @error_stream.puts "You must specify one file, not a directory when using the --line option" - exit(1) if stderr? - else - @error_stream.puts "#{@options.files[0]} does not exist" - exit(2) if stderr? - end - else - @error_stream.puts "Only one file can be specified when using the --line option: #{@options.files.inspect}" - exit(3) if stderr? - end - else - @error_stream.puts "You cannot use both --line and --example" - exit(4) if stderr? - end - end - - def stdout? - @out_stream == $stdout - end - - def stderr? - @error_stream == $stderr - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/options.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/options.rb deleted file mode 100644 index a5a07548d..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/options.rb +++ /dev/null @@ -1,253 +0,0 @@ -module Spec - module Runner - class Options - FILE_SORTERS = { - 'mtime' => lambda {|file_a, file_b| File.mtime(file_b) <=> File.mtime(file_a)} - } - - EXAMPLE_FORMATTERS = { # Load these lazily for better speed - 'specdoc' => ['spec/runner/formatter/specdoc_formatter', 'Formatter::SpecdocFormatter'], - 's' => ['spec/runner/formatter/specdoc_formatter', 'Formatter::SpecdocFormatter'], - 'html' => ['spec/runner/formatter/html_formatter', 'Formatter::HtmlFormatter'], - 'h' => ['spec/runner/formatter/html_formatter', 'Formatter::HtmlFormatter'], - 'progress' => ['spec/runner/formatter/progress_bar_formatter', 'Formatter::ProgressBarFormatter'], - 'p' => ['spec/runner/formatter/progress_bar_formatter', 'Formatter::ProgressBarFormatter'], - 'failing_examples' => ['spec/runner/formatter/failing_examples_formatter', 'Formatter::FailingExamplesFormatter'], - 'e' => ['spec/runner/formatter/failing_examples_formatter', 'Formatter::FailingExamplesFormatter'], -'failing_example_groups' => ['spec/runner/formatter/failing_example_groups_formatter', 'Formatter::FailingExampleGroupsFormatter'], - 'g' => ['spec/runner/formatter/failing_example_groups_formatter', 'Formatter::FailingExampleGroupsFormatter'], - 'profile' => ['spec/runner/formatter/profile_formatter', 'Formatter::ProfileFormatter'], - 'o' => ['spec/runner/formatter/profile_formatter', 'Formatter::ProfileFormatter'], - 'textmate' => ['spec/runner/formatter/text_mate_formatter', 'Formatter::TextMateFormatter'] - } - - STORY_FORMATTERS = { - 'plain' => ['spec/runner/formatter/story/plain_text_formatter', 'Formatter::Story::PlainTextFormatter'], - 'p' => ['spec/runner/formatter/story/plain_text_formatter', 'Formatter::Story::PlainTextFormatter'], - 'html' => ['spec/runner/formatter/story/html_formatter', 'Formatter::Story::HtmlFormatter'], - 'h' => ['spec/runner/formatter/story/html_formatter', 'Formatter::Story::HtmlFormatter'] - } - - attr_accessor( - :backtrace_tweaker, - :context_lines, - :diff_format, - :dry_run, - :profile, - :examples, - :heckle_runner, - :line_number, - :loadby, - :reporter, - :reverse, - :timeout, - :verbose, - :user_input_for_runner, - :error_stream, - :output_stream, - # TODO: BT - Figure out a better name - :argv - ) - attr_reader :colour, :differ_class, :files, :example_groups - - def initialize(error_stream, output_stream) - @error_stream = error_stream - @output_stream = output_stream - @backtrace_tweaker = QuietBacktraceTweaker.new - @examples = [] - @colour = false - @profile = false - @dry_run = false - @reporter = Reporter.new(self) - @context_lines = 3 - @diff_format = :unified - @files = [] - @example_groups = [] - @examples_run = false - @examples_should_be_run = nil - @user_input_for_runner = nil - end - - def add_example_group(example_group) - @example_groups << example_group - end - - def remove_example_group(example_group) - @example_groups.delete(example_group) - end - - def run_examples - return true unless examples_should_be_run? - runner = custom_runner || ExampleGroupRunner.new(self) - - runner.load_files(files_to_load) - if example_groups.empty? - true - else - success = runner.run - @examples_run = true - heckle if heckle_runner - success - end - end - - def examples_run? - @examples_run - end - - def examples_should_not_be_run - @examples_should_be_run = false - end - - def colour=(colour) - @colour = colour - begin; \ - require 'Win32/Console/ANSI' if @colour && PLATFORM =~ /win32/; \ - rescue LoadError ; \ - raise "You must gem install win32console to use colour on Windows" ; \ - end - end - - def parse_diff(format) - case format - when :context, 'context', 'c' - @diff_format = :context - default_differ - when :unified, 'unified', 'u', '', nil - @diff_format = :unified - default_differ - else - @diff_format = :custom - self.differ_class = load_class(format, 'differ', '--diff') - end - end - - def parse_example(example) - if(File.file?(example)) - @examples = File.open(example).read.split("\n") - else - @examples = [example] - end - end - - def parse_format(format_arg) - format, where = ClassAndArgumentsParser.parse(format_arg) - unless where - raise "When using several --format options only one of them can be without a file" if @out_used - where = @output_stream - @out_used = true - end - @format_options ||= [] - @format_options << [format, where] - end - - def formatters - @format_options ||= [['progress', @output_stream]] - @formatters ||= load_formatters(@format_options, EXAMPLE_FORMATTERS) - end - - def story_formatters - @format_options ||= [['plain', @output_stream]] - @formatters ||= load_formatters(@format_options, STORY_FORMATTERS) - end - - def load_formatters(format_options, formatters) - format_options.map do |format, where| - formatter_type = if formatters[format] - require formatters[format][0] - eval(formatters[format][1], binding, __FILE__, __LINE__) - else - load_class(format, 'formatter', '--format') - end - formatter_type.new(self, where) - end - end - - def load_heckle_runner(heckle) - suffix = [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} ? '_unsupported' : '' - require "spec/runner/heckle_runner#{suffix}" - @heckle_runner = HeckleRunner.new(heckle) - end - - def number_of_examples - @example_groups.inject(0) do |sum, example_group| - sum + example_group.number_of_examples - end - end - - protected - def examples_should_be_run? - return @examples_should_be_run unless @examples_should_be_run.nil? - @examples_should_be_run = true - end - - def differ_class=(klass) - return unless klass - @differ_class = klass - Spec::Expectations.differ = self.differ_class.new(self) - end - - def load_class(name, kind, option) - if name =~ /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ - arg = $2 == "" ? nil : $2 - [$1, arg] - else - m = "#{name.inspect} is not a valid class name" - @error_stream.puts m - raise m - end - begin - eval(name, binding, __FILE__, __LINE__) - rescue NameError => e - @error_stream.puts "Couldn't find #{kind} class #{name}" - @error_stream.puts "Make sure the --require option is specified *before* #{option}" - if $_spec_spec ; raise e ; else exit(1) ; end - end - end - - def files_to_load - result = [] - sorted_files.each do |file| - if test ?d, file - result += Dir[File.expand_path("#{file}/**/*.rb")] - elsif test ?f, file - result << file - else - raise "File or directory not found: #{file}" - end - end - result - end - - def custom_runner - return nil unless custom_runner? - klass_name, arg = ClassAndArgumentsParser.parse(user_input_for_runner) - runner_type = load_class(klass_name, 'behaviour runner', '--runner') - return runner_type.new(self, arg) - end - - def custom_runner? - return user_input_for_runner ? true : false - end - - def heckle - returns = self.heckle_runner.heckle_with - self.heckle_runner = nil - returns - end - - def sorted_files - return sorter ? files.sort(&sorter) : files - end - - def sorter - FILE_SORTERS[loadby] - end - - def default_differ - require 'spec/expectations/differs/default' - self.differ_class = Spec::Expectations::Differs::Default - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/reporter.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/reporter.rb deleted file mode 100644 index cfc511baf..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/reporter.rb +++ /dev/null @@ -1,143 +0,0 @@ -module Spec - module Runner - class Reporter - attr_reader :options, :example_groups - - def initialize(options) - @options = options - @options.reporter = self - clear - end - - def add_example_group(example_group) - formatters.each do |f| - f.add_example_group(example_group) - end - example_groups << example_group - end - - def example_started(example) - formatters.each{|f| f.example_started(example)} - end - - def example_finished(example, error=nil) - @examples << example - - if error.nil? - example_passed(example) - elsif Spec::Example::ExamplePendingError === error - example_pending(example_groups.last, example, error.message) - else - example_failed(example, error) - end - end - - def failure(example, error) - backtrace_tweaker.tweak_backtrace(error) - example_name = "#{example_groups.last.description} #{example.description}" - failure = Failure.new(example_name, error) - @failures << failure - formatters.each do |f| - f.example_failed(example, @failures.length, failure) - end - end - alias_method :example_failed, :failure - - def start(number_of_examples) - clear - @start_time = Time.new - formatters.each{|f| f.start(number_of_examples)} - end - - def end - @end_time = Time.new - end - - # Dumps the summary and returns the total number of failures - def dump - formatters.each{|f| f.start_dump} - dump_pending - dump_failures - formatters.each do |f| - f.dump_summary(duration, @examples.length, @failures.length, @pending_count) - f.close - end - @failures.length - end - - private - - def formatters - @options.formatters - end - - def backtrace_tweaker - @options.backtrace_tweaker - end - - def clear - @example_groups = [] - @failures = [] - @pending_count = 0 - @examples = [] - @start_time = nil - @end_time = nil - end - - def dump_failures - return if @failures.empty? - @failures.inject(1) do |index, failure| - formatters.each{|f| f.dump_failure(index, failure)} - index + 1 - end - end - def dump_pending - formatters.each{|f| f.dump_pending} - end - - def duration - return @end_time - @start_time unless (@end_time.nil? or @start_time.nil?) - return "0.0" - end - - def example_passed(example) - formatters.each{|f| f.example_passed(example)} - end - - def example_pending(example_group, example, message="Not Yet Implemented") - @pending_count += 1 - formatters.each do |f| - f.example_pending(example_group.description, example, message) - end - end - - class Failure - attr_reader :exception - - def initialize(example_name, exception) - @example_name = example_name - @exception = exception - end - - def header - if expectation_not_met? - "'#{@example_name}' FAILED" - elsif pending_fixed? - "'#{@example_name}' FIXED" - else - "#{@exception.class.name} in '#{@example_name}'" - end - end - - def pending_fixed? - @exception.is_a?(Spec::Example::PendingExampleFixedError) - end - - def expectation_not_met? - @exception.is_a?(Spec::Expectations::ExpectationNotMetError) - end - - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/spec_parser.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/spec_parser.rb deleted file mode 100644 index 5ce51e3b2..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/runner/spec_parser.rb +++ /dev/null @@ -1,53 +0,0 @@ -module Spec - module Runner - # Parses a spec file and finds the nearest example for a given line number. - class SpecParser - def spec_name_for(io, line_number) - source = io.read - example_group, example_group_line = example_group_at_line(source, line_number) - example, example_line = example_at_line(source, line_number) - if example_group && example && (example_group_line < example_line) - "#{example_group} #{example}" - elsif example_group - example_group - else - nil - end - end - - protected - - def example_group_at_line(source, line_number) - find_above(source, line_number, /^\s*(context|describe)\s+(.*)\s+do/) - end - - def example_at_line(source, line_number) - find_above(source, line_number, /^\s*(specify|it)\s+(.*)\s+do/) - end - - # Returns the context/describe or specify/it name and the line number - def find_above(source, line_number, pattern) - lines_above_reversed(source, line_number).each_with_index do |line, n| - return [parse_description($2), line_number-n] if line =~ pattern - end - nil - end - - def lines_above_reversed(source, line_number) - lines = source.split("\n") - lines[0...line_number].reverse - end - - def parse_description(str) - return str[1..-2] if str =~ /^['"].*['"]$/ - if matches = /^['"](.*)['"](,.*)?$/.match(str) - return ::Spec::Example::ExampleGroupMethods.description_text(matches[1]) - end - if matches = /^(.*)\s*,\s*['"](.*)['"](,.*)?$/.match(str) - return ::Spec::Example::ExampleGroupMethods.description_text(matches[1], matches[2]) - end - return str - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story.rb b/vendor/gems/rspec-1.1.2/lib/spec/story.rb deleted file mode 100644 index bc6960a28..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story.rb +++ /dev/null @@ -1,10 +0,0 @@ -require 'spec' -require 'spec/story/extensions' -require 'spec/story/given_scenario' -require 'spec/story/runner' -require 'spec/story/scenario' -require 'spec/story/step' -require 'spec/story/step_group' -require 'spec/story/step_mother' -require 'spec/story/story' -require 'spec/story/world' diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/extensions.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/extensions.rb deleted file mode 100644 index dc7dd1140..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/extensions.rb +++ /dev/null @@ -1,3 +0,0 @@ -require 'spec/story/extensions/main' -require 'spec/story/extensions/string' -require 'spec/story/extensions/regexp' diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/extensions/main.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/extensions/main.rb deleted file mode 100644 index 6336b630c..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/extensions/main.rb +++ /dev/null @@ -1,86 +0,0 @@ -module Spec - module Story - module Extensions - module Main - def Story(title, narrative, params = {}, &body) - ::Spec::Story::Runner.story_runner.Story(title, narrative, params, &body) - end - - # Calling this deprecated is silly, since it hasn't been released yet. But, for - # those who are reading this - this will be deleted before the 1.1 release. - def run_story(*args, &block) - runner = Spec::Story::Runner::PlainTextStoryRunner.new(*args) - runner.instance_eval(&block) if block - runner.run - end - - # Creates (or appends to an existing) a namespaced group of steps for use in Stories - # - # == Examples - # - # # Creating a new group - # steps_for :forms do - # When("user enters $value in the $field field") do ... end - # When("user submits the $form form") do ... end - # end - def steps_for(tag, &block) - steps = rspec_story_steps[tag] - steps.instance_eval(&block) if block - steps - end - - # Creates a context for running a Plain Text Story with specific groups of Steps. - # Also supports adding arbitrary steps that will only be accessible to - # the Story being run. - # - # == Examples - # - # # Run a Story with one group of steps - # with_steps_for :checking_accounts do - # run File.dirname(__FILE__) + "/withdraw_cash" - # end - # - # # Run a Story, adding steps that are only available for this Story - # with_steps_for :accounts do - # Given "user is logged in as account administrator" - # run File.dirname(__FILE__) + "/reconcile_accounts" - # end - # - # # Run a Story with steps from two groups - # with_steps_for :checking_accounts, :savings_accounts do - # run File.dirname(__FILE__) + "/transfer_money" - # end - # - # # Run a Story with a specific Story extension - # with_steps_for :login, :navigation do - # run File.dirname(__FILE__) + "/user_changes_password", :type => RailsStory - # end - def with_steps_for(*tags, &block) - steps = Spec::Story::StepGroup.new do - extend StoryRunnerStepGroupAdapter - end - tags.each {|tag| steps << rspec_story_steps[tag]} - steps.instance_eval(&block) if block - steps - end - - private - - module StoryRunnerStepGroupAdapter - def run(path, options={}) - runner = Spec::Story::Runner::PlainTextStoryRunner.new(path, options) - runner.steps << self - runner.run - end - end - - def rspec_story_steps # :nodoc: - $rspec_story_steps ||= Spec::Story::StepGroupHash.new - end - - end - end - end -end - -include Spec::Story::Extensions::Main \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/extensions/regexp.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/extensions/regexp.rb deleted file mode 100644 index 7955b4c33..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/extensions/regexp.rb +++ /dev/null @@ -1,9 +0,0 @@ -class Regexp - def step_name - self.source - end - - def arg_regexp - ::Spec::Story::Step::PARAM_OR_GROUP_PATTERN - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/extensions/string.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/extensions/string.rb deleted file mode 100644 index 896578def..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/extensions/string.rb +++ /dev/null @@ -1,9 +0,0 @@ -class String - def step_name - self - end - - def arg_regexp - ::Spec::Story::Step::PARAM_PATTERN - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/given_scenario.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/given_scenario.rb deleted file mode 100644 index 88c51f981..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/given_scenario.rb +++ /dev/null @@ -1,14 +0,0 @@ -module Spec - module Story - class GivenScenario - def initialize(name) - @name = name - end - - def perform(instance, ignore_name) - scenario = Runner::StoryRunner.scenario_from_current_story(@name) - Runner::ScenarioRunner.new.run(scenario, instance) - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/runner.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/runner.rb deleted file mode 100644 index 2dd36fbc6..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/runner.rb +++ /dev/null @@ -1,58 +0,0 @@ -require 'spec/story/runner/scenario_collector.rb' -require 'spec/story/runner/scenario_runner.rb' -require 'spec/story/runner/story_runner.rb' -require 'spec/story/runner/story_parser.rb' -require 'spec/story/runner/story_mediator.rb' -require 'spec/story/runner/plain_text_story_runner.rb' - -module Spec - module Story - module Runner - class << self - def run_options # :nodoc: - @run_options ||= ::Spec::Runner::OptionParser.parse(ARGV, $stderr, $stdout) - end - - def story_runner # :nodoc: - unless @story_runner - @story_runner = StoryRunner.new(scenario_runner, world_creator) - run_options.story_formatters.each do |formatter| - register_listener(formatter) - end - Runner.register_exit_hook - end - @story_runner - end - - def scenario_runner # :nodoc: - @scenario_runner ||= ScenarioRunner.new - end - - def world_creator # :nodoc: - @world_creator ||= World - end - - # Use this to register a customer output formatter. - def register_listener(listener) - story_runner.add_listener(listener) # run_started, story_started, story_ended, #run_ended - world_creator.add_listener(listener) # found_scenario, step_succeeded, step_failed, step_failed - scenario_runner.add_listener(listener) # scenario_started, scenario_succeeded, scenario_pending, scenario_failed - end - - def register_exit_hook # :nodoc: - # TODO - when story runner uses test/unit runners like example runner does we can kill - # this and also the assorted Kernel.stub!(:at_exit) in examples - at_exit do - Runner.story_runner.run_stories unless $! - end - # TODO exit with non-zero status if run fails - end - - def dry_run - run_options.dry_run - end - - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/plain_text_story_runner.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/runner/plain_text_story_runner.rb deleted file mode 100644 index 8d34ea2d2..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/plain_text_story_runner.rb +++ /dev/null @@ -1,48 +0,0 @@ -module Spec - module Story - module Runner - class PlainTextStoryRunner - # You can initialize a PlainTextStoryRunner with the path to the - # story file or a block, in which you can define the path using load. - # - # == Examples - # - # PlainTextStoryRunner.new('path/to/file') - # - # PlainTextStoryRunner.new do |runner| - # runner.load 'path/to/file' - # end - def initialize(*args) - @options = Hash === args.last ? args.pop : {} - @story_file = args.empty? ? nil : args.shift - yield self if block_given? - end - - def []=(key, value) - @options[key] = value - end - - def load(path) - @story_file = path - end - - def run - raise "You must set a path to the file with the story. See the RDoc." if @story_file.nil? - mediator = Spec::Story::Runner::StoryMediator.new(steps, Spec::Story::Runner.story_runner, @options) - parser = Spec::Story::Runner::StoryParser.new(mediator) - - story_text = File.read(@story_file) - parser.parse(story_text.split("\n")) - - mediator.run_stories - end - - def steps - @step_group ||= Spec::Story::StepGroup.new - yield @step_group if block_given? - @step_group - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/scenario_collector.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/runner/scenario_collector.rb deleted file mode 100644 index 78339fd22..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/scenario_collector.rb +++ /dev/null @@ -1,18 +0,0 @@ -module Spec - module Story - module Runner - class ScenarioCollector - attr_accessor :scenarios - - def initialize(story) - @story = story - @scenarios = [] - end - - def Scenario(name, &body) - @scenarios << Scenario.new(@story, name, &body) - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/scenario_runner.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/runner/scenario_runner.rb deleted file mode 100644 index aee52e412..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/scenario_runner.rb +++ /dev/null @@ -1,46 +0,0 @@ -module Spec - module Story - module Runner - class ScenarioRunner - def initialize - @listeners = [] - end - - def run(scenario, world) - @listeners.each { |l| l.scenario_started(scenario.story.title, scenario.name) } - run_story_ignoring_scenarios(scenario.story, world) - - world.start_collecting_errors - world.instance_eval(&scenario.body) - if world.errors.empty? - @listeners.each { |l| l.scenario_succeeded(scenario.story.title, scenario.name) } - else - if Spec::Example::ExamplePendingError === (e = world.errors.first) - @listeners.each { |l| l.scenario_pending(scenario.story.title, scenario.name, e.message) } - else - @listeners.each { |l| l.scenario_failed(scenario.story.title, scenario.name, e) } - end - end - end - - def add_listener(listener) - @listeners << listener - end - - private - - def run_story_ignoring_scenarios(story, world) - class << world - def Scenario(name, &block) - # do nothing - end - end - story.run_in(world) - class << world - remove_method(:Scenario) - end - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/story_mediator.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/runner/story_mediator.rb deleted file mode 100644 index 1f4744b9f..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/story_mediator.rb +++ /dev/null @@ -1,123 +0,0 @@ - module Spec - module Story - module Runner - - class StoryMediator - def initialize(step_group, runner, options={}) - @step_group = step_group - @stories = [] - @runner = runner - @options = options - end - - def stories - @stories.collect { |p| p.to_proc } - end - - def create_story(title, narrative) - @stories << Story.new(title, narrative, @step_group, @options) - end - - def create_scenario(title) - current_story.add_scenario Scenario.new(title) - end - - def create_given(name) - current_scenario.add_step Step.new('Given', name) - end - - def create_given_scenario(name) - current_scenario.add_step Step.new('GivenScenario', name) - end - - def create_when(name) - current_scenario.add_step Step.new('When', name) - end - - def create_then(name) - current_scenario.add_step Step.new('Then', name) - end - - def run_stories - stories.each { |story| @runner.instance_eval(&story) } - end - - private - def current_story - @stories.last - end - - def current_scenario - current_story.current_scenario - end - - class Story - def initialize(title, narrative, step_group, options) - @title = title - @narrative = narrative - @scenarios = [] - @step_group = step_group - @options = options - end - - def to_proc - title = @title - narrative = @narrative - scenarios = @scenarios.collect { |scenario| scenario.to_proc } - options = @options.merge(:steps => @step_group) - lambda do - Story title, narrative, options do - scenarios.each { |scenario| instance_eval(&scenario) } - end - end - end - - def add_scenario(scenario) - @scenarios << scenario - end - - def current_scenario - @scenarios.last - end - end - - class Scenario - def initialize(name) - @name = name - @steps = [] - end - - def to_proc - name = @name - steps = @steps.collect { |step| step.to_proc } - lambda do - Scenario name do - steps.each { |step| instance_eval(&step) } - end - end - end - - def add_step(step) - @steps << step - end - end - - class Step - def initialize(type, name) - @type = type - @name = name - end - - def to_proc - type = @type - name = @name - lambda do - send(type, name) - end - end - end - end - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/story_parser.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/runner/story_parser.rb deleted file mode 100644 index d454df8cb..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/story_parser.rb +++ /dev/null @@ -1,227 +0,0 @@ -module Spec - module Story - module Runner - - class IllegalStepError < StandardError - def initialize(state, event) - super("Illegal attempt to create a #{event} after a #{state}") - end - end - - class StoryParser - def initialize(story_mediator) - @story_mediator = story_mediator - @current_story_lines = [] - transition_to(:starting_state) - end - - def parse(lines) - lines.reject! {|line| line == ""} - until lines.empty? - process_line(lines.shift) - end - @state.eof - end - - def process_line(line) - line.strip! - case line - when /^Story: / then @state.story(line) - when /^Scenario: / then @state.scenario(line) - when /^Given:? / then @state.given(line) - when /^GivenScenario:? / then @state.given_scenario(line) - when /^When:? / then @state.event(line) - when /^Then:? / then @state.outcome(line) - when /^And:? / then @state.one_more_of_the_same(line) - else @state.other(line) - end - end - - def init_story(title) - @current_story_lines.clear - add_story_line(title) - end - - def add_story_line(line) - @current_story_lines << line - end - - def create_story() - unless @current_story_lines.empty? - @story_mediator.create_story(@current_story_lines[0].gsub("Story: ",""), @current_story_lines[1..-1].join("\n")) - @current_story_lines.clear - end - end - - def create_scenario(title) - @story_mediator.create_scenario(title.gsub("Scenario: ","")) - end - - def create_given(name) - @story_mediator.create_given(name) - end - - def create_given_scenario(name) - @story_mediator.create_given_scenario(name) - end - - def create_when(name) - @story_mediator.create_when(name) - end - - def create_then(name) - @story_mediator.create_then(name) - end - - def transition_to(key) - @state = states[key] - end - - def states - @states ||= { - :starting_state => StartingState.new(self), - :story_state => StoryState.new(self), - :scenario_state => ScenarioState.new(self), - :given_state => GivenState.new(self), - :when_state => WhenState.new(self), - :then_state => ThenState.new(self) - } - end - - class State - def initialize(parser) - @parser = parser - end - - def story(line) - @parser.init_story(line) - @parser.transition_to(:story_state) - end - - def scenario(line) - @parser.create_scenario(line) - @parser.transition_to(:scenario_state) - end - - def given(line) - @parser.create_given(remove_tag_from(:given, line)) - @parser.transition_to(:given_state) - end - - def given_scenario(line) - @parser.create_given_scenario(remove_tag_from(:givenscenario, line)) - @parser.transition_to(:given_state) - end - - def event(line) - @parser.create_when(remove_tag_from(:when, line)) - @parser.transition_to(:when_state) - end - - def outcome(line) - @parser.create_then(remove_tag_from(:then, line)) - @parser.transition_to(:then_state) - end - - def remove_tag_from(tag, line) - tokens = line.split - # validation of tag can go here - tokens[0].downcase.match(/#{tag.to_s}:?/) ? - (tokens[1..-1].join(' ')) : line - end - - def eof - end - - def other(line) - # no-op - supports header text before the first story in a file - end - end - - class StartingState < State - def initialize(parser) - @parser = parser - end - end - - class StoryState < State - def one_more_of_the_same(line) - other(line) - end - - def story(line) - @parser.create_story - @parser.add_story_line(line) - end - - def scenario(line) - @parser.create_story - @parser.create_scenario(line) - @parser.transition_to(:scenario_state) - end - - def given(line) - other(line) - end - - def event(line) - other(line) - end - - def outcome(line) - other(line) - end - - def other(line) - @parser.add_story_line(line) - end - - def eof - @parser.create_story - end - end - - class ScenarioState < State - def one_more_of_the_same(line) - raise IllegalStepError.new("Scenario", "And") - end - - def scenario(line) - @parser.create_scenario(line) - end - end - - class GivenState < State - def one_more_of_the_same(line) - @parser.create_given(remove_tag_from(:and, line)) - end - - def given(line) - @parser.create_given(remove_tag_from(:given, line)) - end - end - - class WhenState < State - def one_more_of_the_same(line) - @parser.create_when(remove_tag_from(:and ,line)) - end - - def event(line) - @parser.create_when(remove_tag_from(:when ,line)) - end - end - - class ThenState < State - def one_more_of_the_same(line) - @parser.create_then(remove_tag_from(:and ,line)) - end - - def outcome(line) - @parser.create_then(remove_tag_from(:then ,line)) - end - end - - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/story_runner.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/runner/story_runner.rb deleted file mode 100644 index f9eeb9ac1..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/runner/story_runner.rb +++ /dev/null @@ -1,68 +0,0 @@ -module Spec - module Story - module Runner - class StoryRunner - class << self - attr_accessor :current_story_runner - - def scenario_from_current_story(scenario_name) - current_story_runner.scenario_from_current_story(scenario_name) - end - end - - attr_accessor :stories, :scenarios, :current_story - - def initialize(scenario_runner, world_creator = World) - StoryRunner.current_story_runner = self - @scenario_runner = scenario_runner - @world_creator = world_creator - @stories = [] - @scenarios_by_story = {} - @scenarios = [] - @listeners = [] - end - - def Story(title, narrative, params = {}, &body) - story = Story.new(title, narrative, params, &body) - @stories << story - - # collect scenarios - collector = ScenarioCollector.new(story) - story.run_in(collector) - @scenarios += collector.scenarios - @scenarios_by_story[story.title] = collector.scenarios - end - - def run_stories - return if @stories.empty? - @listeners.each { |l| l.run_started(scenarios.size) } - @stories.each do |story| - story.assign_steps_to(World) - @current_story = story - @listeners.each { |l| l.story_started(story.title, story.narrative) } - scenarios = @scenarios_by_story[story.title] - scenarios.each do |scenario| - type = story[:type] || Object - args = story[:args] || [] - world = @world_creator.create(type, *args) - @scenario_runner.run(scenario, world) - end - @listeners.each { |l| l.story_ended(story.title, story.narrative) } - World.step_mother.clear - end - unique_steps = (World.step_names.collect {|n| Regexp === n ? n.source : n.to_s}).uniq.sort - @listeners.each { |l| l.collected_steps(unique_steps) } - @listeners.each { |l| l.run_ended } - end - - def add_listener(listener) - @listeners << listener - end - - def scenario_from_current_story(scenario_name) - @scenarios_by_story[@current_story.title].find {|s| s.name == scenario_name } - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/scenario.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/scenario.rb deleted file mode 100644 index d83b3eeb8..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/scenario.rb +++ /dev/null @@ -1,14 +0,0 @@ - -module Spec - module Story - class Scenario - attr_accessor :name, :body, :story - - def initialize(story, name, &body) - @story = story - @name = name - @body = body - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/step.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/step.rb deleted file mode 100644 index 1d596e92c..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/step.rb +++ /dev/null @@ -1,56 +0,0 @@ -module Spec - module Story - class Step - PARAM_PATTERN = /(\$\w*)/ - PARAM_OR_GROUP_PATTERN = /(\$\w*)|\(.*?\)/ - - attr_reader :name - def initialize(name, &block) - @name = name - assign_expression(name) - init_module(name, &block) - end - - def perform(instance, *args) - instance.extend(@mod) - instance.__send__(sanitize(@name), *args) - end - - def init_module(name, &block) - sanitized_name = sanitize(name) - @mod = Module.new do - define_method(sanitized_name, &block) - end - end - - def sanitize(a_string_or_regexp) - return a_string_or_regexp.source if Regexp == a_string_or_regexp - a_string_or_regexp.to_s - end - - - def matches?(name) - !(matches = name.match(@expression)).nil? - end - - def parse_args(name) - name.match(@expression)[1..-1] - end - - private - - def assign_expression(name) - expression = name.dup - if String === expression - expression.gsub! '(', '\(' - expression.gsub! ')', '\)' - while expression =~ PARAM_PATTERN - expression.gsub!($1, "(.*?)") - end - end - @expression = Regexp.new("^#{expression}$") - end - - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/step_group.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/step_group.rb deleted file mode 100644 index cae558c40..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/step_group.rb +++ /dev/null @@ -1,89 +0,0 @@ -module Spec - module Story - - class StepGroupHash < Hash - def initialize - super do |h,k| - h[k] = Spec::Story::StepGroup.new - end - end - end - - class StepGroup - def self.steps(&block) - @step_group ||= StepGroup.new(false) - @step_group.instance_eval(&block) if block - @step_group - end - - def initialize(init_defaults=true, &block) - @hash_of_lists_of_steps = Hash.new {|h, k| h[k] = []} - if init_defaults - self.class.steps.add_to(self) - end - instance_eval(&block) if block - end - - def find(type, name) - @hash_of_lists_of_steps[type].each do |step| - return step if step.matches?(name) - end - return nil - end - - def GivenScenario(name, &block) - create_matcher(:given_scenario, name, &block) - end - - def Given(name, &block) - create_matcher(:given, name, &block) - end - - def When(name, &block) - create_matcher(:when, name, &block) - end - - def Then(name, &block) - create_matcher(:then, name, &block) - end - - alias :given_scenario :GivenScenario - alias :given :Given - alias :when :When - alias :then :Then - - def add(type, steps) - (@hash_of_lists_of_steps[type] << steps).flatten! - end - - def clear - @hash_of_lists_of_steps.clear - end - - def empty? - [:given_scenario, :given, :when, :then].each do |type| - return false unless @hash_of_lists_of_steps[type].empty? - end - return true - end - - def add_to(other_step_matchers) - [:given_scenario, :given, :when, :then].each do |type| - other_step_matchers.add(type, @hash_of_lists_of_steps[type]) - end - end - - def <<(other_step_matchers) - other_step_matchers.add_to(self) if other_step_matchers.respond_to?(:add_to) - end - - # TODO - make me private - def create_matcher(type, name, &block) - matcher = Step.new(name, &block) - @hash_of_lists_of_steps[type] << matcher - matcher - end - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/step_mother.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/step_mother.rb deleted file mode 100644 index a2e84e310..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/step_mother.rb +++ /dev/null @@ -1,37 +0,0 @@ -module Spec - module Story - class StepMother - def initialize - @steps = StepGroup.new - end - - def use(new_step_group) - @steps << new_step_group - end - - def store(type, step) - @steps.add(type, step) - end - - def find(type, name) - if @steps.find(type, name).nil? - @steps.add(type, - Step.new(name) do - raise Spec::Example::ExamplePendingError.new("Unimplemented step: #{name}") - end - ) - end - @steps.find(type, name) - end - - def clear - @steps.clear - end - - def empty? - @steps.empty? - end - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/story.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/story.rb deleted file mode 100644 index 112e9414b..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/story.rb +++ /dev/null @@ -1,42 +0,0 @@ -module Spec - module Story - class Story - attr_reader :title, :narrative - - def initialize(title, narrative, params = {}, &body) - @body = body - @title = title - @narrative = narrative - @params = params - end - - def [](key) - @params[key] - end - - def run_in(obj) - obj.instance_eval(&@body) - end - - def assign_steps_to(assignee) - if @params[:steps] - assignee.use(@params[:steps]) - else - case keys = @params[:steps_for] - when Symbol - keys = [keys] - when nil - keys = [] - end - keys.each do |key| - assignee.use(steps_for(key)) - end - end - end - - def steps_for(key) - $rspec_story_steps[key] - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/story/world.rb b/vendor/gems/rspec-1.1.2/lib/spec/story/world.rb deleted file mode 100644 index 6296537b8..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/story/world.rb +++ /dev/null @@ -1,124 +0,0 @@ -require 'rubygems' -require 'spec/expectations' -require 'spec/matchers' -require 'spec/example/pending' - -module Spec - module Story -=begin - A World represents the actual instance a scenario will run in. - - The runner ensures any instance variables and methods defined anywhere - in a story block are available to all the scenarios. This includes - variables that are created or referenced inside Given, When and Then - blocks. -=end - module World - include ::Spec::Example::Pending - include ::Spec::Matchers - # store steps and listeners in the singleton metaclass. - # This serves both to keep them out of the way of runtime Worlds - # and to make them available to all instances. - class << self - def create(cls = Object, *args) - cls.new(*args).extend(World) - end - - def listeners - @listeners ||= [] - end - - def add_listener(listener) - listeners() << listener - end - - def step_mother - @step_mother ||= StepMother.new - end - - def use(steps) - step_mother.use(steps) - end - - def step_names - @step_names ||= [] - end - - def run_given_scenario_with_suspended_listeners(world, type, name, scenario) - current_listeners = Array.new(listeners) - begin - listeners.each { |l| l.found_scenario(type, name) } - @listeners.clear - scenario.perform(world, name) unless ::Spec::Story::Runner.dry_run - ensure - @listeners.replace(current_listeners) - end - end - - def store_and_call(world, type, name, *args, &block) - if block_given? - step_mother.store(type, Step.new(name, &block)) - end - step = step_mother.find(type, name) - - step_name = step.name - step_names << step_name - - # It's important to have access to the parsed args here, so - # we can give them to the listeners. The HTML reporter needs - # the args so it can style them. See the generated output in - # story_server/prototype/rspec_stories.html (generated by rake stories) - args = step.parse_args(name) if args.empty? - begin - step.perform(world, *args) unless ::Spec::Story::Runner.dry_run - listeners.each { |l| l.step_succeeded(type, step_name, *args) } - rescue Exception => e - case e - when Spec::Example::ExamplePendingError - @listeners.each { |l| l.step_pending(type, step_name, *args) } - else - @listeners.each { |l| l.step_failed(type, step_name, *args) } - end - errors << e - end - end - - def errors - @errors ||= [] - end - end # end of class << self - - def start_collecting_errors - errors.clear - end - - def errors - World.errors - end - - def GivenScenario(name) - World.run_given_scenario_with_suspended_listeners(self, :'given scenario', name, GivenScenario.new(name)) - @__previous_step = :given - end - - def Given(name, *args, &block) - World.store_and_call self, :given, name, *args, &block - @__previous_step = :given - end - - def When(name, *args, &block) - World.store_and_call self, :when, name, *args, &block - @__previous_step = :when - end - - def Then(name, *args, &block) - World.store_and_call self, :then, name, *args, &block - @__previous_step = :then - end - - def And(name, *args, &block) - World.store_and_call self, @__previous_step, name, *args, &block - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/translator.rb b/vendor/gems/rspec-1.1.2/lib/spec/translator.rb deleted file mode 100644 index c1e07eda4..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/translator.rb +++ /dev/null @@ -1,114 +0,0 @@ -require 'fileutils' - -module Spec - class Translator - def translate(from, to) - from = File.expand_path(from) - to = File.expand_path(to) - if File.directory?(from) - translate_dir(from, to) - elsif(from =~ /\.rb$/) - translate_file(from, to) - end - end - - def translate_dir(from, to) - FileUtils.mkdir_p(to) unless File.directory?(to) - Dir["#{from}/*"].each do |sub_from| - path = sub_from[from.length+1..-1] - sub_to = File.join(to, path) - translate(sub_from, sub_to) - end - end - - def translate_file(from, to) - translation = "" - File.open(from) do |io| - io.each_line do |line| - translation << translate_line(line) - end - end - File.open(to, "w") do |io| - io.write(translation) - end - end - - def translate_line(line) - # Translate deprecated mock constraints - line.gsub!(/:any_args/, 'any_args') - line.gsub!(/:anything/, 'anything') - line.gsub!(/:boolean/, 'boolean') - line.gsub!(/:no_args/, 'no_args') - line.gsub!(/:numeric/, 'an_instance_of(Numeric)') - line.gsub!(/:string/, 'an_instance_of(String)') - - return line if line =~ /(should_not|should)_receive/ - - line.gsub!(/(^\s*)context([\s*|\(]['|"|A-Z])/, '\1describe\2') - line.gsub!(/(^\s*)specify([\s*|\(]['|"|A-Z])/, '\1it\2') - line.gsub!(/(^\s*)context_setup(\s*[do|\{])/, '\1before(:all)\2') - line.gsub!(/(^\s*)context_teardown(\s*[do|\{])/, '\1after(:all)\2') - line.gsub!(/(^\s*)setup(\s*[do|\{])/, '\1before(:each)\2') - line.gsub!(/(^\s*)teardown(\s*[do|\{])/, '\1after(:each)\2') - - if line =~ /(.*\.)(should_not|should)(?:_be)(?!_)(.*)/m - pre = $1 - should = $2 - post = $3 - be_or_equal = post =~ /(<|>)/ ? "be" : "equal" - - return "#{pre}#{should} #{be_or_equal}#{post}" - end - - if line =~ /(.*\.)(should_not|should)_(?!not)\s*(.*)/m - pre = $1 - should = $2 - post = $3 - - post.gsub!(/^raise/, 'raise_error') - post.gsub!(/^throw/, 'throw_symbol') - - unless standard_matcher?(post) - post = "be_#{post}" - end - - # Add parenthesis - post.gsub!(/^(\w+)\s+([\w|\.|\,|\(.*\)|\'|\"|\:|@| ]+)(\})/, '\1(\2)\3') # inside a block - post.gsub!(/^(redirect_to)\s+(.*)/, '\1(\2)') # redirect_to, which often has http: - post.gsub!(/^(\w+)\s+([\w|\.|\,|\(.*\)|\{.*\}|\'|\"|\:|@| ]+)/, '\1(\2)') - post.gsub!(/(\s+\))/, ')') - post.gsub!(/\)\}/, ') }') - post.gsub!(/^(\w+)\s+(\/.*\/)/, '\1(\2)') #regexps - line = "#{pre}#{should} #{post}" - end - - line - end - - def standard_matcher?(matcher) - patterns = [ - /^be/, - /^be_close/, - /^eql/, - /^equal/, - /^has/, - /^have/, - /^change/, - /^include/, - /^match/, - /^raise_error/, - /^respond_to/, - /^redirect_to/, - /^satisfy/, - /^throw_symbol/, - # Extra ones that we use in spec_helper - /^pass/, - /^fail/, - /^fail_with/, - ] - matched = patterns.detect{ |p| matcher =~ p } - !matched.nil? - end - - end -end diff --git a/vendor/gems/rspec-1.1.2/lib/spec/version.rb b/vendor/gems/rspec-1.1.2/lib/spec/version.rb deleted file mode 100644 index f83a4c697..000000000 --- a/vendor/gems/rspec-1.1.2/lib/spec/version.rb +++ /dev/null @@ -1,22 +0,0 @@ -module Spec - module VERSION - unless defined? MAJOR - MAJOR = 1 - MINOR = 1 - TINY = 2 - RELEASE_CANDIDATE = nil - - BUILD_TIME_UTC = 20080114022430 - - STRING = [MAJOR, MINOR, TINY].join('.') - TAG = "REL_#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('_')}".upcase.gsub(/\.|-/, '_') - FULL_VERSION = "#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('.')} (build #{BUILD_TIME_UTC})" - - NAME = "RSpec" - URL = "http://rspec.rubyforge.org/" - - DESCRIPTION = "#{NAME}-#{FULL_VERSION} - BDD for Ruby\n#{URL}" - end - end -end - diff --git a/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/flexmock.rb b/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/flexmock.rb deleted file mode 100644 index 6875a5222..000000000 --- a/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/flexmock.rb +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env ruby -# -# Created by Jim Weirich on 2007-04-10. -# Copyright (c) 2007. All rights reserved. - -require 'flexmock/rspec' - -module Spec - module Plugins - module MockFramework - include FlexMock::MockContainer - def setup_mocks_for_rspec - # No setup required - end - def verify_mocks_for_rspec - flexmock_verify - end - def teardown_mocks_for_rspec - flexmock_close - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/mocha.rb b/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/mocha.rb deleted file mode 100644 index 69d11636c..000000000 --- a/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/mocha.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'mocha/standalone' -require 'mocha/object' - -module Spec - module Plugins - module MockFramework - include Mocha::Standalone - def setup_mocks_for_rspec - mocha_setup - end - def verify_mocks_for_rspec - mocha_verify - end - def teardown_mocks_for_rspec - mocha_teardown - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/rr.rb b/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/rr.rb deleted file mode 100644 index c019c18a1..000000000 --- a/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/rr.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'rr' - -patterns = ::Spec::Runner::QuietBacktraceTweaker::IGNORE_PATTERNS -patterns.push(RR::Errors::BACKTRACE_IDENTIFIER) - -module Spec - module Plugins - module MockFramework - include RR::Extensions::InstanceMethods - def setup_mocks_for_rspec - RR::Space.instance.reset - end - def verify_mocks_for_rspec - RR::Space.instance.verify_doubles - end - def teardown_mocks_for_rspec - RR::Space.instance.reset - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/rspec.rb b/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/rspec.rb deleted file mode 100644 index ce215ace2..000000000 --- a/vendor/gems/rspec-1.1.2/plugins/mock_frameworks/rspec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "spec", "mocks")) - -module Spec - module Plugins - module MockFramework - include Spec::Mocks::ExampleMethods - def setup_mocks_for_rspec - $rspec_mocks ||= Spec::Mocks::Space.new - end - def verify_mocks_for_rspec - $rspec_mocks.verify_all - end - def teardown_mocks_for_rspec - $rspec_mocks.reset_all - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/autotest/discover_spec.rb b/vendor/gems/rspec-1.1.2/spec/autotest/discover_spec.rb deleted file mode 100644 index da5cb1445..000000000 --- a/vendor/gems/rspec-1.1.2/spec/autotest/discover_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require File.dirname(__FILE__) + "/../autotest_helper" - -module DiscoveryHelper - def load_discovery - require File.dirname(__FILE__) + "/../../lib/autotest/discover" - end -end - - -class Autotest - describe Rspec, "discovery" do - include DiscoveryHelper - - it "should add the rspec autotest plugin" do - Autotest.should_receive(:add_discovery).and_yield - load_discovery - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/autotest/rspec_spec.rb b/vendor/gems/rspec-1.1.2/spec/autotest/rspec_spec.rb deleted file mode 100644 index 64c020de9..000000000 --- a/vendor/gems/rspec-1.1.2/spec/autotest/rspec_spec.rb +++ /dev/null @@ -1,264 +0,0 @@ -require File.dirname(__FILE__) + "/../autotest_helper" - -class Autotest - - module AutotestHelper - def rspec_output - <<-HERE -.............PPF - -1) -'false should be false' FAILED -expected: true, - got: false (using ==) -./spec/autotest/rspec_spec.rb:203: - -Finished in 0.158674 seconds - -16 examples, 1 failure, 2 pending - -Pending: -Autotest::Rspec handling failed results should return an array of failed examples and errors (TODO) -Autotest::Rspec tests/specs for a given file should find all the specs for a given file (TODO) -HERE - end - - - def common_setup - @proc = mock Proc - @kernel = mock Kernel - @kernel.stub!(:proc).and_return @proc - - File.stub!(:exists).and_return true - @windows_alt_separator = "\\" - @posix_separator = '/' - - @rspec_output = rspec_output - end - end - - describe Rspec, "rspec_commands" do - it "should contain the various commands, ordered by preference" do - Rspec.new.spec_commands.should == [ - File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec"), - "#{Config::CONFIG['bindir']}/spec" - ] - end - end - - describe Rspec, "selection of rspec command" do - include AutotestHelper - - before :each do - common_setup - @rspec_autotest = Rspec.new - end - - it "should try to find the spec command if it exists in ./bin and use it above everything else" do - File.stub!(:exists?).and_return true - - spec_path = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec") - File.should_receive(:exists?).with(spec_path).and_return true - @rspec_autotest.spec_command.should == spec_path - end - - it "should otherwise select the default spec command in gem_dir/bin/spec" do - @rspec_autotest.stub!(:spec_commands).and_return ["/foo/spec"] - Config::CONFIG.stub!(:[]).and_return "/foo" - File.should_receive(:exists?).with("/foo/spec").and_return(true) - - @rspec_autotest.spec_command.should == "/foo/spec" - end - - it "should raise an error if no spec command is found at all" do - File.stub!(:exists?).and_return false - - lambda { - @rspec_autotest.spec_command - }.should raise_error(RspecCommandError, "No spec command could be found!") - end - - end - - describe Rspec, "selection of rspec command (windows compatibility issues)" do - include AutotestHelper - - before :each do - common_setup - end - - it "should use the ALT_SEPARATOR if it is non-nil" do - pending("autotest got re-worked so this is failing for the moment") - @rspec_autotest = Rspec.new - spec_command = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec") - @rspec_autotest.stub!(:spec_commands).and_return [spec_command] - @rspec_autotest.spec_command.should == spec_command.gsub('/', '\\') - end - - it "should not use the ALT_SEPATOR if it is nil" do - @windows_alt_separator = nil - @rspec_autotest = Rspec.new - spec_command = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec") - @rspec_autotest.stub!(:spec_commands).and_return [spec_command] - @rspec_autotest.spec_command.should == spec_command - end - end - - describe Rspec, "adding spec.opts --options" do - before :each do - @rspec_autotest = Rspec.new - end - - it "should return the command line option to add spec.opts if the options file exists" do - File.stub!(:exist?).and_return true - @rspec_autotest.add_options_if_present.should == "-O spec/spec.opts " - end - - it "should return an empty string if no spec.opts exists" do - File.stub!(:exist?).and_return false - Rspec.new.add_options_if_present.should == "" - end - end - - describe Rspec do - before :each do - @rspec_autotest = Rspec.new - @rspec_autotest.stub!(:ruby).and_return "ruby" - @rspec_autotest.stub!(:add_options_if_present).and_return "-O spec/spec.opts" - - @ruby = @rspec_autotest.ruby - @spec_command = @rspec_autotest.spec_command - @options = @rspec_autotest.add_options_if_present - @files_to_test = { - :spec => ["file_one", "file_two"] - } - # this is not the inner representation of Autotest! - @rspec_autotest.stub!(:files_to_test).and_return @files_to_test - @files_to_test.stub!(:keys).and_return @files_to_test[:spec] - @to_test = @files_to_test.keys.flatten.join ' ' - end - - it "should make the apropriate test command" do - @rspec_autotest.make_test_cmd(@files_to_test).should == "#{@ruby} -S #{@spec_command} #{@options} #{@to_test}" - end - end - - describe Rspec, "test mappings" do - before :each do - @rspec_autotest = Rspec.new - @rspec_autotest.hook :initialize - end - - it "should map all filenames in spec/ which end in .rb" do - @rspec_autotest.instance_eval{@test_mappings}.should have_key(%r%^spec/.*\.rb$%) - end - - it "should map all names in lib which end in .rb to the corresponding ones in spec/" do - @rspec_autotest.instance_eval{@test_mappings}.should have_key(%r%^lib/(.*)\.rb$%) - end - - it "should find all files in spec/shares/* and the spec helper in spec/spec_helper" do - @rspec_autotest.instance_eval{@test_mappings}.should have_key(%r%^spec/(spec_helper|shared/.*)\.rb$%) - end - end - - describe Rspec, "handling results" do - include AutotestHelper - - before :each do - common_setup - @rspec_autotest = Rspec.new - @rspec_autotest.stub!(:hook) - - @results = mock String - @results.stub!(:scan).and_return "" - end - - it "should call hook(:red) if there are failures" do - @rspec_autotest.stub!(:consolidate_failures).and_return ["spec/some_spec.rb"] - - @rspec_autotest.should_receive(:hook).with(:red) - @rspec_autotest.handle_results(@results) - end - - it "should call hook(:green) if there are no failures" do - @rspec_autotest.stub!(:consolidate_failures).and_return [] - @rspec_autotest.should_receive(:hook).with(:green) - @rspec_autotest.handle_results(@results) - end - end - - describe Rspec, "handling failed results" do - include AutotestHelper - - before :each do - common_setup - end - - it %(should scan the output into a multi-dimensional array, - consisting of the failing spec's name as the first element, - and the failure as the second) do - @rspec_autotest = Rspec.new - @rspec_autotest.failed_results(@rspec_output).should == [ - [ - "false should be false", - "expected: true,\n got: false (using ==)\n./spec/autotest/rspec_spec.rb:203:" - ] - ] - end - end - - describe Rspec, "specs for a given file" do - before :each do - @lib_file = "lib/something.rb" - @spec_file = "spec/something_spec.rb" - @rspec_autotest = Rspec.new - @rspec_autotest.hook :initialize - - @rspec_autotest.instance_variable_set("@files", {@lib_file => Time.now, @spec_file => Time.now}) - @rspec_autotest.stub!(:find_files_to_test).and_return true - end - - it "should find the spec file for a given lib file" do - @rspec_autotest.specs_for_file(@lib_file).should == [@spec_file] - end - - it "should find the spec file if given a spec file" do - @rspec_autotest.specs_for_file(@spec_file).should == [@spec_file] - end - - it "should only find the file if the file is being tracked (in @file)" do - @other_file = "lib/some_non_tracked_file" - @rspec_autotest.specs_for_file(@other_file).should == [] - end - end - - describe Rspec, "consolidating failures" do - include AutotestHelper - - before :each do - common_setup - @rspec_autotest = Rspec.new - - @spec_file = "./spec/autotest/rspec_spec.rb" - @rspec_autotest.instance_variable_set("@files", {@spec_file => Time.now}) - @rspec_autotest.stub!(:find_files_to_test).and_return true - end - - it "should return no failures if no failures were given in the output" do - @rspec_autotest.stub!(:failed_results).and_return [[]] - @rspec_autotest.consolidate_failures(@rspec_autotest.failed_results).should == {} - end - - it "should return a hash with the spec filename => spec name for each failure or error" do - @rspec_autotest.stub!(:failed_results).and_return([ - [ - "false should be false", - "expected: true,\n got: false (using ==)\n./spec/autotest/rspec_spec.rb:203:" - ] - ]) - @rspec_autotest.consolidate_failures(@rspec_autotest.failed_results).should == {@spec_file => ["false should be false"]} - end - - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/autotest_helper.rb b/vendor/gems/rspec-1.1.2/spec/autotest_helper.rb deleted file mode 100644 index 6d994eaa2..000000000 --- a/vendor/gems/rspec-1.1.2/spec/autotest_helper.rb +++ /dev/null @@ -1,5 +0,0 @@ -require "rubygems" -require 'autotest' -dir = File.dirname(__FILE__) -require "#{dir}/spec_helper" -require File.expand_path("#{dir}/../lib/autotest/rspec") \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/rspec_suite.rb b/vendor/gems/rspec-1.1.2/spec/rspec_suite.rb deleted file mode 100644 index ae076bbf1..000000000 --- a/vendor/gems/rspec-1.1.2/spec/rspec_suite.rb +++ /dev/null @@ -1,7 +0,0 @@ -if __FILE__ == $0 - dir = File.dirname(__FILE__) - Dir["#{dir}/**/*_spec.rb"].each do |file| -# puts "require '#{file}'" - require file - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/ruby_forker.rb b/vendor/gems/rspec-1.1.2/spec/ruby_forker.rb deleted file mode 100644 index 6ab038750..000000000 --- a/vendor/gems/rspec-1.1.2/spec/ruby_forker.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'rbconfig' - -module RubyForker - # Forks a ruby interpreter with same type as ourself. - # juby will fork jruby, ruby will fork ruby etc. - def ruby(args, stderr=nil) - config = ::Config::CONFIG - interpreter = File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT'] - cmd = "#{interpreter} #{args}" - cmd << " 2> #{stderr}" unless stderr.nil? - `#{cmd}` - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/configuration_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/configuration_spec.rb deleted file mode 100644 index 5b4a6049e..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/configuration_spec.rb +++ /dev/null @@ -1,282 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Example - - describe Configuration do - before(:each) do - @config = Configuration.new - @example_group = mock("example_group") - end - - describe "#mock_with" do - - it "should default mock framework to rspec" do - @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rspec$/ - end - - it "should let you set rspec mocking explicitly" do - @config.mock_with(:rspec) - @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rspec$/ - end - - it "should let you set mocha" do - @config.mock_with(:mocha) - @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/mocha$/ - end - - it "should let you set flexmock" do - @config.mock_with(:flexmock) - @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/flexmock$/ - end - - it "should let you set rr" do - @config.mock_with(:rr) - @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rr$/ - end - - it "should let you set an arbitrary adapter module" do - adapter = Module.new - @config.mock_with(adapter) - @config.mock_framework.should == adapter - end - end - - describe "#include" do - - before do - @original_configuration = Spec::Runner.configuration - spec_configuration = @config - Spec::Runner.instance_eval {@configuration = spec_configuration} - @example_group_class = Class.new(ExampleGroup) do - class << self - def this_class_has_special_methods - end - end - end - ExampleGroupFactory.register(:foobar, @example_group_class) - end - - after do - original_configuration = @original_configuration - Spec::Runner.instance_eval {@configuration = original_configuration} - ExampleGroupFactory.reset - end - - it "should include the submitted module in ExampleGroup subclasses" do - mod = Module.new - @config.include mod - Class.new(@example_group_class).included_modules.should include(mod) - end - - it "should let you define modules to be included for a specific type" do - mod = Module.new - @config.include mod, :type => :foobar - Class.new(@example_group_class).included_modules.should include(mod) - end - - it "should not include modules in a type they are not intended for" do - mod = Module.new - @other_example_group_class = Class.new(ExampleGroup) - ExampleGroupFactory.register(:baz, @other_example_group_class) - - @config.include mod, :type => :foobar - - Class.new(@other_example_group_class).included_modules.should_not include(mod) - end - - end - - end - - describe Configuration do - - before(:each) do - @config = Configuration.new - @special_example_group = Class.new(ExampleGroup) - @special_child_example_group = Class.new(@special_example_group) - @nonspecial_example_group = Class.new(ExampleGroup) - ExampleGroupFactory.register(:special, @special_example_group) - ExampleGroupFactory.register(:special_child, @special_child_example_group) - ExampleGroupFactory.register(:non_special, @nonspecial_example_group) - @example_group = @special_child_example_group.describe "Special Example Group" - @unselected_example_group = Class.new(@nonspecial_example_group).describe "Non Special Example Group" - end - - after(:each) do - ExampleGroupFactory.reset - end - - describe "#prepend_before" do - it "prepends the before block on all instances of the passed in type" do - order = [] - @config.prepend_before(:all) do - order << :prepend__before_all - end - @config.prepend_before(:all, :type => :special) do - order << :special_prepend__before_all - end - @config.prepend_before(:all, :type => :special_child) do - order << :special_child_prepend__before_all - end - @config.prepend_before(:each) do - order << :prepend__before_each - end - @config.prepend_before(:each, :type => :special) do - order << :special_prepend__before_each - end - @config.prepend_before(:each, :type => :special_child) do - order << :special_child_prepend__before_each - end - @config.prepend_before(:all, :type => :non_special) do - order << :special_prepend__before_all - end - @config.prepend_before(:each, :type => :non_special) do - order << :special_prepend__before_each - end - @example_group.it "calls prepend_before" do - end - - @example_group.run - order.should == [ - :prepend__before_all, - :special_prepend__before_all, - :special_child_prepend__before_all, - :prepend__before_each, - :special_prepend__before_each, - :special_child_prepend__before_each - ] - end - end - - describe "#append_before" do - - it "calls append_before on the type" do - order = [] - @config.append_before(:all) do - order << :append_before_all - end - @config.append_before(:all, :type => :special) do - order << :special_append_before_all - end - @config.append_before(:all, :type => :special_child) do - order << :special_child_append_before_all - end - @config.append_before(:each) do - order << :append_before_each - end - @config.append_before(:each, :type => :special) do - order << :special_append_before_each - end - @config.append_before(:each, :type => :special_child) do - order << :special_child_append_before_each - end - @config.append_before(:all, :type => :non_special) do - order << :special_append_before_all - end - @config.append_before(:each, :type => :non_special) do - order << :special_append_before_each - end - @example_group.it "calls append_before" do - end - - @example_group.run - order.should == [ - :append_before_all, - :special_append_before_all, - :special_child_append_before_all, - :append_before_each, - :special_append_before_each, - :special_child_append_before_each - ] - end - end - - describe "#prepend_after" do - - it "prepends the after block on all instances of the passed in type" do - order = [] - @config.prepend_after(:all) do - order << :prepend__after_all - end - @config.prepend_after(:all, :type => :special) do - order << :special_prepend__after_all - end - @config.prepend_after(:all, :type => :special) do - order << :special_child_prepend__after_all - end - @config.prepend_after(:each) do - order << :prepend__after_each - end - @config.prepend_after(:each, :type => :special) do - order << :special_prepend__after_each - end - @config.prepend_after(:each, :type => :special) do - order << :special_child_prepend__after_each - end - @config.prepend_after(:all, :type => :non_special) do - order << :special_prepend__after_all - end - @config.prepend_after(:each, :type => :non_special) do - order << :special_prepend__after_each - end - @example_group.it "calls prepend_after" do - end - - @example_group.run - order.should == [ - :special_child_prepend__after_each, - :special_prepend__after_each, - :prepend__after_each, - :special_child_prepend__after_all, - :special_prepend__after_all, - :prepend__after_all - ] - end - end - - describe "#append_after" do - - it "calls append_after on the type" do - order = [] - @config.append_after(:all) do - order << :append__after_all - end - @config.append_after(:all, :type => :special) do - order << :special_append__after_all - end - @config.append_after(:all, :type => :special_child) do - order << :special_child_append__after_all - end - @config.append_after(:each) do - order << :append__after_each - end - @config.append_after(:each, :type => :special) do - order << :special_append__after_each - end - @config.append_after(:each, :type => :special_child) do - order << :special_child_append__after_each - end - @config.append_after(:all, :type => :non_special) do - order << :non_special_append_after_all - end - @config.append_after(:each, :type => :non_special) do - order << :non_special_append_after_each - end - @example_group.it "calls append_after" do - end - - @example_group.run - order.should == [ - :special_child_append__after_each, - :special_append__after_each, - :append__after_each, - :special_child_append__after_all, - :special_append__after_all, - :append__after_all - ] - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_class_definition_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_class_definition_spec.rb deleted file mode 100644 index 0b00e1397..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_class_definition_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - class ExampleGroupSubclass < ExampleGroup - class << self - attr_accessor :examples_ran - end - - @@klass_variable_set = true - CONSTANT = :foobar - - before do - @instance_variable = :hello - end - - it "should run" do - self.class.examples_ran = true - end - - it "should have access to instance variables" do - @instance_variable.should == :hello - end - - it "should have access to class variables" do - @@klass_variable_set.should == true - end - - it "should have access to constants" do - CONSTANT.should == :foobar - end - - it "should have access to methods defined in the Example Group" do - a_method.should == 22 - end - - def a_method - 22 - end - end - - describe ExampleGroupSubclass do - it "should run" do - ExampleGroupSubclass.examples_ran.should be_true - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_factory_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_factory_spec.rb deleted file mode 100644 index 3b50011f7..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_factory_spec.rb +++ /dev/null @@ -1,129 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - describe ExampleGroupFactory, "with :foobar registered as custom type" do - - before do - @example_group = Class.new(ExampleGroup) - ExampleGroupFactory.register(:foobar, @example_group) - end - - after do - ExampleGroupFactory.reset - end - - it "should #get the default ExampleGroup type when passed nil" do - ExampleGroupFactory.get(nil).should == ExampleGroup - end - - it "should #get the default ExampleGroup for unregistered non-nil values" do - ExampleGroupFactory.get(:does_not_exist).should == ExampleGroup - end - - it "should #get custom type for :foobar" do - ExampleGroupFactory.get(:foobar).should == @example_group - end - - it "should #get the actual type when that is passed in" do - ExampleGroupFactory.get(@example_group).should == @example_group - end - - end - - describe ExampleGroupFactory, "#create_example_group" do - it "should create a uniquely named class" do - example_group = Spec::Example::ExampleGroupFactory.create_example_group("example_group") {} - example_group.name.should =~ /Spec::Example::ExampleGroup::Subclass_\d+/ - end - - it "should create a Spec::Example::Example subclass by default" do - example_group = Spec::Example::ExampleGroupFactory.create_example_group("example_group") {} - example_group.superclass.should == Spec::Example::ExampleGroup - end - - it "should create a Spec::Example::Example when :type => :default" do - example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "example_group", :type => :default - ) {} - example_group.superclass.should == Spec::Example::ExampleGroup - end - - it "should create a Spec::Example::Example when :type => :default" do - example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "example_group", :type => :default - ) {} - example_group.superclass.should == Spec::Example::ExampleGroup - end - - it "should create specified type when :type => :something_other_than_default" do - klass = Class.new(ExampleGroup) do - def initialize(*args, &block); end - end - Spec::Example::ExampleGroupFactory.register(:something_other_than_default, klass) - example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "example_group", :type => :something_other_than_default - ) {} - example_group.superclass.should == klass - end - - it "should create a type indicated by :spec_path" do - klass = Class.new(ExampleGroup) do - def initialize(*args, &block); end - end - Spec::Example::ExampleGroupFactory.register(:something_other_than_default, klass) - example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "example_group", :spec_path => "./spec/something_other_than_default/some_spec.rb" - ) {} - example_group.superclass.should == klass - end - - it "should create a type indicated by :spec_path (with spec_path generated by caller on windows)" do - klass = Class.new(ExampleGroup) do - def initialize(*args, &block); end - end - Spec::Example::ExampleGroupFactory.register(:something_other_than_default, klass) - example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "example_group", :spec_path => "./spec\\something_other_than_default\\some_spec.rb" - ) {} - example_group.superclass.should == klass - end - - it "should create and register a Spec::Example::Example if :shared => true" do - shared_example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "name", :spec_path => '/blah/spec/models/blah.rb', :type => :controller, :shared => true - ) {} - shared_example_group.should be_an_instance_of(Spec::Example::SharedExampleGroup) - SharedExampleGroup.shared_example_groups.should include(shared_example_group) - end - - it "should favor the :type over the :spec_path" do - klass = Class.new(ExampleGroup) do - def initialize(*args, &block); end - end - Spec::Example::ExampleGroupFactory.register(:something_other_than_default, klass) - example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "name", :spec_path => '/blah/spec/models/blah.rb', :type => :something_other_than_default - ) {} - example_group.superclass.should == klass - end - - it "should register ExampleGroup by default" do - example_group = Spec::Example::ExampleGroupFactory.create_example_group("The ExampleGroup") do - end - rspec_options.example_groups.should include(example_group) - end - - it "should enable unregistering of ExampleGroups" do - example_group = Spec::Example::ExampleGroupFactory.create_example_group("The ExampleGroup") do - unregister - end - rspec_options.example_groups.should_not include(example_group) - end - - after(:each) do - Spec::Example::ExampleGroupFactory.reset - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_methods_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_methods_spec.rb deleted file mode 100644 index fa08e6fca..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_methods_spec.rb +++ /dev/null @@ -1,480 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - describe 'ExampleGroupMethods' do - it_should_behave_like "sandboxed rspec_options" - attr_reader :example_group, :result, :reporter - before(:each) do - options.formatters << mock("formatter", :null_object => true) - options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true) - @reporter = FakeReporter.new(@options) - options.reporter = reporter - @example_group = Class.new(ExampleGroup) do - describe("ExampleGroup") - it "does nothing" - end - class << example_group - public :include - end - @result = nil - end - - after(:each) do - ExampleGroup.reset - end - - describe "#describe" do - attr_reader :child_example_group - before do - @child_example_group = @example_group.describe("Another ExampleGroup") do - it "should pass" do - true.should be_true - end - end - end - - it "should create a subclass of the ExampleGroup when passed a block" do - child_example_group.superclass.should == @example_group - @options.example_groups.should include(child_example_group) - end - - it "should not inherit examples" do - child_example_group.examples.length.should == 1 - end - end - - describe "#it" do - it "should should create an example instance" do - lambda { - @example_group.it("") - }.should change { @example_group.examples.length }.by(1) - end - end - - describe "#xit" do - before(:each) do - Kernel.stub!(:warn) - end - - it "should NOT should create an example instance" do - lambda { - @example_group.xit("") - }.should_not change(@example_group.examples, :length) - end - - it "should warn that it is disabled" do - Kernel.should_receive(:warn).with("Example disabled: foo") - @example_group.xit("foo") - end - end - - describe "#examples" do - it "should have Examples" do - example_group = Class.new(ExampleGroup) do - describe('example') - it "should pass" do - 1.should == 1 - end - end - example_group.examples.length.should == 1 - example_group.examples.first.description.should == "should pass" - end - - it "should not include methods that begin with test (only when TU interop is loaded)" do - example_group = Class.new(ExampleGroup) do - describe('example') - def test_any_args(*args) - true.should be_true - end - def test_something - 1.should == 1 - end - def test - raise "This is not a real test" - end - def testify - raise "This is not a real test" - end - end - example_group.examples.length.should == 0 - example_group.run.should be_true - end - - it "should include methods that begin with should and has an arity of 0 in suite" do - example_group = Class.new(ExampleGroup) do - describe('example') - def shouldCamelCase - true.should be_true - end - def should_any_args(*args) - true.should be_true - end - def should_something - 1.should == 1 - end - def should_not_something - 1.should_not == 2 - end - def should - raise "This is not a real example" - end - def should_not - raise "This is not a real example" - end - end - example_group = example_group.dup - example_group.examples.length.should == 4 - descriptions = example_group.examples.collect {|example| example.description}.sort - descriptions.should include("shouldCamelCase") - descriptions.should include("should_any_args") - descriptions.should include("should_something") - descriptions.should include("should_not_something") - end - - it "should not include methods that begin with test_ and has an arity > 0 in suite" do - example_group = Class.new(ExampleGroup) do - describe('example') - def test_invalid(foo) - 1.should == 1 - end - def testInvalidCamelCase(foo) - 1.should == 1 - end - end - example_group.examples.length.should == 0 - end - - it "should not include methods that begin with should_ and has an arity > 0 in suite" do - example_group = Class.new(ExampleGroup) do - describe('example') - def should_invalid(foo) - 1.should == 2 - end - def shouldInvalidCamelCase(foo) - 1.should == 3 - end - def should_not_invalid(foo) - 1.should == 4 - end - def should_valid - 1.should == 1 - end - end - example_group.examples.length.should == 1 - example_group.run.should be_true - end - - it "should run should_methods" do - example_group = Class.new(ExampleGroup) do - def should_valid - 1.should == 2 - end - end - example_group.examples.length.should == 1 - example_group.run.should be_false - end - end - - describe "#set_description" do - attr_reader :example_group - before do - class << example_group - public :set_description - end - end - - describe "#set_description(String)" do - before(:each) do - example_group.set_description("abc") - end - - specify ".description should return the String passed into .set_description" do - example_group.description.should == "abc" - end - - specify ".described_type should provide nil as its type" do - example_group.described_type.should be_nil - end - end - - describe "#set_description(Type)" do - before(:each) do - example_group.set_description(ExampleGroup) - end - - specify ".description should return a String representation of that type (fully qualified) as its name" do - example_group.description.should == "Spec::Example::ExampleGroup" - end - - specify ".described_type should return the passed in type" do - example_group.described_type.should == Spec::Example::ExampleGroup - end - end - - describe "#set_description(String, Type)" do - before(:each) do - example_group.set_description("behaving", ExampleGroup) - end - - specify ".description should return String then space then Type" do - example_group.description.should == "behaving Spec::Example::ExampleGroup" - end - - specify ".described_type should return the passed in type" do - example_group.described_type.should == Spec::Example::ExampleGroup - end - end - - describe "#set_description(Type, String not starting with a space)" do - before(:each) do - example_group.set_description(ExampleGroup, "behaving") - end - - specify ".description should return the Type then space then String" do - example_group.description.should == "Spec::Example::ExampleGroup behaving" - end - end - - describe "#set_description(Type, String starting with .)" do - before(:each) do - example_group.set_description(ExampleGroup, ".behaving") - end - - specify ".description should return the Type then String" do - example_group.description.should == "Spec::Example::ExampleGroup.behaving" - end - end - - describe "#set_description(Type, String containing .)" do - before(:each) do - example_group.set_description(ExampleGroup, "calling a.b") - end - - specify ".description should return the Type then space then String" do - example_group.description.should == "Spec::Example::ExampleGroup calling a.b" - end - end - - describe "#set_description(Type, String starting with .)" do - before(:each) do - example_group.set_description(ExampleGroup, ".behaving") - end - - specify "should return the Type then String" do - example_group.description.should == "Spec::Example::ExampleGroup.behaving" - end - end - - describe "#set_description(Type, String containing .)" do - before(:each) do - example_group.set_description(ExampleGroup, "is #1") - end - - specify ".description should return the Type then space then String" do - example_group.description.should == "Spec::Example::ExampleGroup is #1" - end - end - - describe "#set_description(String, Type, String)" do - before(:each) do - example_group.set_description("A", Hash, "with one entry") - end - - specify ".description should return the first String then space then Type then second String" do - example_group.description.should == "A Hash with one entry" - end - end - - describe "#set_description(Hash representing options)" do - before(:each) do - example_group.set_description(:a => "b", :spec_path => "blah") - end - - it ".spec_path should expand the passed in :spec_path option passed into the constructor" do - example_group.spec_path.should == File.expand_path("blah") - end - - it ".description_options should return all the options passed in" do - example_group.description_options.should == {:a => "b", :spec_path => "blah"} - end - - end - end - - describe "#description" do - it "should return the same description instance for each call" do - example_group.description.should eql(example_group.description) - end - - it "should not add a space when description_text begins with #" do - child_example_group = Class.new(example_group) do - describe("#foobar", "Does something") - end - child_example_group.description.should == "ExampleGroup#foobar Does something" - end - - it "should not add a space when description_text begins with ." do - child_example_group = Class.new(example_group) do - describe(".foobar", "Does something") - end - child_example_group.description.should == "ExampleGroup.foobar Does something" - end - - it "should return the class name if nil" do - example_group.set_description(nil) - example_group.description.should =~ /Class:/ - end - - it "should return the class name if nil" do - example_group.set_description("") - example_group.description.should =~ /Class:/ - end - end - - describe "#description_parts" do - it "should return an Array of the current class description args" do - example_group.description_parts.should == [example_group.description] - end - - it "should return an Array of the description args from each class in the hierarchy" do - child_example_group = Class.new(example_group) - child_example_group.describe("Child", ExampleGroup) - child_example_group.description.should_not be_empty - - grand_child_example_group = Class.new(child_example_group) - grand_child_example_group.describe("GrandChild", ExampleGroup) - grand_child_example_group.description.should_not be_empty - - grand_child_example_group.description_parts.should == [ - "ExampleGroup", - "Child", - Spec::Example::ExampleGroup, - "GrandChild", - Spec::Example::ExampleGroup - ] - end - end - - describe "#described_type" do - it "should return passed in type" do - child_example_group = Class.new(example_group) do - describe Object - end - child_example_group.described_type.should == Object - end - - it "should return #described_type of superclass when no passed in type" do - parent_example_group = Class.new(ExampleGroup) do - describe Object, "#foobar" - end - child_example_group = Class.new(parent_example_group) do - describe "not a type" - end - child_example_group.described_type.should == Object - end - end - - describe "#remove_after" do - it "should unregister a given after(:each) block" do - after_all_ran = false - @example_group.it("example") {} - proc = Proc.new { after_all_ran = true } - ExampleGroup.after(:each, &proc) - @example_group.run - after_all_ran.should be_true - - after_all_ran = false - ExampleGroup.remove_after(:each, &proc) - @example_group.run - after_all_ran.should be_false - end - end - - describe "#include" do - it "should have accessible class methods from included module" do - mod1_method_called = false - mod1 = Module.new do - class_methods = Module.new do - define_method :mod1_method do - mod1_method_called = true - end - end - - metaclass.class_eval do - define_method(:included) do |receiver| - receiver.extend class_methods - end - end - end - - mod2_method_called = false - mod2 = Module.new do - class_methods = Module.new do - define_method :mod2_method do - mod2_method_called = true - end - end - - metaclass.class_eval do - define_method(:included) do |receiver| - receiver.extend class_methods - end - end - end - - @example_group.include mod1, mod2 - - @example_group.mod1_method - @example_group.mod2_method - mod1_method_called.should be_true - mod2_method_called.should be_true - end - end - - describe "#number_of_examples" do - it "should count number of specs" do - proc do - @example_group.it("one") {} - @example_group.it("two") {} - @example_group.it("three") {} - @example_group.it("four") {} - end.should change {@example_group.number_of_examples}.by(4) - end - end - - describe "#class_eval" do - it "should allow constants to be defined" do - example_group = Class.new(ExampleGroup) do - describe('example') - FOO = 1 - it "should reference FOO" do - FOO.should == 1 - end - end - example_group.run - Object.const_defined?(:FOO).should == false - end - end - - describe '#register' do - it "should add ExampleGroup to set of ExampleGroups to be run" do - example_group.register - options.example_groups.should include(example_group) - end - end - - describe '#unregister' do - before do - example_group.register - options.example_groups.should include(example_group) - end - - it "should remove ExampleGroup from set of ExampleGroups to be run" do - example_group.unregister - options.example_groups.should_not include(example_group) - end - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_spec.rb deleted file mode 100644 index 93e558a97..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/example_group_spec.rb +++ /dev/null @@ -1,711 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - class ExampleModuleScopingSpec < ExampleGroup - describe ExampleGroup, "via a class definition" - - module Foo - module Bar - def self.loaded? - true - end - end - end - include Foo - - it "should understand module scoping" do - Bar.should be_loaded - end - - @@foo = 1 - - it "should allow class variables to be defined" do - @@foo.should == 1 - end - end - - class ExampleClassVariablePollutionSpec < ExampleGroup - describe ExampleGroup, "via a class definition without a class variable" - - it "should not retain class variables from other Example classes" do - proc do - @@foo - end.should raise_error - end - end - - describe ExampleGroup, "#pending" do - it "should raise a Pending error when its block fails" do - block_ran = false - lambda { - pending("something") do - block_ran = true - raise "something wrong with my example" - end - }.should raise_error(Spec::Example::ExamplePendingError, "something") - block_ran.should == true - end - - it "should raise Spec::Example::PendingExampleFixedError when its block does not fail" do - block_ran = false - lambda { - pending("something") do - block_ran = true - end - }.should raise_error(Spec::Example::PendingExampleFixedError, "Expected pending 'something' to fail. No Error was raised.") - block_ran.should == true - end - end - - describe ExampleGroup, "#run with failure in example", :shared => true do - it "should add an example failure to the TestResult" do - example_group.run.should be_false - end - end - - describe ExampleGroup, "#run" do - it_should_behave_like "sandboxed rspec_options" - attr_reader :example_group, :formatter, :reporter - before :each do - @formatter = mock("formatter", :null_object => true) - options.formatters << formatter - options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true) - @reporter = FakeReporter.new(options) - options.reporter = reporter - @example_group = Class.new(ExampleGroup) do - describe("example") - it "does nothing" do - end - end - class << example_group - public :include - end - end - - after :each do - ExampleGroup.reset - end - - it "should not run when there are no examples" do - example_group = Class.new(ExampleGroup) do - describe("Foobar") - end - example_group.examples.should be_empty - - reporter = mock("Reporter") - reporter.should_not_receive(:add_example_group) - example_group.run - end - - describe "when before_each fails" do - before(:each) do - $example_ran = $after_each_ran = false - @example_group = describe("Foobar") do - before(:each) {raise} - it "should not be run" do - $example_ran = true - end - after(:each) do - $after_each_ran = true - end - end - end - - it "should not run example block" do - example_group.run - $example_ran.should be_false - end - - it "should run after_each" do - example_group.run - $after_each_ran.should be_true - end - - it "should report failure location when in before_each" do - reporter.should_receive(:example_finished) do |example_group, error| - error.message.should eql("in before_each") - end - example_group.run - end - end - - describe ExampleGroup, "#run on dry run" do - before do - @options.dry_run = true - end - - it "should not run before(:all) or after(:all)" do - before_all_ran = false - after_all_ran = false - ExampleGroup.before(:all) { before_all_ran = true } - ExampleGroup.after(:all) { after_all_ran = true } - example_group.it("should") {} - example_group.run - before_all_ran.should be_false - after_all_ran.should be_false - end - - it "should not run example" do - example_ran = false - example_group.it("should") {example_ran = true} - example_group.run - example_ran.should be_false - end - end - - describe ExampleGroup, "#run with specified examples" do - attr_reader :examples_that_were_run - before do - @examples_that_were_run = [] - end - - describe "when specified_examples matches entire ExampleGroup" do - before do - examples_that_were_run = @examples_that_were_run - @example_group = Class.new(ExampleGroup) do - describe("the ExampleGroup") - it("should be run") do - examples_that_were_run << 'should be run' - end - - it("should also be run") do - examples_that_were_run << 'should also be run' - end - end - options.examples = ["the ExampleGroup"] - end - - it "should not run the Examples in the ExampleGroup" do - example_group.run - examples_that_were_run.should == ['should be run', 'should also be run'] - end - end - - describe ExampleGroup, "#run when specified_examples matches only Example description" do - before do - examples_that_were_run = @examples_that_were_run - @example_group = Class.new(ExampleGroup) do - describe("example") - it("should be run") do - examples_that_were_run << 'should be run' - end - end - options.examples = ["should be run"] - end - - it "should not run the example" do - example_group.run - examples_that_were_run.should == ['should be run'] - end - end - - describe ExampleGroup, "#run when specified_examples does not match an Example description" do - before do - examples_that_were_run = @examples_that_were_run - @example_group = Class.new(ExampleGroup) do - describe("example") - it("should be something else") do - examples_that_were_run << 'should be something else' - end - end - options.examples = ["does not match anything"] - end - - it "should not run the example" do - example_group.run - examples_that_were_run.should == [] - end - end - - describe ExampleGroup, "#run when specified_examples matches an Example description" do - before do - examples_that_were_run = @examples_that_were_run - @example_group = Class.new(ExampleGroup) do - describe("example") - it("should be run") do - examples_that_were_run << 'should be run' - end - it("should not be run") do - examples_that_were_run << 'should not be run' - end - end - options.examples = ["should be run"] - end - - it "should run only the example, when there in only one" do - example_group.run - examples_that_were_run.should == ["should be run"] - end - - it "should run only the one example" do - example_group.run - examples_that_were_run.should == ["should be run"] end - end - end - - describe ExampleGroup, "#run with success" do - before do - @special_example_group = Class.new(ExampleGroup) - ExampleGroupFactory.register(:special, @special_example_group) - @not_special_example_group = Class.new(ExampleGroup) - ExampleGroupFactory.register(:not_special, @not_special_example_group) - end - - after do - ExampleGroupFactory.reset - end - - it "should send reporter add_example_group" do - example_group.run - reporter.example_groups.should == [example_group] - end - - it "should run example on run" do - example_ran = false - example_group.it("should") {example_ran = true} - example_group.run - example_ran.should be_true - end - - it "should run before(:all) block only once" do - before_all_run_count_run_count = 0 - example_group.before(:all) {before_all_run_count_run_count += 1} - example_group.it("test") {true} - example_group.it("test2") {true} - example_group.run - before_all_run_count_run_count.should == 1 - end - - it "should run after(:all) block only once" do - after_all_run_count = 0 - example_group.after(:all) {after_all_run_count += 1} - example_group.it("test") {true} - example_group.it("test2") {true} - example_group.run - after_all_run_count.should == 1 - @reporter.rspec_verify - end - - it "after(:all) should have access to all instance variables defined in before(:all)" do - context_instance_value_in = "Hello there" - context_instance_value_out = "" - example_group.before(:all) { @instance_var = context_instance_value_in } - example_group.after(:all) { context_instance_value_out = @instance_var } - example_group.it("test") {true} - example_group.run - context_instance_value_in.should == context_instance_value_out - end - - it "should copy instance variables from before(:all)'s execution context into spec's execution context" do - context_instance_value_in = "Hello there" - context_instance_value_out = "" - example_group.before(:all) { @instance_var = context_instance_value_in } - example_group.it("test") {context_instance_value_out = @instance_var} - example_group.run - context_instance_value_in.should == context_instance_value_out - end - - it "should not add global before callbacks for untargetted example_group" do - fiddle = [] - - ExampleGroup.before(:all) { fiddle << "Example.before(:all)" } - ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" } - @special_example_group.before(:each) { fiddle << "Example.before(:each, :type => :special)" } - @special_example_group.prepend_before(:each) { fiddle << "Example.prepend_before(:each, :type => :special)" } - @special_example_group.before(:all) { fiddle << "Example.before(:all, :type => :special)" } - @special_example_group.prepend_before(:all) { fiddle << "Example.prepend_before(:all, :type => :special)" } - - example_group = Class.new(ExampleGroup) do - describe("I'm not special", :type => :not_special) - it "does nothing" - end - example_group.run - fiddle.should == [ - 'Example.prepend_before(:all)', - 'Example.before(:all)', - ] - end - - it "should add global before callbacks for targetted example_groups" do - fiddle = [] - - ExampleGroup.before(:all) { fiddle << "Example.before(:all)" } - ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" } - @special_example_group.before(:each) { fiddle << "special.before(:each, :type => :special)" } - @special_example_group.prepend_before(:each) { fiddle << "special.prepend_before(:each, :type => :special)" } - @special_example_group.before(:all) { fiddle << "special.before(:all, :type => :special)" } - @special_example_group.prepend_before(:all) { fiddle << "special.prepend_before(:all, :type => :special)" } - @special_example_group.append_before(:each) { fiddle << "special.append_before(:each, :type => :special)" } - - example_group = Class.new(@special_example_group).describe("I'm a special example_group") {} - example_group.it("test") {true} - example_group.run - fiddle.should == [ - 'Example.prepend_before(:all)', - 'Example.before(:all)', - 'special.prepend_before(:all, :type => :special)', - 'special.before(:all, :type => :special)', - 'special.prepend_before(:each, :type => :special)', - 'special.before(:each, :type => :special)', - 'special.append_before(:each, :type => :special)', - ] - end - - it "should order before callbacks from global to local" do - fiddle = [] - ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" } - ExampleGroup.before(:all) { fiddle << "Example.before(:all)" } - example_group.prepend_before(:all) { fiddle << "prepend_before(:all)" } - example_group.before(:all) { fiddle << "before(:all)" } - example_group.prepend_before(:each) { fiddle << "prepend_before(:each)" } - example_group.before(:each) { fiddle << "before(:each)" } - example_group.run - fiddle.should == [ - 'Example.prepend_before(:all)', - 'Example.before(:all)', - 'prepend_before(:all)', - 'before(:all)', - 'prepend_before(:each)', - 'before(:each)' - ] - end - - it "should order after callbacks from local to global" do - fiddle = [] - example_group.after(:each) { fiddle << "after(:each)" } - example_group.append_after(:each) { fiddle << "append_after(:each)" } - example_group.after(:all) { fiddle << "after(:all)" } - example_group.append_after(:all) { fiddle << "append_after(:all)" } - ExampleGroup.after(:all) { fiddle << "Example.after(:all)" } - ExampleGroup.append_after(:all) { fiddle << "Example.append_after(:all)" } - example_group.run - fiddle.should == [ - 'after(:each)', - 'append_after(:each)', - 'after(:all)', - 'append_after(:all)', - 'Example.after(:all)', - 'Example.append_after(:all)' - ] - end - - it "should have accessible instance methods from included module" do - mod1_method_called = false - mod1 = Module.new do - define_method :mod1_method do - mod1_method_called = true - end - end - - mod2_method_called = false - mod2 = Module.new do - define_method :mod2_method do - mod2_method_called = true - end - end - - example_group.include mod1, mod2 - - example_group.it("test") do - mod1_method - mod2_method - end - example_group.run - mod1_method_called.should be_true - mod2_method_called.should be_true - end - - it "should include targetted modules included using configuration" do - mod1 = Module.new - mod2 = Module.new - mod3 = Module.new - Spec::Runner.configuration.include(mod1, mod2) - Spec::Runner.configuration.include(mod3, :type => :not_special) - - example_group = Class.new(@special_example_group).describe("I'm special", :type => :special) do - it "does nothing" - end - example_group.run - - example_group.included_modules.should include(mod1) - example_group.included_modules.should include(mod2) - example_group.included_modules.should_not include(mod3) - end - - it "should include any predicate_matchers included using configuration" do - $included_predicate_matcher_found = false - Spec::Runner.configuration.predicate_matchers[:do_something] = :does_something? - example_group = Class.new(ExampleGroup) do - describe('example') - it "should respond to do_something" do - $included_predicate_matcher_found = respond_to?(:do_something) - end - end - example_group.run - $included_predicate_matcher_found.should be(true) - end - - it "should use a mock framework set up in config" do - mod = Module.new do - class << self - def included(mod) - $included_module = mod - end - end - - def teardown_mocks_for_rspec - $torn_down = true - end - end - - begin - $included_module = nil - $torn_down = true - Spec::Runner.configuration.mock_with mod - - example_group = Class.new(ExampleGroup) do - describe('example') - it "does nothing" - end - example_group.run - - $included_module.should_not be_nil - $torn_down.should == true - ensure - Spec::Runner.configuration.mock_with :rspec - end - end - end - - describe ExampleGroup, "#run with pending example that has a failing assertion" do - before do - example_group.it("should be pending") do - pending("Example fails") {false.should be_true} - end - end - - it "should send example_pending to formatter" do - @formatter.should_receive(:example_pending).with("example", "should be pending", "Example fails") - example_group.run - end - end - - describe ExampleGroup, "#run with pending example that does not have a failing assertion" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - - before do - example_group.it("should be pending") do - pending("Example passes") {true.should be_true} - end - end - - it "should send example_pending to formatter" do - @formatter.should_receive(:example_pending).with("example", "should be pending", "Example passes") - example_group.run - end - end - - describe ExampleGroup, "#run when before(:all) fails" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - - before do - ExampleGroup.before(:all) { raise NonStandardError, "before(:all) failure" } - end - - it "should not run any example" do - spec_ran = false - example_group.it("test") {spec_ran = true} - example_group.run - spec_ran.should be_false - end - - it "should run ExampleGroup after(:all)" do - after_all_ran = false - ExampleGroup.after(:all) { after_all_ran = true } - example_group.run - after_all_ran.should be_true - end - - it "should run example_group after(:all)" do - after_all_ran = false - example_group.after(:all) { after_all_ran = true } - example_group.run - after_all_ran.should be_true - end - - it "should supply before(:all) as description" do - @reporter.should_receive(:failure) do |example, error| - example.description.should eql("before(:all)") - error.message.should eql("before(:all) failure") - end - - example_group.it("test") {true} - example_group.run - end - end - - describe ExampleGroup, "#run when before(:each) fails" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - - before do - ExampleGroup.before(:each) { raise NonStandardError } - end - - it "should run after(:all)" do - after_all_ran = false - ExampleGroup.after(:all) { after_all_ran = true } - example_group.run - after_all_ran.should be_true - end - end - - describe ExampleGroup, "#run when any example fails" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - - before do - example_group.it("should") { raise NonStandardError } - end - - it "should run after(:all)" do - after_all_ran = false - ExampleGroup.after(:all) { after_all_ran = true } - example_group.run - after_all_ran.should be_true - end - end - - describe ExampleGroup, "#run when first after(:each) block fails" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - - before do - class << example_group - attr_accessor :first_after_ran, :second_after_ran - end - example_group.first_after_ran = false - example_group.second_after_ran = false - - example_group.after(:each) do - self.class.second_after_ran = true - end - example_group.after(:each) do - self.class.first_after_ran = true - raise "first" - end - end - - it "should run second after(:each) block" do - reporter.should_receive(:example_finished) do |example, error| - example.should equal(example) - error.message.should eql("first") - end - example_group.run - example_group.first_after_ran.should be_true - example_group.second_after_ran.should be_true - end - end - - describe ExampleGroup, "#run when first before(:each) block fails" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - - before do - class << example_group - attr_accessor :first_before_ran, :second_before_ran - end - example_group.first_before_ran = false - example_group.second_before_ran = false - - example_group.before(:each) do - self.class.first_before_ran = true - raise "first" - end - example_group.before(:each) do - self.class.second_before_ran = true - end - end - - it "should not run second before(:each)" do - reporter.should_receive(:example_finished) do |name, error| - error.message.should eql("first") - end - example_group.run - example_group.first_before_ran.should be_true - example_group.second_before_ran.should be_false - end - end - - describe ExampleGroup, "#run when failure in after(:all)" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - - before do - ExampleGroup.after(:all) { raise NonStandardError, "in after(:all)" } - end - - it "should return false" do - example_group.run.should be_false - end - end - end - - class ExampleSubclass < ExampleGroup - end - - describe ExampleGroup, "subclasses" do - after do - ExampleGroupFactory.reset - end - - it "should have access to the described_type" do - example_group = Class.new(ExampleSubclass) do - describe(Array) - end - example_group.send(:described_type).should == Array - end - - it "should concat descriptions when nested" do - example_group = Class.new(ExampleSubclass) do - describe(Array) - $nested_group = describe("when empty") do - end - end - $nested_group.description.to_s.should == "Array when empty" - end - end - - describe Enumerable do - def each(&block) - ["4", "2", "1"].each(&block) - end - - it "should be included in examples because it is a module" do - map{|e| e.to_i}.should == [4,2,1] - end - end - - describe "An", Enumerable, "as a second argument" do - def each(&block) - ["4", "2", "1"].each(&block) - end - - it "should be included in examples because it is a module" do - map{|e| e.to_i}.should == [4,2,1] - end - end - - describe Enumerable do - describe "as the parent of nested example groups" do - it "should be included in examples because it is a module" do - pending("need to make sure nested groups know the described type") do - map{|e| e.to_i}.should == [4,2,1] - end - end - end - end - - describe String do - it"should not be included in examples because it is not a module" do - lambda{self.map}.should raise_error(NoMethodError, /undefined method `map' for/) - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/example_matcher_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/example_matcher_spec.rb deleted file mode 100644 index ea0dfe019..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/example_matcher_spec.rb +++ /dev/null @@ -1,96 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Example - module ExampleMatcherSpecHelper - class MatchDescription - def initialize(description) - @description = description - end - - def matches?(matcher) - matcher.matches?(@description) - end - - def failure_message - "expected matcher.matches?(#{@description.inspect}) to return true, got false" - end - - def negative_failure_message - "expected matcher.matches?(#{@description.inspect}) to return false, got true" - end - end - def match_description(description) - MatchDescription.new(description) - end - end - - describe ExampleMatcher, "#matches?" do - include ExampleMatcherSpecHelper - - it "should match correct example_group and example" do - matcher = ExampleMatcher.new("example_group", "example") - matcher.should match_description("example_group example") - end - - it "should not match wrong example" do - matcher = ExampleMatcher.new("example_group", "other example") - matcher.should_not match_description("example_group example") - end - - it "should not match wrong example_group" do - matcher = ExampleMatcher.new("other example_group", "example") - matcher.should_not match_description("example_group example") - end - - it "should match example only" do - matcher = ExampleMatcher.new("example_group", "example") - matcher.should match_description("example") - end - - it "should match example_group only" do - matcher = ExampleMatcher.new("example_group", "example") - matcher.should match_description("example_group") - end - - it "should match example_group ending with before(:all)" do - matcher = ExampleMatcher.new("example_group", "example") - matcher.should match_description("example_group before(:all)") - end - - it "should escape regexp chars" do - matcher = ExampleMatcher.new("(con|text)", "[example]") - matcher.should_not match_description("con p") - end - - it "should match when example_group is modularized" do - matcher = ExampleMatcher.new("MyModule::MyClass", "example") - matcher.should match_description("MyClass example") - end - end - - describe ExampleMatcher, "#matches? normal case" do - it "matches when passed in example matches" do - matcher = ExampleMatcher.new("Foo", "bar") - matcher.matches?(["no match", "Foo bar"]).should == true - end - - it "does not match when no passed in examples match" do - matcher = ExampleMatcher.new("Foo", "bar") - matcher.matches?(["no match1", "no match2"]).should == false - end - end - - describe ExampleMatcher, "#matches? where description has '::' in it" do - it "matches when passed in example matches" do - matcher = ExampleMatcher.new("Foo::Bar", "baz") - matcher.matches?(["no match", "Foo::Bar baz"]).should == true - end - - it "does not match when no passed in examples match" do - matcher = ExampleMatcher.new("Foo::Bar", "baz") - matcher.matches?(["no match1", "no match2"]).should == false - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/example_methods_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/example_methods_spec.rb deleted file mode 100644 index ce688a7f9..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/example_methods_spec.rb +++ /dev/null @@ -1,91 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - module ModuleThatIsReopened - end - - module ExampleMethods - include ModuleThatIsReopened - end - - module ModuleThatIsReopened - def module_that_is_reopened_method - end - end - - describe "ExampleMethods with an included module that is reopened" do - it "should have repoened methods" do - method(:module_that_is_reopened_method).should_not be_nil - end - end - - describe ExampleMethods, "lifecycle" do - before do - @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new) - @options.formatters << mock("formatter", :null_object => true) - @options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true) - @reporter = FakeReporter.new(@options) - @options.reporter = @reporter - - ExampleMethods.before_all_parts.should == [] - ExampleMethods.before_each_parts.should == [] - ExampleMethods.after_each_parts.should == [] - ExampleMethods.after_all_parts.should == [] - def ExampleMethods.count - @count ||= 0 - @count = @count + 1 - @count - end - end - - after do - ExampleMethods.instance_variable_set("@before_all_parts", []) - ExampleMethods.instance_variable_set("@before_each_parts", []) - ExampleMethods.instance_variable_set("@after_each_parts", []) - ExampleMethods.instance_variable_set("@after_all_parts", []) - end - - it "should pass before and after callbacks to all ExampleGroup subclasses" do - ExampleMethods.before(:all) do - ExampleMethods.count.should == 1 - end - - ExampleMethods.before(:each) do - ExampleMethods.count.should == 2 - end - - ExampleMethods.after(:each) do - ExampleMethods.count.should == 3 - end - - ExampleMethods.after(:all) do - ExampleMethods.count.should == 4 - end - - @example_group = Class.new(ExampleGroup) do - it "should use ExampleMethods callbacks" do - end - end - @example_group.run - ExampleMethods.count.should == 5 - end - - describe "run_with_description_capturing" do - before(:each) do - @example_group = Class.new(ExampleGroup) do end - @example = @example_group.new("foo", &(lambda { 2.should == 2 })) - @example.run_with_description_capturing - end - - it "should provide the generated description" do - @example.instance_eval { @_matcher_description }.should == "should == 2" - end - - it "should clear the global generated_description" do - Spec::Matchers.generated_description.should == nil - end - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/example_runner_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/example_runner_spec.rb deleted file mode 100644 index 1b5abdf0f..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/example_runner_spec.rb +++ /dev/null @@ -1,194 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Example - # describe "Spec::Example::ExampleRunner", "#run", :shared => true do - # before(:each) do - # @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new) - # @reporter = ::Spec::Runner::Reporter.new(@options) - # @options.reporter = @reporter - # @example_group_class = Class.new(ExampleGroup) do - # plugin_mock_framework - # describe("Some Examples") - # end - # end - # - # def create_runner(example_definition) - # example = @example_group_class.new(example_definition) - # runner = ExampleGroup.new(@options, example) - # runner.stub!(:verify_mocks) - # runner.stub!(:teardown_mocks) - # runner - # end - # end - # - # describe ExampleRunner, "#run with blank passing example" do - # it_should_behave_like "Spec::Example::ExampleRunner#run" - # - # before do - # @e = @example_group_class.it("example") {} - # @runner = create_runner(@e) - # end - # - # it "should send reporter example_started" do - # @reporter.should_receive(:example_started).with(equal(@e)) - # @runner.run - # end - # - # it "should report its name for dry run" do - # @options.dry_run = true - # @reporter.should_receive(:example_finished).with(equal(@e), nil) - # @runner.run - # end - # - # it "should report success" do - # @reporter.should_receive(:example_finished).with(equal(@e), nil) - # @runner.run - # end - # end - # - # describe ExampleRunner, "#run with a failing example" do - # predicate_matchers[:is_a] = [:is_a?] - # it_should_behave_like "Spec::Example::ExampleRunner#run" - # - # before do - # @e = @example_group_class.it("example") do - # (2+2).should == 5 - # end - # @runner = create_runner(@e) - # end - # - # it "should report failure due to failure" do - # @reporter.should_receive(:example_finished).with( - # equal(@e), - # is_a(Spec::Expectations::ExpectationNotMetError) - # ) - # @runner.run - # end - # end - # - # describe ExampleRunner, "#run with a erroring example" do - # it_should_behave_like "Spec::Example::ExampleRunner#run" - # - # before do - # @error = error = NonStandardError.new("in body") - # @example_definition = @example_group_class.it("example") do - # raise(error) - # end - # @runner = create_runner(@example_definition) - # end - # - # it "should report failure due to error" do - # @reporter.should_receive(:example_finished).with( - # equal(@example_definition), - # @error - # ) - # @runner.run - # end - # - # it "should run after_each block" do - # @example_group_class.after(:each) do - # raise("in after_each") - # end - # @reporter.should_receive(:example_finished) do |example_definition, error| - # example_definition.should equal(@example_definition) - # error.message.should eql("in body") - # end - # @runner.run - # end - # end - # - # describe ExampleRunner, "#run where after_each fails" do - # it_should_behave_like "Spec::Example::ExampleRunner#run" - # - # before do - # @example_ran = example_ran = false - # @example_definition = @example_group_class.it("should not run") do - # example_ran = true - # end - # @runner = create_runner(@example_definition) - # @example_group_class.after(:each) { raise(NonStandardError.new("in after_each")) } - # end - # - # it "should report failure location when in after_each" do - # @reporter.should_receive(:example_finished) do |example_definition, error| - # example_definition.should equal(@example_definition) - # error.message.should eql("in after_each") - # end - # @runner.run - # end - # end - # - # describe ExampleRunner, "#run with use cases" do - # predicate_matchers[:is_a] = [:is_a?] - # it_should_behave_like "Spec::Example::ExampleRunner#run" - # - # it "should report NO NAME when told to use generated description with --dry-run" do - # @options.dry_run = true - # example_definition = @example_group_class.it() do - # 5.should == 5 - # end - # runner = create_runner(example_definition) - # - # @reporter.should_receive(:example_finished) do |example_definition, error| - # example_definition.description.should == "NO NAME (Because of --dry-run)" - # end - # runner.run - # end - # - # it "should report given name if present with --dry-run" do - # @options.dry_run = true - # example_definition = @example_group_class.it("example name") do - # 5.should == 5 - # end - # runner = create_runner(example_definition) - # - # @reporter.should_receive(:example_finished) do |example_definition, error| - # example_definition.description.should == "example name" - # end - # runner.run - # end - # - # it "should report NO NAME when told to use generated description with no expectations" do - # example_definition = @example_group_class.it() {} - # runner = create_runner(example_definition) - # @reporter.should_receive(:example_finished) do |example, error| - # example.description.should == "NO NAME (Because there were no expectations)" - # end - # runner.run - # end - # - # it "should report NO NAME when told to use generated description and matcher fails" do - # example_definition = @example_group_class.it() do - # 5.should "" # Has no matches? method.. - # end - # runner = create_runner(example_definition) - # - # @reporter.should_receive(:example_finished) do |example, error| - # example_definition.description.should == "NO NAME (Because of Error raised in matcher)" - # end - # runner.run - # end - # - # it "should report generated description when told to and it is available" do - # example_definition = @example_group_class.it() { - # 5.should == 5 - # } - # runner = create_runner(example_definition) - # - # @reporter.should_receive(:example_finished) do |example_definition, error| - # example_definition.description.should == "should == 5" - # end - # runner.run - # end - # - # it "should unregister description_generated callback (lest a memory leak should build up)" do - # example_definition = @example_group_class.it("something") - # runner = create_runner(example_definition) - # - # Spec::Matchers.should_receive(:example_finished) - # runner.run - # end - # end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/example_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/example_spec.rb deleted file mode 100644 index c8125b447..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/example_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - # describe Example do - # before(:each) do - # @example = Example.new "example" do - # foo - # end - # end - # - # it "should tell you its docstring" do - # @example.description.should == "example" - # end - # - # it "should execute its block in the context provided" do - # context = Class.new do - # def foo - # "foo" - # end - # end.new - # @example.run_in(context).should == "foo" - # end - # end - # - # describe Example, "#description" do - # it "should default to NO NAME when not passed anything when there are no matchers" do - # example = Example.new {} - # example.run_in(Object.new) - # example.description.should == "NO NAME" - # end - # - # it "should default to NO NAME description (Because of --dry-run) when passed nil and there are no matchers" do - # example = Example.new(nil) {} - # example.run_in(Object.new) - # example.description.should == "NO NAME" - # end - # - # it "should allow description to be overridden" do - # example = Example.new("Test description") - # example.description.should == "Test description" - # end - # - # it "should use description generated from matcher when there is no passed in description" do - # example = Example.new(nil) do - # 1.should == 1 - # end - # example.run_in(Object.new) - # example.description.should == "should == 1" - # end - # end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/nested_example_group_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/nested_example_group_spec.rb deleted file mode 100644 index 35e8a9890..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/nested_example_group_spec.rb +++ /dev/null @@ -1,59 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - describe 'Nested Example Groups' do - parent = self - - def count - @count ||= 0 - @count = @count + 1 - @count - end - - before(:all) do - count.should == 1 - end - - before(:all) do - count.should == 2 - end - - before(:each) do - count.should == 3 - end - - before(:each) do - count.should == 4 - end - - it "should run before(:all), before(:each), example, after(:each), after(:all) in order" do - count.should == 5 - end - - after(:each) do - count.should == 7 - end - - after(:each) do - count.should == 6 - end - - after(:all) do - count.should == 9 - end - - after(:all) do - count.should == 8 - end - - describe 'nested example group' do - self.superclass.should == parent - - it "should run all before and after callbacks" do - count.should == 5 - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/pending_module_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/pending_module_spec.rb deleted file mode 100644 index c3ab0126b..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/pending_module_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -module Spec - module Example - describe Pending do - - it 'should raise an ExamplePendingError if no block is supplied' do - lambda { - include Pending - pending "TODO" - }.should raise_error(ExamplePendingError, /TODO/) - end - - it 'should raise an ExamplePendingError if a supplied block fails as expected' do - lambda { - include Pending - pending "TODO" do - raise "oops" - end - }.should raise_error(ExamplePendingError, /TODO/) - end - - it 'should raise a PendingExampleFixedError if a supplied block starts working' do - lambda { - include Pending - pending "TODO" do - # success! - end - }.should raise_error(PendingExampleFixedError, /TODO/) - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/predicate_matcher_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/predicate_matcher_spec.rb deleted file mode 100644 index 7c4638b4b..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/predicate_matcher_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - class Fish - def can_swim?(distance_in_yards) - distance_in_yards < 1000 - end - end - - describe "predicate_matcher[method_on_object] = matcher_method" do - predicate_matchers[:swim] = :can_swim? - it "should match matcher_method if method_on_object returns true" do - swim(100).matches?(Fish.new).should be_true - end - it "should not match matcher_method if method_on_object returns false" do - swim(10000).matches?(Fish.new).should be_false - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/shared_example_group_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/shared_example_group_spec.rb deleted file mode 100644 index 803536ab5..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/shared_example_group_spec.rb +++ /dev/null @@ -1,265 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - describe ExampleGroup, "with :shared => true" do - it_should_behave_like "sandboxed rspec_options" - attr_reader :formatter, :example_group - before(:each) do - @formatter = Spec::Mocks::Mock.new("formatter", :null_object => true) - options.formatters << formatter - @example_group = Class.new(ExampleGroup).describe("example_group") - class << example_group - public :include - end - end - - after(:each) do - @formatter.rspec_verify - @example_group = nil - $shared_example_groups.clear unless $shared_example_groups.nil? - end - - def make_shared_example_group(name, opts=nil, &block) - example_group = SharedExampleGroup.new(name, :shared => true, &block) - SharedExampleGroup.add_shared_example_group(example_group) - example_group - end - - def non_shared_example_group() - @non_shared_example_group ||= Class.new(ExampleGroup).describe("example_group") - end - - it "should accept an optional options hash" do - lambda { Class.new(ExampleGroup).describe("context") }.should_not raise_error(Exception) - lambda { Class.new(ExampleGroup).describe("context", :shared => true) }.should_not raise_error(Exception) - end - - it "should return all shared example_groups" do - b1 = make_shared_example_group("b1", :shared => true) {} - b2 = make_shared_example_group("b2", :shared => true) {} - - b1.should_not be(nil) - b2.should_not be(nil) - - SharedExampleGroup.find_shared_example_group("b1").should equal(b1) - SharedExampleGroup.find_shared_example_group("b2").should equal(b2) - end - - it "should register as shared example_group" do - example_group = make_shared_example_group("example_group") {} - SharedExampleGroup.shared_example_groups.should include(example_group) - end - - it "should not be shared when not configured as shared" do - example_group = non_shared_example_group - SharedExampleGroup.shared_example_groups.should_not include(example_group) - end - - it "should complain when adding a second shared example_group with the same description" do - describe "shared example_group", :shared => true do - end - lambda do - describe "shared example_group", :shared => true do - end - end.should raise_error(ArgumentError) - end - - it "should NOT complain when adding the same shared example_group instance again" do - shared_example_group = Class.new(ExampleGroup).describe("shared example_group", :shared => true) - SharedExampleGroup.add_shared_example_group(shared_example_group) - SharedExampleGroup.add_shared_example_group(shared_example_group) - end - - it "should NOT complain when adding the same shared example_group again (i.e. file gets reloaded)" do - lambda do - 2.times do - describe "shared example_group which gets loaded twice", :shared => true do - end - end - end.should_not raise_error(ArgumentError) - end - - it "should NOT complain when adding the same shared example_group in same file with different absolute path" do - shared_example_group_1 = Class.new(ExampleGroup).describe( - "shared example_group", - :shared => true, - :spec_path => "/my/spec/a/../shared.rb" - ) - shared_example_group_2 = Class.new(ExampleGroup).describe( - "shared example_group", - :shared => true, - :spec_path => "/my/spec/b/../shared.rb" - ) - - SharedExampleGroup.add_shared_example_group(shared_example_group_1) - SharedExampleGroup.add_shared_example_group(shared_example_group_2) - end - - it "should complain when adding a different shared example_group with the same name in a different file with the same basename" do - shared_example_group_1 = Class.new(ExampleGroup).describe( - "shared example_group", - :shared => true, - :spec_path => "/my/spec/a/shared.rb" - ) - shared_example_group_2 = Class.new(ExampleGroup).describe( - "shared example_group", - :shared => true, - :spec_path => "/my/spec/b/shared.rb" - ) - - SharedExampleGroup.add_shared_example_group(shared_example_group_1) - lambda do - SharedExampleGroup.add_shared_example_group(shared_example_group_2) - end.should raise_error(ArgumentError, /already exists/) - end - - it "should add examples to current example_group using it_should_behave_like" do - shared_example_group = make_shared_example_group("shared example_group") do - it("shared example") {} - it("shared example 2") {} - end - - example_group.it("example") {} - example_group.number_of_examples.should == 1 - example_group.it_should_behave_like("shared example_group") - example_group.number_of_examples.should == 3 - end - - it "should add examples to current example_group using include" do - shared_example_group = describe "all things", :shared => true do - it "should do stuff" do end - end - - example_group = describe "one thing" do - include shared_example_group - end - - example_group.number_of_examples.should == 1 - end - - it "should add examples to current example_group using it_should_behave_like with a module" do - AllThings = describe "all things", :shared => true do - it "should do stuff" do end - end - - example_group = describe "one thing" do - it_should_behave_like AllThings - end - - example_group.number_of_examples.should == 1 - end - - it "should run shared examples" do - shared_example_ran = false - shared_example_group = make_shared_example_group("shared example_group") do - it("shared example") { shared_example_ran = true } - end - - example_ran = false - - example_group.it_should_behave_like("shared example_group") - example_group.it("example") {example_ran = true} - example_group.run - example_ran.should be_true - shared_example_ran.should be_true - end - - it "should run setup and teardown from shared example_group" do - shared_setup_ran = false - shared_teardown_ran = false - shared_example_group = make_shared_example_group("shared example_group") do - before { shared_setup_ran = true } - after { shared_teardown_ran = true } - it("shared example") { shared_example_ran = true } - end - - example_ran = false - - example_group.it_should_behave_like("shared example_group") - example_group.it("example") {example_ran = true} - example_group.run - example_ran.should be_true - shared_setup_ran.should be_true - shared_teardown_ran.should be_true - end - - it "should run before(:all) and after(:all) only once from shared example_group" do - shared_before_all_run_count = 0 - shared_after_all_run_count = 0 - shared_example_group = make_shared_example_group("shared example_group") do - before(:all) { shared_before_all_run_count += 1} - after(:all) { shared_after_all_run_count += 1} - it("shared example") { shared_example_ran = true } - end - - example_ran = false - - example_group.it_should_behave_like("shared example_group") - example_group.it("example") {example_ran = true} - example_group.run - example_ran.should be_true - shared_before_all_run_count.should == 1 - shared_after_all_run_count.should == 1 - end - - it "should include modules, included into shared example_group, into current example_group" do - @formatter.should_receive(:add_example_group).with(any_args) - - shared_example_group = make_shared_example_group("shared example_group") do - it("shared example") { shared_example_ran = true } - end - - mod1_method_called = false - mod1 = Module.new do - define_method :mod1_method do - mod1_method_called = true - end - end - - mod2_method_called = false - mod2 = Module.new do - define_method :mod2_method do - mod2_method_called = true - end - end - - shared_example_group.include mod2 - - example_group.it_should_behave_like("shared example_group") - example_group.include mod1 - - example_group.it("test") do - mod1_method - mod2_method - end - example_group.run - mod1_method_called.should be_true - mod2_method_called.should be_true - end - - it "should make methods defined in the shared example_group available in consuming example_group" do - shared_example_group = make_shared_example_group("shared example_group xyz") do - def a_shared_helper_method - "this got defined in a shared example_group" - end - end - example_group.it_should_behave_like("shared example_group xyz") - success = false - example_group.it("should access a_shared_helper_method") do - a_shared_helper_method - success = true - end - example_group.run - success.should be_true - end - - it "should raise when named shared example_group can not be found" do - lambda { - example_group.it_should_behave_like("non-existent shared example group") - violated - }.should raise_error("Shared Example Group 'non-existent shared example group' can not be found") - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/example/subclassing_example_group_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/example/subclassing_example_group_spec.rb deleted file mode 100644 index 888f2ceb3..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/example/subclassing_example_group_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - class GrandParentExampleGroup < Spec::Example::ExampleGroup - describe "Grandparent ExampleGroup" - end - - class ParentExampleGroup < GrandParentExampleGroup - describe "Parent ExampleGroup" - it "should bar" do - end - end - - class ChildExampleGroup < ParentExampleGroup - describe "Child ExampleGroup" - it "should bam" do - end - end - - describe ChildExampleGroup do - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/expectations/differs/default_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/expectations/differs/default_spec.rb deleted file mode 100644 index ea720846b..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/expectations/differs/default_spec.rb +++ /dev/null @@ -1,109 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' - -module Spec - module Fixtures - class Animal - def initialize(name,species) - @name,@species = name,species - end - - def inspect - <<-EOA - - EOA - end - end - end -end - -describe "Diff" do - before(:each) do - @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new) - @differ = Spec::Expectations::Differs::Default.new(@options) - end - - it "should output unified diff of two strings" do - expected="foo\nbar\nzap\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nline\n" - actual="foo\nzap\nbar\nthis\nis\nsoo\nvery\nvery\nequal\ninsert\na\nanother\nline\n" - expected_diff="\n\n@@ -1,6 +1,6 @@\n foo\n-bar\n zap\n+bar\n this\n is\n soo\n@@ -9,5 +9,6 @@\n equal\n insert\n a\n+another\n line\n" - diff = @differ.diff_as_string(expected, actual) - diff.should eql(expected_diff) - end - - it "should output unified diff message of two arrays" do - expected = [ :foo, 'bar', :baz, 'quux', :metasyntactic, 'variable', :delta, 'charlie', :width, 'quite wide' ] - actual = [ :foo, 'bar', :baz, 'quux', :metasyntactic, 'variable', :delta, 'tango' , :width, 'very wide' ] - - expected_diff = <<'EOD' - - -@@ -5,7 +5,7 @@ - :metasyntactic, - "variable", - :delta, -- "charlie", -+ "tango", - :width, -- "quite wide"] -+ "very wide"] -EOD - - - diff = @differ.diff_as_object(expected,actual) - diff.should == expected_diff - end - - it "should output unified diff message of two objects" do - expected = Spec::Fixtures::Animal.new "bob", "giraffe" - actual = Spec::Fixtures::Animal.new "bob", "tortoise" - - expected_diff = <<'EOD' - -@@ -1,5 +1,5 @@ - -EOD - - diff = @differ.diff_as_object(expected,actual) - diff.should == expected_diff - end - -end - - -describe "Diff in context format" do - before(:each) do - @options = Spec::Runner::Options.new(StringIO.new, StringIO.new) - @options.diff_format = :context - @differ = Spec::Expectations::Differs::Default.new(@options) - end - - it "should output unified diff message of two objects" do - expected = Spec::Fixtures::Animal.new "bob", "giraffe" - actual = Spec::Fixtures::Animal.new "bob", "tortoise" - - expected_diff = <<'EOD' - -*************** -*** 1,5 **** - ---- 1,5 ---- - -EOD - - diff = @differ.diff_as_object(expected,actual) - diff.should == expected_diff - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/expectations/extensions/object_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/expectations/extensions/object_spec.rb deleted file mode 100644 index 0d9335bdb..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/expectations/extensions/object_spec.rb +++ /dev/null @@ -1,107 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' - -describe Object, "#should" do - before(:each) do - @target = "target" - @matcher = mock("matcher") - @matcher.stub!(:matches?).and_return(true) - @matcher.stub!(:failure_message) - end - - it "should accept and interact with a matcher" do - @matcher.should_receive(:matches?).with(@target).and_return(true) - @target.should @matcher - end - - it "should ask for a failure_message when matches? returns false" do - @matcher.should_receive(:matches?).with(@target).and_return(false) - @matcher.should_receive(:failure_message).and_return("the failure message") - lambda { - @target.should @matcher - }.should fail_with("the failure message") - end - - it "should raise error if it receives false directly" do - lambda { - @target.should false - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives false (evaluated)" do - lambda { - @target.should eql?("foo") - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives true" do - lambda { - @target.should true - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives nil" do - lambda { - @target.should nil - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives no argument and it is not used as a left side of an operator" do - pending "Is it even possible to catch this?" - lambda { - @target.should - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end -end - -describe Object, "#should_not" do - before(:each) do - @target = "target" - @matcher = mock("matcher") - end - - it "should accept and interact with a matcher" do - @matcher.should_receive(:matches?).with(@target).and_return(false) - @matcher.stub!(:negative_failure_message) - - @target.should_not @matcher - end - - it "should ask for a negative_failure_message when matches? returns true" do - @matcher.should_receive(:matches?).with(@target).and_return(true) - @matcher.should_receive(:negative_failure_message).and_return("the negative failure message") - lambda { - @target.should_not @matcher - }.should fail_with("the negative failure message") - end - - it "should raise error if it receives false directly" do - lambda { - @target.should_not false - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives false (evaluated)" do - lambda { - @target.should_not eql?("foo") - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives true" do - lambda { - @target.should_not true - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives nil" do - lambda { - @target.should_not nil - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives no argument and it is not used as a left side of an operator" do - pending "Is it even possible to catch this?" - lambda { - @target.should_not - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/expectations/fail_with_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/expectations/fail_with_spec.rb deleted file mode 100644 index 4c369ce3a..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/expectations/fail_with_spec.rb +++ /dev/null @@ -1,71 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe Spec::Expectations, "#fail_with with no diff" do - before(:each) do - @old_differ = Spec::Expectations.differ - Spec::Expectations.differ = nil - end - - it "should handle just a message" do - lambda { - Spec::Expectations.fail_with "the message" - }.should fail_with("the message") - end - - it "should handle an Array" do - lambda { - Spec::Expectations.fail_with ["the message","expected","actual"] - }.should fail_with("the message") - end - - after(:each) do - Spec::Expectations.differ = @old_differ - end -end - -describe Spec::Expectations, "#fail_with with diff" do - before(:each) do - @old_differ = Spec::Expectations.differ - @differ = mock("differ") - Spec::Expectations.differ = @differ - end - - it "should not call differ if no expected/actual" do - lambda { - Spec::Expectations.fail_with "the message" - }.should fail_with("the message") - end - - it "should call differ if expected/actual are presented separately" do - @differ.should_receive(:diff_as_string).and_return("diff") - lambda { - Spec::Expectations.fail_with "the message", "expected", "actual" - }.should fail_with("the message\nDiff:diff") - end - - it "should call differ if expected/actual are not strings" do - @differ.should_receive(:diff_as_object).and_return("diff") - lambda { - Spec::Expectations.fail_with "the message", :expected, :actual - }.should fail_with("the message\nDiff:diff") - end - - it "should not call differ if expected or actual are procs" do - @differ.should_not_receive(:diff_as_string) - @differ.should_not_receive(:diff_as_object) - lambda { - Spec::Expectations.fail_with "the message", lambda {}, lambda {} - }.should fail_with("the message") - end - - it "should call differ if expected/actual are presented in an Array with message" do - @differ.should_receive(:diff_as_string).with("actual","expected").and_return("diff") - lambda { - Spec::Expectations.fail_with(["the message", "expected", "actual"]) - }.should fail_with(/the message\nDiff:diff/) - end - - after(:each) do - Spec::Expectations.differ = @old_differ - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/extensions/main_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/extensions/main_spec.rb deleted file mode 100644 index aabb616e9..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/extensions/main_spec.rb +++ /dev/null @@ -1,76 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Extensions - describe Main do - it_should_behave_like "sandboxed rspec_options" - before(:each) do - @main = Class.new do; include Main; end - end - - after(:each) do - $rspec_story_steps = @original_rspec_story_steps - end - - it "should create an Options object" do - @main.send(:rspec_options).should be_instance_of(Spec::Runner::Options) - @main.send(:rspec_options).should === $rspec_options - end - - specify {@main.should respond_to(:describe)} - specify {@main.should respond_to(:context)} - - it "should raise when no block given to describe" do - lambda { @main.describe "foo" }.should raise_error(ArgumentError) - end - - it "should raise when no description given to describe" do - lambda { @main.describe do; end }.should raise_error(ArgumentError) - end - - it "should registered ExampleGroups by default" do - example_group = @main.describe("The ExampleGroup") do end - rspec_options.example_groups.should include(example_group) - end - - it "should not run unregistered ExampleGroups" do - example_group = @main.describe("The ExampleGroup") do - unregister - end - - rspec_options.example_groups.should_not include(example_group) - end - - it "should create a shared ExampleGroup with share_examples_for" do - group = @main.share_examples_for "all things" do end - group.should be_an_instance_of(Spec::Example::SharedExampleGroup) - end - - describe "#share_as" do - before(:each) do - $share_as_examples_example_module_number ||= 1 - $share_as_examples_example_module_number += 1 - t = Time.new.to_i - @group_name = "Group#{$share_as_examples_example_module_number}" - end - - it "should create a shared ExampleGroup" do - group = @main.share_as @group_name do end - group.should be_an_instance_of(Spec::Example::SharedExampleGroup) - end - - it "should create a constant that points to a Module" do - group = @main.share_as @group_name do end - Object.const_get(@group_name).should equal(group) - end - - it "should bark if you pass it something not-constantizable" do - lambda do - @group = @main.share_as "Non Constant" do end - end.should raise_error(NameError, /The first argument to share_as must be a legal name for a constant/) - end - - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/test_unit_spec_helper.rb b/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/test_unit_spec_helper.rb deleted file mode 100644 index 04d5d2713..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/test_unit_spec_helper.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/../../../../spec_helper' -require File.dirname(__FILE__) + '/../../../../ruby_forker' - -module TestUnitSpecHelper - include RubyForker - - def run_script(file_name) - output = ruby(file_name) - if !$?.success? || output.include?("FAILED") || output.include?("Error") - raise output - end - output - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testcase_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testcase_spec.rb deleted file mode 100644 index 3e10ba7b5..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testcase_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/test_unit_spec_helper' - -describe "Test::Unit::TestCase" do - include TestUnitSpecHelper - it "should pass" do - dir = File.dirname(__FILE__) - output = run_script("#{dir}/testcase_spec_with_test_unit.rb") - output.should include("3 examples, 0 failures") - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testcase_spec_with_test_unit.rb b/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testcase_spec_with_test_unit.rb deleted file mode 100644 index 52afd8e4c..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testcase_spec_with_test_unit.rb +++ /dev/null @@ -1,20 +0,0 @@ -require "test/unit" -require File.dirname(__FILE__) + '/../../../../spec_helper.rb' - -describe "TestCase#method_name" do - it "should equal the description of the example" do - @method_name.should == "should equal the description of the example" - end - - def test_this - true.should be_true - end - - def testThis - true.should be_true - end - - def testament - raise "testament is not a test" - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testsuite_adapter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testsuite_adapter_spec.rb deleted file mode 100644 index bcb25b36c..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require File.dirname(__FILE__) + '/test_unit_spec_helper' - -describe "TestSuiteAdapter" do - include TestUnitSpecHelper - it "should pass" do - dir = File.dirname(__FILE__) - run_script "#{dir}/testsuite_adapter_spec_with_test_unit.rb" - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testsuite_adapter_spec_with_test_unit.rb b/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testsuite_adapter_spec_with_test_unit.rb deleted file mode 100644 index 8088ef50e..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/interop/test/unit/testsuite_adapter_spec_with_test_unit.rb +++ /dev/null @@ -1,34 +0,0 @@ -require "test/unit" -require File.dirname(__FILE__) + '/../../../../spec_helper.rb' - -module TestSuiteAdapterSpecHelper - def create_adapter(group) - Test::Unit::TestSuiteAdapter.new(group) - end -end - -describe "TestSuiteAdapter#size" do - include TestSuiteAdapterSpecHelper - it "should return the number of examples in the example group" do - group = Class.new(Spec::ExampleGroup) do - describe("some examples") - it("bar") {} - it("baz") {} - end - adapter = create_adapter(group) - adapter.size.should == 2 - end -end - -describe "TestSuiteAdapter#delete" do - include TestSuiteAdapterSpecHelper - it "should do nothing" do - group = Class.new(Spec::ExampleGroup) do - describe("Some Examples") - it("does something") {} - end - adapter = create_adapter(group) - adapter.delete(adapter.examples.first) - adapter.should be_empty - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/be_close_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/be_close_spec.rb deleted file mode 100644 index d8452d408..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/be_close_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' -module Spec - module Matchers - describe BeClose do - it "should match when value == target" do - BeClose.new(5.0, 0.5).matches?(5.0).should be_true - end - it "should match when value < (target + delta)" do - BeClose.new(5.0, 0.5).matches?(5.49).should be_true - end - it "should match when value > (target - delta)" do - BeClose.new(5.0, 0.5).matches?(4.51).should be_true - end - it "should not match when value == (target - delta)" do - BeClose.new(5.0, 0.5).matches?(4.5).should be_false - end - it "should not match when value < (target - delta)" do - BeClose.new(5.0, 0.5).matches?(4.49).should be_false - end - it "should not match when value == (target + delta)" do - BeClose.new(5.0, 0.5).matches?(5.5).should be_false - end - it "should not match when value > (target + delta)" do - BeClose.new(5.0, 0.5).matches?(5.51).should be_false - end - it "should provide a useful failure message" do - #given - matcher = BeClose.new(5.0, 0.5) - #when - matcher.matches?(5.51) - #then - matcher.failure_message.should == "expected 5.0 +/- (< 0.5), got 5.51" - end - it "should describe itself" do - BeClose.new(5.0, 0.5).description.should == "be close to 5.0 (within +- 0.5)" - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/be_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/be_spec.rb deleted file mode 100644 index d40036c79..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/be_spec.rb +++ /dev/null @@ -1,224 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "should be_predicate" do - it "should pass when actual returns true for :predicate?" do - actual = stub("actual", :happy? => true) - actual.should be_happy - end - - it "should pass when actual returns true for :predicates? (present tense)" do - actual = stub("actual", :exists? => true) - actual.should be_exist - end - - it "should fail when actual returns false for :predicate?" do - actual = stub("actual", :happy? => false) - lambda { - actual.should be_happy - }.should fail_with("expected happy? to return true, got false") - end - - it "should fail when actual does not respond to :predicate?" do - lambda { - Object.new.should be_happy - }.should raise_error(NameError) - end -end - -describe "should_not be_predicate" do - it "should pass when actual returns false for :sym?" do - actual = stub("actual", :happy? => false) - actual.should_not be_happy - end - - it "should fail when actual returns true for :sym?" do - actual = stub("actual", :happy? => true) - lambda { - actual.should_not be_happy - }.should fail_with("expected happy? to return false, got true") - end - - it "should fail when actual does not respond to :sym?" do - lambda { - Object.new.should_not be_happy - }.should raise_error(NameError) - end -end - -describe "should be_predicate(*args)" do - it "should pass when actual returns true for :predicate?(*args)" do - actual = mock("actual") - actual.should_receive(:older_than?).with(3).and_return(true) - actual.should be_older_than(3) - end - - it "should fail when actual returns false for :predicate?(*args)" do - actual = mock("actual") - actual.should_receive(:older_than?).with(3).and_return(false) - lambda { - actual.should be_older_than(3) - }.should fail_with("expected older_than?(3) to return true, got false") - end - - it "should fail when actual does not respond to :predicate?" do - lambda { - Object.new.should be_older_than(3) - }.should raise_error(NameError) - end -end - -describe "should_not be_predicate(*args)" do - it "should pass when actual returns false for :predicate?(*args)" do - actual = mock("actual") - actual.should_receive(:older_than?).with(3).and_return(false) - actual.should_not be_older_than(3) - end - - it "should fail when actual returns true for :predicate?(*args)" do - actual = mock("actual") - actual.should_receive(:older_than?).with(3).and_return(true) - lambda { - actual.should_not be_older_than(3) - }.should fail_with("expected older_than?(3) to return false, got true") - end - - it "should fail when actual does not respond to :predicate?" do - lambda { - Object.new.should_not be_older_than(3) - }.should raise_error(NameError) - end -end - -describe "should be_true" do - it "should pass when actual equal(true)" do - true.should be_true - end - - it "should fail when actual equal(false)" do - lambda { - false.should be_true - }.should fail_with("expected true, got false") - end -end - -describe "should be_false" do - it "should pass when actual equal(false)" do - false.should be_false - end - - it "should fail when actual equal(true)" do - lambda { - true.should be_false - }.should fail_with("expected false, got true") - end -end - -describe "should be_nil" do - it "should pass when actual is nil" do - nil.should be_nil - end - - it "should fail when actual is not nil" do - lambda { - :not_nil.should be_nil - }.should fail_with("expected nil, got :not_nil") - end -end - -describe "should_not be_nil" do - it "should pass when actual is not nil" do - :not_nil.should_not be_nil - end - - it "should fail when actual is nil" do - lambda { - nil.should_not be_nil - }.should fail_with("expected not nil, got nil") - end -end - -describe "should be <" do - it "should pass when < operator returns true" do - 3.should be < 4 - end - - it "should fail when < operator returns false" do - lambda { 3.should be < 3 }.should fail_with("expected < 3, got 3") - end -end - -describe "should be <=" do - it "should pass when <= operator returns true" do - 3.should be <= 4 - 4.should be <= 4 - end - - it "should fail when <= operator returns false" do - lambda { 3.should be <= 2 }.should fail_with("expected <= 2, got 3") - end -end - -describe "should be >=" do - it "should pass when >= operator returns true" do - 4.should be >= 4 - 5.should be >= 4 - end - - it "should fail when >= operator returns false" do - lambda { 3.should be >= 4 }.should fail_with("expected >= 4, got 3") - end -end - -describe "should be >" do - it "should pass when > operator returns true" do - 5.should be > 4 - end - - it "should fail when > operator returns false" do - lambda { 3.should be > 4 }.should fail_with("expected > 4, got 3") - end -end - -describe "should be ==" do - it "should pass when == operator returns true" do - 5.should be == 5 - end - - it "should fail when == operator returns false" do - lambda { 3.should be == 4 }.should fail_with("expected == 4, got 3") - end -end - -describe "should be ===" do - it "should pass when === operator returns true" do - Hash.should be === Hash.new - end - - it "should fail when === operator returns false" do - lambda { Hash.should be === "not a hash" }.should fail_with(%[expected === "not a hash", got Hash]) - end -end - -describe "should be" do - it "should pass if actual is true or a set value" do - true.should be - 1.should be - end - - it "should fail if actual is false" do - lambda {false.should be}.should fail_with("expected if to be satisfied, got false") - end - - it "should fail if actual is nil" do - lambda {nil.should be}.should fail_with("expected if to be satisfied, got nil") - end -end - -describe "should be(value)" do - it "should pass if actual.equal?(value)" do - 5.should be(5) - end - it "should fail if !actual.equal?(value)" do - lambda { 5.should be(6) }.should fail_with("expected 6, got 5") - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/change_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/change_spec.rb deleted file mode 100644 index d95aa6da4..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/change_spec.rb +++ /dev/null @@ -1,319 +0,0 @@ -#Based on patch from Wilson Bilkovich - -require File.dirname(__FILE__) + '/../../spec_helper.rb' -class SomethingExpected - attr_accessor :some_value -end - -describe "should change(actual, message)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 5 - end - - it "should pass when actual is modified by the block" do - lambda {@instance.some_value = 6}.should change(@instance, :some_value) - end - - it "should fail when actual is not modified by the block" do - lambda do - lambda {}.should change(@instance, :some_value) - end.should fail_with("some_value should have changed, but is still 5") - end -end - -describe "should_not change(actual, message)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 5 - end - - it "should pass when actual is not modified by the block" do - lambda { }.should_not change(@instance, :some_value) - end - - it "should fail when actual is not modified by the block" do - lambda do - lambda {@instance.some_value = 6}.should_not change(@instance, :some_value) - end.should fail_with("some_value should not have changed, but did change from 5 to 6") - end -end - -describe "should change { block }" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 5 - end - - it "should pass when actual is modified by the block" do - lambda {@instance.some_value = 6}.should change { @instance.some_value } - end - - it "should fail when actual is not modified by the block" do - lambda do - lambda {}.should change{ @instance.some_value } - end.should fail_with("result should have changed, but is still 5") - end - - it "should warn if passed a block using do/end" do - lambda do - lambda {}.should change do - end - end.should raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/) - end -end - -describe "should_not change { block }" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 5 - end - - it "should pass when actual is modified by the block" do - lambda {}.should_not change{ @instance.some_value } - end - - it "should fail when actual is not modified by the block" do - lambda do - lambda {@instance.some_value = 6}.should_not change { @instance.some_value } - end.should fail_with("result should not have changed, but did change from 5 to 6") - end - - it "should warn if passed a block using do/end" do - lambda do - lambda {}.should_not change do - end - end.should raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/) - end -end - -describe "should change(actual, message).by(expected)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 5 - end - - it "should pass when attribute is changed by expected amount" do - lambda { @instance.some_value += 1 }.should change(@instance, :some_value).by(1) - end - - it "should fail when the attribute is changed by unexpected amount" do - lambda do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by(1) - end.should fail_with("some_value should have been changed by 1, but was changed by 2") - end - - it "should fail when the attribute is changed by unexpected amount in the opposite direction" do - lambda do - lambda { @instance.some_value -= 1 }.should change(@instance, :some_value).by(1) - end.should fail_with("some_value should have been changed by 1, but was changed by -1") - end -end - -describe "should change{ block }.by(expected)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 5 - end - - it "should pass when attribute is changed by expected amount" do - lambda { @instance.some_value += 1 }.should change{@instance.some_value}.by(1) - end - - it "should fail when the attribute is changed by unexpected amount" do - lambda do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by(1) - end.should fail_with("result should have been changed by 1, but was changed by 2") - end - - it "should fail when the attribute is changed by unexpected amount in the opposite direction" do - lambda do - lambda { @instance.some_value -= 1 }.should change{@instance.some_value}.by(1) - end.should fail_with("result should have been changed by 1, but was changed by -1") - end -end - -describe "should change(actual, message).by_at_least(expected)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 5 - end - - it "should pass when attribute is changed by greater than the expected amount" do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_least(1) - end - - it "should pass when attribute is changed by the expected amount" do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_least(2) - end - - it "should fail when the attribute is changed by less than the expected amount" do - lambda do - lambda { @instance.some_value += 1 }.should change(@instance, :some_value).by_at_least(2) - end.should fail_with("some_value should have been changed by at least 2, but was changed by 1") - end - -end - -describe "should change{ block }.by_at_least(expected)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 5 - end - - it "should pass when attribute is changed by greater than expected amount" do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_least(1) - end - - it "should pass when attribute is changed by the expected amount" do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_least(2) - end - - it "should fail when the attribute is changed by less than the unexpected amount" do - lambda do - lambda { @instance.some_value += 1 }.should change{@instance.some_value}.by_at_least(2) - end.should fail_with("result should have been changed by at least 2, but was changed by 1") - end -end - - -describe "should change(actual, message).by_at_most(expected)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 5 - end - - it "should pass when attribute is changed by less than the expected amount" do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(3) - end - - it "should pass when attribute is changed by the expected amount" do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(2) - end - - it "should fail when the attribute is changed by greater than the expected amount" do - lambda do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(1) - end.should fail_with("some_value should have been changed by at most 1, but was changed by 2") - end - -end - -describe "should change{ block }.by_at_most(expected)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 5 - end - - it "should pass when attribute is changed by less than expected amount" do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(3) - end - - it "should pass when attribute is changed by the expected amount" do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(2) - end - - it "should fail when the attribute is changed by greater than the unexpected amount" do - lambda do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(1) - end.should fail_with("result should have been changed by at most 1, but was changed by 2") - end -end - -describe "should change(actual, message).from(old)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 'string' - end - - it "should pass when attribute is == to expected value before executing block" do - lambda { @instance.some_value = "astring" }.should change(@instance, :some_value).from("string") - end - - it "should fail when attribute is not == to expected value before executing block" do - lambda do - lambda { @instance.some_value = "knot" }.should change(@instance, :some_value).from("cat") - end.should fail_with("some_value should have initially been \"cat\", but was \"string\"") - end -end - -describe "should change{ block }.from(old)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 'string' - end - - it "should pass when attribute is == to expected value before executing block" do - lambda { @instance.some_value = "astring" }.should change{@instance.some_value}.from("string") - end - - it "should fail when attribute is not == to expected value before executing block" do - lambda do - lambda { @instance.some_value = "knot" }.should change{@instance.some_value}.from("cat") - end.should fail_with("result should have initially been \"cat\", but was \"string\"") - end -end - -describe "should change(actual, message).to(new)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 'string' - end - - it "should pass when attribute is == to expected value after executing block" do - lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).to("cat") - end - - it "should fail when attribute is not == to expected value after executing block" do - lambda do - lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).from("string").to("dog") - end.should fail_with("some_value should have been changed to \"dog\", but is now \"cat\"") - end -end - -describe "should change{ block }.to(new)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 'string' - end - - it "should pass when attribute is == to expected value after executing block" do - lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.to("cat") - end - - it "should fail when attribute is not == to expected value after executing block" do - lambda do - lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.from("string").to("dog") - end.should fail_with("result should have been changed to \"dog\", but is now \"cat\"") - end -end - -describe "should change(actual, message).from(old).to(new)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 'string' - end - - it "should pass when #to comes before #from" do - lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).to("cat").from("string") - end - - it "should pass when #from comes before #to" do - lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).from("string").to("cat") - end -end - -describe "should change{ block }.from(old).to(new)" do - before(:each) do - @instance = SomethingExpected.new - @instance.some_value = 'string' - end - - it "should pass when #to comes before #from" do - lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.to("cat").from("string") - end - - it "should pass when #from comes before #to" do - lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.from("string").to("cat") - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/description_generation_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/description_generation_spec.rb deleted file mode 100644 index c494e2165..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/description_generation_spec.rb +++ /dev/null @@ -1,153 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "Matchers should be able to generate their own descriptions" do - after(:each) do - Spec::Matchers.clear_generated_description - end - - it "should == expected" do - "this".should == "this" - Spec::Matchers.generated_description.should == "should == \"this\"" - end - - it "should not == expected" do - "this".should_not == "that" - Spec::Matchers.generated_description.should == "should not == \"that\"" - end - - it "should be empty (arbitrary predicate)" do - [].should be_empty - Spec::Matchers.generated_description.should == "should be empty" - end - - it "should not be empty (arbitrary predicate)" do - [1].should_not be_empty - Spec::Matchers.generated_description.should == "should not be empty" - end - - it "should be true" do - true.should be_true - Spec::Matchers.generated_description.should == "should be true" - end - - it "should be false" do - false.should be_false - Spec::Matchers.generated_description.should == "should be false" - end - - it "should be nil" do - nil.should be_nil - Spec::Matchers.generated_description.should == "should be nil" - end - - it "should be > n" do - 5.should be > 3 - Spec::Matchers.generated_description.should == "should be > 3" - end - - it "should be predicate arg1, arg2 and arg3" do - 5.0.should be_between(0,10) - Spec::Matchers.generated_description.should == "should be between 0 and 10" - end - - it "should be_few_words predicate should be transformed to 'be few words'" do - 5.should be_kind_of(Fixnum) - Spec::Matchers.generated_description.should == "should be kind of Fixnum" - end - - it "should preserve a proper prefix for be predicate" do - 5.should be_a_kind_of(Fixnum) - Spec::Matchers.generated_description.should == "should be a kind of Fixnum" - 5.should be_an_instance_of(Fixnum) - Spec::Matchers.generated_description.should == "should be an instance of Fixnum" - end - - it "should equal" do - expected = "expected" - expected.should equal(expected) - Spec::Matchers.generated_description.should == "should equal \"expected\"" - end - - it "should_not equal" do - 5.should_not equal(37) - Spec::Matchers.generated_description.should == "should not equal 37" - end - - it "should eql" do - "string".should eql("string") - Spec::Matchers.generated_description.should == "should eql \"string\"" - end - - it "should not eql" do - "a".should_not eql(:a) - Spec::Matchers.generated_description.should == "should not eql :a" - end - - it "should have_key" do - {:a => "a"}.should have_key(:a) - Spec::Matchers.generated_description.should == "should have key :a" - end - - it "should have n items" do - team.should have(3).players - Spec::Matchers.generated_description.should == "should have 3 players" - end - - it "should have at least n items" do - team.should have_at_least(2).players - Spec::Matchers.generated_description.should == "should have at least 2 players" - end - - it "should have at most n items" do - team.should have_at_most(4).players - Spec::Matchers.generated_description.should == "should have at most 4 players" - end - - it "should include" do - [1,2,3].should include(3) - Spec::Matchers.generated_description.should == "should include 3" - end - - it "should match" do - "this string".should match(/this string/) - Spec::Matchers.generated_description.should == "should match /this string/" - end - - it "should raise_error" do - lambda { raise }.should raise_error - Spec::Matchers.generated_description.should == "should raise Exception" - end - - it "should raise_error with type" do - lambda { raise }.should raise_error(RuntimeError) - Spec::Matchers.generated_description.should == "should raise RuntimeError" - end - - it "should raise_error with type and message" do - lambda { raise "there was an error" }.should raise_error(RuntimeError, "there was an error") - Spec::Matchers.generated_description.should == "should raise RuntimeError with \"there was an error\"" - end - - it "should respond_to" do - [].should respond_to(:insert) - Spec::Matchers.generated_description.should == "should respond to #insert" - end - - it "should throw symbol" do - lambda { throw :what_a_mess }.should throw_symbol - Spec::Matchers.generated_description.should == "should throw a Symbol" - end - - it "should throw symbol (with named symbol)" do - lambda { throw :what_a_mess }.should throw_symbol(:what_a_mess) - Spec::Matchers.generated_description.should == "should throw :what_a_mess" - end - - def team - Class.new do - def players - [1,2,3] - end - end.new - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/eql_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/eql_spec.rb deleted file mode 100644 index 3f265d700..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/eql_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Matchers - describe Eql do - it "should match when actual.eql?(expected)" do - Eql.new(1).matches?(1).should be_true - end - it "should not match when !actual.eql?(expected)" do - Eql.new(1).matches?(2).should be_false - end - it "should describe itself" do - matcher = Eql.new(1) - matcher.description.should == "eql 1" - end - it "should provide message, expected and actual on #failure_message" do - matcher = Eql.new("1") - matcher.matches?(1) - matcher.failure_message.should == ["expected \"1\", got 1 (using .eql?)", "1", 1] - end - it "should provide message, expected and actual on #negative_failure_message" do - matcher = Eql.new(1) - matcher.matches?(1) - matcher.negative_failure_message.should == ["expected 1 not to equal 1 (using .eql?)", 1, 1] - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/equal_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/equal_spec.rb deleted file mode 100644 index 7667bdc38..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/equal_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Matchers - describe Equal do - it "should match when actual.equal?(expected)" do - Equal.new(1).matches?(1).should be_true - end - it "should not match when !actual.equal?(expected)" do - Equal.new("1").matches?("1").should be_false - end - it "should describe itself" do - matcher = Equal.new(1) - matcher.description.should == "equal 1" - end - it "should provide message, expected and actual on #failure_message" do - matcher = Equal.new("1") - matcher.matches?(1) - matcher.failure_message.should == ["expected \"1\", got 1 (using .equal?)", "1", 1] - end - it "should provide message, expected and actual on #negative_failure_message" do - matcher = Equal.new(1) - matcher.matches?(1) - matcher.negative_failure_message.should == ["expected 1 not to equal 1 (using .equal?)", 1, 1] - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/exist_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/exist_spec.rb deleted file mode 100644 index 0a509726e..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/exist_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -class Substance - def initialize exists, description - @exists = exists - @description = description - end - def exist? - @exists - end - def inspect - @description - end -end - -class SubstanceTester - include Spec::Matchers - def initialize substance - @substance = substance - end - def should_exist - @substance.should exist - end -end - -describe "should exist," do - - before(:each) do - @real = Substance.new true, 'something real' - @imaginary = Substance.new false, 'something imaginary' - end - - describe "within an example group" do - - it "should pass if target exists" do - @real.should exist - end - - it "should fail if target does not exist" do - lambda { @imaginary.should exist }.should fail - end - - it "should pass if target doesn't exist" do - lambda { @real.should_not exist }.should fail - end - end - - describe "outside of an example group" do - - it "should pass if target exists" do - real_tester = SubstanceTester.new @real - real_tester.should_exist - end - - end - -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/handler_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/handler_spec.rb deleted file mode 100644 index ad4fe6f85..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/handler_spec.rb +++ /dev/null @@ -1,129 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module ExampleExpectations - - class ArbitraryMatcher - def initialize(*args, &block) - if args.last.is_a? Hash - @expected = args.last[:expected] - end - if block_given? - @expected = block.call - end - @block = block - end - - def matches?(target) - @target = target - return @expected == target - end - - def with(new_value) - @expected = new_value - self - end - - def failure_message - "expected #{@expected}, got #{@target}" - end - - def negative_failure_message - "expected not #{@expected}, got #{@target}" - end - end - - class PositiveOnlyMatcher < ArbitraryMatcher - undef negative_failure_message rescue nil - end - - def arbitrary_matcher(*args, &block) - ArbitraryMatcher.new(*args, &block) - end - - def positive_only_matcher(*args, &block) - PositiveOnlyMatcher.new(*args, &block) - end - -end - -module Spec - module Expectations - describe ExpectationMatcherHandler, ".handle_matcher" do - it "should ask the matcher if it matches" do - matcher = mock("matcher") - actual = Object.new - matcher.should_receive(:matches?).with(actual).and_return(true) - ExpectationMatcherHandler.handle_matcher(actual, matcher) - end - - it "should explain when the matcher parameter is not a matcher" do - begin - nonmatcher = mock("nonmatcher") - actual = Object.new - ExpectationMatcherHandler.handle_matcher(actual, nonmatcher) - rescue Spec::Expectations::InvalidMatcherError => e - end - - e.message.should =~ /^Expected a matcher, got / - end - end - - describe NegativeExpectationMatcherHandler, ".handle_matcher" do - it "should explain when matcher does not support should_not" do - matcher = mock("matcher") - matcher.stub!(:matches?) - actual = Object.new - lambda { - NegativeExpectationMatcherHandler.handle_matcher(actual, matcher) - }.should fail_with(/Matcher does not support should_not.\n/) - end - - it "should ask the matcher if it matches" do - matcher = mock("matcher") - actual = Object.new - matcher.stub!(:negative_failure_message) - matcher.should_receive(:matches?).with(actual).and_return(false) - NegativeExpectationMatcherHandler.handle_matcher(actual, matcher) - end - - it "should explain when the matcher parameter is not a matcher" do - begin - nonmatcher = mock("nonmatcher") - actual = Object.new - NegativeExpectationMatcherHandler.handle_matcher(actual, nonmatcher) - rescue Spec::Expectations::InvalidMatcherError => e - end - - e.message.should =~ /^Expected a matcher, got / - end - end - - describe ExpectationMatcherHandler do - include ExampleExpectations - - it "should handle submitted args" do - 5.should arbitrary_matcher(:expected => 5) - 5.should arbitrary_matcher(:expected => "wrong").with(5) - lambda { 5.should arbitrary_matcher(:expected => 4) }.should fail_with("expected 4, got 5") - lambda { 5.should arbitrary_matcher(:expected => 5).with(4) }.should fail_with("expected 4, got 5") - 5.should_not arbitrary_matcher(:expected => 4) - 5.should_not arbitrary_matcher(:expected => 5).with(4) - lambda { 5.should_not arbitrary_matcher(:expected => 5) }.should fail_with("expected not 5, got 5") - lambda { 5.should_not arbitrary_matcher(:expected => 4).with(5) }.should fail_with("expected not 5, got 5") - end - - it "should handle the submitted block" do - 5.should arbitrary_matcher { 5 } - 5.should arbitrary_matcher(:expected => 4) { 5 } - 5.should arbitrary_matcher(:expected => 4).with(5) { 3 } - end - - it "should explain when matcher does not support should_not" do - lambda { - 5.should_not positive_only_matcher(:expected => 5) - }.should fail_with(/Matcher does not support should_not.\n/) - end - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/has_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/has_spec.rb deleted file mode 100644 index 47f048ebf..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/has_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "should have_sym(*args)" do - it "should pass if #has_sym?(*args) returns true" do - {:a => "A"}.should have_key(:a) - end - - it "should fail if #has_sym?(*args) returns false" do - lambda { - {:b => "B"}.should have_key(:a) - }.should fail_with("expected #has_key?(:a) to return true, got false") - end - - it "should fail if target does not respond to #has_sym?" do - lambda { - Object.new.should have_key(:a) - }.should raise_error(NoMethodError) - end -end - -describe "should_not have_sym(*args)" do - it "should pass if #has_sym?(*args) returns false" do - {:a => "A"}.should_not have_key(:b) - end - - it "should fail if #has_sym?(*args) returns true" do - lambda { - {:a => "A"}.should_not have_key(:a) - }.should fail_with("expected #has_key?(:a) to return false, got true") - end - - it "should fail if target does not respond to #has_sym?" do - lambda { - Object.new.should have_key(:a) - }.should raise_error(NoMethodError) - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/have_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/have_spec.rb deleted file mode 100644 index 27083c294..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/have_spec.rb +++ /dev/null @@ -1,291 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module HaveSpecHelper - def create_collection_owner_with(n) - owner = Spec::Expectations::Helper::CollectionOwner.new - (1..n).each do |n| - owner.add_to_collection_with_length_method(n) - owner.add_to_collection_with_size_method(n) - end - owner - end -end - -describe "should have(n).items" do - include HaveSpecHelper - - it "should pass if target has a collection of items with n members" do - owner = create_collection_owner_with(3) - owner.should have(3).items_in_collection_with_length_method - owner.should have(3).items_in_collection_with_size_method - end - - it "should convert :no to 0" do - owner = create_collection_owner_with(0) - owner.should have(:no).items_in_collection_with_length_method - owner.should have(:no).items_in_collection_with_size_method - end - - it "should fail if target has a collection of items with < n members" do - owner = create_collection_owner_with(3) - lambda { - owner.should have(4).items_in_collection_with_length_method - }.should fail_with("expected 4 items_in_collection_with_length_method, got 3") - lambda { - owner.should have(4).items_in_collection_with_size_method - }.should fail_with("expected 4 items_in_collection_with_size_method, got 3") - end - - it "should fail if target has a collection of items with > n members" do - owner = create_collection_owner_with(3) - lambda { - owner.should have(2).items_in_collection_with_length_method - }.should fail_with("expected 2 items_in_collection_with_length_method, got 3") - lambda { - owner.should have(2).items_in_collection_with_size_method - }.should fail_with("expected 2 items_in_collection_with_size_method, got 3") - end -end - -describe 'should have(1).item when Inflector is defined' do - include HaveSpecHelper - - before do - unless Object.const_defined?(:Inflector) - class Inflector - def self.pluralize(string) - string.to_s + 's' - end - end - end - end - - it 'should pluralize the collection name' do - owner = create_collection_owner_with(1) - owner.should have(1).item - end -end - -describe "should have(n).items where result responds to items but returns something other than a collection" do - it "should provide a meaningful error" do - owner = Class.new do - def items - Object.new - end - end.new - lambda do - owner.should have(3).items - end.should raise_error("expected items to be a collection but it does not respond to #length or #size") - end -end - -describe "should_not have(n).items" do - include HaveSpecHelper - - it "should pass if target has a collection of items with < n members" do - owner = create_collection_owner_with(3) - owner.should_not have(4).items_in_collection_with_length_method - owner.should_not have(4).items_in_collection_with_size_method - end - - it "should pass if target has a collection of items with > n members" do - owner = create_collection_owner_with(3) - owner.should_not have(2).items_in_collection_with_length_method - owner.should_not have(2).items_in_collection_with_size_method - end - - it "should fail if target has a collection of items with n members" do - owner = create_collection_owner_with(3) - lambda { - owner.should_not have(3).items_in_collection_with_length_method - }.should fail_with("expected target not to have 3 items_in_collection_with_length_method, got 3") - lambda { - owner.should_not have(3).items_in_collection_with_size_method - }.should fail_with("expected target not to have 3 items_in_collection_with_size_method, got 3") - end -end - -describe "should have_exactly(n).items" do - include HaveSpecHelper - - it "should pass if target has a collection of items with n members" do - owner = create_collection_owner_with(3) - owner.should have_exactly(3).items_in_collection_with_length_method - owner.should have_exactly(3).items_in_collection_with_size_method - end - - it "should convert :no to 0" do - owner = create_collection_owner_with(0) - owner.should have_exactly(:no).items_in_collection_with_length_method - owner.should have_exactly(:no).items_in_collection_with_size_method - end - - it "should fail if target has a collection of items with < n members" do - owner = create_collection_owner_with(3) - lambda { - owner.should have_exactly(4).items_in_collection_with_length_method - }.should fail_with("expected 4 items_in_collection_with_length_method, got 3") - lambda { - owner.should have_exactly(4).items_in_collection_with_size_method - }.should fail_with("expected 4 items_in_collection_with_size_method, got 3") - end - - it "should fail if target has a collection of items with > n members" do - owner = create_collection_owner_with(3) - lambda { - owner.should have_exactly(2).items_in_collection_with_length_method - }.should fail_with("expected 2 items_in_collection_with_length_method, got 3") - lambda { - owner.should have_exactly(2).items_in_collection_with_size_method - }.should fail_with("expected 2 items_in_collection_with_size_method, got 3") - end -end - -describe "should have_at_least(n).items" do - include HaveSpecHelper - - it "should pass if target has a collection of items with n members" do - owner = create_collection_owner_with(3) - owner.should have_at_least(3).items_in_collection_with_length_method - owner.should have_at_least(3).items_in_collection_with_size_method - end - - it "should pass if target has a collection of items with > n members" do - owner = create_collection_owner_with(3) - owner.should have_at_least(2).items_in_collection_with_length_method - owner.should have_at_least(2).items_in_collection_with_size_method - end - - it "should fail if target has a collection of items with < n members" do - owner = create_collection_owner_with(3) - lambda { - owner.should have_at_least(4).items_in_collection_with_length_method - }.should fail_with("expected at least 4 items_in_collection_with_length_method, got 3") - lambda { - owner.should have_at_least(4).items_in_collection_with_size_method - }.should fail_with("expected at least 4 items_in_collection_with_size_method, got 3") - end - - it "should provide educational negative failure messages" do - #given - owner = create_collection_owner_with(3) - length_matcher = have_at_least(3).items_in_collection_with_length_method - size_matcher = have_at_least(3).items_in_collection_with_size_method - - #when - length_matcher.matches?(owner) - size_matcher.matches?(owner) - - #then - length_matcher.negative_failure_message.should == <<-EOF -Isn't life confusing enough? -Instead of having to figure out the meaning of this: - should_not have_at_least(3).items_in_collection_with_length_method -We recommend that you use this instead: - should have_at_most(2).items_in_collection_with_length_method -EOF - - size_matcher.negative_failure_message.should == <<-EOF -Isn't life confusing enough? -Instead of having to figure out the meaning of this: - should_not have_at_least(3).items_in_collection_with_size_method -We recommend that you use this instead: - should have_at_most(2).items_in_collection_with_size_method -EOF - end -end - -describe "should have_at_most(n).items" do - include HaveSpecHelper - - it "should pass if target has a collection of items with n members" do - owner = create_collection_owner_with(3) - owner.should have_at_most(3).items_in_collection_with_length_method - owner.should have_at_most(3).items_in_collection_with_size_method - end - - it "should fail if target has a collection of items with > n members" do - owner = create_collection_owner_with(3) - lambda { - owner.should have_at_most(2).items_in_collection_with_length_method - }.should fail_with("expected at most 2 items_in_collection_with_length_method, got 3") - lambda { - owner.should have_at_most(2).items_in_collection_with_size_method - }.should fail_with("expected at most 2 items_in_collection_with_size_method, got 3") - end - - it "should pass if target has a collection of items with < n members" do - owner = create_collection_owner_with(3) - owner.should have_at_most(4).items_in_collection_with_length_method - owner.should have_at_most(4).items_in_collection_with_size_method - end - - it "should provide educational negative failure messages" do - #given - owner = create_collection_owner_with(3) - length_matcher = have_at_most(3).items_in_collection_with_length_method - size_matcher = have_at_most(3).items_in_collection_with_size_method - - #when - length_matcher.matches?(owner) - size_matcher.matches?(owner) - - #then - length_matcher.negative_failure_message.should == <<-EOF -Isn't life confusing enough? -Instead of having to figure out the meaning of this: - should_not have_at_most(3).items_in_collection_with_length_method -We recommend that you use this instead: - should have_at_least(4).items_in_collection_with_length_method -EOF - - size_matcher.negative_failure_message.should == <<-EOF -Isn't life confusing enough? -Instead of having to figure out the meaning of this: - should_not have_at_most(3).items_in_collection_with_size_method -We recommend that you use this instead: - should have_at_least(4).items_in_collection_with_size_method -EOF - end -end - -describe "have(n).items(args, block)" do - it "should pass args to target" do - target = mock("target") - target.should_receive(:items).with("arg1","arg2").and_return([1,2,3]) - target.should have(3).items("arg1","arg2") - end - - it "should pass block to target" do - target = mock("target") - block = lambda { 5 } - target.should_receive(:items).with("arg1","arg2", block).and_return([1,2,3]) - target.should have(3).items("arg1","arg2", block) - end -end - -describe "have(n).items where target IS a collection" do - it "should reference the number of items IN the collection" do - [1,2,3].should have(3).items - end - - it "should fail when the number of items IN the collection is not as expected" do - lambda { [1,2,3].should have(7).items }.should fail_with("expected 7 items, got 3") - end -end - -describe "have(n).characters where target IS a String" do - it "should pass if the length is correct" do - "this string".should have(11).characters - end - - it "should fail if the length is incorrect" do - lambda { "this string".should have(12).characters }.should fail_with("expected 12 characters, got 11") - end -end - -describe "have(n).things on an object which is not a collection nor contains one" do - it "should fail" do - lambda { Object.new.should have(2).things }.should raise_error(NoMethodError, /undefined method `things' for #" do - - it "should pass if > passes" do - 4.should > 3 - end - - it "should fail if > fails" do - Spec::Expectations.should_receive(:fail_with).with(%[expected: > 5,\n got: 4], 5, 4) - 4.should > 5 - end - -end - -describe "should >=" do - - it "should pass if >= passes" do - 4.should > 3 - 4.should >= 4 - end - - it "should fail if > fails" do - Spec::Expectations.should_receive(:fail_with).with(%[expected: >= 5,\n got: 4], 5, 4) - 4.should >= 5 - end - -end - -describe "should <" do - - it "should pass if < passes" do - 4.should < 5 - end - - it "should fail if > fails" do - Spec::Expectations.should_receive(:fail_with).with(%[expected: < 3,\n got: 4], 3, 4) - 4.should < 3 - end - -end - -describe "should <=" do - - it "should pass if <= passes" do - 4.should <= 5 - 4.should <= 4 - end - - it "should fail if > fails" do - Spec::Expectations.should_receive(:fail_with).with(%[expected: <= 3,\n got: 4], 3, 4) - 4.should <= 3 - end - -end - diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/raise_error_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/raise_error_spec.rb deleted file mode 100644 index f33fba903..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/raise_error_spec.rb +++ /dev/null @@ -1,185 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "should raise_error" do - it "should pass if anything is raised" do - lambda {raise}.should raise_error - end - - it "should fail if nothing is raised" do - lambda { - lambda {}.should raise_error - }.should fail_with("expected Exception but nothing was raised") - end -end - -describe "should_not raise_error" do - it "should pass if nothing is raised" do - lambda {}.should_not raise_error - end - - it "should fail if anything is raised" do - lambda { - lambda {raise}.should_not raise_error - }.should fail_with("expected no Exception, got RuntimeError") - end -end - -describe "should raise_error(message)" do - it "should pass if RuntimeError is raised with the right message" do - lambda {raise 'blah'}.should raise_error('blah') - end - it "should pass if any other error is raised with the right message" do - lambda {raise NameError.new('blah')}.should raise_error('blah') - end - it "should fail if RuntimeError error is raised with the wrong message" do - lambda do - lambda {raise 'blarg'}.should raise_error('blah') - end.should fail_with("expected Exception with \"blah\", got #") - end - it "should fail if any other error is raised with the wrong message" do - lambda do - lambda {raise NameError.new('blarg')}.should raise_error('blah') - end.should fail_with("expected Exception with \"blah\", got #") - end -end - -describe "should_not raise_error(message)" do - it "should pass if RuntimeError error is raised with the different message" do - lambda {raise 'blarg'}.should_not raise_error('blah') - end - it "should pass if any other error is raised with the wrong message" do - lambda {raise NameError.new('blarg')}.should_not raise_error('blah') - end - it "should fail if RuntimeError is raised with message" do - lambda do - lambda {raise 'blah'}.should_not raise_error('blah') - end.should fail_with(%Q|expected no Exception with "blah", got #|) - end - it "should fail if any other error is raised with message" do - lambda do - lambda {raise NameError.new('blah')}.should_not raise_error('blah') - end.should fail_with(%Q|expected no Exception with "blah", got #|) - end -end - -describe "should raise_error(NamedError)" do - it "should pass if named error is raised" do - lambda { non_existent_method }.should raise_error(NameError) - end - - it "should fail if nothing is raised" do - lambda { - lambda { }.should raise_error(NameError) - }.should fail_with("expected NameError but nothing was raised") - end - - it "should fail if another error is raised" do - lambda { - lambda { raise }.should raise_error(NameError) - }.should fail_with("expected NameError, got RuntimeError") - end -end - -describe "should_not raise_error(NamedError)" do - it "should pass if nothing is raised" do - lambda { }.should_not raise_error(NameError) - end - - it "should pass if another error is raised" do - lambda { raise }.should_not raise_error(NameError) - end - - it "should fail if named error is raised" do - lambda { - lambda { non_existent_method }.should_not raise_error(NameError) - }.should fail_with(/expected no NameError, got #") - end -end - -describe "should raise_error(NamedError, error_message) with Regexp" do - it "should pass if named error is raised with matching message" do - lambda { raise "example message" }.should raise_error(RuntimeError, /ample mess/) - end - - it "should fail if nothing is raised" do - lambda { - lambda {}.should raise_error(RuntimeError, /ample mess/) - }.should fail_with("expected RuntimeError with message matching /ample mess/ but nothing was raised") - end - - it "should fail if incorrect error is raised" do - lambda { - lambda { raise }.should raise_error(NameError, /ample mess/) - }.should fail_with("expected NameError with message matching /ample mess/, got RuntimeError") - end - - it "should fail if correct error is raised with incorrect message" do - lambda { - lambda { raise RuntimeError.new("not the example message") }.should raise_error(RuntimeError, /less than ample mess/) - }.should fail_with("expected RuntimeError with message matching /less than ample mess/, got #") - end -end - -describe "should_not raise_error(NamedError, error_message) with Regexp" do - it "should pass if nothing is raised" do - lambda {}.should_not raise_error(RuntimeError, /ample mess/) - end - - it "should pass if a different error is raised" do - lambda { raise }.should_not raise_error(NameError, /ample mess/) - end - - it "should pass if same error is raised with non-matching message" do - lambda { raise RuntimeError.new("non matching message") }.should_not raise_error(RuntimeError, /ample mess/) - end - - it "should fail if named error is raised with matching message" do - lambda { - lambda { raise "example message" }.should_not raise_error(RuntimeError, /ample mess/) - }.should fail_with("expected no RuntimeError with message matching /ample mess/, got #") - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/respond_to_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/respond_to_spec.rb deleted file mode 100644 index 2cdbbcd63..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/respond_to_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "should respond_to(:sym)" do - - it "should pass if target responds to :sym" do - Object.new.should respond_to(:methods) - end - - it "should fail target does not respond to :sym" do - lambda { - Object.new.should respond_to(:some_method) - }.should fail_with("expected target to respond to :some_method") - end - -end - -describe "should respond_to(message1, message2)" do - - it "should pass if target responds to both messages" do - Object.new.should respond_to('methods', 'inspect') - end - - it "should fail target does not respond to first message" do - lambda { - Object.new.should respond_to('method_one', 'inspect') - }.should fail_with('expected target to respond to "method_one"') - end - - it "should fail target does not respond to second message" do - lambda { - Object.new.should respond_to('inspect', 'method_one') - }.should fail_with('expected target to respond to "method_one"') - end - - it "should fail target does not respond to either message" do - lambda { - Object.new.should respond_to('method_one', 'method_two') - }.should fail_with('expected target to respond to "method_one", "method_two"') - end -end - -describe "should_not respond_to(:sym)" do - - it "should pass if target does not respond to :sym" do - Object.new.should_not respond_to(:some_method) - end - - it "should fail target responds to :sym" do - lambda { - Object.new.should_not respond_to(:methods) - }.should fail_with("expected target not to respond to :methods") - end - -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/satisfy_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/satisfy_spec.rb deleted file mode 100644 index 7e8d6f972..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/satisfy_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "should satisfy { block }" do - it "should pass if block returns true" do - true.should satisfy { |val| val } - true.should satisfy do |val| - val - end - end - - it "should fail if block returns false" do - lambda { - false.should satisfy { |val| val } - }.should fail_with("expected false to satisfy block") - lambda do - false.should satisfy do |val| - val - end - end.should fail_with("expected false to satisfy block") - end -end - -describe "should_not satisfy { block }" do - it "should pass if block returns false" do - false.should_not satisfy { |val| val } - false.should_not satisfy do |val| - val - end - end - - it "should fail if block returns true" do - lambda { - true.should_not satisfy { |val| val } - }.should fail_with("expected true not to satisfy block") - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/simple_matcher_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/simple_matcher_spec.rb deleted file mode 100644 index b731af92d..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/simple_matcher_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Matchers - describe SimpleMatcher do - it "should match pass match arg to block" do - actual = nil - matcher = simple_matcher("message") do |given| actual = given end - matcher.matches?("foo") - actual.should == "foo" - end - - it "should provide a stock failure message" do - matcher = simple_matcher("thing") do end - matcher.matches?("other") - matcher.failure_message.should =~ /expected \"thing\" but got \"other\"/ - end - - it "should provide a stock negative failure message" do - matcher = simple_matcher("thing") do end - matcher.matches?("other") - matcher.negative_failure_message.should =~ /expected not to get \"thing\", but got \"other\"/ - end - - it "should provide a description" do - matcher = simple_matcher("thing") do end - matcher.description.should =="thing" - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/matchers/throw_symbol_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/matchers/throw_symbol_spec.rb deleted file mode 100644 index 74595659a..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/matchers/throw_symbol_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Matchers - describe ThrowSymbol, "(constructed with no Symbol)" do - before(:each) { @matcher = ThrowSymbol.new } - - it "should match if any Symbol is thrown" do - @matcher.matches?(lambda{ throw :sym }).should be_true - end - it "should not match if no Symbol is thrown" do - @matcher.matches?(lambda{ }).should be_false - end - it "should provide a failure message" do - @matcher.matches?(lambda{}) - @matcher.failure_message.should == "expected a Symbol but nothing was thrown" - end - it "should provide a negative failure message" do - @matcher.matches?(lambda{ throw :sym}) - @matcher.negative_failure_message.should == "expected no Symbol, got :sym" - end - end - - describe ThrowSymbol, "(constructed with a Symbol)" do - before(:each) { @matcher = ThrowSymbol.new(:sym) } - - it "should match if correct Symbol is thrown" do - @matcher.matches?(lambda{ throw :sym }).should be_true - end - it "should not match if no Symbol is thrown" do - @matcher.matches?(lambda{ }).should be_false - end - it "should not match if correct Symbol is thrown" do - @matcher.matches?(lambda{ throw :other_sym }).should be_false - @matcher.failure_message.should == "expected :sym, got :other_sym" - end - it "should provide a failure message when no Symbol is thrown" do - @matcher.matches?(lambda{}) - @matcher.failure_message.should == "expected :sym but nothing was thrown" - end - it "should provide a failure message when wrong Symbol is thrown" do - @matcher.matches?(lambda{ throw :other_sym }) - @matcher.failure_message.should == "expected :sym, got :other_sym" - end - it "should provide a negative failure message" do - @matcher.matches?(lambda{ throw :sym }) - @matcher.negative_failure_message.should == "expected :sym not to be thrown" - end - it "should only match NameErrors raised by uncaught throws" do - @matcher.matches?(lambda{ sym }).should be_false - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/any_number_of_times_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/any_number_of_times_spec.rb deleted file mode 100644 index 3f50dcfc5..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/any_number_of_times_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - - describe "AnyNumberOfTimes" do - before(:each) do - @mock = Mock.new("test mock") - end - - it "should pass if any number of times method is called many times" do - @mock.should_receive(:random_call).any_number_of_times - (1..10).each do - @mock.random_call - end - end - - it "should pass if any number of times method is called once" do - @mock.should_receive(:random_call).any_number_of_times - @mock.random_call - end - - it "should pass if any number of times method is not called" do - @mock.should_receive(:random_call).any_number_of_times - end - end - - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/argument_expectation_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/argument_expectation_spec.rb deleted file mode 100644 index 2bebbdd4f..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/argument_expectation_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe ArgumentExpectation do - it "should consider an object that responds to #matches? and #description to be a matcher" do - argument_expecatation = Spec::Mocks::ArgumentExpectation.new([]) - obj = mock("matcher") - obj.should_receive(:respond_to?).with(:matches?).and_return(true) - obj.should_receive(:respond_to?).with(:description).and_return(true) - argument_expecatation.is_matcher?(obj).should be_true - end - - it "should NOT consider an object that only responds to #matches? to be a matcher" do - argument_expecatation = Spec::Mocks::ArgumentExpectation.new([]) - obj = mock("matcher") - obj.should_receive(:respond_to?).with(:matches?).and_return(true) - obj.should_receive(:respond_to?).with(:description).and_return(false) - argument_expecatation.is_matcher?(obj).should be_false - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/at_least_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/at_least_spec.rb deleted file mode 100644 index 01b133dc3..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/at_least_spec.rb +++ /dev/null @@ -1,97 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "at_least" do - before(:each) do - @mock = Mock.new("test mock") - end - - it "should fail if method is never called" do - @mock.should_receive(:random_call).at_least(4).times - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should fail when called less than n times" do - @mock.should_receive(:random_call).at_least(4).times - @mock.random_call - @mock.random_call - @mock.random_call - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should fail when at least once method is never called" do - @mock.should_receive(:random_call).at_least(:once) - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should fail when at least twice method is called once" do - @mock.should_receive(:random_call).at_least(:twice) - @mock.random_call - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should fail when at least twice method is never called" do - @mock.should_receive(:random_call).at_least(:twice) - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should pass when at least n times method is called exactly n times" do - @mock.should_receive(:random_call).at_least(4).times - @mock.random_call - @mock.random_call - @mock.random_call - @mock.random_call - @mock.rspec_verify - end - - it "should pass when at least n times method is called n plus 1 times" do - @mock.should_receive(:random_call).at_least(4).times - @mock.random_call - @mock.random_call - @mock.random_call - @mock.random_call - @mock.random_call - @mock.rspec_verify - end - - it "should pass when at least once method is called once" do - @mock.should_receive(:random_call).at_least(:once) - @mock.random_call - @mock.rspec_verify - end - - it "should pass when at least once method is called twice" do - @mock.should_receive(:random_call).at_least(:once) - @mock.random_call - @mock.random_call - @mock.rspec_verify - end - - it "should pass when at least twice method is called three times" do - @mock.should_receive(:random_call).at_least(:twice) - @mock.random_call - @mock.random_call - @mock.random_call - @mock.rspec_verify - end - - it "should pass when at least twice method is called twice" do - @mock.should_receive(:random_call).at_least(:twice) - @mock.random_call - @mock.random_call - @mock.rspec_verify - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/at_most_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/at_most_spec.rb deleted file mode 100644 index f3c5e2150..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/at_most_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "at_most" do - before(:each) do - @mock = Mock.new("test mock") - end - - it "should fail when at most n times method is called n plus 1 times" do - @mock.should_receive(:random_call).at_most(4).times - @mock.random_call - @mock.random_call - @mock.random_call - @mock.random_call - @mock.random_call - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should fail when at most once method is called twice" do - @mock.should_receive(:random_call).at_most(:once) - @mock.random_call - @mock.random_call - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should fail when at most twice method is called three times" do - @mock.should_receive(:random_call).at_most(:twice) - @mock.random_call - @mock.random_call - @mock.random_call - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should pass when at most n times method is called exactly n times" do - @mock.should_receive(:random_call).at_most(4).times - @mock.random_call - @mock.random_call - @mock.random_call - @mock.random_call - @mock.rspec_verify - end - - it "should pass when at most n times method is called less than n times" do - @mock.should_receive(:random_call).at_most(4).times - @mock.random_call - @mock.random_call - @mock.random_call - @mock.rspec_verify - end - - it "should pass when at most n times method is never called" do - @mock.should_receive(:random_call).at_most(4).times - @mock.rspec_verify - end - - it "should pass when at most once method is called once" do - @mock.should_receive(:random_call).at_most(:once) - @mock.random_call - @mock.rspec_verify - end - - it "should pass when at most once method is never called" do - @mock.should_receive(:random_call).at_most(:once) - @mock.rspec_verify - end - - it "should pass when at most twice method is called once" do - @mock.should_receive(:random_call).at_most(:twice) - @mock.random_call - @mock.rspec_verify - end - - it "should pass when at most twice method is called twice" do - @mock.should_receive(:random_call).at_most(:twice) - @mock.random_call - @mock.random_call - @mock.rspec_verify - end - - it "should pass when at most twice method is never called" do - @mock.should_receive(:random_call).at_most(:twice) - @mock.rspec_verify - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_10260_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_10260_spec.rb deleted file mode 100644 index 2f7b5803d..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_10260_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "An RSpec Mock" do - it "should hide internals in its inspect representation" do - m = mock('cup') - m.inspect.should =~ /#/ - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_10263.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_10263.rb deleted file mode 100644 index f82180c09..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_10263.rb +++ /dev/null @@ -1,24 +0,0 @@ -describe "Mock" do - before do - @mock = mock("test mock") - end - - specify "when one example has an expectation (non-mock) inside the block passed to the mock" do - @mock.should_receive(:msg) do |b| - b.should be_true #this call exposes the problem - end - @mock.msg(false) rescue nil - end - - specify "then the next example should behave as expected instead of saying" do - @mock.should_receive(:foobar) - @mock.foobar - @mock.rspec_verify - begin - @mock.foobar - rescue => e - e.message.should == "Mock 'test mock' received unexpected message :foobar with (no args)" - end - end -end - diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_11545_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_11545_spec.rb deleted file mode 100644 index 8a334afa5..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_11545_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -class LiarLiarPantsOnFire - def respond_to?(sym) - true - end - - def self.respond_to?(sym) - true - end -end - -describe 'should_receive' do - before(:each) do - @liar = LiarLiarPantsOnFire.new - end - - it "should work when object lies about responding to a method" do - @liar.should_receive(:something) - @liar.something - end - - it 'should work when class lies about responding to a method' do - LiarLiarPantsOnFire.should_receive(:something) - LiarLiarPantsOnFire.something - end - - it 'should cleanup after itself' do - LiarLiarPantsOnFire.metaclass.instance_methods.should_not include("something") - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_15719_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_15719_spec.rb deleted file mode 100644 index 82d49ea97..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_15719_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "mock failure" do - - it "should tell you when it receives the right message with the wrong args" do - m = mock("foo") - m.should_receive(:bar).with("message") - lambda { - m.bar("different message") - }.should raise_error(Spec::Mocks::MockExpectationError, %Q{Mock 'foo' expected :bar with ("message") but received it with ("different message")}) - m.bar("message") # allows the spec to pass - end - - it "should tell you when it receives the right message with the wrong args if you stub the method" do - pending("fix bug 15719") - # NOTE - for whatever reason, if you use a the block style of pending here, - # rcov gets unhappy. Don't know why yet. - m = mock("foo") - m.stub!(:bar) - m.should_receive(:bar).with("message") - lambda { - m.bar("different message") - }.should raise_error(Spec::Mocks::MockExpectationError, %Q{Mock 'foo' expected :bar with ("message") but received it with ("different message")}) - m.bar("message") # allows the spec to pass - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_7611_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_7611_spec.rb deleted file mode 100644 index 6c9705bcc..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_7611_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Bug7611 - class Foo - end - - class Bar < Foo - end - - describe "A Partial Mock" do - it "should respect subclasses" do - Foo.stub!(:new).and_return(Object.new) - end - - it "should" do - Bar.new.class.should == Bar - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_7805_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_7805_spec.rb deleted file mode 100644 index f7edfac17..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_7805_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Bug7805 - #This is really a duplicate of 8302 - - describe "Stubs should correctly restore module methods" do - it "1 - stub the open method" do - File.stub!(:open).and_return("something") - File.open.should == "something" - end - it "2 - use File.open to create example.txt" do - filename = "#{File.dirname(__FILE__)}/example-#{Time.new.to_i}.txt" - File.exist?(filename).should be_false - file = File.open(filename,'w') - file.close - File.exist?(filename).should be_true - File.delete(filename) - File.exist?(filename).should be_false - end - end - -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_8165_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_8165_spec.rb deleted file mode 100644 index 7edc3c076..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_8165_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "An object where respond_to? is true and does not have method" do - # When should_receive(:sym) is sent to any object, the Proxy sends - # respond_to?(:sym) to that object to see if the method should be proxied. - # - # If respond_to? itself is proxied, then when the Proxy sends respond_to? - # to the object, the proxy is invoked and responds yes (if so set in the spec). - # When the object does NOT actually respond to :sym, an exception is thrown - # when trying to proxy it. - # - # The fix was to keep track of whether :respond_to? had been proxied and, if - # so, call the munged copy of :respond_to? on the object. - - it "should not raise an exception for Object" do - obj = Object.new - obj.should_receive(:respond_to?).with(:foobar).and_return(true) - obj.should_receive(:foobar).and_return(:baz) - obj.respond_to?(:foobar).should be_true - obj.foobar.should == :baz - end - - it "should not raise an exception for mock" do - obj = mock("obj") - obj.should_receive(:respond_to?).with(:foobar).and_return(true) - obj.should_receive(:foobar).and_return(:baz) - obj.respond_to?(:foobar).should be_true - obj.foobar.should == :baz - end - -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_8302_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_8302_spec.rb deleted file mode 100644 index a41df43d8..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/bug_report_8302_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Bug8302 - class Foo - def Foo.class_method(arg) - end - - def instance_bar(arg) - end - end - - describe "Bug report 8302:" do - it "class method is not restored correctly when proxied" do - Foo.should_not_receive(:class_method).with(Array.new) - Foo.rspec_verify - Foo.class_method(Array.new) - end - - it "instance method is not restored correctly when proxied" do - foo = Foo.new - foo.should_not_receive(:instance_bar).with(Array.new) - foo.rspec_verify - foo.instance_bar(Array.new) - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/failing_mock_argument_constraints_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/failing_mock_argument_constraints_spec.rb deleted file mode 100644 index db6dcea34..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +++ /dev/null @@ -1,115 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "failing MockArgumentConstraints" do - before(:each) do - @mock = mock("test mock") - @reporter = Mock.new("reporter", :null_object => true) - end - - after(:each) do - @mock.rspec_reset - end - - it "should reject non boolean" do - @mock.should_receive(:random_call).with(boolean()) - lambda do - @mock.random_call("false") - end.should raise_error(MockExpectationError) - end - - it "should reject non numeric" do - @mock.should_receive(:random_call).with(an_instance_of(Numeric)) - lambda do - @mock.random_call("1") - end.should raise_error(MockExpectationError) - end - - it "should reject non string" do - @mock.should_receive(:random_call).with(an_instance_of(String)) - lambda do - @mock.random_call(123) - end.should raise_error(MockExpectationError) - end - - it "should reject goose when expecting a duck" do - @mock.should_receive(:random_call).with(duck_type(:abs, :div)) - lambda { @mock.random_call("I don't respond to :abs or :div") }.should raise_error(MockExpectationError) - end - - it "should fail if regexp does not match submitted string" do - @mock.should_receive(:random_call).with(/bcd/) - lambda { @mock.random_call("abc") }.should raise_error(MockExpectationError) - end - - it "should fail if regexp does not match submitted regexp" do - @mock.should_receive(:random_call).with(/bcd/) - lambda { @mock.random_call(/bcde/) }.should raise_error(MockExpectationError) - end - - it "should fail for a hash w/ wrong values" do - @mock.should_receive(:random_call).with(:a => "b", :c => "d") - lambda do - @mock.random_call(:a => "b", :c => "e") - end.should raise_error(MockExpectationError, /Mock 'test mock' expected :random_call with \(\{(:a=>\"b\", :c=>\"d\"|:c=>\"d\", :a=>\"b\")\}\) but received it with \(\{(:a=>\"b\", :c=>\"e\"|:c=>\"e\", :a=>\"b\")\}\)/) - end - - it "should fail for a hash w/ wrong keys" do - @mock.should_receive(:random_call).with(:a => "b", :c => "d") - lambda do - @mock.random_call("a" => "b", "c" => "d") - end.should raise_error(MockExpectationError, /Mock 'test mock' expected :random_call with \(\{(:a=>\"b\", :c=>\"d\"|:c=>\"d\", :a=>\"b\")\}\) but received it with \(\{(\"a\"=>\"b\", \"c\"=>\"d\"|\"c\"=>\"d\", \"a\"=>\"b\")\}\)/) - end - - it "should match against a Matcher" do - lambda do - @mock.should_receive(:msg).with(equal(3)) - @mock.msg(37) - end.should raise_error(MockExpectationError, "Mock 'test mock' expected :msg with (equal 3) but received it with (37)") - end - - it "should fail no_args with one arg" do - lambda do - @mock.should_receive(:msg).with(no_args) - @mock.msg(37) - end.should raise_error(MockExpectationError, "Mock 'test mock' expected :msg with (no args) but received it with (37)") - end - end - - describe "failing deprecated MockArgumentConstraints" do - before(:each) do - @mock = mock("test mock") - @reporter = Mock.new("reporter", :null_object => true) - Kernel.stub!(:warn) - end - - after(:each) do - @mock.rspec_reset - end - - it "should reject non boolean" do - @mock.should_receive(:random_call).with(:boolean) - lambda do - @mock.random_call("false") - end.should raise_error(MockExpectationError) - end - - it "should reject non numeric" do - @mock.should_receive(:random_call).with(:numeric) - lambda do - @mock.random_call("1") - end.should raise_error(MockExpectationError) - end - - it "should reject non string" do - @mock.should_receive(:random_call).with(:string) - lambda do - @mock.random_call(123) - end.should raise_error(MockExpectationError) - end - - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/mock_ordering_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/mock_ordering_spec.rb deleted file mode 100644 index 919da2970..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/mock_ordering_spec.rb +++ /dev/null @@ -1,84 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Mocks - - describe "Mock ordering" do - - before do - @mock = mock("test mock") - end - - after do - @mock.rspec_reset - end - - it "should pass two calls in order" do - @mock.should_receive(:one).ordered - @mock.should_receive(:two).ordered - @mock.one - @mock.two - @mock.rspec_verify - end - - it "should pass three calls in order" do - @mock.should_receive(:one).ordered - @mock.should_receive(:two).ordered - @mock.should_receive(:three).ordered - @mock.one - @mock.two - @mock.three - @mock.rspec_verify - end - - it "should fail if second call comes first" do - @mock.should_receive(:one).ordered - @mock.should_receive(:two).ordered - lambda do - @mock.two - end.should raise_error(MockExpectationError, "Mock 'test mock' received :two out of order") - end - - it "should fail if third call comes first" do - @mock.should_receive(:one).ordered - @mock.should_receive(:two).ordered - @mock.should_receive(:three).ordered - @mock.one - lambda do - @mock.three - end.should raise_error(MockExpectationError, "Mock 'test mock' received :three out of order") - end - - it "should fail if third call comes second" do - @mock.should_receive(:one).ordered - @mock.should_receive(:two).ordered - @mock.should_receive(:three).ordered - @mock.one - lambda do - @mock.three - end.should raise_error(MockExpectationError, "Mock 'test mock' received :three out of order") - end - - it "should ignore order of non ordered calls" do - @mock.should_receive(:ignored_0) - @mock.should_receive(:ordered_1).ordered - @mock.should_receive(:ignored_1) - @mock.should_receive(:ordered_2).ordered - @mock.should_receive(:ignored_2) - @mock.should_receive(:ignored_3) - @mock.should_receive(:ordered_3).ordered - @mock.should_receive(:ignored_4) - @mock.ignored_3 - @mock.ordered_1 - @mock.ignored_0 - @mock.ordered_2 - @mock.ignored_4 - @mock.ignored_2 - @mock.ordered_3 - @mock.ignored_1 - @mock.rspec_verify - end - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/mock_space_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/mock_space_spec.rb deleted file mode 100644 index 23ffd01bc..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/mock_space_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' -require 'spec/mocks' - -module Spec - module Mocks - describe Space do - before :each do - @space = Space.new - klazz = Class.new do - def rspec_verify - @verified = true - end - def verified? - @verified - end - def rspec_reset - @reset = true - end - def reset? - @reset - end - end - @m1 = klazz.new - @m2 = klazz.new - end - it "should verify all mocks within" do - @space.add(@m1) - @space.add(@m2) - @space.verify_all - @m1.should be_verified - @m2.should be_verified - end - it "should reset all mocks within" do - @space.add(m1 = mock("mock1")) - @space.add(m2 = mock("mock2")) - m1.should_receive(:rspec_reset) - m2.should_receive(:rspec_reset) - @space.reset_all - end - it "should clear internal mocks on reset_all" do - @space.add(m = mock("mock")) - @space.reset_all - @space.instance_eval { mocks.empty? }.should be_true - end - it "should only add an instance once" do - @space.add(m1 = mock("mock1")) - @space.add(m1) - m1.should_receive(:rspec_verify) - @space.verify_all - end - end - end -end - diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/mock_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/mock_spec.rb deleted file mode 100644 index 85a71e327..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/mock_spec.rb +++ /dev/null @@ -1,475 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Mocks - describe Mock do - - before(:each) do - @mock = mock("test mock") - end - - after(:each) do - @mock.rspec_reset - end - - it "should report line number of expectation of unreceived message" do - expected_error_line = __LINE__; @mock.should_receive(:wont_happen).with("x", 3) - begin - @mock.rspec_verify - violated - rescue MockExpectationError => e - # NOTE - this regexp ended w/ $, but jruby adds extra info at the end of the line - e.backtrace[0].should match(/#{File.basename(__FILE__)}:#{expected_error_line}/) - end - end - - it "should pass when not receiving message specified as not to be received" do - @mock.should_not_receive(:not_expected) - @mock.rspec_verify - end - - it "should pass when receiving message specified as not to be received with different args" do - @mock.should_not_receive(:message).with("unwanted text") - @mock.should_receive(:message).with("other text") - @mock.message "other text" - @mock.rspec_verify - end - - it "should fail when receiving message specified as not to be received" do - @mock.should_not_receive(:not_expected) - @mock.not_expected - lambda { - @mock.rspec_verify - violated - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (any args) 0 times, but received it once") - end - - it "should fail when receiving message specified as not to be received with args" do - @mock.should_not_receive(:not_expected).with("unexpected text") - @mock.not_expected("unexpected text") - lambda { - @mock.rspec_verify - violated - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (\"unexpected text\") 0 times, but received it once") - end - - it "should pass when receiving message specified as not to be received with wrong args" do - @mock.should_not_receive(:not_expected).with("unexpected text") - @mock.not_expected "really unexpected text" - @mock.rspec_verify - end - - it "should allow block to calculate return values" do - @mock.should_receive(:something).with("a","b","c").and_return { |a,b,c| c+b+a } - @mock.something("a","b","c").should == "cba" - @mock.rspec_verify - end - - it "should allow parameter as return value" do - @mock.should_receive(:something).with("a","b","c").and_return("booh") - @mock.something("a","b","c").should == "booh" - @mock.rspec_verify - end - - it "should return nil if no return value set" do - @mock.should_receive(:something).with("a","b","c") - @mock.something("a","b","c").should be_nil - @mock.rspec_verify - end - - it "should raise exception if args dont match when method called" do - @mock.should_receive(:something).with("a","b","c").and_return("booh") - lambda { - @mock.something("a","d","c") - violated - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")") - end - - it "should fail if unexpected method called" do - lambda { - @mock.something("a","b","c") - violated - }.should raise_error(MockExpectationError, "Mock 'test mock' received unexpected message :something with (\"a\", \"b\", \"c\")") - end - - it "should use block for expectation if provided" do - @mock.should_receive(:something) do | a, b | - a.should == "a" - b.should == "b" - "booh" - end - @mock.something("a", "b").should == "booh" - @mock.rspec_verify - end - - it "should fail if expectation block fails" do - @mock.should_receive(:something) {| bool | bool.should be_true} - lambda { - @mock.something false - }.should raise_error(MockExpectationError, /Mock 'test mock' received :something but passed block failed with: expected true, got false/) - end - - it "should fail right away when method defined as never is received" do - pending "Used to pass (false positive). Which one is wrong, the spec or the actual behavior?" - - @mock.should_receive(:not_expected).never - lambda { - @mock.not_expected - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected 0 times, but received it 1 times") - end - - it "should eventually fail when method defined as never is received" do - @mock.should_receive(:not_expected).never - @mock.not_expected - - lambda { - @mock.rspec_verify - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (any args) 0 times, but received it once") - end - - it "should raise when told to" do - @mock.should_receive(:something).and_raise(RuntimeError) - lambda do - @mock.something - end.should raise_error(RuntimeError) - end - - it "should raise passed an Exception instance" do - error = RuntimeError.new("error message") - @mock.should_receive(:something).and_raise(error) - lambda { - @mock.something - }.should raise_error(RuntimeError, "error message") - end - - it "should raise RuntimeError with passed message" do - @mock.should_receive(:something).and_raise("error message") - lambda { - @mock.something - }.should raise_error(RuntimeError, "error message") - end - - it "should not raise when told to if args dont match" do - @mock.should_receive(:something).with(2).and_raise(RuntimeError) - lambda { - @mock.something 1 - }.should raise_error(MockExpectationError) - end - - it "should throw when told to" do - @mock.should_receive(:something).and_throw(:blech) - lambda { - @mock.something - }.should throw_symbol(:blech) - end - - it "should raise when explicit return and block constrained" do - lambda { - @mock.should_receive(:fruit) do |colour| - :strawberry - end.and_return :apple - }.should raise_error(AmbiguousReturnError) - end - - it "should ignore args on any args" do - @mock.should_receive(:something).at_least(:once).with(any_args) - @mock.something - @mock.something 1 - @mock.something "a", 2 - @mock.something [], {}, "joe", 7 - @mock.rspec_verify - end - - it "should fail on no args if any args received" do - @mock.should_receive(:something).with(no_args()) - lambda { - @mock.something 1 - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (no args) but received it with (1)") - end - - it "should fail when args are expected but none are received" do - @mock.should_receive(:something).with(1) - lambda { - @mock.something - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (1) but received it with (no args)") - end - - it "should yield 0 args to blocks that take a variable number of arguments" do - @mock.should_receive(:yield_back).with(no_args()).once.and_yield - a = nil - @mock.yield_back {|*a|} - a.should == [] - @mock.rspec_verify - end - - it "should yield 0 args multiple times to blocks that take a variable number of arguments" do - @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield. - and_yield - a = nil - b = [] - @mock.yield_back {|*a| b << a} - b.should == [ [], [] ] - @mock.rspec_verify - end - - it "should yield one arg to blocks that take a variable number of arguments" do - @mock.should_receive(:yield_back).with(no_args()).once.and_yield(99) - a = nil - @mock.yield_back {|*a|} - a.should == [99] - @mock.rspec_verify - end - - it "should yield one arg 3 times consecutively to blocks that take a variable number of arguments" do - @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99). - and_yield(43). - and_yield("something fruity") - a = nil - b = [] - @mock.yield_back {|*a| b << a} - b.should == [[99], [43], ["something fruity"]] - @mock.rspec_verify - end - - it "should yield many args to blocks that take a variable number of arguments" do - @mock.should_receive(:yield_back).with(no_args()).once.and_yield(99, 27, "go") - a = nil - @mock.yield_back {|*a|} - a.should == [99, 27, "go"] - @mock.rspec_verify - end - - it "should yield many args 3 times consecutively to blocks that take a variable number of arguments" do - @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99, :green, "go"). - and_yield("wait", :amber). - and_yield("stop", 12, :red) - a = nil - b = [] - @mock.yield_back {|*a| b << a} - b.should == [[99, :green, "go"], ["wait", :amber], ["stop", 12, :red]] - @mock.rspec_verify - end - - it "should yield single value" do - @mock.should_receive(:yield_back).with(no_args()).once.and_yield(99) - a = nil - @mock.yield_back {|a|} - a.should == 99 - @mock.rspec_verify - end - - it "should yield single value 3 times consecutively" do - @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99). - and_yield(43). - and_yield("something fruity") - a = nil - b = [] - @mock.yield_back {|a| b << a} - b.should == [99, 43, "something fruity"] - @mock.rspec_verify - end - - it "should yield two values" do - @mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup') - a, b = nil - @mock.yield_back {|a,b|} - a.should == 'wha' - b.should == 'zup' - @mock.rspec_verify - end - - it "should yield two values 3 times consecutively" do - @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield('wha', 'zup'). - and_yield('not', 'down'). - and_yield(14, 65) - a, b = nil - c = [] - @mock.yield_back {|a,b| c << [a, b]} - c.should == [['wha', 'zup'], ['not', 'down'], [14, 65]] - @mock.rspec_verify - end - - it "should fail when calling yielding method with wrong arity" do - @mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup') - lambda { - @mock.yield_back {|a|} - }.should raise_error(MockExpectationError, "Mock 'test mock' yielded |\"wha\", \"zup\"| to block with arity of 1") - end - - it "should fail when calling yielding method consecutively with wrong arity" do - @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield('wha', 'zup'). - and_yield('down'). - and_yield(14, 65) - lambda { - a, b = nil - c = [] - @mock.yield_back {|a,b| c << [a, b]} - }.should raise_error(MockExpectationError, "Mock 'test mock' yielded |\"down\"| to block with arity of 2") - end - - it "should fail when calling yielding method without block" do - @mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup') - lambda { - @mock.yield_back - }.should raise_error(MockExpectationError, "Mock 'test mock' asked to yield |[\"wha\", \"zup\"]| but no block was passed") - end - - it "should be able to mock send" do - @mock.should_receive(:send).with(any_args) - @mock.send 'hi' - @mock.rspec_verify - end - - it "should be able to raise from method calling yielding mock" do - @mock.should_receive(:yield_me).and_yield 44 - - lambda { - @mock.yield_me do |x| - raise "Bang" - end - }.should raise_error(StandardError, "Bang") - - @mock.rspec_verify - end - - it "should clear expectations after verify" do - @mock.should_receive(:foobar) - @mock.foobar - @mock.rspec_verify - lambda { - @mock.foobar - }.should raise_error(MockExpectationError, "Mock 'test mock' received unexpected message :foobar with (no args)") - end - - it "should restore objects to their original state on rspec_reset" do - mock = mock("this is a mock") - mock.should_receive(:blah) - mock.rspec_reset - mock.rspec_verify #should throw if reset didn't work - end - - it "should work even after method_missing starts raising NameErrors instead of NoMethodErrors" do - # Object#method_missing throws either NameErrors or NoMethodErrors. - # - # On a fresh ruby program Object#method_missing: - # * raises a NoMethodError when called directly - # * raises a NameError when called indirectly - # - # Once Object#method_missing has been called at least once (on any object) - # it starts behaving differently: - # * raises a NameError when called directly - # * raises a NameError when called indirectly - # - # There was a bug in Mock#method_missing that relied on the fact - # that calling Object#method_missing directly raises a NoMethodError. - # This example tests that the bug doesn't exist anymore. - - - # Ensures that method_missing always raises NameErrors. - a_method_that_doesnt_exist rescue - - - @mock.should_receive(:foobar) - @mock.foobar - @mock.rspec_verify - - lambda { @mock.foobar }.should_not raise_error(NameError) - lambda { @mock.foobar }.should raise_error(MockExpectationError) - end - - it "should temporarily replace a method stub on a mock" do - @mock.stub!(:msg).and_return(:stub_value) - @mock.should_receive(:msg).with(:arg).and_return(:mock_value) - @mock.msg(:arg).should equal(:mock_value) - @mock.msg.should equal(:stub_value) - @mock.msg.should equal(:stub_value) - @mock.rspec_verify - end - - it "should temporarily replace a method stub on a non-mock" do - non_mock = Object.new - non_mock.stub!(:msg).and_return(:stub_value) - non_mock.should_receive(:msg).with(:arg).and_return(:mock_value) - non_mock.msg(:arg).should equal(:mock_value) - non_mock.msg.should equal(:stub_value) - non_mock.msg.should equal(:stub_value) - non_mock.rspec_verify - end - - it "should assign stub return values" do - mock = Mock.new('name', :message => :response) - mock.message.should == :response - end - end - - describe "a mock message receiving a block" do - before(:each) do - @mock = mock("mock") - @calls = 0 - end - - def add_call - @calls = @calls + 1 - end - - it "should call the block after #should_receive" do - @mock.should_receive(:foo) { add_call } - - @mock.foo - - @calls.should == 1 - end - - it "should call the block after #once" do - @mock.should_receive(:foo).once { add_call } - - @mock.foo - - @calls.should == 1 - end - - it "should call the block after #twice" do - @mock.should_receive(:foo).twice { add_call } - - @mock.foo - @mock.foo - - @calls.should == 2 - end - - it "should call the block after #times" do - @mock.should_receive(:foo).exactly(10).times { add_call } - - (1..10).each { @mock.foo } - - @calls.should == 10 - end - - it "should call the block after #any_number_of_times" do - @mock.should_receive(:foo).any_number_of_times { add_call } - - (1..7).each { @mock.foo } - - @calls.should == 7 - end - - it "should call the block after #with" do - @mock.should_receive(:foo).with(:arg) { add_call } - - @mock.foo(:arg) - - @calls.should == 1 - end - - it "should call the block after #ordered" do - @mock.should_receive(:foo).ordered { add_call } - @mock.should_receive(:bar).ordered { add_call } - - @mock.foo - @mock.bar - - @calls.should == 2 - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/multiple_return_value_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/multiple_return_value_spec.rb deleted file mode 100644 index 3e26b73f4..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/multiple_return_value_spec.rb +++ /dev/null @@ -1,113 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Mocks - describe "a Mock expectation with multiple return values and no specified count" do - before(:each) do - @mock = Mock.new("mock") - @return_values = ["1",2,Object.new] - @mock.should_receive(:message).and_return(@return_values[0],@return_values[1],@return_values[2]) - end - - it "should return values in order to consecutive calls" do - @mock.message.should == @return_values[0] - @mock.message.should == @return_values[1] - @mock.message.should == @return_values[2] - @mock.rspec_verify - end - - it "should complain when there are too few calls" do - third = Object.new - @mock.message.should == @return_values[0] - @mock.message.should == @return_values[1] - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it twice") - end - - it "should complain when there are too many calls" do - third = Object.new - @mock.message.should == @return_values[0] - @mock.message.should == @return_values[1] - @mock.message.should == @return_values[2] - @mock.message.should == @return_values[2] - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times") - end - end - - describe "a Mock expectation with multiple return values with a specified count equal to the number of values" do - before(:each) do - @mock = Mock.new("mock") - @return_values = ["1",2,Object.new] - @mock.should_receive(:message).exactly(3).times.and_return(@return_values[0],@return_values[1],@return_values[2]) - end - - it "should return values in order to consecutive calls" do - @mock.message.should == @return_values[0] - @mock.message.should == @return_values[1] - @mock.message.should == @return_values[2] - @mock.rspec_verify - end - - it "should complain when there are too few calls" do - third = Object.new - @mock.message.should == @return_values[0] - @mock.message.should == @return_values[1] - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it twice") - end - - it "should complain when there are too many calls" do - third = Object.new - @mock.message.should == @return_values[0] - @mock.message.should == @return_values[1] - @mock.message.should == @return_values[2] - @mock.message.should == @return_values[2] - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times") - end - end - - describe "a Mock expectation with multiple return values specifying at_least less than the number of values" do - before(:each) do - @mock = Mock.new("mock") - @mock.should_receive(:message).at_least(:twice).with(no_args).and_return(11, 22) - end - - it "should use last return value for subsequent calls" do - @mock.message.should equal(11) - @mock.message.should equal(22) - @mock.message.should equal(22) - @mock.rspec_verify - end - - it "should fail when called less than the specified number" do - @mock.message.should equal(11) - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (no args) twice, but received it once") - end - end - describe "a Mock expectation with multiple return values with a specified count larger than the number of values" do - before(:each) do - @mock = Mock.new("mock") - @mock.should_receive(:message).exactly(3).times.and_return(11, 22) - end - - it "should use last return value for subsequent calls" do - @mock.message.should equal(11) - @mock.message.should equal(22) - @mock.message.should equal(22) - @mock.rspec_verify - end - - it "should fail when called less than the specified number" do - @mock.message.should equal(11) - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it once") - end - - it "should fail when called greater than the specified number" do - @mock.message.should equal(11) - @mock.message.should equal(22) - @mock.message.should equal(22) - @mock.message.should equal(22) - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times") - end - end - end -end - diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/null_object_mock_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/null_object_mock_spec.rb deleted file mode 100644 index 57e8ca31c..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/null_object_mock_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "a mock acting as a NullObject" do - before(:each) do - @mock = Mock.new("null_object", :null_object => true) - end - - it "should allow explicit expectation" do - @mock.should_receive(:something) - @mock.something - end - - it "should fail verification when explicit exception not met" do - lambda do - @mock.should_receive(:something) - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should ignore unexpected methods" do - @mock.random_call("a", "d", "c") - @mock.rspec_verify - end - - it "should expected message with different args first" do - @mock.should_receive(:message).with(:expected_arg) - @mock.message(:unexpected_arg) - @mock.message(:expected_arg) - end - - it "should expected message with different args second" do - @mock.should_receive(:message).with(:expected_arg) - @mock.message(:expected_arg) - @mock.message(:unexpected_arg) - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/once_counts_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/once_counts_spec.rb deleted file mode 100644 index 2c15d5c2e..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/once_counts_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "OnceCounts" do - before(:each) do - @mock = mock("test mock") - end - - it "once should fail when called once with wrong args" do - @mock.should_receive(:random_call).once.with("a", "b", "c") - lambda do - @mock.random_call("d", "e", "f") - end.should raise_error(MockExpectationError) - @mock.rspec_reset - end - - it "once should fail when called twice" do - @mock.should_receive(:random_call).once - @mock.random_call - @mock.random_call - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "once should fail when not called" do - @mock.should_receive(:random_call).once - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "once should pass when called once" do - @mock.should_receive(:random_call).once - @mock.random_call - @mock.rspec_verify - end - - it "once should pass when called once with specified args" do - @mock.should_receive(:random_call).once.with("a", "b", "c") - @mock.random_call("a", "b", "c") - @mock.rspec_verify - end - - it "once should pass when called once with unspecified args" do - @mock.should_receive(:random_call).once - @mock.random_call("a", "b", "c") - @mock.rspec_verify - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/options_hash_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/options_hash_spec.rb deleted file mode 100644 index 0bfab26d7..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/options_hash_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "calling :should_receive with an options hash" do - it_should_behave_like "sandboxed rspec_options" - attr_reader :reporter, :example_group - before do - @reporter = ::Spec::Runner::Reporter.new(options) - @example_group = Class.new(::Spec::Example::ExampleGroup) do - plugin_mock_framework - describe("Some Examples") - end - reporter.add_example_group example_group - end - - it "should report the file and line submitted with :expected_from" do - example_definition = example_group.it "spec" do - mock = Spec::Mocks::Mock.new("a mock") - mock.should_receive(:message, :expected_from => "/path/to/blah.ext:37") - mock.rspec_verify - end - example = example_group.new(example_definition) - - reporter.should_receive(:example_finished) do |spec, error| - error.backtrace.detect {|line| line =~ /\/path\/to\/blah.ext:37/}.should_not be_nil - end - example.execute(options, {}) - end - - it "should use the message supplied with :message" do - example_definition = @example_group.it "spec" do - mock = Spec::Mocks::Mock.new("a mock") - mock.should_receive(:message, :message => "recebi nada") - mock.rspec_verify - end - example = @example_group.new(example_definition) - @reporter.should_receive(:example_finished) do |spec, error| - error.message.should == "recebi nada" - end - example.execute(@options, {}) - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/partial_mock_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/partial_mock_spec.rb deleted file mode 100644 index d7e5944c4..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/partial_mock_spec.rb +++ /dev/null @@ -1,106 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "using a Partial Mock," do - before(:each) do - @object = Object.new - end - - it "should name the class in the failure message" do - @object.should_receive(:foo) - lambda do - @object.rspec_verify - end.should raise_error(Spec::Mocks::MockExpectationError, /Object/) - end - - it "should not conflict with @options in the object" do - @object.instance_eval { @options = Object.new } - @object.should_receive(:blah) - @object.blah - end - - it "should_not_receive should mock out the method" do - @object.should_not_receive(:fuhbar) - @object.fuhbar - lambda do - @object.rspec_verify - end.should raise_error(Spec::Mocks::MockExpectationError) - end - - it "should_not_receive should return a negative message expectation" do - @object.should_not_receive(:foobar).should be_kind_of(NegativeMessageExpectation) - end - - it "should_receive should mock out the method" do - @object.should_receive(:foobar).with(:test_param).and_return(1) - @object.foobar(:test_param).should equal(1) - end - - it "should_receive should handle a hash" do - @object.should_receive(:foobar).with(:key => "value").and_return(1) - @object.foobar(:key => "value").should equal(1) - end - - it "should_receive should handle an inner hash" do - hash = {:a => {:key => "value"}} - @object.should_receive(:foobar).with(:key => "value").and_return(1) - @object.foobar(hash[:a]).should equal(1) - end - - it "should_receive should return a message expectation" do - @object.should_receive(:foobar).should be_kind_of(MessageExpectation) - @object.foobar - end - - it "should_receive should verify method was called" do - @object.should_receive(:foobar).with(:test_param).and_return(1) - lambda do - @object.rspec_verify - end.should raise_error(Spec::Mocks::MockExpectationError) - end - - it "should_receive should also take a String argument" do - @object.should_receive('foobar') - @object.foobar - end - - it "should_not_receive should also take a String argument" do - @object.should_not_receive('foobar') - @object.foobar - lambda do - @object.rspec_verify - end.should raise_error(Spec::Mocks::MockExpectationError) - end - - it "should use report nil in the error message" do - @this_will_resolve_to_nil.should_receive(:foobar) - lambda do - @this_will_resolve_to_nil.rspec_verify - end.should raise_error(Spec::Mocks::MockExpectationError, /NilClass.*expected :foobar with/) - end - end - - describe "Partially mocking an object that defines ==, after another mock has been defined" do - before(:each) do - stub("existing mock", :foo => :foo) - end - - class PartiallyMockedEquals - attr_reader :val - def initialize(val) - @val = val - end - - def ==(other) - @val == other.val - end - end - - it "should not raise an error when stubbing the object" do - o = PartiallyMockedEquals.new :foo - lambda { o.stub!(:bar) }.should_not raise_error(NoMethodError) - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb deleted file mode 100644 index c857d8380..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +++ /dev/null @@ -1,66 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec -module Mocks -describe "PartialMockUsingMocksDirectly" do - before(:each) do - - klass=Class.new - klass.class_eval do - def existing_method - :original_value - end - end - @obj = klass.new - - end - - # See http://rubyforge.org/tracker/index.php?func=detail&aid=10263&group_id=797&atid=3149 - # specify "should clear expectations on verify" do - # @obj.should_receive(:msg) - # @obj.msg - # @obj.rspec_verify - # lambda do - # @obj.msg - # end.should raise_error(NoMethodError) - # - # end - it "should fail when expected message is not received" do - @obj.should_receive(:msg) - lambda do - @obj.rspec_verify - end.should raise_error(MockExpectationError) - - end - it "should fail when message is received with incorrect args" do - @obj.should_receive(:msg).with(:correct_arg) - lambda do - @obj.msg(:incorrect_arg) - end.should raise_error(MockExpectationError) - @obj.msg(:correct_arg) - - end - it "should pass when expected message is received" do - @obj.should_receive(:msg) - @obj.msg - @obj.rspec_verify - - end - it "should pass when message is received with correct args" do - @obj.should_receive(:msg).with(:correct_arg) - @obj.msg(:correct_arg) - @obj.rspec_verify - - end - it "should revert to original method if existed" do - @obj.existing_method.should equal(:original_value) - @obj.should_receive(:existing_method).and_return(:mock_value) - @obj.existing_method.should equal(:mock_value) - @obj.rspec_verify - @obj.existing_method.should equal(:original_value) - - end - -end -end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/passing_mock_argument_constraints_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/passing_mock_argument_constraints_spec.rb deleted file mode 100644 index 6de0a58f4..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +++ /dev/null @@ -1,154 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "mock argument constraints", :shared => true do - before(:each) do - @mock = Mock.new("test mock") - Kernel.stub!(:warn) - end - - after(:each) do - @mock.rspec_verify - end - end - - describe Methods, "handling argument constraints with DEPRECATED symbols" do - it_should_behave_like "mock argument constraints" - - it "should accept true as boolean" do - @mock.should_receive(:random_call).with(:boolean) - @mock.random_call(true) - end - - it "should accept false as boolean" do - @mock.should_receive(:random_call).with(:boolean) - @mock.random_call(false) - end - - it "should accept fixnum as numeric" do - @mock.should_receive(:random_call).with(:numeric) - @mock.random_call(1) - end - - it "should accept float as numeric" do - @mock.should_receive(:random_call).with(:numeric) - @mock.random_call(1.5) - end - - it "should accept string as anything" do - @mock.should_receive(:random_call).with("a", :anything, "c") - @mock.random_call("a", "whatever", "c") - end - - it "should match string" do - @mock.should_receive(:random_call).with(:string) - @mock.random_call("a string") - end - - it "should match no args against any_args" do - @mock.should_receive(:random_call).with(:any_args) - @mock.random_call("a string") - end - - it "should match no args against no_args" do - @mock.should_receive(:random_call).with(:no_args) - @mock.random_call - end - end - - describe Methods, "handling argument constraints" do - it_should_behave_like "mock argument constraints" - - it "should accept true as boolean()" do - @mock.should_receive(:random_call).with(boolean()) - @mock.random_call(true) - end - - it "should accept false as boolean()" do - @mock.should_receive(:random_call).with(boolean()) - @mock.random_call(false) - end - - it "should accept fixnum as an_instance_of(Numeric)" do - @mock.should_receive(:random_call).with(an_instance_of(Numeric)) - @mock.random_call(1) - end - - it "should accept float as an_instance_of(Numeric)" do - @mock.should_receive(:random_call).with(an_instance_of(Numeric)) - @mock.random_call(1.5) - end - - it "should accept string as anything()" do - @mock.should_receive(:random_call).with("a", anything(), "c") - @mock.random_call("a", "whatever", "c") - end - - it "should match duck type with one method" do - @mock.should_receive(:random_call).with(duck_type(:length)) - @mock.random_call([]) - end - - it "should match duck type with two methods" do - @mock.should_receive(:random_call).with(duck_type(:abs, :div)) - @mock.random_call(1) - end - - it "should match no args against any_args()" do - @mock.should_receive(:random_call).with(any_args) - @mock.random_call() - end - - it "should match one arg against any_args()" do - @mock.should_receive(:random_call).with(any_args) - @mock.random_call("a string") - end - - it "should match no args against no_args()" do - @mock.should_receive(:random_call).with(no_args) - @mock.random_call() - end - end - - describe Methods, "handling non-constraint arguments" do - - it "should match non special symbol (can be removed when deprecated symbols are removed)" do - @mock.should_receive(:random_call).with(:some_symbol) - @mock.random_call(:some_symbol) - end - - it "should match string against regexp" do - @mock.should_receive(:random_call).with(/bcd/) - @mock.random_call("abcde") - end - - it "should match regexp against regexp" do - @mock.should_receive(:random_call).with(/bcd/) - @mock.random_call(/bcd/) - end - - it "should match against a hash submitted and received by value" do - @mock.should_receive(:random_call).with(:a => "a", :b => "b") - @mock.random_call(:a => "a", :b => "b") - end - - it "should match against a hash submitted by reference and received by value" do - opts = {:a => "a", :b => "b"} - @mock.should_receive(:random_call).with(opts) - @mock.random_call(:a => "a", :b => "b") - end - - it "should match against a hash submitted by value and received by reference" do - opts = {:a => "a", :b => "b"} - @mock.should_receive(:random_call).with(:a => "a", :b => "b") - @mock.random_call(opts) - end - - it "should match against a Matcher" do - @mock.should_receive(:msg).with(equal(37)) - @mock.msg(37) - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/precise_counts_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/precise_counts_spec.rb deleted file mode 100644 index ba3898943..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/precise_counts_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "PreciseCounts" do - before(:each) do - @mock = mock("test mock") - end - - it "should fail when exactly n times method is called less than n times" do - @mock.should_receive(:random_call).exactly(3).times - @mock.random_call - @mock.random_call - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should fail when exactly n times method is never called" do - @mock.should_receive(:random_call).exactly(3).times - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "should pass if exactly n times method is called exactly n times" do - @mock.should_receive(:random_call).exactly(3).times - @mock.random_call - @mock.random_call - @mock.random_call - @mock.rspec_verify - end - - it "should pass multiple calls with different args and counts" do - @mock.should_receive(:random_call).twice.with(1) - @mock.should_receive(:random_call).once.with(2) - @mock.random_call(1) - @mock.random_call(2) - @mock.random_call(1) - @mock.rspec_verify - end - - it "should pass mutiple calls with different args" do - @mock.should_receive(:random_call).once.with(1) - @mock.should_receive(:random_call).once.with(2) - @mock.random_call(1) - @mock.random_call(2) - @mock.rspec_verify - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/record_messages_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/record_messages_spec.rb deleted file mode 100644 index ec247726d..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/record_messages_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Mocks - describe "a mock" do - before(:each) do - @mock = mock("mock", :null_object => true) - end - it "should answer false for received_message? when no messages received" do - @mock.received_message?(:message).should be_false - end - it "should answer true for received_message? when message received" do - @mock.message - @mock.received_message?(:message).should be_true - end - it "should answer true for received_message? when message received with correct args" do - @mock.message 1,2,3 - @mock.received_message?(:message, 1,2,3).should be_true - end - it "should answer false for received_message? when message received with incorrect args" do - @mock.message 1,2,3 - @mock.received_message?(:message, 1,2).should be_false - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/stub_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/stub_spec.rb deleted file mode 100644 index d6e23d71e..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/stub_spec.rb +++ /dev/null @@ -1,181 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "A method stub" do - before(:each) do - @class = Class.new do - def self.existing_class_method - :original_value - end - - def existing_instance_method - :original_value - end - end - @instance = @class.new - end - - it "should return expected value when expected message is received" do - @instance.stub!(:msg).and_return(:return_value) - @instance.msg.should equal(:return_value) - @instance.rspec_verify - end - - it "should ignore when expected message is received" do - @instance.stub!(:msg) - @instance.msg - lambda do - @instance.rspec_verify - end.should_not raise_error - end - - it "should ignore when message is received with args" do - @instance.stub!(:msg) - @instance.msg(:an_arg) - lambda do - @instance.rspec_verify - end.should_not raise_error - end - - it "should ignore when expected message is not received" do - @instance.stub!(:msg) - lambda do - @instance.rspec_verify - end.should_not raise_error - end - - it "should clear itself when verified" do - @instance.stub!(:this_should_go).and_return(:blah) - @instance.this_should_go.should == :blah - @instance.rspec_verify - lambda do - @instance.this_should_go - end.should raise_error(NameError) - end - - it "should return values in order to consecutive calls" do - return_values = ["1",2,Object.new] - @instance.stub!(:msg).and_return(return_values[0],return_values[1],return_values[2]) - @instance.msg.should == return_values[0] - @instance.msg.should == return_values[1] - @instance.msg.should == return_values[2] - end - - it "should keep returning last value in consecutive calls" do - return_values = ["1",2,Object.new] - @instance.stub!(:msg).and_return(return_values[0],return_values[1],return_values[2]) - @instance.msg.should == return_values[0] - @instance.msg.should == return_values[1] - @instance.msg.should == return_values[2] - @instance.msg.should == return_values[2] - @instance.msg.should == return_values[2] - end - - it "should revert to original instance method if there is one" do - @instance.existing_instance_method.should equal(:original_value) - @instance.stub!(:existing_instance_method).and_return(:mock_value) - @instance.existing_instance_method.should equal(:mock_value) - @instance.rspec_verify - @instance.existing_instance_method.should equal(:original_value) - end - - it "should revert to original class method if there is one" do - @class.existing_class_method.should equal(:original_value) - @class.stub!(:existing_class_method).and_return(:mock_value) - @class.existing_class_method.should equal(:mock_value) - @class.rspec_verify - @class.existing_class_method.should equal(:original_value) - end - - it "should yield a specified object" do - @instance.stub!(:method_that_yields).and_yield(:yielded_obj) - current_value = :value_before - @instance.method_that_yields {|val| current_value = val} - current_value.should == :yielded_obj - @instance.rspec_verify - end - - it "should yield multiple times with multiple calls to and_yield" do - @instance.stub!(:method_that_yields_multiple_times).and_yield(:yielded_value). - and_yield(:another_value) - current_value = [] - @instance.method_that_yields_multiple_times {|val| current_value << val} - current_value.should == [:yielded_value, :another_value] - @instance.rspec_verify - end - - it "should yield a specified object and return another specified object" do - yielded_obj = mock("my mock") - yielded_obj.should_receive(:foo).with(:bar) - @instance.stub!(:method_that_yields_and_returns).and_yield(yielded_obj).and_return(:baz) - @instance.method_that_yields_and_returns { |o| o.foo :bar }.should == :baz - end - - it "should throw when told to" do - @mock.stub!(:something).and_throw(:up) - lambda do - @mock.something - end.should throw_symbol(:up) - end - - it "should override a pre-existing stub" do - @stub.stub!(:existing_instance_method).and_return(:updated_stub_value) - @stub.existing_instance_method.should == :updated_stub_value - end - - it "should limit " do - @stub.stub!(:foo).with("bar") - @stub.should_receive(:foo).with("baz") - @stub.foo("bar") - @stub.foo("baz") - end - end - - describe "A method stub with args" do - before(:each) do - @stub = Object.new - @stub.stub!(:foo).with("bar") - end - - it "should not complain if not called" do - end - - it "should not complain if called with arg" do - @stub.foo("bar") - end - - it "should complain if called with no arg" do - lambda do - @stub.foo - end.should raise_error - end - - it "should complain if called with other arg" do - lambda do - @stub.foo("other") - end.should raise_error - end - - it "should not complain if also mocked w/ different args" do - @stub.should_receive(:foo).with("baz") - @stub.foo("bar") - @stub.foo("baz") - end - - it "should complain if also mocked w/ different args AND called w/ a 3rd set of args" do - @stub.should_receive(:foo).with("baz") - @stub.foo("bar") - @stub.foo("baz") - lambda do - @stub.foo("other") - end.should raise_error - end - - it "should support options" do - @stub.stub!(:foo, :expected_from => "bar") - end - end - - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/mocks/twice_counts_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/mocks/twice_counts_spec.rb deleted file mode 100644 index d07e45736..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/mocks/twice_counts_spec.rb +++ /dev/null @@ -1,67 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "TwiceCounts" do - before(:each) do - @mock = mock("test mock") - end - - it "twice should fail when call count is higher than expected" do - @mock.should_receive(:random_call).twice - @mock.random_call - @mock.random_call - @mock.random_call - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "twice should fail when call count is lower than expected" do - @mock.should_receive(:random_call).twice - @mock.random_call - lambda do - @mock.rspec_verify - end.should raise_error(MockExpectationError) - end - - it "twice should fail when called twice with wrong args on the first call" do - @mock.should_receive(:random_call).twice.with("1", 1) - lambda do - @mock.random_call(1, "1") - end.should raise_error(MockExpectationError) - @mock.rspec_reset - end - - it "twice should fail when called twice with wrong args on the second call" do - @mock.should_receive(:random_call).twice.with("1", 1) - @mock.random_call("1", 1) - lambda do - @mock.random_call(1, "1") - end.should raise_error(MockExpectationError) - @mock.rspec_reset - end - - it "twice should pass when called twice" do - @mock.should_receive(:random_call).twice - @mock.random_call - @mock.random_call - @mock.rspec_verify - end - - it "twice should pass when called twice with specified args" do - @mock.should_receive(:random_call).twice.with("1", 1) - @mock.random_call("1", 1) - @mock.random_call("1", 1) - @mock.rspec_verify - end - - it "twice should pass when called twice with unspecified args" do - @mock.should_receive(:random_call).twice - @mock.random_call("1") - @mock.random_call(1) - @mock.rspec_verify - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/package/bin_spec_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/package/bin_spec_spec.rb deleted file mode 100644 index 44bfd96a0..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/package/bin_spec_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' -require File.dirname(__FILE__) + '/../../ruby_forker' - -describe "The bin/spec script" do - include RubyForker - - it "should have no warnings" do - pending "Hangs on JRuby" if PLATFORM =~ /java/ - spec_path = "#{File.dirname(__FILE__)}/../../../bin/spec" - - output = ruby "-w #{spec_path} --help 2>&1" - output.should_not =~ /warning/n - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/class_and_argument_parser_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/class_and_argument_parser_spec.rb deleted file mode 100644 index b4e9e7f53..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/class_and_argument_parser_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Runner - describe ClassAndArgumentsParser, ".parse" do - - it "should use a single : to separate class names from arguments" do - ClassAndArgumentsParser.parse('Foo').should == ['Foo', nil] - ClassAndArgumentsParser.parse('Foo:arg').should == ['Foo', 'arg'] - ClassAndArgumentsParser.parse('Foo::Bar::Zap:arg').should == ['Foo::Bar::Zap', 'arg'] - ClassAndArgumentsParser.parse('Foo:arg1,arg2').should == ['Foo', 'arg1,arg2'] - ClassAndArgumentsParser.parse('Foo::Bar::Zap:arg1,arg2').should == ['Foo::Bar::Zap', 'arg1,arg2'] - ClassAndArgumentsParser.parse('Foo::Bar::Zap:drb://foo,drb://bar').should == ['Foo::Bar::Zap', 'drb://foo,drb://bar'] - end - - it "should raise an error when passed an empty string" do - lambda do - ClassAndArgumentsParser.parse('') - end.should raise_error("Couldn't parse \"\"") - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/command_line_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/command_line_spec.rb deleted file mode 100644 index 8b9e912a7..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/command_line_spec.rb +++ /dev/null @@ -1,146 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Runner - describe CommandLine, ".run" do - it_should_behave_like "sandboxed rspec_options" - attr_reader :options, :err, :out - before do - @err = options.error_stream - @out = options.output_stream - end - - it "should run directory" do - file = File.dirname(__FILE__) + '/../../../examples/pure' - Spec::Runner::CommandLine.run(OptionParser.parse([file], @err, @out)) - - @out.rewind - @out.read.should =~ /\d+ examples, 0 failures, 3 pending/n - end - - it "should run file" do - file = File.dirname(__FILE__) + '/../../../failing_examples/predicate_example.rb' - Spec::Runner::CommandLine.run(OptionParser.parse([file], @err, @out)) - - @out.rewind - @out.read.should =~ /2 examples, 1 failure/n - end - - it "should raise when file does not exist" do - file = File.dirname(__FILE__) + '/doesntexist' - - lambda { - Spec::Runner::CommandLine.run(OptionParser.parse([file], @err, @out)) - }.should raise_error - end - - it "should return true when in --generate-options mode" do - Spec::Runner::CommandLine.run( - OptionParser.parse(['--generate-options', '/dev/null'], @err, @out) - ).should be_true - end - - it "should dump even if Interrupt exception is occurred" do - example_group = Class.new(::Spec::Example::ExampleGroup) do - describe("example_group") - it "no error" do - end - - it "should interrupt" do - raise Interrupt, "I'm interrupting" - end - end - - options = ::Spec::Runner::Options.new(@err, @out) - ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) - options.reporter.should_receive(:dump) - options.add_example_group(example_group) - - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - end - - it "should heckle when options have heckle_runner" do - example_group = Class.new(::Spec::Example::ExampleGroup).describe("example_group") do - it "no error" do - end - end - options = ::Spec::Runner::Options.new(@err, @out) - ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) - options.add_example_group example_group - - heckle_runner = mock("heckle_runner") - heckle_runner.should_receive(:heckle_with) - $rspec_mocks.__send__(:mocks).delete(heckle_runner) - - options.heckle_runner = heckle_runner - options.add_example_group(example_group) - - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - heckle_runner.rspec_verify - end - - it "should run examples backwards if options.reverse is true" do - options = ::Spec::Runner::Options.new(@err, @out) - ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) - options.reverse = true - - b1 = Class.new(Spec::Example::ExampleGroup) - b2 = Class.new(Spec::Example::ExampleGroup) - - b2.should_receive(:run).ordered - b1.should_receive(:run).ordered - - options.add_example_group(b1) - options.add_example_group(b2) - - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - end - - it "should pass its ExampleGroup to the reporter" do - example_group = Class.new(::Spec::Example::ExampleGroup).describe("example_group") do - it "should" do - end - end - options = ::Spec::Runner::Options.new(@err, @out) - options.add_example_group(example_group) - - ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) - options.reporter.should_receive(:add_example_group).with(example_group) - - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - end - - it "runs only selected Examples when options.examples is set" do - options = ::Spec::Runner::Options.new(@err, @out) - ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) - - options.examples << "example_group should" - should_has_run = false - should_not_has_run = false - example_group = Class.new(::Spec::Example::ExampleGroup).describe("example_group") do - it "should" do - should_has_run = true - end - it "should not" do - should_not_has_run = true - end - end - - options.reporter.should_receive(:add_example_group).with(example_group) - - options.add_example_group example_group - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - - should_has_run.should be_true - should_not_has_run.should be_false - end - - it "sets Spec.run to true" do - ::Spec.run = false - ::Spec.should_not be_run - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - ::Spec.should be_run - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/drb_command_line_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/drb_command_line_spec.rb deleted file mode 100644 index 760ec37a9..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/drb_command_line_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Runner - describe DrbCommandLine, "without running local server" do - unless Config::CONFIG['ruby_install_name'] == 'jruby' - it "should print error when there is no running local server" do - err = StringIO.new - out = StringIO.new - DrbCommandLine.run(OptionParser.parse(['--version'], err, out)) - - err.rewind - err.read.should =~ /No server is running/ - end - end - end - - class DrbCommandLineSpec < ::Spec::Example::ExampleGroup - describe DrbCommandLine, "with local server" - - class CommandLineForSpec - def self.run(argv, stderr, stdout) - exit Spec::Runner::CommandLine.run(OptionParser.parse(argv, stderr, stdout)) - end - end - - unless Config::CONFIG['ruby_install_name'] == 'jruby' - before(:all) do - DRb.start_service("druby://localhost:8989", CommandLineForSpec) - @@drb_example_file_counter = 0 - end - - before(:each) do - create_dummy_spec_file - @@drb_example_file_counter = @@drb_example_file_counter + 1 - end - - after(:each) do - File.delete(@dummy_spec_filename) - end - - after(:all) do - DRb.stop_service - end - - it "should run against local server" do - out = run_spec_via_druby(['--version']) - out.should =~ /RSpec/n - end - - it "should output green colorized text when running with --colour option" do - out = run_spec_via_druby(["--colour", @dummy_spec_filename]) - out.should =~ /\e\[32m/n - end - - it "should output red colorized text when running with -c option" do - out = run_spec_via_druby(["-c", @dummy_spec_filename]) - out.should =~ /\e\[31m/n - end - - def create_dummy_spec_file - @dummy_spec_filename = File.expand_path(File.dirname(__FILE__)) + "/_dummy_spec#{@@drb_example_file_counter}.rb" - File.open(@dummy_spec_filename, 'w') do |f| - f.write %{ - describe "DUMMY CONTEXT for 'DrbCommandLine with -c option'" do - it "should be output with green bar" do - true.should be_true - end - - it "should be output with red bar" do - violated("I want to see a red bar!") - end - end - } - end - end - - def run_spec_via_druby(argv) - err, out = StringIO.new, StringIO.new - out.instance_eval do - def tty?; true end - end - options = ::Spec::Runner::Options.new(err, out) - options.argv = argv - Spec::Runner::DrbCommandLine.run(options) - out.rewind; out.read - end - end - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/execution_context_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/execution_context_spec.rb deleted file mode 100644 index 82e7447c1..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/execution_context_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "ExecutionContext" do - - it "should provide duck_type()" do - dt = duck_type(:length) - dt.should be_an_instance_of(Spec::Mocks::DuckTypeArgConstraint) - dt.matches?([]).should be_true - end - - it "should violate when violated()" do - lambda do - violated - end.should raise_error(Spec::Expectations::ExpectationNotMetError) - end - - it "should provide mock()" do - mock("thing").should be_an_instance_of(Spec::Mocks::Mock) - end - - it "should provide stub()" do - thing_stub = stub("thing").should be_an_instance_of(Spec::Mocks::Mock) - end - - it "should add method stubs to stub()" do - thing_stub = stub("thing", :a => "A", :b => "B") - thing_stub.a.should == "A" - thing_stub.b.should == "B" - end - -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb deleted file mode 100644 index a08b6e86d..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper' -require 'spec/runner/formatter/failing_example_groups_formatter' - -module Spec - module Runner - module Formatter - describe FailingExampleGroupsFormatter do - attr_reader :example_group, :formatter, :io - - before(:each) do - @io = StringIO.new - options = mock('options') - @formatter = FailingExampleGroupsFormatter.new(options, io) - @example_group = Class.new(::Spec::Example::ExampleGroup) - end - - it "should add example name for each failure" do - formatter.add_example_group(Class.new(ExampleGroup).describe("b 1")) - formatter.example_failed("e 1", nil, Reporter::Failure.new(nil, RuntimeError.new)) - formatter.add_example_group(Class.new(ExampleGroup).describe("b 2")) - formatter.example_failed("e 2", nil, Reporter::Failure.new(nil, RuntimeError.new)) - formatter.example_failed("e 3", nil, Reporter::Failure.new(nil, RuntimeError.new)) - io.string.should == "b 1\nb 2\n" - end - - it "should delimit ExampleGroup superclass descriptions with :" do - parent_example_group = Class.new(example_group).describe("Parent") - child_example_group = Class.new(parent_example_group).describe("#child_method") - grand_child_example_group = Class.new(child_example_group).describe("GrandChild") - - formatter.add_example_group(grand_child_example_group) - formatter.example_failed("failure", nil, Reporter::Failure.new(nil, RuntimeError.new)) - io.string.should == "Parent#child_method GrandChild\n" - end - - it "should remove druby url, which is used by Spec::Distributed" do - @formatter.add_example_group(Class.new(ExampleGroup).describe("something something (druby://99.99.99.99:99)")) - @formatter.example_failed("e 1", nil, Reporter::Failure.new(nil, RuntimeError.new)) - io.string.should == "something something\n" - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/failing_examples_formatter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/failing_examples_formatter_spec.rb deleted file mode 100644 index fda64f95f..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper' -require 'spec/runner/formatter/failing_examples_formatter' - -module Spec - module Runner - module Formatter - describe FailingExamplesFormatter do - before(:each) do - @io = StringIO.new - options = mock('options') - @formatter = FailingExamplesFormatter.new(options, @io) - end - - it "should add example name for each failure" do - example_group_1 = Class.new(ExampleGroup).describe("A") - example_group_2 = Class.new(example_group_1).describe("B") - - @formatter.add_example_group(example_group_1) - @formatter.example_failed(example_group_1.it("a1"){}, nil, Reporter::Failure.new(nil, RuntimeError.new)) - @formatter.add_example_group(example_group_2) - @formatter.example_failed(example_group_2.it("b2"){}, nil, Reporter::Failure.new(nil, RuntimeError.new)) - @formatter.example_failed(example_group_2.it("b3"){}, nil, Reporter::Failure.new(nil, RuntimeError.new)) - @io.string.should eql(<<-EOF -A a1 -A B b2 -A B b3 -EOF -) - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/html_formatter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/html_formatter_spec.rb deleted file mode 100644 index 5ba39f0e9..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/html_formatter_spec.rb +++ /dev/null @@ -1,66 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper' -require 'hpricot' # Needed to compare generated with wanted HTML -require 'spec/runner/formatter/html_formatter' - -module Spec - module Runner - module Formatter - describe HtmlFormatter do - ['--diff', '--dry-run'].each do |opt| - def jruby? - PLATFORM == 'java' - end - - it "should produce HTML identical to the one we designed manually with #{opt}" do - root = File.expand_path(File.dirname(__FILE__) + '/../../../..') - suffix = jruby? ? '-jruby' : '' - expected_file = File.dirname(__FILE__) + "/html_formatted-#{::VERSION}#{suffix}.html" - raise "There is no HTML file with expected content for this platform: #{expected_file}" unless File.file?(expected_file) - expected_html = File.read(expected_file) - unless jruby? - raise "There should be no absolute paths in html_formatted.html!!" if (expected_html =~ /\/Users/n || expected_html =~ /\/home/n) - end - - Dir.chdir(root) do - args = ['failing_examples/mocking_example.rb', 'failing_examples/diffing_spec.rb', 'examples/pure/stubbing_example.rb', 'examples/pure/pending_example.rb', '--format', 'html', opt] - err = StringIO.new - out = StringIO.new - CommandLine.run( - OptionParser.parse(args, err, out) - ) - - seconds = /\d+\.\d+ seconds/ - html = out.string.gsub seconds, 'x seconds' - expected_html.gsub! seconds, 'x seconds' - - if opt == '--diff' - # Uncomment this line temporarily in order to overwrite the expected with actual. - # Use with care!!! - # File.open(expected_file, 'w') {|io| io.write(html)} - - doc = Hpricot(html) - backtraces = doc.search("div.backtrace").collect {|e| e.at("/pre").inner_html} - doc.search("div.backtrace").remove - - expected_doc = Hpricot(expected_html) - expected_backtraces = expected_doc.search("div.backtrace").collect {|e| e.at("/pre").inner_html} - expected_doc.search("div.backtrace").remove - - doc.inner_html.should == expected_doc.inner_html - - expected_backtraces.each_with_index do |expected_line, i| - expected_path, expected_line_number, expected_suffix = expected_line.split(':') - actual_path, actual_line_number, actual_suffix = backtraces[i].split(':') - File.expand_path(actual_path).should == File.expand_path(expected_path) - actual_line_number.should == expected_line_number - end - else - html.should =~ /This was a dry-run/m - end - end - end - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/profile_formatter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/profile_formatter_spec.rb deleted file mode 100644 index 981805411..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/profile_formatter_spec.rb +++ /dev/null @@ -1,65 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' -require 'spec/runner/formatter/profile_formatter' - -module Spec - module Runner - module Formatter - describe ProfileFormatter do - attr_reader :io, :formatter - before(:each) do - @io = StringIO.new - options = mock('options') - options.stub!(:colour).and_return(true) - @formatter = ProfileFormatter.new(options, io) - end - - it "should print a heading" do - formatter.start(0) - io.string.should eql("Profiling enabled.\n") - end - - it "should record the current time when starting a new example" do - now = Time.now - Time.stub!(:now).and_return(now) - formatter.example_started('should foo') - formatter.instance_variable_get("@time").should == now - end - - it "should correctly record a passed example" do - now = Time.now - Time.stub!(:now).and_return(now) - parent_example_group = Class.new(ExampleGroup).describe('Parent') - child_example_group = Class.new(parent_example_group).describe('Child') - - formatter.add_example_group(child_example_group) - - formatter.example_started('when foo') - Time.stub!(:now).and_return(now+1) - formatter.example_passed(stub('foo', :description => 'i like ice cream')) - - formatter.start_dump - io.string.should include('Parent Child') - end - - it "should sort the results in descending order" do - formatter.instance_variable_set("@example_times", [['a', 'a', 0.1], ['b', 'b', 0.3], ['c', 'c', 0.2]]) - formatter.start_dump - formatter.instance_variable_get("@example_times").should == [ ['b', 'b', 0.3], ['c', 'c', 0.2], ['a', 'a', 0.1]] - end - - it "should print the top 10 results" do - example_group = Class.new(::Spec::Example::ExampleGroup).describe("ExampleGroup") - formatter.add_example_group(example_group) - formatter.instance_variable_set("@time", Time.now) - - 15.times do - formatter.example_passed(stub('foo', :description => 'i like ice cream')) - end - - io.should_receive(:print).exactly(10) - formatter.start_dump - end - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/progress_bar_formatter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/progress_bar_formatter_spec.rb deleted file mode 100644 index 127a617c1..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +++ /dev/null @@ -1,127 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' -require 'spec/runner/formatter/progress_bar_formatter' - -module Spec - module Runner - module Formatter - describe ProgressBarFormatter do - before(:each) do - @io = StringIO.new - @options = mock('options') - @options.stub!(:dry_run).and_return(false) - @options.stub!(:colour).and_return(false) - @formatter = ProgressBarFormatter.new(@options, @io) - end - - it "should produce line break on start dump" do - @formatter.start_dump - @io.string.should eql("\n") - end - - it "should produce standard summary without pending when pending has a 0 count" do - @formatter.dump_summary(3, 2, 1, 0) - @io.string.should eql("\nFinished in 3 seconds\n\n2 examples, 1 failure\n") - end - - it "should produce standard summary" do - @formatter.example_pending("example_group", ExampleGroup.new("example"), "message") - @io.rewind - @formatter.dump_summary(3, 2, 1, 1) - @io.string.should eql(%Q| -Finished in 3 seconds - -2 examples, 1 failure, 1 pending -|) - end - - it "should push green dot for passing spec" do - @io.should_receive(:tty?).and_return(true) - @options.should_receive(:colour).and_return(true) - @formatter.example_passed("spec") - @io.string.should == "\e[32m.\e[0m" - end - - it "should push red F for failure spec" do - @io.should_receive(:tty?).and_return(true) - @options.should_receive(:colour).and_return(true) - @formatter.example_failed("spec", 98, Reporter::Failure.new("c s", Spec::Expectations::ExpectationNotMetError.new)) - @io.string.should eql("\e[31mF\e[0m") - end - - it "should push magenta F for error spec" do - @io.should_receive(:tty?).and_return(true) - @options.should_receive(:colour).and_return(true) - @formatter.example_failed("spec", 98, Reporter::Failure.new("c s", RuntimeError.new)) - @io.string.should eql("\e[35mF\e[0m") - end - - it "should push blue F for fixed pending spec" do - @io.should_receive(:tty?).and_return(true) - @options.should_receive(:colour).and_return(true) - @formatter.example_failed("spec", 98, Reporter::Failure.new("c s", Spec::Example::PendingExampleFixedError.new)) - @io.string.should eql("\e[34mF\e[0m") - end - - it "should push nothing on start" do - @formatter.start(4) - @io.string.should eql("") - end - - it "should ensure two ':' in the first backtrace" do - backtrace = ["/tmp/x.rb:1", "/tmp/x.rb:2", "/tmp/x.rb:3"] - @formatter.format_backtrace(backtrace).should eql(<<-EOE.rstrip) -/tmp/x.rb:1: -/tmp/x.rb:2: -/tmp/x.rb:3: -EOE - - backtrace = ["/tmp/x.rb:1: message", "/tmp/x.rb:2", "/tmp/x.rb:3"] - @formatter.format_backtrace(backtrace).should eql(<<-EOE.rstrip) -/tmp/x.rb:1: message -/tmp/x.rb:2: -/tmp/x.rb:3: -EOE - end - - it "should dump pending" do - @formatter.example_pending("example_group", ExampleGroup.new("example"), "message") - @formatter.dump_pending - @io.string.should =~ /Pending\:\nexample_group example \(message\)\n/ - end - end - - describe "ProgressBarFormatter outputting to custom out" do - before(:each) do - @out = mock("out") - @options = mock('options') - @out.stub!(:puts) - @formatter = ProgressBarFormatter.new(@options, @out) - @formatter.class.send :public, :output_to_tty? - end - - after(:each) do - @formatter.class.send :protected, :output_to_tty? - end - - it "should not throw NoMethodError on output_to_tty?" do - @out.should_receive(:tty?).and_raise(NoMethodError) - @formatter.output_to_tty?.should be_false - end - end - - describe ProgressBarFormatter, "dry run" do - before(:each) do - @io = StringIO.new - options = mock('options') - options.stub!(:dry_run).and_return(true) - @formatter = ProgressBarFormatter.new(options, @io) - end - - it "should not produce summary on dry run" do - @formatter.dump_summary(3, 2, 1, 0) - @io.string.should eql("") - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/snippet_extractor_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/snippet_extractor_spec.rb deleted file mode 100644 index 4bb2f1585..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/snippet_extractor_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' -require 'spec/runner/formatter/snippet_extractor' - -module Spec - module Runner - module Formatter - describe SnippetExtractor do - it "should fall back on a default message when it doesn't understand a line" do - SnippetExtractor.new.snippet_for("blech").should == ["# Couldn't get snippet for blech", 1] - end - - it "should fall back on a default message when it doesn't find the file" do - SnippetExtractor.new.lines_around("blech", 8).should == "# Couldn't get snippet for blech" - end - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/spec_mate_formatter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/spec_mate_formatter_spec.rb deleted file mode 100644 index e782254e2..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +++ /dev/null @@ -1,103 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper' -require 'hpricot' # Needed to compare generated with wanted HTML -require 'spec/runner/formatter/text_mate_formatter' - -module Spec - module Runner - module Formatter - describe TextMateFormatter do - attr_reader :root, :suffix, :expected_file - before do - @root = File.expand_path(File.dirname(__FILE__) + '/../../../..') - @suffix = jruby? ? '-jruby' : '' - @expected_file = File.dirname(__FILE__) + "/text_mate_formatted-#{::VERSION}#{suffix}.html" - end - - def jruby? - PLATFORM == 'java' - end - - def produces_html_identical_to_manually_designed_document(opt) - root = File.expand_path(File.dirname(__FILE__) + '/../../../..') - - Dir.chdir(root) do - args = [ - 'failing_examples/mocking_example.rb', - 'failing_examples/diffing_spec.rb', - 'examples/pure/stubbing_example.rb', - 'examples/pure/pending_example.rb', - '--format', - 'textmate', - opt - ] - err = StringIO.new - out = StringIO.new - options = ::Spec::Runner::OptionParser.parse(args, err, out) - Spec::Runner::CommandLine.run(options) - - yield(out.string) - end - end - - # # Uncomment this spec temporarily in order to overwrite the expected with actual. - # # Use with care!!! - # describe TextMateFormatter, "functional spec file generator" do - # it "generates a new comparison file" do - # Dir.chdir(root) do - # args = ['failing_examples/mocking_example.rb', 'failing_examples/diffing_spec.rb', 'examples/pure/stubbing_example.rb', 'examples/pure/pending_example.rb', '--format', 'textmate', '--diff'] - # err = StringIO.new - # out = StringIO.new - # Spec::Runner::CommandLine.run( - # ::Spec::Runner::OptionParser.parse(args, err, out) - # ) - # - # seconds = /\d+\.\d+ seconds/ - # html = out.string.gsub seconds, 'x seconds' - # - # File.open(expected_file, 'w') {|io| io.write(html)} - # end - # end - # end - - describe "functional spec using --diff" do - it "should produce HTML identical to the one we designed manually with --diff" do - produces_html_identical_to_manually_designed_document("--diff") do |html| - suffix = jruby? ? '-jruby' : '' - expected_file = File.dirname(__FILE__) + "/text_mate_formatted-#{::VERSION}#{suffix}.html" - unless File.file?(expected_file) - raise "There is no HTML file with expected content for this platform: #{expected_file}" - end - expected_html = File.read(expected_file) - - seconds = /\d+\.\d+ seconds/ - html.gsub! seconds, 'x seconds' - expected_html.gsub! seconds, 'x seconds' - - doc = Hpricot(html) - backtraces = doc.search("div.backtrace/a") - doc.search("div.backtrace").remove - - expected_doc = Hpricot(expected_html) - expected_doc.search("div.backtrace").remove - - doc.inner_html.should == expected_doc.inner_html - - backtraces.each do |backtrace_link| - backtrace_link[:href].should include("txmt://open?url=") - end - end - end - - end - - describe "functional spec using --dry-run" do - it "should produce HTML identical to the one we designed manually with --dry-run" do - produces_html_identical_to_manually_designed_document("--dry-run") do |html, expected_html| - html.should =~ /This was a dry-run/m - end - end - end - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/specdoc_formatter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/specdoc_formatter_spec.rb deleted file mode 100644 index 79995309d..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/specdoc_formatter_spec.rb +++ /dev/null @@ -1,126 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' -require 'spec/runner/formatter/specdoc_formatter' - -module Spec - module Runner - module Formatter - describe SpecdocFormatter do - it_should_behave_like "sandboxed rspec_options" - attr_reader :io, :options, :formatter, :example_group - before(:each) do - @io = StringIO.new - options.stub!(:dry_run).and_return(false) - options.stub!(:colour).and_return(false) - @formatter = SpecdocFormatter.new(options, io) - @example_group = Class.new(::Spec::Example::ExampleGroup).describe("ExampleGroup") - end - - describe "where ExampleGroup has no superclasss with a description" do - before do - formatter.add_example_group(example_group) - end - - it "should produce standard summary without pending when pending has a 0 count" do - formatter.dump_summary(3, 2, 1, 0) - io.string.should have_example_group_output("\nFinished in 3 seconds\n\n2 examples, 1 failure\n") - end - - it "should produce standard summary" do - formatter.dump_summary(3, 2, 1, 4) - io.string.should have_example_group_output("\nFinished in 3 seconds\n\n2 examples, 1 failure, 4 pending\n") - end - - it "should push ExampleGroup name" do - io.string.should eql("\nExampleGroup\n") - end - - it "when having an error, should push failing spec name and failure number" do - formatter.example_failed( - example_group.it("spec"), - 98, - Reporter::Failure.new("c s", RuntimeError.new) - ) - io.string.should have_example_group_output("- spec (ERROR - 98)\n") - end - - it "when having an expectation failure, should push failing spec name and failure number" do - formatter.example_failed( - example_group.it("spec"), - 98, - Reporter::Failure.new("c s", Spec::Expectations::ExpectationNotMetError.new) - ) - io.string.should have_example_group_output("- spec (FAILED - 98)\n") - end - - it "should push nothing on start" do - formatter.start(5) - io.string.should have_example_group_output("") - end - - it "should push nothing on start dump" do - formatter.start_dump - io.string.should have_example_group_output("") - end - - it "should push passing spec name" do - formatter.example_passed(example_group.it("spec")) - io.string.should have_example_group_output("- spec\n") - end - - it "should push pending example name and message" do - formatter.example_pending('example_group', ExampleGroup.new("example"), 'reason') - io.string.should have_example_group_output("- example (PENDING: reason)\n") - end - - it "should dump pending" do - formatter.example_pending('example_group', ExampleGroup.new("example"), 'reason') - io.rewind - formatter.dump_pending - io.string.should =~ /Pending\:\nexample_group example \(reason\)\n/ - end - - def have_example_group_output(expected_output) - expected = "\nExampleGroup\n#{expected_output}" - ::Spec::Matchers::SimpleMatcher.new(expected) do |actual| - actual == expected - end - end - end - - describe "where ExampleGroup has two superclasses with a description" do - attr_reader :child_example_group, :grand_child_example_group - before do - @child_example_group = Class.new(example_group).describe("Child ExampleGroup") - @grand_child_example_group = Class.new(child_example_group).describe("GrandChild ExampleGroup") - formatter.add_example_group(grand_child_example_group) - end - - specify "when having an error, should push failing spec name and failure number" do - formatter.example_failed( - example_group.it("spec"), - 98, - Reporter::Failure.new("c s", RuntimeError.new) - ) - io.string.should have_nested_example_group_output("- spec (ERROR - 98)\n") - end - - specify "when having an expectation failure, should push failing spec name and failure number" do - formatter.example_failed( - example_group.it("spec"), - 98, - Reporter::Failure.new("c s", Spec::Expectations::ExpectationNotMetError.new) - ) - io.string.should have_nested_example_group_output("- spec (FAILED - 98)\n") - end - - def have_nested_example_group_output(expected_output) - expected_full_output = "\nExampleGroup Child ExampleGroup GrandChild ExampleGroup\n#{expected_output}" - ::Spec::Matchers::SimpleMatcher.new(expected_full_output) do |actual| - actual == expected_full_output - end - end - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/story/html_formatter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/story/html_formatter_spec.rb deleted file mode 100644 index 37fb7c670..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/story/html_formatter_spec.rb +++ /dev/null @@ -1,61 +0,0 @@ -require File.dirname(__FILE__) + '/../../../../spec_helper.rb' -require 'spec/runner/formatter/story/html_formatter' - -module Spec - module Runner - module Formatter - module Story - describe HtmlFormatter do - before :each do - @out = StringIO.new - @options = mock('options') - @reporter = HtmlFormatter.new(@options, @out) - end - - it "should just be poked at" do - @reporter.run_started(1) - @reporter.story_started('story_title', 'narrative') - - @reporter.scenario_started('story_title', 'succeeded_scenario_name') - @reporter.step_succeeded('given', 'succeded_step', 'one', 'two') - @reporter.scenario_succeeded('story_title', 'succeeded_scenario_name') - - @reporter.scenario_started('story_title', 'pending_scenario_name') - @reporter.step_pending('when', 'pending_step', 'un', 'deux') - @reporter.scenario_pending('story_title', 'pending_scenario_name', 'not done') - - @reporter.scenario_started('story_title', 'failed_scenario_name') - @reporter.step_failed('then', 'failed_step', 'en', 'to') - @reporter.scenario_failed('story_title', 'failed_scenario_name', NameError.new('sup')) - - @reporter.scenario_started('story_title', 'scenario_with_given_scenario_name') - @reporter.found_scenario('given scenario', 'succeeded_scenario_name') - - @reporter.story_ended('story_title', 'narrative') - @reporter.run_ended - end - - it "should create spans for params" do - @reporter.step_succeeded('given', 'a $coloured $animal', 'brown', 'dog') - @out.string.should == "
  • Given a brown dog
  • \n" - end - - it 'should create spanes for params in regexp steps' do - @reporter.step_succeeded :given, /a (pink|blue) (.*)/, 'brown', 'dog' - @out.string.should == "
  • Given a brown dog
  • \n" - end - - it "should create a ul for collected_steps" do - @reporter.collected_steps(['Given a $coloured $animal', 'Given a $n legged eel']) - @out.string.should == (<<-EOF) - -EOF - end - end - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb deleted file mode 100644 index 27e184b0f..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +++ /dev/null @@ -1,335 +0,0 @@ -require File.dirname(__FILE__) + '/../../../../spec_helper.rb' -require 'spec/runner/formatter/story/plain_text_formatter' - -module Spec - module Runner - module Formatter - module Story - describe PlainTextFormatter do - before :each do - # given - @out = StringIO.new - @tweaker = mock('tweaker') - @tweaker.stub!(:tweak_backtrace) - @options = mock('options') - @options.stub!(:colour).and_return(false) - @options.stub!(:backtrace_tweaker).and_return(@tweaker) - @formatter = PlainTextFormatter.new(@options, @out) - end - - it 'should summarize the number of scenarios when the run ends' do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario2') - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario3') - @formatter.run_ended - - # then - @out.string.should include('3 scenarios') - end - - it 'should summarize the number of successful scenarios when the run ends' do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario2') - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario3') - @formatter.run_ended - - # then - @out.string.should include('3 scenarios: 3 succeeded') - end - - it 'should summarize the number of failed scenarios when the run ends' do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops' }) - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' }) - @formatter.run_ended - - # then - @out.string.should include("3 scenarios: 1 succeeded, 2 failed") - end - - it 'should end cleanly (no characters on the last line) with successes' do - # when - @formatter.run_started(1) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario') - @formatter.run_ended - - # then - @out.string.should =~ /\n\z/ - end - - it 'should end cleanly (no characters on the last line) with failures' do - # when - @formatter.run_started(1) - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario', exception_from { raise RuntimeError, 'oops' }) - @formatter.run_ended - - # then - @out.string.should =~ /\n\z/ - end - - it 'should end cleanly (no characters on the last line) with pending steps' do - # when - @formatter.run_started(1) - @formatter.scenario_started(nil, nil) - @formatter.step_pending(:then, 'do pend') - @formatter.scenario_pending('story', 'scenario', exception_from { raise RuntimeError, 'oops' }) - @formatter.run_ended - - # then - @out.string.should =~ /\n\z/ - end - - it 'should summarize the number of pending scenarios when the run ends' do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_pending('story', 'scenario2', 'message') - @formatter.scenario_started(nil, nil) - @formatter.scenario_pending('story', 'scenario3', 'message') - @formatter.run_ended - - # then - @out.string.should include("3 scenarios: 1 succeeded, 0 failed, 2 pending") - end - - it "should only count the first failure in one scenario" do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops' }) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops again' }) - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' }) - @formatter.run_ended - - # then - @out.string.should include("3 scenarios: 1 succeeded, 2 failed") - end - - it "should only count the first pending in one scenario" do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_pending('story', 'scenario2', 'because ...') - @formatter.scenario_pending('story', 'scenario2', 'because ...') - @formatter.scenario_started(nil, nil) - @formatter.scenario_pending('story', 'scenario3', 'because ...') - @formatter.run_ended - - # then - @out.string.should include("3 scenarios: 1 succeeded, 0 failed, 2 pending") - end - - it "should only count a failure before the first pending in one scenario" do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_pending('story', 'scenario2', exception_from { raise RuntimeError, 'oops' }) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops again' }) - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' }) - @formatter.run_ended - - # then - @out.string.should include("3 scenarios: 1 succeeded, 1 failed, 1 pending") - end - - it 'should produce details of the first failure each failed scenario when the run ends' do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops2' }) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops2 - this one should not appear' }) - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops3' }) - @formatter.run_ended - - # then - @out.string.should include("FAILURES:\n") - @out.string.should include("1) story (scenario2) FAILED") - @out.string.should include("RuntimeError: oops2") - @out.string.should_not include("RuntimeError: oops2 - this one should not appear") - @out.string.should include("2) story (scenario3) FAILED") - @out.string.should include("RuntimeError: oops3") - end - - it 'should produce details of each pending step when the run ends' do - # when - @formatter.run_started(2) - @formatter.story_started('story 1', 'narrative') - @formatter.scenario_started('story 1', 'scenario 1') - @formatter.step_pending(:given, 'todo 1', []) - @formatter.story_started('story 2', 'narrative') - @formatter.scenario_started('story 2', 'scenario 2') - @formatter.step_pending(:given, 'todo 2', []) - @formatter.run_ended - - # then - @out.string.should include("Pending Steps:\n") - @out.string.should include("1) story 1 (scenario 1): todo 1") - @out.string.should include("2) story 2 (scenario 2): todo 2") - end - - it 'should document a story title and narrative' do - # when - @formatter.story_started 'story', 'narrative' - - # then - @out.string.should include("Story: story\n\n narrative") - end - - it 'should document a scenario name' do - # when - @formatter.scenario_started 'story', 'scenario' - - # then - @out.string.should include("\n\n Scenario: scenario") - end - - it 'should document a step by sentence-casing its name' do - # when - @formatter.step_succeeded :given, 'a context' - @formatter.step_succeeded :when, 'an event' - @formatter.step_succeeded :then, 'an outcome' - - # then - @out.string.should include("\n\n Given a context\n\n When an event\n\n Then an outcome") - end - - it 'should document additional givens using And' do - # when - @formatter.step_succeeded :given, 'step 1' - @formatter.step_succeeded :given, 'step 2' - @formatter.step_succeeded :given, 'step 3' - - # then - @out.string.should include(" Given step 1\n And step 2\n And step 3") - end - - it 'should document additional events using And' do - # when - @formatter.step_succeeded :when, 'step 1' - @formatter.step_succeeded :when, 'step 2' - @formatter.step_succeeded :when, 'step 3' - - # then - @out.string.should include(" When step 1\n And step 2\n And step 3") - end - - it 'should document additional outcomes using And' do - # when - @formatter.step_succeeded :then, 'step 1' - @formatter.step_succeeded :then, 'step 2' - @formatter.step_succeeded :then, 'step 3' - - # then - @out.string.should include(" Then step 1\n And step 2\n And step 3") - end - - it 'should document a GivenScenario followed by a Given using And' do - # when - @formatter.step_succeeded :'given scenario', 'a scenario' - @formatter.step_succeeded :given, 'a context' - - # then - @out.string.should include(" Given scenario a scenario\n And a context") - end - - it 'should document steps with replaced params' do - @formatter.step_succeeded :given, 'a $coloured dog with $n legs', 'pink', 21 - @out.string.should include(" Given a pink dog with 21 legs") - end - - it 'should document regexp steps with replaced params' do - @formatter.step_succeeded :given, /a (pink|blue) dog with (.*) legs/, 'pink', 21 - @out.string.should include(" Given a pink dog with 21 legs") - end - - it "should append PENDING for the first pending step" do - @formatter.scenario_started('','') - @formatter.step_pending(:given, 'a context') - - @out.string.should include('Given a context (PENDING)') - end - - it "should append PENDING for pending after already pending" do - @formatter.scenario_started('','') - @formatter.step_pending(:given, 'a context') - @formatter.step_pending(:when, 'I say hey') - - @out.string.should include('When I say hey (PENDING)') - end - - it "should append FAILED for the first failiure" do - @formatter.scenario_started('','') - @formatter.step_failed(:given, 'a context') - - @out.string.should include('Given a context (FAILED)') - end - - it "should append SKIPPED for the second failiure" do - @formatter.scenario_started('','') - @formatter.step_failed(:given, 'a context') - @formatter.step_failed(:when, 'I say hey') - - @out.string.should include('When I say hey (SKIPPED)') - end - - it "should append SKIPPED for the a failiure after PENDING" do - @formatter.scenario_started('','') - @formatter.step_pending(:given, 'a context') - @formatter.step_failed(:when, 'I say hey') - - @out.string.should include('When I say hey (SKIPPED)') - end - - it 'should print some white space after each story' do - # when - @formatter.story_ended 'title', 'narrative' - - # then - @out.string.should include("\n\n") - end - - it "should print nothing for collected_steps" do - @formatter.collected_steps(['Given a $coloured $animal', 'Given a $n legged eel']) - @out.string.should == ("") - end - - it "should ignore messages it doesn't care about" do - lambda { - @formatter.this_method_does_not_exist - }.should_not raise_error - end - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/heckle_runner_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/heckle_runner_spec.rb deleted file mode 100644 index 539d908c2..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/heckle_runner_spec.rb +++ /dev/null @@ -1,78 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' -unless [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} - require 'spec/runner/heckle_runner' - - module Foo - class Bar - def one; end - def two; end - end - - class Zap - def three; end - def four; end - end - end - - describe "HeckleRunner" do - before(:each) do - @heckle = mock("heckle", :null_object => true) - @heckle_class = mock("heckle_class") - end - - it "should heckle all methods in all classes in a module" do - @heckle_class.should_receive(:new).with("Foo::Bar", "one", rspec_options).and_return(@heckle) - @heckle_class.should_receive(:new).with("Foo::Bar", "two", rspec_options).and_return(@heckle) - @heckle_class.should_receive(:new).with("Foo::Zap", "three", rspec_options).and_return(@heckle) - @heckle_class.should_receive(:new).with("Foo::Zap", "four", rspec_options).and_return(@heckle) - - heckle_runner = Spec::Runner::HeckleRunner.new("Foo", @heckle_class) - heckle_runner.heckle_with - end - - it "should heckle all methods in a class" do - @heckle_class.should_receive(:new).with("Foo::Bar", "one", rspec_options).and_return(@heckle) - @heckle_class.should_receive(:new).with("Foo::Bar", "two", rspec_options).and_return(@heckle) - - heckle_runner = Spec::Runner::HeckleRunner.new("Foo::Bar", @heckle_class) - heckle_runner.heckle_with - end - - it "should fail heckling when the class is not found" do - lambda do - heckle_runner = Spec::Runner::HeckleRunner.new("Foo::Bob", @heckle_class) - heckle_runner.heckle_with - end.should raise_error(StandardError, "Heckling failed - \"Foo::Bob\" is not a known class or module") - end - - it "should heckle specific method in a class (with #)" do - @heckle_class.should_receive(:new).with("Foo::Bar", "two", rspec_options).and_return(@heckle) - - heckle_runner = Spec::Runner::HeckleRunner.new("Foo::Bar#two", @heckle_class) - heckle_runner.heckle_with - end - - it "should heckle specific method in a class (with .)" do - @heckle_class.should_receive(:new).with("Foo::Bar", "two", rspec_options).and_return(@heckle) - - heckle_runner = Spec::Runner::HeckleRunner.new("Foo::Bar.two", @heckle_class) - heckle_runner.heckle_with - end - end - - describe "Heckler" do - it "should say yes to tests_pass? if specs pass" do - options = mock("options", :null_object => true) - options.should_receive(:run_examples).and_return(true) - heckler = Spec::Runner::Heckler.new("Foo", nil, options) - heckler.tests_pass?.should be_true - end - - it "should say no to tests_pass? if specs fail" do - options = mock("options", :null_object => true) - options.should_receive(:run_examples).and_return(false) - heckler = Spec::Runner::Heckler.new("Foo", nil, options) - heckler.tests_pass?.should be_false - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/heckler_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/heckler_spec.rb deleted file mode 100644 index 7cf6606ec..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/heckler_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' -unless [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} - require 'spec/runner/heckle_runner' - - describe "Heckler" do - it "should run examples on tests_pass?" do - options = Spec::Runner::Options.new(StringIO.new, StringIO.new) - options.should_receive(:run_examples).with().and_return(&options.method(:run_examples)) - heckler = Spec::Runner::Heckler.new('Array', 'push', options) - heckler.tests_pass? - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/noisy_backtrace_tweaker_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/noisy_backtrace_tweaker_spec.rb deleted file mode 100644 index e097f2ec0..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Runner - describe "NoisyBacktraceTweaker" do - before(:each) do - @error = RuntimeError.new - @tweaker = NoisyBacktraceTweaker.new - end - - it "should leave anything in lib spec dir" do - ["expectations", "mocks", "runner", "stubs"].each do |child| - @error.set_backtrace(["/lib/spec/#{child}/anything.rb"]) - @tweaker.tweak_backtrace(@error) - @error.backtrace.should_not be_empty - end - end - - it "should leave anything in spec dir" do - @error.set_backtrace(["/lib/spec/expectations/anything.rb"]) - @tweaker.tweak_backtrace(@error) - @error.backtrace.should_not be_empty - end - - it "should leave bin spec" do - @error.set_backtrace(["bin/spec:"]) - @tweaker.tweak_backtrace(@error) - @error.backtrace.should_not be_empty - end - - it "should not barf on nil backtrace" do - lambda do - @tweaker.tweak_backtrace(@error) - end.should_not raise_error - end - - it "should clean up double slashes" do - @error.set_backtrace(["/a//b/c//d.rb"]) - @tweaker.tweak_backtrace(@error) - @error.backtrace.should include("/a/b/c/d.rb") - end - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/option_parser_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/option_parser_spec.rb deleted file mode 100644 index 8c91ad19f..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/option_parser_spec.rb +++ /dev/null @@ -1,377 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' -require 'fileutils' - -describe "OptionParser" do - before(:each) do - @out = StringIO.new - @err = StringIO.new - @parser = Spec::Runner::OptionParser.new(@err, @out) - end - - def parse(args) - @parser.parse(args) - @parser.options - end - - it "should accept dry run option" do - options = parse(["--dry-run"]) - options.dry_run.should be_true - end - - it "should eval and use custom formatter when none of the builtins" do - options = parse(["--format", "Custom::Formatter"]) - options.formatters[0].class.should be(Custom::Formatter) - end - - it "should support formatters with relative and absolute paths, even on windows" do - options = parse([ - "--format", "Custom::Formatter:C:\\foo\\bar", - "--format", "Custom::Formatter:foo/bar", - "--format", "Custom::Formatter:foo\\bar", - "--format", "Custom::Formatter:/foo/bar" - ]) - options.formatters[0].where.should eql("C:\\foo\\bar") - options.formatters[1].where.should eql("foo/bar") - options.formatters[2].where.should eql("foo\\bar") - options.formatters[3].where.should eql("/foo/bar") - end - - it "should not be verbose by default" do - options = parse([]) - options.verbose.should be_nil - end - - it "should not use colour by default" do - options = parse([]) - options.colour.should == false - end - - it "should print help to stdout if no args" do - pending 'A regression since 1.0.8' do - options = parse([]) - @out.rewind - @out.read.should match(/Usage: spec \(FILE\|DIRECTORY\|GLOB\)\+ \[options\]/m) - end - end - - it "should print help to stdout" do - options = parse(["--help"]) - @out.rewind - @out.read.should match(/Usage: spec \(FILE\|DIRECTORY\|GLOB\)\+ \[options\]/m) - end - - it "should print instructions about how to require missing formatter" do - lambda do - options = parse(["--format", "Custom::MissingFormatter"]) - options.formatters - end.should raise_error(NameError) - @err.string.should match(/Couldn't find formatter class Custom::MissingFormatter/n) - end - - it "should print version to stdout" do - options = parse(["--version"]) - @out.rewind - @out.read.should match(/RSpec-\d+\.\d+\.\d+.*\(build \d+\) - BDD for Ruby\nhttp:\/\/rspec.rubyforge.org\/\n/n) - end - - it "should require file when require specified" do - lambda do - parse(["--require", "whatever"]) - end.should raise_error(LoadError) - end - - it "should support c option" do - options = parse(["-c"]) - options.colour.should be_true - end - - it "should support queens colour option" do - options = parse(["--colour"]) - options.colour.should be_true - end - - it "should support us color option" do - options = parse(["--color"]) - options.colour.should be_true - end - - it "should support single example with -e option" do - options = parse(["-e", "something or other"]) - options.examples.should eql(["something or other"]) - end - - it "should support single example with -s option (will be removed when autotest supports -e)" do - options = parse(["-s", "something or other"]) - options.examples.should eql(["something or other"]) - end - - it "should support single example with --example option" do - options = parse(["--example", "something or other"]) - options.examples.should eql(["something or other"]) - end - - it "should read several example names from file if --example is given an existing file name" do - options = parse(["--example", File.dirname(__FILE__) + '/examples.txt']) - options.examples.should eql([ - "Sir, if you were my husband, I would poison your drink.", - "Madam, if you were my wife, I would drink it."]) - end - - it "should read no examples if given an empty file" do - options = parse(["--example", File.dirname(__FILE__) + '/empty_file.txt']) - options.examples.should eql([]) - end - - it "should use html formatter when format is h" do - options = parse(["--format", "h"]) - options.formatters[0].class.should equal(Spec::Runner::Formatter::HtmlFormatter) - end - - it "should use html story formatter when format is h" do - options = parse(["--format", "h"]) - options.story_formatters[0].class.should equal(Spec::Runner::Formatter::Story::HtmlFormatter) - end - - it "should use html formatter when format is html" do - options = parse(["--format", "html"]) - options.formatters[0].class.should equal(Spec::Runner::Formatter::HtmlFormatter) - end - - it "should use html story formatter when format is html" do - options = parse(["--format", "html"]) - options.story_formatters[0].class.should equal(Spec::Runner::Formatter::Story::HtmlFormatter) - end - - it "should use html formatter with explicit output when format is html:test.html" do - FileUtils.rm 'test.html' if File.exist?('test.html') - options = parse(["--format", "html:test.html"]) - options.formatters # creates the file - File.should be_exist('test.html') - options.formatters[0].class.should equal(Spec::Runner::Formatter::HtmlFormatter) - options.formatters[0].close - FileUtils.rm 'test.html' - end - - it "should use noisy backtrace tweaker with b option" do - options = parse(["-b"]) - options.backtrace_tweaker.should be_instance_of(Spec::Runner::NoisyBacktraceTweaker) - end - - it "should use noisy backtrace tweaker with backtrace option" do - options = parse(["--backtrace"]) - options.backtrace_tweaker.should be_instance_of(Spec::Runner::NoisyBacktraceTweaker) - end - - it "should use quiet backtrace tweaker by default" do - options = parse([]) - options.backtrace_tweaker.should be_instance_of(Spec::Runner::QuietBacktraceTweaker) - end - - it "should use progress bar formatter by default" do - options = parse([]) - options.formatters[0].class.should equal(Spec::Runner::Formatter::ProgressBarFormatter) - end - - it "should use specdoc formatter when format is s" do - options = parse(["--format", "s"]) - options.formatters[0].class.should equal(Spec::Runner::Formatter::SpecdocFormatter) - end - - it "should use specdoc formatter when format is specdoc" do - options = parse(["--format", "specdoc"]) - options.formatters[0].class.should equal(Spec::Runner::Formatter::SpecdocFormatter) - end - - it "should support diff option when format is not specified" do - options = parse(["--diff"]) - options.diff_format.should == :unified - end - - it "should use unified diff format option when format is unified" do - options = parse(["--diff", "unified"]) - options.diff_format.should == :unified - options.differ_class.should equal(Spec::Expectations::Differs::Default) - end - - it "should use context diff format option when format is context" do - options = parse(["--diff", "context"]) - options.diff_format.should == :context - options.differ_class.should == Spec::Expectations::Differs::Default - end - - it "should use custom diff format option when format is a custom format" do - Spec::Expectations.differ.should_not be_instance_of(Custom::Differ) - - options = parse(["--diff", "Custom::Differ"]) - options.parse_diff "Custom::Differ" - options.diff_format.should == :custom - options.differ_class.should == Custom::Differ - Spec::Expectations.differ.should be_instance_of(Custom::Differ) - end - - it "should print instructions about how to fix missing differ" do - lambda { parse(["--diff", "Custom::MissingFormatter"]) }.should raise_error(NameError) - @err.string.should match(/Couldn't find differ class Custom::MissingFormatter/n) - end - - it "should support --line to identify spec" do - spec_parser = mock("spec_parser") - @parser.instance_variable_set('@spec_parser', spec_parser) - - file_factory = mock("File") - file_factory.should_receive(:file?).and_return(true) - file_factory.should_receive(:open).and_return("fake_io") - @parser.instance_variable_set('@file_factory', file_factory) - - spec_parser.should_receive(:spec_name_for).with("fake_io", 169).and_return("some spec") - - options = parse(["some file", "--line", "169"]) - options.examples.should eql(["some spec"]) - File.rspec_verify - end - - it "should fail with error message if file is dir along with --line" do - spec_parser = mock("spec_parser") - @parser.instance_variable_set('@spec_parser', spec_parser) - - file_factory = mock("File") - file_factory.should_receive(:file?).and_return(false) - file_factory.should_receive(:directory?).and_return(true) - @parser.instance_variable_set('@file_factory', file_factory) - - options = parse(["some file", "--line", "169"]) - @err.string.should match(/You must specify one file, not a directory when using the --line option/n) - end - - it "should fail with error message if file does not exist along with --line" do - spec_parser = mock("spec_parser") - @parser.instance_variable_set('@spec_parser', spec_parser) - - file_factory = mock("File") - file_factory.should_receive(:file?).and_return(false) - file_factory.should_receive(:directory?).and_return(false) - @parser.instance_variable_set('@file_factory', file_factory) - - options = parse(["some file", "--line", "169"]) - @err.string.should match(/some file does not exist/n) - end - - it "should fail with error message if more than one files are specified along with --line" do - spec_parser = mock("spec_parser") - @parser.instance_variable_set('@spec_parser', spec_parser) - - options = parse(["some file", "some other file", "--line", "169"]) - @err.string.should match(/Only one file can be specified when using the --line option/n) - end - - it "should fail with error message if --example and --line are used simultaneously" do - spec_parser = mock("spec_parser") - @parser.instance_variable_set('@spec_parser', spec_parser) - - options = parse(["some file", "--example", "some example", "--line", "169"]) - @err.string.should match(/You cannot use both --line and --example/n) - end - - if [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} - it "should barf when --heckle is specified (and platform is windows)" do - lambda do - options = parse(["--heckle", "Spec"]) - end.should raise_error(StandardError, "Heckle not supported on Windows") - end - else - it "should heckle when --heckle is specified (and platform is not windows)" do - options = parse(["--heckle", "Spec"]) - options.heckle_runner.should be_instance_of(Spec::Runner::HeckleRunner) - end - end - - it "should read options from file when --options is specified" do - options = parse(["--options", File.dirname(__FILE__) + "/spec.opts"]) - options.diff_format.should_not be_nil - options.colour.should be_true - end - - it "should default the formatter to ProgressBarFormatter when using options file" do - options = parse(["--options", File.dirname(__FILE__) + "/spec.opts"]) - options.formatters.first.should be_instance_of(::Spec::Runner::Formatter::ProgressBarFormatter) - end - - it "should read spaced and multi-line options from file when --options is specified" do - options = parse(["--options", File.dirname(__FILE__) + "/spec_spaced.opts"]) - options.diff_format.should_not be_nil - options.colour.should be_true - options.formatters.first.should be_instance_of(::Spec::Runner::Formatter::SpecdocFormatter) - end - - it "should save config to file when --generate-options is specified" do - FileUtils.rm 'test.spec.opts' if File.exist?('test.spec.opts') - options = parse(["--colour", "--generate-options", "test.spec.opts", "--diff"]) - IO.read('test.spec.opts').should == "--colour\n--diff\n" - FileUtils.rm 'test.spec.opts' - end - - it "should save config to file when -G is specified" do - FileUtils.rm 'test.spec.opts' if File.exist?('test.spec.opts') - options = parse(["--colour", "-G", "test.spec.opts", "--diff"]) - IO.read('test.spec.opts').should == "--colour\n--diff\n" - FileUtils.rm 'test.spec.opts' - end - - it "when --drb is specified, calls DrbCommandLine all of the other ARGV arguments" do - options = Spec::Runner::OptionParser.parse([ - "some/spec.rb", "--diff", "--colour" - ], @err, @out) - Spec::Runner::DrbCommandLine.should_receive(:run).and_return do |options| - options.argv.should == ["some/spec.rb", "--diff", "--colour"] - end - parse(["some/spec.rb", "--diff", "--drb", "--colour"]) - end - - it "should reverse spec order when --reverse is specified" do - options = parse(["some/spec.rb", "--reverse"]) - end - - it "should set an mtime comparator when --loadby mtime" do - options = parse(["--loadby", 'mtime']) - runner = Spec::Runner::ExampleGroupRunner.new(options) - Spec::Runner::ExampleGroupRunner.should_receive(:new). - with(options). - and_return(runner) - runner.should_receive(:load_files).with(["most_recent_spec.rb", "command_line_spec.rb"]) - - Dir.chdir(File.dirname(__FILE__)) do - options.files << 'command_line_spec.rb' - options.files << 'most_recent_spec.rb' - FileUtils.touch "most_recent_spec.rb" - options.run_examples - FileUtils.rm "most_recent_spec.rb" - end - end - - it "should use the standard runner by default" do - runner = ::Spec::Runner::ExampleGroupRunner.new(@parser.options) - ::Spec::Runner::ExampleGroupRunner.should_receive(:new). - with(@parser.options). - and_return(runner) - options = parse([]) - options.run_examples - end - - it "should use a custom runner when given" do - runner = Custom::ExampleGroupRunner.new(@parser.options, nil) - Custom::ExampleGroupRunner.should_receive(:new). - with(@parser.options, nil). - and_return(runner) - options = parse(["--runner", "Custom::ExampleGroupRunner"]) - options.run_examples - end - - it "should use a custom runner with extra options" do - runner = Custom::ExampleGroupRunner.new(@parser.options, 'something') - Custom::ExampleGroupRunner.should_receive(:new). - with(@parser.options, 'something'). - and_return(runner) - options = parse(["--runner", "Custom::ExampleGroupRunner:something"]) - options.run_examples - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/options_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/options_spec.rb deleted file mode 100644 index e4d01b05c..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/options_spec.rb +++ /dev/null @@ -1,294 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Runner - describe Options do - before(:each) do - @err = StringIO.new('') - @out = StringIO.new('') - @options = Options.new(@err, @out) - end - - after(:each) do - Spec::Expectations.differ = nil - end - - describe "#examples" do - it "should default to empty array" do - @options.examples.should == [] - end - end - - describe "#backtrace_tweaker" do - it "should default to QuietBacktraceTweaker" do - @options.backtrace_tweaker.class.should == QuietBacktraceTweaker - end - end - - describe "#dry_run" do - it "should default to false" do - @options.dry_run.should == false - end - end - - describe "#context_lines" do - it "should default to 3" do - @options.context_lines.should == 3 - end - end - - describe "#parse_diff with nil" do - before(:each) do - @options.parse_diff nil - end - - it "should make diff_format unified" do - @options.diff_format.should == :unified - end - - it "should set Spec::Expectations.differ to be a default differ" do - Spec::Expectations.differ.class.should == - ::Spec::Expectations::Differs::Default - end - end - - describe "#parse_diff with 'unified'" do - before(:each) do - @options.parse_diff 'unified' - end - - it "should make diff_format unified and uses default differ_class" do - @options.diff_format.should == :unified - @options.differ_class.should equal(Spec::Expectations::Differs::Default) - end - - it "should set Spec::Expectations.differ to be a default differ" do - Spec::Expectations.differ.class.should == - ::Spec::Expectations::Differs::Default - end - end - - describe "#parse_diff with 'context'" do - before(:each) do - @options.parse_diff 'context' - end - - it "should make diff_format context and uses default differ_class" do - @options.diff_format.should == :context - @options.differ_class.should == Spec::Expectations::Differs::Default - end - - it "should set Spec::Expectations.differ to be a default differ" do - Spec::Expectations.differ.class.should == - ::Spec::Expectations::Differs::Default - end - end - - describe "#parse_diff with Custom::Differ" do - before(:each) do - @options.parse_diff 'Custom::Differ' - end - - it "should use custom differ_class" do - @options.diff_format.should == :custom - @options.differ_class.should == Custom::Differ - Spec::Expectations.differ.should be_instance_of(Custom::Differ) - end - - it "should set Spec::Expectations.differ to be a default differ" do - Spec::Expectations.differ.class.should == - ::Custom::Differ - end - end - - describe "#parse_diff with missing class name" do - it "should raise error" do - lambda { @options.parse_diff "Custom::MissingDiffer" }.should raise_error(NameError) - @err.string.should match(/Couldn't find differ class Custom::MissingDiffer/n) - end - end - - describe "#parse_example" do - it "with argument thats not a file path, sets argument as the example" do - example = "something or other" - File.file?(example).should == false - @options.parse_example example - @options.examples.should eql(["something or other"]) - end - - it "with argument that is a file path, sets examples to contents of the file" do - example = "#{File.dirname(__FILE__)}/examples.txt" - File.should_receive(:file?).with(example).and_return(true) - file = StringIO.new("Sir, if you were my husband, I would poison your drink.\nMadam, if you were my wife, I would drink it.") - File.should_receive(:open).with(example).and_return(file) - - @options.parse_example example - @options.examples.should eql([ - "Sir, if you were my husband, I would poison your drink.", - "Madam, if you were my wife, I would drink it." - ]) - end - end - - describe "#examples_should_not_be_run" do - it "should cause #run_examples to return true and do nothing" do - @options.examples_should_not_be_run - ExampleGroupRunner.should_not_receive(:new) - - @options.run_examples.should be_true - end - end - - describe "#load_class" do - it "should raise error when not class name" do - lambda do - @options.send(:load_class, 'foo', 'fruit', '--food') - end.should raise_error('"foo" is not a valid class name') - end - end - - describe "#reporter" do - it "returns a Reporter" do - @options.reporter.should be_instance_of(Reporter) - @options.reporter.options.should === @options - end - end - - describe "#add_example_group affecting passed in example_group" do - it "runs all examples when options.examples is nil" do - example_1_has_run = false - example_2_has_run = false - @example_group = Class.new(::Spec::Example::ExampleGroup).describe("Some Examples") do - it "runs 1" do - example_1_has_run = true - end - it "runs 2" do - example_2_has_run = true - end - end - - @options.examples = nil - - @options.add_example_group @example_group - @options.run_examples - example_1_has_run.should be_true - example_2_has_run.should be_true - end - - it "keeps all example_definitions when options.examples is empty" do - example_1_has_run = false - example_2_has_run = false - @example_group = Class.new(::Spec::Example::ExampleGroup).describe("Some Examples") do - it "runs 1" do - example_1_has_run = true - end - it "runs 2" do - example_2_has_run = true - end - end - - @options.examples = [] - - @options.add_example_group @example_group - @options.run_examples - example_1_has_run.should be_true - example_2_has_run.should be_true - end - end - - describe "#add_example_group affecting example_group" do - it "adds example_group when example_group has example_definitions and is not shared" do - @example_group = Class.new(::Spec::Example::ExampleGroup).describe("Some Examples") do - it "uses this example_group" do - end - end - - @options.number_of_examples.should == 0 - @options.add_example_group @example_group - @options.number_of_examples.should == 1 - @options.example_groups.length.should == 1 - end - end - - describe "#remove_example_group" do - it "should remove the ExampleGroup from the list of ExampleGroups" do - @example_group = Class.new(::Spec::Example::ExampleGroup).describe("Some Examples") do - end - @options.add_example_group @example_group - @options.example_groups.should include(@example_group) - - @options.remove_example_group @example_group - @options.example_groups.should_not include(@example_group) - end - end - - describe "#run_examples" do - it "should use the standard runner by default" do - runner = ::Spec::Runner::ExampleGroupRunner.new(@options) - ::Spec::Runner::ExampleGroupRunner.should_receive(:new). - with(@options). - and_return(runner) - @options.user_input_for_runner = nil - - @options.run_examples - end - - it "should use a custom runner when given" do - runner = Custom::ExampleGroupRunner.new(@options, nil) - Custom::ExampleGroupRunner.should_receive(:new). - with(@options, nil). - and_return(runner) - @options.user_input_for_runner = "Custom::ExampleGroupRunner" - - @options.run_examples - end - - it "should use a custom runner with extra options" do - runner = Custom::ExampleGroupRunner.new(@options, 'something') - Custom::ExampleGroupRunner.should_receive(:new). - with(@options, 'something'). - and_return(runner) - @options.user_input_for_runner = "Custom::ExampleGroupRunner:something" - - @options.run_examples - end - - describe "#run_examples when there are example_group" do - before(:each) do - @options.add_example_group Class.new(::Spec::Example::ExampleGroup) - @options.formatters << Formatter::BaseTextFormatter.new(@options, @out) - end - - it "runs the Examples and outputs the result" do - @options.run_examples - @out.string.should include("0 examples, 0 failures") - end - - it "sets #examples_run? to true" do - @options.examples_run?.should be_false - @options.run_examples - @options.examples_run?.should be_true - end - end - - describe "#run_examples when there are no example_group" do - before(:each) do - @options.formatters << Formatter::BaseTextFormatter.new(@options, @out) - end - - it "does not run Examples and does not output a result" do - @options.run_examples - @out.string.should_not include("examples") - @out.string.should_not include("failures") - end - - it "sets #examples_run? to false" do - @options.examples_run?.should be_false - @options.run_examples - @options.examples_run?.should be_false - end - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/output_one_time_fixture.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/output_one_time_fixture.rb deleted file mode 100644 index 444730dc3..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/output_one_time_fixture.rb +++ /dev/null @@ -1,7 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "Running an Example" do - it "should not output twice" do - true.should be_true - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/output_one_time_fixture_runner.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/output_one_time_fixture_runner.rb deleted file mode 100644 index a0e61316e..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/output_one_time_fixture_runner.rb +++ /dev/null @@ -1,8 +0,0 @@ -dir = File.dirname(__FILE__) -require "#{dir}/../../spec_helper" - -triggering_double_output = rspec_options -options = Spec::Runner::OptionParser.parse( - ["#{dir}/output_one_time_fixture.rb"], $stderr, $stdout -) -Spec::Runner::CommandLine.run(options) diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/output_one_time_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/output_one_time_spec.rb deleted file mode 100644 index 8f67a380a..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/output_one_time_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Runner - describe CommandLine do - it "should not output twice" do - dir = File.dirname(__FILE__) - Dir.chdir("#{dir}/../../..") do - output =`ruby #{dir}/output_one_time_fixture_runner.rb` - output.should include("1 example, 0 failures") - output.should_not include("0 examples, 0 failures") - end - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/quiet_backtrace_tweaker_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/quiet_backtrace_tweaker_spec.rb deleted file mode 100644 index e47b6c735..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Runner - describe "QuietBacktraceTweaker" do - before(:each) do - @error = RuntimeError.new - @tweaker = QuietBacktraceTweaker.new - end - - it "should not barf on nil backtrace" do - lambda do - @tweaker.tweak_backtrace(@error) - end.should_not raise_error - end - - it "should remove anything from textmate ruby bundle" do - @error.set_backtrace(["/Applications/TextMate.app/Contents/SharedSupport/Bundles/Ruby.tmbundle/Support/tmruby.rb:147"]) - @tweaker.tweak_backtrace(@error) - @error.backtrace.should be_empty - end - - it "should remove anything in lib spec dir" do - ["expectations", "mocks", "runner"].each do |child| - element="/lib/spec/#{child}/anything.rb" - @error.set_backtrace([element]) - @tweaker.tweak_backtrace(@error) - unless (@error.backtrace.empty?) - raise("Should have tweaked away '#{element}'") - end - end - end - - it "should remove mock_frameworks/rspec" do - element = "mock_frameworks/rspec" - @error.set_backtrace([element]) - @tweaker.tweak_backtrace(@error) - unless (@error.backtrace.empty?) - raise("Should have tweaked away '#{element}'") - end - end - - it "should remove bin spec" do - @error.set_backtrace(["bin/spec:"]) - @tweaker.tweak_backtrace(@error) - @error.backtrace.should be_empty - end - - it "should clean up double slashes" do - @error.set_backtrace(["/a//b/c//d.rb"]) - @tweaker.tweak_backtrace(@error) - @error.backtrace.should include("/a/b/c/d.rb") - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/reporter_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/reporter_spec.rb deleted file mode 100644 index 52377e7f3..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/reporter_spec.rb +++ /dev/null @@ -1,189 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Runner - describe Reporter do - attr_reader :formatter_output, :options, :backtrace_tweaker, :formatter, :reporter, :example_group - before(:each) do - @formatter_output = StringIO.new - @options = Options.new(StringIO.new, StringIO.new) - @backtrace_tweaker = stub("backtrace tweaker", :tweak_backtrace => nil) - options.backtrace_tweaker = backtrace_tweaker - @formatter = ::Spec::Runner::Formatter::BaseTextFormatter.new(options, formatter_output) - options.formatters << formatter - @reporter = Reporter.new(options) - @example_group = create_example_group("example_group") - reporter.add_example_group example_group - end - - def failure - Mocks::DuckTypeArgConstraint.new(:header, :exception) - end - - def create_example_group(description_text) - example_group = Class.new(Spec::Example::ExampleGroup) - example_group.describe description_text - example_group - end - - it "should assign itself as the reporter to options" do - options.reporter.should equal(@reporter) - end - - it "should tell formatter when example_group is added" do - formatter.should_receive(:add_example_group).with(example_group) - reporter.add_example_group(example_group) - end - - it "should handle multiple example_groups with same name" do - formatter.should_receive(:add_example_group).exactly(3).times - formatter.should_receive(:example_started).exactly(3).times - formatter.should_receive(:example_passed).exactly(3).times - formatter.should_receive(:start_dump) - formatter.should_receive(:dump_pending) - formatter.should_receive(:close).with(no_args) - formatter.should_receive(:dump_summary).with(anything(), 3, 0, 0) - reporter.add_example_group(create_example_group("example_group")) - reporter.example_started("spec 1") - reporter.example_finished("spec 1") - reporter.add_example_group(create_example_group("example_group")) - reporter.example_started("spec 2") - reporter.example_finished("spec 2") - reporter.add_example_group(create_example_group("example_group")) - reporter.example_started("spec 3") - reporter.example_finished("spec 3") - reporter.dump - end - - it "should handle multiple examples with the same name" do - error=RuntimeError.new - passing = ExampleGroup.new("example") - failing = ExampleGroup.new("example") - - formatter.should_receive(:add_example_group).exactly(2).times - formatter.should_receive(:example_passed).with(passing).exactly(2).times - formatter.should_receive(:example_failed).with(failing, 1, failure) - formatter.should_receive(:example_failed).with(failing, 2, failure) - formatter.should_receive(:dump_failure).exactly(2).times - formatter.should_receive(:start_dump) - formatter.should_receive(:dump_pending) - formatter.should_receive(:close).with(no_args) - formatter.should_receive(:dump_summary).with(anything(), 4, 2, 0) - backtrace_tweaker.should_receive(:tweak_backtrace).twice - - reporter.add_example_group(create_example_group("example_group")) - reporter.example_finished(passing) - reporter.example_finished(failing, error) - - reporter.add_example_group(create_example_group("example_group")) - reporter.example_finished(passing) - reporter.example_finished(failing, error) - reporter.dump - end - - it "should push stats to formatter even with no data" do - formatter.should_receive(:start_dump) - formatter.should_receive(:dump_pending) - formatter.should_receive(:dump_summary).with(anything(), 0, 0, 0) - formatter.should_receive(:close).with(no_args) - reporter.dump - end - - it "should push time to formatter" do - formatter.should_receive(:start).with(5) - formatter.should_receive(:start_dump) - formatter.should_receive(:dump_pending) - formatter.should_receive(:close).with(no_args) - formatter.should_receive(:dump_summary) do |time, a, b| - time.to_s.should match(/[0-9].[0-9|e|-]+/) - end - reporter.start(5) - reporter.end - reporter.dump - end - - describe Reporter, "reporting one passing example" do - it "should tell formatter example passed" do - formatter.should_receive(:example_passed) - reporter.example_finished("example") - end - - it "should not delegate to backtrace tweaker" do - formatter.should_receive(:example_passed) - backtrace_tweaker.should_not_receive(:tweak_backtrace) - reporter.example_finished("example") - end - - it "should account for passing example in stats" do - formatter.should_receive(:example_passed) - formatter.should_receive(:start_dump) - formatter.should_receive(:dump_pending) - formatter.should_receive(:dump_summary).with(anything(), 1, 0, 0) - formatter.should_receive(:close).with(no_args) - reporter.example_finished("example") - reporter.dump - end - end - - describe Reporter, "reporting one failing example" do - it "should tell formatter that example failed" do - formatter.should_receive(:example_failed) - reporter.example_finished(example_group, RuntimeError.new) - end - - it "should delegate to backtrace tweaker" do - formatter.should_receive(:example_failed) - backtrace_tweaker.should_receive(:tweak_backtrace) - reporter.example_finished(ExampleGroup.new("example"), RuntimeError.new) - end - - it "should account for failing example in stats" do - example = ExampleGroup.new("example") - formatter.should_receive(:example_failed).with(example, 1, failure) - formatter.should_receive(:start_dump) - formatter.should_receive(:dump_pending) - formatter.should_receive(:dump_failure).with(1, anything()) - formatter.should_receive(:dump_summary).with(anything(), 1, 1, 0) - formatter.should_receive(:close).with(no_args) - reporter.example_finished(example, RuntimeError.new) - reporter.dump - end - - end - - describe Reporter, "reporting one pending example (ExamplePendingError)" do - it "should tell formatter example is pending" do - example = ExampleGroup.new("example") - formatter.should_receive(:example_pending).with(example_group.description, example, "reason") - formatter.should_receive(:add_example_group).with(example_group) - reporter.add_example_group(example_group) - reporter.example_finished(example, Spec::Example::ExamplePendingError.new("reason")) - end - - it "should account for pending example in stats" do - example = ExampleGroup.new("example") - formatter.should_receive(:example_pending).with(example_group.description, example, "reason") - formatter.should_receive(:start_dump) - formatter.should_receive(:dump_pending) - formatter.should_receive(:dump_summary).with(anything(), 1, 0, 1) - formatter.should_receive(:close).with(no_args) - formatter.should_receive(:add_example_group).with(example_group) - reporter.add_example_group(example_group) - reporter.example_finished(example, Spec::Example::ExamplePendingError.new("reason")) - reporter.dump - end - end - - describe Reporter, "reporting one pending example (PendingExampleFixedError)" do - it "should tell formatter pending example is fixed" do - formatter.should_receive(:example_failed) do |name, counter, failure| - failure.header.should == "'example_group example' FIXED" - end - formatter.should_receive(:add_example_group).with(example_group) - reporter.add_example_group(example_group) - reporter.example_finished(ExampleGroup.new("example"), Spec::Example::PendingExampleFixedError.new("reason")) - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner/spec_parser_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner/spec_parser_spec.rb deleted file mode 100644 index 301155d04..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner/spec_parser_spec.rb +++ /dev/null @@ -1,124 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "c" do - - it "1" do - end - - it "2" do - end - -end - -describe "d" do - - it "3" do - end - - it "4" do - end - -end - -class SpecParserSubject -end - -describe SpecParserSubject do - - it "5" do - end - -end - -describe SpecParserSubject, "described" do - - it "6" do - end - -end - -describe SpecParserSubject, "described", :something => :something_else do - - it "7" do - end - -end - -describe "described", :something => :something_else do - - it "8" do - end - -end - - -describe "SpecParser" do - before(:each) do - @p = Spec::Runner::SpecParser.new - end - - it "should find spec name for 'specify' at same line" do - @p.spec_name_for(File.open(__FILE__), 5).should == "c 1" - end - - it "should find spec name for 'specify' at end of spec line" do - @p.spec_name_for(File.open(__FILE__), 6).should == "c 1" - end - - it "should find context for 'context' above all specs" do - @p.spec_name_for(File.open(__FILE__), 4).should == "c" - end - - it "should find spec name for 'it' at same line" do - @p.spec_name_for(File.open(__FILE__), 15).should == "d 3" - end - - it "should find spec name for 'it' at end of spec line" do - @p.spec_name_for(File.open(__FILE__), 16).should == "d 3" - end - - it "should find context for 'describe' above all specs" do - @p.spec_name_for(File.open(__FILE__), 14).should == "d" - end - - it "should find nearest example name between examples" do - @p.spec_name_for(File.open(__FILE__), 7).should == "c 1" - end - - it "should find nothing outside a context" do - @p.spec_name_for(File.open(__FILE__), 2).should be_nil - end - - it "should find context name for type" do - @p.spec_name_for(File.open(__FILE__), 26).should == "SpecParserSubject" - end - - it "should find context and spec name for type" do - @p.spec_name_for(File.open(__FILE__), 28).should == "SpecParserSubject 5" - end - - it "should find context and description for type" do - @p.spec_name_for(File.open(__FILE__), 33).should == "SpecParserSubject described" - end - - it "should find context and description and example for type" do - @p.spec_name_for(File.open(__FILE__), 36).should == "SpecParserSubject described 6" - end - - it "should find context and description for type with modifications" do - @p.spec_name_for(File.open(__FILE__), 40).should == "SpecParserSubject described" - end - - it "should find context and described and example for type with modifications" do - @p.spec_name_for(File.open(__FILE__), 43).should == "SpecParserSubject described 7" - end - - it "should find example group" do - @p.spec_name_for(File.open(__FILE__), 47).should == "described" - end - - it "should find example" do - @p.spec_name_for(File.open(__FILE__), 50).should == "described 8" - end - -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/runner_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/runner_spec.rb deleted file mode 100644 index d75e66111..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/runner_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require File.dirname(__FILE__) + '/../spec_helper.rb' - -module Spec - describe Runner, ".configure" do - it "should yield global configuration" do - Spec::Runner.configure do |config| - config.should equal(Spec::Runner.configuration) - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/spec_classes.rb b/vendor/gems/rspec-1.1.2/spec/spec/spec_classes.rb deleted file mode 100644 index 73b0e33e8..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/spec_classes.rb +++ /dev/null @@ -1,129 +0,0 @@ -# This file contains various classes used by the specs. -module Spec - module Expectations - class Person - attr_reader :name - def initialize name - @name = name - end - def == other - return @name == other.name - end - end - - class ClassWithMultiWordPredicate - def multi_word_predicate? - true - end - end - - module Helper - class CollectionWithSizeMethod - def initialize; @list = []; end - def size; @list.size; end - def push(item); @list.push(item); end - end - - class CollectionWithLengthMethod - def initialize; @list = []; end - def length; @list.size; end - def push(item); @list.push(item); end - end - - class CollectionOwner - attr_reader :items_in_collection_with_size_method, :items_in_collection_with_length_method - - def initialize - @items_in_collection_with_size_method = CollectionWithSizeMethod.new - @items_in_collection_with_length_method = CollectionWithLengthMethod.new - end - - def add_to_collection_with_size_method(item) - @items_in_collection_with_size_method.push(item) - end - - def add_to_collection_with_length_method(item) - @items_in_collection_with_length_method.push(item) - end - - def items_for(arg) - return [1, 2, 3] if arg == 'a' - [1] - end - - def items - @items_in_collection_with_size_method - end - end - - class HandCodedMock - include Spec::Matchers - def initialize(return_val) - @return_val = return_val - @funny_called = false - end - - def funny? - @funny_called = true - @return_val - end - - def hungry?(a, b, c) - a.should equal(1) - b.should equal(2) - c.should equal(3) - @funny_called = true - @return_val - end - - def exists? - @return_val - end - - def multi_word_predicate? - @return_val - end - - def rspec_verify - @funny_called.should be_true - end - end - class ClassWithUnqueriedPredicate - attr_accessor :foo - def initialize(foo) - @foo = foo - end - end - end - end -end - -module Custom - require 'spec/runner/formatter/base_text_formatter' - class Formatter < Spec::Runner::Formatter::BaseTextFormatter - attr_reader :options, :where - - def initialize(options, where) - @options = options - @where = where - end - end - - class BadFormatter < Spec::Runner::Formatter::BaseTextFormatter - attr_reader :where - - def initialize(options, where) - bad_method - end - end - - class Differ - attr_reader :options - def initialize(options) - @options = options - end - end -end - -class FakeReporter < Spec::Runner::Reporter -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/builders.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/builders.rb deleted file mode 100644 index 77d50d53e..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/builders.rb +++ /dev/null @@ -1,46 +0,0 @@ -module Spec - module Story - class StoryBuilder - def initialize - @title = 'a story' - @narrative = 'narrative' - end - - def title(value) - @title = value - self - end - - def narrative(value) - @narrative = value - self - end - - def to_story(&block) - block = lambda {} unless block_given? - Story.new @title, @narrative, &block - end - end - - class ScenarioBuilder - def initialize - @name = 'a scenario' - @story = StoryBuilder.new.to_story - end - - def name(value) - @name = value - self - end - - def story(value) - @story = value - self - end - - def to_scenario(&block) - Scenario.new @story, @name, &block - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/extensions/main_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/extensions/main_spec.rb deleted file mode 100644 index acdc341ce..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/extensions/main_spec.rb +++ /dev/null @@ -1,161 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper' - -module Spec - module Story - module Extensions - describe "the main object extended with Main", :shared => true do - before(:each) do - @main = Class.new do; include Main; end - @original_rspec_story_steps, $rspec_story_steps = $rspec_story_steps, nil - end - - after(:each) do - $rspec_story_steps = @original_rspec_story_steps - end - - def have_step(type, name) - return simple_matcher(%[step group containing a #{type} named #{name.inspect}]) do |actual| - Spec::Story::Step === actual.find(type, name) - end - end - end - - describe Main, "#run_story" do - it_should_behave_like "the main object extended with Main" - - it "should create a PlainTextStoryRunner with run_story" do - Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(mock("runner", :null_object => true)) - @main.run_story - end - - it "should yield the runner if arity == 1" do - File.should_receive(:read).with("some/path").and_return("Story: foo") - $main_spec_runner = nil - @main.run_story("some/path") do |runner| - $main_spec_runner = runner - end - $main_spec_runner.should be_an_instance_of(Spec::Story::Runner::PlainTextStoryRunner) - end - - it "should run in the runner if arity == 0" do - File.should_receive(:read).with("some/path").and_return("Story: foo") - $main_spec_runner = nil - @main.run_story("some/path") do - $main_spec_runner = self - end - $main_spec_runner.should be_an_instance_of(Spec::Story::Runner::PlainTextStoryRunner) - end - - it "should tell the PlainTextStoryRunner to run with run_story" do - runner = mock("runner") - Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(runner) - runner.should_receive(:run) - @main.run_story - end - end - - describe Main, "#steps_for" do - it_should_behave_like "the main object extended with Main" - - it "should have no steps for a non existent key" do - @main.steps_for(:key).find(:given, "foo").should be_nil - end - - it "should create steps for a key" do - $main_spec_invoked = false - @main.steps_for(:key) do - Given("foo") { - $main_spec_invoked = true - } - end - @main.steps_for(:key).find(:given, "foo").perform(Object.new, "foo") - $main_spec_invoked.should be_true - end - - it "should append steps to steps_for a given key" do - @main.steps_for(:key) do - Given("first") {} - end - @main.steps_for(:key) do - Given("second") {} - end - @main.steps_for(:key).should have_step(:given, "first") - @main.steps_for(:key).should have_step(:given, "second") - end - end - - describe Main, "#with_steps_for adding new steps" do - it_should_behave_like "the main object extended with Main" - - it "should result in a group containing pre-existing steps and newly defined steps" do - first_group = @main.steps_for(:key) do - Given("first") {} - end - second_group = @main.with_steps_for(:key) do - Given("second") {} - end - - second_group.should have_step(:given, "first") - second_group.should have_step(:given, "second") - end - - it "should not add its steps to the existing group" do - first_group = @main.steps_for(:key) do - Given("first") {} - end - second_group = @main.with_steps_for(:key) do - Given("second") {} - end - - first_group.should have_step(:given, "first") - first_group.should_not have_step(:given, "second") - end - end - - describe Main, "#with_steps_for running a story" do - it_should_behave_like "the main object extended with Main" - - before(:each) do - @runner = mock("runner") - @runner_step_group = StepGroup.new - @runner.stub!(:steps).and_return(@runner_step_group) - @runner.stub!(:run) - Spec::Story::Runner::PlainTextStoryRunner.stub!(:new).and_return(@runner) - end - - it "should create a PlainTextStoryRunner with a path" do - Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).with('path/to/file',{}).and_return(@runner) - @main.with_steps_for(:foo) do - run 'path/to/file' - end - end - - it "should create a PlainTextStoryRunner with a path and options" do - Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).with(anything,{:bar => :baz}).and_return(@runner) - @main.with_steps_for(:foo) do - run 'path/to/file', :bar => :baz - end - end - - it "should pass the group it creates to the runner's steps" do - steps = @main.steps_for(:ice_cream) do - Given("vanilla") {} - end - @main.with_steps_for(:ice_cream) do - run 'foo' - end - @runner_step_group.should have_step(:given, "vanilla") - end - - it "should run a story" do - @runner.should_receive(:run) - Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(@runner) - @main.with_steps_for(:foo) do - run 'path/to/file' - end - end - - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/extensions_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/extensions_spec.rb deleted file mode 100644 index 612ddc72f..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/extensions_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -require 'spec/story' - -describe Kernel, "#Story" do - before(:each) do - Kernel.stub!(:at_exit) - end - - it "should delegate to ::Spec::Story::Runner.story_runner" do - ::Spec::Story::Runner.story_runner.should_receive(:Story) - story = Story("title","narrative"){} - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/given_scenario_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/given_scenario_spec.rb deleted file mode 100644 index a688f88d5..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/given_scenario_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe GivenScenario do - it 'should execute a scenario from the current story in its world' do - # given - class MyWorld - attr :scenario_ran - end - instance = World.create(MyWorld) - scenario = ScenarioBuilder.new.to_scenario do - @scenario_ran = true - end - Runner::StoryRunner.should_receive(:scenario_from_current_story).with('scenario name').and_return(scenario) - - step = GivenScenario.new 'scenario name' - - # when - step.perform(instance, nil) - - # then - instance.scenario_ran.should be_true - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/plain_text_story_runner_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/runner/plain_text_story_runner_spec.rb deleted file mode 100644 index 1d5f2e0c3..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/plain_text_story_runner_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - describe PlainTextStoryRunner do - before(:each) do - StoryParser.stub!(:new).and_return(@parser = mock("parser")) - @parser.stub!(:parse).and_return([]) - File.stub!(:read).with("path").and_return("this\nand that") - end - - it "should provide access to steps" do - runner = PlainTextStoryRunner.new("path") - - runner.steps do |add| - add.given("baz") {} - end - - runner.steps.find(:given, "baz").should_not be_nil - end - - it "should parse a story file" do - runner = PlainTextStoryRunner.new("path") - - during { - runner.run - }.expect { - @parser.should_receive(:parse).with(["this", "and that"]) - } - end - - it "should build up a mediator with its own steps and the singleton story_runner" do - runner = PlainTextStoryRunner.new("path") - Spec::Story::Runner.should_receive(:story_runner).and_return(story_runner = mock("story runner")) - Spec::Story::Runner::StoryMediator.should_receive(:new).with(runner.steps, story_runner, {}). - and_return(mediator = stub("mediator", :run_stories => nil)) - runner.run - end - - it "should build up a parser with the mediator" do - runner = PlainTextStoryRunner.new("path") - Spec::Story::Runner.should_receive(:story_runner).and_return(story_runner = mock("story runner")) - Spec::Story::Runner::StoryMediator.should_receive(:new).and_return(mediator = stub("mediator", :run_stories => nil)) - Spec::Story::Runner::StoryParser.should_receive(:new).with(mediator).and_return(@parser) - runner.run - end - - it "should tell the mediator to run the stories" do - runner = PlainTextStoryRunner.new("path") - mediator = mock("mediator") - Spec::Story::Runner::StoryMediator.should_receive(:new).and_return(mediator) - mediator.should_receive(:run_stories) - runner.run - end - - it "should accept a block instead of a path" do - runner = PlainTextStoryRunner.new do |runner| - runner.load("path/to/story") - end - File.should_receive(:read).with("path/to/story").and_return("this\nand that") - runner.run - end - - it "should tell you if you try to run with no path set" do - runner = PlainTextStoryRunner.new - lambda { - runner.run - }.should raise_error(RuntimeError, "You must set a path to the file with the story. See the RDoc.") - end - - it "should pass options to the mediator" do - runner = PlainTextStoryRunner.new("path", :foo => :bar) - Spec::Story::Runner::StoryMediator.should_receive(:new). - with(anything, anything, :foo => :bar). - and_return(mediator = stub("mediator", :run_stories => nil)) - runner.run - end - - it "should provide access to its options" do - runner = PlainTextStoryRunner.new("path") - runner[:foo] = :bar - Spec::Story::Runner::StoryMediator.should_receive(:new). - with(anything, anything, :foo => :bar). - and_return(mediator = stub("mediator", :run_stories => nil)) - runner.run - end - - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/scenario_collector_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/runner/scenario_collector_spec.rb deleted file mode 100644 index 042c41e8d..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/scenario_collector_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - describe ScenarioCollector do - it 'should construct scenarios with the supplied story' do - # given - story = stub_everything('story') - scenario_collector = ScenarioCollector.new(story) - - # when - scenario_collector.Scenario 'scenario1' do end - scenario_collector.Scenario 'scenario2' do end - scenarios = scenario_collector.scenarios - - # then - scenario_collector.should have(2).scenarios - scenarios.first.name.should == 'scenario1' - scenarios.first.story.should equal(story) - scenarios.last.name.should == 'scenario2' - scenarios.last.story.should equal(story) - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/scenario_runner_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/runner/scenario_runner_spec.rb deleted file mode 100644 index a69ed4a99..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/scenario_runner_spec.rb +++ /dev/null @@ -1,142 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - describe ScenarioRunner do - it 'should run a scenario in its story' do - # given - world = stub_everything - scenario_runner = ScenarioRunner.new - $answer = nil - story = Story.new 'story', 'narrative' do - @answer = 42 # this should be available to the scenario - end - scenario = Scenario.new story, 'scenario' do - $answer = @answer - end - - # when - scenario_runner.run(scenario, world) - - # then - $answer.should == 42 - end - - it 'should allow scenarios to share methods' do - # given - world = stub_everything - $shared_invoked = 0 - story = Story.new 'story', 'narrative' do - def shared - $shared_invoked += 1 - end - end - scenario1 = Scenario.new story, 'scenario1' do - shared() - end - scenario2 = Scenario.new story, 'scenario2' do - shared() - end - scenario_runner = ScenarioRunner.new - - # when - scenario_runner.run(scenario1, world) - scenario_runner.run(scenario2, world) - - # then - $shared_invoked.should == 2 - end - - it 'should notify listeners when a scenario starts' do - # given - world = stub_everything - story = Story.new 'story', 'narrative' do end - scenario = Scenario.new story, 'scenario1' do - # succeeds - end - scenario_runner = ScenarioRunner.new - mock_listener1 = stub_everything('listener1') - mock_listener2 = stub_everything('listener2') - scenario_runner.add_listener(mock_listener1) - scenario_runner.add_listener(mock_listener2) - - # expect - mock_listener1.should_receive(:scenario_started).with('story', 'scenario1') - mock_listener2.should_receive(:scenario_started).with('story', 'scenario1') - - # when - scenario_runner.run(scenario, world) - - # then - end - - it 'should notify listeners when a scenario succeeds' do - # given - world = stub_everything('world') - story = Story.new 'story', 'narrative' do end - scenario = Scenario.new story, 'scenario1' do - # succeeds - end - scenario_runner = ScenarioRunner.new - mock_listener1 = stub_everything('listener1') - mock_listener2 = stub_everything('listener2') - scenario_runner.add_listener(mock_listener1) - scenario_runner.add_listener(mock_listener2) - - # expect - mock_listener1.should_receive(:scenario_succeeded).with('story', 'scenario1') - mock_listener2.should_receive(:scenario_succeeded).with('story', 'scenario1') - - # when - scenario_runner.run(scenario, world) - - # then - end - - it 'should notify listeners ONCE when a scenario raises an error' do - # given - error = RuntimeError.new('oops') - story = Story.new 'title', 'narrative' do end - scenario = Scenario.new story, 'scenario1' do - end - scenario_runner = ScenarioRunner.new - mock_listener = stub_everything('listener') - scenario_runner.add_listener(mock_listener) - world = stub_everything - - # expect - world.should_receive(:errors).twice.and_return([error, error]) - mock_listener.should_receive(:scenario_failed).with('title', 'scenario1', error).once - - # when - scenario_runner.run scenario, world - - # then - end - - it 'should notify listeners when a scenario is pending' do - # given - pending_error = Spec::Example::ExamplePendingError.new('todo') - story = Story.new 'title', 'narrative' do end - scenario = Scenario.new story, 'scenario1' do - end - scenario_runner = ScenarioRunner.new - mock_listener = mock('listener') - scenario_runner.add_listener(mock_listener) - world = stub_everything - - # expect - world.should_receive(:errors).twice.and_return([pending_error, pending_error]) - mock_listener.should_receive(:scenario_started).with('title', 'scenario1') - mock_listener.should_receive(:scenario_pending).with('title', 'scenario1', 'todo').once - - # when - scenario_runner.run scenario, world - - # then - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/story_mediator_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/runner/story_mediator_spec.rb deleted file mode 100644 index 4192e483a..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/story_mediator_spec.rb +++ /dev/null @@ -1,133 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - - describe StoryMediator do - before(:each) do - $story_mediator_spec_value = nil - @step_group = StepGroup.new - @step_group.create_matcher(:given, "given") { $story_mediator_spec_value = "given matched" } - @step_group.create_matcher(:when, "when") { $story_mediator_spec_value = "when matched" } - @step_group.create_matcher(:then, "then") { $story_mediator_spec_value = "then matched" } - - @scenario_runner = ScenarioRunner.new - @runner = StoryRunner.new @scenario_runner - @mediator = StoryMediator.new @step_group, @runner - end - - def run_stories - @mediator.run_stories - @runner.run_stories - end - - it "should have no stories" do - @mediator.stories.should be_empty - end - - it "should create two stories" do - @mediator.create_story "story title", "story narrative" - @mediator.create_story "story title 2", "story narrative 2" - run_stories - - @runner.should have(2).stories - @runner.stories.first.title.should == "story title" - @runner.stories.first.narrative.should == "story narrative" - @runner.stories.last.title.should == "story title 2" - @runner.stories.last.narrative.should == "story narrative 2" - end - - it "should create a scenario" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario name" - run_stories - - @runner.should have(1).scenarios - @runner.scenarios.first.name.should == "scenario name" - @runner.scenarios.first.story.should == @runner.stories.first - end - - it "should create a given scenario step if one matches" do - pending("need to untangle the dark mysteries of the story runner - something needs to get stubbed here") do - story = @mediator.create_story "title", "narrative" - @mediator.create_scenario "previous scenario" - @mediator.create_scenario "current scenario" - @mediator.create_given_scenario "previous scenario" - run_stories - - $story_mediator_spec_value.should == "previous scenario matched" - end - end - - it "should create a given step if one matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_given "given" - run_stories - - $story_mediator_spec_value.should == "given matched" - end - - it "should create a pending step if no given step matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_given "no match" - mock_listener = stub_everything("listener") - mock_listener.should_receive(:scenario_pending).with("title", "scenario", "Unimplemented step: no match") - @scenario_runner.add_listener mock_listener - run_stories - end - - it "should create a when step if one matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_when "when" - run_stories - - $story_mediator_spec_value.should == "when matched" - end - - it "should create a pending step if no when step matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_when "no match" - mock_listener = stub_everything("listener") - mock_listener.should_receive(:scenario_pending).with("title", "scenario", "Unimplemented step: no match") - @scenario_runner.add_listener mock_listener - run_stories - end - - it "should create a then step if one matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_then "then" - run_stories - - $story_mediator_spec_value.should == "then matched" - end - - it "should create a pending step if no 'then' step matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_then "no match" - mock_listener = stub_everything("listener") - mock_listener.should_receive(:scenario_pending).with("title", "scenario", "Unimplemented step: no match") - @scenario_runner.add_listener mock_listener - run_stories - end - - it "should pass options to the stories it creates" do - @mediator = StoryMediator.new @step_group, @runner, :foo => :bar - @mediator.create_story "story title", "story narrative" - - run_stories - - @runner.stories.first[:foo].should == :bar - end - - end - - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/story_parser_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/runner/story_parser_spec.rb deleted file mode 100644 index 5efc8fd18..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/story_parser_spec.rb +++ /dev/null @@ -1,384 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - - describe StoryParser do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - end - - it "should parse no lines" do - @parser.parse([]) - end - - it "should ignore text before the first Story: begins" do - @story_mediator.should_not_receive(:create_scenario) - @story_mediator.should_not_receive(:create_given) - @story_mediator.should_not_receive(:create_when) - @story_mediator.should_not_receive(:create_then) - @story_mediator.should_receive(:create_story).with("simple addition", "") - @parser.parse(["Here is a bunch of text", "about a calculator and all the things", "that it will do", "Story: simple addition"]) - end - - it "should create a story" do - @story_mediator.should_receive(:create_story).with("simple addition", "") - @parser.parse(["Story: simple addition"]) - end - - it "should create a story when line has leading spaces" do - @story_mediator.should_receive(:create_story).with("simple addition", "") - @parser.parse([" Story: simple addition"]) - end - - it "should add a one line narrative to the story" do - @story_mediator.should_receive(:create_story).with("simple addition","narrative") - @parser.parse(["Story: simple addition","narrative"]) - end - - it "should add a multi line narrative to the story" do - @story_mediator.should_receive(:create_story).with("simple addition","narrative line 1\nline 2\nline 3") - @parser.parse(["Story: simple addition","narrative line 1", "line 2", "line 3"]) - end - - it "should exclude blank lines from the narrative" do - @story_mediator.should_receive(:create_story).with("simple addition","narrative line 1\nline 2") - @parser.parse(["Story: simple addition","narrative line 1", "", "line 2"]) - end - - it "should exclude Scenario from the narrative" do - @story_mediator.should_receive(:create_story).with("simple addition","narrative line 1\nline 2") - @story_mediator.should_receive(:create_scenario) - @parser.parse(["Story: simple addition","narrative line 1", "line 2", "Scenario: add one plus one"]) - end - - end - - describe StoryParser, "in Story state" do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - @story_mediator.stub!(:create_story) - end - - it "should create a second Story for Story" do - @story_mediator.should_receive(:create_story).with("number two","") - @parser.parse(["Story: s", "Story: number two"]) - end - - it "should include And in the narrative" do - @story_mediator.should_receive(:create_story).with("s","And foo") - @story_mediator.should_receive(:create_scenario).with("bar") - @parser.parse(["Story: s", "And foo", "Scenario: bar"]) - end - - it "should create a Scenario for Scenario" do - @story_mediator.should_receive(:create_scenario).with("number two") - @parser.parse(["Story: s", "Scenario: number two"]) - end - - it "should include Given in the narrative" do - @story_mediator.should_receive(:create_story).with("s","Given foo") - @story_mediator.should_receive(:create_scenario).with("bar") - @parser.parse(["Story: s", "Given foo", "Scenario: bar"]) - end - - it "should include Given: in the narrative" do - @story_mediator.should_receive(:create_story).with("s","Given: foo") - @story_mediator.should_receive(:create_scenario).with("bar") - @parser.parse(["Story: s", "Given: foo", "Scenario: bar"]) - end - - it "should include When in the narrative" do - @story_mediator.should_receive(:create_story).with("s","When foo") - @story_mediator.should_receive(:create_scenario).with("bar") - @parser.parse(["Story: s", "When foo", "Scenario: bar"]) - end - - it "should include Then in the narrative" do - @story_mediator.should_receive(:create_story).with("s","Then foo") - @story_mediator.should_receive(:create_scenario).with("bar") - @parser.parse(["Story: s", "Then foo", "Scenario: bar"]) - end - - it "should include other in the story" do - @story_mediator.should_receive(:create_story).with("s","narrative") - @parser.parse(["Story: s", "narrative"]) - end - end - - describe StoryParser, "in Scenario state" do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - @story_mediator.stub!(:create_story) - @story_mediator.stub!(:create_scenario) - end - - it "should create a Story for Story" do - @story_mediator.should_receive(:create_story).with("number two","") - @parser.parse(["Story: s", "Scenario: s", "Story: number two"]) - end - - it "should create a Scenario for Scenario" do - @story_mediator.should_receive(:create_scenario).with("number two") - @parser.parse(["Story: s", "Scenario: s", "Scenario: number two"]) - end - - it "should raise for And" do - lambda { - @parser.parse(["Story: s", "Scenario: s", "And second"]) - }.should raise_error(IllegalStepError, /^Illegal attempt to create a And after a Scenario/) - end - - it "should create a Given for Given" do - @story_mediator.should_receive(:create_given).with("gift") - @parser.parse(["Story: s", "Scenario: s", "Given gift"]) - end - - it "should create a Given for Given:" do - @story_mediator.should_receive(:create_given).with("gift") - @parser.parse(["Story: s", "Scenario: s", "Given: gift"]) - end - - it "should create a GivenScenario for GivenScenario" do - @story_mediator.should_receive(:create_given_scenario).with("previous") - @parser.parse(["Story: s", "Scenario: s", "GivenScenario previous"]) - end - - it "should create a GivenScenario for GivenScenario:" do - @story_mediator.should_receive(:create_given_scenario).with("previous") - @parser.parse(["Story: s", "Scenario: s", "GivenScenario: previous"]) - end - - it "should transition to Given state after GivenScenario" do - @story_mediator.stub!(:create_given_scenario) - @parser.parse(["Story: s", "Scenario: s", "GivenScenario previous"]) - @parser.instance_eval{@state}.should be_an_instance_of(StoryParser::GivenState) - end - - it "should transition to Given state after GivenScenario:" do - @story_mediator.stub!(:create_given_scenario) - @parser.parse(["Story: s", "Scenario: s", "GivenScenario: previous"]) - @parser.instance_eval{@state}.should be_an_instance_of(StoryParser::GivenState) - end - - it "should create a When for When" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "When ever"]) - end - - it "should create a When for When:" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "When: ever"]) - end - - it "should create a Then for Then" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Then and there"]) - end - - it "should create a Then for Then:" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Then: and there"]) - end - - it "should ignore other" do - @parser.parse(["Story: s", "Scenario: s", "this is ignored"]) - end - end - - describe StoryParser, "in Given state" do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - @story_mediator.stub!(:create_story) - @story_mediator.stub!(:create_scenario) - @story_mediator.should_receive(:create_given).with("first") - end - - it "should create a Story for Story" do - @story_mediator.should_receive(:create_story).with("number two","") - @parser.parse(["Story: s", "Scenario: s", "Given first", "Story: number two"]) - end - - it "should create a Scenario for Scenario" do - @story_mediator.should_receive(:create_scenario).with("number two") - @parser.parse(["Story: s", "Scenario: s", "Given first", "Scenario: number two"]) - end - - it "should create a second Given for Given" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given first", "Given second"]) - end - - it "should create a second Given for And" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "And second"]) - end - - it "should create a second Given for And:" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given first", "And: second"]) - end - - it "should create a When for When" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When ever"]) - end - - it "should create a When for When:" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When: ever"]) - end - - it "should create a Then for Then" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given first", "Then and there"]) - end - - it "should create a Then for Then:" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given first", "Then: and there"]) - end - - it "should ignore other" do - @parser.parse(["Story: s", "Scenario: s", "Given first", "this is ignored"]) - end - end - - describe StoryParser, "in When state" do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - @story_mediator.stub!(:create_story) - @story_mediator.stub!(:create_scenario) - @story_mediator.should_receive(:create_given).with("first") - @story_mediator.should_receive(:create_when).with("else") - end - - it "should create a Story for Story" do - @story_mediator.should_receive(:create_story).with("number two","") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When: else", "Story: number two"]) - end - - it "should create a Scenario for Scenario" do - @story_mediator.should_receive(:create_scenario).with("number two") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Scenario: number two"]) - end - - it "should create Given for Given" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Given second"]) - end - - it "should create Given for Given:" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Given: second"]) - end - - it "should create a second When for When" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "When ever"]) - end - - it "should create a second When for When:" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "When: ever"]) - end - - it "should create a second When for And" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "And ever"]) - end - - it "should create a second When for And:" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "And: ever"]) - end - - it "should create a Then for Then" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then and there"]) - end - - it "should create a Then for Then:" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: and there"]) - end - - it "should ignore other" do - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "this is ignored"]) - end - end - - describe StoryParser, "in Then state" do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - @story_mediator.stub!(:create_story) - @story_mediator.stub!(:create_scenario) - @story_mediator.should_receive(:create_given).with("first") - @story_mediator.should_receive(:create_when).with("else") - @story_mediator.should_receive(:create_then).with("what") - end - - it "should create a Story for Story" do - @story_mediator.should_receive(:create_story).with("number two","") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Story: number two"]) - end - - it "should create a Scenario for Scenario" do - @story_mediator.should_receive(:create_scenario).with("number two") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Scenario: number two"]) - end - - it "should create Given for Given" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Given second"]) - end - - it "should create Given for Given:" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "Given: second"]) - end - - it "should create When for When" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "When ever"]) - end - - it "should create When for When:" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "When: ever"]) - end - - it "should create a Then for Then" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Then and there"]) - end - - it "should create a Then for Then:" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "Then: and there"]) - end - - it "should create a second Then for And" do - @story_mediator.should_receive(:create_then).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "And ever"]) - end - - it "should create a second Then for And:" do - @story_mediator.should_receive(:create_then).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "And: ever"]) - end - - it "should ignore other" do - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "this is ignored"]) - end - end - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/story_runner_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/runner/story_runner_spec.rb deleted file mode 100644 index 0fc46405a..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/runner/story_runner_spec.rb +++ /dev/null @@ -1,256 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - describe StoryRunner do - it 'should collect all the stories' do - # given - story_runner = StoryRunner.new(stub('scenario_runner')) - - # when - story_runner.Story 'title1', 'narrative1' do end - story_runner.Story 'title2', 'narrative2' do end - stories = story_runner.stories - - # then - story_runner.should have(2).stories - stories.first.title.should == 'title1' - stories.first.narrative.should == 'narrative1' - stories.last.title.should == 'title2' - stories.last.narrative.should == 'narrative2' - end - - it 'should gather all the scenarios in the stories' do - # given - story_runner = StoryRunner.new(stub('scenario_runner')) - - # when - story_runner.Story "story1", "narrative1" do - Scenario "scenario1" do end - Scenario "scenario2" do end - end - story_runner.Story "story2", "narrative2" do - Scenario "scenario3" do end - end - scenarios = story_runner.scenarios - - # then - story_runner.should have(3).scenarios - scenarios[0].name.should == 'scenario1' - scenarios[1].name.should == 'scenario2' - scenarios[2].name.should == 'scenario3' - end - - # captures worlds passed into a ScenarioRunner - class ScenarioWorldCatcher - attr_accessor :worlds - def run(scenario, world) - (@worlds ||= []) << world - end - end - - it 'should run each scenario in a separate object' do - # given - scenario_world_catcher = ScenarioWorldCatcher.new - story_runner = StoryRunner.new(scenario_world_catcher) - story_runner.Story 'story', 'narrative' do - Scenario 'scenario1' do end - Scenario 'scenario2' do end - end - - # when - story_runner.run_stories - - # then - worlds = scenario_world_catcher.worlds - scenario_world_catcher.should have(2).worlds - worlds[0].should_not == worlds[1] - end - - it 'should use the provided world creator to create worlds' do - # given - stub_scenario_runner = stub_everything - mock_world_creator = mock('world creator') - story_runner = StoryRunner.new(stub_scenario_runner, mock_world_creator) - story_runner.Story 'story', 'narrative' do - Scenario 'scenario1' do end - Scenario 'scenario2' do end - end - - # expect - mock_world_creator.should_receive(:create).twice - - # when - story_runner.run_stories - - # then - end - - it 'should notify listeners of the scenario count when the run starts' do - # given - story_runner = StoryRunner.new(stub_everything) - mock_listener1 = stub_everything('listener1') - mock_listener2 = stub_everything('listener2') - story_runner.add_listener(mock_listener1) - story_runner.add_listener(mock_listener2) - - story_runner.Story 'story1', 'narrative1' do - Scenario 'scenario1' do end - end - story_runner.Story 'story2', 'narrative2' do - Scenario 'scenario2' do end - Scenario 'scenario3' do end - end - - # expect - mock_listener1.should_receive(:run_started).with(3) - mock_listener2.should_receive(:run_started).with(3) - - # when - story_runner.run_stories - - # then - end - - it 'should notify listeners when a story starts' do - # given - story_runner = StoryRunner.new(stub_everything) - mock_listener1 = stub_everything('listener1') - mock_listener2 = stub_everything('listener2') - story_runner.add_listener(mock_listener1) - story_runner.add_listener(mock_listener2) - - story_runner.Story 'story1', 'narrative1' do - Scenario 'scenario1' do end - end - story_runner.Story 'story2', 'narrative2' do - Scenario 'scenario2' do end - Scenario 'scenario3' do end - end - - # expect - mock_listener1.should_receive(:story_started).with('story1', 'narrative1') - mock_listener1.should_receive(:story_ended).with('story1', 'narrative1') - mock_listener2.should_receive(:story_started).with('story2', 'narrative2') - mock_listener2.should_receive(:story_ended).with('story2', 'narrative2') - - # when - story_runner.run_stories - - # then - end - - it 'should notify listeners when the run ends' do - # given - story_runner = StoryRunner.new(stub_everything) - mock_listener1 = stub_everything('listener1') - mock_listener2 = stub_everything('listener2') - story_runner.add_listener mock_listener1 - story_runner.add_listener mock_listener2 - story_runner.Story 'story1', 'narrative1' do - Scenario 'scenario1' do end - end - - # expect - mock_listener1.should_receive(:run_ended) - mock_listener2.should_receive(:run_ended) - - # when - story_runner.run_stories - - # then - end - - it 'should run a story in an instance of a specified class' do - # given - scenario_world_catcher = ScenarioWorldCatcher.new - story_runner = StoryRunner.new(scenario_world_catcher) - story_runner.Story 'title', 'narrative', :type => String do - Scenario 'scenario' do end - end - - # when - story_runner.run_stories - - # then - scenario_world_catcher.worlds[0].should be_kind_of(String) - scenario_world_catcher.worlds[0].should be_kind_of(World) - end - - it 'should pass initialization params through to the constructed instance' do - # given - scenario_world_catcher = ScenarioWorldCatcher.new - story_runner = StoryRunner.new(scenario_world_catcher) - story_runner.Story 'title', 'narrative', :type => Array, :args => [3] do - Scenario 'scenario' do end - end - - # when - story_runner.run_stories - - # then - scenario_world_catcher.worlds[0].should be_kind_of(Array) - scenario_world_catcher.worlds[0].size.should == 3 - end - - it 'should find a scenario in the current story by name' do - # given - story_runner = StoryRunner.new(ScenarioRunner.new) - $scenario = nil - - story_runner.Story 'title', 'narrative' do - Scenario 'first scenario' do - end - Scenario 'second scenario' do - $scenario = StoryRunner.scenario_from_current_story 'first scenario' - end - end - - # when - story_runner.run_stories - - # then - $scenario.name.should == 'first scenario' - end - - it "should clean the steps between stories" do - #given - story_runner = StoryRunner.new(ScenarioRunner.new) - result = mock 'result' - - step1 = Step.new('step') do - result.one - end - steps1 = StepGroup.new - steps1.add :when, step1 - - story_runner.Story 'title', 'narrative', :steps => steps1 do - Scenario 'first scenario' do - When 'step' - end - end - - step2 = Step.new('step') do - result.two - end - steps2 = StepGroup.new - steps2.add :when, step2 - - story_runner.Story 'title2', 'narrative', :steps => steps2 do - Scenario 'second scenario' do - When 'step' - end - end - - #then - result.should_receive(:one) - result.should_receive(:two) - - #when - story_runner.run_stories - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/runner_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/runner_spec.rb deleted file mode 100644 index 81e852640..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/runner_spec.rb +++ /dev/null @@ -1,106 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe Runner, "module" do - def dev_null - io = StringIO.new - def io.write(str) - str.to_s.size - end - return io - end - - before :each do - Kernel.stub!(:at_exit) - @stdout, $stdout = $stdout, dev_null - @argv = Array.new(ARGV) - @runner_module = Runner.dup - @world_creator = World.dup - @runner_module.module_eval { @run_options = @story_runner = @scenario_runner = @world_creator = nil } - end - - after :each do - $stdout = @stdout - ARGV.replace @argv - @runner_module.module_eval { @run_options = @story_runner = @scenario_runner = @world_creator = nil } - end - - it 'should wire up a singleton StoryRunner' do - @runner_module.story_runner.should_not be_nil - end - - it 'should set its options based on ARGV' do - # given - ARGV << '--dry-run' - - # when - options = @runner_module.run_options - - # then - options.dry_run.should be_true - end - - it 'should add a reporter to the runner classes' do - # given - story_runner = mock('story runner', :null_object => true) - scenario_runner = mock('scenario runner', :null_object => true) - world_creator = mock('world', :null_object => true) - - @runner_module::class_eval { @world_creator = world_creator } - @runner_module::StoryRunner.stub!(:new).and_return(story_runner) - @runner_module::ScenarioRunner.stub!(:new).and_return(scenario_runner) - - # expect - world_creator.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter)) - story_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter)) - scenario_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter)) - - # when - @runner_module.story_runner - end - - it 'should add a documenter to the runner classes if one is specified' do - # given - ARGV << "--format" << "html" - story_runner = mock('story runner', :null_object => true) - scenario_runner = mock('scenario runner', :null_object => true) - world_creator = mock('world', :null_object => true) - - @runner_module::class_eval { @world_creator = world_creator } - @runner_module::StoryRunner.stub!(:new).and_return(story_runner) - @runner_module::ScenarioRunner.stub!(:new).and_return(scenario_runner) - - # expect - world_creator.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter)) - story_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter)) - scenario_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter)) - - # when - @runner_module.story_runner - end - - it 'should add any registered listener to the runner classes' do - # given - ARGV << "--format" << "html" - story_runner = mock('story runner', :null_object => true) - scenario_runner = mock('scenario runner', :null_object => true) - world_creator = mock('world', :null_object => true) - - @runner_module::class_eval { @world_creator = world_creator } - @runner_module::StoryRunner.stub!(:new).and_return(story_runner) - @runner_module::ScenarioRunner.stub!(:new).and_return(scenario_runner) - - listener = Object.new - - # expect - world_creator.should_receive(:add_listener).with(listener) - story_runner.should_receive(:add_listener).with(listener) - scenario_runner.should_receive(:add_listener).with(listener) - - # when - @runner_module.register_listener listener - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/scenario_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/scenario_spec.rb deleted file mode 100644 index 0cf7aff30..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/scenario_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe Scenario do - it 'should not raise an error if no body is supplied' do - # given - story = StoryBuilder.new.to_story - - # when - error = exception_from do - Scenario.new story, 'name' - end - - # then - error.should be_nil - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/step_group_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/step_group_spec.rb deleted file mode 100644 index dd28bfa26..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/step_group_spec.rb +++ /dev/null @@ -1,157 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe StepGroup do - before(:each) do - @step_group = StepGroup.new - end - - it "should not find a matcher if empty" do - @step_group.find(:given, "this and that").should be_nil - end - - it "should create a given_scenario matcher" do - step = @step_group.given_scenario("this and that") {} - @step_group.find(:given_scenario, "this and that").should_not be_nil - @step_group.find(:given_scenario, "this and that").should equal(step) - end - - it "should create a given matcher" do - step = @step_group.given("this and that") {} - @step_group.find(:given, "this and that").should equal(step) - end - - it "should create a when matcher" do - step = @step_group.when("this and that") {} - @step_group.find(:when, "this and that").should equal(step) - end - - it "should create a them matcher" do - step = @step_group.then("this and that") {} - @step_group.find(:then, "this and that").should equal(step) - end - - it "should add a matcher object" do - step = Step.new("this and that") {} - @step_group.add(:given, step) - @step_group.find(:given, "this and that").should equal(step) - end - - it "should add it matchers to another StepGroup (with one given)" do - source = StepGroup.new - target = StepGroup.new - step = source.given("this and that") {} - source.add_to target - target.find(:given, "this and that").should equal(step) - end - - it "should add it matchers to another StepGroup (with some of each type)" do - source = StepGroup.new - target = StepGroup.new - given_scenario = source.given_scenario("1") {} - given = source.given("1") {} - when1 = source.when("1") {} - when2 = source.when("2") {} - then1 = source.then("1") {} - then2 = source.then("2") {} - then3 = source.then("3") {} - source.add_to target - target.find(:given_scenario, "1").should equal(given_scenario) - target.find(:given, "1").should equal(given) - target.find(:when, "1").should equal(when1) - target.find(:when, "2").should equal(when2) - target.find(:then, "1").should equal(then1) - target.find(:then, "2").should equal(then2) - target.find(:then, "3").should equal(then3) - end - - it "should append another collection" do - matchers_to_append = StepGroup.new - step = matchers_to_append.given("this and that") {} - @step_group << matchers_to_append - @step_group.find(:given, "this and that").should equal(step) - end - - it "should append several other collections" do - matchers_to_append = StepGroup.new - more_matchers_to_append = StepGroup.new - first_matcher = matchers_to_append.given("this and that") {} - second_matcher = more_matchers_to_append.given("and the other") {} - @step_group << matchers_to_append - @step_group << more_matchers_to_append - @step_group.find(:given, "this and that").should equal(first_matcher) - @step_group.find(:given, "and the other").should equal(second_matcher) - end - - it "should yield itself on initialization" do - begin - $step_group_spec_step = nil - matchers = StepGroup.new do |matchers| - $step_group_spec_step = matchers.given("foo") {} - end - $step_group_spec_step.matches?("foo").should be_true - ensure - $step_group_spec_step = nil - end - end - - it "should support defaults" do - class StepGroupSubclass < StepGroup - steps do |add| - add.given("foo") {} - end - end - StepGroupSubclass.new.find(:given, "foo").should_not be_nil - end - - it "should create a Given" do - sub = Class.new(StepGroup).new - step = sub.Given("foo") {} - sub.find(:given, "foo").should == step - end - - it "should create a When" do - sub = Class.new(StepGroup).new - step = sub.When("foo") {} - sub.find(:when, "foo").should == step - end - - it "should create a Then" do - sub = Class.new(StepGroup).new - step = sub.Then("foo") {} - sub.find(:then, "foo").should == step - end - - it "should create steps in a block" do - sub = Class.new(StepGroup).new do - Given("a given") {} - When("a when") {} - Then("a then") {} - end - sub.find(:given, "a given").should_not be_nil - sub.find(:when, "a when").should_not be_nil - sub.find(:then, "a then").should_not be_nil - end - - it "should clear itself" do - step = @step_group.given("this and that") {} - @step_group.clear - @step_group.find(:given, "this and that").should be_nil - end - - it "should tell you when it is empty" do - @step_group.should be_empty - end - - it "should tell you when it is not empty" do - @step_group.given("this and that") {} - @step_group.should_not be_empty - end - - it "should handle << nil" do - @step_group << nil - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/step_mother_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/step_mother_spec.rb deleted file mode 100644 index 64efd7a6a..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/step_mother_spec.rb +++ /dev/null @@ -1,72 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe StepMother do - it 'should store a step by name and type' do - # given - step_mother = StepMother.new - step = Step.new("a given", &lambda {}) - step_mother.store(:given, step) - - # when - found = step_mother.find(:given, "a given") - - # then - found.should == step - end - - it 'should NOT raise an error if a step is missing' do - # given - step_mother = StepMother.new - - # then - lambda do - # when - step_mother.find(:given, "doesn't exist") - end.should_not raise_error - end - - it "should create a default step which raises a pending error" do - # given - step_mother = StepMother.new - - # when - step = step_mother.find(:given, "doesn't exist") - - # then - step.should be_an_instance_of(Step) - - lambda do - step.perform(Object.new, "doesn't exist") - end.should raise_error(Spec::Example::ExamplePendingError, /Unimplemented/) - end - - it 'should clear itself' do - # given - step_mother = StepMother.new - step = Step.new("a given") do end - step_mother.store(:given, step) - - # when - step_mother.clear - - # then - step_mother.should be_empty - end - - it "should use assigned steps" do - step_mother = StepMother.new - - step = Step.new('step') {} - step_group = StepGroup.new - step_group.add(:given, step) - - step_mother.use(step_group) - - step_mother.find(:given, "step").should equal(step) - end - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/step_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/step_spec.rb deleted file mode 100644 index ec6628809..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/step_spec.rb +++ /dev/null @@ -1,178 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe Step, "matching" do - it "should match a text string" do - step = Step.new("this text") {} - step.matches?("this text").should be_true - end - - it "should not match a text string that does not start the same" do - step = Step.new("this text") {} - step.matches?("Xthis text").should be_false - end - - it "should not match a text string that does not end the same" do - step = Step.new("this text") {} - step.matches?("this textX").should be_false - end - - it "should match a text string with a param" do - step = Step.new("this $param text") {} - step.matches?("this anything text").should be_true - end - - it "should not be greedy" do - step = Step.new("enter $value for $key") {} - step.parse_args("enter 3 for keys for a piano").should == ['3','keys for a piano'] - end - - it "should match a text string with 3 params" do - step = Step.new("1 $one 2 $two 3 $three 4") {} - step.matches?("1 a 2 b 3 c 4").should be_true - end - - it "should match a text string with a param at the beginning" do - step = Step.new("$one 2 3") {} - step.matches?("a 2 3").should be_true - end - - it "should match a text string with a param at the end" do - step = Step.new("1 2 $three") {} - step.matches?("1 2 c").should be_true - end - - it "should not match a different string" do - step = Step.new("this text") {} - step.matches?("other text").should be_false - end - - it "should match a regexp" do - step = Step.new(/this text/) {} - step.matches?("this text").should be_true - end - - it "should match a regexp with a match group" do - step = Step.new(/this (.*) text/) {} - step.matches?("this anything text").should be_true - end - - it "should not match a non matching regexp" do - step = Step.new(/this (.*) text/) {} - step.matches?("other anything text").should be_false - end - - it "should not get bogged down by parens in strings" do - step = Step.new("before () after") {} - step.matches?("before () after").should be_true - end - - it "should match any option of an alteration" do - step = Step.new(/(he|she) is cool/) {} - step.matches?("he is cool").should be_true - step.matches?("she is cool").should be_true - end - - it "should match alteration as well as a variable" do - step = Step.new(/(he|she) is (.*)/) {} - step.matches?("he is cool").should be_true - step.parse_args("he is cool").should == ['he', 'cool'] - end - - end - - describe Step do - it "should make complain with no block" do - lambda { - step = Step.new("foo") - }.should raise_error - end - - it "should perform itself on an object" do - # given - $instance = nil - step = Step.new 'step' do - $instance = self - end - instance = Object.new - - # when - step.perform(instance, "step") - - # then - $instance.should == instance - end - - it "should perform itself with one parameter with match expression" do - # given - $result = nil - step = Step.new 'an account with $count dollars' do |count| - $result = count - end - instance = Object.new - - # when - args = step.parse_args("an account with 3 dollars") - step.perform(instance, *args) - - # then - $result.should == "3" - end - - it "should perform itself with one parameter without a match expression" do - # given - $result = nil - step = Step.new 'an account with a balance of' do |amount| - $result = amount - end - instance = Object.new - - # when - step.perform(instance, 20) - - # then - $result.should == 20 - end - - it "should perform itself with 2 parameters" do - # given - $account_type = nil - $amount = nil - step = Step.new 'a $account_type account with $amount dollars' do |account_type, amount| - $account_type = account_type - $amount = amount - end - instance = Object.new - - # when - args = step.parse_args("a savings account with 3 dollars") - step.perform(instance, *args) - - # then - $account_type.should == "savings" - $amount.should == "3" - end - - it "should perform itself when defined with a regexp with 2 parameters" do - # given - $pronoun = nil - $adjective = nil - step = Step.new /(he|she) is (.*)/ do |pronoun, adjective| - $pronoun = pronoun - $adjective = adjective - end - instance = Object.new - - # when - args = step.parse_args("he is cool") - step.perform(instance, *args) - - # then - $pronoun.should == "he" - $adjective.should == "cool" - end - - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/story_helper.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/story_helper.rb deleted file mode 100644 index bb906f255..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/story_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' -require File.dirname(__FILE__) + '/builders' diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/story_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/story_spec.rb deleted file mode 100644 index 21257e9a7..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/story_spec.rb +++ /dev/null @@ -1,86 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe Story do - it 'should run itself in a given object' do - # given - $instance = nil - story = Story.new 'title', 'narrative' do - $instance = self - end - object = Object.new - - # when - story.run_in(object) - - # then - $instance.should be(object) - end - - it 'should not raise an error if no block is supplied' do - # when - error = exception_from do - Story.new 'title', 'narrative' - end - - # then - error.should be_nil - end - - it "should raise when error raised running in another object" do - #given - story = Story.new 'title', 'narrative' do - raise "this is raised in the story" - end - object = Object.new - - # when/then - lambda do - story.run_in(object) - end.should raise_error - end - - it "should use the steps it is told to using a StepGroup" do - story = Story.new("title", "narrative", :steps => steps = StepGroup.new) do end - assignee = mock("assignee") - assignee.should_receive(:use).with(steps) - story.assign_steps_to(assignee) - end - - it "should use the steps it is told to using a key" do - begin - orig_rspec_story_steps = $rspec_story_steps - $rspec_story_steps = StepGroupHash.new - $rspec_story_steps[:foo] = steps = Object.new - - story = Story.new("title", "narrative", :steps_for => :foo) do end - assignee = mock("assignee") - - assignee.should_receive(:use).with(steps) - story.assign_steps_to(assignee) - ensure - $rspec_story_steps = orig_rspec_story_steps - end - end - - it "should use the steps it is told to using multiple keys" do - begin - orig_rspec_story_steps = $rspec_story_steps - $rspec_story_steps = StepGroupHash.new - $rspec_story_steps[:foo] = foo_steps = Object.new - $rspec_story_steps[:bar] = bar_steps = Object.new - - story = Story.new("title", "narrative", :steps_for => [:foo, :bar]) do end - assignee = mock("assignee") - - assignee.should_receive(:use).with(foo_steps) - assignee.should_receive(:use).with(bar_steps) - story.assign_steps_to(assignee) - ensure - $rspec_story_steps = orig_rspec_story_steps - end - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/story/world_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/story/world_spec.rb deleted file mode 100644 index 85410f612..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/story/world_spec.rb +++ /dev/null @@ -1,416 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -require 'spec/story' - -module Spec - module Story - describe World do - before :each do - World.listeners.clear - end - - after :each do - World.listeners.clear - World.step_mother.clear - end - - it 'should create an object that mixes in a World' do - # when - obj = World::create - - # then - obj.should be_kind_of(World) - end - - it 'should create a World from any object type' do - # when - obj = World::create String - - # then - obj.should be_kind_of(String) - obj.should be_kind_of(World) - end - - it 'should pass arguments to #new when creating an object of a specified type that mixes in a world' do - # given - Thing = Struct.new(:name, :age) - - # when - obj = World::create Thing, "David", "I'm not telling" - - # then - obj.should be_an_instance_of(Thing) - obj.name.should == "David" - obj.age.should == "I'm not telling" - obj.should be_kind_of(World) - end - - def ensure_world_executes_step(&block) - # given - obj = World::create - $step_ran = false - - # when - obj.instance_eval(&block) - - # then - $step_ran.should be_true - end - - it 'should execute a Given, When or Then step' do - ensure_world_executes_step do - Given 'a given' do - $step_ran = true - end - end - - ensure_world_executes_step do - When 'an event' do - $step_ran = true - end - end - - ensure_world_executes_step do - Then 'an outcome' do - $step_ran = true - end - end - end - - it 'should interpret Given... And... as multiple givens' do - # given - world = World.create - $steps = [] - - # when - world.instance_eval do - Given 'step 1' do - $steps << 1 - end - And 'step 2' do - $steps << 2 - end - end - - # then - $steps.should == [1,2] - World.step_mother.find(:given, 'step 1').should_not be_nil - World.step_mother.find(:given, 'step 2').should_not be_nil - end - - it 'should interpret When... And... as multiple events' do - # given - world = World.create - $steps = [] - - # when - world.instance_eval do - When 'step 1' do - $steps << 1 - end - And 'step 2' do - $steps << 2 - end - end - - # then - $steps.should == [1,2] - World.step_mother.find(:when, 'step 1').should_not be_nil - World.step_mother.find(:when, 'step 2').should_not be_nil - end - - it 'should interpret Then... And... as multiple outcomes' do - # given - world = World.create - $steps = [] - - # when - world.instance_eval do - Then 'step 1' do - $steps << 1 - end - And 'step 2' do - $steps << 2 - end - end - - # then - $steps.should == [1,2] - World.step_mother.find(:then, 'step 1').should_not be_nil - World.step_mother.find(:then, 'step 2').should_not be_nil - end - - it 'should reuse a given across scenarios' do - # given - $num_invoked = 0 - a_world = World::create - a_world.instance_eval do - Given 'a given' do - $num_invoked += 1 - end - end - another_world = World::create - - # when - another_world.instance_eval do - Given 'a given' # without a body - end - - # then - $num_invoked.should == 2 - end - - it 'should reuse an event across scenarios' do - # given - $num_invoked = 0 - a_world = World::create - a_world.instance_eval do - When 'an event' do - $num_invoked += 1 - end - end - - another_world = World::create - - # when - another_world.instance_eval do - When 'an event' # without a body - end - - # then - $num_invoked.should == 2 - end - - it 'should reuse an outcome across scenarios' do - # given - $num_invoked = 0 - a_world = World::create - a_world.instance_eval do - Then 'an outcome' do - $num_invoked += 1 - end - end - - another_world = World::create - - # when - another_world.instance_eval do - Then 'an outcome' # without a body - end - - # then - $num_invoked.should == 2 - end - - it 'should preserve instance variables between steps within a scenario' do - # given - world = World::create - $first = nil - $second = nil - - # when - world.instance_eval do - Given 'given' do - @first = 'first' - end - When 'event' do - @second = @first # from given - end - Then 'outcome' do - $first = @first # from given - $second = @second # from event - end - end - - # then - $first.should == 'first' - $second.should == 'first' - end - - it 'should invoke a reused step in the new object instance' do - # given - $instances = [] - $debug = true - world1 = World.create - world1.instance_eval do - Given 'a given' do - $instances << self.__id__ - end - end - world2 = World.create - - # when - world2.instance_eval do - Given 'a given' # reused - Then 'an outcome' do - $instances << __id__ - end - end - $debug = false - # then - $instances.should == [ world1.__id__, world2.__id__, world2.__id__ ] - end - - def ensure_world_collects_error(expected_error, &block) - # given - world = World.create - # $error = nil - - # when - world.start_collecting_errors - world.instance_eval(&block) - - # then - world.should have(1).errors - world.errors[0].should be_kind_of(expected_error) - end - - it 'should collect a failure from a Given step' do - ensure_world_collects_error RuntimeError do - Given 'a given' do - raise RuntimeError, "oops" - end - end - end - - it 'should collect a failure from a When step' do - ensure_world_collects_error RuntimeError do - When 'an event' do - raise RuntimeError, "oops" - end - end - end - - it 'should collect a failure from a Then step' do - ensure_world_collects_error RuntimeError do - Then 'an outcome' do - raise RuntimeError, "oops" - end - end - end - - it 'should inform listeners when it runs a Given, When or Then step' do - # given - world = World.create - mock_listener1 = mock('listener1') - mock_listener2 = mock('listener2') - World.add_listener(mock_listener1) - World.add_listener(mock_listener2) - - # expect - mock_listener1.should_receive(:step_succeeded).with(:given, 'a context') - mock_listener1.should_receive(:step_succeeded).with(:when, 'an event') - mock_listener1.should_receive(:step_succeeded).with(:then, 'an outcome') - - mock_listener2.should_receive(:step_succeeded).with(:given, 'a context') - mock_listener2.should_receive(:step_succeeded).with(:when, 'an event') - mock_listener2.should_receive(:step_succeeded).with(:then, 'an outcome') - - # when - world.instance_eval do - Given 'a context' do end - When 'an event' do end - Then 'an outcome' do end - end - - # then - end - - it 'should tell listeners but not execute the step in dry-run mode' do - # given - Runner.stub!(:dry_run).and_return(true) - mock_listener = mock('listener') - World.add_listener(mock_listener) - $step_invoked = false - world = World.create - - # expect - mock_listener.should_receive(:step_succeeded).with(:given, 'a context') - - # when - world.instance_eval do - Given 'a context' do - $step_invoked = true - end - end - - # then - $step_invoked.should be(false) - end - - it 'should suppress listeners while it runs a GivenScenario' do - # given - $scenario_ran = false - - scenario = ScenarioBuilder.new.name('a scenario').to_scenario do - $scenario_ran = true - Given 'given' do end - When 'event' do end - Then 'outcome' do end - end - - given_scenario = GivenScenario.new('a scenario') - Runner::StoryRunner.should_receive(:scenario_from_current_story). - with('a scenario').and_return(scenario) - - world = World.create - listener = mock('listener') - World.add_listener(listener) - - # expect - listener.should_receive(:found_scenario).with(:'given scenario', 'a scenario') - listener.should_receive(:step_succeeded).never.with(:given, 'given') - listener.should_receive(:step_succeeded).never.with(:when, 'event') - listener.should_receive(:step_succeeded).never.with(:then, 'outcome') - - # when - world.GivenScenario 'a scenario' - - # then - $scenario_ran.should be_true - end - - it 'should interpret GivenScenario... And... as multiple givens' do - # given - world = World.create - $steps = [] - - scenario = ScenarioBuilder.new.name('a scenario').to_scenario do - $steps << 1 - end - Runner::StoryRunner.should_receive(:scenario_from_current_story). - with('a scenario').and_return(scenario) - - # when - world.instance_eval do - GivenScenario 'a scenario' - And 'step 2' do - $steps << 2 - end - end - - # then - $steps.should == [1,2] - World.step_mother.find(:given, 'step 2').should_not be_nil - end - - it 'should provide rspec matchers' do - # given - world = World.create - - # then - world.instance_eval do - 'hello'.should match(/^hello$/) - end - end - - it "should use assigned matchers" do - world = World.create - - World.should_receive(:use).with(steps = Object.new) - - World.use(steps) - end - end - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec/translator_spec.rb b/vendor/gems/rspec-1.1.2/spec/spec/translator_spec.rb deleted file mode 100644 index 01293d9ee..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec/translator_spec.rb +++ /dev/null @@ -1,265 +0,0 @@ -require File.dirname(__FILE__) + '/../spec_helper.rb' -require 'spec/translator' - -describe "Translator" do - before do - @t = Spec::Translator.new - end - - it "should translate files" do - from = File.dirname(__FILE__) + '/..' - to = "#{Dir.tmpdir}/translated_specs" - @t.translate_dir(from, to) - end - - it "should translate context_setup do" do - @t.translate_line( - "context_setup do\n" - ).should eql( - "before(:all) do\n" - ) - end - - it "should translate context_setup {foo}" do - @t.translate_line( - "context_setup {foo}\n" - ).should eql( - "before(:all) {foo}\n" - ) - end - - it "should translate context ' to describe '" do - @t.translate_line( - "context 'Translator' do\n" - ).should eql( - "describe 'Translator' do\n" - ) - end - - it 'should translate context " to describe "' do - @t.translate_line( - 'context "Translator"' - ).should eql( - 'describe "Translator"' - ) - end - - it 'should translate spaces then context " to describe "' do - @t.translate_line( - ' context "Translator"' - ).should eql( - ' describe "Translator"' - ) - end - - it "should not translate context=foo" do - @t.translate_line(' context=foo').should eql(' context=foo') - end - - it "should not translate context = foo" do - @t.translate_line(' context = foo').should eql(' context = foo') - end - - it "should not translate context = foo" do - @t.translate_line(' context = foo').should eql(' context = foo') - end - - it "should translate should_be_close" do - @t.translate_line('5.0.should_be_close(5.0, 0.5)').should eql('5.0.should be_close(5.0, 0.5)') - end - - it "should translate should_not_raise" do - @t.translate_line('lambda { self.call }.should_not_raise').should eql('lambda { self.call }.should_not raise_error') - end - - it "should translate should_throw" do - @t.translate_line('lambda { self.call }.should_throw').should eql('lambda { self.call }.should throw_symbol') - end - - it "should not translate 0.9 should_not" do - @t.translate_line('@target.should_not @matcher').should eql('@target.should_not @matcher') - end - - it "should leave should_not_receive" do - @t.translate_line('@mock.should_not_receive(:not_expected).with("unexpected text")').should eql('@mock.should_not_receive(:not_expected).with("unexpected text")') - end - - it "should leave should_receive" do - @t.translate_line('@mock.should_receive(:not_expected).with("unexpected text")').should eql('@mock.should_receive(:not_expected).with("unexpected text")') - end - - it "should translate multi word predicates" do - @t.translate_line('foo.should_multi_word_predicate').should eql('foo.should be_multi_word_predicate') - end - - it "should translate multi word predicates prefixed with be" do - @t.translate_line('foo.should_be_multi_word_predicate').should eql('foo.should be_multi_word_predicate') - end - - it "should translate be(expected) to equal(expected)" do - @t.translate_line('foo.should_be :cool').should eql('foo.should equal :cool') - end - - it "should translate instance_of" do - @t.translate_line('5.should_be_an_instance_of(Integer)').should eql('5.should be_an_instance_of(Integer)') - end - - it "should translate should_be <" do - @t.translate_line('3.should_be < 4').should eql('3.should be < 4') - end - - it "should translate should_be <=" do - @t.translate_line('3.should_be <= 4').should eql('3.should be <= 4') - end - - it "should translate should_be >=" do - @t.translate_line('4.should_be >= 3').should eql('4.should be >= 3') - end - - it "should translate should_be >" do - @t.translate_line('4.should_be > 3').should eql('4.should be > 3') - end - - it "should translate should_be_happy" do - @t.translate_line("4.should_be_happy").should eql("4.should be_happy") - end - - it "should translate custom method taking regexp with parenthesis" do - @t.translate_line("@browser.should_contain_text(/Sn.rrunger og annet rusk/)").should eql("@browser.should be_contain_text(/Sn.rrunger og annet rusk/)") - end - - it "should translate custom method taking regexp without parenthesis" do - @t.translate_line("@browser.should_contain_text /Sn.rrunger og annet rusk/\n").should eql("@browser.should be_contain_text(/Sn.rrunger og annet rusk/)\n") - end - - it "should translate should_not_be_nil" do - @t.translate_line("foo.should_not_be_nil\n").should eql("foo.should_not be_nil\n") - end - - it "should translate kind of" do - @t.translate_line('@object.should_be_kind_of(MessageExpectation)').should( - eql('@object.should be_kind_of(MessageExpectation)')) - end - - it "should translate should_be_true" do - @t.translate_line("foo.should_be_true\n").should eql("foo.should be_true\n") - end - - # [#9674] spec_translate incorrectly handling shoud_match, when regexp in a var, in a block - # http://rubyforge.org/tracker/?func=detail&atid=3149&aid=9674&group_id=797 - it "should translate should_match on a regexp, in a var, in a block" do - @t.translate_line("collection.each { |c| c.should_match a_regexp_in_a_var }\n").should eql("collection.each { |c| c.should match(a_regexp_in_a_var) }\n") - @t.translate_line("collection.each{|c| c.should_match a_regexp_in_a_var}\n").should eql("collection.each{|c| c.should match(a_regexp_in_a_var) }\n") - end - - # From Rubinius specs - it "should translate close_to without parens" do - @t.translate_line("end.should_be_close 3.14159_26535_89793_23846, TOLERANCE\n").should eql("end.should be_close(3.14159_26535_89793_23846, TOLERANCE)\n") - end - - # [#9882] 0.9 Beta 1 - translator bugs - # http://rubyforge.org/tracker/index.php?func=detail&aid=9882&group_id=797&atid=3149 - it "should support symbol arguments" do - @t.translate_line( - "lambda { sequence.parse('bar') }.should_throw :ZeroWidthParseSuccess\n" - ).should eql( - "lambda { sequence.parse('bar') }.should throw_symbol(:ZeroWidthParseSuccess)\n" - ) - end - - # [#9882] 0.9 Beta 1 - translator bugs - # http://rubyforge.org/tracker/index.php?func=detail&aid=9882&group_id=797&atid=3149 - it "should support instance var arguments" do - @t.translate_line( - "a.should_eql @local" - ).should eql( - "a.should eql(@local)" - ) - end - - # [#9882] 0.9 Beta 1 - translator bugs - # http://rubyforge.org/tracker/index.php?func=detail&aid=9882&group_id=797&atid=3149 - it "should support lambdas as expecteds" do - @t.translate_line( - "@parslet.should_not_eql lambda { nil }.to_parseable" - ).should eql( - "@parslet.should_not eql(lambda { nil }.to_parseable)" - ) - end - - # [#9882] 0.9 Beta 1 - translator bugs - # http://rubyforge.org/tracker/index.php?func=detail&aid=9882&group_id=797&atid=3149 - it "should support fully qualified names" do - @t.translate_line( - "results.should_be_kind_of SimpleASTLanguage::Identifier" - ).should eql( - "results.should be_kind_of(SimpleASTLanguage::Identifier)" - ) - end - - # [#9882] 0.9 Beta 1 - translator bugs - # http://rubyforge.org/tracker/index.php?func=detail&aid=9882&group_id=797&atid=3149 - # it "should leave whitespace between expression and comments" do - # @t.translate_line( - # "lambda { @instance.foo = foo }.should_raise NoMethodError # no writer defined" - # ).should eql( - # "lambda { @instance.foo = foo }.should raise_error(NoMethodError) # no writer defined" - # ) - # end - - it "should translate redirects" do - @t.translate_line( - "controller.should_redirect_to 'http://not_existing_domain_for_novalis.test.host/404.html'" - ).should eql( - "controller.should redirect_to('http://not_existing_domain_for_novalis.test.host/404.html')" - ) - end - - it "should translate :any_args" do - @t.translate_line( - "mock.should_receive(:foo).with(:any_args)" - ).should eql( - "mock.should_receive(:foo).with(any_args)" - ) - end - - it "should translate :anything" do - @t.translate_line( - "mock.should_receive(:foo).with(:anything)" - ).should eql( - "mock.should_receive(:foo).with(anything)" - ) - end - - it "should translate :boolean" do - @t.translate_line( - "mock.should_receive(:foo).with(:boolean)" - ).should eql( - "mock.should_receive(:foo).with(boolean)" - ) - end - - it "should translate :no_args" do - @t.translate_line( - "mock.should_receive(:foo).with(:no_args)" - ).should eql( - "mock.should_receive(:foo).with(no_args)" - ) - end - - it "should translate :numeric" do - @t.translate_line( - "mock.should_receive(:foo).with(:numeric)" - ).should eql( - "mock.should_receive(:foo).with(an_instance_of(Numeric))" - ) - end - - it "should translate :string" do - @t.translate_line( - "mock.should_receive(:foo).with(:string)" - ).should eql( - "mock.should_receive(:foo).with(an_instance_of(String))" - ) - end -end diff --git a/vendor/gems/rspec-1.1.2/spec/spec_helper.rb b/vendor/gems/rspec-1.1.2/spec/spec_helper.rb deleted file mode 100644 index 1318176d5..000000000 --- a/vendor/gems/rspec-1.1.2/spec/spec_helper.rb +++ /dev/null @@ -1,103 +0,0 @@ -require 'stringio' - -dir = File.dirname(__FILE__) -lib_path = File.expand_path("#{dir}/../lib") -$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path) -$_spec_spec = true # Prevents Kernel.exit in various places - -require 'spec' -require 'spec/mocks' -require 'spec/story' -spec_classes_path = File.expand_path("#{dir}/../spec/spec/spec_classes") -require spec_classes_path unless $LOAD_PATH.include?(spec_classes_path) -require File.dirname(__FILE__) + '/../lib/spec/expectations/differs/default' - -module Spec - module Matchers - def fail - raise_error(Spec::Expectations::ExpectationNotMetError) - end - - def fail_with(message) - raise_error(Spec::Expectations::ExpectationNotMetError, message) - end - - class Pass - def matches?(proc, &block) - begin - proc.call - true - rescue Exception => @error - false - end - end - - def failure_message - @error.message + "\n" + @error.backtrace.join("\n") - end - end - - def pass - Pass.new - end - - class CorrectlyOrderedMockExpectation - def initialize(&event) - @event = event - end - - def expect(&expectations) - expectations.call - @event.call - end - end - - def during(&block) - CorrectlyOrderedMockExpectation.new(&block) - end - end -end - -class NonStandardError < Exception; end - -module Custom - class ExampleGroupRunner - attr_reader :options, :arg - def initialize(options, arg) - @options, @arg = options, arg - end - - def load_files(files) - end - - def run - end - end -end - -def exception_from(&block) - exception = nil - begin - yield - rescue StandardError => e - exception = e - end - exception -end - -describe "sandboxed rspec_options", :shared => true do - attr_reader :options - - before(:all) do - @original_rspec_options = $rspec_options - end - - before(:each) do - @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new) - $rspec_options = options - end - - after do - $rspec_options = @original_rspec_options - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/stories/all.rb b/vendor/gems/rspec-1.1.2/stories/all.rb deleted file mode 100644 index c2428fdf8..000000000 --- a/vendor/gems/rspec-1.1.2/stories/all.rb +++ /dev/null @@ -1,5 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[helper]) - -["example_groups","interop"].each do |dir| - require File.join(File.dirname(__FILE__), "#{dir}/stories") -end diff --git a/vendor/gems/rspec-1.1.2/stories/example_groups/autogenerated_docstrings b/vendor/gems/rspec-1.1.2/stories/example_groups/autogenerated_docstrings deleted file mode 100644 index b3ff68998..000000000 --- a/vendor/gems/rspec-1.1.2/stories/example_groups/autogenerated_docstrings +++ /dev/null @@ -1,45 +0,0 @@ -Story: autogenerated docstrings - - As an RSpec user - I want examples to generate their own names - So that I can reduce duplication between example names and example code - - Scenario: run passing examples with ruby - Given the file ../../examples/pure/autogenerated_docstrings_example.rb - - When I run it with the ruby interpreter -fs - - Then the stdout should match /should equal 5/ - And the stdout should match /should be < 5/ - And the stdout should match /should include "a"/ - And the stdout should match /should respond to #size/ - - Scenario: run failing examples with ruby - Given the file ../../failing_examples/failing_autogenerated_docstrings_example.rb - - When I run it with the ruby interpreter -fs - - Then the stdout should match /should equal 2/ - And the stdout should match /should be > 5/ - And the stdout should match /should include "b"/ - And the stdout should match /should not respond to #size/ - - Scenario: run passing examples with spec - Given the file ../../examples/pure/autogenerated_docstrings_example.rb - - When I run it with the spec script -fs - - Then the stdout should match /should equal 5/ - And the stdout should match /should be < 5/ - And the stdout should match /should include "a"/ - And the stdout should match /should respond to #size/ - - Scenario: run failing examples with spec - Given the file ../../failing_examples/failing_autogenerated_docstrings_example.rb - - When I run it with the spec script -fs - - Then the stdout should match /should equal 2/ - And the stdout should match /should be > 5/ - And the stdout should match /should include "b"/ - And the stdout should match /should not respond to #size/ diff --git a/vendor/gems/rspec-1.1.2/stories/example_groups/example_group_with_should_methods b/vendor/gems/rspec-1.1.2/stories/example_groups/example_group_with_should_methods deleted file mode 100644 index 3d2bc61eb..000000000 --- a/vendor/gems/rspec-1.1.2/stories/example_groups/example_group_with_should_methods +++ /dev/null @@ -1,17 +0,0 @@ -Story: Spec::ExampleGroup with should methods - - As an RSpec adopter accustomed to classes and methods - I want to use should_* methods in an ExampleGroup - So that I use RSpec with classes and methods that look more like RSpec examples - - Scenario: Run with ruby - Given the file spec/example_group_with_should_methods.rb - When I run it with the ruby interpreter - Then the exit code should be 256 - And the stdout should match "2 examples, 1 failure" - - Scenario: Run with spec - Given the file spec/example_group_with_should_methods.rb - When I run it with the spec script - Then the exit code should be 256 - And the stdout should match "2 examples, 1 failure" diff --git a/vendor/gems/rspec-1.1.2/stories/example_groups/nested_groups b/vendor/gems/rspec-1.1.2/stories/example_groups/nested_groups deleted file mode 100644 index ede978563..000000000 --- a/vendor/gems/rspec-1.1.2/stories/example_groups/nested_groups +++ /dev/null @@ -1,17 +0,0 @@ -Story: Nested example groups - - As an RSpec user - I want to nest examples groups - So that I can better organize my examples - - Scenario: Run with ruby - Given the file ../../examples/pure/stack_spec_with_nested_example_groups.rb - When I run it with the ruby interpreter -fs - Then the stdout should match /Stack \(empty\)/ - And the stdout should match /Stack \(full\)/ - - Scenario: Run with ruby - Given the file ../../examples/pure/stack_spec_with_nested_example_groups.rb - When I run it with the spec script -fs - Then the stdout should match /Stack \(empty\)/ - And the stdout should match /Stack \(full\)/ diff --git a/vendor/gems/rspec-1.1.2/stories/example_groups/output b/vendor/gems/rspec-1.1.2/stories/example_groups/output deleted file mode 100644 index 4947bdcaf..000000000 --- a/vendor/gems/rspec-1.1.2/stories/example_groups/output +++ /dev/null @@ -1,25 +0,0 @@ -Story: Getting correct output - - As an RSpec user - I want to see output only once - So that I don't get confused - - Scenario: Run with ruby - Given the file spec/simple_spec.rb - When I run it with the ruby interpreter - Then the exit code should be 0 - And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m - And the stdout should match "1 example, 0 failures" - - Scenario: Run with CommandLine object - Given the file spec/simple_spec.rb - When I run it with the CommandLine object - Then the exit code should be 0 - And the stdout should not match "Loaded suite" - And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m - And the stdout should match "1 example, 0 failures" - - Scenario: Tweak backtrace - Given the file stories/failing_story.rb - When I run it with the ruby interpreter - Then the stdout should not match /\/lib\/spec\// diff --git a/vendor/gems/rspec-1.1.2/stories/example_groups/stories.rb b/vendor/gems/rspec-1.1.2/stories/example_groups/stories.rb deleted file mode 100644 index e45882a93..000000000 --- a/vendor/gems/rspec-1.1.2/stories/example_groups/stories.rb +++ /dev/null @@ -1,7 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[.. helper]) - -with_steps_for :running_rspec do - Dir["#{File.dirname(__FILE__)}/*"].each do |file| - run file if File.file?(file) && !(file =~ /\.rb$/) - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/stories/helper.rb b/vendor/gems/rspec-1.1.2/stories/helper.rb deleted file mode 100644 index d9a105e76..000000000 --- a/vendor/gems/rspec-1.1.2/stories/helper.rb +++ /dev/null @@ -1,6 +0,0 @@ -$LOAD_PATH.unshift File.expand_path("#{File.dirname(__FILE__)}/../lib") -require 'spec' -require 'tempfile' -require File.join(File.dirname(__FILE__), *%w[resources matchers smart_match]) -require File.join(File.dirname(__FILE__), *%w[resources helpers story_helper]) -require File.join(File.dirname(__FILE__), *%w[resources steps running_rspec]) diff --git a/vendor/gems/rspec-1.1.2/stories/interop/examples_and_tests_together b/vendor/gems/rspec-1.1.2/stories/interop/examples_and_tests_together deleted file mode 100644 index 6583f89c6..000000000 --- a/vendor/gems/rspec-1.1.2/stories/interop/examples_and_tests_together +++ /dev/null @@ -1,30 +0,0 @@ -Story: Spec and test together - - As an RSpec adopter with existing Test::Unit tests - I want to run a few specs alongside my existing Test::Unit tests - So that I can experience a smooth, gradual migration path - - Scenario: Run with ruby - Given the file test/spec_and_test_together.rb - - When I run it with the ruby interpreter -fs - - Then the exit code should be 256 - And the stdout should match "ATest" - And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'" - And the stdout should match "'An Example should fail with should' FAILED" - And the stdout should match "10 examples, 6 failures" - And the stdout should match /expected: 40,\s*got: 4/m - And the stdout should match /expected: 50,\s*got: 5/m - Scenario: Run with spec - Given the file test/spec_and_test_together.rb - - When I run it with the spec script -fs - - Then the exit code should be 256 - Ands the stdout should match "ATest" - And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'" - And the stdout should match "'An Example should fail with should' FAILED" - And the stdout should match "10 examples, 6 failures" - And the stdout should match /expected: 40,\s*got: 4/m - And the stdout should match /expected: 50,\s*got: 5/m diff --git a/vendor/gems/rspec-1.1.2/stories/interop/stories.rb b/vendor/gems/rspec-1.1.2/stories/interop/stories.rb deleted file mode 100644 index e45882a93..000000000 --- a/vendor/gems/rspec-1.1.2/stories/interop/stories.rb +++ /dev/null @@ -1,7 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[.. helper]) - -with_steps_for :running_rspec do - Dir["#{File.dirname(__FILE__)}/*"].each do |file| - run file if File.file?(file) && !(file =~ /\.rb$/) - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/stories/interop/test_case_with_should_methods b/vendor/gems/rspec-1.1.2/stories/interop/test_case_with_should_methods deleted file mode 100644 index 31f28d32e..000000000 --- a/vendor/gems/rspec-1.1.2/stories/interop/test_case_with_should_methods +++ /dev/null @@ -1,17 +0,0 @@ -Story: Test::Unit::TestCase extended by rspec with should methods - - As an RSpec adopter with existing Test::Unit tests - I want to use should_* methods in a Test::Unit::TestCase - So that I use RSpec with classes and methods that look more like RSpec examples - - Scenario: Run with ruby - Given the file test/test_case_with_should_methods.rb - When I run it with the ruby interpreter - Then PENDING the exit code should be 256 - And the stdout should match "5 examples, 3 failures" - - Scenario: Run with spec - Given the file test/test_case_with_should_methods.rb - When I run it with the spec script - Then the exit code should be 256 - And the stdout should match "5 examples, 3 failures" diff --git a/vendor/gems/rspec-1.1.2/stories/pending_stories/README b/vendor/gems/rspec-1.1.2/stories/pending_stories/README deleted file mode 100644 index 2f9b44314..000000000 --- a/vendor/gems/rspec-1.1.2/stories/pending_stories/README +++ /dev/null @@ -1,3 +0,0 @@ -This directory contains stories that are currently not passing -because they are new or they represent regressions. - diff --git a/vendor/gems/rspec-1.1.2/stories/resources/helpers/cmdline.rb b/vendor/gems/rspec-1.1.2/stories/resources/helpers/cmdline.rb deleted file mode 100644 index ab86bd3e1..000000000 --- a/vendor/gems/rspec-1.1.2/stories/resources/helpers/cmdline.rb +++ /dev/null @@ -1,9 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require 'spec' - -# Uncommenting next line will break the output story (no output!!) -# rspec_options -options = Spec::Runner::OptionParser.parse( - ARGV, $stderr, $stdout -) -Spec::Runner::CommandLine.run(options) diff --git a/vendor/gems/rspec-1.1.2/stories/resources/helpers/story_helper.rb b/vendor/gems/rspec-1.1.2/stories/resources/helpers/story_helper.rb deleted file mode 100644 index e0aef5b45..000000000 --- a/vendor/gems/rspec-1.1.2/stories/resources/helpers/story_helper.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'spec/story' -require File.dirname(__FILE__) + '/../../../spec/ruby_forker' - -module StoryHelper - include RubyForker - - def spec(args, stderr) - ruby("#{File.dirname(__FILE__) + '/../../../bin/spec'} #{args}", stderr) - end - - def cmdline(args, stderr) - ruby("#{File.dirname(__FILE__) + '/../../resources/helpers/cmdline.rb'} #{args}", stderr) - end - - Spec::Story::World.send :include, self -end diff --git a/vendor/gems/rspec-1.1.2/stories/resources/matchers/smart_match.rb b/vendor/gems/rspec-1.1.2/stories/resources/matchers/smart_match.rb deleted file mode 100644 index 7b1672bc0..000000000 --- a/vendor/gems/rspec-1.1.2/stories/resources/matchers/smart_match.rb +++ /dev/null @@ -1,37 +0,0 @@ -module Spec - module Matchers - class SmartMatch - def initialize(expected) - @expected = expected - end - - def matches?(actual) - @actual = actual - # Satisfy expectation here. Return false or raise an error if it's not met. - - if @expected =~ /^\/.*\/?$/ || @expected =~ /^".*"$/ - regex_or_string = eval(@expected) - if Regexp === regex_or_string - (@actual =~ regex_or_string) ? true : false - else - @actual.index(regex_or_string) != nil - end - else - false - end - end - - def failure_message - "expected #{@actual.inspect} to smart_match #{@expected.inspect}, but it didn't" - end - - def negative_failure_message - "expected #{@actual.inspect} not to smart_match #{@expected.inspect}, but it did" - end - end - - def smart_match(expected) - SmartMatch.new(expected) - end - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/stories/resources/spec/example_group_with_should_methods.rb b/vendor/gems/rspec-1.1.2/stories/resources/spec/example_group_with_should_methods.rb deleted file mode 100644 index 4c0505d2a..000000000 --- a/vendor/gems/rspec-1.1.2/stories/resources/spec/example_group_with_should_methods.rb +++ /dev/null @@ -1,12 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require 'spec' - -class MySpec < Spec::ExampleGroup - def should_pass_with_should - 1.should == 1 - end - - def should_fail_with_should - 1.should == 2 - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/stories/resources/spec/simple_spec.rb b/vendor/gems/rspec-1.1.2/stories/resources/spec/simple_spec.rb deleted file mode 100644 index 2fb67ba49..000000000 --- a/vendor/gems/rspec-1.1.2/stories/resources/spec/simple_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require 'spec' - -describe "Running an Example" do - it "should not output twice" do - true.should be_true - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/stories/resources/steps/running_rspec.rb b/vendor/gems/rspec-1.1.2/stories/resources/steps/running_rspec.rb deleted file mode 100644 index 496847fe4..000000000 --- a/vendor/gems/rspec-1.1.2/stories/resources/steps/running_rspec.rb +++ /dev/null @@ -1,50 +0,0 @@ -steps_for :running_rspec do - - Given("the file $relative_path") do |relative_path| - @path = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "resources", relative_path)) - unless File.exist?(@path) - raise "could not find file at #{@path}" - end - end - - When("I run it with the $interpreter") do |interpreter| - stderr_file = Tempfile.new('rspec') - stderr_file.close - @stdout = case(interpreter) - when /^ruby interpreter/ - args = interpreter.gsub('ruby interpreter','') - ruby("#{@path}#{args}", stderr_file.path) - when /^spec script/ - args = interpreter.gsub('spec script','') - spec("#{@path}#{args}", stderr_file.path) - when 'CommandLine object' then cmdline(@path, stderr_file.path) - else raise "Unknown interpreter: #{interpreter}" - end - @stderr = IO.read(stderr_file.path) - @exit_code = $?.to_i - end - - Then("the exit code should be $exit_code") do |exit_code| - if @exit_code != exit_code.to_i - raise "Did not exit with #{exit_code}, but with #{@exit_code}. Standard error:\n#{@stderr}" - end - end - - Then("the $stream should match $regex") do |stream, string_or_regex| - written = case(stream) - when 'stdout' then @stdout - when 'stderr' then @stderr - else raise "Unknown stream: #{stream}" - end - written.should smart_match(string_or_regex) - end - - Then("the $stream should not match $regex") do |stream, string_or_regex| - written = case(stream) - when 'stdout' then @stdout - when 'stderr' then @stderr - else raise "Unknown stream: #{stream}" - end - written.should_not smart_match(string_or_regex) - end -end diff --git a/vendor/gems/rspec-1.1.2/stories/resources/stories/failing_story.rb b/vendor/gems/rspec-1.1.2/stories/resources/stories/failing_story.rb deleted file mode 100644 index cc9506c66..000000000 --- a/vendor/gems/rspec-1.1.2/stories/resources/stories/failing_story.rb +++ /dev/null @@ -1,15 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) - -require 'spec/story' - -Story "Failing story", -%(As an RSpec user - I want a failing test - So that I can observe the output) do - - Scenario "Failing scenario" do - Then "true should be false" do - true.should == false - end - end -end diff --git a/vendor/gems/rspec-1.1.2/stories/resources/test/spec_and_test_together.rb b/vendor/gems/rspec-1.1.2/stories/resources/test/spec_and_test_together.rb deleted file mode 100644 index eb2b4e074..000000000 --- a/vendor/gems/rspec-1.1.2/stories/resources/test/spec_and_test_together.rb +++ /dev/null @@ -1,57 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require 'spec' -# TODO - this should not be necessary, ay? -require 'spec/interop/test' - -describe "An Example" do - it "should pass with assert" do - assert true - end - - it "should fail with assert" do - assert false - end - - it "should pass with should" do - 1.should == 1 - end - - it "should fail with should" do - 1.should == 2 - end -end - -class ATest < Test::Unit::TestCase - def test_should_pass_with_assert - assert true - end - - def test_should_fail_with_assert - assert false - end - - def test_should_pass_with_should - 1.should == 1 - end - - def test_should_fail_with_should - 1.should == 2 - end - - def setup - @from_setup ||= 3 - @from_setup += 1 - end - - def test_should_fail_with_setup_method_variable - @from_setup.should == 40 - end - - before do - @from_before = @from_setup + 1 - end - - def test_should_fail_with_before_block_variable - @from_before.should == 50 - end -end \ No newline at end of file diff --git a/vendor/gems/rspec-1.1.2/stories/resources/test/test_case_with_should_methods.rb b/vendor/gems/rspec-1.1.2/stories/resources/test/test_case_with_should_methods.rb deleted file mode 100644 index 3912429e3..000000000 --- a/vendor/gems/rspec-1.1.2/stories/resources/test/test_case_with_should_methods.rb +++ /dev/null @@ -1,30 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require 'test/unit' -require 'spec' -require 'spec/interop/test' - -class MySpec < Test::Unit::TestCase - def should_pass_with_should - 1.should == 1 - end - - def should_fail_with_should - 1.should == 2 - end - - def should_pass_with_assert - assert true - end - - def should_fail_with_assert - assert false - end - - def test - raise "This is not a real test" - end - - def test_ify - raise "This is a real test" - end -end \ No newline at end of file From f2a9386a3e50de0a5855f23ef5af5c8a6620ad32 Mon Sep 17 00:00:00 2001 From: Shaun McDonald Date: Fri, 25 Jul 2008 10:35:59 +0000 Subject: [PATCH 31/58] Removing rspec from svn externals, as it isn't being used. From 35ace2607baa691e12e99991e064532170a5a058 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Tue, 29 Jul 2008 00:33:33 +0000 Subject: [PATCH 32/58] Potlatch 0.10a --- app/controllers/amf_controller.rb | 21 + config/potlatch/localised.yaml | 708 ++++++++++++++++++++++++------ public/potlatch/potlatch.swf | Bin 149022 -> 150828 bytes 3 files changed, 585 insertions(+), 144 deletions(-) diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index ce3dc91d5..f3bd2b6cd 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -80,6 +80,7 @@ class AmfController < ApplicationController end results[index]=AMF.putdata(index,r) when 'putrelation'; results[index]=AMF.putdata(index,putrelation(renumberednodes, renumberedways, *args)) + when 'findrelations'; results[index]=AMF.putdata(index,findrelations(*args)) when 'deleteway'; results[index]=AMF.putdata(index,deleteway(args[0],args[1].to_i)) when 'putpoi'; results[index]=AMF.putdata(index,putpoi(*args)) when 'getpoi'; results[index]=AMF.putdata(index,getpoi(args[0].to_i)) @@ -214,6 +215,26 @@ class AmfController < ApplicationController [relid, rel.tags, rel.members] end + # Find relations with specified name/id. + # Returns array of relations, each in same form as getrelation. + + def findrelations(searchterm) + rels = [] + if searchterm.to_i>0 then + rel = Relation.find(searchterm.to_i) + if rel and rel.visible then + rels.push([rel.id, rel.tags, rel.members]) + end + else + RelationTag.find(:all, :limit => 11, :conditions => ["match(v) against (?)", searchterm] ).each do |t| + if t.relation.visible then + rels.push([t.relation.id, t.relation.tags, t.relation.members]) + end + end + end + rels + end + # Save a relation. # Returns # 0. 0 (success), diff --git a/config/potlatch/localised.yaml b/config/potlatch/localised.yaml index f61bdc18a..19baf7d60 100644 --- a/config/potlatch/localised.yaml +++ b/config/potlatch/localised.yaml @@ -1,621 +1,1041 @@ a_poi: "de": $1 einen Ort von Interesse (POI) + "es": $1 un punto de interés (POI) + "fr": $1 un POI "hu": POI $1 + "it": $1 a POI + "ja": POIを $1 + "lolcat": $1 A plase + "no": $1 et POI + "pt-br": $1 um ponto de interesse (POI) + "ru": $1 точка интереса (POI) + "sv": $1 en POI + "zh-hans": $1 a POI a_way: "de": $1 einen Weg - "hu": Út $1 + "es": $1 una vía + "fr": $1 un chemin + "hu": Vonal $1 + "it": $1 a way + "ja": wayを $1 + "lolcat": $1 a wai + "no": $1 en vei + "pt-br": $1 um caminho + "ru": $1 линия + "sv": $1 en väg + "zh-hans": $1 a way action_addpoint: - "de": Am Ende des Wegs Punkt hinzufügen + "de": Punkt am Ende des Wegs hinzufügen "es": Añadir un punto al final de una vía "fi": pisteen lisääminen tien perään "fr": Ajout d'un point à la fin d'un chemin - "hu": pont hozzáadása az út végéhez + "hu": a vonal végéhez pont hozzáadásának + "it": adding a node to the end of a way + "ja": wayの終端にnodeを追加 + "lolcat": addin a noeded ta teh end uv a wai "no": adding a node to the end of a way - "ru": добавить точку в конец пути + "pt-br": Adicionando um nó ao fim do caminho + "ru": добавить точку в конец линии "sv": lägger till en punkt på slutet av en väg + "zh-hans": adding a node to the end of a way action_cancelchanges: "de": Änderungen an $1 abgebrochen "es": Cancelar cambios "fi": peruutetaan muutokset "fr": annulation de la modification - "hu": cancelling changes to + "hu": Módosítások elvetése a következőre + "it": cancelling changes to + "ja": 変更を中止 + "lolcat": cancellin chanzes ta "no": cancelling changes to + "pt-br": Cancelando as mudanças de "ru": отмена изменений к "sv": avbryter ändringar på + "zh-hans": cancelling changes to action_createpoi: "de": Einen Ort von Interesse (POI) erstellen "es": Crear un punto de interés (POI) "fi": "POI:n lisääminen" "fr": créer un POI (point d'intérêt) - "hu": POI készítése + "hu": POI készítésének + "it": sto creando un PDI + "ja": POIを作成 + "lolcat": creatin a plase "no": lage et POI (interessant punkt) - "ru": создаю точку интереса(POI) - "sv": Skapa en POI, "punk av intresse" + "pt-br": Criando um ponto de interesse (POI) + "ru": создание точки интереса (POI) + "sv": Skapa en POI, "punkt av intresse" + "zh-hans": creating a POI action_deletepoint: "de": Punkt löschen "es": Borrar un punto "fi": pisteen poistaminen "fr": suppression d'un point - "hu": pont törlése + "hu": pont törlésének + "it": deleting a point + "ja": pointを削除 + "lolcat": deletin a noed "no": deleting a point - "ru": удаляю узел + "pt-br": Apagando um ponto + "ru": удаляю точку "sv": Tar bort en punkt + "zh-hans": deleting a point action_insertnode: "de": Punkt auf Weg hinzufügen "es": Añadir un punto a una vía "fi": pisteen lisääminen tiehen "fr": Ajouter un point sur un chemin - "hu": pont hozzáadása úthoz + "hu": vonalhoz pont hozzáadásának + "it": adding a node into a way + "ja": wayの途中にnodeを追加 + "lolcat": addin a noeded into a wai "no": adding a node into a way - "ru": добавляю узел в путь - "sv": läggertill en punkt till en väg + "pt-br": Adicionando um nó em um caminho + "ru": добавляю точку в линию + "sv": lägger till en punkt till en väg + "zh-hans": adding a node into a way action_mergeways: "de": Zwei Wege verschmelzen "es": Combinar dos vías "fi": kahden tien yhdistäminen "fr": Joindre deux chemins - "hu": két út egyesítése + "hu": két vonal egyesítése + "it": merging two ways + "ja": 2つのwayを結合 + "lolcat": mergin too waiz "no": slår sammen to veier - "ru": соединяю два пути - "sv": Slåsamman två vägar + "pt-br": Mesclando dois caminhos + "ru": соединяю две линии + "sv": Slå samman två vägar + "zh-hans": merging two ways action_movepoi: "de": Ort von Interesse (POI) verschieben "es": Mover un punto de interés (POI) "fi": "POI:n siirtäminen" "fr": déplacer un POI - "hu": POI mozgatása + "hu": POI mozgatásának + "it": moving a POI + "ja": POIを移動 + "lolcat": movin a plase "no": flytter et POI (interessant punkt) - "ru": перемещаю точку интереса(POI) + "pt-br": Movendo um ponto de interesse (POI) + "ru": перемещение точки интереса (POI) "sv": Flytta på en POI, "punkt av intresse" + "zh-hans": moving a POI action_movepoint: "de": Punkt verschieben "es": Mover un punto "fi": pisteen lisääminen "fr": déplacer un point - "hu": pont mozgatása + "hu": pont mozgatásának + "it": muovo un punto + "ja": pointを移動 + "lolcat": movin a point "no": flytter punkt - "ru": перемещаю точку + "pt-br": Movendo um ponto + "ru": перемещение точки "sv": Flytta en punkt + "zh-hans": moving a point action_moveway: "de": einen Weg verschieben - "hu": út mozgatása + "es": Moviendo una vía + "fr": Déplacer un chemin + "hu": vonal mozgatásának + "it": moving a way + "ja": wayを移動 + "lolcat": movin a wai + "no": flytter en vei + "pt-br": Movendo um caminho + "ru": перемещение линии + "sv": flytta en väg + "zh-hans": moving a way action_pointtags: "de": Attribute (Tags) für Punkt zuweisen "es": Parámetros (tags) un punto "fi": pisteen tagien asettaminen "fr": Paramétrer un point - "hu": setting tags on a point + "hu": pont címkéi állításának + "it": setting tags on a point + "ja": pointにtagを設定 + "lolcat": settin tagz awn a noed "no": setting tags on a point + "pt-br": Ajustando tags (rótulos) em um ponto "ru": установка тегов для точки - "sv": lägger till tagger på en punkt + "sv": lägger till taggar på en punkt + "zh-hans": setting tags on a point action_poitags: "de": Attribute (Tags) für Ort von Interesse (POI) zuweisen "es": Parámetros (tags) en un punto de interés (POI) "fi": "POI:n tagien asettaminen" "fr": Paramétrer un POI - "hu": setting tags on a POI + "hu": POI címkéi állításának + "it": setting tags on a POI + "ja": POIにtagを設定 + "lolcat": settin tagz awn a plase "no": setting tags on a POI + "pt-br": Ajustando tags (rótulos) em um ponto de interesse (POI) "ru": установка тегов для точки интереса (POI) - "sv": lägger till tagger på en POI + "sv": lägger till taggar på en POI + "zh-hans": setting tags on a POI action_reverseway: "de": Wegrichtung umkehren "es": Invertir dirección de una vía "fi": tien kääntäminen "fr": Inverser le sens du chemin - "hu": út megfordítása + "hu": vonal megfordításának + "it": reversing a way + "ja": wayを反転 + "lolcat": reversin a wai "no": reversing a way - "ru": ищменение направления пути + "pt-br": Invertendo um caminho + "ru": изменение направления линии "sv": Byter rikting på en väg + "zh-hans": reversing a way action_splitway: "de": Weg teilen "es": Dividir una vía "fi": tien katkaisu "fr": Scinder un chemin - "hu": út kettévágása + "hu": vonal kettévágásának + "it": splitting a way + "ja": wayを分割 + "lolcat": spleettin a wai "no": splitting a way - "ru": разбиваю путь + "pt-br": Dividindo um caminho + "ru": разбиение линии "sv": delar upp en väg + "zh-hans": splitting a way action_waytags: "de": Attribute (Tags) für Weg zuweisen "es": Parámetros (tags) en una vía - "fi": tien tagian asettaminen + "fi": tien tagien asettaminen "fr": Paramétrer un chemin - "hu": setting tags on a way + "hu": vonal címkéi állításának + "it": setting tags on a way + "ja": wayにtagを設定 + "lolcat": settin tagz awn a wai "no": setting tags on a way - "ru": установка тегов для путиs - "sv": lägger till tagger på en väg + "pt-br": Ajustando tags (rótulos) em um caminho + "ru": установка тегов для линии + "sv": lägger till taggar på en väg + "zh-hans": setting tags on a way add: "de": Hinzufügen "es": Añadir "fi": Lisää "fr": Ajouter - "hu": Hozzáadás + "hu": Hozzáad + "it": Add + "ja": 追加 + "lolcat": Add "no": Add + "pt-br": Adicionar "ru": Добавить - "sv": Läggtill + "sv": Lägg till + "zh-hans": Add cancel: "de": Abbrechen "es": Cancelar "fi": Peru "fr": Annuler "hu": Mégse + "it": Cancel + "ja": 中止 + "lolcat": Noes! "no": Avbryt + "pt-br": Cancelar "ru": Отмена "sv": Avbryt + "zh-hans": Cancel createrelation: "de": Eine neue Relation erstellen "es": Crear una nueva relación "fi": Luo uusi relaatio "fr": Créer une nouvelle relation "hu": Új kapcsolat létrehozása + "it": Create a new relation + "ja": 新しいrelationを作成 + "lolcat": Creaet a new relashun "no": Create a new relation - "ru": Создать отношение + "pt-br": Criar uma nova relação + "ru": Создать новое отношение "sv": Skapa en ny relation + "zh-hans": Create a new relation delete: - "de": löschen + "de": Löschen + "es": Borrar + "fr": Supprimer "hu": Törlés + "it": Delete + "ja": 削除 + "lolcat": Deleet + "no": Slett + "pt-br": Apagar + "ru": Удалить + "sv": Radera + "zh-hans": Delete deleting: "de": löschen "es": Borrar "fi": poistaminen "fr": suppression "hu": törlés + "it": deleting + "ja": 削除 + "lolcat": deletin "no": deleting + "pt-br": Apagando "ru": удаляю "sv": Tar bort + "zh-hans": deleting dontshowagain: "de": Diese Meldung nicht wieder anzeigen. "es": No mostrar este mensaje de nuevo "fi": Älä näytä tätä viestiä enää. "fr": Ne plus afficher ce message "hu": Ez az üzenet ne jelenjen meg újra + "it": Don't show this message again + "ja": 次回からこのメッセージを表示しない。 + "lolcat": noes show dis messaeg agin "no": Ikke vis denne meldingen igjen + "pt-br": Não mostre esta mensagem novamente "ru": Не показывать это сообщение снова. "sv": Visa inte detta medelande igen + "zh-hans": Don't show this message again editingmap: "de": Karte editieren - "hu": Térkép szerkesztése + "es": Editando el mapa + "fr": Modifier la carte + "hu": Szerkesztő mód + "it": Modalità modifica + "ja": 地図編集中 + "lolcat": Editin map + "no": Editerer kart + "pt-br": Editar o mapa + "ru": Редактирование карты + "sv": Kartera + "zh-hans": Editing map emailauthor: "de": \n\nBitte maile an richard\@systemeD.net eine Fehlerbeschreibung, und schildere, was Du in dem Moment getan hast. (Wenn möglich auf Englisch) "es": \n\nPor favor envíe un mail a richard\@systemeD.net con un informe del error, describiendo lo que hacía en ese momento. "fi": \n\nLähetäthän sähköpostia, jossa kerrot mitä olit tekemässä, osoitteeseen richard\@systemeD.net mieluiten englanniksi. "fr": \n\nMerci d'envoyer un e-mail a richard\@systemeD.net pour signaler ce bogue, en expliquant ce que vous faisiez quand il est survenu. - "hu": \n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time. + "hu": \n\nKérlek, jelentsd a hibát (angolul) a richard\@systemeD.net e-mail címre, és írd le, hogy mit csináltál akkor, amikor a hiba történt. + "it": \n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time. + "ja": \n\nあなたがその時に何を行っていたかを書いたバグレポートを、 richard\@systemeD.net 宛てにe-mailで送付して下さい。 + "lolcat": \n\NPLEAES e-male richard\@systemed.net wif a bug report, meaowin whut yoo werz doin at teh tyme. "no": \n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time. - "ru": "\n\n Пожалуйста, отправьте сообщение об ошибке (на английском языке) на электронную почту: richard\@systemeD.net, с указанием того, какие действия вы совершали." + "pt-br": \n\nFavor enviar um e-mail a richard\@systemeD.net com um relatório de erro, informando o que você estava fazendo na hora. + "ru": "\n\nПожалуйста, отправьте сообщение об ошибке (на английском языке) на электронную почту: richard\@systemeD.net, с указанием того, какие действия вы совершали." "sv": \n\nVänligen e-posta richard\@systemeD.net med en felreport, som beskriver vad du gjorde när felet inträffade. + "zh-hans": \n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time. error_connectionfailed: - "de": Die Verbindung zum OpenStreetMap Server ist leider fehlgeschlagen. Kürzliche Änderungen wurden nicht gespeichert.\n\nNochmal versuchen? + "de": Die Verbindung zum OpenStreetMap-Server ist leider fehlgeschlagen. Kürzlich erfolgte Änderungen wurden nicht gespeichert.\n\nNoch einmal versuchen? "es": "Disculpe - la conexión al servidor de OpenStreetMap ha fallado. Cualquier cambio reciente no se ha guardado.\n\nPodría intentarlo de nuevo?" "fi": "Yhteys OSM-palvelimeen epäonnistui. Tuoreita muutoksia ei ole tallennettu.\n\nHaluatko yrittää uudestaan?" "fr": "Désolé, la connexion au serveur OpenStreetMap a échoué. Vos changements récents ne sont pas enregistrés.\n\nVoulez-vous réessayer ?" - "hu": "Bocs - az OpenStreetMap szerverhez való kapcsolódás sikertelen. A legutóbbi módosítások nem lettek elmentve.\n\nSzeretnéd megpróbálni újra?" + "hu": Bocs - az OpenStreetMap szerverhez való kapcsolódás sikertelen. A legutóbbi módosítások nem lettek elmentve.\n\nSzeretnéd megpróbálni újra? + "it": "Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?" + "ja": 申し訳ありません。OpenStreetMapのサーバーへの接続に失敗しました。 直近の変更は保存されていません。\n\n再送信しますか? + "lolcat": "OHNOES! teh connecshun ta teh OPENSTREETMAP servah faileded. n e recent chanzes haz nawt bein saveded.\n\nwud yoo lieks ta tri agin?" "no": "Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?" + "pt-br": Sinto muito - a conexão ao servidor do OpenStreetMap falhou. Algumas alterações recentes não foram salvas.\n\nVocê gostaria de tentar novamente? "ru": "Извините, соединение с сервером OpenStreetMap разорвано. Все текущие изменения не были сохранены.\n\nПопробовать ещё раз?" - "sv": "Tyvärr har vi tappat kontakten med OpenStreetMap serven. Ny gjorda ändringar har inte kunnat sparas.\n\nFörsöka återansluta?" + "sv": "Tyvärr har vi tappat kontakten med OpenStreetMap serven. Nygjorda ändringar har inte kunnat sparas.\n\nFörsöka återansluta?" + "zh-hans": "Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?" error_nopoi: - "de": Der Ort von Interesse (POI) kann nicht gefunden werden (vielleicht hast Du den Kartenausschnitt verschoben?), daher ist Rückgängigmachen nicht möglich. + "de": Der Ort von Interesse (POI) kann nicht gefunden werden (vielleicht wurde der Kartenausschnitt verschoben?), daher ist Rückgängigmachen nicht möglich. "es": El punto de interés (POI) no se puede encontrar (igual usted se ha desplazado a otra zona?), por tanto no se puede deshacer. "fi": POI ei löydä (ehkä vieritit siitä liian kauaksi), joten peruminen ei onnistu. "fr": Le point d'intérêt (POI) n'est pas trouvé (éventuellement sur une autre page?), il ne peut être restauré. - "hu": The POI cannot be found (perhaps you've panned away?) so I can't undo. + "hu": A POI nem található (talán már eltávolítottad?), így nem vonható vissza. + "it": The POI cannot be found (perhaps you've panned away?) so I can't undo. + "ja": 該当するPOIが見付からないため、取消ができませんでした。 (画面表示の範囲外になっていませんか?) + "lolcat": "I had a plase but I losteded it, so noes can undo. :(" "no": The POI cannot be found (perhaps you've panned away?) so I can't undo. + "pt-br": O ponto de interesse (POI) não foi encontrado (talvez você tenha mudado a sua posição?), por isso não posso desfazer. "ru": Точка интереса(POI) не найдена (возможно вы отошли в сторону?), поэтому невозможно отменить. "sv": "POI:n kan inte hittas (du kanske har flyttat den utanför bilden?) så det går inte att ångra." + "zh-hans": The POI cannot be found (perhaps you've panned away?) so I can't undo. error_nosharedpoint: "de": Die Wege $1 und $2 haben keinen gemeinsamen Punkt mehr, daher kann das Aufteilen nicht rückgängig gemacht werden. "es": Las vías $1 y $2 ya no tienen ningún punto en común, por tanto no se pueden dividir. "fi": Ways $1 and $2 don't share a common point any more, so I can't undo the split. "fr": "Les chemins $1 et $2 n'ont plus de point en commun et ne peuvent donc pas être recollés : l'opération précédente de scindage ne peut être annulée." - "hu": Ways $1 and $2 don't share a common point any more, so I can't undo the split. + "hu": Már nincs közös pontja a(z) $1 és a(z) $2 vonalaknak, így nem vonható vissza a kettévágás. + "it": Ways $1 and $2 don't share a common point any more, so I can't undo the split. + "ja": $1 と $2 のwayは既に共通のpointを共有していないため、分割の取消ができませんでした。 + "lolcat": waiz $1 adn $2 dun shaer a common point n e moar , sow I noes kan undo teh spleet. "no": Ways $1 and $2 don't share a common point any more, so I can't undo the split. - "ru": Пути $1 и $2 больше не содержат общих узлов, поэтому невозможно отменить разделение. + "pt-br": Caminhos $1 e $2 não compartilham mais um mesmo ponto, então a divisão não pode ser desfeita. + "ru": Линии $1 и $2 больше не содержат общих точек, поэтому невозможно отменить разделение. "sv": Vägarna $1 och $2 möts inte i någon punkt längre, så det går inte att ångra delningen. + "zh-hans": Ways $1 and $2 don't share a common point any more, so I can't undo the split. error_noway: - "de": Der Weg $1 kann nicht gefunden werden (vielleicht hast Du den Kartenausschnitt verschoben?), daher ist Rückgängigmachen nicht möglich. + "de": Der Weg $1 kann nicht gefunden werden (eventuell wurde der Kartenausschnitt verschoben), daher ist Rückgängigmachen nicht möglich. "es": La vía $1 no se puede encontrar (igual usted se ha desplazado a otra zona?), por tanto no se puede deshacer.. "fi": Tietä $1 ei löydy (ehkä vieritit siitä liian kauaksi), joten kumoaminen ei onnistu. "fr": Le chemin $1 n'a pas été trouvé, il ne peut être restauré à son état précédent. - "hu": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. + "hu": A(z) $1 vonal nem található (talán már eltávolítottad?), így nem vonható vissza. + "it": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. + "ja": $1 というwayが見付からないため、取消ができませんでした。 (画面表示の範囲外になっていませんか?) + "lolcat": "I had a wai $1 but I losteded it, so noes can undo. :(" "no": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. - "ru": Путь $1 не найден (возможно вы отошли в сторону?), поэтому невозможно отменить. + "pt-br": Caminho $1 não foi encontrado (talvez você mudou a sua posição?), por isso não posso desfazer. + "ru": Линия $1 не найдена (возможно вы отошли в сторону?), поэтому невозможно отменить. "sv": Vägen $1 kan inte hittas (du kanske har flyttat den utanför bilden?) så det går inte att ångra. + "zh-hans": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. gpxpleasewait: "de": Bitte warten, während die GPX-Aufzeichnung (Track) verarbeitet wird. "es": Por favor espere un poco mientras el track GPX se procesa. "fi": Odota. GPX-jälkeä käsitellään. "fr": Patientez pendant que la trace GPX est traitée. - "hu": Kérlek várj a GPX útvonal feldolgozásáig. + "hu": Kérlek, várj a GPX nyomvonal feldolgozásáig. + "it": Please wait while the GPX track is processed. + "ja": GPX trackが処理されるまで暫くお待ち下さい。 + "lolcat": Pleez wayt whiel teh GPX track iz processeded. "no": Vennligst vent mens sporloggen behandles. + "pt-br": Favor aguardar enquanto a trilha GPX é processada. "ru": Пожалуйста, подождите — GPX-треки обрабатываются. "sv": GPX loggen bearbetas, var god vänta. + "zh-hans": Please wait while the GPX track is processed. help: "de": Hilfe "es": Ayuda "fi": Ohje "fr": Aide - "hu": Segítség + "hu": Súgó + "it": Help + "ja": ヘルプ + "lolcat": halp "no": Hjelp + "pt-br": Ajuda "ru": Помощь "sv": Hjälp + "zh-hans": Help hint_drawmode: - "de": Klicken um Punkt hinzuzufügen\n Doppelklicken oder Eingabetaste zum Beenden der Linie + "de": Klicken, um Punkt hinzuzufügen\nDoppelklicken oder Eingabetaste zum Beenden der Linie "es": Clic para añadir un punto\ndoble-clic/Return\npara terminar la línea "fi": klikkaa lisätäksesi piste\ntuplaklikkaa tai paina enter päättääksesi tien - "fr": clic pour ajouter un point\ndouble-clic/Return\npour terminer le chemin - "hu": kattintás pont hozzáadásához\ndupla kattintás/Return\na vonal befejezéséhez + "fr": clic pour ajouter un point\ndouble-clic/Entrée\npour terminer le chemin + "hu": kattintás pont hozzáadásához\ndupla kattintás/Enter\na vonal befejezéséhez + "it": click to add point\ndouble-click/Return\nto end line + "ja": クリックしてpointを追加\nダブルクリック/Returnで\nline編集を終了 + "lolcat": clik ta add point\ndouble-clik/Return\nto end lien "no": trykk for å legge til punkt\ndobbeltklikk eller enter\nfor å avslutte linje - "ru": кликните для добавления точки\nдвойной клик или Enter\nчтобы чтобы закончить путь - "sv": Klicka för att lägga till en punkt\n Dubbel klicka för att avsluta vägen. + "pt-br": Clique para adicionar um ponto\nDuplo clique/Enter\npara finalizar a linha + "ru": кликните для добавления точки\nдвойной клик или Enter\nчтобы чтобы закончить линию + "sv": Klicka för att lägga till en punkt\n Dubbelklicka för att avsluta vägen. + "zh-hans": click to add point\ndouble-click/Return\nto end line hint_loading: "de": Wege werden geladen "es": Cargando vías "fi": ladataan teitä "fr": chargement des chemins en cours - "hu": utak betöltése + "hu": vonalak betöltése + "it": loading ways + "ja": wayを読み込んでいます。 + "lolcat": loadin waiz "no": laster veier - "ru": загрузка путей + "pt-br": Carregando caminhos + "ru": загрузка линий "sv": laddar vägar + "zh-hans": loading ways hint_overendpoint: "de": Überlappung mit Endpunkt\nKlicken zum Anschließen\nShift+Klick zum Verschmelzen "es": Sobre punto final\nclic para unir\nshift-clic para combinar "fi": päätepisteen päällä\nklikkaa sulkeaksi\nshift-klikkaa yhdistääksesi "fr": sur le dernier point du tracé \nclick pour joindre\nshift-click pour fusionner - "hu": végpont fölött\nkattintás a csatlakoztatáshoz\nshift-kattintás az egyesítéshez + "hu": végpont fölött\nkattintás a csatlakoztatáshoz\nshift+kattintás az egyesítéshez + "it": over endpoint\nclick to join\nshift-click to merge + "ja": 終端のpoint上で\nクリックして接続\nshiftキーを押しながらクリックして結合 + "lolcat": ovah endpoint\nclik ta join\nshift-clik ta merge "no": over endepunkt\ntrykk for å koble sammen\nshift+trykk for å slå sammen - "ru": над конечным узлом\nclick для соединения\nshift-click для слияния - "sv": över en slutpunkt\nklicka för att sätta fast\nshift-klicka för att slåsamman + "pt-br": Sobre o ponto final\nclique para ligar\nclique pressionando o shift para mesclar + "ru": над конечной точкой\nclick для соединения\nshift-click для слияния + "sv": över en slutpunkt\nklicka för att sätta fast\nshift-klicka för att slå samman + "zh-hans": over endpoint\nclick to join\nshift-click to merge hint_overpoint: - "de": Überlappung mit Punkt\nklicken zum Anschließen + "de": Überlappung mit Punkt\nKlicken zum Anschließen "es": Sobre punto\nclick para unir" "fi": pisteen päällä\nklikkaa yhdistääksesi" "fr": point du dessus\nclick pour joindre" - "hu": pont fölött\nkattintás a csatlakoztatáshoz" + "hu": pont fölött\nkattintás a csatlakoztatáshoz + "it": over point\nclick to join" + "ja": point上で\nクリックして接続 + "lolcat": ovah point\nclik ta join" "no": over punkt\ntrykk for å koble sammen - "ru": над узлом\nclick для соединения" - "sv": över en punkt \nkicka att sätta fast" + "pt-br": Sobre o ponto\nclique para conectar + "ru": над точкой\nclick для соединения" + "sv": över en punkt\nklicka för att sätta fast" + "zh-hans": over point\nclick to join" hint_pointselected: - "de": Punkt ist markiert\n(Shift+Punkt anklicken, um\n eine neue Linie zu ziehen) + "de": Punkt ausgewählt\n(Shift+Punkt anklicken, um\n eine neue Linie zu erstellen) "es": Punto seleccionado\n(shift-clic en el punto para\nempezar nueva línea) "fi": piste valittua\n(shift-klikkaa pistettä\naloittaksesi uuden tien) "fr": point sélectionné\n(shift-clic sur le point pour\ncommencer une nouvelle ligne) - "hu": pont kijelölve\n(shift-kattintás a pontra \núj vonal kezdéséhez) + "hu": pont kijelölve\n(shift+kattintás a pontra\núj vonal kezdéséhez) + "it": punto selezionato\n(shift-click sul punto per\niniziare una nuova linea) + "ja": pointを選択\n(shiftキーを押しながらpointをクリックして\n新しいlineを開始) + "lolcat": point selecteded\n(shift-clik point ta\nstaart new lien) "no": punkt valgt\n(shift+trykk punktet for å\nstarte en ny linje) + "pt-br": Ponto selecionado\n(clique no ponto pressionando o shift para\niniciar uma nova linha) "ru": точка выбрана\n(кликните с нажатым Shift на точку\nчтобы начать новую линию) - "sv": En punk är vald\n(Shift-klicka på punkten för att starta en ny väg) + "sv": En punkt är vald\n(Shift-klicka på punkten för att starta en ny väg) + "zh-hans": point selected\n(shift-click point to\nstart new line) hint_toolong: - "de": "Zu lang zum Entsperren:\n bitte in kürzere Wege aufteilen" + "de": "Zu lang zum Entsperren:\nBitte in kürzere Wege aufteilen" "es": "Demasiado larga para desbloquear:\nPorfavor divida\nen vías más cortas" "fi": "liian pitkä vapautettavaksi:\nkatkaise\nlyhyempiin teihin" "fr": "trop long pour débloquer la situation:\nscindez le chemin en\nchemins plus courts" - "hu": "too long to unlock:\nplease split into\nshorter ways" + "hu": "túl hosszú a feloldáshoz:\nkérlek, vágd szét\nrövidebb vonalakra" + "it": "too long to unlock:\nplease split into\nshorter ways" + "ja": "wayが長すぎるためunlockできません:\n短いwayに\n分割して下さい。" + "lolcat": "too lawng ta unlok:\npleaes spleet into\nshortah waiz" "no": "for lang til å låse opp:\nvennligst del opp\ni mindre veier" - "ru": "слишком длинный путь для разблокировки:\пожалуйста, разбейте его\nна более короткие пути" - "sv": "för lång för att låsaupp:\ndela upp vägen\ni mindre delar" + "pt-br": "Muito longo para destravar:\nfavor dividir em\ncaminhos mais curtos" + "ru": "слишком длинная линия для разблокировки:\пожалуйста, разбейте ее\nна более короткие линии" + "sv": "för lång för att låsa upp:\ndela upp vägen\ni mindre delar" + "zh-hans": "too long to unlock:\nplease split into\nshorter ways" option_background: "de": "Hintergrund:" "es": "Fondo:" "fi": "Tausta:" "fr": "Arrière-plan :" "hu": "Háttér:" + "it": "Background:" + "ja": "背景:" + "lolcat": "bakground:" "no": "Background:" + "pt-br": "Plano de fundo:" "ru": "Фон:" "sv": "Bakgrund:" + "zh-hans": "Background:" option_custompointers: "de": Stift- und Hand-Mauszeiger benutzen "es": Usar punteros de pluma y mano "fi": Käytä kynä- ja käsikursoreita "fr": Utiliser le crayon et la main pour pointer les éléments - "hu": Use pen and hand pointers + "hu": Toll és kéz egérmutatók használata + "it": Use pen and hand pointers + "ja": ペンのポインターと手のポインターを使用する + "lolcat": uz pen adn paw pointerz "no": Use pen and hand pointers + "pt-br": Utilize os apontadores caneta e mão "ru": Использовать курсоры пера и руки - "sv": Använd penna och hand pekare + "sv": Använd penna och handpekare + "zh-hans": Use pen and hand pointers option_fadebackground: - "de": Hintergrund verblasst + "de": Hintergrund halbtransparent "es": Atenuar fondo "fi": Himmeä tausta "fr": Arrière-plan clair - "hu": Fade background + "hu": Áttetsző háttér + "it": Fade background + "ja": 背景を隠す + "lolcat": Faeded bakground "no": Fade background - "ru": Обесцветить фон + "pt-br": Esmaecer o plano de fundo + "ru": Светлый фон "sv": Mattad bakgrund + "zh-hans": Fade background option_thinlines: "de": Dünne Linien in allen Auflösungen benutzen "es": Usar líneas finas en todas las escalas "fi": Käytä aina ohuita viivoja "fr": Utiliser un trait fin à toutes les échelles - "hu": Use thin lines at all scales + "hu": Vékony vonalak használata minden méretaránynál + "it": Use thin lines at all scales + "ja": 全ての縮尺で細い線を使用する + "lolcat": uz thin linez at awl scalez "no": Use thin lines at all scales + "pt-br": Utilize linhas finas em todas as escalas "ru": Использовать тонкие линии на всех масштабах "sv": Använd tunna linjer på alla skalor + "zh-hans": Use thin lines at all scales play: - "de": Ausprobieren - "hu": Kipróbálás + "de": Üben + "es": Play + "fr": S'entrainer + "hu": Próba + "it": Play + "ja": 練習 + "lolcat": Plae + "no": Øve + "pt-br": Praticar + "ru": Тренировка + "sv": Prova + "zh-hans": Play point: "de": Punkt + "es": Punto + "fr": Point "hu": Pont + "it": Point + "ja": Point + "lolcat": Noed + "no": Punkt + "pt-br": Ponto + "ru": Точка + "sv": Nod (punkt) + "zh-hans": Point practicemode: "de": Übungsmodus "es": Modo prácticas "fi": Harjoitustila "fr": Mode d'essai - "hu": Gyakorlás mód + "hu": Gyakorló mód + "it": Practice mode + "ja": 練習モード + "lolcat": Practiec moeded "no": Øvelsesmodus + "pt-br": Modo de prática "ru": Тренировочный режим - "sv": Tränings läge + "sv": Träningsläge + "zh-hans": Practice mode prompt_accuracy: - "de": Fehlerfreiheit ist wichtig - Trage nur Orte ein, wo Du warst + "de": Fehlerfreiheit ist wichtig - nur Orte eintragen, die man kennt. "es": La precisión es importante - Mapee solo zonas en las que ha estado físicamente. - "fi": Tarkkuus on tärkeää; muokkaathan vain paikkoja, joissa olet ollut. + "fi": "Tarkkuus on tärkeää: muokkaathan vain paikkoja, joissa olet ollut." "fr": Précision importante - Éditez seulement les lieux que vous avez visités - "hu": A pontosság fontos - csak olyan helyeket térképezz, ahol már jártál + "hu": A pontosság fontos - csak olyan helyeket szerkessz, ahol már jártál + "it": Accuracy is important - only map places you've been + "ja": 正確さは大切です - 地図作りはあなたが行ったことのある場所だけにして下さい。 + "lolcat": Want acoracie - ownlee map placez yuv bein! "no": Nøyaktighet er viktig, bare kartlegg steder du har besøkt + "pt-br": Precisão é importante - apenas coloque mapas de onde você já esteve "ru": Точность важна. Составляйте карты только для тех мест, в которых вы были. "sv": Noggrannhet är viktigt - kartera bara ställen du varit + "zh-hans": Accuracy is important - only map places you've been prompt_addtorelation: "de": $1 zu einer Relation hinzufügen "es": Añadir $1 a una relación "fi": Lisä $1 relaatioon "fr": Ajouter $1 à la relation - "hu": $1 hozzáadása egy kapcsolathoz + "hu": $1 hozzáadása kapcsolathoz + "it": Add $1 to a relation + "ja": relationに $1 を追加 + "lolcat": Add $1 ta a relashun "no": Add $1 to a relation + "pt-br": Adicionar $1 a uma relação "ru": Добавить $1 в отношение - "sv": Läggtill $1 till en relation + "sv": Lägg till $1 till en relation + "zh-hans": Add $1 to a relation prompt_dontcopy: - "de": Kopiere nichts von anderen Karten + "de": Nichts von anderen Karten kopieren / abzeichnen. "es": No copie de otros mapas "fi": Älä kopioi muista kartoista "fr": Ne copiez pas d'autre cartes "hu": Ne másolj más térképekből + "it": Don't copy from other maps + "ja": 他の地図から書き写してはいけません。 + "lolcat": Do not want copi frum uddah mapz! "no": Ikke kopier fra andre kart + "pt-br": Não copie de outros mapas "ru": Не копируйте информацию с других карт "sv": Kopiera inget från andra kartor + "zh-hans": Don't copy from other maps prompt_enjoy: "de": "Und: Viel Spaß!" "es": Y páselo bien! "fi": Pidä hauskaa! "fr": Et amusez-vous bien ! - "hu": És szórakozz jól! + "hu": És jó szórakozást! + "it": And have fun! + "ja": そして何より、楽しみましょう! + "lolcat": Adn can has cheezburger! "no": Og ha det morsomt! + "pt-br": E divirta-se! "ru": Приятного вам времяпровождения! "sv": och ha roligt! + "zh-hans": And have fun! prompt_help: - "de": Anleitung für Potlatch, diesen Karten-Editor. + "de": Anleitung für Potlatch, diesen Karten-Editor "es": Encuentre cómo usar Potlatch (éste editor de mapas). "fi": Kuinka käytän Potlatchiä, tätä editoria? "fr": Découvrez comment utiliser Potlatch, cet éditeur de la carte. "hu": Nézz utána, hogyan kell használni a Potlatch-ot, ezt a térképszerkesztőt. + "it": Find out how to use Potlatch, this map editor. + "ja": この地図編集ソフトウェア(Potlatch)の使い方を表示します。 + "lolcat": Find owt hao ta uz Potlatch, dis map editerer. "no": Find out how to use Potlatch, this map editor. + "pt-br": Descubra como utilizar o Potlatch, este editor de mapas. "ru": Узнать, как пользоваться редактором. - "sv": Information hur man använder Potlatch, den här kart editorn. + "sv": Information hur man använder Potlatch, den här karteditorn. + "zh-hans": Find out how to use Potlatch, this map editor. prompt_introduction: - "de": Wähle unten eine Schaltfläche zum Editieren. Wenn Du "Start" anklickst, wirst Du die Karte sofort direkt bearbeiten - Änderungen werden meist jeden Donnerstag sichtbar. Wenn Du "Ausprobieren" anklickst, werden Deine Änderungen nicht gespeichert, also kannst Du hier das Bearbeiten üben.\n\nDenk an die Goldenen Regeln von OpenStreetMap:\n\n + "de": "Bitte unten eine Schaltfläche anklicken, um mit dem Üben bzw. Editieren zu beginnen.\n\nStart: Jede Änderung wird sofort in der Datenbank gespeichert und wird beim nächsten Rendern berücksichtigt.\nÜben: Die Änderungen werden nicht gespeichert, es kann also nichts passieren. Bitte sicherstellen, dass unten rechts der Übungsmodus angezeigt wird.\n\nBeim Editieren bitte immer an die Goldenen Regeln von OpenStreetMap denken:\n\n" "es": Seleccione uno de los botones más abajo para empezar a editar. Si pulsa "Empezar", estará editando directamente el mapa - Normalmente los cambios se mostrarán cada Jueves. Si pulsa "Jugar", sus cambios no se guardarán, de esta manera podrá practicar la edición.\n\nRecuerde las reglas de oro de OpenStreetMap:\n\n "fi": "Valitse haluamasi tila. Jos valitset aloita, pääset muokkaamaan karttaa suoraan - muutokset päivittyvät pääsivun kartalle yleensä torstaisin. Jos valitset harjoittele, tekemiäsi muutoksia ei tallenneta mihinkää, eli voit harjoitella editointia\n\nMuistathan OpenStreetMapin kultaiset säännöt:\n\n" "fr": "Choisir un bouton ci-dessous pour commencer l'édition. Si vous cliquez sur 'Start', vous éditerez directement la carte principale - les modifications sont visibles sur celle-ci généralement tous les jeudis. Si vous cliquez sur 'Play', vos modifications ne seront pas enregistrées, ainsi vous pouvez vous exercer sans risques.\n\nEt gardez en tête ces règles d'or d'OpenStreetMap :\n\n" - "hu": "Válassz az alábbi gombok közül a szerkesztéshez. Ha a 'Kezdés'-re kattintasz, akkor közvetlenül a főtérképet szerkesztheted - a módosítások általában minden csütörtökön jelennek meg. Ha a 'Kipróbálás'-ra kattintasz, akkor a módosításaid nem lesznek elmentve, így gyakorolhatod a szerkesztést.\n\nEmlékezz az OpenStreetMap aranyszabályaira:\n\n" - "no": "Velg en knapp nedenfor for å redigere. Hvis du velger 'Start' redigerer du kartet direkte, endringer blir vanligvis synlige hver torsdag. Hvis du velger 'Lek' lagres ikke endringer, så du kan øve deg på å redigere.\nHusk OpenStreetMaps gyldne regler:\n\n" - "ru": "Выберите кнопку. Если вы нажмёте «Start», вы начнёте редактировать карту. Основная карта обновляется по средам. Если вы нажмёте «Play», ваши изменения на карте сохраняться не будут и вы сможете практиковаться в редактировании.\n\nЗапомните основные правила OpenStreetMap:\n\n" - "sv": "För att börja editera, klicka på en av knapparna nedan. Om du klickar på 'Start' så arbetar du direkt mot huvudkartan, och ändringar sparas automatiskt - ändringarna syns normalt varje torsdag efter huvudkartan uppdaterats. Om du klickar 'Play' så kommer inget att sparas, ett bra sätt att träna på att använda programmet.\n\nKom ihåg OpenStreetMaps gyllene regler:\n\n" + "hu": "A szerkesztéshez válassz az alábbi gombok közül. Ha a 'Kezdés'-re kattintasz, akkor közvetlenül a főtérképet szerkesztheted - a módosítások általában minden csütörtökön jelennek meg. Ha a 'Próbá'-ra kattintasz, akkor a módosításaid nem lesznek elmentve, így gyakorolhatod a szerkesztést.\n\nEmlékezz az OpenStreetMap aranyszabályaira:\n\n" + "it": "Choose a button below to get editing. If you click 'Start', you'll be editing the main map directly - changes usually show up every Thursday. If you click 'Play', your changes won't be saved, so you can practise editing.\n\nRemember the golden rules of OpenStreetMap:\n\n" + "ja": "編集を開始する前に下のボタンを選択して下さい。 - 『開始』をクリックするとOSMの地図を直接編集します。通常では毎週木曜日に変更が表示されるようになります。 - 『練習』をクリックすると変更は保存されませんので、地図の編集作業を練習することができます。\n\nOpenStreetMapの鉄則を忘れないで下さい:\n\n" + "lolcat": "Clik ta getz editin. If yoo clik 'Staart', yoo'll b editin teh mane map - chanzes uzually show up evry Purrsdai! If yoo clik 'Plae', yur chanzes won't b saveded, sow yoo kan practies editin.\n\nCeiling Cat sais:\n\n" + "no": "Velg en knapp nedenfor for å redigere. Hvis du velger 'Start' redigerer du kartet direkte, endringer blir vanligvis synlige hver torsdag. Hvis du velger 'Øve' lagres ikke endringer, så du kan øve deg på å redigere.\nHusk OpenStreetMaps gyldne regler:\n\n" + "pt-br": "Escolha um botão abaixo para começar a editar. Se você clicar em 'Iniciar', você estará editando o mapa principal diretamente - as mudanças geralmente aparecem toda quinta-feira. Se você clicar em 'Play', as suas mudanças não serão salvas, de forma que você pode praticar a edição.\n\nLembre-se das regras de ouro do OpenStreetMap:\n\n" + "ru": "Выберите кнопку. Если вы нажмёте «Старт», вы начнёте редактировать карту. Основная карта обновляется по средам. Если вы нажмёте «Тренировка», ваши изменения на карте сохраняться не будут и вы сможете практиковаться в редактировании.\n\nЗапомните основные правила OpenStreetMap:\n\n" + "sv": "För att börja editera, klicka på en av knapparna nedan. Om du klickar på 'Start' så arbetar du direkt mot huvudkartan, och ändringar sparas automatiskt - ändringarna syns normalt varje torsdag efter huvudkartan uppdaterats. Om du klickar 'Prova' så kommer inget att sparas, ett bra sätt att träna på att använda programmet.\n\nKom ihåg OpenStreetMaps gyllene regler:\n\n" + "zh-hans": "Choose a button below to get editing. If you click 'Start', you'll be editing the main map directly - changes usually show up every Thursday. If you click 'Play', your changes won't be saved, so you can practise editing.\n\nRemember the golden rules of OpenStreetMap:\n\n" prompt_practise: - "de": Bearbeiten üben - Deine Änderungen werden nicht gespeichert. + "de": Kartographieren üben - die Änderungen werden nicht gespeichert. "es": Mapear en prácticas - Sus cambios no se guardarán. "fi": Harjoittele - muutoksiasi ei talleneta. "fr": "Essai de cartographie : vos changements ne seront pas pris en compte." - "hu": Térképezés gyakorlása - módosításaid nem lesznek elmentve. + "hu": Térképkészítés gyakorlása - módosításaid nem lesznek elmentve. + "it": Practice mapping - your changes won't be saved. + "ja": 地図の編集作業を練習します。 - あなたの変更は保存されません。 + "lolcat": Invisibl mappur - yur chanzes wont b saveded. "no": Øv på kartlegging, endringer blir ikke lagret. + "pt-br": Pratique o mapeamento - suas alterações não serão salvas. "ru": Тренировочное редактирование — ваши изменения не будут сохранены. "sv": Träna på kartering - inga ändringar kommer att sparas. + "zh-hans": Practice mapping - your changes won't be saved. prompt_revertversion: - "de": "Früher gespeicherte Version wiederherstellen:" + "de": "Frühere Version wiederherstellen:" "es": "Volver a una versión previamente guardada:" "fi": "Palauta aiempaan versioon:" "fr": "Revenir à une version sauvegardée plus récente :" "hu": "Visszaállítás egy korábbi mentett változatra:" + "it": "Revert to an earlier saved version:" + "ja": "以前に保存されたバージョンに差し戻す:" + "lolcat": "Revert ta a earliah saveded verzhun:" "no": "Tilbakestill til tidligere lagret versjon:" + "pt-br": "Retornar a uma versão previamente salva:" "ru": "Восстановить ранее сохраненную версию:" "sv": Gå tillbaks till en tidigare version + "zh-hans": "Revert to an earlier saved version:" prompt_selectrelation: - "de": Bestehende Relation zum Hinzufügen auswählen oder neue Relation erstellen. + "de": Bestehende Relation zum Hinzufügen auswählen oder neue Relation erstellen "es": Seleccionar una relación existente para añadir a ella, o crear una nueva relación. "fi": Valitse olemassa oleva relaatio, johon lisätään, tai luo uusi. "fr": Sélectionner une relation existante pour l'ajouter, ou créer une nouvelle relation. - "hu": Select an existing relation to add to, or create a new relation. + "hu": A hozzáadáshoz válassz egy meglévő kapcsolatot, vagy készíts egy újat. + "it": Select an existing relation to add to, or create a new relation. + "ja": 追加又はrelationを新規作成するために既存のrelationを選択 + "lolcat": Select a existin relashun ta add ta, or creaet a new relashun. "no": Select an existing relation to add to, or create a new relation. + "pt-br": Selecionar uma relação existente para adicionar a, ou criar, uma nova relação "ru": Выберете существующее отношение или создайте новое. - "sv": Välj en befintligrelation att addera till, eller skapa en ny relation. + "sv": Välj en befintlig relation att addera till, eller skapa en ny relation. + "zh-hans": Select an existing relation to add to, or create a new relation. prompt_start: - "de": Kartographieren mit OpenStreetMap beginnen + "de": Kartographieren in OpenStreetMap beginnen "es": Empezar a mapear con OpenStreetMap. "fi": Aloita kartan muokkaus. "fr": Démarrer la cartographie avec OpenStreetMap. - "hu": Térképezés kezdése OpenStreetMappal. - "no": Begynn å kartlegg med OpenStreetMap. + "hu": Térképkészítés kezdése OpenStreetMappal. + "it": Start mapping with OpenStreetMap. + "ja": OpenStreetMapの地図の編集作業を開始します。 + "lolcat": staart mappin wif OPENSTREETMAP. + "no": Begynn å kartlegge med OpenStreetMap. + "pt-br": Comece a mapear com o OpenStreetMap. "ru": Начать редактировать карту OpenStreetMap. "sv": Börja kartera med OpenStreetMap. + "zh-hans": Start mapping with OpenStreetMap. prompt_taggedpoints: "de": Einige Punkte auf diesem Weg tragen Attribute (Tags). Trotzdem löschen? "es": Algunos puntos de esta vía tienen parámetros (tags). Seguro que quiere borrar? "fi": Joihinkin tien pisteisiin on lisätty tageja. Haluatko varmasti perua? "fr": Certains points de ce chemin sont tagués. Souhaitez-vous les supprimer? - "hu": Ezen az úton van néhány címkézett pont. Biztosan törlöd? + "hu": Ezen a vonalon van néhány címkézett pont. Biztosan törlöd? + "it": Some of the points on this way are tagged. Really delete? + "ja": このwayに含まれているpointのいくつかにtagが付けられています。 本当に削除しますか? + "lolcat": sum uv teh pointz awn dis wai iz taggeded. reelee deleet? "no": Some of the points on this way are tagged. Really delete? - "ru": Некоторые узлы данного пути содержат теги. Действительно удалить? + "pt-br": Alguns dos pontos nesse caminho possuem tags (rótulos). Deseja realmente apagá-los? + "ru": Некоторые точки данной линии содержат теги. Действительно удалить? "sv": Några en punkterna i denna väg är taggade, vill du verkligen ta bort den? + "zh-hans": Some of the points on this way are tagged. Really delete? prompt_track: "de": Deine GPS-Aufzeichnungen (Tracks) in (gesperrte) Wege zum Editieren wandeln. "es": Convierta su track de GPS a vías (bloqueadas) para editar. "fi": Muunna GPX-jälki lukituiksi teiksi editointia varten "fr": Conversion d'une trace GPS en chemin (verrouillé) pour l'édition. - "hu": Convert your GPS track to (locked) ways for editing. + "hu": GPS nyomvonalaid átkonvertálása (zárolt) vonalakká a szerkesztéshez. + "it": Convert your GPS track to (locked) ways for editing. + "ja": あなたのGPS trackを編集用のlockされたwayに変換します。 + "lolcat": Convert yur GPZ track ta (lockeded) waiz foar editin. "no": Convert your GPS track to (locked) ways for editing. - "ru": Конвертировать GPS-трек в путь(заблокированный), для редактирования. + "pt-br": Converta a sua trilha GPS para caminhos (trancados) a serem editados. + "ru": Конвертировать GPS-трек в линию(заблокированную), для редактирования. "sv": Omvandla dina GPS spår till (låsta) vägar för editering. + "zh-hans": Convert your GPS track to (locked) ways for editing. prompt_welcome: "de": Willkommen bei OpenStreetMap! "es": Bienvenido a OpenStreetMap! "fi": "Tervetuloa OpenStreetMap:iin" "fr": Bienvenue sur OpenStreetMap ! "hu": Üdvözöllek az OpenStreetMapon! + "it": Benvenuti su OpenStreetMap! + "ja": OpenStreetMapへようこそ! + "lolcat": welcum ta OPENSTREETMAP! "no": Velkommen til OpenStreetMap! + "pt-br": Bem-vindo ao OpenStreetMap! "ru": Добро пожаловать в OpenStreetMap! "sv": Välkommen till OpenStreetMap! + "zh-hans": Welcome to OpenStreetMap! revert: "de": Vorherige Version wiederherstellen "es": Volver "fi": Kumoa "fr": Revenir - "hu": Visszaállítás + "hu": Visszaállít + "it": Revert + "ja": 差し戻し + "lolcat": Revert "no": Tilbakestill + "pt-br": Reverter "ru": Восстановить "sv": Använd denna version + "zh-hans": Revert start: "de": Start + "es": Empezar + "fr": Commencer "hu": Kezdés + "it": Start + "ja": 開始 + "lolcat": Staart + "no": Start + "pt-br": Iniciar + "ru": Старт + "sv": Start + "zh-hans": Start tip_addrelation: "de": Zu einer Relation hinzufügen "es": Añadir a una relación "fi": Lisää relaatio "fr": Ajouter à une relation "hu": Hozzáadás kapcsolathoz + "it": Add to a relation + "ja": relationへ追加 + "lolcat": Add ta a relashun "no": Legg til i en relation - "ru": Добавить новое отношение(relation) - "sv": Läggtill en ny relation + "pt-br": Adicionar a uma relação + "ru": Добавить новое отношение (relation) + "sv": Lägg till en ny relation + "zh-hans": Add to a relation tip_addtag: "de": Attribut (Tag) hinzufügen "es": Añadir un nuevo parámetro (tag) "fi": Lisää uusi tagi "fr": Ajouter un nouveau tag "hu": Új címke hozzáadása + "it": Add a new tag + "ja": 新しいtagを追加 + "lolcat": Noo tag "no": Legg til tag + "pt-br": Adicionar um novo tag (rótulo) "ru": Добавить новый тег - "sv": Läggtill en ny tag + "sv": Lägg till en ny etikett (tag) + "zh-hans": Add a new tag tip_alert: "de": Ein Fehler ist aufgetreten - Klicken für Details "es": Ha ocurrido un error - clic para detalles "fi": Tapahtui virhe - klikkaa saadaksesi lisätietoja "fr": Une erreur vient de survenir - cliquez pour plus de détails "hu": Hiba történt - kattints a részletekért + "it": An error occurred - click for details + "ja": エラーが発生しました。クリックすると詳細が表示されます。 + "lolcat": OHNOES! Errorz! - clik foar detailz "no": Det oppstod en feil, trykk for detaljer + "pt-br": Ocorreu um erro - clique para mais informações "ru": Произошла ошибка — нажмите для получения подробностей "sv": Ett fel har inträffat - klicka för detaljer + "zh-hans": An error occurred - click for details tip_anticlockwise: - "de": Geschlossener Weg gegen den Uhrzeigersinn - Klicken zum Richtung Ändern + "de": Geschlossener Weg gegen den Uhrzeigersinn - Klicken zum Ändern der Richtung "es": Vía circular en el sentido contrario de las agujas del reloj - clic para invertir la dirección de la vía "fi": Vastapäivään sulkeutuva tie - klikkaa kääntääksesi "fr": Circulation dans le sens inverse des aiguilles d'une montre (trigonométrique) - Cliquez pour inverser le sens - "hu": Órajárással ellentétes körút - kattints a megfordításhoz + "hu": Órajárással ellentétes körkörös vonal - kattints a megfordításhoz + "it": Anti-clockwise circular way - click to reverse + "ja": 反時計回りのcircular way - クリックして反転 + "lolcat": Anti-clockwyez circlar wai - clik ta bakwadz "no": Sirkulær vei mot klokka, trykk for å snu - "ru": Замкнутый путь против часовой стрелки - изменить на противоположный - "sv": Vägen är rund, riktad moturs, klicka för att vända rikting + "pt-br": Caminho circular no sentido anti-horário - clique para inverter + "ru": Замкнутая линия против часовой стрелки - изменить на противоположное + "sv": Vägen är rund, riktad moturs, klicka för att vända riktning + "zh-hans": Anti-clockwise circular way - click to reverse tip_clockwise: - "de": Geschlossener Weg im Uhrzeigersinn - Klicken zum Richtung Ändern + "de": Geschlossener Weg im Uhrzeigersinn - Klicken zum Ändern der Richtung "es": Vía circular en el sentido de las agujas del reloj - clic para invertir la dirección de la vía "fi": Myötäpäivään sulkeutuva tie - klikkaa kääntääksesi "fr": Circulation dans le sens des aiguilles d'une montre - Cliquez pour inverser le sens - "hu": Órajárással egyező körút - kattints a megfordításhoz + "hu": Órajárással egyező körkörös vonal - kattints a megfordításhoz + "it": Clockwise circular way - click to reverse + "ja": 時計回りのcircular way - クリックして反転 + "lolcat": Clockwyez circlar wai - clik ta bakwadz "no": Sirkulær vei med klokka, trykk for å snu - "ru": Замкнутый путь по часовой стрелке - изменить на противоположный - "sv": Vägen är rund riktad medurs, klicka för att vända riktning + "pt-br": Caminho circular no sentido horário - clique para inverter + "ru": Замкнутая линия по часовой стрелке - изменить на противоположное + "sv": Vägen är rund, riktad medurs, klicka för att vända riktning + "zh-hans": Clockwise circular way - click to reverse tip_direction: "de": Richtung des Weges - Klicken zum Ändern "es": Dirección de la vía - clic para invertir la dirección de la vía "fi": Tien suunta - klikkaa kääntääksesi "fr": Direction du chemin - cliquez pour inverser - "hu": Út iránya - kattints a megfordításhoz + "hu": Vonal iránya - kattints a megfordításhoz + "it": Direction of way - click to reverse + "ja": wayの方向 - クリックして反転 + "lolcat": Direcshun uv wai - clik ta bakwadz "no": Veiretning, trykk for å snu - "ru": Направление пути — изменить на противоположный + "pt-br": Direção do caminho - clique para inverter + "ru": Направление линие — изменить на противоположное "sv": Vägens riktning - klicka för att vända vägen + "zh-hans": Direction of way - click to reverse tip_gps: - "de": GPS-Aufzeichnungen (Tracks) einblenden (G) + "de": GPS-Aufzeichnungen (Tracks) einblenden (g/G) "es": Mostrar los tracks de GPS (G) "fi": Näytä GPS-jäljet (G) - "fr": Afficher la trace GPS (G) - "hu": GPS útvonalak megjelenítése (G) + "fr": Afficher les traces GPS (G) + "hu": GPS nyomvonalak megjelenítésének + "it": Show GPS tracks (G) + "ja": GPS trackを表示 (G) + "lolcat": Show GPZ tracks (G) "no": Vis GPS sporlogger (G) + "pt-br": Mostrar trilhas do GPS "ru": Показать GPS треки (G) "sv": Visa GPS spår (G) + "zh-hans": Show GPS tracks (G) tip_noundo: "de": Es gibt nichts rückgängig zu machen. "es": Nada que deshacer "fi": Ei kumottavaa "fr": Rien à annuler "hu": Nincs mit visszavonni + "it": Nothing to undo + "ja": 取消対象無し + "lolcat": nofin ta undo "no": Ingenting å angre + "pt-br": Nada para desfazer "ru": Нечего отменять "sv": Finns inget att ångra + "zh-hans": Nothing to undo tip_options: "de": Optionen ändern (Kartenhintergrund) "es": Opciones (elegir el fondo del mapa) "fi": Asetukset (valitse kartan tausta) "fr": Options (choix de la carte d'arrière plan) "hu": Beállítások módosítása (térképháttér kiválasztása) + "it": Set options (choose the map background) + "ja": オプション設定 (地図背景の選択) + "lolcat": Set optionz (chooes teh map bakgrownd) "no": Sett valg (velg kartbakgrunn) + "pt-br": Configurar opções (escolha o plano de fundo do mapa) "ru": Задать настройки (выбрать карту-подложку) - "sv": Ändra inställningar (välj bakgrunds karta) + "sv": Ändra inställningar (välj bakgrundskarta) + "zh-hans": Set options (choose the map background) tip_presettype: - "de": Wähle die Art der Voreinstellungen, die im Menü angeboten werden sollen. + "de": Art der Voreinstellungen wählen, die im Menü angeboten werden sollen "es": Seleccionar que tipo de parámetros (tags) preestablecidos se ofrecen en el menú. "fi": Valitse millaisia pohjia on tarjolla valikossa. "fr": Sélectionner le type de paramètres proposés dans le menu de sélection. - "hu": Choose what type of presets are offered in the menu. + "hu": Válaszd ki, hogy milyen típusú sablonok legyenek a menüben. + "it": Choose what type of presets are offered in the menu. + "ja": 提供されているプリセットの種類をメニューから選択します。 + "lolcat": Chooes whut tyep uv presetz iz ofered in teh menu. "no": Choose what type of presets are offered in the menu. + "pt-br": Escolha quais tipos predefinidos são oferecidos neste menu. "ru": Выберете какой набор тегов отображать в меню. - "sv": Välj vilka typer an inställningar som syns i menyn. + "sv": Välj vilka typer av inställningar som syns i menyn. + "zh-hans": Choose what type of presets are offered in the menu. tip_repeattag: "de": Attribute (Tags) vom vorher markierten Weg übernehmen (R) "es": Repetir los parámetros (tags) de la vía seleccionada previamente (R) "fi": Toista tagit viimeksi valitusta tiestä (R) "fr": Recopier les informations du chemin sélectionné précédemment (R) - "hu": Az előzőleg kiválasztott út címkéinek megismétlése (R) + "hu": Az előzőleg kiválasztott vonal címkéinek megismétlése (R) + "it": Repeat tags from the previously selected way (R) + "ja": 前回選択したwayのtagを繰り返す (R) + "lolcat": Repeat tagz frum teh previously selecteded wai (R) "no": Repeter tagger fra siste valgte vei (R) - "ru": Повторить теги с предыдущего выбранного пути (R) - "sv": Kopiera taggarna från den senast valda vägen (R) + "pt-br": Repetir tags (rótulos) do caminho previamente selecionado (R) + "ru": Повторить теги с предыдущей выбранной линии (R) + "sv": Kopiera etiketterna (taggarna) från den senast valda vägen (R) + "zh-hans": Repeat tags from the previously selected way (R) tip_revertversion: - "de": Version zum Wiederherstellen wählen + "de": Version zur Wiederherstellung wählen "es": Elige la versión a la que volver. "fi": Valitse versio, johon palautetaan "fr": Choisissez la version vers laquelle revenir "hu": Válaszd ki a változatot a visszaállításhoz + "it": Choose the version to revert to + "ja": 差し戻し先のバージョンを選択 + "lolcat": Chooes teh verzhun ta revert ta "no": Velg versjonen det skal tilbakestilles til + "pt-br": Escolha a versão para reverter "ru": Выберете версию для воосстановления "sv": Välj version som ska användas + "zh-hans": Choose the version to revert to tip_selectrelation: - "de": Zur markierten Route hinzufügen ?Route or Way? + "de": Zur markierten Route hinzufügen "es": Añadir a la ruta seleccionada "fi": Lisää valittuun reittiin "fr": Ajouter à la route choisie - "hu": Hozzáadás a kiválasztott útvonalhoz + "hu": Hozzáadás a kiválasztott kapcsolathoz + "it": Add to the chosen route + "ja": 選択したrouteへ追加 + "lolcat": Add ta teh chosen rouet "no": Add to the chosen route + "pt-br": Adicionar à rota escolhida "ru": Добавить в выбранное отношение "sv": Addera till den valda rutten + "zh-hans": Add to the chosen route tip_splitway: - "de": Weg am markierten Punkt auftrennen (X) + "de": Weg am ausgewählten Punkt auftrennen (x) "es": Dividir la vía en el punto seleccionado (X) "fi": Katkaise tie valitusta kohtaa (X) - "fr": scinder le chemin au point sélectionné (X) - "hu": Út kettévágása a kijelölt pontnál (X) + "fr": Scinder le chemin au point sélectionné (X) + "hu": Vonal kettévágása a kijelölt pontnál + "it": Separa una way nel punto selezionato (X) + "ja": 選択したpointでwayを分割 (X) + "lolcat": spleet wai at selecteded noed (X) "no": Del vei i valgt punkt (X) - "ru": Разделить путь в текущем узле (X) + "pt-br": Dividir caminho no ponto selecionado + "ru": Разделить линию в текущей точке (X) "sv": Dela upp vägen i två delar vid den valda punkten (x) + "zh-hans": Split way at selected point (X) tip_undo: "de": $1 rückgängig machen (Z) "es": Deshacer $1 (Z) "fi": Kumoa $1 (Z) "fr": Annuler l'opération $1 (Z) "hu": $1 visszavonása (Z) + "it": Undo $1 (Z) + "ja": $1 を取り消し (Z) + "lolcat": Undo $1 (Z) "no": Undo $1 (Z) + "pt-br": Desfazer $1 (Z) "ru": Отменить $1 (Z) "sv": Ångra $1 (Z) + "zh-hans": Undo $1 (Z) track: - "de": "to track: Weg aufzeichnen, the track: GPS-Aufzeichnung (Track)" + "de": GPS-Aufzeichnung "es": Track "fi": Jälki "fr": Trace - "hu": Útvonal + "hu": Nyomvonal + "it": Track + "ja": 軌跡 + "lolcat": Trak "no": Track + "pt-br": Trilha "ru": Трек "sv": Spår + "zh-hans": Track way: "de": Weg - "hu": Út + "es": Vía + "fr": Chemin + "hu": Vonal + "it": Way + "ja": Way + "lolcat": Wai + "no": Vei + "pt-br": Caminho + "ru": Линия + "sv": Väg + "zh-hans": Way diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index c372a9d70fc6d67f3caed8499decf1d92f464981..eaa1ff76fa1a7323082dea5cf611c4ba3a056ec4 100755 GIT binary patch literal 150828 zcmdqKcVJXi`agW8gv6Gx9$kF2+eLx+wYwb=yz z9qlk?(D$D&`=xs1c{3}f6+a-v0k=)qL>k^5aNCVLhjHgL?h=fobTapyAb+{Rs! zao1YiO>wmqdDTz+BZB9B`}Q5Rb(UC-ZFAF&J4MR8A!E06o^6|XamSZ4mpS){#rF+= zYuT{b_Q$X2c=z5dLcHj1gNB#1YGo5`1tUGpRSF306i_<@WsnMTUqHTkf#{sFzQ>D6 z$zto{m-)BtvM&|G7H>E_vTL%djqKS;UbZ&&SJ^5nKj+gEC%`9W8iLFTWq#KL*cE7CcRw{2pxo7(6>$ z@Qml+@nQSN;Mv83XVdcbTe1CP@a$^Av!&T_?AZP>c%Ep%^VjF{v0(eh;MvWB=do&@ zma+X~@a%5E^S9~A=CJ)^@a$p1^LVs+V{HEzJWsOVdHgoWitQhRXHN^Bzt>_)Z2#AI z9(6wjyV+ihlpaS1vikCW@IdS^sMcqP=oItp6mV^1?KEniAiBgnw-Q}ro)g81G0!g1 zE#}!Ry2m^xi5@Y}t;I<(&uv6c^I3?=uHIti?8Bp9gd4b7n0}Y&+HORqSMVfE3lJQCJPu6|<5#a%n2_$XXd(Z2Jy z!&Y`4S2%9ixB$BDtE>0Z)d%S6sNJY~e_efmtUlQ_P~?jPqD?)adc{%OXf!%{v_qFP zN8fjE%oR6|7M<=FqSdS~`d?U;JaFdiXRf_(;-4q(J@Dp@Z`_FPlQq1765a?`N|W$9 z?LBa#I8Z7E!6EH*)tgT{56#YNo%@e^fEc7fq(~6cT+@Nd5Rvy#mp{$KJN!Fp>(7@C z$%z}flP5Z|o;}grHqsM)xt=}I>0|P3(^vK$cgDDW~8gCJ>cP=Xy0Yd{JvX+7}VZgpLisBq&qi%cv*DD zUFQWa5F*)?D(1PCrOZu{<3jCO_JivZzPP3I#USbI^)Z5?WJ-5EuRuZU0G zL-ojq37TGZF`Task;+%67$GS#$u&yM{b22cQq({H{PPL>lj~bmC4BnR^Xmt7J~U{y zNLc-ut19t!(RWwL#9+Jo?Po7@+!4O+GO=3pc8wN!2W{uIGDm(w`Xh(Fxca9xr<`T8 z3y!Isjo;Yg#&3vg zoXGmD|Ha+S{u2u~E%}r9Jgv(IQz|mEPHV^>nQ+y6Pi?+g^m2_C*`o^G-cVNnz>TPXPE>C(OYr`{V-}}+Q0UcM>_i{}X zd5ir^-Z$&^todc9>CmRJJL5>$Z!;QFj`IV~kKS-&jS$af*cF`RWuC z_?jRl^0k$i#MeY|iYD=t-$CN3BIkwmRuXqF+*HOS?mMOC>Fm3R#FwW&wT?(UP2{Yo zvXb~j+m!uRzP)1Co_mSJX(H?NWGji?|6X!+mVHh2yKP5Y-sOSpm9L$BSMtH09f-u~ zA}{T9D~X-sf7$*0(nWj5{Xit1F7jOOSxMaX^M^*9x@!BQ10Q+swM^$-b9Wu=x3v3t z*DnNCGep)SJ**`D;_Ywm4OIT8?CsMvi6?6kPhry8#ZOXq7V0R@KV zL@`5?c;<1FcpAnk#4M53?QQ?pz(dZY&L4gq{p5_u!s+MsJ3MGc%1^g7%xdU6>K0F+ ze$XxVS5zOG`N6cyiW|PZE`P$T-ru~uvmQ}y7QkeR+>FQkIVPB24t;k+mkvqxEc?TQ zA03r*P3_S$f9m~7+OoRt8)nUZY|p0Qx4Qr7d|~zT)%F=_>35f3|J3zc+OMe>0{|^| z)p!54KzhC8rR6{U_m0669%$3Q)r_m|xX&X}UD+b*$)~Gdtv8fQ;;5c`|9v=ZOntZ2 z9d;$%wPMGhZlmtbeB@BavQ`J{N4RE-+{oS4hs^rj|MTuy_hwdn*dc#;=1Uh8h)tgz zxUj<3qoMUvZOiJRf#!&5^>2*Fc%<^`{7&BLUXKqF8!s&FwTMhjw|3>NS2{`o21FYU(@hpY=)R866*5>=Dsz;RtB7N(E?fFKPR^M&>@uCw{ zm8VhVYj?gT!aPNU0!4)Re07RKz9xtTnkb8ondR+yDlzxGVDb`?`&ftQP?Lx$SNv^h>wE6q@Xt1ZfBf_5>wKy9 z$&T|b-#29HR~xT+@I!B(&n7?Iu7AR-t6yDjA7D>eec9FlgRXp`TXHM0`?J~a^}1)K zcWBD%V?I9lqes@f(DCTt6iC5BO@Kv;0E-m?mdFA3b}bbPtM->WYi(lx{{3w2FFJp1 zzp7U!Z}{foML-l&M4ToTe!4Tb%42YQ{ER^>AKUSb@1N;8Z$7o{`PXJ$xcM(Rfvqb_ zzp3uNW&87&Y7CtsO&{{iua`&5n0QiaTE8i_N01qsNoC=!c$ zT=#ju?}e>5PYPRdr|bTd@J+S6D~_zJox^CNnrXL?$b3gXDDQfG&0^6ks0hN7CEIO7EMHZ<-<&# z{pfiM9@^b==;E$7ymrBBNef>&|B)Zx6e7h{BC;+X^sH&DyR?~j?$6GFyVD=I@W_V8 zUQ2AX`}~@3?)8Yl$jZ(edFP5%5O@VNtM^0iudh5jE9o`&_TBZnS6#Qe&sXQ|nGR2G znZ_J41TAG3#fqmTe02&q)M+4CZ&z81Bbf%?3sEi>K6md|ed~>m$6YY6^r|t}y53v4 zVS!`b59?}Pd3Zp1*^%|2obox?enWUL8DP z@%E8b`@cH+>bzT~zBphcgvW=n3bF9Tt1sHN%;+HN)5|v8(<8l1hpIi`l3D{knHB4kgEf&$)TQxW}))`|iuX7ALuui}aHp zzUhGR*7?%8g>NTK+Oub9LvPm#k=L+f&J)5waaz*tO9w7__1s8#`QEhe-9EfwdjXu8 z;^m6s6^i11z9xv}d~GFGXbx1i$brGGpqRI7=LMy!jh=^J*fp(e&fv~}y})!8)YW+1ECdMpNIt?zQqC zXHWZanc`qrEL^wi^Q~zn%o7$mTu)zkM)41??s9KP>$>ruOS1-FH~q3Fk_$$*elR_$ zef^qN!#d_K9)I}SFZvxht_OLi*>8RBejsUw=;^8!6Td6`3J{eQ{p4T&*>ghW1J55hpWdz% zQ+K_RYQFvPaP)z$Rd3IIv}^|)1!zhUz)NO)B{SA8f_!y|5MP}Fi%58%AkO4#D-q^v zqKNR-C8B(Fi)y|miIrL~YFiYHX|8EDA?n1!2e*DcAWNg)W#~Ht=RN=U3G4gJC`nG6 z>_6DL{Hfw^Ke>Kqo6>=M2fq5q^~p2VZOgc+;?kr2+I?C7_~`>ibh|d=$Bv$)tTFw+ z&)6~Dp4Mg8#xIv1X+PqMY0r$vsc3N8`-#P4`Z{+^f4qIl3e1Q_t|$nzVFLh|FzYB zWzE3kzMD>5((d14TmIaXmpn((#OMc~z2Nha=Z>y_uV2Hb=lAfm-FRN_5$}9|=f}nS ze!9r}4=e(8%tu;hjp$?_WKY@TFZsS|u&~d&wY#uiJZ6AMq`11)o+i$5pYp)eTPA#3 ze`3G6hp%~W#{iL3f2r-C!j{z_iaWe{0jex^w-@;(S(iU};HG<~txCC~eLjR2R$iPX z<`r!C=|Xen536rA(sAvjAKbd>rT5n@&*N*;RGR zlRMIe*xaoO!^LBKt8FKAy?pfzFHJk)$hG(UWuqAHI$LBdDY^X!q(ezx>vwv-`th7R zS4rlIDNmjELiq0wRG%{Gi5p*i?y1UU&dVC6j#)DFxh&Dgb&i-E>~Wx8x9j{y|8*j% zVZbEsf7W((E(Xfef%3T`Gwqjr=mZ5^j9nt^-}U`shoj`Jv~DjJcb)!Rch^;a{Xk5( zz}2tngw?mDdYlJNw~us$uekI6GZsGlC6Wr~iL`I}`~Y(zVRU|B)S8p7`8MO60iWgU zyy+jqe*X0Ey$6t#Iv?udgSTl8sJ^-sZ<;jr-Vf3)OB1Kriw5sX+HmOk9?1tcF8E>Q z+nJxw_$6aW^{xL(!}Orwp+--SS{83RB$lRw14O5*Q=HA$1aS^uTVZ5Wo+!@at4o}( zr^5v;PKOlNg(B;Yo+-1@pHgcHvmdhE^-JlrF@IgZ=I#|Ay|VYI!6RS(v0<=lm6$!{ zV{6Tn|GOt`=(Hv6o*(5a8(Q!~b?SYW&mCjm1zN)s78i+ydv33szQzEYea-V%We+}- ze!;@Ad+)vej@ISHPrS4$JgIlXwx7k2HAz`%>s(b&tQ^&_ar*R*{W?7}EB)?~DQWII zmM*{lZ`-P1hb|VgJN)&DZ%m4&$gDIVemGyn~@!&qn4{>T6J`J&>RSH6Z0R*QxAT=hIfCw=qW0LQCe zUi|V$BW^tRhs&>eVr~EP=DpG2TsiLRsaKwI^Pz?-#qA$FvHE9mhL||z&KrD3zpGpW zSMV}TuFHA&c8rLJKi+kfn0x5pgwc4fQ(;%HT;?i2uddyH#h^4{zx4Yjca2__xMS_6 zQSHQ_1~Fx0w_oz}VOp*hx!*ii)6t~K_Z|P68hmAU$KajyyrXm*CkxsHF;@unt<$FD`thqzJwH83X7I)z&E$AynnR4?zuhp=YkMx zbjNE|$MEgY4hnDG@eyL6YrV+X{7OQ1gAiT1dfwgh=#O{q={(?^1pkY7=KTEGzV>2} zYlE2CVSm+PLx%o+d-XdBDSruxz`!pYMa9p|X?Xnm^S>7ZUDu1;=gwSy5SS`W(6wq} z*W11x*J<~K^X~I)fA{2PZ&>~_yorq>XN_&`CuY5IIj?)C&JqI-JURAS=jo|GjNd+0 zwEFASkA9x^wfj0f@O5h7>lMW}@YN}<=W7BCk|M|r$48J!uFZ%Zl4lM#@oN8%ht{s0 z7yQq&!*;Jt>Og_)vXov*-5x-o10>K7VCR zK?B5ni^!{uSYCJj?uwOnzjgSw-S5r;UN>pH{-p4_S>d%s;x!F=Pl#I)-xUjYiX0r2 zAO1o4&3HWX!{-|M+&1q1jXS%R-m>joTk5Xf3!ijs$mQGm&n|8F=_-gpjZ$BOrSOgZ`F7m##CodEN`-d*P@WP|EWKTlT%J0^0-f`MRqMK`nSX42% z-+=~tP2;mApT2d(JGp3hhgh_+NB_&em*vR1r*ED3#>O{iyixJyBMAC#(@1SsG`wBW za0g$V;tq}MoyU&sT`ePfceBXe(-N{C*S#YDfX_1r*%yZz<&1uRf9v3cq)Re7t?2JT zVrHiv&YfyFcd6mrt%h?CUlYW=dRX@z`>^hBd02mLc32OzG_2mP-6H?XrTtq&ZyUpU zeAJtz3DYmUVAlZ*YL_0=eQHqmt3mx)4e9|ksNH%{e>wI+J=pS~9%^<_ds`aRMAtr% zzh~LjFFsYWZD)pc7@JW%>cEzy!F?|hx7H6XzP8F&pS`T>l7TncO6wQjc5R2PlwI4S z$NLvG-UroqA5!DptH!%ekN1&dAMgH_$NOlr<85epypI{<<@xtp#`~}y?;~ow`_*{i z1+lx^pvL={9PhLf+5!AXw5sve3A+gU0^X=U6ci4z!dJJ_8>sdPCzV$EDvNz#kszwV zp{g2xuryR7TH(PL@kJ|r!D>W8d~u1A3SY^J;!v${i?FxU9}-EzTOAFF)}k_0>J5lC zvbZQzRwho+_d%@5*Hrk!0ntlTh5Vuq{q+Y4slLJ+EU5^EMSpcu;SWYdvN$Ugs`LlN zAifDzN5x=K+%W!dF`o@K(y9j1=KeRNjseB~+otAMuIF02lR}&lw_8;*Uf^ z;fRH0Amst)@jm13DL2zsN{VGPu#3u?Sk zUzmmx&?VuJw-lj?BwtZUT}i-4@9T9**y|5a!DYIjEEI}T!IdJ2n$c(&5h+lQ_)5Z| zNJLym#o&_I1YTA7ycjO3+=S9vdAm(ic!Q@rFd89>QH_dd zv})3b5h7aQkBA~F86hH70e@6*ZQlq~tfgWR^#^=JV1KO`Q5A|p{7NcD)Kz+`MyCR{ zsPk5YKwz{l#i&wiD+AOrQe8$3=10BdJ`t%1)#Q)}dISFQpeURRMtTFjoKUGx1Vi)b z9#o0=&+^UnN20zU#5k{bxvwNDLcszqSFaaIvG$gh8WpR&L0_Q4=P$2_ilQ)>Ab^=D z34_GGnUz)1x}4BTzi&psUxgQu6_GQmy=0s)d4ce03S2njn?tgZ2?$sX&patMQit-8x0lI-0{G0CeSD zad|DY0;ng7%j?t~3qSz#1t9nyT}JhNm>5Hxm9GSF_D1-xBp^hElowC_2;C{Vdh3`N z@(Gd~A$234P&)#(AgG%{$Yz9wn}x|UqdE-b0GZ(dfyh;0JCqHCC=>|ft%O*i%(z#@ z&`Y`$ws6DAn-4x)i2Otc89mqZtVQ-mcyVC-_P=_l~9BvcKZ zh?_{*cV@K@?1y^crxKrkB_1$zSqC?kI`T=?0aOL2!e3Hh0VE$)tqh10vkdCGq=Gu( zCpp1HY1ms%GX&Qf#*$yg-9`PCn3=4w{H1gQDDsBHP~M>lZqmbHC8QBiQXPhDM#=s} z>#88Nq;MdJbPrJt(F=N%6Nn@)>J3A3S;Ii4lnhnDa79A_Ul>-!CyM>$zS44EQNXwh z8+XOVT~tK8M8ycifGpemI#9S$lz6MW#eOI?Kcpn!4VG7vI-(nquQZuwWa_AqUJ-#} zBCFsNq{T!rBp~3egT%njK=lOyyVPG<3^iIF1}jT3*hn-~sfI{eG)U?qg82$9>Wx%r z>*p_0W)KSBTT;Q=h~H%g4ZA4okcFhWdAOFq7?k_wlV*elGR&U8$hfVENOipkIV5QK>%+$tG6= zdR3X{qLu!LzZmMe$Q!7t@Pe(FRS_Q{k)f-5LS>B0a8C(MKTkB|QPmg`6Rc_3{YB>e z3~m2CCH`rTs#XhIQlNfGPJ|@ty0EoNuqjeZMdmjEGzJ#GzNGL>Z zh(w^A2FovqJ-fsT;Gu8KD3)ulX$IXJyYS6#fXSOzH6$ z9YFt=mKKHzv?ojbfo@)iiSliUdZ=SOTU;i8k>#O)T`58{;wcMN->p^zsK(vn1TVNy~R zTOTfG{1wSfT8hW)xs-gaDi4` zP&Lpu>@SgKnB|8J7M0b2Kq4<{;Fl~4!(bHS2HHa6?B%(a*tCJ0jL2~YmZZNh$saY=TQm|A6 zhR7>IA&QZxKweRR$6`bpD-a@ya(z4+dN#+ZZj< zVr2NLbIF|wL#zTm>#g>VsSjUxkr##yJ%xRhAq+0p7o8Cb29?e(k+*PN;DbjILO>*I zv9`jB0KyNe3Q3O?V(LJ7v5y&whLo))2Y43dQ+gn4 z6cnz8y(8&_y(VN<`ZB8N2~t2l9Th0K5euLZfe?sBx)B2p_@X`*MN#VWRm})h)!_z( zq)ffih9Rhd8e~7DmUIwMk@m4vz-ou2pA64~{bra;;%JHRVj*3Mb!ky?oroYt0eVrm z6X8kl9ZP++d1WG<1J`_VRD?l%h4Lcu$lwP-?7%LJAR4O5z#Jly17k!DmE;s6bdXmb zknE9O^PL<;eqOflvMDVx-!HEYO6wYd7ZlC))qv6h-cTX=UTitp3*)E+-I5|M#W3LJ zSQKdmBpxvpVjnpMbc~UZ4uD{>d;?-W1v!|8)s>h$F}-o*lDJh;X{Z{yP7ZrSfe$WXFbT#ANPAd6vhpp3SRi*oG6HhUQ~?S+ZtEkDUB5$n zearqA2b)qM218K05?Savj`zV(Mi43i1r#xrlPU<$Ku-}R#97373^q)-N!$(pYdMAr zn_=<~BdGMj_m=#kR=SZ)G%%bdfSC39CEJ#;wl{t(*)mj;WH|t$4&+Mf#3B_K7uCtw zmnMeHTV=2!;J^vfAC#*KVTw{PSKy1l7-7hK;X%MIfYy{R3HWA`afZr};s%8UZ4?D^ z(j<*$o5xAtRw$e!^K6(`)QcRO zgr#u~`q72dMzV5VnFgTh&)1P*2*%1E^ag5$zN<5(n&2BkZP6i0q`?a{`RA*o26O}I z*ErQG28@Cx<@QAcGJ?cYP@GA(Dzf51Bf{cGWz37B@)7X?+4iEad@NRv#fooGD3L6U z2WiH<`8md5Ay&okPgxI5@(2&oeB@sSeNlK7Fq^(Ip)@OntSMr!hZUfV7nLgrI_Hx1 zWtN%Ds-c=-pUfIc8$-16LFTJS1k9>Ir19uk)#X`Be{=)`Egyh!;Oqm>K)&O*5mAZ% zbF7@NHLEdN!T^$vd;+{AZ(R`#EK2whVF6h}s|=7*CgVlbaLd(7{qQ32prODX)6}6M zL%_KTX*SiwC_^>6M+YPcN*=8b2*qHP$<>p0@*RPecih@n>W>+LFS7$T!LI3yaQ8w0E&GbX}L8foX(ULrCcHXp$La?M$CZv!_Z6Q z1tlI#!q^xGh$B5oVGev|Eu2UpVs=t}s*KR17J8nnno&cS7zF?z4Y-)WPP_`;jQ0|6 z<8c-SX9=}D@DmZjaNuJd4$&3pi6Uu};6)-~5JJ*J6jdRI2d$nq)N!U)ix)_;K({fRVfL=hDa`?FzH6tj^}@nCuAB~ zTbU`7(pmv05E-iAXpx_dk<`G)5Ve$3uA}5~E&T}v=laT`*guMaVIt>{p)Un>BC5cY zZCQbES1Q6Etw0O`?+Z$g8WWlzI2U9vGz9~^Kr+%N=EFm#gb#6&DIf8Kf_U;rC^jWw zpy(X^r+NyYaS@ZtKBp-GE0S+zQ&AH}l*Z-)$zDudI5HF^LwysDmWY8K*{sox7oj^? zua-)1wKyN-@KQ27-E{QRqnylz`HU74_1I-eN9CkOGCAg z8YZ;_7n*_^dX&;a7K!5+M$>di>2VSMBkoEmf-oS{1&2)fO&s!iIU0l5Vs0Q|D>&H1 z=-|pzR17B{Dbfhi5S7ZUU~ONZC#6Kj$ouh)3ac#W81Iq5l51d04>gN;I3z!40pSlJ z@MC(>s9?m2$H?ZWff@BE6+<4$RjsmyugOeB1W(-2n11Ot|Y!;Qp)-abFo`3K+dq zGtVNQnx1l^NO)LotHo@`Y=p*Te}vn{c7sl68iGDFBfZ2N4a-1`1FJI5VAIm0ygRc- zL~6WM8MLGYi&_nSFCxbB9cxZrN-*^XBgIxxt7(2P7aYJQShYH{g(?sQlrSc5o-fjc zS7q{|4WBn0@FSMtw7y4a;z?R*$mUuDga;m_m|>B+SnJQ!y z@hYlbE8O&xvIiP}9wInnj?5UeN@kRb1=$6>tS&tg1g|s~>gZ2tC@(mJQ~P>Z9kM4a zZIseP(pG1YV^&VdK=xTE=d>VuhF-LnsgE+9J%ARYXb^QM2$d$1JhTPb?4lsIs6q^( zv%!>8hCdX=Dhv8t#7Q_Z%F@z90awa97JXz=oMQ#zI&mTIh+y?o&MgZ=b9rTy-GFSJk(HT`^fCm|Goh_1`vb)wJwvROLe&OW zNS9XXB_nrJfEyt!FINaD5Fxp=UCbO0@Lyjo zCn-6#IG+|vQAf#zT=N8%>;nl3 ztQ+DFQa{{M?izuwg!&YKMf5Bo#SO(l07-?&8Zx~O>sEsG0apA_GSrnN4+VWr-eWc| zy(;{qZjmquBKhjnW0BzP6pW~voi)fod)P}ddX2E}fF)+6CQ8Y_B-KV>QhCZsP;4M^ zE2=n-tiqBadcj{J9{g0ck}MI~LA6qzjw~({AzB8M$(mDj{KpU=?3}Mhikg?XDAx-Q z1#4}b+{E&7l)OkOlQSqV#@8D)wE{UwstUEkD9}Btqbhg`90`KTbI=dPSg>eOUm5$- zrqF{f(!Ita43_>7T!qNa5HfhhLm(?!NIILbMyc5vofgQHiCB;?GV&JXGCDI!+6i9? zIu&V(Dt;mI)l#flRAMbl7EIKtIE>Q7ycz^6j$7I~fn`XUPbvvSeb=Mpk0V6o%yD2|PMT zVXaggSn)0){Sr}nL|!7166jNzF3h0hu1YTBhSsqe7c$?aQu<0HWgtN;37|FN3O^?J z890FfdpWRaMY1@g%u6YDSWRL5E}cd4SS1WFhhdO3sVPA(L495wk!o4)S)!#j@|f_! zkqluNf(LFQ61@;kjFY_|%HsfIy1@A~@(}^bTL3OiESayB;IxB^%~r)Skg6p+2mMf| zuC(ld{1aTA(R7Omk7r06U64&kjST1*= zfP7H0tQ?lm?j=^ab>vwQtJtLxb?8Pv5+n*NBgk2Vg4~2=<$PXP$yddks*~v_-UTBW z&9~Za)a76ujT(}QU+!J$C6!tgog^h5!N7`03eFLsO#oQNU>j73G0&^^VOoITl3KF% zT&fMM*w`ScuC^t}p-G>uMp{;OWX9J86X0vLj(Y_@@abA zTraj51=EA2rvg0=ftX?>JWMOZA&3VXHGtD!RmV$m*%?5$3*1!<{AF4f8I&F3O% zxY4qbcHxlS2+?jZ4*8+E)V)ZbKOcE86o){RN;-&Ned(hUTt0$|BO^woj!YdnBIfPzi6ci&9Ch*tk-EGJYx;7xqX7i!(}!)b3W!Lp z0?l+CZw2=gTcwcu;r3M(RU?k2GN5BhM^j_!SHQUV!ti3@by)_$9+3eRsvVpAN>fXH zE1N(iScT1*8rfr`3I*;!$DqkH$`efy11WKY3#E?u!cSUxqJ(uSu9p3Zc;cOfQ?Ra1 z`{Zh{2rcsY76B)1L#hBy?5$A48Ehc?26GQ zQn5H^E)|r9O7M-j6kJw4yhsWI$%c{=gZ@BiE@xnPW{+aKlnWxunLZkk$qIRUGTlae z2&72`jG-quukaNkzI@Ic*5I)QX(uG^I9Q%Ruo<4Ty@*ppq^=TmqD8o3>i|+>kbZiW zPBQP#K`IX6$8u@n^=31Ho!F!z8U5N4O?Zcx9FTP{tZ-`Rs0yCV|UX1?8{+&LQQnQ%;qeXvjxmqL6y0 zTo%1Vx;q$(dWwA>_WeC6P?{A`;GVir^`MnV5aK!bC)IeJ+t&;w$UC8gu(NXMnJBtM($sbktiE>)u*Zk=Yy)LZ4Q(b z$%A@@0fA=B@mBREvr8)!3XYBuy&f6Hg3U-jQ!}`f9<`p6>d7u6ZhPd?^B}lL;pm`Y z9zhZi2#{!~nlhfl%7X`r$s@CC$PQz373W7Hp6W<7=Zk6cxCcRjhmtgPp27+&)s=ed z;(N-+c1?7Ie!>Qb8kQCGDZOfz3q}qrD^=Ku5JfUkX(RKH%;6wCjmo(e<_9wb=|rul-)k#mr^Fa;^og7`TS zfnoM|%RzVq7x*3k)Rj+~%}@ada+z`RFX2(eVu;m&STd0GvW&<^K(-FHfc|Le>bAq1 z;S7g61{lp0Yzhlhi7fiV>s44b_K+Ar*s$Zqqt)p!Fp5S6I+0X`!UiC2uWV$Ee}%sZ zGm3PDua=Fo1}A7c7t%gZvy=}MNUuY4&X7+Me`C`op^_pu*bV0S36+PP7jjk8K*O+T zg&|U7$oC_fnkg$0+Cnv;TTFQM2DGOQTatz)$a+wkSdyj$z8D_xxdl0%bfMUUEjFG3 zV!9a$gn~24kDrC;*(Z4N$XoD=z>_M;XFUV!!V6WT?&0b2E_n({X}x29e)^1=ywyU6 zPHeEq=T{qb*!`FLpU6wh!9XAqWa)9skuB2E`ZkIbXEbWrC0Y$a`vZFKvD`IYf?d+S z^vHBSxo1er(H1N0r-V_01W;~a22lXlbnJ!p3rblbr5ff^M4M`r3U@M}Eb=pv63NfZ z$Q5&EVoPd4c4k(gn30}8e{SB4Ikc&paL&YOUC^>wGHosJfeJb^BD(?{?Su{`=u)v* zER!iLFp76rf)^f<1Xe)N(ClIJe%4ty3a>Oo8&2dhFr2}1Lp34utapTw#SJK}2WOi^ zFK!`+4Wmd(QkKLwyb_yEJ<3Z=i|}4|Uq&kSRd{M>j*^O|C1cVjP<_?SxI28g70l3@tpI+hL-p?S?cR2vUra z^kCr)qw$mhE-e72!#-n6IigF046L`L&j4L3l|fR{qEL09lyMFCR{%Z0MxU&vrYSGM z>{>z>XCiFJA{tf&Dd#W>gk;qTb0!9irlQf}w4hpYo#U%34#B~mPrGPKkh>NTHAH%F zGBJY?t3?WtcLCpM<+B_+T;|FMNiNuO^vXdnjSq{U6dTAG-H(RlNZxUl3#xvUFz4eW zm4Gj@$bT+v^%{Px|3o^6J|I4$(3cjy@c{V^`f>UYKjcNQ?E_N|v)Fh`QHUpng(xyu z6?4GBDku+p3zNyIjt&o%4JX6IVR_6;;%gy-2%0OF6%}(R#3ZqycGM5wN- z#(bd>vF2M=;+q0B;V9dNFu4{ky}(vFc zwgfSGgG0D8ZL=;#)eSab&%ViyZx88hmdz>OX4!gDrEFVv$GIKx`b2S}Y{bQQn@iZX zR&U$Ox2n->-KZ~$TMPFbo5V@Io@*;WSBdmlZ+1t5?be9ddTp``|555_maXU1&Fy2h z)Z+XwO*4mZjkRlfB?{LBhL*Rv6J{za&6#9Muqj#~-AIV`>PdgAbE#uGr9pOls@RYy z5m6O-=ThGn*?4fe4VRs3D>(6(E1!?bo7-8pQXT{DEi0)|sFA_`fM~yd?3DOn?tv9q0iS+3) z|8b3AdaWvGOJk;DRWiDOWQO{4iaZPvvIdWJO=9Fe5>rVA$;?JCG5I#wfO1dEupomQkD6VV<&unED~LcYB2arGhlB_E z#nNXKi*}0yZHy^O%H(_+U=ch6SMzoMT$w0XqVGixqj4wic7G2q$=JwpKSrhjf0Yq71>BQmzjNslE8N zwzj*zW8RD<5$Gm}x+xaPO0rMEP&zd#ciSPhsN32eBW05rXdAmz^lGe(G4ukaR%<&O zsW$eWxjdi##YEe4baM~n-|2H`?R%Tpf^wh)u(j%mg50KXm}tQvL7)|l2Yq9ldU9G2 zph5gsa_ym`n}>mNa!ph&Y+3elI}FNUZH5-R{Kt;cR0~Sz?+YNL=-eV+pGmwPIJ)^H z@>Q+uM1ZLdiC7~rEKr6G(e%kgrnR=F$h0=rpU7vN)@bEC)>KJrC3|x3XJ+vZn5NcdoI$2uh00 z^-)i9DNDp$YElfp6qQD*N)vP?Ip?=>S07s}aCvSnwN93;ua~Vm#w0FBb!sQAlhO|;q}~(Q3@r zinM!zm`Xzvnm~h@G%vwpMO#4>g0b&x$1UrCj&^?0iC&;t7rS!)I}_R93zHFIwC)zv zu#?fSYiz?NWE5IqjkGbWCFA6Ev7wUqZ6`xsxwoP8*44TR)u{xVbT^IYONa_x*VyLv z%qM2ta1?*~Iv9B}gbeN|cXp!PRoip!JYqv_PA?Xf`91SlI_BrFS8^h-fE9en#y(V> z5~FrEptm^0;NOwM6<--R0h);;8poOr!dllD3ihyEUWXtrHsXlk-$WX%WRtBW1E=Bs zASY5sJClRZWODq%z8H87AizS2LO03LlVos%$c=>&)O^`SwYu9kCjbEcaii{%VK>+| z!tSb06j&PyD}@b=d^ z)+Fr-E{QY(ZO*4@B)stfDo^}}z43I{3o0JIBMzM0%&!R|w zQj@BSy(bAlU$Mary~4UcVQ;Pdi&=Z>+X{&2{vvH>4Z>qb6%xiv!dXF&@49HUV=IYUw+7FU)9Qn?k5D1q^I^H;-+< zCb5kj)Ct1f(GI&Ig^5O@I0Q}%u)F)4oaiXiT-dX8f$8j?Vtu)4YIoj#Mv0Os8Q*E8o|co zzT&KZ>_|RKY_UN#xC(T-ilVo8$lT>=Z%8et1 zxVbfD3n;J?;zpe)0M9np^<;rM17Qvu-j?I0xO-CJsBnhtT z3#1ymP^30fA8nvmvcid;-23dVb9o9%EVgQ*7}!_m=32c!WZ{ih*2;1Q)0}NhQ+No= zDB^I<%{cHF>IMi4=4sxq*Cd6ZdIjyO6_=aoJ&#hov`WB4G3%noYPt(~U*KItY8kL9Or^BvF*YB`*>U{%HUUgweeBp^Aj^I) z-GGM)hA_~x-Ac82r0LrUcdadPbtfoco;cPDb*2P@RT5^EJvSNhJ1Rc)D+Q{to@eBLN9^v0O~V8n>AiK5>p6T*njzb`Ma5Gjpb=8&{%mL2r|F}n%U(un8riS*`nv`` zG)IVM;>jk7+SKY@y-9r5fi$_<^3Y(+2@Z^9{^t`U^eHqtg*A&Dy(E(%+bW?i>1=s0 zkVuY`lSX6)Ez!GhUqeed9bz|u2(idc?PC=Op)}1-Iv1%eL%0mAWeKuY7860F#<1RQL}{4A*vj0CRCq|KasFZpXRR9S1e3_c>>Rr68=w%81B<$4lj_(0N+cru`^1=yn!7zp(K5&XIS zh{A>jdp48I+6R?NB+w36S!Nw(u^yRK5G8p4gUR$5sUK7$fl`uTCAqFfsspQr{EZ~< zArs=%R%)Wc1q#ddXQuJo_z$S5U{y#awKen0k5d{09a<^{8&!HDCf9MXw)ms(&v-Xx6uRv4?<*w!Qv?VpTIa6Ks{00}P6!D1ns4hA~k zDXGC3o+@^vSfZ)43jQTx%9CyG&5$>`OVsWJD)V77B z07RM!YIE-|1of#{VS39lZGh~LHdHW#snNWVYr;Qj8QRDbCoav5x4)idZffe7z?+ym zD`KYyGR2bWOus7}X^eOXFZt5V>mN_jA$*ujK&F!-5zwLwLhnz!r<6%0{Z zr32Lz!`Y}7e z2!6Ez`e7$%ehdCwthbE*;Zy@Q@zAT@|RY-N&AvFAOv}_ zD>5i}*6x1BjQTJRqB2r^v`9l)^TbXVSmQ;SgHjZEk*2@gj+po(Rd>@LVwwzQhe%bX zXdqY0R9jk516^q01$g|;?tb3HLlPZ-8?^w5DD4lyAVl5eX!OtTZG4+yc?%8adCc&G?H{py;ke z9oG0&yG8)JDk1IQ&ntHK%O-z-10md1PR~RS@Gv>wT)$|PW)U07W3xByjAOmjU_TNg z@l#7q61J1CHC{K}+)aI>puY9633V*lZ022Q6SF`qqSGGgsj6pS`YJHhUCRl)m6?6D1x4?2)%JSN1Rq(jGA zTTjz@hZ)q-(GyFxw-R9yE?{py2W$gqQ+_W}ceJNE5x>Z&bYL7vKSxi4IzG z>Oos!>~dkzvCy!ul4c6|7Va?)jS{ zIp{-7`AOvpd{T2WD@ERWi9Xc6%Inzd{90xjgg=+*Mvg3DsMed7N}IRVA-{vN)WIAd zW^1AmaAs=Lr%uwU&|jEZOpn8u9xx`~#%$eOpxqQyvnGh>kpgKpQ`jXsbIzgif5Q*SVOOR9*6D92aLO6n*=J-|@!Uq=(qLpJO zb+Od0#RP(3Zn%gQomlbE!loD$TlFf3S{C>hOGNC;SU3n_|1mX>vnUs*fGY6kGc z5ZB51prj?XBVaMf5-`WmwY!abRl9d(uj?H#ftA5l?r8n7cN8x~CJVM%rDBF=rW8+; zm&ZPe`7zRwrU5F}9}7fP)kKl@2%<0+2dfs#fi8%v0SUUw0U_#1-xgvYkUE}=6^iPvoYKsY%M<*Pmhkh_)n z6wLsknvH-!J^=8`T-u{OuyLkEii7O0OnyP~WiG1r(Nsrc;DNs%vLd)k>Y9RPU(3(+ zi~$%8`!^aCP(5sCbIn#VZ*ymg7Gi#K0|uN^Ana*(V6W{6w+Mm@>}yd|zQK=y3jTnP z>*{4O!}Q96(FIdCccose#}Kl{K)iuKc#uOnmfg~Lb_~Mo0RQlTszq=xqW)|{ve2V` zF;9}dzazU%CNo+!#iy*XP4Uf@@(^1a^|Wrc)C6sQruYF@f`p6OH({v*LZ8ABk` zn%5l7H7*og#t2~qEJ3Za+hEWrwt{=6d2mhCezC>c*tjDHXZ#Y2jZWZeB&)Y5C>(+C z5MYVHI2aOqLtHUe{j<6K>HgUYU}=6yfAcw17Gl* zsF31AFC+LNT6t3PgAPRsnEcI}_^B)&Eqqd`>4!!)I$YK%!BL0h^-cQqQ6_#*OKhTR zffdl|9OdmG-D0ptmJV>=5nl>lf4z-a51f0piEVuC#BT=vEgF7y^B9vlix(LX#ef(~gKftMQDfXJ(PQ9aa}LfeQ9pA-T4EUI%wXe< zYPUM35Sq6+hxkE9@1-!pvYa8sNPBbFa{|{ zHJ5isE;9r6yUo{7#P{fF233Qp#DVI)F$!;&u7RnoYuraQl0MG`3UL3V zmy+O=z?mPQ44z@pE=5;lgK$2BiL7io)NWWu%ey$|h8n5l95R2{L{9=G(La`ZK&`E*tb|8k5KWfA(rUMLj3J8H@Dq{Hv26>&j3A5;^xY z%mArJkF#44)$}(4Ak^4ntzn3iOx4N*YcNs>;co3n9kHxuqIJA5vOm8^dh5G!(dbKh zA+|!Fe?gzPJP10d0fS{Z$mzl;NY`~PpH3_UBCPhp{gCuL<&?sNVP9siBa>v6s4QP# zt{E>3GN$GlYiFeYZopK*$^e~^jNeZd;$=-MG=S1Fnhlpr+7B=zEgRl`&#pKpzPMBJ zV6a;$es%z%T-jzxN*VmOR)IpaRFPVi^bFfZnzinI5Mh`Q8X$gD0VPO`8lxI!8DXj% z;d1&EEg{wsgBXH4Kqr$72%8NPhJhEV0G+0)n0WEmR3=`1_0iN$^E7H4eV~4nv!+I@ zHg)U6G#AmwBT|NFl&+g)QM$D8X}D)u9dwI}d^ z^AY3;PxIApXk*b+AE3R@lHve4faH^M5=qXbLdYS{lp|1N1K(3=Ao>{$X{ntxd0-XF zVY!sB#uxtvLvJGWprTMpe!{V7^o~9dvUF?(IJ^Yf4ry#Zf%>BzN|UJ<>N{o@TlS%#u{?NWzeTlw#9qUs zc$2V|1!ozh^?&sn0xitv(YA3;x=lBaX{6P79}mKyD&*~2I^oFt(h9F2rhhdRF2p9A z$D&081+!Iw?vBl&exQkj%tE6BZ_GKQUV-J^>8fHQ@wDnH2a z0iJhJxj~XFi`mY^;tO!NND~&7pEZn+geaZ7UREdXIcpUFmsMPHIpBGTA;Nb}I6_BT z)+UDbH|f7(!75fCX0l3CjV+M@rVTJtba}?qK`49yh@n@KGPfnzLJsW(N8+b|;eOGA z%Ri007g(L8CQGJ4Dp2;hCMbyFXLT_VoaLaY-;of)y2{cBwb;R$g94wVWd0pPgL;lX z`J{(z6x5% zGWQz}-s{0z1CFVSH-B3f=;xDNsyG@wilHu+(gAFDYo5&Xn4 zpQrVQvKsAq%;KQx1WYDKGIazn@~pZJa)RMe+cn-O>*8F>$H=gcHl59;ozSLRLO<^laRkbhzZ31LtzfC|CNv5 zs>ko}2%SJ1f)w+HmWYM}I^$gS|gFWIXz_BXerrX8M`qCVv|Ri*Yy;Sj^(% z9i2|Ma54qe>N=L$CezsgSdrT+iKi>j0v!6nHW$SYSrO}REmfq6fQsgx*U2!LNz6of z2onun?JZ3JCg?$JalMTzQJJj43?^A&m4-cY*?a~g9SVyIarL-cD#wnxmgJ7oy)H54W^)izOeVI)~JJs#z6K!59a$7>e^<1q)P<$!!K z!<$vokxelf4)p_Z2Xn>&m2Yw6nlv69yTclQF&tFdCZ{9hNs{_g4#|dS7=N9tjSa|%*t>g0|b z7#1_BORRK~fU=i%PTFKDvaZ~ysjByvAC)FZ`hqb80vs!W0G+fQrSfp1NBr^TLR2|O ziubBRTzxPxs({VR00-HZHg-MnY4bUsg$KQe zb7U+k5Y?apRhiOuD1%~EWvpT*H^ooj0=3f|E5XQ3e5?cHgwVbPhF^+@GX2}6>0`-d zRjA4pdYlriOw8( z$<4nMbjbtFoGkQ~j!5R4)nyVbLv0$;Z%znZ16M^P>s+9InwSJh&MDR|QK>I18!oM# zM#>m{9cwSx(u`g12pV}Gw?U*f=tUC@UwoSTyN%MemKyk^lTQNEEB_D+60w$YT}SrScxs-!(|O z#@7dyA50ShyO@u|xGmHHay-@PbC#G7`UWw4I#j+_oR5+v=Lnqzuk-e7w^ezj9iQ*R ztFbsMmKGQpOlUzdO!&Gtm!|I>kgKpIZ%W9&z^l#tJv1a;+Pv9 zQ@~+9A)NpPoLwYuCSSC(za`d7H#Se+5YXlO@ zC$Bcnfh5PL6WA z;~HsPm&z~8O)4$5$A3z$KD8MYgX<_>G@>#fhZF;qd!$Y zGfNWcVY;RZZ=wQy z;3%~;Qz^*dJ~Ng|aT*h-zLqnFG+bqQVyq?o*Z|eK?FVEGEk9Xp(?2#nhJTL&@g3A4 zWCBCkYj;nRLow$MFO@wM{{nNT7tI*z+?^(6LNE+O^o?K`bBljy3LPP77h8$uq82g! zkt&Epy3)93!s_W90#N`jnBUVWJp^DgoEjL<3<%Je6#SN(BLixc{0u4i zxA1&_$OafOwM^aGi;mMEJj_(3`ym8tfQ+mLT`qRW6^>;1*t#wsr_LFW*t#>FjqCDP z=S|d|B~d&g2r8!o$ergqD+c-{#W_vA7@dW5vR3YXd$ZA%56#4Q8VOWZJ{3pMcP>8&Y0pC}@qk=+i)dDRNJkD{$k$lOay5 z)WPp!a^(aF%Q&ECKc1ybq@ix}~G>0Ixr6tyZ=2*_z;M#=|5$q@+*=OZSKa zb#O~`RJfY0SwNK~3jSt{)oHrN*(D!xAg7=f2vD>amemIM5CX-ef2d3EWjS4JTC_ ztXAZs+GsQfLej)5RyQncbDesl32WNe!^Y!IO8Gq}iDQgQ?1|H+x6_K9(2|-Ty9#kn z$Bm=XB75Rvk9=*MlG1dg#m55aK@AB|l?QE-w`mW$NlKwmk$I!~bb={$mOPgIEJN^7 z?_3_qS=PX+Y3hSBlr+_Ih?~ioYO;@|U)Q3Ut$|~r^X8aT8^Sj9D*Mwj2nF$EMG+4E zMW4LJg(qulXHp+Q&l3IlMLY;Jreoz~TRgOgrk>g|Q#;By^Q#He(C4BS`lOTTj;GJj zztZR87W$;a=YFkEA~w6vtTc~poDa6pC!Jq+JbhxEum{6`QH`4*FuX0(nWAd(oYn3a zm_|a@jBKEx-0oZa)8@YTC2;(L0e*@bO}w=NzqwFcD~js`eg(P~2R+ki$8b!rTA3rg zh+HSO@|H#2TSGaQ`KwBV^cig^vr3Je0+bp zzQ+L8*l1LG#F?fEXxhSp2tb$@-S1#AUS-$B(GixM{HUmirpuXVL`5aH3TrhsjD_A| z#3UWWG4~lx`7@xW%U7%7&fUI<8&D}RvnykBnv?th=Gy5_H{MbFi!<&3`7}UL?BUc7 zJ4{rF?g(Wq1O+lKm&*}rbq`NYcSR=wqPptJ_X|Cs zY%1KR1;NtL{3y*Bp*~u`J~T*ik>nYD7ezVse0;X(!>`R_qbeWa9e1Q-A7`^iI=XPg z5h13IYV42O#6ci{_1le@P*ES%*qLf}qnaF8B-11NNKGBpXi3UqzR~$t2o*Sd2s+(C zr_8HJI~&uPI@>Yk)aFJNK&_yYPA3D?d2>FYM&}B<2Jk*qTE2IOoJvzE#IhB)*|kUSYIZw44|h;+t&Wwe=LoET1Ivc8#P zydl5Fc!Nz0dAb{l=8P8rHreQg)}E|y-ZPLUDX_jdWV|8%THm~HyrDxnt#8hBY78iZ zHQs>b{n(=l!w;wZUq-%yB;EKhQ-6y{^OC>B)Pz!%n4vVZybU-il;!UUJhAx7Kk@RX z8Y+>)MS6|YBVK{)5E}g81~w<-44SCZ9WhoFcwW0OFZCRaIowWf60BDBO|a;Lb_vFJ zRn79*%|>UX@o%4DsaD01*0a)Hr{S=ZM8^Z_@0nggX(P;O05~3o4dNvwA*3NqR#T%5r7(rf>Y(huQUioEJ{a^q-oFa$ zima5`)9rP-=4|wWM_bQw$7-iQC7?F}7Xx-b1Eq zbWJb`fFz}Q7cFlfjGdP^;SKigTa^$$lL1U4uF=oHyVwnd-gZ@ z1DXkn=L>$Uw~8M|iu4&X+66Ab{Uk)V?hP+nOq`eFdE#wEcVRsgOJz=Z^;mPtBwj@n zp7uuLkN9G5L!=vD&YD-#g^+G@N_=@ymuiRQ5So1bvy+z>eO3;yEoQnr07>EiyZG}r zYb9(6`b&!(%0*-PD~dk;FC6N>CLjN`_ZLCYRLrCh!8V<-ax6+EFaV25rhIsy8jUbt z4EpVFf17Ird&RME1@=O~P)mJSEHXV2MwjWq=F}2GC|iN6)N~|5qt2jshpDV}!!#vX z+(k`CF`(r*-Oy+IbEyB?q5ef|`O?i7`^P2zaVa0s7-Ab2rGMq~TCF{;eDL%ruqnH_R6CZyM^qu|QN}A~iS610|vH!A(*>464Xo+c=zXY?2vogKEzdHEMp=EExi%F)*NA`H9sG3iMZ)Pw9O~pX}nxX#H zCHf@11!KHSV2+T6um@a&7|}|A!pBc6v00QDosLj4^RLtVv6)Y+$uv*5clC6@PKjq$`G^E)>u`hX$Y%;H7oj#E-}k{f0t}q+Y%5$NbN}^GpJBNt>PjxFy7mxiP9np(V>Vl zQK>`hK&Om4HxDU%l)BW&CiGL1`Qa}4#l3Ax|67+UwQ0gfy9x!BRJp6mVkFH#S z=&cxC-g<9a>h=JT>3=wMn@ff?Y+M29o?(Kp@gfBBmQ>R4hkX=i(e2C&X?%E4@7-)n zvjSqb(bhd14O;gU7E>HZ76zjhR{NEWG|DpADUn% z3QYHN3fqu6xeTw~YBjB&C==`=SxXVghh01idx>;yA6kg%Xn+LU$hH+rC?VAn^3*s~ zS-Y@fP6v9=%~`sFe&ix-OPhunyBUnrif}u5miI(pn62ovur3BjU@HKoS7YkP7P8f! z335d!Q(jKbv9Udw>E@u^MokHy>Bq>M#Kp(COBXLb_S})>WE2sD$j229CVHk)V?>JH z<<9u(qNboqlnHUBKRRSP+#mCu=tS=I$f1;-&MODixzZkIBNm49jKB9Q`p47F?Y1;T z;eH+UP-ZsE_a^(e4{7WZvYJT?a$GyoV&QH$#8kk($mWF**{TK(qlp05XN;^^am>7B zhb^DC5K_NhJ~;gGq5ZXqytN;SJP+#<{evEf-3$7T=|hjXq^+hS@FyZs06Dwu_GIQ(I44Pr zTtXJq8&$r=>@47rO$RYY0b4?cGpRp)|VT#hHO~St$grKK9_~GhUj} z_OQJS0u;Z<11qwVJ14hiPd;L%kX;^;UFxT*eS(6ZOfylR2oF|aMXazatpKTw6{xt} zHI~kdFw<&2oZ`=;J)4<<{1r|4jHDwyJFhM;%~;iw{Jz&8ZQHVohhlZBR#$7*v#%}P z?1@sxBkce_Ls2t;!3b~X1k^(z8hPjN&sA+aiS3;(v3YCfEF3@bnlNBb!Hq6%U z$OrY@z<}eKPJom2nvyOsYhR4+CxL|H%PH)`DW!UI5+03{{lcI&|1t!? zQ@2Nga<&{z|PEYXLi}55g9UQ2c6m(=J@b*moEPBA$eSwlzJ1;UAlO5k!GXO^G93ri4wc2b!D83Xhjwx z%P|%kcW8Y^iZ)rG!%U~linL(=EP$S`4*y)HA4=~k06u4XE8DfTj7}_UaM!wnHG}ON z$&+czhcUKaD3UB666OZP`3Nf-ziCGk8kYmMUV<^4?YY3ijK(Jk4nIkW^TZY_1k_zT zGH-e8r&cRn83<)`=N9c=y7+*>+hG&4$T^(7=1~>~+@_>=(+3?M(^gu`&ck}&+CnmY z$jCO(=z88H;vuN0GKr*9@I)gYmMV&%8H>IjxW-lnI56nm>4AHp^SlgdTD;B2~I06T@p%tpLt7*jisdP$M;3^)# z`jbbj`aDwwQf0=?PxjxEh2zR4=Z-8|oU^qEjRs>LE1g69szBz7l=Wp(^-9seIzD2(;F_d`tN=sWstSZuYvxB6YlOEkkUA(0wP>q6N zAsqyS<QFBP=>ub<}ScpOE4c9CB&V}C1!AyyAT+? zyGYw-Mohur1a1lhfWY%>OaUuJXD}~QVnWaLl{7(`1NJnZ%u9ks#<7wCd*l(`>K#4n zjWmWw=(~N%bBl0$C;Wcn2dT6yJ}cx0=q*T+Nxise9_B3*3=bR<`d`tn#ai!wVgdl6 z7=Wmu>jvMNwfQ#CFTmv)IrCcv2L9aIpYG0A@2k{K;OVBsKr5ZtaOP5F@fqkBZzj*S zQ}@=NZ!*AXrusKB7&0q5IgpzSdyZ#%A9_#QJ@;L} z*F?hNLWYa#(*BmX!Z^(!1$4t}#F@Bi z*n!ch9!itTfGS>yDuU?*qupM{y;8kKYry(*vBqd>N3XC&#Cem_82(pBrbh{2xUTu~ zkjIR~(HgN>ZE$|fJ6T1kJL{$1X{A1wmikI4#rsyAOlhNukDVDd@Hjm9bxFr>sC>VNCcgq4FO! zkl%8U>wEsUJ%5KdRDiOu^vycjt^(d|V87{)sfFuO%xXD>w;LXxv!WmHqW@VSofplt zQ(*H-uX2S)|DRTco>IvaM!y{96}S~9;dG5+@?(>D&?s9|2)c%?OfrA{mvcg)7C6Im z=F;<$?TB}o{UlKR@0jBc0Of)^S_!-^B#pDt^At7{@=Q5L4{ppMR3sg74<|8z;T&~H zGKnK3JvuWHNHk*h@XyU7YnzaVE?v1~6hxW-F^{e;+)Ht(fTRDr?vEzZ>=t}L+PlD? z>viqT_0_fNRQz78Vju#Fz8kK6Y0%cGx3gEu0*0S4PIoJQjoT3rVdrCeM{A*nile-7 z?B1aeC8Etv%VshV595{i(GiwY^Ow$Byts8!ax%mGDKF@%6SUY2eD-aUjoM1CyAFP9 z6YTeg%$`u!$#V1c-NI~46ALS!GUck-_N_2FueLTlaHA1_@XdK zKd|HvEw3zReLCdelGznDQ;{R(fw4Bky{2%sExMI9VishD#EiOT*Zrc9$ma*cw0p$ru|q z)P1cYm{^efC`EEYfyF6y)Zw&F|FqI+MqSfnPM^zR@zAIG%icB3TWBaH!a0-Azzwg$ zw^|P-%jMFzlTU%bXgNS8OOhX|cEAElepSM|1%eDhKP=qtx%#vq^-W*ln*e}55*P2ztOTiX$l zA2F8}Kjb_{W1qKt(ddX?X~w;|^z^d`DaKWJq=(nI@qQ8Y+&!D@w{9uv|L;ldW-l0d zzn8Np9;aA6m3I}F%wIh6qUFn%E(iD-OXrVp8fnGK#iOm0we#G6uw$o0%{A~2R1msS z(}EQI{?_h~i=+2a40eF?mwthwu!cK+?OIx`12b< zORyM+W%9dBZgu(_`4+uykytZRb$WeM23`Fg$&ZIjMVh}kl!Y2UX}VQw_%To$*7*lN zA87V?)0L6{COP#Bupcw`6&>yFf}|V;sz*6F_~fiVao+MJ9KfO7M{FogoP41ElxCTM zw(9in4-AJ79Fn+HWQ@-R&hpqoVckim@dtXTrf}*cp~K58W(X#J$BO z7Hwue?i^^n-_75bCyH-d6NT@Wj=rJ`T=7)iO}WSd=lQ!SwUTOL_YiI2y0*Pyaa5uk zBfz2p=XHVq@Z$ zluPmB9fC!sW`;0nTZ`sv#@Ste_Gta54fZ+h{zF4kO&NsSa}Uug=7P$e@OqUGHO$du zdVllm_%;Z*&5667gNm9jk@g-GcQAF=?7Xh}Py`imh#pOQ?0UwMIFHWc6z0|hQ0 z>Oazu3E?Qr1Mo)k2FK!gXN(-r(YJ1E1&V&Fr?|SAjB+NB>)5rwHXq3BRJe{ z&qx=hTUo|#SmF*RDhBZIWa0w^%z|2(54co4r!&`d=NWd9 zkVJ)s9O1y!s>7G_$~q9lW^}ks6`s2Ib#NIMemlgBQ-stIUbd|JjwpvSX6MZ; z$8!nC#g`S*Z-y$*E%%;m`t z11LKnw+x?lU)y^6h`3Gw|FS`V{mzB;_d_P0emc+%Hh;S2@I(z9u zg=HnQZ{Wikm?6z`(mXReBhk@Qe! zkd5fa={7CbK6E*3wP(i=^u&6MR@1hPw&O#c(sqm|pyxna)nI&VXjnI0OH-A`Lfyn* z#A^D}Q2&1hT1`m}>OY1gG5&4lSlB^eKvmoSy}SE+G~5D8D#Li$$$i%(o&JZIDz_s} z_oV)$N&TTo{qCfGXHvgCi8-Uc20MGG|M-wmBy*a|mGKeU9X?TnYky)4GVd<=gX1C#sYl=jugZ3A;|4mpLnP}Cs@ht{pbS{;{r zYv!Hg7}jKtoZH~HqgPaN8S>`tE1Qcma+;kS%Hj-`A6?JtdjVS$*Xl!i*u1g)D5Xtj zv_OA>nJaec$^EjrL~Ln3363D!C>noNx`(foqdhB^DTu`J);)G!;i#(f%Bf7qDCjS} zUSU$-EZyb5$!vmOxTsv1NKc%;vskuxCs~tdWf*<^G!sio25eTXF%oD4(Y@NAi;hBs1KYIMDR?b^K zqUFu`tre?UD^|2VYU98Z^Jxj-`++T7w(Yh=OGN<=9RwjzZMt!S@HsC@D zg`q4Jw_|GJ*CzhJl|HZ$wB)iq5J`NH)U1{w+~u|4%%H*{xLgK1R9?4Q6TvWPG_*C* zTD3l=z8DL$wnr&G4OKR>?9iplR-qFwXuaF^nP!D;s_T6@hD*TS}y zmQD6L_@V+NHv5FKnD*F~H{%TvH0`UNuitQe)^V#in6eP2^ zes8EZ>`H-7hq(2OM1LbpUFor+`?IXplpgV)sJ&s2=u&)c)O(sOOF5;-uT8=Y2LH8b zZ!-1^!omAY)&*ruG_3$cgF=KzPwy3F3&c3@=`9*s>il;gUR%AP#kZpYjBGRIwc zcRyA78d!`#+6jM>;oRqtw3cY}eH7>+|gyJd>1NWFv6ziL$#`fCo9C2?UGy?81v` zqLY`?_`6Hl^~K(E)DxbtyDfZ;&hmo5WbT))xA=><9rVQ6UwnodcX`wGO`6!dH=_i* z*ZwBMFYN7;rvYN$-o7q%`x!1X3Gqbj1A6;UH6jkQ)PwAt+y*{tSkk1nhA?YN3Ll7b zAJSND*$;LBkp6=mn;`uM8<<0C(tl`>e)6OAv%UjXkp35yOg_B)I?I*;M$!?zSs)6F z{SjyT>d!Y@_KPRE4mdh|;x)0MBv`%K)effTZGCZUn&H!9=>IvP|0yY-eebyDl4RRb zX>M~i=pJ7JVj%F=_P~-aElVmGLhpouB~L6%z5zqCchaDe-Zj~4!zd3r@8#LWEYj$S z5NjY&StplwbIA8nr_{Rkl?|m%t(7{hq13!usnfGkXLvrRcW53B1Uu*Z4*aoo+mB2) z5luAQM6|DGmh!Zy{CZaT_3ZNN;_~Y`<<}+U*QMpxW#KDhV7YxYe-^)1l)qp#ci;>S zKRaMw&kZ&4h@Hoj1?J})S@v~R`Sk)je_*Mv4yk~@(7|g$2K;No^mUOw&BbOP^MOn5 zB}xVUrDgTCe7)YP|Fwl|wXd(Uz^wN5@-p>`kP3RQ&(OOvjK??k-eAN1jV5Yunr+x! z)qBfKb#1!H!(B{@j>@8To|&(7A>?O^#LNtqoOJ zE00wLQ>ca*Axp-pa)YXDTvzTztV(H&^KCh^^wf+M{8$m zDVBHi-afFMcMNDpM=z7L%R2_N!vV^~sHnIhpmQ6w|E}KOrS1EKoE>!cq<5vb$gBx8 z>(QtLmsnVg4wM&nKS&yUN-n`Pg%LE|7P{5gdvEVOu3Yi+#EI+u8Ift#y4w3dVEpq$ z_|3f!PKfZEMfeNMpqOT^rHpV!!H0&w$vVa+@LRMQPm-_hYiwcZU$SMunc)u;BVVOl zgq$9)m$Blby^l97F3wwAags{!H)F6C&EH4j}p&Ve|j4yYBMkPMvhU z2!#1Q8{U}j&Kpg8GAtylgk5lJTmqn2o-6*|(Yw9gNP}XzL;U5?Im2d}t(U_1It3tO z4W>KBWN~q%wl9Mz=Lr$`rIf&f$06`b0|@+=1_HfoM&Orw z|2iQ8z3N~BpCbal(z|m)1b!tY@Z$`I(1WKMt(6}9iV+x$Y}27`nxzBGPoi^1yVj>( zJ0tmPy{}G)WUo4y8vJp-g=?bnvCu<)w*eub&b9z20{xM6_2OO!PDn{r%p(6C(QiB05?O zx~dk2h&Dfh#l&YtNWPyEpD4Q@H0S~^n-Th>-VY~4s8=08C<6ZD;a@VQebwum{VDIM z&HC!rN@zhSaj>_}=5lj%Cvgo|>xv!3x%+zeO^9>%iF3A>O@Qfb#$p${LNptU?bDJI za~3`!Jukh$jvSm7SMb!@%IcnAe;06mi(&h4=8b45kiT8v!!OyHD#s_=J~*hpCT%hN zWzp{ZyUAMPAUW+5h2IX8O-;8(yugFS0cH8T&Pk9azlNu$8EUjfV|i;j{7rLd2abWV zuQnd){j4TOTp&4Cu1XAkwlF>0fy!02ZP*F9O2-QJ)1OO0#DYloex05bD8rOo>{c+t}+eE~uBkdfm z2WsVh2p7m3T6;{VmG?5LY$9MlePj5Szg*+P-UuV zNzrA$Hfg!VS#+wg8a{=5M{(X^}MoJLWdRf~hS5_~SHIN3zQUhEAS*C`v2C_^IWesGRssP?8Uk4kK z04pc55vimSEWDar0W-M(BayN?At}X9Ng0?a6);l@Fjri0g@Xx6DHtVXU^b|L@tD(@ z0E8sKY#51BQV9lLDS;iv4ckE=o>l?-v;sScpb;68QtXtJfmK2ZcB2Z|jS8>@??O@v zR!JFHC8S_Cu7KUR09#-il2Wir%D^fi1-nTF>?Q@+0^5+3f>lxmRtYKCO)FqGEx|_K zhNKj%k}|MLNWpGa0lQfVHp*p4O2H~A1FM7rENAPU?qF@(6+wBrmw!e(etV{WV|+fV zJ*<1smoq!cR8NlvS{!8sn&ePuvtkEyc*ucS!X9X_ol$!SKzBQaf2c`!7lGKk-7qOJ zRRe+mG)xX0>xBYEp)sB4y25mQKYNA&<=_F_<557p8sQ!i`Fn?-sn)j2THDrUt89`d ziI%srma&Ju<*Pgrst>)S>8vHe_vW6ZmbRW)OIuq@TgH~0MpyDlLnx}}1cBJ5eUJqT z**5RVZRttQ0>M@lEj9_ke;OAe>@n!+0m62gU6_EA8X@5Sb9L?*^25*PwO2Dwaea2l zf~AU;RZQB>Hww}*f1;2%5s$4-18nR^C$ zv_r$s7bHK6cHPLWTp-!Hqh9i3LVTHF7w_u#SOkzat?1C(pPRdn}o zN1`x(wXgEogaZ+iN?~iouUGg1n(f;jSm1oa0I)?T?dj~Yhp4<-k@bQkEB2{Sjms1_ zWCx?Lx4O|;(H8k_JNPlfL&Qz!l+->!5U68j|8A+-KcHb4`9N`NL6;j}ZZwBxkFeDR zoR7wR6O_#QuN6Spv~GZ)3DFQ<*!bq-WfzZoeOSu#fHuNsqO2~0Dta>Z!jriHTpc7p zelFpjIsUa|hN65Dg4*rw5RG=w1g z&~^w5wEINm3O*jfyXV}-1oZdq71%>K3RUeDU?0|A-7~c}zct5r_o8-q&Ysb1Yn=-X zhwTgTpwdo$BFsnqj_Hpb_(1`cMvQdSw+L7`Y2ReE8|6LgynnZeq3FD)T&LB23|uY% z+e88K3n8%77m4eP?BX&6k{8i#tQ82?n4P01zo+pyDe#Vg7fflpx+wN%>oLxd%!g(W z00&3OHeIHJELsK=o`=@^eNwXJI{aw#*zfJTL`f|4`2EM94@n1Sxi z)bEjk%KaV>o8*^>(4wp9m9y=1(9s1hP$*1`0_RddOx=+Z2#CoEz{FNtj3ckw}fF@z)(_;U#s8 z@KzKjiePhyin0zs#k{iXT=vTXVTMXv--=$r#gdcS{S&ij6zLRR)(=8?h|teNOPqkj z(2YrqJ2uWJrO*=9v14euJ9OW1Pi{xqaD?2j^Ml=|mZU=0!g7$6Y$}EWOn zWS`#d&nwAB4CD;y+ll#FG*ZO)^z2G`ii;g}2Y3Zbkk=qClfh%G!}0E#?^^)V5SOZd zR=dBb#1V+Xv1k56ph;8l5scbXf>C>AGT38u@Z>s^552|KHO>)0#30SJa!X=4h+{x` zxaC4D6DcOsgDw}DlG%pdUmVcn+MhQ+aBP4ndG&$N0CY(J+MN`DLQ|yOmxw_^BB4qI z<%8@_ae*@Q%vAEhc`}rk*`F$QX6)r=`Gf&SgG&blV5aB_vx&;01a5AO)w~vgqiJwC z{SWS!5#vWO`ZhvGle!{Lo#m-TSxqjIq7A%K5&_ykrP)&aJ+D66)`{2!7JJ$IWm@k- zYu%;(rep$h31b@ZJF}P=rs`sMPOutgN~{J^+4Kn}!R9ZT3aka+6cac3H3}#DH1;g0 z;fjg9oneF1Csuy}VS!m|xD}ERMq>?F&`~H{lp0-1bx{u*<10L zIiQD4KtsENomb{BdByiZG*O4E(nT=`Cj!h6dT|louK${L|J99pBvfXctsJ03Vg7|E z0qmnQlBQCO#^wW{*K!6YSTE}NymtTG5@l$dh}^(yb!$H?g{+HTb5MQ8S~I}EJZdX$>eu!S4 zvM`;xaRVsG(U~JYygS^yLSt8x(Cv*r3WuSta?bE~x>bgHzE2yg7FQk`n0;}^Y|ui6 zUe;DfD_@%A>>o5eG2osS2OLw91<|ZF27Y1F`dtmWiv~G2OGE>|#Mck+&zzgcz(mxl z^Pzc#GFeL$fBEL}V83Lq-28QtSRjuv#p~48yU#M_T!A2oNw25h8&+OQCO53S0>K}B zs;St+!Zp3Q-G5W5b)pG}!6n2hBtGA2yrJE{a$t=&R_V`a3C9MwiV-IX-QYAv=wIA1@4=MfWI_SSst(u%d60xR3sX&rDs~eDX>WcMlrPl22vNa*O zr8|sfQ1&!$R)a!{IxqQ);*aSH5bEhv7XPDO@X2Ynxyp4U4lsceYtR>e*S0%JamV7_ zQ84mOeotWQKN*wXn=|>njZA(;VnYrj8#TbqTX7lwiN2Dc_i^X4#Cc2z(<20RPzmAv z6NJFpXQ$!~b`4C7`li+O4S(*{b?9PST~`Do8BQNC^*eT7Q(L`4|9;Ss9;bhA4n2Bf zNAmokynjE`*uQUR3;dHFL@@uBg83!^HVT7C&>3_nDBTj>)xVAt2n-l36hJ+$txBfk z_^b|7=chWme``=91IF^jav=8>2$*g9`54;Puww5~fJ2zt6lYu9yePr7tN?Dj=@D_$ zPGuab4WRASmSW_l1Oq_cS`XKjtU|9N%A2`EgIe_&=;1ukTM8j3-jgU>sU3hG8J!DP zxld0W6HM|at(XdG4lw3Px|;P+&}X)O2wS9yRsu{gvoJw(1JXJ@FB*&!qKH;};qX3R zO{4n>bzC5M|7@*#vr~HuqUlZ7qiH?#JUeP}QZ_Gb{84)~Nxdzx4(v?)q2v0YndRP^ zpyn&Qa>fN`|55EC&)_ffMNvp|1W4xFDK<_*j!ie?*-;LU*$ZAI9OqYb_1%_8*TCi6 zU&z%Ls7Js*VmngCk~nrq{b)>`9^8UCNl%emFb5jlfn?;i+ra^Kf1nM5 z&=GK7D@lGZ&iOIO=|?qxrmd(}u1Tr(|Dyv?rrV8C;-crFVZ>!;cje0YM7#g-a)|^( zd?@?*4zi*gqiQp6QEam~wNMghc&dzrl76jZG z$5FQFO^xcc-%UXQ=!Yugr58gDO)(c?C8Z zkTUy&U56F z@r@uEpQv<@cf3^Yu(fk{`+&R$t$;9~gH`O66#(P}F5{o8_B}Zja0bXEt)V!5St)L< z`}vfdo^J+v=GPkyz19GqoCs|N;` zXu2(vz@Ytd5iQJo?im1&(*ImwYpeFs|1qEn$g#6fnb1&~YO7Z`IUrg5V?pts0~Wry zC`8A`D-uzVE{+~5gchx4j4{qHo;^pu7Q^v49lO%_4;&}h=d}%p|B4Qkyxq9q{-#O5 zcXA2%PNM{T`Kj?*!TNg&)>}uJprnge3C=xn!CeFehU`>w(hBwnDGP2YSqIg-kesJz zwaP96n3S3ty_T(3J(E=8nB!iK652JXN(vOquKg4F6n+4wsGc|~juS-=N-n+DIfqiU)|K6yrzhwI|_!JRJT_;4$ zh=s%t-9@#chc^{n!@Y^3XzPkK6y;FTqv_)F8}fMq&6z_x7Rh(6Df90`ELo4zZ+yf@ z1UdAC0P#R#nQalvFKzdKP*kv#d)xgVCMgi7ZM6Qqq#<61`$yPCvrRKc;(Ojh+ApK@ zk0N1ooE^CQaX5SlVe1>3ysb8Mj#(H#c91{vM!9dN8Rsr@Xeo_GDN&4UqiTllxbK|q zX}gU3A-+mI8!g%+!`J{^C6~^?R|T*383>hwO7(gL)GLgj!B9odsV4mw8ab7c4o3}e zEJ1jTQ%c7w869R@JMVwuI?TgH9v@vm&X6%sH~n$EvmKKg1j3JGUovZ854){4Bb#i- zV7Q4W#6S`;$N0+`#Gs%3^hQbVz#?^GgP>_s71_MXH^It-yjRr@@?PZ>7AVkG5VF%_ zr=-op25O9jU|M1zer(?&>x*^v^J$NpnH&g1Tn&P%Uri{`P9F9kyE>bU&2`EvB00_$fVthM$oR=?B_#n+(tg z+N+TSUKL-pY(y_&e9KmDHw8>h+0y2NSdEO0ada+7-ekivUUAmTs#e=lLrg6{14Kb` zYI^w5sjf1&aYdY$GQFm1900df1ecbX8Xjz`*#w%Ikvg0H3On}xU_6_ibM9wtULNAg zK%|^o1LEM_bq3JJL-8ui+OnYUEO>~$L}~3&6N4OGjZah4Ye&4tm`XrJH^a{*JC3v6 zSvkp1is#fn+~$Rzg!<)67mu`FW$HNV{DOAA`~o{_B6Dv|4k}D|+f&DcBTNE*(I^2y z^p4!b{0ljwBq9h-&ZrldxWuj^BzKTqmpF}Id=_Xz`CblbuqP=O?;!o6*gK{cqq@NX zNk;RK{$-n2CK-}pNL$Z%2wM;qPQ~yxCy?uuhnrUyzsl7EC*9F654H_NZV=xecD>aG zs4-X(S1hXzHwG9=C@KAEQX!9+3Td~N@VHi~gMRHg$ansOIvJpYeq*x86CwdXo#F!6 z_!R%Pf=xlPVB{n}vd$#`cSUP%D>0nZwwoy~CbX2``n%@d`CWT8R~<_gbk4lxXCJm` z`RJvdl&8vZ5WRw z+{n!_P0HudTq*}oTL0b5w?9<+*Z~wmk{GfB0Q@m5vo{-(qI^tiibP4xYBx$3oKA7Pk!9p9`xjg z>h&L>)}@|vuwTC>I71@sy3 zW_ml|k!lyK%UBg5(uAd6Ar_m2g{TzY5=WX-O9-KC1+G$~L~Y+h3Bknwt-qc>f)Z&_ zJh?!N2_I~IhR#zGN>05Lq77|pUnzhf!0F)*B5sR@&^rh%0@UkRbm3#Ke|mW7#pcDk zgTt&WN_!?fHCFR{!<`{?STlZis@oZ#6rARwq&*$(W`po_dtS>s-eu-a8&LDyMZ&8W z$O5HZh>Tc`6blwsa=`0k;gAN#39Hs>j)YV!uGmI_7uMPN+0T7I7cs1EqbQjs!Zu3u z?H)Bri4*ee{&+|PZpqu>e4J&ATd5%P?VdH*w;McgDmr^Jy4#p$7V>_kqg@%K{tS70 zlSe;1iEnwtgo!l_Ja#a@_f@QEP}OWMq!vl4kmG5k?1(8LR6@nql;JxTukP0oDIS4 z9kvh)b3(04VFDf(NHsH;Ul$sqs3~9A1&OS2B86fCS!HCxDD81txrDk<3*^f4C?SpZ zUg+z-$!5mBup^eM15Zd=t|3kBy*jp6#DR8xAbR>p+KjeZNsYQ2uLYp*dwdKLhsWhs zhjrGt5(r>jiwJn|Yi}osU|4Y`7^7olE3lN<8}r=y?1ddWqB?KFm1}K)h~B8?16cNH z=a6XRg*0MsufMQ!%$CyEHeLpa1_1Vx*g??%{F#OJ>JW5b;u|+J!^9V2XcQ+>b2Ynv zM;?rJi+3Vd@RVBX4MU>lfR0ZhVJqzb*UXizw8=x#;!pbIBF!bcYY0Vc|7|c=;=*un z2@IwOqZ&~c)VI_A_jKV8|2K4@v`U!c%(HKcFLX_uH!nCwQh34a<1R;+N!r50ocW0V zzo|og_t8htQ>jDIWb2~+ezUgPkD(y_3jgmn2Lgv72TL}x|1djq;Kq7ueEnjIsa#6w zKKMA5Xj;m4oKit`nbmg?dV=CM2^L$)fN>{F2AM7hHag3T_H}l@MEwp9|uS48wOrJuyUgpC~TH3QXr1MnmS;#Q3 zbv!WFZu`Uhg^vHj!t4;+Iy@B7fFhTKaBk+X&TJL<58DN7D)1sNKnNNrZz^!O7x;tL zI_!m7Y)D&~yC_hLri^bDS$K0H3zi#f)+0GyV`sj@3$PisW}rgCD4 z-L9-x0g3RG^AR0CBG!r6HK zpKAE|5QNlHWARr=H+s$t=HiYXImHq&D8~bjE#iA~Id6{(ygkJni#Zd(*;KAVVBOsn1#>%92^oX& zCR!S^l&OrX*bT7=Z-4>)__c=KJSH>f6tQ>5z`a-%V%|W~CO$JBpQe+%O)^{gKFrM_ z_$F&b{ zsRuxp_MM#G6US|UJ~M<)G$}v9y=dy7m(@Bb#fxe-7)~0q6#XHg{By#7(-YDuA2ZX4 z?kX2-K9pbHnR|o{!!2zx_de!%Bvj`uy^pa8LieOuw-s5NNPYcNVi^_kL3{-kDW zi4$Crv_;jzI+2u@bnNL&71AMOQeN7by}^{p8fDKXk+%^l4I_8>w{NwzNmHf}4iVu} zd;=-jlLd}wpu_`vrlEE+9*kMB0mlJoMC^4A)#IwHZ-`j4*)Mv209qQv9|h36=YW$C0qq_d`s1Let}Qqa?^KWnIjn+bXU#b^$_PGRQx_&Pbb zdHq*D!>?_C2b&+CQOtb|kUSJ5j%`<_;H;MTfnQ11=jLWWBT0-!nftb+;ztYx;Ui|i zqQ!w~?XsgO3mkp8oeyIoN!(aAJS(n?19NlfLeta5*iFSV*v);b z0C@8?e8LQ#!!5?!tIe#hoSm508FY5S&q|(g=F&xHjI=ncOI!1ym+O0Hbo!?U&(-_( zHwoj!Ch4bj_~$FrrQ{G45lr7xj~9E#-5emlpd-d zOs=0UirF{gDz6(w(eY z4Y;%;6&Yd%e<6o17&=_iTYLVv9EvmMZp~Fryb5!$ZJ1B!D$M5Hr+5cv3f@WRRlFfS z?(vT#<~r+w%B30Gh)ai@S42%oPaPL-Yl-dY)?`{CyEJ31n*ER#@l}*gloe4byt4`o zN4>Oy`ETksc6^IJE2yPT?Z(cwCTdS2s)bzu0wXGCyIaV zLV?(<92U&(7iE*;(PJU9!^@AYiTkf<;4vc0D=F)$c6* zcHVt6d{PJGo2Cr02+ryB7YDau5sLs4SWiWnEJG2%-s+&CsE?US*aT0fLXgoY z=%nn2n&%^&d^;O?p~n+>s06-9=6!&MvwNIp&RXDy3)B7B$EK4uWu*XItrtVq%Gn`+ zdsA{#JjspBieD1WkB0D%JGB(~l+bst-xPC7dOZmKDyeO(;k10UBS148BXrMu#F@$e z>DJiNys=u4qWa)~lgoU_6_jtZ`W7zHu|V6ULH}XP?S9)S@$%t%C4JycKp!p9U183(<8^?4lHHu7W)@8+ z#CA=t2c%wgN-yusmFeiG+-`4cc9T!-)wb@r-PS$qALZ2Pbpp!FDbt;mC}JRnBVN?C zpV?CeW0Vui0QyKAm@q6^p9@ES$j2ER7U;3(-76V}tSPhDxyB&gX)^wsE_X50tZheK zSE9?yOiuFX*99@rew34>H$Ez_#2ABE0Ln9u;{~&VXl|EJqywF%n~bgW8!Sn+0O@p7 zw4vyT6+$!iTu~R~>gQA(X6S-iG=WzE2rL`Zs~U=SV+^hj#I7VQ#+ItVSnC*EbOAHh zN}cXg=lIWaZ6f0*WRkm1!T1xc2f{Jx)@FLgBnx}xk?0>}Ncr%ds{99_1Dj9A=la2k4L#1wqic z+9`v>=_lDu!T6OuMlk-EEmX>2{5A=cQ3%24T;FI*u|<4}=T9iH(o1Zgub;_~F2l-A zUMQid>gk0_396kIt0A3vbuw!~(#kE(rf)$ziPNQi1!(g6!vLI;5+zR4HDdDWWM*@Q zBCs`KQl>ST{4t{3f$=2-z{XKOFrployJE^ndot{1$vw@+Wr=Omw?7A0X?prZo2C=s zPmsGQHMy(xhq^!IR85Ga=o4e|{8abT7}Zm)@6DT)f?w^`o&E(4zB%ucbwGv2XaI!F z>|k{YskzaqX%xN+c|>?$1qe+edwqW3*Ea>*nY>9uzf zkDLiwdkVG@c9{4;}BuOn4cwd{KvRg^X_96|En-Q`KS#N zcoNQUKdGf~-;Pf+79<$qLs-yWq7q&AUMhb%?S=zzsrXq|7*uY-jWOUDPH_$ZS^_%( zFrnjc12KS`Z*BK4>ZAus8rq>4hvddBhV{2k(5YyafaJIo%%F-D8iNyI3l+C6j2K7_ ztD?)|RqzHXkbiTj|8?ge8`V#zGwD8C*bamV6_;UC@bNldtbWPE7A1>1Psov2IJp}Umqw?zIrgjpJ{^GuGQUMvu9G#2h1z5E}w<&K6`?r2E8+%&N&gw)AJmJGI^_*)g&B4ZT-P4E7+#4$1xAFOrWoqDXS@uIFZ zYkMm@#RHfXU#(6oP0PDBYngtf>YYdl--=_5vYsLq{f=M%tnAUhw%DVupVQ8}o%THX zBLM-T)Lgz=J z2)8W-i)m9Cb+gC2P(1}PKK=|6zY6Kj*h+^!96I!26isZgxiB?TJHNRQ$lokuIfC+O zv>_>TV_vTK2iRLzcKWX`ZP9^flL1_suvJOZBH#)JEcuC$5BA)H@-^+%Q!RkW(q&6m zw3d#ZIkMbdTwcEP93}j{ZR97zIH3+)cnL@cH8)FKA8%k@@EncK7#R!MePgnZM}Y^} zaE0!xI{mklbc4{FeL52uepLob&=dnRz)t>)#<0t88iO%v>S|grnum6+TK&5y;nSe-~2}pMyh8FMESq+!1bfI&LW!ghLo54g^|99zc^6M$ z7Wwj%pGAJvo@-;^{IuWG<$tPAn$hpi!QhyRLb~{CUft^NL(v4YFPI32BJtcbhFI;jg#79YYQB6Cl zND=34qegac+u96R1~h6|!d=r@y?KMmU$Oj*WuvW~>^P-VQ=$t`Hj%opW~hM|2t}1s zXhv4dBvU*Hzn9_1TUi@8-eF!qCJ$?Z9on8aAT?D%de1`Kvi8#sEi%H%4o+J&q1;&I z`sVfVicWZ4U}SOY^LA|dZJquNu+!U$gxNu)8`B)}lXKFR|2Jtqh}~$Xl$c6aCsSz& zk&L$|8C8H}zaz;8-rEfxU)~0Oe5~do0y6bI<3dP#ho{|OX@8TIo13PEa_o3okU2Wm znMoTW-6a?TWVM>hK|G<&@K)ZW_5oDcxs>J!S8zH)8-%yg{5`mZ9kUk3E?ylvknv#; zNwIT0Iz>_{{ZdIb@kXJX2mmGT*IC7;0vEQUb(6tlhFv zjVOz;VBx~2H65?oCpd>cZ**jbw;A^DWm|WqTCJFJmlt!p&hy#G5z)pG9;Z%O71+^` zR%(5lkQnuGT`Cg{5^bJN<<=Hvj+R9?J=><{_cmXD8}0asZ$*|Qw(F+09(kW1@qNF4 ze84|G=pQ%x$A|pm7XJuRHOmhJ-|C4U_K%PF$4B`9srThR6n2E{%GCSwWVUa%lzZ|+ zo%L?K@q-8c&5bwSxFvM=Z;7{5o`gUa47Gl^*sk@>Y7aW^XxQC4;6hgfHETBLV%&eY z)4$baIf&sbx`?jjmxWj!m^nqILT(W6P?cY4)q3WXa-EL{05Bix%r#^_(t+8QQo*90 zYR$htD;(Rcr#3f8!yl0!n9l&eB-RM1r>3ozv|HiOYLeR2s;|#J;&^|!Gj)U59~Oz) zbg8rCRrpyz>_bEZ&;)V0*$ubYwZ2#dSajfrI#6Lmj04U}-#m!JCFyE5VSh^UT68cY zUZXrpNP}=iJ>X8DznUv0kyfe8O`$qsm024YQ6K0e2n+q2ogss1a@KvYs2AGG>(vqP zZGsp5No{w*VGz1(`RiD{iAx6g*VYB@j+4m_yPY2aOJb;@6yII>pC}1 z%dx6AqscuFo&zATX}UH1s&G_z|8Q5<&S=$+VbRXQfbRv>l@7n%7z`EG6qDSTR28T+unco|{WbD{ zeX7&{WNB)FSO6*Z#$nTBa(!Y9ldHB@?!??=wuc>wjiOahNyEwZA-{CQu)%b@t+RTv zg0;E3pXDMXe7e&=AnZlIZ+{V;`hCIOrJD3~;qB=c#vY*zCYje|-4{8gW6t1ec2W}; zW@1mpe5a*!cNRbbI?a|y%Mu^5VCT z4gE8*_-6(c2YNwa`9wk<-SsI1-jk=G!@gUrH)1gozgJ5f;_aJG z=U8)(eg}FQ0?8^F9);ud+jab<0=?|9Os@6O(UJ2IqV zNwTHG2lAQ-vbJ||!^)WGZ`SF5KZ`}86^uGA3r1pzNb0oEFW+@WhZYDoS~eY-;4RxO zn4NUv_xG||1m;U?v98vD^%?#LaKeQrf?;gijQ2zBedJmE3Mb>aVhW`*0V6y~zt#8q zJszElRH{xq<@t`5mbfk@c|UOEiOHBi_pSTPc@fqHmtgz5#V$U|v7ZHnC{VnoAlkk9 z#QF=J!UxMgOMVodp6H#S10W-n1j&NoU*( z9-1r7t?KS{3W#6AKlJOp(Lt57VE1sVe^Kj@r~_iZaMmiuG9YQa8brg899<>lLpT3y zB<2n5HckT;Zb0>i*Qx;q;$~r*%*XnV!&nb-LVw&m9+ga+VLXnsSMShbbE+~PSB%aZ z9ci6$=DZ~fM;5GHa>l5lkxq@y9(&)O@ewh~|-SAN(x`!jhz$B;Kgtuf@IOAntl0GV>8ZX~?=?{+~jC%kmXr2^lUkF%V!Y z@Y}~o%5E%zHTw5l>*S3`iU(X14pas*Eh0pT@*wQ|br5e{v z--QtFmdXRJK?{bk?3U1+Y84DZC~FCMYQZ2l3AZNs6PGJm*N=^%Ay>oD-o3RyX{%PO zObygnLJ0v33x*=_KW!BF2bv{Z$(e*7Mn{>1uNYZ8a>nS${MOQClIRt!(WOflk1kr) zI%DzD6{VotuhBCXt!SMyvSj6Xi{_7>*}7v`FoT->w!2RrL|Zz;CNLt$CkEUe-XjioPeAp@X>84WV7qrds z&b#h< zuA{PY-Z|D5c@X6@pQ^@UC&I(}c@ZHRjWDScsC&@+b3jgZYGtqz0w#^NdWyyOBqVyL zWWGpyjGo*n_T;ZRwyFIAiwUSk#bqsS`~>2+!-IJ&^xz-ens)|0tP#+Er0n6)watD1 zNZI#AS11j}c~|USnHScM|8$*BW|~~2{Q?xF8&ka(C&v5OI&u*vnb7-!6s1qBDIb&z zF(uOivh2zNY8gCrm^VUD;aY(dLf(WRq!Pk+X|14k=+Nt*?VC-B>HX^vN5n^b=!Q%+ zg>LvY)ice6&PFrQL3QPlR3Sfxe<+(EQQ%C06)RTyJ=pchj`ar;lDz(J%%X51;cs|G zq_&v;ZBmTp{yP{PbozfR6KFALGe>$;MUXX>eDA&Y zx=P--Q6(3`Z#5$G_}rZ0WD?a^T6b0)z$Ar>)nFWo(d`<0z4yyfaDeJF?kt_8c!ixO?Y$Ke-mimHL*)2 z%(m?DRY``4SsLkuHlc^dVfyf|b-TjZ^0UtDDds1g6WpKAI>_7tbLdi(_zs?G*eD4l zykj)pgL3{Kbg_C@*|B#Wb|~;Cq*FZF*o0(_=}i@;4qj`UsE^Eh&Ah!F|7R}LS$Nw_ zp3a$AZ^c{<@^=^62I&|bbGp8aVB$FV(4auh%ijiGe$nm@*&cTxCYndylpvHS49G8D zjCu%e7W{^d>#A?8`!row1SuGb5S6UpFh4`bA)QHuiQp)CHXg3MP8%eAj{`>MlTZif+T6E60_%g^+3}QjjrCzp@MA%ow{C08qtn$i-0Fp)-09l5 z-64hoU{BaUgmlI;j%S$3rf`woIFP&Qt=NOAO(piq{ET}D170SV-N)qaWuBg#vke8M z0c?vy4_^bXOfKt(k>+k}DFnCfcd$t%sSxzR289}O@9%DN50I+RAos1NoOi8mkWM?l z@q{*6DXmG$&%!?8hQ2szCj^jU@LWSGtS~!rsEZ*$S|}-D-k|n7ax~&(u#Qf|Gm#UU zjK`46q$thGgh5Lb(=JI#0fRNh#GVulu!=681YL!&Ay<0@dpY-Ctrz$g{8#HC7Y+Vo zB?G_oU+pOW)p@NmTc@ua9o3>fU(7EanRo8UvUy85hIVKf|4|lKwBCoig+f4UXkkW< zc%QD^LXN8yMrW@p^EE0?68c>&ev*XsyZy;s66h~=dC;~~B>F%J_cV5zJx9NGVooYo zI^#Xq4f*#VHPj1hcjAYTc9l)5hIz4KPZ#H=8+~#L!Sh5bu8YYA&LNmK)G7|q)f0cV z%dh1eGAbW**>Y%dGI3#@D*zDO2!{%GA#4K)bz=zvDozO!|8k2t`R!;A^}4fX!hhr`2u(jEJgpmSpC^pXbc@C0 zH9cW9Hi`u>j%anNziLi*R?2N$mYZ4j&H7!le7SH4{Tp}DUk)RgO^3U3Uw)*Vf1{f~ zA}-CCEEHKjTB`jq;nV6cc7Ypl5JG}wYF%gTTC-ziuY()GxP$pd7R$OME?SN#Gnt+3OM;Dprb$#r63O3On6;~;E z4c)X==%xo0QPz!!=XCo!B^^}u3&6UvwPaQ?9D=3#%iP$UQsU5 zVr+co$c2e*XB!DAa8(MP6d1vQm0i01=LhqL11quD6Q4@i*ch&re5CChcreW(Egazs ze-p??L0v1mC+%Tq2_nVS3GhtwqC6GEGX$d1jjSADk;oW3CgtYYy*$}xM(?I+wt(ds}7uiu^u;XrsY)S6#W>AqvM6^ z4Qzx;_awpU{E*d6HV`@aRCFZs?9?!%^7YM(e4d>FF%9b*CDWkhS#bH~YMW+97qq@R z9B@N?_v-R5ohX?~Nl?AqrsY?hKB=~MQ3^XbN#CbP54B(Dy}E@;QE%TOpOl#;i}vz%yeyfktFDi;S9 z8z8>}8qk7R{0k_5C zBSbM8cQF#zX|{SPmSXkB#5uJ!OBU2x6{b?aLW{iEUY;7Km+$}^ybr7Hpl{$%ShRJM zZ41~X-Ybe2*bR^lKqt1I-TI2Hc^AJ(!ph*_K`Ku`TbRM}ikN@`n5l-2!ZX5$s}TZS zpX99hYZ8$z*EPQfTfqHXeg#*AydIM{GhCF&v7M0LElD;Q>UCx=rcHh|4`fR$EO zkRASFTWD}fCFnE&`7E$eq6nudRxyM<+TXIRQ~ElsVn+KnhQ(k@`n|vQF>OuL+QW`$ zs&|u_pI_0bG#n(w{YQD3@)YOaC-Njh5S|xD;b8}4R@j#nMrNpN1_k-BXs!h!$;LM9 z$+s!UF4@LzMbQooSv#9Hw&QH}@}UJQom2OsU@v{qCa$9+IRgOfq;$#)Rj$YeC_6OJBZS-n zf;V?uXzuK0sCIqR0md;np#AcW+j#9S^N?RU2x8ObK2=IhDM#($&`iI^0Y2BeXM2aU zMTAp3(-0iSgbgcX3?uP`Mic$SAaZFi*9|+UY%{1%q`w<1b|uqg!87(h;RdRkTYi(4 z+><1WMUVC9vEs+eTp2luT5mvfbVpG$22~^VyMjha-Y`dbiM7_%vHE2ekxqLe zj|~^w951iU6LAK4MN^I~s7|isIMyJtVTXUk8iYmsDQx!3E_egr3bdQ8OugvQ( zcu(r;Oe16iTrA=!2nKt+M((Xs@l>yPNGy7^s+{hpRS6j5_A1D-;@H{m%ZH%)f;Q(!AD);L5C#Ht)^&oh*N>d;xwgiq~3P zP^z8)_%%L8XBgZAn&5(86R7)3Pz1#ij=MXKcRP+-)nEZ-7|{#BsGu-=1-rv_kjNoA zAlwD9U|ev^h4<91&yT0(UWAX^?T*K|#%4nx<%mZ)In_tdW6ZC%1M!-~!h2;pI`o6V zds;UgATRe4a@*2%r$=N|HlO0=$=m5PL1(Dum{V9f6qEaOaEWGpq<2v1>9Mp_FY-gV zgp^9__4X*94DQB8NW|I`U1x|cle1I0b~)yhZhARpOjJuK^Si}aT7xAfg{i|_*{|%{ z>6e3^P?HQE=MG*TTUn13D{Iq-d*aXs!XHXk%))(MqaL)Ue;sn3txOa8zTiP3<8KU`iwG5jY0OWGQV! z5nu~a#o#cnf}vIZvaSEI@~RZuGMM2qj)@B@ViB?#Jet2Yzu$tcC6im2o_jhcVXn;} zs7G_Sg$U~6Ii-(els6=wiMvD^>Mi38uSNfNhnEP<2lcuREBUydvSBr`!8z85d+6~} zGo5UjD+C%(2DZ{!V8okeG9r*y9e(BHU2Z9z6^+i^M&OwptN)DLMamJ>f66#`UdSW*}e(3ubdZ8ypk!;L@{FmnQ7|N-l*+UEbaD}1Y3lC zib99W{Ty{ncn8SQV_t+Iwv27MEPIY|*e8*K9tO^VI2jq3cf)* zSCXozBzhG@&uv!cXNBeJ8Vmi4G@-4}i$+@}NMWup7eTU`Zyc4T^v{oAv^q^ko#qdo zye>ra73O2)HN&_r&kn;-IH+M=9jSYM!+jAI>!0s)yD4pX4vQwziB8=%v4U}%zkpY7 zz3QJVT7)R|kJyz<_H$TdAoZ&LFsxVrb{Yhot=v}}Rq>^PSxLR)kIFUpIyw>DO1^bcQ-? z53HBiv9gWmgRn*Lu|)63%PuD*X~B`ML5D##O?^z|X$g}FB(LD_TDo@@eg0eeB6806tEw9R|o}BD2FN7tElQw!BLnD&$?{Y)?HZ zueTZWbWUPMcY=lHa+k_@RSM0E2Sg`~K9Siz$3zs|X7iSAVDAU8xKomLU|*K200~j4 z2he(-fMRZC9$tg2tbu@w%oMJ|kAt!tC*X6jAE~;`oV%5k^3o9QLdPlqHTElnAv`=Q zK!N>g+qTZ1=8c5JyP6VN1fmPpBvN1LP^bBb7*P$Lj@LVpA1Y`oQplAbm!HA;wUhA? zn9V(uR@^(~Ke1$(yV80Ei_191vlI4~2Xeyj0tfj{>16XIt=5aY~IQeL&Mw zlDKv>o%y9iYU;hM@R0*;)R+MK3JILzyNHi?RC#9=YXqRA0}0opYDl6$&wA%KzCQVQ z#&bXW-@x!xIP)gm)z|>JIw+hl{xX{Q>m#B8Ziq{Kzqx!;xFPB=g92H3?Gt%t1-a4k zbMV2MioVnF&PtMw^i(yVIy@|P*-Qs@SFOR{1xtO`A$Kgh45e$ogJa(oEO0myHIkg^ z3*B|h4+QC=xbVHnZWg~b>nb)midxRm25^1F;E^9-Bm}* znfc5LwF3*9R)OWw{$@3vb;}^rK|0=Mihg%vG%4XJDIIb%x8&}wd4Fq0&&IwPA2PB9 zAVvcH<%iq&a!E9{k~3{q?Gh{-3o?V4np03k{YsCr3g5+0*(e<`Cb2>1XH&eALGafn;7Rxsra-DBt7Ar>yJtfmrdDNZL51rQ8Bdc0|czm<g4hFPkXAD?dVsJ0hRwscgbW@-_GQg-}hk75K_`xQ9wD$)S zzNazmN5jRA8h}`u)=}svX!xsc|1$T^?`e+wzwXYGlxz(`d!~^ez(BO^9Patyv(L@R zV76+(8MF+$B9}l@Vdqji0C`#j=D+4*-dQttGq9^vA}LBs=9<%b#VG(j1i$SIhRwQAeVjqE7_ z2`wKXkmN%kaOd)FadvYzQ?cQMrjVu56`Yzh2{vmn&wIU}YsB$LL1jhRuvsqc{!lLl zHfhM}=+blm6Z>ba+!_T-Oet|}9DVj;$@vLg{-r)t?ZAbW;F>L-i^}SsdQk41kKvcj z;T~IzFh8oK5q5;en%Nf929Geg;=m!w_if|IxA)kURAR8`qNJ(RV#$Th;+l4`Bxe%5 zGTE^%h?@{+Ts{Ue#z%w=wrSa53lzn{#&qpPp>kHubq`A9{y9e+EyO|N6oE%J{@&8k zYCeAsB_D=w@IES4IpY9D^@g zh$i3E)hrzaE$zh;v>ng1h3K0H9HF5j-fWz^z{ZQIIo+=IO{?H<)1*0kOVoS4a3a%E zZ!1!R|I9-CG^dsjsvb{txq0cX>h|AK?)uWVd8AB3G+s;kFfE5`Njl1(TuZtNmQgo2 z;T}$G%rNrApo&g~4@qVw+))+_J*#oLHj{Eb-pZCjgA*V55aoJrutDKIxZHGnV{yiB zAF}|iW+7FKn_L-zOSbi8q`fG#|;kvqk6b5tdI5mF1=C1s6-KK0jS; zVoo_GUK=+>y~3W}UN~H|O;Urh<*}j^#o#5o8eIfOuJxnyoc?8eUES?p(>3FlTwlcG zY&|#Fo!6NQXN#yqONK_@I*_LszFW9OA2wM?W46~Q(&Or12#mjEiRbK?N18B~!Irc1_U@(m82MGL8-r<@z8Ai3MTc;osxrJnf2?w7 z-cI0`sX^&m+4nV;EmKuCp7nfNZ90le*>eTOrWU@q`JOIi>6y174G6GSwDfI^^W;wS@U_s&qzqhW_^)m=Ci%r^HQmCpXv+8zpIG zKLBqIX?)z-o>i=yhqCa>fr>CmVd}?e#?cB|B+&CmTZ?2k^CMiL<>nU85VX^6!o2o< zjkUu?TCbgLGB(xzbI#B;mrp?8M%#}i=E?V^MROX!s6AQpqZ_!C_YD& zo;u`Rqg+!wAP8%vt+Ivg3=ul6Xi!oUl%o`FB z87bJ}8ex;8@`^|wmm)n6feHmp`T;^;ONRR)ORbp%DZF9Ug8Mp%;W@dmUYux#uy0Zh zL`iL`k?e$&R}Q`9)VF*p%Nh9d@F?i$^48Z));#vEOojIxAn&BHTj8qv_VAn%W@UmxQT% z6Km9Z2%)n9Sz`~xeIh*a7skP7Yy#M`-IqYacI!_&OZI{yO>%;mP&q`U-?N?VavpCJ zu&(`EMdFBu=c?=ghw6oAmh`(YnH7GDtlProfqvr4)BC<~@Ndi8{-K;*GmMI6E;nKu zSh2G0Cz1kf?7pIu=MPnA8x|cM(yjgQ7+LtG=hWhO_8#`f#X|P>3jT)ZJeO65vBP2- z9hr2uuNPlpLjuh0@Rz+=oKGgTVn8cy=_c|_@|*GwW4nQ6%!~?6;50+Ahy0+%43pml zL;aDu{Bk;+$Pu;(vvK@RT`rEuAw9HsiBEwAESR`cE)2%|ATd5rsTO`q7nXZ$paO31 zuB$pKT#-}ukJeoatKCKGXBKItD4t38#Yt$Pcjb!CTv$NZK42@G59KhF&l>748ZtLz zFBxqUXT|f%^NRuuMcQbJ(iqwr(0}K2Gok$a;Qn(rk)Xr1CZ>B%7$rrgIg8VsFH)dg z_%M`;ZiEj{N+c{aO2epImJ|4BBY}`}dM-mVolp^dz6~I!gT({5^NN^h3iBMNf@V`J zB^#I!NG|x|}hMrrCU_-gT1Z!60thw1F{P=aBxy?Cg9_E2qlnV`TA>gbuddcDWiisuX++^A*g@a@}C$)Y!HYAENKFpw!# z&NHS-W{Q^WAt@S5K@DqYpO7e8*UKtM`JkSIlX;+K50GJ;$(3G#L<(BQ^vaxer_E{p zE@D|t9Tq1ud-pJ(D^jf&ZL?(>!YK<;G7}G9JCJ5V;{?V|DVQ_WiGz}Ou}jI-7tu)-%W{xoau4iu--3n zA_xBBLcS`WlJtm6oT>`7(gw1nfHSe@~bH zZBG5AV^hxyCOP6C{>#ibx8#&QOzi2gbP#b(-i1@IjL$T+a^loEc3S(y zW6T*W@nm6neA`z5mCAr)`_h%iK+sKsKW5?TSQuQGpD9QA{k^!?z6+{@J;ZT&z8^nnhaW{!0UUUkZCc0YSG1C2i%L;)6CMJM0bDGiIQp z8uUqpCFZmY!g$*0{qiBzBQZR=!s*Y8EYV=oTC1gq@~s`!}6;OghgO(^yfC(<4t!bY?*(l|HXIi&xN;=78L(!U5^xm5g_`@~k2BMWaPuVNBY3k~ rU+=#QXVvT0Td&=^snt3Na96MQ+;;0-t=2g>kXF2E;=Q8fx#$AeW*HPWg zbafW_AO3iH7M>q?;DKgaPl?qe(Jl2Rk-m83q-%OEu+2NS`^z~eIroVbcZ_-Kq|poP zk6qOL*88s!;stjnG(4|E2b<_D80p!rDnRH$Kr^z0oq;k)1$hu4AF)*QOyAt^g_Jb0 z^RWv8yY||T6Qfsb`Ep$EG@Ezc1y+Q;^f z!LzRg&tIn}+rsvb!Ly$Q&)=feTVngi;CYk<&);r?tl0iBc&1wL{Jj=aV*7uMXS4fB z*v+nDob)=nk=2*~gBN0lLA5?RM31;{Gp;%a-|Nx*jT>INhJ2s?+V>eiP=%Q4@`!nlrM)yxx|Z6Pn|N?=B;9^t?#8AO zo|F~WZB9F>`--G3d9|4R7ISv6_H=H0Mn!yVJ^ns)zzH?Mr-N_3y5;SH1U#=6p5h1cW$16PUz zJ~7-UM2}0}e9C!nL1D*&zcm8Ha1A0|f|%`^15`$e!u`GeG!O6auh}+)FWu6TxAg64 zn>Tb^W6$+Tql*hV?RAf~KQr{@#?k9L_Ple>#3I|AwF4%fIC=2oGC&@oA&=CM3jk)c zSia!-=KN1IJ$o&B`N*rYj(sx!qc=~<3^X|3xHNcP$MfI3r}(GjA!79RM;AH#hb|~` zH;Uewz|c8WY!kMg_L5BT{>4+?6Qf;Y#PWUjboinX@bFJ`?X_^pplgH}-qqfid?;<4 zyP#-HMQrXZr-#lIBF&W{7Q0SLUz9G#h1&D&Pj5>4{950YnSD3ed!GJbWmCGC=^87F zKC4`xM-0i6-fQ%^w`F~BS^7tNwjA$By8WDMJ`&=T{jO8}Wj#+j^RaPa!#U;GcdIXO zXO||wB0h1C(jy-&NWAP~3|}20gRf38R#IfTYrI(W!G@_m)IZ~lGYI>m8#~k_ee&aT zn}_#2IDCOfTKB1|Ciw<2Xm9znP?tOHr<~-tF>?6@Vx1V^nji|Fww>O=9QhGh4;}pc z(jV6!bF$4YJg%cffq44LOu$x@nf^rb2@7_--t&^xy~EdKh=cBN8qe_xPv|P(>kvn4 z{3iWo{6@Mai`-9#oZHvzKe=T4%0G$EGJAb6vnnU|_@=yZNte9$U;flb@_szPgbwA%U^|-2ilh3;gpr(t0lCx$Pny~(kE+Sg9G zCGF|dZbafNQJ8sxmBh{|Ki~7+am)8j{+>uYM-;l=vy!;;XZyz$-7yulr z>AJpA3aYpdUvNG9p+wg;~gH6;mQ-aPdruoYNMfClE`t5J>Mx@*Z;BMV%u51!RwQifMnw} zX2T}t@vPWEOsQjX`05m(49{L3Upt5ed`%V$_3Y*U=GhzIDrgtO+2DF13Pt|^j)~?1 zPc^$geN}s@chWaAzn$^)JLkPM{f9AE6^;D($lZURbkFEZZ}`%4bmI|2K76|5ouf|n z-qP>%YoJFL=`rRr?sh0%ImSXghQ+^m3}aozBLDj?h07Z?e!T|0I&4xg!S`ON{rJd7)^EM+ zqQ#T%>M{S$?hicGd%YOsDiL!|N$Y%{Q9Whp)E~~ibYiFai|d~%fBxh~R9Pyrb}rpr zWK`+!?Y1AzIYL!=3RS*x7il6aRzxUPL|DRCrzqiTl31#Vvivs_Wu$9`C>Z_vH5TKR z^5#{qeDl%RwcGc8ecfC4j^1%w=chV+@l1X-WY3F9UMUJ5?G_tl5;6UvzaH1|w%fP- zy;JaSe}C$7e};XAFMhsH zS_g5@rwiWef7?9osPxw-{^RJ69$No=_vR7l;DTkE0Lv8tRwx3jlmi~%I!-LBdAQP9 zZxatc{4iVlbI#Z>xaQRvTfRPbIS_@2h~vewPi_jG?J;J1%G}{=AKmk{|L)uWS2Wv-`R8c0ISbbJCQ`ewR&I*)L_)6R#}3^MH86eXK_2IEBpd z8i^Bs0SWN1C>6{5UH;kN?}Tjt3xzGM$K`)Y`nopo=$z2YwgqQTySaz=@}&pUeY-bj z+RshP$hKdQnf^xc2_JnSwlsC#k@oU~Nf%_U7;$IubWHji?h`aJCn{u0H8S3Iks0AC z6ZyWe%cr5e@?mByc;xh@`|n8|wW9YGubuf?%Cc9^c<6^Wg-Cami`;XEKVur}UY(|$ z_LFniJz003b!f|@uO)Z5=Zw0qZ}*51E}vLD?&j5JgW(m>+yVRF-(3CW{FK++yYFed z=j_Yx8ThZ$_sxMPcap{&JOnLe7iDTr%lYaQaHumuumP@$c1JQBb1y`tSoZAg{~FY2 zbUgXYVZKWyZgjo3cFR)7;_o-rz4GAD%8Emq&-iHF_y@-Iai2ES*YvgHN{_eaCFi_$ z&@*r&Qo5h-KfM8-uz35>*$@A#`PIeO&U#_!I53YNWmRI?3zwd=>m;Lt+)pmpa$CQw z3L$Rmcj1Bs#}589xaF_S1Fze9|2bR5@oBpz%wMr#>yTyJ_xE{seT7XF_q*VdCzs86 z7XBTl_~>Ey>Q zz4g`$zY<5eR*9^mAH3>-@z(j$X(ex`Oy9R}RMP<0YEjsBo$^F*=CK1S~2b0l79iBvZ5dV z^S}F!sJ{ETLub(2wPM!ZS2E1EKYSUxyLZjoiyo=i14jXxQUvjmC%&2|)-FPPb%-!u zodOF(eE|t zonecgd+dnK1Lu~fWzGmZ-Ldk?vTr`#dQ&Igu=|I-`q0+2xtn%nUsZK}^WZLDG(L91 z(6N0sX8+LLlaf1e$amR$=GZfP?cMgpafiB&y=eAd#^zTwIqieRiiv}qd*(dWHT}ZJ zpB&k6Up4M7a!wy7j$AiwzSGs@Jj>(Q(`oSZ{_E`j5#QZ(f7wq>7dCaDz2m0KF1^|R z%Bt`3Zh7p1FRuIN&cMZW!_o$AKXPT4e~Vp3i_%~69Lf|E?tA9U&&HiLq4B-JO`n|6 z&(nF^=>x{T^WDw=D0|??bG(1UB2f1tq;=Md9`@n(^zDK2?`lQ}`{L{R3j4Vehl*s1 ztLyEV;#BuBch9L-my4qo)-W$*17DpDHHxBXq%a+^e1w>Qs3l@;!;qNqIg!ut+f zb=&N-(=X~;1m=a67blCw#an(n%ar`ljUC20HlF{%b=zNhf77b$LHq$- z-r9Oz$E$Ze^;P=bnrolflR47n?objbo9JI>JEHf6>#lfd_7R6R-gfUcF~xO?$X!`} z!y#~o;=YdWq`vx(g@vy2oYga*JpK8|i+9%^GyU-^Uw!t;>XV!oG|ig0a@4cAVxa3( zF(cIPK%;Kg^Nk^!L`u`p>E8ct=;>Sml;;5D(?m|@&qdG)3b>fGQrN#8^!Xk~`CFNN zUMTB5=h?olOaAQ%OV`lQ=G$h;s^9B(fj zu{UMQ!RPv=J-uz|_w(M)`E2gb*(+j$(!q+5m zDqlNbWK^CkPUovjoT0_x%yz{g-F248y)iX?0s2#FEos4i+buu)W>5U{=JmI({^*ta zpBypn-xMZssOe&EspwH*K3U zr~BX@f0>_k>$vnx_l?J`y7RBQYG8-X6$`rk`SGt!il!F~T>RSI>%K|9C)AkgI#1*u zf3)Rw&u5=|=jv7OzT;iBOAL0MFS3sMFdZo#nhj_G8f>>o&YFiG`|D@R%dTGg8ah}f zmfd!id*?OAl;wJEJhEWSF#*?e_k)KYDo%hwL#JiaE2 z^ZDvRDo1$`7q&Yuvt5sXgcphYgO_9<)2K<RHbM+@Z5H`EUP6Yw`ua3O`FPj6QmAC!#pBwzwJ^0L< zuI!h=H&=?nk`t<7_w?BN-TTnZgN`}v({J9OU~jt~#T9B4JJcwy)L8%Nw_)Aib+sr+ z-rv~K?78dUcW++%K%ly=xC!ijjVP>-T3+}3_M)}7zV+qx_q@9hcwMFO`jf)zYK7M| z60h0NdqP}?_^wR2)8*ix{O}LTZ|-9`A3obO@cPMjZo8?s@7i7O+A{VISoVbbV{y(k zLR_8RsqZoQumA76>-%(dWDXi9MA9qQjCtQS#Ur{u=*{dRIt@8x_{OhKec;A}gQj@a zq)a?Fy=?uaMMHib_QnaDHXS!T8ohAWkOjV`k6uhk@!j_N^9Qj;uuG$RokVYhYd6*h z#x#G@q)=nrfZB;Sjs5b)ZSNhs=U-z+ee;ir!R45u8${t3_OxX}U=Pt*XPwn-OYMZ+5u4fpWXDQ?ur-hBAT-qJp@x3-DwZS5iJaosM84){F_k$rKf zQO+Iw;#*HoO*t>S$Lb*-BxY{X!?{@v=N2`bTh(xG<7<+*T@UMy!yne2?GNj&Hivb0 zd&3&wxPBo~z)S&KGgStl#>fXa2 z)P3y_YJZ!9y1%_aO>;dUiuRqf^Yc#>Z`*mox=qS18-L)Mlo5l@5!W@2DBD=$Z_GQX z_sU^c+I)>GuHV>gCuP_6>G9sH#(SR{?|wDj`_*_K(BpmR@W=ab`{RA2&G9z1Ki)@; z@v{8=n(;oU$NP{P@55@m@PgRgZBpZXRE~G{5nTX&99q?R8-!g%{6TLl5Dp24SnY3E z>kZcWg_BCF{ncguh)5DOk#J32Amj_zi4J)1NByyCf2bCb5MNxPyvkp`x-48T+#=%j z1;Qdlcxz)}(NR=~ecqtxB#TSK6&2zLeILS_d|g!_5)}PKO*kM1(%(RckQyYsq4KJ5 zL<~_kRe?}Uq=}Qm;p#w04CkA0ZA^?1HC|sZT)tY268`$~pto8MWt@nFWAb*QD5nZ_ zfv8{10JvDde9jip@<22ijzq;GQHud$Nw~5mDwfeGE2839HQLgeptsyFPSB6BaBU8^J*Rx}eS*^G9eXL0u9FdwmE^B>76q8_I)zdf%u^BHlod3NFwE72$A< z3N98Q)QrU5=DsRXqt`{}_khqEd z){DJ#sR`Cb#XhPNQ-kQMJaT$}wdaEl0?rSkemeOcl z#n@QHTfQ3e6^ccPVpO9l7OR;)cC3h11)`#qO2&$4O)wA>T-!eu73-;3!~#J-5japU z#@2*mV88OJu?^MUnh6x}>-e=HwQ;77C; zrS+n;L6rF`1EKkWU=U)k)?WgzF%Y7QKjh<5DN|7)uRecGtV-QS!N`Guo7<3e|@M@q^8}&!z9gq$9MJxg>0d-+eEgV|tZ^#bUg{ZU$w2%6I0!5;s zF5m;Y4T_=-B*P*Ibmd)HWj(Y4s3*!Q8`K>$KoIf*5PXj=WBNWq6GJmAUkTvsjq+bf zK(GoaFBbkN-6^_y8<-gK37i`xbt9ipI|{WRsGAb-W|W4T3*nht8-a2F&+vdiXP$uAS`Vu5N%CM&Ffk8S`(-VhtgJ2b&f zRwSaBG%Ct#BjC*#*`HWL4Y-yR4j7T{!Kz_;L61^^i1T9J2soED40uZMPz?-MEFAPl zU{(C0EKuq9Rr*VV#$Cj?D>Lq5BI+e7M!^PT*_Jeb!quYOTjMPYK&b`5B|&efvX;~l z-H0Nk$vopS#*Y(G=p`}=enCo1lz{<)-UcuX%nUSN2%vp|>N052$_QrChp|Ru;c7KP zQlcT!7Ey>Rl&CjarHx;pR9QjjdvAFaDK5W!4qH&^UqXrz3dpc} zfl}kPE-JP4a!`K>scjFY$m5N9Gz)qdH&6PC5g>0(DXVr=5rGm|9MXUDL2k?rjFjIS z(GP|l4wU)=5imA+8c?gsI+v~uL<42e)}`KHO_dk33ZaVn35jf7-4m{0T*i3HN%}mo zut!y6L`<-zVGop=_j9%R_ml@B<+VX?q&;Y6yLeY2P#XW71xI3xQTeby#{;0*T@q`+ z(An__l=3A4y+TYO3c|z!l{8p>K_m|mqlDQ*36zqbLj0Xmv;>+vT<5`!hs|=-lb$2z zi0VMCz>^7-$}8EG!Wx={=yGZLmiS{Hh!>T3(&2Q$!SKYY{2qw3$7D|lPt_y&Wp5); zs_&E}l2kxo{gDEHT^9V2Kv^wRN0!g$@p@3z1LMte2761lD1tfya_YwHZ*DjU#cMu` zCAoR?OGF^b8dEwvMh8&;K3_?=SUa-RAL!-ARTL&9VSs>X+FP2o1?P)w#7c@{>=Z%Cgh3tj}!P4?6E9CJRLb`mKSw!OO{7qFUoKOZ6WdZk`7?K9thQt zz9R3XIt+shHh`wUl(5o-%vyhTEj?lK$&;f3#V%qg6d@1-(MTm?;6Z=P&m1Uxet*r} za7_blP)It|D@_+d8E8NDKI%#J02OH#eFDZhEWKm+8|*E^O45v$3on+>B{%y@%Nj%! zkqOX?!HI}WhsWsi*B4fZEDl$T$UPAT@fFI;$q$3~18&1~VFa;oO*TY_NDhn`!k{BUX5Wm$8waX0hf|eA1@@SMJy|jj+ zDlVxAM4~Z8Q@&Sp^_E3Ny^q+gf&Y?rV=N>K5qEJ&gqt{~kp!pLk}4`SVUVmyM!_&I zaP0X(lATQuED^U#@r7%l;^eT$7W?5DhEiaofV79zBI{fq*a8_7;t`Nzo(fCgXIme6 z?D`$r>sxlaIK-5CFcgNimB>QHag>hhQT=W!GOq@$IkHJO=H;KF9 zcCErtVJgh|!w9PV@VMoCQ7hd@rWY7aD?rTp{E|&dM4Ooa7HSzPak3l$Q3rgbbz-Rs zhf5n|#7lx9vsKxw2sm7V_=9paVTdS&aK-*8Y!HUb7aj!60ccHGlAwPc*<`2;$!<_s z&_*#JCoRzgHic}ICcvdY7=Q}!CZIn_hH+|A5|+j}6hIeJ8_CLr6&ir5zeLA_VHm4G$Q!H|`mVv`YJzVtwMB<0md0Et;a{Rs z8PE-+UlUZT7&;!Bl-rjQ$SBfHA+d&TRXoLmMqI^@%7&N5m;o z=v+YBm#55}tU9WR>65uaX=8|1e(-z^v4B}MgybDPtGX<;^hXCS(DFeT2hKUL1o9of zjf!ggpCjZVtyzuH5(eOOWD(#Tc^gV$U{S)4hz7_KT6ut!G8r$bhFh-Y3&4xOgN6co zOrk?W27_}I(rl`UQHE-Cj}C|v6hB%Y5P`uelZPko5X1sl{BVE1+5~FKExP4+JMZ96@JDBvM2I_f|6$l6{aUDbgMe^RFJ|3?HD6f%%N=zZ^^UASxGVV!#H!$+!?l4%Q7$gM$ZRztWeyPmCiO1_m%1(K%_ zT(}4nc0w@{f)-z#9@${fjTf;n=3Om4;A%1JjRvtpbag<*=75b2n^vJjP2 zBO;Uvv_%_ELvk=e;U;-b=+Y2bQg9^ja84;)phw9nr0Y3CU^Govj~Ww+y>Qz24Z@Wq={oZ#72m= zL^M(keyI&fF9}q{Sc2??(hYJ9biv#UVjfvecl3g;^hRgsnBMw9URw}cy{0kK%wWY3 zG6oTXw+_PwZykTjs{|ZYgyAt*4R9Ji1~(E9ddoQws6-3ZC4m>9sve>ajRF6FEj_o5??!1;(1+wO zu0I1Y4p}NVB}_|s@@`F?h}L;)vT2D3wyGBMy__bN?^tbeYTi^Dj1CkEvccD#b4RkK-AccL>Zjw*5G%p_>A3jjfuDsA`S4!R@-4erU25?!<*)FowGTwuM zuaVCgW;;#e^UclLBU7&y7n!Y*|j?POJFk zRZE}|WFn$eW#Eu5^ae}9Il*ulQkK=6$3!j<*-W|SBugNfG=}+9PAYR5Z$Mz}RLLz% z!i#tzl3j#6odK08hpY-juk)bHDeVHiA>A@8O+pigR!d(~5`*1Ng&5x>XNg1t|CMXD zGz(c!JYWLcsi`MlPhe8QSk0{xl3&7dCAo|lBFKOJ^_(5#oZb>zn?xPOHgbs(lP+(H zz?WDmrWvl$y8&qYh-nZ@;#D4WFgUz|s0mEMHQ06$5?H3gALLxPrQD@C=k3}h89rX!lCrFqJXVhk89WKW7F?}muUEfEnfls(&DSXen7{up~Y^gv!{ zoGsLqxCL9XHrgmtF1;JGqHfnlD@zIlZDb{;Oi5TSR>0u{7uHL~fd%Gr(l1e^N8}|M zEr&jpdAe-Ms;aCmZfMzB#P7WuHfX(lUu=~z zn*!v}q=Q!{?JWC!vLfFS>7p>Jw00s>Q4%6`#nJR!5CPO70svY0G^b&a7yElcSs~xC zK#$`krWi2~(+WWgBF7dD5Fykw@X8og-oPS2u!<>2D=u=yOm=TRmr65^mesTchO9`K zwqk+yQPN}TUSusqxw@4r~MobcpSgHntSe`7csRx6=55dAD z+{0k0z>+-1Tv}Huc?(xnQl(08twyjNiIzgDOKSr4)T*8zK%P?24@`r^PDrd}=tWcm zs<1dKyR>LtacTCv98rzET@7%xuq6x%vKrgGBpk&RWE^UvrP9w4^Xjqrj4csO$5QNR ztM;zuYZNvlh+P)^FsyzipasRShMDjK>cp^n&~>;D()w~ zN(uMF?Q5!P#vV>(K!-@jGUDo2!PNL8@M+7 zG)$X-s(=&wZaGCOJ>*UBi++p6yZrh%6<20^*d_^7d%DjrtLFlM0wfPjF@7 zIY#|OoMWuRV;yo-NbzxGJ(plJJZXjzwTNg#HR>Q|+E9%Zd?e4n{q!tdX5Jfvq#c5h zRnp+=on8Xlph-nC`t{{Ve$bk03APQRaDHttxDr7!-RJVU0B-UFA*@`$8ztutEg*r9OD zQ|9+@B;ZMh(yW34_cVlShp$Br5%1yJdogjdM|h%PPaZWH9`g{i48glxuxAOc1^ydP zeeADsxAxskJCW+x0mrFKdX z-oRx3U*QjIm`T-Ub*pfU@sO&ckV=L#QA)o<>*^J}!1$?%+Gy()CY;qG)dd~Y9vjsf zTVL6^%axmsnR_8^v=stD@e<@5kXWme+X!S_%7$I_sj9*GplWKj0i{q1pM{PwO zsQ5_OS1U6a9*@Z8PDw1}hA>XT(jeK7A%cR1V=Oi)B8#?kdCMC}LqenxY+}zJh!75e z7DO0c%rXS1j3!L=>s3v$3h(n&A%^fE z&G?|MeA3el6@ZYJCr$M!^RhnR;QyeQ8X&hiMT2pF#vIUWh3hXs{^f=QQnEe##w_C zw5tk9AgEbN9tz~*p*iQuCyBqYWs*=ym)qM$uzW)0VFQF*Tr|)yELusJ)EE{A5KYaK zl?ZL28qh5SUcCYBY2TEjVL3KdQchWtrX0Q)9`LOLIi7T(*n}-Mo&jQx8483$^T>~% zk679-Sa{?uCYZpJDk)+;1M9*|TBPpb>G2kI3Q=isWJyuh+Zl$GON|>)ROep|O}{k7g|h9SG{3zjDiVIrb>~v!ZhX$>ci{|H8mb9tYP~UwEN)O~JviIMdI_sOY#2pKin1jB zG1b`e=}}%{W|TLY`?E8!y}?sQGD<3%R)I;MKOl z!ZH$60P!hOtP4+UugWqGm}YwtNCruAb(aHJj)Q4@STUvWK!)i7G^|86kJDbz_Tz;qlG9aUzSJTD1+?jE z%;EkMSseX<_>96JS|P^+SU42G=|B8X7{vw*NF4;(cuRqZC!P5yIzkn5%)wfy5c3ux zt5X{r6RsFTwuvM2xR*4qC5R(PTr4Xv=1^#o;6btxs6a#sZ=*uY$BoCVqX|IoEu}zD zR$t0{$>9`G2@=9F59G(gc@IRK>{ypV=c_Lrs5Y=-*O1noq#uZAU003!L?UWUxva&e zekF61enX^O53gQeQyZLiN~G`TC3mMfLw~H-F!adKHBxY=J2={#3 z{PR(Di%r<`uCn9XKYE*EbIP|lwp6N=Ys>4ts5@RCDUOtlxEOB>2-}Y8ZCCkLHOkYC z2BEm4a4)b)oYd=uwqkUZOrO=}btl+vjhL5bd8ze`^b%^4c6_YZk}MHX6$TVg-)Gx+ zaJmhbooXvS@~|tPj>7I?y4wGL*3}Gi<}fjszhwn+EQ{&G81HA6HRf2? zq=~$r*i@21PG*aj5WdYepqy$M7I<)5v)Oe;0rBWYK?HIUfw~eoBs|bBo<8H5wc90V zOH5HxA?0bPh4Bnr&DTQ;NWLBD-+h;D=8=$Za}i#Mf7wWvJZN)20NK@g;CkE48C3kR z&Ha$2c(*EUvbi6z6zkfL+1!s>in(?RyyNB~V$*ZcUs2vlK~gXaZDxrvHa$rI{w34- zdyBZXRtqFRn+I*Fxr+dEgw#7tz_kT>1_R*Dkb+#+Vk=O;-HMn1fPX9={KLNlerQ21 z@yOJ6a8Hx{E}~0_rH<5eM}EvN1j`L?MHiv&GDe6Q8Hn8o#e%v*;7{Wr=tr1kV-ZAP z7ZAaN#6xvF-a>V>s!t#tPsD4GUsNwU(jfM*@4{3a20}E%0-SsWc%_L%h zK7yz_+`?II`%Da_M~iZo9c+ubDfT!no54Uk+MS|*OJ$6q7c;d|>};eu+EWWyp8m;1 z+t<9KA5!r2IkI-YO>99qPy*Om^+a(&YdB1^;E*KHipGP!F-|R<76fPz|CO`0zj?=K zP);tA%C#-au4;!tIV{i6dRO4^QJQ5z3H^NrgcP0I#p@G^*WJxKjv`;xI-Q6y)gcY* z1%?I6upyc=gUGbr)*6}C$NLjSjMHUWIZrZG(t3&BWu%;e=09!4Bs@nk51`OcU5bj6 zB$hkbEkN0<9sLurrF<>WreI8tnZ5A>~TQh$On+~)cym0Zelv51;@ z;g_P)I8|w?t|VoCCwKJ^iv_MMD4^D9vh^0(x_e^l3hn|wp{A4oFuXi9kE~M{X`PgQ zKq2*>#2)u7!l$QwM<*PMq_*~mayu0sA!oLWUAm|pNTnx(T(VZX5H=N@oUEDW>3up8og}P77wVw9K*={z+BeD?y65+w3xbHM{pGHy2sIEDnXJ%x3y;}G~DkbM_zpR@`&&a@W~Rfjp$}y#FS*C z&Lm1C?I>yxM-Xi-lq{3EqOlScz;zp%69#A%g&$~qsN3D1N<1}4Y;l80ILcDgv)2B} ztUZfobEKNhk(kZSG>z_`<7N`HRC9rO=_V4F^;F$D~42egfCzn0j7zNvQiQ6_y& zr1}AUAVAc1_qPLqF7SKY1MThsW^ITDA&9t}6DC4}3 zjdT1o93k9Y?QV}Gtey$d3n_7==_2fQ_h7qwkcmBb573X4dMSCKCLBj!dTNx8BSzZM zk=$VNScJGzd%$kt`UmSZOYGdL1B~hWMUR)H0bVr{4WBSf9d85R5a}3MdVyLP3XN;( zC$z-urP+aLFPYUXkYCCwkL47bp`33ehGGrK+P0y9m2g8oci2D}$a(eaYJ^jTiPKUg z*h?V>0D~5w!=#pax5N-|?u_cnU`xJekkKe?q1LfeTj<+X>ch`A8d!C>2^4ggMxx(l zuRI$T+8JQblF~BDSh1qyl#GM~D%2_}n2PXUAX0bb4xM6ipKLR<7e>W7jn5H7_aYZ$ zp8k4PP04B}dUD@rcb&%iLt?SBg@aIAP#|3rSpn%KV_??GADi(WML{E(N8w=V*-QYB zp`HU~fek49<(edbs#nmiR%!n>dM~6L2Bp8GWElOT$0_z=j;IG)BjlD~$bxgd9;gTW z4*{6!v$BBviq7oB+z7=Apd+M*qMp+6q$zLh`fZehZo}k2PGgEsm9~%o;8k4NFMt^i zFz9+3FtAPripY7uWrDqcGYyw=z;T$EN^UP?Y(A3G@!Roj1(?G6@Ug)_N`EiifQJc& zFu?3!ezgOJ*~jbIU`3c1cbzSHT@P3_798vJ)tej$f=ieu+6&UazvB~g8j_(}>IvCZ zylVKU0G0yEiw)fkhGL{yMRlzx;>A6F0Furtco>a@CG_>tMp|Ts$sZ70ZPJg1dB><( ztYCz1w!3dK4HI6_dn;d|M`dXZ-aa*xAWWBlG9=SoYiHiKIKcNaTC;!_(m2+08HD&t zBH1KSTT4ryVG^HpAPF~H9!AQTCSWWBn~#yHB9HMH)-3Y9B$L70DpMutYf2+PX=0svs z5}zqPj2yHmSAp^ znip?5CE1bT++qi)R7U>RcAMd?Oq5dS3X*=r!hp6GV7E$OAkh1V@Mr5Gg$>Q&DNHhJ zA5>88g$ops z?bl?oZ2TA0R9sdiGq;`1#K~TAsnMaOQm93xJE)Sua_91_V+@#<2W%?Ue3W5GQTm8f z)pD5UwWt9|=UZSr+A55PtT5KGv8_v@F7LGOpdbqWc!uwk9I)LclM7g(p|dB>a7ujH zudFc~k{l|nfqw~Zn_zQa0dCVSR(~qH%dX3a0}Ht9ZljD;Gs=L&g!ts&s~jCu@{i-9 zNqEoHp?np4rU?@cBqpWG9M)!*mjp)^*~4FQWZU2o37JrQ*-({CgQ|EMR7oGZzsx2D z;$H?hL*Ji+oV()la#LAr$&rFyUK>be4AnwQ;9(uJOzV3=4pzrs^4iF9<-ISLNfx{% zi&Y#KnoH(Ka{#1Zs!h1)+chK+8JI@4<2#f*lp~(QPr%ClZ)6^G#QaONW$ojROYBJ}V z0FkDG+Pwc~dbm5DnclL94Uqlbh6)BVwU8UR*zvvQp=~TU35hzqB_3)&QP-O2n7~_+ zoz?N;u{ut6g7GhdEIWPRl}J{_s7+0V2U9iT0h-UO231OZlRiUA=N^?L86q{wPD7f> z6+D-?40X{&_k+^&R4KZ!l%B6j(U+xkohk)xs+5@_96y*a4+g(~tX5u?sd>wu$aM++ zhnKZPoBjuElL7DN9h7khst#*^aqUJnH17L9+ z>Z9}#$?R6iZPAbP6R3m3X@Gt>Y@`knR8~CX`4Su$Fh`Y}7e z2!62v`e7$%Njv^rytj=0;Zy@Q5!<@{YnmQj|Apy+LYUZ!(+>#o)S+b@(!S7H!d(j| z1PysHc*D_4g_@7F*pS)yh|~U1D{*eCMcQ_f zv;l~fCE@xO(3X-qbMvGSa~(v$eeoX7zE(Y)cUXcFQrq|1+e>ZV4?rz4*(lg=ci(45 zeHaH(87V$WZXb)= zl&}UK58B-in0QE{<8O-=Akh-^9hVh`)_=&zO=_tVO&-YqIFU z>KoGBQ78$4yMkT*xR`go4g<5z}0f~`B(UL;KcJc|8aJSgW9evd1 zTeXkbCe-0P3wZ8|TakjerAmnuFnt`D>aL{#?_>oxigMdstQ(uL7ljuX{~Ry5f0i?t z5S#pigVYw`2Rcj$D;~1=M^H1rCagG(XY$vF6*^(cnk+$Sfi8$zi1tJPsTA9YEx?YG ze!B}qWP=OzWJ?zaYai;&4q|)kFX4}P zryQ^irQN3eN!`(A!DRf@m(qc0h#kSEbW2B?;-NCAb#V>lGbLO<4$r&$*205C$$1dPXLnSD8QienC-9( znBSP@1g<~wp{_eQ3Z?8ka$>_8zBXq{J|gEpdz+o z_fnnCcQ8v!45mvu&vO(LTf2&Bm^paBWt4+fm-^9O0J{_dRrwePhn$m50+>*E)?NjD z0ic)UEK+rDOVb^l>BltWC#!fRu>T652N_2{n8%9P1kOb{+w3J>;;Nv>U+$*KN1v)r zKN;)Aw-^O{P^Hy(@zAg}h-8Ai2=_1tvd)7I6ph1M9P~Mn{4i)Wc7aR0xA3`5$ zYtZFvV16kF4Z@$sbR(CQTC0_%JZas|b;zCjmO7B;QMOhZ0cWN*?bes}gZ}O`mN#HF zzKPp?v{XAJsAf$C(f;8!5wV&rnK`2BP!wN6QJ{;<(FNeiEmYQ(0U+`VK;uwdC{cY; zZj>^1!vaJH%ujoeR235?Y^Ortfz6Wm;tb3OXAG>BZzpw;XSXnoxm6*ab>i7WGn<;A z_^M|*)B?ainIqy~#=`-dS-GW(xn-T>7gmX}Zh?gh3~`;52gNP%9RZ8!me4qku6=FX ztJ;7jd%eIB7eX1+${k&B_#GuOkvRpstXwhI!gq08armQH62~2x8ej|VXd7Z{Ttak> zZ(-G9v!M$TYJh{zbbyIc>GK$Dc~ytZuwv^;TBAfCJ8s7}Gi73yCFL@hxwt=cm9%m5 z=?fenKzoAX{bI8wUbCTtfJr%&uLc-Eb|^zB+5kc|TL8fv0N@t|wDL2oWllx1gY2(D zZi4=z096NSs-rRRz~2v95!@mbL2;X}&rMg%J&58vXNsUmHs|?>x?0g>Bw7I&DAUvUBC!o1k6Dl^EzSBD7J$8OWWXD zsr^E`wXsD<4$e5%-$v(1wcyoj6%>v&cnGk>m^c^`dLEK8pKN$rj8L z2_M7ZLj{;@xp^J5ztpiPwTPC4-{K{pOC8vRexyQ*4|0p*w+!Xsp!YcxDX6_Beg?Bg zJ6{E9`k~Q!hs!Dw9A8*oZ_uxsnfR%eC`8x7R6wiq^3N91EymQy(xL9HiKX!BH`#dV zfpco7_$GL{xs{hd^`ZF19VrA9=yW261*FbKICZV*;6U^?I^sS?y4+!SKY;pZ+fX4= z96fEIdHsbxHaX%xVT$kLf%rZk`4HdMF~24b^UaR9udBAiVg5+lP&MZ3Tg5!SkFAcl zZ?fY1*r<7Gfdyyl4C7wukHiTuCL^8}n+_AA9zvVMZv*~j4L`4Kj7gm(vJ8k~K#Zrs z*29FTF>aISaqzJX2VdW--%KDaF`Bbuu<=H|5~_|d7I=wns>l>t6A zF1|U}FgUEU0%4{(uW-zq1tmoXFj%_Bw+!fuy2oV)b*X#8mKr)eQl4%_U71z63ip5( zIkT_@Kpta9wPI{^@r%3sF(-h|wHL62vP@A&Xbp=h-*h5`sdAk8#k(sJZE9yn*1pP7 z+$pXtHD$%s5p?OqWF;3KKQ7cN3f69^DeW5PF(l$-pv1^=4;+ST=K$FKsRedd13R7_ z92F3ugPVjP^dITm)cxEbsOQZIS3Or8J(PXOQ|L9B&vpX^om$MGY9LA+sP2kW zc-QF~5N%!Kda98klGHcfyG@V)>>(B4{!%X*!6`w!F;p2m!=jy!uE+-A6JwKHvgrqQ z!#Y~tB{(La`ZKpm~EF&8Kj?i=EWKO%ll++y}| zUezDyNk*4TORplYkxlZk$H5B$_`U?RA&_dcW;LpH2tF;GqiZc6P0O$n9)UqLSprL| z-PVZ)uVHIXR6@rFEif~JFg}xl54Qv}Yfled-3Vp|NIiNSKY*xah!Fsx#!c252207L zEI!(i_<#v-)Q;34%gQBMCo&`Z^EXLv{YG3g`jTFVtK<9ko zH#miOS&tA6ptOu;W8`Ap-8_+&t!=+&|CgvQgQ@8FVSwtUqNFJh5x~`T*nbOA3 z#zk`%35S;AJE^69xXb!*w}N?(gFgea>|)$!t#&US@QJTHq-2Tu9ab!F>SJIZu%tLZ z4j_4-6e2lu8DMhoGvx>r*)Z=JG!Xra32CpLHF;oV%FzXsu*OHL#)Mu)>On=Jl$nHM z)8buUP|nh^72uc_0JpaTP`|SRgep46y09;&zMaUeGovz{?fM30$1Rj-S*8)k&iOOt z20po1ph-%cD6pnb&MwX&a$rZYBnP5b1yvrxL92dhFVbzgj+_+y zP1uWsjV4fkv=?ax^+J8eNwHU;K z=cL;l^RO{mclYxk461_PHqs#-<~LP%1vcGpDqOHl9*;${1_~Ca0^J>(L;XO4gv>&V zV~>T{ZKo03?=W*AE&~%#WK%(>jx%T;tc4qq7{-i}RI8&%?!g4 zFH?A9%8+^m7=7#vgOnD-SYeS>EtgjLLK&!aE6}$}CrUw&A#nskhq8ERT=DO7{N(r` zMLEgcfwCHGMu9a$)MA(>RTeUD4YSZm`lwwfk7so$K^eGq=GLd>74g?PAkRt^2vl1ABy9ps7$Gq zK+3s!&{53G+$GZ1T)>MZcpzo6haGzKwbKD-3RhMB5XT32zK+TblH^*E!jdI(bdjDgZ94xKIU69+em(eAk2{bhKq{WoVDd^-(NX#p}ZyR%xoS zB{G26pc_S(hfN)X!pDIadL=G%TY@d*&>nXre*zfpCoH)9-N<`ks&kdF>l zU`-n-TS^AdiR;JNX_?@8M}p3pLB9G6YW2MzP3iOSSIb%XA|$mmFxo zDoK9z`?8}zdI<9MD+#Y(wYdBauxW8U1-3vHh*0I_WHs8|n9D)c5fCPDGIazn z^0=jLQo!)2?HX?Zba5`_Eo8-M8s9*&oMc_Xf5%bKi95h+!suNGK{MaKj`uu{_Z(=M zI1b9@XmM)!_I*cj=fwOEvONS`l7SLj*3J()-0#UgFief%2b8@6g*Yx??M3udcALjH zSdWhe02nkB4D=xQ4%Ijds96Ax+216?FeIYMVKDOFB?o`_s~Pzt2hMX54nDZQ9EW-1 zP?&@3r}FVL_4qj+p%ZB9kD9zM9LURR`hTgy z(SM?vF}?qC$awTCN6xIm9rT--t)B3Y#W);mDdzJDW#2j6|CJO}tLs>1o3RDQ1z<() zHc32PffnG<7q+>m`H&T{{?=Ya5(HEG!|{J*dsB*K;K* z19|iwR^k;_Y1kc?$H$1#xrV5aP>;K%a_pUJuO2ZP!~4!5za|;UmWrBFpG0t~qQOsA zJ7oy<#k2@Dxfv_h^m|PFO9H6*vw*`YZO(lTYnTBC17oAjP_P-7*<7Pji4yX=#)N&o zs5eHBT7DurK@m)sCRk9@d68WJ@C`aj0Ofy>T1H!a=$-#5y`#=DgdIk;|Fo#~b&G0f z`+bW-wEa=FHIgiv9*^+Xp1*dyQ?v_$@tA|td_caK;ms=U$fKAH=Td>V>6~#u<;{)) zlg8=sd#M2!qei8zQXIiglGLAYNH#*l*l2|@q74|EBnCgU0!RRKiEB>|+)>OefTt^IF8)b6tw%S5R-YXr zCZcVHiV**C$gGVebMZ69Wxb(D*3{xCPnuF=Z53aag4FYMaz_pfi<#6VRyqkbduep) z35u*MH%e6XPV%p%)JtD5jzEB8B@m#Kwxd)Y&hAJ&p;w3+2XXO!>DHKPX1}3k5VaC6 zhMJ)h7&skGBCZbA9AC_4W~hVgOGmpFeA;HtCp$qe;&32~3Pd%iKvkx+9m=3sRT-<8 z8LiDHaDm!sYbr63+xY+o@Cl*48HQi7hcf+JrD|l(WmTxk)x>X1tiMUtXD$VBd^`iF zM16?|UE1bMY>3jvhsdZoO3fwdMex*zD%9aEQa?KK3FMECf}-<5mqO6Y$xLtQhMFtY&j#u-cMTSR__4D;Db|8eAN zZI6NdPpT&Zil?^cSn(+8{Geh-HNC|BgbzvdL{hZ;ozt~H;X4D%&;AH;@o!T0%XEO8 zNOdy$aYs%LXZUn3a{mM$B}d8#9cQfb_Jk$QQ06gDvg1R2cr_Mh#nJ*JBf&Knfvv4T z4T}I;zV5e(pQY3ye3sG#(Zg3;0INh#IX`Mz&~=V=^I;qtvKNGwsAPV`hG$IsVuDE1 zj@fyJ&H_055H=$5GB&$=HV&=|xMOP=Let6tjH#fYgP|CSd{RipvR8ICJadQ*5lX4b zaoFmGm2&-aZs-9a+%u;CM6Nrg6wQGe+<*4$TU*7pMiz(N=&%9~^Rs~8HoUHupRR)6 zj33{lu@r)-3~kgFwK{9c8pG~53-Usfp|&NxUE_uEVw8JfvLHQ6Jt>KjI~)d}j1 zTqvf9NNhsvjLF1zR|jXKl&oW7SVvn3&;z{yE68mWmU+f2)aV#D_b8)n2DFe*!=a!0 zvJ3j8rIeStg!<+>IrRQxq9hoOPS!>Xj@|GGoT%)tK20m%G){rocu-2eY?_0p= zVy&@5Mf6>*h1*qOH=_{4JQ|@tE>e_WGjRV1XW$_(-~9h;n3$jL)}ha8Yv_m)jGxf5 z89zXGQZjul+RN$g>6A=^6EqFV$-NXkoYEh}{GhWIU-Qb^h=hAPIfJUt8wBwYe;g?b zE$&xu3GPTIt6nfJeZE|1qzT?uXW?1rZn5F@9wppo;Y@J3{?**9_9O7;S8=nA7Qppw zpbYf(gZJU>^mQ7knLg+oFI@7xqQ1^Jw<@2{`Av1wDkQSwN68Vm`#CdbP@@!9)_nm1 zJ)}BQCB3`CbJr2UQSu$1>Vi7zvAWaFvTV zB(CRj?wQJD4W1L~8IMDqw7~A+h_3Y-Bb|)gcQ(olkFpR4;bfZAozO_*nkT;@HxJ3m zvmAdb56M!W+N8zdI-VDes0_%Vh85RmuTaCvXz8+RY&%iSbQP^xMmTwy^)kv>b)i2sKjF{6f28^Y zebuoWfcM8sPf_VMfgPa%wFXscZ5-pI+GB!nYEl9M6sZ~Ol&C1pzx?dz6p$O~(l6px-&?6bUmr>>%~T3; zxX%+yr8sv9RNufELmIBKJaN{Nj`^lq*MEV)F(c0BECs*i=E#6rIe)6;{A*d>@3R3$ zTrE?#_NRk02oEz=>Anxa8XzO9L6>@mT;WKAkFD#bPy^0@#MhnXY+0ATFK?ypbcy02 zK~OmzK<<1CsQM+vIjz0q3@hHXe2Ez#ZKw%+3=vpE>)1vE>x|5>HlV}3TXe7ISWV$f zYXd$DA#vCV4Q8PMc-q6NpMcO0bWvVs6ljgQ=+i*|Smd4{D{$j5Cj*>Vt%Gv#JYpAg z6z`p^;VjumSOV(1Z68h@X-kLT0p5|YwOZB6XKRA54G$CTTImr-=jixe;%c^L233|Q z^s6ye=jQ&#F3Iy$-l1j)P_#dm*YHcx>W4Ok_>U9m4EJnjhwa;+o_)pk?c3Qy&1QSk zN{~mZAzkU$qGXf(+=MiVb}r5Jp@cO!&<+aToKPYXW>?uXoJnm=wIUzYMx)tal2%@^ zx?yI^bn1;JtZCzq6;C)5<@cN!jxpxglV{KAq7^%#B{e^G72=)_7DuId_T)z&`pP&D zrS(el4+qk24T-uoS7GE5XX_qxtCT{aBJ(!&=>${iWO)Gl$p+)2-f29NldXYO>(s~0 zP|{S(5I2kCejO+1S|r&TI0T(H$BeNdY(uZIKhi{T;%kx>b#U%1`s6h(JXvEqvl@b) z9R2x4;>-}j@FrzjJeXX@faB5B%0y;r#~1716Ri{BqR)Bl^hsyX{gyr_{6e4e+vyX> zzx`sLL~M4SS!o{LICr_;m&REIfV?9zSHtKM(&lyFys4%#vQj94EH&gK6fP zkDcf_TRzWIujiYO@)J(wzvI%WGp}~$INg9nO=&SR0V3zT&?BTVq$im}k?Rt=1o21vNEpw%L$n|cE&>XcF~!ND#lJYs4v>ogMNJQeOemwh509~(HOQE z%!++z;Nm56&gi=+>yL&Dk;#X3Cmi0`!`bHHjV>HFYMkffnhVnjCTE2IeJC&|(t$B+qF+loM0#vCApX9oP1NZLIt|UaqAAjn% zHsg4c>d5M!8+Ke~O1}8FE-%K;!kY8iG!6t@6-3>)^#tQ(;FuI|& zC+nMc4Wx++tZ&{o-q8G7-@IqMp+gz1Z~RV;0fn%}8%+6Nc6=(}htvKqBVR$BZhV-j zzeOau$Y8j0?#!hb%45<1hSoERRuFNuY6=44CW23Xu_-B}~RI6f0>se{9 z({R{HqJseS_e?LLv<2og02~j)acXZ=Fi$a|u_0VME#nxX#FUWJ%Y;x9W0wI9|Mh0!c zKu65b{VDjp!QMeMPf3w1z|Rg6=eRcp0a@mQEjpbadXj0JvU6&k@u1p4~xuj4fW|IVF}3UsNX zLAmq`A`$BeC0(osTQ4;ssJaPosnjZo7$faLkrPIBc^ZaL5udwA=13o1`3uwFhR5V| zN1W~`mV80^n7q`=%UWEtGlXSaDE$kE3vo2ptj9Yn^q%Z=HyBgGFHXS=)VwIM=4np% zsjb$$II-p#PWS08YqrZVE!+dl8R<~hR`=`b=MLNE1ZXaO2r~Q=^kYaX_;0KH7}Hvc z`>h2u_%ogEMgvh|6H;^kuevjV^Rp=O{{I-5|KEUes$hahf}C<+Vz`fhN)iGH%4JL@ zArLYlnE*ji@B$AOL_{&Vt9awF-m9YS`ns;7xC)B*fdYbx3SKCSTA12kB&080YEL|{q?ns%>YRi~diJn-N z`Ilr?aaCsY57Gd?H1zD9cs0p1-;q6@kgI;D!TSwiHX*{V9_qiU z#1Dio8|q(P7J%@y@esajatNzh72&|s0%4nCubB|xe;VpvQQ`-}uNmsUwk!bQy~jiN zHIqYF)k=g}SFk6q9O_>+q>Kr+tR8QR;^*z|gt^*YHzDfR4E0}MVhZZV4)w1t3qbwY z@lb!=1LDSecN z)W|0FQ}XfpF5ioL+tmK|E>~*Pf_HY63My&xA6+ijQh=g`#_*4=v9%Nu;7}-We!sdr zj{KL@*0R(QjxRL7E$k-~%k1qk#<+JznwFy$E*V?0Y%yE?u~jP(y_I7tTJLI0-5v}w z{p-W9xnxMg#vPFE872rDFG9+0NhKX$@3TOg?gAN=@yXM7^NcqfVh6-&qwRYhH)!8e zSWIyuSt0)_>L+aROc#thK*bp&NKeKOW8lRG`HL7Aq)2_XooVhRlYaH=Y1&S zoRHm2T9I(=NQDwDCZl@^=Z5*Tyhk@KNg=D zUg{bw%8&M=V{k;2d3R`m>L;y8T?Pc-)>fMHabp zYJ2vSV`d83^CGg#+=1u|6a;0OiS}f8um&q)gVD4Bq&7C7;d!pH6f?p~tMzare+X?W zRtCPWX!_1fI@Uku&E=&TuX*yl@9kH%ZQI3@u)0;Nt2G;PV%tQ;}v zk2X7n+(~~)fgKjpTt;Qov^u9dA=6QX%0zM(X|>|X3KL?RX6qL6K|41v;CQAJ;3T7_ zqKnMh7o+=0FbBHUjNa$Eaj%(%JZ zplNIzS1mh#WXaN;twm}y81rE19OADEWUffrST;4UR1Hi{Ao8%4@-X1>S+dNB)L-;D zGEP?N`i|wJL!MkEy1SsABFkB@x$l9}?a3Ro4v?LI=5UjL?<<|l$&B(3fLgA5`%#a4 z+_xp4RHSbLV0(s`3l5L59U~CczZfY$Y3QXqA9Tn_@yCX;xOvAT8NFz&6gVc*HHW)> zVZkiP0Nc?9Y(G(Ai+|)LLQc6P&ly=gmt@i_&E{Fwlcf}H`}B^qJ>$O(VR%q_RIs1C z^iwLOr=yrUh}V2b42dK3l01yMh!TDE7^yAHcXL!b*58(|s66J`XvfOp^!tt9?)bF8 zJ8MC9p*`QCzb`eEc=$?NTV<>&%6PMbq8pMC-9WUCog5N$a|se| z1SOAK-^t;+T=>!4Ej}s3*&S;a;9ifs$tWT3TrM$#o7{}R5Zx^+=&Xn-7#zb*fdCMA zevK($rR)smWlBuwBYh`LlIDOt-6!jkpz+}_$$&c3Xz0Z}8;vxFM;N;U`Q{ekj!yVp z#t%yAS$tN?571kb6jORh(LKytE*PFTB#ghZUyHRq{^SGzLNNhRL)S>WC~F9)w)Hm9 zFTiDtocS#S1AlG(Ki-|MK31unz|&2MfmS-P;mmS<;%A^=yqPlFqV8=xuQ0&rM~!b} zFeqoho+viw#x!9YTy5HA8jHCU$CM01T3T47yUEN$S5Zc`L0^hssD7G zF7|d`@^%T%|K;CL_wQf!@5Ieims_Sf0_f|(ZHDpA-sCGakT*HV$N2ZJ`uCmUQ~}E3 z(l_g9y9#)Rf&G?0rWUSCv8v@1e#Y?ltW|xlSN&RnbY3;nPJzvE_11YQ@Cg4$#UrOkvqQ_j(Y8^4e$5}EjKA~AsB9Cb)Ci6f-9O%f8Fm_7V!^T^sE zp$kvRfT&gZWVC!f5ZLJd^EcSACS&2@aKA4dtH4^tvL<9S!)=GfTC}N zYhRkQb?PnlN}qt?F~;d>#r?P)0TE6#5?XZydX2$TLlB-R7ia3mJ$<@*e!y z2-~TJqw|+8ZC#&4W|%)^pRNW$o6W#yKPK6vt>U`t;19OI-a2IVgoaL*oA2)yXPa!s zjX40m@AQRc?@}-?Hsc|kCtQXp##t{gs@?8#FL)`t>&1pkw5KUpWjI$4v=I`ToMHej z5rDWhnfDV75ajK5?rd-zJW2Y1b@J&zVbb(EIu3tVr+-k$#y~g`rK<`)9Iijz`Vw30 z&q0K)nhJ?gif1Clu-Y~n1Z+e3fj+dP;niQy;79!K_@XcZEwlZ!YFnSVFM|%MI6kX< zj9(&1wT{5iViCM{Io1rrrHRg^V{B2oOOp?54IqGIj7^y8zSa;-EJ=QpA~~VJ;&cmj znBD2mE}dqyHBIL9xf~V`eQLbyUDLdWhFT(=n0zK~c>lfCx+mE#m&ToZ3M59$0kT+9 z{Hy8!EVAPB65cH;#Ko>M9KYTK6(d@qMf+)I)3=BE-zp?e?3Rr5s}+iON&3`JVs+*uwu#Bh+b*N zy*c`Vvq>q&Rd}R_*Rk<_k@eg?o1C{!ll1>_gLbnQjBkIIvnYmBteMKYipv%*9XV>n ziqRDSUog6GglMFdtCo(nPSeSA|N9+_5;fPrTTnshN-Yag@CRAH-zh@xr5G%L@Owl3 z?-qlLCk#x#AJU8LMV(ploVov?(%2T-O1Ljo{^rkb1TDd49G1!NGNsk&f8P(Xb&JHh znX2gZ&6#xddnDf(G8Jk5=1>=EJkoTV*6@R%Hmvvuj}J6^yy;3w0Fy-h0_;1ieZ@e# zyCA7Yg=#1#flto*ljpBkMgR`|-e*&B^5g^chjhydv}LFNgTQe3K#;^sMaINjAeP5A z3hPfgo&R{K|D$5G*O3WN&Y5u70*hg3^U%%c67DT7vurc-aOXhl58V8HUZVK6Gg0_S z>F6tlz!gvB-ISMD;yiyhrB+j2>=CjpyuNL(SUfY)jS*l`jjizOZ7ZBB+gd%qzR&g2 z%9vc4zP;MKJW-|N_Y=#gRKahaiSAEyw-0~=@k^?Wi(gVN#gBIgmYA9u!lZ32S*R6f zPyMr3>$^7D=d}Aj9hz#&Al#n&DWhU8sO$-^5ua+9qsj9APqX9OAmBD9o_Y?dYQ9AJ z`xzpRdb@qd5-6f2ElBm}L!>^Xm9QomY+J>D5{B9eiMtUTKHVNr$8K2S4po-Km>a~@N&piw zaqwz_ndzzqa3wuv^zSBN7Szgo&~8~@sBgM+fn6k|P^lqD2$))Z^a@^Cr{*8K+R$c3 zhuc))sf%9(mvP~@qa&gSX(7C9TlalY4rk2Hn_1515{`>6JEXgZD$gzWa~t;zXo?g7d&~JKN8a0Iz4ew>=KzViYCvV zM3ce>uqPd(b#Sk&gYlUMMSAw59Jx#4w9DIFVyfgp8QYFnx7E9(qn97!==T)Nh2Yx7 z805p)DE2G#Ap%=zqDjdVn-a+rEGy!ddR?oUI1uuP)o?K{W@}%P=#aC+LowNF)}u*< zCPkmEi^p8f6(U6jsP}_*v?XTq|uGvOmv(1 z?oORk z@fk|4xHXl{;gE84`N*<4%ViR*EZ#-E(_9r5Bk6~oK{ld?(`{bveHe1+w`a!?^u&6M zR?~Kkw&M>w#<%Pa@?2=E8jQais$UZeZ4-kLtLgrs{(S?jrlbYP{tiiE{@cniO*c|N zRmcCmTl?EK+yY7(!+6=rec!Zq`v1aGxjo6%hx!i=_5V85|I1MSfua7Nhx&gS>i==5 z|A(Re?}v;cnbS0`%#YCT@W~=v=M$wx4w`wtx0d|EEpNAJ9%5TC8GPfdCA^j?4s2Sk z@mot#8OBi26wPaF2l6nRhLXGBtto0uGgJoQ4HXahVqgOe;-a#@b{!FaMh)?6i|bat zudlKyoqpzQCVoeF9?F=ak011`JxmBx6o3QP>HnB-d4_m-l?+_IfIgrvnSoTMp zP*Ze6s~mL~oh_6M%?0~uS}DU_-U`kPsvMHbWw1lz^=ma543kbnUz2TB8)Mpwu`p{#l;Y!1Wh2Xv7+t;^ zop@2}9d^!ibU3C8Pv%_J&IFqsDuS)O*GzFO99wDIWUqtwHjpEag_dvHck+X8m73bU zZ~{ACmBL2l+(Ok~XggFO9xPL_-J^GYc6%M|CwhTKek79DSmF!dz@`ciPGb*&B6@^|7-K!7H0hWUt9JbuXw876HE*Bo_MHD z?k8B6Te)SpQ8}@;4uS4`XB^CK_dviWA#v!psl&Qmr3XRW`r0Oyx@_6lwp`r{v4_g1 z0Efo9%--8>U}F>>olQ5CgB*b(()%>ZGsA8QpLW%thu91tqV~D(qS${);^madm=+Q!%D zEH4O5;eP3cOTX~RLmxip3y)XlE^oTNNf-O~_ASBgcaX{O(|ZTxWq>%acc4q%GYprR zq7f=Ux3RApR<>->kp9CQn;`v%8JNRs z(tkvde!fTPXMYE*ApJ*`Og_5&b(R^(M$$38Ss)6F{SjyT)t_&+&(GSxb-=U3PrN2J zl?1CdyE?#(yzMXMq#t~F4C6mHj6XHyv+o_>T$9hXRhrlQ8FWu50WlF;y%Pu4JgKay zWC*?I46J!_S@Sg*n!Qs7)%2msUK>VvFnG_)E@n~2NQ7JiiOM>yyqm*!uXTEDXwPV< zb!M&B^BZc-uhn`%R%?NOCwhnO(Lk_sp`XCdsoQ>hbQ94;!%al{^{i5!mXyDqUH*Db z`Rmg1*K^BXmzBScmcK3!zcL3_*stc#;;)tEU$B}xaE6A*4%n~fhn9H6E?~(5^9zkE z`*n5s>qQoSV5Kh%rGUTK!D~SV{ENf#^%DIw7n}W92wc8is#4&;v~0ePuh(1iS6Iqc z`}LKUnALv0tSr4el!D%?GW1>@=Hoy0USre!wI*s;%r@+<>RmZgLz`~$a2HdeP+8Q@ z6Y`xdgj{W+Uh}}QEiYSf_Ll;M4c7#RXxb6G$?=-Jp`i(TXqY7q0hYM5ayaYVW;)@jHm{8+z}X6yZ0B@O{jnm~O76 zjBsYb`-i{9KE@XC59lzSBH!KD*uvJoWXph<;SZ4`U$tC>oE~qNvEswMf1MO7yy;+8 z$XC|;XzwGFV#P2*qaVuF?7!m-T%@1_es(HAEFy?tI@4#n9*I)0RNE^n;3-zP}d0bx*36A?ERlf z5$H_^6S%zy{8H~fCq>|wQUVW~fWR*eAn?B$2=uxcfnVu;c~S&=)4>EjMFf7echjT@ z{Ax4CL~K881=Ud-+1GX`IW`sRxO4VE_^fP!U<*?`p&cAA`vEMa#i3v z7I(?DgKEr!FOkkVg7|B!^DZ;ieXsZ3NwLnG4rbkUV%-mV-=7rgelS2<_HUAwAEeX4 zi4MN>y1Xz7f7JWoq=@#WgNdFlqJPr+@uZ0UiHMFCgRZKDDWb!VU@`HtA|yXa ziBFW>PaAZB*Ubq1S?~5q5$a6`5Q>2ReE7G_Y2WqwVSmbdTC>0UU?sI6lsMQA&gOD+ zbSH5QSNn>c#JM|rcTS3PcZzd%mQ8}`ZO3C5r$TfajP2(q5p$M4A&r+_WFZG<#~nPa zwz0O)v40m4zs0n@H}gg`RLI{h@adPFOqKJKV;>w;|1E7%ydqDZ*IRD{lJh%R_${Dp zYI-!{749hll;!g}H$j^3H9Wn{P@^~46)k87rr>Y7O9yZqlzq4HtKKhba>NCaIdWBE z@N11Hcz=+}gf#Nm z-+vB2AL#w1oHg`j2gBBz{bRjtDcb)!u(!Xie{Y+Kn6Ky`#nF1AR_=#zfxMx&2NkWn zpHXEC0Tb$$;otsttxtO+jH3S;zTt)&yy(vgR)%KVL*P4k2&YLgWcQo2e8A*)*S1FB zK6U)J>If7K{w6Xz4e1(~(yfiHqsBaE;d8W?HO}VW^Evxzyu8uHt(!64eMp)M;MVY; zi_$bxf}qyx+A+C4^+H_(X<)20z%`I%X{c);%hFKSK$fMd%YCGl9~<@C?L#dpuhmxe zfPTk|?ZR#->bA{iUKHu1z1^4h1uz>{z-(9t6N&&Muc?7iQ3htX0>%@dXV`?I6pV^W zFq}`RfJ4a5`#s05Ujf^%V;715EAOvir=k)pL_Veh<}n2r$%3^BMJaYF%D_yifSFQ& zx%~3W9ZV=n!Kf$$vrz?%CyUN_6^a1!*hrL$N-*$B1sn}-+zuo8*b3Ok7T8I4jL1-w zVyB`EtO`=FkE?)vTmiP=T_{Syswe}if)wl~6|kEWU<+(RQ3_T?8CVshU^lIR-LwE( zU>k~3uqw*HsvrfsSq1E7CD_Q@P?UmIQ3h58DcH>`U^g$pM!5_{DOeR{U{z3nB`9tS z2W#i02+9^-f6I3K?eYE_+TscAVO?OpjAczWb{f-X36PZ`l0^E=8X3?r&{O6`yo+E7 z{B1G0U90780aP_aMy+$ zwZl(PZ_~2gwzFj>Tb(JQ=V{h6hOGB|m1myush4z}^(6S--4oT*Hk0dV8|!IW?8#|# z?VNOkqS`hH#FN{HT859ON*s7|<=^prR$4v%%#d&&wFhk1%D`(OoWa{5u z0mG0V{(NeC4GRqSUY9KzRg$Y>wROH>`P%y3o?{y1X~3gxxWu@7NNm`%2axw@AEs}6 z`i~v`$4>rZXMP}=dj)!Qw8EczCw~_Gx^-H)`SIkAM#7XjYWA?VPQyW-Zn zXMGiq{N~c0pj-p4s(XaX4TaUJ1CdWB9Eg}yDqAmpFTx{Vc4&J>fC~)+z!rnFm$S=W zkn(25r@fO;aZH73++Vl_Iv9ohG>p!Qw#aW=#Ku0J+ig1RPreiCQ%SKm>TtI#^&y-EqV8mm!hqOH` z%L{no_D~fdH-|BMY9gG432kAI&-%?Mro}!!EoMSfoFe6eTzl4DHD9+Wa@-@BBJBJf zJ^hj}?nO)psK=LBmjjaOVnzM8DR`+yX6$Re2;RQ?D zZZ3-b++fyqPsXny$k$Zrq8kyly*HdPBqw(W=oCk5J%-SDe}B1Y+C+Z9%6?K%fkkIL=xta zI3!ZzW&G=&ukZxArDiLtlm4$cw?x?npkiJ*Brf}9g|I>;K5M0&;6}*F?f!GJG!p3& zUbYWHdAQKeb3&Yi#4wCWaym}DsHL0`)wyG6x*zkv2}7=x923g(Bo|_tNHHHhTXOMHGTSiv=L9slujkzloEu=uxB5hA z0D5i!+T9=kg{DZmZxMrpL_$>v%7@rx-~wgnnW^GK^I|A5vp-ertk~z7}%qA+Ul5x2)$?`g6e5S+m7=LhoImvmHTyGO}G^H!@(pg?w)Yal5DcaZ@C8?VY zRQg$pzvsU|Y`weGU!N>sE@3Pqe%Tch!&F@y&Pg`IOo`1PDqB9m zB-s2#SAn(Qn_}W7zh>bSU&fvYHQWucM=xx0`oii@7c4Ss4Yxv)dq^xeHm)cY=tbw{ zvSK-csphlAm!G)6glsL-l0y+sb_06Y1a!1J*m-0A=?SYzX?SYpZRO|i0#QB$@zmF3OfaUWmufub0d_0RH?FMiJOY!6Bi z%&lh}YS51_3i^=@HQ?m~7WHFI=f61We6JT(X04vmB{gaI7l+R7Xx{xK>9C&A>c13^ zi01;)G%#;l|59hTt#!MblJV$wdCJ0a>c$PAAVtQLD~}<{iouZBhKmnpXz<!pvPBh^#xP(}R#HU${ zSGW7G8rb4BRr+&U!g)V;DB>catCz;8ykgjHzNfU9(^0v{lTs45hCm>1E-vhRB2+Cs zMe^4x-LrX>`(_62EE!l&_vbwwuuhBI!;k9dXc7KE1tOHDEbzI>0?3dh`w&zllJh#r zm$Qar-sV(&rGAY}vsRy2ogW7TP4X49 z8K9RkOq&GPCLfZ zA-ySJqi7jAdy}JDc^~|0oA+-C&Xe%YJ1P2RstI|#gaI)`{1Lt>w-+pzI_ST(kW)w^ zNpz?cNOEU&1CmZ%vEQw8qtpj@ENOa4Xi$MUxo>s9f7T1G$y|@XYxB6nS5$uLk=VxHNcfwaT)%J zzLKDKaal4<2q+yF!i)$(15`qI_aq^(_u094JY5qLqrPc(eeK_ScO8b+EDyW` zE6yGTIOLa2akkCPQ3MIxfMvQs}BIkTkCn&5_xz% z>DkO38q}(?dNV#~TF)8J ziCSEg%}X2qs6BV2(Uw>Tb|(JN3H{Kla&Jgb^BrEf;)1jPQ5_=xz`v{)MJ25fAekSh z*gOeeY`K}pS>W(kz2HSMIQ$h|eV@vJ)v|Nt`>B{%b6q5!`|~ zNsp3SFb5jlf_EhLQ{>a2eHTKUo#24FzpMs9tdwwHJ4yavp7X~brytGyeYK)lxhJLB z|Bntp>9gyi#6{0T!;H&@w@BU z%1J{${!b5!Eva`Rp5BUe05p>1E`vYkCk=}N?#$yT+l;1W^}3%Z{6lRXyq=sJljvUR z(V5_vFmo>prlKC-m?AH!zW6rX?cA5m+c->ecvta}pzUnI|5&ka(Bu$b%DsvkR}|-i z^zrr@F4Fr0&{x{dfLEEt&VOt7KN-wI?pPLLBMnS`ar2WHz&Y-AaNvNR2(OfL8#2GZ-zo@mO$Pa^6E>&D;O1YOusJmbHxHDLgFH0` zH~+f#&dsApJIemQ3JqSw`msKt?n_q)|Q+BU_i3mX$yT{ zpa$3eVnLE^?Mo-gfF@AD@k3?RL$9i@Uf~IWFJdygj_(ZE9p~~Ay&tD0@*;&D-B?IA zs?WG*!?SeuT>Z6_VTo(DYnE@Z`^Jc`ol<-^?#lCik zeZOG64U|b!y2F)peLwEXik5ZD~1b0FzRkqx`Zht$(DH zEamv1ql9>aFEX@Q>*9~FO6StVSC>ZL&uUzdtRJ*3Q-11q2|&~RY%<<}`K`yC95lp< zoZAjR49hu)@m*J@i153#ZE1Tf3gAakrT?cL-r#sdD0Nv7F(cCvf9R&ERXwVy>RK*W z6jfW7uca!HOAn+w)Njf$3N&X9{aBvfd8YAy46%HAfN|qTd?Jv@CHdrgmkDz?b{<^44g$}{wzdjLfB&r z&7Wa>%r!IQXAbgq@08ngT9$4$ub0Z`lp4j%HmdgZWBFavgKw8{kMygwv)Q79G%OOp zRlYJ9IJDr^0Ry2D%~Wq!K)u`u8VptRoN3a3v5`}$>2TBmu?xauf?A5bWOkSV?!5oG z>o89WIWPK&oFU_&Zu(=MvmLt}1i~N5;bqprUUnC4-)u!1hv6oo5CchM6ysk46@z~E z5Ra1HfmQ0n20_!wE3$c|pOlr+zE{?weXn#13l!)p2-yqbprqZy23m}VU|M4!ew^_l z>q`|N`nbQDFD6keK=`?BUplP|TdP~=w6EPQ($WGsFpR(DEZu|Bh1q&$hm0b_L(e z=Al{M)1B=#TqUzJX6Qn;1{&>%e~l9lUaLfa!_Hyn;tzT9Agr2Z=(bR(K~iCb3){dl87KUIivP5 zafw4k!tEftE^(T_I5yCPa?l*!U{6vnUR1ibIAEp~v%bMg$%p1C{hRh0;sSZf*{8IP zj3=lCVc}FvZ}SwnPWg57?&7z(dLSGg{c?BPK;#DTo#AL)eSjL16>-I~>Ts=qsf3c! zKTRs+ccwzxtz|r&RqCMoTnBl0Ku{+GbkO}Ki#!k#0MscifK5#C?A>|=D$lkPE-6~+=3;?$*mh$M`TLU#_hW4uk0;#7&2df2=g+xR4qmkW z(9E|7Dr4*b3L!}h*#Q9l61Le}3`tS`ReOt>npyu7%J!W^3=wC8 zC6#*b^^A;yv*RV4v{iW!G0i4d+U_BNW%w!&dfd_;^q`01saTc%!)~h{uJj9QL2LMG z5O)8vca%Nb9#YurSyyedY`?fR+V)vZ9_pB>?J4VHYuJ)#=obAH1x$#1-}GL^t;e}S z=BoB_)3h6Ibv$ZvE&PHYT^Q!8{^Ccgqg%>sD2ofoFh2D^+s>^;<+zO5wPjkS_letj z{DZDK9Uq#m{x%dUxD5FVl-4`AXj5I{GGw@1)e_qlik>ow^!C7`)NWswnJ7XY2`jx^ zEH()XIVWxtgyzx`La1ATtI{Y@J2p{5s_?J%H}EGzA}z`m7ifX9uZgXXSI{Mi;xtMj zm(X_hD-{p~IK5#95w}f47#)tB5TN0X6?Uvyk7h4x^2@bQeD*c)C)L6~q3^#?u zV9og5B>b44RGjXjq=O$WaD(s+dpyeqK6G`H*+KK&MZ%jF$O5%ph>TbXmZbtKIpA%w zWJd$DfK^*H=Q%1iSDdxL3mfb_K=i2{^Z!)OT2xFI;jAS(fSbm{ab}T$l>hU`{<~P~0}oz8k9&r;>TTxPd&Vl8u#B+F@`dNuHmq zg-x*b%qR?#$iXD;C=wkLt{LRv=dft%NfAd%ExYrkEMKLq~oU4d8QQIdEgYHL-p%?N@H4bZLBoMszJ@J3+0Wy3Fd^ z4Lw11TLg=vWWczSrSWLcl#Q8#PwV)iHNL*uDQKo^Z8b_R!Jr_ovQsYl`-Lz2mA8zz z_(&yxN4CONza9^o)>sZSg*)D2I^>_E3 zmpDetaGLp}wr#X#3a>rfYD^zGxK`%Fi7lO3?9q9&&MagY*ghVZ>vsHM{zAw9USW2) z9Ubn8Xh4xmLI|$et20{_zHO&~O%?X`3goGQ@}>&=c!j@cuftiWWq!1sxr+j==*sw3 zk%fOMWWl}$oAnrCa4ax9yziP}D~S*ZQ$n46@J+MXh2g%oyIomt0ute&=KVSz2<=&D zKzI4_U)so8S+GYH4VMz`7CBC^+=i26WE*eA&a{)8%kui*JsFEJZ$`zE30fg}k#%3=2?oDDk`Ox-TOs&7@Es&Ny z=x1_Ewp4ibMDuOPzowBah?n~bL7Ds+bb&BvhyCeEHnbIz5fNJtBrDk=c>y4;krIrL z3Vc^_iFE-A z`v-%FSQ=y>ohJo1GXMb;Gu8nXzbEN5@^4X|{190wMWR|MxCM|fQNC;w#Ssnb`Al~d z;1Ghi13LYKI@6>`CR&SmT{YNchW4B|zOyI26mJ8nP9zKo$k=ktp9hCUcQfndfKIQ3 zFB@l-om!$r{A@1g?ID4;r<-FjX975z%2l4MTf3s*&`woC#$mjPmgX#VD)TB1L#)CJ zUqC->ouN0+$qYJG>{T&vFLs5PH;}ZMuZ)MK7=J6L!Fu z8A2zUlppC{G!4+K+5n|^(aa{p(c{))JS3EVPuN#HES>TZGmRLoa>M3R`IyeUV{95u zv&G!Un8%M$oge6ZghLR9C;jxv;?rhQUtdftqe4FD@BPCc*J>?sf-91?s9M-3QgV35 z9>!E91tC*%L}&KK8%@zHdm4qjd{F5axx-!aK{FbfJ__NGHZH|Ckdi$};D`oFJo{&w zk0;~7xD6X{9Dqi|UU8_Nd?nXB$8`J^`?FhbHz(1R?fxux+-P&{b5=_r?2*2=(~2ht zJsLKTuJ{vWZ|>`3J1HP8tibAHUFdWDW*~j1a;#74CS#D+;N?b2vo@nfVLMS{N`u04 z6vnf3QXtY<8%+S^k)Tr0)2u&hsD$ea`S`_@54}!d=K1`3W^nWRU-=5Zu2~>#eSCbe z_Ax>7e33Y|U73Qjdg2fKO0qt;HUk<-YW1_LxG`UZ&zJ$576+=m3pXwR{jA(s{4Ag2 z6=(4$ADyUsBSD>plOd5Xse}^lF29BvzeRh}Nokx13oA+j1@9af&~CQogL? z0^|0y?9xYBd>9K!;>NP+S#ez)lAB8xo1QM_ZYrL^ZthzHz?-k(V`lIiWr^TkXl8vS zc4AIvQ0#=qN-j8SbjgB|7QwpoH4l2Z<9B?gKR0-;-hGfs7!jM4&+hP_?@W{T6`f(% z8^b&cpOGpo%mSLhPTj& z9^iMCm7IhL^{TbSN;?2|TG}BieSqyi5~-#|I#K-VmM_Fs<*<3SwW83?ur+L+-)eI0 z(^>mfwElRPuW)pn9GsbYx`6%E1o0R2)X=LN=dd>Y47r7UCRETu8`0qt@xGQ>8lnG`LF%o`R(Pp@hkg7F|XqvF#J*Fu` z!h%yf{pSU@Vv(=_5|{!}Cd+&Uu(vvCsOod3l3T&cX%J*I3OXeRqUQM#BHx~iyfEU4 zJXEq{B$%vlfo;lgwm_Oa=t&DkjcSNp~AY1QnI<-Mu6De0uAgFG$7kG{e+ z?=CH+M!N%S} z>17bhkR zOZMl&(O>&<28RuL9C`OjhAC^xEDo+Qh{v3a|E9}b%(QA-sOu_pdHIn@9{qJuEVMt$ zjjVV60(m9InZyE6#yn1x@d~23T|SusbegU=wlZ$8B-H|xGfdHjVj$)V%{X#JTac^A zsW{9q1hs4eX95T;8_TO2ihg6FuJ^{Fq%0<&s=-+2L|qI4E7t-=_i1qa&xN*-@h4>R zb-gn7Ct44LV`{D~^w>$38_Uzx-@}yh={?7nqw-}CTAzy74aYF3`~%Zy(QlFPeqeHZ zO(c2mqjDOAJ-83=iZJ=>up!I-h#QY`iwO>^OF9A!NQ#0WD6V#+!8!Mn&rKQo^?96( z{qeIr$@gs!U53zZr)J2N&z zI`igytYuOwk2ITp3))GXF7+!wlP4ku;FQ!TahjnSlQ-vMwq__zTN5T_S(C{h)6N|d zpGyF2ob?0K&Vjirri`>l!fv+Q(`{as*f#z4_uwjB&zNl23V7(-d8+ljd$UsTt1apD&uZ|^`IxK+Ds)B%AY^6-yHiNbjrPTz$s6r7 zjw$V4H=Y@Gy6oqIO?R1r=5%5#_%ZDhQhRYxkH*L8*k$}= zJG5P5s+vEyK%w{&?FN@His^W~S9^lfLwSW8*8elZ#m2Kc3gOho4Tb2!S%@$=DAbCM z#lj%ki*1ATS_{oM2M-Rbe=;|&&Pyu+N~s#(`PuvOBJwT+$KSB43CJ8(V@!OARE8Ms6Y370i zBm58+^p~ha*S+9jLKp(zQt`7-VN$sTH_n7(I>j{rDiYWUfJueJ4a5L$UeoTM+ergT z8v3CcL2?sT!}>cQ=u|XIKypF~_N9qc8iy0%2o<+3j2K7_yP_4H!JmzFGZ}r!7i0b)fW)H3)F0wS08RvN1jHI)7|zMeFtU9&&Ow zB5sZ5w+VaJ1fPLG1DU@?SFV#ai-p=0uR18cKwx$@k5+K}u69SmYIiiGUT(Tr9a8G# zBFhJkpZK>bu*HYf2sESnixS7kOnk65csJ=qv&M_M)~%hb>>L9yE52GqEKSdcHtU&j zrRhyb3BMI#jIy307QK#N|E!$RzqmM~ug7WU!%lymB9epvQF3k6@AP*$VO*1DX>Riy z_c)E2t4o6$rOX#KUbqNjYled%Qj9&~U>PcC!r(`t2)8W-i)B+E>Sm7*p+*W~eEu0E z{wkz9V=DuCZy3;fQ8cl~=E}58?fm9SApbrY%Mp|>qYXuw8*`QNA7F1?*y&$T+M)x| z<^yo)!geK1n}G9~uzXL1e6Z&plwa3gGu0B9j4mHt*%}=?Yh;Bz%e-RrTowGg9pop| zIH3+)crHkRnp-5UkJYRT{zbDhX2wExFG|kwsBkw2uF(DBPXFSPZV-BrFJ}V7UzN!c zG{wLVU?=}YV{Yabj>8yr^%8nSG$mh3oWp|>Xntbe0zuJSjN&^*4&Ay}*&nvo8W~_6 zV@@3skJ3e0Is()D%O$R5Z;+9Ao?SRe&RFYxk()UO3R@$Z=Am7uUf;G>1aq8T zvfkiV)XHZq@3h}w<84tHDdn6@+6L52k0f`G;4Fb(pk4M7i6CLYob|ZP1Vr*oK)UlV zoXCpR2C(6SE`06L+@uMy*;3J5)@p*(NJ%{G(#E(Epk@ZaH(~HnxbmtTCx`k_>o^N4 zxwKQ~)a+TaY}u(2>?uD@?GoZp^B2in~Ykl<48VaLKV0A0^#IGo7d+Ma0`ijqKpIvlY;f(3H@qVGDOj zXU*0PDu3mQ1v)O|*;n$5+7ILV6{2idQc63RcMR;qJQZk)6d?acn9 zPbxGkFU+zlJNf+hFT!l2hx-->|!t;;v67unN`UpeKOiyY6Eacj~s_2v+STUF$mM(mHQ+U<>!8!an zqazF6X4=1=W8InRwPMO$R;=xc=d+n3qKzZGV4bomu%n@@)cUp{G3(>LR3;cC+B%)e zt!>O4Ez53tjxEivZ@&Kaf{sUgE3+iIT{pM=$Tc3~`v(7Ut^atV|9F%CxXypP*?$D7 zI@*JQ*LdMu{Ks4U$3OD}q^`+*D4Yn{m8m!6#T?&ElY8>I&W6`r_r62keBE`|O@r?K zo8v8&M<9>|Lv0)`v1@%tw+F>L8g^?2TwD);$#008qZoq2}LTRSk@N-9{?ORf7iWR+vT_0r}J>G-Yk z1M@S$FNrk*>ZNI~CGA!@^qQ15_3Hbxw>sW$=}g@?j)!HUHeKp0S&p9t#I7SFfEI|$ z%x-wIUF(ZYfW-h_*MSNnVghhh`%Qy5T#~MC6ZWShufqT{<2B2pgfs|O)C2AWdf7ZF ziL^;wZVJ^Ao6OqSh`P3uAT0FX-9}^t)kotHVeMAlUW`2*F zyQbFAnZ9a!>L0bEF1(38i8oRLz-#?SfGeLx|7mSJv#xXFvK*UwH(K2D8S89K}sa~)Ne>=aQIQwXAe6?Yh0eX+EOM8$OcN!MT#36XzRRksW?h(S|i03k2bJ&Sf z9B7~pYquX!k41Y7OcFK>h6-znMQ&WG3RD_c#(MskweoG_^o1fE0V7lp zxJ9?WT)2*}W5mC{FH>uUDsP`{A^5C$=`F&%WoT;=c>^v?Z6D_8Go!hM3Bo0AaKVD$ z!us71uBjo-Fl7Jg8XxAMbHTke2yRGvc`J1rgiFOB7ldnJd(BQQPFgC$wQ_9!*hp)^ zS@V}I9$B<%*@7{p)|?tW7xtoiB1rr_Lm5>gSg>^bf}UJd!kt&}HA z!!9}G7`KAvQfpukLR~A!OA7|UNw~FvKkB%$b?x{V8gexZ?WI@yC+*d$m8F3iD<~m= zVZl%Y{=1C=|Gj1jS23I}CHzP%Xp``jBTGjXjEyX8jV_l&uWXHtjxHTrvb?om>FCN* z(Cx3WvzDxEojbB@)dfoyj-A!IaoClIT@1d>eF5J`YdOOvF(a7yn}%=^CN)#!2i1Zf zcKSb5jVN_L3PihJ3VG06A^Zq&$6)w?LhjL0SOQQCmLRt?pZ_Pr((~m@W-ZFeS58RosY+6&CXf1s<7i)0z*d`x_b-1~;|M!6{in!ps0(9SB!OZu>B@;2*=94+bNw8PNZEZKgJl{m;v> zFNQ*8FwTc!&&s;6Zv1EH6lQ30k&X*cRBnS-j#gY)_>zoa%KO+mauI5T(HEpBePT`d zI$B7Om{yQ&RaVfbgQp@>BLr2hRY)P^T?j&oCBI8+1+~L~Ub~f_oS3FEdi!^Tq!>Qq z!!Ts3DGb9MG|w~>IvZ1u0jevPqzT_+E`zcQ3I)y-Sh4+L+=Drj9KXIdA<5g{X%>YG z3IB#SF={)*yOL^j_lsa~OjIx40;$!zJAnrq?&hynI7SLnRW{&ixN{4DH z`Nu#0v8&`w8dY*3{MI5ekDpsnosXobmDZgVCoo0fmM|EHY7D#PUhh4!6dWM`j`O5P zZWi1fSoPD`M@h^FEUf*%>L039PO$JeQozlq^iph^u%`@id#_w(MT%Yf{9rg>Fq3`$M$)~@cp_f;B5IpXZA+s^qUiWc~3ml_FHopQk3|P zUTWB=2qnBzG~R=9{tdcVqpQzxbRBl6@LQx)JlfQRWUc8n!JO@!239r}MIF%XA!$gHH`Ad^zaI+YB*tov>#)ePJb<^;*L{zea!~6^bhjbE20~-D$Q{JA77PX1@{eDclzS~7rh6!1 zP_K^;%Y1bI5YpH!)5DMj$N{tS5vT)nZSEPMfc-)4DtOd~#>Oxw_}(DSPj1W4@W+lP|keza!xpl^2Uk$CyiDdLA3@L2R|OL9dcTi#U*A- zKJab}^K9Lx6GLiik@CRK`;2`uZ2ZOsQVgE=Qwl50j{I|Y&@9xHFmJ3n+24_)5hpu3 ze|93CiJaJCJdRu@Rp~}13|gXCb}33K7_4y?_M~cnRSfY1(HSU)Ay?ZrZs-3J_!s#WubR*j8mQ=f0uHBLP})$%P*w zQ_zX#_> z!k8>`s!hUTWG!!nM%IYmzM7Ltj5Z>*gzZ^!gn*OyT_vOEq>u+=u zNW`TXlZ|41gQ?wN90E7uAcO*wOzrEeU+Z?f&+Fkvuptn52oP04?lN0RpKPR41IqX1 zBswt{U%QKCV(#vaev3<3WPByTSj69H0H)#{zE|m zm7fy$$956;I0vc0g~i8pfZts9M{8B?*2yZ}t(=bS{PLIvz;D?57TZwJX#@M%MgD1uEI^P18TX%U> zgifD?ie&h3N%$X{lnIx&5SKZnIyhORCgEV7>LRmM*RNKE#cG9V?m6v#`k8K7zDyY; z{gzn9t)#Fd(ihoyQdb+rsG3|@8X#)h^IQuOghm>Zcqq=Hq$3eXMZfbx#U}cr;wlBN zVVE`v!*sXOqncjpZ{F=sO9rA0-2@NKsE~MI@vwx2t!y9DeeJ)XZkJ5Q$ajazzk)KZe(SarPX5Yn3S7m_p;=a7QIse zrsU-g^APqnIk!y*r5zP~%w{EXt@1%q*C0br?D{o;zJo7-Rug$ z^e!nQ4DIc#2>fSs533*_rkJHMro!}Y7EN`doqNpaDw--MI<(u~mDY@MirXG+U-n@2 z3tkB}Vx~3XXL-Ym`RPMBpe8L!ofAfS88;jf&||>nynZc8x8w zV~bip91gf4zB_jLFI^~EN-0pg+@|HPxO~!Vr=k{ia#Fr?Q65_F;-k8?YSC`j;yWcX zOBU_q)wb+T?XyUBzpp`| z4}R?2wYq(i(p|ef_Sta%Xf3 zgqSzsN<0&`!bG@g6IsXcNrt1oG1atg!epx#aKl>~P1^8b519Y)%cYVX_a@8h*~qFHy#2xIl@yhl;lhGKUsDC5tlv@ata`kYA0 zfaL-a+6X5XY2`)^9Y*~1H*!A_%;<60FX#t4pqtXK0F?dA0(eMc)te5R;(kN)Lzw6< z@$&aY?0{{+W`vYH6K+Q0KFxM7#a67|nK-AuX32tDr^+-6SZI?M`^!t?@)BMXgEe8- z9rO*13g%8XIktdZ;=NL0f!zS<0CZyO*%hYPn-B5+5>_S$uPb>0+QJN$V`BjdV5T}c zz`akdM#$Qb!!aGzZ-tDn2Qp+dd4_<4J-P;pF6~W`NqR`!2T@^1Xo&OU09LS28GN1| z?M79hW>C*tc4rgDh%lLUnK@XPW|}aqsqfZp^qOVE_9i9;X`GSlPoGs`1g)Cl|FTjW z(h`E|MhoRS={Ul^13;Tm&sho5s+9A)U%(zxaVne7()I(~C>Nuz?7-n=Q!6_0O zz-A}FDk~ev4u6)}ibSadodzIZ1s<0u!Y3*5E`&YMpW0T)xuR9fXuoAx47Q>_`_mQE z*Ea1vB#&l1Br89ZN2k(okQDbH<#ozv%70JfNrWIg2SwrG1Y}k?mla0V*XB@=PmAVO zAd(zx!=C(@g3l$}IISr9p(E>Ov&Md$&0atB(7=KHgT3?xTeuF6 zc87I6684@LEl3y8Uhj)Fu^1P~wVK8kDaAr}=3mtKx{iNf{+d;0#1}Hl; z(0$~O0)lsUMCk6EW~fQzFRS5r{g)TEChC8==dV&Ah%K83R4Fy39JPl-GyNJT_>n$5 zJ35>vML4yXhTt$J2Ua0t7>UO;n&`&{kxMg^Zrnj-n?ZFfN1-rxD zhR7iXAY5#)%u;a6h4=WbuaC#)UWAWY+Lym_C(EWl$`Mc5alFrRMc2R<);9_|ups4FL!UZ?)=on9g^pVaF+t>oi+)TY(s zCg*rF?pJ>+HPdX z=Eh0M!ft=Tx?r$4VU}ZKHeC}oFBl)2D>L)rMTX7dZhz6bU{kd}#$(RN_~=AKI+v^y z!ggj!>s;G4@8~Bi#YiEnb-$gt0(Yv{JjAwb+$byLTUw19XZri|$e6{qXmk(vK&%{> zhr%Vp`CR%bWd%i%oo$r<&_wp6O@g}BPbmp(-RE?bHz1jbm1~n9wG78Bjpq;%GjM9pn{eivnzf~cF+Rnam2SefiBW0}NZA4dN9(79U!s9$kGuZ5d z+6Lc;Y@mW~(9V^jDk_Oy1<|vb)%j^*ySmo$*dk46>m|`>%LFN`73LyHcJqz1(v<$$ z5sY@H>8#WG!TZgHh#qG?MxN%2`|>OphRQ(=>*`3|^BeAqs9OJQU)xP-%X3(CkuG!^ zw#ikD$NUAndhb>LWYHr;X?(=4T(Y0SCIhKICzE=ysA#&R>x$00-Q8@uJ=u1k9+q|u za|k%6J9VSTLOz^Zd|29@>Mw=+ST2i$0MN1ry0dUDQ-rqZ0A7?A9dB)_!RQ~=9_Id9 zOTmO2#e&;!zuos>u6ZyhaC5$+GIk84{KEh+TgwQUc=SNMSaQWzpbQC0wVY88ygs;oG+g=_-R1#1(juMDWuJS(OLgQpXXPUMFw+Kv=*<;UgE z;QZRf_z2AA5lS2GpYor?D6Cy+yMo1KQr_7Kd&_{Fa#qTB${?HPG7SZJ*~99$;*=Uo z#(=J;BuU!nI`d13)YN-h;UfWUw3r0@3JILzr-;Av6zR??_6R^pClannwU9)Co{i4^ zzCZbB#&eJTZ(w*ToOze-YHWa9ofJ+O|1z8S*Jnfn+>m7VE_3;$a6<}RCIzzc;)nCW z3UZ_E=itDaioR2LXQimfRhwu)K%WsdyBwy2x~taU?}DX%>X18@X;c~8!{XQ$EO0my zHHw_+i`{k19|+QUapQZv-7J1_HdGvP6s?@24d5z!HF<9jNaqRx@)HB`-kbMoTZd5C z#VbZvEpL6#G}Ly!CQSDqPw^is{l^$TFena)Sq3m!o>GlS3jwanxh^a0630LpDEbtI zl(X`g6>0$sT2_JOsq1Dn$GWAE86btXnWCR=jHV>Ki=-eob4yNl&HD#4dRDrn7CvMf zK#T;&%Y)naWh@$7NlcqH8^f}(6fKCUhZ<4Uuk`4XVPHRmf&NrrTX?f}KlJo^1j3n{ z&aE~GkhF@6hglr!%EZ{y%$Z{Q?E^aEjA~tD+Kxblrmb-dBPP<7QF7sXtUG{eQKXcM znj)S$pIxVi+4ZKlayl@WH&d-DD;_!$7Rxsrz8b?yFQ&r5p4P~#)Zq!-GFVWwr}@gm zumRKZm0wbB!73RX58=&6{l%20QrA3CjbMpm~xczlb;TsyrrtXF!5kJdku zVz*}{**Fb~JQ(mei!oqtiNU>GN1Y_D&`p6dWPn-43H8p3_`xQ9p!XLOzQ?lcN5jQJ z4L~d{YwLCmG@Rek1J?9S3udol>^oo0Rj1JSlR>>Tmg=jLQETeaZ~T82}R zOQET-b7>ubToizGq8%O)O`=%ffJgR;NghA-491ya)Fq%4xl{b1H}s-s%0D0D=<3X$ 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 From fb5f6bb4a206d9a41fda40ac83e71fe425947a45 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 30 Jul 2008 08:37:05 +0000 Subject: [PATCH 33/58] Rework GPX import daemon to use libxml2 for speed. --- app/models/trace.rb | 20 ++-- config/initializers/libxml.rb | 2 +- lib/gpx.rb | 168 +++++++++++++++++++++++++++++ lib/osm.rb | 193 ---------------------------------- 4 files changed, 179 insertions(+), 204 deletions(-) create mode 100644 lib/gpx.rb diff --git a/app/models/trace.rb b/app/models/trace.rb index d28c2c6f4..cb49ba62c 100644 --- a/app/models/trace.rb +++ b/app/models/trace.rb @@ -174,7 +174,7 @@ class Trace < ActiveRecord::Base def import logger.info("GPX Import importing #{name} (#{id}) from #{user.email}") - gpx = OSM::GPXImporter.new(self.xml_file) + gpx = GPX::File.new(self.xml_file) f_lat = 0 f_lon = 0 @@ -189,18 +189,18 @@ class Trace < ActiveRecord::Base gpx.points do |point| if first - f_lat = point['latitude'] - f_lon = point['longitude'] + f_lat = point.latitude + f_lon = point.longitude first = false end tp = Tracepoint.new - tp.lat = point['latitude'].to_f - tp.lon = point['longitude'].to_f - tp.altitude = point['altitude'].to_f - tp.timestamp = point['timestamp'] + tp.lat = point.latitude + tp.lon = point.longitude + tp.altitude = point.altitude + tp.timestamp = point.timestamp tp.gpx_id = id - tp.trackid = point['segment'].to_i + tp.trackid = point.segment tp.save! end @@ -217,8 +217,8 @@ class Trace < ActiveRecord::Base self.latitude = f_lat self.longitude = f_lon - self.large_picture = gpx.get_picture(min_lat, min_lon, max_lat, max_lon, gpx.actual_points) - self.icon_picture = gpx.get_icon(min_lat, min_lon, max_lat, max_lon) + self.large_picture = gpx.picture(min_lat, min_lon, max_lat, max_lon, gpx.actual_points) + self.icon_picture = gpx.icon(min_lat, min_lon, max_lat, max_lon) self.size = gpx.actual_points self.inserted = true self.save! diff --git a/config/initializers/libxml.rb b/config/initializers/libxml.rb index 8725215a2..a1870dbab 100644 --- a/config/initializers/libxml.rb +++ b/config/initializers/libxml.rb @@ -1,5 +1,5 @@ require 'rubygems' -gem 'libxml-ruby', '>= 0.8.1' +gem 'libxml-ruby', '>= 0.8.3' require 'libxml' LibXML::XML::Parser.register_error_handler do |message| diff --git a/lib/gpx.rb b/lib/gpx.rb new file mode 100644 index 000000000..76f0af19a --- /dev/null +++ b/lib/gpx.rb @@ -0,0 +1,168 @@ +module GPX + class File + require "libxml" + + include LibXML + + attr_reader :possible_points + attr_reader :actual_points + attr_reader :tracksegs + + def initialize(file) + @file = file + end + + def points + @possible_points = 0 + @actual_points = 0 + @tracksegs = 0 + + @file.rewind + + reader = XML::Reader.io(@file) + + point = nil + + while reader.read > 0 + if reader.node_type == XML::Reader::TYPE_ELEMENT + if reader.name == "trkpt" + point = TrkPt.new(@tracksegs, reader["lat"].to_f, reader["lon"].to_f) + @possible_points += 1 + elsif reader.name == "ele" and point + point.altitude = reader.read_string.to_f + elsif reader.name == "time" and point + point.timestamp = DateTime.parse(reader.read_string) + end + elsif reader.node_type == XML::Reader::TYPE_END_ELEMENT + if reader.name == "trkpt" and point and point.valid? + point.altitude ||= 0 + yield point + @actual_points += 1 + elsif reader.name == "trkseg" + @tracksegs += 1 + end + end + end + end + + def picture(min_lat, min_lon, max_lat, max_lon, num_points) + frames = 10 + width = 250 + height = 250 + proj = OSM::Mercator.new(min_lat, min_lon, max_lat, max_lon, width, height) + + linegc = Magick::Draw.new + linegc.stroke_linejoin('miter') + linegc.stroke_width(1) + linegc.stroke('#BBBBBB') + linegc.fill('#BBBBBB') + + highlightgc = Magick::Draw.new + highlightgc.stroke_linejoin('miter') + highlightgc.stroke_width(3) + highlightgc.stroke('#000000') + highlightgc.fill('#000000') + + images = [] + + frames.times do + image = Magick::Image.new(width, height) do |image| + image.background_color = 'white' + image.format = 'GIF' + end + + images << image + end + + oldpx = 0.0 + oldpy = 0.0 + + first = true + + m = 0 + mm = 0 + points do |p| + px = proj.x(p.longitude) + py = proj.y(p.latitude) + + if m > 0 + frames.times do |n| + if n == mm + gc = highlightgc.dup + else + gc = linegc.dup + end + + gc.line(px, py, oldpx, oldpy) + + gc.draw(images[n]) + end + end + + m += 1 + if m > num_points.to_f / frames.to_f * (mm+1) + mm += 1 + end + + oldpy = py + oldpx = px + end + + il = Magick::ImageList.new + + images.each do |f| + il << f + end + + il.delay = 50 + il.format = 'GIF' + + return il.to_blob + end + + def icon(min_lat, min_lon, max_lat, max_lon) + width = 50 + height = 50 + proj = OSM::Mercator.new(min_lat, min_lon, max_lat, max_lon, width, height) + + gc = Magick::Draw.new + gc.stroke_linejoin('miter') + gc.stroke_width(1) + gc.stroke('#000000') + gc.fill('#000000') + + image = Magick::Image.new(width, height) do |image| + image.background_color = 'white' + image.format = 'GIF' + end + + oldpx = 0.0 + oldpy = 0.0 + + first = true + + points do |p| + px = proj.x(p.longitude) + py = proj.y(p.latitude) + + gc.dup.line(px, py, oldpx, oldpy).draw(image) unless first + + first = false + oldpy = py + oldpx = px + end + + return image.to_blob + end + end + +private + + class TrkPt < Struct.new(:segment, :latitude, :longitude, :altitude, :timestamp) + def valid? + self.latitude and self.longitude and self.timestamp and + self.latitude >= -90 and self.latitude <= 90 and + self.longitude >= -180 and self.longitude <= 180 + end + end +end diff --git a/lib/osm.rb b/lib/osm.rb index bd9351026..9c271607d 100644 --- a/lib/osm.rb +++ b/lib/osm.rb @@ -70,199 +70,6 @@ module OSM end end - - # This piece of magic reads a GPX with SAX and spits out - # lat/lng and stuff - # - # This would print every latitude value: - # - # gpx = OSM::GPXImporter.new('somefile.gpx') - # gpx.points {|p| puts p['latitude']} - class GPXImporter - # FIXME swap REXML for libXML - attr_reader :possible_points - attr_reader :actual_points - attr_reader :tracksegs - - def initialize(file) - @file = file - end - - def points - @possible_points = 0 - @actual_points = 0 - @tracksegs = 0 - - lat = -1 - lon = -1 - ele = -1 - date = DateTime.now(); - gotlatlon = false - gotele = false - gotdate = false - - @file.rewind - - parser = REXML::Parsers::SAX2Parser.new(@file) - - parser.listen( :start_element, %w{ trkpt }) do |uri,localname,qname,attributes| - lat = attributes['lat'].to_f - lon = attributes['lon'].to_f - gotlatlon = true - gotele = false - gotdate = false - @possible_points += 1 - end - - parser.listen( :characters, %w{ ele } ) do |text| - ele = text - gotele = true - end - - parser.listen( :characters, %w{ time } ) do |text| - if text && text != '' - begin - date = DateTime.parse(text) - gotdate = true - rescue - end - end - end - - parser.listen( :end_element, %w{ trkseg } ) do |uri, localname, qname| - @tracksegs += 1 - end - - parser.listen( :end_element, %w{ trkpt } ) do |uri,localname,qname| - if gotlatlon && gotdate - ele = '0' unless gotele - if lat < 90 && lat > -90 && lon > -180 && lon < 180 - @actual_points += 1 - yield Hash['latitude' => lat, 'longitude' => lon, 'timestamp' => date, 'altitude' => ele, 'segment' => @tracksegs] - end - end - gotlatlon = false - gotele = false - gotdate = false - end - - parser.parse - end - - def get_picture(min_lat, min_lon, max_lat, max_lon, num_points) - #puts "getting picfor bbox #{min_lat},#{min_lon} - #{max_lat},#{max_lon}" - frames = 10 - width = 250 - height = 250 - proj = OSM::Mercator.new(min_lat, min_lon, max_lat, max_lon, width, height) - - linegc = Magick::Draw.new - linegc.stroke_linejoin('miter') - linegc.stroke_width(1) - linegc.stroke('#BBBBBB') - linegc.fill('#BBBBBB') - - highlightgc = Magick::Draw.new - highlightgc.stroke_linejoin('miter') - highlightgc.stroke_width(3) - highlightgc.stroke('#000000') - highlightgc.fill('#000000') - - images = [] - - frames.times do - image = Magick::Image.new(width, height) do |image| - image.background_color = 'white' - image.format = 'GIF' - end - - images << image - end - - oldpx = 0.0 - oldpy = 0.0 - - first = true - - m = 0 - mm = 0 - points do |p| - px = proj.x(p['longitude']) - py = proj.y(p['latitude']) - - if m > 0 - frames.times do |n| - if n == mm - gc = highlightgc.dup - else - gc = linegc.dup - end - - gc.line(px, py, oldpx, oldpy) - - gc.draw(images[n]) - end - end - - m += 1 - if m > num_points.to_f / frames.to_f * (mm+1) - mm += 1 - end - - oldpy = py - oldpx = px - end - - il = Magick::ImageList.new - - images.each do |f| - il << f - end - - il.delay = 50 - il.format = 'GIF' - - return il.to_blob - end - - def get_icon(min_lat, min_lon, max_lat, max_lon) - #puts "getting icon for bbox #{min_lat},#{min_lon} - #{max_lat},#{max_lon}" - width = 50 - height = 50 - proj = OSM::Mercator.new(min_lat, min_lon, max_lat, max_lon, width, height) - - gc = Magick::Draw.new - gc.stroke_linejoin('miter') - gc.stroke_width(1) - gc.stroke('#000000') - gc.fill('#000000') - - image = Magick::Image.new(width, height) do |image| - image.background_color = 'white' - image.format = 'GIF' - end - - oldpx = 0.0 - oldpy = 0.0 - - first = true - - points do |p| - px = proj.x(p['longitude']) - py = proj.y(p['latitude']) - - gc.dup.line(px, py, oldpx, oldpy).draw(image) unless first - - first = false - oldpy = py - oldpx = px - end - - return image.to_blob - end - - end - class GreatCircle include Math From 64fa7e8f2be0d63af3d6eeab95ae0f3ba0d9c087 Mon Sep 17 00:00:00 2001 From: Frederik Ramm Date: Wed, 30 Jul 2008 13:20:33 +0000 Subject: [PATCH 34/58] add "non-exclusively" to new user signup message --- app/views/user/new.rhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/user/new.rhtml b/app/views/user/new.rhtml index dca1e8509..5d4687edd 100644 --- a/app/views/user/new.rhtml +++ b/app/views/user/new.rhtml @@ -1,7 +1,7 @@

    Create a user account


    Fill in the form and we'll send you a quick email to activate your account.

    -By creating an account, you agree that all work uploaded to openstreetmap.org and all data created by use of any tools which connect to openstreetmap.org is to be licensed under this Creative Commons license (by-sa).

    +By creating an account, you agree that all work uploaded to openstreetmap.org and all data created by use of any tools which connect to openstreetmap.org is to be (non-exclusively) licensed under this Creative Commons license (by-sa).

    <%= error_messages_for 'user' %> From 6595fe96a7417c83d26233bf5b1e2de0a601b948 Mon Sep 17 00:00:00 2001 From: Steve Chilton Date: Wed, 30 Jul 2008 14:19:15 +0000 Subject: [PATCH 35/58] new versions of map keys to z12 and z13 --- public/images/keymapnik12.png | Bin 31507 -> 60797 bytes public/images/keymapnik13.png | Bin 38924 -> 60797 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/keymapnik12.png b/public/images/keymapnik12.png index 926116be7b57aa1faa97339d8533fc3ba4261375..ec2e2160dc56c9ebf5f042aa478de9c3e7642701 100644 GIT binary patch literal 60797 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
    |Cp@167;vG}y@WpQ97ES`ltwuNT^w9C#fCPXt z6xt$y*`dE9-xjqU;HQ`E@YC2|iGmki;4co=XtsI@Z|+uae=%IX5nH~MPI1=M(StdA z<=Iu$K`6dE(X^XMTRsmx!1_R{woBXBA0=F~r)a#rtpz_Q5x-J1@4^ z5IgOfW6#`hR()DKeSfvk02gt|-c!N(D>)lG^HE3*!(p-Pmt!Z0-G5X$$t=B+WrIIe znEZm`7vk}}P=`^Lif#H%IlnktK@!alcbx7=H{USv_n+C=xOGK<&^##3nVX^4E2lfY zK*h&q@-eKrt?|m}-kMMUlBBU3B5lkw{jP;_ER7E*`keoxiwA*Dlm*&=D+Tz@Wz?*_inhTaojZIcA~p+!;^9 zxqS-ct`aW(Sh4xES3JdEU3sI23d00k7~8WOte1IDhPqDzVd{NZ8h(wRD2a7EWpErJ!`eS_U;4h+dF&t#!r6|^40mm=;Si^5XXJFZfZDo z!qe-QJvr}7)>o$3y$ag&mtV{MKpF+~t8f@*^D#XgbxTj07ks*>sMt%E+(Sv^pAS1= z3>Mr##>^=1pQFZtjIRYuQ2=d+#$X3-cDTDhV$LcsZ{6*EKTa;?uHrHxG0mVqVz%J1 z#QZnX-uSkP=17z*_SQL97>x>3fm+3K-On(b!LA7ZP6y27;1?Ek4ar?#>{!JbI;3Wm zB>5~`%ywV^a1K`po^1U5a6%*J2+xU*3c$Woza7Qcwwl~{vx3ziA$#dsa9+0);kg6b zF81N2P;k_q4Iwd%`#CH0OfzRb($}45G5OXFFQNU`7hT1Y@0~jP?Uo8yzbzH$dEuUz zTB3X5-{^YpkDOcIJx{%^F3j$){ht1QSBPNW^26ZKe=_LR172^NyPjSftmG#WTh=@l ztK7f4uFe|>>g65Ua2d^J<>m7>D%wRj&ca=-Y>^)v$i)`iYm zKx3u;=iQAbvqb2!uZpd5BZmUk!MhiFic($9lfmJ9cJQVVF4kvD3PhX4F3xauXA&2s zqqlhX-?>b^-qBD(cS%?OV$bq?1NF22n+srQZ{1Jtl{IybaD6-gHr7n1hNx~E8w%iH zT@&?pR*z49FCL>VTa?MsYj`rQke^oPQV12iG*{sayOlqn8G?Lb(06Va#>37vWY zJ(I3kv7=n7>w?wOG`V-}mf7M}H`Q%wHLP4}^b+;IohM4EdulnxA=-hGm}vAwuN`$K zbh(~lr_wVyrsnbA07X#t;=l(731K2KKo*eHCMwfr*6AIASgY1qgM%k=*Tv-Vp%EFU zP{Lk_1-j;h=Y|B&0oMX0EOql(xSUhxt+cP84}8Ne)AB#6g|^69;XKXGgPMhplVRe& ze_wKkVq*y3C!V^;{1gFaO z6%hO?GLCnrI}h-b>gAYTV6gkH7~!?AmHb~rI<;){@+qyvOi$FfMo?jSP`-;!BuA&xBSczY zgrXy*V>D9%$;qTfDvS~Z=>gIyj2b0KjFxT~eI9@Bc|Yg8=X3si_%Pyr?)$p0>-xsU zwRD5P_CX{mo4GM}m-&-WJeq1}B7qz0GJf~$4Bz&HKh-=v=IJk!O{Ma?)MLxuJVMlu zY@yqg9!e2&w33$R)^VtMpdDaiFBK<2lOOCs*9Zwo5tULG*f|7c+B=tM-*$d(-JD0g zEYOPi`A!7s;#@Zz&{%HP%Fog-;Ye4MdE4mZxXoFwsU?L%AsazUTQV6#?kci8!)PoG z@%++PHkj&I3XtGJep56#Ud1&@#wQ&Frdv~%Q~9sMu|Z|}@vTejb2@(qm#qgy#i$FxqZ`@W<@c59kC}r2w~5SsyhyzK z?wzkDJIvKKbAnYA^SE16%9PBzGifX?su%>yFd*mvEUFyiw11+-8;CnNv{o z6$ED9&7ibR8F~rQVtR1nLJ9$@#xpky?M-Ag*{|x9dy4P(czBJ)$lowlE>5{Bi z$>A-0)u6?%-#1IymEMY+T5_0`1%gZZEQN29D96k?&v)J{hAYLU3@<l=!lqFh>!7Me# z9M>^H?8zuFu+S?w*2-v;Mg5bj=*w$PkUCJcg%w7f#|Eg^o9$BM+n~S)(F4eln_5CK zrHbY=*z$B3bI_)aDQg|2jV&ezwfUi!7eaiV_gSunsBtTwzr-Mry78P7BDwvIyu{f9 zqP%1St*%3DMvilBwS{LeJb<*FHG4vJ>>cmrz zP5pU+5dQ%RL3~xTdY=m`#J-yK{?apQ=n;8i2qoSHB+nCab)(c|(-yj(Ho<}Mm|>H? z^sjC;LyEK?qzM$aOS(J>ezW0es|xyat@KSSw3AUk;kyU>Y}{^0Vqln4?ME4c#W%^Y zKCH{xgBX*Y#s+R3UYQEuP$u zvy)~ZC09juS*N+MVV; zH0#YfbL*G%QnqBp7pT-P$V*$1^A?#gY-7Bg=3LBioxzpwfXuLpzVxk=mBg`rM`6ik z5W~yWgiAqK-0BCFDS3eF3Szatk79;69k#wiv>)$JELJ~AAMfqnK7<}wv)K{4?d;d& zT}rP>NmZPy;7WJM&=n&^mOO_om11ASeIJwz?}mOIuiIpv)iesNkW}-K6e4`<&9RTD z3CqoeCV*c)l?DxCJHY|j%$fDUk3nK)=umo@d#5kPnt^^1NGS9wu8jFmeWuk}EEqn{ z(%mJ1p@8RP^~=Mu)i34vUTZuEwT2Ga8%QiLwAx(nP>KzQhf6e2U=6PrF?6Iv(4*j~ zo9f^m57?VhF(pA4`{O5ka9KmcaRwVPntQ9pX78aMn@@5XjWq<>F%bez0%ZRQno#IZp}gfxw?ZNM*V{@$NwN&=1q z7UK`I7LC>Aj-&`u8c7B*hr&mp5AK+Lg{0*ee0Qk*aTeFCbsj3q>1H_79V?z+p(ZZ+ zW?+sGS5-uxVFsQ|3XtsvrJ-Co!B&(vcTeZv4%jTuR2CbQdZrX@TwL4cN10H^dAYtg z{Ce2kz}kGU@6TY`U>_C~(luX|5CNn3ZH7}x_L7MhhsYTfeyO^xZiOF0h7fh8O*Ee? zft5R!*g}lYb{B#ftc6)EpFXp~l_!olWH}mg>aueA5mn!G*BruJJ6`B<9vw<_qPBt$ zmtWqj#SorgT1W^qGh0fkhT9*8$vBfzIYVyJSeHeWkQj`x_86;)6zB}{k)d1#7>S!h}$vu5hvA0N!h*e5Yiu^vDnv+ z-^29jWvXQTQ>jLXKi%wHk~t4`8v+Lc0wSSEd{uYOJPUq{YbTFXXFj4(R<~0gF`IDU zHnr5D^B(Wz{g>mN;8HM;-_WkX##IAK@tMF78&Cot5`*8deDI>5v3E~F!#%f?1`MwT z8PD$elFXz8-VI_m8+P_KZkw_nc?f&6N?S|OrO)-fVbAMD&*HTpbdgxoADe}J_@(f} z^jjzVKL`Fk0gGt(Q+GKRbV-0{zW4DqN1TQp^~>viMgQ>X zu3+_H+pIEo#UP$?QKifizk@Sl$bi&91jYcuVABzR#qModzZb+a{;7SI1@+YoQXVKG z0^8mVZ}Vq$C8poATqEm{%?!3hmoDlS)C4L5~{HJ~>y;3#YX!#L~<8uC%*> zCmLURzIgn^sQB^Kt~$HZG&1t%@|*Y&Duy?~>|D3Y?vMA;j`s}; z>w<-HvnG$i66;EW@2}PViu%68&XaTj5-$3#knL6R7-iJ;YE)wBevzukzWf}P`_v}uDW8+ON6ruh)?_O4-YcZfE^y48s>c>ZM?H%oj>jT zDK!dhf~LIBl~KQ-vHU{Y;I)N*csxl?=Y z)7}Z7oc&%~g?0>?YT39&1ixnwd=HS7Rapx2{oJ*(iACCioVif0ff2W z^pz6Jr?|HJ-^0*CyoyXp$<90tB1PF~+PzB-@CsN?@HogET%&a=I$5iV`|9C(L&22- z?{-Hi4BZ5-du&Jp-qxzKG>nv~u{v0I_g8iM!*>;229l$b_nz;E%bKJS#pA2w-O#Et z=JBKC%FwOn(qI}e3xnk<;(IBlCN2V*g_MxkI+jR(!n-L@gh1cf<={Y-D)%dYQ?W&( zf!&ZD7!rqW(wa2KeHxmjC_l>(lrBYo;%VSor2==23?3iOSM0eSTp64^-P{PO|2r;c zuq6bhP){Fz@1-SYjXMPB`^90(5Y3|^La2v=Zj*hK=T*nM>zpmz-$I+KUfoLN?}5af zaW-BnX=~dJZLgVVigq(mW;g3gC;3J{{+<4CgK6N3Wrdd>#k{p3OESBB$*Xi|ev30a zn{B`*>T0EBA@ml)&w`02NTJ?c#4lc)wSB*d_|xv@Zr6fAR}+2`Q`O*CGyjE*HjLkM zyI01x4^j)tX}FL1x#GNgJ_kV=&Hp|RmpUaXUCKgy2s|e(3GfREq7K29bmTE^A;!J= zIZQ>Bdg6LVs}wK&0~ur(%qGrcPKP9W9kq;6fQq}By5}q3HH)pO_4fb6ue-D z>3$#%T#8qW>td?vXaB?1!=5NV#(*FbU|}Mq?oE;xj91K-uZFPoHZJDfiX~22EJ2Y< z%aD3??U6&!bL9>e8i)ddVKPRQYP#pP@AE`zG$(etL7gFk?u)j)L0< z_zCm#y7u5-Yo|I2+X;dd&!>ui!u^?!&HGUD$-xZ$u`4L}$;Y+qUmKS$hB=&>IJzQn zg5afd%5m*fbf}i!0J|k80@)}jZ_7a+Y)N&flz66m(>935&&7DeZ2a!}NC;};)j1<3 ze-wq-v1!xcVdrvu2s-ikad?PpU?Mi!K#PHOY&2{G8|`J-Xgk%s|gI`W(#-5{|vg%RIdqy zncsFfn)yZ(;3)>n03PX090x73O!r54)*FgY9rgA zs0!Leyi0joM@m7ZYa2iubXy{nH5=?>~2q`?lMYv{6Q(bS7z}cFIaR4 z+t{x-kW*N|=P3>PWX#!7nZvep&FT3)(TZ)J&9Ey&8;X0YLg&5zR@!9I-YavusQY+4 ztg@HSIen3Hhx4nb@gvzmjgt8$aiwXt zBoSNaC*I&_1Rtw*(J|TAne@?z4P4JR_wQb2B|dTwPX3T>KFmd zsR7LU$d^F(F}ax>!=RQk7o<7es_Rq6f0?*n&HXv?<1RI2tC0xarP`Q^0Tn76$I1bRfpz zZNZugIcC9FveuRYRy=o-zK-#(SCpN<_G%Y4=1jS>(cLc4lYZ&Eg#vBr*oTx;$aJ(l^mmrP(2hK@h3kxc+?l({54GVP z>GPDW?s*a0Z;3y{5ihA@t`JF;IVh?D`c1hCIZH;QRP)Nx6+r8FT#b{wHZbHxZekN# zr*SWHVf#8LUGD3%QSyd!#@E`4YxQJTucsN0={FPPQ+|00zo^9$At&c$-(`IvpH8>+ z0N-TPuw5tN#%}n5QSp5d24<#L<(LRPzD*Q!dG&iI+i&9EA17_;1pD6{_ZB{KURzOb zB=y&v8t{F&MR39-6dNrM14?6wTlyR|GFd;jS+#mc^t69QtrPntrOBn*KM&&kEuU{V z5qT~JW?!;Aqd}jZ*AzL%l^$hq>uZp2;UOeuBW)0@1J|HfK8>WjPzINI2Y%)0jjxETxU*g1z@T^7+S?8=-ZzdzYYs#v|z0lRHORu2G7$YrGWBPEMp zggZ7#>*(K#92zTQGB&f*b2anns`X1HdgS?0zxI|A6S22kJ6EdCA{N{!6imA63FoH* zQ>f>6Qq67fFN4|-Gtv4xCIwFjTK95A8Z)n0M{jq%%8FhjKUWIoUCk|A=bK{up;AJK zAzWW|R#4Q|n|d2+zTGb`*w(xqgW%ilpgO6+gl_Qc#|2jH5@+Qc|M~l;$vwQ;GWT+} zXtJGvMvJ&F)sBXJ|E?XpEjuL}Dq(`lCvXWtF7n*WHr9Wy5-VLMrqmQdmd#j7 z`O^hzwD@v3CT*g)Hh`hoD6`SIHVBNAB5njQ0M9oKoc)v3gul5>OKQKCCg>PND?)aI zgwEyV3ZLZ*ZhZ?;p1e@>Yn0r&a*h;f5#|UM)>h+k9RAxiK9o`lxIP`1geIa$vyqSD zbw2jT6*D)QI{0NhIR2uSu5+VS>+}?3W)6kd z8SAZS7=Lb2Or@I*-=wb#hF5vyRr$dKRfc_w99V7T!TV_w-b zrg~C9=CME~{It?>!rJ9!^1V1)fyf3P9|4b_1*qUV^TRcGWI|vhi52TqSjNNE@C=oS zb4<_l+sE>tGYHPVc^S4>VQ>5O?lh4C>pTkfvPQT$Lbj@|315y#2M!=O60elHkNsv5 zlBt%X#nNI-oe9s>K7SomD%F+8bma)mZZ_WCSn%LIC8a#Ha)mBqw z>B`rMb9tuY_z7~v0Q)AZWXUtkXqQcXK#PTGya~{xBR+^rFWji(NCbp<@;fHQoI9_M z@HZAiuL&m{1lTn+wtxE-tDn#gi!EjSA`+)B-13}k|Dij>&QmM0z71mVHgRZ+^rRKB zf*aIrIhyLjX(waJh0=T$b-VOX-^~n)DF^7RCaMfMMn;_@AU}W7oM~P%r?pZ2@CT!4 z0owGW9U7&Um1uG=K`ZgUPvJlMsDadf40Ha~WB=#DE+VCfGhn;A3wFosb zK+Dr051Q1*S^zD$%AhcNy5BsZqFm@>qGWPkL67O|Fn<8SFFzhMXWF*s8oCFZQH#?B zF;!Ojc(;fGP%Xo6iAqo6k0T`G9p4Scc@qlhkQ}Y?jcGAPGkx(RVmS{uMnR)DL$( zf7PGkxjF7_t=%--e&_nS*sg+|5oC1hWFrh62JNje?=Cu=cyWY`;Rr*U)q!CQ=&hMJ#Lh@ zBr3LZ&Y!?aa+^p)MJxKke0GLb^^g|rm1|PAB!d%JDT-v$r!D(z>`XpyJ`_BvC3-%D z9qS11G83Hb)yMV#Yj^Myp>J01Xy|9lWkTtrPg=Za8Y`7|df>om`w?a30&OBzo@Q%8o?b=6A`a$(^8r8em+jht&!g; zN9lc72__DN07 zjW50K4U+rqEc=s7i?R}nFz^UO&ZEeqUs2CIF&@x*_UiBfX~|H%ZnCzN<|OH-RAHb_ z2Z#+kJ2$fOc0-|3m}iTQ5KTX?{OK!CMx|5P2N|_m7B?74ue!0F_?NTq!anhQzx~=m zOO8ZZ4b`;5Y|DXn0e{bdXhKM35*$S1%4ne1hA-z$Df=7)&-R;JU>twBE_NJykh;#c zC0%|;GhzH%XV+)j_L$3lva3u-k|0Pq!2xvAj|B1QCnX;|NqN{A2mBHa?*CwKgjhQr ze9{`xzI#z}o5!bxs)H7KWE!^t`G+R8j#IrkdoYd3yB}%A&1^!&*0ox9*aKetlP7-3_9K#Z?3yDl`00oEf5@*>A>SDAG}?!v(NA5Ln?iNX!GyLP2A+v%XlU#Oq4po zgZB=qt9a}SF?0s=>jdcG+`%+Dr*?XAT6K4S%V*696?IzG-YM{gjmWCtXpvGviRR`w zcBIlriN`n-Btw7Z_U&;uD~xNgOrx#BtR-#70vrgV}hD@k%|6Z4{p&I`-2e1f??F+rF#Y z9b^JY*cOIJz0|{7;$5fiDUm^Wt&^L3Z6fksuwLYhyy`22tM4_~RzN2C< zQ8sGg_~adOxxLET0-q)%6lP-=ePE_g9v}j$=kGagZ$htt>t?Y^1LO8kX>E&JzgaMY zSnbuu+cx;zu!g>k5*c4bj*$Q^*XwR1jU;0|re9vF9Vofqa1~`yp}@<4>L0D8G181E zjADg9*hv%9EEr~MSob@a(X% zX61#cWX#@_qWN5^w$)q2EvXl$<|31I@@B^{NPt&Yx9%W4MyaWt9ZB0zRKhuRo8#B$ zAxM-`<|!@;X)0Y21s$8lUb1#ncTnxT6JuY$S47(AGRTUH#zQ@5Sp5 zJHNdlxj8?1;MC=_~*}x<9C%W$MRhYlfGAz=|n$ zKs$j7+1Sb;oB8K2`95g?`$wo*20wZGP*~kVZHG9^@iR<;mYTEu07UX!Al4#FleZxf z0pSyWBc;7_A-^4Y|5P@@-ksujvpzu9^!`$-IYS4>FYZQEpbRw@{c3zjGqI9HCR$e&$Q&8;DV40)cpJ8kCz!w z8T7k6KcmAJH$L!t7sq6W<-%hs^0re|eA|sGbz9gcZHS~_>CBZGoiO09180{DxbG>O zu>m?Pq!7~c0=0y$u!TMswM0(7)yG`#xEpgSn6iRx)89UTsh){j;6gChRw9v&?Z>MM z6d5cX{bb2x!kq;|-xs#MLA{I8{J$#HW^P}w#>iLb$E`c9x78r2TeiE*kV-AV0=e+E z94ri6KNpdYKo87w=n@@?RUmZ6vrJ$kdWtO*q zBkkoI)*yicSC1R=X1*_iM(v+`&PGuQW^7-t1d9FLAZA-x(7Giebaz}hqQJ>9Mn8(YlhUXW`_qFa zxl2<|WYoLqE+`w&H~#Bv|Nlbw0uuEpdjtM=h$++2#o~EPP2IrIMSlL4CYM+}jtPmf z3a5VazEMJs&pDD}+2j$@w1xN4{(1CvD*H&PAeX0XBw)0nZ8wV28qt`f7(Upz4tdsA zJIgao&Sq+K;6*CSIh&DuOZR2|#~{(9wtRv{Sw~pj&W9y?_spc1KkT@M9s&8OC!rJD z7~M2r=QZUD5bU3J0M>&aD-+SRPQ}KCXSWNrd7yH?nvF&83m;1Ufcfg;qLJ3kRWCJ2 zl_N(MEo#LXdtVC=bokYTFx0;+zF$;~7U7xZBr%Ip%LT4=GHyq^pquBPVKXc+=9C{( zRL@Dxe9lPSEw^y~I}R(s@QN@Bu0nAeKSsQ{Lb4+#=l~4l z%vm*m{qV6ejg-PV{;tBlE2QA!jzh2ITk4j!kt{ER#yaDA1)EELVR(7~2s^1Q!5D0R z8C_hfcq`)tR29e&ZtrORQ`W1@X2OL%rh|-s(J}2nqkK)9xpP-Yj&wSC4W0ra!SnAc zs8@%LCCG9b>)RWv6M^PdRhheqe*$SgOSyX(Y!9W?VY8thAQ9zv_vLPiP|E=f#U;3T zHsLXPiqSfBm68>%#;b$<34+$cjVS3|gTdF$2}mhHeK*=DAfaNl#78VV2L%peLt=RU zQq7-FN!rLIm8vFfc|*`=%Y(*X9+pht`xy1-wkLM)8%^Ax3Gc=wj&wB>-7d1D=>*-* znElPJ$8(Q4b-6PawhZ@zi(yPlcX(Xz#ZM3U5;sfu^^)$sei=c(nT0yQni^T?qWJ9H zdG8H>-tzKps^3EP#eA%Q5HU$|pVmjI)q;^Iz_8Z^{SYY2|2viVA9=<9co1tF8X={i zo{G8~?M$z7C2Um(86L?5jLpqhR7+j}b3-%=3)ryX{Lf0CJ9P^XWtrI0HKIz4jlJzE z8z=x*Z>o|!>{raA_TV@k1#7eHF){|piY^xSJ}y{>DZtkK>XNA=k%|Vk@JO-=5#AE4 zi2WAIJlRNL_Op1X8J|16@9y|PV>JFoc%v6wy6>AGo6@b{cMEIa#HJKms|FxR)pr-)bpI)0A<#7EX@BlIV;iOFqW^L?#!0iCf3IJdSc+MvhdMC~2qJ;NBiSkS;*0uM02+uQ@~g z#-0td9y*qCTsYE3hgBsx-gkuG?Xn#68OVjmgV~{#rG3Dg6v%d4D6{f?j3Yq?%stdo zqUh9KLvb!?Styj##8N1wNIb7<5KWyU4=1(Tfq@wf+{ox)>@N{7-|fozEce#|CFWt zT`;&EvJI@2>J z3;r}8N_=zvZfZ8MeENi+$Ce0Y@c0GP*NW{-H2;acPF*`z>4P|8$078BZ0{r^9rf++q(2)UMW2GA*~1*Y0_(< z5+nI77qSVO!8W2>R(4Z4zl>->>XpOLCp$wH_Fs8aR*Ll%4aRE?1~SSdZ8r;@J);7m zFRYb&irfc6JM4)w;d4-5&q^^yB`54;D(+)rzcx_a$wHi=+ay|Y?0>`c;efxjekYDV zaWu=jMqqK^yyBz`iblW!NECUgNT|QR_!a1{jc~n8xuE6#c(QY@o09b4jQxkh0cntk zeiruGSfCS!QMsT;E|=|f(LRR)jzjNe_GNiIciR9ELeY0SltmP5SftnTs%eAb5K;-1 zE|q0emn@p|wFNzmp@oJ(Z-+#z0zBscp}^?jG@;3|N=+o4>E_=B>AraTF}NqAv3?#r zTY~18_Warx1ZWl4iAg#qJgT`5>Z_~wW<^5`gog4JQ4Lar_9^Zpbkyvrd4+xnUD~Tc3CB;Y@nzj)bVscS^-@ME}t>Yv~FRpc8inW5JD^M=UOWe}>(# z$CqM09t$DMY5x9sYzZEHrOms^J7Cbzh*sx4{N$}WBKaHJe+{6L%G^wG*c1AkiPod+ zs`+*JYbQfn@g>Vgw<``XLejm8=MTngn8r$Ts@V$As-~GswN5_ZSm*T=cH{_3^J+pJ zidX0_j94`PJS<#!V>{$tx3aGI7)J!oT&is{BX*Up0PI}U>HZL1W%YHqXo-u`$D$gp zO?|L;Rgj{djYUXpA-&T8RAw`p6>$Qu>DzD)l3bPmpLHL{HV3-;0VIJ$+Y+J~_x||Q$DoyyWR!^rPJ6EpnhYfs zi&NlY6*fDg8JlfHHHfp_2TB%2#aZh+KjO}KGue)VXoAQbUGWXw7Z<`i_FyYJ^FaHc zQ76jF5Uek-yH3tYueh=RN{iNE9q;9m{LSo@qtYY zE(1D)2As(ie=Mi`PobZ$_3x7Y-^Krb%ufF21J=E;8ACkF_Hd!Q^RI3$ci_v*l9-Ia zk?DU|GgN`WF16-jGbixTd44}mlz|Fz)P;=$2&IN|8Pv*J-ne-rI95mIhPUVMOU46~jym%g$m zy?Y%hn668X7?`XfRb@T(L2Huz_it=`ysFjC8IH_sPiN%Q;^G?%*DjO6@+Q>MIydF9U@b|u+b_@o&q&x5-?pMr9tnX)=^8VpJFs2ts>ZEq-){2kXQ zbOt8zl)3-3zDTlvn%ahKEd8GO(eHsQ?p9ygm`?|LM_{$P)vi?qi{rK7*pDMmaGA{_ z1P8keH0!)-R?-OqZNOU+Y=qORU9r)TV`H2JaGyBjSYq*-8{=yW?K*NZ+!Y-`9an+8 zyuA`=nAG++5Ntn=J2v5Mh-Dr5R&t3nMeIi!uKHet5wN4&G4l0a{i@BK$W+hg2HPpF)OLMAq&n4-eg z;}d%vMXhkUx6~gNs*5&!Z zs*Y_rs^QK+#Vdz*eJ+S^#NaE9*kVexxA3x+oqO{w=7E^p8otP64B8mORs6=)~o{jq%Z?C3M_=O5A z_atlJFKFt4Z(A_$v*6LfMq^8jl!5?7MjH)|D8$;>uPS0!m*qU|uN5utN&P)OCss%m zOJ7;jrBtzIn17K4S^n%ce?I_MH)bmBHQAh;2lqE0+UVTSO%Z?WQ}P%!F%7N0A)MfU zZA%sNByGL5&q^ipx(sT!?9}vYHf@U zhq?}V^gi*`XgxR%)>}P8y=G^!n4fY1i;MO}5@Y5bxXS#w!Ablo(5#c#E4=M45m@kJ z?;9%{o@w4yS0d0E4qMX6-iVLaDU=5h!Q>KW|8*Y1P!}A-NrwwTe07<>T$k5R8{+Hs z-vqsY0=WJYsFZnDPPMaX=qo2C@EnKsmpuxi%91`=dXS=ME#mm5*5WD`c9|WqNB^S$ZL~N+I@YC0*+eX&hI0Ap z?s9|Qqw^C%yHCus>Y{3Qv;cdO7Hm*aM{Q^l{ZRyd!ow~+5NS-SPokqW35cwaV{JxN z!ladkCX*?{@HpPX1)L#)`%H%`$ui^}r?=k{|ty|W7sU()o-g0ovex3j{wqc84c%bk13 zrCsnV?a8Kp)kSje{0Mt=2NQyK8vl#%*n9~ zWc=XU8o5+fu$!l921_0s@+k4 zywb*=K089U!C$1fWAtW%Y_Uw^O^&|L=8p@>rgA#&D9-ighg?T(SUpAS8gw2!3M!S~ zUdw>tEHIXv4yp~`oo*i9l*vj0|5I@!#x4Fc3H^T&EVBgiV887Ijn__lX}j%{H#ZX` z{Ar{3UPe&GnlCx+&G%;Yz5QKKrr79R$F>9F81Sq@#W}T>@aEHk8Hu-3C#HQEvedyq zx9c%3hj59|+zIAUoTfHv{o-#YvN+`Sne1+9A#@eKtsajqW^R4uY z#NFf#e!E`wjrwPjV_tiqqaCDtZg|RPpR{*D+wZ2@Y-6-@D1wkhwQJj!qVwk9rVqws zN9dTe&&6d6Vi`n9;P~-u7m9 zk}BEWgLX$S^gasP7O-ZJCTu59hB2mZNwsaC$V(phQ=bQ)k(N~L19RW*t}t{+KWoe$ z{_7YgxDlL?vJ@Ml|I2aKmWu2SlpUTZZa>inbnb-!fwTcyn(NevBekT^jhNDq>;YeYFTT)C<%-wXiTV3u1(uw zd3J+GW=b;V+Y&MK$os&@6|W6(bX8DFlLl)7;CpRggGkAgvHYNBxd*>3AHh|e(;6nIBE0x_REVK!gBx$FL(HB2=pivi}o>;q%c z>Okge=?yqFuc*(hDUdB7gQJwY7JMd2&*lw@kGo2JJE4Tg2GWx7JpqoJ-h3SC5;Poc zl|sTG)CzX$umJC&@opF26TTzjD*v^Md^+q3cf~0j^+UMim0tlmKK%45O1^Rh0gyN8 zw@04!w=9$Zv%e_6y+^ENb!cAe#oxi%FP5B`B`V%(QhqaEHO*5bs7v2fcZ2hZur2iF z0&$w1$AV6xJh`-Rfkq%J{4NpXa)HGEg!barAwnP=P#gAd@o;fG&gnobya;T zqNIitxli*#j{@2mtZ0~oVLoN3i&s!ie1NcE%gDLaL{ocGLRkf>n(@%c@o2m9Gy>z`kirk8{Id1=kL!HKCCX+0zNyHvL=SvR=b=lvZ`0ky!ieg zV9m-P`ZBrsXCRdl=Zwryx|GT1M4b195r}8?3%RM5?xg$fdhn7YfIA_f_zvD-!V6WT zLQ;Q9q)K3H4St|5-jFg@Yd1T(bN?GcO1J32{BHQlNgZf9G3|7$&V3`Lb^oDmwm08M zX{o>XQXQC(B6D@jB1{zx_}D5&G-;YGX!{3yC>wW@z^dVfn@jASH|Lc~4Ud&VLpi#( z+mZ=?msqD}_sD;!$G#l<%&d#}$1(v1B*YS(k*3h=_v~}ogd?=An};3F&5@LycD1k| z5kD8`Woz7ruGc8vo|Nw_CY0tZGl8mkZUSGfrJnq}gd-Sy$vAozIeA_e2MhIW^fHMF z8RTU0dR-x!sfG+;7Kz^)7@Bc}ZZgoB1umT+Q6#kU79hQ^xQ7l=WBT2y5}xHD0i;D= zW0oI?ul&ttw6gpnO5vHe*i8QRUSeqY zfTidtP@CR4X2tsljqW_h?@k_g3;b*DGVLca1mc^tgLxY6uR_2n_%r$H*38(_4&LLr zChGb!KL5n`>s%xJrKcS-pUg@}? z8=rP=kAH2}s=c=AL2w%4`T9!4ts_{nMthRC=cn3ecjzTdL5?F*=d@no-SYHezA99T z&W1txN!HNbZLmK64^_b2*HC7}Ja?wLdmD*sb7<>@56zG+kfV}_R@8W`%&8M7PDLTu zK%yUCP*!Pz&V-$lM-av%y7O_EJ}^hXY%@|cE^(FV{3i04Q8&sC1(IP6VU%uYc&k6K zcZ>LR<HQUnO{4Xr(+Tbs_Y0{tPP0PiYbF7$_`s))IY$G32Mor?!xt_*F6I?D zjjC#{?N2>rB_f5Bdb|T&|J{w9i4hl>6V!IbPf!Nnbym~W>IKzmMcnTL_B`}?^t+=K zXWglfF`5U0$)Jzjq^r!PlOiMni#?_snJfF(p>a zFabG; zIBK-dintLI5#3|Y1z6`1#;f5!&F6!H*RmMLZ=s&q&wX_^ZBIJ5w1c*(u*?rMmnG}G zPu3cVtfa|bHD{fbAEIZ}@458tS|U9KJN+oEQ_w%S9VDWy`ux%9r#HddYy&YZAEVSV z(RXy0+&`jB{ygQ(jfxD@;XVAS2g<+ZJYWBWwa1b`JwD_^ugkLr{3n#1*a)3E7Bk~N z8B+|qA7eIRDei{6FCMoSj{&X#Z=zyw8uFL?`+K7-%{{P;zK_2}g*S@N8-u_afS!!*- zE6L?$jUD6#AKf z{>Wc8v83F7E>>bmLeuld1{VMtJnr2w=y19(Sj!|FTN!v=a!Hnf=ED>-MsTu$8L@Dp zda#Zltl3z*9R)zTcm*ryIPSr;3RigrJ^~H>ND7aFjoVY7e}=K9P=pD2{#l~w)ReT3 z7~%QyC{*l68M;r~gu^IT6HZ$3!5MURcRURqQM9(SPR|kK7lxvW3g~)9uW0q{SQ`}B zjO7qF`=v~u{gpjMZ$U+S?>=4)>=l7-y%;)vMA*JLW&5_c5%{f(?~2%{JGrAR7f!!x z&f8oX?Il!WvfIMgc@DeT-B=ODhAOcS05O%8#e+)iF|_vOov)R8ENW_gS7wHR;6E#C zn}(_ls+0p}UEBo&eZRWH5S11S+{s^>Un3b3DpjKz2P74P^%Jut-WIWu17tr?U?(=7 z{4!pLgD&ZavGqdiO`$LlF74)|M;<@&Lv(6V)GzqQlw=IW>&QJ=3#K!}UXiCrKTtQA z@w^X_$2_n);k^u?d&9>0Mj@==#Yx83JGwb4|MV_P$}qWvPrMDUO=Mvjb0@w>zbHsL z=^R`^f<-l~)H8x%^t1SZV#59O`0$-p{uC;l9rK6;&9yNB!M+Yj)TpyKKU3!Fmp zE6|wN_-S$ZMQ!P$hA6$ZuHt0`!t^qomMoMbTaL{Xv*==*fqum3 zS-qC1XOP^YNjmVVllOPSvyv~5;zHw3Uv=ie50z+KSXfEnMRHZaJFi>-1G*$4eMVp2 z0f$-I*L=Vw#{@bv#;p<@^7$K?w}+n9H5uZb5_$~Grtk_-C`tg5oUCWl5XWq?JYS!ZW!!RX1Yx`6=+$0U* zRtj930jC!g^a; z(WPU~-~RRb>%yr33=TxrR9Op-2=mu~8I1#q2Lx1IJV5_~3Czw*l~ftZJ?fW?PFWY0 zwek_k{`9`^`;rrjgxzRt-L->qU)ylaKp1FU$iWj7K(d&AsXDY>~{8)of(G&BN0RF!s&Hb!N{xm|?PUg1jPbPO6l zujM>kAt@!PpW9Ww2-BnVVW(pIq5xiEK4e$ELdvKZ~t zVOQfyaY>v(^GL9$3SHnn_f>g505nb{qW<{xSm)JT>q=-`;})E?IFc1N{vH^*xKz&m zBOUeK3A#S-q0V~O#uYpbH=1{&hlH&XLEOK7*$4yXibzzj_kCl{Vl7HX$3u@OOY}+I zk*FoAF@~W?fA<%APVIkJ)bNHN%RgA(HmWhf=DGU}*8E6|g|ERESQj$TAMX5@W<;z@ zxn;WvC+EO0W+e2;;^2$?j~JAXL`5dt$K##1M&%GWh6px=HI0%=?xfO1oXTKmM*&dC z(|;6ux|pR*k1!WNZibbH#b8~^WsgY)o@!d6BCy0r2E^4>%zE!nv#u(;zKy1#$g3oo zD_)MWVBa}dD1Z%=WCdruZCbw29wFVD>i5b+#r5TDz+4NCJ?rG&x33r(uQFamvtqA$ zd)hzj#<5IljXc?FF&4I=%d(eEC?7?|H+S)#lWcd@MgT*leF*#j)aSOq(&G2bF9dz3 zD)Uxt_;FYRuMe@D`c?V3fk+uJkH-pk4?j?Lt&va32Ybu7EUV}OSpYM?n`(m_RH-F{ zA0Zh;D>!rFrg`4n4z`LBko|BF?09cA!bG@fJXg0!Yt(SnDu#P>Y*fIbYu9ydYKr%= zzeCdc^10^PWVW+xB)a2&(e>TYY={59h*G;n?a`LlJ66rMv;?i9W@A;w-ii{dgQ`_A zW41(9?OL&8uUMh>rqq_2HSfpw_xqi5?>+baRehqikp}T}*Ue_+I zXh+8ayM9a+`?k(@>}j0YVn=CJP-RPdl?6Fh!Pkhn-!*BOoit+`e*TGjgt%T&J&kN) zfM$w#L&bdyr^nJ>2opFG&cyTT%G?Tq3WJ1E6E?@6x>?KChnWY;_W5$7O#|hrE$^8r zX4UBHe=|3jOQ@J4dO-p-T%&9Jf37`=K1i9+MK+S~rA}1-^ZLtSu(wF&U^$IyC_pKH z7LIpe(^>Ok*ZkWoZJF7Uk$Z{b$dxRdD|@yLvAPC*ljHgDE3Ofn;}O`wjOiLl@ymQN z#N=$HS{`-%UzJj`tu*ntE*YT*-JvYkKT&Hku!x zaPPchrI=>3eY_-2k=Us^=CxADcV{vy63ReZ^8DLq*M$qboi*E~r zll32~B1({D9^`EN2-TdEbc7JdliT%~Te5c!S}_Orh3rt~ChnLKs?+xShA>^hjOw#H zh?wBxxh~E+mSfDb?I{7d*QwUY#pKmE6Oiv9ESz5A= ze$;Ze0XDqgU$m#jBAKUjX*H^WcZ~&6`RV(m2%_BT;w0NpSELjh6*N>#`>SXU| zcF&a~7m(SC?aE5|CU)7b$ZYc~7Ky{Bge#`g|30VcpjLbnjMyluOi_AMRI4pZ4Ck40 zDQ%XHm}iJ+!&!G2$MNaTQsmzSL!Q(!ThhD8Y61XpU>71GO&<>iSUW@vjy+B0tulL8 zcEn@9H%znn0Itr%&lOMFhytVBF4oDT;=I+=|MAU(5F0^i^6ZxMy3)h|zk>)#+aiao zBzf8jCat>W+Qt*eO;_`FA|rga&ocu4@Y5s5moKR)Fq>+F+rGE3PALiw*3sqD79rIMRWQJxAh(kN zsqPjsDQUzAAfC=9d&i@rJ;#c`YYPItrp^UBJPxb!!JpB|ybS_tCGByEXffn=yq%Vx zAwC~z_Pf7?`=EsWKq;;LKGf_Po|RA=rdj(4|Fg!)Ex9)WKJY?ILGa|L3>}0lP8b>V z6XZRAgwGk;@#Q`EbbD~~jI1W83HHbL1vFX9-vB@V=Lip;l-I;BA;X|-CWyfDyH_oo zsrl5Zk|dxZ2PDf8ZU!U_u_u2Z<^EL|)j6IXCp>&BIS|3Z{0*?oVojFyBOZHI1H_UB z=;0|nX72i7mxukvu^=oSJ9G2Wi%-mUm&TpJmFOzJdt1?rflkAZ*0^PZ=SkuTOk_Qn zDE6fV<*}();%DeR>ehD*)ua}Q74EP)(c&Q_L4eCgf^qKf@*bD*$n7Fas2!+b_gP3U zLB4P+WGu(BJ!pXQoQu0-Q(1}eB@x$YCEso)j9cDmNeGs`7ko_Daf%V?=#|vU0HbUz zO&~9!Rv%GM^2>Q|JII~A3j&%y%$@#=VZbE&C}pBlpplWQ#LGA#jg*5*i4hs6=}#T& zHkrP@sFxG6rM7>nH}3))54Z^sJc>ErZ%k$KIJhEy$l-9KT?a>oFxwrX=|8XPUErrH zJ?2sDv492kbB+L}*r7=}x!eCvODT(Kyi!rN9fyw4YLZiJN8_wp@--~KLb1v~?&9nDnEDYdAKsnqxCz$ootx(*;*_mrmTP8X`BwMII@nEcfc${6xGn&cX+1A9Jy>s+ zor!4Tf7GFCcIz^F$>YWoHNI~R-Ya{d`D>2>ApbnavF5^NT2eW2cOxpny9vcA{hP+R&=p`Ab48ma8WQ zMRSdd{Arwbh|-X$lM=-gVWh||fOSw0{|`CYS;@b2*K{C3K$VwE(T;rCl%4Kl-a%qD zj@qU%v(kOY>${@4t1gW9ObDvocJN|B^}18%i0sD3^E(p%MneqP#>e0q03WlNaLjbv z=e{~Gj}Y>{rJ^$@7TF|OKHza@TZWJrF1~Ah=!RW^k0uBO0nTIFOw&!fG{v;Oai|&7 zsSk0(Yb1z?0O{>vc^Y}uwywzOa77e%j55T=ohQIE-STUjOztG-TXE$qK8Ff)+;PPL zOv&re%7GK$O3kdZgiBr;ah71KM!FJ)#eSny9Pm=Vg-+-3oHU%Vy>vdv2OJq zM51OKgYq*DuW%Oj)wBKwPosxMx*iqEHD`p`5YGC+3|UaeSmAkJ?4DAviF}jL;3#gk zi}M8wcR!s(Il)5*V}06&d#u5&K)kb({08hof^dNIP`colRG{Y_| zX}Qon=pN$r;%|kjJ~^XcVCJ*+YtmwKDWw;eDejx)>9S1}71f{?0l$BxRd})RlYID3 zIO)tHLNY%v=LY*}aTlkV^5l!$Fm0)r&Rljl-xx{Vz_Kg@}x5rE-ChOS^jZZnP~dGcr5ul3}8BhX*%++ z`77yIUFRwbc-lq&%9eNS8B~o>bfg9jyt6hvsMOu|rIskIL-rqyXJ4T}zPOmKgqaxs zL}QXlA9#%fnzi`iSVN0V%;6G-qRGji0XKXkSB**9uR!Ng9&GXFt2U|~F+fj|_E(go zdxhc-1&iF*EI+~;7j90=c@dYY0KqmrJ`TlyF0dak@c|H+*xs9YO{+WsFZtb@T%iqA zzYZ+K$WG=T>LnAgFFruYc-+h+Ua%a>19`OipnfdN14~8U;2!sl(>(%LJY;dmR^9xL zTeVq@xVSwBxtgDQu6_*((6-eE{FA0=EMF`1 z5Jl08U_<;QHp_E$fDE9rH7veSh3?D~$3(yZSER&NOG5smI8OJ4&8T9G)d>1Ce^<); zNS>l-@~I4Rg98(zwrG8RD=D!mbLMlZ0n5(UPT%e%9MgU}Txo4DS6JX-)vA#DvU?Vc zRkHqWwlLK0`h{bFiSWn&%@ z`u(hUs5||;4l=&_pX7CWp8OXVU(n{iBXFZ}dEF)qen6WJfXvw@%m_-PvBPNw>*d$A z_lj;M(m-G_ihMM(v-bJIH$ZK;`18xu?^x~i7Lme6)q*R=Ko0Y^M1vlF?l&uoZ(By& z-ojl&RT4MisUC=ERdNNVyQ0dYo*k!ulqSm5BiX|fc^4SUISZswRKq=T{mS9$ugK4K zpbgDhZGC>|>AcXJgN#|Q(0kxhvceD9w~qtKEf)jnjDH0)j|=v{3x=+?Cx26IKIh?I z5|(sYl`T1F$&-*<{Nyw|oR{Tc^Yf1Dc-VY5-haL^MNGy5R@=xNV&iUDpX_dlFIv{m z=S?M#{$f8?t=MRsP2xb1b@mT1ILd}~mD7t+L`jx=fcvXI?JaFwhcTAk-krHD_Z_u1 zGMwSQL{LbUl~RG~4k|%Zfm=+Vx+S}MAKwPPMxPK-pO?ZWEMEkC?g)LdB4;WM3NCz| z4haw7Phs8W9M4)st@huu%L+Wa2eF%J7@OUw)4J!*K9rdsQWN4PMYHhjE;If@HtcDH z(PJb|hnHUTG22xfIMaW0s6#LRD-Jx0PrM>vxlhj5VJQOpgZ5nzyLdUSCealTPt@RF zfq2S4;BqVr;~HQ?*oG+fi4?IqkUh-KW*?lx>3@I7164!! zlnaaHOQ=CcDs4v+AKp)my+*LBh2^s2*{-Mr-_r)%XVRfkl}_5g1{PM+XNP)eJN`UI zq9@pd!%a2JA;}Y}b`}mLZG^*{+t2Jugwc?^qC6bqL1O;W^gS(QDhRtR+!!^n3hrNH ziDYHCq6{V8c>LRXUJmBJU<`QknB~NHeM{We(KHrIp91Oyw_SO(Wj2n4VelI{*!=F= zQ-B%o*7N%9l$HV%e}pMqEkSM%bSiwXuHoCZW7$nZcYKPY}$uTYfBHjvYu-2Iw6;9Og&@wLIJeGkK5729T0VG(sg2U@}2+E-v+ zADC2rlu$#IOy9sB3(`)weGl}4d~a!S3RqcC*-nFBcMLhaGk}tHnCNJMwx<#ZJKUuv z#zx#%g-po_i#TY&p6qB&Ka&ny3yJ>8n)HW)^CNp&tLNA_IUQ`8YHZw`>zEWX0Vqc4 z(*XMTD)q`6ztUGnB9FE3K7P8tpFeyg?l+F3?J_T69yGw8!DXd=cHTxBDKjCN@<7$8 zrhEdkx_I-UVu)bVS+=r!70P_{cA7l{$MPk)ql zsd~b>iT+W`JxkDKYRF2UMM|Uj&C4b>3rtwZ+!CAdBlc>tS){k>?(N-=C}obL8lqVP zKZ@}Om5^ivEW1dYxyr3IfVGauPTlH{5B3*a)(F3NpB$F5!HwHwhn_E~tY`Z*s8ay9 zCb-Rgf!a!CUK}=dcqG-nN~S{kG#Nmi(J|+yhh0VAMSo^U-icWfr<$6O@oCMQ-#gP` zQG;xVI#8>qd5MTA1Hw({9eC!iabNbH*J-J)pT_Mhp;}WGqjJ6hS3v6FbNlqEQaK%#)h*#ha++)@1*-y(x*(ECVt0@VhuO_w*OHWp01pw! zja>Dr6{6X!kPR>;FTdM{6({1OM*<3P^*0@`JvbJ5S`uUn7hmX~R$CU-z>ayIeb`vJ zP}4D{OYnXOsW_lH``v4&bRXX$*;`@hJSVuu1aQfEaAM@N5sQ(FPbagqMj+AXRj@fe zq)I7*9ck{-mu*pF;|2=WkLM982!>ldfu%|hsq52y^OslG7mWMn6si%*5TXV){}^ex zqt@4}=PKGuz?_(iL$%W;G@;BOjn2u0%;QTeO1(IDv(4{caJS-9_P2l@dzDMrfob0J z3xn8N&5d0c<2jkU3H}Cx4{oFsI-P|rhaV=R<3qK9W$OZeqE{O~3269=oR4Z$=!c%d;RF@*UO zf9ixA@~|Bu4Oh!$2pu}^P4CO3235(GuX^Q`sI86Mp|Mt-53ssCCQcrjmX=e$N6Ad7 zN;U9|Vq0$A5kA*(XzSIkgw_Uu(QT=S7;mh4lak|@llN0wFbd9ehWC-fv# z2)M_gTwv>GWEMH1+dAjJaE*cnaIb$vM=-#AK~AQ zh{o@Rqh?ggCgU}w`30YU`CAyfk(02*4*Mz^XaD+Y`JE}Lh020A+gvs84#BQ|fv|(q zu;CwV;$YbCwaCgxoA_ApV$>utWce*+`FX~tQ~HQ+pW$(4Kv37`eO@k_^Lxc@myfRt z+1mEU?W55KA#NUtm^Zx2{A=}}1CF^^z-#7EDy>O%eCha6EjmNUBRB#YJMu1{>l@Xb zb+cDDJHB?zaUWkBCuUx=;7;biuo|zBkA<017@w$ernKW4KTC5Kvm6<4td8jV;+hguzXw&szr4n=F4H$`qs+y!^{|@68JeWEDvw zyl^w^*W_J_OZkrG(%G<{IaZp+1@&(Y{5_J^rax8Bz6VuK8C9D*R(gmpL?$7N#hy1HG!u668DNfaB(5sLv=;6`PG2ro{~)MKtcYO? zv8-4o>=OLYDuaKt*v8lj3Q??$k=hFF4GHKgM29^EmAqyFidQk*mNxQhpAOqy!^~fy z=OG6n#eU914}grVG~^E{unrfrm&lh`n|OzqhY;{Xm{VJDl-Q>zPp9sCU4B8QTr4*c z@7BA5Q*de=;}dh`LKO2kZEkI6sFR0Gog@6-7tzuj6b;Ge3es7I0wbTCs<3{4Y{D(a zUS93>=I21K{f;~P;3Iq?5%OC?g)^d9ApZq5>&K-GUKf%4I&}Nr1E`q}{_F!_cNgg5 zb^7gN;IMY8pg+IqgbS|=fHI2D9%3%UF~#nOrwNRW*z9dX-YpS_--xM=hd{prK-Ye1 zJ)QSlz(t}C#!#odowE znJM&G(r~agsgg}|HPN+%`>UTO5tD&HA(2aazy9PWs_QF4>Dntx$Y&$GHh8K3zQC}I z1&7*&>VjR6!agn|6z^7}BjKjvw*me!!N`js>XvN{`UEFLd zmlt!sL1Ne0TP=C9mAMLJr-=jw8{s4UMnl8!pg+``&hP9c1qo z70d>1+_~M!drqNbFmM1TyCCgot8BcA!eE&iEOkaHE-H7;^c4n=>?NWhp#kpXga(@L zc0c(JtbT<5^DwN<-*ual@vz=$MkWa-1eTOG$nSardb$1Hm`;g}ThrJOItsES<+NYm z*F;97@Xn^1J;d{Iu81Qzo7Re=sU_ZUg3i_C3tyf=<~0wHd}-~v39k}?2CJV=Rib7*~TK-$^~Cl4Wk-?HLby` zd*Qm8+>-}wN;cP3&}qU=5UJ-(cJBoe93oe@RBp;k!n2+>Gm{))=#S6nS#{ z0=W+<7jc*xK6d_9jiu^y7q0}Y){w5PoZXjX{!0ZxbXd#fM%$+|praauz}j5|nM2^+ zDO*lh=;~*Gb-ePiyPY_KZ!KSHm707dafJPkE&P1x$N=mTa)e;&jK1(QAwFWXXmJt7Y(Ck-@AN z3rzY=>Pd0vkt&(` z1aU$KRRm=%(5EPS2)<3@{T;v9RkBS+uH&_nMTbGc?JI||B)?t!&S@4Fp#eD(sAwYJ-VBOTF96K$dXO}tVKR&9OCH^wt$mvYK$;Dc-1Ts+ zR6gTF?RgW(X&-L3IRF3~k+{u_-L>f$^4nsJtLY!f<+xnot=ShEgg*;88-v+1OeT!S zB`9U5emOrn=bKh(Fd%{X4t#U~w@vL3Ru{7M(?TENN;i$aeydhJF%EEo02_QO(0wK} zK#!%vMBNVxwwv}7(Tv89gkQ@K6Zcq3NESI(Q7K;-pfB4=e|YXS?=QHgXT~qjPFBQP z{*u*n04y%);J56ZIg1(Xg=5O58F$_sh79Q8KZ*MsE% z79KNrJ&WvEQQD(7V~pvz3C5L&i&GA?@cGFIhu_)tev7_GxE8LVbL_(VBlK#+ug?EX zJkm;448D(t9Y^&YjZojpBr{6fFM-`#2wM+;4$GA(>n^p-Kl;~~7wYB-G0e%&a6DkG zmwTR&qQr9iK;L(Lm9IsEajJSuPj-kBI5H_2vZn$T$d-Aa=N_o8n$V10=HfJzZ6mUr zkiW&uI}_1#{DR0lbSdpl;r#RIJEuQ@=yjPI7mwU}HLp+ZmLy*9)mNk8hZSh2&?RtD zWWk2$r{0&eSTBlS5vV}Ed~TI;Z{6)ohN1-E@kwx-Mpj^id5_ZZpw(+cQCBwn5LUb? z?)USb({BDs`ELHUIc_r@R#`GXS^q|*IT!FcVLT1`c+%8au6EclmX#hsW$R`KSN2*p zkI^+0*L^aZ1E3=}L{B}t*rS>_l&xoK)-xVii%&W|<-VM@^hNLagePZYb}v}-QK8>u zgJyw4N@L7YL{C&xfzA@R2U9a$&w0CX>V`KKuI~~1k}#)EnBH>L&t?TMyWTC$6E4f6 zzm%mg@JDX@VYyc2E+q$tx7TE#z6tjlO*kz1 ztK=fK`Wf7dDpN-%lOEu+k?;a2Oe+X%g$`276;dS3(nKDQac){+eIN|kgl1=={@OI^(X-C7MSZD7bI|%V1|0mh)t=Yi>+1L$~{XNcgV~&>uulD&m60GEH?l z>+7Xz|oUg&w1i_puh9jk9t@e`v5taGQohY(c9L9C>r3s zG1q_9z^md=2SlSC0s2#)zxxAzCA2;rVD|0)tvZ@N_^ye}Ey4#!Ia?2s>1t=b z0Ly_T)*D>Sx!e{%mQ?5s9|992JJ6Xeg5k(|nU&W0u7eMxpjRTK>5of@hiwe;nVBwU zZcJ=`4nkJ>f;5vWx6$iTOz+!M+$JA1c0nb#kC1=Xz?)$WXO^vMY-bK867mV8sO7S1^et(z}eoKYr!@ss&ORhkyxg>nndwTt_6h3xDU%8Iw|qvCr@ znR1K!CF4ieOX&dQofwahxTT)y;Gs4ht|uhAX@E&N+Lk2!5nC7fn%5<+u4D1IS6+Zw z{g_8WO@~-l;%nv+sY-5UACWE9$~NfG{#D{c!kG@?9-Ua)8^7&T)%h?d#)uz4cc2H) zx$`Iqx6TqXsJKfCXP5ob*y~>NjvWk8d|aoE3Cfk6#oP-J$#>u_g@r!y`9I&An$Q}& zGjG|GzeZ(UFIG`$4cC*?s%^&2wv6?2h^)PVDz}c6GiK_`>HU@t{5bO1=GAjszlML* z>N0zxjk0Jl{_WR(cctC=*J}JGjonwbYOub$u?F5Y0J42_M)gX3KL4%J4$X17DcjDS z^BV_%7GYAA`A}J-znWg5wqT(Z171wcBavI(572mY{)l2AwCpnZ`-U(yZRsMZP_CSN zSD=)y@dn{3f_T1eNjV>Af9ziw@%}&C7&+ZfXQ{%c%m0{6icJD%o6pEfZ%*N0F8kWVBr*RQI&e*d$vOO0OW#8S3UtV#o1N>?Pm)se-2+ zztDZ46#;NElcY&mBD8txDbD!T{GklW`5EZnU>Pl;YzmI+i0EF8S4f6Seuw_YBW3<0 zLzVy1lIO8D!7KyjB_QN z>WTDQ#>nSyWSfnDxjMlAY5pMxKcU*>a{%(}{O(pcWCs#bCR(wri5Q>k-_T%O4@8Z# z^C|fShy}1r;hhn8fC4Nlw!3S0paIOf3DVW*0&s)iS`mwDpRs^f7P=T&9Jdb`NAb?Y z9(}8daeBgTdld2eBump@AHVRrT?(2i)^BNuN9kQMAZZgv#Ee}d1>|zkMImZSgTIh5 zxWpG0cw3JF5IBQ3Utmun7rh6jN!mxE4cJ*)6YcK+$A%IeaZYGJi@it|C*T_0w|N)R zo1LV%*qW!|zV_D1eaXw^&o?4hn7in#c_=Xk{hJnh1Bzk9oHAeoH}y5G=Rq0lL;Ijoa&ZyzSODLRC)9j=E<_eq8{RZV%!{^ zlw{Xr=HGvZ4A30k*mG5?Uu2wLRG3V$x5nSdZ%LWp|Er|oJFlO7$-f3sx>yN)7B2jk zrt~o`1;)3gJ}&}2YJ0XWb=I4s{p~jYnvRms8YL_fVnb#{KolZ@zIJlo=Jfb18H?2w z;p$9XVCq+^ycLi;CfXmshOxi{*U!TR(|Y>1`coj|)QLg)5pqBFKdF6%&=Xqu2l~md zTP2`NTA3yYxZ!E^XTNL`ppLj@1usdRAi==5{$cP_7g!rfgy4#D?N15L0G?S;7jkAyoc3=w9XGeDEa)RwSA0axvfXy`3n!xbV29+S zjcp%N6;Y1}XUo;;#sRj$iY0=;%6W)gNF35NAu@5SlmB1zAeuE)!&C0P&Tlu9vP}9g z4-;#^?qrt_WN`I=mq2nQdAoWvp#ndgK5Mi-bG?xMu;oBV{^N9(E9Ll8b*0;1%yQ-M zSDi#34&bY2>>{4jEuLT$i9q0AztLePbNW^%_D*VDlg8^opAwK%Po94Us)+%6*iF|J z`c8%Uj#u{9mrayY6NC0v_N9o&Yj?WXu*@`?X0kDZghVeSS{b*g0jZn7Rbc}l!%O#~ z*0YUXfJGzNBR%hMpyIkNf;ANQyywOSgNbTo>z;a}65SX`LLubH!;tphQYLR*F zJYE_L>8)TFX7Nk5V;t@_qM56#AxMXAKqNm$sd+*+L2p1cwgChb*0l~D%*AF zb7BXkt3A1NrK$Irwvay)Ep0?K=#Q%k^c=Q9=n-tcrEHrE+zC5Np{=`yKRInKheig< z{qWUse$FF}*m$518n&R8TZL`3CR$&#MF^d3%DXX^8rg3oy}TYY=R4nF^8^;}E30HY z^5{N4LI9J4I{%*fTs%T3hm|@i`i78}s1f;3pjZ1o%nClBoeIhlHD%-WrzV*dV%Qz0 zid`_hWtk==!7adI)<_OrkFa}o#^BeFYZM(BP9$*V%(rH3cq|)eRJBa91h#~ZEyLQ8-dvms5p13dG_zed*^Sc=!6PlmEJ0OF6v3~b(MG}mBDi(OK@dSa(+~G~kvnC;jD)vTzKwlq%EE7nq`S&H1Pc5Lv7nAU z^Dxfc(4cH0`MIix`Jt-oSpZI9aklHZU2I((UVwdK}o0)#!eYr*_bW=RD1C;v50nj?~breU27F zMWDAmf_ppv%@N6|&x02%{aNLu);A+MIcO3p;Ke^^LgL+<3&leNJoJi)t%)vU{68*D zD2se5Sel_d3v=p?`t+q&F4XndEJMZb_MZ*pw}OpK`e+`SI3XPH=7RYQ#TCAZC{C6- z@q~RAcQl$RgeSz-9o5^pSYNO^juz$>&4?^Zr8ANCRek4vvycY2sWK0Pt`dnaPttH% zy-7fse|CBSXJH16lWZ)xVN6TBY)m&&?TLU6+BKbQB&v5&t*C(Vv>LP$5z_gDz}1 z5^&4!mi*()iCqLt%Ik(oTbDg;H?Df|=s%}YsOhf2#=B5%US-mBz3{zz@ogen<`>8* z*bQ#_K*Mh_*YYVMSq$Z66;!6ircNf0Fjk1ek6Cwfv^TYNZUawhExo1%PfDmwaEz!v z3yX9VHCkD%giTN+wTg(C;7Gf4g}nNHL!|-d;^&!ALn(-t4)c_M1)3Y&7nv7rPR-&7 z-?3B0KzxkZMisklMpO;Y1zpc-mrGd3X1Gk6;>L7FfN1$dJN-l)g5Hl=UNL=K(~L!) z^tcPB(rK5yLgFth#n>idEN+!Ub{wWv84v-h>*Vo=B$L!>Drn*NugH)r@-!(q|NTyY z%Xh>m=vzykf$Fs&qLU>`-`7xh&<8r>Z=|xqnsAHI)2Cs?Sxd-7<6-x1+>>2qA4!7P##!(tE7X#RdtRYd@ewKr!?BWt4c9x`IKJVUMpjY&yso-= z_y^8Xqh{D$Eg%TyM5?mqW6Yr~&G012$;4w&=EdUW?O$EOAmj0)9xb`-J6-YbehH%T z)3Z6ZvjhZDDB-5-z+cibV`qUIy)b*8spt;|o&xn5w}~ayggut-|3%PAyx$ zo)F~H&a0ea^xiD)75px-!$*L|ZwA~CX3RzZArh(qF788~(r>^!=4vJ5RZo6>I{TCB zqOdbpjxYM}$tZ7?v<$^hvz59SESa_>Ysver){O7;IJZY9-R|%d&)31whIdW$L8+`Z(OS6g^vZ zsSGt{S~rt;OIIDe_1Y$Y3U+tl1yr%E%$B#|Q^8yy&syZB38%{z{eerkMnEjmTb(1# z5+9E(!5SkUKbqQG6&GK70+g-q(QaT)ZsDwQDNgXgC;vv$AY=jPDN1uGqv8P;5mrh;ygi{S%gI=QYLlctx?3>Fl zQm}8VUUFQT*GtLWjm~D{2)SI7^Is_@dhudaCDBfUSw~I*}4v zopCXz!BXqs7LZba$zdnVcf9=G>xzvX>X-E!TvPCvrN>%(L<_HDc1WS_KPE9Zj?&VF z^Gi^P^wDPY$q7o6IE&aoHQsZou{B`AoRrWFuGjmPd4g%j#dOIovLh(1>R_ArIHVCs z?8^nI??B3gMa@ZnvrSl)Y&rAGqX1+QF~CZeab;W~7LzH@TdKDK8eyg!Bcm9eGj~WG z?_mRbYd#gPxjh_YbGeUES`C3I&bHI6xRlM@434>!fy9r1Olavg>t&5Er?L4+v7Sy% zup=;0yJZbuTK;kBMg#<8i0Z+KzM9e-jQ7qHM@NDTv>emu7@bJ~K8$I3Q@1?_x)IL<9uvoiqVE+!`GK{1=Q#{JrEizB?(JmE+1H~Lcs;Pm{} z{pgtLwV2EW12Ds-N)KL_%})P7YQ zE*qfynqTX4dcC1$y+FWxxfVYoZ3)#G?O7*|?1P6xI3Wz!%Cd$-2_8;Pvg zNV#EpoeyZz6Qq)$K)pk;at93e}T9V~QyQaDMRN*I!;v;uF z@8N!jzR2$eXRxN=C~Dp0Up9L^EfHK(MKUFO-&O(ry79Cv9CXgRMQ?!PU!1Jx1{xpH z_3h;zJV06yXxUWwsB`Dv>5cLeqJi*zOX!QPu`k}8j|R&Tdew_gAN{ozWF{+bsXS3- zsQl2{JH)*6m6LYb0p9dG#ys{kbNjRRTP2?5Dh$bN1*SCi?!o+nBL< zTe9j$;hW^j)(N?}{Q$GMaua*`a<2P0VdEMQ5z)GbWQ7^sU%89&FP5hNT)Bl&>$?mh3OWwOVzhbZBWwYCb z2Xw`6~Xp=6*cj!W@P0K zwg!H9m6YimMgCaFfX+%1qNrl5oA>f>rFu5_Kdeuw#&1hR2xSdH*=vWfo)h?sH=cI%7`2;U?3Z3 ze^bBI=D=NUP)$F)B^wiSj6a?t9HXOTF@^VQ#3K&Xt!%m!aFi8s6(Wt#oPnEza=>x$ znx&y4U`0D%9-Jh91cI&llJ4GWl-QnG)EZ@}J$Hs%Ce-OcGZs_#<~`}&^=*bv6aEpd zuVoPoD@uNE#ODo~(_7A7rlQXE7um`mp=x#wTiy*XVj^?_ss&x3`vdf%gaZ|9Xlt$I z;uk?aCAVk9S7_JdEQr1sKgu;`JHdWi+Gw`3^`;mJ7g?B=f|&7un4kSaT_yPHYuMyG zja9+fwN?r0W}25!Ud|}?ME;P-P`eOa-l8mFAJd9FRd+hE@4p`4MQ;8(W8$*d71)hK zyMA!u;2!%!1!Frvm<*Odbx48wm5YoxOX5Ppfn4b@*IE94V9G=z=KV?*Ts9Y#A(+p} zC2-6sQHSaaJ9Nj-#kRs-R2(GP+bjm^3QZ)-h@zbEM%VDU%DDuY?EC{KSS>|;msm=HC z3FQK)!$$kewiWG`f0z0;|FFl&6n% z>~Cwi{N$AG3I{A-0NZb-KgNq}5lnpltbRl)hAw&J{FS(P7)@kBTIJSH^(d+9vS&Ec zIg-jzTsK-pN7B4I;KSDJ&?sl9w$1U-HRg9hzJ1jp)x4tYlXblvGR6XWXOVB6TNVlT zn$QK5w!!V3vndk=m}`?m-T%V{(EQibVq6Y`*}PFYQIfm~jHHBGaIxD%K52| zq-d?ZoT5bKJ3eco`>+4_`EmKZB`LY>KU-gFAyTw$c|~*-fh>z>#aLgYl-_nf zcI?^`{u;NC%yQ;`Hi+Tlq@Bhe?kytU(WJW3YRrHgWIhl`a#f%hu-gZ#L}!}Y z5JNBHD{OU4Ro{s}Pp{?TNwSCITZ@&l7R612?1vzSGpSQ@QiryY?TzBjbkSSR0(&Zz zUN>iAboazaMC{-^9!=dN$Bc)r81Wn`S9_^j=i=G3o}bRE+w68uTp5#Vm8f>g_S?=? z!WX{YIH%AM-PUD&t~7xY>uhfbC%z>1A>(QeSL4YZ?>m;rXKy5fM`NlvJ>CpGVjt{R zhYY=XR3|Rp=y%8J>x#qEy}#8HV|&~l>NUChfU+m^>9UShzrL^|L%bYN5J*0FZ{uq; zZMR>F;xt*{1OEU@1$u_}=sSLe1L4>ofG6vRw1n>u0XH3;8*#A?vPx4+ZU>3FI+_1X zxs;B)sxPAchy0d1>}FYU>f@K-T={npsj>f5<*j-)2{4RRb8$uaH-l5tRVu*8=jBIJ zQz=c%t;yZ|^brv{!!$bV6F4U~vz?!RwRV4f90=w(b-L$(Tz`m{#Yo`kkA-HcLsZ~K z3DEB)nOgwUY4fu`l^jFatIJap2gM-@=pX~&HBO(ssHs49+=shJo|2oeeXR+MN_g_4 z(ZcReX3az92q6ve9_H~y?54lh-}A1hzY19Y+?{^iy9FZTU2Mhv$vHY)hUoU%WeB$()Sr>Pj)cX1j$~Q9)@g&eK-XfkWu3Unjk3kz9l8H=VacH_X zYHaWI;{l&Gbnq7ot@Az$_DBP#v%7G!6agGryzInDVEsGRu zZJG#JFcSjM8gR?nDNUZ(!oD_f@0OvT{B`+U!OxXH!;B#_J`P5Yk5X9K!6sajS}r0z zGEh+}*omRWvEA=mW8fL2aJl`+uUk8bbVN@@rZrwDrJi8Mw{NHo>t^?>U`sz2b(!$4 zE0X~dWe$1SHtcM>?d|@~51p!U6&BmmFG6sao*=GY4FVVSW35@gbHJIsV84-nq>=T; z3|F6mf47kMl&BS~EZ`vb#v;qCt$Nu86V%h>k$WaXSZKDb$u=M=AfZx6@p#NkfwD7! z>$|xgn~9;b5uLYzeGLv3s3vijQF-3`5JcNbH zZzgw53r1;moM1>Fm5i&<26J78ullWjw7ZMZ!modDj3xCUk?o9b@5b1lAONg9a>^-_ zD%~zy^Z<>BD5O1FeC!f|a1*&`e6i5765mFD3iPpbc*UlO$2kX7D{fv4995!;k$+FX z1xv(XPBPfl;G z|1-mr*DOVXK-#2`!(Ptdyk5j zC0m|_+YEwC(V5%~j`&Gxw@1`u$5#7#*I2pyDe7Tx{-cMg41#t!uo|i59vS{zqYun9 zu#DF5KhgVSRY++XmCddr>Yu0Ft;ejC7R`G>tE`6KFC7qF|14n)s|cmm<;oA%rh)q% z;l}J;l@ViKt$RX>!mel>%nLJH1bk}h#0_YxyCo&&f3>^L?Gy@ji~%;lCsN z6FhoU6*g(^vvG@SdXbMjCM4viOK0@vG^%uuxY&!EEaJ5v%SfFezn)wUlf1Yb)Z2BA zywkdcyibN~)FIm^(VpIHa+zVtq#MiKBOZ_xu{eJx6Z-YW_))b_uRuCt?`DmXvGXzH zZkwGNomTiKO<2x*P_l)IW*-Z%gKJkvt zPhxxEF)AW*WrEAu&T?;Ktq<(U1!kmXnHG4Q4?Y_#V64W2M;&BJiPB|6W+jMF@O5E<`x)IV&z9u|?M7fEUJ1mmg;WeI zpx#RKV(U?^-Kb8nB{!|W-A(Xx=MevkH(k&{WqiGOXRI}e33f-zet1`R*9K4F1zi{| zJa_Z^4QBR;!`HpYvM8Qlf|oKsw74dp9ET&2Sv>9&uI3-q7PjARW7c$ux$?^D8&^SF zDw2z6sT70!Wy-13rtcRQ1<}5O@nahw-RiICSVhtq*PmD2oAQ$iLUpU>41=EDP4{Hx z>8ZEa+4lTbT91+~m0gfb2IAF+Gx03M8SGb-P@e@j->U4^!`#V#_W;Knb*A{K9oPTY zGQ&4S(dex@^cc@4@3!vzV2fmn8me*<9u6oyIQbOavw-qvSnlfgtXYw1MjiTqXg@YT zf_@tIUc5UErA=N4`PiFF3_m-WM84-k%h4d`_=*0RJK4y+m5FFLlRZhp1m5o8_uk1( zhcCc7l9xpN0TPq3h#X@HbV$Rmcu!WV#HlTId^QU_Fc|YN_W0<~#um5#p!rZpHXc#n z6=H2gBddd}Mt?^7U1R(hs@_!mzcv}L>U2oA^d`1uqWm-zSw8oOlq~XbZ^>k*E(^p@ zuuWQt4+R}r2iOaFF#x$}UZBlKN_i}=4}Tn?+82To+bYnw-2bhc=l|=t`#+8HXg_`u zlO3&EipC+wfvH+?a=cfD!L-56Vh*_d5vqgWZV9M+-KsQA@Y6ZIzNG-&95~!iswXpK z6nmGNPhBbUVYb22v5IDSJ0gT)LdtOZRm+L{%aiHZ>w1;{R&4erh9L*%g%2N%bGYd9 z;owH-Txb8ez|pFxKJ63`wn;Aw8~j9pBz&QGTZXfAZXMBTgpD4d zC;6J0uBGGZHT>Z}{!)TDAK!cvtI2ABy!nOFY)@)GS)Syt(@WFtV?+{&mFkH84lcMr zU)ht+bEGzPh8mP&ShB47a%9dd{U;!7%)jbM`Ky3*@1CZ-MvLPAM!iw9^ikcE7)5}< zlzLu%#oCmxR*V6426PBy|UQ1c|d4V2*M^EXr6b3Y($}*iD|JEJr zT~&++Pv@dZWPkQpGvl@`Ca|VKtJ$Yi_jVv=qP%&^A8#QQ!hN`gEl#kI1tCG*bt+ne zY(>-lyGyX59~MS%Dv3ZF380Pz5c(cuTJ6SCE80=}eRHyf=~|2}Vd=3sZkG^rH!p2H zY~fw@>i}&(x#{kqlz=D(9~!ndX+tYK(3wORu+?}u$s>_m?upbA^fnbn1!}`VxH-|3 zeHkAJ^ydD_I({q#^20kle^?53cM+@mt@!nZ=RV5P*93&y-h_;V&^v?kp~qG$+J<`9 zqrPaZ{wZ)z1++}1rPN5V)?mgk$&I%6>ltBuONC{JKLFGdAKJAmWvw426Kohv2pKEy zzd`~mz<3at`G5Jn34n^m(yQtBKN$vgWGwuHCRD>u63CWhpHh>ROpQ2A=<{gkQ3-uZ zpq~zQ*I4D5T{(R^%diVJQz4o#(I!I6?-sMo= zCLyVzT?~kxOEm45D6gF)R|f_-%q`K%C>`4&GSo4v@1e%*WtJu@#OaM1^)2M|tFmaf zVW;cEF-{^xqmh#KSVljo3D+?<-~YubjNK-ly3sg3UE$^XonGa3Flwww>_dEz&sGsh zJ1BFmomhFU@ePYj*%;jjK80R=|OQ<<)ODa_4vibOn#XV(l!Cb-ff`A** z@ET)kE=%yzF3Kgb|2cp-C^?Qydrz#yMHM%GSI!ynfRIbx)?lsrs}v? zNSi%m^I7Pd3Z(o5;AZoe2N~7C=ll+hR>`jU;pDPn=Kf6f%AZHp;DJ{}F`|4eZ*qso z{->P94#(yg69gY5kLAO1Xg)1OpXP?`ART+FV%ZD=t&z-#?3EI?qaM%ip zn;c#7n-iQOKQV2)Ub0?J?a&DtsikY`?Yzrcb|gx}j;|-~#JXPVeY6Q-ggPEg+pw3> zt9`(f+wrrjdFsvSS_h#ws~Hpto&9RJ%1gLHMsQISFC0?<2(FBl(@eMhSdJsjZ+DU! zlm2XyS>#2F>8A#?X|5vu=$ztr$2mpz$vGN74=uOBSx&N*EZ$Zu2y8a9rP*+i2J~!G zI2z@r+Ts?);1#VdhH=x>dfU~qfWeK)dmg5AUc_Bs@GtAX@B$^IxnXiW9mC689ENIG z*>hN7IoAK8akBqQWd2`K%xU2-;R&-uoDEEHRsVtABk;9-#P-$PGTekI-FH%3JXdzzRYz&bO_JACP!`>kDPt2|M(8s(GR7anEUZ!lJyed30L?ujGL z3ifT&{Q#?!>I4@Vu-FM~96S+sdF3CWXo?4Rr(s-7O~v3|`wLZjLb_8o0 zxVlsvJAuDmNGa6c%5GSyHHD?>C`w?O-AI%IbE$DC^E|mJU8y7LWvy7W1p%yT4!t`@ zy`r>z<=eq+7D)T)69GsJ$48)qC74lpqG0TN`0%dQs>Z{g%jCI*IB*gAPeJv>P2}!8 zzMc?RmUFyLor>nmOq`?>oBh2Cqzvb^lWi9RlJUR1QYlJ&(GgAzzINX9rFXq*v#1F! z*H16%PZ^s0_Pc{<;$xkoO2}|reF;qKt7e4`>LD@&LJG_)Q zVRM+!kXGFG>gPMpp_I6|9)mq1qvT~4qg~&7WoY9%03Nsg9V38X!H1Cw5BhW2i(G_; zS8qd6w2w6~C}w?q$V@sI6jIY|65i?+RU4JqGQ@WF+IlP?5Q~>_h%v@@Xj5msZQ!xO z^<#>gw{Y!d!UXL60(9-a_L@R=#q;huzU*x;sSF-lJ+|$C%MA zs>C>m+jA4J8I$KW66pCgh5NyreTgw=u-j2N24yYSKJ?kLo#_-qPwD37EHyFRtu*8~ z9pTVkoG|wxB}9UUQ1$y_7RQo#_jQZ=EdViide?v6Q8E&jNF5uM_a}YyiwCoU&2VSF=03zsQ)!P@tK-% z>+Pyxj6ITNKj2bx*c6!k?6xX#ZlS9pupy~7mL^rJYa&%S<~s0*-tJe)TbeiE0&Vf5Fg^}^(Us@9K`~X_>cRTS{-z-dvzYom2QAbM+ zDT11Bm?%I%@b!^i^)Qyi}-DR+fwp> z`Y`f227mkKjwidndX+Y)VDuYfe(7rZu&%GPZKY<0=5L!)gW}Q5ly!a~rct^K#GTp_ zRralOB-9~q+H`m1;rnfIDM{S+!oam}O@LH25&ydfet4LO`5LE@CnZ|nif6o0F!y)N6X|k|W`i>$y~vr_Ar%O7HzpG3!YkXBG+u9A_gaH;DUk2X zsSp)ccEu6?R6lESq;w=DhvU(yGpFEY{MgPP4KiwW_aKu_@Leb=*2qA}Hq5kkMi!q9 z&qz(Qa5SB6E_xZ{9!oUmq2S(Gd&+0RjH+0y`3Q{rnY&g#QQAC9@0YH^oeaDFD+eo5 zvLJre6rFDW!F}^~n=gXSj#d4clMj}1X!gHW)ih-`AJ$~;*<_g=Nb1Gp58(6Dj`1+s zrHXR)Rp;c2oDxbTrfdcpm%_EgW{j9gi9Wmpf&Z#CFyGz_3DM4g|$ z>xE}xneW$IlN`C*ho=iq#S2q(Dh28IKMZO%@9TI*d%yr74Q|>C9P)4BZ8shd&$%Raw$v+7$3rnVg()VfN}CV2@bF9a|LmlaN6VV z42wpJ_NjP-c=cRu6|-e@ zN#vz&GWbK`;j-yVbm}@yWnS< zzklSd_{)X4dg5;uk@mjvpciFU{h8!SHT~B&&%r2<{?CERnv0|Yz73$xGFmgELCvpO zFwB($$OzMiL+K6utAC$Q@;h3W2J&^9YO5zwNK|%cS5!H_UbZiQ&0pRb9!_B6Gt))a z|CD$wZyK76ZDO>ON)k_R^Aso;_D61hSCn4|kjY}6MH_^ax21a*HLO2V;5^g0%TO57 zEyx^}UWSd!FYhKpE#&;ufZ$5>FsG)1(2yP1`WLAJr%7CA_l4l#0CQNh!D*0X^yDXs z>9o8K+xc#Oc{=fj3mP4K3&l@eBimV2+g8kB&xT9<*@c)=-aYXs!zFvN=LtrA#BR!i z#-Jz^#AQWo*p5RO;!TD1j3yLa&SakPu`!2fCfF4J-n25_{mLHphh(3@s$5y|24L=i zZ{Z&;Sakg4Ylyq<%}3iZ5Pz7fcl7x~JxaR&tV!VW2Qe&-r@cE$<|4+qf1(A~s1;H} zk-;un{f2CYJ= z-B|fa{bGg+wGl=!&N)~^br2?y|6xsbP9jI!M%Go+!VGZc>3oN?F~4%XI6Kd4j;cRp z+o+&fu;hNukj?aT3{Ow0DdA^np|5I@Lp?Av2wdHnw#&2@q%|ZPZSpUUrRM@0$gwa_ zJ6xUVgd*E|5{Qd5v_Z*rj%H8e&ft(*(Y;V;CTX#{%Pp{2U|n0Zc{&&OiWx_W#bwOr z^)R#mChjAaw*}o6smCp7-Z=69%Y_Bwo+z}=VhxV61FuiI8d;cygZZiAgMILJC`Q{2 zjq<*CQtq4Cd0wQ~I7u4rEhL+y^FN6)8nLr~fvsxjF)@+t&VvAbeIK`#@Te+%df>SLJ!E ze!UFfJMCIo6>vGd)?+-vB*Cz0zN2qA^b&?T(pAT_ksKb^%!Wd~06aYrc9}BC#=yFR zZpPIBuE-?auLu6+A>!8Aip&@!`D}L%`E36{P{$bJeX)YTh2!8x(BbDJ{N%Q6^(Nq?HIbT>sdx;4Pn*Y{yd*>WUzf^dlS#G38vm;)%IVWsy+>eW3XfTm3}m5W56g%RA^+KTwM6B82?_vL8b$=TV6fIp73H~mJ|mbemNzWQb1!SeC`=H?%z z)p40CLSx*~Y2yuOxo0(9h$I!pz$yM2V9tM5(zc#0w+8i8(I@_$i!r#o@*qHN4qnE< z%Wt~d?jDD)y(_8X8C9xgA60S9Yzs0hsT0jpUnJJC=SSoGAWm_*&E;`w}!&6oQxO90ycM^H!Kft0i%Bfx&dqH(=ljC!%PZpO} zISNh!NI$ISa{>nD59l~r@0Lp^J z?Ui6pQecw$&ilmY`3?WPo@u=MZEI_rx@6eWrd2Gl)nv@*zIi3{El`LjfUm&|^n0Ie|Iq@S=BD0*vz`C&zogecXY8wmPBjCp3wyvy0#~&}+h}{yT88>_lb4qY3ERr|y! zE}jt=I*x;nht&u0w#Lcm(F(A}?oAzJ?B>FH*?z1%kY38&GO(yIzGhL#*5i9AEV>PJ@BL3KwVW)PU9yw~Lr?Jm4dFH-{SNz4*$Pv8frYW53g>{~q*s{@3f z6bJWnyNko^J`|xT3!QSxr4DgIbzJaAX4l%bg{Rg2BdabGW^tF9)^8RCGEou`m2G%j zDlCYFuZ(*d9a_jgjqPRGQ1F^`6elSR7~m!SwJJ0D#hr25)|YwHrn}9Sh6-~fAPb`T z$`~rJ^5Eh`R6q{=$cX0EUwpyvLiIyUv12tFe^pF*Fx6RnQB~kdZ_@(Eiq^G-pql_< zd+FM2)sidxoDUWY48uo-NZMP_2C5DFFYK3KC zP!By3&K;MbzG&=AK$pplUy{1DZllbn;dr=1Wy|i9mjA}**6;+{vS^ZUe#w}??85z= z9k190W96Zzp4fU_-;+t#hoktEuwj1jQa-Jpq9U&O_4*5mg6B8AaYt1z0ik>AlB7IzEzD-7YK6_-hf-7{5JxAO zpCl3-<6=~*_vU7r#(wT7qZDR_&SQ7P<01d0oXxcb-y z2eV*~+P!}V@@R*UkoAdDts`8 zR4S|to~5;?`(}L^Yotz}$8GRmPDAwbj^&y-mPf)_gBHYxJiA#{gSb(PLYy}N0T1KC zsGF2t3L_IivX*{h+}zEZ##<^782Z!LYF`~#XOO_LL8#O(BMKwW zkr4aSYx3|od;yqtq-1{aH##2GNBr|rn`+IGDPkqPvvuX=xDXA2hsi&vVFS6BuAyQJcgZc%Agn;B$@Ap{#{Xjgu*(vgo1r4oKb6~W4@<%}bN1Qp+5 z6iB{N!h}r{VYA=T{0dKYaz-WC+kak90$dRS(;d{2!t;`!-mI5bC)?BUf#O7S3!uC@ zc|-+YQ4o^%Dh3Je4J zk)D8x^n?~VFMj`f|10Zdt*kq_cXIFCnRCwU+55~ZOLHS;1|9}7GBRd>vAz}Qh#?~* z->0J?m5h0V7DxxGAYFhB9q9w1dzMW4O%F1*4xddeih|oalqek*(XFyVSZd@1bXY@KUQ z;lIoIFn)46E=yZmWn@Fc?rlKbyO~4OM0Itww3M`T8uSGmW=1;;ud{V_j?9BM_bbl3KJ?Q&VFnCoiuvg!VUG|5qTs z&-Xtm3Ef$A&lERvIEkTT@gzrkz6-eBP~xc+1YciYw~k$jc{*CV`$Z(pm$AUf*0x#C zz+k`~`h)UTmi(lI9M)tn7jqKdqrI`xTT>co!2;#Ogxzn{VEw)EWk+O;# z(rW|Vk*C@$1r3`GBinPNO6Q`5vmK#33T_KIvX0xuTx@rjx+4SXs;kv`-qAUQ?v1KO z|LBRneEhGEiV+&O%j&vMss$%@Vrd1E4V$h^NHVQuS)1ECVP;WgC^Kl3|6I$K35u31 z@?`&*=BT@&;rVU11%vDM@bM1+yW;6;+Zq!$?_4?O_r}!~LG1@W93{x53tnIV{1N+qKefXv8k~uT za{-t3R`#UUU+w+yV*^t$vI;vO-~apVDXrVi*G!4xq8%4;v%D9t;j3kAvQ9GTccAc3 zBwOsyBu-6D4cXY(6wH(vyk4}fH1~5P*<&uu{x7-QJFSSrQ>b`i(724ee9x~moeNLa z`Gp$0x^+@Zr>&eBK_Rb-(q%8f&q={f|WNNTMgel~H^28?fq}XU)Vw-f zJ6zq*>dHGVo!kg%v5~Rew}$SjQ(Avd5N*EI2&>ZbN$P>PLsw)+Yu#>Uz*|rO*X>ex zm;*iSR4HR$TJ5lsZ(A%HuM4kfV>tl*qUQ!yj96C`3sf#=(g9;uiuMFZBnA<4l(>#e zFkMi?gq1B(vy3Kt@RCHu};{wTTL3Af608AHmM43dKsOax^n(y;G>k0_6jV~ zSX}WFM0{e$^C9AO=Flp%7fc22z{Xf35GAb|8MqG( zV5t?aVx6G%yU}D|DtQ-8lGrq0GLShEcA-z0-dBFmm-ek#d@HB!lM%HIU+U z#bPK`H|wQ1`itau@*~O43)$ea+Yqicau7L)L0cz638KxVI@u9Z7t>0H-t+@ZK|?5J z-_1B4boP8XdjcfL4+-Mc>W#qXa(M9xil1~~3BDfg=z31d5Xx@q*%hsk3DDUyH>!GH zH6kNK=!q+~X!5{;qL@st|CAi{%&iI^C9Hj|mQ0TFedU-IwJX=1;Cs;lj4Q4M>3>%J zZV*h{$sdt=$RsarypU{cFv&V?IS<8;_Dz9*LS4f?!FF0&=s?sW3t(NmfAoU*C`Wx0 z;ipw=9|g#wT6vc0$LPUY7<4D=aQE)(g^_c$i>tt8wM z+n$vEGIqFD%zlZvGVS+qn`HS4+i{D+XbRmN{+&dD2#QZdbR zCKQnJeVx6THzP5sF^;Q^MY?y$A5rCU8>HOtO>CO|QR8f-)zNOh`5>!VdgDz%(VqeI z7+HD~6aEv-FWvsVC1-NUV2*oW`G*xv^556>KR}0Ly+h!W&*f}q(NP7@c3)K z##_0bm#>vGFIk%>A=2ey=gfa;HbvKb&p4yy6;Dkt4yd=lmM*wa%nk_W?E%PrXWwI^ z^)dF6+#-J_xN7AiUI3&paeMOE!f8TXWb#zr>9-}dFHKX{K4X0i?EKnnuma-Xl*caJ z$mDK;$fyPf@~DZ@GSz1Rie~Q%4#LiM{s6Z4TRzuGHBBJ9DiSX4r+@R|knM8aO5iuu z&&=-4Rw1K=&u2Ni}Y5Fexnfj_JfZn5quP?*=&o; z#R>l)zcY49$@O&m$tN*<3~cmP<5KKBR1WZv1yloHgwo&!f3Sr9=JE&j#P21cN0<#6 z%CQ1oyVIGRHAS}0b%e;Lzlk|LcDJT|J&KISjhJ>KOIkjWiAuXqP3}8jw>K0)OJy(L z+s=u)vxnTT}J67^euP#{6XrD_pJF7adeILns6UV&PUn*FnSOfWC8=UKV z_Ts3z|Jk8Tc=HlYuQ~$%_>mAKj%ZkCs*XYnpsf#YmgK@OafY8*wdEaYLwAk@wXe;K zbqdnY-|z~8L^ZJ@xYDv>Nca4@QG9mws3G3Z3ynsdzrsKgiC5`8$fqfcaBE)B^U_uV zH6`9f8dh_kteXYFK1A*T;K_2Bs-bbYFQwX;BsSWYyD&!{t=Py0T|`CZyPJEwML}vm6lZ$qBpmT7I*u%HZy^(Ay6J+Smyyb!^1gfa>`EWneh#u2?V6|~$^`2D? zdQnQUV-9%u90xXt%vy#??Q4>s&gC0L6xMu9aFJF}rRKFFBBYDxL%=tAzguQ~{Iq*@ z@^g(em*S~C#^R`Pk&=~e#u+n(ypB+nd!ohR$ym#0GwT;?CUzb>)OBi$`3;uYvG1jR zVxf4dkC8YUBbRCGV>#HP?bT0kCkNZxU&)TW&}V2n?GpX zpMKz`$SdNdfxYfDO$>|d$xODc7Yg=V@OJQnJ^JnrY#T)w5oAS2KNl{y3`C^l#z7;* zGzVUT=q>DzHfU;Jjn_m`gy+rBL;Wd3GWRv*w(Q5zz=Zo8rz`$!&ao@850E4J7H%bQ z+n522;Wf`!(kNEShlAOy(S2_>mQc1(so1U<*|>-S81ju56NnWQ1A7a7AzL4%)tzsA zV=QAG7^ZohXo6(&*qihyAN2)ZKOiDY+KU(pat z>Gf)1;5WZt&-WYEJ9oZaUR&ma8=w^rg3Fve#1hbL-x9%6IXyUC%*u!32l?4(KivT3 zD?1-qPz#HD&hm;S(X`m4`ZBevNWM_zrE5R=rzu-{ZApH2+xM9ODRvfJZjJ;ww0H`v z@3?Ecc-Kjw@TZUq=ckiN;Qg9;XLvF7RI$q)xHSD>hY|G_+CsfZZr&HspNf*{H1eV5 zW4_Pa-`N_I*;l`Jbd0P_$Rl~w{3@r(0r3g=U*SKoxDOtsW60jYZVU1NQm(%Qv)huAG8A7Yk^aUpC=1c4fra zJE@|y%R!C&v2%EXOk=HA>pO<#kDd!M*ZSOMbS)Q?Q&D;%%1;l8k$-F?;{Exvz|E^S zDLxsc=%?IOf*Zr>^!2330H%Ohwa?=&mVSRltG43WqnwSsg}m0N7gDJWl;E1iQmm)a zbvRyFu}S-La^=;lkf$x58fenx8LS%LV_?u%CkHmN7gf13nP+oW2;JE~MVt^PwV*%rR`sd|(abJRcAmv9y&_Y5^-_+8U zgL36NPwJ|kQQunlYr>5KKQS%(d0$|iu>)J~eC;cb79<7I7;^_ji8=%xzK8DxI?uHu z;~*kVCF?pK}a9&7$AZQ&dUE*vY%-AuO_a8|qO zkZ|&2z@Rpoa+@agzVkTr4h&{%+RjPxV2Y68z# zcMmypyf;tLh(S-X)H1=BsZ9i!Q$OOX3BW@$FneMAK@2?i2_;I5NOI!d?TMLxsIjMUDJG5x(< zxw#T{QRWybK!n(I??A;TS;K)Ww;{O@D$iW(-1RL>eL3G3oPB@g&LYV$Us80i}+5o+@_Dus(H1j zP2))v(JRp(!I>T~_Z;rdZ-%@aPXj6_>?nPcrK==N+L`S1YF`gwuj7&M7fnC>Vsp`( zDR{=qI|%4cYR-%zp)}cUJ;`X6`aIaVq+Pju+9h4ft;P;fzgR|dS`&3yr#&~PgnC)I ztuO_;Czm%~S8Gxxv;@Rm8t+s6=o4vrNG2j08Ed4L=MLN;HxB3dc@JX*7LHX8WL`22 zaxR5E5Ii7W0%j|o$$H(5IwK5ud|j5wP2fhx!oAp2B{VryG(AjC_&6i{$u%DnFSi0W`Qog2RAi;B_WrsPeTHc zu}*-NJn3R9$5`fzbVxyXv00n5p_wJ*mwC`m<#1uz>xXp%%HiWHT_~d?-CiI{2>Hj4 z19A`RpjrO88G60af9NypXxXqB->r<7U9=vpkQ&#WwN}klfXF+6BfOAf(fEjBlP#`a zqb}S6tH#H$QTw4W;=dzfLQyk$G*1_P6FqtFrF%Wr*NYjng3;&HMW^mo})fr7-q&Y!cpeUjr?3oPAj^yVz1k z{vGWL;u>^*UFmh_2RbUVBVhdVQ$J!($IG<7$jDi&9@3qV6e$i$hn>rE%K zWj!%OWY@V*BLK?MPdNyAL$t}xJ;z-q+UjJ`|@ZVtJvu%ea)wz?yxz-dq zN)p@Ia(AOd|Is44Thd-+m9otQLa%rley_Eniai2;=KFf%%Qju~xarBwZ>ZmoT_NQh zSmmkykEOBp{H$9XFpDQ?HmWOV-;Q5qx5{b)VHVG8m2b^?H)ODq(V#~Lbmi5){}Iu1 zy*00(cv?Qzr@Y!!ZE*}T|8ca!C_)0?mlx;6TaDBOOr2^?zB9YS!c7J|($DfwZ6F3yF(2CEmt(O)Be@6UI;cL0B+g* zg9-+}n9zM>YPCGyDtR$c%(=Kj$E486+tjbPw(eK&d$$oqBy(8Ar(;QG)3a zU%JQ9)qRxtlfi-@Dmmc7wIiWiHtOe61J>>imWs7IDM?Q*$a2{VUzrx9((iW~}ZGTidDsCl7qiP~+?LbHUEeZx%9r|o6%m&HBwW)*%$ z3l-IC=iz)tK3efIf=M;U0u(kzcrc;VYv7FXJ>FCXffV!Nu*K4jt ze@8FUrYq4ApLJ3El@1l%Oj*@hPbK=klrcIB+~ZniC8ssvVX=`2Rt+T~J$7?79KF+@ zo_azfjF~pwBMtljlL|a!KqxwLbLP1)bn0zW7Yq@?ri_q3{2k{#R$=(#X5_7AhMiLF zK{2QAaSt{VhzJ4LA&!K+#{*Kg@Bh6O0{rm*fkL`{v)jGgmvz6|MKcn$}m?D-ghoivrO5n5aL(KvAD2&mL(f zc0@1@^m7Q(K|F!qtN5eO((p6FIBnPdB-E+3hN)qrIFD6SRNtzK*Tq|+X2){Z#2B<_ z$XVzjK}UaSIfw<>bE3BNF!?I!fr!nEFQAc*~Q)PYR3~ z3|9*hyNBU|RCpUGYDihM0b8*k{$&mGU@Vr}7ZoUP0Xe%`R^?Q-Z*XLoS z=(;F5nXjz38sAzCN#VI5-&ZTfG^eF#9jme0Z^A0@*caP`SVL9iU)XT{WFx?3+VHu{B28r?q}lQ6!i+h{kMW!fa2+W zft-!!PEYo3;zJdACDsC+{60xfu#PXO3;Y~IM**7Mb=3m+A+Xb1iW-`bADn52iULT+ zTrt@M`L3P#)vm%TqQ(+rmG5Rw9_ws6JL!aK7n$s_LR|mKgNx=(6i-c&=B#e+iX%>E z#nkNA0Eg%vxDti(W>@CAZX)6lyaOF+c(y&HBct35Aw zct`sLv0C2^uRUTI2b?M)6pU%>d}Dpi;**42me7mPBpYq6=tma4#J3?dIZXXS&4jme zhqzAWxCWfJX3OGIY!oy{sc{E%?$j;VrHB`(GU8&04ge-m7>CpUoJ9-dHtB%a5Wh7> z(A_N62fLtX4V)0P74?=Hvg1o9@Md@VnZ}JT8SN{Br%D2)Rm#ePw$FJIgkXfHgJdO)lK%?>STj6q!X6%S=zHp)#NYn*roqC@+C$G?t=KyJ zQ2>^()bcrdF2EzpY}^2|zB7j07`T6y+brDaZ)RqZ6Beb7`Hi`ZF0`s!O}XH)nU%+# zv`q(Q_md-qoMqN5kh9CeXSwG$oV=;D=hu^n$k1y)&3}E`G9QX)-T=89HK3Y>qIMhs z>*){gy_<=+CxT>^t8ie-n$! zV^>IZPL^)SrO;*^+NL=)&4#6pyqI0ttGG;DS;3du^Pa^*&%TK#vbPkVh7uvdG?!Cg}V&A zyelWL7}~cQ1zVb7Kw?8)fznjtS9q79H6kGHDI=62Qfa-&^3P+pR{Y8O#19>u-k58w zsWov@wbO-_^S1!+VrxGoFxBUahnQUS>Ro}*QZem1K#;@*qkXCl7+Yo9JucZQsr}}Z zy7=!)Re<-G*ld3UVXzn_u2y@7Ql@e(}GXqhxIwYpsZrI`kN*L`MUG3*8cuJ5i# zpRTlk&igg^L{4c{ZSG9ocd>^F|11NsT#UR2$x^4YCJoJHcWc@>IcGyZM`l5UK6uX zn?d8B)x8#(4qmwmpY<1Gmx4^>X$qayNkdCCR|kupRC0P&HEUAfMe3iQ?UicH#z(FCiaEK zbBZQAVDNL%w=BO;ZX#oiPb{rCoIOGQaI=jfBhgnS-@Kv$5RD&krwpK%ye}o}fyJc{qZK&J= z%|F=>{cRSP5tPa@6y&v4G}IhIBGy!~KqnswNWd?XAou-3qYjl0w(LFqqZeD;92^`uaZCF7c9L`0 zSoxiyDLM}1It6wBUnnXk2q?*=M^-<*-W{6{!}DPM6iwsNI~4q*FU?)(3Ph$a&lCD~ z*K!I-%mlz^tGhS!LK^hZS^VJJ>^-gKkltH{;{HqCdTWdc`(fb z?X~mu4nYO>oi#b;Xbr1IRA!jP8WB)HaGK6HmFG&FvA|+J?DYjR!oFw!yZarM>HLL^ zGh9PK(XmB2liE!gh5`mnATSeDHRko0B9aDgl3KA?g&KbRO6&3Mv(h$p!4rPdEv|4a z>uFy9AdPF?Ots=(t+$BkZ)bUHgM_@a05i*77L+;k#M@kg&!gC9_vkA2q#n@-{#i)d z;ARy!;_FQ$VM>_5&Vgbm4+rq)?) zh0_yXQg9}Te>zhcdK%-Q!1ahRltNRGbAg3Q4z;SRv!cVZ7FlSg$4ftbq1I{cVJRrM z?Zwc2B?Es`AYFm};T~eBB+)e(Bb(a4}@(fL?fR9O;xc6hB%gh z;%jY-pQTl-XuqWkX9!@P+nOP|aw?)}K@Q;L)2WqkV~2-U z(7BLkO;*fV{hjV3jHL{<=3LCQ^g9w{y`B3*?w(b`Jj_=v3)7wO{P))g#ktSu#jlb} z;s?iEHH9553En=Y-GHHa_Rb?mfR2s%ng=F&xijzE$3`WK zZFef?)%#kw=cv9Ca%P5e-z4t)1f)cRk=67^EGNXfm6IMG%OjnFSWJoNd(;p(Jw23! zl?9HjlB5CiQuGH)B01_3|9g=hxmm%Nc6|6kGJ-`Q344GK?TFlTZ*e|XTCiBtmLoO* z2d=~O->0v0wQvrw(}g6L=}0i1-1FOvM&`&ITeLGD`GC6&Z`HCKMScI9C1f__T-Y1B zEXd0GZ5#CxcT|IWtfrnTDX)8-;-h{Q&Tp zCcbDx6|(YN8ao3zlZ5nC+k!!yrp-Rikp9C@6Yme>`H=QZYoU;y8qF*n=3KhSw>1*+ zJ||FP9i56Xo%kzm)R$~((w*9Ic_lI{F_HZnd)A5js%~}o@H?7~!pP+n*hEnd?$k*K z5+YdirTy_=COmDo@IcmiUed-pzgdC|r zkgXKTfg8Z(l!VXe4oTq(Flk!ZJ1-(}L!x$ajvtN%stJoeK=6XfWPVZ7LYisC_CWdM z#k&)kbLaV&tbs$6tkjg!>eRfLknvi@Yq_2>_et}U7;WFKkHx$*4hV2u-pxLjyf-$9 z$9BCMiSi#x3fv0xy6*^>QHiqa6VsQ+_F(x*biI;OpvwliN~3Dr#kS>{9WO-txw!wE zo|PcPOPC`=^DDR(Ug+oJqt0Kl*rna%NLXrwdW5x5vnrmt6y3fMK1=!}N}{d!u9Y6BGfTAf$9$gJlU1p@PMTr3q-@zgi>m&tUzkcNU zIYJXJSm}d59+s_AdDAPx?jB_^v>a4#1X_tw=F{P~i_zil&eR~3dX|lt2FY(LDu@1z z6K2b1&H!5c)HwZ&KFQtWAqB`$Zomow_jfEu%+B^3f}Q#1Rao>g-#=CFzoIAU#Q!W> z?%&|Js5VBJD*SLKIohoCnkb(Io3B9fQyt^e`OM@5c@NA<{w7Dq{m25vk zeF@LGuKS!?r{J8BT#+HJPfEcMfwq5H@#_&z3+u8|i;DGr;!-TRW>GqC3cZl9ASA<`=ku`b ztBSm$7D>^5#dANL&2ASf@uEb0 z*K3(oQ98@igRY0cPLgQjdB%}75B2!q#|srQS@#ED-|i@ ztmhZ7;`8=f75EE(%|+daAl%A*fV9$2XZ;jiCHUEW5C7@)_#n_z@HOJ6nQ!Q*fv2pH zBB@sSZTWqfdP)J_4)ubd7ayV@c!!s7#GW=748BrwNkLph;d?1ZhC=-vmm`Z1jp4yN z$~D{1GmQJMEJ*&FER$IOJFm4&K3eDOkiR3Fx00h{QE6%r8#%3Wl4#{3aKY(S>`lG2he~CwEMmo?D3(EG`u<9B#pBL0K~P6>d3TMgded01ZGmIhTl6 z41B7Ol(G;R@3V>Us@F)#iYLJ;ZW>=Umz}twzNkDNy;&OYLyQS>e^nmXa$6wjWOm~9 z0&4+@#KI-M6aCZ9Ymwcc64rNUm`6hbo^C*$NGI;Xco2lFw=7Lo?AIKy*grx`Ul>bykZKE~+LVEr&|M4p3TELWcKtE$#kypWq`<)Zfj z;b9NXuo7hy(p%3FG9B~pMW=VQij4?&#WQ2xifP4FHjGQyL|$=q1Jkm8J)ob+&zpRk z0n~pZoRu_@$wYqf7)VTd`jJqv6&agk+2;7$Te&1iW1I%@nC8+rWxE2FD9-C}+sUR;QZ4p+=9cd#bIi*zNs zD;$7Ttk#q%6u~(3Fjt8VY>%;ie9Q-!HdVh7ygiLuYSd#rehL3B<{Y!*`Zi-9ES!@4 zLZJu-X@b9g0?J;#`cHu{l=_?lR}Q2G-@#|XiwQ#WEnIxN`PL>DcUy<&JNz34@{1* z2C-&}MVcHce_EG8=52seoDB^mA<1+R?9!cS98xAU6$>j&^TDN()2sx&z08{l>~#z2 zO9~&y?PclpRRxfUMVU_3FSSH1w*XD)fkM;(P=!tH`q5Qa*?I1t+F=k1`&H)pzcB6qK`{ zJ1HXpW9Hgf-{t0BwLO_J$P*-GLfm_lctN$KWPlMvft?2TT%>>tM)#tL^i?jdMFdDX zJcoJd#Q5gFNHSug?tr;{@6jwfQu;Ib64xW0{f8Emv|_7RsW@9gq^M}&>ybDX6PwwL zKYCeoQ=?^I#I(25DBgplYuv>opzhpTY`iV!X2$gx7>!(|m|F>ZMjUnR7a|hUgSE9p7;3 z%X}-3_N79w^t3$A`=w$GAJwm^FKJCav5J}_z6)Skn z%P`B($LLjai2g@scpzJI$o~_h{*!ccEmCl;dD=xf3~mcJ?+D)bab(AUUM9?`DP`ktYOS&p|pr&baPL$xOM31-*Zi!=~rm8o8fT%bLZin#H%m;Uw6D& zV!J5H-Oq$~{rS|*HmQP+r;SlwtA0VFOU7sVmIot1l|7 zMBXEI++t&{x;TrI=7!Q9?4alX@&I*VK36@A2Dt1GQH->HO3Q6}1J8j9P%maFvDg8w z45K;NY%vZ{mnx9|x-N z-6bVku`m4-76m#3=@1mOs@3DM#RM0ibZ00}++~Wy{fdy5z0b-zcKVYnN9hWsd03}+ zFSU`l`M8?zJ;FnO^@@mIO89Zmg7Sy2L5#`|oIEH5DRUEvvN3DWoc^Tr+{B)3BthPW zgpai7qKxg930;oM$xY@)`;S30xYbQPMF+?x>$}?>bwsRDFZD zNA4qfyS$zl)&cc&M_4!4#mjKo3lWf0Y6B^|VGfF_M0T8$qpl)9F{3E01hQ8hMst3O z{9cuCa~k{>60U|LP(D>E5OcG%NzNSrONn7{6gfgkhhBATgCJS&`ar{64XE+}!%;e4 z2bK>39UUphl`W9q^DIxX&bgM;#(H`N-rR}#QUt`$_&D)!xu!=DQr{W0N@E!vnzp`U zydqTHBk~{W=KnyWDrf44rwhYxzNa_`#ys5W3H;5eR#`j^~rR; z;ZKi>+UT)h`0uaK3C1Hi5tE6|$u1^*|Cv-bZ%Rp>V;{Pkv>n9j%|9&aKSX?5G^B`Q zW{7s=EZrXZFr$;l2rvSi1eIn3W@Y~Fr#D4S;6^#2!(w99Z>9+6b;j38VXGG%LifOC zoN7?~HfnTp4Sruv?1kJ_v1XXx6W|U!)x&>w+hj}g6YQYLI$4|hC)4zK?8u9UUqco& zr%h8UIey9FYvbO{bO2id4QHIB@Cso(V+o0##(T-|DKTaWmz;eYliQJ9a7wG+-7J?y zvTJNkfXH_E1L%*OChv(^E$KB%63m_DUz$A2g^wyAINra`OUo2N>RKT1WuV?2QXb?Oa-00_xaEaBGVh5nh#Axhb54?G6}a7axx9xBL0
    y=Vms&cdpeRVNk1Qpl;lZrd=3!V(52YrBx1a3Kw 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
    |Cp@167;vG}y@WpQ97ES`ltwuNT^w9C#fCPXt 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 LM7#Q-)64$>q50Q% From 0be6b94513a9ca602a8c8108f9010de56374511c Mon Sep 17 00:00:00 2001 From: Steve Chilton Date: Wed, 30 Jul 2008 14:37:55 +0000 Subject: [PATCH 36/58] Correct versions of z12/13 keys --- public/images/keymapnik12.png | Bin 60797 -> 33293 bytes public/images/keymapnik13.png | Bin 60797 -> 40159 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/keymapnik12.png b/public/images/keymapnik12.png index ec2e2160dc56c9ebf5f042aa478de9c3e7642701..44bffb81071cc6b8eace95ac08400c80a88e45dd 100644 GIT binary patch literal 33293 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

    (JPheeS8plHy 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 literal 60797 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

    |Cp@167;vG}y@WpQ97ES`ltwuNT^w9C#fCPXt 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 literal 60797 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
    |Cp@167;vG}y@WpQ97ES`ltwuNT^w9C#fCPXt z6xt$y*`dE9-xjqU;HQ`E@YC2|iGmki;4co=XtsI@Z|+uae=%IX5nH~MPI1=M(StdA z<=Iu$K`6dE(X^XMTRsmx!1_R{woBXBA0=F~r)a#rtpz_Q5x-J1@4^ z5IgOfW6#`hR()DKeSfvk02gt|-c!N(D>)lG^HE3*!(p-Pmt!Z0-G5X$$t=B+WrIIe znEZm`7vk}}P=`^Lif#H%IlnktK@!alcbx7=H{USv_n+C=xOGK<&^##3nVX^4E2lfY zK*h&q@-eKrt?|m}-kMMUlBBU3B5lkw{jP;_ER7E*`keoxiwA*Dlm*&=D+Tz@Wz?*_inhTaojZIcA~p+!;^9 zxqS-ct`aW(Sh4xES3JdEU3sI23d00k7~8WOte1IDhPqDzVd{NZ8h(wRD2a7EWpErJ!`eS_U;4h+dF&t#!r6|^40mm=;Si^5XXJFZfZDo z!qe-QJvr}7)>o$3y$ag&mtV{MKpF+~t8f@*^D#XgbxTj07ks*>sMt%E+(Sv^pAS1= z3>Mr##>^=1pQFZtjIRYuQ2=d+#$X3-cDTDhV$LcsZ{6*EKTa;?uHrHxG0mVqVz%J1 z#QZnX-uSkP=17z*_SQL97>x>3fm+3K-On(b!LA7ZP6y27;1?Ek4ar?#>{!JbI;3Wm zB>5~`%ywV^a1K`po^1U5a6%*J2+xU*3c$Woza7Qcwwl~{vx3ziA$#dsa9+0);kg6b zF81N2P;k_q4Iwd%`#CH0OfzRb($}45G5OXFFQNU`7hT1Y@0~jP?Uo8yzbzH$dEuUz zTB3X5-{^YpkDOcIJx{%^F3j$){ht1QSBPNW^26ZKe=_LR172^NyPjSftmG#WTh=@l ztK7f4uFe|>>g65Ua2d^J<>m7>D%wRj&ca=-Y>^)v$i)`iYm zKx3u;=iQAbvqb2!uZpd5BZmUk!MhiFic($9lfmJ9cJQVVF4kvD3PhX4F3xauXA&2s zqqlhX-?>b^-qBD(cS%?OV$bq?1NF22n+srQZ{1Jtl{IybaD6-gHr7n1hNx~E8w%iH zT@&?pR*z49FCL>VTa?MsYj`rQke^oPQV12iG*{sayOlqn8G?Lb(06Va#>37vWY zJ(I3kv7=n7>w?wOG`V-}mf7M}H`Q%wHLP4}^b+;IohM4EdulnxA=-hGm}vAwuN`$K zbh(~lr_wVyrsnbA07X#t;=l(731K2KKo*eHCMwfr*6AIASgY1qgM%k=*Tv-Vp%EFU zP{Lk_1-j;h=Y|B&0oMX0EOql(xSUhxt+cP84}8Ne)AB#6g|^69;XKXGgPMhplVRe& ze_wKkVq*y3C!V^;{1gFaO z6%hO?GLCnrI}h-b>gAYTV6gkH7~!?AmHb~rI<;){@+qyvOi$FfMo?jSP`-;!BuA&xBSczY zgrXy*V>D9%$;qTfDvS~Z=>gIyj2b0KjFxT~eI9@Bc|Yg8=X3si_%Pyr?)$p0>-xsU zwRD5P_CX{mo4GM}m-&-WJeq1}B7qz0GJf~$4Bz&HKh-=v=IJk!O{Ma?)MLxuJVMlu zY@yqg9!e2&w33$R)^VtMpdDaiFBK<2lOOCs*9Zwo5tULG*f|7c+B=tM-*$d(-JD0g zEYOPi`A!7s;#@Zz&{%HP%Fog-;Ye4MdE4mZxXoFwsU?L%AsazUTQV6#?kci8!)PoG z@%++PHkj&I3XtGJep56#Ud1&@#wQ&Frdv~%Q~9sMu|Z|}@vTejb2@(qm#qgy#i$FxqZ`@W<@c59kC}r2w~5SsyhyzK z?wzkDJIvKKbAnYA^SE16%9PBzGifX?su%>yFd*mvEUFyiw11+-8;CnNv{o z6$ED9&7ibR8F~rQVtR1nLJ9$@#xpky?M-Ag*{|x9dy4P(czBJ)$lowlE>5{Bi z$>A-0)u6?%-#1IymEMY+T5_0`1%gZZEQN29D96k?&v)J{hAYLU3@<l=!lqFh>!7Me# z9M>^H?8zuFu+S?w*2-v;Mg5bj=*w$PkUCJcg%w7f#|Eg^o9$BM+n~S)(F4eln_5CK zrHbY=*z$B3bI_)aDQg|2jV&ezwfUi!7eaiV_gSunsBtTwzr-Mry78P7BDwvIyu{f9 zqP%1St*%3DMvilBwS{LeJb<*FHG4vJ>>cmrz zP5pU+5dQ%RL3~xTdY=m`#J-yK{?apQ=n;8i2qoSHB+nCab)(c|(-yj(Ho<}Mm|>H? z^sjC;LyEK?qzM$aOS(J>ezW0es|xyat@KSSw3AUk;kyU>Y}{^0Vqln4?ME4c#W%^Y zKCH{xgBX*Y#s+R3UYQEuP$u zvy)~ZC09juS*N+MVV; zH0#YfbL*G%QnqBp7pT-P$V*$1^A?#gY-7Bg=3LBioxzpwfXuLpzVxk=mBg`rM`6ik z5W~yWgiAqK-0BCFDS3eF3Szatk79;69k#wiv>)$JELJ~AAMfqnK7<}wv)K{4?d;d& zT}rP>NmZPy;7WJM&=n&^mOO_om11ASeIJwz?}mOIuiIpv)iesNkW}-K6e4`<&9RTD z3CqoeCV*c)l?DxCJHY|j%$fDUk3nK)=umo@d#5kPnt^^1NGS9wu8jFmeWuk}EEqn{ z(%mJ1p@8RP^~=Mu)i34vUTZuEwT2Ga8%QiLwAx(nP>KzQhf6e2U=6PrF?6Iv(4*j~ zo9f^m57?VhF(pA4`{O5ka9KmcaRwVPntQ9pX78aMn@@5XjWq<>F%bez0%ZRQno#IZp}gfxw?ZNM*V{@$NwN&=1q z7UK`I7LC>Aj-&`u8c7B*hr&mp5AK+Lg{0*ee0Qk*aTeFCbsj3q>1H_79V?z+p(ZZ+ zW?+sGS5-uxVFsQ|3XtsvrJ-Co!B&(vcTeZv4%jTuR2CbQdZrX@TwL4cN10H^dAYtg z{Ce2kz}kGU@6TY`U>_C~(luX|5CNn3ZH7}x_L7MhhsYTfeyO^xZiOF0h7fh8O*Ee? zft5R!*g}lYb{B#ftc6)EpFXp~l_!olWH}mg>aueA5mn!G*BruJJ6`B<9vw<_qPBt$ zmtWqj#SorgT1W^qGh0fkhT9*8$vBfzIYVyJSeHeWkQj`x_86;)6zB}{k)d1#7>S!h}$vu5hvA0N!h*e5Yiu^vDnv+ z-^29jWvXQTQ>jLXKi%wHk~t4`8v+Lc0wSSEd{uYOJPUq{YbTFXXFj4(R<~0gF`IDU zHnr5D^B(Wz{g>mN;8HM;-_WkX##IAK@tMF78&Cot5`*8deDI>5v3E~F!#%f?1`MwT z8PD$elFXz8-VI_m8+P_KZkw_nc?f&6N?S|OrO)-fVbAMD&*HTpbdgxoADe}J_@(f} z^jjzVKL`Fk0gGt(Q+GKRbV-0{zW4DqN1TQp^~>viMgQ>X zu3+_H+pIEo#UP$?QKifizk@Sl$bi&91jYcuVABzR#qModzZb+a{;7SI1@+YoQXVKG z0^8mVZ}Vq$C8poATqEm{%?!3hmoDlS)C4L5~{HJ~>y;3#YX!#L~<8uC%*> zCmLURzIgn^sQB^Kt~$HZG&1t%@|*Y&Duy?~>|D3Y?vMA;j`s}; z>w<-HvnG$i66;EW@2}PViu%68&XaTj5-$3#knL6R7-iJ;YE)wBevzukzWf}P`_v}uDW8+ON6ruh)?_O4-YcZfE^y48s>c>ZM?H%oj>jT zDK!dhf~LIBl~KQ-vHU{Y;I)N*csxl?=Y z)7}Z7oc&%~g?0>?YT39&1ixnwd=HS7Rapx2{oJ*(iACCioVif0ff2W z^pz6Jr?|HJ-^0*CyoyXp$<90tB1PF~+PzB-@CsN?@HogET%&a=I$5iV`|9C(L&22- z?{-Hi4BZ5-du&Jp-qxzKG>nv~u{v0I_g8iM!*>;229l$b_nz;E%bKJS#pA2w-O#Et z=JBKC%FwOn(qI}e3xnk<;(IBlCN2V*g_MxkI+jR(!n-L@gh1cf<={Y-D)%dYQ?W&( zf!&ZD7!rqW(wa2KeHxmjC_l>(lrBYo;%VSor2==23?3iOSM0eSTp64^-P{PO|2r;c zuq6bhP){Fz@1-SYjXMPB`^90(5Y3|^La2v=Zj*hK=T*nM>zpmz-$I+KUfoLN?}5af zaW-BnX=~dJZLgVVigq(mW;g3gC;3J{{+<4CgK6N3Wrdd>#k{p3OESBB$*Xi|ev30a zn{B`*>T0EBA@ml)&w`02NTJ?c#4lc)wSB*d_|xv@Zr6fAR}+2`Q`O*CGyjE*HjLkM zyI01x4^j)tX}FL1x#GNgJ_kV=&Hp|RmpUaXUCKgy2s|e(3GfREq7K29bmTE^A;!J= zIZQ>Bdg6LVs}wK&0~ur(%qGrcPKP9W9kq;6fQq}By5}q3HH)pO_4fb6ue-D z>3$#%T#8qW>td?vXaB?1!=5NV#(*FbU|}Mq?oE;xj91K-uZFPoHZJDfiX~22EJ2Y< z%aD3??U6&!bL9>e8i)ddVKPRQYP#pP@AE`zG$(etL7gFk?u)j)L0< z_zCm#y7u5-Yo|I2+X;dd&!>ui!u^?!&HGUD$-xZ$u`4L}$;Y+qUmKS$hB=&>IJzQn zg5afd%5m*fbf}i!0J|k80@)}jZ_7a+Y)N&flz66m(>935&&7DeZ2a!}NC;};)j1<3 ze-wq-v1!xcVdrvu2s-ikad?PpU?Mi!K#PHOY&2{G8|`J-Xgk%s|gI`W(#-5{|vg%RIdqy zncsFfn)yZ(;3)>n03PX090x73O!r54)*FgY9rgA zs0!Leyi0joM@m7ZYa2iubXy{nH5=?>~2q`?lMYv{6Q(bS7z}cFIaR4 z+t{x-kW*N|=P3>PWX#!7nZvep&FT3)(TZ)J&9Ey&8;X0YLg&5zR@!9I-YavusQY+4 ztg@HSIen3Hhx4nb@gvzmjgt8$aiwXt zBoSNaC*I&_1Rtw*(J|TAne@?z4P4JR_wQb2B|dTwPX3T>KFmd zsR7LU$d^F(F}ax>!=RQk7o<7es_Rq6f0?*n&HXv?<1RI2tC0xarP`Q^0Tn76$I1bRfpz zZNZugIcC9FveuRYRy=o-zK-#(SCpN<_G%Y4=1jS>(cLc4lYZ&Eg#vBr*oTx;$aJ(l^mmrP(2hK@h3kxc+?l({54GVP z>GPDW?s*a0Z;3y{5ihA@t`JF;IVh?D`c1hCIZH;QRP)Nx6+r8FT#b{wHZbHxZekN# zr*SWHVf#8LUGD3%QSyd!#@E`4YxQJTucsN0={FPPQ+|00zo^9$At&c$-(`IvpH8>+ z0N-TPuw5tN#%}n5QSp5d24<#L<(LRPzD*Q!dG&iI+i&9EA17_;1pD6{_ZB{KURzOb zB=y&v8t{F&MR39-6dNrM14?6wTlyR|GFd;jS+#mc^t69QtrPntrOBn*KM&&kEuU{V z5qT~JW?!;Aqd}jZ*AzL%l^$hq>uZp2;UOeuBW)0@1J|HfK8>WjPzINI2Y%)0jjxETxU*g1z@T^7+S?8=-ZzdzYYs#v|z0lRHORu2G7$YrGWBPEMp zggZ7#>*(K#92zTQGB&f*b2anns`X1HdgS?0zxI|A6S22kJ6EdCA{N{!6imA63FoH* zQ>f>6Qq67fFN4|-Gtv4xCIwFjTK95A8Z)n0M{jq%%8FhjKUWIoUCk|A=bK{up;AJK zAzWW|R#4Q|n|d2+zTGb`*w(xqgW%ilpgO6+gl_Qc#|2jH5@+Qc|M~l;$vwQ;GWT+} zXtJGvMvJ&F)sBXJ|E?XpEjuL}Dq(`lCvXWtF7n*WHr9Wy5-VLMrqmQdmd#j7 z`O^hzwD@v3CT*g)Hh`hoD6`SIHVBNAB5njQ0M9oKoc)v3gul5>OKQKCCg>PND?)aI zgwEyV3ZLZ*ZhZ?;p1e@>Yn0r&a*h;f5#|UM)>h+k9RAxiK9o`lxIP`1geIa$vyqSD zbw2jT6*D)QI{0NhIR2uSu5+VS>+}?3W)6kd z8SAZS7=Lb2Or@I*-=wb#hF5vyRr$dKRfc_w99V7T!TV_w-b zrg~C9=CME~{It?>!rJ9!^1V1)fyf3P9|4b_1*qUV^TRcGWI|vhi52TqSjNNE@C=oS zb4<_l+sE>tGYHPVc^S4>VQ>5O?lh4C>pTkfvPQT$Lbj@|315y#2M!=O60elHkNsv5 zlBt%X#nNI-oe9s>K7SomD%F+8bma)mZZ_WCSn%LIC8a#Ha)mBqw z>B`rMb9tuY_z7~v0Q)AZWXUtkXqQcXK#PTGya~{xBR+^rFWji(NCbp<@;fHQoI9_M z@HZAiuL&m{1lTn+wtxE-tDn#gi!EjSA`+)B-13}k|Dij>&QmM0z71mVHgRZ+^rRKB zf*aIrIhyLjX(waJh0=T$b-VOX-^~n)DF^7RCaMfMMn;_@AU}W7oM~P%r?pZ2@CT!4 z0owGW9U7&Um1uG=K`ZgUPvJlMsDadf40Ha~WB=#DE+VCfGhn;A3wFosb zK+Dr051Q1*S^zD$%AhcNy5BsZqFm@>qGWPkL67O|Fn<8SFFzhMXWF*s8oCFZQH#?B zF;!Ojc(;fGP%Xo6iAqo6k0T`G9p4Scc@qlhkQ}Y?jcGAPGkx(RVmS{uMnR)DL$( zf7PGkxjF7_t=%--e&_nS*sg+|5oC1hWFrh62JNje?=Cu=cyWY`;Rr*U)q!CQ=&hMJ#Lh@ zBr3LZ&Y!?aa+^p)MJxKke0GLb^^g|rm1|PAB!d%JDT-v$r!D(z>`XpyJ`_BvC3-%D z9qS11G83Hb)yMV#Yj^Myp>J01Xy|9lWkTtrPg=Za8Y`7|df>om`w?a30&OBzo@Q%8o?b=6A`a$(^8r8em+jht&!g; zN9lc72__DN07 zjW50K4U+rqEc=s7i?R}nFz^UO&ZEeqUs2CIF&@x*_UiBfX~|H%ZnCzN<|OH-RAHb_ z2Z#+kJ2$fOc0-|3m}iTQ5KTX?{OK!CMx|5P2N|_m7B?74ue!0F_?NTq!anhQzx~=m zOO8ZZ4b`;5Y|DXn0e{bdXhKM35*$S1%4ne1hA-z$Df=7)&-R;JU>twBE_NJykh;#c zC0%|;GhzH%XV+)j_L$3lva3u-k|0Pq!2xvAj|B1QCnX;|NqN{A2mBHa?*CwKgjhQr ze9{`xzI#z}o5!bxs)H7KWE!^t`G+R8j#IrkdoYd3yB}%A&1^!&*0ox9*aKetlP7-3_9K#Z?3yDl`00oEf5@*>A>SDAG}?!v(NA5Ln?iNX!GyLP2A+v%XlU#Oq4po zgZB=qt9a}SF?0s=>jdcG+`%+Dr*?XAT6K4S%V*696?IzG-YM{gjmWCtXpvGviRR`w zcBIlriN`n-Btw7Z_U&;uD~xNgOrx#BtR-#70vrgV}hD@k%|6Z4{p&I`-2e1f??F+rF#Y z9b^JY*cOIJz0|{7;$5fiDUm^Wt&^L3Z6fksuwLYhyy`22tM4_~RzN2C< zQ8sGg_~adOxxLET0-q)%6lP-=ePE_g9v}j$=kGagZ$htt>t?Y^1LO8kX>E&JzgaMY zSnbuu+cx;zu!g>k5*c4bj*$Q^*XwR1jU;0|re9vF9Vofqa1~`yp}@<4>L0D8G181E zjADg9*hv%9EEr~MSob@a(X% zX61#cWX#@_qWN5^w$)q2EvXl$<|31I@@B^{NPt&Yx9%W4MyaWt9ZB0zRKhuRo8#B$ zAxM-`<|!@;X)0Y21s$8lUb1#ncTnxT6JuY$S47(AGRTUH#zQ@5Sp5 zJHNdlxj8?1;MC=_~*}x<9C%W$MRhYlfGAz=|n$ zKs$j7+1Sb;oB8K2`95g?`$wo*20wZGP*~kVZHG9^@iR<;mYTEu07UX!Al4#FleZxf z0pSyWBc;7_A-^4Y|5P@@-ksujvpzu9^!`$-IYS4>FYZQEpbRw@{c3zjGqI9HCR$e&$Q&8;DV40)cpJ8kCz!w z8T7k6KcmAJH$L!t7sq6W<-%hs^0re|eA|sGbz9gcZHS~_>CBZGoiO09180{DxbG>O zu>m?Pq!7~c0=0y$u!TMswM0(7)yG`#xEpgSn6iRx)89UTsh){j;6gChRw9v&?Z>MM z6d5cX{bb2x!kq;|-xs#MLA{I8{J$#HW^P}w#>iLb$E`c9x78r2TeiE*kV-AV0=e+E z94ri6KNpdYKo87w=n@@?RUmZ6vrJ$kdWtO*q zBkkoI)*yicSC1R=X1*_iM(v+`&PGuQW^7-t1d9FLAZA-x(7Giebaz}hqQJ>9Mn8(YlhUXW`_qFa zxl2<|WYoLqE+`w&H~#Bv|Nlbw0uuEpdjtM=h$++2#o~EPP2IrIMSlL4CYM+}jtPmf z3a5VazEMJs&pDD}+2j$@w1xN4{(1CvD*H&PAeX0XBw)0nZ8wV28qt`f7(Upz4tdsA zJIgao&Sq+K;6*CSIh&DuOZR2|#~{(9wtRv{Sw~pj&W9y?_spc1KkT@M9s&8OC!rJD z7~M2r=QZUD5bU3J0M>&aD-+SRPQ}KCXSWNrd7yH?nvF&83m;1Ufcfg;qLJ3kRWCJ2 zl_N(MEo#LXdtVC=bokYTFx0;+zF$;~7U7xZBr%Ip%LT4=GHyq^pquBPVKXc+=9C{( zRL@Dxe9lPSEw^y~I}R(s@QN@Bu0nAeKSsQ{Lb4+#=l~4l z%vm*m{qV6ejg-PV{;tBlE2QA!jzh2ITk4j!kt{ER#yaDA1)EELVR(7~2s^1Q!5D0R z8C_hfcq`)tR29e&ZtrORQ`W1@X2OL%rh|-s(J}2nqkK)9xpP-Yj&wSC4W0ra!SnAc zs8@%LCCG9b>)RWv6M^PdRhheqe*$SgOSyX(Y!9W?VY8thAQ9zv_vLPiP|E=f#U;3T zHsLXPiqSfBm68>%#;b$<34+$cjVS3|gTdF$2}mhHeK*=DAfaNl#78VV2L%peLt=RU zQq7-FN!rLIm8vFfc|*`=%Y(*X9+pht`xy1-wkLM)8%^Ax3Gc=wj&wB>-7d1D=>*-* znElPJ$8(Q4b-6PawhZ@zi(yPlcX(Xz#ZM3U5;sfu^^)$sei=c(nT0yQni^T?qWJ9H zdG8H>-tzKps^3EP#eA%Q5HU$|pVmjI)q;^Iz_8Z^{SYY2|2viVA9=<9co1tF8X={i zo{G8~?M$z7C2Um(86L?5jLpqhR7+j}b3-%=3)ryX{Lf0CJ9P^XWtrI0HKIz4jlJzE z8z=x*Z>o|!>{raA_TV@k1#7eHF){|piY^xSJ}y{>DZtkK>XNA=k%|Vk@JO-=5#AE4 zi2WAIJlRNL_Op1X8J|16@9y|PV>JFoc%v6wy6>AGo6@b{cMEIa#HJKms|FxR)pr-)bpI)0A<#7EX@BlIV;iOFqW^L?#!0iCf3IJdSc+MvhdMC~2qJ;NBiSkS;*0uM02+uQ@~g z#-0td9y*qCTsYE3hgBsx-gkuG?Xn#68OVjmgV~{#rG3Dg6v%d4D6{f?j3Yq?%stdo zqUh9KLvb!?Styj##8N1wNIb7<5KWyU4=1(Tfq@wf+{ox)>@N{7-|fozEce#|CFWt zT`;&EvJI@2>J z3;r}8N_=zvZfZ8MeENi+$Ce0Y@c0GP*NW{-H2;acPF*`z>4P|8$078BZ0{r^9rf++q(2)UMW2GA*~1*Y0_(< z5+nI77qSVO!8W2>R(4Z4zl>->>XpOLCp$wH_Fs8aR*Ll%4aRE?1~SSdZ8r;@J);7m zFRYb&irfc6JM4)w;d4-5&q^^yB`54;D(+)rzcx_a$wHi=+ay|Y?0>`c;efxjekYDV zaWu=jMqqK^yyBz`iblW!NECUgNT|QR_!a1{jc~n8xuE6#c(QY@o09b4jQxkh0cntk zeiruGSfCS!QMsT;E|=|f(LRR)jzjNe_GNiIciR9ELeY0SltmP5SftnTs%eAb5K;-1 zE|q0emn@p|wFNzmp@oJ(Z-+#z0zBscp}^?jG@;3|N=+o4>E_=B>AraTF}NqAv3?#r zTY~18_Warx1ZWl4iAg#qJgT`5>Z_~wW<^5`gog4JQ4Lar_9^Zpbkyvrd4+xnUD~Tc3CB;Y@nzj)bVscS^-@ME}t>Yv~FRpc8inW5JD^M=UOWe}>(# z$CqM09t$DMY5x9sYzZEHrOms^J7Cbzh*sx4{N$}WBKaHJe+{6L%G^wG*c1AkiPod+ zs`+*JYbQfn@g>Vgw<``XLejm8=MTngn8r$Ts@V$As-~GswN5_ZSm*T=cH{_3^J+pJ zidX0_j94`PJS<#!V>{$tx3aGI7)J!oT&is{BX*Up0PI}U>HZL1W%YHqXo-u`$D$gp zO?|L;Rgj{djYUXpA-&T8RAw`p6>$Qu>DzD)l3bPmpLHL{HV3-;0VIJ$+Y+J~_x||Q$DoyyWR!^rPJ6EpnhYfs zi&NlY6*fDg8JlfHHHfp_2TB%2#aZh+KjO}KGue)VXoAQbUGWXw7Z<`i_FyYJ^FaHc zQ76jF5Uek-yH3tYueh=RN{iNE9q;9m{LSo@qtYY zE(1D)2As(ie=Mi`PobZ$_3x7Y-^Krb%ufF21J=E;8ACkF_Hd!Q^RI3$ci_v*l9-Ia zk?DU|GgN`WF16-jGbixTd44}mlz|Fz)P;=$2&IN|8Pv*J-ne-rI95mIhPUVMOU46~jym%g$m zy?Y%hn668X7?`XfRb@T(L2Huz_it=`ysFjC8IH_sPiN%Q;^G?%*DjO6@+Q>MIydF9U@b|u+b_@o&q&x5-?pMr9tnX)=^8VpJFs2ts>ZEq-){2kXQ zbOt8zl)3-3zDTlvn%ahKEd8GO(eHsQ?p9ygm`?|LM_{$P)vi?qi{rK7*pDMmaGA{_ z1P8keH0!)-R?-OqZNOU+Y=qORU9r)TV`H2JaGyBjSYq*-8{=yW?K*NZ+!Y-`9an+8 zyuA`=nAG++5Ntn=J2v5Mh-Dr5R&t3nMeIi!uKHet5wN4&G4l0a{i@BK$W+hg2HPpF)OLMAq&n4-eg z;}d%vMXhkUx6~gNs*5&!Z zs*Y_rs^QK+#Vdz*eJ+S^#NaE9*kVexxA3x+oqO{w=7E^p8otP64B8mORs6=)~o{jq%Z?C3M_=O5A z_atlJFKFt4Z(A_$v*6LfMq^8jl!5?7MjH)|D8$;>uPS0!m*qU|uN5utN&P)OCss%m zOJ7;jrBtzIn17K4S^n%ce?I_MH)bmBHQAh;2lqE0+UVTSO%Z?WQ}P%!F%7N0A)MfU zZA%sNByGL5&q^ipx(sT!?9}vYHf@U zhq?}V^gi*`XgxR%)>}P8y=G^!n4fY1i;MO}5@Y5bxXS#w!Ablo(5#c#E4=M45m@kJ z?;9%{o@w4yS0d0E4qMX6-iVLaDU=5h!Q>KW|8*Y1P!}A-NrwwTe07<>T$k5R8{+Hs z-vqsY0=WJYsFZnDPPMaX=qo2C@EnKsmpuxi%91`=dXS=ME#mm5*5WD`c9|WqNB^S$ZL~N+I@YC0*+eX&hI0Ap z?s9|Qqw^C%yHCus>Y{3Qv;cdO7Hm*aM{Q^l{ZRyd!ow~+5NS-SPokqW35cwaV{JxN z!ladkCX*?{@HpPX1)L#)`%H%`$ui^}r?=k{|ty|W7sU()o-g0ovex3j{wqc84c%bk13 zrCsnV?a8Kp)kSje{0Mt=2NQyK8vl#%*n9~ zWc=XU8o5+fu$!l921_0s@+k4 zywb*=K089U!C$1fWAtW%Y_Uw^O^&|L=8p@>rgA#&D9-ighg?T(SUpAS8gw2!3M!S~ zUdw>tEHIXv4yp~`oo*i9l*vj0|5I@!#x4Fc3H^T&EVBgiV887Ijn__lX}j%{H#ZX` z{Ar{3UPe&GnlCx+&G%;Yz5QKKrr79R$F>9F81Sq@#W}T>@aEHk8Hu-3C#HQEvedyq zx9c%3hj59|+zIAUoTfHv{o-#YvN+`Sne1+9A#@eKtsajqW^R4uY z#NFf#e!E`wjrwPjV_tiqqaCDtZg|RPpR{*D+wZ2@Y-6-@D1wkhwQJj!qVwk9rVqws zN9dTe&&6d6Vi`n9;P~-u7m9 zk}BEWgLX$S^gasP7O-ZJCTu59hB2mZNwsaC$V(phQ=bQ)k(N~L19RW*t}t{+KWoe$ z{_7YgxDlL?vJ@Ml|I2aKmWu2SlpUTZZa>inbnb-!fwTcyn(NevBekT^jhNDq>;YeYFTT)C<%-wXiTV3u1(uw zd3J+GW=b;V+Y&MK$os&@6|W6(bX8DFlLl)7;CpRggGkAgvHYNBxd*>3AHh|e(;6nIBE0x_REVK!gBx$FL(HB2=pivi}o>;q%c z>Okge=?yqFuc*(hDUdB7gQJwY7JMd2&*lw@kGo2JJE4Tg2GWx7JpqoJ-h3SC5;Poc zl|sTG)CzX$umJC&@opF26TTzjD*v^Md^+q3cf~0j^+UMim0tlmKK%45O1^Rh0gyN8 zw@04!w=9$Zv%e_6y+^ENb!cAe#oxi%FP5B`B`V%(QhqaEHO*5bs7v2fcZ2hZur2iF z0&$w1$AV6xJh`-Rfkq%J{4NpXa)HGEg!barAwnP=P#gAd@o;fG&gnobya;T zqNIitxli*#j{@2mtZ0~oVLoN3i&s!ie1NcE%gDLaL{ocGLRkf>n(@%c@o2m9Gy>z`kirk8{Id1=kL!HKCCX+0zNyHvL=SvR=b=lvZ`0ky!ieg zV9m-P`ZBrsXCRdl=Zwryx|GT1M4b195r}8?3%RM5?xg$fdhn7YfIA_f_zvD-!V6WT zLQ;Q9q)K3H4St|5-jFg@Yd1T(bN?GcO1J32{BHQlNgZf9G3|7$&V3`Lb^oDmwm08M zX{o>XQXQC(B6D@jB1{zx_}D5&G-;YGX!{3yC>wW@z^dVfn@jASH|Lc~4Ud&VLpi#( z+mZ=?msqD}_sD;!$G#l<%&d#}$1(v1B*YS(k*3h=_v~}ogd?=An};3F&5@LycD1k| z5kD8`Woz7ruGc8vo|Nw_CY0tZGl8mkZUSGfrJnq}gd-Sy$vAozIeA_e2MhIW^fHMF z8RTU0dR-x!sfG+;7Kz^)7@Bc}ZZgoB1umT+Q6#kU79hQ^xQ7l=WBT2y5}xHD0i;D= zW0oI?ul&ttw6gpnO5vHe*i8QRUSeqY zfTidtP@CR4X2tsljqW_h?@k_g3;b*DGVLca1mc^tgLxY6uR_2n_%r$H*38(_4&LLr zChGb!KL5n`>s%xJrKcS-pUg@}? z8=rP=kAH2}s=c=AL2w%4`T9!4ts_{nMthRC=cn3ecjzTdL5?F*=d@no-SYHezA99T z&W1txN!HNbZLmK64^_b2*HC7}Ja?wLdmD*sb7<>@56zG+kfV}_R@8W`%&8M7PDLTu zK%yUCP*!Pz&V-$lM-av%y7O_EJ}^hXY%@|cE^(FV{3i04Q8&sC1(IP6VU%uYc&k6K zcZ>LR<HQUnO{4Xr(+Tbs_Y0{tPP0PiYbF7$_`s))IY$G32Mor?!xt_*F6I?D zjjC#{?N2>rB_f5Bdb|T&|J{w9i4hl>6V!IbPf!Nnbym~W>IKzmMcnTL_B`}?^t+=K zXWglfF`5U0$)Jzjq^r!PlOiMni#?_snJfF(p>a zFabG; zIBK-dintLI5#3|Y1z6`1#;f5!&F6!H*RmMLZ=s&q&wX_^ZBIJ5w1c*(u*?rMmnG}G zPu3cVtfa|bHD{fbAEIZ}@458tS|U9KJN+oEQ_w%S9VDWy`ux%9r#HddYy&YZAEVSV z(RXy0+&`jB{ygQ(jfxD@;XVAS2g<+ZJYWBWwa1b`JwD_^ugkLr{3n#1*a)3E7Bk~N z8B+|qA7eIRDei{6FCMoSj{&X#Z=zyw8uFL?`+K7-%{{P;zK_2}g*S@N8-u_afS!!*- zE6L?$jUD6#AKf z{>Wc8v83F7E>>bmLeuld1{VMtJnr2w=y19(Sj!|FTN!v=a!Hnf=ED>-MsTu$8L@Dp zda#Zltl3z*9R)zTcm*ryIPSr;3RigrJ^~H>ND7aFjoVY7e}=K9P=pD2{#l~w)ReT3 z7~%QyC{*l68M;r~gu^IT6HZ$3!5MURcRURqQM9(SPR|kK7lxvW3g~)9uW0q{SQ`}B zjO7qF`=v~u{gpjMZ$U+S?>=4)>=l7-y%;)vMA*JLW&5_c5%{f(?~2%{JGrAR7f!!x z&f8oX?Il!WvfIMgc@DeT-B=ODhAOcS05O%8#e+)iF|_vOov)R8ENW_gS7wHR;6E#C zn}(_ls+0p}UEBo&eZRWH5S11S+{s^>Un3b3DpjKz2P74P^%Jut-WIWu17tr?U?(=7 z{4!pLgD&ZavGqdiO`$LlF74)|M;<@&Lv(6V)GzqQlw=IW>&QJ=3#K!}UXiCrKTtQA z@w^X_$2_n);k^u?d&9>0Mj@==#Yx83JGwb4|MV_P$}qWvPrMDUO=Mvjb0@w>zbHsL z=^R`^f<-l~)H8x%^t1SZV#59O`0$-p{uC;l9rK6;&9yNB!M+Yj)TpyKKU3!Fmp zE6|wN_-S$ZMQ!P$hA6$ZuHt0`!t^qomMoMbTaL{Xv*==*fqum3 zS-qC1XOP^YNjmVVllOPSvyv~5;zHw3Uv=ie50z+KSXfEnMRHZaJFi>-1G*$4eMVp2 z0f$-I*L=Vw#{@bv#;p<@^7$K?w}+n9H5uZb5_$~Grtk_-C`tg5oUCWl5XWq?JYS!ZW!!RX1Yx`6=+$0U* zRtj930jC!g^a; z(WPU~-~RRb>%yr33=TxrR9Op-2=mu~8I1#q2Lx1IJV5_~3Czw*l~ftZJ?fW?PFWY0 zwek_k{`9`^`;rrjgxzRt-L->qU)ylaKp1FU$iWj7K(d&AsXDY>~{8)of(G&BN0RF!s&Hb!N{xm|?PUg1jPbPO6l zujM>kAt@!PpW9Ww2-BnVVW(pIq5xiEK4e$ELdvKZ~t zVOQfyaY>v(^GL9$3SHnn_f>g505nb{qW<{xSm)JT>q=-`;})E?IFc1N{vH^*xKz&m zBOUeK3A#S-q0V~O#uYpbH=1{&hlH&XLEOK7*$4yXibzzj_kCl{Vl7HX$3u@OOY}+I zk*FoAF@~W?fA<%APVIkJ)bNHN%RgA(HmWhf=DGU}*8E6|g|ERESQj$TAMX5@W<;z@ zxn;WvC+EO0W+e2;;^2$?j~JAXL`5dt$K##1M&%GWh6px=HI0%=?xfO1oXTKmM*&dC z(|;6ux|pR*k1!WNZibbH#b8~^WsgY)o@!d6BCy0r2E^4>%zE!nv#u(;zKy1#$g3oo zD_)MWVBa}dD1Z%=WCdruZCbw29wFVD>i5b+#r5TDz+4NCJ?rG&x33r(uQFamvtqA$ zd)hzj#<5IljXc?FF&4I=%d(eEC?7?|H+S)#lWcd@MgT*leF*#j)aSOq(&G2bF9dz3 zD)Uxt_;FYRuMe@D`c?V3fk+uJkH-pk4?j?Lt&va32Ybu7EUV}OSpYM?n`(m_RH-F{ zA0Zh;D>!rFrg`4n4z`LBko|BF?09cA!bG@fJXg0!Yt(SnDu#P>Y*fIbYu9ydYKr%= zzeCdc^10^PWVW+xB)a2&(e>TYY={59h*G;n?a`LlJ66rMv;?i9W@A;w-ii{dgQ`_A zW41(9?OL&8uUMh>rqq_2HSfpw_xqi5?>+baRehqikp}T}*Ue_+I zXh+8ayM9a+`?k(@>}j0YVn=CJP-RPdl?6Fh!Pkhn-!*BOoit+`e*TGjgt%T&J&kN) zfM$w#L&bdyr^nJ>2opFG&cyTT%G?Tq3WJ1E6E?@6x>?KChnWY;_W5$7O#|hrE$^8r zX4UBHe=|3jOQ@J4dO-p-T%&9Jf37`=K1i9+MK+S~rA}1-^ZLtSu(wF&U^$IyC_pKH z7LIpe(^>Ok*ZkWoZJF7Uk$Z{b$dxRdD|@yLvAPC*ljHgDE3Ofn;}O`wjOiLl@ymQN z#N=$HS{`-%UzJj`tu*ntE*YT*-JvYkKT&Hku!x zaPPchrI=>3eY_-2k=Us^=CxADcV{vy63ReZ^8DLq*M$qboi*E~r zll32~B1({D9^`EN2-TdEbc7JdliT%~Te5c!S}_Orh3rt~ChnLKs?+xShA>^hjOw#H zh?wBxxh~E+mSfDb?I{7d*QwUY#pKmE6Oiv9ESz5A= ze$;Ze0XDqgU$m#jBAKUjX*H^WcZ~&6`RV(m2%_BT;w0NpSELjh6*N>#`>SXU| zcF&a~7m(SC?aE5|CU)7b$ZYc~7Ky{Bge#`g|30VcpjLbnjMyluOi_AMRI4pZ4Ck40 zDQ%XHm}iJ+!&!G2$MNaTQsmzSL!Q(!ThhD8Y61XpU>71GO&<>iSUW@vjy+B0tulL8 zcEn@9H%znn0Itr%&lOMFhytVBF4oDT;=I+=|MAU(5F0^i^6ZxMy3)h|zk>)#+aiao zBzf8jCat>W+Qt*eO;_`FA|rga&ocu4@Y5s5moKR)Fq>+F+rGE3PALiw*3sqD79rIMRWQJxAh(kN zsqPjsDQUzAAfC=9d&i@rJ;#c`YYPItrp^UBJPxb!!JpB|ybS_tCGByEXffn=yq%Vx zAwC~z_Pf7?`=EsWKq;;LKGf_Po|RA=rdj(4|Fg!)Ex9)WKJY?ILGa|L3>}0lP8b>V z6XZRAgwGk;@#Q`EbbD~~jI1W83HHbL1vFX9-vB@V=Lip;l-I;BA;X|-CWyfDyH_oo zsrl5Zk|dxZ2PDf8ZU!U_u_u2Z<^EL|)j6IXCp>&BIS|3Z{0*?oVojFyBOZHI1H_UB z=;0|nX72i7mxukvu^=oSJ9G2Wi%-mUm&TpJmFOzJdt1?rflkAZ*0^PZ=SkuTOk_Qn zDE6fV<*}();%DeR>ehD*)ua}Q74EP)(c&Q_L4eCgf^qKf@*bD*$n7Fas2!+b_gP3U zLB4P+WGu(BJ!pXQoQu0-Q(1}eB@x$YCEso)j9cDmNeGs`7ko_Daf%V?=#|vU0HbUz zO&~9!Rv%GM^2>Q|JII~A3j&%y%$@#=VZbE&C}pBlpplWQ#LGA#jg*5*i4hs6=}#T& zHkrP@sFxG6rM7>nH}3))54Z^sJc>ErZ%k$KIJhEy$l-9KT?a>oFxwrX=|8XPUErrH zJ?2sDv492kbB+L}*r7=}x!eCvODT(Kyi!rN9fyw4YLZiJN8_wp@--~KLb1v~?&9nDnEDYdAKsnqxCz$ootx(*;*_mrmTP8X`BwMII@nEcfc${6xGn&cX+1A9Jy>s+ zor!4Tf7GFCcIz^F$>YWoHNI~R-Ya{d`D>2>ApbnavF5^NT2eW2cOxpny9vcA{hP+R&=p`Ab48ma8WQ zMRSdd{Arwbh|-X$lM=-gVWh||fOSw0{|`CYS;@b2*K{C3K$VwE(T;rCl%4Kl-a%qD zj@qU%v(kOY>${@4t1gW9ObDvocJN|B^}18%i0sD3^E(p%MneqP#>e0q03WlNaLjbv z=e{~Gj}Y>{rJ^$@7TF|OKHza@TZWJrF1~Ah=!RW^k0uBO0nTIFOw&!fG{v;Oai|&7 zsSk0(Yb1z?0O{>vc^Y}uwywzOa77e%j55T=ohQIE-STUjOztG-TXE$qK8Ff)+;PPL zOv&re%7GK$O3kdZgiBr;ah71KM!FJ)#eSny9Pm=Vg-+-3oHU%Vy>vdv2OJq zM51OKgYq*DuW%Oj)wBKwPosxMx*iqEHD`p`5YGC+3|UaeSmAkJ?4DAviF}jL;3#gk zi}M8wcR!s(Il)5*V}06&d#u5&K)kb({08hof^dNIP`colRG{Y_| zX}Qon=pN$r;%|kjJ~^XcVCJ*+YtmwKDWw;eDejx)>9S1}71f{?0l$BxRd})RlYID3 zIO)tHLNY%v=LY*}aTlkV^5l!$Fm0)r&Rljl-xx{Vz_Kg@}x5rE-ChOS^jZZnP~dGcr5ul3}8BhX*%++ z`77yIUFRwbc-lq&%9eNS8B~o>bfg9jyt6hvsMOu|rIskIL-rqyXJ4T}zPOmKgqaxs zL}QXlA9#%fnzi`iSVN0V%;6G-qRGji0XKXkSB**9uR!Ng9&GXFt2U|~F+fj|_E(go zdxhc-1&iF*EI+~;7j90=c@dYY0KqmrJ`TlyF0dak@c|H+*xs9YO{+WsFZtb@T%iqA zzYZ+K$WG=T>LnAgFFruYc-+h+Ua%a>19`OipnfdN14~8U;2!sl(>(%LJY;dmR^9xL zTeVq@xVSwBxtgDQu6_*((6-eE{FA0=EMF`1 z5Jl08U_<;QHp_E$fDE9rH7veSh3?D~$3(yZSER&NOG5smI8OJ4&8T9G)d>1Ce^<); zNS>l-@~I4Rg98(zwrG8RD=D!mbLMlZ0n5(UPT%e%9MgU}Txo4DS6JX-)vA#DvU?Vc zRkHqWwlLK0`h{bFiSWn&%@ z`u(hUs5||;4l=&_pX7CWp8OXVU(n{iBXFZ}dEF)qen6WJfXvw@%m_-PvBPNw>*d$A z_lj;M(m-G_ihMM(v-bJIH$ZK;`18xu?^x~i7Lme6)q*R=Ko0Y^M1vlF?l&uoZ(By& z-ojl&RT4MisUC=ERdNNVyQ0dYo*k!ulqSm5BiX|fc^4SUISZswRKq=T{mS9$ugK4K zpbgDhZGC>|>AcXJgN#|Q(0kxhvceD9w~qtKEf)jnjDH0)j|=v{3x=+?Cx26IKIh?I z5|(sYl`T1F$&-*<{Nyw|oR{Tc^Yf1Dc-VY5-haL^MNGy5R@=xNV&iUDpX_dlFIv{m z=S?M#{$f8?t=MRsP2xb1b@mT1ILd}~mD7t+L`jx=fcvXI?JaFwhcTAk-krHD_Z_u1 zGMwSQL{LbUl~RG~4k|%Zfm=+Vx+S}MAKwPPMxPK-pO?ZWEMEkC?g)LdB4;WM3NCz| z4haw7Phs8W9M4)st@huu%L+Wa2eF%J7@OUw)4J!*K9rdsQWN4PMYHhjE;If@HtcDH z(PJb|hnHUTG22xfIMaW0s6#LRD-Jx0PrM>vxlhj5VJQOpgZ5nzyLdUSCealTPt@RF zfq2S4;BqVr;~HQ?*oG+fi4?IqkUh-KW*?lx>3@I7164!! zlnaaHOQ=CcDs4v+AKp)my+*LBh2^s2*{-Mr-_r)%XVRfkl}_5g1{PM+XNP)eJN`UI zq9@pd!%a2JA;}Y}b`}mLZG^*{+t2Jugwc?^qC6bqL1O;W^gS(QDhRtR+!!^n3hrNH ziDYHCq6{V8c>LRXUJmBJU<`QknB~NHeM{We(KHrIp91Oyw_SO(Wj2n4VelI{*!=F= zQ-B%o*7N%9l$HV%e}pMqEkSM%bSiwXuHoCZW7$nZcYKPY}$uTYfBHjvYu-2Iw6;9Og&@wLIJeGkK5729T0VG(sg2U@}2+E-v+ zADC2rlu$#IOy9sB3(`)weGl}4d~a!S3RqcC*-nFBcMLhaGk}tHnCNJMwx<#ZJKUuv z#zx#%g-po_i#TY&p6qB&Ka&ny3yJ>8n)HW)^CNp&tLNA_IUQ`8YHZw`>zEWX0Vqc4 z(*XMTD)q`6ztUGnB9FE3K7P8tpFeyg?l+F3?J_T69yGw8!DXd=cHTxBDKjCN@<7$8 zrhEdkx_I-UVu)bVS+=r!70P_{cA7l{$MPk)ql zsd~b>iT+W`JxkDKYRF2UMM|Uj&C4b>3rtwZ+!CAdBlc>tS){k>?(N-=C}obL8lqVP zKZ@}Om5^ivEW1dYxyr3IfVGauPTlH{5B3*a)(F3NpB$F5!HwHwhn_E~tY`Z*s8ay9 zCb-Rgf!a!CUK}=dcqG-nN~S{kG#Nmi(J|+yhh0VAMSo^U-icWfr<$6O@oCMQ-#gP` zQG;xVI#8>qd5MTA1Hw({9eC!iabNbH*J-J)pT_Mhp;}WGqjJ6hS3v6FbNlqEQaK%#)h*#ha++)@1*-y(x*(ECVt0@VhuO_w*OHWp01pw! zja>Dr6{6X!kPR>;FTdM{6({1OM*<3P^*0@`JvbJ5S`uUn7hmX~R$CU-z>ayIeb`vJ zP}4D{OYnXOsW_lH``v4&bRXX$*;`@hJSVuu1aQfEaAM@N5sQ(FPbagqMj+AXRj@fe zq)I7*9ck{-mu*pF;|2=WkLM982!>ldfu%|hsq52y^OslG7mWMn6si%*5TXV){}^ex zqt@4}=PKGuz?_(iL$%W;G@;BOjn2u0%;QTeO1(IDv(4{caJS-9_P2l@dzDMrfob0J z3xn8N&5d0c<2jkU3H}Cx4{oFsI-P|rhaV=R<3qK9W$OZeqE{O~3269=oR4Z$=!c%d;RF@*UO zf9ixA@~|Bu4Oh!$2pu}^P4CO3235(GuX^Q`sI86Mp|Mt-53ssCCQcrjmX=e$N6Ad7 zN;U9|Vq0$A5kA*(XzSIkgw_Uu(QT=S7;mh4lak|@llN0wFbd9ehWC-fv# z2)M_gTwv>GWEMH1+dAjJaE*cnaIb$vM=-#AK~AQ zh{o@Rqh?ggCgU}w`30YU`CAyfk(02*4*Mz^XaD+Y`JE}Lh020A+gvs84#BQ|fv|(q zu;CwV;$YbCwaCgxoA_ApV$>utWce*+`FX~tQ~HQ+pW$(4Kv37`eO@k_^Lxc@myfRt z+1mEU?W55KA#NUtm^Zx2{A=}}1CF^^z-#7EDy>O%eCha6EjmNUBRB#YJMu1{>l@Xb zb+cDDJHB?zaUWkBCuUx=;7;biuo|zBkA<017@w$ernKW4KTC5Kvm6<4td8jV;+hguzXw&szr4n=F4H$`qs+y!^{|@68JeWEDvw zyl^w^*W_J_OZkrG(%G<{IaZp+1@&(Y{5_J^rax8Bz6VuK8C9D*R(gmpL?$7N#hy1HG!u668DNfaB(5sLv=;6`PG2ro{~)MKtcYO? zv8-4o>=OLYDuaKt*v8lj3Q??$k=hFF4GHKgM29^EmAqyFidQk*mNxQhpAOqy!^~fy z=OG6n#eU914}grVG~^E{unrfrm&lh`n|OzqhY;{Xm{VJDl-Q>zPp9sCU4B8QTr4*c z@7BA5Q*de=;}dh`LKO2kZEkI6sFR0Gog@6-7tzuj6b;Ge3es7I0wbTCs<3{4Y{D(a zUS93>=I21K{f;~P;3Iq?5%OC?g)^d9ApZq5>&K-GUKf%4I&}Nr1E`q}{_F!_cNgg5 zb^7gN;IMY8pg+IqgbS|=fHI2D9%3%UF~#nOrwNRW*z9dX-YpS_--xM=hd{prK-Ye1 zJ)QSlz(t}C#!#odowE znJM&G(r~agsgg}|HPN+%`>UTO5tD&HA(2aazy9PWs_QF4>Dntx$Y&$GHh8K3zQC}I z1&7*&>VjR6!agn|6z^7}BjKjvw*me!!N`js>XvN{`UEFLd zmlt!sL1Ne0TP=C9mAMLJr-=jw8{s4UMnl8!pg+``&hP9c1qo z70d>1+_~M!drqNbFmM1TyCCgot8BcA!eE&iEOkaHE-H7;^c4n=>?NWhp#kpXga(@L zc0c(JtbT<5^DwN<-*ual@vz=$MkWa-1eTOG$nSardb$1Hm`;g}ThrJOItsES<+NYm z*F;97@Xn^1J;d{Iu81Qzo7Re=sU_ZUg3i_C3tyf=<~0wHd}-~v39k}?2CJV=Rib7*~TK-$^~Cl4Wk-?HLby` zd*Qm8+>-}wN;cP3&}qU=5UJ-(cJBoe93oe@RBp;k!n2+>Gm{))=#S6nS#{ z0=W+<7jc*xK6d_9jiu^y7q0}Y){w5PoZXjX{!0ZxbXd#fM%$+|praauz}j5|nM2^+ zDO*lh=;~*Gb-ePiyPY_KZ!KSHm707dafJPkE&P1x$N=mTa)e;&jK1(QAwFWXXmJt7Y(Ck-@AN z3rzY=>Pd0vkt&(` z1aU$KRRm=%(5EPS2)<3@{T;v9RkBS+uH&_nMTbGc?JI||B)?t!&S@4Fp#eD(sAwYJ-VBOTF96K$dXO}tVKR&9OCH^wt$mvYK$;Dc-1Ts+ zR6gTF?RgW(X&-L3IRF3~k+{u_-L>f$^4nsJtLY!f<+xnot=ShEgg*;88-v+1OeT!S zB`9U5emOrn=bKh(Fd%{X4t#U~w@vL3Ru{7M(?TENN;i$aeydhJF%EEo02_QO(0wK} zK#!%vMBNVxwwv}7(Tv89gkQ@K6Zcq3NESI(Q7K;-pfB4=e|YXS?=QHgXT~qjPFBQP z{*u*n04y%);J56ZIg1(Xg=5O58F$_sh79Q8KZ*MsE% z79KNrJ&WvEQQD(7V~pvz3C5L&i&GA?@cGFIhu_)tev7_GxE8LVbL_(VBlK#+ug?EX zJkm;448D(t9Y^&YjZojpBr{6fFM-`#2wM+;4$GA(>n^p-Kl;~~7wYB-G0e%&a6DkG zmwTR&qQr9iK;L(Lm9IsEajJSuPj-kBI5H_2vZn$T$d-Aa=N_o8n$V10=HfJzZ6mUr zkiW&uI}_1#{DR0lbSdpl;r#RIJEuQ@=yjPI7mwU}HLp+ZmLy*9)mNk8hZSh2&?RtD zWWk2$r{0&eSTBlS5vV}Ed~TI;Z{6)ohN1-E@kwx-Mpj^id5_ZZpw(+cQCBwn5LUb? z?)USb({BDs`ELHUIc_r@R#`GXS^q|*IT!FcVLT1`c+%8au6EclmX#hsW$R`KSN2*p zkI^+0*L^aZ1E3=}L{B}t*rS>_l&xoK)-xVii%&W|<-VM@^hNLagePZYb}v}-QK8>u zgJyw4N@L7YL{C&xfzA@R2U9a$&w0CX>V`KKuI~~1k}#)EnBH>L&t?TMyWTC$6E4f6 zzm%mg@JDX@VYyc2E+q$tx7TE#z6tjlO*kz1 ztK=fK`Wf7dDpN-%lOEu+k?;a2Oe+X%g$`276;dS3(nKDQac){+eIN|kgl1=={@OI^(X-C7MSZD7bI|%V1|0mh)t=Yi>+1L$~{XNcgV~&>uulD&m60GEH?l z>+7Xz|oUg&w1i_puh9jk9t@e`v5taGQohY(c9L9C>r3s zG1q_9z^md=2SlSC0s2#)zxxAzCA2;rVD|0)tvZ@N_^ye}Ey4#!Ia?2s>1t=b z0Ly_T)*D>Sx!e{%mQ?5s9|992JJ6Xeg5k(|nU&W0u7eMxpjRTK>5of@hiwe;nVBwU zZcJ=`4nkJ>f;5vWx6$iTOz+!M+$JA1c0nb#kC1=Xz?)$WXO^vMY-bK867mV8sO7S1^et(z}eoKYr!@ss&ORhkyxg>nndwTt_6h3xDU%8Iw|qvCr@ znR1K!CF4ieOX&dQofwahxTT)y;Gs4ht|uhAX@E&N+Lk2!5nC7fn%5<+u4D1IS6+Zw z{g_8WO@~-l;%nv+sY-5UACWE9$~NfG{#D{c!kG@?9-Ua)8^7&T)%h?d#)uz4cc2H) zx$`Iqx6TqXsJKfCXP5ob*y~>NjvWk8d|aoE3Cfk6#oP-J$#>u_g@r!y`9I&An$Q}& zGjG|GzeZ(UFIG`$4cC*?s%^&2wv6?2h^)PVDz}c6GiK_`>HU@t{5bO1=GAjszlML* z>N0zxjk0Jl{_WR(cctC=*J}JGjonwbYOub$u?F5Y0J42_M)gX3KL4%J4$X17DcjDS z^BV_%7GYAA`A}J-znWg5wqT(Z171wcBavI(572mY{)l2AwCpnZ`-U(yZRsMZP_CSN zSD=)y@dn{3f_T1eNjV>Af9ziw@%}&C7&+ZfXQ{%c%m0{6icJD%o6pEfZ%*N0F8kWVBr*RQI&e*d$vOO0OW#8S3UtV#o1N>?Pm)se-2+ zztDZ46#;NElcY&mBD8txDbD!T{GklW`5EZnU>Pl;YzmI+i0EF8S4f6Seuw_YBW3<0 zLzVy1lIO8D!7KyjB_QN z>WTDQ#>nSyWSfnDxjMlAY5pMxKcU*>a{%(}{O(pcWCs#bCR(wri5Q>k-_T%O4@8Z# z^C|fShy}1r;hhn8fC4Nlw!3S0paIOf3DVW*0&s)iS`mwDpRs^f7P=T&9Jdb`NAb?Y z9(}8daeBgTdld2eBump@AHVRrT?(2i)^BNuN9kQMAZZgv#Ee}d1>|zkMImZSgTIh5 zxWpG0cw3JF5IBQ3Utmun7rh6jN!mxE4cJ*)6YcK+$A%IeaZYGJi@it|C*T_0w|N)R zo1LV%*qW!|zV_D1eaXw^&o?4hn7in#c_=Xk{hJnh1Bzk9oHAeoH}y5G=Rq0lL;Ijoa&ZyzSODLRC)9j=E<_eq8{RZV%!{^ zlw{Xr=HGvZ4A30k*mG5?Uu2wLRG3V$x5nSdZ%LWp|Er|oJFlO7$-f3sx>yN)7B2jk zrt~o`1;)3gJ}&}2YJ0XWb=I4s{p~jYnvRms8YL_fVnb#{KolZ@zIJlo=Jfb18H?2w z;p$9XVCq+^ycLi;CfXmshOxi{*U!TR(|Y>1`coj|)QLg)5pqBFKdF6%&=Xqu2l~md zTP2`NTA3yYxZ!E^XTNL`ppLj@1usdRAi==5{$cP_7g!rfgy4#D?N15L0G?S;7jkAyoc3=w9XGeDEa)RwSA0axvfXy`3n!xbV29+S zjcp%N6;Y1}XUo;;#sRj$iY0=;%6W)gNF35NAu@5SlmB1zAeuE)!&C0P&Tlu9vP}9g z4-;#^?qrt_WN`I=mq2nQdAoWvp#ndgK5Mi-bG?xMu;oBV{^N9(E9Ll8b*0;1%yQ-M zSDi#34&bY2>>{4jEuLT$i9q0AztLePbNW^%_D*VDlg8^opAwK%Po94Us)+%6*iF|J z`c8%Uj#u{9mrayY6NC0v_N9o&Yj?WXu*@`?X0kDZghVeSS{b*g0jZn7Rbc}l!%O#~ z*0YUXfJGzNBR%hMpyIkNf;ANQyywOSgNbTo>z;a}65SX`LLubH!;tphQYLR*F zJYE_L>8)TFX7Nk5V;t@_qM56#AxMXAKqNm$sd+*+L2p1cwgChb*0l~D%*AF zb7BXkt3A1NrK$Irwvay)Ep0?K=#Q%k^c=Q9=n-tcrEHrE+zC5Np{=`yKRInKheig< z{qWUse$FF}*m$518n&R8TZL`3CR$&#MF^d3%DXX^8rg3oy}TYY=R4nF^8^;}E30HY z^5{N4LI9J4I{%*fTs%T3hm|@i`i78}s1f;3pjZ1o%nClBoeIhlHD%-WrzV*dV%Qz0 zid`_hWtk==!7adI)<_OrkFa}o#^BeFYZM(BP9$*V%(rH3cq|)eRJBa91h#~ZEyLQ8-dvms5p13dG_zed*^Sc=!6PlmEJ0OF6v3~b(MG}mBDi(OK@dSa(+~G~kvnC;jD)vTzKwlq%EE7nq`S&H1Pc5Lv7nAU z^Dxfc(4cH0`MIix`Jt-oSpZI9aklHZU2I((UVwdK}o0)#!eYr*_bW=RD1C;v50nj?~breU27F zMWDAmf_ppv%@N6|&x02%{aNLu);A+MIcO3p;Ke^^LgL+<3&leNJoJi)t%)vU{68*D zD2se5Sel_d3v=p?`t+q&F4XndEJMZb_MZ*pw}OpK`e+`SI3XPH=7RYQ#TCAZC{C6- z@q~RAcQl$RgeSz-9o5^pSYNO^juz$>&4?^Zr8ANCRek4vvycY2sWK0Pt`dnaPttH% zy-7fse|CBSXJH16lWZ)xVN6TBY)m&&?TLU6+BKbQB&v5&t*C(Vv>LP$5z_gDz}1 z5^&4!mi*()iCqLt%Ik(oTbDg;H?Df|=s%}YsOhf2#=B5%US-mBz3{zz@ogen<`>8* z*bQ#_K*Mh_*YYVMSq$Z66;!6ircNf0Fjk1ek6Cwfv^TYNZUawhExo1%PfDmwaEz!v z3yX9VHCkD%giTN+wTg(C;7Gf4g}nNHL!|-d;^&!ALn(-t4)c_M1)3Y&7nv7rPR-&7 z-?3B0KzxkZMisklMpO;Y1zpc-mrGd3X1Gk6;>L7FfN1$dJN-l)g5Hl=UNL=K(~L!) z^tcPB(rK5yLgFth#n>idEN+!Ub{wWv84v-h>*Vo=B$L!>Drn*NugH)r@-!(q|NTyY z%Xh>m=vzykf$Fs&qLU>`-`7xh&<8r>Z=|xqnsAHI)2Cs?Sxd-7<6-x1+>>2qA4!7P##!(tE7X#RdtRYd@ewKr!?BWt4c9x`IKJVUMpjY&yso-= z_y^8Xqh{D$Eg%TyM5?mqW6Yr~&G012$;4w&=EdUW?O$EOAmj0)9xb`-J6-YbehH%T z)3Z6ZvjhZDDB-5-z+cibV`qUIy)b*8spt;|o&xn5w}~ayggut-|3%PAyx$ zo)F~H&a0ea^xiD)75px-!$*L|ZwA~CX3RzZArh(qF788~(r>^!=4vJ5RZo6>I{TCB zqOdbpjxYM}$tZ7?v<$^hvz59SESa_>Ysver){O7;IJZY9-R|%d&)31whIdW$L8+`Z(OS6g^vZ zsSGt{S~rt;OIIDe_1Y$Y3U+tl1yr%E%$B#|Q^8yy&syZB38%{z{eerkMnEjmTb(1# z5+9E(!5SkUKbqQG6&GK70+g-q(QaT)ZsDwQDNgXgC;vv$AY=jPDN1uGqv8P;5mrh;ygi{S%gI=QYLlctx?3>Fl zQm}8VUUFQT*GtLWjm~D{2)SI7^Is_@dhudaCDBfUSw~I*}4v zopCXz!BXqs7LZba$zdnVcf9=G>xzvX>X-E!TvPCvrN>%(L<_HDc1WS_KPE9Zj?&VF z^Gi^P^wDPY$q7o6IE&aoHQsZou{B`AoRrWFuGjmPd4g%j#dOIovLh(1>R_ArIHVCs z?8^nI??B3gMa@ZnvrSl)Y&rAGqX1+QF~CZeab;W~7LzH@TdKDK8eyg!Bcm9eGj~WG z?_mRbYd#gPxjh_YbGeUES`C3I&bHI6xRlM@434>!fy9r1Olavg>t&5Er?L4+v7Sy% zup=;0yJZbuTK;kBMg#<8i0Z+KzM9e-jQ7qHM@NDTv>emu7@bJ~K8$I3Q@1?_x)IL<9uvoiqVE+!`GK{1=Q#{JrEizB?(JmE+1H~Lcs;Pm{} z{pgtLwV2EW12Ds-N)KL_%})P7YQ zE*qfynqTX4dcC1$y+FWxxfVYoZ3)#G?O7*|?1P6xI3Wz!%Cd$-2_8;Pvg zNV#EpoeyZz6Qq)$K)pk;at93e}T9V~QyQaDMRN*I!;v;uF z@8N!jzR2$eXRxN=C~Dp0Up9L^EfHK(MKUFO-&O(ry79Cv9CXgRMQ?!PU!1Jx1{xpH z_3h;zJV06yXxUWwsB`Dv>5cLeqJi*zOX!QPu`k}8j|R&Tdew_gAN{ozWF{+bsXS3- zsQl2{JH)*6m6LYb0p9dG#ys{kbNjRRTP2?5Dh$bN1*SCi?!o+nBL< zTe9j$;hW^j)(N?}{Q$GMaua*`a<2P0VdEMQ5z)GbWQ7^sU%89&FP5hNT)Bl&>$?mh3OWwOVzhbZBWwYCb z2Xw`6~Xp=6*cj!W@P0K zwg!H9m6YimMgCaFfX+%1qNrl5oA>f>rFu5_Kdeuw#&1hR2xSdH*=vWfo)h?sH=cI%7`2;U?3Z3 ze^bBI=D=NUP)$F)B^wiSj6a?t9HXOTF@^VQ#3K&Xt!%m!aFi8s6(Wt#oPnEza=>x$ znx&y4U`0D%9-Jh91cI&llJ4GWl-QnG)EZ@}J$Hs%Ce-OcGZs_#<~`}&^=*bv6aEpd zuVoPoD@uNE#ODo~(_7A7rlQXE7um`mp=x#wTiy*XVj^?_ss&x3`vdf%gaZ|9Xlt$I z;uk?aCAVk9S7_JdEQr1sKgu;`JHdWi+Gw`3^`;mJ7g?B=f|&7un4kSaT_yPHYuMyG zja9+fwN?r0W}25!Ud|}?ME;P-P`eOa-l8mFAJd9FRd+hE@4p`4MQ;8(W8$*d71)hK zyMA!u;2!%!1!Frvm<*Odbx48wm5YoxOX5Ppfn4b@*IE94V9G=z=KV?*Ts9Y#A(+p} zC2-6sQHSaaJ9Nj-#kRs-R2(GP+bjm^3QZ)-h@zbEM%VDU%DDuY?EC{KSS>|;msm=HC z3FQK)!$$kewiWG`f0z0;|FFl&6n% z>~Cwi{N$AG3I{A-0NZb-KgNq}5lnpltbRl)hAw&J{FS(P7)@kBTIJSH^(d+9vS&Ec zIg-jzTsK-pN7B4I;KSDJ&?sl9w$1U-HRg9hzJ1jp)x4tYlXblvGR6XWXOVB6TNVlT zn$QK5w!!V3vndk=m}`?m-T%V{(EQibVq6Y`*}PFYQIfm~jHHBGaIxD%K52| zq-d?ZoT5bKJ3eco`>+4_`EmKZB`LY>KU-gFAyTw$c|~*-fh>z>#aLgYl-_nf zcI?^`{u;NC%yQ;`Hi+Tlq@Bhe?kytU(WJW3YRrHgWIhl`a#f%hu-gZ#L}!}Y z5JNBHD{OU4Ro{s}Pp{?TNwSCITZ@&l7R612?1vzSGpSQ@QiryY?TzBjbkSSR0(&Zz zUN>iAboazaMC{-^9!=dN$Bc)r81Wn`S9_^j=i=G3o}bRE+w68uTp5#Vm8f>g_S?=? z!WX{YIH%AM-PUD&t~7xY>uhfbC%z>1A>(QeSL4YZ?>m;rXKy5fM`NlvJ>CpGVjt{R zhYY=XR3|Rp=y%8J>x#qEy}#8HV|&~l>NUChfU+m^>9UShzrL^|L%bYN5J*0FZ{uq; zZMR>F;xt*{1OEU@1$u_}=sSLe1L4>ofG6vRw1n>u0XH3;8*#A?vPx4+ZU>3FI+_1X zxs;B)sxPAchy0d1>}FYU>f@K-T={npsj>f5<*j-)2{4RRb8$uaH-l5tRVu*8=jBIJ zQz=c%t;yZ|^brv{!!$bV6F4U~vz?!RwRV4f90=w(b-L$(Tz`m{#Yo`kkA-HcLsZ~K z3DEB)nOgwUY4fu`l^jFatIJap2gM-@=pX~&HBO(ssHs49+=shJo|2oeeXR+MN_g_4 z(ZcReX3az92q6ve9_H~y?54lh-}A1hzY19Y+?{^iy9FZTU2Mhv$vHY)hUoU%WeB$()Sr>Pj)cX1j$~Q9)@g&eK-XfkWu3Unjk3kz9l8H=VacH_X zYHaWI;{l&Gbnq7ot@Az$_DBP#v%7G!6agGryzInDVEsGRu zZJG#JFcSjM8gR?nDNUZ(!oD_f@0OvT{B`+U!OxXH!;B#_J`P5Yk5X9K!6sajS}r0z zGEh+}*omRWvEA=mW8fL2aJl`+uUk8bbVN@@rZrwDrJi8Mw{NHo>t^?>U`sz2b(!$4 zE0X~dWe$1SHtcM>?d|@~51p!U6&BmmFG6sao*=GY4FVVSW35@gbHJIsV84-nq>=T; z3|F6mf47kMl&BS~EZ`vb#v;qCt$Nu86V%h>k$WaXSZKDb$u=M=AfZx6@p#NkfwD7! z>$|xgn~9;b5uLYzeGLv3s3vijQF-3`5JcNbH zZzgw53r1;moM1>Fm5i&<26J78ullWjw7ZMZ!modDj3xCUk?o9b@5b1lAONg9a>^-_ zD%~zy^Z<>BD5O1FeC!f|a1*&`e6i5765mFD3iPpbc*UlO$2kX7D{fv4995!;k$+FX z1xv(XPBPfl;G z|1-mr*DOVXK-#2`!(Ptdyk5j zC0m|_+YEwC(V5%~j`&Gxw@1`u$5#7#*I2pyDe7Tx{-cMg41#t!uo|i59vS{zqYun9 zu#DF5KhgVSRY++XmCddr>Yu0Ft;ejC7R`G>tE`6KFC7qF|14n)s|cmm<;oA%rh)q% z;l}J;l@ViKt$RX>!mel>%nLJH1bk}h#0_YxyCo&&f3>^L?Gy@ji~%;lCsN z6FhoU6*g(^vvG@SdXbMjCM4viOK0@vG^%uuxY&!EEaJ5v%SfFezn)wUlf1Yb)Z2BA zywkdcyibN~)FIm^(VpIHa+zVtq#MiKBOZ_xu{eJx6Z-YW_))b_uRuCt?`DmXvGXzH zZkwGNomTiKO<2x*P_l)IW*-Z%gKJkvt zPhxxEF)AW*WrEAu&T?;Ktq<(U1!kmXnHG4Q4?Y_#V64W2M;&BJiPB|6W+jMF@O5E<`x)IV&z9u|?M7fEUJ1mmg;WeI zpx#RKV(U?^-Kb8nB{!|W-A(Xx=MevkH(k&{WqiGOXRI}e33f-zet1`R*9K4F1zi{| zJa_Z^4QBR;!`HpYvM8Qlf|oKsw74dp9ET&2Sv>9&uI3-q7PjARW7c$ux$?^D8&^SF zDw2z6sT70!Wy-13rtcRQ1<}5O@nahw-RiICSVhtq*PmD2oAQ$iLUpU>41=EDP4{Hx z>8ZEa+4lTbT91+~m0gfb2IAF+Gx03M8SGb-P@e@j->U4^!`#V#_W;Knb*A{K9oPTY zGQ&4S(dex@^cc@4@3!vzV2fmn8me*<9u6oyIQbOavw-qvSnlfgtXYw1MjiTqXg@YT zf_@tIUc5UErA=N4`PiFF3_m-WM84-k%h4d`_=*0RJK4y+m5FFLlRZhp1m5o8_uk1( zhcCc7l9xpN0TPq3h#X@HbV$Rmcu!WV#HlTId^QU_Fc|YN_W0<~#um5#p!rZpHXc#n z6=H2gBddd}Mt?^7U1R(hs@_!mzcv}L>U2oA^d`1uqWm-zSw8oOlq~XbZ^>k*E(^p@ zuuWQt4+R}r2iOaFF#x$}UZBlKN_i}=4}Tn?+82To+bYnw-2bhc=l|=t`#+8HXg_`u zlO3&EipC+wfvH+?a=cfD!L-56Vh*_d5vqgWZV9M+-KsQA@Y6ZIzNG-&95~!iswXpK z6nmGNPhBbUVYb22v5IDSJ0gT)LdtOZRm+L{%aiHZ>w1;{R&4erh9L*%g%2N%bGYd9 z;owH-Txb8ez|pFxKJ63`wn;Aw8~j9pBz&QGTZXfAZXMBTgpD4d zC;6J0uBGGZHT>Z}{!)TDAK!cvtI2ABy!nOFY)@)GS)Syt(@WFtV?+{&mFkH84lcMr zU)ht+bEGzPh8mP&ShB47a%9dd{U;!7%)jbM`Ky3*@1CZ-MvLPAM!iw9^ikcE7)5}< zlzLu%#oCmxR*V6426PBy|UQ1c|d4V2*M^EXr6b3Y($}*iD|JEJr zT~&++Pv@dZWPkQpGvl@`Ca|VKtJ$Yi_jVv=qP%&^A8#QQ!hN`gEl#kI1tCG*bt+ne zY(>-lyGyX59~MS%Dv3ZF380Pz5c(cuTJ6SCE80=}eRHyf=~|2}Vd=3sZkG^rH!p2H zY~fw@>i}&(x#{kqlz=D(9~!ndX+tYK(3wORu+?}u$s>_m?upbA^fnbn1!}`VxH-|3 zeHkAJ^ydD_I({q#^20kle^?53cM+@mt@!nZ=RV5P*93&y-h_;V&^v?kp~qG$+J<`9 zqrPaZ{wZ)z1++}1rPN5V)?mgk$&I%6>ltBuONC{JKLFGdAKJAmWvw426Kohv2pKEy zzd`~mz<3at`G5Jn34n^m(yQtBKN$vgWGwuHCRD>u63CWhpHh>ROpQ2A=<{gkQ3-uZ zpq~zQ*I4D5T{(R^%diVJQz4o#(I!I6?-sMo= zCLyVzT?~kxOEm45D6gF)R|f_-%q`K%C>`4&GSo4v@1e%*WtJu@#OaM1^)2M|tFmaf zVW;cEF-{^xqmh#KSVljo3D+?<-~YubjNK-ly3sg3UE$^XonGa3Flwww>_dEz&sGsh zJ1BFmomhFU@ePYj*%;jjK80R=|OQ<<)ODa_4vibOn#XV(l!Cb-ff`A** z@ET)kE=%yzF3Kgb|2cp-C^?Qydrz#yMHM%GSI!ynfRIbx)?lsrs}v? zNSi%m^I7Pd3Z(o5;AZoe2N~7C=ll+hR>`jU;pDPn=Kf6f%AZHp;DJ{}F`|4eZ*qso z{->P94#(yg69gY5kLAO1Xg)1OpXP?`ART+FV%ZD=t&z-#?3EI?qaM%ip zn;c#7n-iQOKQV2)Ub0?J?a&DtsikY`?Yzrcb|gx}j;|-~#JXPVeY6Q-ggPEg+pw3> zt9`(f+wrrjdFsvSS_h#ws~Hpto&9RJ%1gLHMsQISFC0?<2(FBl(@eMhSdJsjZ+DU! zlm2XyS>#2F>8A#?X|5vu=$ztr$2mpz$vGN74=uOBSx&N*EZ$Zu2y8a9rP*+i2J~!G zI2z@r+Ts?);1#VdhH=x>dfU~qfWeK)dmg5AUc_Bs@GtAX@B$^IxnXiW9mC689ENIG z*>hN7IoAK8akBqQWd2`K%xU2-;R&-uoDEEHRsVtABk;9-#P-$PGTekI-FH%3JXdzzRYz&bO_JACP!`>kDPt2|M(8s(GR7anEUZ!lJyed30L?ujGL z3ifT&{Q#?!>I4@Vu-FM~96S+sdF3CWXo?4Rr(s-7O~v3|`wLZjLb_8o0 zxVlsvJAuDmNGa6c%5GSyHHD?>C`w?O-AI%IbE$DC^E|mJU8y7LWvy7W1p%yT4!t`@ zy`r>z<=eq+7D)T)69GsJ$48)qC74lpqG0TN`0%dQs>Z{g%jCI*IB*gAPeJv>P2}!8 zzMc?RmUFyLor>nmOq`?>oBh2Cqzvb^lWi9RlJUR1QYlJ&(GgAzzINX9rFXq*v#1F! z*H16%PZ^s0_Pc{<;$xkoO2}|reF;qKt7e4`>LD@&LJG_)Q zVRM+!kXGFG>gPMpp_I6|9)mq1qvT~4qg~&7WoY9%03Nsg9V38X!H1Cw5BhW2i(G_; zS8qd6w2w6~C}w?q$V@sI6jIY|65i?+RU4JqGQ@WF+IlP?5Q~>_h%v@@Xj5msZQ!xO z^<#>gw{Y!d!UXL60(9-a_L@R=#q;huzU*x;sSF-lJ+|$C%MA zs>C>m+jA4J8I$KW66pCgh5NyreTgw=u-j2N24yYSKJ?kLo#_-qPwD37EHyFRtu*8~ z9pTVkoG|wxB}9UUQ1$y_7RQo#_jQZ=EdViide?v6Q8E&jNF5uM_a}YyiwCoU&2VSF=03zsQ)!P@tK-% z>+Pyxj6ITNKj2bx*c6!k?6xX#ZlS9pupy~7mL^rJYa&%S<~s0*-tJe)TbeiE0&Vf5Fg^}^(Us@9K`~X_>cRTS{-z-dvzYom2QAbM+ zDT11Bm?%I%@b!^i^)Qyi}-DR+fwp> z`Y`f227mkKjwidndX+Y)VDuYfe(7rZu&%GPZKY<0=5L!)gW}Q5ly!a~rct^K#GTp_ zRralOB-9~q+H`m1;rnfIDM{S+!oam}O@LH25&ydfet4LO`5LE@CnZ|nif6o0F!y)N6X|k|W`i>$y~vr_Ar%O7HzpG3!YkXBG+u9A_gaH;DUk2X zsSp)ccEu6?R6lESq;w=DhvU(yGpFEY{MgPP4KiwW_aKu_@Leb=*2qA}Hq5kkMi!q9 z&qz(Qa5SB6E_xZ{9!oUmq2S(Gd&+0RjH+0y`3Q{rnY&g#QQAC9@0YH^oeaDFD+eo5 zvLJre6rFDW!F}^~n=gXSj#d4clMj}1X!gHW)ih-`AJ$~;*<_g=Nb1Gp58(6Dj`1+s zrHXR)Rp;c2oDxbTrfdcpm%_EgW{j9gi9Wmpf&Z#CFyGz_3DM4g|$ z>xE}xneW$IlN`C*ho=iq#S2q(Dh28IKMZO%@9TI*d%yr74Q|>C9P)4BZ8shd&$%Raw$v+7$3rnVg()VfN}CV2@bF9a|LmlaN6VV z42wpJ_NjP-c=cRu6|-e@ zN#vz&GWbK`;j-yVbm}@yWnS< zzklSd_{)X4dg5;uk@mjvpciFU{h8!SHT~B&&%r2<{?CERnv0|Yz73$xGFmgELCvpO zFwB($$OzMiL+K6utAC$Q@;h3W2J&^9YO5zwNK|%cS5!H_UbZiQ&0pRb9!_B6Gt))a z|CD$wZyK76ZDO>ON)k_R^Aso;_D61hSCn4|kjY}6MH_^ax21a*HLO2V;5^g0%TO57 zEyx^}UWSd!FYhKpE#&;ufZ$5>FsG)1(2yP1`WLAJr%7CA_l4l#0CQNh!D*0X^yDXs z>9o8K+xc#Oc{=fj3mP4K3&l@eBimV2+g8kB&xT9<*@c)=-aYXs!zFvN=LtrA#BR!i z#-Jz^#AQWo*p5RO;!TD1j3yLa&SakPu`!2fCfF4J-n25_{mLHphh(3@s$5y|24L=i zZ{Z&;Sakg4Ylyq<%}3iZ5Pz7fcl7x~JxaR&tV!VW2Qe&-r@cE$<|4+qf1(A~s1;H} zk-;un{f2CYJ= z-B|fa{bGg+wGl=!&N)~^br2?y|6xsbP9jI!M%Go+!VGZc>3oN?F~4%XI6Kd4j;cRp z+o+&fu;hNukj?aT3{Ow0DdA^np|5I@Lp?Av2wdHnw#&2@q%|ZPZSpUUrRM@0$gwa_ zJ6xUVgd*E|5{Qd5v_Z*rj%H8e&ft(*(Y;V;CTX#{%Pp{2U|n0Zc{&&OiWx_W#bwOr z^)R#mChjAaw*}o6smCp7-Z=69%Y_Bwo+z}=VhxV61FuiI8d;cygZZiAgMILJC`Q{2 zjq<*CQtq4Cd0wQ~I7u4rEhL+y^FN6)8nLr~fvsxjF)@+t&VvAbeIK`#@Te+%df>SLJ!E ze!UFfJMCIo6>vGd)?+-vB*Cz0zN2qA^b&?T(pAT_ksKb^%!Wd~06aYrc9}BC#=yFR zZpPIBuE-?auLu6+A>!8Aip&@!`D}L%`E36{P{$bJeX)YTh2!8x(BbDJ{N%Q6^(Nq?HIbT>sdx;4Pn*Y{yd*>WUzf^dlS#G38vm;)%IVWsy+>eW3XfTm3}m5W56g%RA^+KTwM6B82?_vL8b$=TV6fIp73H~mJ|mbemNzWQb1!SeC`=H?%z z)p40CLSx*~Y2yuOxo0(9h$I!pz$yM2V9tM5(zc#0w+8i8(I@_$i!r#o@*qHN4qnE< z%Wt~d?jDD)y(_8X8C9xgA60S9Yzs0hsT0jpUnJJC=SSoGAWm_*&E;`w}!&6oQxO90ycM^H!Kft0i%Bfx&dqH(=ljC!%PZpO} zISNh!NI$ISa{>nD59l~r@0Lp^J z?Ui6pQecw$&ilmY`3?WPo@u=MZEI_rx@6eWrd2Gl)nv@*zIi3{El`LjfUm&|^n0Ie|Iq@S=BD0*vz`C&zogecXY8wmPBjCp3wyvy0#~&}+h}{yT88>_lb4qY3ERr|y! zE}jt=I*x;nht&u0w#Lcm(F(A}?oAzJ?B>FH*?z1%kY38&GO(yIzGhL#*5i9AEV>PJ@BL3KwVW)PU9yw~Lr?Jm4dFH-{SNz4*$Pv8frYW53g>{~q*s{@3f z6bJWnyNko^J`|xT3!QSxr4DgIbzJaAX4l%bg{Rg2BdabGW^tF9)^8RCGEou`m2G%j zDlCYFuZ(*d9a_jgjqPRGQ1F^`6elSR7~m!SwJJ0D#hr25)|YwHrn}9Sh6-~fAPb`T z$`~rJ^5Eh`R6q{=$cX0EUwpyvLiIyUv12tFe^pF*Fx6RnQB~kdZ_@(Eiq^G-pql_< zd+FM2)sidxoDUWY48uo-NZMP_2C5DFFYK3KC zP!By3&K;MbzG&=AK$pplUy{1DZllbn;dr=1Wy|i9mjA}**6;+{vS^ZUe#w}??85z= z9k190W96Zzp4fU_-;+t#hoktEuwj1jQa-Jpq9U&O_4*5mg6B8AaYt1z0ik>AlB7IzEzD-7YK6_-hf-7{5JxAO zpCl3-<6=~*_vU7r#(wT7qZDR_&SQ7P<01d0oXxcb-y z2eV*~+P!}V@@R*UkoAdDts`8 zR4S|to~5;?`(}L^Yotz}$8GRmPDAwbj^&y-mPf)_gBHYxJiA#{gSb(PLYy}N0T1KC zsGF2t3L_IivX*{h+}zEZ##<^782Z!LYF`~#XOO_LL8#O(BMKwW zkr4aSYx3|od;yqtq-1{aH##2GNBr|rn`+IGDPkqPvvuX=xDXA2hsi&vVFS6BuAyQJcgZc%Agn;B$@Ap{#{Xjgu*(vgo1r4oKb6~W4@<%}bN1Qp+5 z6iB{N!h}r{VYA=T{0dKYaz-WC+kak90$dRS(;d{2!t;`!-mI5bC)?BUf#O7S3!uC@ zc|-+YQ4o^%Dh3Je Date: Thu, 31 Jul 2008 08:06:09 +0000 Subject: [PATCH 37/58] Ignore any files in an __MACOSX folder in a zip file, as these are metadata files added by the MAC OS X zip tool. --- app/models/trace.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/trace.rb b/app/models/trace.rb index cb49ba62c..a0ec22dee 100644 --- a/app/models/trace.rb +++ b/app/models/trace.rb @@ -158,7 +158,7 @@ class Trace < ActiveRecord::Base elsif bzipped system("bunzip2 -c #{trace_name} > #{tmpfile.path}") elsif zipped - system("unzip -p #{trace_name} > #{tmpfile.path}") + system("unzip -p #{trace_name} -x '__MACOSX/*' > #{tmpfile.path}") end tmpfile.unlink From b0f0a2627d66386272c143addb3389e7ad587396 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Thu, 31 Jul 2008 22:48:12 +0000 Subject: [PATCH 38/58] Potlatch 0.10b --- app/controllers/amf_controller.rb | 39 +++++++++++++++++++++--------- public/potlatch/potlatch.swf | Bin 150828 -> 152966 bytes 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index f3bd2b6cd..51e49849f 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -22,11 +22,6 @@ # return(-2,"message") <-- also asks the user to e-mail me # # To write to the Rails log, use RAILS_DEFAULT_LOGGER.info("message"). -# -# == To do -# -# - Check authentication -# - Check the right things are being written to the database! class AmfController < ApplicationController require 'stringio' @@ -73,6 +68,7 @@ class AmfController < ApplicationController when 'getrelation'; results[index]=AMF.putdata(index,getrelation(args[0].to_i)) when 'getway_old'; results[index]=AMF.putdata(index,getway_old(args[0].to_i,args[1].to_i)) when 'getway_history'; results[index]=AMF.putdata(index,getway_history(args[0].to_i)) + when 'getnode_history'; results[index]=AMF.putdata(index,getnode_history(args[0].to_i)) when 'putway'; r=putway(renumberednodes,*args) renumberednodes=r[3] if r[1] != r[2] @@ -83,7 +79,7 @@ class AmfController < ApplicationController when 'findrelations'; results[index]=AMF.putdata(index,findrelations(*args)) when 'deleteway'; results[index]=AMF.putdata(index,deleteway(args[0],args[1].to_i)) when 'putpoi'; results[index]=AMF.putdata(index,putpoi(*args)) - when 'getpoi'; results[index]=AMF.putdata(index,getpoi(args[0].to_i)) + when 'getpoi'; results[index]=AMF.putdata(index,getpoi(*args)) end end @@ -192,15 +188,30 @@ class AmfController < ApplicationController [0, id, points, old_way.tags, old_way.version] end - # Find history of a way. Returns an array of previous versions. + # Find history of a way. Returns 'way', id, and + # an array of previous versions. def getway_history(wayid) #:doc: - history = Way.find(wayid).old_ways.collect do |old_way| + history = Way.find(wayid).old_ways.reverse.collect do |old_way| user = old_way.user.data_public? ? old_way.user.display_name : 'anonymous' - [old_way.version, old_way.timestamp.strftime("%d %b %Y, %H:%M"), old_way.visible ? 1 : 0, user] + uid = old_way.user.data_public? ? old_way.user.id : 0 + [old_way.version, old_way.timestamp.strftime("%d %b %Y, %H:%M"), old_way.visible ? 1 : 0, user, uid] end - [history] + ['way',wayid,history] + end + + # Find history of a node. Returns 'node', id, and + # an array of previous versions. + + def getnode_history(nodeid) #:doc: + history = Node.find(nodeid).old_nodes.reverse.collect do |old_node| + user = old_node.user.data_public? ? old_node.user.display_name : 'anonymous' + uid = old_node.user.data_public? ? old_node.user.id : 0 + [old_node.timestamp.to_i, old_node.timestamp.strftime("%d %b %Y, %H:%M"), old_node.visible ? 1 : 0, user, uid] + end + + ['node',nodeid,history] end # Get a relation with all tags and members. @@ -427,8 +438,12 @@ class AmfController < ApplicationController # # Returns array of id, long, lat, hash of tags. - def getpoi(id) #:doc: - n = Node.find(id) + def getpoi(id,timestamp) #:doc: + if timestamp>0 then + n = OldNode.find(id, :conditions=>['UNIX_TIMESTAMP(timestamp)=?',timestamp]) + else + n = Node.find(id) + end if n return [n.id, n.lon, n.lat, n.tags_as_hash] diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index eaa1ff76fa1a7323082dea5cf611c4ba3a056ec4..9929687e83fc395e51c95407547b36639a308178 100755 GIT binary patch delta 46104 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

    Hi,

    + +

    Someone (hopefully you) would like to change their email address over at + <%= SERVER_URL %> to <%= @address %>.

    + +

    If this is you, please click the link below to confirm the change.

    + +

    <%= @url %>

    diff --git a/app/views/notifier/email_confirm.text.plain.rhtml b/app/views/notifier/email_confirm.text.plain.rhtml new file mode 100644 index 000000000..28589dfbc --- /dev/null +++ b/app/views/notifier/email_confirm.text.plain.rhtml @@ -0,0 +1,8 @@ +Hi, + +Someone (hopefully you) would like to change their email address over at +<%= SERVER_URL %> to <%= @address %>. + +If this is you, please click the link below to confirm the change. + +<%= @url %> diff --git a/app/views/user/account.rhtml b/app/views/user/account.rhtml index d8afa4999..501af7494 100644 --- a/app/views/user/account.rhtml +++ b/app/views/user/account.rhtml @@ -2,7 +2,7 @@ <%= error_messages_for 'user' %> <% form_for :user, @user do |f| %> - + diff --git a/app/views/user/confirm_email.rhtml b/app/views/user/confirm_email.rhtml new file mode 100644 index 000000000..785297ec6 --- /dev/null +++ b/app/views/user/confirm_email.rhtml @@ -0,0 +1,8 @@ +

    Confirm a change of email address

    + +

    Press the confirm button below to confirm your new email address.

    + + + + + diff --git a/db/migrate/014_add_new_email.rb b/db/migrate/014_add_new_email.rb new file mode 100644 index 000000000..4077b7ca3 --- /dev/null +++ b/db/migrate/014_add_new_email.rb @@ -0,0 +1,9 @@ +class AddNewEmail < ActiveRecord::Migration + def self.up + add_column "users", "new_email", :string + end + + def self.down + remove_column "users", "new_email" + end +end From 967f44ffac7dfbbc91dabd8dc221be22e4ba0606 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 13 Aug 2008 11:44:53 +0000 Subject: [PATCH 47/58] Don't user flash[:notice] when we're not redirecting as it will persist to the next request and cause confusion. --- app/controllers/user_controller.rb | 25 +++++++++++-------------- app/views/layouts/site.rhtml | 4 ++-- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 26c56132c..2bb4eb577 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -45,13 +45,11 @@ class UserController < ApplicationController if @user.save if params[:user][:email] == @user.new_email - flash[:notice] = "User information updated successfully. Check your email for a note to confirm your new email address." + @notice = "User information updated successfully. Check your email for a note to confirm your new email address." Notifier.deliver_email_confirm(@user, @user.tokens.create) else - flash[:notice] = "User information updated successfully." + @notice = "User information updated successfully." end - else - flash.delete(:notice) end end end @@ -81,12 +79,10 @@ class UserController < ApplicationController if user token = user.tokens.create Notifier.deliver_lost_password(user, token) - flash[:notice] = "Sorry you lost it :-( but an email is on its way so you can reset it soon." + @notice = "Sorry you lost it :-( but an email is on its way so you can reset it soon." else - flash[:notice] = "Couldn't find that email address, sorry." + @notice = "Couldn't find that email address, sorry." end - else - render :action => 'lost_password' end end @@ -109,6 +105,7 @@ class UserController < ApplicationController flash[:notice] = "Didn't find that token, check the URL maybe?" end end + redirect_to :action => 'login' end @@ -131,9 +128,9 @@ class UserController < ApplicationController end return elsif User.authenticate(:username => email_or_display_name, :password => pass, :inactive => true) - flash[:notice] = "Sorry, your account is not active yet.
    Please click on the link in the account confirmation email to activate your account." + @notice = "Sorry, your account is not active yet.
    Please click on the link in the account confirmation email to activate your account." else - flash[:notice] = "Sorry, couldn't log in with those details." + @notice = "Sorry, couldn't log in with those details." end end end @@ -167,7 +164,7 @@ class UserController < ApplicationController session[:user] = @user.id redirect_to :action => 'account', :display_name => @user.display_name else - flash[:notice] = 'Something went wrong confirming that user.' + @notice = 'Something went wrong confirming that user.' end end end @@ -187,7 +184,7 @@ class UserController < ApplicationController session[:user] = @user.id redirect_to :action => 'account', :display_name => @user.display_name else - flash[:notice] = 'Something went wrong confirming that email address.' + @notice = 'Something went wrong confirming that email address.' end end end @@ -244,6 +241,7 @@ class UserController < ApplicationController else flash[:notice] = "You are already friends with #{name}." end + redirect_to :controller => 'user', :action => 'view' end end @@ -258,9 +256,8 @@ class UserController < ApplicationController else flash[:notice] = "#{friend.display_name} was not already one of your friends." end + redirect_to :controller => 'user', :action => 'view' end end - end - diff --git a/app/views/layouts/site.rhtml b/app/views/layouts/site.rhtml index 4b41e5e9e..7aa2db7b9 100644 --- a/app/views/layouts/site.rhtml +++ b/app/views/layouts/site.rhtml @@ -11,8 +11,8 @@
    - <% if flash[:notice] %> -
    <%= flash[:notice] %>
    + <% if @notice || flash[:notice] %> +
    <%= @notice || flash[:notice] %>
    <% end %> <%= yield %> From 1fb4e929bdf420f1712e0d1b1b25f10cd3024000 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 18 Aug 2008 07:28:26 +0000 Subject: [PATCH 48/58] Commit new route for email confirmation changes. --- config/routes.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/routes.rb b/config/routes.rb index 2ff56af39..4a9d0173d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -78,6 +78,7 @@ ActionController::Routing::Routes.draw do |map| map.connect '/user/new', :controller => 'user', :action => 'new' map.connect '/user/save', :controller => 'user', :action => 'save' map.connect '/user/confirm', :controller => 'user', :action => 'confirm' + map.connect '/user/confirm-email', :controller => 'user', :action => 'confirm_email' map.connect '/user/go_public', :controller => 'user', :action => 'go_public' map.connect '/user/reset-password', :controller => 'user', :action => 'reset_password' map.connect '/user/upload-image', :controller => 'user', :action => 'upload_image' From 3b6d2c5336eac35912909c9102c77bf6472901e6 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Thu, 21 Aug 2008 21:40:23 +0000 Subject: [PATCH 49/58] edit diary entries --- app/controllers/diary_entry_controller.rb | 19 +++++- app/views/diary_entry/_diary_entry.rhtml | 6 +- app/views/diary_entry/edit.rhtml | 79 +++++++++++++++++++++++ config/routes.rb | 1 + 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 app/views/diary_entry/edit.rhtml diff --git a/app/controllers/diary_entry_controller.rb b/app/controllers/diary_entry_controller.rb index c0d7204d5..0ad71da17 100644 --- a/app/controllers/diary_entry_controller.rb +++ b/app/controllers/diary_entry_controller.rb @@ -2,7 +2,7 @@ class DiaryEntryController < ApplicationController layout 'site', :except => :rss before_filter :authorize_web - before_filter :require_user, :only => [:new] + before_filter :require_user, :only => [:new, :edit] before_filter :check_database_availability def new @@ -16,6 +16,23 @@ class DiaryEntryController < ApplicationController end end + def edit + @title= 'edit diary entry' + @diary_entry = DiaryEntry.find(params[:id]) + if @user != @diary_entry.user + redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id] + end + if params[:diary_entry] + @diary_entry.title = params[:diary_entry][:title] + @diary_entry.body = params[:diary_entry][:body] + @diary_entry.latitude = params[:diary_entry][:latitude] + @diary_entry.longitude = params[:diary_entry][:longitude] + if @diary_entry.save + redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id] + end + end + end + def comment @entry = DiaryEntry.find(params[:id]) @diary_comment = @entry.diary_comments.build(params[:diary_comment]) diff --git a/app/views/diary_entry/_diary_entry.rhtml b/app/views/diary_entry/_diary_entry.rhtml index 372ec35f7..fe73155ac 100644 --- a/app/views/diary_entry/_diary_entry.rhtml +++ b/app/views/diary_entry/_diary_entry.rhtml @@ -3,13 +3,17 @@ <% if diary_entry.latitude and diary_entry.longitude %> Coordinates:
    <%= diary_entry.latitude %>; <%= diary_entry.longitude %>
    (<%=link_to 'map', :controller => 'site', :action => 'index', :lat => diary_entry.latitude, :lon => diary_entry.longitude, :zoom => 14 %> / <%=link_to 'edit', :controller => 'site', :action => 'edit', :lat => diary_entry.latitude, :lon => diary_entry.longitude, :zoom => 14 %>)
    <% end %> -Posted by <%= link_to h(diary_entry.user.display_name), :controller => 'user', :action => 'view', :display_name => diary_entry.user.display_name %> at <%= diary_entry.created_at %>
    +Posted by <%= link_to h(diary_entry.user.display_name), :controller => 'user', :action => 'view', :display_name => diary_entry.user.display_name %> at <%= diary_entry.created_at %> <% if params[:action] == 'list' %> +
    <%= link_to 'Comment on this entry', :action => 'view', :display_name => diary_entry.user.display_name, :id => diary_entry.id, :anchor => 'newcomment' %> | <%= link_to 'Reply to this entry', :controller => 'message', :action => 'new', :user_id => diary_entry.user.id, :title => "Re: #{diary_entry.title}" %> | <%= link_to pluralize(diary_entry.diary_comments.count, "comment"), :action => 'view', :display_name => diary_entry.user.display_name, :id => diary_entry.id, :anchor => 'comments' %> <% end %> +<% if @user == diary_entry.user %> +| <%= link_to 'Edit this entry', :action => 'edit', :display_name => @user.display_name, :id => diary_entry.id %> +<% end %>

    diff --git a/app/views/diary_entry/edit.rhtml b/app/views/diary_entry/edit.rhtml new file mode 100644 index 000000000..0a5203a66 --- /dev/null +++ b/app/views/diary_entry/edit.rhtml @@ -0,0 +1,79 @@ +<%= error_messages_for 'diary_entry' %> + +<% form_for :diary_entry do |f| %> +
    Email<%= @user.email %>
    Email<%= f.text_field :email %>
    Mapper since<%= @user.creation_time %> (<%= time_ago_in_words(@user.creation_time) %> ago)
    Display Name<%= f.text_field :display_name %>
    Password<%= f.password_field :pass_crypt, {:value => '', :size => 50, :maxlength => 255} %>
    + + + + + + + + + + + + + + + + +
    Subject<%= f.text_field :title, :size => 60 %>
    Body<%= f.text_area :body, :cols => 80 %>
    Location + + Latitude: <%= f.text_field :latitude, :size => 20, :id => "latitude" %> Longitude: <%= f.text_field :longitude, :size => 20, :id => "longitude" %> + use map +
    <%= submit_tag 'Save' %>
    +<% end %> + +<% if @user.home_lat.nil? or @user.home_lon.nil? %> + <% lon = h(params['lon'] || '-0.1') %> + <% lat = h(params['lat'] || '51.5') %> + <% zoom = h(params['zoom'] || '4') %> +<% else %> + <% lon = @user.home_lon %> + <% lat = @user.home_lat %> + <% zoom = '12' %> +<% end %> + +<%= javascript_include_tag '/openlayers/OpenLayers.js' %> +<%= javascript_include_tag '/openlayers/OpenStreetMap.js' %> +<%= javascript_include_tag 'map.js' %> + + diff --git a/config/routes.rb b/config/routes.rb index 4a9d0173d..7a06445ea 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -130,6 +130,7 @@ ActionController::Routing::Routes.draw do |map| map.connect '/user/:display_name/diary/:id/newcomment', :controller => 'diary_entry', :action => 'comment', :id => /\d+/ map.connect '/user/:display_name/diary/rss', :controller => 'diary_entry', :action => 'rss' map.connect '/user/:display_name/diary/newpost', :controller => 'diary_entry', :action => 'new' + map.connect '/user/:display_name/diary/:id/edit', :controller => 'diary_entry', :action => 'edit', :id => /\d+/ map.connect '/user/:display_name/account', :controller => 'user', :action => 'account' map.connect '/user/:display_name/set_home', :controller => 'user', :action => 'set_home' map.connect '/diary', :controller => 'diary_entry', :action => 'list' From 791062569dfca01a405637fa9ba142c222d3310c Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 24 Aug 2008 15:12:20 +0000 Subject: [PATCH 50/58] Tidy up diary code a bit. --- app/controllers/diary_entry_controller.rb | 21 ++++-- app/views/diary_entry/edit.rhtml | 2 + app/views/diary_entry/list.rhtml | 4 +- app/views/diary_entry/new.rhtml | 79 ----------------------- app/views/user/view.rhtml | 2 +- config/routes.rb | 2 +- 6 files changed, 20 insertions(+), 90 deletions(-) delete mode 100644 app/views/diary_entry/new.rhtml diff --git a/app/controllers/diary_entry_controller.rb b/app/controllers/diary_entry_controller.rb index 0ad71da17..21c817414 100644 --- a/app/controllers/diary_entry_controller.rb +++ b/app/controllers/diary_entry_controller.rb @@ -6,30 +6,37 @@ class DiaryEntryController < ApplicationController before_filter :check_database_availability def new - @title = 'new diary entry' + @title = 'New diary entry' + if params[:diary_entry] @diary_entry = DiaryEntry.new(params[:diary_entry]) @diary_entry.user = @user + if @diary_entry.save redirect_to :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name + else + render :action => 'edit' end + else + render :action => 'edit' end end def edit - @title= 'edit diary entry' + @title= 'Edit diary entry' @diary_entry = DiaryEntry.find(params[:id]) + if @user != @diary_entry.user - redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id] - end - if params[:diary_entry] + redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id] + elsif params[:diary_entry] @diary_entry.title = params[:diary_entry][:title] @diary_entry.body = params[:diary_entry][:body] @diary_entry.latitude = params[:diary_entry][:latitude] @diary_entry.longitude = params[:diary_entry][:longitude] + if @diary_entry.save redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id] - end + end end end @@ -44,7 +51,7 @@ class DiaryEntryController < ApplicationController render :action => 'view' end end - + def list if params[:display_name] @this_user = User.find_by_display_name(params[:display_name]) diff --git a/app/views/diary_entry/edit.rhtml b/app/views/diary_entry/edit.rhtml index 0a5203a66..87f5e9fac 100644 --- a/app/views/diary_entry/edit.rhtml +++ b/app/views/diary_entry/edit.rhtml @@ -1,3 +1,5 @@ +

    <%= @title %>

    + <%= error_messages_for 'diary_entry' %> <% form_for :diary_entry do |f| %> diff --git a/app/views/diary_entry/list.rhtml b/app/views/diary_entry/list.rhtml index e648e46f2..7a2ccf74d 100644 --- a/app/views/diary_entry/list.rhtml +++ b/app/views/diary_entry/list.rhtml @@ -8,11 +8,11 @@ <% if @this_user %> <% if @user == @this_user %> - <%= link_to 'New diary post', :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %> + <%= link_to 'New diary entry', :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %> <% end %> <% else %> <% if @user %> - <%= link_to 'New diary post', :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %> + <%= link_to 'New diary entry', :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %> <% end %> <% end %> diff --git a/app/views/diary_entry/new.rhtml b/app/views/diary_entry/new.rhtml deleted file mode 100644 index 0a5203a66..000000000 --- a/app/views/diary_entry/new.rhtml +++ /dev/null @@ -1,79 +0,0 @@ -<%= error_messages_for 'diary_entry' %> - -<% form_for :diary_entry do |f| %> - - - - - - - - - - - - - - - - - -
    Subject<%= f.text_field :title, :size => 60 %>
    Body<%= f.text_area :body, :cols => 80 %>
    Location - - Latitude: <%= f.text_field :latitude, :size => 20, :id => "latitude" %> Longitude: <%= f.text_field :longitude, :size => 20, :id => "longitude" %> - use map -
    <%= submit_tag 'Save' %>
    -<% end %> - -<% if @user.home_lat.nil? or @user.home_lon.nil? %> - <% lon = h(params['lon'] || '-0.1') %> - <% lat = h(params['lat'] || '51.5') %> - <% zoom = h(params['zoom'] || '4') %> -<% else %> - <% lon = @user.home_lon %> - <% lat = @user.home_lat %> - <% zoom = '12' %> -<% end %> - -<%= javascript_include_tag '/openlayers/OpenLayers.js' %> -<%= javascript_include_tag '/openlayers/OpenStreetMap.js' %> -<%= javascript_include_tag 'map.js' %> - - diff --git a/app/views/user/view.rhtml b/app/views/user/view.rhtml index 3ee8ecb86..438de836d 100644 --- a/app/views/user/view.rhtml +++ b/app/views/user/view.rhtml @@ -3,7 +3,7 @@
    <% if @user and @this_user.id == @user.id %> <%= link_to 'my diary', :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %> -| <%= link_to 'new diary post', :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %> +| <%= link_to 'new diary entry', :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %> | <%= link_to 'my traces', :controller => 'trace', :action=>'mine' %> | <%= link_to 'my settings', :controller => 'user', :action => 'account', :display_name => @user.display_name %> <% else %> diff --git a/config/routes.rb b/config/routes.rb index 7a06445ea..f040e1c1d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -129,7 +129,7 @@ ActionController::Routing::Routes.draw do |map| map.connect '/user/:display_name/diary/:id', :controller => 'diary_entry', :action => 'view', :id => /\d+/ map.connect '/user/:display_name/diary/:id/newcomment', :controller => 'diary_entry', :action => 'comment', :id => /\d+/ map.connect '/user/:display_name/diary/rss', :controller => 'diary_entry', :action => 'rss' - map.connect '/user/:display_name/diary/newpost', :controller => 'diary_entry', :action => 'new' + map.connect '/user/:display_name/diary/new', :controller => 'diary_entry', :action => 'new' map.connect '/user/:display_name/diary/:id/edit', :controller => 'diary_entry', :action => 'edit', :id => /\d+/ map.connect '/user/:display_name/account', :controller => 'user', :action => 'account' map.connect '/user/:display_name/set_home', :controller => 'user', :action => 'set_home' From 34189cf761a871f366775843da580121b39b4e25 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 24 Aug 2008 16:53:42 +0000 Subject: [PATCH 51/58] Add basic support for logically deleting a user. --- app/controllers/application.rb | 2 +- app/controllers/diary_entry_controller.rb | 7 ++++--- app/controllers/trace_controller.rb | 2 +- app/controllers/user_controller.rb | 12 +++++++----- app/models/friend.rb | 4 ++-- app/models/user.rb | 6 +++--- db/migrate/015_add_user_visible.rb | 10 ++++++++++ 7 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 db/migrate/015_add_user_visible.rb diff --git a/app/controllers/application.rb b/app/controllers/application.rb index 918e4b617..ce13a6aa3 100644 --- a/app/controllers/application.rb +++ b/app/controllers/application.rb @@ -8,7 +8,7 @@ class ApplicationController < ActionController::Base def authorize_web if session[:user] - @user = User.find(session[:user]) + @user = User.find(session[:user], :conditions => "visible = 1") elsif session[:token] @user = User.authenticate(:token => session[:token]) session[:user] = @user.id diff --git a/app/controllers/diary_entry_controller.rb b/app/controllers/diary_entry_controller.rb index 21c817414..b425ef4b6 100644 --- a/app/controllers/diary_entry_controller.rb +++ b/app/controllers/diary_entry_controller.rb @@ -54,7 +54,8 @@ class DiaryEntryController < ApplicationController def list if params[:display_name] - @this_user = User.find_by_display_name(params[:display_name]) + @this_user = User.find_by_display_name(params[:display_name], :conditions => "visible = 1") + if @this_user @title = @this_user.display_name + "'s diary" @entry_pages, @entries = paginate(:diary_entries, @@ -76,7 +77,7 @@ class DiaryEntryController < ApplicationController def rss if params[:display_name] - user = User.find_by_display_name(params[:display_name]) + user = User.find_by_display_name(params[:display_name], :conditions => "visible = 1") if user @entries = DiaryEntry.find(:all, :conditions => ['user_id = ?', user.id], :order => 'created_at DESC', :limit => 20) @@ -99,7 +100,7 @@ class DiaryEntryController < ApplicationController end def view - user = User.find_by_display_name(params[:display_name]) + user = User.find_by_display_name(params[:display_name], :conditions => "visible = 1") if user @entry = DiaryEntry.find(:first, :conditions => ['user_id = ? AND id = ?', user.id, params[:id]]) diff --git a/app/controllers/trace_controller.rb b/app/controllers/trace_controller.rb index 41ff34303..899df05df 100644 --- a/app/controllers/trace_controller.rb +++ b/app/controllers/trace_controller.rb @@ -12,7 +12,7 @@ class TraceController < ApplicationController # from display name, pick up user id if one user's traces only display_name = params[:display_name] if target_user.nil? and !display_name.blank? - target_user = User.find(:first, :conditions => [ "display_name = ?", display_name]) + target_user = User.find(:first, :conditions => [ "visible = 1 and display_name = ?", display_name]) end # set title diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 2bb4eb577..d88de5ff3 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -13,6 +13,7 @@ class UserController < ApplicationController @title = 'create account' @user = User.new(params[:user]) + @user.visible = true @user.data_public = true @user.description = "" if @user.description.nil? @@ -75,7 +76,8 @@ class UserController < ApplicationController def lost_password @title = 'lost password' if params[:user] and params[:user][:email] - user = User.find_by_email(params[:user][:email]) + user = User.find_by_email(params[:user][:email], :conditions => "visible = 1") + if user token = user.tokens.create Notifier.deliver_lost_password(user, token) @@ -214,7 +216,7 @@ class UserController < ApplicationController end def view - @this_user = User.find_by_display_name(params[:display_name]) + @this_user = User.find_by_display_name(params[:display_name], :conditions => "visible = 1") if @this_user @title = @this_user.display_name @@ -227,7 +229,7 @@ class UserController < ApplicationController def make_friend if params[:display_name] name = params[:display_name] - new_friend = User.find_by_display_name(name) + new_friend = User.find_by_display_name(name, :conditions => "visible = 1") friend = Friend.new friend.user_id = @user.id friend.friend_user_id = new_friend.id @@ -249,12 +251,12 @@ class UserController < ApplicationController def remove_friend if params[:display_name] name = params[:display_name] - friend = User.find_by_display_name(name) + friend = User.find_by_display_name(name, :conditions => "visible = 1") if @user.is_friends_with?(friend) Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{friend.id}" flash[:notice] = "#{friend.display_name} was removed from your friends." else - flash[:notice] = "#{friend.display_name} was not already one of your friends." + flash[:notice] = "#{friend.display_name} is not one of your friends." end redirect_to :controller => 'user', :action => 'view' diff --git a/app/models/friend.rb b/app/models/friend.rb index 242b74251..d740a711c 100644 --- a/app/models/friend.rb +++ b/app/models/friend.rb @@ -1,4 +1,4 @@ class Friend < ActiveRecord::Base - belongs_to :user - + belongs_to :befriender, :class_name => "User", :foreign_key => :user_id + belongs_to :befriendee, :class_name => "User", :foreign_key => :friend_user_id end diff --git a/app/models/user.rb b/app/models/user.rb index 61c76898a..9b5bfd595 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -6,7 +6,7 @@ class User < ActiveRecord::Base has_many :messages, :foreign_key => :to_user_id, :order => 'sent_on DESC' has_many :new_messages, :class_name => "Message", :foreign_key => :to_user_id, :conditions => "message_read = 0", :order => 'sent_on DESC' has_many :sent_messages, :class_name => "Message", :foreign_key => :from_user_id, :order => 'sent_on DESC' - has_many :friends + has_many :friends, :include => :befriendee, :conditions => "users.visible = 1" has_many :tokens, :class_name => "UserToken" has_many :preferences, :class_name => "UserPreference" @@ -48,7 +48,7 @@ class User < ActiveRecord::Base end if user - user = nil unless user.active? or options[:inactive] + user = nil unless user.visible? and (user.active? or options[:inactive]) end token.update_attribute(:expiry, 1.week.from_now) if token and user @@ -80,7 +80,7 @@ class User < ActiveRecord::Base if self.home_lon and self.home_lat gc = OSM::GreatCircle.new(self.home_lat, self.home_lon) bounds = gc.bounds(radius) - nearby = User.find(:all, :conditions => "home_lat between #{bounds[:minlat]} and #{bounds[:maxlat]} and home_lon between #{bounds[:minlon]} and #{bounds[:maxlon]} and data_public = 1 and id != #{self.id}") + nearby = User.find(:all, :conditions => "visible = 1 and home_lat between #{bounds[:minlat]} and #{bounds[:maxlat]} and home_lon between #{bounds[:minlon]} and #{bounds[:maxlon]} and data_public = 1 and id != #{self.id}") nearby.delete_if { |u| gc.distance(u.home_lat, u.home_lon) > radius } nearby.sort! { |u1,u2| gc.distance(u1.home_lat, u1.home_lon) <=> gc.distance(u2.home_lat, u2.home_lon) } else diff --git a/db/migrate/015_add_user_visible.rb b/db/migrate/015_add_user_visible.rb new file mode 100644 index 000000000..3b14aad6b --- /dev/null +++ b/db/migrate/015_add_user_visible.rb @@ -0,0 +1,10 @@ +class AddUserVisible < ActiveRecord::Migration + def self.up + add_column "users", "visible", :boolean + User.update_all("visible = 1") + end + + def self.down + remove_column "users", "visible" + end +end From 3c85b2ceea7e030f580d3febfad9f2b0c3217303 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 24 Aug 2008 16:56:34 +0000 Subject: [PATCH 52/58] Fix migration. --- db/migrate/015_add_user_visible.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrate/015_add_user_visible.rb b/db/migrate/015_add_user_visible.rb index 3b14aad6b..d870dfffd 100644 --- a/db/migrate/015_add_user_visible.rb +++ b/db/migrate/015_add_user_visible.rb @@ -1,6 +1,6 @@ class AddUserVisible < ActiveRecord::Migration def self.up - add_column "users", "visible", :boolean + add_column "users", "visible", :boolean, :default => true, :null => false User.update_all("visible = 1") end From fd6ff4ef3b728064e731bc5d5cec53093011f70d Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 28 Aug 2008 23:09:42 +0000 Subject: [PATCH 53/58] Update for new cycle map location. --- public/openlayers/OpenStreetMap.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/openlayers/OpenStreetMap.js b/public/openlayers/OpenStreetMap.js index 1e65f5c76..7b33584af 100644 --- a/public/openlayers/OpenStreetMap.js +++ b/public/openlayers/OpenStreetMap.js @@ -171,11 +171,11 @@ OpenLayers.Layer.OSM.CycleMap = OpenLayers.Class(OpenLayers.Layer.OSM, { */ initialize: function(name, options) { var url = [ - "http://a.thunderflames.org/tiles/cycle/", - "http://b.thunderflames.org/tiles/cycle/", - "http://c.thunderflames.org/tiles/cycle/" + "http://a.andy.sandbox.cloudmade.com/tiles/cycle/", + "http://b.andy.sandbox.cloudmade.com/tiles/cycle/", + "http://c.andy.sandbox.cloudmade.com/tiles/cycle/" ]; - options = OpenLayers.Util.extend({ numZoomLevels: 17 }, options); + options = OpenLayers.Util.extend({ numZoomLevels: 18 }, options); var newArguments = [name, url, options]; OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); }, From d6b05a8da92af53ed978f32321b2b90fbc4405a6 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 7 Sep 2008 15:07:44 +0000 Subject: [PATCH 54/58] Run web authorisation for all non-api requests. Closes #1152. --- app/controllers/user_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index d88de5ff3..df2a799c3 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -2,7 +2,7 @@ class UserController < ApplicationController layout 'site' before_filter :authorize, :only => [:api_details, :api_gpx_files] - before_filter :authorize_web, :only => [:account, :go_public, :view, :diary, :make_friend, :remove_friend, :upload_image, :delete_image] + before_filter :authorize_web, :except => [:api_details, :api_gpx_files] before_filter :require_user, :only => [:set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image, :delete_image] before_filter :check_database_availability, :except => [:api_details, :api_gpx_files] before_filter :check_read_availability, :only => [:api_details, :api_gpx_files] From 4c2f24440d6a0aace106ea765ff99322ab3a55e4 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 9 Sep 2008 17:50:09 +0000 Subject: [PATCH 55/58] Add the noname layer to the main map. --- public/javascripts/map.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/public/javascripts/map.js b/public/javascripts/map.js index 291fd18fa..cd130c784 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -3,6 +3,15 @@ var map; var markers; var popup; +var nonamekeys = { + 'openstreetmap.org': '2f59745a6b525b4ebdb100891d5b6711', + 'www.openstreetmap.org': 'fd093e52f0965d46bb1c6c6281022199', + 'openstreetmap.com': '4c60e7f5f31c576a9bb8da71c8d61152', + 'www.openstreetmap.com': '142f25a0770a51a9a400b3513834a199', + 'openstreetmap.net': '687c58fd1d715596bfc94abe653d8ac0', + 'www.openstreetmap.net': '0bd1654141c85d30b9c2ccdb5302f2e4' +}; + OpenLayers._getScriptLocation = function () { return "/openlayers/"; } @@ -42,6 +51,18 @@ function createMap(divName, options) { }); map.addLayer(cyclemap); + var nonamekey = nonamekeys[document.domain]; + var noname = new OpenLayers.Layer.OSM("NoName", [ + "http://a.tile.cloudmade.com/" + nonamekey + "/3/256/", + "http://b.tile.cloudmade.com/" + nonamekey + "/3/256/", + "http://c.tile.cloudmade.com/" + nonamekey + "/3/256/" + ], { + displayOutsideMaxExtent: true, + wrapDateLine: true, + numZoomLevels: 19 + }); + map.addLayer(noname); + var maplint = new OpenLayers.Layer.OSM.Maplint("Maplint", { displayOutsideMaxExtent: true, wrapDateLine: true From eb7862b4c66b29c91fa9135252892cb07ad1afee Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Thu, 18 Sep 2008 17:04:28 +0000 Subject: [PATCH 56/58] Potlatch 0.10c --- config/potlatch/localised.yaml | 246 ++++++++++++++++++--------------- public/potlatch/potlatch.swf | Bin 152966 -> 155896 bytes 2 files changed, 137 insertions(+), 109 deletions(-) diff --git a/config/potlatch/localised.yaml b/config/potlatch/localised.yaml index 19baf7d60..4eeba38e4 100644 --- a/config/potlatch/localised.yaml +++ b/config/potlatch/localised.yaml @@ -33,9 +33,9 @@ action_addpoint: "it": adding a node to the end of a way "ja": wayの終端にnodeを追加 "lolcat": addin a noeded ta teh end uv a wai - "no": adding a node to the end of a way + "no": legger til et punkt på enden av en vei "pt-br": Adicionando um nó ao fim do caminho - "ru": добавить точку в конец линии + "ru": добавление точки в конец линии "sv": lägger till en punkt på slutet av en väg "zh-hans": adding a node to the end of a way action_cancelchanges: @@ -44,10 +44,10 @@ action_cancelchanges: "fi": peruutetaan muutokset "fr": annulation de la modification "hu": Módosítások elvetése a következőre - "it": cancelling changes to + "it": annullando modifiche a "ja": 変更を中止 "lolcat": cancellin chanzes ta - "no": cancelling changes to + "no": avbryter endringer av "pt-br": Cancelando as mudanças de "ru": отмена изменений к "sv": avbryter ändringar på @@ -72,12 +72,12 @@ action_deletepoint: "fi": pisteen poistaminen "fr": suppression d'un point "hu": pont törlésének - "it": deleting a point + "it": sto cancellando un punto "ja": pointを削除 "lolcat": deletin a noed - "no": deleting a point + "no": sletter et punkt "pt-br": Apagando um ponto - "ru": удаляю точку + "ru": удаление точки "sv": Tar bort en punkt "zh-hans": deleting a point action_insertnode: @@ -89,9 +89,9 @@ action_insertnode: "it": adding a node into a way "ja": wayの途中にnodeを追加 "lolcat": addin a noeded into a wai - "no": adding a node into a way + "no": legge til et punkt på veien "pt-br": Adicionando um nó em um caminho - "ru": добавляю точку в линию + "ru": добавление точки в линию "sv": lägger till en punkt till en väg "zh-hans": adding a node into a way action_mergeways: @@ -100,12 +100,12 @@ action_mergeways: "fi": kahden tien yhdistäminen "fr": Joindre deux chemins "hu": két vonal egyesítése - "it": merging two ways + "it": sto unendo due percorsi "ja": 2つのwayを結合 - "lolcat": mergin too waiz + "lolcat": mergin bowf waiz "no": slår sammen to veier "pt-br": Mesclando dois caminhos - "ru": соединяю две линии + "ru": соединие двух линий "sv": Slå samman två vägar "zh-hans": merging two ways action_movepoi: @@ -114,7 +114,7 @@ action_movepoi: "fi": "POI:n siirtäminen" "fr": déplacer un POI "hu": POI mozgatásának - "it": moving a POI + "it": sto muovendo un PDI "ja": POIを移動 "lolcat": movin a plase "no": flytter et POI (interessant punkt) @@ -157,10 +157,10 @@ action_pointtags: "hu": pont címkéi állításának "it": setting tags on a point "ja": pointにtagを設定 - "lolcat": settin tagz awn a noed - "no": setting tags on a point + "lolcat": In ur noed, settin teh tagz + "no": sette merker på et punkt "pt-br": Ajustando tags (rótulos) em um ponto - "ru": установка тегов для точки + "ru": установку тегов для точки "sv": lägger till taggar på en punkt "zh-hans": setting tags on a point action_poitags: @@ -171,10 +171,10 @@ action_poitags: "hu": POI címkéi állításának "it": setting tags on a POI "ja": POIにtagを設定 - "lolcat": settin tagz awn a plase - "no": setting tags on a POI + "lolcat": In ur plase, settin teh tagz + "no": sette merker på et POI (interessant punkt) "pt-br": Ajustando tags (rótulos) em um ponto de interesse (POI) - "ru": установка тегов для точки интереса (POI) + "ru": установку тегов для точки интереса (POI) "sv": lägger till taggar på en POI "zh-hans": setting tags on a POI action_reverseway: @@ -186,7 +186,7 @@ action_reverseway: "it": reversing a way "ja": wayを反転 "lolcat": reversin a wai - "no": reversing a way + "no": snur en vei bak fram "pt-br": Invertendo um caminho "ru": изменение направления линии "sv": Byter rikting på en väg @@ -200,7 +200,7 @@ action_splitway: "it": splitting a way "ja": wayを分割 "lolcat": spleettin a wai - "no": splitting a way + "no": dele en vei "pt-br": Dividindo um caminho "ru": разбиение линии "sv": delar upp en väg @@ -213,10 +213,10 @@ action_waytags: "hu": vonal címkéi állításának "it": setting tags on a way "ja": wayにtagを設定 - "lolcat": settin tagz awn a wai - "no": setting tags on a way + "lolcat": In ur wai, settin teh tagz + "no": sette merker på en vei "pt-br": Ajustando tags (rótulos) em um caminho - "ru": установка тегов для линии + "ru": установку тегов для линии "sv": lägger till taggar på en väg "zh-hans": setting tags on a way add: @@ -228,7 +228,7 @@ add: "it": Add "ja": 追加 "lolcat": Add - "no": Add + "no": Legg til "pt-br": Adicionar "ru": Добавить "sv": Lägg till @@ -239,7 +239,7 @@ cancel: "fi": Peru "fr": Annuler "hu": Mégse - "it": Cancel + "it": Annulla "ja": 中止 "lolcat": Noes! "no": Avbryt @@ -255,8 +255,8 @@ createrelation: "hu": Új kapcsolat létrehozása "it": Create a new relation "ja": 新しいrelationを作成 - "lolcat": Creaet a new relashun - "no": Create a new relation + "lolcat": Creaet a noo relashun + "no": Lag en ny relasjon "pt-br": Criar uma nova relação "ru": Создать новое отношение "sv": Skapa en ny relation @@ -280,12 +280,12 @@ deleting: "fi": poistaminen "fr": suppression "hu": törlés - "it": deleting + "it": cancellando "ja": 削除 "lolcat": deletin - "no": deleting + "no": sletter "pt-br": Apagando - "ru": удаляю + "ru": удаление "sv": Tar bort "zh-hans": deleting dontshowagain: @@ -294,9 +294,9 @@ dontshowagain: "fi": Älä näytä tätä viestiä enää. "fr": Ne plus afficher ce message "hu": Ez az üzenet ne jelenjen meg újra - "it": Don't show this message again + "it": Non mostrare più questo messaggio "ja": 次回からこのメッセージを表示しない。 - "lolcat": noes show dis messaeg agin + "lolcat": dis messig suxs. No more show "no": Ikke vis denne meldingen igjen "pt-br": Não mostre esta mensagem novamente "ru": Не показывать это сообщение снова. @@ -310,7 +310,7 @@ editingmap: "it": Modalità modifica "ja": 地図編集中 "lolcat": Editin map - "no": Editerer kart + "no": Redigerer kart "pt-br": Editar o mapa "ru": Редактирование карты "sv": Kartera @@ -321,10 +321,10 @@ emailauthor: "fi": \n\nLähetäthän sähköpostia, jossa kerrot mitä olit tekemässä, osoitteeseen richard\@systemeD.net mieluiten englanniksi. "fr": \n\nMerci d'envoyer un e-mail a richard\@systemeD.net pour signaler ce bogue, en expliquant ce que vous faisiez quand il est survenu. "hu": \n\nKérlek, jelentsd a hibát (angolul) a richard\@systemeD.net e-mail címre, és írd le, hogy mit csináltál akkor, amikor a hiba történt. - "it": \n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time. + "it": \n\nPer cortesia invia un'e-mail a richard\@systemeD.net con la segnalazione dell'errore, descrivendo cosa stavi facendo nel momento in cui si è verificato. "ja": \n\nあなたがその時に何を行っていたかを書いたバグレポートを、 richard\@systemeD.net 宛てにe-mailで送付して下さい。 "lolcat": \n\NPLEAES e-male richard\@systemed.net wif a bug report, meaowin whut yoo werz doin at teh tyme. - "no": \n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time. + "no": \n\nVennligst send en epost (på engelsk) til richard\@systemeD.net med en feilrapport, og forklar hva du gjorde når det skjedde. "pt-br": \n\nFavor enviar um e-mail a richard\@systemeD.net com um relatório de erro, informando o que você estava fazendo na hora. "ru": "\n\nПожалуйста, отправьте сообщение об ошибке (на английском языке) на электронную почту: richard\@systemeD.net, с указанием того, какие действия вы совершали." "sv": \n\nVänligen e-posta richard\@systemeD.net med en felreport, som beskriver vad du gjorde när felet inträffade. @@ -335,10 +335,10 @@ error_connectionfailed: "fi": "Yhteys OSM-palvelimeen epäonnistui. Tuoreita muutoksia ei ole tallennettu.\n\nHaluatko yrittää uudestaan?" "fr": "Désolé, la connexion au serveur OpenStreetMap a échoué. Vos changements récents ne sont pas enregistrés.\n\nVoulez-vous réessayer ?" "hu": Bocs - az OpenStreetMap szerverhez való kapcsolódás sikertelen. A legutóbbi módosítások nem lettek elmentve.\n\nSzeretnéd megpróbálni újra? - "it": "Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?" + "it": "Mi dispiace - la connessione con il server di OpenStreetMap si è interrotta. Qualsiasi modifica recente non è stata salvata.\n\nVuoi riprovare?" "ja": 申し訳ありません。OpenStreetMapのサーバーへの接続に失敗しました。 直近の変更は保存されていません。\n\n再送信しますか? - "lolcat": "OHNOES! teh connecshun ta teh OPENSTREETMAP servah faileded. n e recent chanzes haz nawt bein saveded.\n\nwud yoo lieks ta tri agin?" - "no": "Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?" + "lolcat": "OHNOES! teh OPENSTREETMAP servah connecshun has a FAIL. I no saveded n e recent chanzes.\n\nYoo wants tri agin?" + "no": "Beklager - forbindelsen til OpenStreetMap-tjeneren feilet, eventuelle nye endringer har ikke blitt lagret.\n\nVil du prøve på nytt?" "pt-br": Sinto muito - a conexão ao servidor do OpenStreetMap falhou. Algumas alterações recentes não foram salvas.\n\nVocê gostaria de tentar novamente? "ru": "Извините, соединение с сервером OpenStreetMap разорвано. Все текущие изменения не были сохранены.\n\nПопробовать ещё раз?" "sv": "Tyvärr har vi tappat kontakten med OpenStreetMap serven. Nygjorda ändringar har inte kunnat sparas.\n\nFörsöka återansluta?" @@ -352,7 +352,7 @@ error_nopoi: "it": The POI cannot be found (perhaps you've panned away?) so I can't undo. "ja": 該当するPOIが見付からないため、取消ができませんでした。 (画面表示の範囲外になっていませんか?) "lolcat": "I had a plase but I losteded it, so noes can undo. :(" - "no": The POI cannot be found (perhaps you've panned away?) so I can't undo. + "no": Fant ikke POI-et, så det er ikke mulig å angre. (Kanskje den ikke er på skjermen lenger?) "pt-br": O ponto de interesse (POI) não foi encontrado (talvez você tenha mudado a sua posição?), por isso não posso desfazer. "ru": Точка интереса(POI) не найдена (возможно вы отошли в сторону?), поэтому невозможно отменить. "sv": "POI:n kan inte hittas (du kanske har flyttat den utanför bilden?) så det går inte att ångra." @@ -366,7 +366,7 @@ error_nosharedpoint: "it": Ways $1 and $2 don't share a common point any more, so I can't undo the split. "ja": $1 と $2 のwayは既に共通のpointを共有していないため、分割の取消ができませんでした。 "lolcat": waiz $1 adn $2 dun shaer a common point n e moar , sow I noes kan undo teh spleet. - "no": Ways $1 and $2 don't share a common point any more, so I can't undo the split. + "no": Veiene $1 og $2 deler ikke noe punkt lenger, så det er ikke mulig å angre. "pt-br": Caminhos $1 e $2 não compartilham mais um mesmo ponto, então a divisão não pode ser desfeita. "ru": Линии $1 и $2 больше не содержат общих точек, поэтому невозможно отменить разделение. "sv": Vägarna $1 och $2 möts inte i någon punkt längre, så det går inte att ångra delningen. @@ -380,20 +380,34 @@ error_noway: "it": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. "ja": $1 というwayが見付からないため、取消ができませんでした。 (画面表示の範囲外になっていませんか?) "lolcat": "I had a wai $1 but I losteded it, so noes can undo. :(" - "no": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. + "no": Fant ikke veien $1 så det er ikke mulig å angre. (Kanskje den ikke er på skjermen lenger?) "pt-br": Caminho $1 não foi encontrado (talvez você mudou a sua posição?), por isso não posso desfazer. "ru": Линия $1 не найдена (возможно вы отошли в сторону?), поэтому невозможно отменить. "sv": Vägen $1 kan inte hittas (du kanske har flyttat den utanför bilden?) så det går inte att ångra. "zh-hans": Way $1 cannot be found (perhaps you've panned away?) so I can't undo. +existingrelation: + "es": Añadir a relación existente + "hu": Hozzáadás egy meglévő kapcsolathoz + "ja": 既存のリレーションを追加 + "lolcat": Adds ta a relashun + "no": Legg til en relasjon som er her fra før + "ru": Добавить в существующее отношение +findrelation: + "es": Buscar una relación que contenga + "hu": "Kapcsolat keresése, amely tartalmazza:" + "ja": 以下に含まれるリレーションを検索 + "lolcat": Luks for a relashun wif + "no": Finn en relasjon som inneholder + "ru": Найти отношения gpxpleasewait: "de": Bitte warten, während die GPX-Aufzeichnung (Track) verarbeitet wird. "es": Por favor espere un poco mientras el track GPX se procesa. "fi": Odota. GPX-jälkeä käsitellään. "fr": Patientez pendant que la trace GPX est traitée. "hu": Kérlek, várj a GPX nyomvonal feldolgozásáig. - "it": Please wait while the GPX track is processed. + "it": Attendere mentre la traccia GPX viene elaborata. "ja": GPX trackが処理されるまで暫くお待ち下さい。 - "lolcat": Pleez wayt whiel teh GPX track iz processeded. + "lolcat": Pleez wayt whiel teh GPZ track iz processeded. "no": Vennligst vent mens sporloggen behandles. "pt-br": Favor aguardar enquanto a trilha GPX é processada. "ru": Пожалуйста, подождите — GPX-треки обрабатываются. @@ -405,9 +419,9 @@ help: "fi": Ohje "fr": Aide "hu": Súgó - "it": Help + "it": Aiuto "ja": ヘルプ - "lolcat": halp + "lolcat": Halp "no": Hjelp "pt-br": Ajuda "ru": Помощь @@ -419,12 +433,12 @@ hint_drawmode: "fi": klikkaa lisätäksesi piste\ntuplaklikkaa tai paina enter päättääksesi tien "fr": clic pour ajouter un point\ndouble-clic/Entrée\npour terminer le chemin "hu": kattintás pont hozzáadásához\ndupla kattintás/Enter\na vonal befejezéséhez - "it": click to add point\ndouble-click/Return\nto end line + "it": click per aggiungere un punto\ndoppio-click/Return\nper terminare una linea "ja": クリックしてpointを追加\nダブルクリック/Returnで\nline編集を終了 "lolcat": clik ta add point\ndouble-clik/Return\nto end lien "no": trykk for å legge til punkt\ndobbeltklikk eller enter\nfor å avslutte linje "pt-br": Clique para adicionar um ponto\nDuplo clique/Enter\npara finalizar a linha - "ru": кликните для добавления точки\nдвойной клик или Enter\nчтобы чтобы закончить линию + "ru": кликните для добавления точки,\nдвойной клик или Enter\nчтобы закончить линию "sv": Klicka för att lägga till en punkt\n Dubbelklicka för att avsluta vägen. "zh-hans": click to add point\ndouble-click/Return\nto end line hint_loading: @@ -433,9 +447,9 @@ hint_loading: "fi": ladataan teitä "fr": chargement des chemins en cours "hu": vonalak betöltése - "it": loading ways + "it": caricamento percorsi in corso "ja": wayを読み込んでいます。 - "lolcat": loadin waiz + "lolcat": NOM NOM NOM "no": laster veier "pt-br": Carregando caminhos "ru": загрузка линий @@ -447,7 +461,7 @@ hint_overendpoint: "fi": päätepisteen päällä\nklikkaa sulkeaksi\nshift-klikkaa yhdistääksesi "fr": sur le dernier point du tracé \nclick pour joindre\nshift-click pour fusionner "hu": végpont fölött\nkattintás a csatlakoztatáshoz\nshift+kattintás az egyesítéshez - "it": over endpoint\nclick to join\nshift-click to merge + "it": su punto terminale\nclick per congiungere\nshift-click per unire "ja": 終端のpoint上で\nクリックして接続\nshiftキーを押しながらクリックして結合 "lolcat": ovah endpoint\nclik ta join\nshift-clik ta merge "no": over endepunkt\ntrykk for å koble sammen\nshift+trykk for å slå sammen @@ -461,9 +475,9 @@ hint_overpoint: "fi": pisteen päällä\nklikkaa yhdistääksesi" "fr": point du dessus\nclick pour joindre" "hu": pont fölött\nkattintás a csatlakoztatáshoz - "it": over point\nclick to join" + "it": su punto\nclick per congiungere" "ja": point上で\nクリックして接続 - "lolcat": ovah point\nclik ta join" + "lolcat": I'M OVAH UR POINT\nCLICKIN TO JOIN "no": over punkt\ntrykk for å koble sammen "pt-br": Sobre o ponto\nclique para conectar "ru": над точкой\nclick для соединения" @@ -489,7 +503,7 @@ hint_toolong: "fi": "liian pitkä vapautettavaksi:\nkatkaise\nlyhyempiin teihin" "fr": "trop long pour débloquer la situation:\nscindez le chemin en\nchemins plus courts" "hu": "túl hosszú a feloldáshoz:\nkérlek, vágd szét\nrövidebb vonalakra" - "it": "too long to unlock:\nplease split into\nshorter ways" + "it": "troppo lungo per sbloccare:\ndividere in\npercorsi più brevi" "ja": "wayが長すぎるためunlockできません:\n短いwayに\n分割して下さい。" "lolcat": "too lawng ta unlok:\npleaes spleet into\nshortah waiz" "no": "for lang til å låse opp:\nvennligst del opp\ni mindre veier" @@ -497,6 +511,20 @@ hint_toolong: "ru": "слишком длинная линия для разблокировки:\пожалуйста, разбейте ее\nна более короткие линии" "sv": "för lång för att låsa upp:\ndela upp vägen\ni mindre delar" "zh-hans": "too long to unlock:\nplease split into\nshorter ways" +norelations: + "es": No hay relaciones en el área actual + "hu": Nincs kapcsolat a jelenlegi területen + "ja": 現在のエリアにリレーションはありません + "lolcat": I sees noes relashuns neer heer + "no": Ingen relasjoner i området på skjermen + "ru": Нет отношений в текущей области +ok: + "es": OK + "hu": OK + "ja": Ok + "lolcat": kthx + "no": Ok + "ru": Ok option_background: "de": "Hintergrund:" "es": "Fondo:" @@ -506,7 +534,7 @@ option_background: "it": "Background:" "ja": "背景:" "lolcat": "bakground:" - "no": "Background:" + "no": "Bakgrunn:" "pt-br": "Plano de fundo:" "ru": "Фон:" "sv": "Bakgrund:" @@ -519,8 +547,8 @@ option_custompointers: "hu": Toll és kéz egérmutatók használata "it": Use pen and hand pointers "ja": ペンのポインターと手のポインターを使用する - "lolcat": uz pen adn paw pointerz - "no": Use pen and hand pointers + "lolcat": I can has pen adn paw pointerz + "no": Bruk penn- og håndpekere "pt-br": Utilize os apontadores caneta e mão "ru": Использовать курсоры пера и руки "sv": Använd penna och handpekare @@ -534,7 +562,7 @@ option_fadebackground: "it": Fade background "ja": 背景を隠す "lolcat": Faeded bakground - "no": Fade background + "no": Fjern bakgrunn "pt-br": Esmaecer o plano de fundo "ru": Светлый фон "sv": Mattad bakgrund @@ -547,15 +575,15 @@ option_thinlines: "hu": Vékony vonalak használata minden méretaránynál "it": Use thin lines at all scales "ja": 全ての縮尺で細い線を使用する - "lolcat": uz thin linez at awl scalez - "no": Use thin lines at all scales + "lolcat": I can has thin linez at awl scalez + "no": Bruk tynne linjer uansett forstørrelse "pt-br": Utilize linhas finas em todas as escalas "ru": Использовать тонкие линии на всех масштабах "sv": Använd tunna linjer på alla skalor "zh-hans": Use thin lines at all scales play: "de": Üben - "es": Play + "es": Practicar "fr": S'entrainer "hu": Próba "it": Play @@ -585,7 +613,7 @@ practicemode: "fi": Harjoitustila "fr": Mode d'essai "hu": Gyakorló mód - "it": Practice mode + "it": Modalità esercitazione "ja": 練習モード "lolcat": Practiec moeded "no": Øvelsesmodus @@ -599,7 +627,7 @@ prompt_accuracy: "fi": "Tarkkuus on tärkeää: muokkaathan vain paikkoja, joissa olet ollut." "fr": Précision importante - Éditez seulement les lieux que vous avez visités "hu": A pontosság fontos - csak olyan helyeket szerkessz, ahol már jártál - "it": Accuracy is important - only map places you've been + "it": L'accuratezza è importante - mappa solo posti nei quali sei stato "ja": 正確さは大切です - 地図作りはあなたが行ったことのある場所だけにして下さい。 "lolcat": Want acoracie - ownlee map placez yuv bein! "no": Nøyaktighet er viktig, bare kartlegg steder du har besøkt @@ -616,7 +644,7 @@ prompt_addtorelation: "it": Add $1 to a relation "ja": relationに $1 を追加 "lolcat": Add $1 ta a relashun - "no": Add $1 to a relation + "no": Legg $1 til en relasjon "pt-br": Adicionar $1 a uma relação "ru": Добавить $1 в отношение "sv": Lägg till $1 till en relation @@ -627,9 +655,9 @@ prompt_dontcopy: "fi": Älä kopioi muista kartoista "fr": Ne copiez pas d'autre cartes "hu": Ne másolj más térképekből - "it": Don't copy from other maps + "it": Non copiare da altre mappe "ja": 他の地図から書き写してはいけません。 - "lolcat": Do not want copi frum uddah mapz! + "lolcat": Copi frum uddah mapz? DO NOT WANT "no": Ikke kopier fra andre kart "pt-br": Não copie de outros mapas "ru": Не копируйте информацию с других карт @@ -641,7 +669,7 @@ prompt_enjoy: "fi": Pidä hauskaa! "fr": Et amusez-vous bien ! "hu": És jó szórakozást! - "it": And have fun! + "it": E buon divertimento! "ja": そして何より、楽しみましょう! "lolcat": Adn can has cheezburger! "no": Og ha det morsomt! @@ -655,21 +683,21 @@ prompt_help: "fi": Kuinka käytän Potlatchiä, tätä editoria? "fr": Découvrez comment utiliser Potlatch, cet éditeur de la carte. "hu": Nézz utána, hogyan kell használni a Potlatch-ot, ezt a térképszerkesztőt. - "it": Find out how to use Potlatch, this map editor. + "it": Impara come usare Potlatch, questo editor di mappe. "ja": この地図編集ソフトウェア(Potlatch)の使い方を表示します。 "lolcat": Find owt hao ta uz Potlatch, dis map editerer. - "no": Find out how to use Potlatch, this map editor. + "no": Finn ut hvordan du bruker Potlatch, programmet for kartredigering. "pt-br": Descubra como utilizar o Potlatch, este editor de mapas. "ru": Узнать, как пользоваться редактором. "sv": Information hur man använder Potlatch, den här karteditorn. "zh-hans": Find out how to use Potlatch, this map editor. prompt_introduction: "de": "Bitte unten eine Schaltfläche anklicken, um mit dem Üben bzw. Editieren zu beginnen.\n\nStart: Jede Änderung wird sofort in der Datenbank gespeichert und wird beim nächsten Rendern berücksichtigt.\nÜben: Die Änderungen werden nicht gespeichert, es kann also nichts passieren. Bitte sicherstellen, dass unten rechts der Übungsmodus angezeigt wird.\n\nBeim Editieren bitte immer an die Goldenen Regeln von OpenStreetMap denken:\n\n" - "es": Seleccione uno de los botones más abajo para empezar a editar. Si pulsa "Empezar", estará editando directamente el mapa - Normalmente los cambios se mostrarán cada Jueves. Si pulsa "Jugar", sus cambios no se guardarán, de esta manera podrá practicar la edición.\n\nRecuerde las reglas de oro de OpenStreetMap:\n\n + "es": Seleccione uno de los botones más abajo para empezar a editar. Si pulsa "Empezar", estará editando directamente el mapa - Normalmente los cambios se mostrarán cada Jueves. Si pulsa "Practicar", sus cambios no se guardarán, de esta manera podrá practicar la edición.\n\nRecuerde las reglas de oro de OpenStreetMap:\n\n "fi": "Valitse haluamasi tila. Jos valitset aloita, pääset muokkaamaan karttaa suoraan - muutokset päivittyvät pääsivun kartalle yleensä torstaisin. Jos valitset harjoittele, tekemiäsi muutoksia ei tallenneta mihinkää, eli voit harjoitella editointia\n\nMuistathan OpenStreetMapin kultaiset säännöt:\n\n" "fr": "Choisir un bouton ci-dessous pour commencer l'édition. Si vous cliquez sur 'Start', vous éditerez directement la carte principale - les modifications sont visibles sur celle-ci généralement tous les jeudis. Si vous cliquez sur 'Play', vos modifications ne seront pas enregistrées, ainsi vous pouvez vous exercer sans risques.\n\nEt gardez en tête ces règles d'or d'OpenStreetMap :\n\n" "hu": "A szerkesztéshez válassz az alábbi gombok közül. Ha a 'Kezdés'-re kattintasz, akkor közvetlenül a főtérképet szerkesztheted - a módosítások általában minden csütörtökön jelennek meg. Ha a 'Próbá'-ra kattintasz, akkor a módosításaid nem lesznek elmentve, így gyakorolhatod a szerkesztést.\n\nEmlékezz az OpenStreetMap aranyszabályaira:\n\n" - "it": "Choose a button below to get editing. If you click 'Start', you'll be editing the main map directly - changes usually show up every Thursday. If you click 'Play', your changes won't be saved, so you can practise editing.\n\nRemember the golden rules of OpenStreetMap:\n\n" + "it": "Scegli un pulsante per iniziare la modifica. Cliccando 'Start', modificherai direttamente la mappa principale - le modifiche di solito sono visibili ogni giovedì. Cliccando su 'Play', le modifiche non saranno salvate, quindi potrai esercitarti.\n\nRicorda le regole d'oro di OpenStreetMap:\n\n" "ja": "編集を開始する前に下のボタンを選択して下さい。 - 『開始』をクリックするとOSMの地図を直接編集します。通常では毎週木曜日に変更が表示されるようになります。 - 『練習』をクリックすると変更は保存されませんので、地図の編集作業を練習することができます。\n\nOpenStreetMapの鉄則を忘れないで下さい:\n\n" "lolcat": "Clik ta getz editin. If yoo clik 'Staart', yoo'll b editin teh mane map - chanzes uzually show up evry Purrsdai! If yoo clik 'Plae', yur chanzes won't b saveded, sow yoo kan practies editin.\n\nCeiling Cat sais:\n\n" "no": "Velg en knapp nedenfor for å redigere. Hvis du velger 'Start' redigerer du kartet direkte, endringer blir vanligvis synlige hver torsdag. Hvis du velger 'Øve' lagres ikke endringer, så du kan øve deg på å redigere.\nHusk OpenStreetMaps gyldne regler:\n\n" @@ -683,7 +711,7 @@ prompt_practise: "fi": Harjoittele - muutoksiasi ei talleneta. "fr": "Essai de cartographie : vos changements ne seront pas pris en compte." "hu": Térképkészítés gyakorlása - módosításaid nem lesznek elmentve. - "it": Practice mapping - your changes won't be saved. + "it": Inizia l'esercitazione - le tue modifiche non saranno salvate. "ja": 地図の編集作業を練習します。 - あなたの変更は保存されません。 "lolcat": Invisibl mappur - yur chanzes wont b saveded. "no": Øv på kartlegging, endringer blir ikke lagret. @@ -697,9 +725,9 @@ prompt_revertversion: "fi": "Palauta aiempaan versioon:" "fr": "Revenir à une version sauvegardée plus récente :" "hu": "Visszaállítás egy korábbi mentett változatra:" - "it": "Revert to an earlier saved version:" + "it": "Ripristina una versione precedentemente salvata:" "ja": "以前に保存されたバージョンに差し戻す:" - "lolcat": "Revert ta a earliah saveded verzhun:" + "lolcat": plz to chooes vershun "no": "Tilbakestill til tidligere lagret versjon:" "pt-br": "Retornar a uma versão previamente salva:" "ru": "Восстановить ранее сохраненную версию:" @@ -713,8 +741,8 @@ prompt_selectrelation: "hu": A hozzáadáshoz válassz egy meglévő kapcsolatot, vagy készíts egy újat. "it": Select an existing relation to add to, or create a new relation. "ja": 追加又はrelationを新規作成するために既存のrelationを選択 - "lolcat": Select a existin relashun ta add ta, or creaet a new relashun. - "no": Select an existing relation to add to, or create a new relation. + "lolcat": Chooes a existin relashun ta add ta, or creaet a noo relashun. + "no": Velg en relasjon som allerede finnes, eller lag en ny relasjon "pt-br": Selecionar uma relação existente para adicionar a, ou criar, uma nova relação "ru": Выберете существующее отношение или создайте новое. "sv": Välj en befintlig relation att addera till, eller skapa en ny relation. @@ -723,9 +751,9 @@ prompt_start: "de": Kartographieren in OpenStreetMap beginnen "es": Empezar a mapear con OpenStreetMap. "fi": Aloita kartan muokkaus. - "fr": Démarrer la cartographie avec OpenStreetMap. + "fr": Commencer à cartographier dans Openstreetmap "hu": Térképkészítés kezdése OpenStreetMappal. - "it": Start mapping with OpenStreetMap. + "it": Inizia a mappare con OpenStreetMap. "ja": OpenStreetMapの地図の編集作業を開始します。 "lolcat": staart mappin wif OPENSTREETMAP. "no": Begynn å kartlegge med OpenStreetMap. @@ -742,7 +770,7 @@ prompt_taggedpoints: "it": Some of the points on this way are tagged. Really delete? "ja": このwayに含まれているpointのいくつかにtagが付けられています。 本当に削除しますか? "lolcat": sum uv teh pointz awn dis wai iz taggeded. reelee deleet? - "no": Some of the points on this way are tagged. Really delete? + "no": Noen av punktene på denne veien er merket. Vil du virkelig slette? "pt-br": Alguns dos pontos nesse caminho possuem tags (rótulos). Deseja realmente apagá-los? "ru": Некоторые точки данной линии содержат теги. Действительно удалить? "sv": Några en punkterna i denna väg är taggade, vill du verkligen ta bort den? @@ -753,10 +781,10 @@ prompt_track: "fi": Muunna GPX-jälki lukituiksi teiksi editointia varten "fr": Conversion d'une trace GPS en chemin (verrouillé) pour l'édition. "hu": GPS nyomvonalaid átkonvertálása (zárolt) vonalakká a szerkesztéshez. - "it": Convert your GPS track to (locked) ways for editing. + "it": Converti le tue tracce GPS in percorsi (bloccati) per la modifica. "ja": あなたのGPS trackを編集用のlockされたwayに変換します。 "lolcat": Convert yur GPZ track ta (lockeded) waiz foar editin. - "no": Convert your GPS track to (locked) ways for editing. + "no": Overfør dine GPS-sporinger til (låste) veier for redigering. "pt-br": Converta a sua trilha GPS para caminhos (trancados) a serem editados. "ru": Конвертировать GPS-трек в линию(заблокированную), для редактирования. "sv": Omvandla dina GPS spår till (låsta) vägar för editering. @@ -780,8 +808,8 @@ revert: "es": Volver "fi": Kumoa "fr": Revenir - "hu": Visszaállít - "it": Revert + "hu": V.állít + "it": Ripristina "ja": 差し戻し "lolcat": Revert "no": Tilbakestill @@ -808,10 +836,10 @@ tip_addrelation: "fi": Lisää relaatio "fr": Ajouter à une relation "hu": Hozzáadás kapcsolathoz - "it": Add to a relation + "it": Aggiungi ad una relazione "ja": relationへ追加 "lolcat": Add ta a relashun - "no": Legg til i en relation + "no": Legg til i en relasjon "pt-br": Adicionar a uma relação "ru": Добавить новое отношение (relation) "sv": Lägg till en ny relation @@ -822,10 +850,10 @@ tip_addtag: "fi": Lisää uusi tagi "fr": Ajouter un nouveau tag "hu": Új címke hozzáadása - "it": Add a new tag + "it": Aggiungi una nuova etichetta "ja": 新しいtagを追加 "lolcat": Noo tag - "no": Legg til tag + "no": Legg til merke "pt-br": Adicionar um novo tag (rótulo) "ru": Добавить новый тег "sv": Lägg till en ny etikett (tag) @@ -836,7 +864,7 @@ tip_alert: "fi": Tapahtui virhe - klikkaa saadaksesi lisätietoja "fr": Une erreur vient de survenir - cliquez pour plus de détails "hu": Hiba történt - kattints a részletekért - "it": An error occurred - click for details + "it": Si è verificato un errore - click per i dettagli "ja": エラーが発生しました。クリックすると詳細が表示されます。 "lolcat": OHNOES! Errorz! - clik foar detailz "no": Det oppstod en feil, trykk for detaljer @@ -850,7 +878,7 @@ tip_anticlockwise: "fi": Vastapäivään sulkeutuva tie - klikkaa kääntääksesi "fr": Circulation dans le sens inverse des aiguilles d'une montre (trigonométrique) - Cliquez pour inverser le sens "hu": Órajárással ellentétes körkörös vonal - kattints a megfordításhoz - "it": Anti-clockwise circular way - click to reverse + "it": Percorso circolare antiorario - click to invertire "ja": 反時計回りのcircular way - クリックして反転 "lolcat": Anti-clockwyez circlar wai - clik ta bakwadz "no": Sirkulær vei mot klokka, trykk for å snu @@ -864,7 +892,7 @@ tip_clockwise: "fi": Myötäpäivään sulkeutuva tie - klikkaa kääntääksesi "fr": Circulation dans le sens des aiguilles d'une montre - Cliquez pour inverser le sens "hu": Órajárással egyező körkörös vonal - kattints a megfordításhoz - "it": Clockwise circular way - click to reverse + "it": Percorso circolare orario - click to invertire "ja": 時計回りのcircular way - クリックして反転 "lolcat": Clockwyez circlar wai - clik ta bakwadz "no": Sirkulær vei med klokka, trykk for å snu @@ -876,9 +904,9 @@ tip_direction: "de": Richtung des Weges - Klicken zum Ändern "es": Dirección de la vía - clic para invertir la dirección de la vía "fi": Tien suunta - klikkaa kääntääksesi - "fr": Direction du chemin - cliquez pour inverser + "fr": Direction du chemin - cliquer pour inverser "hu": Vonal iránya - kattints a megfordításhoz - "it": Direction of way - click to reverse + "it": Direzione del percorso - click per invertire "ja": wayの方向 - クリックして反転 "lolcat": Direcshun uv wai - clik ta bakwadz "no": Veiretning, trykk for å snu @@ -891,10 +919,10 @@ tip_gps: "es": Mostrar los tracks de GPS (G) "fi": Näytä GPS-jäljet (G) "fr": Afficher les traces GPS (G) - "hu": GPS nyomvonalak megjelenítésének - "it": Show GPS tracks (G) + "hu": GPS nyomvonalak megjelenítése + "it": Mostra le tracce GPS (G) "ja": GPS trackを表示 (G) - "lolcat": Show GPZ tracks (G) + "lolcat": Can haz GPZ trax (G) "no": Vis GPS sporlogger (G) "pt-br": Mostrar trilhas do GPS "ru": Показать GPS треки (G) @@ -906,9 +934,9 @@ tip_noundo: "fi": Ei kumottavaa "fr": Rien à annuler "hu": Nincs mit visszavonni - "it": Nothing to undo + "it": Nulla da annullare "ja": 取消対象無し - "lolcat": nofin ta undo + "lolcat": I haz nuffin for undos "no": Ingenting å angre "pt-br": Nada para desfazer "ru": Нечего отменять @@ -920,7 +948,7 @@ tip_options: "fi": Asetukset (valitse kartan tausta) "fr": Options (choix de la carte d'arrière plan) "hu": Beállítások módosítása (térképháttér kiválasztása) - "it": Set options (choose the map background) + "it": Imposta le opzioni (scegli lo sfondo della mappa) "ja": オプション設定 (地図背景の選択) "lolcat": Set optionz (chooes teh map bakgrownd) "no": Sett valg (velg kartbakgrunn) @@ -937,7 +965,7 @@ tip_presettype: "it": Choose what type of presets are offered in the menu. "ja": 提供されているプリセットの種類をメニューから選択します。 "lolcat": Chooes whut tyep uv presetz iz ofered in teh menu. - "no": Choose what type of presets are offered in the menu. + "no": Velg hva slags forhåndsinstillinger som blir vist i menyen "pt-br": Escolha quais tipos predefinidos são oferecidos neste menu. "ru": Выберете какой набор тегов отображать в меню. "sv": Välj vilka typer av inställningar som syns i menyn. @@ -948,10 +976,10 @@ tip_repeattag: "fi": Toista tagit viimeksi valitusta tiestä (R) "fr": Recopier les informations du chemin sélectionné précédemment (R) "hu": Az előzőleg kiválasztott vonal címkéinek megismétlése (R) - "it": Repeat tags from the previously selected way (R) + "it": Ripeti le etichette del percorso precedentemente selezionato (R) "ja": 前回選択したwayのtagを繰り返す (R) - "lolcat": Repeat tagz frum teh previously selecteded wai (R) - "no": Repeter tagger fra siste valgte vei (R) + "lolcat": Previous tagz ar relavint to mai selecteded wai (R) + "no": Gjenta merker fra sist valgte vei (R) "pt-br": Repetir tags (rótulos) do caminho previamente selecionado (R) "ru": Повторить теги с предыдущей выбранной линии (R) "sv": Kopiera etiketterna (taggarna) från den senast valda vägen (R) @@ -962,7 +990,7 @@ tip_revertversion: "fi": Valitse versio, johon palautetaan "fr": Choisissez la version vers laquelle revenir "hu": Válaszd ki a változatot a visszaállításhoz - "it": Choose the version to revert to + "it": Scegliere la versione da ripristinare "ja": 差し戻し先のバージョンを選択 "lolcat": Chooes teh verzhun ta revert ta "no": Velg versjonen det skal tilbakestilles til @@ -979,7 +1007,7 @@ tip_selectrelation: "it": Add to the chosen route "ja": 選択したrouteへ追加 "lolcat": Add ta teh chosen rouet - "no": Add to the chosen route + "no": Legg til den valgte ruta "pt-br": Adicionar à rota escolhida "ru": Добавить в выбранное отношение "sv": Addera till den valda rutten @@ -990,9 +1018,9 @@ tip_splitway: "fi": Katkaise tie valitusta kohtaa (X) "fr": Scinder le chemin au point sélectionné (X) "hu": Vonal kettévágása a kijelölt pontnál - "it": Separa una way nel punto selezionato (X) + "it": Separa un percorso nel punto selezionato (X) "ja": 選択したpointでwayを分割 (X) - "lolcat": spleet wai at selecteded noed (X) + "lolcat": wai goes NOM NOM NOM at the noed (X) "no": Del vei i valgt punkt (X) "pt-br": Dividir caminho no ponto selecionado "ru": Разделить линию в текущей точке (X) @@ -1007,7 +1035,7 @@ tip_undo: "it": Undo $1 (Z) "ja": $1 を取り消し (Z) "lolcat": Undo $1 (Z) - "no": Undo $1 (Z) + "no": Angre $1 (Z) "pt-br": Desfazer $1 (Z) "ru": Отменить $1 (Z) "sv": Ångra $1 (Z) @@ -1018,10 +1046,10 @@ track: "fi": Jälki "fr": Trace "hu": Nyomvonal - "it": Track + "it": Traccia "ja": 軌跡 "lolcat": Trak - "no": Track + "no": Spor "pt-br": Trilha "ru": Трек "sv": Spår diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index 9929687e83fc395e51c95407547b36639a308178..f2e1d885aa3dcd1a2cde93a255027f4f2676a461 100755 GIT binary patch literal 155896 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 E08mjddjJ3c literal 152966 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 Date: Sat, 20 Sep 2008 12:07:48 +0000 Subject: [PATCH 57/58] Potlatch 0.10c... part two --- app/controllers/swf_controller.rb | 4 ++-- public/potlatch/beep.mp3 | Bin 0 -> 5851 bytes public/potlatch/potlatch.swf | Bin 155896 -> 158764 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 public/potlatch/beep.mp3 diff --git a/app/controllers/swf_controller.rb b/app/controllers/swf_controller.rb index 54f8382ea..a96e71d05 100644 --- a/app/controllers/swf_controller.rb +++ b/app/controllers/swf_controller.rb @@ -117,8 +117,8 @@ class SwfController < ApplicationController def startShape s =0.chr # No fill styles s+=2.chr # Two line styles - s+=packUI16(5) + 0.chr + 255.chr + 255.chr # Width 5, RGB #00FFFF - s+=packUI16(5) + 255.chr + 0.chr + 255.chr # Width 5, RGB #FF00FF + s+=packUI16(0) + 0.chr + 255.chr + 255.chr # Width 5, RGB #00FFFF + s+=packUI16(0) + 255.chr + 0.chr + 255.chr # Width 5, RGB #FF00FF s+=34.chr # 2 fill, 2 line index bits s end diff --git a/public/potlatch/beep.mp3 b/public/potlatch/beep.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..970835268ad19bc6e04b395bc836f4f2cba8d1f8 GIT binary patch literal 5851 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 literal 155896 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 E08mjddjJ3c From c2854a8056a19219d4ecd4e29099f2ef6224f2d0 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 25 Sep 2008 03:58:18 +0000 Subject: [PATCH 58/58] Get rails to do asset tagging for the SWF file. --- app/views/site/edit.rhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/site/edit.rhtml b/app/views/site/edit.rhtml index 9c3c78fda..7f542bb60 100644 --- a/app/views/site/edit.rhtml +++ b/app/views/site/edit.rhtml @@ -48,7 +48,7 @@ <%= javascript_include_tag 'swfobject.js' %>

    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 From 3336fd946974420944290f9bdc89164e69edd599 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 3 Aug 2008 20:58:58 +0000 Subject: [PATCH 39/58] Link to user pages. --- script/statistics | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/statistics b/script/statistics index e76028114..e5f82bba6 100755 --- a/script/statistics +++ b/script/statistics @@ -35,7 +35,7 @@ begin Trace.sum(:size, :group => :user_id, :order => "sum_size DESC", :limit => 50).each do |user, count| display_name = User.find(user).display_name.gsub('@', ' at ').gsub('.', ' dot ') - puts "#{display_name}#{count}" + puts "#{display_name}#{count}" end puts "" @@ -83,7 +83,7 @@ begin else display_name = User.find(column[0]).display_name.gsub('@', ' at ').gsub('.', ' dot ') count = column[1] - puts "#{count} #{display_name}" + puts "#{count} #{display_name}" end end puts "" From 6d7e69d4d3ec1a873ab5a6accab4ab3a290e5989 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 7 Aug 2008 11:31:42 +0000 Subject: [PATCH 40/58] Make the location of the GPX traces configurable. --- app/models/trace.rb | 8 +++----- config/initializers/gpx.rb | 5 +++++ 2 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 config/initializers/gpx.rb diff --git a/app/models/trace.rb b/app/models/trace.rb index a0ec22dee..10e867bad 100644 --- a/app/models/trace.rb +++ b/app/models/trace.rb @@ -58,18 +58,16 @@ class Trace < ActiveRecord::Base data end - # FIXME change to permanent filestore area def large_picture_name - "/home/osm/icons/#{id}.gif" + "#{GPX_IMAGE_DIR}/#{id}.gif" end - # FIXME change to permanent filestore area def icon_picture_name - "/home/osm/icons/#{id}_icon.gif" + "#{GPX_IMAGE_DIR}/#{id}_icon.gif" end def trace_name - "/home/osm/gpx/#{id}.gpx" + "#{GPX_TRACE_DIR}/#{id}.gpx" end def mime_type diff --git a/config/initializers/gpx.rb b/config/initializers/gpx.rb new file mode 100644 index 000000000..df4c6019c --- /dev/null +++ b/config/initializers/gpx.rb @@ -0,0 +1,5 @@ +# Set location of GPX trace files +GPX_TRACE_DIR = "/home/osm/traces" + +# Set location of GPX image files +GPX_IMAGE_DIR = "/home/osm/images" From 06f38caccbdc758c60aaed21003f8e0e52400b35 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 7 Aug 2008 17:46:34 +0000 Subject: [PATCH 41/58] Import the daemon generator as the SVN external never works. --- vendor/generators/daemon/daemon_generator.rb | 11 ++++++++++ vendor/generators/daemon/templates/daemons | 2 ++ .../generators/daemon/templates/daemons.yml | 5 +++++ vendor/generators/daemon/templates/script.rb | 19 ++++++++++++++++++ vendor/generators/daemon/templates/script_ctl | 20 +++++++++++++++++++ 5 files changed, 57 insertions(+) create mode 100644 vendor/generators/daemon/daemon_generator.rb create mode 100644 vendor/generators/daemon/templates/daemons create mode 100644 vendor/generators/daemon/templates/daemons.yml create mode 100755 vendor/generators/daemon/templates/script.rb create mode 100755 vendor/generators/daemon/templates/script_ctl diff --git a/vendor/generators/daemon/daemon_generator.rb b/vendor/generators/daemon/daemon_generator.rb new file mode 100644 index 000000000..83e3bab2c --- /dev/null +++ b/vendor/generators/daemon/daemon_generator.rb @@ -0,0 +1,11 @@ +class DaemonGenerator < Rails::Generator::NamedBase + def manifest + record do |m| + m.directory "lib/daemons" + m.file "daemons", "script/daemons", :chmod => 0755 + m.template "script.rb", "lib/daemons/#{file_name}.rb", :chmod => 0755 + m.template "script_ctl", "lib/daemons/#{file_name}_ctl", :chmod => 0755 + m.file "daemons.yml", "config/daemons.yml" + end + end +end \ No newline at end of file diff --git a/vendor/generators/daemon/templates/daemons b/vendor/generators/daemon/templates/daemons new file mode 100644 index 000000000..feb98b645 --- /dev/null +++ b/vendor/generators/daemon/templates/daemons @@ -0,0 +1,2 @@ +#!/usr/bin/env ruby +Dir[File.dirname(__FILE__) + "/../lib/daemons/*_ctl"].each {|f| `#{f} #{ARGV.first}`} \ No newline at end of file diff --git a/vendor/generators/daemon/templates/daemons.yml b/vendor/generators/daemon/templates/daemons.yml new file mode 100644 index 000000000..c9f78f583 --- /dev/null +++ b/vendor/generators/daemon/templates/daemons.yml @@ -0,0 +1,5 @@ +dir_mode: script +dir: ../../log +multiple: false +backtrace: true +monitor: true \ No newline at end of file diff --git a/vendor/generators/daemon/templates/script.rb b/vendor/generators/daemon/templates/script.rb new file mode 100755 index 000000000..c3cd9b06b --- /dev/null +++ b/vendor/generators/daemon/templates/script.rb @@ -0,0 +1,19 @@ +#!/usr/bin/env ruby + +#You might want to change this +ENV["RAILS_ENV"] ||= "production" + +require File.dirname(__FILE__) + "/../../config/environment" + +$running = true; +Signal.trap("TERM") do + $running = false +end + +while($running) do + + # Replace this with your code + ActiveRecord::Base.logger << "This daemon is still running at #{Time.now}.\n" + + sleep 10 +end \ No newline at end of file diff --git a/vendor/generators/daemon/templates/script_ctl b/vendor/generators/daemon/templates/script_ctl new file mode 100755 index 000000000..058f61828 --- /dev/null +++ b/vendor/generators/daemon/templates/script_ctl @@ -0,0 +1,20 @@ +#!/usr/bin/env ruby +require 'rubygems' +require "daemons" +require 'yaml' +require 'erb' + +class Hash + def with_symbols! + self.keys.each{|key| self[key.to_s.to_sym] = self[key] }; self + end +end + +options = YAML.load( + ERB.new( + IO.read( + File.dirname(__FILE__) + "/../../config/daemons.yml" + )).result).with_symbols! +options[:dir_mode] = options[:dir_mode].to_sym + +Daemons.run File.dirname(__FILE__) + '/<%=file_name%>.rb', options \ No newline at end of file From 4bc8fcf5b499a490db044fba936e01384d01d803 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 7 Aug 2008 17:59:27 +0000 Subject: [PATCH 42/58] Import the output_compression plugin as the SVN external never works. --- vendor/plugins/output_compression/LICENSE | 19 ++++++ vendor/plugins/output_compression/README | 10 +++ vendor/plugins/output_compression/Rakefile | 22 +++++++ vendor/plugins/output_compression/init.rb | 2 + .../lib/output_compression.rb | 66 +++++++++++++++++++ .../tasks/output_compression_tasks.rake | 4 ++ .../test/output_compression_test.rb | 8 +++ 7 files changed, 131 insertions(+) create mode 100644 vendor/plugins/output_compression/LICENSE create mode 100644 vendor/plugins/output_compression/README create mode 100644 vendor/plugins/output_compression/Rakefile create mode 100644 vendor/plugins/output_compression/init.rb create mode 100644 vendor/plugins/output_compression/lib/output_compression.rb create mode 100644 vendor/plugins/output_compression/tasks/output_compression_tasks.rake create mode 100644 vendor/plugins/output_compression/test/output_compression_test.rb diff --git a/vendor/plugins/output_compression/LICENSE b/vendor/plugins/output_compression/LICENSE new file mode 100644 index 000000000..1139144f6 --- /dev/null +++ b/vendor/plugins/output_compression/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2007 Jeremy Evans + +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. diff --git a/vendor/plugins/output_compression/README b/vendor/plugins/output_compression/README new file mode 100644 index 000000000..54030bf89 --- /dev/null +++ b/vendor/plugins/output_compression/README @@ -0,0 +1,10 @@ +OutputCompression +================= + +Allows gzip output compression to clients that support it. Simple to use, just +put after_filter :compress_output in your controller. Pulled out of the Google +cache and packaged into plugin form, code originally hosted at +http://www.tuxsoft.se/oss/rails/download/output_compression.rb. + + svn: svn://code.jeremyevans.net/rails/plugins/output_compression + file: http://code.jeremyevans.net/code/output_compression.tar.gz diff --git a/vendor/plugins/output_compression/Rakefile b/vendor/plugins/output_compression/Rakefile new file mode 100644 index 000000000..0ffac2d70 --- /dev/null +++ b/vendor/plugins/output_compression/Rakefile @@ -0,0 +1,22 @@ +require 'rake' +require 'rake/testtask' +require 'rake/rdoctask' + +desc 'Default: run unit tests.' +task :default => :test + +desc 'Test the output_compression plugin.' +Rake::TestTask.new(:test) do |t| + t.libs << 'lib' + t.pattern = 'test/**/*_test.rb' + t.verbose = true +end + +desc 'Generate documentation for the output_compression plugin.' +Rake::RDocTask.new(:rdoc) do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = 'OutputCompression' + rdoc.options << '--line-numbers --inline-source' + rdoc.rdoc_files.include('README') + rdoc.rdoc_files.include('lib/**/*.rb') +end diff --git a/vendor/plugins/output_compression/init.rb b/vendor/plugins/output_compression/init.rb new file mode 100644 index 000000000..52bdcc3f2 --- /dev/null +++ b/vendor/plugins/output_compression/init.rb @@ -0,0 +1,2 @@ +# Include hook code here +require 'output_compression' diff --git a/vendor/plugins/output_compression/lib/output_compression.rb b/vendor/plugins/output_compression/lib/output_compression.rb new file mode 100644 index 000000000..c7652ae1d --- /dev/null +++ b/vendor/plugins/output_compression/lib/output_compression.rb @@ -0,0 +1,66 @@ +# OutputCompression +# Rails output compression filters +# +# Adds two classmethods to ActionController that can be used as after-filters: +# strip_whitespace and compress_output. +# If you use page-caching, you MUST specify the compress_output filter AFTER +# caches_page, otherwise the compressed data will be cached instead of the HTML +# +# class MyController < ApplicationController +# after_filter :strip_whitespace +# caches_page :index +# after_filter :compress_output +# end + +begin + require 'zlib' + require 'stringio' + GZIP_SUPPORTED = true +rescue + GZIP_SUPPORTED = false +end + +module CompressionSystem + def compress_output + return unless accepts_gzip? + output = StringIO.new + def output.close + # Zlib does a close. Bad Zlib... + rewind + end + gz = Zlib::GzipWriter.new(output) + gz.write(response.body) + gz.close + if output.length < response.body.length + @old_response_body = response.body + response.body = output.string + response.headers['Content-encoding'] = @compression_encoding + end + end + + def accepts_gzip? + return false unless GZIP_SUPPORTED + accepts = request.env['HTTP_ACCEPT_ENCODING'] + return false unless accepts && accepts =~ /(x-gzip|gzip)/ + @compression_encoding = $1 + true + end + + def strip_whitespace + response.body.gsub!(/()|(.*?<\/script>)|()|()|\s+/m) do |m| + if m =~ /^()(.*?)<\/script>$/m + $1 + $2.strip.gsub(/\s+/, ' ').gsub('',"\n-->") + '' + elsif m =~ /^$/m + '' + elsif m =~ /^<(textarea|pre)/ + m + else ' ' + end + end + response.body.gsub! /\s+\s+/, '>' + end +end + +class ActionController::Base + include CompressionSystem +end \ No newline at end of file diff --git a/vendor/plugins/output_compression/tasks/output_compression_tasks.rake b/vendor/plugins/output_compression/tasks/output_compression_tasks.rake new file mode 100644 index 000000000..0382661bd --- /dev/null +++ b/vendor/plugins/output_compression/tasks/output_compression_tasks.rake @@ -0,0 +1,4 @@ +# desc "Explaining what the task does" +# task :output_compression do +# # Task goes here +# end \ No newline at end of file diff --git a/vendor/plugins/output_compression/test/output_compression_test.rb b/vendor/plugins/output_compression/test/output_compression_test.rb new file mode 100644 index 000000000..9b94fa187 --- /dev/null +++ b/vendor/plugins/output_compression/test/output_compression_test.rb @@ -0,0 +1,8 @@ +require 'test/unit' + +class OutputCompressionTest < Test::Unit::TestCase + # Replace this with your real tests. + def test_this_plugin + flunk + end +end From b8f3742bc39a8aa4a90f6f1bd151a0c5cdaa42ec Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Fri, 8 Aug 2008 15:49:29 +0000 Subject: [PATCH 43/58] Make the cleanup script work a chunk at a time so we don't run out of memory when there are lots of sessions. --- script/cleanup | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/script/cleanup b/script/cleanup index 270877096..72a6dec9b 100755 --- a/script/cleanup +++ b/script/cleanup @@ -2,17 +2,27 @@ require File.dirname(__FILE__) + '/../config/environment' -Session.find(:all, :conditions => ["updated_at < ?", 1.week.ago]).each do |session| - begin - if session[:user] and User.find(session[:user]) - session.destroy if session.updated_at < 1.month.ago - else +last_session_id = 0 + +begin + sessions = Session.find(:all, + :conditions => ["updated_at < ? and id > ?", 1.week.ago, last_session_id], + :order => :id, :limit => 1000) + + sessions.each do |session| + last_session_id = session.id + + begin + if session[:user] and User.find(session[:user]) + session.destroy if session.updated_at < 1.month.ago + else + session.destroy + end + rescue Exception => ex + puts "Invalid session #{session.session_id}: #{ex.to_s}" session.destroy end - rescue Exception => ex - puts "Invalid session #{session.session_id}: #{ex.to_s}" - session.destroy end -end +end while sessions.length > 0 UserToken.delete_all("expiry < NOW()") From e379287e84ee44a1a8a1e50cf0d22d81b00fc009 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 13 Aug 2008 08:12:09 +0000 Subject: [PATCH 44/58] Add an administrator flag to the user table. --- db/migrate/012_add_admin_flag.rb | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 db/migrate/012_add_admin_flag.rb diff --git a/db/migrate/012_add_admin_flag.rb b/db/migrate/012_add_admin_flag.rb new file mode 100644 index 000000000..24f2d4ed7 --- /dev/null +++ b/db/migrate/012_add_admin_flag.rb @@ -0,0 +1,9 @@ +class AddAdminFlag < ActiveRecord::Migration + def self.up + add_column "users", "administrator", :boolean, :default => false, :null => false + end + + def self.down + remove_column "users", "administrator" + end +end From f8367c3ee1418548b5397b6a21f287c2407963e1 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 13 Aug 2008 10:45:49 +0000 Subject: [PATCH 45/58] Allow a user's email address to be marked invalid, and suppress most notification mails for such users. --- app/controllers/user_controller.rb | 2 ++ app/models/notifier.rb | 11 +++++------ db/migrate/013_add_email_valid.rb | 10 ++++++++++ 3 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 db/migrate/013_add_email_valid.rb diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index f2378f36d..35b88b65a 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -92,6 +92,7 @@ class UserController < ApplicationController user.pass_crypt = pass user.pass_crypt_confirmation = pass user.active = true + user.email_valid = true user.save! token.destroy Notifier::deliver_reset_password(user, pass) @@ -151,6 +152,7 @@ class UserController < ApplicationController if token and !token.user.active? @user = token.user @user.active = true + @user.email_valid = true @user.save! token.destroy flash[:notice] = 'Confirmed your account, thanks for signing up!' diff --git a/app/models/notifier.rb b/app/models/notifier.rb index 84d097341..ebf5af641 100644 --- a/app/models/notifier.rb +++ b/app/models/notifier.rb @@ -1,4 +1,3 @@ - class Notifier < ActionMailer::Base def signup_confirm(user, token) recipients user.email @@ -29,7 +28,7 @@ class Notifier < ActionMailer::Base end def gpx_success(trace, possible_points) - recipients trace.user.email + recipients trace.user.email if trace.user.email_valid from "webmaster@openstreetmap.org" subject "[OpenStreetMap] GPX Import success" headers "Auto-Submitted" => "auto-generated" @@ -41,7 +40,7 @@ class Notifier < ActionMailer::Base end def gpx_failure(trace, error) - recipients trace.user.email + recipients trace.user.email if trace.user.email_valid from "webmaster@openstreetmap.org" subject "[OpenStreetMap] GPX Import failure" headers "Auto-Submitted" => "auto-generated" @@ -52,7 +51,7 @@ class Notifier < ActionMailer::Base end def message_notification(message) - recipients message.recipient.email + recipients message.recipient.email if message.recipient.email_valid from "webmaster@openstreetmap.org" subject "[OpenStreetMap] #{message.sender.display_name} sent you a new message" headers "Auto-Submitted" => "auto-generated" @@ -69,7 +68,7 @@ class Notifier < ActionMailer::Base end def diary_comment_notification(comment) - recipients comment.diary_entry.user.email + recipients comment.diary_entry.user.email if comment.diary_entry.user.email_valid from "webmaster@openstreetmap.org" subject "[OpenStreetMap] #{comment.user.display_name} commented on your diary entry" headers "Auto-Submitted" => "auto-generated" @@ -100,7 +99,7 @@ class Notifier < ActionMailer::Base befriender = User.find_by_id(friend.user_id) befriendee = User.find_by_id(friend.friend_user_id) - recipients befriendee.email + recipients befriendee.email if befriendee.email_valid from "webmaster@openstreetmap.org" subject "[OpenStreetMap] #{befriender.display_name} added you as a friend" headers "Auto-Submitted" => "auto-generated" diff --git a/db/migrate/013_add_email_valid.rb b/db/migrate/013_add_email_valid.rb new file mode 100644 index 000000000..b8af4bf6a --- /dev/null +++ b/db/migrate/013_add_email_valid.rb @@ -0,0 +1,10 @@ +class AddEmailValid < ActiveRecord::Migration + def self.up + add_column "users", "email_valid", :boolean, :default => false, :null => false + User.update_all("email_valid = active") + end + + def self.down + remove_column "users", "email_valid" + end +end From 64ecd02f0b74d2251e30fc1c97fdf1aa60f53e90 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 13 Aug 2008 11:39:33 +0000 Subject: [PATCH 46/58] Allow users to change their email address. Closes #546. --- app/controllers/user_controller.rb | 48 +++++++++++++++---- app/models/notifier.rb | 11 +++++ .../notifier/email_confirm.text.html.rhtml | 8 ++++ .../notifier/email_confirm.text.plain.rhtml | 8 ++++ app/views/user/account.rhtml | 2 +- app/views/user/confirm_email.rhtml | 8 ++++ db/migrate/014_add_new_email.rb | 9 ++++ 7 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 app/views/notifier/email_confirm.text.html.rhtml create mode 100644 app/views/notifier/email_confirm.text.plain.rhtml create mode 100644 app/views/user/confirm_email.rhtml create mode 100644 db/migrate/014_add_new_email.rb diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 35b88b65a..26c56132c 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -17,9 +17,8 @@ class UserController < ApplicationController @user.description = "" if @user.description.nil? if @user.save - token = @user.tokens.create flash[:notice] = "User was successfully created. Check your email for a confirmation note, and you\'ll be mapping in no time :-)
    Please note that you won't be able to login until you've received and confirmed your email address." - Notifier::deliver_signup_confirm(@user, token) + Notifier.deliver_signup_confirm(@user, @user.tokens.create) redirect_to :action => 'login' else render :action => 'new' @@ -29,19 +28,28 @@ class UserController < ApplicationController def account @title = 'edit account' if params[:user] and params[:user][:display_name] and params[:user][:description] - home_lat = params[:user][:home_lat] - home_lon = params[:user][:home_lon] + if params[:user][:email] != @user.email + @user.new_email = params[:user][:email] + end @user.display_name = params[:user][:display_name] + if params[:user][:pass_crypt].length > 0 or params[:user][:pass_crypt_confirmation].length > 0 @user.pass_crypt = params[:user][:pass_crypt] @user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation] end + @user.description = params[:user][:description] - @user.home_lat = home_lat - @user.home_lon = home_lon + @user.home_lat = params[:user][:home_lat] + @user.home_lon = params[:user][:home_lon] + if @user.save - flash[:notice] = "User information updated successfully." + if params[:user][:email] == @user.new_email + flash[:notice] = "User information updated successfully. Check your email for a note to confirm your new email address." + Notifier.deliver_email_confirm(@user, @user.tokens.create) + else + flash[:notice] = "User information updated successfully." + end else flash.delete(:notice) end @@ -72,7 +80,7 @@ class UserController < ApplicationController user = User.find_by_email(params[:user][:email]) if user token = user.tokens.create - Notifier::deliver_lost_password(user, token) + Notifier.deliver_lost_password(user, token) flash[:notice] = "Sorry you lost it :-( but an email is on its way so you can reset it soon." else flash[:notice] = "Couldn't find that email address, sorry." @@ -95,7 +103,7 @@ class UserController < ApplicationController user.email_valid = true user.save! token.destroy - Notifier::deliver_reset_password(user, pass) + Notifier.deliver_reset_password(user, pass) flash[:notice] = "Your password has been changed and is on its way to your mailbox :-)" else flash[:notice] = "Didn't find that token, check the URL maybe?" @@ -164,6 +172,26 @@ class UserController < ApplicationController end end + def confirm_email + if params[:confirm_action] + token = UserToken.find_by_token(params[:confirm_string]) + if token and token.user.new_email? + @user = token.user + @user.email = @user.new_email + @user.new_email = nil + @user.active = true + @user.email_valid = true + @user.save! + token.destroy + flash[:notice] = 'Confirmed your email address, thanks for signing up!' + session[:user] = @user.id + redirect_to :action => 'account', :display_name => @user.display_name + else + flash[:notice] = 'Something went wrong confirming that email address.' + end + end + end + def upload_image @user.image = params[:user][:image] @user.save! @@ -209,7 +237,7 @@ class UserController < ApplicationController unless @user.is_friends_with?(new_friend) if friend.save flash[:notice] = "#{name} is now your friend." - Notifier::deliver_friend_notification(friend) + Notifier.deliver_friend_notification(friend) else friend.add_error("Sorry, failed to add #{name} as a friend.") end diff --git a/app/models/notifier.rb b/app/models/notifier.rb index ebf5af641..3cc0f4cab 100644 --- a/app/models/notifier.rb +++ b/app/models/notifier.rb @@ -9,6 +9,17 @@ class Notifier < ActionMailer::Base :confirm_string => token.token) end + def email_confirm(user, token) + recipients user.new_email + from "webmaster@openstreetmap.org" + subject "[OpenStreetMap] Confirm your email address" + headers "Auto-Submitted" => "auto-generated" + body :address => user.new_email, + :url => url_for(:host => SERVER_URL, + :controller => "user", :action => "confirm_email", + :confirm_string => token.token) + end + def lost_password(user, token) recipients user.email from "webmaster@openstreetmap.org" diff --git a/app/views/notifier/email_confirm.text.html.rhtml b/app/views/notifier/email_confirm.text.html.rhtml new file mode 100644 index 000000000..271a35028 --- /dev/null +++ b/app/views/notifier/email_confirm.text.html.rhtml @@ -0,0 +1,8 @@ +