log
config/piwik.yml
+app/assets/javascripts/i18n
public/assets
public/attachments
public/export
Harry Wood <git@harrywood.co.uk> <mail@harrywood.co.uk> <github@onlineanimals.co.uk>
Kai Krueger <kakrueger@gmail.com> <kai@aiputerlx.(none)>
Michael Glanznig <nebulon42@yandex.com>
+Petr Kadlec <mormegil@centrum.cz>
Richard Fairhurst <richard@systemeD.net> <richard@systemed.net>
+Simon Poole <simon@poole.ch> <simon@rails-dev.poole.ch> <simonpoole@users.noreply.github.com>
inherit_from: .rubocop_todo.yml
+AllCops:
+ TargetRubyVersion: 2.3
+
Rails:
Enabled: true
-Style/BracesAroundHashParameters:
- EnforcedStyle: context_dependent
-
-Style/ExtraSpacing:
+Layout/ExtraSpacing:
AllowForAlignment: true
-Style/FileName:
+Lint/PercentStringArray:
+ Exclude:
+ - 'config/initializers/secure_headers.rb'
+ - 'app/controllers/application_controller.rb'
+ - 'app/controllers/site_controller.rb'
+
+Naming/FileName:
Exclude:
- 'script/deliver-message'
- 'script/locale/reload-languages'
- 'script/update-spam-blocks'
-Style/IfInsideElse:
+Naming/UncommunicativeMethodParamName:
+ Enabled: false
+
+Rails/ApplicationRecord:
+ Enabled: false
+
+Rails/CreateTableWithTimestamps:
+ Enabled: false
+
+Rails/FindEach:
+ Enabled: false
+
+Rails/HasManyOrHasOneDependent:
Enabled: false
-Style/GlobalVars:
+Rails/HttpPositionalArguments:
+ Enabled: false
+
+Rails/InverseOf:
+ Enabled: false
+
+Rails/SkipsModelValidations:
Exclude:
- - 'lib/quad_tile/extconf.rb'
+ - 'db/migrate/*.rb'
+ - 'app/controllers/users_controller.rb'
+
+Style/BracesAroundHashParameters:
+ EnforcedStyle: context_dependent
+
+Style/FormatStringToken:
+ EnforcedStyle: template
+
+Style/IfInsideElse:
+ Enabled: false
Style/GuardClause:
Enabled: false
- 'lib/tasks/testing.rake'
- 'config/initializers/wrap_parameters.rb'
+Style/MixinUsage:
+ Exclude:
+ - 'bin/setup'
+ - 'bin/update'
+
Style/StringLiterals:
EnforcedStyle: double_quotes
-Style/WordArray:
- Exclude:
- - 'test/models/message_test.rb'
+Style/SymbolArray:
+ EnforcedStyle: brackets
# This configuration was generated by
# `rubocop --auto-gen-config`
-# on 2015-08-18 20:27:49 +0100 using RuboCop version 0.33.0.
+# on 2018-09-19 14:24:02 +0100 using RuboCop version 0.58.2.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
-# Offense count: 34
-Lint/AmbiguousOperator:
- Exclude:
- - 'test/controllers/amf_controller_test.rb'
- - 'test/controllers/changeset_controller_test.rb'
- - 'test/lib/bounding_box_test.rb'
- - 'test/lib/country_test.rb'
-
-# Offense count: 115
-Lint/AmbiguousRegexpLiteral:
- Enabled: false
-
-# Offense count: 29
+# Offense count: 32
# Configuration parameters: AllowSafeAssignment.
Lint/AssignmentInCondition:
Exclude:
- 'app/controllers/application_controller.rb'
- 'app/controllers/geocoder_controller.rb'
- 'app/controllers/notes_controller.rb'
- - 'app/controllers/trace_controller.rb'
- - 'app/controllers/user_controller.rb'
- - 'app/controllers/user_preference_controller.rb'
+ - 'app/controllers/traces_controller.rb'
+ - 'app/controllers/users_controller.rb'
+ - 'app/controllers/user_preferences_controller.rb'
- 'app/helpers/application_helper.rb'
- 'app/helpers/browse_helper.rb'
+ - 'app/helpers/browse_tags_helper.rb'
- 'app/models/client_application.rb'
- - 'app/models/notifier.rb'
+ - 'app/mailers/notifier.rb'
- 'lib/nominatim.rb'
- 'lib/osm.rb'
- 'script/deliver-message'
-# Offense count: 3
-Lint/FormatParameterMismatch:
- Exclude:
- - 'app/controllers/swf_controller.rb'
-
-# Offense count: 5
+# Offense count: 4
Lint/HandleExceptions:
Exclude:
- 'app/controllers/amf_controller.rb'
- - 'app/controllers/user_controller.rb'
- - 'config/initializers/session.rb'
-
-# Offense count: 8
-Lint/ParenthesesAsGroupedExpression:
- Exclude:
- - 'test/controllers/amf_controller_test.rb'
- - 'test/lib/bounding_box_test.rb'
- - 'test/models/user_preference_test.rb'
+ - 'app/controllers/users_controller.rb'
-# Offense count: 671
+# Offense count: 692
Metrics/AbcSize:
- Max: 277
+ Max: 283
+
+# Offense count: 40
+# Configuration parameters: CountComments, ExcludedMethods.
+# ExcludedMethods: refine
+Metrics/BlockLength:
+ Max: 262
-# Offense count: 12
+# Offense count: 11
+# Configuration parameters: CountBlocks.
Metrics/BlockNesting:
Max: 5
-# Offense count: 62
+# Offense count: 63
# Configuration parameters: CountComments.
Metrics/ClassLength:
- Max: 1653
+ Max: 1627
-# Offense count: 67
+# Offense count: 72
Metrics/CyclomaticComplexity:
- Max: 20
-
-# Offense count: 2535
-# Configuration parameters: AllowURI, URISchemes.
-Metrics/LineLength:
- Max: 962
+ Max: 23
-# Offense count: 628
+# Offense count: 691
# Configuration parameters: CountComments.
Metrics/MethodLength:
Max: 179
-# Offense count: 1
+# Offense count: 2
# Configuration parameters: CountComments.
Metrics/ModuleLength:
- Max: 129
+ Max: 135
# Offense count: 4
# Configuration parameters: CountKeywordArgs.
Metrics/ParameterLists:
Max: 9
-# Offense count: 69
+# Offense count: 72
Metrics/PerceivedComplexity:
Max: 23
-# Offense count: 2
-# Configuration parameters: Include.
-Rails/HasAndBelongsToMany:
- Exclude:
- - 'app/models/changeset.rb'
- - 'app/models/user.rb'
-
-# Offense count: 66
-# Configuration parameters: EnforcedStyle, SupportedStyles.
-Rails/TimeZone:
- Enabled: false
-
-# Offense count: 5
-Style/AccessorMethodName:
+# Offense count: 6
+Naming/AccessorMethodName:
Exclude:
- 'app/controllers/application_controller.rb'
- 'app/helpers/title_helper.rb'
- 'lib/osm.rb'
- 'lib/potlatch.rb'
-# Offense count: 1
-Style/AsciiComments:
+# Offense count: 8
+# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist, MethodDefinitionMacros.
+# NamePrefix: is_, has_, have_
+# NamePrefixBlacklist: is_, has_, have_
+# NameWhitelist: is_a?
+# MethodDefinitionMacros: define_method, define_singleton_method
+Naming/PredicateName:
Exclude:
- - 'test/models/message_test.rb'
+ - 'spec/**/*'
+ - 'app/models/changeset.rb'
+ - 'app/models/old_node.rb'
+ - 'app/models/old_relation.rb'
+ - 'app/models/old_way.rb'
+ - 'app/models/user.rb'
+ - 'lib/classic_pagination/pagination.rb'
-# Offense count: 310
-Style/Documentation:
- Enabled: false
+# Offense count: 6
+# Configuration parameters: Database, Include.
+# SupportedDatabases: mysql, postgresql
+# Include: db/migrate/*.rb
+Rails/BulkChangeTable:
+ Exclude:
+ - 'db/migrate/20111116184519_update_oauth.rb'
+ - 'db/migrate/20120208122334_merge_acl_address_and_mask.rb'
+ - 'db/migrate/20120208194454_add_domain_to_acl.rb'
+ - 'db/migrate/20120404205604_add_user_and_description_to_redaction.rb'
-# Offense count: 38
-# Configuration parameters: MinBodyLength.
-Style/GuardClause:
+# Offense count: 2
+# Configuration parameters: Include.
+# Include: app/**/*.rb, config/**/*.rb, lib/**/*.rb
+Rails/Exit:
+ Exclude:
+ - 'lib/**/*.rake'
+ - 'lib/daemons/gpx_import.rb'
+
+# Offense count: 2
+# Configuration parameters: Include.
+# Include: app/models/**/*.rb
+Rails/HasAndBelongsToMany:
Exclude:
- - 'app/controllers/application_controller.rb'
- - 'app/controllers/diary_entry_controller.rb'
- - 'app/controllers/message_controller.rb'
- - 'app/controllers/notes_controller.rb'
- - 'app/controllers/site_controller.rb'
- - 'app/controllers/user_blocks_controller.rb'
- - 'app/controllers/user_controller.rb'
- - 'app/controllers/user_roles_controller.rb'
- - 'app/helpers/application_helper.rb'
- 'app/models/changeset.rb'
- 'app/models/user.rb'
- - 'lib/diff_reader.rb'
- - 'lib/object_metadata.rb'
-# Offense count: 60
-# Cop supports --auto-correct.
-Style/LineEndConcatenation:
+# Offense count: 5
+# Configuration parameters: Include.
+# Include: db/migrate/*.rb
+Rails/NotNullColumn:
Exclude:
- - 'db/migrate/008_remove_segments.rb'
+ - 'db/migrate/002_cleanup_osm_db.rb'
- 'db/migrate/020_populate_node_tags_and_remove.rb'
- - 'db/migrate/023_add_changesets.rb'
- - 'lib/bounding_box.rb'
- - 'lib/diff_reader.rb'
- - 'lib/osm.rb'
- - 'test/controllers/changeset_controller_test.rb'
- - 'test/controllers/node_controller_test.rb'
- - 'test/controllers/relation_controller_test.rb'
- - 'test/controllers/way_controller_test.rb'
-
-# Offense count: 69
-# Cop supports --auto-correct.
-Style/NumericLiterals:
- MinDigits: 11
+ - 'db/migrate/021_move_to_innodb.rb'
+ - 'db/migrate/025_add_end_time_to_changesets.rb'
+ - 'db/migrate/20120404205604_add_user_and_description_to_redaction.rb'
-# Offense count: 42
-# Cop supports --auto-correct.
-Style/PerlBackrefs:
+# Offense count: 20
+Rails/OutputSafety:
Exclude:
- - 'app/controllers/amf_controller.rb'
- - 'app/controllers/application_controller.rb'
- - 'app/helpers/browse_helper.rb'
- - 'config/initializers/paperclip.rb'
- - 'lib/id.rb'
- - 'lib/potlatch.rb'
- - 'test/lib/i18n_test.rb'
+ - 'app/controllers/users_controller.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/helpers/changesets_helper.rb'
+ - 'app/helpers/geocoder_helper.rb'
+ - 'app/helpers/note_helper.rb'
+ - 'app/helpers/open_graph_helper.rb'
+ - 'app/helpers/user_blocks_helper.rb'
+ - 'app/helpers/user_roles_helper.rb'
+ - 'lib/rich_text.rb'
+ - 'test/helpers/application_helper_test.rb'
+
+# Offense count: 86
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: strict, flexible
+Rails/TimeZone:
+ Enabled: false
-# Offense count: 8
-# Configuration parameters: NamePrefix, NamePrefixBlacklist.
-Style/PredicateName:
+# Offense count: 1
+# Configuration parameters: AllowedChars.
+Style/AsciiComments:
Exclude:
- - 'app/models/changeset.rb'
- - 'app/models/old_node.rb'
- - 'app/models/old_relation.rb'
- - 'app/models/old_way.rb'
- - 'app/models/user.rb'
- - 'lib/classic_pagination/pagination.rb'
+ - 'test/models/message_test.rb'
+
+# Offense count: 230
+Style/Documentation:
+ Enabled: false
-# Offense count: 97
-# Configuration parameters: EnforcedStyle, SupportedStyles.
-Style/RaiseArgs:
+# Offense count: 462
+# Cop supports --auto-correct.
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: when_needed, always, never
+Style/FrozenStringLiteralComment:
Enabled: false
# Offense count: 2
-Style/RescueModifier:
+# Cop supports --auto-correct.
+Style/IfUnlessModifier:
Exclude:
- - 'app/helpers/browse_helper.rb'
+ - 'app/controllers/ways_controller.rb'
-# Offense count: 8
+# Offense count: 70
# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle, SupportedStyles.
-Style/StringLiteralsInInterpolation:
- Enabled: false
+# Configuration parameters: Strict.
+Style/NumericLiterals:
+ MinDigits: 11
+
+# Offense count: 3080
+# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
+# URISchemes: http, https
+Metrics/LineLength:
+ Max: 1073
sudo: false
language: ruby
rvm:
- - 2.1.8
+ - 2.3.3
cache: bundler
addons:
- postgresql: 9.1
+ postgresql: 9.5
apt:
packages:
- - postgresql-server-dev-9.1
+ - postgresql-server-dev-9.5
services:
- memcached
env:
- psql -U postgres -c "CREATE DATABASE openstreetmap"
- psql -U postgres -c "CREATE EXTENSION btree_gist" openstreetmap
- make -C db/functions libpgosm.so
- - psql -U postgres -c "CREATE FUNCTION maptile_for_point(int8, int8, int4) RETURNS int4 AS '${PWD}/db/functions/libpgosm', 'maptile_for_point' LANGUAGE C STRICT" openstreetmap
- - psql -U postgres -c "CREATE FUNCTION tile_for_point(int4, int4) RETURNS int8 AS '${PWD}/db/functions/libpgosm', 'tile_for_point' LANGUAGE C STRICT" openstreetmap
- - psql -U postgres -c "CREATE FUNCTION xid_to_int4(xid) RETURNS int4 AS '${PWD}/db/functions/libpgosm', 'xid_to_int4' LANGUAGE C STRICT" openstreetmap
+ - ln db/functions/libpgosm.so /tmp
+ - psql -U postgres -c "CREATE FUNCTION maptile_for_point(int8, int8, int4) RETURNS int4 AS '/tmp/libpgosm', 'maptile_for_point' LANGUAGE C STRICT" openstreetmap
+ - psql -U postgres -c "CREATE FUNCTION tile_for_point(int4, int4) RETURNS int8 AS '/tmp/libpgosm', 'tile_for_point' LANGUAGE C STRICT" openstreetmap
+ - psql -U postgres -c "CREATE FUNCTION xid_to_int4(xid) RETURNS int4 AS '/tmp/libpgosm', 'xid_to_int4' LANGUAGE C STRICT" openstreetmap
- cp config/travis.database.yml config/database.yml
- bundle exec rake db:migrate
+ - bundle exec rake i18n:js:export
script:
- bundle exec rubocop -f fuubar
- bundle exec rake jshint
- - bundle exec rake test
+ - bundle exec rake test:db
Your installation comes with no geographic data loaded. You can either create new data using one of the editors (Potlatch 2, iD, JOSM etc) or by loading an OSM extract.
-After installing but before creating any users or data, import an extract with [Osmosis](http://wiki.openstreetmap.org/wiki/Osmosis) and the [``--write-apidb``](http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#--write-apidb_.28--wd.29) task.
+After installing but before creating any users or data, import an extract with [Osmosis](https://wiki.openstreetmap.org/wiki/Osmosis) and the [``--write-apidb``](https://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#--write-apidb_.28--wd.29) task.
```
osmosis --read-pbf greater-london-latest.osm.pbf \
user="openstreetmap" password="" validateSchemaVersion="no"
```
-Loading an apidb database with Osmosis is about **twenty** times slower than loading the equivalent data with osm2pgsql into a rendering database. [``--log-progress``](http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#--log-progress_.28--lp.29) may be desirable for status updates.
+Loading an apidb database with Osmosis is about **twenty** times slower than loading the equivalent data with osm2pgsql into a rendering database. [``--log-progress``](https://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#--log-progress_.28--lp.29) may be desirable for status updates.
To be able to edit the data you have loaded, you will need to use this [yet-to-be-written script](https://github.com/openstreetmap/openstreetmap-website/issues/282).
Follow the same process for registering and configuring iD (`id_key`) and the website/Notes (`oauth_key`), or to save time, simply reuse the same consumer key for each.
+**NOTE:** If you forget to set up OAuth, then you will get an error message similar to `uninitialized constant ActionView::CompiledTemplates::ID_KEY`.
+
## Troubleshooting
Rails has its own log. To inspect the log, do this:
tail -f log/development.log
```
-If you have more problems, please ask on the [rails-dev@openstreetmap.org mailing list](http://lists.openstreetmap.org/listinfo/rails-dev) or on the [#osm-dev IRC Channel](http://wiki.openstreetmap.org/wiki/IRC)
+If you have more problems, please ask on the [rails-dev@openstreetmap.org mailing list](https://lists.openstreetmap.org/listinfo/rails-dev) or on the [#osm-dev IRC Channel](https://wiki.openstreetmap.org/wiki/IRC)
## Maintaining your installation
## Testing on the osm dev server
-For example, after developing a patch for the rails_port, you might want to demonstrate it to others or ask for comments and testing. To do this one can [set up an instance of the rails_port on the dev server in ones user directory](http://wiki.openstreetmap.org/wiki/Using_the_dev_server#Rails_Applications).
+For example, after developing a patch for the rails_port, you might want to demonstrate it to others or ask for comments and testing. To do this one can [set up an instance of the rails_port on the dev server in ones user directory](https://wiki.openstreetmap.org/wiki/Using_the_dev_server#Rails_Applications).
# Contributing
* Passenger will, by design, use the Production environment and therefore the production database - make sure it contains the appropriate data and user accounts.
* Your production database will also need the extensions and functions installed - see [INSTALL.md](INSTALL.md)
* The included version of the map call is quite slow and eats a lot of memory. You should consider using [CGIMap](https://github.com/zerebubuth/openstreetmap-cgimap) instead.
-* The included version of the GPX importer is slow and/or completely inoperable. You should consider using [the high-speed GPX importer](http://git.openstreetmap.org/gpx-import.git/).
+* The included version of the GPX importer is slow and/or completely inoperable. You should consider using [the high-speed GPX importer](https://git.openstreetmap.org/gpx-import.git/).
* Make sure you precompile the production assets: `RAILS_ENV=production rake assets:precompile`
* Make sure the web server user as well as the rails user can read, write and create directories in `tmp/`.
-* http://www.ruby-lang.org/ - The homepage of Ruby which has more links and some great tutorials.
+* https://www.ruby-lang.org/ - The homepage of Ruby which has more links and some great tutorials.
* http://rubyonrails.org/ - The homepage of Rails, also has links and tutorials
## Coding style
When writing code it is generally a good idea to try and match your
formatting to that of any existing code in the same file, or to other
similar files if you are writing new code. Consistency of layout is
-far more important that the layout itself as it makes reading code
+far more important than the layout itself as it makes reading code
much easier.
One golden rule of formatting -- please don't use tabs in your code
rcov -x gems test/*/*.rb
```
-The tests are automatically run on commit with the results shown at [http://cruise.openstreetmap.org/](http://cruise.openstreetmap.org/)
+The tests are automatically run on Pull Requests and other commits with the
+results shown on [Travis CI](https://travis-ci.org/openstreetmap/openstreetmap-website).
## Comments
push your changes back to GitHub and then send a "pull request" on GitHub.
Otherwise you should either push your changes to a publicly visible git repository
-and send the details to the [rails-dev](http://lists.openstreetmap.org/listinfo/rails-dev)
+and send the details to the [rails-dev](https://lists.openstreetmap.org/listinfo/rails-dev)
list or generate patches with `git format-patch` and send them to the
-[rails-dev](http://lists.openstreetmap.org/listinfo/rails-dev) list.
-
+[rails-dev](https://lists.openstreetmap.org/listinfo/rails-dev) list.
--- /dev/null
+## How do I create a banner to promote my OpenStreetMap event?
+
+We occasionally display banner images on the main page of [openstreetmap.org](https://www.openstreetmap.org/) to
+promote a large OpenStreetMap focused conference or host a worldwide donation
+drive. This is a great way to reach a lot of people!
+
+1. Please review [openstreetmap/operations#150](https://github.com/openstreetmap/operations/issues/150) to
+know whether your event qualifies for a front-page banner.
+
+2. Create the banner image. Some guidelines:
+ * Image should be 350px wide (exactly) x 350px tall (or shorter).
+ * Use a standard web image format (.gif, .jpg, .png)
+ * Note that a close 'X' button will be drawn over the top right 60x60px
+ corner of the banner, so please do not put anything important in that space.
+
+3. Prepare a pull request which includes the following:
+ * The banner should be saved under the
+ [`app/assets/images/banners/`](https://github.com/openstreetmap/openstreetmap-website/tree/master/app/assets/images/banners) folder, and should have a name that makes it clear what it is for (e.g. `donate-2017.jpg`)
+ * Edit [`config/banners.yml`](https://github.com/openstreetmap/openstreetmap-website/blob/master/config/banners.yml)
+ to contain an entry for the event banner. It should contain the following:
+ * `id` - a unique identifier (e.g. `donate2017`)
+ * `alt` - alt name for the image (e.g. `OpenStreetMap Funding Drive 2017`)
+ * `link` - URL for your event page (e.g. `https://donate.openstreetmap.org/`)
+ * `img` - the filename for the banner image (e.g. `banners/donate-2017.jpg`)
+ * `enddate` - the final date that the banner will be shown (e.g. `2017-oct-31`)
+ * (optional) Feel free to cleanup the old images from the `app/assets/images/banners/`
+ folder and old entries in the `config/banners.yml` file.
+
+See [PR #1296](https://github.com/openstreetmap/openstreetmap-website/pull/1296)
+as an example.
source "https://rubygems.org"
# Require rails
-gem "rails", "4.2.5.1"
+gem "rails", "5.2.2"
# Require things which have moved to gems in ruby 1.9
gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19
gem "json"
# Use postgres as the database
-gem "pg"
+gem "pg", "~> 0.18"
# Use SCSS for stylesheets
-gem "sass-rails", "~> 5.0"
+gem "sassc-rails"
# Use Uglifier as compressor for JavaScript assets
gem "uglifier", ">= 1.3.0"
# Use CoffeeScript for .js.coffee assets and views
-gem "coffee-rails", "~> 4.1.0"
+gem "coffee-rails", "~> 4.2"
# Use jquery as the JavaScript library
gem "jquery-rails"
# gem 'jbuilder', '~> 2.0'
gem "jsonify-rails"
+# Reduces boot times through caching; required in config/boot.rb
+gem "bootsnap", ">= 1.1.0", :require => false
+
# Use R2 for RTL conversion
-gem "r2"
+gem "r2", "~> 0.2.7"
# Use autoprefixer to generate CSS prefixes
-gem "autoprefixer-rails"
+gem "autoprefixer-rails", "~> 8.6.3"
# Use image_optim to optimise images
-gem "image_optim", ">= 0.22.0"
+gem "image_optim_rails"
# Load rails plugins
-gem "rails-i18n", "~> 4.0.0"
+gem "actionpack-page_caching"
+gem "active_record_union"
+gem "cancancan"
+gem "composite_primary_keys", "~> 11.1.0"
+gem "delayed_job_active_record"
gem "dynamic_form"
-gem "rinku", ">= 1.2.2", :require => "rails_rinku"
-gem "oauth-plugin", ">= 0.5.1"
-gem "validates_email_format_of", ">= 1.5.1"
-gem "composite_primary_keys", "~> 8.1.0"
gem "http_accept_language", "~> 2.0.0"
-gem "paperclip", "~> 4.0"
-gem "deadlock_retry", ">= 1.2.0"
-gem "i18n-js", ">= 3.0.0.rc10"
+gem "i18n-js", ">= 3.0.0"
+gem "oauth-plugin", ">= 0.5.1"
+gem "openstreetmap-deadlock_retry", ">= 1.3.0", :require => "deadlock_retry"
+gem "paperclip", "~> 5.2"
gem "rack-cors"
-gem "actionpack-page_caching"
+gem "rails-i18n", "~> 4.0.0"
+gem "record_tag_helper"
+gem "rinku", ">= 1.2.2", :require => "rails_rinku"
+gem "validates_email_format_of", ">= 1.5.1"
+
+# Native OSM extensions
+gem "quad_tile", "~> 1.0.1"
# Sanitise URIs
gem "rack-uri_sanitizer"
# Omniauth for authentication
gem "omniauth"
-gem "omniauth-openid"
-gem "omniauth-google-oauth2", ">= 0.2.7"
gem "omniauth-facebook"
+gem "omniauth-github"
+gem "omniauth-google-oauth2", ">= 0.6.0"
+gem "omniauth-mediawiki", ">= 0.0.4"
+gem "omniauth-openid"
gem "omniauth-windowslive"
# Markdown formatting support
-gem "redcarpet"
+gem "kramdown"
+
+# For status transitions of Issues
+gem "aasm"
# Load libxml support for XML parsing and generation
gem "libxml-ruby", ">= 2.0.5", :require => "libxml"
# Use for HTML sanitisation
-gem "sanitize"
gem "htmlentities"
+gem "sanitize"
# Load SystemTimer for implementing request timeouts
gem "SystemTimer", ">= 1.1.3", :require => "system_timer", :platforms => :ruby_18
# Load faraday for mockable HTTP client
gem "faraday"
-# Load httpclient and soap4r for SOAP support for Quova GeoIP queries
-gem "httpclient"
-gem "soap4r-ruby1.9"
+# Load geoip for querying Maxmind GeoIP database
+gem "geoip"
+
+# Load rotp to generate TOTP tokens
+gem "rotp"
# Load memcache client in case we are using it
gem "dalli"
gem "kgio"
+# Load secure_headers for Content-Security-Policy support
+gem "secure_headers"
+
+# Load canonical-rails to generate canonical URLs
+gem "canonical-rails"
+
# Used to generate logstash friendly log files
gem "logstasher"
-# Stay with sprockets-rails 2.x pending fix for konacha
-gem "sprockets-rails", "< 3"
-
# Gems useful for development
group :development do
+ gem "annotate"
+ gem "better_errors"
+ gem "binding_of_caller"
+ gem "listen"
gem "vendorer"
end
# Gems needed for running tests
group :test do
- gem "rubocop"
- gem "timecop"
gem "minitest", "~> 5.1", :platforms => [:ruby_19, :ruby_20]
+ gem "rails-controller-testing"
+ gem "rubocop"
+ gem "webmock"
end
# Needed in development as well so rake can see konacha tasks
group :development, :test do
+ gem "capybara", "~> 2.13"
+ gem "coveralls", :require => false
+ gem "factory_bot_rails"
gem "jshint"
- gem "konacha"
gem "poltergeist"
- gem "coveralls", :require => false
+ gem "puma", "~> 3.7"
end
remote: https://rubygems.org/
specs:
SystemTimer (1.2.3)
- actionmailer (4.2.5.1)
- actionpack (= 4.2.5.1)
- actionview (= 4.2.5.1)
- activejob (= 4.2.5.1)
+ aasm (5.0.1)
+ concurrent-ruby (~> 1.0)
+ actioncable (5.2.2)
+ actionpack (= 5.2.2)
+ nio4r (~> 2.0)
+ websocket-driver (>= 0.6.1)
+ actionmailer (5.2.2)
+ actionpack (= 5.2.2)
+ actionview (= 5.2.2)
+ activejob (= 5.2.2)
mail (~> 2.5, >= 2.5.4)
- rails-dom-testing (~> 1.0, >= 1.0.5)
- actionpack (4.2.5.1)
- actionview (= 4.2.5.1)
- activesupport (= 4.2.5.1)
- rack (~> 1.6)
- rack-test (~> 0.6.2)
- rails-dom-testing (~> 1.0, >= 1.0.5)
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
- actionpack-page_caching (1.0.2)
- actionpack (>= 4.0.0, < 5)
- actionview (4.2.5.1)
- activesupport (= 4.2.5.1)
- builder (~> 3.1)
- erubis (~> 2.7.0)
- rails-dom-testing (~> 1.0, >= 1.0.5)
+ rails-dom-testing (~> 2.0)
+ actionpack (5.2.2)
+ actionview (= 5.2.2)
+ activesupport (= 5.2.2)
+ rack (~> 2.0)
+ rack-test (>= 0.6.3)
+ rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
- activejob (4.2.5.1)
- activesupport (= 4.2.5.1)
- globalid (>= 0.3.0)
- activemodel (4.2.5.1)
- activesupport (= 4.2.5.1)
+ actionpack-page_caching (1.1.1)
+ actionpack (>= 4.0.0, < 6)
+ actionview (5.2.2)
+ activesupport (= 5.2.2)
builder (~> 3.1)
- activerecord (4.2.5.1)
- activemodel (= 4.2.5.1)
- activesupport (= 4.2.5.1)
- arel (~> 6.0)
- activesupport (4.2.5.1)
- i18n (~> 0.7)
- json (~> 1.7, >= 1.7.7)
+ erubi (~> 1.4)
+ rails-dom-testing (~> 2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
+ active_record_union (1.3.0)
+ activerecord (>= 4.0)
+ activejob (5.2.2)
+ activesupport (= 5.2.2)
+ globalid (>= 0.3.6)
+ activemodel (5.2.2)
+ activesupport (= 5.2.2)
+ activerecord (5.2.2)
+ activemodel (= 5.2.2)
+ activesupport (= 5.2.2)
+ arel (>= 9.0)
+ activestorage (5.2.2)
+ actionpack (= 5.2.2)
+ activerecord (= 5.2.2)
+ marcel (~> 0.3.1)
+ activesupport (5.2.2)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 0.7, < 2)
minitest (~> 5.1)
- thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
- addressable (2.4.0)
- arel (6.0.3)
- ast (2.2.0)
- autoprefixer-rails (6.3.1)
+ addressable (2.5.2)
+ public_suffix (>= 2.0.2, < 4.0)
+ annotate (2.7.4)
+ activerecord (>= 3.2, < 6.0)
+ rake (>= 10.4, < 13.0)
+ arel (9.0.0)
+ ast (2.4.0)
+ autoprefixer-rails (8.6.5)
execjs
- json
+ better_errors (2.5.0)
+ coderay (>= 1.0.0)
+ erubi (>= 1.0.0)
+ rack (>= 0.9.0)
bigdecimal (1.1.0)
- builder (3.2.2)
- capybara (2.6.0)
+ binding_of_caller (0.8.0)
+ debug_inspector (>= 0.0.1)
+ bootsnap (1.3.2)
+ msgpack (~> 1.0)
+ builder (3.2.3)
+ cancancan (2.3.0)
+ canonical-rails (0.2.4)
+ rails (>= 4.1, < 5.3)
+ capybara (2.18.0)
addressable
- mime-types (>= 1.16)
+ mini_mime (>= 0.1.3)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
- xpath (~> 2.0)
- climate_control (0.0.3)
- activesupport (>= 3.0)
+ xpath (>= 2.0, < 4.0)
+ climate_control (0.2.0)
cliver (0.3.2)
- cocaine (0.5.8)
- climate_control (>= 0.0.3, < 1.0)
- coffee-rails (4.1.1)
+ coderay (1.1.2)
+ coffee-rails (4.2.2)
coffee-script (>= 2.2.0)
- railties (>= 4.0.0, < 5.1.x)
+ railties (>= 4.0.0)
coffee-script (2.4.1)
coffee-script-source
execjs
- coffee-script-source (1.10.0)
- colorize (0.7.7)
- composite_primary_keys (8.1.2)
- activerecord (~> 4.2.0)
- concurrent-ruby (1.0.0)
- coveralls (0.8.10)
- json (~> 1.8)
- rest-client (>= 1.6.8, < 2)
- simplecov (~> 0.11.0)
+ coffee-script-source (1.12.2)
+ composite_primary_keys (11.1.0)
+ activerecord (~> 5.2.1)
+ concurrent-ruby (1.1.4)
+ coveralls (0.8.22)
+ json (>= 1.8, < 3)
+ simplecov (~> 0.16.1)
term-ansicolor (~> 1.3)
- thor (~> 0.19.1)
- tins (~> 1.6.0)
- crass (1.0.2)
- dalli (2.7.5)
- deadlock_retry (1.2.0)
- docile (1.1.5)
- domain_name (0.5.25)
- unf (>= 0.0.5, < 1.0.0)
+ thor (~> 0.19.4)
+ tins (~> 1.6)
+ crack (0.4.3)
+ safe_yaml (~> 1.0.0)
+ crass (1.0.4)
+ dalli (2.7.9)
+ debug_inspector (0.0.3)
+ delayed_job (4.1.5)
+ activesupport (>= 3.0, < 5.3)
+ delayed_job_active_record (4.1.3)
+ activerecord (>= 3.0, < 5.3)
+ delayed_job (>= 3.0, < 5)
+ docile (1.3.1)
dynamic_form (1.1.4)
- erubis (2.7.0)
- execjs (2.6.0)
- exifr (1.2.4)
- faraday (0.9.2)
+ erubi (1.8.0)
+ execjs (2.7.0)
+ exifr (1.3.5)
+ factory_bot (4.11.1)
+ activesupport (>= 3.0.0)
+ factory_bot_rails (4.11.1)
+ factory_bot (~> 4.11.1)
+ railties (>= 3.0.0)
+ faraday (0.15.4)
multipart-post (>= 1.2, < 3)
- fspath (2.1.1)
- globalid (0.3.6)
- activesupport (>= 4.1.0)
- hashie (3.4.3)
+ ffi (1.9.25)
+ fspath (3.1.0)
+ geoip (1.6.4)
+ globalid (0.4.1)
+ activesupport (>= 4.2.0)
+ hashdiff (0.3.8)
+ hashie (3.6.0)
htmlentities (4.3.4)
- http-cookie (1.0.2)
- domain_name (~> 0.5)
http_accept_language (2.0.5)
- httpclient (2.7.1)
- i18n (0.7.0)
- i18n-js (3.0.0.rc12)
- i18n (~> 0.6, >= 0.6.6)
- image_optim (0.22.0)
+ i18n (0.9.5)
+ concurrent-ruby (~> 1.0)
+ i18n-js (3.2.0)
+ i18n (>= 0.8.0, < 2)
+ image_optim (0.26.3)
exifr (~> 1.2, >= 1.2.2)
- fspath (~> 2.1)
- image_size (~> 1.3)
+ fspath (~> 3.0)
+ image_size (>= 1.5, < 3)
in_threads (~> 1.3)
progress (~> 3.0, >= 3.0.1)
- image_size (1.4.1)
- in_threads (1.3.1)
- jquery-rails (4.1.0)
- rails-dom-testing (~> 1.0)
+ image_optim_rails (0.4.1)
+ image_optim (~> 0.24)
+ rails
+ sprockets
+ image_size (2.0.0)
+ in_threads (1.5.1)
+ jaro_winkler (1.5.2)
+ jquery-rails (4.3.3)
+ rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
- jshint (1.4.0)
+ jshint (1.5.0)
execjs (>= 1.4.0)
multi_json (~> 1.0)
therubyracer (~> 0.12.1)
- json (1.8.3)
+ json (2.1.0)
jsonify (0.3.1)
multi_json (~> 1.0)
jsonify-rails (0.3.2)
actionpack
jsonify (< 0.4.0)
- jwt (1.5.2)
- kgio (2.10.0)
- konacha (3.7.0)
- actionpack (>= 3.1, < 5)
- capybara
- colorize
- railties (>= 3.1, < 5)
- sprockets (>= 2, < 4)
- tilt
- libv8 (3.16.14.13)
- libxml-ruby (2.8.0)
+ jwt (2.1.0)
+ kgio (2.11.2)
+ kramdown (1.17.0)
+ libv8 (3.16.14.19)
+ libxml-ruby (3.1.0)
+ listen (3.1.5)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ ruby_dep (~> 1.2)
logstash-event (1.2.02)
- logstasher (0.8.6)
- activerecord (>= 3.0)
- activesupport (>= 3.0)
+ logstasher (1.3.0)
+ activesupport (>= 4.0)
logstash-event (~> 1.2.0)
request_store
- loofah (2.0.3)
+ loofah (2.2.3)
+ crass (~> 1.0.2)
nokogiri (>= 1.5.9)
- mail (2.6.3)
- mime-types (>= 1.16, < 3)
- mime-types (2.99)
- mimemagic (0.3.0)
- mini_portile2 (2.0.0)
- minitest (5.8.4)
- multi_json (1.11.2)
- multi_xml (0.5.5)
+ mail (2.7.1)
+ mini_mime (>= 0.1.1)
+ marcel (0.3.3)
+ mimemagic (~> 0.3.2)
+ method_source (0.9.2)
+ mime-types (3.2.2)
+ mime-types-data (~> 3.2015)
+ mime-types-data (3.2018.0812)
+ mimemagic (0.3.3)
+ mini_mime (1.0.1)
+ mini_portile2 (2.4.0)
+ minitest (5.11.3)
+ msgpack (1.2.6)
+ multi_json (1.13.1)
+ multi_xml (0.6.0)
multipart-post (2.0.0)
- netrc (0.11.0)
- nokogiri (1.6.7.2)
- mini_portile2 (~> 2.0.0.rc2)
- nokogumbo (1.4.7)
- nokogiri
+ nio4r (2.3.1)
+ nokogiri (1.10.0)
+ mini_portile2 (~> 2.4.0)
+ nokogumbo (2.0.1)
+ nokogiri (~> 1.8, >= 1.8.4)
oauth (0.4.7)
oauth-plugin (0.5.1)
multi_json
oauth (~> 0.4.4)
oauth2 (>= 0.5.0)
rack
- oauth2 (1.0.0)
- faraday (>= 0.8, < 0.10)
- jwt (~> 1.0)
+ oauth2 (1.4.1)
+ faraday (>= 0.8, < 0.16.0)
+ jwt (>= 1.0, < 3.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
- rack (~> 1.2)
- omniauth (1.3.1)
- hashie (>= 1.2, < 4)
- rack (>= 1.0, < 3)
- omniauth-facebook (3.0.0)
+ rack (>= 1.2, < 3)
+ omniauth (1.9.0)
+ hashie (>= 3.4.6, < 3.7.0)
+ rack (>= 1.6.2, < 3)
+ omniauth-facebook (5.0.0)
omniauth-oauth2 (~> 1.2)
- omniauth-google-oauth2 (0.3.0)
- addressable (~> 2.3)
- jwt (~> 1.0)
- multi_json (~> 1.3)
+ omniauth-github (1.3.0)
+ omniauth (~> 1.5)
+ omniauth-oauth2 (>= 1.4.0, < 2.0)
+ omniauth-google-oauth2 (0.6.0)
+ jwt (>= 2.0)
omniauth (>= 1.1.1)
- omniauth-oauth2 (>= 1.3.1)
- omniauth-oauth2 (1.4.0)
- oauth2 (~> 1.0)
- omniauth (~> 1.2)
+ omniauth-oauth2 (>= 1.5)
+ omniauth-mediawiki (0.0.4)
+ jwt (~> 2.0)
+ omniauth-oauth (~> 1.0)
+ omniauth-oauth (1.1.0)
+ oauth
+ omniauth (~> 1.0)
+ omniauth-oauth2 (1.6.0)
+ oauth2 (~> 1.1)
+ omniauth (~> 1.9)
omniauth-openid (1.0.1)
omniauth (~> 1.0)
rack-openid (~> 1.3.1)
- omniauth-windowslive (0.0.9.1)
- multi_json (>= 1.0.3)
- omniauth-oauth2 (~> 1.0)
- paperclip (4.3.2)
- activemodel (>= 3.2.0)
- activesupport (>= 3.2.0)
- cocaine (~> 0.5.5)
+ omniauth-windowslive (0.0.12)
+ multi_json (~> 1.12)
+ omniauth-oauth2 (~> 1.4)
+ openstreetmap-deadlock_retry (1.3.0)
+ paperclip (5.3.0)
+ activemodel (>= 4.2.0)
+ activesupport (>= 4.2.0)
mime-types
- mimemagic (= 0.3.0)
- parser (2.3.0.2)
- ast (~> 2.2)
- pg (0.18.4)
- poltergeist (1.8.1)
- capybara (~> 2.1)
+ mimemagic (~> 0.3.0)
+ terrapin (~> 0.6.0)
+ parallel (1.12.1)
+ parser (2.5.3.0)
+ ast (~> 2.4.0)
+ pg (0.21.0)
+ poltergeist (1.18.1)
+ capybara (>= 2.1, < 4)
cliver (~> 0.3.1)
- multi_json (~> 1.0)
websocket-driver (>= 0.2.0)
- powerpack (0.1.1)
- progress (3.1.1)
- psych (2.0.17)
- r2 (0.2.6)
- rack (1.6.4)
- rack-cors (0.4.0)
+ powerpack (0.1.2)
+ progress (3.5.0)
+ psych (3.1.0)
+ public_suffix (3.0.3)
+ puma (3.12.0)
+ quad_tile (1.0.1)
+ r2 (0.2.7)
+ rack (2.0.6)
+ rack-cors (1.0.2)
rack-openid (1.3.1)
rack (>= 1.1.0)
ruby-openid (>= 2.1.8)
- rack-test (0.6.3)
- rack (>= 1.0)
+ rack-test (1.1.0)
+ rack (>= 1.0, < 3)
rack-uri_sanitizer (0.0.2)
- rails (4.2.5.1)
- actionmailer (= 4.2.5.1)
- actionpack (= 4.2.5.1)
- actionview (= 4.2.5.1)
- activejob (= 4.2.5.1)
- activemodel (= 4.2.5.1)
- activerecord (= 4.2.5.1)
- activesupport (= 4.2.5.1)
- bundler (>= 1.3.0, < 2.0)
- railties (= 4.2.5.1)
- sprockets-rails
- rails-deprecated_sanitizer (1.0.3)
- activesupport (>= 4.2.0.alpha)
- rails-dom-testing (1.0.7)
- activesupport (>= 4.2.0.beta, < 5.0)
- nokogiri (~> 1.6.0)
- rails-deprecated_sanitizer (>= 1.0.1)
- rails-html-sanitizer (1.0.3)
- loofah (~> 2.0)
- rails-i18n (4.0.8)
- i18n (~> 0.7)
- railties (~> 4.0)
- railties (4.2.5.1)
- actionpack (= 4.2.5.1)
- activesupport (= 4.2.5.1)
+ rails (5.2.2)
+ actioncable (= 5.2.2)
+ actionmailer (= 5.2.2)
+ actionpack (= 5.2.2)
+ actionview (= 5.2.2)
+ activejob (= 5.2.2)
+ activemodel (= 5.2.2)
+ activerecord (= 5.2.2)
+ activestorage (= 5.2.2)
+ activesupport (= 5.2.2)
+ bundler (>= 1.3.0)
+ railties (= 5.2.2)
+ sprockets-rails (>= 2.0.0)
+ rails-controller-testing (1.0.4)
+ actionpack (>= 5.0.1.x)
+ actionview (>= 5.0.1.x)
+ activesupport (>= 5.0.1.x)
+ rails-dom-testing (2.0.3)
+ activesupport (>= 4.2.0)
+ nokogiri (>= 1.6)
+ rails-html-sanitizer (1.0.4)
+ loofah (~> 2.2, >= 2.2.2)
+ rails-i18n (4.0.2)
+ i18n (~> 0.6)
+ rails (>= 4.0)
+ railties (5.2.2)
+ actionpack (= 5.2.2)
+ activesupport (= 5.2.2)
+ method_source
rake (>= 0.8.7)
- thor (>= 0.18.1, < 2.0)
- rainbow (2.1.0)
- rake (10.5.0)
- redcarpet (3.3.4)
+ thor (>= 0.19.0, < 2.0)
+ rainbow (3.0.0)
+ rake (12.3.2)
+ rb-fsevent (0.10.3)
+ rb-inotify (0.10.0)
+ ffi (~> 1.0)
+ record_tag_helper (1.0.0)
+ actionview (~> 5.x)
ref (2.0.0)
- request_store (1.3.0)
- rest-client (1.8.0)
- http-cookie (>= 1.0.2, < 2.0)
- mime-types (>= 1.16, < 3.0)
- netrc (~> 0.7)
- rinku (1.7.3)
- rubocop (0.36.0)
- parser (>= 2.3.0.0, < 3.0)
+ request_store (1.4.1)
+ rack (>= 1.4)
+ rinku (2.0.4)
+ rotp (4.0.2)
+ addressable (~> 2.5)
+ rubocop (0.62.0)
+ jaro_winkler (~> 1.5.1)
+ parallel (~> 1.10)
+ parser (>= 2.5, != 2.5.1.1)
powerpack (~> 0.1)
- rainbow (>= 1.99.1, < 3.0)
+ rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7)
+ unicode-display_width (~> 1.4.0)
ruby-openid (2.7.0)
- ruby-progressbar (1.7.5)
- sanitize (4.0.1)
+ ruby-progressbar (1.10.0)
+ ruby_dep (1.5.0)
+ safe_yaml (1.0.4)
+ sanitize (5.0.0)
crass (~> 1.0.2)
- nokogiri (>= 1.4.4)
- nokogumbo (~> 1.4.1)
- sass (3.4.21)
- sass-rails (5.0.4)
- railties (>= 4.0.0, < 5.0)
- sass (~> 3.1)
- sprockets (>= 2.8, < 4.0)
- sprockets-rails (>= 2.0, < 4.0)
- tilt (>= 1.1, < 3)
- simplecov (0.11.1)
- docile (~> 1.1.0)
- json (~> 1.8)
+ nokogiri (>= 1.8.0)
+ nokogumbo (~> 2.0)
+ sassc (2.0.0)
+ ffi (~> 1.9.6)
+ rake
+ sassc-rails (2.1.0)
+ railties (>= 4.0.0)
+ sassc (>= 2.0)
+ sprockets (> 3.0)
+ sprockets-rails
+ tilt
+ secure_headers (6.0.0)
+ simplecov (0.16.1)
+ docile (~> 1.1)
+ json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
- simplecov-html (0.10.0)
- soap4r-ruby1.9 (2.0.5)
- sprockets (3.5.2)
+ simplecov-html (0.10.2)
+ sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
- sprockets-rails (2.3.3)
- actionpack (>= 3.0)
- activesupport (>= 3.0)
- sprockets (>= 2.8, < 4.0)
- term-ansicolor (1.3.2)
+ sprockets-rails (3.2.1)
+ actionpack (>= 4.0)
+ activesupport (>= 4.0)
+ sprockets (>= 3.0.0)
+ term-ansicolor (1.7.0)
tins (~> 1.0)
- therubyracer (0.12.2)
- libv8 (~> 3.16.14.0)
+ terrapin (0.6.0)
+ climate_control (>= 0.0.3, < 1.0)
+ therubyracer (0.12.3)
+ libv8 (~> 3.16.14.15)
ref
- thor (0.19.1)
- thread_safe (0.3.5)
- tilt (2.0.2)
- timecop (0.8.0)
- tins (1.6.0)
- tzinfo (1.2.2)
+ thor (0.19.4)
+ thread_safe (0.3.6)
+ tilt (2.0.9)
+ tins (1.20.2)
+ tzinfo (1.2.5)
thread_safe (~> 0.1)
- uglifier (2.7.2)
- execjs (>= 0.3.0)
- json (>= 1.8.0)
- unf (0.1.4)
- unf_ext
- unf_ext (0.0.7.1)
+ uglifier (4.1.20)
+ execjs (>= 0.3.0, < 3)
+ unicode-display_width (1.4.1)
validates_email_format_of (1.6.3)
i18n
- vendorer (0.1.16)
- websocket-driver (0.6.3)
+ vendorer (0.2.0)
+ webmock (3.5.1)
+ addressable (>= 2.3.6)
+ crack (>= 0.3.2)
+ hashdiff
+ websocket-driver (0.7.0)
websocket-extensions (>= 0.1.0)
- websocket-extensions (0.1.2)
- xpath (2.0.0)
- nokogiri (~> 1.3)
+ websocket-extensions (0.1.3)
+ xpath (3.2.0)
+ nokogiri (~> 1.8)
PLATFORMS
ruby
DEPENDENCIES
SystemTimer (>= 1.1.3)
+ aasm
actionpack-page_caching
- autoprefixer-rails
+ active_record_union
+ annotate
+ autoprefixer-rails (~> 8.6.3)
+ better_errors
bigdecimal (~> 1.1.0)
- coffee-rails (~> 4.1.0)
- composite_primary_keys (~> 8.1.0)
+ binding_of_caller
+ bootsnap (>= 1.1.0)
+ cancancan
+ canonical-rails
+ capybara (~> 2.13)
+ coffee-rails (~> 4.2)
+ composite_primary_keys (~> 11.1.0)
coveralls
dalli
- deadlock_retry (>= 1.2.0)
+ delayed_job_active_record
dynamic_form
+ factory_bot_rails
faraday
+ geoip
htmlentities
http_accept_language (~> 2.0.0)
- httpclient
- i18n-js (>= 3.0.0.rc10)
- image_optim (>= 0.22.0)
+ i18n-js (>= 3.0.0)
+ image_optim_rails
jquery-rails
jshint
json
jsonify-rails
kgio
- konacha
+ kramdown
libxml-ruby (>= 2.0.5)
+ listen
logstasher
minitest (~> 5.1)
oauth-plugin (>= 0.5.1)
omniauth
omniauth-facebook
- omniauth-google-oauth2 (>= 0.2.7)
+ omniauth-github
+ omniauth-google-oauth2 (>= 0.6.0)
+ omniauth-mediawiki (>= 0.0.4)
omniauth-openid
omniauth-windowslive
- paperclip (~> 4.0)
- pg
+ openstreetmap-deadlock_retry (>= 1.3.0)
+ paperclip (~> 5.2)
+ pg (~> 0.18)
poltergeist
psych
- r2
+ puma (~> 3.7)
+ quad_tile (~> 1.0.1)
+ r2 (~> 0.2.7)
rack-cors
rack-uri_sanitizer
- rails (= 4.2.5.1)
+ rails (= 5.2.2)
+ rails-controller-testing
rails-i18n (~> 4.0.0)
- redcarpet
+ record_tag_helper
rinku (>= 1.2.2)
+ rotp
rubocop
sanitize
- sass-rails (~> 5.0)
- soap4r-ruby1.9
- sprockets-rails (< 3)
- timecop
+ sassc-rails
+ secure_headers
uglifier (>= 1.3.0)
validates_email_format_of (>= 1.5.1)
vendorer
+ webmock
+
+BUNDLED WITH
+ 1.16.2
You can install the software directly on your machine, which is the traditional and probably best-supported approach. However, there is an alternative which may be easier: Vagrant. This installs the software into a virtual machine, which makes it easier to get a consistent development environment and may avoid installation difficulties. For Vagrant instructions, see [VAGRANT.md](VAGRANT.md).
-These instructions are based on Ubuntu 12.04 LTS, which is the platform used by the OSMF servers.
+These instructions are based on Ubuntu 16.04 LTS, which is the platform used by the OSMF servers.
The instructions also work, with only minor amendments, for all other current Ubuntu releases, Fedora and MacOSX
-We don't recommend attempting to develop or deploy this software on Windows. If you need to use Windows, then try developing this sofware using Ubuntu in a virtual machine, or use [Vagrant](VAGRANT.md).
+We don't recommend attempting to develop or deploy this software on Windows. If you need to use Windows, then try developing this software using Ubuntu in a virtual machine, or use [Vagrant](VAGRANT.md).
## Dependencies
## Minimum requirements
-* Ruby 2.0
+* Ruby 2.3
* RubyGems 1.3.1+
-* Postgres 8.3+
+* PostgreSQL 9.1+
* ImageMagick
* Bundler
* Javascript Runtime
-These can be installed on Ubuntu 14.04 or later with:
+These can be installed on Ubuntu 16.04 or later with:
```
-sudo apt-get install ruby2.0 libruby2.0 ruby2.0-dev \
+sudo apt-get install ruby2.3 libruby2.3 ruby2.3-dev \
libmagickwand-dev libxml2-dev libxslt1-dev nodejs \
- apache2 apache2-threaded-dev build-essential git-core \
+ apache2 apache2-dev build-essential git-core \
postgresql postgresql-contrib libpq-dev postgresql-server-dev-all \
- libsasl2-dev imagemagick
-sudo gem2.0 install bundler
+ libsasl2-dev imagemagick libffi-dev
+sudo gem2.3 install bundler
```
### Alternative platforms
libxml2-devel js \
gcc gcc-c++ git \
postgresql postgresql-server postgresql-contrib postgresql-devel \
- perl-podlators ImageMagick
+ perl-podlators ImageMagick libffi-devel
```
-If you didn't already have Postgres installed then create a Postgres instance and start the server:
+If you didn't already have PostgreSQL installed then create a PostgreSQL instance and start the server:
```
sudo postgresql-setup initdb
sudo systemctl start postgresql.service
```
-Optionally set Postgres to start on boot:
+Optionally set PostgreSQL to start on boot:
```
sudo systemctl enable postgresql.service
For MacOSX, you will need XCode installed from the Mac App Store; OS X 10.7 (Lion) or later; and some familiarity with Unix development via the Terminal.
-Installing Postgres:
+Installing PostgreSQL:
-* Install Postgres.app from http://postgresapp.com/
-* Add Postgres to your path, by editing your profile:
+* Install Postgres.app from https://postgresapp.com/
+* Add PostgreSQL to your path, by editing your profile:
`nano ~/.profile`
Installing other dependencies:
-* Install Homebrew from http://mxcl.github.io/homebrew/
-* Install the latest version of Ruby: brew install ruby
-* Install ImageMagick: brew install imagemagick
-* Install Bundler: gem install bundler
+* Install Homebrew from https://brew.sh/
+* Install the latest version of Ruby: `brew install ruby`
+* Install ImageMagick: `brew install imagemagick`
+* Install libxml2: `brew install libxml2 --with-xml2-config`
+* If you want to run the tests, you need `phantomjs` as well: `brew install phantomjs`
+* Install Bundler: `gem install bundler`
Note that OS X does not have a /home directory by default, so if you are using the GPX functions, you will need to change the directories specified in config/application.yml.
### PostgreSQL account setup
-We need to create a PostgreSQL role (i.e. user account) for your current user, and it needs to be a superuser so that we can create more database.
+We need to create a PostgreSQL role (i.e. user account) for your current user, and it needs to be a superuser so that we can create more databases.
```
sudo -u postgres -i
### PostgreSQL Btree-gist Extension
-We need to load the btree-gist extension, which is needed for showing changesets on the history tab.
+We need to load the `btree-gist` extension, which is needed for showing changesets on the history tab.
```
psql -d openstreetmap -c "CREATE EXTENSION btree_gist"
### PostgreSQL Functions
-We need to install special functions into the postgresql databases, and these are provided by a library that needs compiling first.
+We need to install special functions into the PostgreSQL databases, and these are provided by a library that needs compiling first.
```
cd db/functions
To ensure that everything is set up properly, you should now run:
```
-bundle exec rake test
+bundle exec rake test:db
```
This test will take a few minutes, reporting tests run, assertions, and any errors. If you receive no errors, then your installation is successful.
[](https://coveralls.io/r/openstreetmap/openstreetmap-website?branch=master)
This is The Rails Port, the [Ruby on Rails](http://rubyonrails.org/)
-application that powers the [OpenStreetMap](http://www.openstreetmap.org) website and API.
+application that powers the [OpenStreetMap](https://www.openstreetmap.org) website and API.
The software is also known as "openstreetmap-website".
This repository consists of:
* The web site, including user accounts, diary entries, user-to-user messaging
-* The XML-based editing [API](http://wiki.openstreetmap.org/wiki/API_v0.6)
-* The integrated versions of the [Potlatch](http://wiki.openstreetmap.org/wiki/Potlatch_1), [Potlatch 2](http://wiki.openstreetmap.org/wiki/Potlatch_2) and [iD](http://wiki.openstreetmap.org/wiki/ID) editors
+* The XML-based editing [API](https://wiki.openstreetmap.org/wiki/API_v0.6)
+* The integrated versions of the [Potlatch](https://wiki.openstreetmap.org/wiki/Potlatch_1), [Potlatch 2](https://wiki.openstreetmap.org/wiki/Potlatch_2) and [iD](https://wiki.openstreetmap.org/wiki/ID) editors
* The Browse pages - a web front-end to the OpenStreetMap data
* The GPX uploads, browsing and API.
# License
-This software is licensed under the [GNU General Public License 2.0](http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt),
+This software is licensed under the [GNU General Public License 2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt),
a copy of which can be found in the [LICENSE](LICENSE) file.
# Installation
* Bugs are recorded in the [issue tracker](https://github.com/openstreetmap/openstreetmap-website/issues).
* Some bug reports are also found on the [OpenStreetMap trac](https://trac.openstreetmap.org/) system, in the "[website](https://trac.openstreetmap.org/query?status=new&status=assigned&status=reopened&component=website&order=priority)" and "[api](https://trac.openstreetmap.org/query?status=new&status=assigned&status=reopened&component=api&order=priority)" components
* Translation is managed by [Translatewiki](https://translatewiki.net/wiki/Translating:OpenStreetMap)
-* There is a [rails-dev@openstreetmap.org](http://lists.openstreetmap.org/listinfo/rails-dev) mailing list for development discussion.
+* There is a [rails-dev@openstreetmap.org](https://lists.openstreetmap.org/listinfo/rails-dev) mailing list for development discussion.
* IRC - there is the #osm-dev channel on irc.oftc.net.
-* There are also weekly meetings of the OpenStreetMap Foundation Engineering Working Group (EWG) on Mondays at 1700 UTC on the #osm-ewg channel.
More details on contributing to the code are in the [CONTRIBUTING.md](CONTRIBUTING.md) file.
+
+# Maintainers
+
+* Tom Hughes [@tomhughes](https://github.com/tomhughes/)
+* Andy Allan [@gravitystorm](https://github.com/gravitystorm/)
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
-require File.expand_path("../config/application", __FILE__)
+require_relative "config/application"
-OpenStreetMap::Application.load_tasks
+Rails.application.load_tasks
sudo apt-get install vagrant
```
-Other Linux distributions should have similar installation instructions using `yum` or similar.
+Other Linux distributions should have similar installation instructions using `dnf`, `pacman`, or similar.
-Installers are available for Mac OS X and Windows, please see the [Vagrant project download page](http://www.vagrantup.com/downloads) for more information.
+Installers are available for Mac OS X and Windows, please see the [Vagrant project download page](https://www.vagrantup.com/downloads.html) for more information.
+
+Note than until there are suitable _xenial64_ [vagrant boxes](https://atlas.hashicorp.com/boxes/search?utf8=%E2%9C%93&sort=&provider=&q=xenial64) for other providers,
+the only virtualization provider supported is virtualbox. You might need to install it and specify `--provider virtualbox` when setting up your environment.
# Setting up openstreetmap-website
Vagrant.configure("2") do |config|
# use official ubuntu image for virtualbox
- config.vm.provider "virtualbox" do |_, override|
- override.vm.box = "ubuntu/trusty64"
+ config.vm.provider "virtualbox" do |vb, override|
+ override.vm.box = "ubuntu/bionic64"
override.vm.synced_folder ".", "/srv/openstreetmap-website"
+ vb.customize ["modifyvm", :id, "--memory", "1024"]
+ vb.customize ["modifyvm", :id, "--cpus", "2"]
+ vb.customize ["modifyvm", :id, "--uartmode1", "disconnected"]
end
- # use third party image and NFS sharing for lxc
+ # Use sshfs sharing if available, otherwise NFS sharing
+ sharing_type = Vagrant.has_plugin?("vagrant-sshfs") ? "sshfs" : "nfs"
+
+ # use third party image and sshfs or NFS sharing for lxc
config.vm.provider "lxc" do |_, override|
- override.vm.box = "sputnik13/trusty64"
- override.vm.synced_folder ".", "/srv/openstreetmap-website", :type => "nfs"
+ override.vm.box = "generic/ubuntu1804"
+ override.vm.synced_folder ".", "/srv/openstreetmap-website", :type => sharing_type
end
- # use third party image and NFS sharing for libvirt
+ # use third party image and sshfs or NFS sharing for libvirt
config.vm.provider "libvirt" do |_, override|
- override.vm.box = "sputnik13/trusty64"
- override.vm.synced_folder ".", "/srv/openstreetmap-website", :type => "nfs"
+ override.vm.box = "generic/ubuntu1804"
+ override.vm.synced_folder ".", "/srv/openstreetmap-website", :type => sharing_type
end
# configure shared package cache if possible
end
folder 'leaflet' do
- file 'leaflet.js', 'http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet-src.js'
- file 'leaflet.css', 'http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.css'
+ file 'leaflet.js', 'https://unpkg.com/leaflet@1.4.0/dist/leaflet-src.js'
+ file 'leaflet.css', 'https://unpkg.com/leaflet@1.4.0/dist/leaflet.css'
[ 'layers.png', 'layers-2x.png',
'marker-icon.png', 'marker-icon-2x.png',
'marker-shadow.png' ].each do |image|
- file "images/#{image}", "http://cdn.leafletjs.com/leaflet/v0.7.7/images/#{image}"
+ file "images/#{image}", "https://unpkg.com/leaflet@1.4.0/dist/images/#{image}"
+ end
+
+ from 'git://github.com/aratcliffe/Leaflet.contextmenu.git', :tag => 'v1.5.0' do
+ file 'leaflet.contextmenu.js', 'dist/leaflet.contextmenu.js'
+ file 'leaflet.contextmenu.css', 'dist/leaflet.contextmenu.css'
end
from 'git://github.com/kajic/leaflet-locationfilter.git' do
folder 'img', 'src/img'
end
- from 'git://github.com/domoritz/leaflet-locatecontrol.git' do
+ from 'git://github.com/domoritz/leaflet-locatecontrol.git', :tag => 'v0.66.0' do
file 'leaflet.locate.js', 'src/L.Control.Locate.js'
end
file 'leaflet.osm.js', 'leaflet-osm.js'
end
- from 'git://github.com/jieter/Leaflet.encoded.git' do
+ from 'git://github.com/jieter/Leaflet.encoded.git', :tag => '0.0.8' do
file 'leaflet.polyline.js', 'Polyline.encoded.js'
end
end
from 'git://github.com/openstreetmap/iD', :branch => 'release' do
folder 'iD/img', 'dist/img'
folder 'iD/locales', 'dist/locales'
+ folder 'iD/mapillary-js', 'dist/mapillary-js'
+ folder 'iD/pannellum-streetside', 'dist/pannellum-streetside'
+
file 'iD.css.erb', 'dist/iD.css' do |path|
- rewrite(path) { |content| content.gsub(/url\('?(img\/[^')]+)'?\)/, 'url(<%= asset_path("iD/\1") %>)') }
+ rewrite(path) do |content|
+ content.gsub(/url\('?(img\/[^')]+)'?\)/, 'url(<%= asset_path("iD/\1") %>)')
+ end
end
+
file 'iD.js', 'dist/iD.js'
- file 'presets.js', 'dist/presets.js'
- file 'imagery.js', 'dist/imagery.js'
end
end
folder 'javascripts' do
file 'html5shiv.js', 'https://raw.githubusercontent.com/aFarkas/html5shiv/master/src/html5shiv.js'
+ file 'bowser.js', 'https://github.com/lancedikson/bowser/releases/download/1.9.4/bowser.js'
+ end
+
+ folder 'swfobject' do
+ from 'git://github.com/swfobject/swfobject.git', :tag => '2.2' do
+ file 'expressInstall.swf', 'swfobject/expressInstall.swf'
+ file 'swfobject.js', 'swfobject/src/swfobject.js'
+ end
end
end
--- /dev/null
+# frozen_string_literal: true
+
+class Ability
+ include CanCan::Ability
+
+ def initialize(user)
+ can [:trackpoints, :map, :changes, :capabilities, :permissions], :api
+ can [:relation, :relation_history, :way, :way_history, :node, :node_history,
+ :changeset, :note, :new_note, :query], :browse
+ can [:index, :feed, :show, :download, :query], Changeset
+ can :index, ChangesetComment
+ can :search, :direction
+ can [:index, :permalink, :edit, :help, :fixthemap, :offline, :export, :about, :preview, :copyright, :key, :id], :site
+ can [:index, :rss, :show, :comments], DiaryEntry
+ can [:finish, :embed], :export
+ can [:search, :search_latlon, :search_ca_postcode, :search_osm_nominatim,
+ :search_geonames, :search_osm_nominatim_reverse, :search_geonames_reverse], :geocoder
+ can [:index, :create, :comment, :feed, :show, :search, :mine], Note
+ can [:token, :request_token, :access_token, :test_request], :oauth
+ can [:index, :show], Redaction
+ can [:search_all, :search_nodes, :search_ways, :search_relations], :search
+ can [:trackpoints], :swf
+ can [:index, :show, :data, :georss, :picture, :icon], Trace
+ can [:terms, :api_users, :login, :logout, :new, :create, :save, :confirm, :confirm_resend, :confirm_email, :lost_password, :reset_password, :show, :api_read, :auth_success, :auth_failure], User
+ can [:index, :show, :blocks_on, :blocks_by], UserBlock
+ can [:index, :show], Node
+ can [:index, :show, :full, :ways_for_node], Way
+ can [:index, :show, :full, :relations_for_node, :relations_for_way, :relations_for_relation], Relation
+ can [:history, :version], OldNode
+ can [:history, :version], OldWay
+ can [:history, :version], OldRelation
+
+ if user
+ can :welcome, :site
+ can [:index, :new, :create, :show, :edit, :update, :destroy], ClientApplication
+ can [:create, :edit, :comment, :subscribe, :unsubscribe], DiaryEntry
+ can [:new, :create, :reply, :show, :inbox, :outbox, :mark, :destroy], Message
+ can [:close, :reopen], Note
+ can [:revoke, :authorize], :oauth
+ can [:new, :create], Report
+ can [:mine, :new, :create, :edit, :update, :delete, :api_create, :api_read, :api_update, :api_delete, :api_data], Trace
+ can [:account, :go_public, :make_friend, :remove_friend, :api_details, :api_gpx_files], User
+ can [:read, :read_one, :update, :update_one, :delete_one], UserPreference
+
+ if user.terms_agreed? || !REQUIRE_TERMS_AGREED
+ can [:create, :update, :upload, :close, :subscribe, :unsubscribe, :expand_bbox], Changeset
+ can :create, ChangesetComment
+ can [:create, :update, :delete], Node
+ can [:create, :update, :delete], Way
+ can [:create, :update, :delete], Relation
+ end
+
+ if user.moderator?
+ can [:destroy, :restore], ChangesetComment
+ can [:index, :show, :resolve, :ignore, :reopen], Issue
+ can :create, IssueComment
+ can :destroy, Note
+ can [:new, :create, :edit, :update, :destroy], Redaction
+ can [:new, :edit, :create, :update, :revoke], UserBlock
+ if user.terms_agreed? || !REQUIRE_TERMS_AGREED
+ can :redact, OldNode
+ can :redact, OldWay
+ can :redact, OldRelation
+ end
+ end
+
+ if user.administrator?
+ can [:hide, :hidecomment], [DiaryEntry, DiaryComment]
+ can [:index, :show, :resolve, :ignore, :reopen], Issue
+ can :create, IssueComment
+ can [:set_status, :delete, :index], User
+ can [:grant, :revoke], UserRole
+ end
+ end
+
+ # Define abilities for the passed in user here. For example:
+ #
+ # user ||= User.new # guest user (not logged in)
+ # if user.admin?
+ # can :manage, :all
+ # else
+ # can :read, :all
+ # end
+ #
+ # The first argument to `can` is the action you are giving the user
+ # permission to do.
+ # If you pass :manage it will apply to every action. Other common actions
+ # here are :read, :create, :update and :destroy.
+ #
+ # The second argument is the resource the user can perform the action on.
+ # If you pass :all it will apply to every resource. Otherwise pass a Ruby
+ # class of the resource.
+ #
+ # The third argument is an optional hash of conditions to further filter the
+ # objects.
+ # For example, here the user can only update published articles.
+ #
+ # can :update, Article, :published => true
+ #
+ # See the wiki for details:
+ # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
+ end
+end
--- /dev/null
+# frozen_string_literal: true
+
+class Capability
+ include CanCan::Ability
+
+ def initialize(token)
+ can [:create, :comment, :close, :reopen], Note if capability?(token, :allow_write_notes)
+ can [:api_read, :api_data], Trace if capability?(token, :allow_read_gpx)
+ can [:api_create, :api_update, :api_delete], Trace if capability?(token, :allow_write_gpx)
+ can [:api_details], User if capability?(token, :allow_read_prefs)
+ can [:api_gpx_files], User if capability?(token, :allow_read_gpx)
+ can [:read, :read_one], UserPreference if capability?(token, :allow_read_prefs)
+ can [:update, :update_one, :delete_one], UserPreference if capability?(token, :allow_write_prefs)
+
+ if token&.user&.terms_agreed? || !REQUIRE_TERMS_AGREED
+ can [:create, :update, :upload, :close, :subscribe, :unsubscribe, :expand_bbox], Changeset if capability?(token, :allow_write_api)
+ can :create, ChangesetComment if capability?(token, :allow_write_api)
+ can [:create, :update, :delete], Node if capability?(token, :allow_write_api)
+ can [:create, :update, :delete], Way if capability?(token, :allow_write_api)
+ can [:create, :update, :delete], Relation if capability?(token, :allow_write_api)
+ end
+
+ if token&.user&.moderator?
+ can [:destroy, :restore], ChangesetComment if capability?(token, :allow_write_api)
+ can :destroy, Note if capability?(token, :allow_write_notes)
+ if token&.user&.terms_agreed? || !REQUIRE_TERMS_AGREED
+ can :redact, OldNode if capability?(token, :allow_write_api)
+ can :redact, OldWay if capability?(token, :allow_write_api)
+ can :redact, OldRelation if capability?(token, :allow_write_api)
+ end
+ end
+ end
+
+ private
+
+ def capability?(token, cap)
+ token&.read_attribute(cap)
+ end
+end
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="520"
+ height="20"
+ viewBox="0 0 520.00001 20"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="routing-sprite.svg"
+ inkscape:export-filename="/home/patrick/Code/openstreetmap-website/app/assets/images/routing-sprite.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="131.24519"
+ inkscape:cy="13.736603"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1080"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ showguides="false"
+ inkscape:guide-bbox="true"
+ units="px">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4224" />
+ <sodipodi:guide
+ position="20.000001,31"
+ orientation="1,0"
+ id="guide4226" />
+ <sodipodi:guide
+ position="40.000001,19"
+ orientation="1,0"
+ id="guide4245" />
+ <sodipodi:guide
+ position="60.000002,29"
+ orientation="1,0"
+ id="guide4299" />
+ <sodipodi:guide
+ position="80.000002,35"
+ orientation="1,0"
+ id="guide4388" />
+ <sodipodi:guide
+ position="71.000002,10"
+ orientation="-0.7193398,-0.69465837"
+ id="guide4432"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="100,15"
+ orientation="1,0"
+ id="guide4499" />
+ <sodipodi:guide
+ position="120,15"
+ orientation="1,0"
+ id="guide4578" />
+ <sodipodi:guide
+ position="140,16"
+ orientation="1,0"
+ id="guide4580" />
+ <sodipodi:guide
+ position="160,21"
+ orientation="1,0"
+ id="guide4582" />
+ <sodipodi:guide
+ position="180,15"
+ orientation="1,0"
+ id="guide4729" />
+ <sodipodi:guide
+ position="200.00001,15"
+ orientation="1,0"
+ id="guide4731" />
+ <sodipodi:guide
+ position="220.00001,11"
+ orientation="1,0"
+ id="guide4747" />
+ <sodipodi:guide
+ position="78.000002,12"
+ orientation="-0.70710678,0.70710678"
+ id="guide4212"
+ inkscape:label=""
+ inkscape:color="rgb(0,0,255)" />
+ <sodipodi:guide
+ position="240.00001,19"
+ orientation="1,0"
+ id="guide4264" />
+ <sodipodi:guide
+ position="260.00001,19"
+ orientation="1,0"
+ id="guide4266" />
+ <sodipodi:guide
+ position="280.00001,5"
+ orientation="1,0"
+ id="guide4280" />
+ <sodipodi:guide
+ position="300.00001,10"
+ orientation="1,0"
+ id="guide4297" />
+ <sodipodi:guide
+ position="320.00001,24"
+ orientation="1,0"
+ id="guide4305" />
+ <sodipodi:guide
+ position="340.00001,28"
+ orientation="1,0"
+ id="guide4335" />
+ <sodipodi:guide
+ position="360.00001,30"
+ orientation="1,0"
+ id="guide4337" />
+ <sodipodi:guide
+ position="380.00001,19"
+ orientation="1,0"
+ id="guide4376" />
+ <sodipodi:guide
+ position="400.00001,19"
+ orientation="1,0"
+ id="guide4382" />
+ <sodipodi:guide
+ position="420.00001,36"
+ orientation="1,0"
+ id="guide4394" />
+ <sodipodi:guide
+ position="440.00001,20"
+ orientation="1,0"
+ id="guide4449" />
+ <sodipodi:guide
+ position="460.00001,22"
+ orientation="1,0"
+ id="guide4451" />
+ <sodipodi:guide
+ position="480.00001,20"
+ orientation="1,0"
+ id="guide4485" />
+ <sodipodi:guide
+ position="500.00001,40"
+ orientation="1,0"
+ id="guide4487" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1032.3622)">
+ <image
+ y="1002.3622"
+ x="1.7763568e-15"
+ id="image4217"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAAAUCAMAAACXrFfpAAABOFBMVEUAAAB/f39/f39/f39/f396 enoAAAB7e3t7e3t4eHh5eXl5eXl6enp3d3d4eHgAAAB3d3d1dXVzc3MAAABwcHBvb29ubm4AAABt bW1sbGxsbGxsbGxra2tra2toaGhoaGhqamoAAABmZmZoaGgAAABnZ2dkZGQAAABiYmJXV1dXV1cA AAAAAABMTEwAAAAAAABDQ0MAAAA1NTU1NTUxMTEAAAAxMTEAAAAAAAAmJiYlJSUkJCQjIyMiIiIA AAAcHBwAAAAAAAAAAAAAAAAUFBQAAAAAAAAQEBAPDw8AAAAPDw8AAAAAAAANDQ0MDAwAAAAAAAAM DAwKCgoAAAAAAAAICAgICAgAAAAHBwcAAAAHBwcGBgYAAAAAAAAAAAAAAAADAwMAAAAAAAAAAAAA AAAAAAAAAAAAAABULW3yAAAAZ3RSTlMAAQIGCw4QEBIUFhcZGh0gICItMDQ5PEBAQUJERUZHSEhK SkxMTU9QUFZXWGBgZGZpcHl6f4CAiJCRk5SXmaCmrLC1uLzAxMXIyMrM0NDT09TU29zg4OLk5ebm 6fDx8/T09vf4+/z9ttm2NwAABH9JREFUeF7tV+9zFTUUzQOMFZUAiwZbkB9bXYEU3UI0FVhcNQVx rQpbsBopFuX8//+BMy/vvd3k7mRnio8PHc/HOyc35545yWbZkYOQtKYSvDeOgg/Xs4JR8OI/kDnc Q6jX02wqqtZlKR7tN47MWtNfOMRZOZ/n+fmVuNwMD6hRhDmQSlcNXCCpJAKVtbYiRnIViAVspQsp w9Wo0+OmNXMHQWeoUjzabxwSsP1mNDMn1/KHAB7ma+9EK9uhfi1CPdxgijJMggtjnzWeZViSVnmW jqaF0yyBtGYNVNRTiEEe7Xc4oxXtxS78Co+fVoO6BSTpZgEgKt78GyCCHGxvFN5iBh12a6kD+OsK C2EBtCqR6pRm8SdI0QCwMQ8AsvF+FGLA6HkcpV64cOwz5B7Iw3B492gsXVgtp0XVXRFTPANQyX5S jSya/iyyBvDMs1WfCFeQrNGqrOFqyRjRTL0CGh7SDnAANcQb7Uf3FS01ugRQe+kL6uRT5Jfu/nb3 UmR04++DENmTOAu8jszXmKMbUMxa8WZxPHmDHnSQK8AQo1+uswDKExUb0VyUN4B1VQSBLixspnnI W/c82m9k3woqMtofTMjI6E9waxfA7i3kE5IiQcYLjc5aAO0VmCGj3fzclPOsyO48CO0GjGa1KxyA RgRG/wPU8UH3EGxM8w3gJovQ4BdvM+Wl+9F9BdDGRvvwtbxv9MnVTcyxufruwkBX/Qh8VTfkCq2t DZ4JQM1ZkwXfFCnlE7guMvUiFw5YULl2aKSUVd9oVTHRRPeTdp8DCEMJdNlPajYziXE6XMEor2Is 3Y/ua19iX4dGq9YAKJuqb/SFB+jwYG2RmNmHQPDoUeA4r8NLrAzf/3pqm0AtyDeFfF2EhfArupKc jdM3WjILOHKjzo5XUrMGtrcBE8Zl77s9H0rKS/aj+4pCY12FRgvGpgOIvtFn76HDvbPpL64F1HQ9 edPERpeK0ValySywrqquQ1lGRnuERnN/ZAeNrkdeCQ5qKrNnVjk91DUqwisATvsl9/VeclNIwApT BAPw5gd8Y33L41efYo6nV48nRJNSyujhdRYHwD6K0RUA0pUSM5RpgZk/CE2/rOGPuiUPZs8j/ZL7 +tAW2Aeew0ZyZe+ZdeY25rh9hi3XaOH8RXhYo+nDvB1JIPcZbUOjDWNMBcqF/7N1yGi/9L7eaP/9 cyKWa7tpJznmyCdLNdp7CscPazR90zfZiEDWoBa8ggtFl0y68DC0nteO9aP7ash5hjSRK3tfgouP XuHF9y/w6tFFtmyjufNqDmd0iELrgrFRYzBFwKww8BPT8Ui/9L7KZrMpHKdyy0WgT63lG1vX8+tb G/naqcmSjWYajr+e0RRpzdm3wM9RUe/hueGUt50cOA3uoFNyz23uPL6zcf+P+xt3Hu9snluC0ZEc zZZvdKxRUp5lKR7tNw7jeEpujp3Z1YHd35Ev22hmxFE1Wpik3MubH324sXXtg2tff7H68ZeX2dFD Zm1G0mdNgrcUrLw/YW+dPsFOnH6bHXtvhb0p/I9/AQmEF7Y+Eo3CAAAAAElFTkSuQmCC "
+ preserveAspectRatio="none"
+ height="20.000017"
+ width="360" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 9,1039.3309 3.6e-5,10.0313 1.999964,0 -3.5e-5,-10.0313 z"
+ id="path4446"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4448"
+ d="m 15,1039.3466 -5,-4.9844 -5,5 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 87.125,4.984375 87.125,5 86,5 86,12.005859 82,12 l 5,5 5,-4.984375 -4,-0.0059 0,-5.025391 7,0 L 95,17 l 2,0 0,-12 -0.46875,0 0,-0.015625 -9.40625,0 z"
+ transform="translate(0,1032.3622)"
+ id="path4509"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 28,3.9882812 2.814453,2.8203126 -4.777344,4.7460942 0,0.04297 -0.03711,0 L 26,17 28,17 28,12.423828 32.228516,8.2226562 35,11 35,4 28,3.9882812 Z"
+ transform="translate(0,1032.3622)"
+ id="path4450"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 53,4 0.0059,3.984375 -6.005859,0 0,2 L 47,17 l 2,0 0,-7.015625 4.009766,0 L 53.015625,14 58,9 53,4 Z"
+ transform="translate(0,1032.3622)"
+ id="path4208"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 67.025391,4.4101562 67.003906,17 l 2,0 0,-7.5527344 3.685547,3.8710934 -2.683114,2.694508 6.989812,0.05505 0.01101,-7.0846724 -2.854816,2.9210504 z"
+ transform="translate(0,1032.3622)"
+ id="path4424"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 170,1035.3622 -4,5 3,0 0,5 2,0 0,-5 3,0 z"
+ id="path4735"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ <g
+ id="g4237">
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 189,1039.3309 4e-5,10.0313 1.99996,0 -3e-5,-10.0313 z"
+ id="path4233"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4235"
+ d="m 195,1039.3466 -5,-4.9844 -5,5 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <path
+ id="path4221"
+ d="m 112.00001,1036.3505 -2.81445,2.8203 4.77734,4.7461 0,0.043 0.0371,0 0,5.4023 -2,0 0,-4.5762 -4.22852,-4.2011 -2.77148,2.7773 0,-7 7,-0.012 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4223"
+ d="m 128.00028,1036.3622 -0.006,3.9844 6.00586,0 0,2 0,7.0156 -2,0 0,-7.0156 -4.00977,0 -0.006,4.0156 -4.98437,-5 5,-5 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccccccccc"
+ inkscape:connector-curvature="0"
+ id="path4225"
+ d="m 153.98575,1036.7724 0.0215,12.5898 -2,0 0,-7.5527 -3.68555,3.8711 2.68312,2.6945 -6.98982,0.055 -0.011,-7.0847 2.85482,2.9211 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <g
+ id="g4254"
+ transform="translate(-2.0000461,0)">
+ <circle
+ r="3"
+ transform="scale(1,-1)"
+ cy="-1044.3622"
+ cx="210.04105"
+ id="path4231"
+ style="opacity:1;fill:none;fill-opacity:0.43824702;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path4247"
+ transform="translate(0,1032.3622)"
+ d="m 211,3.9882812 2.81445,2.8203126 -1.76562,1.7539062 c 0.58436,0.3442274 1.07073,0.8277607 1.41797,1.4101562 l 1.76172,-1.75 L 218,11 218,4 211,3.9882812 Z M 209,15.84375 209,17 l 2,0 0,-1.130859 C 210.69097,15.946541 210.3729,16 210.04102,16 209.67912,16 209.3342,15.935262 209,15.84375 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="translate(17.999954,0)"
+ id="g4258">
+ <circle
+ style="opacity:1;fill:none;fill-opacity:0.43824702;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="circle4260"
+ cx="210.04105"
+ cy="-1044.3622"
+ transform="scale(1,-1)"
+ r="3" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 211,3.9882812 2.81445,2.8203126 -1.76562,1.7539062 c 0.58436,0.3442274 1.07073,0.8277607 1.41797,1.4101562 l 1.76172,-1.75 L 218,11 218,4 211,3.9882812 Z M 209,15.84375 209,17 l 2,0 0,-1.130859 C 210.69097,15.946541 210.3729,16 210.04102,16 209.67912,16 209.3342,15.935262 209,15.84375 Z"
+ transform="translate(0,1032.3622)"
+ id="path4262" />
+ </g>
+ <g
+ id="g4268"
+ transform="translate(37.999954,0)">
+ <circle
+ r="3"
+ transform="scale(1,-1)"
+ cy="-1044.3622"
+ cx="210.04105"
+ id="circle4270"
+ style="opacity:1;fill:none;fill-opacity:0.43824702;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path4272"
+ transform="translate(0,1032.3622)"
+ d="m 211,3.9882812 2.81445,2.8203126 -1.76562,1.7539062 c 0.58436,0.3442274 1.07073,0.8277607 1.41797,1.4101562 l 1.76172,-1.75 L 218,11 218,4 211,3.9882812 Z M 209,15.84375 209,17 l 2,0 0,-1.130859 C 210.69097,15.946541 210.3729,16 210.04102,16 209.67912,16 209.3342,15.935262 209,15.84375 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g4274"
+ transform="translate(80,0)">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4276"
+ d="m 189,1039.3309 4e-5,10.0313 1.99996,0 -3e-5,-10.0313 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 195,1039.3466 -5,-4.9844 -5,5 z"
+ id="path4278"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <path
+ id="path4295"
+ d="m 290,1035.3622 a 2,2 0 0 0 -2,2 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 z m 0,4 -4,5 3,0 0,5 2,0 0,-5 3,0 -4,-5 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g4313">
+ <g
+ id="g4299"
+ transform="translate(115.01146,2)">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4301"
+ d="m 189,1037.3422 4e-5,7.9763 1.99996,0 -3e-5,-7.9763 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 192.99451,1037.3474 190,1034.3622 l -3.01146,3.0115 z"
+ id="path4303"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <g
+ transform="matrix(1,0,0,-1,123.01146,2083.7244)"
+ id="g4307">
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 189,1039.3309 4e-5,10.0313 1.99996,0 -3e-5,-10.0313 z"
+ id="path4309"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4311"
+ d="m 195,1039.3466 -5,-4.9844 -5,5 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ id="g4321"
+ transform="matrix(-1,0,0,-1,640.01146,2083.7244)">
+ <g
+ transform="translate(115.01146,2)"
+ id="g4323">
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 189,1037.3422 4e-5,7.9763 1.99996,0 -3e-5,-7.9763 z"
+ id="path4325"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4327"
+ d="M 192.99451,1037.3474 190,1034.3622 l -3.01146,3.0115 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <g
+ id="g4329"
+ transform="matrix(1,0,0,-1,123.01146,2083.7244)">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4331"
+ d="m 189,1039.3309 4e-5,10.0313 1.99996,0 -3e-5,-10.0313 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 195,1039.3466 -5,-4.9844 -5,5 z"
+ id="path4333"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ </g>
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 349,3 0,1 -3,0 0,5.2265625 L 343.95508,10 347,13 l 0,0.904297 1.61133,1.425781 1.88867,-1.671875 1.89062,1.671875 L 354,13.90625 354,13 357.04492,10.044922 355,9.2617188 355,4 l -3,0 0,-1 -3,0 z m -2,2 7,0 0,3.8769531 L 350.48633,7.53125 347,8.8496094 347,5 Z m -0.2793,9.992188 -2.2207,1.966796 0.66211,0.748047 1.55859,-1.378906 L 348.61133,18 350.5,16.328125 352.39062,18 l 1.88868,-1.671875 1.55859,1.378906 0.66211,-0.748047 -2.2207,-1.966796 -1.88868,1.673828 -1.89062,-1.673828 -1.88867,1.673828 -1.89063,-1.673828 z"
+ transform="translate(0,1032.3622)"
+ id="path4341"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g4384">
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 370,1036.3505 2.81445,2.8203 -4.77734,4.7461 0,0.043 -0.0371,0 0,5.4023 2,0 0,-4.5762 4.22852,-4.2011 2.77148,2.7773 0,-7 -7,-0.012 z"
+ id="path4374"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ inkscape:connector-curvature="0"
+ id="path4378"
+ d="m 365.18556,1039.1708 4.77734,4.7461 0,0.043 0.0371,0 0,5.4023 -2,0 0,-4.5762 -4.22852,-4.2011 z"
+ style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <g
+ id="g4388"
+ transform="matrix(-1,0,0,1,760.00001,0)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4390"
+ d="m 370,1036.3505 2.81445,2.8203 -4.77734,4.7461 0,0.043 -0.0371,0 0,5.4023 2,0 0,-4.5762 4.22852,-4.2011 2.77148,2.7773 0,-7 -7,-0.012 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 365.18556,1039.1708 4.77734,4.7461 0,0.043 0.0371,0 0,5.4023 -2,0 0,-4.5762 -4.22852,-4.2011 z"
+ id="path4392"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+ <g
+ id="g4438">
+ <path
+ id="path4421"
+ transform="translate(0,1032.3622)"
+ d="m 407.0293,3.9882812 0,5.4023438 0.0371,0 0,0.042969 1.95117,1.9375 0,5.638672 2.8164,-2.820313 2.72657,2.796875 1.44531,-1.382812 -2.76758,-2.837891 0.0195,-0.02148 2.75977,-2.7460939 -5.5293,0.00977 -1.45898,-1.4433584 0,-4.5761719 -2,0 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ inkscape:connector-curvature="0"
+ id="path4423"
+ d="m 404.21408,1046.5416 4.77734,-4.7461 0,-0.043 0.0371,0 0,-5.4023 -2,0 0,4.5762 -4.22852,4.2011 z"
+ style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <g
+ id="g4442"
+ transform="matrix(-1,0,0,1,840.01754,0)">
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 407.0293,3.9882812 0,5.4023438 0.0371,0 0,0.042969 1.95117,1.9375 0,5.638672 2.8164,-2.820313 2.72657,2.796875 1.44531,-1.382812 -2.76758,-2.837891 0.0195,-0.02148 2.75977,-2.7460939 -5.5293,0.00977 -1.45898,-1.4433557 0,-4.5761719 -2,0 z"
+ transform="translate(0,1032.3622)"
+ id="path4444"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 404.21408,1046.5416 4.77734,-4.7461 0,-0.043 0.0371,0 0,-5.4023 -2,0 0,4.5762 -4.22852,4.2011 z"
+ id="path4447"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+ <g
+ id="g4465"
+ transform="translate(-0.99975,0)">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4455"
+ d="m 449,1041.3622 4e-5,8 1.99996,0 -3e-5,-8 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 454.0156,1045.3622 4.9844,-5 -5,-5 z"
+ id="path4457"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 455,1039.3466 -6,0 0,2 6,-10e-5 z"
+ id="path4461"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4463"
+ d="m 451.01565,1039.3466 -7.9629,0 0,2 7.9629,-10e-5 z"
+ style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4473"
+ d="m 472.053,1041.3622 -4e-5,8 -1.99996,0 3e-5,-8 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 467.0374,1045.3622 -4.9844,-5 5,-5 z"
+ id="path4475"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 466.053,1039.3466 6,0 0,2 -6,-10e-5 z"
+ id="path4477"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4479"
+ d="m 470.03735,1039.3466 7.9629,0 0,2 -7.9629,-10e-5 z"
+ style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 490,1036.3505 2.81445,2.8203 -4.77734,4.7461 0,0.043 -0.0371,0 0,5.4023 2,0 0,-4.5762 4.22852,-4.2011 2.77148,2.7773 0,-7 -7,-0.012 z"
+ id="path4491"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;fill-opacity:0.50980392;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 490,1038.3622 -4e-5,11 -1.99996,0 3e-5,-11 z"
+ id="path4505"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4510"
+ d="m 490,1036.3505 2.81445,2.8203 -4.77734,4.7461 0,0.043 -0.0371,0 0,5.4023 2,0 0,-4.5762 4.22852,-4.2011 2.77148,2.7773 0,-7 -7,-0.012 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4514"
+ d="m 510.00001,1036.3505 -2.81445,2.8203 4.77734,4.7461 0,0.043 0.0371,0 0,5.4023 -2,0 0,-4.5762 -4.22852,-4.2011 -2.77148,2.7773 0,-7 7,-0.012 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4516"
+ d="m 510.00001,1038.3622 4e-5,11 1.99996,0 -3e-5,-11 z"
+ style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 510.00001,1036.3505 -2.81445,2.8203 4.77734,4.7461 0,0.043 0.0371,0 0,5.4023 -2,0 0,-4.5762 -4.22852,-4.2011 -2.77148,2.7773 0,-7 7,-0.012 z"
+ id="path4518"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="7.5"
+ y="1065.3622"
+ id="text4238"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4240"
+ x="7.5"
+ y="1065.3622">0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 170,1045.3622 c -1.10457,0 -2,0.8954 -2,2 0,1.1046 0.89543,2 2,2 1.10457,0 2,-0.8954 2,-2 0,-1.1046 -0.89543,-2 -2,-2 z"
+ id="path3440"
+ sodipodi:nodetypes="sssss" />
+ </g>
+</svg>
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmln